#1189 百度云 ICP 备案记录

2026-07-16
  • 原备案信息(阿里云 · 2019):备案名称「码厩Markjour」,备案号 鄂ICP备15002462号
  • 迁移原因:不再使用虚拟主机,业务迁至百度云低成本主机,需在百度云重新提交接入/备案,备案名称变更为「码厩开发者笔记」。

初审被拒,原因:

  1. 应急联系电话校验:应急手机号不能与负责人手机号码相同,需提供另一位真实可联系人的号码(当年没有这个要求)。
  2. 前台菜单合规审核:初审要求网站不得出现“留言”和“给我写信”菜单,这算页面交互入口(推测当年备案时尚未增加这两个菜单)。
    • 这两个功能从没用过,暂时屏蔽前端入口以通过核验,后面再看如何处理。

#1188 阅读代码之前执行的 git 命令

2026-07-11

AI 总结了 The Git Commands I Run Before Reading Any Code,可以作为参考。
PS:其中部分命令的有效性是建立在提交规范执行良好的基础之上。我过去经手的项目全部没有提交规范。😂

Five git log commands that diagnose a new codebase before you open a single file: code churn hotspots, bus factor, bug clusters, and crisis patterns.

1. 变更热点 列出去年改动最频繁的 20 个文件,榜首常是团队"无人敢碰"的那个。高变更本身不糟,但若叠加"无人愿拥有",便是代码库拖累的最强信号——每次修改都是补丁叠补丁,小改动的影响范围不可预测。微软 2005 年研究证实,变更率指标比复杂度更能预测缺陷。

git log --format=format: --name-only --since="1 year ago" | sort | uniq -c | sort -nr | head -20

2. 总线因子 按提交数排名贡献者。一人占 60%+ 即为风险;若其已离职半年便是危机。长尾同样关键:30 位贡献者中仅 3 位近一年活跃,说明建造者已非维护者。注意 squash-merge 会压缩作者信息,下结论前需确认合并策略。

git shortlog -sn --no-merges

3. Bug 集群 形态同变更热点,但过滤含 bug 关键词的提交。同时出现在两张列表的文件风险最高:反复出错、反复修补却从未根治。此法依赖提交信息规范。

git log -i -E --grep="fix|bug|broken" --name-only --format='' | sort | uniq -c | sort -nr | head -20

4. 提交节奏 按月统计提交数。稳定节奏健康;单月减半常因有人离职;6–12 个月下滑曲线揭示团队失速;周期性尖峰后沉寂则是批量发布模式。这是团队数据,而非代码数据。

git log --format='%ad' --date=format:'%Y-%m' | sort | uniq -c

5. 回滚与热修频率 一年中偶发回滚正常;若每几周一次,说明团队不信任部署流程,背后是测试不可靠、缺预发环境或回滚困难。零结果同样值得玩味。

git log --oneline --since="1 year ago" | grep -iE 'revert|hotfix|emergency|rollback'

#1187 Ubuntu 上钉钉不能启动的问题

2026-07-10

从官网下载的钉钉 deb 文件,安装之后竟然无法启动。

-> % ll ~/Downloads/com.alibabainc.dingtalk_8.1.0.6021101_amd64.deb
-rw-rw-r-- 1 catroll catroll 387M 2026-07-10 21:39:31 /home/catroll/Downloads/com.alibabainc.dingtalk_8.1.0.6021101_amd64.deb

-> % apt install ~/Downloads/com.alibabainc.dingtalk_8.1.0.6021101_amd64.deb

一边查看日志(journalctl --user -f),一边点击钉钉图标,可以看到以下错误日志:

7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361857]: ubuntu
7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361857]: ubuntu branch
7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361857]: preload_libs=./libgbm.so ./plugins/dtwebview/libcef.so
7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361873]: ERROR: ld.so: object './libgbm.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361873]: Run Main is_gpu=0 is_zygote=0 is_render=0 is_crashpad_handler=0 cmd : ./com.alibabainc.dingtalk
7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361873]: Load /opt/apps/com.alibabainc.dingtalk/files/8.1.0-Release.6021101//dingtalk_dll.so failed! Err=/opt/apps/com.alibabainc.dingtalk/files/8.1.0-Release.6021101//dingtalk_dll.so: cannot enable executable stack as shared object requires: Invalid argument
7月 10 21:49:27 eqr systemd[4607]: Started app-gnome-com.alibabainc.dingtalk-361857.scope - Application launched by gnome-shell.

经过 AI 的一番分析,结论是:

钉钉 deb 包依赖的 ELF 动态链接配置与当前系统环境不匹配。patchelf 修正了二进制的解释器、RPATH 或依赖库路径,使程序能正确加载运行时库之后就可以启动了。

sudo apt install -f patchelf
sudo patchelf --clear-execstack /opt/apps/com.alibabainc.dingtalk/files/8.1.0-Release.6021101/dingtalk_dll.so

#1186 冰淇凌的制作

2026-07-09

冰淇淋制作流程

1. 混合(Blending):打好地基
乳脂(奶油/牛奶)、糖、乳化剂、奶粉混合加热。这一步决定了冰淇淋的“底子”好不好,乳脂越高,口感越顺滑。

2. 均质(Homogenization):打碎脂肪
通过高压把牛奶中的大脂肪球打成微米级的小球。这一步是为了防止脂肪上浮,让口感变得细腻、均匀,没有粗糙感。

3. 老化(Aging):让蛋白质休息
将混合物迅速降温至4℃左右静置4小时以上。目的是让蛋白质充分吸水膨胀,这样后面打入空气时才不容易塌陷,质地更稳定。

4. 凝冻(Freezing):魔法发生的地方
这是最关键的一步!在-6℃至-10℃的凝冻机里疯狂搅拌。

  • 混入空气:让体积膨胀(膨化率),变得蓬松。
  • 形成冰晶:快速搅拌防止生成大冰晶,只留下微小的冰晶,这就是“细腻”的来源。

5. 硬化(Hardening):定型
如果是硬冰淇淋(如哈根达斯),会放入-30℃的冷库急冻,固定形状。

为什么不同品牌口感不同?

  • 哈根达斯(硬冰淇淋)膨化率低(空气少),乳脂极高,所以口感像吃冷冻的奶油,非常厚重。
  • KFC/麦当劳(软冰淇淋):凝冻后直接出机,膨化率高,空气多,所以口感轻盈像云朵,但也化得快。
  • 蜜雪冰城:为了控本,非乳脂固形物(如奶粉、糖浆)多,乳脂少,冰晶相对较大,所以感觉没那么“润”。

#1185 gdebi: Breaks existing package 'xxx' conflict

2026-07-07

我之前下载 deb 文件都用 gdebi 安装,但是今天升级 curosr 的时候报错:Breaks existing package 'cursor' conflict

-> % ll ~/Downloads/cursor_3.10.17_amd64.deb
-rw-rw-r-- 1 markjour markjour 187M 2026-07-07 03:35:12 /home/markjour/Downloads/cursor_3.10.17_amd64.deb

> % sudo gdebi ~/Downloads/cursor_3.10.17_amd64.deb
[sudo: authenticate] 密码:       
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Reading state information... Done
此软件包不可安装
Breaks existing package 'cursor' conflict: cursor ( )

因为 Cursor 打包的时候声明和已经安装的 cursor 冲突。

-> % apt info ~/Downloads/cursor_3.10.17_amd64.deb | cat
Package: cursor
Version: 3.10.17-1783235114
Priority: optional
Section: devel
Maintainer: Cursor <hi@cursor.com>
Installed-Size: 908 MB
Provides: cursor
Depends: ca-certificates, libasound2 (>= 1.0.17) | libasound2t64 (>= 1.0.17), libatk-bridge2.0-0 (>= 2.5.3) | libatk-bridge2.0-0t64 (>= 2.5.3), libatk1.0-0 (>= 2.11.90) | libatk1.0-0t64 (>= 2.11.90), libatspi2.0-0 (>= 2.9.90) | libatspi2.0-0t64 (>= 2.9.90), libc6 (>= 2.14), libc6 (>= 2.16), libc6 (>= 2.17), libc6 (>= 2.2.5), libc6 (>= 2.25), libc6 (>= 2.28), libcairo2 (>= 1.6.0) | libcairo2t64 (>= 1.6.0), libcups2 (>= 1.6.0) | libcups2t64 (>= 1.6.0), libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3, libdbus-1-3 (>= 1.9.14) | libdbus-1-3t64 (>= 1.9.14), libexpat1 (>= 2.1~beta3) | libexpat1t64 (>= 2.1~beta3), libgbm1 (>= 17.1.0~rc2) | libgbm1t64 (>= 17.1.0~rc2), libglib2.0-0 (>= 2.39.4) | libglib2.0-0t64 (>= 2.39.4), libgtk-3-0 (>= 3.9.10) | libgtk-3-0t64 (>= 3.9.10), libgtk-3-0 (>= 3.9.10) | libgtk-3-0t64 (>= 3.9.10) | libgtk-4-1 | libgtk-4-1t64, libnspr4 (>= 2:4.9-2~) | libnspr4t64 (>= 2:4.9-2~), libnss3 (>= 2:3.30) | libnss3t64 (>= 2:3.30), libnss3 (>= 3.26) | libnss3t64 (>= 3.26), libpango-1.0-0 (>= 1.14.0) | libpango-1.0-0t64 (>= 1.14.0), libudev1 (>= 183), libx11-6 | libx11-6t64, libx11-6 (>= 2:1.4.99.1) | libx11-6t64 (>= 2:1.4.99.1), libxcb1 (>= 1.9.2) | libxcb1t64 (>= 1.9.2), libxcomposite1 (>= 1:0.4.4-1) | libxcomposite1t64 (>= 1:0.4.4-1), libxdamage1 (>= 1:1.1) | libxdamage1t64 (>= 1:1.1), libxext6 | libxext6t64, libxfixes3 | libxfixes3t64, libxkbcommon0 (>= 0.5.0) | libxkbcommon0t64 (>= 0.5.0), libxkbfile1 (>= 1:1.1.0) | libxkbfile1t64 (>= 1:1.1.0), libxrandr2 | libxrandr2t64, xdg-utils (>= 1.0.2)
Recommends: libvulkan1
Conflicts: cursor
Replaces: cursor
Homepage: https://cursor.com
Download-Size: 195 MB
APT-Manual-Installed: yes
APT-Sources: /home/markjour/Downloads/cursor_3.10.17_amd64.deb
Description: The AI Code Editor.

于是改用 apt 安装成功:

-> % sudo apt install ~/Downloads/cursor_3.10.17_amd64.deb
注意,选中 'cursor' 而非 '/home/markjour/Downloads/cursor_3.10.17_amd64.deb'
将被升级:                
  cursor

摘要:
  升级:1,安装:0,卸载:0,不升级:0
  下载大小:0 B / 195 MB
  所需的空间:16.5 MB / 625 GB 可用

获取:1 /home/markjour/Downloads/cursor_3.10.17_amd64.deb cursor amd64 3.10.17-1783235114 [195 MB]
正在预设定软件包 ...       
(正在读取数据库 ... 系统当前共安装有 381608 个文件和目录。)
准备解压 .../cursor_3.10.17_amd64.deb  ...
正在解压 cursor (3.10.17-1783235114) 并覆盖 (3.5.17-1779246638) ...
正在设置 cursor (3.10.17-1783235114) ...
正在处理用于 desktop-file-utils (0.28-1build1) 的触发器 ...
正在处理用于 gnome-menus (3.38.1-1ubuntu1) 的触发器 ...
正在处理用于 shared-mime-info (2.4-5build3) 的触发器 ...
注意: 由于文件'/home/markjour/Downloads/cursor_3.10.17_amd64.deb'无法被用户'_apt'访问,已脱离沙盒并提权为根用户来进行下载。 - pkgAcquire::Run (13: 权限不够)

#1184 Ubuntu 26.04 上的 ls 变化(变成 Rust 版本)

2026-07-06
alias ll="LC_ALL=c ls -hlAF --group-directories-first"

ls 命令我经常会加上 --group-directories-first 参数,将文件夹排在前面。
PS:ls 默认就会按照字母顺序排序。
PS:ls 默认会忽略前导小数点,比如排序 a .b c 这样。我加上 LC_ALL=c 之后就会 .b a c 这样排序。

现在突然发现我的 ll 命令不按文件名称排序了,经过一番研究,原来是现在的 Ubuntu 26.04(我大概在两个月前从 25.04 升级过来)改用了 Rust 重构版本的 coreutils,也就是说一百多个命令都替换成了 Rust 版本。
然后这个版本在处理 --group-directories-first 参数的时候存在兼容问题,甚至可以说是 BUG:这个参数会导致排序规则失效(哪怕加上 Rust 版本新加的 --sort=name 也没有用)。

-> % apt-file search "/usr/bin/ls" | grep -E "bin/ls$"
coreutils-from-busybox: /usr/bin/ls
coreutils-from-gnu: /usr/bin/ls
coreutils-from-toybox: /usr/bin/ls
coreutils-from-uutils: /usr/bin/ls

-> % apt list --installed | grep coreutils
coreutils-from-uutils/resolute,now 0.0.0~ubuntu25 all [已安装,自动]
coreutils/resolute,now 9.5-1ubuntu2+0.0.0~ubuntu25 all [已安装,自动]
gnu-coreutils/resolute,now 9.7-3ubuntu2 amd64 [已安装,自动]
rust-coreutils/resolute,now 0.8.0-0ubuntu3 amd64 [已安装,自动]

关键是 coreutils-from-uutils 直接 Break coreutils-from-gnu,替换了相关文件,而不是通过软链接实现。
现在除非重新安装 coreutils 包覆盖回去,没有别的办法。
我不是 Linux 专家,所以要尊重社区的决定,没到万不得已,不能 Break 他们的设计。

那就只好这样了,暂时不用 --group-directories-first 参数。

#1183 阿里全面禁用 Claude Code

2026-07-05

阿里巴巴宣布,自 2026 年 7 月 10 日起,全面禁止员工在办公及研发环境下使用 Anthropic 旗下 Claude 系列产品(含 Claude Code),并要求全员卸载清理,同时推荐使用阿里自研 AI 编程工具 Qoder 作为替代方案。

此前,阿里曾鼓励员工使用海内外 AI 辅助编程工具,Claude Code 是程序员高频使用的编码助手,相关外部模型调用费用可走企业报销。

此次变动主要可能基于三方面考量:

  1. Claude Code 被曝存在隐蔽检测/后门风险,可能导致企业核心代码与研发数据外泄;
  2. Anthropic 近年多次无预警封禁中国用户并限制中资企业使用其服务,供应链与合规风险上升;
  3. 阿里自研 Qoder 已具备端到端AI编程能力且支持内网私有化部署,可保障数据不出境、满足自主可控与信息安全合规要求。

#1182 自行车除锈经验总结

2026-07-04

我的自行车有半年没有骑,前几个月一直在楼下风吹雨打,后面才搬到地下停车场,所以有不少地方生锈了。
我看了几个视频就开始自己动身除锈 + 防锈(喷漆),操作完成之后写了一个总结,并让 AI 帮忙润色了一下。

  1. 准备工具

    • 除锈剂
    • 喷壶(清水,仅最后需要时使用)
    • 砂纸
      PS:反正我只用了小半张,相信大多数情况都够用了。
    • 不用的牙刷
    • 卫生纸或抹布
    • A4 纸(遮挡)
    • 自喷底漆
      PS:都说最好先涂底漆,再涂面漆。但是我图便宜,图省事,就买了一瓶黑色面漆。吃了亏再说去。
    • 自喷面漆(与车架颜色一致)
      PS:我的车架是深绿色,但是生锈的部分都是黑漆位置,所以我买的黑色自喷漆。
    • 防锈润滑油
      PS:我用的是普通自行车润滑油。
  2. 检查车况
    将自行车放到室外或通风良好的地方,确认所有生锈位置。
    除锈剂和喷漆都有较大的气味,应佩戴手套,避免吸入。
    PS:我没有手套,直接操作,倒也没有什么大问题,回家好好冲洗一下。
    PS:我一开始实在地下停车场弄,后来发现味道大且不容易散,就搬到地下停车场过道去了,好多了。

  3. 清理浮锈
    用砂纸轻轻打磨,把松动的锈层和污垢去掉。
    PS:都说要干燥的情况下除锈,可是我得空的时候,自行车是被雨淋湿的,我用卫生纸擦干了一下就开始弄了,不管这么多。

  4. 使用除锈剂
    将除锈剂喷在锈蚀部位,按照产品说明静置几分钟(通常 2~10 分钟)。
    如果锈较厚,可配合牙刷轻刷。
    PS:我是来回喷多次,喷了擦一下看看效果,再继续喷。一大瓶用也用不完,放在家里是个安全隐患。

  5. 擦净残留
    用纸巾或抹布擦掉除锈剂和锈渣。
    若产品要求水洗,再少量清水冲洗,并立即擦干或吹干。

  6. 再次打磨
    用细砂纸打磨,直到表面基本无锈,露出均匀金属表面。

  7. 防锈处理

    • 车架、前叉等喷漆件:

      • 遮挡周围区域(A4 纸即可)。
      • 推荐先喷一层防锈底漆,干燥后再喷面漆。
      • 薄喷 2~3 层,比一次喷厚效果更好。
    • 链条、飞轮、螺丝、辐条等金属件:

      • 不要喷漆。
      • 擦干后喷防锈润滑油即可。

#1180 市场营销 101

2026-06-30

对于技术背景的人,理解营销最重要的是把它看成一个用户价值发现 + 商业增长系统,而不是单纯的广告推广。