nDiki : bsfilter

2005年7月9日 (土)

bogofilter から bsfilter に乗り換え

spam メールprocmailbogofilter (with nkf + KAKASI) しているのだが、以前からちょっと挙動が変である。 すり抜けてきた spam メールをあらためて、bogofilter で判定してみると spam メール判定になることがしばしば。

ということで、Mew を 4.2 にアップデートしたついでに spam フィルタを bsfilter にかえてみることにした。

sid のパッケージはちょっと古いので、tarball を持ってきて /usr/local の下に展開。

procmail

.procmailrc に以下を追加:

 #------------------------
 # bsfilter
 #------------------------
 :0 HB:
 * ? /usr/local/bsfilter-1.0.7/bsfilter/bsfilter
 $HOME/Mail/newspam/.

Mew

それから Mew の方は /usr/local/bsfilter-1.0.7/mua/mew4/ の下の emacs.el と mew.el をロードするようにしておく。

  • inbox に spam メールがきたら、Summary mode で 'ls'。
  • (procmail の振り分けで)newspam に ham メールがきたら、Summary mode で 'lh'。

今回は収集済みの spam メールをまとめて登録することなく、新着のもののみポチポチ登録しているのだがそれでも十分振り分けてくれる。

使い始めの感蝕としては、 bogofilter より bsfilter の方が積極的に spam メール判定になっている感じだ。bigram による傾向なのかな?

スポンサード リンク
[ 7月9日全て ]

2006年7月29日 (土)

Debian GNU/Linux sid 環境を新 HDD

朝から ThinkPad X31HDD 新しく入れ替えて Debian GNU/Linux sidインストールを開始。

Debian GNU/Linuxインストール

今日は sarge のネットワークインストール CD イメージからブートしてインストール。 今回はブートドライブにできる「ThinkPad USB ポータブルCD-ROMドライブ」があり、またこのイメージで起動して e1000 が認識できるので楽勝である。

(第1回目USB FDD + PC カード NIC でインストール第2回目HDD 上のインストーラから GRUB からの起動によるインストールだった)

最低限のものを入れたらすぐ sidアップグレード

HDD からのコピー

ヤバイ状態の旧 HDDUSB 外付け HDD ケースに詰めて

  • /home 全部
  • /usr/local で必要なもの
  • 参照用に /etc の複製
  • /var/www、/var/spool

を新しい HDD にコピー。

次に環境の復旧。 以下備忘録。

MADWIFI

以前作った 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 を書き戻す。

SMTP サーバを Postfix

ここずっと使っていた qmail をこの機会にやめることにした。 Postfix へ。

全体の設定はインストーラに従って設定。

個人設定は、

~/.qmail

 | preline /usr/bin/procmail

として procmail を使っていたので、~/.forward を作って同様に procmail に流すようにする。

 "|IFS='' && exec /usr/bin/procmail -f- || exit 75 #naney"

~/.procmailrc は以前のまま。ClamAVbsfilter でふるいにかけた後、Maildir へ。

bsfilter は deb のものに

以前入れた時は deb が古かったので /usr/local に自前でインストールした。 まずはこれを古い HDD から戻して動作確認後 deb のものに切り替え。

.mew.el の中も

 (load "/usr/share/doc/bsfilter/examples/mua/mew4/mew.el")

に変更。

Samba

/etc/samba/smb.conf を書き戻す。smbpasswd でパスワード再設定。

X

とりあえずインストール時の設定で xorg.conf を作る。

 Load "freetype"

をコメントアウトして、

 Load "xtt"

に変更。

KDE

sid は現在 3.5.3 と 3.5.4 混在状態になっているため、依存関係の問題で簡単にはインストールできずてこずった。 kdebase-data と kdelibs-data の 3.5.3 を http://snapshot.debian.net/ からとってきて hold して 3.5.3 系 KDE として各種パッケージをインストール

フレッシュリーダー

以前インスールした状態に復旧

  1. libapache2-mod-suphp php5-cli をインストール
  2. /var/www/freshreader、/etc/apache2/sites-available/freshreader を戻す
  3. a2ensite freshreader
  4. /etc/init.d/apache2 reload
  5. /etc/hosts に freshreader を追加

cpufreqd

  1. cpufreqdインストール
  2. /etc/cpufreqd.conf を戻す
  3. /etc/init.d/cpufreqd restart

Skype

skype-beta-1.3.0.30-1_i386.deb をインストール

cron

一般ユーザ naney の crontab ファイルを再登録。

Perl モジュール

足りないと気がついた時点で順次インストール

autofs + smbfs (2006年8月3日)

/etc/auto.master、/etc/auto.misc を書き戻して /etc/init.d/autofs restart。

mt-daapd (2006年8月22日)

deb パッケージを公式サイトからダウンロードし、/etc/mt-daapd.conf を書き戻して /etc/init.d/mt-daapd restart

[ 7月29日全て ]

2007年8月8日 (水)

メールボックスを Gmail に集約

Gmail2004年12月に招待してもらって登録していたのだが、アカウントは Google の各種サービス用として使っていたものの、メールボックスはほぼ全く使用していなかった。 なんだかんだいって抵抗感があった訳で。

しかし、

  • ホスティングサービスで利用しているメインのメールボックスが1アカウント10MBで、数日 fetch できないと溢れてしまう。PHS を解約した今、帰省の時などは fetch できない状況になりヤバイ。
  • パケ・ホーダイにしたのを機にモバイル Gmail で外出先でも仕事関連のメールをチェックできるようにしたい。

ということからメールボックス Gmail に集約してしまうことにした。

移行作業

やった事は以下。

アカウントのパスワードを変更

pwgen で自動生成したパスワードを使っていたのだが、今後入力する機会が増えるので覚えられるものに変更。

メーラ (Mew) のバージョンアップ

普段使っている MUA である Mew のバージョンを 4 から 5 にバージョンアップ (Debian sidDebian パッケージが上がった時に、ホールドしたままだった)。

もれなく k-/ が Namazu から Hyper Estraier になっていた。

Gmail に普段使っているメールアドレスを登録

Gmail から直接」および「GmailSMTP サーバ経由」で普段使っているメールアドレスを使って送信できるようにアカウントを登録。

Web の設定画面で追加するとメールで確認コードが送られてくるので、それを使って有効化する。

Gmail から POP3 でメールをローカルに取れるように設定

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 側ではアーカイブに移動するようしておく。

Mew から GmailSMTP サーバ経由でメールを送れるようにする

今まで 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 経由にする。

Mew から自分宛のコピーを Dcc から Fcc に変更

今まで Dcc で自分宛にコピーを送って管理していたのだが、Gmail では自分が SMTP 経由で送信したメールは POP できないらしい。 げっ。

ということで Fcc を

 (setq mew-fcc "+sent")

から

 (setq mew-fcc "+sent,+inbox")

に変更して、sent/ 以外に inbox/ にも複製を作るようにして対処。

メールボックスから Gmail へ転送設定

普段使っている各メールアドレスのメールボックスから、全て Gmail へ転送するように設定。 たまっていた分は今まで通りの方法で fetch してクリアしておく。

Google ツールバーの設定を変更

Gmail カスタムボタンを表示するように変更。 ツールバーから Gmail にアクセスできるようにしておく。

Google Desktop (Linux 版)の設定を変更

Gmail アカウントを登録。 Google デスクトップGmail 上のメール検索できるようにしておく。

iモードから、モバイル Gmailへアクセスしてみる

試しに使ってみる。

モバイル Gmail から送られるメールの From: は Gmail でデフォルト設定したもので固定らしい。 ちょっと融通が効かない。

ま、プライベートのメールiモードメールで送ってしまっても良いので、Gmail のデフォルトのメールアドレスを仕事用のに設定しておくことで対応しよう。

これで大体設定完了。

移行したことによるメリット

メリットは以下。

  • メールボックスの溢れの心配がなくなる。
  • Gmail spam 機能が使える。- ローカルで bsfilter 使っているけれども、それよりも強力 (多分)。
  • Web ブラウザからメール送受信ができる。- 自分の端末以外でパスワードを入力するのが怖いのと、自分の端末があるなら Mew から送受信してしまうからサブで。
  • iモードからメールをチェックできる。

Gmail で言うところのスレッドについては、ちょっと慣れが必要そうだな。

移行したことによるデメリット

  • メールがローカルまで落ちてくるのが遅くなる。- 各メールボックスからの転送分のタイムラグがある。さらに Gmail では受信してもすぐ POP できるわけではないようだ。なので、Web ブラウザ上で受信を確認していてもそれに対してローカルの Mew で引用返信がすぐできなくなってしまった。
  • リモートサーバ上にメールを置いておくことに対する不安感がある。
  • iモードからメールをチェックできる。見なくてもいい時に読んでしまう可能性が。

なにはともあれ、一気に移行してしまった。 細かい所で違和感がまだあるけれども、いずれ慣れるだろう。 きっとその時は便利に感じるに違いない。

ようやくこれで本当の Gmail ユーザだ。

[ 8月8日全て ]

2007年8月11日 (土)

Gmail へのメールボックス移行で spam 誤判定と転送問題にぶつかる

全てのメールボックスを Gmail に集約してから3日目。

いろいろと気がついた点等をメモ

spam 誤判定が多い

今まで使っていた bogofilterbsfilter では比較的安全側にふってあって、spam メールが ham メールと判定されることはあっても(結構ある)、ham メールspam メールと判定されることはほとんどなかった。

しかし Gmail はかなり過激に spam メールと判定してくれる。 気をつけないとメールを見逃がすので、今のところ定期的「迷惑メール」をチェックする必要がある。

面倒だけれどもしょうがない。ある程度学習したら落ちつくのか?

うまくメールが転送されてこない?

何かぐっと届くメールが減った感じがしたので確認したら、今まで使っていたメールボックスに、転送に失敗したのか80通強ほどメールが溜っていた。

送り側が悪いのか Gmail 側が悪いのかわからないけれども、これは困る。 メーリングリストメールマガジン系が転送できていない傾向が強いが、かといって全てがそうなわけでもない。うーん。

パスワードを登録する」のと「POP3 で平文パスワードが流れるようになる」のがかなり嫌なんだけれども、しょうがないので転送をやめて Gmail 側から POP することにした。

今まで取れていなかったメールもとりあえず取りこぼさないようになりそう。

この設定でまたしばらく様子見。

[ 8月11日全て ]

2007年12月29日 (土)

Twitter ベイジアンフィルタプロキシ

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;
   }
 }

HTTP proxy の作成

PerlHTTP proxy を作ろうとして真っ先に思い浮かんだのは POE だけれど、ちょっとヘビーなので今回は HTTP::Proxy をチョイス。 もともとフィルタリング HTTP proxy を作ることを念頭に置いた Perl モジュールなので今回の目的にぴったり。

1つはまった点といえば、filter の呼び出しがレスポンス全てを取得してからではなく一部分ずつの呼び出しになるところ。その仕様に気がつくのにちょっと時間がかかってしまった。 例えば XML 形式のレスポンスをフィルタしようとしても、普通に HTTP::Proxy を使うと XML の一部ずつがフィルタに渡されるため、XML のパースがうまくいかない。

これについては HTTP::Proxy::BodyFilter::complete を使うことで、まとめてフィルタに渡せるようになった。

レスポンスの処理

Twitter のタイムライン取得については P3:PeraPeraPrvXML 形式で取得しているので、そのタイプのレスポンスをフィルタするようにした。

XML::XPath でステータス部分を抜き出して NG 判定し、NG であれば先頭に [NG] を追加する。 これで Twitter クライアント側で [NG] を NG ワード指定すれば、表示されないようにすることができる。

bsfilter による NG 判定

NG 判定は普段メールspam フィルタとして使っている bsfilter を使った。 単純に system 関数で呼び出して結果を取得するだけ。

今回は対象がメールではないので --ignore-header を指定。また自動的に学習するように --auto-update を指定。 それと普段メールのフィルタリングに使っているのとは bsfilterデータベースを別にしたいので、--homedir も指定しておく。

NG と非 NG の学習。

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] が挿入される。

フィルタリングの精度

これについては、まだまだチューンの必要ありかな。

  • 事前の学習データが少ない。
  • --auto-update していることもあり、最初に NG 判定が多いとそちら側に強化されすぎる。
  • 毎回 bsfilter を呼んでいるため、同じステータスが何度も学習される。

まだ使える精度まで上がってないけれど、教師データを増やせばそれなりにいけるかもしれない。

proxy の枠組ができたので、(@~は抜いてから bsfilter に渡すとか、前後の文脈も含めるとか)いろいろ試して遊べそうではある。 別に bsfilter にこだわらず、正規表現による判定などをしてもよいし。

この辺り P3 は Java で書かれているので、プラグインを書いて拡張できるよう将来になると面白いなと思ってみたり。

[ 12月29日全て ]

2008年1月1日 (火)

今日のさえずり - 「○○ったー」の「たー」って品詞は何だ

  • 09:17 福茶を飲む。[mb]
  • 13:34 届いた年賀状チェックした。宛名間違い「善正」はよくあって許容範囲だが、「喜生」は初めてだ。
  • 19:50 Twitter ベイジアンフィルタプロキシで使っている bsfilter を --jtokenizer block にしてみた。
  • 22:20 「○○ったー」の「たー」って品詞は何だ?
  • 23:56 「エコ湯~ゆ」出した。
[ 1月1日全て ]

2009年1月18日 (日)

bsfilter のトークンと Twitter

bsfilter を使った Twitter 発言のフィルタリングのため、bsfilter仕様を確認していたところ、トークン扱いにする文字種が以外に少ないことに気がついた。 日本語については漢字とカタカナしか見ていない。

うーん、これだと Twitter の発言のトークンとしてはちょっと物足りないな。 変更するにはソースをいじる必要がありそう。 メール処理を前提にした bsfilter ではなく、汎用のベイジアンフィルタを使うようにする方がよさそうだ。

[ 1月18日全て ]

2009年11月23日 (月)

/home を書き戻して ThinkPad X200 へ乗り換え完了

昨日からの作業は以下。

ロストすると一番痛いのはメール。 現行の設定を引き継ぐのに必要な Debian パッケージ (postfix、fetchmailprocmail、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 持ち歩き。

[ 11月23日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィでマネージャー・プロダクトオーナーをしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

follow us in feedly

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.077188s / load averages: 0.62, 0.76, 0.69
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker