存在する場合は , パーサはファイル生成ル ーチンをスキップします。 2 回目以降には , ユーザが独自の関数などをすでにコーディ ングしていると考えられるためです。最初 から作成したければ , 単にこれらのファイ ルを削除すればいいだけです。 パーサはあと 2 つの重要なファイルを自 動生成します。 1 つはメインの CGI スクリプ ト。もう 1 つは ProjectHtmlItems. pm です メインスクリプトは , WEBMAKER オプ ジェクトを生成し , HTML を出力します。 わずか数十行のスクリプトファイルにすぎ ません。ここにすべてが埋め込まれます。 たとえば , サンプル sample. cgi のメインス クリプトは List 3 のようなごく単純なもので Fig. 10 Fig. 9 make 「サプレーチンによるファイル生成の流れ 設定ファイル WebMake 「 . conf ake 「 す。これ自体は , Wmds システムであって も変わりません。データベースを利用する CGI でいくつかのパラメータが追加される だけです。たとえば , Winds のメインスク リプト (List 4 ) は , データベース名とデー タベースソフトの指定が追加されるだけで す。 生成されるファイル sample. cgi SampIe/SampIeHtmI.pm SampIeHtmIItems. pm SampleLogic. pm ProjectHtmIItems. pm というファイルには と異なります。 たびにこのファイルを上書きする点がほか ただし , パーサが 2 回目以降も起動される クトファイルと同じように格納されます。 ェクトのディレクトリ内にほかのプロジェ ProjectHtmlItems. pm は開発中のプロジ ヨ •st WEBMAKER)!—サの起動用スクリプト (WebMake 「 -sample.pl) $linux = ' /usr/bin/perl my $win = 'c:%perl%bin*perl copy( $source—file, $destination-file my $destination—file = 'WebMaker. conf' my $source—file = 'WebMaker. conf-sample' use WEBMAKER: : Htm に temsMaker ー use FiIe: :Copy; use strict ー # WEBMAKER. Sample # ! /usr/bin/perl exit; k ( %target databasename => database perlpath description projectname cglna-me my %target = ( postgreSQL ' sampledb' ' off ' => $linux, Sample' , sample% HtmlTempIate Html WEBMAKER のオブジェクト継承図 TabIe 1 make 「サブルーチンのパラメータ バラメータ cglname p 「 ojectname description perlpath database databasename databasesoft 内容 生成するメインの CGI 名を指定。 List 2 では sample.cgi が作られる この CGI のプロジェクト名。ここで指定した名称でサプデ ィレクトリが作られ , そこに基本的な CGI のためのオブジ ェクト , ユーザが独自に定義するためのバッケージファ イルのスケルトンが生成される メイン CGI の冒頭に記述するコメントを指定する。なけ れば , デフォルトの文字列が追加される メイン CGI の Perl のバスを指定する データベースを利用するかどうかを指定する。 on なら利 用 , off なら利用しない 利用するテータベースの名称を指定する。上の database が off なら指定しても意味を持たない 利用するデータベースソフトを指定する。現状では postg 「 eSQL か MySQL のどちらか。これも database が 0幵なら 意味を持たない TabIe 2 バッケージファイルの内容 HtmlDBApp ProjectDBLogic P 「 ojectLogic ProjectHtml HtmlE 「「 p 「 バッケージファイル名 HtmI.pm HtmlTempIate. pm HtmIApp. pm HtmlDBApp. pm Htm 旧「「 0 「 . pm P 「 ojectLogic. pm P 「 ojectDBLogic. pm P 「 ojectHtmI.pm 内容 HTML 出力のための基本クラスを定義する HTML を構成するバーツの組み合わせを提供する データベースを利用しない , CGI アプリケーション用のク ラス テータベースのオープン / クローズなど , データベースア データベース関連のルーチンを収める 収める プロジェクトに特化したデータベース以外のルーチンを 汎用工ラー出力のためのルーチンを提供する プリケーションに特有の処理を実装する シ プロジェクトのための HTML を構成するメインバッケー 38 HtmIApp P 「 ojectLogic P 「 ojectHtmI C MAGAZINE 2001 12
いるとしても , 「地域通貨」を想定した小さ なコミュニテイやレンタルサーバ , ホステ イングサービスの一般的な情勢を見れば , 運用という側面 , 価格面でのハードルが高 い , という点があげられます。 perl という 言語はそれ自体が非常に多機能で高度な仕 組みを持っているし , 何よりもほとんどど このサーバでも動くという大きな利点があ ります。 インストールが三度の飯よりも好きだと いう人にとっては , tomcat をサーバに入れ たり , Apache に mod-jserv を組み込んだり するのは何ものにも変えられない楽しみか もしれませんが , 「地域通貨」を利用したり 運営したりしようという人たちは必ずしも そういったマニアではありませんし , 近く にそういう専門家がいるとは限りません。 そこで筆者らは , プログラマとして Perl と いう言語の機能を最大限引き出そうという 選択をしました。しかし , プロジェクトと しては , 将来的にはほかの言語での開発に 含みを持たせています Fig. 1 解凍後のファイ丿レ構成 WEBMAKER のインストール ファイル webmaker-0.99. tar. gz を解凍する と , Fig. 1 のような構成でファイルが作ら れます。これは標準的な perl パッケージの 構成に従ったもので , インストールも同様 に行います ( Fig. 2 ) 。 Fig. 2 WEBMAKER のインストール $ perl MakefiIe. Checking if yo k 土セ is complete. も 00ks good Writing Makefile for WEBMAKER $ make mkdir b lib mkdir b lib/ lib mkdir b lib/arch mkdir b lib/arch/auto 献 d 土て b lib/arch/auto /WEBMAKER mkdir blib/ lib/auto mkdir blib/ lib/auto/WEBKAKER mkdir blib/man3 インストールによって , WEBMAKER の 利用法などを解説した manvx ージもセット アップされます。たとえば , $ man WEBMAKER : : HtmI とすると Fig. 3 のように表示されます。 manvx—ジは , Perl の POD 構文によって パッケージファイル内に記述されています。 現状ではすべて日本語で , 英語版はまだ作 cp WEBMAKER/HtmITempIate. pm blib/ lib/WEBMAKER/HtmITemplate.pm cp WEBMAKER/HtmIDBApp. pm blib/ lib/WEBMAKER/HtmIDBApp ・ pm cp WEBMAKER/HtmI.pm blib/ lib/WEBMAKER/HtmI.pm cp WEBMAKER/HtmIApp. pm blib/ lib/WEBMAKER/HtmIApp. pm cp WEBMAKER/HtmIItemsMaker. pm blib/ Iib/WEBMAKER/HtmlItemsMaker. pm cp WEB期K駅/北m国rて0て . pm blib/ は b / WEB K 駅 / m ーて 0 て . pm A Ⅱ tests successfu に $ make test Manifying blib/man3/WEBMAKER: :HtmlItemsMaker. 3 Manifying blib/man3/WEBMAKER: : Htm 忸てて 0 て . 3 Manifying bIib/man3/WEBMAKER: :HtmIApp. 3 Manifying blib/man3/WEBMAKER: :Html. 3 Manifying blib/man3/WEBMAKER: :HtmlDBApp. 3 Manifying bIib/man3/WEBMAKER: :HtmITempIate. 3 0 .03 csys 3 イ Chan es MAN?FEST Makefile. PL README WEBMAKER Html. m HtmIkpp pm HtmlDBApp. pm Htm 旧「「 0 「 . pm HtmlltemsMaker. pm HtmlTempIate.pm にここ WebMaker. conf WebMaker. conf-sample DHTML DHTMLHtmI.pm DHTMLHtmlltems. pm DHTMLLogic. pm SampIeHtmI.pm SampIeHtmIItems. pm SampleLogic. pm WebMake 「 . conf WebMaker. conf-dhtml WebMaker. conf-sample WebMaker-dhtmI.pI WebMaker-sampIe.pl dhtml.cgi sample. cgi clean-sample. sh confl . txt conf2. txt dhtmllib. js SC 「 0 Ⅱ e 「 . ・ S htm12Wconf setup-sample.sh test. t conf demo SampIe MAGAZINE 2001 12 Files=1 , Tests=1, 1 wallclock secs ( 0.23 cusr 十 $ su Password : # make install Fig. 3 man による表示 $ man WEBMAKER: :HtmI 0.26 CPU) W 期 K 駅 : : Htm Ⅱ User Contributed per ー DocumentatiWEBMAKER : : Htm Ⅱ 3 ) NAME WEBMAKER. : :Html-Perl extension fo て CGI Application SYNOPSIS WEBMAKER. : :Html; DESCRIPTION WEBMAKERJS ッケージは , 「地域通貨」 L s の w 上での決済を目的と した PROJECT WIND のために独自に開発された CGI システムの構築を サポートする一種の RAD ツールです。 しかし、「地域通貨」システムに限定されない汎用性を意図して設計 されています。
002 CGI/P 卲叭ッケージの活用 2 つの役割があります。 1 つはメニュー構造 をインプリメントする巨大な if 文を持っサ プルーチン「 __itemselection 」を生成するこ とです。もう 1 つは , CGI の各ページの内容 となる関数を実装することです。これらは いずれも , 設定ファイル WebMaker. conf を そのつど反映するようにパーサの起動時に 毎回書き換えられます。メニュー構造を変 化させたり追加したりした場合には , それ を WebMaker. conf に記述し , パーサを起動 してこのファイルを作り直さなければなり ません。 WEBMAKER のパーサは , この ProjectHt mlltems. pm ファイルを生成するだけだとい っても過言ではありません。つまり , WEB MAKER オプジェクトは , 「 CGI スクリプト のための固定的な構造を提供し , そこに挿 入するようにプロジェクトファイルを定義 することで CGI スクリプトを完成させる」と いえるでしよう。そして , このプロジェク トファイルは 2 つの手段 , WebMaker. conf と「ユーザ定義関数」によってカスタマイズ されます。 WebMaker. conf ファイルには一 定のルールがあり , それに従って web ペー ジ単位で内容を書き込みます。一方 , 「ユ ーザ定義関数」は完全にモジュール化され ているのが望ましく , 極力小さないくつも のサプルーチンで構成されることが推奨さ れます ( もちろんパッケージ内で , あるいは PerI の名前空間を共有するようにして , い くつもの変数を定義することは可能です ) 。 こうすることによって , 修正や追加 , 改訂 が驚くほどスムーズに行われるはずです。 WebMaker.conf ファイル サンプルでは「ユーザ定義関数」はいっさ い作成していません。つまり , WebMaker. conf ファイルの設定だけで , 画面とメニュ ーを作っています。 WebMaker. conf ファイルの記述は , W1nd ows の ini ファイルと Perl のヒアドキュメン トを混合させたような様式です。ヒアドキ ュメントというのは , PerI スクリプト内で まさにその場 (here) にデータを書き込む , Per に特有の文法構造です。 ⅲ ldows の i ⅲファイルは , プロックの名 称を「 [ block ] 」で表し , 「名前 = 値」という形 式でデータを羅列します。 Windows だけに 特有なわけではありませんが , ini ファイル なら覗いたことがある読者もたくさんいる 土 like PERL 1 am a programmer . $data = くく・ Perl ヒアドキュメントは , でしよう。 と書けば , 標準出力に先の文字列が出力さ print $data; こで「 $ data 」は変数です。たとえばこれで , んだデータを記述することが可能です。 というふうにスクリプト内に直接改行を含 れます。 認証などのロジックを用意するためのもの この間でクッキーのコントロールや設定 , す。 LOGIN と LOGINOK の連続的な処理は , この 4 つは TabIe4 のような役割を持ちま ューザが任意に設定するべージ名です。 約するべージプロック名です。それ以外は LOGINOK, HEADMENU はシステムが予 このうち最初の 4 つ , GLOBAL, LOGIN , .. 以下略 .. [ HTMLTEMPLATE ] [HTML] [REGIST] [HEADMENU] [LOGINOK] [LOGIN] [GLOBAL] のようなプロックがあります。 サンプルではこの [ LOGINOK ] も含めて , 次 でシステム上利用されるということです。 つの HTMIÄ—ジが [LOGINOK] という名称 のページを見分ける指標です。つまり , 1 [LOGINOKI はプロックを表し , HTML 冒頭部分です。 設定ファイル「 WebMaker. conf-sample 」の 利用します。 List 5 はサンプル sample. cgi の ebMaker. conf では , これらを List 5 のように nf の指令は TabIe 3 のとおりです。実際の W さて , 現在組み込み可能な WebMaker. co 土 like PERL. $ 土 am a programer. List サンプルのメインスクリプト ( samp 巨 cgi ) 3 # ! /usr/bin/perl # WEBMARER. CGI MAIN SCRIPI' # projectname # database Sample : off # created by W AK 駅 - : :HtmIItemsMaker use strict ー use SampIe: :SampIeHtml; my $SamplehtmI = sample: :sampleHtmI->new( $Samplehtml->run( exit; sample. cgi Winds のメインスクリプト List 4 # ! ん sr/bin/perl # WEBMAKER CGI MAIN SCR. IPT # projectname : Winds # database # *. sename : windsdb # databasesoft : postgreSQL # created by WEBMAKER::HtmlItemsMaker use strict ー use Winds : : WindsHtm 嵭 my $windsdb = 'windsdb' my $postgreSQL = ' postgreSQL ・ my $Windshtml = Winds: :WindsHtmI->new( $winds—qdb, $postgreSQL 特集 2 地域通貨決済システム作成にみる CG レ Per レヾッケージの活用 # winds. cgi exit; $Windshtm l->run ( 39
ットアップスクリプトです。もともと demo ディレクトリは Fig. 5 のような構成で , setu p-sample. sh を実行 (Fig. 6 ) することで , Fig. 4 の濃い部分のファイル , ディレクトリが 新しく追加されます。 setup-sample. sh は WEBMAKER を利用し て 2 つの CGI を生成します。とりあえずこの CGI を見るには , プラウザで , http://localhost/.../webmaker-O.99/ demo/sample.cgi とアドレスを入力します。 localhost の部分 は適時変更してください。 Apache のドキュ メントルートの設定や , CGI スクリプトの 設定については , Apache の参考書を見てく ださい。 Fig. 7 は , sample. cgi のアンケート画面で す。このサンプルではファイルやデータベ ースへの入出力は実装していません。 で一をクリックすると , WEBMAK ER のマニュアルが表示されます。 もう 1 つは , DHTML の組み込み例です。 http://localhost/…/webmaker-O.99/ demo/dhtml.cgi Fig. 8 は最初のメニュー画面です。タス クバー上で移動する文字列は , JavaScript を 5 21 : 42 sample/ 組み込んで作成しています。そのほか , い 481 Jun 30 02 : 32 WebMaker-dhtml.Pl くっかの動的な画面のサンプルが実装され ています。 187 Jun 30 02 : 32 clean-sample. sh setup-sample. sh の解説 255 Aug 9818 Jun 30 02 : 32 dhtmllib. js setup-sample. sh は List 1 のようなシェルス クリプトです。このスクリプトは大きく 3 10763 Jun 30 02 : 32 scroller. js 876 Jun 30 02 : 32 setup sample. sh つの部分に分けることができます。 ・ HTML 形式マニュアルと WEBMAKER 設定ファイル成 (List 1 - ① ) WEBMAKER パッケージの POD 形式のマ ニュアルから HTML 形式のマニュアルを生 成します。これには , Perl のユーティリテ イ pod2htmI を利用しています。そして生成 された HTML ファイルを , htm12Wconf. pl と いう perl スクリプトで WEBMAKER の設定 ファイル用にデータを抽出します。 htm12Wconf. pl はこのサンプルのために書 36 C MAGAZINE 2001 12 187 Jun 30 02 : 32 clean-sample. sh 9818 Jun 30 02 : 32 dhtmllib. js 10763 Jun 30 02 : 32 scroller. js かれたスクリプトで , conf2.txt というファ イルを作ります。そして , それを confl. ⅸ t とあわせて WebMaker. conf-sample という WEBMAKER 設定ファイルを作ります。 ・ WEBMAKERAO—サの起動 (List 1 - ② ) 次のプロセスは , WebMaker-sample. pl を 起動することです。 List2 がそのスクリプト で , これは WEBMAKER のパーサを起動し ます。 WEBMAKER パーサは HtmlItemsMaker. p m で実装されており , 直接にはⅱ st2 のよう に maker サプルーチンにいくつかのパラメ ータをハッシュで与えて起動します。パー サは , WebMaker. conf ファイルを直接読む ようにコーディングされています。このス クリプトの冒頭から何行かは , 安全のため に本来の設定ファイル (WebMaker.conf-sa mple) を読み込む設定ファイル (WebMaker . conf) にコピーしています。パッケージ全 体を通じてこういった利用法をしているの で , このスクリプトをそのままスケルトン にすることをお勧めします。 maker サプル ーチンに与えられるパラメータの意味は Table 1 のとおりです。 WEBMAKER パーサは , 設定ファイルか らパラメータの指示に従って一連のファイ ルを生成します (Fig. 9 ) 。これらの詳細は 次節以降で解説することにします。データ べースが on になっている場合には , データ べースロジックをインプリメントするパッ ケージファイルが追加されます。なお , の List 1- ②の部分の最後では , 余計なファ イルを削除しています。 ・ DHTML サンプル用 WEBMAKERJ\O—サの起動 (List 1 - ③ ) 3 つ目の部分は , 2 つ目とまったく同じで す。 DHTML サンプルのためにパーサを起 動して CGI スクリプトを生成しています。 なお , demo ティレクトリ内の clean-samp le. sh を実行すると , セットアップが実行さ れる前の状態に戻ります。 セットアップスクリプト実行後のファイルの構成 d てて一ー x drwxr-xr-x ーて r ーて W - 工ー —xr—x -xr-x 2 ipfr—cat doglive 2 ipfr—cat doglive 1 ipfr—cat doglive 1 ipfr—cat dog live 1 ipfr—cat doglive 1 ipfr— 1 ipfr— 1 ipfr— 1 ipfr—cat 1 ipfr— 1 ipfr— cat cat cat cat 1 ipfr—cat dog live cat 1 ipfr—cat dog live 1 ipfr—cat doglive 1 ipfr—cat doglive 1 ipfr—cat doglive doglive doglive doglive doglive doglive dog live 5 21 : 42 DHTML/ 1344 Jun 30 02 : 32 htm12Wconf. pl 4096 Aug 4096 Aug 5 21 : 42 sample. cgi* 5 21 : 42 dhtml. cgi * 5 21 : 42 conf2. txt 5 21 : 42 WebMaker. conf¯sample 13960 Jun 30 02 : 32 WebMaker. conf-dhtml 5 21 : 42 WebMaker. 00れf 484 Jun 30 02 : 32 WebMaker-sample.pI 263 27878 Aug 33884 Aug 13960 Aug Aug 6006 Jun 30 02 : 32 confl . txt Fig. 5 セットアップ前の demo ディレクトリのファイル一覧 1 ipfr— 1 ipfr— 1 ipfr— 1 ipfr— 1 ipfr— 1 ipfr— 1 ipfr— 1 ipfr— cat 1 ipfr—cat dogl ive cat cat cat cat cat cat cat doglive doglive doglive doglive doglive doglive doglive doglive 481 Jun 30 02 : 32 WebMaker-dhtml•Pl 484 Jun 30 02 : 32 WebMaker-sample. 13960 Jun 30 02 : 32 WebMaker. conf-dhtml ・ 32 setup-sample. sh 6006 Jun 30 02 : 32 confl . txt 1344 Jun 30 02 : 32 htm12Wconf. pl 876 Jun 30 02 .
C 卲 Pe 可バッケージの活用 002 のが , パーサが生成するプロジェクトファ にインクルード (Perl では require) するよう バーサが生成するファイルと イルです。サンプルでいえば , Sample ディ な別ファイルを作成してもかまいません。 WEBMAKER オブジェクトの仕組み レクトリ内のファイルがそれに該当します。 要は , ProjectLogic. pm にはページを具体化 パーサが生成するファイルは , すべて WE 拡張子「 . pm 」がそれぞれに付いています。 するサプルーチン群 , ProjectDBLogic. pm BMAKER パッケージで記述されたオプジェ それぞれのパッケージファイルの役割を には DB アクセスに関するサプルーチン群を クトの継承です。オプジェクトの継承関係 「ユーザ定義関数」として記述することにな TabIe 2 に示します は Fig. 10 のようになります。 プロジェクトパッケージファイルのうち ります。 頭に「 HtmI 」が付いたものがいずれも WE 前の 2 つ , つまり ProjectLogic. pm と Project パーサは初期起動時にプロジェクトファ BMAKER のパッケージです。 WEBMAKER DBLocig. pm は , 実際にユーザが関数を定 イルのスケルトンを作成します。このスケ ディレクトリを見てもらえばわかるように 義してコーディングを行います。 ProjectHt ルトンには最低限必要な「予約済み」のサプ それぞれに 1 つのファイルが割り当てられ 特殊な場合以外は触ることはあ ルーチンが書き込まれます。 2 回目以降の ml. pm は , ています。先頭に「 Pr 可 ect 」が付いているも りません。 もちろん , 2 つの Logic ファイル パーサ起動時にこれらのファイルがすでに Fig. 6 setup-sample.sh によるサンプルのセットアップ Fig. 8 dhtml.cgi のメニュー画面 $ sh . /setup-sample. sh creating html files . ファイル継表示、ャンア C0m20 に 3 「 creat ing files finish. WEBMAKER DHTML SAMPLE get bOdy tag : Html.html = = 〉 conf2. txt WEBMAKER DHTML Sample get bOdy tag : HtmlTemplate. html = = 〉 conf2. txt get bOdy tag : HtmlApp. html = = > conf2. txt get bOdy tag : HtmIDBApp. html = = > conf2. txt get bOdy tag : HtmlError. html = = > conf2. txt get bOdy tag : HtmlItemsMaker. html = = > conf2. txt webmaker parser started. sample. cgi created. Sample/SampIeHtml.pm created. Sample/SampleLogic ・ pm created. no datahase application. Sample/SampleHtmlItems. pm created. webmaker parser started. dhtml.cgi created. DHTML/DHTMLHtmI.pm created. DHTML/DHTMLLogic. pm created. no database application. DHTML/DHTMLHtmlItems. pm created. finish. 0 を 5 こ : ′ : : レ材町ツ物、 - ー国をを 0 , な t 長 I 、ルア DyanamicHTM しを利用したサンプルです。 DHn.'1L 組み込みのために、 WEBMAKER)S—サーが若干拡張されました。 CXS と LAYERB グのための領域を追加して います。 FADE EN & OUT 2 TYPE WRITER SCROLL MSG 鑄 1 WEBMAKER 、 Sam?eCGlSFtemwithoutDATABASE- WEBMAKERveriOn0992(X)i 281 M028 : 1 : 1 成 生 生 CO を : レ 0. イ Cf) フ ア 0 から成 ) ンか乍 一ル結日 ケイ連土 ク ツアを 0 ス プ ッ 5 ア セ 一ト . ッ 0 2 1 ・ 1 2 Fig. 7 sample.cgi のアンケート画面 ファイ叫編第喪示 - ジャンアー Comm リⅲ 0 0 「 アンケート回答ページ WEBMAKER Sample CGI System cd . echO creating html files. pod2htmI WEBMAKER/HtmI.pm > dem0/Html.html pod2html WEBMAKER/HtmIApp ・ pm > demO/HtmIApp. html 0d2ht WEBMAKER/HtmlDBApp. pm > dem0/HtmlDBApp. html 0d2 れ tm ー W AK 田ノ Htm ーて 0 て . pm > dem0/Hにm忸てて0て . html pod2html WEBMAKER/HtmlItemsMaker. pm > demo/HtmlItemsMaker. html WEBMAKER. /HtmITemplate. pm > dem0/HtmlTemplate. html echO creating files finish. cd demo perl ht 2W00 れ f. ca セ 00nf1. txt 00nf2. txt 〉 WebMaker. conf-sample perl WebMaker-sample. pl fo て file in * t do rm -f $file rm ーて .. /pod2htm ト d 土て cache rm ーて .. /pod2htmI—itemcache アンケートにお答えください 質間宿 あなたの年齢ー 現在、お住まいの都道府県名 性別 0 男性 0 女性 ご利用コンピュータの機種 i こ利用の OS : 回答入力 凵ソフトウェア 」ハードウア 興酥のある分野」プログラミング 」アプリケーション 」システム設計 Mon)20 : ⅱ : 27 3 / 特集 2 地域通貨決済システム作成にみる CG レ Pe 「レヾッケージの活用
ホスト名 ( 誰からのアクセスか ) と日付け だけに限定しています。 フィルタのインスタンスを生成すると きにオプションとして , capture = > [ 'host という指定をしています 'date' ] ここで capture の値として与えることができるのは , フ ィールド名の配列のリファレンスです。 実行結果は , Fig. 3 のようになります。 圧縮ファイルをフィルタリング IO : : Zlib モジュールを使うと , gzip で圧 縮されたログファイルを処理することも できます。サンプルログファイルには acce ss 」 og ー clf. gz という圧縮ファイルが付いて いるので , これを使って圧縮されたファ イルを取り扱ってみましよう。 List3 は , gzip で圧縮されたログファイル を処理して GET リクエストで転送したバイ ト数を得るスクリプトです。この中で , $fi lter->detect—format ( filename = > 引 ogf e という文によってフォーマットを自動判 定しています odetect_format 関数の中では , ログファイルから 1 行読み込んでフォーマ ットを判定していますが , $ logfile の拡張 子が . gz だったら z ⅱ b 経由で読み込むような 設定になっています。自動判定を行う場 合には , new の時点で format オプションを 指定する必要がありません。 List 3 では , GET リクエストにマッチす るものをフィルタリングするように request—re = > 'GET. * というオプションを指定しています。 こで指定する値は , 正規表現の一部分を なす文字列ですが , ちょっとクセがあり ます。たとえば , リクエストの最初を意 味するつもりで , x request_re = > 'AGET' TabIe 4 H 幵 PD : : Log : : F ⅱ te 「付属のサンプルログファイル Fig. 2 List 1 の実行結果 ( MS 旧を含む場合に MATCHED : と表示 ) MATCHED: 192.168.1.20 [ 25 / ay / 2001 : 00 : 04 : 32 十 01 圓 ] "GET /idents/160x120/markets-report. jpg HTTP/I. 1 ” 304 ” Mozi Ⅱ a / 4.0 (compatible; MSIE 5.0 Windows NT 5.0 ) ” MATCHED: 192 .168 . 1.22 [ 25 / ay / 2001 : 圓 : 04 : 32 十 0100 ] 形式 CLF CLF( 圧縮 ) ELF Squid XLF ファイル名 HTTPD-Log-FiIter-1.07/sampIe/access 」 og_clf HTTPD-Log-FiIter-1.07/sampIe/access 」 og_clf. gz HTTPD-Log-FiIter-1.07/sample/access 」 og_elf HTTPD-Log-FiIter-1.07/sample/access 」 og_squid HTTPD-Log-FiIter-1.07/sampIe/access 」 og_xlf "GET /news/20010523/pics/Iord—maclaurin. jpg HTTP/I.1 ” 200 8016 "http://www. 土セn. co. uk/sport . shtml" ” Moz 土Ⅱ a / 4 . 0 (compatible; MSIE 5. Windows 9 DigExt) ” MATCHED: 192 .168 .1 . 21 [ 25 / May / 2001 : 00 : 04 : 32 十 0100 ] "HEAD /images/email—businessbulletin. gif HTTP/I. 1 ” 304 ″ oz 土Ⅱ a / 4.0 ( compa セ土 MSIE 5.0 Windows NT 5.0 尸 nomatch: 192 .168 . 1 . 20 [ 25 / ay / 2001 : 00 : 04 : 32 十 0100 ] "GET / B て土 tain / b て土 t20000120 / 012013. htm HTTP/I . 0” 302 234 "http: //random.yahOO.com/bin/ryl" "webcollage/l. 65 ” nomatch: 192 .168 . 1 . 22 [ 25 / ay / 2001 : 00 : 04 : 32 十 0100 ] "HEAD /js/javascripts2 . js HTTP/I . 0” 3 0 4 ” oz 土Ⅱ a / 3.01 ( compa 土 b 厄卩” MATCHED: 192.168.1.22 [ 25 / May / 2001 : 00 : 04 : 32 十 0100 ] "GET /news/20000902/pics/hooligans—sm. jpg HTTP/I. 1 ” 304 ″ ht セ p : / / . 土 tn. co. uk / news / 20000902 / b て土セ a 土 n / 02h00 は gans. s htm げ ″ 02 土Ⅱ a / 4.0 (compatible; MSIE 5. windows 9 BTinternet CD v7 . 0 ) ” nomatch: 192 .168 . 1 . 21 [ 25 / May / 2001 : 00 : 04 : 32 十 0100 ] "HEAD /news/20010524/pics/rai11—sm. jpg HTTP/I. 0” 200 0 ″ 02 土Ⅱ a / 4.77 [ en ] C ー 032399 (Win98; U)" MATCHED: 192 .168 . 1.20 [ 25 / May / 2001 : 圓 : 04 : 32 十 0100 ] DHEAD /js/fader. js HTTP/I. 1″ 304 ー”htセP://い料 . itn. CO. uk/" ” ozi lla/4.0 ( compa 土 MSIE 5. の MSNIA; Windows 9 DigExt ) ” nomatch: 192 .168 . 1 . 20 [ 25 / ay / 2001 : 圓 : 04 : 32 十 0100 ] "GET / Bri セ a 土 n / br 土 t200 圓 120 / 012013. h セ m HTTP/I . 0″ 302 234 ” h セセ p ://random.yahOO.com/bin/ryl" nwebcollage/l. 61 ” List Mic 「 osoft lnternet ExpIo 「 e 「からのリクエストを見分ける ( logl . pl) # ユーザ工ージェントが # MSIE(Microsoft lnternet 取 0 て er ) かどうか判断するスクリプト use StriCt ー use HTTPD : : も og : : Fi に e て一 # ログファイル名 # ( H PD : : も og : : F 土比 er にサンプルが付属しているのでそのファイル名を指定 ) # ここでフィルタリング while ()y $line = く FILE>) { open(FILE, $logfile) or die ”引″・ # ログファイルの処理 agent—re = > ' . *MSIE.* ー # ユーザ工ージェントを指定 format => ー ELF # フォーマットを指定 ( CL ELF, XLF, my $fi lter = HTTPD: :Log: :Filter->new( # フィルタの作成 access 」 og—e げ my $logfile = close(FILE); p て土 n し "lnvalid log format at line $.%nn # フォーマットがおかしい場合 } 引 se { , 引土 n print "nomatch : # マッチしなかった場合 } elsif (defined($result) ) { print "MATCHED: , 引土 n # マッチした場合 if ($result) { my $result = $filter->filter($line); nomatch: 192 .168 . 1 . 20 [ 25 / May / 2001 : 00 : 04 : 32 十 0100 ] "GET / Br 土セ a 土 n / br 土 t20000120 / 012013. h セ m HTTP/I . 0” 302 234 "http://random.yah00.com/bin/ryl" nwebcollage/l. 44 ″ nomatch: 192.168.1.20 [ 25 / ay / 2001 : 00 : 04 : 32 十 0100 ] "GET / Brita 土 n / br 土し 20000120 / 012013. htm HTTP/I . 0” 302 234 "http : //random.yah00.com/bin/ry に nzyborg 80 C MAGAZINE 2001 12
C 卲 P 卲叭ッケージの活用 002 #<input type="hidden" て初期インストール時点に戻ります。 name="dbactn va Iue="REGIST"> 必要な場合は , 別のティレクトリに保 く input type=nsubmit" 存するなどの作業を行ってください。 name=nsubmit" value=" 登録する” > ファイルなどからデータを取り込みペー く input type= reset ジ上に表示させる場合も同様に行います。 name="resetn value=" リセット” > つまり , アンケートの入力画面から たとえば , List 9 のようにします。 cl ose ( OUTPUT 新すボタンをクリックすると , TESTPAG といったふうに記述します。ファイルのア WEBMAKER は , ユーザ定義関数の戻り E 画面へ行くように指示し , TESTPAGEVX クセス権などを適時設定してください。ま 値にセットされた値を body タグの出力とし ージプロックではタイトルなどを指定した た , HtmlE 仼 or にはほかにもいくつかの Web て扱います。したがって , WebA0 ージに何 後 , ユーザ定義関数を使うことをパーサに 出力ルーチンが実装されています。詳細は かを表示させたい場合は , 一連のファイル 知らせます。そして , 上のように Sample man ページを参照してください。 WebMake からのデータなどをスカラー値 ( この場合 gic. pm での関数内でハッシュの表示ルーチ r. con ト sample を書き換えた後は , パーサを は $ body ) に累積させていきます。 ンを記述します。 起動して変更をシステムに反映させるよう もう 1 つ例をあげておきましよう。ファ testhtml_hash 関数は , ページにどのよう にしなければなりません。 イルに格納されたデータが「コンマ ( , ) 」で区 なパラメータが受け渡されるかの確認に利 切られていて , それを HTML のテープルに $ perl WebMaker-samp 厄 . pl 用できます。この関数が記述された後のロ 表示したい場合は List10 のようにします。 webmaker parser started. ジックはすべて無視されるので , ユーザ定 こでの入出力が理解できれば , どんな sample. cgi already exists. 義関数のどの部分ででも利用でき , その時 データでも表示 / ファイルへの更新などが Sample already exists. 点でのさまざまは変数をベージに表示させ 可能になります。ね ble タグの代わりに selec Sample/Samp leHtml.pma lreadyexists. ることができます。 t などを利用するのも同じです。データベー Samp le/Samp leLogic. pma lreadyexists. Fig. 11 を見ればわかるように スへのアクセスも基本的には変わるところ func T no database app lication. はありません。ただデータベースの場合は , ESTPAGE_BODY にはアンケートからの入 samp le/samp leHtmlItems. pm created. 力がすべてハッシュの各値として渡されま 注意 : パッケージの demo ティレクトリに データの取得などに若干微妙なテクニック 付属の「 clean-sample.sh 」を走らせる す。これらの値をファイルに落としたけれ が要請されます。そこで , 次節以降でデー ば , タベースの場合を解説します。 と , これらの変更はすべてクリアされ ' data. txt my $filename open(OUTPUT, ">>$fil ename") Ⅱ $ERROR ->testhtm l—sca lar( ' output e てて 0 て ' foreach pa て ) { print 0 p ー : $pa て { $-) スソフト (databasesoft) を指定すると , パ ーサは初期起動時に ProjectDBLogic. pm と いうファイルを作成します。このファイル はデータベースアクセスを受け持つサプル ーチンを記述するためのパッケージファイ ルです 同時に , このファイルが追加されるのは , 単にデータベースにアクセスする「ユーザ 定義関数」をわかりやすくまとめて記述す るためだけではなく , WEBMAKER オプジ ェクトの継承関係を新しく生成することも までと同じです。違いはデータベースハン 意味しています。 データベースアクセス WEBMAKER のクラス継承図 (Fig. 10 ) を ドルを取得しなければならない点だけでし C 引の作成 再度見てください。 ProjectDBIngic は Html よう。 蚋 BMAKER でデータベースアクセスを WEBMAKER パーサへ指定する際に , デ DBApp を親とするパッケージです。この Ht 伴った CGI を作成するのも , 基本的には今 mlDBApp はデータベースハンドルを取得 ータベース名 (databasename) とデータベー 特集 2 地域通貨決済システム作成にみる CG レ per いッケージの活用 43 P A R T ァータベースアクセス ここでは , WEBMAKER バッケージを使ったデー タベースアクセスの方法について紹介します。 0
です。 DHTML のサンプル CGI のほうではこ す。たとえば , サンプルの [ LOGIN ] ページ ーサが生成する SampleHtmlItems. pm 内の の機能は利用せず , LOGIN ページからいく 「 --itemselection 」がそれです (List 7 ) 。 では , form タグを使って List6 のように この「 --itemselection 」を見れば全体がほ つかのページへのメニュー分岐を行ってい name="dbactn va lue="LOGINOK" という指示を与えることでボタンクリック ます。しかし , Wmds のようなシステムで ばどういう構造になっているかがわかると によって移動する次のページを指定します。 は明確なログインと認証が要求されるため , 思います。ページプロック名はそれぞれ特 予約済みの機能として実装しています。 この構文は汎用的なもので , あらゆる場面 定の関数と関連付けられています。「 __get_ LOGIN TITLE ( ) 」はいうまでもなく , web WEBMAKER はこれらページプロック名 で利用します。 WEBMAKER パーサはこの メニュー分岐を自動的に 1 つのサプルーチ Maker. conf-sample 内の「 tle = 」という設定 で WEB 上の HTML 出力をコントロールしま ンとして実装します。サンプルの場合 , パ の反映です。以下同様に , パーサが解析す す。メニューの分岐もこの名称を利用しま サンプルの設定ファイル WebMake 「 . conf - samp の冒頭部分 TabIe 3 現在組み込み可能な WebMake 「 . conf の指令 内容 指令 Title= 各ページのタイトル Menuposition= メ二ューの位置 , top, bottom, 「 ight, left Subtitle= 各ページの下部のタイトル JavaScript の指定関数名 onLoad= Backg 「 ound= 背景に使うイメージファイル Bgcolor= 背景色 CSS= CSS の組み込み Layer= レイヤの組み込み メニュー表示の on / off JavaScript= JavaScript Body= 以下の部分の記述 TabIe 4 システムが予約するプロックの内容 ページプロック名 内容 特定のページではなく , CGI システム全体にわたって共通 GLOBAL する項目を定義する CGI システムが最初にアクセスされたときに表示するべー LOGIN ジを定義する LOGINOK の次にアクセスするべージを定義する LOGINOK 特定のページではなく , どのページにでも表示可能なメ HEADMENU 二ュー・ボタンなどを定義する 」 temselection サブルーチンによるメニュー分岐 5 [LOGINOKI T 土凵 e = アンケート回答ページ Menu=off Bgc010r=Iightblue onLoad=setPhase ( ) JavaScript=<<"EOF" く SCRIPT Language="JavaScript"> く /SCR 、 IPT> EOF BOdy = くく″ EOF ”・ <DIV ID= myText" STYLE="position:absoIute;Ieft:0px;top:Opx; width:200;height:5;background: lightblue; fiIter:wave(add=0,freq=1,lightstrength=50,phase=0,strength=1)" く fon セ 00 ー 0 て = て ed>W AK SAMPLE CGI</font> </div> く h3 > アンケートにお答えください。 </h3> く fo て m method="$method" action="$action"> <center> <tab le> く c 引 0 て = ye Ⅱ ow > く > 質問欄く / th > く t 回答入力欄く / th>< / tr> <td align=right wid に = 勹 0 > あなたの年齢く / td> くセ d width="70%"><input type="text" name="agen 8 土 ze = ” 10 ″ > く / td> EOF WebMaker. conf-sample の CLOGIN] ページのメニュー分岐処理 ( 抜粋 ) 6 [GLOBAL] Title=WEBMAKER 、 Sample CGI System SubtitIe=WEBMAKER 、 sample CGI system without DATABASE .. 中略 [I.mINl Title = アンケート・システム .. 中略 ヨ BOdy = くく” EOF ” これは、 w 駅で作成したサンプル「アンケート・システム」です。 下のボタンをクリックすると、アンケート画面にうつることができます。 <center> く fo て m method=$method action=$action> <input type="hiddenn value="l.mINOK"> <input type="submit" name=nsubmit" value=" アンケートに答える く / fo て m > </center> EOF .. 中略 凵 e = アンケート回答ページ Menu=off Body = くく” OF ” ヨ アンケートにお答えください。く /h3> .. 中略 7 sub —itemse lection { 叫 ( 明 ) = 釭 叫 ( $dbact ) = $ て明 { d c セ my ( $pagetitle, $javascript, $body, $ 0 引 0 て , $onload, $e てて 0 ら $css, $layer, $security if ( $dbact 冖 ) ( $pagetitle = —get- 工 $ c 引 0 て = —get- 工 $onload = —get—I-mIN—ONLOAD( ); $javascript = —get- 工 $body = —get- 工 cmN—BODY( } elsif ( eq 'IÆINOK' ) { $pagetitle = —get- 工 $ c 引 0 て = —get- 工 (EINOK—BGCOLOR( $onload = —get—IA31NOK—ONLOAD( ); —get—IÆINOK—JAVASCRIPT( ); $javascript $b0dY = } elsif ( eq ) { .. 以下略 を OF 40 C MAGAZINE 2 1 12
成していません。これらはすべて , perl の スタンダードに準拠して作成されています。 サーバ上での利用と Windows 版 ActivePerl( こついて レンタルサーバを利用している場合 , roo t 権限がなく Perl パッケージをインストール できないことがあります。この場合には , 利用する CGI が置かれているディレクトリ 下に WEBMAKER ディレクトリを作って そのままコピーすればいいだけです。起動 する CGI スクリプトを「 sample. cgi 」とする と , ディレクトリは以下のような構成にな HtmITemplate. pm HtmIItemsMaker. pm HtmIError. pm HtmIDBApp. pm HtmlApp. pm HtmI.pm WEBMAKER sample. cgi ります。 を利用したパッケージインストール ( ppm ユ すればいいだけです。 ActivePerl には XML wmdows 環境下でも , 基本的には同様に 置くことになります。 ィレクトリを作ってパッケージファイルを 置くディレクトリ下に WEBMAKER サプデ で , 実際には生成された CGI スクリプトを ンになる CGI スクリプトを自動生成するの 後述しますが , WEBMAKER はこのメイ 002 ーティリティ ) がありますが , 現状ではこ ているし , この処理に対応していない正当 うアナウンスが MySQL の開発元から行われ トランザクション処理に近々対応するとい ン処理に対応していない点です。しかし , の大きな違いは , MySQL がトランザクショ この 2 つのデータベースソフトでいちばん です。 L に対応しているのはこういった事情から タベースソフトとして PostgreSQL と MySQ っこ」ですが , WEBMAKER が現在 , デー 問題になってきます。ほとんど「いたちこ ると今度は MySQL と PostgreSQL の違いが 単に利用できる MySQL を使っています。す 必然性がないので , Windows 環境下では簡 ません ) 。筆者は今のところそこまでする ルしてソースをコンパイルしなければなり ささかめんどうです (Cygwin をインストー ws で PostgreSQL をインストールするのはい は PostgreSQL に対応していますが , Windo ースを利用するケースです。データベース ただ , この場合問題になるのはデータベ うしています。 ピーすれば利用できます。実際 , 筆者はそ b に WEBMAKER ディレクトリをそのままコ インストールされたディレクトリ内の site/li MAKER を利用する方は , 単に ActivePerl が な場合に限られています。 Windows で WEB ことがありますが , これはあくまで補助的 ときどき Windows 下でもソースを修正する を作成していません。前述のように筆者は のユーティリティに対応する XML ファイル P A R T WEBMAKER の設定と定義 ここでは WEBMAKE 日バッケージに付属のサンプルを もとに , WEBMAKER の基本的な使い方を紹介します。 0 CGI/ 可バッケージの活用 この中の setup-sample. sh がサンプルのセ とおりです。 mo ティレクトリにあるファイルは Fig. 4 の らこのサンプルを動かしてみましよう。 de 収められています。インストールができた のうち , demo ティレクトリにはサンプルが WEBMAKER パッケージの構成ファイル サンプルの実行 ルや解説文などを参照してください。 知識については各ソフトウェアのマニュア からというわけにはいかないので , 必要な を通じて解説を加えるつもりですが , 基本 構文については必要に応じて perl での実装 末ツール ) の利用法などは述べません。 SQL のインストール , psql (PostgreSQL 用の端 が中心です。 Apache の設定や PostgreSQL 解説にあたっては , Perl と WEBMAKER テータベース : PostgreSQL 7.0.3 Perl : Ver. 5.005 03 HTTP : Apache 1 .3.12 OS : Turbolinux 6.0 workstation す。 以下の解説は , この環境を前提にしていま のローカル PC の環境を列挙しておきます。 なければなりません。参考のために , 筆者 ローカルな環境にサーバと同じ環境を作ら す。 CGI の開発にあたっては , 一般的には 次節から , 具体的な解説に入っていきま 解説にあたって っていきたいと考えています。 との組み合わせについては , 今後充実を図 ういった多様な環境とデータベースソフト のようなことに注意を払ってください。 しかし , いずれにしろ Windows 下では上 ではないでしよう。 れています。これは必ずしも MySQL の弱点 な理由も MySQL 開発メンバから明らかにさ 特集 2 地域通貨決済システム作成にみる CG レ Pe 市ヾッケージの活用 35
はプロダクションの定義箇所と参照箇所の de 関数に渡すパラメータ設定はユーザの A N. 1 To 引の特徴 間が自動的にリンクされます。 InternetEx ほうで作成する必要があり , その部分につ いて必ずプログラミングを行うことになり plorer などのプラウザを使用して抽象構文 主な特徴は次のようになっています。 を閲覧できます。 ます。また設定データ変更にもプログラム の修正が必要になり , 非常に手間がかかっ Encode/Decode 関数生成 工ンコードタイプ てしまいます。 抽象構文から転送構文に変換する Encod 次の 3 つに対応しています。 そこで登載されている試験サンプル生成 e 関数とその逆の Decode 関数は , ANSI CÄ ・ BER(Basic Encoding Rules) 機能では , Encode/Decode した結果をパ 語に準拠したソースコードとして自動生成 ・ PER Aligned(Packed Encoding Rules) ソコン上で確認するために , パラメータ設 できます。 ・ PER Unaligned(Packed Encoding Rules) 定部分を main 関数として自動生成すると これらの関数はユーザ作成プログラムよ ともに抽象構文への設定データを CSV 形式 対応処理系 り呼び出され , ツールに含まれる基本ライ ファイル , 転送構文の設定データをテキス プラリ関数群と合わせて実行可能ファイル ト形式ファイルとして扱う環境を自動生成 ASN. 1 T001 から生成される C ソースコー を構築できます (Fig. 4 ) 。 することができます。 ドは処理系に依存しません。すなわち , ビ これらは VisuaIC + + などの各種コンパイ ッグエンティアン / リトルエンディアンの 試験サンプル生成 ラを使用してパソコン上で実行可能ファイ どちらのターゲットにも適用が可能です。 ASN. 1 を使用していると「この抽象構文に ルを作成することができ , 作成した内容の ライセンス この値を設定するとどんな転送構文ができ 動作を実際に動かして確認できます。 Enc るのか ? ( またその逆のケースも ) 」など Enc ode のケースでは CSV 形式ファイルに必要 自動生成される C ソースコードとツール ode / Decode 結果を確認したいケースが多 に付属するライプラリ関数群 ( ソースコー なデータを設定し , Decode のケースでは 転送構文を作成します (Fig. 5 ) 。 ド ) はライセンスフリーで使用できます。 々あると思います。しかし , Encode/Deco サンプル抽象構文 Encode/Decode 関数プロトタイプ 実行環境と生成されたソースコード ASN1—INT32 le—Test-PDUProduction ( -Sample ASN. 1 for C MAGAZINE Sample—Test_PDU_INOUT *pInoutBuff, void **ppEncodeBuff, ASN1—INT32 *pEncodeBitPos , ASN1—INT32 *pOutBuffSize); ASN1—INT32 DecodeSampl e_Test_PDUProduction ( Sample—Test—PDU_INOUT *pInoutBuff, void **ppEncodeBuf f , ASN1—INT32 *pEncodeBitPos , ASN1—INT32 (Ä)utBuf fSize , void **pPAlIocBuff, ASN1—INT32 *pAllocBufSize); List List Samp 尾 DEFINITIONS AUTOMATIC TAGS : BEGIN = SEQUENCE { Test-PDU : INTEGER ( 0..255 ) , no Group , group VisibleString (SIZE ( 1..16 ) ) , data Data Group Data ・ = ENUMERATED { = CHOICE { BIT STRING (SIZE ( 0..31 ) ) , bit—format OCT STRING ( SI ZE ( 0..3 ) ) octet—format Fig. 7 試験データ設定 CSV 形式ファイル カイルのま集 ( 印表〒入書式 0 、ルデ→ 0 つインヘルプ⑧ ツロンプト OATA$ M ロ 030 E み : ー input 03V マ 3 : $ CSV—DATA$ Fig. 6 試験サンプル生成設定 Ⅲ川ん川 E ⅸ / 。新呷 lHTMtlU 月ル : D 、市 0 ィ呻 H フル : [ 、新 mp ) Sa 物 定義名称、 est-POU 0 日 E 。第 ER ( 用 ) 「 PER 化ー ) M 日 k 当 : : - 三こ、烹 3 NurnEær/LerValue 'TY Omitted SEOIJEWE INT EGER CENUM VIS ト STR ℃ HO に E BIT—ST R COT—STR 2 H 1234 Comrrent Test—PDU 255 く 0.255 〉 3 >. c. 引 100 MAGAZINE く 1」6> : く 0.31 > く 03 > gro up ー fo 「 n 沼 t 0C2 ト fO 「沼 t exist Fig. 9 Encode 結果の転送構文 FF E4 43 20 4D 41 47 41 5A 49 4E 45 CO 1 2 34 文字列呶 1 イ 6 12 C MAGAZINE 2001