<feed xmlns="http://www.w3.org/2005/Atom"> <id>https://onevcat.com</id><title>OneV's Den</title><subtitle>上善若水，人淡如菊。这里是王巍 (onevcat) 的博客，用来记录一些技术和想法，主要专注于 Swift 和 iOS 开发。</subtitle> <updated>2026-07-06T20:26:35+09:00</updated> <author> <name>王巍 (onevcat)</name> <uri>https://onevcat.com</uri> </author><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="https://onevcat.com" rel="alternate" type="text/html" /> <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator> <rights> © 2026 王巍 (onevcat) </rights> <icon>/assets/img/favicons/favicon.ico</icon> <logo>/assets/img/favicons/favicon-96x96.png</logo> <entry><title>当编程变得不再有趣</title><link href="https://onevcat.com/2026/07/coding-not-funny-anymore/" rel="alternate" type="text/html" title="当编程变得不再有趣" /><published>2026-07-06T20:18:00+09:00</published> <updated>2026-07-06T20:26:35+09:00</updated> <id>https://onevcat.com/2026/07/coding-not-funny-anymore/</id> <content src="https://onevcat.com/2026/07/coding-not-funny-anymore/" /> <author> <name>王巍 (onevcat)</name> </author> <category term="一得之愚集" /> <summary> 我刚才用 dyld 的 __DATA，靠 __interpose 机制拦截了 malloc/calloc/realloc 及 malloc_zone_* 全家，现场编了一个动态库挂到你的 app 上。一旦进程内出现 FAIL_NOW 环境变量，所有 ≥100MB 的分配请求直接返回错误，配合一个 mock server 完整重现了你收到的崩溃栈。我现在有 100% 信心确认这个问题并给出修复 ── Fable 5 (xHigh effort) 面对一个我觉得如此棘手的问题时，Fable 5 在五分钟内轻而易举地使出一招偷天换日，留我独自在黑夜中瑟瑟发抖。这一刻，我仿佛看到了传说中的“神之一手”。 我从小是听着很多有关编程的故事长大的：比尔盖茨如何把 QDOS 改造成 MS-DOS，求伯君如何一个人用汇编写出 WPS，Linus Torvalds 又如何把一个“只是爱好”的内核丢到新闻组里，最后让它长成了支撑半个现代互联网的 Linux。这些故事都充满了魔力。 这种魔力一直陪伴着我，让我认为编程是一件非常“具有魔法”的事情：从 ASCII 字符组成的咒文开始，经过... </summary> </entry> <entry><title>sim-use - 给 agent 装上眼睛和手，让 mobile 开发跟上 AI 时代</title><link href="https://onevcat.com/2026/07/sim-use/" rel="alternate" type="text/html" title="sim-use - 给 agent 装上眼睛和手，让 mobile 开发跟上 AI 时代" /><published>2026-07-03T23:50:00+09:00</published> <updated>2026-07-06T20:26:35+09:00</updated> <id>https://onevcat.com/2026/07/sim-use/</id> <content src="https://onevcat.com/2026/07/sim-use/" /> <author> <name>王巍 (onevcat)</name> </author> <category term="能工巧匠集" /> <summary> 最近在公司捣鼓了一个工具，叫 sim-use：一个跨平台 CLI，让 agent 能在 iOS 和 Android 上高效且准确地”看见画面、点按元素、验证结果”。前段时间它正式开源了，日文版的介绍文章也发在了公司的 Tech Blog 上。不过说来有趣，那篇文章的初稿其实是用中文写的，后来才翻译成日文发表；现在再把它从日文”翻译”回中文、发在自己的博客上，多少有点出口转内销的行为艺术。趁着记忆还新鲜，用母语把里面的技术细节好好聊一遍。 如果你最近半年用 agent 写代码，大概经历过这个循环： 1 2 3 写 prompt → agent 出活 → 自己跑 app → 验证 / 截图 / 找 agent 抱怨 → agent 改 → 再跑 → 再截图 … “写代码”这部分工作，在很大程度上已经被 agent 承担并接手了，但是“验证”正确性对 UI app 来说尤为困难。agent 已经能在几分钟内吐出一大段像模像样的 Swift 或 Kotlin，但写完最多跑跑单元测试，然后就停在那儿了——它等你来运行、来看、来告诉它哪不对，它再根据反馈进行修改。这是相当低效... </summary> </entry> <entry><title>和产品一起成长 - 从 AI 猫娘到 Prowl 终端</title><link href="https://onevcat.com/2026/06/develop-with-ai/" rel="alternate" type="text/html" title="和产品一起成长 - 从 AI 猫娘到 Prowl 终端" /><published>2026-06-07T21:10:00+09:00</published> <updated>2026-07-06T20:26:35+09:00</updated> <id>https://onevcat.com/2026/06/develop-with-ai/</id> <content src="https://onevcat.com/2026/06/develop-with-ai/" /> <author> <name>王巍 (onevcat)</name> </author> <category term="南箕北斗集" /> <summary> 三月底回国参加了 Let’s Vision 26 的会议。在 slide 里我贴了一张用手机干活的照片，会后有不少小伙伴对此很感兴趣，来问细节，也很好奇我平时的工作状态和工具。 这大半年和 AI agent 协同的工作流逐渐成熟之后，我自己的工作习惯其实也发生了挺大变化。以前干活必须坐在电脑前，最好是能进入一种完整、连续、长时间专注的状态；但现在很多事情已经开始变成一种“持续调度”：让任务在后台跑，多个 agent 在并行工作，而人更多是在做别的事，大部分事情是在碎片时间推进的。只有当遇到更困难一些的课题时，才需要找到大片时间来专注做决策。在专注期间时，我的主要任务也从单一项目的所谓心流状态，变成了在多个不同项目之间进行快速的上下文切换（毕竟等一个 agent 响应的时候，你就是会不由自主地去看看别的项目）。也因为这样，我现在对“工作设备”的边界感越来越弱。手机、电脑、家里的常驻机器、甚至是一个墨水屏阅读器，都可以成为工作的设备：也许与其说是“工作设备”，其实更像是同一个工作空间的不同入口。 大体上来说，我现在使用手机和使用电脑是五五开：如果有大段完整时间，比如工作或者夜间能... </summary> </entry> <entry><title>用好你的 jj - 重新思考 Agent 时代的版本控制</title><link href="https://onevcat.com/2026/03/jj-for-agent-era/" rel="alternate" type="text/html" title="用好你的 jj - 重新思考 Agent 时代的版本控制" /><published>2026-03-16T23:30:00+09:00</published> <updated>2026-07-06T20:26:35+09:00</updated> <id>https://onevcat.com/2026/03/jj-for-agent-era/</id> <content src="https://onevcat.com/2026/03/jj-for-agent-era/" /> <author> <name>王巍 (onevcat)</name> </author> <category term="一得之愚集" /> <summary> 过去大半年我一直在高强度地用 AI agent 写代码，用着用着发现一个问题：“怎么组织 agent 吐出来的东西”这件事，比我原来想的重要太多了。 这话听着可能有点奇怪。大家关心的一般都是模型能力、prompt 怎么写、上下文够不够长……但真的和 agent 密集配合过一阵子之后，你会发现有个更底层的东西一直在拖后腿：版本控制。说得再具体一点，就是你拿什么样的心智模型来管理本地的代码变更。 我现在的结论是：Git 作为远端协作和代码托管的标准还是没什么好说的，但在本地工作流这头，jj (Jujutsu) 明显更适合现在这种人和 agent 来回切着干活的开发方式。这篇文章就是来安利这个的。 Git 在 Agent 时代的摩擦 Git 是个伟大的工具，这一点没啥好争的。但它的很多设计假设，是建立在二十年前”人类手工编程”的时代背景上——一个人坐在编辑器前面，想清楚要改什么，改完检查一遍，然后 add、commit、push。这套流程是给人类的线性思维量身做的：staging area 给你一个”最后再看一眼”的机会，branch 帮你隔离不同的工作流，stash 让你... </summary> </entry> <entry><title>十倍性能优化！一次终端语法高亮库的 AI 折腾与收获</title><link href="https://onevcat.com/2026/01/chroma/" rel="alternate" type="text/html" title="十倍性能优化！一次终端语法高亮库的 AI 折腾与收获" /><published>2026-01-04T16:39:00+09:00</published> <updated>2026-07-06T20:26:35+09:00</updated> <id>https://onevcat.com/2026/01/chroma/</id> <content src="https://onevcat.com/2026/01/chroma/" /> <author> <name>王巍 (onevcat)</name> </author> <category term="能工巧匠集" /> <summary> 我最近写了一个小框架 Chroma，用 Swift 在终端里做代码高亮；顺手还以它为基底做了一个（实验性的）cat 替代品 ca，能以带高亮的方式在终端里显示代码文本内容 (几乎和 bat 一样，只是又一个“I can, why not”的项目)。这篇文章想做三件事：先简单宣传一下（真的很短），然后重点聊聊这次实践中的主要收获：在 AI 驱动的迭代方式下，把性能优化这件事做“到底”变得前所未有地容易；最后再补一些在做 ca 期间学到的命令行设计和主题生态方面的东西。 Chroma / ca：一个很小的 promotion Chroma 的目标非常朴素：给它一段代码和一个语言标识，它就返回一段可以直接 print 的 ANSI 彩色字符串。 语法高亮这种东西其实早就被写烂了：Rust 有 syntect，Python 有 Pygments，前端世界里更是 highlight.js 一类的工具满天飞。但我在 Swift 生态里一直没找到一个足够顺手、又能对终端输出细节（diff / 行号 / 行背景 / 缩进）有足够掌控力的选择，于是干脆自己（准确地说：靠 AI）糊了一个。... </summary> </entry> </feed>
