ankiのデータを見ていく
はじめに
このブログは個人的なプログラミング学習の備忘録として使っていきたいと思います。
プログラミングは1週間ほど前に始めたばかりなので手探りです。
当面の目標としてankiみたいなソフトを作ってみることを目指してみます。
ankiというのは記憶補助アプリケーションで、いわゆる暗記カードを、忘却曲線に従って出題することで、効率的な学習を可能としています。
導入はこちら:
http://rs.luminousspice.com/how-to-anki/
僕もこのアプリケーションを愛用しており、英単語や雑学などをデッキに入れているのですが、より自分用にカスタマイズしたいと考えてみました
データの保存場所等
まずデータはユーザー名/AppData/Roaming/Anki2/(Ankiのユーザー名)に保存されています。以下のようなファイル構造になっています。
collection.mediaは画像・音声などのメディアが、backupsはそのとおりバックアップが保存されているフォルダです。
データベースが保存されているのがcollection.anki2です。
collection.anki2はSQLite3形式のデータベースファイルなので、適切なソフト(pupsqliteなど)で内部を閲覧することができます。
(また、backupsの中にあるファイルはzip圧縮されたanki2ファイルです。backupsにおけるデータベースはcolpkg形式、ankiのエクスポート機能を用いて生成されたデータベースはapkg形式ですが、どちらもzip解凍が可能です。)
データベースの内容
で、データベースを見ていくわけですが、以下のようなテーブルがあると思います。
で、テーブルを開いていくと、どうやらnotesにノートがあることはわかりますが、それ以外はさっぱりなのでgithubを参照します。
https://github.com/ankidroid/Anki-Android/wiki/Database-Structure
ここのdatabase schemaにデータベースの説明が書かれています。
とりあえず上から見ていくと、cardsの上3つ、id,nid,didはカード作成時の時間から生成されたid,ノートID、デッキIDのようです。
ankiのシステムについて
このIDを説明する前にankiのシステムについて説明しておきます。
まず、ユーザーは「デッキ」を選択し、表示された「カード」に対して覚えている/いないの選択をします。それにより、そのカードの次回出現までの間隔がソフトによって自動で計算されます。
一方、ユーザーはカードを作成することもできます。この場合、まずデッキを選択(または作成)し、「ノートタイプ」を選択し、フィールドにパラメータを入力し、追加することでカードが作成されます。
そして選択したノートタイプによっては、一つのフィールド追加で2枚以上のカードが作成されるものもあります。例えば、漢字の読みを覚えたい場合、
表面:(漢字) 裏面:読み
というカードを作成しますが、そのあとで漢字の書きを覚えたい場合、いちいち
表面:読み 裏面:(漢字)
のカードを作成するのは面倒です。この場合、ankiはそのカードが使用しているカードのノートタイプを編集し、表面と裏面のフィールドを入れ替えたノートタイプを追加することで一気に作成することができます。
id,nid,did...
以上の説明より、個別のカードに対応するのがid,のちに出てくるnotesテーブルのidに対応するのがnid(つまり個別のfieldのセットに対応するものです),そのカードが所属するデッキに対応するのがdidということになります。
つづいてordはノートタイプ編集画面の
カードタイプが複数存在する場合、その順番に割り振られた番号を表しています。
modはカードが編集された時間、usnは同期時に更新する必要があるか、等等。
以上のように、cardsテーブルはカードの属性を格納しているようです。
colテーブルは、コレクションに関するデータを格納しています。
gravesは削除カードを格納しているようです。
notesはid,syncの時に使うグローバルID、モデルID(mid)、編集時刻modなどに続いて存在する、fldsがフィールドを保存しています。複数のフィールドが存在する場合は、
0x1f (31)
で区切っているようです。
revlogはレビューログ、つまり復習記録です。すべてのレビューデータを保存していることがankiの長所です。
ここまでで、カードに関する大体のデータとその保存場所はわかりましたが、ノートタイプはどこに…と探していくと、どうやらcolテーブルのmodelに格納されているようです。
modelid(cardsテーブルのmid)やtmpls(ノートタイプのテンプレート)が確認できます。
まだどのデータを使うかは決めてないので、とりあえず今回はここまで。