マギレコアニメの面白かったところ集

明けましておめでとうございます。

去年はマギレコのアニメ2期をめちゃくちゃ楽しく見ました。マギレコについては一度1期6話終了後に書いていた(マギレコアニメ中間感想 - すずしめにっき)のですが、それ以降書いていなかったので、面白かった・興奮した場面で章立てしてマギレコについての感情を書いておきたいと思います。

――という原稿を途中まで書いたまま放置していたのですが、主にアニメ版の結末についての妄想を書きたくて書いたものであって放送されてしまうと意味を失うので、今のうちに公開しておきます。あとで答え合わせしたい。


※ゲーム版マギアレコード第一部及びアルティメットまどかキャラストーリーのネタバレを含みます。

1期13話の灯花ちゃんの演説シーン

大前提として私は里見灯花ちゃんが大好きなことを書いておきます。が、ここでまず驚かされたのは演説自体ではなく演説を背景音楽にしたマギウスの翼の集会の様子。なんと秋野かえでさんがマギウスに加入していたのです。確かに数話前でかえでさんがドッペルを発動して不穏な空気はあったのですが、まさかマギウスの翼加入とは。「一部改変はあるけどアニメ用に縮めたくらいかな」との思い込みを打ち砕かれます。アニメ2期に向けての「話の筋がゲーム版とは変わっていくぞ」という宣言です。これに興奮させられたのは間違いないです。

で、灯花ちゃんのファンとして演説の内容にも触れておきましょう。灯花ちゃんの演説を書き起こしたものが以下になります。

魔法少女のみんな。
かつて希望を抱き、いつか絶望を振りまく魔法少女のみんな。
ねぇ、みんなは魔法少女になったとき、何をお願いしたの?
自分のために願った人、他人のため、夢のために願った人、いろいろだよね。
人間は、よりよい未来を夢見て、何かを願うことができるの。
それって、とってもすごいことだよね。
人類は1300万年かけて、文明を築き、社会をより良くし、科学を発達させてきた。
願う力が、ずっと人類を前進させてきたの。
それこそが、キュゥべえの持っていない、人間の願いのポテンシャル。
だとしたら、願いの力で奇跡を起こす魔法少女は、最も人間らしいといえるよね。


でも、現実はどう?
わたくしたちという感情は、誰にも顧みられることもなく、傷つき倒れ、その命を散らしている。
魔法少女は、ただ己の運命を嘆き、呪いを振りまくことしかできなかった。
しかも、わたくしたちの希望が、絶望が、都合のいいリソースとして消費されているとしたら?
誰かのためにこの感情が踏みにじられ、搾取されているとしたら?
そんなことが許せる?
ううん、絶対許せない。
わたくしたちは、誰かのための商品じゃない。
魔法少女の同志たちよ。
わたくしは信じてる。
この感情が願う力は、わたくしたち自身の運命だって変えられる。
きっとキュゥべえだって想像もしてない。
魔法少女は、どんな奇跡だって起こせるの。
わたくしたちの希望は、誰にも利用させない。


マギウスはみんなに未来をあげる。
わたくしの作ったドッペルシステムがあれば、もうソウルジェムが濁りきって、魔女化することはないんだよ。
マギウスは、一人でも多くの魔法少女を救いたい。
みんなも協力してくれるよね?
あなたたちはマギウスの、ううん、今を生きるすべての魔法少女の翼となるの。
もし邪魔するやつがいたら、みんなで力を合わせてやっつけよう?
マギウスは、魔法少女の明日へと続く、たったひとつの道しるべ。
わたくしたちは、必ず魔法少女を解放する。
そう、魔法少女は、マギウスによって救われるの!

灯花ちゃん~~~というかんじ。演説がうまい。なんとなくナチスっぽい印象を視聴者に与えつつ、革命家としての里見灯花ちゃんが本領発揮する場面です。

私がこのマギアレコードの物語が好きな理由の一つは、設定の社会に対する批評性です。「持つ者」と「持たざる者」の物語。あるいは「強い者」と「弱い者」の物語。Brexitやトランプ現象以降の世界でよく語られる「忘れられた人達の叛乱」をストーリーの中に組み込み、そして物語としては「どちらが正しいか」で回答を与えずに「勝った方が正義」とするような潔さが好きなのです。

蔑まれてきた神浜の「東」の魔法少女や能力が足りなくて日々悩む者。現状に不満をもつそういった「持たざる者」を里見灯花ちゃんはまとめ上げ、革命を起こそうとします。それに対峙するのが七海やちよや環いろはたち。魔法少女の過酷な運命にも関わらず、金銭的に恵まれていたり、友人がいたり、強かったりして彼女たちは相対的に現状に満足している。だから、犠牲を伴うマギウスの革命は受け入れられない。言わば、これは保守派が綺麗事とともに革命を叩き潰そうとする物語なのです。それをいろはちゃんの立場に沿って描いていくのが邪悪で、そういうところが大好きです。作者の思想は悪役に語らせろとはよく言いますよね。

加えて、持たざる者たちを率いている灯花ちゃんはじめとしたマギウスが才能にも金銭にも恵まれているという構図がいかにもインテリに率いられてきた現実の革命そのものですし、この演説の中にも現実の革命を想起させる要素があります。たぶん灯花ちゃん本人は怒りなんて感じていないと思うのですが、「ううん、絶対許せない」と怒りを表明し、怒りの感情で連帯を呼ぼうとしている。よく政治団体が「私たちは怒っています」と掲げているように、現状を変えるには怒りを利用するのがいいことを使っているわけです。「わたくしたちは、誰かのための商品じゃない」のところは大学で演説していた中核派の人を思い出してくすっとしてしまいました。

最後の方の盛り上がったところで出てくる「たったひとつの道しるべ」もなんとなくサッチャーの「この道しかない」を想起させますが、それ以上にまどマギ本編の印象的な台詞を悪役の演説で引用する悪辣さに大笑いしました。とはいえ、これも単なる悪趣味ではなくてよく考えられているはずです。本編における「道しるべ」は鹿目まどか、そして外伝たるマギアレコードにおける「道しるべ」はマギウスなのです。このマギアレコードの世界の立て付けは、円環の理と化したまど神さまが唯一触れられなかった世界だというものですが、それはつまりまど神さまによる救済を拒否した世界だということです。なぜ拒否するかといえば、それはまどかの願いに頼らずに魔法少女を運命から解放するから。本編ではほむらの愛で強くなったまどかの犠牲によって魔法少女が解放されたのに対して、外伝では弱い魔法少女たちが協力して魔法少女を救おうとするわけです。この世界ではまどかも死なないわけで、もうトゥルーエンドですよね。本編ストーリーに喧嘩を売っているような、マギウス――いや、里見灯花ちゃんが主人公の物語がマギアレコードなのです(断言)。

2期2話で万年桜のウワサが出てきたところ

1期の最後で仲間が軒並みマギウスの翼に入ってしまってからずっと思っていたのが「この先どう展開させるんだ」ということです。原作ストーリーではマギウスの翼に入ってしまった仲間達を徐々に取り戻していってから最終決戦に挑む訳ですが、それをやるには明らかに尺が足りない。すると七海やちよ軍にはいろはちゃんくらいしか残らないわけで、どう考えても戦力不足です。「鶴乃ちゃん編(第七章)はカットかなぁ」くらいのことを思っていたところで万年桜のウワサが登場し、「一気に進んだ!??」と驚いたのがここでした。

その後もいろいろ同時進行で話が進んで読めないので楽しかったです。遊園地がホテルと合体したところは吹きました。

2期4話のかえでがドッペルを出すくだり

黒羽根の衣装を着たかえでちゃんかわいい!……と思っていたのにドッペルが暴走してしまいバトルが始まります。ここの作画はほんとすごかった。何度も何度も観ました。

「今までだってこれからだって、かえでちゃんを助けられるのは誰?」「そんなのレナに決まってる!」はちょっと狙いすぎではと笑いましたが、それでもいいもんはいい。そして、明かされる「ドッペルを使いすぎるとドッペルの姿から戻れなくなる」という設定。ここで「は??」となりました。ゲーム版だと結構雑に使ってた印象(ゲーム的にも必殺技だし)だったので、そんな重い技だったとは…と*1。それにしても、ここでドッペルの姿でだけしかアニメ版で登場できなかった子たちはかわいそうでしたね……。

2期8話の天気予報

2期最終回。目の前の敵は倒して目的を達成し、一件落着といった雰囲気の中、ほむらは携帯でテレビを見ます。そこで語られるのは、スーパーセルは進路を変えて見滝原に向かうという予報。

ここは叫びました。いままで散々「ほんとにゲーム版と同じような結末に至るのか?」と思うような展開の差異があったわけですが、これは媒体を変えたことによる調整では済まされない、明確な展開の変更です。つまり、結末が変わるだろう、と。というのも、この後ゲーム版と同じ結末に至るためには、ワルプルギスの夜が神浜に来ることが必須の条件であると思われるから。ワルプルギスの夜が見滝原に向かえば、まどかは死に、またループを繰り返すいつもの展開になる可能性が高い。ゲーム版マギアレコードと同じトゥルーエンドにこのアニメ版では辿り着けず、バットエンドになるのではないかという予測が、この天気予報で立ってしまったのです。

で、そうなるとここまで様々なところで展開が違ったのも説明がついてしまう。「アルティメットまどかの救済を拒む唯一の世界」のはずが別の世界になってるじゃないかという違和感あるいはつっこみは、この世界でマギウスによる救済が失敗することによって整合性がとれる。何故か柊ねむさんが記憶を取り戻していたのも、ゲーム版のように灯花ちゃんが記憶を取り戻す過程を挟まなくても物語を視聴者に語るための設定変更であるとすれば合点がいく。つまり、この世界では何も解決しないまま三人+一人の過去をただ柊ねむが語るだけ語って幕を閉じる……。

まさかそこまで考えて…と震えましたね。いかにも邪悪で素晴らしい。

とまあこれはただの妄想ではあるのですが、そうなってほしいなぁ……と思いながら、この文書を残しておきます。

*1:灯花ちゃんねむちゃんのドッペルについては設定資料集に使いすぎると死ぬっぽい設定が書かれていましたが、それ以外はないはず…?

VRで巫女さんになりたい!(3)

なんと前回から一年が経っていますが、今日ふとやる気になってVRoidをいじったので、簡潔に報告したいと思います。
今回のテーマ(?)は、表情編集です。

f:id:suzusime:20210615022228p:plain
「う」

各回へのリンク

続きを読む

ことのは日記(3): Я постоянно слежу за вами.(『のけもの少女同盟』より)

連載企画「ことのは日記」は、日常で見て気になった、調べてみて面白いなと思った言葉や表現を紹介していく企画です。……が、今回は「漫画に出てきた外国語表現を調べてみた!」です。「漫画で学ぶ外国語」みたいな気持ちでお送りします。

第三回の今日は「Я постоянно слежу за вами.」です。

続きを読む

修士論文を提出しました

f:id:suzusime:20210217020130j:plain
修論提出〆切の日の早朝、大学のそばのコンビニに行った帰りに撮った朝焼け

 先日、修士論文を提出しました。
 そして今日発表をした結果無事受理されたようなので、(よほどのアクシデントがない限り)大学院修士課程を修了することになります。

 今後の進路はといいますと、就職です。
 某出版社の社内SE的な職に内定をいただいているので、四月からは東京に戻ってIT屋さんとしてやっていくことになります。

 D進を選ばずに就職を選んだのは、一言で言えばこのままこの道を続けていっても幸せに思えなそうだったからです。
 研究室の同期などは何も言われずとも好んでarXivをチェックしたり情報収集をしていたのですが、私にはどうもそれほどの興味が物理にはなかったようです。むしろ私がそういうことをしていた対象はプログラミングやITインフラ、それと社会科学方面のものでした。
 決して物理が嫌いというわけではないはずなのですが、こんなことになってしまったのは必要な知識が膨大すぎて溺れてしまったからに思います。研究をするために必要な論文を追いかけたりはしたのですが、知識の基盤がガタガタで、わからないことだらけで嫌になってしまったのだと、いま顧みると分析できます。

 ……なんて書くとネガティブっぽいのですが、進路についてはかなりポジティブな気持ちです。実は、コロナ禍だからと家にいた間ほとんど何も研究が進まなくて卒業が危うかったのですが、どうにか卒業して就職するぞという気持ちで頑張っていました。
 予定外の事象だらけで難航した就活だったのですが、やっと得られた内定先は天職なんではと思うくらいでした。やっぱり私は計算機で諸々するのが好きなのです。その技術で、私が好きな、私をここまで導いてくれた本やオタク文化に奉仕できるなら幸せでしょう。たぶん知らないことをいろいろ教われるであろう新人研修を楽しみにしていたりもします。
 それと、社会人博士など一度大学を出てから戻ってきた人を大学院でたくさん見たことも、いざまたどうしても研究がやりたくなったならば戻ってくれば良いのかな、と未練が少なくなっている理由だったりします。

 じゃあ理学部の物理に進んだことが間違いだったのかと言えば、この選択にも悔いはありません。アカデミアでやっていくぞという気持ちで、そんな空気の中で、いろいろと勉強したり夢を語ったり焦ったり悩み苦しんだりしてきたのは、私の財産です。その中で私の性質やら限界やらも見えました(ええ、短期目標がないとなにもできない人間です、私は……)。
 今思えば、三回生の課題演習がいろいろの転換点だった気がします。前期、怖い先生のゼミで軽く心を病んであまり大学にいけなくなり、一方で実験の楽しさと大変さを知り、後期は物性理論の楽しさを知りました。このときの感触では実験のほうが向いていそうだなと思いつつも、やりたいこと(とたぶん実験では体力がもたないこと)を考えた結果無理して理論系に進んだのが四回生の課題研究と大学院でした。まあ結果を考えるとあまり向いていないことを二年かけて証明したようなものだったのかもしれませんが、それでも妥協せずに思う道を行ってみたというのは、今後に悔いを残さないという意味でよかったと思っています。指導教員の先生にはたいへん迷惑をかけましたが……(放置系の研究室だったらきっと中退していたので、親切にしていただいた先生に本当に感謝しています)。

 と、そんな感じで六年間に及んだ高等教育機関での生活から離れることになります。
 京都も離れることになるので、今後一ヶ月は京都にいるうちにしておくべきことをしたいと思います(あと実は研究の諸々がまだ終わっていない)。本当は大学の友人と酒を酌み交わしたいところなのですが、このご時世だと何とも……。酒は無理でも声をかけてくだされば会いに行くので、よろしくお願いします。

Flashが終わる12月末までに我々一般人がしておくべきこと

[2021-01-23 追記]
2021年1月12日を過ぎても、後述のAdobeのサイトにてスタンドアロンFlash Playerは公開され続けています。
というわけで、昨年末までに急いでダウンロードする必要はなかったこととなり、煽るような記事を書いてしまったことをお詫びします。
なお、この記事はスタンドアロンFlash Playerの紹介として残しておくことといたします。
[追記終]

結論だけ知りたい人へ

前書き

長らくインターネットを支えてきたFlashが2020年12月31日を以て終了します。

詳細は公式の案内 Adobe Flash Playerサポート終了 を参照くださると良いのですが、

  • 2020年12月31日を以てサポート終了
  • 2020年12月31日以降、主要なブラウザでFlash Playerの実行が無効になる
  • 2021年1月12日以降、Flash PlayerではFlashが再生できなくなる

というところです。

特にこの後者が曲者で、最近のFlash Playerには(恐らくOSの時刻を見て)2021年1月12日以降は動かなくなるような、いわば時限爆弾的なコードが組み込まれているようです。つまり、Flash Playerをアンインストールしなくても、この日を過ぎると我々はFlashを再生することができなくなります

もちろん、Flashを終了させるのに相応の理由があることも理解はできます。
セキュリティの問題は無視できないでしょう。3年前に告知していて、他の技術に移行するための時間は十分あったというのも、提供側の言い分としてはもっともでしょう。

しかしながら、そのHTML5JavaScript、WebAssemblyに取って代わられるべきだったものは、あくまでサイトを彩るUI要素などとして使われてきたFlashではないでしょうか。我々が文化として親しんできた、動画やゲームといったコンテンツではないのではなかろうかと思うのです。
あくまで継続的にメンテナンスされるWebサイトの構成要素であれば、移行せよというのもわかります。しかし、基本的に「一回作ればできあがり、後はずっと楽しんでね」的なコンテンツに移行を求めるのは酷ではないでしょうか。
また、セキュリティに問題があるというのも、ネットサーフィンしてたら勝手に実行されてしまうといったシナリオを想定するからこそでしょう。
果たして、既に信頼している人が作ったFlashコンテンツを再生するのにFlashに存在するセキュリティホールが問題となるのでしょうか。ゲームがFlash以外で作られていれば、我々はexeというなんでもできる実行ファイルを実行するというのに、です。

Flashが終わってもFlashの思い出はなくならないと言うのは簡単ですが、やはり現物を見られるに越したことないでしょう。去る者は日々に疎し、です。

というわけでここでは、「移行」されることがきっとないような、しかし素晴らしいFlashの動画・ゲームコンテンツを、2021年1月12日以降も再生できるよう、我々が今しておくべきことの紹介をします。

スタンドアロンFlash Player

しておくべきことは一つ、Adobeが配布しているスタンドアロン版のFlash Playerをダウンロードしておくことです。

スタンドアロン版というのは、ブラウザに組み込まれたものではなく、それ単体で動くものという意味です。つまり、スタンドアロンFlash Playerは、動画プレイヤーのようにFlashを再生できるプログラムです。

スタンドアロン版であれば、ブラウザ側のサポート終了は関係ありません。
PCの時計をいじって2021年末にしてもこのスタンドアロンFlash Playerは実行できたので、おそらく実際に2021年1月12日以降になってもスタンドアロン版は動き続けるものと思われます*1

というわけで、このスタンドアロン版が公開されている12月の間にダウンロードしておくべきです。
なお、12月8日に最終版が出たということなので、これ以降のアップデートはないはずです。

一応この12月8日版(ver. 32.0.0.465)のSHA256ハッシュを貼っておきます。

PS ****> Get-FileHash -Algorithm SHA256 flashplayer_32_sa.exe

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          A4B333AC1DA12026989549015303D82231982838BCCFB544BA5FD188746066F0       *******

ダウンロード方法

開発者向けページである Adobe Flash Player - Debug Downloads にアクセスします。

Windowsの項目にある Download the Flash Player projector をクリックしてダウンロードします。すると保存される flashplayer_32_sa.exe というのが件のスタンドアロンFlash Playerです。

f:id:suzusime:20201210233008p:plain

(※Mac版がほしい人はMac版のFlash Player projectorをダウンロードしてください)

使い方

Flashファイル(拡張子swf)をドラッグアンドドロップするだけです。

f:id:suzusime:20201210235337p:plain
「チルノのパーフェクトさんすう教室」が再生されている様子

ご存じない方もいらっしゃるかもしれませんが、よくWebページ上で動いているFlashの本体は、たいてい拡張子swfのファイル一つです。
つまり、これをダウンロードしてくれば、スタンドアロンFlash Playerで再生できます。

このswfファイルはチルノのパーフェクトさんすう教室のページのように「お持ち帰りはこちら」とダウンロードしやすい形にしてくれていることもありますし、そうでないこともあります。そうでない場合は、Webページのソースを表示して「swf」でページ内検索して探してみましょう。

f:id:suzusime:20201210235819p:plain
みんな大好きホームランダービースタンドアロンで動きます


ただし、swfの1ファイルで完結していない場合(外部のファイルを読み込んでいたりランキングを実装している場合)はうまく動かないはずです。
試したものでは、「ステラのまほう」公式サイト - すたーらいなー(パズルゲーム)は動きませんでした*2

その他の手段について

スタンドアロンFlash Player以外でFlashを再生し続ける方法を紹介しておきます。

ふらっしゅえぁえぐぜ

forest.watch.impress.co.jp

FlashAdobe AIRのexeに変換して、以降もAIRの環境さえあれば動くようにしてくれるツールのようです。
試してはいませんが、Adobe AIRを使うわけですから、Flashが崩れるといったことはないのではないかと思います。

Ruffle

ruffle.rs

Rustで書いたFlash処理系をWebAssemblyにコンパイルすることで、以降もブラウザでFlashを(セキュアに)動かし続けようというプロジェクトです。

ただ、今のところ開発途上で、特に ActionScript 3 についてはほとんど実装されていません。いくつかのFlashファイルで試してみましたが、まともに再生できたものはありませんでした。

結び

以上、スタンドアロンFlash Playerの紹介でした。お役に立てば幸いです。

  * * *

ところで、動画やゲームの作成ツールとしてのFlashにはきちんとした代替ができたんだろうか、などと割と長らく考えていました。

私がFlashを触っていたのは、中学・高校時代にパソコン部で部活紹介動画(エロゲOPのMAD)を作って新入生歓迎会で流したときくらいなのですが、私が10年遅く生まれていて今同じようなものを作ろうとしたらなにを選ぶんだろう、なんて思います。
AviUtilsになるでしょうか。

イライラ棒や脱出ゲームを作りたくなったら?
Unityでしょうか。でもUnityは用件に対して過大すぎる気もします。
P5.js?Phaser? それともHaxe? それは果たして普通の高校生に扱えるものなんでしょうか。GUIの開発環境は整っているのでしょうか。

基本は動画だけど何周もするとちょっと変わるギミックを作れるような新しい形式はどこかにあるのでしょうか。

ベクタ画像で動画を作るツールはどこにあるのでしょう。少し前にチルノのパーフェクトさんすう教室を先輩の家の4Kディスプレイで見たのですが、あまりの美しさに感動してしまいました。

「MP4などのラスタ画像の動画」と「Unityでつくるゲームのような重量級のコンテンツ」の狭間くらいのものを「プログラマでない人でも直感的に」つくれるツールがないのなら、その状態でFlashを終了させるのは無責任ではなかろうかと思っていました。

……が、最近Flashの代替たりうるものを知りました。Adobe Animateです。
なんと、Adobe Flashの直接の後継ソフト。あまりにも無知でした。

こいつはFlashみたいにコンテンツを作って、HTML5+JavaScript等の現代的な形式で吐き出してくれるソフトです。いいじゃん。

まあ「Animateで脱出ゲームを」みたいな話はぜんぜん聞きませんが、それはきっと無料のソフトでどうにかしようという人が多いからでしょう(私のアンテナの問題かも)。
でもこれはAdobeのせいではないです。Adobeは文化に対する責任(とは?)をきっちり果たしていたんだな、と思うなどしました。

*1:スタンドアロン版をわざわざ使う人のために時限爆弾(安全装置)を用意する義理はありませんしね。

*2:ブラウザの開発者ツールのネットワークタブで読み込んでいる外部リソースが見えるので、この外部リソース群もダウンロードしてきてswfと同じパスに突っ込めば動く気がしないでもないですが、それよりはくろば・U先生にexe化したものを公開してもらえないか聞いてみた方がいいだろうなって思っております。

ドラッグアンドドロップされたファイルをWSLのコマンドに渡すバッチファイル - その2

以前書いた記事の補足というかおまけというか。

suzusime-log.hatenablog.jp

前回の記事の「その他の方法」のところで、RubyPythonスクリプトドラッグアンドドロップで起動するためにはレジストリを弄るか2ファイルに分ける必要があると書いた。

しかし、1ファイルかつレジストリを弄ることなく、ドラッグアンドドロップされたファイルを引数に取るRuby等のスクリプトを起動する方法があることを知った。というわけで、この方法を追記しておく。

Rubyの場合

早速結論を示そう。

前回も取り上げた、ドラッグアンドドロップされたファイルをffmpegでmp3に変換するスクリプトRubyで書いたものが以下である。

chcp 65001
cd /d %~dp0
ruby -x %0 %*
exit /b 0

#!ruby
# 与えられた全入力ファイルに対してループ
ARGV.each do |infile|
  # ファイルのwslでのパスを取得
  infile_wsl = `wsl wslpath -a '#{infile.gsub(/\\/, '/')}'`.chomp
  # 拡張子をmp3に変えたものを出力ファイル名にする
  outfile_wsl = "#{File.dirname(infile_wsl)}/#{File.basename(infile_wsl, ".*")}.mp3"
  # ffmpegを実行
  system("wsl ffmpeg -i '#{infile_wsl}' -ab 192k '#{outfile_wsl}'")
end

これを 拡張子batで文字コードUTF-8)保存してやると、ドラッグアンドドロップされたファイルを引数として実行できるファイルが完成する(なお、RubyWindows側にインストールされていて、rubyコマンドプロンプトで入力すれば呼び出せる状態になっている必要がある)。

え? 「Rubyスクリプトじゃなくてバッチファイルじゃないか」って?

……これが今回紹介する手法である「Rubyスクリプトとしても実行できるバッチファイル」である。

要するに「バッチファイルからRubyスクリプトを起動する方法だと2ファイルになってしまうけど、じゃあRubyスクリプトを自分自身に書いてしまえば1ファイルで済むよね」と、そういう話だ。

別にこれは私が考えたものではなくて、「複数のプログラミング言語として解釈可能なプログラム」は polyglot という名で呼ばれている*1

en.wikipedia.org

「超絶技巧プログラミング」とか言われているような非実用的なお遊びプログラミングの方面の手法という印象が強かったのだけれど、こういう風に実用的に役立つ場面もあるのである。

さて、上に貼ったWikipediaにはPerlとしても実行できるバッチファイルとして

 @rem = ' --PERL--
 @echo off
 perl "%~dpnx0" %*
 goto endofperl
 @rem ';
 #!perl
 print "Hello, world!\n";
 __END__
 :endofperl

が紹介されているが、似たことをするにしても私の記したRubyの例は少し黒魔術感が減っていると思う。 これは ruby-x オプションという便利なもののおかげである。

-x[directory]

メッセージ中のスクリプトを取り出して実行します。スクリプトを読み込む時に、#!で始まり, "ruby"という文字列を含む行までを読み飛ばします。スクリプトの終りはEOF(ファイルの終り), ^D(コントロールD), ^Z(コントロールZ)または予約語__END__で指定されます。

ディレクトリ名を指定すると、スクリプト実行前に指定されたディレクトリに移動します。

これで前半のバッチファイル部分は読み飛ばしてくれるから、Wikipediaの例のように頑張って文字列リテラルに見せかけたりする必要はないのである。

Perlの場合

ruby-x オプションとほぼ同じ働きをする -x オプションがPerlにもある。というかRubyのオプションはおそらくPerl由来である(要出典)。

なお、ドキュメントには

-x
-xdirectory

メールのような大きな無関係のテキストのかたまりの中にプログラムが 埋め込まれている事を Perl に伝えます。 最初の #! で始まり、"perl" という文字列を含む行までの、先行するゴミは 捨てられます。 その行にある意味を持つスイッチは適用されます。

(後略)

とある。 polyglotは後から出てきた使い方で、この機能は本来メールでプログラムやパッチをやりとりしていた時代の遺物なのだろう。

面倒なのでmp3変換の例は書かないけれど、ほとんどRubyと同じ使い方ができるはずだ。

Pythonの場合

Pythonの場合も同様のことはできるのだが、事情は少しだけ異なる。

-x

Unix 以外の形式の #!cmd を使うために、ソースの最初の行をスキップします。これは、DOS専用のハックのみを目的としています。

とのことで、最初の1行しか読み飛ばしてくれない。

だが対応策は単純で、バッチファイル部分を1行に収めればよい。

chcp 65001 & cd /d %~dp0 & python -x %0 %* & exit /b 0
#!python
print("Pythonから話しかけています")
import time
time.sleep(5)

シェルスクリプトでの;に相当するコマンドの連結が、バッチファイルでは&でできるので、それを使って改行をなくしてやるだけである。

結語

以上、バッチファイルとして各種軽量プログラミング言語スクリプトを実行する方法を紹介した。古典的な方法であるが、バッチファイルで苦労する機会が減らせるかもしれない。

なお、これと同様のことはバッチファイルではなくLinuxシェルスクリプトでも可能だが、シェルスクリプトならヒアドキュメントを使ってもほぼ同じ事が実現可能である(そしてヒアドキュメントのほうが素直だと思う)。

*1:polyglot の本来の意味は「多国語に通じた人」「多国語で書かれた書物」等。