sside.net

Safari Content-Blocking Rules Reference 日本語訳

modified: 2018-10-03

この文書について

これはdeveloper.apple.com内にあるSafari Content-Blocking Rules Referenceを日本語に翻訳したものです。原文著作者の許諾は受けていません。権利者からの申し出があった場合、この文書は削除などの対応を行うことがあります。

翻訳にあたって、原文は尊重しますが完全な翻訳を保証するものではありません。誤読、誤訳があることを理解してください。

Introduction to Safari Content-Blocking Rules (はじめに、Safariでのコンテントブロッキングルールについて)

コンテントブロッカーApp拡張は、SafariとSafari Viewコントローラにおける、コンテンツの取り扱いをカスタマイズします。拡張はSafariのリクエストから要素の不可視化、読み込みのブロック、Cookieの除去を行うことが出来ます。あなたのApp拡張で、どのようにSafariがコンテンツを操作するか、コンテントブロッキングルールを与えます。

コンテントブロッキングルールは、実際にブロッキングを行う際、拡張が提供するコードは事前に構造化フォーマットに変換されます。WebKitはルールセットを実行時効率を考慮したバイトコードに変換し、ページリクエストが生成されて実行される前のレイテンシ低減を行います。Safariは希望しないコンテントへのリクエストを行いません。不要なダウンロードを回避することで、Safariはメモリ消費を低減し、パフォーマンスを改善します。

macOS、iOS上のSafariではコンテントブロッキングルールのフォーマットは同一で、これはJSONオブジェクトの配列です。全てのルールはtrigger辞書とaction辞書を含みます。triggerは何に対してルールを適用するか、actionはマッチした対象があればSafariが何を行うかを指定します。

コンテントブロッキングルール作成は、まずWeb Inspectorを使ってWebページ上のリソースを調べます。ブロックしたい要素を見つけたら、続いてターゲットの要素のみにマッチするtriggerを作成し、actionで振る舞いを指定します。

あなたのApp拡張へのルール追加を容易にするために、Xcodeではcontent blockerテンプレートを提供します。XcodeでのApp拡張についてのドキュメントはApp Extension Programming Guideを参照してください。

Note: iOS版SafariへのコンテントブロッキングApp拡張は64bitデバイスへのみ提供可能です。

コンテントブロッキングについてより多くの情報が必要なら、WWDC 2015のSafari Extensibility: Content Blocking and Shared Linksセッションを視聴してください。

Creating Safari Content-Blocking Rules (Safariコンテントブロッキングルールの作成)

Safariコンテントブロッキングルールをリスト1で示しています。ルール辞書の最上層オブジェクトが配列になっていることが見て取れます。全てのルール辞書はtrigger辞書とaction辞書を含んでいます。

リスト1. コンテントブロッキングルールの配列

[
    {
        "trigger": {
            ...
        },
        "action": {
            ...
        }
    },
    {
        "trigger": {
            ...
        },
        "action": {
            ...
        }
    }
]

Creating a Trigger Dictionary (trigger辞書の作成)

trigger辞書には必ず、URLに対するマッチングを指定する uri-filter キーを含む必要があります。それ以外のキーはtriggerの動作を変更するオプションです。例を挙げると、特定のドメインでのみ動作させる、または特定のドメインでは動作を制限するなどです。

リスト2では画像とスタイルシートのリソースを対象にして、特定のドメインを除外したtriggerを示します。

リスト2. 画像とスタイルシートを対象にしたトリガ

"trigger": {
        "url-filter": ".*",
        "resource-type": ["image", "style-sheet"],
        "unless-domain": ["your-content-server.com", "trusted-content-server.com"]
}

使用可能なtriggerフィールドを以下に記します。

url-filter

このキーは文字列型に関連付けされています。このキーはtrigger辞書における唯一の必須項目です。値の文字列を使い、URLに対してマッチングを行います。マッチングは完全なURL、またはURL内に対するパターンに対して行います。

url-filterの文字列はJavaScriptの正規表現に対して厳密なサブセットを用います。正規表現のリストは表1に示します。JavaScriptの正規表現はパーサにおいてはサブセットに制限しています。サポートされない表現はパースエラーとなります。

表1. JavaScriptの正規表現でサポートしている機能

Syntax Description
.* ドットを含む任意の文字が0回以上登場する文字列とマッチします。このシンタックスを使うと全てのURLにマッチします。
. 任意の文字とマッチします。
\. 明示的にドット文字とマッチします。
[a-b] 指定した範囲のアルファベット文字とマッチします。
(abc) 指定した文字列グループとマッチします。
+ 直前の文字の1階以上の繰り返しにマッチします。
* 直前の文字の0回以上の繰り返しにマッチします。
? 直前の文字の0回、または1回の繰り返しにマッチします。

url-filter-is-case-sensitive

このキーはboolean型に関連付けされています。デフォルト値はfalseです。

if-domain または unless-domain

このキーは文字列型の配列に関連付けされています。文字列はURL内のドメイン名とマッチングを行います。if-domainフィールドはactionの処理をリスト内のドメインに制限します。unless-domainフィールドは、リスト内のドメインを除外します。特定のtrigger辞書はif-domainunless-domainの両方を含めることは出来ません。ドメイン名は小文字のASCII文字で指定する必要があります。non-ASCIIな文字はpunycodeでエンコードします。

[ * ]文字をドメイン名の前に指定することで、任意のサブドメインとドメイン名双方にマッチさせることが出来ます。例を挙げると、*.webkit.orgを指定した場合、bugs.webkit.orgwebkit.org双方にマッチします。

resource-type

このキーは文字列型の配列に関連付けされ、マッチさせたいリソースタイプを表します。指定しない場合は、全てのリソースタイプとマッチングを行います。この文字列はブラウザの解釈するリソースに対して指定され、必ずしもリソースの種類と一致するするわけではありません。例を挙げると、<img src="something.css">はimageと識別されます。resource-typeに指定できる値は以下になります。

  • document
  • image
  • style-sheet
  • script
  • font
  • raw (Any untyped load, such as XMLHttpRequest)
  • svg-document
  • media
  • popup

load-type

このキーは文字列型の配列に関連付けられています。指定できる2つの値のうち、どちらかしか指定できません。指定しない場合は、全てのload typesにマッチします。

  • first-party

このルールは表示中のページと同じスキーム、同じドメイン、同じポートのリソースに対してのみ働きます。

  • third-party

このルールは表示中のページと異なるドメインのリソースに対して働きます。

if-top-url or unless-top-url

このキーは文字列型の配列に関連付けられています。指定した文字列は表示中のURLとマッチングを行います。if-top-urlフィールドはURLパターンのリストでactionを行うURLの制限を行います。unless-top-urlはURLパターンのリストにマッチしないページをactionの対象にします。1つのtriggerにはif-top-urlunless-top-urlを同時に含めることは出来ません。URLの文字列は小文字のASCII文字で指定する必要があります。非ASCII文字はpunycodeでエンコードします。

Creating an Action Dictionary (action辞書の作成)

triggerがリソースに対してマッチしたとき、ブラウザは関連付けられたactionの実行をキューします。全てのtriggerが評価された後、順番にactionが実行されます。triggerがマッチしたとき、既にtriggerされたルールと同じ結果を齎すactionはスキップされます。これは、パフォーマンス上の要請からフィルタ作成者に対し、同じactionのフィルタはルールのグループ化を促すものです。例を挙げると、最初のルールがコンテントの読み込み、後続のルールがcookieのブロックである場合、等々、actionが異なればtriggerの評価は継続して行われます。

actionにおいては、2つのフィールドのみ定義されています。typeselectorです。type actionは必須です。もしtypecss-display-noneの場合selectorも必要です。それ以外ではselectorはオプショナルです。

actionフィールドのリストは以下になります。

type

typeフィールドは必須のフィールドです。以下のactionから一つ選択します。

  • block

ブラウザのエンジンに読み込みをブロックするリソース種別を伝えます。もしリソースがキャッシュ済みの場合、キャッシュの読み込みも無視します。

  • block-cookies

サーバへのリクエストを行う前に、ブラウザエンジンによりヘッダから全てのcookieを除きます。これはSafari自体のプライバシーポリシーより低順位に置かれ、プライバシーポリシーでブロックできるものを容認しないためのものです。このためblock-cookiesignore-previous-rulesを組み合わせたものは、プライバシーポリシーを上書きしません。

  • css-display-none

ページ上のCSSセレクタによって、要素を非表示にします。2つ目のactionフィールドselectorは非表示にする要素のリストを含みます。selectorにマッチした要素はdisplayプロパティnoneに設定され、非表示化されます。

  • ignore-previous-rules

以前にtriggerされたactionを機能しなくします。

  • make-https

httpでサーバにリクエストするURLをhttpsに書き換えます。明示的にポート指定(httpのデフォルトポート80以外)されたものと、http以外のプロトコルが指定されたリンクに対しては機能しません。

selector

セレクタのリストを定義する文字列です。この値はcss-display-none actionでのみ必須です。actionのtypeがcss-display-noneでない場合、selectorフィールドは無視されます。カンマ区切りで、独立したCSSセレクタを記述できます。Safari、WebKitでサポートされる全てのセレクタは、Safariコンテントブロッキングルールでもサポートされます。以下の表3で示すような、W3C Selectors Level 4 draftで定義された合体セレクタも、またサポートしています。

リスト3. 合体セレクタ(complex selectors)を用いて要素を非表示化する

"action": {
        "type": "css-display-none",
        "selector": "#newsletter, :matches(.main-page, .article) .news-overlay"
}

翻訳に際して & 最後に

個人的に必要なのでやりました。iOSなSafariのコンテンツブロッカのフォーマットと機能を把握したかった。ので個人的に翻訳して一通り訳し終わったらこのBlogにでも上げるかと思い、8割方終えた段階で平然と2か月以上放置していたのですが、明日就職の面接に行く際に「お前の英語レベルはどれくらいだ」というのがあり、元々「頑張ればドキュメントが読めるくらい(ドロップダウンリストに頑張ればというのはない)」とpaizaのプロファイルにも記載していたのに…というのはありましたが、いい機会なので残り2割を訳してここに置いておきます。

あと、当然誤訳がないとは1%も言う気はないので、誤訳を見つけた親切な人はTwitterあたりで教えてください。未許諾なので勝手に直します。

Writing Adblock Plus filters 日本語訳

この文書について

これはAdblock Plusのフィルタ記述ルールを記載したWriting Adblock Plus filtersを勝手に翻訳したものです。原文著作者の許諾は受けていません。権利者からの申し出があった場合、この文書は削除などの対応を行うことがあります。

翻訳にあたって、原文は尊重しますが日本語としての読みやすさを考慮して係り受けの入れ替えや原文と異なる表現を用いています。他、一部で訳注として原文の説明の不足していると思われる箇所に補足を行っています。

表記のブレに対処するため原文と異なる表現を用いています。原文でfilters等と表記されるフィルタ全体はフィルタと表記します。原文でfilter, rule等となっている1行に相当する個別のフィルタはフィルタルール、またはルールと表記します。Adblock Plusが行うフィルタリング処理についてはフィルタリング、マッチ、マッチングと表記します。これは原文と異なるものです。予め承知の上、必要があれば原文にあたってください。


訳文ここから

Writing Adblock Plus filters

現行バージョンのAdblock Plusでは、フィルタの最適化に複数の選択肢があります。この文書ではフィルタの機能と記述方法を説明し、最適化の選択肢について説明します。

Disclaimer: 記載されているサンプルのフィルタルールは、あくまで参考です。全く同じ内容を実際に使うフィルタに適用しないでください。

Introduction to Adblock Plus filters (Adblock Plusフィルタのイントロダクション)

頻繁にフィルタを作成しないユーザには、このセクションで説明するオプションで十分です。

Basic filter rules (基本的なフィルタのルール)

最も些細なフィルタルールは、勿論バナーのアドレスのブロックになるでしょう。しばしば、バナーのアドレスを開くたびに変更するページがあります。例を挙げると http://example.com/ads/banner123.gif123がランダムな数字になっているといったものです。バナーの完全なURLを指定しても、これはブロックできません。この場合はもっと一般化したフィルタルール、 http://example.com/ads/banner*.gif や、または http://example.com/ads/* のように記述する必要があります。

Note: ワイルドカードによって必要以上のURLをマッチさせないよう確認してください。 http://example.com/* のようなフィルタルールは全てのバナーを確実にブロックするでしょうが、同時にexample.com以下の全てをブロックしてしまい、その中にはあなたが閲覧しようとしたコンテンツも含まれてしまうでしょう。

Defining exception rules (除外ルールの定義)

時に、通常は問題なく機能している特定のフィルタルールが、必要なコンテンツまでブロックしてしまうことがあります。そのフィルタルールを削除したくないが、必要なコンテンツだけは表示したいことがあります。

そのような場合、除外ルール(訳注:日本ではよくホワイトリストとも呼ばれます)が機能するでしょう。除外ルールにマッチしたアドレスにはフィルタルールの適用を行いません。例を挙げると、 adv (訳注:広告コンテンツのディレクトリ名やファイル名ははadvertiseの”ad”や”adv”がよく使われる)と記述したフィルタルールが http://example.com/advice.html をブロックしてしまう場合です。除外ルール @@advice を追加すれば、既存のフィルタに変更を加えることなく目的のコンテンツを表示できます。除外ルールの記述はフィルタルールと変わりません。ワイルドカードや正規表現を用いることが出来ます。フィルタルールと除外ルールの区別は行頭に @@ があるか否かのみです。

除外ルールは上記以上のことが出来ます。$document オプションを指定した場合、ページ全体を除外ルールの対象にします。もし @@||example.com^$document という除外ルールがあった場合、example.com内でAdblock Plusは一切のブロックを行いません。

Matching at beginning/end of an address (アドレス冒頭と末尾のマッチングについて)

通常、Adblock Plusでは全てのフィルタルールを冒頭と末尾にワイルドカードが付いているものとして取り扱います。例を挙げると ad*ad* は同じ扱いになります。通常はこの振る舞いで問題はありませんが、冒頭のみ、または末尾のみにマッチさせたい場合があります。例を挙げると、全てのAdobe Flashコンテンツをブロックしたい場合に swf というフィルタルールを設定した場合、 http://example.com/swf/index.html もブロックされてしまいます。

この問題の解決法: アドレスの冒頭、または末尾に相当するパイプ文字( | )を追加します。例を挙げると swf|http://example.com/annoyingflash.swf にはマッチしますが http://example.com/swf/index.html にはマッチしません。他の例を挙げると |http://baddomain.example/http://baddomain.example/banner.gif にはマッチしますが http://gooddomain.example/analyze?http://baddomain.example にはマッチしません。

時折、一つのコンテンツではあるものの、プロトコルやサブドメインの異なる http://example.com/banner.gif https://example.com/banner.gif http://www.example.com/banner.gif の全てをブロックしたい場合があります。フィルタ冒頭にパイプ文字を2つ追加( || )すれば、フィルタ適用URLの冒頭がドメイン名になります。例を挙げると ||example.com/banner.gif は上記3つのURL全てにマッチしますが http://badexample.com/banner.gifhttp://gooddomain.example/analyze?http://example.com/banner.gif にはマッチしません。(この機能はAdblock Plus 1.1以上でのみ利用可能です)

Marking separator characters (セパレータ文字を対象にしたフィルタ)

しばしば、セパレータ文字を対象としたフィルタをの記述が必要になることがあります。例を挙げると http://example.com/ http://example.com:8000/ はブロックしたいが http://example.com.ar/ はブロックしたくない場合です。そのような場合キャレット文字( ^ )を使用して、一つのセパレータ文字にマッチさせることが出来ます。例を挙げると http://example.com^ (訳注:”^”文字が上記URLの”/”と”:”にマッチする)のようになります。(この機能はAdblock Plus 1.1以上でのみ利用可能です)

セパレータ文字は文字、数字、及び[_-.%]を除いた全ての1文字に相当します。URL末尾もセパレータ文字文字として取り扱われます。次の例ではセパレータ文字を赤くしています。http://example.com:8000/foo.bar?a=12&b=%D1%82%D0%B5%D1%81%D1%82 このURLをブロックするフィルタは ^example.com^^%D1%82%D0%B5%D1%81%D1%82^ または ^foo.bar^ です。

Comments (コメントの記載)

エクスクラメーションマーク文字( ! )で始まるフィルタルールはコメントとして評価されます。フィルタリスト上で表示はされますが、黒文字ではなくグレーで表示されます。Adblock Plusではブロックの際このルールを無視するので、予めコメントアウトしておけば安全に記述を行うことが出来ます。フィルタルールの上にコメントを記述することで、コメントの動作を説明することが出来ます。また、フィルタリスト冒頭にコメントを記載することで作成者の情報を記載することも出来ます。(大半のフィルタリスト作成者はそのようにしています)

Special comments (特殊なコメント)

特殊なコメントは、ダウンロードして利用するフィルタリストでのみ機能します。カスタムフィルタでは機能しません。特殊なコメントは数値、またはパラメータをフィルタリストに設定できます。

! Homepage: http://example.com/

このコメントはフィルタリストのホームページ等、Webページアドレスを指定できます。

! Title: FooList

このコメントはフィルタリストに対して所定のタイトルを設定します。このコメントがユーザに提供される場合、以後の変更は行えません。

! Expires: 5 days

このコメントでフィルタリストの更新間隔を指定します。設定できる値は日数(例: 5 days)、または時間(例: 8 hours)です。更新間隔は 1 hour から 14 days まで設定可能です。補足として、フィルタリストの更新は必ずこの間隔で行われるわけではありません。サーバ負荷を低減するため、実際の更新時間は幾つかの付加的な要素と僅かなランダム要素が加えられます。

! Checksum: OaopkIiiAl77sSHk/VAWDA

このコメントで不慮の改変からフィルタの破損に対処できます。例を挙げると、一部のファイヤウォールでは広告からユーザを保護するために */adnetwork/* といった文字列を改変することがあります。ユーザがダウンロードしたフィルタリストでは、このようなフィルタルールが ******とされてしまいます。Checksumコメントはこのようなシナリオからフィルタリストを保護します。Checksumを参照し、改変されたとみなされるフィルタリストは、Adblock Plusから無視されます。

Checksumの計算には、以下の手順を行ってください。

  • 既存の全てのChecksumコメントを削除します。
  • フィルタリストのテキストエンコーディングをUTF-8にします。
  • 全ての改行コードをUnixスタイルに設定します(\rは\nに置き換えます)。
  • 全ての空白行を削除します(全ての連続する\nシーケンスを一つの\nシーケンスで置き換えます)。
  • テキストからbase64エンコーディングのMD5 Checksumを計算したのち、末尾の = 文字を削除します。

Python言語のリファレンス実装としてvalidate a checksumadd a checksum to a file を用いることもできます。

! Redirect: http://example.com/list.txt

このコメントは、フィルタリストのURLが変更になった場合、新しいURLを示します。Adblock Plusはこのコメント以降のファイル内容を無視し、即座に新しいURLのフィルタリストをダウンロード試行します。新しいURLからのダウンロードが成功した場合、フィルタリストは更新されます。このコメントは、現在のフィルタリストURLと一致した場合無視され、これは”正規の”フィルタリストURLであると強制していることを意味します。

! Version: 1234

このコメントはフィルタリストのバージョンナンバーを数値で定義します。このバージョンナンバーはissue reportに表示され、現在のバージョンに対するレポートの検証に用いることが出来ます。

Advanced features (高度な機能)

このセクションで説明する機能は、通常はパワーユーザーかフィルタリストの作成者のみ使用します。読み飛ばしても問題ありません。

Specifying filter options (オプションの指定)

Adblock Plus ではフィルタルールの動作を変更するため、複数のオプションを指定できます。オプションはフィルタルール末尾にダラーサイン文字( $ )で指定した後、コンマ( , )で区切ることで複数指定が出来ます。例を挙げると

*/ads/*$script,match-case

では、フィルタルール */ads/* にオプションとして scriptmatch-case が指定されています。現在サポートされているオプションは

  • Type options(要素種別のオプション): ブロック(または除外ルールで許可)する要素の種別を指定します。複数のtype optionを設定することで、マッチさせたい要素の種類を示します。指定できる要素は以下の種類です。
    • script — HTMLのscriptタグで指定された外部スクリプト
    • image — 普通の画像、通常はHTMLのimgタグで読み込みが行われる
    • stylesheet — 外部CSSスタイルシートファイル
    • object — ブラウザプラグインでハンドルされるコンテンツ、例: Adobe FlashやJava
    • xmlhttprequest — XMLHttpRequest objectやfetch() APIが開始するリクエスト
    • object-subrequest — プラグインから開始されるリクエスト、例: Adobe Flash
    • subdocument — 埋め込みページ、通常はHTML frameに含まれる
    • ping — <a ping>かnavigator.sendBeacon()から開始されるリクエスト(Adblock Plus 2.7.1以上が必要)
    • websocket — WebSocket Objectから開始されるリクエスト(Adblock Plus 2.8以上が必要)
    • webrtc — RTCPeerConnectionインスタンスから開かれたICEサーバへのリクエスト(Adblock Plus for Chrome or Opera 1.13.3以上が必要、Adblock Plus for Firefox or Safariでは未サポート)
    • document — ページ自身(除外ルールのみページに適用できる)
    • elemhide — 除外ルールでのみ使用可、documentと同様だが要素不可視化のみをフィルタルールから無効化する(Adblock Plus 1.2以上が必要)
    • generichide — 除外ルールでのみ使用可、elemhideに近いが、generic要素(訳注:generic要素は後述のGeneric / Specific filtersセクションで説明)のみをフィルタルールから無効化する(Adblock Plus 2.6.12以上が必要)
    • genericblock — 除外ルールでのみ使用可、generichideに近いが、generic要素のブロックのみを無効化する(Adblock Plus 2.6.12以上が必要)
    • popup — ページから開かれる新しいタブ、または新しいウィンドウ
    • other — 上記リストに含まないtypeのリクエスト全て

type optionでは、background、xbl、dtdは今後サポートされません。

  • Inverse type options(type指定の反転): オプションの前にチルダ文字( ~ )を追加することで、フィルタルールのマッチを行わない要素のtypeを指定します。指定できるtype option: ~script, ~image, ~stylesheet, ~object, ~xmlhttprequest, ~object-subrequest, ~subdocument, ~document, ~elemhide, ~other
  • Restriction to third-party/first-party requests(third-party/first-partyリクエストの制限): third-party オプションが有効な場合、閲覧中のページとorigin(訳注:通常は別のドメイン、参考: 同一オリジンポリシー – Web セキュリティ | MDN)が異なるリクエストにのみフィルタルールがマッチします。同様に ~third-party オプションは閲覧中ページと同じoriginへのリクエストにのみマッチします。
  • Domain restrictions(ドメイン制限): domain=example.com オプションは example.com ドメインのページでのみ適用されます。パイプ文字( | )を使った複数ドメインの指定: domain=example.com|example.net オプションは example.comexample.net 内のページにのみフィルタルールを適用させます。ドメイン名の前にチルダ文字( ~ )を追加した場合、そのドメインではフィルタルールのマッチを行いません。例を挙げると domain=~example.comexample.com を除くあらゆるドメイン内のページでマッチングを行います。また domain=example.com|~foo.example.comexample.com ドメイン内のページに適用されますが、サブドメイン **foo.example.com**のみ無効になります。
  • Sitekey restrictions(Sitekey制限): sitekey=abcdsitekeydcba はページから提供される公開鍵と署名がフィルタルールオプションで指定した公開鍵と一致した場合にマッチングを行います(ただし末尾の=文字は取り除く)。パイプ文字( | )を使った複数の指定: sitekey=abcdsitekeydcba|bcdesitekeyedcb はSitekeyが abcdsitekeydcbabcdesitekeyedcb のいずれかにマッチした場合にマッチングを行います。これはdomain restrictionと似ていますが、単一のフィルタルールがあまりに多くのドメインにマッチしてしまうシナリオに対応します。補足としてSitekey制限はサーバーサイドでの変更が必要です(訳注: 後述のImplementing a sitekey on the serverセクションで説明)。
  • match-case — フィルタルールのマッチングで大文字と小文字を区別します。例を挙げると */BannerAd.gif$match-case フィルタルールは http://example.com/BannerAd.gif をブロックしますが http://example.com/bannerad.gif はブロックしません。
  • collapse — このオプションはglobalな”Hide placeholders of blocked elements(内部的なブロック、不可視要素のプレースホルダ)”をオーバーライドして、マッチする要素に対して必ずフィルタルールを適用させます。同様に ~collapse オプションを指定すると、マッチする要素やリクエストは必ず保持されます。
  • donottrack — このオプションを適用した、除外ルールにマッチしない、任意のアドレスを指定したフィルタルールがマッチした場合Do-Not-Trackヘッダ(訳注: ユーザによるWebページに対してのユーザトラッキング拒否表明。HTTPリクエストヘッダにDNTパラメータを挿入。 参考: トラッキング拒否機能を有効化するには | Firefox ヘルプ)を送信します。

Using regular expressions

マッチングに際してより詳細な指定を行いたい場合は、正規表現を使うことが出来ます。例を挙げると /banner\d+/banner123banner321 にマッチしますが banners にはマッチしません。記述方法は正規表現 – JavaScript | MDN(訳注: 原文ではMDNの英語アーティクルへのリンク)を参照してください。

Note: パフォーマンス面の事由により、代替手段がない限りは正規表現の使用は推奨しません。

Element hiding (要素の非表示)

Basic rules (基本的なルール)

幾つかのWebページでは、広告がページ内要素にテキストで埋め込まれているなど、ブロックが出来ない場合があります。このようなものです。

<div class="textad">
Cheapest tofu, only here and now!
</div>
<div id="sponsorad">
Really cheap tofu, click here!
</div>
<textad>
Only here you get the best tofu!
</textad>

広告を除いてWebページをダウンロードすることはできません。このような場合は広告を表示しないようにするしかありません。要素の非表示はこのためにあります。

最初の広告はclass属性が”textad”の要素内にあります。これに対応するルールは、任意の要素を対象にすると ##.textad です。## マークは要素非表示ルールとなり、selectorでマッチする全ての要素が非表示になります。2つ目の広告はid属性が指定されていますが、同様に ###sponsorad と指定することで非表示にできます。また、要素名でも指定が出来ます。例を挙げると、3つ目の広告は ##textad で非表示にできます。

Element Hiding Helper extension(訳注: 2017/11/30現在、Firefox 57以降ではXPIを用いたextensionが使えないため使用できない)を使えば、HTMLソースを見なくても正しい要素の選択と、該当するルールの記述が出来ます。ただし、基本的なHTMLの知識は役に立つものです。

Note: 要素の非表示は通常のフィルタルールととても挙動が異なります。ワイルドカードは要素の非表示ではサポートされていません。

Limiting rules to certain domains (ルールの適用先ドメインを制限する)

特定のサイトで広告の要素を非表示にしても、他のサイトでは適用したくないことがあります。そのような場合は適用先の制限が行えます。例を挙げると、##.sponsor は幾つかのサイトで必要な要素を非表示してしまいます。このような場合は example.com##.sponsor を指定することで http://example.com/http://something.example.com/ 内のページで要素を非表示にできます。http://example.org/ では広告が表示されてしまいますが、コンマ( , )で区切ることで複数ドメインの指定が出来ます。例を挙げると domain1.example,domain2.example,domain3.example##.sponsor になります。

ドメイン名の前にチルダ文字( ~ )を追加することで、指定したドメインのみ非表示を行わないこともできます(Adblock Plus 1.1以上が必要)。例を挙げると**~example.com##.sponsor** は、任意のドメインでマッチングを行いますが example.com でのみマッチングを行いません。example.com,~foo.example.com##.sponsor フィルタルールは example.com ドメインには適用されますが foo.example.com サブドメインには適用されません。

Note: 要素非表示ルールの記述にあたっては、完全なドメイン名が必要です。ドメイン名の一部のみの指定は行えません。domain.example,domain.testdomain で置き換えることは出来ません。

Note: ドメイン名を指定した要素非表示ルールは、ブラウザのUI要素を非表示にもできます。例を挙げると browser##menuitem#javascriptConsole は、FirefoxのツールメニューからJavaScriptコンソールを非表示にします。

Attribute selectors (属性セレクタ)

幾つかの広告は非表示にすることが難しいものがあります。ページ内に埋め込まれたテキストで、classやid属性に値がないものなどです。属性の値を使うことでこれらを非表示に出来ます。例を挙げると ##table[width="80%"] はwidth属性が80%に設定されたtable要素を非表示にします。属性の値の一部を指定する場合は ##div[title*="adv"] と記述すればtitle属性に”adv”を含む全てのdiv要素を非表示に出来ます。また、値の冒頭と末尾を指定することもできます。例を挙げると ##div[title^="adv"][title$="ert"] は、title属性が”adv”で始まり”ert”で終わるdiv要素にマッチします。見ての通り複数の条件が指定できます — table[width="80%"][bgcolor="white"] はwidth属性が”80%”でbgcolor属性が”white”のtable要素にマッチします。

Advanced selectors (高度なセレクタ)

要素非表示にでは、FirefoxでサポートされているCSS selectorは概ね使用することが出来ます。例を挙げると、class属性が”adheader”のdiv要素の全ての子要素は ##.adheader + * で指定出来ます。完全なリストはW3C CSS specificationです(Note: Firefoxはまだ全てのselectorをサポートしていません)(訳注: 原文では2011-12年ごろの古いFirefoxについて言及している)。これらのselectorはclassかid属性のみを指定する場合に比べて、ブラウザの動作を遅くすることを意識してください。

Note: この機能は高度なユーザだけが使用してください。CSS selectorをすることで快適にルールの記述が出来ますが、Adblock Plusはselectorのシンタックスをチェックしません。もし謝ったCSSシンタックスが記述された場合、他の(正常な)ルールが破壊されることがあります。JavaScriptコンソールのCSS errorsを確認してください。

Extended CSS selectors (Adblock Plus specific) (拡張CSSセレクタ(一部のAdblock Plusのみ))

標準のCSS selectorでは広告の非表示に不足する場合があります。このようなケースに対して幾つかのselectorを追加しています。selector名は :-abp-has():-abp-properties() です(Adblock Plus 1.13.3 for Chrome and Opera以上が必要です)。

要素非表示ルールの記述にあたって、拡張selectorを使用する場合は #?#
シンタックスを使う必要があります。例を挙げると example.com#?#selector となります。ただし、重要な補足として拡張selectorの使用はパフォーマンスに影響を及ぼします。記述の際は可能な限り控え目で、特定の少数のドメイン、少数の要素に対してのみ指定するようにしてください。

:-abp-properties()

:-abp-properties(properties) はstylesheetのプロパティから要素を指定します。例を挙げると :-abp-properties(width:300px;height:250px;) はstylesheet内で指定された特定のCSS ruleでwidthプロパティとheightプロパティがそれぞれ300px、250pxとなっている要素を選択します。プロパティ名はcase-sensitive(大文字と小文字を区別)でマッチします。更に :-abp-properties(width:*px;height:250px;) の様に、ワイルドカードの使用が出来、この場合は任意のwidthと250pxのheightが指定された要素にマッチします。

正規表現(訳注: 原文ではMDNの英語アーティクルもスラッシュ文字( / )で囲むことで使用できます。例を挙げると :-abp-properties(/width:30[2-8]px;height:250px;/) はwidthが302pxから308px、heightが250pxの要素にマッチします。

Note: CSSプロパティに対するThe older syntaxルールは非推奨です。自動的に新しいフォーマットに変換されます。styleプロパティに対するselectorの挙動は以前と同一です。例を挙げると [-abp-properties='width:300px;height:250px;']:-abp-properties(width:300px;height:250px;) に変換されます。

:-abp-has()

:-abp-has(selector) はコンテンツ内から要素を選択します。例を挙げると :-abp-has(> div > a.advertiser) は直下にclass属性が”advertizer”のa要素を含むdiv要素の、親要素になります。内部selectorは要素スコープに対して相対的に参照を行うため、pseudo-selecror(疑似クラスselector)のみが使用可能で、選択の実行如何もスコープに準じます。

Exception rules (除外ルール)

除外ルールを用いることで、特定のドメインで要素非表示ルールを無効にできます。他のフィルタリストで指定されたルールに影響を受けないため、公開フィルタリスト作成者に有益な機能です。例を挙げると ##.textadexample.com ドメインのみ除外ルールを指定したい場合は example.com#@#.textad です。この”#@#”シンタックスを用いた2つのルールは、単一のルール ~example.com##.textad と丁度同じ効果になります。除外ルールは他の要素非表示ルールが過度な指定をしていた場合に対処できない場合に限り、必要なドメインにのみ限定して指定することを推奨します。除外ルールはAdvanced selectorの疑似要素selectorに対応します。

Generic / Specific filters

$generichide と $genericblock オプションを指定した場合、ルールはgenericとspecificで重要性が区別されます。

フィルタルールでドメインが指定されているか、またはSitekeyが指定されてサーバーレスポンスとのマッチングが成功したフィルタルールは”specific”に分類されます。ドメインが指定されず(または除外ルールでのみドメインを指定している)、Sitekeyがないフィルタルールは”generic”に分類されます。例を挙げると example.com##.textad はspecificですが ##.textad~example.com##.textad はgenericです。

Note: ブロックフィルタルールで $domain オプションで指定した場合、specificと評価されます。例を挙げると ||example.com^ はgenericですが、一方で */ads/*$domain=example.com はsite-specificと評価されます。

Implementing a sitekey on the server

Sitekey restrictionなフィルタルールを適用する場合、Adblock Plusが検証可能な、base64でエンコードされた鍵と署名をWebページから受け取る必要があります。現状では、HTTPレスポンスヘッダ(X-Adblock-Key: abcdpublickeydcba_abcdsignaturedcba)とドキュメントルート(<html data-adblockkey="abcdpublickeydcba_abcdsignaturedcba">)双方に含める必要があります。

最初にRSAプライベート鍵を作成する必要があります(転送量を抑えるには512bit長が望ましいでしょう)、続いて公開鍵のDERを作成します。

署名の作成に必要なデータは変数リストを連結したものになります(URI、ホスト名、User Agent)。それぞれの変数はヌル文字( \0 )で連結します。例は以下になります。

/index.html?q=foo\0www.example.com\0Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0

最後に、SEC_OID_ISO_SHA_WITH_RSA_SIGNATUREアルゴリズム(OpenSSLのデフォルト)を使って署名を生成します。

訳文ここまで


翻訳に際して

個人的にAdblock Plus Filterについて調べることにしたので、ついでに全文翻訳しました。要素スコープや署名周りは全然知らない上、個人的に必要がなかったので間違っている可能性が高いです。

訳すに際して全文通しで読みましたが、セクション毎に書かれた時期がバラバラで、Firefoxだけを考慮して記載されている時期のものと、ChromeやSafari向けの記述がされている時期で仕様についての説明に一貫性がなかったりしました。仮にChrome向けAdd-onにフィルタ書こうと思って読んだら、CSSセレクタはFirefoxの実装に依存するとか書いてあると普通は面喰うでしょう。その上で、訳すにあたっては原文に沿っています。

この文書、翻訳については既にやられてる方がおられるんですが、フィルタを書く人の目線で平易になるように内容が一部書き換えられているのと、翻訳時期が2011年ということか、翻訳されてないセクションが幾つかあったので、改めてやった次第です。フィルタ作りたい人は先人の翻訳の方が読みやすいですよ。

参考、にしなかったけど役に立つ資料

最後に

間違いを見つけたら方はTwitterで@ssideまでお伝えください。直します。

GeForce Experienceとgeforce.comで始めるPCゲームTweaking

modified: 2017-11-22

皆さん、PCゲームやってますか。まあここを見るような向きはそりゃあやってるんでしょうけど、今回はPCゲーミングの楽しみの一つ、tweakの話をします。

ゲームコンソールと比べたPCのメリットといえば、性能が青天井なことですが、大抵のPCゲームではそのパフォーマンスを

  • レンダリング解像度の拡大
  • フレームレートの増加
  • 描画品質の改善
  • より強力なグラフィックスエフェクト

等がユーザーの好みで改善可能です。144Hzディスプレイ使ってるからグラフィックスクオリティ下げてでもフレームレート上げたいとか、フレームレートは45fps程度でいいのでとにかく表示されるグラフィックスがリッチになればいいとか、クオリティはコンソール並みでいいけれどオブジェクトのポップインだけは許せねえとか、コンソールだと諦めないといけないゲーム体験を設定次第で改善することが出来ます。

最近だとコンソールとPCでマルチプラットフォームなゲームも山ほど出てますが、PCでプレイするのが一番良い体験を得られるゲームが多いです。例えばFar Cry 3だとPC版のみ車のフロントガラス汚れがライティングされたり、Watch_Dogs 2だとサンフランシスコ名物の霧エフェクトが有効にできたりします。一方でPC版は外注による開発と並行した移植が行われて、クオリティも下がったSaints Row 2(絶望的な低フレームレート)やArkham Knight(コンソール版にあるエフェクトがない)、最近だとNieR: Automata(フルスクリーンにすらできない)みたいなのもあるので一概には言えないんですが、それはさておき。

Watch_Dogs 2の”サンフランシスコの霧(geforce.comのインタラクティブ比較)“。ちなみに有効にするとフレームレートが30%以上下がる。(引用元: geforce.com)

ただ、PCでゲームやってても「どの設定変えたらどこの描写が変わるのか分からん」「設定は起動時の自動設定のまま」みたいな人は一杯いるそうですし、「誰もがアンタみたいに設定弄るのを楽しんでいるわけじゃない」と言われたこともあります。

ということで、今回はGeForceを使ってれば明示的に外さない限りドライバのパッケージに含まれているGeForce Experienceを使ったPCゲームtweakの方法です。

GeForce Experienceとは

GeForce ExperienceはGeForce Driverのインストール時に特にインストールするコンポーネントを選択しなければ、デフォルトでインストールされてます。Windowsのスタートメニューを見てみれば我が物顔でアイコンがいるはずです。

Version 1の頃は「PCゲームの設定とかいちいち面倒でしょ、nVIDIAでは無数のゲームに対してパフォーマンス指標持ってるから、目標のフレームレートを突っ込んだらいい感じに設定してやる」「nVIDIAのShieldタブレットにPCゲームの画面をリアルタイムで送信して、タブレットでPCゲームできるようにしてやる」というツールだったんですが、その後Xbox OneとかPlayStation 4とかが出て、コンソールで簡単にゲーム配信出来るようになったら追従するようにガンガン機能追加されて「Steamみたいなオーバーレイで簡単にゲームの録画、配信を出来るようにしてやる」「GeForce Driverの新しい奴が出たら勝手にダウンロードしておいてやる(インストールはユーザーが明示的にやる)」などが出来るようになったかと思うと、最近だと「Playerunknown’s BattlegroundでKill取ったりドン勝したら、直前の数分間の動画を勝手に保存しておいてやる」とか、訳の分からないことになっています。

GeForce Experienceでゲームをtweakする

とりあえずGeForce Experience起動直後の画面です。

2017-11-20
GeForce Experienceホーム画面。ゲームは”Program Files”以下、並びにOriginとかSteam、UplayやGOG Galaxyといったプラットフォームのライブラリも自動検出。

「詳細」を選ぶと、元々GeForce Experienceは自動最適化ツールなので、推奨される設定が表示されます。

2017-11-20 (1)
GeForce Experienceのゲーム詳細

「最適」設定がGeForce Experienceの推奨設定ですが、ここで「最適化」ボタンは押しません。この手の自動設定ツールにconfigファイルの書き換えを任せると、大抵碌なことが待っていません。想像するだけでも

  • ゲームの最新バージョンと異なるフォーマットの設定ファイルを書き込んで壊れる
  • GeForce Experience側で認識していない設定項目が壊れる
  • GeForce ExperienceがGeForce Control Panelのグローバル設定を勝手に変更する(DSR設定はGeForce Experienceから勝手に変更される)

等々の問題が生じる恐れがあるので、ここはここは大人しく各設定項目にマウスオーバーすると、上記スクリーンショットのように、実際のゲーム画面をイメージした画像に「この設定を変更するとこの部分のクオリティが変わる」旨が説明されるため、強化したいグラフィックス設定をここで確認しましょう。また、「この部分は下げても問題ねえな」というのもここで確認しておきましょう。

後は実際にゲームを起動し、オプションからグラフィックス設定を変更するだけですが、変更したグラフィックスオプションによって、フレームレートがダダ下がりしたら目も当てられません。GeForce Experienceにはゲームのフレームレート検出機能もあるので、事前にEnableにしておきましょう。

GeForce Experienceのフレームレート検出機能は、設定画面の「全般」「ゲーム内のオーバーレイ」を有効にした後、「Alt + Z」でオーバーレイを表示、設定画面から「HUDレイアウト」の「FPSカウンター」から有効にできます。

2017-11-20 (4)
GeForce Experienceのオーバーレイ。Alt + Zで表示。
2017-11-20 (5)
GeForce ExperienceのHUD設定。

後は、目的の設定を変更した後、どのくらいフレームレートが変動したかを見て、各自のプレイアブルだと感じるフレームレートが出ているかを確認してください。ゲームによってはベンチマークモードが付いているので、そちらでフレームレートを確認するのもアリです。ただし、ベンチマークモードは大抵の場合ベンチマークの範疇ではフレームレートが安定する上、ゲーム内のワーストケースより軽いことが多いので、ベンチマーク上のターゲットは、自分が遊ぶときに想定するフレームレートの15%くらい上(ある程度安定して60fpsが欲しいなら70fpsくらい)を狙った方が無難です。15%以上にヘッドルームを取る場合は、そもそもワーストケースは特定のシーンだけ普段の倍の描画負荷とかになることがあるため、ゲーム全体の体験とワーストケースのバランスを取って各自考えてください。

geforce.comのガイドでグラフィックス設定の効果と負荷を知る

さて、GeForce Experienceを使うとゲーム内のそれぞれの設定項目の意味が分かったとは思います。でも、その設定を変更した場合にどれくらいフレームレートが変動するのかは、実際に試さないと分からないのか?というのは尤もな話だと思います。GeForce Experienceの推奨設定では、デフォルトで40fpsをターゲットにした設定が推奨されるようになっています。ただ、それぞれの設定項目がどれだけフレームレートにインパクトを与えるかは分かりません。実際に変更してはフレームレート確認するのも、ゲームによっては再起動を要求されたりとあまり楽しい作業ではないでしょう(まあおれは何度も変更して確認してますが)。

ということで、nVIDIAもgeforce.comでグラフィックス設定の効果と、フレームレートの変動をガイドする記事を上げてくれています。流石に世の全てのゲームとはいきませんが、それでも年に数本は上がっているので、トレンドや設定項目の意味を知るには十分でしょう。

2016年から2017年でガイドが投稿されてるゲームは

と、デベロッパも使用しているゲームエンジンも多彩。これらの記事では「この設定を変更したらこれくらいフレームレートが変動する」「この設定を変更するとこのように描画結果が変わる」が分かりやすく記載されてます。また、グラフィックスエフェクトがどのようなことを行っているのかも簡易に説明されているため、重い処理か軽い処理かも分かってくるようになります。全部英語なのが難ですが、図表が充実しているので大体の意味は分かります。

実際に自分が遊んでるゲームのGuideがなくても、これらの記事を参考にしていれば「同じゲームエンジンだからAAの負荷は似たようなものだろう」「このエフェクトはこのくらいの負荷だろう」が予想できるようになります。もし、予想と外れていざ設定してみたら重かった場合は、その時初めて設定を見つめればいいので、トライアンドエラーの手間が圧倒的に変わります。

終わりに

おれ自身、コンソールでばっかりゲームをやってて、初めてPCでゲームやって魂消たのはPC版「セガラリー2」。これはネット対戦が楽しかった奴ですが、コンソールとPCでグラフィックスクオリティが目に見えて変わったゲームといえばTom Clancy’s Splinter Cell。コンソール版も相当だったんですが、PC版は別物のビジュアル。そもそもVGA解像度のコンソール(当時はXbox / PlayStation 2世代)と、その気になればUXGAも出せるPCでは格が違った。Need for Speed Underground 2もPC版だと60fps以上。

その後もXbox 360 / PlayStation 3世代だとArkham Asylumの(GeForceかPhysX搭載)PC版オンリーなPhysXエフェクトを使った物理エフェクトや、Far Cry 3の文字通り描画してる内容が違うビジュアル、リブートTomb RaiderのTress FX Hair髪表現等、コンソールとPCのマルチプラットフォームでも、単に「Steamで安く買える」とかではなく、PC版ならではの魅力というものがあります。

こういうと角が立ちますが、クリエイターの作り込んだ(勿論コンソール版も最大限に最適化されているけれど)ゲームの生に一番近い体験が出来るのもPC版なので、一度コンフィグのtweakと苦闘してみたり、「この設定はこんなに重いからコンソール版にはなかったのか」と思いを馳せてみたりしてみてください。

ところでGeForce ExperienceのないRadeonやIntel Iris Graphicsはどうすんの?

AMD選ぶ向きは覚悟して臨んでるんだろうから、各自頑張ってください。

IntelのiGPUでいいと思った向きは、そもそもがゲームなんてやろうとする時点で間違ってるので、さっさとGaming rig組んでください。