手のひらサイズ、少し未来のAndroid Botの作り方
面白いOSSプロジェクトを見つけたので紹介します。コンセプトは手のひらに乗るBot。SiriやGoogle Nowのような対話型のインターフェイスを自分でも作れる面白さがあります。
Botとは
最近、hubotのようなBotが流行っていますが、Botはチャットを通じたメンションなどでコマンドを受け付け、コマンドの種類に応じた処理を実行して結果を返す単純な仕組みで動いています。
hubotに代表されるBotはプロダクトをビルドしたり、画像を探して来たりと簡単なお使いができるため、プロジェクトでもお馴染みの存在となりつつあります。
AndroidをBotにする"robota"プロジェクト
今回みつけたrobotaはhubotとは少し毛色が異なり、Androidシステム上にアプリやServiceとして動作する「手のひらに乗るBot」です。
- https://github.com/uPhyca/robota
- robotaのダウンロード https://play.google.com/store/apps/details?id=com.uphyca.robota
- robota engineの実装サンプルアプリ https://play.google.com/store/apps/details?id=com.uphyca.robota.engine.bundle
ちょっとわかりにくいと思うので図にしてみました。
echoしてみる
実際にチャットからみるとただのBotにしかみえません。Idobataからechoすると次の通り。
ちゃんと「私は羊だ」とechoが帰ってきてますね。いままではビルドサーバーなどでお守りをしていたBotがAndroidサイズに飛び出した、というわけです。
"robota"で何ができるの?
Android端末上でアプリケーションとして動作できるので、アプリで出来ることは何でも。今までのAndroidアプリの資産が沢山あるのでおおよそ思いつくことはすぐに実装できちゃいます。
- IR-Kitを使って。
- 私の発言:@Nexus5 もうすぐ家に着くよ、エアコンをつけておいてくれないか?
- Botの返信:わかりました。冷房を効かせておきます
監視系でもこれぐらいの用途はすぐに出てきます。自分の端末にBot住まわせておけばこんな使い方もできるでしょう。
- お使いに
- 友人の発言:@Nexus5 mhidakaにコーヒーを忘れないように買ってくきてほしい、と言づけてくれないか?
- Botの返信:わかりました。通知バーに「コーヒーを買う」と固定しておきました。あとは神に祈りましょう。グーメン。
これなら買い忘れてもBotのせいにできるかも…?
robotaを触ろう。
robotaは本体とルール生成エンジンに分かれており、実装は非常に簡単です。なぜならIdobataとの通信や待ち受けなどルール部分以外はrobotaのcore部分が受け持っているため、開発者はルールを作ることに集中できるようになっているからです。
端末にインストールされたrobotaはIdobataのメンションを受けてブロードキャストを行います。自分が作ったアプリケーションで処理し、応答をrobotaに返信すると、Idobataへの投稿含めてrobotaが残りの処理を実施します。
もともとAndroidに備わったブロードキャストレシーバーを使ったわかりやすい実装と言えるでしょう。次はrobotaをインストールしてサンプルコードを動かすところまでを解説します。
インストール編
robotaのインストールはとても簡単ですが、いくつかUI上の注意点があります。順番に説明していきます。
- robotaのダウンロード https://play.google.com/store/apps/details?id=com.uphyca.robota
- robotaのルール生成エンジンのダウンロード https://play.google.com/store/apps/details?id=com.uphyca.robota.engine.bundle
robotaをインストールすると、電源ボタンが表示されます。初期状態はOFFなので、真っ暗です。
ちなみにタップするとすぐにONにできますが、Idobataとの連携が済んでないので、まだ意味がありません。OFFにもどして順番に作業しましょう。
Settingsを開くと、BotのToken追加と、インストール済みのルール、Aboutの3つがあります。
Botをタップしてひらいた画面ではIdobataで取得できるトークンを記入しましょう。ここは手打ち上等なのですが、エンジニアらしくコピペなりadb inputなりして手間を省いてください。
Settingsの"Installed engines"では、ルールがちゃんとインストールできているか確認できます(ただし権限の確認までは行われないため、後述するAndroidManifest.xmlに注意)。
robota対応ルールの作り方[Hello! robota!]
ここからはrobotaに対応したアプリケーションの作り方を紹介します。メンションを受け取ったらどんなことにも"Hello!"と元気よく挨拶するルールを追加してみましょう。非常に簡単な構造ですので安心して読み進めてください。
Android Studioで依存関係を解消する
まずはrobotaを使うためのライブラリを選択します。Gradleで
- compile "com.uphyca.robota:robota-engine-core:${robotaVersion}"
と設定してください。
例えばv0.9.1を指定するのであれば次の通りです。
dependencies { compile 'com.android.support:appcompat-v7:+' compile fileTree(dir: 'libs', include: ['*.jar']) compile "com.uphyca.robota:robota-engine-core:0.9.1" }
HelloEngine.java
ルールを記述してみましょう。com.uphyca.robota.engine.EngineBaseクラスを継承してEngineを生成します。
このEngineBaseクラスはブロードキャストレシーバーが元になっており、Botとして利用可能な要素に加工した状態で引き渡してくれます。
public class HelloEngine extends EngineBase { @Override protected String onMessageReceived(Context context, Bot bot, TextMessage textMessage) { return "Hello!"; } }
botインスタンスにはBot情報が、textMassageインスタンスには発言者情報が格納されています。このHelloEngineでは、一切のメッセージを無視して"Hello!"と返信します。
シンプルですね。なお、発言者のメッセージを加工する方法はEngine-bundleのEchoEngineなどがわかりやすいです。
AndroidManifest.xml ブロードキャストレシーバーの登録
最後にブロードキャストレシーバーの登録です。このあたりは普通のAnroidアプリケーションと変わりません。インテントフィルター名が固有なので、ここだけ間違えないように注意してください。
<uses-permission android:name="com.uphyca.robota.permission.RECEIVE_MESSAGE_CREATED"/> <application> ...省略... <receiver android:name="org.techbooster.sample.robota.helloworld.HelloEngine" android:label="@string/label_hello" android:description="@string/description_hello"> <intent-filter> <action android:name="com.uphyca.robota.action.MESSAGE_CREATED"/> </intent-filter> </receiver> </application>
uses-permission要素を忘れるとブロードキャストレシーバーを受け取れません。
またlabelとdescriptionについてはCDATAセクションです。たとえば次のようにString.xmlに記述します。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Robota</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="label_hello"><![CDATA[${bot_name} hello ]]></string> <string name="description_hello"><![CDATA[Reply back with hello]]></string> </resources>
Botの将来
hubotをみていて思ったことはビルドやプロジェクト管理に便利なのはもちろん、hubotとの会話を楽しめる、ということです。まるでチームに友人が増えたかのような賑やかな雰囲気に変わる、しかもhubotがビルドエラーしちゃったら「まぁしょうがないよね」と人ではなく「何がビルドエラーの原因か」という問題と向き合えるようになります。
たとえばデスマをしていれば人間同士ではミスを許しあうことも難しいかもしれません。「〜さんのコミットでビルドが壊れた!」なんて脳裏を過ると、精神衛生上良くありません。
今回紹介したrobotaのようなプロダクトはAndroidなど手のひらの機械に一種の人格を与えることができる、面白い試みだと思います。SiriやGoogle Nowなどを見てもわかるように、コンピュータにもサジェスト機能がどんどんと盛り込まれています(古くはiコンシェルのようなものもあるので発想自体が新しいわけではないでしょうが)。
手のひら大のコンピュータを自分に合ったかたちにカスタマイズする、という試みはコンピュータとの付き合い方を面白く変えるキッカケになりそうですね。