運任せに、次に取り掛かることを決めよう

Tags : Bash   タスク管理  

楽しい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では星の有無を切り替えることができますので、星が付いているタスクがあれば、それを優先しています。