sside.net

間接的に行われる積極的な自殺 – 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あたりがお勧めです。