PEAK XOOPS - D3 Pipesの紹介 (1) in englishin japanese

Archive | RSS |
XOOPS
XOOPS : D3 Pipesの紹介 (1)
Poster : GIJOE on 2007-04-18 13:04:43 (10022 reads)

in englishin japanese
D3 Pipesとは、内外のシンジケーション情報を自在に扱うためのモジュールです。
名前からも機能からも、某!Pipesを予想させるでしょう。

ただ実は私、某!Pipesを使ったことは一度もありません。(アカウントすらない)
あくまでITMediaの紹介記事を読んだだけであり、概念くらいしか知りません。
その紹介記事からインスパイアされて作っただけなので、もしかしたら、まったく違うものである可能性はあります。


さて、xhldを開発していて、何より苦労したのは、環境依存があまりにも多いことです。xhldでは、個別に対応して、その都度パッチを当てていたのですが、結果的にレンダラクラスばかりが肥大する、という結果になりました。

問題となった環境依存とは以下のようなものです。

-取得処理
--allow_url_fopen設定 (onならfopenが使えるがoffならsocketを使うしかない)
--curlの有無/パス (snoopy利用時のhttpsアクセス)
--Proxyをどう超えるか

-解析処理
--XMLの文字エンコーディング (mbstring/iconv)
--RSS1/RSS2/ATOMのフォーマットの違い
--どの要素にどのデータが載っているか(サイトによって千差万別)
--規則に違反しているXMLの処理

-絞り込み処理
--国際化を考えるとpreg_matchしか使えないが、マルチバイト圏ではmbregexでないと使い物にならない

-保存処理
--内部エンコーディング (mbstring/iconv)

-集約処理
--発行日のないエントリをどう扱うか

-表示処理
--どの要素を表示するか
--どの要素をエスケープするか/しないか


…とまあ、実際キリがなく、嫌になるほどです。

ところが、RSSの処理をパイプに見立てて、上述した各動作を、ジョイントとして機能的に分解してみると、驚くほどすっきりとしたコードになったのです。外部XMLを取得・表示する1本のパイプは以下のようなジョイント構成になります。


Joint -> Joint -> Joint  ->  Joint
元のXML  utf8XML  utf8配列  内部配列

-取得(fetch)
--fopen/snoopyから選択
--オプションは取得すべきURI
--先方に迷惑をかけないように最低限の取得キャッシュは利用する

-UTF-8への変換(utf8from)
--mbstring/iconv/iso88591から選択
--オプションはそのXMLのエンコーディング
--UTF-8以外のXMLは、先にUTF-8にしておく

-XML解析(parse)
--現在はkeithxmlのみ。
--オプションは RDF/RSS/ATOM のいずれかとしているが、可能な限り自動判別すべき
--将来的に PEAR:XML* エンジンベースのを追加してもよい

-UTF-8からの変換(utf8to)
--mbstring/iconv/iso88591から選択
--オプションは内部エンコーディング

-絞り込み(filter)
--mbregex/pcreから選択
--オプションは絞り込みパターン

-ローカル保存(clip)
--現在はmoduledbのみ
--オプションはローカル保存をキャッシュとして利用する時間(sec)
--ローカル保存することで検索/コメント/マーキングが可能となる

-集約(union)
--現在はmergesortのみ (集約してpubtimeでソートする)
--オプションはパイプ番号(と、各パイプからの最大件数)をカンマで区切ったもの


#…と、ここまで書いて、「集約」と「ソート」は別のジョイントして分けた方がいいような気がしてきました。(近く対応する予定)


初回からヘビーな話になってしまいましたが、この開発背景を知っていると、D3 Pipesの使い方も良く理解できると思って、あえて原理を説明しました。

次回からはもう少し易しくなる予定です。

0 comments

Related articles
Printer friendly page Send this story to a friend

Comments list

Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!