2015/10/17

Hubot on Heroku

What’s Hubot

GitHub製のBOT. CofeeScriptで書かれており, Node.jsで動作する. MITライセンスなOSS.
独自のscriptを定義でき, adapterの機構で様々なチャットシステムにも対応できる. ChatOps.
HubBotを動作させるにはRedisが必要.

Install Hubot.

Hubotを始める方法はこちらに詳しく書かれている.
HubotはNode.jsで動作するためNode+npmの環境を用意しておく必要がある.

HubotはYeoman generatorからinstallする.

# アクセス権限が必要であればsudoで.
npm install -g yo generator-hubot

次に, Hubot用のディレクトリを作成して, そこで新しいHubotインスタンスを作成する.
いくつか質問されるので回答する.

# 今回はボットの名前をmarimoで作成
mkdir marimo
cd marimo
yo hubot

# Bot adapterはとりあえずcompfireで
? Owner: MatsumuraYuki <xxx@gmail.com>
? Bot name: marimo
? Description: A simple helpful robot for your Company
? Bot adapter: campfire

実行が成功するとHubotに必要なrediaも同時にインストールされている.
Botの雛形が出来上がったのでgit repositoryにcommitしておく.

git init
git add .
git commit -m "Initial commit. Hello marimo!"

ローカルでmarimoを動かしてみる.

# shell adapterを使ってHubotを起動
bin/hubot

errorメッセージが表示されてがskipする. プロンプトがmarimo>になれば対話ができる状態である.
とりあえずpingで生存確認.

marimo> @marimo ping
marimo> PONG

pongの返答があればok. 他にも使える対話コマンドが多くある.

marimo> marimo help

Deploy Hubot

marimoをHerokuにdeployする.

事前にHeroku Account, Heroku App, Heroku Toolbeltを用意しておく.

# heroku appを作成. アプリ名は適宜変更. 今回はmarimo-appで作成
heroku create <app name>

Hubotがデータを永続化(brain)するのに必要なredisをHeroku側に用意しておく.

# 無料planの30MBタイプを指定. addon追加にはHerokuにクレジットカード要登録
# https://elements.heroku.com/addons/rediscloud#pricing
heroku addons:create rediscloud:30

heroku createローカルGit repositoryのremoteにherokuが追加されるので, remoteへhubot scriptをpushする.

git push heroku master

rootにあるProcfileを見てみる.

web: bin/hubot -a compfire

-a引数により, hubotのadapterがcampfireになっている.
他のチャットサービスと連携させたい場合はadapterを追加してこれを編集する.

Hello Slack

HubotをSlackと連携させる. Slackと連携させるためのadapterはすでに用意されている.

slack adapterをインストールする.

npm install hubot-slack --save

# installできたか確認
npm list hubot-slack
marimo@0.0.0 /Users/yuki312/marimo
└── hubot-slack@3.4.0 

Heroku deploy時に使われるscriptも変更しておく.

vim Procfile

# 下記内容に変更
#   before: web: bin/hubot -a campfire
#   after : web: bin/hubot -a slack

slackのintegrationにHubotを追加するとHUBOT_SLACK_TOKENが得られるのでこれをHeroku環境変数に設定.

heroku config:add HEROKU_URL=https://<Heroku App URL>
heroku config:add HUBOT_SLACK_TOKEN=xoxb-...

git commitしたらHerokuへdeployして完了.

git add .
git commit -m "support slack"
git push heroku master

以上.

2015/10/11

Android: Local Firebase Server + Unit Test

Firebaseを無料Planで使うため, Unit Testで帯域を消費したくない.
Firebaseをローカルサーバで用意して, それと通信することでこれを回避する.

Robolectric(JVM)で試そうとしたが, サーバからonCompleteの応答が受け取れず, 現状Instrumentation Unit Testで試している.

Local Firebase Server

e2eのシナリオテスト用には十分なFirebase ServerがNode moduleとして提供されているのでそれを利用する.

npm install --save-dev firebase-server

firebase serverを起動するjsを用意する. ファイル名はlaunch_local_firebase.jsとでもしておく.

var FirebaseServer = require('firebase-server');
FirebaseServer.enableLogging(true);
new FirebaseServer(5000, 'test.firebase.localhost', {
  /* You can put your initial data model here, or just leave it empty */
});

Firebaseはホスト名にドットを2つ含んでいる必要があるためlocalhost:5000では接続できない.
Local Firebase serverはtest.firebase.localhostとして起動する.

Local Firebase Serverへの要求/応答をロギングするためにenableLogging(true)を指定しておくと便利.

ホストPCのhostファイルにtest.firebase.localhost127.0.0.1つまりlocalhostで接続できるように次の一行を追記する.
Macであれば/private/etc/hostsあたりにホストファイルがある.

127.0.0.1 test.firebase.localhost

あとは先ほど作成したlaunch_local_firebase.jsを起動する.

node launch_local_firebase.js 

これでLocal Firebase Serverの準備は完了.

Run AndroidTest

あとはAndroidからFirebaseへ接続するだけでよい. 接続先はローカルホストになるため,

new Firebase("ws://test.firebase.localhost:5000/");

としていする. ただしGenymotionはlocalhostに固有のIPが割り当てられているため下記とする必要がある点に注意.

new Firebase("ws://192.168.56.1:5000/");

RobolectricでFirebaseからのコールバックが発火しない問題があり渋々Instrumentation Testで実行しているが, 解決方法をご存知の方はご教授頂けると幸いです.

ちなみに, 簡易な確認でよければofflineモードでテストをパスする方法もあるが, 信用性の面で採用しなかった.

public static class DebugModule extends Module {

  public DebugModule(Context context) {
    super(context);
  }

  @Override Firebase provideFirebase() {
    Firebase.setAndroidContext(context);
    Firebase firebase = new Firebase(FirebaseConstant.DEBUG_URI);
    firebase.goOffline();
    return firebase;
    }
  }

以上.

2015/10/01

AndroidStudio1.4 - Vector drawable to PNG

API Lv.21でVector drawableがサポートされ, AndroidStudio1.4でSVGからVector drawableを生成するVector Assetsがサポートされた.

Android Developers Blog: Android Studio 1.4 - http://goo.gl/iveCRd

また, 2015/10/01現在android gradleのバージョンにcom.android.tools.build:gradle:1.4.0-beta3を指定することでAPI Lv.20以下向けの互換性機能を使用することができる.
これは, res/drawable配下にあるVector drawableから各種png形式のdrawableを生成するもので,
minSdkVersionが20以下, 他リソースから参照されているVector drawableを持つ, など互換性対応が必要と判断される場合に有効となる.

互換用drawableはビルド時に生成されるためsrc上に現れないがbuild/outputや生成されたapkを展開するとpngの出力を確認できる.

以上.