camel

はてなブックマーク - タグ perl」で以下を発見して、SPAMとの戦いに日々うんざりしている私は期待に胸を踊らせたのですが、代わりに心臓が踊ってしまいました。

http://vrl.sys.wakayama-u.ac.jp/~twada/NNIPF.html
NNIPFでは,我々が長年蓄積した100万通以上の大量のSPAMデータを詳細に解析した結果,最も有効であると思われる「送信者の情報」を特徴として利用しております.
下記の二つを,指定されたURLからダウンロードして,下記の指定された名前でNNIPFのディレクトリに保存してください.
-rw-r--r-- jcode.pl-2.13 http://www.srekcah.org/jcode/jcode.pl-2.13
-rwxr--r-- mimer.pl      http://www.cc.rim.or.jp/~ikuta/mime_pls/mimer.pl

これを見た途端に悪寒がしたのですが、その悪寒は以下を見て確信へと変わりました。

NNIPF/PERL/analyze.pl
sub main'IpDictMatch{
 ($query,$Dict, $Flg) = @_;
 @qaddr=split(/\./,$query);
 $dir=$Dict;
 for ($i=0, $match=0, $flag=1; $i<4; $i++){
        if (-e ($filename=sprintf("%s/%s",$dir,$qaddr[$i])) ){
      $fc=0;
      if ($Flg){
        if (-e ($counter=sprintf("%s/Count",$filename))){
           open(INc, $counter);
           while(<INc>) {$count=$_;}
           close(INc);
           unlink($counter);
           $count+=1;
        }else{$count=1;}
        open(OUTc, ">$counter");
        print(OUTc $count);
        close(OUTc);
      }
    }elsif ($flag) {
         $flag=0;
         opendir DH, $dir or die "$dir:$!";
         $fc=256;
         while (local $file = readdir DH) {  
               next if $file =~ /^\.{1,2}$/;
        if (abs($file-$qaddr[$i]) < $fc) {
            $fc=abs($file-$qaddr[$i]);
            }
         }
        }else{$fc=256;}
    $match=$match*256+$fc;
    $dir=$filename;
        }
 return $match;
}

....すごい。これはPerl 4のソースです。Perl 5として添削するのは私の手に余ります。

これが1997年に書かれたプログラムなら得心もするのですが、れっきとした2007年産のプログラムです。Pkgname::identifierではなくPkgname'identifierという記法もものすごい久しぶりに見ました。

Perl 4で書かれている(それでもPerl 5で動く--であろう--怖くて動かせない)ことを除いても、このプログラムには直しどころがあまりに多くあります。例えば、このプログラムではIPアドレス1.2.3.4がスパム発信源だとして、それに関する統計情報を、BIP/1/2/3/4/Countという名前のファイルに記録しています。これでは最近の大容量ディスクでもi-nodeが足りなくなりそうです。ちなみに私のmail serverのi-nodeの総数は4800万弱。IPアドレスの数は理論上で42億、実際に使われているものも1億以上あります。

和田俊和先生のご経歴を見ると、なかなか立派なご研究をされているようでいらっしゃいます。また、その研究を単なる研究に留めず、今回のNNIPFのように一般に利用できる形で公開して下さることに頭が下がる思いが致しますし、そしてそのための道具としてプログラミング言語Perlを選択して下さった事は、1 Perl Porterとして感激ぜずにはいられません。

それだけに、先生のPerl体験が、Perl 4で留まってしまっていることを大変残念に思います。2007年のPerlは、先生がもっと楽に、そしてもっと多彩にプログラムするための環境を整えています。jcode.plとmimerの機能はEncodeという形でPerlに標準装備されていますし、データの保存方法も通常のファイルのみならず、DBMからSQLからWeb APIに至るまで各種揃っています。そして何といってもCPANがあります。これらを知らずにPerlを使うのは、貴重な時間を無為に失うことになってしまいます。

改めてお願いします。Perl 5を学び直していただきたい、と。先生のことですから21世紀のPerlにあっというまに追いつくでしょう。ここではあえて「リャマ本」こと「初めてのPerl」ではなく、この本の次に読むべき本とされる「アルパカ本」こと「続・初めてのPerl 改訂版」をお薦めします。パッケージ、リファレンス、ハッシュ、配列、サブルーチン、モジュールといった、NNIPFのようなソフトウェア開発に役立つPerl 5ならではのPerlの機能を手っ取り早く学ぶのに最適な一冊です。もちろんPerlのバイブルであるProgramming Perlも手に入れておくべきですが、先生の場合はアルパカ本がショーテストカットだと思われます。

小飼 弾 拝

Dan the Perl X Monger (Where X > 5.0)