トップ 最新 追記
RSS feed

ただのにっき


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」というアドレスをこんな風にユーザ権限で作れるから便利。これでうるさい広告とおさらばである♪


トップ 最新 追記
RSS feed