Perl: 2008年9月アーカイブ

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

お客さんのサーバの移行を行なったのだが、一部の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

画像認証(CAPTCHA)の要件があったので、取りあえず参考になりそうなところをピックアップしとく。まずは見積もり。

Authen::Captcha

[Perl] Authen::Captcha で画像認証
http://isoya.at.webry.info/200703/article_2.html

GD::SecurityImage

セキュリティイメージの作り方
http://www.hidekik.com/cookbook/p2h.cgi?id=captcha
セキュリティイメージでの認証方法
http://www.hidekik.com/cookbook/p2h.cgi?id=captcha2
perl で Captcha 認証(セキュリティ画像)をやる方法について
http://www.drk7.jp/MT/archives/001364.html
続 perl で CAPTCHA 認証(セキュリティ画像)をやる方法について
http://www.drk7.jp/MT/archives/001369.html
GD::SecurityImageをためしてみたり
http://rockmania-web.blogspot.com/2006/02/gdsecurityimage_03.html

GD::SecurityImage は、Authen::Captcha の置き換えを目的に作られたらしいので、GD::SecurityImage つかった方がいいのかな。

しかし、そもそも CAPTCHA という手段が古いという意見もあるなあ。破られちゃうって。

つっても、破りたい CAPTCHA 画像を中継して他のポルノサイト等に表示。ポルノを見たい親父が CAPTCHA 画像に表示されている文字列を入力。その文字列をそのまま中継して元々のサイトに送信・・・みたいな、間で人間を使う形。
自動で解析して破るという手があるわけでもない様子。それなら、通常のサイトの利用であれば全然問題ないじゃろ。問題あると騒いでるヤツはちょっとビビりすぎって気がするな。(^^;

このアーカイブについて

このページには、2008年9月以降に書かれたブログ記事のうちPerlカテゴリに属しているものが含まれています。

前のアーカイブはPerl: 2007年1月です。

次のアーカイブはPerl: 2008年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら