読者です 読者をやめる 読者になる 読者になる

ひつじのにっき

mhidakaのにっきです。たまに長文、気が向いたとき更新。

手のひらサイズ、少し未来のAndroid Botの作り方

面白いOSSプロジェクトを見つけたので紹介します。コンセプトは手のひらに乗るBot。SiriやGoogle Nowのような対話型のインターフェイスを自分でも作れる面白さがあります。

Botとは

最近、hubotのようなBotが流行っていますが、Botはチャットを通じたメンションなどでコマンドを受け付け、コマンドの種類に応じた処理を実行して結果を返す単純な仕組みで動いています。

hubotに代表されるBotはプロダクトをビルドしたり、画像を探して来たりと簡単なお使いができるため、プロジェクトでもお馴染みの存在となりつつあります。

AndroidBotにする"robota"プロジェクト

今回みつけたrobotaはhubotとは少し毛色が異なり、Androidシステム上にアプリやServiceとして動作する「手のひらに乗るBot」です。

ちょっとわかりにくいと思うので図にしてみました。

チャットを経由してAndroidと対話できるシステム


簡単にいうとIdobataというチャットシステムを経由してBot(Androidアプリケーションとして動作している)と対話が可能です。

echoしてみる

実際にチャットからみるとただのBotにしかみえません。Idobataからechoすると次の通り。

ちゃんと「私は羊だ」とechoが帰ってきてますね。いままではビルドサーバーなどでお守りをしていたBotAndroidサイズに飛び出した、というわけです。

"robota"で何ができるの?

Android端末上でアプリケーションとして動作できるので、アプリで出来ることは何でも。今までのAndroidアプリの資産が沢山あるのでおおよそ思いつくことはすぐに実装できちゃいます。

  • 今の気温を確認する(端末のセンサを使ってもいいし、ADKでも)
    • 私の発言:@Nexus5 やぁ、ネクサス、今の気温は?
    • Botの返信:自宅の気温は 25度です。少々熱いですね
  • 部屋の写真を撮ってもらう(カメラを使って)
    • 私の発言:@Nexus5 ネクサス、飼っているインコの様子が知りたいな
    • Botの返信:少しお待ち下さい。良い表情が撮れるよう試してみますね
  • IR-Kitを使って。
    • 私の発言:@Nexus5 もうすぐ家に着くよ、エアコンをつけておいてくれないか?
    • Botの返信:わかりました。冷房を効かせておきます

監視系でもこれぐらいの用途はすぐに出てきます。自分の端末にBot住まわせておけばこんな使い方もできるでしょう。

  • お使いに
    • 友人の発言:@Nexus5 mhidakaにコーヒーを忘れないように買ってくきてほしい、と言づけてくれないか?
    • Botの返信:わかりました。通知バーに「コーヒーを買う」と固定しておきました。あとは神に祈りましょう。グーメン。

これなら買い忘れてもBotのせいにできるかも…?

robotaを触ろう。

robotaは本体とルール生成エンジンに分かれており、実装は非常に簡単です。なぜならIdobataとの通信や待ち受けなどルール部分以外はrobotaのcore部分が受け持っているため、開発者はルールを作ることに集中できるようになっているからです。

端末にインストールされたrobotaはIdobataのメンションを受けてブロードキャストを行います。自分が作ったアプリケーションで処理し、応答をrobotaに返信すると、Idobataへの投稿含めてrobotaが残りの処理を実施します。

もともとAndroidに備わったブロードキャストレシーバーを使ったわかりやすい実装と言えるでしょう。次はrobotaをインストールしてサンプルコードを動かすところまでを解説します。

インストール編

robotaのインストールはとても簡単ですが、いくつかUI上の注意点があります。順番に説明していきます。

robotaをインストールすると、電源ボタンが表示されます。初期状態はOFFなので、真っ暗です。

ちなみにタップするとすぐにONにできますが、Idobataとの連携が済んでないので、まだ意味がありません。OFFにもどして順番に作業しましょう。

Settingsを開くと、BotのToken追加と、インストール済みのルール、Aboutの3つがあります。

Botをタップしてひらいた画面ではIdobataで取得できるトークンを記入しましょう。ここは手打ち上等なのですが、エンジニアらしくコピペなりadb inputなりして手間を省いてください。

Settingsの"Installed engines"では、ルールがちゃんとインストールできているか確認できます(ただし権限の確認までは行われないため、後述するAndroidManifest.xmlに注意)。

IdobataでBotを追加する方法

Idobataでは部屋のROOM SETTINGSからBotを追加できます。設定画面内、Add Botを選択するとボットの作成画面に遷移します。

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>
動作確認


great good! :)

Botの将来

hubotをみていて思ったことはビルドやプロジェクト管理に便利なのはもちろん、hubotとの会話を楽しめる、ということです。まるでチームに友人が増えたかのような賑やかな雰囲気に変わる、しかもhubotがビルドエラーしちゃったら「まぁしょうがないよね」と人ではなく「何がビルドエラーの原因か」という問題と向き合えるようになります。
たとえばデスマをしていれば人間同士ではミスを許しあうことも難しいかもしれません。「〜さんのコミットでビルドが壊れた!」なんて脳裏を過ると、精神衛生上良くありません。

今回紹介したrobotaのようなプロダクトはAndroidなど手のひらの機械に一種の人格を与えることができる、面白い試みだと思います。SiriやGoogle Nowなどを見てもわかるように、コンピュータにもサジェスト機能がどんどんと盛り込まれています(古くはiコンシェルのようなものもあるので発想自体が新しいわけではないでしょうが)。

手のひら大のコンピュータを自分に合ったかたちにカスタマイズする、という試みはコンピュータとの付き合い方を面白く変えるキッカケになりそうですね。