nDiki : proxy

proxy - プロキシ、プロクシ。

代理として働くコンピュータ/サーバ/ソフトウェアのこと。

web proxy

  • Squid
  • Privoxy - フィルタリング機能を持っている
  • WWWOFFLE
  • ffproxy
  • Oops!

Firefox 拡張機能

  • FoxyProxy - 登録された URL パターン毎に自動的に proxy を切り換えてくれる。

SSH

関連情報

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月6日 (日)

今日のさえずり - バスクリンに「マジッ」をたすとバスマジックリン

  • 10:32 親戚から 050 で電話がかかってきた。
  • 12:54 PC 触っているときりがない。
  • 14:29 毎日曜日は基本ノー PC デーにしようかな。今日はもう結構使ったけれど。[mb]
  • 16:04 年賀状投函。ポストがもう年賀状モード解除されてる。[mb]
  • 16:55 今日のサウンドロップ クレヨンしんちゃん「いや〜それほどでもぉ」[mb]
  • 18:09 バスクリンに「マジッ」をたすとバスマジックリンになることに気づいた。[mb]
  • 18:22 Amazon.co.jp 使ったギフトが初めてウチにきた。[mb]
  • 18:34 まりもの水交換した。[mb]
  • 23:59 Google proxy 経由でiモードから拙作 WikiEngine に書き込めた。[mb]
[ 1月6日全て ]

2008年1月7日 (月)

ケータイ用にプライベート Wiki を設置

パケ・ホーダイ契約してから、MovaTwitterRTMモバイル Gmail などで携帯電話を活用するようになった。そんななか、決定打がないのが、ノートアプリケーション。電車の中などの隙間時間に、この nDiki の 下書きなどはケータイでできるようにしたい。

Google ドキュメントが使えればいいが、前年ながらまだiモードでは使えない。 メールベースでやる手もあるが、メモには良いものの再編集を繰り返したいようなものに難がある。

ということで自前でプライベート Wiki を立てそこに書き込んでみることにした。

iモードから WiKicker

使う WikiEngine はいつも通り自作の WiKicker

書き込んだテキスト内のキーワードを nDiki自動リンクさせることができるので、パーソナルナレッジベースとして自分にとっては一番便利。書式も同じなので、Wiki に書いた下書きを、そのまま nDiki で使える。

肝心のケータイからの書き込みだが Ajax 等凝った技術を使っていないおかげで、問題なく FOMA 端末(D703i)からiモードで読み書きできた。WiKickerUTF-8 でページを出力しているが、網側か端末側の処理かは知らないが今のところ問題なし。

なお認証は簡単に Basic 認証で済ますことにした。 安全とは言えないがそれほど重要なデータを置くわけではないしいいかな。 cookie は必要ないし WikiEngine に手を入れなくてもよいので、すぐできるのはコレ。

ユーザ名とパスワード付きのトップページ URL を端末でブックマークしておけば1発でアクセスできる。

Google Mobile Proxy 経由で使う

これでケータイ(と PC)から使えるプライベート Wiki を設置できたわけだが、なにぶんもともとケータイをサポートしている WikiEngine ではないため、長いページの分割機能などはないのがちょっと不安。PageName で生成される URL が長くなった時の振る舞いもちょっと不安。

そこで Google Mobile Proxy (http://www.google.co.jp/gwt/n) 経由で Wiki を使うことにした。 ページを携帯端末向けに変換してくれる proxy で、Basic 認証もできるしフォーム の POST もできる。

Google Mobile Proxy 経由で見たページ内のリンク先も全て自動的に proxy 経由になるので、 PC 向け Web ページの URL を書いておけばそのまま携帯電話で見ることができる。

安全のためか、比較的短い一定時間立つと認証の再確認画面が表示されてしまうが、ユーザ名とパスワードを入力すれば、セッションは継続される。 テキスト編集に時間がかかってしまうと POST する時にひっかかってしまい認証の再入力がちょっと面倒だが、再認証が通れば POST リクエスト自体は有効で書き込みがロストすることはないようだ。

しばらくはこれで読み書きしてみよう。

[ 1月7日全て ]

2008年2月12日 (火)

今日のさえずり - 「エビちゃん」マックカード当たった

2008年02月09日

2008年02月10日

2008年02月11日

  • 12:35 tonotono.net の proxy は DoCoMo/2.0 P900i(c100;TB;W24H11) でアクセスしてくるな。アクセス元は 普通の ISP 接続っぽい。
  • 16:31 今日も地震。L:品川区

2008年02月12日

[ 2月12日全て ]

2009年12月26日 (土)

今日のさえずり: 今晩は細谷精肉店のきりたんぽ鍋セット

image:/nDiki/Flickr/4228896260.jpg

[ 12月26日全て ]

2010年11月12日 (金)

今日のさえずり: 会社の mayor が代わっていてひどくびっくりした

2010年11月12日

  • 09:40 スターバックスの今年のカップオーナメントまだ買ってなかった。まだ売ってるかな。
  • 10:10 オンサイト組の状況が見えないけれど順調なのかな?
  • 12:03 これから東京駅探検に出発。 (@ 株式会社レクサー・リサーチ) http://4sq.com/aMt7Pd
  • 12:06 会社の mayor が代わっていてひどくびっくりした。
  • 12:17 東京駅到着。20分ぐらい滞在可。
  • 12:22 KeiyoStreet 2010年11月下旬オープンということで京葉線ホーム行き通路の店が軒並み閉店中。
  • 12:29 SouthCourt のアンデルセンに2人 x 6テーブルほど。
  • 12:31 SouthCourt 内に小さなテーブルが並んだスペースが少々。
  • 12:34 八重洲中央口に、おむすび処ほんのり屋。10数席。
  • 12:36 4・5番線ホーム間に東京中華食堂。席多いけど混んでて並んでる。
  • 12:40 八重洲北口に焼きたてパン Ferro Vie。14席ぐらい。
  • 12:40 それと大江戸そば。
  • 12:42 それぐらいかな。
  • 12:42 時間です。山手線に乗車。
  • 12:46 戻って参りました。 (@ 秋葉原駅 (Akihabara Sta.) w/ 5 others) http://4sq.com/68fhHr
  • 12:51 おにぎり 336円。
  • 13:50 t/mojolicious/websocket_tls_proxy_lite_app.t .. 6/16 で止まったっきり返ってこない。
  • 14:01 とりあえずこっそり削除した。 RT @Naney: t/mojolicious/websocket_tls_proxy_lite_app.t .. 6/16 で止まったっきり返ってこない。
  • 14:58 perldoc Mojolicious::Lite 一通り読んだ。
  • 19:59 @as_tone 退勤します。
  • 20:10 Xperiaシェルカバー買った。エレコムのやつ。今のが変形してきたので。
  • 20:13 日曜日出社の必要があればメールをもらうということになったけど実は Twitter の方が確実に見る(ただし Twitter が正常な場合に限る)。
  • 20:22 前に立っているサラリーマンが腰ローリングしてて怖い。
  • 20:41 最近隣人と帰宅時間がかぶる。
  • 23:55 zenback 用に nDiki ちょっと調整した。
  • 24:27 ん? 何か勝手に「自宅待機とします」とか言われてる。待機するという話はしてないんだけれど。
[ 11月12日全て ]

2010年12月6日 (月)

今日のさえずり: 間違えて、いる方の Git リポジトリ rm -rf した

2010年12月06日

  • 12:08 おにぎり 348円。 (@ セブン-イレブン 神田佐久間町店) http://4sq.com/cEfW1k
  • 12:33 「ツイ☆クリ!2010〜 Twitter で集めた全国うまいもん大博覧会 〜」って有料イベントなんだ。
  • 16:50 ノートブックのスタック機能がもう Evernote for Windows の方にもきてたか(プレリリース版)。ダウンロードしてインストールまでしかけたけど、そういえばインストール先がパブリック版と違うということに気がついて中断。
  • 17:34 間違えて、いる方の Git リポジトリ rm -rf した。
  • 17:55 ローカルから push して復旧
  • 23:11 P3:PeraPeraPrv が "Can't connect to SOCKS proxy" で最近通信できなくなってなんだろと思ってたら JavaGNOME の設定を見ていた模様。
[ 12月6日全て ]

2013年1月27日 (日)

IRC のキーワード通知を Android 端末に流すのは Tiarra + NMA にした

昨日、Notify My Android (NMA) をプレミアムアカウントにしたので、さっそく IRC の通知設定をしてみた。

IRC proxy の Tiarra を使っているのでチェックしたところ、Auto::Notify というそれっぽいモジュールがあり Prowl に流すことができる模様。これを使うことにした。

module/Auto/Notify.pm の config_prowl() と send_prowl() をそれぞれ同じファイル内で config_nma() と send_nma() としてコピー。 config_nma() はとりあえずあればいいので空のサブルーチンにしておく。send_nma() の方は、APIURL のところを変更するのと、$url->query_form(@data); を削除して、かわりに GET($url->as_string()) を POST($url->as_string(), \@data) にすれば OK。Prowl も NMA も通知 API のパラメータは一緒。

conf の方も Auto::Notify とほぼ同じで OK。

 + Auto::Notify {
   mask: * *!*@*
   regex-keyword: (Naney|反応したいキーワード1|反応したいキーワード2)
   blocks: nma

   nma {
     type:
     format: #(date:%H:%M:%S) <#(raw_channel)> (#(nick.now)) #(text)
     apikey: NMA で発行したキー
     priority: 0
     application: tiarra
     event: IRC
 }

とかこんな感じ。これで IRC でニックネーム呼ばれたりすると Xperia GX がブルブルいってくれる。

メッセージ本文を外に流したくない時には format を適宜調整。

[ 1月27日全て ]

2013年2月10日 (日)

IRC のキーワード通知のための構成 2013年2月版

IRC でニックネームで呼び出されたり緊急系のアナウンスがあった時に気がつけるようにするために組んでいる構成について紹介。

「集中」と「注意を向ける(記事)」のバランスを考えて以下でレベル分けしてる。

  • Level 1. 即応すべきもの。ニックネームコールなど。
  • Level 2. 早めに対応すべきだけど、常に意識を向けるほどではないもの。担当に関連するようなキーワードなど。
  • Level 3. 通常の IRC メッセージ。

構成は以下のような感じ。

  1. 使っている PC が2台あるので、1ユーザとして IRC サーバに接続できるように IRC proxy の Tiarra を使用。
  2. 各 PC での IRC クライアントは LimeChat 2 を使用中。キーワード機能で Level 1, Level 2 についてハイライトするように設定。
  3. Level 1 のキーワードがきたらLimeChat から Growl for Windows へ 流してポップアップ通知するように設定。あと talk については全て Growl で通知するように設定。
  4. Level 1 キーワードが現われたら Tiarra から Notify My Android(NMA) で Android 端末に通知してブルブル言うように。離席時や、席にいるけどアナログ作業をしている時にも気がつける。

iPhone ユーザーなら NMA ではなくて Boxcar / Prowl / Pushover などが使えるのかな。

image:/nDiki/2013/02/10/IRC-notification-2013-02-10-0001.png

あとは ikachan を立ち上げてあって、チームのチャネルではメンバが ITSチケットの情報を流してくれている。他チャネルでは Jenkins 他からの各種情報も流れているので必要に応じて、通知キーワードを設定してく感じ。

[ 2月10日全て ]

2014年4月4日 (金)

今日のさえずり: 新卒アニメ好きが多い

[ 4月4日全て ]

About

Naney Naneymx

Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。

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

Process Time: 0.057443s / load averages: 0.41, 0.29, 0.28