やおよろず

ゆるふわな内容を書いても良い。と言うか何でも良い。そんな自由度の高いブログをめざします。

忘れたころに問題が出される単語カード的なアプリを作ろうとした件

この記事は 平穏な生活を送りたいぴょこりんクラスタ Advent Calendar 2022 の為に書いたものです。

はじめに

アドベントカレンダーという年越しを感じさせるタイミングでいうのもなんですが、歳はとりたくないものですね。

日頃の鍛錬が足らないだけという話でもあるんですが、
僕は数年前から記憶力や集中力や体力の低下をぼんやりと感じていて、
自身が感じるこの衰えとどうやって向き合っていくか悩むことがあります。
特に記憶力についてはかなり嫌な感情を抱いていて、
以前は何もせずに「昔そういう話があったなぁ」みたいに覚えていられたことは大抵忘れているようになりました。
もとから常識力も足らない方でちょっとしたことを知らずに恥ずかしい思いをすることもあるので、
最低限、恥をかくレベルのの知識は二度と忘れないようにちゃんと記憶にとどめておきたいものです。

そうはいっても、記憶力は衰えていくもの。結局、能力が下がるんだったら効率を上げていくしかないと思うんですよね。

学生時代を思い返すと単語帳をつくってひたすら見返しながら諸々と知識を頭に叩き込んでいたと思うんですが、
そのころから、ぼんやりと思っていたことがありました。

なんかこう、忘れかけたころに問題が出題されるようにならんかね?

という訳で、今回はそういう android アプリを作ってみました、というお話です。

作りたいもの概要

基本的にはオレオレ単語帳を作って色々覚えていきたいって話が本質なので、
アプリを作るところは今回やりたいことではないし、サクッと簡単に作れることを目指そうと思いました。

そもそも、多分こういうアプリって探せば普通に出てくると思うんですよね。
だからこそ手間はかけないでサクッとスマホアプリの味見もかねてできる、くらいがちょうどいいかなと考えています。

  • 特にほかの人の利用は考えていないが、デバッグモードとかでなく外でも利用できる形にしたい
  • spreadsheet に覚えたいことをまとめられるようなテーブルを作っておく
    • 項目追加はスプシに直接書けば良いのでアプリ側で編集機能をつくらない
  • アプリではスプシの内容を読み込んで問題・解答を操作に応じて表示するページが一つあればよい
  • ページ遷移は「覚えてる」「忘れた」ボタンを用意して、ボタンを押すと次の問題に移る
  • スプシに「次回出題日」を登録し、出題日を過ぎたやつだけ出題する
    • 次回出題日は正当回数に応じて期間が開いていく

これくらいできれば十分でしょう

デモ

という訳でこんなものができました

修行の余波で沖縄関係の用語が多いのはご愛敬。

問題はこんな感じでスプシに書いてあります

実装

github.com

実装にあたって、かつては react-native を使ったこともありましたが、今回は flutter を使いました。
理由は特にありません。最近使われてそうで自分の需要に見合いそうで使いやすそうなの、くらいのチョイスです。
あとは google spreadsheet ライブラリとかがあるかどうかとかも見たかも。忘れました。

google spread sheet の利用には gsheets | Dart Package をつかい、 問題と解答をくるくるするところは flip_card | Flutter Package を使っています。

次回出題時刻を「覚えていた」「忘れていた」で切り替えられるようにしており、
覚えていた場合は 1時間、 3 時間、10時間、1日、3日… と少しずつ出題間隔が伸びていきます。
忘れていた場合はまた同じ期間だけあけて再出題するようにしています。

苦労したこと

正直、実装についてはまぁ内容も軽微なので大して…という感じではありますが

  • デバッグモードではないけど、個人で利用する用途のためだけに android アプリをインストールして使うのってどうやるの? に「apk ファイル作って不明アプリインストール許可してインストールすればOK」 の解を得られず企画段階で停滞していた。
    • 基礎知識と検索・調査力が足らんかった。軽く調べる範囲だとマーケット審査に出す方法ばかり出てきてしまうのよね
  • 長期休暇に入った時に何度か実装しようとは思ったのだけど、なぜか手元の chrome だと Google Cloud Platform がうまく表示されなかったため、google sheets を利用するための認証情報を取る手順が進められずに長期間塩漬けになっていた
    • まさか google chromegoogle cloud platform の表示がおかしいとか思わなかったため、 edge で試すのがおくれた
  • google sheet からデータを引っ張ってくるところは非同期にやりたい…というところの実装は少しむずかしかった
    • Flutterで非同期をかっこよく扱う の FutureBuilder の使い方がたいへん参考になりました
    • なんとなく今でもこれでちゃんとできてるのか…? と思うことはある。さっきやった問題が表示されたりする気がする。でもまぁオレオレアプリだし多少のご愛敬は許せる

今後の課題

暇だったらやるかもしれないしやらないかもしれない

  • なんか画像とか表示できるようにしたら嬉しいけど難しそうだなぁ
  • スプシに文字入れすぎると文字サイズの都合で表示できなくなったりするのをうまくやりたい
  • ロードってこんなに遅いのか? という疑問があるため高速化できたらいいなぁ

感想

実装こそしたもの、 この記事を書く段になってようやくアプリをスマホにインストールした*1ので、運用はまだこれからです。
ただ、デバッグの過程でフジッリリガトーニとファルファッレとコンキリエを識別できるようになった*2ので、
うまく使えるといいなぁ、と思います。

*1:インストールしたら動かなくて笑った。https://minpro.net/socketexception-failed-host-lookup を見てすぐ解決したけど

*2:最近セブンのパスタコーナーでもショートパスタの名称をちゃんと言い分けるようになってきたけどみんなそんなに知ってるものなの?