Invalid Date
開発者ブログ: 日本語学習アプリの機能改善とトラブルシューティングの記録
はじめに
このブログ記事では、日本語学習アプリの機能改善と、それに伴って発生した様々な技術的な課題、そしてその解決プロセスについて記録します。特に、介護福祉士試験対策クイズの機能強化と、選択肢のふりがな・翻訳機能の実装に焦点を当てます。
1. 介護福祉士試験対策クイズの不具合修正
当初、ユーザーから「介護福祉士試験対策クイズでコースを選択しても、クイズが開始されない」という報告がありました。この問題は複数の要因が絡み合っていました。
1.1. QuizScreen.kt のクイズデータ読み込みロジックの修正
- 問題点:
QuizScreen.kt内のクイズデータ読み込み部分 (when式) に、同じquizTypeに対する重複した分岐が存在していました。また、sliceメソッドの使用方法に誤りがあり、リストの範囲外アクセスによるクラッシュが発生していました。 - 解決策: 重複する分岐を整理し、
sliceの範囲を修正しました。特に、テスト用に問題数を一時的に減らした際に発生したIndexOutOfBoundsExceptionに対応するため、sliceを使わずにkaigoNoKihonQuizData全体を読み込むように変更しました。
1.2. QuizActivity.kt の UI 表示問題
- 問題点:
QuizActivity.ktのonCreateメソッド内で、UI を設定するsetContentブロックがコメントアウトされていました。これにより、アクティビティが起動しても画面が真っ白になる現象が発生していました。 - 解決策:
setContentブロックのコメントを解除し、QuizScreenコンポーザブルが正しく呼び出されるように修正しました。また、QuizScreenに必要なquizTypeやuserNameなどのデータがIntentから正しく渡されるようにしました。
1.3. MainScreen.kt の quizType 渡し方の問題
- 問題点: コース選択画面 (
MainScreen.kt) からQuizActivityへquizTypeを渡す際に、kaigo_kihon_1のような具体的なコース名が正しく認識されず、クイズが開始されない問題がありました。 - 解決策:
MainScreen.ktのDisplaySubCategoryButtonWithScore内のwhen式を修正し、kaigo_kihon_1からkaigo_kihon_5までの各コースが正しくquizTypeを渡せるようにしました。
2. 選択肢のふりがな・翻訳機能の実装
ユーザーからの要望を受け、クイズの選択肢を長押しすることで「日本語」→「ふりがな」→「翻訳」と表示を切り替える機能の実装に着手しました。
2.1. データ構造の変更と UI の実装
- 問題点: 既存の
QuizDataクラスでは、選択肢のふりがなや翻訳結果を保持するフィールドがありませんでした。また、長押しジェスチャーの検出と表示切り替えのロジックの実装が必要でした。 - 解決策:
QuizScreen.kt内に、表示用のデータクラスDisplayChoiceを定義しました。これにはtext、furigana(MutableState)、translatedText(MutableState)、displayState(MutableState) が含まれます。QuizScreenでクイズデータを読み込む際に、List<String>のchoicesをList<DisplayChoice>に変換するようにしました。- 選択肢の
ButtonをBoxに置き換え、pointerInputとdetectTapGesturesを使用して長押しジェスチャーを検出するようにしました。 - 長押しされるたびに
displayStateをNORMAL→FURIGANA→TRANSLATED→NORMALと切り替え、それに応じて表示テキストを更新するようにしました。
2.2. ふりがな API との連携
ふりがなを取得するため、外部 API との連携が必要でした。
2.2.1. Yahoo! ルビ振り API との格闘
- 問題点: 当初、Yahoo! ルビ振り API v2 を利用しようとしましたが、
401 Unauthorizedエラーが解決しませんでした。Client ID の渡し方、local.propertiesの記述、build.gradle.ktsのbuildConfigFieldの設定など、様々な要因でビルドエラーや認証エラーが発生し、多くの時間を費やしました。特に、local.propertiesのパスのエスケープや、buildConfigFieldの文字列リテラルのエスケープには苦戦しました。 - 解決策: 最終的に、Client ID の渡し方や
build.gradle.ktsの設定は正しい形に修正できましたが、API 側での認証の問題が解決しなかったため、別の API を試すことにしました。
2.2.2. FastMikannAPI への切り替え
- 問題点: Yahoo! API の問題が解決しないため、無料で利用できる『FastMikannAPI』に切り替えました。しかし、FastMikannAPI のエンドポイント URL やリクエスト形式が不明でした。
- 解決策:
- GitHub リポジトリの
main.pyやapi/ruby.pyの内容を調査し、FastMikannAPI のエンドポイントがhttps://fast-mikann-api.vercel.app/ruby/{sentence}であること、リクエストが GET 形式であること、レスポンスが HTML 形式であることを特定しました。 FuriganaConverter.ktを修正し、FastMikannAPI の仕様に合わせて API_URL、リクエストメソッド、リクエストボディ、レスポンスパースのロジックを全面的に書き換えました。
- GitHub リポジトリの
3. ビルド環境のトラブルシューティング
機能実装の過程で、Gradle のビルド環境に関する様々な問題に直面しました。
- 問題点:
local.propertiesのsdk.dirパスのエスケープ問題。build.gradle.ktsのbuildConfigFieldの文字列リテラルエスケープ問題。app/build.gradle.ktsに追加したgetLocalProperty関数のUnresolved referenceエラー。QuizScreen.ktのメソッドサイズがコンパイラの命令数制限を超える問題。
- 解決策:
local.propertiesのパスはスラッシュ区切りに統一することで解決しました。build.gradle.ktsのbuildConfigFieldのエスケープは、"${...}"の形式で正しく記述することで解決しました。getLocalProperty関数は、build.gradle.ktsの標準的なプロパティ読み込み方法に切り替えることで不要となり、削除しました。QuizScreen.ktのメソッドサイズ問題は、Boxを使ったカスタムボタン実装に切り替えることで、イベント処理の競合を解消し、コードの複雑さを軽減しました。
まとめ
本プロジェクトでは、日本語学習アプリのクイズ機能改善と、ふりがな・翻訳機能の実装を通じて、多くの技術的課題に直面しました。特に、外部 API との連携における認証問題や、Gradle ビルド環境の細かな設定、Compose UI のイベント処理など、多岐にわたるトラブルシューティングを行いました。
これらの経験は、今後の開発において貴重な知見となるでしょう。