- Hashcards は、ローカルファースト(local-first) 方式の 間隔反復学習(spaced repetition) アプリで、Anki や Mochi に似ているが、データベースの代わりにMarkdownファイルを使用する
- 各フラッシュカードはプレーンテキストで記述され、質問(Q)、回答(A)、クローズ削除(C) 形式をサポートし、FSRSアルゴリズムで復習スケジュールを管理する
- カードデータは テキストハッシュ値で識別され、復習履歴は SQLite に保存され、Gitリポジトリ を通じてバージョン管理と共有が可能
- 既存のAnkiの 複雑なインターフェース とMochiの 非効率なアルゴリズム の問題を解決するため、入力の摩擦を最小化し完全な所有権を目標に設計されている
- Markdownベース、Git統合、FSRSスケジューラ の組み合わせにより、開発者と学習者が 透明で自動化された学習管理 を行える新しいアプローチを提供する
Hashcards の概要
- Hashcards は ローカルで動作するオープンソースの間隔反復システム で、Anki や Mochi に似た学習体験を提供する
- 復習スケジュールは FSRS(Free Spaced Repetition Scheduler) アルゴリズムで管理される
- Webインターフェースは
localhost:8000 で動作し、復習履歴は SQLiteデータベース に保存される
- 中核的な差別化ポイントは データベースを使わず、各フラッシュカードを Markdownファイル として管理する構造にある
- 例:
Cards/Math.md, Cards/Chemistry.md などで構成
- 各ファイルには複数のQ/Aまたはクローズ削除(C)カードが含まれる
テキストベースのカード構造
- フラッシュカードはシンプルなテキスト形式で記述する
- Markdown構文 をそのまま活用できるため、通常のノート作成に近い体験を提供する
- 復習実行コマンドは
$ hashcards drill <path> 形式で実行する
設計思想と利点
- Hashcards の設計は 「摩擦のないカード作成」 を最優先の目標としている
- カードの入力と編集が速く直感的であるほど、学習量は増える
- 角括弧([]) の使用によりクローズ削除の入力を短縮できる(Shiftキー不要)
- Gitリポジトリとの統合 により、次のような利点がある
- バージョン管理、変更追跡、共同作業、公開共有が可能
- 標準的なUnixツール やスクリプトを使ってカードの検索・修正が可能
- CSVなどの構造化データ からカードを自動生成できる
- カードは テキストハッシュ値で識別 されるため、内容ベースの安定した参照が可能
既存システム(Anki, Mochi)への評価
- Anki
- 長所: オープンソース、FSRS対応、豊富な統計、自動カード生成(note types)機能
- 短所: 複雑で直感的でないインターフェース、WYSIWYG入力の非効率性、プラグイン依存
- Mochi
- 長所: すっきりしたUI、Markdownベースの入力、ショートカットキー中心の操作
- 短所: クローズ削除構文が冗長、note typesの不在、単純なアルゴリズム
- 従来のアルゴリズムは 単純な倍率ベース(multiplier) 方式で、長期記憶の維持には非効率
- 最近FSRSベータ対応が追加されたが、既存カードのスケジューリング問題は依然として残っている
Hashcards の実装とワークフロー
- ユーザーは テキストエディタ で直接カードを作成・修正できる
- 例:
Q: What is the atomic number of carbon? / A: 6
- 複数行カードや複雑な形式もMarkdown内で自然に表現できる
- 知識の変化に応じたカード修正 が容易
- 章ごとのMarkdownファイルで構成し、教材の構造と一致させられる
- 関連概念を隣接カードとして配置し、修正時の探索効率を高められる
- Gitベースの管理 により次の機能を活用できる
- コミット、ブランチ、マージ、PRなど完全なバージョン管理
- 公開リポジトリを通じた学習共有と共同作業が可能
テキストベースアプローチの相乗効果
- エディタマクロ によるカード自動生成と探索が可能
- Unixコマンド(wc, awk など) でカード統計や一括修正が可能
- スクリプトとMakefile を使って、CSVなどの外部データからカードを自動生成できる
- GitHubでの公開 により個人の学習過程を共有でき、学習文化の拡散に貢献する
結論
- Hashcards は シンプルなテキストフォーマット、高度なスケジューリングアルゴリズム(FSRS)、Git統合 を組み合わせた新しい形の間隔反復システム
- カード作成の摩擦を最小化 し、データの完全な所有権 を保証し、自動化と拡張性 を同時に提供する
- 開発者と学習者の双方に 透明で制御可能な学習環境 を提供するツールとして提示されている
1件のコメント
Hacker Newsのコメント
spaced repetition の本当の力は、フラッシュカードアプリではなく 行動変容 にあると思う。
例えば、妻が歯の問題で腹を立てた出来事をきっかけに、「感情的に共感し、十分に話を聞く」ことを習慣化するため、この状況を自分のSRSに入れた。
この復習は30秒ほどで済むので、生涯繰り返しても合計15分もかからないはず。
それ以来、同じ間違いを一度もしておらず、妻は私が完全に変わったと言っている。
要するに、spaced repetitionを「学習ツール」ではなく 構造化された強化システム として見るということ。
問題を解決せず、ただ共感だけすべきだなんて、自分の考え方とはまったく違う。
もし妻が先に共感なしで提案してきたら、君も腹が立っただろうか? そしてその時点でもう手遅れだっただろうか?
SRSに記録するとき、具体的な出来事を書くのか、それとも一般化したパターンを書くのか気になる。カードの表裏構造や cloze 形式があるのかも知りたい。
こういうプロジェクトをAnkiと比較するのは自然なことだが、Ankiへの批判のかなりの部分は 主観的だったり誇張されていたりする と感じる。
Ankiの 階層型デッキ構造 はむしろ強みであり、WYSIWYG編集も対象ユーザーにとっては当然の選択だ。
LaTeX数式も簡単に使え、プラグインは「ハック的だが便利な」エコシステムになっている。
いくつもの代替を試したが、結局またAnkiに戻ってくる。ターミナルベースのツールが好きな自分にとってさえ、それだけ機能的だ。
共感できるならプロジェクトを見ればいいし、そうでなければ無視すればいい。
カードが テキストのハッシュ値 で識別されるなら、タイプミスを直すたびにカードの復習履歴が消えてしまうのではないかと気になる。
spaced repetitionベースのソーシャルネットワーク が可能か気になる。
フィードで気に入った投稿を「復習予約」のようにマークすれば、それが一種のリツイートになって、継続的に価値のあるコンテンツ が広まるかもしれない。
私は knowledge base + spaced repetition プロジェクトを進めている。
Markdownファイルは本当に便利だ。どこでも見られて、Gitでバージョン管理でき、cross-linking も自由にできる。
プロジェクトリンク: https://github.com/odosui/mt
ローカルノートを維持したいのでクラウドベースのソリューションは避けていたが、MarkdownをAnki用にパースするツールがあると知った。
Emacsユーザー なら、plain textベースのspaced repetitionツールである org-drill を勧める。
私は Ankivalenz というライブラリを作った。構造化されたMarkdownをAnkiデッキに変換してくれる。
例えば
Path: Solar System > Planets > Colorのような階層構造をカードに含められるので、文脈のある復習 が可能になる。通常のノートとカードを同じMarkdownファイル内で共存させることもできる。
https://github.com/vangberg/ankivalenz/
他のSRSプロジェクトがAnkiからの データ取り込み(import) 機能をきちんと実装していないのは残念だ。
たいていのユーザーはすでにAnkiに数千枚のカードを持っているので、簡単には移行できない。
Ankiのデータ形式は複雑だが、SQLiteベースなので共有は可能だ。
Ankiの ノート–モデル–テンプレート構造 を理解して初めて、その精巧さに気づいた。
テキストベースの 共有可能なデッキフォーマット があれば、GitHubでの共同作業がずっとやりやすくなると思う。
各ノートを個別ファイルにして一意なIDを付ければ、更新管理もしやすくなるはずだ。
今ではコアロジックがRust crateとして分離されているので、同じDBをそのまま使って 代替フロントエンド を簡単に作れる。
私はデータ入力のために Googleスプレッドシート を使ったことがある。
UUIDで各行を一意に管理すれば、修正時にも追跡しやすい。
同じデータをもとに複数のデッキ(例: 中国語ピンイン→漢字、漢字→英語)を作ることもできる。
こうしたシートをテキストフォーマットでバックエンド化したインターフェースがあれば、本当に良さそうだ。
長年spaced repetitionを使ってきた立場から、いくつかコツを共有したい。
1️⃣ 何が重要かを決める 必要がある。些細な情報までカードにすると、毎日何百枚も復習することになる。
2️⃣ 重要な概念は、複数の角度から理解を試す 多様なカード で構成すべきだ。
3️⃣ 一定期間後には、二次カード や実際の応用へ移行すべきだ。1年間一度も使っていない概念なら、重要ではないのかもしれない。
結論として、spaced repetitionは非常に効率的な学習ツールだが、優先順位付けの失敗 が最大の落とし穴だ。