AZ-Prolog ユーザーズマニュアル

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

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

##### ＜PrologによるCGIの利用方法＞

ソース：prologcgi.pl

apache のインストールとデモプログラム、環境の設定
最終的にサーバーでプログラムを公開するにしても、デバック・開発用にクライアントマシンにもアパッチのインストールをしておいたほうが便利です。アパッチは次のＵＲＬから任意のダウンロードサイトへリンクしており入手できます。
設定は難しくありませんが、必要に応じて関連書籍などをお読みください。
入手サイト：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 に書かれている方法と名前でＯＤＢＣのＤＮＳを設定し、同じファイルをインタプリタに読み込んで、ＭＤＢを 生成しておいてください。 ※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コンパイラを使い、容易に変換できます。
バイトコードコンパイルしたアプリケーションはインタプリタコードに比べ４倍程度、実行スピードが上がります。
例:
>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，ＨＴＭＬで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”
▲