Home > Perl > いつでもどこでも、すぐに DateTime モジュールを使いたい

いつでもどこでも、すぐに DateTime モジュールを使いたい

  • 2006-06-04 (日)
  • Perl
  • このエントリーを含むはてなブックマーク

前回のエントリ 「Perlで日付・時間操作 - DateTime モジュールの使い方」で書いたとおり、とっても便利なDateTimeモジュールですが、強いて難点をあげるとすれば、必要な依存モジュールが多いこと = インストールが面倒くさい事かと個人的には思います。shell と make コマンドが使える環境ならば、"$ perl -MCPAN -e 'install DateTime' " で自動インストールしちゃえるのですが、これができない状況:

  • telnet 禁止の環境で cgi 作りたい場合 (無料ホームページサービス等)(顧客のサーバ環境での開発で、クライアントに信用されていない状況とか)
  • サーバの保守・セキュリティ体制がうんちゃらで make コマンドの利用が規制されている場合 (出くわした経験あり)

こんな状況下だと、とたんにDateTimeモジュールを利用する事は難しくなってしまいます。使いたいけど使えない。そんな状況でお悩みのあなたに・・・

Pure Perl な DateTime モジュール + 依存モジュールをまとめてみました

どんな環境でも (多分) 動作する、 Pure Perl 版の DateTime モジュール&すべての依存モジュールを含んだ状態の lib ディレクトリを zip アーカイブにしてみました。

上記 Download ボタンからアーカイブを入手した後、任意の環境下で解凍することで DateTimePack ディレクトリが作成されます。この中の lib ディレクトリを perl 側で use lib してあげることで、いつでもどこでも、すぐに DateTime モジュールのすべての機能を使い始めることができます。使い方については前回のエントリをご一読ください。

use lib 'DateTimePack/lib';
use DateTime;
my $dt = DateTime->now(time_zone=>'local');

アーカイブの中身についての詳細説明は下記「配布アーカイブについて」を参照してください。

※こうやってCPANモジュールを再配布してよいものかどうか、ちょっとドキドキしてます。MovableTypeの中にも同じように DateTime モジュール一式入ってたし、まあ大丈夫かな?と。一応 Dave Rolsky氏本人には確認中。

 

以下、その他うんちくです

Pure Perl な DateTime って?

XSを利用しているのは DateTime モジュールと Params::Validate モジュールなんですが、これら共にきちんと Pure Perl 環境での動作を考慮して作られていました。まあ素敵。双方とも configure の際に

$ perl ./Makefile.PL --pm

のようなパラメータを渡すことで、コンパイル不要の .pm ファイルのみが生成されます。

ついでですが、いったんXS版としてインストールした後でも、以下の環境変数を設定してあげることで Pure Perl 版として動作するようです:

BEGIN {
$ENV{PERL_DATETIME_PP} = 1; # for DateTime
$ENV{PV_TEST_PERL} = 1; # for Params::Validate
}

こうすることでPure Perl版のモジュールの DateTimePP.pmParams/ValidatePP.pm が代わりにロードされます。なので、いまXSなのかPurePerlなのかはこんなコードで判別可能かと:

if($::INC{'DateTimePP.pm'} &&
$::INC{'Params/ValidatePP.pm'} ){
print "Pure Perl\n";
}else{
print "XS\n";
}

▲RETURN TO TOP

Pure Perl だと、どれくらい遅くなる?

もともとは XS 実装が想定されているモジュールだけに、Pure Perl で動かそうとするとそれなりの速度ペナルティがあるはず。そこで、XS版とPurePerl版でベンチマーク比較してみました。 ごくごく普通の利用ケースを考えた、こんな感じの簡単なコードを用意して計測してみた結果は以下のとおり。※ tested on panasonic CF-R4 + colinux(debian)

# n=4000回
XS - 21 wallclock secs (20.86 usr +  0.17 sys = 21.03 CPU)
PurePerl - 36 wallclock secs (35.63 usr +  0.19 sys = 35.82 CPU)

4000回まわした場合だと、180%増しな感じです。まあ、10倍遅い!致命的!って所まではいかないので、まぁ、よしかなぁ。

▲RETURN TO TOP

配布アーカイブについて

ディレクトリ構成

DateTimePack/
DateTimePack/lib             # これを use lib
DateTimePack/TestRunner.plx  # テスト実行スクリプト
DateTimePack/t               # test code 一式
DateTimePack/TimeThis.plx    # 簡単なベンチマークスクリプト
DateTimePack/README          # アーカイブ概略
DateTimePack/LICENSE         # 一応

各モジュールのバージョン

DateTime                   - 0.31
DateTime::Locale - 0.22
DateTime::TimeZone - 0.45
DateTime::Format::HTTP - 0.36
DateTime::Format::Japanese - 0.01
Params::Validate - 0.81

動作確認について

DateTimeモジュールのテストコード一式を、そのままアーカイブに同梱させてありますので、以下の手順で、任意の環境下で動作確認がとれます:

$ cd DateTimePack
$ ./TestRunner.plx
# 出力結果に 'All tests successful' と出ればOK (問題なし)

動作確認したPerlのバージョン

5.8.4
5.6.2

その他

ライトユーザを考慮して、アーカイブ形式を .tar.gz じゃなくて zip にしてみた次第。 Windows側で解凍 > FTPで資源一式をアップロード、みたいな。

Comments:0

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

Remember personal info

Home > Perl > いつでもどこでも、すぐに DateTime モジュールを使いたい

Search
Feeds

Page Top