首页 » 博客 » 2026年5月 · 最近在干些什么 [切换主题] [English]

2026年5月 · 最近在干些什么

统计、表情、SEO、评论、MD


统计页 & 访客计数器

  • ASCII 热力图 & 世界地图

四月底脑子一热,决定给博客做个统计页面。最开始只想画个按小时分布的热力图,后来需求越加越多:按天柱状图、月度趋势、爬虫来源、访客忠诚度……

ASCII 世界地图。用了 DB-IP 的免费城市级 IP数据库(800 万行),通过一次文件扫描批量解析访客 IP的经纬度,然后用密度字符叠加到 map.txt 上。

  • 访客计数器 GIF

用 Pillow 生成了一个 88×31 像素的 LED 七段数码管动画计数器。12 帧循环、扫描线滚动、辉光效果、呼吸灯。每次首页访问自动更新计数并重新生成图片。逻辑独立在 scripts/counter.py

  • 服务器资源监控

加了 psutil 读取 CPU、内存、磁盘、运行时长,没装 psutil 也有 ctypes 回退方案。

SEO 全面优化

  • HTML 4.01 Transitional DOCTYPE,<html lang="zh/en">
  • 每页独立 <title>、自动生成 <meta description>(正文首段提取)、<meta keywords>(标签提取)
  • <link rel="canonical"> + <link rel="alternate" hreflang="..."> 中英互链
  • Open Graph + Twitter Card 完整标签
  • 全站 <font size="6"> 自动包裹 <h1><font size="5"> 包裹 <h2>
  • 面包屑导航(首页 > 博客 > 文章标题)
  • Sitemap 重写:14 → 47+ URL,含 changefreq / priority
  • security.txt + /.well-known/security.txt(RFC 9116)

IE 5.5 兼容性审查

五月初用 AI 做了全站兼容性审查,扫出 30+ 处不兼容项:rgba()display:flexbox-sizingoverflow-x/yplaceholderquerySelector 等。形成审计文档和博文。核心 JS(留言板、编辑器)已做好 IE 5.5 双路径回退。

留言板改进

  • 楼号系统:每条留言有绝对楼号 #N,灰色显示在右侧
  • 回复引用:点击回复按钮插入 @xxx[#N],构建时自动剥离引用号
  • 屏蔽词data/runtime/banned_words.json 定义,自动替换为 <em>*</em>
  • changelog 转义:构建时 HTML 转义,防止 <font> 标签污染页面

文章评论系统

给每篇博文加了评论区,A+B 混合模式:CGI 处理提交 + 构建时注入已有评论。支持楼中楼(无限嵌套)、表情、IP 开关。提交后 302 跳回评论区锚点,后台异步构建。页面底部的 page-* 独立页面也有评论区。

邮件系统优化

  • 后台异步发送:之前 @回复 发邮件是同步的,用户提交留言后要等邮件发完才能看到页面跳转。现在改成了独立进程后台发送(mailer.py)。
  • 表情在邮件中渲染[em07] 转成 <img> 标签指向服务器上的 GIF。
  • 邮件 HTML 模板提取:邮件模板独立为 src/components/cgi/mailer-email.html,用 {变量} 占位符。

Markdown 博文支持

全站 50+ 篇博文和独立页面全部从 HTML 转为 Markdown。创建了 scripts/md2html.py 转换器——支持标题/粗体/斜体/代码/表格/脚注/引用/图片。构建时自动检测 .md 后缀并转换。旧的 HTML 源文件归档到 src/archive-html/。MD 和 HTML 可以混用。

Web 服务器优化

  • HTTP/1.1 + keep-alive(单连接复用)
  • ThreadingMixIn 多线程(请求并行,不再排队)
  • 静态资源强缓存:Cache-Control: max-age=86400 + Expires: 2030
  • 启动参数 nolog nocount
  • 路由表重构,/.well-known/ 支持

项目结构整理

  • data/ 分层:runtime/(手工维护)build/(自动生成)comments/ logs/
  • assets/images/backgroundsassets/images/bg
  • 所有脚本迁移到 scripts/.cmd 入口统一
  • changelog.txtdata/logs/changelog.log
  • 外部资源本地化(mirror-external.py),去掉 preconnect 外链
  • counter.pybanned_words.py 等新脚本独立拆分

其他

  • 统计页排除指定 IP(180.154.121.226)
  • 404.html 统一为 HTML 4.01 标准
  • 编辑器路径修正(pages/blogblog
  • 全站图片 max-width:100%;height:auto; 防溢出
  • 博文数量上升至 50+ 篇,sitemap 同步覆盖
  • RSS 改为从编译好的 dist 页面提取标题+副标题

留言板表情系统

  • 像素风 GIF 表情

留言板加了 20 个像素风表情。点击输入框下方» 表情折叠面板, 展开选择,也支持手动输入 [em01][em20]。存储时以代码保存,网页和邮件中都会自动转成图片显示。

表情面板默认不加载图片(JS 延迟生成),省了 20 个初始 HTTP 请求。

  • 表单紧凑化

留言板表单从分散的 label+input 改成了 HTML table 表格布局,Name/Email/内容/显示IP/发送按钮全部在一个 125px 宽的格子里。表情面板通过折叠节省空间,1px CSS 边框替换了原来的 2px 默认边框。

邮件系统优化

  • 后台异步发送

之前 @回复 发邮件是同步的,用户提交留言后要等邮件发完才能看到页面跳转。现在改成了独立进程后台发送(mailer.py),通过 stdin 传递内容,subprocess.Popen 启动后立即返回。

  • 表情在邮件中渲染

邮件正文里的 [em07] 现在会转成 <img> 标签指向服务器上的 GIF,收到邮件的人也能看到表情动画了。

日志系统重构

  • 统一归类管理

之前各模块的日志散落在不同位置,现在全部归到 data/logs/ 下:


data/logs/
├── access/          ← 服务器访问日志(每日 .log,旧日志 .gz 压缩)
├── guestbook.log    ← 留言板操作(@提及、SMTP 状态)
├── editor.log       ← 编辑器操作(新建/编辑/删除、认证失败)
├── search.log       ← 搜索关键词 + 结果数
├── toolbox.log      ← 工具箱使用记录
├── build.log        ← 构建记录(页面构建、全站重建)
└── error.log        ← 跨模块错误

创建了统一的 logger.py 模块,所有 CGI 脚本通过它写入对应分类日志。

性能优化

  • 外部徽章图片加了 loading="lazy",不阻塞首屏渲染
  • 表情面板的 20 张 GIF 也改成了 loading="lazy",首屏请求减少 20 个
  • header 加了外部域名 preconnect 预连接提示
  • 侧边栏评论区锁定 700px 宽度,防止长内容撑破布局

其他小改进

  • web 服务器改为白名单路由,敏感目录(data/、scripts/、src/)统一 403
  • 全站添加 <!DOCTYPE html> 声明,告别 Quirks Mode
  • editor.py 增加操作审计(谁在什么时候改了什么文章)
  • 构建脚本增量缓存改用 MD5 内容哈希,组件变化能正确触发全站重建
  • 博客编辑器、搜索引擎、工具箱全部接入了统一日志
  • 更新了 README 文档,补充了所有新增功能的说明

阅读模式模式

五月初做了一个大功能:给每篇博文和独立页面生成阅读模式版本。

  • 双主题切换:普通版是 90s 霓虹暗色主题,点击面包屑右侧 [阅读模式] 切换到浅色阅读版。阅读版米白背景 #f4f4ec、深灰文字、经典蓝 #3366cc 链接,字体从宋体换成了 Georgia 衬线栈。
  • URL 目录化:阅读版 URL 用 /read/ 目录前缀,不再像早期那样用文件名前缀。/read/blog-xxx/en/read/blog-xxx,结构清晰,切换模式不会跳出当前语言。
  • 布局差异:普通版 980px 三栏,阅读版去掉了右边栏和 banner,内容宽度从 700px 扩到 840px。博客/页面保留左侧 TOC 目录栏(140px),首页则 840px 内容居中,没有空目录栏。
  • 阅读版自有组件reading-header.htmlreading-footer.htmlreading-sidebar-left.html 等五个阅读专用组件,和 90s 组件完全独立。阅读版去掉留言板、更新日志、评论区、8831 友链,只留文章内容和 TOC。
  • 归档 & 标签页也有阅读版/read/archive/read/tags,同样是浅色主题。generate-archive.ps1 在生成普通归档后自动生成阅读版本。
  • 面包屑统一:普通版和阅读版面包屑都是 table 左右布局——左侧路径 首页 » 博客 » 标题,右侧 [阅读模式/返回原版] [English/中文] 两个按钮。普通版 90s 霓虹色系,阅读版深蓝 #3366cc
  • 链接自动重写:阅读版构建时把正文里指向普通版的 blog/page/archive/tags 链接自动改成 /read/ 版本,用户不会点着点着跳出阅读模式。

IP 偏好系统

为了让模式切换"记住",做了服务端 IP 偏好记录:

  • 无 JS / 无 Cookie:偏好记录在 data/runtime/ip_prefs.txt,格式 IP|mode=read|lang=en。访问 /read/<em> 自动记录 mode=read,访问 /en/</em> 自动记录 lang=en
  • 内联处理?set_mode=normal?set_lang=zh 参数服务端处理完偏好记录后直接返回页面,不发重定向——避免 IE 5.5 重定向卡死。
  • MSIE 跳过 303:IE 5.5 每个重定向都要重建 TCP 连接,极慢。服务端检测到 MSIE UA 后跳过所有偏好重定向,IE 5.5 用户手动点 [阅读模式] 切换。
  • _pref_handled 标记:偏好处理完后跳过 .html→clean URL 重定向,防止出现 "点返回原版 → 301 到 clean URL → 又触发 IP 偏好 303 回到阅读版" 的死循环。这个 bug 浪费了很多时间才定位。

字体系统改进

  • 阅读模式正文 face 统一:构建时把 md2html.py 生成的 face="'宋体',SimSun" 替换为 face="Georgia, '宋体', SimSun",保证阅读模式下通篇都是衬线字体。
  • 代码等宽字体:阅读模式 <code> 标签字体栈 JetBrains Mono → Georgia → 宋体 → SimSun → monospace。CSS 和 face 属性双写,现代浏览器走 CSS,IE 5.5 走 face 属性。
  • 颜色剥离精细化:之前阅读模式一刀切去掉所有 color 属性和 color: 样式声明,结果把面包屑和页脚的灰色也去掉了。现在只剥离 90s 荧光色(#ff66cc#ccffcc#00ffff#ffff00khaki 等),面包屑 #999999、页脚 #aaaaaa 不受影响。

页面细节优化

  • Banner 仅首页显示:博客和独立页面去掉顶部 960×182 横幅,内容直接以面包屑开头,阅读区域更紧凑。
  • 资源许可页面:新建 /resources-license,列出了本站使用的全部字体(宋体、Georgia、JetBrains Mono 等)、软件(Pillow HPND、psutil BSD、Python PSF)、友链徽章来源、音频声明、CC BY-NC-SA 4.0 许可全文。页脚加上了链接。
  • 语言切换修复:英文首页的归档链接之前硬编码指向 /archive.html(中文归档),改成了 /en/archive.html。阅读版链接重写规则修了顺序 bug——中文正则先执行误匹配了 /en/ 英文路径。

代码质量

  • 三个核心文件加满注释web_server.py(~565 行)、build.ps1(~930 行)、rebuild-all.ps1(~230 行)全部加了分段注释,标注了每一步的输入输出、边界条件和设计决策。方便后续维护和重构。
  • PowerShell $? 自动变量陷阱"$var?param=value" 中的 ? 会被 PowerShell 解析为 $? 自动变量,导致字符串后面部分被吞掉。改用字符串拼接 $var + "?param=value" 避开。
  • PowerShell $var.html 属性访问陷阱"$originalPage.html" 会被解析成 $($originalPage.html) 即访问字符串的 .html 属性,返回 $null。改用 ${originalPage}.html 或直接拼接。

独立留言板页面

  • 全量展示:新建 /guestbook.html 独立页面,展示全部留言(不限于侧边栏最近 20 条)。980px 居中布局,无左右侧栏,留言框风格对齐主页侧边栏。
  • 表情面板横排:去掉了表格布局,20 个表情图标横向排列,点击插入。
  • 导航简化:面包屑 首页 » 留言板 + [English],去掉切换主题,底部加返回主页按钮。
  • 回复功能完整@用户名[#楼层] 格式,表情插入,IP 显示开关。

IE5.5 不兼容功能清单

新增独立页面 /page-ie55-incompatible,诚实列出全站 22 项不兼容 IE5.5 的功能(CSS 11 项、HTML 7 项、JS 4 项),附带完整技术栈总览和分层退化兼容策略。

邮件通知修复

  • mailer.py 路径错误data/guestbook.txtdata/runtime/guestbook.txt,修复后 find_email() 能正确读到留言数据
  • extract_mentions 用户名污染@DragonRSTER[#50]@(\S+) 正则把 [#50] 也抓入用户名,导致 find_email_by_name('DragonRSTER[#50]') 找不到人。改为匹配后自动 strip 末尾 [#N]
  • guestbook.py 新增 target_email 直接传参给 mailer,避免二次查文件

侧边栏改进

  • Sticky 定位:全部 9 个侧边栏(含阅读模式)加 position: sticky; top: 10px,滚动时始终保持在视野内。IE5.5 不支持,退化为正常滚动
  • 回顶按钮:4 个右侧栏底部加 ↑ 回顶部 链接,header 加 <a name="top"> 锚点
  • 左侧栏全部留言入口:表情行右侧加 全部留言 链接,指向独立留言板页面

英文首页与页面细节

  • 新建 src/content/index/index-en.html,英文首页完整翻译
  • 修复普通模式页面面包屑"页面"无超链接(指向 /archive.html
  • SEO 元数据 + Open Graph + canonical/hreflang 自动生成

—— 写于 2026 年 5 月 14 日



昵称
内容

« 西数HC620食用指南 返回主页 我与ThinkPad »