開発ライブ実況#3 エディタの設定しない人編 by メルペイExpertチームBackendエンジニア #mercari_codecast

メルペイ エキスパートチームのtenntenn です。このブログは、先日おこなった開発ライブ実況* イベントのまとめです。Merpay Tech Openness Month の19日目の記事でもあります。

  • 開発ライブ実況とは、コーディングの様子を、開発者本人と実況者がライブ実況するイベントです。使っている言語、エディタ、ドキュメントの見方、テストの書き方などを、実況を聞きながら見ることができます。 プレイリスト (過去全ての開発ライブ実況動画)

開発環境

使用したもの

使い始めたきっかけ

高校生のときに卒業研究でLISPを使うために、xyzzyというEmacsライクなエディタを使い始めました。その後、大学で9年ほどEmacsを使うようになり、就職するタイミングでVimも使ってみたくなってVimを使い始めました。

使い続けている理由

キーボードからあんまり手を離さずにターミナルで作業したいのでIDEではなくターミナルで動くエディタを使っています。もちろん、Emacsでもターミナルで開発はできますが、手のコンテキストスイッチが面倒なので、今はVimを使ってます。そのうちEmacsに戻るかもしれないですし、Acmeとかも使ってみたいです。

こだわりポイント

私が以前使っていたdotfilesは知り合いのものをフォークしたものです。そのため、設定の詳細はよく分からず使っていました。

先日、会社のパソコンと個人のパソコンを変える機会があったので、設定を見直そうと考えました。よく分からない設定を使わず、一度消してまっさらな気持ちから始めようと思い、.vimrc.tmux.confなどを消しました(前のパソコンからコピーしませんでした)。 今のこだわりは何も設定せず、素のiTerm2とVimで開発することです。しかし、開発するにはちょっと心許ないため、knifeという自作ツールを使っています。

knifeは、公式のgo listにインスパイアされて作ったツールです。go listはパッケージやモジュールの情報を表示するためのコマンドです。-fオプションでテンプレートを渡すことによって出力するデータをカスタマイズすることができます(参考:プログラミング言語Go完全入門)。

一方、knifeは指定したパッケージの型情報を表示するためのツールです。go listと同様に-fオプションにテンプレートを指定することで表示する内容を変更することができます。例えば次の例では、net/httpパッケージで定義されているパッケージスコープの型でかつcontext.Context型のフィールドを持つものを表示しています。

$ knife -f '{{- range .Types -}}
    {{- $t := . -}}
    {{- with struct . -}}
        {{- range .Fields -}}
            {{- if identical . (typeof "context.Context") -}}
                {{- $t.Name}} - {{pos .}}{{br}}
            {{- end -}}
        {{- end -}}
    {{- end -}}
{{- end -}}' "net/http"

Request - /usr/local/go/src/net/http/request.go:319:2
http2ServeConnOpts - /usr/local/go/src/net/http/h2_bundle.go:3878:2
http2serverConn - /usr/local/go/src/net/http/h2_bundle.go:4065:2
http2stream - /usr/local/go/src/net/http/h2_bundle.go:4146:2
initALPNRequest - /usr/local/go/src/net/http/server.go:3393:2
timeoutHandler - /usr/local/go/src/net/http/server.go:3241:2
wantConn - /usr/local/go/src/net/http/transport.go:1162:2

また、astqueryという抽象構文木のノードをXPathで取得するための自作パッケージを用いた検索も行えるようになっています。次のように-xpathオプションを指定することで、fmtパッケージで定義されているPrintという名前で始まるパッケージ関数のブロックスコープで定義されている識別子の一覧を取得することができます。

$ knife -f '{{- range . -}}
    {{- .Name}}:{{with .Scope}}{{.Names}}{{end}}{{br}}
{{- end -}}' \
 -xpath '//*[@type="FuncDecl"]/Name[starts-with(@Name, "Print")]' fmt

Printf:[a err format n]
Print:[a err n]
Println:[a err n]

knifeはgo get github.com/gostaticanalysis/knifeでインストールできます。しかし、2020年9月9日時点ではknifeは筆者が使うためのツールとして開発しているため安定していません。そのため、今後よりよい使い勝手を求めてインタフェースが変わるかもしれません。

本稿ではkinfeについて軽く紹介する程度でしたが、10月10日に行われるGo Conference’20 in Autumn SENDAIにおいて、knifeの詳細をお話する予定なので興味のある方は参加してみてください。

課題とアウトプット

課題

TODOアプリを作ろう

コード

https://play.golang.org/p/Rqo5GSG61Jn

ライブ実況動画

使用したプラグインや参考URLリンクなど

おわりに

今回のイベント後に同僚から実践Vimを紹介してもらいました。実践Vimを読んで素のVim力を鍛えていきたいと思います!

また、今後も静的解析ツールを自作していこうと思います。読者のみなさまの中で静的解析の自作に興味がある方は、プログラミング言語Go完全入門14章 静的解析とコード生成をご覧ください!この資料を使って行ったOnline Summer Internship for Gophers 2020の講義ビデオも編集後にGopher道場 自習室で公開するので、Gopher道場のTwitterアカウントからのお知らせを見逃さないようチェックしてください!