Gomodoro 0.2.0 Release!!

github.com

コマンドラインからポモドーロをすることが出来るgomodoroの0.2.0をリリースしました🎉🎉

リリース内容

  • ちゃんとしたCLIにするための基盤作成
  • 残り時間をかえすコマンドの提供

一つずつ紹介していければと思います。

ちゃんとしたCLIにするための基盤作成

ちゃんとしたCLIってなんだ?だと思うのですが、僕の中の定義としては複数の機能がサブコマンドとして提供されていて(例えばパッケージを管理するCLIInstall, update, listのようなサブコマンドが提供しているイメージ)、それぞれにオプションを渡せるしCLI共通で使うグローバルなオプションも指定できたりする。
つまりコマンドラインからの操作性が良い感じのやつですかねw
今までのgomodoroではコマンドラインから起動する際にオプションを渡すことが出来て内部的にはgoのflagパッケージを使っていました。

単一の機能を提供し、それに対するオプションをわたすだけであればこれで十分なんですが、複数のコマンドを提供してそれぞれのオプションが指定できて、コマンドをまたぐグローバルなオプションがあってとなると管理が大変になるなと。。。

他のGoのCLIではどうしてるんだろうということで見てみるとどうやらurfave/cliが良さそうということでこれを今回は採用しました。
urfave/cliについては以前書いた記事があるのでそちらを参考にしてください。

hatappi.hateblo.jp

これにより良い感じのCLIを作るための環境が出来上がりました。

$ gomodoro -h
NAME:
   Gomodoro - Pomodoro Technique By Go

USAGE:
   gomodoro [global options] command [command options] [arguments...]

VERSION:
   0.2.0

COMMANDS:
     start    pomodoro start
     remain   Get Remain
     help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --conf-path value, -c value    gomodoro config path (default: "/hoge/.gomodoro/config.toml")
   --app-dir value, -a value      application directory (default: "/hoge/.gomodoro")
   --socket-path value, -s value  gomodoro socket path (default: "/tmp/gomodoro.sock")
   --help, -h                     show help
   --version, -v                  print the version

残り時間をかえすコマンドの提供

ちゃんとしたCLIの基盤が整ったので、メインのpomodoroをスタートするgomodoro startとは別に残り時間を取得するgomodoro remainコマンドを作成しました。

とりあえず複数のコマンドを提供したいから作ったという理由もあるのですが、別の用途として今回は作成しました。
それは次のエントリで書こうと思います。。。

仕組みですが、残り時間をかえすコマンドの提供で考えないといけないのが残り時間をどう共有するかです。
gomodoro startコマンドで残り時間の管理をしているのですが、gomodoro remainコマンドで別プロセスをたてるので何かしらこのプロセス間で残り時間を共有する必要があります。

これを実現するために今回はUNIX Domain Socketを利用しました。
GoではSocket通信も標準のnetパッケージで提供されているので、これを使って作成することが出来ます。
UNIX Domain Socket以外にもTCPとかもあります。

net - The Go Programming Language

残り時間を管理している側で次のようなプログラムを起動します。

   listener, err := net.Listen("unix", socketPath)
    if err != nil {
        panic(err)
    }

    for {
                // 通信があるまでまっている
        conn, err := listener.Accept()
        if err != nil {
            panic(err)
        }

        go func() {
            defer conn.Close()

            min, sec := timerClient.GetRemainMinSec()
            sendMsg := fmt.Sprintf("%02d:%02d", min, sec)
                        // レスポンスとして残り時間をかえす
            conn.Write([]byte(sendMsg))
        }()
    }

次に残り時間を取得する側です。

        // ソケットを介して通信を開始する
    conn, err := net.Dial("unix", socketPath)
    if err != nil {
        return err
    }
    defer conn.Close()

    reply := make([]byte, 1024)

        // レスポンスとしてうけとった時間をreplyにあてる
    _, err = conn.Read(reply)
    if err != nil {
        return err
    }

    fmt.Printf("%s", reply)
    return nil

これで好きなタイミングでコマンドラインからgomodoro remainとうつと残り時間を取得することが出来るようになりました。

最後に

今回はgomodoroのv0.2.0で提供した機能について書きました。
今後もちょこちょこアップデートしていこうと思うので、そしたらまた書きます。