150時間かけた成果を発表

hsjoihs氏(以下、hsjoihs):さて、そろそろ文字に飽きた頃でしょうから、スクショを見せます。夏休み5週間の成果です。150時間ぐらい溶かしました。なんかいろいろとできるようになっていますね。やったー!

せっかくなので、盛大にバグった画面集もお見せしたいと思います。やはり低レイヤーをいじる最大の醍醐味は、ものがうまく動いている時ではなくて、うまく動かず、こんなふうにバグってしまってKernelからの英語のエラーメッセージが隠し通せずに貫通するとか、そういう時に起きるものをやるのが低レイヤーの醍醐味だろうという気持ちがあります。

進捗を振り返ってみる

次。時間に余裕があるので、1日目から進捗を振り返っていきましょう。1日目はアプリの名前を出すメッセージとかを、全部リパライン語に翻訳します。初日にしては進捗はいいですね。

2日目はビットマップフォントをすり替えて、表意文字も一部表示できるようにしました。さらにビットマップフォントを全部表示できるようにしたいなぁというのを考えたのが2日目です。

3日目には、表意文字が全部表示できるようになりました。基本的にソートされているからソートしなくていいやと思ってソートをサボっていたら、400個中4個だけ正しい位置から1個だけずれた位置に置かれて詰むという現象が起きました。悲しいですね。それをなんとか直してうまくいきました。

4日目です。リパライン語のリパーシェというやつと、別の東島通商語のペメセペ・ルヨットが使う文字が微妙に違うので、それを共存させるために、ASCIIでない領域も半角文字として使わなきゃいけないのですが、MikanOSが半角・全角の概念と、ASCII・非ASCIIの概念を分離しているようで実は分離できておらず、ちょっとバグがあるので、そこの改修を入れる必要があって面倒臭かったです。

ちなみにデバッグが普通に面倒くさいので、異世界文字で表示するリリースビルドと、見慣れた文字で表示するデバッグビルドを作ってあります。こういうささいな工夫がバグを減らすのに効果があります。

hsjoihs:はい、次。Truetypeフォントを16ピクセル以外のサイズでもロードして、章タイトルに下線を引くことによって、さっきお見せした公式ルールブックのレンダリングができました。やったね!

さらにキーボード入力でここらへんの文字にマップしている向こうの世界の文字を、キーボードから入力する必要があったのですが、MikanOSはASCII外の文字がキーボードから入力されることを想定していないので、そこの改修が必要でした。

そこから日にちは飛んで12日目。テキスト、画像、フォルダ、それぞれに対してコマンドを適用した時にどうなるかという挙動はこんなふうになっていて、とりあえずOSがぶち壊れるのは困るので、どうにかしようみたいな話をしています。

その後、雑にIMEを実装しました。Fadisさんがメチャメチャ真面目にIMEの解説をした後に言うのもアレですが、とても雑なIMEを実装することで表意文字を打てるようになりました。

その後、向こうの言語っぽい感じの高級言語が欲しいなぁということで、リパライン語としてかなり自然な文で書けるように名詞と動詞が構文上で判別可能なようにして、かつ、オブジェクト指向言語によくあるような名詞から動詞をルックアップするという仕組みにすることで、名前空間の汚染を最小限にできるようなうまい構文が設定できて満足しました。

これを見ているみなさんのうち、リパライン語がわかるのは1人か2人か3人ぐらいしかいないと思うので、いかにきれいにこれがリパライン語にハマっているかが伝わらなくて残念です。

成果の勝因は「タスクをうまく分割できたこと」

hsjoihs:次。5週間の成果ですが、こんなふうにステップに切り分けておいたので、それぞれステップ1、2、3、4、5、6、7、8というふうにやっていきました。

起動ができて、フォントとメッセージをすり替えて画面をいじって、ビューワーを作って、文字入力がちょっとできるようになって、フォントをちょっと改善して、フォルダ、テキスト、謎の文書フォーマット、アプリ、画像、の5種類をファイルの先頭を見てスニフするシステムコールを入れて、文字入力を実装するという成果が達成できました。わりといろいろと実装できてよかったんじゃないかなと思っています。やったー!

勝因ですが、タスクをうまく分割できたというのがやはり大きかったのかなと思っています。「困難は分割せよ」とルネ・デカルトの『方法序説』にも書いてあります。原文では「diviser chacune des difficultés que j'examinerais, en autant de parcelles qu'il se pourrait, et qu'il serait requis pour les mieux résoudre」と言っているのですが、タスクがうまく分割されていると達成感を得やすいし、面倒なタスクだと判明したら予定変更して後回し、みたいな柔軟性が得られるのが大きかったと思っております。

先ほどお話ししたとおり、暇な6週間の間にOSをやったわけですが、その後の秋学期で学業に耐え抜くという重要なタスクがあり、学業に耐え抜いていました。冬休みですが、さっきのボードゲームのRust実装を高速化したりしていました。で、今がここということです。

というわけで、実はこの2022年9月以降まったくこのOSをいじれていません。今日は3ヶ月ぶりに起動しました。なので最初に言ったように、9月17日にやった発表とだいたい同じ内容になっていますが、それなりに内容を増やしています。学業は大事なのでしょうがない。卒業は予定どおりできたほうがよい。一方で、趣味の時間を削っても意外と本分が進むわけではないんだよな。

今後の野望。こんな感じでステップがズラズラと並んでいます。「夢はでかくなけりゃつまらないだろ」「欲望は言葉にしなくちゃ消えちゃうでしょう?」という言葉があるとおり、今後も夢をでかく持って欲望を言葉にしつつ、がんばっていきたいと思っております。

作業ログが120ページ分あって公開しているので、読みたい暇人はぜひ読んでください。はい、ご清聴ありがとうございました。

質疑応答

hsjoihs:なにか質問ございますか。

司会者:すごくおもしろいなって思いました。せっかくのOSというところで、時間の概念も異世界は同じなのか? という疑問があって、そのへんの時間の設定はありますか。

hsjoihs:はい、あります。ありますし、ちゃんとシステムコールをミリ秒単位からストゥズスン単位へと変更する度量衡の換算のコミットを入れております。ご安心ください。

司会者:あとなんか、ちょっと見えた、可視光が云々って、前提としては異世界でも人間は人間なんですかね? 

hsjoihs:まぁそこのところはいろいろとやり方があると思っていて。グレッグ・イーガンという人が「物理法則の符号が1個違います」というところから書いているメチャメチャすごい小説が3冊あって、その小説だと、知的生命体のありとあらゆる挙動が人間と違ってとてもおもしろいのですが、それはイーガンがうまくやっているし、私は言語に情熱があるタイプの人類なので、そこで特色を出して創作をやるのがおもしろいのかなというポリシーでやっております。

司会者:おもしろい。世界の算術物理法則、確かに何をピンニングするかは非常にポイントだなと思いました。いや、おもしろいですね。

Kernel/VMに参加している人が今180人ぐらいいるんですが、ぜんぜん知らない文字のはずなのに何人かはこの言語を知っているみたいな、コメントが出ていて怖いなぁと思いました(笑)。どうなってるねん。あの世界でのGISが気になってきたな。いやぁ、なんか、ちょっとヤバいですね。リパライン語、勉強していなくてごめんなさい。思ったよりわかっている人が多くてびびっています。

異世界人のためのOSを実演

hsjoihs:じゃあ、実演をやりましょう。どうしようかな、さっきボドゲの対戦も実演すると言いましたが、たぶんみなさんはOSのほうが見たいだろうから、OSのほうを(実演します)。

新しい共有。共有して、コマンドをポチると……あぁ、パスワードを入力するところを共有してしまった。QEMUが立ち上がります。QEMUが立ち上がったので、画面全体への共有に切り替えて、はい、QEMUが立ち上がっています。QEMUが立ち上がるのを……はい、立ち上がりました、やったね。立ち上がりましたが、さて、これを3ヶ月ぶりに開くので、コマンドとか全部覚えていないんですけど。

デスクトップに、シュッシェエルドゥヴ……ドゥヴヴーカーポゲスチェル、MikanOSにようこそ。クランテカンティ・フア……違う、ファルケーゼーフェーフアクネオ……なんだっけ、コマンドを知るためにということで、カンティと打ち込むと、アプリについて知りたいならばカンティセースヴァス、「アプリについて教える」。

ターミナルで動くコマンドについては、キュィネメルスケーゼーフェー、「ターミナルについて教える」というコマンドを打てと言われたので、カンティメルスケーゼーフェーとやると……。

司会者:入力が(笑)。

hsjoihs:アプリの説明が出ました。

そういやそんな仕様にしていたな。一番わかりやすい、一番下のユィスという短い文字を打ちましょうか。このユィスは「拭き取る」という意味で、画面がクリアされます。

なんか、画面がクリアするのを動詞でどう言うかめちゃめちゃ迷って、消すだとウィンドウが消えそうだし、黒くするでもないし、あぁ、そうだ、拭き取るでいいじゃんと、拭き取るに決めたという経緯があったりします。

じゃあ、IMEもやりましょうか。カイッキヤーパイ……パイサン、違う、プァク……えー、チェチェプア……えーっとアはこ(っち)……んっ、違う「ア」を打ってしまった。カーソルの移動が1個多かったですね。この「ア」ですね。こんなふうにIMEが動いております。

あとは、何を入れていたっけ。カンティセースヴァス、「アプリについて教えて」。あぁ、タームツィ入れましたね。タームツィは、こういうふうに別の文章が出てきます。

先にこれを閉じないといけないんだけれど、これを外して、マウスをクリックして、閉じて、とやればいいのかな。よし。本当に3ヶ月ぶりに立ち上げたので、MikanOSだし、セーシェでMikanOSにある立方体のデモが動きます。やったね。

あとは、なんでしたっけ。ペックタックヨ、アイルパニットとか入れてたっけ。これです、先ほどの公式ルールブックがきれいにレンダリングされていますね。TrueTypeを呼んでいるだけですが。

こんな感じで、異世界のOSをちょっと実演できたと思います。

司会者:「MikanOS」の作者からIMEめっちゃすごい、本家にも欲しいって来ています(笑)。

hsjoihs:本家に、IMEというかSKKのなんかプルリク来てませんでしたっけ? (今私が実演したのは)比較的まだIMEを作りやすい言語のIMEなので、日本語に堪えるIMEを作るとなるとどうしても大変なんですよね。なので、一番簡単なIMEから実装したという、そういう経緯になっております。

司会者:これ、キーボード作ってあるのかなって(思いました)。見ている感じではASCIIの文字、1文字と、異世界の文字が1対1で対応している動きに見えたけれど、キーボードもまさかの自作だったりするんですか?

hsjoihs:キーボードがどういう形をしているかは、グラフィカルシェル側から見えないじゃないですか。なので、そこはお好きに好きなキーボードをつないでいただく方式にしておりまして。

あくまでMikanOSフレームワークなので、今のところはまだUS配列に依拠したものになっていますが、US配列だと打てないが打ちたい文字があるので、そういう用のキーは、自分でキーボードを作るというコストをサボってSHIFTとかの補助キーで、便宜的に私のパソコンではそういうマッピングを与えてあります。そういう感じになりますね。

司会者:なるほど。

hsjoihs:キーボードも作ってはみたいんだけれど、キーボードを作るとなると……いや、キーボードを作る分にはぜんぜんいいんですけれど、単純に、キーボードそのもののインターフェイスが英語を前提にしているし、USBを読み始めなきゃいけなくなるから面倒くさいなとなっていて。

なので、向こうの異世界人が叩くことができるキーをなんらかのキーの組み合わせでこっちでも叩くことができればよしという方針にしております。

司会者:Twitterのコメントでは「見続けていると目が慣れてきて読めるような感じがする」って、人間怖い(笑)。そんなところですかね。

ボードゲーム「机戦(セッカイク)」の実演

hsjoihs:ありがとうございます。ちょっとだけ時間が余っているので、ボドゲをお見せしますか。

司会者:そうですね、あと3分ぐらい。

hsjoihs:Ctrl+TabだったかAlt+Tabだったか、こんな感じで、セーケフィーメニ、オンラインでの机戦(セッカイク)ということで、ニュィスティペーティ、「ロボットと」というボタンを押すと、待機してくださいという画面が出て、こうなります。

司会者:なんか音が出てる(笑)。

hsjoihs:あぁ、避けてきましたね。避けてきたので、とりあえずこれは、こう引いておいて。あぁ、そう来るか、まぁまぁ、取っておけばいいかな。

司会者:ここにちゃんとボットが実装されているという。

hsjoihs:はいはい、水に入るのに失敗しました。着水で濡れたので、これを取ることができて、点数が入りました。シーズンはこれで終了でいいでしょう、次にいきます。次シーズンに向かいましょう。

こっちが4本で向こうが2本なので、こっちが先手です。また同じ戦術で攻めますかね。向こうも出してきた。これってどう受けるのが正解なんだっけ? 今画面の挙動がバグった気がするのは気にしないことにしよう。

また、同様の攻めでいいのかな。今度はそっちで避けてきた。これ、どうやって受けるんだっけ? 私は実装に詳しいだけで戦術に詳しくはないので、ぜんぜん正しい受け方がわからないんですよ。

なんか挙動がバグっている気がするので後で直す。

司会者:左にメーターみたいなのがあるんですけど。これはゲームの進行を示しているのかな?

hsjoihs:これは、左のほうが季節で春夏秋冬。(メーターの)右側が点数を表しています。点が自分の領地、これが点数で、合計40点の領地を互いに分け合うという点数システムになっています。

そこに踏んでくるの? えっ、これどうやって……これどうすればいいのか忘れた。

司会者:点棒みたいな役割が何かわからなかった。

hsjoihs:これは2面ダイスで、駒を踏んだ後にもう1回動くという動きがあるんですけれど、無限の利きがある駒が無制限でできると強すぎるので、無限の利きのある駒が、その踏みをした後に動く量が無限である場合には、この棒を投げて、はい、今4が出て、これは1以上なので、1マス進むことができますねと、これを取ることができる。そういう仕組みになっています。

(相手が)そう動かしてきたのが、不安だけど、今のところ直ちに危険はないので……車を取れば。ゲームの目標を言い忘れていましたが、ゲームの目標は、(ゲーム画面の真ん中に)書いてあるどれかの組み合わせを持ち駒に作ることによって点数が発生するという仕組みです。

今このマオンとノアークがあって、このカウンを取ることによって5点役が発生するので、それを狙っていきます。なので、こいつを取ってしまえば役が完成して季節を終わらせることができます。

司会者:右側に出ているテキストボックスは? これは何が表示されている……?

hsjoihs:棋譜です。棋譜でして。

司会者:本当だ、進んだ。

hsjoihs:棋譜のレンダラーも作ってあるので、こんな感じで、試合を振り返ることができます。

司会者:ヤバッ(笑)。デバッグのためにも確かに必要だ、これ(笑)。

hsjoihs:そうなんですよね、普通に便利です。ちなみに、棋譜全体をencodeURIComponentでドカッと突っ込むという実装になっています。

結局これが一番使いやすいんですよね。

そう来たか。今回は急戦を狙いましょうか。そうやって防いできた。これはどうやって受けるんだっけ? じゃあ、こう受けて……それはね、ただ取りというものですよ。

司会者:あっ、業務連絡で、次のtakeokaさんの発表時間がそろそろなので、準備をお願いします。

hsjoihs:私もそろそろ試合を終わらせたい。試合を終わらせたいが勝ち方がわからない。これはこうでいいんだっけ。あぁ、逃げられた。

司会者:まだ冬が必要だから。でも全部取りきっちゃったら勝ちなのか。

hsjoihs:そうですね。点数を取りきれば勝ちなんですが、勝ち筋が見えない。ぜんぜん勝ち筋が見えないので、これは試合が終わらずに締まらない状態で終わりそうです。しょうがないね、もっと強い人を連れてくればよかったかもしれない。

実装しただけであって、戦術をぜんぜん覚えていないんだよな。

司会者:そんなに追いつめちゃったら、相手は逆転できるのかしら?

hsjoihs:このボット、そんなに強く作っていないというか、これはチュートリアル用のボットなので。

これ取っても、それが来られると……えっ、これどうやって攻めるの?

司会者:はい、では、ここで(笑)。

hsjoihs:はい、ありがとうございました。

司会者:ありがとうございました。本当に締まらずに終わってしまった(笑)。いや、だいぶおもしろかったですね。

せっかくなので、このあたりはクロージングした後、ぜひ「Discord」で交流会に参加してもらうといいのかなと思っております。hsjoihsさん、ありがとうございました。

hsjoihs:ぜひぜひ、喜んで。ありがとうございました。