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

FreeTalk.acgi

発言者:つちや
( Date Wednesday, August 06, 1997 13:51:44 )


はじめまして,つちやげんと申します.このページは今までちょくち

ょく参考にさせてもらっています.


このページと,「インターネットサーバー構築術」,CGIkit1.3(の g

uestmsg)を参考にしてfreetalk.acgiという掲示板スクリプトを作成

してみました.特徴は,同じサーバー内ならばいくつでも,どこにで

も,またそれぞれがまったく違うフォームやデザインで掲示板を作成

できることです.


ボクはスクリプティングやプログラムはほとんど初心者なので,この

CGIはまったく習作の域をでませんが,よかったら使ってください.

もちろんフリーウェアです.ソースもつけていますので,アップルス

クリプトに詳しい方からのコメント(いちゃもんでも可(^^) )は大

歓迎です.


ついでに(といってはなんですが,)質問があります.このCGIにつ

け加えていきたい機能に,メモリーオーバーによる書き込み不能状態

を回避する機能がありまして,その第一段階としてサーバーソフト(Q

uid Pro Quo)から送られてくるpost_argsの容量を監視したいのです.

マニュアルによると64Kbyteまで大丈夫とのことですが,どうも途中で

データが切られたり,メモリーオーバーなどのエラーがでて,変なん

です.なにがおかしいのでしょうか?



→  つちやげんのページ

田中求之 さんからのコメント
( Wednesday, August 06, 1997 20:38:05 )

> post_argsの容量を監視したいのです.

監視したいというのはどういうことでしょうか? CGI の側で受け取ったデータの
サイズを知りたいということでしたら、post_args のサイズを調べるだけです
から、そのことではないと思うのですが。


げん さんからのコメント
( Wednesday, August 06, 1997 21:57:49 )

すみません.言葉足らずでした.

具体的には,サーバーソフトが扱える容量をオーバーした投稿がされた場合,

サーバーソフトはどのような挙動をするか,また32Kをオーバーしたデータが

アップルスクリプトに送られるとどういう挙動をするか調べたかったのです.

でもテストスクリプトで検証したところ,10Kにも満たないところでデータが

とぎれたり,メモリーオーバーになったり,そうならなかったりして,訳が

分からなくなったので,質問しました.


ところでなぜかボクの投稿は一行とばしになってますね.YooEditから

ペーストしたからかな?今度は直にブラウザから書いています.

田中求之 さんからのコメント
( Thursday, August 07, 1997 01:46:04 )

> サーバーソフトはどのような挙動をするか

ログにはエラーが記録され、CGI に対しては制限容量分のデータだけが届くという
ことになるのが、普通だと思います。 WebSTAR や MacHTTP はそういう動作を
しますね。

> また32Kをオーバーしたデータが
> アップルスクリプトに送られるとどういう挙動をするか調べたかったのです.

CGI というか AppleScript の方には制限がありませんから、送られてきたら
送られてきた分をちゃんと処理します。ただし、CGI の割り当てメモリーが少ない
といった理由でエラーになることはあります。

CGI が Out of Memory のエラーを出すのであれば、CGI を「実行専用」で
コンパイルするようにしたうえで、メモリーを 500K - 1M ぐらい割り当てて
試してみるとよいと思います。

つちや さんからのコメント
( Thursday, August 07, 1997 12:54:59 )

なるほど.「実行専用」と「コンパイル済みスクリプト」では少し違いが

あるんですね.またいろいろ試してから成果を報告させてもらいます.


ところで投稿が一行とばしになる件について.マック版のインターネット

エクスプローラーから投稿すると,一つしか入っていないはずの改行が

二つ続けて入ってしまうようです.そういえばボクがCGIを作るときにも

この現象が見られました.そのときは深く考えずに二つ続いた改行は一つに

書き直すようにしたんですが,変な現象ですね??

田中求之 さんからのコメント
( Thursday, August 07, 1997 14:36:42 )

>なるほど.「実行専用」と「コンパイル済みスクリプト」では少し違いが
>あるんですね.

これはあくまでも私の経験からであって、理論的な裏付けはとれていないのですが、
実行専用で保存したほうが、メモリーが少なくて済みます( Out of Memory の
問題が起きにくい)。

通常のアプリケーションの保存の場合、Applet にスクリプトも保存され、
Applet からスクリプトの編集に切り替えることができるわけですが、こういう
余分なものがなくなるぶん、軽くて済むのではないかと考えています(あくまでも
推量)。


>エクスプローラーから投稿すると,一つしか入っていないはずの改行が
>二つ続けて入ってしまうようです.

エクスプローラーでしたか。 CRLF を送るところを CRCR にしてしまっている
のかな? いずれにせよ、エクスプローラーの場合のみ改行の処理を変更する
なんてのは面倒なので(もちろん可能ですが)、このままでいきます。

つちや さんからのコメント
( Saturday, September 27, 1997 18:46:13 )

こんにちは.いつもお世話になっております.久しぶりに時間がとれたので,Free
Talkを改良しました.ほかに宣伝するところを知らないので,またおじゃまさせて
いただきます.

今回は,田中先生の「リストをテキストに変換する」や,「conditional_get」,「
デリメタの操作」,EasyBBSのソースなどをみて勉強し,ハンドラーを使うなど,大
幅にソースを書き換えました.そのため,ほんのちょっとですがCGIの処理が速くな
りました.ただ,新しい機能などを付けたので,結果的にはあまり変わらなかった.
..(;_;)

また,名前はFreeBoardに変更しました.前のバージョンで,掲示板用にファイルが
最低でも7つ必要だったんですが,今回はそれを3つまで減らしました.これで前回よ
りも自由な掲示板が作りやすくなったと思います.


今回はCGIの動作タイプをacgiではなく,cgiにしました.これは投稿が重なり,CGI
に二つの処理が続けて送られると,

1.メッセージ1到達.メッセージ1用に必要書類を読み込む(状態 A)
2.メッセージ2到達.メッセージ2用に必要書類を読み込む(状態 A)
3.メッセージ2の,必要書類への処理・書き込み(状態 A->B)
4.メッセージ1の,必要書類への処理・書き込み(状態 A->c)

となり,状態 Bが消えてなくなってしまうのを防ぐためです.最初はメッセージを順
次プロパティに収めて,とかいろいろやってみたんですが,力量不足でできませんで
した.結局妥協してcgiタイプにしたのですが,なにかほかによい方法はないでしょ
うか?


Mac版IE3.01(PPC)からの投稿で,投稿中の改行が重なる件ですが,Mac版のIE3.01(PP
C)だけのバグらしいことがわかりました.具体的には,投稿中の改行コードに,CRLF
とCRLFLFが混在しているようです.他の68K版やWIN版,Netscapeではそのような現象
は見られません.ですので,先生のおっしゃるとおり,あえて対応する必要はないと
思います.(FreeBoardでは一応対応しました.)この投稿はNetscapeから投稿して
います.

#しかし,いくらサーバーがIISiだとはいえ,
#10数秒も処理時間がかかるとは...
#もうすぐAppleScriptが速度アップするそう
#だから,それまで我慢するか.

→  FreeBoardのページ

びn さんからのコメント
( Sunday, September 28, 1997 06:57:47 )

わたしもCGIKitに含まれているサンプルのスクリプトを利用させて
いただいていますが、ブラウザによって送ってくる改行コードが
まちまちなので(今まで確認したところでは3種類)、

set myBody to xReplace myBody search crlflf replace return
set myBody to xReplace myBody search crlf replace return
set myBody to xReplace myBody search LF replace return
set myBody to xReplace myBody search return replace "<BR>"

といった具合に改行コードの処理をしています。

田中求之 さんからのコメント
( Sunday, September 28, 1997 11:59:08 )

>今回はCGIの動作タイプをacgiではなく,cgiにしました.これは投稿が重なり,CGI
>に二つの処理が続けて送られると,

AppleScript の仕様によって、同じメッセージ(呼び出し)が重複した場合には、
後の方が割り込みで処理されるようになってます( Fast-In Last-Out )ので、
厳密に呼び出し順に処理を行わせることは難しいですよね。

ただ、

>1.メッセージ1到達.メッセージ1用に必要書類を読み込む(状態 A)
>2.メッセージ2到達.メッセージ2用に必要書類を読み込む(状態 A)
>3.メッセージ2の,必要書類への処理・書き込み(状態 A->B)
>4.メッセージ1の,必要書類への処理・書き込み(状態 A->c)

といった処理の場合、ファイルの読み込みと書き込みの間にどれだけの処理を行うか、
あるいはファイルに追記するという処理に変更は可能か?という点を工夫すれば、
なんとか acgi でもしのげる場合もあります。

あるいは、global 変数にフラグを用意しておいて、割り込みで処理を行っているのか
それとも単独で(普通に)処理を行っているのかをチェックするようにして、それで
処理方法を変えるという対策も不可能ではありません(場合によってはかなり面倒なス
クリプトになってしまいますが)。

田中求之 さんからのコメント
( Sunday, September 28, 1997 12:11:28 )

>あるいは、global 変数にフラグを用意しておいて、割り込みで処理を行っているのか
>それとも単独で(普通に)処理を行っているのかをチェックするようにして、それで
>処理方法を変えるという対策も不可能ではありません(場合によってはかなり面倒なス
>クリプトになってしまいますが)。

処理毎にかならず結果を返さないといけない CGI においては、この方法は基本的には
使えませんけどね (^_^;; (それが肝心なことであった…)

つちや さんからのコメント
( Sunday, September 28, 1997 19:21:07 )

>いただいていますが、ブラウザによって送ってくる改行コードが
>まちまちなので(今まで確認したところでは3種類)、

ありゃ,改行コードがLFだけのやつもありましたか.確認不足でした.
僕がいままで確認したのは,Mac版IE(PPC)のCRLFLFとCRLFの混在
パターンと,それ以外のCRLFだけだったです.参考までに,LFを
返すブラウザがなにか,教えていただけませんか?
#UNIX版のブラウザかな...?


>といった処理の場合、ファイルの読み込みと書き込みの間にどれだけの処理を行うか、
>あるいはファイルに追記するという処理に変更は可能か?という点を工夫すれば、
>なんとか acgi でもしのげる場合もあります。

そこなんです.FreeBoardは処理に10数秒もかかってしまうし,
(IISi上で測定)掲示板の性質上,最初に全部を読み込んで,
最後に書き込む,という形をとっているため,acgiの場合は
どうしても上に書いたようなメッセージの取りこぼしが起きて
しまいます.

処理速度がもっと上がればいいんですが...プログラムの
テクニックで何とかなるもんなんでしょうか.
明日から東京行くんで,AppleScript関係の本でも漁ってみます.
#福岡ではなかなか見つからないのです.この手の本.


#FreeBoardを使えば,チャット風のページも作れるんですが,
#(詳しくはFreeBoardのページへ,とさりげなく宣伝^^;)あくまでも
#チャット_風_で,処理速度が遅すぎるのでリアルタイムの
#チャットにはとうてい使えません(T_T)

田中求之 さんからのコメント
( Monday, September 29, 1997 02:04:26 )

>明日から東京行くんで,AppleScript関係の本でも漁ってみます.

入門以上のスクリプティングの参考になるような書籍ってないと思います(英語でも
出てないはず)。

ひたすら経験値をあげていくしかないですねぇ。

もちろん、速度改善のための細かいテクニックはいくつかあるでしょうが、それと
同時に、遅さを踏まえた戦略っていうのもあるんですよね(このへんは HyperCard
といっしょです)。

たとえば、EasyBBS はファイル名にタイムスタンプを使いますが、あれは、どんな
処理でも約1秒はかかる(1秒間に2つ以上の処理が行えないし、重なる可能性も
極めて低い)と見切ったうえでの策だったりします(EasyBBS は、こういう、
AppleScript の限界にあわせた見切りで成り立ってます (^_^;;  )

びn さんからのコメント
( Monday, September 29, 1997 03:23:52 )

改行コードの件ですが、どのブラウザがどういうコードを送ってくるか
確認したというわではなくて、最初CRLFのみだと思って処理するように
していた掲示板スクリプトを動かしていた時、最終的なメッセージ保存
ファイルに、[<BR>LF]というつながりとLF単独の二つの場合でLFが残
っていることがあったので、CRLF、CRLFLF、LFという三つの場合がある
んだろうと思ったわけです。

重松修 さんからのコメント
( Monday, September 29, 1997 17:54:25 )

post_argsの件ですが、次のような方法はどうでしょうか?
INPUT TYPE="HIDDEN"で隠しフィールドを最後に作って、それが含まれるか、
含まれないかにより、尻切れになっていないか監視するのです。
でも、そんなことをしなくても、WEBSTARの最新版はpost_argsのサイズ
制限はなかったのではないでしょうか?
それと、post_argsはmax32768バイトではないでしょうか?


つちや さんからのコメント
( Monday, October 06, 1997 09:04:27 )

>入門以上のスクリプティングの参考になるような書籍ってないと思います(英語でも
>出てないはず)。
>ひたすら経験値をあげていくしかないですねぇ。

一応初心者(^^;;)なので、東京で入門本を漁ってきました。あまり時間もなかったの
で多くの本屋にいけなかったのですが、AppleScript関係の本はやっぱりというか、
あまり見つかりませんでした。結局、ダニーグットマンの「AppleScriptハンドブッ
ク」と「ミニミニリファレンス」を買いました。(これ、福岡でもみたような… (T_T))

途中まで読みましたが、やっと「クラス」の意味がわかりました。これからは中級者
を名乗ろうと思います。(^^;)

>っていることがあったので、CRLF、CRLFLF、LFという三つの場合がある
>んだろうと思ったわけです。

なるほど、了解です。

>でも、そんなことをしなくても、WEBSTARの最新版はpost_argsのサイズ
>制限はなかったのではないでしょうか?

サーバーにはQuid1.01を使ってますが、制限は64Kだそうです。上の方に書いたpost_
argsのトラブルは、それ以下の投稿量でもCGIからエラーが帰ってきたりなんだりし
たってやつで、田中先生が書かれた解決法できれいさっぱりなくなりました。実行専
用で保存して、メモリをあげるってヤツです。
post_argsの監視は、もともとはできれば10K程度以上の投稿がされたら受け付けない
ようにしたいと思った(そのころ某掲示板で掲示板荒らしがはやってたので、それを
防ぎたいと思ってたのです。)ことから書いたものですが、説明がへたくそでしたね。
(^^;)最初っからそう書けばよかったです。
ちなみにFreeBoardでは4K以上の投稿はできないようにしてあります。

重松修 さんからのコメント
( Monday, October 06, 1997 17:22:04 )

>サーバーにはQuid1.01を使ってますが、制限は64Kだそうです。

最初にかかれてましたね。Webstarをお使いかと勘違いしておりました。
メッセージの場合は、64K(Webstarの場合は32768バイト)で足りると思いますが、
画像などをアップロードする場合は全く足りませんので、まあ、制限はない方がいいかな
とかおもったわけです。

しかし、CRLFLFを送るブラウザがあるのは全く知りませんでした。
私もその処理を追加しましたが、HTTPのヘッダのが改行コードにせよ、
統一されていないのは本当に不便ですね。
ところで、WEB共有はpost_argsのサイズなどはどうなっているんでしょうね?
説明書にその辺の記載が全くない!ので困ってしまいます。
Appleが個人でもディベロッパ契約できるようになったそうなので、それに
契約していろいろと聞こうかなとか思っています。
# どなたか、契約された方はいらっしゃいますか?

統一されていないといえば、半角カナ。メーラーの中には変なエンコードをして
送るものがあるようですが、それが統一されてないらしいです。RFCで使えない
というふうになっているので、使えなくしてほしいですね。
MacOS8のことえりでは、半角カナが(標準では)入力できなくなっていました。(^_^;;

私は、掲示板の投稿メッセージは、飯森さんOSAXをつかって、カナ変換を行っています。
というのは、SMTPでMLにも流しているからなんですが、ワードラップなども
行なえるので重宝しています。

でも、トランスリタレーションだと、「。」や「、」が全角に変換されないんですよね。
FutureBasicで作った方は今のところは、独自に処理してます。
# 単にScriptManagerの使い方がわからないだけ

ちょっと脱線しました。