2000-10-30(月) [長年日記]
■ アジアカップ
アジアカップ決勝。すげー危なかったけど、勝ててよかった。柳沢が出てきたときはどうしようかと思ったけど(←お約束のコメント)。MVPは川口だな。だてにオールバックじゃないね。昨日は札幌もとうとう優勝を決めたので、かみさん秘蔵のシャンパンを開けようか……って話になったんだけど、飲んだら最後、翌日の出社はないよな、ってことで延期。来週、川崎がナビスコで優勝したら開けよう(関連なし)。なんにせよ、ちゃんと出社した自分をほめてあげたいです。
■ biff
いままで、fetchmail
のログ出力先を/dev/console
にして、xconsole
で眺めていたいんちきbiffだが、もうちょっとマシにしたくなったので作ることにした。こういうチマチマしたもんばっかり作ってるな、最近。いわゆる普通のbiffは、メールサーバーにアクセスして新着メールを監視するものだけど、ウチの環境はメールが届くと同時にprocmail
が振り分けちゃうので、サーバーに溜った時点ではもう遅い。ISPからfetchしてきたと同時になんらかのアクションを起こさないといけない。タイミングとして一番いいのは.qmail
で、メールからSubjectを抜き出すフィルタを作って、その出力を……どこに出そう?
フィルタはメール1通ごとに起動されるから、その出力はどこか別のプロセスで一括して表示しないといけない。プロセス間通信を使えばよろしい。今回は同じマシン上なので、UNIXソケットを使うことにしよう。使い方、イマイチよく知らないけど(笑)。表示側アプリ(サーバー)は、Ruby/Gtkでいい。汎用にするために、来たモノはなんでも表示する汎用コンソール(myconsole
)。
#!/usr/bin/ruby -KE require 'socket' require 'thread' require 'gtk' include FileTest SOCKET = "/tmp/myconsole-#{ENV['USER']}" File.delete( SOCKET ) if exist?( SOCKET ) and socket?( SOCKET ) $gs = UNIXServer.open( SOCKET ) Thread.start do loop do ns = $gs.accept Thread.start do sock = ns while l = sock.gets $log.insert( nil, nil, nil, "\n" + l.chomp ) end end end $gs.close end window = Gtk::Window.new( Gtk::WINDOW_TOPLEVEL ) window.set_title( 'my console' ) window.signal_connect( 'delete_event' ) do false; end window.signal_connect( 'destroy' ) do exit; end logvadj = Gtk::Adjustment.new( 0, 0, 0, 0, 0, 0 ) $log = Gtk::Text.new( nil, logvadj ) logvscroll = Gtk::VScrollbar.new( logvadj ) log_box = Gtk::HBox.new( false, 0 ) log_box.pack_start( $log, true, true, 0 ) log_box.pack_start( logvscroll, false, false, 0 ) window.add( log_box ) $log.show logvscroll.show log_box.show window.show window.set_usize( 8, 8 ) Gtk::main
■ クライアント側のフィルタは単純にこんな感じ(biff
)。
#!/usr/bin/ruby -KE require 'socket' require 'nkf' head = ARGF.gets( "\n\n" ) subject = nil head.each do |line| if /^Subject:\s*(.*)$/ =~ line then subject = $1 elsif subject if /^\s+(.*)$/ =~ line subject += $1 else break end end end if subject then subject = NKF::nkf( '-e', subject ) else subject = 'no subject' end begin SOCKET = "/tmp/myconsole-#{ENV['USER']}" sock = UNIXSocket.open( SOCKET ) sock.puts subject sock.close rescue Errno::ECONNREFUSED end
■ 出力には差出人を加えてもいい。表示させる必要のないメールを判断してスキップするようなプラグインを加えられるようにしてもいいな。
あとは、.qmail
に「|biff
」って行を追加するだけ。セッションの始めにmyconsole
を起動して、(sawmillの設定でタイトルバーとかを消して)画面の隅においておけばよろしい。動作状況はこんな感じ。ああ、こんなに簡単ならとっととやればよかったじゃん。
しかしなんだ。いまうちではfetchmail
がメールを1通fetchすると、qmail-ほげほげ
が走り(←何が走るのかよく知らない)、procmail
が走って振り分けをし、さらにメーリングリストの場合はdispatch
がバックアップを取り、ものによってはcut-egroups
がeGroupsの広告を削ってからqmail-ingect
を呼び出し、さらに今日からbiff
も走るという状態だ。メール1通につきプロセス6個も消費してるし。お大尽な話だなぁ、こりゃ。こういう工夫を自力でどんどん追加できちゃうのって、UNIXならではの楽しみでやんすな。
2000-10-29(日) [長年日記]
■ 巨人が勝ったそうで。いや、どうでもいいんだけどね、プロ野球面白くないし。今日のスポーツのトピックスは、「世界二輪GP 250ccクラスで、中野がゴール100m手前でチャンピオンを逃す」と「サッカー日本代表、アジアカップで優勝(予定)」でしょう。それにしても、今日の決勝を最後まで見たら、明日の出社はないような気がする……。
■ mph-get
Ruby 1.6化の余波がまだ続いている。こんどはmph-get。libmphget.rb
がrequireできないと言って動かない。調べてみるとこのファイル、/usr/lib/ruby/1.4/
にあった。標準ライブラリでもないモノを、こんなところに入れてはいけません。ということで、/usr/lib/ruby/site_ruby
に移動して事なきを得る。んで、mph-get upgrade
をかけたら、Apacheが1.3.14に上がっていた。が、mphのヤツ、ついでにRubyを1.6.1→1.4.6にバージョンダウンしようとしてrpmの実行でコケる。あうあう。なんで、古いパッケージで上書きするのがデフォルトなんだろう。今入ってるのが新しかったら無視するのが普通の動作って気がするが。
まぁいい。最近の(?)mph-get
には、hold
ってコマンドがあるのだ。holdされたパッケージは、アップグレードの対象から外してくれる。これにRuby本体と、それに依存するmod_ruby、ruby-ebを加えておこう。
$ sudo mph-get hold ruby mod_ruby ruby-eb $ mph-get hold reading database... H kondara-backgrounds: 1.2-1k H mod_ruby: 0.1.8-5k H ruby: 1.6.1-1k H ruby-eb: 1.4-0vl1
■ これでよし。kondara-backgroundsがhold対象とは知らなかった。
■ それにしても、同じように拡張ライブラリが1.4依存のディレクトリに入ってるんじゃないかと思って調べてみたら、Ruby-EbやRuby/Gtkも1.4/i586-linux
に入っているのだった。うーん、ソース直してリビルドするしかないのか、これは。
■ USB
Rio300の電池蓋がそろそろ寿命。落として蝶番が割れちゃったのをだましだまし使ってきたんだけど、使ってるうちに勝手に開くようになってしまった。rio
コマンドでLinuxから順調にデータを送れるようになってるので、乗り換える気がしないんだけど。もちろん、Kernelが2.4になればUSBが普通に使えて、rio500
が使えるようになるはずで、そしたら500を買ってもいいんだが(600は見た目はいいけど電池交換がやたら面倒だから却下)。
Yahoo!オークションで300をGETすっかなー、などと考えつつ情報収集をしていたら、Kondaraのページでこんなドキュメントを発見。そうか。KondaraでKernel 2.2のままUSBを使うってのもアリ? じゃあちょっとやってみましょう。
# /sbin/lspci | grep -i usb 00:07.2 USB Controller: Intel Corporation 82371AB PIIX4 USB (rev 01)
■ Intelですな。それでは
# /sbin/insmod usbcore Using /lib/modules/2.2.16-5k/usb/usbcore.o # /sbin/insmod usb-uhci Using /lib/modules/2.2.16-5k/usb/usb-uhci.o /lib/modules/2.2.16-5k/usb/usb-uhci.o: init_module: デバイスもしくはリソースがビジー状態です
■ あれ? ちょっとリブートしてみる? ……ダメだ。やっぱりな。実はこのマザーボード(Iwill BD100)、Windows 98でもUSBが使えなかったといういわく付きなのだった(笑)。たぶん、BIOSをアップデートすればいいんだろう。ちょっと考えておこう。その前に、会社のKondaraマシンで実験すべぇ。
しかし、Rioもそうだけど、おれってけっこう新しいモノに飛びつくくせに、そのあとはすごく保守的と言うか、古いモノを大事にしちゃうって言うか。Rioは最初の300を発売日に買ったのに、世間はいまや600だ。デジカメなんて、最初はあのCASIO QV-10をやはり出てすぐに買ったのに、今使ってるのは85万画素のSANYO DSC-X110。最新型はその4倍の画素数だっつーのに。Palmも、3年近く前にpilot5000を買って以来、故障でしかたなくPalmPilotに乗り換えただけで、やっと最近新型を買う気になったし。バイクもそうだよなぁ。カブは流行る前から乗ってるのに、もう12年も同じマシンだ。変なヤツだ、我ながら。
2000-10-28(土) [長年日記]
■ Ruby 1.6
Ruby 1.6.1にしたら、今まで動いていたスクリプトが一部動かなくなっていてちょっと慌てる。こんなメソッド呼び出しがparse errorに。
foo.bar( p1, p2, )
■ まぁ、こんなよけいなコンマを付けている方が悪いのだが。でもArrayは余分なコンマがあってもいいんだよなぁ。
■ eGroups対策
さて、昨日から購読しているVisor-Village ML、ただでさえS/N比が低いのにeGroupsの広告が全メールの末尾に入ってひっじょーにうるさい。これ、受信するときに自動的にカットしちまおう(笑)。例によって自分で作るのは必要最小限にして、既存のツールを活用する。まず、広告部分をカットするフィルターをRubyで書く。eGroupsの広告は「---------- eGroups Sponsor ---------」みたいなセパレータの後ろに入っているので、こんな感じでいい(cut-egroups
スクリプト)。
#!/usr/bin/ruby mail = ARGF.read body, ad = mail.split( /^-+ eGroups Sponsor -+.*$/ ) print body
■ あとはprocmailやqmailの組み合わせで行く。まず、~/.procmailrc
をこんな感じに。
:0 * ^TO_.*visor-valley@egroups.co.jp | cut-egroups | qmail-inject sho-visor-village@spc15.tada
■ これで、Visor-Village MLのメールは、cut-egroups
を通って広告を排除されてからqmailのローカル配送コマンドqmail-inject
によってsho-visor-village@spc15.tadaというアドレスに転送される。さらに~/.qmail-visor-village
というファイルを作って以下の1行を書いておけばおっけー。
./Maildir/.gadgets.visor-valley/
■ Maildirのgadgets/visor-villageというメールボックスに保存する設定だ。qmailは「ユーザ名-hogehoge」というアドレスをこんな風にユーザ権限で作れるから便利。これでうるさい広告とおさらばである♪