Perlの最近のブログ記事

MTOS に MailPack plugin を入れるのに、いくつかの Perl モジュールもインストールしないといかん。

WebARENA SuitePRO V2 のサーバ(CentOS 4.7 x86_64)の場合、以下のようなモジュールのインストールが必要だった。(この順にインストールしていけばいい)

IO-stringy-2.110
Pod-Escapes-1.04
Pod-Simple-3.07
Test-Simple-0.81_02
Test-Pod-1.26
TimeDate-1.16
MailTools-2.04
MIME-Base64-3.07
MIME-tools-5.420_02

あと、おまけで、
IO-1.2301

IOがらみのトラブルの話は
http://blog.netandfield.com/shar/2009/01/iofilebinmode.html
にて。

MovableType の MailPack plugin のメール取得処理で、

[MailPack] listner.pm Can't locate object method "binmode" via package "IO::File" at /usr/lib/perl5/site_perl/5.8.5/MIME/Body.pm line 437.

というエラーが出てしまう。
確かに、/usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi/IO/File.pm を見てみると、binmode なんてメソッドは無い。

なので、CPAN から最新のソース(http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/IO-1.2301.tar.gz)を取ってきてインストールしてみた。(最新つっても、2006/3/26 fix ですよ。枯れてるなぁ(^^;)

# grep binmode /usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi/IO/File.pm
<略>
sub binmode {
    ( @_ == 1 or @_ == 2 ) or croak 'usage $fh->binmode([LAYER])';
<略>

をを、ちゃんと binmode が存在してるじゃないすか。グー。

CentOS 4.7 の File.pm は相当古いんじゃねえ。

携帯から MovableType にエントリを投稿したいというニーズがあるので、うちのテストサーバで、MailPack プラグイン on MTOS 4.22-ja な環境で試行してみた。

引っかかった点は以下の2点。

・MIME-tools のバージョンが 5.420 でないと駄目なのは本当なのねえ。
 インストールの注意に「5.420 でないと駄目。最新の 5.425 じゃあきまへん」と書いてあるんだけど、うちのサーバはさらに新しい 5.427 なんでいけるやろ!と強行したら、やっぱり駄目だった。(^^;
 File::Temp version 0.18 required--this is only version 0.12 at /usr/lib/perl5/site_perl/5.8.5/MIME/Tools.pm line 14.
 とか出ちゃって。依存関係かよ・・・
 しかたないので、泣く泣くバージョンダウン・・・とほほ。(今のところ、他のシステムへの影響は出てないが・・・)

・投稿するメールアドレスが登録されたユーザ作っとかないと駄目なのねえ。
 いやあ、MovableType も個人利用しかしたことないんで、基本的に細かいユーザ設定は知らなかったんだけど、「送信アドレスのユーザーが見つかりません」「ユーザーに投稿権限がありません」と散々怒られ、ユーザ登録、権限の付加などを行いやっと投稿に成功。
 ま、これがセキュリティになってるわけだから仕方ないわな。

つーことで、一応、うちの環境では携帯からのエントリー投稿に(写真付きエントリーも含めて)成功。

むはぁ、夕べは思いのほか手間がかかった・・・

お客さんのサーバの移行を行なったのだが、一部のDBテーブルの移行がうまくいかなくて。
後日対応でもかまわないテーブルだったのだが、状況が謎だらけでその確認だけでもずいぶん時間をとってしまった。

状況としては、varchar(1024) で指定されているレコード項目に、旧サーバでは 2000バイトを超えるデータが登録されているというもの。
そのため、それをそのまま新サーバに移そうとすると当然のごとくエラーとなってしまうわけだ。
DBMS は PostgreSQL。

DB登録を行なう Perl プログラムの中でも、length($hoge) > 1024 なら・・・というチェックをかけているのだが、ここも旧サーバのほうでは 2000バイトを超える文字列がエラーにならず突破してまっている。(EUC の文字数でいうと、1000文字くらい))
もちろん、まったく同じソースを新サーバに持っていくと、このエラーチェックに 2000バイトの文字列は引っかかる。

むーん・・・

もしかして、これがずいぶん昔に話題になった「日本語化パッチの弊害」なのか?

Shift_JIS を扱えるようにする日本語化パッチを Perl に当てると、length や substr が「バイト数ではなく文字数(ダブルバイト文字も 1)でカウントされるようになる」というアレ。
Perl の問題は知ってたんだけど(確か、昔の Turbo Linux の Perl がそういうパッチが当たってる奴じゃなかったっけ?)、PostgreSQL でもエラーにならないってことは、そういうパッチがあるってこと?

旧サーバのほうは、もうずいぶん古いサーバで、僕が管理をしているわけではないので PostgreSQL や Perl にそういうパッチがあたっているかは知らないのだが、とりあえず他に原因が思いつかんし・・・

・・・ということで、昨日は久しぶりの午前様となったのであった。とほほ。

うちの会社で Perl の CGI 作成時にいつも使う自前のテキスト変換関数集があるのだが、その中で MIME B エンコード(メールの Subject とかね)で MIME::Words モジュールを使っている。
MIME-tools に含まれているんだけど、これがまた、たいがいのレンタルサーバで入ってないんだよね。

で、CPAN モジュールを使ったインストールにたいがい失敗するんだよね、MIME-tools・・・

ということで、案の定、NTTPC の WebARENA Suite2 サーバ(CentOS)にもディフォルトじゃ入ってなかった・・・

MIME-tools-5.427 を手作業でいれなきゃ・・・

依存関係にあるファイルが無かったり、バージョンが古かったりするやつを、CPAN サイトから落としてきては手動 make を繰り返す。
結局、WebARENA Suite2 では、MIME-tools-5.427 をインストールするために↓これだけのモジュールを入れなきゃ駄目だった・・・(^^;

ExtUtils-Command-1.14
ExtUtils-Install-1.50
ExtUtils-MakeMaker-6.44
ExtUtils-Manifest-1.54
File-Temp-0.20
IO-1.2301
IO-stringy-2.110
MailTools-2.04
Pod-Escapes-1.04
Pod-Simple-3.07
Test-Pod-1.26
Test-Simple-0.81_02
TimeDate-1.16

半日仕事だよ。(^^;
もしかしたら、この月末にお客さんのサーバに MIME-tools 入れなきゃいけないかもしれないのに、見積漏らしてたなあ・・・(^^;

しかし、WebARENA Suite2 なんかディフォルトでも結構 Perl モジュールが充実していたような気がしたが、なんで MIME-tools なんつうメジャーなモジュールが入ってないんじゃろ?
いや、WebARENA だけじゃないんだけど。

もしかして、みんな MIME-tools 使ってないのか???(じゃ、何使ってるんだろ?
MIME B エンコードや、QuotedPrint のデコードはどうしてるんかね?自前のモジュール?
トレンドを教えてほしいわい。

いや、実は、MIME-tools が入ってないサーバ用に、MIME B エンコードの関数を自作したんだけど、何か、時々デコードすると化けるんだよね(^^;・・・その化ける原因が特定できてないんで(といっても、化ける頻度はかなり小さいんで、実用に耐えられないほどじゃないんだけど)、出来れば「出来合のモジュール」を使いたいんだよね。

結局、Makefile.PL の書き換えなどはせず、GD-2.41も GD-SecurityImage-1.66 も make test で鬼のようにエラーを吐いていたが、そのまま make install した。

で、こんな↓Perl スクリプトを実行したら、一応はイメージが作られた・・・

use GD::SecurityImage;

my $image =
    GD::SecurityImage->new(width    => 300,
                           height   => 40,
                           lines    => 1,
                           font     => "/usr/local/src/GD-2.41/t/Generic.ttf",
                           scramble => 2);
      $image->random('hskdwyq9');
      $image->create(ttf => 'default');
      $image->particle;

my($image_data, $mime_type, $random_number) = $image->out;

open (IMG, ">test.png");
print IMG $image_data;
close(IMG);

これで吐き出した画像が↓


502425.png

 

うわ、きたね。
設定を変えたらきれいになるんかいな?
(ちなみに上の画像には '502425' と書かれている。一応、読めるけど・・・(^^;)

手動インストールならちょろちょろだろうと、休憩時間にちょっと作業してたんですが、なんか、大ごとになってきました・・・(^^;

GD-SecurityImage-1.66 を手動で入れようと思って perl Makefile.PL すると、

Warning: prerequisite GD 0 not found.

って警告される。

ん?GD は入ってるんじゃなかったっけ?と思って

# perl
use GD;
^C

とかやってみると、Can't locate GD.pm と・・・

あちゃあ・・・と、今度は GD-2.41 を CPAN からとってきて perl Makefile.PL すると、

Configuring for libgd version 2.0.34.
Checking for stray libgd header files...none found.

だって。(^^;(昨夜、CPAN モジュール使ったインストールで GD は入ったと思ってたんだけど、幻だったのね・・・(^^;)

ああ、この間 gd-2.0.35 入れたんだけど、元から入ってる 2.0.34 のほうを見てるんだ。
つーか、レンタルサーバは、是非 devel パッケージを入れといてほしいな。rpm は。

ということで、手動で Makefile 直して make するしかないか。

ちょっとした休憩時間に作業するには大ごとになってきたので(^^;、続きはまた後で。

うちの会社でテスト用にレンタルしている CentOS4 のサーバで試しに GD::SecurityImage を CPAN モジュールで入れてみたけど・・・

あちゃあ、CPAN では入らなかった・・・GD::SecurityImage

GD-2.41も入ってなかったんだけど、これはインストール成功。その後の SecurityImage のインストールで NOT OK となる。

# perl -MCPAN -e shell
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support available (try 'install Bundle::CPAN')

cpan> install GD::SecurityImage
CPAN: Storable loaded ok
Going to read /root/.cpan/Metadata
<略>
BEGIN failed--compilation aborted at t/98-gd.t line 25.
t/98-gd................dubious
        Test returned status 2 (wstat 512, 0x200)
DIED. FAILED tests 1-60
        Failed 60/60 tests, 0.00% okay
t/99-magick............ok
Failed Test      Stat Wstat Total Fail  Failed  List of Failed
-------------------------------------------------------------------------------
t/03-info_text.t    2   512    ??   ??       %  ??
t/04-backend.t      2   512     5    8 160.00%  2-5
t/05-version.t      2   512    ??   ??       %  ??
t/98-gd.t           2   512    60  120 200.00%  1-60
2 tests skipped.
Failed 4/8 test scripts, 50.00% okay. 64/107 subtests failed, 40.19% okay.
make: *** [test_dynamic] Error 255
  /usr/bin/make test -- NOT OK
Running make install
  make test had returned bad status, won't install without force

あーあ。

手動で make するしかないか。
見積失敗したな・・・(^^; CPAN ですんなり入るつもりで工数出してたよ。
別のお客さんのときは、そこんとこ考慮しとかないとなあ。

FormMail(pgp5formmail.pl)でも、

$pgpprog = '/bin/pgpe';

open (PGP, "|$pgpprog -r \"$Config{'pgpuserid'}\" -af -o /pgptmp.asc > /dev/null")
~メール本文 出力~
close(PGP);

という具合にベタなメール本文をパイプで PGP プログラムに渡して暗号化。
その後、この PGP 暗号化ファイル(ASCファイル)を読み込んで、メールにセットしてるだけだなあ。

open(PGPFILE, "/pgptmp.asc")

while(<PGPFILE>) {
    print MAIL $_;
}
close (PGPFILE);

で、不要になった ASC ファイルは、

unlink("/pgptmp.asc");

すると。

モジュール使うよりはこっちのほうが簡単だねえ。

Perl でやるなら PGP::Mail か Crypt::OpenPGP みたいだけど、どっちも情報少なっ!

取りあえず引っかかったサイトを羅列しとく。
http://hwat.sakura.ne.jp/hpod/200512/09-143506/
http://www.eyrie.org/~eagle/software/pgp-sign/docs.html
http://ash.jp/sec/pgp.htm

PGP FormMail CGI を使うという手もあり。
http://support.speedex.ne.jp/v1/mail/pgp/pgpformmail.html
(こういうの使ってると、セキュリティホールとかあった時の対応が面倒だけど)

ちなみに、AL-Mail で PGP を使う方法。テストの時に必要かも。
(ALPGP55 について)
http://www.almail.com/alpgp55_readme.html