nDiki : 正規表現
Related term
2005年10月1日 (土)
■ mixipress でコミュニティ掲示板もチェック

この週末 mixi で遊びのついでに mixipress も試してみることにした。
mixipress はPerlで書かれたCGI プログラムで、アクセスするとmixi にログインして「最新のマイミクシィの日記・参加しているコミュニティのBBSへの投稿・以前コメントした日記・日記へのコメント・メッセージ・足あとのダイジェスト」を含むRSSを返してくれる。
ローカルの Apache に mixipress 0.31 をインストール。 0.31 が出た後、 mixi 側で URL の変更があったのでそれに対応するように一部正規表現を修正。
で Sage でアクセス。 ふむふむ、これだと面倒で見ていなかった掲示板のチェックも楽だ。
- Debian に RSS リーダ「フレッシュリーダー」をインストール (2006-03-06)
- m4s tkh再会新年会 (2005-01-06)
- [ 日記 ] SpeedyCGI による、同時処理数制御 (2004-01-20)
- mixi のプロフィールをランダム更新 (2005-09-30)
- 今日のさえずり - 「はてなMobileGateway」かましてから、OK... (2008-01-03)
2005年12月2日 (金)
■ ほぼ Perl 手帳

ほぼ日手帳のカバー・オン・カバーにProgramming Perlのカバーをはさんでみた。
縦 16.5cm に調整してプリントアウトしたもの。解像度はあまり高くないのだが、ぱっと見はいい感じ。
@ この手帳についていないもの:
東京地下鉄路線図、世界通貨一覧表、時刻表、東北新幹線時刻表、世界地図、演算子優先順位表、正規表現の書き方、標準 Perl ライブラリ一覧、おしゃれ小鉢、などなど、
- 結局自分も MOLESKINE に行き着くのか (2005-12-15)
- 2008年夏の GTD 運用ツール (2008-07-23)
- 方眼手帳と方眼ミーティングメモ (2005-11-27)
- ポケットぽっこりだけれど、色に魅かれてマンダリンオレンジほぼ日手帳2007 (2006-09-15)
- 社内 Perl 勉強会 最終回 (第16回) (2006-09-11)
2006年2月21日 (火)
■ [ WiKicker ] コメントをパターンでチェック

WiKicker では書き込み禁止パターン指定機能をつけてあって、特定の文字列または正規表現にマッチしたページデータを保存しても無視されるようになっている。
spam 対策の機能なのだが、実装してからも spam は止まない。 ブラックリスト方式はまあいたちごっこではあるが、それにしても正規表現にマッチしているはずのものまで書き込まれている。あれ?
まてよ、たしかコメントフォームからの追記はそういえばチェックしていなかったような(いや実はかなり前から薄々気がついていたのだが、ついついその場は手作業で SPAM を削除して済ましてしまっていたのだ)。
しかしやっぱり面倒だし、コメント書き込みもチェックしないと片手落ちだなと思い実装。 といってもまあ変更してみると、10数行程度だったりするのだが。
むしろ、テストコードの追加の方がよっぽど多かったり。
- [ WiKicker ] spam と検索エンジン対応に noindex、... (2007-01-13)
- はてなダイアリーキーワード自動リンクAPI (2004-02-05)
- [ WiKicker ] 自動InterWiki (2004-02-09)
- [ WiKicker ] 書き込みをパターンでチェック (2004-12-13)
- [ WiKicker ] URI抽出正規表現修正 (2004-07-24)
2006年6月5日 (月)
■ 第6回 社内 Perl 勉強会

リャマ本を使用した社内 Perl 勉強会の6回目を開催。 今日は7人。
今日は「初めてのPerl 第3版」第7章「正規表現の基本」が範囲。
今回は5問のうち最初の3問は正規表現によるパターンを考える形式。
@ 今回の反省点
正規表現というと、Perl 初心者がひっかかる一つの鬼門である(少なくとも私のまわりでは正規表現でビビる人が多かった)。 それを承知の上かリャマ本では章を分けて簡単なところから少しづつ取り組むようになっていて、アレルギー反応がおこりにくいようになっている感じだ。
実際、今回の勉強会でも特につまづいている人はいなかったようだ。
今回は追加ネタとして、正規表現と正則言語と有限オートマトンの話をちょっとだけしたのだけれど、反応はあまり良くなかった。
本当はこういう基礎的な部分に興味を持ってもらうと、深みのある(?)プログラムが書けるのだけれどなかなかそこまではいかないかな。
社内勉強会としては、追加ネタは実用的な方が良いのかもしれない。
今回は1時間5分。
- 社内 Perl 勉強会 最終回 (第16回) (2006-09-11)
- 第2回 社内 Perl 勉強会 (2006-04-28)
- 第1回 社内 Perl 勉強会 (2006-04-21)
- 第8回 社内 Perl 勉強会 (2006-06-30)
- 第4回 社内 Perl 勉強会 (2006-05-22)
2006年6月12日 (月)
■ 第7回 社内 Perl 勉強会

リャマ本を使用した社内 Perl 勉強会の7回目を開催。今日は6人。
今日は「初めてのPerl 第3版」第8章「正規表現の詳細」が範囲。
今回はプログラムを書く問題は無くて、パターンを考えたり逆に与えられたたパターンが何にマッチするのかを考える問題。 「本書の中で最も難易度が高くなっています」と書かれている。
@ 今回の反省点
さすがに今回は正答率が低かった。 問題の意図が読み取りにくいというのもあって、迷う問題も多かったようだ。 プログラミング言語のトークン関連のネタなどはプログラミング経験がある程度ないとぱっとわからないかもしれない。
時間の関係で自分もあまり準備ができなくて、不完全な解答だったのが悔まれる。
今日は追加ネタなしで、トータル50分。
- 社内 Perl 勉強会 最終回 (第16回) (2006-09-11)
- 第8回 社内 Perl 勉強会 (2006-06-30)
- 第6回 社内 Perl 勉強会 (2006-06-05)
- 第4回 社内 Perl 勉強会 (2006-05-22)
- 第5回 社内 Perl 勉強会 (2006-05-29)
2006年6月30日 (金)
■ 第8回 社内 Perl 勉強会

リャマ本を使用した社内 Perl 勉強会の8回目を開催。今日は5人。
今日は「初めてのPerl 第3版」第9章「正規表現の利用方法」が範囲。
展示会などがあった関係で、6月19日以来しばらく間が空いての開催。
@ 今回の反省点
ぱっと見、面白そうな練習問題に見えたがやってみると意外とあっさり風味であった。
最後の問題は、文字列の出現回数を数えるという Perl ではイディオム的なコードを欠く問題。
ハッシュを使うのが定番だが、配列に入れてソートし前から反復する(sort | uniq -c 的な)コードを書いている人が2人いて興味深かった。 たしかに C などだったらそういうコードを書いてたかもしれないな。
今回で8回目を終了。
練習問題にもう少しチャレンジャブルな問題があった方がいいなと思う今日この頃。
- 社内 Perl 勉強会 最終回 (第16回) (2006-09-11)
- 第6回 社内 Perl 勉強会 (2006-06-05)
- 第1回 社内 Perl 勉強会 (2006-04-21)
- 第4回 社内 Perl 勉強会 (2006-05-22)
- 第13回 社内 Perl 勉強会 (2006-08-07)
2006年7月8日 (土)
■ Perl v5.8.8 の CGI.pm の PATH_INFO 処理の問題にぶつかる

手元の WiKicker (や DiKicker) で、「C++」という文字列を含む URI にアクセスしたらエラー。
Nested quantifiers in regex; marked by <-- HERE in m//C++ <-- HERE .html$/ at (eval 27) line 7.
正規表現の一部として使う時には \Q...\E していたと思ったが抜けがあったか。 とコードをチェックしてみたが、それっぽいところなし。 そもそも、Perl 5.005_03 だと問題おきていないし。
確認したら CGI.pm の url() の中でのエラーだった。 quotemeta されていない。
Perl v5.8.8 に含まれている CGI.pm 3.15 で問題を確認。3.17 までは駄目で、3.19 以降だと \Q...\E するように修正されている (3.18 は CPAN にないので不明)。
標準 Perl ライブラリのバグを踏んだか……。 標準 Perl ライブラリのアップグレードはなにかと面倒なので、システム要件にはしたくはないんだよねぇ。
- Time::Local::gmtime の範囲チェック (2003-12-23)
- 最新の Module::Install は Perl 5.005_03 ステ? (2006-04-29)
- WiKicker に JSON でのページ出力機能を追加 (2007-04-03)
- Windows 上での Apache 2.0.53 では PATH_INF... (2005-04-10)
- [ WiKicker ] URI抽出正規表現修正 (2004-07-24)
2006年7月28日 (金)
■ Perl で CR/LF/CRLF 全対応の1行毎読み込み処理

Perl プログラムでテキストファイル処理を 改行コード CR/LF/CRLF 全対応にしようと思ったが、書こうとするとこれが結構面倒臭いことに気がつく。
$/ に正規表現が設定できないため、<FILEHANDLE> で単純に3パターン対応ができない (LF と CRLF に対応とかならすぐできる)。
小さいファイルと仮定して良いなら全部読み込んで自前で行分割、大きいファイルならまじめにバッファリングして改行コードをスキャンして行処理するのが正攻法かな。 多少効率悪くなりそうだけれど。
@ Pod::Html (1.0504) の場合
Perl 5.8.8 の Pod::Html (1.0504) だと pod2html の中で $/ = "" と設定して、パラグラフ単位で読み込んでそのあと処理している。
@ PerlIO レイヤー
最近の Perl であれば PerlIO::crlf、 PerlIO::eol あたりが使えそうである。
もちろん Perl 5.005_03 だと NG。
- [ WiKicker ] 通知メールの Subject: フィールドのエン... (2004-01-25)
- 第8回 社内 Perl 勉強会 (2006-06-30)
- [ WiKicker ] 「最近のアクセスログ」処理思案 (2004-01-17)
- Cache::Memcached 1.13 の Perl 5.005_03 対応 (2004-06-05)
- [WiKicker] WiKicker の文字化け対応 (2004-02-03)
2006年9月11日 (月)
■ 社内 Perl 勉強会 最終回 (第16回)

リャマ本を使用した社内 Perl 勉強会の16回目を開催。 今日は8人全員。
今日は「初めてのPerl 第3版」第17章「上級テクニック」が範囲。 17章では、「Perl らしい」機能 (Perl 流 eval、grep、 map、スライス)が盛沢山。
@ 今回の反省点
robust なプログラムを書くには Perl では eval 必須の機能なので押さえておきたいところ。 grep、map は何だかんだいって自分が練習問題の解答で使ってしまっているので、他の人もある程度見なれているはず。
練習問題の解答としてはスライスは今回は使用せず。
逆にスカラーコンテキストとリストコンテキストについては、まだ理解が不完全な部分があるようなので解説をしておいた。
@ 最終回を終えて
Perl については
という一方
Perl の気持ち悪さが理解できた。
という意見があった。
他の人の書き方を見ることが参考になった。実際に書くことで覚えた。
等、定期的に練習問題をやってくるというスタイルに対する評価が得られた。
4月21日から始めて5カ月弱。勉強会でスキルアップをはかっていこうという雰囲気ができてきているのはいい傾向だと思う。
今後もテーマを選んで継続していきたい。
次のテーマをより実用重視のものにするか、基礎固めのものにするのかは悩みどころである。
- 第6回 社内 Perl 勉強会 (2006-06-05)
- 第7回 社内 Perl 勉強会 (2006-06-12)
- 第2回 社内 Perl 勉強会 (2006-04-28)
- 第8回 社内 Perl 勉強会 (2006-06-30)
- 第1回 社内 Perl 勉強会 (2006-04-21)
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 の作成
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 ワード指定すれば、表示されないようにすることができる。
@ 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 で書かれているので、プラグインを書いて拡張できるよう将来になると面白いなと思ってみたり。
- 定型書式で内容を記述していくのに便利な形式は? (2005-11-21)
- POE で HTTP プロキシサーバ (2005-10-15)
- メールボックスを Gmail に集約 (2007-08-08)
- 今日のさえずり - 鳩三郎が会社にきた (2008-09-25)
- Twitter への書き込みを自動的に Skype ムードメッセージに設定する (2008-02-25)
Related web page
5.005_03 対応で正規表現版もいまだに使っているhttp://blog.livedoor.jp/dankogai/archives/50958132.html
The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5. PCRE has its own native API, as well as a set of wrapper functions that correspond to the POSIX regular expression API. The PCRE library is free, even for building commercial software.http://www.pcre.org/
open(PERL, '< perl.htm') or die "perl.htm: $!\n"; { local $/ = undef; $html = <PERL>; } close(PERL); while ($html =~ /(<(NOBR|CODE|B|PRE|FONT)\b # ある開始タグから (?:(?!<\/\2>).)* # そのタグが閉じられる前に (?:<\2>|$))/sigx) { # また開始タグor終わり print $1, "\n"; } トップへ XMLタグを加工する <?xml version="1.0"?> <div class="memo"> <div class="author"> <div class="name">okabe&lhttp://www.din.or.jp/~ohzaki/regex.htm
http://phpspot.net/php/
■よく検索されるキーワード
torrent(173) expressions(80) 竹内まりや(58) x31(25) ドラマ(23) linux(23) 手帳(21) 壁紙(21) perl(21) windows(20) 動画(19) wiki(17) porter(17) debian(16) 使い方(16) 画像(15) thinkpad(15) 作り方(15) gmail(14) usb(14) 秋葉原(13) ヨドバシ(13) ほぼ日手帳(13) 提案書(12) 活用(12) 竹内(12) 古川小百合(12) 修理(12) ノート(11) 無印(11) ヨドバシカメラ(11) nikon(11) 書き方(10) ダイソー(10) 万年筆(10) 生年月日(10) 大井町(10) ミニ6穴(9) ほぼ日(9) tc-1(9) 冷蔵庫(9) 設定(9) ニコン(9) java(9) mp3(8) 故障(8) 方眼(8) xp(8) 日誌(8) 感想(8) カメラ(8) allinanchor:*.torrent(8) バッグ(8) firefox(7) インストール(7) キーボード(7) mixi(7) 無料(7) リフィル(7) 小林麻耶(7) nikkor(7) ジョイントラック(7) madwifi(7) 原田夏希(7) skype(6) 変更(6) 三条まゆみ(6) ペンケース(6) web(6) emacs(6) home(6) ポーター(6) 2009(6) itunes(6) a6(6) 無印良品(6) デジカメ(6) finepix(6) 無線lan(6) 評判(6)■注目キーワード
購入 買った 発売日 フリー 無料 価格 値段 作り方 選び方 方法 設定 サンプル ダウンロード セール 限定 在庫 予約 穴場 比較 検証 レビュー 感想 評価 評判 使用感 使ってみた 口コミ 最新 MP3 動画 Torrent 解説 意味 用語集 参考文献 お薦め お勧め おすすめ 便利 Blog ブログ mixi 待受画面 修理Process Time: 5.391456s / load averages: 0.39, 0.85, 1.09
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)




スポンサード リンク