ホーム > HTMLに役立つヒント
> ADSLでMACサーバ・実験室 > SSIもどきCGI(index.acgi)
index.acgiの解説ページです。web共有でSSIもどきが欲しかったので作ってみました。
<@count>ページビュー(2002/4/17から)
このファイルの変更日:<@modDate> 今の時間は:<@time>
AppleScriptで動作する「SSIもどきCGI」です。あくまで「もどき」です。
web共有をはじめ、cgiが動くMACのwebサーバならたいてい動くはずです。
仕掛けは簡単です。
index.html → index.acgi とリレーしていき、index.acgiが表示したいページファイル(index.shtml)を読み込み、一部を書き換えて吐き出します。
つまり、いったん呼び出し用のhtmlファイルを読み込み、それからCGIを呼び出してページを吐き出すわけです。ワンクッションあるため、「SSIもどき」というわけです。
●各種ファイル
index.html:
まずこれを読み込みます。ここにはメタタグを仕込んでおいて自動的にindex.acgiを呼び出させます。
index.acgi:
あらかじめ設定しておいた.shtmlファイルを読み込み、その中の「<@count>」「<@modDate>」「<@time>」という文字列(タグ)をそれぞれカウント、修正日、現在時間に入れ替えて出力します。
index.shtml:
このファイルの表示させたい部分に前述の「<@count>」「<@modDate>」「<@time>」を記述しておきます。別にファイル名は.shtmlでなくても良いのですが、その方が管理が楽だしわかりやすいと思います。
実際のソースが見たい場合は「index.shtml」を表示してソースを見てください。index.acgiを通さずに表示しますから、ソースがわかります。
●実際の動作
カウント機能は、単純に何回読み込まれたか、回数を数えるだけです。いわゆるページビューということになります。
動作サンプルはこのページの上を見るとわかります。上でページビューとなっているところなどに「<@count>」「<@modDate>」「<@time>」というタグを入れてあります。
プロセスをもっかい見たいという人は「index.html」を押してみてください。index.html → index.acgiという過程が見られます。何せ動作のとろいサーバですから(^^;パワーのあるマシンなら、動作はもっと早くなります。お手元のマシンで試して導入するかどうか決めるとよいでしょう。
名前について、ssi.acgiの方がいいのかなとも思いましたが、index.acgiとしておいた方が、名前で並び替えるとindex.htmlなどと並ぶので管理しやすいかなと。それだけのことなので、動かすときはテキトーに命名してください。
この.acgiには、Tanaka's osax 2.0.1(作者:田中求之さん)が必要です。これ以前のバージョンについては試していませんので動作するかわかりません。作者の田中求之さんに感謝いたします。
配布場所:http://mtlab.ecn.fpu.ac.jp/tanaka_osax.html
インストール:AppleScript1.3より前の場合
「システムフォルダ」→「拡張機能」→「スクリプティング機能追加」の中にTanaka's OSAXを入れます。
インストール:AppleScript1.3以降の場合
「システムフォルダ」→「スクリプティング機能追加」の中にTanaka's OSAXを入れます。
どちらの場合も再起動の必要はありません。
●ダウンロード
ダウンロードページから「index.acgi.txt0304.sit」をダウンロードし、解凍してください。中に入っている「index.acgi.txt03」を使います。「index.acgi.txt04」は上級編用です。
ダウンロードページ:「http://www.kiwi-us.com/~mizusawa/penguin/DATA/index.shtml#ssimodoki」
●設定の変更
「スクリプト編集プログラム」で開き、赤い部分を必要に応じて書き換えます。カウントファイルとログファイルは、存在しなければ自動的に作成されます。
property shtmlF : "index.shtml" --indexファイル名
property countFile : "indexCount" --カウントファイル名
property logFile : "countLog" --ログファイル名。空にすると出力しない必要なファイル全部を同一の階層においてください。こんな感じです。
html フォルダ
├index.html acgi呼び出し用のダミー
├index.shtml 読み込み・表示ファイル
├index.acgi .acgi
├indexCount カウントを記録するファイル。自動生成される。
├countLog ログを記録するファイル。自動生成される。
●コンパイル
AppleScriptのバージョンが1.3よりも後ならそのままコンパイルできます。「スクリプト編集プログラム」から「ファイル」メニュー「実行専用で保存」を選択し、アプリケーションとして保存してください。「実行後自動終了しない」「初期画面を表示しない」の両方にチェックを入れることを忘れずに。名前は「index.acgi」などとしてください。
メモ:「.acgi」は並行処理が可能なCGI、「.cgi」はCGIの処理が終わるまで次の処理に移らないCGIに付ける拡張子。どちらの拡張子でも動作します。
AppleScriptのバージョンが1.3以前の場合は次の変更が必要です。
--●サーバからの要求を受けて処理に分岐
on handle CGI request s_path searching for get_arg with posted data post_data from client IP address ipAddress with full request full_request
--on ヌevent WWWスsdocネ s_path given ヌclass kforネ:get_arg, ヌclass postネ:post_data, ヌclass Kcipネ:ipAddress, ヌclass Kfrqネ:full_requestという箇所を探して、赤い部分を削除します。「--」も削除するのを忘れずに。
--end ヌevent WWWスsdocネ
end handle CGI requestこちらはそのルーチンの終わりの部分です。同様に赤い部分を削除します。
後は同様にアプリケーションとして保存してください。
●index.html
前述のようにacgiを呼び出すためのファイルです。<head>タグに次のようなめたタグを書いておきます。
<META http-equiv="Refresh" content="0; URL=index.acgi">
自動ジャンプしないブラウザのためにリンクも本文に書いておくと良いでしょう。
<A href="index.acgi">自動ジャンプしない場合はこちら。index.acgi</A>
acgiが何らかの原因で動かなくなった場合に備えて、直接shtmlへのリンクもおいておくと良いでしょう。また、このリンクは検索エンジンのロボットが回ってきたときに確実にshtmlを読み込ませるためにも役立ちます。
<A href="index.shtml">上のリンクにジャンプできない場合はこちら。index.shtml</A>
※白状しますが、前にindex.shtmlがまったく反応しなくなったことがあります。webサーバーはweb共有を使っていました。落ちた原因は不明です。.acgiのメモリ割り当てはデフォルトの200kbのままです。
メモリ割り当てを増やすと安定するかも知れませんが、これが原因とは考えにくいです。ま、そーゆーこともあるんだということを覚悟してお使いください(「著作権など」参照)。
●index.shtml
こちらの名前は任意の名前でよいのですが(.shtmlである必要さえない)、このほうが管理が楽でしょう。
このファイルが表示させたいページになります。「機能」で書いたように、好きな箇所に「<@count>」「<@modDate>」「<@time>」というタグを書いておいてください。3つ全部のタグを書く必要はありません。必要なものだけ記述すればOKです。
3つとも書かないというケースはないでしょうが(^_^)
●アクセス
「http://〜/index.html」にブラウザでアクセスしてみてください。無事に動いたかな?
●実は…
すでにお気づきの方もいらっしゃると思いますが、index.acgiに直接アクセスしても動作します。
●ログファイルは
動作検証が十分とはいえず(何せこのサーバのトップページ、25ページビュー/日なもんで)、ひょっとしたらカウントファイルが壊れるかもしれません。そこで、ログファイルにカウント数と日時、IPアドレスを記録しています。万一カウントファイルが壊れたらログファイルを見て直近の値に復旧できるってわけです。
ログファイルはどんどん追加書き込みをしていくので、放っておくと大きくなっていきます。適当に空っぽにしてください。
index.acgi.txt03は、読み込みファイル、カウンタファイル、ログファイルが1つしか指定できません。しかも.acgiの中であらかじめ指定しておく必要があります。
そこで、引数の指定で複数のファイルを処理できるバージョンを作りました。ところがいろいろ制約があるので、上級者だけ挑戦してください。
●ソースファイル
「index.acgi.txt04」を使います。
●制限
1つの.acgiが処理できるのは、同じ階層にある.shtmlファイルだけです。違う階層にあるファイルを引数に指定しても動作しますが、そのファイルの中のリンクが相対パスの場合、リンク先がおかしくなります。よって同階層にあるファイルだけに使うことをお勧めします。
違う階層にindex.acgiをコピーして使えば、違う階層のファイルにもSSIもどきの機能を付けることができます。しかし、ここでもう一つの制約がでてきます。必ず.acgiの名前を変更する必要があります。例えば、トップの階層に「index.acgi」をおいたなら、次の階層には「index2.acgi」などと名前を変えておいてください。
これはAppleScriptの制約で、同じ名前のスクリプトは同時に1つしか走りません。正確に言うと、同じ名前のスクリプトは2つ同時に走りますが、最初に起動した方に引き渡されるため、名前が同じものが二つあると誤動作します。
よって、別階層にコピーしたら、必ず名前を変えてください。当然呼び出し側のindex.htmlもメタタグやリンクの名前を合わせる必要があります。
このように、階層ごとに1つのindex.acgiが必要ですので、複数走らせるとその分メモリを食う点にもご注意ください。
●引数の指定
引数は読み込みファイル(readFile)、カウントファイル(counFile)、ログファイル(logFile)の順で指定します。
引数を省略するとpropertyで指定した読み込みファイル、カウントファイル、ログファイルを使って表示します。デフォルトでは次のようになっています。
property dReadFile : "index.shtml" --デフォルトのshtmlファイル名
property dCountFile : "indexCount" --デフォルトのカウントファイル名
property dLogFile : "countLog" --デフォルトのログファイル名。空にすると出力しないつまり、デフォルトの状態では次の2つは同じ意味となります。
〜index.acgi
〜index.acgi?readFile=index.shtml&counFile=indexCount&logFile=countLog
同じ階層に、処理させたい別のファイルがある場合は次のように引数を指定して呼び出します。下の例では読み込みファイルはaaa.shtml、カウントファイルはaaaCount、ログファイルはaaaLogとなります。
〜index.acgi?readFile=aaa.shtml&counFile=aaaCount&logFile=aaaLog
このうち、logファイル名だけは省略できます。省略した場合はログを記録しません。ただし、引数「&logFile=」だけは書いてください。こんな感じです。
〜index.acgi?readFile=aaa.shtml&counFile=aaaCount&logFile=
●使用例
このページは「index2.acgi」で処理しています。「SSIもどきテスト」をクリックすると、同じく「index2.acgi」が処理してテストページを表示します。
上のリンクは呼び出しファイル「ssi_test.html」にリンクしていますが、「index2.acgi」に直接リンクしてもいいわけです。「index2.acgi?readFile=ssi_test.shtml&counFile=ssiCount&logFile=」
このように、同じ階層にあるファイルなら1つのacgiで処理が可能です。
「html」にあるように、順調だったindex.acgiがハングしたことがあります。そーなった場合に、ハングしたcgiを終了させるためのツールです。「quit.cgi.txt01」がそれです。
設定箇所は1カ所だけです。quitしたいCGI(実はCGIだけでなく、アプリならたいていOKのハズ)を変数に書き込みます。
設定したらこれをアプリケーションとして保存します。「実行後自動終了しない」にはチェックしないでおきます。名前は「quit.cgi」とでもしてください。「.cgi」「.acgi」という名前にしておかないとブラウザから呼び出せませんので注意。
使う時にはブラウザからquit.cgiにアクセスします。quit.cgiは設定されたアプリケーションを終了させ、自分も終了します。
※もし対象になっているアプリが立ち上がっていないと、一度立ち上げた後に終了させます。
名前は.cgiでもCGIではありませんので、アクセスしてもブラウザの画面には結果は何も表示されません。放っておけばブラウザにはタイムアウトの表示がでるだけです。
気にせず、今終了した(させたはずの)CGIにアクセスしましょう。それでもう一度ハングしたCGIが立ち上がります。
もちろんこれ、サーバ自体が落ちていたら役に立ちません。
できあがった.acgiを前面に出すようにすれば少しは処理速度が速くなるかも知れない、というアイディアですが、パワーのないマシンでは逆にアプリケーションの切り替えに時間がかかってしまうかも知れません。
1.CGIの名前を登録視する。
スクリプトの先頭に次の行を追加します。名前は一致させてください。
property appName : "index.acgi" --このCGIの名前
2.処理部分をtellでくるむ。
「on handle CGI〜」で始まり「end handle CGI request」で終わる部分をそっくりtellでくるみます。次の赤い部分を追加します。
--●サーバからの要求を受けて処理に分岐
on handle CGI request s_path searching for get_arg with posted data post_data from client IP address ipAddress with full request full_request
--on ヌevent WWWスsdocネ s_path given ヌclass kforネ:get_arg, ヌclass postネ:post_data, ヌclass Kcipネ:ipAddress, ヌclass Kfrqネ:full_request
tell application appName
activate --スピードアップのために表に出す(ここに処理が入る)
end tell
--end ヌevent WWWスsdocネ
end handle CGI request
3.後はコンパイルしてできあがりです。保存名を1.で設定した名前と同じにする点に注意。
2002/1/26 count.cgi.txt04 2002/4/17公開
引数を付けて同階層にある複数のページをカウントできるようにしたもの。
2002/1/24 count.cgi.txt03 2002/4/17公開
最初のアイディアに戻り、カウントの他に修正日、現在時刻を表示する機能を付け加えたもの。
2002/1/20 count.cgi.txt02 未公開
カウンタをgif画像で出力しようとして挫折した。画像を1つにまとめる方法がどうしてもわからなかったのである。したがってできあがってさえいない。
2002/1/18 index.cgi.txt01 未公開
最初のバージョン。カウント機能しかない。表示するファイルを丸ごと読み込んで、中の特定のタグを書き換えて出力するという基本アイディアを形にしたもの。
なんのことはない。as_tree_bbs(自作のAppleScript掲示板CGI)の中で同じことをやっているのだ。田中求之さんのAppleScript掲示板/easyBBS_DX5を参考にしながらas_tree_bbsを作ってます。で、この中で使われているテクニックを流用してSSIもどきが作れることに気がついたってわけです。田中求之さんに感謝いたします。
フリーソフトです。ご自由に使用、改変、再配布できます。何しろ低機能なのでどーにでもしてくれって感じです(^^;
おっと、例によって万一このソフトを使って被害を被っても、損害はいっさい保証しません。オウンリスクで使ってください。
もしこのCGIをお使いだという奇特な方がいらっしゃったらお知らせください。リンクさせていただきます。
ホーム > HTMLに役立つヒント
> ADSLでMACサーバ・実験室 > SSIもどきCGI(index.acgi)