運任せに、次に取り掛かることを決めよう
楽しいBash工作の時間です。
次にどのタスクに取り掛かるか運任せに決めましょう。どれからとりかかっても、似たようなものです。
一度とりかかったら、集中力の続く時間だけ頑張って熱中しましょう。頑張り過ぎは禁物で、休憩も適当に取りましょう。だからといって、休み過ぎるとだらけます。ちゃんとしましょう。
わかっちゃいるけど面倒くさいです。ですから、そういうのはコンピューターに任せます。今回はとりあえず、Bashでどうにかしました。
#!/bin/bash job=$(shuf -n 1 -e 重要なタスク 重要なタスク 重要なタスク 普通のタスク1 普通のタスク2 普通のタスク3 気になっているタスク 気になっているタスク) # 一回あたりの作業時間 work=30 # 何分前に予告するか notice=5 # 休憩時間 rest=15 kdialog --msgbox "${job} 開始!!" nohup sh -c "sleep $(($work - $notice))m && export DISPLAY=:0.0 && export LANG=ja_JP.UTF-8 && kdialog --msgbox あと5分で休憩です。そろそろまとめましょう。" &> /dev/null & nohup sh -c "sleep ${work}m && export DISPLAY=:0.0 && export LANG=ja_JP.UTF-8 && kdialog --msgbox 休憩開始!!" &> /dev/null & nohup sh -c "sleep $(($work+$rest))m && export DISPLAY=:0.0 && export LANG=ja_JP.UTF-8 && kdialog --msgbox 休憩終了!!" &> /dev/null &
shufはランダムにテキストを選択するコマンドです。-n 1
で「一文」選ぶように指示しています。-e
により、その後の引数が、選択対象の文字列であると指定しています。コードに書くのが嫌ならば、テキストファイルで用意し、そのファイルを-f
で指定する方法もあります。
「重要なタスク」を3つ登録しています。3つ登録してその他のタスクより3倍の確率で引っかかるようにしています。同様の理由で「気になっているタスク」を2つ登録しています。
その後、kdialogを使いメッセージボックスでランダムに選択されたタスクを表示しています。メッセージBOXのOKボタンをクリックするまで、実行は止まっています。今までとりかかっていたタスクから、次のタスクへ切り替えるには手間がかかることもありますので、準備が整ったらOKしましょう。
すると、一回の作業時間の終わりに終了を告げる「休憩開始」、その5分前に「もうすぐ終了」、作業時間+休憩時間に「集計終了」のメッセージボックスを出しています。もともとatコマンドを使っていたのですが、最低一分単位のコントロールしかできないため、より正確なタイマーとしてsleepを使用してます。
私はLinuxのディスクトップ環境としてKDEを使用しているため、kdialogなのですが、他のディスクトップやMACを使う場合は、それに合ったUIコマンドを利用してください。
kdialogの前のexport文は、shを利用しバックグランドで実行しているのですが、UIを表示するための環境が引き継がれないため、新たに設定するためのおまじないだと思ってください。
これはこれで便利なのですが、タスク管理ツールやWebサービスを利用している場合、わざわざタスクをコマンド内、もしくはテキストファイルに書くというのは二度手間です。そうしたサービスなりツールなりから、情報を引っ張ってきて、それをランダムに選択し、表示するとより便利です。
そこでタスク管理サービスのWunderlistの特定のリストに存在するタスクから、取得するように改造したのが、次のBashスクリプトです。
#!/bin/bash # Wunderlist OAuth2 クライアントID client=8c8c8c8c8c8c8c8c8c8c8c # Wunderlist OAuth2 アクセストークン token=4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4bb4b4b4b4b4b4bb4b4b4b # 対象リスト list=取り掛かり中 # Wunderlistの全リストを取得し、今回利用するリストのidを取得する listid=$(curl -s -H "X-Access-Token: ${token}" -H "X-Client-ID: ${client}" https://a.wunderlist.com/api/v1/lists | jq -r ".[] | select(.title == \"${list}\") | .id") # リスト上のタスク取得 tasks=$(curl -s -H "X-Access-Token: ${token}" -H "X-Client-ID: ${client}" "https://a.wunderlist.com/api/v1/tasks?list_id=${listid}" | jq '.') # タスクがなければアボート if [ "${tasks}" = "[]" ] then echo タスクがありません 1>&2 exit 1 fi # 星付きタスクの抽出 dotasks=$(echo $tasks | jq -r '.[] | select(.starred == true) | .title') # 星付きがなければ星なしを抽出 if [ -z "${dotasks}" ] then dotasks=$(echo $tasks | jq -r '.[] | select(.starred == false) | .title') fi # 1つ選択 job=$(shuf -n 1 -e ${dotasks}) # 一回あたりの作業時間 work=30 # 何分前に予告するか notice=5 # 休憩時間 rest=15 kdialog --msgbox "${job} 開始!!" nohup sh -c "sleep $(($work - $notice))m && export DISPLAY=:0.0 && export LANG=ja_JP.UTF-8 && kdialog --msgbox あと5分で休憩です。そろそろまとめましょう。" &> /dev/null & nohup sh -c "sleep ${work}m && export DISPLAY=:0.0 && export LANG=ja_JP.UTF-8 && kdialog --msgbox 休憩開始!!" &> /dev/null & nohup sh -c "sleep $(($work+$rest))m && export DISPLAY=:0.0 && export LANG=ja_JP.UTF-8 && kdialog --msgbox 休憩終了!!" &> /dev/null &
WunderlistのAPIをcurlで叩き、帰ってきたJSONをjqで処理しています。
WunderlistのOAuthのクライアントIDとトークンの取得方法は他のサイトでも説明されていますので、省略します。
まず自分の全リストを取得し、jqで利用するリストの情報をタイトル(リスト名)から選択し、そのidを求めます。続いて、そのリストidをもとにして、リスト上の全タスクを取得しています。
Wunderlistでは星の有無を切り替えることができますので、星が付いているタスクがあれば、それを優先しています。