けものみち

Desire path

9〜10月中盤までのタイピング成果

もうあと2か月半くらいで2019年が終わるとか、あと半年もしないうちに大学卒業するとか信じられないです。時間はあっという間に経ってしまうのですね。


f:id:WhiteFox-Lugh:20191014094734j:plain

さて、前回のタイピング成果まとめからおよそ1か月半たったので、またまとめてみようと思います!

正直、前回の成果まとめ作った時のタイピングのレベルでも「俺はタイピング極めた!」と言ってもほとんどの人には怒られないと思うのですが、この1か月半でまたいろいろと成果が出たので、まだまだ腕は磨けるもの、謙虚にコツコツ練習していこうと思いました。


1. e-typing

腕試しレベルチェックは前回のまとめではスコア 616 が最高でしたが、 それを大幅に更新する 665 が出ました!

なぜか MacBook Air のキーボードで打ってますが。意外と打ちやすいんですよ。MacBook Pro のキーボードは打ち心地最悪なんですけどね。

これは夏休み中の記録で、この記録を出した当時は「たまたまうまくいった」と思っていたのですが、10月にスコア 664 を2回出しているのでもうまぐれではない気がします。

それと、長文では初めてスコア 800 台を出しました!800台は e-typing では Joker ランクと出て、これより上のランクは存在しないようです!(マジか)

それまでのハイスコアが 768 だったので、50点以上も更新するとはちょっとびっくりです!

2. Weather Typing

800 key/m を超える記録が結構出るようになってきました。

リアルタイムの対戦では10ワード先制勝負で 840 kpm とか出てたのでもっといい記録が出るかもしれません。

windows 版だと1文ごとに正確さとスピードを出してくれるのですが、速いやつだと 1100kpm, 遅いと 600kpm くらいで結構ムラがあるのでどうにか下限を上げたいところです。

あとはRTC(Realforce Typing Championship)を意識するとトップスピードで打っても正確さ 95% は切らない練習をするのも必要ですね。これは Weather Typing の対人戦で鍛えたいところです。

3. タイ速

ついにネカフェで隣の人に迷惑がかかるレベルになりましたw

いや、ネカフェほとんど行かないんですが...

次のランク S+14 も目指せそうな気がするので狙ってみたいと思います!

Unity でタイピングゲームを実装をしたので覚え書き

ここ数週間はタイピングの練習にとてもはまっていて、1日1時間、長いと3〜4時間はタイピング練習に費やしてしまっている状態です。いわゆるZタイパーなんてのも目標の一つにいれています。

最近のお気に入りは Weather Typing です。

f:id:WhiteFox-Lugh:20190911073755p:plain

f:id:WhiteFox-Lugh:20190911073809p:plain

複数のワードをランダムに組み合わせて文章を生成しているのでマンネリ化しないし、結構面白い文章が生成されるのでかなり気に入ってます。中でも「試用版おいなりさん」が出てきたときは好きすぎてハンネにしてたぐらいです。


さて、今回の記事は、ちょうどタイピングにはまっていることだし、Unity でタイピングゲームを実装すればいいじゃないか!ということになって実装してみることにしました。

(※ 覚書みたいなものなので気が向いたら Qiita にでもコード付きでまとめなおすかもしれません)


タイピングの入力の判定について

今回実装しようとしたのは e-typingタイ速寿司打など多くのタイピングゲームで採用されている逐次判定方式です。簡単に言うと、一つキーが押されるたびに正しい入力かどうかを判定する方式です。文章も英文ではなく和文です。

この方式なのですが、一見そこまで難しくなさそうなのですが、実装するにあたって考えなければならない点がいくつかあります。

1. 複数入力に対応しないといけない

「し」は si, shi, ci の3通り*1あるとか、「しゅ」は syu, shu の他に「し」+「ゅ」と打つ方法(si + lyu, si + xyu ...)があるとか一つの文章に対して結構色々な入力が考えられます。

特に厄介なのが、

  • 「ん」: 「ん」の後ろに母音、ナ行、ヤ行、ニャ、ニュ、ニョなどがきた時、または文末の「ん」は nn または xn *2 でなければならない。それ以外は n も可
  • 「っ」: 後ろに続く子音を2回入力する。「っか」は kka になるし、「っし」は ssi になる。ただし、「っ」を単独で入力する方法は ltu, xtu, ltsu, xtsu と4パターンあり、「っ」+「か」などと入力する(ltu + ka)のも正解としなければならない

です。これらをうまく判定する方法を考えます。

2. 複数入力に対応すると可能なパターン数が爆発的に多くなる

先ほど挙げたように、ひらがな一文字に対して2通り、3通り、場合によっては「しぇ」などのように入力パターンが10通りを越える場合もあり、ひらがなで高々20文字程度の文章であっても、可能な入力パターンが軽く10万、100万と爆発してしまうことがわかるかと思います。

例えば「一家に一台」という例文があった時、愚直に入力パターンを列挙すると i kka ni i ti da i, yi kka ni i ti da i, i ltu ka ni i ti da i, i ltu ka ni yi chi da i, ... などとかなりのパターンが出てくることがわかります。

なので判定のアルゴリズムをきちんと考えないと、判定自体が遅くなってしまい動作が重くなってしまうことが考えられます。

3. キー入力と判定

多くのサイトでは Update() を用いてキーを拾う実装になっているようだったのでとりあえず最初はそう実装していました。

しかし、実際自分でテストプレイしてみると、高速で入力したときに「正しいキーを押したのに押してない判定」になることが結構ありました。

これには Update() が呼ばれた時とキーを押した時が一致しなかったため入力を拾ってくれないとか、そもそもタイピング速度が 60fps で判定できる早さを超えている(タイプウェルなどで測定すると得意な入力に対しては 1フレームを切ることがあるようです)など、いろいろ原因がありそうなので別の方法をとるしかありません。


実装の概要

ひらがな→ローマ字入力へのマッピング

「あ」→ a、「ふ」→ fu, hu、「ん」→ n, nn, xn、「しゃ」→ sya, sha のようにひらがなからローマ字入力へのマップを行う Dictionary を作りました。

あらかじめ文章をひらがなで書いておいて、このひらがなの文章をパースすることで考えられるすべての入力パターンを列挙できるようになります。例えば「一家に一台エアコン」という例文があったとして、変換のイメージは以下のような感じです。

i k ka ni i ti da i e a ko n
yi ltu ca yi chi yi nn
xtu xn
ltsu
xtsu

あとはひらがなの文章の今何文字目をみているかを記録する変数や、各ローマ字入力において今アルファベットの何文字目を見ているかなどを記録すればよいです(この辺の細かい実装については割愛します)。

ただし、上記の例のように「っか」を「kca」と入力するパターンは不正解とする、文末の「ん」は n は不可など例外的なパターンの処理も必要となります。

これで1キーあたりの判定時間は高々20通りくらいのチェックで済むようになったので判定関連に関しては十分高速だと思います。

入力を OnGUI() で受け取る

www.sophiehoulden.com

高速で入力するタイパーに対応する方法に関しては、いい感じの記事が英語で見つかったのでこれを参考にしました。

すごくざっくり言うと、OnGUI() はフレームレートから独立しているので、Event.current を用いてキーを入力するたびにそのキーが何かを受け取って適当に保持しておき、Update() が呼ばれた時にこれらを一括で処理するというものです。

Event.current ではキーを押した時と離したときの2箇所判定があるので、判定は KeyDown の時だけになるように、また、マウスのクリックなど、キーボード以外のイベントは受け付けないようにします。

入力されたキーを次の Update() が呼ばれるまで保持するデータ構造はシンプルに Queue で実装しました。

このように OnGUI() を用いたところ、高速にタイプしても入力漏れがなくなり実際に公開されているタイピングゲームとだいぶ近くなりました。

今の実装では、キーが押された時刻は特に保持してはいないのですが、上記の参考元の記事では、キーを押した時刻を保持しておくと記述があるので、その情報を用いて順番が前後しないようにした方がより安全かもしれません。


入力画面のプロトタイプ

UI 面とかはさておき、とりあえずそこそこの速度で打ってみたり、わざと普段使わない入力方式やよくある打ち間違えなどを混ぜて打ってみたり、問題文を前半ワード + 後半ワードの形式にしてランダムで生成して、ちゃんとうまくパースできているかを確認したりしてみました。だいぶいい感じになったと思います。


このあとは

スコア計算、スコア保存、レーティング機能(音ゲーマー感ありますね)、初心者用にもうちょっと短い文章でタイピング&ローマ字入力を表示してくれる機能、ローマ字だけではなく英文入力に対応するくらいまでは実装してみたいと思います。英文の方が実装は楽そう…。

そこそこの中身になったら、UI を整えて、無料で使えそうなバックエンドも用意して、ランキング機能とかユーザーごとに記録を保存するとか、ツイート機能とかつけてみてネットに公開してみんなにプレイしてもらってもいいんじゃないかなとも考えています。

*1:ci で「し」を入力できるのはタイピング特有っぽいです

*2:これもタイピング特有の入力です

キー入力を工夫してみた話

最近タイピングのキー入力を最適化するのにちょっとハマっています。ということで、ここ最近知った面白いキー入力方法についてまとめてみようと思います。


1. ん は n がいっぱい

ん を打つときに n を2個打たないとダメなパターンは

  • そんな(so-nn-na)、運輸(u-nn-yu)、せんい(se-nn-i)のように「ん」の後に母音、もしくはナ行、ヤ行が来る
  • 後ろに句読点、読点、記号など一切何も来ない、文末の「ん」(タイピングゲームの場合)

くらいだと思います。多分。

これ以外は n は 1個で大丈夫なはずです。 例えば、人工知能は ji-n-ko-u-ti-no-u、選挙は se-n-kyo、単語帳は ta-n-go-tyo-u のように打てば大丈夫です。

n を 1個に省略できる / n を2個打たないといけないパターンの区別はかなり有名ですが、「そんな」「こんな」「兼任」といったワードは n を3個連続して打たないといけないため、上位タイパーの中には n が3個続くパターンに対しては以下のように x を用いて入力する人もいるそうです。

「そんな」→ so - xn - na 「こんな」→ ko - xn - na 「けんにん」→ ke - xn - ni - n(n)

f:id:WhiteFox-Lugh:20190907095939p:plain

上の画像は e-typing で実際にやってみたときの画像です。見た目的には結構違和感ありますね(っºΔºc)…

慣れるまでが大変そうですが、実際使いこなせるようになると右手の負担が減るので良さそうです。今後積極的に使っていこうと思います。

2. 人差し指2連

「ゆ」「ふ(hu)」あたりを人差し指を高速移動させて打つのを高速化する方法です。

まず「ふ」は簡単で、fu と打てばよいです。というより、fu の方が推奨されています。 もし hu で取りたい場面があれば、h を人差し指、u を中指で取るとそれなりに速く取れます。

次に「ゆ」ですが、これも、y を人差し指で、u を中指で取るととてもスムーズに取れます。

簡単な工夫ですが見違えるほど打ちやすくなりますね。

3. 親指をスペースキー以外で使う

2 の人差し指2連に関連した方法です。

「ぬ」を n を親指、u を人差し指で取る、「む」を m を親指、u を人差し指または中指で取るという運指をする人がいるようです。

親指といえばスペースキーを押すのにしか使わないイメージでしたがこんな風に使えるんですね。 その発想は本当になかったです。


タイピングを練習して7年ほど(高校生〜大学4年の春まではサボり)になりますが、タイピングもこんなに奥が深い競技だったんだなと気付かされますね。

ここ最近はツイッターに手元動画とかタイピング練習サイトのスコアのスクリーンショットなどを載せる機会を結構増やしていて積極的にタイピングの面白さを布教しようとしているのでこれからも頑張っていきます!✩°。⋆⸜(*˙꒳˙* )⸝

最近のタイピング成果

ここ1〜2ヶ月くらいタイピング欲が再燃して練習を続けています(っ_ ॑꒳ ॑_c)

タイピング欲が再燃する前は、おそらく 650~700 key/s くらいの打鍵速度でしたが、気分転換にやっていたところ指の動きが良くなってきていろいろなタイピング練習ゲーム、ソフトにおいて良い記録が出るようになってきたので、成果報告としてまとめてみようと思います。

寿司打

本格的に練習を再開するまではおそらく70〜80皿程度でしたが、練習し続けたところ念願の大台100皿超えを達成しました!利益も30,000円超えたので大満足です!

次は高級一発勝負コースをきちんと減速せずに完走してみたいですね。

e-typing

腕試しは 580 台程度だったのが最高 616 まで伸びました(腕試しレベルチェックは文章が短いのと、文章を認識するまでの時間も含んでいるのでスコアがブレやすいですが…)

長文は、かつては 680 台が最高でしたが、最近では Godhand ランク(750以上)を出せるようになってきました。自己べは今は 768 ですがもっと伸びそうな気がします…!

タイピング速度測定

30秒間ひたすら短文を打ち続けるシンプルなタイピング練習ゲームです。

これも、以前は S+9とかぐらいで止まってた気がしますが、3ランクくらい上昇しました。

次の目標とか

  • 寿司打高級コース一発勝負完走(スピードはできるだけ落とさない)
  • e-typing 腕試し 630, 長文 800
  • タイピング速度測定 S+13, S+14
  • タイプウェル Zランク(今は常用XS, XA程度)

とりあえず、当面は 800key/m 程度で安定して打てるようになるのを目標とします。 あとはタイピング系のイベントにも参加できたらしてみたいですね〜。

院試の振り返り

8/6, 7日に京大の情報学研究科の社会情報学専攻修士課程の大学院入試を受けてきて、無事に合格することができました(っ¯꒳¯c)エッヘン

2019年のイベント(?)の中ではかなり精神的に負担が大きかったので肩の荷がようやくおりました。本当に良かったです…。

そんなわけで、せっかくなので院試勉強の振り返りをしてみます。


分析関連

まず院試の傾向を知る

ちょうど自分が受験する1年前くらいに、先輩方が院試の合否についてツイートしたころから、院試ってどういう感じなんだろう?と気になっていろいろチェックしはじめました。「大学入試よりは楽」「普通にやれば受かる」みたいな感じでしたが、過去問とかチェックした感じ正直1年後の自分がこれをきちんとこなせているんだろうかとかなり不安になりました。

研究室と専攻、試験科目

専攻によって結構配点とか科目とか変わってきます。得意不得意があると思うし、研究室との相性も考えなければいけないので早めに見ておくといいと思います。過去問と募集要項を眺めてここならいけそうだなっていうのを見ておくのがいいと思います。

自分は募集要項と過去問を眺めて社会情報学専攻(以下「社情」と略すことにする)が興味のある研究室が多いし、問題も解けそうな感じがしたので、1年前くらいには仮で社情に行こうと決めていました。

社情の試験科目は3つで科目と配点を書いておくと

  • 情報学基礎(150)
  • 専門科目(300)
  • 口頭試問(100, 1日目の情報学基礎と専門科目の筆記試験で足切りされていない人が対象)

になります。ここにTOEICの点数(200点換算)も合わせて合否を決めます。

情報学基礎は、テキストが1冊指定され、そこから大問5問出題されて3題を選択して解答します。はっきりいって簡単なので9割〜満点取れないとダメだと思います。 あまり点数で差がつかない科目だと思うのでしっかり得点しましょう。

専門科目は主に「データベース」「人工知能」「情報システム」「ヒューマンインタフェース」あたりから出てきます。5~6題中3題選択になります。配点が大きいのでここをしっかり取れるかが鍵になってきます。めっちゃ大事!!! おそらく7割も正答すれば合格は無事だと思います(定員が少ない研究室に行く場合はもっと必要です)。

口頭試問は、自分の研究内容についてまず話した後、教授陣から質問が飛んできます。 口頭試問の順番は、試験1日目の情報学基礎と専門科目、およびTOEICの点数の合計の高い順に呼ばれるらしいです。


院試までの日数とやったこと

およそ1年前

どこの専攻に行くにしろTOEICが必要そう、ということがわかったのでとりあえずテキストを買いました。 先輩がどれくらい得点してるのかも一応把握しておき、850~900くらいを目標に頑張ろうと思いました。

昨年10月くらい

TOEIC受験で665点(´・ω・`)

自分の英語力の無さを早めに知れてよかったです…。

この時期に社情の基礎科目の出題範囲に指定されているテキストを購入しておきました。

春休み

院試基礎科目の勉強開始。TOEIC もやりはじめました。 ただ、この時期はあんまりしっかりはやっておらず、だらだらとテキストを読むぐらいにとどめていました。

4月

進級からの研究室配属

研究室配属で院試について結構触れられるので参考にしました。 第1志望か第2志望の研究室に引っかかればいいなと思ってたら第1志望の研究室へ行けることになり勝利。

輪講スタート

専門科目の「情報システム」と重なる部分が大きいので真面目に頑張りました。 いつだかツイッターでつぶやきましたが、輪講は学んだことがかなり定着するので頑張りましょう。

TOEIC の途中経過

4月あたりのTOEICで785点に到達しました。最初の受験から +120 点。

5月

作業BGMを TOEIC の Listening の音声に変更しました。もちろん問題集解くのも必要ですが耳慣れしてかなり聞き取れるようになった感覚があります。

5月の下旬に基礎科目のテキストを全部終えました。

6月

輪講終了。

「情報システム」「ヒューマンインタフェース」「人工知能」の順で過去問を解きながら、3回生までのレジュメで専門科目を完成させていきます。

いつも仲良くしているメンツと勉強会を週3くらいで開き始めました。勉強会していると結構いろいろ情報が入ってくるし、1人でやり続けるよりはストレスがないので良かったかなと思います。

レジュメとか過去問は HackMD を用いてまとめていました。

7月

TOEIC の結果が届き、835点となりとりあえず安心しました。

「データベース」もこの時期から詰め始めました。

あとはひたすら過去問を解いたり、レジュメを見返して出そうなところを詰めたり、定期試験の過去問を解いてみたり、とやれることはとにかくやっていました…

8月

最終調整。やれることはやった感じだったので、全範囲を軽くチェックしました。

行きつけのラーメン屋さんに合格祈願しに行きました。試験前日にゲーセンに行きました。何してるんですかね。


院試本番

情報学基礎(試験1日目)

出た問題

うち3題選択。僕は 2,4,5 を解きました。

大問2はセマフォについて説明するのと、プロセス間のデッドロックの発生条件の説明とデッドロック回避手法を1つ挙げるだけで、大丈夫そうなので解答しました。結構丁寧に書いて20分ほどかかりました。

大問4は擬似コードで挿入ソートを書くのと再帰を使うアルゴリズム擬似コードで書くだけでした。 再帰を使うアルゴリズムは教科書にあったのはにぶたんかな〜ということでにぶたんを書きました。丁寧にチェックもしつつ20分程度で完答しました。

大問5はリストとスタックとキューの違いを説明、連続リストと連結リストにおける要素の削除と考察がメインでした。 小問3の「データ型」と「型のインスタンス」の違いは?という問題がなんでこれ出したんだろうというお気持ちにはなったものの20分程度で完答しました。

60分くらい余ったので30分くらい見直して、30分余して退室しました。 その後、食堂へ退避し、午後の専門科目の最終チェックを行いました。

専門科目(試験1日目)

3題選択。僕は 2,5,6 を解きました。

まず問題用紙をパラパラみて大問6のヒューマンインタフェースをみて「あ!これ勉強会でやったやつwwwww」ってなったので大問6から手をつけました。デザイン原理とインタフェースの列挙(5個)と、データ収集の手法で、合計Max 3,200字。手が疲れそうになりながら全完しました。とりあえず1/3終わったので一安心です。

次に大問3を一応手をつけました。

小問1がパーセプトロンの学習をサンプルを順次適用させて最後に得られる重みは何?っていう問題でしたが、過去に自分の手でANDパーセプトロンを学習させたらそこそこ時間かかった記憶があったのと、後ろの問題も結構めんどくさそうで時間が取られそうな感じがしたので大問3を捨てました。10分くらいロスはしたものの、この捨てる選択は後で考えるとかなり賢明な判断でした。多分この問題解いていたら素点はもっと低かったと思います。

そのあと大問5の情報システムを解きました。

小問1が Balanced F-measure の定義となぜ適合率と再現率の算術平均を使わないのかという問題で、情報システムの講義で説明してたし、ちょうど僕が輪講で説明したので難なく書けました。

小問2がグラフが与えられて、指定したノードの近接中心性と媒介中心性を一番大きく上昇させるにはどこに1本だけ辺を加えたら良いかという問題でした。一瞬面食らってパスしましたが、落ち着いて考えると意外と答えの候補が少ないことがわかったので解けました。わーい。

小問3は PageRank と HITS の問題でした。やっぱり出たか!という感じでした。問題文が長いので書きませんが、設問に対して結論をどこに落とすかがいまいちピンとこなかったので適当に書いてパスしました。

次に大問2を選択しました。

マルコフモデル隠れマルコフモデルなどの用語を具体例を用いながら説明する問題や、パーティクルフィルタのアルゴリズムを示せといった用語説明的な問題が多かったです。最後の小問は、確率的推論とそのほかの課題(ゲーム木とか探索とか)との課題の違いを考えて、確率的推論はどんな問題で使うべきか議論してくれという内容の問題で、いい感じに具体例を挙げつつ解答し、大問を完答しました。

一応データベースも問題は見ましたが、結構難しそうだったのでパスしました。

手応え2完+2/3問。80%〜90%くらい得点できているのではという感じでした。

口頭試問(試験2日目)

まずTOEICのスコアと筆記試験の結果に応じて口頭試問対象者が掲示されます(この時点で60人くらい→45人ほどに絞られます)。

口頭試問対象者は指定の教室に移動した後、ホワイトボードに受験番号が書かれて、その順番に試験を行います。 まあこの順番がおそらく「筆記試験+TOEIC」の得点が高かった順なのでしょう…。自分は6番目に呼ばれました。

内容は「自分の研究の進捗について2分以内で説明せよ」でした。志望説明書に従って簡単に説明したぐらいでした。 その後質疑応答では「その研究はこの専攻的にはどういう意味があると思うか?」みたいなかなりガチめな質問が飛んできました。割とびっくりしました。確か「あまり先が見えていませんが、とりあえずこの研究の○○の部分がXXと似ているのでXX方面に応用できそう」的な応答をしたと思います。ここで見栄はって嘘言うわけにはいかないですしね。

正直口頭試問が一番緊張していました(っºΔºc)…

なお、合格ボーダー付近の人は「2分以内で説明せよ」が「5分」に変わったり、質問量が増えたりするようです。


その他

自分の特性

ギリギリにならないと頑張れないタイプというのが期末試験の受験状況からわかっていたので、早めに行動するようにしました。

あとは毎日コンスタントに頑張る習慣をつけること、天気が悪い日は頭痛がおきやすくやる気が出なくなるし、梅雨の時期はなおさら大変だろうなという見積もりとかもしていました。

自分の研究室の枠が少なかった

通常1研究室あたり4〜5人ほどとるのですが、自分の研究室は研究室配属の時で2人しかとらない研究室でした。 ということは、単純に合格するだけではなく、かなり上位で合格しないと生き残れません。首席取るくらいの気持ちで頑張りました。

リベンジ勢が多かった

僕たちの学年は、2回生のコース配属で思うように配属されなかった人や、研究室配属で行きたい研究室に行けなかった人が続出し、院試でリベンジを仕掛ける人が結構多かったです。リベンジ勢はかなりの割合がリベンジ成功していたので、大学での成績が良く、希望通りのコースや研究室に行けたからといって慢心しないように気をつけてください。


追記

2019.08.25

社情は私がTOEIC835点でしたが、900までは必要ないと感じます。なぜなら、TOEIC900点台の人と筆記試験で連番だったので、TOEIC100点差くらいは筆記試験の出来で簡単にひっくり返しうるからです。800以上あればとりあえず筆記試験までは一安心だと思います。

点数開示が来たらまた追記しようと思います。

2019.09.18

得点開示しました。だいたい予想通りの点数といった感じですが、英語は思ったより高めに出てくれてたようです。やっぱ専門勝負ですね。

https://twitter.com/arthur_lugh/status/1174231581793370112?s=21


おわりに

つかれました。ゆっくり遊んだり趣味に時間を費やしたりして有意義に夏休みを過ごそうと思います(っ ॑꒳ ॑c)