<<Mind Ver.7 ドキュメント>>
−−−−−−−−−−−−
CGIライブラリ(cgilib)
−−−−−−−−−−−−
※ Copyright (C) 1995 Rigy Corporation ※
※ Copyright (C) 2000 Scripts Lab. Inc. ※
※ 改訂記録 ※
※ 1997.11.20 新規作成(片桐)
※ 1998.01.10 Windows版対応
※ 2000.11.06 Ver.7.2対応
※ 2004.05.09 Ver.7.5対応
※ 2017.03.08 Ver.8 暫定マニュアル利用のため一部訂正
※ 改訂終り ※
本マニュアルは旧 Mind Version 7 向けのプレーンテキストの
マニュアルを一部訂正したもので暫定マニュアルとしてお使い
ください。
旧版特有の記述が一部残っていますが、正式マニュアル提供ま
での一時的なこととしてご容赦願います。
__________
1. オペレーション
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
CGIのオペレーションマニュアルとしてHTML版の第7章をお読みください。
__________
2. プログラミング
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
2−0 CGIが動く時の環境
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
これはMindとは直接は関係ないことですが少し述べておきます。
CGIが起動された時、環境変数の設定などは必要最低限になっています。すなわち、
Mindを開発していた時に存在していた環境変数 MIND あるいは MLIBPATH はCGI起動時
には存在しません。さらには PATH 環境変数が mind7\bin\ を指していることもあり
ません。
しかし、これでもMindで作成したCGIを動かすのに支障はありません。Mindコンパイ
ラを使う時には若干の環境を必要としますが、アプリケーション(CGI)を走らせるに
は、mind.cgi(Mindランタイム)と、そのアプリケーションのMコードファイル(*.mco)
があれば十分です。この二つのファイルを、htmlファイルが置かれているのと同じデ
ィレクトリか、あるいは /cgi-bin/ に(WWWサーバの設定によりますが)置いておけ
ば起動できます。
2−1 CGIと標準入出力
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
CGIプログラムが起動された時、Webサーバから渡されるデータは(環境変数は別と
して)標準入力から読み出し、Webサーバに返すデータは(廻り廻ってWebブラウザに
届くHTMLデータです)標準出力に書き込めばよいようになっています。
・−−−−−−Webサーバ環境−−−−−−−−−・
| |
・−Webブラウザ-・ | ・−HTTPD−・ ・−−CGI−−・ |
|Netscape | | |IIS, Apache | | (Mind) | |
| Navigatorや | −→ | など | → |標準入力 | |
|Internet | ←− | | ← |標準出力 | |
| Explorerなど| | | | | | |
・−−−−−−−・ | ・−−−−−−−・ ・−−−−−−−・ |
| |
・−−−−−−−−−−−−−−−−−−−−−−−・
Mindでは、標準入力から(キーボード入力でなく)データを受け取るケースはあま
り無かったかも知れませんが、標準出力へのデータ送出については「○○を 表示」
で良いわけで、おなじみのものです。
上の図では入力も出力も同じ分量であるかのように書かれていますが、実際のCGI
では、圧倒的に(CGIにとって)出力が多くなります。ひんぱんに出力するデータが
単なる「表示」で済むというのはとても好都合なことです。
2−2 エラー処理
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
CGIは、たとえば fileモジュールにリンクするような一般的なアプリケーションに
比べると利用場面がかなり限定されており、走行環境としても特殊です。
CGIを簡単に記述できるようにという理由から、本ライブラリはこれをリンクしてい
るアプリケーションに対していくつかの介入をおこなっています。その大きな部分が
エラー処理です。
【エラー出力】
「エラー出力」「一行エラー出力」「エラー表示」といった、エラー出力デバイス
に出力をおこなう処理単語を実行した時、普通であれば標準エラー出力ハンドルであ
る2番に出力が行われるのですが、CGIライブラリにリンクしたアプリケーションにお
いては、標準出力(1番)に出力されます。(メインが走行する直前に「エラー出力
を標準出力に切り換え」が実行されています←cgilib.src参照)
この介入の理由は、エラーの様子をWebブラウザ上で確認できるようにするためで
す。たとえば、
「スタックがずれています」
というメッセージをブラウザ上で確認できるようにです。
2番(標準エラー出力)への出力は、Webサーバの種類あるいは設定によってはブラウ
ザには送られないで消滅するものや、サーバのログファイルに書き込まれるタイプ
などがあるようです。これに対処するため、本ライブラリではあえて標準出力に送る
ようにしています。
本来の出力先にしたい場合には、「エラー出力を本来の出力に切り換え」を実行し
てください。もちろん、「エラー出力を標準出力に切り換え」と合わせて頻繁に切り
換えることも可能です。
【重大エラー】
重大エラー発生時に何がおこなわれるかについては、既に console.docm にて解説
しました。しかし CGIライブラリをリンクしている状態では少し違う処理が行われま
す。以下の通りです。
(1) mimeヘッダ,HTMLヘッダが未送出なら強制的に送出(head/title/body)
(2)
を表示
(3) プログラム名 : エラー原因 を表示
(4)
を表示
(5) HTMLフッタを出力(/body,/html)
(6) 1を終了パラメータに入れて実行終り
上記のように、重大エラーの原因をHTML形式で出力します。何が起こったのかをWeb
ブラウザ上で認識できるようにするためです。
---------------------------------------------------------------
このような工夫をしてはいるものの、場合によってはWebブラウザに何
も表示されないままプロセス終了してしまう可能性もあります。デバッ
クは一般的なアプリケーションよりも慎重におこなう必要があります。
---------------------------------------------------------------
2−3 文字コード
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
Windows版のMindのCGIライブラリを使って普通にCGIを記述した場合、ShiftJIS
コードが出力されます。Linux版ではEUC-JPコードが出力されます。
(1) ブラウザに文字コードを知らせるため、本ライブラリを使
HTMLデータの出力では、一番最初のMIMEヘッダのところに、
「Content-type: text/html; charset=shift_jis」または
「Content-type: text/html; charset=euc-jp」
のようなcharset指定が入ります。
文字コードに限りませんが、このようなデフォルトでの動き
は、cgilib\cgilib.src の中の次の箇所に記載されています。
---------------------------------------------------------------
CGILIB初期化0とは 本定義
エラー出力を標準出力に切り替え
BASE64テーブル初期化0し
html4.0をDOCTYPEデータ設定し
sjisをcharset設定し ←文字コードはここ
ヘッダ内平仮名を初期設定し
。
---------------------------------------------------------------
もし、このcharset指定がまずいようでしたら、上記
箇所を抑止してください。(そうやって抑止しておき、同じ
記述を「メイン」の中で−−「htmlヘッダを出力」の前
ぐらいに−−書いても構いません)
(2) うっかりして出力データの中に複数の日本語文字コードを混
在させないように気をつけてください。当然のことですが、
ブラウザの日本語コード判定が混乱してしまいます。たった
1文字が混ざるだけでそうなります。
特に、全角空白のコード違いには注意します。(エディタで
見たぐらいでは分からないことが多い)
(3) 多数の人が読むページでは、必ず Netscape Navigator と
Internet Explorer の両方を使って表示確認をおこなってく
ださい。
2−4 ヘッダ/フッタ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
■htmlヘッダ出力
Mindで書くCGIプログラムで唯一必須の処理単語です。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
<タイトル文字列>で htmlヘッダ出力 → ・
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
のように用います。
「1−4 CGIサンプルの実行」の最初に「もっとも小さなCGIプログラム」を示し
ましたが、ソースコードは次のようになっていました。
-----------------------------------------------------------------
メインとは
「TEST」で htmlヘッダ出力し
「こんにちは」を 大きく表示すること。
-----------------------------------------------------------------
上記の「htmlヘッダ出力」が要点です。この処理単語はその名前とは裏はらに
複数の処理の集合になっています。下にまとめます。
-----------------------------------------------------------------
1 (未処理なら)標準CGI変数の取り込み
1-1 標準CGI変数を取り込み
1-2 フォーム中の名前と値を取り込み
1-3 Cookie変数を取り込み
1-4 QUERY_STRINGを起動引数に移動
2 (未出力なら)MIMEヘッダを出力
→「Content-type: text/html; charset=shift_jis」
=======次からが本来のHTMLヘッダ=====
3 (指定が有れば)DOCTYPEを出力
4 (指定が有れば)METAデータを出力
5 (指定が有れば)Set-Cookieデータを出力
6 HTMLタグを出力
7 HEADタグとTITLEタグを出力
8 BODYタグを出力(抑止可能)
-----------------------------------------------------------------
出力のみに注目した場合、普通は次のようになります。
-----------------------------------------------------------------
Content-type: text/html; charset=shift_jis
XXXXX
↑ここにはタイトルが入ります
-----------------------------------------------------------------
「htmlヘッダ出力」と書いただけで、上記のようなデータが一気に出力されま
す。ほとんどのHTMLドキュメントはこれで間に合うはずです。
(注:静的なHTMLデータでは「Content-type: text/h〜」および
その次の空行は無かったはずです。この場面に限らず、CGI
出力ではこのような違いが少し存在します)
■htmlフッタ出力
HTMLデータの送出機能として必須なものですが、CGIライブラリを使っている限りは
普通は明記する必要はありません。
明記するとしたら、次のような文法によります。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
htmlフッタ出力 → ・
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
出力イメージでは次のようになります。
-----------------------------------------------------------------
-----------------------------------------------------------------
本処理単語は密かに実行されるため、普通はプログラマが明記する必要はありませ
ん。正確に言えば、プログラム起動後にMind処理単語を使ってHTMLヘッダが出力され
ており、プログラムの終了時点でフッタが未出力であるなら、これを閉じるために本
処理単語が自動的に実行されます。
(注:「ヘッダを出力したのにフッタ無しのまま終わる」・・ことは
普通はあり得ないので、このような自動化が可能になります)
(注:当然ですが、MIMEヘッダやHTMLヘッダを文字列として「表示」
することで低レベルな出力をおこなっている場合にはこの自動
機能は働きません。明に本処理単語を呼んでください)
−−
以下、その他のヘッダ/フッタの出力機能についてまとめておきます。
■mimeヘッダ出力・text/html
(文法)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
mimeヘッダ出力・text/html → ・
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
(出力)
-----------------------------------------------------------------
Content-type: text/html; charset=shift_jis
←空行です
-----------------------------------------------------------------
普通は、「htmlヘッダを出力」の中から自動的に呼ばれていますが、明に呼び
出しても構いません。
内部処理として「標準CGI変数の取り込み」がおこなわれるので注意してくださ
い。抑止したいなら「標準CGI変数の取り込み抑止」というフラグをセットしてか
ら呼び出してください。
注:標準CGI変数の取り込みが行われる手順は、
(1)「htmlヘッダを出力」
(2)→「mimeヘッダを出力」
(3)→「標準CGI変数の取り込み抑止」を検査
(4)→「標準CGI変数の取り込み」
です。
■mimeヘッダ出力・text/plain
(文法)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
mimeヘッダ出力・text/plain → ・
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
(出力)
-----------------------------------------------------------------
Content-type: text/plain
←空行です
-----------------------------------------------------------------
すべてがプレーンテキストの形式のデータを送出するのに使えます。このMIMEヘッ
ダで始まる場合に限り、HTMLヘッダ/フッタは不要です。
特別な用途としては、「メイン」の最初でこれを実行しておくことで、以後のすべ
ての出力を、タグも含めて眺めることができます。つまり、
-----------------------------------------------------------------
Content-type: text/plain
Content-type: text/html; charset=shift_jis
・・以下略・・
-----------------------------------------------------------------
のようになるわけですが、この場合、3行目「Content-type: text/html〜」から先
のすべてのHTMLタグは「ありのまま」にWebブラウザの中に表示されるのでタグの様子
を確認するのに便利です。(注:このような利用は、Internet Explorer では無意味
になります。text/plain の場合にはタグ部分はすべて隠されてしまうようです)
(htmlヘッダ出力、mimeヘッダ出力共通の事項)
□標準CGI変数の取り込み
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
標準CGI変数の取り込み → ・
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
文字通りの処理です。
GATEWAY_INTERFACE=CGI/1.1
REQUEST_METHOD=GET
SCRIPT_NAME=/mind7cgisample/mind.cgi
・・以下略・・
のような標準CGI変数を取り込み、同じ名前のMindの変数(文字列実体型)に格納
します。この処理単語は、「mimeヘッダ出力・text/xxxx」の実行時に
(さらに言えば、この上位語である「htmlヘッダ出力」実行時に)自動的におこ
なわれますので、ソースコードとして明に記述するとはあまり無いはずです。(注:
Cookieの処理などで使うことになります)
「xxxxヘッダ出力・xxxx」からの自動起動を抑止したいなら、
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
標準CGI変数の取り込み抑止を セットし
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
という1行を前に置いてください。
□その他のヘッダ出力用の変数群
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
BODY出力抑止? (数値の変数)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
この変数だけが数値変数です。「BODY出力抑止?を セット」のように記述す
ることで1をセットしておくと、そのあとの「htmlヘッダ出力」などでBODYタグ
の出力が抑止されます。主にフレーム(メインのフレーム)の描画で使われます。
デフォルトはゼロです。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
METAデータ1 (文字列実体変数)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
もし何かの値が設定されていれば、HTMLヘッダの一環として、TITLEタグの前に出
力されます。デフォルトは空列です。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
METAデータ2 (文字列実体変数)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
先と同じです。デフォルトは空列です。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DOCTYPEデータ (文字列実体変数)
html2.0をDOCTYPEデータ設定 (処理単語) (・ → ・)
html3.2をDOCTYPEデータ設定 (処理単語) (・ → ・)
html4.0をDOCTYPEデータ設定 (処理単語) (・ → ・)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
を出力するのに使われます。本ライブラリではデフォルトで
と「html4.0をDOCTYPEデータ設定」が実行されています。具体的に
は が設定さ
れます。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
BODYデータ (文字列実体変数)
白背景/黒文字をBODYデータ設定 (処理単語) (・ → ・)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
変数「BODYデータ」は、デフォルトは空列です。
何か値が設定されていると、それまで だったものが、 のよ
うに出力されます。
BODYタグでは各種のパラメータを指定できます。一番多いものが、背景色と文字色
を指定するものなので、そのための専用機能として、「白背景/黒文字をBODYデ
ータ設定」という処理単語を用意しています。これは、
----------------------------------------------------------------
「BGCOLOR="#FFFFFF" TEXT="#000000"」を BODYデータに 入れる
----------------------------------------------------------------
で定義された簡単なものです。BODYタグについての詳細は他のHTMLの文献をご覧くだ
さい。
2−5 一般機能
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
■標準CGI変数の取り込み
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
標準CGI変数の取り込み → ・
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
注:「標準CGI変数の取り込み」は普通は明に記述することは
無く、「htmlヘッダを出力」の中で自動的に行われます。
すなわち、「htmlヘッダを出力」から戻って来た段階か
ら、名前/値を参照できることになります。
以下の処理が行われます。エラーリターンはありません。なお、POSTとGET
どちらでCGIが起動されても同じように処理されます。
(1)標準CGI変数を取り込み、同名の大域変数に格納
(2)フォーム中に定義された変数を取り込み「名前と値」のペアに設定
(注:
--------------------------------------------------
上記からCGI起動時のブラウザのURL:
http://localhost/path/mind.cgi?form-submit
(GET)
--------------↓注目-----------------↓注目-------
--------------------------------------------------
上記からCGI起動時のブラウザのURL:
http://localhost/path/form-submit.cgi?address=xxx&send=Send
[フォーム情報の取得]
起動されたCGIの側の処理ですが、POST/GETの区別なく、下記に示す名前と値のセッ
トが格納されるため、フォーム情報の取得に関してはプログラミングの違いはありま
せん。
[起動引数とURL上フォーム情報との関係]
GETメソッドではフォーム情報はURLに乗せて伝達されます。このURLは最終的には、
CGIから見れば起動引数として渡されるわけですが、CGIライブラリ内部の介入により
次のような処理が密かに行われています。
1 GETメソッドであれば「起動引数(1)」の中にフォーム情報のすべてが
入っていると解釈し、次に解説する「名前と値」のペアに格納すると同時
に、起動引数は無かった(ゼロ個)ことにします。
2 POSTメソッドの場合には、起動引数への介入は行われません。
(例-A)
http://localhost/path/showvars.cgi?action+200 ←通常の引数渡し
↓ブラウザ表示
〔起動引数〕 ←情報は起動引数(1)に入る
"action" "200"
〔名前と値のリスト〕
action 200= ←ここへの格納は不定
(例-B)
http://localhost/path/showvars.cgi?action=200 ←正しいGET形式
↓ブラウザ表示
〔起動引数〕 ←起動引数は無かったことになる
無し
〔名前と値のリスト〕 ←情報は"名前と値"のリストに入る
action=200
■名前と値
「標準CGI変数の取り込み」をおこなった時、フォーム中に定義された(つまり
HTML作者が定義した)変数は前記の標準CGI変数ではなく、本項で規定する構造体に格
納されます。正確には構造体なのですが便宜上、配列として説明します。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
名前と値数は 変数。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
フォーム変数を取り込んだ数が格納されています。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
名前は 64個の 文字列。
値は 64個の 文字列。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
名前と値は上記のようにペアになって格納されます。
ユーザはこの配列を個別にアクセスしても構いませんが、より簡単に参照するため
の処理単語を別に用意しています。
注:「標準CGI変数の取り込み」は普通は明に記述することは
無く、「htmlヘッダを出力」の中で自動的に行われます。
すなわち、「htmlヘッダを出力」から戻って来た段階か
ら、名前/値を参照できることになります。
■値を参照
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
<名前>で 値を参照 → [値文字列]、真偽
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
名前を指定し、その値を得ます。もし存在すればその値と「真」が、無ければ
単に一つの「偽」がスタックに返されます。(偽の場合には文字列は存在しない
こと・・つまり場合によって戻り数が変化すること・・に注意)
(例)
"address"で 値を参照し 真? ←普通はこのように書きますが..
ならば 住所に 入れ
つぎに
"name"で 値を参照し 真?
ならば 名前に 入れ
つぎに
"name"で 値を参照し 偽? ←このように使うこともあります
ならば 「名無しのごんべえさん」を
つぎに
名前に 入れ
--------------------------------------------------------------
注:名前や住所など日本語の文字を含む項目がある場合、文字コード
に注意してください。
ルール通りであればJISコードを返すのだそうですが、Netscape/
Explorer共に、そのフォームを記述している日本語のコードで値
を返して来るようです。(たとえば ShiftJISならShiftJISで,EUC
で書いているならEUCで)
ということは、本ライブラリが標準で出力するShiftJISコードで
ごく普通にフォームを出力しておけば,同じShiftJISコードで項目
値を返してくれることになります。
フォームを出力する際、(ブラウザが)正しく自動判定してくれる
ような文字(例えば平仮名の文字)をページの最初のほうに置く
と良いようです。CGIライブラリでは