【視聴者参加型】即打!タイピング勝負!【鈴木勝/にじさんじ】を視聴。配信者が視聴者と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万ワードくらい生成して配布すればまあいいのかもしれないけど。。。

最近ウェザタイに使うためにディープラーニング実装したり本読んだりしている。ニューラルネットを勉強してたときは脳とかけ離れているのでこれじゃあ脳を作るのは無理だな、と思ってたのが、結構面白いところまでいっているのが分かってきた。

プログラムで脳を作るのは子供の頃からの夢なのでずっと本読んだり考えたりしているのでちょっとだけメモ。

おそらく最初にキモになるのはエンコーダとデコーダで、外界の情報を主成分分析的に圧縮して、概念をベクトル化するところ。この辺りはいろいろ脳関係の本を読んでいると実際の脳でもやってそうな感じがする。たぶんニューラルネットで言う誤差逆伝播は実際にはなくて、ヘブ則と抑制性シナプスとよく分からない接続で解決しているはずなんだけど。

で、もう一つ重要なのが環境入力と動作の出力から報酬を予測するところで、こんな感じなのかな、って考えていたのはあるんだけど、最近勉強してたら出てきたディープラーニングを使った強化学習がまさにそういうことを言っている。ただ、世界に実際の身体があって生活しながら学習させないと高度な知性にはならないし、報酬を何段階にも動的に獲得していく必要があるはずなので、今の強化学習だけではダメな気はする。強化学習はそこを目指しているわけではないけど。

この辺り、いくらでも書くネタはあるけど、理解できるものにならないしただの妄想なので書いてこなかったところ。でもそろそろ何か書いていきたいなあ。例えば全身麻酔したとき、その間時間経過を感じずに一瞬で目覚める感覚になるわけだけど、それって脳が動いていない、つまり死んでいる状態を一時的に再現している、と。逆に死んだ後はそういう状態なわけで、時間経過も何もないことが分かる、とか。誰か意味分かりますかね。

土曜日にG検定を受検してみた。95%はできていると思うのでたぶん大丈夫だろう。久しぶりに試験勉強ぽいことをしてみたけど、選択式の試験はキーワードと意味を覚えるだけの表面的な勉強になるので、これ意味あるのかなあ、と思ってしまう。この後はE資格を受ければ良いんですかね。統計検定?

で、実際今やってるのはタイピングオンライン用の問題文章生成。ウェザタイではXamarinで動かすために行列計算からLSTMまで自力で実装したが、Unityではkeras使えそうな感じなのでそっちに移植中。

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

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

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

今更だけどDenasu Webサイトのスマホ対応をやってみた。Denasuサイトは1998年から運営していることになっているので、モダンな作りにするにはいろいろとめんどくさいなあと思ってたけど、いい加減やらないと、って感じ。
やってみると各HTMLにviewport

<meta name="viewport" content="width=device-width,initial-scale=1" />

を付けて、CSSで

@media screen and (max-width: 600px)

の中に小さい画面用のデザインを定義して、細かいところでは画像のmax-widthを100%にしたり、そのくらいでそれっぽくなった。

今更だけどDenasuトップページにコンセプトを追記した。

作者の好きなことをソフトウェアにしているので、作者自身がユーザです。また、趣味の開発であり、広告も利益も目指していません。ユーザとして欲しい機能、使いやすさを目指しています。

フリーソフトだからできることがある、というだけで、商用ソフトウェアを否定するわけではない。

結局KPI、何を目標にするかによって結果が全然違うわけで。

例えばWWW。昔はユーザの相互情報共有を目指して有用なコンテンツがたくさんあった。その後商業利用が大多数になってKPIが利益になったので、ユーザが見づらくても広告を入れまくったり、SEO対策でどうでもいいページばかり増やす結果になった。

例えばテレビの報道。KPIは視聴率=スポンサー獲得なので、視聴者の利益とか日本を良くしたい悪くしたいという思想は特になくて、単に何でも批判して煽っていれば視聴率が取れるのでああいう風になっているだけ。

ソフトウェア。商用のソフトウェアの場合、どうしても利益を優先するので、誰かがほしがっているものを(自分は欲しくないのに)作ってあげることになる。なのでなかなかユーザ目線になるのは難しい。昔ながらのフリーソフトはKPIが自分が使いたいものを作る、なのでユーザの利益と直結しやすい。

ということで(今のところ)自分は他のことで十分収入を得ているので、Denasuは広告もなし、営利非営利関わらずフリーソフトとして使ってもらう、とうやり方にしている。

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

経緯

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年ということでリーフレットを作ってみた。

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

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

なんかそろそろお金が増えそうな気がしたのでiPad Airを買ってみた。今まで第2世代iPadを使って週刊ASCIIを読んだりしていたのだが、ものすごく動作が重いので。

Apple Pencilも買ってみたが、iPadにくっつければ充電されるのか。Surfaceは単6電池だからそこは便利。

今あるのはメインSurface Book 2、持ち歩きSurface Pro 7、Mac開発用Mac Book Pro 2019、スマホXperia 1 II、テスト機第7世代iPod Touch、タブレット第4世代iPad Air、くらいか。あとKindle PaperwhiteとかSony Digital PaperとかOculus GOとか。開発者ってこのくらいは機器持ってるもの、ですよね。。。

プロ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つのパッケージのまま。

2年前に購入したWiMaxを解約した。関西でウィークリーマンションに住んでいた1年半、ネット回線がなかったときにすごく助かってサービスに関しては全く不満はないのだが、関東に戻って半年、ほとんど使う機会がなかったので。2年しばりなので今月を逃すと2年後になる。

解約については2時間くらい電話チャレンジする必要があったが、つながってしまえば「解約します」「はい」で終わった。別に解約をさせたくなくてつながりにくくしてるわけではなくて単純に人が足りないだけっぽいけど、なんで解約はネットじゃできないんですかね。

Netflixとかは、解約というか停止も再開も簡単にできるので今月だけやろう、とかできるけど、契約は2年しばりで解約は2時間の電話チャレンジだとなかなか契約しづらい。自分の場合、しばらく出張とか普通にあるからもっと気軽に契約・解約できるなら年数回使うとかしたいんだけど。

ちなみにDenasu System開設当初に使っていたhi-ho(元Panasonic系のISP)は回線契約なくなっても最低限の月額\500でメールとWebサイトを使うことができて、ずっと使っている。こんな感じだといいのに。

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

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

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

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

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

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

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

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

メインメモリが足りなくなってきたので、3年ぶりにXperia SO-01JからXperia 1 IIへの乗り換え。アプリの移行は簡単だけど、不要なアプリの削除とか、POBoxがなくなって困ったりとかで2時間くらい。とりあえず快適かな。my daizのページは非表示にできないのかなあ。

しかし設定周りは毎回UI変えてくるから毎回覚えたのをリセットされて使いづらい。。。

ウェザタイ4.1で文章自動生成を作ったので、英語も対応してそろそろ英語圏進出したい、というのがある。

ただ、以前からちょっと躊躇してるのが各国規制。まあ日本で公開していても気にしないといけないんだけど、英語圏で公開するなら必須。

以前COPPAについて軽く調べたが、もう少し調べてみる。専門家ではないので信じないように、・・・というのは一応書いておかないといけないらしい。

COPPA

COPPAの定義では、13才未満を主な対象としているサービスで個人情報を集めたり、一般が対象のサービスでactual knowledgeを有する場合に適用される。最終的には客観的な判断だが、ウェザタイは13才未満が主な対象ではない。actual knowledgeは、要するに年齢を登録させるようなサイトだと、13才と知ってるじゃん、てことらしい? ウェザタイはユーザの年齢なんて知りようがないのでこれもあてはまらない。また、もしあてはまったとして、個人情報があるか? だが、ウェザタイに関連するところではハンドルだけで、COPPA上「オンラインコンタクト情報と同様に機能する場合に限る」となっていて、まあ当てはまらないでしょう。適当なハンドル登録できるし。今後、ハンドルじゃなくてメールアドレスでログインできるようにしたり、年齢を登録させたり、写真を投稿できるようなシステムを作ったりしなければ問題はないか。

GDPR

あとはGDPR。最近いろいろなところでクッキーの承認が出てきてうるさいのだが、これもやっておかないといけないのかな。ってことで、掲示板、クッキーを使わないようにした。ハンドルは毎回入れるようにして下さい。

Weather Typing 4.1 Windowsデスクトップ版を公開。主に、ディープラーニングを使った完全文章自動生成と、シミュレーションをベースにしたCPU対戦の追加。

ディープラーニングは、最終的に日本語WordNetを20000単語で学習した結果、割とまともになったのでとりあえずこれで。といっても文章としてはまだまだ改善の余地があるし、本体のサイズがかなり大きくなっているのと、ワード読み込み時に数秒かかるといった課題が残っている。

あと、配信を観たり掲示板で来ていた報告からいくつか改善。インストーラにデスクトップショートカットを付けたり。デスクトップショートカットは嫌いなんだけど、こう言う理由で付いてるのか。

これでWT2時代から残っていたレガシーな部分が全部なくなった。各プラットフォーム対応が終わったら、ウェザタイポータルか、ウェザタイ3Dか、ウェザタイオフラインか、新しいことをするかな。

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

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

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

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

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

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

職場の人に紹介されて、Amazon Prime Video「アップロード」を視聴。まだシーズン1しかなさそうだけど、先が気になる。以降導入部分のネタバレあり。


ストーリーは、人の意識をバーチャル空間にアップロードして、バーチャルな世界で暮らすという内容。アップロードするには脳を破壊しつつスキャンする必要があるので、本人は死んでしまうというか、死にそうになったらアップロードしてするという設定。

で、一応不死の世界ができるってなってるけど、結局アップロードした人の意識は消滅してしまうから本人にとっては不死じゃないですよね。バーチャル世界の方の人は瞬間移動してきたように感じるだろうけど、それは新しく発生した意識であって、死んだ人の意識とは連続していない。

不死になる方法があるとしたら、昔のASCIIで読んだ記事にあった、脳細胞を1つ1つシリコンに置き換える方法なんですかね。それなら自分の意識のままロボットになれそう。


それはそれとして、テーマ的には資本主義。バーチャルの世界なんだからお腹も空かないし争いもない、みたいなのを想像するけど、実際は現実とほぼ同じ。フリーの朝食はあるけどそれ以外は課金制。しかもお金を払うのは現世の人なので、バーチャル世界に暮らしている人は現世の人に食べさせてもらう。なんでそうなっているかというと、世界を運営している会社が儲からないといけないため。資本主義を象徴している。

で、主人公はフリーのバーチャル世界を作る理想を掲げるフリーソフト開発者。資本主義に頼らずにどうやって解決するのか。続きは観て下さい。


Amazon Prime Video、日本語字幕をオフにできないのはどうにかならないのかな。英語字幕+英語音声が一番いいんだけど。英語の勉強には使えない。

モゴモゴバスター。4年半かけてようやく1周終わった。モゴモゴバスターは松尾光治さんの英語リスニング教材。Webページを見るとものすごく怪しいページに見えるけどむしろ格安。この教材をやるまでは英語ネイティブがネイティブ向けに話す内容が全然聞き取れなかったが、だいぶ聞き取れるようになった。気がする。


プログラマといえば英語だよね、ってことで大学時代に英語を本格的にやり始めた。15年くらいたって、英語教材とかTOEICの英語は簡単に聞き取れるようにはなったけど、アメリカ行って日常会話を聞いてもさっぱりという状態だった。DVDもフレンズはまあまあ聞き取れても他のドラマは難しい。で、どうも普通に手に入る英語教材と日常会話は違うな、ということに気付いて、何かいいものはないかと探していて見つけたのがこれ。

TOEICとか、ネイティブが日本人に話す英語は結局よそ行きの英語で、これはいろんな教材で勉強ができる。でもネイティブがネイティブ向けに話す内容はそもそも別の発音で喋っているので、慣れてないと英語にすら聞こえない。例えば「May I Help You?」は明らかに「メルプユー」って言っている。つまり文脈と使用頻度から明らかなケースでは、とことん省略してしまう。なので、「May I Help You?」じゃなくて「メルプユー」という単語?を新たに聞き取れるようにする必要がある。

でも、それに慣れようとしてもそんな教材はない(今はYoutube+自動字幕でできるかも)。のでこの教材はすごく貴重。

とはいえ1レッスンするとものすごく疲れるので、なかなか進まなくて4年半かかったんだけど。でも結構Youtubeとか、音自体は分かるようになってきた。その早さの英語に理解が追いついてないのでもっとインプットしないと内容が入ってこなかったりするけど。

てなわけで、TOEICは簡単だけど日常語は聞き取れない、もう一段上に上がりたい人にはお勧め。

3/26の東京都知事会見後からずっとリモートワークしてるのでそろそろ1ヶ月。普段と全く変わらない。OAに近い机と椅子もあるし、土日も別に用事がなければでかけないし、ずっと開発してるし。

ところでリモート飲み会が話題だけど、Denasuは2009年にリモート飲み会してますね。時代に先駆けすぎ。

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

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

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

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


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

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

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

研究中のディープラーニングを使ったワード完全自動生成、日本語版がなんとなくできた。7単語で切っているので中途半端な文になってるけど、割といい感じ。これでもかなり面白いけど、もうちょっと精度上げればよさそう。括弧の対応とかがうまくいってるのがすごい。

前回の英語版は「ゼロから作るDeep Learning 2」ほぼそのものなのだが、日本語版はフリガナとかちょっと一工夫している。

コーパスはWikipediaの一部、形態素分析はNMecabを使っている。実装はC#、行列の内積計算だけCで書いているので、Xamarin使ってどのOSでも動かせる。

タイピングソフトと文章自動生成は相性が良いと思ってたけど、そのうち当たり前になるかな。ある分野の文章で、毎回違う文章を打てるのがいい。例えば夏目漱石の小説を学習したら、夏目漱石っぽい文章を打つタイピングソフトになったり、いろいろ可能性がありそう。