ggdG:wq

個人的なメモとか書いてます。

Go言語でコマンドラインで動くポモドーロタイマー作った

Go言語で何かコマンドラインツール作ってみたかったので、ちょうど欲しかったポモドーロタイマー作った。

gomato

作成の動機

そもそもポモドーロタイマーは普段からスマホアプリで使っていたが、

  • 広告が出てくる事
  • タイマー止めるときにスマホを見るせいで「メッセージ返信してたら休憩時間を無視してた」ってなる

という問題があったため、

  • PCで使える
  • 出来たら一番見ることの多いコマンドラインツールで作りたい
  • ポモドーロ数を集計してグラフにして欲しい

という上記3点を満たすポモドーロタイマーを探していた。

Webアプリとかだと見つかるが、コマンドラインツールだと3つ目の集計してグラフにする という部分を解決してくれる物が見つからなかったので自作に至った

Goを選んだ理由は使ってみたかったから。 後は、Goでコマンドラインツールを作っている人が最近は多そうだったので情報が集まりやすいだろうという 見込みでGoを選んだ。

結果はGoで作って正解だったと思う。

作成する上で詰まった部分とか諸々

タイマー処理

とりあえずタイマー部分は sethgrid/multibar を利用させて頂いた。 若干今回の希望に沿わない部分があるのでここは後で自作するかも

この辺りでゴルーチンと少し仲良くなれた気がする。

JSONに保存する所

JSONをGoで扱うには構造体を定義してやるのが一般的らしいので調べつつやった。 これは調べれば記事が沢山出てくるので色々試してみれば理解できる。

後日メモとして記事に残すかも?

保存する処理の部分でキーイベントを取得して保存後os.Exit(1)するようにしたが、これが良いのか悪いのか分からない。 最初、保存する前にos.Exit(1)が処理されてしまい、データが消える事があった。

この辺り↓が関係している気がする。

os.Exit()とdefer

保存処理としてioutil.WriteFile()を使っている。 とりあえずos.Exit(1)をループ抜けてから呼ぶようにしてからデータが消えない。

とりあえず希望通りの動作はするようになったのでまぁ、合ってるだろう。

httpサーバー

ポモドーロ数を集計してグラフにする部分で表示するためにhttpサーバーを立てたかった。 今回はGinを使用した。 当初はnet/httpを使おうとしていたが、シンプルで分かりやすいサンプル記事がGinで見つかったのでGinを採用

Ubuntu 16.04 に GoLang 1.6 と Gin Web Framework をインストールし、HTMLテンプレートを読み込むまで

割とサクッと出来た。

サブコマンド、ヘルプの作成

urfave/cliを使用した。 Golang コマンドラインツール とかって調べると大体これを使った記事が出てくる。大変よい codegangsta/cliと同じものっぽい。昔はcodegangstaだったとかだと思われる。 参考記事は無数にあるが、公式のREADMEが結局一番わかり易かった。サンプルも沢山ある。最高。

TUIの部分

これ、どうすれば良いか悩んでたら みんなのGo言語[現場で使える実践テクニック]termbox-goが紹介されていた。

まだ全部読めて無いけどめっちゃ参考になる。買って良かったです。

今後の課題とか

とりあえず動くようにはなって、期待していた最低限の物は完成したので公開した。

  • タイマーの表示部分は自作に変更したい。
  • グラフの表示内容として他にも幾つか用意すれば便利かなと思う。随時足していきたい。

あと、Go言語についてもう少しちゃんと勉強しようかと思った。

A Tour of Goとかやってみようと思います。