*CGI実行ファイルの作り方(バイナリファイル編) ここでは、バイナリCGIアプリケーションの作り方を説明します -スクリプト言語(perl,ruby,phpなど)のCGIアプリケーションの場合は、 他のページ [[CGIの作り方(スクリプト言語編)]] [[CGIとPHP]] などを参照してください バイナリファイルでのCGIの説明です レンタル容量がアップしたおかげで、スタンダードでもバンバン使える環境が整いました。 お好きな言語で CGIの仕様に沿ったコンソールアプリを書きます。 makeします。 拡張子を.cgiにしてwwwの好きなところにおきます。 Unixでは、アクセスすると普通にページが表示されます ※Windowsでテストするには、実行ファイルを.cgiファイル内で指定します ※直接プログラムをwwwに置かず テキストの.cgiでAPPの場所を指定したほうが安全。 phpやperlよりも それだけで超高速に動きます(数倍〜十数倍程度) たとえば2秒かかるものが200ミリ秒に短縮されることがあります。 スクリプト言語が苦手とする 反復処理が多いものに有効です 反復処理が少ないものには、あまりお勧めできません 欠点 -少し大きい -変更しにくい --実行形式への構築が必要 --コードがわかりにくい。書いた本人でも数ヶ月するとわからなくなることは多々ある。 -多言語間の変換を伴う処理に向いていない(例:SJIS←→EUC) -複数人での開発では、開発効率が非常に悪い --コンパイラにインターネット関数などの基本的なライブラリが欠如している -サクラが提供しているスクリプト言語と違い、定期的なメインテナンスが必要です。自分でインストールしたライブラリに、セキュリティ上の問題がある場合、自分で再度インストールしなおす手間が必要です。 --手間をなるべく省くためには、動的リンクを駆使するか、すべてを自動化する自動的なスクリプトを書いておくといいでしょう。 *エラーが表示される Internal Server error ,原因,説明,対策 ,アクセス権,実行権限がついていない,chmod 705 ファイル名.cgi ,リンクエラー,ローカルPCとサーバーのライブラリの場所が違う,リンクしたソフトをサーバーと同じ構成にする ,リンクエラー,ローカルPCとサーバーのライブラリの場所が違う,sshで接続し、サーバーでmakeしたほうが確実です *動作確認(FreeBSD 7.x On sakura) **FreePascal(FPC,http://www.freepascal.org/) 動作可能 ---( サーバーでコンパイルする場合は、FreePascalを事前にインストールする必要があります。 バグが多く安定版のリリース頻度が少ないので(年に1、2回)、あまりオススメできない。 ---) ,FPC version, ,2.4.0,未確認 ,2.2.2,cgiappは、仕様に問題(変数汚染)があるので使わない方がいい ,2.2.2未満,cgiappは、仕様に問題(変数汚染と一時ファイル残留)があるので使用禁止 **gcc 基本的に動作可能 ***cgic.c POSTとGETのどちらかしか変数が受け取れないので、不便です。 ***cgicc (http://www.gnu.org/software/cgicc/) &link(dwonload,ftp://ftp.gnu.org/gnu/cgicc/) たいていの変数(POST,GET,Cookie,form)は用意してあります ,cgicc ダウンロード ,ソースコード,ftp://ftp.gnu.org/gnu/cgicc/ ,pkg_add,ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/Latest/cgicc.tbz ,cgicc ,リンク,動作,理由,備考 ,静的リンク,●,コンパイル時、cgiccソースが必要,gnuからソースダウンロード ,動的リンク,●,CGIのLD_LIBRARY_PATHが設定できない,pkg_addから追加可能 ,cgicc,チェック項目 ,500 Internal Server Error,LD_LIBRARY_PATH ,Shared object "libcgicc.so.5" not found,LD_LIBRARY_PATH LD_LIBRARY_PATH gccのコマンドライン確認 Wl,-rpath,$HOME/local/cgicc/lib 【cgiccインストール】 -その1(お手軽) --pkg_add -t id_${USER} -p $HOME/local/cgicc ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/Latest/cgicc.tbz --packageから取得すると最新ではないのが難点。 -その2(こだわり派) --ソースからのコンパイル・インストール ---直接ダウンロード ---portsから 【boostライブラリのインストール】 -その1(お手軽) --pkg_add -t id_${USER} -p $HOME/local/boost ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/Latest/boost.tbz ---インストール後「リンカオプション -pthread が必要」なので忘れないようにと表示される。 *参考資料 -&link(wikipedia Common_Gateway_Interface,http://ja.wikipedia.org/wiki/Common_Gateway_Interface) -CGI Environment Variables http://hoohoo.ncsa.uiuc.edu/cgi/env.html *必要なスキル(技術と知識) -各プログラミング言語に精通していること 特に,gccの場合は、ポインタ処理に注意 -cgi環境変数の意味を理解していること(参考資料を参照のこと) -ハッキング対策 DOS攻撃,SQLインジェクション,ユーザーからくる環境変数値を信用しない *設置例 -FreeBSD ---( 作ったアプリケーション(拡張子は、.cgi、アクセス権705)を そのままwwwの好きな所に置くと動作します ---) -Windows上のapacheで動作確認したい場合 例:ファイル名.cgiの内容 ---( #!c:\パス\ファイル名.exe ---) *エラーなど **coreがダンプされる エラーがでたときに、実行ファイル名.coreがフォルダにできることがあります。 実行ファイル内で起動時に存在をチェックしてあれば削除する1行を加えておくといいでしょう。 *サンプル **cgicc ---( /* cgi cgicc_hello.cpp Hello by cgicc */ // gcc -I$HOME/local/cgicc/include -L$HOME/local/cgicc/lib Wl,-rpath,$HOME/local/cgicc/lib -lcgicc -o cgicc_hello.cgi cgicc_hello.cpp // ./cgicc_hello.cgi #include #include #include #include "cgicc/Cgicc.h" #include "cgicc/HTTPHTMLHeader.h" #include "cgicc/HTMLClasses.h" using namespace std; using namespace cgicc; int main(int argc, char **argv) { try { Cgicc cgi; // Send HTTP header cout << HTTPHTMLHeader() << endl; // Set up the HTML document cout << html() << head(title("cgicc example")) << endl; cout << body() << endl; // Print out the submitted element cout << "Hello" << endl; // Close the HTML document cout << body() << html(); } catch(exception& e) { // handle any errors - omitted for brevity } } ---) ---( 出力結果: Content-Type: text/html cgicc example Hello ---)