- 1 名前:ミスターオミトロン [2006/11/13(月) 17:00:32 ID:oCAoIukD0]
- このスレは作成依頼されたフィルタを有志により作るスレッドPart4です
アップローダー wind.prohosting.com/proxmine/cgi-bin/uploader/ proxo.hp.infoseek.co.jp/cgi-bin/sn_uploader/upload.html Proxomitron等に関するWiki abc.s65.xrea.com/prox/wiki/ Thinking Archive(仮) vird2002.s8.xrea.com/ CastleCops Proxomitron Filters www.castlecops.com/f65-Proxomitron_Filters.html >>2-10にいろいろと
- 485 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 02:11:39 ID:3Cl7ivfL0]
- 自分で考えてフィルタを作りたいならもう少しプログラミング(論理学でもいい)の基礎を勉強したほうがいいよ。
もしくはほかの人がこれまでに書いてきたものを読んで理解したほうがいい。 例えば <a(rea|)>...</a(rea|)> としたんじゃ <a>...</area> にも <area>....</a> にもマッチするし、たぶんそれは意図していないマッチングだろう。 もう一つだけど最初のうちはアスタリスクを乱用しないほうがいい。 初心者にとってのアスタリスクというのはおそらく面倒なことをブラックボックスに詰め込んでどっかにやるためのツールなんだろうけど それじゃ何も上達しないし理解もすすまないだろう。 >(*href=$AV(\1)*|)&(*title=$AV(\2)*|) これなんかはアスタリスク乱用の好例だね。 やりたいことはhrefがあればその属性値を\1に代入し、titleがあればその属性値を\2に代入する、ということなんだろうけど hrefとtitle以外の属性値をすべて無視してしまえば、もっとシンプルな場合わけができるはずだ。 <a>, <a href>, <a href title>, <a title>, <a title href> というように。 あとはこのスペースを[^>]++で置き換えてやればhrefとtitle以外の属性値を上手に無視することができる。 例えばこうなる。 <a\s ([^>]++href=$AV(*)([^>]++title=$AV(*)|)[^>]+>|[^>]++title=$AV(*)([^>]++href=$AV(*)|)[^>]+>|[^>]+>) #これは<a>にはマッチしないけど、現実的にはそれでも問題はないだろう。 >(*href=$AV(\1)*|)&(*title=$AV(\2)*|) は初心者の好むブラックボックス化で ><a\s ([^>]++href=$AV(*)([^>]++title=$AV(*)|)[^>]+>|[^>]++title=$AV(*)([^>]++href=$AV(*)|)[^>]+>|[^>]+>) は論理的思考にある程度慣れた人が好むブラックボックス化だと考えてくれてもいいと思う。(優劣の問題にあらず) 論理学的には中身はまったく一緒だけどよりシンプルでより破綻しづらいのは後者。 { (A|B)&(C|D) = (AC|AD|BC|BD) } Proxomitronでのアスタリスクは賢い上に速度も最速な便利な道具だけど慣れるまでは上記のようなスタンスで取り組んだほうがいい。 高速化チューニングはその後からやってもいいんだから。
- 486 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 02:47:07 ID:3Cl7ivfL0]
- 属性値と要素を混同している部分があるけど、適宜読み替えてほしい。
<a(rea|)>...</a(rea|)> について。 残念ながらProxomitronの仕様ではこれに多少の修正を加えることで「意図」通りに動かすということはできない。 方法は二つ。 一つは括弧を閉じないやり方。 Proxomitronからすれば一番合理的なやり方だけど、人間からすれば読みづらいしフィルタサイズが大きくなるわ追加・修正が面倒だわ。 <a(rea...>...</area> | ...>....</a>) もう一つはTSTを利用するやり方。 <a(rea...>(\1)<\area> | ...>(\1)<\a>)$TST(\1=foobar) これなら人間にとって把握しやすいし修正が楽になるというメリットがある。 後者は同じようなことをANDやBoundsを使って表現することもできる。 ANDとBoundsとTSTでどれが一番早いかは……不明。
- 487 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 03:15:52 ID:3Cl7ivfL0]
- 簡単なテストでANDとDOUBLEANDとTSTの速度比較をしてみた。
AND : <a\s([^>]+>&href=$AV(*)) TST : <a\s([^>]+)\0>$TST(\0=*href=$AV(*)*) DAND : <a\s([^>]+>&&*href=$AV(*)*) フィルタとしては考え得る限りで同一の動作をすると思う。 結果から言うと所要時間は AND ≒ DAND < TST でした。 TSTが一番遅いだろうとは思ってたけどANDとDANDがほぼ同じというのは少し意外。 #もちろんサンプルによっては結果は異なると思うので、本来なら色々なサンプルでテストしてみるべきところだが #今回は二つのサンプルでほぼ同一の結果(所要時間の比率)を得たのでよしとした。 AND/DANDとTSTの速度差は数回の平均を取った場合で0.7%。 ANDとDANDの差は誤差範囲内。 ちなみに <a\s[^>]++href=$AV(*)[^>]+> は上記三つの約7倍の速さだった。 [^>]++をアスタリスクに置換すると更に6%早くなった。(但しこのアスタリスクの使い方は非推奨) 長い文字列に対しては$NESTを使うことで更に早くなる場合もあるがそれはケースバイケース。
|

|