このページではJavaScriptを使用しています。

9-4.CGIインタフェースとユーティリティ

9-4-1.PrologによるCGIの利用方法

(1)apache のインストールとデモプログラム、環境の設定
ソース prologcgi.pl

最終的にサーバーでプログラムを公開するにしても、デバック・開発用にクライアントマシンにもアパッチのインストールをしておいたほうが便利です。アパッチは次のURLから任意のダウンロードサイトへリンクしており入手できます。設定は難しくありませんが、必要に応じて関連書籍などをお読みください。
入手サイト:http://www.apache.jp/


PrologによるCGIのデモは、AZ-Prologのインストールディレクトリ下「sample¥cgi_demo」に入っています。
デモをごらんになるには、次の手順をおとり下さい。


AZ-PrologのインストールDIR¥sample¥cgi_demo¥cgi-bin の全ファイルを アパッチインストールDIR¥cgi-binへコピー
AZ-PrologのインストールDIR¥sample¥cgi_demo¥htdocs の全ファイル、DIRを アパッチインストールDIR¥htdocsへコピー
ODBCのデモには、あらかじめ設定が必要です。
AZ-PrologのインストールDIR¥system¥odbc¥odbctest.pl に書かれている方法と名前でODBCのDNSを設定し、同じファイルをインタプリタに読み込んで、MDBを生成しておいてください。
日本語形態素解析器:MeCab および日本語係り受け解析器:CaboChaのデモのためには、これらのインストールが必要です。9-5.Mecab/Cabochaを参照してください。
※2010年3月現在、この機能は32ビット版に限られます。
上記が終了しましたら、ブラウザを開き、アドレス欄に次の入力でデモを開始することができます。
http://localhost/az_index.html

9-4-2.PrologによるCGIの書き方


(1)ソースコードの一行目にCGI用Prologインタプリタを記述します。

例:

#! prologcgi
#! C:¥AZ-V5¥bin¥prologcgi (フルパスで指定の場合)

prologcgi.exe
言語処理パッケージを含まないCGI用インタプリタ


(2)起動直後に呼び出されるトップレベルの述語(top_call/0)をソースコードに必ず記述します。
 top_call:- 処理.

(3)出力文は、HTMLの構文規則に沿った内容で記述。
文字コードの出力の最初に、文字コード宣言(content-Type、charsetの構文)を出力します。(上記参照)
HTML文の詳細はHTMLに関する説明書などをお調べください。ソース表示した場合などの見やすさを考慮し、ブラウザでの改行表示は <br> だけで十分ですが、「nl」を補っておくといいでしょう。

(4)バイトコードへコンパイルしたPrologオブジェクトをソースコードに含めることも可能。
CGI記述ソースコードをバイトコードCGIへ変換するには、AZ-Prologコンパイラを使い、容易に変換できます。
バイトコードコンパイルしたアプリケーションはインタプリタコードに比べ4倍程度、実行スピードが上がります。
例:
C:¥>azpc -p xxxx.cgi /byte
  「xxxx.b」が生成されます。「xxxxB.cgi」などにrenameしたほうがお行儀がよろしいでしょう

(5)フルコンパイルしたコードをWEBアプリケーションとするには
AZ-Prologのインストールディレクトリ下、system¥plにあるprologcgi.pl、utility.plを同時にコンパイルリンクします。コンパイルオプションに、「/no」と「/dcurses」を指定してください。
必要に応じ、鬼車パッケージ、めかぶ、かぼちゃパッケージ、ODBCパッケージなどもリンクします。
public宣言、extern宣言、mode宣言などはコンパイラの説明をお読みいただき、適切にお付けください。
フルコンパイルしたアプリケーションは10倍程度実行スピードが上がります。

(6)CGI用拡張組込述語
get_param/2 CGI呼び出しの際の引数を取得。指定タグが引数にないときは失敗。

?-get_param(+タグ名,-値 ).
タグ名は呼び出し元のCGI、HTMLでsubmitされたformのinputタグ内のnameに設定された値です。

ファイルを送信した場合、該当タグの値として {ファイル名、受信データタイプ、ファイル内容}がユニファイされます。
下記では、タグ名:user_file 値:{選択されたファイル名,Type,ファイル内容}
‹form enctype='multipart/Form-data' action='xxxx.cgi' method='POST'›
    ‹input type='file' name='user_file' ›
‹input type='submit' value='UpLoad'›
‹/form›
html_call/1 リストを引数とし、リストの各要素をwriteします。要素が文字列リストの場合は全要素をput。また、要素が call(述語)の場合のみ、Prolog述語呼び出しを行います。
html_tmplate(テンプレートファイル名) tmp_name/2をassert後に呼び出す
html_tmplate
(テンプレートファイル名,データファイル名アトム)
定義ファイルを指定して呼び出す
html_tmplate
(テンプレートファイル名,
[変数名1=値1,変数名2=値2.....])
変数と値の組を渡して呼び出す

<テンプレートの利用>
画面構成部分とデータ部分を切り離し、同一の画面イメージ(テンプレート)で複数のページを容易に生成することが可能となります。
【テンプレートファイル】
HTMLファイルを用意し、データ部分(文字列、写真ファイル名など)を変数書式に置き換えます。この変数部分は、変数と値の対応を定義することにより、上記述語で呼び出される際、自動的に置き換えられます。
書式:<TMPL_VAR NAME=変数名>
特定の変数が値充足されたときのみ生かしたい行があるときは、条件文で囲うことで切り分けができます。
書式:<TMPL_IF NAME=変数名> ...生かしたいHTML文... </TMPL_IF>

【変数と対応値の定義】
単位節: tmp_name(変数名, 値).  
を静的・動的に定義するか、あらかじめ定義されているファイルから読込みます。
または、変数名と、キーと変数名、値の組をデータベースに登録しておき、次のような節を定義します。

tmp_name(VarName,Value):-
get_key(ID),select_each([Value],tmp_get,[ID,VarName]),!.
set_exit_timer/1 引数はミリセコンドをあらわす整数でこの時間が経過したときにPrologプロセスが強制終了されます。利用はCGIに限りませんが、バグや誤入力でプロセスが終了せずサーバー負荷が高まるのを防ぎます。

| ?-set_exit_timer(+整数).

(7)CGI利用時にシステムによって生成されるインタプリタコード
param_assoc_list/1 CGI呼び出しの際の全引数をタグと値の組のリストが保存されます。
チェックリストのように、値が異なる複数の同一タグ一覧を処理するときに利用できます。
| ?-param_assoc_list(-リスト).
リスト=[タグ1、値1、タグ2、値2、タグ3、値4 ......]
my_cgi_name/1 CGI読み込み時のファイル名がこの単位節で保存されます。
| ?-my_cgi_name(?アトム).

(8)CGICGI用PrologインタプリタのDOS窓での動作確認方法。
タグ付き引数の渡し方は次のようにします。
 c:¥>prologcgi queens.cgi?”num=8&disp=true”