🦊

yasuhirokiのターミナルライフを支える技術

2024/02/22に公開

(不定期に更新します)

はじめに

私こと @yasuhiroki が日々の開発で使っているツールや技術について紹介する記事です。

Terminal

WezTerm

iTerm2 + tmux の生活に飽きたので乗り換えて利用している。
tmux っぽいキーバインドを設定しているが、 copy_modesearch_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

sedawk よりも、 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.vimagit.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 で結果を確認する、という流れで作業することが多い。

脚注
  1. https://github.com/wez/wezterm/issues/1579 ↩︎

  2. alias asdf=mise すれば良いという説もあるけど、なんとなく良い気分がしない ↩︎ ↩︎

GitHubで編集を提案

Discussion