内蔵(笑)

shin1ogawa ja nightでは、このgoogle モデレーターでappengineに関する質問を受け付けています。

ちょっとのぞいてみたらこんなことが書いてありました。

"俗に「内蔵見える系」として知られるbalmysundaycandyが何をしているのか、イマイチ理解できません。具体的な利用方法を含めて、わからないことが多くて困っています。わかりやすく解説していただけないでしょうか?"

なにこれ。どうしたらいいのかよくわかりません><





ということで、わかりやすく解説します。
さき言っておくと、たいしたことはしてません。

1. なにやってるの?
これまで、
・lower level apiの構成を調べて型安全なlower level apiとその拡張実装
 →urlfetch asyncが出たので、そのうちdatastore asyncも公式サポートじゃないか、と思って止めてる。有益な部分は各種appengine datastore alternativesで実装されてたりするので、正直やる意味はあまりない。
・lower level apiの呼び出しをサーバーサイドで捕捉
 →appstats/javaがリリースされましたねそうですねやっぱ純正ですよね。僕も純正使いますよ。
・scalaから対話的にRPCする
 →googleが狙ってない場所をやっと見つけた!

という感じで、lower level apiばっかり触ってきました。


lower level apiを触っていて気になるのは、apiの呼び出しがどのようなデータ構造に変換されて実行されているのか、というところに集約されてきます。




というか、java版はコードが公開されていませんが、python版は公開されているので、その気になればいくらでも解剖できます。
その気になったのが僕だというだけの話です。


balmysundaycandy-scalaに限らず、解剖系のロジックは、

http://code.google.com/p/balmysundaycandy/source/browse/trunk/balmysundaycandy-core/src/balmysundaycandy/core/operations/ProtocolBufferObjectHolder.java

を見ればわかるようになっています。marble-brokerでも使っていたロジックは同じです。単純に元の型に戻してます(実はここまでやる必要はなかったり)。


protocol buffersのソースコードを見ればわかるように、javaインスタンスとしての内部表現は、toStringするだけで人間が読める表現に変換されます。

http://code.google.com/p/protobuf/source/browse/trunk/java/src/main/java/com/google/protobuf/AbstractMessage.java

http://code.google.com/p/protobuf/source/browse/trunk/java/src/main/java/com/google/protobuf/TextFormat.java

この追いかければわかります。


この二つを前提知識とすればやっていることは見えてくるはずで、ApiProxy#makeSyncCallをフックしてbyte配列を人間が読めるようにしているだけということがわかります。
さらに、それを対話的に見られるようにしているのがbalmysundaycandy-scalaの実装です。



2. 具体的な利用方法
いろいろ流れてるの見てたら楽しくない?
楽しくないなら関係ないかも。

まあ、要するに、balmysundaycandy-scalaを起動してLogMode.verboseしたときに見える新しい世界があなたにとって非常に有益ならば、それはとてもすてきなことだと思うのです。



とはいえ、見えるだけで意味がないのはその通りで、見えるものに対して意味を与える必要もあります。

このへんはおいおい、例えば、


http://code.google.com/p/balmysundaycandy/issues/detail?id=14


なんかが達成されたら有効な学習経路になるんじゃないでしょうか。