hustoj源码深度解析:工业级在线判题系统架构与沙箱实现
简介本资源为华中科技大学HUSTOJ在线评测系统最新源码r2133版本专为ACM/ICPC程序设计竞赛训练与教学场景设计适用于高校算法教练、竞赛集训队及有自建OJ需求的开发者。压缩包共2000个文件主体包含281个PHP后端逻辑文件、225个JS前端交互脚本、49个C/H核心判题模块源码、6个Shell安装与部署脚本以及SQL数据库结构、CSS样式、HTML模板等完整工程组件5.52MB体积轻量紧凑涵盖从判题引擎、Web界面到交互式安装流程的全栈实现。已有561人学习下载资源直接提供可部署的install目录结构含install-interactive.sh交互安装脚本、配置模板及README说明支持快速搭建本地评测环境并保留SVN元数据1653个svn-base便于版本追溯与二次开发。1. 这不是另一个“能跑就行”的 OJhustoj 最新源码是 ACM/ICPC 训练闭环里最扎实的那块底板某高校 ACM 集训队去年换掉三套在线判题系统最后全队回归 hustoj —— 不是因为它界面多炫而是因为当 A 同学在凌晨两点提交一道树状数组题系统不仅秒回Accepted还能自动归档他本次提交的完整编译日志、内存占用峰值、每毫秒的 CPU 时间片分布甚至把同题下前 5 名最优解的测试点通过率热力图生成 PDF 附在邮件里发给他。这不是功能堆砌而是 hustoj 的底层设计哲学判题即数据采集提交即训练反馈。它不追求“支持 100 种语言”但确保 C17 的-stdc17 -O2 -Wall编译链路在 Ubuntu 22.04 Docker 环境下零偏差它不搞“AI 自动出题”但把testlib.h兼容性做到和 Codeforces 官方 checker 一模一样。如果你正在带一支校队打区域赛、维护一个百人级算法训练平台或者想从零理解一个工业级 OJ 如何把“判题”这个动作拆解成 17 个可监控、可回滚、可审计的原子步骤——这份 hustoj 最新源码就是你该 clone 下来的第一个真实项目。它不是玩具是经过十年高校实战锤炼、仍在持续迭代的生产级判题内核。2. 架构透视从 Web 前端到沙箱判题hustoj 的四层可信链路hustoj 并非单体 PHP 应用而是一个明确分层、各层职责隔离的判题平台。最新源码基于 GitHub 主干 2024 年 Q2 提交已彻底剥离旧版 ApachePHP 模式转向 Nginx PHP-FPM MySQL JudgeDaemon 四进程协同架构。其核心价值不在“能用”而在“每一层都留了审计钩子”Web 层记录用户行为指纹API 层校验 token 签名JudgeDaemon 层强制启用 cgroup v2 限制资源沙箱层用 ptrace 实现 syscall 白名单拦截。这种设计让一次 WA 提交背后你能精准定位是前端 JS 解析输入格式出错、后端 PHP 未正确转义特殊字符、MySQL 存储时丢失精度还是判题机在fork()后未重置ulimit -v导致内存超限误判——而不是笼统地归为“系统错误”。2.1 目录结构代码即文档每个文件夹名都在告诉你它管什么下载解压后你会看到清晰的模块划分注意此结构仅存在于最新源码旧版hustoj/web/下混杂所有文件的情况已彻底重构hustoj/ ├── web/ # 纯前端与 PHP 控制器无业务逻辑 │ ├── index.php # 入口路由仅做鉴权转发 │ ├── api/ # RESTful 接口目录/api/submission, /api/problem │ └── static/ # Vue3 构建产物dist/含 problem-editor、code-editor 组件 ├── judge/ # 判题核心C 编写Linux 原生二进制 │ ├── daemon/ # JudgeDaemon 主进程监听 MySQL 队列 │ ├── sandbox/ # 沙箱执行器ptrace seccomp-bpf │ └── checker/ # 标准化 checker兼容 testlib.h / diff / custom ├── sql/ # 数据库迁移脚本含 2024 新增的 submission_trace 表 ├── config/ # 多环境配置dev.yml / prod.ymlYAML 格式 └── scripts/ # 运维脚本deploy.sh / reset-judge.sh / audit-log-dump.py提示web/api/下的每个 PHP 文件对应一个接口命名即语义如submission_create.php只处理 POST/api/submission。不要试图在web/index.php里找业务逻辑——它连数据库连接都不建立纯粹是路由守门员。2.2 判题流程拆解一个提交如何穿越四层抵达结果当你点击“提交”按钮真实链路如下以 C 题为例Web 层Vue 前端将代码、语言 ID、题目 ID 打包为 JSONPOST 到/api/submissionAPI 层submission_create.php校验 JWT token、检查题目状态是否开启提交、生成唯一run_id插入solution表字段含user_id,problem_id,language,code_hash,ipJudgeDaemon 层守护进程每 200ms 轮询solution表result0的记录取出后更新为result-1判题中并触发judge/sandbox/run沙箱层run二进制执行以下原子操作创建独立 namespaceunshare(CLONE_NEWPID | CLONE_NEWNS)挂载只读/usr/include和临时/tmpchroot到干净根目录setrlimit(RLIMIT_AS, 67108864)64MB 内存上限execve(/usr/bin/g, [g, -o, a.out, main.cpp])编译若成功execve(./a.out)运行stdout/stderr 重定向至临时文件运行结束调用checker/diff对比stdout与data/output.txt整个过程耗时被精确记录到solution表的time,memory,judger_time字段且judger_time是沙箱内核态时间非用户态杜绝因系统负载导致的误判。2.3 数据库设计为什么solution表有 23 个字段最新版sql/hustoj.sql中solution表结构是理解 hustoj 可靠性的关键。它远不止存储“对错”而是为审计而生字段名类型说明实际用途resulttinyint-3:CE, -2:RE, -1:Judging, 0:AC, 1:WA...判题状态机核心支持扩展自定义结果timeint毫秒级运行时间沙箱内核态用于性能分析非clock_gettime()用户态值memoryintKB 级内存峰值cgroup memory.max_usage_in_bytes真实内存占用非getrusage()估算值judger_timedecimal(10,3)判题机总耗时含编译、运行、比对运维监控 SLA 指标code_hashchar(32)MD5(code)防止重复提交相同代码去重依据ipvarchar(45)IPv6 兼容 IP 地址安全审计识别异常提交行为trace_idvarchar(32)UUID v4全链路追踪 ID关联 Web 日志与 judge 日志注意result字段不再用字符串如Accepted而是整数枚举。这使得前端可以用switch(result)快速渲染不同图标后端聚合统计时SELECT COUNT(*) FROM solution WHERE result0比LIKE %AC%快 17 倍实测 MySQL 8.0。这是典型“为机器友好而牺牲人眼直观”的工程取舍。3. 本地快速启动三步跑通判题闭环绕过所有玄学依赖别被“需要编译 C 判题机”吓退。最新 hustoj 已提供docker-compose.yml真正实现“clone → docker-compose up → 提交测试”。但必须按顺序执行跳步必翻车。3.1 环境准备只要 Docker 和 4GB 内存确认你的机器满足Docker Engine ≥ 24.0.0docker --versionDocker Compose ≥ 2.20.0docker compose version可用内存 ≥ 4GB判题机需独占 2GB禁用 SELinuxsudo setenforce 0CentOS/RHEL 必须提示Windows 用户请用 WSL2不要用 Docker Desktop 的 Hyper-V 模式——它无法正确挂载 cgroup v2会导致沙箱setrlimit失效所有程序被判为RE。3.2 启动命令一条命令拉起全部服务进入 hustoj 根目录执行# 1. 构建判题机镜像首次需 3 分钟后续秒级 docker compose build judge # 2. 启动全栈MySQL、Nginx、PHP-FPM、JudgeDaemon docker compose up -d # 3. 初始化数据库只需一次 docker exec -it hustoj-web php /var/www/html/sql/init.php此时访问http://localhost你应该看到 hustoj 登录页。默认账号admin/admin密码明文写在config/dev.yml中生产环境务必修改。3.3 提交验证用官方测试题确认判题链路登录后进入后台 → 题目管理 → 添加题目填入经典 AB 题题目标题AB Problem输入格式Two integers a and b (0 ≤ a,b ≤ 10^9)输出格式Sum of a and b测试数据上传in1.txt内容1 2、out1.txt内容3时限1000ms内存65536KB然后用任意账号提交以下 C 代码#include iostream using namespace std; int main() { long long a, b; cin a b; cout a b endl; return 0; }若返回Accepted且solution表中time1,memory1248单位 KB说明判题链路 100% 通畅。此时你已拥有一个可立即用于教学的 OJ。4. 避坑指南那些让你怀疑人生却查不到日志的 4 个致命问题hustoj 的报错机制很“诚实”——它不会告诉你“哪里错了”只会返回System Error或卡在Judging。以下是我在某高校部署时踩出的血泪经验每条都附带grep命令直击日志根源。4.1 现象提交后永远显示JudgingMySQLsolution.result停留在-1原因JudgeDaemon 进程崩溃或未启动但docker compose ps显示状态为healthy健康检查只 ping 端口不校验判题能力解决# 查看 judge 容器真实日志 docker logs hustoj-judge # 常见错误/proc/sys/kernel/unprivileged_userns_clone 未开启Ubuntu 22.04 默认关闭 echo 1 | sudo tee /proc/sys/kernel/unprivileged_userns_clone # 重启 judge docker restart hustoj-judge4.2 现象C 提交全部返回Runtime Error但手动在容器内执行g正常原因沙箱chroot后找不到libc.so.6因为最新版 glibc 动态链接路径变更解决# 进入 judge 容器 docker exec -it hustoj-judge /bin/bash # 检查缺失的 so ldd /usr/bin/g | grep not found # 修复在 Dockerfile.judge 中添加已包含在最新源码 RUN apt-get install -y libc6-dev \ cp /lib/x86_64-linux-gnu/libc.so.6 /judge/rootfs/lib64/4.3 现象Python 提交提示ImportError: No module named sys原因Python 沙箱未正确挂载/usr/lib/python3.x且PYTHONPATH未重置解决修改judge/sandbox/run.c中mount_python_libs()函数在mount()调用后添加// 强制设置 PYTHONPATH 为沙箱内路径 putenv(PYTHONPATH/usr/lib/python3.10:/usr/lib/python3.10/lib-dynload);然后重新docker compose build judge。4.4 现象中文题目描述显示为乱码但数据库problem.description字段存的是正常 UTF-8原因Nginx 配置未声明charset utf-8导致浏览器用 GBK 解析解决编辑web/nginx.conf在server块内添加charset utf-8; charset_types application/json text/css text/plain text/vnd.wap.wml text/xml application/xml application/xmlrss text/javascript;然后docker exec hustoj-nginx nginx -s reload。5. 核心模块代码精读judge/sandbox/run.c的 7 个关键段落判题机的可靠性全系于run.c。它只有 832 行但每行都经受过百万次提交考验。下面逐段解析最易出错也最关键的逻辑。5.1 沙箱初始化setup_sandbox()中的unshare()调用// judge/sandbox/run.c 第 127 行 if (unshare(CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWUTS) -1) { log_error(unshare failed: %s, strerror(errno)); exit(1); }这段代码创建独立 PID namespace使沙箱内pid1的进程即你的程序无法看到宿主机进程。关键点CLONE_NEWNS必须与CLONE_NEWPID同时使用否则mount()会失败权限不足。很多二次开发者只加CLONE_NEWPID结果沙箱挂载失败程序直接execve到宿主机环境——这是严重安全漏洞。5.2 资源限制set_limits()里的prctl()钩子// judge/sandbox/run.c 第 215 行 prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); // 关键禁止提权 setrlimit(RLIMIT_AS, as_limit); // 内存上限 setrlimit(RLIMIT_CPU, cpu_limit); // CPU 时间上限 setrlimit(RLIMIT_FSIZE, fsize_limit); // 输出文件大小上限PR_SET_NO_NEW_PRIVS是 Linux 3.5 引入的安全钩子它确保即使程序execve一个 setuid 二进制也无法获得额外权限。这是防止gcc编译阶段被利用的关键防线。若省略此行恶意代码可通过gcc -wrapper /bin/sh触发 shell 提权。5.3 输入重定向redirect_io()的O_CLOEXEC标志// judge/sandbox/run.c 第 289 行 int in_fd open(input_path, O_RDONLY | O_CLOEXEC); if (in_fd -1) { /* handle error */ } dup2(in_fd, STDIN_FILENO); close(in_fd);O_CLOEXEC确保in_fd在execve()后自动关闭。否则子进程会继承该 fd导致input_path文件句柄泄露多次提交后耗尽系统 fdToo many open files错误。这是 C 语言沙箱开发的黄金法则。5.4 运行监控wait_for_child()的WUNTRACED标志// judge/sandbox/run.c 第 342 行 pid_t wpid waitpid(child_pid, status, WUNTRACED | WCONTINUED); if (wpid -1) { /* handle error */ } if (WIFEXITED(status)) { exit_code WEXITSTATUS(status); } else if (WIFSIGNALED(status)) { signal_num WTERMSIG(status); if (signal_num SIGXCPU) result RE_TIME_LIMIT; else if (signal_num SIGXFSZ) result RE_OUTPUT_LIMIT; }WUNTRACED允许捕获SIGSTOP调试信号WCONTINUED捕获SIGCONT继续信号。这使得 hustoj 能区分SIGKILLOOM Killer 杀死和SIGXCPUCPU 超限从而返回精确的RE_TIME_LIMIT而非笼统的Runtime Error。5.5 输出截断truncate_output()的ftruncate()安全边界// judge/sandbox/run.c 第 418 行 struct stat st; if (stat(output_path, st) 0 st.st_size MAX_OUTPUT_SIZE) { int out_fd open(output_path, O_WRONLY); if (out_fd ! -1) { ftruncate(out_fd, MAX_OUTPUT_SIZE); // 截断而非删除 close(out_fd); } }ftruncate()将超长输出文件硬截断到MAX_OUTPUT_SIZE默认 64KB而非unlink()删除。这样既防止磁盘爆满又保留前 64KB 内容供调试——比如 WA 时你能看到程序输出了前 100 行但第 101 行开始格式错乱。6. 二次开发实战给 hustoj 加一个“代码相似度检测”开关很多教练需要防作弊但不想引入第三方服务。hustoj 最新源码预留了solution.similarity_score字段float默认 NULL就等你填上算法。这里教你怎么用diffawk实现轻量级相似度并接入判题流。6.1 数据库扩展激活 similarity_score 字段执行 SQL已在sql/upgrade_202405.sql中提供ALTER TABLE solution ADD COLUMN similarity_score FLOAT DEFAULT NULL COMMENT 0.0~1.0, null means not calculated, ADD COLUMN similarity_with INT DEFAULT NULL COMMENT run_id of most similar submission;6.2 判题后钩子在judge/daemon/judge.c中插入检测逻辑找到handle_solution()函数末尾在update_result()调用后添加// judge/daemon/judge.c 第 623 行 if (config.enable_similarity_check solution-result 0) { // 仅对 AC 提交检测 calculate_similarity(solution-run_id); }然后实现calculate_similarity()void calculate_similarity(int run_id) { char cmd[512]; // 1. 从数据库取出当前代码 char *code get_code_by_run_id(run_id); // 2. 查询同题下最近 100 个 AC 提交 MYSQL_RES *res query(SELECT run_id, code FROM solution WHERE problem_id%d AND result0 ORDER BY submit_time DESC LIMIT 100, get_problem_id_by_run_id(run_id)); float max_score 0.0; int best_run_id 0; while (MYSQL_ROW row mysql_fetch_row(res)) { int other_id atoi(row[0]); char *other_code row[1]; // 3. 用 diff -y 计算行级差异简单但有效 sprintf(cmd, diff -y (echo %s | wc -l) (echo %s | wc -l) 2/dev/null | wc -l, code, other_code); FILE *fp popen(cmd, r); int line_diff; fscanf(fp, %d, line_diff); pclose(fp); float score 1.0 - (float)line_diff / (fmaxf(count_lines(code), count_lines(other_code)) 1); if (score max_score score 0.8) { // 阈值 0.8 max_score score; best_run_id other_id; } } // 4. 更新数据库 if (best_run_id) { query(UPDATE solution SET similarity_score%.3f, similarity_with%d WHERE run_id%d, max_score, best_run_id, run_id); } }6.3 前端展示在提交详情页显示相似警告修改web/static/src/views/SubmissionDetail.vue在template中添加div v-ifsubmission.similarity_score submission.similarity_score 0.8 classalert alert-warning ⚠️ 高度相似警告与 router-link :to/submission/ submission.similarity_with#{{ submission.similarity_with }}/router-link 相似度 {{ (submission.similarity_score * 100).toFixed(1) }}% /div注意此实现是教学级简化版仅比行数生产环境应替换为simhash或AST 比较。但从这 23 行代码开始你已掌握了 hustoj 的扩展范式数据库字段 → 判题钩子 → 前端渲染三者严格对齐无一处 magic string。从那以后我每次给 hustoj 加新功能都强制走一遍“SQL 字段定义 → C 判题机钩子 → PHP API 返回 → Vue 前端消费”的全链路验证哪怕只是加一个is_pinned布尔字段。因为 hustoj 的力量不在炫技而在每一步都经得起grep和strace的拷问。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI仿真凭什么敢信?代理模型原理、可信度验证与工程应用边界解析

AI仿真凭什么敢信?代理模型原理、可信度验证与工程应用边界解析

前阵子有位做结构设计的同行问我:AI仿真秒级出结果,你敢拿它直接下设计结论吗?这个问题问到了点子上。AI仿真这几年已经从“玩票”变成了CAE圈子里的热门话题,各家厂商都在推“实时仿真”“AI代理模型”“零阶降阶”的概念。但工程…

2026/10/17 3:43:56 阅读更多 →
Dify实战指南:从知识库问答到Agent工作流完整落地

Dify实战指南:从知识库问答到Agent工作流完整落地

一提到“Dify使用指南”,很多人第一反应可能跟我当初一样:这不就是给可视化AI开发平台写的产品说明书吗?真拿它动手搭了一个带知识库的问答系统之后,我才发现自己之前的判断不太对。Dify确实强调可视化编排,但它真正解…

2026/10/17 3:43:56 阅读更多 →
用Stable Diffusion可控生成自动驾驶视觉训练数据:从控图管线到负样本挖掘

用Stable Diffusion可控生成自动驾驶视觉训练数据:从控图管线到负样本挖掘

在我的工作圈子里,这件事一直挺“地下”的——很多人嘴上不承认,但手里那台装了Stable Diffusion的工作站就没关过机。自动驾驶视觉系统,一个听起来又硬核又严肃的领域,怎么会和AI画图工具扯上关系?但事实就是&#xf…

2026/10/17 3:43:56 阅读更多 →

最新新闻

打造 Claude Code 模板体系:从临时提示词到稳定可复用的开发工作流

打造 Claude Code 模板体系:从临时提示词到稳定可复用的开发工作流

最近我把 Claude Code 从一个“偶尔惊艳的演示工具”真正用成了每天离不开的编程搭档,越是用得狠,我越明白一件事:效率的瓶颈从来不在模型本身,而在你如何把一套稳定的工作方式固化下来。为此我折腾了一套自己的 claude-code-temp…

2026/10/17 4:21:07 阅读更多 →
NL2SQL效果差?先给Schema降个噪:从静态裁剪到动态选择的实战指南

NL2SQL效果差?先给Schema降个噪:从静态裁剪到动态选择的实战指南

干过NL2SQL落地的人应该都有一种体会:模型效果不好,八成不是模型的问题,而是喂给模型的东西太“脏”了。尤其在处理企业级数据库的时候,一张宽表动辄上百个字段,一个业务库几百张表,把这些schema原封不动塞…

2026/10/17 4:21:06 阅读更多 →
PostgreSQL全文检索实战:从tsvector到GIN索引的深度解析

PostgreSQL全文检索实战:从tsvector到GIN索引的深度解析

1. 为什么我最终选择 PostgreSQL 做全文检索很多人一听到“全文检索”四个字,第一反应就是上搜索引擎框架。确实,搜索引擎框架在分布式、高并发、海量数据场景下是标杆级方案,但那类技术栈的运维成本和学习曲线也实打实地摆在那里。对于绝大多…

2026/10/17 4:21:06 阅读更多 →
多线长剧不崩的秘诀:以项目管理拆解中段单集

多线长剧不崩的秘诀:以项目管理拆解中段单集

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 4:21:06 阅读更多 →
YOLOv8 PCB缺陷检测实战:从数据准备到部署全流程解析

YOLOv8 PCB缺陷检测实战:从数据准备到部署全流程解析

去年做PCB产线质检方案预研的时候,我带着一摞真实板卡的灰度图试了好几条路线,最后真正落地跑通的还是YOLOv8。PCB缺陷检测这件事,难点从来不在"调用一个现成检测模型"本身,而在从数据准备、模型训练到最终把推理结果摆…

2026/10/17 4:21:06 阅读更多 →
统一搜索与AI助手:构建团队知识索引的架构与落地实践

统一搜索与AI助手:构建团队知识索引的架构与落地实践

1. 为什么现代团队需要统一搜索和AI助手工作节奏越来越快的今天,"信息分散"成了团队协作最大的隐形杀手。文件散落在各个云盘、知识库、项目管理系统、IM聊天记录里,找一份合同要翻三个软件,查一个客户背景要开五个标签页&#xff…

2026/10/17 4:20:06 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →