Bot に発言させる Slack のメッセージをお洒落にするのが若干の沼。

概要

git push したらブログが更新されるようにしたのだけど、Slack に投げてた通知が味気ないなと思い、お洒落にしようとしたら沼だった。

Before:

Before

After:

After

詳細

と言っても公式ドキュメントを見るのが一番良い。

知見としては

  • 絵文字で手軽にお洒落になる。

  • "attachments" の中の "fields""short": true で要素を放り込むとお洒落になる。

  • 面倒臭がらずにリンクを張るようにするとお洒落になる。

  • 細かい要素 ("author_name" とか "author_icon" とか) を面倒臭がらずに入れるとお洒落になる。

シェルスクリプト小ネタ

なんか結局シェルスクリプトで色々実装してしまったので微妙な知見が貯まった。

SHA-1 の 40 文字から先頭 7 文字だけ取り出す。

  • cut コマンドを使う。
  • bash の変数展開を使う。

あたりが考えられる。

#!/usr/bin/env bash

REVISION="0123456789abcdef0123456789abcdef01234567"

echo "${REVISION:0:7}" # 0123456

echo "$REVISION" | cut -c 1-7 # 0123456

パイプで繋げて cut コマンドを立ち上げるよりは bash 依存の変数展開の方が速そうではあるけど、経験的に変数展開を駆使すると未来の自分が読めなくなることを知っているのでやめた。

どんな環境でも絶対に JST で日付を出力したい。

TZ を指定しつつ起動してやれば良い。

TZ='JST-09:00' date '+%Y/%-m/%-d %-H:%M:%S %Z' # 2018/5/10 1:49:00 JST

alpine 等の環境で tzdata が入ってないような場合でも 'JST-09:00' と指定すれば意図した通りの挙動になる。

重たいコマンドを実行した場合の経過秒数を出したいけど別に精度は要らない。

date コマンドで UNIX time を保持しておけば引き算で出せる。

#!/usr/bin/env bash

BEGIN_UNIX_TIME=$(date '+%s')
function elapsed_sec() {
    CURRENT=$(date '+%s')
    ELAPSED=$(( $CURRENT - $BEGIN_UNIX_TIME ))
    echo "$ELAPSED"
}

sleep 10
echo "$(elapsed_sec) sec" # 10 sec
sleep 5
echo "$(elapsed_sec) sec" # 15 sec

time コマンドでも実行時間は測れるけど、別にそういう正確な情報が欲しい訳じゃなくて、ステップ毎に「何秒経過しました」みたいなのを雑に出すにはこういうのもあるかなと。あと、そもそも bash 組み込みの time は単純に扱い辛い。

しかしこの辺まで来ると段々気が狂ってきて「expr コマンドより $(( )) の二重括弧の方が速いっしょ」みたいな気持ちで実装しがちになる。別にループ内で使う訳でもないから誤差の範囲になるのだけど。

締め

最初の段階で jq コマンドが便利すぎた結果、それに合わせる形で curl で API を叩いて遊ぶみたいなことしてしまって、うっかり最後までシェルスクリプトで実装してしまったみたいな話でした。