Skip to content

Releases: Zenkuetu/ToastFish

ToastFish v3.4.0

Choose a tag to compare

@Zenkuetu Zenkuetu released this 17 Oct 09:18

ToastFish v3.4.0

本版做三件事:学习报告仪表盘的数据准确性(学术页修掉 11 处、概览页修掉 10 处,并新增「全部词库 / 当前词库」统计范围切换),整站排版与动效重做(仍是 Cyber Anime 深紫霓虹风格),以及深度学习风格的神经网络背景动画(跟随鼠标产生注意力光效)。

界面 · 排版与动效全部重做

  • 导航:改为胶囊分段控件,选中项青→品红渐变 + 发光 + 下方圆点;品牌区改双行(主标题 + CYBER ANIME STUDY CONSOLE · v3.0)

  • 页面骨架:每页统一「大标题 + 日文小字 + 一行说明 + 右上信息 chip」,正文按 01 / 02 / 03 编号分区(青→品红渐变的细横线 + 分区日文注记)

  • 概览页 KPI:「累计学习词次」升为左侧 hero 大卡(64px 数字 + 扫光 + 迷你柱状 spark),其余 7 项为右侧 3×2 网格;数字全部改为滚动动画(0 → 目标值)

  • 图表卡:玻璃质感卡片 + 顶部渐变发丝线 + hover 时四角 HUD 装饰与上浮阴影

  • 动效:图表统一 900ms easeOutQuart 入场;切 tab 时整页淡入上浮(页面重挂载,入场动画重放);柱状图逐柱生长;prefers-reduced-motion 下自动降级

  • 响应式:1320 / 1080 / 760 三档断点,窄屏时 KPI 与图表网格自动单列,无横向溢出

背景 · 神经网络动画(跟随鼠标)

  • 背景不再是静态星空,改为神经网络拓扑:节点缓慢漂移、按权重连线,并沿边不断有光脉冲「前向传播」
  • 鼠标即注意力:光标 210px 内的节点被激活,出现青色光晕、放射状连线与高亮,并沿权重边向外发射脉冲;移开后逐渐冷却
  • 分两层渲染:完整的网络在最底层(隔着图表玻璃卡微微透出),光标特效用独立画布叠加在内容之上(导航栏之下)
  • 不影响使用:两层画布都不接收鼠标事件,透明度最高 0.46,文字与图表始终清晰可读;约 38fps 节流、页面切到后台时暂停、prefers-reduced-motion 下节点静止
  • 顺带修掉一个长期隐藏的问题:此前的「星空背景」组件虽已注册,但从未被挂载,动画一帧都没跑过

光标动效 · 完全由鼠标速度驱动

  • 光标附近的光晕、彗尾、涟漪、旋转扫描环与放射连线,强度与半径都随移动速度变化:轻轻移动只是一层很淡的微光,快速划过才拉出彗尾与扩散的涟漪
  • 鼠标静止时完全归零 —— 光标处不会残留任何光晕或呼吸特效,只剩背景神经网络继续缓慢漂移,不干扰阅读
  • 消失得极快 —— 光晕、涟漪、拖尾透明度统一跟着速度衰减:停手 ~80ms 光晕消失,~350ms 整层画布完全干净,不会拖着一团余晖
  • 光晕整体更小更淡 —— 半径缩减约 28%(静止 ≈46px、快速划过 ≈139px),核心透明度 0.20 → 0.13、外圈 0.07 → 0.042,扫描环 / 放射线 / 涟漪 / 拖尾同步下调约 35%,不再压住 KPI 数字
  • 涟漪与拖尾粒子数量各自收敛,长时间使用不会晃眼
  • 背景跟随页面滚动产生视差 —— 上下滚动时神经网络整体跟着移动,但只走 35% 的距离,形成「背景比内容慢一拍」的纵深感;节点越界后从反向回卷,不会出现空白
  • 每颗点自己的速度 —— 背景节点不再是整片同速漂移:每颗点有独立的速度倍率(约 0.25× ~ 2.2×,慢点占多数),快的点也更大更亮、与它相连的线段更实,于是同一屏里能读出前后层次(实测速度从原来 36 px/s 的窄带拉开到 1.453 px/s,静止画面里也能看出谁在动)

修复的界面 bug

| 问题 | 修复 |

|---|---|

| 学习日历被压成 2 列竖条、格子重叠溢出 | grid 布局改为 flex 列排,恢复 GitHub 风格 17 列 × 7 行 |

| 词库进度数字(1085 / 5473 · 19.8%)折成两行 | 数字列加宽并禁止换行 |

| 分区标题过小过暗 | 字号 11 → 13.5px,颜色提亮 |

| AI 短文页头部是空盒子 | 改用与其它页统一的 page-head |

| 整页只剩红字 Mount Failed | 根模板里的自定义元素写成自闭合导致 Vue 编译器错误 30,改为显式闭合 |

学术页 · 11 处数据问题全部修复

| # | 问题 | 修复 |

|---|------|------|

| 1 | 记忆半衰期 207.9 天是硬编码(正确率 >90% 时固定返回同一值) | 移除「半衰期」输出 —— 数据库只存每个词最近一次评分,间隔又是答对才扩张(生存偏差),现有数据无法拟合遗忘曲线 |

| 2 | 品红拟合虚线是假的(R²=0.900 为常量) | 删除拟合曲线与伪 R² 标注 |

| 3 | Bjork 散点 70% 堆在 x=200 竖线(storage 公式上限) | 横轴直接改用真实复习间隔(对数轴),纵轴为最近一次评分,tooltip 显示难度与状态 |

| 4 | <1天 桶永远显示 0% | 空桶不再画 0%,改为不绘制该数据点;桶判定修正为左闭右开 |

| 5 | 顽固词表恒为空(筛选条件与状态定义矛盾) | 口径改为「最近一次评分 < 80% 或尚未进入已学完状态」,并按难度/间隔排序取 Top 15 |

| 6 | 间隔扩张只有一根柱(按状态分组,已学词全是同一状态) | 改为按 SM2 难度档分组,双柱显示平均/中位间隔 |

| 7 | 只统计当前词库,切换词库后历史消失 | 默认统计全部词库的已学词(按 headWord 去重),页首可一键切回「当前词库」 |

| 8 | 难度分桶丢掉 difficulty = 1.0 的词 | 末桶闭合 |

| 9 | 合意难度区高亮错位(最高柱反而不亮) | 改为「与 0.15–0.35 区间有重叠即高亮」 |

| 10 | 周节律「最近 8 周」不连续(缺数据的周被跳过) | 以最后记录所在周的周一为锚,向前取连续 8 个自然周,缺数据留空 |

| 11 | 学习效率曲线贴顶无区分度(88 天里 59 天 100%) | 纵轴自动缩放(beginAtZero: false),tooltip 显示当日复习词数 |

现在学术页只呈现分布与相关性,并明确标注统计口径,不再输出任何推算出来的拟合参数。

概览页 · 10 处数据问题全部修复

| # | 问题 | 修复 |

|---|------|------|

| 1 | 「累计词汇增长」画的其实是累计学习词次(2847),全页没有一处显示已学单词数 | 标题改为「累计学习词次(含重复复习,非已学单词数)」,另加 KPI「已学单词数(全库去重)」 |

| 2 | 难度分布合意区高亮错位,且只有 6 档(学术页是 10 档) | 统一 10 档,高亮改由「与 0.15–0.35 有重叠」决定 |

| 3 | 同一页混口径:难度/间隔只算当前词库,其余是全库 | 分布图统一为全部词库已学词(与学术页一致) |

| 4 | 正确率趋势固定 0–100%,长期贴在 100% 附近成为直线 | 纵轴随数据自适应,并加「合意正确率 85%」虚线参考线 |

| 5 | 时间轴只画有记录的 88 天,实际跨 118 天,x 轴不等距 | 按自然日补齐,没学的天计 0 词、正确率断线 |

| 6 | 学习日历没有星期标签;会把「还没到」的日期画成漏学 | 增加星期列,未来日期改为虚线透明格,图例给出具体阈值 |

| 7 | 词库进度固定取前 8 个(14 个是 0),还显示英文表名 | 只列已开始的词库并显示中文名,标题标出「已开始 3 / 17」 |

| 8 | 进度用 Count 缓存列(会漂移) | 改用同库现算的已学数 |

| 9 | 一个饼图数据集模板从未渲染(死数据) | 删除 |

| 10 | 缺「当前连续天数」,无记录时最长连续会显示 1 | 新增当前连续天数,无记录时两者都为 0 |

其它

  • 顽固词列表新增空状态提示(当前词库无顽固词时不再显示空表)

  • 词库数据来源与许可说明(考研词频词库来自 exam-data/NETEMVocabulary,数据 CC BY-NC-SA 4.0,禁止商用)

  • 版本号 3.3.1 → 3.4.0

安装

下载 ToastFish-v3.4.0-Setup.exe 直接覆盖安装即可,学习数据不会被覆盖或删除。

背景 · 节点速度

  • 每颗点有独立速度:远的点几乎不动、近的点明显滑行(最快约 53 px/s),快的点带一段运动彗尾
  • 背景网络层移到卡片之上(z-index 60),不再被卡片背景吃掉

背景 · 指针把节点推开

  • 鼠标靠近时,光标 340px 内的节点会被推着让开,连线随两端位移一起散开、超过阈值自然断开,光标附近像被「按」出一个空腔
  • 推开是每帧一小步的位移,力随距离衰减到 0:节点被推到半径边缘就停住,指针穿过或移开都不会弹回去,快速划过只是把它们拨开一下
  • 幅度与范围:1 秒内距光标 112px 的节点就让开约 188px,影响半径 340px,空腔在 2~3 帧内就被掏空
  • 速度是平滑过渡的:推开的速度本身有惯性(加速 0.18 / 减速 0.12),指针移开后节点不会突然定住,而是继续向外滑约 0.4 秒才停,观感不再是「急刹」

ToastFish v3.3.1

Choose a tag to compare

@Zenkuetu Zenkuetu released this 15 Oct 12:03

ToastFish v3.3.1

新增 · GitHub 自动检查更新

  • 启动后自动静默检查:程序启动 15 秒后后台查询 GitHub 最新 Release;有新版才弹窗提醒,可直接点「前往下载」打开下载页。已是最新版、检查失败、正在学习、已有弹窗在显示时,都不会打扰你。
  • 托盘菜单「检查更新」:随时手动检查。已是最新版会明确告诉你当前版本,检查失败也会给出提示。
  • 网络超时 8 秒、强制 TLS 1.2;任何异常都被吞掉,绝不影响学习流程。

本版本同时包含:

  • 多 AI 服务商:Kimi 开放平台 / Kimi Code 订阅(api.kimi.com/coding/v1)/ 自定义 OpenAI 兼容端点,每个服务商的 API Key 与模型名分开记忆
  • Alt+Q 恢复被超时隐藏的弹窗:学习弹窗超时隐藏后,按 Alt+Q 可重新显示并继续本轮进度

词库数据来源与许可

「考研词频词汇」词库的数据来自开源项目 exam-data/NETEMVocabulary:共 5530 词,按四六级/考研/专四专八约 200 套试卷文本的词频排序。

  • 数据许可:CC BY-NC-SA 4.0(署名 · 非商业性使用 · 相同方式共享)—— 该词库数据不得用于商业用途,二次分发或修改须保留上游署名并以相同协议共享
  • 程序代码仍为 MIT 许可,与数据许可互不影响

安装包

  • ToastFish-v3.3.1-Setup.exe(约 34 MB,已内置 Python 运行时,无需另装)
  • 覆盖安装不会覆盖 inami.db,学习记录保留

版本

  • tag v3.3.1 / 文件版本 3.3.1.0

ToastFish v3.3.0

Choose a tag to compare

@Zenkuetu Zenkuetu released this 11 Oct 12:28

ToastFish v3.3.0

本次有两个你会直接感受到的变化。

🐛 弹窗不再夺取焦点

此前:任何弹窗一出现,就会立即抢走你当前程序的前台焦点 —— 打字、看视频、写代码时都会被硬生生打断一下,得手动切回去。

现在:弹窗照常恒显示在最上层,但不再夺取焦点。你继续做手头的事,单词就在右下角等着,按 Alt+1~Alt+4 顺手答掉即可。

实现:新增无激活弹窗基类,覆写 ShowWithoutActivation,WinForms 内部改用 ShowWindow(SW_SHOWNOACTIVATE)。
刻意不设 WS_EX_NOACTIVATE —— 那样窗口将永远无法激活,你主动点击弹窗后回车/ESC 也会失效。

✨ AI 短文改为「你说了算」

此前:累计满 30 个新词后,下一轮学完就自动生成短文 —— 毫无预告,容易打乱安排。

现在:累计满 30 时,在新一轮开头问你一句:

已累计 N 个新词,是否在本轮结束时生成 AI 短文? [生成短文] [暂不生成]

选「暂不生成」就跳过本轮,本轮新词继续累计,下一轮再问你。30 秒不回答按「暂不生成」处理 —— 不会擅自替你决定。

🔧 内部重构(无行为变化)

弹窗基类 PopupForm、词表名 WordTables、exe 目录 PathHelper、线程安全随机数 SafeRandom —— 顺手修掉了几处静默出错的隐患(例如「同一毫秒内多次 new Random() 得到完全相同的序列」,.NET Framework 的经典坑)。

说明

  • 首次运行仍可能提示「未知发布者」/「Windows 已保护你的电脑」—— 本项目未做数字签名,点「更多信息 → 仍要运行」即可。
  • 现有学习数据与设置完全不受影响;卸载不会删除学习数据。

下载:ToastFish-v3.3.0-Setup.exe(33.7 MB,内置 Python 运行时,开箱即用)

ToastFish v3.2.5

Choose a tag to compare

@Zenkuetu Zenkuetu released this 07 Oct 12:52

修复内容

#1 惊喜弹窗空格误触答题

惊喜复习弹窗跳出时,无意按下的空格 / 回车会被判定为选择了第一个选项,直接写入 SM2 评分。

  • 根因:WinForms Button 获得焦点后,空格与回车都会触发 Click;而弹窗显示时第一个按钮会自动获得焦点。惊喜弹窗是在用户打字时突然弹出的,因此极易误触。
  • 修复:新增 SuppressSpaceEnterKeys() —— KeyPreview + KeyDown 拦截 Space / Enter;三个答题弹窗(单词 / 复盘测验 / 惊喜复习)的选项按钮补 TabStop=false,不再参与焦点。
  • 鼠标点击与 Alt+1~4 全局热键不受影响;ShowWithButtons(是/否对话框)保留回车确认语义。

#2 全新电脑仪表盘打不开

新电脑上没有 Python,点「学习报告 📊」只有转圈的鼠标指针,什么都不发生。

  • 根因(三重叠加):
    1. 安装包只打包了 .py 脚本,没有 Python 解释器;
    2. 调用方写死 FileName = "python",在无 Python 的机器上命中微软商店的应用执行别名(拉起商店、脚本根本不执行),还要白等 15 秒 —— 那个转圈就是它;
    3. Dashboard_Click 只有 if (File.Exists(...)) 没有 else,而 dashboard.html 不进安装包 → 失败完全静默。
  • 修复:
    • 安装包内置 Python 3.11.9 embeddable 精简运行时(剔除 TLS 组件,14.7MB),开箱即用;
    • 解释器解析改为候选链:内置 Resources\python\python.exe → %WINDIR%\py.exe -3 → PATH 中的 python.exe(排除 WindowsApps 商店别名);
    • 生成失败时弹窗明确告知「需要 Python 3」并给出解决办法,不再静默。

安装包

  • 文件:ToastFish-v3.2.5-Setup.exe(本版起改用含版本号的文件名 —— 版本号唯一来源为 toastfish.iss 的 #define MyAppVersion)
  • 大小:33.7 MB(含内置 Python 运行时)
  • 安装位置:%LOCALAPPDATA%\ToastFish(无需管理员权限)
  • 学习数据保护不变:inami.db 覆盖安装不覆盖、卸载不删除
  • 程序文件版本:3.2.5.0

验证

  • MSBuild 编译通过
  • Alt+Q 弹窗正常;空格 / 回车被拦截(弹窗保持打开),Alt+1 答题正常
  • 内置 Python 按程序调用方式实跑生成 dashboard.html(956,288 字节)
  • 安装包构建成功;ToastFish.exe 与安装包的 FileVersion 均为 3.2.5.0
  • 数据库 integrity=ok,与启动快照统计一致,无污染

ToastFish v3.2.4

Choose a tag to compare

@Zenkuetu Zenkuetu released this 17 Sep 10:38

修复:学满 30 词后 AI 短文仍然不生成

问题:累计学习超过 30 个新词后,学后 AI 短文 / 完形填空依然不弹出,而且没有任何报错提示,看起来像是功能「静悄悄失效」。

根因:AI 短文门控取词时传入的新词列表恒为空。

新词学习是一个「边学边删」的循环 —— while (NewCardLst.Count != 0) 体内每学一个词就 RemoveAt(0),循环退出条件本身就是「列表已经被清空」。而门控代码位于这段循环之后,拿到的必然是空列表,于是:

累积计数永远是 0  →  永远达不到 30 的阈值  →  预生成任务从不启动  →  短文永不生成

又因为门控标志保持「默认跳过」,整个环节静默返回,用户看不到任何异常。

修复:在循环之前保存一份新词快照,门控改用它。

实测验证

环节 结果
累积生效 pending 45 → 50(此前恒为 [])
门控放行 50 ≥ 30 ✅
生成成功 ai_diag.log 新增 GEN OK en=5332chars q=5
累积清零 pending → [](清空逻辑正确执行)
弹窗展示 右下角弹出「学后 AI 短文 · 包含你刚学的 8 个目标词」

升级说明

  • 覆盖安装不会动你的学习数据 —— inami.db 标记了 onlyifdoesntexist,安装器不会覆盖已存在的数据库
  • 卸载也不会删除数据库(uninsneveruninstall)
  • 如果你希望迁移旧数据,可在安装时勾选「附加任务」页的迁移选项并选择旧 inami.db

完整对比:v3.2.3...v3.2.4

ToastFish v3.2.3

Choose a tag to compare

@Zenkuetu Zenkuetu released this 16 Sep 11:59

v3.2.3 更新说明

🐛 重要修复

1. 复习词不出现(严重)

此前每轮学习本应有 2N 个复习词,实际却长期为空。根因是程序内部用文本比较判断日期:'2026/9/15' < '2026/9/9' 在字符串比较下成立,导致 9 号以后学过的词每次启动都被误判为「超过 7 天未复习」并被刷新时间戳 —— 单次启动影响 1193 个词,复习队列因此永远抽不到词。

本版已修复,并把复习词选取改为「逾期优先 + 未到期补足」,保证每轮都有足量复习词。

2. 学习记录不写入(严重)

从托盘菜单「退出」时,程序用 Environment.Exit 直接结束进程,跳过了收尾流程 —— 学习日志从不写入(该问题自首个版本即存在,非本版引入)。本版已修复,退出时会正确统计并写入当日学习记录。

3. 安装包携带开发者的学习数据(隐私)

此前构建安装包时,AI 短文历史表未被清理。v3.1.0 ~ v3.2.2 的安装包中均包含开发者的 69 条 AI 短文记录(含短文原文、题目、作答)。本版已彻底修复清理流程,同时对词表学习状态、配置项、历史备份表一并清理。

如果你安装过 v3.1.0 ~ v3.2.2,那些记录位于本地数据库的 EssayLog 表,删除它不会影响你的词汇与学习进度。

✨ 改进

AI 短文改为「累积」触发(此前每轮结束都会生成,频率过高)

  • 每轮累积本轮新词,累计达到 30 个才生成一次
  • 生成时从「全部累积新词 + 10 个随机已学词」的词池中随机挑 8 个作为目标词
  • 生成成功即清零重新累积;生成失败则保留,下轮继续累加
  • 完形填空(15选10 / 20空四选一)共用同一触发节奏

📌 安装说明

  • 已有用户:数据库会自动升级(新增字段在启动时自动添加),学习进度不受影响
  • 新用户:安装包内为纯净词库,从零开始
  • 迁移旧数据:安装时勾选「导入旧版 ToastFish 学习数据」并选择旧 inami.db 即可
  • 卸载重装不会丢失学习数据(数据库文件被标记为保留)

ToastFish v3.2.2

Choose a tag to compare

@Zenkuetu Zenkuetu released this 08 Sep 13:24

ToastFish v3.2.2

修复

  • 修复答「模糊」/「没印象」后单词不再重复跳出:上一版(v3.2.1)引入的回归,答「模糊」(Hard) 或「没印象」(Again) 后单词本应本轮内立即重复弹出、直到答「记住」/「牢记」才毕业,现在恢复正常。
  • 修复 AI 短文/完形填空消失:上述回归的连锁反应——答错词不再进入已学列表,导致学后微阅读的 AI 材料(考研 20空四选一 / 5 题短文、非考研 15选10)因目标词不足 3 个而不触发,现已恢复。
  • 增加防死循环保险:每个「学习中」词单轮最多重复弹出 6 次,超过则留到下次学习。

说明

  • 复习调度(未到期词不重复复习)、学习中词三分类、到期时间持久化等 v3.2.1 的改进保持不变。

ToastFish v3.2.1

Choose a tag to compare

@Zenkuetu Zenkuetu released this 07 Sep 14:24

ToastFish v3.2.1

🐛 修复:复习调度(重要)

  • 复习词不再炒冷饭:GetOverdueReviewedCardList 增加到期过滤,未到期的词不再被反复拉出来复习(之前 element/chorus/talk 等刚答「牢记」的词几乎每轮都出现)。
  • 「没印象」的词终于能出现:SelectWordList 三分类(新词 / 学习中 / 复习词),答「没印象」(Again) 的词不再混入几千词的新词池被随机稀释到几乎不可见。
  • 新增 dateLearingDue 列:持久化学习中词的下次到期时间,重启后不再丢失。
  • 学习中词每轮上限 2N:历史累积的到期词分散到多轮补完,避免一次性涌出几十个。

🎓 考研英语 AI 优化

  • 阅读题数 3→5 对齐真题:考研英语一传统阅读(Part A)每篇 5 题,新增考研版修正轮 prompt,max_tokens 上调至 2000 防止 5 题 JSON 被截断。
  • 完形填空加语域约束:生成的 20 空四选一改为「通用学术英语」语域,禁止密集堆砌经济学/心理学等专业术语(如 marginal、mediated、alignment)。

完整技术细节见仓库内 CLAUDE.md(#60 / #61 / #62)。

ToastFish v3.2.0

Choose a tag to compare

@Zenkuetu Zenkuetu released this 05 Sep 14:54

ToastFish v3.2.0

新增

  • 考研大纲词频词库 KaoYan_3:2024 考研英语一大纲 5530 词,按四六级/考研/专四专八约 200 套试卷词频排序(前 2444 词为高频)
  • 考研英语完形填空「20空四选一」:考研词库改用考研真实题型,替代 15选10(六级题型),其他词库保持 15选10
  • 考研英语专属 AI 短文 prompt:学术议论文/说明文题材、长难句、7 大题型(含例证题/指代题/句意猜测)、考研式干扰项(偷换概念/以偏概全/无中生有/过度推断)
  • AI 短文难度随当前词库动态化:四级/六级/考研/GRE/雅思/托福/SAT/专四/专八 各自适配
  • 仪表盘适配 20空四选一题型显示

修复

  • 单词发音采样率(MP3Sharp mono×2/stereo×1 + 识别有道返回的伪 .mp3/WAV 文件)
  • 学习进度不更新(学习中词死循环 + Step1/Step2 词未写入,答 Again/Hard 的词不再丢失进度)
  • 20空四选一弹窗:窗口过小、定位错误、行间距不一致
  • 仪表盘打开时进度不随当前词库刷新
  • 仪表盘 isCloze4Q 运行时错误
  • 删除阅读弹窗「显示翻译」按钮(翻译改由仪表盘查看)

ToastFish v3.1.0

Choose a tag to compare

@Zenkuetu Zenkuetu released this 01 Sep 13:21

ToastFish v3.1.0

新增功能

  • AI 生成超时改为弹窗询问:推理模式 AI 生成(学后短文 / 15选10 完形填空)超过 180 秒时,从原来的自动中止改为弹出「继续等待 / 立即终止」按钮,由用户决定是否继续等待。
  • 弹窗快捷键:该弹窗复用全局热键 ALT+1 = 继续等待、ALT+2 = 立即终止,无需鼠标点击。
  • 边界行为统一:弹窗等待期间若短文恰好生成完毕,即使点了「立即终止」也会保留并展示已生成的短文(不浪费已计费的生成),CLOZE 与 ESSAY 两题型行为已统一。

修复

  • 缓解「超时立即读取结果为空、后台快速模式降级结果被丢弃」的时序竞态(「继续等待」路径)。
  • 统一 CLOZE 与 ESSAY 在终止场景下的行为差异。

🤖 Generated with Claude Code