いつかやりたいことをまとめたリストをWishリストと呼ぶらしい。
作っただけでは忘れ去ってしまうので今回はWishリストのリマインダーシステムを作りたい。
いつこれをするという確定したスケジュールであればカレンダーに入れてしまえば良いんだけど、いつかやりたいので時々思い出したいみたいな微妙な案件って結構あると思う。
そういうのを、例えば1か月後にリマインドしてくれる仕組みが欲しい。
それも単発ならカレンダーで済むんだけど、そのワンアラームを無視してしまったらおしまいなので、設定した期限が到来すると、以降は明示的にリスケするまでしつこくリマインドするような仕組みを作りたかった。最近作った目覚ましのスヌーズと同じ考えである。
目覚まし時計の話はこちら。
thom.hateblo.jp
さて、今回思いついたのがWindowsのトースト通知を使うアイデア。あれ地味だけど意外と注意を引く。
1回じゃ見逃してしまうことが多いけど、しつこく何度も表示されたらさすがに気になって確認する。
在宅時は基本PCの前にいるのでちょうど良さそうだ。
てことで出来たがって運用中の図がコレ。
PythonでWindows通知を扱うにはplyerモジュールが必要なのでpipでインストールしておく。
※最初playerだと思ってインストールしたら別物だったのでスペル注意。
コード:pynotify.pyw
※拡張子pywは見慣れないと思うけど、こうしておくと関連付けプログラムがpythonwとなるので実行時の黒い画面が出ない。
import os import glob from datetime import datetime as dt from plyer import notification base_path = os.path.dirname(os.path.abspath(__file__)) files = glob.glob(os.path.join(base_path,"tasks\*")) cnt = 0 for file in files: str_task_time = os.path.basename(file)[0:16] task_time = dt.strptime(str_task_time, "%Y_%m_%d_%H_%M") if dt.now() > task_time: cnt += 1 if cnt > 0: notification.notify( title="Reminder", message=str(cnt)+" 個の期限切れタスクを処理してください。\n"+base_path+r"\tasks", app_name="Py Notify", app_icon=r"C:\Users\ho_\dev\pytodo\notify.ico", timeout=10 )
使い方
注意)いつものとおり、私が自分で使えれば良いのでユーザーフレンドリーではない。
フォルダ構成としては上記のスクリプトと同じ階層にnotify.icoという任意のアイコンとtasksフォルダを用意し、tasksフォルダ内にはyyyy_mm_dd_HH_MM_タスク名.txtの形式でタスクごとにファイルを保存しておく。
例)
このスクリプトを実行した際、ファイル名の日次が現在時刻よりも古い場合は期限切れタスクとしてカウントされ、期限切れタスクが1つでもあればWindows通知が出るという仕組み。
そしてこれをWindowsタスクスケジューラーで定期実行する。
なおタスクスケジューラ自体はググれば使い方分かると思うので固有の設定のみ紹介。
トリガーはこんな感じ。
私の場合在宅勤務もあるので、勤務中に発生しないよう毎日18時に起動して5分毎に実行され、4時間有効(つまり22時まで通知が続く)という設定にしている。
操作はこんな感じ。
※pythonwにすること。pythonでも動くけど黒いコマンド画面が表示されてしまうのでダサい。
これで一応リマインドシステムのアルファ版は完成としよう。
ただまぁ、リスケするのに逐一手でファイル名を修正するのが面倒なのでそのあたりはドラッグ&ドロップするとn日リスケするスクリプトとか、そういう方向性で思案中。
おわりに
リマインダーなんて探せばいくらでもありそうなもんだけど、意外とピンとくるものが無い。
リマインドを受け取っても1回確認したらおしまいというものが多い。どれもこれも、人の自由意志に信頼を置きすぎている。
リマインドにおける「確認した」は実に不確実である。私みたいな怠惰な人間に、そんな簡単に確認ボタンなんて押させちゃいけないんだ。
すでに完了したものについて既定の手順を踏んで解除 or 次のリマインドを再指定する以外の選択肢はない方が良いと思う。
これが今回自分で構築しようと思った理由である。
以上。