‘プログラミング’のエントリ

TBS「ラヴィット!」でタイピング企画があり、Weather Typingの対戦が放送された。期間限定だけどTVerで公開されている。

メールで相談を頂いていたが、準備期間がかなり短く、私も質問などに最低限しか回答できない状況だったので、生放送で大丈夫なのかな、と思ってたけど、無事終わって何より。大会でも8人対戦なんてめったにないので新鮮だった。

速度的には300kpm~400kpmくらいだったので、まあまあレベルは高い気がする。最後の1ポイントになったら足が震えるというのは実際対戦してみれば分かるかと。

最後、手動の画面表示と実際の得点が途中で1点ずれたので幻の10問目になっていたり、勝敗ルールがトータルポイントになっていたので勝敗が変に見えたりしていた。別途観戦モードPCを用意して全員のポイントを確認できるようにしたり、ルールをワード数に変更したりすればよくなるんだけど、さすがにそこまでは、と。

ソフト側でもいろいろと改善したいところはあるんだけど、作業時間が取れない。11月くらいから普通に休日は休めそうなので活動再開できるかな。

ALL ABOUT マイコンBASICマガジンⅢから帰宅。今時のイベントは結構配信もあって、参加した後で配信を見ながら感想を書けたりするんだけど、このイベント、コンプラ的に配信が無理なので仕方がない。とはいえ今回はそこまで(いい意味で)ひどい話は出てないのかな。毎回恒例の「危ない話が多いからネタバレ投稿はやめてね」という注意事項もなかったし。この規模ではさすがに拡散は避けられないってことで。

私のPC歴、ベーマガとイベントについては第一回第二回SP回の感想を参照。大阪含めて全通。

イベント参加まで

2018年大阪で行われたぶりのベーマガイベント。コロナ前にやろうとしていたというのはXで見た気もするけど、会場まで抑えていたんですね。てことで6年ぶりの開催。会場も1回目がアキバ500人、2回目が有楽町1100人、大阪が300人、今回が蒲田で1500人とかなり大きくなり、これは参加せねば、ということでチケット参戦。サイトが重くて15分くらい再試行して9801席を購入。PC-6001ユーザだけど。

当日。会場は散歩範囲なので歩いて向かいつつ、途中暑すぎてワープもしつつ蒲田へ。もちろん大阪で買ったベーマガ坊やTシャツを着用。

イベントの終了時間が18:30までになってるけど、そんなわけはないので、近くのやよい軒でしっかり栄養補給して会場入り。開場の12時ぴったりくらいに到着したが、既にだいぶ並んでて30分ほどかけて入場。

物販。大阪の時も結構な混雑だったのだが、東京はさすがに人が多すぎて、開始前、休憩中、終了後、行列が長すぎて諦め。欲しいものは大阪で買っておいてよかった。

会場。1階S席のちょうど真ん中くらいだったが、出演者の表情も見えてかなり見やすい。音もなかなか良かった。とりあえず2F席からの眺めを見たりしながら座席へ。客層は50代以上のおじさんばっかりかな。S席から見ると、つぐみさんがほんとに会場内で紅一点。

実録マイコンソフトコーナー

恒例の伝説ボーカロイド「6601」による挨拶から始まり、OPムービー。

第一部はマイコンソフトコーナー。大阪でやっていたコーナーをさらに大きくした感じかな。当時PC-6001でタイニーゼビウスをプレイしていたが、突然送られてきた投稿プログラムをベースにしていたとは。

サプライズはPasocomMini PC-8801 mkII SR。第3部でえらく小さいマイコンが置いてあって、実際にBASICの画面が映っていたので気になっていたのだが、実は実機だった。中身はラズパイ+エミュレータなのかな。フロッピーとかがいやにリアルだけど。

令和に復活!人気連載リバイバルコーナー

自分的にはメインのプログラムコーナー。今回は移植テクニックという具体的なコーナーがテーマで楽しみにしていた。

毎回興味深い森先生の題材は、大きなキャラクターの扱い。今(より昔)でいうアスキーアートですかね。普通に複数行の文字列にすると遅いので、CHR(カーソルキー)で単独の文字列一行に収めるという話。なるほど。

で、断空我先生が、コモドールでは直接文字化けみたいに書けるという話をしていて、それを今知ってどうするんだ、というのもあるわけだけど。ただこのコーナー、地味だけどめちゃくちゃ面白い。個人的にはこういう「リソースが限られていたからこそのテクニック」みたいなのをもっとたくさん見たい。こういうやつ

Bug太郎先生はマシン語のプログラムをリベンジ。イベントIIのときのファミベのよっしんさんも衝撃だったけど、爆速。

前回もそうだったけど、最後の森先生の話はやっぱり深い。ベーマガはプログラムを自由に改造できて、好奇心を存分に刺激する本だった。

ゼビウスのコーナー。イベントIISPのときにアンドアジェネシスを倒して盛り上がっていたけど、今回は16面クリアをアーケード筐体で挑戦。正直、これが40年前のゲームかという、40年!? まじかぁ。でも音楽も雰囲気も、プレイを見ているハラハラ感も、今でも全然面白い。

サプライズはチャレアベの復刻。知識不足でコメントはできないけど、バトルオブは前回買ってます。

ベーマガライターズメモリアルトーク

ここはネタバレは書かない方がよいのかな。これまでのイベントでも各コーナーを扱ってきたけど、全部入りみたいな贅沢コーナー。どのコーナーも情熱を持って作られていて、今では各所で活躍している人もたくさん。

特にOFコーナーは今まで出てなかったと思うので興味深かった。OFコーナーはOverFlowの略で読者投稿なのだが、小学校時代はこれを中心に読んでいた気がする。さすがに実際の会話とは思ってなかったけど、編集部の方がちゃんと書いていたのか。CheckerFlagはちょっと衝撃だったけど・・・。

サプライズはCLASSIC_GAME_WORLD_MUSEUM。完全なる趣味ということで楽しみですね。レトロPCのMuseumも欲しい。

まとめ

終了19:30だったので6時間半の大ボリューム。今回、大橋編集長の勇退記念ということで、いろんな関係者が家族のように参加していた。そこに我々読者も呼んで頂いた感じで、直接ありがとうを言うことができてよかった。

最後の挨拶、自分は遊態好奇高励者で、これからも技術の国の復興を目指していく、みたいな話。やっぱり会場の中で一番元気な人だなあ。


今の日本は技術者にあまり興味がなくて、インターネットもビジネスばっかりで面白くなくなっている感じはある。そんな中でも好奇心とモノ作りの楽しさを根源として、次代につなげていこうというのは大事ですね。私も職業の方が忙しすぎて開発ができてないけど、何かしないと。

タイピング日本一を決める大会「REALFORCE TYPING CHAMPIONSHIP 2024」を日テレスタジオで観戦してきた。日を置くと書けなくなってしまうので最速感想。ネタバレあり。

去年までの観戦記:RTC2017RTC2018RTC2019RTC2023

配信:YoutubeTwitch

全般

今回もありがたいことにWeather Typingを使用頂けるとのことで、協力させてもらった。お話を聞いたのも割と直前だったので、依頼を受けて打鍵音を修正したくらい。現地ではあまり分からなかったけど、配信だと赤側の音と青側の音が少し左右に振られている。どのくらいパンするとよいのか分からなかったので、どんな感じですかね。

タイパー視点での感想

まず会場が広い。去年から観客席がかなり大きくなっていた。去年も感じたが、知ってる顔の割合が少なくなっていて、身内の大会から一般の大会に成長している感があっていい。

内容としては、いったんの世代交代みたいなところが見られた。上位選手はほぼ全員互角だったので実際にはそこまで差はないんだけど、決勝戦常連のmiri選手とmuller選手に勝ったくわな選手対三山羊選手の決勝戦、さらにかな入力の初優勝と、これまでの歴史を塗り替えた感がある。かなについては、正直このルールでかなが優勝できると思ってなかった*ので、かなりの衝撃。

*Weather Typingでは、かなの1打鍵はローマ字の1.5倍の価値としている。例えばかなの「さ」とローマ字で「sa」を比べると同じ1打鍵でも2倍の差があり、Weather Typingのワード全体の統計を取ると平均1.5倍。それを前提としたランキングでもかなが上位。なんだけど、かな入力はキーボード4段打ちだったり、打鍵数が少ない影響で正確性を回復しづらいので、緊張感のあるオフライン大会かつ正確性重視ルールではかなり不利になる。

その上で今回、三山羊選手 vs muller選手のかな対決で1100kpmとか出ていたけど、こんな速度で正確に打たれるとさすがにローマ字は勝てないのか。

てことでいったんは世代交代に見えるけど、次回はレジェンドの恐ろしさを魅せてくれるのか、さらに新しい歴史になるのか、楽しみなところ。

開発視点での感想

今回、現地観戦しつつ少し運営側を見せて頂いた。いつも以上にトラブルに怯えつつもいろいろと参考になった。

とりあえず現地で気になったところだけ配信で確認。

一回戦 miri選手 vs riafi選手。riafi選手が最初の2ワードを打てなかったことがあったけど、配信を見る感じ、ウィンドウのフォーカスが外れてた感じかな。ミ田キーを押してしまって打てないというのも発生しているようなので、何かしら対策ができないか。

一回戦 セレナーデ☆ゆうき選手 vs muller選手。最後ラグで試合終了と勘違いしたというところ。配信(観戦PC)ではラグっぽくは見えなかったので、対戦PC側でラグがあった感じだろうか。1回戦最後の試合だったので、連続稼働で重くなる現象がまだ残っているのかな。ちなみに大会後にセレナーデ☆ゆうき選手からソフトのせいにしてすみませんと謝られてしまった。面白いだけでなく人間性も素晴らしい方ですね。

全体

今回からトロフィー(?)に優勝者の名前を刻んでいくとのこと。ということは来年度以降もある、という宣言と受け止めました(私はその辺りは聞いてないので勝手に言ってるだけ)。

大会も身内の大会から一般化して、新しい人が優勝して、今後も楽しみ。な一方で、前回も少し書いたけど、Weather Typingは来月で23周年という古いソフト。大学生がコンセプトの重要性も分からないまま適当に「Weather」って付けてもはや謎の名前になっているくらいのソフトなわけで、タイピングe-sportsのポテンシャルを活かせる新しいソフトウェアの必要性はやっぱり感じる。私も新しいタイピングソフトを作ってたりはするけど、100連勤とかの合間に進めるのは難しくて、誰か作りませんかね。

ALL ABOUT マイコンBASICマガジンⅢ申込み。12:00に待機してチケットページを開いてみたが混雑中が続いてなかなか取れず。何度かリトライした結果、12:07くらいにようやくつながって、S席のちょうど真ん中くらいが取れた。

S席だけでも500席近くあるのでしばらくは大丈夫かと思ったけどその後数時間でS席と2A席が売り切れ。もう半分近く埋まったってことかな。締切5/18までなのでどうぞ。

去年からベーマガイベントが復活するという情報があったが、正式に発表された。第一回が秋葉原で500人規模、第二回が有楽町で1000人規模、第二回のSP版が大阪で300人規模、今回は蒲田で1500人規模、かな? 段々大きくなっていってるのがすごい。

ここ2年くらい職業の方で組み込みの勉強が手一杯で、本業の開発が全く進んでいない。ただ、そろそろ組み込みの方も多少知識が追いついてきた感があるので、今回のベーマガイベントで開発モチベーションを上げられるといいなあ。まずは国会図書館でベーマガを読みに、行ける時間があるかなあ。

変わらず忙しすぎてDenasu関連の進捗なし。

必要があってOpenAIを使おうとしたら、Creditの試用期限が切れてたので課金してみた。とりあえず$100課金してちょっと遊んでみたけど1円未満だったので結構遊べそう。

以下はWeatherTyping用の問題文を作ってもらったもの。もう少し長めに生成してもらいたいんだけど、ちょっと試した感じ難しかった。API呼び出しできるので、ウェザタイから呼び出してワード生成を任せることもできる。やるとしたらワードを作る度にお金がかかってしまうので、有償オプションになるのかな。ユーザのOpenAIトークンを入力してもらえばいいかも知れないけど、そういうモデルにしてるサービスってあるのかな。

ちなみにワードサーバの形で実装すれば誰でもChatGPT使用のウェザタイワードサーバを作成できるので、プロンプトエンジニアの方々、是非よろしくお願いします。

月1回の日記ノルマを消化しないと。

Typing Field開発は進めたいんだけど、その前にWeather Typingロビーやランキングのセキュア化をやらないといけなくて、そうするとWeather Typing自体の作り直しが結構発生する。ついでに前々から話がでていたXamarin Formsの廃止と.NET MAUI移行の話もあって、どうせならWeather Typing 5.0にするかな、と思っているところ。

Typing FieldはUnityで作っているが、Xamarin Formsとコードベースがかなり違うので別々のソースになっている。これだとメンテもしきれないので統一したいというものある。ただ、.NET MAUIはXamarin Formsの後継なので、Xamarin Forms同様誰も使ってる人がいなくて大量のバグに悩まされる可能性が高い。ので、Unityかな。

Unityに移行するとなると、多少安定していた今のバージョンからまたしばらく不安定なバージョンが続くのが懸案だけど、自動テストを駆使してなんとか安定させたいところ。

ロードマップとしては以下なんだけど、あと10年くらいかかりそう。

  1. ロビーのセキュア化:完了
  2. ロビーの自動テスト:完了
  3. ランキングのセキュア化:完了
  4. ランキングの自動テスト:作業中
  5. Weather Typingのセキュア化
  6. ベース部分をUnityへ移植
  7. ベース部分の自動テスト
  8. Weather Typing UIをUnityで作り直し -> WT 5.0リリース
  9. Typing Field UI作成
  10. Typing Fieldのゲームデザインやり直し
  11. Typing Fieldのアセット作り
  12. Typing Field実装 -> TF 1.0リリース

まあ、常に開発していたいので、これくらい大変じゃないとやる気しないよね、ってことで。

ゴールデンウィーク終了。いろいろ必要だったのでずっとモダンな開発プロセスを勉強してた。

まず「単体テストの考え方/使い方」。以前AppiumでWeather TypingのUIテスト自動化を作って、ほとんどのテストをUIからテストするようにしてたんだけど、Appium自体が既に使い物にならなくなってるし、ちょっと機能エンハンスするだけでテストに通らなくなってしまうので諦めていた。が、この本を読むとUIテストで完全に自動テストするのはアンチパターンぽいことが分かった。もっとボトムアップに、外部仕様だけをテストするようにすればいいのか。とりあえずテストしやすいロビーやランキングからテストコードを作っているところ。

「ボトムアップ」というのは、UIは一番上位レベルのテストなので、UI仕様がちょっと変わるとテストが壊れるし、フォーカスを合わせたりスクロールしたりでとにかく動作が不安定で時間もかかる。なので、全てのケースをUIでテストするのは効率が悪すぎる。そうではなく、各クラスの動作を確認できる箇所は各クラスで確認して、その結果を前提にして上位のクラスの動作を確認して、UIのテストはUIのテストだけをすべき。そのためには実装もテストしやすいように作る必要があって、ロジックとUIを分離して、ロジックはロジックだけで高速な自動テストができるようにし、UIは単なる表示だけにして中身はロジックを呼び出すようにする。

「外部仕様だけ」というのは、内部仕様を自動テストに入れてしまうとすぐテストが壊れるので、将来的に変更のされない、というかそこを変更し直すなら当然テストコードも変更するよね、というものだけをテストする。つまり一つ上位や同じ階層向けのI/Fをテストする。こうしておくと内部実装の細かいところを変えてもテストコードは変わらないし、API名が変わるならリファクタリング機能で一括で変わるし、新しく機能を作ったならそこだけテストを追加すればいい。

で、この本もそうだけど、manningのこのシリーズの本いいですよね。「セキュア・バイ・デザイン」もすごいよかったし。


次にGitHubとCI/CD。Git自体はずっと使っているけど、そろそろCI/CD周りを勉強しないとついていけなくなっているので「Accelerate DevOps with GitHub」を読みつついろいろ試してみた。まだPart4で80%くらいまでしか読めてないけど。GitHub Actionでかなりいろんなことができて、ビルド、単体テスト、静的解析、クラウドへのコンテナのデプロイ、脆弱性スキャンみたいなことまで自動でできて、チケット管理とかクロスチェックとか、修正しないとビルド失敗も可能。なるほど、こういう風に使うのか。

機能をフルに使うにはパブリックレポジトリか有償になってしまうので、今のウェザタイで積極的に使うのは難しいんだけど、セキュリティ課題が解決したらいっそOSSにしてしまう手もある。


てことでセキュリティ。最近ウェザタイのロビーも末期になってきて、セキュリティをちゃんと実装するか廃止するか、って感じになっている。てことでTyping Fieldで実装しているセキュリティ機能をウェザタイに移植中。主にはTLS化とFIDOぽい認証。ここまでいけばロジックを守る必要はないので、あとクライアントの秘密鍵さえちゃんと守れれば、ランキングのチートも難しくなってOSSにしてもよさそうなんだけど、HSMを前提にするわけにはいかず、TPM使うのも大変。オンラインゲームでOSSにしてるようなものってあるのかなあ。というかブラウザゲームはOSSみたいなものだけど、チート対策ってどうしているのか。通信の保護をやぶるよりキーボードをシミュレーションする方が手っ取り早いからあんまり問題にならないのかなあ。

しばらく「なれる!SE」シリーズを読んでいたのだが、全巻読み終わったので。Kindle Unlimitedでほぼ全巻読めるのでお徳。

これはラノベ?なんだけど内容がすごいリアルで読むのに体力がいる。騙されてネットワークインフラエンジニアになり、PM、提案、管理職などをいろいろ経験していくお話。協力社員が協力しないとか、顧客先常駐して無茶振りされるとか、あるあるな状況になりながらもちょっとおかしな方法で解決していく。

で、最終巻、最後の議論。これがメインテーマだとしたら物語全体を見る目が変わってくる恐ろしい構成。日本のSIerは高度エンジニアをすぐマネージメントや事業戦略に就かせて代わりに素人を投入する。それはITのスキルが重要なんて誰も思っていないから。その結果素人しかいなくなって日本のIT業界は何も生み出せない。

と、まあよく言われていることだけどその通り。終身雇用で1つの会社に居続けるためにゼネラリストにならざるをえなくて、新卒一括採用だから素人を入れざるを得ない、と。それが嫌なら独立するか外資系にいくしかないと。どっちにしようかなあ。

タイピング日本一を決める大会「REALFORCE TYPING CHAMPIONSHIP 2023」、3/12に行われたオフライン大会を観戦してきた。RTC2023は2019年以来4回目。RTC2019年の後、にじさんじ打鍵王でタイピングが盛り上がったり、miri選手が数多くのテレビ番組で紹介されたり、今やれば結構注目されるんじゃないかと思っていたが、長いコロナの休止期間を経てついに開催。今日を逃すといつ日記を書けるか分からないので当日中に残しておく。

今回、会社員の活動が1月からずっと休みなしなので現地観戦も行く気力がなかったのだが、Twitterで観戦勢の報告を見ているとやはり行きたくなってきたので現地へ。タイピング速度測定の作者様やタイピンガーZの作者様と少しだけど話ができて良かった。

去年までの観戦記:RTC2017RTC2018RTC2019
配信はYoutubeTwitch。今回twitterの反応が結構多い気がしますね。

タイパー視点での感想

タイパー視点でというのは他の人が書いてくれるのでここでは省略。といっても最近はtwitterで投稿するだけでブログ書く人も減ったけど。

個人的にはWeather TypingというコンテンツはRTC2019のひろりんご選手のGrand Finalがエンディングで、これ以上の展開はもうないと思っていたけど、これだけ選手が入れ替わって新しい展開になるとは。今回日テレ共催になることで、いい意味で内輪向けの大会から脱却しつつある感じがした。

会場は日テレのスタジオということで豪華。カメラワークとか、青と赤の照明の効果的な使い方とか、演出がすごい。

今回特にかなvsローマ字、かなvsかな、ローマ字vsローマ字それぞれ見所があった気がする。ワード毎の特徴も結構はっきりしているのでその辺を理解すると面白いかも。

具体的な対戦で特筆するとしたら3位決定戦のはやとぅ選手。前回95%ルールをうまく使っていたので今回はどう魅せてくれるかと思っていたが、今回も3位決定戦で相手が95%からミス入力して94%になった一瞬の隙を突いて勝っていた。

決勝戦はもはや言うことないですね。Weather Typingの試合で一番面白いのは互角の対戦だが、あの速度でのローマ字vsローマ字の完全に互角な対戦は最高に盛り上がる。現地の緊張感がすごかった。

あとは選手のキャラクター性も重要になってきたかな。今回たのんさんが公式ガイドを作成していたが、各選手の紹介が入っていたのが良かった。にじさんじ打鍵王が盛り上がるのはそれぞれキャラクターがあってそれぞれにファンが付いているところも大きいと思うので、miri選手の「王者」みたいにはっきりしたキャラクターがあって周知されていると強い。そういう意味ではセレナーデ☆ゆうきさんには給料を払ってでも毎回参加してもらうべきだと思います。

開発視点での感想

今回は観戦している分には問題らしい問題はなかったと思うのだが、どうだろう。RTC2017以降、動作が重くなる問題、結果画面が表示されない問題、片方のワード開始が遅れてしまう問題、最初のワードが打てなくなる問題、と毎回何かしら問題が発生して運営に支障が出ていたのだが、4回目にしてようやく安心してみることができた。

今回RTC版は以下の改善を入れている。この辺は本体に取り込む予定。

  • 観戦モードで1プレイヤー側の打鍵音を出すようにした。これは「HOKKAIDO esports FESTIVAL2022」の後に頂いた要望だが、ようやく実装。リプレイでも同じ要望を何年も前から言われているけど、同様なので修正するかな。
  • 観戦モードでプレイヤーの表示順を固定する。画面左のプレイヤーが必ず上に来ないとどっちがどっちなのか混乱するので、必ず同じ順番になるようにした。この辺りは次バージョンの別修正の副作用でどちらにしろ実装する予定。
  • 観戦モードのときに他のプレイヤーが全員落ちると動作がおかしくなる。これは念のため。

あと、RTC2023向けというわけではないが、ワード終了時のkpm表示は入れて良かった。もはや昔からこういう仕様だったかのようになじんでいるが、実は2018の大会の時に「入力不能時間のときにグレーの文字を表示するくらいだったら、ワードを非表示にした方がいい」という意見をもらってRTC2019で非表示化した。その後、それならその非表示の時間にワード毎のスピードを表示しよう、となって追加したもの。どっちがワードを取ったか、またワード毎に1000kpmオーバーとかが数値で分かりやすくなって盛り上がりに役立っていた。

まとめ

RTC2019以降、東プレさんもずっと開催のため調整を続けていたことを知っているので、ついにオフライン+観戦ありという最高の形での開催を実現して頂いた運営さんへは感謝。演出や配信、e-sportsとして本気でやっていこうというのを感じる。

一方ここまでいくと個人で作っているWeather Typingの限界も感じる。タイピングのe-sportsとしてのポテンシャルに比べてソフトウェアが足りていない感はずっとある。モダンなオンラインゲームとしてタイピングe-sportsのポテンシャルを活かせるソフトウェア、誰か作りませんかね?

WT Android版 4.3をリリース。他のプラットフォームで修正したいくつかのバグFixと、Simejiでもとりあえず動くようにしたくらい。IMEは全ての方式に対応はできず、一つのIMEに最適化すると他で動かなくなるのでいろいろ妥協しているので、とりあえずGboardでもSimejiでもなんとなく動くようにした。

で、今回Android 12向けにしたのだが、ストレージ周りが変更になって苦労した。内部ストレージにデータを入れるとアンインストールで全部消えてしまうのでSDカードにデータを置いていたのだが、Android11で使えなくなった。SDカードのアプリケーション領域に置いているので、4.3ではWTをアンインストールすると記録が消える。今時はクラウドに置けばいいんだろうけどリリースを優先させたのでそこまでは変えなかった。以前のバージョンからアップデートすると勝手に移動されるようにはしたので過去のバージョンの記録は消えない。

あとはGoogle Playのリリースにあたってデータセーフティのポリシーを定める必要ができた。20年前の設計なので暗号化もないしデータの削除機能もないが、別に公開しておけばいいのか。そこで出てくるR8による難読化ってのが気になったけど、Android単体で難読化ができるようになってるのか。今回はやらないけど調査要。

denasuサーバをメンテナンス。ロビーに人がいないタイミングがなかなかないのでメンテナンスするタイミングが難しい。サーバを再起動してもクライアントからある程度再接続するようにできればいいんだろうけど。

最近ロビーサーバへの攻撃が増えているのでその対策と、人が多くなってきたときにゾンビが出てきてしまう問題の修正。1つ目は通信のチェックはしてるんだけどそのまま通信がつながったままになっていたので明示的に切るようにした。2つ目はJavaのSynchronizedでinner classのthisをlockしていたのが問題で、ロックされてなくてnullポインタが起きていたのが原因、と思われる。何年も調査してたんだけど原因が分からず、今回Typing Field開発にあたってさすがに修正しようと思って1週間くらいデバッグした。本当にそれが原因かは分からないけど、ロジック的にそこしかなく再現させたときの動作も一致しているので修正して様子見。

7月が終わってしまうので日記を更新。

Typing Field、周辺の実装を進めている。まずはセキュリティ。20年前にウェザタイ作ったときはパスワードも平文で送れば良いし通信も平文でいいや、って感じだったけど、さすがにちゃんと作らないとなあ、ってことで「オンラインゲームセキュリティ」という本を読んでいる。

認証については、FIDOっぽく公開鍵を使ったパスワードレス方式にしてみた。ついでにユーザ名が一意でなくてもいいように、自動生成IDで区別するようにする。ウェザタイはすでに主要な名前は取られていて新規参戦が難しい。この方式なら好きな名前を使える。

通信はどうしようかな。単純にTLSにしてもいいけど、遅延とか問題になるんだろうか。

あとは、「気持ちいい」から考えるゲームアイデア講座」を読んでみた。ゲームシステムをいろいろ考えているけどなかなか面白くならず、試行錯誤。

今のペースだと完成まであと3年くらいかなあ。これだけに絞りたい。

にじさんじ打鍵王 2を視聴。にじさんじ打鍵王は2020年4月以来、二回目の開催。前回開催時の日記
少し前に、第二回開催にあたって今回もWeather Typingを使って頂けるとの連絡をもらい、楽しみにしていた。

大会について

ここはウェザタイの制作者側の記事ということで内容についてはあまり触れないが、各試合、違いが出ていて面白かった。特に準決勝以降は普通に速度も速くて見応えがあった。やっぱりウェザタイの面白いところは接戦時の緊張感ですね。プレイしてても見ていても面白い。

そして運営側もかなり慣れていて安心感が。OKが押せない問題にあらかじめ対応を検討していたり、その場合キャンセルしてもゲームキーを変えないなどのノウハウがあったり。まだまだオンライン大会に使いづらい部分もあるのでいろいろ工夫して使って頂いてありがたい。

サーバの負荷テスト

前回もそうだったが、今回もサーバの負荷テストみたいになっていた。今回、同時視聴数が75000くらいで前回の2倍以上になっていて、ウェザタイサーバ同時接続数も前回の40人から70人くらいまでいっていた。それでもCPU20%、メモリ70%くらいだったのでまだ大丈夫かな。

ウェザタイについて

ウェザタイは実は2年前からバージョンアップしてなくて、いろいろ修正が必要な点がたまっている。M1 Mac対応とか。ただ、できるだけ新タイピングソフトの開発に開発リソースを割きたくて手が回っていない状態。

タイピング対戦の面白さをもっと一般に広めるには、もっと配信に映えるようなタイピング対戦ソフトが必要ということで、eスポーツ化に向けた3Dタイピング対戦ゲームを作っている。まだリリースはずっと先だけど、最後に宣伝。

気分転換にパネル表示をいじってみる。とりあえず半透明のパネルを出していたのだが、もう少し工夫したいのですりガラス処理+角丸四角形にしてみた。

中身のデザインが今ひとつだけど、とりあえずパネル自体はこんな感じかな。すりガラスも角丸もシェーダーで実装。

すりガラス

すりガラスは一般的にはガウシアンブラーを使うらしい。ただ、普通に5×5とかのカーネルで処理すると重くなるので、縦5をかけた後に横5をかける、みたいに2パスでやるらしい。検索するとそういう方針でGrabPass(レンダリングされた画像を取得するやつ)を使用した例がたくさん出てくる。

ただ、Universal Render PipelineだとGrabPassがサポートされてなくて、同様の機能を持つCameraOpaqueTextureを使うと2パスができない(と思う)。なので、カーネルを省略して十字みたいな感じに近似してみた。上の画像の通りそれっぽくはなるからいいかな。

角丸四角形

角丸四角形はなかなか難しい。公式的にはRounded Rectangleっぽいんだけどそのままコピペしてもうまくいかない。なので参考にしながら自力で実装。

float RoundedRectangle(float2 uv, float width, float height)
{
    // uvは-width/2~width/2、-height/2~height/2の座標

    // uvから一番近い矩形状の座標を計算する
    float2 pt = float2(min(abs(uv.x), width / 2 - _Radius), min(abs(uv.y), height / 2 - _Radius));

    // 計算した矩形状の位置とuvとの差分ベクトルの長さを計算する
    float d = length(pt - abs(uv));

    // 半径以内なら1、半径よりおおきければ0
    return smoothstep(d - _Radius / 10, d + _Radius / 10, _Radius);
}

fixed4 frag(v2f i) : SV_Target
{
    // 角丸四角形判定。範囲内にあるならr=1、ないならr=0
    float width = 1 / _CameraOpaqueTexture_TexelSize.x;
    float height = 1 / _CameraOpaqueTexture_TexelSize.y;
    float2 uv = float2((i.uv.x - 0.5) * width, (i.uv.y - 0.5) * height);
    float r = RoundedRectangle(uv, width, height);
 
    // 角丸四角形外(rが0に近い)は描画しない。
    clip(r - 0.1);

    ・・・
    ガウシアンフィルタ処理(他でたくさん紹介されているので省略)
    ・・・

    // 角丸のα値:r
    // オリジナルのα値:α
    // オリジナル色:o
    // ガウシアンフィルタをかけた背景色:b
    // とすると、以下で表せる
    // rα*o + (1-rα)*b

    fixed4 col = r * _Color.a * _Color
        + (1 - r * _Color.a) * b;

    return col;
}

こういうときに数学が役立つ。数学の知識がない場合、ぴったりうまくいくコードを見つけてコピペするかAssetを買うしかないので不利になる。

5月の日記がゼロになってしまうので何か書いておこう。

相変わらず副業(会社員)が休みなしでなかなかTyping Field開発が進まないのだが、今は音作りをやっている。BGM、システム音、攻撃、レベルアップなどいろいろなSEが必要。

BGMは一応作曲の入門本を読んではみたけど、さすがにすぐに使えるレベルにはならなさそう。昔から打ち込みとかMIDI楽譜生成ツールのPurentro作ったりはしてたのでなんとなくは分かるし、作曲少女シリーズを読むと何かしら作れそうな気分にはなるけど・・・。ちなみに同じ作者さんのトークバックは面白かった。AIで作るのも考えはしたけど、コンセプトにあったBGMという縛りがあると難しそう。てことでまずはコンセプトに合いそうなBGMをpixtaで購入。いずれ置き換えられればいいなあ。

効果音も素材から全部買ってもいいけど、結構大量に必要。簡単なものならシーケンサーで作れるってことで試行錯誤中。まあシーケンサの方が金額的には高くなるけど。ただ、どこをいじるとどんな音になるのか、ノウハウが出回ってないので難しい。サウンドエフェクトの作り方を参考にしているけど、それに載っていない音はどう作るのか想像ができない。再現したい音を観察してアタックとかエフェクトとかがこうなっているはず、みたいなことをやっていく、ってことだと思うんだけど・・・。

脈絡なくスクリーンショット。

Typing Field開発。今週はBlender+Unityのアニメーション。ずっと適当な動きのまま放っておいたのでそろそろちゃんと作り込む。

やりたいことは、プレイヤがキーボードを首からぶら下げて、問題文章が表示されたらキーボードに手を置いて、そのまま歩き回れるところまで。Action People Pack 2の部品として使えるように作っているが、モデルには関係ないはず。次回いじる際にはもう忘れているのでメモ。環境はBlender 3.1.2+Unity 2021.2.18f1。試行錯誤の結果なので不要な手順、間違ってる手順とかもあるはず。

[Blender] キーボードモデルの作成

まずBlenderでキーボードを作成。四角とベジエ曲線、キーボードのテクスチャとバンプマッピングで作った。

Advanced People Pack2で部品として使う場合はオブジェクトが一つになっている必要がるので、キーボードとロープを一つにする。ベジエ曲線を[ConvertTo]-[Mesh]、キーボードとロープを[Object]-[Join]で結合する。あとで調整できるように変換前のオブジェクトをバックアップしておく。

[Blender] Rigとの関連付け

このままモデルを出力してしまうと、Rigと関連付けられていないのでUnity側でデフォルトの位置に表示されてしまう。そのためRigに関連付ける。オブジェクト->適当なRigの順でShiftクリックで選択し、Alt-P-[With Automatic Weights]で関連付け。するとモデルの下にVertex Groupsが作られる。関連付けを解除するにはオブジェクトを選択してAlt+P-[Clear-Parent]。

この状態だと全てのRigにちょっとずつウェイトが関連付けられて変形してしまうので調整。衣服なんかだと良い具合にウェイトを調整して、ボーンアニメーションに追従させるのだが、今回の場合キーボードは曲がったりしないので特殊な設定になる。要するに一つのボーンに全体を100%ウェイトにして、他のボーンにはウェイトなしにすれば、一つのボーンの動きや角度に追従して、何も変形しないものが作れる。ってことで、今回はChestのRigに追従させる。Neckの方が妥当に見えるけど、走るモーションと組み合わせたときにキーボードと首の角度差によってめり込んでしまったのでChestにしてみた。まずChest以外のVertex Groupを削除し、Chestを選んで[Weight Paint]モードにして真っ赤(1.0)にする。

[Blender] モデルの出力

ここまでやったものをfbxで出力。Blenderを再起動する度に設定が初期化されるので面倒。オブジェクト-Rigの順番に選択して、[File]-[Export]-[FBX (.fbx)]で、以下の設定で出力。デフォルトと違うのは、Select Objects、ArmatureとMeshを選択、FBX ALL、Apply Transform、Face、Only Deform Bornsオン、Add Leaf Bonesオフ、Bake Animationオフ。その際、モデル自体は非表示にしてRigだけにしておくと余計なものがエクスポートされない。

[Unity] モデルの読み込み

次はUnityでモデルを読み込み。fbxを選択したときのプロパティから、[Rig]タブでAnimation Typeを[Humanoid]に、MaterialsタブでMaterial Creation Modeを[Import via MaterialDescription]にする。マテリアルは一度fbxからExtractしておいてUnity側で再設定。しなくてもいいかもしれないけど。

Action People Pack2で部品として扱う場合、Item 1か何かのプリセットを増やして、キーボードモデルとマテリアルを設定する。マテリアル側でBump Mappingを設定し直しているのでちゃんとキーが立体的に見える。ここで設定を変更した場合、キャラクター側で設定をロードし直すのだが、Animation Controllerがデフォルト値に戻って自作のアニメーションが再生されなくなってしまうので、手動で設定し直す。

[Blender] アニメーションの作成

Blender側でアニメーションを作成する。モデルと同じblenderファイルでできればいいんだけど、何故かボーンがうまくUnityに反映されなくなってしまう(手首の角度が変になった)ので別々のファイルにしてある。

Rigを選択して、Posing Modeで好きなようにポージング。[A]キーでRigを全て選択して[Pose]-[Animation]-[Insert Keyframe]。とりあえず単純にキーフレーム1個だけ。

1つのfbxファイルに複数のアニメーションを入れることもできて、その場合、Animationタブの「Dope Sheet」になっている箇所を「Action Editor」にして、アニメーションを追加する。

設定が終わったら、[A]キーでRigを全て選択してfbxエクスポート。さっきの設定に加えて、[Bake Animation]をオンにしておく。その際、モデル自体は非表示にしてRigだけにしておくと余計なものがエクスポートされない。

[Unity] アニメーションの設定

Unityでアニメーションを読み込み。fbxを選択したときのプロパティから、[Rig]タブでAnimation Typeを[Humanoid]に、MaterialsタブでMaterial Creation Modeを[None]。Animationタブで、Clipsにアニメーションが全て表示されていることを確認。

あとは普通にAnimation ControllerでMotionを設定する。複数のアニメーションを共存させる場合はLayer分けして、AvatorMaskを設定。

[Unity] 実行

ついに実行。以下のスクショは分かりやすいようにあえて前カメラで見ている。

久々にお休みにしたのでTyping Fieldの開発を進める、はずだったんだけど割と機能は揃ってきたので、アイテム作りを進める。まずはデフォルトで持っている「宝箱を開けるアイテム」のアイコン。

ってところで今日は終わってしまった。1個アイテム作る度にアイコン作りに1日かかるのか。。。アセットも探してみたけど、全てのアイコンで雰囲気とか向きとか光の方向を合わせないといけないので、探すより自分で作った方がいいだろうと。割とちゃんと作れたと思うけどどうかな。

Xamarin.Forms 5.0.0にアップデートしてずっと困っていた問題が解決。ようやくウェザタイのWindows Desktop版がまともに動くようになった。

Xamarin.Forms 4.8からWPFのフォント指定ができなくなった。ウェザタイの?ボタン等にGoogleのマテリアルアイコンを使っているのだが、豆腐になってしまう。GitHubのバグ報告にもあがっていて5.0.1で修正されることになっていたので待っていたのだが、1年以上そのまま。.NET MAUIに移行しようにもまだ正式リリースされないため、Visual StudioのPreview版を入れると環境がおかしくなるのでやりたくない。

ということでウェザタイのバージョンアップが止まっていたのだが、いろいろ大会や配信なども行われていて、修正したいところが増えてきたため、本格的に調査。

Xamarinの該当するソースコードを読んでみて、組み込んで実行してみると、どうもURLを指定する方法からリソースファイルを取ってくる方法に変わっている。で、いろいろ探っているとフォントを指定する新しい方法が紹介されていた。各プラットフォームでそれぞれフォントを指定していたのを、共通のプロジェクトで指定できるようになったらしい。これを設定したら表示されるようになった。

だったら、「(古い方法が使えなくなったのは)バグだから修正する」ではなく「新しい方法を使ってくれ」と言って欲しいのだが・・・。

HOKKAIDO esports FESTIVAL2022」でウェザータイピング企業対抗戦が開催された。元々は他のイベントとともに開催予定だったのだが、コロナの影響で延期になっていたもの。Youtubeでアーカイブしているので是非。ボンバーマンも面白かった。

企業対抗戦ということで、北海道のメディアや学校、IT企業などが参加していて、通常のeスポーツに比べて幅広い参加者。オフライン大会だったので、現地の盛り上がりが感じられて良かった。

最初開始に手間取っていたのは何だろう。サーバはちゃんと動いていたので、操作的なものかな。あと例えば、文字が小さくて読みづらかったので、文字拡大してもらえると良かった気がする。この辺、大会のときはこういう風にやるといいよ、的なTipsを公開すればいいんだろうけど。

ということでタイピングeスポーツ専用のソフトってことで作っている「Typing Field Online」だけど、2月から副業の会社員が休みなし状態なのでなかなか進まない。

ずっと表向きの職業が忙しいのだが、Typing Online(仮)をなんとか進めている。早いところゲーム製作一本に絞りたい。

タイトルはひとまずTyping Field Onlineにしてみた。タイピングが全ての空間みたいな。

そしてワードは自動生成。Weather Typingのときもディープラーニングによる自動生成を入れてみたけど、今回はそれをメインにするのでいろいろ改善してみた。最終的に、日本語と英語で、ウェザタイの文章っぽいフレーズができるようになったのでこういう感じに。

あとはCPUのAIをちゃんと作り込んで、攻撃アイテムを持ってなければアイテム探し、持っていればプレイヤーを探して攻撃、みたいにしたので一人プレーがちゃんとできるようになった。

てことでプレイしてみたけど、これは結構面白いと思う。アイテム運があったり、相手の隙を突いて攻撃、相殺みたいなウェザタイにはない戦い方もできるし。複数の対人対戦やってみたい。

ただ3D酔いしやすいかな。眼が疲れているのか判断が難しいけど。そのあたりのガイドラインを調べるか。

Twitterに載せたのでTyping Online(仮)の進捗をこちらにも。細々と開発は進めていて、キャラクターカスタマイズとかBGMを調達したり足音を作ったりしてみた。

ゲームシステム的には、入力の相殺を入れることで、相手の入力をキャンセルすることで接戦状態を作り出したり、Comboやワードの難易度で攻撃力を変えたりルールに工夫をしてみたところ、割と面白くなった気がする。下の動画では最初から無限ワードを持ってるけど、最初は何も持っていない状態にすればもう少し駆け引きが作れるかな。

あとは、ウェザタイとは違って途中参加をOKにしてみた。こう言うゲームだと一斉参加で誰が最後まで生き残るか、みたいなルールが普通っぽい気もするが、なかなか人数が集まらないはずなので、一人でCPU戦をしつつ誰かが来るのを待てる方がいいかな、と。部屋を作れるようにすれば大会モードも可能だろうし。

この後は、CPUのAIを作り込んで、ワードやアイテムを一通り用意する予定。分かっているバグが30個くらいあるのでテストプレイするにはまだしばらくかかるけど。

夏休み以降ついに作業時間がとれたので開発を再開。もうそろそろこっち一本に専念したいところ。

で、UnityのAIエンジンであるBarracudaが2.2.1になっていたので試してみたところ、以前の日記で書いていた問題が解決した。修正ソースコードを見てもズバリここが直っていたわけではなく、いろんなところが直っていてよく分からないが、「Fixed GPU Flatten when channel order is NHWC」この辺りの修正なんだろうか。ともあれこれでBarracudaのソースコードに自力でパッチを当てなくてもよくなった。

もう一つ修正待ちのXamarin Formsは5.0.1が出る気配はない。5.0.0だとWPFのフォントが文字化けしてしまうのでウェザタイのバージョンアップもできないまま。

表向きの仕事が忙しすぎて7月日記更新できなかった。一応細々実装を進めてはいて、夏休みを全て使ってバグ取りをしていた。

クオリティはおいておいて、システムはだいたいこんな感じかな。フィールド上のワードとかアイテムを取得して、使うときはタイピングで呪文詠唱。

あとは、いろいろワードとアイテムを揃えて、キャラカスタマイズとか総打鍵数カウントとか、エフェクトをまともに実装して、SEとか音楽とか作って、カスタムキーボードスキンとか追加すれば完成かな。・・・完成まで何年かかるんだろう。

Warriors of Typing S3 -夏の陣- の配信を見ていた。一通り動いてはいるのだが、やっぱりいろいろ直したいところがありますね。

実はXamarin 5.0.0にアップデートしたらカスタムフォントが使えなくなってしまい、5.0.1で直るらしいのだが、まだまだ時間がかかるようでウェザタイも更新できないという状況だったりする。このままMAUIになってしまうのだろうか・・・。今更Unityにするのは辛いし。

で、Twitterで検索しているとWarriors of Typing以外にも最近ウェザタイを扱っている方が何人かいる模様。今のウェザタイは20年分のしがらみがいろいろとあって分かりにくい箇所が多いですよね。ワード1とワード4って何が違うんだ、とか。

ワード自動生成を試している動画もあったけど、別件でいろいろ問題が見つかっていて、打てない文字があったり不適切な単語が混じっていたりする。この辺も直したいんだけどいつになるかなあ。

タイピングオンライン(仮)。なんとなくキーボードを使った呪文詠唱戦みたいなコンセプトにすることが決まったので、少しづつ世界観を作り込んでいかないと。

てことで手始めに「Unityゲームエフェクト入門」を読みつつエフェクトの練習を始める。本に載っていたほぼそのままのやつで以下のような感じになった。

The Typing of the DeadはThe House of the Deadの派生なのでキーボードから弾を撃つ感じだったけど、魔法戦だとこんな感じかなあ。これだけでも割と変わりますね。効果音とか舞台設定がコンセプトと合ってないのでいまいちいいのかどうだか分からない感はあるけど、いい感じのバカっぽさはある。

タイピングオンライン(仮)の進捗。

前回までやっていた「タイピングして相手のワードを打つ」というルールだと全然面白くなかったので、ゲームデザインの本を読みあさりつつずっとルールを考えている。

で、少しずつ面白くなりかけてるバージョン。ワードの種類をいくつか用意して、自分が宣言したワードを打つと相手にダメージが入るようにしてみた。自分が打ち終わる前に相手がワードを宣言して打ち終わるとダメージは入らない。多少かけひき、戦略が生まれると思うんだけど。まだ単調な気もするので、さらにジャンケン要素が入るともっと面白くなりそうかな。ただCPU戦だといまいちどう戦うのがよいのか分からないので、早く対人戦をやってみたいところ。やってみたいですよ、ねえ。

とりあえずワードは「単語」「短文」「文章」を選んで、長いワードを打ち終われば大きなダメージが入るようにしている。早い人相手でも単語をたくさん打てばダメージを入れられるわけだけど、そうなると泥仕合になったりして、どっちが勝つか分からなくなるかな。当然ノーミスコンボとかあるだろうし。あとは、数値多めワードとか、カタカナ多めワードとか、入力困難ワードとか、アイテムで取れるようにするつもり。ウェザタイでワード自動生成とワード難易度判定を研究したからこそ可能な話。

デバッグ版だとディープラーニングが結構遅いので動画がカクカクしてるけど、この辺は調整次第でなんとかなりそうかな。

【視聴者参加型】即打!タイピング勝負!【鈴木勝/にじさんじ】を視聴。配信者が視聴者とWeather Typingで対戦する企画。第4回目くらいですかね。いつも使って頂いてありがたい。そういえば打鍵王も隔年開催という噂が。

やっぱりワードの組合せが面白くていつまでも飽きないのがいいですね。完全自動生成でもこのくらい面白くなればいいんだけど。

対戦について。我慢できず自分もこっそり参加してみたけど楽しかった。2ポイントしかとれなかったけど。同じくらいのレベルの人と対戦するのが一番面白い。ので、今作っているやつはアイテムとかコンボで何かを溜めるとかそういうのを考えているけど結構むずい。

それはおいておいて課題をメモ。

  • グラフで数千kpmになっていることが。昔たにごんさんがレベル57相当を出して修正したんだけどまだ何かあるのか→かり~さんから、ラグがあるときに1フレームで数文字打って次の問題へいった場合という情報をもらいました。
  • 「ゲームキーを毎回変更する」オプションはゲーム終了ごとに変更するという意味。ゲーム中には変更できない
  • 誰かの反応がなくなった場合などホスト側で強制終了したい。現状は全員ESCがいるのでデッドロック
  • 最大人数を制限しているとき、同時にアクセスしすぎると最大人数を超えてしまう→8人はサーバで制限しているので超えないが、それ未満はゲーム毎に違うのでホストからサーバへ通知している。排他制御がうまくいっていない。
  • 対戦開始画面で名前が黒くなってしまうことがある。ゲーム開始すると色が出る。
  • スマホ vs PC。実際対戦しているのは初めて見たけど、通信環境的に厳しそうだった。ワード取得後の判定は全員の結果を待つので、スマホの人がボトルネックになって遅れることが結構あった。遅延が大きいのかパケットが詰まってしまうのかは不明。

ウェザタイ4.1ではディープラーニングを使ったワード自動生成を実装した。で、Unityで作っているタイピングソフトでは基本的にワードは自動生成にしたいな、ということで調査。

PyTorch+BarracudaでLSTM

UnityではBarracudaというエンジンを使ってディープラーニングを動かせる。多分例によって他で学習したものを使えるだけ。つまりPythonなどで作ったモデルをONNXに変換するとUnityでも使えるようになるのだが、前回の日記のようにkerasではTensorFlow2が使えなかったりして変換ができなかった。PyTorchも変換したモデルをUnity上に持ってくるとエラーになっていたのだが、Barracudaのバージョンを1.3.3(実験版)にすると読み込んでくれた。

で、Embedded層、LSTM層を入れたモデルを動かしてみたのだが、どうも一箇所おかしな部分がある。BarracudaReferenceCPU.csのLSTM関数で、入力テンソルの形が(ワードベクトル, バッチ)になっているぽくて、LTSMの各ゲートの重みテンソル(ワードベクトル, 隠れ状態)との内積を取ろうとして行列の型エラーになってしまう。具体的にはここ。

var i_mad_w = _(Add(new[] { _(MatMul(X_sequence, false, W[g_i], false)), Wb[g_i] }));
var j_mad_w = _(Add(new[] { _(MatMul(X_sequence, false, W[g_j], false)), Wb[g_j] }));
var f_mad_w = _(Add(new[] { _(MatMul(X_sequence, false, W[g_f], false)), Wb[g_f] }));
var o_mad_w = _(Add(new[] { _(MatMul(X_sequence, false, W[g_o], false)), Wb[g_o] }));

MatMul(行列積)の第2引数が転置フラグになっていて、ここをtrueにするとうまくいく。使い方が悪いんだとは思うけど、外側からなんとかできるようなものではなさそうなのでPyTorchとの相性なのかなあ。

他にも、元々はモデルの最後に出力ワードの確率を取るためにsoftmaxを入れていたのだが、そっちもreshapeでなぜか列が増えてしまって型エラーになったり。こっちはC#側で計算すればいいので問題はないけど。

結果

こんな感じ。まだデバッグ版でCPU使用だけど、生成の速度は1文で1秒未満くらいかな。日本語の出来としては・・・学習が15分くらいなので、もう少し学習すればよくなるかも。

まとめ

Barracudaを実験版にしてさらにオープンソースに上記の修正をすると動くのだが、Unityライセンスを調べないと公開はできないかなあ。公開までにリリース版が出てバグ?が修正されているといいなあ。

なお、今回Barracudaをデバッグしつつ、LSTMを自分で実装したものと実行内容を比較してようやく問題が判明した(なんとなく転置がいるのはすぐ分かったけど、デバッグしてようやく理由が分かった)のだが、やっぱり一回自分で実装しているから分かる部分もある。ライブラリの使い方を知っているだけじゃなくて中身も知ってる方がいい。

ができないっていう話だけど。

ウェザタイのワード自動生成をUnityでも動かせるようにしたいので検討しているのだが、うまい方法がない。

UnityにBarracudaという機能があって、ニューラルネットのパラメータの標準的なフォーマットONNXが使えるらしい。ウェザタイのワード自動生成では、embed層、LSTM層、全結合層のスタンダードな構成なのでPythonの深層学習ライブラリで作るなら割と簡単。

で、まずはkerasのLSTMを使って日本語生成してみた。それ自体はうまくいったのだが、ONNXへの変換でつまる。keras2onnxではそもそもTensorflow2の機能を使っているとダメのようで、disable_v2_behaviorをやってみたりしたが、うまくいかない。

次にPyTorchを試す。こちらも日本語生成自体はうまくいった。ONNX変換もダミーインプットにちょっと試行錯誤がいるが、torch.onnx.exportで変換はできた。が、Unityにもっていくとインポートができない。embedレイヤーが使っているインデックスをサポートしていないっぽい。

追記:Barracudaのプレビュー版にしたらインポートまではできた。

最後、C#で一から作ったライブラリも試してみる。ウェザタイで作ったやつは高速化のため、行列の積にAVXとかSSEとかのSIMD命令を使っているのだが、Unityはマルチプラットフォームなのでそのままは使えない。そういう場合はBurstコンパイラを使うことになるらしいのだが、いろいろ制限があるようで、InvalidOperationExceptionになってしまう。C#で行列の積を実装すればいいはいいのだが、現実的じゃない計算コストがかかってしまう。

てところでいずれも無理。UnityでLSTM動かしている人はまだいないのかな。Pythonで大量に文章を自動生成できるので、100万ワードくらい生成して配布すればまあいいのかもしれないけど。。。

オンラインタイピングソフトの進捗。少し細かい実装をして最低限ゲームとして動くようになった。CPUをいくつか配置してタイピングでライフを奪っていく感じ。

実装としては、まだカスタマイズはできないけど、Advanced People Pack 2でカスタマイズしたキャラクターを使えるようになったり、Blenderで作ったキーボードと腕のモーションをUnityに取り入れてアニメーションさせてみたり、FL Studioで作った効果音を入れてみたり。いろいろベース部分を作ったので作り方には慣れてきた感じ。今は何故かCubaseで作った曲を流せるようにしている途中。

対戦は試してないけど一応動くようには作っているはず。ここからどうしようかな。