标签

#开发日志与一周短评

96 则推送

Aaron Lau(韩栖)

HomeView 就是墙上的 CarPlay —— 小组件终于有了实体

我给 HomeView 的定义是一个等式:「HomeView = 把 CarPlay 搬到墙上或者桌上 = 把 Apple Watch 放大放大再放大」。这种东西有家谱,「widgets 实体化的话题,可以追溯到微软的 SideShow」,苹果这次把它做成了客厅里的设备。

CarPlay 本身也在走出车外。9 月底有人把无线 CarPlay 做到任意安卓设备上,「很快 CarPlay 就将像 AirPlay 一样容易取得了」;我自己也在动手,「我最近也在 vibe 一个 CarPlay on Mac 的 app」。HomeView 给它添了个方向:「或许能够 vibe 一个 HomeView 的桌宠作为 PiP 的小窗」。墙上那块屏买不到,就先放在 Mac 角落。

Aaron Lau(韩栖)

Claude 的价格阶梯整体上移 —— Haiku 还会有 5.5 吗

「说到这里,Haiku 还会有 5.5 吗」。问题是从价格表冒出来的:「感觉现在 Fable 取代了曾经 Opus 的地位,Opus 取代了曾经 Sonnet 的地位,Sonnet 取代了曾经 Haiku 的地位」。整条梯子上移一格,我的日常组合是两个中间档,「Sonnet 5.5 + Opus 5.5 太神了」,最下面那格反而空了。

梯子挪了,毛病没全消失。AI 犯明显的错时我想,「不过考虑到现实生活中也会遇到这样的同事,所以说就还好」。上个月我也说过,算上偶尔犯错,「AI 似乎比大部分真人都要靠谱」。梯子怎么排都行,能稳定干活的那一档才是我天天用的。

Aaron Lau(韩栖)

两年前的快捷指令 —— 让 Codex 帮我接上逻辑

快捷指令最难的不是写,是两年后再打开。「比如这个 AirPods Max 快捷指令最初是在 2024 年写的,我都快忘记逻辑了,但是 Codex 搭配上面这个 skills 很快就能接上」,skills 来自 MacStories 主编的 Shortcuts Playground。2024 年做它时,循环和随机播放我都没加,「但我不想额外增加维护的复杂性了」。

现在维护有了帮手,记录麦当劳热量的那个指令,「我用 Codex 更新到了 2025 年的数据」。但对把一切交给自动化的文章我仍有保留,「因为该文作者的方法论建立在快捷指令的每个自动化都能成功的基础之上」。接上逻辑是一回事,每次触发都成功是另一回事。

Aaron Lau(韩栖)

刘海不碍眼了 —— 把它当成窗口的收纳区

今天的新演示视频叫「我再也不会觉得 MacBook 上的刘海碍眼了」。WindowShade 下一版的思路,是把窗口「最小化」到刘海里,「把灵动岛(刘海)作为被隐藏的窗口的收纳区」。再加上 Slide Over 和甩标题栏分屏,「我打算在 macOS 上重现 iPadOS-style 的多任务交互,就当作提前适应一下触摸屏 MacBook」。

这块地盘我四年前就惦记过。猜刘海 iPad Pro 时我写:「2.0 利用刘海的地盘搞一个菜单栏,甚至开放 app 在菜单栏常驻图标」。那台 iPad 没来,Mac 的刘海倒留下了,当年想让系统去用的那块黑色,现在我自己用上了。

Aaron Lau(韩栖)

明文 Plaintext 开发日志 —— 一次 oneshot 的 H5 文字游戏

国庆假期的新项目:《明文·Plaintext》,一款跑在浏览器里的文字游戏,地址是 plaintext.aaronlau.me。Claude 刚把 Ultracode 单独拿出来,我就拿它实测:「我用它 oneshot 了一款 H5 的文字游戏」。一次把要求讲清楚,让它从头交出能玩的版本,而不是一段段地喂。

代价也直接:「再次用完 20x 的订阅,看来以后要少用 Fable,克制住开 Ultracode 的冲动」。大招好用,但不是每个项目都配得上开一次。游戏还配了支预告片,类型我定为视觉轻小说,内容不剧透,去玩就知道。

Aaron Lau(韩栖)

GPT-6.1 Sol 为什么这么慢 —— 以时间换空间

「GPT-6.1 Sol 号称以 Sol 的价格提供接近 Astra 的智能,但是速度慢很多」,开 1.5 倍速,价格又回到原处。慢到「以至于 Sonnet 5.5 是 6.1 Sol 的 8 倍速度」,省下的钱换成了八倍的等待。

前几天我还纳闷,「话说为什么 Astra 即使用 Medium 用量消耗都很快」。旗舰烧额度,中档烧时间,横竖都要付点什么。所以我担心:「为什么 6.1 Sol 这么慢……我怕 Anthorpic 也学会 OpenAI 这招,以时间换空间」。上个月我把 subagent 比作超线程,想的是怎么拆任务;现在才发现,模型本身的速度也能拿来定价。

Aaron Lau(韩栖)

给 Live Photo 做 4K 放大 —— 一个剪 vlog 用的 skill

想把攒的 Live Photo 放进 4K 时间线,可动态那几秒的分辨率比静态照片低得多。于是「我让 Claude 做了一个将 Live Photo 的动态部分 upscaling 的 skill,可以用在视频剪辑」。问起来我只能说:「自制的,希望不会触发 safeguard fallback」。素材很多是两年前拍的,「懒癌如我,拖到现在才剪」。

也试了让 AI 直接剪片,结论很诚实:「Opus 5.5 剪的 vlog,感觉不如剪映」。节奏和取舍还得自己来。AI 负责把素材修好,剪刀留在我手里。

Aaron Lau(韩栖)

Opus 5.5 用 medium 就够了 —— 「普惠」型模型

这几周的评价:「Opus 5.5 用 medium 的 effort 就能做到以往 Fable 5 的智能,我能夸他是「普惠」型模型吗」。连界面都替它说话,「以至于选 Fable 5.1 它会让你再考虑一下 Opus 5.5」。

智能只是一半,另一半是额度和稳定。同样 5x 档,「怎么感觉 Claude 的 Max 5x 比 Codex 的 Pro 5x 耐瞪多了」;而「像 DeepSeek 在 Codex 上运行的话,往往做到最后会跟一开始设想的偏差很大」。月初我还在琢磨并发和速度,现在更在意中档设置能不能稳定把活干完。这周 AI System 6 的官网,就是 Opus 5.5 帮我翻新的。

Aaron Lau(韩栖)

WindowShade 发布 —— 把 1994 年的双击做回 Mac

6 月我说「我打算弄一个在 Tahoe 和 Golden Gate 上能用的」,今天 WindowShade 开源发布了。「名字和想法来自当年,代码是从头写的」,核心动作和三十年前一样:「双击标题栏,窗口收成一条卷帘条,留在原处;再双击,原样展开,和 1994 年一样」。窗口没离开桌面,回来时不用去 Dock 里认。

当年没有的也补了几样,比如「把窗口置顶,边写边看参考」,还有 Dock 上的窗口浏览。它要求 macOS 14 以上的 Apple Silicon Mac,画面只在本机处理,安装包还没公证,官网都写明了。演示视频的标题我起得直白:Mac 丢了 25 年的功能,我把它做回来了。

Aaron Lau(韩栖)

One More Tune —— 听一段旋律,猜一款苹果产品

「受到这个小游戏的启发,我打算做一个听音识苹果产品的 quiz」:听一段发布会或广告里的配乐,猜是哪款产品。出题最简单,难在音源。「没有合法的铃声来源,像 YouTube 不能隐藏播放器,那不是泄题了吗」,想让 AI 帮忙抓音频,「主要是 Codex 和 Claude Code 都不让我弄,说有版权问题」。

最后两条路并存:能直接播的「一般是 iTunes Store 的试听链接」,其余只能嵌 YouTube,所以手机上有的题没声音,这是上线后才反应过来的。说是「检验果粉浓度」,出题人的记忆也在被检验:有首曲子我确定在 Heard in Apple Ads 里听过,搜出来却不是。

Aaron Lau(韩栖)

iPhone 18 Pro 配色 —— 没有段落感的背板

「今年难得四个颜色都养眼」。以前的问题是两头不靠:「过往的 iPhone 配色很容易严肃,不显得活泼,或者很容易活泼,不显得堂正」,这一代算是兼顾了。渲染图看不出质感,我担心背板「不知道摸起来会不会有段落感」,今天拿到真机,「竟然是没有段落感的」。

配色再好,我也不希望 Apple 往机身上加更多颜色:「其实我个人想法是重现 iPhone 12 的那个 Studio,通过配件来达成个性化,而不是折腾机器本身」。Apple 不做,我就在 AI System 6 里做了个 CMF Studio 让大家 DIY。至于我自己这台,还是黑色。

Aaron Lau(韩栖)

HIG 出了 Markdown 版 —— 一份 md 搞定 Duo 适配

苹果为 iPhone Duo 发了一份设计指南,文件名是 designing-for-iphone-duo.md,一份 Markdown,9 月 9 日发布会当天就上线了。我的第一句话是「还真被我言中了」。8 月 macOS 27 换红绿灯的时候,我说过「所以以后有什么新规范、新要求都能够迅速适配了,官方提供一份需求文档」。不到一个月,HIG 真的有了 md 版,对象还是一台全新形态的手机。

这条路我自己走过:「比如我之前 vibe 的 app 本来是没有手机版本的,让它啃了一遍 HIG,能交出 60 分的东西」。60 分不算好,但从没有到能用,只花了让模型读一遍文档的工夫。

所以「以后有 md 文件就能解决一切适配难题,当然了,token 自备」。

  1. 260913

    以后官方会提供一份需求文档,让新规范迅速适配

    应验
    立账

Aaron Lau(韩栖)

给 WindowShade 加 Duo 开盖动画 —— ScreenCapture API 的妙用

发布会第二天,我给 WindowShade 发了 v1.0.10:「加了个开盖动画,类似 iPhone Duo 的」。做法比想象中省事,「Mac 版的我加到 WindowShade 里,正好用上了 ScreenCapture API」:先拿到当前屏幕的画面,再让它像 Duo 展开那样动起来。提示词也不复杂:「提示词挺简单的,把Apple官网交给AI去借鉴就好了,然后告诉它用ScreenCapture API」。

有一处做不到:「可惜改锁屏要打开 SIP」。锁屏归系统完整性保护管,不关 SIP 就动不了,动画只能出现在解锁之后。

WindowShade 6 月诞生的时候,只是想把 90 年代 Mac OS 卷起窗口的手感搬到 Golden Gate 上;三个月后,它开始追新品发布会的动画了。我也清楚「vibe 了一个 Mac 版 iPhone Duo 开盖动画的 app,虽然 GitHub 上一箩筐啦」,多我一个不多。

Aaron Lau(韩栖)

Subagent 是超线程 —— Excel 吃的是主模型的单核

比较几个模型干活的快慢,我觉得常被漏掉的是这个变量:「还有一个影响速度的因素是任务本身能不能被并发,是可以多线程的还是只能串行的(在这个例子中可以把 subagent 理解成 CPU 领域的超线程)」。

能拆开的任务,派几个 subagent 分头做,跑得就快;只能一步接一步的任务,subagent 再多也帮不上。表格是后一种:「我们知道 Excel 吃单核性能,所以它在 AI 领域其实也是吃主模型的能力」。公式一环扣一环,前面一格算错,后面跟着错。还有一个变量是时间:「所以可能还要加一个变量是模型的上线时间,还有harness距今有多久」。

月中我说过先把 Excel 转成 Markdown 再交给 AI。格式这一关过掉之后,剩下的就是主模型单核的硬功夫。

Aaron Lau(韩栖)

限时 +50% 变永久 +25% —— AI 订阅的数字游戏

「Claude Code 要从限时 + 50% 回落到永久 +25% 了」,9 月 14 日生效。听起来像是永久多送四分之一,实际上比这个月少了一截。这种说法我不陌生:「上一次听到这种数字游戏还是在 DeepSeek 在 5 月调整为原定价的 25%」。降价、加量、限时、永久,几个词排列组合一下,用户得拿计算器才知道自己是赚了还是亏了。

订阅档位也是一样。我月中算过一笔:「所以 200 美元的 plan 相对于 100 美元的 plan 是 4 倍的 5h limit 和 2 倍的 weekly limit」。价格翻倍,五小时额度给四倍,周额度只给两倍。

更根本的问题,月中我就觉得「好问题:原先的 quota 是情分还是本分」。如果是情分,回落就是收回人情;如果是本分,回落就是变相涨价。用惯了加量的人,只剩一句「由奢入俭难啊」。

Aaron Lau(韩栖)

AI 写代码,原生开发回来了 —— 受益最大的是 iPadOS

AI 写代码之后,我对跨平台框架的看法变了:「AI code时代希望软件不要再用统一框架,在每个平台使用原生开发不是能最大化发挥平台优势吗」。2024 年我的感叹还是「毕竟现在的桌面端应用程序,万物都是 Electron,万物都是 Chromium」。那时候大家用一套代码打天下,是因为每个平台各写一遍太贵;现在最贵的那一部分,写代码本身,便宜下来了。

顺着推下去,「似乎 agentic coding 最大的受益者是 iPadOS 或 visionOS」。人不愿意为小平台单独花时间,agent 不挑活。

平台方能做的事也变简单了。系统每年改圆角、改红绿灯,与其指望开发者一份份读文档,不如把规范写成 agent 读得懂的样子:「所以以后有什么新规范、新要求都能够迅速适配了,官方提供一份需求文档」。这两条我先记在账上,看林檎什么时候接招。

  1. 260829·1

    agentic coding 最大的受益者是 iPadOS 或 visionOS

    待定
    立账
  2. 260829·2

    以后官方会提供一份需求文档,让新规范迅速适配

    待定
    立账

Aaron Lau(韩栖)

给 AI 爬虫投毒 —— 网站的反击与误伤

The Cutting Room Floor(TCRF)是专门挖游戏里被删减内容的维基,最近它对 AI 爬虫的做法,我只能说「The Cutting Room Floor 好旗帜鲜明的态度」:不只是拒绝,据 8 月初的一份第三方记录,它还会向特定 AI agent 返回带提示注入的页面。我能理解网站方,「但是站在对方的角度,其实跟澳洲曾经拒绝过 Google News 的逻辑如出一辙」。

麻烦在于毒药不长眼。「Claude 倒是聪明,可以绕过,但是假如没有做这方面侦测的模型厂商怎么办」。再往下一层:「比方说像使用大公司模型的不会受伤,而自己部署的,或者中转站的,有可能造成严重后果,而且溯源和追责困难」。最后吃亏的,是拿模型干活却不知道它吃过什么的人。

所以我转了一个 Anubis 的 PR,算是「一种折中的办法」。Anubis 靠工作量证明拦爬虫,不靠投毒。

Aaron Lau(韩栖)

让 AI 说人话 —— 先限缩它的词汇

让 AI 说人话,我目前觉得管用的办法是少给它几个词:「有一种让 AI 说人话的方法是限缩它的词汇,比如要求它说 Simple English」。词汇表一收窄,模型就没法拿术语和修饰把一句话填满,只能把意思说直。

另一套现成的规矩来自 Reddit 的 r/explainlikeimfive。版名是“像对五岁小孩一样解释”,版规本来是写给人看的,要求回答让外行看得懂。我的做法是照搬:「不过按照这个 subreddit 的原则,把他做成 skill,AI 暂时能够说一点人话」。

这两个办法是同一个思路:不在提示词里写一句“请通俗易懂”了事,而是给它一套外部的、写死的约束。至于「暂时」两个字,是因为模型一换代,这套规矩管不管用就得重新试一遍。

Aaron Lau(韩栖)

人脑要是能 /compact 就好了 —— AI 的毛病像人

用 Claude Code 久了,我养成一个习惯:「当你用 Claude Code 的时候,时不时 /compact 和 /clear 是好文明」。后来我发现这套说法放到人身上也成立:「用脑过度 则可以对应到 上下文过载,反映到 长对话变慢 而且 注意力稀释」。

于是我列了一张对照表:「假如人脑可以像 AI 那样 /compact 和 /clear 就好了,然后 子代理 可以对应到 摇人,continue 就是“在吗?”」。列着列着,我又把问题反过来问:「刚不小心扯远了,其实我想聊的是,会不会 AI 的这些特征,是从人类本身习来的呢」。

不过对照表里有一个指令,人类始终用不了:「但是现实世界没有 rewind 这个选项,在时间旅行实现之前」。模型可以退回上一个检查点,说出口的话和做过的决定不行。

Aaron Lau(韩栖)

Agent 不用按指纹 —— Touch ID 该重新设计了

最近让我愣住的一幕:「为什么我都没有自己登录,也没有告诉他用户名和密码,他就能从系统钥匙串自己找,自己完成整套动作,甚至都不需要按 Touch ID」。在 Mac 上,按一下指纹的意思是“人在场,人同意”,agent 接手之后,这个前提悄悄失效了。「但是 Claude 本身不像 Elpass 之类的密码管理器那样有密码锁呀」。

所以我的判断是:「假如成为常态了的话,似乎 Touch ID 和 Face ID 之类的认证方式要重新设计」。难处在于两头都得顾:「但是未来需不需要发展到检测屏幕面前是不是那个人,同时不能像 UAC 一样频繁弹窗」。

6 月我拿 Vista 的 UAC 吐槽 agent 提权太烦,那时我站在要一路点“允许”的那一边。现在 agent 连“允许”都不用点了,我反而开始担心那颗指纹按钮形同虚设。

Aaron Lau(韩栖)

让 AI 读 Excel —— 先把表格变成 Markdown

让 AI 处理表格,我的办法是先绕开表格。「我当时在 AI System 6 做了一个功能是导入 Excel 和 Numbers」,思路很朴素:「那么只要想办法把 Excel 转换成 Markdown 就行」。表格文件里有公式、数据类型,还有各家软件自己的约定,转成 Markdown 之后,模型面对的只是一行一行的文本和竖线,读得懂,也写不坏。

算数这件事,我更愿意交给工具。「通俗的比喻是,高考考场可以带计算器,也就是可以调用工具才解决的」。数字之所以要较真,是因为「出错了担当不起,假如我是领导旁边的小秘书的话,也会仔细核对数字」。

为什么不干脆等一个什么都擅长的模型?我的感觉是「好像是强化一项能力,就需要在另一项能力作出让步,不存在六边形战士」。与其等六边形战士,不如先把格式这一关替它过掉。

Aaron Lau(韩栖)

一周刷爆三家额度 —— AI System 6 的 token 账

做 AI System 6 的这一周,我交出一份不太体面的账单:「我已经把这周的 Claude Max 以及 ChatGPT Pro 订阅刷爆了,还有 DeepSeek 用了 100 亿 token」。AI System 6 是我在做的一张 AI 桌面,口号是 A working AI desktop, not a chat window,从 System 6 一路做到 Liquid Glass,在浏览器里开机。两家的周额度先见底,剩下的活就落到 DeepSeek 身上。

便宜的那一家也在变。第二天我看到「今天是实施峰谷定价的第一天」,平峰价是高峰价的一半,高峰为周一到周五 UTC 01:00-04:00 和 06:00-10:00,什么时候跑任务从此也算进成本。工具链还有一个坑:「哦对,DeepSeek V4 Pro 在 Codex 里暂时用不了子代理(?)」,想让它分头干活,得换个壳子。

三家额度一起见底,说明这种规模的项目,一个订阅已经兜不住。

Aaron Lau(韩栖)

HyperCard 与 AI coding —— 像在哪里,不像在哪里

最近翻 HyperCard 的资料,我觉得它跟现在的 AI coding 有点像:都让不是程序员的人,也能做出别人能用的小软件。这段想法我先写了草稿,再让 AI 润色过,核心的判断是我自己的。像的地方很明显,不像的地方更重要:「以前 HyperCard 是降低了写程序的门槛,你还是需要理解自己做的东西;现在 AI 更多是在帮你完成实现,有时候甚至连中间过程都省掉了」。

同一时间我看到微软出版社裁员的新闻,想到的是软件书的命运。以前一本软件书能卖好几年,现在「你花半年写一本教程,可能刚出版,里面的截图、步骤、功能都已经过时」。

这也让我反思自己写东西的方式:「以前我们努力做一个“完成品”,比如一本书、一篇文章;现在很多东西更像一个长期维护的项目,需要不断成长」。HyperCard 的 stack、AI 写出来的 app、一篇会过时的分析,到最后都是同一个问题:做出来以后,还有没有人继续维护。

Aaron Lau(韩栖)

让 AI 画 Liquid Glass,它画出了 Vista

给 AI System 6 做 Liquid Glass 主题时,我偷了个懒:「让它用 Image Gen 技能逐个生成 Liquid Glass 风格的图标,但是出来的是 Vista」。这个结果有点好笑,去年夏天我自己就说过「macOS Tahoe 是 Vista」,现在连模型都站到了我这边。

做这么多年代的主题,起因是「主要是受了 AI Desktop 98 开发者近日推出 AI Desktop XP 的刺激」,「心想他可以,那我也拓展一下吧,AI System 9、10.2、10.6、10.10 和 26」。代价是 token,这几天的进度我的总结是「主要是 DeepSeek 那边烧了 100 亿 token 还没把事情办好」。Liquid Glass 图标最后还得自己一张张盯着做,Vista 那一版,就当作给 Tahoe 的旧账补一个注脚。

Aaron Lau(韩栖)

AI System 6 要横跨几个年代 —— 先收口再说

AI System 6 原本只有一个年代,现在我想让它多住几个:「所以我也打算涵盖多一点主题,AI System 6、9、10.2、10.6、10.10 和 26」。难度不是平均分布的,坑在中间:「中间 Mac OS X 的,得认真设计,512 x 512 的图标诶」。Aqua 那几代的图标走写实路线,尺寸一下子大了很多,没法糊弄。

所以我得先给自己设一条线:「我觉得我需要先收口,假如今天还是想不到办法的话,停在 Mac OS 9 的 Platinum 算了」。两天后,对外的说法也定了:「假如明天要发布的话,只能提供 Classic、Platinum 和 Liquid Glass,其他几个还需要更多时间」。首尾两端加一个中间点,先把能交付的交出去,Aqua 那几代慢慢画。

Aaron Lau(韩栖)

额度用完之后去哪 —— 从蹭 Wi-Fi 到蹭 token

我现在的工作流有一个固定的第三站:「我现在是 GPT 和 Claude 的额度都用完之后就会跑到 Kagi」。两家订阅轮着用,用到见底,就去一个带 AI 的搜索引擎接着查。

这在一年前是我想不到的。「我之前对搜索引擎 + AI 是比较抵触的,直到我自己也做了一个」。也是在那时,我才知道 Kagi 有 MCP。

几家里面,我更倚重的是 Claude:「以至于下个月我想开 Claude 的 Max 而不是 GPT 的」。额度这件事,也让我对一个新现象很有感触:「从蹭 Wi-Fi 到蹭 token」。这周有人提到 DeepSeek 也要涨价,我算了算自己烧掉的量,第一反应是「这要是换成 Opus 4.8 或者 GPT-5.6 Sol 得花多少钱呀」。

Aaron Lau(韩栖)

Codex 爱测试,DeepSeek 省 token —— 两个 agent 的习性

DeepSeek 接入 Codex 这件事变简单了。「之前很麻烦,需要常驻第三方工具,现在直接提供脚本了」。用了几天,我发现一个没想到的好处:「然后由于 DeepSeek 不支持多模态,意外地省 token」。

省在哪里,要看另一边。很多 agent 验证自己的成果时喜欢截图,改完一个表格、一个页面,先拍一张再看。「Codex 默认也是,所以我工作文件夹累积了 10.27GB 的垃圾」。截图一多,既占硬盘,也占上下文;DeepSeek 看不了图,只能老老实实读文本,反而少烧了一大截。

Codex 还有一个习性:「Codex 确实太喜欢测试了,功能都没做出来」。测试是好习惯,可它常常先把测试脚手架搭得很完整,真正要做的功能还停在半路。

Aaron Lau(韩栖)

面向 AI 的写作软件 —— 不是 Word,是 Photoshop

「打个比方,假如说 LLM 是有损压缩的话,那文字可以像图像一样处理」。图像压缩之后,我们不会逐像素去修,而是调整一个区域的亮度、换一块背景;文字交给 LLM 以后也是这样,它成了一块可以整体调整的材料,这一段语气软一点,那一段删掉一半。

我的结论是「所以面向 AI 的写作软件不是 Word 的形态而是 Photoshop 的形态」。Word 的核心是光标,你在哪里,字就在哪里长出来;Photoshop 的核心是图层和选区,先圈出一块,再决定对它做什么。顺着这个比喻我又想到人脑:「似乎人脑也是这样运作的,图片虽然记忆快,忘得也快,文字可以记很久」。

Aaron Lau(韩栖)

shiftscreen 与 Lok Board —— 我也在做同样的蠢事

聊到窗口管理的新点子时,我先问了一句:「你还记得 shiftscreen 和 Lok Board 吗,两个 Stage Manager 替代品」。

它们都做出来了,也都能用。问题在后面:「虽然这已经成为现实了,但是大众还是不愿意把它纳入 daily drive,这件事情本身可以说明一些问题」。一个替代品能跑起来,和一个人愿意每天开机就用它,中间隔着很长的距离。

说完我自己愣了一下:「之所以提起这两个应用,我意识到我也在做同样的蠢事」。6 月我开始复刻经典 Mac OS 的 WindowShade,初衷是「我个人对 WindowShade 的想法是可以隐藏掉 Dock 栏,节省笔记本电脑的纵向空间」。想法我到现在都觉得没错,可它跟 shiftscreen、Lok Board 面对的是同一道门槛:做得出来,不等于有人愿意换。

Aaron Lau(韩栖)

5 小时防沉迷又要回来了 —— 额度焦虑的日常

这周我的状态可以用一句话概括:「快点 reset 啊啊啊啊」。额度按周期重置,我却按天烧完,「昨天 reset 的昨天已经用完了,今天 reset 的今天也已经用完了,所以才开的 Pro 5x」。升级后看了一眼仪表:「诶,我发现升级到 5x 之后刚好剩 80% 用量,也就是说今天用了 Plus 的 20% 用量」。换算回去,原来的 Plus 一天就见底。

然后坏消息来了:「5 小时防沉迷又要回来了」。我叫它防沉迷,因为它跟游戏里那套机制一样,玩到一定时长就强制下线。第二天看到 r/ClaudeCode 上的讨论,我只说了一句「怪不得 Codex 要恢复 5h limit」。接下来能做的,只有等 reset。

Aaron Lau(韩栖)

AI 订阅的价格阶梯 —— 5x 为什么不是 5 倍价

今天升级订阅时我算了一笔账。「但是 Claude 的 5x 是 1x 的 6.25x 价格,想不通」,而「但是 ChatGPT 的 Pro 5x 是 Plus 的 5x 价格」。用量也说明问题:「假如一天就能用完 Plus 的用量,那么 5x 似乎也只是确保能用一周」。重度使用的人,5x 不是奢侈,只是够用。

两天后我又发现另一头:「等等,我才意识到 Pro 5x 是 Plus 的 5x 价格,但是 Pro 20x 仅是 Plus 的 10x 价格」。中间档按倍数收钱,最高档反而打对折,答案很明显:「所以官方的这个价格阶梯是鼓励大家买 200 美元的 tier 吗」。

林檎早就玩熟了这一套,「怪不得 iCloud 是 50GB、200GB 下一级就是 2TB」,我顺手给它编了新名字:iCloud+、iCloud Pro、iCloud Max 5x 和 iCloud Max 10x。2022 年我说 MacBook Air 的容量定价时也讲过,「或者说,8+256 充当了锚,星巴克里面的依云矿泉水,实际上真正的入门款是 8+512」。AI 订阅的 5x,就是这一轮的依云矿泉水。

Aaron Lau(韩栖)

我的 Surge 规则交给 Codex 了 —— 一种虚无感

「感受到了一种虚无,长年累月累积下来的 Surge 规则,现在靠 Codex 来维护」。那些规则是我一条条攒起来的,哪条为哪个服务加、哪条后来失效,我曾经都记得;现在只要描述想要的结果,剩下的交给 agent。更让我服气的是,「重点是这台服务器由于太久没登录,自己已经忘记怎么维护了,它能帮我完成迁移」。

虚无感就来自这里:以前这些知识是我的,现在它们变成 agent 每次重新读出来的东西。同一天晚上,我给准备公开的项目加了一层防护:「这里用 Cloudflare 做了下防护,我觉得具备向公众开放的条件了」。维护交出去了,开不开门还是我自己决定。

Aaron Lau(韩栖)

AI System 6 的路线图 —— 先 web,再 native,最后上 iPad

AI System 6 走到一个岔路口:「我在想说要不要把 AI System 6 部署到服务器上或者做成 native 版」。

这个问题其实我一开始就想过:「我当时的想法是先做 web 版然后做 native 版最后上 iPad」。回头看这几个月,路线并没有走得那么直。5 月底我在备忘录里给自己列过一张修 bug 的清单,最后一句是「然后所有这些功能,用 0.8B 还有 4B 的模型测试一遍,然后加新功能」。也就是说,它得在很小的本地模型上也跑得动。6 月我又岔出去了一段:「上个月我不是在做 AI System 6 嘛,做着做着对 WindowShade 着了魔」。

按我当初定的顺序,web 版这一站还没走完,部署出去让别人用,应该排在 native 版前面。

Aaron Lau(韩栖)

Feedback Assistant 里的八百年 —— 沾上战略就一夜支持

「以前在 feedback assistant 上报都没人理的」。这句话我一个月里说了两次。上一次是在 6 月:「从前躺在 Feedback Assistant 八百年都没人理的」。

功能还是那个功能,用户也早就提过,变的是林檎自己需不需要它。我的观察是:「假如跟他们未来的策略沾边的话,比如 Apple Arcade+ 或者游戏什么的,他们可以在一夜间完全支持」。沾上战略的需求,不用排队;不沾边的,写得再详细,也只是 Feedback Assistant 里的又一个编号。

所以与其猜一个反馈会不会被处理,不如看它和林檎接下来想推的东西离得多远。

Aaron Lau(韩栖)

不把鸡蛋放在一个篮子里 —— AI 对话的备份问题

「Code 还好点,保存在本地,但是 Work 和 Chat 没有备份啊」。代码会话落在自己硬盘上,聊天和协作对话全在服务商那边。我就遇过,之前跟 Claude 聊过的普通聊天一夜间消失了。

导出也兜不住:「而且它那个 export your data,似乎不会导出完整的对话记录」。

所以我的做法很朴素:「目前是 GPT 和 Claude 轮流用,不想把鸡蛋放在一个篮子里」。Claude 集成在一个 app 里,ChatGPT 要装两个,各有不便,但任何一边出事,另一边还在。

Aaron Lau(韩栖)

林檎的温和 AI 路线 —— Core ML 改名 Core AI 之后

翻到 2020 年 Ars Technica 一篇林檎讲机器学习的采访,忍不住想:「另一个时间线,假如整个 2020 年代是这种温和的 AI 进展,没有所谓 LLM 的话」。那篇文章里没有聊天机器人,而「文章里列举的工作最终都做进了 iOS 系统里」。

林檎并非没碰语言模型,2023 年 iOS 17 的键盘预测就基于 GPT-2,今天的 AFM 3 Core Advanced 也是 Transformer。另一篇两年前的文章这次再读,感受变了:「开始能理解 Apple 的想法了,特别是 Core ML 改名 Core AI,会不会他们才是能笑到最后的」。先记一笔。

  1. 260708

    Core ML 改名 Core AI 之后,林檎的温和路线可能笑到最后

    待定
    立账

Aaron Lau(韩栖)

让 agent 改系统设置 —— 方便,但是黑箱

「虽然时至今日 agent 可以修改任何系统设置,但是对用户是黑箱的,不够透明」。它跑几条 defaults 命令就办完事,你不知道它碰了哪些键,也不知道怎么改回去。

办法是记账,「听起来很像 Total Uninstall 那种在软件安装过程中就开始介入的模式」。可「如果这个问题连第一方都处理不好的话,我在想第三方的机会在哪里」,我最近确实想做一个 defaults 相关的 app。macOS 27 的圆角和侧边栏,在 26 上改几个 defaults 就能提前实现,一条命令就能改掉界面。

2024 年我还说「最好是官宣取消 Settings app,以后用 LLM 驱动的 Siri 来更改系统设置」。两年后自然语言改设置成真了,来的不是 Siri 而是 agent;我也从希望它取代设置界面,变成希望它留下一份看得懂的记录。

Aaron Lau(韩栖)

便笺的「浮动于上方」 —— macOS 唯一会置顶的第一方 app

「如果我没记错的话,Stickies 是整个 macOS 中唯一具有窗口置顶能力的第一方 app,因为继承经典 Mac OS 的传统」。便笺菜单里有一项“浮动于上方”,勾上就盖在所有窗口上。

复刻 WindowShade 时我把置顶也做了进去。Windows 有 PowerToys 的 Always On Top,macOS 却没有。我最常用它钉住 iPhone Mirroring 和 Apple Music 迷你播放器,「打个不恰当的比方,Excel 的冻结窗格」。

2021 年我说过「说起来 Stickies app 的 UI 二十年来始终如一」。五年后再看,它连经典 Mac OS 的置顶能力也一起留了下来。

Aaron Lau(韩栖)

回不去古法编程 —— ChatGPT 规划,Codex 动手

「主要是大家习惯了更多的产出,如果没了 AI 回到古法编程,在约定时间内根本完成不了」。交付标准已经按有 AI 的速度定好,单靠人手追不上。

既然离不开,就得分配额度。一个 MCP 能打通 Codex 和 ChatGPT,「平时亦可用 ChatGPT 为 Codex 项目做规划以节省用量」。实测下来分工很清楚:「让 ChatGPT 为 Codex 项目做规划可以,但是让 ChatGPT 直接改代码好像要烧掉不少时间」。规划交给 ChatGPT,动手还是 Codex。

Aaron Lau(韩栖)

iPhone Mirroring 的圆角 —— 唯一对不上的窗口

「说到 R 角的问题,iPhone Mirroring 这个不能自圆其说」。

我在开发折叠标题栏的 app,发现它是特例:「因为其他窗口四个角都是 R 角一致的,但 iPhone Mirroring 不是,他甚至跟 iPhone 机身的圆角没有关联,你会觉得很割裂」。顶部和底部的圆角不一样,只能单独处理。macOS 27 刚统一了窗口圆角,原以为剩下的只有标题栏,没想到还有这个漏网之鱼。

2024 年它刚出来时,我看重的是能省掉几个 app 版本,Things 3 我买了三份。两年后自己写窗口工具,才看到它的四个角没按 Mac 的规矩来。

Aaron Lau(韩栖)

Dock 不再领先 —— 最小化的窗口该留在原地

「曾经 Dock 栏或者说任务栏是一个领先的设计,但是现在屏幕普遍比之前大」。外接大屏上,鼠标从屏幕中间拖到 Dock,要走很长一段路。

最小化更别扭:「而且最小化的窗口从 Dock 栏找,还不如从它被最小化之前的位置找」。所以我复刻 WindowShade,在 15 寸 Air 上隐藏 Dock,让窗口卷成一条标题栏留在原地,双击还能看到后面的内容。

还没定的是预览怎么触发:「hover 也做过,但是 timeout 不好控制,我还没掌握到 hover 的诀窍」。停太短会误触,停太长又像没反应。

Aaron Lau(韩栖)

AirPods Max 的线控 —— 一个操作按钮快捷指令

我做了个 AirPods Max companion 快捷指令,灵感来自 iPod nano 7 和 EarPods 线控:单按 iPhone 操作按钮,暂停音乐、切到通透;再按一下恢复播放、切回降噪。按住等振动再按音量键,就能切歌。

其他有降噪的 AirPods 也能用,「不过对 AirPods Max 最实用,因为摘下来会破坏发型嘛」。「虽然 2 代有自适应降噪和对话感知,但我还是觉得这个快捷指令有其存在的价值」。

最麻烦的是记住当前状态。Shortcuts 到 iOS 27 才有官方的持久化存储,以前只能把状态塞进 iCloud、提醒事项或备忘录,麻烦又脆弱。

Aaron Lau(韩栖)

复刻 WindowShade —— 卷起窗口,藏起 Dock

WindowMizer 这个 app 只支持到 Ventura,所以「我打算弄一个在 Tahoe 和 Golden Gate 上能用的」WindowShade。「我个人对 WindowShade 的想法是可以隐藏掉 Dock 栏,节省笔记本电脑的纵向空间」,反正还可以用 command + tab 切换应用;接外接显示器时,在原地卷起、展开窗口,指针不用大老远移到 Dock 栏。

难点在标题栏。WindowShade 的原意是把窗口卷到只剩标题栏,可 Liquid Glass 的标题栏和控件融成了一体,我还在想是不是要自己画一个单独的标题栏。WindowShade 一开始也是第三方软件,「而且 Bartender 今年被彻底 sherlocked 了,当年 System 7.5 至少还会把 SuperClock! 给买下来」。

2022 年我嫌「Stage Manager 把多任务变成了一种负担,一种仪式,一种折磨」。四年后我给自己找的窗口管理方案,来自一个还没有 Dock 的年代。

Aaron Lau(韩栖)

Mac Catalyst 绕的一大圈 —— 触屏 MacBook 的阳谋

Mark Gurman 说,MacBook Pro 加触摸屏是为了多提供一种交互方式,而不是替代。但他没回答:MacBook Pro 为什么需要触摸屏?我能想到的理由只有一个,在 MacBook Pro 上运行 iPadOS 那些触摸优先的 app。

我在想这是不是一个阳谋。2019 年的 Mac Catalyst,和 2020 年 M1 Mac 直接运行 iPadOS app,总感觉是一路铺过来的。可 Catalyst 的愿景似乎从未实现,移动端的 app 数量优势没有转移到桌面端,开发者反而用 opt-out Mac App Store 的方式抵制。时过境迁,缺 app 的反而成了 Intel Mac,macOS 27 只支持 M1 起的 Mac,Universal Binary 2 也快退出历史舞台。「假如 Mac Catalyst 出道即成功,那就不需要绕这么一大圈」。「现在变成你需要有一台 iPhone 才能运行 iPhone apps」。WWDC26 那篇给 Sidecar 适配触摸手势的 Technote,在我看来醉翁之意不在酒:「触屏 MacBook 应该是成定局的,就看有哪些交互问题可以被提前发现并解决,不然还要等下一年才会改」。

2022 年我说「与其指望 iPad Pro 搭载 macOS,不如指望 MacBook Air 搭载 iPadOS」;2024 年 iPhone Mirroring 出来,我担心它让桌面端 app 更加荒芜。如今的答案是 MacBook 长出了触摸屏,离当年那句话不算远。

  1. 260611

    触屏 MacBook 应该是成定局的

    待定
    立账

Aaron Lau(韩栖)

WWDC26 重头戏在 PSOTU —— 大写的 Code Intelligence

「我觉得今年的重头戏应该是在 Platforms State of the Union」。北京时间凌晨 1 点的 Keynote 可以看个热闹,凌晨 4 点那场才是正餐。理由有两条。第一条是我前几天的判断:AI 管道化,林檎今年还是指望开发者多用它的 Foundation Models,真正的干货就该讲给开发者听。第二条是措辞:「过去也有“code intelligence”的提法,但是这次是大写」。同一个词,以前是一句描述,今年在预告里成了专名。

这让我想起另一种 WWDC:「那一年有许多引擎盖下的更新,包括说 Grand Central Dispatch」。用户层面看不出多少花样,开发者却拿到了一整套新工具。

iOS 27 消费者那一侧的传闻越单薄,我越倾向于相信,今年会是那样的一年。

  1. 260606

    WWDC26 的重头戏在 Platforms State of the Union

    待定
    立账

Aaron Lau(韩栖)

给 Agent 提权,人最慢 —— 比 Vista UAC 还烦

现在大家用 Codex,基本都是把权限给够。原因我想得很清楚:

给 agent 权限这件事情本身,人类的效率是最低的,假如每一项提权操作都需要人来确认,那会比 Vista 的 UAC 还要烦

假如每一步都停下来等人确认,人就成了整条链路里最慢的那一环。这个比喻我不是第一次用。2023 年 iOS 16 加了剪贴板弹窗,我就问过它「会不会让你想起 Windows Vista 的用户账户控制」;再早一年,我担心的是提示一开,用户拒绝剪贴板反而成了不正当的事,最后被骂的是 iPhone,而不是滥用剪贴板的开发者。

那时我站在被弹窗打扰的用户这边,替用户嫌烦;现在我自己就是那个要一路给 agent 点「允许」的人,结论没变,只是嫌烦的人换成了我。

Aaron Lau(韩栖)

新功能叠不上去 —— AI System 6 的第一道坎

AI System 6 做了两周,我撞上了第一道坎:「现在遇到一个烦恼是,很难再往上叠新功能,会把已经实现好的功能打破」。AI 写得很快,可每加一个功能,它都可能顺手动到旁边已经调好的地方。

所以我在备忘录里给自己排了顺序:先修 bug,再测,最后才加功能。「然后所有这些功能,用 0.8B 还有 4B 的模型测试一遍,然后加新功能」。小模型能跑通,心里才有底。调好的 CSS 也要写成文档,下一个接手的 AI 才知道哪些不能乱动。

上下文也是硬约束:「刚好我在 vibe 的 app 没个 128K 上下文,无法保证日常功能」。我做这套桌面隐喻是为了治上下文爆炸,开发它的时候,最先撞上的也还是上下文。

Aaron Lau(韩栖)

AI 额度用完之后 —— 偷偷降级,还是另给一份老模型

写代码的 AI 都有额度,额度用完之后怎么办,各家做法不一样。我的理解是:「我记得 Gemini CLI 以前的策略是自动调整模型,让你一直可以写代码,都是偷偷降级,然后 Codex 是将 GPT-5.3-Codex-Spark 这个老模型的额度给独立出来」。

前一天看用量时我就注意到,「似乎可以理解为 GPT-5.3-Codex-Spark 这个模型的用量是独立的」,OpenAI 的说明也是研究预览期间它有单独的限额。主力模型的额度用完,还有一份老模型的额度可以接着用,用户知道自己换了模型。

偷偷降级的麻烦在于,你不知道此刻在跟哪个模型说话,写出来的东西突然变差,也不知道该怪谁。

Aaron Lau(韩栖)

用 Marp 做演示文稿 —— 既然大模型爱写 Markdown

「最近在研究用 Marp 做演示文稿,既然大模型喜欢输出 markdown 的话」。Marp 把一份 Markdown 文件按分隔线切成一页页幻灯片,可以导出成 HTML、PDF 或 PPTX。大模型最顺手的输出格式,直接就能变成演示文稿。这样做的好处是,内容就是一份文本,改一句话不用点开 Keynote 找文本框,交给 AI 改也不会把排版弄乱。

难点在视觉。「但是风格要如何多变化,这是一个问题,理论上可以让大模型来制作模板」。Marp 的主题是 CSS 写的,样式和内容分开放,内容让模型写,主题也可以让模型写。

只是模型做出来的模板会不会千篇一律,我还得多试几套才知道。

Aaron Lau(韩栖)

自动拉起 LM Studio —— 让本地模型开箱即用

这几天给我的 app 加了一个功能:「我做了自动拉起 LM Studio 的功能,如果之前有下载过模型,应该就可以直接用了,默认是 qwen3.5-4b-mlx,也可以用其他模型」。用户不用自己开 LM Studio、再去开本地服务器,点开 app 就能和本地模型说话。安装包看着不小,但「node.js 打包可能显得文件体积很大,但是主要的代码只有 1.44MB 不到」,大头是运行时。

帮助文档也不必另开网页:「可以直接在 ClioTalk 里问他是干嘛的,我内置了三份帮助文件进去」。交给模型,让它来答。

三年前我说苹果要作出区隔,只能选本地 AI 的赛道。如今轮到我自己,在 Mac 上把本地模型接进一个 app。

Aaron Lau(韩栖)

DeepSeek 便宜是便宜 —— 领会意图还不如 Gemini

前天下午三点多,我还在打 DeepSeek 的主意:「我在想说假如加一个 deepseek-v4-flash 的选项,因为价格很便宜」。四点四十,我改口了:「我收回这句话,我让 DeepSeek 加一个功能上去,弄了一个小时还没好」。

五点二十,结论出来了:「我觉得 DeepSeek 在这个场景下,领会意图的能力还不如 Gemini」。写代码的能力可能不差,难在听懂我到底要什么。一小时做不完一个功能,单价再便宜,总账也不好看。

注意“这个场景”四个字。我要它做的,是把一个还在我脑子里的想法变成功能,这种活最吃领会意图的能力。

Aaron Lau(韩栖)

Codex 不好带 —— 今天改完,明天又被改回去

用了几天,我的结论是:「好吧,我感觉 Codex 不太胜任编程任务,token 用了一堆,但是项目没实质性进展」。也可能是我自己的问题:「也可能是我不太会用,约束条件设的不够,总是一个点来回改,今天改完,第二天又被 agent 改回去」。agent 每次开工都像一个新同事,不记得昨天为什么那样改,看到不顺眼的地方就顺手“修正”回去。

现在的解法很笨:「除非我一直盯着他,拆成若干个小步骤来改,否则他总是会偏离我的原意」。一直盯着,等于人又回到了逐行把关的位置,省下来的时间又还了回去。

两天前我还说「Codex 目前为止的竞争力还是比 Claude Code 便宜这一点」。单价便宜是真的,可同一个地方改来改去,来回的 token 也都记在账上。

Aaron Lau(韩栖)

AI 才是真正的电脑 —— AI System 6 的硬件隐喻

做 AI System 6 这几天,我给它定了一套隐喻:「模型对应 CPU,上下文窗口对应 RAM,RAG 对应硬盘和软盘,最终交付成果对应光盘」。照这么对下来,「那么 AI 其实才是真正的“电脑”对吧?」

这套对应顺下来挺自然。CPU 可以换代,模型也可以换;RAM 断电就清空,上下文窗口一个会话结束也就没了;硬盘和软盘存着长期的资料,随时可以插进来读,RAG 检索的资料库就是这个角色。用 90 年代 Macintosh 的桌面来装这些东西,每个概念都有一个看得见的位置。

开发本身也在印证这个隐喻。我现在是「Gemini CLI 和 Codex 双线研发」,等于同一台电脑轮流装两颗 CPU。烦恼也跟着来:「AI 同时改这么多个地方的代码,人类要怎么 review 啊」。

Aaron Lau(韩栖)

AI System 6 开工 —— 借 System 6 的桌面装下 AI

今天凌晨,我 vibe 出了一个 System 6 外观的 AI 助手的第一版,我叫它 AI System 6。「灵感来源是 AI Desktop 98 这个 app」,不过我想换一个时代,换一套系统。

为什么是 System 6?「为什么是 System 6 呢,因为 Mac OS 7 是彩色界面,同时操作变复杂许多」。System 6 还是黑白界面,操作也简单,适合拿来当一个干净的底子。

我想借它解决的是上下文。和 AI 聊久了,一个对话框里什么都有,模型和人都会迷路。我的思路是「借用 90 年代 Macintosh 的桌面隐喻,解决上下文爆炸的问题」:事情分进各自的窗口和文件夹,不再全挤在同一条聊天记录里。

Aaron Lau(韩栖)

代码只要下一个 AI 看得懂 —— 我对 review 的看法变了

Anthropic 发了一篇讲 agent 怎么“看”软件的文章(Seeing like an agent,讲 Claude Code 的工具怎么按模型的视角设计),我读完的感想是:「现在软件都是默认给 AI 用了」。写代码这件事也一样,聊到纯靠 vibe 做出来的项目,我的标准是:「只要下一个接手的 AI 看得懂上一个 AI 生成的代码就可以」。人不一定逐行读懂,但交接链不能断。

这和两年前的我不太一样。2024 年 WWDC 之后,我从信任的角度问过:「比如 ChatGPT 生成的快捷指令,生成的代码,你敢不敢不 review 就直接用?」那时的前提是人要把关,代码必须人看得懂。

现在把关的那一环往后挪了。2024 年我在意人敢不敢不 review,2026 年我更在意上一个 AI 写的东西,下一个 AI 接不接得住。

Aaron Lau(韩栖)

氛围编程会瓦解 App Store —— 长尾需求自己写

我最近越来越确定的一个想法:「因为假如 vibe coding 可以解决许多长尾的需求,App Store 的商业模式就被瓦解了」。App Store 赚钱,靠的是很多人为同一个需求付钱。以前没人愿意为五个用户开发一个 app,现在用户可以让 AI 写一个只给自己用的版本,这份钱就不经过商店了。

苹果自己的节奏却慢得让人着急。传闻里苹果要推出独立的 Siri app(Gurman 3 月报道,iOS 27 上测试),我的反应是「2026 年才想到要推出一款独立的 Siri app,真是笑死人了」。

所以「我现在对 iOS 27 和 iPadOS 27 最期待的功能就是 terminal.app」。氛围编程的工具都长在命令行里,iPhone 和 iPad 有了终端,自己写给自己用的小工具才有地方跑。四月底我还只是说 iPadOS 不上终端说不过去,现在这份期待连 iPhone 也算上了。

Aaron Lau(韩栖)

Software 3.0 里没有苹果 —— 连它自己都用 Claude Code

「突然想到 Software 2.0 和 Software 3.0 那篇文章」。按 Andrej Karpathy 的分法,1.0 是人手写的代码,2.0 是训练出来的神经网络权重,3.0 是用自然语言给大模型下指令。

拿这个框架看苹果,有点尴尬。「苹果在 1.0 和 2.0 阶段都是赢家,但是 3.0 阶段好像还没有他的角色」。写 app 的年代,苹果有自己的语言、IDE 和商店;端侧神经网络,苹果有神经网络引擎和 Core ML。到了用一句话让 AI 写程序的阶段,大家挂在嘴边的是 Claude Code、Codex、Gemini CLI,没有一个姓苹果。

更微妙的是,「现在连苹果自己也在用 Claude Code」,依据是 4 月底 Apple Support app 5.13 版误带了 CLAUDE.md 文件。在 3.0 这一层,苹果目前的角色是给别人的模型留一个入口。

Aaron Lau(韩栖)

为 Foundation Models 换一台 iPad —— 实机调试

换 iPad 的理由,说起来很实际。第一条是「M1 iPad Pro 升级到 iPadOS 26 之后太卡了」。第二条跟开发有关:「只是需要一块 XDR 屏幕用来看剧,还有开发 iPad 版 app 得有实机调试」。

还有一个更具体的门槛:「需要一台可以用 Foundation Models 的 iOS 实机」。Foundation Models 是 Apple 智能底下那个本地模型的开发接口,机器本身得能开 Apple 智能,而我手里的设备都是国行。

去年夏天我对 Foundation Models 还有点怀疑:「怎么感觉自己写一个 automator 的 text services,调用本地部署的第三方模型来使用这些 prompt,会比苹果自家的 foundation models 表现更好?」怀疑归怀疑,要在 iPad 上调试接了 Foundation Models 的 app,就得有一台能跑它的真机。这一次挑开发机,第一个条件不是芯片,而是地区。

Aaron Lau(韩栖)

Safari 标签页丢了怎么办 —— CloudTabs.db

iCloud 上同步的 Safari 标签页说没就没。手机那头指望不上,「本地备份或许有,但偏偏我这台 iPhone Air 没做过本地备份」;好在 Mac 这边,「我手头上还有一个今天凌晨 1 点的 Time Machine 备份」。

iCloud 标签页在 Mac 上存成一个数据库,路径是 ~/Library/Containers/com.apple.Safari/Data/Library/Safari/CloudTabs.db,从备份里把它拷出来,「可以用 DB Browser for SQLite 这个软件打开」,网址都在表里。写个脚本一键在 Safari 里重新打开也不难,我说要 vibe coding 一个放到 GitHub 上骗赞。

标签页多到要靠数据库抢救,横着那一排早就挤不下了。所以一周后我又许了个愿:「希望 Safari 27 能够有真正的垂直标签页」。

Aaron Lau(韩栖)

改一行代码让 XDR 在 Windows 上自动调亮度

「所以现在 studio brightness ++ 这个软件在 Windows 上还没法实现自动亮度」。Studio Display 接到 Windows 电脑上,亮度只能靠第三方工具调,这个开源项目就是干这个的,可到了 Studio Display XDR 就不灵了。

原因找到之后有点好笑:「XDR 有 front 跟 rear 两个环境光传感器(ALS),而初代 Studio Display 只有一个,所以」。问题大概就出在这里。「我修改一行代码就能让 XDR 在 Windows 上自动调整亮度」,顺手给项目提一个 PR。

Mac 这边我也顺藤摸瓜看了一圈。BetterDisplay 用的是系统里的 DisplayServices 框架,它和 MonitorControl 背后是同一位开发者 waydabber。开发者的说法是,Apple 自家显示器的数值是准的,第三方显示器不行。但我后来的结论是,「所以 BetterDisplay 那个 Nits Counter 从头到尾是不准的」。

Aaron Lau(韩栖)

亮度的 16 格 —— MacBook Pro 每一格都比 Air 亮

键盘上的亮度键按一下是一格,可每一格到底多少尼特,系统不告诉你。方法其实不难:「控制台按开始录制,然后用键盘调整亮度,从 0% 调到 100% 这样,然后按暂停录制,最后搜索 corebrightnessd」。

我在店里把 MacBook Air 和 M5 Pro 的 MacBook Pro 都抓了一遍。MacBook Air 的 17 档,从 0、2、4、6、8 一路到 271、377,最后一格 525nit。MacBook Pro 从 0、1、2、4、8 到 417、500,最后一格 600nit。中间同一档对比更明显:第 12 档,Air 是 100nit,Pro 是 242nit。

亮度键的刻度是对数关系,顶端的差距会一路传到每一格。「这么说来 MacBook Pro 每一格亮度都会比 MacBook Air 亮,由于对数关系」。同样按到一半,两台机器给你的不是同一个亮度。低端也能对上号:「可以读到 MacBook Air 最低亮度是 2nit,跟设备树里的映射表吻合」。日志里的数字和设备树里那张 backlight 映射表是同一套东西,说明这个方法读到的就是系统真正在用的值。

Aaron Lau(韩栖)

苹果宣称的最大亮度 —— 要开自动亮度才拿得到

「我发现 M5 MacBook Air 在不插电的情况下最高只能用键盘调到 300nit」。规格表写的可是 500nit。顺着这个问题查下去,结论是:「所以苹果宣称的最大亮度,只有在打开“自动亮度调节”的时候才能达到」。

把几种情况拆开,大致是这样。电池供电的设备,开着自动亮度和“使用电池时稍微调暗显示器”这两个默认设置,不插电时键盘或滑块最多调到 300nit;插电后 MacBook Air 是 400,MacBook Pro 是 500;剩下的那一截,要在强光下由系统激发。关掉自动亮度,不插电能调到的上限就和插电一样。再拿 MacBook Pro 对照,「所以现在可以确认一点,就算是 M5 MacBook Pro,手动可调节到的最大亮度也是 400nit」,这是开着自动亮度时的滑块上限。台式机简单得多,多少就是多少:iMac 500,Studio Display 600,SDR 的天花板目前就是 600。

不过我的看法是,「所以这个亮度限制应该是功耗导致的,应该更全面地看待」。Notebookcheck 早年测过 MacBook Air 在 Windows 下更亮,林檎在 macOS 里选择压着亮度,换来的是续航和一致的观感。「所以对于苹果来说,色彩准确度大于一切」。

Aaron Lau(韩栖)

macOS 26.4 让 asitop 失灵 —— 都怪 S-Cluster

「升级到 macOS 26.4 之后,asitop 在 M5 系列上彻底不能用了」。asitop 是很多人拿来在终端里看 Apple silicon 频率和功耗的小工具,数据来自系统自带的 powermetrics。问题就出在源头:「因为现在 powermetrics 读出来的是 S-Cluster」。

M5 这一代把核心重新命名,原来的“大核”叫 S 核,系统输出的簇名也跟着换了。工具还按 E 簇、P 簇去解析,自然对不上。发布会上一个改名,落到命令行里就是一次不兼容的改动。

powermetrics 算是我的老朋友。2024 年群里流传 xip 解压只用 E 核的说法,我的反应是「嗯,我还开了 powermetrics 来看,P 核明明有参与啊?」,接着怀疑「我在想这个 xip 解压只用 E 核的事情,是不是 M1 时代留下来的刻板印象」。那一次,powermetrics 帮我拆穿了一个关于 E 核的旧说法。两年后,它自己的输出也换了叫法,依赖它的第三方工具得跟着改一遍解析。

Aaron Lau(韩栖)

macOS 恢复模式没有 N1 驱动 —— 重装完连不上网

「话说最新系统依然没有打包 N1 的驱动,好好笑」。N1 是林檎自研的无线芯片,M5 MacBook Air 用的就是它;可 macOS Recovery 里没有它的驱动,结果是重装系统之后,机器连不上 Wi-Fi,也就激活不了。

对照组是 MacBook Neo,它在恢复模式下能连 Wi-Fi。原因不复杂,「Neo 可以是因为 macOS 老早就有联发科芯片的驱动了」,老供应商的驱动早就躺在恢复系统里,新的自研芯片反而没赶上。

我当时的反应是:「我寻思 macOS Recovery 是一个蛮常遇到的场景吧」。抹盘重装、系统出问题、转手前清空,都会走到这一步。遇到这种情况,只能插一个 USB 网卡来完成激活,至少首批机器都有这个问题。所以我对 26.4 的期待很朴素:希望它能解决之前的 kernel panic,顺手把 N1 的驱动塞进恢复系统。

Aaron Lau(韩栖)

MacBook Neo 跑本地模型 —— 4B 加 4bit 刚刚好

「MacBook Neo 倒是能跑 mlx 格式的 qwen3.5-4b,mlx 通常是 4bit 量化嘛」。一台用 A18 Pro 的入门 Mac,能在本机跑一个能对话的模型,靠的是量化把体积压下来,4B 这个尺寸刚好落在它吃得下的范围。

同一天我还翻到 r/LocalLLaMA 上一份实测,标题就叫 MLX is not faster,作者拿 MLX 和 llama.cpp 做了对比,结论是 MLX 并不更快。能跑和跑得快,是两件事。

这让我想起 2024 年底的判断。当时我说「边际效益递减的关系,对于 7B-13B 大小的本地大模型,再往上追加内存容量帮助甚微」,所以「我预判将长期保持 16GB,并且给出了本地大模型 eval rate 的证据」。那时讨论的是 16GB 够不够;现在轮到入门机,用更小的模型和更狠的量化,回答的还是同一个问题:本地模型先看尺寸和量化,内存是后面的事。

Aaron Lau(韩栖)

NotebookLM 视频 —— 能唬人的 work slop

这两天看了一段「让 NotebookLM 给 Studio Display XDR 白皮书做的视频」,画面、配音、结构齐全。我的评价是:「能把人唬住,但是细究下来是 work slop 的」。

这和我去年夏天的担心是一回事:「其实现在各种大语言模型,扮演的就是当年 Google News 的角色,而且危害还更大」,因为「像 Google News 和 Facebook 至少还能点进去原链接,知道新闻的来龙去脉是什么」。

一段生成的讲解视频,观众连该回原文哪一页核对都不知道。

Aaron Lau(韩栖)

A18 Pro 能虚拟化吗 —— Parallels 也不知道

MacBook Neo 发布后,我第一个想查的不是跑分:「蛮好奇 A18 Pro 支不支持虚拟化」。翻到 Parallels 的知识库,「连 Parallels 官方都说不知道」。截至 3 月 5 日,它的知识库写的是兼容性尚未正式确认。

同一类芯片在 iPad 上很憋屈。2024 年我笑过,「没错,SE 是 Slow Edition 的缩写,因为 iPadOS 系统不开放 JIT」。到了 Mac 就不同,「macOS 可没有限制 JIT,比 iPadOS 上只能使用 UTM SE 强」,硬件虚拟化可用的话,「理论上可以使用虚拟机(Hypervisor.framework),换句话说,可以在 macOS 上虚拟运行 iOS」。

所以 Neo 的兼容性,我看作重中之重。

Aaron Lau(韩栖)

旧文新看:iCloud 同步出错 —— 先 ckksctl,再全部重登

iCloud 同步出问题时,大部分人只会等。2022 年我给群里的结论是:「一切 iCloud 同步问题都可以通过 reset CloudKit 解决」。

原理是这样的:所有登录同一个 Apple ID 的设备共用一份 CloudKit 数据,网络不畅时可能错乱。所以我在 Mac 上的步骤是,先用 ckksctl status 确认处于 logged in 状态,再用 ckksctl fetch 强制同步一次,接着 ckksctl reset 用云端覆盖本地;确认本地数据完好之后,再用 ckksctl reset-cloudkit 反过来用本地覆盖云端。我当时特别提醒,「keychain-2.db 通常只有几十 MB」,可以用它的大小判断本地数据是否完好。

命令行之外,还有一条更朴素的路:「不过说实在的,退出再登录是最容易排障的办法,注意是全部退出再逐个登录」。重点在「全部」和「逐个」,留一台在线,错的那份数据就可能再同步回来。

Aaron Lau(韩栖)

用 ipsw 批量抓设备树 —— 不下载固件也能查芯片

这周说 Studio Display 和 Pro Display XDR 用同一颗 TCON,「也是 DP835,根据 ipsw 里面的 device-tree」。怎么查的?流程是去年底整理的。

工具是开源的 ipsw。先用 ipsw download appledb --urls 列出各平台最新固件地址,再用 ipsw dtree -r 直接对远程固件发请求,「把设备树下载到本地(byte-ranged requests)」,不必把整个固件拉下来。拿到 JSON 后交给 jq,产品名、型号代号、Wi-Fi 芯片都在 product 节点下,「我想要这样排,J481、7923、iPad (A16),先输出成可以机读的 json,然后是 md 格式的表格。」

有一个坑:tvOS、watchOS 的 OTA 包是 .aea 格式,没法远程按字节读,「Aea 格式的需要下载到本地。」再用 ipsw ota extract 把设备树单独抽出来。

Aaron Lau(韩栖)

旧文新看:人投 AI 所好 —— Apple 也在写 Prompt

旧文新看。2023 年 3 月 ChatGPT 刚出圈,我说「感觉很快会出现 Prompt Engineering 这个专业了」。那时人们关心的已经不是机器能不能听懂人话,而是怎么把自然语言翻译成机器看得懂的语言:

过去是「AI 投人所好」,现在是「人投 AI 所好」,主仆地位已经反转了!

两年后,投 AI 所好的不只是用户。2025 年 7 月有人把 macOS 里 Apple Intelligence 的 prompt 整理了出来,我的第一反应是「xswl,“As a world-class text assistant”」。苹果自己写给模型的话,也要先夸它一句世界级。“专业”那个预言算不算应验,要看怎么定义,Tiffin University 有「人工智能与 Prompt Engineering」理学学士,但我没查到它的开设时间,先记为待定;人投 AI 所好这一句,现在连 Apple 也算进去了。

  1. 260102

    很快会出现 Prompt Engineering 这个专业

    待定
    立账

Aaron Lau(韩栖)

年底的两条做事方法 —— 想法会过期,证据一次摊开

去年这时候我写过一句话,今年又翻出来对照:「想法本身没有价值,只有在有限时间内去实践/实现才有价值;」,「想法会过期,而且保质期很短,时代发展在加速,想法的出厂保质期也会越来越短。」当时的教训很具体:东西做得再扎实,慢了就没人等。一年后再看,这句话本身倒没有过期。

今年多学到的一条,和怎么把结论拿出来有关。手里的结论和主流说法相反时,有两种做法:一种是一点一点放线索,让别人自己去拼;另一种是写成一篇完整的东西,先把能想到的质疑全部过一遍,再把证据和验证方法一次摊开,让任何人都能自己复核。

我选后者。对账本上的每一条预测,我也照这个标准来:写清楚依据,写清楚怎么验证,错了也能看出是哪一环错的。

Aaron Lau(韩栖)

把 iPhone 4S 的演示循环拷出来 —— 一个 Demo.mov 和 SSH Ramdisk

2011 年零售店里的 iPhone 4S 展示机,会一直循环一段演示片,叫 Attract Loop。文件路径不难找,就是 /private/var/mobile/Demo.mov,难的是 iOS 5 的机器怎么进得去。

我的结论是:「DemoApp 是可以提取的。使用 Legacy iOS Kit 里的 SSH Ramdisk。」在工具里选 Useful Utilities 和 SSH Ramdisk,让机器进 pwnDFU,按住顶部键和 Home 键,再松开顶部键继续按住 Home。挂载分区后走 6414 端口的 SSH,老机器的 ssh-rsa 要手动放行,然后 tar 管道到 gzip,系统分区和数据分区各打一个包。

另一个发现是「Demo Content 是可以后天刷进去的。」林檎当年给零售店配过一套演示内容的恢复工具,演示片不是出厂才有的东西。

Aaron Lau(韩栖)

QuickTake 的 4:3 —— 改名 Open Gate 重新登场

「以前 QuickTake 是 iPhone 独一份的 4:3」,在拍照模式按住快门就开录,「拍出来的是 1920*1440 这个分辨率,限制在 30fps」。后来这个比例悄悄没了,「然后到 17 Pro 才以 Open Gate 的名义重新推出」。

我还发现 16 Pro 其实也能拍 4:3,只是没用满传感器,算不上 Open Gate。4:3 一直都在,缺的是名字和完整画幅。

系统既能录 4032×3024 的视频,又能拍 5712×4284 的照片,把两者组合起来,「换句话说,理论上,我现在就可以开发一款 app,用来拍 4K 的 Live Photo」。这道缝,留给第三方。

Aaron Lau(韩栖)

iPhone 用的是哪颗 IMX —— 接上 Mac 看日志就知道

每年新 iPhone 上市,总有人以“独家”的口吻公布传感器型号。「也谈不上独家吧,这些信息把 iPhone 连接到电脑就可以读出来,Console app 那里有很多日志」。去年 16 系列,很多人为主摄是不是 IMX903 争了大半天,其实打开 Mac 上的“控制台”,选中连接的 iPhone,日志里就能找到型号。

清单是这样的:「以 iPhone 16 Pro Max 为例——长焦是 IMX913,主摄是 IMX903,LiDAR 是 IMX591,超广角是 IMX972,前摄是 IMX714」。连 LiDAR 都有编号。

我更在意的是这套方法背后的态度:能自己验证的东西,就不要等别人“爆”。日志不会为了流量夸大,也不会把同一颗传感器换个名字说成升级。新机到手想知道自己的 iPhone 17 用了什么,接根线就行。

Aaron Lau(韩栖)

别乱动 Mac 的音频 MIDI 设置 —— 空间音频会悄悄消失

踩过一次坑,写个 PSA:「不要乱动带有空间音频功能的 Mac 机型或配件的音频 MIDI 设置,也不要随便尝试 Balance Lock 等号称平衡左右声道的软件,你可能会失去空间音频效果!」

症状很隐蔽:声音照样有,空间音频却没了效果,很容易误以为是耳机或系统更新的锅。根子在系统记住的音频设备配置被改写了。

解法是把配置还原。备份后删除 /Library/Preferences/Audio/ 下的 com.apple.audio.DeviceSettings.plist 和 com.apple.audio.SystemSettings.plist,个人账号的 ~/Library/Preferences/com.apple.audio.AudioMIDISetup.plist 如果存在也一并处理,然后「清空废纸篓然后重启系统,便药到病除。」系统会重建这几份文件。音频 MIDI 设置是给录音棚用的,平时没必要打开它。

Aaron Lau(韩栖)

把触控板当电子秤 —— TrackWeight 好玩但不准

GitHub 上有个小项目叫 TrackWeight,把 MacBook 的 Force Touch 触控板变成一台电子秤:东西放上去,读压力传感器的数值,换算成克数。第一次看到觉得很妙,Force Touch 触控板底下本来就有一圈压力传感器,平时用来区分轻点和重按,拿来称重顺理成章。

但我的结论是:「可是没什么实用价值啦,依赖电容感应的,手指需要放在触控板上面,增加了误差」。触控板要先感应到手指的电容才会上报压力,所以得一边用手指碰着触控板,一边把东西放上去,手指本身的力道就混进了读数。

这个限制倒是说明了 Force Touch 的设计前提:它永远假设压下来的是一根手指。电容先确认是人,压力再判断用力多少,两层传感器缺一不可。当成玩具挺好,称咖啡豆还是算了。

Aaron Lau(韩栖)

Whisky 停更的理由 —— 免费前端不该吃掉 CrossOver

Whisky 是 Mac 上用来跑 Windows 游戏的免费 Wine 前端,作者在停更公告里给的理由很少见:Whisky 对 Wine 本身几乎没有贡献,却在分走付费前端 CrossOver 的用户,而 CrossOver 的收入养着整个 Mac 上的 Wine,林檎的游戏移植工具包也是从这条路长出来的。

「去年看到这条推送的时候,觉得只是被招安的一个急流勇退的借口,如今再看,对 Whisky 的作者肃然起敬了」。开源软件停更的理由通常是没时间、没钱、没人,很少有人说“我的存在对生态有害”。

去年底我还在惊讶两者的差距:「呃…CrossOver 跟 Whisky 竟然有这么大差距吗」。现在想来,那个差距正是 CrossOver 拿钱养出来的兼容层。我年初说过,「理想是从 Mac App Store 下载即玩,而不是比较 CrossOver 和虚拟机哪个帧数更高?」。在那一天到来之前,愿意掏钱的人,才是 Mac 游戏还能继续折腾的原因。

Aaron Lau(韩栖)

macOS 设置助理里能开终端 —— 开机第一屏的后门

今天才知道,「原来可以这样玩,macOS 在设置助理下竟然是可以打开终端的」。就是新 Mac 开机、选完语言那一串“欢迎使用”的画面,账户都还没建,终端已经能叫出来了,组合键是 Control + Option + Command + T,终端以临时的默认账户运行,没有 root 权限。

这个入口看起来像后门,其实是给企业和学校留的。IT 部门要批量部署几百台 Mac,没理由每台都手动点完设置助理,所以林檎留了在设置助理阶段跑命令、写配置、甚至直接跳过设置助理的路子。普通用户一辈子碰不到,碰到了也不知道这个窗口能干嘛。

同一天我还码了另一个帖子,它解决的问题是怎么让 Mac「在修改系统文件后依然可以正常更新」。macOS 的签名系统卷越锁越紧,能动的地方越来越少,所以每找到一个官方默许的缝,我都想先记下来。

Aaron Lau(韩栖)

把 2019 年的内存补丁搬到 Apple silicon —— kanzitools 开发日志

这周折腾一根 USB-C 诊断线,卡在第一步:「现在卡在那个 patcher 不能用 Apple silicon 的 Mac,我需要用 Intel 的来完成」。

先说这个 patcher 在干什么。「astrisprobed_patcher 本质上是一个【内存修改器】,将 UDT 的 PID(Product ID)在内存中替换成 Chimp 的,如此一来 astrisprobed 就可以识别到这根线」。在 M 系 Mac 上一跑就报 failed to replace struct,因为「原版写于 2019 年,那时候还没有 M 系芯片,所以在读写内存的时候发生问题,定位不到要修改的部分」。

我改了读写内存那段代码,现在 Intel 和 Apple silicon 都能跑。补丁打上之后,probeenterdfu 不拆壳就能让线进 DFU,前提是先关掉 SIP 里的调试限制,其余保护照开。

Aaron Lau(韩栖)

在 iOS 上跑 macOS 的 app —— 四年前的暴论有人动手了

2021 年初我发过一个暴论,设想 iPadOS 走向“全场景”:「比如 iPhone 投屏时切换到 iPad 的布局,而 iPad 可以在全屏幕模式下运行部分的 macOS app,像是 Xcode、Final Cut Pro……」。

一年后我自己泼了冷水。再聊到 iPad 跑 Mac 软件,我的回答是「指 iPadOS 运行 macOS app 吗,快进到 macOS app 自发屏蔽 iPad」。

林檎一直没做,社区先动手了。最近在研究的就是这个:「在 iOS 上运行 macOS 的 app」,一份教你在 iOS 上把 macOS 的 WindowServer 拉起来的指南,前提是设备已经越狱,项目自己标注还在施工。离 Xcode 全屏跑在 iPad 上还很远,但至少不是暴论了。

  1. 250818

    iPad 可以在全屏幕模式下运行部分 macOS app

    待定
    立账

Aaron Lau(韩栖)

Parallels 的 x86 模拟 —— 藏在命令行里的开关

在 Apple 芯片的 Mac 上跑 x86 系统,Parallels 已经能做了,只是入口藏得深。翻到它的知识库文章,「我也是最近才知道」。20.2 版加入了 x86_64 模拟,图形界面里没有选项,得走命令行:

prlctl create <vm_name> -d <distro> --cpu-type x86
prlctl set <vm_name> --device-set cdrom0 --image <x86_iso_path> --connect
prlctl start <vm_name>

关键在第一行的 --cpu-type x86,后两行只是挂镜像、开机。

别指望它快:Parallels 自己的知识库写明,Windows 启动大约要 2 到 7 分钟,系统响应也慢。它的用处很窄:装一个没有 ARM 版的老 Windows,看一眼当年的界面。想重温旧系统,不必再翻出一台旧电脑。

Aaron Lau(韩栖)

右键菜单里的本地模型 —— Foundation Models 适合干杂活

翻完 Apple Intelligence 的系统 prompt,我冒出一个念头:「怎么感觉自己写一个 automator 的 text services,调用本地部署的第三方模型来使用这些 prompt,会比苹果自家的 foundation models 表现更好?」prompt 是现成的,缺的只是一个更大的模型,比如本地跑的 14B,挂在右键菜单的“服务”里。

这件事以前不好做。「所谓的「实时润色」,从前这种构想因为隐私原因无法实现」,打一个字就往云端送一次,没人放心。模型搬到本机,顾虑就没了。

这两周我在读 Foundation Models 框架,结论是「最近在研究 Foundation Models,感觉本地大模型做这种活儿是很合适的」。润色、校对、提取字段,输入短、输出短、要求快,正是端侧模型的舒适区。至于它能不能写得比 14B 的第三方模型好,我还没底。

Aaron Lau(韩栖)

双方只看到润色后的话 —— 一个 AI 聊天软件的脑洞

今天冒出一个脑洞:「假如有这么一款聊天软件,在确保语义准确的情况下,双方看到的是 AI 润色后的语句,原文只有自己能看见」。

现在的 AI 输入法,做的都是帮你写:补全、改写、换个语气,改完由你自己按发送。「基于 AI 的输入法有许多,但是好像还没见过从这个角度出发的?」我想的是反过来,润色发生在传输的路上,你照常打字,对方收到的是一个更得体的版本,你自己那一侧保留原话。

到了群聊会更有意思:「群聊的话,群主可以设置一个核心的 prompt,其他人设置的 prompt 的位阶都在群主之下」。群主定基调,比如「保持礼貌、不说脏话」,成员在框架之内调自己的风格,但不能越过它,像上位法和下位法。

整个设想成立的前提,是开头那四个字:语义准确。

Aaron Lau(韩栖)

Surge Mac 6 转订阅 —— 几段话就化解了舆论危机

Surge Mac 6.0 宣布改成更新订阅制:买断一次能拿一年更新,过期后旧版照用,想要新功能再续。去年 7 月以后买过 5 代的用户直接免费升级。

我关心的是旧授权怎么算。规则是把手上的授权合并、按时间折算,「比如我在 2023 年 6 月买的单设备、2024 年 11 月买的三设备,他最后折算成 2024 年 8 月的购买日期」。两笔买卖揉成一个中间日期,算不上多大方,但谁也不吃亏。

真正让我佩服的是公告本身。「刘亚晨很厉害的一点是,几段话就把转订阅制(可能会带来)的舆论危机给疏解掉了」。谁免费、旧版能不能用、旧授权怎么折算,公告里一条条先讲清楚,用户想抱怨的点,还没开口就有了答案。

Aaron Lau(韩栖)

自己找 macOS 26 的安装包 —— 照着 Mist 的代码读目录

macOS 26 的 beta 出来后,我想要一个完整的安装包,不想每次都走系统更新。办法不复杂:「我是参考的 Mist 这个软件的代码进而推出 macOS 26 的 pkg 的下载链接」。

Mist 是一个开源的 macOS 下载工具,它的 Catalog.swift 里写着林檎软件更新目录的地址。那份目录是一个很大的 plist,列着每个版本的 InstallAssistant.pkg,按 beta、正式版分成几条通道。照着代码里的地址和解析方式自己读一遍,就能直接拿到 pkg 的链接,下载完双击,「应用程序」里就多出一个「安装 macOS」。

链接长得很乱,有人问路径中间那串是什么。「中间那个“082-62552”,如果我没记错的话,是产品 ID」,每个版本、每个 build 都有自己的一串。以前我只知道去 Mr. Macintosh 整理的数据库里找现成链接,这回自己从源码里摸了一遍,才清楚这些链接是怎么来的。

Aaron Lau(韩栖)

林檎不做 chatbot —— 从不敢说 AI 到 AI 无处不在

WWDC 之后,Craig Federighi 和 Joz 接受采访,大意是林檎不想把 AI 做成一个聊天窗口。这一点我是认同的:「我也觉得 chatbot 的形式很割裂,或者说苹果给出的愿景假如能落地的话是好的」。把 AI 揉进每个 app 里,比单独开一个对话框更像林檎会做的事。

只是这句话的重点在后半句。三年来林檎对 AI 的态度变了几轮。2023 年 Vision Pro 那场 WWDC,「确实冷处理了,连 AI 这个词都不敢说,用 machine learning、on-device intelligence 打擦边球」。2024 年一口气发布 Apple Intelligence,我当时就担心:「尤其是 AI 领域瞬息万变,6 月画的 PPT 到 9 月还能不能领先这是一个未知数」。

结果新 Siri 一路延期,到今年 WWDC 也没交出来。不做 chatbot 是一个好的方向,可方向需要靠落地来证明,愿景再漂亮,也替代不了一个能用的版本。

Aaron Lau(韩栖)

拆新系统的清单 —— 先看 SwiftUI 占了多少

下周就是 WWDC,新系统的名字还在 19 和 26 之间摇摆,我先把拆包的清单写好。头一条是看比例:「假如 iOS 19,whatever,iOS 26 真有什么设计变革的话,SwiftUI 的比例应该进一步提高」。一次真正的界面重做,很难继续在老的 UIKit 代码上修修补补,到时候翻一下 dyld_shared_cache,对照 Timac 每年统计的 iOS 18 数据,就知道林檎自己有多信任 SwiftUI。

剩下几条是老套路:/System/Library/Frameworks 和 PrivateFrameworks 有没有新面孔,壁纸目录里多了什么,SpringBoard 的默认图标布局改没改,再用 ipsw diff 把新旧两版的差异列成表。主要的信息来源,说到底还是设备树和字符串。

翻壁纸目录时还顺手发现一个冷知识:「草,iPhoneOS 1.0 的大小还没有 iOS 14 的壁纸大」。十几年过去,一张壁纸就比一整个初代系统还大。

  1. 250604

    新系统若有设计变革,系统内 SwiftUI 的比例会进一步提高

    待定
    立账

Aaron Lau(韩栖)

Apple TV 接 Studio Display —— 画面卡在 HDCP,声音交给 Mac mini

Studio Display 只有雷雳接口,想接 Apple TV,得用一根 HDMI 转 Type-C 线,线加转接头要六百多。「理论上 Apple TV 可以输出 2160p 的画面到 Studio Display,但是需要支持 HDCP 功能的诱骗器」。实测更直白:PS5 接上去能出 4K,Apple TV 只能出 1080p,差别大概就在 HDCP 这一层。

声音是另一道坎。「因为 Studio Display 不通过 DP 协议传输音频,它的扬声器可以理解为一张 USB 声卡」,Apple TV 根本认不出它。

我的解法是绕一圈:「如果请 Mac mini 做中间商的话,甚至可以让 Apple TV 在 Studio Display 上发出声音」。转接线的 HDMI 端接 Apple TV,C 口接显示器,辅助供电的 A 口插到 Mac mini 上。Mac mini 不出画面,却能认出显示器的扬声器和摄像头;再在 Apple TV 上把 Mac mini 设成临时音频输出,屏幕和喇叭就都用上了。

Aaron Lau(韩栖)

重新打开 SIP 要联网 —— Apple silicon 的安全策略要服务器签名

关 SIP 容易,开回来却卡住了。在 recoveryOS 里敲 csrutil enable,确认把安全级别升回完整安全性,输完密码得到一句:「Can’t continue because you are not connected to the Internet」。

换 bputil -f 硬来,开场白先劝退:「This utility is not meant for normal users or even sysadmins.」,接着报的还是同一个错,提示类型是 NetworkRequired。Apple silicon Mac 的启动安全策略要找林檎的服务器做一次个性化签名,离线就过不了这一步。

这件事和之前看到的一条消息对得上:「所以在虚拟机上安装 macOS 也是需要联网的」。从 Intel 时代过来的人会觉得别扭:系统装在自己的硬盘上,想把安全设置改回默认,却得先连上网。

Aaron Lau(韩栖)

启动选项里只认苹果键盘?—— 配对信息写进了 NVRAM

长按电源键进启动选项,蓝牙键盘有时毫无反应。「印象中在“启动选项菜单”中,只有苹果自己的输入设备可以切换启动磁盘?」这个印象后来找到了一点线索。

在零售机上跑 nvram -p 或 nvram -xp,可以看到蓝牙相关的字段,「可能在 12.3 系统之后,把蓝牙配对信息写入了 nvram」。我的猜测是,系统还没加载时,固件就靠这份记录认键盘。对比之下,罗技这类第三方键盘落在 BluetoothInfo 那一行,「还真是,第一方配件是写在 BluetoothUHEDevices 这一行」。

两套字段,待遇大概也是两套。我手上还没试过在 M3 MacBook Air 上接非 Apple 的蓝牙键盘进启动选项,但已经有人为了在 FileVault 解锁界面用上蓝牙键盘专门折腾过一番,说明这条路确实不是默认就通的。

Aaron Lau(韩栖)

Apple silicon 的 NVRAM —— 还在,但不听话了

想用一行命令关掉 MacBook 的内屏,翻资料翻到了引导参数的考古:「在 Mac OS X 10.10 Yosemite 之前,用 iog 这个参数;之后,用 niog 这个参数,0 和 1 的定义颠倒」。可惜这是 Intel 时代的玩法。

到了 Apple silicon,nvram 本身还在,行为却大不一样。最直观的是清除 NVRAM:「因为在 Apple silicon Mac 上清除 NVRAM 是必须进入到系统的,不管是 macOS、fallback recoveryOS 还是长按电源键进入的 1TR recoveryOS」,「不像 Intel-based Mac 只要开机时按住四个键就可以」。写 boot-args 也一样,SIP 不关,直接报 privilege violation。

就算关了 SIP 写进去,也不一定生效。我的理解是「所以引导参数不是不能用了,只是安全性级别的关系,内核忽略了这些参数(?)」。至于关内屏,没有简单的命令可用,Lunar 的 BlackOut 也只是取巧,屏幕并没有真正关掉。

Aaron Lau(韩栖)

简体拼音候选词被带歪 —— 三行命令重置学习记录

macOS 自带的简体拼音会根据你的输入习惯调整候选词顺序,好处是越用越顺,坏处是偶尔一次就能把它带歪。「我遇到了类似的情况,打了一个呵呵的呵,结果输入“he”第一位不再是和和气气的和了」。

系统设置里没有一个“重置学习记录”的按钮,但学习数据就躺在两个地方,删掉再重启输入法进程就行:

rm -rf ~/Library/Containers/com.apple.inputmethod.SCIM/Data
rm -f ~/Library/Dictionaries/DynamicPhraseLexicon_zh_Hans.db
kill -9 `pgrep SCIM`

SCIM 是简体拼音的进程名,DynamicPhraseLexicon 就是那份会动态调整顺序的词库。代价是之前积累的常用词也一并清空,所以这三行适合在候选词已经乱到影响打字时再用。

Aaron Lau(韩栖)

Apple silicon Mac 的克隆 —— 系统卷起不来,数据卷留得住

Intel Mac 时代,做一个能直接启动的整盘克隆是常规操作。到了 Apple silicon,连 SuperDuper 都认了,「尽管 SuperDuper 在 15.2 系统之后不能创建可启动备份了」。

我换了个思路:系统卷本来就是只读、签名过的,所有 Apple silicon Mac 的系统盘都一样,「也就是说我不需要制作可启动的 1:1 克隆,只要把 Macintosh HD 这个宗卷复制一份就行」。关掉 SIP 和 authenticated-root 之后,复制本身做得到。折腾一天的「所以结论是复制之后的系统卷不能被启动,但是数据卷的内容可以在执行新系统安装后保留下来」。

顺带一个小发现:M4 Pro Mac mini 和 M3 MacBook Air 进 recoveryOS 跑 gpt -r show disk0,报告的分区 UUID 一模一样,只有扇区数不同。这也解释了为什么 M1 之后,开机按 T 的目标磁盘模式换成了基于 SMB 的 Mac 共享模式:分区长得一模一样的两台机器,不适合再把硬盘直接挂给对方。

Aaron Lau(韩栖)

搬 Time Machine 备份盘 —— dd 是唯一的路,也是天坑

想把一块 Time Machine 备份盘原样换到新硬盘上,才发现「原来 Time Machine 所在的磁盘是不能用 asr 复制的,只能走 dd 了」。dd 是逐扇区复制,源盘只用了 377.5GB,命令照样要 1TB 的空间。

时间账更难看:「1TB 的硬盘,写成一个 img 文件用了 8 个半小时,写回去物理硬盘用了 4 个多小时」。还有一笔是自找的,「我当时没意识到这是一个加密卷,傻乎乎地用了 gzip,所以光是把这个 img.gz 解压成 img 又花了 1 个多小时」。加密后的数据近乎随机,压出来的文件和原盘差不多大,gzip 只会拖慢速度。

留个笔记给下次的自己:操作前先 diskutil list 认清是哪块盘,再 unmount;bs=4096 和 conv=sparse 只影响速度,不影响数据完整;status=progress 看进度;所有命令前面加上 caffeinate,别让 Mac 睡着。「这个也是天坑来着,没有其他转移 Time Machine 备份的方式」。

Aaron Lau(韩栖)

从外置硬盘启动 Mac —— Apple Intelligence 认机器不认盘

给 Mac 扩容,最贵的往往是盒子。「但是雷电5硬盘盒要 1500 多,然后这块 4TB 的 SSD 也才 1800 块」,当然跟林檎每 256GB 加价 1500 元比,这套组合还是划算得多。

装好之后我顺手做了个实验:既然「至少目前所有 Apple silicon Mac 的 ipsw 都是统一的,也就是说他们系统盘是一模一样的」,那一块外置系统盘理应能像 Windows To Go 那样在不同机器之间插拔启动。实测可行,只是第一次从外置硬盘启动要等五分钟左右,不知道系统在后台做什么。

按理说从外置硬盘启动是用不了 Apple Intelligence 的,国内常见的 XcodeLLMEligible 强开会顺手跳过这层限制。更有意思的是功能会跟着机器变:「在港版 Mac mini 上是有 Apple Intelligence 的,在国行 MacBook Air 上启动就变成 Siri 了」。系统盘是同一块,资格看来是跟着机器走的。

Aaron Lau(韩栖)

本地跑 DeepSeek 14B —— M4 Pro 上 MLX 比 GGUF 快

「好吧,试了一下 DeepSeek 的 14B 大小的蒸馏模型」,结论是能打:日常问答接近网页版 GPT-4o 和 o1 mini 的水平,而且整个模型就跑在桌上那台 Mac mini 里。

比模型大小更影响体验的是格式。「mlx 比 gguf 格式的性能要好得多,14b 在 24GB 内存的 M4 Pro 可以达到 27 tokens/s」,这个速度已经不用盯着光标等字了。可惜我手头只有 16GB 的 M3 和 24GB 的 M4 Pro,再大的参数量测不了。

本地跑的理由很朴素:「特别是 OpenAI o1 需要 ChatGPT Plus 订阅,然后 DeepSeek 官网常常进不去」。至于满血版,内存需求是 768GB 这个量级,我的第一反应是「或者 12 台 64GB 内存 的 M4 Pro Mac mini?」。12 乘 64 刚好凑满,听着荒唐,账倒是算得通。