[Firefox] Adblock Plus フィルタの書き方メモ new

Adblock Plus のフィルタリストを高速化、あるいは最適化するための書き方です。
Re-Search Frame Filter を公開するときに調べたもので、忘れないうちにメモメモ^^

目次
まずは Adblock Plus 公式サイトの FAQ をざっくり和訳。

高速化の公式アナウンス

How does Adblock Plus process its filters and which filters are faster?

Adblock Plus はどのようにフィルタを処理しますか、また、どのようなフィルタがより高速ですか?

すべてのフィルタは、内部で正規表現に変換されます。
例えば、フィルタ「ad*banner.gif|」は、正規表現「/ad.*banner.gif$/」に変換されます。
しかし、仮にすべてのフィルタと照合しなければならないアドレスを処理するときでも、
単純にすべてのフィルタを次々とマッチングするわけではありません。

また、フィルタを正規表現に変換する際、Adblock Plus はテキスト情報の取得を試みます。
ここでいうテキスト情報とは、複数のフィルタに共通する、8文字の文字列(以下「ショートカット」) です。
(文字数は任意ですが、ここでは8文字を例にしています)

例えば、フィルタ「|http://ad.*」の場合、Adblock Plus は「http://a」「ttp://ad」「tp: //ad.」の中から最適なショートカットを取得します。
ただし、
  • もともと8文字未満のフィルタ
  • ワイルドカードを用いて文字列が8文字未満に分断されているフィルタ
  • 正規表現で書かれたフィルタ
からは、ショートカットを取得することができません。

すべてのショートカットは検索テーブルに格納され、アドレスを処理する際、Adblock Plus はショートカットを元に、非常に効率的にマッチングすべきフィルタを見つけることができます。
(これは非常に高速で、格納されているショートカットの数に依存しません)
ショートカットがマッチしたときだけ、正規表現によるマッチングが行われます。
しかし、ショートカットのないフィルタは個別にマッチングするしかなく、その分、低速になります。

要約すると:

高速なフィルタを書くにはどうすればよいでしょうか?
  • 正規表現のフィルタはできるだけ少なくする。
  • フィルタには8文字以上(* 等の特殊な意味を持つ文字を含まない)の連続した文字列を含める。
  • 8文字未満のフィルタは正規表現と同等に低速。
  • フィルタ(訳注: 8文字以上であることが前提と思われます)は、いくつあっても処理にかかる時間は同じ。
  • 1つの正規表現を置き換えるために 20 のシンプルなフィルタ(訳注: 同上)を書かなければならないとしても、それをすることで高速化できます。
翻訳は以上です。
かなりの意訳ですが、意味は変わっていないと思います。

要素非表示(非表示フィルタ)

上記はブロックフィルタに関する内容で、要素非表示(非表示フィルタ)については、
Element hiding rules are translated into CSS and applied to all web pages the user is visiting.
要素非表示の指定はCSSに変換され、ユーザーが閲覧するすべてのページに適用されます。
とのこと。

基本的な書き方

前後しますが、基本的な書き方は、 を参照して把握しておく必要があります。
ただし、Muses Factory さんが翻訳された当時から更新されている内容もあるため、新しい部分を公式サイトの「Writing Adblock Plus filters」(Adblock Plus フィルタの書き方)から抜粋して要約します。

Writing Adblock Plus filters 抜粋

前方一致の拡張

http://example.com/banner.gif
https://example.com/banner.gif
http://www.example.com/banner.gif
上記すべてをブロックしたい場合は、
||example.com/banner.gif」と書けます。このとき、以下のアドレスはブロックしません。
http://badexample.com/banner.gif
http://gooddomain.example/analyze?http://example.com/banner.gif
つまり、「||」は前方のドメイン名にマッチします。(要 Adblock Plus 1.1以上)

セパレータ文字

http://example.com/ と http://example.com:8000/ はブロックしたいけど、
http://example.com.ar/ はブロックしたくないとき、
セパレータ文字「^」を使用して、
http://example.com^」と書けます。(要 Adblock Plus 1.1以上)

セパレータ文字は、「-」や「%」といった単純な文字や桁ではなく、アドレスの終わりにもマッチします。
次のアドレスの太字部分は、すべてセパレータ文字として認識されます。

http://example.com:8000/foo.bar?a=12&b=%D1%82%D0%B5%D1%81%D1%82

このアドレスをブロックするには、
「^example.com^」
「^%D1%82%D0%B5%D1%81%D1%82^」
「^foo.bar^」
等と書けます。

フィルタオプション

document (タイプオプション)

このタイプオプションはホワイトリスト(例外指定:@@ から始まるフィルタ)のみで有効です。
このタイプオプションを指定すると、表示するページのアドレスがフィルタに一致した場合、そのページが要求するすべてのリソースをホワイトリスト対象とします。
(このタイプオプションがない場合、フィルタに一致したリソースのみがホワイトリスト対象となります)

third-party

third-party オプションを指定すると、閲覧中のページと異なる origin への要求のみブロックします。
~third-party オプションを指定すると、閲覧中のページと同じ origin への要求のみブロックします。

origin は「パス配下」という意味だと思います。たぶん。
フィルタ「hoge.jpg$third-party」を指定していて、
閲覧中のページが「http://example.com/foo/index.html」の場合、
http://example.com/foo/hoge.jpg
http://example.com/foo/image/hoge.jpg
等はブロックされませんが、
http://example.com/hoge.jpg
http://example.com/jpeg/hoge.jpg
http://other.net/foo/img/hoge.jpg
等はブロックされます。たぶん。

domain

フィルタを適用するドメインを指定できます。「|」で複数指定も可能。
「$domain=example.com|example.net」等。
「~」を付加すると not 指定。
「$domain=example.com|~foo.example.com」とすると foo.example.com 以外の example.com にフィルタを適用します。

簡易的な非表示フィルタの書き方

Muses Factory さんのページでは「属性セレクタによる要素非表示」という見出しになっている部分です。
domain#div(class=foo)」等の「#」が1個のパターン。

これは下位互換のためだけにサポートされている書き方で、将来的に削除される予定とのことです。
代わりに、「domain##div.foo」等の「#」が2個のパターン(CSSセレクタによる書式)を使います。

まとめ

情報を総合すると、フィルタの高速化 Tips として以下の推測もできるのではないでしょうか。
  • 8文字未満のフィルタが複数ある場合、(可能なら)正規表現で1つにまとめた方が速くなる。
  • 「hoge$domain=example.com」より、||example.com^*hoge」の方が速くなる。
  • 「hoge$domain=example.com|example.netより、「||example.com^*hoge」「||example.net^*hoge」と 2つに分けた方が速くなる。
    (ただし、hoge の部分が8文字以上なら、分けても分けなくても同じ)

最後に

用語についてですが、フィルタには大きく分けて2つの種類があります。
1つは対象のダウンロード自体をブロックするフィルタ(英語では単に filter)、
もう1つは対象の要素を非表示にするフィルタ(英語では element hiding)です。

一部のサイトでは、前者のフィルタを「適用フィルタ」と称しておられます。
これはおそらく Adblock Plus の設定画面において、適用されているフィルタが「適用フィルタ」と表示されるためだと思いますが、フィルタの種類としては意味を成していません。
それぞれ「ブロックフィルタ」「非表示フィルタ」という用語をご提案いたします。
追記: 4/11
日本語の表記については、デベロップメントビルド:adblockplus-1.1.3+.2010030902.xpi において、
「ブロックフィルタ」「要素非表示フィルタ」となっていることを確認しました。
また、「適用ホワイトリスト」→「ホワイトリスト」、「フィルタ読み込み」→「同期フィルタ」とそれぞれ修正されています。
違和感がなくなって気持ちいいです(´Д`)
この記事の内容にはこじょ独自の解釈を多く含んでいる部分があり、必ずしも Adblock Plus の仕様に合致しているとは限りません。予めご了承をお願い致します。
誤りについてはご指摘いただけると嬉しいです。
この記事をツイツイする tweetSearch

Commentあなたのコメントをぜひ書き残してください!

ななしさん
日本語UIは去年devbuildで修正が入りましたね。
お試しあれ。
2010/04/11 Sun 05:59
こじょ
早速、試して結果を記事に追記しました。
情報ありがとうございました!
2010/04/11 Sun 13:14
新しいコメント

※設定しておくとあとからコメントを編集できます
管理者にだけ表示を許可する
※公開されません

Trackback あなたのウェブページをリンク!

Trackback URL

© こじょらぼ all rights reserved.

旧 すぐへこたれるこじょblog

Guild Wars 2 © 2010-2014 ArenaNet, LLC. and NC Interactive, LLC. All rights reserved. Guild Wars, Guild Wars 2, ArenaNet, NCSOFT, the Interlocking NC Logo, and all associated logos and designs are trademarks or registered trademarks of NCSOFT Corporation. All other trademarks are the property of their respective owners.

Back to Top