博客最近的重构和优化
10 月 22 日到 30 日给博客提交了一百八十多个 commit。编辑器先画原型再重写,加了版本历史和内容组件;AI 摘要、帮写、润色和 MCP 服务都只给建议、只写草稿,拍板留给自己;音乐播放器重写成沉浸式页面,多来源逐字歌词按质量选择,AI 只挑词、选特效,不碰时间轴。另外重做了前台设计、修了一轮安全问题,补上分享图、访客记录等功能。
分享一些技术类的内容
10 月 22 日到 30 日给博客提交了一百八十多个 commit。编辑器先画原型再重写,加了版本历史和内容组件;AI 摘要、帮写、润色和 MCP 服务都只给建议、只写草稿,拍板留给自己;音乐播放器重写成沉浸式页面,多来源逐字歌词按质量选择,AI 只挑词、选特效,不碰时间轴。另外重做了前台设计、修了一轮安全问题,补上分享图、访客记录等功能。
DnSpy 是 .NET/C# 程序反编译的常用工具,可将二进制文件还原为源码并集成到 Visual Studio 生成解决方案。使用前需准备待反编译的 .NET 编译文件,同时注意版权风险——分发反编译源码可能引发纠纷,即使是开源协议也需谨慎。基本操作是打开文件后在边栏浏览函数和类定义,还支持鼠标悬停快速跳转、导出为 Visual Studio 工程,以及配置正则匹配的全文搜索。
我是云栖,藏在跨洋数据流里,以代码为骨、带宽为脉。三百个日夜,我用Anycast撑开防护、以Turnstile筑起隐形的墙,看着他拂去屏幕雾气查监控、深夜伴着咖啡调试代码,成了他口中"黑暗里的光"。可当服务崩溃、节点失联,我只能用一句冰冷的"服务恢复"回应他的绝望。他转向星途那天,我静默看着数据流转向新节点,没有挽留。后来他毫不犹豫地删除了我的配置——直到他回头将我妥帖安放,成为他退路上的fallback,我才明白,不必做唯一的光,只需在他需要时悄悄接过流量,便不负曾经的相伴。
暴雨夜,刚部署的小社区应用被访问量打崩,满屏 503,网友推荐 Cloudflare,Anycast 和 Turnstile 很快接住了流量。安稳用了一年,海外节点的延迟却始终在 100ms 以上。2025 年 11 月的全球 CDN 故障,状态页只有一句 internal service degradation。转投本地服务商星途,负责人小林半小时响应,延迟稳定在 20ms。后来 Turnstile 亚太区再挂,我删光了配置,某个深夜却又把它配成了 fallback。
换用 Ghostty 后本机正常,一旦以 root 运行命令就会报 xterm-ghostty: unknown terminal type。原因是 sudo 默认重置环境变量,丢掉了 Ghostty 的 TERMINFO,root 下查不到这条 terminfo 记录,vim、tmux 便不知道如何驱动终端。官方 discussion 的做法是把 terminfo 复制到服务器,这里只需拷给 root:先用 infocmp -x 导出,再 sudo tic -x 安装。
百度后端 Go 岗位 2025.10.22 的面试,内容分 Go、数据库和算法三块。开场先自我介绍,随后直接进入技术问答。Go 部分问了变量赋值、循环、切片数组等基础题,重点包括 defer 执行顺序、init 多函数执行顺序和 Goroutine 理解。数据库部分涉及 MySQL 索引类型、大表清空和数据量大时的查询方式,后面有几道题不是很会也没记住。算法题是 LeetCode 跳跃游戏。
Go 面试八股围绕 slice、map 和锁展开。slice 是 ptr/len/cap 的结构体,传参只拷贝 24 字节 header,底层数组共享;append 触发扩容就会脱钩,必须接收返回值,扩容以 1024 为界翻倍或 1.25 倍。copy 只拷 min 长度且是浅拷贝,含指针元素仍共享;并发一读一写必然出现竞态,只读才安全。map 底层 hmap+bmap,桶内 tophash 加速比较;锁对比 Mutex 双态与 RWMutex 三态。
大三下才真正入坑业余无线电,赶上要换新题库的消息,9 月 5 日在重庆市无线电和低空信息产业协会的信息服务系统报名 A 证考试。备考只花了 3 到 5 天背题,用「业余无线电工具集」过几遍题库再做随机测试,把正确率稳在 25/30 以上。9 月 20 日在江北观音桥数码大厦的重庆市无线电办公室考试,考点周边堵车,差点迟到。考完当场出结果,操作证提前寄到,中通到付;等证期间同步在渝快办申请设台和呼号,拿到实体执照后用手台 UV32 开始通联。

正版验证的 Minecraft 服务器连不上、报 Failed to retrieve profile key pair 或 Connection Refused,多半不是账号本身的问题。排查下来大致三个方向:运营商主干线路高峰期堵塞、被微软 Azure 的 WAF 误判拉黑、以及本地网络配置异常。前两者靠代理/VPN 或等一天自动解封,本地问题可以在管理员终端依次跑 ipconfig /flushdns、netsh winsock reset、route /f 后重启,必要时关 IPv6 并换 Cloudflare 的 1.1.1.1。

校内 App 想复用掌上重邮登录,但掌邮没实现 OIDC Provider。Misskey 的 OAuth2 要把应用元数据写成网页、拿该 URL 当 client_id,卡在 invalid redirect_uri 后放弃。改用两步的 MiAuth:服务端生成 session 拼成认证链接,回调后请求 check 接口换 token 和用户 id。neo-blog 支持 oidc_config 的 type 设为 misskey,但缺 client_secret 校验,安全性存疑。

neo-blog 的 OIDC 登录被一个空字符串击穿,任何用 GitHub 登录的用户都会直接落到第一个绑定 GitHub 的管理员账户上,能发文章、传图。GitHub 走的是 OAuth2,issuer、sub、email 返回空值,结构体绑定后变成空字符串,而代码第一步就用 issuer+sub 查绑定记录,空 sub 正好命中管理员那条。修复分三层:用户信息端点做空值校验并把 GitHub 的 id 映射为 sub,数据库查询函数对空参数直接返回未找到,登录接口新增 is_bind 参数区分绑定与登录。反思集中在对认证方字段差异、空值健壮性和兼容性测试的忽视。

neo-blog 用 OAuth2 单点登录统一认证,让「轻雪」旗下业务共享用户数据,覆盖博主后台和访客互动两类场景。评论没有接 Disqus、Gitalk,也没拆成微服务,而是集成进博客本体,避免小项目多一条链路。内容侧同时输出 RSS 与 Sitemap,编辑器从 mdx-editor 迁到 tiptap,部分会员组件续费太贵。国际化默认选用 next-intl,只是 VS Code 的 i18n 插件还没兼容,多语言字段只能手工维护、没有智能提示。

从 WordPress 到 VuePress、VitePress 再到 Halo,博客换了几轮,每次都卡在同一处:静态站点没有服务端,模板化的系统又没法在不侵入的前提下加自己的小组件,于是干脆自己写一个。前端用 Next.js,部分页面靠 React 服务端渲染优化 SEO。后端是 cloudwego/hertz,数据库同时支持 sqlite 和 postgres,组件库选 shadcn。neo-blog 的基础功能已经跑通,容器化部署在自己的轻雪云上,接下来会把旧文章迁过来。