碎碎念

陪她去流浪 新建

通关“双人成行”🎮

大概是第一次玩主机游戏。效果非常不错,剧情也很好。

总共花了3️⃣个白天、总共 20 个小时。

据说这个游戏才 ¥39?如果是真的的话,那可太值了!

竟然产生了想买一个主机的冲动,劝劝我!

但是 PS5 真的好丑(讨厌这种奇形怪状的设备)!

没有评论 页首

在成都第一次体验了支付宝的“碰一下点餐”

在其它地方确实没遇到过,体验了一下,解锁后手机靠近就弹出支付宝了,非常方便。比起微信的解锁、等待可操作、扫码便捷得多。

没有评论 页首

省略号用得很好,以后不要再用了

害我白高兴一场。

我也没想到我会一次收这么多快递🤡。

没有评论 页首

在 hugo 的 go.mod 文件里面看到了居然只有域名的 go mod 导入,很奇怪,以前从来没见过:

1
2
3
require (
	gocloud.dev v0.40.0
)

通过 curl https://gocloud.dev/?go-get=1 看到了具体的元数据:

1
2
3
4
5
<html>
	<head>
		<meta name="go-import" content="gocloud.dev git https://github.com/google/go-cloud">
	</head>
</html>

仓库地址在:https://github.com/google/go-cloud,查看 go-cloud/go.mod,package 名字无误:module gocloud.dev

但是这个仓库无法通过 GitHub 的地址下载:

1
2
3
4
5
go get github.com/google/go-cloud
go: downloading github.com/google/go-cloud v0.41.0
go: github.com/google/go-cloud@upgrade (v0.41.0) requires github.com/google/go-cloud@v0.41.0: parsing go.mod:
        module declares its path as: gocloud.dev
                but was required as: github.com/google/go-cloud

而 GitHub 自身的元标签又是如下声明的:

1
<meta name="go-import" content="github.com/google/go-cloud git https://github.com/google/go-cloud.git">

go-import 元标签的格式:

1
<meta name="go-import" content="<import-prefix> <vcs> <repo-root>">
  • <import-prefix>:模块路径前缀,比如 example.com/mypkg
  • <vcs>:版本控制系统名称,常用的是 git
  • <repo-root>:代码仓库的 URL,必须支持克隆,通常是 GitHub、GitLab、或公司内部 git 服务器的地址

所以为什么 GitHub 声明为“github.com/google/go-cloud”还能正确导入?不得而知。

没有评论 页首

以前搞 Windows 的时候特别爱看 Raymond Chen 的 《The Old New Thing》,经常能从根本上把 Windows 的一些本质问题/设计背景和历史展现出来。自从 2018 年开始我不再在 Windows 开发以来,对它的关注度就几乎慢慢变成0️⃣了。现在不仅不想看,而且甚至到了想取消订阅的程度(觉得它干扰了时间线)。哎~~~

2025-6-5 01:59:48

刚看到又发表了好几篇新文章,终究还是把它取关了。若今后还有可能回到 Windows,再关注回来吧。

2条评论 页首

ChatGPT 看起来也不是很擅长前端啊🤔?

我之前说 “不会选中任何 <p>” 是错误的 🙇‍♂️,感谢你指出!

关键是我啥也没干啊,只不过是对它给的答案产生了疑问就多问了一下,它自己就矛盾了。经常看你们说前端太简单、大语言模型对前端非常友好。我是经常能被狗屁通气死😡。不过还好我有甄别能力,不搞什么 Vibe Coding。

first-child 和 first-of-type 有什么不同?

first-childfirst-of-type 是 CSS 中常用的伪类选择器,它们的作用相似但不相同,关键区别在于:

是否要求是“第一个孩子”,还是“某类型的第一个孩子”


🔍 一句话区别:

选择器 匹配的是……
:first-child 某元素是父元素的第一个子元素,不管是什么标签类型
:first-of-type 某元素是父元素中该类型(tag)的第一个,不一定是第一个子元素

📌 举个例子:

1
2
3
4
5
<div>
  <p>第一个段落</p>
  <span>中间的内容</span>
  <p>第二个段落</p>
</div>

1. p:first-child

不会选中任何 <p>,因为 <p> 不是第一个子元素。

第一个例子的p为什么不是第一个元素?

好问题!我们回到那个例子再细看一下:

1
2
3
4
5
<div>
  <p>第一个段落</p>
  <span>中间的内容</span>
  <p>第二个段落</p>
</div>

你问的是:

为什么 <p> 不是第一个元素p:first-child 为什么不匹配?

✅ 其实这个例子中:

1
<p>第一个段落</p>

就是 <div> 的第一个子元素,所以:

p:first-child 会匹配它!✅


🧠 也就是说:

我之前说 “不会选中任何 <p>” 是错误的 🙇‍♂️,感谢你指出!

我尼马。

3条评论 页首

🔐推特现在也支持端到端完全加密了

看起来马斯克已经从政府卸任了,又开始在推特干活了。

虽然没有人跟我聊天💬,但是看到大家都在为隐私努力,就挺高兴。同时也为自己身处在一个毫不关心隐私的环境下而遗憾。

“最先进的”英语原文是“State of the Art”。这个词语是很多年前我在研读 WireGuard 的白皮书📖时认识的,感觉很奇妙。大概也是从 WireGuard 这里我学习到了椭圆曲线1的原理及用法,所有后来需要非对称加密的地方2345,我都优先考虑它,因为它实在是太美妙了。


  1. 包含 X25519、Ed25519 以及 Curve25519. ^

  2. whisper/Whisper/Crypto/Crypto.swift at main · movsb/whisper ^

  3. http2tcp/encryption.go at http-post · movsb/http2tcp ^

  4. 在 SSH 中也使用 Ed25519;既简短强度又比 RSA 高。 ^

  5. 以及一些私有项目也使用了椭圆曲线加密🔐。 ^

没有评论 页首

终于把鼠须管输入法(Rime)给配置好了

刷推的时候看到有个人分享了自己的鼠须管配置,想到这是一个曾经折腾不下 3 次均没有成功的输入法。于是自己再次尝试安装了一下,看看在借助 AI 的情况下能不能给我配置出一个“能用”的输入法。要求不高,能用就行。

没有评论 页首

周报(2025-06-02)

搜索

BM25 & TF-IDF 文本相似度搜索算法

通过分词后计算单词词频的方式搜索相似文本,常用于搜索引擎和相关推荐。

  1. 尝试在博客中添加简易文章推荐功能 - MHuiG

社区

jemalloc 怎么没了😢1

一个听说比C语言标准库更好用的内存分配函数 malloc 的替代。以前还很关注它的,怎么突然归档了?

不过说来奇怪,既然已经归档了,为什么 GitHub 上面还在更新代码提交?🤔

代码原作者发文说明了原因:《jemalloc Postmortem》,没有开源项目的赞助了。

版本管理

chrislloyd/git-remote-sqlite

这个工具能把 SQLite 作为 git 的远程用于推送。所有文件存放在 SQLite 数据库列中,对于小型仓库/小文件版本管理可能是很不错的方式。我博客程序目前的所有图片就是放在一个 SQLite 数据库文件中的,管理起来特别方便。所以看到这个的时候非常兴奋。

1
2
$ git push sqlite://myapp.db main
$ git pull sqlite://myapp.db main
没有评论 页首

连阮一峰都不会好好说话了

来自于《科技爱好者周刊(第 350 期):Java 三十周年》中的两句话:

(4)丹麦继日本之后,成为全世界第二个国家,将退休年龄提高到70岁。

(5)阿联酋成为全球首个国家,为全体公民和居民免费提供 ChatGPT Plus,该服务目前的月费为20美元。

我看到上面这几句话时人都傻了:

  1. “丹麦成为世界上第二个国家”?
  2. “阿联酋成为全球首个国家”?

如果我的语文还算及格的话:除并列句等句式外,通常来说一个句子应该只有一套主谓结构。

像上面这种句子,一句话到底是几个意思?你想让我 get 到几个意思?说一句稍微长一点的复杂句已经这么难了吗?还是读者的水平已经下降到如此低下、以至于连说话的人都要降维兼容了?

当然,评论人也有很多人跟我一样有类似的满脸疑惑。

对象跟这说这两句话看起来很像是直接(用 AI)从英语翻译过来的,但是我持怀疑态度:应该不存在翻译水平这么垃圾的 AI。


然后去翻看了一下同是作者编写的《ruanyf/document-style-guide: 中文技术文档的写作规范》,规范中针对文本/句子提出了如下的建议

(2)尽量使用简单句和并列句,避免使用复合句。

并列句:他昨天生病了,没有参加会议。

复合句:那个昨天生病的人没有参加会议。

这就有点儿意思了。

然而我觉得,用复杂句(不是复合句)来表达听起来舒服多了:

  1. 丹麦成 是 继日本之后 全世界第二个 将退休年龄提高到70岁 的 国家。
  2. 阿联酋 成为 全球首个 为全体公民和居民免费提供 ChatGPT Plus 的国家。
没有评论 页首

Content-Disposition 的优先级真高

因为把文章资源上传到云存储的原因,一些用来测试的 .html 文件也被上传了。云厂商默认给 HTTP 响应头部加上了 Content-Disposition: attachment,然后,我文章中还是按照原先的方式使用:

1
<iframe src="test.html"></iframe>

没想到的是,页面并不会被显示出来,而是被下载⏬了12

好离谱。如果是 <a> 链接自动根据响应头部决定是打开还是下载我可以接受,但这是个 <iframe> 啊,我如果要下载,我写 <iframe> 里面干啥?我用 <a src="xxx" download> 不好吗?

我暂时收回《我把所有私有图片全部加密存储了,因为我不相信国内所有云厂商的职业操守》中的话:

并且,这一切的一切操作,对于前端/用户/文章编辑来说,都是完全透明的,没有任何操作上的不同。

没有评论 页首

去华为体验店近距离感受了一下新出的折叠屏电脑💻

希望花粉不要找到我这里来。
希望花粉不要找到我这里来。
希望花粉不要找到我这里来。

结论(没有照片)

  1. 打字体验我觉得非常一般。双手放在屏幕🖥️上面保持不动的情况下,竟然噼里啪啦地上屏了一堆字符;
  2. 折痕非常明显。表现在亮光线明显的不平整。我觉得认真做产品的企业没脸拿出这样的产品。听说三星的折叠屏做得很好,但是我没体验过,没法对比🆚。当然,如果是三星做出的产品也这般模样,我仍然会疯狂输出的;
  3. 尝试打开终端,导购说不能使用。好的,连终端都不能使用,何来要求 VScode 支持 HarmonyOS 啊?1

然后再体验了一下华为的手机以及三折叠,新手机还是非常流畅的。

可比隔壁的苹果手机和平板流畅多了。安卓阵营确实高刷上得早,破苹果那刷新率肉眼可见的卡帧。


苹果刚出的天蓝色 MacBook Air 真好看啊,教育优惠➕各种Buff叠下来才 ¥5000+,于是买了一台。

男女思维果然有别啊:某人的苹果电脑和几件衣服同时到了,但是试穿了半个小时也没有心思来开箱一下第一台苹果电脑。

电脑:喂,我不要面子的吗?
某人:你还没我的平板贵。

1条评论 页首

看到有人说好的URL设计,那我说说一些糟糕的?

看到文章《Examples of Great URL Design》提到了一些好的 URL 设计,不错。

想起前几天看到另外一个我觉得很丑的 URL 并告诉了它的老板,但是他并不觉得,所以贴一下留个备份:

https://note.mowen.cn/note/detail?noteUuid=BCBcNvPye-MpUJ-cVazio1

这跟 CSDN 的差不多:

https://blog.csdn.net/xxx/article/details/123456789

URL 中包含一堆没用的东西,浪费我硬盘。


其它的,当然,还有 Quora:

https://www.quora.com/What-did-Richard-Feynman-mean-when-he-said-What-I-cannot-create-I-do-not-understand

超级长,并且没有“编号”之类唯一标识。

也省不了 PHP 的 /index.php/some-shit

我一直不认为 URL 应当 SEO 友好,不是还有 <title> 吗,不是还有 <h1> 吗?当摆设是吧。

2条评论 页首

找个大家都能方便使用的手机端的即时通知工具真麻烦👿

之前找的两款开源软件1,整体都还算勉强凑合,都比较难崩。

最不能忍受的是:两款工具都会因为设备关机的时候丢失发送的消息。

刚刚在想,有没有可能把消息推送到微信上?可以,并且找到了开源实现,没想到一分钟我就崩不住了:

看到了吗?是今天!两个小时前!

2条评论 页首

无意发现 Espanso 这个非常优雅的文本替换工具,研究完文档、一切就绪时,发现:不支持中文!,弃。

但是也不会完全无用,暂时先留着继续研究一下。

没有评论 页首

听说“宝安机场”在上个世纪叫作“黄田机场”,之所以被改名是因为后者在广东话里面听起来不雅。但是,为什么同名的路却不改名?

没有评论 页首

我也希望 Markdown 能够支持“内容引用/嵌入”

所谓内容引用1,就是用类似 C 语言中的 #include<> 宏语法把其它地方的内容插入到当前位置。

这种需求在编写表格的时候特别需要:如果表格的单元格内容一旦稍微复杂(比如多于一行),可读/可写/可维护性就是直线下降⬇️。之前还因此实现了类似维斯百科的复杂表格写法,但是效果不尽如我意。2

某些 Markdown 变种支持类似 [!INCLUDE] 的语法插入。但这还属于极端变种/方言,几乎没有其它实现了同样的做法。

刚刚在 StackOverflow 上看到别人有几乎和我完全一样的需求:html - How do I insert a referenced block of text in markdown? - Stack Overflow,所以想写篇随笔记录一下。

很早之前就想过写一个自己的 Markdown 扩展,调研如下:

  1. 考虑到 块引用(blockquote) 是个 Container Block,内部可以包含任意内容。所以,何不基于它来创建一个具名的块引用,然后在其它地方通过名字引用?
  2. 但是,块引用实际上使用 > 语法后面跟踪内容来描述内容,压根没地方插入这个“名字”。尽管可以模仿 Hugo 一样在最后插入形如 {key=value} 的参数/属性块3来到达类似目的,但是我觉得这并不是一个优雅的做法。至少在 CommonMark 标准接受这种做法以前我不太认同。

所以我想提供一种块引用的变体,不用 > 来表示,因为它:

  1. 写起来很麻烦,要对被引用内容的每一行都插入 >,如果编辑器没有块编辑功能,重复操作起来简直是恶梦;
  2. 如果块引用内有类似代码块的复杂缩进内容,这也会是灾难级的编辑体验;
  3. 当块引用内存在另外的块引用时(其又包含代码块时),那画面太美我不敢想像。

最初我想用 """name(见下面划线标记的行;类似 Python 的文档注释)来开启一个具名的块引用,此时渲染器默认不渲染,只被用作被其它地方引用的用途:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
"""name
This is a paragraph.

```go
func main() { }
```

这是一个列表:

* item1
* item2
"""

然后可以在其它地方用类似 """name""" 的方式引用它,引用后,即把上述复杂的内容插入到当前位置。

看起来挺优雅的,但是我没细想🤔。


  1. 这个名词是我自己创造的,我不知道别人怎么描述这个东西。 ^

  2. 这个东西的存在是为了支持 rowspancolspan、样式等内容,并不是为了能编辑复杂内容。见:movsb/goldmark-wiki-table ^

  3. Markdown attributes ^

没有评论 页首

农耕记的小炒肉价格已经“next level”了

跟鲍鱼真的没什么关系,因为非鲍鱼版本要¥70+,只有更贵。

份量少,而且并没有食卫厨一半价格的好吃。

从此拉黑。

实况
没有评论 页首

把手机端的即时通知工具从 Chanify 换成了 Bark

用了很多年 Chanify1 往手机上推送即时通知消息,但是目前发现有一些不足。暂时换成了 Bark,作个简单对比:

AppChanifyBark备注
Token 期限几个月到几年无限早期 Chanify 只有几个月,需要频繁修改,过于麻烦。但是现在可以几年了。
频道/分组功能编码到 Token 中,不同频道 Token 不同。
如果要发送消息到不同频道,需要保存多个 Tokens,偏麻烦。
Token 仅代表不同的设备。
分组功能由 group 参数区别,方便分组。
方便归类。
这是我这次替换的主要原因。
重要通知❗️不支持。支持。专注模式下也能响铃。
与系统集成度更高,对于紧急情况很好用。
链接打开方式始终内部。始终外部。我的有些文章是私密的,内部打开无法携带凭证。
且 Chanify 内无法执行 WebAuthn 登录脚本。
这也是我这次切换的主要原因。
应用角标(小红点🔴)正确统计未读消息的条数。不支持自动统计,需要服务端发送(通过 badge=N 参数任意控制)。
但是服务端无法知道客户端哪些已读、哪些未读,所以这个功能是个残废。
Markdown不支持不支持好希望有这个功能。
手机关机是否会丢消息?是。已经向作者反馈过,作者未知原因。是。已经向作者反馈过,作者明确表示只会保留最后一条。完全无法忍受,但是两者都有此问题。

综合看起来我对这些Apps 都不太满意,但是赖于自己没有开发者苹果账号(且保持长期上架),只能妥协。

关于丢消息,苹果官方前两段有说明:https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns

  1. 会保留30天,下次设备可用时会尝试重新发送;
  2. 但是只存储最后一条?对于同设备、同 BundleID 来说。

但是据我观察,刚开机、仍未运行微信时,能收到多条来自微信的通知。

2025-5-22 23:35:11

和官方和开发人员以及群里面一众人员对战了几十个回合,他们一致认为:

  1. 通知消息丢失可以接受;
  2. 角标错误可以接受。

这也行?那我还说个杰宝。

桃子:确实是一无所知。我只是站在产品、站在用户的角度来理解一个产品怎么对用户更友好。而不是看你用的什么技术。

2025-8-11 19:45:43

这玩意儿不关机、不断网也会高频丢消息。现象:点击通知中心出现的消息进入 App 后,列表里面没有此消息。

没有评论 页首

文章的双向链接🔗图

以前靠形如 [标题](/123/) 这种方式引用站内文章链接,后面学习了 Obsidian/Wikipedia 的“双向链接”,形如:[[123]]

前者就是个和站外链接一样的普通链接,而后者在系统内部保存了这份“引用”关系1,并提供了像是自动显示标题这样额外的好处2

引用关系包含 from 和 to;to 表示对外引用了哪些文章,from 表示被哪些文章引用。

基于所有这些关系,然后用类似 GraphViz 的方式画一下这种关系图,大概就实现了文章的双向链接图。

  • 双向链接图对整理知识库应该是很有用的。抽空搞搞,应该只需要几十行代码。

    但是基于目前引用关系还很少,所以先拖一下。

参考:

  1. 池建强 on X: "新增双链笔记功能。 https://t.co/MJUnYCWTAN" / X
没有评论 页首

发 GET 请求不应该改变状态吗?

大多数时候我认同这种观点,但是偶尔有时候也会“叛逆”一下。

以前的博客在点击“发表新文章”的时候,不会有任何“新建”动作,会等到第一次提交保存的时候才会真实创建。这样很好,可以保证每个“文章编号”都是存在的、有意义的、连续的,对我这种有洁癖的人很适用。

但是有时候也会遇到麻烦:

  1. 文章没真实创建,第一次提交保存之前的上传的图片不知道保存在哪里。

    为了引用图片方便,我的图片是跟文章编号绑定的。而不像多数大家一样用图床、不分文章。

类似的小问题挺多,总之就是要区分是“新发表”还是“更新已有的”。

我现在改进了这个做法:

  1. 在点击“发表新文章”时,自动创建一篇空文章;
  2. 拿到文章编号,重定向到“/editor?id=1677”;

这就相当于“更新”一篇已经存在的文章,代码里面少了很多类似“判断文章是否存在”的代码,逻辑清晰了很多。

当然,这也引入了另外一些问题:

  1. 经常会产生“[私密]无标题”这样的尚未发表的文章。目前没有想到很好的办法解决这个问题,那就先拖延。
  2. 按理说第一次编辑才是发表新文章,但是文章的发表时间却是创建空文章时候的。应该怎么区分?

等等,我怎么感觉没有在说 GET 应不应该改变状态的事?(逃……

2025-5-18 13:16:18

找到了,代码里面有这样一行:

1
<p><button onclick="location.href='editor?new=1'">发表文章</button></p>

以及实现部分

417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
func (a *Admin) getEditor(w http.ResponseWriter, r *http.Request) {
	if isNew := r.URL.Query().Get(`new`) == `1`; isNew {
		post := utils.Must1(a.svc.CreatePost(r.Context(),
			&proto.Post{
				Type:       `post`,
				SourceType: `markdown`,
				Source:     fmt.Sprintf("# %s\n\n", models.Untitled),
			},
		))
		args := urlpkg.Values{}
		args.Set(`id`, fmt.Sprint(post.Id))
		url := a.prefixed(`editor`) + `?` + args.Encode()
		http.Redirect(w, r, url, http.StatusFound)
		return
	}

我为了懒得写 <form>POST 请求,所以“发表文章”实际上是个 GET 请求。感觉不是一个好习惯。

2条评论 页首

差点以为 js 没有能用/好用的图片预览库……

原来这玩意儿叫 lightbox(灯箱)?不是什么 zoom / swipe……

2025-5-14 21:42:31

看了一圈,也不好用。比如不易改装成支持 Live Photo,还得我自己下手写。

没有评论 页首

Finally,火狐是终于把代码迁移到了 GitHub

没错,早年我还很想研究浏览器的时候多么希望 Firefox 把代码迁移到 Github,而不是用没几个人知晓的 hg(mercury)。虽然现在没研究浏览器了,火狐仍然是我多年来唯一一直使用的浏览器。看到它能做出如此“进步”我觉得仍然是一件“好事”1,嗯。

  1. Mozilla Firefox – Official GitHub repo | Hacker News
  2. mozilla-firefox/firefox: The official repository of Mozilla's Firefox web browser.
  3. Firefox moves to GitHub : r/programming

火狐(Firefox)或者谋智(Mozilla)不知道最近在搞什么,我没太研究。总之给我的感觉就是……好像不那么……老态龙钟了。这不,前几天才刚夸完它:《我可太喜欢火狐的这个版本的外观了》。


  1. “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 的时候。

  1. 发 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
go help test
usage: go test [build/test flags] [packages] [build/test flags & test binary flags]

...

Files whose names begin with "_" (including "_test.go") or "." are ignored.

...

真是离了大谱。手动执行某个单测不通过的时候才发现,一度非常震惊🤯,每次 CI 是怎么跑成功的?原来如此!天杀的。

更离谱的是,我自己也不知道是哪里学来的规矩,明明自己也这样写1

355
356
357
358
359
360
361
362
363
364
// 所有人禁止访问特殊文件:以 . 或者 _ 开头的文件或目录。
// TODO:以及 config.yaml | README.md
switch file[0] {
case '.', '_':
	panic(status.Error(codes.PermissionDenied, `尝试访问不允许访问的文件。`))
}
switch path.Base(file)[0] {
case '.', '_':
	panic(status.Error(codes.PermissionDenied, `尝试访问不允许访问的文件。`))
}

我是草台班子。

6条评论 页首

难怪经常在火狐浏览器里面见到“Chrome”,这难道只是我想混淆的吗?

Chrome1

在浏览器中,chrome 指除了网页本身以外任何可视的部分(如 UI、工具栏、菜单栏、标签)。不要将这个术语与 Google Chrome 浏览器混淆。

没有评论 页首

数据库的大字段放前面为什么会导致10倍的性能差?

在 SQLite3 数据库里面存了比较大的二进制数据,后面又追加了一个小字段数据到最后。一个现象是:查询此大二进制数据前面和后面字段竟然有 10 倍的性能差距(前者性能更好)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ time echo 'select id,digest from files' | sqlite3 files.db > /dev/null 

real    0m0.010s
user    0m0.003s
sys     0m0.005s

$ time echo 'select id,digest from files' | sqlite3 files_2.db > /dev/null 

real    0m0.146s
user    0m0.043s
sys     0m0.101s

本地非冷启动测试,取了多次测试的结果,均如上。服务器上能夸张到几秒到几分钟的差异。

差不多 1500 条数据,升级服务器的数据库居然花了七分钟,这能忍?

1
2
3
4
5
6
2025/04/22 12:05:05 main.go:50: updating to DB version 49 ...
2025/04/22 12:05:05 versions.go:600: 删除索引并创建备份表……
2025/04/22 12:05:05 versions.go:603: 正在拷贝旧数据到新表……
2025/04/22 12:09:24 versions.go:605: 正在删除旧表……
2025/04/22 12:12:46 versions.go:607: 重命名新表为旧表……
2025/04/22 12:12:46 versions.go:609: 创建新的索引……

当然,升级后服务器也降到了 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.”
“当实习生的时候,我整天就是打杂的,泡咖啡复印文件。”


如果你在英剧、英式口语或办公室环境里看到这个词,基本就是指那种“啥活都干的底层员工”。

1条评论 页首