※自分用のメモなので、適宜編集します
今日は日曜なので、実装の時間が若干は取れそうだ。
2014-04-10の仕様を変更する。
必要なテーブル
[LTUser] ユーザー
UserID
UserName
Password
[LTTable] テーブル名
TableID
TableName
TableType 出題フォーマット番号
[LTElement]問題
TableID
ElementID
Question 問題 XMLで書く
Answer 意味 XMLで書く
[LTLog]学習履歴
UserID
TableID
ElementID
Memory 記憶した程度を数値で記録 0:忘れた 1:なんとなく覚えている 2:覚えている
Flag 復習のためのフラグ 0:一度も解いていない 1:1回解いた 2:一週間後の復習をした
4:ニ週間後の復習をした 5:一か月後の復習をした
Count 解いた回数
Time 最後に解いた日付(年月日で十分)
[テーブル仕様について]
・仕様を作成しながら、これって別に言語の学習以外にも使えるよね、と思ったので、LTTable.TableTypeを追加し、この数字に対応してQuestionの解釈を変更できるようにする予定。例えば、いずれ囲碁も学習したいので、詰碁を登録してQuestionとAnswerでは画像を表示したい。このとき、表示を切り替える必要がある。汎用性を持たせるため、XMLで書く予定。TableTypeでCSSや表示方法を切り替えてはどうか。
・LTLogはUserID-TableID-ElementIDでユニークにして、更新していく形式をとる。問題と使用歴が多くなるにしたがってログが異様に多くなってしまうことを防ぐ。
[動作仕様案]
1)ログインして、UserIDを決定
2)テーブルを選択して、TableIDを決定
3)一定の法則に従い(後述)ElementIDを決定し、問題を出題 LTElement.Questionを表示する
4)「答えを見る」ボタンを押したらLTElement.Meaningを表示、記憶の度合いによって「覚えていない」「なんとなく覚えている」「覚えている」を押させる、押したらLTLogに記録する
5)問題登録画面では問題と解答をセットで入力させる
3a)「一定の法則」はサーバー側で記述する。これが一番肝の論理となる。
・2014-04-01の記事で書いたように、忘却曲線に対応した復習のタイミングに該当した問題を優先して出題する。
学習した翌日に一回目
その一週間後に二回目
二回目の復習から二週間後に三回目
三回目の復習から一ヵ月後に四回目
すなわち、
LTLog.Flag=1 かつ 現在時刻 – LtLog.Time>=1日 の問題
LTLog.Flag=2 かつ 現在時刻 – LtLog.Time>=7日 の問題
LTLog.Flag=3 かつ 現在時刻 – LtLog.Time>=14日 の問題
LTLog.Flag=4 かつ 現在時刻 – LtLog.Time>=1か月 の問題
の順で優先して出題する。
復習時に「覚えている」を押したらFlagをインクリメントする。「なんとなく覚えている」なら要復習なのでFlagはそのまま。「忘れた」なら復習のやり直し、Flagはデクリメントする。Flagは0にはしない。
・これらを使い切ったら、未出題の問題、すなわちLtLogテーブルにレコードが存在しないものを出題する。未出題の問題がなくなったら、ランダムに出題する。ランダムに出題した場合はFlagとTimeを更新しない。ただし、「忘れた」場合のみ、Flagをデクリメントする。
・Memoryはランダム出題の際の優先度として使用する予定。数字が少ない(忘れてる)ほど出題されやすくする。