幻影彭的彩虹

记录青春的扇区

在无数久的 🐦咕咕咕 后一个博客它建成了!

在无数久的 🐦咕咕咕 后这个博客它复活了!

博客主要会收录这些东西:

  • OI/ACM 相关

    • 考试技巧
    • 题解
    • 算法理解
  • 学习笔记

  • 面向各种人群的科普

  • 我的开源项目

  • 生活中有趣的事

  • 一些奇思妙想

我是谁:

  • 如果你线下认识我,可以叫我 "毛Ker" 或者 "老毛"
  • 如果你线上认识我,可以叫我 "彭彭"。
  • 这些 ID 都是我:huan-yp幻影彭huan_yphuan_yp2002

联系我:

  • QQ:3051561876

SEUAIG 权限模型

三角色 RBAC

学生、教师、管理员。

管理员只能在数据库中授权,教师只能由管理员授权,所有账号注册时默认为学生。

实际操作引入了超管,所以是 4 角色。

表单型资源实体

包括题目、题单、班级、比赛。

所有操作归类为读操作和写操作。

RBAC 授权:教师具有全部读权限和新建资源权限;学生无权限;

关联授权:新建资源写权限归属创建者;具有写权限的用户可以授权给任意用户任意额外权限;

资源属性授权:指定资源为公开,即授予所有用户读权限。

实际如果有需求可以对实体设置读写管理三种权限层级

资源实体关联

有一个操作是 "把题单关联到班级" 和 "把题目关联到题单"。

存在一个风险:如果学生在班级/题单里,那么应该是能看到关联到班级的题单/题目。实际行为的实现中,如果采用 "只要在班级里就能看到未公开的但是已经关联到班级题单",问题是 "未来作业" 老师是暂时不想公开,但是又加到班级里,不好处理。

解决方案:

  1. 引入中间资源(作业/题单项)推荐
  2. 关联表中引入额外字段(本质上是把关联表当作中间资源)

安全性问题

大部分场景其实没有那么高的安全性需求,长尾需求一般还是集中在小圈子,人的社会关系是自然的安全保障。

NcatBot

Ncat 的一个 Bug

就是单纯的接口契约没对上,期望要 QQAPIClient 暴露 set_group_add_request 到顶层,实际上接口在 QQAPIClient.manage.set_group_add_request

因为 QQAPIClient 是符合协议 IQQAPIClient 的实例经过一定的流程组装起来的。

实际上应该要测的是从最开始(裸协议实现)组装起来后有没有这个接口

SEUAIG

带数据库的项目,测试应该是要有专门的测试数据库。

测试应该专门有一个流程,起测试数据库,测试数据库应该是一次性的,用完就丢。

开发环境 & 测试环境可以统一;生产环境必须独立。

怎么测试?

理想情况下,对于前端,应该有 “从 VO 到展示”,“从交互到副作用” 这两类测试;对于后端,应该是以业务场景分割的端到端测试为主,对于复杂的管线(例如事件总线,消息队列)也可以用集成测试检查下契约和数据流之类的。

不过我现在实践下来很少有 Bug 发生回归,所以比较高效的测试方案是人工做业务端到端测试,写测试反馈,然后交给 AI 去迭代修复。但是这样能 Work 的前提应该是设计者需要有足够好的 Taste 和直觉去评判 AI 的修复方案。

大部分时候让 AI 静态检查一下代码逻辑和结构就能发现很多问题。

我觉得更理想的方式是从设计上减少 Bug 回归的风险,通过合理添加日志来提升定位 Bug 的能力,通过隔离来降低风险,而不是依靠测试去兜底。

AutoWSGR

这个项目有不少复杂性在逻辑上,尤其是 OCR 和识图的操作。针对核心函数的单元测试就很重要

我构建了针对 OCR 算法、视觉定位算法的单元测试(数据靠人工标注),让 AI 自行迭代算法,效果很不错。

PMEOW

和 SEUAIG 感觉差不多,CI 测试基本没用,检查下 lint 得了。


持续更新中...

记得小学时候有一片课文,主人公经常做梦梦见他在飞,然后被这个梦解读为在长高。

我很喜欢一部系列小说——《2042:背包里的天空》故事中的主角有一双翅膀,因为要避开别人的异样眼光只能将翅膀折叠在背包里。他会飞,但是只能在深夜里翱翔。

看过那部小说之后,我也经常做梦,梦见自己会飞,也许有十多年——从小学五年级到现在。有时候,是科技向,我背着单人飞行器;有时候,是魔法向,我学会了飞行魔法,从五千米的高空掠过沙漠和盆地。

其实也不一定是飞行魔法,传送魔法也可以,闭上眼睛,通过一种特殊的定位方式,将自己传送到高空,伸开双手滑翔,在即将坠地时再把自己传送到安全的地方。

(我穿过水道廊坊,古风拱桥) (传送魔法可能是和苏梦学的)

有时候,干脆是扭曲物理规则,在平坦的地面上起跑,就能获得足够的浮力飞起来,俯瞰下面的实验小学。

偶尔也可以像故事里主人公长出翅膀,在后现代的城市夜空从一栋高楼飞到另一栋。

(东升苑)

我喜欢飞。

又一次梦,我从巡航中的客机坠落,张开翅膀。我看到一片湖,一片行道树,穿行的车流。

在芜湖的轻轨二号线中我找到了那种感觉,像是飞在空中,透过窗外向下看去,镜湖倒映着蔚蓝的天空,脚下是车流和行道树。

梦境和现实的重合总是令人感慨的。

期待下一个美梦。

我从来没有这么密集过的乘坐公共交通工具在全国各地穿行。

二月底结束寒假从达州返校。看着1500元的机票,我不禁动了一个念头:如果我不坐飞机呢?打开12306查看元宵节前后的车票。价格相对低廉的K字和T字卧铺全部售空——这个时候才2月14号晚上,刚刚放票不到8个小时。

硬座还有票,到南京,25个小时,180块。我用学生证认证了学生票,价格打折了,89元。

有趣的是,认证流程比我想的快很多,上传完资料后几乎是立刻完成的。 之前我总觉得类似的流程往往会在中心化的“人”那里卡很久,返工无数次,甚至于我对这种流程产生了一种天然的恐惧,不想和任何“程序”打交道。

我买了一张硬座,28号下午4点出发,次日下午5点到南京站。

拖着一个小行李箱,背着新换的书包打了一辆出租车,手里还提着一个零食袋。火车上的商品一方面是贵,另一方面是不好吃。自己带方便面稳妥些。 检票上车,字面意义上的人山人海。行李架上堆的满满当当,我好不容易才找到一个位置安置我的皮箱。至于书包和零食,只能抱在怀里。座位下放着旁边乘客的箱子,很硌脚,我花了很久调整到一个舒服的坐姿。

我能够预料到绿皮火车上的乘客整体素质不高,实际上也是的,但比我想象的好。我的座位在列车中间,周边的三位乘客是和我一样的学生,一个大一,一个大三,还有一个和我一样大二。另外还有不少无座的乘客挤在车上,有人自己搭了个小板凳。

穿越秦巴隧道群,网络很不好,我打开deepseek问了问沿线的情况和这条路线的历史。chatbot不怎么依赖网络,但还是很卡。“秦巴隧道群”也是deepseek告诉我的。 我发现乘车的时候很适合听歌。 应该是晚上八点,停靠了最后一个小站,下一个站是次日六点了。车上的乘客没有少太多,依然有很多无座的乘客。

25b8872700187944d6d017195aedc771_720

乘务员来过几次用非常特别的热切语气在推销产品,甚至于有点冒犯,但我也没有觉得特别反感。

吃过泡面,和同乘的几位同学攀谈起来。绿皮车的25个小时很无聊,手机也无法完全打发掉时间。往往人的故事更加有趣。

我可能迷迷糊糊到凌晨三点才勉强睡下。 睡了三个小时不到就醒了,我开始数着小时计算还有多久才到达目的地。

我喜欢一种特别的计数方式。具体的,就是计算占比并重置。比如过了七个小时就是过了四分之一(25个小时的第一个小时被我skip掉了)此时还剩十八个小时,我告诉自己过去了四分之一,我会重置计数,再过三个小时,我告诉自己已经过了六分之一。

这种计数方式来自一部我已经叫不出名字的电影。航天员来计数自己的燃料。消耗到还剩百分之十的时候,他重置了计数器,以现在的燃料为基准,设定33%的去,33%的回和33%的备用。

我不想讨论为什么我喜欢这种计数方式,这比较费神。 很快到了下午一点,我又泡了一桶泡面做午饭,然后告诉自己还剩下达州到成都的车程了——四个小时。 同样重置计数器。

下车时,我买的零食可能吃了三分之二,尽管只睡了4个小时,但我并不特别困,也许是乘车本身是一种比较低耗的过程。心理上却是另一种感觉——今天已经不想再做任何事了。

舟车劳顿。

我如愿以偿的节约了1200元的机票和火车票的差价。


可能是去年年底,我真正坚定了不走学术的决心,并开始打算怎么在工业界发展。

2025的ecfinal在杭州举办,2026年2月,有很多大型科技企业赞助,他们也会在这个赛场上捞人。

南京到杭州不过一个小时出头的高铁车程。没什么特别的感觉。我们去了西湖,苏堤,烟雨朦胧。

比赛拿了一个还算不错的成绩,我开始物色大模型相关的实习,最后加了小米HR的联系方式。

EC Final

我对计算机系统从上到下还算有个透彻的了解,所以一路面试过去基本很顺利,拿到了AI Infra的offer。

困难是显然的,base 北京,我在南京念书,我有课要上。

虽然我确实不需要上课来学习知识,也确实不怎么去上课,但要命的是我需要上课来拿到让我毕业的学分,尤其是体育课。

经过多方博弈,我拿出了一个不是办法的办法——每周往返北京南京。 一趟高铁的价格从464到533不等。耗时越短越贵,时间越理想越贵(比如早上九点出发中午十二点半到就很理想)。动卧稍微便宜一些,上铺350。T字头更便宜了,上铺只需要250。

清明放假,坐上了第一趟前往北京的高铁。本来买的11点的,实际上因为不看路导致瞎兜兜转转了20min最后miss了,只能改签到下一个小时的。

长三角到华北平原一路很平顺。巨大的风力发电机一路铺过去。 平常人很容易低估风力发电机的大小,因为那实在是太远了。

我搜了一下,陆上风电只有海上风电十分之一的功率。很难想象海上的风电是怎样的一种庞然大物,也很难想象是怎样的伟力才能推动它的扇叶转上一圈。

那是个阳光明媚的午后。

(距离我开始写这个系列已经过去一个半小时,我在高铁上坐了一个小时,还有两个半小时到南昌)

押一付一总计一万一,加上各种开销第一周花了可能一万三,几乎清空了我的流动资金。 第一周是没计划回南京的,毕竟还在landing,周末处理了学校GPU集群的故障,还打了THUPC。

不巧的是,4.13 发现耳朵听力异常了,连忙挂号打车去医院,诊断是突聋。我身上已经没有足够的现金了,基本都放在股票类基金里面。不得已开口找父母要了五千块交住院押金。 给我狠狠上了一课,无论如何身上都需要留一万元左右的现金应急。

我开始刻意节省出行的开支,40元打车变成了8块的地铁加公交组合出行。我可能已经好几年没坐过公交车了。

在北京,超过10公里的打车,平均一公里两块五,南京这个数字是两块。这是网约车,出租车大概是double。

我始终有一个看法:“地铁能到的地方,都不远”。地铁可能是中国城市建设发展最杰出的代表之一。 我中学时生活在成都,成都一定是国内地铁网络最发达的地区之一,地铁网络几乎覆盖了市区的每个角落,换乘便捷。共享单车加地铁的组合能在一个小时的时间窗口覆盖我任何的点对点出行需求。

北京和南京地铁覆盖率可能没什么问题,但换乘做的不够好,要走很远。 我住院的地方很不巧不在地铁覆盖范围,最近的地铁站还需要额外坐45min公交车(约10km)才能到。

地铁最大的特点是时间可控利于规划行程。公交和打车都不太可控。 公交地铁的综合出行成本也许是每2公里1人民币?

南京到北京大约1200公里的铁路长度,高铁的成本大约每2.4公里一元,动卧则是每3.6公里一元。T字头或者Z字头卧铺大概每5公里一元。

南京到达州大约2200公里的铁路长度,K字头硬座大约每12公里一元。 轨道交通都很可控,时间表很准,从来都是飞机晚点,很少见地铁或者火车晚点。


如果一个人,不远千里来到你的城市,只为了和你见上一面,别问任何理由,也别管任何结果。你只要深深的相信,TA来的时候,你一定是TA心里最重要的人。

这个世界上奢侈的东西,从来不是昂贵的礼物,而是有人愿意为你花时间,尤其是跨越山海的时间。

记得25年的寒假,我买了一张无座的车票从达州到成都,只为了和高中的挚友聚上一次餐。我在成都订了一晚酒店,次日才重新搭上回家的列车。

今年二月,我又接到他们的电话,可惜这次太迟了,我就算立刻出发,也赶不上两个小时后的晚餐。

昨天,我和小J打车从南京去到芜湖,去小D的家乡疯玩了一个下午,再乘高铁回去。小J累到直接睡着了,要不是我叫醒他,他也许就坐到上海去了?

现在,五一佳节的第二天,我坐上了一趟从南京开往南昌东列车,为了同样的目的。

我大可以说走就走,即使是实习,顶级AI实验室开出的薪资绝对是能让人衣食无忧的。只要有想法,随时可以买票,高铁,飞机,都可以。就算是高铁一等座或者商务舱,也不过是稍微心疼一下。

但我想大部分人没有这么自由。25个小时的绿皮上挤满无座的乘客,T/K字卧铺提前十四天发售立刻被预订一空,这个国家的底色,仍旧是普通的工人和农民。

二月那次,我和同乘的同龄人攀谈,了解到原来学生可以更提前一些预订K字列车的卧铺,得以顺利横跨数个省份,接受更优质的教育。

五一佳节,有人归乡,有人出游,时间和价格都合适的车票在放票的那一刻便被一扫而空。姗姗来迟的我只能以更高的价格购买时间更糟糕的车票,甚至回北京只能买一张无座的牛马专列。

而现在,所有的车票已经售罄。

车站人头攒动,热门景点更是人山人海。

理想的出行计划也许要提前两周规划,何尝不是另一种三月聚粮?

(现在是晚上六点,还有一个半小时到南昌,特意删掉了一些英文习惯性用语换成中文)

父亲说,我去坐绿皮可以体验下生活。我坐绿皮倒没有什么特别的体验,但坐动卧无疑是有的。到北京的动卧比高铁便宜200元,而不幸的是,有乘客呼噜震天响。

我再也不想坐动卧了,三个半小时的高铁或者飞机更合适一点。

我之前和大学同学出去聚餐,很少坐地铁,基本是打车。问到理由,我的回答都是:“打车比较节省精力,剩下来的精力比那十几块钱值钱。”

我省下了精力,却错过了感受这个文明心跳的机会。

公共交通网络,就像一个国家的动脉,输送着它温热的血液。

中国的基础设施建设无疑是成功的,跨越山海的距离放在两百年前可能就是永别,留下多少文人墨客的叹息。

“劝君更尽一杯酒,西出阳关无故人”

而现在,我在高铁的窗前,看到山脉以三百六十公里每小时的速度向后掠去,枕木滑行的速度超过了人眼的视觉极限,就像消失了一样。

在上个世纪,我们遇山开路,遇水架桥。铁轨和沥青铺遍了960万平方公里的国土。任何人,都能够在规划良好的前提下,用可以承受的价格,踏上一趟开往任何目的地的K字头列车。

八百里加急的大事,现在化作了一串光信号,穿行在地底的光纤,眨眼间送到政要的眼前;贵妃的荔枝,现在被物流系统分拣筛选,踏上运输网络,能在24小时内送到任何一个位置。

有幸,我们生活在一片无比辽阔的土地,生活在一个无限可能的世界,生活在一个伟大的社会主义国家。

(本来是有其四的,但我暂时想不到该写什么,就这样吧)

SSH 端口转发和会话连接

有时候连 ssh 需要过几次跳板机。可以通过多个 ssh 隧道转发实现直连,只需要敲一次 ssh 命令。

这里的示例是反向能直连的情况,不能直连需要在跳板机上也搭好隧道。

参数

1
ssh -NT -R 8080:localhost:3000 user@server
参数 含义 为什么常用
-N 不执行远程命令 只做端口转发,不需要登录 shell
-T 禁用伪终端分配 节省资源,避免分配不必要的 TTY
-R 在远端开监听端口 让远端访问本地服务
-L 在本地开监听端口 让本地访问远端服务

远端指被连接者,本地指连接者。

输入

8080:localhost:3000[listen host]:{listen port}:{target host}:{target port}

  • [listen host]:可选,默认 127.0.0.1,控制能到连接到的监听端口的来源主机,默认只允许监听侧的本机

    • -R 的情况下,该参数默认不生效,想让该参数生效,必须要远端GatewayPorts 允许任意远端侧来源的流量。需要尊重远端的配置
  • {listen port}:必须,指定监听端口号

  • {target host}:必须,指定把监听端口数据包送到哪个主机去,{target host} 是一个相对位置,如果 -R,那么就是相对本地的,如果是 -L 就是相对远端的。

  • {target port}:必须,送到主机的哪个端口。

    两侧本来是独立的,通过隧道可以关联起来,关联的是两个局域网,不是单纯的两个机器

    更具体的,执行 ssh -L 命令后,对于任意机器,访问监听侧等效于访问目标侧,这个等效是双工的,目标侧可以收到访问侧的数据包,访问侧也能接收到目标侧的的数据包。

    例如 ssh -NT -R 8080:localhost:3000 user@server 后,在远端访问 localhost:8080,就等效于和本地的 localhost:3000 交互。

会话连接

会话创建

在 ssh 连接中产生的进程会归属到 ssh 会话

ssh 连接时,自动启动一个新的会话,将 shell 设置为前台进程组,sshd 守护进程是会话的首进程。

会话断开

ssh 断开后,系统会主动向整个会话发送 SIGHUP,会话首进通常会随信号终止,SIGHUP 会进一步送到会话内的所有进程

大部分程序没有定义处理 SIGHUP 的部分,默认终止

& 扔给后台没用,因为信号同时发送到所属会话的全部进程组

后台运行方案

  • nohup 前缀运行,默认忽略 SIGHUP,比如 nohub sh xxx.sh,最轻量。
  • disown:解除任务和当前进程的关联。
  • setsid:创建新会话运行。
  • screen/tmux:完整会话管理

自动重连

安装 autossh 使用即可,外面套了一个自动重试重连。

默认是基于心跳包的重连机制,默认心跳包是 10min,一般会显式设置为 30s 或者更短

1
2
3
4
5
6
7
8
9
autossh -M 0 \
-v \
-o "ServerAliveInterval 30" \
-o "ServerAliveCountMax 3" \
-o "ExitOnForwardFailure=yes" \
-o "ConnectTimeout=10" \
-NT \
-R 2222:localhost:22 \
user@server

VSCode 端口转发

  • 本质是 ssh -L xxxx:127.0.0.1:yyyy user@server

重定向和合并符号

>:覆盖写入,前面的参数可以缺省,默认为 stdout。

>>:追加写入,前面的参数可以缺省,默认为 stdout。

2>&1:专有语法,把文件描述符 2 (stderr)的输出位置指向文件描述符 1(stdout)

常用组合

nohup my_command > output.log 2>&1 &:注意顺序,必须先把 stdout 指向文件,再把 stderr 指向 stdout 所指的内容

相关命令

1
ssh-keygen -t ed25519 -C "youremail@example.com"

使用 Linux 服务运行程序

在 ssh 终端中运行的程序和 ssh 会话生命周期绑定,会话断开程序就会被杀

使用 tmux、screen 当然可以解决进程和会话绑定的问题,但解决不了开机自启等问题,而且比较重。

对于需要持续稳定运行的进程,使用服务功能是更专业和便捷的方案。

不过,由于 Docker 普通容器启动模式的问题,Docker 中无法使用服务功能。

systemd 服务

配置文件

命名为 xxx.service,后缀名 .service必须的。

文件放在 /etc/systemd/system 目录下。

可以使用 # 来写注释,参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit] # 定义服务元信息和依赖关系
Description=服务描述
After=network.target
Requires=network.target mysql.service
RequiresMountsFor=/path

[Service]
User=myuser # 默认 root 可以缺省
WorkingDirectory=/opt/myapp # 工作目录,缺省默认 /
ExecStart=/usr/bin/python3 /opt/myapp/myapp.py # 实际执行的命令
Restart=on-failure # 默认 no
RestartSec=5s # 可以缺省

[Install]
WantedBy=default.target

Unit

After 和 Requires 独立是为了考虑以下情况:

  • XXX 不依赖 YYY,但是为了避免资源竞争,所以只需要 XXX 在 YYY 后面启动(只写 After)
  • XXX 依赖 YYY(After 和 Requires 都要写)

空格隔开不同的服务以声明多个依赖(注意自定义服务需要写 .service 后缀)

RequiresMountsFor 用来显式要求某些路径已经挂载好,通常来讲,如果只需要用 /var/opt/ect/tmp 等常规目录,那么可以不用声明路径挂载依赖

系统会隐式添加一些基础的依赖。

Service

User:执行的用户,默认 root。

Restart:控制重启策略,重启默认有 5s/100ms 等限流。

  • no:默认,不重启。
  • on-failure:失败退出时重启,包括非零退出,被信号终止,超时等,最常用

Install

WantedBy 参数用于控制 enable 的语义,一般写 default.target。这样在执行 systemctl enable xxx.service 时,可以将服务加入开机自启的队列。

管理命令

一般用 sudo 执行,例如 :

1
sudo systemctl start xxx.service

如果是 xxx.service,后缀可以省略,直接:

1
sudo systemctl start xxx

针对服务常见命令有:

  • start、stop、status、restart。

  • enable、disable:用于控制服务开机自启

  • reload:重载服务配置,需要服务声明 ExecReload 支持热重载。

针对 systemd 本身常见命令有:

  • daemon-reload:常用于让 systemd 扫描服务配置文件的变化

ctl 是 control 的简写。

journal 日志

journald 是 Systemd 自带的日志收集系统,而 journalctl 则是专门用来查询和查看这些日志的强大命令行工具。

持久化日志目录

默认情况下,journal 日志写到 /run/log/journal,机器重启后会丢失。

如果希望不丢失,需要创建 /var/log/journal,只要有这个文件,就能自动写到这里,不丢失。

如果刚刚创建目录,需要重启 systemd-journald 让配置生效。

常用命令

journalctl:查看所有日志。

journalctl -u <服务名> 查看指定服务的日志。

journalctl -f 动态显示新的日志。

journalctl --since "时间" --until "时间":按照时间过滤日志。

可以组合使用

一些常识

各个目录用途

opt

  • 存放第三方、手动安装的、自包含的大型软件包。通常每个软件放在自己的子目录中(如 /opt/nginx/opt/teams)。
  • 特点:软件自身包含所有依赖、配置文件、可执行文件等,不分散/usr/etc 中。卸载时直接移除目录就卸载干净了。
  • 与服务相关:自定义服务如果安装到 /opt/myapp,对应的 .service 文件通常仍放在 /etc/systemd/system/,而服务程序本身位于 /opt/myapp/bin/

etc

  • 用途:存放系统级配置文件(文本格式,通常为 .conf.ini.yaml 等)。
  • 特点:所有软件的全局配置几乎都位于此目录或其子目录中。例如:
    • /etc/nginx/nginx.conf
    • /etc/systemd/system/(自定义服务单元文件)
    • /etc/hosts/etc/fstab

同一软件视安装方式的不同可以有不同的组织策略,如果 nginx 是用 apt 安装的,那么默认情况下,把配置文件放到 /etc,把可执行文件放到 /usr 是合理的。如果手动安装,全部放到 /opt 就是正确的

run

  • 用途:存放系统启动以来产生的、易失的运行时数据,如进程 PID 文件、套接字文件、系统状态信息。
  • 特点tmpfs(内存文件系统),重启后清空。

var

  • 用途:存放预期会持续增长或变化的数据,如日志、缓存、假脱机文件、临时文件(但重启后通常保留)。
  • 子目录/var/log//var/cache//var/tmp

/opt 下的软件,日志也推荐打到 /var

usr

  • 用途系统范围的只读程序和数据(用户软件资源)。大部分软件默认安装在此,如 /usr/bin/usr/lib/usr/share

环境状态

一般我们用“能否顺利运行某个项目”来评判一个人的“计算机基础”是否足够好。

我觉得这种泛 computer use 的能力本质上是一种大脑中环境状态管理的能力。

一个很危险的事情就是状态失控,状态失控后,你脑子里会失去对当前状态的宏观认知。这样会陷入一种“盲打”的状态,完全不知道自己在干什么,为什么要干这个,干完之后是什么状态。

操作

操作计算机,本质是你按照一些资料(例如文档,AI 给的命令,你自己的记忆)去做一些动作。操作做完之后整个计算机的状态会发生改变。

某些操作(例如从github下载)需要当前状态具有某些特征(例如配置了网络代理)

对操作的理解,例如配置环境变量,例如执行安装脚本。本质上也是一个环境输入输出副作用的模型。

输入输出是显式的,环境和副作用是隐式的。副作用可以从输出中推测。 还有的操作是用来观察环境的,没有副作用。

理解操作就是理解它的环境前置,并有能力根据输出推断副作用,进而更新脑内的环境状态

Use AI

问 AI 的时候,考虑有意的带上这些状态可能会让 AI 的回答更准确。

重新掌握状态

重启能解决问题本质是重启重置了状态,消去了一些难以观察到被错过的副作用。

有时候项目本身的状态过于混乱,删库重拉就是一个重置状态的方案。

总之,computer use 就是这样一种脑内管理环境状态,选择合适的操作让环境状态变成期望状态的能力

用 5 min 讲清前端三剑客、内容/应用服务器、CORS、完整 HTTP 回包链路,

阅读全文 »
0%