■2005-03-16
* [メモ] JSON-RPCとjsolait
さて、とりあえずJSON.pmとJSONRPC.pmをこさえたので、PerlでJSON-RPCのCGIサーバがつくれるようになりました。しかしせっかくサーバがあっても動作を確かめるためにクライアントが必要です。ここでJSON-RPCのクライアントをお手軽に構築するのにjsolaitが便利なようです。っていうか、このjsolait というのは大変多機能。でもjsolaitについて解説している日本語のページがあまりないので、ちょっとメモ。
"JavaScript O Lait"は、再利用可能なモジュールおよびコンポーネントのライブラリと、より単純なクラスおよびモジュール管理機能を提供することで、JavaScriptの開発を楽にする代物で、ライセンスはLGPL。特徴は:
- 他の言語でお馴染みのOOP機能をJavascriptで行うためのフレームワークを提供
- Stringオブジェクトにsprintfみたいな機能を追加 "you got %d mail(s)".format(10);
- 各種モジュール
- codecs - base64、urlなど
- crypto - rc4ぽいやつ
- jsonrpc - JSON-RPC!
- lang - JSON <=> Javascriptオブジェクト変換
- stringformat - 上のsprintfみたいなメソッド
- urllib - http post, get等の諸機能
- xml - xml関連
- xmlrpc - XML-RPC
- 多ブラウザとの互換性
IEでもArray.shiftとかArray.pushが使えるようになったり、Fuctionオブジェクトにapplyやcallメソッドが追加されたりとか。
例えば
<script src="init.js"></script> <script src="lib/urllib.js"></script> // init.jsは必須 // lib/urllib.jsでhttp接続関連 <input type="text" id="textForm"> <script> <!-- var text = 'Hello World.'; var jsonrpc = importModule("jsonrpc"); var server = new jsonrpc.ServiceProxy("xxx", ["echo"]); var callback = function(result,err){ if(result) textForm.value = result; if(err) alert(err); }; // 結果の処理 // 引数はサーバの戻り値、エラー try{ server.echo(text, callback); // async } catch(e){ reportException(e); } /--> </script>
echoメソッドを呼び出すときに最後の引数にFunctionオブジェクトを渡すと非同期に。これだけでできちゃうから楽でございます。
* [メモ] jsolaitの使い方
主にtutorialから。
■基本
とにかくまず最初に<script type="text/javascript" href="./jsolait/init.js"></script>する。パスは各自の環境に合わせて。
■モジュールを使う
モジュールの利用にはimportModule( name )
。返値はモジュールオブジェクト。ブラウザによっては(例えばIE)ソースファイルが自動的に読みこまれる。一度importModuleで呼び出したモジュールを再度importModuleで呼び出してもファイルは読み込まれない。自動読み出し機能の使えないブラウザでは<script href="xxxxx"></script>で対応。
■モジュールの作成
Module
を使う。引数は3つ:モジュール名、バージョン、関数オブジェクトModuleScope(mod)
。関数オブジェクトはモジュール生成時に呼び出され、一度生成されると、jolaitに登録され、import可能となる。引数mod
はこのモジュール自身のオブジェクト。コンストラクタ内でvar宣言した変数はpivateとなり、modにセットしたプロパティはpublicとなる。そしてvarせずに宣言した変数はglobalなオブジェクトとなる。jsolaitライブラリは、globalオブジェクトとしてjsolait、Class、 Module、importModule、ReportExceptionなどを定義。
■クラスの作成と継承
Class
を使う。引数として関数オブジェクトClassScope(publ)
を受け取る。この関数オブジェクトはクラスのpublicメンバを設定するオブジェクトpublを受け取る。継承するクラスをつくるには、第一引数に親クラスオブジェクト、二番目に関数オブジェクト(ClassScope)を渡す。この場合の関数オブジェクトはpublの次に親クラスオブジェクトsuprをうけとる。クラスオブジェクトのインスタンスを生成するときに初期化処理としてinitメソッドが呼ばれる。
* [メモ] jsolaitの使い方2
てな具合で文章を書いても訳分からないので如何にありがちな例。
// creature.js内 // モジュール生成 // modはモジュール自身 // mod.propはpublic // var宣言したものはprivate // クラスの作成 // publはクラス自身 // publ.propはpublic // var宣言したものはprivate // initは初期化メソッド // (インスタンス生成時に呼び出される) Module("creature", '1.0', function(mod){ mod.Animal = Class(function(publ){ publ.init = function(name,sex){ this.name = name; this.sex = sex; } }); // 継承 Classの第一に親クラスを渡す // suprは親クラスオブジェクト // supr(this).methodで // 親クラスのメソッドを呼び出す mod.Dog = Class(mod.Animal, function(publ, supr){ var num = 1; // unique id. publ.init = function(name,sex){ this.id = num++; supr(this).init(name,sex); } publ.bark = function(){ return "bow wow"; } }); }); // 別ファイルやブラウザ var crt = importModule('creature'); var dog = new crt.Dog('Poti','male'); alert("%s barks ".format(dog.name) + dog.bark());
Javascriptリッチクライアントに繋がりそうなネタ、長らく言及できなかったの2件。 世間ではajaxとかいうのが流行ってるらしい? - hogemanのコアダンプMapserverの関連プロダクトにArcIMSエミュレータというのがあります。 このツールでエミュレートするESRIのArcIMSサー..
jsonつながりで、メモ。 JSON-RPC http://www.json-rpc.org/ XML-RPC とは? http://www.linux.or.jp/JF/JFdocs/XML-RPC-HOWTO/xmlrpc-howto-intro.html はてなダイアリー - XML-RPCとは http://d.hatena.ne.jp/keyword/XML-RPC XML-RPC 仕様書 http://lowlife.jp/yasusii/..