見出し画像

AutoHotkeyでmocriの「集中モード」を再現してみた

前回から引き続き、今度はmocri(もくり)の神機能「集中モード」AutoHotkeyで再現したいと思う。

mocriの「集中モード」とは、作業時間と休憩時間を5分単位で設定し、その時間通りにアラームを鳴らしてくれるというもの。

単純な仕掛けながら、その効果は侮れない。

私には過集中の癖があり、ぶっ倒れるまで作業をしてしまいがちなのだが、「集中モード」中は適度に休憩を促してくれるため、これを使った日は倒れずに済んでいる。

この「集中モード」、時間設定の初期値が「作業時間25分、休憩時間5分」なのだが、調べてみるとこの時間設定はポモドーロテクニックという時間管理術に基づくもののようだ。

集中力と休憩のタイミング - FLOW会計事務所 (flow-kaikei.com)

上記の記事によれば、ほかにもウルトラディアンリズムと呼ばれる体内時計の1つとして、「作業時間90分、休憩時間20分」という時間設定もおすすめらしい。

つい時間を忘れて集中してしまう私には、こちらのほうが向いているかもしれない。

ということで、これら舌を噛みそうな2種類の時間間隔でタイマーをセットできる、AutoHotkey版「集中モード」を作ることにした。


始める前にひとつ、クリップNOTEを再現した際の反省点として、初めに大まかな設計をするべきだったというものがある。

行き当たりばったりで作り始めたせいで、何を、どこに、どんなふうに組み込めば完成するのかがわからなくなってしまったわけだ。

そこで今回は、作り始める前に以下のような再現したいポイントをまとめておいた。

  1. タイマーを設定(入力?ボタン?時間固定?)

  2. 集中タイマー開始

  3. タイマー終了時に音かダイアログで知らせる

  4. 休憩タイマー自動開始

  5. 2から繰り返す

  6. いつでも終了できる(ダイアログ内のボタン?ショートカットキー?)

文字ばかりでハテナも多く、設計書としてはかなり頼りないが、作業の折々に予定していた機能を実装できたかどうかをチェックするチェックリスト的な使い方をすることで、それなりに役には立った。

何よりも、最初に全体像を思い描くことは想像以上に作業負荷を軽減させた。

実際のコーディングの順序を考え、なんとなく箇条書きにしたところ、後述する完成品もわりとその通りになった。

たとえいい加減でも地図(設計)さえあれば、そこまで道に迷うことなくゴール(完成)はできるのだ。


よし、今回は先に完成コードを出してしまおう。まずはこちらである。

;▼Homeキー=集中・休憩サイクルタイマー起動
Home::Run, CycleTimer.ahk

普段使わないHomeキーをトリガーに、「CycleTimer.ahk」なるAutoHotkeyスクリプトファイルを呼び出している。

タイマー機能のスクリプトは別の場所に用意するわけだ。

こちらを含む今回のアイデアの多くは、以下のページから頂戴したものである。

[AutoHotKey]InputBoxで作る超シンプルタイマー (pouhon.net)


では、肝心の「CycleTimer.ahk」の中身を見ていこう。

長いので、一区切りずつとする。

;▼呼び出される集中・休憩サイクルタイマーの内容
Title := "作業集中タイマー"
menu:
Gui, 1:Add, Button, Gultra,長時間集中モード:「90分作業・20分休憩」、作業中30分毎に通知
Gui, 1:Add, Button,wp Gpomodoro,短時間集中モード:「25分作業・5分休憩」、4周後に15分休憩
Gui, 1:Add, Button,wp Gend,終了する
Gui,1:Show,,%Title%
return

この部分を含めGUIコマンド記述の根幹は、以下のページを参考にした。

AutoHotkey で GUI ダイアログを作る | つぼログ。 | 横浜で翻訳業務を行うシーブレインスタッフによる技術情報ブログ (c-brains.jp)

ここでは最初に、下図のようなメニュー選択のダイアログが表示される。

ポモドーロテクニックの短時間集中モード、ウルトラディアンリズムによる長時間集中モード、そして終了の三択のボタンを設置している。

余談だが、実は「終了する」ボタンの設置によって、再現ポイント6番「いつでも(タイマーを)終了できる」が思いがけず叶ってしまった。

当初、この基本的なボタンとは別に、「何らかのキー入力によるスクリプトの終了」というコマンドを用意しなければならないものと想定していたところ、起動中にHomeキーでタイマー再起動→終了ボタン押下で事が済むことに気がついたのだ。

スマートな方法ではないが、「何らかのキー入力によるスクリプトの終了」のコマンドを記述する苦労に比べたら、多少の不格好さなど気にもならない。

私しか使わないのだから、私が品質保証の全権を握っているのである。


次に、先のコードで指定した「pomodoro」と「ultra」というラベルのうち、「pomodoro」が示す内容がこちらだ。

(モード選択の表示の順番があべこべだったのは見逃してほしい)

pomodoro:
;▼短時間集中(ポモドーロテクニック)の処理
Gui,1:Destroy
SetWt := 60000 * 25	;ワークタイム設定(分)
SetBt := 60000 * 5	;ブレイクタイム設定(分)
SoundPlay, C:\Windows\Media\Windows Notify Calendar.wav
ToolTip, タイマー開始
Sleep, 3000
ToolTip

	Loop, 3	;3回繰り返す
	{
	sleep, %SetWt%	;25分停止
	SoundPlay, C:\Windows\Media\Alarm04.wav
	MsgBox, ,%Title%,25分経過。`n休憩の時間です。
	
	sleep, %SetBt%	;5分停止
	SoundPlay, C:\Windows\Media\Windows Notify Calendar.wav
	MsgBox, ,%Title%,5分経過。`n作業に戻ってください。
	}

sleep, %SetWt%	;25分停止
SoundPlay, C:\Windows\Media\Alarm05.wav
MsgBox, ,%Title%,約2時間お疲れ様でした。`nゆっくり休みましょう。

SetBt := 60000 * 15	;ブレイクタイム変更(分)
Sleep, %SetBt%	;15分停止
SoundPlay, C:\Windows\Media\Windows Logoff Sound.wav
MsgBox, ,%Title%,15分経過。`nタイマーを再設定してください。
goto, menu	;最初のメニューに戻る
return

日本語に訳すと、以下のようになる。

  1. 音とともに「タイマー開始」のツールチップが出る

  2. 25分後、音とともに「25分経過」のダイアログが出る(下図参照)

  3. さらに5分後、音とともに「5分経過」のダイアログが出る(下図参照)

  4. 2~3を3回繰り返す

  5. 25分後、音とともに「約2時間お疲れ様でした」のアイアログが出る

  6. 15分後、音とともに「15分経過」のダイアログが出る

  7. 最初の三択メニューに戻る

25分はあっという間に過ぎる。
休憩時ぼーっとしすぎると、これが出ていることに気づけない。

ちゃんと「25分作業→5分休憩→4回繰り返し→15~30分休憩」のポモドーロテクニック通り(最後の5分休憩は端折ったが)のタイマーが出来上がった。

これまた、当初はSetTimerコマンドを使ったタイマー機能を実装するつもりがうまくいかず、結局は先のOutput 0.1さんの記事を参考にSleepコマンドで処理を停止させるだけの簡易タイマーに落ち着いた。

SleepだとほかのAHKスクリプトが動かなくなるのではないかと危惧していたが、本体コードを別ファイルに記述していたおかげか、そんなことにはならなかったからだ。(しかも取り扱いがめちゃくちゃ簡単)


最後に、「ultra」ラベルの内容と、おまけの終了処理である。

ultra:
;▼長時間集中(ウルトラディアンリズム)の処理
Gui,1:Destroy
SetWt := 60000 * 30	;ワークタイム設定(分)
SetBt := 60000 * 20	;ブレイクタイム設定(分)

SoundPlay, C:\Windows\Media\Windows Notify Calendar.wav
ToolTip, タイマー開始
Sleep, 3000
ToolTip

	Loop, 2	;2回繰り返す
	{
	sleep, %SetWt%	;30分停止
	SoundPlay, C:\Windows\Media\Alarm04.wav
	MsgBox, ,%Title%,30分経過。`n別の作業をしませんか?
	}

sleep, %SetWt%	;30分停止
SoundPlay, C:\Windows\Media\Alarm05.wav
MsgBox, ,%Title%,90分間お疲れ様でした。`nゆっくり休みましょう。

Sleep, %SetBt%	;20分停止
SoundPlay, C:\Windows\Media\Windows Logoff Sound.wav
MsgBox, ,%Title%,20分経過。`nタイマーを再設定してください。
goto, menu	;最初のメニューに戻る
return

end:
Gui, Destroy	;ダイアログを閉じる
return

ほぼ「pomodoro」と仕組みは一緒だが、一応訳すと以下の通り。

  1. 音とともに「タイマー開始」のツールチップが出る

  2. 30分後、音とともに「30分経過」のダイアログが出る

  3. 2を2回繰り返す

  4. 30分後、音とともに「90分間お疲れ様でした」のダイアログが出る

  5. 20分後、音とともに「20分経過」のダイアログが出る

  6. 最初の三択メニューに戻る

ウルトラディアンリズムにおける90分間の集中では、30分区切りで異なる作業をしたほうが良いらしいので、そのように考慮した。

そして、最初の三択のときに「終了する」を押すと、ダイアログを閉じる「end」ラベルが処理される。


以上、mocriの「集中モード」完全再現達成である。

あからさまに嘘である。無論、この再現は完全ではない。

しかし、私が欲しかった一番の機能とは、この「集中モード」っぽいものを、ブラウザもアプリも立ち上げずに簡単かつ瞬時に起動させることだったため、目的は十分に達成されたと言えよう。

さらに今回は、出来上がったツールそのものよりも、その制作過程で学んだ事前設計の大切さポモドーロテクニック等の雑学知識のほうに、より高い自己満足感を感じている。


さて、作業を捗らせるためのツールを作る作業の備忘録を書く作業もこれでおしまいだ。

このタイマー機能の休憩時にラジオ体操を流すようにしたら健康になれそうだなとか、もう「集中モード」目当てで一人きりのルームに入室する必要はないんだなとか、次noteに投稿するのは一体何年後になるやらだとか、そんな雑念は飲み下して、次の作業に向かうための英気を養うことにする。

いいなと思ったら応援しよう!

高田馬場総本山
いただいたサポートは、記事制作のモチベーションアップに使わせていただきます。