HUBOTのTips(警告"@http() is going to be deprecated in 3.0.0 use @robot.http()"への対処)

HUBOTに最初から含まれているサンプルのスクリプト(math.coffee、pugme.coffee、youtube.coffee等)を利用すると、以下のような警告が出るケースがある。

Hubot> hubot math me 1 + 2
Hubot> [Mon Jul 15 2013 00:22:55 GMT+0900 (JST)] WARNING @http() is going to be deprecated in 3.0.0 use @robot.http()
3
Hubot> 


警告が出ている理由はResponseクラスのhttpメソッドを利用しているためである(ResponseクラスのhttpメソッドはHUBOTのバージョン3.0.0で廃止予定と言っている)。
実際に警告を出している場所は以下(response.coffee)。

class Response
  ... snip ...
  http: (url) ->
    @robot.logger.warning '@http() is going to be deprecated in 3.0.0 use @robot.http()'
    @robot.http(url)

module.exports = Response


この警告を消すにはResponseクラスのhttpメソッドを利用する変わりに、Robotクラスのhttpメソッドを利用すれば良い。
具体的には以下のようにmath.coffeeを修正する。

module.exports = (robot) ->
  robot.respond /(calc|calculate|convert|math|maths)( me)? (.*)/i, (msg) ->
    # msg.httpの変わりにrobot.httpを使う
    # msg
    robot
      .http('https://www.google.com/ig/calculator')
      .query
        hl: 'en'
        q: msg.match[3]
  ... snip ...


【備考】
ver 2.6.0以降ではyoutube.coffeeは@robot.http()を利用するように修正されている。また、Responseクラスも警告メッセージを出さないよう修正されている。

How to use Hubot behind a proxy.

You may fail to run a bot which uses http connection with Hubot if you are behind a proxy such as Squid.
Hubot behind a proxy · Issue #287 · github/hubot · GitHub
For example, you'll have following type of error messages when you run "hubot youtube me [search key words]".

events.js:72
            throw er; // Unhandled 'error' event
                      ^
Error: connect ECONNREFUSED
  at errnoException (net.js:900:11)
  at Object.afterConnect [as oncomplete] (net.js:891:19)

In this case, you might be able to solve the issue to specify proxy address and proxy port in node-scoped-http-client which is one of the wrapper libraries of Node.js's HTTP client and used by Hubot.

How to modify the source code (hubot/node_modules/scoped-http-client/src/lib/index.js) is as follows.

port = this.options.port || ScopedClient.defaultPort[this.options.protocol] || 80;
req = (this.options.protocol === 'https:' ? https : http).request({
  // port: port,
  port: 3127,           // you have to specify a proxy port.
  // host: this.options.hostname,
  host: 'localhost',   // you have to specify a proxy server address or hostname.
  method: method,
  // path: this.fullPath(),
  path: 'http://' + this.options.hostname + this.fullPath(),
  headers: headers,
  agent: this.options.agent || false
});

HUBOTのセットアップメモ

Linux環境(Cent OS 6.4)にHUBOTをセットアップした際のメモ(全てrootで実施)。


【事前準備】
HUBOTの前提となるnode.js、CoffeeScriptをインストールしておく(node.jsと一緒にnpmもインストールされる)。
また、Botで扱うデータを永続化するためにredisもインストールしておく(redisはサーバ起動時に自動起動するようにしておく)。
今回使用したバージョンは以下。


# node -v
v0.10.11
# npm -v
1.2.30
# coffee -v
CoffeeScript version 1.6.3
# redis-server -v
Redis server version 2.4.10 (00000000:0)


【Hubotのインストール】
npmでHUBOTをインストールする。具体的には以下のコマンドを実行。なお、以下の作業は全てrootユーザのホームディレクトリで実行した。


# npm install hubot

IRCと連携させるために、以下のコマンドを実行してIRC Adapterもインストール。


# npm install hubot-irc
なお、本日時点でインストールされたバージョンはhubot 2.5.5とhubot-irc 0.1.15。


【redisによるデータ永続化のための作業】
nodeでredisを利用するために、以下のコマンドを実行する。


# npm install redis

更にHUBOTからredisを使えるようにするため、3rd-partyのhubot scriptsをダウンロードする。


# npm install hubot-scripts
そして、hubot-scripts/src/scripts/redis-brain.coffeeを$HOME/node_modules/hubot/src/scripts配下にコピーする。


【Hubotの起動スクリプトを用意】
HUBOT起動用に以下のようなスクリプトを用意。これを$HOME/node_modules/hubot配下に置く。

#!/bin/sh
# runhubot

export HUBOT_IRC_NICK="hubot"
export HUBOT_IRC_ROOMS="#Test"
export HUBOT_IRC_SERVER="127.0.0.1"

./bin/hubot -a irc

あとはこのスクリプトを実行すればHUBOTを起動することが出来る。

HUBOT関連技術のメモ

HUBOT | Hubot is your friendly robot sidekick. Install him in your company to dramatically improve employee efficiency.とはGitHub社が開発したOSSBOTフレームワークIRCBOT等を簡単に作ることが出来る)。なお、HUBOTの詳細を知るには以下の記事が参考になる。


HUBOTの関連技術の主な物は以下。
1. CoffeeScript
CoffeeScriptプログラミング言語の一つで、JavaScriptをよりわかりやすく、簡潔に記述するための言語。
HUBOT自体がこのCoffeeScriptで書かれている。また、HUBOTを利用したBOTCoffeeScriptで記述可能(JavaScriptでも書ける)。
なお、CoffeeScriptはドットインストールで勉強できる(http://dotinstall.com/lessons/basic_coffeescript)。
参考記事は以下。

2. Node.js
Node.jsはOSSでサーバーサイドのJavaScriptインタープリタ。Node.jsを使うことで、サーバサイドのアプリケーションの実装言語として、JavaScriptを使用出来る(Node.js自体はC++で実装されている)。HUBOTもこのNode.jsを利用している。
参考記事は以下。

3. Redis
RedisはOSSでKVS型のインメモリデータベース(Cで実装されている)。HUBOTで作ったBOTのデータを永続化する場合(HUBOTを再起動してもデータを利用可能にする等)に必要。
なお、Redisもドットインストールで勉強できる(http://dotinstall.com/lessons/basic_redis)。
参考記事は以下。

4. CampFire
CampFireは企業向けのコラボレーションツール。HUBOTは元々このCampFire用のボット作成ツールとして作られたそう。
CampFireを開発しているのは、プロジェクト管理ツールBasecamp等も作っている37signals


【その他参考記事】

コーディング規約メモ

プログラマのための言語別コーディング規約まとめ | Web活メモ帳というのが出ていたが、CとかC++とかJavaが無かったので、補足としてそれらをリストアップしておく。


【C】

C++

Java


あと、Googleはシェルのスタイルガイドも公開してたのね。

Beautiful Soup 4へのポーティング

pythonで動作するHTMLとXMLのパーサーであるBeautiful Soupをバージョン3からバージョン4にポーティングした際のメモ(非常に簡単)。


【前提】
Beautiful Soup 4(以降BS4)はpython 2.6以上かpython 3で動作する。


【修正ポイント】
・パッケージ名の変更
 BS4からパッケージ名が変わったので変更する。
(変更前)

from BeautifulSoup import BeautifulSoup

(変更後)

from bs4 import BeautifulSoup

エンコーディングの指定形式の変更
 ワーニングを消すために引数の名称を変更。
(変更前)

soup = BeautifulSoup(html, fromEncoding='Shift_JIS')

(変更後)

soup = BeautifulSoup(html, from_encoding='Shift_JIS')

以上でポーティング終了である。


【その他】
BS4で良いなと思ったのは、get_text()でタグに挟まれた文字列を取得する事が出来るようになった点。
stringとの違いは前後の空白を削除してくれる所。


【参考ドキュメント】
Porting code to BS4 ― Beautiful Soup 4.0.0 documentation

ボットの環境メンテナンス等々

Google App Engineを利用してTwitterボットを幾つか動かしているのだが、Twitter API 1.0がそろそろ廃止されると言うことで、その対応のついでに色々やった事をメモしておく。


1. Twitter API 1.1対応
Twitter API 1.1に対応するという作業を実施。
といっても、Twitterへのポストはtweepyというライブラリを利用しているので、このtweepyをバージョン2.0にする事で対応終了(ただし、API 1.1で廃止されたインタフェース(friends_timeline()等)を使っている場合には、ボットのコード修正が必要になる)。
なお、自分が使っているtweepyのバージョンは__init__.pyを見れば確認出来る。


2. Google App Engineのデータストアの移行
こちらも、GAEのMaster/Slave Datastoreが廃止予定と言うことで、新しいHigh Replication Datastore(HRD)への移行を実施。移行は以下の記事に従って実施するとスムーズに終了した。
なお、移行に掛かった時間はおよそ30分である。


3. Pythonのバージョンアップ
いつの間にかGoogle App EnginePython 2.5だけでなくPython 2.7が使えるようになっていたので、ボットで利用するPythonのバージョンも2.7に変更(Python 2.7を使うにはHRDに移行しておかないとダメな模様)。
具体的にはapp.yamlを修正して、runtimeをpythonからpython27に変える。あと、新たにthreadsafeの指定が必要になるのでtrueかfalseを指定する。

application: hoge
version: 1
runtime: python27
api_version: 1
threadsafe: false

また、GoogleAppEngineLauncherのPreferencesでPython Pathを/usr/bin/python2.7等に変更して、ローカルのテスト環境もPython 2.7を利用するように変更しておく。


【参考記事】

【関連記事】