spam メールは procmail で bogofilter (with nkf + KAKASI) しているのだが、以前からちょっと挙動が変である。 すり抜けてきた spam メールをあらためて、bogofilter で判定してみると spam メール判定になることがしばしば。
ということで、Mew を 4.2 にアップデートしたついでに spam フィルタを bsfilter にかえてみることにした。
sid のパッケージはちょっと古いので、tarball を持ってきて /usr/local の下に展開。
.procmailrc に以下を追加:
#------------------------ # bsfilter #------------------------ :0 HB: * ? /usr/local/bsfilter-1.0.7/bsfilter/bsfilter $HOME/Mail/newspam/.
それから Mew の方は /usr/local/bsfilter-1.0.7/mua/mew4/ の下の emacs.el と mew.el をロードするようにしておく。
今回は収集済みの spam メールをまとめて登録することなく、新着のもののみポチポチ登録しているのだがそれでも十分振り分けてくれる。
使い始めの感蝕としては、 bogofilter より bsfilter の方が積極的に spam メール判定になっている感じだ。bigram による傾向なのかな?
朝から ThinkPad X31 の HDD 新しく入れ替えて Debian GNU/Linux sid のインストールを開始。
今日は sarge のネットワークインストール CD イメージからブートしてインストール。 今回はブートドライブにできる「ThinkPad USB ポータブルCD-ROMドライブ」があり、またこのイメージで起動して e1000 が認識できるので楽勝である。
(第1回目は USB FDD + PC カード NIC でインストール、第2回目 は HDD 上のインストーラから GRUB からの起動によるインストールだった)
ヤバイ状態の旧 HDD を USB 外付け HDD ケースに詰めて
を新しい HDD にコピー。
次に環境の復旧。 以下備忘録。
以前作った Linux kernel 2.6.15 deb パッケージをインストールした後 module-assistant で madwifi をインストールするも、ビルドした GCC のバージョンが違ってロードできず。 kernel は GCC 4.0 の時にビルドしたもので、madwifi は現在のバージョンである GCC 4.1 によるビルドであることが問題。
まずは前にビルドした 2.6.15 のソースディレクトリでカーネルパッケージを GCC 4.1 で作りなおしてインストールし、あらためて module-assistant。
module-assistant prepare module-assistant auto-install madwifi
で /etc/network/interfaces を書き戻す。
ここずっと使っていた qmail をこの機会にやめることにした。 Postfix へ。
全体の設定はインストーラに従って設定。
個人設定は、
~/.qmail に
| preline /usr/bin/procmail
として procmail を使っていたので、~/.forward を作って同様に procmail に流すようにする。
"|IFS='' && exec /usr/bin/procmail -f- || exit 75 #naney"
~/.procmailrc は以前のまま。ClamAV と bsfilter でふるいにかけた後、Maildir へ。
以前入れた時は deb が古かったので /usr/local に自前でインストールした。 まずはこれを古い HDD から戻して動作確認後 deb のものに切り替え。
.mew.el の中も
(load "/usr/share/doc/bsfilter/examples/mua/mew4/mew.el")
に変更。
/etc/samba/smb.conf を書き戻す。smbpasswd でパスワード再設定。
とりあえずインストール時の設定で xorg.conf を作る。
Load "freetype"
をコメントアウトして、
Load "xtt"
に変更。
sid は現在 3.5.3 と 3.5.4 混在状態になっているため、依存関係の問題で簡単にはインストールできずてこずった。 kdebase-data と kdelibs-data の 3.5.3 を http://snapshot.debian.net/ からとってきて hold して 3.5.3 系 KDE として各種パッケージをインストール。
skype-beta-1.3.0.30-1_i386.deb をインストール。
一般ユーザ naney の crontab ファイルを再登録。
足りないと気がついた時点で順次インストール。
/etc/auto.master、/etc/auto.misc を書き戻して /etc/init.d/autofs restart。
deb パッケージを公式サイトからダウンロードし、/etc/mt-daapd.conf を書き戻して /etc/init.d/mt-daapd restart
Gmail は2004年12月に招待してもらって登録していたのだが、アカウントは Google の各種サービス用として使っていたものの、メールボックスはほぼ全く使用していなかった。 なんだかんだいって抵抗感があった訳で。
しかし、
ということからメールボックス Gmail に集約してしまうことにした。
やった事は以下。
pwgen で自動生成したパスワードを使っていたのだが、今後入力する機会が増えるので覚えられるものに変更。
普段使っている MUA である Mew のバージョンを 4 から 5 にバージョンアップ (Debian sid の Debian パッケージが上がった時に、ホールドしたままだった)。
もれなく k-/ が Namazu から Hyper Estraier になっていた。
「Gmail から直接」および「Gmail の SMTP サーバ経由」で普段使っているメールアドレスを使って送信できるようにアカウントを登録。
Web の設定画面で追加するとメールで確認コードが送られてくるので、それを使って有効化する。
Gmail 側で POP を有効にした後、fetchmail で fetch できるようにする。
defaults no mimedecode pass8bits poll pop.gmail.com protocol pop3 user xxx@gmail.com password xxx ssl fetchall
SSL を使用して fetch できるようしておく。
設定を始めるまでは「POP3 で Gmail アカウント使うのどうよ」と思っていたけれど、SSL 経由なのでちょっと安心した。
POP 後 Gmail 側ではアーカイブに移動するようしておく。
今まで SMTP over SSH でホスティングサービス経由等で送っていたものを、Gmail に TARTTLS を使って送れるように設定する。
mew-config-alist の中で
("default" ("user" . "naney") ("mail-domain" . "naney.org") ("smtp-server" . "smtp.gmail.com") ("smtp-user" . "xxx@gmail.com") ("smtp-ssl" . t))
送信メールアドレスは user と mail-domain で設定。Gmail のアカウント名は smtp-user で設定。 smtp-ssl も t にしておく。
その他メールアドレス毎に経路を変えて送ったりしていたのだが全部同様の設定にして Gmail 経由にする。
今まで Dcc で自分宛にコピーを送って管理していたのだが、Gmail では自分が SMTP 経由で送信したメールは POP できないらしい。 げっ。
ということで Fcc を
(setq mew-fcc "+sent")
から
(setq mew-fcc "+sent,+inbox")
に変更して、sent/ 以外に inbox/ にも複製を作るようにして対処。
普段使っている各メールアドレスのメールボックスから、全て Gmail へ転送するように設定。 たまっていた分は今まで通りの方法で fetch してクリアしておく。
Gmail カスタムボタンを表示するように変更。 ツールバーから Gmail にアクセスできるようにしておく。
Gmail アカウントを登録。 Google デスクトップで Gmail 上のメールを検索できるようにしておく。
試しに使ってみる。
モバイル Gmail から送られるメールの From: は Gmail でデフォルト設定したもので固定らしい。 ちょっと融通が効かない。
ま、プライベートのメールはiモードメールで送ってしまっても良いので、Gmail のデフォルトのメールアドレスを仕事用のに設定しておくことで対応しよう。
これで大体設定完了。
メリットは以下。
Gmail で言うところのスレッドについては、ちょっと慣れが必要そうだな。
なにはともあれ、一気に移行してしまった。 細かい所で違和感がまだあるけれども、いずれ慣れるだろう。 きっとその時は便利に感じるに違いない。
ようやくこれで本当の Gmail ユーザだ。
全てのメールボックスを Gmail に集約してから3日目。
いろいろと気がついた点等をメモ。
今まで使っていた bogofilter や bsfilter では比較的安全側にふってあって、spam メールが ham メールと判定されることはあっても(結構ある)、ham メールが spam メールと判定されることはほとんどなかった。
しかし Gmail はかなり過激に spam メールと判定してくれる。 気をつけないとメールを見逃がすので、今のところ定期的「迷惑メール」をチェックする必要がある。
面倒だけれどもしょうがない。ある程度学習したら落ちつくのか?
何かぐっと届くメールが減った感じがしたので確認したら、今まで使っていたメールボックスに、転送に失敗したのか80通強ほどメールが溜っていた。
送り側が悪いのか Gmail 側が悪いのかわからないけれども、これは困る。 メーリングリストやメールマガジン系が転送できていない傾向が強いが、かといって全てがそうなわけでもない。うーん。
「パスワードを登録する」のと「POP3 で平文パスワードが流れるようになる」のがかなり嫌なんだけれども、しょうがないので転送をやめて Gmail 側から POP することにした。
今まで取れていなかったメールもとりあえず取りこぼさないようになりそう。
この設定でまたしばらく様子見。
Twitter で following が増えてくるにつれて、タイムラインに目を通すのが大変になってきた(という程きちんと見ている訳ではないが)。 さっとタイムラインをなめて面白そうな情報をピックアップしたい時は、「おはよう」とか「風呂入った」とか「トイレ」とかは除外して読みたい(そういう書き込み自体は嫌いじゃないのだが、人生はあまりにも短い)。
Twit や P3:PeraPeraPrv では NG ワード指定ができて、それらを含むステータスは表示しないようにできるのだが、Twitter の書き込みは揺らぎが激しすぎて指定しきれないという弱点がる。
ということでベイジアンフィルタでフィルタリングしてみることにした。
自前で Twitter クライアントを作る気はないので、proxy の形でさっと実装してみた。
#!/usr/bin/perl use strict; use warnings; use HTTP::Proxy; use HTTP::Proxy::BodyFilter::complete; my $proxy = HTTP::Proxy->new(port => 8088); $proxy->push_filter(response => HTTP::Proxy::BodyFilter::complete->new, mime => 'application/xml'); $proxy->push_filter(response => Bsfilter->new, mime => 'application/xml'); $proxy->start; { package Bsfilter; use File::Temp qw/tempfile/; use XML::XPath; use base qw(HTTP::Proxy::BodyFilter); sub filter { my ($self, $dataref, $message, $protocol, $buffer) = @_; return unless defined($$dataref) && $$dataref ne ''; eval { my $xml = XML::XPath->new(xml => $$dataref); my @nodes = $xml->findnodes('/statuses/status/text/text()'); return unless @nodes; for my $node (@nodes) { my $text = $node->getNodeValue; if (is_NG($text)) { $node->setNodeValue("[NG] $text"); } } $$dataref = qq(<?xml version="1.0" encoding="UTF-8"?>\n); $$dataref .= $xml->get_context->toString; utf8::encode($$dataref); }; if ($@) { warn $@; } } sub will_modify { 1 } sub is_NG { my ($text) = @_; my ($fh, $filename) = tempfile(); utf8::encode($text); print $fh $text; close($fh); my $result = system( "bsfilter --homedir ~/.twitter-bsfilter --ignore-header --auto-update $filename" ); unlink($filename); return !$result; } }
Perl で HTTP proxy を作ろうとして真っ先に思い浮かんだのは POE だけれど、ちょっとヘビーなので今回は HTTP::Proxy をチョイス。 もともとフィルタリング HTTP proxy を作ることを念頭に置いた Perl モジュールなので今回の目的にぴったり。
1つはまった点といえば、filter の呼び出しがレスポンス全てを取得してからではなく一部分ずつの呼び出しになるところ。その仕様に気がつくのにちょっと時間がかかってしまった。 例えば XML 形式のレスポンスをフィルタしようとしても、普通に HTTP::Proxy を使うと XML の一部ずつがフィルタに渡されるため、XML のパースがうまくいかない。
これについては HTTP::Proxy::BodyFilter::complete を使うことで、まとめてフィルタに渡せるようになった。
Twitter のタイムライン取得については P3:PeraPeraPrv が XML 形式で取得しているので、そのタイプのレスポンスをフィルタするようにした。
XML::XPath でステータス部分を抜き出して NG 判定し、NG であれば先頭に [NG] を追加する。 これで Twitter クライアント側で [NG] を NG ワード指定すれば、表示されないようにすることができる。
NG 判定は普段メールの spam フィルタとして使っている bsfilter を使った。 単純に system 関数で呼び出して結果を取得するだけ。
今回は対象がメールではないので --ignore-header を指定。また自動的に学習するように --auto-update を指定。 それと普段メールのフィルタリングに使っているのとは bsfilter のデータベースを別にしたいので、--homedir も指定しておく。
NG ワードを twitter-NG.txt に、非 NG ワードを twitter-clean.txt に書いて以下のコマンドを実行。
bsfilter --add-clean --ignore-header --homedir ~/.twitter-bsfilter twitter-clean.txt bsfilter --add-spam --ignore-header --homedir ~/.twitter-bsfilter twitter-NG.txt bsfilter --update --homedir ~/.twitter-bsfilter
自分の環境 (Debian GNU/Linux sid)では、UTF-8 で書いておいて問題なかった。
あとは先の proxy を起動し、P3:PeraPeraPrv でプロキシとして localhost:8088 を指定すれば OK。
タイムラインを取得するたびに bsfilter が動いて NG なステータスには [NG] が挿入される。
これについては、まだまだチューンの必要ありかな。
まだ使える精度まで上がってないけれど、教師データを増やせばそれなりにいけるかもしれない。
proxy の枠組ができたので、(@~は抜いてから bsfilter に渡すとか、前後の文脈も含めるとか)いろいろ試して遊べそうではある。 別に bsfilter にこだわらず、正規表現による判定などをしてもよいし。
昨日からの作業は以下。
ロストすると一番痛いのはメール。 現行の設定を引き継ぐのに必要な Debian パッケージ (postfix、fetchmail、procmail、mew、bsfilter、clamav など) をインストール。
それからいきなり X Window System が起動しないように gdm をアンインストール。 デスクトップは KDE を使っているので必要そうなパッケージを変わりにインストール。
その後 ThinkPad X31 でいつも通りに pdumpfs を実行して外付け HDD に /home・/etc・/var のスナップショットを保存。で ThinkPad X200 につなぎかえて cp -a で /home をコピー。
~/.kde/ は前回途中で KDE のバージョンが大きく上がったこともあって、移行的な設定も残っていそうなので今回は破棄して心機一転とした。
それと、こちら過去のものをそのまま使いたかったのだがなんか挙動が変だったので ~/.mozilla/ も削除して(リネームして)作り直し。ブックマークはとりあえずエクスポートして移した。 ScrapBook で保存したページも後で移行しなければな。
これで /home の移行完了。あとは同期するのも面倒なので ThinkPad X31 は退役として ThinkPad X200 を母艦とすることにしよう。
明日から ThinkPad X200 持ち歩き。
Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。
nDiki は1999年1月に始めたコンピュータ日誌を前身とする Naney の Web 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。
※内容は個人的見解であり所属組織とは関係ありません。