style: 删除一些多余日志
This commit is contained in:
@@ -12,7 +12,7 @@
|
|||||||
- 0.1.x: 命令行操作的调度器.
|
- 0.1.x: 命令行操作的调度器.
|
||||||
- 0.2.x: 使用 Textual 构建富文本终端用户界面, 项目可行性验证, 采用 SM-2 原始算法, 评估方式为用户自评估的原型.
|
- 0.2.x: 使用 Textual 构建富文本终端用户界面, 项目可行性验证, 采用 SM-2 原始算法, 评估方式为用户自评估的原型.
|
||||||
- 0.3.x: 简单的多文件项目, 创建了记忆内容/算法数据结构, 基于 SM-2 改进算法的自动复习测评评估. 重点设计古诗文记忆理解功能, 以及 TUI 界面实现, 简单的 TTS 集成.
|
- 0.3.x: 简单的多文件项目, 创建了记忆内容/算法数据结构, 基于 SM-2 改进算法的自动复习测评评估. 重点设计古诗文记忆理解功能, 以及 TUI 界面实现, 简单的 TTS 集成.
|
||||||
- 0.4.x: 使用模块管理解耦设计, 增加文档与类型标注, 采用上下文设计模式的隐式依赖注入与遵从 IoC, 注册器设计的算法与功能实现, 支持其他调度算法模块 (SM-2, FSRS) 与谜题模块, 采用日志调试, 更新文件格式, 引入动态数据模式(宏驱动的动态内容生成), 与基于文件的策略调控, 更佳的用户数据处理, 加入模块化扩展集成, 将算法数据格式换为 json 提高性能, 采用 provider-service 抽象架构, 支持切换服务提供者, 整体兼容性改进.
|
- 0.4.x: 使用模块管理解耦设计, 增加文档与类型标注, 采用上下文设计模式的隐式依赖注入与遵从 IoC, 注册器设计的算法与功能实现, 支持其他调度算法模块 (SM-2, SM-15M, FSRS) 与谜题模块, 采用日志调试, 更新文件格式, 引入动态数据模式(宏驱动的动态内容生成), 与基于文件的策略调控, 更佳的用户数据处理, 加入模块化扩展集成, 将算法数据格式换为 json 提高性能, 采用 provider-service 抽象架构, 支持切换服务提供者, 整体兼容性改进.
|
||||||
> 下一步?
|
> 下一步?
|
||||||
> 使用 Flutter 构建酷酷的现代化前端, 增加云同步/文档源服务...
|
> 使用 Flutter 构建酷酷的现代化前端, 增加云同步/文档源服务...
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
### 间隔迭代算法
|
### 间隔迭代算法
|
||||||
> 许多出版物都广泛讨论了不同重复间隔对学习效果的影响. 特别是, 间隔效应被认为是一种普遍现象. 间隔效应是指, 如果重复的间隔是分散/稀疏的, 而不是集中重复, 那么学习任务的表现会更好. 因此, 有观点提出, 学习中使用的最佳重复间隔是**最长的、但不会导致遗忘的间隔**.
|
> 许多出版物都广泛讨论了不同重复间隔对学习效果的影响. 特别是, 间隔效应被认为是一种普遍现象. 间隔效应是指, 如果重复的间隔是分散/稀疏的, 而不是集中重复, 那么学习任务的表现会更好. 因此, 有观点提出, 学习中使用的最佳重复间隔是**最长的、但不会导致遗忘的间隔**.
|
||||||
- 采用经实证的 SM-2 间隔迭代算法, 此算法亦用作 Anki 闪卡记忆软件的默认闪卡调度器
|
- 采用经实证的 SM-2 与更先进的 SM-15M, FSRS 间隔迭代算法, 前者亦用作 Anki 闪卡记忆软件的默认闪卡调度器
|
||||||
- 动态规划每个记忆单元的记忆间隔时间表
|
- 动态规划每个记忆单元的记忆间隔时间表
|
||||||
- 动态跟踪记忆反馈数据, 优化长期记忆保留率与稳定性
|
- 动态跟踪记忆反馈数据, 优化长期记忆保留率与稳定性
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
- 自然语音: 集成微软神经网络文本转语音 (TTS) 技术
|
- 自然语音: 集成微软神经网络文本转语音 (TTS) 技术
|
||||||
- 多种谜题类型: 选择题 (MCQ)、填空题 (Cloze)、识别题 (Recognition)
|
- 多种谜题类型: 选择题 (MCQ)、填空题 (Cloze)、识别题 (Recognition)
|
||||||
- 动态内容生成: 支持宏驱动的模板系统, 根据上下文动态生成题目
|
- 动态内容生成: 支持宏驱动的模板系统, 根据上下文动态生成题目
|
||||||
- 云同步支持: 通过 WebDAV 协议同步数据到远程服务器
|
- 云同步支持: 通过多种 (如 WebDAV) 协议同步数据到远程服务器
|
||||||
|
|
||||||
### 实用用户界面
|
### 实用用户界面
|
||||||
- 响应式 Textual 框架构建的跨平台 TUI 界面
|
- 响应式 Textual 框架构建的跨平台 TUI 界面
|
||||||
@@ -40,9 +40,8 @@
|
|||||||
### 架构特性
|
### 架构特性
|
||||||
- 模块化设计: 算法、谜题、服务提供者可插拔替换
|
- 模块化设计: 算法、谜题、服务提供者可插拔替换
|
||||||
- 上下文管理: 使用 ContextVar 实现隐式依赖注入
|
- 上下文管理: 使用 ContextVar 实现隐式依赖注入
|
||||||
- 数据持久化: TOML 配置与内容, JSON 算法状态
|
- 宏支持: 支持动态配置内容与自动化
|
||||||
- 服务抽象: 音频播放、TTS、LLM 通过 provider 架构支持多种后端
|
- 服务抽象: 音频播放、TTS、LLM 通过 provider 架构支持多种后端
|
||||||
- 完整日志系统: 带轮转的日志记录, 便于调试
|
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
|
|||||||
@@ -70,8 +70,6 @@ class DashboardScreen(Screen):
|
|||||||
electron_dir = config_var.get()["paths"]["electron_dir"]
|
electron_dir = config_var.get()["paths"]["electron_dir"]
|
||||||
electron_file_path = pathlib.Path(electron_dir) / f"{filestem}.json"
|
electron_file_path = pathlib.Path(electron_dir) / f"{filestem}.json"
|
||||||
|
|
||||||
logger.debug(f"电子文件路径: {electron_file_path}")
|
|
||||||
|
|
||||||
# 确保电子文件存在
|
# 确保电子文件存在
|
||||||
if not electron_file_path.exists():
|
if not electron_file_path.exists():
|
||||||
electron_file_path.touch()
|
electron_file_path.touch()
|
||||||
@@ -79,16 +77,12 @@ class DashboardScreen(Screen):
|
|||||||
|
|
||||||
# 加载电子数据
|
# 加载电子数据
|
||||||
electron_dict = load_electron(path=electron_file_path)
|
electron_dict = load_electron(path=electron_file_path)
|
||||||
logger.debug(f"电子数据: {electron_dict}")
|
|
||||||
|
|
||||||
# 分析电子状态
|
# 分析电子状态
|
||||||
is_due = 0
|
is_due = 0
|
||||||
is_activated = 0
|
is_activated = 0
|
||||||
nextdate = 0x3F3F3F3F
|
nextdate = 0x3F3F3F3F
|
||||||
|
|
||||||
for electron in electron_dict.values():
|
for electron in electron_dict.values():
|
||||||
logger.debug(f"{electron}, 是否到期: {electron.is_due()}")
|
|
||||||
|
|
||||||
if electron.is_due():
|
if electron.is_due():
|
||||||
is_due = 1
|
is_due = 1
|
||||||
if electron.is_activated():
|
if electron.is_activated():
|
||||||
@@ -102,8 +96,6 @@ class DashboardScreen(Screen):
|
|||||||
electron_count = len(electron_dict)
|
electron_count = len(electron_dict)
|
||||||
is_more = not (electron_count >= nucleon_count)
|
is_more = not (electron_count >= nucleon_count)
|
||||||
|
|
||||||
logger.debug(f"是否需要更多复习: {is_more}")
|
|
||||||
|
|
||||||
# 更新状态
|
# 更新状态
|
||||||
self.nextdates[filename] = nextdate
|
self.nextdates[filename] = nextdate
|
||||||
self.stay_enabled[filename] = is_due or is_more
|
self.stay_enabled[filename] = is_due or is_more
|
||||||
|
|||||||
@@ -61,26 +61,20 @@ class MemScreen(Screen):
|
|||||||
|
|
||||||
def puzzle_widget(self):
|
def puzzle_widget(self):
|
||||||
try:
|
try:
|
||||||
logger.debug(self.phaser.state)
|
|
||||||
logger.debug(self.procession.cursor)
|
|
||||||
logger.debug(self.atom)
|
|
||||||
self.fission = Fission(self.atom, self.phaser.state)
|
self.fission = Fission(self.atom, self.phaser.state)
|
||||||
puzzle_debug = next(self.fission.generate())
|
puzzle_debug = next(self.fission.generate())
|
||||||
# logger.debug(puzzle_debug)
|
|
||||||
return shim.puzzle2widget[puzzle_debug["puzzle"]](
|
return shim.puzzle2widget[puzzle_debug["puzzle"]](
|
||||||
atom=self.atom, alia=puzzle_debug["alia"]
|
atom=self.atom, alia=puzzle_debug["alia"]
|
||||||
)
|
)
|
||||||
except (KeyError, StopIteration, AttributeError) as e:
|
except (KeyError, StopIteration, AttributeError) as e:
|
||||||
logger.debug(f"调度展开出错: {e}")
|
logger.debug(f"调度展开出错: {e}")
|
||||||
return Static("无法生成谜题")
|
return Static("无法生成谜题")
|
||||||
# logger.debug(shim.puzzle2widget[puzzle_debug["puzzle"]])
|
|
||||||
|
|
||||||
def compose(self) -> ComposeResult:
|
def compose(self) -> ComposeResult:
|
||||||
yield Header(show_clock=True)
|
yield Header(show_clock=True)
|
||||||
with ScrollableContainer():
|
with ScrollableContainer():
|
||||||
yield Label(self._get_progress_text(), id="progress")
|
yield Label(self._get_progress_text(), id="progress")
|
||||||
|
|
||||||
# self.mount(self.current_widget()) # type: ignore
|
|
||||||
yield ScrollableContainer(id="puzzle-container")
|
yield ScrollableContainer(id="puzzle-container")
|
||||||
# yield Button("重新学习此单元", id="re-recognize", variant="warning")
|
# yield Button("重新学习此单元", id="re-recognize", variant="warning")
|
||||||
yield Footer()
|
yield Footer()
|
||||||
|
|||||||
@@ -65,14 +65,6 @@ class PreparationScreen(Screen):
|
|||||||
yield Markdown(self._get_full_content().replace("/", ""), classes="full")
|
yield Markdown(self._get_full_content().replace("/", ""), classes="full")
|
||||||
yield Footer()
|
yield Footer()
|
||||||
|
|
||||||
# def watch_scheduled_num(self, old_scheduled_num, new_scheduled_num):
|
|
||||||
# logger.debug("响应", old_scheduled_num, "->", new_scheduled_num)
|
|
||||||
# try:
|
|
||||||
# one = self.query_one("#schnum_label")
|
|
||||||
# one.update(f"单次记忆数量: {new_scheduled_num}") # type: ignore
|
|
||||||
# except:
|
|
||||||
# pass
|
|
||||||
|
|
||||||
def _get_full_content(self):
|
def _get_full_content(self):
|
||||||
content = ""
|
content = ""
|
||||||
for nucleon, orbital in self.nucleons_with_orbital:
|
for nucleon, orbital in self.nucleons_with_orbital:
|
||||||
@@ -129,7 +121,7 @@ class PreparationScreen(Screen):
|
|||||||
left_new -= 1
|
left_new -= 1
|
||||||
if left_new >= 0:
|
if left_new >= 0:
|
||||||
atoms_to_provide.append(i)
|
atoms_to_provide.append(i)
|
||||||
logger.debug(f"ATP: {atoms_to_provide}")
|
logger.debug(f"传入原子对象: {atoms_to_provide}")
|
||||||
from .memorizor import MemScreen
|
from .memorizor import MemScreen
|
||||||
|
|
||||||
memscreen = MemScreen(atoms_to_provide)
|
memscreen = MemScreen(atoms_to_provide)
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ class ClozePuzzle(BasePuzzleWidget):
|
|||||||
for i in self.ans:
|
for i in self.ans:
|
||||||
self.hashmap[str(hash(i))] = i
|
self.hashmap[str(hash(i))] = i
|
||||||
btnid = f"sel000-{hash(i)}"
|
btnid = f"sel000-{hash(i)}"
|
||||||
logger.debug(f"建立按钮 {btnid}")
|
|
||||||
yield Button(i, id=f"{btnid}")
|
yield Button(i, id=f"{btnid}")
|
||||||
|
|
||||||
yield Button("退格", id="delete")
|
yield Button("退格", id="delete")
|
||||||
|
|||||||
Reference in New Issue
Block a user