「りも」トップページへ
TIPS index へ

ラジオサーバーを強化しよう


〜 予約と野球とeRuby 〜

Jun.29.2001

あの問題のためにラジオサーバーを拡張する試み。


・ シーズン開幕!!

というわけでプロ野球のシーズンがやってまいりました。
タイマーでエアチェックをしているラジオリスナーにとっては 頭の痛い季節でもあります。
理由は言わずもがなのナイター中継延長ですね。これが生じると以後の 番組開始時間がずれるだけでなく、いくつかの番組が放送されなかったりします。

先に作ったラジオサーバーは時間で番組を収録していますし、気を利かせて 番組毎にディレクトリを作って分類なんかもしてくれます。 んが、ナイター中継延長があると番組放送時間がずれてしまうので 当然それらがうまく働きません。
なんとかしたい、と思うわけです。

ナイターの延長自体は人間が感知し、番組予約に手をくわえるという手順は しょうがないにしても、そのたびにサーバーに login して vi でちょびちょび 予約リストを編集というのもパッとしません。なにより、ずらした時間を 戻し忘れて翌週酷い目にあってみたりします(笑)。
そういった面倒なところをなんとかできないかなというのが今回のテーマです。

・ ハードウェア的には

ハードウェア構成的には前回とあまり変わっていませんので特に書くことも ないのですが、ちょびちょびと変わってはいます。

(以下日記的メモ)
そのほとんどが部屋内におけるノイズ対策で、「唯一の」ノイズ元となって いたデスクトップ PC の改善でした。私の部屋のなかにはサーバーとノート 合わせて 5台の PC が駆動していますが、ラジオに影響を与えるノイズを 出していたのはそのうちの 1台(しかもメインマシン)だけでした。そいつを 落すと、他にどんな機材が動いていようとも大きなノイズは入らないという 状況なのですが、その 1台をつけただけで文化放送がほとんど聞こえなくなる ぐらいのノイズになります。(それって住宅街で使うに問題あるんじゃないのか)
原因はマザーボードではないかと前々から睨んでいました。とあるサウンド カードを接続したところ、ハードディスクアクセス時のノイズがガリガリと 大きく入る事があったからです。そんなノイズは電源ラインからで無いと 拾えません。
で、今時のマザーボードに交換。となると必然的に CPU と RAM も今時の ものに(セットで)変えなければなりません(;; 。それが理由で今まで 手が出せていなかったというのがあります。よするにお金がかかるという ことですな。
結果ノイズはめちゃくちゃ小さくなりました。思わず部屋の中でバンザイを してしまったほどです。おまけにマシンは倍の速度になるし。 (K6-2 450MHz → Duron 800MHz)
しばらくはこれで満足していたのですがまだノイズは無くなっていません でした。それよりもある程度ラジオが聞けるようになったものの、残っている ノイズ周波数が音声可聴範囲でローパスフィルターでは除去できなくなって しまいました。
というわけでもう一段階。きっとこれは電源ラインにノイズを流す奴が悪い んだ、というわけで電源ユニットを買ってきて交換。ヨドバシカメラで 一番安い電源ユニットだったけれどもちゃんと「検磁」(VCCI Level2)と 中文のシールが張ってあることを確認済。
電源ユニットを交換。そして結果は…、「バッチリだ」。ほとんど外部ノイズは 無くなったというレベルまでダウン。薄いハム(ブーンというノイズ音)は 入るけど以前に比べればパラダイスですわ。
で、ここまでノイズを減らすと前回使っていた IR トランスミッターは不要に なるので、今はケーブル直繋ぎ。IR トランスミッターはインピーダンスの 関係でちゃんと音が録れない時があったのでこれをなくすことも課題の一つ だったので。

おかげでメインマシンは偉いパワフルに生まれ変わってしまいました :-)

・ 設計

まずはナイター中継延長が引き起こす問題点(事象)を検討します

これら問題点に対処するための機能(要求設計)を考えます 本当は予約アイテムを編集する機能が必要なのですが、登録・削除の セットで同等のことができるので今回は省略します。

設計コンセプトとしては、既に半年の動作実績があるラジオサーバーが あるわけですからその録音部分にはなるべく手をくわえず機能を追加して 行く方針とします。

前回構築したラジオサーバーをシステムブロック図で示すと以下の様に なります。

旧システム構成図 (Fig.1)

旧システムでスケジュールリストを与えている部分で、ここのリストが半動的に 書き変われば今回の要求の大半は吸収できます。後は時間ずれの対策を追加する 必要があります。
新たに設計したシステムブロック図です。
新システム構成図 (Fig.2)

もしナイター中継の延長がおきて録音予約に変更が生じたら、 外部インターフェース経由で「時間オフセット値」と「録音スケジュール」を 書き換えて対処する形になります。この「時間オフセット値」と 「録音スケジュール」は cron 起動される radio_today.rb によって 毎日更新されますので時間をずらしたまま忘れて来週の録音に影響をおよぼす といった心配はありません :-)

・ システムコーディング

修正、追加したシステムのコードです。

録音スケジュールのリストを読み込んで保持する部分は他のファイルでも 使い回すため radio_lib.rb という別ファイルに分ました。 時間ズレの対処は radio_lib.rb の中で行っていますので radio_rec.rb は 実質なにも変わっていません。また、音声を実際にキャプチャーする スクリプト cpt2mp3 に変更は無いので省略します。
Ruby で記述しています。

radio_lib.rb
radio_rec.rb
radio_today.rb

今回はちょっと、とってつけ的プログラミングなもんでコード設計が 汚くなっています。あんまり ruby 的でもないんでお見せするのは しのびないんですけど (^^;

・ 外部インターフェース

システムができたら今度は実際に延長した際にスケジュールの変更を リクエストする部分を作ります。これを、外部インターフェースと 呼びます。
いや、別にリクエストファイルを vi で書き換えても良いんですけどね。 そうではなくなるべく簡単に、できれば外部からでも設定できるような インターフェースを目指します。

外部からのコントロールとして最初に考えたのがメールリクエスト型。 procmail なり .forword なりとスクリプトを連動させて、ラジオサーバーの 専用メールアドレスにコマンドを記述したメールをポストしてコントロール する形。
で、もう一つが WEB のフォーム経由でコントロールする形。いわゆるひとつの WEB アプリケーション型。
今回は確認のしやすさと「かっこよさ」から WEB 型のインターフェースを 作成することにしました。CGI でリクエストを受け取ってそれを 「時間オフセット値」と「録音スケジュール」に書き込む様なものを 作れば良いわけです。

・ WEB アプリケーションと eRuby

ここまでスクリプトを Ruby で書いてきましたから CGI も Ruby で書きたいなあ と思い色々参考になりそうなページをめぐっていました。そうしたら eRuby なる ものを見つけました。(embedded Ruby)
これは HTML 内に Ruby のスクリプトを埋めこんで、スクリプト実行の結果を HTML としてクライアントに提供する仕組みです。JavaScript みたいなものと いうとイメージできるでしょうか。ただし、スクリプトの実行は クライアントサイドではなくサーバーサイドで行われますので正しくは 「PHP みたいなもの」、です。ちなみに ePerl というものがあるそうです。

詳しい解説は他のページに譲るとしてポインターだけ提示しておきます。
「すごい、すごいぞ!!eRuby!!!」 (るびきちさん)
「Ruby Earrings」 (TAKEUCHi Kahori さん)

eRuby はスクリプト込みの HTML を Ruby スクリプトに変換する フィルターです。eRuby によって変換されたスクリプトは Ruby に渡され その出力結果を HTML として httpd に返します。
この動作の仕組みは eruby に -v スイッチをつけた出力を見るとわかります。 また、このことを把握しているとネストが理解しやすいと思います。


サンプル (sample.rhtml)
<HTML>
<BODY>
Yes, this is sample code.
<BR>
<%
  for i in 0...8 do
    print "Ha"
  end
%>
!!!!
<BR>
</BODY>
</HTML>

eRuby が内部的に変換したスクリプト

    1: print "<HTML>\n"
    2: print "<BODY>\n"
    3: print "Yes, this is sample code.\n"
    4: print "<BR>\n"
    5:
    6:   for i in 0...8 do
    7:     print "Ha"
    8:   end
    9: print "\n"
   10: print "!!!!\n"
   11: print "<BR>\n"
   12: print "</BODY>\n"
   13: print "</HTML>\n"
   14: print "\n"
出力結果
<HTML>
<BODY>
Yes, this is sample code.
<BR>
HaHaHaHaHaHaHaHa
!!!!
<BR>
</BODY>
</HTML>

・ ラジオサーバーインターフェース

あとはインターフェースとなる WEB ページをげしげしげしと作ります。
ページのソース参考は こちら
全ファイルにベースディレクトリを書き込まなければならないなど、 多分に「ダサい」つくりとなっております… (^-^;

そうしてできあがったラジオサーバーインターフェースサンプルが こちら
ラジオサーバーとして動作していないサンプルページですので登録や 削除等ご自由に行っても結構ですよ〜。

・ おわりに

自分と仲間の閉じたグループのために作ったものですから、多分にいいかげん だったりやっつけ仕事だったりする部分があります。
コード自体を参考にするんではなくて実践手順を見ていただければと思います。

ラジオサーバー自体やそれで録音した番組は公開しておりませんのであしからず。 また、録音されたラジオ番組は個人として楽しむ以上の行為に用いることは できません。

では、より楽しい Linux ライフを!!


rero2@yuumu.org