That Can

雑な感

研究がつらい - MCC Advent Calendar 3日目

これは、MCC Advent Calendar3日目の記事です。

前回は、hu君の「MCCの副部長として」です。僕もMCCの副部長やりましたが、特に何もしなかったので、反省してます。MCCMMANCCがなんか続いてるので良かったなと勝手に思ってます。でも主に僕以外の交流先の人とかicchyとかが頑張っていたので僕の手柄は特にないです。

あと話は変わりますが、先日久しぶりに早起きしたのでMCCの部会に行ってみましたが、完全に部外者感が出てて老人の気持ちになりました。

2018/2/10追記: あまりに内容が酷かったのでリライトしました。発表も終えたので辛さから解放された気持ちで書いています。


それはさておき、研究がつらいです。理由は諸説ありますが、研究は基本的に一人で進めるプロジェクトなので孤独感に苛まされがちです。

あまりにもつらいのでコウテイペンギンの赤ちゃんに褒めてもらう事にしました。

コウペンちゃん

コウテイペンギンの赤ちゃんとは、るるてあ(twitter: @k_r_r_l_l_)さんにより生み出された全てを肯定してくれるペンギンの赤ちゃんで、通称コウペンちゃんです。めちゃくちゃ可愛い外見に加え、全てを肯定する懐の深さに僕は救われる毎日を過ごしています。

頑張ったら、コウペンちゃんにたくさん褒めてもらうために、タスクを完了したら褒めてくれるbotを作る事にしました。

システム概要

f:id:jackale:20180210181631p:plain
システム概要の雑な図

タスク管理としてTrelloを使っていて、完了したタスクはDoneと言うリストに入れるようにしてます。 よってDoneリストにカードが入ったらタスク完了としてそれをSlackにコウペンちゃんの画像とお褒めの言葉をメッセージとして送るようにしました。 botはHeroku上で動かして、フレームワークにはとりあえずHubot使っています。

Hubot + Heroku + Slack

次の記事参考にやりました。この三つの連携は適当にググれば色々出てくると思います。 https://qiita.com/susuwatarin/items/019e0e701754161f7c4c

HubotはGithub社謹製のbotフレームワークです。 メッセージに対する処理をスクリプト(Coffee Script)で記述することでお手軽にbotが作れます。 結構古い気がするので新しくてもっと良いやつ無いかなと思ってググってもあまり見つけられなかったので、選びました。

VPSを持っていないので、botはHerokuで動かしています。 HerokuはPaaSと呼ばれるやつで、プログラムをデプロイすると動かしてくれるやつです。 Githubリポジトリを作ってそれをHerokuにpushするとよしなにやってくれます。 今回はGithubにプライベートリポジトリを立ててHubotのプログラムを置いています。

当初、Google App Scriptを検討していて色々やってましたが、実装当時はTrelloの連携が上手く行かずに諦めました。

(参考:https://qiita.com/Andysumi/items/462964bd8249beb067e4 )

今はどうやら上手くいきそうな雰囲気が出てます。

2018/3/3追記:Google App Scriptで再実装し直したら今度は上手く行きました。公開範囲を匿名を含むを選択してなかったせいでWebhookが受け取れずにつまづきました。

Trelloとの連携

Trelloはカンバン形式のタスク管理ツールで、前述の通り完了したタスクをDoneリストに入れています。

f:id:jackale:20180210181838j:plain
Trelloのイメージ図

TrelloにはWebhookの機能があって、カードを移動したり削除したりなどのアクションを行うと特定のURLにPOSTリクエストを送ってもらう事ができます。 連携の仕方は↓を参考にしました。

https://qiita.com/Andysumi/items/462964bd8249beb067e4

HubotはExpressというWebフレームワークを利用していて、自前でサーバーが動いているので下記みたいな感じでリクエストを受け付ける事が可能です。

   # 初回登録のHEADリクエスト用
    robot.router.head '/hubot/trello', (request, response) ->
        response.send "HEAD"

    # Webhookの受け先
    robot.router.post '/hubot/trello', (request, response) ->
        action = request.body.action
        unless check action
            return response.send "NG"
        card_name = action.data.card.name
        msg = makeMessage card_name

        sendMessage msg
        response.send "OK"

robot.router.{メソッド名}で、指定したメソッドのリクエストを受けた時の挙動を定義できます。ここら辺はexpressの機能になります。

Trelloは初めにHEADリクエストを受ける必要があるので、適当に何かを返す関数を定義しておきます。 Google App Scriptはここの処理が上手くできてなくて死んでました。

WebhookはPOSTで来るので、robot.router.postに目的の処理を書きます。 やってる事としては、Webhookで来るリクエストをチェックしてノイズは弾いて、問題なければメッセージを生成してSlackにメッセージを送るだけです。 公式のドキュメントにパラメータの説明が特に無かったので、リクエストを受け取りながらパラメータは確認しました。

 

メッセージ

Slackは画像のURLを貼ると自動で展開してくれるので、るるてあさんのTwitterの画像のURLをくっつけて送りつけてます。こんな感じです。

f:id:jackale:20171203235938p:plain

URLは適当にファイルに羅列しておいて、そこから抽選します。汎用的な「えらい!」と条件付きな「土曜日なのにえらい!」みたいなタイプがあるので、条件付きの場合は条件に合致したら使うようにしてます。(間違ってくる事があって実装ミスってるのだけど面倒で直してません)

同じURL連投すると展開されないので、ハッシュを後ろにつけるとかしないといけませんが、今の所困ってないので何もしてないです。

まとめ

コウペンちゃんが可愛いので、タスクを完了しようというモチベアップにはなりました。あとタスクをちゃんとDoneリストに移動する習慣づけにもなったかと。 ただ、Doneリストに移動した瞬間にコウペンちゃんからメッセージが届くので機械的な感じが否めないのでどうにか解消したいです。

あまりに酷いのでそのうち書き直します。 >> 書き直しました。

明日(今日)は@gurapomuくんで、「リアルお料理対決をした話」です。