When it’s ready.

出来るまで出来ない

誰も知らない夜のwaveのrobot

GDD参加者へのwavesandboxアカウントの配布が始まったようです。私のwaveのInboxも日本語のwaveが増えてきています。現在まだ使い方を探っている段階で、挨拶だったりFont弄ってみたり、写真をのせあったりしている方も居ます。

常用するには、まだ、サービス自体が安定していないためしばらくは実験的な使い方で行くと思いますが、waveの機能としてはそれ自体を使うだけでなくEmbededやExtensionも使うことが出来ます。

簡単なロボットの作り方

waveに載せるロボットは、簡単に作成することが出来ます。必要なのは、GAEのアプリケーションです。
最小構成のGAE/Pだとファイル2つから始めることが出来ます。

app.yaml
robot.py

以下ソース
app.yaml

application: YourRobotName
version: 23
runtime: python
api_version: 1

handlers:
- url: /_wave/.*
  script: bot.py

- url: /
  static_dir: img

robot.py

# coding:utf-8
from waveapi import events
from waveapi import model
from waveapi import robot
import logging

def blipSubmitted(context, result):
  blipText = blip.GetDocument().GetText()
  root_wavelet = context.GetRootWavelet()
  logging.info('addContentToBlip result: %s'%( result ))
  root_wavelet.CreateBlip().GetDocument().SetText("%s"%( blipText ))
  
if __name__ == '__main__':
  irobo = robot.Robot('YourRobotName',
                      image_url='http://YourRobotName.appspot.com/icon.png',
                      profile_url='http://YourRobotName.appspot.com/')
  irobo.RegisterHandler(events.BLIP_SUBMITTED, blipSubmitted)
  irobo.Run()

これだけで、書き込みを確定したタイミングで、Blipの内容と同じ物でRobotが返信してくれます。たとえばもらったテキストにケンブリッジメソッド噛ませてみるとか、YahooキーワードAPI通してみるとかやってみるとおもしろいです。がしかし、現在2byte文字が正常に受け取れないので、アルファベットで遊ぶ事しかできません。(この件に関しては、I/OでもGDDでもwaveチームに伝えましたのでそのうち解決されると思います)

また、頻繁にDeployしていると、たまにRobotが反応しなくなるときがありますがそんな時には、GAEのコンソールからバージョンを切り替えてみると再び動作してくれるようになるときがあります。ダメ元でやってみてください。

もう少し込み入った使い方

まるごと受け取って、丸ごと追加するのは簡単ですが実際は、入力された物に対して、置き換えや追加、削除と言った操作をしたくなると思います。そんな際のサンプルになります。Rangeを使います。先ほどのロボットを改造していきます。

robot.py

# coding:utf-8
from waveapi import events
from waveapi import model
from waveapi import robot
import logging

import document


def blipSubmitted(context, result):
  blipText = blip.GetDocument().GetText()

  a = list(blipText)
  a.reverse()
  b = ''.join(a)
  
  end_point = len(blipText)
  r = document.Rnage(0, end_point)
  blip.GetDocument().SetTextInRange(r, b)
  
if __name__ == '__main__':
  irobo = robot.Robot('YourRobotName',
                      image_url='http://YourRobotName.appspot.com/icon.png',
                      profile_url='http://YourRobotName.appspot.com/')
  irobo.RegisterHandler(events.BLIP_SUBMITTED, blipSubmitted)
  irobo.Run()

これで、入力した文字を全部逆順にして置き換える様になりました。
取得する範囲を色々変えたりしてみると楽しいかと思います。

waveきっかけでGAEのデプロイの簡単さに改めて気づく

Robotをさわり出すと、簡単にどんどん機能を追加できてしまうのであっという間に時間が過ぎていきます。現状では、GAEの本番環境に上げないとロボットが動作してくれません。GAEはデプロイが非常に簡単ので(回線さえ速ければ)あまりストレスを感じません。ロボットが動作する環境は、全く普通のGAEですので、Detastore、Cronや、最近導入されたTaskも使用可能です。今回はPythonのサンプルになりますがJavaでの実装も可能です。(Java版は、XMLを別途作成する必要が有るみたいです、使ったこと無いので分かりません)

まだ、GAEを触ったことがない方も上記サンプルコードの通り非常に簡単なコードで実行が可能です。是非、AppIDを取得して遊んでみてください。waveもロボも相互作用が肝心で、今後は様々なコードの連携と多様性がキーになると考えています。robotやgadgetを色々作っておもしろい物が出来たら是非私も遊ばせて貰えればと思います。participantsに勝手に追加して貰って結構です。アカウントは、a2c@wavesandbox.com です。wave上でも質問待ってます。

参考リンク

伝説のOPIエンジニア様が書いたとても分かりやすいRobot説明ページ
http://gihyo.jp/dev/serial/01/google-wave/0002

GoogleGroupにもwaveの日本語でのグループがあります。
http://groups.google.com/group/google-wave-api-japn?hl=ja&lnk=