last update: 2016/03/30

2016/03/30

horensoのSlack reporterを書いた

すっかり季節は年度末ですね〜。なんと明後日には新年度で新入社員が入社してくるぞ!! ということで新卒研修の準備に追われてる今日この頃ですが、みなさまいかがお過ごしでしょうか。

さて、研修準備も長々やると疲れてくるのでちょっと現実逃避に…というわけではないんですが、最近horensoというGoogleじゃないほうのcronなどでコマンドをwrapして成功失敗の通知を仕組み化するツール(詳しくは作者のSongmuさんのブログをご参照ください)用にSlack Reporterを書きました。ちなみにGoogleのhorensoは漢字入力システムです。

で、きっと今どきのWeb系の会社はSlack使ってるところ多いし、社内の各プロジェクトで汎用的に使えるように作ったから勢いよく全世界に公開しておくか〜と思った次第なので、この記事を(現実逃避に)書いてます。この前とある勉強会に行ったときも自席から前側の人たちのMacでSlackっぽい画面が出てる率がだいぶ高かったのですごい浸透してるんだなぁと驚きました。

このSlack Reporterはperl製です。Perlの標準モジュールしばりで書いたので、Perl 5.14以降であれば基本的に追加のCPANモジュール無しで動きます(Perl 5.12以前を使ってる人はJSON::PPをインストールしてください)。SlackのAPIを呼ぶ以上HTTPS通信が必要なんですが、そこはcurlコマンドを使っていますのでcurlの入ったLinuxシステムになっている必要があります(BSD系はちょっとわかりません)。

ということでこちらです: https://gist.github.com/acidlemon/f8faacd20e575fff05cf67a254ab6bc7

horensoがrepoterを呼び出すときにはとくにカスタムオプションみたいなのを渡す機能はないので、reporterのオプションは外部から環境変数で与えています。実際の利用シーンでは以下のようなスクリプトを書いてcronでスクリプトを呼ぶようにしてhorensoから実行ジョブを呼び出すことになるので、環境変数で十分でしょう。

#!/bin/sh
export PATH=/opt/perl-5.20.2/bin:/home/app/bin:/usr/local/bin:$PATH

cd /path/to/project

export SLACK_ENDPOINT="https://hooks.slack.com/services/T0XXXXXX/B0XXXXX/XXXXXX"
export SLACK_USERNAME="おしらせBOT"
export SLACK_ICON_EMOJI=":cop:"
export SLACK_CHANNEL="#my-project"
export SLACK_MENTION="@acidlemon"
export SLACK_MUTE_ON_NORMAL=1
export SLACK_PASTEBIN_CMD="my-pastebin"

exec horenso -r script/cron/slack_reporter.pl -- \
    setlock -Xn /var/tmp/my-cron-job.lock \
    carton exec perl  script/cron/my-cron-job.pl

cronで頻繁にまわすやつだと二重実行されないようにsetlockを併用するパターンになりますが、その時はhorensoとsetlockのどっちを外側にするか? みたいな話を考えることになります。上記は「普通は次の実行までに終わってるはずだからsetlockが二重実行でエラーになったときは異常なので知りたい」というのをhorensoで拾うというパターンの例になっています。逆に「カジュアルによくsetlockで実行を1回スキップすることあるわ〜」というときはsetlockを外側にして内側でhorensoを実行すればよいですね。

以下は簡単な環境変数の説明です。ENDPOINT以外は省略可能です。

SLACK_ENDPOINT

Incoming WebhookのエンドポイントURLを指定してください(必須です)。

SLACK_USERNAME

Slackで通知してくるBOTのユーザ名です。未指定の場合slackbotになります。

SLACK_CHANNEL

Slackの通知先チャンネルです。未指定の場合は勇敢にも#generalに投げちゃいます。

SLACK_MENTION

horensoで通知するときにmention飛ばしたいアカウントを書きます。複数指定したいときは"@acidlemon @fujiwara"のようにスペース区切りで書いておけばよいです。未指定の場合にはなにも起きません。

SLACK_MUTE_ON_NORMAL

正常終了のときは通知いらないよ! という場合は1を指定してください。たとえば2分に1回走るから正常終了で通知したらエラいことになるけど、失敗したのは知りたいというときに使います。未指定の場合は成功失敗関係なくSlackに実行結果情報を送ります。

SLACK_PASTEBIN_CMD

ここになんか外部コマンドを指定しておくと、horensoからもらったコマンドの出力(標準出力と標準エラー出力をマージしたもの)を指定したコマンドの標準入力に渡して外部コマンドを呼び出します。で、外部コマンドの出力をSlackに送るメッセージに含めます。指定しなかった場合はSlackに直接horensoで実行したコマンドの出力を送ります。

ざっくりいうと、horensoで実行したコマンドの出力がとても長い場合に、pastebin的なところに貼り付けておいて、SlackにはそのpastebinのURLをショートカットとして送りたい、という時に使います。という説明で通じるでしょうか!!

という感じです。なお、horensoには大量の出力を吐くとhorensoプロセスが残ってしまうというバグがあることが分かったのですが、今日修正のPRがマージされたのでこちらがリリースされてから本番投入するのがオススメという感じになっています。よろしくおねがいします🙏

Comment

2015/10/12

れもんの服しわしわ問題

ここ数年(正確には3年半前に転職してから)、ずっとぼくの心の中にモヤモヤとしていて人生の残タスクに積んであった問題がありました。それが、「れもんの服しわしわ問題」です。

どういう問題かいうと、読んで字のごとくぼくの着てる服がしわしわしてるという問題です。じゃあ転職する前は大丈夫だったのかというと、北海道で勤めていたころは普通にスーツ着てたので、ワイシャツは毎回クリーニングに出してるからしわしわになってないし、ネクタイも適切な間隔でクリーニングに出してたのでしわしわになることはありませんでした。もちろんスーツもです。スーツはオーダーメイドで作ってたからサイズがぴったりなのでしわしわになりづらいという面もあったのかな。え、休日? ちょっとしわしわの服着てました。

それはさておき! 転職してからは私服通勤でOKということでウェーイウェーイみたいな感じだったのですが、昨年あたりから「あれこの服しわしわだなぁ」みたいなことがちょっと気になるようになりはじめました。

しわしわ状態
これが一番ひどかった服なんですがこんな感じでしわしわになっておりまして…

「まぁでも服がしわしわになるのはしかたないよね! ちゃんと洗ってぱんぱんっと干してもしわしわになる部分があるのはしかたねーわ! 」って思ってやり過ごしてたのですが、最近服を買いに行ったときに「あ! 本来あの服(家にある似た素材の服)ってこんなにピシッとしてたのか〜」ということに気付いてしまい、こりゃしわしわの服も泣いてるな〜ということに気付いたオレはついに立ち上がった!! というわけです。

アイロン一式ゲット

で、どうしたかっていうと、アイロンを入手しました。

オイオイオイオイお前10年以上一人暮らししてるのにアイロンも持ってなかったのかよー!! って感じですが、男の一人暮らしってわりとそういうものなんですよね〜(たぶん)。というかアイロンの存在を忘れてたんだけど、先日実家帰ったときに布団を押し入れに入れようとしたら押し入れからアイロン台が降ってきてアイロンの存在を思い出したというわけなのさ!

アイロンがないってことはアイロン台もないって事なんですが、とりあえずごっついアイロン台をいきなり買うとなんか後悔しそうな雰囲気があったので、アイロンマット(アルミの布地になってるやつ)を買ってきてアイロンをかける準備はバッチリだ! …というのが先月の話です。この時点で「服しわしわ問題をなんとかする」という人生の残タスクはタスクばらしされて「しわしわの服にアイロンをかける」という粒度まで細かくなりました。すばらしい。

しかし人生の残タスクというのはそうそうプライオリティが高くないため、アイロン一式用意して結局使わないみたいになるのがいつものパターンです。そこで、もうちょっとやる気がでるようにもうちょっとお金を使うことにしました。

結局やる気がでるかどうかっていうのはそれに対してどんだけお金払ったかみたいなところがあるじゃないですか。「これだけお金払ったんだからあとには引けない」みたいなやつね。まぁそういうのがあるから詐欺とかが成立しちゃったりするんですが、まぁ今回は自分にやる気を出させるために金を使うっていう感じなのでまぁ悪くないかなと思います。コレ書きながらそれなら最初からごっついアイロン台買えよみたいな気がしてきてるけどそれは置いておきましょう。

やるき出すためにリネンウォーターも作った

で、何に追加投資したかというと、リネンウォーターです。アイロンかけるときにはスチームとか霧吹きとか使いますが、あれを精油をちょっと入れたいい感じの水にしておくとアイロンかけるときにアロマ〜な気分になるのでだいぶやる気出そうだな〜というわけです。しかもリネンウォーターには抗菌効果とかもあるっぽいよ!(ググりました)

リネンウォーターはどうやらできあがり品を買ってくるより自分で作った方がオトクらしいので、この3連休で無水エタノールと精製水と無印のエッセンシャルオイル(精油)を買いに行きまして、ラベンダー2に対してスウィートオレンジ1の割合でリネンウォーターを作りました。具体的には無水エタノール5mlにラベンダー7滴、スウィートオレンジ3滴を入れてちゃんと混ぜ、そこに精製水50mlくらいを入れてしっかり混ぜたらできあがりです。

もうここまで来ればやる気も十分! アイロンをかけるだけ!!

実際にアイロンかけ始めると最初ちょっと苦労しましたが、一応中学高校と家庭科の成績は5だったので勘も取り戻してきて「あーやっぱこれまっすぐな机じゃなくてちゃんとした曲面のあるアイロン台のほうが肩とかの処理がめっちゃ楽そうだわー」みたいな感じになりました。まぁできる範囲でしわしわ解消していけばいいよね! と自分に言い聞かせつつ一心不乱にアイロンをかけまくりました。

アイロン掛け=リファクタリングじゃね?

実際アイロンかけ始めるとしわしわだった服がどんどんキレイにピーンとしてきて「わーこれ楽しい〜」となるのですごく楽しくなってきます。「この楽しさ…なんかどこかで経験したことがあるような気がするんだけどなぁ」と思いつつずーっと考えてて気付きました。「これリファクタリングと同じや!!!」

リファクタリングってなんぞやという人のために簡単に説明すると、プログラマーが後先考えずにゴリゴリソースコードを書くと大体見通しの悪いソースコードが出来上がるんですが、それを機能とかを変えずにキレイに書き直すのがリファクタリングです。デザイナーの人にはPSDの見た目を変えずにレイヤーとかパスとかを整理する作業と思ってもらえば大体分かってもらえるかと思います。ぼくそういうリファクタリング大好きなんですよねぇ。パズルみたいで。

さて話が脱線しましたが、そんなわけでずっと気になってたれもんの服しわしわ問題がなんとなく解決の目処が見えたのでいい3連休だったなぁ〜という日記でした。えーとじゃあ…最後にどのぐらいしわしわだったのがピーンとしたのかを…画像でお届けして終わりにしましょうか…。

伸ばし中
表と裏から頑張ってアイロンかけてほぐしてのばして…

ピーン状態
ここまでやればとりあえず着てて恥ずかしくないはず!

ハイ。そんなわけで自分でリネンウォーター作ってアイロンかけるの楽しいよって話でした。

Comment