ARAGO for Internet
Rev.2.2
1.Arago for Internetの概要 1.2 ライセンス契約 2. セットアップ 2.1セット アップをする前に 2.2 セットアップ 2.3セッ トアップ後のチェック 2.4 セットアップ時のエラー 2.5 CGIの ディレクトリ 3. ARAGOIとCGIについて 3.1基本的な動作 3.1 FORMとは 3.1.2FORM のオブジェクト TAG 3.2 CGIの起動 3.2.1 POST Method 3.2.2 GET Method 3.2.3 FORM以外からのCGIの起動 3.4 ARAGOIで使うHTMLファイル 3.5 HTTPはそれをどうやってクライアントのBROWSERに返すか 3.6 HTTPは文字コードをどのように扱うか 4 ARAGOIのシンタックス 4.1 ARAGOWと ARAGOIの違い 4.2 ARAGOIのために拡張されたシンタックス %記号 DEFINE SENDMAIL FILTER() FOUTPUT() GETARG() GETENV() GETFORM() GETPUT() HTML MOUTPUT() OUTPUT() POP3() RUN() SENDMAIL SENDMAIL() 5.プログラミング 5.1 CGの基本動作I 5.2 ARAGOIからのHTMLファイルの送出 5.3 urlでCGIを呼ぶ 5.4 FORMでCGIを呼ぶ. 5.5 デバッグとログファイル 5.6 プログラムミングでの注意 5.7 日本語の処理での注意 6.0.サンプル プログラム 6.1 アクセスカウンタ 6.2 会員管理 6.3 guestbook 6.4 複数のレコードからのテーブル表示 6.5 カレンダ 7. ディレクトリについて 8. ブラウザーによる違い 9. CGI 環境変数 10. HTTP ERROR STATUS 11 Security 12. うまくいかないときは 13. Reference 14 ARAGOIの仕様
1.Arago for Internetの概要
1.2 ライセンス契約
2. セットアップ
2.1セット アップをする前に 2.2 セットアップ 2.3セッ トアップ後のチェック 2.4 セットアップ時のエラー 2.5 CGIの ディレクトリ
3. ARAGOIとCGIについて
3.1基本的な動作 3.1 FORMとは 3.1.2FORM のオブジェクト TAG 3.2 CGIの起動 3.2.1 POST Method 3.2.2 GET Method 3.2.3 FORM以外からのCGIの起動 3.4 ARAGOIで使うHTMLファイル 3.5 HTTPはそれをどうやってクライアントのBROWSERに返すか 3.6 HTTPは文字コードをどのように扱うか
3.1基本的な動作 3.1 FORMとは
3.1.2FORM のオブジェクト TAG
3.2 CGIの起動
3.2.1 POST Method 3.2.2 GET Method 3.2.3 FORM以外からのCGIの起動
3.4 ARAGOIで使うHTMLファイル 3.5 HTTPはそれをどうやってクライアントのBROWSERに返すか 3.6 HTTPは文字コードをどのように扱うか
4 ARAGOIのシンタックス
4.1 ARAGOWと ARAGOIの違い 4.2 ARAGOIのために拡張されたシンタックス %記号 DEFINE SENDMAIL FILTER() FOUTPUT() GETARG() GETENV() GETFORM() GETPUT() HTML MOUTPUT() OUTPUT() POP3() RUN() SENDMAIL SENDMAIL()
4.1 ARAGOWと ARAGOIの違い 4.2 ARAGOIのために拡張されたシンタックス
%記号
DEFINE SENDMAIL
FILTER()
FOUTPUT()
GETARG()
GETENV()
GETFORM()
GETPUT()
HTML
MOUTPUT()
OUTPUT()
POP3()
RUN()
SENDMAIL
SENDMAIL()
5.プログラミング
5.1 CGの基本動作I 5.2 ARAGOIからのHTMLファイルの送出 5.3 urlでCGIを呼ぶ 5.4 FORMでCGIを呼ぶ. 5.5 デバッグとログファイル 5.6 プログラムミングでの注意 5.7 日本語の処理での注意
6.0.サンプル プログラム
6.1 アクセスカウンタ 6.2 会員管理 6.3 guestbook 6.4 複数のレコードからのテーブル表示 6.5 カレンダ
7. ディレクトリについて
8. ブラウザーによる違い
9. CGI 環境変数
10. HTTP ERROR STATUS
11 Security
12. うまくいかないときは
13. Reference
14 ARAGOIの仕様
ファイル共有型のデータベースのARAGO for WindowsのエンジンはWAN環境ではLANなどの環境と比べてのARAGOの目をみはるスピードと比べてそれほどのスループットを達成できませんで した。 もう一つは急激に普及するInternetのデータベースエンジンとしてARAGOを利用しアクセスしようとするとなかなか面倒な作業になります。それら の問題を解決するために開発されています。 ARAGOは現在最大2Gバイトのファイルまで扱うことができます。数百万件のデータに相当します、ARAGO for Internetのクライアントサーバーとして動作し検索スピードはもちろん件数に関係なくARAGOらしく高速に動作します。 ARAGO for InternetはWeb ServerからアクセスするデータベースエンジンをもったCGI言語として設計されています。完全なクライアントサーバーデータベースです。と同時に CGI言語としてWebに外部の機能を簡単に追加することができようになっています、たとえば時間やユーザーのアクセス回数を表示するカウンターなどを簡 単に作ることができます。いろいろな処理を使用とすると一般的にはPerlを使うことが多いのですが、古典的なPerlとくらべてARAGOの言語ははる かに簡単です。 Web ServerはHTTPと呼ばれるある種のパーサーです。リモートのユーザーがブラウザーを使いあるWebをアクセスすると表示される画面はHTTPで指 定されている単にユーザーの選択する画面情報だけをスタティックに表示するだけのHTMLかかれたスクリプトファイルを実行します。このHTMLファイル だけで作成するWebは簡単にできますが、変化の乏しいものです。 もしアクセスしているユーザーに何かの情報を入力をうながし、それをもとにして表示する内容を変えたりするにはHTMLだけでは記述することができませ ん。この部分はMicro SoftのInternet Information Server IISなどではISAPIやActiveXまたODBC、DB_Webなどがあります。またデーターベースをハンドリングしようとするとそれぞれのベン ダーが提供する.DLLがあります。 ただそれらを使うとわかるでしょうが、なかなかとてもスクリプトを書くといった気持ちでは扱えなかったり、簡単に使えずまた期待するようなことをするには 機能が不足したりします。 もともとこのInternetやその中心となるHTTPはUNIX上で開発され現在にいたっています。HTTPではそれらを自由にするためにCGI (Common Gateway Interface)と呼ばれる機能を持っています。CGIでは指定するインタープリターなどにスクリプトやプログラムを渡し、HTMLではできないこと をプログラムやスクリプトで処理します。 UNIXでもっとも多く使われてきたのがPerlです。 しかしPCのユーザーにはほとんどなじみのない言語です。SPCでは NTをターゲットに開発されたNTのネイティブなコードのARAGOをこのCGIで動作するようにつくりかえました。
そのためARAGOの豊富なコマンドと関数を自由に使い簡単にデーターベースをアクセスすることができます。そしてWebに不足する機能を外部 のARAGOのコマンドを使って簡単に追加することができます。Perlでできること以上にARAGOは簡単に自由な処理ができます。
またInternetをWANとして利用した環境でARAGOのデーターベースを自由に扱うことができます。Webで共有するデータベースを社 内のIntranetで共有し、同じデータをARAGO for Windowsで書かれた業務処理プログラムでそれを自由に操作。またMacintoshなどからもARAGOの高速なデーターベースエンジンを利用する ことが可能になりました。 難しいことをやさしく、それがSPCのモットーです。リモートクライアントに表示するHTMLをHTMLエディターなどで編集作成し、ARAGOのプログ ラムから返される値と置き換えるHTMLファイルの変数にただ%記号をつけるだけ、あとは ARAGO for Internetの実行部分のARAGOIで実行するプログラムを書くだけです。
ARAGOIはHTMLの中に記述されているFORMに指定するaction=ARAGOI.EXE?program。prgの記述によって呼 び出されます。 今までHTMLについて解説する本などではCGIでプログラムなどを書く方法につてはあまり詳しく解説をしていません。 HTMLは書けるのだがCGIは難しいというのが一般的でした。ARAGOIを使うことによって誰でもいとも簡単に書く事ができます。 (FORM)については次の章で詳しく解説してあります。 HTMLに記述されたactionタグをHTTPサーバーは解釈しARAGOIを呼び出し指定された.prgのプログラムを実行します。ARAGOIには ARAGO for Windowsのシンタックスを拡張したHTMLコマンドがあります。このHTMLコマンドに続く.htm拡張子を持つHTMLファイルを読み込み%記号 で指定される変数をARAGOIで実行されたプログラムによって得られた変数の内容で置き換えHTTPを通してリモートクライアントのブラウザーに表示し ます。
リモートユーザーに表示するこのHTMLファイルの記述をARAGOIのプログラムにバラバラに記述する必要もありませんし。またHTMLファ イルに複雑な記述を要求することもありません。自由にいつでもHTMLを編集するツールやNotepadなどを使い変更する事ができます。
このような自由で簡単で強力なインタープリターとWebのためのデーターベースエンジンであるARAGOIを使って複数のWebと連携したVirtual Serverを構成できます。 たとえばあるWebで対応していない、検索できないなどがおきたときARAGOIのプログラムで複数のHTMLファイルのその時の条件に合ったものを選び リモートクライアントに返し別のWebへのアクセスをすることなどができます。 もちろんARAGOIとARAGO for WindowsはXbase標準の.DBFファイルです。ほとんどのアプリケーションからデーターを取り込むことができます。ARAGOIはARAGOの 高速なデーターベースエンジンを完璧にARAGO for InternetはCGI1.1の規格に準拠するように変更しています。CGIの標準についての詳しい解説ははhttp://hoohoo.ncsa.uiuc.edu/cgi/に あります。 ARAGOIで使用するデーターベースファイルやインデックスファイルなどはARAGO for Windowsを使用して作成してください。 ARAGO for InternetのプログラムをデバッグするためにARAGO for Windowsには新しくHTTPサーバーに出力する内容を表示するためのOUTPUTウィンドウを持っています。
このマニュアルはARAGO for Windowsの一般的な知識を前提にしています。
2.1セット アップをする前に
動作環境
Windows NTと次のような動作環境が必要です。
Intranet、Internetとしとの環境
CGI1.0がサポートされている、HTTP server(httpd)と Windows NTが軽快に動く環境が必要です。
Windows NT 3.51以上、
不必要な全てのサービスは必ず停止してださい。 security上問題が発生する可能性があり ます。 コントロールパネルのサービスで確認してください。
もちろんプロトコルとしてTCP/IPがセットアップされている必要があります。
CPUのスピードは処理するプログラムの重さ、アクセス数、回線速度に関係します。 できるだけ早いものが望ましいです。
メモリ 128Mbyte以上
HDD容量 10Mbyte以上の空きスペース
httpdサーバー Apache(serviceとしてインストールされていること) IISなど。 Security上Apacheの使用 をお勧めします。
HTML編集ツール notepadでもかまいません。
開発作業環境
上記の環境と同じですが、Apacheはサービスとしてインストールしないでください。
httpdが対応するipアドレスはPC自体の固有のipである 127.0.0.1をお使いください。
SETUPを行うためにはNTにAdministratorとしてログインしてください。サーバーのときはadministratorしかありません。
NTはUS版でも 日本語版でも、またServer版、 Workstationどちらでも構いませんが、Windows 95での動作は一切保証しません。 NT のWorksatation版でのwebの公開に関してはMicrosoftのライセンス契約をご確認くださ い。 ARAGOI.EXEはNTのレジストリーに何も書き込みません。アンインストールするときはcgi-binにインストールしているときは、そのディレク トリのすべての内容を削除するだけです。レジストリーを変更する必要はまったくありません。
httpdのセッットアプはSouth Wind Internet入門 Apacheサーバーのインストール
日本ではディレクトリの区切り記号として¥(back slash)がDOSやWindowsに使われていますが、UNIXでは/記号になっています。ARAGOではもともと、/と\記号はどちらもディレクト リの区切り記号として扱います。
NTのディレクトリ名をNTのsetupは自動的にはWINNTとしますが、security上別の名前にすることをお勧めします。 この方法は Windowsを一回インストールし、再度新規インストールすると、どのディレクトリにするか聞いてきます。 このとき好きな名前に指定してください。
外部からの攻撃ではこのディレクトリ名WINNTを対象としてくるものがあります。 ご注意ください。
CDのARAGOIのディレクトリにSETUPがあります、エクスプローラーからクリックしてください。 画面の指示に従いインストールしてください。 実際にはここでDLLをインストールするために行っています。
インストールが終了した後、次にcgi-binにARAGOI.EXEとサンプルプログラムをコピーしてください。
2.3セット アップ後のチェック
セットアップ後Window NTを再起動しDOSプロンプトでARAGOIをセットアップしたディレクトリ(cgi-bin)に移動しARAGOI.EXE myfirst.PRGと実行し異常なく画面に次の内容に近いHTMLファイルの内容が表示されプロンプトに戻ればARAGOIは正常にセットアップされ ています。 ARAGOIはスペースを含むロングファイル名はサポートしていません。 ご注意ください。
もしセットアップのときにエラーが表示されるときはスタートアップホルダーにある内容をすべて別のフォルダーに一時的に移動してください。日本 語入力が設定されていてMSIME以外になっているときは一時的にMSIMEに戻してください。 これらの変更後必ず再起動してからARAGO for Internetをもう一度セットアップしてください。
2.5 CGIのディ レクトリ
ディレクトリ名は何でもかまいませんが、一般的にはcgi-binが使われています。
httpdサーバをインストールした後に設定します。 ディレクトリの階層がどこにあるかも自由ですが、httpdのインストールした先の下が 標準的です。
webのrootの下には間違えてもいおかないでください。 webの下のファイルは全て外部からのアクセスが許されています。
3 ARAGOIとCGIについて
3.1基本的な動作
リモートのクライアントがBrowserでWeb ServerをアクセスするとBrowserに表示される画面はWebServerにあるHTMLファイルの内容そのものです。Browserから次の画 面への移動には二つの方法があります。一つは何かを選択されると前もって指定されている静的な次の画面が表示される方法です。選択された項目には一つの画 面しか関連づけられていません。 このような方法は静的なHTMLの使い方です。簡単ですがアクセスしている人の情報やメッセージを表示したり保存したりすることができません。 もう一つの方法はHTMLのなかでFORMを使う方法です、FORMはBrowserから入力された情報をWeb Serverに送りWeb Serverは指定されたCommon Gateway Interface(CGI)用のスクリプトを実行処理し次に返す画面を選んだり作成したりします。MS IISではISAPIを利用して別のプログラムを実行する方法があります。ARAGO for Internetはもっとも汎用性があるCGIを利用しています。 クライアントのBrowserではFORMとそれ以外のHTMLの区別は見えませんが、FORMはHTMLに選択したり入力したりすることができる部分で す。FORMの中で使えるものはTEXT field、TEXT area、RADIO Button, CHECK Box、 SELECTION Listなどがあります。これらのユーザーに選択された情報をBrowserはWeb Serverに送ります。 同時にBrowserは このFORMの情報をどうやって処理するかの情報も送ります。METHOD tagでPOSTなのかGETなのかそしてどのようなことをするのかを ACTIONで指定してあります。もちろんこれらの入力、選択する方法やMETHODやACTIONの情報は前もってHTMLで記述されています。
たとえばInternetで何かを検索するとたとえばyahooでLIONについてを探すとアドレスには次のように表示されます。 http://serach.yahoo.com/bin/serach?p=LION これはyahooにあるserachというプログラムにpというTEXT fieldに入力された内容であるLIONについて処理をしろとBrowserがyahooのWeb Serverに情報を送っているのです。yahooのserachは実行プログラムなのか実行するためのスクリプトなのかわかりませんが、検索して必要な 情報をHTMLのフォーマットにしてBrowserに送り返すのです。この一連の動作がFORMとCGIによる動作です。Browserの表示のオプショ ンのソースでこのyahooの内容をみるとこのHTMLにFORMの定義があるのがわかります。 HTMLの詳しい説明やシンタックスについてはそれらのマニュアルや参考書をご覧ください。HTMLはどんどん進化していますのでいつもインターネットの 最新の情報を確認してください。 ARAGOIはHTMLの中に記述されているFORMに指定するaction=ARAGOI.EXE?program.prgの記述によって呼び出されま す。 FORMについては次の章で詳しく解説してあります。 HTMLのactionをHTTPは解釈しARAGOIを呼び出し指定された.prgのプログラムを実行します。ARAGOIにはARAGO for Windowsのシンタックスを拡張したHTMLコマンドがあります。このHTMLコマンドに続く.htm拡張子を持つHTMLファイルを読み込み%記号 で指定される変数をARAGOIで実行されたプログラムによって選られた変数の内容で置き換えHTTPサーバーを通して送りモートクライアントのブラウ ザーに表示します。
3.1 FORMとは
FORMはMosaic for X version 2.0 Fill-Out Form Supportとしてインプリメントされました。 それまでのHTMLがSTATICなものでしたが、HTMLにFORM tagを追加することによってHTMLを動的にするために作られたものです。 このFORMによってクライアントのBrowserからデータを送ることができるようになりました。FORMで指定するオブジェクトからデータの入力を促 し、またactionの指定で送り出すことができます。 CGIについての詳しい説明はhttp://hoohoo.ncsa.uiuc.edu/cgi/にあります。 実際のHTMLファイルにはに次のようなシンタックスで書かれています。 <FORM action="url" method=post> .......... </FORM> (urlとはactionで指定する実行されるプログラムを含んだアドレスです。後で出てきます。HTMLで使われる分からない言葉は用語解説をご覧くだ さい) このFORMの中にはFORMタグ以外であればHTMLで許されるものであれば何をかいても構いません。 このFORMでHTMLにfill-out-formを自由に指定できます。またひとつのHTMLに複数のFORMを指定できますがFORMの中に FORMを書くことはできません。 FORMで使われるユーザーの書き込みや選択領域として使われるTAGには次typeのものがあります。
3.1.2 FORMのオブジェクト TAGについて
TAGといわれると混乱するかもしれませんが、FORMでデータを引き渡せるオブジェクトを FORMのTAGといいます。
TEXTBOX
Windowsで云うところの文字入力する為のエント リーフィールドです。複数使えます。 NAMEはそれぞれのオブジェクトごとに異なった名前にします。
ソースコードでは次のようになります。 <INPUT TYPE="TEXT" NAME="Field" SIZE="12">
PASSWORDオプションは入力時に表示を*で表示します。
TEXTAREA
文章などを入力する為の エントリーフィールドです。複数使えます。 NAMEはそれぞれのオブジェクトごとに異なった名前にします。
ソースコードでは次のようになります。 <TEXTAREA NAME="TextArea" ROWS="2" COLS="19"></TEXTAREA>
CHECKBOX
チェックボックスです。 複数使えます。 NAMEはそれぞれのオブジェクトごとに異なった名前にします。
ソースコードでは次のようになります。
<INPUT TYPE="CHECKBOX" NAME="CheckBox" VALUE="CheckBox">
RADIOBUTON
ソースコードでは次のようになります。複数使えます。 NAMEはそれぞれオブジェクトごとに異なった名前にします。
<INPUT TYPE="RADIO" NAME="Radio" VALUE="Radio">
DROPDOWNLIST
項目 1 項目 2 項目 3 ドロップダウンリストボックスです。複数使えます。 NAMEはそれぞれオブジェクトごとに異なった名前にします。<OPTION SELECTED>項目 1</OPTION>でディフォルトで表示される項目を指定できます。
<SELECT NAME="Selection"> <OPTION SELECTED>項目 1</OPTION> <OPTION>項目 2</OPTION> <OPTION>項目 3</OPTION> </SELECT>
MULTIPLE DROPDOWNLIST
項目 1 項目 2 項目 3 複数の項目を選択できるドロップダウンリストボックスです。
ARAGOIではサポートしていません。複数使えます。 NAMEはそれぞれ異なった名前にします。<OPTION SELECTED>項目 1</OPTION>でディフォルトで表示される項目を指定できます。
<SELECT NAME="Selection8" SIZE="3" MULTIPLE> <OPTION SELECTED>項目1</OPTION> <OPTION>項目2</OPTION> <OPTION>項目3</OPTION> </SELECT> SUBMIT BUTON
FORMで入力選択したデータを送り出しま す。複数使えます。 NAMEは同じ名前にしますが、VALUEは異なった値にしてください。
<INPUT TYPE="SUBMIT" NAME="Submit" VALUE="送信">
IMAGE SUBMIT BUTON
FORMで入力選択したデータを送り出します。SUBMIT BUTONと同じ動作ですがボタンが画像になります。
<INPUT TYPE="IMAGE" SRC="image1.gif" ALIGN="BOTTOM" BORDER="2">
RESET BUTON
FORMで入力した内容すべてを空にします。 データを送り出しません。 一つしか使えません。
<INPUT TYPE="RESET" NAME="Reset" VALUE="RESET">
そして
HIDDEN はデータを送り出しますが、表示される事はありません。同時に複数使えます。NAMEはそれぞれ異なった名前にします。
<input type="hidden" size="30" maxlength="40" name="T1" value="name" >
クライアントのBrowserからのCGIの起動 スクリプトを起動するハイパーリンク これはFORM tagを使いません。 HTMLの送信ボタン(submmitt) GETによるcgiスクリプトの要求 ISINDEXによる起動 ARAGOIは現在ほとんど使われなくなったISINDEXはサポートしていま せん。
スクリプトを起動するハイパーリンクはFORMを使いません、HTMLに直接次のように記述します。
<a href="http://fortune/cgi-bin/aragoi.exe?calender.prg+d01">
calender.prgがARAGOIによって実行されるプログラム名
d01がcalender.prgに渡される引数です。 FORMにはプッシュボタンが必要です。このプッシュボタンが押されるとurlに続けてデータをWeb Server送り出します。Web Serverはそれらの必要な値を環境変数として設定し、指定されたcgiアプリケーションを起動します。 起動されたアプリケーションはそれらの値を参照し実行します。一般的にcgiで呼ばれたアプリケーションは結果をHTML形式にしてWeb Serverに返すか、直接Browserに返します。 3.2.1 POST Method
POSTでのCGIの起動ではCGIを呼び出すHTMLの中でFORM で使うTAGをFORM TAGでかこみ、 その中で指定するTYPE ="SUBMIT"で送り出されCGIを起動します。
この時には必ずMETHODはPOSTで行ってください。
すべてのデータはGETFORM()で取得できます。 もし複数のプッシュボタンがあるときには、押されたプッシュボタンのVALUE=で指定される値のみが送られます。 二つのボタンを指定するときは必ずNAME=で指定するオブジェクト名は同じにしてください。 POSTで送り出されるデータはurlencodedされ送り出されます。
FORMで METHOD="POST"と指定するとWeb ServerはARAGOIを起動するときにstdinとしてエンコードされたデータを引き渡します。 ARAGOIではGETFORM("オブジェクト名")でその値をデコードされて受け取ることができます。ユーザーはCONTENT_LENGTHを気に する必要もありません。FORMで使われる4つtypeの入力や選択オブジェクトそれぞれにNAME="RADIO1"というふうにオブジェクト名がつけ られています。 GETFORM()で対応するオブジェクト名の値を取ることができます。 これは実際に引き渡されるときはGETと同じような文字列としてurlエンコードされていますが、ARAGOIがデコードしそれぞれの対になっている値と オブジェクト名に置き換えています。値が空のときはそのオブジェクトが選択されなかったか、ディフォルトの値を指定してないかです。 必要のないオブジェクトは参照する必要がありません。 3.2.2 GET Method
FORMをGETで送り出すときはデータに対してurlencodedになりますが、その指定はactionの最後に指定されません。
FORMはGETで送出されるとアドレスのところにurlとして表示されます。 GETで送出されるとWeb Serverはurlエンコードされたデータを環境変数のQUERY_STRINGに設定します。ARAGOIはこのデーターはデコードしません。 GETENV("QUERY_STRING")で読み込むことができます。読み込まれた値は次のようになります。
action?name=value&name=value&name=value
&がそれぞれの変数名とデーターのペアになっているものを区切っています。もし何も入力しないオブジェクトがあるとその変数名の=の後には空白で すぐに次の&セパレーターがきます。何も選択されていないチェックボックスはまったく無視されそのオブジェクト名も送られてきません。複数選択の 条件のチェックボックスやラジオボタンは同一オブジェクト名の異なった値が送られてきます。urlエンコードされた値は=は+に、一部のコードは% HEXvalueとして引き渡されます。 urlエンコードについては別の参考書をご覧ください。
値はGETARG()でとる事が出来ます。 CONTENT_LENGTHでこの文字列の長さを返しstdinで値を引き渡します。 同時に引数としてGETARG()で値を返します。 GETARG()でいくつの文字列が渡されているかを調べそれぞれの番目のデータを取得してください。
現在GET methodは一般に使われていません。 ARAGOIでの使用はお勧めしません。
3.2.3 FORM以外からのCGIの起動
CGIスクリプトを起動するにはFORMのsubmitを使うだけでなくほかにもいくつかの方法があります。 よく使われるのがアンカーをでhref="url"を指定する方法です。たとえばテーブルの中の文字列Week1を押したときに urlで指定するCGIプログラムを実行します。 この時にはFORMの記述はありません。
次の例ではテーブルに表示されている文字列Week1を押すとmycomputer/cgi-binの ARAGOIのプログラムout.prgに引数wk1を渡して実行します。この引数はGETARG()で取得できます。 <td ><a href="http://computername/cgi-bin/aragoi.exe?out.prg+wk1">Week1</a></td>
テーブルではなく文字表示のときは
<p ><a href="http://computername/cgi-bin/aragoi.exe?out.prg+wk1">Week1</a> </p>
となります。
この時はGETとして送り出されます。 当然FORMのオブジェクトのデータを送り出す事が出来ません。
データの引き渡しはcgiで呼び出すアプリケーションの後ろに?と+で次のように引き渡されます。
<a href="/cgi-bin/ARAGOI.exe?calendar.prg+d05">5</a>とか
<frame src=\"/cgi-bin/post-query.exe\" name=\"display\" frame=\"0\" >
< imgae src="ARAGOI.EXE?anyname.prg>
ここで送られるデータはhttp://www.ncsa.uiuc.edu/SDG/Software/Mosaic/Docs/fill-out-forms/overview.htmlで 記述されてはいませんがurlencodingされて送られます。
値の取得はGETを参照ください。
それ以外の方法としてSSI(Server Side Include)です。 SSIはUNIXに依存する部分があり一部のWeb Serverではサポートされていません。動作を確認してください。 SSIとはHTMLに面倒なプログラムを記述することなく簡単にほかのファイルやコマンドを実行し結果をそのHTMLの一部のように扱い表示します。簡単 にHTMLに時間や日付そしてほかのファイルの内容などを埋め込むことができます。コピーライト表示など頻繁に使われるもなどに便利です。 このSSIはHTMLファイルの拡張子を特別な設定をしない限り.sthlか.stmにする必要があります。 ServerはSSIが動作されるようになっていると新しいtext/x-server-parsed-htmlというparsed HTMLファイルタイプを設定します。 そして.stmのファイルのときはHTMLファイルをすべてスキャンし次の指定があるかどうかを見ます、見つかると実行します。
<!--#command param1="value" param2="value2",,,,-->
SSIには現在6個のコマンドがあります。 include variableで指定する値をインクルードします。fileとvirtualがあります。
<p> 下記の住所に連絡ください
<!--#include file="./somewhere/address.html"--> address.htmを指定するところに表示します。 ........</p> fileは現在のディレクトリに対する相対パスを指定します。 virtualはvirtualのurlのpathを指定します。 exec variableにはcmdかcgiを指定し実行します。
<p>あなたは現在<!--#exec cgi="/cgi-bin/aragoi.exe?counter.prg-->番目のアクセスです。</p>
cmdはシステムコマンドを実行します。 cgiはcgiスクリプトを実行します。 あまり頻繁に使うと毎回cgiなどを呼び出しますので遅くなる可能性があります。 ほかに config、echo、fsize、flastmodeなどがあります、詳しくはHTTPdの参考書をご覧ください。 ここで使うexecやcgiなどの予約語は必ず小文字をお使いください。
MIMEとMeta informationについては別の参考書を見てください。
3.4 ARAGOIで使うHTMLファイル
ARAGOIが実行されWeb Serverに出力するときに使用するファイルはHTMLファイルです、HTMLファイルはテキストファイルですので編集するのにはNOTEPADでも普 通のテキストエディターでも構いません。しかし実際の表示される状態などを見ながら編集できるHTMLエディタなどの方が便利です。 HTMLエディタに よっては全く不必要なコードを追加するものがあります。 ご注意ください。
出力に使用するHTMLファイルはいつでもそれらのツールで変更できます。ARAGOIで使用するプログラムファイル.prgとは別のファイル として扱います。もちろんすべてを.prgの中に記述することもできます。このARAGOIが出力に使用するHTMLファイルはWeb Serverが使用する通常のHTMLファイルと異なる点はARAGOIによって取得する文字列に%記号をつけていることです。 ARAGOIは.prgプログラムを処理して得た値とこの出力用のHTMLにある%記号で指定される変数と置き換えWeb Serverに出力します。 たとえば ARAGOIの.prgで日付を取得しHTMLの中で使われる変数DATEに代入します。 ARAGOIの.prgでは DATE=DATE() ARAGOIで使用する出力用のHTMLファイルの日付のところは <p> 今日の日付は: %DATE</P> となります。 ARAGOIはこのHTMLファイルの%DATEを ARAGOIがDATE()で取得した値であるDATEの内容と置き換えて出力します。 クライアントのBrowserではこの部分は 今日の日付は:2001.1.1と表示されます。 もちろんHTMLエディターでこのHTMLを表示するときもこの%記号が画面上に表示されますが、影響をほかに与えることはありません。 また%記号をARAAGOIで変数に置き換えるのではなくBrowserに表示するときは、%記号の前にもう一つ記述してください。 %%文字です%%のように。 この出力ファイルの中で自由にHTMLを記述できますが、%記号で指定した変数をARAGOIのプログラムで設定しないときはARAGOIは空白を出力し ます。 HTMLファイルを作成するときにMIMEとかその他の空白行に気を付けましょうとかいろいろの注意がありますが、HTMLのマニュアルを参照ください。 通常のHTMLエディターで作成されたファイルは問題がありません。 しかしARAGOIはそのHTMLのシンタックスのチェックは何もしません。必ずそのHTMLが正常に表示されるかは作成時にBrowserで確認してく ださい。 一部のツールではその会社のBrowserにしか対応していないMETAファイルなどを定義することがあります。
3.5 HTTPはそれをどうやってクライアントのBROWSERに返すか
Web Serverは起動したCGIが返してきた文字列を</html>がくるまでWeb Serverが保存しているアドレスのクライアントのBrowserに返します。この時必要な記号や文字を正確に送るためにurlエンコードします。 ユーザーはこのエンコードについて考慮する必要はありません。 おなじCGIプログラムを複数のBrowserから呼ばれても、また同じBrowserが何回も同一のCGIをネスティングして呼んでもそれぞれの呼び出 しは異なったタスクとしてWeb Serverから起動されます。
httpdにCGIからhtml文を送り返す前にhttpdにこれから送る文字列がhtml文であることを知らせるため次の行を送出する必要が あります。
OUTPUT("Content-type: text/html",2)
ここで送り出す文字列がshift-jisであることを指定するためには、charset=shift-jisを一緒に次のように送出します。
output('Content-type: text/html; charset=shift-jis' ,2)
charset=shift-jisの部分がないと、Browserによっては漢字を正常に表示できないことがあります。
3.6 HTTPは文字コードをどのように扱うか
output('Content-type: text/html; charset=shift-jis' ,2)をみてこれから送られてくる文字列が、html文であり、そのように処理します。 またcharset=shift-jisの指定で文字コードを shift-jisとして送り出します。
http://www.fxis.co.jp/DMS/sgml/xml/saloon/html_correct_charset.html
に詳しい説明があります。
Browserはhttpサーバが送ってくるhtmlファイルの<HEAD>に記述されているCHARSET=で指定される文字 コードに基づき文字をBrowserに表示します。
<HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=shift-jis"> <TITLE>ARAGO for Internet l</TITLE> </HEAD>
このCHARSET=の指定がないときはBrowserはASCIIコードとして、表示します。 ユーザーがこの表示されている文字を指定する 文字コードを変更することによって正常に表示されます。
BrowserはFORMで送りだす文字コードは、Browserが起動されているOSの文字コードとは関係なく、この表示で使用された文字 コードに変換して送り出します。
Unicodeを内部で使用しているOSの一部のBrowserはこの送り出す文字コードを何か の拍子に変換せずunicodeまま送り出すbugがあります。 これはCGIの中で処理することは不可能です。
4.1ARAGOW とARAGOIの違い
ARAGOIはARAGO for Windowsと異なりbackgroundで動くため一切の画面表示の機能、エラーの表示、外部デバイスへの入出力などが使えません、ARAGOIの実 行中にエラーが発生するとARAGOIはHTTP1.1で規定されるHTTPエラーの500 サーバーエラーをServerに返します。プログラムをdebugするにはまず基本的にARAGOのプログラムで動くか確認し、そのうえでARAGOIの シンタックスを使いDOSプロンプト上でARAGOI.EXE TEST.prgとして実行し結果が必要なHTMLのフォーマットで返されるかを確認してください。ARAGO for Windows V4.0からOUTPUTウィンドウをサポートしています。 ARAGOIがHTTPに返す値をこのOUTPUTウィンドウに表示します。 GETFORM()などで引き渡される値をプログラムの先頭で代入し、あたかもGETFORM()で取得したようにしてプログラムをデバッグすることがで きます。
またARAGOI.EXE TEST.prg >test.logとしてファイルにとり比較するのも一つの方法です。
4.2 ARAGOIのために拡張されたシンタックス
%記号で指定され変数名をARAGOIで実行されるプログラム中の同じ名前の変数に置き換えるように指示します。
文法
%[!]<変数名> ! ARAGOIのグラフィックキャラクターの自動変換をしない。 <変数名> ARAGOIを実行して変更したいHTMLの変数名の前につけます。
%[!]<変数名>
! ARAGOIのグラフィックキャラクターの自動変換をしない。 <変数名> ARAGOIを実行して変更したいHTMLの変数名の前につけます。
使い方 ARAGOIのプログラムのHTMLコマンドで呼ばれHTMLファイルで使います。ARAGOIが実行されるとHTMLファイルのなかで% 記号で指定された変数をARAGOIのプログラム中の同じ名前の変数に置き変え出力します。 %記号をつけたと同じ変数がARAGOIのプログラムで使用されていないときは空白に置き換えられます。 %記号を表示する文字とするときは%の前にもう一つ%記号を追加してください。 ARAGOIはHTML 2.0 RFCで定義する次のURL GRAPHIC CHARACTERを自動的に右側のコードに変換します。
& & < > > < “ "
但しTrade Mark、 Copyrightは日本語とぶつかるため処理しません。 この自動変換をさせないためには%のすぐ後に ! を書いてください。
mailを定義する
DEFINE SENDMAIL <メイル名> HOST mailサーバー名; FROM 差出人; TO 宛先; SUBJECT 件名 ; MESSAGE FILE<ファイル名> |MEMO <メモフィールド名> | <フィールド名> | <テキスト名> [CC <CC宛先名>] [BCC <BCC宛先名>] [REPLY TO< 返信先名>] [NAME<文字列名>] [COUNT<数値>] [SERVER<文字列名2>] [INFO<文字列名3>]
DEFINE SENDMAIL <メイル名>
HOST mailサーバー名;
FROM 差出人; TO 宛先; SUBJECT 件名 ; MESSAGE FILE<ファイル名> |MEMO <メモフィールド名> | <フィールド名> | <テキスト名>
[CC <CC宛先名>] [BCC <BCC宛先名>] [REPLY TO< 返信先名>]
[NAME<文字列名>]
[COUNT<数値>]
[SERVER<文字列名2>]
[INFO<文字列名3>]
使い方
HOSTで指定するmailサーバー名はDNSに登録されているMXレコードのメイルサーバ名、CNAME
でMAILと指定するサーバのURLです、たとえばmail.who.comとかです。ホスト名でもかまいません。 IPアドレスは使えません。
TOで指定する宛先は完全なメールアドレスが必要です。 SMTPサーバーが@の左側のみでのメイルアドレスを認めているときはそのドメイン内では有効です。 しかし外部にはワイルドカードや省略形は認められません。
TO "nakamura@somewhere.com"にニックネームをつけるときは
TO "中村さん<nakamura@somewhere.com>" To "<nakamura@somewhere.com>(中村さん)" TO '"中村さん"<nakamura@somewhere.com>' To "nakamura@somewhere.com(中村さん)"
TO "中村さん<nakamura@somewhere.com>"
To "<nakamura@somewhere.com>(中村さん)"
TO '"中村さん"<nakamura@somewhere.com>'
To "nakamura@somewhere.com(中村さん)"
のどれかのフォーマットをお使いください。
この表記は CC、BCCにも適用されます。
SUBJECTは必ずつけてください。 日本語を使うことができます。
Header部分の日本語はすべて B encodingでコード化されます。
CCはカーボンコピーの意味です、宛先のメールアドレスを入れます。 複数のメールアドレスを書く時はカンマ","で区切ってください。
BCCはCCと同じようにそれぞれの宛先にメールを送りますが、CCしたことをTOで指定する宛先には通知しません。
REPLYTOは返信の宛先です。 SENDERと同じですが、複数かくことが出来ます。返信される時どちらが優先されるのかはMailerによります。
TO、CC、BCC、REPLYTOに複数の宛先を書くことができます、複数かくときは、";"で区切ってください。
アドレスとニックネームには":" "," ';"は使えません。
MESSAGEは送信する本文を指定します、テキスト名、フィールド名、またFILEをつけテキストファイルから、MEMOをつけてMEMOFIELDの テキストを指定することができます。 バイナリーファイルは添付ファイルとして送信してください。
MESSAGEで指定されるファイルまたはメモフィールドはUS ASCII,JISまたはShift−JISのテキストです。
文字列はUS ASCIIでは Content-Type: text/plain; charset= US ASCII Content-Transfer-Encoding: 7bitになります。 JISコードのテキストはそのまま、Shift−JISの時はJISに変換して Content-Type: text/plain; charset= ISO−2022−JIS Content-Transfer-Encoding: 7bitになります。
文字列はUS ASCIIでは
Content-Type: text/plain; charset= US ASCII
Content-Transfer-Encoding: 7bitになります。
JISコードのテキストはそのまま、Shift−JISの時はJISに変換して
Content-Type: text/plain; charset= ISO−2022−JIS
次のオプションはメーリングリストを作成するときに使います。
NAME は X-ML-Nameをヘッダー情報として送出します。 グループ名を指定します。 文字列です。
例 X-ML-Name: Group1
COUNT はX-Mail-Counとして何件目のメールかをヘッダー情報として送出します。 数値型です。 0かそれ以上の数値です。
例 X-Mail-Coun: 113 is numeric and 0 or grater
SERVER は X-MLServerとしての付加情報をヘッダー情報として送出します。 文字型です。
例 X-MLServer: fml [fml 2.1B#3]; post only from members
INFO は X-ML-Infoとしての付加情報をヘッダー情報として送出します。 文字型です。
例 X-ML-Info:"# help" (without quotes) to the address admin@who.com
文字列には日本語を含むことができます。 CR LFを含むことはできません。
日本語の文字列を含むときはB encodingします。
添付ファイルの扱いはSENDMAILを御覧ください。
mailerの名前はArago Mailerです。 MailerのコマンドはSMTPです。
ファイルサイズ、ファイル形式、エンコードはBASE64、たとえテキストファイルでも
複数のファイルを添付することが出来ます。
ファイルの添付はSENDMAILをご覧ください。
DEFINE SENDMAILで定義されたメイルを送出するのにはSENDMAIL()をお使いください。
指定する文字列から指定する文字列を削除、または指定する文字に置き換えます。
FILTER(<文字式1>,<文字式2>[,<文字式3>] ) <文字式1> 検査される文字列を指定します <文字式2> 削除または置換される文字列を指定します。 <文字式3> 置換する文字列を指定します。
FILTER(<文字式1>,<文字式2>[,<文字式3>] )
<文字式1> 検査される文字列を指定します <文字式2> 削除または置換される文字列を指定します。 <文字式3> 置換する文字列を指定します。
使い方 FILTERは文字列の中から削除したい文字列を検索し削除または指定する文字列に置き換えます。文字式2はカンマで区切られた文字列または文字のリスト です。このリストの表記はARAGOの文字列の規定と同じです。リスト中にダブルクオート“、シングルクオート ‘ 、スペースやスペースで始まるか終わる文字列、カンマはダブルクオートかシングルクオートで括ってください。文字式3を省略すると置換される文字をすべて 取り除きます。 Newstring= FILTER(OiginalStg, fil1)では flt1="<,>,<BR>"とするとそれぞれに一致する文字と文字列をOriginalStrから削除しfilt1に代入し ます。ABCDEFという文字列から、DをBCに置換するとしてリストの次にBCをABに変換すると指定したときは、リストのはじめの置換の結果のBCは リストの次のBCの置換の対象とはしません。大文字小文字を識別しません。
FOUTPUT(<ファイル名>,[<MIMEタイプ>]) ファイル名で指定するバイナリーファイルを直接Webに返します。
FOUTPUT(<ファイル名>,[<MIMEタイプ>])
ファイル名で指定するバイナリーファイルを直接Webに返します。
指定するファイル名のバイナリーファイルを出力します、MIMEタイプを指定しないときは?
送り出されたバイナリーファイルのMIMEタイプを認識するかどうかはBrowserとそのプラグインソフトウェアに依存します。 MIME 1.0でサポートされているMIMEをお使いください。
送出するファイルのサイズの制限はありません。
メモフィールドから出力するエンコードされません。
GETARG(<位置>|<空白>) urlで送られてきたパラメータを取得します。
使い方 href="http://fortune/cgi-bin/aragoi.exe?calender.prg+001+002"などで送られてきた値を 取得します。GETARG()に引数を渡さないとARAGOIに引き渡されたコマンドラインパラメーターの数を返します。この例では3と返されます。 1はプログラム名、次にパラメータがあると次のパラメーターを文字列で返します。GETARG()が3を返したときは三つのパラメーターがあり後の二つが 001と002となります。GETARG(3)は002となります。
環境変数の値を返します。
GETENV(<文字式>) <文字式> 環境変数名を指定します。
使い方 FORMでCGIを呼び出すときに ARAGOI.EXE?sample.prg+value1+value2のように値を引き渡すことができます。
HTTPサーバーはこの引数を環境変数としてセットします。
ARAAGOIのプログラム中からこれを参照するのに使います。
value1=GETARG(ARG1) value2=GETARG(ARG2)
value1=GETARG(ARG1)
value2=GETARG(ARG2)
DOSではセットされている環境変数を取得します。
GETFORM("FORMオブジェクト名") POSTでFORMから送られたオブジェクトの値を取得します。
GETFORM("FORMオブジェクト名")
POSTでFORMから送られたオブジェクトの値を取得します。
使い方 FORMの送出方法としてmethod=POSTとして指定されてWeb Serverより引き渡されたオブジェクト名とその値をARAGOIは内部で変換しています。 GETFORM()でそれぞれのオブジェクト名に対応する値を取得します。 urlエンコードされて引き渡された値はデコードされていますのでそのまま使うことができます。 actionでARAGOIを呼び出したHTMLファイルで定義されているFORMオブジェクト名がたとえばNamefieldでARAGOIではその値 をNameに代入するときは次のようになります。
Name=GETFORNM("Namefield")
となります。これでARAGOIのプログラムで自由にこの変数を扱うことができます。 ARAGOIでは変数の大文字小文字の識別をしません。
GETPUT(<FORMオブジェクト名>,<ファイル名>) PUTで送られてきたファイルをファイル名で指定するファイルとしてセーブします。
GETPUT(<FORMオブジェクト名>,<ファイル名>)
PUTで送られてきたファイルをファイル名で指定するファイルとしてセーブします。
RFC1867で規定するPUTで送られてきたファイルをファイル名で指定するファイルとしてセーブします。
実際のHTMLではMethod=POSTで指定する例が多いようです。
次の例に見られるように
<form ENCTYPE="multipart/form-data" action="/cgi-bin/bswrite.prg" method ="POST" name="s2">
ENCTYPE="multipart/form-data"を指定するとPUTとして扱われます。
ファイルを取得できなかったときは.f.を返します。
ファイル名はPATHを含みます。
セキュリティーの為に次のことに注意してください。
もし悪意でcgi-binの実行可能なプログラムを送り付けそれを実行するとcgiとして実行されてしまいます。
必ずファイルをセーブするディレクトリを指定してください。
またファイル名を実行不能な名前や、既存のファイル名と異なる名前にしてください。
まったく外部からはアクセスできないディレクトリにセーブするか、ファイルをセーブした後、メモフィールドにセーブし、ファイルを削除するのが 安全です。
外部から巨大なファイルを送られてくるとシステムの動作を保証できなくなります。 そのためINIファイルに Max_content= で最大ファイルサイズを指定してください。
外部から巨大なファイルを送られてくるとシステムの動作を保証できなくなります。 そのためINIファイルに
Max_content= で最大ファイルサイズを指定してください。
単位は Kでキロバイト、Mでメガバイト、Gでギガバイト、何も指定しないときはバイトです。
FSIZE()でファイルのサイズをセーブ後に確認してください。
ENCTYPE="multipart/form-data"が指定されていないときはGETPUT()は何もセーブしません。
複数のファイルがアップロードされたときや、FORMで他の値が送られてきたときはcontent_lengthはすべての長さを返します。
IISではMicro Soft Posting Acceptor(mocrosoft.comからダウンロードできます。)か他のPUT対応する為のASPが必要です。 Internetで検索してください。
BrowserがRFC 1867に対応していないときは、それぞれのBrowserの製造者がプラグインを出しています。
MS IEではjarfc1867.exeです。
セキュリティーを持つために特定のクライアントからのみ受け付けるときはREMOTE_HOSTなどの環境変数をご利用ください。
サンプルプログラム
<HTML> <HEAD> <TITLE>untitled</TITLE> </HEAD> <BODY> <FORM ACTION="/cgi-bin/aragoi.exe?temp.prg" ENCTYPE="multipart/form-data" METHOD="POST" name="s2"></P> <P>Name<INPUT TYPE="TEXT" NAME="T1" SIZE="20"> emial<INPUT TYPE="TEXT" NAME="T2" SIZE="20">Expire date<INPUT TYPE="TEXT" NAME="T3" SIZE="20"></P> <P><BR> Password<INPUT TYPE="TEXT" NAME="T4" SIZE="20">Tel<INPUT TYPE="TEXT" NAME="T5" SIZE="20"></P> <P>Comment</P> <P><TEXTAREA NAME="S1" ROWS="7" COLS="58"></TEXTAREA> File<input type="file" size="20" name="T6"></P> <P><TEXTAREA NAME="S2" ROWS="7" COLS="58"></TEXTAREA> File<input type="file" size="20" name="T7"></P> <P><INPUT TYPE="SUBMIT" NAME="B1" VALUE="Write"> Write </FORM> </BODY> </HTML>
temp.prg
name=GETFORM("T1") email=GETFORM("T2") expire=getform("T3") password=getform("T4") telephone=getform("T5") bitmap= getform ("T6") comment=GETFORM("S1") bitmap2= getform ("T7") comment2=GETFORM("S2") GETPUT("T6","xxx.tmp") GETPUT("T7","yyy.tmp") CONTENT_LENGTH=GETENV("CONTENT_LENGTH") CONTENT_TYPE=GETENV("CONTENT_TYPE") REQUEST_METHOD=GETENV("REQUEST_METHOD") output('Content-type: text/html ',2) output('html',2) &&here we need carriage return output('<head><title>aaaaaaa</title></head>') output('<body>') output(name,2) output(email,2) output(expire,2) output(password,2) output(telephone,2) output(bitmap,2) output(comment,2) output(bitmap2,2) output(comment2,2) output(CONTENT_LENGTH,2) output(CONTENT_TYPE,2) output(REQUEST_METHOD,2) output('</body></html>')
name=GETFORM("T1") email=GETFORM("T2") expire=getform("T3") password=getform("T4") telephone=getform("T5") bitmap= getform ("T6") comment=GETFORM("S1") bitmap2= getform ("T7") comment2=GETFORM("S2") GETPUT("T6","xxx.tmp") GETPUT("T7","yyy.tmp") CONTENT_LENGTH=GETENV("CONTENT_LENGTH") CONTENT_TYPE=GETENV("CONTENT_TYPE") REQUEST_METHOD=GETENV("REQUEST_METHOD")
output('Content-type: text/html ',2) output('html',2) &&here we need carriage return output('<head><title>aaaaaaa</title></head>') output('<body>')
output(name,2) output(email,2) output(expire,2) output(password,2) output(telephone,2)
output(bitmap,2) output(comment,2) output(bitmap2,2) output(comment2,2) output(CONTENT_LENGTH,2) output(CONTENT_TYPE,2) output(REQUEST_METHOD,2) output('</body></html>')
HTML <ファイル名.HTM> ARAGOIが出力するHTMLのファイル名を指定します。
HTML <ファイル名.HTM>
ARAGOIが出力するHTMLのファイル名を指定します。
使い方 ARAGOIがWeb Serverから呼び出され指定するプログラムを実行するときに結果を出力するHTMLのスクリプトを書いたファイル名を指定します。 このHTMLを実行するとARAGOIは実行を終了します。 このHTMLコマンドはちょうどDOでほかのプログラムを呼ぶのに似ています。ARAGOIはHTMLで指定されたHTMLフォーマットのファイルを読み 込み%記号で指定されている変数をARAGOIのプログラムファイルで指定する変数の値と置き換えます。 ARAGOIのプログラム中に%記号で指定するのと同じ変数名が見つからない場合は、ARAGOIは空白の文字列に置き換え出力します。 文字として%記号を表示したいときはもう一つ%記号をその前に追加してください。 変数名はARAGOのシンタックスで指定される有効な変数名でなければいけません。最初の文字は数値であってはいけません、アンダースコアー"_"も使え ません。また変数の中にスペースを使うことはできません。
MOUTPUT(<メモフィールド名>,[<MIMEタイプ>]) 指定するメモフィールドからバイナリーファイルを直接Webに返します。
MOUTPUT(<メモフィールド名>,[<MIMEタイプ>])
指定するメモフィールドからバイナリーファイルを直接Webに返します。
指定するメモフィールドのバイナリーファイルを出力します、MIMEタイプを指定しないときは?
ファイルを直接出力するときはFOUTPUT()があります。
サンプル
ビットマップを表示するにはHTMLからは 次のように呼び出します。
< imgae src="ARAGOI.EXE?anyname.prg> 必要な桁数分だけ連続してかきます。
必要な桁数分だけ連続してかきます。
呼ばれるプログラムは:
use test<---------このあとseek()などする。 mtype=memfield(bb) <------------ 関数Memofield()はあたらしくgif,jpegを返します。 if mtype="JPEG" .or. mtype= "GIF" type="image/"+lower(memfield(bb)) moutput(bb,type) else foutput("default.gif", "image/gif") もしファイルが違ったらデフォールトのgifを返す。 endif
注意)ファイルの形式によってはmemfield()が正確にファイルの形式を返せないことがあります。 形式をセーブするフィールドを用意するとよいでしょう。
検索してその値を使い対応する文章やビットマップを表示することができます。カウンタなどで使用するときは複数のプログラムを呼ぶ形で複数の.gifファ イルを出力してください。 IISでは表示する順番がプログラムの順序と関係なく出力されことがあります。 もちろん呼ばれるARAGOのプログラムで最後に指定する方のバイナリーファイルを出力する限り、その前に何をしてもかまいません。
OUTPUT([<文字式>][,,<0|1|2>]) ARAGOIのプログラムから直接Webに文字列を送ります。
OUTPUT([<文字式>][,,<0|1|2>])
ARAGOIのプログラムから直接Webに文字列を送ります。
使い方 ARAGOIのプログラムの中からWeb Server、HTTP、へ文字列を送ります。文字式にピリオッドに続いて1を渡すと文字列を送り出した後改行コードを送ります。 デフォルトは1で改行を1回します。0から2までです。この文字列には表示できる文字であればなんでも書けます。文字列をあらわす区切り記号と同じ"ダブ ルクオートを文字列中に使うときは別の区切り記号を使ってください。ARAGOでは次の三つの区切り記号があります。文字式の最大長は254バイト文字で す。
次のサンプルはBrowserに表示するには最低限必要なHTMLのコードを使用しています。HREFのURLでもACTIONでもかまいませ ん、cgiをとそして呼び出してください。画面に"こんにちわ”と表示されるはずです。 文字列中に"を含むときは文字列を’で括ってください。 なを<html>には改行が必要です。HTMLとOUTPUTを組み合わせてもかまいません。 HTMLの規格は必ず守ってください。 またその次の行には空白行がないとIISはcgiエラーを返します。
<form action="/cgi-bin/aragoi.exe?outtest.prg" method="post" name="sssss"> outtest.prg OUTPUT("Content-type: text/html",2) head2='<html>' output(head2) &&here we need carriage return output("") &&here we need blank line for IIS , it's their bug!!!! head3='<head><title>title is a title</title></head>' && this is how comment in HTML but Front page does not support output('<!-- text for comment -->') output(head3) output('<body>') output("<p>こんにちわ</p>") ENDHTML="</body></html>" OUTPUT(ENDHTML)
<form action="/cgi-bin/aragoi.exe?outtest.prg" method="post" name="sssss"> outtest.prg
OUTPUT("Content-type: text/html",2) head2='<html>' output(head2) &&here we need carriage return output("") &&here we need blank line for IIS , it's their bug!!!! head3='<head><title>title is a title</title></head>' && this is how comment in HTML but Front page does not support output('<!-- text for comment -->') output(head3) output('<body>') output("<p>こんにちわ</p>") ENDHTML="</body></html>" OUTPUT(ENDHTML)
POP3(<サーバー名>, <アカウント名>,<パスワード名> [, タイムアウト]) POP3(POP3ID,COMMANDID,OPTION)
POP3(<サーバー名>, <アカウント名>,<パスワード名> [, タイムアウト])
POP3(POP3ID,COMMANDID,OPTION)
メイルの受信をします。 POP3は複数のPOP3()を使い処理を行います。 最初のPOP3()でメイルサーバーにアクセスしてメールIDを取得します。 あとの処理ではこのIDを使います。
サーバー名はDNSに登録されているMXレコードのメイルサーバ名、CNAMEでMAILと指定するサーバのURLです、たとえば mail.who.comとかです。ホスト名でもかまいません。 IPアドレスは使えません。
タイムアウトはメールサーバーとの接続が成立するまでの待ち時間です。 この時間を超えると接続エラーになります。 POP3のときは同じアカウントを他がアクセスしているときはコネクトできません。 メイルが大量に処理されるような環境ではご注意ください。
ディフォルトは30秒です。 秒単位で指定できます。
アカウント名はメールサーバーに登録されているユーザー名です。 ニックネームではありません。 アカウント名俊夫 フルネーム 川上 俊夫のときは俊夫です。 パスワードはサーバーに登録されているパスワードです。
コネクッションが成立するとPOP3IDを数値として返します。 この数値はIDですので演算の対象には無効です。
エラーのときは次の値が返ります。
-1 サーバーがエラーを返したか、サーバーとコネクッションが成立しませんでした。 -2 アカウント名が違います。 -3 パスワードが違います。
-1 サーバーがエラーを返したか、サーバーとコネクッションが成立しませんでした。
-2 アカウント名が違います。
-3 パスワードが違います。
コマンドは
STAT は取得したPOP3IDにいくつのメイルがあるかを返します。 LIST はPOP3IDで指定するアカウントのメッセージ番号のメイルのサイズを返します。 ヘッダー情報、添付ファイルも含みます。 RETR はPOP3IDで指定するアカウントのメッセージ番号のメイルの指定する部分または全部を取得します。 DELE はPOP3IDで指定するアカウントのメッセージ番号のメイルに削除マークをつけます。 RSET は指定したメッセージ番号の削除マークを削除します。 QUIT はPOP3IDで指定するアカウントのセッションを終了します。 削除マークのあるメイルはすべて削除されます。
STAT は取得したPOP3IDにいくつのメイルがあるかを返します。
LIST はPOP3IDで指定するアカウントのメッセージ番号のメイルのサイズを返します。 ヘッダー情報、添付ファイルも含みます。
RETR はPOP3IDで指定するアカウントのメッセージ番号のメイルの指定する部分または全部を取得します。
DELE はPOP3IDで指定するアカウントのメッセージ番号のメイルに削除マークをつけます。
RSET は指定したメッセージ番号の削除マークを削除します。
QUIT はPOP3IDで指定するアカウントのセッションを終了します。 削除マークのあるメイルはすべて削除されます。
POP3(POP3ID, "STAT")でいくつのメイルがあるかを調べます。
成功するとメイルボックスにあるメイルの数を返します。 この数値はメッセージ番号としてメッセージの識別に使います。
-1 はエラーです。 POP3IDが間違えているか、コネクッションが中断されたかです。
POP3(POP3ID, "LIST", メッセージ番号)で指定するメッセージのサイズを返します、 ヘッダー情報、添付ファイルも含みます。 成功すると0を返します。 エラーのときは-1を返します。
RETRは少し複雑です。またパラメータの数も、返り値も異なります。
POP3(POP3ID, "RETR", メッセージ番号,"参照するヘッダーの文字列")です。
この参照するヘッダーの文字列はmailerによって異なります。 一般的に使われているのは FROM、TO、 CC、 x-mailer、 DATE、MIME、SUBJECT、一部サポートされていませんが一般的なものとして REPLY TOなどがあります。 大文字小文字を識別しません。 その参照するヘッダーの文字列がないときでもエラーにはなりません。 ISO-2022-jisのB encodingおよびQ encodingされているものはshift-jis、US ASCIIとして返されます。 B encodingされたISO-2022-jis以外のときは変換せずに返します。
指定するヘッダーの文字列が空白か、文字列そのものがないときは空白を返します。
ファイルにセーブする:
POP3(POP3ID, "RETR", メッセージ番号, "<ALL| MESSAGE [,<添付ファイル番号>]>", ファイル名) メッセージ番号のメッセージをファイル名で指定するファイルにセーブします。
ALLが指定されるとすべてをセーブします。
ヘッダー、本文、添付ファイルで text/plainと指定されているものはshift-jisとUS ASCIIに変換しますがそれ以外はバイナリーを展開してセーブします。 バイナリーの部分を切り出しPKZIPなどでBASE64ででコードするとバイナリーファイルを復元できます。
MESSAGE識別子に添付ファイル番号を指定すると添付ファイルをセーブします。
セーブできなかったときはエラーとして -1が返ります、 成功するとセーブしたファイルサイズをバイトで返します。
添付ファイルの数を見る
POP3(POP3ID, "RETR", メッセージ番号, "ATTACH")
成功するとメッセージ番号で指定したメッセージの添付ファイルの数を返します。 この数値は添付ファイル番号として添付ファイルの識別に使います。
-1 はエラーです。 POP3IDが間違えているか、コネクッションが中断されたかです。 添付ファイルの情報を取得する
POP3(POP3ID, "RETR", メッセージ番号, "ATTACH", 添付ファイル番号, "添付ファイル情報")
この添付ファイル情報は次のものがあります。
name、Content-Transfer-Encoding、filename、charset、filenameが一般的にはセーブする ときのファイル名です。nameとfilenameは同じことが多いです。大文字小文字を識別しません。
取得できないときは空白を返します。
POP3(POP3ID, "DELE", メッセージ番号)でPOP3IDで指定するアカウントのメッセージ番号のメイルに削除マークをつけます。
エラーのときは−1を返します。
POP3(POP3ID, "RSET")で指定したメッセージ番号の削除マークを削除します。
POP3(POP3ID, "QUIT")でPOP3IDで指定するアカウントのセッションを終了します。 削除マークのあるメイルはすべて削除されます。
メイルを受信してどう扱うかはいろいろありますが、POP3()を複数使い一連の処理をします。
1. まずメイルサーバーにアクセスしてメイルがいくつあるか? 2. 添付ファイルがあるかどうか 3. セーブして 4. ファイルを削除するかどうか? 5. QUIT
1. まずメイルサーバーにアクセスしてメイルがいくつあるか?
2. 添付ファイルがあるかどうか
3. セーブして
4. ファイルを削除するかどうか?
5. QUIT
です。 もし1.を実行してメイルがないときは5.にいきます。 サンプルをご参照ください。
通常のmail クライアントソフトでは受信したメールを一つのファイルに追加していき同一ファイル名の発生を避けています。 また、メイルサーバーにメイルを残すオプションを設定すると次のメールサーバーからは前に受信したメールを再読み込みを避けるために最後に読み込んだメー ルを記録しておき、それ以降を読み込むようにしています。
サンプル。 ARAGOでのチェック用に書いてあります。 ARAGOIでは表示ができませんので修正してください。
SET TALK OFF nID = POP3("mail.who.com", "john", "john") nCount = POP3(nID, "STAT") IF nCount > 0 ? "There are " + str(nCount) + " mails." FOR nMsg = 1 TO nCount ? str(nMsg) + " mail --------------------" ContentType = POP3(nID, "RETR", nMsg, "Content-Type") ? " Content-Type = " + ContentType nAttachCount = POP3(nID, "RETR", nMsg, "ATTACH") ? " There are " + str(nAttachCount) + " attachments." FOR nAttach = 0 TO nAttachCount sMsg = ltrim(str(nMsg)) sAttach = ltrim(str(nAttach)) ? "Copy Size = " + str(POP3(nID, "RETR", nMsg, "MESSAGE", nAttach, sMsg + "_" + sAttach + ".tmp")) ? "Content-Type = " + POP3(nID, "RETR", nMsg, "ATTACH", nAttach, "Content-Type") ? "name = " + POP3(nID, "RETR", nMsg, "ATTACH", nAttach, "name") ? "Content-Transfer-Encoding = " + POP3(nID, "RETR", nMsg, "ATTACH", nAttach, "Content-Transfer-Encoding") ? "filename = " + POP3(nID, "RETR", nMsg, "ATTACH", nAttach, "filename") ? "charset = " + POP3(nID, "RETR", nMsg, "ATTACH", nAttach, "charset") ? "=====================================================" NEXT NEXT ENDIF bState = POP3(nID, "QUIT")
PORT番号は25です。 変更はできません。
RUN (<文字式1>[,<文字式2>][,<文字式3>])
SENDMAIL <メイル名> ATTACH ; [FILE <ファイル名>|MEMO <メモフィールド名>] ; TYPE <MIMEタイプ> ; [NAME <ファイル名2>]
DEFINE SENDMAILで定義してあるメイル名のメイルに添付するファイルを指定します。 FILEで添付するファイル名を指定します。 MEMOを指定するとメモフィールドの内容を添付します。 TYPEで添付するファイルのMIMEタイプを指定します。 NAMEは添付ファイルがセーブされるときのファイル名です。 添付されるファイル名と違うとき、メモフィールドから添付するときのオプションです。
添付ファイルのMIMEのサンプル
テキストファイルのときは
text/plain .prgを送るときは text/plainです
text/plain
.prgを送るときは
text/plainです
後の文字タイプの指定などはARAGOが処理します。
gif、jpgは images/gif 、images/jpg などです。 .exeファイルは application/octet-stream .zipファイルは application/zip
gif、jpgは
images/gif 、images/jpg
などです。
.exeファイルは
application/octet-stream
.zipファイルは
application/zip
詳しくはほかの参考書をご覧ください。
SENDMAIL(<メイル名>[,<タイムアウト>])
DEFINE MAILで定義されたメイル名のメイルを送信します。 メイルサーバーに送信に成功すると1を返します。
タイムアウトはメールサーバーとの接続が成立するまでの待ち時間です。 この時間を超えると接続エラーになります。
SENDMAIL()は送信に失敗すると次のエラーを返します。
-1 : Socketのオープンに失敗しました、TCP/IPのWINSOCKがないのか機能していません。 -2 : From で指定するアドレスが間違えています。 -3 : Reply toで指定するアドレスが間違えています。 -4 : To で指定するアドレスが間違えています。 -5 : CC で指定するアドレスが間違えています。 -6 : BCC で指定するアドレスが間違えています。 -7 : 定義されているデータがないか間違えています。 -8 : SMTPのコマンドのQUITでエラーをメールサーバーから返されました。
-1 : Socketのオープンに失敗しました、TCP/IPのWINSOCKがないのか機能していません。 -2 : From で指定するアドレスが間違えています。 -3 : Reply toで指定するアドレスが間違えています。
-4 : To で指定するアドレスが間違えています。 -5 : CC で指定するアドレスが間違えています。 -6 : BCC で指定するアドレスが間違えています。 -7 : 定義されているデータがないか間違えています。
-8 : SMTPのコマンドのQUITでエラーをメールサーバーから返されました。
5 プログラミング
ARAGO for Internetのプログラミング
5.1 CGIの基本動作
ARAGOIのプログラムはCGIを利用したプログラムです。 というとえらく面倒くさいように見えますが、 一度仕組みがわかると、dBase IIな みの簡単なプログラムであることがわかると思います。 CGIとはWeb Serverの一つの機能です。 普通このサーバをhttpdと呼びます。 ApacheやIISが最も多く使われています。 普通に見ているwebページはTAGと よばれるentryfieldやpushbuttonなどのオブジェクト、文字などを記述したHTMLファイルと呼ばれるテキストファイルとして書かれた ものです。 httpdサーバがこのファイルをクライアントのBrowserの送ると、BrowserはそれらのTAGを解析し、entryfieldは entryfieldとして表示します。 このHTMLファイルにARAGOIを起動すように記述し(この機能をCGIと呼びます)、 プッシュボタンなり、リンクなりを選択することによって、 Browserはhttpdサーバに要求を送り、httpdサーバはそれを処理しARAGOIを起動します。 起動されたARAGOIは要求されたdataに基づき指定されたプログラムを実行処理しdataをHTMLファイルとしてhttpdサーバに返し、 httpdサーバはこれをBrowserに送ります。 いままでのARAGOでのプログラムでは、入力画面のプログラムと入力されたデータの処理部分のプログラムはひとつのプログラムにかかれていましたが、 ARAGOIでは、入力画面はHTMLで書かれ、その入力されたデータの処理プログラムをこのHTMLで書かれた入力画面の中で指定します。 ユーザーがデータを入力したあと、Browserのプッシュボタンを押すことによって、Browserは入力されたデータと起動されるプログラムの情報を httpdサーバに送り、httpdサーバは指定されたプログラムを起動し処理した結果をHTML形式でユーザーのBrowserに送り返し、 Browserはその受け取ったHTMLファイルを表示します。 いくつもの画面を持つ処理は、それぞれに対応するARAGOIのプログラムによって構成されているということになります。 それぞれのARAGOIのプロ グラムはhttpdサーバからのデータを読み込み、処理し、それをHTMLファイルとして、httpdサーバに返すと言うことになります。 今までのdBXLやARAGOWのプログラムでは、プログラムファイルとしては複数であっても、ひとつのプログラムと構成されていましたが、 ARAGOIはそれぞれのプログラムがそれ自体で完結していなければいけません。 一番最初の画面で入力されたデータは、その画面から起動されたプログラ ムには引き渡され、メモリ変数としてその呼ばれたプログラムの中では使用できますが、 そのままではそのメモリ変数の値は次のHTMLの中でもプログラム の中でも使えなくなります。 次のプログラムでその変数の値を利用するときは、処理プログラムの中で送り出すHTMLファイルの中に記述する必要がありま す。 dBXLやARAGOのプログラムでは最初のプログラムで変数を定義すれば、グローバル変数として、次の呼び出すプログラムでも参照できまし、 プログラ ムを終了するまでその変数が存在しました。
ARAGOIではそれぞれのプログラムで使われて変数は、当然そのプログラムの終了とともになくなります。 検索エンジンで検索をしていると、アドレスバーに http://www.infoseek.co.jp/Titles?qt=arago&internet=%A5%A4%A5%F3%A5%BF%A1%BC%A5%CD%A5%C3%A5%C8&btnchk=1&lk=noframes&qp=0&nh=10&svx=100600 などとかかれていますね。 次のページに行くと http://www.infoseek.co.jp/Titles?qt=arago&lk=noframes&qp=0&nh=&svx=460107&col=WW&rf=11&ud4=&wd=&nc=1&st=10 ここでqt=aragoは検索情報として、検索結果と一緒に送り返されています。 infoseekでは、この検索条件をINPUT TAG (entryfield)のデータとして送り返しています。この検索情報を表示させたくないときは、INPUT TAGでHIDDENを指定することで、 表示を禁止できます。 &xx=xxxxはそれぞれの変数名とデータです。 現在この引数の長さですが、一応1kbyteとなっているようですが、httpdサーバやBrowserの仕様によってことなるようです。 変数の値の引渡しの方法として、それ以外にサーバにユーザー情報の現在のデータをdbfなどに保存する方法があります。 しかしこれについては、 現在の アクセスしているユーザーを特定する方法などにいろいろと問題が発生します。 もちろん可能ですがとても面倒になります。 理由は、いくつかの例を考えてみます。 処理中に、ユーザーが作業を中断したり回線が切断されたとき、 どこから処理中のプログラムは再開されるのか? 同じPCから複数のBrowserを起動して同じ作業を異なったデータで処理したときの管理は? (BrowserにHIDDENでデータを送ったときは、それに対応するBrowserにそのデータが送られます。) 中断されたデータをいつ削除するのか? 永遠の保存することは、容量が破たんします。 と言うことはこれらの処理をすれば良いと言うことになりますが、これは上級者向けになりますので、ここでは説明しません。 5.2 ARAGOIからのHTMLファイルの送出 HTML このARAGOのコマンドは、filenameで指定するHTMLファイルを送出します。 HTML <filename> fulenameで指定されるファイルはHTMLのファイルです。 シンタックスが正しければ何をかいてもかまいません。 このfilenameで指定するファイルの中%記号を使うことで変数に値を引き渡すことができます。 OUTPUT() OUTPUT()コマンドは""でくくられた引数をそのままhttpdに返します。 OUTPUT("Content-type: text/html",2) head2='<html>' output(head2) &&here we need carriage return output("") &&here we need blank line for IIS , it's their bug!!!! head3='<head><title>title is a title</title></head>' && this is how comment in HTML but Front page does not support output('<!-- text for comment -->') output(head3) output('<body>') output("<p>こんにちわ</p>") ENDHTML="</body></html>" OUTPUT(ENDHTML)
他には
ファイルの内容をバイナリファイルとして出力します。 MOUTPUT() メモフィールドにあるバイナリファイルを出力します。
一番最初に送り出すContent-typeの部分に日本語のときは、shift-jisを指定するために次の行に代えてください。 output('Content-type: text/html; charset=shift-jis' ,2) 5.3 urlで CGIを呼ぶ
CDIを起動するには二つの方法があります。 urlとして記述する方法とFORMを使う方法です。
ここではurlのよる方法を解説します。
スクリプトを起動するハイパーリンクは、HTMLに直接次のように記述します。
Notepadに下のプログラムを打ち込み、ファイル名をsample1.htmlと指定し、Apacheのwwwの下にセーブしてください。
コメント
sample1.html
同じように次のプログラムを打ち込み、ファイル名をsample1.prgと指定し、Apache/cgi-binにコピーしてください。
sample1.prg
Apacheを起動して、browserのアドレスバーに
http://127.0.0.1/sample1.html
と打ち込んでください。
Browserの画面に Do you know my name ?が表示されていますね。 このDo you know my name ?をクリックするとプログラムsample1.prgを呼びます。
このsample1.prgを実行されると、 browserには
Sure ! Mr. 127.0.0.1
と表示します。
ではsample1.prgでは、OUTPUT()を使っていますが、HTMLコマンドを使ってみましょう。
sample1.prg を次のように書き換えます。
sample2.html
では同じようにbrowserのアドレスバーに
このsample1.prgを実行されると、 browserには、sample2.htmlのなかの%STRING1の値を sample1.prgの中で定義する値に変更しbrowserに次のように表示します。
urlによるCGIの起動については、これが全てです。とても簡単です。 複数のことなったARAGOIの.PRGを呼ぶurlを書くことに よって、異なった処理結果を返すことができます。
またOUTPUT()とHTMLの基本的な違いはおわかりになったと思います。 それぞれの状況に応じて使い分けてください。
どちらでも処理速度に大きな違いはありません。
5.4 FORMで CGIを呼ぶ
ここではFORMによる方法を解説します。これが一般的に良く使われるものです。
POSTでのCGIの起動ではCGIを呼び出すHTMLの中でFORM で使うTAGをFORM TAGでかこみ、 その中で指定するTYPE= "SUBMIT"で送り出されCGIを起動します。
sample3.html
FORM TAGの値はGETFORM()で取得できます。
詳しくはARAGOIDOC.HTMLを参照ください。
HTMLのシンタックスをいろいろ利用して、画面を設計してください。 HTMLエディタを利用して画面を作成し、TAGやデータを OUTPUTで出力したり、 HTMLで呼び出せるように、必要なデータを%変数に変更するなどして、作成してください。
それぞれの画面間のデータの引渡しにはTAGにHIDDENオプション使い渡すことができます。
まだ良く分からないときには、つぎの簡単な例からもう一度始めてみましょう。 よくある例ですがHello WorldをちょっとかえてHello あなたの名前と今日の日付を表示してみましょう。 最初に作るのがindex.htmlです、これはクライアントのbrowserにWWW Serverがアクセスされたとき最初に表示される画面です。
index.html Content-type: text/html <html> <head> <title>myfirstCGI</title> </head> <body> <form action="/cgi-bin/aragoi.exe?myfirst.prg" method="post"name="sssss"> <p>送信ボタンを押しましょう</p> <p><input type="submit" name="B1" value="送信"></p> </form> </body> </html>
index.html
このHTMLファイルはクライアントのBrowserに”送信ボタンを押しましょう”という文字列と送信と表示されたプッシュボタンを表示しま す。クライアントがこの送信ボタンを押すとBrowserはこの情報をurlエンコードしWeb Serverに送出します。 Web Serverはこのリクエストを評価し必要な環境変数をセットしaragoi.exeを起動します。 aragoiはmyfirst.prgというプログラムを実行します。 ARAGOIで使うmyfirst.prgを見てみましょう。
*myfirst.prg SET CENT ON && 年を4桁表示にする SET DATE TO JAPAN &&表示を日本の型にします DATE=DATE() &&今日の日付を変数DATEに代入 HELLO="Hello あなたの名前" &&HELLOに表示する文字列を代入 HTML myfirst.htm &&出力するhtmファイルを指定する *end myfirst.prg
これだけです。 &&はその行の後に続く文字列をコメントとして無視します。 それでは表示出力のためのhtmファイルを見てみましょう。
myfirst.htm Content-type: text/html <html> <head> <title>hello</title> </head> <body> <p>%DATE</p> <p>%HELLO</p> </body> </html>
myfirst.htm
だけです。空白行がありますが必ず入れてください。(HTTPの仕様として必要です。) この部分をHTMLエディタやNotepadなどで読み込み好きな色や位置を指定してください。 これだけでクライアントのBrowserには今日の日付とHelloあなたの名前が表示されます。 では次にWeb Serverの実行環境やServerからARAGOIに引き渡されている情報を表示してみましょう。 今使ったプログラムを少し直して見ます。 最初のindex.htmlのARAGOIで呼ぶプログラム名をmy2nd.prgに直します、あとはそのままです。 ARAGOIで使うmyfirst.prgを少し直してみましょう。
*my2nd.prg SET CENT ON && 年を4桁表示にする DATE=DATE() &&今日の日付を変数DATEに代入 HELLO="Hello あなたの名前" &&HELLOに表示する文字列を代入 *ここから環境変数を取得します AUTH_PASS=GETENV("AUTH_PASS") AUTH_TYPE=GETENV("AUTH_TYPE")CONTENT_LENGTH=GETENV("CONTENT_LENGTH") CONTENT_TYPE=GETENV("CONTENT_TYPE") GATEWAY_INTERFACE=GETENV("GATEWAY_INTERFACE") HTTP_ACCEPT=GETENV("HTTP_ACCEPT") HTTP_USER_AGENT=GETENV("HTTP_USER_AGENT") PATH_INFO=GETENV("PATH_INFO") PATH_TRANSLATED=GETENV("PATH_TRANSLATED") QUERY_STRING=GETENV("QUERY_STRING") REMOTE_ADDR=GETENV("REMOTE_ADDR") REMOTE_HOST=GETENV("REMOTE_HOST") REMOTE_IDENT=GETENV("REMOTE_IDENT") REMOTE_USER=GETENV("REMOTE_USER") REQUEST_METHOD=GETENV("REQUEST_METHOD") SCRIPT_NAME=GETENV("SCRIPT_NAME") SERVER_NAME=GETENV("SERVER_NAME") SERVER_PORT=GETENV("SERVER_PORT") SERVER_PROTOCOL=GETENV("SERVER_PROTOCOL") SERVER_SOFTWARE=GETENV("SERVER_SOFTWARE") *環境変数をすべて取得しました *end my2nd.prg
HTML my2nd.htm &&出力するhtmファイルを指定する では出力するHTMLファイルは次のようになります。
my2nd.htm Content-type: text/html <html> <head> <title>hello</title> </head> <body> <p>%DATE</p> <p>%HELLO</p> <p>AUTH_PASS:%AUTH_PASS</p> <p>AUTH_TYPE:%AUTH_TYPE</p> <p>CONTENT_LENGTH:%CONTENT_LENGTH</p> <p>CONTENT_TYPE:%CONTENT_TYPE</p> <p>GATEWAY_INTERFACE:%GATEWAY_INTERFACE</p> <p>HTTP_ACCEPT:%HTTP_ACCEPT</p> <p>HTTP_USER_AGENT:%HTTP_USER_AGENT</p> <p>PATH_INFO:%PATH_INFO</p> <p>PATH_TRANSLATED:%PATH_TRANSLATED</p> <p>QUERY_STRING:%QUERY_STRING</p> <p>REMOTE_ADDR:%REMOTE_ADDR</p> <p>REMOTE_HOST:%REMOTE_HOST</p> <p>REMOTE_IDENT:%REMOTE_IDENT</p> <p>REMOTE_USER:%REMOTE_USER</p> <p>REQUEST_METHOD:%REQUEST_METHOD</p> <p>SCRIPT_NAME:%SCRIPT_NAME</p> <p>SERVER_NAME:%SERVER_NAME</p> <p>SERVER_PORT:%SERVER_PORT</p> <p>SERVER_PROTOCOL:%SERVER_PROTOCOL</p> <p>SERVER_SOFTWARE:%SERVER_SOFTWARE</p> </body> </html>
my2nd.htm
これを実行すると最初にBrowserにindex.htmlが表示され、プッシュボタンを押すとすぐにmyfirst.htmが表示されます。その画面 には現在のWeb Serverの環境などが表示されます。 Web Serverによっては一部表示しないものがあります。 環境変数についてはCGIの環境変数の章をご覧ください。
5.5 デバッグとログファイル
デバッグは次の方法で実行してください。
DOSプロンプトで
C:\Apache\cgi-bin>ARAGOI sample1.prg として実行し、画面の期待したHTMLファイルの内容が表示されるかどうか見てください。
ARAGOWで実行すると、OUTPUTウィンドウにその出力される内容が表示されます。
どちらでもエラーもなく動作するがBrowserからアクセスできないときは、 httpdのlogファイルを見てください。
logファイルはerror.logとaccess.logの二種類あります。 アクセスログがBrowserから送り出されたコマンドのヒス トリです。
エラーログは、それらのアクセスのなかで発生したエラーのヒストリです。 これにはCGIで返したhtmlフォーマットでのエラーとアクセスし たコマンドのエラーの両方が書かれています。 エラーを修正した後は、作業効率を上げるためにlogファイルを削除して、ヒストリを空にしてください。
5.6 プログラミングでの注意
処理速度
最初のOUTPUT("Content-type: text/html",2)から最後のOUTPUT("</html>")間の処理時間を最大限短くしてください。
もちろん全体のプログラム自体は簡潔に、loopを使うときは部分ごとに、ARAGOWでテストプログラムを作り、最適化してください。
アクセスしているユーザーはアクセスを中断しプログラムの作業を中断することは良くあります。 プログラムはそれに対処してください。
他からあくセウしている、.PRGを変更するときは充分注意してください。
アクセスされているDBFをFTPなどで更新しないでください。 他からのアクセスと衝突しARAGOIがエラー表示します。
ARAGOIは、エラーをエラー番号とともに返します。 外に公開するときには、 ON ERRORで処理してください。
一般的には何もしない処理プログラムでもかまわないかと思います。 しかしエラーが発生する可能性はsecurity上も危険です、 充分デ バッグして安全なものを公開してください。
CGIが動作するPCはできるだけ早いものをお使いください。 メモリを256Mbyte以上にしても全体のスピードはそれほど向上しません。 むしろ HDDはアクセススピードが早いものを使用してください。
Apacheなどではlogファイルが大きくなると、システム全体のレスポンスをとてつもなく遅くします。
異常に遅くなったときは、順番にサービスを止めて確認してください。
必ずBROWSERは何種類かのBrowserで動作確認してください。
開発時の注意
開発用のPCにhttpdをインストールするときはサービスとしてはインストールしないことをお勧めします。
ipを127.0.0.1にしても、当然外部から、そのPCのipで(DHCPが振り分け様が)アクセスできます。
作業用のPCがGATEWAYやNATを使用せずに、直接外部とつながっている時は、security上PCを回線から切断することをお勧めし ます。 たかが数時間だからと思っても、logファイルを見ると、httpをスタートして数分で、ウイルスや外部からの攻撃を受けることがあります。 充 分に注意してください。
また作業がhttpを使用せずにできるときは、面倒でもhttpdを終了してください。
5.7 日本語の処理での注意
CGIから送り出したhtmlの表示が、文字化けすることがあります。 Browserによって動作が違うなどがおきます。
またhttpdによっても動作がことなることがあります。 httpdIに最初に、送り出すContent-typeにcharsetの指定を 次のように追加ください。
Content-typeの部分に日本語のときは、shift-jisを指定するために次の行に代えてください。 output('Content-type: text/html; charset=shift-jis' ,2)
また<HEAD>に次のMETA指定を入れてください。 これは必ずしも全てのBrowserが、正しく対応しているとも思えませ んが、念のためです。
<HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=shift-jis"> <TITLE>Your Page</TITLE> </HEAD>
6.1 アクセスカウンタ
それではWebに何人のユーザーがアクセスしたかを表示するアクセスカウンターをつけてみましょう。 プログラムを簡単にするためにindex.htmlをアクセスするとカウンターが表示されるようにします。 ここで使用するcounter.dbfは何人目のためのnumberという数値型のフィールドだけです、このデーターベースファイルはレコードが一つしか ありません。 ここでデータベースファイルを使うのは、ARAGOIは.dbfを自動的にはいた制御しています。複数のユーザーからアクセスされたときの処理を考慮する 必要ありません。 データベースファイルはARAGO for Windowsで作成してください。作成しただけではレコードがありません、append blankなどでレコードを作製してください。
counter.prg luckeynumber=7777 use counter.dbf go top && just in case howmany=0 && initialize luckey='' howmany=number &&人数のデータを取得 if howmany=luckeynumber luckey='おめでとう7777人目の方です' endif howmany=howmany +1 replace number with howmany use html count.htm
counter.prg
なにも飾り気もありませんがこれで何人目かを取得できました。 ではこれを呼び出すHTMLファイルを先ほど使ったindex.htmlを直しましょう。 <form action="/cgi-bin/aragoi.exe?myfirst.prg" method="post"name="sssss"> の?myfirst.prgを?counter.prgにします。 ではHTMLコマンドで出力するファイルは
count.htm Content-type: text/html <html> <head> <title>hello</title> </head> <body <p>ようこそ</p> <p>%luckey</p> <p>あなたは%howmany人目です</p> </body> </html>
count.htm
これでユーザーのBrowserに”ようこそ””あなたはxxx人目です”と表示されます。7777人目の人にはおめでとうと表示します。 もし7777でないとBrowserの画面にはなにも表示されません。 実際にはカウンターは.gifファイルをそれぞれの数字のところ使い見栄えをよくします。 表示される数字の.gifファイルを右端、左端と中に表示するために複数の数字の.gifファイルとhowmanyで得る数字を関連付けて扱うことができ ます。 アクセスした一番最初の画面にこのカウンターを表示するにはいくつかの方法がありますが、ここにある方法ではIISでは動作しません。サーバーサイドイン クルードが動作するWeb ServerですとつぎのTAGを最初に表示されるHTMLファイルに埋め込むことでできます。
index.html <p> あなたは<!--#exec cgi="/cgi-bin/aragoi.exe?counter.prg"-->人目です。</p> counter.prgは次のようになります。 counter.prg go top && just in case use counter.dbf howmany=number &&人数のデータを取得 howmany=howmany+1 replace number with howmany use output(howmany)
index.html <p> あなたは<!--#exec cgi="/cgi-bin/aragoi.exe?counter.prg"-->人目です。</p> counter.prgは次のようになります。 counter.prg
です。 また.gifでビットマップファイルでカウンタを表示するには
<IMG SRC="/cgi-bin/aragoi.exe?counter.prg">
としてこのcounter.prgはoutput()を使い.gifファイル名を返します。
gifを使ったサンプルを見る
6.2 会員管理
会員名とIDから一部情報を表示確認のプログラム 会員名とユーザーIDを入力させ、確認のためのデーターベースの一部情報を表示、もし必要なら再度パスワードを入力させる。
index.html <html> <head> <title>MEMBER</title> </head> <body> <form action="/cgi-bin/aragoi.exe?user.prg" method="post" name="sssss"> <p>邦楽研究会へようこそ</p> <p>名前を入力してください: <input type="text" size="20" name="T1"></p> <p>IDを入力してください: <input type="text" size="20" name="T2"></p> <p><input type="submit" name="B1" value="送信"></p> </form> </body> </html>
このdeault.htmはBrowserに 邦楽研究会にようこそ 名前を入力してください: IDを入力してください: そして送信プッシュボタンが表示されます。 user.prgではまず名前とIDがどちらも入力されているかを確認するためT1とT2の値が空白でないかを調べます。 次に名前を検索しそのレコードのIDと入力されたT2の値が同じかを調べます。 もしT1かT2が入力されていないときはもう一度前の画面に戻り入力してくださいというtryagainhtmを表示します。 名前で検索したとき見つからないとき、またはIDが誤っているときは再入力を要求する画面を表示します。 もし分からないときは電話をかけるかemailを送るようにというHTML画面を表示します。 ユーザーのアクセスが正しければユーザーの情報を表示します。
*user.prg NAME=GETFORM("T1") ID=GETFORM("T2") &&ここで入力されている値を変数に代入 * .dbf USRNAME C, IDCODE Char * .NDX set to USRNAME USE USRINFO.DBF INDEX USRNAME DO CASE CASE ISBLANK(NAME) .AND. ISBLANK(ID)= .T. reason='名前とIDを入力しなおしてください' HTML tryagain.htm &&ARAGOIはHTMLを出力するとターミネートします。 CASE ISBLANK(NAME)=.T. reason='名前を入力してください' HTML tryagain.htm CASE ISBLANK(ID)=.T. reason="IDを入力してください" HTML tryagain.htm otherwise IF SEEK(NAME) IF ID=IDCODE HTML success.htm" ELSE hello=NAME+"さん" reason='IDが違います、確認して入力してください' HTML tryagain.htm ENDIF ELSE reason='名前が見つかりません、もう一度入力してください。' HTML tryagain.htm ENDIF html myfirst.htm endcase tryagain.htm <html> <head> <title>TRYAGAIN</title> </head> <body> <form action="/cgi-bin/aragoi.exe?user.prg" method="post" name="sssss"> <p>%reason</p> <p>名前を入力してください: <input type="text" size="20" name="T1"></p> <p>%hello</p> <p>IDを入力してください: <input type="text" size="20" name="T2"></p> <p><input type="submit" name="B1" value="送信"></p> <p>よく分からないときは邦楽研究会会員管理部に電話をするか、emailボタンを押してemailを</p> <p>送って連絡確認してください。</P> <p><a href="mailto:cuservice@yourcompany.com">emailで連絡</a></p> </form> </body> </html>
*user.prg
tryagain.htm
名前とIDが一致したらとりあえずこのプログラムは成功したので情報を返したいのですがサンプルですので簡単にするため前に使ったmyfirst.htm を返しています。Aタグを使いhrefでmailtoで指定するurlへemailを送るための
6.3 guestbook
Webをアクセスしたユーザーの名前やemailアドレス、コメントなどを記録するためのものです。もちろんいろいろに変更し利用することがで きます。 パスワードをデータベースからチェックしその上で在庫状況を表示したり、商品の細かい説明をデータベースから検索表示したりできます。企業内のWANをコ ストダウンするためにもInternetを利用し、一方でWebを一般の外部に公開するのも新しい可能性を探る方法かと思います。確認ボタンを押すと CGIを通してguest.prgが起動されます。この画面で得た情報はT1,T2,T3のオブジェクト名で渡されます。
guest.htm <html> <head> <title>GUESTBOOK</title> </head> <body> <form action="/cgi-bin/aragoi.exe?guest.prg" method="post" name="sssss"> <p>Back Packer's Forum <br> ご意見、ご希望、発言などを記入してください<br> 登録された方には最新の情報をemailします</p> <p>名前を入力してください <input type="text" size="30" maxlength="40" name="T1"></p> <p>emailアドレスを入力してください <input type="text" size="30" maxlength="40" name="T2"></p> <p>コメントを入力してください</p> <p><textarea name="T3" rows="10" cols="80"></textarea></p> <p>入力したら確認ボタンを押してください</p> <p><input type="submit" name="B1" value="確認"></p> </form> </body> </html>
guest.htm
このguest.prgはとてもコンパクトです、単にT1,T2,T3の値をname,email,commentのARAGOの変数に代入し CONFIRM.HTMを読み出しWeb Serverを通してユーザーのBrowserに情報を返します。
*guest.prg name=getform('T1') email=GETFORM("T2") comment=GETFORM("T3") HTML CONFIRM.HTM
*guest.prg
ユーザが前回の画面で入力した値はBrowser以外は保存していません、そこでもう一度hiddenのデータとして送り返し再度受け取るようにしてあり ます。hidden は画面になにも表示しませんが、inputとしてname=で指定する変数名にvalue=で指定するデータを対にして送り出します、この値は GETFORM()で取得できます。
confirm.htm Content-type: text/html <html> <head> <title>confirm</title> </head> <body> <p>入力された内容は次のとおりです。確認してOKでしたら送信ボタンを押してください。</p> <p>お名前:%name</p> <p>emailアドレス:%email</p> <p>あなたのコメントは次のとおりです</p> <hr> <p>%comment</p> <form action="/cgi-bin/aragoi.exe?write.prg" method="post"name="sssss"> <p><input type="hidden" size="30" maxlength="40" name="T1" value="%name" ></p> <p><input type="hidden" size="30" maxlength="40" name="T2" value="%email" ></p> <p><input type="hidden"name="T3" size="50" maxlength="240" value="%comment"></p> <p>OKですか?</p> <p><input type="submit" name="B1" value="送出"></p> </form> </body> </html>
confirm.htm
write.prg hiddenで送られたデータを再度読み込みguestbook.dbfにセーブします。セーブが終わるとTHANKS.HTMでありがとうございました XXXさんとし日付と何件目の書き込みかを返しています。 GUESTBOOK.DBFの構造は次のとおりです、 サイズは必要に合わせて指定してください。 NAMEFIELD 文字型 EMAILFIELD 文字型 MEMOTXT 文字型 TIME 日付型
*write.prg SET LANG TO JAPAN name=GETFORM("T1") email=GETFORM("T2") comment=GETFORM("T3") DATE=DATE() USE GUESTBOOK GO BOTTOM APPEND BLANK RECORDS=str(RECCOUNT()+1) REPLACE NAMEFIELD WITH NAME REPLACE EMAILFIELD WITH EMAIL REPLACE MEMOTXT WITH comment REPLACE TIME WITH DATE() USE HTML THANKS.HTM
*write.prg
実際のプログラムでは、SET COMPATIBLE OFFを一時的に使いT3で送られてくる数が255バイトを超えても処理できるようにし、SET MEMOWIDTHでメモフィールドの一行の長さを指定し、MEMLINE()でそれぞれの行をとり表示するほうがベターでしょう。 Web に新しいb-ジョンを乗せておきます。
THANKS.HTMは書き込まれて後に現在ある内容をすべてみるかそれともホームページに戻るかを聞きます。 次のurlは環境にあわせて設定してください、virtualで設定されているのか、すべて同じディレクトリにあるのかによってかわります。HTMLの参 考書をご覧ください。
<p><a href="/wwwroot/test/index.html">前に戻る</a> thanks.htm Content-type: text/html <html> <head> <title>THNAKS</title> </head> <body> <p>%NAMEさん どうもコメントありがとうございました</p> <p>今後ともよろしくお願いします</p> <p>%RECORDS番目のコメントです</p> <p>%DATE</p> <hr> <p><a href="/wwwroot/test/index.html">前に戻る</a> <p>すべてのゲストブックの内容を見るときはリストを見るを押してください</p> <form action="/cgi-bin/ARAGOI.exe?list.prg" method="post"name="sssss"> <p><input type="submit" name="B1" value="リストを見る"></p> </form> </body> </html>
<p><a href="/wwwroot/test/index.html">前に戻る</a> thanks.htm
このリストプログラムはOUTPUT()を利用しています。つぎのカレンダーと異なりテーブル表示をしていません、ただ読み込み表示しているだけです。も ちろん前の画面でいつからいつまでを表示するとかいろいろ加工できると思います。
*list.prg SET LANGUAGE TO JAPAN use guestbook OUTPUT("Content-type: text/html",2) head2='<html>' output(head2,1) &&here we need carriage return output("",1) &&here we need blank line for IIS , it's their bug!!!! head3='<head><title>COMMENT</title></head>' output(head3) output('<body>') go top count=0 do while .not. eof() count=count+1 nameandemail='<p>名前 :'+namefield+' email '+emailfield+'</p>' OUTPUT(nameandemail) OUTPUT('<hr>') comment= '<p>コメント: ' +SUBSTR( memotxt,1,40) + '</p>' OUTPUT(comment) comment2= '<p>' +SUBSTR( memotxt,41,80) + '</p>' OUTPUT(comment2) comment3= '<p>' +SUBSTR( memotxt,81,120) + '</p>' OUTPUT(comment3) line=replicate('-',40) OUTPUT(line) skip enddo records=STR(count) OUTPUT('<p>'+records+'件の書き込みです</p>') output("<p>動きましたか</p>") ENDHTML="</body></html>" OUTPUT(ENDHTML)
*list.prg
6.4 複数のレコードからのテーブル表示
このプログラムはschedule.dbfをオープンしその内容をテーブルにして表示します。 OUTPUT()を使っていますので、HTMLファイルは 使いません。 HTMLのすべての出力はARAGOIのプログラムとして扱われます。 <html>の出力の後に改行がありますが、IISではこれがないとcgiエラーになります。行の最初の日付の項目をクリックするとカレン ダープログラムが起動されます。 href://urlをはずすとはるかに早くなります。 大量のデータを送出可能性があるときはtableを使うと</table>を出力するまで送出しませんのでクライアントはだいぶ待たされま す、数百件以上の場合は<table>をさけaragoiでフォーマットして行で送り出すほうが効率的です。 schedule.dbfの構造は次のとおりです。 DATEFIELD 日付型 SECTIONFIE 文字型 EVENTFIELD 文字型 CONTACT 文字型 インデックスファイルはDATEFIELDにDATEFIELDという名前で作られてます。ARAGO for WindowsでINDEX ON DATEFIELD TO DATEFIELDとして作成してください。 このサンプルプログラムはどれか適当なHTMLからaction="url"として呼び出してください。
testcal.prg use schedule inde datefield set cent on &&年を4桁にする OUTPUT("Content-type: text/html",2) head2='<html>' output(head2,1) &&here we need carriage return output("",1) &&here we need blank line for IIS , it's their bug!!!! head3='<head><title>title is a title</title></head>' *&& this is how comment in HTML but Front page does not support output *('<!-- text for comment -->') output(head3) output('<body>') begweek=str(month(datefield))+"月"+str(day(datefield))+"日" theday='<p>今日は'+begweek+'の週です</p>' output(theday,1) tablehead='<table border>' output(tablehead) &&begin table with border * && if you dont need border just delete border. con=contact counter=0 do while .not. eof() counter =counter + 1 &&何件かを取得 eachdate='<tr><td >' + dtoc(datefield) event='<td>'+eventfield + '</tr>' section='<td>'+sectionfie output(eachdate) outeach=section+event output(outeach,1) skip enddo output('</table>') &&テーブルの終わり countern=str(counter) &&数値型を文字型に変換 counternum='<p>'+ countern +'</p>' output(counternum) output("<p>動きましたか</p>") ENDHTML="</body></html>" OUTPUT(ENDHTML)
testcal.prg
これでテーブルにして出力します。
6.5 カレンダ
このカレンダープログラムもほかのHTMLファイルからaction=urlとして呼びます。
<p><a href="cgi-bin/guest.htm"><font size="4">書き込みのページ</font></a><font size="4"> </font></p>
データベースはサンプル6とおなじです。
schedule.dbfの構造は次のとおりです。
DATEFIELD 日付型 SECTIONFIE 文字型 EVENTFIELD 文字型 CONTACT 文字型
インデックスファイルはDATEFIELDにDATEFIELDという名前で作られてます。ARAGO for WindowsでINDEX ON DATEFIELD TO DATEFIELDとして作成してください。
同じプログラムを別のHTMLから呼び出しています。 caseで条件を見ています。
calendar.prg *calendar.prg set cent on year=year(date()) month=month(date()) date=day(date()) whichone=GETARG(2) do case case isblank(whichone)=.t. &&同じ 同一プログラムを呼んでここで処理を分ける &&whichoneが空のときはmonth.htmを呼ぶ for i = 1 to 35 ci = str(i,2,0,"0") mdate&ci =day(date()-dow(date())+i) && Create Variables mdate01 to mdate35 next HTML month.htm case substr(whichone,1,1)="d" OUTPUT("Content-type: text/html",2) head2='<html>' output(head2,1) output("",1) head3='<head><title>THEDAY</title></head>' output(head3) output('<body>') todays='<p align="left">今日は'+ str(year) +'年'+str(month) +'月'+ str(date) +'日です。</p>' output(todays) use schedule inde datefield seekdate=date()+val(substr(whichone,2,2))-dow(date()) counter=0 if seek(seekdate)=.T. output('<table border>') do while .not. eof() do while seekdate=datefield counter =counter + 1 &&何件かを取得 eachdate='<tr><td >' + dtoc(datefield) section='<td>'+sectionfie event='<td>'+eventfield +'</tr>' output(eachdate) outeach=section+event output(outeach,1) skip enddo exit enddo use output('</table>') endif if counter=0 howmany='<p>何もありません</p>' else howmany='<p>'+str(counter)+'件見つかりました</p>' endif OUTPUT(howmany) output("<p>動きましたか</p>",1) ENDHTML="</body></html>" OUTPUT(ENDHTML,1) case substr(whichone,1,1)="w" &&Week process OUTPUT("Content-type: text/html",2) head2='<html>' output(head2,1) output("",1) head3='<head><title>WEEK</title></head>' output(head3) output('<body>') todays='<p align="left">今日は'+ str(year) +'年'+str(month) +'月'+ str(date) +'日です。</p>' output(todays) use schedule inde datefield *&&first day of the week week=val(substr(whichone,3,1)) seekdate=date()-dow(date()-1)+7*(week-1) endseek=seekdate+6 counter=0 if seek(seekdate)=.T. output('<table border>') do while .not. eof() do while seekdate<=endseek do while seekdate=datefield counter =counter + 1 &&何件かを取得 eachdate='<tr><td >' + dtoc(datefield) section='<td>'+sectionfie event='<td>'+eventfield +'</tr>' output(eachdate) outeach=section+event output(outeach,1) skip enddo seekdate=seekdate+1 enddo exit enddo use output('</table>') endif if counter=0 howmany='<p>何もありません</p>' else howmany='<p>'+str(counter)+'件見つかりました</p>' endif OUTPUT(howmany) output("<p>動きましたか</p>",1) ENDHTML="</body></html>" OUTPUT(ENDHTML,1) endcase *dayandmonth=STR(month(datefield))+"月"+STR(day(datefield))+"日"
calendar.prg
次のhtmlはカレンダーの表示のHTMLです。 ファイル名はmonth.htm
Content-type: text/html <html> <head> <title>monthtable</title> </head> <body> <p align="center"><font size="4"><strong>こもも、さかな、ジャムジャム カンパニー 社内スケジュール</strong></font></p> <p align="center">日を押すとその日のスケジュール</p> <p align="center">Weekを押すとその週のスケジュールがでます。</p> <p align="left">今日は %year年%month月%date日です。</p> <table border="5" width="100%"> <tr> <td width="12%"> </td> <td width="12%">Sunday</td> <td width="12%">Monday</td> <td width="12%">Tuesday</td> <td width="13%">Wednesday</td> <td width="13%">Thursday</td> <td width="13%">Friday</td> <td width="13%">Sataday</td> </tr> <tr> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+wk1">Week 1</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d01">%mdate01</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d02">%mdate02</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d03">%mdate03</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d04">%mdate04</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d05">%mdate05</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d06">%mdate06</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d07">%mdate07</a></td> </tr> <tr> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+wk2">Week 2</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d08">%mdate08</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d09">%mdate09</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d10">%mdate10</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d11">%mdate11</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d12">%mdate12</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d13">%mdate13</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d14">%mdate14</a></td> </tr> <tr> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+wk3">Week 3</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d15">%mdate15</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d16">%mdate16</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d17">%mdate17</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d18">%mdate18</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d19">%mdate19</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d20">%mdate20</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d21">%mdate21</a></td> </tr> <tr> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+wk4">Week 4</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d22">%mdate22</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d23">%mdate23</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d24">%mdate24</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d25">%mdate25</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d26">%mdate26</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d27">%mdate27</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d28">%mdate28</a></td> </tr> <tr> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+wk5">Week 5</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d29">%mdate29</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d30">%mdate30</a></td> <td width="12%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d31">%mdate31</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d32">%mdate32</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d33">%mdate33</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d34">%mdate34</a></td> <td width="13%"><a href="http://ftp.soupacific.com/cgi-bin/ARAGOI.exe?calendar.prg+d35">%mdate35</a></td> </tr> </table> <p><a href="mailto:scheadule@yourcompany.com">スケジュール追加連絡</a>< /p> </body> </html>
以上です。
最初の画面は This is a first screen 今日は1999年11月12日水曜日
Sun Mon Tue Wed Thu Fri Sat Week1 3 4 5 6 7 8 9 Week2 10 11 12 13 14 15 16 Week3 17 18 19 20 21 22 23 Week4 24 25 25 27 28 29 30 Week5 31 1 2 3 4 5 6
Weekのところを押すとその週にある予定、日にちを押すとその日の予定です。 今日は1999年11月12日水曜日 営業 棚卸し 特販 総務 健康診断 基本的には過去は表示しないが損集の日曜日から表示します。 今日は1999年11月12日水曜日 Mon 11 営業 棚卸し準備 技術 商品完成 総務 健康診断 Tue 12 と表示します。
実際の動作サンプルを見 る
ARAGOIやcgi-binを置くディレクトリ名またどこにそのディレクトリを置こうとかまいません、ただし必ずそのディレクトリのプロパリ ティーを設定しアクセス権を明らかにしてください。Webが外部に公開されていますのでどんな問題を起こされるかわかりません。普通の業務プログラムです と動作がおかしいと操作している人が何かいいますが、一般に公開されているWebですとCGIエラーなどと表示されるとアクセスしている人もあきれてただ 無視して通り過ぎていくでしょう。また悪意の人がもしそのディレクトリにアクセスできたりするとファイルを改変したり削除したりしたらいろいろ問題が発生 します。 十分注意してください。
Webの運営上誰もが思い付くような名前のディレクトリはsecurityのために好ましくありません。 たとえばドメイン名のディレクトリとか個人名のディレクトリ、よく参考書に出てくるサンプル用のディレクトリ名などです。
MFCなどのシステムでDLL以外のARAGOのすべてのファイルはこのCGIディレクトリにコピーされます。 実際の運用に入る前に必ず別のディレクトリ名に変更することをお勧めします。 securityの項を必ず読でください。
セットアップする先のディレクトリを決める
Apacheをインストールする時はインストールプログラムがインストール先を聞いてきます。 このときにrootにディレクリを作成してくだ さい。IISをセットアップすると自動的にディレクトリが作られるます、またProxy ServerをインストールするとInetpubが作られます。IISではまたネットワークからARAGOIで使用するWebの仮想ディレクトリ cgi-binにあるファイルを変更するにはDOMAINへのアクセス権、ディレクトリの変更権が必要です。
SETUPは自動的にディレクトリの候補を表示します、確認してください。 もしcgi-binがなければ指定されたディレクトリの下にcgi-binを作成します。ディレクトリ名は必ずしもcgi-binでなくても構いません が、一般的なディレクトリ名です。
IISではcgi-binの設定をIIS managerを起動しWWWを選択しその中のディレクトリの設定を変更してください。 Read only、(読取専用)、execute、(実行)にしてください。 また そのディレクトリをBrowserから見えなることがないようにvirtualディレクトリとして設定してください。virtualディレクトリと は実際のディレクトリに別の名称を与えWeb Serverに実際のディレクトリのように管理させます。virualディレクトリ名と実際のディレクトリ名が異なってもかまいません。 サンプルプログラムでは/cgi-bin/となっています。
Apacheではインストールすると、自動的にcgi-binを作成します。 このディレクトリ名を変更することもできます。confファイルでcgiの 実行ディレクトリを指定します。 詳しくい説明は後で出てきます。
ディレクトリの例
USE .\database\customer.dbf index .\database\name.ndx
のように明示的に相対PATH'で指定してください、 SET PATH TOやCDなどのよく使うARAGOのコマンドですがARAGOIでは使わないようにしてください、securityの問題もありますがWeb ServerがCDでディレクトリを変更されたときにWeb Server自体の動作がおかしくなることがあります。 またARAGOIを呼び出すときもARAGOIからファイルを呼び出すときも必ず絶対PATHを指定しないで、virtualディレクトリを使用してくだ さい。このvirtualディレクトリはWWWのpropertyの設定で指定してください。指定を間違えるとBrowserがファイルのダウンロードを しようとしてみたり、ACCESS FORBIDDENなどのエラーがBrowserに表示されてしまいます。
ディレクトリ名は必ずしもcgi-binでなくても構いませんが、一般的なディレクトリ名です。cgi-binの設定をIIS managerを起動しWWWを選択しその中のディレクトリの設定を変更してください。 read only、(読取専用)、execute、(実行)にしてください。 またそのディレクトリをBrowserに見せることがないようにvirtualディレクトリとして設定してください。 virtualディレクトリとは実際のディレクトリに別の名称を与えWeb Serverの実際のディレクトリのように管理させます。 virualディレクトリ名と実際のディレクトリ名が異なってもかまいません。 サンプルプログラムでは/cgi-bin/となっています。 日本ではディレクトリの区切り記号として¥(back slash)がDOSやWindowsに使われていますが、UNIXでは/記号になっています。ARAGOでも/と\記号はどちらもディレクトリの区切り 記号として扱います。 ARAGOIを呼び出すときはaction="aragoi.exe?abc.prg"で行いますが、IISではIISとCGIアプリケーションをレジス トリーの設定によって関連感ずけられることになっていますがうまく動きません。 Web ServerにはCGIアプリケーションの関連付けする設定があります。動作するようでしたらARAGOIを入れたディレクトリと別のディレクトリにプロ グラムファイルを置くことができます。 その場合は呼び方も次のようになります。 action="/cgi-bin/abc.prg"となります。 それ以外では現在のところARAGOIとプログラム名を同時に送らなければなりません。 IISを使っているときは次のようにレジストリーを書き換えてください。
//HKEY_LOCAL_MACHINE /SYSTEM /CurrentControlSet /Services /W3SVC /Parameters /Script Map ".idc"="D:\WINNT\System32\inetsrv\httpodbc.dll" ".prg"="c:\aragow\bin\aragoi.exe %s %s"
レジストリ内容を変更したら、Internet Service Managerで、 WWWのサービスを中止してから WWWサービスを開始します。 ブラウザのURLに次のように入力します。 http:///cgi-bin/calendar.prg これで、トラブルなく動作するはずですが...。 上記のよ、に設定したにもかかわらず動作しないときは、 次のレジストリ内容を確認してください。
//HKEY_LOCAL_MACHINE /SYSTEM /CurrentControlSet /Services /W3SVC /Parameters この中に、"CreateProcessWithNewConsole"を作成します。 Value Name: CreateProcessWithNewConsole Data Type: REG_DWORD Data Value = 1
これで、またWWWサービスを中止と開始を繰り返します。 ブラウザのURLに次のように入力します。 http:///cgi-bin/calendar.prg どうでしょうか。
7.2 Apacheサーバーのディレクトリの設定
CGIの実行するためにaccess.cnfを次のを参考にして直してください。
ここから大事なCGIの部分です、まずどこにCGIの実行プログラムがあるかを指定します。ここで注意することはApacheからの相対で はwwwのルートと同じレベルです。決してwwwの下には置かないで下さい。 <Directory "C:/Apache/wwwspcroot"> このディレクトリーで(当然その下のでも)の制限。 ###ScriptAlias /cgi-bin/ /apache/cgi-bin/ ScriptAlias /cgi-bin/ /apache/cgi-bin/ /cgi-binと指定するバーチャルディレクトリーは/apache/cgi-binと指定してます。 # To use CGI scripts: ###AddHandler cgi-script .cgi AddHandler cgi-script .prg ここではcgiで実行されるscriptが拡張子が.prgのときはcgiの実行scriptであると指定します。 さてここで基本的なApacheのディレクトリごとのアクセス管理を説明します。 Options ExecCGI これを指定しないとcgiを実行できない。 ExecCGImoduleをロードする。 ###Options Indexes FollowSymLinks コ メントアウト、Intranetでは便利かもしれません。 AllowOverride None他のディレクトリをアクセスさせるか? order allow,deny allow from all </Directory>
ここから大事なCGIの部分です、まずどこにCGIの実行プログラムがあるかを指定します。ここで注意することはApacheからの相対で はwwwのルートと同じレベルです。決してwwwの下には置かないで下さい。
<Directory "C:/Apache/wwwspcroot"> このディレクトリーで(当然その下のでも)の制限。
###ScriptAlias /cgi-bin/ /apache/cgi-bin/ ScriptAlias /cgi-bin/ /apache/cgi-bin/
/cgi-binと指定するバーチャルディレクトリーは/apache/cgi-binと指定してます。
# To use CGI scripts: ###AddHandler cgi-script .cgi AddHandler cgi-script .prg
ここではcgiで実行されるscriptが拡張子が.prgのときはcgiの実行scriptであると指定します。
さてここで基本的なApacheのディレクトリごとのアクセス管理を説明します。
Options ExecCGI これを指定しないとcgiを実行できない。 ExecCGImoduleをロードする。
###Options Indexes FollowSymLinks コ メントアウト、Intranetでは便利かもしれません。
AllowOverride None他のディレクトリをアクセスさせるか? order allow,deny allow from all
</Directory>
orderは allowが先でdenyが 後と指定し
allow from soupacific.comとかipとかを入れる。 復数列挙できる。
passwordファイルの指定をここでやる。
ではCGIは
# /apache/cgi-bin should be changed to whatever your ScriptAliased # CGI directory exists, if you have that configured. <Directory /apache/cgi-bin> AllowOverride None ###Options None ここをコメント Options ExecCGI cgiを使えるようにする <Limit post> 制限始まり Order Deny,Allow Allow from ALL これでどこからでもアクセスできる。 </Limit> 制限してい終わり </Directory> <Directory /apache/cgi-bin> AllowOverride ALL Script PUT /cgi-bin/bswrite.prg </Directory>
ここではApacheのmoduleのCGIを実行するmoduleを指定するときにIndexesやFollowSymlinksをさせない こと
###Options Indexes FollowSymLinks Options ExecCGI
CGIを実行でPOSTの制限
<Directory /apache/cgi-bin> AllowOverride None ###Options None コメントアウト Options ExecCGI <Limit post> Order Deny,Allow Deny from ALL Allow from ALL </Limit> </Directory>
CGIを実行でPUTの制限
<Directory /apache/cgi-bin> AllowOverride ALL Script PUT /cgi-bin/bswrite.prg PUTが来たときに必ず実行されるScriptを指定 </Directory>
他の情報はInternet 入門6 ApacheのインストールとARAGOでCGIを使う を見てください。
詳しいディレクトリの管理やvirtualディレクトリについてはそれぞれのWeb Serverの資料を参考にしてください。
OUTPUT()はデフォールトでは改行を出力します。 ですからもう一つ改行するためにOUTPUR("",2)として改行してください。 またHTTPの規格でcgiが返すHTTPステータスとして次のようなものがありますが、Browserに表示されてしまうことがあります。 HTTP/1.0 200 OK \n\n ARAGOIでは\は要りませんが、この行の後にoutput('')をしてください。
Web ServerからCGIにデータを渡す方法に二つあります。 一つはコマンドラインの引数としてもう一つは環境変数としてです。 Serverが CGIを起動するときに設定します。
path_info= GETENV("PATH_INFO")
GETENV()は環境変数を取得するARAGOの関数です。
セキュリティーを持つために例えば環境変数でユーザーのIPを確認することはREMOTE_ADDRでとることなどができます。
10.HTTP ERROR STATUS
STATUS コードはHTTPプロトコルのエラーをあらわします。CGIプログラムからこれらの値を返すこともできます。通常は200 OKを返していますが204 No responceを返すと表示を更新しません。入力された値がエラーのときなどに使います。これらのステータスコードはBrowserによっては単にその エラー番号が表示されるだけのときもあります。ARAGOIは指定された.prgファイルがエラーを起こしたときに500 Internal server errorを返します。
HTTP 1.0 Responce status code
Intranetとしても外部に公開されるInternet Web Serverにしてもネットワークとしてつながっています。情報がより重要になればなるほど、情報をいかに共有していくかが問題になります。 しかしすべての人が善意の人ばかりではありませんし、またつまらない間違いでうっかりデーターを破壊してしまったなどという問題が起きやすくなっていま す。 Webのセキュリティーは最悪の行為を行おうとしている進入者を前提に考えてください。 某日本の半導体メーカーで実際にあったのですが、どんなにしっかりしたシステムでも管理者不在のままになって退職者が移籍後の会社からInternetを 使い退職前に開発していたCADデータを持ち去り挙げ句に動かないように改変してしまったなどとならないようにしましょう。 便利さはいつも危険と裏返しです。 面倒でないものは容易に侵入者から見れば入れます。 Windows NTにはC2レベルのセキュリティがあります、そのうえにPROXY Serverもあります。Web自体のセキュリティはそれらの資料をご覧ください。 どちらにしても建ちあげる前に外から十分な経験を持っている人にセキュリティに穴がないか確認してもらいましょう。 Web自体のセキュリティも大事ですが同時にCGIをつかうときにもCGI自体からシステムのクラッシュや誰かにデーターやプログラムを改変され全体の Webの信頼性を落とすようなことがないようにしましょう。 ディレクトリはすべてvirtualディレクトリとして使ってください。 外部からは実際のディレクトリが何だか分かりません。絶対PATHを使うのはあたかも外部の人に金庫がどこにあるか知らせるようなものです。外部から更新 されるデータベースと読み取り専用のデータベースとは別のディレクトリに置き、ないぶのLANからのも外部からでもどちらのアクセスでも明確にアクセス権 限を設定してください。不必要にアクセス権限をeveryoneなどにしないでください。 実際に稼動してからも定期的にこのアクセス権限や アクセスのLOGファイルを確認してください。 ARAGOIで使用するプログラムもエラーが起きても処理されるように書き、プロテクトしてください。 たとえばユーザーの書き込みが思ったより多くディスクの容量が足りなくなりクラッシュなどです。 またファイルのオープンするときは必ずファイルがあるかの確認をしファイルがないときはどう表示するかも記述してください。 もしサーバーサイドインクルードを使わないときはdisableにしてください。SSIはずいぶん危険性を持っています使用するときも注意してください。 また同じドメイン上にmodemなどで別にInternetにつながっていたりするとそこが侵入される穴になります、ご注意ください。
12.うまくいか ないときは
すべてセットアップしたのだが、BrowserからWebが見えない http://computername/cgi-bin/aragoi.exe?test.prgとアドレスに指定し呼んでみてください。 can not access can not excute cgi-binのプロパリティーを確認する アクセス権限を必ず確認してください cgi-binは読み込みで実行と設定してください。 HTTP/1.1 500 Internal server error(ARAGOI can not excute program) ARAGOIのプログラムに何か誤りがあります。プログラムをARAGO for Windowsで実行してみてください。 CGI error HTML header information returns incomplete HTMLのファイルに何か誤りがあります 。 IISを使用しているときは<html>と<head>の間に改行がないとこのエラーになります dosプロンプトでaragoi.exe programname.prgと入力したときその結果が画面に返るかどうか確認してください。 表示されていないときはプログラムにエラーがあります。 ARAGO for Windows で実行できるようにプログラムを直して実行してみてください。 Browserを代えると表示されない metaの指定に問題があるか、browserがそのhtmlコマンドをサポートしていないかです。 IISがCGI エラー(アプリが完全なヘッダーを返してない)が出るときはIISがHTMLの一部をパースできないときです、出力している内容をリダイレクトしてファイ ルに書き込みBrowserで確認してください。 Browserも簡単なエラーであるときは無視して表示することがあります、ご注意ください。 ファイルをダウンロードし始める hrefなどでcgiを呼ぶときARAGOI.exe?file.prgとなりますが Netscapeなどではファイルのダウンロードを始めることがあります、その時はBrowserの違い を参照してください。 また hrefなどで.BATファイルなどを動作させるときは拡張子を.cmdにし.cmdのバッチファイルに引数がなくても ?を後ろにつけてください。 ?記号がないとファイルのダウンロードを始めてしまいます。
またARAGOIのプログラムが正常に実行されないときなどにも起きます。
APacheから500 Internal server errorと返されるときは Content-type: text/htmlを最初に返していないからです。
次のようにしてください。
output('Content-type: text/html',2) output('<html>',2) head3='<head><title>WEEK</title></head>' ..........
output('Content-type: text/html',2) output('<html>',2) head3='<head><title>WEEK</title></head>'
..........
次のようなエラーがエラーログに残るときはARAGOIのプログラムが必要なHTMLのタグを返していません。
[Thu Mar 26 18:56:18 1998] [error] Premature end of script headers: c:/apache/cgi-bin/aragoi.exe
<html>と対になる</html>などを確認してください。 IISでは動くがというときにはこのような問題が多いです。
Apacheはcgi-binに置くファイルを指定するとすべて実行するファイルとして扱います。 Browserから呼び出されるhtmlファイルはcgi-binには置かないでください。
NT 全般 Wndows NT 4.0 Server Resource Kit Micro Soft Press Web How to Set Up and Maintain a World Wide Web Site by Lincoln D. Stein Addison Wesley よくどこからか読んできて理解しないまま書かれた本と違いCERNやNCSAをポーティングした医者が書いている。 Web Serverについてどのように動いているか基礎から書かれている。Windows NTのDHCPの設定に悩む人や、動けばよいという人にはつまらない。CGIやHTMLの基本がわかると思います。 CGI 1.1 http://hoohoo.ncsa.uiuc.edu/cgi/overview.html すべて必要な規定が書いてあります ほかにHTTP1.1のDRAFT、HTML3.xのDRAFTなどがInternetにあります。参考にしてください。 Illustrated Guide to HTTP by Paul S. Hethmon Manning Publishing Co. Httpの内部構造をソースコードとして解説している、中級者向け。
IIS ヘルプファイル Web、 Security、cgiなどIISを使う上で必ず読んでください。
ApacheについてはSouth Wind Internet入門 Apacheサーバーのインストール
ApacheのWebページをご覧ください。
Apache Weeklyを購読することをお勧めしま す。
14. ARAGOIの 仕様
データベースとインデックス 一つのデータベースの最大の大きさ 2giga Byte 一つのデータベースの最大レコード数 1x10E9 オープンできるデータベースの最大数 45 * オープンできるインデックスの最大数 236 * 一つの作業領域で有効にできるインデックス数 100 インデックスキーの最大文字数 100 作業領域の最大数 45 * 1レコードの最大文字数 4000 ** 一つのデータベースの最大フィールド数 512 *** 一つのマルチプルインデックスファイルの最大インデックスタグ数 100 フィールド 1データベースの最大フィールド数 512 *** フィールド名の最大長 10 文字型フィールドの最大の大きさ 254 メモフィールドの最大の大きさ 制限なし 数値型フィールドの最大の大きさ 20 数値の精度 15.9 小数の最大桁数 18 日付型フィールドの大きさ 8 bytes 日付型フィールドの表示 8-10 論理型フィールドの大きさ 1 byte プログラム、関数、プロシージャ UDFに渡せるパラメータの最大数 255 プロシージャやUDFに配列を渡す yes 配列の要素を渡す yes プロシージャの長さの制限 制限なし プロシージャに渡せるパラメータの最大数 255 1ファイルあたりのプロシージャの最大数 193 1ファイルあたりのUDFの最大数 193 呼び出せるプロシージャやUDFの最大数 制限なし UDFに渡せるパラメータの大きさ 64K プログラムの長さ 制限なし**** コンパイルされたプログラムモジュールの最大の大きさ 240K 有効にできるプロシージャファイルの数 1 プログラム、プロシージャのネストの最大数 制限なし UDF名の最大長 32 * プロシージャ名の最大長 32 * 再帰呼び出し 制限なし 配列、メモリ変数、文字列について 配列の次元の最大数 254 配列の要素の最大数 5953 メモリ変数の最大数 64K 文字列の最大の大きさ 64K *** デフォルトのメモリ変数の数 271 配列の最大数 5950 メモリ変数の最大の大きさ 64K 変数あたりの最大の大きさ 11 64K文字列の最大数 1 変数名の最大の長さ 32 * メモリ変数の大きさ 文字型 表示:最大64Kバイト 記憶:最大64Kバイト 数値型 表示:19文字 記憶:常時8バイト 日付型 表示:8,10(またはBCのとき13)文字 記憶:常時8バイト 論理型 表示:常時1文字 記憶:常時1バイト 配列 表示:最大254次元 記憶:5953elements per array plus bytes コマンド コマンドあたりの文字の数 1024 DO WHILEのネストの数 20 リレーション式の長さ 制限なし LOCATE式の長さ 制限なし 汎用のファイル情報 PACKに必要なディスク容量 100% オープンできるファイル数 255 .有効にできるプロシージャファイルの数 1 有効にできるUDFファイルの数 1 有効にできるオルタネートファイルの数 1 有効にできる.prgファイルの数 制限なし 日付 入力できる未来の日付の限度 12/31/9999 * ARAGOW.INIファイルの設定により ** メモフィールドの大きさは含まず *** SET COMPATIBLE OFFの場合 **** 使用可能ディスク容量による
お買い上げ後直ちにこの契約書をお読み下さい。お客様(個人、法人を問わず)とSouthern Pacific Computer Products USA Inc.(以下SPC)との 間に結ぶソフトウェア使用契約です。充分お読みの上、同意されましたらユーザー登録カードを返送下さい。同意できな い場合は開封せず、オリジナルの状態で領収書と共に返品し代金をお受け取り下さい。 この契約は ディスクパッケージの開封か、ソフトウェアの使用(不正使用ユーザーが購入したとき)か、登録カードの返送によって成 立します。 ソフトウェア使用許諾契約書 使用の許諾条件 このソフトウェアと関連するドキュメント(以下プロダクツ)は、各国著作権法および万国著作権条約にもとづいて保護さ れています。 お客様は次の条件での使用を許諾されています。 ソフトウェアのコピーを、ハードディスクにコピーすることができます。CDROMにコピーする事はできません。 ARAGO for Internetは(以下ソフトウェア)は一つのドメインサーバーのWebサーバーに一つです、アクセスするユーザ数に制限はありません。たとえば www.hello.comは一つのWebサーバーと数えます。サーバーマシンの数ではありません。 お客様はプロダクツを不正なコピーから保護するために必要な注意をしてください。使わないディスクを人にあげたりし てはいけません。 お客様はソースコードを得るために逆アセンブルもしくは逆コンパイルをしないでください。 このプロダクツは最初のユーザーが使用をやめ、かつ同時に二個所で使用する可能性がない状態でSPCの文書による許諾の上で他の人に譲ることができます。 このプロダクツをリースするときは事前にSPCから文書による許諾をもらってください。ただし3年以上でハードウェアと セットのリースであることが必要です。 このプロダクツに含まれるサンプルプログラム、ドキュメントを引用するときはSPCから事前の文書による許諾を受けてく ださい。 保証 プロダクツは購入日から90日間マニュアル、ディスクなどに物理的な瑕疵がないことを保証します。この期間中に物理的 欠陥が発見されたときは、無償で交換いたします。 ソフトウェアがマニュアルに記述されている仕様と極端に異なり実質的に使用に耐えないとき、その事実を文書でSPCに連 絡してください。SPCは、不適合を修正するか、お客様がプロダクツを返送しお客様が支払った金額を返金するか選択する 権利をもちます。 この保証は購入後90日以内、もしくは修正されたプロダクツを受領した日より1ヶ月以内とします。返金の場合お客様は購 入を証明する書類を用意してください。返金されたときは、契約の解除として、同時にお客様のプロダクツを使用する権 利およびプロダクツによって作られたコンパイルプログラムを使用、配布、販売、貸与する権利は失効したものとします 。 お客様の故意または過失、誤用、異常な取扱、天災、火災、第三者による行為その他の事故、第三者によっておこされた ハードウェア、ソフトウェアによる障害等に起因する不具合についてはSPCはその責を負いません。 SPCはすべてのハードウェアおよびすべての動作環境での動作確認はしていません。もし、使用の環境で問題が生じるとき はSPCご連絡ください。 SPCは、プロダクツの内容に基づく結果に関して何の表示も保証もしません。殊に商品性や特定の目的への適合性に関する 黙示の保証の責任を放棄します。将来、何人にも通告することなしに、このプロダクツの内容を改定、あるいは内容を変 更する権利を有します。 プロダクツは"本パッケージのあるがまま"のものです。性能や商品としての価値、特定の目的にに対する適合性などの保 証は一切しません。本プロダクツによりもたらせる結果および性能に関する問題は一切保証しません。 プロダクツに関するいかなる明示的保証も90日間の限定保証です。SPCが特殊な、付帯的な、結果として生じる、間接的な 、もしくは同様の損害の可能性を知らされていたとしても、SPCは何らの責を負いません。ということは、SPCは、損害、 時間的損失による金銭的被害、金銭的逸失利益、ソフトウェアの使用不能、もしくは類似したことに関して責任を負いま せん。 いかなる場合においても、SPCの責任はお客様が実際に支払った額を上限とします。 SPCは、黙示の保証であろうと、お客様もしくは権利者に対して上記以外の保証をしません。特に、ソフトウェアが特定の 用途に適合するかどうかについてはまったく保証しません。 契約の解除 SPCはお客様がこの契約に違反したとき、違反の事実を解消することを請求しますが、改善されない場合この契約を解除す ることができます。契約の解除はお客様のプロダクツを使用する権利およびプロダクツによって作られたコンパイルプロ グラムを使用、配布、販売、貸与する権利は失効したものとします。 その他 お客様は所定のユーザー登録を2週間以内にしてください。登録が行われないときお客様はアップデート などを受けられなくなります。 このソフトウエアのテクニカルサポートは有償です。www.soupacific.comではサンプルや問題があれば対策などを乗せます。 訴訟が生じたときの管轄裁判所はSPC本社所在とします。 Windows NT, IIS、Front Page はMicro Softの登録商標です。それ以外の商品名もおのおのの会社の商標 もしくは登録商標です。
このマニュアルの著作権はSouthern Pacific Computer Products USA Inc.が所有しています。