fbpx

Engineer All HandsのOSTセッション「開発生産性を挙げるツールTIPS共有」に参加してみた

先日、弊社では三浦海岸で行われたエンジニア交流のための合宿イベント「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しか使えない環境があって、使っていくうちに慣れてしまったそうです。

まとめ

先輩エンジニアの方々に、なんでそんなコマンド知ってるんですかと聞くと、だいたいは、誰かと一緒にプログラムを書いているときに教えてもらうと言っていました。人と話しながらプログラムを書くことは重要だなと感じたセッションでした。

右奥のテーブルで話してました。
新規CTA