block_given?

ジャングル ブロック ナイ アルノハ jump ダケ。CC-BY-SA 3.0

Rubotyが代わりに「ちょっとHerokuの様子みてくる」ruboty-heroku_statusを公開した

Rubotyが代わりにちょっとHerokuの様子みてきてくれる。

くふうしたところ

気持ちのぶん人間らしい受け答えをさせるようにした。

f:id:block_given:20141015195844p:plain

さくっと作れて実用度が高くなるようにした。

Heroku Statusは簡単なjsonapiなのでRuby標準ライブラリだけで扱える。

ChatOpsを意識

改めてRubotyの記事を読むと次のようなことが書いてあった。 実用度低いもの作っても使わなくてもったいないのでChatOpsに使えそうなものを作った。 作者の意思を尊重。

元々DevOpsのOpsの部分を任せる用途(=ChatOps)で開発をはじめたので、 その辺を便利にするプラグインをつくってBotと仲良くやっていきたいという気持ち。

まとめ

私のRubotyはHerokuで動いてる。 なので「ちょっとHerokuの様子見てくる」までもなくHerokuに何かあるといち早く姿を消す。 予想外に実用度が低いプラグインになったぞ、、、

rubotyにウェブサイトのスクショを撮らせるプラグインruboty-ssを公開した。

デフォルトだと画像はGyazoに保存される。Dropboxに保存することも出来る。

f:id:block_given:20141013193111p:plain

試したもの

json-collectionとjsonism

GistのAPIを叩くために使った。 画像の添付などmultipartでpostしようとして少し時間がかかった。 ほんとはもっと楽な方法あるのかもしれないけどやり方がわからなかったので内部のfaradayのconnection差し替えたりしてそこが面倒だった。

phantomjs-gem

今まではHerokuでPhantomJSを動かしたい場合、phantomjsのビルドパックを使っていた。 今回はphantomjs-gemを使うことにした。あまり何も考えていなくてもHerokuでphantomjsが動かせて便利。 こういうバイナリダウンロード系のgem、Herokuで雑に動かしたいときにすごく役に立つ。

dropbox api

公式のクライアントを使った。 access tokenさえ取れれば比較的なんでも出来る。

gyazo api

どうでもいい画像はるときに便利。消せないのが残念だけど画像を貼るだけに特化しているのですごく扱いやすい。

ハマったところ

Gistに画像が貼れない

画像の保存先としてGistを使おうとしたがGistはAPIから画像を保存することはできない。 もしも保存したいのならば

  1. APIを使いGistを作る
  2. GistをcloneしてきてGitでimageを追加したコミットをpushする

の2ステップが必要なのであきらめた

反省

結局画像の保存先選びが一番苦労した。 Gist/Dropbox/Gyazoの順で試していったが最初からGyazoればよかった。

スクリーンショットを撮るサービスは探せばありそうだ。

  • PhantomJS使ってウェブサイトをキャプチャする処理
  • 画像を保存する処理

どちらもやってくれるサービスを探せばよかった。

次に向けて

RubyのライブラリがないAPIを叩くとRubotyのプラグインをつくるついでにライブラリのgemが1個できるのでよさそう。 既存のgemを使うだけだと書いててお得感が無い。

rubotyが電話をかけて返事を聞いてくれるruboty-callを公開した。

Twilioを使ってrubotyが電話をかけてくれるプラグインを公開した。

使い方

f:id:block_given:20141012233139p:plain

くふうしたところ

rubotyがやってくれるとうれしいことを考える

私は電話がにがてなのでrubotyに代わりにしゃべってもらうことにした。 rubotyに何かたのんだ結果がなるべく現実世界に反映されるようなものをつくっていきたい。

誰かがやってくれてることは自分でやらない

Twilioでは通話の際の指示をTwiMLの形式で書く。 通話 を発信するAPIではTwiMLのURLをパラメータとして渡す。

動的にTwiMLを組み立てたい場合、自分でTwiMLを返すサーバーを書くのもめんどくさいときはhttp://twimlets.com/echoを使うと、パラメータで渡したTwiMLをそのまま返してくれる。使い方はドキュメントに書いてある

これからやりたいこと

会話のstatsを@ruboty twilio statsのような感じで取れるようにしたい。 本格的に運用する際は料金が気になる。

まとめ

Twilioは今回はじめて使ってみたけど、ライブラリが整っており、しゃべらせるぐらいなら簡単にはじめることができた。他のAPIもためしていきたい。

本格的におしゃべりしたいからruboty-twilioのruboty adapterがほしいな。

RubotyでHubotスクリプトが使えるruboty-hubotを公開した

TL; DR;

ruboty-hubotを使うとscriptsディレクトリ以下に置いた単純なHubotスクリプトをRubotyで実行出来る。

経緯

以前、Hubotスクリプトのhubot-sushiyukiをruboty-yasyとして移植した記事のまとめで、HubotスクリプトをRubotyで動かせるのではないかと書いた。

今回はHubotスクリプトを人間が読んで解釈してRubotyにわかるように翻訳した。 Hubotのプラグインインターフェイスはある程度決まっている。 RubotyとHubotスクリプトの間をつなぐようなハンドラーがあれば、HubotスクリプトをそのままRubotyのスクリプトとして動かすことも出来るのではないかと考えている。

実際に可能なのか実験してみた。

くふうしたところ

RubotyとHubotスクリプトをつなぐ

lib/ruboty/hubot/robot.rbでHubotのAPIを実装し、Rubotyから結果を取れるようにした。

Herokuでも動く

heroku/heroku-buildpack-rubyではexecjsが入っている場合、JSの実行環境としてnodeをインストールしてくれる。 ちなみにnpmは入らない。Rubyのビルドパックに加えてnpmも欲しい場合はddollar/heroku-buildpack-multiを使うとよい。

もんだい

  • npmパッケージとして公開されているhubotスクリプトexternal-scripts.jsonに書かれているようなものが実行できない。
  • hubot-scripts.jsonが読み込めない。
  • .coffeeで書かれたhubotスクリプトが実行できない。
  • インターフェイスの互換性がrobot.respondしか実装できていない。(robot.hearrobot.httpがない`
  • requireなどCommonJSっぽい機能はexecjsで使えない。なので外部パッケージに依存するスクリプトは実質動かせない。
    • Hubotのrobotと同じように互換層をruboty-hubot側で用意してあげると実行できるようになりそう。

まとめ

思ったよりも簡単にHubotが動いてしまった。ただし実用するには問題が多々ある。 JSとRubyの境界線に小さい穴をあけて通り抜けるのは簡単だけど自由に行き来できる大きな穴をあけるのは難しい。

西暦を和暦の元号に変換してくれるruboty-gengoを公開した

1日1Hubotスクリプトのネタをパクることにした。

Usage

@ruboty gengo <year>

f:id:block_given:20141011010332p:plain

くふうしたところ

自分で何も書かずgemに頼った。

まとめ

毎日実用的なものやAPIを叩くなど重そうなものを書くのはちからがいる。 重め軽めのgemを交互に挟むことで燃え尽きないようにしたい。

Rubotyすしゆきプラグインruboty-yasyを公開した

すしゆきを表示してくれる。 naoyaさんのhubot-sushiyukiをRubotyに移植した。

TL; DR

Rubotyプラグインをつくるのを楽にして、みんなに面白いスクリプトいっぱい公開してほしい。

ハマったところ

gemの名前被り

ruboty-sushiyukiが存在するのに気づかずに作り始めてしまい、別の名前にリネームしたりで手間どった。

部屋全体に流れているメッセージの受け取り方がわからなかった

Rubotyのハンドラーでonを使うと、デフォルトだと@rubotyで自分宛にきたメッセージにしか反応しない。 全体の発言に反応するためにはallオプションをtrueに設定する。

module Ruboty
  module Handlers
    class Yasy < Base
      on /寿司||スシ|:sushi:|🍣/, name: 'gossip', description: ':sushi: | 壁 | :ear:', all: true
    end
  end
end

元々がhubotのプロジェクトなのでgemを公開するのに必要なファイル群がない

bundle gemなどでgemのプロジェクトを作成するとrubygemsに公開するために必要なものが一通りそろっていて便利。

Rubotyで何かしらハンドラーとアクションを作る場合、lib/ruboty/handlers/your_handler.rblib/ruboty/your_gem/actions/your_action.rbが必要になる。

それらのファイルを作成するための補助的なコマンドが欲しい。 例えば、以下のようなイメージです。

  • ruboty gem your_gem
  • ruboty generate handler your_handler
  • ruboty generate action your_action

元々がhubotのプロジェクトなのでrubyじゃない

Hubotのスクリプトを移植するだけだがそれなりに手間がかかる。 HubotのスクリプトをRubotyのhandlerとして実行できるようなプラグインが求められている。 sstephenson/execjsなどを使って実現できないだろうか。

まとめ

Rubotyプラグインをつくるのを楽にして、みんなに面白いスクリプトいっぱい公開してほしい。

自分のプラグイン作成の体験から以下のようなことをやるともっと楽にプラグインつくれるんじゃないかなと考えます。

rubotyプラグインの作成の障壁を下げたい

毎日rubotyのプラグインを公開し続けて4日目になった。 私が一からrubotyのプラグインを作るお作法は以下の通りだった。 3の部分が以外と手間がかかる感触で、そこが無ければプラグイン作成の障壁が下がると思う。 上の方であげたruboty gemコマンドがあれば1や3を自動で作れるのではないだろうか。

  1. 既存のプラグインがないかrubygems.orgで確認する
  2. bundle gem ruboty-yoでgemを作る
  3. 会話に反応してリアクションをとるにはlib/ruboty/handlers/yolib/ruboty/your_plugin/actions/yo.rbのファイルが必要
  4. rake releaseで公開

HubotスクリプトをRubotyで動かす

今回はHubotスクリプトを人間が読んで解釈してRubotyにわかるように翻訳した。 Hubotのプラグインインターフェイスはある程度決まっている。 RubotyとHubotスクリプトの間をつなぐようなハンドラーがあれば、HubotスクリプトをそのままRubotyのスクリプトとして動かすことも出来るのではないかと考えている。