■ツールの概要
ポモドーロタイマーとは、wikipediaに記載のある通り、作業時間と休憩時間を分割し、交互に行うものである。
このテクニックではタイマーを使用し、一般的には25分の作業と短い休息で作業時間と休息時間を分割する。1セットを「ポモドーロ」と呼ぶ。これはイタリア語で「トマト」を意味する言葉で、シリロが大学生時代にトマト型のキッチンタイマーを使用していたことにちなむ。
Wikipedia:ポモドーロ・テクニックより
ここでは、コンソール画面に作業時間(分)と休憩時間(分)を入力し、交互に時間を計測(カウントダウン)していく。
※例:作業時間(25分)→休憩時間(5分)→作業時間(25分)・・・
・イメージ図
①作業時間(分)と休憩時間(分)を入力
②作業時間がカウントダウン(開始時にOS標準の音を出力)
③作業時間終了後、休憩時間をカウントダウン(開始時にOS標準の音を出力)
■制約事項・前提条件
ポモドーロタイマーを作成するにあたり、制約事項および前提条件を以下に示す。
- 動作保証するOSはMacもしくはWindows10のみとする。
- タイマーを終了させる場合は、キーボードの「ctrl + c」を押下して終了させる。
- 入力する作業時間および休憩時間は分単位の整数のみとする。
■プログラム設計
ポモドーロタイマーを実装するためのプログラム設計を以下に示す。
▼処理全体の概要
ポモドーロタイマーで使用する関数の一覧と処理の関連図を以下に示す。
・関数の一覧
関数名 | 処理概要 |
---|---|
タイマーセットアップ関数 | 作業時間(分)と休憩時間(分)を入力してもらう関数。 |
タイマー開始関数 | 入力した作業時間と休憩時間をもとに、 カウントダウンを開始する関数。 「タイマーカウント関数」を処理の中で呼び出す。 |
タイマーカウント関数 | 入力した作業時間と休憩時間をもとに、 カウントダウンする関数。 「開始音出力関数」を処理の中で呼び出す。 |
開始音出力関数 | OS(Windows10 or Mac)に依存した標準音を出力する関数。 |
・処理の関連図
▼タイマーセットアップ関数
作業時間(分)と休憩時間(分)を入力してもらう関数。
・処理フロー図
▼タイマー開始関数
入力した作業時間と休憩時間をもとに、カウントダウンを開始する関数。
・処理フロー図
▼タイマーカウント関数
入力した作業時間と休憩時間をもとに、カウントダウンする関数。
・処理フロー図
▼開始音出力関数
OS(Windows10 or Mac)に依存した標準音を出力する関数。
・処理フロー図
■サンプルコード
ポモドーロタイマーのサンプルソースコードを以下に示す。
import datetime
import os
import sys
import time
# 環境ごとにコマンドの定数を設定
# Windowsの場合は音を鳴らすためにモジュールを追加でimport
if os.name == 'nt':
CMD_CLEAR = 'cls'
import winsound
START_PLAYSOUND_NAME = 'SystemAsterisk'
END_PLAYSOUND_NAME = 'SystemExclamation'
# macの場合
elif os.name == 'posix':
CMD_CLEAR = 'clear'
CMD_START_WORK_SOUND = 'afplay /System/Library/Sounds/Blow.aiff'
CMD_START_REST_SOUND = 'afplay /System/Library/Sounds/Submarine.aiff'
# 上記以外は終了
else:
sys.exit()
# 文言の定数
MSG_CTRL_C = '終了する場合は ctrl + c を押してください'
MSG_WORK_TIME = '作業時間:'
MSG_REST_TIME = '休憩時間:'
# 開始音出力関数
def start_sound(is_flg):
# windowsの場合
if os.name == 'nt':
# 作業開始の場合
if is_flg:
winsound.PlaySound(START_PLAYSOUND_NAME, winsound.SND_ALIAS)
# 休憩開始の場合
else:
winsound.PlaySound(END_PLAYSOUND_NAME, winsound.SND_ALIAS)
# macの場合
elif os.name == 'posix':
# 作業開始の場合
if is_flg:
os.system(CMD_START_WORK_SOUND)
# 休憩開始の場合
else:
os.system(CMD_START_REST_SOUND)
# タイマーカウント関数
def count_timer(Is_flg, kind_tmp_time, msg_time):
# 開始音出力
start_sound(Is_flg)
# 時間が0になるまで繰り返し
while kind_tmp_time.strftime("%H:%M:%S") != "00:00:00":
# コンソール初期化処理
os.system(CMD_CLEAR)
# 文言と残り時間を出力
print(MSG_CTRL_C)
print(msg_time, kind_tmp_time.strftime("%H:%M:%S"))
# 1秒待機
time.sleep(1)
# 時間を1秒マイナス
kind_tmp_time = kind_tmp_time - datetime.timedelta(seconds=1)
# フラグを反転させて返す
return not Is_flg
# タイマー開始関数
def start_timer(timer_list):
# True:作業 False:休憩
is_work_time = True
# 作業時間(分)を取得
work_time = int(timer_list[0])
# 60分以上の換算処理
work_hour, work_min = divmod(work_time, 60)
# 休憩時間(分)を取得
rest_time = int(timer_list[1])
# 60分以上の換算処理
rest_hour, rest_min = divmod(rest_time, 60)
# 無限ループ
while True:
# 作業時間と休憩時間を今日日付+時刻に変換
tmp_work_time = datetime.datetime.combine(datetime.datetime.today(),datetime.time(work_hour, work_min))
tmp_rest_time = datetime.datetime.combine(datetime.datetime.today(),datetime.time(rest_hour, rest_min))
# 作業時間の場合
if is_work_time:
is_work_time = count_timer(is_work_time, tmp_work_time, MSG_WORK_TIME)
# 休憩時間の場合
else:
is_work_time = count_timer(is_work_time, tmp_rest_time, MSG_REST_TIME)
# タイマーセットアップ関数
def setup_timer():
# コンソール初期化処理
os.system(CMD_CLEAR)
# 作業時間と休憩時間を格納する配列初期化
input_timer_list =[]
# 作業時間と休憩時間を入力
input_work_time = input("作業時間(分)を入力してください:")
input_rest_time = input("休憩時間(分)を入力してください:")
# 配列に作業時間と休憩時間を格納
input_timer_list.append(input_work_time)
input_timer_list.append(input_rest_time)
# 作業時間と休憩時間の配列を返す
return input_timer_list
# メイン処理
if __name__ == '__main__':
# タイマーセットアップ関数呼び出し
input_timer_list = setup_timer()
# タイマー開始関数呼び出し
start_timer(input_timer_list)
■実行結果
・作業時間:1分、休憩時間:2分を入力した時の挙動
■参考
ポモドーロタイマーを作成するにあたり、参考とさせていただいた外部リンクおよび内部リンクを示す。
▼外部リンク
・Input関数
・コンソールクリア
・時間の計算
・winsound
▼内部リンク
・GitHub