Konboi Note

JustFocus×watchcat ~ pomodoroの回数を自動でpixelaに記録する ~

はじめに

ここ最近は COVID-19 の影響で原則自宅勤務のため、自宅から仕事をしています

はじめての本格的なリモートワークなため最初の頃はペースが掴めず、働いた以上の疲労感を感じてしまうことがありました

しかし、ポモドーロテクニックを取り入れてからは、ちょっとずつリズムが掴めて来たように思います

(きちんとした椅子を購入したからなだけかもしれません w)

この記事では、どんなツールを使ってポモドーロしているかを紹介したいと思います

PomodoroTimer 期

はじめは ISUCON チームメンバーの 1 人である@hilotterが作った

PomodoroTimer

を使っていました

このツールのいい点は、なんと言ってもpixelaと連携し作業ログを残すことができる点です (ブログ記事)

ただ、自分の場合はポモドーロ終了の通知が来ても

  • あともう少しだけ
  • 切りが悪い…からもうちょい
  • etc

と作業をなんだかんだ継続してしまい、気付くと結構な時間が経過しているということがありました

JustFocus×watchcat 期

そこで丁度よいアプリは無いかなと思って調べてよさそうだったのが

JustFocus

です

1pomodoro 終了したら、この用にグレーな画面で覆われて強制的に休憩させられます

ただし、画面が覆われても、ワンクリックでポモドーロを再開/中止できるので緊急な対応中でも問題はなく、ついつい作業を続けてしまう自分にはぴったりでした

ただ、このアプリは pixela と連携することができませんでした… (まぁ、できる方が稀だと思いますw)

そこでなんとかして JustFocus を pixela と連携してみることにしました

pixela 連携

幸いなことに JustFocus はどんな操作がされたかをログに出力しています

log の一部

23:14:11.929 INFO JFASCommands.performDefaultImplementation():82 - Will start a Pomodoro timer.
23:14:11.929 INFO JFApp.shortBreak():238 - shortBreak
23:14:15.317 INFO BreakViewController.clickedStopTimerButton():493 - clickedStopTimerButton
23:14:15.318 INFO JFApp.stopBreak():396 - Stop break timer manualy
23:15:22.691 INFO JFASCommands.performDefaultImplementation():14 - Perform command: JustFocus.JFPomodoroCommand
23:15:22.691 INFO JFASCommands.performDefaultImplementation():63 - Will start a Pomodoro timer.
23:15:22.692 INFO JFApp.startPomodoro():192 - startPomodoro
23:15:34.252 INFO JFASCommands.performDefaultImplementation():14 - Perform command: JustFocus.JFPomodoroCommand
23:15:34.252 INFO JFASCommands.performDefaultImplementation():59 - Timer is running, won't respond to this action.
23:16:21.606 INFO JFASCommands.performDefaultImplementation():14 - Perform command: JustFocus.JFPomodoroCommand
23:16:21.606 INFO JFASCommands.performDefaultImplementation():59 - Timer is running, won't respond to this action.
23:16:22.406 INFO JFASCommands.performDefaultImplementation():14 - Perform command: JustFocus.JFStopTimerCommand
23:16:22.406 INFO JFASCommands.performDefaultImplementation():31 - Will stop current timer.
23:16:22.406 INFO JFASCommands.performDefaultImplementation():35 - Will stop Pomodoro timer
23:16:22.408 INFO JFASCommands.performDefaultImplementation():46 - Timer stopped.
10:18:45.844 INFO JFASCommands.performDefaultImplementation():14 - Perform command: JustFocus.JFPomodoroCommand
10:18:45.844 INFO JFASCommands.performDefaultImplementation():63 - Will start a Pomodoro timer.
10:18:45.844 INFO JFApp.startPomodoro():192 - startPomodoro
10:31:59.481 INFO JFASCommands.performDefaultImplementation():14 - Perform command: JustFocus.JFShortBreakCommand
10:31:59.481 INFO JFASCommands.performDefaultImplementation():82 - Will start a Pomodoro timer.
10:31:59.481 INFO JFApp.shortBreak():238 - shortBreak
10:37:16.757 INFO JFApp.startPomodoro():192 - startPomodoro
11:02:16.075 INFO JFApp.shortBreak():238 - shortBreak
11:09:04.218 INFO BreakViewController.clickedStopTimerButton():493 - clickedStopTimerButton
11:09:04.219 INFO JFApp.stopBreak():396 - Stop break timer manualy
11:09:08.526 INFO JFASCommands.performDefaultImplementation():14 - Perform command: JustFocus.JFStopTimerCommand
11:09:08.526 INFO JFASCommands.performDefaultImplementation():27 - Timer is not running, won't respond to this action.
12:24:11.547 INFO JFApp.showPreferences():405 - showPreferences
12:25:20.058 INFO JFApp.showPreferences():405 - showPreferences

そこでログを監視し pomodoro が終了したログが出力されたら pixela に記録することにしました

今回はログの監視に tkuchiki/watchcat を使用しました

(ちなみに tkuchiki/watchcat は tkuchiki が作った ISUCON 用便利ツールです)

daemonize は手元の mac で動かしたいので launchd を使用しました

設定ファイルは以下のような感じです

  • record.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>com.github.com.Konboi.pomodoro</string>
    <key>ProgramArguments</key>
    <array>
      <string>/some/path/launchd.sh</string>
    </array>
    <key>StandardOutPath</key>
    <string>/some/path/log/launchd.sh.log</string>
    <key>StandardErrorPath</key>
    <string>/some/path/log/launchd.sh.err.log</string>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>
  • launchd.sh
#!/bin/bash

watchcat --interval=60s --no-changed=1  --filesize=1 --file /some/path/
justfocus.log -c post.sh
  • post.sh
#!/bin/bash
export PIXELA_USER_TOKEN=<PIXELA_USER_TOKEN>
cat - | (grep shortBreak && ( if [ $? -eq 0]; then pi pixel increment -u <USER> -g <GRAPH>; fi)) || true

あとは launchd の設定ディレクトリに plist を置いてあげて load してあげれば動くと思います

$ launchctl load record.plist

設定を変更するときは unload してから設定を修正してから再度 load してあげます

$ launchctl unload record.plist

さいごに

最近はこんな感じで pomodoro を使って仕事をしています という紹介でした

launchd 使ったの始めてでしたが、意外とすんなり動いてよかったです

そして気軽に記録できる pixela は偉大だ…と改めて思いました

アジャイルな時間管理術 ポモドーロテクニック入門
Staffan Noeteberg, 渋川 よしき, 渋川 あき
アスキー・メディアワークス
売り上げランキング: 366,732