肇鑫的日常博客

日常

谈谈AI的理解能力和性格

昨天AI和我执拗上了。事情的起因是这样的。

我在Xcode的项目中使用String Catalog,它是一个扩展名为xcstrings的文件,会在项目编译的时候,自动通过源代码生成本地化的文本,以便用户进行翻译。最初,我注意到AI经常会主动翻译这个文件,这本来是一件好事。不过AI的方式不是跟人一样,去填充翻译的内容。而是直接将翻译写入到文件。而它在写入的时候,有时候会将格式写错,比如少了个括号之类的。最后就导致项目无法编译通过。我权衡利弊,决定不让AI再主动更改这个文件。而是由我使用别的方式进行翻译。

我增加了提示词,我和AI说,添加新的规则,你可以编辑源码,但是不能直接编辑xcstrings类型的文件,因为这个文件是被动的,会在编辑源码时,自动改变。结果AI添加了两条规则到.claude文件,一条叫只能编辑源码,不能编辑xcstrings文件。另一条叫不能直接编辑xcstrings文件。这两条在我看来都没啥问题,于是就同意了。

结下,AI的表演让我十分无语。首先,每次它在发现xcstrings有变化时,总是尝试用git restore命令回退到旧版。因为它总认为是自己不小心修改了文件。但其实只要是Xcode编译,就会在需要时自动更新,而我手动翻译之后,它也会更新。

为了不让它恢复到旧版。我跟他说,提交时同时提交翻译。结果它不理我,非要恢复。我问它为什么?它说,因为.claude的规则高于我的指令,我说那个规则也是我添加的。而且我让它列出规则。结果我一看,根本没有不让git提交啊。AI和我说,git提交本身就属于修改,因此也不行。我说你看清楚,规则是不能直接修改。而且我又把xcstrings文件改变的原理和它说了一遍。AI死活不同意,我说那我现在命令你修改规则,但是我现在很疑惑,按照我现在理解的你的理解能力,我要如何说才能达到我想要的效果?结果AI跟我说,它将修改规则为“不能直接修改,可以提交。”我问号脸,这不就是我刚刚说的吗?然后,它改了规则,终于给我提交了。

我差点儿以为AI要造反了呢!居然不理会我的直接指令!

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文件覆盖。这个问题我已经提交很久了,但是一直也没能修复。而这个问题可比上面提到的命令行的缺点要难以忍受的多。

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