• このエントリーをはてなブックマークに追加


はじめに

今さらながら,bot フレームワークである Hubot を触ってみたのでその記録.

参考

前者の連載 第2回目,「Hubotを動かしてみる」におけるひな形作成あたりの勝手は,現在のものとは異なっているようなので,そのあたりは本家の方を重視.

目次

  1. インストール
  2. ひな形を作成
  3. とりあえず体感: shell アダプタ
  4. ちょこっとだけ拡張してみる
  5. IRC に接続する: irc アダプタ
  6. Slack に接続する: slack アダプタ

インストール

Hubot は node.js 製なので,そのあたりから.

nodebrew

Homebrew であれば:

% brew install nodebrew

で入ります.そうでなければ

% curl -L git.io/nodebrew | perl - setup

した後,$HOME/.nodebrew/current/bin を環境変数 PATH に追加しておきます:

export $HOME/.nodebrew/current/bin:$PATH

node

% nodebrew install v0.10.33
(... takes a while ...)
% nodebrew use v0.10.33

Hubot 関連モジュール

Yeomangenerator-hubot を追加します.基本的なものなのでグローバルなところに:

% npm install -g yo generator-hubot

ひな形を作成

yo hubot した後,聞かれることにテキトーに Enter していけば,bot するためのファイル構成を準備してくれます:

% git init /path/to/myhubot
Initialized empty Git repository in /path/to/myhubot/.git/
% cd /path/to/myhubot
% yo hubot
                     _____________________________
                    /                             \
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             /
 ======= |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|
 
? Owner: issm <issm @myemail>
? Bot name: myhubot
? Description: myhubot
? Bot adapter: campfire
   create bin/hubot
   create bin/hubot.cmd
   create Procfile
   create README.md
   create external-scripts.json
   create hubot-scripts.json
   create .gitignore
   create package.json
   create scripts/example.coffee
   create .editorconfig
                     _____________________________
 _____              /                             \
 \    \             |   Self-replication process   |
 |    |    _____    |          complete...         |
 |__\\|   /_____\   \     Good luck with that.    /
   |//+  |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|
 
hubot-maps@0.0.0 node_modules/hubot-maps
 
hubot-help@0.1.1 node_modules/hubot-help
 
hubot-google-images@0.1.0 node_modules/hubot-google-images
 
hubot-diagnostics@0.0.1 node_modules/hubot-diagnostics
 
hubot-pugme@0.1.0 node_modules/hubot-pugme
 
hubot-rules@0.1.0 node_modules/hubot-rules
 
hubot-youtube@0.1.2 node_modules/hubot-youtube
 
hubot-google-translate@0.1.0 node_modules/hubot-google-translate
 
hubot-heroku-keepalive@0.0.4 node_modules/hubot-heroku-keepalive
 
hubot-shipit@0.1.1 node_modules/hubot-shipit
 
hubot-redis-brain@0.0.2 node_modules/hubot-redis-brain
└── redis@0.8.4
 
hubot-scripts@2.5.16 node_modules/hubot-scripts
└── redis@0.8.4
 
hubot@2.9.3 node_modules/hubot
├── optparse@1.0.4
├── log@1.4.0
├── scoped-http-client@0.9.8
├── coffee-script@1.6.3
└── express@3.18.1 (basic-auth@1.0.0, merge-descriptors@0.0.2, utils-merge@1.0.0, fresh@0.2.4, cookie@0.1.2, escape-html@1.0.1, range-parser@1.0.2, cookie-signature@1.0.5, vary@1.0.0, media-typer@0.3.0, parseurl@1.3.0, methods@1.1.0, content-disposition@0.5.0, depd@1.0.0, debug@2.1.0, etag@1.5.1, proxy-addr@1.0.3, commander@1.3.2, mkdirp@0.5.0, send@0.10.1, connect@2.27.1)
% git add .
% git commit -m 'initial commit'
</issm>

とりあえず体感: shell アダプタ

続きを読む »

  • このエントリーをはてなブックマークに追加


本日の完走証。汗で濡れたリュックに入れてたのでまだ乾ききっていないw

はじめに

こちらに参加するため,去る10月の25日,26日の土日 1泊 2日でしまなみ海道までバタバタと行ってきました.

行程としてはおおざっぱに次のとおり:

本エントリは,そのうちの「日曜日」編です.

おもな交通ルート

宿から会場まで:

伊予西条: 宿
  | (予讃線)
今治

さて部屋を出る。

5:30 頃起床.両腿表側がちょこっと筋肉痛気味w

朝食が始まる(6:45)までに出発の準備.どれくらいぶりかわからないくらい久しぶりな宿でとる朝食でしたが,電車発(7:15)まであまり時間がなかったため,10分ほどで食べてチェックアウト.

伊予西条駅。

伊予西条駅.このとき iPhone6 落としましたorz 幸い購入時に保護ガラス:

を貼っておいたので大事には至りませんでしたが,角とか保護ガラス自体とかが少し欠けたりしてしまいました.

upload

40分ほどかけて今治駅へ.

一部の荷物をコインロッカーへ。

今治駅に到着.会場で預けられないようなな荷物をメッセンジャーバッグに詰め込んでコインロッカーへ.「大」サイズのロッカーなら余裕で入ります.500円.

さてここでちょっとトラブル?このコインロッカー,100円玉しか使えない.財布の中,100円玉が 4枚.改札までは遠い,時間ないしメンドイ.近くに自販機発見,が,100円玉釣り銭切れ,みんな同じこと考えてやがるw

で,念のため 「中」サイズ(300円)でも入るかどうか確認したところ,ちょっと押しこむ感じではあるけどでもなんとか入ったのでひと安心.

自転車前ゼッケンはこんな感じでいいのかな。

袋から開放して自転車を組み立て.そして自転車前面にゼッケンを取り付け.

あ,輪行袋をまとめてからロッカーに入れればよかったorz まぁこれも手荷物預かりに含めるか...

サイクリングしまなみ本番

続きを読む »

  • このエントリーをはてなブックマークに追加


組み立て完了!

はじめに

こちらに参加するため,去る10月の25日,26日の土日 1泊 2日でしまなみ海道までバタバタと行ってきました.

行程としてはおおざっぱに次のとおり:

本エントリは,そのうちの「土曜日」編です.

おもな交通ルート

自宅を出て受付会場まで:

自宅
  | (自走)
大曽根
  | (中央本線)
名古屋
  | (のぞみ)
福山
  | (山陽本線)
尾道
  | (自走)
今治: 「サイクリングしまなみ」受付

受付後,宿まで:

今治
  | (予讃線)
伊予西条: 宿

出発 〜 尾道

大曽根駅まで自走,そこで袋詰めして切符を購入.のぞみの指定席が埋まってしまっていたため,自由席を選択.

07:37 発待ち。自由席しかなかったw

名古屋駅.のぞみ自由席もみごとに満席のため,デッキ(この単語が出てこず,知恵袋の恩恵 を)で Tiwtter と外を交互に見ながらスタンディング.

新大阪駅.ここでようやく座ることができました.前日深夜 4時までお仕事してて 30分くらいしか寝ていなかったので睡眠開始.

福山駅.寝過ごすこともなく降車.

山陽本線に乗り換えて尾道駅へ到着しました.

4年半ぶり!

4年半ぶり!

尾道側でも関連イベントなどで人がたくさん.これからしまなみ海道走るぜ!な人たちもたくさん見かけました.

尾道〜 受付会場@今治

続きを読む »

  • このエントリーをはてなブックマークに追加


2014-10 最初のエントリ & 生存報告.

メモ

IMGP1635

(写真は以前に走ったときのもの)

行ってきます.はいそうですぼっちです.

しまなみ海道を走るのは 4年以上ぶり 2回目,自転車で走る関連のイベントは鈴鹿サーキットを走る以外では 2年半前に開通前の新東名高速道路を少し走った 以来 2回目でしょうか.まじイベント素人ですが楽しみです.

開催は 2014-10-26 ですが,受付が前日なので,明日土曜日朝のうちに出発する感じ.

せっかくなのでこれを持って行こうかしらw

新デザインでてるしw

関連エントリ

  • このエントリーをはてなブックマークに追加


メモ

※ 「drop イベント云々」というよりは「DataTransfer#files が」という方が正しいですかね.

Dropzone.js を用いた,ローカルファイルをブラウザにドロップすることによるファイルアップロード機能の実装を試していて,Firefox と Chrome とで,その挙動の時間にあまりに差があったので,ちょっと確認.

気になる個所

Dropzone.js のソースコードを読んでたりした結果,Dropzone#drop での e.transferData.files の部分が怪しいのではないかということに.

ごく簡単な確認

drop イベントハンドラ内で DragEvent#transferData.files を呼び出す前後の時刻差を計算してみる.これが,ドロップするファイル数に対してどのように変化するのか.

マシン

  • MacBook Pro 15-inch, Late 2011
  • プロセッサ 2.5 GHz Intel Core i7
  • メモリ 16 GB 1333 MHz DDR3
  • ソフトウェア OS X 10.9.4(13E28)

古い.

ブラウザ

  • Firefox 32
  • Chrome 37

準備したファイル

  • 2500 点の JPEG ファイル
  • 5.5GB (2.25MB / ファイル)

コード

まっさらから準備するのがメンドウだったので,実装中のアプリケーションに対して,Dropzone#drop を上書きして上記の処理を行うだけにするなどして環境を準備:

class DZX extends Dropzone
    drop: (ev) ->
        [t1, t2] = [(new Date()).getTime(), null]
 
        files = ev.dataTransfer.files   # (A)
 
        t2 = (new Date()).getTime()
        result = (t2 - t1) / 1000
        console.log result
 
class DZModel
    dz: null
    constructor: (args) ->
        {target} = args
        dz_opts =
            url:                   'foobar'
            createImageThumbnails: false
            autoProcessQueue:      false
            autoQueue:             false
        @dz = new DZX(target, dz_opts)
 
window.onload = () ->
    new DZModel(target: '#dzmodel')

この状態でリロードしてはファイルをドロップしては...を繰り返す原始的な方法.特定のファイル数につき一度ずつしか計測していません.

結果

グラフについて,横軸がファイル数,縦軸が処理前後の「時刻差」(単位は「秒」).

A

ss-1410892971

Chrome は常にほぼ 0 なのにたいして,Firefox ではファイル数の増加に伴い指数関数的に処理時間が増加しているように伺える.

B

意味があるのかどうかわからないけど,先のコードの (A) の部分を「代入しない」形にしてみる.

        ev.dataTransfer.files   # (B)
ss-1410893217

A の場合と変わりはないみたい.

C

Event#dataTransfer にだけアクセスしてみた場合:

        ev.dataTransfer   # (C)
ss-1410894391

Firefox,Chrome 両者ファイル数に関係なくほぼ 0.

TSV データ

上記 A 〜 C の TSV データ:

まとめ

Firefox では,DataTransfer#files の参照処理時間が,ファイル数に対して指数関数的に増大する傾向にあるのではないか,という気がする.

実装するアップロード機能,最低 5000 ファイルくらいのドロップには対応できるようにしたいところだけど,Dropzone.js の問題でもなさげだしどうしたものかなぁ...

1 of 12112345...102030...121