プログラマー向けのシンプルなキーボードシミュレーター

学生向けのプログラミングクラスを教えています。 そして、一般的に、明らかに、すべての学生、特に中流階級の標準的な問題を観察します-多くの人はキーボードのタイピング速度が非常に遅いです。



当然のことながら、キーボードシミュレーターで作業する子供を提供する必要があります。 しかし、最初に、私は子供たちにブラインド(10本指)印刷の方法を学ばせたくありません(これは子供たちから多くの時間を必要とし、初期段階ではあまり意味がありません;そしてそれを学びたい人は誰でも)。 第二に、プログラミングにはもちろん英語のキーボードレイアウトが必要ですが、通常はキーボードシミュレータの場合のように、英語があまり得意ではない子供たちに複雑な英語の文学テキストを書くことも不思議です。



私が小学生の頃、プログラミングクラスの特別な(自作の)トレーニングプログラムがあり、プログラミング言語の実際の辞書を辞書として使用しました(覚えている限り、ヘルプから削除されました)。 私は、今日の学生も同様のことをする必要があると決めました-プログラムで実際に発生する断片を訓練するためです。 同時に、入力速度を上げるだけでなく、実際のソフトウェア構成を学習します。



そのような標準的なシミュレーターは見つかりませんでした(後にKlavogonokでカスタム辞書を作成できる可能性があると言われましたが、機能がまだ明らかに不十分で非常に不便です)。



同時に、学生がどこからでもシミュレータにアクセスできるようにしたかった:学校のコンピューターから、または最小限のインストールで自宅のコンピューターから。 そのため、「すべてのコンピューターにソフトウェアをペイントする」オプションはあまり適していませんでした。 その結果、簡単なWebアプリケーションの形でシミュレーターを作成することにしました。 より正確には、JSアプリケーションだけでも、 もちろん、ネットワークとのすべての相互作用は初期段階でのみ行われるべきであるため、実際のタイピング中にネットワークの遅延が結果に影響を与えることはありません。



学生は、実際のプログラムに含まれる可能性のあるいくつかの行を次々に提供され、それらを入力し、シミュレータは各行の入力速度とすべての提案された行の入力の平均速度を計算します。 行の入力時間は、行の最初のキーストロークから最後にEnterキーを押すまでの経過時間と見なされます。 最初のキーストロークまでの時間(通常は行を読むのにかかる時間)は考慮されません。



テスト実行中に、2つの問題が見つかりました。



最初に、もちろん、ユーザーがスペルミスのテキストを入力した場合、何かをする必要があります。 多くのシミュレーターでは、さらにタイピングする可能性が何らかの形でブロックされているので、(学校時代のシミュレーターのように)少し簡単なアプローチを実装しました-ラインが時間通りに修正されないタイプミスで入力された場合(Enterを押す前)それはエラーとしてマークされ、合計平均ダイヤル速度を計算するときに考慮されません。



(もちろん、これは不正行為を許可します-入力に遅延があった場合は、単に足場に入ってEnterを押します)-システムは競争力があるとは考えていませんでした。さらに、競争を手配しようとすると、すべてのアプローチを検討することしかできません行データが正しく入力されました。)



同時に、どういうわけかユーザーに彼が間違っていた場所を示したいと思います。 レーベンシュタイン距離を計算するために標準の二次アルゴリズムを実装する必要があり、さらにラインのエラーを強調するコードで補完する必要がありました-技術的には当初予想したほど簡単ではありませんでした。 (問題は、情報を保存する必要があることです。すでに各行のエラーの内側にいるかどうかです。)



第二に、私はギャップにそれほど厳しくないことを望みました。 多くのプログラマーは、コードにギャップを置くという原則が異なります。ある基準に従って厳密に最初からスペースを生徒に強制するのは望ましくありません。したがって、シミュレーターに存在または不在に関する特定の自由を許可します。 これを行うには、重要なスペースを重要でないスペースと区別できるようにする必要がありますが、シミュレーターをさまざまなプログラミング言語に対してユニバーサルにしたい場合(そしてもちろんこれが必要です)、ユニバーサルな正しいアプローチを実装することは困難です。



私は絶対的な正確さを犠牲にすることに決め、その左右両方がアルファベット文字(文字、数字、または下線)である場合、スペースを重要と見なし始めました。 より厳密には、連続したスペースのグループが使用され、その左右にアルファベット文字がある場合、このグループの最初のスペースが重要と見なされます。 もちろん、これは常に正しいとは言えません(基本的な反例は文字列定数内のスペースです)が、これは単純さ、普遍性、正確さの間の合理的な妥協です。 レーベンシュタイン距離に合わせてコードを少し調整し、厳密な愛好家のためにスイッチを追加する必要がありました。



結果は非常にうまくいき、子供たちは使用しています。 特別なマスターは、特定の行をクリップボードにコピーして入力フィールドに貼り付けることで、超高速を取得することを学びました-私はこの問題を解決する意味はないと判断しました、常にジョーカーがいますが、この問題は通常の学童を妨げません。



githubのコード: github.com/petr-kalinin/keyb

github.ioでライブ: petr-kalinin.github.io/keyb

(もちろん、そこの辞書は非常に単純です-非常に、非常に初期の学生のために。)



All Articles