やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Raspbianで使えるローカルToDoアプリが欲しい (TaskWarrior)

 エクスポート・インポートができるやつがいい。

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 9.0 2018-11-13

探す

Name UI
TaskWarrior CLI

手順

  1. インストール
  2. 使ってみる
  3. Hook

1. インストール

  1. インストール
  2. バージョン確認
  3. ~/.taskrcの自動生成
  4. ~/.task/の確認
  5. ヘルプ

1-1. インストールする

sudo apt install taskwarrior
この操作後に追加で 1,937 kB のディスク容量が消費されます。

1-2. バージョン確認

$ task --version
2.5.1

1-3. ~/.taskrcの自動生成

$ task --help
A configuration file could not be found in 

Would you like a sample /home/pi/.taskrc created, so Taskwarrior can proceed? (yes/no) yes

 yesを入力してEnterキー押下した。

1-4. ~/.task/の確認

 関連ファイルは~/.taskディレクトリ配下にある。

  • ~/.task
    • hook/
    • backlog.data
    • completed.data
    • pending.data
    • undo.data

1-5. ヘルプ

$ man task
$ task help

2. 使ってみる

  1. タスクを表示する
  2. タスクを追加する
  3. ステータス変更
  4. エクスポート/インポート
  5. レポートの表示

2-1. タスクを表示する

コマンド 説明
task task nextの省略形
task next 緊急度が高い順に表示
task list 保留中のタスクを表示
task all 完了したものも含めてすべて表示
task {id} 指定IDのタスク詳細を表示
task completed 完了したタスクのみ表示
task end:today all 今日完了したタスクのみ表示
task status:deleted all 削除したタスクのみ表示

 たとえば以下のような表示になる。

$ task next

ID Age  Description                     Urg 
 1 4min TaskWarriorをインストールする      0
 2 3min TaskWarriorのドキュメントを読む    0
 3 5s   TaskWarriorの使用ログを書く        0

3 tasks
$ task 1
No command specified - assuming 'information'.

Name          Value                               
ID            1
Description   TaskWarriorをインストールする       
Status        Pending
Entered       2019-02-18 14:41:13 (30min)         
Last modified 2019-02-18 15:11:09 (14s)
Virtual tags  PENDING READY UNBLOCKED             
UUID          243e5ac5-cefb-4277-8a14-678387680342
Urgency          0                                

Date                Modification                       
2019-02-18 15:06:03 Start set to '2019-02-18 15:06:03'.
2019-02-18 15:11:09 Start deleted (duration: PT5M6S).  

2-2. タスクを追加する

$ task add (任意のタスク概要)

 たとえば以下のようにする。

$ task add TaskWarriorをインストールする
Created task 1.

2-3. ステータス変更

 タスクを完了するにはtask {id} doneとする。({id}task nextで表示されたものを指定する)

コマンド 概要
task {id} start Urgency(緊急)が0から4に増加した(startせずともdoneできる)
task {id} stop Urgency(緊急)が元に戻る
task {id} done statuscompletedになる
task {id} delete statusdeletedになる

 ステータスによると以下のような状態がある。

status command
pending 保留 task add
deleted 削除 task {id} delete
completed 完了 task {id} done
waiting 待機中
recurring 繰り返し

 タスクを表示してみる。

f:id:ytyaru:20190218172944p:plain f:id:ytyaru:20190218172952p:plain

 task {id} startすると緊急度が上がり赤く表示される。

f:id:ytyaru:20190218173040p:plain

 task {id} stopすると緊急度が下がり元通り。

f:id:ytyaru:20190218173101p:plain

 task {id} doneするとステータスがpendingからcompletedに変わる。

$ task 1 done

 完了したタスクのみ表示する。

$ task completed

ID UUID     Created    Completed  Age Description                  
 - 243e5ac5 2019-02-18 2019-02-18 2h  TaskWarriorをインストールする

1 task

2-4. エクスポート/インポート

$ task export
[
{"id":1,"description":"TaskWarriorのドキュメントを読む","entry":"20190218T054218Z","modified":"20190218T064523Z","start":"20190218T064523Z","status":"pending","uuid":"0055d80d-2cff-45cf-9e07-7b0948a51543","urgency":4},
{"id":2,"description":"TaskWarriorの使用ログを書く","entry":"20190218T054533Z","modified":"20190218T054533Z","status":"pending","uuid":"45b4731f-df84-469f-ae7e-174738c7ee82","urgency":0},
{"id":0,"description":"削除するタスク","end":"20190218T061859Z","entry":"20190218T061718Z","modified":"20190218T061904Z","status":"deleted","uuid":"edd86192-5408-4a17-8cbd-c385a2ed3ad7","urgency":0},
{"id":0,"description":"TaskWarriorをインストールする","end":"20190218T061358Z","entry":"20190218T054113Z","modified":"20190218T061358Z","status":"completed","uuid":"243e5ac5-cefb-4277-8a14-678387680342","urgency":0}
]
$ task export > /tmp/work/tasks.json
$ task import /tmp/work/tasks.json

 削除するタスクのタスクだけを削除してインポートしてみたところ、以下のような応答が返ってきた。

Importing '/tmp/work/tasks.json'
 skip 0055d80d-2cff-45cf-9e07-7b0948a51543 TaskWarriorのドキュメントを読む
 skip 45b4731f-df84-469f-ae7e-174738c7ee82 TaskWarriorの使用ログを書く
 skip 243e5ac5-cefb-4277-8a14-678387680342 TaskWarriorをインストールする
Imported 3 tasks.

 タスクの内容はインポート前と変わらなかった。このことから以下のことがわかる。

  • importは既存のタスクに追加する形で行う
  • UUIDが同一のタスクは追加せずスキップする

2-5. レポートの表示

コマンド 説明
task summary 進捗バーを表示
task burndown.daily 1日あたりのタスク状態を棒グラフで表示
task status:completed count 完了したタスクの累計数

task summary

f:id:ytyaru:20190218174927p:plain

burndown.daily

f:id:ytyaru:20190218174949p:plain

task status:completed count

$ task status:deleted count
1

3. Hook

 コマンド実行時に任意のコードを実行する。

 Git Hookと同じらしい。それも使ったことがないので試しにやってみる。

  1. ファイル名
  2. 実行環境
  3. データ入出力形式
  4. 実装してみる

3-1. ファイル名

  • 規定名のファイルを作る
  • ファイル名によって対応イベントとそのタイミングが決まる
  • ファイル内容は実行するbashスクリプトである
ファイル名=イベント名+任意
イベント名 説明
on-launch 起動時。起動防止できるタイミング
on-exit 終了時。
on-add タスク新規作成時(保存前)
on-modify タスク変更時(保存前)。完了や削除もこれに含まれる

 実行順はファイル名の辞書順。

3-2. 実行環境

 pythonで実装する。入出力はCLI。つまり標準入出力。

入出力 CLI pythonコード
引数 標準入力 sys.stdin.readline()
戻り値 標準出力 print

3-3. データ入出力形式

 JSON

3-4. 実装してみる

on-add

 タスク追加時のイベント処理を実装してみる。

touch ~/.task/hook/on-modify-completed-01
chmod 755 ~/.task/hooks/on-add-00
pluma ~/.task/hooks/on-add-00

 実行可能なhookスクリプトを確認する。

$ task diagnostics
...
Hooks
     System: Enabled
   Location: /home/pi/.task/hooks
     Active: on-add-00.py              (executable)
   Inactive: 
...

/home/pi/.task/hooks/on-add-00.py

#!/usr/bin/python3
# coding: utf-8
import sys
import json

added_task = json.loads(sys.stdin.readline())
added_task['description'] = '★' + added_task['description']
print(json.dumps(added_task))
sys.exit(0)

 task add {discription}したときに実行される。タスクのdiscription先頭にを付与する。

on-modify

 タスク変更時のイベント処理を実装してみる。

touch ~/.task/hook/on-modify-00-completed.py
chmod 755 ~/.task/hooks/on-modify-00-completed.py
pluma ~/.task/hooks/on-modify-00-completed.py

 実行可能なhookスクリプトを確認する。

$ task diagnostics
...
Hooks
     System: Enabled
   Location: /home/pi/.task/hooks
     Active: on-add-00.py              (executable)
             on-modify-00-completed.py (executable)
   Inactive: 
...

/home/pi/.task/hooks/on-modify-00-completed.py

#!/usr/bin/python3
# coding: utf-8
import sys
import json

old_task = json.loads(sys.stdin.readline())
new_task = json.loads(sys.stdin.readline())
if 'completed' == new_task['status'] and 'completed' != old_task['status']:
    new_task['description'] = '▲' + new_task['description']
print(json.dumps(new_task))
sys.exit(0)

 task {id} doneしたときに実行される。ステータスがcompletedに変化したらタスクのdescription先頭にを付与する。

参考

所感

 いい感じ。

 じつはまだ他にもたくさん機能がある。たとえば以下。

  • プロジェクト機能
    • タスク間の依存関係
  • 日時設定
    • いつまでに完了させる予定か
    • いつまでに完了しないときに自動削除するか

 特に依存関係は良さそう。タスクを小分けにできるし順序付けできる。いずれ使ってみたい。