1 Contents

2 最新記事

2.1 [2018-03-30]

FileRenamer で学ぶ Ruby プログラム開発 に 『パッケージ化』を追記。

2.2 [2018-03-29]

Ruby 教育文書に、 FileRenamer で学ぶ Ruby プログラム開発 を追加。

2.3 rake の file タスクの挙動が変わった [2018-03-13]

いつものように文書ディレクトリで rake をかけると、 更新ファイルだけじゃなくて全ファイルでコンパイルがかかった。 更新ファイルだけにコンパイルがかかるようにしていた筈なんだけどなあ。

デスクトップではその症状が出て、 ノート PC ではその症状が出なかった。 ということは Rakefile の問題ではなく rake の環境依存が問題っぽい。 試してみたところ、rake のバージョンが

ということが分かった。 現在の挙動がバグならそのうち戻るかもしれない。 この挙動が仕様ならば、そのうちより多くの情報が出てくることが期待できる。 それまで我慢して全部コンパイルで使うのも一手ではある。 しかしまあ、最新版の 12.3 を捨てて 12.0 を使うようにすべきかな。

% gem list rake

*** LOCAL GEMS ***

rake (12.3.0, 12.0.0, 11.1.2, 10.5.0)

[~/doc]
ippei@As4 % gem uninstall rake -v 11.1.2

Select gem to uninstall:
 1. rake-11.1.2
 2. rake-11.1.2
 3. All versions
> 3
Successfully uninstalled rake-11.1.2
Successfully uninstalled rake-11.1.2

% gem list rake

*** LOCAL GEMS ***

rake (12.3.0, 12.0.0, 10.5.0)

上記では 11.1.2 を削除したが、同様にして 12.0.0 が最新になるように消していった。 これで望む動作が得られた。

ついでなので、どのバージョンからこうなったか確認しておいた。 12.1.0 をインストールして実行すると全部更新されて、12.0.1 はインストールできないようだ。 ということで、12.0.0 と 12.1.0 の間で起こったことなんだろう。 どういうコードの挙動でそうなるかは ~/.gem/ruby/2.3.0/gems/rake-12.{0,1}.0 を見比べれば分かる筈で、 diff -r してやればその差分は大した量でないことは把握できる。 しかし、まあそれは私がやる仕事ではないし、 修正の意図を把握するのが面倒なのでこの辺で切り上げることにした。

2.4 [2018-03-12]

2.5 [2018-02-23]

2.6 UNIX 今日の技: チャイムを鳴らす

高校までは授業の前後にチャイムが鳴っていますが、大学ではありません。 授業がなくても毎日決まった時間にゆるめの通知があると便利なことがあります。 ランチタイムや、終電に間に合うための帰り支度を始めるべき時刻に鐘が鳴るようにしていれば、 それまでの時間を集中することができます。 毎日決まった時刻にチャイムを鳴らすのは悪くない方策です。 そこで今回はチャイムを自作します。

2.6.1 mp3 を再生

まず、チャイムを鳴らせるようにします。 簡単なのは音声ファイルをオーディオスピーカーで鳴らすことです。 mp3 ファイルを作り、 mpg321 などで再生すれば良いでしょう。 今時の Linux ではサウンドドライバがデフォルトで入っているので、 オーディオスピーカーがあれば最も簡単に実現できます。

2.6.2 ビープの制御

私の場合はこの方法が使えません。 私は普段音楽を聞きながら作業をすることが多いのですが、 他人のいる部屋ではそうそうオーディオスピーカーから音を鳴らせないので、 ヘッドホンをしながら作業しています。 常にヘッドホンをしているのならオーディオスピーカーからチャイムを鳴らせば問題ないですが、 ヘッドホンをしていない時にチャイムが聞けなくなります。 チャイムはオーディオスピーカーとは別系統で鳴らせる方が便利です。

PC からの音声出力は、オーディオ出力だけではありません。 ビープ音があるじゃないですか! ということでビープ音を使ってチャイムを鳴らしてみましょう。

Linux の beep は実は高性能で、様々な音を鳴らすことができます。 beel -f 440 とすれば、 440 Hz の音が鳴ります。 beep -l 500 とすれば、 500 ミリ秒間だけ鳴らすことができます。 sleep と組み合わせれば、曲を演奏できそうです。

2.6.3 スクリプト

プログラムを作りましょう。 普段よく聞くチャイムは「ウェストミンスターの鐘」というらしいです。 ぐぐればメロディの楽譜もすぐに見つかるでしょう。 私は chime という名前のファイルに以下のようなコードを書きました。

#! /usr/bin/env ruby

## Westminster Chime

## 音階ごとの周波数。_S は半音上げる, _M はオクターブ下。
DO   = 440 * (2.0) ** (-9.0/12)
DO_S = 440 * (2.0) ** (-8.0/12)
RE   = 440 * (2.0) ** (-7.0/12)
RE_S = 440 * (2.0) ** (-6.0/12)
MI   = 440 * (2.0) ** (-5.0/12)
FA   = 440 * (2.0) ** (-4.0/12)
FA_S = 440 * (2.0) ** (-3.0/12)
SO   = 440 * (2.0) ** (-2.0/12)
SO_S = 440 * (2.0) ** (-1.0/12)
RA   = 440 * (2.0) ** ( 0.0/12)
RA_S = 440 * (2.0) ** ( 1.0/12)
SI   = 440 * (2.0) ** ( 2.0/12)
SO_M = SO * 0.5

## 演奏
LENGTH = 500 # millisecond
system "/usr/bin/beep -f #{DO  } -l #{LENGTH}"
system "/usr/bin/beep -f #{MI  } -l #{LENGTH}"
system "/usr/bin/beep -f #{RE  } -l #{LENGTH}"
system "/usr/bin/beep -f #{SO_M} -l #{LENGTH * 2.0}"
sleep LENGTH / 1000.0
system "/usr/bin/beep -f #{SO_M} -l #{LENGTH}"
system "/usr/bin/beep -f #{RE  } -l #{LENGTH}"
system "/usr/bin/beep -f #{MI  } -l #{LENGTH}"
system "/usr/bin/beep -f #{DO  } -l #{LENGTH * 2.0}"
sleep LENGTH / 1000.0
system "/usr/bin/beep -f #{MI  } -l #{LENGTH}"
system "/usr/bin/beep -f #{DO  } -l #{LENGTH}"
system "/usr/bin/beep -f #{RE  } -l #{LENGTH}"
system "/usr/bin/beep -f #{SO_M} -l #{LENGTH * 2.0}"
sleep LENGTH / 1000.0
system "/usr/bin/beep -f #{SO_M} -l #{LENGTH}"
system "/usr/bin/beep -f #{RE  } -l #{LENGTH}"
system "/usr/bin/beep -f #{MI  } -l #{LENGTH}"
system "/usr/bin/beep -f #{DO  } -l #{LENGTH * 2.0}"

440Hz がラで、1半音が 2 の12乗根ということでそれぞれの音階の周波数を出しています。 この曲に使わない音もありますが、 全部まとめて書いてしまった方がミスが混入しにくいです。 また、あとあと違う曲を作るのにも便利です。

演奏部ではまず、1拍に使う時間を 500 ミリ秒にしています。 system 命令で beep コマンドを実行します。 また sleep で休符を表現しています。 sleep の長さは ミリ秒ではなく秒なので、 LENGTH を 1000 で割ります。

実行して、音がなることを確認しましょう。 動作が確認できたら、chime を ~/bin/ に置きましょう。

2.6.4 cron で定期実行

作ったコマンドを cron に登録しましょう。

crontab -e を実行して、以下の行を書き加えます。

55 8  * * 1-5 /home/ippei/bin/chime #1
25 10 * * 1-5 /home/ippei/bin/chime #1end
40 10 * * 1-5 /home/ippei/bin/chime #2
10 12 * * 1-5 /home/ippei/bin/chime #2end
00 13 * * 1-5 /home/ippei/bin/chime #3
30 14 * * 1-5 /home/ippei/bin/chime #3end
45 14 * * 1-5 /home/ippei/bin/chime #4
15 16 * * 1-5 /home/ippei/bin/chime #4end
30 16 * * 1-5 /home/ippei/bin/chime #5
00 18 * * 1-5 /home/ippei/bin/chime #5end

最初の行は、「月〜金曜日の 8:55 に chime を実行する」ということを示しています。 chime のパスは私の環境になっています。 ~/bin/chime に置いた筈なので、 / から始まる絶対パスをここで指定しましょう。 ~ は使えないと思っておくべきです。 ~ の展開はシェルの機能ですが、cron はシェルを介さずにコマンドを実行するためです。

2.6.5 カッコー時計

カッコー時計を作ることも難しい事ではありません。 時分秒の時を取得して、その回数繰り返しでビープを鳴らしたらいいだけです。