碎碎念
发 GET 请求不应该改变状态吗?
大多数时候我认同这种观点,但是偶尔有时候也会“叛逆”一下。
以前的博客在点击“发表新文章”的时候,不会有任何“新建”动作,会等到第一次提交保存的时候才会真实创建。这样很好,可以保证每个“文章编号”都是存在的、有意义的、连续的,对我这种有洁癖的人很适用。
但是有时候也会遇到麻烦:
-
文章没真实创建,第一次提交保存之前的上传的图片不知道保存在哪里。
为了引用图片方便,我的图片是跟文章编号绑定的。而不像多数大家一样用图床、不分文章。
类似的小问题挺多,总之就是要区分是“新发表”还是“更新已有的”。
我现在改进了这个做法:
- 在点击“发表新文章”时,自动创建一篇空文章;
- 拿到文章编号,重定向到“/editor?id=1677”;
这就相当于“更新”一篇已经存在的文章,代码里面少了很多类似“判断文章是否存在”的代码,逻辑清晰了很多。
当然,这也引入了另外一些问题:
- 经常会产生“[私密]无标题”这样的尚未发表的文章。目前没有想到很好的办法解决这个问题,那就先拖延。
- 按理说第一次编辑才是发表新文章,但是文章的发表时间却是创建空文章时候的。应该怎么区分?
等等,我怎么感觉没有在说 GET 应不应该改变状态的事?(逃……
找到了,代码里面有这样一行:
1
|
|
以及实现部分:
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 |
|
我为了懒得写 <form> 发 POST 请求,所以“发表文章”实际上是个 GET 请求。感觉不是一个好习惯。
差点以为 js 没有能用/好用的图片预览库……
原来这玩意儿叫 lightbox(灯箱)?不是什么 zoom / swipe……
看了一圈,也不好用。比如不易改装成支持 Live Photo,还得我自己下手写。
Finally,火狐是终于把代码迁移到了 GitHub
没错,早年我还很想研究浏览器的时候多么希望 Firefox 把代码迁移到 Github,而不是用没几个人知晓的 hg(mercury)。虽然现在没研究浏览器了,火狐仍然是我多年来唯一一直使用的浏览器。看到它能做出如此“进步”我觉得仍然是一件“好事”1,嗯。
- Mozilla Firefox – Official GitHub repo | Hacker News
- mozilla-firefox/firefox: The official repository of Mozilla's Firefox web browser.
- Firefox moves to GitHub : r/programming
火狐(Firefox)或者谋智(Mozilla)不知道最近在搞什么,我没太研究。总之给我的感觉就是……好像不那么……老态龙钟了。这不,前几天才刚夸完它:《我可太喜欢火狐的这个版本的外观了》。
-
“1. Linus 创造了 Git 版本管理系统,它是一个去中心化的系统;2.GitHub 是一个基于 Git 的中心化的系统。” ^
周报
Semantic Linefeeds
An essay advocating a practice from early in UNIX history: putting line breaks between sentences or phrases instead of when the line simply reaches a certain length, if you’re writing marked-up plain text that will be reformatted before the user reads it. The habit makes it easier to navigate, edit, and rearrange text.
使用 GET 还是 POST 的讨论
https://x.com/Blankwonder/status/1922329516254560525
我保留我的意见:GET 我当然会继续使用。完全使用 POST 绝对是极端,前端有无法避免、必须使用 GET 的时候。
第一次见到 .zip 后缀的域名
https://connor.zip/posts/2025-05-03-rune
字符串与长度限制
又见一篇关于 Unicode/字符/字符串长度限制 的文章,非常长:The best – but not good – way to limit string length | adam-p。
当然,先前还有一篇非常好的:(译)2023 年每个软件开发者都必须知道的关于 Unicode 的基本知识 | 新世界的大门。
以及一个生成“长草”文字的在线工具:Zalgo Text Generator - Create Glitchy Text Online。
浏览器会阻止访问一些特定端口
Ports that are blocked by browsers – Keenformatics – A (not so) tedious blog about informatics.
老早之前写 SSH 代理的时候就遇到过:尝试在浏览器中打开 localhost:22 就会报错,无法访问。
没想到社区用得最多的 go-yaml 库竟然停止维护了
链接:https://github.com/go-yaml/yaml。
新宠:https://github.com/goccy/go-yaml。
用得有多广泛?至少很多重量级项目都是用的它,包括但不限于 K8s、Docker……
看了一眼新宠,第一眼确实感觉舒服很多,特别是错误输出,以及对标准的支持。
当然,对 Yaml 标准的支持我是不抱太多希望的,真的是够用就好。毕竟,Yaml 标准真的是太奇葩了,对动态语言来说,我觉得是火葬场般的存在。原项目通过了 295/402 个测试,新项目通过了 355/402 个测试。
这就换新。
写了这么多年 Go 刚刚才知道以 _ 和 . 开头的文件/目录不会被 go test ./... 执行……
1 2 3 4 5 6 7 8 |
|
真是离了大谱。手动执行某个单测不通过的时候才发现,一度非常震惊🤯,每次 CI 是怎么跑成功的?原来如此!天杀的。
更离谱的是,我自己也不知道是哪里学来的规矩,明明自己也这样写1:
355 356 357 358 359 360 361 362 363 364 |
|
我是草台班子。
难怪经常在火狐浏览器里面见到“Chrome”,这难道只是我想混淆的吗?
Chrome1
在浏览器中,chrome 指除了网页本身以外任何可视的部分(如 UI、工具栏、菜单栏、标签)。不要将这个术语与 Google Chrome 浏览器混淆。
数据库的大字段放前面为什么会导致10倍的性能差?
在 SQLite3 数据库里面存了比较大的二进制数据,后面又追加了一个小字段数据到最后。一个现象是:查询此大二进制数据前面和后面字段竟然有 10 倍的性能差距(前者性能更好)。
1 2 3 4 5 6 7 8 9 10 11 |
|
本地非冷启动测试,取了多次测试的结果,均如上。服务器上能夸张到几秒到几分钟的差异。
差不多 1500 条数据,升级服务器的数据库居然花了七分钟,这能忍?
1 2 3 4 5 6 |
|
当然,升级后服务器也降到了 0.1 秒内。
奇奇怪怪。
好了,原来我是狗🐶
:dogsbody 是什么意思?跟 dog 有什么关系?
ChatGPT:
“dogsbody” 这个词听起来像是和狗有关,但其实它有点讽刺意味,和“dog”只是间接有关。
🧾 词义解释:
dogsbody(英式英语,口语)指的是那种在单位里被安排去做杂活、没人想干的苦差事的人,也叫“跑腿的”、“打杂的”。
类似中文说的:
- 打杂的
- 小喽啰
- 工地搬砖的(比喻)
- 端茶倒水的实习生 😅
🐶 跟“dog”有什么关系?
“dogsbody”这个词起源于英国海军,原来指的是一种很难吃的海军食物 —— boiled peas pudding(豌豆泥糊糊),大家嫌弃这个东西,就叫它“dog's body”(狗的食物)。
后来,这个词被用在海军里的年轻新兵身上,指那些被派去做苦差事的“可怜人”,因为他们地位低下,就像“吃狗粮”的人一样可怜。
久而久之,“dogsbody”就变成了指“干苦活但不受重视的人”。
💬 举个例子:
“As an intern, I was just a dogsbody making coffee and photocopies all day.”
“当实习生的时候,我整天就是打杂的,泡咖啡复印文件。”
如果你在英剧、英式口语或办公室环境里看到这个词,基本就是指那种“啥活都干的底层员工”。
这是不是所有头戴式耳机🎧的宿命?
天杀的,苹果说刘亦菲是我朋友
哈哈,没有标题党。不仅是刘亦菲,还有刘诗诗,刘德华,刘备,刘涛……
可我还是得骂你,某个刘姓的名字我输了几百遍了,你都记不住……
李彦宏:中国人有时候喜欢拿隐私换取便利。

如果服务器声称的 Content-Length 比实际发送的数据大,客户端会直接不显示这不全的数据,而是报错误。有点儿意思,我排查了半天以为是我代码哪里写错了。(数据大小和实际数据分开存的,数据损坏了,所以出现了不一致。)
1 2 3 4 5 6 7 8 |
|
以及:
1 2 |
|
视频压缩原来真的很慢很慢……
尝试把一个十年前的视频(47秒)用最慢的方式压缩了一下,耗时5️⃣0️⃣分钟!
从 46MB 压缩到 2.3MB,肉眼看起来质量不差。选用的格式仍然是我目前最爱的 AV1 编码,容器是 webm(第一次用)。
开了 64 个线程(随手写的,忘记系统是多少核了),内存占用仅 ~300MB,CPU 占用仅 ~250%.
1 2 3 4 5 6 |
|
过程真漫长啊!不得不想得十几年前为了把视频装进 MP4 的年代了,那时候看着“视频转换大师”那个进度条……实在不理解为什么会这么慢,当然,现在也不理解。我以为至少能跟上视频的速度的(1秒时间转换1秒视频进度
)。
看起来 Safari 对 .webm 的支持很差,放弃了,继续用 .mp4(但是编码方式仍然是 AV1)。
热知识,为什么有些 JPEG 图片的 宽x高 是反的?
就像下面这张图一样,一眼过去就知道:宽<高。

但是为什么用 exiftool 看的时候显示却怪怪的?
1 2 3 4 5 |
|
插曲:本来是准备拿当前页面上显示的图片为例子说明为什么图片显示正确/错误了。然后马上醒悟到:我马上就会改掉这个 bug/feature。这会导致文章不匹配。于是决定不写这段了。
结论:相机📷在为了拍照时更快速地存储图片,不管是横拍还是竖拍,都会以同样的数据存储。只是再加了一个 Orientation 元数据字段表示图片应该如何旋转后才能作为最终的展示图片。
结论2:经过一些转换工具转换后,可能会有一个 Rotation 元数据,意义和 Orientation 非常相似,也是表示“旋转”。
上面这张图的结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
其中的 CW 我猜是 ClockWise(顺时针) 的缩写,意即最终需要顺时针旋转 90°.
那么问题来了,我这张照片肉眼来说不是“挺正”的吗?
可能的 Orientation 值
| 值 | 名称 | 说明 | 显示方向 |
|---|---|---|---|
| 1 | Horizontal (normal) | 正常方向,无需旋转 | 🔼 顶部朝上 |
| 2 | Mirror horizontal | 水平翻转 | 🔁 左右颠倒 |
| 3 | Rotate 180 | 顺时针或逆时针旋转 180° | 🔽 顶部变底部 |
| 4 | Mirror vertical | 垂直翻转 | ↕️ 上下颠倒 |
| 5 | Mirror horizontal and rotate 270 CW | 水平翻转后顺时针旋转 270°(等于左旋90°+镜像) | ↙️ |
| 6 | Rotate 90 CW | 顺时针旋转 90° | ▶️ |
| 7 | Mirror horizontal and rotate 90 CW | 水平翻转后顺时针旋转 90° | ↗️ |
| 8 | Rotate 270 CW | 顺时针旋转 270°(等于逆时针 90°) | ◀️ |
看起来 Orientation 和 Rotation 有点费解🫤:
1 2 3 4 5 6 |
|
同一张图片一个是顺时针旋转90度,一个是顺时针旋转270度(逆时针旋转90度)。这两个不是上下颠倒了吗?
吓尿了简直:
- EXIF orientation handling is a ghetto | Dave Perrett
- recurser/exif-orientation-examples: Example images for the various EXIF orientation flags, in both landscape and portrait orientation.
尝试把设置 image-orientation: none1 后,图片向左旋转了 90°;所以大概可以暂时不管 Rotation 的值?🤔
鉴于浏览器能正常渲染并设置尺寸的图片。说明 img.natureWidth2 和 img.natureHeight 很可靠。那么,就让浏览器来帮这个忙了。 参考:/admin/statics/editor.js。但是要注意:这个单位是 CSS 像素。
我可太喜欢火狐的这个版本的外观了
超级喜欢,看起来非常扁平化、干净、紧凑。特别是全屏模式是,更加干净清爽。
这也是我第一次接受标签栏在侧边,竟然异常顺手。

周报(2025-04-15)
✍️ 给 Apple Notes 增加高级编辑功能
苹果手机和电脑均自带且自动同步的笔记应用 Notes,缺乏一些高级/现代的编辑功能,特别是 Markdown 支持。这里有个插件扩展了 Notes 的功能,增加了格式条、Markdown、斜线命令双向链接🔗等功能。
Apple Notes 居然还能支持插件,这么封闭的系统竟然如此“开放”?太让我意外了😯。
这款插件基础功能是免费的,但是未开源。隐私🔏问题可能需要考虑一下。
SMTP 被推荐使用 587 而不是 465 就很奇怪
465端口默认就强制 TLS,而587是选择性开启。我的观点:
- 对于现代社会来说,不支持 TLS 的客户端我觉得应该彻底抛弃。
- 选择性开启 TLS 显然增加了实现复杂度。
- 为了支持旧客户端,还不如继续使用早期的 25 号端口。
- 25 号端口可以发送垃圾邮件,其它端口就不行?
以下是 ChatGPT 的回答。
SMTP 的 465 和 587 端口都是用于发送邮件的,但它们的加密方式不同,适用场景也稍有差异:
🔒 465 端口(SMTPS)——"隐式 SSL/TLS"
- 连接时就加密:一建立连接就是 TLS,加密是强制的。
- 用的是旧的方式:最早由 Netscape 推出(非标准),后来被弃用又重新推荐。
- 比较适合一些老的邮件客户端。
- 在配置里你会看到叫
smtps://或SMTP over SSL。
✅ 适合: 当你明确要用 SSL,并且客户端/服务器都支持 465。
🛡️ 587 端口(SMTP+STARTTLS)——"显式加密"
- 默认是普通连接,之后通过
STARTTLS升级为加密。 - 是现在的 官方推荐端口,符合 RFC 6409。
- 几乎所有现代邮件服务(包括 Gmail、Outlook)都支持。
- 更安全灵活,适合客户端发信和用户认证发送。
✅ 适合: 大多数情况,包括发邮件、登录邮箱账号等,推荐使用 587。
📌 对比总结:
| 特性 | 465 (SMTPS) | 587 (SMTP+STARTTLS) |
|---|---|---|
| 加密方式 | 隐式 TLS(连接时立即加密) | 显式 TLS(用 STARTTLS) |
| 标准性 | 非标准,曾被弃用 | 标准(RFC 6409) |
| 兼容性 | 有些服务不支持 | 现代服务广泛支持 |
| 推荐程度 | 不再首选 | ✅ 推荐用于客户端发信 |
如果你正在写代码或设置发信程序,推荐优先用 587 + STARTTLS。
如果某些客户端或服务器只支持 465,那就用 465 + SSL。
我的建议是不要把小整数存为对象
我觉得整数就已经足够节约内存了,把小整数存为对象肯定更占内存。建议 Python 的优化朝这方面发展。1

周报
任意域名解析:nip.io - wildcard DNS for any IP Address1
这个服务能把任何以 IP 地址为记录名的域名动态解析到对应的 IP 地址,不需要先添加记录。方便为任何 IP 地址设置域名。
内存结构展示2
8️⃣个字节的内存可以存放哪些类型的数据?下图是一些示例。对于刚接触计算机💻、正在了解内存的人来说非常有帮助。

Linux 二进制文件 ELF 格式介绍3
别的不说,我最讨厌 C 语言的一点就是:结构体成员名全部有相同的现在说来没任何用处的无聊前缀。
比如图中的:e_, p_, sh_。
C 语言以前确实是我的最喜欢的语言,后来喜欢 C++,现在是坚定的 Go 派。

域名 whois 查询服务
https://w.is/,网址很短,数据显示还不错。不过好像没有 API 服务。
存储设备及其延迟45
文章中用动画示例清晰地调解了常用读写设备及其延迟特性。

沁恒对于CH32V003升级的芯片CH570,带2.4G无线和蓝牙6
CH32V003是我玩过的第一款RISC-V芯片,之前做智能家居的时候用于替代STC51的。功能很现代,价格极其便宜。
本来还有点不舍51,用了CH32才发现那叫一个爽:比如,可以用上最先进的编译器,而不是51那各种又破又不规范的编译器套件。再也不想碰。甚至还写了一个CH32V003的模板项目。
新上线的这个CH570拥有了2.4G无线🛜功能,要是早点出来就好了。我就不用给 nRF24L01/Ci24R1 写驱动程序了(尽管看起来写得非常漂亮🤩)。

原来,微信视频号不仅没有外链,还有加密🔐
之前在日记2024-03-09.md里面就发现微信的视频号无法外部分享,今天看到别人也提到了这个问题。
视频号很早之前是有链接的,后来为防搬运做了DRM,隐藏链接外加内容加密,隐藏链接经历了几次调整后现在不让用默认浏览器打开,抓包拿到的stodownload.mp4已加密没法播放,废掉了大部分下载器和嗅探工具。不过可能出于性能考虑,视频号只加密了文件头,不像C某TV丧心病狂对ts流做了帧加密78
听起来加密方式很简单,大概和以前的迅雷看看一样9。
以及一个视频嗅探器:putyy/res-downloader: 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载!。
心血来潮,仅用数百行代码实现了我日常高频使用的“RSS 订阅功能1”,用于替换用了近🔟年之久的 Feedly。我的使用习惯很简单:看完最新文章,随手就关闭。从不体验其它功能。
为什么要自己实现?为了管理/自定义方便。
只需要像下面这样在 Markdown 里面一行一个添加订阅源即可自动渲染:
1 2 3 4 |
|
“已读/未读”使用浏览器都有的 a:visited {} 来实现,且自动跨平台同步。
所以,我有时候纳闷,像 feedly 这种替代 Google Reader 的产品如何盈利,护城河在哪里?
一个错误的想法:由于博客现在支持用户系统了,于是想把订阅的每个网站的文章在我的系统内自动创建一篇对应的文章,对于实现来说,是一件非常简单又取巧的事。后来一想,这也太不尊重版权保护2了,遂放弃。
Feedly有哪些不好?
至少目前是我觉得我用得不太爽的地方:
- 代码不能滚动,被强制折行。 作为一个程序员,肯定关注了很多技术博客,难免会有代码在文章中,自动折行的代码看起来非常难受,更别说是小屏幕上了。
- 表格也没有边框,不能滚动。 复杂内容的表格显示简直一团糟。
用CSS很简单就能控制的设置,但是就是没有自定义。
放弃使用霞鹜文楷字体了
因为看起来特别舒服的原因使用了霞鹜文楷一年多?但是最近决定放弃,几个原因:
- 粗体显示很普通,不明显;
- 和英文字体显示起来不匀称;
- 字体太大,加载慢。
第一次见到 HTTP 103 状态码:103 Early Hints1。
网站:https://exiftool.lucasgelfond.online/。
以及,为什么有人的 favicon 有 2.4M 这么大……![狗头 [狗头]](/v3/dynamic/emojis/weixin/doge.png)
周报
Maple Mono 字体
新发布的一款看起来很漂亮的等宽字体,中英文严格 2:1. 其它特性:无限字重、智能连字等。
可惜我不怎么用斜体,它的斜体还是很好看的。
🔨 HammerSpoon
一款可以用 Lua 来编写的脚本引擎,用于控制 MacOS。
回到深圳了,看了下时光机,发现已经离开了近半年……

一直搞不清楚 “Restart” 和 “Reboot” 有什么区别,反正我就是 sudo reboot 一把梭:
┌─────────────────┤ Pending kernel upgrade ├──────────────────┐
│ │
│ Newer kernel available │
│ │
│ The currently running kernel version is 5.15.0-89-generic │
│ which is not the expected kernel version 5.15.0-134-generic.│
│ │
│ Restarting the system to load the new kernel will not be │
│ handled automatically, so you should consider rebooting. │
│ │
│ <Ok> │
│ │
└─────────────────────────────────────────────────────────────┘
┌──────────────┤ Outdated processor microcode ├───────────────┐
│ │
│ Processor microcode update │
│ │
│ The currently running processor microcode revision is │
│ 0x00f8 which is not the expected microcode revision 0x00fe. │
│ │
│ Restarting the system to load the new processor microcode │
│ will not be handled automatically, so you should consider │
│ rebooting. │
│ │
│ <Ok> │
│ │
└─────────────────────────────────────────────────────────────┘
所以 JS 全称的标准写法应该是:JavaScript ? ![狗头 [狗头]](/v3/dynamic/emojis/weixin/doge.png)

一年两箱油终于准备出门了

远程启动记录
为了防止启动小电瓶亏电,不定期启动一下1。
title: 给车充电
dates:
start: 2025-04-14
remind:
every: [1w]
但是该车并不能看到电瓶的当前电量/电压🔋,只能看到动力电池⚡️电量。所以,只能盲目开个10分钟/20分钟空调,以期待其能给小电瓶充充电。
注意
前面有两次充电记录没记录。
注意
五月到七月之间爸爸回过家,手动充过电,暂时没记录。
| 📅日期 | 动力电池电量🔋 | 剩余续航里程🧭 |
|---|---|---|
| 2025-04-14 | 92% | 388km |
| 2025-04-22 | 91% | 369km |
| 2025-05-01 | 88% | 372km |
| 2025-05-15 | 87% | 356km |
| 2025-07-02 | 97% | 407km |
| 2025-07-07 | 97% | 398km |
| 2025-07-14 | 94% | 395km |
| 2025-08-04 | 86% | 365km |
| 2025-08-11 | 85% | 357km |
| 2025-08-25 | 79% | 333km |
| 2025-09-01 | 77% | 325km |
| 2025-09-12 | 76% | 319km |
| 2025-09-23 | 74% | 310km |
| 2025-10-13 | 69% | 278km |
| 2025-10-27 | 65% | 274km |
| 2025-11-03 | 64% | 264km |
| 2025-11-11 | 60% | 254km |
| 2025-11-17 | 57% | 240km |
| 2025-11-24 | 54% | 227km |
| 2025-12-01 | 51% | 213km |
| 2025-12-08 | 48% | 201km |
| 2025-12-15 | 44% | 186km |
| 2025-12-22 | 39% | 163km |
| 2026-01-04 | 33% | 121km |
| 2026-01-13 | 27% | 113km |
| 2026-01-21 | 20% | 84km |
| 2026-01-26 | 13% | 55km |
2026-02-01 找亲戚把电充满了。


