2009年12月28日月曜日

Syslogの内容をモールス信号でブザーから発音させる

まだ書いてなかったようなので一応。
サーバマシンには普通ディスプレイなどの出力装置はついていないことが多い。したがって、何かあればメールやついったーなどで知らせるのが当たり前だが(?)、私のサーバの場合、普段隣で動いているので、いちいちインターネットを経由するのは無駄であると言っていい。
そこで、唯一ついている出力装置であるブザーを使ってsyslogの内容を通知しようと思った。ただ単音では面白くないので、モールス信号で全てを読み上げさせる。

モールス信号を発音
今回のために、モールス信号を発音するためのシェルスクリプトを作った。標準入力から得られた英数字と記号をモールス信号で発音する。私のWebページにて配布している。
$ echo 'sos' | ./morse -h 120 -l 80

Syslogの設定
Debian lennyの場合、syslogではなくrsyslogが採用されている。したがって、/etc/rsyslog.confに以下の設定を追加する。
*.notice -/tmp/morse.tmp

FIFOを使えばよかったのだが、今回はとりあえずファイルでやってみる。

そして、以下のようなワンライナーを実行しておく。
$ tail -fn 0 /tmp/morse.fifo | perl -ne 'open(PIPE, "| morse -h 250 -l 40"); print;print PIPE; close(PIPE);sleep(3);'

これで、noticeレベル以上のログが記録されたタイミングで、モールス信号が発音されるようになった。

感想
ここまでやっておいて言うのもどうかと思うが、私は全くモールス信号がわからない。しかし、サーバから時々モールス信号が発せられていると、映画に出てくるマシンのようで非常に格好良い。贅沢を言うならタコメータがあればなお雰囲気はよくなるが、そこまで技量が無いので今回は残念だが見送った。
なお、今回はモールス信号が鳴っている様子を動画に収めた。300円もあれば購入できる出力装置なので、Linuxマシンが有るなら検討してみても良いのではないだろうか。

2009年12月26日土曜日

Computer Humanoid Interface

Computer Humanoid Interfaceというソフトを10月くらいから開発を始め、25日にリリースができた。マシンの監視のためのジョブを簡単に追加できて、出力はついったーに流せるので、「その時間に何が起こったか」を確実に残すことができる。
自然言語を理解したりするが、そのあたりの一切の処理はコアがやるので、ちょっとした管理スクリプトを組みたいだけなのにI/O関連の処理で時間をとられることがない。人間に指示を出すように簡単に機能を追加できるようにしたかったため、コンピュータの人間用インターフェイスとした。
これからブログには、CHIの機能をつらつらと書いていこうと思う。今回は、今後の展望を書く。

まず、プラグインで拡張できるので、逆に言えば簡単に取り外せる。プラグインは全てplugin/の中に入っていて、このうち絶対に必要なのはplugin.rbとmother.rbだ。あとは消してしまって構わない。
そうすると、何も監視しない、かつ何も出力しないCHIができあがる。一体こんなものになんの意味があるのか、と思われるかも知れないが、逆に言えば、ここからいかなるBOTでも創ることが出来てしまうのだ。
例えば、「〜食べたい」「〜たべる」などというポストがTL上に現れたら「〜おいしいよね」と返答するBOTを作りたいと思った場合、仮想コードだがだいたい以下のようになる。(なお、以下は次回実装予定の、フレンドタイムラインが更新されたときに1ポストごとに呼ばれる「onfriendtl」を使っている)


require 'utils'
require 'plugin/plugin'

module Plugin
class WannaEat < Plugin

def onfriendtl(watch, message)
if(message.body =~ /([^ 、。 ]*?)[食た]べ/){
return message.post(Message.new("$1っておいしいよね!", :tags => [self.name]))
}
end
end

end

# プラグインの登録
Plugin::Ring.push Plugin::WannaEat.new,[:friendtl]


以上のように、ついったーにつぶやく部分や、取ってくる部分はそもそも書く必要すら無い。しかも、onfriendtlのようなイベントハンドラが用意されているため(次回リリースからだけど)定期的に確認に言ったりする処理も書かなくて良いのだ。CHI付属プラグインは、このあたりにコンピュータの管理ロジックを書いており、必要なコマンドが無い場合は、プラグインの登録をしないようにしている(自動的にOFFになる)。

ここから考えられるのは、TwitterのBOTのフレームワークになりうる、ということ(というか、もうすでになってる)。つまりBOTが量産できる。
さらには、GUIフロントエンドをつけてしまえば、Twitterクライアントまで創ることが可能になる。これはなかなか面白い試みだと思っている。

ほかにも、設定ファイルへの簡単なアクセス(各プラグインの@configに、設定ファイルの内容が最初から入っている)、簡単なkey-valueデータベースの提供(at(:key)で取り出し、store(:key,val)で書き込みができ、再起動後も値が維持される)、画像投稿への対応(画像を含むMessageオブジェクトを渡されると、twitpicにアップするようになっている)など、BOTを創るにあたって必要そうな機能をだいたい持っているし、これからも短縮URLなどに対応する予定になっている。

2009年12月19日土曜日

Debian LennyにALSA入れて音を鳴らす

Bluetoothのスピーカーがあれば、そのスピーカーだけを持ち運ぶことができるので、端末から離れた状態でも音楽を聞くことができる。また、RubyなどでWeb上からmplayerなどを操作することができるようにしておけば、モバイル端末で曲の再生・停止ができる。これは、傍から見れば、宛らiPhoneでスピーカのWebサーバ(?)にアクセスして、スピーカ内の音楽を(w)再生しているように見えるのではないか。

しかし、GUIすら入っていないサーバでは、普段なら手動でやらない設定をいくつかしなければいけなかったので、それをここに書いておく。

環境
今回は、GUI及びサウンド関係のパッケージやソフトウェアが一切入っていないDebian lennyを使用する。
また、
$ lspci | grep Audio
00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 01)

である。

パッケージ
今回は、ALSAを用いて音を出力するため、aptにて主要パッケージを入れる。また、サウンド再生ソフトとしてはmadplayを選択した。これは、コマンドライン上からmp3ファイルを再生するのに特化したソフトで、軽量で依存パッケージも少ない。
# aptitude install madplay alsa-base alsa-utils


ALSAの設定
この段階では、ALSAがサウンドインターフェイスに対する適切なドライバを選択できないのだが、それは自動設定に任せる。本来ならlspciの結果から適切なドライバをコンパイルするところだが、Debianとこのハードウェアなら必要ないらしい。
# alsaconf


カーネルモジュールの有効化
このままでは、私の環境では/dev/dspが見えなかったので、心当たりのあるカーネルモジュールの有効化をしてみる。
# modprobe snd-pcm-oss
# modprobe snd-pcm
# modprobe soundcore


鳴らしてみる
ここまでやって、以下のようにmp3ファイルをパラメータに渡してやると、見事サウンドが鳴った。
$ madplay packaged.mp3

なお、これでならない場合は、上記コマンドをrootユーザで実行するか、実行するユーザがsoundグループに入っている必要がある。

ビープ音を有効にする(2009/12/19追記)
以上の方法でスピーカを使えるようにすると、システムビープを鳴らす方のスピーカ(以下、スピーカ(笑))が鳴らなくなった。これは困るので、以下のように実行してpcspkrを有効にしておく。これで、サウンドボードの方からも、スピーカ(笑)でも発音が可能になる。
# modprobe pcspkr


感想
冷静に考えれば、音を鳴らすような基本的なことはGUIをインストールすれば難なく出来ているわけだから、逆に言えば最初から収録されているパッケージだけでできないはずがない。しかし、今回はステレオミニプラグでの接続だったため問題が簡単だったに過ぎない。次回は、これをbluetooth上で実行する。

おまけ
今回の設定中に、ALSAの設定を抜かしていたところ、なんとスピーカ(笑)で無理やり曲を再生し始めた。今にも壊れそうな音で、なんとか再生している様が不気味だった。


2009年12月1日火曜日

ラックマウントサーバーをつくってみた

サーバといえばかっこいい筐体。しかし現実はいかのとおりであった・・・。これはいけない。無駄にでかいことは写真からは伝わらないと思うが、それを抜きにしても謎の穴!じつはこれ、この間までここから電源装置が見えていた。しかし、1TBのハードディスクを増設した時に、電源装置のコードがそれにとどかず、やむを得ず場所を移動。その結果が
おわかりいただけるだろうか。中に居るのだ。このような構造のため、中吸気中排気という、自作PC'erがきいたらぞっとするような構造となっていた。CPUがAtomであるため、そちらは50℃弱だが(しかしAtomにしては高すぎる)、中の空気が恐らく30℃前後になっており、相当過酷な状況だった。
さらに、今回プリンタを購入したがこれの距離が少し離れており、できればサーバを近づけたかったけれど、残念ながら筐体が大きすぎてプリンタ周辺に配置する事が難しいという背景もあり、新しいPCケースをつくることにした。
しかし、時は師走。財布が出費を許さないので、捻出できる経費は2,000円。これでいかに格好いいマシンをつくるか。しかも、名前的にラックにしたいという兼ねてからの願望もあった。

設計
まず、マザーボードをどこに設置するかが問題である。ケーブルの長さで電源の場所が左右されるほど短いので、これが全てを決定するといっていい。
ここはありえない。

複合機でなければ可能ではあった。

ここがいい。机の横なので、少し目線を動かしただけでサーバが見える。物理的に見える必要は必ずしもないが、やはりかっこいいサーバにするなら見えていないと面白くない。


施工
とりあえず、2000円という予算なので、ダイソーにて以下の品を買ってきた。


鉄製のラックのパーツ。案外ダイソーでもこういった本格的なものが売っていて、わりとしっかりしている。今回はこれだけで、ラックマウントサーバを作成することにした。なお、25センチポールは、黒が七本しかなかったため、一つをとりあえず銀で代用している。また、この中にあるフォトフレーム(今回唯一の200円商品)は、スペースの関係上、サーバに使用することはできなかった。


ひとまずラックを組み立てた図。上、中、下段の3段に分かれている。サイズは奥行15cm、幅30cm、高さは25*2 + 47 = 97cmと、相当な高さになった。上下の高低差が激しいので、下のほうの段は単なる収納として作った。
ここでわがサーバ、limeの構成について書いておく。

マザボ:Atom 330
 CPU 1.6GHz (Dual Core)
 100base LAN x1
メモリ: DDR2 512MB
ストレージ:
 SATA HDD 1TB
 IDE HDD 120GB
 IDE HDD 80GB
電源装置:
 一切不明(2001年に、近所のPC屋さんが組んだ安いPCを買ったが、それについていた)
 推定年齢7〜8歳

基本的にリモートアクセスするだけなので、入出力装置は普段は一切ついていない(ただ、今回はプリンタをつけるので出力装置は増える)。早速、これらのパーツをラックにマウントしてみる。

このようになる。ケーブルはまだほとんど接続していない。マザーボードは、上部の47cmのポールを補強するためのパーツに、結束バンドでマウントした。電源装置の関係で、やはりすべてのパーツが上に集中、中段と下段がぽっかり開いてしまった。
これにすべてのケーブルを適切に接続すると、以下のようになった。
できるだけスマートに収めたかったが、ケーブルの硬さと短さがネックになりハードディスクを立てざるを得なかったなど、いろいろと問題が起こってしまった。しかしながら、インテリアとしても優れた、今流行の「スリム型」「タワー型」PCよりもスリムでタワーなラックマウントサーバができたと思う。

おまけ

先日Mac Book Proを購入したが、付属のソフトをあまりつかいこなせていない。そこで今回は、動画や写真をiPhoneで撮影し、iMovieを用いて一本の動画にまとめて、Youtube(Youtubeで見る)やニコニコ動画(ニコ動で見る)にアップロードしてみた。上の繰り返しになるが、3分ほどの動画なので時間があればぜひ。