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

REALbasicでCGIは作成できますか?

発言者:Tanny!
( Date Wednesday, May 13, 1998 16:03:32 )


REALbasicがDR1r33にバージョンアップされ、AppleEventの送受信ができるよう
になったようです。
と、言う事はCGIが作れるのかもしれないな?と思うのですが?

基本的にAppleScriptで組む時と同様の手順を踏めばいいのだと思っていますが、
もしかして大きな勘違いをしているでしょうか?

→  REALbasic

田中求之 さんからのコメント
( Wednesday, May 13, 1998 16:52:34 )

RealBASIC もAppleEvent の送受信が可能になったんですね! これは強力な
CGI 開発環境の登場と言ってもいいかもしれませんねぇ。さっそく落としにいこう。

AppleEvent の送受信ができるのであれば、CGI は作れます。ただし、Real BASIC
がどのように AppleEvent を扱うようになっているのかによって、具体的な実装方法
は変わってきます。

AppleEvent が送られてきたとき、アプリケーション・クラスに対して何らかの
メッセージが届くのでしょうか? このあたりの仕組みによって、どのように組むかは
変わってきます。たぶん、アプリケーション・クラスのレベルで扱うようになっている
んだと思いますが…

Tanny! さんからのコメント
( Wednesday, May 13, 1998 19:38:27 )

ごめんなさい。Dr34でした。

可能性はあるという事ですね。
もう少し調べてみます。

田中求之 さんからのコメント
( Thursday, May 14, 1998 19:47:33 )

ひさしぶりに RealBASIC (CrossBASIC) を落として、ついでにメーリングリストの
アーカイブで最近の話題などをチェックしてみたのですが、なかなかすごいものになって
きてますね。

Socket や Thread も扱え、これに AppleEvent が扱えるとなると、CGI を書くには
強力な環境になるかもしれない( ML の中でも、CGI のイベントを扱えるようにして
くれたら、マルチスレッドの強力な CGI プログラムが作れるのに、という意見があり
ましたが)。

AppleEvent を受信するには、Applecation クラスのサブクラスとして HandleAppleEvent
を作って、そこにコードを実装すればよいということは分かったのですが、Event クラス
をどう料理していいのかがまだ分かりません。実装されたばかりということで、
適切なサンプルも見つからないようですし。

漢字コードなんかの問題は XFCN 組み込んじゃえば解決するので( XCMD, XFCN なら
300ぐらいは自作の手持ちのものがありますので)、イベントの扱い方さえ分かれば
(パラメーターの抜き出し方と、リプライの返し方)、CGI はすぐにもできそう
なんだけどな… (あ、AppleEvent が扱えるって事は、osax を呼ぶことも
可能だな…)

田中求之 さんからのコメント
( Friday, May 15, 1998 16:10:48 )

サーバーからの sdoc イベントを受け取るところまではできましたが、リプライを返す
方法がわからない…

sdoc イベント(CGI プログラムに対して送られてくる AppleEvent )を受け止める
には、Application object を super にしたクラスを作り、そのクラスの Event の
handleAppleEvent に以下のような感じでコードを書いていきます。

Function HandleAppleEvent(event As AppleEvent, eventClass As String, eventID As String) As Boolean
  dim dParam as string
  if eventClass = "WWWス" and eventID = "sdoc" then
    dParam = event.stringParam("----")
    Window1.EditField1.text = dParam
  end if
  return true
End Function

これは、単純に Window1 にダイレクトパラメーター(Path_argument)を表示する
というテスト用のものです。このように、event.stringParam(<class>) によって
パラメータが取り出せますので、あとは、これを料理し、最後にリプライを返せば
CGI のできあがり〜 なんですけどぇ。

前薗 健一 さんからのコメント
( Friday, May 15, 1998 23:43:05 )

う〜〜ん

BASIC も Object Oriented ですね〜〜。
C++ よりも判りやすいですね。
MS VB の流れですかね?

田中求之 さんからのコメント
( Saturday, May 16, 1998 02:31:18 )

>BASIC も Object Oriented ですね〜〜。

Object Oriented な開発環境で BASIC ライクな言語を使う、という感じですね。

HyperCard がマルチメディア・オーサリング・ツールに「成り下がったら」、こっちに
まじで乗り換えようかと思ってしまいます。


Hoashi さんからのコメント
( Saturday, May 16, 1998 18:12:06 )

早速、田中さんの例を元に試してみました。

最初、「Application object を super にしたクラスを作り」をどういう風に
作れば良いのか分からなかったんですが、いろいろ試すうち分かってきました

その次「dParam = event.stringParam("----")」の「----」を
そのままのスクリプトで試してどうしても「EditField1」になにも
出てこなくて、、、

ようは、ここにClassを書けってことだったんですね。
「event.stringParam(<class>) によって」がわかってなかったんです、きっと、、、

そこで、ここに[post]をいれて簡単formのHTMLを作って呼び出したら、
見事、見慣れた文字が出てきました。(こんなの>name=%94%BF%91%AB%90T%93%F1&title=%91%97%90M%83e%83X%83g)

あとは、田中さんのいうように料理してリプライを返すようにすれば
いいんですね。。。

で、どうすればいいかなぁ???(^^;)

田中求之 さんからのコメント
( Saturday, May 16, 1998 18:38:29 )

>あとは、田中さんのいうように料理してリプライを返すようにすれば
>いいんですね。。

そうなんですよ、あと一歩なんです。 URL のデコードとか、漢字コードの変換は
ClipDecoder で使っている XFCN をそのまま持ってくるか、AppleScript
経由で osax を呼べばいいので、とにかくリプライの返し方さえ分かれば、って
ところなんですよね。



田中求之 さんからのコメント
( Saturday, May 16, 1998 22:32:25 )

HandleAppleEvent() に Reply 用の AppleEvent が渡されていないのも変だと
思いましたので(これではそもそも Reply ができないのでは?と思いましたので)、
RealBASIC のメーリングリストに質問を投げてみました(今ポストしたところ)。

さて、変な英語の質問に答えが返ってくるかな??

帆足 さんからのコメント
( Saturday, May 16, 1998 23:38:18 )

帆足です。

Mac素人プログラムの会のメーリングリストに入っているんですが、
リリースノートを見つけましたので、転載しておきます。

-----------
REALbasic Release DR1r34 (1998年5月12日)
以下のバグが修正されています:
●Boolean型に関するさまざまなバグを修正。
●他のTab上の表示させるコントロールに関するバグを修正。(訳注:??)
(Bug where invisible/on other tab controls were getting)
●MouseEnter/MouseMove イベントを修正。
●GreenとBlueプロパティへのアクセスののバグを修正。
●MultilineのEditコントロールにフォーカスリングを追加。

以下の新機能が追加されています:
●MemoryBlockオブジェクトにPtr(offset as integer)プロパティを追加。
●AppleEventを送信する、AppleEventクラスを追加。
●AppleEventを作成する、NewAppleEvent関数を追加。
●AppleEventを受信するために、HandleAppleEventという
 Applicationクラスのイベントを追加。
●Integer型のBitwiseAnd(v1 as integer, v2 as integer)を追加。
●Integer型のBitwiseOr(v1 as integer, v2 as integer)を追加。
●Integer型のBitwiseXor(v1 as integer, v2 as integer)を追加。
●ListBoxコントロールとPopupMenuコントロールにInitialValueプロパティを追加。
●ユーザがコンテキストメニューを表示するかどうかを決めるための
 IsCMMClick関数を追加。
●コンテキストメニューを作成するためのContextualMenuコントロールの
  追加。
●Menu Editorのメニューの順番をドラッグして変更できるようになった。

以下の修正が加えられています:
●Menu EditorがMacOS8のアピアランスに対応した。
-----------

なにか参考になるソフトは無いのか、RealBasic.comのFTPとか
見てみたんですけど、CGIのサンプルとかはまだ無いみたいですね。

前でのMLでもその手の話は全くないです。

帆足 さんからのコメント
( Saturday, May 16, 1998 23:47:31 )

帆足です。先ほどのメッセージで引用元が抜けていましたので、
補足しておきます。

[mac-pro:03664] [Rb] REALbasic DR1r34 is Released.
Takeshi Ueno, tueno@vio.co.jpさんから引用させていただきました。


Tanny! さんからのコメント
( Sunday, May 17, 1998 00:40:28 )

AppleEventに関するマニュアルの記述を見てもさっぱりだし、まだサンプルも
出ていないようで、僕の方も全然先に進んでいません。

言い出しっぺなのに....

田中求之 さんからのコメント
( Sunday, May 17, 1998 02:19:33 )

リプライを返す方法が判明しないことには CGI は作れないのですが、リプライに関しては
AppleEvent を送る場合でも、相手からの reply をどうやって受け取ればいいの?
という点が問題になるんですよね。

現在の実装を見るかぎりでは、AppleEvent の送付がうまくいったかどうかしか確認
できないのではないか、という気がしています。このままでは、一方的に命令を送る
タイプのコマンド(イベント)しか使えませんから、実はあまり役に立たない。そうで
なくても、パラメーターとして渡せる型が string と number ですから、非常に
限定がきついわけです( Finder の操作などは無理)。

ま、r34 で、とりあえず実装してみた、というレベルなんではないかと思ってます
(=今後に期待)

パラメーターはテキストだけでよく、リプライも特に必要としないものであれば、
現在の仕様でなんとかなります。たとえば、OpenTransport PPP を使って
PPP 接続をさせたいという場合などは、

Window1.PushButton1.Action:
Sub Action()
  DIM ev as AppleEvent,myR as boolean
  ev = NewAppleEvent("netw","RAco","MACS")
  ev.stringParam("RAad") = Window1.Phone.text
  ev.stringParam("RAun") = Window1.User.text
  ev.stringParam("RApw") = Window1.pass.text
  myR = ev.send
End Sub

でいいわけです( PPP Commands osax を呼び出しています)。

osax を呼び出すときには、Finder をとりあえずのターゲットにしておけば
いいみたいですので、上のスクリプトでも Finder (creator = "MACS")
をターゲットにしてますが、ここでも、実は、同じクリエーターのアプリを
識別できないという、仕様の弱点が…

なんていうか、かなり粗削りな AppleEvent の実装だという感じです。せめて
HyperCard レベルの実装を望みたいですね。

田中求之 さんからのコメント
( Wednesday, May 20, 1998 13:27:00 )

DR1r34a というのが出ましたが、AppleEvent に関しては改良などはないようですね。

帆足 さんからのコメント
( Wednesday, May 20, 1998 14:29:55 )

>DR1r34a というのが出ましたが、AppleEvent に関しては改良などはないようですね。

aというのがついたんでもしかしてと思ったんですが、
期待に沿ったものではないみたいでした。

リリースノートで、

●XCMDインターフェイスが、GetGlobal/SetGlobalインターフェイスを
 サポートするようになった。

とあるんですが、これはどういう意味でしょう?

-----
本職が忙しくなってレスをつけてる暇がなかなとれないですぅ。
MLでもここも尻切れトンボみたいになって騒いだ割には申し訳ないです。>重松さん

田中求之 さんからのコメント
( Wednesday, May 20, 1998 15:36:15 )

>●XCMDインターフェイスが、GetGlobal/SetGlobalインターフェイスを
> サポートするようになった。
>とあるんですが、これはどういう意味でしょう?

XCMD から HyperCard のグローバル変数にアクセスするためのコールバックです。
これを XCMD の中で使うことで、HyperTalk で定義しているグローバル変数の
値を読み取ったり、設定できます。

このコールバックを利用している XCMD が走るようになったということなんで
しょうが、RealBASIC 側で、HyperTalk のグローバル変数に値するものが
何に当たるのか不明ですねぇ…


うえの さんからのコメント
( Friday, May 22, 1998 02:58:43 )

「Mac素人プログラマの会」で「REALbasic日本語化チーム」をしています、うえのといいます。初めまして。

さて、DirectReplyの返し方の件ですが、DR1r35で、ReplyStringプロパティというのが新設され、これを
通じてかえすことができるようになるとのことです。

私自身も、REALbasicでのCGI作成には興味があります。会社でもWebSTARを使っております。
いろいろ試してみたいと思っています。田中さんの情報にはいつもお世話になっています。

LanguageReference日本語版もよろしくお願いします。(昨今のバージョンアップについていけてませんが)


→  LanguageReference日本語版

田中求之 さんからのコメント
( Friday, May 22, 1998 16:29:12 )

>DR1r35で、ReplyStringプロパティというのが新設され

これはうれしいですね。これさえできればこっちのもんだ (^_^;;


田中求之 さんからのコメント
( Saturday, May 23, 1998 11:17:18 )

DR1r35 が出ましたね。AppleEvent がらみの変更点(新機能)として

・ AppleEventDescList class for use with AppleEvents
・ FolderItemParam property for AppleEvent Class
・ DescListParam property for AppleEvent Class
・ ReplyString property for AppleEvent Class -for returning values in
AppleEvent handlers

ということですから、これで基本的な CGI は作れるはずです。

さ、試さなくっちゃ。 …この週末は RealBASIC 三昧かな (^_^;;

田中求之 さんからのコメント
( Saturday, May 23, 1998 16:01:23 )

DR1r35 であっさり CGI できました。処理がシンプルだというのもあるだろうけど
速い〜。さすが Native Application だなぁって感じです。

hoashi さんからのコメント
( Saturday, May 23, 1998 17:34:34 )

うーん、忙しい、、、
うえのさんMLではどうもですぅ。

田中さん、お願いですソース見せて下さい。。。
やってみたけど、うまくいかない、、、

田中求之 さんからのコメント
( Saturday, May 23, 1998 17:49:33 )

さっきでっちあげたプロジェクトを登録しておきました。

XFCN を使っているんですが、これは確かプロジェクトには読み込まれない(エイリアス情報
だけが登録される)んだったと思いますので、XFCN もつけておきます。

→  RB_Simple_CGI.hqx

重松修 さんからのコメント
( Saturday, May 23, 1998 19:56:30 )

早速サンプルを拝見しましたけど、こんなに簡単に書けていいのってな
具合にすごいですね。FutureBASICで開発するよりも圧倒的に楽かも。
ただ、XCMDがあるからってのもありますけど。

なにがいいって、TOOLBOX使わなくてもいいのがいい。特に、文字列操作で
FutureBASICはPascal文字列だったので、非常にかったるい思いをしていた
のですが、RealBASICはその煩わしさをすべて解決してくれますね。

それともう一つ感動しました。

私は、一番最初にURLデコードをしてから漢字コードを判定していたんで
すが、なんとURLエンコードされたまま漢字コードが識別できるんですね。
そういう、XCMDまであるとは流石です。

私は頭が悪いので、そういう方法を思いつきませんでした。なので、
URLデコードの段階で、&をTAB(chr(9))に、=をchr(0)に、そしてTABを
スペース2つに置き換えるようにしていました。

最初に漢字コードを識別して切り分けてからURLデコードするってのは全く
思いつきませんでした。

流石、田中先生って感じです。

私もFutureBASICでXCMDを開発して、CGI自体はRBで開発しようと思います。
今後サンプルが充実すると良いです。

重松修 さんからのコメント
( Saturday, May 23, 1998 20:02:35 )

ミクロですが、
return "HTTP/1.0 302 Found" + crlf + "Location: " + xURL
は
return "HTTP/1.0 302 Found" + crlf + "Location: " + xURL + crlf + crlf
の気がします。

それと、漢字コード識別はいったんURLデコードして判定してたんですね。
そういうXCMDがあるのかと勘違いしました。(^-^;;

田中求之 さんからのコメント
( Saturday, May 23, 1998 20:11:33 )

>私は、一番最初にURLデコードをしてから漢字コードを判定していたんで
>すが、なんとURLエンコードされたまま漢字コードが識別できるんですね。
>そういう、XCMDまであるとは流石です。

いえいえ、そうぢゃないです (^_^;;

漢字コードの判定の部分は checkKanji という method を呼んでいますが、
その method の中で、全文をデコードしてから漢字コード判定を行っています。
つまり、漢字コードの判定のためと、データ生成のため、2度 URL デコードを
行っているのです。

これは、EUC と SJIS の区別をなるべくちゃんとするためには、文字列は長いほうが
よいからです。そこで、全文で漢字コード判定を行うことで、精度を上げるように
してます。もちろん、そのために速度は犠牲になってますが、漢字コードの確定の
精度の方が優先されるべきだと考えたのです。

田中求之 さんからのコメント
( Saturday, May 23, 1998 20:17:13 )

あ、交差しちゃいましたね (^_^;;

redirectHeader() はおっしゃるとおり、私のミスです(今回は使ってないので
ミスに気がつかなかった)。


この週末は、Socket と Thread をちょいと調べてみようかと思ってます。
Thread の中でメールが出せるようになれば、かなり使えるんじゃないかと
思いますんで。

よしもと さんからのコメント
( Saturday, May 23, 1998 20:55:00 )

> Socket と

あらぁ、Socketも使えるんですね。
僕も使ってみようかなぁ (^^;

重松修 さんからのコメント
( Saturday, May 23, 1998 23:27:42 )

いやあ、おすすめですよ。RB。
私もちょっと気合いを入れて使おうかな、という気になってきました。

前は全然ダメだったんですけどね。精力的にアップデートされて魅力的な
コントロールが沢山使えるし、メモリ管理などが楽でいいです。
こういうのが使いたいな、と思うとどんどん追加されていくんですよね。
すごい勢いです。

FutureBASICだと、すべてハンドルやポインタで管理するので、かったるい。
AppleScriptと同じくらいの難しさでないかと思っているんですが。>言語
自由度は低いですが、ユーザーの責任も軽いのが最大のメリットですので、
使い捨てCGIの開発には最高の環境ではないでしょうか?

ToolBoxが使えないのは、XCMDなどで補えばよいし、MacPerlのような
汎用性はないけど、全然軽くて速いと思います。FutureBASICとどっちが
速いんだろ。。。多分、FBの方が早いとは思うけど、PowerPCだと、
案外RBが速いかもしれませんね。

DRでタダなので、とりあえず、試すだけの価値はあると思います。

ところで、OSAXは呼べるんでしょうかね?もし呼べないなら、私は桁揃え
のXCMDを書こうと思っているんですが。コードはすでに書いてあるので、
XCMDに書き換えるだけなんですが。案外田中先生、すでに書いてそう。

Tanny! さんからのコメント
( Sunday, May 24, 1998 00:51:48 )

おおっ!
すでにサンプルコードまで出てる........

早速ダウンロードして勉強させていただきます。

田中求之 さんからのコメント
( Sunday, May 24, 1998 01:25:14 )

>ところで、OSAXは呼べるんでしょうかね?

今の AppleEvent の実装では、send で送ったイベントの reply は取れないので
無理です。list 型の Descriptor も扱えるようになったので、パラメーターは
ほぼ自在に渡せるのですが… (でも、まだ boolean が渡せないのは痛いぞ)

Thread クラスを作って、そのスレッドの中から AppleEvent を送るってのを
やってみましたが、3つぐらいの Thread を動かす分には、自宅の Q840 でも
どうってことないのが分かりました。ファイルなどへの排他処理の実装が面倒かな
という気はしますが、マルチスレッドで処理しちゃうのも簡単ですね。

これで自分が送った AppleEvent の reply が取れるなら、GripGrop 全文
検索 CGI をマルチスレッド対応で作れるのになぁ…

田中求之 さんからのコメント
( Sunday, May 24, 1998 16:18:55 )

Socket を使って、POST argument をメールで送る CGI を組んでみましたので
登録しておきます。

ビルドしてアプリケーションにしたら、手動で立ち上げてください。

そして、

mail address の欄にあなたのメールアドレス

SMTP Server の欄にメールサーバー(SMTP サーバー)のアドレス

を入力したのち、左上の CGI Processing をチェックしてください
(これをチェックしないと CGI として機能しないようになっています)


受け取ったpost_args を解読・整理の後 JIS 変換してあなた宛に
メールします。

なお、socket のテストを目的として、とりあえず組んでみたという
レベルのものですので、その点には注意してください。


… Socket 使ってメールの送信は CGI とは非同期で行われるため、
ユーザーに対する CGI からのリプライはめちゃくちゃ速いです。

→  RB_MailCGI_sample.hqx

田中求之 さんからのコメント
( Monday, May 25, 1998 02:03:03 )

上記のサンプルは、処理が重なったときに、はたして正しい内容のメールになるかどうか
保証されないという問題があります(試してないけど、理論的に考えて)。

実用のものにするには、ウィンドウかダイアログに Socket Control を埋め込んだ
オブジェクトを、処理の分だけ生成して同時に走らせるという方法をとる必要があり
ますね。


田中求之 さんからのコメント
( Monday, May 25, 1998 15:49:01 )

…っつうことで、Socket Control をウィンドウ単位で持たせるバージョンを
登録しておきます。これで、多重処理の状況でも、ちゃんとメールの処理が
できるはずです(メールの数だけウィンドウが開くはず)

メインのウィンドウの空いた所に署名設定欄を作ってしまいました。

Mail Test ボタンも作っておきましたので、アドレスの設定が終わったら
メールがちゃんと送れるかどうかをテストしてみてください(フロント
アプリケーションとして動かすと、Socket って高速ですねぇ)


→  RB_MailCGI_sample2.hqx

たまちゃん さんからのコメント
( Monday, May 25, 1998 16:12:32 )

むっちゃ、はやいですねえ。

田中求之 さんからのコメント
( Thursday, May 28, 1998 15:23:21 )

先程リリースされた DR1r35a で、send した AppleEvent の reply がとれるように
なりました。これで osax を直接コールできるはずですので、前薗さんの Encode MIME
などが使えることになります。

あとは、BooleanParam さえサポートしてもらったら、かなり使えるものになるな…

田中求之 さんからのコメント
( Thursday, May 28, 1998 15:52:57 )

WebSTAR にサーバーのステータスを問い合わせるのと、自作の osax をコールするのを
試してみましたが、どちらもばっちりでした。

Reply が string しか取れないのは、やはりかなりの制約になるかと思われますが、
それでも文字列を返す osax なら、これで自由自在に呼べますね(AppleScript
の埋め込みとどっちが簡単かは好みによるかな)


田中求之 さんからのコメント
( Thursday, May 28, 1998 19:21:34 )

…っつうことで、Tanaka's osax 2.0b を呼び出しているサンプルを登録して
おきます。

POP サーバーにアクセスして、メールが届いているかどうかの確認を行い、
届いているメールの容量がリストボックスに表示されます。で、このリストで
ダブルクリックしたメールの内容が、下のエリアに表示されます。

Socket で POP サーバーからメールをダウンロードしEditField に書き込む処理
のところで、JisToSjisという method を呼んでおり、その中で osax をコールし
ています。

使用条件は Tanaka's osax 2.0B がインストールされていることと、Finder
が動いていること (^_^; です。

なお、表示したメールはサーバーから削除しませんし、ちゃんと RSET でステータスの
変更も解除しますので、あとでちゃんとしたメールソフトで読んでください (^_^;;

ちょいといじれば POP からのメールの自動ダウンロード -> データベース登録
のエンジンなんてのもすぐ作れます。

→  pop_checker.hqx