yasuhirokiのターミナルライフを支える技術
(不定期に更新します)
はじめに
私こと @yasuhiroki が日々の開発で使っているツールや技術について紹介する記事です。
Terminal
WezTerm
iTerm2 + tmux の生活に飽きたので乗り換えて利用している。
tmux っぽいキーバインドを設定しているが、 copy_mode
と search_mode
の切り替えがまだ手に馴染んでなくて試行錯誤中。
また iTerm2 の password manager
に相当する機能がまだなくてちょっと不便。
security
コマンドから取得することができるそうなので検証予定。[1]
開発作業で扱っているリポジトリごとに Window を作って作業するのが好み。
Shell
Zsh
macOS 使っているので zsh を使っている。
zsh 固有の機能を使いこなしているわけではない。
zimfw
プラグイン管理には zimfw を使っている。zplug から乗り換えた。
主に zsh-users
のプラグインをいくつかと、オレオレ便利コマンドのインストールに使用している。
enhancd
cd
コマンドを強化してくれるツール。便利。
Editor
MacVim
気づけば Vim を使い初めてから 10年以上経っている。
Vim の :terminal
で暮らすことを毎年考えるけど、入力モード切り替えが煩わしくて使っていない。[2]
Proguraming Language
asdf
各言語のバージョン管理ツール。
今の私の業務ではそんなにバージョン管理しなくていいので、各言語の便利インストールツールという程度の使い方をしている。
mise に乗り換えるかは、 asdf
というのがタイプしやすいところが気に入りすぎていて検討を後回しにしている。[2:1]
ruby
sed
や awk
よりも、 ruby の String クラスや Enumerator クラスのメソッドを使ったほうが楽に処理できそう、と思った時に使う。
オプションは -nale
か -pale
を使うことが多い。
# -nale は 入力 ($_) を元に別の出力を作りたい時に使う
$ seq 4 | ruby -nale 'puts "=" * $_.to_i'
=
==
===
====
# -a によって $F が使えるのでぶん回したい時に便利なのでとりあえずつけとく
$ seq 4 | xargs | ruby -nale 'puts $F.map(&:to_i).sum'
10
# -pale は puts や p を書くのが面倒くさい時に使う
$ seq 4 | ruby -pale '$_ += " lines"'
1 lines
2 lines
3 lines
4 lines
Git
git alias
で次のようなショートカットを作っている。
# コマンドの短縮
alias.ri=rebase -i
alias.fp=fetch -p
alias.fixup=commit --fixup
# Branch の整理、検索
alias.poi=!git branch -D $(git branch --merged | grep -v '^*')
alias.oide=!f() { local branches branch; branches=$(git branch --sort=-authordate --all | grep -v HEAD | sort -t/ -k1,1 -s) && branch=$(echo "$branches" | fzf-tmux -d $(( 2 + $(wc -l <<< "$branches") )) +m) && git checkout $(echo "$branch" | sed "s/.* //" | sed "s#remotes/[^/]*/##"); }; f
# 正規表現で commit history から検索
alias.look=log -p -G
# commit リストを取得 (プルリクの説明文を書くときの参考にする)
alias.done=!f() { git log --pretty=format:'- [x] %s' ${1:-origin/develop}..${2:-HEAD} | awk '$0' | tac ; }; f
# プルリクエストを作成する
alias.prpr=!prpr() { local t="$(mktemp).md"; echo "PullRequest title" > "$t"; vim "$t"; local f="$(mktemp).md"; cp "$(git rev-parse --show-toplevel)/.github/PULL_REQUEST_TEMPLATE.md" "$f" || true; vim "$f"; gh pr create -w -a @me -t "$(head -n1 "${t}")" -F "${f}" ${@} ; }; prpr
# ghq get っぽいイメージの動作を gh コマンドでする
alias.get=!get() { local repo="yasuhiroki/${1:?required OWNER/REPO}"; shift 1; local dist="${repo%/*}"; dist="github.com/${dist##*/}/${repo##*/}"; gh repo clone ${repo#yasuhiroki/} ~/src/${dist} -- ${@} ; }; get
gina.vim と agit.vim
Git の操作は vim 上で行うことが多い。
:Gina status
で add して :Gina commit
して :Agit
で commit ツリーを確認する流れを毎日のように行っている。
gina.vim はそのうち gin.vim に移行しないとなぁ。
gh
GitHub のあれこれをするのに gh
を使う。
前述の git
の alias でも gh
を使っている。
gh api
が使えればだいたい何でもできる。
CLI
JSON
jq
curl や AWS CLI で JSON を扱う時はとりあえず jq
を使う。
100名分のデータ生成のためにAPIリクエストするとか、 よく使う AWS の操作をまとめて実行するとか、書き捨てスクリプトにせよCI/CD用スクリプトにせよ、 JSON は一旦 jq
で受け取っておくと楽。
覚えておくと便利な機能
# 他のコマンドで扱いやすいよう csv に変換する
$ gh api '/users/yasuhiroki' | jq -r '[.login,.html_url]|@csv'
"yasuhiroki","https://github.com/yasuhiroki"
# 2つのJSONをマージして1つのJSONにする
$ jq -s '.[0] * .[1]' <(echo '{"a": 1}') <(echo '{"b": 2}')
{
"a": 1,
"b": 2
}
jo
JSON を作る時に便利なツール。
特に他のコマンドの出力をもとにJSONを作りたい時に便利。年に2回くらい、このコマンドを覚えておいて特をしたような気がする。たぶん。
gron
JSON を grep しやすい文字列に変換するツール。
... | jq '.すごい複雑な処理'
とか ... | jq . | sed 's/すごい複雑な処理/'
などと書きそうになったら gron
を使うとシンプルになることがある。
たとえば JSON から xxx_url
な key と value のみ取り除こうとすると、
# jq でやり切ろうとすると
$ cat sample.json | jq 'walk(if type == "object" then with_entries(select(.key | contains("_url") | not)) else . end)'
# gron を使うと
$ cat a.json| gron | grep -v '_url =' | gron -u
という感じになる。
ただ、gron はアップデートされなくなって久しいので、代替ツールを探してもいいかなぁという気分ではある。
数値計算
datamash
簡単な計算や統計データを得る時は datamash を使っている。
# 平均値を求める
$ seq 10 | datamash mean 1
5.5
# issue の reaction 数をカウントする
$ gh api '/repos/rails/rails/issues' | jq -r '.[].reactions | [."+1", ."-1"] | @tsv' | datamash sum 1 sum 2
10 0
# issue につけられた label ごとの reactions数をカウントする
$ gh api '/repos/rails/rails/issues' | jq -r '.[] | {l: [.labels[].name], r: [(.reactions | ."+1", ."-1")]} | ((.l[] | [.]) + .r) | @tsv' | sort | datamash groupby 1 sum 2
With reproduction steps 0
actioncable 0
actionmailbox 0
actionmailer 0
actionpack 4
actiontext 0
actionview 3
activejob 0
activemodel 0
activerecord 0
activestorage 0
activesupport 0
attached PR 1
docs 1
railties 0
あんまり複雑になってくると Ruby で書いたり、チーム内で誰でも計算結果を得られるようにしたかったらスプレッドシートで作ることもある。
HTTP API 開発
curl
HTTP クライアント CLI は httpie とか xh など使いやすいものがって何度か触ってみたけど、HTTPリクエスト内容を自分でコントロールしたいことが度々あって curl
に戻ってきている。
curl
は昔、ドキュメントをそれなりに読んだことがあって愛着があるのも大きい。
goaccess
アクセスログ分析ツール。
API のパフォーマンスを手っ取り早く調べる時に使っている。
今どきは、DataDog など SaaS を利用して可視化するものなのかもしれない。
ab
ab こと Apache HTTP server benchmarking tool。
CLIでお手軽に負荷テストできる。
ab コマンドで負荷をかけて goaccess で結果を確認する、という流れで作業することが多い。
Discussion