yn2011's blog

技術メモ

日々の健康状態を記録する CLI ツールを Go で書いた

github.com

多分 go get すれば動くと思う

DEMO

f:id:pokuwagata:20200421022609g:plain

目的

  • 「世界一のプロゲーマーがやっている 努力2.0」を読んだ感想 に書いた「自分が無理をしていないか、常にモニターする」をやりたいな、と思った
  • ノートに書くよりは データの方が集計とか楽だし、CLI なら毎日入力するために他の何かのツールと繋ぎ合わせやすいかなあ(例えば Alfred とか...)と思ったので作った
  • それと次の職場で Go が使われているので、復習がてら素振りをしておきたい

機能

  • 質問をする。答えを csv ファイルに書き込む。
  • 日付指定して質問に答えることもできる。入力を忘れても次の日に挽回可能
  • 質問は json ファイルで任意に定義できる。答えのデータ型と範囲(最小と最大)も定義できるのでバリデーションチェック可能(ここは少し頑張った)

感想

  • Go の暗黙のルール忘れがち
    • 1ディレクトリに1パッケージとか、ディレクトリ名とパッケージ名は実は違っていてもいいとか、ファイル分割したら go run *.go で実行しないといけないとか...
  • manifoldco/promptui は良い感じに入力のインターフェイスを作れて良い
  • Go で csvjson の取り回しは初めてだったが、Go らしい素朴な感じでやれるなと思った
  • 正直 Go でちゃんとした CLI ツールを作るのも初めてで時間かかった気がする
    • オプションと引数の受け取り、ファイルやディレクトリの判定・作成、エラー処理等は1度コード書いておかないと辛そう
  • あと最近 AtCoderC++ で頑張っているので
    • 入力のサイズや範囲に敏感になっている気がする
      • Go は int32, int64 のように明示的に型でビット数を指定可能なのかとか
      • 巨大な csv ファイルを開いたらメモリが不味いんじゃないかとか(軽く調べ感じだと Go がよしなにやってくれる+ユースケースとして想定外なので結局特に手は打っていないが...)
    • C / C++ のように素朴に構造化プログラミングするのが馴染んできている気がする