blog.syfm

徒然なるままに考えていることなどを書いていくブログ

Evans v0.9.0 をリリースしました

汎用 gRPC クライアントである Evans の v0.9.0 をリリースしました。最後にリリースしたのは昨年末だったので、実に 5 ヶ月ぶりとなります。
今回のコードネームは GOLD RUSH です。

このリリースでは、多くの機能追加、バグ修正等があったため、特徴的なものに関してリリースノートを書こうと思います。

REPL モード

call コマンドに --dig-manually フラグを追加

REPL モードでは、入力対象の message について深さ優先探索を行い、プリミティブフィールドが現れると入力用のプロンプトが表示されるような仕様になっていますが、この実装だとネストされた message 自体に値を何もセットしたくない場合 (Go だと nil を設定したい場合) をサポートできていませんでした。 例えば、以下のような Protocol Buffers 定義があり、Request が入力である場合、Evans は自動的にネストされているメッセージのフィールド Foo.bar への入力を求めるため、そもそも Foo を入力したくない場合は --dig-manually フラグなしでは実現できません。--dig-manually フラグが有効になっている場合、Request.foo フィールドを入力するかどうかのプロンプトが表示されるため、入力をスキップすることができます。

message Foo {
  string bar = 1;
}

message Request {
  Foo foo = 1;
}

header コマンドに --raw フラグを追加

header コマンドの value にカンマ区切りで複数の値を同時に指定できますが、その影響により v0.9.0 以前の Evans では、カンマを含めた value を指定することができませんでした。カンマを value に含めてしまうと、それがデリミタとして解釈されてしまい、value が分割されてしまうためです。
今回新しく導入された --raw フラグは、value を "raw" string として扱うためのものです。これを使うことでカンマが含まれていても正常に指定することができるようになります。

f:id:ktr_0731:20200423004246p:plain

コマンドヒストリ

実行したコマンドをシェル環境のようにコマンドヒストリから探し出すことができるようになりました。↑↓キーもしくは Ctrl+PCtrl-N でヒストリを辿ることができます。残念ながら、Ctrl+R (reverse search) や Ctrl+S (forward search) は未サポートです。*1

パッケージが指定されていない Protocol Buffers 定義の許容

v0.9.0 以前の Evans の REPL モードでは対象の gRPC サービスのパッケージ名を指定することが必須になっていましたが、Protocol Buffers ではパッケージ名を省略することができるため、パッケージ名が省略された gRPC 定義を使用することができませんでしたが v0.9.0 では修正されています。

フラグ補完

REPL モードの各コマンドにはフラグを指定することができますが、v0.9.0 ではフラグの補完も有効になります。例えば call コマンドでは以下のように - を入力した時点で補完候補が現れるようになります。

f:id:ktr_0731:20200502181241p:plain

CLI モード

cli コマンドに属するサブコマンドの追加

今回のリリースで導入された大きな機能の一つです。 cli コマンドにサブコマンドが追加されました。今後は cli コマンドに属するサブコマンドを使用してください。詳しくは各サブコマンドのヘルプに使用例が記載されています。

$ echo '{}' | evans -r cli call Unary

以下のような既存のインターフェースは依然として使えますが非推奨となります。v1.0.0 で削除される予定です。

$ echo '{}' | evans -r --cli --call Unary
$ echo '{}' | evans -r cli --call Unary

call コマンドの追加

前述した通りです。

list コマンドの追加

grpc_cligrpcurl に用意されているような、gRPC サーバに対してサービスやメソッドを列挙する機能です。 以下のように使うことができます。

$ evans -r cli list # サービスの列挙
api.Example
grpc.reflection.v1alpha.ServerReflection

$ evans -r cli list api.Example # api.Example サービスに属するメソッドの列挙
api.Example.Unary
...

また、--output (-o) フラグが用意されており、リクエスト・レスポンスの型を含めた詳細を JSON で出力することも可能です。

$ evans -r cli list -o json api.Example.Unary
{
  "name": "Unary",
  "fully_qualified_name": "api.Example.Unary",
  "request_type": "api.SimpleRequest",
  "response_type": "api.SimpleResponse"
}

desc コマンドの追加

grpc_cligrpcurl に用意されているような、gRPC サーバが登録しているサービスやメッセージなどのシンボルの詳細を Protocol Buffers のフォーマットで表示する機能です。 以下のように使うことができます。

$ evans -r cli desc api.Example
api.Example:
service Example {
  rpc Unary ( .api.SimpleRequest ) returns ( .api.SimpleResponse );
  ...
}

$ evans -r cli desc api.Example.Unary
api.Example.Unary:
rpc Unary ( .api.SimpleRequest ) returns ( .api.SimpleResponse );

$ evans -r cli desc api.SimpleRequest
api.SimpleRequest:
message SimpleRequest {
  string name = 1;
}

モード共通

レスポンス表示の強化

今回のリリースで導入された最も大きな機能のもう一つです。v0.9.0 以前では gRPC サービスからのレスポンスのうち、レスポンスコードが OK もしくはそれ以外かの表示、レスポンスボディ、エラーメッセージのみしか表示することができていませんでしたが、新たに ヘッダメタデータ、トレイラーメタデータ、レスポンスコード、エラー詳細 (errdetails など) を表示することができるようになりました。

REPL モードでは call コマンドに --enrich フラグを指定することで有効になります。

f:id:ktr_0731:20200502182325p:plain
正常系の例

f:id:ktr_0731:20200502182541p:plain
異常系の例

CLI モードでも同様に call コマンドに --enrich フラグを指定することで有効になります。

f:id:ktr_0731:20200502182751p:plain

また、CLI モードでは --output (-o) フラグが用意されており、JSON 形式で出力することもできます。

f:id:ktr_0731:20200502182857p:plain

gRPC-Web サービスで正しくヘッダーが送れていない問題の修正

頑張って修正しました。Evans では、gRPC-Web の Improbable 社による実装をサポートしていますが、gRPC-Web は Web ブラウザのみをクライアントとする前提を置いているため JavaScript のクライアント実装しか存在していません。しかし、Evans は pure Go 実装であるため、Evans から gRPC-Web に準拠したリクエストを投げるには Go 実装を作る必要があり、ktr0731/grpc-web-go-client を開発していました。今回の修正は主にこのライブラリの修正となっています。

終わりに

今回の機能追加や変更は v1.0.0 のリリースの前段階といえます。具体的なリリース予定は未定ですが、v1.0.0 では複数の破壊的変更を予定しています。こちらについてはまた別途記事を書ければと思います。

Evans の開発は Issue 報告者、contributor および GitHub Sponsors で支援を頂いている方々から成り立っています。いつもありがとうございます!

*1:これは c-bata/go-prompt の制約によるものです。気力があれば実装して contribution したいけどない 😇

CLI ツールのフラグ設計むずかしい

CLI ツールを作る・保守していく上で最も難しいのはフラグ設計かもしれない。 一つのことをうまくやる、サブコマンドを持たないレベルまで小さいものであれば比較的容易だけど、サブコマンドを使うレベルになってくると途端に難しくなる。

どういった点が難しいのかをざっと思いつくものについて上げてみる。

  • フラグ名の割り当て
  • 適切な名前
  • 提供する機能の粒度
  • 後方互換

フラグ名の割り当て

例えば --version の短縮名として -v--help の短縮名として -h がしばしば使われる。なので、ユーザは初めて使う CLI ツールであってもとりあえず -v-h を叩いてみることが多い (特に使い方がわからない場合は --help-h を必ずと行っていいほど叩くと思う)。
ここで、-h がヘルプではなく別の機能に割り当てられていた場合、ユーザは違和感を覚えると思う。直感的な操作を提供できるか、というのは CLI ツールの設計においてかなり重要だと感じるのでできる限り直感に沿った機能を提供したい。

しかし、その一方でフラグ名の割り当ては慎重に決定する必要がある。例えば、ヘルプはユーザが CLI ツールの使い方を忘れるたびに叩かれるのでそれなりに使用される頻度は多いが、バージョンを表示する --version はそれと比べて圧倒的に頻度が少ないはず。使用頻度が少ないコマンドに短縮名を使ってしまうと、その文字を頭文字に持つ他のフラグの短縮名を提供したくなったときに困ることになる。例えば、v が頭文字につくものでしばしばフラグ名に使われているものとして --verbose がある。--verbose が具体的にどういった機能を提供するかはそれぞれの CLI ツールに依るが、少なくとも冗長・補助的な出力を増やすフラグであることがほとんどで、--version よりも使用される頻度が高いと思う。

短縮形で使用できる文字にはかなり制限がある (一文字しか使えないので) ため、短縮形を使うべきフラグは非常に使用頻度が高いものや、その CLI ツールにおいてコアな機能を提供するものにのみ使うべきだと個人的には思う (= 基本的に短縮形は使わない)。

適切な名前

例えば --port のような、フラグ名の指しているものの値を変えるような場合であればフラグ名を決定するのは容易だが、振る舞いを変えるようなフラグ名の場合は適切な名前を決めるのが難しくなる。これは変数名をつける時と同じ問題だが、CLI ツールの場合、フラグ名の長さは短ければ短いほど良いのでより難しい。 しかも、振る舞いを変えるフラグの場合、あまり慣習のような名前もない。そのため、日常的に使われている CLI ツールを見てもあまり参考にならなかったりする。

提供する機能の粒度

これが一番難しい。本当に難しい。例えば、出力のフォーマットを JSON 形式で行いたいというユースケースがあるとする。ぱっと思いつくフラグ名は --json といったフラグを提供して、これが有効になっていれば通常の出力ではなく JSON 形式に切り替えるようにする。しかし、JSON だけで良いのかという問題もある。例えば、kubectl は --output というフラグを提供していて、これは --output=jsonJSON 形式、--output=yamlYAML 形式で出力を行うことができる。

ではこの CLI ツールにも --output--format のようなフラグを作って複数のフォーマットに対応したほうが良いのだろうか?正直一長一短だと思う。複数のフォーマットに対応するということは一つのことをうまくやる UNIX 哲学に沿っていないようにも感じられる。また、--output フラグには値を指定しなければいけないため、bool のフラグよりもほんの少しだけ使い方が複雑になる。しかし、その一方で出力内容が複雑な場合、構造化された出力形式がないとパイプを組み合わせたフィルタ処理がしにくく、やはり UNIX 哲学に沿えてない設計になってしまう。また、--json のような特定のフォーマットに依存したようなフラグを定義すると他のフォーマットをサポートすることになった場合に比例してフラグの数が増えることになる。また、--json という名前だけでは 出力 フォーマットかどうか知ることができない。ツールが複雑になっていくと、例えば入力を JSON 形式の文字列で受け取りたいといった別なユースケースが生じてフラグ名が衝突する可能性もある。かといって --json-out のような名前にするとフラグ名が長くなってしまい、打つのがめんどうになる。短縮名を用いることはできるが前述したとおり、それもまた衝突する可能性がある。

後方互換

OSS として公開しているともっとも大変なのが後方互換性の維持だと思う。自分しか使っていないような CLI ツールであれば master に雑に push して後方互換性を破壊しても困る人はいないが、多くの人に使われるようになった CLI ツールでは後方互換性を維持することが必須となる。セマンティックバージョニングであればメジャーバージョン前であれば定義的には後方互換性を壊しても問題ないが、告知なしに互換性を壊されるとツールを使うのをやめるユーザも多いと思う。そもそも多くの人にとってセマンティックバージョニングはどうでも良く、手元ですんなり動くことが最も重要なはず。

例えば社内のライブラリであれば開発チャンネルで @here したり、マイクロサービスであればクライアントをすぐに洗い出せるので合意も取りやすい。しかし、CLI ツールは社内のソフトウェアとは異なり、ユーザの顔が見えないので後方互換性を崩したい場合は事前に告知をした上で、メジャーバージョンを上げる際にのみ行わなければいけない。

前述したフラグ名の問題も後方互換性の問題と組み合わせるとより辛くなる。迂闊にネームスペースの大きいフラグ名を付けてしまうと次のメジャーバージョンまでそれを変更することができず、さらにそのフラグ名にふさわしい機能が増えた時に割り当てることができずに妥協した名前になってしまう。特にサブコマンドがある CLI ツールの場合、グローバルフラグ (コマンド名の直後に現れる、CLI ツール全体で有効なフラグ) とローカルフラグ (サブコマンドでのみ有効なフラグ) があることが多いので定義するフラグがグローバル・ローカルどちらにあるべきかを慎重に選ばないといけない。

うーん、むずかしい 😇

一年を振り返り… (2019)

去年は 👇

syfm.hatenablog.com

去年の 6 月ごろからほとんど毎日、雑に日記をつけていたのでこの振り返りもだいぶ書きやすくなった。

journey.cloud

Journey というアプリを使っている。各プラットフォーム向けにアプリがあり、Google Drive にエクスポートできたりするのが良いし、普通に使いやすい。毎日 22 時頃にリマインダーを飛ばしていて、一日の振り返りを雑に書く。だいたい一行二行くらいだけど気が向いてるときとか印象的なことがあった日は長文を書いていたときもあった。酒飲んでいて眠いときとかは書かないことも良くあった。このくらい雑だと意外と習慣化できる。

1 月

f:id:ktr_0731:20191222001322j:plain
今年もここから

今年も年越しを友人らと過ごし、初日の出を見てきた。ここ数年は元旦に雨の日がなくて良い。
会津では基本的に研究を進めながら、友人らとスマブラやったり (自分はクソ弱い) 、go-fuzzyfinder という OSS の開発をしたりしていた。去年の 10 月から一切働いておらず、無駄に時間はあったので自由気ままな生活をしていた。

OSS については、Evans が年明けまでに 500 stars はいけなかったけど年明け直後に突破した。また、12 月には 1000 stars を突破することもできた。Evans についてはまた別の機会に記事を書きたい。

読んだ本

五等分の花嫁(1) (週刊少年マガジンコミックス)

五等分の花嫁(1) (週刊少年マガジンコミックス)

日の出待ちにいた漫画喫茶で読んでた。最初からずっと二乃派です。

A Philosophy of Software Design

A Philosophy of Software Design

  • 作者:John Ousterhout
  • 出版社/メーカー: Yaknyam Press
  • 発売日: 2018/04/06
  • メディア: ペーパーバック
今年読んだなかで二番目に良かった本。書評に関しては別途記事を書いてるのでそちらも併せて。

syfm.hatenablog.com

go-fuzzyfinder を開発しているときに文字列処理に興味を持ったので読んだ。

2 月

f:id:ktr_0731:20191222004926j:plain
今年は雪が少なかった

この時期は卒論執筆も終盤に差し掛かり、結構忙しかった記憶がある。また、それは卒業が目前に迫っているということでもあったので、最後の思い出づくりに卒論の合間に会津で好きだったところにもう一度行ったりしていた。ごはんはあおやま、HERO'S DINER、よしのや食堂、YAKi 家、丸忠あたりが、居酒屋は天竜、盃爛処、福住あたりが好きです。

引っ越しもこの時期にした。4 年間住んでいた家は毎日夕焼けを眺めることができたのですごく気に入っていた。会津はなにもないけど風景が本当に綺麗。

卒論を書き終わったあと、ktr0731/go-fuzzyfinder という、fzf のような機能を提供する Go ライブラリを公開した。100 stars 超えていて、それなりに需要があったんだな〜と思った。

読んだ本

やはり俺の青春ラブコメはまちがっている。12 (ガガガ文庫)

やはり俺の青春ラブコメはまちがっている。12 (ガガガ文庫)

  • 作者:渡 航
  • 出版社/メーカー: 小学館
  • 発売日: 2017/09/21
  • メディア: 文庫
俺ガイルの最新刊が出たので読んでいた。前巻と間が空きすぎて忘れていたのでそちらも読み直した。

アニメ観てハマったので全巻買って読んだ。

冬目景作品の新刊。冬目景にしてはかなり早く続刊を出していて驚いた。

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

図やコードが多くて分かりやすかった。普段このレイヤーはあまり意識しないのでこういった本は非常にありがたい。

3 月

f:id:ktr_0731:20191222011223j:plain
サンシャイン 60 展望台

3 月は東京への完全に引っ越しも一段落し、新しい街を歩いたり、東京にいる友人にあったりしているだけの生活をしていた。あとは卒業式とその前日の LT イベントのために 2 日だけ会津に戻ったりもしていた。4 年間本当にあっという間だった。
鎌倉、江ノ島に行ったりもしていた。最後に行ったのは中学校の修学旅行だったのでだいぶ記憶が薄くなっていたけど、当時見た場所や入った店とかをなんとなく思い出せて懐かしい気分になった。すごく良かったけど、昔行ったときより人がかなり増えていた気がした。

読んだ本

現代法学入門 (有斐閣双書)

現代法学入門 (有斐閣双書)

  • 作者:
  • 出版社/メーカー: 有斐閣
  • 発売日: 2005/03/01
  • メディア: 単行本

社会がアラートループ事件とか Coinhive 事件とかで不穏だったので自衛のために最低限の知識はつけておきたいと思ったので読んだ。この手の本にしてはかなり読みやすく、題材も面白かった。

金融ドメインをざっと理解したかったので手にとったが、実際は Fintech 寄りの本だったのであんまり読んだ意味はなかった気がする。

Kubernetes についてハンズオン的に進めながら読める本。サンプルは Azure だけど GCP でも問題なく進められる。

4 月

f:id:ktr_0731:20191222013655j:plain

社会人一年目として働き始めた月。この月は仕事以外でなにをやったのかあまり覚えていないけど多分何もやってなかったんだと思う。自分自身、環境が急激に変わることがあんまり好きではないのでそのせいで消耗していたのかもしれない。入社エントリでも書いたけど新卒研修を途中で切り上げて早期配属を希望したのもこの月で、月末にはチームに合流し GW を迎えた。

Google Photo の写真眺めててユーフォの劇場版めちゃくちゃ良かったのを思い出した。あとなぜか新宿御苑の写真があった。なんで行ったんだっけ?

読んだ本

京都アニメーションでアニメ化予定の本。結構面白かった。

響け! ユーフォニアム 北宇治高校吹奏楽部、決意の最終楽章 前編 (宝島社文庫)

響け! ユーフォニアム 北宇治高校吹奏楽部、決意の最終楽章 前編 (宝島社文庫)

  • 作者:武田 綾乃
  • 出版社/メーカー: 宝島社
  • 発売日: 2019/04/17
  • メディア: 文庫
響け!ユーフォニアムの完結編の前編。前編なのでとにかく不穏だったという印象が強い。

5 月

f:id:ktr_0731:20191227022421j:plain

GW に土善旅館で開発合宿をしていた。自分は Evans のフルリプレイスをしていたような気がする。土善旅館については前々から聞いていたけどかなり備品が揃っていて何一つ不自由なく開発できて最高だった。ブログも書いた。

syfm.hatenablog.com

月半ばに Go Conference 2019 Spring があり、自分のプロポーザルが採択されていたのでスライド作りや発表練習を結構していた。go-fuzzyfinder について話し、結構好評だったので嬉しかった。

読んだ本

主観で判断するのではなく本質を見ましょうね、といった内容の本。

6 月

f:id:ktr_0731:20191227023033j:plain
日光東照宮に行った

親族との旅行で日光に行っていた。日光東照宮とか二荒山神社とか、あのあたりはかなり多くの歴史ある神社仏閣があって巡っているだけでかなり楽しい。 宿泊した湯西川も良かった。鬼怒川よりさらに奥地なのでさらに寂れていた。途中通った鬼怒川温泉街の寂れ具合も最高だった。会津地方の芦ノ牧温泉街感ある。 *1

仕事の方では企業側の人間として母校の会津大学の LT イベントに参加して発表したりしてきた。後輩や、院進や留年した友人らも元気そうで良かった。 また、配属チームで 5 月から開発していた静的 MPM 決済が無事リリースでき、一段落できた。

jp.merpay.com

読んだ本

夢で見たあの子のために(4) (角川コミックス・エース)

夢で見たあの子のために(4) (角川コミックス・エース)

読んだけどどんな内容だったか忘れてしまった。

亜人(14) (アフタヌーンKC)

亜人(14) (アフタヌーンKC)

相変わらずかなり熱い展開が続いていて先が読めない。

ブラック・ラグーン(1) (サンデーGXコミックス)

ブラック・ラグーン(1) (サンデーGXコミックス)

社会勉強するために全巻買って再読した。

青のフラッグ 1 (ジャンプコミックスDIGITAL)

青のフラッグ 1 (ジャンプコミックスDIGITAL)

エグい。

響け! ユーフォニアム 北宇治高校吹奏楽部、決意の最終楽章 後編 (宝島社文庫)

響け! ユーフォニアム 北宇治高校吹奏楽部、決意の最終楽章 後編 (宝島社文庫)

  • 作者:武田 綾乃
  • 出版社/メーカー: 宝島社
  • 発売日: 2019/06/22
  • メディア: 文庫
響け!ユーフォニアムの完結巻。めちゃくちゃ面白かったので早く映像でも見たい…。

クレジットカード決済ドメインについて扱っている本で、メルペイのシステムのクレジットカード決済ドメインと似ているので頭の中で単語や全体像を整理できて良かった。

7 月

f:id:ktr_0731:20191227023334j:plain
友達と映画館行ったらたまたまやってたユーフォの原画展

入社して 3 ヶ月が経ち、雇用が切られなかったので入社エントリを書いたりしていた。 この月は体調が悪い日が多く、日記にも体調が悪かったとか WFH したとか書いてあったけどなにがあったのかよく分からない。いつの間にか治っていた。

天気の子が公開されたので観に行ってきた。どこか既視感を感じたけど面白かった。前々から新海誠

が好きだったみたいだけど最近六本木ヒルズ森タワーもお気に入りに追加されたっぽい。

読んだ本

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

今月から OnCall に入ることになり、運用もしていくようになったけど、運用の経験・知識がなかったので監視の基本的な知識を身に着けたくて読んだ。

8 月

f:id:ktr_0731:20191227023648j:plain

月半ばにはメルペイ側のエンジニアとしてサイバーエージェントとの合同イベントで登壇していた。Go modules に関する知見は今まであまりなかったので良い発表だったかなと思った。 あとはお盆だったので実家に久しぶりに帰り、地元の友人と飲みに行ったりしていた。地元は魚の美味しい地域なので最高。

読んだ本

BANANA FISH ANOTHER STORY (1) (小学館文庫)

BANANA FISH ANOTHER STORY (1) (小学館文庫)

アニメ版の BANANA FISH を観たので、そのアフターストーリーを読むために買った。

小説 天気の子 (角川文庫)

小説 天気の子 (角川文庫)

  • 作者:新海 誠
  • 出版社/メーカー: KADOKAWA
  • 発売日: 2019/07/18
  • メディア: 文庫
映画の補完として読んだ。

9 月

f:id:ktr_0731:20191229212817j:plain
客室からの眺めが本当に最高だった

この月は ISUCON があった。自分たちのチームは毎年旅館で ISUCON をやっているので、今年も伊豆の方へ旅行に行った。かなり最高なので来年もやりたい。前回は伊香保、今年は伊豆 (土肥) だった。どうせ行くなら毎回別な温泉地が良いので来年も熟考したい。

また、10 年来のネット上での友人らとのオフ会が実現したのもこの月だった。当時たくさんいた、ネットでのみ関わりがあった人たちももはやほとんどいなくなってしまったけれどそれでもこうして集まれる友人がまだ 10 人弱いるのはびっくりすると同時にすごく嬉しい。また来年開催したいね、といった話をしたので来年も楽しみ。

読んだ本

進撃の巨人(1) (週刊少年マガジンコミックス)

進撃の巨人(1) (週刊少年マガジンコミックス)

無料キャンペーンやっていたので読み始めたけど、読む時間がなくて 1-2 巻くらいしか読めなかった…。

10 月

f:id:ktr_0731:20191229220027j:plain
六本木ヒルズ展望台

この月は特に印象に残ったイベントはなく、静かな月だった気がする。日記を見る感じ、ハードワークをしていたわけではないけど結構仕事に手一杯で、家に返ったらぼーっと過ごして眠くなったら寝るみたいな生活をしていたっぽい。本も読めていなかった。
ただ、これはあんまり良くないなーと思ったので会社の OKR の個人 KR に OSS 活動や技術インプット・アウトプットを入れて意識して時間を有効に使うようにした。

11 月

f:id:ktr_0731:20191229221427j:plain

この月は仕事がかなり慌ただしく、いろいろなことが目まぐるしく動いていた。というか仕事のことと飲んでいたことくらいしか覚えてない…。あとは苦しい出来事があり、急だし予定も何も立てていなかったけど 2 日くらい有給を取って実家に帰ったりしていた。東京は会津より実家に帰りやすく、2 時間くらいで行けるので良い。

読んだ本

20世紀少年―本格科学冒険漫画 (1) (ビッグコミックス)

20世紀少年―本格科学冒険漫画 (1) (ビッグコミックス)

突然カンナのラビット・ナボコフが読みたくなったので買って再読した。

サマータイムレンダ 1 (ジャンプコミックスDIGITAL)

サマータイムレンダ 1 (ジャンプコミックスDIGITAL)

本屋でなんとなく目に入ったので買った漫画。ここ数年読んだ漫画の中で一番面白い (そもそもそこまで読んでないけど)。やっぱループとかタイムリープものがめちゃくちゃ好きなんだよなー。

5 月からゆっくり読み進めていた本で、今年読んだ本の中で一番良かった。以下の記事でも挙げている。

syfm.hatenablog.com

12 月

f:id:ktr_0731:20191229224702j:plain

社内の開発合宿で箱根に行ったりしていてすごく楽しかった。自分は The Amazon Builders' Library の記事とか go-fuzzyfinder のメンテ・機能開発とかをしていた。 仕事は相変わらずゴタゴタしていたけどなんとか仕事を納めつつ、実家に帰り中学の同窓会をした。高校の同窓会は全然ないけど中学は結構な頻度でやってる気がする。次は GW かな、みたいな話もした。 あとは大晦日にいつものメンバーで集まって年を越すだけ。

読んだ本

ブルーピリオド(1) (アフタヌーンコミックス)

ブルーピリオド(1) (アフタヌーンコミックス)

かなり面白い。印象に残るセリフが多く、すごく共感できる。

まとめ

社会人になり、モノリシックなソフトウェア開発ではなくマイクロサービスの開発に関わるようになったことや、運用・保守に関わるようになったことでとにかくあらゆることを学ぶことができた濃い一年だった。 所属しているチームも居心地がよく、残業もほとんどしていないので精神衛生 (心理的安全性?) もかなり良く楽しく働けている。

社会人になっても学生の時と同じくらいプライベートでもコードを書いたりアウトプットができているのでこれからも継続したい。逆にインプットはもっと増やしたいと思う。ずっとコード書いていたい。

ただ、基本的に仕事中心になってしまっていたのはあんまり良くないと強く感じているので来年はもう少しプライベートな時間を有効に使えるようにしたいなーと思う。

*1:芦ノ牧のほうがより寂れているけど…