nDiki : SDBM_File
Related term
2003年11月30日 (日)
■ タイトル取得ロボットを www.naney.org へ

2個所問題。
@ Tie::Array::Sorted
Perl v5.6 以上用だった。www.naney.org は Perl 5.005_03。 しょうがないので、同等のコードを書いて Tie::Array::Sorted を使わないように修正。
@ SDBM_File の EXISTS
SDBM_File で EXISTS が使えるようになったのは実は Perl v5.6 から。 しょうがないので代わりに defined でキーの存在チェックをするように修正(幸い undef を値に持つ事はない hash なので)。
- Perl の constant プラグマで1度に複数の定数を定義できるのは... (2007-03-08)
- [ WiKicker ] WiKicker 0.20 で文字化け (2004-02-03)
- Perl 5.005_03 + Template Toolkit 2.14 (2004-11-10)
- 専用サーバに移りたい (2005-11-13)
- 最新の Module::Install は Perl 5.005_03 ステ? (2006-04-29)
2004年2月19日 (木)
■ [ Perl ] PDL::PP で C extension を書く

PDLを使ったPerl数値処理プログラムによりインタラクティブ性が求められるようになってきたので、一部をCで書いて高速化する事を検討。 問題は Linux でも Windows + ActivePerl でもすんなり動くかどうか。
@ .pd ファイルを書く
とりあず PDL::PP のサンプルから sumit 関数あたりを MathEx.pd に書いておく。
@ Makefile.PLを修正する
Foo::Bar パッケージの中の Foo::Bar::Math の一部を Foo::Bar::MathEx に移して、C extension 化したい。 ということで lib/Foo/Bar/MathEx.pd として、Makefile.PL の各種設定をしてみる。
がどうもうまくいかない。 PDL::PP の Makefile.PLサポートは、Makefile.PL と同じ位置に .pd がある事を想定しているようなので、いろいろと小細工をしなければならない。 一方 Perl の XS は Foo::Bar のベース名から Bar.so を作る前提になっているようで、これまたパッケージの中の一部のモジュールをどうもXS化しにくい。
@ 子Makefile.PLを作る
Perl の ext/SDBM_File を真似て、子 Makefile.PL を使ってみることにした。
Foo-Bar-x.xx | +- Makefile.PL | +- lib | | | +- Foo | | | +- Bar.pm | | | +- Bar | | | +- Math.pm | | | +- MathNoEx.pm | | | ... | | +- blib/... | +- MathEx | | | +- Makefile.PL | | | +- MathEx.pd ...
パッケージディレクトリの下に MathEx ディレクトリを作り、そこに Makefile.PL と MathEx.pd を置く。 Makefile.PL は MathEx.pd 専用になるので、PDL::PP の標準的なものでOKになる。
全体のパッケージング・PPM化・インストール等が面倒にならないかと心配したが、Foo-Bar パッケージ化で perl Makefile.PL、make xxx を実行すれば子Makefile.PLまできちんと面倒をみてくれる。 MathEx 以下でビルドしたものもパッケージの blib に一緒に入れてくれるし(=一緒にインストールできる・PPM化できる)。 逆に make dist の際には子Makefileの方は余計なとりまとめはしないで、親Makefileが一括して tar.gz に入れてくれる。 これはよい。 MathEx.pd もきちんと Foo/Bar/MathEx.so になった。
@ XSが使えない環境との両対応
XSが使えない環境のために、PerlとPPの両方で関数を書いておく。 XSが使えれば MathEx を、使えなければ MathNoEx.pm を使うように。 表向きのAPIは Foo::Bar::Math とし、ここで AUTOLOAD を使ってどちらか一方を呼び出すようにする。 間接呼び出しにして遅くなるのはいやなので、シンボルテーブルを直接設定する。
use vars qw($IMPLEMENT_CLASS $AUTOLOAD);
BEGIN {
$IMPLEMENT_CLASS = 'Foo::Bar::MathEx';
eval "use $IMPLEMENT_CLASS";
if ($@) {
warn "Can't load $IMPLEMENT_CLASS: $@";
$IMPLEMENT_CLASS = 'Foo::Bar::MathNoEx';
eval "use $IMPLEMENT_CLASS";
die $@ if $@;
}
}
sub AUTOLOAD {
my $name = $AUTOLOAD;
$name =~ s/.*://;
my $implement = $IMPLEMENT_CLASS . '::' .$name;
no strict "refs";
*{$name} = \&{$implement}; # ここでシンボルテーブル設定
return &{$implement}(@_);
}
最初は、AUTOLOAD の最後の行で die したら、trap してエラーメッセージ中のパッケージ名(Foo::Bar::MathEx や Foo::Bar::MathNoEx)を呼び出された Foo::Bar::Math に置換して die し直すようにしようかと思ったが面倒なのでやめ。
@ ActivePerl 5.6 + Visual C++ 6
使っているWindows BOX には Visual C++ 6 が入っているので、XSも問題なくビルドでき PDL extension もうまく動いた。
PPM化までここで済ませば、他のPCにも持っていけるはず。
@ さて
これでバシバシPPで書けるわけだが、PPがこれまた難解で最初は苦労しそう。
- PAR::Repository でビルド済み Perl モジュールをネット... (2006-12-12)
- ActivePerl で Ming (2005-02-23)
- nmake で毎回 pl2bat されるのを何とかしたい (2004-11-25)
- PAR を ActivePerl 5.6.1 build 638 に (2004-07-20)
- 自前 PPM リポジトリの管理 (2006-07-03)
■よく検索されるキーワード
提案書(75) torrent(69) perl(61) 書き方(45) 充電式カイロ(43) windows(38) x31(36) 使い方(32) linux(32) cvs(25) アジェンダとは(25) usb(25) thinkpad(23) 静電気(21) サンプル(20) 口コミ(20) ヨドバシ(20) アジェンダ(20) 画像(19) debian(19) ubuntu(19) mp980(18) f-01a(18) 手帳(17) tc-1(17) 秋葉原(16) ssh(16) subversion(16) グッズ(16) a6(15) 壁紙(15) ほぼ日手帳(15) c#(14) ダイソー(14) svn(14) 交換(14) インストール(13) 加湿器(13) firefox(12) ノート(12) 無印(12) 日本語(12) wiki(12) ganttproject(12) デロンギ(11) 方眼(11) ヨドバシカメラ(11) デザイン(11) nikkor(11) 設定(11) 作り方(11) dropbox(11) af(10) terastation(10) memcached(10) レビュー(10) カバー(10) カイロ(10) 2009(10) 除去(10) nikon(10) tortoisesvn(10) クラリチン(9) ガントチャート(9) 動画(9) ポメラ(9) ご査収(9) rcs(9) モジュール(9) n-01a(9) フィルム(9) 写真(9) システム手帳(9) edition(9) porter(9) xp(8) imap(8) 4c(8) docomo(8) ミニ6穴(8)■注目キーワード
購入 買った 発売日 フリー 無料 価格 値段 作り方 選び方 使い方 方法 設定 サンプル ダウンロード 限定 在庫 予約 穴場 比較 検証 レビュー 感想 評価 評判 使用感 使ってみた 口コミ 噂 最新 MP3 動画 意味 お薦め お勧め おすすめ 便利 Blog ブログ mixi 修理 デザインProcess Time: 15.20859s / load averages: 0.16, 0.24, 0.32
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)



スポンサード リンク