肇鑫的日常博客

肇鑫 / Owen Zhao

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

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

最新文章

绿联耳夹式蓝牙耳机S3 Plus一手评测

评测

我的耳朵比较敏感,戴入耳的半入耳的,都会戴上一段时间耳朵就发痒,所以之前我一直使用的击音的PowerSports B1,这个是绕后颈的挂耳式的耳机,我很喜欢它,甚至因为第一个因为某天下雨放在双肩包里被水泡开胶了之后,我又买了一个一模一样的。不过这个耳机电池最近不太行了,我就考虑是再买一个同类型的,还是换一个方式。

和ChatGPT商量了一番,决定试试这种耳夹式的耳机。出于外观的考虑,选择了绿联的这款白色的。

初印象

我对于这个耳机的初印象很好。

  1. 音质更好
  2. 戴上也很轻松,长时间佩戴耳朵也不会疼。不过戴上还是有感觉的。
  3. 电池耐用
  4. 可以绑定到两台设备,并且只要耳机空闲,任何一个设备发声,耳机都能响应,不需要手动切换。

缺点

  1. 外出佩戴一定要小心。很容易丢。因为首先,它两个耳机是独立的,一个掉了,另一个还会响,你只会觉得声音怎么不平衡了,而不是为啥突然没声了。我今天第一次戴着它出门,就差点儿丢了。它虽然有地图,能查找耳机,但是很难用,只有让耳机响的功能有用。我发现的快,顺着路回去,找到了,很幸运!这还是我在听歌,如果你只是戴着,没有听歌,那很容易丢了很久才发现,到时候可就不见得能找到了。所以我建议如果在外面,不使用了,就放到盒子里,收起来。
  2. 充电盒的状态太少。看不出来剩余电量,也看不出来耳机电量的状态,上面也没有任何按钮。所有一切只能通过app来操作。

小技巧

第二台机器要配对蓝牙,只能使用以往的技巧。就是关闭第一台的蓝牙,设备在找不到蓝牙目标之后,会进入配对模式。然后再第二台设备的蓝牙上搜索就可以了。对了,之前需要在app里的打开双设备连接这个功能,默认是关闭的。

DSH手机访问,Tailsacale + dsh-mobile插件

技术

我想让手机在外面也能指挥家里那台 Mac 上的 dsh。不是远程桌面那种指挥,是打开手机,看到会话列表,发一句话,看它跑。

问题很快就来了:家里有公网 IP,但从外面连不进来。我查了一下自己的出口,是 175 开头的一个地址,看着就是可以直接拨回来的那种,实际上连不上——家里的路由器默认不接受入站连接,我没有给它做端口映射。而且这个地址是动态的,光猫重启、运营商续租都会变,把它写死进任何配置里,过几天就失效了。

真要顺着这条路走,得在路由器上开端口映射,再挂一个动态 DNS 服务,把会变的地址绑成一个固定名字。这条路是通的,我也认真考虑过,最后还是没走:把一个端口开到公网上,等于让互联网上所有扫描器都能来敲我的门,我不太能接受那种“谁都能访问”的状态。

AI建议我使用Tailscale。我没同意,后来证明我的想法是错的。这是因为我以前使用过Tailscale,那时候的经验限制了我。

我当年是这么干的

那时候我对 Tailscale 的理解就是一条 VPN。于是按它最标准的用法来:手机、VPS、家里的电脑,三台都装客户端。家里没有任何对外开放的入口,VPS 顺便当个落脚点。

但是在安卓上遇到了问题。系统只有一个 VPN 槽位。Tailscale 占了它,我手机上就上不了外网了——能连家里,是连 Google、连 GitHub 全都断。Tailscale 给了一条到内网的路,但它不负责帮你翻墙。

那怎么办?我当时的解法是把 VPS 设成TailScale的出口节点(exit node),让手机的流量先绕到 VPS,再从 VPS 出去。听起来很合理:反正 VPS 是国外的,顺便当个梯子用。

能用,但慢。慢到我宁愿不用。原因也不难想:流量先加密到 VPS,绕一圈再出去,而 VPS 本身是个小机器,线路也一般。这不是 Tailscale 的错,是我把两种完全不同的需求——“连回家里”和“上外网”——硬塞进了同一条隧道里。

后来干脆就不用了。因为Codex这种直接就能使用手机访问了。

这次才想明白:它不该是一条全局 VPN

这次是AI帮我自动配置的,它配置了一条单独的规则,只有特定的访问才会通过规则走Tailscale。这个是最近的代理应有都有能力,之前我使用的时候代理都还不支持TailScale,所以我使用的官方的客户端。

技术上靠的是 mihomo。它在 1.19.25 版本支持了 type: tailscale 的出站,意思是我可以在 Clash 配置里写一个 tailscale 类型的节点,跟机场节点并列排在一起。FlClash 仍然是手机上唯一的 VPN,翻墙流量照旧走机场,只有去家里那台 Mac 的流量才被这个节点接手。

两个需求分开了,谁也不挤谁。这才是这次的真正收获:不是“省下了一台 VPS”,而是发现 Tailscale 可以按规则用。我以前的用法是“开一条隧道接管全部流量”,现在的用法是“在某些地址上,多一条回家的路”。

配置起来就三段:一个 tailscale 类型的出站,一个 select 组,两条规则。多一条规则,多一条路,仅此而已。

不过它不随 FlClash 启动就开始连接。按官方文档的说法,任何类型的节点都只在第一次有流量命中时才建立连接,所以头几次访问超时是正常的,不是配错了。

让它以为我还站在家里

真正有意思的是最后一步,子网路由。

移动网关只监听 10.0.0.114:3443,自签证书也只签了这一个地址。如果让手机直接去访问 Tailscale 分给它的 100.x 地址,证书对不上,配对得重做一遍。

所以我没动网关,而是在 Mac 上宣告了一条 10.0.0.0/24 的路由,再到后台批准。这样一来,手机拨的还是 10.0.0.114,包却走的是 tailnet。它以为自己在家里。地址没变,证书没变,配对记录也没变。

这条路也是可逆的。哪天不想给整个网段开门,把宣告改成 10.0.0.114/32,后台重新勾一次,就只放开这一台。

到底是不是直连

装完我盯着连接状态看了两轮。

在家,Wi-Fi 开着,curAddr 是 10.0.0.6,手机在局域网里的地址。关掉 Wi-Fi 换成移动数据,同一个节点,curAddr 变成 175.x.x.x,运营商给我分的公网地址。

两行字,一个是局域网直连,一个是公网打洞直连,都不是中继。这一点很重要。当年那套三台机器的方案给我留下的印象就是“能连上,但慢”,慢的原因几乎都出在中继或者绕行上。真直连的话,延迟就是你两端网络的自然延迟,中间没有多一跳。

顺带澄清一个误会

我装完一开始以为,安全是靠那个自签证书保证的——手机上装了 CA 证书才能连上,听起来像是“装了证书才有权限”。这可能吗?不是。证书只干一件事:让手机相信这个 HTTPS 是这台电脑的,链路能加密、不被中间人冒充。它不负责授权。

真正拦人的是配对。网关对所有未配对的请求一律返回 401,配对码是 256 位随机串,只在电脑本机的回环接口上生成,两分钟过期,用过即废,还有频率限制,电脑那边存的也只是令牌的哈希。缺一个都不行:只有证书没有令牌,拿到地址的人就能控制你的电脑;只有令牌没有证书,令牌会被同一个网络里的人嗅探走。

所以这套东西的门禁其实是够的,这一点我很确定。但“认证够不够”和“我愿不愿意把这扇门放到公网上”是两件事。一台能执行 shell 的机器,长期挂在一个被全世界的扫描器反复敲打的端口后面,我睡得不安稳。Tailscale 这条路,公网上根本没有我开放的端口,也就没有这些事。

那 VPS 现在还要不要

按这次的用法,不需要了。它不再承担“让手机出网”的职责——那是机场节点的事;它也没成为中继,因为两端打洞成功,直接直连。

只有一种情况我会重新考虑:打洞失败,流量长期走 DERP 中继,而中继节点基本在国外,慢到没法用。那时候才值得起一台国内的小机器自建中继。到那一步,VPS 的角色是提速备件,不再是必需品。

总结

这几年我一直以为 Tailscale 是一条 VPN,包住所有流量。按那个理解搭出来的方案,必然要牺牲别的东西——要么牺牲手机的翻墙,要么牺牲速度,要么再加一台 VPS 去补。我当年选了加 VPS,然后被速度劝退。

这次真正想通的是:它可以是规则里的一条旁路。手机上还是那套代理,只有去家里那台 Mac 的地址,才拐上这条路。翻墙归翻墙,回家归回家,两件事本来就该分开走。

我没有租 VPS,也没有开端口映射。配置加起来不到二十行,全部收益就是:在外面打开手机,能看见家里那台 Mac 上的会话列表。

海康威视固态硬盘CC500,京东售后变形记

随笔

这两天在折腾我的Windows PC,结果发现事情还蛮多的。

昨天

主要是折腾Windows的版本。一开始安装的Windows 11 2023H2,结果发现太老了,想要升级。直接升级到了2026H2之后,发现几个问题,最严重的就是系统一旦睡眠,就再也无法唤醒。只能断电重新开机。

然后SSD还有问题,我让AI检查SSD的健康,结果说存在坏道。今早我看了一下原始订单,当初我特意选择的京东的,5年质保的,还没过保。于是找京东申请售后。

今天早上

没想到京东现在也拉了。刚刚给我打电话,说这个公司现在不跟京东合作了,可以给我退款,或者我自己去找厂家。然后我问怎么找厂家,说是通过厂家在京东的店的客服聊天就可以。可是现在这个型号的SSD已经比我当初买的时候贵1倍了,京东原价退我我肯定是不能接受的。因为我再买不是还得自己补钱吗?和京东客服声明了我的主张,她和我说需要向上反馈,承诺48小时内回复。

挂了电话。我心想要不联系厂家客服看看,看看到底给不给修。点击商品链接,我4年前买的SSD如果还在卖,价格贵了一倍。客服一上来很热情,和我说这款固态硬盘速度很快。我说我是过来找售后的,本来找的京东,京东说现在你们不和它合作了,需要直接找厂家。厂家客服让我稍等,等了能有20分钟吧。和我说给我转到了售后客服,售后客服先找我要京东的订单号,然后让我给SSD正反面拍照,说可以返厂,返厂检测有问题给换新。我拍照正反面的时候,发现正反面都有撕毁失去保修的贴纸,原来是这个意思,我心想。上传了照片之后,我获得了地址,是上海的。

临近中午

我想就放过京东吧。不过按照原本的售后流程,应该是京东上门取件,修好了再给我送回来的。现在我自己寄快递了,快递费得京东出。于是我回拨京东客服的电话,电话秒接,但是不是真人,是AI客服,但是说话很自然,理解能力也不差。上来就和我说,注意到我有一个售后订单,并且我还跟厂家客服沟通过了,问我有什么需要?是不是想要寄件地址。

虽然话说得很客气,但是我和厂家客服通过京东应用沟通的过程,京东全程都是有围观的。这让我很不爽。你京东自己说人家不和你合作了,你没法跟我售后,然后围观我和人家厂家客服的对话,你不知道什么叫用户隐私吗?人家不和你合作,虽然还在京东开店,但是你俩也是竞争对手,你直接看对手和客户的对话?商战这么朴实无华吗?

我说不是,我找客服,我说京东承诺给我售后,但是现在什么都没做。AI客服承认了这一点,表示记下来了,晚上6点前会有人给我反馈。

下午

过了一个多小时吧,京东客服给我电话,这次是人工客服。上来和我说他们京东联系不到厂家的售后,没法给我更换。我心想,人工客服就是不如AI客服掌握的信息丰富啊。我说,我已经联系厂家客服了,她还在说,但是我们这边联系不上。我接着说,就是用你们的京东应用,我说,他店开在你京东,你说你联系不上。她说,那是以前的店。我说,现在还开着呢。她没话了。和我强调,按照京东现在的规则现在就是无法售后。我说我理解,我已经和对方谈好了。就差邮寄了。但是如果按照原来的,是不是应该京东上门取件,修好了再上门给我。现在变成我自己邮寄了,邮费京东出了吧。而且我和她强调,只需要单程的运费,因为回来的是厂家邮寄。她送了口气,但是却没有给我敲死,说需要我邮寄了之后申请快递费。我说这样不行,本来我都体谅你们了,不让你们直接给我换新,我都自己找的厂家。你们答应给个快递费还不能敲死,那我邮寄了之后你说申请不下来怎么办?她让我再等等她,她去申请这笔费用。

两小时后

京东客服打来电话,说可以,申请下来15元快递费,给我打到白条里了。24小时到账。于是我打开京东软件,下了一单快递,扣掉优惠券,加上保价费,一共需要付款10元。

总结

当年我买这款海康威视的CC500 1TB的价格是449元,时间是2022年10月,质保是5年,到2027年10月。现在过了4年,硬盘出坏道了。需要售后,而目前京东这款硬盘还在售,价格已经涨到了899元。并且处于无货的状态。

Mac远程桌面登录,账户始终无法直接登录问题的解决

技术

我经常用 Mac 的“屏幕共享”连接另一台 Mac mini。以前点一下就能进去,最近却不行了。每次连接都会先弹出一个窗口,说远端的 zhaoxin 正在使用显示器,让我选择“请求许可查看显示器”,或者“以 aiUser 身份登录”。默认选中的是请求许可。点连接以后,就一直转圈。

这就很奇怪。两台电脑上我用的都是 zhaoxin,为什么连接自己的电脑,还要等对面有人批准?Mac mini 又不一定有人坐在前面,等下去也不会有人点“允许”。我只能点 Back,重新输入 zhaoxin 的密码,才能进去。进去之后,还需要再次输入一遍密码才能进入桌面。

我一开始怀疑,是 Finder 把文件共享的登录身份搞混了。Finder 那边显示的是我的 Apple Account 邮箱,可是“屏幕共享”的连接详情里,用户名明明写着 zhaoxin。后来我又去看两台电脑的用户列表:本机没有 aiUser,远端 Mac mini 上却有。更有意思的是,选“以 aiUser 身份登录”居然也能进去。也就是说,aiUser 不是一个凭空冒出来的用户名,真正进不去的只有默认那个“请求许可”。

我又检查了远端的屏幕共享设置。允许访问的用户里有 zhaoxin,所以权限本身没问题。试过在输入密码时勾选“记住密码”,下一次仍然要输入。之前我还以为这只是密码没有保存好,现在看起来,事情没那么简单。

最后,我在 Mac mini 上删除了不再需要的 aiUser。删除之前发现,这个账户还开着“查找我的 Mac”。我先把相关功能关掉,再删除账户。结果重新连接时,那个让我选择“请求许可”或 aiUser 的窗口消失了,系统直接让我输入 zhaoxin 的密码。这次勾选“记住密码”后,再连接就直接进入,连密码也不用输了。故障排除。

总结

我怀疑 aiUser 开启“查找我的 Mac”后,在系统里有了某种更高的关联地位,影响了屏幕共享默认选择的连接方式。不过我同时关闭了“查找”并删除了账户,没有单独测试哪一步起了作用,所以不能把这个推测当成确定的原因。能够确定的是:远端多出这个账户时,屏幕共享总把我带到一个无法完成的请求许可流程;清理掉它之后,zhaoxin 的直接登录和记住密码都恢复了正常。

ChatGPT防慢指南

技术

经常有人说ChatGPT很慢,即便是提速了之后还是慢。我看到有人发的测试图,然后自己也测试一下,发现我这次测出来的速度并不慢。刚刚,我遇到了Reconnection 5/5的问题

stream disconnected before completion: IO error: Broken pipe (os error 32)

以往我就是等它继续了。但是今天我突发奇想,新建一个对话,然后让Codex分析,这次故障的原因。Codex分析说,这个对话原本使用的是WebSockets,然后再5次重试之后,换成了http的访问方式。但是在我这里,http的访问是很慢的。因此,我担心一旦回退到http的方式,之后的对话都会继续使用http。

我使用了多种方式进行测试。首先是新建一个对话,然后让Codex分析,Codex说这个新对话还是使用的WebSockets,然后我继续刚刚出错的对话,Codex说这个继续使用了http。于是我退出Codex,重新开,然后继续刚刚出错的那个对话。结果那个对话虽然一开始恢复使用WebSockets了,但是它立刻连续失败了5次,然后又回退到http。我问Codex这种情况怎么办。Codex让我新建一个session,然后重新说明任务。这次终于好了。

总结

当长任务遇到WebSokets失败之后,最好的办法就是新开一个对话,然后重新描述任务。否则就会回退到http,这会导致对话变得很慢,根源是

WebSocket 在长任务中可以复用连接和近期响应状态,减少每次继续请求的开销;HTTP 回退会失去这项优势。

今天吃了一个法国的瓜

随笔

X上关注的一个新闻号今早发了一个法国议会开采石油议案提案没通过的新闻。一开始我还比较同意作者的观点,但是越看到后来,我觉得这事儿越有意思。

事情是这样的,根据法国的法律,为了环保,法国不能开发殖民地的石油。而现在国际市场石油价格大涨到100美元以上,石油太贵了。而法国所属圭亚那本身就有石油。于是就有一个议案提出来,希望可以推翻之前的法律,允许圭亚那开采石油。特别的,这位记者还指出,代表圭亚那当地的议员都投了赞成票。但是,最终的结果是议案没有通过,记者说这就是巴黎方面给拒绝了。

事情到这里,我还是同意记者观点的。但是后面的来了,记者说,距离圭亚那不远,其实就有石油在开采,是法国和美国的公司联合开采的。所以,圭亚那本身也可以直接开采,这次议案就是这家法国公司推动的,但是很可惜没通过。法国人现在每天都得花钱买这个本可以自己独立挖的石油。

事情变得有意思起来了。因为这名记者明显只考虑利益,没有考虑道德。换个说法,汤姆和莱昂合伙做生意,生意火了之后,莱昂决定在两人的店旁边再开一家店,自己独资,卖相同的东西。任谁都会觉得这个莱昂不地道吧。提这个议案的法国公司就是这个莱昂,还好巴黎方面要脸,给拒绝了。

安卓手机还是太复杂了

随笔

问题1

今天帮我爸解决了两个安卓手机的问题。第一个问题还是挺复杂的。我爸和我说他的微信不知道怎么被他删掉了,然后他重装了一个之后登录,密码一直不对,问我记不记得密码。我拿过来手机,输入密码,密码错误。然后一看,这不是支持手机验证码吗?果断选择手机验证码。然后进来了。结果还要二次验证。

二次验证支持好友帮忙验证,使用之前的登录过的设备扫码登录验证,微信密码验证以及银行卡验证。可是这四个方式对于这个微信来说都不可行,因为我爸很少聊天,所以提示没有好友可以验证。然后这是唯一设备,也没有办法用其他设备验证。微信密码验证也不可行。因为我本来就是不记得密码才选择的手机验证码登录,然后银行卡也不行。因为这个手机号的微信没有绑定过银行卡。

于是我又退回去。选择忘记密码,结果忘记密码的流程就是用手机验证码登录,而且截图的官方指引,引用的还是旧版,和新版微信的按钮界面什么都不一样。

我想,要不看看升级到最新的微信看看,我到应用商店查看,发现已经是最新版了。我也没啥办法了,想想在设置里看看微信设置,看看有没有什么办法吧。于是打开设置,搜索微信。点开之后,发现问题了。我爸居然开了双开功能。按照我对于我爸的了解,他是绝对不需要微信双开的。而且他不仅微信是双开的状态,微博也是。于是我将微信双开关闭,然后又把微博的双开也关了。

再次回到应用商店,点击微信的打开,这次微信直接开了,不需要登录。这就证实了,刚刚一直需要登录的是双开后的第二个微信,而第一个微信原本就一直是登录的。

回到桌面,我发现另一个问题,微信在桌面上找不到。但是应用商店里却安装了。直接为AI,小爱同学和我说,可能是隐藏了应用。解除隐藏就可以。也可能是双开,双开可以创建快捷方式。我去看了一下,的确是隐藏了,而且还隐藏了好几个应用。我于是将这些应用也都给解除了隐藏。

最后,我又顺带将应用商店里的过期应用都更新了。

问题1的可能原因

我爸应该是误触了隐藏应用的功能,他可能是想要删除应用,但是不会于是在设置里选择了隐藏。然后不小心点到了微信,微信在桌面就找不到了。他自己解决的时候又不小心点到了双开,于是看到桌面有微信了,就按照提示重新登录。不过其实双开应用的图标和普通应用的图标是有区别的,所以如果注意一下就能知道是不是双开的应用了。

问题2

我和我爸说他这个问题1,他提到了可能是他经常需要关机再开机导致的。因为他每天早上都会遇到全屏的广告,一不小心就会安装不想安装的应用,然后还切换不出来,只能关机重开。我试了一下锁屏,然后解锁,没看到广告。我说没有啊。我爸说每天早上都有。我又重新解锁,然后右滑了一下,出现了开屏画报。我问他是不是这个。我爸说对。我试了一下,果然只要点击就会直接跳到应用商店,让安装应用。

我于是解锁手机,进入设置,然后搜索开屏。找到开屏画报的相关设置,禁用了右滑进入开屏画报,以及每天的早报功能。应该就是早报功能导致每天早上即便不右滑也会出现开屏画报。我这相当于把这个功能完全禁用了。

结论

相比于苹果手机,安卓手机还是太过于复杂了,不仅系统有广告,而且内置了很多复杂的高级功能。问题1我也是研究了半个多小时才解决的,我自己也在用小米的澎湃系统,但是我对于这些也不熟悉。因为我自己本身也没有用过这些功能。

Codex上下文的前世今生,要不要调整上下文你看这一篇就够了

技术

今天,Tibo在X上给出了Codex设置1M上下文的方法。我尝试了,也的确成功了。但是我又改回去默认的258K。关于上下文这个事,以下的事情是你需要了解的。

在gpt-5.6系列发布之前,Codex的上下文一直是258K。这是用户可用的部分,隐藏了系统占用的。但是gpt-5.6发布之后,这个上下文一度增加到了384K。不过很快,有人发现5.6的额度消耗过快。这是因为原本调整为384K之后,应该是384K上下文之内都应该按照默认收费,如果额外设置,超出了,才应该按照2x收费。可是实际上,OpenAI的服务器却是按照超过258K就开始2x收费,OpenAI发现了这个bug,于是回滚到258K的上下文,并且承诺,说一旦修复了。就会恢复。

可最终OpenAI并没有兑现这个承诺。258K就是目前的最终的默认上下文。唯一改变的,是以前只有使用API的用户可以设置为1M上下文,现在任何订阅的用户也可以设置了。但是一旦超过默认的258K,全部的输入都会按照2x收费,全部的输出都会按照1.5x收费。注意:是超过默认的258K,全部都会按照2x和1.5x收费,而不是超出的部分。而订阅用户,如果手动设置为更大的上下文,则会感到额度消耗得更快了。

这也是为什么我最终还是选择回退到默认的设置,毕竟省钱才是王道。

如果你想测试

可以将tibo的原文贴给AI,然后AI遵照设置,设置完成之后,需要退出重开一下Codex。取消也是同样的,需要重启Codex才能执行。

Screenshot 2026-08-17 at 9.54.55 AM