トップ(最新) | <前

nDiki : データベース

データベース - database

スポンサード リンク

Related term

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 で書かれているので、プラグインを書いて拡張できるよう将来になると面白いなと思ってみたり。

◇ Twitter やってます。この記事が気にいったらぜひ twitter.com/Naney の follower になってください。


[ 12月29日全て ]

2008年3月28日 (金)

今日のさえずり - 向島志 ゛満ん草餅 このエントリーを含むはてなブックマーク

@ 2008年03月27日

naney:2366286266

@ 2008年03月28日


[ 3月28日全て ]

2009年6月8日 (月)

今日のさえずり - ロディアじゃなくてロディだった このエントリーを含むはてなブックマーク

@ 2009年06月07日

@ 2009年06月08日


[ 6月8日全て ]

2009年7月6日 (月)

今日のさえずり - Twitter とシンクロして全部観たかったけれども このエントリーを含むはてなブックマーク

@ 2009年07月03日

  • 09:39 ポニョ DVD をちょっと欲しがっている自分。 [mb]
  • 12:52 Hyper Estraier を 1.2.7 から 1.4.13 にした。 *P3
  • 19:41 えー、小雨降ってきた。 #Akihabara L:秋葉原 [mb]
  • 26:39 2009年7月3日の歩行: 4668歩、3.59km、40分、5.35km/h、消費 180.2kcal、脂肪燃焼 25.8g、2.6エクササイズ。 *P3
  • 26:49 「ヱヴァンゲリヲン新劇場版:序」は良い子なので2回目の CM (9:26 頃)までで我慢した。 *P3
  • 26:51 まあできれば、Twitter とシンクロして全部観たかったけれども。 *P3
  • 27:24 寝る。 *P3

@ 2009年07月04日

  • 24:45 今日からの義母上京中。しばらく驚異的消灯時間生活になる予定。 [mb]

@ 2009年07月05日

  • 07:21 2009年7月4日の歩行: 92歩、0.06km、1分、3.62km/h、消費 3.5kcal、脂肪燃焼 0.5g、0.1エクササイズ。 *P3
  • 08:00 昨日の夜中、りむったーからの D でケータイが鳴ってビビったので Gmail のフィルタ設定修正した。 *P3
  • 22:42 もう消灯時間です。 *P3
  • 23:29 digiKam が落ちた。今日2度目。 *P3

@ 2009年07月06日

  • 17:07 データベース処理で遅そうなところをログで追っかけていたら眠くなってきた。 *P3
  • 18:55 PostgreSQL で serial を使っているデータベースを普通に pg_dump して後で psql で書き戻すと sequence はリセットされるのか。 *P3
  • 19:03 さっきの間違い。sequence に値を書き戻す SQL 文もダンプに含まれていた。 *P3
  • 26:07 2009年7月5日の歩行: 1962歩、1.49km、18分、4.82km/h、消費 75.8kcal、脂肪燃焼 10.8g、1.0エクササイズ。 *P3
  • 26:09 2009年7月6日の歩行: 6517歩、5.10km、53分、5.70km/h、消費 246.1kcal、脂肪燃焼 35.2g、3.6エクササイズ。 *P3
  • 26:16 この週末でツクダ式復習したので、ミニ ルービックキューブ買ってきた。次の週末には LBL 方式再学習したい。 *P3
  • 26:59 Adobe AIR 1.5 インストール中。 *P3

[ 7月6日全て ]

2009年7月16日 (木)

今日のさえずり - ボク、ヨドちゃんになれたよ! このエントリーを含むはてなブックマーク

naney:3726115045

@ 2009年07月15日

  • 11:30 ガッチャマン帽って何? アレのこと? *P3
  • 13:13 午後半休につき会社を出た。いい天気。 [mb]
  • 13:41 buzztter の「日食」を見て日本食堂がなんで話題になっているんだろうと思った。でも理系のつもり。 [mb]
  • 13:47 イマココ、ココス。この間空調が壊れていたところ。 [mb]
  • 13:55 スープコーナーにあるレードルが左右対称で感動した(すくうのは左利き)。 [mb]
  • 14:00 ココス ビッグスマイルクラブ(ポイントサービス)について100円の入会費を払っても入るべきか思案中。 [mb]
  • 14:26 結局ポイントカード作ってみた。 [mb]
  • 14:31 大井町駅前のスターバックス跡地は結局三菱東京UFJ銀行の ATM コーナーになってた。つまんないの。 [mb]
  • 15:17 @axelrodi えー、本当に三菱東京UFJ銀行スターバックスを追い出したというが本当だったらやな感じですねぇ。ATM コーナーが充実していても街としては面白くないもん。 *P3
  • 15:20 Twitter へのフィード投稿を twitterfeed 経由から FriendFeed 経由に変更。twitterfeed にはパスワード預けていたからパスワード変更しなければならんな。 *P3
  • 17:28 各種クライアントを変更する前に Twitterパスワードを変更したため複数回の認証失敗になってログイン禁止くらってた。公園に行ってひとあそびしてきた。 *P3
  • 22:25 MovaTwitter の専用 URL 作り直した。 *P3
  • 23:14 2009年7月14日の歩行: 5488歩、4.26km、47分、5.44km/h、消費 203.5kcal、脂肪燃焼 29.1g、2.8エクササイズ。 *P3
  • 23:16 2009年7月15日の歩行: 8540歩、6.66km、72分、5.54km/h、消費 315.1kcal、脂肪燃焼 45.0g、4.5エクササイズ。 *P3

@ 2009年07月16日


[ 7月16日全て ]

2009年9月12日 (土)

今日のさえずり - 5:30 起床でもまだ時間が足りない このエントリーを含むはてなブックマーク

naney:3911823143

@ 2009年09月11日

  • 05:51 御初穂料ののし袋のサンプル画像ケータイメール
  • 05:54 今週の R25Twitter 記事がある。今回初ならちょっと遅くない?
  • 06:02 あれー、digiKam がおかしい。アルバムディレクトリにある写真データを認識しなくなってる。
  • 06:09 しょうがないので久しぶりに FlickrWeb ページで直接写真アップロード
  • 06:41 今年初月見バーガー。 [Flickr] http://bit.ly/AMFIH
  • 06:48 5:30 起床でもまだ時間が足りないな。
  • 09:35 夜型と違って朝型は次の時間が決まってるからでしょうか。 RT @seven777: 同意。何に時間を使っているんでしょう。RT @Naney 5:30 起床でもまだ時間が足りないな。 [mb]
  • 09:52 月見バーガーあと2週間。 [mb]
  • 10:01 会社近くの100円自動販売機にルーレット機能がついた。 [mb]
  • 12:39 digiKamデータベース捨ててやりなおしたらスキャンしはじめたのでデータベース壊れてたかなと思ったのだが、スキャン終了後も写真表示されず、カウントも 0 のまま。
  • 12:55 2009年9月9日の歩行: 9205歩、7.33km、71分、6.19km/h、消費 337.8kcal、脂肪燃焼 48.2g、4.8エクササイズ。
  • 12:57 2009年9月10日の歩行: 8788歩、6.98km、68分、6.14km/h、消費 330.7kcal、脂肪燃焼 47.3g、4.8エクササイズ。
  • 13:38 Refactor! for C++ 2009.2.4 インストールした。名前の変更だけでもありがたい。
  • 19:07 日曜日10:30で床屋予約
  • 19:19 「No.1理論」のプラス思考度チェック 7.5/18。
  • 19:44 秋葉原駅まで会社の子と一緒に。どうも電車の中でいつも Twitter やっていると思われているらしい。 L:電車の中 [mb]
  • 21:40 モンベルからアウトドア情報誌・カタログ届いた。モンベルクラブ・フレンドフェアは9月26日・9月27日。
  • 23:27 digiKam を最新にしてアルバム表示されるようになった。タグなども消えなかった。ふう。

@ 2009年09月12日

  • 05:56 起床。
  • 06:41 MovaTwitter はまた http://aws.movatwitter.jp/ じゃないとつながらないみたい。 #movatwi
  • 07:58 Debian GNU/Linux sid でがっつりパッケージアップデートしたら BasKet もまたタスクトレイにはいるようになった。どうやら KDE まわりがチグハグなパッケージバージョンだったみたい。
  • 10:55 Partition Wizard Home Edition 4.1 インストール
  • 11:05 4GB のパーティションを作りたいのだが空きが 2.98GB しかないな。何か消すか。
  • 11:23 /etc/console-setup/remap.inc に keycode 58 = Control を追加して setupcon --force --save を実行。
  • 13:48 これから神社行ってくる。 [mb]
  • 15:26 てをあらおう http://movapic.com/...
  • 22:24 Debian GNU/Linux sid アップデートしたら Caps Lock の Ctrl 化が効かなくなっていてた。調べるも新しい設定わからず。
  • 22:24 /etc/default/console-setup ではないのか? 結局 xmodmap で対処。負けた感じ。
  • 23:01 ThinkPad X31 の D2D 領域コピー中。
  • 23:26 2009年9月11日の歩行: 4864歩、3.83km、38分、5.95km/h、消費 182.5kcal、脂肪燃焼 26.1g、2.7エクササイズ。
  • 23:28 2009年9月12日の歩行: 918歩、0.68km、9分、4.31km/h、消費 33.4kcal、脂肪燃焼 4.7g、0.4エクササイズ。
  • 24:13 てをあらおう [Flickr] http://bit.ly/15I5BL

[ 9月12日全て ]

2009年10月12日 (月)

DropboxPortable で必要な時に USB メモリ内を最新環境に同期 このエントリーを含むはてなブックマーク

先週の大型台風では、都心の JR 線は軒並み運転見合わせ。 出社しようにも交通手段がないので復旧するまでは自宅に戻ってできる作業をすることにした(記事)。 しかし前日の夜に残業を終えて帰る際「明日は台風で運転本数も7割ぐらいにする計画という情報が出ている。混雑した電車で潰されたり豪雨で濡れたりする可能性があるのでノート PC は今日は会社に置いて帰ろう。どうせこの時間なら帰宅しても使わないし」と持ち帰らなかったのが仇になった。

いつものノート PC がないので自宅のノート PC を借りて、USB メモリに入れてあるポータブルアプリケーション環境とネットサービスでできることをしておこうと思ったのだが、これが以外に手間取った。

  1. ネットサービスを使おうと思ったが Internet Explorer しかない。Mozilla Firefox, Portable Edition をまずはインストール。しかし、ある程度のアドオンなどが入った Firefox がないと効率が良くないしストレス。いつも使っている Firefox, Portable は USB メモリにはセキュリティの関係でいれていなかった。
  2. GTD で使っている ThinkingRock がない。データは Dropbox 上にあるけれど、Dropboxパスワードは覚えていない。ThinkingRockUSB メモリに入れていない。
  3. Skype で他の人の出社状況を確認しようとしたけれど、他の人の PC の Skype を使うのは気がひける。以前使っていたように USB メモリにも入れておけばよかった。
  4. いくつかの常用パスワード以外は覚えていないので、例えば Dropbox から Web インタフェースで落とそうにもノート PC がないとパスワードがわからない。KeePass データベースにちょっと入っているはずだけれど、積極的に使っていなかったのでたいして登録してないはずだし、同期してないし、そのそもデータベースパスワード忘れている。

ということで、ポータブル環境の見直しが必要かなと。

  1. 紛失した時などためにアカウント情報を含むようなものは基本 USB メモリに入れていない(一部は TrueCrypt 仮想ボリュームに入れてはいた)。しかしいざ使いたいのはそれら。
  2. たまにしか使わないポータブル環境のために、しょっちゅうファイル同期を手動でしたりはしない。ということで、使いたい時には最新のデータが入っていないので、結局使えない。

このあたり、DropboxPortable を使って見直してみることにした。 方針は以下。

  1. ポータブル環境同期用に Dropbox アカウントを取る。メインの Dropbox アカウントに portable/ 共有フォルダを作り共有しておく。
  2. DropboxPortable をダウンロードする。
  3. デスクトップ機に TrueCrypt 仮想ボリュームを作成する。
  4. TrueCrypt 仮想ボリューム内に DropboxPortable を入れる。DropboxPortable/Data/applicaiton Data ディレクトリ以下に DropboxPortableデータベースファイルが作られるため、セキュリティ上 DropboxPortableTrueCrypt 仮想ボリュームの中に入れておく必要がある。
    1. ZIP ファイルを展開する。
    2. DropboxPortable.example.xml を DropboxPortable.xml にし、ディレクトリ指定を \var\Dropbox に書き換える。\var 以下にするのは個人的な好み。
  5. \var\Dropbox\portable 以下に USB メモリと常に同期したいファイル・ポータブルアプリケーション暗号化しておきたいファイルを置く。
  6. 普段からこのボリューム上のアプリケーションを常用して最新の環境にしておくようにする。
  7. USB メモリ上に TrueCrypt をトラベラーモードでいれる。
  8. USB メモリ上に TrueCrypt 仮想ボリュームを作成しデスクトップ機上のと同じように PortableDropbox を設定し同期する。

これで USB メモリがあれば、TrueCrypt 仮想ボリュームをマウントしていつもの環境が使える。 The Internet 接続があるならば DropboxPortable を起動して、サーバ経由で最新の環境・データに同期することができる。

この方法の場合メディア的には TrueCrypt 仮想ボリューム上にファイルがあるので、紛失などしてもちょっと安心。 そのかわり Dropbox とのやりとりでは生ファイルになる(Dropbox 自体も暗号化はしているはずだが)。

当初は TrueCrypt 仮想ボリューム自体を Dropbox で共有しようと思ったが、これだと DropboxPortable のデータファイルが保護できない。TrueCrypt 仮想ボリュームの中に TrueCrypt 仮想ボリュームを作ればメディア的にも Dropbox 上的にも暗号化できるが、手間だしパフォーマンス的にもつらそう。 TrueCrypt 仮想ボリューム内で Dropbox で同期しているファイルについては、重要なファイルのみ個別に暗号化で対応したい。

あと、今回使ってみてわったのだが DropboxPortable はメインで動かしている Dropbox とは別に同時に起動できるのね。 これは便利。Dropbox を複数アカウント同時に使う時にも活用できるな。


[ 10月12日全て ]

2010年1月26日 (火)

今日のさえずり - これ Emacs なのよね このエントリーを含むはてなブックマーク

naney:4310098021

@ 2010年01月26日


[ 1月26日全て ]

2010年3月10日 (水)

FriendFeed で出直す方法 このエントリーを含むはてなブックマーク

結論から言うとアカウントを削除して、しばらく(数十分)待てば同じユーザ名を取得可能(その間に他の人に取られなければ)。

FriendFeed を使い始めて最初の頃は「Twitter の友達を探す」でガンガン講読登録をして、気がつけば 900 を超えていた。フィードが流れるのを楽しむには多い方が楽しい。 でも「そういえば Twitter で unfollow したアカウントのフィードも混ざったままだな」と思ったらなんか気持ち悪くて整理したいなとかなり前から思っていた。1つずつ選んで登録解除するのも結構大変だし不毛なので全部一旦削除したくなったんだけれど、そのような機能が見あたらず。

ということで過去のエントリが削除されるし、講読登録してくれている人も解除されてしまうけれど、一旦削除してアカウントを取りなおすことにした。

「削除したらユーザ名が永久欠番になり再取得できないかも」というリスクはあったが、再取得できるという記事も、できないという記事も見当らないのでいちかばちか削除。

でいざ同じユーザ名で登録……できないー。もう1度、できないー。 しょうがない別のユーザ名で登録……そのメールアドレスもう使われてるよーだって。

あちゃ、やっちゃったか。別のメールアドレス用意する必要があるかなと思ったが、考えてみるとメールアドレスが使用中ってでるということは、まだアカウントの削除がデータベース上で完全に終わってないのだと推測。

ということで我慢してしばらくしてみてからトライしてみたら取れました、同じユーザ名・メールアドレスで。

ということでアカウントがまっさらになった(正確にいうと、なぜか (deleted account) というのを講読登録していることになっていたので、まず登録解除)。 設定項目は多くないので、ささっと設定。

同じユーザ名が取れたので、ユーザの URL を変えてまわったりしなくて済んで助かった。それと以前設定した Facebook 上の FriendFeed アプリケーション設定もそのまま生きていて、再取得後に設定した自分のフィードが何ごともなかったかのように Facebook に流れていた。 逆に考えると、削除して他の人に再取得されるとやはりいろいろ不味いことがおこる可能性もありえるな。 一度取得したユーザ名はやはり下手に手放さない方が吉。


[ 3月10日全て ]

2010年3月13日 (土)

KeePass 2.x はマルチプラットフォームに難 このエントリーを含むはてなブックマーク

先月末に KeePass 1.x (Windows 上) + KeePassX (Linux 上) から、KeePass 2.x (.NET Framework / Mono) に乗り換えてみた。

お目当ては 2.x で使えるようになった「カスタム文字列フィールド」。 アカウント作成時に登録したメールアドレスなどを管理したかったので。 コメントでもいいんだけれど、フリーフォーマットではなくてきちんとフィールドとして入力しておきたかった。 試してみたところメイン画面のリストのカラムとしてこのフィールドを表示する機能がなかったのちょっと残念。思ったほど便利じゃなかった。

KeePass 2.x では .NET Framework / Mono を使って、Windows でも Linux でも同一のバイナリで実行できるというのが売りの1つ。 しかしながら Linux + Mono だと自分の環境ではテキストのコピー&ペーストが機能しなかった。これはパスワード管理ツールとして致命的。

半月ほど使ってみたけれど KeePass 1.x 系から移行するメリットがあまりなく自分の環境ではむしろ使い勝手が悪くなったなという感想。

パスワードデータベースファイルも 2.x 系 (.kdbx) には対応していなくて 1.x 系 (.kdb) のみの互換ツールも多いので、まだしばらくは 1.x 系の方が良さそうだ。

ということでデータベースを .kdb に変換して元に戻した。当面は 1.x 系にしよう。


[ 3月13日全て ]

この日記のはてなブックマーク数 Add to Google RSS

Process Time: 0.0473s / load averages: 0.74, 0.38, 0.33
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)