Engineer All HandsのOSTセッション「開発生産性を挙げるツールTIPS共有」に参加してみた
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
先日、弊社では三浦海岸で行われたエンジニア交流のための合宿イベント「Engineer All Hands」がありました。
そのイベント中には「Open Space Technology」略して、OSTというエンジニア同士で話したいことを好きなだけ話す時間がありました。本記事ではセッション「開発生産性を挙げるツール・Tips共有」について振り返りつつ、実際にいくつかのツールについて試してみます。
エディタ・作業環境
まず、はじめにエディタと作業環境について話し合いました。
テーブルには6人ほどの方がいらっしゃいました。ほとんどの方がVS Code派で、加えて2人ほどがVS CodeにNeovimを入れて使っているという話になりました。また、VSCodeつながりでDev Containerを使ってる人も半数いました。すぐに環境構築できるし、PCの環境を汚さないからとても便利だよねと盛り上がりました。Dev Containerは筆者も業務で使用していたのですが、2023年7月20日時点ではまだプレビュー版だったということを知って驚きました。
さらに、所属によってコンテナーの運用方法も違うことが分かったのも発見でした。Docker Desktopが有料に伴い、Mac用のコンテナ―であるLimaやWindowsのWSLを使っている人がいました。
全体的に、作業環境どうやったら同じにできるかという視点が多かったです。
シェル
次は、シェルのコマンドについて話題が移りました。
話題が始まるなり、次々出てくるコマンドの数にまったくついていけない。
sed、tr、cut、awk、perl、dyff、wc、uniq、jq、yq、ghq、peco、diff、jump...
そのため、ブログにするにあたって一通り調べました。
sed
ファイルやパイプラインからの入力に対してデータ処理を行える。
例)文字の置換
blog@d3a55dccbaf4:~$ echo "Engineer All Hands" | sed 's/Engineer/Developer/' Developer All Hands
tr
文字の変換ができる。
例)半角スペースをアンダースコアに変更する。
blog@d3a55dccbaf4:~$ echo "Engineer All Hands" | tr ' ' '_' Engineer_All_Hands
awk
パターンスキャン・処理言語、複雑なテキスト操作ができる。
例)"AIl"の入ってる行を取り出す。
blog@d3a55dccbaf4:~$ echo -e "Engineer All Hands\nOpen Space Technology" | awk 'BEGIN {RS = "\n"} $2=="All"' Engineer All Hands
perl
プログラミング言語
例)単語の置換をする。
blog@91b7fb220ff0:~$ echo "Engineer All Hands" | perl -pe 's/All/Team/g' Engineer Team Hands
diff
2つのファイルやテキストの差分を表示する。
例)file1.txtとfile2.txtを比較する。
blog@d3a55dccbaf4:~$ echo "Engineer All Hands" > file1.txt blog@d3a55dccbaf4:~$ echo "Open Space Technology" > file2.txt blog@d3a55dccbaf4:~$ diff file1.txt file2.txt 1c1 < Engineer All Hands --- > Open Space Technology
cut
ファイルの各行から一部を切り取る。
例)"Engineer All Hands"から"Engineer"を抜き出す。
blog@d3a55dccbaf4:~$ echo "Engineer All Hands" | cut -d' ' -f1 Engineer
wc
行数、単語数、文字数をカウントする。
例)単語数をカウントする。
blog@d3a55dccbaf4:~$ echo "Engineer All Hands" | wc -w 3
uniq
ソートされたファイルから内容の重なった行を削除する。
例)内容の重なっている"Engineer"と"Hands"を削除する。
blog@91b7fb220ff0:~$ echo -e "Engineer\nEngineer\nAll\nHands\nHands\nHands" > meeting.txt blog@91b7fb220ff0:~$ cat meeting.txt | uniq Engineer All Hands
jq
コマンドラインJSONプロセッサ
JSONデータのスライスや整形ができる。
例)json形式のテキストから'title'キーに対する値を出力する。
blog@4bd2d2edd2e2:/$ echo '{"title":"Engineer All Hands", "type":"Meeting"}' | jq '.title' "Engineer All Hands"
yq
コマンドラインYAMLプロセッサ
ファイルの特定の値を読み取ったり、更新したりできる。
また、ymlファイルだけでなく、json、xml、csvなども処理できる。
例)yaml形式のテキストから'title'キーに対する値を出力する。
blog@d487217314f5:/$ echo '--- title: Engineer All Hands type: Meeting ' | yq '.title' - Engineer All Hands
jump
事前にアクセスしたディレクトリを追跡することで、パスの一部を入力するだけでディレクトリが移動できるようになる。
例)keynoteディレクトリに簡単に移動する。
blog@f865075e07f9:/$ mkdir -p ~/engineer_all_hands/open_space_technology blog@f865075e07f9:/$ mkdir -p ~/engineer_all_hands/keynote blog@f865075e07f9:/$ cd ~/engineer_all_hands/open_space_technology blog@f865075e07f9:~/engineer_all_hands/open_space_technology$ cd blog@f865075e07f9:~$ cd ~/engineer_all_hands/keynote blog@f865075e07f9:~/engineer_all_hands/keynote$ cd blog@f865075e07f9:~$ j keynote blog@f865075e07f9:~/engineer_all_hands/keynote$
dyff
YAMLファイルまたはJSONの差分ツール
例)2つのyamlファイルを比較する。
blog@063b63d8e574:~$ echo -e "title: Engineer All Hands\ntype: Meeting\nparticipants: 100" > event1.yaml blog@063b63d8e574:~$ echo -e "title: Open Space Technology\ntype: Workshop\nparticipants: 50" > event2.yaml blog@063b63d8e574:~$ dyff between event1.yaml event2.yaml _ __ __ _| |_ _ / _|/ _| between event1.yaml / _' | | | | |_| |_ and event2.yaml | (_| | |_| | _| _| \__,_|\__, |_| |_| returned three differences |___/ title ± value change - Engineer All Hands + Open Space Technology type ± value change - Meeting + Workshop participants ± value change - 100 + 50
peco × ghq
peco:インタラクティブフィルタリングツール
ghq:ローカルにリモートリポジトリURLのホストとパスを使用してクローンを行ってくれるツール
例)ghqでクローンしたリポジトリに簡単に移動する。
blog@a13a6c3cee64:~$ ghq get github.com/peco/peco/cmd/peco blog@a13a6c3cee64:~$ ghq get github.com/x-motemen/ghq blog@a13a6c3cee64:~$ cd "$(ghq list -p | perl -nlpe 's[.src/(.)][$1\0$_]' | peco --null)" blog@a13a6c3cee64:~/ghq/github.com/peco/peco$
※3行目のコマンドはpecoのSample Usageを使用しています。エイリアスにすると使いやすいです。
上記のコマンドをすぐに実行できるように、Dockerfileを載せておきます。
# Base image FROM ubuntu:latest # Install necessary packages RUN apt-get update && apt-get install -y \ git \ jq \ peco \ wget \ build-essential \ curl \ perl \ && rm -rf /var/lib/apt/lists/* # Install yq RUN wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq \ && chmod +x /usr/bin/yq # Install jump RUN wget https://github.com/gsamokovarov/jump/releases/download/v0.51.0/jump_0.51.0_amd64.deb \ && dpkg -i jump_0.51.0_amd64.deb \ && rm jump_0.51.0_amd64.deb # Install Go RUN rm -rf /usr/local/go \ && wget https://go.dev/dl/go1.20.7.linux-amd64.tar.gz \ && tar -C /usr/local -xzf go1.20.7.linux-amd64.tar.gz \ && rm go1.20.7.linux-amd64.tar.gz # Add go to PATH ENV PATH="/usr/local/go/bin:${PATH}" # Add user RUN useradd -ms /bin/bash blog USER blog WORKDIR /home/blog # Set GOPATH and add it to PATH ENV GOPATH="/home/blog/go" ENV PATH="${GOPATH}/bin:${PATH}" # Install ghq and dyff RUN go install github.com/x-motemen/ghq@latest \ && go install github.com/homeport/dyff/cmd/dyff@latest # Initialize environment RUN echo 'eval "$(jump shell)"' >> ~/.bashrc CMD ["/bin/bash"] # Please execute the following commands: # docker build -t image . # docker run -it image # After starting Docker, you may need to execute the command "source ~/.bashrc".
筆者自身はsed、awk、grepあたりしか使っていなかったので、便利なコマンドがあるものだなと感じました。また、ターミナルにこだわって、tmuxとかscreenを使って複数画面で操作するという方もいました。
Kubernetes
筆者は普段ほとんどk8sを触らないため詳細までは分かりませんでした。
しかしながら、k8s専用のCLIツールにk9sとKDashがあって便利だとか、kubectl-neatが冗長なyamlから不要な要素を削除してくれるといった話題が出てました。ちなみに、k8sの青山真也さんも参加されてました。青山さんはk8sの操作に、基本kubectlと基本的なシェルとPerlしか使っていないとおっしゃられてました。過去にPerlしか使えない環境があって、使っていくうちに慣れてしまったそうです。
まとめ
先輩エンジニアの方々に、なんでそんなコマンド知ってるんですかと聞くと、だいたいは、誰かと一緒にプログラムを書いているときに教えてもらうと言っていました。人と話しながらプログラムを書くことは重要だなと感じたセッションでした。