Y!an 发布的文章

过去一个月(2025.05.19~06.18)的重心仍然是开发,大部分时间都投入到了 词焙,也尝试了一些新的技术点

开发

开发工作中:

  • 词焙 Chrome 插件:完成了第一个版本,已实现功能:划词翻译,同时接了 AI 来扩充词库数据
  • 词焙单词数据处理:处理了已有词库的单词,补充了单词的变型形式和做了查询索引, 在后端处理单词变型数据上做了大量工作,包括数据变型的初步处理、引入了多线程优化数据处理效率,并对数据结构进行了变更和修正,也处理了单词变型数据的索引。
  • 词焙登录方式调整:考虑到后续 Chrome 插件等等客户端,只有单一的小程序登录是肯定不满足的,于是趁用户量还不大赶紧调整了登录方式
  • 调研了 Feistel 算法,调整了 passportaccess_token 生成算法

其他

最近广州电信连 Cloudflare Tunnel 有点不太稳,于是用了 Tailscale 组网,将 Cloudflare Tunnel 移到香港机和新加坡机,然后通过 Tailscale 子网反代到家里的机器,现在访问我博客的链路大概是 浏览器 -> CF -> 腾讯云香港/新加坡 -> 广州 🤣

不知不觉又到了月报时间,过去一个月(2025.04.19~05.18)主要还是围绕着 词焙 进行了一些开发工作,同时也抽空学习了一些新知识。

开发

这个月在 “词焙” 上有以下进展:

  • 修复了一些前端 bug
  • 新增了「近似发音」数据

学习

除了开发之外,这个月也保持了持续学习的状态:

  • 突发奇想 AI prompt 能不能有类似 GraphQL 的玩法,于是研究了 GraphQL 的概念和用法
  • 研究了一些查找算法,用于查单词接口

不知不觉又一个月过去了,这个月比上个月还要忙,原定今天要上线一个小程序的,但是工作效果不如预期,只能再继续打磨打磨了。

开发

这个月 90% 的工作时间都在做开发,重写了一个将近十年前的老项目的后端接口,技术栈是 Go + MongoDB,第一次这么认真去学习一个新的数据库,目前体验下来感觉还不错,bson 的一些操作比 SQL 还要爽(可能是因为以前我怕慢查询而比较少用 SQL 的复杂查询,然后现在用 MongoDB 就有点初生牛犊不怕虎的感觉,什么都敢用)。

告别微信支付开发四年之后重新接触微信开发的东西,才发现原来微信支付接口已经改了这么多,也是第一次用 Go 来写微信支付的东西,总得来说还算顺利。

这个月还顺手修了一些 tipsy 的 bug

备案

除了开发,这个月做得比较多的是跟备案打交道:

  • 第一次给小程序备案,也是第一次用企业主体、非法人、负责人身份去做备案
  • 给小程序 API 用的域名备案,现在可以不用在 www 域专门挂个网页放备案号了
  • 给一个旧域名注销备案,全过程应该是自动化的,挺快就注销好了

其他

这个月去了趟香港,办了几张卡,全程手机 app 操作,网上的攻略也多,还算比较丝滑;

这个月本来有两篇文章想写的,但是实在太忙了就还没写,下个月一定补上

过去一个月算是过得很充实了,除了日常开发之外还写了个小工具,做了点翻译工作,顺便处理了之前服务器迁移剩下的杂项

开发

  • 后端:这个月的重心在开发新项目,API 接口目前进度 80%
  • 前端:重新入门 React,学习 tailwindcss
  • 其他:接手了一个十年前的老项目,成功在 Docker 搭好环境并且跑起来了

小工具

最近用 gin 写的项目比较多,每个新项目都要手动复制一套模板很麻烦,而且用了 wire 来做依赖注入之后新增 controllerservice 等等都需要手动更新 wire.go,于是写了个类似于 Laravel artisan 的小工具,可以快速创建新项目和各种组件。

项目地址:https://github.com/YianAndCode/tipsy

新文章 & 翻译

翻译:《Writing an Operating System in 1,000 Lines》:在线阅读,GitHub 地址:https://github.com/nuta/operating-system-in-1000-lines

新文章:《用 Dockerfile 构建镜像时用 build secrets 安全优雅地传递敏感数据》


这个月的总结似乎不算多,主要就是上面提到的东西在快速迭代中,也算是进入心流状态了吧,还是比较开心的 :-P

起因是这样的,我有一个 Go 写的 utils 库,但这个仓库目前是 private 的,于是在其他引用了这个库的项目构建时就需要解决鉴权访问的问题。

先来看看不使用私有库的 Go 项目构建的 Dockerfile:

# build api
FROM golang:1.23 AS builder

WORKDIR /src/app

COPY . ./

RUN --mount=type=cache,target=/go/pkg/mod \
    make

# build the final image
FROM ubuntu:24.04

COPY --from=builder /src/app/bin/api /app/bin/api

而使用了私有库的话,就需要设置 GOPRIVATE 环境变量和鉴权。

在本地开发的时候我是用的 ssh 来访问 git 仓库的,所以在 ~/.gitconfig 追加如下配置即可:

[url "[email protected]:"]
    insteadOf = https://github.com/

但是使用 Docker 构建的时候继续使用 ssh 就会略麻烦(使用 Deploy key)和不安全(使用个人账号 SSH key),那么细粒度的 Access Token 会是更好的选择。

因为 Access Token 是敏感数据,我们是不能直接写在 Dockerfile 里的,所以你可能会想到那就通过构建参数传进去:

+ARG GITHUB_TOKEN
+ENV TOKEN=$GITHUB_TOKEN

 WORKDIR /src/app

 COPY . ./

+RUN go env -w GOPRIVATE="github.com/YianAndCode/MY_PRIVATE_GO_PKG"

+RUN git config --global url."https://${TOKEN}:[email protected]/".insteadOf "https://github.com/"

 RUN --mount=type=cache,target=/go/pkg/mod \
    make

然后构建:

export GITHUB_TOKEN=xxx
docker build --build-arg GITHUB_TOKEN=${GITHUB_TOKEN} -t myapp:latest .

这时你会得到一个警告:

WARN: SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data

因为这样做别人在拿到镜像之后是可以看到你构建过程中的参数的,也不安全。其实在 Docker 官方文档有介绍 Build secrets,我们可以利用这个功能来实现更安全优雅地传入敏感数据。

首先来学习一下 build secrets 的基本知识:

- 阅读剩余部分 -