Chienomi

Atnow (diary-tools)

本当は一番最初に書くべきコードだったdiary toolsだが、ようやく書いた。 https://github.com/reasonset/diary-tools/ にアップしている。

Diary Toolsと言ってはいるが、ほぼatnowがメインだ。diary.resumeは要は日付別のファイルをエディタで開くだけだからだ。

atnowはタブセパレートのCSVとして理解可能な日記ならぬ瞬間記だ。その瞬間に起きたことを記録していき、これにより検索し、分析することを容易にする。

記憶しておくことが困難な私には欠かせない。

そのデザインが重要なのだが、今回2つのポイントがあった。

ひとつは、atnowは他のスクリプトから呼ばれる可能性もあるため、ファイルは必ずロックされなくてはいけない。だが、それをシェルスクリプトでやるとなるとなかなかハードルが高い。だが、zshには公式モジュールとしてflockが提供されている。

### Lock diary file ( touch "${basedir}/${atnow_date}" zsystem flock -t 180 "${basedir}/${atnow_date}" integer ret=$? if ((ret)); then { echo -n "Can't acquire lock for ${basedir}/${atnow_date}." ((ret==2)) && echo -n " timeout." echo } >&2 exit 1 fi print "${now}\t${atnow_time:-now}\t${desc}" >> "${basedir}/${atnow_date}" )

zsh/zsystemモジュールをロードすることで使用可能だ。さすが最強のシェル。

そして、zenityの返り値を確認しなくてはいけないのでやってみて気がついたのだが、

desc=$(zenity --entry --title="Input what to do or what happen now!") if (($?)) || [[ -z $desc ]] then exit 127 fi

Command substitionの結果が$?で取れるらしい。

zenityが値として何を返すのかということを今回チェックしたが、基本的に入力した内容、選択なら選択したテキストが返り、キャンセルやいいえを選択した場合、non-zero終了するらしい。

ランチャに配置して完了。

ちなみに、これをメール通知するため、muttとmsmtpをセットアップした。