@bouzuya の Hubot 連載をふりかえってみた

これは [Hubot Advent Calendar 2014][hubot-adventar-2014] の 25 日目の記事です。

また、今回は @bouzuya の Hubot 連載の第 17 回 (最終回) です。目次は、[第 1 回][hubot-adventar-2014-bouzuya-index]にあるので、そちらをどうぞ。

# 前回、そして今回は

前回は [使えない Hubot アダプターをつくろう][hubot-adventar-2014-24] ということで、Hubot アダプターを実際につくってみました。

今回は、最終回なので、ここまでのまとめと紹介できなかった細々としたなどに触れて、おしまいにします。

# ふりかえり

過去の 16 回をふりかえってみます。

- [第 1 回 『Hubot / ChatOps とは』][hubot-adventar-2014-01]
- [第 2 回 『Hubot のインストール』][hubot-adventar-2014-02]
- [第 3 回 『Hubot を Heroku で動かして Slack から話す』][hubot-adventar-2014-03]
- [第 4 回 『Hubot スクリプトを追加インストールしよう & 自分だけの Hubot スクリプトをつくろう』][hubot-adventar-2014-04]
- [第 5 回 『簡単な Hubot スクリプトをゼロからつくろう』][hubot-adventar-2014-06]
- [第 6 回 『簡単な Hubot スクリプトをもっとつくろう (おみくじ系)』][hubot-adventar-2014-07]
- [第 7 回 『スクレイピングする Hubot スクリプトをつくろう』][hubot-adventar-2014-09]
- [第 8 回 『Hubot でホームページをつくろう』][hubot-adventar-2014-10]
- [第 9 回 『Hubot スクリプトの読み込み処理を読んでみよう』][hubot-adventar-2014-11]
- [第 10 回 『設定を読み込む Hubot スクリプトをつくろう』][hubot-adventar-2014-16]
- [第 11 回 『robot.brain を使った Hubot スクリプトをつくろう][hubot-adventar-2014-18]
- [第 12 回 『robot.brain を永続化する Hubot スクリプトをつくろう』][hubot-adventar-2014-19]
- [第 13 回 『いまさらだけど Hubot のドキュメントを読んでみよう』][hubot-adventar-2014-21]
- [第 14 回 『Hubot スクリプトのテストやその環境を知ろう』][hubot-adventar-2014-22]
- [第 15 回 『Hubot 標準同梱の Shell アダプターを読んでみよう』][hubot-adventar-2014-23]
- [第 16 回 『使えない Hubot アダプターをつくろう』][hubot-adventar-2014-24]

いま思うと冗長なところや、不十分なところがたくさんありますね。

## [第 1 回 『Hubot / ChatOps とは』][hubot-adventar-2014-01]

Hubot / ChatOps の概要を紹介しました。

この 2014/12/01 タイミングでの Hubot の最新バージョンは 2.9.3 で、この記事を書いている 2014/12/25 時点で 2.11.0 です。2.10.0, 2.11.0 と二度もバージョンアップされてしまいました。普段あんまり早く上がらないのですが、意外と上がるものですね。

Hubot は GitHub のつくった BOT 。ChatOps のメリットは「共有」にあり。最後に弊社の [:sushi:][faithcreates/sushi] の紹介をしました。

## [第 2 回 『Hubot のインストール』][hubot-adventar-2014-02]

Hubot をローカルにインストールして動かす手順を紹介しました。

`yo` + `generator-hubot` で Hubot を生成する手順というのはまだまだ少ない感じがします。簡単だからかもしれませんが。

反省として、標準スクリプトの紹介が控えめだったなあと。標準スクリプト紹介で丸1回とっても良かったと思います。

## [第 3 回 『Hubot を Heroku で動かして Slack から話す』][hubot-adventar-2014-03]

Hubot を Heroku にデプロイする ( Slack アダプターを使用) 手順を紹介しました。

この手順のあとに [slackhq/hubot-slack][] がバージョンアップされて大幅に手順が変わっているので、イマイチな記事です。

さらに言うと、世間的に Hubot + Heroku + Slack という構成があたかも当然のように広がっているので、ありふれたつまらない記事でした。もっとマニアックなアダプターのほうが良かったのかもしれません。

[slackhq/hubot-slack]: https://github.com/slackhq/hubot-slack

## [第 4 回 『Hubot スクリプトを追加インストールしよう & 自分だけの Hubot スクリプトをつくろう』][hubot-adventar-2014-04]

Hubot スクリプトを追加する手順と、Hubot スクリプトを改造する手順を紹介しました。

詰め込みすぎたと反省しています。Hubot スクリプトを追加する手順で 1 回、Hubot スクリプトを作成する手順で 1 回にしておけば良かったですね。

## [第 5 回 『簡単な Hubot スクリプトをゼロからつくろう』][hubot-adventar-2014-06]

Hubot スクリプトを作成する手順を紹介しました。

`yo` + `generator-hubot` で Hubot スクリプトを生成する手順は、ブログなどでは見たことがないので、まま価値があると思います。

`robot.respond` / `msg.send` を紹介しています。

`hubot` コマンドのオプションにも触れています。

## [第 6 回 『簡単な Hubot スクリプトをもっとつくろう (おみくじ系)』][hubot-adventar-2014-07]

`msg.random` を使った Hubot スクリプトを作成する手順を紹介しました。

`robot.hear` / `msg.match` / `msg.random` / `msg.reply` に触れています。

おみくじは定番で、他にもレビュアーを決めたり、昼ごはんを決めたり、`msg.random` が使われているスクリプトはよく見ます。

## [第 7 回 『スクレイピングする Hubot スクリプトをつくろう』][hubot-adventar-2014-09]

スクレイピングをする Hubot スクリプトを作成する手順を紹介しました。

`request` / `cheerio` のこれまた定番の組み合わせで Adventar をスクレイピングしてみました。

外部 npm パッケージの追加はここで紹介しました。

## [第 8 回 『Hubot でホームページをつくろう』][hubot-adventar-2014-10]

HTTP で待ち受ける Hubot スクリプトを作成する手順を紹介しました。

`robot.router` は `express` のインスタンスなので Web アプリケーションを Hubot に組み込めます。 Web Hook などへの対応もこれを使います。

## [第 9 回 『Hubot スクリプトの読み込み処理を読んでみよう』][hubot-adventar-2014-11]

`hubot` コマンドから順に Hubot の起動処理を追いかけました。

`robot.load` / `robot.loadHubotScripts` / `robot.loadExternalScripts` / `robot.loadFile` に触れています。

## [第 10 回 『設定を読み込む Hubot スクリプトをつくろう』][hubot-adventar-2014-16]

`process.env.*` から Hubot の設定の読み込む方法を紹介しました。

## [第 11 回 『robot.brain を使った Hubot スクリプトをつくろう][hubot-adventar-2014-18]

`robot.brain` で永続化する Hubot スクリプトを紹介しました。

`robot.brain.get` / `robot.brain.set` に触れています。

## [第 12 回 『robot.brain を永続化する Hubot スクリプトをつくろう』][hubot-adventar-2014-19]

`robot.brain` を永続化する Hubot スクリプトを紹介しました。

`robot.brain.setAutoSave` / `robot.brain.mergeData` に触れています。

## [第 13 回 『いまさらだけど Hubot のドキュメントを読んでみよう』][hubot-adventar-2014-21]

ドキュメントの一覧とその概要を紹介しています。

## [第 14 回 『Hubot スクリプトのテストやその環境を知ろう』][hubot-adventar-2014-22]

Hubot スクリプトのテストについて紹介しました。

`generator-hubot` で生成される `grunt` & `mocha` & `chai` & `sinon` な構成でのテストに触れました。また個人的に使っている `gulp` & `mocha` & `power-assert` & `sinon` な構成にも触れました。

## [第 15 回 『Hubot 標準同梱の Shell アダプターを読んでみよう』][hubot-adventar-2014-23]

Hubot のアダプターの処理を追いかけました。

`robot.loadAdapter` / `use` / `adapter.run` / `adapter.send` などに触れました。

## [第 16 回 『使えない Hubot アダプターをつくろう』][hubot-adventar-2014-24]

Hubot のアダプターを作成する手順を紹介しました。

Chadventar という仮想チャットと連携する Hubot アダプターをつくりました。最小構成のアダプターです。

記事のふりかえりが意外と長くなりました。

# 紹介し忘れたもの

ドキュメントに記載されているものを基準に紹介し忘れているものを紹介します。

## `robot.logger`

ログ出力をします。npm パッケージ log のインスタンスです。この log はもうリポジトリも公開されていないのかな。

https://www.npmjs.com/package/log

```coffeescript
robot.logger.debug('debug message')
robot.logger.info('info message')
robot.logger.error('error message')
```

→ 「 [Hubot のログ情報 (`Robot#logger`) まとめ - Qiita](http://qiita.com/bouzuya/items/40b54e511d57954c9338) 」にまとめました。

## `robot.topic`

トピック変更時のリスナーを設定します。

```coffeescript
robot.topic (msg) ->
  msg.send 'トピックが変更されました'
```

前回のアダプター作成時も紹介した気はしますが、 TopicMessage に反応するものです。

## `robot.enter` / `robot.leave`

入退室時のリスナーを設定します。

```coffeescript
robot.enter (msg) ->
  msg.send '入室しました'

robot.leave (msg) ->
  msg.send '退室しました'
```

これまた前回のアダプター作成時も紹介した気はしますが、 EnterMessage / LeaveMessage に反応するものです。

## `robot.on` / `robot.emit`

ほとんど使わない気はしますが `Robot` は `EventEmitter` なので `on` / `emit` できます。

## JavaScript で Hubot スクリプト

最初に Hubot スクリプトを書いた回で併記した気もするのですが、JavaScript でも Hubot スクリプトは書けますので、好きな AltJS で書いて JavaScript にすれば自由に言語を選べます。

# 最後に

Hubot Advent Calendar 2014 もようやく終わりですね。お疲れ様でした。

入門記事なのか、何なのか分からなかったけど、@bouzuya の Hubot 連載もこれで終わりです。来年はたぶんやりません。

Hubot 連載読んで Hubot スクリプトを書く人が増えたり、そのスクリプトですこしでも楽しんでいただければ幸いです。

では。

[getting-started-with-hubot]: https://github.com/github/hubot/tree/v2.9.3/docs#getting-started-with-hubot
[bouzuya/hubot-hello-world]: https://github.com/bouzuya/hubot-hello-world/
[bouzuya/hubot-choice]: https://github.com/bouzuya/hubot-choice/
[bouzuya/hubot-adventar]: https://github.com/bouzuya/hubot-adventar/
[bouzuya/hubot-homepage]: https://github.com/bouzuya/hubot-homepage/
[bouzuya/hubot-script-gist]: https://github.com/bouzuya/hubot-script-gist/
[bouzuya/hubot-brainfxxk]: https://github.com/bouzuya/hubot-brainfxxk/
[bouzuya/hubot-7days-later]: https://github.com/bouzuya/hubot-7days-later/
[bouzuya/hubot-file-brain]: https://github.com/bouzuya/hubot-file-brain/
[faithcreates/sushi]: https://github.com/faithcreates/sushi
[hubot-scripts/hubot-redis-brain]: https://github.com/hubot-scripts/hubot-redis-brain
[hubot-script-per-day-61]: http://bouzuya.hatenablog.com/entry/2014/09/12/224215
[github/hubot]: https://github.com/github/hubot/
[github/generator-hubot]: https://github.com/github/generator-hubot/
[ops-for-everyone]: https://speakerdeck.com/johndbritton/ops-for-everyone
[adventar]: http://www.adventar.org/
[express-reference]: http://expressjs.com/3x/api.html
[hubot.github.com]: https://hubot.github.com/

[hubot-adventar-2014]: http://www.adventar.org/calendars/384
[hubot-adventar-2014-bouzuya-index]: http://qiita.com/bouzuya/items/c7d0ad80c357aab6b696
[hubot-adventar-2014-01]: http://qiita.com/bouzuya/items/c7d0ad80c357aab6b696
[hubot-adventar-2014-02]: http://qiita.com/bouzuya/items/11c0c6da2b3ad54b827f
[hubot-adventar-2014-03]: http://qiita.com/bouzuya/items/2a200c9e8a45e2478bc2
[hubot-adventar-2014-04]: http://qiita.com/bouzuya/items/4c0206d72ff22ade9339
[hubot-adventar-2014-05]: http://pasero.net/~mako/blog/s/685
[hubot-adventar-2014-06]: http://qiita.com/bouzuya/items/4e051f68f8d68a2944b0
[hubot-adventar-2014-07]: http://qiita.com/bouzuya/items/2e935c99647b93d8ee1d
[hubot-adventar-2014-08]: http://udzura.hatenablog.jp/entry/2014/12/08/182744
[hubot-adventar-2014-09]: http://qiita.com/bouzuya/items/587c4e920151342e6f1d
[hubot-adventar-2014-10]: http://qiita.com/bouzuya/items/8e8ee8e2e8f83513ad35
[hubot-adventar-2014-11]: http://qiita.com/bouzuya/items/3e239bc530e7c2c3a26c
[hubot-adventar-2014-12]: http://qiita.com/hiconyan/items/3e5481a61657890624dc
[hubot-adventar-2014-13]: http://pasero.net/~mako/blog/s/689
[hubot-adventar-2014-14]: http://ja.ngs.io/2014/12/14/hubot-qiita/
[hubot-adventar-2014-15]: http://youngforever.hatenablog.com/entry/2014/12/15/113236
[hubot-adventar-2014-16]: http://qiita.com/bouzuya/items/d65a394cac9e76b56d3d
[hubot-adventar-2014-17]: http://qiita.com/hiconyan/items/baf6ac56129a26d8ac0c
[hubot-adventar-2014-18]: http://qiita.com/bouzuya/items/d5fd0ef9a8cb100933f4
[hubot-adventar-2014-19]: http://qiita.com/bouzuya/items/ae1cb5610a64794bc522
[hubot-adventar-2014-20]: http://bochibochibocchi0095.hatenablog.com/entry/2014/12/21/000710
[hubot-adventar-2014-21]: http://qiita.com/bouzuya/items/ca69548c813e87c2845a
[hubot-adventar-2014-22]: http://qiita.com/bouzuya/items/e23426ecf039154bed7b
[hubot-adventar-2014-23]: http://qiita.com/bouzuya/items/4a6bad68b4b02c17079e
[hubot-adventar-2014-24]: http://qiita.com/bouzuya/items/3664e82984117ceb7ff9