last update: 2016/12/11

2016/12/10

YAPC::Hokkaido 2016で札幌に来ています (行くのが大変編)

なんか3月以来ブログを書いていなかったようですが、何事もなかったかのように書きます。

今日は奇しくもぼくの誕生日なんですがそれはおいておいて、タイトル通り札幌で今日やってるYAPC::Hokkaido 2016に来ています。昨年のビックサイトのラストYAPC::Asiaには行かなかったので2年ぶりのYAPCです。

さて、12月に北海道に行くというのは冗談でも何でも無く通常に比べると飛行機が飛ぶ確率がだいぶ低いです。実際ぼくは4年前に上京した最初の年の年末帰省に失敗しています(欠航&振替は元旦以降で断念)。そんなこともあり12月の北海道でYAPCとかマジ飛行機飛ぶかわかんねーし近づかないのが得策…という気持ちだったんですが、941さんが有志でさくらインターネットさんの石狩データセンターを見学する会を催していたので「これは行きたい!」ということで天候に不安しかない感じですが、YAPCに行くことにしました。

ということで、今札幌にいるわけですが、ニュースになっているとおり金曜日札幌は大雪に見舞われております。私は昨日札幌に来ましたが、来るのがだいぶ辛かった感じでした。YAPC自体の感想ブログはまた別途書くとして、せっかくなので久々に苦労した移動の記録をメモっておこうと思います。

元の旅程はANA59便 羽田10:00→新千歳11:35でした。この日の飛行機は朝からぜんぶ天候調査と条件付き運航がついていて、なんかあったときに備えてちょっと早めにいくかーということで8時すぎに家を出ました。1時間ちょっとで着くので電車で前を飛ぶ便の様子とかを調べていたら、機材繰りがつかないため10時の便が欠航というプッシュ通知が来ました。

マジカーコレは困ったなーと思いつつ、ある程度予想通りですし欠航になるのは何度か経験してるので冷静に1つ後ろの便に振替して電車で様子見していました。すると、よく見ると1個前の9時半の飛行機が30分ディレイになってるようで、これは早めたほうがいいなーということで空港に着いて保安検査が締め切りになってないことを確認してから9時半の便に振り替え直して保安検査を通過しました。この時点では結果的に10時に出発ということで遅れなし! の予定でした。

で、10時になったわけですがなかなか搭乗がはじまらない。この時点で先を行く飛行機が新千歳上空で旋回して滑走路待ちして降りたみたいな情報がTwitterで流れてきたのでまぁゆっくり待つかーという気持ちになってきました。結局しばらーく待って搭乗が完了したのは10:40でした。さて離陸だー、着く予定は12:15だー、集合時間が14:20なのでこれならまだギリギリSAMAでスープカレー食べる時間あるかなーと思ってたのですが、11時半すぎに機長のアナウンスがありました。

この時点でSAMAはムリだなーという感じになったので逆にすがすがしい気分になって飛行機で原稿書く仕事をしてたんですが、12時半になってさらに旋回時間が追加されました。

結局着陸態勢に入ったのが12:50、着陸が13:10ということで、最初の予定より1時間半遅れの着陸となりました。で、ここから駐機場に向かい、それでようやく降りれるという感じなのですが、除雪が間に合ってない関係で駐機場に向かう途中に滑走路を横切る必要が出てきて待ち時間が多くなっていつもよりもだいぶ時間がかかりました。

ここで決断のときがやってきたわけです。集合場所の麻生駅に最速でいく方法を調べるとどうみても遅刻確定~という感じだったんですが、電車と地下鉄の時間を1本ずつ調べていくと、飛行機降りたら空港の中をダッシュして13時半の快速エアポートに飛び乗り、札幌駅でダッシュして地下鉄に乗ればギリギリ間に合う(2分遅刻で済む)という綱渡り乗り換えが出来そうだったので、これをやってみることにしました。

飛行機から実際に出たのが13:24で、ここから通路を早足で人を避けつつ到着口まで移動して、そこから一直線にJRにダッシュしたらギリギリで13:30のJRに乗れました。新千歳はひどい雪だったようですが、幸い札幌方面はまだ大した雪降ってない感じだったのでJRも遅れずに済んで、無事札幌駅の乗り換えも成功。正直な所飛行機降りてからJRまで向かってる間は「もしコレで遅れてもオレベスト尽くしたからまぁ悔いはないよなぁ」と思いながら走ってました。

そんなわけで、念願叶って無事集合できたのでさくらインターネットの石狩DC見学をしてきました。

データセンターは資料とかでは見たことありましたが、実物は見たことが初めて。5年前まではNEC系の会社でx86サーバのExpress5800の開発に携わっていたので、ラックマウントサーバーやブレードサーバーはいやになるほど見て触ったことがありましたが、開発機なのでいろいろと製品版と違う物です。なので、サーバルームでキレイな製品が整然とラックにマウントされてる様子は個人的にグッとくるものがありました。12VのHVDCが実際に動いてるのとか見ると「おおー」という感じでしたね。

あとは石狩DCといえば直接外気冷房で、実際にここから空気を取り込んでるんですよーというところも見せてもらったんですが、屋根とか雪よけとかはあるけど基本的にそのまま屋外なので普通に寒かったです。さすがに0度の空気をサーバ室に直接入れるわけにはいかないのでサーバの排気の一部を前室で外気に混ぜて、湿度を調整した上でサーバ室に送ってるとのことです。実際にその空気浴びてみましたが、ちょうどよい温度まで暖まっていてやはりちゃんと空調制御されたサーバ室は快適…という感じでした。

そんなわけで、なんとかかんとか無事YAPCに来ています。週末天気がずっと悪い雰囲気で、明日の帰りもだいぶ思いやられておりますが、なんとか無事月曜日に出社できるよう頑張りたいと思います(という出社できないフラグをたてました)。

Comment

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