1999/3/28

「PerlでASPみたいなことをする」のすすめ

MicrosoftのActive Server Pages(ASP)は、複雑な動的ページを比較的簡単に作ることができ、サーバーサイドでのActiveXコンポーネントとの連携が可能で、Webサーバのインプロセスで駆動するため高速である。という、なかなか良い感じのWebアプリケーションプラットフォームです。

しかしASPはIIS専用であり、一般のプロバイダでは利用できないなど、個人ユースでは、まず使われていません。IISでしか動作しないというのは、それだけでインターネット上では欠点ですし、ActiveXを使わないと拡張ができないため、デバッグが困難だったり、大掛かりなサイトではかえって複雑になるなど、実は欠点も沢山持っているのです。

実は、Perl/CGIでも、ASPライクな処理は比較的簡単にできます。このページでは、一般的なPerl/CGIを使って、ASPの利点を生かし欠点を補うWebアプリケーション作成を目指してみよう。というわけです。

一体どうしようと言うのか

Perlにはevalという関数があります。これはプログラム内で、Perlスクリプトの実行を可能にするもので、Perlの超強力機能のひとつです。説明するとわかりにくいと思いますが、要はASPのような <% 〜 %> というタグの埋め込まれたHTMLファイルを、Perlの強力な置換機能で、「Perlスクリプトとして実行可能なテキスト」に変換し、evalをかましてやれば、HTMLファイルにPerlのスクリプトを埋め込むことが可能になるのです。

コアとなるのは以下のサブルーチンです。このサブルーチンに <% 〜 %> タグの含まれたHTMLテキストを渡してやれば、埋め込まれたスクリプトが実行され、標準出力へ出力されます。

sub miniasp {
    my($src) = @_;

    #実行可能な形に変換する
    $src =~ s/<%=(.*?)%>/<%print $1%>/g;
    $src =~ s/<%/'\);/g;
    $src =~ s/%>/;print '/g;
    $src = "print '$src';\n";

    #スクリプト実行
    eval $html;
    die $@ if $@;
}

これだけではまだ、漢字コードの扱いが不完全だったり、HTML中で ' を書けなかったり、不完全な部分が残っていますが、肝となる処理は、これで全てです。現在、HTMLにPerlを埋め込むソフトウェアは数種類公開されていますが、こんな単純な処理で実現できるのですから、自前で処理したほうが良いでしょう。

ASPの良い点と、MiniASP/Perlでの対応

ASPはWebサーバーのプロセス内で動作するので高速

MiniASPではWindowsの場合、IIS+PerlIS.DLLを導入。UNIX系の場合、Apache+mod_perlを導入する事で、Webサーバーのプロセス内で動作させることが可能です。

ASPではActiveXコンポーネントが使用できる

Windowsの場合、Perl for Win32は、COMに対応しているので、MiniASPでも同じようにActiveXコンポーネントを使用することが可能です。また、Perlモジュールが使用できますから、拡張性、柔軟性ではASPを越えると思います。

ASPはクッキーの扱いや、セッション管理、など便利機能が満載

MiniASPではASP互換のモジュールを作ることもそれほど難しくはありませんが、CGI.pmなどの既存の強力なCGI支援モジュールを使うこともできます。

ASPの欠点と、MiniASP/Perlでの対応

ASPはコンポーネントのデバッグが困難

MiniASPは当然CGIとしてアウトプロセス動作させテストすることもできるし、コマンドラインから実行させテストすることもできます。VBほど楽ではありませんが、Perlのデバッガも使えますので、普通のCGIのデバッグと同レベルのデバッグ環境が使えます。

ASPはIISでしか動かない

MiniASPはPerlさえ動けば環境を選びません。CGIの使用が許可されていれば、普通のプロバイダのホームページサービスでも動かせるでしょう。

ASPでは機能拡張するにはActiveXコンポーネントを作らなければならない

MiniASPではPerlでモジュールを作ったほうが簡単です。

ASPはHTMLとスクリプトがごちゃまぜで可読性が悪い

MiniASPではASPのようにごちゃまぜにすることもできますが、複雑な処理はモジュールに追い出すと、すっきり記述できます。

どんなことができるの?

Perlでできることは、そのまま全てできるわけですが、実際に動いているところを見ないと半信半疑かもしれません。では、(あまり意味のないサンプルですが)以下のソースを実行させてみましょう。ここではCGI.pmを使っています。結果はこちらです

<%=header%>
<HTML>
<BODY>
<H1>MiniASPのテスト</H1>

ただいまの時刻: <%=$now=localtime%>

<P>
USER_AGENT: <%=user_agent%><BR>
REMOTE_HOST: <%=remote_host%><BR>

<h3>かけざん計算器</h3>
<P>
<FORM>
<INPUT TYPE="text" NAME="VAL1" SIZE="3" VALUE="<%=param('VAL1')%>">
× <INPUT TYPE="text" NAME="VAL2" SIZE="3" VALUE="<%=param('VAL2')%>">
= <B><%=param('VAL1') * param('VAL2')%></B>
<P><INPUT TYPE="submit" VALUE="計算">
</FORM>

<% for ($i=1; $i<=param('VAL2'); $i++) { %>
    <%=param('VAL1')%> × <%=$i%><%=param('VAL1') * $i%><BR>
<% } %>

</BODY>
</HTML>

http://www.〜/〜.msp といったURLでアクセスできるようにする
(エクストラパスとCGIリダイレクション)

MiniASPを処理するサブルーチンを用意しただけでは、結局URLでCGIを指定して、QUERY_STRINGでソースを指定すような形になってしまい、格好良くありません。ASPのように、直接URLでソースファイルを指定できるようにしてみましょう。(注意:サーバの設定によってはできない場合もあります)

まず、エクストラパス対応のCGIスクリプトを作ります。エクストラパスとは何かと言うと、URLでCGIスクリプトの後ろにパス情報を指定することができるのです。こんな感じですね。

http://www.pixy.ne.jp/~miyamae/cgi-bin/miniasp.cgi/~miyamae/tech/perl/test.msp

まずはこの指定でソースを指定して動くようなCGIスクリプトにしておきます。上のようなURLで指定すると、http://www.pixy.ne.jp/~miyamae/cgi-bin/miniasp.cgi のスクリプトが起動して、環境変数PATH_TRANSLATEDに、/~miyamae/tech/test.mspへのフルパス情報が入りますので、そのファイルをMiniASP処理させるようにします。

以上が実現できたら、CGIリダイレクションを設定します。これはプロバイダの貸しスペースなどでは許可されていない場合もあるかもしれませんが、できるようなら、.htaccessを以下のように設定します。

AddType application/x-httpd-miniasp .msp
Action application/x-httpd-miniasp /~miyamae/cgi-bin/miniasp.cgi

この設定により、以下のようなURLが使用可能になります。

http://www.pixy.ne.jp/~miyamae/tech/perl/test.msp

どうですか?今回はMiniASPの完全なソースは公開していません(近日公開するかもしれません)が、簡単に作れることはお分かりかと思います。スクリプト埋め込み型HTMLは、プログラマでないデザイン担当の方でも、通常のHTMLエディタを用いて簡単にデザインをカスタマイズできるのが強みです。試してみてはいががでしょうか。