阅读视图

发现新文章,点击刷新页面。
🔲 ⭐

Codeforces Round 1089 (Div. 2)

A. A Simple Sequence

大致题意

要求你生成一个排列,满足

$a_1 \space mod \space a_2 \geq a_2 \space mod \space a_3 \dots a_{n-2} \space mod \space a_{n-1} \geq a_{n-1} \space mod \space a_n$

思路

由于这里可以是 $\geq$,而 $n \space n-1 = 1$,是一个显然的等式,所以直接倒序输出即可

AC code

1
2
3
4
5
6
7
8
9
void solve() {
int _;
cin >> _;
for (int ts = 1; ts <= _; ++ts) {
int n;
cin >> n;
for (int i = n; i >= 1; --i) cout << i << " \n"[i == 1];
}
}

B. Simply Sitting on Chairs

大致题意

有一个 $n$ 的排列 $p$,然后需要完成如下操作:

从第一个值开始往后逐个选择,如果选择了这个值 $i$,那么接下来就不能选择 $p_i$

问最多可以选多少个值

思路

其实也非常简单,只要选择的 $i \geq p_i$ 就行了

AC code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void solve() {
int _;
cin >> _;
for (int ts = 1; ts <= _; ++ts) {
int n, ans = 0;
cin >> n;
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
ans += x <= i + 1;
}
cout << ans << endl;
}
}

C2. A Simple GCD Problem

大致题意

有两个数组 $a, b$,都是长度 $n$,现在希望生成一个新的数组 $a’$,满足

$a’_i \in \Set{a_i, [1, b_i]}, \forall \Set{l, r} (1 \leq l < r \leq n), gcd(a_l, a_{l+1}, a_{l+2}, \dots, a_{r}) = gcd(a’_l, a’_{l+1}, a’_{l+2}, \dots, a’_{r})$

问最多可以同时存在多少个 $a’_i$ 满足 $a’_i \neq a_i$

思路

首先先分析题目中提到的 $gcd(a_l, a_{l+1}, a_{l+2}, \dots, a_{r}) = gcd(a’_l, a’_{l+1}, a’_{l+2}, \dots, a’_{r})$

看起来很吓人,实际上根据 $gcd$ 的性质,可以得到 $gcd(gcd(a, b), gcd(b, c)) = gcd(a, b, c)$

而题目中提到的是$\forall \Set{l, r} (1 \leq l < r \leq n)$,由于任意区间的 $gcd$ 等于这个区间里的相邻值的 $gcd$ 再做 $gcd$

所以要求条件可以转为: $\forall i (1 \leq i < n), gcd(a_i, a_{i+1}) = gcd(a’_i, a’_{i+1})$

要满足这条,我们需要先找出一个数组 $c$,满足 $c_i = gcd(a_i, a_{i+1})$,这不是什么难事

显然我们可以得到,最终的 $a’$ 满足: $gcd(a’_i, a’_{i-1}) = c_{i-1}, gcd(a’_i, a’_{i+1}) = c_{i+1}$

根据 $gcd$ 的性质,我们可以得到 $a’_i = x \times lcm(c_{i-1}, c_i), x \geq 1$

由此我们可以得到 $a’$ 数组的每一项的最小可选值,即 $a’_i = lcm(c_{i-1}, c_i)$

至此,我们已经完成了 Easy Version 的题解。由于 $b_i = a_i$,所以如果 $lcm(c_{i-1}, c_i) = a_i$,那么就不可能存在 $a’_{i} \neq a_{i}$

接下来是讨论 Hard 部分的解决方案

显然,如果 $lcm(c_{i-1}, c_i) \neq a_i$ 的话,我们就可以选择令 $a’_{i} = lcm(c_{i-1}, c_i)$,因为再乘上任何值都有可能让 $gcd$ 发生变化(变大)

接下来核心是要处理这些不满足的值,也就是 $lcm(c_{i-1}, c_i) = a_i$ 的值,尝试找到一个 $x$ 使得 $x \times lcm(c_{i-1}, c_i) \neq a_i$ 且不改变 $gcd$ 关系

由于不能改变 $gcd$ 关系,假定 $a’_i = x_i \times lcm(c_{i-1}, c_i)$,那么 $gcd(x_i, a’_{i-1}) = gcd(x_i, a’_{i+1}) = 1$

扩展后可以得到:

$gcd(x_i, x_{i-1}) = gcd(x_i, x_{i+1}) = gcd(x_i, lcm(c_{i-2}, c_{i-1})) = gcd(x_i, lcm(c_{i}, c_{i+1}))$

即有很多很多的互质

显然我们很容易想到用素数,因为任意两个素数之间肯定互质,由于本身是乘法,且只需要找到相互互质的值即可,所以只需要限制在较小的值内即可

我用了 100 以内的素数,通过 dp 的方式,枚举每一位乘上每一种素数的情况

我的 dp 算法里,下标 $x$ 表示第几个素数,其中 $0$ 表示 $lcm(c_{i-1}, c_i)$ 本体,而 $max(x)$ 表示 $a_i$ 本身

AC code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#define int long long

int gcd(const int a, const int b) {
if (b == 0) return a;
return gcd(b, a % b);
}

void solve() {
vector<int> primes;
primes.push_back(1);
vector isPrime(100, true);
for (int i = 2; i < 100; i++) {
if (isPrime[i]) {
primes.push_back(i);
}
for (int j = i * i; j < 100 && j > 0; j += i) {
isPrime[j] = false;
}
}

int _;
cin >> _;
for (int ts = 1; ts <= _; ++ts) {
int n;
cin >> n;
vector<int> a(n), b(n), c(n);
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) cin >> b[i];

for (int i = 0; i < n; i++) {
if (i == 0) {
c[i] = gcd(a[0], a[1]);
} else if (i == n - 1) {
c[i] = gcd(a[i - 1], a[i]);
} else {
const int x = gcd(a[i - 1], a[i]);
const int y = gcd(a[i] , a[i + 1]);
c[i] = x * y / gcd(x, y);
}
}
vector<int> dp[2];
dp[0].resize(primes.size() + 1);
dp[1].resize(primes.size() + 1);
int cur = 0, nxt = 1, ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < primes.size() + 1; ++j) {
const int v = j == primes.size() ? a[i] : c[i] * primes[j];
dp[nxt][j] = -1;
if (v > b[i] && v != a[i]) continue;
if (i == 0) {
dp[nxt][j] = v != a[i];
continue;
}

for (int k = 0; k < primes.size() + 1; ++k) {
const int u = k == primes.size() ? a[i - 1] : c[i - 1] * primes[k];
if (gcd(u, v) == gcd(c[i - 1], c[i])) {
dp[nxt][j] = max(dp[nxt][j], dp[cur][k] + (v != a[i]));
}
}
}
swap(cur, nxt);
}
for (auto x : dp[cur]) ans = max(ans, x);
cout << ans << endl;
}
}
🔲 ⭐

2026 年 4 月 每日分享

可以收藏「不死鸟发布页」dalao.ru ,速记:大佬点入

关于不死鸟每日分享栏目

发现一些不错的资源,点击这里快速投稿。

4月14日

BBAB免版权图片

免费版权图片搜索引擎,3000万高清大图免费商用,版权无忧

随身FM

@投稿 无广告的听广播电台安卓APP,习惯听广播电台的老哥们看过来

meme梗图

@投稿 一个每日更新梗图的网站,非常有意思

88lin全网VIP视频脚本

@投稿 通过集成多个第三方解析接口,去除广告,绕过会员限制,适配PC+移动

4月13日

pixcat收藏

量比较大,收藏夹实用性不错。

纯净派

目前收录软件较少,看起来比较清爽下载链接也很全面。

免费日本域名

@如有乐享 免费申请d.gv.vc域名,仅支持A记录解析

4月12日

YY书屋

一个小说交流推书论坛。

banana PPT生成工具

@投稿 从想法到演示文稿,只需一句话。内置多套ppt生成的提示词模板,支持ppt在线分享和导出

免费开源的macOS语音输入工具

@投稿 使用本地下载的语音SST模型,4大ST引擎按需下载,不求商业化,求个star和转发

4月11日

小氢壁纸

@网友小氢 微博每天分享壁纸,无水印。

百万豪装音响录音棚大声听

B站音乐博主,歌曲挺全。

SBTI人格测试

@投稿 快来看看你是什么人格,年轻人的全网自嘲狂欢测试题

4月10日

🔥Nano Banana Pro国内稳定站点

国内免翻流畅使用NanoBanana Pro、Veo3.1、Sora2等全球顶尖模型,稳定丝滑不卡顿,一句话轻松搞定专业图片/视频创作,欢迎免费体验!

阅竹

原潮汐阅读,全平台本地阅读器,支持跨端同步阅读进度

Moeli阅读

无广告、无追踪,专注于纯粹阅读本地漫画、小说体验

4月9日

Weibo备份工具

配合脚本导出微博数据,帮你永久珍藏那些在微博上发布的重要信息。

FlowScroll全局无级滚动

@xiaoyi 让网页、PDF、代码编辑器、表格、时间轴,都能获得更连贯、更轻松的滚动体验。

圆桌起名

@投稿 从中国传统典籍中抽取名字,确保每个名字都有出处,免费无限次起名

4月8日

免费视频和音频处理工具

@投稿 无广告、无水印,专业级浏览器端音视频工具,全程本地处理,支持最大50G

路费工具箱

Linux效率与运维工具箱

Gestify

@投稿 给视频加上手势操控的浏览器扩展,支持安卓版Edge/Firefox

4月7日

thesvg

5650+ 免费SVG图标下载

LXB-Framework

实验性安卓端自动化框架,专注于高频、线性的日常任务自动执行

A0KE-莆田潮牌鞋服专供【一手货源】

@广告 六年老店,一手货源,主营各大品牌潮牌鞋子,耐克、阿迪、匡威、彪马、萨洛蒙、始祖鸟、迪桑特等品牌,主打中高端品质,另外也有潮牌服饰、苹果耳机、卡西欧、包包等爆款商品!

Cloudflare优选拯救国外VPS

告别高延迟,直观的使用CF优选IP加速国外服务器。

土拨鼠大屏助手

巧用手机会员畅享大屏巨幕,无需开TV版会员

4月6日

TapClaw

告别只会聊天的 AI:一分钟领养你的云端小龙虾,配台专属电脑,看它全天候替你打工

Cardinal

最快最准的macOS文件搜索工具,毫秒级文件搜索,结果比Spotlight更精准

4月5日

DriverPE_Win11_23H2维护版

@投稿 以新旧电脑全适配、内核驱动全的优势,重新打造PE维护工具新标杆

聚盘搜

@投稿 颜值高的一款云盘资源搜索网站

文本转语音工具

@投稿 简洁高效的免费文本转语音工具,单词最多1000字

4月4日

Apple Matting抠图

基于Apple Vision框架的开源macOS抠图工具

model数据库/信息站

数据基于models.dev做了页面优化更简洁直观

digvps服务器测评

专注服务器测评,总有一款服务器适合

4月3日

蘑菇韩剧APP

@投稿 不错的安卓看韩剧应用,最新高清韩剧都有

Poixe AI免费模型API调用

@投稿 为所有用户提供免费模型调用,106个免费大模型,每日自动刷新,可用于轻量化测试

莆田潮牌鞋服

@广告 推荐: 高仿潮鞋/潮牌服饰高品质热销/大牌手表包包/专柜同质量!支持15天无理由退换 !点击了解!

大师吵股

@投稿 召集当世或已故的炒股大师共同为你解惑

4月2日

小红书/抖音视频文案提取工具

@投稿 支持抖音、小红书等国内外10+平台,一键打包下载视频字幕、视频文件、封面、内容文案

AI-CS客服系统

@投稿 让客户服务更轻松,AI先接待、人工可接管,支持知识库问答与私有化部署的AI客服网站

用线索找坏蛋-免费摸鱼游戏

@投稿 春节假期肝出来的免费在线摸鱼游戏小站,天天更新一个新关卡,完全免费

WinPaste剪贴板增强工具

@投稿 能无缝替换并增强系统自带的Win+V历史功能,真正做到开箱即用

4月1日

言泉输入法

@宋超 开源、克制、本地优先的中文输入法,把中文输入重新做成一件可信、顺手、边界清晰的事。

deepcode

@投稿 深度集成 DeepSeek的VS Code扩展,支持持久会话、文件操作、技能

愚人节的真彩蛋:4月1日,壁纸湖小程序开启限时狂欢,获取999次壁纸免广告下载次数!

茶杯狐+pomo4k

@投稿 影视网站这个可在线看 也可下载

广告

aipyai

手机大流量卡

🔲 ⭐

重回Vim

虽然之前没有在blog中提,但其实从Vim 8切换到Neovim已经很长时间了。
主要原因是为了尝试Telescope、Lazy.nvim等插件,以及期望启动和响应速度能够快一些。
等到Vim 9问世,经历了Bram Moolenaar去世之后,因为Neovim的不稳定,长期打开文件后窗口不响应,又重新回到了Vim,开始使用9.2的版本。

断断续续花了2天时间切换配置、重新安装插件,插件管理改用Vim-Plug,LeaderF代替Telescope,除了HopFocus外,绝大多数插件可以通用或找到替代品。

而且Windows下可以用--remote-silent参数保证所有文件都在同一个窗口中打开,而Neovim做不到或者很麻烦。

🔲 ⭐

Streetlamp Studio发布《SlashZero》: 重塑未来战场,高燃 3D 动漫风肉鸽游戏来袭!

今日,在未来游戏展(Future Games Show)春季发布会上,Streetlamp Studio正式揭开了旗下备受期待的 “3I” 级新作《SlashZero》的神秘面纱。与传统2D像素风游戏截然不同,《SlashZero》采用3D动漫美术表现形式,打造出一个广袤无垠且由程序生成的赛博朋克世界。

在《SlashZero》的世界观中,时间线已然崩塌。玩家将化身 “时空骇客”,穿梭于充斥着科幻与奇幻元素的平行时空,探寻时间崩溃的真相并试图修复世界。

《SlashZero》深度打磨肉鸽核心玩法,以极致挑战、厚重叙事与精良机制为基础,打造出一套深度垂直的战斗系统。借助3D场景优势,本作实现了同类横版游戏中罕见的空间层次感与动作流畅度。

Streetlamp工作室的制作人Jun表示:“我们希望通过《SlashZero》,突破横版roguelike游戏的边界。我们投入了大量精力打磨高品质3D动画与游戏内性能表现,并实现PC与主机同步发行,力求为玩家带来一场兼具操作爽感与视觉盛宴的顶级体验。”


游戏核心特色

· 3I级品质标准:惊艳的3D动漫视觉效果,让未来世界与角色生灵栩栩如生。

· 垂直横版卷轴战斗:角色拥有丰富的招式与动态技能,依托3D空间实现超高机动性与战术深度。

· 程序化关卡体验:先进的生成引擎,确保每一次时空穿梭都拥有全新场景挑战与技能组合。

· 全平台同步发售:游戏从研发阶段便面向多平台同步开发,保证PC与PS5版本性能体验一致。

在今日公布之后,开发团队将陆续披露更多关于游戏玩法机制与剧情设定的细节。同时,限量版试玩活动即将开启,玩家现可前往Steam将游戏添加至愿望单,并关注官方社交平台B站@SlashZero,获取第一手资讯。

点击前往游戏Steam商店页

点击前往填写创作者Playtest招募问卷

QQ群号:1090513795

 

🔲 ⭐

2026 年,我把自己做成了一个 AI

🤖 AI 摘要

文章以作者长期在博客、社交媒体、GitHub 等平台留下的大量内容为背景,提出在生成式 AI 时代主动构建个人知识结构的重要性。作者首先在 /about 页让 6 个不同大模型基于 11 万字上下文与结构化摘要,生成第三方视角的作者画像,并通过多模型对比提升可信度。随后,他构建了可在博客内直接聊天的「AI 罗磊」,技术栈包括基于 Cloudflare Workers 的 Vinext、Vercel AI SDK、OpenAI Compatible API 接入多家模型、自研搜索/RAG 核心、IP 级限流和 Telegram Bot 监控。系统流程涵盖追问检测与意图判定、缓存复用、本地倒排索引搜索与分数加权、AI 关键词提取与停用词过滤、意图重排、多层 System Prompt 设计、流式生成与截断修复,以及全链路 Token 与耗时追踪。为抑制幻觉,作者设计了来源限制、数字协议、履历协议和链接协议等严格规则,确保回答有据可依。文末作者反思 AI 分身与真实自我的偏差,并展望接入视频内容、降低对单一 API 依赖,强调个人应主动把分散内容结构化为可对话的知识系统,让 AI 成为自我延伸。

起因

我在互联网上留下痕迹,比写代码还早。

大学时代就开始折腾博客、刷微博、玩人人网,那时候还没入行做程序员,纯粹就是一个爱在网上表达的人。后面这十几年,从最开始的切图仔,到后来资深前端开发,再到现在的 AI 驱动的全栈开发,有了技术加持,输出变得更加系统化。到今天,luolei.org 上已经有 300 多篇文章。

除了博客,还有 YouTubeB 站 的 ZUOLUOTV 视频频道、X/Twitter 上的 @luoleiorg、十几年前的微博和人人网、Unsplash 上累计超过 1500 万浏览的摄影作品、GitHub 上的开源项目。

这些内容散落在互联网的各个角落,涵盖了技术、摄影、旅行、跑步、数码产品、生活方式等话题。如果有人想快速了解「罗磊是谁」,他需要翻好几个平台、读上几十篇文章,才能拼凑出一个大概的印象。

2024 年至今,我全身心投入独立开发,拥抱 AI-first 的 Vibe Coding 工作流。在这个过程中,一个想法越来越清晰:

在生成式 AI 时代,你的内容一定会被 AI 读取。但 AI 是否能完整地理解你,取决于你是否主动构建自己的知识结构。

被动被爬虫抓取,和主动建立语义索引,是两回事。让 AI 理解你,本质是在拿回对自己内容的解释权。

于是我决定在博客上做两件事:让多个 AI 模型以第三方视角写出「AI 眼中的罗磊」,以及基于我多年的多平台内容构建 RAG 知识库,做一个可以直接聊天的「AI 罗磊」。

AI 眼中的罗磊

打开 luolei.org/about,你会看到一个和传统「关于我」页面完全不同的东西。

这个页面不是我自己写的自我介绍,而是由 6 个不同的 AI 模型(GPT-5.2、Gemini 3、Qwen 3.5 Plus、Kimi K2.5、豆包 Seed 2.0、GLM 5.0)分别阅读我的博客文章、X 动态和 GitHub 履历后,各自生成的第三方视角作者画像。

同一份数据,不同模型,像 6 个旁观者各自写出对同一个人的理解。

数据从哪来

这次 AI 分身主要围绕三类数据进行分析:

  • 博客文章:300+ 篇 Markdown 文件,每篇都经过 AI 预处理生成结构化摘要(含一句话摘要、详细摘要、3-6 条关键要点、SEO 关键词)
  • X/Twitter 动态:通过官方 API 抓取,按互动量排序取最有代表性的内容
  • GitHub 履历:项目信息、工作经历、技术栈

说实话,这只是我在网上留下的数据的一小部分。我在 YouTube 和 B 站上有大量视频内容,十几年前的微博和人人网上也有不少早期的文字记录。但这些平台的数据抓取非常麻烦——视频需要先转文字再分析,国内社交平台的 API 要么不开放、要么限制很多,和 Twitter 的官方 API 体验完全不在一个级别。

即使是 Twitter API,成本也不低。所以我做了本地缓存策略,抓取一次后存到 JSON 文件里,避免重复调用。

11 万字的上下文挑战

这三类数据汇总后,光是 Context JSON 就有大概 11 万字。把这么大的数据量一次性丢给 AI 分析,直接暴露了当前大模型的能力边界。

实测下来,6 个模型中只有 Qwen 和 Gemini 3 能稳定处理这个量级的上下文。其他几家要么超时、要么输出质量严重下降,甚至直接报错。最后我做了一轮 AI 预处理——先用模型对每篇文章生成摘要和关键要点,再把压缩后的结构化数据丢给各个模型生成画像,才解决了这个问题。

这是当前 AI 能力的一个现实限制。但可以想象的是,随着大模型的上下文窗口持续扩大,未来普通用户也能轻松处理几十万字的长文分析。到那时候,做这种个人知识系统的门槛会低很多。

多模型生成

6 个模型使用统一的 System Prompt,要求以第三方视角生成结构化 JSON 报告,包括身份标签、能力维度、做事风格、代表作品等。Prompt 中有严格约束:语气客观克制,结论必须有数据支撑,不能编造,不能夸大。

前端支持在不同模型视角之间切换,每个画像底部标注了生成模型、时间和数据来源,保持透明。

为什么让多个 AI 来写?一个 AI 的输出可能有偏差,但当多个不同架构、不同训练数据的模型都指向类似的结论时,可信度就高了不少。同时不同模型的表达差异,本身就挺有意思——有的模型更关注技术能力,有的更关注内容创作,有的会注意到生活方式这条线。

AI 视角画像生成流程

在博客里和 AI 版的我聊天

/about 页面解决的是「快速了解我」的问题。但如果读者想深入聊一个具体话题——比如「你用什么设备拍照」「你跑过哪些马拉松」「推荐几篇关于 Homelab 的文章」——一个静态画像页面就不够了。

于是我做了第二个功能:直接在博客和 AI 版本的我聊天。

技术栈

  • 框架: Vinext(基于 Vite 的 Next.js 重实现,部署在 Cloudflare Workers)
  • AI SDK: Vercel 的 AI SDKai + @ai-sdk/react + @ai-sdk/openai-compatible
  • LLM: 通过 OpenAI Compatible API 接入,支持切换任意模型(通义千问、DeepSeek、Gemini、OpenAI 等)
  • 搜索/RAG: 自建的 @luoleiorg/search-core 包,基于关键词匹配 + 权重评分 + 意图重排
  • 安全: IP 级速率限制(防止滥用)
  • 监控: Telegram Bot 实时通知,完整追踪 Token 用量和阶段耗时

工作流程

当读者在聊天框输入一条消息,系统的处理链路如下:

1. 搜索上下文复用判断

系统会缓存每轮对话的搜索上下文(10 分钟有效期)。如果是追问(比如先问「你跑过马拉松吗」,再问「成绩怎么样」),会通过以下步骤判断是否复用:

  • 追问检测:基于消息长度(≤48 字符)、标点符号、词数等启发式规则,快速识别可能的追问
  • 意图判定:调用轻量级 AI(1.5 秒超时,8 token 输出上限)判断新问题与上轮是否属于同一检索意图
  • 缓存复用:如果判定为同一意图,直接复用上次的检索结果,避免重复搜索

2. 并行搜索与关键词提取

如果不复用缓存,系统会同时启动两个并行任务:

本地搜索(即时):基于 @luoleiorg/search-core 倒排索引,使用 Intl.Segmenter 进行中文分词,并做 CJK 字符拼接修复(比如把「马拉」+「松」识别为「马拉松」)。搜索算法使用加权评分:

  • 标题匹配 +6 分
  • 摘要匹配 +4 分
  • 关键要点匹配 +3 分
  • 正文匹配 +2 分
  • 一年内文章 +1 分

深度内容提取:对于匹配度最高的文章(分数 ≥8 且显著领先第二名),会额外提取前 1500 字符的完整内容,让 AI 能回答更细节的问题。

AI 关键词提取(异步并行):如果是多轮对话且本地关键词不足 3 个,会调用 AI 从对话上下文中提取更精准的搜索关键词(3.5 秒超时,48 token 输出上限)。提取后会过滤 70+ 个中文停用词。如果 AI 提取的关键词与本地分词结果不同,会用新关键词再次搜索。

最终返回 6 篇最相关的博客文章 + 6 条最相关的 X 动态。

3. 意图重排

系统定义了 5 类意图分类:

  • AI/RAG:ai、rag、embedding、agent、llm、prompt、数字分身、向量、大模型
  • DevOps/Homelab:docker、k8s、nginx、cloudflare、openwrt、homelab、路由
  • 前端/全栈:nextjs、react、typescript、seo、vinext、前端、全栈
  • 摄影/旅行:摄影、旅行、东京、香港、京都、unsplash、马拉松
  • 生活方式:生活、消费、眼镜、医院、体验、投资、健康

根据用户查询内容识别意图后,对检索到的文章进行重排,按意图相关度评分:

  • 标题命中 +3 分
  • 分类命中 +2 分
  • 摘要命中 +2 分
  • 关键要点命中 +1 分
  • 一年内文章 +1 分

这样可以优先展示最相关领域的内容。

4. 分层 Prompt 构建

System Prompt 分为三层:

  • 核心身份:AI 人设定义、语言风格、交互原则
  • 核心规则(反幻觉协议):来源限制、数字协议、履历协议、链接协议
  • 运行时上下文:作者简介 + 相关文章/动态列表 + 用户查询

这种分层设计让提示词维护更清晰,也方便调整规则而不影响其他部分。

5. 流式生成与修复

AI 以 Streaming 方式逐字输出(temperature=0.3,max_tokens=2000)。如果检测到响应截断(以悬停标点结尾、Markdown 不平衡、句子不完整等),会触发一次轻量级修复调用(2.5 秒超时,80 token 上限),只补全最后一句,然后无缝拼接。

6. 全链路追踪

每轮对话结束后,Telegram Bot 会发送详细通知,包括:

  • Token 用量细分:输入 token、输出 token、推理 token、缓存 token(分阶段统计:关键词提取、主对话、响应修复)
  • 各阶段耗时:总耗时、关键词提取耗时、检索耗时(标注是否命中缓存复用)、Prompt 构建耗时、响应修复耗时
  • 引用内容:文章标题列表、推文标题列表

AI 数字分身对话流程

反幻觉:系统工程

做 AI 数字分身最大的挑战不是「让它说话」,而是「让它不乱说」。

大语言模型天生倾向于「编出一个看起来合理的答案」。如果有人问「你有没有去过冰岛」,一个没有约束的模型可能会非常自信地说「有啊,我 2022 年去过」,哪怕我压根没去过。

所以在系统提示词中,我设置了最高优先级的反幻觉规则:

  1. 来源限制协议——只能使用本次 Prompt 中的可见信息
  2. 数字协议——任何具体数字(金额、日期、成绩)必须在文本中出现,否则简洁承认没有记录,且同一轮对话中不得重复相同的表述
  3. 履历协议——工作经历只以「关于你」为准,没有记录时使用模板「这个细节我没在博客里记录」
  4. 链接协议——只允许引用提供的完整 URL,必须使用 Markdown 格式 [文字](URL),严禁裸输出 URL

这些规则配合 RAG 检索,让 AI 的回答始终有据可查。搜不到就坦诚说没有,比编一个像模像样的假答案好一百倍。

前端细节

聊天界面的一些设计:移动端全屏、桌面端居中弹窗;键盘 Enter 全局唤起;消息气泡区分用户和 AI,AI 头像带「AI」标识;3 秒发送冷却防误触;预设引导语轮播帮助用户开启话题。

当 AI 回复中引用 X/Twitter 动态时,前端会自动渲染成带有作者头像、互动数据的卡片,点击可展开查看完整推文。

每一次对话都会通过 Telegram Bot 通知到我手机,我能实时看到有多少人在和「AI 罗磊」聊天,聊了什么话题,引用了哪些文章,以及系统在各阶段花了多少时间、消耗了多少 Token。

它是我,又不是我

和自己的 AI 分身聊天,感觉挺奇妙的。

它知道我 2014 年跑了上海马拉松,知道我用 Cloudflare Workers 部署项目,知道我在 2016 年写过一篇关于信息自由的文章。它能推荐我写过的文章,能聊我的技术栈,能说出我用什么相机。

但它不是我。

这个 AI 版的罗磊,是基于我公开发布的内容训练出来的。公开内容天然有筛选和表达倾向——我在博客里写的是我愿意分享的部分,X 上发的是我想表达的观点,GitHub 上展示的是我选择开源的项目。那些没写出来的犹豫、没发出去的想法、生活中琐碎但真实的部分,AI 一无所知。

所以这个数字分身呈现出来的形象,一定和我真人的性格有差异。它可能显得比我更自信、更系统化、更「有条理」,因为发布出来的内容本身就经过了思考和整理。真实的我,可能比它犹豫得多,也随意得多。

这种偏差其实挺值得思考的。我们每个人在互联网上呈现的形象,本来就是真实自我的一个投影。AI 读取的是投影,重建的也是投影。它理解的是那个「在线的罗磊」,而不是完整的罗磊。

养成系的 AI 分身

做这个东西有点像养成游戏。

目前它的知识库还只覆盖了博客、推文和 GitHub。接下来我打算把 YouTube 和 B 站上的所有视频都处理一遍——先转成文字,再做分析和索引,然后继续「投喂」给这个系统。数据越多,它对我的理解就越完整。

不过说实话,我也有一些隐忧。

目前整个系统的 AI 能力依赖于大厂的 API 服务——通义千问、OpenAI、Gemini,数据传输到他们的服务器上处理。因为我喂给它的都是公开数据,所以隐私问题暂时不太担心。但如果未来想把更私密的内容也纳入进来,就需要认真考虑数据安全了。

另一个风险是依赖性。当你把自己的知识体系建立在第三方服务之上,一旦 API 涨价、服务下线、或者政策变化,整个系统就可能受到影响。这也是为什么我选择了 OpenAI Compatible 的接口标准——至少在模型层可以随时切换,不被单一供应商锁定。

最后

回到最开始的那个观点:在这个时代,主动构建自己的知识结构,远比被动等待 AI 来理解你更重要。

我的博客、推文、视频、代码,如果只是散落在互联网各处,它们就只是搜索引擎里的一条条索引。但当我主动把它们结构化、建立语义关联之后,它们变成了一个可以对话的知识体。

可以想象的是,随着 AI 大模型能力的持续增强,以后的上下文窗口会越来越大,多模态处理会越来越成熟。到那时候,做一个自己的 AI 分身,可能就像今天搭建一个博客一样简单。

这也许就是个人内容创作者在 AI 时代的一种可能性:不只是生产内容,而是构建自己的知识系统。让 AI 成为你的延伸,而不只是替代。


相关链接

🔲 ⭐

Neko Master: 从 0 到 1K+ Star 的 Vibe Coding 实践

🤖 AI 摘要

文章围绕开源自部署网络流量分析面板 Neko Master 的诞生与演进展开。作者作为 Homelab 用户,希望获得比 Clash 面板和 Grafana+Loki 更直观、美观的“流量感知”视角,于是在春节期间通过 Kimi K2.5 等模型进行 Vibe Coding,一小时内完成接入 OpenClash 的 MVP,并在四小时内上线首版,迅速获得 GitHub 与 Docker 的关注。后续项目从玩具版走向复杂架构,重点解决家庭 NAS/软路由环境下的稳定性与性能问题,包括:通过内存缓冲队列、批量写入、先聚合再写和写入限流,将 SQLite 导致的日写入量从 200GB 降到 1.6GB;在多 Agent、多网关场景下引入 ClickHouse,通过批量写入窗口、按时间分区与排序键建模、预聚合高频指标等手段,提升查询稳定性与响应时间。文章系统复盘了 Kimi、Claude Opus、CodeX、Gemini 在原型搭建、性能调优、架构重构中的分工,并强调“给 AI 视觉锚点”来提升 UI 审美效果。作者总结,Vibe Coding 极大压缩了从 0 到 1 的时间,但从 1 到 100 仍依赖人类对性能、架构、审美和用户需求的判断。

春节期间,我花了四个小时,从零开始 Vibe Coding 了一个网络流量分析面板 Neko Master,当天就上线了第一版。项目上线一周,GitHub 收获了 1000+ Star,Docker Pull 破了 10K。

项目最初叫 Clash Master,用了一周后改名为 Neko Master。原因很简单:不想跟 Clash 这个名字绑定太死,后来支持了 Surge v5+,未来也可能接入更多网关类型。

Neko Master 是什么?

一个开源、自部署的网络流量分析面板。

  • 多维流量统计(域名 / 节点 / 规则 / 地区等)
  • 趋势分析
  • 多后端支持(OpenClash / Mihomo / Surge)
  • Docker 一键部署
  • 移动端适配 + PWA

如果你家里也在用 OpenClash / Mihomo / Surge,欢迎体验。MIT 开源,欢迎 Star 和提 Issue。

从最初的「玩具」到现在拥有复杂架构的项目,这篇文章算是对整个开发过程的一个回顾和总结,分享一些 Vibe Coding 的实战体感。 如果只看第一版,它其实不复杂;真正的复杂度,是上线后被真实流量和用户场景一点点逼出来的。

为什么会有这个项目

我是一个 Homelab 用户,家里跑了一堆服务,分流策略比较复杂,日常开发也会频繁切换 IP。

其实早在 2024 年初,我就折腾过一次流量监控方案:用 Grafana 和 Loki 配合 Clash Premium 的 Tracing API,弄了一个监控面板。当时发了条推,说「能看看自己的线路流量什么的,其实也没啥用」。

luolei @luoleiorg · 2024年1月7日

用 Grafana 和 Loki,配合 Clash Premium 的 Tracing API,弄了一个 Clash 监控面板,能看看自己的线路流量什么的,其实也没啥用。 https://t.co/YhrjvpspIe https://t.co/3huqYdmg4r

Tweet image

🐦 在 X (Twitter) 上查看原文 →

但用了一段时间后,发现 Grafana 这套东西虽然功能强大,但对于家庭用户来说门槛还是太高了。配置繁琐,界面也不够直观,更关键的是长得不好看。原生的 Clash 面板更多是「运行状态」展示,但我一直缺少一个更直观的视角去看:

流量到底在干什么?

  • 哪些域名在吃带宽?
  • 哪个节点负载更高?
  • 深夜学习 AI 时到底哪个网站最耗流量?
  • 当前的规则策略是否合理?

市面上除了 UniFi 之外,其他统计工具的界面确实有些一言难尽。与其在不同工具之间拼凑数据,不如自己做一个更好看、更好用的「流量感知」的面板。

一小时打造 MVP

2 月 5 日下午,我打开 Kimi Code,使用最新的 K2.5 模型,开始 Vibe Coding。

没有画原型图,没有写技术方案,就是在脑子里先搭了个大概框架,然后直接跟 AI 对话。一小时不到,MVP 就跑起来了:部署在内网,监听 OpenClash 流量,能看到域名统计、节点流量,数据还能持久化。

luolei @luoleiorg · 2026年2月5日

我又来吹 Kimi K2.5 了。刚花一小时 Vibe 了一个 Clash 流量分析工具,完成度极高。部署在内网,监听 OpenClash 流量,实现域名、节点流量统计及 IP 归属地查询,数据持久化。我家的网络分流策略比较复杂,一直想找个工具感知流量状况,毕竟市面上除了 UniFi,其他统计工具的界面确实有些一言难尽。 https://t.co/RoLJbkaP53

Tweet imageTweet imageTweet image

🐦 在 X (Twitter) 上查看原文 →

当天晚上又花了三个小时打磨了一下,凌晨四点半,第一版 Clash Master 就上线了。

这个项目发布不到 24 小时,就收获了 GitHub 400+ Star,Docker Hub 1000+ 次拉取。这就是 AI 时代的开发速度。

让 AI 审美在线

这次开发 Neko Master,听到最多的评价就是「好看」,甚至有人在 V2EX 专门发帖,问 Logo 是怎么做出来的。问与答:《想问一下这种 logo 是怎么做的》

Neko Master 整体的 UI 属于现代 SaaS 风格,我自己也挺满意的。后面我还专门发了一条推,聊「如何让 AI 审美在线」。

luolei @luoleiorg · 2026年2月6日

昨晚随手 Vibe 的一个项目 Clash Master,不到 24 小时,收获 GitHub 400+ Star,Docker Hub 1000+ 次拉取。

图 1 是昨晚 Vibe Coding 的第一版,图 2 是现在的完全体。 前者 AI 味浓浓,后者审美基本达到 2026 年现代 App 的水准了。这就是 AI 时代的开发速度。⚡️

💡 分享一个 Vibe Coding https://t.co/9E1GM32EDZ

Tweet imageTweet imageTweet imageTweet image

🐦 在 X (Twitter) 上查看原文 →

图一是当晚 Vibe 出来的第一版,图二是几天后的完全体。前者 AI 味浓浓,后者审美基本达到了 2026 年现代 App 的水准。

很多人吐槽 AI 生成的界面「千篇一律」,说实话第一版确实如此。分享一个我实践下来觉得很有效的技巧:

不要只用文字描述「给我写个好看的面板」。要给视觉锚点。

具体做法:去 Dribbble / Figma Community 搜「Dashboard」,挑一张看着舒服的截图直接喂给 AI,告诉它「复刻这个设计感」。配色、卡片阴影、数据可视化风格,都可以用截图来锚定。

有了参考系,AI 的审美直接从「程序员风」进化到「SaaS 级」。

一个我越来越确信的感受是:在 AI 时代,代码的门槛在下降,但审美判断依然是决定成品质量的关键因素。 AI 可以帮你写代码、做布局、调样式,但「好不好看」这件事,最终还是得靠人来判断。

AI 工具复盘

这个项目开发过程中,我把市面上主流的几个 AI 编码工具都用了个遍。直接说结论:

工具角色体感
Kimi K2.5早期主力量大管饱,中文理解好,MVP 阶段 100% 主力,甚至没见过任何限额提示
Claude Code (Opus 4.6)硬骨头贵公子。一个复杂任务下去 4 小时限额 15 分钟直接见底,但遇到架构和性能深水区,只有它能啃
CodeX (GPT 5.2/5.3)日常输出5 小时循环用量非常扎实,开发过程基本碰不到小时限制的瓶颈,但周限量两天就用完了
Gemini 3 Pro辅助主要用来 Review 和写 Commit Message,质量偶尔掉线

一个真实体感:国产模型在初始化阶段已经足够高效,Kimi K2.5 是 Clash Master 诞生阶段的绝对主力。但当项目复杂度提升,面对数据库性能调优、架构重构这些深水区问题时,还是得靠 Claude Opus 4.6 和 CodeX 5.3 交叉 Debug。

一个额外体感是:模型不是越贵越好,关键看任务匹配。原型、重构、排障用的模型可以完全不一样。

Vibe Coding 的节奏:快速迭代与用户反馈

上线之后的两周,基本就是一个循环:发版 → 收反馈 → 修 Bug → 加功能 → 发版。 从 v1.0.2 到 v1.3.2,迭代了大约 20 个版本。

这个节奏下,AI 的角色不再是「帮我从零写一个功能」,而是变成了「帮我快速响应用户反馈」。 V2EX 上有人说磁盘 I/O 炸了,我把日志贴给 Claude,十五分钟定位到是 SQLite 单条写入没做批处理,连夜修了三个版本,I/O 从一天 200GB 降到了 1.6GB。Docker 镜像太大被吐槽,让 AI 帮我做多阶段构建,从 800MB 瘦到 300MB。

这个阶段的一个核心体感是:Vibe Coding 不只是「让 AI 写代码」,更是「让 AI 帮你加速整个反馈循环」。 用户提了个需求,你不需要花半天去查文档、写方案,直接跟 AI 说清楚上下文,几分钟就能拿到一个可用的 patch。这种响应速度,在开源项目的早期阶段是非常关键的——用户看到你迭代快,信任感就上来了。

技术细节

改名的同时做了一次比较大的架构升级,包括 Agent 分布式部署模式、ClickHouse 大规模分析后端等。 真正难的不是把面板做出来,而是让它在 NAS / 软路由这类资源受限环境里稳定跑起来。这里补几个最能体现复杂度的深水区问题。

1) 硬盘 I/O:从“硬盘灯常亮”到可持续运行

这个坑是最痛的一次。早期版本把每条流量记录都直接单条写入 SQLite,功能是对的,但在真实家庭网络里会触发严重写放大。用户反馈磁盘写入量吓人,我一看容器和主机监控,日写入量确实离谱。

核心问题不是 SQLite 本身,而是写入策略太“在线”了:高频事件 + 单条落盘 + 没有缓冲,I/O 自然爆炸。在 demo 阶段不明显,一上真实流量就暴露。后面连续几个版本做了三件事:

  • 内存缓冲队列 + 批量落盘(30 秒 flush,达到阈值提前 flush)
  • 先聚合再写入(热点统计先在内存合并,减少无意义小写入)
  • 写入限流和背压(高峰期优先保系统稳定,不让磁盘被打穿)

结果非常直观:

v1.0.2 -> v1.0.7 -> v1.0.9
200GB   -> 20GB   -> 1.6GB / day

这次之后我基本确定了一件事:AI 能快速把“能跑”的代码给出来,但 I/O 模型、缓存策略、背压机制这些基本功,必须由人把关。

2) ClickHouse:不是“接上就快”,而是“建模正确才快”

单网关场景 SQLite 足够,但多 Agent、多网关以后,域名/IP 维度的数据量会迅速上涨,查询复杂度也跟着上来。尤其是 TopN、时间趋势、规则命中这类查询叠在一起时,读写压力会互相放大。ClickHouse 引入后,第一版也踩了典型坑:小批次高频写入导致 parts 激增,merge 压力上来后,查询延迟会抖动。

后面重点做了几层优化:

  • 写入侧:统一批量写入窗口,避免 tiny insert 把 MergeTree 打碎
  • 存储侧:按时间分区 + 按常用筛选维度排序,热点列做低基数字典化和压缩
  • 查询侧:把仪表盘高频指标(Top 域名、节点趋势、规则命中)前置到预聚合层,接口优先读聚合结果
  • 迁移侧:保留 SQLite + ClickHouse 双写,先灰度再切换,避免一次性迁移风险

这套优化做完后,收益不只是“更快”,而是“更稳”:高峰时段的查询波动明显下降,面板体验从偶发卡顿变成可预期的稳定响应。这也是项目从“能跑”走向“可维护”的分水岭。

3) AI 在深水区的正确使用姿势

深水区里,AI 最有效的用法不是“一次性生成”,而是进入工程化闭环:日志与指标 -> 假设 -> patch -> 压测/对比 -> 继续迭代。 我在这个项目里基本就是让 Kimi 快速铺功能,用 Claude/CodeX 啃性能和架构细节,然后自己做最终取舍。AI 把迭代速度拉高了,但稳定性边界和技术债优先级,还是得人来拍板。

如果你对完整架构感兴趣,GitHub 仓库里有完整的架构文档和部署说明

写在最后

Vibe Coding 确实改变了我的开发方式,过去需要一两周的原型,现在几小时就能跑起来。但有一个东西 AI 替代不了:从「能跑」到「好用」的那段距离。

200GB 的写入 bug 是 AI 写的,但发现问题、定位瓶颈、设计缓存策略是人做的。界面从「AI 味」到「SaaS 级」,靠的不是更好的 prompt,而是你自己对美的判断。Agent 模式的架构设计,来自对真实部署场景的理解,不是 AI 能凭空想出来的。

Vibe Coding 降低了「从 0 到 1」的门槛,但「从 1 到 100」的路,依然需要经验、审美和对用户需求的理解。

🔲 ⭐

实现 AI 自由:我为未来准备的 4 个数字通行证

🤖 AI 摘要

文章开头指出近两年 AI 技术和产品高速发展,中国本土大模型已处于世界前列,但在实际使用全球优秀 AI 服务时,许多用户仍面临各种门槛与限制。作者以资深开发者身份,自述曾通过 Vibe Coding 上架商业应用,亲身感受到“数字基建”在 AI 时代已经成为新的生产力基础。基于这一体会,作者提出将分享自己为未来准备的 4 个“数字通行证”,意在从基础设施或账号、工具层面,为读者提供更完善的数字环境配置思路,以便更顺畅地接入海外与本土的 AI 产品和服务,从而提升个人在 AI 时代的学习、创作与工作效率,逐步实现所谓的“AI 自由”。文末通过外链视频与推文卡片扩展内容,方便读者进一步了解细节与实践路径。

视频

过去的两年, AI 日新月异,很幸运我们很多国产大模型和产品都已经站在了世界前沿 🚀。但不可否认,在探索全球优秀 AI 产品和服务时,依旧有很多朋友被挡在了门外。 作为一名资深开发者,去年我靠 Vibe Coding 上架了一个商业应用。

深感在 AI 时代,数字基建就是我们的生产力。今天分享 4 个我的数字通行证,希望大家都能实现 AI 自由。

luolei @luoleiorg · 2026年2月4日

https://t.co/Ik3xItwco9
过去这两年, AI 日新月异,但现实是,依旧有很多朋友,由于信息差、单向或者双向的门槛,被挡在世界上最先进的 AI 门外。拍了一个视频,分享 4 个让我无障碍使用全球 AI 的数字通行证,希望大家都能在 2026 年实现 AI 自由。🚀

🐦 在 X (Twitter) 上查看原文 →

🔲 ⭐

技术进步首先需要的是勇气

而不是鸡贼耍流氓。

看到转载的新闻内容:

美国电影协会发表声明:称字节跳动旗下最新视频模型Seedance 2.0存在版权侵权行为。
一个爱尔兰导演,用seedance2.0让汤姆·克鲁斯和布拉德·皮特在屋顶打了一架。
MPA代表迪士尼、Netflix、华纳、环球、索尼、派拉蒙、Apple TV+,七家联合发声要求立即停止,集体发律师函。
今天,迪士尼单独又发了律师函,说Seedance里直接预置了星球大战和漫威的素材库。SAG-AFTRA代表16万演艺工作者跟进,谴责未经授权使用成员肖像和声音。

下面的回复包括:

技术是无法阻挡的。
贱人矫情。
对我们程序员来说,最大的荣誉就是自己写出的代码被很多人复用,我们讲开源。希望文娱工作者们也向我们程序员学习。
对于大众娱乐品来说版权这玩意是个双刃剑。因为版权限制而只能在有限平台上付费阅看播放或销售会导致大量优秀但没什么资源的初创品根本无人问津。你都没有传播热度哪来的大众娱乐?包括小说漫画音乐影视游戏在内的全娱乐品类都只有平台和极少数头部在赚,中部挣扎在生死线上被平台盘剥,而大部分的底部只是没人看得到的基数。版权的初衷是为了让创作者得到应有的鼓励回报,但现在的版权制度和司法执行我觉得已经扭曲了这个初衷,获益的都是中间商而不是创作者。
我很不理解好莱坞的逻辑,版权保护的是收益权,只要个人创作者无法靠抄袭某个角色获得收益,充其量也就是二创,粉丝进行二创是帮助ip获得更大关注度的,是有利于后续正版周边产品圈钱的。seedance再智能也只是个工具,二创能用一创也能用,这本来应该是双赢的事情。
我记得米哈游是明确支持二创的,原神的语料也被MNBVC语料集收录开源,甚至之前他们还提过想给我们点奖励什么的。好莱坞固步自封,那么后面就别怪被其他Seedance友好的ip占领市场。

版权的问题如果简单几句新事物一定会消灭老事物,技术进步不可阻挡,早就不会有这么多争议了。

软件讲开源,也没见所有程序员全部作品都开源。
是否参与开源运动,允许作品开源,是靠自己选择,而不是违背作者的意愿。
舔着脸去拿作者没有开源的代码,会被开源社区唾弃。

粉丝二创有没有好处,那也得是创作者自己来判断。
创作者不允许二创,最终导致影响力下降,市场竞争力下降,是他自己选择的结果,他愿意接受这样的结果,旁人无权代为选择,何况有的二创直接盈利了。
你凭什么说所有允许二创的一定都比不允许的发展更好?每个人都可以有自己的判断。
不能说你主观认为有好处,就觉得人家必须同意——那我还觉得拿你的钱去消费是帮你摆脱资本主义消费陷阱,帮你净化心灵呢,你干不干?

还有,版权的受益方既有平台和中间商,也实实在在保护了创作者的权益。
之前OpenAI未经许可使用斯嘉丽约翰逊的声音,演员本人非常愤怒,不仅是金钱利益的损失,更事关人格尊严的侵犯。
这次知名演员的肖像和声音也都被未经许可而使用,作为肖像权的受益方,演员的利益受损不可忽略。
你可以抱怨说现在平台和中间商攫取了太多版权收益,但那是他们和演员之间的博弈,不能成为彻底无视版权的好理由。

说支持技术进步,只是因为你是受益者而非受害者,要是发明一种随意侵入他人银行账户转钱的技术,是不是发明人也可以声称这是不可阻挡的技术进步,银行和存款人是阻挡技术进步的保守派?

技术进步不是发明新的东西之后,全都能毫不留情地碾过、摧毁并抛弃一切旧的事物,那种东西叫做历史神话,拿部分案例当作必然普遍规律骗别人可以,不要把自己给骗了。
站在过去历史已知的现代,认为已经成功替代旧事物的新事物是历史必然,而看不到无数失败的新事物,这是一种历史叙事的狂妄,新事物并不天然具有先进的属性。
新的事物不恒等于进步,这个道理应该不难理解,也不乏历史上的各种案例,最终是要发展到新的利益博弈的平衡,而不是只站在一边标榜进步。
不想谈道德,只谈利益,却又无视他人的利益以及保障自身利益的权利,这就是耍流氓。

人不是容器里面可以瞬间销毁重建的实例,也不是随时可以删掉、格式化的代码,人有维护自我利益的能力和求生本能,不是以技术进步为理由,就可以无视这一过程中被损害的人的代价——何况就连是不是进步也要看有多少人、是哪些人受益和受害,有可能你现在以为是进步的活动在以后看来有巨大危害。

虽然我也经常嘲笑卢德主义者,但卢德主义者们要维护的个人利益是实实在在的,比技术进步的狂热鼓吹者试图无视被损害的个人起码要现实得多。这些被损害的个人也许做不到阻止真正有前途的技术持续进步,但至少有一定的议价能力——或者说破坏能力,让技术进步的鼓吹者无成本转移代价的方案破产。
因为相信“任何技术进步都是历史必然”只是一种信念,如果技术进步不能普惠,会踢掉人饭碗,必然会遭遇反抗,不是你想忽视和否认就能够避免——断人财路还幻想全身而退,天下哪有这么便宜的事?怕不是在对技术进步的顶礼膜拜中忘乎所以了。

新技术从产生到普及,最终替代旧事物,需要的不仅仅是创新的智慧,更需要改变旧世界的勇气,这勇气不是牺牲他人的豪迈,不是寄希望于被伤害者相信“技术进步不可阻挡”的叙事于是甘愿配合束手待毙的一厢情愿,而是敢于直面冲突,把旧世界的抵抗看作理所当然,坦然接受而不是时刻想着转嫁成本的勇气和自信。

🔲 ⭐

主流不是排斥的理由

在里屋论坛转载的一篇关于不结婚话题的帖子下,有人回复:

结不结婚生不生娃要不要彩礼养不养自己爹妈都是个人的选择
有选择就有相对的好与坏
不管做出什么选择都应该对自己的选择负责并承担相对应的后果和影响,是为成人
不被“主流”承认的思想和行为,自然要被“主流”所排斥,到地球的哪个角落都一样

印象中已经不是第一次看到这样的言论了,觉得有些话不吐不快。

看到前面一半,说每个人都有个人的、相对好坏的选择,还以为接下来的意思是没有绝对的、统一价值的选择,所以我们应该尊重每个人自己的选择。
没想到是我天真了,原来真正的意思是,既然每个人都该为自己的选择承担后果,那么被“主流”排斥是很自然的后果。
这种“自然”,我的理解是,既表达了这是客观的后果,也包括认可“主流”排斥的态度——既然选择了和“主流”对着干,那遭到排斥就是活该了。

但这种态度其实隐含了一个基本前提,就是认为“主流”思想必然是追求统一和排他的,一定不会容忍“非主流”的观念,两者是你死我活、不共戴天的关系,任何“非主流”思想的存在和活跃本身,就是在反对“主流”思想一统天下,因此必定会遭到“主流”思想的排斥。

但对不认同这一前提的人来说,“主流必然会排斥非主流”并非不证自明。存在主流思想,并不意味着它必须以排斥非主流为代价;恰恰相反,许多稳定的主流正是通过容纳差异、宽容异端而维持其合法性和生命力。比如科学共同体对异端思想、少数派理论、离经叛道的解释并不会赶尽杀绝,反而保留和促进了新的科学成就和科学范式的成长;比如市场竞争不仅只有弱肉强食,也有警惕、限制滥用垄断地位和鼓励非主流企业多元创新的环境。

任何人都曾经是非主流的一份子。任何现在被视为理所当然的主流观念,几乎都曾是少数人的非主流选择。
我们这一代人小时候,被视为洪水猛兽的日本漫画、电子游戏,曾经也是非主流,现在ACG、二次元等各种亚文化早就在年轻人中普及;
港台和西方流行歌曲曾经被视为靡靡之音,交谊舞、摇滚音乐也被主流批评为带坏年轻人;
上一代人经历过的家庭联产承包责任制等改革开放的措施,取消正常经济买卖和前卫的亲热行为入刑的观点,曾经也是非主流;
后来的各种互联网基础服务、在线支付、智能手机、移动支付,曾经也是非主流;
至于什么杀马特、葬爱家族、火星文、网络俗语和烂梗等“正宗”非主流,也只是被嘲笑而非取缔;
站在现在看历史,我看到更多的是,正因为社会主流没有永远维持禁锢、窒息的氛围,让非主流的思想和行为有了喘息和生长的空间,才让越来越多的非主流纳入社会的主流,改变社会的主流。

“主流必然会排斥非主流”这种想法,是未经论证就将个人的有限经验当成了放诸四海而皆准的真理。这大概只能说明,他所认知的“主流”都必然排斥“非主流”思想,也就是说,他自己从未感受到过自由而宽容的社会主流思想——也许存在过,但他没有体验过,或者即使体验过也没有认知到。

不仅如此,他还将这一有限的经验还上升到“排斥非主流是正当、合理”的道德判断。但这就像误读“存在即合理”,然后为已经存在的事实做道德辩护一样,缺少足够的理由。
优先于主流与非主流分歧的,是更基础的个人是否有自由选择的权利。从个人的角度出发,首先考虑的是界定个人权利的边界,然后探讨人与人之间因为不同的选择会有哪些利益冲突,再讨论社会应该如何平衡收益与成本,如何补偿权益受到侵害的个人。在这一过程中,没有什么是天然正当、合理的,一切都在流动中博弈。
同样是属于主流的不同个人,对待非主流的思想都可以有不同的态度,有的是坚决反对,有的仅仅是不主动支持,有的是宽容,有的是赞同,也可以像解放奴隶、建立公民社会、争取平权、保障言论和财产权利等等,主流最终倒向非主流思想,绝非只有唯一一种完全倒向主流的“正当、合理”的道德判断。

而他却是从社会主流的角度出发,认为他所认知的非主流,没有讨价还价的余地,必然会遭到所有主流人士排斥,而且这种排斥绝对正当、合理。
在此道德判断中,他偷换和转移了责任,将他人的排斥包装解读为这是选择带来的自然后果,是社会主流的必然反应,从而将所有道德责任全部推给被排斥的人。
看似是谈个人选择要承担对应的的责任,实际上预设了“非主流的个人应承担被排斥的全部责任”的立场,而这一“社会主流”又可以是任何他的狭隘、有限认知中的主流,这种从根本上否定了个人自我维护权利正当性,也否认其他抱持主流态度但宽容非主流的意见的逻辑,根本就不是个人立场的逻辑,而是擅自以社会主流代言人自居的君主逻辑,必要时可以为任何假借社会之手吞噬个人的恶行辩护。

这就像是一个生来只作为奴隶生活过的人,看到的从来都是主人对奴隶的残酷对待,并虐杀敢于反抗的奴隶,以及认为此行为完全合理的制度,从来没有见识过,人与人之间可以自由、平等相待,甚至可以报以爱与温柔,受奴役的人应该有自我维护的反抗权利,于是得出结论说:
主人虐待奴隶是天经地义的主流;反抗主人这种非主流行为,换来虐杀的结果也是个人选择的自然结果,放在哪里都成立。

我不会觉得他的话有道理,只会认为,这是一个站在奴隶主立场的可悲奴隶。

🔲 ⭐

さよなら2024、こんにちは2025!

又是新的一年了,最近放寒假,终于能抽出时间来总结一下2024年、再展望一下2025年!


さよなら2024、こんにちは2025!

さよなら2024!

前言

2024年对我个人来说,是转变极大的一年。

在这一年,我彻底放弃了程序员的职业,转而回家考取体制内,最终在八月份成为了一名家乡大专的计算机专业的老师。

除了职业上的转变,实际上也包含了心态上的转变。

在2024年的上半年,实际上花了很长时间继续去做一些技术上的突破,比如:

  • 学习了一些数据存储的格式,例如:bamboo;
  • 学习了分布式系统相关的时钟逻辑,也用 rust 实现了一个:merkle-trie-clock;
  • 学习了 CRDTs 相关的内容,用 rust 写了一个简单的 CRDTs 的demo;
  • 看了数据库内核的相关实现,打算尝试去写一个基于 CRDTs 理论的分布式数据库;
  • ……

但是,后面发现对于技术的热情实际上是有所下降的。

与其说是对于技术的热情有所下降,不如说是更多是想分享知识,而非单纯的研究技术;


当然,除了研究技术之外,上半年也准备了一下考试。

别忘了,我是学电气工程出身的!

为了准备相关的考试,又重新复习了一下电气工程的相关书,包括:

  • 电网招聘考试书
  • 注册电气工程师
  • 原来本科的书
  • 行测等
  • ……

电气复习.jpg

最后也是通过笔试第二、面试第一成功选择了学校的岗位。

有些人可能会奇怪,电气工程专业为啥当上了计算机的老师;

实际上我在去学校报道的时候,正好碰到了计算机学院的院长,然后就被拉到了计算机学院😁,巧了!


学校生活

八月份入职之前,其实提前准备了一些教师相关的东西,比如:

  • 如何备课
  • 如何上好一门课
  • 上课期间站姿、手势、仪态等等

但实际上刚入职的老师会被要求担任辅导员;


辅导员

作为初入学校的「しろうと」来说,辅导员的挑战实际上是有的。

对于2024年新入学的学生来说,大致是在06年出生,和我相差大概10岁左右。

但是实际上,辅导员算是一个半管理岗位,为啥说是“半”呢?

因为,每天一睁眼,几十号人的吃喝拉撒基本上都要你管!

但是实际上会有些紧张,这个紧张一方面是:和一群「歳下」 的孩子们接触:

  • 如何和这些同学接触?
  • 如何融入学生?
  • 进一步,如何管理这些学生?(达成共识?解决冲突?)

实际上,这些工作和程序员的工作思路是完全不同的事情!

另一方面是:如何正确的引导这些学生?

  • 思想上
  • 三观上

我自以为,老师和其他相关的职业有一个很大的不同在于:

一个好的老师真的可以拯救学生,而一个不负责任的老师真的也能毁掉无数个学生

我自认为自己还算是一个做事负责任的人吧!

实际上你的言行真的会影响到很多学生、尤其是刚刚成年的学生未来的三观。

但是对于如何做,实际上当时我是毫无头绪的!

但是当时我给自己定下了一个最低的底线:

  • 一定不要成为自己最讨厌的那种老师!

现在看来,这个底线实际上也并不低!


首次接触学生

我第一次接触学生实际上是在新生报道之前。

因为我之前是程序员的缘故,接触过不少云计算相关的内容,所以我的导师王老师让我来带一带竞赛的学生;

实际上这个决定让我首先小范围的接触了几位同学;

对我后面工作的开展获益匪浅;

所以,在还没开学之前就了解了目前这个年龄段的学生脑子里想的是什么,学生的层次、一些学校的规则制度、运行模式等等。

同时也能够小范围的先锻炼锻炼自己的表达能力…

关于竞赛的事情,后文再继续聊~


迎新活动

当新生辅导员的第一件事实际上是为全班的新生建群。

好在我带的班学生都比较积极,基本上一天之内就建好了!

到了24级正式开学的时候,实际上今年一共招了将近900号学生,要对这些学生进行信息采集、确认;

当时在学院楼外面坐了整整两天,说话说的嗓子都要哑了,最后也是顺利的把这些熊孩子给安置好了。


第一次带军训

迎新结束之后,马不停蹄的就是学生的军训;

比起我当年的军训,个人觉得00后的军训强度要低太多了;

可能是身体素质整体都下滑,军训还没开始,刚刚站了十几分钟就已经有晕倒的了。

我带的班,军训的两个星期也是请假无数……;

总而言之,身体素质在00后这一代真的堪忧……。


第一次班会

在军训期间,要开一个班会,和班里的同学都见见面。

这也是我第一次以辅导员的身份站在讲台上;

其实刚开始还是有些紧张的,毕竟下面坐着几十个完全不认识的熊孩子;

需要做的实际上是提前准备班会的内容,可以先记在笔记本上,然后带过去讲就行;

后面发现,站上去之后讲的挺自然的,就不紧张了…

当然,现在在上面时间长了,早就没什么感觉了…


第一次出差

在九月底还没到十月份的时候,接到了通知要带几个学生去开封参加比赛,这也是我第一次带学生外出比赛;

比较好的是,来回的路途是由市政府安排的专车接送,所以不需要提前订票了;

但是当时的酒店我们希望能拼房,所以出来不小的问题,就是和我们拼房的人提前3天走了,导致我们无房可拼;

不过后面也是找到了开封市的人社局给解决了;

本次比赛的成绩可以说是非常惨淡:参与了3个赛项,无一获奖!

实际上一个比较关键的原因是:竞赛的学生基本上都是靠自己自学,而没有老师带!

这些学生会浪费大量的时间在寻找学习材料和学习路径上,这是很可怕的事情!

这也让我感受到了,学校的竞赛之路,任重而道远啊!


一些其他的碎碎念

除了上面的事情之外,实际上还有很多其他的事情,下面就简单列出一部分:

  • 学生宿舍值班
  • 学生日常请假管理
  • 学生心理问题排查
  • 班级活动组织
  • ……

最后想再说一下:

我最开始以为,来到大专的学生大多数是对学习毫无兴趣的学生;

但是后面接触之后我发现,实际上这里大多数学生都来自农村、乡镇(至少我班里只有4、5个是城市户口);

他们先天就没有特别好的教育环境。

以我带的竞赛的一个学生为例:这个学生白天的时候要去干农活、晚上在家做完饭之后,才能抽出时间来学习云计算;

我当时听完之后感觉到挺不可思议的。

当时我还戏称自己是“上山下乡”……


教学

竞赛培训

作为一个老师而言,其实最基本的一个工作就是讲课;

分享的经验实际上在之前当程序员的时候是有的,当时有大量的技术分享会,而且我也参与过一次线上的直播分享;

但是实际上对于这些学生的水平,我是拿不准的,不知道这些学生对于知识的掌握程度,这个是很致命的!

好在有个学生掌握的还可以,但是没有老师带,实际上还是挺吃力的,一直在自己部署 OpenStack,对于 Docker、K8S 都不知道是什么;

我也是从 Github、git、一路讲到 Docker!

实际上,如果真正感兴趣、用心学的学生,他的学习能力是惊人的!

最后也是拿了省二等和国家三等奖的成绩。

实际上这个成绩只是个开始,后面还要继续努力!


第一次试讲

关于这个试讲,这里说一下。

新入职的老师是不会直接参与讲课的,只有通过了:教研室、系部、学校,三个阶段的试讲才能上课。

试讲的内容是自己选择一门最拿手的课程,然后进行无生试讲,大概 15 分钟左右。

我的试讲内容实际上是云计算,讲的 Docker。

由于没有什么经验,同时备课准备的实际上不是很充分,所以课讲的稀烂……

甚至讲课的状态是我最讨厌的念 PPT 的方式……!

当时主任给我提了很多很实用的整改意见,我这里大概总结了几条:

  • PPT 的内容应该少文章多图片,这样比较生动;
  • 讲课的时候应该多举一些生活中的例子,而不只是念ppt的内容;
  • 在讲的过程中,声音应当抑扬顿挫,有节奏,类似于唱歌;
  • ……

这里非常感谢主任给我提的这些意见,让我在后面找到了讲课的方向,慢慢摸索出了如何讲课!

实际上还有另外一个问题,就是:当时我刚来的时候就是给参与竞赛的学生讲,但是这些学生实际上水平、学习热情是远远高于一般的学生的!

实际上这也导致了,后面在真正上课的时候,一开始上课的内容实际上学生并不能很好的掌握(甚至部分学生别崩溃)!

后面,由于第一次试讲讲的并不是很好,所以后面又陆陆续续讲了几次试讲,进步其实是很明显的!


新生分享、社团分享

在第二次试讲之前,为了锻炼一下自己的讲课能力,参与了一些其他课程的讲授。

主要是几次的新生分享:

第一次是给24级新来的计算机专业的新生讲解目前一些新的主流技术,比如:云计算、大数据、人工智能相关的内容;

第二次是给学校的本科学生讲解:大学时间规划、考研等相关的内容;

相比于第一次分享,第二次是受到学校的另一个学院的院长邀请,形式上也比较正式,是在学校图书馆一楼的报告厅,大概有几百号学生参与;

实际上准备的并不是很充分,但是不知道是不是因为讲的都是自己的经历,反而没什么可紧张的,讲的过程也很顺利。

实际上,在台上看到下面坐着的许多学生心里还是几多感慨:

大概十年前,我和他们是一样的迷茫,不知道自己何去何从,不知道自己要干什么……

所以当时,上台之前,我想做的实际上就是分享自己的经历,包括好的和坏的。让这些学生有所借鉴,能走出属于这些孩子自己的一条路!


同时,由于我是学校计算机社团的指导老师,在后面也给社团讲了一次课(大概2个小时的时间)。

主要是分享(或者说科普)一些计算机相关的内容。

来参与的学生实际上并不只是计算机专业的学生,但是除了基础的 Python 之外,我还是讲了一些其他的内容。

比如:

  • 人工智能的基本使用方法;
  • Github 网站
  • 一些写代码的工具
  • ……

基本上每次分享,我都要讲上面的一些内容;

尤其是 Github,我觉得如果从事计算机专业,这个网站是必须要知道的!

但是国内很多高校的学生,甚至到毕业都不知道这个网站!

个人觉得,学会并使用 Github 是从事计算机行业最基本的一项内容!


第二次试讲

第二次试讲来的比较匆忙,从通知到试讲实际上就间隔了两三天时间。

并且由于和之前第一次试讲间隔了太长的时间,实际上之前试讲的内容都忘的差不多了。

好在 “瘦死的骆驼比马大”!

所以最后还是顺利的拿下了。

当然,当时院长也提出了不少的意见,比如:

  • 讲课过程中,动作太多,一直来回走
  • PPT 的标题不统一
  • ……

紧急代课!

十一月底的时候,由于有一位老师提前走了,他这学期有两门课需要我临时带,所以强度突然上来!

当时是周五的晚上通知我,下周一就要上课了!

由于是第一次正式上课,很多规矩都还不清楚,而且当时是临时代课,还不知道之前的内容。

所以花了一些时间将要做的按照先后顺序事情归了一下类:

  • 添加原来的老师、班委,询问课程进度
  • 拿之前老师的教学资料
  • 提前备课
  • 询问上课的流程(包括如何签到、课前的点名、下课的内容等等)
  • ……

比较巧的是,我带的其中有一门课,在还没开学的时候,提前备过课,所以可以直接拿过来讲。

所以第一节课实际上马马虎虎,没有讲什么具体的操作内容,主要是对大数据的技术做了一个科普。


但是后面的课程实际上是出了一些小状况的:

1、由于这些学生之前的基础没有打好,所以导致我在讲课的时候,班里一大半的学生根本不知道如何实操!

实际上,使用到的都是一些非常讲的的 Shell 命令!

对于我之前带的竞赛的学生来说是非常简单的,但是对于来上课的普通学生来说,感觉比登天还难!

所以后面又先带着“复习”了一下 Linux 的内容。


2、另外一个状况是:在机房里面,实际上是没有部署相应的软件的,所以学生没办法跟着一起练习!

所以,我专门抽了一个下午的时间,做了一个 VMWare 的镜像给到学生,让学生们可以直接通过这个镜像练习!

最开始我做的是一个无图形界面的系统,但是发现这些学生不会用……

所以没办法,又做了一个 Desktop 版本的……

不管怎么样,最后也是把课、期末考试、教学材料跌跌撞撞的走完了!

虽然比较生涩,但是确实把:

  • 如何上课
  • 如何设计课程
  • 如何设计期末考试
  • 如何整理教学材料
  • ……

在高强度之下快速的摸清楚了!


第三次试讲

第三次试讲是由学校来组织的,来参与的都是新老师,但是还是收获满满。

我由于之前的很多经历,准备的比较充分,所以没什么可紧张的。

但是,在听其他老师试讲的过程中,实际上发现自己和他们还是有非常大的差距的!

尤其是有几个音乐专业的老师,讲的生动形象,我和他们比起来可以说是相形见绌……

并且,我在试讲的时候,写板书写了一分多钟,被评委给吐槽了……


一些工作上的总结

一些心得和分享

上面是半个学期的一些工作内容。实际上,除了上面列出的一些工作之外,还有很多其他的工作没有列出来。

可以说,虽然是一个新的老师,但是工作还是非常充实的!

下面列一些我觉得这学期工作的时候,比较实用的一些技巧和心得。


待办清单(小米云服务)

这个是我目前为止,基本上离不开的一个东西!

因为辅导员的事情实际上是非常多的,基本上每次开会都要安排十几件事情!

如果没有个待办清单,很多事情都会忘掉!

我之前尝试过一些其他的 TODO 应用,但是感觉还没有小米自带的好用。

小米的待办清单在 Windows 上有 MIUI+ 可以同步,但是我用的是 Mac,没有这个软件。

但是有一个 小米云服务,所以可以曲线救国,用这个!

这里面唯一一个我用的功能就是待办清单!

顺便吐槽一下,MIUI+ 说了好多年适配 Mac 了,到现在还没有做出来……


和学生打交道

有的人可能会对辅导员这个职业比较抗拒,但是实际上我倒是觉得这是为数不多比较暖心的工作了…

可能是因为我和这些孩子们的年龄差距不大,所以并没有那么多代沟,所以沟通起来还是比较轻松的。

而且也都经历过学生时代,对于这些学生心里是怎么想的、比较反感的东西实际上是一清二楚的。

当时给自己定的目标就是:

  • 从群众中来,到群众中去!
  • 学生们的事情尽量身体力行的去做!
  • 不要成为自己讨厌的那一类辅导员!

基本上每周六晚上我值班的时候,都会和班里的学生打打篮球。

然后时不时的在班级群里吹吹牛啥的,也挺欢乐。

但是确实,有的事情确实是没有办法,dddd……


讲课

对于讲课来说,是一个老师的基本功。

一个感受比较深的点就是:

一定要备课!

一定要备课!

一定要备课!

不备课的课和备过课的课上起来是完全不一样的!

备课的时候,主要是记一下这节课的主要大纲,有哪些重点难点什么的。

然后就是提前准备一些和课程有关的例子,如果不熟悉可以提前先打印出来,然后用笔标注一下。

认真备课之后,讲出来的东西可能才是你想要表达的;

如果不备课,虽然很多东西都是你用到的很基础的内容,当时实际上有的时候也很难讲出来!

我刚来学校的时候,主任和我分享的一句话就是:

备课实际上是备学生,你要了解你上课的班的学生的整体状态!


需要继续加强的地方

首先就是做事方面:

很多事情不懂得推脱,基本上只要有能帮忙的地方,都会去揽活来做,把自己搞得比较累。

有些时候如果自己比较忙,实际上是可以拒绝的!


另外就是讲课方面:

基本上现在很多课程都还需要很长的时间备课,同时讲课的能力方面实际上还有很大的进步空间。


心态方面:

很多事情在做的时候,还是会比较急,心态容易出问题。

这可能在未来的工作中还需要进一步沉淀沉淀!


こんにちは2025!

聊完了已经过去的 2024 年,下面是我对于 2025 年的一些规划:

  • 证书:

    • 高校教师资格证 + 普通话证

    • 通过软考中级(软件设计师)

    • 日语N2证书

    • 雅思证书(待定)

  • 跑步:

    • 年跑量 1000km
    • 参加一次半马
  • 旅游:

    • 去一次日本旅游
  • 购物:

    • 40系 N 卡
    • 佳明 255 跑表

内容可能不是很多,但是是一些目前我能够想到的东西;

如果后面有新加入的内容,也会再加进来!

最后,祝愿各位在新的一年都能顺顺利利,无限进步!

今年も、よろしくお願いします!


🔲 ⭐

多机多盘 minio 集群不同纠删码配置在 IPoIB 下的性能测试

前面测试的发现瓶颈在网卡,本篇在 IPoIB 下进行补充测试。 1. minio 集群环境 1.1 创建 minio 集群 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 export CONTAINER_CLI=nerdctl export IMAGE=minio/minio:RELEASE.2025-04-22T22-12-26Z export ROOT_USER=minioadmin export ROOT_PASSWORD=minioadmin export MINIO_ERASURE_SET_DRIVE_COUNT=16 export MINIO_STORAGE_CLASS_STANDARD=EC:4 export POOL_0="http://minioib{1...4}/mnt/data{0...3}" $CONTAINER_CLI run -d \ --net host \ --ulimit memlock=-1 \ --ulimit stack=67108864 \ --ulimit nofile=1048576:1048576 \ --memory-swappiness=0 \ --name minio \ -v /mnt/data0:/mnt/data0 \ -v /mnt/data1:/mnt/data1 \ -v /mnt/data2:/mnt/data2 \ -v /mnt/data3:/mnt/data3 \ -e "MINIO_ROOT_USER=$ROOT_USER" \ -e "MINIO_ROOT_PASSWORD=$ROOT_PASSWORD" \ -e "MINIO_ERASURE_SET_DRIVE_COUNT=$MINIO_ERASURE_SET_DRIVE_COUNT" \
❌