WWW.YOUINFO.SITE
标签聚合 前言

/tag/前言

LinuxDo 最新话题 · 2026-06-11 21:30:57+08:00 · tech

前言 目前我把游戏分别放在本地 D:\game 和NAS的 G:\game (映射盘符)上运行(主要是gal和一些SLG太占空间了,又不想删)。长时间后, Local,Roaming,LocalLow 里会有各种游戏生成的存档和配置文件目录。 删游戏时这些目录并不会自动消失,AppData 越来越臃肿,想手动清理又怕删错,备份更是无从下手 于是我写了一套 PowerShell 脚本: 实时监控文件夹创建,自动记录游戏路径和存档位置,并在确认后将存档迁移到统一目录,在原位置留下符号链接 。这样既能把存档集中管理,又能让 AppData 保持干净。不过,NAS 映射盘符是整个过程里最大的坑(但大多佬们似乎用不到)。本文将分享我从“映射失败”到“稳定挂载”的全过程,以及脚本在中文转码、路径匹配、去重、队列管理等方面踩过的坑和最终方案。 而且我现在的环境很特殊:NAS 和主机用网线直连,主机通过 ICS 让 NAS 共享校园网。下一篇博客会补充 NAS 实战中的更多内容(为此我花了一周在学习网络通信协议)。 手动查找并迁移已有文件 1. 按修改时间查找文件 如果知道文件大概的修改时间范围,可以用以下命令快速定位: Get-ChildItem -Path "D:\game" -Recurse -File | Where-Object { $_.LastWriteTime -ge "2026-06-01 10:40" -and $_.LastWriteTime -le "2026-06-01 11:00" } 找到后根据完整路径判断属于哪个游戏,然后手动复制存档到备份目录(例如 D:\GameSaves\manual )。 2. 批量迁移脚本(BAT 示例) 对于大量已知映射关系的配置文件,可以写一个批处理脚本。 注意:BAT 脚本如需输出中文,必须保存为 ANSI(GBK) 编码;而给 AI 或代码库看的脚本建议用 UTF-8。 @echo off set SRC1=C:\Users\admin\AppData\Local\GameA\Save set DST1=D:\GameSaves\GameA xcopy "%SRC1%" "%DST1%" /E /I /Y set SRC2=C:\Users\admin\AppData\LocalLow\GameB set DST2=D:\GameSaves\GameB xcopy "%SRC2%" "%DST2%" /E /I /Y echo 迁移完成 pause NAS 盘符映射 1. 在 Windows 中映射 NAS 文件夹 我的 NAS 型号是绿联 Dxp4800plus,通过 ICS 共享网络,设置的私网IP 为 192.168.137.20 。我把所有游戏放在 NAS 共享文件夹 ACG (原名 acg资源 ,后来改名)下,并映射到主机的 G: 盘。 正确映射方法(一定要勾选“登录时重新连接”) : 右键“此电脑” → “映射网络驱动器”。 驱动器选择 G: ,文件夹选择 NAS设备\ACG 必须勾选"登录时重新连接" ,不然后面开机自启会出问题。 用校园网连接NAS时,在 网络 可能会找不到设备,需要先进入 WLAN 把校园网从专用切换为公用,再在 网络 里重新转为专用,才能发现 NAS 设备。我现在也没搞清楚根本原因是什么,如果佬们知道正确的修改方法请告诉我。 2. 几个踩坑点 踩坑 1:修改共享名称后映射失效 当我把共享文件夹从 acg资源 改名为 ACG 后,就无法进入之前映射好的 G: 盘了。这是因为映射驱动器指向的远程路径是 \\...\acg资源 ,而实际共享已不存在。 解决方法 : 先删除旧映射G盘 按照上述步骤重新映射到新文件夹 ACG 一旦修改 NAS 共享名,必须同时更新所有客户端的映射,并更新脚本中的路径 踩坑 2:到底该用盘符(G:)还是 UNC 路径(\IP\share)? 这是困扰我最久的问题(主要是不停打开游戏和脚本测试,还要不断删除对应的文件和json内容)。 脚本需要匹配运行中游戏的可执行文件路径,而 Get-Process 返回的 Path 属性 在不同启动方式下表现不一致 : 如果通过资源管理器双击 G:\game\xxx.exe 启动,进程路径有时是 G:\game\... (盘符形式)。 如果通过 \\192.168.137.20\ACG\game\xxx.exe 直接启动,进程路径是 UNC。 有些游戏启动器可能会强制转换路径。 我最初按 UNC 路径 \\192.168.137.20\ACG\game 设置 $gameRoot ,但实际运行时却匹配不到(因为进程路径是 G:\game 开头)。后来改为 G:\game 就成功了,所以最稳妥的做法是 把盘符和UNC都配置上 ,让脚本自己去匹配。 不知道为什么,在 powershell 中 cd \\192.168.137.20\ACG\game 却没有问题 踩坑 3:开机自启时 G 盘还未连上 设置任务计划程序开机启动脚本后,发现脚本虽然运行了,但始终检测不到 NAS 上的游戏。日志显示 [注意] 未检测到游戏进程 。 原因:用户登录后,系统需要几秒钟来恢复网络驱动器。而脚本在登录瞬间就执行了,此时 G: 盘还不存在。 解决方案 :在任务计划程序的触发器设置中,添加 “延迟任务时间 30 秒” (或更长,如 60 秒),这样脚本会等待网络和映射完全准备好再启动。 实现自动化监控脚本 核心需求: 监控三个存档常用目录: %LOCALAPPDATA% 、 %APPDATA% 、 %USERPROFILE%\AppData\LocalLow (即 Local,Roaming,LocalLow ) 当有新文件夹被创建(某个游戏第一次生成存档)时,自动记录 同时检查本地 D:\game 和 NAS 映射的 G:\game 路径,检测当前运行的游戏进程并将其 exe 路径以 Base64 存入队列 1. 设置 PowerShell 执行策略 首次运行脚本前,需要允许执行本地脚本: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 2. 监控脚本(Watch-GameSaves.ps1) 以下为脚本核心结构(完整代码略去,仅说明逻辑): 定义监控根目录、排除文件夹列表。 使用 FileSystemWatcher 监视 $watchPaths 下的文件夹创建事件。 事件触发后: 跳过已存在的连接点或排除文件夹。 延迟 3 秒,给游戏时间完成写入。 获取正在运行的进程,匹配路径是否以 D:\game 或 G:\game 开头。 将匹配到的第一个游戏 exe 路径转为 Base64(避免 JSON 中的转义和乱码问题)。 将存档路径、游戏 exe Base64、时间等信息写入 pending.json 。 3. 解决中文乱码:Base64 转码 因为游戏路径中可能出现中文(如“除灵猎人”),直接存储到 JSON 会导致编码混乱(而且很难解决,不论将文件保存为UTF-8还是GBK都不行,因为本质是在action中进行的解码)。解决方法是将 exe 路径进行 Base64 编码: { "srcPath": "C:\\Users\\admin\\AppData\\Local\\NebelTR", "time": "2026-06-04 15:28:26", "gameExeBase64": "RDpcZ2FtZVxSUEdcQkJR5aSn5aW944GNXOmZpOeBteeMjuS6ulzpmaTngbXnjI7kurotQ04tMS4xMlxHYW1lLmV4ZQ==", "dirName": "NebelTR", "remark": "" } 使用时通过 [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($base64)) 解码即可得到原始中文路径。 4. 避免重复记录已处理目录 某个存档目录已经成功迁移并创建了符号链接后,之后游戏再次运行,监控脚本又检测到同一目录的“创建”事件,就会导致重复记录。 解决方法 :在向 pending.json 追加新条目之前,先检查队列中是否已存在相同的 srcPath 。若有,直接跳过,不重复添加。这样即使链接目录被误触创建事件,也不会污染队列,同时也避免了后续转移脚本重复处理。 转移脚本与队列处理 监控是持续运行的,迁移则是定期手动触发(比如一个月或半年一次)。转移脚本读取 pending.json ,把存档从 AppData 搬走,原地建符号链接。 1. 转移脚本设计要点 从 pending.json 读取待处理项。 对每一项,先确定目标目录名。优先使用手动填写的 remark ,否则从解码后的 exe 路径自动提取游戏文件夹名,若都失败则回退到原始目录名。 通过 robocopy 将源目录完整复制到 D:\GameSaves\目标名 。 复制成功后, 删除源目录 ,并在同一位置创建一个 目录链接 指向新路径。 将迁移关系记录到 Markdown 格式的日志文件 存档迁移记录.md 中。 处理成功的条目从队列移除,失败则保留,等待下次重试。 2. 几个关键设计 安全删除和链接创建 ,这是最容易翻车的环节,有两个点必须处理好: 复制前如果目标目录已存在 (比如之前迁移过但记录丢了),直接 robocopy 会合并文件,可能造成新旧存档混杂。必须先尝试删除已有目标目录,并 检查是否真的被删干净 ;若因文件占用无法完全删除,则中止本次操作,保留队列项。 复制后删除源目录时,同样可能因文件占用导致部分删除失败 。必须确认源目录已完全消失后,才能创建链接。否则残留目录加上失败的链接创建,会让游戏存档状态混乱。若删除失败,整个迁移视为未完成,保留在队列中,下次重试。 这些检查在脚本中都是以条件判断 + 日志记录的方式实现的,确保一定成功。 迁移记录以 Markdown 表格形式写入 存档迁移记录.md ,例如: 原 C 盘快捷方式名 实际存储位置 游戏/说明 praygame D:\GameSaves\祈愿游戏 praygame 游戏存档 rmmz-game D:\GameSaves\莉可的不可思议差事 莉可的不可思议差事 这样无论后续手动浏览还是用其他工具解析,都非常直观。 队列自动清理 :每处理完一批,脚本生成一个新的 JSON 数组,只包含失败的项,覆盖写回 pending.json 。成功的自动消失,不需要手动编辑。 设置开机自启 使用 Windows 任务计划程序保证脚本在每次登录时自动运行。 操作步骤 打开“任务计划程序” (可以 Win+R 输入 taskschd.msc )。 右侧点击 “创建任务” (不是“创建基本任务”)。 名称: GameSavesMonitor 配置: Windows 10 ,勾选 “使用最高权限运行” 。 触发器 → 新建: 开始任务: 登录时 特定用户:选择你的账户(如 DESKTOP-XXX\admin ) 高级设置: 延迟任务时间 30 秒 (给网络驱动器映射留出时间) 确保“已启用”被勾选。 操作 → 新建: 程序或脚本: powershell.exe 添加参数: -WindowStyle Hidden -ExecutionPolicy Bypass -File "D:\Scripts\Watch-GameSaves.ps1" 起始于(可选): D:\Scripts 条件 :建议取消“只有在计算机使用交流电源时才启动此任务”(笔记本)。 设置 :勾选“如果任务失败,按以下频率重新启动”(间隔 1 分钟,最多 3 次)。 确定保存。 验证自启是否生效 重启电脑后登录, Win+R 输入 taskschd.msc 查看 显示所有正在运行的任务 。 检查日志文件 D:\GameSaves\监控调试日志.txt ,应包含最新的启动时间戳。 总结 通过这套方案,无论游戏安装在本地还是 NAS,只要启动游戏产生配置文件夹,脚本就会自动记录存档路径和对应的游戏 exe 位置(Base64 编码),并利用任务计划程序实现开机自启,再配合手动或自动迁移脚本,基本可以保证AppData较为干净。 由于所有操作都在 AppData 内进行(删除、创建链接), 直接贴出完整脚本容易导致佬们在不理解的情况下误操作,造成数据丢失 。因此本文只讲逻辑和关键点,佬们可以根据以上思路自行编写,或让 AI 辅助生成。真有需要的佬可以私信我,如果对某一块的实现细节感兴趣,也欢迎留言交流。 2 个帖子 - 2 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 20:42:06+08:00 · tech

前言 鉴于前阵子租房跑断腿,提供一些可参考的大学生找房源指南,小区我这没有,不纳入讨论范围 环境 某个山脚,前不着村后不着店,方圆几里就这所学校,旁边有一个村有很多自建房,有公寓(也是自建房改的) 仅供广东学校在山里头的大学生们参考!!! 放一下我们这里的(广州) 形式 价格 房型 公寓 1k+/月 一室+独卫 自建房 600-800/月 一室+独卫(+一厅) 如果是二房东,下面的只有一室+独卫, 一房东可以在差不多的价格多带厅 很明显,如果有钱就果断公寓,随时有房源,但是主包只建议: 自建房一房东 学校旁边村民自建房绝大部分联系方式能找到都是二房东 二房东普遍比一房东贵不少 比如我这同样差不多的地方,二房东和一房东都是600一个月的房子,二房东的一室和破旧的独立卫浴,一房东包家具一室一厅带独卫采光好,明显都会选后者 辨别二房东一房东 概念 差异 表现形式(刻板印象) 如何分辨(最简单粗暴) 一房东 房子的主人 随机 朋友圈发的是生活 二房东 租一房东的整栋房子进行装修转租 头像写着整栋包租,名字带着电话号码 朋友圈清一色各种房招租 虽然二房东比公寓价格便宜,但是二房东水太深(串串房,违约踢人),还是尽量找一房东 联系自建房房东 从1-5评级,越久越难数字越大 方法 时间成本 难度 评价 推荐指数 菜市场 2 3 如果学校旁边没有菜市场直接pass,对社恐不友好 社交媒体 3 1 社恐友好,时间花费相对久,看社交媒体有没有人看到,最好就发校园墙 朋友 2 2 最快最直接,问师兄师姐,吃社交 路边电话 1 1 路边租房电话一打基本都有,都是二房东 水电 注意商水商电还是民水民电,和学校里面的价格差多少,相差不大可以接受就行 如果配套家具,家具能耗等级(重点看空调) 注意,无论是哪种,假设大三要出去住,大二下5月份就应该找 5月份大部分都毕业退租,这时候好房源最多,最好是找师兄师姐要得一房东,二房东如果干的久的话口碑可以的话可以考虑一下,相对来说一房东没有什么套路,二房东价格会偏贵,但是也比公寓便宜 最后,无论是一房东还是二房东,合适自己的最好,无论各位出于什么目的出去住,祝大家早日找到梦中情房 佬友补充: cofish: 这里我再贴一个可能会用得上的网站,内容比较泛 《城市租房生存指南》 2 个帖子 - 2 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 15:41:32+08:00 · tech

前言 前面我们实现了一个 配合xray内核 reality协议 的 极简翻墙客户端(壳) MDPC-my-dream-proxy-client 如果我们想 配合 Hysteria 内核呢? (只为了简单演示, 所以只处理自签证书的情况) 分析 根据my-dream-proxy-client项目(下称MDPC)的设计, MDPC的配置文件参数为: listen: port: files-dir: core-start: core-test: log: 我们可以填上 hy2 对应的信息, 如: listen: "127.0.0.1" port: "18180" files-dir: "./bin/hy2/" core-start: "bin/hy2/hysteria client -c bin/hy2/config.yaml" core-test: "" log: "" 这样后端就好了. 是不是很简单! 接下来就是创造前端的HTML, 用来生成hy2客户端配置文件的yaml文本 可以先从简单的YAML文本编辑框作为基础功能. 然后再加表单. 开发过程 hermes 对接 mimo-v2.5-pro 基于 极简翻墙客户端(壳) 开发 配合 Hysteria 内核 支持Hysteria2协议 自签证书指定证书指纹pinSHA256 Github G站/crazypeace/my-dream-proxy-client 使用方法 见项目 README.md G站/crazypeace/my-dream-proxy-client/blob/main/README.md#my-dream-proxy-client-使用手册-配合hysteria内核 ======== 后记 本次开发由 hermes 对接 mimo-v2.5-pro 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 01:29:45+08:00 · tech

前言+思路来源 昨天我看论文的时候,看到一个很有意思的概念:“元编程”。其含义大概就是opus等处理完全没见过的编码语言问题时,会先将问题转化成python等他熟悉的语言脚本编写问题。然后再用脚本输出答案,而不是直接去编码,大大提高了正确率。 我就在想,对于ai来说,复杂任务的分析,是不是可以参考“元编程”的概念,再结合残差的先做一个基线,再在此基础上慢慢调优的想法,做一个复杂任务分析流程。 整体思路与实现的一些关键 先让ai将复杂问题转化成已知领域的问题,然后做一个基线的版本,再在此基础上调优,最后达到可交付版本的水准。 这样的话,也可以大幅度减少复杂任务分析时token的用量,即仅在一些关键节点时使用高性能模型,其他时候可用低性能模型。 我写了执行分工和任务等级判定模块,各位佬可以根据需求来写,包括如何判断等。 我是用的deepseek-v4-pro,所以我写的是一般都用思考等级“high”正常处理,仅在关键时刻用QQ发信息给我说要调“max”来进行更为复杂的处理。各位佬可以用不同的模型,我也测了用deepseek-v4-flash来处理一般问题,在复杂的时候提醒我用/model来手动切,效果也不错(我主要是嫌麻烦再加上deepseek真的便宜吧) 整体优化与规范化我让gpt-5.5帮我做的,skill文件分享在这里,各位佬根据需要来取,我的Agent是hermes的Agent,各位佬如果用的是别的Agent还请优化一下做个适配以后再用。 我没什么工程的经验,所以可能还有很多可以优化的地方,还请各位佬看看以后觉得有问题或者有可以优化的点的话还请告诉我,我会尽快去改的。 complex-task-protocol-v5.0.0-final.zip (4.3 KB) 笔者碎碎念 哦我的上帝,这deepseek的api也太便宜了,真的还有更有性价比的模型吗 参考论文: Frontier Coding Agents Use Metaprogramming to Adapt to Unfamiliar Programming Languages (arXiv:2606.10933) Deep Residual Learning for Image Recognition (arXiv:1512.03385) 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-10 19:06:09+08:00 · tech

前言:23年在郑州买了套房子,当时离职了不能用公积金贷款,所以用的商贷 26年五一前后将商贷转为郑州公积金贷款了,郑州公积金说上海的基数也能贷,但是我发现上海公积金我没办法按照还房贷进行提取啊。 PS: 郑州公积金已放款,但是不知道啥时候还第一期(5.20放款的),郑好办也都是郑州本地公积金账户信息的业务,除了贷款合同号,其他都显示未查询到本地公积金账户信息不给看 目前我还在上海在职。只是想提出来提前还公积金贷款少还点利息。而且提前还公积金贷款我也不知道在哪里,感觉像个黑盒,弱小无助 购买自住住房提取是 贷前提取 偿还购房贷款本息是 上海本地公积金贷款 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-10 10:25:25+08:00 · tech

前言 你可能在使用一个没有可用的翻墙客户端的平台. 你可能觉得目前能找到的翻墙客户端太大, 太笨重了, 你用不到那么多功能, 用不到那么多协议. 你可能看到了某个翻墙内核新出了一个协议, 而你手里的翻墙客户端还没有支持. 你可能就是手痒, 想自己搓轮子. 那么你可以做一个你自己的 翻墙客户端 思路 考虑到翻墙内核都是用go语言, 那么我们的翻墙客户端也用go. 这样, 内核能跑的平台, 客户端也能跑. 客户端的GUI界面部分, 考虑到覆盖尽量广的平台, 以及方便用户自己修改调整界面元素, 用HTML. 探索 以 xray 翻墙内核 + reality协议 为例 启动一个hermes, 对接 mimo-v2.5. 设计工作从这样的对话开启 我们来分析一个翻墙客户端(壳)的设计方案. 基于xray内核 考虑到覆盖尽可能广的平台, 翻墙客户端的后端基于 go 语言 考虑到方便用户自定义界面, 翻墙客户端的界面基于 HTML 你觉得如何? 很多细节和反复拉扯的部分在此省略. 只记录一些最终保留的重要设计思路 前后端功能设计 后端只负责替换配置文件 和 启/停翻墙内核 前端将配置文件的全量文本发给后端 前后端API设计 配置文件操作 — /api/files GET /api/files GET /api/files/{filename} PUT /api/files/{filename} DELETE /api/files/{filename} 进程操作 — /api/core GET /api/core/status POST /api/core/start POST /api/core/stop POST /api/core/test 设计前端时, 为了简化, 预设以下一些约束条件 后端的配置文件只会有这一些, 只会少, 不会多. 01-log.json # log 02-dns.json # dns 配置 03-router.json # routing rules 04-inbounds.json # 入站监听 05-outbounds.json # 出站代理 06-api.json # commander API 只实现最基本的核心功能作为演示, 只需要使用这些API GET /api/files/{filename} → { content } PUT /api/files/{filename} ← { content } (创建或替换) POST /api/xray/start POST /api/xray/stop 前端HTML的使用方式 后端不提供HTTP文件路由 前端HTML文件可以由单独的HTTP服务来支撑, 如 python -m http.server 前端HTML文件也可以直接用浏览器打开 前端HTML页面思路 前端为每个配置文件生成一个HTML页面文件 01-log.json 02-dns.json 03-router.json 04-inbounds.json 05-outbounds.json 06-api.json 前端的页面设计 对于不是 outbound 的页面, 只有直接编辑JSON 的功能, 没有表单 所以它们应该是几乎一样, 只有文件名不一样. 前端outbound页面的设计 转JSON • 行为: 表单 → 生成 JSON → 填入下方 JSON 编辑器(不保存) 直接保存 • 行为: 表单 → 生成 JSON → 填入下方 JSON 编辑器 → 发送给后端 保存 • 行为: JSON 编辑器的内容 → 发送给后端 后端设计1个yaml格式的配置文件 listen: 127.0.0.1 port: 18080 files-dir: ./bin/xray/ core-start: “./bin/xray/xray run -confdir ./bin/xray/” core-test: “./bin/xray/xray run -confdir ./bin/xray/ -test” log: “” 上传 Github G站/crazypeace/my-dream-proxy-client 对, 我取了一个特别的名字 my-dream-proxy-client 但其实功能特别简陋, 只是演示了最基本的工作原理. 哈哈! 使用方法 见 Github 项目 README.md G站/crazypeace/my-dream-proxy-client/blob/main/README.md#my-dream-proxy-client-使用手册-配合xray内核 具体开发过程 hermes 对接 mimo-v2.5 开发翻墙客户端(壳) 基于 xray 内核 reality 协议 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-09 21:06:44+08:00 · tech

前言 最近我在开发一个基于 Plasmo 的 Chrome MV3 浏览器扩展,项目主要用于统一管理 ChatGPT、Claude 等 AI 平台的对话记录,支持账号同步、搜索、收藏、标签、批量操作等功能。 随着功能逐渐完善,扩展里出现了大量 UI 文案、提示信息、错误信息。如果这些文本全部硬编码在组件里,后续维护会非常麻烦: 想支持英文、中文等多语言时,需要到处改代码; popup、content script、background 里都有文案,容易遗漏; Chrome 扩展本身也有名称、描述等 manifest 文案,也需要国际化; 文案带变量时,比如“已选中 5 项”,如果手动拼接,会不利于多语言适配。 因此,我最终使用 Chrome 扩展原生提供的 chrome.i18n API,再结合 Plasmo 的目录约定,给项目做了一套轻量、简单、够用的国际化方案。 本文就结合我的项目实践,介绍如何在 Plasmo 浏览器扩展中实现 i18n。 一、项目技术栈 我的项目是一个 Chrome MV3 扩展,主要技术栈如下: Plasmo React TypeScript Tailwind CSS Chrome Extension Manifest V3 项目结构比较简单,所有源文件都放在项目根目录,没有额外的 src 目录。 核心文件大致如下: my-first-extension/ ├── popup.tsx ├── content.ts ├── background.ts ├── logic.ts ├── db.ts ├── utils/ │ └── i18n.ts ├── locales/ │ ├── en/ │ │ └── messages.json │ └── zh_CN/ │ └── messages.json ├── package.json └── ... 其中和国际化相关的主要是: utils/i18n.ts locales/en/messages.json locales/zh_CN/messages.json package.json 二、Plasmo 项目中的语言包目录 在 Chrome 扩展规范中,最终构建产物里通常会有 _locales 目录,例如: _locales/ ├── en/ │ └── messages.json └── zh_CN/ └── messages.json 而在 Plasmo 项目开发阶段,我们可以直接在项目中创建: locales/ ├── en/ │ └── messages.json └── zh_CN/ └── messages.json Plasmo 构建时会处理这些语言资源,让它们符合 Chrome Extension 的国际化规范。 我的项目里目前支持两种语言: locales/en/messages.json locales/zh_CN/messages.json 其中: en 是英文; zh_CN 是简体中文。 三、在 manifest 中配置默认语言 Chrome 扩展要启用国际化,必须在 manifest 中声明 default_locale 。 在 Plasmo 项目里,可以直接在 package.json 的 manifest 字段里配置: { "manifest": { "default_locale": "en", "permissions": [ "storage", "alarms" ], "host_permissions": [ "https://chatgpt.com/*", "https://claude.ai/*" ] } } 这里我把默认语言设置为英文: "default_locale": "en" 这意味着如果用户当前浏览器语言没有对应的语言包,Chrome 会回退使用英文语言包。 四、扩展名称和描述的国际化 浏览器扩展的名称、描述也可以使用 Chrome i18n 的占位符语法。 我的 package.json 中这样写: { "name": "multi-ai-conversation-manager", "displayName": "__MSG_extName__", "description": "__MSG_extDescription__" } 这里的重点是: "displayName": "__MSG_extName__", "description": "__MSG_extDescription__" __MSG_xxx__ 是 Chrome 扩展国际化的特殊语法。 例如: __MSG_extName__ 会去当前语言包的 messages.json 中查找: { "extName": { "message": "ChatGPT & Claude AI Conversation Manager" } } 中文语言包中对应的是: { "extName": { "message": "ChatGPT、Claude AI 对话管理器" } } 这样一来,扩展在 Chrome 扩展管理页、商店信息或者 manifest 中展示时,就能根据用户浏览器语言自动切换名称和描述。 五、messages.json 的基本格式 Chrome 扩展的语言文件必须叫做 messages.json 。 基本格式如下: { "key": { "message": "具体文案" } } 比如英文语言包: { "account_management": { "message": "Account Management" }, "account_add": { "message": "Add Account" }, "btn_confirm": { "message": "Confirm" }, "btn_cancel": { "message": "Cancel" } } 中文语言包: { "account_management": { "message": "账号管理" }, "account_add": { "message": "添加账号" }, "btn_confirm": { "message": "确认" }, "btn_cancel": { "message": "取消" } } 这里需要注意: 不同语言包里的 key 要保持一致。 也就是说,英文里有: "account_add" 中文里也必须有: "account_add" 否则运行时调用这个 key 时,某些语言环境下就可能取不到翻译。 六、封装一个统一的 t 函数 虽然可以在代码里直接写: chrome.i18n.getMessage("btn_confirm") 但如果项目中大量使用这个 API,会有几个问题: 写起来比较长; 后续如果想增加 fallback 逻辑,需要到处改; popup、content script、background 都会重复使用; 不方便统一处理参数替换。 所以我在项目中封装了一个简单的工具函数。 文件位置: utils/i18n.ts 代码如下: /** * Chrome 扩展国际化工具函数 * 封装 chrome.i18n API,提供类型安全的文本获取方法 */ /** * 获取国际化文本 * @param key - messages.json 中定义的 key * @param substitutions - 可选的替换参数,字符串或字符串数组 * @returns 翻译后的文本,如果 key 不存在则返回 key 本身 */ export function t(key: string, substitutions?: string | string[]): string { return chrome.i18n.getMessage(key, substitutions) || key } 这个函数做了两件事: 第一,简化调用: t("btn_confirm") 比下面这样更简洁: chrome.i18n.getMessage("btn_confirm") 第二,增加 fallback: return chrome.i18n.getMessage(key, substitutions) || key 如果某个 key 没有找到,直接返回 key 本身。这样至少页面不会显示空字符串,调试时也很容易发现哪个 key 没配置。 七、在 React Popup 页面中使用 i18n 我的扩展主要 UI 在 popup.tsx 中,它是一个 React 页面。 首先引入工具函数: import { t } from "./utils/i18n" 然后就可以在 JSX 中使用: <button> {t("account_add")} </button> 或者用于错误提示: return ( <div className="p-4 text-red-500 text-sm"> {t("errorBoundaryMessage")} </div> ) 对应的英文语言包: { "errorBoundaryMessage": { "message": "An error occurred. Please close and reopen the extension" } } 对应的中文语言包: { "errorBoundaryMessage": { "message": "出现错误,请关闭后重新打开扩展" } } 这样,当用户浏览器语言是中文时,会显示中文;如果是英文环境,则显示英文。 八、在 Content Script 中使用 i18n 浏览器扩展不仅 popup 页面需要国际化,content script 也经常需要显示文案。 我的项目中, content.ts 会注入到 ChatGPT 或 Claude 页面中,用于检测当前登录账号。如果发现新账号,会在页面右下角显示一个提示卡片,引导用户同步账号。 同样先引入: import { t } from "./utils/i18n" 然后在创建 DOM 时使用: card.innerHTML = ` <button class="close-btn" aria-label="${t('content_closeAriaLabel')}">×</button> <div class="header"> <div class="text-content"> <h3>${t('content_newAccountTitle')}</h3> <p>${t('content_newAccountDesc', platformName)}</p> </div> </div> <div class="actions"> <button class="btn-ignore">${t('content_btnIgnore')}</button> <button class="btn-add">${t('content_btnSync')}</button> </div> ` 这里有一个带变量的文案: t("content_newAccountDesc", platformName) 比如英文里可能是: { "content_newAccountDesc": { "message": "A new $PLATFORM$ account was detected. Do you want to sync it now?", "placeholders": { "platform": { "content": "$1", "example": "ChatGPT" } } } } 中文里可以是: { "content_newAccountDesc": { "message": "检测到新的 $PLATFORM$ 账号,是否立即同步?", "placeholders": { "platform": { "content": "$1", "example": "ChatGPT" } } } } 这样在代码里只需要传入平台名称: t("content_newAccountDesc", "ChatGPT") 最终 Chrome 会自动把 $1 对应的内容替换进去。 九、在 Background 和业务逻辑中使用 i18n 除了 UI,后台逻辑里也会产生提示信息或错误信息。 比如消息处理器、同步逻辑、错误封装中,也可以统一使用: import { t } from "~utils/i18n" 或: import { t } from "./utils/i18n" 然后: throw new Error(t("error_accountMismatch")) 或者: return { success: false, error: t("error_syncFailed") } 这样有一个好处: 前端展示的错误信息和后台返回的错误信息,都可以使用同一套语言包管理。 对于浏览器扩展来说,popup、content script、background 是不同运行环境,如果不统一管理文案,后期维护会很痛苦。 十、带参数文案的写法 国际化里最常见的问题之一,就是文案里带变量。 比如: 已选中 5 项 不能简单写成: "已选中 " + count + " 项" 因为不同语言的语序可能不一样。 正确做法是放到语言包中: 英文: { "batch_selectedCount": { "message": "$COUNT$ items selected", "placeholders": { "count": { "content": "$1", "example": "5" } } } } 中文: { "batch_selectedCount": { "message": "已选中 $COUNT$ 项", "placeholders": { "count": { "content": "$1", "example": "5" } } } } 代码中调用: t("batch_selectedCount", String(selectedCount)) 如果有多个参数,也可以传数组: t("error_accountMismatch", [oldEmail, newEmail]) 语言包中可以使用: { "error_accountMismatch": { "message": "账号不匹配:当前账号是 $CURRENT$,目标账号是 $TARGET$", "placeholders": { "current": { "content": "$1", "example": "[email protected]" }, "target": { "content": "$2", "example": "[email protected]" } } } } 十一、推荐的 key 命名方式 随着项目变大,语言包会越来越长。如果 key 命名不规范,很容易混乱。 我在项目中采用了按业务模块前缀命名的方式,例如: theme_light theme_dark theme_system account_management account_add account_delete account_sync batch_manage batch_addTag batch_removeTag batch_selectedCount tag_management tag_create tag_rename tag_delete conversation_notFound conversation_total conversation_copyLink content_newAccountTitle content_newAccountDesc content_btnIgnore content_btnSync errorBoundaryMessage error_syncFailed 这种命名方式有几个优点: 一眼能看出文案属于哪个模块; 搜索方便; 不容易和其他模块冲突; 语言包比较容易维护。 我个人不太建议全部写成非常短的 key,例如: title desc button message 因为项目一大,这些 key 很快就会失去语义。 十二、Chrome i18n 的语言选择机制 使用 chrome.i18n 后,不需要我们自己判断用户语言。 Chrome 会根据用户浏览器语言自动选择语言包。 比如项目里有: locales/en/messages.json locales/zh_CN/messages.json 如果用户浏览器语言是中文简体,Chrome 会优先使用: zh_CN 如果用户浏览器语言是英文,则使用: en 如果没有找到对应语言,会回退到 manifest 中配置的: "default_locale": "en" 所以在大多数情况下,我们不需要自己写: navigator.language 也不需要自己维护语言切换逻辑。 十三、Plasmo i18n 实现流程总结 整体流程可以总结为五步。 1. 创建语言包目录 locales/ ├── en/ │ └── messages.json └── zh_CN/ └── messages.json 2. 在 package.json 中配置默认语言 { "manifest": { "default_locale": "en" } } 3. 使用 __MSG_xxx__ 国际化扩展名称和描述 { "displayName": "__MSG_extName__", "description": "__MSG_extDescription__" } 4. 封装 i18n 工具函数 export function t(key: string, substitutions?: string | string[]): string { return chrome.i18n.getMessage(key, substitutions) || key } 5. 在 popup、content script、background 中统一调用 t("btn_confirm") t("batch_selectedCount", String(count)) t("content_newAccountDesc", platformName) 十四、这种方案的优点 我目前这个项目采用的是原生 chrome.i18n 方案,而不是引入 i18next 、 react-intl 之类的第三方库。 原因很简单:对于浏览器扩展来说,原生方案已经足够好用。 它的优点包括: 1. 不需要额外依赖 不需要安装额外 npm 包,减少 bundle 体积。 2. 和 Chrome 扩展天然集成 manifest 中的名称、描述都可以直接使用 __MSG_xxx__ 。 3. popup、content script、background 都能用 只要在扩展环境中,都可以调用: chrome.i18n.getMessage() 4. 构建简单 Plasmo 会处理扩展构建,不需要自己手动生成 _locales 。 5. 维护成本低 对于中小型浏览器扩展项目,这种方案非常轻量。 十五、需要注意的坑 1. 必须配置 default_locale 如果使用了语言包,但是 manifest 没有配置: "default_locale": "en" 扩展可能无法正确加载国际化资源。 2. key 必须在所有语言包中保持一致 比如英文有: "btn_confirm" 中文也应该有: "btn_confirm" 否则在某些语言下会取不到翻译。 3. messages.json 格式不能随便写 Chrome i18n 不是普通 JSON 字典,不能写成: { "btn_confirm": "Confirm" } 必须写成: { "btn_confirm": { "message": "Confirm" } } 4. 占位符要用 $1 、 $2 比如: { "conversation_total": { "message": "$COUNT$ conversations", "placeholders": { "count": { "content": "$1", "example": "10" } } } } 代码中: t("conversation_total", "10") 5. 不建议在代码里拼接多语言句子 不推荐: t("selected") + count + t("items") 推荐: t("batch_selectedCount", String(count)) 因为不同语言的语序可能不一样。 6. content script 中使用 innerHTML 时要注意安全 如果语言包内容完全由开发者自己维护,风险较小。但如果文案来自用户输入,就不要直接拼进 innerHTML 。 我的项目中的语言包是静态文件,由开发者维护,所以可以用于构造提示卡片。但如果要插入用户输入,最好使用 textContent 或做好转义。 十六、适合继续优化的方向 目前这个方案已经可以满足我的项目需求,不过后续还可以继续优化。 1. 给 key 增加 TypeScript 类型约束 现在的 t 函数是: export function t(key: string, substitutions?: string | string[]): string 也就是说 key 是普通字符串。 如果写错了: t("btn_confim") TypeScript 不会报错,只有运行时才会发现。 后续可以自动从 messages.json 生成类型,例如: type I18nKey = | "btn_confirm" | "btn_cancel" | "account_add" | "account_delete" 然后改成: export function t(key: I18nKey, substitutions?: string | string[]): string { return chrome.i18n.getMessage(key, substitutions) || key } 这样可以在开发阶段提前发现 key 拼写错误。 2. 编写脚本检查多语言 key 是否一致 可以写一个 Node.js 脚本,对比: locales/en/messages.json locales/zh_CN/messages.json 检查两个文件的 key 是否完全一致。 比如: en 中有但 zh_CN 中没有 zh_CN 中有但 en 中没有 这对项目变大后非常有用。 3. 拆分语言包 当 messages.json 变得非常大时,可以按模块维护源文件,例如: i18n-source/ ├── account.json ├── batch.json ├── tag.json ├── content.json └── error.json 然后通过脚本合并生成最终的: locales/en/messages.json locales/zh_CN/messages.json 不过对于大多数浏览器扩展项目,一个 messages.json 也完全够用。 十七、完整示例 下面给一个简化版完整示例。 package.json { "name": "multi-ai-conversation-manager", "displayName": "__MSG_extName__", "description": "__MSG_extDescription__", "manifest": { "default_locale": "en", "permissions": [ "storage", "alarms" ] } } locales/en/messages.json { "extName": { "message": "ChatGPT & Claude AI Conversation Manager" }, "extDescription": { "message": "Unified management for ChatGPT and Claude conversations" }, "btn_confirm": { "message": "Confirm" }, "btn_cancel": { "message": "Cancel" }, "batch_selectedCount": { "message": "$COUNT$ items selected", "placeholders": { "count": { "content": "$1", "example": "5" } } } } locales/zh_CN/messages.json { "extName": { "message": "ChatGPT、Claude AI 对话管理器" }, "extDescription": { "message": "统一管理 ChatGPT、Claude 平台的 AI 对话" }, "btn_confirm": { "message": "确认" }, "btn_cancel": { "message": "取消" }, "batch_selectedCount": { "message": "已选中 $COUNT$ 项", "placeholders": { "count": { "content": "$1", "example": "5" } } } } utils/i18n.ts export function t(key: string, substitutions?: string | string[]): string { return chrome.i18n.getMessage(key, substitutions) || key } popup.tsx import { t } from "./utils/i18n" export default function Popup() { const selectedCount = 5 return ( <div> <button>{t("btn_confirm")}</button> <button>{t("btn_cancel")}</button> <p>{t("batch_selectedCount", String(selectedCount))}</p> </div> ) } 结语 在 Plasmo 浏览器扩展项目中实现 i18n,并不一定要引入复杂的国际化框架。 对于大多数 Chrome 扩展来说,直接使用浏览器原生的 chrome.i18n API 就已经足够: manifest 文案使用 __MSG_xxx__ ; 页面和脚本中使用 chrome.i18n.getMessage() ; 封装一个简单的 t() 函数; 使用 locales/en/messages.json 、 locales/zh_CN/messages.json 管理语言包; 对变量文案使用 placeholders。 这种方式简单、轻量、和浏览器扩展生态天然兼容,非常适合 Plasmo 架构下的扩展开发。 我目前的项目就是采用这种方案,同时覆盖了 popup 页面、content script、background 消息处理和错误提示。整体使用下来,维护成本低,也方便后续继续增加更多语言支持。 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-09 12:03:22+08:00 · tech

Ubuntu搭建PX4无人机仿真环境 前言 本教程基于 ROS2 ,在搭建之前,需要把 ROS2、QGC 等基础环境安装配置完成。 小白必看 : 本次安装是以 px4 v1.14.0 为例,不适用之前的 px4 版本。(支持 Ubuntu 22.04 ROS2 Humble PX4v1.14.0+,Ubuntu 24.04 ROS2 Jazzy PX4v1.16.0+) 我的配置如下: 虚拟机 Ubuntu 22.04 (运行内存 4G、硬盘内存 80G) 、ROS2 Humble 、QGC v4.4.4 禁止无脑复制:首先大部分命令都有先后顺序,就是要上一个命令执行成下一个才能执行成功,对于不熟悉的命令可以直接复制问 AI 这样还能顺带学习学习;其次在有些情况下多个命令一起执行会出现奇怪的错误,而且有些命令旁边有注释,有时候复制上去可能也会出现错误。 建议使用虚拟机:虽然虚拟机得性能有限,但是对于新手入门阶段是完全够用了,后续大型仿真再用双系统也比较熟悉了。而且虚拟机有一个快照功能,可以保存当前虚拟机的状态 (相当于存档),这样如果后面出了问题要重新搭建环境,可以用快照回到上一个状态,这样就不用重头开始(我一般是安装好 ROS 拍一个、安装好 mavros 拍一个…)。 关于网络:由于一些懂得都得的原因,再加上每个人的网络环境不同,我们下载 GitHub上的资源、安装 Python 包、apt 安装包等会时快时慢,所以大家会换源,比如一开始的换 apt 软件安装源等。但是下载资源一定要耐心,如果是网络问题,可以尝试多执行几次命令,而且有些我也给了相应的解决方案。 1. 准备 1.1 下载源码 方式一: 从 Github 上下载,但是比较考验个人网速 sudo apt install git git clone https://github.com/PX4/PX4-Autopilot.git # 下载源码 mv PX4-Autopilot PX4_Firmware # 更改目录名 cd PX4_Firmware git checkout v1.14.0 # 切换版本 git submodule update --init --recursive # 更新下载子模块 方式二: 从提供的网盘里下,或者从QQ群(961297255)里下载 链接: 百度网盘 请输入提取码 提取码: rbrk 下载后解压,然后执行下面命令: cd PX4_Firmware wget https://gitee.com/tyx6/mytools/raw/main/px4/set_executable.sh chmod +x set_executable.sh ./set_executable.sh 1.2 安装依赖 sudo apt install ros-dev-tools cd ~/PX4_Firmware/Tools/setup 修改文件并备份 (就把 pip 安装源换成了清华源),这一步是可做可不做,如果觉得python 包下载太慢了,可以试试 sed -i.bak 's|\/requirements.txt|\/requirements.txt -i https:\/\/pypi.tuna.tsinghua.edu.cn\/simple|' ./ubuntu.sh chmod +x ubuntu.sh ./ubuntu.sh --no-nuttx --no-sim-tools # 这是官方提供的脚本 有两个可选参数 # --no-sim-tools 不安装仿真环境 # --no-nuttx 不安装交叉编译环境 #(如果需要自己编译飞控固件,烧录到飞控中,那就需要交叉编译环境) # 脚本执行时间,跟个人网络有关,可能需要一段时间 重启电脑 1.3 安装 Gazebo Gazebo是一款强大的3D仿真软件,主要用于机器人学的研究和开发。它提供了高度逼真的物理模拟环境,包括动力学、碰撞检测、传感器模型以及与真实世界相似的物理属性如重力、摩擦力等。Gazebo可以模拟各种类型的机器人,从移动机器人、无人机到机械臂,甚至可以模拟整个城市环境。 根据上图说明,Gazebo 官方做了更新将之前的 Gazebo Ignition 命名为 Gazebo,以前的 Gazebo 现在叫 Gazebo Classic ,而 Ubuntu 22.04 及以后的版本就支持 Gazebo (Gazebo Ignition) 。 因为几年前官方对 Gazebo 进行了重大架构变更,然后将变更后的版本叫 Gazebo Ignition,旧的仍叫 Gazebo。后面Gazebo Ignition 逐渐成熟并经过使用验证,所以他结束了旧的 Gazebo ( Gazebo 11 是 Gazebo Classic 的最后一个版本,支持到 2025 年 ),并重新对它们命了名。 cd ~/PX4_Firmware/Tools/setup ./ubuntu.sh --no-nuttx # 这一步会安装仿真环境,包括 gazebo # 脚本执行时间,跟个人网络有关,可能需要一段时间 再运行一下 gazebo : gz sim 2. 安装 Micro XRCE-DDS Agent 在 ROS2 中 PX4 使用 uXRCE-DDS 中间件来允许在配套计算机上发布和订阅 uORB 消息,就像它们是 ROS2 话题一样。这提供了 PX4 和 ROS2 之间快速可靠的集成,并使 ROS2 应用程序更容易获取车辆信息和发送命令,如上图所示。 这应该跟 ROS2 将中间件改为 DDS 有关,但是官方又说明了在 ROS2 中仍可以使用 MAVROS,可能官方觉得在 ROS2 中 Micro XRCE-DDS Agent 更好用 ,也可能是因为 MAVLink 是外部通信协议,uORB 是内部通信协议。 注:如果想用 Mavros 请参考这篇文章 ubuntu搭建PX4无人机仿真环境(2) —— MAVROS安装(适用于ROS1、ROS2)-CSDN博客 使用方法跟 ROS1 类似,这里不做描述。 Micro XRCE-DDS Agent 与 MAVROS 的对比(来自豆包AI,仅供参考) MAVROS 是 ROS(机器人操作系统)生态中连接 MAVLink 协议设备(如 PX4、ArduPilot 飞控)的主流工具,本质是 ROS 与 MAVLink 的桥梁。二者的核心差异体现在如下方面: 维度 Micro XRCE-DDS Agent MAVROS 核心定位 资源受限设备与 DDS 分布式网络的通信代理,支持多设备协同 ROS 与 MAVLink 设备(如飞控)的通信桥梁,专注无人机控制 生态兼容性 兼容 DDS 生态(如 Fast DDS、Cyclone DDS),可与非 ROS 系统集成 强依赖 ROS 生态,仅支持 ROS 节点与 MAVLink 设备交互 资源占用 客户端(Client)极轻量(适合 MCU 等嵌入式设备),Agent 本身资源消耗中等 依赖 ROS 节点和进程,资源占用较高(不适合极简嵌入式环境) 灵活性 支持自定义数据类型,可灵活扩展消息结构,适应复杂分布式场景 消息类型固定为 MAVLink 标准消息,扩展需修改协议或自定义消息 实时性 原生支持实时性配置(通过 DDS QoS),适合低延迟场景 实时性依赖 ROS 调度,默认配置下实时性中等 适用场景 无人机集群协同、多传感器分布式融合、跨平台设备互联 单无人机与 ROS 系统的通信(如地面站控制、数据日志、任务规划) 优点 1. 分布式架构,支持多设备协同; 2. 轻量级客户端适合嵌入式; 3. 可自定义消息,灵活性高; 4. 强实时性与 QoS 保障 1. 无缝集成 ROS 生态,开发便捷; 2. 成熟稳定,支持 MAVLink 全功能(控制、参数、日志等); 3. 社区活跃,问题易解决 缺点 1. 学习成本高(需理解 DDS 概念),目前资料相比于mavros少很多 ; 2. 与 ROS 集成需额外适配; 3. 对单设备简单通信场景略显复杂 1. 依赖 ROS,非 ROS 环境下使用不便,但非ROS环境也有其他基于mavlink的库可以使用 ; 2. 分布式多设备协同能力弱; 3. 资源占用较高,不适合极简嵌入式 下载源码: git clone -b v2.4.3 https://github.com/eProsima/Micro-XRCE-DDS-Agent.git 编译: cd Micro-XRCE-DDS-Agent mkdir build cd build cmake .. make # make 的时候还会下载代码,跟个人网速有有关,大概要10-20分钟 安装: sudo make install sudo ldconfig /usr/local/lib/ # 更新动态链接器的缓存 3. 编译 cd ~/PX4_Firmware make px4_sitl gz_x500 # 这步可能有点慢 出现这个表示编译成功 错误 :如果在虚拟机中可能遇到下面错误,这是由于在虚拟机设置中开启了 3D 图形加速,导致系统的 OpenGL 版本降低。 参考这个 Issue 中的解决方法,降低仿真使用的渲染引擎的版本 修改处大概在 73 行(PX4_Firmware/ROMFS/px4fmu_common/init.d-posix/px4-rc.simulator): sed -i 's/${gz_command} ${gz_sub_command} -g &/${gz_command} ${gz_sub_command} -g --render-engine ogre \&/' ~/PX4_Firmware/ROMFS/px4fmu_common/init.d-posix/px4-rc.simulator 错误 :如果编译过程中出现类似下面错误,应该是 gz_bridge 启动超时 INFO [gz_bridge] world: default, model name: x500_0, simulation model: x500 ERROR [gz_bridge] Service call timed out ERROR [gz_bridge] Task start failed (-1) ERROR [init] gz_bridge failed to start ERROR [px4] Startup script returned with return value: 256 参考下面链接中给出的解决方法 make px4_sitl gz_x500出错 - 哔哩哔哩 然后,再重新编译 4. 通信 打开一个终端,启动 MicroXRCEAgent: MicroXRCEAgent udp4 -p 8888 打开另一个终端,启动仿真: cd ~/PX4_Firmware make px4_sitl gz_x500 都启动后,可以看到通信成功 5. offboard 测试 创建工作空间: mkdir -p ~/ros2_ws/src 下载源码: cd ~/ros2_ws/src git clone https://github.com/PX4/px4_msgs.git git clone https://github.com/PX4/px4_ros_com.git 编译: cd ~/ros2_ws colcon build 更新环境: echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc source ~/.bashrc #使环境生效 测试: 先启动 QGC 地面站,然后执行下面命令,不然有可能无法起飞 终端一,启动 MicroXRCEAgent: MicroXRCEAgent udp4 -p 8888 终端二,启动仿真: cd ~/PX4_Firmware make px4_sitl gz_x500 终端三,启动官方 offboard 案例(上升5米): ros2 run px4_ros_com offboard_control 注:如果过了一段时间,无人机无法 offboard 起飞,程序都正常启动,这时可以尝试下面命令 cd ~/ros2_ws/src rm -f ./px4_msgs/msg/*.msg cp ~/PX4_Firmware/msg/*.msg ./px4_msgs/msg/ # rm -f ./px4_msgs/srv/*.srv # v1.15.0 之后 # cp ~/PX4_Firmware/srv/*.srv ./px4_msgs/srv/ # v1.15.0 之后 # cp ~/PX4_Firmware/msg/versioned/*.msg ./px4_msgs/msg/ # v1.16.0 之后 然后重新编译 source /opt/ros/humble/setup.bash cd ~/ros2_ws colcon build 编译成功后,记得 source 一下,再重新offboard测试 到这 PX4 无人机基本仿真环境就搭建完成了,大家可以基于此来拓展自己的仿真。 参考 PX4 ROS 2 User Guide PX4 documentation uXRCE-DDS PX4 Ubuntu Development Environment a-new-era-for-gazebo Unable to ros2 topic echo specific topics - PX4 Autopilot - Discussion Forum 如有其他问题,或者发现文章有错误,请在评论区留言 Keep learning! 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-09 11:09:43+08:00 · tech

前言 我们已经有了 从客户端查询证书计算pinSHA256的工具 进一步的, 可以在 v2rayN 中调用这个工具 那么, 如果机场提供了多于1条的hy2节点, 需要能批量处理. 面向GPT开发 Hermes 对接 mimo-v2.5-pro 回忆一下 在v2rayN 项目开发 “获取pinSHA256” 的开发过程. 接下来会在此基础上进一步开发 增强开发: 在v2rayN主窗口, 节点列表的右键菜单中, 添加一项 “获取pinSHA256” 支持批量选取多个节点, 右键菜单, “获取pinSHA256” 具体过程为: 批量多个节点, 依次处理, 每次处理1个节点: 节点信息中 传输层安全 是否为 tls 是, 继续; 否, 跳出; 跳过证书验证 (allowInsecure) 是否为 true 是, 继续; 否, 跳出; 调用 hy2-pin-tool 工具获取 pinSHA256, 并保存到节点信息中. Github G站/crazypeace/v2rayN/releases/tag/v7.22.5-pin-sha256 演示视频 v2rayN 节点列表 右键菜单 批量计算 Hysteria2 证书指纹 pinSHA256 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-09 08:59:40+08:00 · tech

前言 仅限荣耀手机用户 每天花10分钟差不多就能完成当天的所有任务,大概三天任务领取的会员时长就可以换一个月卡用了,还是很划算的 会员时长获取的大头来自下载任务,在下载APP后,在任务列表跳转到APP,然后15s左右就可以返回任务列表了,不用给下载的APP权限、登录啥的,直接跳转后手机放在那就行了,用完就直接卸载 对于连续两天浏览任务的APP,等第二天任务完成后再卸载。 一般每天都会有12个连续两天浏览APP的任务(第一天任务6个+第二天任务6个),以及6次单次下载浏览体验的APP任务,其他的基本都是看广告的任务,任务只有领取后才会显示下一个,如果自己的任务列表的任务数量达不到上边我说的那些,那就退出荣耀钱包重新进去就有了。 入口 荣耀钱包APP,消息中心可能会有入口,还有底部导航栏,如图 任务(时间折算为天) 连续体验应用第一天(每天体验15s):可领0.41天会员时长 连续体验应用第二天(每天体验15s):可领0.83天会员时长 单次体验应用(每次15s):每次可领0.5天会员时长 视频广告(15s):每次可领0.25天会员时常 浏览APP(10s):每次可领0.25天会员时常 每日任务组成 第一天: 连续体验应用第一天任务6次,共2.46天会员时长 单次体验应用6次,共3天会员时长 视频广告3次,共0.75天会员时长 浏览APP3次,共0.75天会员时长 总计:第一天获得6.96天会员时长 第二天以及后续: 连续体验应用第一天任务6次,共2.46天会员时长 连续体验应用第二天任务6次,共4.98天会员时长 单次体验应用6次,共3天会员时长 视频广告3次,共0.75天会员时长 浏览APP3次,共0.75天会员时长 总计:后续每天获得11.94天会员时长 可兑换会员以及时长 爱奇艺黄金会员月卡:30天会员时长 爱奇艺黄金会员年卡(缺货):288天会员时长 爱奇艺白金会员月卡:50天会员时长 爱奇艺黄金会员季卡(缺货):135天会员时长 哔哩哔哩会员月卡:30天会员时长 哔哩哔哩会员季卡:81天会员时长 哔哩哔哩会员年卡:360天会员时长 优酷视频会员月卡:30天会员时长 优酷视频会员季卡:81天会员时长 优酷视频会员年卡(缺货):288天会员时长 芒果TV会员周卡(缺货):7天会员时长 芒果TV会员月卡:30天会员时长 QQ音乐豪华绿钻周卡(缺货):7天会员时长 网易云音乐黑胶月卡:30天会员时长 喜马拉雅会员月卡:30天会员时长 4 个帖子 - 3 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-08 14:31:04+08:00 · tech

周末逛书店,翻开《反脆弱》,前言末尾里有一张很长的表格 —— “核心三元结构:在风险下的三类状态”。表格用三列:脆弱、强韧、反脆弱,把60多个维度并排放在一起:神话里的九头蛇和达摩克利斯之剑,硅谷的“快速失败”和银行体系,詹森不等式和期权交易等等…… 结构清晰,但每格只有几个字,有些“凸性、凹性、左偏、负面科学、杠铃模式”是没读完这本书的人大概率看不懂的概念,我隐约觉得这里面折叠了巨大的信息量。 我把这张表拍下来,让Sonnet识别整理成结构化数据(Markdown Table),然后让CC逐行去搜索整理:每个概念配一段解释、一条原文引用、一个来源链接。 强制使用Tavily技能搜索,每段原文引用都必须有搜索来的真实来源,不允许模型仅凭内部知识回答。 最终做成了一个可以逐行展开阅读的HTML页面,供佬友们查阅。 antifragile.24k.life 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-08 10:14:49+08:00 · tech

前言 最近要做了两套PPT, 都是用 codex+提示词+image2 直接生成一套PPT, 效果非常好. 然后最近也看到很多佬友在讨论codex做PPT的问题, 看了下目前佬友们的流程, 大多数即便用image2做, 最后还要转成可编辑的模式, 这种思路我非常不赞同, 在我看来非常落后了, 包括传统的html->svg->PPTX, 效果真的弱爆了. 我的思路大概是: 1. 生成/找一张底板 (母版) 2. codex根据论文亦或是PPT的信息源写好提示词模板 (固定部分 + 每页变化部分, 可以加入你需要插入的图, image2支持多图生1图) 3. codex用这些提示词+参考图批量用image2生成 4. 筛选满意的, 组装成 PPTX/PDF 直接image2出来就是成品. 不需要自己修改, 我也非常不建议自己去修改, 即便要改, 也是让codex用image2修改, image2支持edit. 效果 由于有些内容涉及隐私, 只能展示部分 第一套 第二套 第一步: 搞定底板 底板就是你 PPT 的模板背景 — 顶部装饰、底部装饰、配色风格. 中间留白给内容. 你可以: 让 image2 文生图直接生成一张模板 或者找一张你喜欢的 PPT 截图当底板 底板的核心 : 中间必须是大面积留白, 装饰元素集中在上下边缘. 生成底板时的提示词要写清楚: 比例 16:9, 具体配色, 顶部/底部各有什么元素, 中间必须空白, 风格关键词. 多生几张挑一张满意的. 参考 第二步: 提示词模板 (核心) 每页的提示词分成 5 个固定区块. 区块一: 底板约束 告诉 image2 哪些东西 绝对不能动 . 这是最重要的一块, 写得不具体底板就会被重画. 【统一底板约束, 每页必须严格遵守】 使用用户提供的 [你的风格] 16:9 4K 底板作为唯一母版。 上下区域保持完全不变: - 顶部: [把你底板顶部的每个元素都列出来, 比如: 左侧深蓝斜切区、图标、白色过渡、数字方块、右侧图标、横线] - 底部: [同理列出底部元素, 比如: 窄版装饰条、纹理、折线结构] - 底部条必须保持窄版高度, 禁止变厚、上移或占用中央内容区。 - 禁止重画、移动、放大、缩小、替换这些底板元素。 唯一允许变化的底板元素: [比如顶部数字方块的数字] 不要添加页码、日期、Logo、额外页脚文字。 中央白色内容区是唯一可编辑区域。 Image2 只负责排版, 不得自行改写内容为泛泛短句。 经验 : 底板元素描述得越具体, 保真度越高. “顶部有蓝色装饰” 不行, 要写 “顶部左侧深蓝电路纹斜切区域, 内含白色盾牌图标, 右侧有斜切过渡到白色背景”. 区块二: 视觉设计要求 不加这块, image2 会给你出纯文字列表, 丑到爆. 加了之后会做卡片、色带、标签这些设计元素: 可参考 【强视觉设计要求, 必须体现在画面中】 这不是普通文字页, 必须做成精修版汇报页。中央内容区要有设计感: 1. 主标题用大号深蓝, 左侧可加竖线装饰 2. 正文不要堆成项目符号列表, 排成 3-4 个信息卡片/分区条/标签 3. 每页至少 3 种视觉元素: 渐变卡片、细线分隔、编号圆点、图标标签、强调色词、结论色带、流程箭头等 4. 信息量足但高级: 字号大、行距舒适、重点醒目, 不能大片空白也不能太密 5. 风格: [你要的风格, 如: 学术/政府/科技/商务], 不要卡通不要花哨 6. 所有新增元素只放在中央白色内容区 区块三: 本页设置 (每页改) 【本页固定设置】 顶部数字方块显示: 01 本页主标题: [你这页的标题] 区块四: 本页内容 (每页改) 可参考 【需要排入中央白色内容区的完整文字】 - [第一条, 写完整的句子] - [第二条] - [第三条] - [第四条] 结论强调: [一句话结论] 关键 : 必须要写完整的内容, image2只负责排版, 具体的信息必须要codex根据你的论文亦或是其他材料给出具体每页需要展示的信息 区块五: 禁止项 【本页禁止项】 不要页码; 不要日期; 不要额外 Logo; 不要改动底板上下元素。 第三步: 生成 把底板图作为参考图传入, 提示词文件传入, image2 生图: 尺寸: 3840x2160 (4K, 投屏清晰) 质量: high 格式: png instructions 字段 (如果你的 API 需要): 写一句 “Use the input image as template, keep top and bottom bars identical, only change the central content area and chapter number.” 每页大概 30-60 秒出图. 不满意就多跑几张同一页, 挑好看的. Prompt is all you need. 9 个帖子 - 4 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-07 16:20:27+08:00 · tech

前言 我们已经实现了一个 hysteria2-pinSHA256-tool 小工具来查询 hysteria2节点自签证书的pinSHA256 现在我们将这个算法合并到 v2rayN 项目 面向GPT开发 Hermes 对接 mimo-v2.5 我要从客户端侧 得到 自签证书的 hysteria2 节点的 pinSHA256 核心算法参考 G站/crazypeace/hysteria2-pinSHA256-tool/ v2rayN 的功能入口 我想设计在附件图片中红色文本框指示的位置 一开始用的方案是调用QUIC库. 进展不顺利, 在不同的平台, 使用的QUIC库不一样. linux 用libmsquic, win 用 msquic.dll 不排除我用的AI比较蠢的原因. 我只是实事求是的描述我遇到的困难. 后来采用的方案是, 直接调用 hysteria2-pinSHA256-tool 工具 的可执行文件. Github G站/crazypeace/v2rayN/releases/tag/v7.22.5-pin-tool 操作演示 在 v2rayN-v7 中 "获取pinSHA256"按钮 调用hysteria2-pinSHA256-tool工具 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-05 11:29:56+08:00 · tech

前言 自己尝试改了一位佬友的Chrome插件,用AI加了一些新的功能: 公益站名称显示、点击直达签到页面、余额显示…… 插件支持NewAPI、Sub2API等各类型公益站, 支持L站 OAuth 自动登录 ,测试下来基本上满足自己的需求了,不敢私藏发出来给佬友们一起享用,解放每日签到的双手~! 0基础编程的设计师,还望各位大佬轻喷,欢迎批评指正~ 安装 下载: api-auto-chekin.zip (48.9 KB) 打开 Chrome,进入 chrome://extensions/ 。 开启右上角“开发者模式”。 点击“加载已解压的扩展程序”。 选择项目中的 chrome-extension 文件夹。 使用 添加站点签到页 点击扩展图标。 点击“添加站点签到页”。 输入签到页链接,例如 c.com/console/personal 或 https://c.com/console/personal 。 如果该站点只需要每天访问页面,勾选“仅访问”。 点击“添加”。 执行签到 点击“立即签到”可手动执行。 默认每天 09:00 自动执行,可在弹窗中修改“每日签到”时间。 如有站点签到失败,可以点击列表中的地址直达签到页面。 功能预览 15 个帖子 - 7 位参与者 阅读完整话题

V2EX - 技术 · 2026-06-04 22:24:03+08:00 · tech

前言 ELK 的一大缺点就是这东西最初是没有登录机制的,只要拿到了 url 地址,kibana 看板谁都可以访问一下。后来 ELK 自带了一套 xpack 进行登录认证,可是除了账户名密码登录这种最原始的方法,剩下的高级功能,比如 oauth, oidc, ldap ,统统都是收费的.....总不能给每个人都专门搞一个 kibana 账户名密码吧...... 所以呢,这里有一个基于 casdoor 的 elk 鉴权解决方案, 不要钱,开源的,还有人维护呢~ 。Casdoor 是一个基于 OAuth 2.0 / OIDC 的 UI 优先集中认证 / 单点登录 (SSO) 平台,而 casdoor/elk-auth-casdoor 这套解决方案,则是一个 反向代理 ,他可以拦截所有未经登录的前往 elk 的 http 访问流量,并且引导未登录用户进行登录,而且这个反向代理对已登录用户是 完全透明 的。 仓库地址 https://github.com/casdoor/elk-auth-casdoor QQ 群:645200447 如果您有更多相关的特殊需求可以加群,我们会有专人对接~ (可以联系 ComradeProgrammer ) casdoor 是什么 Casdoor 是一个基于 OAuth 2.0 / OIDC 的 UI 优先集中认证 / 单点登录 (SSO) 平台,简单点说,就是 Casdoor 可以帮你解决 用户管理 的难题,你无需开发用户登录注册等与用户鉴权相关的一系列功能,只需几个步骤,简单配置,与你的主应用配合,便可完全托管你的用户模块,简单省心,功能强大。 仓库地址: https://github.com/casbin/casdoor 演示地址: https://door.casbin.com/ 官网文档: https://casdoor.org/ QQ 群:645200447 Casdoor 还支持 ldap ,saml 等诸多功能..... Casdoor 目前作为 Casbin 社区项目统一使用的鉴权平台,项目已开源,希望得到大家的一些建议和 Star~,我们会及时跟进反馈并改正问题哒 Casdoor 又有哪些特性? 支持普通的账户密码注册登录,也支持各种常见的第三方认证,例如 GitHub 、Facebook 、Google 、Wechat 、QQ 、LinkedIn 等等,截止目前共 9 个平台,并在不断听取用户建议对更多的平台提供支持。 管理方便。Casdoor 内部将模块分为了 5 大类,Organization 、User 、Application 、Token 和 Provider 。可以同时接入多个组织,组织下有不同应用,用户可以通过应用或组织分类,单独管理任何组织、应用或用户的 Token 令牌,轻松管理复杂系统,目前已部署在 Casbin 社区各种系统当作鉴权平台。 自定义程度高。Casdoor 可以随意修改登录方式,例如是否允许密码或第三方登录,自定义应用的注册项数量,是否启用两步验证,以及是否允许各个 Provider 登录、注册等等,高度可插拔。 具备 Swagger API 文档。清晰的 API 介绍,无需阅读源代码即可直接方便调用各个 API 接口,提供定制化功能。 前后端分离架构,部署简单。作为统一认证平台,除了性能,稳定性,新特性之外,易用性也是考量的重要标准,Casdoor 后端使用 Golang 语言开发,前端使用 React.js 框架,使用者只需启动后端服务,并将前端工程文件打包,即可直接使用,操作简单,上手难度低。 ...

LinuxDo 最新话题 · 2026-06-04 18:29:54+08:00 · tech

前言: 因为我的国内服务器拉容器一直慢或者拉一半失败,即使是开tun都不行,但是docker拉容器走的是docker守护进程,这个配置就很麻烦,然后我发现了regctl,它可以模拟docker的拉取命令实现再win上拉取镜像,最主要是配置代理就非常简单,但是每次都要命令行就很麻烦,于是ai写了个面板 regctl_gui.zip (9.4 KB) regctl下载连接 https://github.com/regclient/regclient/releases 结构如图,把你的regctl.exe放在同一个文件夹下 可以实现单个或批量拉取容器,可以检测要拉取容器的sha码和更新日期 展示图 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-04 10:39:30+08:00 · tech

前言 之前, 我们通过v2ray客户端计算hysteria2节点自签证书的 pinSHA256(base64) 现在xray需要pinSHA256(hex) 解决方案 G站/crazypeace/hysteria2-pinSHA256-tool 使用方法 hy2-pin-tool.exe IP:PORT 取 hex 的结果 Win amd64 环境下 v2rayN 的具体操作流程 从 G站/crazypeace/hysteria2-pinSHA256-tool/releases 下载 执行 hy2-pin-tool.exe hy2节点的IP:hy2节点的PORT 注意 hex 结果 v2rayN 编辑 hy2 节点, 点击 “证书未设置” 右边的3个点 把 hex 结果填写到 “证书指纹(SHA-256)” 就行了. 操作视频 hysteria2-pinSHA256-tool 从客户端计算 hysteria2节点自签证书的 pinSHA256 v2rayN 的具体操作流程 2 个帖子 - 2 位参与者 阅读完整话题

v2ex · 2026-06-03 22:57:43+08:00 · tech

前言 不行了,折腾完 free 折腾 plus ,折腾完 plus 折腾 team ,虽然正价开了 team ,但完全不够用,openai 你赢了,我来个一步到位。 车位情况 支付情况 菲区官网信用卡付款,可提供支付记录。 退款方案 万一翻车我尽量申请信用卡争议,能退我钱,我就退车友。 价格方案 每日额度 每周额度 并发 价格 120 500 5 (不确定,看情况动态调整) ¥ 260/月( USDT 也行) 和奥特曼同步重置额度 交付方式 sub2api 交付 模型 据说开 image2 会封号,那我也不开了 用途 禁止 NSFW ,逆向,爬虫,破限等违禁场景,如果收到邮件,我会开启 sub2api 的关键词屏蔽,应该会误伤一些正常请求,所以别给自己添麻烦。 WEB 端使用 我看有种方案是,指纹浏览器创建团队,共享出口(和 sub2api 出口一致,非家宽),我还在测试,没问题的话就可以把 web 端也共享出来,别浪费。 但这个方案不确定是否可行,因为不可能落地机上开 socks5 ,那就等着被墙吧,我还在研究,所以 一开始可能无法提供 WEB 端使用 ,所以我提供一种兜底方案: 我还有正价开的 team ,网页的 PRO 我也没用,所以如果有网页 PRO 的需求,可以找我借 team 号,但要求是一致的,网页版也不能进行任何违规使用。 开车时间 2026 年 6 月 7 日晚上(工作日前一天开车),正式开车前可随时退款,主要是据说有内鬼去 openai 论坛自爆了,但我看了一下,他说的应该是支付协议重放,付一份钱开多个,理论上应该波及不到我们这种真金白银付钱的,但我还是想先观望一阵。 如果所有车友都同意早开,那我也可以直接开,到时候再商量。

LinuxDo 最新话题 · 2026-06-03 22:47:34+08:00 · tech

前言 这几天看到各种支付失败和支付成功的,尤其是转长链失败、焚诀失败、切号失败、最后一步支付失败的,你需要的是一个纯净的家宽ip,目前刚好kookeey有0元家宽活动,开薅! 注册kookeey 点击上面的选择一键领取流量包,白嫖300M流量。 领取成功得300M家宽流量,也可以继续实名认证,拿4G流量! 当前可用国家按你自己需要,日本/印尼/美国等等 代理协议选Socks5 生成地址选用户名:密码@节点:端口,方便一会复制 可选:IP轮转周期,如果想保留你切换到的节点,这里就不要设置5分钟切换,节点之间的速度实测存在差异,觉得卡顿的话就换一个 点生成连接信息 安装gost brew install gost kookeey的协议不通用,所以装个gost转一下 启动 gost -L=socks5://0.0.0.0:9999 -F=socks5://username:[email protected]:1000 -L是你本地的代理端口,-F时上面粘贴的那一串线路信息,启动后,就可以通过本地9999端口进行socks5代理了 进一步优化 300M说多不多说少不少,无浏览器缓存情况下,支付流程大概耗费10M左右,开全局代理的话,有时候遇到系统偷跑、网页偷跑,很快就用光了,这里推荐下个Firefox来配置,用浏览器来隔离流量。 另外Firefox也是支持油猴插件的! 大功告成 可以去 ippure 之类的纯净度检测网站检查 手机也可以蹭! gost -L=[http://0.0.0.0:9999](http://0.0.0.0:9999/) -F=socks5://username:[email protected]:1000 -L 改成http协议即可,手机和电脑在同一个局域网/wifi,点开你手机无线局域网的配置,iPhone在设置-无线局域网-你的网络右边的i按钮 服务器ip是你电脑的ip,可以点击Wi-fi设置->详细信息查看,也可以 ifconfig | grep "inet " | grep -v 127.0.0.1 手机服务器配置你电脑的局域网ip即可 可选关闭蓝牙关闭定位,再狠一点更改时区/语言,你就是纯正的家宽手机了! 一些吐槽 想吐槽一些为了10ldc的人,oai社区有汉奸,怎么ldo也有? 2 个帖子 - 2 位参与者 阅读完整话题

v2ex · 2026-06-03 21:42:37+08:00 · tech

前言 不行了,折腾完 free 折腾 plus ,折腾完 plus 折腾 team ,虽然正价开了 team ,但完全不够用,openai 你赢了,我来个一步到位。 车位情况 支付情况 菲区官网信用卡付款,可提供支付记录。 退款方案 万一翻车我尽量申请信用卡争议,能退我钱,我就退车友。 价格方案 每日额度 每周额度 并发 价格 120 500 5 (不确定,看情况动态调整) ¥ 260/月( USDT 也行) 和奥特曼同步重置额度 交付方式 sub2api 交付 模型 据说开 image2 会封号,那我也不开了 用途 禁止 NSFW ,逆向,爬虫,破限等违禁场景,如果收到邮件,我会开启 sub2api 的关键词屏蔽,应该会误伤一些正常请求,所以别给自己添麻烦。 WEB 端使用 我看有种方案是,指纹浏览器创建团队,共享出口(和 sub2api 出口一致,非家宽),我还在测试,没问题的话就可以把 web 端也共享出来,别浪费。 但这个方案不确定是否可行,因为不可能落地机上开 socks5 ,那就等着被墙吧,我还在研究,所以 一开始可能无法提供 WEB 端使用 ,所以我提供一种兜底方案: 我还有正价开的 team ,网页的 PRO 我也没用,所以如果有网页 PRO 的需求,可以找我借 team 号,但要求是一致的,网页版也不能进行任何违规使用。 开车时间 2026 年 6 月 7 日晚上(工作日前一天开车),正式开车前可随时退款,主要是据说有内鬼去 openai 论坛自爆了,但我看了一下,他说的应该是支付协议重放,付一份钱开多个,理论上应该波及不到我们这种真金白银付钱的,但我还是想先观望一阵。 如果所有车友都同意早开,那我也可以直接开,到时候再商量。