1. 程式人生 > >ubuntu下定時彈窗記錄工作日誌

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

其他

總覺得這種東西,應該有現成的才對。但一時沒找到,實現起來也不麻煩,就自己寫了這麼個指令碼先用著。

如果有人知道有現成的解決方案,或一些更好的工作日誌記錄方式,請推薦給我,謝謝。