slack bot(hubot)をBluemixで動かす

#前置き
他の多くのエンジニア組織がそうしているように、私の部署でもslackが導入されています。
slackには様々なbotがいたりしますが、中でも私のところではfulls2ちゃんというbotが
仕事の合間の雑談促進や気分転換に大きく貢献してくれています。

![0a2ac091-f32b-1535-b026-9b620100e9d5 2.png](https://qiita-image-store.s3.amazonaws.com/0/93202/3b85a8a6-dfee-1383-17e4-f45ecc265e32.png)


そんなみんなの癒しfulls2ちゃんですが、よくしにます。

![スクリーンショット 2017-01-07 12.51.48.png](https://qiita-image-store.s3.amazonaws.com/0/93202/ac30589e-53c3-d0a6-3fa8-8d758ac38013.png)



おそらくherokuで動いているのか、ちょくちょくスリープしてしまうみたいで。

[Herokuでbotを運用する時代は終わった。これからはIBM Bluemixを使って無料で運用する](http://qiita.com/akameco/items/39a55635ceb0ba185b7f)
> - 30分アクセスしなければスリープ
> - 24時間連続で動かすことができない(6時間のスリープ)

bot作成者の先輩も忙しいですし、「止まったから動かしてくださ〜い」なんて頼みに行くのも恥ずかしいですし、そもそも常に動いていてほしいじゃないですか。

そういうわけで、放置していても24時間フル稼働してくれるbotを設定することにしました。

#Bluemixについて

###Bluemixとは
IBMが提供するクラウド環境PaaSです。
hubotにはherokuで動かすような設定がデフォルトで備わっているのもあってか、botの運用はとりあえずherokuみたいな風潮があったようですが、[herokuの新料金体制](http://blog.flect.co.jp/labo/2015/05/free-dyno-fae3.html)によって無料で24時間動かせなくなりました。
Bluemix以外にも、Google App Engineでも24時間無料で運用することはできるみたいですが、これやる限りではBluemixの方が設定も要らず簡単そうでした。

###Bluemixのインスタンス無料枠
一ヶ月あたり375GBのインスタンスを無料で使えます(2017年1月現在)。
なので例えば一つのインスタンスに512MBを割り当てれば、24時間×31日無料で動かすことができるわけです。

ただ中には無料枠を超えるととんでもない額のサービスもあるので、他のサービスを使う場合は要確認です。Insights for TwitterとかWatson Natural Language Classifierとか。

#作り方
やることさえ分かれば、あとは簡単でした。
ちなみにbotの中身はgithub社が作ったhubotというものです。
あと環境はmacです。

### 1. slackサイドでbotの箱を作る
- [slackのapp directory](https://slack.com/apps)にアクセス
- categoriesのbots > hubot > configuration をクリック
- usernameを聞かれるので、作成するhubotの名前を入れる　　※あとで変更可
- setup integrationの画面が開く
ここでbotのアイコン画像などが設定できる。必要に応じて記入して Save Integrationをクリック

と、文字だけで書いても分かりにくいと思うので、キャプチャ付きのこちらを参考に...
[SlackのBot(hubot)を作ってみる](http://qiita.com/mochidamochiko/items/29c2d77715d8a1ff062a)

尚、setup integrationの画面に表示されている`HUBOT_SLACK_TOKEN=xxxXXXXXxxxXXXXX`のところは後ほど使います。

ひとまず箱完成。

### 2. ローカルでbotの中身を作る
- node.jsとredisが無ければインストール

```
$ brew install node redis
```

- hubotをインストール

```
$ npm install -g yo generator-hubot
```
globalオプションをつけてyoとgenerator-hubotをインストールします。
yoとは、Yeomanと呼ばれるnode.js製のプロジェクトのテンプレートを対話式で生成できるツールです。

- プロジェクトを作成

```
$ mkdir yourHubotName
$ cd yourHubotName
$ yo hubot 
```

yoを実行するとAAがでてきて以下の設定を変えることができます。
- 作成者
- botの名前
- 説明
- Bot adapter
上三つは空でも大丈夫ですが、bot adapterは、今回はslackで動かすのでslackと設定してあげます。


- ローカルで動作確認してみる

```
$ bin/hubot

yourHubotName> yourHubotName ping
```
返事が来たらおっけい。

参照
[OSXで、Hubotをインストールするまでやってみる](http://qiita.com/kashiwaguma-hiro/items/54ada93ec380d71ef798)

### ３.slack上でbotを動かす

- 作ったhubotの環境変数に、1で出てきた`HUBOT_SLACK_TOKEN=xxxXXXXXxxxXXXXX`を設定してあげる

```
$ export HUBOT_SLACK_TOKEN=xxxXXXXXxxxXXXXX
```

- 以下のコマンドで実行

```
$ bin/hubot --adapter slack

```

slackを確認しにいきましょう。
botがaliveになっていて、DM状態でpingコマンドを投げると先ほどと同じように返してくれるかと思います。

それでは更に`img　hogehoge`コマンドで画像検索を試してみましょう。
※image meをimgだけでも実行できます。

![237d3636-a948-1b86-1b2c-306534608ab.png](https://qiita-image-store.s3.amazonaws.com/0/93202/4a9eb7f5-4561-112d-23c1-d8b4f072c0c3.png)


このようなエラーが出た人は下の[番外編]を参照してください。

### 4. Bluemixにデプロイ 

botができたので、いよいよPaaS環境にデプロイして、24時間フル稼働を試みます。

- Bluemixのアカウント、組織、スペースを作成

参照
[IBM Bluemixフリートライアルアカウント作成手順]
(http://qiita.com/KenichiSekine/items/6ad49b25167b3f4cdb63)

ちなみに組織を作るときに地域を選択するところがあるのですが、選んだ地域によってBluemixへアクセスするときのurlが変わるので要注意です。

- cfコマンドをインストール

cfとは、Cloud Foundryを利用するためのコマンドで、これはVMware社提供する業界初のオープンソースのPaas環境です。
BluemixはCloud Foundryをベースにしているそうで。

Bluemixへの操作はcfコマンドを使って行います。
macはhomebrewで2秒で入ります。

```
$ brew tap cloudfoundry/tap
$ brew install cf-cli
```

- manifest.ymlを作成する

```yaml
applications:
- buildpack: https://github.com/jthomas/nodejs-v4-buildpack.git
  command: ./bin/hubot --adapter slack
  path: .
  instance: 1
  memory: 256M
  env:
      HUBOT_SLACK_TOKEN: xxxXXXXXxxxXXXXX
```

buildpack: 
node.jsを使うように設定。Bluemixがデフォルトでサポートしていない環境は、ここに書いて使えるようにしてあげます。
instance, memory: 
上の「Bluemixのインスタンス無料枠」で書いた通りです。この範囲なら無料でbotを稼働させ続けられます。
env: 
botを作る時に`export`で指定した環境変数を書いてあげます。
ymlなので「=」ではなく「:」で。←そのままコピペして何度か書き直し忘れた人

- デプロイコマンドを実行

```
$ cd yourHubotName

$ cf api https://api.ng.bluemix.net
$ cf login
$ cf push yourHubotName
```

apiに指定しているurlは、組織を作成する時に選択したurlのものになります。
私は英国を選択したのでngです。
ちゃんと実行できれば動きます。

![630d187b-df77-069b-a9f0-12fad77da84.png](https://qiita-image-store.s3.amazonaws.com/0/93202/de332fc2-7e86-f0a3-c063-cae1c78ce53e.png)

pushすればbluemixのGUIの方からも起動や停止が確認・操作できます。

#[番外編] 画像検索の設定
`img`(`image me`)コマンドでこんなエラーが出た時の対処法。

![237d3636-a948-1b86-1b2c-306534608ab.png](https://qiita-image-store.s3.amazonaws.com/0/93202/7787fdc8-399b-8558-fd69-826901748d19.png)

結論から言うと
`Googleカスタム検索エンジンのID`と`Google Custom Search APIのキー`を作成・設定してあげればいいだけでした。

### 取得の仕方について
Googleカスタム検索エンジンのidの作成

- Googleカスタム検索エンジンにアクセスして、新しいカスタム検索エンジンを作成する
- 作成したら、コントロールパネルを開く

画像検索の設定をONにし、他都合の悪い設定を変更する
詳細の検索エンジンIDをクリックすると、idが取得できる

Google Custom Search APIキーの作成

- [Google Developers Console](https://console.developers.google.com/)で新しいプロジェクトを作成。
※既存のプロジェクトでも構わない
- Custom Search APIを有効にする
- 認証情報>認証情報を追加でAPIキーを作成できる

詳しい手順については、こちらの記事が超分かり易かったです。
[hubot-google-image で Google Custom Search API を利用する設定](http://qiita.com/hoto17296/items/f27ebf62c6015befdaa8)

取得したら、slackのトークンの時と同じように設定してあげます。

```
$ export HUBOT_GOOGLE_CSE_ID=yyyyYYYYYYYyyyyYY
$ export HUBOT_GOOGLE_CSE_KEY=zzzzzZZZZZZzzzzz
```

これでbotを再起動させれば、imgコマンドで画像が出るようになります。

デプロイする時にはmanifest.ymlのenvに設定を追記し忘れないようにしましょう。

#補足
- push時にリポジトリを指定すれば、gitで管理させたhubotをデプロイすることもできます。

```
$ cf push yourHubotName git@github.com:userid/yourHubotName.git
```
そうするのであれば、manifest.ymlに環境変数は書かないように...!(当たり前だけど)
pushした後に以下のコマンドを実行すれば設定できるそうです。
```
$ cf set-env yourHubotName HUBOT_SLACK_TOKEN xxxXXXXXxxxXXXXX
```

- bluemixのlogの見方

```
$ cf logs yourHubotName --recent
```

デプロイ時に詰まったらこれ。


#参照
おかげで仕事中の癒しを取り戻せました。ありがとうございます...:pray:

手順において参考にさせてもらったもの
- [Herokuでbotを運用する時代は終わった。これからはIBM Bluemixを使って無料で運用する](http://qiita.com/akameco/items/39a55635ceb0ba185b7f)
- [SlackのBot(hubot)を作ってみる](http://qiita.com/mochidamochiko/items/29c2d77715d8a1ff062a)
- [OSXで、Hubotをインストールするまでやってみる](http://qiita.com/kashiwaguma-hiro/items/54ada93ec380d71ef798)
- [hubot-google-image で Google Custom Search API を利用する設定](http://qiita.com/hoto17296/items/f27ebf62c6015befdaa8)
- [IBM Bluemixフリートライアルアカウント作成手順]
(http://qiita.com/KenichiSekine/items/6ad49b25167b3f4cdb63)

エラーで詰まった時にとても参考にさせてもらったもの
- [BLUEMIXで始める無料BOT運用 - HUBOT編 -](https://kyaukyuai.github.io/post/bluemix_bot/)
- [IBM BluemixのRedisをつかってみる](https://blog.knjcode.com/redis-on-bluemix/)