OracleXE + oci8拡張メモ

無料,商用利用でまで無料な OracleXE を使って,PHPのoci8拡張を構築するメモ。
PHP-5.3.5(source), oracle-xe-client-10.2.0.1-1.0, CentOS-5.5。


OracleXEは,RPMパッケージとDEBパッケージが用意されているので,
インストールにXも必要なく簡単に導入できる。


ダウンロードはここから。ユーザ登録が必要。
http://www.oracle.com/technetwork/database/express-edition/downloads/index.html


さっくりRPMインストール。

$ sudo rpm -ivh oracle-xe-client-10.2.0.1-1.0.i386.rpm
# PHPのソースツリーに移動して
$ cd /usr/local/src/php-5.3.5/ext/oci8
# phpize
$ /usr/local/php-5.3.5/bin/phpize

$ ./configure \
--with-php-config=/usr/local/php-5.3.5/bin/php-config \
--with-oci8=/usr/lib/oracle/xe/app/oracle/product/10.2.0/client

$ make

$ sudo make install


現時点では64bit OSに対応していないのが残念。

commons-digesterメモ

Javaはコードは読めるけどあまり使う機会がないので、
ポピュラーなライブラリであっても使うのに四苦八苦!


今回はcommons-digesterにハマったのでメモしておく。


一口でいうと、XML⇒Object変換ツール。
DOMとかでゴリゴリやるのに比べて比較的簡単に変換することができる。
Struts発祥なんだとか。


で、こんなXMLから部分をUserオブジェクトに、かつはMapで保持、とかするには

<root>
  <id>1</id>
  <user>
    <firstName>アラレ</firstName>
    <lastName>則巻</lastName>
    <options>
      <option name="gender">female</option>
      <option name="hoge">fuga</option>
    </options>
  </user>
</root>

こんな感じみたい

Digester d = new Digester();

// root/user見つけたらUserインスタンス作って
d.addObjectCreate("root/user", User.class);
// root/user/firstName見つけたらfirstNameを設定・lastNameも同様
d.addBeanPropertySetter("root/user/firstName");
d.addBeanPropertySetter("root/user/lastName");
// optionsが現れたらHashMap作成
d.addObjectCreate("root/user/options", HashMap.class);
// optionが現れたら、put()メソッド呼ぶ。引数は2個。
d.addCallMethod("root/user/options/option", "put", 2);
// name属性と
d.addCallParam("root/user/options/option", 0, "name");
// 値部分
d.addCallParam("root/user/options/option", 1);
// ひとつ上のstackのsetOptions() でMapを登録
d.addSetNext("root/user/options", "setOptions");

URL xmlFile = DigesterSimpleListSample.class.getResource("in_test.xml");
User user = (User) d.parse(xmlFile);

System.out.println(ToStringBuilder.reflectionToString(user));

パース部分はXMLの設定ファイルで書くこともできて、
そうするとソースに手を加えずに…ということができるみたい。

でもこれをXMLで表現することは私には難しかった。

symfony-1.4でSmartyを使う

最近下火になっているような気がするSmarty
私自身はあまりアプリを開発しないため,実際の所どうなのかがわからないのだけど,
PHPの場合そのままテンプレートとして使える言語だし,
フレームワークのヘルパと相性が良くないこともあって下火なのではないかと思う。


それでも,過去の資産を流用してSmartyを使いたいというニーズはあるようで
sfViewの勉強も兼ねてプラグインを作ってみることにした。
そもそもテンプレートエンジンの切り替えを実現できるようレイヤ分けがされている模様。


とりあえず動作しそうな状態にはなったものの,
Smartyのことを詳しく知らないので実用に耐えられるものなのかどうか。
symfony-1.4.4 + Smarty-2.6.26 で確認。
http://devel.studiopopy.com/psfSmartyPlugin-0.0.1.zip


使い方
1. Smartyを lib/vendor/smarty に用意する
2. アーカイブを plugins に展開
3. pluginを有効にするためにconfig/ProjectConfiguration.class.php のsetup()内に下記を追記

$this->enablePlugins('psfSmartyPlugin');

4. ビューにsmartyを使うよう, apps/*/config/module.yml を編集

all:
  view_class: psfSmarty

5. テンプレートを作る*.tpl
6. Smarty版のレイアウトを作る (apps/*/templates/layout.tpl)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    {{php}} include_http_metas() {{/php}}
    {{php}} include_metas() {{/php}}
    {{php}} include_title() {{/php}}
    <link rel="shortcut icon" href="/favicon.ico" />
    {{php}} include_stylesheets() {{/php}}
    {{php}} include_javascripts() {{/php}}
  </head>
  <body>
    {{$sf_content}}
  </body>
</html>

7. アクセス


デフォルトでは以下の設定でSmartyインスタンスを作成する。

・template_dir: apps/*/modules/*/templates
・compile_dir: cache/${appname}/${env}/templates_c
・plugins_dir: plugins, apps/*/modules/*/lib/smarty, apps/*/lib/smarty, lib/smarty
・left_delimiter: {{
・right_delimiter: }}

Smartyにはあまり詳しくないのだけど,継承して独自の設定を行ったり,
独自のメソッドを追加したりして使う風習があるみたい。

各種パスやデリミタはymlで設定できるようにしようか迷ったけども,
Smartyファクトリの差し替えができるようにしてみた。


過去の資産の流用という面を考えると,
独自に継承したSmartyインスタンスが使えた方がいいと思って。
詳細は同梱のREADMEを参照。


Smarty-3.0が出るそうだし,
試しながらもう少し作りこんでいこうかな。どうしようかな。


個人的にはPHPテンプレートが好みだったりして。

Thriftインストールメモ

CentOS-5.5(5.4でも同じだった)にThriftを入れるメモ。

事前に必要なパッケージがあるので予め入れておく。

http://wiki.apache.org/thrift/GettingCentOS5Packages

$ sudo yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel

Thriftのダウンロードと解凍

$ wget http://ftp.riken.jp/net/apache/incubator/thrift/0.2.0-incubating/thrift-0.2.0-incubating.tar.gz

$ tar -zxvf thrift-0.2.0-incubating.tar.gz
$ cd thrift-0.2.0

インストールはこれを参考に…してはいけない

http://wiki.apache.org/thrift/ThriftInstallation

これを読むとまず最初に bootstrap.sh を実行するように書いてあるのだけど,
これを実行すると具合の悪いことになるる。
以下のようにマクロが見つからないなどと言われてしまう。

configure.ac:50: error: possibly undefined macro: AC_PROG_MKDIR_P
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
configure.ac:147: error: possibly undefined macro: AC_TYPE_INT16_T
configure.ac:148: error: possibly undefined macro: AC_TYPE_INT32_T

そして,cleanup.sh を実行するとconfigureも消えてしまいハマります。
一応このマクロが見つからないエラーはautoconfのバージョンを上げると出なくなったのだけど(2.61以降?),
そもそも bootstrap.sh をスルーすればより平和にビルドができる。
(CentOSの場合。Ubuntuだとwikiの手順どおりでビルドできた。)

$ ./configure
$ make
$ make install

$ thrift -version
Thrift version 0.2.0-exported

最後に,インストールされるファイルのリスト。(107個)

/usr/lib/perl5/5.8.8/i386-linux-thread-multi/perllocal.pod
/usr/lib/perl5/site_perl/5.8.8/Thrift.pm
/usr/lib/perl5/site_perl/5.8.8/Thrift/BinaryProtocol.pm
/usr/lib/perl5/site_perl/5.8.8/Thrift/BufferedTransport.pm
/usr/lib/perl5/site_perl/5.8.8/Thrift/FramedTransport.pm
/usr/lib/perl5/site_perl/5.8.8/Thrift/HttpClient.pm
/usr/lib/perl5/site_perl/5.8.8/Thrift/MemoryBuffer.pm
/usr/lib/perl5/site_perl/5.8.8/Thrift/Protocol.pm
/usr/lib/perl5/site_perl/5.8.8/Thrift/Server.pm
/usr/lib/perl5/site_perl/5.8.8/Thrift/Socket.pm
/usr/lib/perl5/site_perl/5.8.8/Thrift/Transport.pm
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/Thrift/.packlist
/usr/lib/python2.4/site-packages/thrift/TSCons.py
/usr/lib/python2.4/site-packages/thrift/TSCons.pyc
/usr/lib/python2.4/site-packages/thrift/Thrift.py
/usr/lib/python2.4/site-packages/thrift/Thrift.pyc
/usr/lib/python2.4/site-packages/thrift/__init__.py
/usr/lib/python2.4/site-packages/thrift/__init__.pyc
/usr/lib/python2.4/site-packages/thrift/protocol/TBinaryProtocol.py
/usr/lib/python2.4/site-packages/thrift/protocol/TBinaryProtocol.pyc
/usr/lib/python2.4/site-packages/thrift/protocol/TProtocol.py
/usr/lib/python2.4/site-packages/thrift/protocol/TProtocol.pyc
/usr/lib/python2.4/site-packages/thrift/protocol/__init__.py
/usr/lib/python2.4/site-packages/thrift/protocol/__init__.pyc
/usr/lib/python2.4/site-packages/thrift/protocol/fastbinary.so
/usr/lib/python2.4/site-packages/thrift/server/THttpServer.py
/usr/lib/python2.4/site-packages/thrift/server/THttpServer.pyc
/usr/lib/python2.4/site-packages/thrift/server/TNonblockingServer.py
/usr/lib/python2.4/site-packages/thrift/server/TNonblockingServer.pyc
/usr/lib/python2.4/site-packages/thrift/server/TServer.py
/usr/lib/python2.4/site-packages/thrift/server/TServer.pyc
/usr/lib/python2.4/site-packages/thrift/server/__init__.py
/usr/lib/python2.4/site-packages/thrift/server/__init__.pyc
/usr/lib/python2.4/site-packages/thrift/transport/THttpClient.py
/usr/lib/python2.4/site-packages/thrift/transport/THttpClient.pyc
/usr/lib/python2.4/site-packages/thrift/transport/TSocket.py
/usr/lib/python2.4/site-packages/thrift/transport/TSocket.pyc
/usr/lib/python2.4/site-packages/thrift/transport/TTransport.py
/usr/lib/python2.4/site-packages/thrift/transport/TTransport.pyc
/usr/lib/python2.4/site-packages/thrift/transport/TTwisted.py
/usr/lib/python2.4/site-packages/thrift/transport/TTwisted.pyc
/usr/lib/python2.4/site-packages/thrift/transport/__init__.py
/usr/lib/python2.4/site-packages/thrift/transport/__init__.pyc
/usr/local/bin/thrift
/usr/local/include/thrift/TLogging.h
/usr/local/include/thrift/TProcessor.h
/usr/local/include/thrift/TReflectionLocal.h
/usr/local/include/thrift/Thrift.h
/usr/local/include/thrift/concurrency/Exception.h
/usr/local/include/thrift/concurrency/FunctionRunner.h
/usr/local/include/thrift/concurrency/Monitor.h
/usr/local/include/thrift/concurrency/Mutex.h
/usr/local/include/thrift/concurrency/PosixThreadFactory.h
/usr/local/include/thrift/concurrency/Thread.h
/usr/local/include/thrift/concurrency/ThreadManager.h
/usr/local/include/thrift/concurrency/TimerManager.h
/usr/local/include/thrift/concurrency/Util.h
/usr/local/include/thrift/config.h
/usr/local/include/thrift/processor/PeekProcessor.h
/usr/local/include/thrift/processor/StatsProcessor.h
/usr/local/include/thrift/protocol/TBase64Utils.h
/usr/local/include/thrift/protocol/TBinaryProtocol.h
/usr/local/include/thrift/protocol/TCompactProtocol.h
/usr/local/include/thrift/protocol/TDebugProtocol.h
/usr/local/include/thrift/protocol/TDenseProtocol.h
/usr/local/include/thrift/protocol/TJSONProtocol.h
/usr/local/include/thrift/protocol/TOneWayProtocol.h
/usr/local/include/thrift/protocol/TProtocol.h
/usr/local/include/thrift/protocol/TProtocolException.h
/usr/local/include/thrift/protocol/TProtocolTap.h
/usr/local/include/thrift/server/TNonblockingServer.h
/usr/local/include/thrift/server/TServer.h
/usr/local/include/thrift/server/TSimpleServer.h
/usr/local/include/thrift/server/TThreadPoolServer.h
/usr/local/include/thrift/server/TThreadedServer.h
/usr/local/include/thrift/transport/TBufferTransports.h
/usr/local/include/thrift/transport/TFDTransport.h
/usr/local/include/thrift/transport/TFileTransport.h
/usr/local/include/thrift/transport/THttpClient.h
/usr/local/include/thrift/transport/TServerSocket.h
/usr/local/include/thrift/transport/TServerTransport.h
/usr/local/include/thrift/transport/TShortReadTransport.h
/usr/local/include/thrift/transport/TSimpleFileTransport.h
/usr/local/include/thrift/transport/TSocket.h
/usr/local/include/thrift/transport/TSocketPool.h
/usr/local/include/thrift/transport/TTransport.h
/usr/local/include/thrift/transport/TTransportException.h
/usr/local/include/thrift/transport/TTransportUtils.h
/usr/local/include/thrift/transport/TZlibTransport.h
/usr/local/lib/libthrift.a
/usr/local/lib/libthrift.la
/usr/local/lib/libthrift.so
/usr/local/lib/libthrift.so.0
/usr/local/lib/libthrift.so.0.0.0
/usr/local/lib/libthriftnb.a
/usr/local/lib/libthriftnb.la
/usr/local/lib/libthriftnb.so
/usr/local/lib/libthriftnb.so.0
/usr/local/lib/libthriftnb.so.0.0.0
/usr/local/lib/libthriftz.a
/usr/local/lib/libthriftz.la
/usr/local/lib/libthriftz.so
/usr/local/lib/libthriftz.so.0
/usr/local/lib/libthriftz.so.0.0.0
/usr/local/lib/pkgconfig/thrift-nb.pc
/usr/local/lib/pkgconfig/thrift-z.pc
/usr/local/lib/pkgconfig/thrift.pc

symfonyのセッション管理

symfonyのセッション管理は,sfUserとsfStorageというオブジェクトを使って行う。


sfUserはセッションデータに触れるためのインタフェイス。
key=valueという最もシンプルなアクセサのほか,
ログイン状態や権限(sfSecurityUser)へのアクセサ,
独自に利用頻度の高いデータに関するアクセサを特別に用意したりしてもいいのだろう。


sfStorageは,実際の外部ストレージとやりとりをするもの。
アプリ側から直接触ることはない。
インタフェイス的にはread(key), remove(key), refenerate() など。


インスタンスの作られるフローは以下のようになる。
実際にデータが保存されるタイミングはsfStorageの終了処理であることがみそ。
1. sfStorage初期化
2. 外部ストレージから読み込み
3. sfUser初期化
4. アクション層(ユーザがデータを読んだり書いたり)
5. sfUser終了処理
6. sfStorage終了処理
7. 外部ストレージに書き込み


ちょっとソースを読んだので図を描いてみた。
覚え書き覚え書き。

sfUserのクラス図

sfStorageのクラス図

シーケンス図