Introduction | 简体中文 |はじめに
ts-fsrsはTypeScriptに基づいた多機能なパッケージで、ESモジュール、CommonJS、UMDに対応しています。自由間隔重複スケジューラ(FSRS)アルゴリズム を実装しており、開発者がFSRSをフラッシュカードアプリケーションに統合することで、ユーザーの学習体験を向上させることができます。
ts-fsrsのワークフローについては、以下のリソースを参照してください。
- google driver: ts-fsrs-workflow.drawio (コメントを提供できます)
- github: ts-fsrs-workflow.drawio
[email protected]
はNode.js(>=16.0.0)で動作する必要があります。[email protected]
からは、最小必要なNode.jsバージョンは18.0.0です。
[email protected]
以降、ts-fsrsはCommonJS、ESM、UMDモジュールシステムをサポートしています。
npm install ts-fsrs
yarn install ts-fsrs
pnpm install ts-fsrs
bun install ts-fsrs
import {createEmptyCard, formatDate, fsrs, generatorParameters, Rating, Grades} from 'ts-fsrs';
const params = generatorParameters({ enable_fuzz: true, enable_short_term: false });
const f = fsrs(params);
const card = createEmptyCard(new Date('2022-2-1 10:00:00'));// createEmptyCard();
const now = new Date('2022-2-2 10:00:00');// new Date();
const scheduling_cards = f.repeat(card, now);
// console.log(scheduling_cards);
for (const item of scheduling_cards) {
// grades = [Rating.Again, Rating.Hard, Rating.Good, Rating.Easy]
const grade = item.log.rating
const { log, card } = item;
console.group(`${Rating[grade]}`);
console.table({
[`card_${Rating[grade]}`]: {
...card,
due: formatDate(card.due),
last_review: formatDate(card.last_review as Date),
},
});
console.table({
[`log_${Rating[grade]}`]: {
...log,
review: formatDate(log.review),
},
});
console.groupEnd();
console.log('----------------------------------------------------------------');
}
もっと:
- 参考資料- Github Pages
- 参考スケジューラ - Github Pages
- ブラウザで使い方 (CDNを使用して ts-fsrs ESM パッケージにアクセスする)
- 実際のケース - Next.js+Prismaを利用する
- モダンなフラッシュカード - Next.jsやtRPCなど技術を利用している
まずは、空ぽっいカードインスタンスを作成して、現在の日付を設定します(デフォルトはシステムの現在時刻):
import {Card, createEmptyCard} from "ts-fsrs";
let card: Card = createEmptyCard();
// createEmptyCard(new Date('2022-2-1 10:00:00'));
// createEmptyCard(new Date(Date.UTC(2023, 9, 18, 14, 32, 3, 370)));
// createEmptyCard(new Date('2023-09-18T14:32:03.370Z'));
このts-fsrsライブラリは、カスタムSRSパラメータを許可します。generatorParameters
を使用して、SRSアルゴリズムの最終パラメータセットを生成します。以下は、最大間隔を設定する例です:
import {Card, createEmptyCard, generatorParameters, FSRSParameters} from "ts-fsrs";
let card: Card = createEmptyCard();
const params: FSRSParameters = generatorParameters({maximum_interval: 1000});
核心機能は「fsrs
」関数にあります。このrepeat
関数を呼び出すと、異なるユーザー評価に基づいて、カードセットのスケジュール結果が返されます。
import {
Card,
createEmptyCard,
generatorParameters,
FSRSParameters,
FSRS,
RecordLog,
} from "ts-fsrs";
let card: Card = createEmptyCard();
const f: FSRS = new FSRS(); // or const f: FSRS = fsrs(params);
let scheduling_cards: RecordLog = f.repeat(card, new Date());
// もしくは、開発者が評価を指定する場合:(TS-FSRSのバージョンは4.0.0以降である必要があります)
// let scheduling_cards: RecordLog = f.repeat(card, new Date(), Rating.Good);
scheduling_cardsオブジェクトがあると、ユーザーの評価に基づいてカードを取得できます。例えば、Good
評価でスケジュールされたカードにアクセスするには:
const good: RecordLogItem = scheduling_cards[Rating.Good];
const newCard: Card = good.card;
もちろん、各評価に対応するカードの新しい状態と履歴を取得できます:
scheduling_cards[Rating.Again].card
scheduling_cards[Rating.Again].log
scheduling_cards[Rating.Hard].card
scheduling_cards[Rating.Hard].log
scheduling_cards[Rating.Good].card
scheduling_cards[Rating.Good].log
scheduling_cards[Rating.Easy].card
scheduling_cards[Rating.Easy].log
それぞれのCard
オブジェクトは、その状態、スケジュール、その他の指標を決定するさまざまな属性を含んでいます:
type Card = {
due: Date; // カードの次のレビュー日
stability: number; // 記憶の安定性
difficulty: number; // カードの難易度
elapsed_days: number; // 前回のレビューからの日数
scheduled_days: number; // 次のレビューの間隔日数
reps: number; // カードのレビュー回数
lapses: number; // カードが忘れられたか、間違って覚えられた回数
state: State; // カードの現在の状態(新しいカード、学習中、レビュー中、再学習中)
last_review?: Date; // 最近のレビュー日(適用される場合)
};
それぞれのReviewLog
オブジェクトは、そのカードに関連するレビュー記録情報を決定するさまざまな属性を含んでいます。分析、今回のレビューをやり直す、最適化(作成中):
type ReviewLog = {
rating: Rating; // レビューの評価(手動変更、やり直し、難しい、良い、簡単)
state: State; // レビューの状態(新しいカード、学習中、レビュー中、再学習中)
due: Date; // レビューの次の日付
stability: number; // レビュー前の記憶の安定性
difficulty: number; // レビュー前のカードの難易度
elapsed_days: number; // 前回のレビューからの日数
last_elapsed_days: number; // 前回のレビューの間隔日数
scheduled_days: number; // 次のレビューの間隔日数
review: Date; // レビュー日
}