コーヒーこぼした。

プログラミングとちょこっとハード

ラーメン紀行 - 長崎うまか亭

研究室の仲間でちゃんぽん行きました。

f:id:imkitchen:20150604131248j:plain:w512

最近不足気味の野菜を大量に摂取しました。

個人評価:★★★★☆
ジャンル:ちゃんぽん
説明:
  写真ではわかりにくいですがノーマルなサイズでも、だいぶ量多いです。
  スープはちゃんぽんにしては結構濃厚で、こってりとあっさりの中間くらい。

エンジニア座談会に参加してきた話

どもども。
2年の更新期限に迫られて最近iPhone5からiPhone6に機種変したid:imkitchenです。
もうちょっと待てばiPhone6sとかiPhone7とか出そうなのに!
f:id:imkitchen:20150602001056j:plain:w256

それはそうと今日は京都で行われたエンジニア志望者のための座談会に参加してきました。
正式にはサポーターズ主催の「エンジニアスペシャル合同セミナー」です。

参加企業は

の4社で、各社の人事やエンジニアの方がいらっしゃっていろいろとお話してくれました。

最初に一通りプレゼンで概要を話していただいた後、座談会というだけあって、だいたい5、6人ぐらいのグループに分かれて1社ずつ入れ替わりで詳細な話やぶっちゃけトークをしてくれました。
想像してたよりだいぶラフな感じです。

ちなみに僕は本命のクックパッドさん目当てにこのイベントに申請したのですが、話を聞いているうちに他の3社の事業内容やインターン情報にもとても魅力を感じました。

特にエンジニアの労働環境作りには、どの企業もかなり力を割いていて、オフィス写真を見るとどこもお洒落です。
もちろん見た目だけじゃなくて、やりたいことがある人には新規事業立ち上げに対するサポート体制があったり、社内での起業ができたりと、アイデアを形にするには絶好の環境だと感じました。

実はこういったイベントに参加するのは今回が初めてで結構緊張してたんですが、実際話してみると面接のようなガチガチの雰囲気ではなく、笑い交じりにウラ話も聞けたりして、来てよかったと思える一日でした。

そして今日の戦利品です(戦ってないけど)

ステッカーは嬉しいですね。
早速、MBAに貼りたいと思います。

あと、帰り際に立命時代通い詰めたラーメン屋の四条店に行きました(通ってたのは南草津駅前の本店)。
もやしを噛み締めながら、なんかとても懐かしい気分になりました。


https://instagram.com/p/3Y-DOXGwDv/
Instagram

以上、今日の出来事でした。

P.S. 前回まで、デアル調で書いていたのですが書きにくかったので口調を変えました。

hubot-authの導入でハマった話

やあ、今回はhubotを育てる回だよ。


前回導入したhubotに権限管理機能を追加するhubot-authを追加したのだが、そのときにちょっとしたことで詰まったのでメモを残しておく。


hubot-authを追加するとユーザに対してhubotコマンド実行のパーミッションを設定できる。

% npm install hubot-auth --save # hubot-authをインストール


external-scripts.jsonにhubot-authを加え、環境変数にslackのusernameをexportしたのだが...

f:id:imkitchen:20150528142725p:plain

ファッ!!

この後、めちゃくちゃheroku上の環境変数を確認したが原因は分からなかった。
半ばあきらめかけていたところでhubot-slackGitHubリポジトリを見るとこんな記述が...

If you're using the hubot-auth script, you can get the user IDs required for the HUBOT_AUTH_ADMIN setting by calling the users.list API method.

どうやら登録時に決めたusername(yosuke-t)とIDは別らしい。
hubot-authの方に書いてくれ。(よくよく考えればチームが異れば同名で登録できるのでusername=IDなわけがなかった)

slackにhubotを連携した時に使ったトークンをusers.list method | SlackのExtra argsに

token=xxxx-xxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx

という感じで入力してTest Methodを実行したところ、slack上のユーザの情報がjsonで返ってくる。
この情報を見ればわかるがIDは UXXXXXXXX のような形式で内部的に利用されているもので、usernameとは別物だ。
こちらの方はslackユーザ全体で一意に定まる。

つまり、環境変数HUBOT_AUTH_ADMINにはこっちの UXXXXXXXX の方をexportする必要がある。
その結果。

f:id:imkitchen:20150528144623p:plain

と、無事権限管理ができるようになった。
ちなみにslack上のコマンドで指定するのはusernameの方なので注意(ややこしい)。

slackにhubotを住まわせた話

俺氏、ブログはじめるってよ。

先日slackにhubotを導入したのでその話をしようと思う。

slackってのはエンジニアの間で数年前から盛り上がってるIRCライクなチャットツールだ。
なんといっても1番の特徴は様々な外部サービスとの連携機能だろう。

日常会話程度ならLINEで事足りるのだが、やはり技術的な議論となると何かと連携があったほうが便利だと思う。

しかし、slackは無料プランのままでは連携できるサービスの数に上限がある。
有料プランはスタンダードプランで1人あたり月額6.67ドル(820円くらい)。
これを研究室の人数分払うとなると、ざっと年間30万くらいになってしまう。
良いMac買えるやないか。

この金銭的問題を解決してくれる救世主がhubotだ。hubotはGitHubが開発し、社内で運用しているDevOpsのためのbotフレームワークである。hubot自体はNode.jsで実装されていて、ユーザはcoffeescriptスクリプトを書けば独自の振る舞いを追加できる。slack以外にもいろいろなチャットツール向けにアダプタが提供されているので、IRCやhipchatやchatworkにも導入できるし、twitter botとして機能させることも可能だ。

この記事は上記のhubotを使って連携枠の消費1つで有料プランとほぼ同等のことをしようという趣旨のもと書いている。

要は月額820円払いたくないのである。
切実に死活問題なのである。

何はともあれ、まずはhubotを手に入れることから始めよう。雛形ジェネレータのyeomanを使えば動作する状態のディレクトリツリーがあっという間に出来上がる。

いい時代だ。

パッケージyoとgenerator-hubotは予めインストールしておこう。

# 必要なパッケージをインストール
% npm -g install yo
% npm -g install generator-hubot
#雛形生成
% mkdir myhubot && cd myhubot
% yo hubot

yeomanにいくつか質問されるが、今回はアダプターのところだけ"slack"に変えればよい。
これでhubotの雛形が完成する。シェル上で動作確認してみよう。

% ./bin/hubot
[Wed May 27 2015 19:32:40 GMT+0900 (JST)] INFO Using default redis on localhost:6379
[Wed May 27 2015 19:32:40 GMT+0900 (JST)] INFO Data for hubot brain retrieved from Redis
myhubot> myhubot ping
PONG

生まれたてのhubot。ああ、かわいい。

ここからスクリプトを追加していく。
coffeescriptに馴染みが無い人にはちょっと辛いかもしれないが、お金を払ってないことを思い返してほしい。

さて、ここでディレクトリの構成を確認。次のような感じになっているはずだ。(node_modulesの中身は割愛)

  • myhubot/
    • bin/
      • hubot
    • scripts/
      • example.coffee
    • node_modules/
    • Procfile
    • README.md
    • external-scripts.json
    • hubot-scripts.json
    • package.json

何か追加したい機能があるときは、まずはnpmやGitHubリポジトリに既にないか探してみよう。APIを公開しているようなサービスであればだいたい誰かが既に作っている。

追加の仕方はとても簡単だ。
npmでパッケージをインストールしてexternal-scripts.jsonに1行書き足すだけ。

今回はhubot-githubを追加した。

# hubot-githubをインストール
% npm install hubot-github --save
diff --git a/package.json b/package.json
index 8a7795d..06b67a7 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,8 @@
     "hubot-redis-brain": "0.0.2",
     "hubot-scripts": "~2.5.16",
     "hubot-slack": "~3.3.0",
-    "hubot": "~2.12.0"
+    "hubot": "~2.12.0",
+    "hubot-github": "~0.2.0"
   },
   "engines": {
     "node": "0.10.x"
diff --git a/external-scripts.json b/external-scripts.json
index a2d8106..891bead 100644
--- a/external-scripts.json
+++ b/external-scripts.json
@@ -9,5 +9,6 @@
   "hubot-redis-brain",
   "hubot-rules",
   "hubot-shipit",
-  "hubot-youtube"
-]
\ No newline at end of file
+  "hubot-youtube",
+  "hubot-github"
+]

GitHubの設定ページでpersonal access tokensを発行し、環境変数に次のものを加える。

HUBOT_GITHUB_KEY - Github Application Key (personal access token)
HUBOT_GITHUB_ORG  - Github Organization Name (the one in the url)
HUBOT_SLACK_ADMIN - Slack Admins who can use certain admin commands

さあ、ここまで来ると本番環境で動かしてもいいだろう。
無料がモットーなのでherokuの無料枠インスタンスを使ってデプロイする。

準備は整った。

slackではhubotも1ユーザとして扱われるので動作テストはhubotとの個別チャットでやるとよいだろう。当然だがエラーや設定ミスでhubotが死んでいるとあなたの発言は虚空の彼方に消えていく。

#generalのようなpublicなチャンネルでこれをやるとbotに無視された恥ずかしいヤツになるので注意しよう。

herokuで動かす場合、一定時間アクセスがないとインスタンスが自動で停止してしまう。一般的にはインスタンス時間の節約になっていいのだが、hubotの場合は常にイベントを待ち構えていなければいけないのでこれは困る。

hubot-heroku-keepaliveパッケージは一定時間ごとに自分に対してリクエストを行うことでこの問題を回避するためのパッケージだが、少し前から機能しなくなった。環境変数名が変わったのかもしれないが、確認はしていない。他にUptime Robotというサービスを使うという解決方法があるのでこちらを使うと良いだろう。
設定に関してはここが参考になる。bouzuya.hatenablog.com


このブログがいつまで続くかはわからない。
僕の性格からしてそう長くは続かないだろう。
しかし、もし続くとしたら次回以降は僕が導入したhubotスクリプトをいくつか紹介していこうと思う。

スポンサーリンク