Skip to content

Instantly share code, notes, and snippets.

@tomohiro
Created May 31, 2012 05:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomohiro/2841157 to your computer and use it in GitHub Desktop.
Save tomohiro/2841157 to your computer and use it in GitHub Desktop.
Hubot

Hubot とは

Hubot

紹介

GitHub で使用されている Bot フレームワーク。 デフォルトは Campfire という Web チャットアプリケーションで動作するようになっているが, アダプターという別のモジュールを組み合わせることで IRC や Twitter, Yammer といった 外部のサービスとも連携することが出来る。

GitHub 上にてオープンソースで公開されており,Hubot 用のプラグインもオープンソース で様々な人が作成して,公開している。

Heroku にデプロイできるためサーバを構築しないでも設定を書いたりプログラムを書くだけで Hubot を利用できるというメリットがある。

今回 Hubot を動かすために使った環境・ツール

Uubuntu Server 12.04 LTS

Ubuntu(ウブントゥ)とは、Debian GNU/Linuxをベースとしたオペレーティングシステム (OS)。 Linuxディストリビューションの一つであり無償で提供されている。

ちなみに Ubuntu Server 12.04 の Linux Kernel のバージョンは 3.2 である。

Node.js

Wikipedia より

Node.js はイベント化された入出力を扱うUnix系プラットフォーム上の サーバーサイドJavaScript環境である(V8 JavaScriptエンジンで動作する)。

公式ドキュメントのトップページ(和訳)より - node.js

Node.jsは高速でスケーラブルなネットワークアプリケーションを 簡単に構築するためにChrome の JavaScript 実行環境上に 構築されたプラットフォームです。 Node.jsはイベント駆動とノンブロッキング I/O モデルを使用することにより 軽量・効率的で、分散されたデバイスにまたがるデータ集約的なリアルタイム アプリケーションに最適です。

Node.js のライブラリマネージャーとして npm や,Ruby on Rails のような Web アプリケーションフレームワークとして express などのソフトウェアがある.

Ubuntu にインストールするためには apt コマンドを使う。

$ sudo apt-get install nodejs nodejs-dev

ソースコード

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

上記のソースを hello_server.js として保存して node コマンドで起動する

$ node hello_server.js
Server running at http://127.0.01:1337/');

他の言語と何が違うか

公式ドキュメントの概要(和訳) - node.js

スレッドベースではないめ省メモリで効率的

Node は、 1接続ごとに2MBのスタックメモリを割り当てるスレッドベースのシステムに比べて、 高負荷時にとても良いメモリ効率を実現します。 さらに、Node のユーザはプロセスのデッドロックの 心配から開放されました。 Node にはロックがないのです。 Node には直接 I/O を実行する関数がほとんど無いため、 プロセスは決してブロックされません。 ブロックがないため、 エキスパートではないプログラマであっても高速なシステムを開発することができるのです。

言語自体がイベントループ機能を持っている

Node は、Ruby の Event Machine や Python の Twisted の影響を受けており、よく似たデザインになっています しかし、Node はイベントモデルをさらに推し進めています すなわち、イベントループをライブラリとして提供するのではなく、 言語自体に組み込まれた構成として提供しています Node 以外のシステムでは、イベントループを開始する際に必ずブロック呼び出しが存在します それらのシステムでは、一般的にスクリプトの先頭でコールバックを通じて行う動作を定義し、 スクリプトの最後で EventMachine::run() のような ブロック呼び出しを行ってサーバを開始させています Node では、そのような「イベントループの開始」呼び出しはありません Node は入力されたスクリプトを実行し終えると、 そのままイベントループに入ります そして動作すべきコールバックがなくなるとイベントループから抜け出します こういった挙動は、ブラウザ上の JavaSciprt と同じです すなわち、イベントループはユーザからは隠匿されているのです

CoffeeScript

Wikipedia より

CoffeeScript はプログラミング言語のひとつである。コードはJavaScript のコードに変換される。 Ruby や Python、Haskell [1] から影響を受けたシンタックスシュガーの導入により、 JavaScript に比べ簡潔さと可読性を向上させたほか、配列内包 (Array comprehensions) やパターンマッチといった機能を追加している。

インストールには npm コマンドを使う

$ sudo npm install coffee-script

ソースコード

CoffeeScript

cubes = (math.cube num for num in list)

JavaScript

cubes = (function() {
  var _i, _len, _results;
  _results = [];
  for (_i = 0, _len = list.length; _i < _len; _i++) {
    num = list[_i];
    _results.push(math.cube(num));
  }
  return _results;
})();

hello_world.coffee のように拡張子を coffee にして,下記のように実行する。

$ coffee hello_world.coffee

JavaScript にコンパイルする際は -c オプションを使用する

$ coffee -c hello_world.coffee # hello_world.js が生成される

用途としては

Node.js を書いたり,jQuery のコードを書いたりする時に使用される。 既存の JavaScript のソースを CoffeScript に変換する js2coffee というものもある。

$ sudo npm install js2coffee

オンラインでも試せる。

Redis

オープンソースの KVS (データベース) Hubot がデータを保存するために使用する。

Ubuntu には下記コマンドでインストールする。

$ sudo apt-get install redis-server

Hubot を動かす

Hubot のインストール

$ sudo npm install hubot -g

プロジェクトの作成

$ hubot -c <hubot> # -c でプロジェクト作成オプション <hubot> はプロジェクト名

出来あがったら /var/lib/ 以下に移動しておく

$ sudo mv ./hubot /var/lib/hubot

スクリプトの例

発言に対して反応するスクリプトの例

$ vi /var/lib/hubot/scripts/hello.coffee
module.exports = (robot) ->
  robot.respond /こんにちは/i, (msg) ->
    msg.reply 'こんにちは!'

  robot.hear /(失礼|しつれい)(いた||)します/i, (msg) ->
    msg.send 'お疲れ様でした!'
$ sudo service hubot restart
  • robot.hear - 全ての発言に対して反応
  • robot.respond - 'hubot 命令' のように話しかけられた時に反応
  • msg.send - メッセージを発言
  • msg.reply - 話しかけた人に返答する

問題点

社内プロキシの設定を読み込ませることが出来ず,外部ネットワークと通信できない Issue #287: Hubot behind a proxy - github/hubot

Issue はあるが解決されず close されている状態

  • 多分底辺のライブラリに直接プロキシサーバの設定を埋めればいけるかも?
  • Ruby で書いて stdin/stdout でのみやり取りする形でも困らないからそれでも良いのではないか

今後について

  • 簡単にスクリプトが開発できるようにする(Cakefile のタスクをもっと便利に, あとドキュメント)
  • 仕事を Hubot のスクリプト化して仕事を楽にしていきたい

参考資料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment