Ruboty って何？どうやって動かすの？ Hubot と何が違うの？どっちを使えばいいの？ #ruboty #chatops

# Ruboty って何？どうやって動かすの？ Hubot と何が違うの？どっちを使えばいいの？
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Ruboty って何？どうやって動かすの？ Hubot と何が違うの？ という方に向けた記事です

## <i class="fa fa-list-ol" style="font-size:1em;"></i> 目次

* <i class="fa fa-question-circle" style="font-size:1em;"></i> Ruboty って何？
* <i class="fa fa-file-text" style="font-size:1em;"></i> Ruboty の基本構成
* <i class="fa fa-history" style="font-size:1em;"></i> Ruboty 登場の経緯
* <i class="fa fa-exclamation-circle" style="font-size:1em;"></i> Ruboty の特徴
* <i class="fa fa-terminal" style="font-size:1em;"></i> コマンドライン環境の疎通確認手順
* <i class="fa fa-book" style="font-size:1em;"></i> ステップアップのための資料紹介

## <i class="fa fa-question-circle" style="font-size:1em;"></i> Ruboty って何？
Ruboty は Ruby 製のチャットボットフレームワークです。
要は <i class="fa fa-external-link-square" style="font-size:1em;"></i> [Hubot](https://hubot.github.com/) の Ruby 版。

Ruboty のソースコードは GitHub で確認可能です。
<i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty github](https://github.com/r7kamura/ruboty)

**Hubot** は Plugin を **CoffeeScript** で書く必要があります。
(最終的に JavaScript になれば良いので他の AltJS や生の JavaScript でも良い)
**Ruboty** は **Ruby** で Plugin を書く必要があります。
機能的な違いはほとんどありません。
（ 大きな差は Ruboty には HTTP 待ち受けがないことくらい？
Ruboty は OSS プロダクトなので 需要があれば誰か プルリクエスト を送るのでは。 ）

機能に大きな違いがないなら、 Ruboty は誰におすすめなのか？
**Hubot** は便利だけど **CoffeeScript** より **Ruby** で書きたい、という人に **Ruboty** をおすすめできます。

こういう話をすると 某 Hubot 職人 さんから
**「Rubyist は Ruboty か Lita あたりを使え。振り返るな」**
と背中を **強めに** 押してもらえます。どちらかというと **尻を蹴飛ばされているかもしれません** 。

何の話か気になる方は Twitter で、 **「 Hubot 便利だけど Ruby で書けたらなぁ・・・ 」** とつぶやいてみてください。
**何かが起こるはずです。**

## <i class="fa fa-history" style="font-size:1em;"></i> Ruboty 登場の経緯

Ruboty の作者は Qiita の @r7kamura さんです。

* Ruby を使って bot を使いたい人向けに
* Ruby の bot フレームワークには <i class="fa fa-external-link-square" style="font-size:1em;"></i> [Lita](https://www.lita.io/) があるがより自分好みの設計にしたい

などの理由によって、 Hubot の Ruby 実装代替ツールとして作成されました。
詳しくはご本人の口で **rebuild.fm** ( 宮川達彦さんの podcast 。チェックしていない方はこれを機にぜひ )で語っておられます。

<i class="fa fa-external-link-square" style="font-size:1em;"></i> [rebuild.fm | 66: It Is Always :sushi: (r7kamura)](http://rebuild.fm/66/)

また下記の Episode 10 にも出演しておられます。 Ruboty の作者さんの思考が気になる方はこちらも。

<i class="fa fa-external-link-square" style="font-size:1em;"></i> [rebuild.fm | 10: RailsConf, Ruby 2.0, Rails 4 (mrkn, r7kamura)](http://rebuild.fm/10/)

※ rebuild.rm については、こちらの記事（ <i class="fa fa-external-link" style="font-size:1em;"></i> [Rebuild.fm のススメ](http://qiita.com/tbpgr/items/76f959ee1e7d01de0ef4) ）もまとめてあります。

## <i class="fa fa-file-text" style="font-size:1em;"></i> Ruboty の基本構成
私が以前まとめた記事をご確認ください。

<i class="fa fa-external-link" style="font-size:1em;"></i> [Ruboty の基本構成](http://qiita.com/tbpgr/items/7f08569dd8828bae6527)

## <i class="fa fa-exclamation-circle" style="font-size:1em;"></i> Ruboty の特徴
* Ruby 製。 Ruby で Plugin を書ける
* Ruby の gem で Plugin を管理可能。 Ruby 使いが慣れ親しんだ方法で管理できる。
* Ruboty 本体のコードが非常に綺麗。本体を読む際の敷居が低い。
    * 詳しくはこちら => <i class="fa fa-external-link" style="font-size:1em;"></i> [Ruboty のコードリーディングで Ruboty の仕組みを理解すると共に Ruby の設計・実装の定石を学ぶ](http://qiita.com/tbpgr/items/5887003cd2e69e9d8867)
* 日本人が作者
    * 一次情報を日本語で得ることができる
* Lita があることを知った上で、Ruboty を開発した => Lita のプロダクトをより改良した内容になっているのでは？
    * ※この部分は、 rebuild.rm をきいた上での私の想像なのででたらめかもしれません
* 作者の @r7kamura さんが自動化厨（褒め言葉）っぽい
    * ラリーウォールの三大美徳 (:angry::weary::triumph:) 的なものを持ち合わせていそうな感じ
    * Plugin の提供 , Heroku への簡易デプロイなど便利な仕組みが提供される
* Qiita の中の人が作者なので Qiita で情報を公開してもらえる

## <i class="fa fa-terminal" style="font-size:1em;"></i> コマンドライン環境の疎通確認手順
### 前提
Ruby, Bundler をインストール済み

### ruboty をインストール

~~~bash
$ gem install ruboty
~~~

### ruboty 用のディレクトリテンプレートを生成します

~~~bash
$ ruboty --generate
$ tree
.
┗ ruboty
    ┗ Gemfile
$ cd ruboty
~~~

### Gemfile を編集して plugin を追加します
* 私が作成した <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-qiita_scouter](https://github.com/tbpgr/ruboty-qiita_scouter) を追加してみます

~~~ruby
source "https://rubygems.org"

gem "ruboty"
gem "ruboty-qiita_scouter"
~~~

※ Windows 環境の方は rb-readline gem も追加

### bundle で plugin をインストールします

~~~bash
$ bundle install
~~~

### ruboty を実行します
※ ruboty-qiita_scouter の実行は少々時間がかかります

~~~bash
$ bundle exec ruboty
> ruboty ping
pong
> ruboty help
ruboty /qiita scouter (?<id>.+?)\z/ - analyze qiita power
ruboty /help( me)?\z/i              - Show this help message
ruboty /ping\z/i                    - Return PONG to PING
ruboty /who am i\?/i                - Answer who you are
> ruboty qiita scouter tbpgr
ユーザー名: tbpgr 戦闘力: 450120 攻撃力: 74250 知力: 360525 すばやさ: 15345
~~~

## <i class="fa fa-book" style="font-size:1em;"></i> ステップアップのための資料紹介
###  Slack + Heroku Deployment
@r7kamura さんの下記記事の手順で, Ruboty を Heroku にデプロイし、 Slack と連携するまでの環境を簡単に構築できます。

* <i class="fa fa-external-link" style="font-size:1em;"></i> [Ruby製HubotクローンのRubotyをSlackで動かす](http://qiita.com/r7kamura/items/8d1b98e28154de6030b9)

### <i class="fa fa-gavel" style="font-size:1em;"></i> 開発支援ツール
開発支援ツール に関する情報は以下のエントリにあります

#### プロジェクトテンプレート、コード生成
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Ruboty 【怠惰は正義】ruboty-gen で Handlers と Actions のひな形を作成](http://qiita.com/tbpgr/items/39c754bb17193c9b27e9)

#### README の生成
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen を作成した](http://qiita.com/tbpgr/items/33ccf5709cb553b2095f)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen の REAMDE 内の Commands から Usage へのページ内リンクを追加 #ruboty](http://qiita.com/tbpgr/items/ef4aeddc176c77ac6479)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Ruboty ruboty-megen の command ブロックに example を追加](http://qiita.com/tbpgr/items/b3e7c401ea2a360a255f)

#### Qiita の記事の生成
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Ruboty Ruboty Handler Plugin 作成時に公開するための Markdown 形式の技術エントリ テンプレートジェネレータ ruboty-articlegen]()

#### 上記の全ツールをまとめて紹介
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Ruboty | 各種 Generator を利用して Ruboty のプロダクトコード・README・Qiita記事の作成コストを下げる](http://qiita.com/tbpgr/items/1987fef9bb228b07e5eb)