iTrace 文字はどのように綴られますか?

このアプリは何ですか?



iTraceは、子供たちに手紙を書くように教えるためのモバイルアプリケーションです。 iPadの電子処方箋。 現在では、子どもたちに書くことを教えるために、世界中のいくつかの国(主に米国)で使用されています。 Misha Bogoradがプロジェクトのすべての作業を思いつき、整理しました。私はたまたま、あらゆる種類の内部の開発者としてプロジェクトに参加しました。



アイデア、複雑さ



iTraceの考え方は、通常の言葉と変わりません。 私たちは手紙を受け取り、子供にそれを描くよう頼み、それが彼にとって難しいかどうかを提案します。 最初は文字が大きく、大きな間違いを犯す可能性がありますが、その後、文字は小さくなり、許容誤差もますます小さくなります。 最後に、子供は、習慣のおかげで、手紙の綴りを覚えています。

画像



記事では、私が直面しなければならなかった困難とそれらがどのように解決されたかについて話します。 トピックが興味深い場合は、技術的な部分についてのコメントで質問してください、私はより詳細に伝えることができます。



組織上の困難(賞品やアニメーション用に数千枚の絵を描く、方法論の実行に役立つトレーニングスペシャリストを見つける、アプリケーションの音楽や音声の場所を理解するなど)に加えて、技術的な問題もありました。 3つの主なものは、古いデバイスで作業するための最適化、さまざまな太さの文字のレンダリング、および子供による文字入力の品質管理です。



最適化



最適化タスクは、アプリケーションの対象者から生まれました。 子供たちはしばしば古いiPad、特に最初のiPadを使用します。 これは最速のデバイスではなく、メモリ容量も最大ではありません。 アニメーションの操作方法、古いハードウェアで動作するために必要なサイズ、1秒あたりのフレーム数などを把握する必要がありました。

画像



また、アプリケーションのリソースを使用して作業を最適化する必要がありました。 バンドルに入れて、そこにあるものをすべて最適化するだけでいいように思えますが、残念です。 まず、リソース自体が大きい。 最適化プログラムを実行し、どのフォーマットが最小であるかを分析し、最適なものを選択するために、各写真を撮りました。 これは、プロジェクトのビルドシステムによって部分的に行われますが、自分で制御する方が適切です。 第二に、テストビルドのインストール(およびその結果、iPadへのアプリケーションのインストール)には膨大な時間がかかりました。 これらのプロセスは両方ともファイルのコピーと展開に関連しており、ファイル数が数千になると、プロセスにかなりの時間がかかる場合があります。 私が最初のiPadを最初に思い出したのは、何のためでもありませんでした。 このデバイスにテストバージョンをインストールするのに約10分かかりました。



この瞬間、私はパックファイルについて思い出しました。 これは、非常に多くのテクスチャがあるゲームで長い間使用されてきた手法です。 すべてのファイルは1つのファイルにまとめられ、その作業を非常に効率的に整理できます(マップなど)。 独自の形式を思いつくことができましたが、圧縮せずにzipを試すことに成功し、テストでは、ファイルに直接アクセスするのとほぼ同じ速度でした。



少し気になった唯一の問題は、zipファイルにファイルへのランダムアクセスがなかったことでした。そのため、ファイルの場所名を照合するための独自のテーブルを作成する必要がありました。



{"Levels":{"":[3149,48427877],"iphone_cursive_word_levels.csv":[3153,48428251],"iphone_cursive_levels.csv":[3152,48428149],"iphone_regular_levels.csv":[3154,48428358],"regular_word_levels.csv":[3157,48428662],"save_before_rollback.zip":[3158,48428762] ...
      
      





その後、ダウンロード速度(アプリケーションの起動時にキャッシュされます)に応じて、メモリからわずかに最適化し(多数のファイルの場合はかなりの場所を占めます)、その後、アプリケーションは20〜40秒でインストールされ始めました。



DPLPackerのコードは、 https//github.com/bealex/DPLPackerで確認できますまた、パックの最も簡単な作業は次のようになります。



ファイルを作成する



 _zipFile = [[DPLZipFile alloc] initWithZipFile:_zipFilePath];
      
      





ファイルがアーカイブにあることを確認し、(パスと名前で)取得します。



 NSData *data = nil; if ([_zipFile fileExistsForPath:filePath]) { data = [_zipFile dataForPath:filePath]; } return data;
      
      





@ 2x-picturesをパックする場合は、それらを慎重に処理することを忘れないでください。 通常のファイルとは異なり、システムは必要なバージョンをダウンロードしません。



 - (UIImage *)imageAtPath:(NSString *)filePath { CGFloat scale = 1; if (DPL_isRetina()) { if (![filePath contains:@"@2x"]) { NSString *filePath2x = [filePath stringByReplacingOccurrencesOfString:@".png" withString:@"@2x.png"]; if ([self fileExistsAtPath:filePath2x]) { filePath = filePath2x; if (DPL_isIPad()) { scale = 2; } else { scale = 1; } } } else { scale = 2; } } else { if (![filePath contains:@"@2x"] && ![self fileExistsAtPath:filePath]) { NSString *filePath2x = [filePath stringByReplacingOccurrencesOfString:@".png" withString:@"@2x.png"]; if ([self fileExistsAtPath:filePath2x]) { filePath = filePath2x; scale = 2; } } else { scale = 1; } } NSData *data = [self dataWithContentsOfFile:filePath]; if (fabs(scale - 1) > 0.01) { if (DPL_OSVersionMajor() >= 6) { return [UIImage imageWithData:data scale:scale]; } else { return [UIImage imageWithCGImage:[UIImage imageWithData:data].CGImage scale:scale orientation:UIImageOrientationUp]; } } return [UIImage imageWithData:data]; }
      
      





この曲線はどのように曲線ですか?



子供に手紙の書き方を教える他のすべてのアプリケーションでは、学習自体は行われません。 子どもは手紙がどのように書かれるべきかを単に示され、そして彼は彼が望むようにそれを描くことができる。 フィードバックはなく、正確さを確認する方法もありません。必要に応じて修正してください。 なぜこれが重要なのですか? 特定の方法で教える学校があるためです(米国では、文字を書くための3つの基本オプションに加えて、斜体、右手/左手のオプション、異なる学校間の小さな違いがあります)。

画像



子供がアプリケーションで「とにかく」書くことを学ぶならば、彼は再学習しなければなりません。 それは難しく、痛みを伴い、不快です。



したがって、実装したい主な機能はスペルチェックでした。 子供が間違った場所に行を取った場合、すぐにそこにいないことを彼に伝える必要があります。 最初から始めていない場合は、どこにあるのかを教えてください。 この問題を解決する必要がありました。

画像



複雑さは2つの部分で構成されていました。 1つ目は、処理を迅速にする方法です。 古い、最初のiPadであっても、文字の描画を大幅に遅らせるべきではありません。 2番目は、子供が「間違った」ことをどのように判断するかです。 iTraceがキャッチするエラーの例を次に示します。



 IWTaskErrorCodeErrorTooBig = 1, //     IWTaskErrorCodeLineExitedCorridor = 2, //    IWTaskErrorCodeCornerDrawingDistanceWrong = 3, //    ""  IWTaskErrorCodeStraightLineDrawingDistanceWrong = 4, //     IWTaskErrorCodeCornerDoubleEnter = 5, //      IWTaskErrorCodeLineNotCovered = 6, //        IWTaskErrorCodeWrongStart = 7, //     (  -  —  ,      ,      ) IWTaskErrorCodeTooOverextended = 8 //    . , ,  ,   ,     .    —      () ,       ,              —      .
      
      





最初の部分は、比較的普通のトリックによって決定されました。 最初は、高レベルの構造(Objective-Cクラス、そこからのコレクション)を使用してすべてのアルゴリズムを実装しましたが、プロファイラーでの作業に時間がかかりすぎていることを確認しました(NSNumberからのボックス化/ボックス化解除の数値まで)、通常のCに切り替えました構造。 その後、彼はいくつかのキャッシュを導入して、描かれた線の終わりだけを数え上げ、すべてではありません。 これにより、長い線を描くときにブレーキを取り外し、目的のパフォーマンスを実現できました。



「子供が間違ったこと」を判断する主なタスクは、「間違った」内容を判断することでした。 間違いは何ですか? いくつかを強調しました。





その後、これらすべてのエラーを形式化する方法を見つけようとしました。 完全な線と描かれた線を比較する必要があることは明らかです。 それらを小さなセグメントに分割し、それらを比較し、累積エラーを累積する必要があることは明らかです。 難易度は隅にありました。 それらはまったく捨てることができず、角は手紙の重要な部分です。 しかし、それらのエラーは非常に簡単かつ迅速に蓄積されます。



2か月間の試行錯誤の後、次のような結果が得られました。





画像は角度(大きな円)を示しています。 SVG形式で指定された曲線に従って、自動的に検索されます。



ロシア語



アプリケーションを異なる言語にローカライズする必要があると想定するのは論理的でした。 しかし、それはどの言語になるのか、開始直後にそれを行うときは明確ではありませんでした。 そして、開発は他の言語に関係なく行われました。



希望と機会がロシア語をサポートするように見えたとき、これは完全に単純ではないことが判明しました。



まず、インターフェースを翻訳する必要があります。 さらに、インターフェースをシステムの言語に関連付ける必要がある場合、命令の言語は異なる場合があります。 それらを切り替えることができる必要があります。 そして、インターフェースのどこにでも長いロシア人をフィットさせる必要があります。



第二に、使用した美しいフォントにはロシア文字が含まれていませんでした。 フォントの改訂版を注文する必要がありました。



第三に、より多くの写真を撮りました。 ロシア語には、より多くの手紙、より多くの演習があります。 写真に加えて、新しい吹き替えも必要でした。



第4に、文字を操作するためのアルゴリズムを改良する必要がありました。 ダイアクリティックス(「d」、「e」)、小さなストローク(「c」または「u」)-これらはすべて、描画の品質を制御するアルゴリズムを複雑にしました。



ファイルへのリソースのパッキングは非常に便利でした。 このようなパッケージをいくつか作成し、これらのファイルを切り替えると、言語を切り替えることが非常に便利であることがわかりました。



ささいなこと



もちろん、開発にはささいなことがたくさんありました。 たとえば、iTraceは「実際の」紙、紙を印刷できます。 子どもたちにもっと興味を持たせるために、各レシピの下部に迷路が描かれています。 それは新たに作成されるたびに生成されます。子供たちが興味を持ち、あまり単純/難しくないようにパラメータを選択するのは面白かったです。

画像



アップグレードに問題がありました。 たとえば、親ゲート(子供ではなく親がアプリケーション設定を入力する特別なタスク)のTouch IDを初めて有効にしようとしたとき、「いいえ」と言って拒否されました。 Appleの担当者と話をして、Touch IDを操作するためのより正確なアルゴリズムを考え出した後、機能が受け入れられました。



また、無料版の中でどのように購入するのかすぐにはわかりませんでした。 最初は、小さな機能をそれぞれ購入したかったのですが、話し合いの結果、「すべてのため」に1つだけ購入することにしました。



文字自体を描くのは面白かったです。 彼らはたくさんの場所で、そしてダッシュで、ダッシュで、そして描画画面でさまざまな太さで、そして歴史で、あなたはエラーとともに文字を描く試みを見ることができます...彼らの要件、彼らの困難があるところはどこでも。



結果は素晴らしいアプリケーションです。 ご覧ください。 無料のバージョンがあり、内部に購入があり、有料のものがあります。 すでに35万人以上が見ていますが、多くの人が気に入っています。 :-)




All Articles