2009年03月16日

FreeBSD の ptrace ではサンドボックスを作れないという話

t/rperl.tを使うと、特定のシステムコールを禁止しつつ任意の perl script を実行できます。
404 Blog Not Found:perl - FreeBSD::i386::Ptrace released!

 自分も今回、弾さんのモジュールを試すまで知らなかったのですが、FreeBSD では ptrace をそのような目的で使うことはできないと思います。というのは、私の理解が正しければ、linux とは異なり、FreeBSD の ptrace でシステムコールの実行を検出し PT_KILL を発行しても、そのプロセスが停止するのはシステムコールの終了直後になるからです。

 具体例を挙げると、たとえば unlink(2) の実行を検出しトレース対象のプロセスを殺そうとしたところで、そのプロセスが停止するのは unlink システムコールの実行後となるため、ファイルの削除を抑制することはできません。

 さらに、vfork(2) は、仕様として、生成された子プロセスが execve(2) を呼び出すか、あるいは終了するまで、システムコールの実行が完了しません (つまりそれまでトレース対象のプロセス (実際はプロセスグループなんじゃないかな) を停止できない)。その結果、ptrace によるシステムコールの監視下にあっても、

vfork();
// 以下は生成された子プロセスでのみ実行される

複数個の任意のシステムコールを含むコード
...

_exit(0);
// 子プロセスの終了直後に親プロセスが PT_KILL される
のような形で、任意のプログラムが実行可能となってしまいます。

 以上は、手元の FreeBSD 6.3R で検証した結果ですが、最新リリースでも当該部分の動作は変わっていないのではないかと思います。

参考: Deny system call using ptrace | KernelTrap, geordi - C++ eval bot

投稿者 kazuho : 2009年03月16日 14:50 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年12月16日

Text::MicroTemplate - テンプレートエンジンのセキュリティと利便性

 先月開催された Shibuya.pm #10 でプレゼンテーションがあった MENTANanoA では、Mojo 由来のテンプレートエンジンを拡張して使用してきたのですが、Perl モジュールとして独立させるべきだよね、ということになり、このたび Text::MicroTemplate として CPAN にアップロードしました。

 そのことを告知するとともに、作業の過程で興味深く感じた、テンプレートエンジンのセキュリティと利便性に関する話題をブログに書いておこうと思います。

テンプレートエンジンのエスケープ機能の歴史

続きを読む "Text::MicroTemplate - テンプレートエンジンのセキュリティと利便性"

投稿者 kazuho : 2008年12月16日 20:59 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年11月27日

開発しているウェブアプリケーションフレームワーク NanoA について話してきました

 本日 (11/27) 開催の Shibuya Perl Mongersテクニカルトーク#10 で、最近作っているウェブアプリケーションフレームワーク NanoA について話しました。スライドを置いておきますので、ぜひご覧ください。

NanoA
View SlideShare presentation or Upload your own. (tags: perl waf)

 あともうひとつ話さないと。

投稿者 kazuho : 2008年11月27日 19:37 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年11月19日

ウェブアプリケーションのインストーラジェネレータ

 CGI や PHP などの小さなウェブアプリケーションを配置(デプロイ)する際、アーカイブをインターネットからダウンロードして、適切な展開ツールで展開したのち、文字コードをあわせてディレクトリ丸ごとアップロード、というのは結構煩雑な手続きです。そこで、tar.gz から自己展開型の CGI を作成するインストーラジェネレータ tgz2cgi.pl を作ってみました。以下のような感じで使います。

% tgz2cgi.pl \
    --title='MyApp インストーラー' \
    --start='インストールを開始します' \
    --end='インストールが終了しました。<a href="setup.cgi">次へ進む</a>' \
    --delete --nph \
    < myapp.tar.gz > nph-myapp-installer.cgi

 このようにしてmyapp.tar.gz を展開するインストーラ nph-myapp-installer.cgi を作成することができます。上の例では、終了時のメッセージに「次へ」ボタンをつけて、展開されたパッケージの setup.cgi へユーザーを誘導しています。他のオプションは、以下のとおり。インストール終了後に自分自身を消去するモードもあります。特定のファイルが既に存在するかチェックして、見つかった場合はインストールを中止する --check-files オプションを使えば、誤って複数回実行してしまうこともありません。

$ ./tgz2cgi.pl --help
Usage: ./tgz2cgi.pl [options] < package.tar.gz > installer.cgi
Options:
  --title=title  title when run as a CGI
  --start=msg    start message
  --end=msg      end message
  --nph          create nph CGI
  --delete       delete installer cgi on success
  --help         show help

 また、生成されるインストーラは、コマンドラインから直接実行することも可能です。この場合は、tar xzvf と同じ動作になります。生成されるインストーラの依存先は、perl (たぶん4以上), uudecode, tar, gzcat という、あまり時代を感じさせない、環境依存の少ない構成にしたつもりです。ぜひ、自己責任でお楽しみください。

15:41追記: uu(en|de)code は最近のディストリビューションでは標準インストールではないようなので、MIME::Base64 に変更しましたorz

投稿者 kazuho : 2008年11月19日 11:05 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年11月04日

ウェブサービスにおけるダメージコントロール (MySQL のスロークエリを自動的に kill する方法)

 適切な設計によって、信頼性の高いソフトウェアやサービスを構築することが重要なのは、言うまでもないことです。一方で、なんらかの原因で問題が発生した際に、障害を局所化し、損害を小さく食い止める「ダメージコントロール」という概念もあります。ウェブサービスの場合も、特に検索や集計といった、計算量がクエリの種類によって大幅に異なるようなケースでは、次善の策として後者の手法が有効に働く場合もあるかと思います。

続きを読む "ウェブサービスにおけるダメージコントロール (MySQL のスロークエリを自動的に kill する方法)"

投稿者 kazuho : 2008年11月04日 21:45 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年10月17日

Filter::SQL でデータベースを叩くワンライナーを簡単に書く方法

 Perl と SQL を使ってワンライナーを書くことが多いのですが、いろいろ面倒なことが多かったので、以前作成したお気に入りのモジュール Filter::SQL を改良してみました。

 DSL (ドメイン固有言語) は、プログラム開発の生産性を向上させる有力な手段です。そして、よく使われる DSL の代表例が正規表現と SQL だと思うのですが、前者に比して後者を嫌いな人が多いようです。なぜだろうと思ってつぶやいたところ、「SQL はリテラルじゃないから!」という答えが tokuhirom さんから返ってきました。そういえば例えば Pro*C のように C で Embedded SQL というのは良く聞く話なのに、Perl では同様の例がないような感じだったので、作ってみました。Perl で埋め込み SQL を実現するソースフィルター Filter::SQL です。

Kazuho@Cybozu Labs: Perl で埋め込み SQL を使って楽をする話

続きを読む "Filter::SQL でデータベースを叩くワンライナーを簡単に書く方法"

投稿者 kazuho : 2008年10月17日 17:06 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年08月04日

実行時間を抑制するモジュール Sub::Throttle を書いた

 Sub::Throttle という、実行時間を指定した割合に抑制するモジュールを作りました。実装としては、関数の実行後に適切な時間の sleep を挿入する形になっているので、下のようにループの実行中に挿む形で使うことになります。

# 使用前
for (...) {
  ...
}

# 使用後 (負荷を 0.1=10% に抑制)
use Sub::Throttle qw/throttle/;

for (...) {
  throttle(
      0.1,
      sub {
          ...
      },
  );
}

 Pathtraq の場合は、Disk I/O を引き起こすようなタスクについて、その負荷を抑えるために使用しています。

投稿者 kazuho : 2008年08月04日 10:22 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年04月17日

Filter::SQL を使って掲示板を書いてみました

必要最小限、見た目無視です。動作確認は Filter::SQL 0.05 で行いました。

続きを読む "Filter::SQL を使って掲示板を書いてみました"

投稿者 kazuho : 2008年04月17日 16:43 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年04月16日

Perl で埋め込み SQL を使って楽をする話

 DSL (ドメイン固有言語) は、プログラム開発の生産性を向上させる有力な手段です。そして、よく使われる DSL の代表例が正規表現と SQL だと思うのですが、前者に比して後者を嫌いな人が多いようです。なぜだろうと思ってつぶやいたところ、「SQL はリテラルじゃないから!」という答えが tokuhirom さんから返ってきました。そういえば例えば Pro*C のように C で Embedded SQL というのは良く聞く話なのに、Perl では同様の例がないような感じだったので、作ってみました。Perl で埋め込み SQL を実現するソースフィルター Filter::SQL です。

 Filter::SQL を使えば、以下のように、SQL と perl が混在するプログラムを簡単に書くことができます。EXEC, SELECT, SELECT ROW, INSERT, UPDATE, DELETE からセミコロンまでの間が SQL 文として解釈されます。

続きを読む "Perl で埋め込み SQL を使って楽をする話"

投稿者 kazuho : 2008年04月16日 10:33 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年04月07日

Q4M Version 0.4 で高速なクローラを書いてみた

 本日、MySQL 5.1 のプラガブルストレージエンジンとして動作するメッセージキューQ4M のバージョン 0.4 をリリースしました。本バージョンでは、条件付購読 (conditional subscription) という、特定の条件を満たす行だけをメッセージキューから読み込む機能に対応したのですが、これを使って、クローラを書いてみました。

ソースコードを表示

 使い方は以下のとおりです。

続きを読む "Q4M Version 0.4 で高速なクローラを書いてみた"

投稿者 kazuho : 2008年04月07日 17:43 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年04月04日

Parallel::Prefork - Perl でマルチプロセスなサーバを書く方法

 Perl でマルチプロセス処理を行う場合は Parallel::ForkManager を使うというのが定番かと思います。しかし、このモジュールはシグナル処理を前提とした作りになっていない注1ため、シグナルを受信するまで動き続けるようなサーバを書きづらい、という問題がありました。

 そこで、Parallel::ForkManager の API は、ほぼそのままに、シグナル処理が可能なプロセス管理モジュールを作ることにしました。それが Parallel::Prefork です。Parallel::Prefork を使うことで、Graceful Shutdown や動的再構成に対応したマルチプロセス型のサーバを簡単に書くことができるようになります。

 たとえば、Apache の prefork MPM のようなサーバは、以下のように書くことができます。

続きを読む "Parallel::Prefork - Perl でマルチプロセスなサーバを書く方法"

投稿者 kazuho : 2008年04月04日 17:31 | コメント (1) | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年03月10日

高速なCometサーバを書いてみた件

 もう昨年の2月になりますが、Comet について調査を行いました。その際の成果をまとめたスライドは既に公開していた (Comet の正しい使い方) のですが、同時に実際に作ってみた実装についても、オープンソース化することとなりました。コードは CodeRepos に置いておきますので、どうぞご覧ください。 (Revision 7754: /lang/perl/fastr)

 使い方は example ディレクトリ以下を見ていただくとして、ベンチマークの結果とチューニング手法について、記録と記憶に残っている範囲からまとめておきたいと思います。

続きを読む "高速なCometサーバを書いてみた件"

投稿者 kazuho : 2008年03月10日 15:08 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年11月07日

メッセージキュー事始め in Perl - コマンドラインクライアントを作ってみた

 メッセージキューの勉強をかねて STOMP のコマンドラインクライアントを書いてみました。STOMP だから ActiveMQ とも通信可能だろうし、動作確認やテスト用のスタブ作成などに使えるはず。ソースはこちら: stompy

1. メッセージキューを起動 (POE::Component::MessageQueue を使用)

% /usr/bin/mq.pl --data-dir /tmp/mq

2. キューに書き込み

% echo 'hello 1' | ./stompy --destination=/queue/test
% echo 'hello 2' | ./stompy --destination=/queue/test
% echo 'hello 3' | ./stompy --destination=/queue/test

3. キューから読み込み

% ./stompy --subscribe=/queue/test
hello 1
hello 2
hello 3
^C
% 

続きを読む "メッセージキュー事始め in Perl - コマンドラインクライアントを作ってみた"

投稿者 kazuho : 2007年11月07日 16:16 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年10月04日

DBIx::Printf と LIKE 式

Kazuho Oku / DBIx-Printf-0.05 - search.cpan.org
(svn リポジトリ)

 本社の山本さんに「DBIx::Printf では LIKE 式の扱いも考えるべき」と言われたので、こんな感じで対応してみました。

続きを読む "DBIx::Printf と LIKE 式"

投稿者 kazuho : 2007年10月04日 14:16 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年10月02日

Perl で並列処理 (using マルチプロセス)

 Shibuya.pm で牧さんが Gungho の話をされたそうで、スライドを拝見しました。Pathtraq への言及もあってうれしい。

 で、スライドを読んでいて、HTTP アクセスと HTML 解析/保存処理を分離すべき、となっている点が気になりました。実は Pathtraq (のうち奥が書いている部分) では、Gungho と HTML の解析/保存処理を分離することはしていません。そのかわり、複数のワーカープロセスを駆動することで、スループットを確保しています。分離モデルとマルチプロセスモデル、どちらの手法を採るべきかは、解析/保存処理の重さやエラー処理の設計方針にもよると思うのですが、少なくとも1台のサーバで処理できる間はマルチプロセスモデルで問題ないのではないかと漠然と考えています。。別に分離したからといって悪いことはないのですが、マルチプロセスモデルには、OS側で自動的に処理能力の配分が行われるので、面倒な非同期処理を書いたり、細かな負荷配分の調整を行わなくても良い、というメリットがあります。

続きを読む "Perl で並列処理 (using マルチプロセス)"

投稿者 kazuho : 2007年10月02日 19:28 | トラックバック (1) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月28日

DBI::Printf - A Yet Another Prepared Statement

 Java や C++ のような関数のオーバーロードができる言語では、プリペアードステートメントのプレースホルダが型をもつ必要はありません。しかし、Perl のように数値型と文字列型の区別がない言語で最善を期そうとすると、変数をバインドするタイミングで型を意識してコードを書かなければならず面倒です。 (参考: MySQL の高速化プチBK)

 だったら、printf のように、プリペアードステートメントのプレースホルダで型を指定できればいいのに、と、もともとは Twitter でつぶやいたネタなのですが、SQLステートメントをキーとしてキャッシュにデータを保存したいといった事情もあって、実際に作ってしまいました。

Kazuho Oku / DBIx-Printf - search.cpan.org
DBI-Printf-0.01.tar.gz

続きを読む "DBI::Printf - A Yet Another Prepared Statement"

投稿者 kazuho : 2007年09月28日 10:10 | コメント (2) | トラックバック (2) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月27日

ウェブサービスのためのMutex - KeyedMutex

 昨日、以下のように書いたのですが、両者のうち2番目のアプローチを実現する Perl モジュール KeyedMutex を作成しました。

 サーバにおける Thundering Herd 問題は良く知られていると思いますが、類似の現象はキャッシュシステムでも発生することがあります。
(中略)
 対策としては、以下の2種類の手段があります。
  • バックエンドへの同一リクエストを束ねるような仕組みを実装する
  • エクスパイヤ以前の残存時間が一定以下となった段階で、キャッシュエントリのアップデートを開始する
 これらの手法には、それぞれメリットとデメリットがあり、アプリケーションによって最適な方法は異なります。
Kazuho@Cybozu Labs: キャッシュシステムの Thundering Herd 問題

 KeyedMutex は、クライアントが指定した鍵毎に排他処理を行うサーバ・クライアント型のシステムです。キャッシュへのデータ保存と連動させることで、データベースへの余分な問い合わせを抑制し、動作効率を高めることができます。以下のような感じで使用します。

続きを読む "ウェブサービスのためのMutex - KeyedMutex"

投稿者 kazuho : 2007年09月27日 15:46 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月20日

MySQL の高速化プチBK

 鴨志田さんに教えていただいたのですが、MySQL のクエリは数値をクォートしない方が高速になるらしいです。たとえば以下の例では、160万件の整数から4の倍数を数えていますが、数値をクォートしないほうが約50%も高速になっています。

続きを読む "MySQL の高速化プチBK"

投稿者 kazuho : 2007年09月20日 12:06 | コメント (1) | トラックバック (2) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月18日

Swifty 0.03 を公開しました

 共有メモリによる高速なキャッシュ実装である、Swifty 0.03 を公開しました。今回のバージョンは、バグ修正も含んでいますが、64-bit のアトミックアクセスを利用して n-way set associative 化したのが、技術的におもしろい点かなと思います。

 Perl からの利用という意味ではメモリ確保がボトルネックになっているので、これ以上高速化するメリットはないでしょう。今後は Pathtraq に組み込んで、実際どうなるか見てみたいと考えています。

投稿者 kazuho : 2007年09月18日 15:55 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月12日

swifty-0.02 と Perl バインディング

 自作しているキャッシュシステム Swifty のバージョン 0.02 と Perl バインディングをリリースしました。ベンチマーク等はそちらをご覧いただくとして、こちらでは今後の課題を書きたいと思います。

  • ダイレクトマップ方式をセットアソシアティブに変更する (さぼっています)
  • エクスパイア時に複数のプロセスが更新作業を開始しないよう、事前更新機能と排他ロックを実装する

そんなところでしょうか。パージングが LRU ではなくランダムなのは、リードが lock-free なので修正は難しいかな、と思っています。まとまりがないエントリで恐縮ですが、リリースの告知をかねてということでご容赦いただければ。

投稿者 kazuho : 2007年09月12日 16:43 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月10日

Perl から MySQL に非同期アクセスする方法

mod_perl のプロセス内でやるのに POE でイベントループ回せ、ということ? もうちょいkwsk! > b:id:kazuhooku
naoyaグループ - naoyaの日記 - 非同期SQLサーバ

 エントリ全体の趣旨はさておき、ソケット通信を非同期化するためにまた別のソケット通信を行うという使用例に違和感を覚えたのですが、回避策としてブクマコメントで提示した POE::Component::EasyDBI も内部で fork (&プロセス間通信) してるんですね。変なコメントしてごめんなさい忘れてください。って、それだけではなんなので...

 ここから本題。

 私はそういうケースに遭遇したことはないのですが、大規模なサービスでは、複数の SQL クエリを同時実行したり、あるいは、時間がかかるクエリを実行中に他の処理を行ったりしたくなる、ということがあるかもしれません。ですが、DBI にはクエリを非同期実行するための仕組みがないようです。というわけで、Net::MySQL で非同期クエリを可能にするパッチを書いてみました。

続きを読む "Perl から MySQL に非同期アクセスする方法"

投稿者 kazuho : 2007年09月10日 10:54 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年07月18日

Perl の正規表現が破壊的でイヤだなと思った件

 いちいち変数定義して、

my $s = "Hello, World\n";
$s =~ s/Hello/Goodbye/;
print $s;

とか書くのにあきてきたので、

sub ndes (&@) {
    my $code = shift;
    my @a = map {
        local $_ = $_;
        $code->();
        $_;
    } @_;
    wantarray ? @a : $a[0];
}

と、まとめてみました。これで、

print ndes { s/Hello/Goodbye/ } "Hello, World\n"

とするだけで「Goodbye, World」が表示されるように。でもとっても再発明 (あるいは遠回り) のにおいがします。どうすれば、より better なんでしょうか。

投稿者 kazuho : 2007年07月18日 17:30 | コメント (2) | トラックバック (1) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年05月21日

Cache::Adaptive を簡単に使う方法

 同僚の ZIGOROu こと山口さんが、「まだ CGI::Application 使ってるの〜?」とか言いながら、CGI::Application::Plugin::Cache::Adaptive を作ってくれました。このモジュールを使えば、ハンドラに属性を追加するだけでキャッシュを有効にできます。これは便利! ついでに私も、自分が使う(であろう)フィードバック関数をパッケージ化したモジュール Cache::Adaptive::ByLoad を作りました。

 これらを使うことで、従来のコードはそのまま、ちょっとコードを追加するだけで、簡単に負荷調節機能付きウェブアプリケーションを開発することができます。

use Cache::Adaptive::ByLoad;
use Cache::FileCache;
use CGI::Application::Plugin::Cache::Adaptive;

sub setup {
    ...
    $self->cache_adaptive(
        Cache::Adaptive::ByLoad->new({
            backend => Cache::FileCache->new({
                namespace => q(html_cache),
            }),
        }));
}

sub start : Cacheable(qw/path path_info query/) {
    ...

投稿者 kazuho : 2007年05月21日 11:36 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年05月10日

Cache::Adaptive の使い方

 昨日のエントリが好評のようだったので、いろいろ問題を修正したバージョンを CPAN にアップロードしました (Cache-Adaptive-0.02 - search.cpan.org) 。ついでに、開発中のウェブサービスに仕込んで、トップページでベンチマークを取ってみました。こんな感じです。

cache-adaptive.gif

続きを読む "Cache::Adaptive の使い方"

投稿者 kazuho : 2007年05月10日 17:26 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年05月09日

負荷に応じてキャッシュを自動調節する Perl モジュール

Cache::Adaptive の使い方に続く

 最近かりかりとサーバサイドの実装をしています。修行の成果、だいぶ複雑な SQL も書けるようになってきました。DBMS の気持ちを考えながら SQL 最適化するのは楽しいですね。しかし、いくら SQL を工夫したところでパフォーマンスの限界はあるわけです。

 となると、採りうる選択肢はスケールアウト・スケールアップ・キャッシングの3つになります (もちろん組み合わせも可)。ただ、需要予測の最大値に基づいて機材を確保するのもあまり効率的とは言えませんし、リリース直後に徹夜でパフォーマンスのチューニングをするのもイヤです。というわけで、負荷に応じてキャッシュを自動調節するような仕組みがないのかなぁと思っていたのですが、見つからなかったので書いてみました。

ダウンロード: Cache-Adaptive.pm

 詳細は POD を書いて疲れたのでそちらを読んでください。以下は使い方の例。こんなことができます。

続きを読む "負荷に応じてキャッシュを自動調節する Perl モジュール"

投稿者 kazuho : 2007年05月09日 17:07 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年04月23日

Re: PoCo::Client::HTTP が勝手に文字コードを変えてしまう件

 PoCo::Client::HTTPでGETしまくってたら、一部のサーバーのどの日本語ページも$res->content_typeの文字コードと実際の文字コードが合わなくておかしいと思ってたんだけど、こういうことだな?多分0.80以降のXangoベースのアプリも壊れる予感。

 うぅ、こいつは小さな親切、大きなお世話の類いだな・・・GunghoではしょうがないのでPOEエンジン内で、またエンコードしなおすという荒技を使う事にしてみる。

PoCo::Client::HTTP decodes content (w/o Permission) - D-5 出張版

 この件ですが、charset が宣言されていない場合にも ISO-8859-1 として decode してくれてしまうようです。その場合もエンコードしなおすとして、任意のバイト列について $bytes eq encode('iso-8859-1', decode('iso-8859-1', $bytes)) が成立するか自信がなかったので、逆変換ではなく変換自体を抑止するようなパッチを書いてみました

package HTTP::Response;

sub decoded_content {
    my ($self, %opt) = @_;
    my $caller = Devel::StackTrace->new()->frame(2)->subroutine;
    if ($caller eq 'POE::Component::Client::HTTP::Request::return_response') {
        $opt{charset} = 'none';
    }
    $self->SUPER::decoded_content(%opt);
}

 これで OK のはず。lestrrat さんのやりかたとどっちがいいのかは全然知りません (^^;

 ちょっとずれた感想ですが、スーパークラスのメソッドかどうか、あるいは AUTOLOAD かどうか、によってラッパーの書き方が変わるのが面倒だなと思いました。

投稿者 kazuho : 2007年04月23日 14:01 | コメント (2) | トラックバック (1) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年04月16日

Gungho をインライン化してみた

 ちょっとクローラーが必要になったのですが、POE の勉強は面倒なので Gungho を使って作ることにしました。開発が始まったばかりっぽいけど、使いやすそうだし期待大ということで。で、コードを読んでいて思ったのは、provider (URL をフィードするモジュール) と handler (ダウンロードしたコンテンツを処理するモジュール) は再利用されない (=各アプリケーション専用の処理になる) 場合も多いんじゃないかということ。だったらいちいちパッケージ定義して設定値渡しとか面倒だよねというか、ぶっちゃけ自分がクロージャで書きたいと思ったので、ラッパーを書いてみました。こんな感じで使えます。

続きを読む "Gungho をインライン化してみた"

投稿者 kazuho : 2007年04月16日 10:35 | コメント (2) | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年04月05日

Mylingual Slides @ YAPC::Asia 2007

 YAPC::Asia 2007 TokyoJapanizeMylingual の考え方と現在の状況、および将来について発表をしてきました。途中でパソコンが2回もハングして、スライドをすべてお見せすることができませんでした。申し訳ありません orz こちらにおいておきますので、ごらんいただければ幸いです。


[最初から] [戻る] [次へ] [PowerPoint をダウンロード]

投稿者 kazuho : 2007年04月05日 13:41 | トラックバック (1) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年03月19日

キーワード抽出のススメ (Lingua::JA::Summarize がアップデート)

 一年近く放置プレイしていたキーワード抽出モジュール Lingua::JA::Summarize をバージョンアップしました。(Lingua::JA::Summarize-0.07)

 といっても、私がやる気を出したわけではなく、ほとんどの作業は同僚の中谷さんによるものです。機能の修正のみならず、丁寧なチュートリアル「キーワード抽出モジュール Lingua::JA::Summarize を使うコツ」 も書いてくださっています。キーワード抽出に興味がある方は、ぜひご覧ください。

投稿者 kazuho : 2007年03月19日 16:55 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2006年07月11日

Movable Type をコマンドラインから操作する (トラックバックスパム一括削除)

 数万件のトラックバックスパムが蓄積された結果、サイボウズ・ラボの Movable Type (3.2-ja-2) が機能不全を起こしていました。管理画面から削除しようにも Internal Server Error が発生したりして、遅々として進みません。

 そこで、コマンドラインからトラックバックスパムを一括削除するようなコードを書いて実行しました。
 
 せっかく作ったということで、備忘録をかねてコードを公開したいと思います。コマンドラインから Movable Type を制御したいような場合の参考になるかもしれません (って、汎用的なコードになっているかは、かなり不安ですが...)。

続きを読む "Movable Type をコマンドラインから操作する (トラックバックスパム一括削除)"

投稿者 kazuho : 2006年07月11日 12:11 | コメント (3) | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2006年06月20日

PERL5WEBDB で Movable Type デバッグ

 PERL5WEBDB のバージョン 0.02 をリリースしました。BEGIN ブロック内のコード表示をサポートしたので、MovableType のデバッグも可能になりました。

MovableType をデバッグ中の画面

 MovableType をデバッグする際の具体的な手順は以下のとおりです。

続きを読む "PERL5WEBDB で Movable Type デバッグ"

投稿者 kazuho : 2006年06月20日 15:33 | トラックバック (1) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2006年05月02日

Lingua::JA::Summarize 0.03, 0.04

 Lingua::JA::Summarize の 0.03 と 0.04 をリリースしました。CPAN のミラーにはまだ届いていないと思いますので、http://search.cpan.org/~kazuho/ からダウンロード願います。

続きを読む "Lingua::JA::Summarize 0.03, 0.04"

投稿者 kazuho : 2006年05月02日 11:51 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

Perl Monger への道は遠い

 Lingua::JA::Summarize のリリースで、弾さんCharsbar さんをはじめ、いろいろな方からアドバイスをいただきました。ありがとうございます。そのうち、 Perl の書法について学んだことを、忘れないうちにまとめておこうと思います。

続きを読む "Perl Monger への道は遠い"

投稿者 kazuho : 2006年05月02日 11:38 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2006年04月27日

Lingua::JA::Summarize 0.02

 昨日公開した Lingua::JA::Summarize の 0.02 をリリースします。

Lingua-JA-Summarize-0.02.tar.gz
(5/2 追記: 0.04 をリリースしました)

 主な変更点は以下のとおりです。

続きを読む "Lingua::JA::Summarize 0.02"

投稿者 kazuho : 2006年04月27日 14:59 | トラックバック (3) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2006年04月26日

キーワード抽出モジュールを作ってみた

 一昨日、同僚の竹迫さんに、文書内からのキーワード抽出技術について教えてもらっていた時、わざわざ TF-IDF注1 用に別のコーパスを用意しなくても、MeCab だったら生起コストを辞書内に持っているんだから、それを使えばいいのではないか、という話になりました。

続きを読む "キーワード抽出モジュールを作ってみた"

投稿者 kazuho : 2006年04月26日 15:19 | コメント (7) | トラックバック (4) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2006年04月20日

IIS のログを tail -f

 IIS のログを tail -f したかったので、作ってみました → iistailf

続きを読む "IIS のログを tail -f"

投稿者 kazuho : 2006年04月20日 05:53 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2006年03月30日

PERL5WEBDB

 YAPC::Asia 2006 Tokyo での Lightning Talk にあわせて、 PERL5WEBDB を公開します。

画面イメージ

続きを読む " PERL5WEBDB"

投稿者 kazuho : 2006年03月30日 10:48 | トラックバック (1) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク