Hi there 👋

Welcome to my blog, my name is Ray. I am a software developer and this is my personal blog where I share my thoughts, experiences, and projects. Feel free to explore and connect with me!

手机远程 vibe coding——HAPI 全链路自建

本文转载自 Datawhale easy-vibe 教程,加了自己的理解和全链路自建的部分 手机上写代码? 地铁上突然想到一个 bug 怎么修,买一杯瑞排队的时候收到线上告警,躺床上不想起来但又想让 Claude 帮你跑个任务——这种场景太多了。传统 IDE 那套东西在手机上根本跑不动,虚拟键盘输入代码效率低得离谱,小屏幕连代码和终端都放不下。 但换个思路想,手机只需要当一个控制台就够了——输入指令、看结果、审批操作。真正干活的还是你家里/公司的开发机。 这就是"瘦客户端"的核心思想:手机只管发指令,活在别处干。 现有方案快速过一遍 社区里能用的方案其实不少了,快速过一下: iOS 官方 App Anthropic 出的 Claude App 里直接有 Code 标签页。手机发指令,代码在 Anthropic 云端沙盒执行,结果通过 GitHub 同步。零配置,Pro 订阅就能用。但——中国大陆用不了,功能也受限,不能访问本地文件系统。pass。 Happy Coder 开源的,跨平台(iOS/Android/Web),端到端加密。电脑上装个 happy-coder,手机扫码配对就能远程控制 Claude Code 和 Codex。配置简单,扫码即用,这个方案用的人很多。 但连接不太稳定,断线了上下文就丢了。而且依赖第三方中继服务器,代码安全心里没底。 SSH + Tailscale + Tmux 最硬核的方案。Tailscale 做 VPN 打洞(打洞失败自动中继),手机用 SSH 客户端连上开发机,Tmux 保持会话不丢。功能最完整,桌面级体验。但配置复杂,电脑得一直开着,还得会 Tmux。适合老手。 Termux Android 用户可以在手机上直接跑 Claude Code CLI。装个 Termux(注意从 F-Droid 下,Google Play 版本过时了),装 Node.js,装 Claude Code,完事。手机性能有限,编译大型项目就算了,但写个 Python 脚本、跑个 Web 项目还是没问题的。仅限 Android。 ...

May 11, 2026 · 3 min · 595 words · Ray

让AI一直干活别停

原文来自 Datawhale 的 Easy-Vibe 教程:如何让 Claude Code 长长时间工作 之前一直在用 Claude Code 写代码,但有一个很烦的问题——它干着干着就停了。你让它重构一个模块,它改了两个文件就跟你说"搞定了",其实还有一堆没改。或者你让它跑测试,跑到一半报错了,它就卡在那里不动了,也不说重试一下。 总之,最近看到了 Datawhale 的 vibe coding 教程里有一节专门讲这个,讲得挺系统的,我这里也记录一下大概,顺便加点自己的理解。 核心问题:AI 不知道自己没干完 这个其实是所有 AI 编程工具的通病。人判断"干完了没"靠的是客观标准——测试跑通了没、功能能用不、代码质量行不行。但 AI 靠的是"感觉"——它觉得自己输出的差不多了,就停下来了。 所以解决方案的核心思路就是:别让 AI 自己判断什么时候停,让外部系统来检查。 具体来说就是三个问题: 真的完成了吗? 满足客观验收标准吗? 有没有漏掉什么? 如果答案都是"没有",就把任务重新丢给它,继续干。 方法一:While True 循环(最朴素) 五行代码搞定: 1 2 3 4 #!/bin/bash while true; do cat PROMPT.md | claude done 逻辑很简单——从 PROMPT.md 读任务,丢给 Claude,Claude 干完了退出,循环又把它拉起来继续干。Ctrl+C 手动停。 可以,简单粗暴。但问题也很明显——它不知道啥时候该停,你忘了关它就一直循环,API 账单蹭蹭涨。 加个安全版本的话,限制最大迭代次数就行: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/bash MAX_ITERATIONS=50 iteration=0 while true; do iteration=$((iteration + 1)) echo "=== 迭代 $iteration/$MAX_ITERATIONS ===" cat PROMPT.md | claude if [ $iteration -ge $MAX_ITERATIONS ]; then echo "达到最大迭代次数,停止" break fi sleep 5 done 方法二:Ralph Wiggum 插件(推荐) 这个是正经方案。Ralph Wiggum 是 Anthropic 官方的插件,核心机制叫 Stop Hook——Claude 想退出的时候,Hook 会拦截,检查输出里有没有你设定的完成标记。没有就重新注入任务让它继续干,有了才放它走。 ...

May 11, 2026 · 3 min · 445 words · Ray

中文 Markdown 里的 ** 为什么会失效

原文:AI 输出中的 ** 是怎么来的:谈中文 Markdown 强调标记的渲染问题 作者:PlatyHsu 发布时间:2026-04-17 18:01(UTC+8) 说明:这里不做全文转载,只做摘要整理和少量引用;完整内容请回原站阅读。 最近看少数派这篇文章,刚好把一个平时经常见到、但很少认真追根溯源的问题讲透了: 为什么 AI 明明吐出了 Markdown 的 **,结果中文里的加粗却没有生效? 比如下面这种内容,我们大概都见过: 1 2 **重要:**请注意。 这是**「重要」**的内容。 看起来像是标准 Markdown,但不少渲染器最后会把 ** 原样显示出来,而不是变成粗体。 这篇文章讲了什么 原文的核心观点很简单: 早年的原版 Markdown 规则其实比较“松”,很多中文场景下反而能正常加粗。 现在更主流的实现,大多跟随 CommonMark 规范。 CommonMark 为了避免误判数学式、变量名等内容,引入了更严格的“贴合”规则。 这套规则主要按英文的分词和标点习惯设计,对中文这种不依赖空格分词的文本并不友好。 所以问题不在 AI,也不在你写错了 **,而在于很多现代 Markdown 渲染器对“强调”这件事判断得更严格了。 为什么中文里更容易出问题 原文提到,CommonMark 在处理强调标记时,会判断一串 * 或 _ 是否满足“左侧贴合”和“右侧贴合”。 说人话就是: 开始的强调标记,后面最好直接跟文字,或者某些“起始型”标点。 结束的强调标记,前面最好直接跟文字,或者某些“结束型”标点。 这套思路放在英文里比较自然,因为英文大量依赖空格来分隔词语和标点位置;但到了中文里,文字之间本来就没有空格,于是像中文冒号、书名号、引号这样的场景,就很容易让强调判断失败。 也就是说,下面这两种写法在不少 CommonMark 系实现里都可能失效: 1 2 **重要:**请注意。 这是**「重要」**的内容。 前者的问题在 :,后者的问题在 「」 这种中文标点环境。 原文给出的几种解决办法 1. 直接改用 HTML 标签 这是最直接、也最稳的办法: ...

April 23, 2026 · 1 min · 143 words · Updated: April 28, 2026 · Ray

一分钟解决怎么在没有互联网的主机上运行 codex

TL;DR 本地网络一切正常,能够正常访问外网/使用 Codex 没有问题 远程主机:只能通过 SSH 连接,无法联网(主要是翻墙不可用,无网的情况比较少) 之前使用 Cursor 时,网络请求走本地,context 在远端,所以迁移到 Codex 和 Claude Code 会有些许不便,今天才有空处理一下 简单来说,直接设置代理即可 本文以 VS Code 为例,因为 VS Code + Remote SSH + Codex 插件组合使用比较方便 最近 GPT-5.4 的好用程度加上 Claude 的获取太难。以半价怒冲了 200 美元的 GPT Pro,确实非常爽。 第一步:在 VS Code 中配置 SSH 反向转发 在本机的 VS Code 上打开命令面板( Ctrl+Shift+P (Mac 上是 Cmd+Shift+P)) 输入 SSH: Open SSH Configuration File 找到你的配置文件(通常是 ~/.ssh/config 或 C:\Users\你的用户名\.ssh\config) 在你需要配置的服务器上添加如下操作: Clash 默认是 7890,如果使用的是 Clash Verge 默认的是 7897 ...

April 20, 2026 · 1 min · 125 words · Ray

R2S复活记

Info 成为魔法师已经不知道多少年、为了魔法,年少无知的深夜不知多少次抓耳挠腮 某一天、某论坛、刷到一个路由器的推荐:H3CNX30pro,至今为止我都能背出型号,实在是第一个折腾的给到的印象太深。当时给到的教程配套了刷机教程,刷了 immortalwrt,一个裁剪后的 openwrt,虽然功能不多,但是核心功能已有,让我体验了丝滑的上网体验,但是如果家中只有这一台路由器,当魔法失效时,全家的网都会崩溃。 随后在前辈的指引下,他给了我一台 R2S,实在是太美好了,小巧的机身,极致极客的金属质感。起初我在这台完整的 openwrt 作为入网主路由,LAN 口后面带着 H3C 做 AP,但是这依旧没有解决魔法失效全家网络崩溃的问题。于是我找到了旁路由这个方案,随后由于魔法频繁失效、至最近半年无法订阅等各种问题出现,一直没有解决,所以我的 R2S 已经荒废已久。在今晚,他迎来了重生!!! 环境情况 至今,我家里的网络拓扑如下 这里直接用 iStoreOS 的图表示了 其中 WIFI-路由器是我的主路由,入网用以及担任 zerotier 组网 还有无线 AP 其中一条 LAN 口连接 R2S 的 LAN 口 H3C IP:192.168.6.1 R2S IP:192.168.6.80 以往使用时,我会将需要魔法的设备网关指定 R2S 来使用,而如果我修改了这个配置、他是对我的网络适配器做修改,也就是说当我换一个环境和网络,他连上不同的网络还用这个固定配置,就会失效(这里我没仔细研究,只是觉得不方便)这是我的第一个需求,要能自动从路由器发 IP 的时候就自动分开,但是老版本的 immortalwrt 或者 R2S 的完整 openwrt,DHCP 的 GUI 界面里面都暂时没有这种功能。分配静态地址时只能指定 IP 给指定 MAC 所以也一直搁置着,昨晚我购买了一份更昂贵的套餐后,选择复活 R2S 升级固件 刚开始来到 passwall2的页面,再次尝试订阅和手动导入,都没有成功。于是我推测是 Xray 那些固件太老了。于是我尝试通过页面手动更新,结果直接失败。 那我就想找到新的 passwall2 来手动更新整个服务 Releases · Openwrt-Passwall/openwrt-passwall2 ...

March 25, 2026 · 2 min · 291 words · Updated: March 27, 2026 · Ray