第2・第4木曜日

朝は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"よ'うびです。"

かなーり便利です。