このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

CGI Roller Plugin

発言者:田中求之
( Date Monday, February 23, 1998 02:40:54 )


Expo で前薗さんとあって話していたときに、新しい Plugin を作って欲しいという
話をしました。以下は、話の内容をもとに、Plugin の仕様をまとめたものです。
ようするに、Plugin から CGI を呼び出して実行するようなものが欲しいと
いうことなんです。

前薗さんは作ってもよいということなので、この場で仕様をつめたいと思います。
要望やコメントは遠慮なくどうぞ。

==

● CGI Roller Plugin

*複数のCGIをRound Robin方式で呼び出して実行する Plugin

● Plugin の目的

1:W*APIのパラメータをCGIでも活用できるようにする

WebSTARからCGIに送られるパラメーターは基本的には WebSTAR 1.x の時から大
きな変化はない。一方、Pluginに送られるパラメーターは、その後のWebSTARの機
能の増加に合わせて、色々なものが追加され、今後のCGI開発にとって必須とも言える
べきものも含まれている。しかしながら、現状では、CGIのパラメーターが増加さ
れる見込みは極めて低い。そこで、PluginからCGIを呼び出すことによって、W*
APIによって得られる各種情報を活かしたCGIを作成・実行できるようにする。

2:複数のCGIの同時処理の実現

AppleScriptはMulti-threadで走らないが、同じスクリプトの CGI プログラムを
同時に複数走らせることは可能である。そこで、PluginからRound Robin方式で複
数のCGIを順番に呼び出すようにしておくことで、同じ機能(スクリプト)の複数
のCGIを平行して走らせることで、疑似的なマルチスレッド処理を実現する。

同じスクリプトのものを複数走らせるということは、メモリーやハードディスクを余
分に消費するが、そのことよりも、複数の処理が平行して行われるメリットの方が
大きな状況になってきている(CPU の高速化、メモリーとディスクの大容量化)。


● Plugin の動作

Plugin は、拡張子 .rcgi によって呼び出されて処理を行う。

Configファイルにフルパスで並べておいたCGIが、Round Robin方式で、順に呼び
出される。

Plugin から各CGIに対しては、WebSTARのsdocイベントを拡張したイベントが送ら
れる。通常の 'sdoc' イベントは異なるイベント('mdoc' イベント?)が送られ
る。

CGIの動作や仕様は、処理するイベントの ID が違うことを除けば、通常のものと
変わらない。


● Plugin の設定

Plugin フォルダー(あるいはWebのルートフォルダー)に専用のPrefsフォルダー
を設け、その中にconfigファイルを入れておくようにする。

Configファイルには、フルパスでCGIを並べておく。

Configファイルの名前がグループ名になる。複数のグループを設定する事が可能。
ただし、グループの数には上限がある。

たとえば、"webcon"というファイルに
  MacHD:WebSTAR:myCGI:webcon1
  MacHD:WebSTAR:myCGI:webcon2
  MacHD:WebSTAR:myCGI:webcon3
という3つのCGIを指定しておく。この3つは webcon というグループになる。

plugin は拡張子 .rcgi の URL によって呼び出されるが、このときの拡張子の前
の部分が、グループ名と見なされる。つまり、上の webcon グループは 
webcon.rcgi というユーザー定義アクションの URL によって Plugin から呼び出
される。

呼び出される順番は
webcon1 -> webcon2 -> webcon3 -> webcon1 -> (以下繰り返し)
という順になる。


●その他
configに列記しておくCGIは、すべて同じスクリプトである必要はない。スクリプ
トが異なる場合は、呼び出されるタイミングによって処理が違う、という仕組み
を実現することが可能となる。

前薗 健一 さんからのコメント
( Monday, February 23, 1998 04:10:45 )

補足しますね。

> 1:W*APIのパラメータをCGIでも活用できるようにする

CGI application で AppleEvent を介して得られるパラメータは
postArgs, SearchArgs, etc...といったものですが、W*API では
HTTP header の情報、Server の設定の情報等、細かい情報を
得ることが可能で、項目によっては情報を得ることだけではなく
Server の設定を Admin のように plug-in から行うことも可能です。
CGI から Server の設定を行うことはできませんが...

W*API で取得できる全てのパラメータを plug-in から CGI に渡すことも
可能ですが、ある程度のオーバーヘッドが生じる可能性があります。この
あたりは実際にテストしてみないとなんとも言えませんが。
そこで、W*API SDK の W*API 1.2 Reference.pdf, WSAPI.h を参照
していただいて、「このパラメータは必要」「これはいらない」という
リクエストがあったら、是非お聞かせください。
パラメータは全部で40個位あったはずです。

前薗 健一 さんからのコメント
( Monday, February 23, 1998 04:19:32 )

> Plugin は、拡張子 .rcgi によって呼び出されて処理を行う。

WebSTAR の Action 定義のことです。

重松修 さんからのコメント
( Monday, February 23, 1998 12:47:22 )

面白いアイデアだと思います。
引き数の32K制限もなくなると考えてよいのでしょうか?

田中求之 さんからのコメント
( Monday, February 23, 1998 15:52:50 )

>引き数の32K制限もなくなると考えてよいのでしょうか?

それも目的の一つです。

前薗 健一 さんからのコメント
( Tuesday, February 24, 1998 00:51:09 )

現在の仕様の予定ですが。

1.CGI Roller Plugin を WebSTAR の Plug-Ins Folder に入れる。
2.Plug-Ins Folder に "CGI Roller configs" という Folder を作る。
例えば、 
Mac:Servers:WebSTAR:Plug-Ins:CGI Roller configs

3.CGI Roller configs の中に config file を置く。
config file は text file で中には

file : AAA

mac:AppleScript:CGI:aaa.acgi
mac:AppleScript:CGI:aab.acgi
mac:AppleScript:CGI:aac.acgi

file : BBB

mac:AppleScript:CGI:bba.acgi
mac:AppleScript:CGI:bbb.acgi
mac:AppleScript:CGI:bbc.acgi

のような記述をします。

4.WWW クライアントからサーバに対して
http://www.xxx.zzz/AAA.rcgi

というリクエストがあると CGI Roller Plugin は
Mac:Servers:WebSTAR:Plug-Ins:CGI Roller configs
の AAA という config file を読んで上記の file : AAA に記述された
CGI application に対して AppleEvent を送り、reply を待ち、その
reply を client に返します。

こんな感じです。

前薗 健一 さんからのコメント
( Tuesday, February 24, 1998 01:05:26 )

エラー処理について

例えば config file : AAA に次の様な記述があったとします

mac:AppleScript:CGI:aaa.acgi
mac:AppleScript:CGI:aab.acgi
mac:AppleScript:CGI:aac.acgi

ここで、aaa.acgi が存在しない、もしくは aaa.acgi 内でエラーが発生した
場合、どうします?

存在しない場合、CGI Roller Plugin は aaa.acgi を無視する。
aaa.acgi 内でエラーが発生した場合も CGI Roller Plugin は関知しない。

つまり、CGI application 内で起こったことは、そちらで処理し、
CGI Roller Plugin はあくまで CGI Application からの reply を
client に返すという仕様にしたいと思っています。
いかがでしょうか?

前薗 健一 さんからのコメント
( Tuesday, February 24, 1998 01:08:32 )

もちろん、WebSTAR の Status Window には Error 情報の表示を
行います。log のほうがいいでしょうか?それとも両方?

田中求之 さんからのコメント
( Tuesday, February 24, 1998 01:22:10 )

>ここで、aaa.acgi が存在しない、もしくは aaa.acgi 内でエラーが発生した
>場合、どうします?

存在しない場合には、Plugin 自体が働かないということにしてもらってもよいかと
思います。初期化に失敗というエラーメッセージを WebSTAR Log に表示して disable
の状態になるということで。

>aaa.acgi 内でエラーが発生した場合も CGI Roller Plugin は関知しない。

これでよいと思います。

Statusにエラーを表示するのはよいですが、Log に表示するのは止めてください。
ログの処理の際の、余分な情報があるとエラーの元になりますので。

重松修 さんからのコメント
( Tuesday, February 24, 1998 12:53:46 )

この件でちょっと不思議に思う点があります。

たとえば、EasyBBSもそうですが、ファイルやリソースにアクセスするもの
はどうなるのでしょうか?最悪同時に書きにいって失敗する(もしくはお亡
くなりになる)ということは無いのでしょうか?

特に私のは自分自身のリソースフォークにデータを書くものがあるのでこれ
は仕様を変更しないとダメかなと。あと、速度(Purgeによる自動キャッ
シュ?)とHFSでのディスクスペースの節約、それにセキュリティの意味も
有りデータを外部リソースファイルにもって、それを開きっぱなしで使って
いるんですが、これもなんか不味そう。。。

基本的には、AppleScript+Tanaka's OSAXようという感じなのでしょうか。

田中求之 さんからのコメント
( Wednesday, February 25, 1998 23:38:34 )

ファイルの排他処理は、すべて CGI 側の責任になります。 AppleScript の
open for access コマンドは、パーミッションを指定できますから、排他
処理をなんとかこなすことは可能ではないかと思っていますが、私の osax
を使ったスクリプトは、そのままでは問題が起きるでしょうね。

ファイルを Lock / Unlock するコマンドと、ファイルがロックされているか
どうかを確かめるコマンドを osax で作って、ファイルの読み書きで排他処理
が必要な場合は、ファイルのロックでうまくこなすという(たとえばロックが
かかっていたら、一定の間はロックが解けるのを待つが、その後はエラーを返す
ハンドラーを用意する等)実験をしてみるつもりです。

AppleScript でない CGI においても、当然のことながら、排他処理を
うまくこなすように(少なくとも問題を起こさないように)なっていないと
使えないということになります。

田中求之 さんからのコメント
( Wednesday, February 25, 1998 23:40:49 )

Lock / Unlock でなくても、ファイルを開く際のパーミションによるエラーコード
(たとえば write の資格では開けなかった等)をトラップして、ループでやり直す
ようなハンドラーで、なんとかしのげるのではないかと思ってますが…

重松修 さんからのコメント
( Thursday, February 26, 1998 00:38:56 )

やっぱりそうですよね。

FutureBASICでの場合は、ラウンドロビンでまわすよりもマシン語の割合を
上げて高速化すること事の方がなんか楽そうな気もします。

目的のファイルがBUSYならリダイレクトするようにするとか。ただ、
混雑すると、永遠にリダイレクトしそうな気もしないでもないですけど。
あるいは、ファイルが使えるようになるまでぐるぐる回すとか。

なんか難しそうです。(T_T)

前薗 健一 さんからのコメント
( Tuesday, March 03, 1998 01:42:20 )

config file 中のコメントについて。

おそらく後々リクエストがあると思うのですが、config file 中のコメント文
についての提案です。

コメント文には AppleScript の場合

-- これはコメントです。
set x to y -- ここにコメントがはいります

みたいに、"--" 以降はコメント文として扱われますが、config file の場合、
行の先頭 2 bytes が  "--" の場合のみコメントとして扱いたいと考えています。
例えば

-- これはコメントです
  -- 先頭にスペースが入っているためコメントとして扱いません
macHD:CGI:AAA.acgi -- 1行をフルパスとみなします

といった仕様でいいでしょうか?
細かいことはやろうと思えばやれますが、plug-in の本来の機能以外に
あまり時間をかけたくないというのが本心です。

田中求之 さんからのコメント
( Tuesday, March 03, 1998 12:26:15 )

もっと単純に

行頭が # の場合は、その行全体はコメント文として扱う

でいいと思いますよ。

前薗 健一 さんからのコメント
( Friday, March 27, 1998 04:41:21 )

coding 自体はかなり前にできていたのですが、時間がなくてずるずるきています。
申し訳ありません。少々、時間がとれましたので、test & debug を行っている
ところです。

そこで、進捗報告。
coding 直後のものは、まともに動きませんでした。

*現象
AppleScript の applete を plug-in から起動はできるが、applete から
error -108 Out of memory が返る。AppleEvent の reply も plug-in 
には返ってこない。applete の使用メモリを増やしても現象は同じ。

*原因
plug-in から applete に対して AppleEvent のパラメータは path_args しか
渡していないのに、applete 側では WebSTAR から送られるはずの全てのパラメータ
をハンドルしていたため。

on ヌevent WWWスsdocネ path_args given ヌclass kforネ:http_search_args,
... 省略 ...
ヌclass Kcidネ:connection_id

これではエラーになり

on ヌevent WWWスsdocネ path_args

これだと大丈夫

*対策
現在、テストバージョンですので、テストバージョンに応じてパラメータを
増やしながらテストしてみます。

*今後
複数の applete を動かした場合に out of memory のエラーが確実に発生して
いるので、この辺を究明していきたいと思っています。

p.s
EasyBBS EX plug-in のテストは CGI Roller plug-in のβリリースの後の
予定です。