肇鑫的日常博客

肇鑫 / Owen Zhao

独立开发者,主要开发 iOS、watchOS、macOS 应用。

目前在维护 SleepTapRooster Time,以及 Markdown Writer 相关工具。

最新文章

也来预测一下AI的发展趋势

随笔

2026年了,好多人都在给自己设定计划,展望未来。AI无疑还是今年的主题,但是对于AI会如何发展,每个人看到的风景是不一样的,而我,想把我这一年来使用AI的感受以及未来趋势的看法说出来。

过去一年,我开始使用AI辅助编程,一开始只是简单的代码补全,有时能补对,有时补不对。后来我开始使用Claude Sonnet 3.5,逐渐感觉到AI辅助编程的乐趣。再后来Claude Sonnet 4.0来了,但是随之而来的是GitHub Copilot for Xcode不再支持中国地区的用户使用Claude的模型。好在很快,我又有了Grok Code Fast 1可以使用。同时GitHub Copilot for Xcode又支持了OpenRouter,这样就让我尝试了使用更多的模型,包括不少国产的模型。

GitHub后知后觉地提供了Copilot CLI,我在收购了GitHub Copilot for Xcode必须前台,以及经常写错文件的bug后,开始使用Copilot CLI,后来又因为GLM出了订阅的编程套餐,又开始尝试使用Claude Code。期间我还尝试过其它别家的产品,好多都浅尝则止,没有最终留下。

目前,我使用的主要是Claude Code + GLM 4.7,Copilot + gpt-5.1-codex-max/Grok Code Fast 1, GitHub Copilot for Xcode以及qwen-code。

展望未来

展望未来之前,我们必须要先回顾一下历史。

计算机发展的历史

谈到计算机,抛开前期的算盘、手动计算尺、机械计算机器之外,大家公认的最早的计算机是美国的电子管计算机。从它开始算起,计算机经历了电子化,小型化,移动话,最终演变成了现在的无处不在的计算设备,除了传统的服务器、台式机、笔记本,还包括手机、游戏机、智能摄像头、智能网络设备、智能家电、智能宠物、智能机器人等等等等。

与之对应的,编程手段也从最初的纸带打卡器,到机器语言、汇编语言,到更高级的c语言,面向对象的C++,面向网络的javascript等等等等。

至于应用方式,早期的计算机主要用于计算,这也是它的名字计算机的由来。而随着计算机算力的增加,人们不仅仅将计算机用于计算,还用于其它更为通用的功能,比如文字处理、表格处理、数据库、游戏、音乐、视频等等。

而为了处理这些计算之外的数据,人们必须将其它的数据转换为数字,这样才能被计算机进行处理。而这个过程被称作建模。关于建模,最经典的书籍就是算法与数据结构。建模其实就等于算法+数据结构。

未来

从上面的论述,我们不难看出,计算机的发展经历了从专一功能,向通用功能的转变。使用的手段就是建模。而现如今,有了AI,建模已经可以通过提示词,让大模型自动分析数据,自主建模了。这也就是说,编程的自动化已经基本实现了。

AI目前比较擅长文本处理,而对于其它的数据,比如图片、视频、声音等的处理,相比于文字,就要差很多。

过去一年,为了补足大模型的不足,多种工具涌现。从一开始的tool_use,到后来的agent,skill,但是其实你从编程角度看,这些概念其实也非常简单。

tool_use其实就是调用函数,这是大模型和传统编程的结合。tool_use就是大模型调用一段函数,提供函数所需的参数,并且获得返回值并使用。

agent和skill其实需要一起来理解。agent是名词,skill是动词。一个相当于编程里的class,一个就是method/action。也就是一个是负责出力的主体,一个是负责具体做什么的函数/动作。而这两个其实只是大模型提示词进行的不同描述。这些都是在大模型内部进行的,已经没有传统编程了。

简单来说,就是以前,我们的应用获取资源,是通过操作系统,大部分时间每个应用都是各自为政。而现在有了大模型,我们面对的是整个世界。我们需要通过agent和skill将大模型与整个世界连接起来。这个闭环一旦形成,目前存在的硬件架构、操作系统、网络等鸿沟就不复存在,唯一区别的是你使用的模型是哪个。

机遇和挑战

从上面的论述,我们不难得出结论。随着agent和skill数量的增多,大模型的能力会越来越强大。可现在的问题是,大模型是收费的,而开发agent和skill则不赚钱。这样下去,所有的钱会都被上游,也就是拥有模型的公司赚走了。而处于下游的人,不仅要面临激烈的竞争,并且也很难获得持续性的收入。

我想这也就是为什么那些美国科技公司都拼命砸钱,想要在AI市场上争夺第一的缘故吧。因为这个市场,目前的确就是赢家通吃。

国产鼠标崛起了吗?黑爵士AJ139P V3 MC简单测试

评测

最近我接连将键盘和鼠标都换成了国产的品牌。虽然都是无线的,但是之前的是可以替换干电池的键盘、鼠标,新的是内置锂电池的。

先说说为什么我这次打算换鼠标。两个原因:

  1. Mac mini M4的USB接口存在一个bug。它的前置USB接口如果连接了iPhone,那么另外一个前置接口连接的USB Hub上的2.4G无线接收器会在重启之后失效。解决办法倒是不难,只要将连接的iPhone的线拔掉,然后重启就能恢复。然后需要的时候再连接上就可以了。
  2. 2026年1月6日,罗技出了个大问题,它的驱动的macOS证书过期了,导致所有驱动的特性都不能生效了。

由于以上两点,我打算换一个蓝牙的鼠标。我之前的鼠标是罗技G304和G502 Hero。前者用来日常使用,后者用来打游戏。

近几年鼠标的趋势是轻量化,所以也打算买一个轻一些的鼠标。同时我的手长有20厘米,所以我需要选择支持大手的鼠标。

考察了一圈,我最终选择了黑爵士AJ139P V3 MC这款。这款是在筛选了之后,从最后的3款鼠标中选择的。我选它的主要原因主要是:

  1. 支持大手。
  2. 外形、颜色我喜欢。
  3. 刷新率支持1000Hz。虽然也有更高8KHz的型号。但是刷新率越高,CPU的占用也越高。而且我的显示器也不支持高刷。
  4. DPI支持24000,我之前的DPI是12000,我常用的是8000。不过现在问了AI之后,我现在使用的是3200,然后系统加速调到最大。
  5. 支持网页驱动。因为我常用的系统是macOS,如果没有网页驱动,就会很麻烦。其实备选的另外一款价格相近的红龙的鼠标,性能更强,支持8K刷新率。但是我去了红龙的官网,结果它的官网十分简陋,对应型号的鼠标根本差不多,更别提网页驱动了。
  6. 额外赠送了触电充电器。一般的鼠标都是USB充电。这款支持USB充电,还支持通过触电充电。这个充电器设计的还很不错,支持插2.4G接收器,还支持背光以及背光调节。
  7. 额外还送了一个收纳包,方便带着鼠标到处走。

设置

设置我的确要批评一下。作为macOS用户,的确驱动的方面是不如Windows友好的。说是驱动,但是主要就是配置两个侧键以及鼠标的DPI以及刷新率。侧键的主要问题是并没有像Windows那样提供设置好的命令供用户选择,而需要用户手动录制宏。

录制宏的时候需要注意,它的操作是区分按下和抬起的,比如在macOS中,我们常用的cmd+⬆️,要写入到宏应该是cmd下+⬆️下+⬆️上。而在浏览器里,因为系统会相应这个快捷键,所以一开始你只能录到一个cmd下,而无法直接录入到cmd+⬆️,不过没关系,你只需要切回浏览器,放开cmd键,然后单独按一次上箭头就可以了。

录制好宏之后,选择保存,然后将它拖动到侧键就可以了。最后将当前配置导出。

常见问题

宏绑定后,重启或者睡眠之后失效

一开始我遇到了一个问题,就是保存好的宏,绑定成功了,也能用了,但是每次系统睡眠,或者重启,再次进入系统就会失效。必须进入驱动,重新保存一下才可以。

解决办法:重置鼠标的设置,然后重新导入上面导出的设置。这下再重启或者睡眠,就都没有问题了。

找到原因了。

这个是因为切换了连接方式导致的。每次切换连接方式,比如从无线2.4G切换到蓝牙,就会宏失效,需要重新进入编辑,保存。这个应该就是固件或者驱动的bug。

蓝牙时鼠标比2.4G或者有线连接时鼠标移动更快,更贼

这是因为2.4G和有线连接时,鼠标的刷新率可以达到1000Hz,而蓝牙时只有125Hz。这导致使用相同的算法,也就是两次刷新间隔之间,前者的运行距离只有后者的1/8,这样,通过算法计算出来的距离,使用蓝牙时会是另外两种方式的8倍,所以你会感觉鼠标移动更快,变贼了。

解决办法很简单,在使用蓝牙的时候,将系统的加速功能调低即可。

网页驱动无法找到设备

首先是浏览器,必须使用Chrome内核的浏览器。macOS下直接用Chrome就可以了。Windows下也可以使用默认的Edge。不过Windows有专属驱动,也可以直接安装。

其次是只有2.4G和有线的连接方式下,才可以使用网页驱动,蓝牙的时候不行。因此,如果你发现找不到设备,先看看是不是用的蓝牙连接。

trojan在Ubuntu 22.04里会忽好忽坏的真正原因

技术

很长一段时间以来,我的trojan经常性地断线,需要经常重启它,才会好用一段时间。这很让我苦恼,我曾多次尝试修复它。但鉴于我自己的网络知识有限,每次只能依赖于通过Google搜索学习,又或者AI辅助来排查,弄了几次,都是能好上半天,但是又坏。最近,我终于搞定了这个问题,因此来分享一下。

trojan我已经使用了好多年了。有多久呢?我从Ubuntu 18.04 LTS开始,一路从20.04,22.04用下来。我虽然用的是LTS版本,但是我向来不用最新,而是使用更稳定的次新版。因此,到目前为止,我还没有使用24.04。

排查的方式

我把排查的思路写下来,如果你遇到了问题,也可以这么排查。当trojan的客户端连接之后,测速超时时,需要按照以下排查。

  1. 查看nginx里的正常网站能否使用,如果不能,则可能是nginx服务可能有问题,又或者是连接数不足。
    1. 如果是nginx服务有问题,则重启nginx服务。这个可能性比较小。
    2. 连接数不足,可以扩大连接数。
  2. 此外,也可能是DNS的问题。Linux服务器默认都会开启本地的DNS缓存,而且首选是虚拟机提供商提供的内部服务器。可是我使用的虚拟机提供商Vultr,提供的DNS内部服务器不够稳定,一旦它出了问题。也会导致trojan服务无法使用。
    1. 这类问题可以通过ping -c 3 goole.com或者查看trojan的日志来看error的类型是否是无法解析域名之类的确定。
    2. 解决办法是添加1.1.1.1,8.8.8.8这类第三方服务器到本地服务器的下方作为备用。
    3. 添加检测的脚本到cron,每5分钟执行一次,检测到了此类错误,就重启对应的dns缓存服务。

这两类问题解决之后。trojan偶尔还是会出现问题。通过查看,我发现原来trojan的代码由于太过古老,它在2021年就已经停止更新了。它在22.04下存在内存泄露。正常使用的情况下,它的内存占用只有10MB左右,但是一旦内存泄露,会逐渐膨胀到400多MB。这应该还不是它的极限,只不过是我的虚拟机只有1GB的内存,所以它最多也就能占用这么多的内存。

如果你的trojan的日志里有stream失败的错误信息,然后你看到了占用内存异常的大。就可以直接重启trojan服务。

将trojan占用内存的命令写入脚本,然后遇到大于20MB,就重启trojan服务。这可以也可以添加到cron,5分钟运行一次。

结论

原本在18.04,20.04下运行相当稳定的trojan服务,在22.04下运行的时候却因为太过古老存在内存泄露。同时虚拟机提供商提供的本地DNS服务器不够稳定,有时也会导致问题。因此,我们创建脚本,定时检测这两方面的问题,如果遇到了,就重启对应的服务。

前面我提到的信息都比较简略,这是因为在如今的时代,你只需要这些简略的信息,然后将它作为提示词,询问你自己习惯使用的AI就可以了。所以,这些简略信息已经足够了。

trojan作为一个多年停止更新的服务,目前在最新的系统中使用,已经明显过时了。解决的办法是在docker中使用旧版的Ubuntu系统。又或者想我这样,使用脚本在需要时重启服务。更好的办法是使用更现代的,更新更频繁的其他服务,比如v2ray之类的。

2026年1月16日更新

最新我发现了导致内存泄露的原因。是macOS下的FlClash。我将它关了,就好了。使用Clash Verge没有这个问题。

同时我提交了这个问题给FlClash。可以参考这篇文章。谈谈思维误区

2026年1月28日更新

将客户端换成了Mihomo的Clash Party。已经连续超过1周没有遇到内存泄露的问题了。

AI辅助编程,使用图形还是命令行?我当前的看法

技术

我是一名苹果设备的开发者,我开发过iOS、macOS、watchOS以及visionOS的应用。

大家可能注意到最近两周我提交到Copilot Xcode的bug变少了,这是因为我开始尝试使用命令行的方式编程。经过这段时间的使用,我发现二者各有优缺点。从长期来看,我认为图形界面的胜算更大,但是短期内它的缺点让我远离它。

下面我说的优缺点都是针对Copilot的亲自使用。一个是Copilot CLI,一个是GitHub Copilot for Xcode。

命令行方式的优点

更自由

命令行通常可以访问磁盘的全部空间,甚至可以帮助不熟悉使用的用户修改自己的配置文件。

使用命令行时,不必一直保持Xcode的窗口在最前。因此,可以利用这个时间多开几个窗口,或者干一些其他的事情。比如说刷刷X。图形界面就不行,它必须保证Xcode的在最前。如果不在最前,它就会不停的把它切换到最前。我之前反映过这个问题,开发者认为,会影响到其他的一些功能的实现。但是我觉得至少应该提供个选项来打开或者关闭这种吧。比如说让图形界面更接近命令行的方式。

更少的打断

使用图形的时候经常遇到打乱,一般是上下文不足。但是使用命令行的时候,从来没有遇到过类似的事情。命令行的中断往往是网络造成的,或者是配额超限造成的。

图形方式的优点

更简单的划定范围和指定区域

图形方式可以直接获得当前的文件,因此上下文更加简洁。AI往往可以在第一时间找到自己需要修改的内容。这一点是命位行方式无法比拟的。命令行要做到这一点,需要在复制粘贴之间反复切换。先复制文件名,然后再粘贴到命令行上。这个步骤虽然简单,但是很繁琐。远远没有通过鼠标点击那么简单。而且图形界面这种操作是自然而然的,不必特意去操作。

而如果在命令行下,你没有提供具体的文件信息,它就会在项目中整体的搜索,往往会花费更长的时间。甚至有时都找不到。

阻止我继续使用命令行,而不是图形的原因

长期以来,存在一个一直未解决的问题。就是图形界面下经常会写错文件。明明应该修改A的文件的内容,但是却将全部内容写入到了B文件中,并将B文件覆盖。这个问题我已经提交很久了,但是一直也没能修复。而这个问题可比上面提到的命令行的缺点要难以忍受的多。

以上就是我对这个问题的一些简单的看法。欢迎大家讨论,提出更好的意见和建议。

一起自建Trojan服务器经常断联问题的解决过程

技术

这两天我的Trojan非常不稳定,经常断连。比如昨天下午开始一直到晚上都不行。今天凌晨3点多好了,结果6点多又不行了。一直到刚刚,我决定看看到底是什么原因,能否自己修复。

遇事不决问AI

我先将我的困境描述给了AI。

  • trojan服务通过nginx代理,nginx的443端口访问正常,正常的https能访问,之前trojan也一切正常。但是最近两天经常有部分时段trojan就不能用了。这是什么原因?

AI给出了五条可能的主要原因:

  1. 运营商或防火墙干扰
  2. Nginx 配置问题或代理条件变化
  3. Trojan 后端服务自身问题
  4. 证书自动续签/变更导致短暂异常
  5. 攻击或扫描压力过大

我最担心的其实是第一条,因为对于这条我自己无能为力。AI同时提供了排查的顺序。

我选择首先排查trojan的状态。很幸运,这里面就有几个错误。我把日志发给AI。

status trojan
● trojan.service - trojan
     Loaded: loaded (/etc/systemd/system/trojan.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2025-09-09 10:16:44 UTC; 15h ago
       Docs: https://trojan-gfw.github.io/trojan/config
             https://trojan-gfw.github.io/trojan/
   Main PID: 859 (trojan)
      Tasks: 2 (limit: 1005)
     Memory: 144.2M
        CPU: 12.064s
     CGroup: /system.slice/trojan.service
             └─859 /usr/local/bin/trojan /usr/local/etc/trojan/config.json

Sep 10 01:52:23 vultr trojan[859]: [2025-09-10 01:52:23] [INFO] 127.0.0.1:55918 authenticated as 7ac54067666
Sep 10 01:52:23 vultr trojan[859]: [2025-09-10 01:52:23] [INFO] 127.0.0.1:55918 requested connection to www.gst>
Sep 10 01:52:24 vultr trojan[859]: [2025-09-10 01:52:24] [INFO] 127.0.0.1:55928 authenticated as 7ac54067666
Sep 10 01:52:24 vultr trojan[859]: [2025-09-10 01:52:24] [INFO] 127.0.0.1:55928 requested connection to e7.i.le>
Sep 10 01:52:32 vultr trojan[859]: [2025-09-10 01:52:32] [INFO] 127.0.0.1:36566 authenticated as 7ac54067666
Sep 10 01:52:32 vultr trojan[859]: [2025-09-10 01:52:32] [INFO] 127.0.0.1:36566 requested connection to www.goo>
Sep 10 01:52:42 vultr trojan[859]: [2025-09-10 01:52:42] [ERROR] 127.0.0.1:55762 cannot resolve remote server h>
Sep 10 01:52:42 vultr trojan[859]: [2025-09-10 01:52:42] [INFO] 127.0.0.1:55762 disconnected, 0 bytes received,>
Sep 10 01:53:02 vultr trojan[859]: [2025-09-10 01:53:02] [ERROR] 127.0.0.1:55792 cannot resolve remote server h>
Sep 10 01:53:02 vultr trojan[859]: [2025-09-10 01:53:02] [INFO] 127.0.0.1:55792 disconnected, 0 bytes received,>

AI也发现了这个错误,并分析说“也就是说,Trojan 运行没问题,但访问网站时遇到了 DNS 解析失败。这点非常关键!”

AI进一步分析:

  • VPS供应商自身DNS故障(Vultr、搬瓦工等偶有发生)。
    • /etc/resolv.conf 中DNS服务器填错,或者被systemd-resolved之类自动修改导致的DNS挂掉。
    • 本地防火墙或iptables阻断了外发的53端口。
    • 系统资源紧张(低内存、负载高)可能导致系统进程异常,systemd-resolved或dnsmasq死掉。

知道了原因,解决就很简单了。重启DNS服务和Trojan,故障解决。

一例特殊的Windows笔记本变卡问题的解决

技术

最近前同事的电脑变卡了,说是电脑的C盘太满造成的,她想把用户文件夹从C盘移动到D盘,问我可不可以我?我说不行,不能那么做。我以为是她的照片视频过多造成的,因为我记得她的iPhone里有很多照片和视频,而她不习惯删除。前同事陪女儿在加拿大念书,我和她约了她方便的时间,进行电脑连线。

因为远程协助存在延迟,并且同样不同获得需要系统权限的操作,我们选择屏幕分享的方式,她来操作,我观看她的操作,语音进行指挥。

看了一下,C盘总计200GB,剩余不到8GB,Windows显示磁盘占用为红色。

原本我想着只是磁盘空间不足的问题,但是实际使用中发现电脑速度非常慢,异乎寻常的慢,不正常的慢,在我的电脑上几秒钟就能查完的磁盘清理,在她的电脑上,需要几十秒到几分钟。我用任务管理器来看她的CPU是intel的11代的处理器,频率为2.4 GHz,但是实际运行的只有0.39 GHz。

我以为是她没有插电源,问她,她说插了,然后我让她将系统设置,电源和电池中的电池规划,从默认平衡改成性能优先,结果还是没有恢复,重启也还是依旧。

因为电脑型号是联想小新Air,于是我用“联想笔记本 0.39GHz 锁频”来搜索。搜索到了一篇知乎的文章,说是这个是Windows的休眠bug导致的。Windows 10或者11休眠之后,可能导致CPU会错误锁定较低的频率不恢复。并且即便使用Windows本身的重启功能重启系统,也没有用,因为休眠之后有残留数据被保留了。正确的解决办法是在Windows打开的时候长按笔记本上的电源按钮,强制关机,这样残留数据就会清空,故障就会消失了。

这么做之后,果然系统速度恢复了。可以在任务管理器中看到平时使用时的CPU频率恢复到了1.x GHz。

之后安装了腾讯电脑管家,用它的清理功能清理出来40G的空间。然后使用Windows自带的清理功能,又删除掉20G左右的Windows安装的临时文件。这样200G的C盘就有60G以上的剩余空间。

结论

虽然C盘过满会导致系统运行速度下降,但是如果速度异乎寻常的慢,就需要考虑是否还有其它的可能性。可以使用任务管理器或者性能监视器,观察系统每个组件的性能,比如常见的就是CPU、内存和磁盘。CPU速度,内存占用,磁盘占用和磁盘速度。我自己的七彩虹组装机,配的金士顿硬盘速度就有问题,经常占用100%,导致系统缓慢。

另外,磁盘清理软件,免费的腾讯电脑管家的清理功能就很好用了。不必再找其它第三方的软件了。

最后,Windows安装的临时文件,要清理,一定要使用Windows自带的清理,手动删除会提示缺少权限,删除不干净。不过Windows改变了清理应用的调用位置,以前从磁盘属性,工具里可以直接调用,现在需要在搜索里输入“清理”来搜索到这个工具。并且默认是不扫描windows安装的临时文件的,需要运行时选择管理员权限,然后在点击搜索系统文件,这样才会出现。

击音耳挂式蓝牙耳机新旧版对比

评测

因为钱真的没法省出来吗?的原因,我的2023年买的蓝牙耳机坏了,于是又买了一个新版。今天新版到了。我打算看看和旧版比有什么变化。

外观

我特意选择了相同的颜色。因为可选的另外一个颜色是黑色,我觉得太过平常了。二者的外观基本上一致,只有几处略有不同。

外观一致性提升

如图,下方新版的颜色更加对称了。圈中的部分原来是杂色的。新版已经是同色的了。这样左右两边的颜色就一致了。

IMG_20250817_094629

文字大小和颜色深浅略有变化

如图,左右两边外侧有“Powersport”的字样。旧版的字体较小,文字和图标的颜色更深,并且sport是额外加黑的。新版的字体变大,文字和图标的颜色变浅了,并且“Powersport”的颜色是相同的。

IMG_20250817_094732
IMG_20250817_094717

参数

旧版是蓝牙5.3,内置64G存储。新版是蓝牙6.0,内置32G存储。

使用感受

感觉新版的音质好了不少。另外,新版和旧版在耳机的蓝牙里显示的型号是一样的。另外,旧版的充电线可以用在新版上。

钱真的没法省出来吗?

随笔

听说过一个很玄学的说法:说是该花的钱得花,因为就算你费劲心思省了一下,也马上会通过另一种方式花出去。

这种事我也遇到过,而且就在昨天。昨天天气是中雨,雨会时不时的下。中午的时候,我从外面回家。原本想要打车,结果平时出租车蛮多的,昨天一辆没有,需要等一下。再加上当时雨没有在下,而且我骑电动车回家也仅仅需要10分钟,于是我就心存侥幸,扫了一辆电单车。

当是想的是这样就省下了10元的打车费。结果骑到三分之一就开始下了毛毛雨,骑到一半就下大了。几秒钟衣服就全透了,鞋里也全是水。我想,算了,骑到家再说吧。到了家。我把衣服都脱了,放在卫生间的洗脸池里,打算用洗衣机给洗了。然后从双肩包里拿出来手机和耳机。结果我看到耳机上粘了个东西。我还想这是从哪里吸到了个小磁铁?仔细一看,原来是耳机上的听筒因为泡水开胶了。

咨询了一下豆包,我该买个新的还是拿胶水粘上?豆包建议说还是买个新的吧。于是我跑去京东选了个颜色一样的。新的蓝牙升级到了6.0,不过对于我来说没啥区别,毕竟我也没有蓝牙6.0的设备。

换新耳机需要125元。

erji

顺便说一句,豆包P图还是挺好用的。照片上有两根头发,我让豆包去掉,结果很完美。