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

11.機能拡張パッケージ(2)

11-1.CGIインタフェースとユーティリティ

<PrologによるCGIの利用方法>

ソース:prologcgi.pl

apache のインストールとデモプログラム、環境の設定
最終的にサーバーでプログラムを公開するにしても、デバック・開発用にクライアントマシンにもアパッチのインストールをしておいたほうが便利です。アパッチは次の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を
生成しておいてください。
※2010年3月現在、この機能は32ビット版に限られます。
日本語形態素解析器:MeCab および日本語係り受け解析器:CaboChaのデモのためには、これらのインストールが必要です。Chapter 16を参照してください。
※2010年3月現在、この機能は32ビット版に限られます。
上記が終了しましたら、ブラウザを開き、アドレス欄に次の入力でデモを開始することができます。

http://localhost/az_index.html
<PrologによるCGIの書き方>

(1)ソースコードの一行目にCGI用Prologインタプリタを記述します。
例:
#! prologcgi
#! C:\AZ-V5\bin\prologcgi (フルパスで指定の場合)
Prologcgi.exe
言語処理パッケージを含まないCGI用インタプリタ
Prologcgi_l.exe
めかぶ、かぼちゃをリンクした言語処理パッケージ
(2010年現在、32ビット版のみ)
64bitパッケージには Prologcgi_l32.exeの名前で同梱しています



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



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



(4)バイトコードへコンパイルしたPrologオブジェクトをソースコードに含めることも可能。
CGI記述ソースコードをバイトコードCGIへ変換するには、AZ-Prologコンパイラを使い、容易に変換できます。
バイトコードコンパイルしたアプリケーションはインタプリタコードに比べ4倍程度、実行スピードが上がります。

例:
>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,ファイル内容}
 
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”