feature image

2020年9月27日 | ブログ記事

【Flash作者様へ】Flashの希望と未来【Ruffle】

この記事は夏のブログリレー2020の記事です。

この記事は、Flashゲームの作者様に特に読んで欲しい記事です。この記事はとても長いですが、どうか最後までしっかりと読んでください。そして、サーバーからFlashゲームを削除するのを思い止まってください。将来、比較的安全にFlashをブラウザで実行できるようになるかもしれない方法が残されています。
また、Flashゲームを愛している、あるいはかつて愛した人も、この記事を読み、そしてできる限り多くのFlashゲーム作者様にこの記事が届くよう、拡散に協力をお願いします。

この記事のポイント

はじめに

どうも、実はFlashゲーマーだったMochoです。
今日は、2020年末で終了するとされ、最近界隈が葬式、あるいは既に追悼式ムードになっているFlashの未来についてお話しします。
はじめに断りを入れておけば、僕はAdobeと繋がりのある人間でもFlashやセキュリティの専門家でもなく、ただのFlashゲーム愛好家です。この記事はそんな僕個人の調査に基づいたもので、正確性の保証はできません。ご了承ください。

なぜFlashが終了するとFlashゲーマーは困るのか

Flashの終了自体は3年前の2017年から予告されていました。Flashを使っていた多くのWebサービスや大手企業のゲームは代替技術に移行していて、一般の人にとって困る要素は何もないはずなのです。
ではなぜFlashゲーマーは困るのか。答えは、個人開発者のゲームのほとんどは対応できずに取り残されているからです。対応できないことを表明する人、移行を表明するも制作ペースを考えれば完成には数年がかかると思われる人、そもそも失踪している人。こういった方々が残した素晴らしいゲームの数々が二度と遊べなくなるとしたら、それは大変悲しいことです。ある界隈の人はFlashゲームこそが自分の青春だったと断言していて、そういう人にとっては自分の青春が丸々なかったことにされてしまうレベルでの衝撃と喪失感なのです。

Flashの終了は、ファミコンの生産終了とはわけが違います。ファミコンは生産終了したとしても既に所持している人なら問題なく遊び続けられますし、中古レトロゲームは盛んに取引されています。一方、Flashゲームの多くはWebサイト上で提供されているため、ブラウザに無視、あるいはブロックされてしまうと過去に遊べていた人も含めて全ての人が遊べなくなってしまうのです。しかも、ブラウザはゲーム以外にも日常的に使うため古いまま使い続けるというわけにもいかないのです。

毎日遊び続けるほどのヘビーユーザーでないとしても、ふと思い出した時に懐かしいゲームで遊ぶ方法が一切残されていないとしたら寂しさを覚えることでしょう。Flashの終了は、貴重な文化の未来永劫にわたる損失なのです。

なぜFlashは終了するのか

Googleは、Flashの利用率が2014年から2017年の3年で80%から17%まで低下していること、代替となるオープンなweb技術はFlashよりも速く、電力効率がよく、安全であり、モバイルでもデスクトップでも動くことを指摘しています。ここで言うオープンなweb技術とは、Adobeが代替として名前を挙げているHTML5、WebGL、WebAssemblyなどのことを指していると思われます。

Mozillaもまた、Firefox用Adobe Flash Playerが用いているNPAPIはセキュリティとパフォーマンスに問題があるとしています。

Googleの指摘する通り、新しいweb技術がFlashより優れているのは間違いないでしょう。ただ新しい方が優れていると言う当然の事実だけでFlashを完全に終了させる理由になるのかという疑問はありますが、新しいweb技術の方が「より安全である」と言う点を考えれば仕方ないことなのかもしれません。

Flash(等のプラグイン)が持つ安全性の問題

Web上のコンテンツを再生するためにAdobe Flash Playerが用いてきたプラグインという方式は、ブラウザに機能が少なかった頃の遺産です。昔のブラウザはpdfを見るにもオーディオファイルを再生するにも対応するプラグイン(Adobe Acrobat ReaderやWindows Media Playerなど)が必要でした。いまや特別な準備なしでもブラウザでビデオ通話ができるのは当たり前ですが、HTML5以前ではカメラやマイクにアクセスするにはプラグインが必要でした。

プラグインの実態は.dllや.soなどのプラットフォームでネイティブなコードライブラリです。プラットフォームの力を借りてこれらのライブラリを呼び出すことで、ブラウザが本来持っていない機能を後から追加することができます。ブラウザの機能を超えることが目的なので、当然ブラウザ自身はプラグインのコードを実行する能力を持っていません。

これに対して、JavaScriptやWebAssemblyといったweb技術は、ブラウザ自体がこれらを実行する能力を持っています。例えば、Google ChromeはV8というJavaScript実行エンジンを持っています。このことは、web技術でできることの範囲は、ブラウザ自身に脆弱性がない限りブラウザが提供するAPIの範囲に制限されるということを意味しています。

ブラウザ自体が高機能化して様々なファイルの再生に対応したり、カメラ・マイクやGPUなど一般的なハードウェアの機能にアクセスできるJavaScript向けAPIを提供するようになったので、昔ながらのプラグインを用いずともほとんどの場合同等の機能が実現できるようになりました。その結果、昔はブラウザの機能を超える追加能力を提供する不可欠な窓口だったプラグインは、いまやブラウザの機能を超える追加の脆弱性を提供するだけの不必要な裏口となってしまいました。実際、ブラウザ側の大変な努力(プラグイン実行のサンドボックス化など)があったにもかかわらず、Adobe Flash Playerはこれまでに数多くの脆弱性とそれによる被害を生み出してしまっています。

プラグイン内の脆弱性にはブラウザ開発者側では直接的な修正対応ができず、プラグイン開発者側の対応を待たないといけないことも考えると、ブラウザ開発者側が不必要になってしまったプラグインを排除したがるのにも納得がいきます。

2020年末に何が起こるのか

Flashは2020年末でサービス終了、という文言をよく耳にしますが、これはどういうことなのでしょうか。2021年を迎えた途端全世界のFlashが動かなくなるのか、それとも自己責任で動かす分にはこれまで通り動かせるということなのでしょうか?

結論から述べれば、今までの方法、つまりAdobeや各ブラウザ開発企業が想定している方法では2021年になった途端(数日の猶予があるかどうかは別として)にFlashは動かなくなります。これから先、各主要ブラウザは次々とFlashを拒否し始めますし、Adobe Flash Playerプラグインさえ自ら動作を停止するようになります。

例えば、つい先日公開されたmac向けsafari 14では既にFlash対応が打ち切られているそうです。この「対応打ち切り」という言葉はなかなかに曖昧ですが、safari12で対応を打ち切られたFlash以外のNPAPIプラグイン(Java Appletなど)の様子を見るに、おそらくプラグイン自体の認識がされなくなったのだと思われます。つまりどう頑張っても動かないと考えられるのです(筆者はまだFlashで遊びたいのでアップデートしておらず、断言できません。ごめんなさい)。

また、Windows系(Edge2種とIE)については公式のこの記事が参考になります。2021年以降、あるバージョンより古いAdobe Flash Playerを読み込まなくなるようです。この記事によれば2021年夏くらいまでは動作のためのAPIが残っていて無茶をすれば動きそうに見えるのですが、実際は無理でしょう。これについては後述します。

Chromeについては、ChromiumのFlashに対するロードマップが参考になりそうです。どうやら、2020年以降、全てのバージョンのChromiumにおいてFlash Playerは"out of date"としてブロックされるようです(過去のバージョンについてはどうやるんだ?と個人的には疑問ですが…)。つまり動作は無理です。

Firefoxについても、残念ながら対応はプラグインの読み込み拒否。2021年以降の動作は不可能です。

そして極め付けに、Adobe Flash Playerプラグイン自身に時限爆弾が埋め込まれています。試しに、システムの時間を2021/12/31まで進めて、Flashを使ったサイトにアクセスしてみましょう。
Flashを丁寧に最新版に保ち続けてきた人は、Flashが生き生きと動いていたはずの場所に謎のアイコンがただ表示されるだけになるのではないでしょうか?そしてこのアイコンをクリックすると、無慈悲にもFlashの死を告げるページに飛ばされるのです。これが、前述したEdge等で夏まで動きそうに見えて動かないと思われることの理由です。どうやら、比較的最近のバージョンのAdobe Flash Playerプラグインはシステムの時間が2021年1月中旬以降だと実行を拒否するようなのです。

時限爆弾の作動したFlash Playerプラグイン
 ↑システムの時間を2021年にすると…動かない。

Flashは、やはり死ぬのです。ブラウザ開発者たちは、移行が間に合わなかった多少の価値あるゲームやアニメが巻き添えを喰らって死んでしまうのはセキュリティのための致し方ない犠牲だ、と考えているのでしょう。ただし、そういう考え方は技術者の倫理としては何も間違ってはいないのでブラウザ開発者やAdobeを責めるのは間違いです。Flash終了問題に決定的な悪者はいないように感じます。

抜け道はないのか

しかし、本当に延命はできないのでしょうか。あるいは、ゾンビの如く蘇る道は残されていないのでしょうか。実は、抜け道として機能する可能性のある方法は存在します。

古いブラウザ

例えば、古いブラウザと古いバージョンのAdobe Flash Playerプラグインを用意することです。
古いブラウザとは、現行ブラウザの数年前のバージョンや、長いことメンテナンスされていない昔のブラウザのことです。入手は難しいでしょうし、時には古いOSごと手に入れる必要が出るでしょうが不可能ではないでしょう。何年も前のバージョンのChromiumを自力でビルドするという手もあります。そこまでしなくても、古いバージョンのCEF(chromiumを埋め込むフレームワーク)を用いて自前でブラウザを構築してもいいでしょう。サービス終了が確定する前の古いブラウザなら、Flashプラグインを読み込んでくれる可能性は残っています。前述の通りよく使うブラウザを古いままにしておくわけにはいきませんが、専用と割り切って古いものを用意し使うぐらいなら耐えられます。
また、前述したAdobe Flash Playerプラグイン自身の時限爆弾は比較的最近のバージョンに限って埋め込まれているようなので、古いバージョンならおそらく動いてしまいます。 幸いにも、 ブラウザ用の古いFlashプラグインは非公式のサイトにゴロゴロ転がっています。また、新しいバージョンしかなくても、時限爆弾回避については毎回システムの時計を2020年に戻せばいいだけです。

CEFと古いプラグインで動く筆者自作の専用ブラウザ
 ↑CEFと古いプラグインで動く筆者自作の専用ブラウザの様子(ゲームはすずぬーと氏作の激突要塞!+)。よいこはマネしないでね。

ただし、これらの方法は相当危険な行為であることは間違いないです。PCや仮想環境をわざわざ用意して隔離するなど、そういう処置をした方がいいレベルです。Flash愛好家としては選択肢に入れたくても、技術者としては全くオススメできない、そんな方法です。元々セキュリティ的にマズいから従来の方法が止められるというのに、そのマズい方法を無理して使い続けるアプローチなのですから。

そして、後述する「ゲームが作者によって公開終了されてしまう」問題からも逃れられません。

ローカルへのダウンロードとFlashpoint

他の方法を探してみましょう。少しマシな方法に、swfファイルをローカルにダウンロードしてしまうという方法があります。特にお気に入りの少数のゲームだけ残しておけばいいや、という場合には有効な方法です。スタンドアロンのAdobe Flash Playerには時限爆弾が無いようなので、一度保存してしまえば問題なく動くのです。ただし、画像リソースなどをswfファイルとは別ファイルとして要求してくる場合は動作させるのにひと工夫必要なようでなかなか難しかったりします。

このローカルへの保存を大規模に行っているプロジェクトとして、BlueMaxima's Flashpointというものがあります。これは、 オフラインでもFlashゲームが実行できるように 、Flash (に限らず、Java Appletなども) の実行環境と大量のゲームを保存し、ローカル環境で動かせるように再配布してしまおう という取り組みです。ゲームランチャーとしてダウンロードでき、全てのゲームをローカル保存するタイプだとダウンロード量はなんと圧縮ファイルで413GBにも及びます。別ファイルでリソースが必要な場合も含めてゲームを簡単にダウンロード・起動できるように作られている優れものです。

Flashpoint経由で起動した弾幕ゲー
 ↑Flashpoint経由で起動したD4U氏作の弾幕ゲー俺俺大作戦]

しかしながら、この方法もまた大きな問題を抱えています。僕が好きなあるJava Appletゲーム作者さんは2015年以降あらゆる媒体で音信不通なのですが、最近できたこのFlashpointにゲームが収録されているのです。個人サイトやブログでの報告も無しに。おかしな話ですね…そう、実はこのFlashpoint、 一部(というかおそらくほとんど)で 無断転載をしている のです。一度勝手に収録した後に作者さんからの要望で削除した例があると公式のFAQでも認めています。それに、Flashを実行できる環境(つまり古いAdobe Flash Player)自体無断配布の可能性が高いです。そもそもこのプロジェクトは、この記事によれば「合法かを気にしている場合ではない、ゲームには失うにはあまりに大きな価値がある、まずはとにかくサーバーから消される前に保存しないと」という考え方で進められているようです。
また、別の問題として、オフラインが売りであるがために、サーバーを必要とするオンラインゲーには対応できないという問題もあります(対応できたところで人がいない気もするけれども…)。そして先ほど述べたように作者の意向で削除されるゲームもあるようなので、全てのゲームをカバーすることは不可能です。

無断転載を問題と考えるなら結局はFlashpointに頼らず個人で保存する方法に戻ってくるわけですが、先述のリソースファイルを別で要求してくる場合とは別の理由であまりよろしくない場合があるのが悩み事です。 作者さんとしては自分のサイトを訪問してほしい と考えていることがあるようで、直リンやダウンロードが一筋縄ではいかないように工夫を凝らしていることがあるのです。工夫されていても開発者ツールなどを駆使して頑張ればダウンロードできてしまうのですが、作者さんが望んでいることではないのは明らかです。

古いブラウザでネットの海を渡るよりは安全ですし、いつまでも遊べる可能性が高い有力な方法ですが、(特にFlashpointについては) 権利的・倫理的に問題が無いとは言えなさそう です。筆者自身は、swfファイルのローカル保存は作者さんが認めている場合に限って行うようにしています。

未完成の救世主、ruffle

倫理的にもセキュリティ的にも問題のない方法、となると昔のように普段使いの最新のブラウザでサイトを訪れてFlashで遊べる方法を探す必要がありそうです。そんなことができる方法が残されているのか…はい、あります。オープンソースのFlash Player、ruffleです。 ruffle もまた、Flash文化の保存を目的として作られました。 ruffleはRustで書かれていて、Flashを新しいweb技術であるWebAssemblyに変換する機能を持ちます。つまり、ただ実行できると言うだけでなく、理論上はパフォーマンスや安全性も新技術相当まで向上しうると言うわけです。

ruffleで動くゲームの様子
 ↑ruffleによってGoogle Chrome上で動くゲームの様子(すずぬーと氏作地面防衛軍

さらに、ruffleは利用方法が幅広く用意されていると言う利点も持ちます。Adobe Flash Playerのように、ローカルにあるFlashを(変換して)実行することができるのはもちろん、ChromeやFirefoxの拡張機能(これは昔ながらのプラグインとは別の概念です、ここでは詳しくは触れません)としてインストールすることで訪れたwebサイト上のFlashを変換することもできます。それだけではなく、なんとFlash作品を公開する側も使用することができ、FlashとともにFlashをWebAssemblyに自動変換するコードを配信できます。つまり、Flash作品の作者側が対応した場合には訪問者は特別な準備をすることなく懐かしのコンテンツで遊べるのです。作者側でも訪問者側でも使用でき、WebAssembly相当までパフォーマンスやセキュリティも向上しうる。完成すれば非の打ちようが無いFlash救済策になるでしょう。…そう、完成すれば。

実はruffleは 未完成 で、現時点では一部の古い(詳しく言えば、ActionScript2以前を利用する)Flashゲーム・アニメの、さらに一部のみに対応しています。新しめ(といっても2008年ごろ以降ですが…)のFlashへの対応や、未対応の古いFlashへの対応は現在急ピッチで進められていますが、どうもこのペースだと 2021年には間に合いそうに見えない のです。

ruffleが未対応でローディングで固まってしまったゲーム
 ↑ruffleが未対応でローディングで固まってしまった、くろすけ氏作たんしおウォーズ(静止画だとわからないですが固まっています)

とはいえいつかは遊べると考えれば問題ないようにも見えるのですが、残念ながらここには大きな問題が存在します。 将来またFlashを遊べるようになるかもしれないよ、ということをFlash作者の方々に伝えておかないと、作者の手でサーバーからゲームが消されてしまう可能性が高い のです。これは先程述べたFlashpointの作者が最も懸念していたことです。まだ発展途上のruffleは知名度もまだ高いとは言えず、完成度が上がってよく知られるようになる頃にはもう手遅れになってしまうかもしれません。

筆者からのお願い

読者の中でも勘の良い方はもうお気づきかもしれませんが、この記事はruffleの知名度を高めようという意図で書かれています。Flash文化の保存のためには、 「将来にわたってFlashが動く方法があり、その具体的実装も進んでいる、だから作者の方々にはFlashゲームを消さずにそのままにしておいて欲しい」 ということを2020年のうちにできる限り拡散していかないといけないのです。

このことを踏まえて筆者からのお願いは3つです。

ご協力をお願いします。

Mocho icon
この記事を書いた人
Mocho

サウンド班に入ったはずなのにプログラミングしてる人。

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2021年8月12日
CPCTFを支えたWebshell
mazrean icon mazrean
2021年9月21日
ISUCON11 traP CM制作についての小話
dan_dan icon dan_dan
2021年9月8日
五度圏⊃自然音階って…コト!?
kotoki_bis icon kotoki_bis
2021年9月3日
部活青春系エロゲで涙腺崩壊した話
mera icon mera
2021年8月30日
【夏休み自由研究】実例で学ぶ画像処理【Python】
d_etteiu8383 icon d_etteiu8383
2021年8月29日
エロゲソングを聞け!!!
onzw icon onzw
記事一覧 タグ一覧 Google アナリティクスについて