Speee Advent Calendar 2017の4日目の記事です。
3日は新しいアルゴリズムをリリースするまでのモロモロでした!
はじめに
今回は以前作成したGoで作ったPomodoro、その名も「Gomodoro」を一ヶ月開発、運用したのでそのことを書こうと思う。
今日話すこと
- 技術的じゃない話
- 技術的な話
技術的じゃない話
そもそもGomodoroとは?
Go + Pomodoro = Gomodoro
Pomodoroの説明を簡単に書くと
- タスクを選んで25分のキッチンタイマーを設定
- ひたすらタスクに集中
- 5分程度休憩
- 2,3 回繰り返した後は長めの休憩(15分とか)をとる
を繰り返すもの。
詳しく知りたい方は「ポモドーロ・テクニック」とかでぐぐると一杯出てきます。
これをGoで書いてコマンドラインで実行できるようにしたものがGomodoro。
開発動機
理由は2つあって
1つはポモドーロテクニックで良い感じのがなかったから自分で作ろうと思ったこと。
もう1つがGoの勉強をしたくて題材を探していた。
この2つが重なって作ることにした。
後者の動機で何かを作る時は結構ある。
例えばRailsで色々試すために自宅向けのサービス作ってあれこれ機能追加してみたりAWS移行してelasticbeanstalk使ってDocker上で動作させたり色々。
運用してみないと分からないこともあるので、最初はやってみてでも良いけど運用してみてどうだったかみたいなのを体験するためによくこの方法をやる。
1ヶ月運用してみて(技術的じゃない話)
Gomodoroはサブ機能としてタスクにかけた時間を自動的にTogglに連携出来るようにしてあるんだけど、これが結構気に入っている。
Toggl単体で一時期使っていた時期があるが、全く続かなかった。
続けば自分が何に時間を使っているかとかが分かるので良いデータになるんだろうけどタイマーを止め忘れたり、そもそも始め忘れたりとかあって、そのうち面倒になってやらなくなった。
そんな面倒臭がりな自分でもGomodoroは裏で勝手に連携してくれるのでTogglの存在を意識しなくても良い!!
(ちなみにポモドーロは自分は常にやってるのでそれが前提とはなりますが。。。)
開発するモチベーションで言うと自分が一番のユーザーなのでこの機能ほしいとか、ここバグってるみたいなのは自分で発見して改善できるので楽しい!
自分が1ユーザーのものを作るのは良い!
技術的な話
なんでGoなのか?
技術的じゃない話のほうでGoの勉強をしたいと書いた。
もうちょっと技術的な理由を話すと今回はポモドーロなのでタイマー機能が必要になるが、同時にキー入力もうけつけてタイマーを一時停止したり終了したりみたいなことがしたかった。
Rubyでも出来るかもしれないけどGoでgoroutineを使うとこれを実現しやすそうだなと思ったので採用してみた。
開発するにあたって
Goでコマンドラインツールなんて作ったことがなかったのでイメージの近いものをまず参考にした。
pecoが提供しているあのインターフェースはnsf/termbox-goで実現されていてターミナル上の任意の座標に文字を出力できる。背景色も変えたり出来る。
写経とまではいかないけど、必要そうな機能のソースを読んで自分で書いてみてそれを本体に組み込むイメージ。
一ヶ月運用してみて(技術的な話)
集中しすぎて終了したことに気づかない問題
Gomodoroはリリース当初は終了時にデスクトップ通知をしていた。
ただタスクに集中しすぎて終了したことに気づかないことが多々あったので改善をすべく終了時にベルを鳴らしてみた。音を出すこの解決策自体は自分は今のところ合っている。
音自体は今後使う人が好きな音に変えられることも考えて音声ファイル(今回はmp3)を使うことにした。
ただGoはバイナリを配布すれば動くのが良いのでmp3も一緒に配布するみたいなの嫌だったのでjteeuwen/go-bindataを使ってmp3をバイナリでGoのソースに埋め込んだ。
その時書いた記事は「Goでファイル系のリソースも一緒にビルドして配布しちゃう! 」
これでreleasesから任意のバージョンのバイナリをダウンロードすれば使えるようになるのを実現した。
Cのライブラリを使い始めた時のクロスコンパイル問題
音を出すためにhajimehoshi/otoというGoのパッケージを使っていて、これが中でALSA(Advanced Linux Sound Architecture)のライブラリを使用していてこれがCが使われているのでgo build
する時はgccとかでコンパイルする必要がある。
GomodoroはLinux, MacOSの32, 64bitに対応させているので、クロスコンパイルする時は32, 64bitのパッケージをインストールしておく必要があった。さらにUbuntu上でコンパイルさせているのでMacSDKとかでコンパイラも必要だったりした。
その時に書いた記事は「GoでCのライブラリを使ったプログラムをクロスコンパイルする」
Goのパッケージどう切るか問題
小規模のものであれば1つのファイルにベタっと書いてしまうのも良い。
ただ中・大規模の場合は1つのリポジトリで管理するにしてもパッケージで分けたりしないとテストとかもしずらくなってしまう。
パッケージを分けることについては以前メルカリTechConf2017でいった時に聞いた次の話を参考にした。
今回は上の資料に記載されているFlat Packagesを意識して書いたつもり。
パッケージの名前とかどうするかについてはgophercon2017でHeroku社の@freeformzさんが発表されたGo Anti-Patternsを参考にして書いた。
パッケージ名は内容を記載するものではなく目的を記載するもの
後は本家がどういう感じでパッケージを分けてるのかも参考にしたりする。
ここらへんはまだしっくり来てないので色々試したりする。
最後に
個人で技術検証したり出来るものがあると記事見て「あぁなるほどね!」みたいなのではなくて実際に試してみるかみたいな時に試せるので良い感じ