JavaとPythonでGoogle WaveのRobotを作るには
株式会社鳥人間
郷田まり子
2009/10/22
【Python編】App Engineの利用準備
- - PR -
まずは、Robot開発のための環境を整えます。Pythonのバージョン2.5以上が必要です。コマンドラインから「python --version」と入力してチェックしてください。2.5未満だったら、適宜アップデートをしてください。
Robotの開発には、App Engine用のSDKが必要です。App Engine SDKを「Google App Engine SDK for Python」からダウンロードします(すでにインストール済みの方は、この作業は必要ありません)。Windows用・Mac OS X用・Linux用の3種類があるので、OSに合ったものを選んでください。
□ Windowsの場合
ダウンロードした「GoogleAppEngine_XXX.msi」のアイコンをダブルクリックします。
インストーラが起動するので、利用規約に同意したら指示に従って進めていきます。すると、SDKと「Google App Engine Launcher」がインストールされます(※注:Windows版にApp Engine Launcherが同梱されるようになったのは、バージョン1.2.5以降です。GUIで簡単にアプリケーションの作成・デプロイができるので、これより古いバージョンをお使いの方はぜひアップデートしてみてください)。
![]() |
| Google App Engine Launcher(Windows) |
□ Mac OS Xの場合
ダウンロードしたディスクイメージを開き、「GoogleAppEngineLaumcher.app」をアプリケーションフォルダにドラッグ&ドロップします。
![]() |
| Google App Engine Launcher(Mac OS X) |
□ Robot開発用Pythonライブラリ
SDKのインストールが済んだら、どこか適当な場所に作業ディレクトリを作ってください。 次に、Robotを開発するためのPythonライブラリを入手します。「Wave Robot Python Client Library」をダウンロードして伸張し、ディレクトリ名を「waveapi」に変更して作業ディレクトリ直下に置きます。下記コマンドのように、Subversionで取得する方法もあります。
localhost$ svn checkout http://wave-robot-python-client.googlecode.com/svn/trunk/src/waveapi waveapi
【Python編】設定ファイルを書く
まずは、アプリケーションの設定ファイル、app.yamlを書きます。
application: applicationName
version: 1
runtime: python
api_version: 1
handlers:
- url: /_wave/.*
script: applicationName.py
- url: /assets
static_dir: assets
application要素には、アプリケーションIDを記述します。App EngineのWebインターフェイスから登録したIDを書きます。
application: applicationName
handlers要素の下に、スクリプトハンドラと静的ファイルハンドラを記述します。アプリケーションディレクトリ内のパスとURLを関連付けていきます。まずは、Robot本体です。
- url: /_wave/.*
script: applicationName.py
ここに、Robot本体となるスクリプトのファイル名を指定します(アプリケーションIDと一致している必要はありません)。静的なファイルのマッピングをするには、script要素ではなく、static_dir要素に記述します。Robotのアイコンなどを置く場合は、ここで指定したディレクトリに格納します。
- url: /assets
static_dir: assets
【Python編】コード部分の実装
PythonでRobotを実装していきます。まずは、スクリプト全体をご覧ください。
from waveapi import events
from waveapi import model
from waveapi import robot
def OnParticipantsChanged(properties, context):
added = properties['participantsAdded']
for participant in added:
Greet(context, participant)
def OnRobotAdded(properties, context):
root_wavelet = context.GetRootWavelet()
root_wavelet.CreateBlip().GetDocument().SetText('Hi, everybody!')
def OnBlipCreated(properties, context):
blip = context.GetBlipById(properties['blipId'])
blip.GetDocument().AppendText(':-)')
def Greet(context, participant):
root_wavelet = context.GetRootWavelet()
root_wavelet.CreateBlip().GetDocument().SetText('Welcome, ' + participant)
if __name__ == '__main__':
myRobot = robot.Robot('appName',
image_url='http://appName.appspot.com/assets/icon.png',
version='1',
profile_url='http://appName.appspot.com/')
myRobot.RegisterHandler(events.WAVELET_PARTICIPANTS_CHANGED, OnParticipantsChanged)
myRobot.RegisterHandler(events.BLIP_SUBMITTED, OnBlipCreated)
myRobot.RegisterHandler(events.WAVELET_SELF_ADDED, OnRobotAdded)
myRobot.Run()
このコードの中身を追っていきます。
from waveapi import events
from waveapi import model
from waveapi import robot
まず冒頭で、Robot開発に必要なライブラリをインポートしています。
□ イベント操作
次に、main関数でRobotを定義し、イベントハンドラを追加し、Robotを起動します。
if __name__ == '__main__':
myRobot = robot.Robot('appName',
image_url='http://appName.appspot.com/assets/icon.png',
version='1',
profile_url='http://appName.appspot.com/')
myRobot.RegisterHandler(events.WAVELET_PARTICIPANTS_CHANGED, OnParticipantsChanged)
myRobot.RegisterHandler(events.BLIP_SUBMITTED, OnBlipCreated)
myRobot.RegisterHandler(events.WAVELET_SELF_ADDED, OnRobotAdded)
myRobot.Run()
Robotの定義には、Robotの名前(アプリケーションIDと同一である必要はありません)と、そのほかのオプションとしてアイコンのURL・バージョンを渡します。
myRobot = robot.Robot('appName',
image_url='http://appName.appspot.com/assets/icon.png',
version='1',
profile_url='http://appName.appspot.com/')
myRobot.RegisterHandler(eventType, eventHandler)では、イベントの種類を指定して、イベントハンドラを追加しています。
myRobot.RegisterHandler(events.WAVELET_PARTICIPANTS_CHANGED, OnParticipantsChanged)
参加者の変更時(events.WAVELET_PARTICIPANTS_CHANGED)に、前半で定義したOnParticipantsChanged 関数を呼び出すようにしています。
イベントの種類として、以下のようなものがあります。
| 表2 Pythonのイベントハンドラ | ||||||||||||||||||||||||||||||||
|
注意 「使用していなかったイベントに対するハンドラを登録したくなった場合」 |
Robotのコードに変更を加え、いままで使用していなかった種類のイベントに対するハンドラを登録したくなった場合には、下記のようにRobotのバージョンを上げてください。
Robot生成時の引数としてversionを渡していますが、これがRobotのバージョン(≠アプリケーションのバージョン)です。これを更新しないと、新たに対応しようとする種類のイベントに反応しません。 WaveサーバがRobotを呼び出したとき、まず、どの種類のイベントが発生したときにRobotとのHTTP通信を行うべきかを把握するために、「http://<appName>.appspot.com/_wave/capabilities.xml」を読み込みます。 このXMLファイルはRobotアプリケーション側が自動生成するもので、Robotの設定が書かれています。例えば、先ほどのコードからは、以下のようなXMLファイルが生成されます。
Robotのバージョン番号はこの設定ファイルに埋め込まれますが、この値に変更がない場合、設定がキャッシュされてしまいます。 |
□ Blipを生成
先ほどイベントハンドラに登録した関数を見ていきます。Waveの投稿内容や参加者情報にアクセスし、発言を加えたりしています。
まずは、自分自身が参加した直後の処理。main関数内のmyRobot.RegisterHandler(events.WAVELET_SELF_ADDED, OnRobotAdded)の部分で登録したものです。
def OnRobotAdded(properties, context):
root_wavelet = context.GetRootWavelet()
root_wavelet.CreateBlip().GetDocument().SetText('Hi, everybody!')
Blipを生成し、その内容をセットしています。これで、Robotは自分自身が参加したときに「Hi, everybody!」というあいさつをするようになります。Blipは、Waveにおける会話の単位です。画面内では枠に囲まれた外観をしていて、Blipの中には、さらにBlipを子要素として付加していって木構造を作ることができます。
![]() |
| 枠に囲まれた部分がBlip |
□ Blipの追加
次は、参加者に変更があったときの処理です。main関数内の、「myRobot.RegisterHandler(events.WAVELET_PARTICIPANTS_CHANGED, OnParticipantsChanged)」の部分で登録したものです。
def OnParticipantsChanged(properties, context):
added = properties['participantsAdded']
for participant in added:
Greet(context, participant)
properties['participantsAdded']で、新たに追加したユーザーのIDのリストを取得し、ループで回してあいさつをします。
def Greet(context, participant):
root_wavelet = context.GetRootWavelet()
root_wavelet.CreateBlip().GetDocument().SetText('Welcome, ' + participant)
Blipを生成し、「Welcome, <ユーザーID>」という文字列をセットしていきます。新規Blipが生成されたときの処理です。main関数内の、「myRobot.RegisterHandler(events.BLIP_SUBMITTED, OnBlipCreated)」の部分で登録したものです。
def OnBlipCreated(properties, context):
blip = context.GetBlipById(properties['blipId'])
blip.GetDocument().AppendText(':-)')
そのイベントで新規追加されたBlipのIDがproperties['blipId']で取得できます。このIDを使用して、新しく加わったBlipを取得します。その中身にアクセスし、末尾に「:-)」という文字列を付加しています。
events.BLIP_SUBMITTEDのイベントは、Robot自身がBlipを追加したときには発生しません。これはRobot APIの仕様です。
【Python編】クラウドにデプロイ
App Engineランチャーを使って、App Engineのクラウドにデプロイします。メニューから、[File]→[Add Existing Application]を選ぶと、既存アプリケーションの追加ダイアログが開きます。作成したRobotアプリケーションのディレクトリを選択します。
![]() |
| デプロイするためのダイアログ |
アプリケーション一覧に、Robotアプリケーションが加わります。アプリケーションIDなどは、app.yamlから自動で読み込まれますので、あらためて入力する必要はありません。
![]() |
| ランチャーに追加されたアプリケーション |
選択して、Deployアイコンを押します。App Engineへのログインを促すダイアログが出るので、メールアドレスとパスワードを入れて「ログイン」をクリックします。[内部]のチェックボックスは外しておきます。
![]() |
| App Engineへのログイン |
デプロイの過程がコンソールに表示されます。「appcfg.py has finished with exit code 0」と表示されればデプロイ完了です(exit code の値が0以上の場合は失敗です)。
![]() |
| デプロイ成功! |
これで、Robotが利用可能になりました!
| 1-2-3-4 |
| INDEX | ||
| Google Wave API開発ガイド(後編) JavaとPythonでGoogle WaveのRobotを作るには |
||
| Page1 Google WaveのRobotをGoogle App Engineに作る Google App Engineの基本的な使い方 |
||
| Page2 【Java編】App Engineでの開発準備 【Java編】Robot開発の準備 【Java編】コード部分の実装 【Java編】設定ファイルを書く 【Java編】クラウドにデプロイ |
||
| Page3 【Python編】App Engineの利用準備 【Python編】設定ファイルを書く 【Python編】コード部分の実装 注意 「使用していなかったイベントに対するハンドラを登録したくなった場合」 【Python編】クラウドにデプロイ |
||
| Page4 作成したRobotをWaveに参加させるには App Engineでのデバッグ 終わりに |
||
Google Wave API開発ガイド バックナンバー 連載インデックスへ»
- 第1回 プレビュー公開が始まったGoogle Wave「超」入門
- 第2回 JavaとPythonでGoogle WaveのRobotを作るには
| リッチクライアント&帳票 全記事一覧へ |
ホワイトペーパー(TechTargetジャパン)
- 画像を美しく魅せる効果を加えるjQueryプラグイン3選 (2010/3/17)
2つ重ねて比較するBefore/After、部分ごとに切り替えるpanelGallery、ズーム/カーテンなどができるcycle - 現場の無駄な流血を止めるための「プロトタイプ」とは (2010/3/12)
サイトやWebアプリ/RIAの設計やデザインを効率良く進めるには、プロジェクト関係者の想定を一致させていくことが大事だが… - Flashを閃光のごとく高速化するための基礎知識 (2010/3/9)
Flash高速化のための基礎知識や実践的テクニックを紹介する連載。初回は“処理負荷”を調べる具体的な方法を解説します - Windows 7でどんだけ“おばか”なアプリが作れるの? (2010/3/4)
おばかの発想の源やアプリの作り方などについて、おばかアプリ選手権の歴戦の受賞者や、マイクロソフトの代表者に話を伺った。アイデアのご参考に
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
| 「いつかは壊れるサーバ」そんな故障に 迅速で安価に手軽に対応する方法とは? New! |
| 「特権ユーザー」の事件を防げ! 万能権限を持つユーザーの管理方法とは? New! |
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | TomcatやJBossなどAPサーバ環境に関する 情報を集約! “業務”用APサーバ大百科 New! |
| ◆ | 一気に解説! 最新のクラスタストレージ 「RAIDを超えたストレージ基準」……など New! |
| ◆ | クラウド的ユーザー体験の変化は脅威か? 仮想化技術を使いこなす運用管理術を紹介 New! |

| ◆ | 上司や部下、部署内メンバーとの情報共有 を“ガラッ”と変えるコラボツールとは? New! |
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |

| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |
| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |

| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |
| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |

| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |
| ◆ | その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |













