=============================================================================== Shiolink/Perl Simple:Perl栞 with 栞プロキシDLL =============================================================================== Version : 1.0 ■Shiolink/Perl Simpleとは? プロキシSHIORI「SHIOLINK.DLL」を使用したPerl栞です。 ・基本構造 ベースとなる技術は既存のPerl栞「里珠/Proxy」とほとんど変わりません。Perl内部か ら関数呼んで引数渡すか、STDINから読むか、位の違いです。 試してませんがオーバーヘッドはパイプな分若干こっちの方が悪いかもしれません。 ・栞フレームワーク ベースシステムだけぽんと渡されても何もしてないのと同じなので、とりあえず栞とし てちょっと書けばすぐ使えるように簡単な枠組みだけ作ってみました。 方針としては、里珠を使った主要な栞作成フレームワーク「なゆき」の実装とは 打って変わって、素朴でミニマルな実装を目指しました。 ……Simpleじゃない方はちゃんとオブジェクト指向ですが、やたら大それたこと(華和梨 エミュレートとか)をしようとして完成しないのでベースとなるSimpleを公開します。 ■ゴースト構成 ・ファイル構成 ghost/masterの中にあるファイル licenses/ StrawberryPerlの再配布ライセンス perl/ perl本体とPerlのライブラリ scripts/+ 栞を構成するスクリプト | init.pl SHIOLINKから起動されるスクリプト | shiori.pl SHIORI応答の簡単な実装 | events.pl 各イベント処理の定義 | (kis_lesser.txt) events.plの実装例で使用するテストデータ descript.txt いつもの SHIOLINK.dll shiori.dll代替 SHIOLINK.INI SHIOLINKの設定ファイル test.bat デバッグ用 test_req.txt デバッグ用 このうちいじるべきなのは基本的にscripts/events.plのみです。 ・全般 SHIOLINKが発行するSHIORI要求はUTF-8でPerlに渡されるので、PerlIOレイヤ:utf8を STDIN,STDOUTにかませて、ソースは全てuse utf8しています。 ・init.pl SHIOLINKによってghost/master/perl/bin/perl.exeから呼ばれます。 ghost/master/perl/libをライブラリのディレクトリに設定します。 入出力に:utf8レイヤを設定し、入出力のキャッシュ抑制を設定します。 shiori.plにあるShiori::mainloopを実行します。 ・shiori.pl このスクリプトはinit.plから単純にrequireされ、Shiori::mainloopが呼ばれます。 SHIORI応答を実現する簡単なシステムを構成します。 全体がpackage Shioriのスコープに入っており、このシステムの構成がイベント実装な どに名前の制限などをもたらさないようになっています。 Shiolink/Perl SimpleのSHIORI応答処理は至ってシンプルです。 Shiori::mainloopでSHIOLINKからのSHIORI APIのload,request,unloadにあたる呼び出し を処理します。 loadで$system->{loaddir}にghost/masterのパスを格納し、requestでSHIORI要求に対す る応答を呼び出し、unloadでexitします。 SHIORI要求に対する応答は、parse、callback、responceの3関数で構成されています。 parseはコマンド行のメソッド(GET等)、タイプ(SHIORI/SAORI)、バージョン(3.0等)を分 割し、またリクエストヘッダを解釈してハッシュリファレンスに格納します。 callbackはSHIORI/3.0のIDヘッダ名に一致する関数名の関数を実行して応答をValueヘッ ダやステータスコードに格納します。また一部のリクエストについては自動的に望まし いデフォルトの応答を返します。 responceは以上で生成されたステータスコードやレスポンスヘッダを元にSHIORI/3.0の 応答を返します。 イベント関数の実装に直接関係するSHIORI要求に対する応答関数の動作概要は以下の通 りです。 0.SHIORI要求を受け取ります。 1.要求イベントがくると、パッケージ名のない(つまりmain::の)関数でイベントID (OnBootなど)と関数名が一致するものを実行します(ここで呼ばれる関数は次項目に述 べるevents.plに書かれることが想定されています)。ただしPerl文法の関係で、IDの 中の'.'は'_'に置換されます。 第一引数はリクエストのヘッダすべてが入っているハッシュリファレンス、第二引数 は'SHIORI'または'SAORI'の文字列です。 返値には第一返値にValue(発話内容のさくらスクリプト)を返してください。 オプションとして第二引数にステータスコード数値(204など)、第三引数にValue以外 のヘッダ(OnCommunicateなどで使用する)のハッシュリファレンスを返せます。 2.Valueやステータスコード、その他のヘッダをもとに適切なSHIORI応答を返します。 ・events.pl このスクリプトはinit.plから単純にrequireされます。なので名前が気に入らなかった らそこの記述だけ変えればいいです。 ここにshiori.plから呼ばれる各イベント名のサブルーチンを定義します。 use utf8してUTF-8(BOMなし)で保存してください(notepadだとBOMがつきます)。 SHIORI応答からの呼び出し仕様に従った関数の実装例を以下に示します。 sub OnEventID{ # 関数名はイベント名(OnBootなど '.'は'_'に置換) # 第一引数:リクエストのヘッダすべてが入っているハッシュリファレンス # ヘッダ名がキーです($requestheaders->{Reference0}など) my $requestheaders = shift; # 第二引数:'SHIORI'または'SAORI'が入っています。 my $type = shift; ... # 返値 # 第一返値:発話内容のさくらスクリプト(Valueヘッダ内容) # 第二返値:ステータスコード(省略可) # 第三返値:Value以外のヘッダのハッシュリファレンス # ($headers->{Reference0} = 'しおりん'など)(省略可) return $value,$statuscode,$headers; } またイベント名でないsub initとsub endに栞の起動終了時の処理を別途書きます(省略 可)。 名前空間Shiori::以外は予約されていません。strictもかかってないし好き勝手に実装 してください。 なおスクリプト実行時のカレントディレクトリはSHIOLINKの仕様でghost/masterです。 必要ならevents.pl冒頭でchdirするなりしてください。 ・その他 短いので実際ソース見た方が早いです。 shiori.plの中のparse,callback,responceが主な処理なのでせいぜい60行くらいだし。 events.plも本当に基本的なイベントは書いたので参考にしてください。 ■注意 ・モジュール Lang栞ってのはLangだから何でもできるぜ!という趣旨だと思うのですが、配布他諸々 を極力ミニマルになるようPerlのライブラリを省いた結果、utf8とPerlIO関連のみしか 入れていません。結構ストイックな環境です。 なので必要モジュールがない場合は適宜追加してください。たぶん普段オブジェクト指 向的な組み方をしている人には不便な環境だと思います。 たとえばuse strictやuse warningsを使う場合でも、Perlの標準配布ライブラリから strict.pmとwarnings.pmをとってきてghost/master/perl/libに入れる必要があります。 また、正規表現で[0-9]とか使う場合は、標準ライブラリ中utf8_heavy.pl、他何かの機 能を使うときに標準ライブラリ中unicore/Heavy.plがいりました。 現在perl/libに入っているutf8_heavy.plはstrictやwarningsをコメントアウトしたもの なので、実際色々な機能を使う場合はutf8_heavy.plも正規のもので上書きする必要がで てくるかもしれません。 PerlIO関連モジュールも減らすため':encoding(utf8)'じゃなくて':utf8'ですし。 ■その他 ・雑感 Perlという既存言語を使うのだから当たり前だけど、もう関数とか実装してあるしどっ ちかって言うと栞作りと言うより華和梨ミドルウェア作りに似てる。 ・今後の展望 これはSimple版としていくらかは更新したいですが、いまのところ最終的にもわりと簡 易な実装しか行わない予定です。Perlの特性にあった設計というのが今ひとつ思いつか ないっていうか、「なんでもいいよ」ほど困る条件はないっていうか……。 大それた方はぼちぼち。 ■ライセンス 本ghostのPerlスクリプトは、Perlのライセンスに従うことにします。 利用しているライブラリ、シェルはそれぞれのライセンスを参照してください。 ■利用したライブラリなど SHIOLINK.dll : どっとステーション http://code.google.com/p/shiori-basic/ http://d.hatena.ne.jp/dot_station/20080528/p1 Perl : Vanilla Perl Project http://strawberryperl.com/ MinGW : MinGW (perl.exeの依存関係) Strawberry Perlと一緒に入手できます ほかにMicrosoft C Runtime Library (msvcrt.dll)が必要です。割と入ってる? ■配布元・作者 ・配布元 原色奈良阪 http://narazaka.net/c/ukagaka/ghost/shiolink_perl_simple/ ・作者 奈良阪某 <いんふぉ@ならざかどっとねっと> ■更新情報 ・2011/11/13 13:08 readmeを更新 ・2011/11/13 12:46 GCCのランタイムライブラリlibgcc_s_sjlj-1.dllが不足していたのでMinGWのない環境( またはStrawberryPerlのない環境)では起動できなかった。アーカイブを作り直し。 ・2011/11/13 同じくアイコン定義を追加。 ・2011/11/12 ネットワーク更新動作確認を兼ねて、events.plにある切り替え反応(OnGhostChanged)を 更新。 ・2011/11/12 Shiolink/Perl Simple 1.0公開