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

この話を書くなら今かな、ということで新タイピングソフトの構想を。

経緯

Realforce Typing Championshipから、タイピングが競技として話題になることも少し増えてきた。RTCは頂点を決めるものなので今のところWeather Typingを使って頂いているが、やっぱりもう少し派手な演出とか複雑なゲーム性とか、今時なタイピングソフトが欲しいところ。THE TYPING OF THE DEADは対戦向けではないし、そもそも公式リンクが何にもなくAmazonにリンクするくらい入手困難だし。

その辺りタイピングサミットくらいから考えていて、5年くらい前にウェザタイに戦略性を入れようと考えたりもしたけど、ウェザタイはガチなタイピング勝負がコンセプトなので運まかせとかアイテムとかとは相性が悪いし、ワードや入力方式などウェザタイの狭い枠組みでやっても地味なので検討を中断。

で、これとは別に3年前からウェザタイオフラインを考えていた。オフラインで集まってキーボードとモニターを肩から提げてみんなで赤外線で打ち合うというリアルTOD。赤外線通信部分は作ってもらったのでもうあるんだけど、ウェザタイの大改造が必要なのとキーボードを吊り下げる板とかモニタコストのハードルが高くて中断中。

で、1年くらい前にN高 ネット運動会で最近のオンラインゲーム(フォートナイトとか)を見て、みんなが欲しい、観たいタイピングソフトはこういうのなんだろうな、というので去年から試しに作り始めた。ウェザタイオフラインのオンライン版(?)の意味もあって、ソフトウェアはソフトウェアで別に作った方がデバッグが楽かな、というものある。

仕様

世界観はまだ定まってないけど、タイピングしないと生きていけない的なものなのかなあ。大規模サーバは作れないので、ウェザタイと同様のP2Pで10人くらいのバトルロイヤル。

地形やキャラクターをランダムに作ったりワードはAI自動生成にしたり、ランダム性を積極的に取り入れて飽きないように。ワードはウェザタイのAI自動生成をベースに。音楽も自動生成したいところではあるけど、さすがにフリー音源を使うかな。SEはウェザタイ以上のものを作れなかったので流用かな。

Advanced People Pack 2はキャラクターメイキングもできてすごく便利。

あとはウェザタイの枠組みを離れるならどんな工夫ができるか。例えば、ある文字アイテムを取ったらその文字を打ったときの攻撃力が高くなるとか、今から5分間、特定の文字の出現頻度が上がるとか、英語しか出ないとか。あとは普通にコンボボーナスとか。1対複数で囲むなんてのもやれば、ある程度強い人とも戦えるかな。

進捗

進捗。オンラインゲームの作りはウェザタイの仕組みが割とそのまま使えて、ローカルではリアルタイムに処理してリモート側もそれなりに補間して動きつつ完全同期させるのはできてきた。タイピングソフトとして必要な部品とか対戦サーバは当然あるし。

ここから独自処理を入れていくわけだけど、例によって一人で作っているので、いつ完成するかは・・・。数年レベルかも。こういうソフトが欲しいっていうことなので、ウェザタイとTODのいいとこ取りのいいソフトができるのなら誰かが先に作ってくれてもいい。Twitterを見てると、割とみんなこういうソフトが欲しい、作りたいと思っている人は多そうな感じ?

3Dオンラインゲーム版のタイピングソフトの進捗。2台のPCで起動して、互いにキャラを動かしてタイピングしあうところまではできた。まだカクカクするのはおいておいて、プレイしても特に面白くはない。このあとゲーム性を考えていく必要があるわけだが、むずい。アイデアはいくつかあるけど面白くなるのかはやってみないと分からない。

ゲームエンジンとしてはUnityを使ってるけど、オンラインゲームの開発むずくないですかね。ウェザタイは1台のPCで2つソフト起動してたけど、Unityだと2台PC起動して、ソースコード編集する度にGit経由でコード共有してるのですごくめんどい。

ウェザタイも今年で20年ということでリーフレットを作ってみた。

せっかくなので、印刷も。今は個人向けに小数でも印刷してくれるので便利。

オフ会や大会なんかがあれば配れるんだけど、今はそういうものできないのでとりあえず手元においておくしか。

プロeスポーツチーム「DetonatioN Gaming」による対戦動画 「Q・W・E・Rしか打てない人たち(DFM)でタイピング対決をしてみるとこうなる」が公開されている。少し前にメールで動画利用について問い合わせがあったもの。eスポーツとして認知度が上がるならどんどん使って欲しいところですね。

速度的には平均すると500くらいなので今の私でも勝てるくらい。ということは、これからeスポーツタイピングが流行るとして、今から頑張れば誰でも活躍できるということですね。動画を見る感じ、プレイだけでなくトーク力も重要に見えるけど。

てな感じで、やはり見た目が地味ですね。今作っている3Dのタイピングソフトの完成が臨まれる。

進捗メモ。CPU戦が動くようになった。ウェザタイの通信プロトコルをほぼそのまま流用しているので、対戦モードにすればそのまま対戦もできると思う。けど、課題が山積み。

まず文字が読めない。自分のキャラクターは非表示にして、自分のワードは画面上のどこか別の場所に表示しないと。あとワードは頭の上がいいかも?

移動モードとタイピングモードの切り替えをTabでやってるんだけど、やっぱりめんどくさい。やっぱりマウスで視点移動の方がいいかな。

まだ演出が何も入ってない状態ではあるけど、面白くするにはいろいろ必要。ウェザタイの名前にはしないつもりなので、ガチタイピングではなく、例えば、弱い人でもあらかじめたくさん打ち溜めてシールドをはっておけば強い人に勝てるとか、複数人で一人を囲むとか、後ろから打つとか、どこかを打つとアイテムが出るとか、考えられるのはそんなところ?

システム的には、ウェザタイはサーバはあるけど単なる中継なので基本はP2Pの形。これだとプレイヤーの途中参加が困難。そうなると何人か揃ったら開始、誰かが生き残ったら終了みたいな形になる。人がいなくてもある程度遊べるようにするには、サーバクライアント型にして、サーバにゲーム状態を保存して、CPUをたくさん配置する、とかになるけど、それだとサーバの負荷が高いかなあ。

Unityの練習に作っているやつ。

地形はZENRIN City Asset SeriesのJapanese Otaku City、モデルデータはAdvanced People Pack 2を使ってみた。

データを持ってきて配置して少しコードを入れるだけでここまでできてしまうのか。

最近Amazonを騙るメールがよく来るのだが、SPAMの品質として、これはまあまあ及第点かな。特に、時間を空けて何度か送ってきて、「支払い案内」「支払期限がきた」「アカウント停止するよ」「アカウント停止しました」みたいになっているのが工夫されていて素晴らしい。送信元もAmazonの代理で送信みたいになっててグッド。まあ、このメールアドレスでAmazon契約してないんだけど。。。

正直、他のSPAMメールは日本語おかしかったり送信元すらいじってなかったり、いきなり「RE:」で来たり、もう少し工夫しろよ、ってのばっかりだったのでようやく被害者目線で考えるようになってきたか、って感じ。もう一歩。

ウェザタイオフラインのオンライン版のためにUnityを勉強中。思ったのは、これってWorld Testerでやりたかったことじゃん、という。

World Testerは物理シミュレーションソフトだけど、定義ファイルでフィールドや物体を自由に作って配置することができる。あとは定義ファイルじゃなく3D空間で自由に配置できるといいんだけどな、と思いつつ放置していた。これができて、スクリプトを追加できればUnityになる(ならない)。

とりあえず地形を生成して、歩き回るところまではできた。

Weather Typing Android版4.2.1を公開。Android対応で、ロビー等にプラットフォームを表示させるようにしたので他よりバージョンを上げている。Windows版もテストしたらバージョンアップ予定。

Xamarin Android。Windows版に比べてユーザも多いからそこまでひどいバグはない。けど、一つ、画面下のナビゲーションバーの戻るボタンでアプリを終わる(Sleep)と、そのまま次回起動したときにNavigationPageのナビゲーションで落ちる。まあ前のバージョンからそうなんだけど。

Xamarinのソースまで追ってみたけど、Xamarin側のページスタックとネイティブ側のページスタックがずれてしまうことまでしか分からず。仕方がないので戻るボタンで終わった場合、Sleepでなく強制終了するようにした。

あとは、前、x86版をビルドすると何故かx64版も一緒に同梱されていてしまったが、今回はx86版だけが同梱されるようになった。2つを統合できる気もしないでもないが、直ったのかどうなのか調べるのも面倒なのでまだ2つのパッケージのまま。

【視聴者参加型】タイピング対決第4回~負けたら罰ゲーム~【鈴木勝/にじさんじ】をリアルタイム視聴。していたのだが、最後の対戦、凄く重くなっていた。

基本的には、対戦相手の内の誰かが重いとワードを打ち終わったときに待ちが発生するので全員が重くなるというのはあるが、それともちょっと違う感じ。以前から、長く対戦をしていると段々重くなるという報告があり、それなのかな? ということでちゃんと調査してみた。

とりあえず原因と思われる箇所は2箇所発見したので直して開発版にアップロードしてみた。他のテストを全くしていないのでどこかバグってるかもしれないが、重さが気になっていた方は試してみて欲しい。

  • デバッグ用に、入力オートマトンをmapに登録しているのだが、本体側のドメインでは削除していたがプラグイン側のドメイン上で削除されてなかった。段々mapの検索に時間がかかるようになって遅くなる
  • 結果表示画面を毎回作ってずっと残っていた。これは他の画面同様、画面を使い回すことでメモリ消費量を抑えるようにした。

まだ対戦を繰り返していくと微妙にメモリが増えていくのだが、とりあえずここまでで100回プレイしても500kpmくらいなら平気だったので公開。1000kpmとかだとまだ少し重くなる感じ。

あと、Windowsストア版も気になっていた効果音再生を改善。普通のMediaPlayerクラスを使っていたのだが、ゲーム用のXAudio2を使うようにしたらだいぶパフォーマンスが上がった。全体的なパフォーマンスはWindowsデスクトップ版よりもいいと感じる。こちらもテスト終わったら正式公開予定。

サーバ移行後、だいぶいろいろなコンポーネントが古くなっていたので一気にアップデート。mysql、PHP、Javaあたり。特にJavaはOracleの無償JDKが終わってしまったので、AdoptOpenJDKに変更。合わせてランキングのコンポーネント類をアップデート。そしたらEclipseが単体のjarを見つけてくれなくなったのでpomに統一したりいくつかはまりポイントがあったけど、なんとか新しくなった。

これで一回vulsでもかけてみるかな。

WT4.1の進捗。一通り開発項目は完了。あとはテストツールを直してテストすれば終わり。主に文章の自動生成とシミュレーションベースのCPU。

で、マイナーバージョンアップなのでXamarinを4.5から4.6にアップデートしたが、今回のバグはLabelが使い物にならなくなったこと。マージンを指定すると文字が切れるし改行できないし描画が更新されない。今日は試行錯誤でいろいろ変えてみてたまたまうまくいったら全てのラベルに適用という不毛な作業をやっていた。

しばらく研究していたウェザタイの新CPUがなんとなくできた。ニューラルネットワークを使う方法をずっと研究してたんだけど、結局普通にモデル化した。ニューラルネットワークも、Seq2Seqでひらがな-ローマ字変換するところまでは作ったんだけど、そこからコストを反映させて学習させるのが難しいというか、普通にモデル化するのとあまり変わらない感じがして。

モデル化としては、1打鍵ごとに指の配置を決めてコストを計算して最適な指の動きをするようにしてみた。以下の動画のように、勝手にNNの代わりにXNを使うようになったり「ー」を間違えやすかったりでちょっと人間っぽくなってる気がする。もう少し高速化とチューニングすれば、もっと人と対戦してるような感じになるかも。ちなみにコスト計算は「タイピング Professional」の記事をだいぶ参考にさせてもらってます。

てことで、ウェザタイ3~ウェザタイ4で未だレガシーな実装が残っていた部分、文章自動生成とCPU戦をモダンにする目処が立った。これと配信等で分かったUIの問題点を直してバージョンアップって感じかな。

最後の結果表示、結構人間と似たグラフになっているのが面白い。

Weather Typing、ワード完全自動生成版をテスト公開。まだ精度が低かったのでしばらく公開するつもりはなかったんだけど、いろいろ工夫したらだいぶよくなって公開したくなってしまった。

この前動画を上げたときからの変更点:

日本語WordNetをコーパスにしたこと。この前はWikipediaをコーパスとして使ってたんだけど、だいぶ単語が特殊なのと文章が長くなってしまってあまり良くなかった。Wordnetは、例文が簡単で短文が多いので試してみたらずいぶんウェザタイっぽくなった。あとはライセンス的にWikimediaはCC-BY-SAでちょっと使いづらい。日本の著作権法上はディープラーニングの学習に使うならよさそうだけど。

あとは、ウェザタイっぽくなるように文章をできるだけ短く生成するようにしてみた。やり方はまだ秘密。「ゼロから作るDeep Learning 2」そのままではあるが、C#に移植して内部をちゃんと理解したのでこういう細かいところをいじったりできる。


前からウェザタイのワードを増やそうと思って、記号ワードとか数字ワードとか考えてたんだけど、なんか違うな、と思っていた。で、自動生成はそれっぽい。極端な話、5chコーパス使って5chぽいワードとか使ったら面白そう。

学習するアプリも公開すれば、例えば各自好きな小説を学習して、そのワードで対戦しあうこともできるわけで、それも面白そう。

英語もこの方式なら大量に文章が生成できるので、ついに海外に向けて公開してもよいかも。

昨日のブログ、TwitterにURLを載せたら直後に公式で触れられてしまい、アクセス数が爆発。アクセス負荷でdenasu.comが開けなくなるなんて初めてだ。あ、いや、「逆襲のもげぇたん」のときはもう一桁多かったか。

ロビーも大会中エラーでまくってたのだが、最後ブログにとどめをさされて落ちていた。後で見たらランキングもそこから落ちていた。

ウェブサイト負荷が大会中とかに起きたりすると大会運営できなくなってしまうわけで、かといってそのためにウェブサイトと対戦サーバを分けるのもサーバ代の無駄になりそうだし。スケールアップの手順でも確かめるか。

で、Windowsストアのアクセス数が更新されたので、ダウンロード数を集計。昨日の配信前後のウェザタイのダウンロード数がWindowsだけで約4000。最初にVectorのニュースに載ったときより多いかも。ちなみに昨日のブログのアクセス数が約2200。ウェザタイのページに至っては10000を超えていた。これがインフルエンサーの力。。

にじさんじ打鍵王を観戦。Weather Typingとしての経緯は以前の日記を参照。

その後、REALFORCE TYPING CHAMPIONSHIP(RTC)でお世話になっている東プレさんが協賛することになり、準優勝にはREALFORCEキーボードとREALFORCEマウスが付くことに。REALFORCE MOUSEは最近出たばかりなので、宣伝になるとよいですね。同時視聴3.8万くらいまでいって打鍵王がTwitterトレンドにも入ってたみたいだし。RTCの注目度も上がるといいな。

大会の内容について

前回の日記にも書いたとおり、参加者が分からないと面白さが半減する、と思って何人かのライバーの方が配信していたWeather Typing練習を見たりした。さすがに誰を応援する、とまではいかなかったけどそれでも面白さが増した気がする。

タイピング的には、200-600kpmくらいで差が大きかったけど、同じような速度でブロック組合せを作ってたのでそれほど一方的にならず、最終戦に向かってだんだん盛り上がっていてよかった。RTCはガチ対戦で魅せる感じだけど打鍵王はキャラクターで魅せる感じ。どちらもよい。

サーバ運営的に

抽選会が1万人以上の同時視聴になっていたのである程度予想してたけど、大会中にかなりの人がサーバに接続して対戦をしていた。だいたい常時40人以上がつないで、30人くらいが対戦していたのだが、大会の方はラグもなく、まずまず快適だった。CPUも4%くらいでメモリも全然余裕。このくらいは余裕で堪えられるってことか。ただ、ゾンビプレイヤーが結構発生していて、ずっとエラーが出続けていて怖かった。今もエラー出てるので、どこかのタイミングで再起動しないと。

あとは50分くらいのところで、サーバにつながらないトラブルがあり、後でログを確認したらサーバが落ちていた。1分で自動再起動されるのと運営さんが落ち着いて対処して頂けたので大きなトラブルにはならなかったけど。

Weather Typing的に

2年ほど前に、今回主催者の鈴木勝さんがタイピング対決~負けたら台詞読み~を配信していた。そのとき、これからはもっと配信向けに改善しないと、と思って以下改善した。

  • 対戦できる最大人数の設定
  • 観戦、ホスト観戦
  • ラグ対策

概ねうまく働いていた気がする。ラグについてはさすがにVTuberの人はいい回戦を使っているからかも知れないけど、LAN対戦と遜色ないレベルで観戦できたように思う。

まだちょいちょい画面が変になるので直さないといけないかな。名前と☆が重なってたり。

あと今日のために急いでMacOS版を作って公開したけど、特定の環境で動かないとかがありそうかな。情報が欲しいところ。

ずいぶん前から研究していたワードの完全自動生成がだいぶ進んだ。

これで毎回全く別の文章が生成されるようになっている。今は7単語で切っているので文章が途中で切れている感じになってるし、いまいち面白いかは分からないけど。この後形態素分析入れて日本語の実験をするつもりだが、日本語だと面白くなるかなあ。

基本的には「ゼロから作るDeep Learning 2」のRNNLMなのだが、Xamarinで動かすためにC#で組み直した。パープレクシティ135なのでまだそこまで精度が高いわけではないが、これでも割とそれなりに見える。

4/4土曜日、Youtubeで「にじさんじ打鍵王」が開催される。にじさんじさん所属のVTuberがトーナメント形式で対戦するというもので、その抽選会が配信されたので見てみた。主催の鈴木勝さんは以前も何度かWeather Typingで配信をしていた方。

タイピング界隈でもにじさんじ内で大会してほしいという話題があったり(パソ活ラボ【にじさんじ杯】タイピング王決定戦をやったら面白いんじゃないかという話)。その辺りが関係しているのかは分からないけど、ちょっと前ににじさんじさんから配信に使わせて欲しいという依頼があったので是非、と。

で、タイピングの大会と言えばタイピング日本一を決めるREALFORCE TYPING CHAMPIONSHIPが有名。こちらは3年開催してようやく選手が知られてきて、タイパー界以外の人も見て楽しめるようになってきたかな、というところ。なんだけど、こういう形だと最初から視聴者が参加者を知っているのでその辺は有利だな、と思った。逆に言うと、私もにじさんじさんの動画を見ていかないと本当の意味で楽しめないってことか。1週間で。

日テレ「ヒルナンデス」で「REALFORCE TYPING CHAMPIONSHIP」3連続優勝者のmiriさんが出演されていた。アナウンサーの方とWeather Typing対決をされていたが、意外にも結構早かった。いっそこのままアナウンサー界でタイピングが流行らないかな。

最近いろいろウェザタイ関連のイベントがあるので、過去のイベントをまとめた。私宛に連絡が来ているものの中で、学校、団体、個人を省いた上で、載せても大丈夫そうなもののみ。こうしてみるといろいろありましたね。ちなみに雑誌系もリンクしようとしたらことごとくなくなってるのでやめた。

Warriors of Typing #4 -冬の陣-が開催された。知る限りWT4になってから初めての大会なので、ラグ問題とか配信映えとかが気になってリアルタイムで配信を視聴。

WT4開発時、大会用に複数のゲームが観戦できる機能を用意しようと思ったけど、作るのが大変すぎて見送った。でも今回、ジェイさんしろさんαさんも同時配信していて、なるほど、ゲーム配信ってこういう仕組みでみんなでたくさんの画面を配信して、それぞれ見たい配信を見るのか、って納得。

ラグについては公式だと少しラグが目立っていて、他の配信だとLAN対戦と遜色ない感じだった。公式配信は3人対戦になるから少し重いのか、他に何か原因があるのか。確かに3人以上のラグ評価はしていない。

あと、ジェイさんのところで、ワード途中で打てなくなる問題があったが、おそらく入力ミスでTAB、Enterの組合せが押されたものだと思う。見た目どのボタンを押せるかも分からないのでEnter禁止したいけど、そういうことはできるのかな。

あと、ルール画面表示の時に結構時間がかかってるなあ、と思ったけど、何百回もゲームをやって記録が多くなってくると重くなっているのか。この辺りも直したい。

WT4.0.1 Windowsデスクトップ版をリリース。4.0で報告があったバグと、UWP版Mac版実装で気になった部分の修正。

日テレ「嵐にしやがれ」で「REALFORCE TYPING CHAMPIONSHIP」3連続優勝者のmiriさんが出演されていた。Weather Typingも少し出ると聞いていたが、タイピングの早さを示すのにRTC版の画面がちゃんと出ていてありがたい。

対決自体は音声認識だったが、ちゃんと作ったら面白いのかなあ。一応、Weather TytpingのWindowsストア版では、IMEを使った漢字変換込みのモードも作ってはある。確かIMEの学習をオフにできなくて、辞書が汚れるから公開版からは外してある。IMEを使ってるので音声認識もできるのだが、Windows10標準の音声認識ではテレビでやってたようにはキレイに認識できなかった。マイクの問題もあるかもだけど。

以下は割とちゃんと認識したときのスクリーンショット。コンスタントにこのくらい認識できればいいんだけど。

うまいこと音声認識ができるなら、音声入力を極めた人とキーボードを極めた人の本気対戦ができて面白い。音声入力の達人は、おそらく最低限音声認識ができるだけの音声を使いこなすはず。TASさんの手書き入力みたいに、ケプストラムだけを話すみたいな。楽しそう。

引き続きMacOS版のUIを見ているが、MacOSのUIの自由度が低すぎてどうにもならず。Xamarinはネイティブのコントロールを使うので、他のフレームワークに引っ越しするのは容易だと思うんだけど、Macみたいにネイティブコントロールの表現能力が低いとちょっと扱いづらくなるという特徴がある。UnityだとUIは独自描画なのでどのプラットフォームでも同じ動きになるけど、Unityがなくなったら引っ越しが難しい(使ったことないので分からないけど)。一長一短。

ボタンのボーダーを、マウスを重ねたときだけ白い四角にしたいのだが、調査の結果不可能。ボタン自体のボーダーは今となっては古くさい立体表現になっていて、Bezelをいろいろ変えても縁に合わない。Layerの色を変えるとボーダーっぽくなるのだが、マウスカーソルを重ねたときの動作を変えることができない。

テキストボックスの背景色を半透明の黒にしたかったのだが、Bezelの背景が真っ白で、半透明にならない。Bezelを消すと何故かテキストが上そろえになるし。半透明は諦めて背景を灰色にしてみたが、カレットの色が黒で固定されているので変えられない。変えるにはNSTextFieldのWindowのメソッドを呼ぶ必要があるが、Windowが設定された後に呼ばれるイベントがない。XamarinはNSFormsTextFieldという派生クラスをセットするが、Privateなので触れない。

WT4.0完了したけど何かやってないと暇なので、リリース当日からWindowsストア版やらMacOS版やらを考えている。どっちも結構直さないといけない。

MacOS版のXamarin Formsを4.2から4.4に変えてみたが、何故か「テキストボックスがあると画面遷移で落ちる問題」が4.3SR1で直っていた。バージョンアップで問題が増えるんじゃなくて減ることなんてあるのか。

クローズドベータで出た問題点も修正できたので、Weather Typing 4.0をリリース。WT3では、WT2にあった機能の実装と各プラットフォーム対応を優先させていてずっとUIに手を付けられなかった。そっちはようやく終わったので、UIを一新できた。多少は配信に堪えられる感じになったかな。

今回背景をちょっと変えてみた。天気の背景もいいんだけど、背景が暗い方がやっぱり見やすい。唯一の天気さが消えてタイトルと乖離してしまうが、もはや気にしても仕方がない。タイピングは天気のようなものだ、とかなんとかかんとかってことで。

あとは音だけど、カウントダウン音をいろいろ試してみたが、どれもしっくりこないのでとりあえず保留。


この後はどうしようかな。とりあえずWinストア版作って、MacOS版作ったら、ワード自動生成の研究に戻るか。その前にVectorも登録しないと。


追記。Windows 7はサポート範囲外にしたがたぶん動くはず。手元に環境がないので、何か問題があっても対応できない可能性が高い。実はWindows 8.1とかWindows 10 32bitとかもテストしきれないので試してはいない。こちらは環境はあるので問題への対応は可能。

Twitterで書いたとおり、WT4.0はテスト完了。あとはクローズドで試してもらったりWebサイト更新したりで来週中にリリース予定。

で、いい機会なのでウェザタイの指標を測ってみた。この辺の値を記録しておくと次のバージョンで便利なので。

全体規模

結局分かりやすいステップ数で考えると、もろもろ含めてウェザタイのソースは約10万行。

CLOCの結果。

言語 ステップ
C# 67661
XAML 8873
XML 7049
Java 6726
PHP 2434
C++ 2382
C/C++ Header 1967
JavaScript 325
HTML 59
SQL 37
Perl 9
合計 97522

クライアントがほぼC#/Xamarin Forms、入力やI/O周りでC/C++を少し利用。XMLはresxのことなので、若干自動生成分がある。ランキングやロビーのサーバがJava。Perl/PHPはランキング、ワードサーバに使ってたけど、今はほとんどJavaになっている。

こう見ると、20年とはいえなかなか1人で作る量ではない気がする。大手で作ろうとすると軽く1億円くらいかかるのかなあ。1億円売り上げるにはタイピング界の人口が・・・とか考えていくといつかのジェイブログさんの書き込みで「タイピング企画が通らない」と言っていたのもなんとなく分かりますね。

まあ、WTの場合、商用に比べてOSSとかフレームワーク使わずに一から作ってる部分が多いので、その分多くなってるかも。結局製品寿命が長いことを考えるとそうせざるをえなくて、20年前と変わってないのは結局Raw SocketとかDirect Inputとかそのくらいしかないような気はする。Xamarin Formsもいつまでメンテされるか分からないけど。

WT4.0の開発

WT4.0の開発はRTC 2019の後に始めたから、企画、設計、実装、テストで約2ヶ月。RTC 2019版からWT4.0の改造が約1万行だったから10%直したことになる。

レグレッションテストの全件数が576件で、うち自動テストが455件(約80%)。前回作ったAppiumによる自動UIテスト、やっぱりテスト効率がいい。今回かなり本体を修正したのでテストコードも結構直したけど、これがなかったらテストにあと1ヶ月くらいかかる気がする。テストコードは直し終えたので、Android版とか作るときは(理想的には)テスト実行するだけでいいし。

で、WT4.0開発でレグレッションテストした結果は不良32件。これが多いのか少ないのかは分からないけど、次回の参考にはなる。

WT4用に通信の改善を実装。せっかくなのでWTの通信処理を詳しく書いてみるか。ラグとか同着とかの理由を知りたい人もいるかもしれないし。

WT3までは、プレイヤ全員のメッセージが届いたら全員の入力を確定して、次のフレームのメッセージを送るという実装をしていた。以下の図は「ABCDEF」をAとBが打ち込んでいる例。自分のプレイヤが打った文字は遅延なく画面に反映し、他のプレイヤが打った文字はメッセージが届いてから画面に反映するので、AとBでは見ている画面が違う。ただし、内部的には自分と他のプレイヤのメッセージがそろったときに時間を進めるようにしているため、AとBの同期がとれている。ここで、いくつか問題がある。

  1. Bの2フレーム目がAに届いたとき、一度に画面に描画するので3文字一度に消えてしまう。
  2. フレーム間隔が一定にならず表示速度が安定しない
  3. 同様に、1フレームで複数の文字を処理するので、遅延が大きいと同着が発生してしまう。
  4. いろいろな状況によるが、遅延が少ない方が少しだけ有利になる。

WT初期は電話回線だったので通信対戦ができるだけでもよかったが、さすがに配信とかを考えるともう少しなんとかしたいよね、ってことで、WT4ではもう少し通信量を上げて対策をしてみる。下の図で、点線の矢印が新たに追加したもの。入力があったらとにかく相手に送りつけて画面に反映するようにした。ただし、あくまでも画面表示だけの変更で、内部処理は変えない。速度やワード取得の判定は今まで通り全員のメッセージを待つので、今までと変わらない。

上記の問題点では、1と2だけの対応になる。内部処理でローカルPC上の絶対時間を見て判定するようにすれば3と4も改善できるし、工夫次第で観戦モードではラグが発生しないようにもできそうなのだが、試した感じ、割とここまででも十分効果がありそうだったので、WT4ではひとまずここまで。

ちなみにこの辺り、約20年前に独力で実装した部分なので、今のネットゲームから見ると全然なってないんだろうな、と思って「オンラインゲームを支える技術(WEB+DB PRESS plus)」なんかを読んだりしてみたけど、割と合ってて安心した。

Weather Typing 4.0の開発。長いことプラットフォーム対応やテストプログラムとかやってたけど、一段落したので、ようやく見た目とか機能面に着手できるようになった。公開はもう少し先だけど開発は順調。次バージョンがどうなるか軽くメモ。

  • UI。3.3以降、プラットフォーム共通化で変な見た目になっていたが、Windowsへのローカライズで少しはまともになる。ちなみにユーザの表示は、結局RTCの左右UIではなく今まで通りの上下UI。多少表示を整理して文字を大きくしたり。
  • 機能追加。観戦機能、正確性ルールの追加、勝利数の表示、ワードスピードの表示、入力不能時間のルール化、ワードの追加と削除、はだいたい完成。
  • 仕様変更。ルール周りはだいぶ変わる。考え方としては、ルール設定者が自分の得意なルールを決めて相手に押しつけるというもの。ワードもルール設定者が決めるようにし、交替で相手のワードを打つのは廃止。ルールを誰が決めるのかはとりあえずホストにしてるけど、まだ検討中。
  • 不良修正は、RTCで出ていたものを中心に対策。

RTCで出ていた不良のメモ。

  • 対戦開始時に打ち込めなくなる問題。前の対戦でシフトOnで終わると、次の対戦開始時にシフトOffになるのだが、次の対戦前にキーを8打鍵(on+offで16打鍵)以上してしまうと、キーバッファが溢れてシフトOffが消えてしまう。RTCの動画を見ると分かるけど、結構な選手がカウントダウン中などにエアプレイをしているのでバッファが溢れる。さらに、コンピュータワードでは後半にシフトを押すワードが出ることが多く、起きやすくなっていた。
  • 対戦開始時にラグが出る問題。3、2、1、0のカウントを、1000ミリ秒Timerで実現しているが、タイマー起動のタイミングが微妙にずれるのが原因。タイマーのタイミングが 1001 2002 3003 4003 とかだと1000未満を切り捨ててちゃんと1234になるのだが、999 1998 2998 3998 4998 みたいに1秒未満になってしまうと、1000未満を切り捨ててて01234になって1秒増える。たまに1秒未満になるとカウントが3、1、0みたいにスキップすることもある。WT2は60FPSで処理していて、WT3でTimerに変えたことでバグっていた。
  • 打鍵時にマウスカーソルがちらつく問題。よく分からないけど、ローマ字表示の上にレイヤーを付けたら起きなくなった。レイヤーはワードスピード表示のためでたまたまだけど、起きなくなったからまあいいか。

この辺りは今日RTCの動画見ながら原因調査したけど、推理力と観察力と地道な捜査が必要で、プログラマの能力はプログラムだけじゃなくてこういった能力が大事だというのを感じる。

で、あとは大会用にホスト兼観戦モードみたいなのを追加するのと、通信のラグ改善を入れたらテストして完成かな。さすがに2/16のWarriors of Typingには間に合わないか。

あ、あとカウントダウンの音か。一応書いておかないと怒られる。

タイピング日本一を決める大会「REALFORCE TYPING CHAMPIONSHIP 2019」。12/1に行われたオフライン大会を観戦してきた。もちろんe-typingによる予選にも参加して本戦を目指したが、全然レベルが足りなかった。去年までの観戦記:RTC2017RTC2018

Youtube配信しているので是非。5時間半と超長い・・・長く楽しめるのでお徳。そして11/12発売のREALFORCEテンキーレスMacキーボードも欲しいですね。宣伝は基本。

以下、タイパー視点、開発視点、ビジネス視点、e-sports視点で。長いので興味のある部分だけでも。

タイパー視点での感想

まず会場。RTC2017は東京ゲームショウの東プレブース、RTC2018はRED BULL GAMING SPHERE TOKYO、今年はSTORIA 池袋。個人的な感想としては、ゲームショウ会場は露出は高いけど競技にはなかなか向かず、RED BULL会場は堅い雰囲気で会場内が静かになっていた感じがするが、今回の会場は開放感があって盛り上がりやすかった。さらに池袋駅前のタイトーステーションにある大型ビジョン。途中その絵を見たくて外観戦してみたが、大画面にウェザタイが映っているのは感動。さすがに街行く人が興味津々ってわけではないけど、対戦が始まると何だこれ的に見ていく人がちらほら。

対戦内容は例のごとく他の人の感想に任せて少しだけ。やっぱり応援する選手を決めた方が面白いので、現ウェザタイランキングでJISかなQwertyともに3位、WTといえば、の、ひろりんご選手応援で臨む。最終戦、完全にmiri選手と互角、ワード同時取得の応酬、4-1から4-4への追い上げ、すごい盛り上がりだった。今まででも一番の歓声。このGrand Finalを見るために18年間Weather Typingを開発してきたといっても少ししか過言ではない。

あと気になったのははやとぅ選手。U-22最後の1ワード、94%で打ち終わらないように止めていたが、相手が96%から数回ミスしたのを見て打ち切って優勝を決めた。また、本戦2回戦でも同じように相手が95%から数ミスしたのを見て打ち切っていた。あれは、何打鍵中何打鍵ミスしたか、自分側も相手側も計算するウェザタイ算、RTC算か?をマスターしているのだろうか。

開発視点での感想

前回の宿題事項だった以下の点については解消。

打ち切り時に結果画面が表示されない問題
Warriors of Typingのおかげで自信は持っていたが、問題なし。

以下の点については課題が残っている。

対戦を続けた場合に取得したラウンド数を表示する
画面上部のラウンド数表示は付けてみたけど、使いづらかった。ゲームを作り直さないと数がリセットされないので、人を入れ替えたときにゲームを作り直せなかったり、途中でウェザタイを再起動したりもあって、ちょっと難しい。今回は、途中から配信画面の方で対応頂いていた。
打ち始めたらマウスカーソルを消す
だいたいは消えていたけど、たまにカーソルがチカチカしていた。打鍵の振動でマウスが動いていたのか、他に何か条件があるのか。

次に今回の変更点。今回、ウェザタイ本体から大幅に仕様変更している。実は大分前からお話を伺っていたので、時間を掛けて作り込んだ。

配信向け画面
画面は運営さんからの提案で、2人対戦を前提にRTCの配信画面に最適化して設計されている。去年までの配信が見づらいという各所指摘・提案を参考にしたものかな? 2人対戦専用画面なのでウェザタイとしてはそのままでは採用できないが、取り入れられる部分は本体に取り入れるかも。RTC版、ウェザタイのページに公開しているけど、他の目的でRTC版を使ってよいかは私には分からないので、もしそういったことがあればいきなり使わずRTC運営の方へお願いします。

  • 画面上部にプレイヤー名を表示。赤青のバナーと赤青のライティングの効果もあり、会場内、分かりやすくなっていた。
  • 実は画面上部に「何回戦」みたいな表示もできるようになっていたが、指定が難しいので使われてはいなかった。
  • プレイヤー表示部分。ここは3人以上の対戦でどうするかというのがあるので、WT本体に入れるとしたらどうしようかな。
  • フォント。WT本体は変えられないかな。設定できるようにしても良いけど、そこまで需要はなさそう。
  • 結果画面。だいぶ分かりやすかった。セレナーデ☆ゆうき選手の名前が入り切ってなかった以外は。
入力不能時間の非表示化
RTC2018の打ち上げ(だったと思う)で要望があった件。ちなみに入力不能時間を0にしたのではなく、入力不能時間の文字を透明にしている。0にすると、ワードを取れなかった方が次のワードの最初の文字でミス入力になってしまう。この仕様、いきなりウェザタイに取り込むと、当然反対意見が出るし、過去Verとの互換性がなくなって(過去Verの方が有利になってしまう)また各プラットフォームバージョンアップしないといけない、とかやりたくない理由がたくさんあって実装してなかった。なので、しがらみのないRTCで実験。試合を見た感じと、何人か聞いた感じ、あまり違和感はなさそう。本体に取り込むときは、各ワードを打った瞬間に誰がワードを取ったかとかワード単体の速度を出そうかな。さらに、WT3構想の中で、相手に自分の得意なルールを押しつけられるようにするというのがあるので、その一環で「初速重視/初速無視」ルールを入れるという手もある。
最終ワードの待機時間
最終ワードを取ったときに3秒待つようになっている。この辺、観客に分かりやすく、実況しやすいように、ということだが、なるほどですね。運営者でないとこういう発想は出てこない。本体に入れるときは、3秒間の間、よくある「XXX Win」みたいなのを出した方がいいかな。

次に今回の問題点。

最初のワードのラグ
最初のワード、赤プレイヤー側が一瞬遅れて青プレイヤー側が打ち始めていることがあった。開発時、RTC版の画面構成が少し複雑で表示が遅れることがあり、321カウントの後、少しだけ画面を非表示にしている。んだけど、それでは間に合わない感じなのかな。だんだんラグ率が上がってたようなので、記録が増えるとラグが出るってことなのかも。
キーボードが打てなくなることがある。これはリプレイがないとよく分からないが、見た感じ、その前のワードが大文字で終わっていて、シフトロックになってるのかも。左右のシフトを打ち分けたいという要望で今年からロジックを変えたところだし。

ビジネス視点で

第3回目となるRTC。いつも思うけど商業的に成り立っているのか不思議。会場貸し切り、大型ビジョン、賞金、お土産まであるし。来年も開催されるかどうか、社内で企画を通せるかどうかはYoutube配信の視聴数にかかってくるのか、毎年新製品が出るなら採算度外視が許されている企画なのか、とかビジネスモデルを想像していたら、「タイピングアドカレ」でジェイブログ「タイピングを流行らせて多くの人が楽しむにはビジネスとして扱う事が必要な件」が公開されていた。だいぶ具体的に書いてますね。ウェザタイと違って東プレさんは慈善事業じゃないので、来年以降も企画を通しやすいように、何かしら裾野を広げる活動で実績を作って応援していかないと。

そういう意味では、この前のN高等学校 第二回ネット運動会は運動会という特性上、タイピングマニアは出場できないので一般の人が気軽に楽しめるものになっていてよかった。タイピング速度もそこまでではないのでワードの面白さを楽しんだり、逆に新鮮。別にウェザタイでなくてもいいんだけど、こういうタイピングを使った何かが増えていくとよいですね。

ちなみに「ジェイブログ」から。

WeaterTypingは無料で公開されているので、費用がかからないのが当たり前と思ってる人が多いですが、開発者に還元すれば、モチベも上がりますし、より良いタイピングソフトになっていく可能性が高いです。

その通りなんですが、私の場合、ダイレクトに収入になってしまうと表向きの職業にめんどうな影響があるのでちょっと。例えば自作ワードを作って公開するとか、面白いリプレイを公開するとか、対戦動画を投稿するとか、ウェザタイの世界を広めるような還元があると嬉しい。英語ワードとか・・・あっ。まあウェザタイ側の機能も不足してるんだけど、この辺はニワトリとたまご関係。

e-sportsの視点で

ネット運動会のときにFortnite他のe-sports実況を見たが、ゲームのルールは複雑でも、ルールが分かってくるとその複雑さが面白くなってくる。そういう意味ではタイピングは単純すぎる感はある。ネット運動会で司会者の方が100m走に例えていたのはなるほど。ただ、一般的なe-sportsゲームだとなかなかゲームファン以外にアピールするのは難しいけど、タイピングは一般の人にもアピールできる可能性はあるのかな。大型ビジョンでも、他のゲームに比べると、お? って見る人がいる感じ。

なお今後はタイピングマニア向け機能を増やすより、配信の見やすさや大会運営が楽になる機能を重視していくと思う。悪く言えば打ちやすさよりも分かりやすさを優先することも多くなる。要望等もそっちにからめて利点を説明してもらえると検討するかも知れない。

まとめ

いろいろな視点で書いてきたけど、結局、面白かった。去年の、miri選手がloserに落とされて勝ち上がったドラマを超えられるのか、と思ってたけど、今年は逆にmuller選手がloserに落とされてlosers決勝まで勝ち上がったり、Grand Finalの盛り上がりも去年以上だった。大会の演出も、手元カメラが増えたり画面も見やすくなっていて、まだまだ進化しそう。

てことで、選手の皆様、運営の皆様、今年も素晴らしい大会ありがとうございました。来年以降もあるといいなあ。

N高等学校 第二回ネット運動会 ~esports Festival~」を観覧した。さいまえでコメント打ちながら視聴したけど、全体的にゆるくてニコニコ感が心地よい。生徒が会場にいないから先生宣誓でいいや、は草。

タイピングに関して

てことで、開始前は、今回の競技の並びにWeather Typingが入るのはどうなのか、盛り上がるのか、と思っていたが、なかなか面白かった。やっぱり初見だとワードのインパクトがあるようで、「この例文考えたヤツ出てこい」コメントは誉め言葉。ウェザタイのワードは真面目に変なことしてる感があって、ニコニコの雰囲気とは合う気がする。シナリオ的にも、タイピングを白が圧勝したことで後のドラマ性を高めるのに貢献できた。12月生まれなので赤が逆転するともっとよかったけど。

タイピング的には、早い人を後ろに持ってきていたのか、最終戦は550kpmくらいまで出ていた。来週の「Realforce Typing Championship 2019」は1000kpm超えまで行くんだろうけど、このくらい一般人にも届きそうな雰囲気の対戦もいい。Weather Typingの頂点が気になる人は、12/1の配信を見るべき。よし、自然に宣伝できた。

ウェザタイの改善点。やっぱり画面まわりと、遅延が見えすぎる問題かな。画面はRTC 2019版を参考に考えていくとして、あとは通信遅延。第一戦、遅延が大きくて大丈夫かな、って思ったけど二戦目以降は割と安定してたかな。どうしてもプレイヤーの環境に依存する問題はある。改善案として、ずっと前から「リアルタイムから1秒くらい遅れるけどスムーズに描画する観戦モード」っていうアイデアはあって、今回実装するのに必要なモチベーションが結構たまったのでもう一声ってところ。

タイピング以外

今はe-sports知らなすぎというのもあり、せっかくなので全部見て勉強した。ゲーム内容については知らなさすぎてコメントできないのでシステム的なところだけ。コンパスは、あれは大会モードなのかな。プレイヤー全員の画面を切り替えられるようになっていてよい感じ。クラッシュ・ロワイヤルは1対1だからかも知れないけど現在の状態が凄く分かりやすくて、私でも最後はルールがなんとなく分かるようになった。Fortniteはどうしても1人を追う感じになるのかな。誰がどこにいるか俯瞰するモードがあったりしないのかな。いずれにしてもe-sportsとしての工夫が盛り込まれているのでウェザタイにも取り込んでいきたい。

まとめ

ネット運動会、なかなか見応えがあった。配信を見る限りでは通信トラブルなどもなかったようなので安心。視聴数も最終的に12000くらいになってて、こういう場でe-sportsとしてのタイピングを広めることに少しでも貢献できるといいですね。

運営の皆さんありがとうございました。

WT RTC2019版の正確性の仕様についてメモ。

WT RTC2019 v06版では、正確性の仕様がWT本家およびRTC2018版と変わっている。WT本家では、画面表示時の正確性はC#のdouble-文字列変換で少数点1位まで表示したものに従う。四捨五入っぽいけど正確なところは不明。で、変換の詳細が分からないと95%未満で黄色い背景にすることは難しいので、RTC2019 v06では少数第1位で切り捨てることにした。結果、最大0.05%ほど正確性が下がる。例えば、最後のワード、最後の文字で、今1999打鍵105ミスだから、あと1文字はミス可能、全速力で打とう、といったギリギリの計算をしていると、106ミスで95%を割ってしまい、負けてしまうので注意が必要。

ちなみにWT本家への反映予定はない。入れるにしても過去との互換性等、いろいろ検討しないと。