Proxomitron フィルタ ..
809:名無しさん@お腹いっぱい。
06/10/17 10:43:56 1EbHilyf0
ブロックリストincrement
( $TST(num=([0-9]++)\09) $SET(num=\0) $SET(num2=0$GET(num2)) $LST(increment) | $TST(num=([0-9]++)\0$LST(num+1)) $SET(num=\0\@$GET(num2))
動作を検証してみる。
再帰的なブロックリストincrementを構成。
まずは初期値としてnumに19を代入してみる。
テストをしてnumの下一桁が9の場合には下一桁以外の数字をnum変数にリセットするのでnum変数が1になる。
と同時にnum2変数に0がセットされる。
そして最後に$LST(increment)が繰り返される。
最初に戻って、テストをしてnumの下一桁が9であるかを調べるが、この時点でnum変数は1なのでTSTの結果は偽。
よってOR関数の後者に移動する。
まずテストをしてnumの下一桁を$LST(num+1)で取り出し一つ大きな値をスタックに代入する。
ここではスタックに2が代入される。
次にnumの下一桁以外+スタックに入っている一桁の数字+今までにnum2に入った数字が代入される。
ここで最初の値は空値であり、次の値は2であり、最後の値は0である。
以上から初期値19に対して1だけ大きい20がセットされる。
こんなブロックリストが実際に動くかはまだ検証していません。
時間がある人が居れば試してみてください。
810:名無しさん@お腹いっぱい。
06/10/17 13:32:12 8nUFKOs50
webフィルタなら適当なローカル変数に取り込んだあと
javascriptで処理させるのがセオリー
811:think ◆MM0nnAOCiQ
06/10/17 18:01:22 C/FhEIND0
>>798-800,808-809
とりあえず、名前を固定化してください。
IDが変わると、誰が誰だかわからなくなります…。
>>809
> なおURL欄でローカル変数を使ってもマッチング欄その他には変数を渡せないようです。
ブロックリストの中なら変数への取り込みが効くと思うのですが、いかがでしょうか?
下記をブロックリストに登録すれば、"URLリンク(\@") で加工後のURLを挿入できます。
([^.]+.rakuten.co.jp/rms/sd/esearch/vc\?*\&p\=)\#(1$SET(#=2)|2$SET(#=3)|3$SET(#=4)|4$SET(#=5))(^(^\&|(^?)))\#
> 今気が付いたのですが、p=に続く数字をインクリメントするときに桁上げがあると少しやっかいですね。
先の表現では、(^(^\&|(^?))) で後ろに続く数字の存在を先読みチェックしています。
後述に "&" か (^?) があれば、そこで数字が終わることになります。
812:名無しさん@お腹いっぱい。
06/10/17 18:25:03 emUaxh1m0
(^[0-9]) でもいいね。
813:803
06/10/17 19:37:17 emUaxh1m0
オミトロンで数字を+1するだけなら何桁の数字であっても出来そうな気がしてきた。
+ を使った繰り返し処理、 "繰り上がり" を意味する記号 "X" を使って以下のような処理をする。
X0 は 10 を意味し、 3X0 は 40 を意味するものとする。
(999に1を足す場合)
1、下一桁の 9 を X0 に置換する。 下一桁が 9 以外だったら従来通りの方法で置換し、終了。
⇒ 999 が 99X0 に置換される。
2、 99X0 の中の 9X を X0 に置換。 9X00 になる。
3、 9X00 の中の 9X を X0 に置換。 X000 になる。
4、 先頭が X なので X を 1 に置換し、+ループ終了。
このようにして記号 X が無くなるまでループさせれば自動的に +1 処理が完了する。
>>808
>>807はURLの一部を取り出してから処理する方法を示したものです。
フィルターがごちゃごちゃしてしまう場合にこうすると全体の処理過程が分かりやすくなる例です。
今回の件ではもう必要無いので忘れて下さい。
814:名無しさん@お腹いっぱい。
06/10/18 18:46:17 0r+ECrj30
yahooでURLリンク(ard.yahoo.co.jp)で始まってるテキスト広告を消したいのだけどいいフィルターあるかな。
815:名無しさん@お腹いっぱい。
06/10/18 19:10:53 Oxpb2xGt0
>>794
mixiのソースが変わってマッチしなくなってる。 書いた直後に仕様変更とはなんと間の悪い..。
>>814
>>1のうpろだにあるよ。
816:名無しさん@お腹いっぱい。
06/10/18 19:57:20 Oxpb2xGt0
mixiはこれでどうかな、とりあえず上の広告だけ消すフィルターを修正してみた。
mixiのアカウントが某バーガー祭りで巻き添え削除食らったのでログインしても効くかは不明。
[Patterns]
Name = "mixi banner cleaner [2006-10-18]"
Active = TRUE
URL = "$TYPE(htm)([^/]++.|)mixi.jp/"
Limit = 4096
Match = "$NEST(<script,*ads.mixi.jp*,</script>) <noscript>*</noscript>$STOP()"
Replace = "<div style="background-image: url(URLリンク(img.mixi.jp)); width:468px; height:60px; border=0px;"></div>"
あとyahooとうたまっぷの歌詞表示のフィルターの修正済みのを>>2のうpロダに上げておきました。
817:名無しさん@お腹いっぱい。
06/10/18 21:57:54 bPOL+aCR0
横スクロールバーの発生を防ぐためのフィルタなのですが、
ひとつ困ったことがあります。
Name = "css width limiter (2006.10.18)"
Active = TRUE
URL = "$TYPE(css)|$TYPE(htm)"
Limit = 64
Match = "$KEYCHK(c)width : ([#751:*]px|[#91:*]%)\1$SET(2=auto) (;|)\3|"
"$KEYCHK(v)width : ([#751:*]px$SET(2=750px)|[#91:*]%$SET(2=90%))\1 (;|)\3|"
"width : ([#751:*]px$SET(2=750px)|[#100:*]%$SET(2=auto))\1 (;|)\3"
Replace = "width: \2\3 /* css width limited - \1 */"
Replace で「/* */」のようにコメントを挿入しているのですが、
マッチするテキストがすでにコメントの中にあった場合、
コメントが二重になってしまいます。
Replace = "width: \2\3"
これで解決することもできますが、
Replace から「/* */」を削除せずともよい方法はありませんか?
818:think ◆MM0nnAOCiQ
06/10/18 22:08:08 dpbYjLHS0
>>817
Limitを少し大きくして (^(^*/\*|(^*\*/))) を検索表現の末尾に挿入してはどうでしょう?
コメント内部にはマッチしなくなります。
819:817
06/10/19 00:47:01 64qsfQ3f0
>818
どうもありがとうございます。
Limit = 256
Match = "($KEYCHK(c)width : ([#751:*]px|[#91:*]%)\1$SET(2=auto) (;|)\3|"
"$KEYCHK(v)width : ([#751:*]px$SET(2=750px)|[#91:*]%$SET(2=90%))\1 (;|)\3|"
"width : ([#751:*]px$SET(2=750px)|[#100:*]%$SET(2=auto))\1 (;|)\3)(^(^[^/*]+/\*|(^[^/*]+\*/)))"
一応、上記とすることで解決しました。
「/*」または「*/」があっても消費させずにそのまま残すようなしくみなのでしょうか。
また、(^(^*/\*|(^*\*/))) の部分についてですが、
/* max-width: 200%; */
max-width: 200%;
/* min-width: 100%; */
min-width: 100%;
このような文字列でテストすると1行目のコメントが多重になってしまうので
一部をいじってみました。
これでしばらくテストしてみます。
820:817
06/10/19 01:08:10 64qsfQ3f0
>819だと
/* max-width: 200%; / */
こんなのにマッチしてしまいますね。ケアレスミスでした。
いろいろ試していますが、いまのところ望み通りの Match が見つかりません。
821:794
06/10/19 04:20:49 Rp4XmZBf0
>>815>>816
本当にうpした後に変更しおった、なんてこったい。
>>816のフィルタもログイン後でも正常に動作したよ。
教えてくれてありがとう。
height を 1pix 足したら、ほぼそのままで使えてしまった(゚∀゚)アヒャ
戻されても使えるように以前の条件をORで含めているけれど、
必要ない場合は削除。
822:名無しさん@お腹いっぱい。
06/10/19 04:21:23 0avczPwd0
>>816
問題なく動くよ。thx
823:794
06/10/19 04:22:13 Rp4XmZBf0
[Patterns]
Name = "[User] Commune @ mixi"
Active = TRUE
URL = "*mixi.jp"
Limit = 1673
Match = "(<td (align="center" width="553"|) background=$AV(URLリンク(img.mixi.jp))>"
"<img src=$AV(URLリンク(img.mixi.jp))[^>]+><br>\s"
"(<a href=(URLリンク(mixi.jp))banner.pl\?id=[^>]+>*</a>"
"|<script type="text/javascript"*"URLリンク(ads.mixi.jp"*<))\s</td>"
"$SET(1=<!-- Commune @ mixi - Edited by Proxomitron -->\n"
"<td align="center" width="553" height=61 background="URLリンク(img.mixi.jp)
"\t<img src="URLリンク(img.mixi.jp) width=1 height=1>\n"
"</td>\n<!-- /Commune @ mixi - Edited by Proxomitron -->\n)"
"|(<(table|td)\s[^>]++width=)\2$AV(710)([^>]+>)\3"
"$SET(1=<!-- Commune @ mixi - Edited by Proxomitron -->\n"
"\2"950"\3\n<!-- /Commune @ mixi - Edited by Proxomitron -->\n)"
"|<td width="224" valign="middle">*/td>"
"$SET(1=<!-- Commune @ mixi - Blocked by Proxomitron -->\n)"
"|<table border="0" cellspacing="1" cellpadding="0" width="100%" bgcolor="#FF9933" style="margin-bottom: 5px;">"
"\s<tr><td>*/table>*/table>"
"$SET(1=<!-- Commune @ mixi - Blocked by Proxomitron -->\n))"
Replace = "\1"
824:816
06/10/19 08:21:48 I4R88+570
>>821-822
動作確認ありがとうございます! >>816のフィルターは後で>>2のうpロダに上げときますね。
>>823
乙です。 あまり変更が無いとはラッキーでしたねw
ーーーーーーー
>>813で書いたものが一応動くようになったので晒しておきます。 まだ無駄が多いのでbeta版扱いで。
テストウインドウに 9999 などを入れてテストしてみて下さい。 では。
[Patterns]
Name = "number +1 (2006-10-19 beta)"
Active = FALSE
Limit = 256
Match = "(([0-9])\8($TST(F=roop)|(^(^([0-9]+)\9))$SET(C=up)$SET(F=roop)$TST(\9=\7)$SET(A=\8\7)$SET(7=)$SET(9=))"
"$TST(A=\0([0-9])\1(^?))($TST(C=up)$SET(C=)$TST(\1=(0$SET(2=1)|1$SET(2=2)|2$SET(2=3)|3$SET(2=4)|4$SET(2=5)"
"|5$SET(2=6)|6$SET(2=7)|7$SET(2=8)|8$SET(2=9)|9$SET(2=0)$SET(C=up)))$SET(B=\2$GET(B))|$SET(B=\1$GET(B)))"
"($TST(\0=[0-9]*)$SET(A=\0)|$SET(A=))$SET(0=)$SET(1=)$SET(2=))+{1,*}($TST(C=up)$SET(B=1$GET(B))|)"
Replace = "$GET(B)$SET(A=)$SET(B=)$SET(C=)$SET(F=)$STOP()"
825:816
06/10/19 14:03:18 6Is2YjIm0
よく考えてみると数字に+1するのにループは必要無さそう。
このアルゴリズムさえ思い付けばすごく簡単だ。
826:名無しさん@お腹いっぱい。
06/10/19 16:32:46 pqx0j20y0
>>824-825
お疲れ様です。
興味深いトピックだったので、私も挑戦してみました。
[Patterns]
Name = "number +1 [Match ver] [2006/10/19] test6.1"
Active = TRUE
Limit = 32767
Match = "([0-9]++)\#([0-9])\0(9+{1,*})\1"
"$TST(\0=$LST(Num-plus))"
"$TST(\1=($LST(Num-plus))+)|"
"([0-9]++)\#([0-9])\0"
"$TST(\0=$LST(Num-plus))"
Replace = "\@"
Name = "number +1 [$TST ver] [2006/10/19] test5.1"
Active = TRUE
Limit = 32767
Match = "([0-9]+)\0"
"("
"$TST(\0=([0-9]++)\#([0-9])\1(9+{1,*})\2)"
"$TST(\1=$LST(Num-plus))"
"$TST(\2=($LST(Num-plus))+)|"
"$TST(\0=([0-9]++)\#([0-9])\1)"
"$TST(\1=$LST(Num-plus))"
")"
Replace = "\@"
827:think ◆MM0nnAOCiQ
06/10/19 16:34:35 pqx0j20y0
>826です。名前入れ忘れましたw
## $LST(Num-plus) の中身
0$SET(#=1)
1$SET(#=2)
2$SET(#=3)
3$SET(#=4)
4$SET(#=5)
5$SET(#=6)
6$SET(#=7)
7$SET(#=8)
8$SET(#=9)
9$SET(#=0)
"Match ver" の方が若干高速ですが、取り込むフィルタによっては、"$TST ver" の方が都合がよい場合もあるので2パターンのフィルタを用意してみました。
心なしか "$TST ver" の方がすっきりしているような気も…。
まあ、たいした速度差はないので、好みで選んで構わないと思います。
アルゴリズムは>813,824とは全く違います。
フィルタの構成としては、繰り上がりが発生するときと発生しないときで処理を分岐させています。
・繰り上がりが発生しないときには、末尾の数字に +1
・繰り上がりが発生するときには、末尾の 999... を 0にし、繰り上がる桁の数値を +1
という仕組みです。
828:think ◆MM0nnAOCiQ
06/10/19 16:54:12 pqx0j20y0
>>820
えー、そんな妙なコメントあるのかなあ。
・・・と、愚痴は置いておいて。
よく考えたら、(^((^\*/|/\*)?)+\*/) の方が厳密かつシンプルでした。
(私はシンプルに感じますが、大半の人はシンプルと受け取れないかも…)
「"*/" か "/*" の手前まで先読みして、その後ろに "*/" が存在してはならない」という表現です。
実は私の好きな表現でして、覚えておくとたまに役立ちます。
# 蛇足
>826のLimitが異様に大きいのは気にしないでください。(速度計測時の名残です…。)
実際に、フィルタに取り込むときにはもっと小さな値のLimitで作成することになると思います。
829:名無しさん@お腹いっぱい。
06/10/19 18:18:18 jrvNMl2x0
>816さん、thinkさんがしっかりしたものを作り上げてくれたようなのでありがたいです。
あとはこれをリストにぶちこんで、モジュール化させれば簡単に
任意の箇所の一続きの数字列に対して1だけ大きい数を得ることができますね。
830:名無しさん@お腹いっぱい。
06/10/19 18:21:06 jrvNMl2x0
むむ、リストに入れなきゃいけないわけではないけど、フィルタの中に突然↑のような処理が入ったら
なんのことやら混乱する可能性があるので可読性という点でリスト化させたほうが良いかなと思います。
831:816
06/10/20 00:59:27 ELREBDG20
>>826
乙です。
> 繰り上がりが発生するときには、末尾の 999... を 0にし、繰り上がる桁の数値を +1
これこそ>>825に書いた簡単なアルゴリズムです。 これに気付いていれば>>824みたいな難解で遅いものを
書く必要は無かったですね。 でも、 ローカル変数でも $SET(0=) 等で明示的に初期化する必要がある
場合があることなど、今まで知らなかったオミトロンの挙動が次々に出てきたのでなかなか楽しめました。
PS、
数字が 999 などの 9 の繰り返しだった場合に 000 などになってしまうようです。
>>829
リスト化すれば使い回しがしやすくて便利そうですね。
完成したらどこかで配布してみてはいかがでしょう、きっと重宝されると思います。
あと、リストを使った回帰的処理というのは面白い発想でした。
これが正しく動作するとすれば複雑な処理が簡単に書けるようになりますね。
832:817
06/10/20 01:36:13 wAdVERPl0
>828
どうもありがとうございます。ばっちり解決していますね。
>820のような妙なコメントを書く人はあまりいないだろうと思いますが、
書かれることを想定しておいた方が後々のためになるだろうと思います。
フィルタを作る際は、一応はあらゆる場合を想定しておいた方が
安心して使えるだろうと思うので……。
解説もありがとうございました。
>828のようなテクニックを集めたサイトがあるとよいと思うものの、
wikiやthinkさんのサイト内などにはあるのかな。
833:816
06/10/20 04:46:14 kgbwGCqt0
リストを使ったループもちゃんと動作しますね。 オミトロンでここまで出来るとは...。
[Patterns]
Name = "LIST rooptest"
Active = FALSE
Limit = 256
Match = "$LST(rooptest)"
Replace = "[\@]$STOP()"
----------------rooptest.txt----------------
(1)\#($LST(rooptest)|)
----------------rooptest.txt----------------
テストウインドウ: 111
結果: [111]
834:名無しさん@お腹いっぱい。
06/10/20 04:49:49 H4LiK3bO0
どうでもいい話、ループの最大回数がわかってる場合は
(?)+{1,4}とか決め付けると極端に高速化したような気がした。
今はもうこれ自体使ってないからかなり忘れかけてるけど。
835:816
06/10/20 05:06:17 kgbwGCqt0
>>834
30000バイトの文字列をテストウインドウに貼って
(?)+{30000}
(?)+
の2つの速度をプロファイルボタンから調べて比べてみたんですが限りなく同タイムでした。
高速化したというのはたぶんlimitと同じような目的で使った場合の話ですね。
836:816
06/10/20 07:02:24 kgbwGCqt0
>>826
test6.1のほうですがテストウインドウに111と入れると222になったりしたので修正してみました。
「 + 」 での取り込みで最短一致でマッチングしてるのが原因でした。 ついでに 000 の問題も修正。
もっといい方法があれば手直しを。
[Patterns]
Name = "number +1 [Match ver] [2006/10/19] test6.2"
Active = TRUE
Limit = 32767
Match = "(9+{1,*})\0(^[0-9])$TST(\0=$SET(#=1)(9$SET(#=0))+)"
"|([0-9]++)\#([0-9])\0(9+{1,*})\1(^[0-9])"
"$TST(\0=$LST(Num-plus))"
"$TST(\1=($LST(Num-plus))+)|"
"([0-9]++)\#([0-9])\0(^[0-9])"
"$TST(\0=$LST(Num-plus))"
Replace = "[\@]"
837:816
06/10/20 07:09:54 kgbwGCqt0
すみません、余計酷くなってしまいました。 ↑は無かったことに....。
838:名無しさん@お腹いっぱい。
06/10/20 15:16:57 pRyei5xN0
以前、永久ループに陥ってから倦厭していた$NESTが何となく解るようになった。
少し進歩した(゚∀゚)アヒャ
839:think ◆MM0nnAOCiQ
06/10/20 22:19:35 sNjWaFpG0
>>831
> 完成したらどこかで配布してみてはいかがでしょう
出来れば、今日コンテンツに加えて更新したいところです。遅くとも明日には何とか…。
>>831
> あと、リストを使った回帰的処理というのは面白い発想でした。
>>832
> >828のようなテクニックを集めたサイトがあるとよいと思うものの、
実は「フィルタ公開 → 仕組み解説」という形でいくつかのテクニック解説をコンテンツに加えようと考えていましたが、考えるだけで先に進まないので、そろそろ始動しようと考えてます。
今サイトを改装中なので、そのときにフィルタ公開だけでもやってしまおうかと。
# 先にフィルタを公開すれば、要望or突っ込みなどいただけるかもしれませんしね。
# 別所で公開していたフィルタがあるので、皆さんが知っているフィルタも幾つかあると思います。(勘の鋭い方は既に気がついているかもしれませんねw)
>>836
> 「 + 」 での取り込みで最短一致でマッチングしてるのが原因でした。
確かに困りますね、これは。
どうも私の最短一致についての認識が甘いみたいです。
(以前も * の最短一致で指摘されたことがありましたが、未だに勘違いしている節があります(汗))
解決法としては、
・数値の先端/末尾を含めてマッチさせる (最長一致とほぼ同等)
・数値の末尾のみにマッチさせる (必要な箇所だけ最短一致)
のいずれかと思います。
840:think ◆MM0nnAOCiQ
06/10/20 22:20:45 sNjWaFpG0
>839の後者の方で解決してみました。
[Patterns]
Name = "number +1 [Match ver] [2006/10/20] test6.3"
Active = TRUE
Limit = 32767
Match = "([0-9]++)\#([0-8])\0(9+{1,*})\1(^[0-9])"
"$TST(\0=$LST(Num-plus))"
"$TST(\1=($LST(Num-plus))+)|"
"([0-9]++)\#([0-8])\0(^[0-9])"
"$TST(\0=$LST(Num-plus))|"
"(9+{1,*})\1(^[0-9])"
"$SET(#=1)"
"$TST(\1=($LST(Num-plus))+)"
Replace = "\@"
Name = "number +1 [$TST ver] [2006/10/20] test5.3"
Active = TRUE
Limit = 32767
Match = "([0-9]+)\0(^[0-9])"
"("
"$TST(\0=([0-9]++)\#([0-8])\1(9+{1,*})\2)"
"$TST(\1=$LST(Num-plus))"
"$TST(\2=($LST(Num-plus))+)|"
"$TST(\0=([0-9]++)\#([0-8])\1)"
"$TST(\1=$LST(Num-plus))|"
"$TST(\0=(9+{1,*})\1)"
"$SET(#=1)"
"$TST(\1=($LST(Num-plus))+)"
")"
Replace = "\@"
841:think ◆MM0nnAOCiQ
06/10/20 22:28:33 sNjWaFpG0
あと一行、書ければ…。
>>831
> 数字が 999 などの 9 の繰り返しだった場合に 000 などになってしまうようです。
こちらは、もう一つ分岐を作ることで対応しました。
よく考えたら、([0-9])\0 じゃなくて ([0-8])\0 で良かったのですよね。
これで3つめの分岐が期待通りに動作すると思います。
842:816
06/10/21 02:22:58 62B1+yNF0
>>839-841
サイト更新予定ですか、乙。 フィルターの公開とはとても楽しみです。
テクニック解説も期待してます、頑張って下さい。
>number +1 フィルター
修正乙です、ばっちり修正されてました。
あと、ちょっと考えてみたんですが、以下のことが気になったので
・ 下一桁が 9 である確率は 1/10 なのでこれにマッチするものを分岐の先頭に書くのは低速化になるような
・ 9 の繰り返しを 0 に置換するときはリストを使わずに $SET(#=0) を使ったほうが速い
自己流のものですが試しに書いてみました。
843:名無しさん@お腹いっぱい。
06/10/21 02:29:26 62B1+yNF0
[Patterns]
Name = "number +1 (2006-10-21 beta3)"
Active = FALSE
Limit = 32767
Match = "([0-9]++)\#([0-8])\0(^[0-9])"
"$TST(\0=$LST(Num-p-Ten))"
"|"
"9(^[0-9])$SET(#=10)"
"|"
"([0-9]++)\#"
"([0-9])\0"
"(9+{1,*})\1"
"(^[0-9])"
"$TST(\0=$LST(Num-p-Ten))"
"$TST(\1=(?$SET(#=0))+)"
Replace = "\@"
-------Num-p-Ten.txt------
0$SET(#=1)
1$SET(#=2)
2$SET(#=3)
3$SET(#=4)
4$SET(#=5)
5$SET(#=6)
6$SET(#=7)
7$SET(#=8)
8$SET(#=9)
9$SET(#=10)
-------Num-p-Ten.txt------
このフィルターの場合、Num-plusリストの "9" で # に "10" を代入しても支障が無いので別のリスト名にして変更しました。
このせいで他のフィルターでリストの使い回しが出来なくなるのであれば元に戻す方向で。
844:816
06/10/22 07:56:03 giDEESQO0
>>824、>>840、>>843 の3つのフィルターの速度を3万文字の数字で試してみたら>>824が一番速い。
かなり予想外・・。
845:名無しさん@お腹いっぱい。
06/10/22 08:54:24 pIhJV0rv0
処理にかかる時間は
4 : 10 : 5
>>824 >>840 >>843
くらいの倍率になるようですね、>>843の高速化も予想以上に効いてます。
846:名無しさん@お腹いっぱい。
06/10/23 06:41:54 r0C1Bci+0
所でオミトロンで数を+1することでどんなことが出来るんだ?
847:名無しさん@お腹いっぱい。
06/10/23 13:46:05 KvMb1J5K0
主にcgiを中心としたURLだね。
あと一部のサイトにはサイトを番号で階層的に構築しているものもあるだろうから
そういう場合に次ぎのカテゴリに飛ぶリンクやカテゴリ内の次のページに飛ぶリンクを埋め込むことができると思われる。
ちなみにURLの処理の場合はソース内のそれと比べて遙かに量が少ないので高速化したところで意味はほとんどない。
彼らは単なるベンチマニアなので気にしないでおいてあげようw
848:名無しさん@お腹いっぱい。
06/10/23 18:55:30 MzXqWBCb0
みんな頭がいいんだな。
もう何がなんだか(´・ω・`)ショボーン
849:名無しさん@お腹いっぱい。
06/10/23 19:30:43 r0C1Bci+0
JSオフにしてる人用って事か
850:think ◆MM0nnAOCiQ
06/10/23 20:46:24 LNHCxGv10
>>842
> ・ 下一桁が 9 である確率は 1/10 なのでこれにマッチするものを分岐の先頭に書くのは低速化になるような
> ・ 9 の繰り返しを 0 に置換するときはリストを使わずに $SET(#=0) を使ったほうが速い
なるほど。
>>843
([0-9]++)\#([0-9])\0(9+{1,*})\1 は面白いですね。この発想はありませんでした。
9999... の数値の置換が高速に動作するのが良い感じですね。
>>844
> 3万文字の数字で試してみたら>>824が一番速い。
おそらく、OR関数を使用している影響だと思います。
実際、ORの先頭の表現にマッチさせる条件だと、速度差がかなり小さくなります。
851:think ◆MM0nnAOCiQ
06/10/23 20:47:43 LNHCxGv10
あれからもう一度、初心に返って考え直してみたら、驚くほどスリムなフィルタになりました。
[Patterns]
Name = "number +1 [Match ver] [2006/10/23] beta1"
Active = TRUE
Limit = 32767
Match = "(^(^[0-8]9+(^[0-9])))$LST(Num-plus)(9$SET(#=0))+|"
"(^(^9))$SET(#=1)(9$SET(#=0))+(^[0-9])"
Replace = "\@"
Name = "number +1 [$TST ver] [2006/10/23] beta1"
Active = TRUE
Limit = 32767
Match = "([0-9]+)\0(^[0-9])("
"$TST(\0=\#(^(^[0-8]9+(^?)))$LST(Num-plus)(9$SET(#=0))+)|"
"$TST(\0=$SET(#=1)(?$SET(#=0))+))"
Replace = "\@"
>842のアドバイスを受けて、ブロックリスト(Num-plus)から "9$SET(#=0)" を外し、更に ([0-9]++)\# を省きました。
>839で紹介した「数値の末尾のみにマッチさせる (必要な箇所だけ最短一致)」の応用形です。
我ながら、高速でシンプルなフィルタに仕上がったと思います。
852:think ◆MM0nnAOCiQ
06/10/23 20:57:23 LNHCxGv10
>>846
「相対URL → 絶対URL」にするときに ../ の出現回数をカウントして繰り返し処理させたいと考えたことがあります。
「+1 するフィルタ」を応用すると、「-1 するフィルタ」も出来そうなので、 「../ が何度出現しても絶対URLにするフィルタ」が作れそうです。
(今までは繰り返し回数を1〜4回のように決めうちして、ORで指定していました)
決めうちでもほとんどの状況を網羅できるので、わざわざグローバル変数を使ってまで実現する必要があるかというと疑問が残りますが…。
また、「グローバル変数に『特定の文字列』が何回マッチしたか記憶させたい」と考えたことも。
何度か出た話題ですが、行数も \n の数をカウントすれば、取得できます。
行数でなくても、「ある単語」がn回HITしたら、フィルタを働かせるロジックは応用が利きそうですね。
>>847
> 彼らは単なるベンチマニアなので気にしないでおいてあげようw
アルゴリズムマニアも加えておいてくださいw
853:名無しさん@お腹いっぱい。
06/10/23 21:31:20 7VXS0HXl0
画像を全部lightboxで表示するフィルタ書いてもらえませんか
854:名無しさん@お腹いっぱい。
06/10/23 21:53:44 4SBEQqzk0
そういえば昔、相対URLを絶対URLにするフィルタをつくろうとして
断念したことがあったっけ。
不要な画像つきリンクをテキスト化して軽くするフィルタなんだけれども。
今では別のフィルタで対応しているからつくる必要がなくなった。
855:816
06/10/24 03:02:33 96jgfWU+0
>>850-851
乙です。 なるほど、こういう方法もありましたか。 置換に必要な場所にだけマッチさせる方法があったとは..。
それぞれのフィルターの速度を3万文字の数字で比較してみました。
計測には差が出やすいようにスーパーπ104万桁10分台の遅いマシンを使用。
---------------------------------------------------------------------
(1) (2) (3) (4) (5)
000.....0 000.....09 199.....9 999.....9 999....90 ( 対象文字列 )
>>824 43.319444 43.409722 49.640625 49.437500 46.897059 ( ミリ秒 )
>>843 48.953125 100.375000 70.340909 70.238636 33.804348
>>851 59.951923 60.000000 33.820652 25.366667 計測不能(応答なし)
---------------------------------------------------------------------
>>851のフィルターは 99999.. の後ろが 9 以外の数字で終わる場合に極端に時間がかかるようです。
実用的には問題無いと思われますがちょっと気になります。 先読みで数字の末尾を確認する
処理を入れたほうが良いかも..。
(3)、(4) の速さがすごいですね、高速化済みの>>843の3倍も速いとは...w
>>824は対象がどんな数字でも安定してることが分かります。
>>843は対象の末尾が 9 の場合をイレギュラーと考え、この場合の速度を無視した書き方なので
9 で終わる場合は遅いですね。
856:816
06/10/24 03:42:20 96jgfWU+0
>>846
〜/00581.jpg
〜/00582.jpg
〜/00583.jpg
みたいな連番の画像ファイルを見るときにブラウザをリロードするだけで次々に見れるようになります。
他にも応用次第で色々なことに使えるはず。
>>848
慣れればそのうち書けるようになるはず。
>>849
JSでは出来ないことにも使えるはず。 HTTPヘッダの置換等。
>>852
>わざわざグローバル変数を使ってまで
今まではグローバル変数を使うとすごく遅くなるという固定観念を持ってましたが
>>824を見るとそうでもなさそうなんですよね。 遠慮せずにもっと使うべきものなのかも。
>>854
>相対URLを絶対URLにするフィルタ
それらしきフィルターをどこかで見た。
857:816
06/10/24 06:48:23 96jgfWU+0
あれ、>>824は対象文字列が3文字などの短い場合は他のよりかなり遅い。 グローバル変数のせいだろうか。
グローバル変数は動的な生成とその解放をするときに時間がかかるが、
代入や取り出しにかかる時間はローカル変数と変わらない...ってことかな?
>>855に書いた 999... の末尾が 9 以外の場合に遅くなるという件は "#" の回数制限の100文字程度なら
プロファイルでも全然問題なく動作しますね。 3万文字の場合でもプロファイルでなく普通にテストする分には
正常に動作するから修正の必要は無いか。
858:名無しさん@お腹いっぱい。
06/10/24 07:40:31 iS+1bFGh0
>>853
URLリンク(abc.s65.xrea.com)
859:816
06/10/24 08:14:51 96jgfWU+0
応答なしの問題を回避するために>>851に手を入れてみました。 変更点↓
・ 9999.. の末尾の先読み判定を前に移動。
・ (^[0-9]) を (^[0-8]) に修正。
・ (^(^ 〜 )) から && に代えてみました。 タイム比較用。
[Patterns]
Name = "number +1 (2006-10-24) beta4"
Active = FALSE
Limit = 32767
Match = "([0-8]9+(^[0-8])&&$LST(Num-plus)(9$SET(#=0))+)|"
"(9+{1,*}(^[0-8])&&$SET(#=1)(9$SET(#=0))+)"
Replace = "\@"
// (^(^9))9$SET(#=0) は (^(^9))?$SET(#=0) より速いんですね、これも意外..。
860:816
06/10/24 08:30:32 96jgfWU+0
タイム比較の結果は (^(^ 〜 )) >>> && でした。 以上。
861:816
06/10/24 08:32:00 96jgfWU+0
※ (^(^〜))[速い] >>> &&[遅い] です。
862:名無しさん@お腹いっぱい。
06/10/24 10:18:39 PwmdsW1B0
URLリンク(www.so-net.ne.jp)の
>テレビ王国 > 10月24日(火)の番組表 [地上波/奈良/ 5-12時]
から上を消すフィルタお願いします。
>商号変更のおしらせ 「ソネットエンタテインメント株式会社」へ [PDF]
>[テレビ王国ランキング!レポート全国版] 10/16〜10/22分リリース!!
>テレビも動画も!あなたの好みに合わせてオススメ!
>ドラマ情報続々!この秋スタートドラマを事前にチェック。
など
>テレビ王国 > 10月24日(火)の番組表 [地上波/奈良/ 5-12時]
より上すべて消したいです。
863:816
06/10/24 16:29:32 96jgfWU+0
うわ〜! >>824のlimitが256のままだった。 これでテストすれば早いのは当たり前..。
再テストしたら比較にならないほど遅かった、>>824はボツ決定です..。(^^;A
次にグローバル変数とローカル変数の比較。
test1がグローバル変数を使ったフィルター、test2がローカル変数を使ったフィルターです。
[Patterns]
Name = "test1"
Active = FALSE
Limit = 32767
Match = "0$SET(A=1)"
Replace = "$GET(A)$SET(A=)"
Name = "test2"
Active = FALSE
Limit = 32767
Match = "0$SET(0=1)"
Replace = "\0"
(対象文字列を100文字の "000...0" にしてテスト)
結果: test1 → 0.172000 (milliseconds)、 test2 → 0.000000 (milliseconds)
(対象文字列を3万文字の "000...0" にしてテスト)
結果: test1 → 51.825000 (milliseconds)、 test2 → 4.156000 (milliseconds)
100文字のテストに比べると3万文字ではだいぶタイムの倍率は下がったが、それでも10倍以上遅い。
グローバル変数はなるべく避けたほうが良いでFAですね...。
864:think ◆MM0nnAOCiQ
06/10/24 22:42:54 vquh73VO0
>>855
> 99999.. の後ろが 9 以外の数字で終わる場合に極端に時間がかかるようです。
こんな限定された状況に、よく気がつきましたね!
原因は仰るように、\#の100回制限だと思います。
> 3万文字の場合でもプロファイルでなく普通にテストする分には正常に動作する
私の環境では、Webページ上でも期待通りに動作しない(100桁に制限された数値が出力される)ようですが、うーん…。
"999..." に>859のフィルタをマッチさせると、複数回マッチして、"10000..." が幾つも出力されてしまいます。
100回以上 $SET(#=) されるのが問題なので、$SETの繰り返し回数を100回以内に収まるようにしてみました。
[Patterns]
Name = "incremented by one [Match ver] [2006/10/24] beta1.3"
Active = TRUE
Limit = 32767
Match = "(^(^[0-8]9+(^[0-9])))($LST(Num-plus))+(^[0-9])|"
"(^(^9))$SET(#=1)((^(^9))$LST(Num-plus))+(^[0-9])"
Replace = "\@"
$LST(Num-plus) は>>827に以下を追加します。
# 9 -- 512桁
9999999999...$SET(#=0000000000...)
# 9 -- 32桁 (NOT関数の桁数は 512 - 32 = 480桁)
99999999999999999999999999999999(^9999999999...)$SET(#=00000000000000000000000000000000)
# 9 -- 1桁 (NOT関数の桁数は 32 - 1 = 31桁)
9(^9999999999999999999999999999999)$SET(#=0)
865:think ◆MM0nnAOCiQ
06/10/24 22:48:12 vquh73VO0
>864のフィルタはProxomitronのLimitの上限(32767)を考慮に入れて、繰り返し回数が百回を超えることがないように作成してあります。
この方式だと「999....90」のテキストに対して [プロファイル] では落ちますが、[テスト] では落ちません。
Webページ上でも落ちなかったので、問題ないと思われます。
>>856
> それらしきフィルターをどこかで見た。
私のサイトで配布している "Kill without <a>" (汎用Webフィルタ集の一つ) がそれです。
2chでアドバイスを受けて作成したフィルタでして、アドバイスして頂いた方がアプロダに派生系(Link to Full Path) をUPされています。
URLリンク(wind.prohosting.com)
直接の関係はありませんが、Wikiでも同種のフィルタが公開されています。
URLリンク(abc.s65.xrea.com)
866:名無しさん@お腹いっぱい。
06/10/25 02:29:53 Gpa2YWWh0
今思いついたけど、+1するフィルタを使えばJSなしでdat converter作れるね。
どっちが速いかはワカランけど。
どうやって計測すればいいんだろう。
867:853
06/10/25 02:38:09 4LLBDAGk0
自分で作ってみた
lightbox_plusベースです
[Patterns]
Name = "lightbox part1"
Active = TRUE
Limit = 256
Match = "</head>"
Replace = "<script type="text/javascript" src="URLリンク(Local.ptron)
"<script type="text/javascript" src="URLリンク(Local.ptron)
"\r\n"
"</head>"
Name = "lightbox part2"
Active = TRUE
Limit = 256
Match = "([^>]++href=)\0$AV((([^/]+//)\1|)(\2).(jpg|gif|bmp|png)\3(.html+|)\4)"
Replace = "\0"\1\2.\3\4" rel="lightbox" "
作った後でレスに気付いた・・・orz
868:816
06/10/25 05:37:11 ptucl50B0
>>864
> 99999.. の後ろが 9 以外の数字で終わる場合
なるほど、\# の制限に引っかかってたのが原因でしたか、ありがとうございます。
>正常に動作する
すみません、誤解しやすい書き方でした。 これは "応答なしにならない" という意味でした。
\# の制限に引っかかるので期待した結果は返ってこないです。
>"999..." に>859のフィルタをマッチさせると、複数回マッチ
\# の制限に引っかかるとマッチングがそこで止まってしまう場合がありますね。
発生条件は分かりませんが100回を越えた時点で想定外なので調べる必要は無さそう。
>$SETの繰り返し回数を100回以内に収まるようにしてみました。
そうきましたか、すごい力技だw これで対応出来る数字の桁数が一気に上がると。
9の繰り返しが100個以上連続するHTMLソースは見たことがないので、実用的にはこの対策は
必要無いかも知れませんね。 対策しておきたい人もいるかも知れないので好みの問題かな。
>>865
ありがとうございます、たぶんWikiで見たんだと思います。
あとサイトの更新お疲れ様でした、HTMLソースをちらっと見たんですが綺麗なソースですね。
thinkさん謹製のフィルターもありがたく使わせて頂きます。
869:816
06/10/25 05:46:05 ptucl50B0
>>863の補足。 test1のReplaceから $SET(A=) を削除したらタイムが2/3倍になった。
グローバル変数をこまめに解放するとかえって遅くなる。
>>867
∧_∧
( ´・ω・) ・・・・・ドンマイ。
( つ旦O
と_)_)
870:816
06/10/25 10:47:42 vE/VYVdH0
> 99999.. の後ろが 9 以外の数字で終わる場合
これよく考えると \# は関係ないですね。
対象文字列が 9999....90 の場合はオミトロンのマッチングが1バイト進むごとに
999...90 の末尾までのテストを繰り返すから遅くなるようです。
他のフィルターが検索表現が 999...90 の場合でも数字の先頭から一度でマッチしまずが、
このフィルターはマッチしないので何度も数字の末尾までを行ったりきたりしてしまう。
1999...90 の場合も極端に遅くなるし間違いなさそう。( 50文字でテストし確認 )
数字の中に9を見つけたらそれ以降の数字が必ずマッチする書き方に変えたほうがいいのかな、
999... の末尾が 9 である確率は 1/10 だし、>>843と融合させる手も。
871:816
06/10/25 10:53:30 vE/VYVdH0
× 他のフィルターが
○ 他のフィルターは
でした。
872:853
06/10/25 12:19:52 4LLBDAGk0
悔しいので改良してみた。
横の□を押すと別ウィンドウで開く。
[Patterns]
Name = "lightbox_plus part1"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "</head>$STOP()"
Replace = "<script type="text/javascript" src="URLリンク(Local.ptron)
"<script type="text/javascript" src="URLリンク(Local.ptron)
"\r\n"
"</head>"
Name = "lightbox_plus part2"
Active = TRUE
URL = "$TYPE(htm)"
Bounds = "$NEST(<a\s*>,</a>)"
Limit = 1024
Match = "([^>]++href=)\0$AV((([^/]+//)\1|)(\2).(jpg|gif|bmp|png)\3(.html+|)\4(target="_blank"|)\5)\6"
Replace = "\0"\1\2.\3\4" rel="lightbox" \5\6\0"\1\2.\3\4" target="_blank">□</a>"
873:862
06/10/25 16:10:20 TjL9pAss0
フィルターお願いします。
874:名無しさん@お腹いっぱい。
06/10/25 16:47:46 Gpa2YWWh0
Match = "$NEST($NEST(<div\s,*class=$AV(infomation)*,>),</div)\k"
Replyace = "<!--kill-->"
クラス属性って一回しか使えない(使わない)んだっけ?
class="information"にマッチする部分を全て消すフィルタだから誤動作しても責任は持たん。
あとは自分で条件を絞って消したくないところを消さないように改良することだな。
875:862
06/10/25 17:27:09 jr+Gvhks0
>>874
レスありがとうございます。
初心者なので
[Patterns]
Name =
Active =
URL =
Limit =
Match = "$NEST($NEST(<div\s,*class=$AV(infomation)*,>),</div)\k"
Replace = "<!--kill-->"
後の項目もお願いします。
876:名無しさん@お腹いっぱい。
06/10/25 18:22:52 aCwuBKGn0
>>874
classは何回でも使える。
IDは1回だけ。
877:名無しさん@お腹いっぱい。
06/10/25 18:24:01 ls2H3Cmj0
>>874は荒らし
878:名無しさん@お腹いっぱい。
06/10/25 18:45:32 Gpa2YWWh0
初心者かどうかなんて理由にならん。
どれだけ自分で挑戦したのか、調べたのかを書いた上で数点質問を書くのが筋じゃないのか。
実用するに当たっての情報はすでに与えられているはずなのだが。
879:名無しさん@お腹いっぱい。
06/10/25 18:49:01 VKanZiVl0
>>862
おまえさん、以前もTV王国でフィルタうpして貰っていないか?
もしそうなら、それを元に自分で改良してみる努力をしたらどうだろう。
スレの流れを切って作業を丸投げ、うpが遅いと乞い、
同一人物のイタズラのような気がしてしまうのだが。
そうでないならスレ内を検索すれば簡単に見つかる。
880:think ◆MM0nnAOCiQ
06/10/25 19:21:48 5FqRZ3c50
流れを断ち切るようですが…。
>>868
> ...発生条件は分かりませんが100回を越えた時点で想定外なので調べる必要は無さそう。
すみません。再度、試してみたら、1000... が一つだけ出力されました。
試すフィルタを取り違えていたのかもしれません(汗)
> すごい力技だw
ははw
実は、他に100桁以上の数値はマッチしないフィルタも作ってみたんですが、どうにもシンプルに仕上がらなかったので、結果的にあの形に収まりました。
副次効果として、32桁以上の 999.... の処理が著しく高速化します。
必要ない人は、ブロックリストの一部をコメントアウトすればいいので、管理も楽だと思います。
>>870
> マッチングが1バイト進むごとに、999...90 の末尾までのテストを繰り返すから遅くなる
あ…、確かに、
Match = "9+{1,*}(^[0-9])"
だけでも、[プロファイル] でProxomitronが落ちますね。そうすると、対処法はこんな感じかな。
[Patterns]
Name = "incremented by one [Match ver] [2006/10/25] beta2"
Active = TRUE
Limit = 32767
Match = "(^(^[0-8]9+(^[0-9])))($LST(Num-plus))+(^[0-9])|"
"(^(^9))(^$TST(Numflag=1))$SET(#=1)((^(^9))$LST(Num-plus))+"
"((^[0-9])|$SET(Numflag=1)$TST(Numflag=0))"
Replace = "$SET(Numflag=)\@"
ようやく、熟成してきた気がします。
いかがでしょう?
881:think ◆MM0nnAOCiQ
06/10/25 19:24:36 5FqRZ3c50
ところで、話題のグローバル変数ですが、フラグを立てる(ある条件に合致したら、フラグを立て、以降フラグが立っている場合はマッチさせない)目的で使うと、高速化できることがあります。
>880のフィルタはその典型ですね。
"Charset: Set global variable", "Replace character: 2byte -> 1byte" でも使った手法で、実際これらが実用的なレベルの速度で動作するのはグローバル変数の効果が大きいと思います。
正直なところ、当初は「『全角文字 → 半角文字』の変換は1文字ずつ置換するわけだから、遅くて使いものにならないだろう」と悲観的だったのですが、これほど実用的になるとは思ってもいませんでした。
フィルタを作成依頼した人に感謝感謝です。
>>853,867,872
フィルタ作成お疲れ様です。ちょっと見てみましたが、まだ改善の余地があると思います。
---- lightbox_plus part1
</head> → (^(^</head>))
実質的な動作は変わらないのですが、$STOP() を使うなら消費しなくても良いかなと。
---- lightbox_plus part2
> Bounds = "$NEST(<a\s*>,</a>)"
$NEST と * を組み合わせると不具合が生じることがあるので、Bounds = "$NEST(<a\s[^>]+>,</a>)" にした方がよいかと思います。
> Match = "([^>]++href=)\0$AV((([^/]+//)\1|)(\2).(jpg|gif|bmp|png)\3(.html+|)\4(target="_blank"|)\5)\6"
・(target="_blank"|)\5 の場所が明らかにおかしい (属性値に入ってます)
・(\2) は括弧が要りません (正規表現とは違いますので…)
・グループ化の場所を変えれば、変数の数をもう少し減らせるかも
> Replace = "\0"\1\2.\3\4" rel="lightbox" \5\6\0"\1\2.\3\4" target="_blank">□</a>"
□などの全角文字はそのままの状態で記入すると、Shift_JISのWebページでしか作用せず、Shift_JIS以外のWebページでは文字化けを引き起こしてしまいます。
なので、ここは半角文字にするか、実体参照を用いて記述してください。
URLリンク(abc.s65.xrea.com)
882:名無しさん@お腹いっぱい。
06/10/25 20:17:29 6PSb8kEs0
>874について訂正。
\kと$STOP()を逆に覚えていたようで、ちょうど別のフィルタを作成中にそれに気がついたので訂正。
\kではなくて$STOP()が正しい。
Match = "$NEST($NEST(<div\s,*class=$AV(infomation)*,>),</div)$STOP()"
Replyace = "<!--kill-->"
ちなみにというほどでもないが、$AV()の中身をOR関数で二つ指定してやることで>862の望む動作をすることになる。
更に、件のウェブページにこのフィルタをOR関数を使うことで二回以上呼び出すことを試みる場合には
$STOP()を発動する条件として何らかのフラグ判定が必要になるだろう。
例えばこうだ。
マッチする毎に$SET(TV=0$GET(TV))としてやる。
こうするとTV変数に詰まっている0の数から過去に何度呼び出されたかを知ることができる。
このフィルタが二度だけ呼び出されると分かっているなら($TST(TV=00)$SET(TV=)$STOP()|)とすることで
二度マッチして以降はこのフィルタをOFFにすることができる。
883:名無しさん@お腹いっぱい。
06/10/25 20:55:25 6PSb8kEs0
相対リンク→絶対リンクに関するアイデアがある程度形になったので書き込みます。
アイデアは以下の構成。
1:現在のURLの階層を数える
$URL([^:]+:[^/]+/$SET(\0=1)([^./]+/$LST(increment)+)
\0には現在の階層数の値が入る
2:../の数を数える
((../)$LST(decrement))+
../を発見するたびに\0内の数を-1する
以上より(../)+の示す階層の深さを知ることができる
3:もう一度URLを下から辿りながら該当する階層まで上がる
$URL(
([^:]+:)\#
([^/]+/)\#$LST(decrement)$TST(\0=[^0])
(([^./]+/)\#$LST(decrement)$TST(\0=[^0]))+
)
階層を上がるたびに\0内の値を1ずつ減らし、その値が0になった時点でスタックに入っているURLが
(../)+の示す階層。
なおincrementリストとdecrementリストはそれぞれ\0に入っている一桁の数字の値を1だけ増やす又は減らすリストです。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5350日前に更新/373 KB
担当:undef