Euphoria CGI(ウェブ)アプリケーション


はじめに

あなたがウェブサイトのオーナーでしたら、あなたのサイトの訪問者が動作させることができるサーバープログラムを設置できるかもしれません。多くのフリーウェブホスティングサービスはこの機能を提供していませんが、商用サービスでは提供されています。彼らがウェブの広告表示に用いる機能は"cgi-bin", "Perl", "C言語"が大半を占めます。同様にEuphoriaのプログラムをウェブ上で実行できるかもしれません。ホスティング企業はEuphoriaをインストールする必要はありません。あなた自身で簡単にどうにかすることができます。ウェブホストに関しては、C言語で記述(すなわち、Euphoriaトランスレータで作成されたもの)されたプログラムを実行できます。

CGI(コモン・ゲートウェイ・インタフェース)と呼ばれている非常に単純なプロトコルは、ほぼ全ての商用ウェブホスティングサービスで利用可能です。さらに、CGIアプリケーションを作成するために通常はどのようなプログラミング言語でも使用することができます。PerlはCGIにおいて非常に人気がありますがEuphoriaは様々な点においてPerlより優れている点があります。Perlプログラムと比較して、Euphoriaプログラムは起動が非常に高速で、非常に高速に動作し、良質のエラー診断機能を備えています。C言語と比較すると、Euphoriaプログラムを開発・変更・デバッグするのが簡単で必要とされるコストも少なくて済みます。Euphoriaは非常に簡単に文字列を扱うことができます。それは多くの場合においてCGIプログラミングでは重要なことです。


CGI (コモン・ゲートウェイ・インターフェース : Common Gateway Interface)

CGIは非常に単純なプロトコルのための洒落た頭字語です。CGIの標準規格(RFC3875)では、ウェブブラウザがウェブサーバー上で動作しているプログラムに対して、どのように情報を渡すか、プログラムがウェブブラウザに対して、どのように情報を返すか定義されてます。

ウェブホスト

ウェブサーバーソフトウェアおよび利用中のインターネットサービスプロバイダー(ISP)の利用規約で自宅サーバーの公開を許可しているならば、あなたが所有している(ご家庭の)マシンでEuphoria CGIプログラムを実行・外部一般公開することができるでしょう。

しかし、大半の人々はCGIとシェルアカウント(ssh/telnetおよびgccとビルドに必要なライブラリ類)に対応したウェブホスティングサービスを使用することになります。また、月額980円から5,000円以上の価格帯で契約できるホスティングサービスを見つけることができます。

なお、日本国内ではさくらインターネットfc2などがあります。 なお、契約する前にEuphoriaをサーバーにインストールして使用できるかどうかは事前に各社のサポートまで必ずお問い合わせください。


CGI向けEuphoriaのインストール方法

Euphoriaをウェブホストへインストールするのは非常に簡単です。ウェブホストを実行しているオペレーティングシステム用のEuphoriaディレクトリのアップロードが必ず必要です。Euphoriaディレクトリを利用領域の最上位ディレクトリに導入ことができます。システム全体への変更は一切不要です。telnet(またはssh)を使用して検証を行うには、euphoria\demoにあるプログラムのいくつかをウェブホストで実行できるか確認します。Euphoriaディレクトリを指定するためにEUDIRおよびPATH変数を必ず設定する必要があります。これにはログインごとに実行される.profileファイルの編集が必要な場合があります。

一般的に人々に実行しお欲しいEuphoiraプログラムは、あなたの借りているウェブホスト領域の"cgi-bin"と呼ばれている特別なサブディレクトリに設置する必要があります。しばしばcgi-binは一般から見ることのできるHTMLファイルが含まれている"public_html"ディレクトリの配下に配置されています。cgi-binはサイト訪問者がHTMLファイルからリンクされているCGIプログラムの実行をすることが許されている特別な許可を持ちます。

LinuxおよびFreeBSD、さらにWinodows(Apacheウェブサーバを利用しているならば)では、メインEuphoriaファイルの一番最初の行に"シェバン構文"行を使用することができます。これはEuphoriaインタプリタ(exuまたはexwc.exe)がシステムのどこに位置するか指定します。すなわち、

 #!./exu

これでインタプリタはカレントディレクトリ(cgi-bin)に存在するということを表します。このファイルをLinux/FreBSDホストにアップロードするときは、行末が\r\nではなく\nで終わるよう注意してください。

注意事項: Windowsではexw.exeではなくexwc.exeを使う必要があります。exwcは標準出力を扱うには都合が良いため、これはCGIにとっては重要なことです。メインファイルの先頭で"without warning"を記述する必要があります。これは警告メッセージはプログラムを適切に終了するときに問題が発生する場合があるためです。

Linux/FreeBSDでは、全てのCGIプログラムに実行権限を必ず設定する必要があります。利用者がCGIプログラムを実行しようとするとき、実際はサーバの特別なプロセスがCGIプログラムを実行するためEuphoriaプログラムへのアクセスするための権限を知る必要があります。恐らくファイルに権限を設定することにより誰でも読み取ることができるか実行できるようになります。すなわち、rwx r-x r-x または chmod 755 myfile.exu exuもまた他から実行可能なように設定することを忘れないでください。

Linuxシステム上で/tmpディレクトリへの書き込み権限が無いか、他の理由で書き込むことができないときは、exwの無圧縮版を動作させる必要がある場合があります。これはRDSのダウンロードページまたはUPXを使用してexuの圧縮を解除することにより得られます。

物事を単純にするために、プログラムで必要なファイルを全てcgi-binにコピーしたいことがあります。これらはEuphoria標準ファイルとしてeuphoria\includeと、Euphoriaインタプリタがあり、さらにプログラムからアクセスする任意のデータベースをコピーします。これにより同一の環境変数(PATH, EUDIR)が存在しないサーバプロセスでのEuphoriaファイルを見つけることができなくなる困難な問題を避けることができます。


HTMLフォーム

通常はHTMLフォームのウェブページを用意すると、リンクをクリックすると実行される単純なウェブリンクCGIプログラムを作成して使用することができます。これは利用者にグラフィカルユーザインタフェースを提供してCGIプログラムから情報を提供するようにできます。

RapidEuphoria.comウェブサイトの数箇所ではHTMLフォームを利用してEuphoriaで記述されたCGIプログラムと通信するページがあります。最も単純なフォームはMicroEconomyでしょう: http://www.rapideuphoria.com/ecoform.htm
Internet Explorerでは、ページ(P) / ソースの表示(S)の手順で、このページのHTMLコードを見ることができます。

数回ほどページダウン(PageDown)を押した後、フォームの開始箇所が見られます:

 <form method="POST" action="cgi-bin/economy.exu">

これは、利用者に項目を埋めてもらうフォームを作成します。利用者がフォームからsubmitボタンを押すと、cgi-binに格納されているCGIプログラム ecnomy.exwはサーバが実行します。

フォームで利用可能な2つの"方式"があります。このフォームは"POST"方式を使用しています。他の方法はは"GET"方式と呼ばれています。

POST方式では、利用者からの入力情報を標準入力からEuphoriaプログラムへ渡して、gets()およびgetc()で読み取ることができます。

GET方式では、データは"query_string"と呼ばれる環境変数からEuphoriaプログラムへ渡されます。

どの方法が適切ですか?ほとんどの場合は、返される入力データは同一であり、どの方法を使用するかは重要ではありません。データの取得方法が違うだけです(訳者注意: 検索エンジンで「POST GET 違い」と検索なさることをお勧めします)。

実際、フォーム扱うEuphoiraプログラムとしてMicroEconomyのソースを閲覧できます。 http://www.rapideuphoria.com/economy.txt

手続きread_input()により、どの方式が使用されているか、適切なソースから入力データを取得できたか調べることができます。CGIプログラムの必要な箇所でread_input()を使用します。

フォームは色々な方法で利用者からデータを収集します。最も単純な手法のうち一つは例えばテキスト入力タグです:

 <input type="text" name="name" size="35">

 <input type="text" name="city" size="35">

これは2つの別々の記入欄に利用者の名前と都市を入力させます。利用者が入力した値はEuphoriaプログラムに渡されて"name(名前)"と"city(都市)"と名づけられます。

さて入力データはどのようになっていますか?

GET方式では環境変数query_string(最初の2つのフィールド)は、このようになります:

"name=John&city=Miami"

そして、この文字列は'?'文字の後にウェブブラウザのアドレスバーで見ることができます。

POST方式を使用するならば、同じ文字列は標準入力を経由して利用できます。

2つのフィールドから情報を取り出すためには入力結果を解析する必要があります。 MicroEconomyプログラムはこの方法でparse_input()を使います。 開発したプログラムにparse_input()に組み込みたいことがある場合があります。

単純なテキストボックスのほかに、利用者から入力のための多くの機能がHTMLでは用意されています。一行および複数行にわたるインプットボックス、パスワードボックス(ドットで隠されます)、ドロップダウンメニュー、ラジオボタン、チェックボックス、など。ユーザから入力された各データは名前がつけられて、CGIプログラムでparse_input()またはほぼ等価なコードを使用して情報を解析を行えます。利用者に大きいファイルをアップロードさせることもできます。


CGIプログラムからの出力

クエリ文字列を調べた後、プログラムは結果としてユーザへの応答を生成する必要があります。この応答結果は必ず完全なHTMLページ形式で標準出力(Euphoriaではファイル番号1)へ書きこまれる必要があります。プログラムが標準出力へ書き込む一番最初の行は必ず次のとおりにする必要があります:

Content-type: text/html

この行の後に、続けて完全なHTMLページを構成するために大量の行を記述する必要があります。例えばMicroEconomyプログラムではprint_HTML_header()という次の内容の手続きを呼び出します:

 puts(1, "Content-type: text/html\n\n")
 puts(1, "<html><head><title>Thank You</title></head>\n")
 puts(1, "<body bgcolor=\"#FFFFFF\">\n")
これらが全て完了した後、ページが完成したことを表すためには、最終行には</body></html>を書き出す必要があります。プログラムがHTMLページの完成に失敗すると、利用者のブラウザで全てのページを正常に表示されないことがあります。


CGIプログラムのデバッグ

新しいCGIプログラムを最初に実行するとき、複数の原因により動作に失敗する確立は非常に高いです。このとき何が間違っていたかわかりにくい不明瞭なエラーページが表示されます。

最初にしなければならないことはcgi-binに存在するEuphoriaのex.errファイルを調べることです。このファイルが存在するならば、プログラムが停止した原因がわかります。ex.errが存在しないならば、アクセス権限が正しくはないか、シェバン構文の行が正しくありません。さもなくば実行はされたが適切なHTMLページが生成されていません。最初の行でContent-typeを確実に出力するようにして、さらにHTMLの適切な構造として<html>から開始して</html>で終了することを守ってください。

ex.errが取得できない場合は、プログラムの始めに"with profile"と記述することよりex.proファイルを生成することができます。これはプログラムが終了する前にどの様な命令文をプログラムが実行したかの見解を提供します。

さらに"with trace"とtrace(3)を試みることにより、最新500件の実行された命令文を含むファイルが終了前に生成されます。

Oプログラムが正常動作しているようであれば、ex.errを電子メールを送信するクラッシュルーチンを追加したいときがあることがあります。これにより開発者が想定していない変なことを利用者がしたことによりクラッシュが発生したということを知ることができます。


CGIプログラムの高速化

ほとんどのCGIプログラムは多少CPU時間を必要とするだけで、そのほとんどの時間は起動時間が占めることがあります。すなわち、インタプリタの起動とプログラムの構文解析のことです。典型的なCGIプログラムではデータベースのレコードへのアクセス、または電子メールのメッセージ送信といった利用者がフォームへ入力したものを複数パラメータとして読み取る作業を行う前に、簡単なHTML形式の確認ページを利用者へ提示します。

大量の時間を必要とするとCGIアプリケーションでは、EuphoriaプログラムをC言語プログラムへと翻訳してからコンパイル作業を必要とします。その結果として生成される実行可能ファイルをCGIプログラムとして使用できます。これにより起動時間が短縮され(構文解析を必要とせず)、プログラムの動作が高速化されます。唯一の問題はクラッシュ発生時に、完全なex.errを取得できないということです。しかしcrash_routine()を使うことにより、例えばクラッシュの原因となったクエリ文字列など問題究明の鍵となる複数の変数をいくつか電子メールに添付して送信することができます。