酒日記

2001 12 12

Wed, 12 Dec 2001

Chateau Rollin (12.5% × 300 ml)

Java 続き、というか Perl だけど。

CPAN で Java で検索したら、 Inline::Java というモジュールを発見。

my $alu = new alu() ;
print "9 + 16 = ", $alu->add(9, 16), "\n";
print "9 - 16 = ", $alu->subtract(9, 16), "\n";

use Inline Java => <<'END_OF_JAVA_CODE';
    class alu {
        public alu(){
    }
    public int add(int i, int j){
        return i + j ;
    }
    public int subtract(int i, int j){
        return i - j ;
    }
}   
END_OF_JAVA_CODE

こんなふうに、Java で class を書いて Perl から使えるという。すげえ。

実行には java の実行環境が必要。実行時に Java VM が起動して何やかややる、という、とてもオーバーヘッドの大きそうな仕掛けではある。 JNI (Java Native Interface) を使ってパフォーマンスを上げることも (Win32 と Solaris では) 可能らしい。

素のCGIでは、Hello World 程度のは動作。重いけど。 やはり CGI として動作させたらオーバーヘッドが大きすぎるけど、もしや mod_perl で動作できれば・・・ と淡い期待をもって実験してみるが、だめ。上記のコードでいうと、

my $alu = new alu();

のところで、

Can't locate object method "new" via package "alu"

とエラーになる。パッケージ(alu)が mod_perl 側に認識できていないような、そんな感じ。 mod_perl の仕組みを考えれば仕方ないような気もするが、ちょっと残念。

まあ実際、これで作ったシステムは運用したくないんだけど。かなり変態的だし。


モルツ (5% × 1000 ml)

先日、ある人に「Perl でモジュールを書いてくださいな」と頼んだら、 「Java で書きたい」とのこと。 そうしたらサーブレットやJSPでシステム組まなくちゃならんのだが、そこらのノウハウは自分は全く持ってない。 しかも納期が1月末 (だいたいそんな仕事の話がなんで12月にくるんだ全く) なので、手を出したことのない技術でやるのは恐すぎる。ということで、なんとか Perl で、ということで押し切る(笑)。

どうも世間には 「Perlダサい Javaカッコイイ」みたいな風潮(風評?)があるような気がしてならないんだけど。 でも「JSP + サーブレット + Java Bean + JDBC」て、「HTML::Template + CGI::Application + 自作モジュール + DBI」(+mod_perl) てのと大差ないよなあ、とつくづく思う今日このごろ。
# 超大規模システムなら Java が有利だろうけど、そんな規模の仕事はしてない(笑)

まあ、遅かれ早かれ Java も齧っておかねばなるまい。ということでピアソンの 「プログラミング言語Java 第3版」(ISBN 4-89471-343-8)、 インプレスの「プロフェッショナルJSP 上 基本編」(ISBN 4-8443-1583-8) を買ってきてみる。

「プログラミング言語Java」をちょっとだけ読んだのだが、疲れる。 内容が悪いのでは全くなくて、フォントの選択がまずい。 本文中に関数名を書いたりするときにタイプライタ書体を使っているのだが、このフォントが妙に線が細くて本文中に溶け込んでしまう。 ぱっと見で目に入ってこないので、気合いを入れて目で追っていかないと読み取れず、これが疲れる。 ちょっと読んだだけだけど内容はよさそうなのになあ。もったいない。

JSP (サーブレット)関連の本を書店で探して立ち読みしてて 「入力中の危険な文字をエスケープする」という項目が。要は < > " & などを &lt; &gt; &quot; &amp; などどエスケープする、というよくある処理なのだが、そのサンプルコードを読んで腰を抜かした。 Java は書けないので Perl でそのアルゴリズムを書いてみると、

my $str = '****************';
my $replace_str;

for (my $i = 0; $i < length($str); $i++){
    my $sub_str = substr($str, $i, 1);
    if($sub_str eq '<'){
        $replace_str .= '&lt;';
    }elsif($sub_str eq '>'){
        $replace_str .= '&gt;';
    }elsif($sub_str eq '"'){
        $replace_str .= '&quot;';
    }elsif($sub_str eq '&'){
        $replace_str .= '&amp;';
    }else{
        $replace_str .= $sub_str;
    }
}

こんな感じ。つまり、「文字列を先頭から一文字ずつ読んでいって、その文字が < か > か " か & なら、それぞれエスケープした文字を変換後の文字列に連結。それ以外なら、そのまま連結」 という・・・。正気ですかこれ? これが Java での文字列処理のスタンダードなの?

Perl でやるなら正規表現で

my $str = '****************';
$str =~ s/&/&amp;/g;
$str =~ s/</&lt;/g;
$str =~ s/>/&gt;/g;
$str =~ s/"/&quot;/g;

だよなあ。

さすがにそりゃないだろ、と思ったので検索してみると、Java の言語仕様には正規表現は含まれていないが、 Perl 互換の正規表現を扱うライブラリはフリーであるらしい。まあ、当然誰かが作るわな。


powered by blosxom