朝はMacに時報と「必ず用意すべきこと」を喋らせてる。出せるゴミの種類をリマインドしてくれるのはとても便利。cronは曜日を条件にできるのだ。
喋りはAquesTalkを使っている。SayKanaでメッセージを作り、cronで実行するという手順だ。cronから実行する場合、実行ユーザーがログインしていると何故かスピーカーを使えない。だからcronというユーザーを別に作り、ここからメッセージを実行する。
燃やすゴミと資源ゴミは毎週回収してくれるけど、燃やせないゴミと危険ゴミは第2週と第4週だけ。これまでは単純に毎週木曜に鳴らし、鳴らしてから曜日表を見てた。でもそれって中途半端だ。
ちょっと考えて、昨日次のようなcrontabを書いてみた。
0,15,30,45 6,7 1-7,15-21,29-31 * Thu sleep 10 ; /Users/kmf/bin/thursday.cron 0,15,30,45 6,7 8-14,22-28 * Thu sleep 10 ; /Users/kmf/bin/thursday.cron ; /Users/kmf/bin/kikengomi.cron
これで完璧、と悦に入っていたら、今日(金曜)もメッセージが流れちゃった。不思議に思ってman cronすると、実行日は「日付『または』曜日」だった。他の条件はandなんだけど、二つある日付フィールドはorになっているということ。
しょうがないからthursday.cronの方に処理を移管。
thursday.cron:
PATH=/Users/kmf/bin/:/usr/local/bin/:$PATH ohayo.cron DAY=`date +%d` if [ $(((($DAY+6)/7)%2)) = 0 ] then kikengomi.cron fi
bashの算術演算は整数演算なので、($DAY+6)/7の結果nは「n週目」となる。%2で余りがあれば奇数、なければ偶数。偶数週目は2週目と4週目だけなので、燃やせないゴミと危険ゴミの出せる日、となる。
最初「$(((($DAY+6)/7)%2)) = 0」の「=」の前後にスペースを入れなかったら、式全体がtrueになったようで、必ず実行されちゃった。初歩ミス注意。
呼び出してるメッセージは次の通り。
thursday.cron:
PATH=/Users/kmf/bin/:/usr/local/bin/:$PATH ohayo.cron
kikengomi.cron:
PATH=/Users/kmf/bin/:/usr/local/bin/:$PATH SayKana "こんしゅうわ、もやせないごみ、きけ'んごみが+だ'せる/しゅ'うです。" SayKana "もやせないご'みわ、き'んぞ'くるい、こが'たので'んかせ'いひんなどです。" SayKana "きけ'んごみわ、けいこうとう、でんきゅう、で'んち、と'うき、ガラ'スるい、ちゃわん、さら、かが'みなどや、かみ'そ'り、か'ったー、ほうちょう、のこ'ぎりなどや、つか'いき'った;ぺんきかん、すぷれーかん、さ'らにわ、ら'いたー、か'さ、はり'がねは'んがーなどです。"
ohayo.cron:
case `date +%w` in 0) D="にち" ;; 1) D="げつ" ;; 2) D="か" ;; 3) D="すい" ;; 4) D="もく" ;; 5) D="きん" ;; 6) D="ど" ;; esac /usr/local/bin/SayKana "おはようございま_ス!。きょ'うわ、,,, , 、"$D"よ'うびです。"
かなーり便利です。