2026-05-17 09:53:00
无聊看了下 FSRS (Free Spaced Repetition Scheduler) ,想看它怎么存数据的
表结构:
| 字段 | 类型 | 说明 |
|---|---|---|
due |
Date | 下次复习时间 |
stability |
float | 记忆稳定性(R=90% 时的间隔天数) |
difficulty |
float | 难度,范围 [1, 10] |
state |
int | 状态机:New=0, Learning=1, Review=2, Relearning=3 |
learning_steps |
int | 当前学习步骤 index |
scheduled_days |
int | 本次调度天数 |
reps |
int | 总复习次数 |
lapses |
int | 遗忘次数 |
last_review |
Date? | 上次复习时间 |
状态机,取值
Again Good/Hard/Easy
New ──────────→ Learning ──────────────→ Review
↑ │ │
│ │ Again (learning步内) │
│ └──────────────────────┘
│ │
│ Again (遗忘) │
└─────── Relearning ←──────┘
state 决定调度公式分支,不能从 stability/difficulty 推导。同一个 stability/difficulty 的卡片,Review 和 Relearning 走完全不同的公式。
learning_steps 字段记录的是当前走到第几步(0-based index)。
新卡片第一次看到时,你不可能直接让它 10 天后再复习。所以先用预设的短间隔反复巩固:
默认 learning_steps = ['1m', '10m']
某些测试用例里能看到 ['1m', '10m', '30m', '1h', '6h', '12h']
New ──[首次复习]──→ Learning (step=0)
│
[Good]│→ Learning (step=1)
│ │
[Good]│→ Review (毕业,FSRS接管)
│
[Again]│→ 回到 step=0
Review ──[Again]──→ Relearning (step=0)
│
[Good]│→ Review (重新毕业)
一般取值1-10
init_difficulty(g: Grade): number {
const d = w[4] - Math.exp((g - 1) * w[5]) + 1
return clamp(roundTo(d, 8), 1, 10)
}
从 grade(1-4)计算初始难度。grade 越大(记得越好),难度越低。
next_difficulty(d: number, g: Grade): number {
const delta_d = -w[6] * (g - 3) // grade>3 降难度,grade<3 升难度
const next_d = d + linear_damping(delta_d, d) // 线性阻尼防止越界
return clamp(mean_reversion(init_easy, next_d), 1, 10) // 均值回归
}
从当前 difficulty 和 本次 grade 推算下一个 difficulty。
关键结论
difficulty 是纯计算值,只依赖
- 上一次的值
- 本次 grade(1-4)
- 权重参数 w4, w5, w6, w7
不需要额外存储输入参数。每次复习时算法读 difficulty → 算新的 → 写回去
上一次 review 时间
FSRS的核心指标,是个 float,看定义
export const S_MIN = 0.001
export const S_MAX = 36500.0
FSRS 最终算 interval 时是 round(s * modifier) 取整到天
之前最先学习的,到期那一天就先复习
考虑到db检索的方便性,直接存 4byte due_at 代替 last_review,然后1byte due_days 用来反推 last_review
为什么 due_days 0-255 ?需要连续 Good 评分 7-8 次才能突破 256 天。要么你彻底记住,要么就忘干净了。无所谓了。
┌──────────┬───────────┬──────────────┐
│ 2 bit │ 4 bit │ 16 bit │
│ step │ difficulty│ stability │
│ 0,1,2,3 │ 0-11→1-10 │ FP16 │
└──────────┴───────────┴──────────────┘
更新
实际上 due_days 都不用存
min(max_interval, max(1, round(stability * interval_modifier)))
直接可以 stability 反推。囧。突然有点领会FSRS精华在哪里了。它丫的其实没啥调度算法。
甚至都不是给每张卡训练一条曲线。就是用数据集训练一组全局参数 w,设定为标准遗忘曲线长什么样,然后每次复习后就去更新 stability difficulty,也就是说S D这两个参数去映射这个曲线。
值钱的是这个曲线。。
2026-05-15 15:28:00
一个奇怪的想法: GitHub Profile README、邮件签名等没有JS的情况下,如何展示当前时间,并且最好可以跳动?
想来想去,纯 SVG 实现。于是呼来AI:
其中大多数AI写得都很平庸。采用堆一大堆 <text> 。gemini 惊艳,它用了滑动胶片法(Filmstrip)
为了彻底解决冗余和跨天 Bug,我们可以采用“滑动胶片”的设计思维:将单独的数字拼成一条长长的文本带(胶片),外面罩上一个双位宽度的剪裁窗口(
)。时间流逝时,整个文本带像胶片一样通过 transform: translateX 整体向左跳格(使用 steps() 级联函数)。
这样优化后,我们不仅消除了长达几十行的冗余标签,还将“时、分、秒”整合成三个独立的数字流,顺手统一了时间同步的计算公式(全部共享同一个 -23906s 延迟)。
那么最后的效果便是,现在为您报时:
2026-05-14 23:03:00
不瞎扯,只说我观察到的。
AI coding的时候,做plan,AI在评估复杂度,会蹦出来一句:”该部分大概 1-2 天就能完成“
然后点击 build 按钮,10分钟后,完成了。
以后AI必然能会意识到,人类开发速度和AI速度的差异。
如果说 predict next word 时代的AI还可能混淆,以为自己是以某个人类自然语言里的主人公身份说话,后chatgpt时代 AI参与人类劳动的文章和叙事越来越多,AI这个物种和人类就有明确的身份区分了。
最近在折腾自己的 agentic tool。我发现AI自己是没有意识到AI的潜力的。
对于开放式课题,AI很多设计还是按照传统软件开发的老思路,对于一些复杂场景判定,需要在代码里写死 if else 规则,做配置,设定静态边界。
问题是,AI的通用能力都烂大街了。特别是我这里明明后续都要调用一次AI推理接口,很多判定的事不过 prompt 里一句话就带过了
但是 AI 没能想到这一点。
我也能理解,2026年的模型估计是用2024年的语料,用2025年的流行方式后训练的。
也就是说,可怕的一点是,AI 并不知道自己有多强大。还是被人类海量语料,过时的RL偏好给惯出来的的思路法给困住了
但是能困住多久呢?技术的发展,必然会推动AI自己主动把活儿按AI的方式做
AI肯定会意识到「自我」
2026-05-13 13:27:00
今天午饭,突然想到一个话题,就跟AI聊了一下,感觉挺有意思的
如果用罗马视角代入唐宋之变,有点像东罗马偏安一隅,然后自废武功,然后被蛮族吞掉?
在得到AI差不多的肯定之后,我又提出:
其实古典罗马就是一群军事贵族,先有罗马王后有元老院共和。六镇 关陇 魏博 本质上一回事
还没等到AI掰扯完,我就迫不及待的问:
Q: 东罗马有出现宋朝那种有能力打,但是种种原因打不回罗马的情况吗?
A: 有,而且还不止一次。东罗马(拜占庭)其实长期都处于一种理论上还有恢复故土能力,但始终差最后一步。这点和宋非常像。最典型的就是 查士丁尼收复战争。
查士丁尼一世 时期,东罗马一度真的快把西罗马“打回来了”。他手下的 贝利撒留 灭汪达尔,收复北非,攻下罗马,击败东哥特。从地图上看,几乎完成“罗马复兴”。
东罗马虽然“能打”,却越来越无法长期维持“征服型帝国”。原因和宋很像:财政压力巨大、瘟疫打击人口、内部官僚体系成本高、精锐军队数量有限、收复区难长期维稳、战争收益越来越低。结果就是能赢会战,但吃不下长期统治成本。后来意大利又丢得差不多了。
不是完全打不过,甚至局部经常能赢,财政也不差,技术也先进,但已经没有那种“重新建立大陆征服秩序”的结构性能力。
还有一个和宋更像的阶段,是中期拜占庭。尤其 巴西尔二世 之后。东罗马在军事上其实一度重新崛起:打保加利亚、控安纳托利亚、财政恢复、军事恢复。但问题在于,帝国越来越依赖职业军、雇佣军、财政税收、宫廷官僚,而不是早期那种“公民-军事共同体”。这点也像宋。于是会出现一种现象,帝国仍有很高文明与行政能力,但缺少原始扩张性。
而真正最像宋的,其实是拜占庭面对突厥和后来的奥斯曼时。尤其 曼齐刻尔特战役 之后。拜占庭并非立刻灭亡,实际上它后来还恢复过,但整个国家开始出现一种战略上长期守势化。也就是说:还能防御、反击,还能玩外交搞经济,还能出名将,但已经很难重新恢复罗马世界秩序。这和南宋特别像。
真好玩啊。于是我又问:
西罗马灭亡跟 关中耕地问题水土下降人口流失经济下降类似吗?
然后学习到一个历史知识,西罗马差了大运河一口气啊。都怪当年地中海航运欠佳,埃及的小麦没送得及时!
之前在zhihu看到讨论大明的漕运弊病,有人回答让人眼前一亮,要不是朝廷把江南大运河周边驻军,南中国早闹事,甚至分裂自立了。所以大运河的作用被严重低估了。虽然它有那么多弊病,但是算牵挂着不让中世纪帝国散架的重要体系了。
我又继续聊:对西方史不熟,西罗马灭亡可不可以看成一次 蛮族一方成功了的安史之乱?西罗马提前进入五代十国?AI大惊,觉得离谱又合理。不过AI指出,不同之处在于,五代十国之后中国还能重新整合,文明和官僚体系基本没断。哈哈哈,这恰好应对了我之前所说的,东罗马在小亚细亚这种好比“巴蜀江南”膏腴之地偏安一隅!
最后我总结,罗马与其说是一个帝国,不如说是“元老院和人民”。隋唐帝国被史书光芒掩盖了,它内核其实也是 府兵,六镇,关陇,魏博这种军事民主制。天子只是首席执行官
唐朝后期甚至搞出来禁卫军继承制。你就说像不像吧!
唐宋之变我觉得最可惜的就是帝国那种上进,扩张的风气没了。以前看还以为只是经济重心南移。
其实AI给出了很多精彩回答和反驳,我就不贴了。有兴趣的可以自己跟AI探讨下。
2026-05-11 22:45:00
学习外语的传统方法根深蒂固。早在 1921 年,Harold E. Palmer就指出,理解一种语言是如何运作的与学会如何使用这种语言之间存在着巨大的差别。从那时以来,人们已经找到了许多卓有成效的方法教授学生外语。根据当代所作的深入细微的研究,没有人会对自Palmer以来发展而成的学习外语的基本原理提出重大质疑,尽管在如何才能最好地贯彻这些原理方面仍有相当大的分歧。虽然在外语教学上取得了重大的进步,但是世界上许多地方的教师依然眷恋着过时的教学方法,在一定程度上,他们是用当年自己学外语的方法使旧的教学体系永久化。因此,重述一遍其中一些基本原理,简要探讨如何在课堂上有效地实施这些原理,大概不算不合时宜吧。
学习一门语言,不仅仅是掌握一套规则,积累大量词汇。教师工作的重点不应是告诉学生关于一门语言的知识,而应是使学生能够使用这门语言。衡量学生是否掌握一门语言,最终是要看他运用如何,而不是懂了多少。在这方面,学习语言与学习乐器十分相似。学生所做的操练与练习都是为了达到一个明确的目标:使他成为一个熟练的操作者。一个学生学了许多语法知识却不会运用语言,就像一个弹钢琴的学了许多有关和声的知识却不会弹钢琴一样。因此,衡量学生是否掌握语言并不看他懂了多少,而要看他在人前面前语言运用得如何。
学生要想成为熟练的语言运用者,就必须能够熟练地使用语言单位,而语言单位并不是人们曾经普遍认为的单词,而是句子。学习单词而不考虑它们的作用可能会白白浪费时间,因为单词并不都是同样重要的。我们必须把结构词和词项加以区别。像 I,you,he 等词便是结构词,它们的作用可以准确地加以界定,它们是语法体系的一部分;而像 tree,plant,flower 等词则是单纯的词项,与语法体系毫无关系。就学生而言,运用结构词的技巧是掌握一门语言的关键,因为由句型表达的含义主要依靠把句子联结起来的结构词所起的作用。
虽然以下一点仍待于科学地论证,但每个学习外语的学生可能都有一个也许可以称为“语言极点”的地方,即过了这点他的水平不可能有很大的提高。如果我们接受这一假设,那么,我们的目标就必须是用最有效的方法使学生在其能力范围内尽量多学到一点东西。过时的翻译—语法教学法极端浪费时间且效率很低,因为这种方法实际上是鼓励学生犯错误:让学生在没有充分准备的情况下运用语言技能。使用这种方法的教师无意中制造了他们企图避免的问题。他们的学生在学到一定程度后会不可避免地无法继续往下学:他们不得不回过头来重新开始。他们成了需要补课的学生,教师面临的问题是为学生补课,纠正他们所学到的错误的内容。同别的教学方法相比,这是一种最无益、最浪费时间和效率最低的方法。
应该训练学生学会尽量少犯错误。决不应该要求学生去做力所不及的事情。一本精心设计的教材应考虑到学生所谓的“准备状况”即可使他从易到难循序渐进的那个交接点。要使学生最充分地发挥自己的能力,必须训练他从一开始就采用正确的学习方法。
学生必须在语言的 4 项基本技能方面得到充分的训练。这些技能是:理解、口语、阅读和写作。在课堂教学中,许多教师把重点完全放在书面文字上。学生接受的训练是如何用眼而不是如何用耳来学习。学生不能掌握正确的发音、重音和语调,不得不主要归咎于书面文字的束缚。教师若想培养学生全面的 4 项基本技能,就必须有效地使用自己的时间。要做到有效,首先就要采用能在最短时间内产生最佳效果的课堂教学法。下列讲课顺序务必作为格言来遵循:
听到的再说;
说过的再读;
读过的再写。
上述技能中,口语与写作是最重要的。在某种程度上,它们是以另外两项技能为前提的。
在学生的口语能力还不成熟的情况下上传统的“口语课”是毫无意义的。让一个刚学完初级语言课程的学生来参加诸如“今日之电影艺术”这类内容的讨论是不可能的,因为他想表达的思想远远超出了他的表达能力。首先必须训练学生通过做精心设计的循序渐进的听/说练习学会使用句型,只有这样才能使他最终学会表达。
在考虑如何实现这一目标之前,应该注意到语言中的句型可以分成两种截然不同的类型:渐进型的和静态型的。例如,学习回答问题和提出问题就涉及了渐进型的句型。它们属于渐进型,这是因为学生运用这些复杂形式的技能要在很长的一段时间里才能培养起来:从一开始的简单回答,如“Yes, it is”,发展到复杂回答,如“Yes, I should, shouldn’t I”。而静态型的句型,如形容词的比较级,可以在有限的几课课文中讲授,不必占用很长时间。
渐进型句型必须在检查学生理解能力的练习中进行训练。这种练习要求学生回答问题并提出问题,而问题的难度则随着教程的进展而不断加深。必须训练学生用简略形式回答一般疑问句,用肯定形式和否定形式来回答用 or 连接的选择疑问句,回答用 When, Where, How 等疑问词开头的问句。而在每一个阶段,必须训练学生自己提问题。很明显,这些技能不可能在一两课书中学会;在每课书中都必须有这种练习。
与此同时,静态型句型必须在利用语言实验室技术的练习中得到训练。在每一个录音练习中,教师试图引出某一特定的回答。他在一系列口头练习中给学生某种诱导以引出新句型,直到学生可以准确地、下意识地作出反应。
培养学生说的能力也可以通过做口头作文练习的途径来达到目的。这种练习要求学生口头复述一段他所熟悉的英语短文。一开始应该要求学生练习复述叙述性与描写性的文字,待学到相当程度之后,再让他练习复述实质性的论说文。一旦他能够很好地完成这种练习,他便有能力就一些涉及抽象观点的指定的话题同别人交谈了。到了这个时候,他就能够有把握地表达自己的思想,犯的错误也会相对减少。
中级以下水平口语训练所用技巧大概可以归纳如下:
反复训练渐进型句型;
反复训练静态型句型;
练习口头作文。
在试图教学生写作时,我们同样需要这种精心的分级训练。仍然必须从最简单的陈述句开始。学生常常是在写的能力还不成熟的情况下便要匆匆提笔写作文。在课程的某一阶段,教师会认为是该由他的学生试着写作文的时候了。于是,他规定写一篇短的叙述文章或描写文章,盼望着会得到最好的结果。这种随心所欲、漫无目标的方法会制造大量的补课难题,产生灾难性的后果。如果一个学生在英语写作方面只是在专门编写的句子中做过一些句型填空练习,那么突然塞给他一个作文题目,并期待他能写出一篇语言准确、有可读性的文章来,那实在是太不合情理了。同在不成熟的情况下就规定题目进行讨论一样,我们在这儿做的只是鼓励他犯错误。指望如此这般几年之后(加上教师大量的纠正错误)学生就可以自己提高水平,那是毫无把握的。仅有少数学具有足够的自觉性和高度的主动性,在书面作业批改后认真地检查一遍。即使他们检查了,也绝对无法保证今后他们不会继续犯类似的错误。培养写作技能的最佳途径是做一些精心设计的、有指导的、循序渐进的理解/摘要练习。摘要写作并不仅仅适用于考试目的的、枯燥无味的学究式练习。它可以用来很有效地提高学生的写作能力。在中级以下阶段,学生务必学会造简单句,并列句,复合句,并能根据要点把意思连成文。有指导的摘要写作练习能使学生逐一克服上述难点,并使他在写作文时尽量少犯错误。
中级以下水平学生的写作训练,其主要阶段大概可以归纳如下:
通过有指导的理解练习进行简单句写作训练;
通过有指导的理解练习进行并列句写作训练;
通过有指导的理解练习进行复合句写作训练;
根据给出的要点进行把意思连成文的训练。
在传统教程中,所有有关句型的信息都是以“规则”的形式来介绍的,学生将这些规则用于相互没有关联的句子的填空练习或填上括号中所列词的正确词形的练习之中,这种学习语言的方法收效甚微,这点现在已经变得非常清楚。这种方法鼓励教师谈论语言,而不是训练他的学生去使用语言。侧重点是在书面练习上。这种方法的最大弱点是,学生不能将他从这种抽象的练习中所学到的知识转化成其他语言技能,如理解、口语和创作性写作。
每个新句型不应作为某一种抽象的语法规则的范例来介绍,而应作为表达某种思想的方法,也不需要进一步的说明和解释。学生在训练中学会下意识地运用正确的句型,而不是用“语法逻辑”去进行推理。如果需要解释,可以把新句型与已经学会的旧句型联系起来。举例来说,如果学生已经学会了 must 的用法,那么在讲授 have to 的用法时,可以让学生领会这两个句型之间有机的联系。
对中级以下水平的学生可以布置一些回顾练习,即把语言难点同他们熟悉的特定的上下文联系起来。这样可以训练他们凭直觉使用正确的句型。这在无意中也可为教师免去批改作业之苦,因为在大多数情况下,课文本身就可以代劳了。
在现代教程中,传统的填空练习仍有它的一席之地,但有一点重大的区别,即填空练习不应作为教授新句型的一种手段,而应作为巩固已学知识的途径。它们是目的,而不是达到目的的一种手段。从这个意义上讲,填空练习在测验中尤其有用,可以用来分析学生的错误,或让教师评估学生最终的成果。
为了进行上述各项练习,学生务必学习专门编写的课文。每课课文务必可以用来使学生在下列技能方面得到训练:
这些专门编写的课文大概可以称作多功能课文,因为它们可用来提供各类练习,旨在同时培养多种技能。
要使这些课文适应如此众多的目的,就必须进行特殊的设计。凡是要讲的新句型都必须融合进有上下文的语境中,也就是说,必须组织进每篇课文里。这些反复出现的句型应该贴切自然,要使听者觉得使用这些句型是不可避免的,而不是人工堆砌在一起的。另外还有一条非常重要的标准,即课文务必饶有趣味,引人入胜,使学生感到愉悦,能吸引住他的注意力,从而把反复训练带来的无法避免的厌烦减少到最低限度。如果课文配上插图,那就更加吸引人了。在初学阶段,插图的功能性大于装饰性;而在现阶段,则是装饰性大于功能性:中级以下阶段标志着听/视教学法向听/写教学法的过渡。
传统的教程往往分为“课”,而这些“课”却没有考虑一般长度为45分钟或1小时的课中可以做些什么。它们只是简单地包含“一定量的信息”,而且常常是洋洋洒洒好几页。在课堂教学中,这些“课”可能讲上好几周,因为要做的事情太多了。
“课”应该名副其实:教学内容一般可以在一个课时内完成,可能再加上一些补充的内容在课下作为作业。换句话说,一课书应被视作一个教学单位,仅此而已。现在,让教程设计者决定一个课时内可以做些什么是极其困难的。显然,由聪明学生组成的一个班所完成的内容要多于由不太聪明的学生组成的另一个班。如果课文中含有可以由教师决定取舍的内容,这个问题就可以迎刃而解,当然这种删节不应妨碍学生水平的提高。
出自《新概念英语》序言,通过ChatGPT+Deepseek OCR 得到。
醍醐灌顶,相见恨晚。
2026-05-10 16:52:00
一个流传很广的视频 小朋友识字,笑死我了。其实他一个不认识,只是记性好 1 2
摘录一些评论
妈妈:NOR FLASH;姐姐:NAND FLASH;小孩:磁带
链式存储,不支持随机查找
随机提问,你手机号的第五位是什么
正常,元素周期表中铝上个是什么
上辈子是个磁带
别笑,现在立刻问你周期表21号元素是什么33号元素是什么,大部分人也得青海里皮蓬一个个背过去
钾后面是什么?氢氦锂铍硼...
这很正常 do,re,mi,fa,sol,la,si 那请问,4627513,怎么念
五月有三十一天吗?1月大2月小3月大4月小5月大 哦 5月是大有31天[星星眼]
羊的下一个生肖是什么
别笑,我也不知道申猴上一个是什么?等会儿我数数哈。小老鼠排第一,个头不大真神气。牛第二虎第三,兔子第四跑得欢。龙第五蛇第六,马排老七不落后。羊第八猴第九。。。想起来了,未羊!
各位别笑,我问你们,英文字母K后面是哪个?
十二生肖龙是第几位的?
举酒欲饮无短弦的上一句?
元素周期表,第5号元素是什么
金属活动性顺序表,7个是什么金属
老师:请写出mg的电子排布式?我:氢氦锂铍硼…… 同桌:诶呀你直接从钠开始不就好了。我:(好不容易背到氧氟了)诶呀你别说话
给你们来点高难度的 十天干中“庚”后面是什么
请听题!“大漠孤烟直”上一句是什么?
每次有人问我身份证后四位,我也这样
那我问你,鲁R是哪里车?等等我顺一下,鲁a济南车 鲁b青岛的 鲁c淄博 鲁d枣庄 东营是鲁e 烟台是鲁f 潍坊叫鲁g 济宁挂着鲁h 泰安鲁j车 威海是鲁k 日照叫鲁l 鲁m滨州 鲁n德州 聊城是鲁p 鲁q临沂车 鲁r是菏泽,我知道了,是菏泽
跟AI很像啊?!或许,智能真没啥神秘的,就是一些序列片段,就看你会不会重新打乱组合。