HappyGoLucky

Web系サーバーサイド寄りの自動化大好きエンジニアの徒然なるブログ

2018年を振り返って

なんで振り返るのか

2017/09 に SIer から ベンチャー企業のエンジニアになり、2018年はそのベンチャー企業で過ごした1年だった。
大きくまとめると楽しくハッピーな1年だったが、なにかを成し遂げられたかというと、そうでもない1年でもあった。
また消化不良な感覚があって、その感覚を具体化したくてこの記事を書こうと思った。

1月

娘が生まれた。前日は大雪だった。里帰りしている妻と電話で、こんな雪の日に出産になったら大変だね、と話していた翌朝に娘が生まれた。フラグにも程がある。

あれこれと相談した結果、妻が娘を連れて戻るのはゴールデンウィーク前となった。
言い換えると、私が私のために時間を自由に使えるのは4月末までということだと思った。

2月

いずれ自分の時間が制限されるなら、限られた時間を最大限に活用する必要がある。なので生産性にこだわって仕事をすることにした。
当時、タスクはすべて見積もりポーカーでポイントをつけていたので、Sprintごとに消化できたポイント数を増やすことに拘った。

先に書くと、これは失敗だった。
消化したポイント数を意識すると、ポイント効率をどうしても考えてしまう。つまり、同じポイントなら(自分なら)短時間で完了できるものを優先してしまった。もちろん、Sprintごとにやるべきタスクと優先度は決まっているのだけど、そのタスクが終わって空き時間ができると、ポイントを効率よく稼げるタスクを進めてしまいがちになった。
結果、自分にとってチャレンジングなタスクには手を出さなかったので、何の勉強にもならなかった。経験を食いつぶしているだけなので、消化できたポイント数がいくら増えたところで、自分の成長を実感することはなかった。
この結論に気づいたのが4月で、以降は消化ポイント数を意識するのをやめた。

3月

作業効率性を上げるために hub コマンドを活用し始めた。具体的には プルリクエストの作成は hub コマンドで行うようになった。今でもそう。他の機能は使ってない。

社内勉強会を開催した。Ruby on Rails 製の OSSソースコードを読んで「なんだコレ」する会。題材はGitLabにした。新規メンバーが増えたこともあり、コミュニケーションを取ることも兼ねて数回行った。
今では自然消滅したが、またきっかけがあれば開催しようと思っている。

この月はまだポイント消化数に拘っていたので、結果、ベストスコアを叩き出した。

4月

esa に日報をつけていたのだが、日に日に内容が薄れていることを自覚してもやもやしていた。
仕様の検討や実装で分かった点・気になった点などをメモしたいけど、いちいち esa を開いてまとめながら作業するのも面倒だし、後から思い出しながらまとめるのはもっと面倒だったので、Slackに times-yasuhiroki チャンネルを作って分報を始めることにした。分報で雑にメモして、そのメモを日報にまとめるスタイルにした。 分報で悩みをボヤくとアドバイスをもらえたり、なんでもないような呟きにツッコミがもらえたりと有益だった。
分報は今でも、当時ほどの量はないが続けている。

4月末に妻と娘が戻ってきた。
生活が一変した。

5月

生産量が目に見えて減った。そもそも出社時間が短くなったし、自宅で仕事する時間も激減した。勉強する時間はほぼゼロになった。 ただ、自分の時間が減ったのは確かだが、それでも時間が全くないわけじゃなかった。平日は夜にアニメを観る時間はあったし、休日は昼寝をする時間があった。要するに時間の使い方の問題なのだけど、アニメも昼寝も削る気にはなれなかった。

この頃、システムの小規模なリアーキを行った。それまで Rails の SuckerPunch で行っていた非同期を AWS SQS で Message にして ElasticBeanstalk の Worker で処理するように変更した。非同期処理は SQS 経由で行うシステム構成へ変更する足がかりとなった。この実装は少々時間がかかったが楽しかった。
現状の問題を解決する新しい仕組みを検討・導入するのは楽しい。

また、サービスの使われ方の調査やKPI測定のために Jupyter を使い始めた。pandas はすごく便利。

6月

AWS Summit の Startup 向けコーナーで 15分の発表をした。内容はAWSリソースの構成管理をテーマに、CloudFormation の CI/CD を考えるもの。 CIで使えるツールの例として cfn-lint を紹介したのだけど、発表した後に聞いたセッションで cfn-python-lint の存在を知り「マジかよ...」と悲しい思いをした。すぐにインストールして、やがて vimale.vim で動くように対応して Qiitaに記事 も書いた。

この頃から、たまにリモートワークをするようになった。仕事に集中できるかどうかは、タスクと家庭状況によってまちまち。少なくとも仕事の方は、仕様が決まっていると作業が捗りやすく、一方で、相談が必要な作業は滞りがちだった。
もともと、口頭のやり取りで仕様を相談しその結論が文章化されるのはプルリクになってから、という傾向が強かったので、リモートに対応するには情報共有の文化の面で課題があった。

このリモートワークにおける情報共有の課題は少しずつ改善されている。特に GitHub で仕様を議論するルールになったことで情報共有漏れは解消された。
一方で、リモートワークしている人がどういう状況か見えない問題もあって、私はなるべくSlackで発言したりリアクションすることで「オンラインですよ」アピールをしているのだけど、そのせいで作業に集中できていない面もある。ビデオチャットを垂れ流すのが良いのかなーとは思うけど、自主的にならともかく、ルール化すると女性がノーメイクでラフにリモートワークしづらくなるのでは、などと余計なことを心配したりしている。余計なお世話な自覚はある。

7月

ebisu.rb に参加し、RubyRailsのキャッチアップが全くできていないことを思い知り、週刊Railsウォッチを読むことにした。

Androidのタスクを少しずつ進めることにした。業務経験はあったがほとんど忘れているので、簡単な機能やバグ修正だけ手伝う感じ。今でも同じ距離感で開発に参加していて、GCMからFCMに乗り換えなど、サービスの機能とは少し離れた部分にコミットしている。

また、リモートワークにて情報共有漏れによる時間ロスが発生し、対策として毎朝 slack でその日の作業予定を報告する運用を始めた。これは今も続いているが、若干、形骸化しているので、有効活用する仕組みを考えるか、廃止を含めて考え直すかしたい。

8月

体調が芳しくなく、長期休暇もあって生産量が大きく減った。開発以外のタスクばかり進めて何も生み出していないような気分になっていたが、後半は持ち直したような気もする。

9月

8月と打って変わって生産的だった。CSの仕組みを変更して自動化したり、 go でごにょごにょしたり、Ruby正規表現を調べてLTしたりした。

久々に飲みすぎて視界が真っ白になった。なんとか帰宅できたが、いろいろとギリギリだった。

10月

かなりレジェンドな感じだったある実装がいよいよ限界なのでリファクタを始めた。このリファクタは気に入っていて、リファクタの規模を抑えつつ、スケールしやすくエラー時の検知も分かりやすくリトライ可能な実装になったので嬉しい。ただし妥協点もあって、この妥協点がいずれ負債になる未来も見えている。

NHK筋肉体操を始めた。今も続けている。二期があるとのことで楽しみにしている。

11月

サービスの課題や新機能の効果測定のためにデータを調べる機会が増えた。別に依頼されたわけじゃなくて、自分が気になるから調べていたのだけど、もっと早くからこの習慣を身に着けておけば良かったと思っている。

Ebisu.rb で rb コマンドについて発表してきた。スライド無しで README に書いておいたコマンドを実行しながら説明する実演スタイルで発表したが、そこそこ良い反応が得られてよかった。個人的にも楽しかったので、実演スタイルの発表は今後も挑戦してみたい。

VimConf2018 に行ってきた。最高だった。最高に最高だった。

12月

AWSのキャッチアップがまるでできていないと気づいたので、 AWS Black Belt Online Seminar を聞くことにした。1時間でたっぷり情報が得られてとても良い。継続的に視聴していきたい。
CircleCI のハッカソンに参加して reviewdog 用の orb を作った。こういう成果物が残るのは良い。

年末に体調を崩した。もともと私は年に一度、冬の季節に高熱を出す習慣があるんだけど、今年は吐き気もして最悪だった。結局年明けまで回復しきらず、散々な年末年始だった。

まとめ

月ごとに振り返りながら思ったことをリスト化

  • インプットが足りていない
    • 年末に意識し始めたけど、インプットが足りてない
    • 時間というよりインプットの質の問題な気もする
  • アウトプットが足りていない
    • せっかく読んだ本・スライドの内容をアウトプットしていないので自分の血肉なった感覚がない
    • コンテンツのように消化しておしまいな傾向があるので改めたい
  • 短い期間でふりかえりしたい
    • 意外とやってたり、やってなかったりすることに気づける

VimConf2018 に行ってきた

行ってきました。最高でした。来年も行きたい。 スタッフの皆様お疲れ様でした。VimConfをたっぷり満喫できたと思います。

以下、感想メインでつらつらと。

LINK

VimConf2018 Official: VimConf 2018
スライドのリスト: VimConf 2018 – VimConf official blog

チケット

販売開始時刻にリマインダーセットして速攻買った。個人スポンサーも買った。
もともとmattnさんの発表が聞けるなら買わねば...と思っていたが、Bramさんが来日するとなればそりゃリマインダーセットするよね。
個人スポンサーも買ったのは、応援の意を込めて。

予習

vimconf2018.swp で、Bramさんのvim25周年時の動画があると知ったので見ておいた。

Vim 25 presentation by Bram Moolenaar on 2016 November 2 - YouTube

この動画は Vimの 25年の歴史を振り返る内容で、同時に Bramさんの歴史を振り返るものでもあって、私の中で、今まで雲の上の未確認な存在だったBramさんが、雲の上だけど存在ははっきり分かった存在に変わって、すごく良かった。
また、動画にはBramさん本人は映ってなくて、これがかえって、VimConf2018で本人に会える楽しみを増幅させてた。あの声の主に会える、みたいな。

Keynote 1

まずは mattn さんのキーノート。

vim-jp の話とNew Featureの話。
vim-jp によって日本の vimmer の知見が蓄積されていくのは本当に良い話。
New Feature の話では、VimScriptでNUL文字を扱えないことを説明するために、実際に Vim を開いてコマンドを入力して見せてもらえたのが最高だった。このライブ感がたまらない。

Keynote 2

そして Bramさんのキーノート。
最高だった。

Plugin のために今までどういうことをしてきて、これからどういうことをしようと思っているかの話。
Autocommand を追加し (Vim 4.0) Vim script を追加し (Vim 5.0) Plugin の概念を追加し (Vim 6.0) パフォーマンスに懸念が出たので autoload を追加し (Vim 7.0) 将来的にはマルチスレッドやpycのような中間言語コンパイルするのが良いかもしれない、という感じ。
そして Plugin Manager の提案。個人的には、プラグイン管理はvim本体で持たなくても良いのではという気持ち。
あとはアンケートを取ってみたら、popup window と store properties with text の要望が多かったとのこと。properties は plugin 作ってる人たちからするとめちゃめちゃ欲しいだろうな、と聞いてて思った。
LSP は Bramさん的にはあんまりな感じだったけど、Vim が LSP に対応したらアツイ。LSP がプログラミング言語界隈でどれくらい浸透しているのかよく知らないけど、考え方は好きなので広まって欲しい。Vimが対応することでよりLSPの輪が広がると思う。

いやー。最高だった。

お昼

すきやき弁当がうまかった。
すきを見てBramさんと握手した。Vimが好きだとひたすら言った。幸せだ...。

午後

ほぼぶっ通しで発表を聞き続ける。スライド見続けるのでめちゃめちゃ目がしょぼしょぼした。目薬持ってくれば良かった。 発表の中では、 :Termdebug がインパクトあった。GDB使ったことなかったので使い方のデモとしても面白かったし、それが vim の中で完結されていたのが良かった。まさに vim を開発するための vim という感じ。
今どきのプラグインの作り方も良かった。スライドも発表も分かりやすい。Vital.vim で job/channel を Promise ぽく扱えるようになるのは良い。使ってみたい。
あとは vim の標準の補完機能もうちょっと使い込んでみたくなったなあー。<C-n> しか使ってないからなぁ。とりあえず dict は有効にした。
来年はLT出てみたい。何がいいかなぁ。

懇親会

英語で話す機会があった。これが国際カンファレンス...!
なんでVimを使ってるんだ、という話だったんだけど、私がVimを使うきっかけはEmacs使いの先輩への対抗心で、それを英語で伝えられたかというと伝えられていない。まず先輩を英語で何ていうか分からなかったのでFriendって言った時点でもう間違ってる。むずかしいなー。
というか、Vim自身に理由がないので説明しても面白くなくて、代わりにVimを使い続けている理由を話せば良かったのではと帰宅中に思った。
ちなみに相手の方は左手の小指が内側に曲がっていて、この指じゃEmacsは使えないだろ? みたいな話だった。まさかそんなパターンがあるとは...。
あと、Vim を tmux のように attach/detach したいという方もいた。それができれば tmux がいらなくなる、と。私は tmux + vim で満足してるのでそんな発想はなく、新鮮だった。これができるならログインシェルを /bin/sh から /usr/bin/vim にできたりするんだろうか。ちょっと違うか。
VimConf参加者のブログを読み漁ってたら、この話をしてたのってもしかして江添さんだろうか?もしそうなら、ばったり著名人と同じ輪の中で話すことがある。これが国際カンファレンス...!

家の事情があって途中で帰宅したのが残念。お酒も飲みそこねた。SAKE飲みたかった。やむなし。
また来年も参加したい。

GitHub の branch protection は force push を防いでも push は防がない

push も防ぐものだと勘違いしてた。

git push

# push できた
$ git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 407 bytes | 407.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 1 local object.
To github.com:yasuhiroki/iypymtiycaa
   98b74d8..b6eb250  master -> master

git push -f

# force push はできない
$ git push -f
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 266 bytes | 266.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote: error: GH006: Protected branch update failed for refs/heads/master.
remote: error: Cannot force-push to a protected branch
To github.com:yasuhiroki/iypymtiycaa
 ! [remote rejected] master -> master (protected branch hook declined)
error: failed to push some refs to 'git@github.com:yasuhiroki/iypymtiycaa'

slackcat で iconemoji を設定できるようにした

以前、 slackcat で Slack に分報を流すようにした。

yasuhiroki.hatenablog.com

slackcat だと投稿者のアイコンを変更できなかったので stdbuf を使って prefix を挿入していたが、よく考えたら slackcat を自分で改造して iconemoji を受け付けられるようにすれば良かった。
プルリクも出した。

github.com

ただこの実装方法だと未対応の他のオプションにも対応したくなった時、関数の引数が延々と増えてしまう未来が見える。

ひとまず、私の slack コマンドは次のようになった。
-i オプションで投稿者のアイコンを絵文字で指定できる。

#!/bin/bash

set -e

which slackcat >/dev/null || { echo "required slackcat"; exit 1; }

if [ $# -gt 0 ]; then
    echo "${*}" | slackcat -i ":yasuhiroki:" -c "${MY_SLACK_CHANNEL:-times-yasuhiroki}" -u "${MY_SLACK_USERNAME:-yasuhiroki}" --stream
else
    cat | slackcat -i ":yasuhiroki:" -c "${MY_SLACK_CHANNEL:-times-yasuhiroki}" -u "${MY_SLACK_USERNAME:-yasuhiroki}" --stream
fi

vim上で git rebase -i が動かない

解決はしたが、原因は不明。

解決方法

sequence.editor を設定する。 core.editor ではだめ。

$ git config --global sequence.editor $(which vim)

環境

  • MacBook Pro
  • iTerm2
  • zsh 5.5.1 (x86_64-apple-darwin17.5.0)
  • MacVim
    • VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 31 2018 11:39:09)
    • macOS
    • 適用済パッチ: 1-332

調査

vim 上からコマンド打って rebase できなくなった。

$ vim

Created autostash: dcc6d6b
HEAD is now at fde30be fixup! fea
/usr/local/Cellar/git/2.18.0/libexec/git-core/git-rebase--interactive: line 277: /Users/a10lab-yasuhiroki/go/src/github.com/yasuhiroki/slackcat/.git/rebase-merge/git-rebase-todo: Permission denied
Applied autostash.
Could not execute editor

.git/rebase-merge/ ディレクトリは存在しない。

$ ls .git
COMMIT_EDITMSG  ORIG_HEAD       description     index           logs/           packed-refs     tags
HEAD            config          hooks/          info/           objects/        refs/

ディレクトリを作ってみると、zshVCS_INFO が怒る。

$ mkdir .git/rebase-merge
VCS_INFO_git_getbranch:25: no such file or directory: .git/rebase-merge/head-name

とりあえず rebase してみるも失敗。

$ vim

It seems that there is already a rebase-merge directory, and
I wonder if you are in the middle of another rebase.  If that is the
case, please try
        git rebase (--continue | --abort | --skip)
If that is not the case, please
        rm -fr "/Users/a10lab-yasuhiroki/go/src/github.com/yasuhiroki/slackcat/.git/rebase-merge"
and run me again.  I am stopping in case you still have something
valuable there.

/usr/local/Cellar/git/2.18.0/libexec/git-core/git-rebase--interactive の先頭で set -xv してデバッグログ出す。

f:id:yasuhiroki:20180831114918p:plain

...前略...
++ /Users/a10lab-yasuhiroki/go/src/github.com/yasuhiroki/slackcat/.git/rebase-merge/git-rebase-todo
/usr/local/Cellar/git/2.18.0/libexec/git-core/git-rebase--interactive: line 278: /Users/a10lab-yasuhiroki/go/src/github.com/yasuhiroki/slackcat/.git/rebase-merge/git-rebase-todo: Permission denied
gettext "Could not execute editor"
++ gettext 'Could not execute editor'
++ printf %s 'Could not execute editor'
+ die_abort 'Could not execute editor'
+ apply_autostash
+ test -f /Users/a10lab-yasuhiroki/go/src/github.com/yasuhiroki/slackcat/.git/rebase-merge/autostash
+ rm -rf /Users/a10lab-yasuhiroki/go/src/github.com/yasuhiroki/slackcat/.git/rebase-merge
+ die 'Could not execute editor'
+ die_with_status 1 'Could not execute editor'
+ status=1
+ shift
+ printf '%s\n' 'Could not execute editor'
Could not execute editor
+ exit 1

シェルが値を返しました 1

続けるにはENTERを押すかコマンドを入力してください
zsh: suspended  vim

ログをあちこちねじ込んで print デバッグしてくと git var GIT_EDITOR の戻り値がおかしかった。

手元でやると、

$ git var GIT_EDITOR
/usr/local/bin/vim

vim上だと、

:!git var GIT_EDITOR
→何もなし

なんでだろう。git config で core.editor は設定済みのはずだが...。
vim上で !git config -l してもちゃんと定義されてる。

f:id:yasuhiroki:20180831115008p:plain

!git var -l すると、 GIT_EDITOR が空になってる。

f:id:yasuhiroki:20180831115014p:plain

腑に落ちないけど、 sequence.editor を設定すればそっちから読み込んでくれそうなので設定してみる。

git_sequence_editor () {
    if test -z "$GIT_SEQUENCE_EDITOR"
    then
        GIT_SEQUENCE_EDITOR="$(git config sequence.editor)"
        if [ -z "$GIT_SEQUENCE_EDITOR" ]
        then
            GIT_SEQUENCE_EDITOR="$(git var GIT_EDITOR)" || return $?
        fi
    fi
    eval "$GIT_SEQUENCE_EDITOR" '"$@"'
}
$ git config --global sequence.editor $(which vim)
$ git config --global -l | grep editor
core.editor=/usr/local/bin/vim
sequence.editor=/usr/local/bin/vim

無事動くようになった。

cookpad.apk #1 に行ってきた

2018/08/21 に開催された cookpad.apk #1 に行ってきました。 もともと社内向けのイベントとして企画していたけど、別に外部に開いても良くない? となって開催が決定したとのこと。

楽しかったし美味しかったです。

以下、メモ。

ReactNative for Android について

speakerdeck.com

新規事業にReactNativeを採用してどうだったか、という話。

ReactNativeが向いているのはどんな環境か、採用してみたメリットはどの辺か、辛いポイントはどこか、の紹介。

その場でアプリをインストールして使ってみたけど、言われなきゃ ReactNative とは思わなかったかもしれない。言われてみれば何となくWebっぽいような気もするけど気のせいな気もする。

私はどっちかというとWeb側の人間なので、JavaScript(and TypeScript) に詳しくて、Android/iOS有識者がいて、デザイナーも一緒に実装できる状態なら、ReactNative を選択するのはアリだと思う。ReactNative のマルチプラットフォーム対応の恩恵をフルに受けられる状況ならなおさら。
ただ、もしAndroid/iOSを両方に精通しているエンジニアが揃っているなら、ネイティブアプリで作った方が良いと思うし、そっちの方が理想的だとも思う。

クックパッドアプリのマルチモジュール化への取り組み

speakerdeck.com

モノリシックな状態では、新規機能が使えないしビルドが遅すぎる...モジュール化だ! ということでマルチモジュール化への取り組みについてのお話。
マルチモジュールを Feature単位で進めていった、というのが印象に残った。
たしか、Feature単位で開発チームが分かれているんだったっけ...? それなら合理的な気がする。

ML Kitでカスタムモデルを使うまで

speakerdeck.com

タイトル通り。
やってみた系の発表は自分でもやってみないと面白さが半減なので、(たぶん)口頭で紹介されてた firebase のサンプルを clone して試してみている。

まだ firebase のプロジェクトを作ったままなのでやらねば。

AndroidXとAOSP

speakerdeck.com

Support Library 改め Android X と、そのソースコードを読むために AOSP にアクセスしてみよう、あわよくばパッチを送ろう、というお話。

AOSPの見方が説明されていて、レビューの様子とかcommitのルールとかそうなってたんだなーと興味深かった。
パッチは @NonNull とか狙い目とのこと。

AOSPのソースコードは容量食うから削除したんだよな...。ノートPCを新しくする時はケチらず容量の多いタイプにしたい。

Google Playアルファリリースを自動化した話

speakerdeck.com

Google Play alpha release の自動化の話。面白い。
もともとのリリースは半自動化されていて、最後に apk を upload してリリースするところが手動だったのだけど、それも自動化したとのこと。私もそれ取り組もうと思っていたところだったので、一つの事例としてすごく参考になった。
自動リリースする際は、バージョン名をどうするかが課題だと思っていたので、懇親会で詳しくお話が聞けたのも良かった。年・週・リリース番号、みたいな機械的に取れる値でインクリメントしていく案は良さそう。

人がスケジュールを管理するのではなくてスケジュールによって人が動くようにしたい、というのはすごく共感する。
もちろん無茶なスケジュールを押し付けられて苦しむ、という意味ではなくて、定期的にリリースできる環境を作っていくという意味なので、私も目指したいなと思っている。

Google Play alpha 機能を選んだ理由 (TestLab によるモンキーテスト) や 段階リリースの良し悪しについてもお話できたので有り難かった。

FireTV ことはじめ

speakerdeck.com

FireTV全く知らないので新鮮だった。
Google開発者サービス入ってないから Firebase SDK 入れられないとは...おおお...。

Introduce Gradle Kotlin DSL

speakerdeck.com

Gradle Kotlin DSL の紹介。そんなのあったんスね...。

私はRubyistなのでどっちかというとGroovyの方が扱いやすいし好きなんだけど、Kotlinで書きたい気持ちも分かるようなそうでもないような。
実際、Kotlin で書くメリットもさほど無いようなので、これはスルーしてもいいかなぁ...と思った。

余談

お酒強くないくせにハイボール飲んだせいか、翌日から体調崩したので反省。

slackに流す分報にprefixを付けたい

分報とは

日報はその日の作業や悩みをその日の最後に書いて出すことになる。作業中の課題や考えていることが、日単位で共有されるため、他の人が目にする時には、すでにその課題は解決済みな場合がある。情報共有の時間差がどうしても発生してしまう。
そこで、ツイッターのようにその時その時の作業内容や悩みをアウトプットする取り組みとして、分報というものが活用できる。

分報の考え方や進め方は次の記事が詳しい。

c16e.com

私の分報の仕組み

私は Terminal で zshvim な開発環境なので、つぶやくなら Terminal 上で行いたい。
自社ではSlackを使っているので、TerminalからSlackに分報を送信したい。
そこで下の記事を参考に、 slackcat を活用することにした。

qiita.com

slackcat の課題

slackcat は Slack App の Token を使うので、私のアカウントで発言したことにはならず、Token を発行した Slack App が発言したことになってしまう。

f:id:yasuhiroki:20180426124002p:plain

妥協策

せめて、もう少し自分の発言っぽさを出したいので、カスタム emoji を追加したい。
下のような感じ。

f:id:yasuhiroki:20180426124123p:plain

分報を送るためのスクリプト

毎回 emoji を入力するのは面倒くさい。
また、いちいち slackcat とコマンドを入力するのも面倒くさい。

そこで、一度実行したら常に入力待ちになって、文字列を入力して改行する度に、カスタム emoji を先頭に付与して Slackに送信するスクリプトを作った。

#!/bin/bash

set -e

which slackcat >/dev/null || { echo "required slackcat"; exit 1; }

if [ $# -gt 0 ]; then
    echo "${*}" | slackcat -c "${MY_SLACK_CHANNEL:-times-yasuhiroki}" -u "${MY_SLACK_USERNAME:-yasuhiroki}" --stream
else
    cat | gstdbuf -oL gsed 's/^/:yasuhiroki: /g' | slackcat -c "${MY_SLACK_CHANNEL:-times-yasuhiroki}" -u "${MY_SLACK_USERNAME:-yasuhiroki}" --stream
fi

stdbuf で入力を行ごとにsedに渡して文頭にカスタムをemojiを追加している。
mac なので gstdbufgsed となる。 BSD版だと sed -l としないと slackcat に文字列を渡してくれない。ただ、私の環境だと日本語を入力するとエラーになるので、GNU版が必須。なんでだろ。
実装当初、BSD sed で実装していてうまくいかず悩んでいたら @eban さんが Ubuntu だとできたと教えてくださり、GNU版じゃないとダメなのだと気付いた。