MoreRSS

site iconAmeow | 阿猫修改

后端工程师,写Go 和 Python,运营「猫鱼周刊」。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Ameow | 阿猫的 RSS 预览

猫鱼周刊 vol. 079 工作中应该摆烂吗?

2025-09-07 18:41:08

关于本刊

这是猫鱼周刊的第 80 期,本系列每周日更新,主要内容为每周收集内容的分享,同时发布在

博客:阿猫的博客-猫鱼周刊

RSS:猫鱼周刊

邮件订阅:猫鱼周刊

微信公众号:猫兄的和谐号列车

私信:[email protected]

头条

一旧很有质感的云,蓝色的天加上傍晚时分金黄色的阳光,让它显得更有层次感。

上周周刊停了一周,一个是因为周末回去广州了没带电脑,二是因为之前提到过的健康问题去复诊折腾了两天,检查结果有点令人担忧(虽然结果最后发现虚惊一场),所以搞得有点心神不宁。Anyway,现在一切都好。

这周产出了一篇 TIL 文章 通过 git pre-commit hook 防止误提交二进制文件,解决了我开发 Golang 时候的一个很头疼的问题。

文章

接手,而不是「接锅」

原文链接

这篇文章一定程度上解开了我工作中很大的一个心结。

第二个点是我近期在工作中反复遇到的心态:「既然环境中有一个或几个人做得不好,我们是不是就不用正常做事了?」

换成更直白的话就是:「为什么他做得那么差你不去管,反而来要求我?」
...
当然,很多人并非不愿意对自己提高要求,他们的真实想法更可能是:「我可以继续保持高标准的产出,但你不能继续留着那些低素质的同事,这让我心理不平衡。」

这就是我平常很内耗的地方:我总是接手一些烂摊子,一些质量很差的代码,一些四处漏风的系统,在此同时你的同事还在往里添屎。在日常工作中我更多内耗的点就是,原来已经这么烂了,大家都在里面拉屎,那我要不要重构,还是说像别人一样交付需求就行了?

如果一个高素质的人,常常以「我已经做得很好了,你应该去要求别人」作为自己的退路,那么时间长了,他就和他口中那些低素质的人别无二致了。
...
而作为个人,我们也需要理解,我们不能拿要求自己的标准来要求世界上的每一个人。责任和分工各有不同,我们只需要专注于让自己变得越来越好。对于那些持续保持在较差水准的人,过度投射我们的关注,其实是对自己最大的不尊重。

这段话真的解开了我的心结。不可否认在领导层面这是很成功的 PUA,但讲得确实在理。

在任务栏中显示秒数会更耗电吗?

原文链接

LTT Labs 的文章。LTT Labs 是 LMG(Linus Media Group) 一个比较新的业务,主要做外设、电源之类的评测,也会有一些技术分析的文章。

他们做了两次实验,第一次的结果是显示秒数续航更短,符合大家的认知;但第二次的结果就完全相反。最后他们得出的结论是,开关与否,对日常使用的续航没太大的影响。

他们网站上还有一些很有意思的文章,例如近期对 Switch 2 Dock 的分析等。这个频道我关注了可能有十年了,在除了装机、评测硬件之外还能给观众持续带来新鲜感,这个问题很难,但是他们似乎解决得很好。

记录一下 AI 在医疗领域应用的实际体验

原文链接

作者分享了对「AI 报告解读」以及相关经历,表达了对这个功能的赞赏。

作为过来人我对这种功能表示非常质疑,我觉得在一些情况下,连人类医生在没有足够的上下文的情况下,都无法作出准确的判断,何况是 AI。

以我自己的经历来说,我在检查发现结节之后就多次咨询 AI,向它提供了足够多且准确的病情描述和检查结果,其实大多数情况下它给出的结果都是「足够准确」的,但是有些确实引起了我不必要的焦虑,例如在术后以及碘治疗后 tg 结果的解读,它认为数值过高,可能还有癌细胞残留,而医生解释道碘治疗后相关细胞破坏会导致大量释放 tg,需要一定时间内才会下降,要观察半年左右。事后再看,虽然当时 AI 也有提到过类似的点,但是我一点都没看进去,这就是 AI 的坏处,模棱两可的说法会让你产生恐慌。

这个错其实人类也会犯,上周我在核医学科复诊时,医生根据 PET/CT 、SPECT/CT、B 超以及甲功甲免的结果,认为「不能排除淋巴结转移」;而甲乳外科的医生在考虑了全部病史、检查结果之后,认为 tg 结果是下降中,而且淋巴结的形态正常,可以继续观察。

我觉得在医疗方面 AI 的切入点不应该是「解读」或者「诊断」。单一的检查结果在临床上很多时候没有决定性的意义,一般都需要结合多项检查结果、病史等等才有意义,这也是多数检查报告里会提到「请结合临床」的原因。医疗 AI 应该更加注重「确定性」的东西,不要吐模棱两可的话。面向患者这是增加恐慌的不必要精神负担;同时容易让患者在问诊过程中对医生产生质疑,例如「AI 说 xxx」,有点像以前的「百度说 xxx」,对医患关系也是不健康的。面向医生则可能是更大的问题,医生能否保持自己的独立判断和思考(在编程方面我就对 AI 形成了很大的依赖),这对患者来说是很关键的。

但是它可以起到「科普」的作用,例如解释清楚对应指标有什么含义,某项治疗的原理是什么、某种疾病的常见治疗方案和预后等等,可以在问诊前就让患者和医生构建一个比较好的沟通基础,这样的意义会更大。

Atlassian 收购了 The Browser Company

原文链接

一则小新闻,Atlassian 收购了 Arc 和 Dia。主要想谈谈我对 AI + 浏览器的想法。

我觉得我不需要一个 AI 为主的浏览器,浏览器还是原来的浏览器,只需要有一些插件有 AI 的功能。就像现在很多 AI IDE 意识到的那样,围绕 AI 从头再造一个编辑器是没有意义的,在 vscode 上提供一个好用的插件,深度集成就好,更甚者像 Claude Code 这样提供一个 CLI 就行。之前就提过一个类似的观点:

绝大部分 AI 不是一个产品,只是一个功能。

Dia 就走了这么一个弯路,它重新做了一个浏览器,虽然内核还是用的 Chromium (现在几乎没有人能离开 chromium 做浏览器了),但是完全没有继承 Arc 的很多功能,最喜欢的侧边栏没有,也没有办法 pin 页面(只有原始的收藏夹)。在「浏览器」这个功能上,远没有没有达到前任 Arc 的水平,甚至可以说没有到及格线。

不可否认事实上 AI 正在取代搜索引擎成为互联网的入口。但是我算是比较守旧的人,我还是喜欢自己搜索。我使用过 Google 自己的 AI、各种联网、MCP 等等,体验真的不尽人意。AI 没法解决的问题一是幻觉,二是对内容来源的筛选。互联网上有大量 SEO 很好的垃圾内容,例如内容农场,或者是像 CSDN、掘金这类用 AI 生成 SEO 内容的,尽管你可以用过滤列表解决内容农场的问题,但没法让 AI 判断文章质量再去判断是否采信。

Atlassian 这家公司也很有意思,除了大家也许熟知的 Jira、Confluence、BitBucket、Trello 等,还冠名了一支 F1 车队 Atlassian Williams Racing(就是大名鼎鼎、祖上阔过的威队)。

北航软件工程小记:用 Rust 开发「风行旅途」

原文链接

作者分享了他在「软件工程基础」课程上组队开发大作业的经历和体会。

我觉得算得上是很成功的大学教育,而且作者本身也非常值得敬佩。我读书的时候,所谓大作业几乎就是实现几个很简单的功能,只要求有前后端,有个管理后台,演示的时候能走完流程,就算 ok。作者这个课程还要求了微服务、单元测试、CI/CD、测试这些知识点和流程,不清楚课程中老师或者助教有没有详细讲解,还是要求学生自己探索,不管怎么样这课程质量真的很好。

我记得我的学校几乎没有工作中用得上的课程,有门课程还在讲 IBM 一个停止更新了很多年的消息中间件,也从来不提微服务、CI/CD、git 这些东西,就把课本上的基础知识讲一遍。大作业的体验更是噩梦,总有人组队就是抱大腿不干活,不写代码,不写报告,让他做个 ppt 都要推脱。也许学校之间的差异就在这里。

「极客死亡计划」的设计哲学

原文链接

我很喜欢的一个博客,作者分享了他对博客设计的一些想法。上期我刚说完很喜欢博客的字体和排版,以及那个返回顶部的交互,刚好这周作者就分享了更多的设计的细节,真巧!

我时不时也对博客进行一些装修,但由于我使用的是开源的博客软件,所以可以自定义的部分就相对少一点。现在的主题阅读体验还算不错,所以更多时候我会花时间精力在博客的内容上。

想法

Claude Pro 订阅

上面说过,我对 AI 编程其实产生了比较大的依赖。不是我不会写,单纯是不想写,明明动动嘴就可以做完的事真没必要自己动手。然而上周好像出现大规模封号的问题,在用的中转变得不可用了,所以找了一些替代方案。

在用的中转给出的方案是更贵一档的「头等舱拼车套餐」,我没去询价,感觉不会很值。最显而易见的方案则是其他类似的中转,在论坛里看到一篇不错的帖子评测了一些中转商家,感兴趣也可以看一下。我没再找中转的原因一是因为不可用的原因和情况是普遍的,换个商家估计情况也差不多;二是帖子里一些中转商家会往里掺东西,获得不了完全和原生一致的体验;三是现在有三个月五折的活动,Claude Pro 只要 $10。

用官方的服务主要是两个难点,一个是封号,另一个是付款。封号这点太难受了,我之前用的 OpenAI 账号和 Anthropic 账号已经都被封了,原因要么是付款的卡段一起被连坐,要么就是不小心用了国内的 IP 访问,申诉也没用,甚至 OpenAI 上次有几刀的余额也没有退款。付款这点也很蛋疼,只能用虚拟信用卡或者国外银行卡(港卡也不行),前者入金还比较麻烦,也不保证什么时候就跑路/被连坐了;又或者去买美区的礼品卡,通过苹果订阅。

简单分享一下我现在的方案,也许后面会写一两篇文章详细介绍,大概就是:

  • 用新的邮箱注册 Claude 账号
  • 绑定 SafePal 的 U 卡支付
  • Stash 开启增强模式,保证 CLI 也走代理

总之订阅之后稳定使用了两三天,暂时还没有出问题。

你可以通过这个链接 https://claude.ai/acquired 订阅 Claude Pro,可以有三个月五折。上面提到的 SafePal 可以通过我的 aff 链接 注册,可以获得积分,后续有费率优惠。另外现在也有活动,花 $5 运费,即可免费获得一个硬件钱包。

也谈谈信息焦虑

上期聊过,我对文章有一个 Yay/Nay 的标准,虽然通过自订的信息流,已经把我要看的内容限制在了一个比较合理的范围,但其实我的浏览器里还是会堆积一大堆标签页,每次都在想「等我有更多精力专心去读的时候再看」或者「我想深度去读一下这篇文章」,结果就在那里放到被自动关掉。

Nay 会导致我看两眼就关掉文章,而 Yay 会让我看完之后再回味,或者放到周刊里推荐。

虽然之前提到过,写周刊不会对我产生很大的创作压力,这反而是一种表达渠道和很有满足感的事情,但消化这些信息源确实一定程度上对我产生了一点认知压力。上周提到的「个人偏好引擎」是我一个比较想探索的方向,目前我的筛选很大程度上只是根据标题和打开页面后的初印象,内容本身是否值得我深度去读,则需要消耗实际的时间精力去判断。

另外一个想法是,我现在信息的来源(RSS、各种网站等)、收藏(Karakeep)、整理输出(博客)其实是分离的,我有点想在上面的「个人偏好引擎」中整合一下 RSS 和收藏的功能,让它变成一个「个人信息源」集合的地方。

这块的想法其实还比较凌乱,但是「个人偏好引擎」这块倒是已经新建文件夹在开发了,如果你有想法,不妨通过评论或者邮件跟我交流。

项目

ccstatusline

sirmalloc/ccstatusline - GitHub
项目链接

一个方便自定义 Claude Code 的 statusline 的工具。我目前的配置如下图:

其实主要有用的是中间的上下文使用率,方便去判断什么时候应该执行 /compact

ccusage

ryoppippi/ccusage - GitHub

项目链接

Claude Code 的用量统计,通过本地的文件+在线更新的价格,输出报表。

这个其实主要起一个情绪价值的作用,正常情况下,我每天大概消耗 $5 左右的 token,Claude Pro 订阅一个月才 $20(现在优惠三个月 $10),血赚!

工具/网站

Claude Code Cheatsheet

网站链接

Claude Code 的一些快捷键、常用命令、文件位置等,整理成了正好一张 A4 纸的 PDF。也有更完整的网页版

最后

本周刊已在 GitHub 开源,欢迎 star。同时,如果你有好的内容,也欢迎投稿。如果你觉得周刊的内容不错,可以分享给你的朋友,让更多人了解到好的内容,对我也是一种认可和鼓励。(或许你也可以请我喝杯咖啡

另外,我建了一个交流群,欢迎入群讨论或反馈,可以通过文章头部的联系邮箱私信我获得入群方式。

通过 git pre-commit hook 防止误提交二进制文件

2025-09-05 00:58:57

在开发 Go 的时候经常不小心把二进制 commit 上去(顺手就 gaa 了),虽然有几个不太靠谱的方法似乎能避免,例如

  • 把二进制的名称放进 .gitignore,仅限项目有 Makefile 的时候可能好用,换个名就完蛋。
  • 如果 git add 的时候耗时特别长,应该发觉完蛋。
  • 提交前通过 git status 好好看看 stage。

提交错了怎么处理这里就不展开叙述,反正就是很麻烦,会把仓库撑大,简单删除不行,要递归删除,还会搞乱提交历史,然后覆盖远端,非常麻烦。

但是我们可以通过 pre-commit hook 来检测 stage 里是否有二进制文件,并且在检测到时给出指引如何去掉二进制文件。

修改项目中 .git/hooks/pre-commit 为以下内容即可。

#!/bin/sh

# Function to detect binary files
detect_binaries() {
    echo "Checking for binary files..."

    # Get list of files to be committed (cached/staged files)
    files_to_commit=$(git diff --cached --name-only --diff-filter=A)

    if [ -z "$files_to_commit" ]; then
        return 0
    fi

    binary_files=""

    # Check each file
    for file in $files_to_commit; do
        if [ -f "$file" ]; then
            # Use file command to detect binary files
            if file "$file" | grep -q "binary\|executable\|ELF\|PE32\|Mach-O"; then
                binary_files="$binary_files $file"
            fi

            # Also check for common binary file extensions
            case "$file" in
                *.exe|*.dll|*.so|*.dylib|*.a|*.o|*.bin|*.class|*.jar|*.war|*.ear|*.pyc|*.pyo|*.pyd)
                    binary_files="$binary_files $file"
                    ;;
            esac
        fi
    done

    if [ -n "$binary_files" ]; then
        echo "ERROR: Binary files detected in commit:"
        for file in $binary_files; do
            echo "  - $file"
        done
        echo ""
        echo "To remove these files from staging:"
        for file in $binary_files; do
            echo "  git reset HEAD '$file'"
        done
        echo ""
        echo "Consider adding these patterns to .gitignore to prevent future commits."
        return 1
    fi

    return 0
}

# Check for binary files first
detect_binaries
if [ $? -ne 0 ]; then
    echo "Pre-commit hook failed: Binary files detected."
    exit 1
fi

效果如下

猫鱼周刊 vol. 078 我的 Dev Portfolio

2025-08-24 19:10:13

关于本刊

这是猫鱼周刊的第 79 期,本系列每周日更新,主要内容为每周收集内容的分享,同时发布在

博客:阿猫的博客-猫鱼周刊

RSS:猫鱼周刊

邮件订阅:猫鱼周刊

微信公众号:猫兄的和谐号列车

私信:[email protected]

头条

最近没出门拍照,之前拍完的一卷蓝凤凰也还没洗,准备等另一卷金 200 拍完一起送出去洗,所以没有头图可以用了。

这周几乎都在重构我的通知项目 Heimdallr,借助 Claude Code,我给它加了一个前端管理界面,后续还会加上按时间聚合通知、推送记录等功能。这周的内容也不多,索性「想法」部分多写点。

文章

英文罪名小赏

原文链接

又是我非常喜欢的词源学的文章,这次介绍的是英语中常见的一些罪名,最近在看《The Rookie》,也经常碰到这些。

这个博客的背景和字体看起来很有质感,阅读起来很有感觉,每次碰到更新我都会打开原网页去阅读。这次看的时候发现了一个小交互,往上滚动一段时间之后会出现一个小蝙蝠,实现回到顶部的功能。这个挺有意思,不会一直展示在页面上碍眼,蝙蝠图案也跟博客整体氛围很搭。这就是自己写博客程序的好处吧!

在 AI 时代,我却更渴望代码

原文链接

作者利用 AI 学习源码的经历分享。

现在有很多制造焦虑的资讯,经常在说「用某某 AI 花 xx 时间做了一个 yy」,或者说什么职业要被 AI 取代了云云,但其实对大家来说,最直接的事情是:

我的那些曾经只停留在 todo list 里的想法,终于可以一个个实现。

因为 AI,我最近又重拾了一些之前做的 side project。就像上周所说:

在 AI 时代之前,这个想法会因为我没有前端能力,又一直不愿意去学前端而搁置。另外,有些明知道怎么写,但是没有时间精力去写的东西,也可以交给 AI 去做了,我只需要做产品经理和监工就行。

想法

我的 Dev Portfolio

因为刚毕业的时候买的三年 JetBrains All Products Pack 要到期了,所以我最近又重新评估了一下手头在用的开发工具。之前因为使用 Cursor,我基本上不怎么用 JetBrains 家的 IDE 了(靠,才想起来 GitHub Copilot 居然也还在续费)。虽然订阅过期后,我还可以永久使用回退许可(2024.2),但我已经着手列出了一些我很喜欢,离不开 JetBrains 或者需要找到替代的功能:

(后续我会频繁提到 vscode,泛指 Cursor 等以 vscode 为基础的 IDE)

  • git 可视化提交记录:我不喜欢用单独的软件(例如 SourceTree 之类)去做 git 的管理,vscode 的 GitLens 我也用不惯。我习惯用命令行做 pull、commit 之类的大部分事情,但是很需要这个可视化的提交记录(包括查看 diff 等)。写到这里我发现它的 resolve conflict 功能我也很喜欢。JetBrains 有一个在测试中的 git 工具,有点期待。
  • 数据库插件:可以连接各种数据库,开发的时候会很方便。vscode 上的插件大多非常简陋。
  • 启动配置:IDE 右上角的启动配置,可以设置启动参数、命令行参数等等;vscode 中有类似的,但是就是没有这么方便配置和好用。尤其是运行单测时,在单测函数旁边点击运行就行,这个在 vscode 中好像做不到。
  • 跳转、代码提示:JetBrains 的「就是好用」(just works)。
  • Debugger:用得很少,但还是习惯 JetBrains 的。
  • 快捷键:同上。但是 vscode 的 command palette 也很好用。

不得不说 JetBrains 的的确确是我的白月光,我的使用习惯完全是它的样子。但是比较遗憾我不打算继续续费了,但也许我会继续拿开源项目去搞开源许可继续去偶尔用一下。它主要的问题是:

  • AI 功能毫无特色。这部分我不知道怎么细说,就是很粗略的感觉,甚至都没有详细体验下去的欲望。GitHub Copilot 的支持也比 vscode 落后一截(last time I check,因为我也没什么兴趣去体验)。
  • 卡,卡得很。先不提它是 Java 写的这件事,如果你同时在写 PHP 和 Go,就要同时打开 PhpStorm 和 GoLand,对 16G 内存的机器来说可不是那么友好。

所以我现在的 portfolio 是:

  • Cursor:主力 IDE,主要使用 tab 功能,以及 Claude Code 陷入死循环时用 gpt-5 当替补。20 刀的用量太少了,狠狠用一天就能用完。
  • Claude Code:主力 AI,配合 gaccode 的月卡实现爽爽写。
  • DataGrip:数据库工具, 虽然也有 TablePlus,但是工作中有时候用到 ClickHouse、Presto 之类的,这个支持的广一点,而且已经付过钱了。

大致是这样,如果大家有好的插件、工具推荐,欢迎留言。

Yay or Nay

由于我每天都会看挺多文章,长久以往我发现自己形成了一个对文章的筛选标准。这里我尝试总结一下,分为 Yay(好)和 Nay(不好)。我会把 Nay 放在前面,因为 Nay 会导致我看两眼就关掉文章,而 Yay 会让我看完之后再回味,或者放到周刊里推荐。

Nay:

  • 大段复制粘贴,或者是翻译的文章,或者 AI 味很重的文章:拜托,别生产垃圾。
  • 使用大量 AI 配图:同上,如果图片不能辅助文章的表达,那就是画蛇添足。「图文并茂」不一定会让文章变得更加有趣,更别提我其实相对很反感 AI 配图,尤其是某几个风格,简直看得审美疲劳。
  • 全文大部分是代码,没多少文字:其实重点还是「没新意」。如果有比较独特的想法,一定是会花更多的篇幅在文字的表达,而不是大段的代码,因为核心代码不会太多。
  • 弹窗,页面排版差,或者发布在臭名昭著的平台:有网站上来就弹窗让你关注 ta 的公众号;也有的网站有很多奇怪的样式(例如背景有动画、边角有看板娘之类,甚至播放音乐)。还有就是发布在 CSDN、知乎这类本身就在强奸用户的平台。

Yay:

  • 我感兴趣的话题:例如上面的词源学,或者是 AI、摄影、生活之类,难以逐一概括。
  • 良好的排版,有趣的风格:不用多说,这类我会专门打开网页去看。

我之前有一个想法,是做一个个人的偏好引擎,每一次看到喜欢或者不喜欢的文章,就通过一个接口给它打标,学习我的偏好;然后通过浏览器插件或者 RSS 过滤等方式,帮我过滤掉一些没意思的文章。也许上面的内容会成为它的 prompt。

拓竹 CyberBrick 卡车

前两周就拼好了忘记发了。好玩的过程是拼装,拼好之后就有点索然无味了,就是比较普通的遥控车。

打印的部分没什么大问题,有一块 TPU 的部件,自己切片用 PLA 打了,其他都是用官方的打印配置直接打印。那块 TPU 的部件是前轴,不知道是不是这个原因还是因为我组装有问题,这个车会跑歪。

组装的话会比之前的遥控是更大的工程,笨手笨脚的话耗时两三个小时左右,算是大人玩的赛博拼图吧,跟着官方的 PDF 不算很难。有几个要用到胶水的地方,因为前面踩过坑了,这次终于没被胶水粘到手。这里分享几个 tips:

  • 要打非常多的螺丝,建议用电动螺丝刀。
  • 打印一个螺丝托盘,以及一些小的收纳筐来装各种小零件。我打了一个 2+1 的螺丝托盘,小的区域装螺丝(整个项目只有一种螺丝规格,好评!),大的区域放当前步骤的零件。小收纳筐可以方便提前从整个 kit 里抓好这次要用的零件。
  • 备一个镊子,装灯的时候要用,另外用胶水的时候也可以避免手碰到。

项目

meshing-around

SpudGunMan/meshing-around - GitHub

项目链接

我之前就介绍过 Meshtastic 和它的中国社区,这是个很有意思的离网通信组网项目,目前增长得挺迅速(已经满了一个 500 人的微信群),深圳这边已经可以完全实现离网通信了。

这是一个 BBS 脚本,可以实现一些机器人功能。Meshtastic 这种离线组网和业余无线电一样,需要找到一些平时的应用,或者说乐趣,才能推广开,或者说让人坚持下去。光聊天这一种功能,替代不了微信。深圳这边每周五会有点名活动,参与的人不多,但是好像比国内其他城市都走得前了。在折腾这一块,还是有挺多好玩的方向,例如做太阳能节点、放生野外节点、用模块手搓 DIY 超低成本节点等等。

最后

本周刊已在 GitHub 开源,欢迎 star。同时,如果你有好的内容,也欢迎投稿。如果你觉得周刊的内容不错,可以分享给你的朋友,让更多人了解到好的内容,对我也是一种认可和鼓励。(或许你也可以请我喝杯咖啡

另外,我建了一个交流群,欢迎入群讨论或反馈,可以通过文章头部的联系邮箱私信我获得入群方式。

猫鱼周刊 vol. 077 Code For Fun

2025-08-17 20:18:56

关于本刊

这是猫鱼周刊的第 78 期,本系列每周日更新,主要内容为每周收集内容的分享,同时发布在

博客:阿猫的博客-猫鱼周刊

RSS:猫鱼周刊

邮件订阅:猫鱼周刊

微信公众号:猫兄的和谐号列车

私信:[email protected]

头条

还是之前在赤柱海边拍的照片。蓝蓝的海和天,浮标和远处的帆船点缀其中,很有夏天的味道。

这周做了好几个事。首先是一篇 TIL 类型的文章优雅地在 crontab 中运行脚本,总结了一些令 crontab 体验更好的小技巧;第二是用 Claude Code 做了一个个人项目展示的页面;第三是装修了一下博客,重新写了一下关于页面等。

这周做的事情比较多,所以这期周刊内容会有点缩水。

文章

停用 Facebook 和 Instagram 对用户情绪状态的影响

原文链接

国外的一项研究,原文内容我没有看,翻译了一下它的摘要:

我们在 2020 年美国大选前通过两项大规模随机实验评估了社交媒体停用对用户情绪状态的影响。与仅停用第一周的控制组相比,在大选前六周停用 Facebook 的受试者在快乐、抑郁和焦虑综合指数上显示出 0.060 个标准差的改善。同期停用 Instagram 的用户则表现出 0.041 个标准差的提升。

虽然说「停用社交媒体可以减少焦虑」这个结论稍微有点断章取义,但是这个结论安在我身上好像是说得通的。最近发现自己越来越少刷朋友圈,有时候居然两三天才会打开一次,这个改变连我自己都感到惊讶。朋友圈是一个很典型「报喜不报忧」的场景,大家都会在朋友圈展示自己生活最精彩的一面,而生活更多是平淡,或者是痛苦的时刻。如果不能调整好心态,看朋友圈的时候陷入一种「天啊怎么别人都过得这么好,怎么就我的生活这么烂」的想法,那真是自寻烦恼(不久前我真的会这样)。

37 岁退休一周年:经验与心得分享

原文链接

作者介绍了他退休一周年的经历,重点介绍了财务准备和心理转变方面一些经验和心得。

提前退休除了需要在经济上要有准备,在心理上也需要有很多建设才能实现,有很多人生的问题需要想清楚。

因为那才是你想要的生活,是 FIRE 的目标,也是你坚持计划的动力。而不是“工作压力大了、领导太操蛋了、上班太辛苦了”这类逃离借口。前者是你想到达某个地方,而后者只是你想逃离。

能够开心的过完这一生,本身就是最珍贵的意义。

想法

Code for fun

在 V2EX 分享了新写的项目,有人回复「所以我为什么不直接链接到 github 主页」。

我的回复是:

从目的上说 profile 页完全能满足需求,但是体验一下用 AI vibe 一个前端的过程,折腾一下 Actions 这些对我来说很有趣。

类似 游戏可以看解说视频云玩为什么要自己买一份花时间精力玩?

我在开始之前知道我这是在重复造轮子,但是我甚至没有先去找一个类似的项目,还是造了这个轮子。因为重要的并不是结果,并不是它有什么意义、价值,而是我享受了创造它的过程,调通那一刻的成就感。还有就是当我跟别人提起这个东西时,不是「我用了 xx 项目」,而是「我自己写的!」那种自豪感。

Callback 一下,前面那篇文章的作者就说过:

很多事,本来就没有意义。... 人生在于体验,而不是结果...

之前周刊介绍过的 35 岁+程序员依然可以兼顾热爱代码和享受生活 里也提到过:

那些 35 岁要当管理的理论都是狗屁人说的,什么年纪大了不能写代码?我今年 37 岁,依然热爱代码,而且是下了班写到半夜 2 点。人这一辈子,唯一的规则就是毫无限制,不要管别人说什么,自己快乐最重要。

希望我能到不惑之年还能保持对写代码的热爱,又或者找到新的热爱,谁知道呢。

More on vibe coding

我之前说过:

你不是在 vibe coding,而是在十倍速生成屎山

我现在想对它做个补充:如果你能像喝药一样捂住鼻子,不要关注它写的代码,也不要介入去改代码,一路 vibe 到底,出来的成品还不错。

我觉得我对 AI 写代码的认知还停留在之前 GitHub Copilot Chat 或者 Cursor 那种选片段让它改的阶段,没有进入到 agentic coding。比起一点一点改,agentic coding 更加像现实中多人合作开发的模式,AI 独立去实现一个需求,或者是解决一个问题,然后一次性提交一大堆变更,然后你去 review 这样。我发现一个所谓「工作流」,能提升 vibe coding 的效果:

  • 介绍背景:有一个 CLAUDE.md 可以用来简单介绍项目,这个可以通过 /init 来生成,然后再根据需要修改一下。这里最好把技术栈、文件结构、代码风格之类介绍清楚,可以避免它漫无章法地生成文件。这个文件后续也需要根据它的行为(例如你不想它次次都生成测试或者帮你运行代码)来调整。
  • 描述需求:比起简单一句话描述需求,你可以用一个 markdown 文件来详细描述需求,包括技术要求等,以及一些你觉得需要注意的地方。
  • 计划:要求它先输出一个实现计划,包括要创建哪些文件,每个文件里面包含什么逻辑、对应的数据结构、使用的中间件等等。你可以跟它反复修订这个计划。
  • 执行:当你跟 AI 商定好技术方案之后,运行一次 /compact 压缩一下上下文,然后告诉它开始实现。按 Shift + Tab 打开自动接受变更。

等它执行完,当 code review 一样去给他提意见就好。可以在旁边开个窗口一条一条记下来,然后在复制粘贴进去,等它反复修改,直到满意,中间不要自己去改代码了。

另外一个转变是,它赋予了我快速实现一些想法的能力。我的笔记中有一个「灵感」文件夹,充满了一时兴起想做、列好了功能列表、做出来能满足我某些需求但其实「没什么用」的东西,这次这个就是其中之一。在 AI 时代之前,这个想法会因为我没有前端能力,又一直不愿意去学前端而搁置。另外,有些明知道怎么写,但是没有时间精力去写的东西,也可以交给 AI 去做了,我只需要做产品经理和监工就行。总体来说,这还是很有意义的,至于是不是自己一行一行亲手写的代码,好像也无所谓了。

还有一个问题是,Claude Code 如果用 API 烧钱真的很快,短短一个小时不到我在 API 上就花了两百多块,甚至还没做完我的需求。如果你的用量比较大,还是用月卡比较划算。这里打个小广告,我用的是 gaccode,这周末用下来非常稳定,原生的模型原生的体验,用量也够我一直高强度使用。你可以通过我的链接注册来获得免费的 10000 积分,如果你需要购买月卡,现在有限时的优惠,¥289 一个月(原价 ¥299),添加我的微信 _3verest,备注 gaccode 即可。

项目

showcase

LeslieLeung/showcase - GitHub

项目链接

展示你的 GitHub 项目,使用 GitHub Actions 自动更新,并部署在 GitHub Pages。就是上面提到的个人项目展示的页面。


claude-code-router

musistudio/claude-code-router - GitHub

项目链接

一个在 Claude Code 中使用其他模型的方式。不过说实话,深度体验之后,只有使用 Claude 效果最好,追求低成本使用 Kimi K2 或者 Deepseek 都达不到原生的效果。

最后

本周刊已在 GitHub 开源,欢迎 star。同时,如果你有好的内容,也欢迎投稿。如果你觉得周刊的内容不错,可以分享给你的朋友,让更多人了解到好的内容,对我也是一种认可和鼓励。(或许你也可以请我喝杯咖啡

另外,我建了一个交流群,欢迎入群讨论或反馈,可以通过文章头部的联系邮箱私信我获得入群方式。

博客装修之开源项目展示、关于页面

2025-08-17 13:40:29

博客里面有一个很简陋的「项目导航」,原本的目的是用来展示我做的一些项目。标题上还有「开源项目」,是因为这里面曾经还有几个在学校期间做的项目,代码又不能公开,网站也需要账号才能访问,放在这里实在没有意义,就去掉了。

所以我想要一个页面,能自动去拉取我的 GitHub Repo,然后展示出来,思路大概是这样:

  • 抓取 GitHub Repo 及其描述
  • 使用 GitHub Pages 静态部署
  • 使用 GitHub Actions 自动更新

于是用 Claude Code vibe 了一个页面,有黑白两个主题。

大致就是我想要的东西了,非要说的话有两个遗憾:

  • 不能嵌进博客里,要跳转到新网页
  • 样式很无聊,我原本想要 fancy 一点的效果,奈何我自己都描述不出来,更不可能让 AI 去发挥出来了

总之,现在博客菜单中的「项目导航」已经换成了「开源项目」并链接到这个页面。如果你对这个项目感兴趣,欢迎看看 LeslieLeung/showcase,fork 后改一下配置就能成为你自己的 showcase 了。

另一个变化是重新写了一下「关于」页面。这个链接一开始是有一句不三不四的个人介绍,后来链接到了 bento,也是有点意义不明。看别人的文章时,有时候会好奇作者的背景,学什么、做什么,基本上都可以在「关于」这个页面找到答案。于是这块我也重新写了一下。

最后就是「影集」里面上新了最近拍的一些胶片。没想好这块要怎么用,博客自带的上传和图片管理都比较麻烦,也许又会再 vibe 一个别的东西出来(?)。

看了一下上次给博客换主题已经是去年七月底了,到现在刚好一年,不算是光折腾主题和功能,文章一点没写了吧(x。

优雅地在 crontab 中运行脚本

2025-08-12 23:11:18

一般来说,像 Node.js、Python 这类解释型的语言,系统上都会存在比较多个版本,利用一些诸如 nvm、venv、poetry、uv 等环境管理器来管理。一般来说部署这些脚本都算是一个比较噩梦的体验(相比可以打包可执行文件的语言来说),因为还要涉及到配环境的问题,另外配定时任务更是另一番折磨。

本篇介绍一个技巧,避免在 crontab 中反复使用绝对路径,更优雅地进行部署。解决方案就是写一点 shell 脚本,比在 crontab 里面反复 && 要好。

首先你需要一个配置环境的脚本,以及运行定时任务的脚本。

env.sh

#!/bin/bash

# 如果你的 nvm 在其他目录,需要修改这里
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm

# 如果你需要指定node版本,可以反注释下面一行
#nvm use v21.4.5

script.sh

#!/bin/bash
$(which node) script.js

单独给定时任务写一个脚本的好处是,如果你的参数非常长,或者定时任务想要复杂一点的逻辑,例如脚本 1 和脚本 2,需要在脚本 1 运行成功后再运行脚本 2,如果失败就告警,可以写以下这样的脚本。

#!/bin/bash

# 定义需要执行的命令
COMMAND1="ls /path/to/nonexistent/dir"  # 示例:故意让command1失败(返回非0)
COMMAND2="echo 'command1执行成功,现在执行command2'"

# 执行command1并检查结果
$COMMAND1

# 判断返回值:0为成功,执行command2;否则处理失败
if [ $? -eq 0 ]; then
    echo "INFO: command1执行成功(退出码0)"
    $COMMAND2
else
    echo "ERROR: command1执行失败(退出码$?)"
    exit 1  # 可选:失败时退出脚本(返回非0码)
fi

crontab -e

*/1 * * * * (cd path; . env.sh; script.sh >> path/cron.log 2>&1; )

解释两个地方,第一个是 .source 命令的缩写,与直接运行一个 sh 不一样的是,source 会在当前 shell 中执行,而不是在一个子 shell 中执行。第二个是后面的重定向,>> 表示以增加的方式(而不是覆盖)把日志写入(重定向至)文件,2>&1 则表示把标准错误流(stderr)也重定向至标准输出流(stdout)。这些日志能够帮助你定位定时任务的问题。

如果调试通过,最好把这个日志变成可轮转的(超过指定大小/时间会清除),避免占用太多磁盘。也可以重定向到 /dev/null ,这样就会丢弃掉所有输出。

使用这种方式,比以下这种更优雅、灵活和好维护的多。

*/1 * * * * cd path && /home/user/.nvm/versions/node/v24.5.0/bin/node script.js

Reference

Run `node` scripts using `nvm` and `crontab` without hardcoding the node version · GitHub