今月の日記ノルマ。といっても今月もほぼ無休だったので進捗はあまりない。とりあえずウェザタイのUnity化のため、UI以外の部分をDLLにまとめて共通化を進めている。こうしておけばUI以外はTyping Fieldとも同じソースを使えるのでよさそう。現状ビルドエラーが大量に出ている状態なので一つ一つ直さないと。
月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年くらいかかりそう。
- ロビーのセキュア化:完了
- ロビーの自動テスト:完了
- ランキングのセキュア化:完了
- ランキングの自動テスト:作業中
- Weather Typingのセキュア化
- ベース部分をUnityへ移植
- ベース部分の自動テスト
- Weather Typing UIをUnityで作り直し -> WT 5.0リリース
- Typing Field UI作成
- Typing Fieldのゲームデザインやり直し
- Typing Fieldのアセット作り
- 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みたいなものだけど、チート対策ってどうしているのか。通信の保護をやぶるよりキーボードをシミュレーションする方が手っ取り早いからあんまり問題にならないのかなあ。
Azureセキュリティテクノロジ(AZ-500)に合格してきた。これでひとまずの目標、AWS/Azureのアソシエイト/セキュリティ取得完了。そんなに意味はないけど次受けるならDevかなあ。
てことでAZ-500だけど、今までで一番きつかった。GWにもちこしたくなかったので勉強期間は10日間。一冊しかない教本「最短突破 Microsoft Azureセキュリティ テクノロジ[AZ-500]合格教本」とUdemyの「AZ-500 Azure Security Engineer Associate – Practice Tests」114問をやったけど、さすがに問題数が足りなくてXamtopicsというよく分からないサイトで150問追加。それでも781/700点でなんとか合格。
内容だけど、Azure Administrator以上に仕様がカオス。AzureのロールとAzure ADのロールが無関係なのから始まって、なぜそこにその設定があるの、とか意味不明な仕様が大量にあって、過去と現在の仕様のどっちを聞いてるのか分からず存在しない仕様が正解だったりして、覚えてもしょうがないことが問題に出てくる。今回、Udemyで納得のいかない回答があり、問題文を検索してXamtopicsにたどり着いたのだが、ここの面白いところはいろんな人が問題にコメントを残せること。模範解答は大半答えが間違っていて、多数決の回答が載っている。コメントによる議論を見ると、これは問題が古いとか、意見が真っ二つに割れたり、問題としてもひどい。てことで、日本語の試験対策がほとんどないのもあって、少なくとも英語が苦労なく読めないと合格は難しそう。
そういえばGW前の金曜午後なんて混んでないだろうと思って予約したんだけど、大量のスーツの人がいた。新人研修の一環なのかな。
AWSの試験から少し間が空いたが、Azure Administrator(AZ-104)を受験。休日は仕事なので、どうせなら予約の取りやすい平日に受験したんだけど、結構人はいた。結果は870点で合格。
AzureはMSDNのサブスクリプションでクレジットがあるのでちょくちょくいじっていたが、真面目に勉強してみた。ただ、AWS同様、これは全体を知るだけの通過点で本命はセキュリティ(AZ-500)。
勉強期間は2週間くらいで、内容は教科書を読み込んで付属の模擬試験をやったのと、Udemyの評価が高かったAZ-104 Microsoft Azure Administrator Exam Practice Tests NEWという模擬試験を全6回中5回分やったくらい。AWSと比べた感じAzureは仕様が直交しないというか、出所不明な制約が結構あって、例外をたくさん覚えるのがきつい。
しかし、模擬試験と言いつつ本番とほぼ同じ問題がほとんどというのはどういうことなんだろう。何度も受けてちょっとずつ覚えて問題を書きおこしてるのかなあ。本来、幅広く勉強して、どんな問題でも解けるのが正しそうだけど、そういう独自問題の模擬試験があったとしてもユーザの評価が低くなって、本番と同じ問題を暗記するだけの模擬試験の方がユーザの評価が高くなるというのが仕組みとしては微妙。まあ資格試験なんて一応一通り勉強しましたよ的な意味しかないのでいいのか。
2ヶ月ぶりに普通に休みを取ったので、学生時代から20年以上通った八重洲ブックセンターの閉店前巡礼に行ってきた。専門書が目的なのでほぼメガ書店にしか行かないのだが、どんどん閉店していきますね。棚がスカスカなのが寂しい。

それはそれとして散歩してたら何故かアキバにいて、何故か千石電商で7色電子ペーパーモジュール「WaveShare 19283 4.01inch ACeP 7-Color E-Paper E-Ink Display HAT」を買っていた。スーパーのタグとかで赤が使われていて興味深かったのだがこれは7色。早速ラズパイに接続して我らがヨドバシカメラのお姿を表示してみた。表示までにチカチカして結構時間はかかるものの、表示されたもの自体は割と綺麗。電子ペーパーなので、当然電源を抜いてもこのまま残る。Kindleみたいな実用的な速度になるのはまだまだ先ですね。何かいい使い道あるかなあ。

しばらく「なれる!SE」シリーズを読んでいたのだが、全巻読み終わったので。Kindle Unlimitedでほぼ全巻読めるのでお徳。
これはラノベ?なんだけど内容がすごいリアルで読むのに体力がいる。騙されてネットワークインフラエンジニアになり、PM、提案、管理職などをいろいろ経験していくお話。協力社員が協力しないとか、顧客先常駐して無茶振りされるとか、あるあるな状況になりながらもちょっとおかしな方法で解決していく。
で、最終巻、最後の議論。これがメインテーマだとしたら物語全体を見る目が変わってくる恐ろしい構成。日本のSIerは高度エンジニアをすぐマネージメントや事業戦略に就かせて代わりに素人を投入する。それはITのスキルが重要なんて誰も思っていないから。その結果素人しかいなくなって日本のIT業界は何も生み出せない。
と、まあよく言われていることだけどその通り。終身雇用で1つの会社に居続けるためにゼネラリストにならざるをえなくて、新卒一括採用だから素人を入れざるを得ない、と。それが嫌なら独立するか外資系にいくしかないと。どっちにしようかなあ。
タイピング日本一を決める大会「REALFORCE TYPING CHAMPIONSHIP 2023」、3/12に行われたオフライン大会を観戦してきた。RTC2023は2019年以来4回目。RTC2019年の後、にじさんじ打鍵王でタイピングが盛り上がったり、miri選手が数多くのテレビ番組で紹介されたり、今やれば結構注目されるんじゃないかと思っていたが、長いコロナの休止期間を経てついに開催。今日を逃すといつ日記を書けるか分からないので当日中に残しておく。
今回、会社員の活動が1月からずっと休みなしなので現地観戦も行く気力がなかったのだが、Twitterで観戦勢の報告を見ているとやはり行きたくなってきたので現地へ。タイピング速度測定の作者様やタイピンガーZの作者様と少しだけど話ができて良かった。
去年までの観戦記:RTC2017、RTC2018、RTC2019。
配信はYoutubeとTwitch。今回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のポテンシャルを活かせるソフトウェア、誰か作りませんかね?
2月が終わるので日記を書かないと。といっても2月は無休だったので進捗なし。せめて最近話題になってきたChatGPTを使ってみる。

毎年賞金100万円の大会が開かれてたのか、知らなかった。ていうか嘘ばっかり。ちなみにURLを教えて欲しいと頼むと適当なURLをでっちあげてくる。
ChatGPTの仕組みは現在勉強中だけど、その場でググって回答するのではなく、現在の記憶状態から今の単語に続きそうな単語をどんどん付け足していくような感じ。なので生成される文章は超適当。
ただ、すごくそれっぽいし、それは違うよね、とか話していると理解するような素振りをしたりするので、すごく人間くさい。既にチューリングテストなら受かってそうな気がする。
冬休み。いい加減勉強に疲れたので息抜きに「情報セキュリティの敗北史」を読んでみた。珍しくOreillyのサブスクにはなかったのでKindleで。525ページになってるけど、半分くらいは脚注と参考文献なので半日くらいかな。
内容的には、自分もずっと考えていたことが情報セキュリティの歴史から説明されていた感じ。今の情報セキュリティってどうやって攻撃するかだけが注目されていて、どう対策するかには誰も興味がない。ホワイトハッカーというよく分からない職業の人が、特に新しさのないバッファオーバーフローの脆弱性を付いて、仰々しい名前を付けて世界で公開して注目を集めるビジネス。
この建築会社が作った家はここに火を付ければ効率よく燃えるから欠陥だ、というのをテレビで発表して富と名声を得て、建築会社に無理矢理対応させるようなやり口。火を付けられるからって普通の人は火なんか付けないし。
・・・って思っていた人は必読。こんな感じの話をちゃんとした切り口で説明して、情報セキュリティは歴史が浅くて迷走してるけど、他にいくらでもある歴史が長い分野から成功した方法を取り入れよう、というのが分かりやすく書かれている。
AWS Certified Security – Specialty (SCS-C01)を受けてきた。839/1000点で合格。
今月頭にSolutions Architect – Associateに合格してそのまま3週間後に受けた感じ。正直3週間はいらなかった気がするけど、土日はクリスマスイブしか空いてなかった。
勉強内容は、唯一の書籍「要点整理から攻略する『AWS認定 セキュリティ-専門知識』 」を読んで模擬試験40問をやって、Udemyの模擬試験65問x2回、Kindle Unlimitedにあった「1週間で攻略!AWS認定セキュリティ – 専門知識 本番用問題集 140問」の模擬試験65問x2回、公式の模擬試験20問をやったくらい。あとは「AWS Security」を7割くらい読んで時間切れ。今回はAWSでの実験もあんまりやってないかな。合計320問くらいで、本番で全く見たことない問題は1~2問くらいだった気がする。
次はどうするかな。難関と言われるAWSのSolution Architect – Professionalを受けるか、Azureを受けるか。。。
IPAの情報処理試験は論文が必要なめんどいやつ以外は全部持ってるし、TOEICも900超えた後は受ける気しないので、久々に試験受けるのは楽しい。IPAも今時紙に手書きじゃなければ合格してあげてもいいんだけど。
AWSセキュリティ資格を取るために勉強中。なのだが、どうしてもAzureをマスターする必要があるのでAzureも同時に勉強。こんがらがりそうな気もするが、意外にAWSとAzureの違いを意識することによって気づくことも多い。Azureの「ロール複数つけるとアクセス権は和集合になる」という説明を読んでAWSは? と思ってもう一度調べると、AWSコンソールではロールのスイッチができるので1つしかできないとかに気づいたり。英語と他の言語を学ぶとそれぞれの違いが分かって理解が深まるというのと同じか。
AWS Certified Solutions Architect – Associate (SAA-C03版)に合格した。副業でAWSセキュリティのスペシャリストであることを無理矢理言わないといけないってことで。
AWSは2年くらいFargate中心に実践してて、勉強期間は実質1ヶ月くらい? 金に飽かせて「AWS認定アソシエイト3資格対策」と「AWS認定ソリューションアーキテクトアソシエイト問題集」をやりつつ有料のAWSで都度実験、「Udemyの模擬試験」を3回分やった。AWSすぐ万単位の課金になる。
Udemyは噂通りムズかったが、3日で1日1回、最初は6割、次の日もう一回やって9割になったことを確認して受験。777/1000点のスリーセブンで合格だった。10時半の回を受験して20時に合格を受領。コツはお金の力。
なんだけど、本命はセキュリティなのでそっちを勉強しないと。Associateは当然合格する前提で、既に1週間くらい前に申し込み済み。AWSのサンプル問題は全問正解だったけどどうかな。
12月になってしまうので更新だけ。副業休みなしで夜はAWS勉強なので何もできず。
WT Android版 4.3をリリース。他のプラットフォームで修正したいくつかのバグFixと、Simejiでもとりあえず動くようにしたくらい。IMEは全ての方式に対応はできず、一つのIMEに最適化すると他で動かなくなるのでいろいろ妥協しているので、とりあえずGboardでもSimejiでもなんとなく動くようにした。
で、今回Android 12向けにしたのだが、ストレージ周りが変更になって苦労した。内部ストレージにデータを入れるとアンインストールで全部消えてしまうのでSDカードにデータを置いていたのだが、Android11で使えなくなった。SDカードのアプリケーション領域に置いているので、4.3ではWTをアンインストールすると記録が消える。今時はクラウドに置けばいいんだろうけどリリースを優先させたのでそこまでは変えなかった。以前のバージョンからアップデートすると勝手に移動されるようにはしたので過去のバージョンの記録は消えない。
あとはGoogle Playのリリースにあたってデータセーフティのポリシーを定める必要ができた。20年前の設計なので暗号化もないしデータの削除機能もないが、別に公開しておけばいいのか。そこで出てくるR8による難読化ってのが気になったけど、Android単体で難読化ができるようになってるのか。今回はやらないけど調査要。
Weather Typing 4.3のmacOS版をリリース。ようやくM1 mac対応したのと、カウントダウン中に落ちる問題の修正。
M1 mac対応は、ネイティブライブラリを64bitにしないとM1で動かないのだが、Visual Studioが対応する気配がないので、ひとまずネイティブライブラリをやめた。デメリットはいろいろあるけど仕方ない。逆にM1でないMacではテストしていないが、まあいいでしょう。
カウントダウン中に落ちる問題は根が深い。前回のリリース時には起きていなかったので、OSのアップデートでいつの間にか落ちるようになっていたと思うんだけど、10回に1回落ちるみたいなやっかいな現象。カウントダウンをやめても落ちるのでいろいろなところをコメントアウトにして少しずつ有効にするという地味な作業をやっていた。結局、ルール設定画面のワード選択をリストにしていると、カウントダウンに遷移したときに何故かリストのスクロールバーにアクセスしにいって落ちるということが判明。そこをドロップダウンにして以降落ちなくなったので多分大丈夫?
Ver4.3アップデートもあとはAndroidとiOSのみ。Androidは他の入力方式がちゃんと動いていないという情報があるのでそれくらいかな。iOSは同じくM1対応を予定。
ウェザタイのWindowsのストア版のテストが終わったので登録しようと思ったが、いろいろなところに詰まって1日かかった。まず署名ができない。証明書がexpiredになっていて、ヘルプにはテスト用証明書の更新しか書いていない。証明書を選択する欄があるのだが、何もないと言われる。どうもローカルの証明書ストアを見ているみたいなのでそっちを見ると、2021年でExpiredされた証明書が入っていたのでそれを削除してもダメ。新しいストアアプリを作ろうとしてもアプリ名を登録できず。試行錯誤してWebの方からならアプリを作れる。で、新しいプロジェクトを作って新しいアプリに関連付けてビルドすると新しい証明書がローカルの証明書ストアにインストールされた。その後、元のアプリをビルドすると今度はThumbprintが違うと言われるので、ローカルの証明書ストアからpfxをエクスポートしてVisual Studioで選択する。これでようやく証明書問題をクリアできる。テスト証明書を作るとそれがあらゆる箇所で邪魔してくるので、Temporary証明書のpfxは消しておくこと。
あとはWACKが必ず変なエラーを出すようになっていた。OSチェックをやるようにしていないとHangするみたいな。新しいプロジェクトでも同じなので、とりあえずWACKは無視して申請してみる。新しいWindows SDKのWACKを使うと解決するみたいなことも書いてあるけど、UWPが古いSDKを参照していてアンインストールできず、新しいSDKは古いSDKをアンインストールしないとインストールできないのでどうにもできない。Microsoftの人がチェックしてくれるからいいか。
2年ぶりにウェザタイをバージョンアップ。さすがにいろいろバグ報告がきているのでそれだけでも対応。機能追加や仕様変更はなし。
新サーバへ移行完了。唯一ローカルでのテストが不十分だったメールも、SSL+認証モードで送受信できるし、一番制限が大きそうなgmailで送受信できて、spf、dkim、adsp、dmark全てにpassが出ているし、オープンリレーチェックでもOKになっているのでこれでよしとしよう。
何かおかしくなっていたらTwitterか掲示板へお願いします。
CentOSのサポートが終了するからいつか対応しないとと思いつつほっておいたサーバ移行。denasu.comへの攻撃も増えてきたのとメモリ不足への対応も考えて新サーバ構築中。
OSはいつもつかっているUbuntuに変更。
メモリ不足はさくらのVPS 4GBを契約。それでも月2500円。TypingTubeの作者の方は月10万円ってTweetしてたのでまだまし、なのか?
セキュリティは全てのサービスをDocker、Docker-Composeで構築する。Ubuntu本体は公開鍵認証のSSHとポートフォワーディング専用FTPだけ動かして、Web、メール、ロビーなど、もろもろ独立したコンテナにすることで、サービスを乗っ取られても他のサービスには影響しないようにする。唯一SSHに脆弱性がなければ相当強固なはず。
VPSに展開する前にWindows上のWSL2でステージング環境を構築。コンテナなのでこのまま持って行けばVPSでも動作するはず。これも便利。Web、WordPress、ランキング、ワードサーバ、DB、GITもいろいろはまったけどコンテナ化完了。特にPHPはCentOSのパッケージマネージャ制約で最新版が使えなかったりしたのが、コンテナをビルドするだけで最新版になるのでだいぶよくなる。
ロビーとウェザタイサーバは特に問題はなさそうなので最後の難関がメール。セキュリティ設定がたくさんありすぎて複雑。結局、SMTPはポート25+587でSASL認証+STARTTLS、自ドメイン宛のメールは認証なしでも受け取れて、他ドメイン宛のメールは認証なしならリレーエラー、認証ありなら他ドメインの25ポートに送る、POPはポート995でパスワード認証+TLSとした。TLSの証明書はさくらのドメイン認証証明書でいけると思うけどまだそっちでは試していない。SPFは既に旧サーバでも設定していたが追加でDKIMとDMARCの設定をする。このあたりを試すにはDNSの逆引きやTXTレコードが必要なのでローカルDNSサーバも構築。
これだと25と587が同じ設定なのでSubmissionポートって意味あるのか? って思ったけど、OB25P Blockingってあくまでアウトバウンド禁止であって、denasu.comは別に回線を提供するプロバイダじゃないから関係ないのか。関係あるのはクライアント側で、メーラを使ってdenasu.comの25ポートにつなごうとするとNo Route to hostエラーでつながらない。なので587ポートをオープンする必要があるってだけか。クライアントから25ポートにアクセスする人は悪意があるとみなされるが、587ポートへのアクセスはフリーで、587ポートが安全かどうかはそのサーバに依存するわけで、この構成だと587ポートは認証必須、リレー禁止になっているからOK、と。てな感じで合ってるのかな。。
個別の言及についてはあまり反応しないようにしているけど興味深いテーマだったので。タイピング練習ソフトは実用には意味がないという話について、ウェザタイの見解。
ウェザタイは公開当初からタイピング練習ソフトと呼ぶかタイピングゲームと呼ぶか迷っていて、最終的には「タイピング自体を目的とした練習ソフト」と表記するようになった。というのもこういうソフトには2つの側面があって、初心者向けにはタイピング練習ソフトだし、それ以降はタイピングゲームになってくる。ウェザタイは練習もできるけどどちらかというとタイピングゲームに近い(ように設計している)。
タイピング練習としてはウェザタイでいうとLv4~5くらいあれば実用上打鍵がネックになることはなくて、それ以上は頭の中で文章を考える方が時間がかかって、実用上はあまり意味ないと思う。速記などではそれ以上が求められるけど、特殊なキーボードを使ったり、IMEの辞書学習を固定して変換時のスペースを押す回数を覚えるとかそういう話になって、それは別の練習ソフトや訓練プログラムが必要になる話。
で、それはタイピング練習ソフトとして見た場合だが、ある程度マスターすると途中からタイピングゲームに変わってくる。手段と目的が変わってくるというか、「文章入力を早くするためにタイピング練習ソフトを使う」から「タイピング練習をするためにタイピング練習ソフトを使う」に変わってくる。50mを世界トップクラスで走れても実用上は車を使った方が速い、だけど競技として見た場合は世界を魅了できる、みたいな。
なので、今のウェザタイの紹介文書では、初心者向けには練習ソフト、それ以降はスポーツとして楽しむというような記載としている。当時はeスポーツという言葉ではないけど。
Weather Typingは,タイピングを楽しむためのキーボード練習ソフトです。もちろんタイピング初心者が普通にタイピング練習をすることもできますが,一番の楽しみは他のユーザと競い合うことです。ネットワーク対戦やネットランキングへの参加,大会への使用といった多彩な使い方ができるように作ってあります。是非タイピングを好きになって、タイピング自体を目的とした練習ソフトとして使い込んでください。
ご時世的に夏休みは実家に帰らないことにしたため時間がある。で、ずっとやろうと思っていたAWS IoT Coreの実験をやってみた。
目標はRaspberry pi に付けたLEDをブラウザからオンオフするところ。

構成図もdiagrams.netを書いてみた。

以下のような感じ。ネット上にたくさん情報があるのであんまり苦戦はしない。
- AWS IoT Core上でデバイスを作る。
- ラズパイ上で、MQTTのトピックをサブスクライブして、on/offを受け取ったらLEDをon/offするように実装したPythonプログラムを起動する。
- Lambda関数を作ってMQTTのトピックをパブリッシュするようにしておく
- API Gatewayを作ってLambda関数を呼び出すようにする
ここまでできれば、LEDの代わりに他のものをつなげばいろいろリモート制御できる。
ほぼ夏休みに入ったので、久々にウェザタイのバージョンアップをしている。ウェザタイはAppiumを使って自動テストができるようになっているので試してみたが、動かない。
以前と全く同じバージョンにしても動かないし、ちょっとずつバージョンを上げていってもある機能は動いてもある機能は動かなくなる。Githubもバグ報告しかなくて誰も修正してないのでもう終了か。
WindowsならMicrosoft UI Automationというのもあるっぽいけどもう今更なのかな。Unityで作り直すしかないのかな。
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] 実行
ついに実行。以下のスクショは分かりやすいようにあえて前カメラで見ている。
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を指定する方法からリソースファイルを取ってくる方法に変わっている。で、いろいろ探っているとフォントを指定する新しい方法が紹介されていた。各プラットフォームでそれぞれフォントを指定していたのを、共通のプロジェクトで指定できるようになったらしい。これを設定したら表示されるようになった。
だったら、「(古い方法が使えなくなったのは)バグだから修正する」ではなく「新しい方法を使ってくれ」と言って欲しいのだが・・・。
