sside.net

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

SSDについて勝手に語る

modified: 2017-11-22

自作PC界隈を見ていると「SSDだから速い」「NVMeだから速い」「リードが2GB/sで超高速」みたいな話が散見されるので、SSDの話をします。

SSDとは

Solid State Drive(Disk)の略。HDDはレコードよろしく、回転する円盤(プラッタ)に対して、可動するヘッドがプラッタの内周なり外周を読み取ってデータの読み書きをするストレージデバイス。比べてSSDはその名の通り、solid state(半導体、または可動部分がない)。

何が違うかというと、圧倒的にレイテンシ(遅延時間)が異なります。

レイテンシの違い

レイテンシはCPUがストレージに対して読み書きのコマンドを出してから、実際にデータの転送が始まるまでの待ち時間です。

たとえ話(実際にはありえない例。バーストアクセスや論理ブロックサイズとかパケットサイズとか全部無視)として、10MBのアクセス100回、合計で1GBのアクセスをするとして、下記の性能のストレージがあったとします。レイテンシは10倍、と転送レートは100倍違うと仮定します。単位が秒なのは分かりやすくするためです(実際は500倍以上短い)。

レイテンシ 転送レート
ストレージA 1秒 1MB/秒
ストレージB 10秒 100MB/秒

処理時間は”(アクセスするサイズ / 転送レート * アクセス回数) + (アクセス回数 * レイテンシ)”になります。ストレージAの場合、”(10MB / 1MB * 100)秒 + (100 * 1)秒”は1,000秒 + 100秒で合計1,100秒。ストレージBを見ると”(10MB / 100MB * 100)秒 + (100 * 10)秒”で10秒 + 1,000秒で1,010秒。転送レートの高いストレージBが若干早く見えます。

が、PCを使っていて1ファイルのサイズを平均したら10MBのアクセスなんてことはないでしょう。system32やProgram Filesディレクトリを見ても、読みだすプログラムのファイルサイズは殆どが1MB以下でしょう。ということで今度は条件Bとして100KBのアクセスを10,000回行うとどうなるかが下記の表になります。

レイテンシ 転送レート 条件A(10MBを100回) 条件B(100KBを10,000回)
ストレージA 1秒 1MB/秒 1,100秒 11,000秒
ストレージB 10秒 100MB/秒 1,010秒 100,010秒

ということで今度は転送レートが100倍遅いストレージAが9倍速くなります。ここからは現実の話をしますが、メモリの足りないマシンだとよくスワップファイルへの書き出し、読み込みに加えて、アプリケーションの読み出しなど、ランダムアクセスが無数に行われます。これらのアクセスはモロに個別のアクセスなので、転送レート関係なしに、とにかくレイテンシが重要で、よく「SSDにしたら速くなった」というのは、SSDの転送レートが速いことよりも、アクセスレイテンシが短縮されたことによるものです。

HDDとSSDの違い

実際のデータ転送はこのレイテンシの後に始まります。HDDはデータの読み書きにあたってまずヘッドを動かし、その後アクセスするトラックが来るのを待つ必要があります。

これはHGSTのエンタープライズ向けHDD、Ultrastar He10の数字ですが、回転数が7200rpm(秒間120回転、1回転に8.3ms)で、ヘッドの平均シークタイムが8.0ms(Readの値。Writeは8.6msですが、計算を簡単にするため割愛)。この場合8ms(ヘッドシーク時間) +8.3ms / 2(プラッタの回転待ち、該当トラックに到達するまで半周分掛かると仮定) = 16.3ms掛かる計算になります。実際はヘッド位置合わせや該当トラックの読み出し後内部処理などでプラスアルファされます。「データシートではLatency Avg.が4.16msって記載されてるけど?」というのは、実際にはキャッシュDRAMが載っており、直近のアクセスに関してはキャッシュが効くからです。

対してSSDの場合は、可動部分がないため読み書きレイテンシはSSDコントローラからフラッシュROMに対する動作クロックと、SSDコントローラ内部の処理時間になります。Intel ARKによるとSATAで80-85μs、NVMe(MLC NAND)で20μs、Optane Memoryだと10μsということで、HDDに対して文字通り桁が違うわけです。その差実に50-400倍。

SSDの特徴

SSDは00年代まで主流だった(とはいえ2016年のSSD出荷台数は1億800万台HDDは4億700万台とのことで、未だHDDが主流ですが)HDDに比べて、大きくデバイスの性質が異なります。

メリット

HDD比でSSDが優れているところについて。

耐久性が高い

HDDは回転するプラッタとヘッドの距離が10nmオーダーしかなく、データの読み書き中にHDDに衝撃を与えると容易にぶっ壊れました。稼働中だと大体10G(数10cmの高さから落とす程度)の衝撃で壊れるとか言われてます。

SSDは中に駆動部品を持たないため、外部からの衝撃に対しては頗る強いデバイスです。ノートPCの場合、外部からの衝撃で壊そうとしたら、先にPCの外装が割れるレベルです。

パフォーマンスが高い

アクセスレイテンシの話は先述しましたが、それに加えて純粋な転送レートもSSDの方が上です。

今時のSSDの場合SATA IIIならインターフェイスの転送上限(規格上600MB/s、実効550MB/s前後)を使い切る勢いです。PCI-Expressを使うNVMeでも、データセンター等ハイエンドの方ではそろそろPCI-Express 3.0(1レーンあたり片方向1GB/s)4レーンでも足りなくなってきてます。

SATA SSDでもHDD比でレイテンシは50倍、シーケンシャルアクセス時の転送レートで3倍くらい違うので、最低でもHDDより3倍以上速いことになります。実際に使った場合体感でどう変わるのかは後述します。

軽量

HDDの場合、内部にはプラッタやヘッドに加えて、それらを動かすモーターが必要になります。加えて、それらを保持するハウジングについても使用中の温度差(HDD自体内部での摩擦やコントローラチップの発熱などで10-15℃くらい発熱するのに加えて、PC内部のCPUやGPUが30℃以上発熱する)で歪みが発生しないよう、鋳造されたスチールやアルミニウム合金の筐体が使われています。2.5インチHDDの分解写真を見ると、殆ど隙間なくパーツが密集してます。

引き換え、SSDの場合は基板上にコントローラやNANDのチップ、キャパシタやコネクタが載ってるだけです。2.5インチHDDと同じ形にするためだけに入れてる筐体が一番重いなんてこともあり得ます。百聞は一見に如かないので、Samsung 850 EVOの分解写真を見てください。

低消費電力

HDDの場合はプラッタを回して、ヘッダを動かし、読み取ったデータをコントローラが処理する必要があるため、原理的に消費電力が高くなります。一般的なSATA 2.5インチHDDとSSDの消費電力を比べた表は以下になります。

ストレージ種別(引用元製品名) アクセス時消費電力 アイドル時消費電力 スピンアップ消費電力
HDD (HGST Travelstar Z5K1) 1.5W (R/W Avg.) 1.6W(Seek Avg.) 500mW (Avg.) 5W (Max.)
SSD (Samsung SSD 850 PRO) 3.3 – 3.4W (Avg.) 70mW (Max.) なし

アクセス時消費電力はSSDの方がHDDより1.7Wほど高くなってます。昨今のNVMe SSDだと8W以上に達してるものもあります。

ただ、一般的なデスクトップやノートPCではそれでもSSDの方が消費電力は低くなります。前述したようにSSDとHDDのパフォーマンス差は最低3倍以上(実際は10倍以上)。同じ量のデータを読み書きするならば、SSDの方が3倍以上早く終了し、早期にアイドル状態に落ちることになります。データ転送量単位の電力効率で比較した場合、SSDが3倍高速なら消費電力を3で割れることになるため、SSDの方が優れていることになります。

加えてアイドル時の消費電力を比較すると、概ね7倍以上(表ではHDDがAvg、SSDがMax値)の差が付いています。従ってストレージに対して同じアクセスを試みた場合、3倍早くアイドルに落ち、アイドル時の消費電力は7倍異なる、ということになります。また、一定時間アクセスがない(一定時間以上アイドル状態)だと、ストレージはスリープ状態に落ちてさらに消費電力を下げるモードになりますが、スリープから復帰する場合、HDDでは一番消費電力が増えます(一度スピンドルが回転したら後は慣性で回るが、最初に所定の回転数までスピードを上げる必要がある)。この辺りも勘定に入れると、更に消費電力の差は増えます。

実際の消費電力についてはワークロードによって変わりますし、もうメーター付けて測るしかない奴ですが、仮にPC稼働時間の60%HDDにアクセスしていて、40%アイドル時間と仮定した場合、SSDにするとアクセス時間が20%になり、80%寝ていると仮定できなくはないです。表の消費電力で計算してみると約1.5倍変わる計算です。

ただ、人間が操作するにあたって処理が早期に済んだら、普通は次のタスクを始めてしまう(ワークロードが異なってしまう)ので、実際にはこの比較は不適切ではあります。

デメリット

ここまで良いことづくめのように見えるSSDですが、全面的に良いものであれば、とっくにHDDは駆逐されているはずです。デメリットも幾つか、なおかつクリティカルな奴があります。

メディアの書き換え回数上限

SSDによく使われるNANDフラッシュROMは、名前にROMと付いているだけあって不揮発性(電源がなくてもデータを保持する)読み出し専用メディアに、フラッシュ(データの消去)と書き込み機構が付いたものになります。NANDってのはフラッシュROMの種類です(他にもNOR型、微細化に向かず、セル面積が大きい奴があります)。

NANDフラッシュROMの書き換え

NAND(フローティングゲート形式の話です)のデータ書き込みにあたっては、前提としてフラッシュROMにはデータの書き換えという概念がありません。0を1には出来ても、1を0に書き換えることは出来ません。じゃあどうやってデータの書き込みや書き換えを行っているのかというと、SSD内で一度データを読み取り、保持した状態でフラッシュROMの該当部分を全て消去(フラッシュ。フラッシュROMの由来)します。その上で、SSDコントローラ側で書き換え部分を変更したデータを改めて書き直す、という処理になります。

ROMチップ内では消去の際、チップ内ではゲートからセルに20Vくらいの高電圧を印加してセルの抵抗をゼロにします。続いて、逆方向に電圧を掛けてセルの抵抗を書き込みます。読み出しはゲートから5V程度の電圧を掛けて、抵抗値を読み取ってます。

NANDフラッシュROMはフラッシュや書き換えの際、高電圧で電子が絶縁膜を通過して、中に電子を蓄えることでデータを保持していますが、その高電圧を何度も印加するうちに絶縁膜が劣化したり壊れたりします。これが寿命です。通説ではセルの書き込み回数は以下の表になります。比較対象としてHDDやOptane Memoryも併記しておきます。MLCについては後述します。

HDD SLC NAND 2bit MLC NAND 3bit MLC NAND 4bit MLC NAND Optane Memory
書き換え回数 100万回 1万-10万回 1,000-1万回弱 1,000回未満 数10回 数10万回

更に質が悪いのは、NANDフラッシュROMはその構造上、任意のセル単位での読み書きはできません。セルは2,048個(注: 製品によって異なる)単位で「ページ」という単位で纏まっており、そのページを2,048個束ねたもの(これも製品によって異なる)が「ブロック」になります。イメージとしては以下の図です。

NANDへのRead / Writeはページ単位で行われ、消去はブロック単位で行われます。セルあたりの記録ビット数が1ビットなら、1ページ2KB、1ブロックは4MBに達します。ここで、仮に1KBのファイルがあったとして、その10byteだけ書き換えたい場合、最悪の場合4MB分のセルが書き換えられてしまうことになります。

「じゃあセル単位で消去や書き込みの制御が出来るようにすればいいのでは?」というのは尤もです。が、フラッシュROM自体が元々消去が一番大変なので纏めて行うものなので無理です。書き込みも内部的には纏めて行うような配線になってるので無理です。諦めるかIntelのOptane SSD使ってください。

書き込みコントロールとウェアレベリング

精々数byteの書き換えに毎回4MB分のセルを愚直に書き換えていたら、書き換え回数が1-10万オーダーのSLC NANDでも速攻で壊れます。ただ、先述した通り消去はブロック単位ですが、Writeはページ単位です。ということは書き換えたいページがあったとすれば、どっか使ってない別のページに書き込めば1ページの書き換えに2,048ページを道連れにする必要なく、消費される書き込み回数も1ページ分で収まります。使用するページは同じブロックに属する必要はないので、SSD側で未使用ページを管理していれば、任意のページにデータを書き込めます。

一時期しきりに取り上げられたTRIM機能は、この未使用ページをホストのOSからSSDに通知できるようにした機能になります。OSで削除された該当ファイルシステム上のアドレスをSSDに通知するだけで、以後SSDは即座にそのページを使用することが出来るようになります。

ウェアレベリングについては、SSDコントローラ側で「どのページに何回書き込んだ」かを管理しておき、全てのページの書き込み回数が均等になるように調整します。ウェアレベリングとワンセットで語られるガベージコレクションは、例えばブロックの2,048ページ中、256ページだけ書き込み済みで、かつ書き換えの対象にならず、他の1,792ブロックは書き換えに使用済みだった場合、そのままでは必要な256ページのために残りのページが犠牲になります。この場合は必要なページを読み込んでから「ブロックを消去、同じブロックに必要なページを再書き込みする」か、または「ブロックは消去、必要なページは既に書き込み回数が多いページに移す」等の処理を行います。

また、「予備領域」として、壊れたページの代わりになる領域を用意しています(480GBとか250GBとか2の乗数になってない容量のSSDは足りない分が予備領域です)。読み出し時に著しく劣化していたり、書き込み回数が一定以上になったページは破棄して予備領域に移す処理も書き込みコントロールの一環です。

SSDでよく言われるキャッシュについては、例えば16byte分の書き込みコマンドとデータがやってきた時点では、SSD側はそれが「単に16byte書き込め」なのか、「まだ後続のデータがやってきていない」状態なのかは把握できません。キャッシュRAMを搭載することで愚直にデータが来たらすぐ書き込むのではなく、しばらく溜め込んでから後続アドレスのデータがやって来るか、一定時間待ってから纏めて書き込むようになっています。その他、SSD内部での書き込み遅延の隠蔽、直近に利用されたデータのリクエストに対する高速な応答など、様々な恩恵があります。あと、ウェアレベリングの精度についても、出来ることが増えるのでキャッシュレス(注: ただし、キャッシュレスでもコントローラチップ内にある程度のメモリは積んでる)はおっかないです。

余談ですが実際の書き込みと、実際にNANDに書き込まれるデータ量の比率をWAF(Write Amplification Factor)と呼びます。16byteの書き込みに2,048byte書き換えた場合、WAFは64にもなります。一般的な使用用途では20-30が最大だそうです。勿論、壊すように仕向ければその限りではないです。

ファイルシステムのページ境界とSSD管理ページのミスマッチ

これ自体はもうWindows XP時代の話なので、今は気にしなくてもいいんですけど、XP以前で何も考えずにフォーマットするとファイルシステムのページ境界アドレスがSSDのページ境界とズレてて、書き込みの際に余計にNANDのページ数を消費する現象がありました。

HDDの場合は内部で管理する書き込み単位がズレても、回転するプラッタの隣にあるので問題にならなかったけれど、SSDの場合は一気に顕在化したケースです。「今は解決してるからいいじゃん」という話ではなく、全く性質の異なるデバイスでは、それまで問題にならなかったことが問題になるという話です。

MLC NANDについて

ここまでにもSLCとかMLCとか説明レスで記載してきましたが、NANDフラッシュROMは1セルに2bit以上のデータを書き込みする技術があり、それがMLC(Multi Level Cell)と呼ばれます。SLCは(Single Level Cell)で、1セルに1bit書き込む形式です。

MLCの仕組み

前述したNANDへの書き込みですが、MLCの場合抵抗が0と1となる電子量の間、0.33と0.66になる電子量を注入することで、読み込み時の抵抗を4種類(2bit)得られるようにします。これが2bit MLCになります。3bitの場合は8段階の抵抗となります。

これで同じサイズのセル(実際はMLCにすると周辺回路とかは大きくなる)でそのまま容量が倍になります。勿論コントローラ側の対応が必要とかはあるんですが、ざっくり同じ価格でSSDの容量が倍になる、或いは同じ容量で価格が半分になったりすることが期待されます。実際はそうはなりませんが、SSDのbit単価が急速に安くなった要因の一部ではあります(その他の要因の一部: NANDの微細化、市場規模の増大、チップの開発費回収等々)。

MLCの弱点

SSDが安くなるなら万々歳だろというのは人情ですが、タダでメリットが享受できるわけではなくMLCには様々な弱点があります。

書き込み性能の低下

NANDの書き換え回数の話をしましたが、MLCにすると読み込み性能、書き込み性能が低下します。特に書き込み性能の低下が顕著です。具体的には流し込む電子の量の制御が圧倒的に難しくなります。次の表はあくまでイメージ(実際は絶対に違う)ですが、粒度が全然違うことは見て取れると思います。

SLC 0(2進数): 0% 1: 100%
2bit MLC 00: 0% 01: 33% 10: 66% 11: 100%
3bit MLC 000: 0% 001: 14% 010: 28% 011: 42% 100: 57% 101: 71% 110: 85% 111: 100%

読み込み時、所定の抵抗を得るのに注入する電子の数をどれだけの精度でコントロールする必要があるか、セルに溜められる電子の数はセルのサイズに依存します。現行の3Dじゃない1Z世代プロセスだと電子の数は2桁とのことです。

データ書き込み時の電圧印加も、SLCでは0ならそのセルはそのまま、1は所定の電圧印加で問題なかったものが、2bit MLCの場合は注入する電子量が4パターンあり、かつ注入する電子量は3倍の精度が求められます。2進数10を書き込もうとした場合、まず50%を注入した後、残りを注入する形になります。3bitの場合は3回電圧印加が行われます。

ところでHDDが順調に記録密度を増やしていた頃を覚えている人は、プラッタあたり容量が増加すると速度も増加していたことを思い出して「1セルを読み出すだけで2bitデータが持ってこれるのなら、読み出し時の転送レートは2倍になるのでは?」と考えると思いますが、実際はそうはなりません。MLCにした時点で、抵抗値のマージンが半分以下になっており、読み出し時のエラーレートが劇的に高まっているからです。

元々、SLC NANDでも微細化の進んだ昨今ではエラー検出、訂正(ECC)は必須になっていますが、SLCなら1byteのECCで済んでいたものが、MLCでは4byte以上になってます。ECCの計算量はbit数に対する乗数で効いてくるため、8bit(1byte)に対して32bit(4byte)は4乗の処理時間、または回路規模が必要になります。それ以上のサイズのECCだともっと遅くなります。数学よく分からないので気になったら各自調べてください。

パフォーマンスだけでもデメリットですが、ストレージとして重要な指標となる寿命に対するインパクトはそれ以上です。

セルの記憶容量が倍になると、ページサイズもそのまま倍になります。同じ16byteを書き換えるにしても、今度は4KBが書き換えられることになります。全体のセル数が変わらないままSSDの容量が2倍になれば、ページが書き換えられる可能性も2倍に膨れ上がります。SLCなら書き込まずに済んだページがMLCなら書き換えられる可能性があります。

抵抗値のマージンが小さくなっているため、絶縁膜の劣化の影響をより多く受けて、SLCならマージン内だがMLCだとマージン外でデータが読み出せなくなる可能性が増えます。これも一概に言い切れる事柄ではないですが簡略化すれば「SLCなら抵抗値に20%のマージンがあったが、MLCだと10%しかない、絶縁膜の劣化で書き込み精度が10%下がるとMLCだけ死ぬ」ということが起こります。

寿命についてまとめると「ページに対する書き込み頻度は増加しているのに、ページに書き込みできる回数は低下している」ということになります。これが3bitになると、問題はまた乗数で効いてくることになります。

データ保持性能の低下

NANDフラッシュROMは電子を保持してデータを記録することは何度も書き連ねてきましたが、この電子は失われていきます。

まず、通電しないまま放っておくと徐々に失われます。そもそもが消去と書き込みが可能なものなので、電子が抜けることがあり得ます。環境温度が高いとより早く失われるそうです。多分電子の動きが増えるからだとは思います。それと電子を保持している絶縁膜は厚さ10nm前後で、ナノメートルの世界なので量子的にいなくなるとかもあるかもしれません。物理学は分からないので各自調べてください。

あと、読み出しの際も電子が失われていきます。読み出しも消去と同様ゲートから電圧を掛けるためです。

これらの要因で不揮発性メモリのデータは揮発していきます。タイプごとの保持期間は大体以下の表の様に言われています。

SLC 2bit MLC 3bit MLC HDD
データ保持期間 10年 5年 2年 10年

見事にセルあたりbit数が増えるたびに半分になってます。「3bit MLCなSSD使ってるけど保証期間5年って書いてあるぞ」という向きもおられましょうが、勿論コントローラ側で読み出し時にマージンに対してギリギリだったりすると、別のテーブルに書き直しを行っているため顕在化しないだけです。HDDも読み出し時に同じデータ書き込んだりしてます。

これまた余談ですが、これSDカードでも同じなので、長期間データを保存する場合は避けた方が賢明です。バックアップなら強いて言えばHDD?という感じになりそうですが、HDDのデータも揮発するため、定期的なバックアップに勝る方法はないです。ちなみにおれはRAID組んでたHDDの一部トラックが全然読み込まれないままデータが揮発してたことがあります。

SSDのスペックの読み方

ここからは実際に流通してるSSDで喧伝される要素について説明します。

コントローラ

SSDの性能の話をするならコントローラが最重要です。ここがホストインターフェイス(SATAやPCI-Express)、及びNAND Flash ROMへのアクセスを提供します。

SSDコントローラの仕事は、HDDもコントローラを搭載していてやってることは同じなんですが、まずホストに対して自身をHDDだと見せかけます。ホストからのコマンドを受けて、繋がっているNAND Flash ROMをRead / Writeし、その結果をホストに戻します。

じゃあ何でHDDと違ってホストインターフェイスが重要なのかといえば、HDDとSSDでは産業のオープンさが全然違っており、HDDの場合は「XX社のプラッタと、YY社のヘッド、ZZ社のコントローラ」みたいなことはエンドユーザは基本的に知る由もないし、知る必要がありません。HDD市場のプレイヤーは実質3グループ(WD、Seagate、東芝)しかなく、どのパーツもソフトウェアも特注みたいなものです。

翻ってSSDの場合は「NAND Flash ROMはIntel-Micron、コントローラはSandforce、ファームウェアはCrucialのカスタム」みたいなことが普通に起こります。昔はよく「東芝のSSDは鉄板」「SandForceコントローラは速い」とかありましたけど、東芝のSSDコントローラは昔は自社の奴があったりしましたけど、今はIndilinx(OCZに買収された後OCZが東芝に買収された)があったり、SandForceにしても新モデル出るたびに妙な挙動するとかありました。もっと極端な例だと、同じコントローラでもメーカー側でファームウェアをカスタムした結果バグってるなんてことも。「こうしておけば安心」なんて指標はありません。

とはいえ昨今ではSSD市場も成熟してきてデータぶっ壊れるとか、極端に遅くなるとかは殆どなくなりましたが。

コントローラメーカー別所感

Intel

2017年末現在、世界で一番速いSSDコントローラを製造してる。とはいえ、自社コントローラはデータセンター向けか、それを流用したハイエンド向けでしか使ってません。コンシューマ向けのSSDはSandForceやSilicom Motionです。

ターゲットアプリケーションが完全にデータセンターなので、ランダムアクセスのワークロードに特化。ランダムアクセスのIOPSとか、ワーストのアクセスレイテンシが超優秀。シーケンシャルアクセスは遅くはないけれど、他と比べて振るわないことも。

Samsung

世界最強のSSDメーカー。コンシューマでも買えるSSDだと、IntelがOptane SSD出すまでは960 Proがぶっちぎりで最強でした。

何かとシーケンシャルアクセスの数字で競われるSSDスペック競争の完全に先を行ってます。シーケンシャルアクセスで勝って当たり前、ランダムアクセス、Read / Writeミックス、NAND Flash ROMベースのSSDでは全てにおいて最強。

そもそも自社でコントローラからNANDまで全部垂直統合な上、SamsungのNANDは世界トップシェア。勿論他のコントローラメーカーもSamsungのNAND使うことはあり得るんですが、Samsung自身が自社で作ってるNANDに合わせてコントローラ作るのと、他社(コントローラメーカーやSSDメーカー)がSamsungから出荷されたNANDにコントローラ対応させるのは全くスピードが異なる話なうえ、何よりもSamsungはNANDが屋台骨なので新しいコントローラをバンバン出してくる(売れまくるので全然ペイする)次第。

新しい仕様のNANDに合わせてコントローラを迅速に出せる上、コントローラ自体の製品サイクルも速いので、もう爆発スマートフォンみたいに酷い不具合出さなければずっと最強メーカーだと思います。Samsung買っておけば間違いない。

Broadcom

IntelやSamsungでないSSDメーカーが「ハイエンド」を謳って出してくるSSDは大体Broadcomです。

NVMeなんかの新規格には迅速に追従してて、かつそれなりに速く、それなりに高価という感じ。

自作の場合は特に選ぶ理由がないというか、高価な奴ならIntelかSamsung買っておけということになります。

JMicron

SSD市場の黎明期、安い方向に圧倒的なプライスを打ち出してバカ売れしたけれど、ガベージコレクションがクソでレスポンス返さなくなってOSが固まったり、タイムアウトして青画面出したり、ファームがクソでデータが壊れたりしたJMF602からもう8年以上経ってますが、SSDというデバイスに対する希望をぶち壊しにした挙句、SSDというデバイスの問題点を詳らかにしたインパクトはまだ薄れていません。

ただ、世の中先に失敗した方が修正も先になるのが常で、今の奴は割とまともらしいです。

ただ、ハイエンドでは一切見なくなりましたが(おれだってJMicronコントローラのハイエンドSSDなんて絶対買わない)、ミッド-ロークラスでは普通に健在です。TLCにもいち早く対応し、安価なSSDでは一定の地位を築いています。SATAとUSBのデュアルインターフェイスが名物ですね。高速な外付けSSDとしてや、Xbox Oneに繋いでゲーム入れとく程度なら十分使えると思います。

Silicon Motion

ローエンドからミドルクラスで最近採用が多いイメージです。昔から酷い話も、良い話も特に目にしません。レビュー見てもその時々の標準クラスの性能出してます。特にコントローラ気にせず、評判も悪くないSSDを買うと中に入ってるのがコレというイメージ。

ホストインターフェイス

最初はSATAとNVMeの話だけしようと思ったんですが、色々あるので全部紹介します。

Serial ATA(SATA)

ご存知SATA。元々は80年代にIDEというHDD接続インターフェースがデファクトスタンダードになり、それを標準化したのがATAです。90 – 00年代にはハイエンドを除いてストレージ接続はATAになりました。元々40pin(後に40pinのままGNDが40芯突っ込まれて80芯に)のパラレルバスだったんですが、取り回しが悪かったり高速化できないのでシリアル信号になりました。なのでSerial ATAです。

Serial ATA 1.0の頃は150MB/sだった転送速度も、世代が上がる度に倍速化していき、現行のSerial ATA 3.0(厳密にはリビジョン表記と速度は切り離されてますが、慣例として)では600MB/s。今時のSATA SSDの多くが最高転送速度540MB/sくらいになってるのは、SATAの実効転送速度の上限に達しているからです。

「転送速度が足りないのなら、また倍速化した規格を策定すればいいのでは?」というのは尤もですが、元々ATAは世の中2億台以上のPCで使われることを前提とした「安価な」インターフェースです。単にコネクタやケーブルが安価ということだけではなく、ホスト側で備えるインターフェースが簡素であることや、接続されるストレージも安価に作れることを想定しています。

現状のケーブルのままではもう高速化は困難になっており、また古い規格なのでNCQのキュー数が少なかったり(キュー数は増やせても、HDDには意味がない)と高速化するSSDに追従するのは困難になっています。元々、HDDを使う分には転送速度はSATA 2.0(300MB/s)で十分、NCQ対応も十分な状態です。

まだ世の中HDDの方が多い状態で、SSDのためにケーブルが高価になったり、高速なPHYを入れたりするのは割に合わないので「じゃあソリッドステートストレージは別の規格使えばいいじゃない」となります。コマンド等の論理層もHDDとの接続を考慮したままSATAを拡張するくらいならハイエンドSSDはNVMeに行ってくれた方がマシ、ローエンドのSSDはSATA 3.0で十分だろということで現状落ち着いてる感じです。

Serial ATA Express(SATA Express)

ということでSATA後継の規格がこちら。旧来SATAと、PCI-Expressのコンボポートになっています。PCI-Expressの世代はGen2以上で、レーンは2つ。SATAコネクタの形は基本的にはSATAを踏襲しているので、SATAとの前方互換性もある形になってます。

が、PCI-Express Gen2の2レーンというと片方向1GB/sしか出ないので、SATA 3.0に比べても倍にすらならないので、わざわざ高速なSSDを使いたい向きに受け入れられてる感じではないです。市場もSATAか、x4以上のPCI-Expressコネクタ直結か、M.2の3択で、今後生き残るかはよく分からないです。

それとコネクタ種別が混沌としすぎ

Serial Attached SCSI(SAS)

SATAでも、NVMeでもないハイエンドSSDの選択肢の一つ。元々を辿るとSCSI規格という昔普及した高速汎用パラレルインターフェイスです。HDDなどの高速デバイスはもとより、よくスキャナやCD-ROMドライブの接続に使われていました。ただ、HDDはATA、CD-ROMドライブはATAPIやUSB、スキャナもUSBに取って代わられた後は、主用途をハイエンドストレージとして発展を遂げてきました。ATA同様パラレルだと速度面で限界に達したのでシリアル化して今に至っています。なのでSerial Attached SCSIです。

SASの特徴は

  • SATAの2倍高速(現行のSAS 3.0、1.2GB/s)
  • コマンドの並列発行が可能
  • Expanderを用いた接続台数追加(1chあたり128台)
  • マルチポートのサポート

等になります。あと、「最低限の仕様を満たしていればいい」SATAと違い、信号処理とかもメーカー実装依存だそうで。投入される市場が信頼性を重視するのでHBA(Host Bus Adapter、I/Fボード)やケーブルも高くなってます。

NVM Express(NVMe)

SATAは速度向上の限界に達したところ、丁度PCでは汎用高速バスのPCI-Expressが普及してきたし、ケーブルもUSB3.0(USB3.0の物理層はPCI-Express相当です)のお陰で高速伝送できるのが安くなってきたしでじゃあPCI-Expressを使ってストレージ向けのインターフェイスにしようというのがNVMeです。

NVMe自体はPCI-Express上でストレージを取り扱う規格になるので、コネクタの形状とかは特に決まってません。ホスト側のUEFIとOSにNVMeドライバがあれば、M.2だろうがSATA ExpressだろうがU.2だろうが、PCI-Expressコネクタだろうが、いずれにせよ認識し、使えるようになっています。現在出回っているNVMe SSDのコネクタは色々あるので下表に纏めました。

PCI-Expressレーン数 PCI-Express世代 ホットプラグ対応 ボード直結 / ケーブル 備考
PCI-Express 1-16 Gen 1以上 No 直結
M.2 4 Gen 2以上 No 直結 USB 3.0のコンボポート
U.2 4 Gen 3以上 Yes ケーブル
SATA Express 2 Gen 2以上 Yes 直結 & ケーブル SATA 3.0のコンボポート

パフォーマンス面では元々不揮発性メモリを使ったストレージを想定したものになっていて、コマンド仕様もSASから一部持ってきたり、NCQのキュー数がSATAの32個から65535個に拡張されるなりしています。何よりもSATAと違ってPCI-Expressの採用によってインターフェイスのレイテンシが全然違い、結果的にランダムアクセスに対してSATA比で10倍以上速くなってます。

eMMC

eMMCは元々MMCというメモリカード向けIF規格だったんですが、それを組み込みストレージ向けに転用、拡張して高速化したものです。元々はハイエンドの携帯電話でストレージに使われるようになり、スマートフォンの普及とともに広く使われるようになってます。

組み込み、それも携帯電話向けなので、基本的にコントローラ、インターフェイス、NANDが1チップに纏められ、オンボードに実装される使われ方をします。特徴は携帯電話向けなので低消費電力、低フットプリント。特にフットプリントはM.2を使ったNVMe SSDに比べると20%以下です。Windowsでもタブレットを志向したWindows 8でサポートされ、ローエンドWindowsタブレットの中でしきりに使われることになりました。

インターフェイスの最大速度は400MB/sで、実際にRead 300MB/s以上の製品も存在します。ただ、1チップに纏める必要があるので、NANDは3bit MLC、Writeが遅い奴ばかりです。

よく「eMMCはSSDじゃない」とか言ってるのが居ますが、じゃあお前のSSDの定義は何だと言いたいですね。インターフェイスがSATAやPCI-Expressじゃないとダメなのか(じゃあInfinibandで接続するのは認めないのか?)、オンボード実装で取り外せないのがダメなのか(電気的にもフットプリント的にも不利なのに?)、3bit MLCだからダメなのか(じゃあ昨今流通してるSSDもSSDではないのか)、他にもあるかもしれませんが、阿呆の考えることをこれ以上想像しても仕方ないのでこの辺にします。

UFS

携帯電話でeMMCを使ったストレージが広く普及してきたので、一丁時勢にマッチしたストレージ規格をということで策定されたものです。Windowsは未サポートで、PCではまだ使われていません。

特徴は10cm未満の配線に最適化されたシリアルバスで、低消費電力、高速転送、省pin数を実現しているところです。転送速度はUFS 2.0で1レーンあたり600MB/s。速度が不足する場合は2レーン束ねることもできます。

また、物理層は携帯のカメラやディスプレイインターフェイスにも使われてるものと同じ(UFSの物理層仕様がMIPI M-PHYになった)なので、IPも広く出回って低コストになってます。

SamsungがGalaxyでよく売りにしてるのはこのUFSを使ったストレージですね。

USB

ご存知USB。

2.0の480Mbpsから3.0で5Gbpsに10倍以上速度が上がりました。3.0でpinが5つ増え、物理層はPCI-Express Gen 1相当のものになりましたが、3.1で10GbpsになるにあたってPCI-Express Gen 2相当になるのかと思ったら、別物になったというよく分からない奴です。その名残でケーブルだけPCI-ExpressのExtenderに使われたりもしますね。

USB SSD接続時は、USB Mass Storage Classデバイスとして動きます。ただ、SSD側では「USB-SATA変換チップの先にSATA SSDがつながっている」ものか、「USBに対応したコントローラに直接つながっている」2タイプがあります。形がポータブルHDDそっくりの奴は基本的に変換してると思っていいです。

どっちの素性が良いかは製品次第になるので、実際に速度が出ればどうでもいいっちゃあいいんですが、気になる向きは気にしてみてください。

また、USB Type-Cコネクタが出回り始めましたが、Type-Cコネクタで使えるAlt modeでは、ケーブルの一部の信号線に別のプロトコルの信号を流せるようになりました。PCI-Expressも流せるので、将来的にはNVMeなUSB SSDが出てくるかもしれません。

NAND Flash ROM

「IntelのフラッシュROM搭載!」と喧伝してるクソメーカーとかクソ代理店がありますが、全くもって無意味なので潰れたらいいと思います。

さておき、大事なのはチップのメーカーよりもMLCは何bitか、製造プロセス世代は何nm(微細化が進むほどデータ保持期間が厳しくなるので古い奴の方が良い)なのか、コントローラ-NANDチップ間のインターフェイスは何なのかですが、どのSSDメーカーも非開示なのでよく分かりません。

さておき、NANDチップにも工夫が凝らされているものがあるので幾つか紹介します。

enterprise MLC(eMLC)

これまで散々MLCの悪口を言ってきましたが、当然SSDメーカーも信頼性が低下するのは分かっているので、MLCだけど書き換え回数が多いeMLCチップというものがあります。

どうやって書き換え回数を増やしてるのかは軽く調べた範囲では、

  • 選別品のNANDを使う
  • 予備領域を多く持つ
  • ECCを強化する
  • ウェアレベリングのアルゴリズムを変更する

の合わせ技で書き換え回数を確保しているようです。ただ、どれもコストが上がるので、MLCの低価格化のメリットが相殺とは言わずとも薄れはします。まあenterpriseを冠しているので、採用製品も高くなる分には理解して買う客しか買わない類のものになります。

SLCキャッシュ

3bit MLCで最近よく使われる機構です。3bit MLCだと書き込み速度の低下がシャレにならないため、NANDチップ内にSLCで読み書きするブロックを用意しておき、直近の書き込みはSLC側に溜めておき、アイドル中にMLC側に書き換えるものになります。

書き込みの総量がSLCキャッシュに収まるうちは十分に効果を発揮しますが、キャッシュを溢れるくらいになると途端に3bit MLC相当に落ち込みます。が、SLCキャッシュ領域もGB単位なので実際はかなり効果はあります。普段使いで一回に数10GBも書き込みすることってそうそうないので。動画取り扱えばその限りではないでしょうが、そんな場合はそもそも3bit MLCのSSDを使うなという結論になります。

キャッシュRAM

最近のハイエンドだと2GBとかになってるキャッシュRAMですが、やれDDR3だ、やれ2GBだとかよりも、スペックを見るにあたっては「積んでいるか積んでいないか」の2択です。

世の中にはキャッシュレスなSSDコントローラというものがあり、DRAM1枚積むコストすらケチったSSDというものがあります。コスト最優先なのでNANDも当然3bit MLC。SSDコントローラ内にも少量のメモリは積んでいますが、書き込みにあたってバッファになるキャッシュRAMがないとなると、高度な書き込み制御は望むべくもないので、ただでさえ寿命の短い3bit MLC NANDは速攻で死ぬことになります。壊す前提のゴミとして買う以外、買う理由が一切ありません。

容量の話ですが、64MBや128MBでも、積んでいれば書き込み制御のバッファにはなります。大容量のキャッシュRAMを積んでいても、元々フラッシュストレージ自体が割と高速なので、特定サイズで局所的なストレージアクセスを延々繰り返すプログラムを自分で書いたとかでなければ、あまり気にしなくてよいです。

SSDに纏わる誤解

たまーに見る微妙な話について。メディアとかでも平然と書いてたりするので、そりゃあメディアも商売とはいえ

古いマシンのHDDをSSDに変えると速くなる

自作PCとかやらないけど、巷間に流れる「HDDをSSDにリプレースしてスピードアップ」みたいな記事を見て、何も考えずにSSDにリプレースすると、HDDからのリプレースなので容量重視して3bit MLCなSSD選んだりするわけです。まあそれでも大体の場合は速くなるんですけど、ワークロードによっては遅くなります。

大抵、古いマシンってのはメモリが不足してて、ディスクアクセス遅いなーってのも大方スワップファイルへのディスクアクセスなんですが、SSDに置き換えるとReadは改善しても、ランダムなWriteや、Read / Write混在アクセスだと、Writeがキャッシュを溢れた時点で滅茶苦茶に遅くなります。キャッシュ溢れて以降は、SSDでもレイテンシ1,000ms越えとかになります。

この場合、PCの中に手を入れてパフォーマンスを改善したければ、先にメモリを増やした方が圧倒的に効果があります。

シーケンシャルアクセス速度が速いほど高速

NVMeでRead 2TB/s越えをする3bit MLCなSSDも…とMLCの話はさておいても、シーケンシャルアクセスの速度が上がるほど、OSから見て連続したセクタへのアクセスは短時間で終了するようになるので、さて別のセクタへのアクセスとなるとランダムアクセス時の性能が徐々に重要になってきます。

RAIDだから速い

場合によっては遅くなります。RAIDで高速化って言ってる時点でRAID0(ストライピング)の話としますが、ストライピングって書き込むデータをアレイを組んだディスクの台数分にバラバラ(分割する単位はストライプサイズ)にされて突っ込まれることになります。

読み込みについてはレイテンシにそれほど差が出ないので問題ないんですが、書き込みの場合はSSD内部で管理されるブロックやページがそれぞれ異なるため、消去やガベージコレクションがSSDごとでランダムに発生することになります。RAIDアレイとしての書き込み完了は全ディスクの完了を待つことになるため、書き込みパフォーマンスの増加は難しくなります。

また、読み書き問わずランダムアクセス時は、RAID側で最低アクセス粒度がストライプサイズ分に増加している上、全てのアクセスが後に完了したものに引っ張られてしまうため、スピードは上がりにくいです。

純粋に利用時の快適性を求めてRAID組むくらいなら、最初から高速なSSDを買った方が良いです。リーズナブルに大容量が必要とか、どうしてもシーケンシャルアクセス速度が必要であれば勿論その限りではないですが。

最後に

書いてる間に何の話がしたかったのか分からなくなったのでこの辺にしておきます。SSD選びの一助になれば幸いです。