ubuntu下定時彈窗記錄工作日誌
背景
記錄工作日誌,是一個很好的習慣,但不容易堅持,本來打算每天記錄,但經常拖延,拖著拖著,有一些事情就忘記了。
等到寫週報或月報的時候,才會開始翻郵件,聊天記錄,各個倉庫的提交log等,回憶都幹了些啥。
為了解決這個問題,需要有一個工具來幫助我,提高工作日誌的完成度。
最開始的設想是,自動定時傳送一個郵件或聊天訊息,在其中回覆工作記錄。但轉念一想,公司的系統就是這麼做的,每天一封郵件提醒我寫工作日誌,但沒什麼實際作用。看來需要更加強力的提醒才行。想來想去,試試就用彈窗吧。
任務管理Taskwarrior
彈窗如果只是一個輸入框,每次都需要手工輸入,那就太麻煩了。還是需要有一些預設的任務,可以直接選擇。必要的時候,才做輸入。所以首先要有一個方法,記錄當前的任務,作為彈窗的資料來源。
簡單點的話,就是一個txt檔案即可,手工往裡面加入任務。但其實有更好的方法,那就是使用Taskwarrior,一款基於命令列的任務管理工具。具體可見
linux命令列todo列表管理工具Taskwarrior介紹
根據預設配置,taskwarrior 的記錄儲存在 $HOME/.task/pending.data
我們只需要在指令碼中讀取這個檔案,過濾出所需要的任務即可
彈窗Zenity
初步設計是,彈窗中需要列出任務,可供選擇。當我在完成預設任務時,可簡單勾選。但也需要有輸入框,可讓我補充其他情況。
簡單搜尋後,決定使用Zenity 來做彈窗。關於Zenity,網上有很多介紹,此處不贅述。
為了進一步簡化,我們在task中多建立一個任務叫做“其他”,選擇此項表明需要輸入,用於配合指令碼處理。
task add “其他”
程式碼及效果
初步的程式碼如下(可檢視github版本,也許會比此處的程式碼更完善些,https://github.com/zqb-all/pop-up-task-diary)
#!/bin/bash # author: https://github.com/zqb-all diary="$HOME/taskdiary.txt" taskchoice=$(cut -d'"' -f 2 "$HOME"/.task/pending.data | sed '{x;p;x;}' | \ zenity --list --checklist --title="選擇你正在做的工作" --column="是否正在做?" --column="工作項" \ --timeout 600 --width 600 --height 400) timenow=$(date "+%Y-%m-%d %H:%M:%S") [[ $taskchoice = *"其他"* ]] && { taskother=$(zenity --title="補充說明" --text "其他工作" --entry --timeout 600) [ x"$taskother" != x"" ] && echo "$timenow : $taskother" >> "$diary" } [ x"$taskchoice" = x"" ] && { taskother=$(zenity --title="補充說明" --text "請輸入當前工作" --entry --timeout 600) [ x"$taskother" != x"" ] && echo "$timenow : $taskother" >> "$diary" } [ x"$taskchoice" != x"其他" ] && { [ x"$taskchoice" != x"" ] && echo "$timenow : $taskchoice" >> "$diary" }
將以上程式碼,儲存成指令碼後,比如儲存為~/pop-up-task-diary.sh
執行即會出現彈窗。彈窗中會列出所有任務。選中後點擊確定,就會將選中的值和當前時間,一起寫入home目錄下的 taskdiary.txt檔案中。
如果選擇了“其他”,還會再彈出一個視窗,可以輸入,作為補充。
如果在指定的時間內未輸入,說明人不在電腦前,則彈窗自動消失。
例如,我的task如下
$ task
[task next]
ID Age Description Urg
1 1min 其他 0
2 7s 測試任務1 0
3 2s 測試任務2 0
3 tasks
則呼叫指令碼後,會出現
選擇任務後,點選確定。由於我選擇了 其他,所以再次出現彈窗,這次的彈窗可以任意輸入。
補充完成後,點選確定即可。
$ cat taskdiary.txt
2018-11-25 17:09:46 : 這裡可以輸入
2018-11-25 17:09:46 : 其他|測試任務1
定時呼叫crontab
有了彈窗指令碼後,就只差定時呼叫了。直接用crontab就可以。
這裡有兩個需要注意的地方
為了讓crontab能正常使用zenity彈出彈窗,需要設定 export DISPLAY=:0
為了在zenity的彈窗中能正常輸入中文,還需要另外設定幾個變數,具體見下方示例
示例,9點到20點之間,每隔一個小時彈出一次。
0 9-20 * * * export DISPLAY=:0 && export XMODIFIERS="@im=fcitx" && export GTK_IM_MODULE=fcitx && export QT_IM_MODULE=fcitx && $HOME/pop-up-task-diary.sh
其他
總覺得這種東西,應該有現成的才對。但一時沒找到,實現起來也不麻煩,就自己寫了這麼個指令碼先用著。
如果有人知道有現成的解決方案,或一些更好的工作日誌記錄方式,請推薦給我,謝謝。