こんにちは。虎の穴ラボのMです。
この記事は「虎の穴ラボ夏のアドベントカレンダー」15日目の記事です。
14日目はおっくんさんによる「位置情報 AR にスマホのブラウザだけでチャレンジ」が投稿されました。
18日目は古賀さんによる「Markdownでカスタム構文が使える技術同人誌の執筆環境を作ってみた!!」が投稿されます。こちらもぜひご覧ください。
はじめに
なんてこった!サーバーでエラーが起きた!Slackで通知は来ているけど見逃していて反応が遅れた!
なんてことないでしょうか。つい業務に集中していたり、一時的に離席していたり。
個人的に一番見逃すのは、コーディングに集中していた時です。
今回はエディタしか見ていなくても気付けるように、サーバーでエラーが起きた時にエディタを真っ赤にしたいと思います。
エディタは、今回はVSCodeを使います。
やる事
- Slackのメッセージを取得
- Slack通知を感知するスクリプトを作る
- VSCodeの色を変更
- crontabに設定
Slackのメッセージを取得
サーバーエラー時にSlackに通知を飛ばしている前提で、 特定のチャンネルに投稿があった時
でイベントを拾います。
SlackのAPIの種類は複数ありますが、今回はシンプルに毎回リクエストを投げて情報を取得するWebAPI形式の、 conversations.history
を使います。
まずはAppを作成します。
SlackAppの作成
- Create New App からアプリを作成
conversations.history
に必要な権限を付与- workspaceにインストール
- メッセージを取得したいチャンネルにアプリを参加
conversations.history
に必要な権限 は、以下です
- channels:history
- groups:history
- im:history
- mpim:history
curl などで動作確認をし、チャンネル情報が返却されれば完了です。
$ curl 'https://slack.com/api/conversations.history?channel={channelID} \ -H 'Authorization: Bearer {slackToken}' { "ok": true, "messages": [ { "client_msg_id": "***", "type": "message", "text": "***", ... }, {...} ] }
Slack通知を感知するスクリプトを作る
Slack APIを実行し、サーバーエラー通知チャンネルの新着通知を取得するようにします。
$ vi serverError.pl
#!/usr/local/bin/perl use utf8; use Furl; use JSON; use URI; use DateTime; # Slack APIから未読メッセージを取得 my $epoch = DateTime->now(time_zone => 'Asia/Tokyo')->epoch - 60; my $url = URI->new('https://slack.com/api/conversations.history?channel={channelID}&oldest='.$epoch.'&limit=1'); my $furl = Furl->new( headers => ['Authorization' => 'Bearer {slackToken}'] ); my $res = $furl->get($url); my $content = $res->content; my $json = decode_json($content); my $messages = $json->{'messages'}; # 1件以上通知があるならば通知対象とする if (scalar(@$messages)) { # 通知がある場合の処理 } else { # 通知がない場合の処理 } 1;
1分以内に、サーバーエラー通知チャンネルに投稿がある場合trueに行くように判定を追加しました。
VSCodeの色を変える
VSCodeの設定ファイルは、デフォルトの場合 $HOMEのパス/Library/Application Support/Code/User/settings.json
にあります。
ここの値を切り替えます。
{ "workbench.colorTheme": "Monokai" }
現在 Monokai
を使っていますが、サーバーエラーが発生したときは Red
にしたいと思います。
my $vscode_file_path = '$HOME/Library/Application Support/Code/User/settings.json'; # 1件以上通知があるならば通知対象とする if (scalar(@$messages)) { change_setting_file("Monokai", "Red", $vscode_file_path); } else { change_setting_file("Red", "Monokai", $vscode_file_path); } sub change_setting_file { my ($find, $replace, $file) = @_; open (my $read_fh, '<', $file) or die $!; my $content = do {local $/; <$read_fh>}; close $read_fh; $content =~ s/$find/$replace/g; open (my $write_fh, '>', $file) or die $!; print $write_fh $content; close $write_fh; }
これでサーバーに通知があった場合に、エディタが赤くなるようになりました。
crontabに設定する
あとはこれをcrontabに設定して1分毎に実行できるようにすれば完了です。
* * * * * perl $HOME/serverError.pl
試してみる
サーバーにエラーが発生!
エディタの色が無事変わりました!
コーディング途中でも問答無用で変わるので絶対気付けると思います!
P.S.
虎の穴ラボでは、私たちと一緒に新しいオタク向けサービスを作る仲間を募集しています。
詳しい採用情報は以下をご覧ください。