愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

Google Wave追悼にちなんでShindigのwave featureを試してみた

仕事でApache Shindigというプロダクトに関わっているのだけど、その関係でShindigプロジェクトのtrunkを時々svn upして、最新版のShindigにどのような更新があるのかチェックしている。

それで、この前svn upをかけたらtrunk/以下にextras/src/main/javascript/features-extras/wave なんていうディレクトリが追加されていたので、wave終了のお知らせの後だったこともあり「これはもしや...!奴ら、まだ諦めてなかったのか!」と思って中身を見たところ、どうやらShindig上でWaveガジェットを動作させるために追加されたfeatureらしい。ドンピシャだ!


今日目を覚ましたらwave追悼会に参加している人々がTwitterで散見されたので、思い出して試してみることにした。Shidigプロジェクトの本当の先っちょなので、当然ながらwave featureの実装されているSNSは今のところ存在しない(と思う)。なのでちょっと珍しい光景かもしれない。

ちなみに、結論としては完全に動かすところまでは至らなかった。(無理やり動かしてもいいけど、Shared StateじゃないWave Gadgetとか動かしてもしょうがないし)

Shindigの最新をmavenビルドするとずっこけまくり、それらを一々潰していくのも面倒なので安定版(shindig-project-1.1-BETA5-incubating)をベースに、features/src/main/javascript/features 以下に最新のShindigのfeatures-extrasからlocked-domainディレクトリおよびwaveディレクトリを丸ごとコピーしてmvn -Dmaven.skip.test=true; mvn -PrunでShindigを起動することでwave feature入りのShindigを起動できた。(ちなみにfeatures/features.txtに features/wave/feature.xml を追記する必要あり。


んでまあ、ここらを参考にWave Gadgetを作って、Shindig付属のsample container(opensocialでは、Gadgetを動作させる外側SNSのことをcontainer:コンテナという)の上で動作させてみたのがこれ。



見た目ほとんどwave関係ないガジェットだけど、Gadget XMLの内部ではwaveとかwave.ui以下にくっついた、いわゆるWave API + α的なものが使えるようになっている。○×の下にあるダイアログ等はwave.ui以下のAPIで生成したもの。

FirebugのコンソールでUnknown RPC Service: とか出ているのは、内部で使われているstateオブジェクトのsubmitDeltaメソッドがgadgets.rpc.registerで登録されていないgadgets.rpc.callを呼んでいるため。ここではあまり詳しく説明はしないが、gadgets.rpcとはShindig内蔵のContainer <-> Gadget間あるいはGadget <-> Gadget間でクロスドメイン通信を行うためのライブラリである。クロスドメイン通信というと仰々しいが、だいたいの近代的なブラウザではpostMessage()で実現されている。



上の画像は、gadgets/ifrというShindigにGadget XMLレンダリングさせるための受け口に対してurl=というクエリパラメータでGadget XMLのURLを投げてGadgetをレンダリングさせ、waveオブジェクトの中身をFirebugで覗いているところ。それっぽいメソッドが色々ぶら下がっている。

実際にGoogle Wave上のGadgetのように皆で同時にワイワイいじれるGadgetを実現するためにはShared Stateが何しかの方法で実現されていたり、XMPPでプッシュしたり、ということが必要になるとおもうのだが、Shindigのextrasに入っているwave featureではどうもstateの共有とかはまだ考えられていないっぽい。Wave APIこそ提供されているが、stateは各ユーザのブラウザに載ったまま、という感じに見える。このへん、stateの共有をどう実現するのだろうか。


【結論】
Waveは滅びぬ!何度でも蘇るさ!Wave GadgetがShindigを利用したSNS上でウネウネ動く日がいつか来る!…のかもしれない。