2026-01-04 14:27:19
正在测试一个招聘功能,需要生成一堆测试数据,放到某个公司下。
虽然之前尝试过 golang 的 faker 库,参考:自动创建测试数据的库 go-faker。 但是,我感觉,还是不如直接写 SQL 语句来的自由方便。
这里记录一下如何批量生成 MySQL 数据库测试数据的步骤:
在 web 管理后台,或者 MySQL WorkBench 的 GUI 界面。手动录入一条测试数据记录。
用 Web 管理后台的好处是,可以顺便测试一下开发的管理页面功能是否有 bug。
在 MySQL WorkBench 里,查询显示当前数据表的所有记录。
可以复制某一行(copy row),然后 paste row 黏贴,点击 apply,就能看到对应的 insert SQL 语句。 这条语句记录下来,后面会用到。
让 AI 写了个 SQL for 循环。这要是让我写,我是写不出来的。。。
use some_db;
-- 创建存储过程
DELIMITER $$
CREATE PROCEDURE batch_insert()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE max_count INT DEFAULT 10; -- 设置循环次数
WHILE i <= max_count DO
-- 执行插入语句,这里用变量控制
INSERT INTO `job`
(`title`, `company_id`, `location`)
VALUES
(CONCAT('后台开发', i), '1', '烟台');
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
-- 调用存储过程
CALL batch_insert();
-- 删除存储过程
DROP PROCEDURE IF EXISTS batch_insert;
把里面的 insert 语句替换成自己的即可。
然后后面就可以调用存储过程来批量插入测试数据了。
这个比正常的 faker 库方便的地方是,可以自由指定某个字段的值,例如给某个公司插入 100 条招聘信息。 要灵感得多。
2025-12-31 11:19:12
最近喜欢使用 Emoji 作为页面内的图标,可以省去引入三方图标库的麻烦。而且美观度也非常好。
但是 favicon 图标是否也可以直接使用 Emoji 呢?直接使用是不行的,因为 favicon 要求是一张图片或者 SVG。 于是,我找到了一个有趣的实现,就是这个 Twitter 开源的 Twemoji。

A simple library that provides standard Unicode emoji support across all platforms.
简单翻译一下,它是一套开源的表情符号(Emoji)图标库。这个项目的核心理念是 “Emoji for everyone”,致力于让所有人、在所有平台上,都能自由地使用一套标准、美观且一致的表情符号。
Twitter 官方的地址已经访问不了 https://twemoji.twitter.com ,可以到下面这个网站找到每个 Emoji 对应的图片链接地址:
https://favicon.io/emoji-favicons/
例如日历 Emoji 对应的地址:
https://cdn.jsdelivr.net/npm/[email protected]/2/svg/1f4c5.svg
2025-12-29 07:59:37
2025-12-26 17:23:05
在服务器上挂载了 Linode Object Storage 之后,想要获取某个 bucket 下的所有文件列表。 发现用 ls 命令非常慢,尤其是文件数量非常多的时候。例如 2 万多个文件,ls 命令不知道要等待多久才能返回结果。 因为 Linode Object Storage 兼容 S3 协议,所以我想试试用 AWS CLI 工具来获取文件列表,将结果保存到文本文件中。
因为本机是 Windows,WSL 下的 Ubuntu 还是 18.04 版本,版本有点旧了。所以,我打算直接在 Windows 上安装 AWS CLI 工具来使用。
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
直接使用里面 msi 安装包下载安装即可。
打开 PowerShell 或 CMD,输入以下命令:
> aws --version
aws-cli/2.32.23 Python/3.13.11 Windows/11 exe/AMD64
说明安装成功。
如果直接执行以下命令,会提示无法找到凭证:
> aws s3 ls --endpoint=https://ap-south-1.linodeobjects.com
Unable to locate credentials. You can configure credentials by running "aws login".
但是 aws login 的输入提示,我完全看不懂。。。所以改用 aws configure 命令来配置身份认证信息, 即,输入 Access Key 和 Secret Key。
> aws configure
AWS Access Key ID [None]: MY_ACCESS_KEY_ID
AWS Secret Access Key [None]: MY_SECRET_ACCESS_KEY
Default region name [None]: us-east-1
Default output format [None]: json
配置完成后,执行 ls 命令来测试一下,注意,这里需要加上 --endpoint 参数,指定 Linode Object Storage 的 endpoint 地址,否则会默认连接到 AWS 的 S3 服务。 后续的所有命令都需要加上这个参数。
> aws s3 ls --endpoint=https://us-east-1.linodeobjects.com
2024-04-03 14:49:24 a.sunzhongwei.com
2025-04-12 11:36:26 b.sunzhongwei.com
不加 --endpoint 参数的话,会报错:
An error occurred (InvalidAccessKeyId) when calling the ListObjectsV2 operation: The AWS Access Key Id you provided does not exist in our records.
或者:
An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation: Unknown
例如,换成新加坡的 endpoint 地址:
> aws s3 ls --endpoint=https://ap-south-1.linodeobjects.com
例如,导出 a.sunzhongwei.com/cache/ 目录下的
aws s3 ls s3://a.sunzhongwei.com/cache/ --recursive --endpoint=https://us-east-1.linodeobjects.com > filelist.txt
recursive 参数表示递归列出所有子目录下的文件。
注意,s3:// 后面是 bucket 名称,然后是目录路径。不要加上 endpoint 地址。endpoint 地址是通过 --endpoint 参数传递的。
注意,如果是 Windows 11 下的 PowerShell 执行上述命令,导出的文本文件 filelist.txt 会是 utf16le 编码格式的。 utf16le 编码需要转成 utf8 才能继续使用 linux shell 工具处理。转换很简单,用记事本打开,然后另存为 utf8 编码格式即可。
然后用 VSCode 打开文件,确认一下返回的数据格式,在 WSL Ubuntu 下使用 awk 命令处理数据,例如提取出文件路径:
awk '{print $NF}' filelist.txt > result.txt
$NF 代表每一行的最后一列。
PowerShell 里面没有 awk,我即便用 AI 生成 PowerShell 命令,我也看不懂里面的参数格式,太抽象了,还是 Linux awk 命令更直观一些。
2025-12-25 13:08:31
最近用 Gemini 3 Flash 开发非常爽,于是我想如果能程序化调用 Gemini API 就更好了,可以自动化一些日常的任务。 而我印象中 Google 是提供了一些免费的 AI API 额度的。于是我查了一下确实有免费的额度可以使用 Gemini API。
在 Google AI Studio 上申请免费的 API Key 后,就可以使用 Gemini API 了。下图是一些免费可用模型的额度列表:

速率限制通常从以下三个维度进行衡量:
速率限制按项目应用,而不是按 API 密钥应用。每天的请求数 (RPD) 配额会在午夜重置。实验性模型和预览版模型的速率限制更为严格。
https://aistudio.google.com/api-keys
https://ai.google.dev/gemini-api/docs/pricing?hl=zh-cn#gemini-3-flash-preview
不过免费的额度有各种限制:
看起来有点少,但是对于一些简单的自动化任务来说,已经足够了。 例如,我 Github Copilot 一个月 1000 次的 Gemini 3 Flash 额度,我也就用了 10% 左右。也就是 100 次左右。每天才几次。
https://github.com/googleapis/go-genai
Google 官方提供的 golang 库,可以方便地调用 Gemini API。安装:
go get google.golang.org/genai
使用起来非常简单, 示例代码:
import "google.golang.org/genai"
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: apiKey,
Backend: genai.BackendGeminiAPI,
})
parts := []*genai.Part{
{Text: "What's this image about?"},
{InlineData: &genai.Blob{Data: imageBytes, MIMEType: "image/jpeg"}},
}
result, err := client.Models.GenerateContent(ctx, "gemini-2.5-flash", []*genai.Content{{Parts: parts}}, nil)
把这个服务部署在海外服务器,就能在国内访问 Gemini API 了。
gemini 那些 API,大部分都限制在每天 20 次请求,5 次每分钟请求数。 如果遇到需要大量请求的情况,可以使用 gemma 3 系列模型,这些模型日限制在 14.4K 次请求,完全够用。
但是没有提供 Golang 的 API,只有 python 和 nodejs 的 API。
https://ai.google.dev/gemma/docs/core/gemma_on_gemini_api?hl=zh-cn#rest
不过看 curl 的示例非常简单:
curl "https://generativelanguage.googleapis.com/v1beta/models/gemma-3-27b-it:generateContent?key=xxx" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[{"text": "Roses are red..."}]
}]
}'
把 Key 写在 URL 里也是一种创举,完全不考虑被泄露的风险。。。🥲 Google 也有不专业的开发啊。
不过会看到 Gemini 系列则是正常的在 HTTP Header 里传递 Key。估计是不同团队搞的。
于是用 Golang 实现了一个简单的 gemma 3 系列模型的 API 调用。 判断请求的模型是 gemma 3 系列模型的话,就走 gemma 3 的调用逻辑,否则走 golang 官方库的调用逻辑。
到此,就实现了一个完整的 Gemini API 代理服务,支持 gemini 系列和 gemma 3 系列模型。 后续就可以在这个基础上,做一些自动化的功能了。
2025-12-25 12:35:28
由于经常要发微信公众号文章找封面配图,现在用某包生成的图片,右下角都带着“某包 AI 生成”的字样。 之前还可以通过小米手机内置的图片编辑,轻松抹去水印,但是昨天突然发现,用澎拜 OS 系统内置去水印功能后,右下角增加了“AI 生成”的字样。估计是现在法规严格了吧,强制所有 AI 模型都加上了估计。这是不给我活路了么 🥲
不过天无绝人之路,我找到一个好办法:
直接使用 huggingface 里部署的 Z-Image-Turbo。省去了每次都需要手动去掉水印的繁琐操作。
https://huggingface.co/spaces/Tongyi-MAI/Z-Image-Turbo
这个应该是阿里开源的一个图片生成模型 Z-Image-Turbo,使用起来很简单,也是输入提示词,设置图片宽高比例就能开始生成。效果感觉跟某包的效果没有什么差别。其实主要是考验提示词的详细程度。
