< 小さいアイコンのサイズ | CGI::Sessionの、期限切れのセッションをお掃除する >

January 8, 2004

Digest::MD5 のインストールできない状況でのこと

CGI::Sessionを使おうとすると、Digest::MD5を使うことになる。もちろん、セッションIDの生成にMD5を指定した(またはデフォルトの)場合だけど。

しかしDigest::MD5はPerl 5.8.0以降なら標準モジュールだけど、プロバイダのサーバがPerl 5.6.1ですぅ、XSモジュールなんてインストールできませーん、てなことも。

よくできたことに、Digest::MD5はXSがロードできなければ、Digest::Perl::MD5を継承してくれる。私は最初知らなくって、CGI::Session::ID::MD5の中身をわざわざDigest::Perl::MD5を使うように修正していた 笑。でも、テストの通ってるCPANモジュールをわざわざ修正なんてしたくないわけで。オリジナルのCGI::Sessionの戻して、Digest::MD5経由でDigest::Perl::MD5を使う方法に変更することに。

で、Digest::MD5をWindows上でINSTALLSITELIB=サーバアップ用の作業ディレクトリとかして、一応Makeの手順を踏んで、バイナリを削除してプロバイダのサーバにアップしようとしたのだけど、Digest::MD5をPerl Makefile.PLすると、Warningが出た。

F:\>Perl Makefile.PL INSTALLSITELIB=c:/workingdir/site/lib
Assumes that MSWin32 implies free alignment for U32 access.
Warning: prerequisite Digest::base failed to load: Can't locate Digest/base.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .) at (eval 4) line 3.
Writing Makefile for Digest::MD5

ふぅーん、Digest::baseがいるんだ、と思い、Digestも入れることにした。いざ、サーバ上のソースを置き換えると、私のDigest::Perl::MD5置換版のCGI::Sessionでは動作していたソースが、こんな出力。

Undefined subroutine &Digest::base::new called at /foo/bar/site/lib/CGI/Session/ID/MD5.pm line 14.

要するにDigest::MD5->newはXSにしか定義がないので、継承元のDigest::base->newを呼ぼうとして失敗するらしい。Digest::MD5のソースを見たが、Digest::Perl::MD5をロードする場合は、Digest::baseを継承しなくっても特に問題はなさそう。ということで、Digest::baseは削除。一件落着。無事動作した。

ところで、Digestに関して、ベンチマーク古っ[rt.cpan.org]という情報がある。

For example, Digest::Perl::MD5 is far better than Digest::MD5 when you need to
compute message digests and don't have a C compiler :)
たとえば、君がCコンパイラを持ってなくってメッセージダイジェストを計算しなきゃいけないなら、Digest::Perl::MD5の方がDigest::MD5よりはるかにいいよ :)(適当訳)

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/155

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?