ページ

2008年12月30日火曜日

モールス符号をビープ音に

時間管理に役立てるために長い時間をかけて Linux PC の設定をしました。 サーカディアンリズムといういわゆる生体時計のリズムを調べて、集中力が高まる時間帯と低下する時間帯を把握しようというのが目的です。 単純に cron に登録しておくだけなのだけど、cron からビープ音を鳴らすには > /dev/console にリダイレクトしないと音が出ないと分かるまでずいぶん時間がかかった。 最初のうちは6時なら6回ビープ音を鳴らすようにしていたのだけど、段々と欲が出てきて、せっかくだから頭の体操にモールス符号で時刻を知る事ができるようにしようと考えた。 モールス符号は少しなら分かるけど集中して聞かないと意味不明になってしまう。だから時間毎の集中力を調べるには都合が良いかも知れない。 時間を聞くだけなら数字だけで良いのに、欲張ってアルファベットまで変換できるようにしてしまった。記号はもう飽きたからいいや。 内容を記録しておこう。 $ crontab -l 0-59/30 * * * * /var/tmp/beep.sh 30分毎にスクリプトを実行するように登録。 $ cat /var/tmp/beep.sh 内容は次の通り。 #!/bin/sh TIME=`date "+%H %M"` echo "QTR" | /usr/local/bin/morse2beep echo "$TIME" | sed 's/^0//' | sed 's/ 00$//' | /usr/local/bin/morse2beep #EOF ゼロは真面目に鳴らすと長音が5回なので長くなるから、10時未満の時の最初の余計なゼロや、丁度00分の時のゼロは削除します。 $ cat morse2beep それから数字とアルファベットをモールス符号にしてビープ音を鳴らすコマンドを用意。内容は次の通り。 #!/bin/sh Hz=440 ST=70 LT=280 #せっかくなので振動数を選べるようにした。440でC音。 #短音と長音の長さをミリ秒単位で指定。 #追記: なんか変だと思ったら440はA音だった。C音なら523.251だった。 SP=0.2 SS=0.2 LS=0.4 AS=0.3 #間隔を空けないと音がつながって聞き分けられないので適当に sleep 時間を設定。 #空白/短音/長音/アルファベット一文字毎の sleep 間隔を秒単位で指定。 TMPFILE=/tmp/morsecode2beep.tmp #適当に一時ファイル名を指定。 #面倒だけどたくさんバックスラッシュでエスケープしないと最終的なコマンド行が得られなかった。 m2b (){ sed "s/ /sleep $SP\\n/g s/as/sleep $AS\\n/g s/E/echo -n -e \'\\\033[10;$Hz]\\\033[11;$ST]\\\007\' ; sleep $SS \\n/g s/T/echo -n -e \'\\\033[10;$Hz]\\\033[11;$LT]\\\007\' ; sleep $LS \\n/g" > $TMPFILE sh $TMPFILE rm $TMPFILE } #変換して実行用のファイルを一時ファイルとして出力。使い終わったら削除。 #ちなみにEは短音1回、Tは長音1回だから変換しないでそのまま使おうと思った。 #でも実際は少し sleep を入れたいから他の文字に先立って変換しないと駄目。 #asは後で短い sleep に置き換える。 a2m(){ sed 's/E/Eas/g s/T/Tas/g s/A/ETas/g s/B/TEEEas/g s/C/TETEas/g s/D/TEEas/g s/F/EETEas/g s/G/TTEas/g s/H/EEEEas/g s/I/EEas/g s/J/ETTTas/g s/K/TETas/g s/L/ETEEas/g s/M/TTas/g s/N/TEas/g s/O/TTTas/g s/P/ETTEas/g s/Q/TTETas/g s/R/ETEas/g s/S/EEEas/g s/U/EETas/g s/V/EEETas/g s/W/ETTas/g s/X/TEETas/g s/Y/TETTas/g s/Z/TTEEas/g s/1/ETTTTas/g s/2/EETTTas/g s/3/EEETTas/g s/4/EEEETas/g s/5/EEEEEas/g s/6/TEEEEas/g s/7/TTEEEas/g s/8/TTTEEas/g s/9/TTTTEas/g s/0/TTTTTas/g' } #変換する。 tr -d '`~!@#$%^&*()\-_+=[]{}\\|;:",.<>/?\' | tr -d "'" | tr "a-z" "A-Z" | a2m | m2b #記号は取り除いてからパイプで流し込む。_の前の-を\でエスケープしてあげないと tr にオプションと間違えられる。 reset #環境変数が変わってしまうのでリセットしておく。 #EOF 非常に趣味の問題なのだけど、これで少し自己満足に浸れる。