[ Perl ]
DiKicker の二次データの保存先を何にしようか思案中。 MLDBM::Sync が候補なのだが、MLDBM::Sync::SDBM_Fileだとデータが大きくなった時に速度が出ないようだ。
このサーバ(FreeBSD)のPerl(5.005_03)は、DB_File も GDBM_Fileも有効になかったので今までDBMパッケージの使用は避けてきたのだが、さすがに今回は使えないと辛いかも。
ということで Berkeley DB も含めて DB_File をホームにインストール。
tar zxvf db-4.2.52.tar.gz cd db-4.2.52/build_unix ../dist/configure --prefix=$HOME/local/db-4.2.52 make make install rm -rf $HOME/local/db-4.2.52/docs
インストール自体は特に依存するものも無く簡単。 ただし、このサーバでは丁度 busy だった事もあってビルドに2時間!もかかってしまった。 本来は暇そうな時にやるべきなのだろうけど、今日中にうまくいくか検証しておきたかったので、待った。
tar zxvf DB_File-1.808.tar.gz cd DB_File-1.808 export DB_FILE_LIB=$HOME/local/db-4.2.52/lib export DB_FILE_INCLUDE=$HOME/local/db-4.2.52/include perl Makefile.PL INSTALLDIRS=site \ LIB=$HOME/local/lib/perl \ INSTALLMAN1DIR=/tmp/man/man1 \ INSTALLMAN3DIR=/tmp/man/man3 make OTHERLDFLAGS="-Wl,-rpath -Wl,$HOME/local/db-4.2.52/lib" make test make install
libdb を実行時に検索させるのに LD_LIBRARY_PATH環境変数とか指定したくなかったので、-rpath を指定してしまった。 Makefile中の OTHERLDFLAGS 変数がリンク時に空だったので、ここで設定。
しかし libdb-4.2 でかいな。 Perl からの呼び出し一発目は結構時間がかかる。
インストール方法は「Instant Client10g」を参考にした。
Oracle Technology Network License のもとで配布されている、Oracle Database 10g の instant client を利用する。 30日間試用可能。
をダウンロード。
/usr/local/oracle の下に展開。シンボリックリンクをいくつか設定する。
mkdir /usr/local/oracle cd /usr/local/oracle unzip /tmp/instantclient-basic-linux32-10.1.0.3.zip unzip /tmp/instantclient-sdk-linux32-10.1.0.3.zip unzip /tmp/instantclient-sqlplus-linux32-10.1.0.3.zip cd instantclient10_1 ln -s . lib ln -s libclntsh.so.10.1 libclntsh.so ln -s libocci.so.10.1 libocci.so
環境変数を設定する
export ORACLE_HOME=/usr/local/oracle/instantclient10_1 export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
まずはソースアーカイブを展開。
tar ztvf DBD-Oracle-1.16.tar.gz cd DBD-Oracle-1.16
次に Makefile.PL を編集
5a6,7 > push(@ARGV, '-l'); > 279c281 < my @h_dirs = find_headers(); --- > #my @h_dirs = find_headers(); 283c285 < push @h_dirs, 'network/public'; --- > #push @h_dirs, 'network/public'; 289c291,292 < my $inc = join " ", map { "-I$OH/$_" } @h_dirs; --- > #my $inc = join " ", map { "-I$OH/$_" } @h_dirs; > my $inc ="-I/usr/local/oracle/instantclient10_1/sdk/include"; 725c728 < exit 0; --- > #exit 0; 1606a1610 > 1;
ヘッダファイルディレクトリ自動取得を止めて決め打ちにし、また Makefile.PL 実行時に -l を指定するようにする。 それから dh-make-perl がモジュール依存関係取得するため Makefile.PL を require した際に真を返さないでエラーになってしまうようなので、これも修正。
でパッケージ化。
rm META.yml # あると dh-make-perl が deb パッケージ名をつけ間違える? dh-make-perl --build --notest
deb パッケージ
libdbd-oracle-perl_1.16-1_i386.deb
ができあがるので、これを dpkg でインストール。
とりあえず、手近のサーバに接続して、簡単な select が動くことを確認。
いまのところ DBD::Oracle を使用するPerlプログラム実行時にも LD_LIBRARY_PATH を同様に設定しておく必要あり。
Makefile.PL 書き換え時に、
$opts{dynamic_lib}->{OTHERLDFLAGS} .= '-Wl,-rpath -Wl,/usr/local/oracle/instantclient10_1';
と -rpath を指定してみたが、
DBI connect('host=192.168.x.x;sid=dbsid','usr',...) failed: ERROR OCIEnvNlsCreate (check ORACLE_HOME and NLS settings etc.) at test.pl line 3 ERROR OCIEnvNlsCreate (check ORACLE_HOME and NLS settings etc.) at test.pl line 5.
というエラーが出て駄目。
普段 Migemo 使っているので、それの入っていない開発環境だとちょっと不便だなということで、ソースから入れる。
Migemo だと Ruby のパッケージも入れる必要があるので、ここは C/Migemo で。
git clone https://github.com/koron/cmigemo.git cd cmigemo ./configure --prefix=$HOME/local/cmigemo make gcc mak gcc-dict make gcc-install
LD_LIBRARY_PATH=/home/naney/local/lib にしているので C/Migemo のライブラリへのシンボリックリンクをそこに作る。
cd ~/local/lib ln -s $HOME/local/cmigemo/lib/libmigemo.so* .
migemo.el だけ Migemo の tarball からもらう。Ruby のライブラリ入れてないため configure が通らないので、手で migemo.el.in から migemo.el に変換する(@pkgdatadir@ を置換)。
wget http://0xcc.net/migemo/migemo-0.40.tar.gz tar zxvf migemo-0.40.tar.gz cd migemo-0.40 sed -e 's!@pkgdatadir@!/home/naney/local/migemo/share/migemo!g' migemo.el.in > migemo.el cp -a migemo.el <自分の site-lisp なディレクトリ>
設定ファイル (~/.emacs.d/init.el とか)に設定を追加。
(when (load "migemo" t) (setq migemo-use-pattern-alist t) (setq migemo-use-frequent-pattern-alist t) (setq migemo-command "/home/naney/local/cmigemo/bin/cmigemo") (setq migemo-options '("-q" "--emacs" "-i" "\a")) (setq migemo-dictionary "/home/naney/local/cmigemo/share/migemo/euc-jp/migemo-dict") (setq migemo-user-dictionary nil) (setq migemo-regex-dictionary nil))
Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。