sside.net

Safari Content-Blocking Rules Reference 日本語訳

この文書について

これは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あたりで教えてください。未許諾なので勝手に直します。

Windowsでハイバネーション後、キーリピート間隔が初期設定に戻る問題について

ノートPCを持ち歩くとき、そんなに頻繁に開けたり閉めたりしないので、スリープの代わりにハイバネーションを使ってるんですが、これ復帰時にコントロールパネル > キーボードから設定してたキーリピート設定が、OSのデフォルトに置き換わるのな…。

症状自体は確かThinkPad X301でVista使ってた頃から存在してたし、その頃は「まあ仕方ねえか」で諦めてたんですが、Windows 10のこのご時世になっても全く直ってねえのには閉口する。

どうやって対処するんだよと軽く調べたら、世間では大体こんな感じの模様。

  • OSのキーリピートデフォルト値のレジストリを書き換える [HKEY_CURRENT_USER\Control Panel\Keyboard]
  • OSのアクセシビリティ設定でキーリピート間隔を設定する [HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response]
  • キーボード設定を更新してくれるユーティリティを常駐させる

んで、レジストリ書き換えてもいいんだけど、本来違う目的のアクセシビリティ設定変更するのもなんか抵抗あるなー、と思ったので別の方法調べてたら、Windowsには昔からmodeなるコマンドが存在しており、キーリピート間隔も普通にそこから設定できる模様。

mode con rate=32 delay=0

で、コントロールパネルのキーボード設定でリピートレートとリピート待ち時間を最速にしたのと同じ設定になる、というか設定できる段階数もキーボード設定と一致してる。実行後キーボード設定を開くと、値も書き換わってるので、実質的に同じ設定のCUI版っすね。

多分同じことで困ってる人もいるだろうから、ハイバネーション復帰時に実行させる場合は、上記に@echo off追加したうえで拡張子.batにして保存、タスクスケジューラで新規タスクを作成して以下の設定に。

  • 全般
    • ユーザーがログインしているときのみ実行
    • 表示しない(これ設定してもプロンプト出た気がするが、あんまり気にしてない)
  • トリガー
    • ワークステーション アンロック時
    • 特定のユーザ: 自分のアカウント
    • 停止するまでの時間: 30分(別に設定してもしなくてもいい)
  • 操作
    • プログラムの開始
    • プログラム/スクリプト
      • 保存した.batファイル
    • 開始
      • .batファイルの保存先のパスを指定しておく(不要かも知れないけど、ないと動かなかった)
  • 条件
    • 電源接続時のみ実行する類のオプションは外す
  • 設定
    • 既存のインスタンスの停止(別に設定しなくてもいい)

こんな感じでタスクを登録して、手動で設定して問題が起きなければ(実行結果はタスクスケジューラの表示のリフレッシュが必要)、実際にハイバネーションして適切にキーリピート間隔が設定されてるか確認したら終わり。

レジストリも弄らず、ノンプログラミングでできる対処法があるのに、何故か軽く検索しても日本語で紹介してる向きが見当たらなかったので、とりあえずエントリーに。にしても、同じ問題で困ってるケースってそんなにねえのかなあ。ハイバネーションが使われてないか、そもそもキーリピート間隔の設定とかそうそう弄られてないのか。

ノートPCを持ち歩く毎日

通勤時間が苦痛かつ、無為に思えて仕方ない最近。もう鈍行に乗ってでもせめて意味のある時間をとノートPC(Thinkpad X1 Yoga 2017。感想は使い込んだら書く)を買った。毎日、昼の休憩時間や帰りの鈍行電車でNetflix Appでダウンロードした陰気なドキュメンタリーを見たり、TypeScriptの書き方を調べたりしている。

ノートPCを持ち歩くのはかなり久しぶりで、そもそも持ち歩けるノートPC自体を購入するのが7年位ぶり。ノートPCの括りならSurface Bookがあったのだけど、アレを鞄に入れて満員電車に乗る勇気はおれにはなかった。

で、7年ぶりにノートPCを外で毎日使ってみると、7年前と全然違う。あの頃も外でノートPC使うときは携帯からテザリングしてインターネットには繋げていたし、ファイル同期もWindows Live Meshがあったので、今使っているWindows 10のOneDriveとさして変わりはない(というかOneDriveの前身がLive Mesh)。

勿論、ノートPCのメモリ容量だったり、ディスプレイの表示品質、解像度、インターネットへの通信速度など、Webブラウザの性能など、線形に改善している要素は確かに効いてます。ただ、それ以上に7年の間に世の中クラウド前提に変わってるんだなと。

ファイルを同期して、外での作業をシームレスに家のデスクトップで継続するロールモデルは7年前にもあったし、事実可能だったにもかかわらず、実際の体験として連続性が全然違う。かつては携帯とノートをUSBケーブル繋いでテザリングさせるか、家に帰ってからスリープ復帰させて同期スタートを待つ感じだったのが、今ではとりあえず無線LANで携帯とテザリングしておけば勝手に家のデスクトップにファイルは同期されてるし、オンラインサービスの利用状況もサービス側で保持しておいてくれる。家のマシンで作業を継続しようとしたら、そのまま作業を続けるか、精々更新されたファイルのリロードを行うかのプロンプトが出る程度。シームレスの質が全く異なる。

今挙げた事柄は、以前から出来たことなのは繰り返し述べていますが、iOSやAndroidの携帯電話が普及して、求められる作業継続性の質が明確に底上げされ、デバイス、場所を選ばず、どのサービス、ソフトウェアでも作業の続きができる、というのは本当に気持ちが良い。

ノートPC買うときは、毎回「これで外でもXXX(ゲームでもblog書きでもTwitterでもコード書きでも好きな奴を入れてください)が出来るぞ!」と思うんだけど、実際には「ファイル同期するのにノートPCのスリープ復帰させるの面倒だな」「ローカルに置いておいた必要なファイル、デスクトップにも持っていくの面倒だな」とかの理由で段々面倒になり、リビング用のごろ寝操作PCになり下がるのが毎回の流れだったのだけど、今回はちょっと継続して持ち歩くようになるかも、と思った。というかノートPCを持ち歩く合理性が生じる時代にようやくなったのではないでしょうか。

私的Game of the Year: 2017

2017年も終わりに近づいたので、今年やったゲームと良かったゲームの話を。

2017年以前に発売されたゲームを今年遊んだケースもありますが、今年発売されて今年プレイしたゲームのみ対象にしています。

今年プレイした今年発売されたゲーム

  • Gravity Daze 2 (PlayStation 4)
  • Giga Wrecher (PC)
  • Horizon Zero Dawn (PlayStation 4)
  • ゼルダの伝説 Breath of the Wild (Nintendo Switch)
  • NieR: Automata (PC)
  • Horizon Zero Dawn (PlayStation 4)
  • ARMS (Nintendo Switch)
  • Tom Clancy’s Ghost Recon: Wildlands (PlayStation 4)
  • What Remains of Edith Finch (PC)
  • Danger Zone (PC)
  • Nex Machina (PC)
  • Splatoon 2 (Nintendo Switch)
  • ドラゴンクエスト11 過ぎ去りし時を求めて (PlayStation 4)
  • Destiny 2 (PlayStation 4)
  • スーパーマリオオデッセイ (Nintendo Switch)
  • Middle Earth: Shadow of War (PC)
  • Need for Speed: Payback (PC)
  • DeathComing (PC)
  • Hearthstone: Jorney to Un’Goro (PC, Mobile)

素晴らしかったゲームたち

ゼルダの伝説 Breath of the Wild

ビデオゲームにとんでもない革命を齎した超傑作。普段”名作”って言葉は使わないようにしてるんですが、間違いのない、紛れもしない名作。

正直、パラセール手に入れるまでの序盤をプレイしてる間は「こんな風に押しつけがましいゲームが続くのか…?」と思っていたけれど、雪山で松明を使った温度管理を”自らの手で”発見した瞬間に「このゲーム全体に作用する法則がオープンワールド全体においてゲームプレイ体験としてデザインされるのであれば、とんでもないゲームなのではないか…?」と思わされ、始まりの大地をパラセールで飛び降りた5分後、それが全く間違いでないことを知って、本作が間違いなくゲーム史に残る名作なのだと確信を得た瞬間に「ビデオゲームを好きで、追いかけてきて本当に良かった」と、脳汁が出た。

全編に亘って緊張感のあるテンポのコントロール、(クリアを躊躇った勢は全員ゲームバランスの破壊に至るが)プレイヤーが自ら破壊せしめようとしない限り、手ごたえを持って応えてくれるバランス調整、そして何よりも周囲を360度見渡せば、常に興味を引くものどこかにある、オープンワールドゲーム史上類を見ないレベルデザイン。

装備のマネジメントに頭を悩ませ、唐突に脅してくる雷に金属装備を外す、遠方に見える敵をどう攻略するか物陰から伺う、崖を飛び降りて窮地を脱する、なんてことはない現象が適度なテンポで訪れて、そのすべてが楽しいなんて異常としか言いようがない。

インベントリの管理や、ゲーム進行の過剰な遅さ、または過剰な速さなんて弱点こそあれど、唯一無二のゲーム体験を押しつけがましくなく、プレイヤーの意思で掘り進めて行こうと思わされるゲームというのは、紛れもなくビデオゲームのあるべき姿。本作が最高の作品であるということは最近ビデオゲームの怠慢であると同時に、本作が生まれた結果ビデオゲームは間違いなく一歩上のステップに達したと言い張れる作品。

空恐ろしいのは今年最高といっていいナラティブ表現。エンディングは本当に震えた。エンディングのゼルダ姫のセリフも、ラストに映る姫しずかも、本作を相応に探索したプレイヤーにしか通じない表現。本作をどうプレイしてほしかったのかを伝えるとともに、ここまでプレイヤーを信じられるという自信の表れでもあるし、何よりも本作が為そうとした「プレイヤーが自らの意思で冒険、探索する」ことをこれ以上なく表現し、またこれまでのプレイに完全に報いてくれるシークエンスだった。

本作が最も空気読めてないのは、今年の賞レースとビデオゲームのイノベーション、ひいては2017年のビデオゲームを3月頭で終わらせたことですね。2017年を楽しみにする、というビデオゲーム趣味を早々に否定したことは、たとえSwitchのローンチがあったとしても本当に最悪の行為です。

NieR: Automata

同日(2017/3/3)発売がまさかの名作Breath of the Wildだったせいで500%くらい割を食った傑作。

皆2か月くらいゼルダやってたせいで当初は「廃墟ゲー」「尻が見える」みたいな文脈でしか語られず、それでプレイするわけねえだろという気分でした。実際にプレイしてみると想像以上どころか、今年を代表できる作品の一つだと言い切れる出来。

正直低予算作品(ただし国内作品の中ではビッグバジェットではある)的なポジションで、ゲームデザインやレベルデザインも使いまわしを前提にした周回プレイを前提に作られていたり、ストーリーも冷静に俯瞰すれば陳腐というか出来の悪い和アニメかよという感じだし、Windows版は発売から9か月経った2017年末の現在でもフルスクリーン化すら出来ない(予算の都合でパッチが出せない、有り難い有志MODを入れないとプレイすらままならない)有様ではあります。

ただ、本作にはそんな冷静な見方を正面から打ち破る表現の力があります。ジャスト回避のスローモーションの瞬間、砂漠に立った瞬間のBGM、ビジュアルノベルやSTGから借用したストーリー表現。前述の悪い事柄というのはたかがスレた見方で、表現で大事なものは表現そのものなのだという力強さ。

正直ベヨネッタやMetal Gear Rising Revengencetといったプラチナゲームズ作品の文脈はバリバリ強く感じはしますが、作り慣れた余裕が生んだ洗練というものも新規性や革新性と同じく貴ばれるべきなのだと体に理解させに来る作品です。

Gravity Daze 2

前作はコリジョンの引っ掛かりやレベルデザインの分かりにくさ、ストレスフルな収集要素(全部集めたと思ったらゲーム後半で収集物が追加される無体よ)、長いシーンロード、ダサいカットシーン、消化不良どころじゃない未完ストーリー、バランスの悪い能力ごとの強さ等々、色んな部分がアレでしたが「空を飛ぶ」体験においては最高に新しく、最高に気持ち良い作品だった。

さて、2になって前作の弱点は改善されたのか?というと、修正を試みながらも以前不満が残る出来。

能力周りは前作で無価値だった重力スローが異常に強くされたけれど今度は重力スローが強すぎ。カットシーンは前作と比べて格好良いカメラと演出が施されたが、相変わらずゲームプレイから分離していて冷めた気分に。シーンロードの長さはVita版と比べて若干良くなった気はすれど、相変わらずストレスフル。コリジョンは改善されたけれど相変わらず引っかかる。ストーリーは完結編を銘打っているので前作の消化不良感は減ったけれど、最終章がGravity Dazeのプレイ感じゃない…。

が、レベルデザインの改善は最高の一語。Gravity Dazeの「飛ぶ」「落ちる」「空に落ちる」が改善されたボス戦やイベントの演出と相まって前作以上に画になる、凄いことをしていると思わせてくれる改作の仕上がり。

本作の追加要素たるフォトモードが重要な役割を果たしているのは、単にシェアしてくれとかおれのようなフォトモード好きが喜ぶだけではなく、キャラクター同士の存在感や生活感、有形無形のやり取りや、もっと言えば最大の登場人物である町をもっと身近に感じさせようとする仕組みだろうし、最大限に機能してます。

もうGravity Dazeが出ないことは悲しいけれど、次も他にないゲームプレイを齎してくれる作品を楽しみに待ってます。

Hearthstone: Knights of the Frozen Throne

Hearthstone史上最もゲームプレイを刷新してくれた拡張。

兎に角デカいminionや強烈な効果のspellがバンバン出てきた上に、新要素のhero強化!なのにhero間のバランスは保った脅威の調整。それでいて旧拡張カードやclassicの存在感も失っていないので、現役プレイヤーは新環境に熱狂できるし、出戻り勢も振り落とされずに「こんなに変わったのか!」と驚愕できる。古いゲームデザインと新しいゲームデザイン、バランス調整が綺麗に機能した易々と真似できないどころか、たぶんBlizzard以外どこも作れない、ホットなデジタルTCG。

ですが、同時に今回の拡張がHearthstoneの終わりの始まるという感じも。いい加減カネを払わない客にBlizzardも愛想が尽きたのか、拡張パック > アドベンチャー > 拡張パックのリリースペースを、全て拡張パックに集約した上、legendaryカードを大量に増やした結果、古参ヘビープレイヤーもカードリソースが不足する事態に相成っています。

まあカードパックを現金で買えばいいだろうという話ではなく、現金投資でカードパックを購入しようが、以前としてカードが足りない状態が解消できないのはマジでヤバい感じです。これが続くとプレイヤーが離れてもおかしくないというか、次のKobolds and Catacombsでおれは心が折れました…。

What Remains of Edith Finch

もうblogに起こしてたのでそっちを参照してください。 : 間接的に行われる積極的な自殺 – What Remains of Edith Finch

補足として、何かを物語る手段としてビデオゲームなるメディアを使うという意味では、さよならを教えてに近い感想ではあります。さよならを教えては所謂ビジュアルノベル、アドベンチャーゲームとしてのエロゲーフォーマットで、スクリプトエンジンの枠内で行える表現を極めた作品でした。

残念だったゲーム

Middle Earth: Shadow of War

前作Shadow of Mordorは本当に楽しめたんですよ。景気よく首がバンバン飛ぶBatman Arkham Trilogyフォロワーとして。作品固有のアビリティや演出も良かった。Nemesis Systemもゲームを単調にしないのに役に立っていたけれど、まあ世間で評価されるほど素晴らしい仕組みか?というのはありました。そもそも殺しまくってるOrcの名前なんていちいち覚えてねえし。

で、続編のShadow of Warですが、前作から色々良くなってるんですよ。以下に挙げると

  • 単調になりがちだった小隊長の殺し方は、固有の弱点をリサーチして環境やアビリティを積極的に利用させるようになった。
  • 圧倒的な物量の投入。Orcの個性や砦の様変わりでプレイヤーごとに本当に個別の体験をさせるのは見事。
  • 装備の強化システム。線形的に強くなっていく前作と比べ、Orcの弱点や自身の戦略に合わせて敢えて低レベルな武器を使ったりと割と考えさせてくる。
  • Nemesis Systemの強化。プレイヤーとOrcや、OrcとOrc間の関係性が強化されている。
  • Orcのアクションが増えて個性豊かな殺し方をされる。

と、良くなった部分はちゃんと良くなりました。が、Nemesis Systemが前作で評価されすぎたのか、それとも続編としてNemesis Systemをもっと前面に出していくべきだと判断したのか、もしかしたら映画The Lord of the Ringsに繋げるために物語面はあまり盛れないなと判断したのか。兎にも角にもNemesis System一本鎗でゲームを進めようとするには無理があった。

その代償が余りにも単調な60時間超、全4章の体験でした。そもそもアビリティのアンロックが異常に遅く、そろそろ色々出来るようになってゲームのエンジンが温まってきたか、と感じるまで20時間掛かりますざっと第1章 – 第2章中盤くらいです。その後、前作譲りのテンション高いゲームプレイや物語の盛り上がりを遺憾なく楽しませてくれるのが第2章中盤 – 第3章のラストまでの20時間。そして最悪なのが第4章。

第4章「Shadow War」ですが、ストーリーは一切物語られることなく、延々と砦の取り合いが20時間超続きます。「何かが起こる」という体験を全てNemesis Systemに押し付けた強烈な意欲作ではあるんですが、やることといえばそれまでのキャンペーンの取り逃しの回収と、砦の防衛だけ。たまに突発的なNemesis Systemらしい事柄が起こるだけの体験を20時間繰り返すだけになります。「関係性に基づく動的なストーリーの発生」といえば聞こえは良いです。が、おれみたいに想像力の欠けた人間からすれば、特定のゲーム内状況に基づいたスクリプトベースのイベント発生でしかないので…。

前作が良かっただけに、本当に残念な作品でした。

Splatoon 2

前作の膠着気味というか、有利な膠着状態を作るのが勝ち筋だった基本的なゲームプレイを刷新しようとしたのは、続編としてやるべきことだったのは分かります。

マップの閲覧を制限したり、サイドや裏を取りやすくなったりしたのは、前作からの改善点としてやらなければならなかったことなんでしょう。

ただ、その結果として勝つために求められるものが、余りにもガチな方向に寄りすぎたんじゃねえのとは思います。ソロでフラッとプレイして気持ちよく終えられる程度のヌルさがなくなりました。マッチ結果が荒い、荒れるという意味ではCoDのKill Streakが批判されて弱体化を辿った歴史を思い出します。

ぶっちぎりで酷かったゲーム

ドラゴンクエスト11 過ぎ去りし時を求めて

最低の90時間だった。PS4版です。

  • 異常な量と回数のカットシーン
    • 20分に一回ゲームプレイが分断される
  • リニアで同じことを延々繰り返すゲームプレイ
    • 街 -> カットシーン -> 移動 -> カットシーン -> ダンジョン -> カットシーン -> ボス戦 -> カットシーン -> 街
    • 恐ろしいことに全編がこのループだけで進む
  • ボイスなし
    • 20時間近いカットシーン全編、3行しかないダイアログで延々メッセージを読まされる
  • 無数の透明壁
    • 最初の街で「屋根の上にも登れるよ」と教えてくるの、最悪という言葉でも足りない
      • 実際はほぼすべてのオブジェクトの一定より上の部分、登れそうだったりショートカット出来そうだったりする高低差全てに透明壁がセットされている
      • おそらくは3DS版と行ける範囲を同じくしようとしてるんだろうけど、そんな都合PS4版のプレイヤーが知るわけねえだろ
        • 3DS版とエンカウント周りとか別物にしてるのに、なんでそこをプアな方に合わせるんだよ
  • 2017年のUnreal Engine 4タイトルとは思えないグラフィックスクオリティ
    • 「今世代機ではこのような表現がリアルタイムで行えます」と謳われたフィーチャーが沢山!
      • Screen Space Reflection
      • Ambient Occulusion
      • Global Illumination
    • 総じて使い方が下品
      • The Divisionより下品
    • というか環境デザインが酷い
    • フィーチャーを紹介するために大抵ギラギラツヤツヤピカピカな感じになる、エンジンのDemoのがよっぽど上品
  • 雑な戦闘周り調整
    • 敵に1-2発殴られたら死ぬ調整
      • 味方側のbuff、debuffが無意味
        • 何も考えずに毎ターン殴りと回復を繰り返す

総じて「一本道で」「やることは大したことのない使い」「ゲームプレイを阻害するカットシーンを延々と見せられる」PS1 – PS2時代のJRPGが批判された要素の集合体です。

「好みは人それぞれだから、他人がそれを容れることを否定するな」とは世によくある言葉ですが、ドラクエの冠かぶせるだけでこれが大絶賛されて、ましてやこれのフォロワーが出てきたりしたら、また日本のビデオゲームが後退するじゃねえかという気持ちです。別にドラクエだけが旧態依然としたJRPGってわけじゃあないけれど、もう「龍退治はもう飽きた」から25年以上経っているというのに。

一応悪いところばかり論って、良いところの話をしないのもどうかと思うので最後に挙げておきます。

マジスロは絶対に遊技機の人がデザインしただろう、絶妙な塩梅の演出、テンポ、そして出玉感。ボーナスの払い出しが少なくて、そっから自力システムで伸ばせみたいなのは5.5号機的だけど、放出の仕組みは4号機ライクという、スロット好きなら面白さを感じさせる良い仕事でした。でもゲーム本編と殆ど関係ないんだよな…。

そして何よりも敵のモデリングとアニメーションは本当に凄い。鳥山デザインの納得感ある立体化のみならず「アングルによって2D時代のドラクエ的に見せる(戦闘モードをフリー移動から切り替えると分かる)」という離れ業まで見せたのは、唯一無二の仕事です。何故こんな作品で、ここまでの仕事が為されてしまったのか。

今年一番良かったゲーム

どれが良かったか挙げるなら、多分に漏れずゼルダ1択です。

2017年のビデオゲームというのは本当に不幸な年で、ゼルダが出た3月時点で「2017年のビデオゲームの進歩はこれ以上ねえな」と思わせたことで、残りの9か月が消化試合の気分に。事実ゼルダ以上のタイトルは出てこなかったし、下手したら来年も出てこないでしょう。

「いや別に2017年とか区切って、勝手に3月から暗澹とする必要ねえだろ」と思われるかもしれませんし、尤もです。が、割と信仰みたいな感じでビデオゲームの進歩に心惹かれているので、何というか年の後半は「まあとりあえずプレイしとくか」ってな気分になるのは、ちょっとテンション下がってました。

ゼルダは最高だけど、あの中毒性も含めて最悪の代物だと思います。期待と夢を膨らませていた2017年を返してくれ。

間接的に行われる積極的な自殺 – What Remains of Edith Finch

Giant SparrowのWhat Remains of Edith Finch、買っていたのに気が付かないまま今まで積んでました。いざプレイしてみたら素晴らしい出来。

ジャンルは所謂Walking Simulator。代々不幸に見舞われるFinch家最後の生き残り、Edithが一族の住んだ家に戻り、家族に何が起こったのかを調べていくゲーム。

過去を振り返るというゲームの背骨が全くブレないという意味では骨太。骨格として「コントローラ越しの手触り」があり、些細な「鍵を開ける」「本を開く/閉じる」「蝶番を開く」など、執拗に操作のインタラクティビティに拘っている。骨を囲む筋肉となる美術、音響、演出は隆々とした高水準。一部、ライティングやコリジョンの甘さはあるけれど、そもそもそういうゲームじゃないし、スタックしても大人しく再起動すればよし。

Finch一族はEdithを残して全員死んでいるので、過去を探るというのは「この家族はどのように死んだか」を知るストーリーに他ならないのだけれど、その見せ方がビデオゲームでしかできない表現。死ぬ前の家族をプレイヤーが操作して、プレイヤーが自ら死に向かうという代物。

操作するのは過去に死んでいるキャラクターなので、プレイヤーが出来ることも「結果的に死に向かう結末に向けてWalking Simulatorを進めること」だけ。リニアなゲーム進行を避けられないWalking Simulatorというフォーマットを、不可避な死と結び付けた手法は、単に「上手い」だけでない。その渦中でプレイヤーに生まれるのは「なぜおれは自らの手で死のうとしているのか」「このシーンを進めなければ死なないのに」「だが、なぜ死んだのか気になる」という葛藤で、既に死んだ未来を知るプレイヤー視点と、主人公Edithが過去の不幸を想像するプロセスが一致している。

兄Lewisのシーンは最高で、鮭の頭を切断する単調なライン作業を延々と右スティックでこなす一方で、左スティックで中世だかファンタジーの世界で英雄になっていく表現は、誰もが抱く空虚な現実と空想のギャップを表現することに加えて、一方通行のゲームプレイというゲームジャンルのハックによって、当代随一の残酷描写。

他にも2世代前のMollyやCalvinの死も、死に至る一方通行をプレイヤーが自らの手の延長で行っている。食べてはいけないものを食べる、ブランコで一回転するだけの勢いをつける、執拗なまでにコントローラを通じた手触りを強調した結果として「自らの手で死に至る」感覚を否が応に押し付けてくる。

挙句の果てに例のエンディング直前、新しい命が生まれる表現があそこまでに残酷だった作品があったかという話で。

正直、コントローラを通じたインタラクションであれば、昨年のINSIDEの方が優れているし、ビジュアルも基本的に静的なライティングの割には…という部分はあるし、ゲームプレイもどのボタンがどの操作に相当するかが分かりにくいとかがあるんですけど、それ以上にGiant SparrowはTelltaleみたいに「このジャンルで戦っていく」んだ、ということを示した作品だと思います。マジ傑作。

蛇足ですが、ローカライズのクオリティは時折首を傾げる程度で概ね良好なんですけど、邦題だけは許せない…!”フィンチ家の奇妙な屋敷でおきたこと”じゃねえだろう。原題は「Edith Finchに連なる者達」と「Edith Finchに何が起きたのか」のマルチミーニングで、本作のエンディングが完全に台無し。意味が通らなくなるくらいならわざわざ変えなくていいんだよ!原典に敬意を払わねえからマーケティングって真似が嫌われるんだよ。

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までお伝えください。直します。

blog作り直すときに今時のHTMLやCSS使った話

今回、Blogを再開するにあたって個人的に決めた事柄があったので残しておきます。今時Blogやる人もそうそう居ないでしょうが、ましてや自分でHTML書こうとなると面倒だしほぼ無意味ですが、こういう方針でやりましたということで。

テンプレート作るときの環境

PHP使えてWordPressの入力補完してくれるエディタやIDEねえかなーと思ってとりあえず色々入れてみました。試したのは以下。

  • Visual Studio Code
  • Aptana Studio
  • Visual Studio 2017 Community Edition
  • Sublime Text
  • Netbeans(PHP Edition)

結局どれもWordPressの入力補完は出来なかったんですが、NetbeansがPHPの入力補完や、IDEにWebサーバ含んでたり、FTPクライアント内蔵でCtrl + SするだけでWordPressのサーバ側に反映出来たりと素晴らしいIDEでした。他のエディタやIDEでも同様のことが出来るんでしょうが、圧倒的に簡単。

挙句にLESSも標準サポートしておりやっぱり保存するだけでCSSへの変換までやってくれるんですが、新しめのCSSプロパティに対応してないので警告が出まくるのは難ではありました。あとLESSの構文解釈がおかしいのか、補完や候補が出ないこともしばしば。とはいえ、これ一つで済むのは大きい。

やったこと

  • 基本的にラッパーDOMを使わないセマンティックなHTML
  • CSSはBEM記法に準ずる
  • 携帯電話でのレイアウトも作る

セマンティックなHTML

ラッパーDOM、WordPressの編集画面では要素にclassが指定できないので本文はDIVで囲んだのと、paddingしてるスペースもリンクにしたいのでaタグでli囲んだりしてますが、それ以外は意味の通るHTMLになってるはずです。どんな風になってるかはF12押して確認してください。あとHTML5で省略できる要素は基本的に省略しました。

WordPressのテンプレートは意味もなく自分で書きましたが、HTML側で見た目を考慮しないようにした結果、雛型のHTMLは早々に出来上がるし、テンプレートも簡潔に書けるようになりました。どのような要素を入れるのかだけを考えれば良いので、HTMLは汚れないし、とりあえず装飾するための骨組みがすぐに出来上がるのは良いところでした。

CSS書く際にもF12ツールでDOMの構造を容易に追えるようになるので、見た目のためのDOMは基本的に入れない方が結果的に作るの速くなりました。

CSSのBEM記法

当初はLESSとかSASS分からねえよとCSSべた書きして、今と同様のレイアウトが出来たんですが、メディアクエリ差し込んで携帯電話向けのレイアウト作る段になって「これは無理だな」と気付いたのでCSSで書いた分は放棄して、LESSにしました。

SASSじゃなくてLESSにしたのは、Ruby環境入れる気がなかったからです。あとはJavaScript風の記法の方が馴染みがあったので。

CSSのclass名は最初からBEM風に付けてましたが、LESS使うとネストがHTMLの構造と視覚的に一致するようになりました。CSS直書きで手付けネストするの本当に意味ねえ。結果的にどう組むかが圧倒的に楽になりました。引数付きmixin使えば.buttonとか.menuとかのOOCSS的なclass作る必要もなくなりました。&コンビネータ付けてればclass名を繋いでくれるのでBEM記法との相性も良いです。

LESSで地味に効いたのは、コメントアウトが楽なこと。リセットCSS書いた後に未指定の要素全部真っ赤にして記述漏れ確認してるんですけど、すぐに外せるのは本当に良いです。

メディアクエリ使って携帯電話向けのレイアウトを作る

このレイアウトだと、横に広がる方には問題ないんですが、水平800px割ると厳しい感じになるので、低解像度と携帯向けは縦のレイアウトにしてます。viewport指定をメタ情報に入れてどうすんだよってのは釈然としませんが。

LESS使った結果、携帯電話ブラウザへの対応もとりあえずPC向け作った後、変更したい箇所にメディアクエリ差し込んで書き換えるだけなので圧倒的に楽でした。

出力されるのは全くヒューマンリーダブルでないCSSですが、どうせCSSに文書的意味はないので機械が勝手に解釈すればいいんですよ。完全に阿呆になれるし、阿呆の状態のままCSSが出来上がる。

やらないこと

  • スクリプトを使ったコンテンツ操作
  • 自サーバでの画像や動画の保持、配信
  • 自サーバ内でのアクセス解析
  • モダンブラウザ以外での表示

スクリプト使ったコンテンツ操作

レイアウト考えたときは、ハンバーガーボタンでも置いてメニュー出すかと思ったんですが、どう考えても表示領域に余裕があるし、無理にメニューをposition: absoluteで表示に追従させる意味もねえなと気付いたので止めました。その前にコンテンツが真っ先に目に入るように作るのが先。アニメーションさせるのが目的のサイトでもない限り、基本的には要らねえなあとは思います。

ただ、ヘッダズラッと並べてジャンプするようにしようと思ったら、コンテンツの内容に追従してアンカー降ったりメニュー出したりする程度ならスクリプトでいいかもという感じはあります。

自サーバ内にメディアコンテンツを置かない

自宅のサーバでISP契約も一般家庭向けなので、上り帯域使わないために画像はflickr、動画はYoutubeに置いてリンク張ってます。勝手にiframeやscript突っ込まれるし、ページロード時間が壊滅的に増えますが(16倍遅くなった)、アーティクルの表示をブロックするわけではないのでまあいいかと。

と思ってましたが、今携帯(iPhone 6)で見たら滅茶苦茶レンダリング遅い…。パフォーマンスプロファイル見たらコンテンツのサイズがデカいんじゃなくて、単にレンダリングが重い奴だ…。やってしまった…。

自サーバでアクセス解析を見ない

環境やテンプレートやその他コンテンツも、ついスクラップにしてまた作り直すとか、公開しているサーバで平然とやる癖があるんですが、その際にログのバックアップを取らないとか取り忘れるとか明示的に捨てるとかをやってしまうので一貫性のあるデータ取れないので、今回はGoogle Analyticsのスクリプトを差し込んでおきました。

余談というかこれが本題ですが、Google Analyticsのデータ、PowerQueryに食わせられるので自分用のグラフ作るのにすげえ便利です。最悪Excelが手元になくても、PowerBI Desktopが無償で使えるので現状最強のアクセス解析サービスですね。

モダンブラウザでしか表示確認しない

今回、IE11でまともに表示できなくなりました。わざとそうしたわけではなく、全部CSS grid layoutにしたからです。flexboxで頑張ればIE11も結果的に問題なかったんでしょうが、レスポンシブにレイアウト変更する場合、gridが死ぬほど楽です。携帯電話ブラウザ、ChromeやSafariのgrid対応も済んでるし、正直grid使わない理由はないです。

前述のGoogle Analyticsでも、ここを見るような向きのIE比率は5%未満なので、正直もう無視していいかなという感じですね。

どうしてもIE11で表示させたい、となったらIE用だけ別のCSS書いた方が多分早いレベル。やりませんが。

やってみた感想

今時のHTMLとかCSSとか全然知らなかったので、書いてみたらHTML4の頃よりも意味の通るHTMLになるし、CSSもかなり平易かつ思い通りにレイアウトできるようになってます。

HTML5、文書構造を記述する言語じゃなくてプレゼンテーション言語だろみたいによく言われますけど、あくまで使われ方の話であって、Blogみたいな明確に文章を載せるページに限れば、かなり良くなってるんだなあと思わされました。

最後に、HTMLやLESS書くにあたって参考にしたのはこの辺です。綺麗に纏まっててありがたい話です。

タブレット保持アームを使った話

最近はNetflixで「Mythbusters(怪しい伝説)」を延々と見てたんですが、その時のスタイルが寝ころびながらタブレットを持ってゴロゴロするスタイルだったため、その状態で3時間視聴していると肩とか腕とかがバキバキに痛くなり、これは良くないと思いタブレットを支えるアームを用意しました。

当初購入したのはAKEIE スマホ & タブレット スタンド or ホルダーって奴で。これがいわゆるくねくねアームなのはまあ分かって買ったつもりが、実際は全然分かっていなかった。

関節自由度が無限なら、当然レイアウトも自由自在と思いきや、そもそもアームが固く、要求する位置に移動させようとしていると、プラスチック製のクランプが先に悲鳴を上げるレベル。そのくせ、先端に取り付けるタブレットの自重を支えきれずにどんどんとお辞儀をしていく始末。

「こりゃあどうにもならんな」ということで、まあ買ってしまったものは仕方ないのでいずれ携帯ホルダー代わりにでもするとして、次は金属製アームを購入。Unique Spirit タブレットアームなる奴です。

こっちは期待通りにアームの調整、保持が上手くいき、その結果布団の様子がこのようになりました。

20171120_190032832_iOS (2)

これで仰向けに寝たまま無限Netflixが出来る、と当初は喜び勇みましたが、二つほど問題が。

人間、普段寝ているときもずっと同じ体勢でいるということもなく、寝返り売ったり横向いて寝てたりするわけで。ずっと仰向けで同じ方向向きながら動画を見続けるの、相当厳しいことが判明しました。今度は体がバキバキに痛くなる。確かに椅子に座ってるよりは楽ですが、これで寝たきりといかないのが人生の厳しい話です。

加えて、仰向けの状態なので、動画見てると照明が目に刺さるということも判明。これは明かりを消して対応しましたが「今日は一気にドラマ消化するぞ」といった気分の際に、昼間っから布団に潜り込んで明かりを消している様はこれ以上なく不健康です。まあ健康的な奴が寝ころびながら動画消化とか言うはずもないですが。

ということで、寝たままタブレット置いておけるアームを導入した結果としては、睡眠導入に輝度最低で動画を流しておく使い方がメインになりました。深く考えないまま「こうしたらいいんじゃね」で状況改善しようと思っても碌なことはないですね…。

Need for Speed: Paybackはお前をHorizonする

去る11/10に発売されたNeed for Speedシリーズ最新作ことNeed for Speed: Payback、当然皆発売日にダッシュで購入して楽しんでる…わけではないのが世の悲しいところです。が、楽しいゲームだったので紹介しておきます。

Need for Speedとは

Need for Speedといえば、EAの看板IPにして、今年(2017年)で23年目になるレースゲームの超名門シリーズですが、恐ろしいことに「シリーズとしてのアイデンティティ」が異常なほど希薄なことが特徴です。敢えてNeed for Speedの特徴を挙げると

  • 実在の車が登場する
  • 警察車両がプレイヤーを襲う
  • 車の外観を豪快にカスタマイズできる
  • 所謂アーケード系ハンドリング
  • アウトローとしてのストリートレーサーが主人公
  • 近作ではAllDriveなる非同期オンライン対戦要素がある

等がありますが、シリーズ23年の歴史において上記で一貫しているのは「実在の車が登場する」ことだけです。

これは本当に起こったことですが、「アウトロー(荒くれさんチーム)と警官(公僕さんチーム)が延々と潰しあいを行う車相撲ゲームことNFS: Hot Pursuit(2010年版。1998年に同名作品あり)」の続編が「実在サーキットでの若干アーケード風味なシミュレーター系のShift2(本作のみタイトルにNeed for Speedを冠していない)」になり、更にその続編が「巨大な岩が降ってきたり、巨大な雪玉が落ちてきたり、電車が走ってるトンネル内だったりと、危険極まりないアメリカ大陸のキャノンボールレースを行うNFS: the Run」止めにその続編が「何もない空間から車が生えてくるNFS: Most Wanted(2012年版。2005年に同名作品あり)」だった、といえば如何に一貫性のないシリーズかお分かりいただけるかと思います。

Most Wanted(2012年版)の車が生えてくるシーン。新車をゲットするとそれぞれに超クールな映像が流れる。カットシーンでもパトカーが合体し、観ちゃん(from ガールズアンドパンツァー)と化して襲撃してくるシーンなど、突き抜けた世界観がある。

同じ”レースゲーム”ジャンルで20年近く続いているグランツーリスモや、デイトナUSA(昨年、アメリカのアーケードで3が出たらしい)、マリオカート等は、タイトルを聞けば何作目か分からなくてもどのようなタイトルであるかは一目瞭然でしょう。シリーズの一貫性のなさを鑑みると、生き残ってしまったリッジレーサーといった風情があります。

今回のNeed for Speed

さて、幾ら一貫性がないとはいえ、シリーズを追いかけてきてスレたファンたちは、毎回Tralerを見て「今回はこの路線なのか!買う!」と宣っては、Originのアンロック日を心待ちにしていますが、今回のTralerはこんな感じでした。

Need for Speed: PaybackのGameplay Trailer。因みにその後公開されたStory Trailerで描写される内容はDLCなしでクリアしたところ、一度も出てこなかった。

これ見たら、まあファンなら「the Runらしいシネマティックなシーンを遊ぶレースゲームなのか」と考えるところですが、実際にプレイしてみたところForza Horizonフォロアーだった、というのが本作の底知れないところです。

何がどうしたらあのTrailerでForza Horizonなんだよ、というのは100人いれば100人抱くだろう疑問ですが、何のことはなく、Trailerで描かれていたのは本作のストーリーミッションだけで、それがHorizonでいうところのスペシャルイベント(ジャンプで機関車飛び越えたりしたりする奴)だったわけです。

大まかなゲームフローとしては、

  1. ストーリーミッションをクリア
  2. 各種イベントがアンロック
  3. オープンワールドでイベント間を移動
    1. オープンワールド内にスピードトラップや、タイムアタック、ジャンプ距離などのチャレンジ
    2. 破壊できる看板等のコレクション要素
    3. 特別なカスタマイズが出来る旧車の探索
  4. イベントやチャレンジをこなして溜まったマネーで車の購入や強化
  5. 一定のイベントを完了すると次のストーリーミッションがアンロック

と、ほぼ完全にForza Horizonです。

じゃあパクりじゃねえかという話になりますが、それこそが本作の魅力です。Need for SpeedブランドでForza Horizonを作った、というのが重要です。

Forza Horizon自体が、Forza Motorsportのスピンオフだったわけですが、オープンワールドを自由に走行するコンセプトとForzaという看板が個人的にはあまりマッチしてませんでした。Horizonがアーケード路線のハンドリングで調整されてるのはいいんですけど、Forza Motorsport側のシミュレータ風挙動も継承していて中途半端な印象が否めませんでした。

そもそも”オープンワールドレースゲーム”というサブジャンルの先駆者は他ならないNeed for Speed: Underground 2なわけです。ただNeed for Speedがストーリー描写を重視することから「雄大なオープンワールドを自由に走り回る」Horizon路線にフォーカスしなかった、というだけで、Horizonをプレイしても「これをNeed for Speedで作ってくれれば…。」という思いが否めませんでした。

意識の低いオープンワールドレースゲームとしてのNeed for Speed: Payback

先ほど「一貫性のないシリーズ」と言ったのは一旦忘れてもらって、アーケード系ハンドリングなオープンワールドレースゲームの楽しさというのはNeed for Speedが切り開いてきた(そして無数の失敗を繰り返してきた)といっても過言ではありません。やっぱりNeed for Speedはプレイしてて心地が良いわけです。

長い年月をかけて培ってきたハンドリングの味付けや、直線とカーブの緩急、眼前に広がる多彩なロケーション、自然なロケーションの切り替わり、加速を演出するエフェクトなど、Forzaみたいにお高くとまってないで「プレイヤーを気持ちよくさせる」ことが第一義のエクスプロイテーションな作風はこれだよこれという気持ちになります。

グラフィックスも延々と夜で陰気極まりなかった前作とは一転、Forza Horizonを参考にしたのか、市街部に峠、砂漠に山岳とバリエーションに富み、またEAご自慢Frostbite Engineがいい感じにライティングしてくれます。特に昼夜のサイクルが導入されて、その場所、その瞬間の風景が驚くほど映える瞬間があります。特に朝の表現は当代トップクラスです。

0015
0037
0012
0001
様々な表情を見せるライティングと、豊かなロケーション。Titanもいた。

また、普通のレースゲームだったら「これから赴くロケーションに合わせて車のセッティングを行おう」と、ダートタイヤに替えたり、トルク増やしたり車高を上げたりしてたんですが、本作はレースの種類に応じた「ビルドタイプ」なるものが用意されており、それぞれの車が「これはオンロード」「これはドラッグ」と、レースタイプ専用に設定されます(恐ろしいことに後から変えることはできない)。車の加減速、ドリフト挙動、ハンドリング等は全てビルドタイプが基準になり、車ごとの差異は、ビルドタイプに比べて全然影響の少ない「加速が少し良い」「ニトロが少し長い」程度に抑えられています。この結果として、車種ごとの挙動の違いや、リアリティのあるセッティングを失った代わりに圧倒的なコンビニ感覚でゲームプレイに突入できるようになってます。しかも、車種毎に選べるビルドタイプは限られるものの「オフロード仕様のポルシェ911」「ドラッグレース仕様のPagani Zonda」など、常識的なレースゲームでは生まれようのないシチュエーションがプレイアブルに実現できるようになりました。

ゲーム内で入手できる旧車のカスタマイズは更に狂っており、ビルドタイプに応じた特別なビジュアルがビルドタイプ毎に用意されています。「ウィリーバーの付いたVW Beetle(ウィリーバーがビジュアルにしか作用せず、実際のゲームプレイに一切作用しないのもポイントが高い)」「車高が滅茶苦茶に上げられたオフロード仕様Chevrolet Bel Air」等、ゲーム中に目にするとまず自分の目を疑います。

0045
0046
オフロード仕様でスペシャルなビジュアルを適用したChevrolet Bel AirのBefore / After。

また、オープンワールドのゲームには常に「広いのはいいけれど、結局やることはイベントスタート地点への移動を延々繰り返すだけでしょ」問題を孕んでいます。今年の「ゼルダの伝説 Breath of the Wild」は見事にこの問題を打破し称賛されましたが、オープンワールドレースゲームの嚆矢たるNeed for Speedも前作Need for Speed(2015年版。リブートという体でサブタイトルはなし)の時点で手を打っていました。ミッション間の移動が退屈なら、至る所に無数のアクティビティを打ち込むという力技です。

本作でもその特徴は堅持しており、20秒走れば絶対に何かのアクティビティにぶつかるという滅茶苦茶なゲーム密度です。雑といえばそれまでですが、基本的にどこに行ってもすることがあるのは退屈しないという意味ではデザインの意図が十全に発揮されています。

Need for Speed Payback Screenshot 2017.11.22 - 09.30.40.73
Far Cry 4を彷彿させる、アクティビティで埋め尽くされた本作のマップ。

しかも、それに加えて収集要素としての看板破壊、コイン収集、旧車パーツ収集等があります。それぞれ、微妙に意地が悪い配置をされており、一つこなすのに平均1分以上かかるんですが、それが165(看板30、コイン100、旧車パーツ35)と、誰がやるんだよコレといった感じですが、作った側の努力は認めるとか気合は感じるとかそういう方面の要素です。

ボリュームの不足と絶望的なストーリー、最悪のstuttering

さて、ここまで基本的に褒め殺してきましたが、本作のプレイ中、ずっとプレイヤーにのしかかってくる一つの数字があります。ポーズメニューから確認できる「ゲームの進行度」です。

30を超える車種が並ぶディーラーを見て「ゲームを進めていけばこれらを入手するようになるのか」と思うのも束の間、レースをこなしても得られるゲーム内マネーはショボくれており、殆どマシンの強化に投入している間にみるみるゲームは進行し、結局ゲーム内ディーラーで車を入手するのは、最初のチュートリアルを合わせても3回で済んでしまい、気が付いたらクリアしている始末。

マシンのビルドタイプもレース、オフロード、ドラッグ、ドリフト、都市部の逃走用と5種類用意されてはいますが、それぞれのレースに決められたマシンタイプでないと参加できないにもかかわらず、マシンタイプごとのレースは15-25回程度しかないので、わざわざ5マシン管理する必要あったのかよという気分になります。特にドラッグやドリフトのビルドタイプについては「きっと最終イベントで使うのだろう」と、全種類強化した挙句、使うのはレースとオフロードだけだったときは衝撃を受けました。更に恐ろしいことに、オンラインでの対戦でも使えるのはレースとオフロードだけです。残りの3つの存在価値は…。

また、シネマティックなゲームプレイを含むメインイベントに至っては6つしかなく、そのうち2つはTrailerで公開されている始末。これは売り方の問題なんで作ってる方が100%悪いってわけじゃあないですが、それでもTrailerみたいなゲームプレイを期待した向きは全力で裏切られます。

また、脚本も本当に絶望的です。ゲーム展開としては「こういうアクションをやりたい」という繋ぎはまあ成立しているとして、全てのセリフがクソ。80年代のパルプ映画から無差別にピックアップして適当に並べたんじゃねえのというレベル。

物語も「ラスベガスっぽい地域でレースを牛耳って八百長で荒稼ぎしてるハウスなる連中をレースで叩き潰す」なんですが、「冒頭で主人公を裏切った奴がハウスに入って八百長を仕切り、街を代表するレースで主人公に敗北、主人公に対して全額を逆張りしていたハウスは一夜にして崩壊」って、全額はねえだろ、少しは考えろよ!

後、PC版の話になりますが、stutteringが酷い。フレームレートが若干落ちる程度なら許せるんですが、メインゲームループが追い付いてないのか数10ms、ゲーム進行どころか音声まで止まるのが頻繁に起こります。しかも発生条件がよく分からず、ストリーミングで発生してるのかと思えば、静止している時にも起こったりするので、原因を推定することもできない。いきなり30ms止まったりするのはレースゲームとしてはかなり致命的です。

最後に

当初、本作のMetascoreが67点と知り「いや、それはねえだろForza Horizon 3と比べても5点差くらいだって」と言っていましたが、クリアした今としてはさすがに撤回します。それでも67点は低すぎだと思いますが、70点台くらいのゲームではあります。

ただ、そのゲームが好きか嫌いかは点数とは関係ないですからね。プレイしてる最中は、ゲーム進行度さえ見なければ本当に楽しく遊べてましたし、一気呵成に4日程度でクリアしてしまうくらいには没頭しました。

Need for Speedはシリーズをシリーズ足らしめる特徴がないという話をしましたが、やはり歴史あるシリーズの味付けみたいなのはあるんですよ。本作の味付けが性に合ったら、別の作品も手を出してみてください。

当方としてはMost Wanted(2005)、Underground 1、the Run、ProStreetあたりがお勧めです。

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組んでください。