TOP > プログラマ2.0日報 > 2008年11月05日

あすなろBlogger

このエントリーを含むはてなブックマーク このエントリーをはてなブックマークに追加 この記事をクリップ! livedoorclip ユーザー数 BuzzurlにブックマークBuzzurlにブックマーク この記事をtweetする

モデルとしてのフィルター

2008.11.05

今している仕事で、筆者の担当するWebアプリに対して、httpClient でリクエストを発行し...という手順でアクセスすることになっているのですが、httpClient で作られるクライアントが、

その前段階で、UNIX フィルターでリクエスト内容を加工して...

という振り合いで全体の設計がなされているのが特徴です。まあ、この仕事

どうも要件がハッキリしない...

というあまりウレシクない条件での仕事だったりしますから、こういう

シェル上のフィルター・コマンドで、やり方の詳細が変わったとしても、その変化をうまく吸収(したい)

という狙いでの全体のフローですね。

というわけで、フィルターモデルって結構使えるよね、という話です。私は結構骨の髄からの UNIXist ですから、シェルのパイプラインをごちゃごちゃ組み合わせて仕事するのが大好きだったりします。だって柔軟ですからねぇ....一度憶えたら手放せませんよ。

フィルター・モデル、というと、UNIX man のベースである、nroff が強烈にフィルターモデルでした。まあ、今時 nroff を使う..なんてのは時代遅れもいいとこですが、要するに TeX(というか、PODというか...)に似た構造化テキストを清書して表示するのが nroff の仕事なのですが、たとえば....

  • 数式をフォーマットしたければ、前処理で eql を、
  • テーブルをフォーマットしたければ、前処理で tbl を、
  • 図を埋め込みたければ pic を、
  • 参考文献の参照を埋め込みたければ refer を....

という風に、実際のプロセッサである nroff に渡す前に、特別な処理を nroff が理解できるプリミティブに変換するいろいろなプリプロセッサを通して変換し、その結果を nroff でフォーマットする、という手順を踏んでいたりしました。

一応 nroff は、今でもUN*Xコアパッケージには必ずあるし、man のバックで動いてます....けど、今時 man を書いたりすることもないしね。レトロ技術もいいとこです。けど nroff は若くして亡くなったオザンナと例のカーニハンが関わった、「最初のUNIXツール」ですよ...「UNIXプログラミング環境」がここらへん詳しいです。

まあ、nroff のフィルター設計は過激ですが、

何かをさせるときに、一つ一つの守備範囲が「狭く限定された」フィルターをたくさん作って、それらを利用局面で適切なものを組み合わせて使う

というのは、非常に柔軟なシステム設計の技法です。たとえば、

CMSで投稿されたコメントが、スパムかどうか判定するのに、いろいろな側面からチェックする

のにこういうフィルターベースでのやり方も有効ですしね。で、このフィルターの最大のメリットって、

仕事が限定されており、一つ一つの条件と作用が明快なので、実装もわかりやすければ、検証も楽チン

というあたりですね、これバカにできませんよ。まあ、ここらへんを期待してかJava では java.io パッケージが、

フィルターをデザパタで捉えなおすと、Decorator になるので、Decorator ベースの設計で....

作られているわけです。(がちょいと初心者が Java でツマづく関門になってる雰囲気も...) java.io パッケージの中に、実は、FilterIn(Out)putStream/FilterReader(Writer) というクラスがありましてね、特に FilterInputStream なんぞはいつもよく使ういろいろなクラスの基底クラスだったりするわけです。そういう面でお世話になっているのですが、

自前でこの FilterInputStream を上書きして、何かさせる

というのに出くわして、アレ珍しい...という印象を持ったわけです。その利用例は、この間紹介した ftplet で、GET を発行してダウンロードする際に介入し、

置かれているファイルは正しいのに、ダウンロードされたファイルは加工されている(テストでやったのは、文字が XOR されてる)

というのをする際に、Apache ftpServer では、

  1. 1. FtpSession から、ダウンロード対象ファイルの InputStream を得る。
  2. 2. FtpSession から、アクセスユーザの DataConnection(出力ストリーム) を得る。
  3. 3. 勝手な変換をするフィルター(FilterInputStream継承クラス)を作り、1. の InputStream を引数とするコンストラクタで初期化して、2. の DataConnection にセットする。

という流れで、本来の処理に介入する格好になります(ソース )。まあ、これホントに、

うんこれフィルター

という感じの使い方です...大昔、ImageFilter使い倒して書いたアプレットで、

このフィルターモデル難しい....

と悩んだことを思い出してしまいました...こういうモデルって、

そういや commons の Collections ユーティリティが Decorator だよね

というくらいで、「フィルターって敷居が高い」というイメージがあるので避けられてるのかな?などと...

投稿者 : 杉浦 こずえ | 投稿日時 : 2008.11.05 14:17

カレンダー

<< 2008年11月 >>

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

最新のエントリー

最新のトラックバック

最新のコメント

Tag

バックナンバー