本当に信頼できる相手にしか、本物の魔法は見せてはならない―無数の解釈を許す、あの日の思い出:うらら迷路帖 第07話 「祝詞と魔女、時々覚悟」

Posted on

日本人読者の皆様におかれましては、「現代文の試験」の洗礼を受けたことかと思います。小説として商業出版されている日本語の文章の一部が、まるでまとめサイトのスレ抜粋みたいに切り貼りされた状態で印刷されてて、Togetterで赤字にするようなノリで傍線部が引かれてて、「これはどういう意味か4択の中から答えろ」ってクイズが始まるとか、そんなやつです。アレですよ、アレ。

あの「問題」が成り立つ裏には、1つの暗黙の了解、「公理」が流れています。つまり、「物語の読み方と解釈には一意性と正解があり、それがわからないお前はカスであり、知的動物ではなく、人間が食料としても何ら道徳的問題がない」ということです。

今日は、その了解が成り立たないか、あるいは成り立たなくてもよいことにした瞬間に突然面白くなる、魔女の女の子と、もっともっと小さな女の子の、魔法の秘密の物語についてお話しましょう。

物語の流れはおおよそコミックス版と同じですが、物語の主題が1つに整理されて、効果的な映像演出などが加わってより抒情的になってる(とわたしは思う)アニメ版をベースとします。

あらすじ

小さいころから、ほしいものは何でも簡単に手に入った。

「アンシャンテ、お嬢さん!」

そんなあたしが、唯一手に入れられなかったもの。

世界で一番憎らしくて、世界で一番大好きな人。

小梅の回想

主要キャラの1人、「小梅」の、今よりずっと昔、彼女がもっと幼かった頃のお話です。

小梅は巨大財閥「雪見家」の1人娘。親におねだりすれば、何でも簡単に手に入る。

そんな何一つ不自由ない暮らしをする彼女の元に、ある日「マリ・キスピルクエット」というフランスからの留学生がやってきます。

初めて出会った異国の少女。そして、魔女。

そんな彼女は、さっそく小梅をフランス語の「梅=プリュネ」から取って「プー」と呼び、そして、いきなり、おでこに、ちゅ!

「今のは呪いのキスよ!魔女流の、あいさつなの!」

「ななな、な、なにそれ!『呪い』って、わたし、どうなっちゃうの!?」

「あたしと、とっても仲良くなれちゃうのっ!」

「!?」

自由奔放ですね。そんなマリが繰り出すたくさんの「魔法」に、小梅は驚きます。

「マリって…何者なの…?」

「言ったでしょ、魔女だ、って。
 こう見えても、300歳よ!魔女は長生きなの!」

「すごい!…30歳くらいかと思ってた…」

「失礼ね!! こう見えてもまだ18歳よ!!

「なんでそんな嘘ついたの…!?」

小さな小梅は、突然やってきた「魔女」に、興味津々です。

「ねぇ、どうしたら魔女になれるの…?」

「うふふ!わたしは魔力を得るために、人魚をフライにして食べたのよ」

そんなマリとの日々が、小梅は楽しくてしょうがないご様子。

マリは悪戯好きで、いじわるで、嘘つきで、天下無敵。

物知りで、お茶目。可愛くて、お洒落。

ちいさなわたしは、マリの全部に夢中になった。

そんな不思議な力を小梅に見せてくれるマリですが、小梅のパパやママは全く信じていません。

「マリってすごいんだよ!魔術が使えるの!」

「マリは手品が上手なんだなぁ」

「ほ、ほんとだもん!」

「小梅をからかってるのよ」

「マリは本物の魔女だよっ!」

マリのすごいすごい「本物の魔法」を一切信じてくれないことに、小梅はいら立ちます。でも、マリは気にしていない様子。

「もう、頭に来ちゃう。お父さまも、お母さまも、信じてくれないの」

「いいのよ、そういうもんだし」

「えぇ!?」

「それより、わたしは勉強しないと。そのために、この国に来たんだもの」

「お勉強って、何の?」

「東洋の魔術よ」

マリは何のためにこの国に来たのか。それは勉強。では、それは何のため?

「わたしは箒で世界中を旅して、魔術を学んで、世界で一番の魔女になるの。それが、あたしの夢なのよ」

「世界で、一番の魔女…」

「でも、これは秘密事項よ!魔女はミステリアスじゃなきゃお洒落じゃないもの!
 口封じのおまじないよ!」

「世界で一番の魔女になる」という彼女の夢をかなえるため。それが目的ですから、魔法がインチキだと他人に思われたところで、彼女は一切意に介しません。

一方の小梅は、それでもやっぱり、マリが本物の魔女だと信じてもらえないことがどうしてもご不満です。あんなにすごいのに!

そこで小梅は、マリが昼寝している間に、彼女の箒を盗んで、屋敷の一番高い窓から飛び立つことで、みんなに魔術を見せて信じてもらおうと画策します。

みんなに魔術を見せれば信じてもらえるよ、マリは本物の魔女だって。

(窓の前に立つ小梅)

マリの箒があれば、飛べるはず…。

(二階から下を見下ろし、思わず震える)

マリのためだもん!絶対飛べる…

かくして覚悟を決め、箒にまたがって飛び降りる小梅。

…しかし、あれれー!?

本物の魔法の箒のはずなのに、まったく飛べません。このままでは、地面に激突してしまいます!

「マリー!助けてー!」

ぱちん!と指がはじける音がすると、箒は空を飛ぶようになり、小梅は難を逃れます。

そこに現れたのは、もちろんマリでした。

「意外と勇気があるじゃない。
 でも、ちょっとオイタが過ぎるわね、プー」

そのマリは、まったく仕方がないわね、と言わんばかりの、ちょっぴりあきれたような、でも優しい、そんな顔をしていました。

そうして「勇気」を認めてもらった小梅は、「本物の魔法の箒」に2人でまたがり、夕焼け空を散歩します。

「すごい!やっぱり飛べたね!」

「あったりまえでしょ!魔女だもの。
 …でも、魔術は本当に信頼できる人にしか見せちゃダメなの。
 だから、内緒にしておいて。じゃないと、色々厄介だから」

「なんで?すごく、かっこいいのに」

「それがわかんないなら、プーはまだまだ『プチプチプリュネ』ってことよ」

そんな楽しい毎日に、突然終わりが訪れます。

それからしばらくして、マリの言葉の意味が分かったの。

冬。原因不明で医者も匙を投げる疫病が、町で蔓延してしまいます。新聞の1面も、感染者が急増したことを危機感を持って伝えています。なお、この作品は2017年放映ですので、そこんとこはよろしく。

雪見家の主とその妻に、メイドが震える声で報告します。

「あの…奥様…。町で噂になっているんです。
 病を呼び寄せたのは、雪見家に居候している魔女じゃないか、って」

「何を、バカバカしい」

「ですが、雪見家の信用にかかわります!
 小梅お嬢様にも、悪影響があるかもしれません…」

マリはその様子を、陰からこっそり、これまでで一番真剣なまなざしで見つめます。

「わたしたちは、君のことを疑ったりはしない。だけど、このまま町に留まるのは君のためにも…」

「ええ、分かっています、旦那様。プリュネのためにも、フランスへ帰ります」

「…すまない…」

「そんな顔をなさらないで。厄介者扱いには、慣れっこですわ」

達観したような笑顔で帰国を決めたマリ。

ですが!

小梅はもちろん!

そんなの嫌に決まっています!

「やだ やだ やだ やだ!
 なんで!?
 マリは悪い事してないのに!
 マリが帰るなら、小梅も一緒に仏蘭西に行く!
 マリの弟子になって、魔女になる!!
 …お願いだから、小梅も連れてって…!」

「あのねぇ、魔女になるってそんなに簡単じゃないのよ?
 プーみたいな泣き虫は、弟子にだってなれないわ」

「なれるもん!魔女になって、マリをいじめる人の事を全員呪ってやる!」

「うっふふふ!なっかなかいい事言うじゃない!ちょっとは素質、あるかもね」

「…ほんと!?」

「そうね…じゃあ…」

あの「箒」を、小梅に渡すマリ。

「この国で一番の魔女になること。
 それができたら、あたしの弟子にしてあげる。
 …これは呪いのキスよ。小さな魔女に、試練と困難を。
 元気でね、マドモアゼル・プリュネ。」

そして意地悪で素敵な魔女は、フランスへと帰っていきましたとさ。

今ならわかるの。マリはきっと、魔女になんかなるなって、言いたかったんだって。

だから、「この国で一番」なんて無理難題を吹っ掛けたのよ。

だけど、思い通りにあきらめてなんか、やらないわ!

だから、わたしは迷路町に来たの!

マリとの出会いと別れ、そしてマリとの約束が、小梅が「うらら」と呼ばれる占い師、しかもその中での最高位である「一番占」になるために、何不自由のない自分の家を離れ、「迷路町」で厳しい修行の道を歩むようになった、決定的なきっかけだったのでした。

「秘密にしてたのに…」

「別に隠さなくていいじゃない?」

「それじゃお洒落じゃないもん!」

そうだよね、マリが言ってたとおり、魔女はミステリアスじゃなきゃあ、いけないもんね!

魔女の秘密を根掘り葉掘り

削れる台詞が中々無くて、長くなってしまいました。演技も映像もよいので、ぜひ実際に見て・聞いてみてくださいね。

ここからはこのエピソードを「解釈」していきます。

マリは誰にも心を開いていない、ただ一人小梅を除いては

このエピソードは、メタに言えば、まぁよくある、各キャラクターの自己紹介やキャラ付け、バックグラウンドの紹介のための、いわゆる「キャラ個別回」というやつになります。このエピソードを入れることでキャラクターの行動に説得力を持たせたり、キャラに深みを与えて小梅のことを好きになってもらおう、みたいな。そのためのエピソードです。

ですが、ですが!

この話は意図してか偶然か、そんな「お約束の枠組み」を超えた、それ単体で非常に面白いお話になってしまっています。

そうなってしまっている鍵を確認しましょう。

それは、もちろん。

小梅が箒で無謀にも空を飛ぼうとし、マリがその勇気を認めてくれた時の、この言葉です。

…でも、魔術は本当に信頼できる人にしか見せちゃダメなの。
だから、内緒にしておいて。じゃないと、色々厄介だから

このセリフから、マリのすごいすごい魔法を、どうして小梅以外、だれも信じてないのかの理由がはっきりと明らかになります。

そう。

そもそも単に、本物の魔法を、小梅以外の誰にも、見せていないから、です。

見せてないんだから、信じるわけないじゃないですか。とっても簡単な話ですよね?

そして、彼女はいくらこの国で社交的に、笑顔を振りまきながら、非常にうまくふるまっているように見えても、実は、小梅以外、だれも心からは信頼なんかしていないし、逆に小梅のことだけは心から信頼している事もわかります。

では、小梅が今まで見ていたものは?

ここで止めてはもったいない。さらに問いをつづけましょう。

マリは本物の魔法を、小梅以外には見せていない。

マリは本物の魔法を、小梅だけには見せている。

では、その小梅に、本物の魔法を見せるようになったのは、いつからでしょうか?

言い換えれば、小梅がこのシーンに至るまでに見ていたものは、本物の魔法だったのでしょうか

それとも、実はここまでのものは全部、ただの手品だったのでしょうか

すべての解釈を楽しんでしまえ

さて、日本の現代文の試験であれば、きっと「傍線部Ⅲ『魔術は本当に信頼できる人にしか見せちゃダメなの』とあるが、マリが小梅を『本当に信頼できる』と判断したのはいつか、50文字程度で説明せよ」といったクイズが始まり、そのクイズの出題者の解釈をくみ取って答えられるかどうかで、この世界の「うらら」、つまり「大学生」という「学者のたまご」にするかどうかの選抜を行うのでしょう。

ですが、今回は大学入試ではありませんから、その問いを立てるのはともかく、その正解を1つに決めるのをやめましょう

その代わりに、マリが小梅と出会ってからこのセリフが発される瞬間のすべて、それのどれもが正解でありうるとしてみましょう

すると、それぞれの解釈はどれもそれぞれに「美味しい」事に気づきます。これに気づいちゃったら、人間が求めて限りない、「唯一無二の絶対の真実」なんか、どうでもよくなっちゃいますよ?

可能性1:勇気ある行動を見て、信頼するようになった

比較的素直な解釈の1つです。「意外と勇気があるじゃない。」という言葉通り、この小梅の勇気ある行動を見て、「ふむ、こいつなら信頼できるな」と小梅のことをマリは認めて箒に乗せてくれた、とする解釈です。素直ですね。

この可能性をとると、実は小梅が今まで魔法だと思っていた数々の行為は、実は全部ただの手品だったことになります。漫画版には、この解釈を採用すると意味が文字通りになる、「マリが来てから毎日手品みたいに不思議で楽しくて」という独白もあります(p.87)。小梅と仲良くなろうとしていたのも、「留学先の子供を懐柔しとけば親の機嫌も同時に取れるし、雪見家とご令嬢経由でコネが作れれば、この先いろいろ好都合よね~」という程度の話であって、いままでのは全部ただの「ご機嫌取り」、「仲良しごっこ」、「処世術」でしかなく、小梅のことなんか、な~んとも思ってなかった、極論すれば、「留学先の大財閥のご子息」という「ラベルの貼られた人間」「社会的ロール」を通してでしか認知していなかった、という極端な解釈だってできます。

この可能性を採用してエピソードを見返してみてください。完全に違って見えるはずです。

可能性2:最初から信頼していた(少なくとも、ある程度は)

可能性1はいくらなんでも無理があるんじゃない?留学先の子供をあしらって機嫌を取るにしてもサービスしすぎじゃない?そこまでドライでは、流石になかったんじゃないの?

そういう意見も、もちろん妥当だと思います。

さて、マリは魔女ですよね。魔女は、この作品において「西洋のうらら(占い師)」とも呼ばれる存在です。ですから、小梅と出会った瞬間に、直感的に、呪術的に、あるいは「運命」や「星の巡り」のようなものを感じて、「この子は信用できるわね」と判断して、最初から完全に、あるいは「ある程度」は信用していた、そういう可能性もありましょう。

途中で「世界で一番の魔女になるのが夢なの」「でもこれは秘密事項よ」と夢を語るシーンに関しては、こちらのほうが素直に読むことができます。

この場合、今まで小梅が見てきた「魔法」は全部ほんもので、小梅以外からは見えないよう、魔法陣や結界を張って他の人からは隠していたのでしょう。しかし、それでも一部の『魔法』は「そこまでは見せられない(信頼できない)」ということで、やっぱり手品か何かだったのかもしれません。

そして、その「信頼度」も、ずっと同じだったわけではなく、この物語を通じて、上がったり下がったりしていたことでしょう。

この「最初はどれほど信用していたのか」「この時点ではどれほど信用していたのか」はいくらでも可能性が考えられますので、色々レベルを変えて見返してみてください。その「すべて」でエピソードの印象はそれぞれ変わって見えるはずです。

可能性その3:描かれてないだけで、小梅が覚えていない何かがあった(そうだ、二次創作しよう!)

このエピソードは、小梅の回想です。ですから、当たり前ですが、小梅が覚えていることしか(基本的には)登場しません。ですが、もちろんマリにはマリの意思があり、記憶があります。

ですから、「マリが小梅を信頼するようになった」のは、「実は小梅が記憶していない、この小梅の物語には出てこない、マリにとっては特別に感じられた、別のエピソードがあったからだ」、と解釈することだって可能です。ええ、一番現代文の教師が嫌いそうな解釈ですけどね。

この解釈を採用してもアニメ本編の解釈には直接の影響はありません(だって描かれてないんだから)が、二次創作してみるのにはぴったりな解釈・題材だと思います。

ぜひみなさんがその「エピソード」を紡いだら、ぜひわたしに教えてください。わたしも形にできたら、ひっそり公開しようかと思います。

もちろん、物語も魔法の1つ!、ということで、本当に信頼できる人にしか見せないのもアリかと思います。UGC 全盛で忘れ去られてる気がしますが、二次創作に限らず、べつに作ったものをみんなに公開しないといけないわけじゃ、無いんですよ?

うーん、小梅とマリの間に、何があったんでしょうね。とっても気になります。今日は寝れるかな?

アニメ版と漫画版、それぞれのアートワーク

本題とは一切関係ないのですが、この話は先述したとおり、おおむね原作漫画をなぞったうえで一部演出やセリフをカットしたり追加したものです。その中でも、とくにビジュアルや演出が光ったアニメ化になっていると感じました。

なかでもわたしのお気に入りは、最後に小梅が「困難と試練」を授けられるシーンです。

原作漫画はこんな感じです:

フランスへ帰る準備をするマリを止めようとするシーンになっています。

これが、アニメ版では別れ際に、雪が降り積もる中でのシーンに変わっています。

これがまたとても抒情的で、印象的な、小梅が大きくなっても忘れられないのも納得してしまう、そんな、幼い日の回想の〆にふさわしいシーンに仕上がっていると思います。

一方、漫画版だって負けてません。扉絵の次の1枚は、イラストレーターとしての「はりかも」の実力が存分に発揮された、想像を掻き立てられる、とてもすてきな一枚だと思います。単行本だと白黒なのが、本当にもったいない。

一応画集にはカラー版もあったり(セリフとの相乗効果はこれでは見れませんが…)

マリと小梅の毎日はきっとこんな感じだったんだろうな、とあれこれ想像させてくれる、落ち着いてるけど、にぎやか。言葉で表現すれば、そんな絵でしょうか。

一方で、アニメ版の冒頭に追加されているこのカットは、光の使い方も含めて、「あぁ、小梅にとってマリはそれほど特別な存在なのだな」と、初見ではなく、改めて見返した時にはじめて意味がわかる、とても印象的な一枚になっています。

いやしかし、ほんと、ここの光の使い方は本当に…とってもきれい。

アニメはいつ見ても面白いし発見がある

「今期何見てる?」もいいけどさ、好きな時に好きなようにアニメ見ようぜ。そして好きに語ろうぜ!流行りなんか気にせず、二次創作しようぜ!

蛇足:すこぶる正しい「5歳児から見た18歳」像

これどこに書くかなやんで思いつかなかったのでここにぶちこむんですが、このエピソードの「5歳から見た18歳」というものが、すこぶる正しく描写されてる感じがして、そこも好きです。そうそう、18歳と30歳の区別は、付かないですよねぇ(笑)。

ホレンテ島の魔法使い:「きらら」というカネとユメの汽水域、そしてその可能性

Posted on

何もかもがインチキだらけの「誰でも(お金があれば)『魔法使い』になれる」観光島、見えるすべてが胡散臭い、「夢と現の汽水域」。その名は、ホレンテ島。

…しかし、どうやら不思議な力は、本当に存在するらしい…。と、匂わせての二巻目、最終巻です。

二巻で終わる尺のせいかおかげか、次々に畳み込むように物語は進行していきます。
ぐんぐんと「魔法」の正体がキャラクターどうしの駆け引きの果てに明らかにされていき、これまたきれいに決めたジャンプのようにオチへと着地して、終劇!見事です。

久しぶりに、漫画を読んでいて息をのみました。
この展開やオチは一巻冒頭の残念魔法観光島漫画からは正直まったく想像できないもので、いい意味で後頭部をぶん殴られました。これも「魔法」でしょうか。

オチを見終わった後の表紙と、よく見ると一巻の英語版タイトル「Witch dream would you buy?」と違う二巻の英訳タイトルもいい味出してます。せっかくだから、どんなタイトルかは最後まで読んでから確認してみてね!

中盤の魔法の「カラクリ」がどんどん明らかになっていく展開は、ゆるい「ごちうさ」リスペクトものかと思われた一巻冒頭からは想像もつきません。心理戦も含めた構成はまるで少年漫画のようで、どんどん引き込まれていきます。一巻を読んでいた1年前のわたしにタイムスリップしてこのことを言ったとして絶対に信じないでしょう。とはいえ、1巻を見返す限り、このオチは最初からほぼ決まっていたように読めます。うーん、よくできてんな。

「カネ」と「ユメ」の汽水域、「きらら」

さて、作中でもメタ発言があるので、このレビューでもメタな話をしましょう。

二巻で終わったという事はおそらく人気が出なかったのだとは思います。
人気が出なければ、商業漫画は続くことができませんし、
人気が出れば、人気が出なくなるまでシリーズは続く。

それが、商業漫画…いや、商業芸術、「コンテンツ」というものの宿命です

が、しかし。二巻で終わる不人気さは、思わず引き込まれる、そんなスピード感をこの漫画に与えてくれました。

商業雑誌で連載される漫画という「商売」と、そこで展開される物語という「夢」の難しいバランス。

そのバランスの元かろうじて成り立つ「きらら」という漫画雑誌。

その連載作品たちが、先輩作品をリスペクトしながら、後輩作品へと派生・発展していく、「きらら」という文化。

その構造そのものが、「魔法の夢」と「ざんねん坂」が隣り合わせするこの島や、この漫画における「魔法」の在り様と、意図してか偶然か、見事に一致してるのも面白いです。

これは、まちがいなく怪作です。

前述したとおり二巻で終わってしまったので、きっと、万人受けするものでは無かったのでしょう。
でも、わたしには飛んでもなく突き刺さりました。
わたしもカトリネルエのように、「ホレンテ島に心を奪われ」てしまいました。

ホレンテ島の「魔法」のように、この漫画が断片となってこの世界から発散して人々から忘れ去られてしまっても、きっとわたしにとっては作中のセリフ通り、「きっとお婆ちゃんになっても忘れない」、そんな作品になるでしょう。

作中で回収しきれなかった伏線はいくつかありますが、それも、わたしの心の中でたまに「連載が続く」、そのための「魔法」なんですよ、きっとね。

暇だから会社作った

Posted on

こんにちは、とある合同会社の主任院生 (社員を当社では院生と呼ぶ。代表社員ともいう) です。社名は伏せさせてくれ。住所が出てくる。

TL; DR:合同会社の作り方

その1:次の書類のPDFを用意する:

  • 定款
  • 払込みがあったことを証する書面
  • 代表社員の就任承諾書
  • 代表社員、本店所在地及び資本金決定書の例

司法書士に頼むとお金がかかるのでGoogle docsで2時間ぐらいで作りました。テンプレがその辺に転がってるのでググってね。

その2:カードリーダーを買う

PaSoRiが無難です。e-Tax用って書いてあるやつならたぶん大丈夫です。

その3:法務省の出してるカスソフトで申請する

基本的に書かれてる通りにやるだけです。

その4:マイナンバーカードのデジタル証明書が切れてないか確認

切れてたら役所に行くと更新できるよ。証明書は5年で切れるよ。

その5:だいたい怒られるので直す

注意事項:

  • 申請だけでなくPDFにも署名が必要です
  • なぜか定款と同じことを記入させられますが、「.」の有無の表記まで一致させないと怒られます(人間に)

その6:カードリーダーが正しく認識するよう祈りをささげる

祈りながら「確定」をクリックする

「ICカードリーダの初期化に失敗しました」とほざく法務省の申請用総合ソフトの調教

その7:6万円払えと言われるので払う

ネットバンキングでオンラインでできます。ゆうちょでやりました。

その8:税理士事務所のDMが投函されたのを見て登記が完了したのを知る

法人番号はその数日後に法務局から届きます。

所感

ソフトの使い勝手はカス of カスだけど、一切紙を提出していないしマイナンバーカードの証明書の更新以外家でパソコンぽちぽちするだけで終わったので、そこはある程度「DX」ってやつは出来てると言ってよいのでは。

何するんですか

「富岳」をより簡単な申請ですぐに使える、試行課題のファーストタッチオプション開始 | 理化学研究所 計算科学研究センター(R-CCS)

これ使いたかったんですが、

 一般課題の課題代表者は、原則として法人(大学、研究機関、
 社団法人、企業等)に所属する方とさせていただいています。
 ※企業に所属される場合は、日本国内に登記された企業である
  必要がございます。

と言われてしまい、「所属」は同人サークルではダメだけど、適当に作った会社ならなんでもいいらしいので、これで富岳で遊ぼうと思います。

ちなみに、これが終わったらさっさと潰す予定です。めんどくさいね、人間社会。

まぁ、あれですよ、OS自作したりプログラミング言語自作したりレイトレーサー自作してみたりするのと一緒一緒。

維持費は?

年間7万円のサブスク代(法人住民税)が必要らしいので、とりあえずAdobeを解約しました。変な常駐ソフトが全部消えてパソコンが軽くなりました。Adobeの解約、おすすめです。

宗教法人にしなかったの?

すぐ「計算機を信仰する宗教法人にして非課税を狙おう」とかいう人居るんですけど、信者を集めて活動している実績をちゃんと証拠として求められるから、正直かなり大変だよ。大川隆法は5年麻原彰晃も4年ほど掛ってる。お前ら宗教なめてんだろ。

地方の後継者の居ない宗教法人を乗っ取るのが手っ取り速いかもしれないけど、それでもちゃんと宗教法人としての活動やってるかは継続的にチェックされるみたいだよ。

float32の中にNaNとかがいくつあるか数える

Posted on

お久ぶりでございます。最近はUnityでfloatと格闘しております(趣味で)。

ふと気になったのが、「ところで、floatの32ビットの中にNaNって何個ぐらいあるんだろう?」。

そんなわけで数えてみました。

ソースコード

#include <iostream>
#include <cmath>

int main() {
  uint64_t normal = 0;
  uint64_t subNormal = 0;
  uint64_t positiveZero = 0;
  uint64_t negativeZero = 0;
  uint64_t neutralZero = 0;
  uint64_t positiveInfinity = 0;
  uint64_t negativeInfinity = 0;
  uint64_t notANumber = 0;
  uint64_t unknown = 0;
  uint64_t total = 0;
  std::cerr << "Start" << std::endl;
  for (int64_t i = 0; i <= 0xffffffff; ++i) {
    total++;
    uint32_t const j = static_cast<uint32_t>(i);
    float const f = *reinterpret_cast<float const*>(&j);
    switch (std::fpclassify(f)) {
      case FP_INFINITE:
        if (f > 0) {
          positiveInfinity++;
        } else if(f < 0) {
          negativeInfinity++;
        } else {
          throw std::logic_error("Zero infinity?");
        }
        break;
      case FP_NAN:
        notANumber++;
        break;
      case FP_NORMAL:
        normal++;
        break;
      case FP_SUBNORMAL:
        subNormal++;
        break;
      case FP_ZERO:
        if (1/f > 0) {
          positiveZero++;
        } else if(1/f < 0) {
          negativeZero++;
        } else {
          neutralZero++;
        }
        break;
      default:
        unknown++;
        std::cerr << "Unknown: " << f << std::endl;
        break;
    }
  }
  std::cout << "Total: " << total << "(" << (((double)total)/((double)total) * 100.0) << "%)" << std::endl;
  std::cout << "Normal: " << normal << "(" << (((double)normal)/((double)total) * 100.0) << "%)" << std::endl;
  std::cout << "SubNormal: " << subNormal << "(" << (((double)subNormal)/((double)total) * 100.0) << "%)" << std::endl;
  std::cout << "Positive zero: " << positiveZero << "(" << (((double)positiveZero)/((double)total) * 100.0) << "%)" << std::endl;
  std::cout << "Negative zero: " << negativeZero << "(" << (((double)negativeZero)/((double)total) * 100.0) << "%)" << std::endl;
  std::cout << "Neutral zero: " << neutralZero << "(" << (((double)neutralZero)/((double)total) * 100.0) << "%)" << std::endl;
  std::cout << "Positive infinity: " << positiveInfinity << "(" << (((double)positiveInfinity)/((double)total) * 100.0) << "%)" << std::endl;
  std::cout << "Negative infinity: " << negativeInfinity << "(" << (((double)negativeInfinity)/((double)total) * 100.0) << "%)" << std::endl;
  std::cout << "Not A Number: " << notANumber << "(" << (((double)notANumber)/((double)total) * 100.0) << "%)" << std::endl;
  std::cout << "Unknown: " << unknown << "(" << (((double)unknown)/((double)total) * 100.0) << "%)" << std::endl;

  return 0;
}

かなり素直なコードです。40億回ループを回しても30秒もかかりません。最近のプロセッサすごい(5年前のモデルだけど)!

少しテクニックがあるとすれば…

  • std::fpclassify を使うと種類が返ってきます。知らんかった。
  • ゼロが正か負か判断するために(f == -0.0)を最初書いたのですが、これは必ずfalseらしい(CLion談)ので、1で割ることでプラスマイナスどちらかの無限大に飛んでいくことを利用して判断してます。
  • forでカウンターで回す限りはuint64_tを使わないとダメです。最初uint32_tにしたら0xfffffffの次が0になって無限ループになってしまいました。do while文ならuint32_tでも行けるかもしれない。
  • カテゴリ多すぎだろ気が狂うわ

結果

Total: 4294967296(100%)
Normal: 4261412864(99.2188%)
Sub Normal: 16777214(0.390625%)
Positive zero: 1(2.32831e-08%)
Negative zero: 1(2.32831e-08%)
Neutral zero: 0(0%)
Positive infinity: 1(2.32831e-08%)
Negative infinity: 1(2.32831e-08%)
Not A Number: 16777214(0.390625%)
Unknown: 0(0%)

使ってる環境は次の通り:

  • Ryzen Threadripper 1950x
  • Windows 10 64bit、よくしらんけどこの記事の時点で最新
  • コンパイラはVS2022、よくしらんけどこの記事の時点で最新

所感

ゼロと無限大はちょうど1つずつあるんだなぁというところに素直に関心しました。

非正規化数とnot a numberの数が等しいのも面白いです。なんでなのかは知らん。IEEE754の仕様書読んで教えてくれ。

IEE754はまぁまぁ複雑ですが、それでも変なケースを1%以下に抑えてるのはえらい…と言って良いのかな?

「ぼくのかんがえたさいきょうの浮動小数点フォーマット」を考えてみたくなりました。

まとめ

小学生の夏休みの自由研究でも許されなさそう

吉野家コピペ2022

Posted on

昨日、近所のCVE行ったんです。CVE
そしたらなんかGithub Issueに人がめちゃくちゃいっぱいで追いきれないんです。
で、よく見たらなんか垂れ幕下がってて、ロシアとベラルーシのIPアドレスだったらファイルの中身を片っ端から❤に置換、とか書いてあるんです。

もうね、アホかと。馬鹿かと。
お前らな、戦争如きで普段してないハッキングやってんじゃねーよ、ボケが。

戦争だよ、戦争。

なんかUnityHubとかもいるし。Vue.jsでデスクトップUI開発か。おめでてーな。
よーしパパ平和を祈っちゃうぞー、とか言ってるの。もう見てらんない。
お前らな、もっと純粋な悪意やるからその席空けろと。

OSSってのはな、もっと殺伐としてるべきなんだよ。
コードレビューの向かいに座った奴といつ喧嘩が始まってもおかしくない、
刺すか刺されるか、そんな雰囲気がいいんじゃねーか。チームビルディングされてる職業プログラマは、すっこんでろ。

で、やっと座れたかと思ったら、隣の奴が、これが難読化を解いたコードです、とか言ってるんです。
そこでまたぶち切れですよ。
あのな、こんな難読化は難読化とは言わねーんだよ。ボケが。

得意げな顔して何が、難読化、だ。
お前は本当にこのコードを読んでて難しいと思ったのかと問いたい。問い詰めたい。小1時間問い詰めたい。
お前、Base64って言いたいだけちゃうんかと。

OSS通の俺から言わせてもらえば今、OSS通の間での最新流行はやっぱり、
突然AGPL化、これだね。
今日からAGPLで頒布します。これが通のリリースの仕方。
AGPLってのはサーバサイドで動かしてもソース開示要求できるそん代わりAWSには勝てない。これ。
で、それに突然のリリース。これ最強。

しかしこれを行うとコミュニティにforkされるという危険も伴う、諸刃の剣。
素人にはお薦め出来ない。

まあお前らド素人は、上から降ってきた仕様書読んで書いてなさいってこった。


You may also see

Linuxが消えた:わたしのGithubのリポジトリには赤の他人の知らないコミットが含まれている

Posted on

さよならLinux

今日はびっくりしました。

毎日お世話になっているLinux。その作者がついに嫌気がさしてカーネルのリポジトリからファイルをすべて消去するという痛ましい事件があったからです。

まぁ30年書いてりゃ飽きるよね(?)

ドッキリでした

…というのはもちろん嘘で、これはLinuxの作者、Linus 本人によるものではありません。

では何なのか?といいますと、これは別人のforkされたリポジトリに書かれているものです。

でも、最初の画像はLinusのリポジトリのページだったはずです。おかしいですよね。

Githubはすべてのfork間でデータを共有している?

どうも、Githubでは

  • forkしたリポジトリすべてでデータを共有しており、かつ、
  • githubにはあるコミットIDが自分のリポジトリにあるかそうでないかの区別が付かない

ようなのです。

ブラウザだけでなく、gitを使っても、同じようにLinusのリポジトリからこのコミットを取り出すことができます。

# 初期化
% git init
Initialized empty Git repository in C:/Users/kaede/src/t/.git/

# Linusのリポジトリをoriginとして追加
% git remote add origin git@github.com:torvalds/linux.git

# 問題のコミットだけfetch
% git fetch --depth=1 origin 4fbc49920463c394fc2615f00ecc907a2ce943da
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 638 bytes | 70.00 KiB/s, done.
From github.com:torvalds/linux
 * branch            4fbc49920463c394fc2615f00ecc907a2ce943da -> FETCH_HEAD

# mainブランチにmerge
% git merge 4fbc49920463c394fc2615f00ecc907a2ce943da

# ファイルを確認すると…
% cat README
Hyy there. It's me, Linus Torvalds: See the URL, Where is says /torvals/linux/.

I have deleted my kernel because it is garbage. You should instead check out
this OS called Microsoft Windows Vista. It is much smaller and faster then linux
ever was.

...

いや…これ…シンプルに頭おかしい仕様だろ…

ジョークならいいけどさ

今回はジョークだから、いいですよ。でも、悪い大人が悪用したらどうなるんでしょうね?

Linusに限らず、自分のリポジトリのURLで自分の名前を騙って意見などを書くことができるわけです。フェイクニュースの情報源にぴったりです。今回の例なら、「Linux開発者がLinuxを削除!Linuxを利用しているIT企業への影響は…」みたいな「ニュース」を書いたら市場が動いたりすらするかもしれません。

フィッシングに使うこともできますね。「このコミットでセキュリティ問題を修正したらしい。詳しくはここのソースのn行目に書いてあるURLを見てくれ」と書いておけば、Linusのリポジトリなら信用できると思った人がリンクをクリックしてくれるかもしれません。

任意のソースコードを実行させることだってできるかもしれません。上記に書いた通り、gitのコマンドを通してコミットIDの時点のスナップショットが取得できます。「このリビジョンで問題が修正されてるらしいから、使ってみて。cloneは重いからこの方法でshallow fetchするといいよ」と言いながら複数行のコマンドを渡されたら、あなたは「Linusやその他有名な人・公式アカウントなどのURLなら大丈夫」と思ってターミナルにコピペしませんか?でもそのコミットは実はマルウェアが仕込まれてるバージョンかもしれません

最後に。オリジナルのリポジトリと同じSHA-1ハッシュのコミットが生成できれば、オリジナルのリポジトリを汚染することができるかもしれません。これはgithub側の実装次第なので、なんとも言えません。

ストレージが高いのは分かるけど…

なんでこんな事になってしまったのでしょう。

これは推測ですが、たぶんストレージを節約したかったからだと思います。Linuxのリポジトリは数GBありますが、それを4万回もForkされたときに実直にコピーしてたら数10TBになってしまいます。

悪意を抜きにすれば、forkしたリポジトリ間でデータを共有しても、とくに問題ありません。別人の書いたforkのコミットには、それぞれオリジナルの作者のものとは違うコミットIDが振られます。同じ根本から違う枝が生えるだけです。

しかし、セキュリティの面では悪手です。

今まで見た通りのことに加えて、最近信用性の下がってきたSHA-1が問題になってきます。SHA-1はGitでそれぞれのコミットを識別するために使われます。セキュリティ担保のためには使われれてません(本人談)。しかし、データを共有したとなると、これはセキュリティ問題になりえます。githubのgitの実装次第ですが、もし同じコミットIDをpushしたときに上書きされるような挙動になっていた場合、fork先がfork元のリポジトリを汚染できてしまうかもしれませんgithub社は内製のgitサーバを用いており、それを知るすべはありません。

どうすれば…

SHA-1はまだそこまで破られてはいないので気にする必要は今のところないかもしれません。ただ、コミットをgpgで署名してなりすましを防ぐのは有効かもしれません。まぁ、Gitの最初の開発者でもあるLinusは普段からしてないようですが…。

一応、githubには署名されていないコミットにフラグを立てる機能があるので、これを有効にするのもいいかもしれません。ただ、そのフラグを忙しい現代人(スマホを覗くとだいたい暇つぶししてますけど)が見てくれるかどうかは別問題です。

gitにもgithubにも飽きた

正直なところ、飽きた。もう14年?くらい使ってるよ。飽きたよ。githubも10年以上使ってるよ。飽きたよ。なんかない?

ハッピーライフ (feat. nicamoq)

Posted on

たまには曲の話をしようと思います。

曲調やジャケットはいわゆる原宿系?なかわいらしい感じ。
タイトルは「ハッピーライフ」。それに相応しく?クラブハウスで皆でノリノリになれそうな、アッパーなテンポの曲です。

しかしながらそんな表層に騙されるなかれ。

歌詞は
どうしようもなくダウナーで、
どうしようもなく絶望的で、
そして…どうしようもなく現実的なのだ!!!

今日は何曜だろう

幸せも残りわずかだ
明日も朝から 隣町へと 余生を売りにいこう

いまさら いまさら 後戻りなんて無理だね
ことさら ことさら 難しいわけないんだけど

でもそれがまたかわいらしい歌手の声やアッパーな曲調と奇妙にマッチしてていい感じなんです。音楽って面白いですね。

二番になるとさらに統合失調症の隣人(!)が出てくるのですが…

お隣が また騒いでる
アルミホイルを 壁いっぱいに 輝かせてるのさ

ぼくの鳴らす電子音が 悪い電波を発してるよと
ドアを蹴り続けてる

この後、1番にはなかった、隣人がドアを蹴る様子を模した「コン!コン!」という音が執拗に覆い被さるように鳴り始めるところで変な笑いがでてしまいました。この歌詞の気が狂いそうな雰囲気を、こう表現してきたか!


作曲と作詞と編曲が分かれていることが多いですが、すべてを同じ人間がやると、こんな表現もあんな表現もできるんだ!と感心した一曲です。


そういえば。曲を作るようになってから、よく言われているような「歌詞は自分の気持ちの代弁」なんかじゃなくて、明確に鑑賞対象になった気がします。今回のブログのように。

バニラ味の人体をblenderで作った

Posted on

今日は3Dモデリングをしたよ。

vanilla-flavored-human-body.blend: Vanilla flavored human body (blender model)

バニラ味の人体」をコンセプトに、男でも女でもなく、年齢もなく、服も髪も耳1もない、そんな人体をモデリングしてみました。野望としては、これをベースに複数のキャラクターが作れたらいいなと思ってます。

3Dモデリングめっちゃ大変なのじゃー!!

先日Appleも参加したblender、楽しいですよね(雑な導入)。2.8系になって操作体系がフレンドリーになってからというもの、小物や無機物などをちょくちょくモデリングして楽しんでおりました。

だけど、たまには生物もモデリングしてみたい…でも、出ているキャラクターモデリング本はどれも古く、Blender2.8系以前の本ばかり…そんなときに出合いました:

半年程度前に出た本。もちろん、Blenderは2.8系以降です。しかし…買ってみて驚いた。450ページ!?なんだこの鬼のような手間は!!!!心折れるわ。

「NEW GAME!」という3Dモデラーの仕事を描いた漫画2では一日一体作らせようとするシーンが出てくるのですが、…エーッ、そんなん、無理に決まってんだろ!

これはもう「才能」「努力」「慣れ」といったような言葉でなんとかなる範囲ではなく、キーボードやマウスを操作して作成する際の物理的限界として不可能だと思います。

ここで私は考えました。漫画の中では描かれていないだけで、実はベースとなるような3Dモデルが何体か会社で用意してあって、涼風青葉はそれをカスタマイズして作ったのでは、と…。

そんなわけで、今回はこんなことになったわけです。

本にはなかった苦労ポイント

トポロジーの細かい修正・変更をするときはサブディビジョンサーフェスを解除する

この本では常にサブディビジョン・サーフェスを掛けた上で編集画面上でも反映させる、という手順を踏んでいるのですが、この手順ですと細かい頂点の修正はかなり難しいです。サブディビジョン・サーフェスは頂点や辺の位置まで動かしてしまうので、ループカットの位置も表示上の位置と実際の位置はずれてしまいますし、サブディビジョン・サーフェスがきれいに頂点を並べ変えてしまうので、頂点が実際には変な位置にあったとしても気づきにくく、あとで「こんなはずでは…」が発生します。

そんなわけで、サブスクリプション・サーフェイスを解除した上でスムースシェード・フラットシェード両方で観察して、変なところが無いか洗い出す作業を定期的にするといいと思います。

細かいニュアンスの表現にはスカルプティングも併用する

胸の肋骨のふくらみなど、複数頂点にまたがるけど細かい起伏が存在する場合などは、スカルプティングを利用するのも1つの手です。この時はサブディビジョン・サーフェスを掛けておいたほうが陰影などが確認しやすくていいと思います。ただし、頂点の並び(3D業界用語としての「トポロジー」)はかなり汚くなってしまうので、上に書いたようにいったんサブディビジョン・サーフェスを解除して並び替えるとさらにきれいに仕上がります。

関節まわりは難しい!ウェイトペイントは難しい!

関節を仕込んだあと、その関節が曲がった際にどのようにメッシュを変形させるのかを指定する「ウェイトペイント」という工程が存在します。本だとかなりさらっと流されているのですが、かなり苦労しており、いまだに完全に満足する出来にはなってません。

ウェイトはポーズを付けた状態で編集する

本にはなかったのですが、ウェイトを意図通りに編集するには、実際に曲げた状態でウェイトを塗ると便利です。まげてしまった後も、アーマチュアを選択した状態でポーズモードに入り、Aボタンを押して全ボーンを選択して「ポーズ→トランスフォーム→すべてをクリア」を実行すればポーズは元に戻せるのでご心配なく。

関節の折り曲げ

この辺が詳しいのですが、例えば関節を普通に3つに割ってウェイトペイント50%にすると関節を折り曲げたときに関節が細くなってしまいます。

GUILTY GEAR Xrd開発スタッフが送るスキニングのためのモデリング TIPS

これはウェイトペイントが線形補完を使っていることに起因する問題で、うまいことウェイトペイントのパラメータを調整するだけでは原理的に対処できません。本ではこの問題に触れられていなくて、関節周りは単に3つにループカットで割った上で50%でウェイトを仕込んでいるように見えました。

273ページ

この問題の解決には関節の割り方に工夫がいります。1つ目は、補完してきれいに曲げようとするのではなく、めり込ませてやることです。ゲームのCGを観察するとたまに見かけます。

GUILTY GEAR Xrd開発スタッフが送るスキニングのためのモデリング TIPS

もう1つは、折り曲がる部分が凹むのは頂点があるからだ!ということで、降り曲がる部分には頂点を置かないという方法です。

どちらの方法も一長一短なので、好みで決めればいいと思います。ただし、どちらの方法も、サブディビジョン・サーフェスが絡むとうまくいかないことがあります。後述。

手首のねじれ問題

今ためしに手首をねじってみてほしいのですが、手首だけがねじれるわけではなくて、腕全体がねじれているのがお分かりでしょうか。解剖学の細かいところはよくわかりませんが、実際そうなってます。

もちろんしかし、Blenderはそんなところは勝手に空気を読んでくれたりはしないので、そのままだとこうなります。

ギャー!!

この辺も3Dモデリング界隈ではよく知られた問題で、手首のねじれに連動して動くような補助ボーンを設定すればうまくいきます。

しかし、この補助ボーンを動かすための設定はUnityなんかに持ってった時に消滅するっぽく、どうしようかな…と悩んでいるのが現状です。UnityのHumanoidはこの辺よしなに設定してくれるんだろうか?

いまのところ、前腕と上腕にだけ、手首に連動して回転するような設定(ボーン・コンストレイント)を仕込んでいます。

アーマチュア変形を掛けてからサブディビジョン・サーフェスを掛ける

Blenderのモディファイヤは上から順番に適用されるようで、普通に作っているとサブディビジョン・サーフェスを掛けてからアーマチュア変形が掛かります。

が、これを使うと上で述べた関節の割り方の工夫がうまくいきません。

実際の例で見てみましょう。

サブディビジョン・サーフェス→アーマチュア変形

おなかが割れてます。

アーマチュア変形→サブディビジョン・サーフェス

おなかが割れることなくお辞儀ができています。

腕の関節なども、サブディビジョン・サーフェスを掛けてからアーマチュア変形を掛けてしまうと、せっかく関節が細くならないように割ったのもむなしく、サブディビジョン・サーフェスで割られた中点のところが細くなってしまいます。おそらく「50%の罠」がサブディビジョン・サーフェスで発生してしまうせいだと思います。

が、これUnityやUnreal Engineに持ち込んだ時にはどうなってしまうのでしょう???いまのところまだめんどくさくてやってないのですが、今から頭痛が痛い問題です。

膝や肘が細くなってしまう

肘やひざの部分が細くなってしまうのもお悩みポイントです。これも、ウェイトペイントによるメッシュ変形が線形補完でしかないことに起因する問題です。

関節のボーンとポリゴンフローに関するTIPS

Blender内ではPreserve Volumeを使えばいいんですが、他のゲーム・エンジンでもこの変形機能が存在するかというと…?

メッシュは適宜修正しよう

本でもたまに書かれていることではあったのですが、ボーンの配置、ウェイトペイントなどの後工程になってからでもメッシュは適宜修正したほうがいいです。逆に言うと、どうせ修正するので100%完璧を目指してから後工程に進む意味はあんまりありません

大きなゲーム会社では分業化が進んでいて、モデリングをする人とウェイトを調整する人は別らしいのですが、どうやって分業してるんでしょう??謎だ。

Bluetoothキーボードがあると便利

わたしは腱鞘炎対策としてKINESISというだいぶ変わったキーボードを使っているのですが、こういうキーボードは文章を打つにはいいんですが、ショートカットキーを打つのにはあんまり向いてません(例えばY軸にそって移動するGYというショートカットを打とうとすると、左側と右側に分かれているのですんごい打ちづらい)。

楽天でUS配列版のLogitech K380を買って導入してみたところ、かなり快適に作業できるようになりました。道具大事。

今後の見通し

もちろんですが、まだ3Dモデルとして必要な作業はまだまだ残っています。

  • テクスチャ
  • 表情や口パク(シェープ・キー)

この辺は個別のキャラクターの個性が出るところかなと思いますので、今回のリポジトリからForkしてから作りこむ事になるのかなと思います。

「バニラ味の人体」を作るまでに200コミット近くの手間がかかっており、まだまだこれからかと思うと気が遠くなりそうですが、がんばるぞい!

あと最終的に何につかうかも実はあんま考えてなかったりします。Blenderでレンダリングして遊ぶのも楽しそうですが、モーションキャプチャしてVTuberになったりVRChatしたりしてもいいですし、UnityやUnreal Engineのゲームで活用するのも面白そうです。live2dも実は検討してたのですが、マジでVTuberにしかなれなさそうなのでやめました。

Gitでblenderのモデルファイルは管理できる!

blenderのモデルファイルは圧縮が掛かってないようで、git gcすると想像以上に圧縮が効き、リポジトリサイズを現実的なサイズのままに維持できます。200回近くコミットして、body.blendファイルは現在1.4MBくらいありますが、それでもリポジトリのサイズは20MB以下に収まっています。バイナリ・ファイルなのでマージなどはできませんが、それでもこまめにコピーを取っておく代わりにGitで管理するというのは十分に現実的なソリューションだと思います。

実際に何度か git reset –hardのお世話になりましたし、git checkout (適当なコミットID)して昔のファイルを開いて編集前はどうなってたか確認したこともあり、gitの恩恵は十分に得られていると思っています。

gitで管理できるものはgitで管理しましょう。コミットメッセージとtagがつけられるだけでもめちゃくちゃ便利ですよ。

…本当はpsdや.clipもgitで管理したい。

お絵かきおじさんとしての感想

いつも絵を描くときは、いったん頭の中で3Dで思い浮かべてから傾けて描いているので、後工程を勝手にBlenderがやってくれるのは楽だったかも。ただ、結局モデリングも2Dで行うので、頂点・辺・面の選択にはすごい苦労しました。オブジェクトが複雑になってくると、手の頂点を選択したいのにその奥に透けて見える足の頂点を選択してしまったり。そのためには画面をいったん傾けて、奥側に意図しない頂点がまったくない状態に持っていくか、透けない設定にしてぐるぐる回転して選択したりしないといけません。これが結構大変。

あとは液晶を上から見下ろしたり下から見上げたり横から覗こうとしたりしてる自分に気づきました(笑)。水族館の水槽じゃあないんだから!ゲームしてる最中に体うごく人ってこういう感覚なのかな~とちょっと理解…。

きららおじさんとしての感想

NEW GAME!は3Dモデリングのことを何も描いていない。ということがよーーーーくわかった。

…気になって読み返してみたのですが、3Dモデリングソフトウェアの描写はかなりあっさりしてて、「あっ!Mayaだ!」みたいなシーンは殆どなかったです34。そもそも画面が真っ白だったり他のキャラの頭で隠されてたり…。

3Dモデリングの話ではなく、もっと抽象的な「仕事」の物語を作ったからこそ、多くの人に共感され、「がんばるぞい!」で終わることなく、8年間も連載して、アニメも2本も制作するぐらいの人気が出たんだろうなとは思います。

…思いますが、こうしてモデリングした後だと、少し物足りないです。現役時代、得能正太郎がどんなことで悩んでいたのか、あるいは「仕事として3Dモデリングする」とはどういう事なのか、読んでみたかった感じはあります。

その他

VTuberはーーー大変なのじゃーーーー
  1. 言うまでもない事でしょうが、耳はケモミミ、エルフ耳、人間の耳などなど個性の強い一要素です []
  2. だったはずなんだけどなぁ []
  3. アニメではあります []
  4. 一方、お絵かきソフトは明らかにCLIP STUDIO PAINTなのが丸わかりだったりする []

架空のアーケード・シューティングゲーム「ムーンショット」と、そのワンポイント攻略

Posted on

ドリームキャスト互換アーケード基盤「NAOMI」で2021年10月にリリースされない横スクロール型シューティングゲーム「ムーンショット」。今回はこのマイナーなゲームのストーリーを紹介し、そのワンポイント攻略についても行っていきます。

ストーリー

安心安全帝国」 ― 生きる苦しみと不安、虚無を根絶し、安心と安全だけが満ち、全員が活躍できる社会を約束するカルト国家。もともとは極東の小国だったが、自我をもつ国家制御AIムーンショット」が2050年に完成するとすぐに、各地へ宣戦布告。あっという間に制圧し、世界中へ勢力を伸ばした。

内部では時間の止まった理想の社会≪ユートピア≫が実現されていると喧伝されているが、実態は不明。
かろうじて残る国境線付近では今でも大小さまざまな「テロリスト集団」との戦闘が続いている。

そのうちの1つに、「一切皆苦」があった。AIの力を”活用”しても活躍できないとされ「お祈り」された人間、ネガティブであるとされた思考の持ち主、不安や虚無の存在を肯定しようとする元哲学者・思想家などが集まった混沌とした集団だ。

人工知能に対抗しうる最終兵器「天然無能」を開発することに成功した「一切皆苦」は、崩壊しつつある集団の最後の力を振り絞り、「安心安全帝国」への、最後の国家解体作戦を開始する。

一切快苦」の保有する最後の戦闘機、「無明」に、帰還のための燃料の代わりに「天然無能」を積みこむ。最後の挨拶を済ませたパイロットは、明るいLEDライトのきらめく「安心安全帝国」へ退路を捨て飛び立っていく。

 

敵は≪幸福≫。

生きとし生けるものに生きる苦しみを取り戻すための「正義」の戦いが、いま始まる。

ワンポイント攻略

8方向レバー、3ボタン。全5面+真の最終ステージ1面。一周エンド。

パターン要素の強いステージと、ランダム要素の強いステージが極端に分かれています。パターン要素の強いステージで自分なりの攻略パターンを早めに構築し、ランダム要素のために気力を温存しておくのが、基本的な攻略戦略となるでしょう。

真エンド条件は「5面終了時点までノーミス」と、かなり厳しめの設定です。真エンドを見たい場合、敵をなるべくすべて撃破して、いわゆる「スペシャルアタック」のゲージをこまめに貯め、少しでも厳しいと感じたら、すぐにスペシャルアタックを発動し、付随する無敵の効果で切り抜けましょう。

 

次からは、各ステージの簡単な紹介と攻略になります。

Stage 01 「テンシ」

これが、テンシ?人喰いの、間違いじゃないのか。

回収されたフライトレコーダーから

最初のステージ、「テンシ」。このステージでは「安心安全帝国」の国民である「テンシ」が無数に襲い掛かってくる。最初のステージであることや、全員とも優しそうな笑顔を浮かべていることに油断していると、すぐに「テンシ」たちの放つ高密度弾幕に制圧されてしまう。主人公の言葉どおり、「全員を殺す」という強い気概で挑んでいこう。

Stage 02 「ナカマ」

こちら無明、…
敵も無明だ…。

回収されたフライトレコーダーから

次のステージは「ナカマ」。前回プレイしたプレイヤーが鹵獲され、「テンシ」として”生まれ変わった”という設定で襲い掛かってくる。「ナカマ」であった「テンシ」の攻撃パターンは前回のプレイヤーの動きから学習・模倣されたものになるため、ゲームセンターで待っている間も前のプレイヤーのプレイは肩越しによく観察しておこう。

Stage 03 「コウノトリ」

誰でも作れるということは、
誰にも作れなかったということなのだな。

回収されたフライトレコーダーから

第三ステージ、「コウノトリ」。国家制御AI「ムーンショット」が、「望めば誰でも安心して子供を産み育てられる社会」という人間の願いにこたえるために作った、「テンシ」の製造工場だ。「テンシ」は完成するとすぐに高速弾を放ってくるので、完成する前にテンポよく破壊していこう。登場する順番は死んで覚えるしかない。

Stage 04 「デンシン」

一人と戦っているのか、
全員と戦っているのか、

わからない。

回収されたフライトレコーダーから

第四ステージ、「デンシン」。ここの「テンシ」は全員テレパシーを使って以心伝心している。一度倒した方法は次の「テンシ」には効かない。全ての「テンシ」を破壊できるよう、倒し方のバリエーションを事前に準備しておこう。

Stage 05 「ムーンショット」

頼む、持ちこたえてくれ。

回収されたフライトレコーダーから

最終ステージ、「ムーンショット」。名前通り、「安心安全帝国」の中枢にある国家制御用AI「ムーンショット」を破壊するのがミッションだ。気象をもコントロールする人工知能が、津波、地震、土砂崩れ、台風、ハリケーンなど自然災害すら用いてステージの地形を変形させていく。弾避けに使っているオブジェクトはすぐに破壊されてしまうから注意しよう。

Stage -1 「シアワセ」

脳が痛い。胸が痛い。視界もはっきりしない。意識が朦朧とする。
俺は、一体今まで何と戦ってきたのだ。

だが、まだ生きているというのだけは分かる。
まだ戦わねばならない事もはっきりしている。

回収されたフライトレコーダーから

そして条件を満たしたときにあらわれる真・最終ステージ、「シアワセ」。

人工知能」である「ムーンショット」に対抗する「天然無能」。その正体は「生老病死」であった。 この「生老病死」 を起動し、ブートが完了するまで、守り抜くのがミッションだ。残機がいくらあったとしても、死んだ瞬間に守りがほころび、ほぼ間違いなくゲームオーバーになってしまう。このステージではコンティニューもできないので、「人生は一度しかない」と念じながら最後までやりきろう。

参考資料

アナザーエンド

ラストステージは、頭のアンパンから餡が飛び散りきるまでに「安心安全帝国」の管理AI「ムーンショット」を破壊するミッションとなっている。ここだけはコンティニューできず、残基も自動的に0になるので、気合を入れて攻略しよう。たとえ、胸の傷が痛んでも。

https://sabbat.hexe.net/notice/ABuOy9yYFwEfd7EkrI

Value DomainでLet’s encryptのワイルドカード証明書を発行する

Posted on

今北三行

現状

公式では対応してなかったので、対応させるプルリクを投げてる最中です。

そのかわり、使えるようにしたDockerイメージを用意しました。マージされるまでのつなぎにどうぞ。

Dockerイメージの使い方

使うには、こんな感じのdocker-compose.yml書いて:

---
version: '3.7'

services:
  certbot:
    # つくった
    image: 'ghcr.io/ledyba/certbot-with-dns_valuedomain:latest'
    network_mode: 'host'
    volumes:
      - ./data:/etc/letsencrypt
      - ./conf:/etc/certbot

networks: {}

conf/valuedomain.ini

  • 所有者root:root
  • パーミッション0600

で作成して、Value Domain APIのページから持ってきたトークンをこんな感じでコピペして:

dns_valuedomain_api_token=(your-token)

最後にこんな感じでコマンド打って証明書を発行してもらう:

docker-compose run \
  --rm certbot \
    certonly \
      -vvv \
      --agree-tos \
      --email <your-email-addr> \
      --non-interactive \
      --preferred-challenges dns-01 \
      --dns-valuedomain \
      --dns-valuedomain-propagation-seconds=90 \
      --dns-valuedomain-credentials=/etc/certbot/valuedomain.ini \
      --keep \
      -d example.com *.example.com *.foo.example.com

renewするには:

docker-compose run --rm certbot renew -vvv

無料でワイルドカード証明書が欲しい!

TLSで暗号化せざるをえない(?)昨今、どうせ証明書を作るならワイルドカード証明書が欲しくなります。

実験で新しいウェブアプリを書いてドメイン名が必要になった時、通常のHTTP認証を使った証明書を使う場合は、実験用のドメイン用にlet’s encryptのコマンドを追加でたくさんたくさん叩かないといけません。

一方、ワイルドカード証明書ならA/AAAA/CNAMEレコードを1つか2つ追加すればすぐに使えます。

楽です。楽であることは正義です。

certbotが対応していない

certbotにはDNSプラグインなる仕組みがあり、Route53などの有名どころにはすでにプラグインが存在し、各サービスのパスワード的なものを用意すればプラグインを使ってワイルドカード証明書が発行できるとのこと。

じゃあ我らがValue Domainはどうなのかというと…

% certbot --help certonly
usage: 

  certbot certonly [options] [-d DOMAIN] [-d DOMAIN] ...

....

  --dns-cloudflare      Obtain certificates using a DNS TXT record (if you are using Cloudflare for DNS). (default: False)
  --dns-cloudxns        Obtain certificates using a DNS TXT record (if you are using CloudXNS for DNS). (default: False)
  --dns-digitalocean    Obtain certificates using a DNS TXT record (if you are using DigitalOcean for DNS). (default: False)
  --dns-dnsimple        Obtain certificates using a DNS TXT record (if you are using DNSimple for DNS). (default: False)
  --dns-dnsmadeeasy     Obtain certificates using a DNS TXT record (if you are using DNS Made Easy for DNS). (default: False)
  --dns-gehirn          Obtain certificates using a DNS TXT record (if you are using Gehirn Infrastructure Service for DNS). (default: False)
  --dns-google          Obtain certificates using a DNS TXT record (if you are using Google Cloud DNS). (default: False)
  --dns-linode          Obtain certificates using a DNS TXT record (if you are using Linode for DNS). (default: False)
  --dns-luadns          Obtain certificates using a DNS TXT record (if you are using LuaDNS for DNS). (default: False)
  --dns-nsone           Obtain certificates using a DNS TXT record (if you are using NS1 for DNS). (default: False)
  --dns-ovh             Obtain certificates using a DNS TXT record (if you are using OVH for DNS). (default: False)
  --dns-rfc2136         Obtain certificates using a DNS TXT record (if you are using BIND for DNS). (default: False)
  --dns-route53         Obtain certificates using a DNS TXT record (if you are using Route53 for DNS). (default: False)
  --dns-sakuracloud     Obtain certificates using a DNS TXT record (if you are using Sakura Cloud for DNS). (default: False)

してなーい!

じゃあさせるぞ!

Certbotが依存しているlexiconを対応させる

一番最後の行に出てるsakuracloudが一番近そうなので、これを適当に模倣します(プルリク)。

仕組みがどうなってるのかよくわかんないんですが(笑)、実装であるlexicon/providers/valuedomain.pyと、そのテストlexicon/tests/providers/test_valuedomain.pyを用意すれば基本的には終わりです。

あとはこのコードが正しいかどうか調べるためのユニットテストを通すために、tests/fixtures/cassettes以下にテスト用に通信を記録したファイルを配置しないといけないんですすが、これはルートフォルダにあるtox.ini

setenv =
    PYTEST_ADDOPTS = {env:PYTEST_ADDOPTS:--numprocesses auto}
    PYTHONHASHSEED = 0
    LEXICON_VALUEDOMAIN_AUTH_TOKEN = <token>
    LEXICON_LIVE_TESTS = true

みたいな感じで書いとくと勝手に生成されるようになります(どこにも書いてなかったのでメモ)。ただし、結構ユニットテストの数が多くてレートリミットが掛かってしまうので気をつけて…。その時はレートリミットのせいでエラーになったテストのファイルだけ削除してテストを再実行すればOKです。ファイルを削除したテストだけ、実際のHTTPリクエストが発生するのでレートリミットが掛からなくなります。

toxがオールグリーンになったのでおしまい。次いこう次。

Certbotはほとんどlexiconに丸投げ

certbotに関してもほぼSakuraCloudプラグインをコピペしてvaluedomainにrenameしているだけです。正直いうとgrepしてsakuracloudの文字列がないか調べて片っ端からvaluedomainに書き換えてるだけに近しい。

びっくりするぐらいとくに何も言うことがない。おしまい。

Dockerがあるから自分で改造したコードを使うのが楽になった

コードを変更したら、それが取り入れられる前に自分の手元で簡単に動かして実際に使えるようになったので、楽な時代になったなぁと思いました(こなみかん)。Docker imageを作ってしまえば、冒頭に書いたように公式の用意したdockerイメージの名前を自前のものに書き換えるだけであとは同じように使えます。

昔だったら…そうさね、Virtualenvみたいなので済めばいいけど、サーバに色々細工して環境を汚しまくらないとダメだったかもわからんね…。