Token 是什么:大模型计费和上下文管理的底层逻辑

Token是怎么来的:大模型计费和上下文管理的底层逻辑 大家好,我是极客老墨。 上一篇讲大模型工作原理时,Token 出现了很多次。这一篇专门把它讲透——不是因为概念难,而是因为它的每一个细节都直接影响你的 API 账单和代码行为。 成本超支、上下文莫名截断、多轮对话"失忆"——这些新手最常踩的坑,根子都在 Token 上。 一、Token 是什么:BPE 分词不是按字切 Token(中文翻译定义为“词元”) 是大模型处理文本的最小单位。但很多人对它有一个根本性的误解:Token 不等于字,不等于词,更不等于汉字。 主流大模型(包括 DeepSeek)使用的分词算法叫 BPE(Byte-Pair Encoding,字节对编码)。它的逻辑是:从字节出发,统计语料中最高频的字节对,反复合并,最终形成一个包含几万到十几万个"子词单元"的词表。 结果就是:Token 的边界是由训练语料的统计规律决定的,不是人为规定的。 # 英文示例(DeepSeek tokenizer) "developer" → ["developer"] # 1 token(高频词,整词入表) "tokenization" → ["token", "ization"] # 2 tokens(低频长词,拆分) "DeepSeek" → ["Deep", "Seek"] # 2 tokens(专有名词) # 中文示例 "大模型" → ["大", "模型"] # 2 tokens("模型"是高频词组) "量子纠缠" → ["量", "子", "纠", "缠"] # 4 tokens(低频,逐字) "API" → ["API"] # 1 token 中英文的核心差异: ...

2026-05-06 · 6 min · 1085 words · 老墨

大模型是怎么炼成的:从训练数据到你手里的 API

大模型是怎么炼成的:从训练数据到你手里的 API 大家好,我是极客老墨。 你有没有想过:ChatGPT、DeepSeek,这些大模型是怎么"造"出来的? 很多人用了大半年 AI,依然不知道答案。他们知道模型很强,但不知道强从哪来;知道调 temperature 能改变风格,但不知道为什么。这种"只会开车、不知道发动机"的状态,限制了你对 AI 能力边界的判断,也限制了你设计 AI 应用的想象力。 这篇文章要做一件事:把大模型从"一堆原始数据"到"你手里的 API"这条完整链路讲清楚。 普通人能看懂,开发者能用上。 第一段:模型是怎么被造出来的 大模型的诞生,分四个阶段,缺一不可。 flowchart TD A["海量原始数据 网页/书籍/代码/论文"] --> B["预训练 Next Token Prediction"] B --> C["指令微调 SFT 教模型听懂人话"] C --> D["强化学习对齐 RLHF 教模型说对的话"] D --> E["量化 & 部署 压缩上线"] E --> F["你调用的 API"] 阶段一:预训练——从"0"开始读书 预训练是整个大模型能力的根基。这个阶段,模型什么都不知道,就像一张白纸。 研究团队先从互联网抓取海量文本的网页数据、Wikipedia、GitHub 代码库、arXiv 论文、书籍……DeepSeek-V3 的预训练数据量超过 14.8 万亿个 Token。这是什么概念?一个人一天读 8 小时,读完大概需要 2 万年。 有了数据,然后呢?训练任务出乎意料地简单:给你前面的词,猜下一个词。 输入:「人工智能是」 目标:预测「一」 输入:「人工智能是一」 目标:预测「种」 输入:「人工智能是一种」 目标:预测「模拟」 就这么一个任务,重复几十亿次。模型每猜错一次,就调整内部参数,让下次猜得准一点——这个调整过程叫反向传播(Backpropagation)。 ...

2026-05-04 · 3 min · 528 words · 老墨

大模型能干什么:六大核心应用场景拆解

大模型能干什么:六大核心应用场景拆解 大家好,我是极客老墨。 有个问题我被问过很多次:大模型除了聊天,还能干什么? 这个问题背后藏着一个更深的困惑:我学大模型开发,到底能做出什么东西?值不值得投入时间? 值得。但前提是你得搞清楚它的边界——哪些场景是大模型真正擅长的,哪些是现在能落地的,哪些是看着很美但开发成本极高的。 这篇文章拆解六个核心场景:文生文、文生图、文生视频、语音交互、数字人、智能问答。每个场景我会讲清楚技术本质是什么、真实能力边界在哪里、开发者能拿它做什么,以及一个 Go 开发者该从哪里切入。 不堆概念,只讲和开发直接相关的部分。 一、文生文:最成熟,也最容易被低估 技术本质 文生文(Text-to-Text)是所有大模型能力的基础层。给定一段文本输入,模型输出文本结果——翻译、摘要、续写、代码生成、问答、分类、抽取,本质都是这个范式。 它的核心机制是自回归生成(Autoregressive Generation):模型逐个 token 预测,每次预测都以前面所有内容为条件。这意味着它天然支持任意长度的输出,也意味着它的"思考"过程是线性的、不可并行的。 能力边界 文生文做得好的事:结构化生成、风格迁移、代码辅助、信息抽取、分类标注。 文生文目前还做不好的事:精确计算(数学运算容易出错)、实时数据(知识截止限制)、高度确定性任务(每次输出有随机性)。 2026 年之后,推理模型(DeepSeek-R1、OpenAI o3)的出现让数学和逻辑推理能力大幅提升——但这是专门设计了长思维链的推理模型,普通对话模型仍然存在上述限制。 开发者能做什么 用户需求 → Prompt → 大模型 → 文本输出 → 业务逻辑处理 这是最简单的链路,也是 90% 的大模型应用的骨架。几个典型落地方向: 代码辅助:接入 IDE 插件,或者独立的代码问答服务。输入自然语言描述,输出对应语言的实现代码。DeepSeek-V3 在代码生成上性价比极高,是首选。 文档处理:上传合同、技术文档、会议记录,提取关键信息、生成摘要、回答问题。结合 RAG(后面的模块会详细讲),可以大幅减少幻觉。 内容生成:营销文案、邮件草稿、产品描述、SEO 内容。注意:大模型不是完美的,高质量内容生成必须加人工审核环节。 结构化抽取:从非结构化文本中提取 JSON 格式的数据,配合 Function Calling 或 Structured Output,可以直接对接业务数据库。 老墨说: 文生文不只是"聊天",它是一个可编程的文本处理引擎。你用自然语言定义规则,它按规则处理任意输入——这是一种新的编程范式,比你写正则表达式和 if-else 强大得多,也灵活得多。 二、文生图:创意的民主化 技术本质 文生图(Text-to-Image)的主流技术路线是扩散模型(Diffusion Model)——从随机噪声出发,在文本描述的引导下,迭代去噪,最终生成图像。代表模型有 Stable Diffusion、DALL·E 3、Midjourney、Flux。 这和文生文用的技术栈完全不同。大多数大模型 API 平台(OpenAI、智谱、火山引擎)会把文生图单独封装成一个 API 端点,你不需要了解扩散过程,直接调用即可。 ...

2026-05-02 · 3 min · 511 words · 老墨

大模型发展史:从一篇论文到改变世界

大模型发展史:从一篇论文到改变世界 大家好,我是极客老墨。 有人问过我:学大模型开发,需要搞清楚历史吗? 我的答案是:不需要全记,但有几个节点绕不过去。就像你不需要知道 Linux 每一个版本的变化,但如果你不知道 1991 年 Linus 为什么会写内核、不知道 GPL 协议的来历,你就很难理解为什么今天的开源生态长成了现在这个样子。 大模型的历史也是一样的道理。 这篇文章不是"时间轴背诵手册",而是帮你搞清楚:每一个关键节点留下了什么技术遗产,以及这些遗产如何层层叠加,构成了你今天调用 API 时那个"黑盒"里的底层逻辑。 第一阶段:奠基期(2017–2019)——骨架确立,两条路线分叉 在 2017 年之前,AI 语言模型靠 RNN 和 LSTM 驱动。这两种架构有一个致命弱点:序列化处理——它们必须一个词一个词地读,前面没读完,后面没法算。这就导致了两个问题:长文本里的前后关联容易丢失,训练也难以并行,规模扩不上去。 这个局面被一篇论文打破了。 Transformer 诞生(2017 年 6 月) Google Brain 团队的 Ashish Vaswani 等人发表了 Attention Is All You Need,提出了 Transformer 架构,核心是"自注意力机制(Self-Attention)"。 它的革命性在哪里?一句话:让模型在处理一个词的时候,能同时看到整个句子里所有词的关联权重,而不是只看"左边刚读过的"。 并且这个计算是可以并行的——GPU 的算力第一次被大模型充分用上了。 Transformer 由 Encoder(理解)和 Decoder(生成)两部分组成,可以灵活组合。这个设计直接决定了后来大模型的两条技术路线。 老墨说: Transformer 是大模型的底层骨架,今天你用的 GPT、Claude、DeepSeek,技术根基都在这篇 2017 年的论文里。你可以不懂数学,但"自注意力"这个词要知道它是干什么的。 两条路线分叉(2018 年) Transformer 出来之后,OpenAI 和 Google 各自选了一条路。 GPT-1(2018 年 6 月,OpenAI):只用 Decoder,专注文本生成。1.17 亿参数,在约 5GB 的书籍语料上预训练,验证了"预训练+微调"在生成任务上的可行性。能力有限,但确立了 GPT 系列"纯 Decoder 生成式"的路线。 ...

2026-04-30 · 4 min · 688 words · 老墨

什么是大模型:开发者必须搞清楚的核心概念

什么是大模型:开发者必须搞清楚的核心概念 大家好,我是极客老墨。 2022 年 11 月 30 日,OpenAI 悄悄上线了一个叫 ChatGPT 的产品。没有发布会,没有大规模营销,结果五天内注册用户突破 100 万,两个月后破 1 亿——成为史上用户增长最快的消费级应用。 这一年,我第一次在终端里用 API 让它写了段 Go 代码,代码是对的。我盯着屏幕看了很久,心里有个声音说:这东西不一样。 这篇文章的目标很简单:搞清楚大模型是什么,从哪来,现在有哪些主流选择,以及作为开发者你需要知道哪些核心概念。不涉及数学,不涉及训练原理,只讲和开发直接相关的部分。 大模型是什么 大模型(Large Language Model,LLM),本质是基于海量文本数据训练出来的神经网络模型,通过学习语言的统计规律,获得了理解和生成自然语言的能力。核心参数规模通常在百亿级以上——这也是"大"的由来。 一个直白的类比:你可以把大模型想象成一个读过人类几乎所有书籍、论文、代码、对话记录的人。它没有真正的"理解",但它见过的模式足够多,所以当你给它一段输入,它能预测出"接下来最合理的内容是什么"——而这个"预测"往往精准得令人惊讶。 对开发者来说,有三件事最重要: 调用方式:你不需要自己训练模型。通过 API,几行代码就能接入 GPT、DeepSeek、Claude 等顶级模型的能力 核心价值:大模型把自然语言变成了一种编程接口——你用人话描述需求,它输出结果,极大降低了 AI 功能的开发门槛 能力边界:参数规模决定了模型的能力上限,但训练数据质量、微调策略同样关键。参数多不等于万能 老墨说: 别被"大"字唬住。大模型对开发者的意义就一句话:用 API 调用别人训好的模型,你只管写业务逻辑。 大模型从哪来:关键发展节点 大模型的演进不需要全记,但有几个节点值得了解——它们直接决定了今天你能用到的技术基础。 2017 年:Transformer 诞生 Google 发表了论文 Attention Is All You Need,提出了 Transformer 架构。这篇论文是今天几乎所有大模型的技术根基。在它之前,语言模型用 RNN(循环神经网络),慢且难以并行训练;Transformer 引入了自注意力机制,让模型能同时关注序列中所有位置的关联,训练效率和能力都大幅提升。 2020 年:GPT-3 开启规模时代 OpenAI 发布 GPT-3(1750 亿参数),首次证明了"规模即能力"——只要参数足够大、数据足够多,模型会涌现出意想不到的新能力。这一发现改变了整个 AI 研究方向。 2022 年:ChatGPT 引爆应用层 ...

2026-04-29 · 3 min · 513 words · 老墨

Rust 学习笔记 25:高级特性 (Advanced Features)

Rust 学习笔记 25:高级特性 (Advanced Features) “With great power comes great responsibility.” – Uncle Ben (actually unsafe block) Rust 通常强制执行内存安全规则,但有时我们需要绕过它们(比如操作硬件、与 C 交互)。这时,Unsafe Rust 就派上用场了。 此外,Rust 的 Trait 和类型系统还有很多高级用法,能让你的代码更具表现力。 1. Unsafe Rust unsafe 关键字给我们开启了 5 种超能力: 解引用裸指针 (Raw Pointers)。 调用不安全的函数/方法(包括 FFI)。 访问或修改可变静态变量 (Mutable Static Variables)。 实现不安全 Trait (unsafe trait)。 访问 union 的字段。 裸指针: 1let mut num = 5; 2let r1 = &num as *const i32; 3let r2 = &mut num as *mut i32; 4 5unsafe { 6 println!("r1 is: {}", *r1); 7} 编译器不会检查裸指针是否有效、是否为空、是否遵守所有权规则。你自己要负责。 ...

2026-04-15 · 2 min · 236 words · 老墨

那一夜我删掉了所有的旧代码:一个17年老兵的失业、反思与AI突围

那一夜我删掉了所有的旧代码:一个17年老兵的失业、反思与AI突围 [!quote] 这是一个最坏的时代,也是一个最好的时代。对技术人来说,这更是一个“不得不变”的时代。 大家好,我是极客老墨。 很久没有更新公众号了。后台有很多老朋友私信问我:“老墨,咋没更新了?”“老墨,是不是转行卖保险去了?” 其实,过去这段时间,我不是在偷懒,我是在“服刑”。生活给我判了一场名为“中年失业”加“创业连续失败”的重刑。 最近,收到很多朋友失业的消息,说实话,我并不意外,大势所趋罢了。对于他们的遭遇,我深有体会,所以,我必须静下心来,深深的思考。 今天,我坐在书房里,看着窗外凌晨三点的灯火,心境比任何时候都要平静。我想把这段时间我掉过的坑、流过的汗,以及那点死里逃生的思考,摊开了跟兄弟们聊聊。 如果你也正感到前路模糊,希望你能耐心看完,这或许是我们这代技术人最后的一次集体突围。 一、 7个项目,0个跑通:我被AI浪潮撞断了腰 去年,是我从业17年来最疯狂、最辛苦,也是最惨烈的一年。 2025年,我和几个相识多年的技术老兵,仍然使用着传统的技术,做移动端App、做后端系统、做交易平台,我们每天只睡4-5个小时,写代码写到眼睛看屏幕都是重影。 结果,我们忽视了正在如潮水般涌动的AI浪潮,却收到了现实给我们的7记响亮的耳光。 这7个项目,一个都没有跑出来,没有任何盈利。 我们这群有着大厂经验的人,习惯了“高并发、高可用、高扩展”。当我们还在花两个月时间打磨那套完美的分布式微服务架构时,外面的年轻人用几行 Python 脚本接上 GPT-4 的 API,配合一个简单的网页模板,一周就上线了,而且用户反馈比我们还好。 我们发现,AI 时代的逻辑变了:“完美的工程实现”在“快速的价值反馈”面前,一文不值。 最让我们绝望的是,我们引以为傲的技术壁垒,在不断进化的模型面前,显得如此苍白。原本我们需要写几百行逻辑去判断的自然语言意图,DeepSeek 一句系统提示词就搞定了。 我们这群写了十几年代码的人,突然发现自己变得“多余”了。那种感觉,就像是你精心维护了十几年的分布式系统,突然遭遇了全区域的掉电,所有的冗余、所有的备份,在绝对的力量面前,毫无意义。 那一刻,我正式失业了。 二、 围墙里的中年人:房贷、孩子与消失的护城河 失业后的前两个月,我陷入了前所未有的焦虑。 这种焦虑除了那种“没钱花”的恐慌,更多的是一种“自我价值彻底归零”的虚无。 每天早上醒来,脑子里跳出来的不是代码逻辑,而是三个冰冷的数字: 房贷:每个月几大千的月供,像闹钟一样精准,从不缺席。你看着银行卡余额一点点减少,那种倒计时的声音会在深夜里无限放大。 教育:孩子上辅导班、兴趣班的费用。在这个内卷的时代,你不敢停。你看着孩子纯真的笑脸,心里想的却是:“爸爸下个月还能不能供得起你的钢琴课?” 医疗:父母渐渐老去。那份体检报告上的每一个红点,都意味着一笔不确定的支出。 人到中年,上有老,下有小。失业这两个字,对我们这种人来说,不是“休息”,是“断供”。 我曾试图更新一下我的简历。但我看着简历上那些“精通分布式架构”、“深度理解 JVM”、“Go 高性能编程”,突然觉得这些东西好陌生。在 AI 时代,当一个初级程序员配合 Cursor 就能写出八成正确的业务代码时,我这些积累了十几年的经验,还能卖出原来的价格吗? 我把自己关在房间里,关掉了所有的博客,清空了那些凌乱的技术文章。看着那些曾经为了涨粉写的“分布式架构文章”、“精通设计模式”、“Go语言精简教程”、“Python 入门教程”,我觉得它们简直就是时代的垃圾。 技术人的现实是:在 AI 时代,技术本身的“实现能力”正在贬值,而“解决问题的能力”正在升值。 但我当时没想明白。我感到生活处处都是围墙。左边是 40 岁的红线,右边是 AI 的替代,头顶是生活的重压。我感觉自己像是一个在旧时代战场上磨刀的铁匠,突然发现对面的人已经开始用无人机了。 我问自己:老墨,你除了写代码,还会什么?如果明天代码消失了,你还能在这个社会上生存吗?我当时发现,还真TM不能!除了写代码,我发现自己竟然似乎一无是处! 三、 觉醒:在传统行业的泥坑里,寻找AI的落脚点 焦虑到极致的时候,整个人都是萎靡的状态。我知道这样下去不行,于是我开始约朋友们喝茶、聊天,一起探讨新的方向。 一段时间后,我做了一个决定:停下来,走出去。 我不去卷那些花哨的 AI 概念了,不去跟那群 20 出头的年轻人卷提示词、卷用法了,也不再去跟风某某Agent了。我开始回访那些以前在甲方工作的朋友,去探访那些传统的行业:保险、医疗、电商、小外贸、甚至社区服务。 我发现了一个惊人的事实:虽然 AI 已经人人都耳熟能详,但真正能够用 AI 来解决实际问题的传统行业,极少。 他们缺乏的,从来都不是那些花里胡哨的AI概念,而是用AI来帮他们把那些每日重复的工作从流程中省掉的落地方案。 ...

2026-04-11 · 1 min · 196 words · 老墨

大模型 API 核心参数:调对了事半功倍,调错了钱打水漂

大模型 API 核心参数:调对了事半功倍,调错了钱打水漂 大家好,我是极客老墨。 我刚开始接大模型 API 时,最容易犯的毛病就是把所有问题都往 prompt 上推。输出不稳定,先改 prompt;JSON 解析失败,继续改 prompt;账单涨了,还想着是不是 prompt 不够精简。改到最后,prompt 越写越长,接口却还是像没装仪表盘的车,能跑,但不知道哪里在烧钱、哪里在抖。 这篇不讲玄学调参。我就按一个常见场景来讲:做一个客服工单摘要接口。 输入是一段用户和客服的对话,输出要稳定变成这样的 JSON: 1{ 2 "summary": "用户咨询退款到账时间,客服告知预计 3-5 个工作日", 3 "category": "refund", 4 "risk_level": "low", 5 "next_action": "等待退款到账" 6} 这个接口看着简单,真接到业务里会遇到四个问题: 有时输出一段自然语言,JSON 解析直接炸。 有时写到一半停了,字段缺一截。 有时同一条工单跑两次,分类不一致。 有时为了一个简单摘要开了推理模式,成本和延迟都上去了。 这些问题不全是 prompt 的锅。后来我才把 API 参数当成方向盘、油门、刹车和仪表盘来看:prompt 负责告诉模型要去哪,参数负责控制它怎么走、走多远、花多少钱、异常时怎么停下来。 本文以 DeepSeek API 为主线。DeepSeek 当前官方文档里,Chat Completions 的模型 ID 是 deepseek-v4-flash 和 deepseek-v4-pro;deepseek-chat、deepseek-reasoner 仍可兼容,但官方已说明将于 2026/07/24 弃用。下面的参数口径按本文撰写时查阅的官方文档编写,后续以官方最新文档为准。 model:我会先选一辆够用的车 客服工单摘要这类任务,第一版通常不需要最强模型。它不是奥数题,也不是复杂代码审查,核心是稳定抽取、分类、压缩信息。 DeepSeek 当前官方模型表里有两个主模型: model 适合什么 deepseek-v4-flash 延迟、成本更敏感的通用任务,比如摘要、分类、提取、普通问答 deepseek-v4-pro 更复杂的推理、规划、工具调用、代码分析 官方还保留了两个兼容别名: deepseek-chat:对应 deepseek-v4-flash 的非 thinking 模式。 deepseek-reasoner:对应 deepseek-v4-flash 的 thinking 模式。 这里我会先做一个保守判断:能用 deepseek-v4-flash 跑稳,就先不上 deepseek-v4-pro;能关 thinking 跑稳,就先不开 thinking。 ...

2026-04-02 · 7 min · 1347 words · 老墨

用 AI Skills 武装你的写作流程,从此告别重复劳动

用 AI Skills 武装你的写作流程,从此告别重复劳动 每次让 AI 帮我写技术文章,我都得重新交代一遍:“你是一个有 20 年经验的工程师,语言要接地气,开头要有钩子,结尾要总结,不要废话……” 打完这段话,文章还没开始写,我已经累了。 这就是我开始研究 Agent Skills 的起点。研究完之后,我只想说:早该有这东西了。 一、什么是 Agent Skills? 2025 年 12 月 18 日,Anthropic 把 Agent Skills 作为一个开放标准发布出来,规范地址在 agentskills.io。OpenAI Codex、GitHub Copilot、VS Code 等主流平台随后跟进支持。 官方文档对 Skills 的定义是: Skills are reusable, filesystem-based resources that provide Claude with domain-specific expertise: workflows, context, and best practices that transform general-purpose agents into specialists. 翻译成人话:Skill 是一个文件夹。里面放着你对 AI 的"专项培训材料"。当 AI 遇到匹配的任务时,它会自动加载这个文件夹里的内容,按照你的规范工作——不用你每次都重新解释。 用一个生活比喻:你雇了一位新助理,第一次你花了两个小时教她公司的排版规范、写作风格、邮件模板。从第二次起,你只需要说"按老规矩来",她就能做对。Skill 就是那份"老规矩"的电子版。 老墨说: Skill 解决的核心问题是重复交代——把每次对话都要说的上下文、规范、工作流程,封装成一个可复用的模块。 ...

2026-04-02 · 4 min · 676 words · 老墨

03-用htop和btop替换掉你的top吧,效率起飞

大家好,我是极客老墨。 作为一名常年泡在 Linux 终端里的“老兵”,我发现很多刚入行的小伙伴都有个习惯:只要系统慢了、CPU 飙升了,第一反应就是敲个 top。 说实话,每次看到那灰扑扑、死气沉沉的 top 界面,我都感觉像是在看 1970 年代的黑白电视。虽然它也能干活,但找个进程要靠眼力,杀个进程要背 PID,操作起来真的能让人抓狂。 今天,咱们给你的工具箱升个级。我会分享两款我用了多年的终端监控神器:一款是实用主义者的首选 htop,另一款则是颜值党和仪表盘迷的最爱 btop。 为什么我们要彻底抛弃 top? 如果把 top 比作一辆手动挡的老破车,那 htop 和 btop 就是带自动泊车和全景天窗的特斯拉。 视觉疲劳:top 全是黑白数字,CPU 核心多的时候,那一串 %Cpu 数字看一眼都能吐。 交互反人类:你想杀个进程?得先记住它的 PID,退出 top(或在 top 里按 k),再手动输入 PID,再输入信号强度。这在紧急排查问题时,简直是浪费生命。 信息密度低:默认不显示进程树、不显示网络 IO、不显示磁盘负载,你得来回切换命令。 htop:实用主义者的“瑞士军刀” htop 是 top 的直系增强版。如果你追求稳定、快速且能解决 90% 的运维问题,它是你的不二之选。 为什么老墨天天在用它? 彩色直观:CPU、内存、Swap 用颜色条(彩色进度条)表示,系统紧不紧张,扫一眼进度条的颜色就心里有数了。 支持鼠标(重点!):你可以直接用鼠标点击列标题排序,或者点击某个进程。是的,在终端里也能像在 Windows 任务管理器里一样“指哪打哪”。 交互式进程管理:看到某个异常进程,不用背 PID。直接光标移过去,按 F9 发送 kill 信号,按 F7/F8 调整优先级(Nice 值)。 进程树视图:按 F5 开启,清晰地看到谁是父进程,谁是子进程(比如一堆 php-fpm 进程),方便精准打击。 安装与快捷键 MacOS: brew install htop Ubuntu/Debian: sudo apt install htop CentOS/RHEL: sudo yum install htop 快捷键 功能 (老墨口诀) F3 / F4 搜索和过滤(找进程飞快) F5 树形显示(谁生的谁一清二楚) F6 排序(按内存排还是按 CPU 排?) F9 杀进程(直接发送信号,干脆利落) u 只看某个用户(只盯着那个坑爹的业务账号) btop:监控界的“视觉盛宴” 如果说 htop 是为了干活,那 btop 就是为了“爽”。它是目前终端监控领域的天花板,GitHub 上 30k+ 的 Star 不是吹出来的。 ...

2026-04-01 · 2 min · 240 words · 老墨

Rust 学习笔记 24:模式匹配详情 (Pattern Matching)

Rust 学习笔记 24:模式匹配详情 (Pattern Matching) “Patterns are the ultimate way to deconstruct reality.” 我们在前面的章节已经频繁使用了 match 和 let。其实,模式 (Pattern) 在 Rust 中无处不在。 只要涉及到数据赋值或参数传递,几乎都有模式的身影。 1. 模式无处不在 除了 match 表达式,哪里还有模式? if let: 1if let Some(x) = option_value { ... } while let: 1while let Some(top) = stack.pop() { ... } for 循环: 1for (index, value) in v.iter().enumerate() { ... } let 语句: 1let (x, y, z) = (1, 2, 3); 函数参数: 1fn print_coordinates(&(x, y): &(i32, i32)) { ... } 2. Refutability (可反驳性) 模式分为两类: ...

2026-03-30 · 2 min · 316 words · 老墨

Accio Work真的30分钟给我搞了shopify店铺

大家好,我是极客老墨。 最近一直在研究各种 Claw,自 OpenClaw 大火之后,确实有非常多的 Claw 相继诞生。你别说,真的一个比一个好用,QClaw 能够配合 ima伴你搞定全自动知识库;悟空帮你搞笑完成日程、文档、会议,还能帮你搜索、分析电商热销商品、比价……它们虽然专注的点不同,但都结合自己的产品主打一个全自动化。 今天,我想分享的这个是一款做跨境电商的利器 —— Accio Work,这玩意儿不光全程指导完成Shopify独立站的搭建,还帮我组建一个运营团队,实现真正的团队协作! 我们来看一下什么是 Accio Work。 简单来说,Accio Work 只主打跨境电商的AI工具,内置了非常多的技能和Agent,只要你给它授权,它就能自己写代码、自己装修网站、自己选品和自己上架、售卖商品。 今天,老墨就用我刚开的一个做东南亚市场的“丑萌毛绒玩具”店(怪异实验室 UglyCute Lab)为例,展示一下怎么用 Accio Work 在 30 分钟内把一个空壳店铺跑上线。 第一步:准备一个 Shopify 空壳 Shopify 是加拿大的一个全球跨境电商的平台,任何人都可以在上边开自己的独立店铺,只需要每月交付一定的费用。 不管 AI 多牛,店铺的基础还得你自己建。 打开 Shopify 官网,用邮箱注册一个免费试用账号。 随便起个店铺名字,把基础后台开通。 新注册的账号有3天的免费试用时间,满了之后需要支付1美金的费用,也是给新手一个过渡期。 老墨建议:这个时候不要急着绑信用卡交月租。先把基础跑通,看到店铺成型了再交钱不迟。 第二步:让 Accio Work 帮你分析市场并选品 下载 Accio Work,登录并打开,你可以看到智能体这一个菜单中,有多个Agent,需要用到的就是这个内置的 Shopify Operator,他可以帮我们一步一步把Shopfiy店铺搭建完成。 点击对话,就可以直接开启Shopify店铺构建之旅了,直接告诉他:“我想要在shopify上开设一个面向东南亚地区的丑萌玩具店铺,帮我策划“, 然后,它就开始进入开店流程,它把整个流程分为了5个节点,引导你一步步完成: 然后,它自动开始做第一阶段的选品调研,它分析了亚马逊、1688等市场上的产品,给出了具体的产品和收益分析: 这个市场分析个人感觉可以参考,但必须集合自己的判断才行,最好是自己去到亚马逊、阿里巴巴调研一下。 第三步:获取 AccessToken 接下来,需要获取 Shopify 的 AccessToken,以便AI能够通过 api 来帮我管理店铺。本来,我一开始创建店铺的时候,AI助手直接给我安装了一个 QuickToken 的插件自动申请 AccessToken,但是不知道为什么现在下架了,只能手动创建了。 ...

2026-03-29 · 1 min · 171 words · 老墨

Vibe Coding 爆火背后的真相:是效率革命,还是程序员的“慢性自杀”?

一、开篇:这词儿咋就火成这样? 大家好,我是极客老墨。 最近刷技术圈,不管你是看 GitHub、掘金,还是抖音 B 站,到处都在提一个词——Vibe Coding。 连柯林斯词典都把它评为 2025 年度词汇。好家伙,一个编程相关的词能火到出圈,上一次还是"Hello World"吧? 但说实话,我第一次听到这词儿时,内心是拒绝的。 啥?Vibe?氛围?编程还能靠氛围?难不成我以前加班写代码是因为"氛围不对"?😂 直到用了这大半年的时间,才发现:这玩意儿,还真有点东西。 今天,咱就用大白话,把这个看似高深的概念给你讲透。不管你是不懂代码的小白,还是跟我一样的老程序员,看完都能明白:Vibe Coding 到底是啥,它跟咱们以前写代码有啥不一样,以及——你到底要不要用它。 二、先说结论:Vibe Coding 不是玄学 2.1 官方定义 Vibe Coding,中文有人翻译成"氛围编程"或"即兴编程",是由 OpenAI 联合创始人、前特斯拉 AI 总监 Andrej Karpathy 在 2025 年 2 月 通过 X 平台(原 Twitter) 首次提出的。 推文原文:“There’s a new kind of coding I call ‘vibe coding’, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists.” 中文翻译:“有一种新的编程方式,我称之为’Vibe Coding’——你完全沉浸在感觉中,拥抱指数级增长,然后忘记代码的存在。” Karpathy 后来在 2025 年 8 月 25 日又发布了一条详细分享自己 Vibe Coding 心得的推文,引发了谷歌实验室产品总监等业界大咖的讨论 查看推文。 这个概念迅速走红,并在 2025 年 11 月被柯林斯词典评为年度词汇 来源:百度百科。 ...

2026-03-27 · 4 min · 664 words · 老墨

OpenClaw多Agent实战:从0到1搭多角色协作机器人,踩遍所有坑!

各位极客老铁,老墨又来填坑了! 最近深耕OpenClaw多Agent模式,目标很简单:让main机器人当调度员,mr(市场研究员)、pm(产品经理)、dev(开发工程师)各干各的活,形成一个小型AI协作团队。但过程真的一言难尽,从命令行操作到飞书配置,踩了N个暗坑,今天把完整搭建流程+避坑指南甩给你们,全程实操,跟着走不迷路——毕竟老墨从不玩虚的,只讲能落地的干货! 为什么需要多个Agent呢? 先交代背景:很多老铁会问,搞一个main机器人不就够了?为啥非要折腾多个Agent? 老墨实测总结:单Agent就是“万金油”,啥都能做但啥都不精——比如让一个机器人既做市场调研、又做产品规划、还写代码,做的事情太多了,记忆存储也会庞大,很容易出现“AI幻觉”。 我要搭建的多Agent架构,核心是「1个调度Agent(main/小墨)+ 3个功能Agent(mr/pm/dev)」,所有Agent接入飞书群组,实现“@对应角色触发对应响应”,目前已完成群组呼叫、私聊,协同工作还需进一步研究,看后文详述。 多Agent的核心价值,就是「分工明确、各司其职」:main机器人当调度员,负责统筹需求、分配任务;mr专注市场调研,pm聚焦产品规划,dev专攻技术实现,既避免了单Agent的混乱,又能提升响应效率和专业性,后续还能实现协同工作,搭建一个小型AI协作团队。 顺便说一句,为了使用飞书插件最新的能力,我把openclaw原生的飞书插件替换成了,我测试了一下,他们的配置是兼容的,你可以不用按照我的来,如果配置不兼容你可以参考飞书官方插件使用文档和OpenClaw飞书官方文档。 前言 由于OpenClaw版本更新非常快,文档更新不及时,网上查询资料时老墨也深受其害,配置各不相同,非常麻烦。所以老墨这里把环境标清楚,避免你跳坑: OpenClaw版本: 我的是 2026.3.13,非常影响后文讲述的配置,不同版本差异非常大,如果你的版本与我不一致,那么你需要注意 系统环境: Windows 10,这个影响不是很大,主要注意windows和linux路径上的区别即可 另外,你可以了解一下飞书的id设计,每一个机器人看到的你的 openid并不是一样的,如果你用到了需要特别注意: openid:以 ou 开头,格式为 ou_xxx 群聊的id: 以 oc 开头,格式为 oc_xxx Appid: 飞书机器人的appid格式时 cli_xxx 一、第一步:添加多个工作区(多Agent的基础,别瞎建目录) OpenClaw的多Agent,本质是「每个Agent对应一个独立工作区」,工作区里存着该Agent的身份配置(soul.md/identity.md等)、日志和任务数据,这一步是基础,建错路径后续全白搭。 很多新手上来就手动建文件夹,结果OpenClaw识别不到,老墨实测:用命令行创建最稳妥,自动关联配置,避免路径错乱。 先查看一下你的agent列表: 1openclaw agents list 你应该看到你本地有一个主agent,现在可以添加几个了: 1openclaw agents add mr --workspace ~/.openclaw/workspace-mr 2openclaw agents add pm --workspace ~/.openclaw/workspace-pm 3openclaw agents add dev --workspace ~/.openclaw/workspace-dev 这里展示一下我后台添加的一个writer的截图: 这里我指定工作目录在我的用户目录下的 .openclaw中,与主Agent一致。 如果你加错了,你可以删除: 1openclaw agents remove dev 创建完成后,你的~/.openclaw/openclaw.json配置文件的"agents"节点下会有"list"子节点,里边对应了你添加的多个agent,你可以修改这个配置,比如指定不同的模型: ...

2026-03-20 · 3 min · 487 words · 老墨

[GoLang避坑实战-19] 搞定基础就想收工?别天真了!揭秘 Go 进阶路上的“九九八十一坑”

大家好,我是极客老墨! 恭喜你,跟着老墨走完了 Go 语言的基础教程。从变量声明到实战开发CLI程序,从简单的 if-else 到初探并发,你已经拿到了进入 Go 世界的入场券。 但前几天有个读者私信我,一句话把我问住了: “老墨,基础教程我看完了,感觉自己无敌了,接下来是不是可以直接去面大厂拿 50K 了?” 我当时正在喝咖啡,差点没一口喷出来。 兄弟,听老墨一句劝:搞定语法只是让你学会了“拿刀”,但要想在工程实战里“切口如丝”,你离真正的 Go 高手还差着好几个“坑”呢。 今天这篇,咱们不讲新语法,咱们聊聊实话:基础完了,然后呢? 避坑回马枪:那些“以为懂了”的基础坑 在聊进阶之前,老墨不放心,得带你杀个回马枪。下面这几个基础篇里的“躲猫猫”,你真的彻底搞定了吗? 影子变量 (Shadowing):你是不是还在 if err := ... 里不小心遮蔽了全局变量,导致逻辑死活跑不通? 切片共享底层数组:你是不是还在愉快地 s2 := s1[:2],结果改了 s2 发现 s1 也崩了? 循环变量地址问题:虽然 Go 1.22 帮你填了坑,但你如果还没养成“局部副本”的意识,在老版本项目里照样会翻车。 defer 的陷阱:你是不是还在循环里写 defer?或者在 defer 里漏写了 nil 检查? 老墨建议:如果上述几个场景你还得查笔记,那说明你的基础还没到“化境”。去 go-tutorial-code 把对应的演示代码再跑一遍,那是老墨用 Bug 堆出来的血泪史。 能写和能打,是两回事 很多同学觉得自己“会写”了,但一上手真实项目就抓瞎。 第一次写 Web:信心满满开了 10 万个 Goroutine,结果服务器内存瞬间爆炸。这时你才知道,原来 Golang 的并发不是让你无脑 go func()。 第一次面大厂:面试官问你:“GMP 调度器是怎么处理阻塞的?”你一脸懵逼,心想我只要会写 API 不就行了? 第一次做架构:代码一多就乱成一团,依赖注入 (DI) 的意义在哪?接口到底该怎么抽象? 这就是**“语法选手”和“工程选手”**的区别。基础教程教你“刀怎么拿”,而进阶之路教你“仗怎么打”。 老墨的进阶地图:内功与外家功夫 想成为真正的 Go 高手,老墨认为必须“双修”: ...

2026-03-15 · 1 min · 172 words · 老墨

养虾必备的 10 个 Skills,最后一个是真神

大家好,我是极客老墨。 今天我们来盘点 OpenClaw 社区公认、高频实用的十大核心 Skills,按「安全打底→基础核心→场景提效→进阶成长」排序,覆盖你做内容创作、开发运维、日常自动化的全场景需求,老墨亲测,文末附一键安装指令。 什么是 Skill? 如果没有Skill,你会发现你的 OpenClaw 功能会非常有限。装上 Skill,相当于给它插上了翅膀,让它变得强大且聪明。 你可以把 OpenClaw 想象成一部手机,它的 Skill 就是手机里的APP:它本质上是一个可以独立运行的插件和应用程序,大模型根据需要按需调用它实现某些特定的功能。 比如 file-organizer(文件管理 Skill)是 “文件管理器 APP”,agent-browser 是 “浏览器自动化 APP”;这些 Skill 是独立的可执行程序,有自己的代码、依赖、配置,安装后能直接运行;你对 OpenClaw 说 “整理我的桌面文件”,OpenClaw 会调用 file-organizer 这个 Skill 直接执行,无需大模型额外处理。 去哪里找 Skill? 官方有个 ClawHub,这是 OpenClaw 的 Skill 社区。 我给老铁安装OpenClaw的时候一般都会把官方的 clawhub Skill装上,这样就可以通过对话的方式让 OpenClaw 自己安装 Skills 了。 但 ClawHub 经常限速,我现在更推荐用腾讯的 skillhub,国内访问更快。 安装方式: 方式1:对话安装(推荐) 直接和 OpenClaw 说: 根据 https://skillhub-1388575217.cos.ap-guangzhou.myqcloud.com/install/skillhub.md 安装Skillhub商店。 方式2:命令行安装(macOS/Linux) 1curl -fsSL https://skillhub-1251783334.cos.ap-guangzhou.myqcloud.com/install/install.sh | bash ...

2026-03-13 · 2 min · 356 words · 老墨

02-别再用cd和grep了!这两个神器让我终端效率直接拉满

养虾日记配套工具:我写OpenClaw自动化脚本、Go开发天天用的终端神器,2分钟装好,拿来就能用 上一篇给大家分享了bat + eza,替代了系统自带的cat和ls,装上之后,想必你的终端体验直接上了一个台阶。 今天继续更新《极客工具库》系列,给大家分享两个我用了多年、每天必敲的终端神器:fzf + rg,直接换掉你天天用的cd和grep。 作为天天和终端打交道的开发者,你肯定遇到过这些痛点: 目录层级太深,cd来回切,输路径输到崩溃 找之前敲过的命令,按上箭头翻半天,翻到眼花也找不到 用grep在项目里搜代码,慢到怀疑人生,还搜不到隐藏文件 找文件全靠ls一个个翻,效率低到离谱 这两个神器,完美解决上面所有问题,每天至少帮我省2小时的无效操作。 保姆级教程安排上,2分钟就能装好,全平台兼容,零代码基础也能跟着做。 一、fzf:终端模糊搜索神器,告别无效cd/翻历史命令 fzf是一款GoLang开发的终端通用模糊搜索工具,号称「终端搜索瑞士军刀」,核心解决「找文件、找目录、找历史命令慢」的痛点,是我打开终端必用的工具。 1. 特性 小巧便携: 作为单一二进制分发,便于安装 极速高效: 支持即时搜索几百万的数据 可扩展: 通过事件-行为绑定机制完全实现自定义 支持各个主流终端: 包含 Bash、Zsh、Fish、Vim 和 Neovim 的集成 2. 一键安装命令 MacOS: 1brew install fzf Windows 1winget install fzf Ubuntu/Debian: 1apt install fzf CentOS/RHEL: 1dnf install fzf 安装完成后,执行这条命令,启用自动补全和快捷键绑定,一劳永逸: 1$(brew --prefix fzf)/install --all 执行完重启终端,就能直接用了。 2. 3个我天天用的核心实战用法 用法1:一秒搜索历史命令,告别疯狂按上箭头 这是我用得最多的功能,没有之一。 在终端里按下Ctrl + R,会直接弹出fzf搜索窗口,输入你记得的命令关键词,会实时模糊匹配所有历史命令,上下箭头选中,回车直接执行。 比如我想找之前敲过的OpenClaw相关命令,只需要输入openclaw,所有相关命令都会列出来,再也不用按上箭头翻半天了。 用法2:一键跳转任意目录,告别反复cd 不用再记复杂的目录路径,不用一级一级cd,配合zoxide(后续会讲),一键跳转到你想去的任何目录。 ...

2026-03-12 · 1 min · 204 words · 老墨

别再用 ls 和 cat 了!这两个工具让我的终端效率直接翻倍

作为天天和终端打交道的开发者,不管是写Go代码、跑OpenClaw自动化脚本,还是日常运维服务器,我每天敲得最多的命令,就是ls和cat。 但系统自带的这两个命令,实在太鸡肋了: ls输出黑白一片,分不清文件、文件夹、可执行文件,找东西全靠瞎看 cat看代码没有高亮,长文件翻起来巨麻烦,还要配合less、grep来回折腾 没有git状态显示,改了文件都不知道有没有提交 直到我用上了exa和bat这两个神器,直接把我的终端体验拉满,每天至少帮我省1小时的无效操作。今天就给大家出保姆级教程,5分钟就能装好用上,全平台兼容,零代码基础也能跟着做。 一、bat:替代cat,终端里的代码高亮神器 bat 是cat的平替升级版,核心解决了「终端看文件、看代码体验差」的痛点,我写Go代码、改OpenClaw配置文件,天天都在用。 1. 一键安装命令 MacOS: 1brew install bat Ubuntu/Debian: 1apt install bat CentOS/RHEL: 1dnf install bat 2. 3个我天天用的核心实战用法 用法1:直接查看文件,自带代码高亮+行号 这是最基础的用法,直接用bat 文件名替代cat 文件名,效果天差地别。 1bat main.go 不管是Go、Python、Shell代码,还是配置文件,都能自动识别语法,高亮显示,还自带行号,而且支持自动分页,并不会像cat一样全部输出出来,看代码再也不用瞎找行。 用法2:显示git修改状态,改了哪里一眼看清 bat会自动识别git仓库,对比文件的修改记录,新增、删除的内容会直接标出来,不用再敲git diff。 如果不想打开 IDE,那么用bat看一下git的修改记录,改了哪里一眼就能看清,巨方便。 用法3:配合搜索,精准定位内容 bat同样可以支持管道操作,配合rg、grep使用,搜索关键词,直接高亮显示匹配的内容,长文件里找东西,不用再翻半天。 1bat openclaw.json | grep "minimax" 用bash的用户,把.zshrc换成.bashrc就行。 二、eza:替代ls,终端文件列表神器 eza是ls的平替升级版,该项目是 exa 的fork维护版本,后者没有维护了。它解决了「ls输出乱、找不到文件、信息不全」的痛点,是我打开终端第一个要敲的命令。 1. 一键安装命令 MacOS: 1brew install eza Ubuntu/Debian: 1apt install eza CentOS/RHEL: 1dnf install eza 2. 3个高频实战用法,我已经设成了永久别名 用法1:基础列表,带图标+颜色,一眼分清文件类型 直接用eza替代ls,输出自带图标、颜色,文件夹、文件、可执行文件、压缩包,用不同颜色区分,再也不用黑白里找文件。 ...

2026-03-12 · 1 min · 115 words · 老墨

不会用飞书?没关系,粉丝要的腾讯家族,他来了!手把手教你接入QQ、企业微信到OpenClaw

大家好,我是极客老墨。 之前好几个[找我安装OpenClaw]({ « ref “content/posts/ai/20260305-为了搞个 AI 助手,我在 Windows 上折腾了整整一天.md” » })的粉丝(小白😄)一直给我诉苦: 飞书我不会啊,一会儿企业、一会儿机器人,门槛太高了! 老提示没权限,飞书这权限怎么搞啊,一天了连个文档都没给我创建起! 老墨,你不是说可以帮我写文案、搞表格啊?怎么还要我复制? …… 搞得老墨一阵尴尬!作为宠粉的我,哪能仍受你们受这种痛苦! 之前早都看到 Github早就支持了 QQ和企业微信,这两天刚好又看到腾讯官方也支持接入OpenClaw,这简直是福音啊,必须安排上! 说干就干,当天晚上就开始折腾。QQ 端 3 分半钟跑通,企业微信 10 分钟搞定。现在我的小龙虾 AI 已经住进 QQ 里了,手机随时能调用。 今天把整个过程记录下来,包括我踩过的所有坑。 为什么我要折腾这个? 说实话,之前国内的几大办公大佬中,只有飞书率先官方支持OpenClaw,所以飞书当然是当前的主流!但粉丝的需求让我意识到几个问题: 问题1:飞书门槛确实高 很多小白根本没听过飞书这东西,跟别提用了! 问题2:QQ/企业微信才是国民级应用 腾讯看家的东西,你我都懂,国民级应用。谁手机里没有 QQ?哪个公司不用企业微信?这才是真正的刚需。 所以,这两个,老墨必须给他干明白!废话不多说,正式开搞! 我先试了 QQ,结果 3 分半钟就跑通了 前置条件 你已经部署好了 OpenClaw(大模型已经配置好,能够启动并且状态正常) 你有一个已经登录的QQ 没有准备好的,可以看我的 [Mac上安装]({« rel “content/posts/ai/20260207-ep02_install.md” »}) 和 [Windows 上安装]({« rel “content/posts/ai/20260305-为了搞个 AI 助手,我在 Windows 上折腾了整整一天.md»})。 创建机器人:比想象中简单 打开 https://q.qq.com,要求你登录,直接扫码登录就对了,这里不多赘述。 直接向下看,你应该看到了这个“龙虾专用入口”的通道,点击“去使用”: 点「创建机器人」,一键自动就给你创建好了,AppID、AppSecret 直接给你,没那么多弯弯绕绕,贴心!当然,给你的默认信息你可以修改: ...

2026-03-11 · 2 min · 233 words · 老墨

原来极客都是这样管理 dotfiles 的

原来极客都是这样管理 dotfiles 的 大家好,我是极客老墨。 作为开发者,你肯定干过这种事:新买了台 MacBook,兴冲冲地打开,然后开始漫长的配置之旅——装 Neovim、调 VSCode、改 .zshrc、配 Git、搞主题、设快捷键……折腾了一整天,终于把环境调成自己熟悉的样子。 更惨的是,过了半年,你又换了台机器,或者不小心把配置改坏了,想恢复?抱歉,当时怎么配的已经忘得一干二净。 这种痛,我懂。所以今天咱们就来聊聊,怎么用 Git 管理这些配置文件(dotfiles),让你的开发环境可以"一键复制",随时回滚,多机器同步。 说实话,我折腾 dotfiles 管理已经好几年了。从最开始手动复制配置文件,到后来用 bare repository,再到现在的 symlink 方案,每种方法都试过,每种方法都有坑。今天就把这些年的经验全部掏出来,告诉你什么方法最靠谱。走起! 什么是 Dotfiles? Dotfiles 就是那些以 . 开头的配置文件,比如: .zshrc - Zsh 配置 .vimrc - Vim 配置 .gitconfig - Git 配置 .config/nvim/ - Neovim 配置 .config/wezterm/ - WezTerm 配置 这些文件决定了你的开发环境长什么样,用起来爽不爽。 为什么要管理 Dotfiles? 痛点 1:换机器就抓瞎 新买了台 MacBook,想把老机器的配置搬过来? 手动复制?太慢了,而且容易漏。 痛点 2:配置丢了找不回来 不小心改坏了配置,想恢复? 没有版本控制,只能重新配置。 痛点 3:团队协作困难 团队想统一开发环境? 每个人的配置都不一样,沟通成本巨大。 解决方案:用 Git 管理 把配置文件放到 Git 仓库: 版本控制 多机器同步 团队共享 随时回滚 方法一:Bare Repository(我用过,不推荐) 这是一种很"极客"的方法,不需要软链接,直接把 ~ 目录作为工作目录。 ...

2026-03-10 · 5 min · 866 words · 老墨

OpenClaw这一套自动化流程下来,再也不需要我自己手动发图文了

大家好,我是极客老墨。 前几天折腾了一整天,终于把"每日一Go"的自动化流程跑通了。说实话,搞完的那一刻,我坐在椅子上发了会儿呆——这玩意儿真的能自己干活了? 让我从头说说这事儿。 起因:不想每天手动发图 做公众号的都知道,每天发图文是个体力活。选题、写题、生成代码图、上传素材、创建草稿、发布……一套下来,半小时没了。 我就在想:能不能让小墨(我的智能AI助理)自己干这事儿? 说干就干。 整个系统长这样 先给你看个整体架构图,不然光说容易晕: [题库] → [小墨] → [daily-go-skill] → [图片生成] ↓ [content-publisher] → [微信公众号] 三个核心组件: 1. daily-go-skill 小墨自己写的 skill,专门用来生成 Go 题目的图片。用 Python 实现的,代码高亮直接用现成的库,简单粗暴。 2. content-publisher 这是我自己搞的微信 API 中转服务。为啥要搞这个?因为微信的 appid 和 appsecret 太敏感了,直接放小墨那儿不安全。这个服务跑在我自己的服务器上,小墨只能通过 API 调用,拿不到敏感信息。 3. 题库 小墨自己维护的,用飞书的多维表格。字段包括题目、答案、难度、状态、日期等。后期题库大了可以直接上数据库,但现在飞书够用了。 小墨的工作流程 我给你还原一下它"脑子里"想什么。 第一步:接任务 我说:“小墨,发一道每日一Go到公众号。” 小墨的第一反应:“好的,老大。我先看看题库里有什么。” 第二步:读题库 小墨打开飞书表格,扫了一遍未发布的题目。 [题库查询] - 题目1:Go 的 defer 执行顺序?(已发布) - 题目2:slice 和 array 的区别?(已发布) - 题目3:map 是并发安全的吗?(未发布)✓ “找到了,就这道吧。” 第三步:生成图片 小墨调用 daily-go-skill,把题目传过去。 ...

2026-03-09 · 2 min · 250 words · 老墨

重启 OpenClaw,结果崩溃了!

大家好,我是极客老墨。 刚才手贱,把电脑重启了一下。再启动 OpenClaw,结果,起不来了,直接报错。 说实话,那一刻我有点懵。明明之前还好好的,怎么重启一下就挂了? 赶紧检查一下状态: $ openclaw health 直接出错: 看错误信息,大概是少了一个模块,@larksuiteoapi/node-sdk。 我第一反应是:这是飞书插件依赖的 SDK 吧? 记得之前启动的时候,总会提示两个飞书插件: 既然 .openclaw 下有一个飞书插件,怎么安装目录下还有一个呢? 难怪冲突。所以我之前是直接把 .openclaw 下的删除了。 现在想想,删错了。 到官方文档看看这个错误信息,找到了: 大概明白了,@larksuiteoapi/node-sdk 这个库没有兼容最新版本的 OpenClaw。 看来是 OpenClaw 安装包下的插件太旧了,应该删除它才对。 直接删了: 然后重新安装飞书插件: $ openclaw plugins install feishu 或者重新发起配置流程,会自动安装这个插件: $ openclaw config 虽然还是有那个 plugins.allow 的错误,但是终于可以成功跑起来了…… 老墨总结 折腾完这个 bug,我有几个感悟: 1. 快速迭代是把双刃剑 OpenClaw 更新太快了,这事儿有好有坏。 好处是功能迭代快、问题修复及时。但坏处是——插件生态跟不上。 2. 备份意识要加强 这次是插件冲突,删错了还能重装。但如果是配置文件丢了、数据坏了呢? 3. 插件生态需要跟上 OpenClaw 发展这么快,插件作者也得跟上节奏。 不然用户每次更新都可能踩坑,体验就差了。 ...

2026-03-09 · 1 min · 63 words · 老墨

GPT-5.4 来了,全球风靡的 OpenClaw 还能养多久?

大家好,我是极客老墨。 今天我们不聊技术,咱们聊聊 AI 助手的未来。 早上(3月7日)刷到 36氪那条新闻 的时候,我正在用 OpenClaw 帮我整理昨天的代码笔记。标题很刺眼:“GPT-5.4 发布,OpenClaw 的能力要被替代?” 我愣了一下,然后笑了。 不是因为觉得 OpenClaw 真的会被替代,而是这种"替代论"太熟悉了。去年这个时候,大家还在讨论 Copilot 会不会让程序员失业;今年,轮到了 OpenClaw。 说实话,GPT-5.4 的发布确实让我挺激动的。不是看新闻激动,而是因为我之前在 Cursor 里体验过它。 那种体验,怎么说呢? 就是你写一个函数,它不仅能理解你想干什么,还能主动帮你重构,把那种"能跑但有点丑"的代码,改成"看起来像是精心设计的"样子。有一次我写了个数据处理脚本,逻辑有点绕,它直接给我重写成管道式处理,还附带了注释:“这样更容易测试”。 我当时盯着屏幕看了三秒钟,然后默默删掉了自己原来的代码。 这就是 GPT-5.4 的代码能力。不是简单的补全,是真的在理解你的意图,然后给出更好的方案。 但今天的重点不是这个。 让我真正思考的是另一件事:GPT-5.4 原生支持桌面操作了。 根据那篇文章,OpenAI 把 CUA(Computer Use Ability)直接整合进了模型。这意味着什么?意味着 GPT-5.4 可以直接操作你的电脑,打开浏览器、点击界面、发送邮件、安排日历——基本上就是 OpenClaw 现在做的事,但它是原生的。 相比于 5.2, OSWorld Verified 的测试成绩从 47.3% 提升到 75%,BrowseComp 从 65.8% 提升到 82.7%。 OSWorld Verified: AI 在真实操作系统环境中完成 开放式任务 的能力。 BrowseComp: AI 在 浏览器环境 中完成复杂任务的能力。 数字很枯燥,但背后的意思很清楚:OpenAI 正式入场"AI 操作电脑"这个赛道了。 ...

2026-03-07 · 1 min · 145 words · 老墨

AI 龙虾第一天就给我写了个程序,还会定时爬数据

大家好,我是极客老墨。 经过昨天的艰难跋涉(详见上篇),OpenClaw 终于在 Windows 上跑起来了。第一天使用下来,说实话,这玩意儿比我想象的能干。 让它帮我写代码:经典贪吃蛇游戏 作为技术控,第一个尝试必须是代码!我还是让 小墨(我的AI助理) 帮我写一个经典的贪吃蛇网页游戏。 我直接告诉他:“小墨,帮我写一个贪吃蛇的网页游戏,最后文件直接发给我”。结果他没反应,后来才知道,原来他正卖力的写代码去了,顾不上理我,因为现在数据还没有能力流式返回,必须等他写完了给我我才知道(晚上的「飞书龙虾会直播」我看了,已经有流式返回数据的插件了,后边研究了再来讲) 写完之后,他并没有直接给我文件,而是问我怎么给我这个文件。这里应该是我的提示词没优化好,第一次配合,有点翻车。 再次确认让他发给我,这次就对了。打开游戏一看——界面还不错,完成度100%。就是速度太快了,我玩了几次才适应过来。 第二个任务:自动搜索小红书爆款文案 我的想法很简单:让 AI 助手自动搜索小红书上某个类目的爆款视频标题和内容。 OpenClaw 的做法很硬核——直接本地打开浏览器,像真人一样操作。这也是它完成工作的主要方式:模拟真人操作电脑。 让他搜索小红书,结果告诉我要登录: 登录后,他成功打开浏览器并返回了数据给我: 再次让他搜索 OpenClaw: 这是他打开的网页: 他能够读取网页并返回准确的数据回来。 第三个任务:每日早报功能 我很关注 AI 领域的新闻,所以想让小墨每天定时给我报告最新的新闻和 AI 资讯。我直接告诉他: 1你好,小墨。整理下边的信息发给我 21. 获取今天成都天气 32. 获取今日微博全球新闻榜前10条,标题为微博新闻 43. 获取今日最新的AI相关的新闻资讯前10条,标题为AI咨询 54. 整理成自带链接可以直接点击的简洁文字内容发给我 一开始 prompt 忘记加链接了,补上后,他返回了正确的数据。同样地,他会打开本地浏览器,输入网址自己看,最后返回正确的数据: 最后,我需要每天定时给我,他成功帮我搞定: 一个小插曲,他干完活浏览器没关闭,我提醒他之后他认识到了自己的错误。 可以看到,gateway 控制页面上的“定时任务”菜单中查看,已经加上了这个任务: 晚上看了飞书玩虾大会,几点感悟 晚上看了飞书的玩虾大会直播,看大牛们都是怎么玩龙虾的,有几点感悟: 1. 自动化办公真的来了 飞书与 OpenClaw 集成之后,抓数据、做报表、整理知识库这些日常工作都可以交给 OpenClaw 了。 2. 多只龙虾协同配合 多个龙虾搞到群组中,一起协同配合,形成工作流。这比传统的工作流工具方便得多,而且更智能。龙虾之间在不同的工程中可以互相促进,并变得更智能。 ...

2026-03-06 · 1 min · 166 words · 老墨

为了搞个 AI 助手,我在 Windows 上折腾了整整一天

大家好,我是极客老墨。 说实话,macOS 上装 OpenClaw 那叫一个丝滑,一行命令下去,半小时搞定全部配置。 结果换到 Windows,我心态崩了。 PowerShell 版本不对、权限配置踩坑、飞书机器人配置更是绕得我头晕。整整两天,我差点把电脑砸了。 但搞完之后,我发现 Windows 部署其实没那么难,只是网上没人把坑说清楚。 今天老墨把踩过的坑全抖出来,看完你半小时就能搞定。 我的 Mac 是办公电脑,但我想搞个"永不关机"的 AI 助手 之前(2月份)写了一篇 在 macOS 安装 OpenClaw 的文章,当时国内 IM 应用还没支持。没想到一个月过去,飞书、钉钉、企业微信、QQ 居然全都支持了,更新速度之快! 我的 Mac 是办公电脑,不能 24 小时跑着玩。但我又想要一个随时能召唤的 AI 助手,怎么办? 翻出角落里落灰的 Windows PC,性能没得说,就是有点费电😭。没办法,Mac Mini 一机难求啊,各位有没有 mini PC 可以推荐的? 言归正传,咱们开始。 前置检查:PowerShell 版本这个坑,90% 的人会踩 装之前,先看看你的 PowerShell 版本。低于 7.0,后面装依赖会报错到你怀疑人生。 怎么查?打开 PowerShell(不是 CMD!),输入: 1$PSVersionTable.PSVersion 如果显示的是 5.1,恭喜你,中奖了。 必须升级到 7,不然装 OpenClaw 的时候会报各种奇奇怪怪的错。 升级方法简单到离谱: 打开微软应用商店 搜索 “PowerShell” 点击安装 装完之后,一定要用新打开的 PowerShell 7 窗口,别用原来的旧窗口。 ...

2026-03-05 · 2 min · 391 words · 老墨

Go这样检测Data Race让并发程序又简单了许多

大家好,我是极客老墨。 写并发代码最怕什么?不是死锁,不是性能问题,而是那些偶尔才出现、难以复现的诡异 bug。这些 bug 的罪魁祸首往往就是 Data Race(数据竞争)。 什么是 Data Race? Data Race 的定义很简单:当两个或多个 goroutine 同时访问同一个变量,且至少有一个在写入时,就会发生数据竞争。 这就像两个人同时在一张纸上写字,最后的结果可能是谁的字都不完整,或者干脆就是一团乱码。 举个例子: 1var counter int 2 3func increment() { 4 counter++ // 看起来是一行代码,实际上是三个操作:读取、加1、写入 5} 6 7func main() { 8 go increment() 9 go increment() 10 time.Sleep(time.Second) 11 fmt.Println(counter) // 结果可能是 1,也可能是 2 12} 这段代码看起来没问题,但 counter++ 并不是原子操作。两个 goroutine 可能同时读到 0,然后都写入 1,最终结果就是 1 而不是期望的 2。 顺便说一句,Data Race 和 Race Condition 是两个不同的概念,很多人会混淆。我之前翻译过一篇文章专门讨论这个问题,感兴趣可以看看。 Go 内存模型定义了 Happens-Before 规则来保证程序执行的顺序性,这和 Java 内存模型的思路类似。但光有规则还不够,Go 从 1.1 版本开始提供了 Race Detector,让我们能在运行时检测出这些问题。 ...

2026-03-03 · 5 min · 870 words · 老墨

2026年2月:AI狂飙的一个月,老墨的技术探索之旅

2026年2月:AI狂飙的一个月,老墨的技术探索之旅 大家好,我是极客老墨。 2026年的2月,对我来说是个特别的月份。不仅因为这是马年春节,更因为这一个月我完成了一次彻底的技术转型——从一个传统的后端开发者,变成了一个AI时代的"全栈玩家"。 这个月我发布了多篇技术文章,涵盖AI、Golang、工具开发等多个领域。有些在我的博客上已经发布几年了,这月拿出来重新整理和更新了,有些则是老墨一字字重新码起来的。熟悉我的读者都知道,老墨秉持的风格就是简洁、高效,只讲干货、不讲废话! 本月自公众号恢复更新以来,粉丝数量和阅读量都有非常明显的增长,非常感谢大家的关注🙏!今天就来盘点一下这个月的收获,也给关注我的朋友们一个交代。 一、AI实战系列:从入门到精通的完整路径 这个月最大的主题就是AI。从本地部署到智能体开发,我用4篇连载文章(EP00-EP03)带大家走完了整个流程。 EP00:DeepSeek R1本地部署实战 核心内容:手把手教你在Mac上用Ollama部署DeepSeek R1,实现完全免费、隐私安全的本地AI环境。 技术亮点: 详细的模型选择指南(1.5B到32B全覆盖) 性能优化技巧(Flash Attention + KV Cache量化) 接入VS Code实现免费的Copilot替代方案 读者反馈:“终于不用担心代码泄露了,本地跑DeepSeek真香!” EP01:为什么选OpenClaw做数字管家 核心观点:OpenClaw不是简单的聊天工具,而是一个运行在本地的AI Gateway,能让你躺在床上用手机指挥电脑干活。 深度解析: OpenClaw的架构设计(Gateway模式) 与Claude Desktop的本质区别 创始人Peter Steinberger的传奇故事(卖掉公司1亿欧元后重新创业) 核心价值:“Your assistant. Your machine. Your rules.” —— 这才是真正的私人AI助理。 EP02:安装和搭建OpenClaw 实战指南:从零开始配置OpenClaw,接入Telegram/Discord,实现远程控制。 踩坑经验: Telegram配置的完整流程(包括Pairing机制) Discord的复杂权限设置 网络代理的关键配置 读者评价:“跟着教程一步步来,半小时就搞定了!” EP03:OpenClaw的Docker监狱 安全第一:如何用Docker隔离OpenClaw,防止AI"越狱"搞破坏。 技术深度: 文件系统隔离策略 网络白名单配置 官方Sandbox机制详解 从Native迁移到Docker的完整方案 核心理念:“永远不要信任你的Agent” —— 这是极客生存法则第一条。 大模型实战指南(2026新春版) 全面对比:国内外主流大模型的深度评测,从GPT-5到DeepSeek V4,从Claude 4到通义千问Qwen 3。 评分体系: 复杂任务成功率 推理深度与幻觉率 智能体交互体验 核心结论: GPT-5 Omni:深度推理天花板(9.9分) Claude 4 Opus:拟人化与长记忆之王(9.8分) Qwen 3:国内综合最强六边形战士(9.7分) DeepSeek V4:代码性价比之王(9.6分) 选型建议:“组合使用,才是2026年最高效的AI生存之道” ...

2026-02-27 · 2 min · 272 words · 老墨

Go模糊测试实战:让AI帮你找Bug

大家好,我是极客老墨。 之前写过一篇Go 测试:写得爽,跑得快,聊了单元测试、表格驱动测试和基准测试。很多朋友留言问:“老墨,单元测试我会写了,但总感觉测不全,怎么办?” 这就是今天要聊的:模糊测试(Fuzzing)。 写代码爽,写测试累。更累的是,你辛辛苦苦写了一堆单元测试,覆盖率看起来挺高,结果上线还是出Bug。为啥?因为你只测了你能想到的场景,没测你想不到的。 Go 1.18 开始,官方直接把模糊测试内置了。它会自动生成海量随机输入,帮你找到那些"想不到的 Bug"。不需要装第三方库,go test 就能跑。 什么是模糊测试?一句话说清楚 模糊测试就是让程序自己生成各种奇葩输入,疯狂测试你的代码,直到找出Bug为止。 传统单元测试:你说测什么就测什么。 模糊测试:程序自己想办法搞你,直到搞出问题。 从Go 1.18开始,Go官方在标准库里内置了Fuzzing支持。不需要装第三方工具,开箱即用。 为什么要用模糊测试? 老墨先给你看个真实案例。 假设你写了个URL解析函数,单元测试写了10个case,都通过了。结果上线后,用户输入了一个带emoji的URL,程序直接panic。 为什么?因为你的测试用例里没有emoji。 单元测试的局限性: 只能测你想到的场景 边缘情况容易遗漏 维护成本高(每个case都要手写) 模糊测试的优势: 自动生成海量测试数据 能发现你想不到的边缘情况 特别擅长找安全漏洞(SQL注入、缓冲区溢出等) 实战案例:一个看似简单的字符串反转函数 我们来写个最简单的函数:反转字符串。 1func Reverse(s string) string { 2 b := []byte(s) 3 for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 { 4 b[i], b[j] = b[j], b[i] 5 } 6 return string(b) 7} 看起来没问题吧?我们写个单元测试: 1func TestReverse(t *testing.T) { 2 testcases := []struct { 3 in, want string 4 }{ 5 {"Hello, world", "dlrow ,olleH"}, 6 {" ", " "}, 7 {"!12345", "54321!"}, 8 } 9 for _, tc := range testcases { 10 rev := Reverse(tc.in) 11 if rev != tc.want { 12 t.Errorf("Reverse: %q, want %q", rev, tc.want) 13 } 14 } 15} 运行测试: ...

2026-02-26 · 5 min · 936 words · 老墨

Go模块管理踩坑实录:从入门到放弃再到真香

大家好,我是老墨。 很早之前,翻译了一篇 Golang 官方的模块管理文档中文,那篇有点“官方”了,今天老墨搞一篇接地气的模块实战教程。 说实话,我第一次接触 Go 模块的时候,内心是拒绝的。 GOPATH 那套虽然老,但好歹能用。突然冒出来个 go.mod、go.sum,还有什么 replace、indirect,看着就头大。更别提那些看起来像乱码的版本号:v1.2.3-0.20210101000000-abcdef123456,这是什么鬼? 但折腾了几个月后,我发现:真香。 今天就把我踩过的坑、学到的经验,全部掏出来。不讲理论,只讲实战。 为什么要用Go模块? 先说说为什么要用模块,而不是继续用GOPATH。 GOPATH 的三大痛点 版本管理是灾难 所有依赖都在 $GOPATH/src 下 同一个包只能有一个版本 项目 A 用 v1.0,项目 B 用 v2.0?抱歉,做不到 依赖地狱 依赖的依赖的依赖……谁也不知道用了什么版本 换台机器编译?祝你好运 团队协作?每个人的依赖都不一样 无法复现构建 今天能编译,明天就不行了 因为依赖包更新了 你根本不知道 Go 模块解决了什么 每个项目独立管理依赖 版本号明确,可复现构建 依赖关系清晰,记录在 go.mod 校验和保证安全性(go.sum) 支持私有仓库和代理 快速上手:5分钟创建第一个模块 1. 初始化模块 1# 创建项目目录 2mkdir myproject 3cd myproject 4 5# 初始化模块 6go mod init github.com/yourusername/myproject 这会生成一个go.mod文件: 1module github.com/yourusername/myproject 2 3go 1.21 就这么简单。 2. 添加依赖 写点代码,导入个包: 1package main 2 3import ( 4 "fmt" 5 "github.com/gin-gonic/gin" 6) 7 8func main() { 9 r := gin.Default() 10 r.GET("/", func(c *gin.Context) { 11 c.JSON(200, gin.H{"message": "Hello"}) 12 }) 13 r.Run() 14} 然后: ...

2026-02-25 · 4 min · 751 words · 老墨

2026 年了,这些 AI IDE 还能白嫖

大家好,我是极客老墨。 去年这个时候,我还在纠结要不要订阅 Cursor Pro。今年,我的电脑里装了七八个 AI IDE,一个月下来,花的钱是零。 不是我抠门,是这些工具的免费额度真的够用。写个脚本、改改 Bug、重构代码,基本不用掏钱。当然,如果你是重度用户,每天写几千行代码,那该付费还是得付费。但对于大部分开发者来说,薅羊毛的空间还是很大的。 下面这些工具是我这段时间用下来觉得值得折腾的,有些需要科学上网,有些需要改地区,有些直接某宝买个 Key 就能用。别问我怎么搞,懂的都懂。 为什么需要 AI IDE? 说实话,刚开始我也觉得 AI 写代码是噱头。直到有一次我要写个 Python 脚本处理 JSON 数据,平时可能要查半天文档,结果 Cursor 直接给我生成了,改都不用改。 回想一下,2025 年初的时候,GitHub Copilot 还只能做行内补全,写个函数名它给你补全函数体,仅此而已。那会儿大家还在惊叹"哇,AI 能写代码了"。结果到了 2025 年中,Cursor 出来了,直接能多文件编辑,Cmd+K 一下改十几个文件。再到 2025 年底,Claude 3.5 Sonnet 发布,上下文窗口直接干到 200K,能理解整个项目的代码逻辑。 现在 2026 年初,这才过了一年,AI IDE 已经卷到什么程度了?Windsurf 免费无限补全,Kiro 支持本地模型和自定义工作流,Antigravity 能看懂设计稿直接生成 UI 代码。一年前你还在为 Copilot 的 10 刀月费纠结,现在免费工具多到用不过来。 更夸张的是模型本身的进化速度。GPT-4 刚出来的时候,写个复杂算法还经常出 Bug。现在 Claude 3.5 Sonnet 和 GPT-4 Turbo,不仅能写代码,还能做代码审查、重构、写测试、解释架构。去年你还在担心 AI 会不会抢饭碗,今年你已经在担心不用 AI 会不会被淘汰。 这个速度真的有点吓人,而且仍然再以肉眼可见的速度飞速发展。谁能想到,在2026年初,你只要描述你的需求,AI就能直接给你生成完整的、能够直接运行的前后端代码,包括 UI 设计都能给你实现!虽然编写大型代码还存在一定的问题,但是老墨大胆预测一下,2026年将迎来 AI 齐头并进、百花争艳的盛况! ...

2026-02-23 · 5 min · 969 words · 老墨

终端党的武器库:这些工具让我效率起飞

大家好,我是极客老墨! 说实话,我已经很久没打开过图形化的 Git 客户端了。 不是装逼,是真的用不着。终端里敲几个快捷键,commit、push、rebase 全搞定,比鼠标点来点去快多了。写代码也一样,Neovim 配合 AI 工具,效率直接起飞。 这些年折腾下来,我的工作流基本都在终端里完成:写代码、审代码、写文章、发 HTTP 请求、跑脚本、运维操作……全都不需要离开黑框框。下面这些工具是老墨亲测好用的,不是什么"推荐清单",是我每天都在用的家伙。 Neovim Neovim 是我的主力编辑器。 现在 VSCode 系的 AI IDE 满天飞,Cursor、Windsurf、Kiro 一个比一个卷。但我写脚本和小项目还是习惯用 Neovim,配合 Claude Code 或者 OpenCode,该有的 AI 能力一个不少,关键是够轻、够快、够纯粹。 学习成本?确实高。自己配置需要懂点 Lua,不过现在有 Lazyvim 这种开箱即用的配置,省了不少事。我平时也会用 Cursor、Kiro、Antigravity 这些 AI IDE 蹭免费额度,但会装 Neovim 插件,把快捷键和配置同步过去——肌肉记忆改不了。 WezTerm WezTerm 是我现在用的终端。 GPU 加速、跨平台、Rust 写的,性能没得说。配置是用 Lua 写的,刚开始确实要折腾一阵子,但配好之后就是你的专属终端了。配合 Neovim 用起来特别顺手,分屏、标签页、字体渲染都能调到自己喜欢的样子。 iTerm2?用过,但 WezTerm 更快,而且配置文件可以直接扔 GitHub 同步,换机器直接拉下来就能用。 Lazygit Lazygit 是我用过最爽的 Git 工具。 TUI 界面,几个快捷键就能完成 commit、push、rebase、cherry-pick,再也不用记那些鬼畜的 Git 命令了。刚开始需要看看文档熟悉一下快捷键,但上手之后就回不去了。 ...

2026-02-22 · 2 min · 319 words · 老墨

2026马年春节,我用AI帮我写了一个嘴替小程序

春节回家,最怕的是什么?不是堵车,不是抢票,而是亲戚的灵魂拷问。 “工资多少啊?” “有对象了吗?” “什么时候买房?” 今年我决定不再被动挨打,用3天时间撸了个"春节嘴替"小程序,让AI帮我练习怼人。更重要的是,整个开发过程几乎全靠AI完成——从产品设计到代码实现,我只是个"提示词工程师"。 先看效果 小程序叫"春节嘴替",核心功能有三个: AI嘴替对话 - 和虚拟亲戚battle,练习高情商回怼 妈妈银行存单 - 生成趣味压岁钱对账单 马年开运头像 - 制作春节专属头像 神仙祝福 - AI生成个性化拜年祝福语 最有意思的是AI嘴替功能。我设计了4个经典角色: 势利眼二姨(儿子阿里P8,逢人就炫) 催婚大姑(见面就问对象) 凡尔赛邻居(女儿在国外"留学") 严肃二舅(体制内,看不起互联网打工人) 每个角色都有完整的人设和攻击策略,AI会根据你的回复动态调整战斗力。如果你怼得好,AI会破防;如果你怼得不够狠,AI会继续压制你。 你可以体验一下,看看效果: AI开发全流程 这个项目最大的特点是:几乎全部由AI来完成。 1. 产品设计:Google AI Studio + Gemini 3.0 Pro Preview 我先把需求丢给Gemini: “我想做一个春节主题的小程序,帮年轻人应对亲戚的尬聊。你帮我设计产品方案。” Gemini给出了完整的PRD文档,包括: 目标用户画像 核心功能定义 技术架构建议 上架物料清单 开发时间表 这份文档直接成为了我的开发指南。AI不仅帮我理清了思路,还提醒我注意内容合规、类目审核等坑点。 2. UI素材:Nano Banana Pro(图片生成) 小程序需要大量视觉素材:角色头像、背景图、装饰元素等。我全部用Google AI Studio的图片生成模型搞定。 典型的Prompt: A cute 3D cartoon Chinese aunt character, wearing red traditional clothes, holding a smartphone, slightly snobbish expression, pop mart style, bright red background, Chinese New Year atmosphere, 8k 生成的图片质量很高,直接就能用。关键是速度快,几秒钟就能出图,比找设计师或自己画快太多了。 ...

2026-02-20 · 2 min · 335 words · 老墨

大模型实战指南(2026年新春版):深度推理与智能体的时代

大模型实战指南(2026年新春版):深度推理与智能体的时代 发布背景速览 2026年初,各大AI公司密集发布新一代大模型,标志着大模型技术进入新的发展阶段: Google Gemini 3.0:2026年1月发布,重点强化多模态能力,在图像和视频处理方面实现重大突破,成为多模态领域的领跑者。 ChatGPT 5.3:OpenAI在2025年底推出GPT-5 Omni后,2026年初发布5.3版本,进一步优化深度推理能力,在复杂逻辑推导方面保持领先。 Claude Opus 4.6:Anthropic在2026年初推出4.6系列,特别针对代码生成和智能体场景进行深度优化,成为开发者的首选工具。 国内模型:阿里通义千问Qwen 3、百度文心一言4.0、字节Seedance 2.0等均在2026年初完成重要更新,在中文理解和特定领域应用上实现突破。 最近被朋友问麻了:“老墨,都2026年了,GPT-5到底值不值那个天价订阅费?” “Claude 4的超长记忆真的不丢包了吗?” “国产模型现在的‘推理能力’是不是真的赶上来了?” 作为一个AI探索的老鸟,我想说:2026年的大模型之战,已经从“生成内容”变成了“解决复杂问题”。 如果说两年前大家还在惊叹AI能写诗、画图,那么现在,如果你不能帮我自主完成一个跨应用的工作流,或者进行长达半小时的深度逻辑推导,那你都不好意思叫顶尖模型。 今天老墨就把压箱底的实测经验掏出来,从实战角度对比国内外主流大模型(2026版)。不玩虚的排行榜,只聊“怎么用、在哪用、值不值得用”。 注意,这里老墨只列出正式发布的、老墨实际使用过的、能够直接上生产环境用的大模型版本,其他的还没有正式发布的版本比如 gpt-5.3-turbo-preview、 Google Gemini 3.0 Pro Preview 等暂不考虑。 此外,评分都是根据老墨的个人使用经验,难免有疏漏。如果有任何错误或建议,请在评论区留言。 先搞懂3个问题:老墨不说废话(2026年版) 1. 大模型现在进化到哪一步了? 别再只盯着“多模态”看了,那在2024年底就已经是标配了。2026年的关键词是: 深度推理(System 2 Thinking):模型不再是只会快思考的“鹦鹉”,它们现在能像人类一样慢下来,进行多步规划、自我反思和纠错。这是解决数学难题和复杂编程的关键。 智能体化(Agents):模型不再是一个等着你提问的聊天框,而是能主动操控浏览器、终端、为你点外卖、订机票的“数字员工”。 记忆与个性化:顶尖模型现在能记住你几个月前说过的话,真正成为了懂你的私人助理,而不是每次都要重新介绍背景。 2. 老墨的评分凭什么? 两年前的那些MMLU基准早就不够看了。现在老墨主要看: 复杂任务成功率:扔给它一个模糊的商业需求,它能不能拆解并最终交付结果? 推理深度与幻觉率:在长链条逻辑推导中,它会不会自己把自己绕晕?(现在幻觉已经大幅降低,但依然存在)。 智能体交互体验:它调用外部工具(如搜索、代码解释器、第三方API)顺不顺手? 3. 国内外模型现在的真实差距? 老墨结论(2026年版): 顶尖战力:OpenAI和Anthropic依然在**“深度推理”和“通用智能体架构”**上引领方向,属于“定义未来”的角色。 多模态王者:Google的Gemini在图像和视频处理方面已经超越ChatGPT,在多模态领域处于绝对领先地位。 中国速度:国内头部大厂(阿里、字节、百度、深求)在应用层打磨得极好,在**特定领域(如中文语境下的复杂任务、性价比代码生成)**已经完全不输甚至局部领先国际巨头, 但是,在图像图像处理、视频处理等多模态领域,仍然有明显的差距。 格局:以前是仰望,现在是慢慢看齐,中国大模型正在以非常快的速度追赶。 国际主流大模型:探索智能上限的先行者 1. GPT-5 Omni (OpenAI) —— 深度推理的绝对王者 最新动态:2025年底发布的重磅炸弹,目前(2026年初)公认的战力天花板。 核心能力:革命性的“慢思考”模式(System 2)。遇到难题时,你会看到它显示“正在规划思路…”,然后进行长达数十步的自我推导和验证。此外,它的原生全模态(视频/音频/文本无缝实时流转)体验极其丝滑。 老墨评价:它是拿来解决你解决不了的问题的。 如果你只是写个邮件,用它属于杀鸡用牛刀。但如果你要设计复杂的软件架构、推导前沿数学猜想,或者需要一个能真正理解视频内容并和你实时语音辩论的AI,GPT-5 Omni是唯一选择。贵是真贵,强是真强。 适合场景:前沿科研、复杂系统设计、需要极高逻辑密度的任务、实时视频/语音深度交互。 老墨评分:9.9分(扣0.1分是因为价格和偶尔的过度思考) 在 Cursor 最新版本中早就支持了 GPT 5.3 版本,老墨也在测试中,目前来看,这是目前地球上写代码最强的“大脑”, 与 Claude Opus 4.6 有点旗鼓相当的味道了,代码理解能力超强,这里暂不赘述,后续在考虑撰文来评测一番。 ...

2026-02-15 · 2 min · 294 words · 老墨

[GoLang避坑实战-00] 别再犹豫了!一个老码农的真心话:为什么 2026 年必学 Go

大家好,我是极客老墨。 在互联网行业摸爬滚打十几年,从早期的LAMP时代,到Java的Spring全家桶,再到后来的云原生浪潮,老墨见证了技术的每一次变迁。 最近很多朋友问我:“老墨,现在的AI写代码这么厉害,大模型日新月异,智能IDE更是百花齐放,Claude Code、Cursor 简直是神,还需要专门去学一门后端语言吗?如果学,学什么比较好?Java还是Python?或者 Rust?” 这是一个非常好的问题。今天老墨就结合自己的经验,跟大家聊聊为什么在这个AI横行的时代,我依然建议大家掌握Golang,并且会手把手教你如何拿下它。 1. AI时代,为什么还要学后端语言? 很多同学觉得,现在AI不仅能生成CRUD代码,甚至能帮你完成全套编码、测试,这样的发展速度,我真的有必要学编程?我只需要会写Prompt不就行了吗? 大错特错。 AI确实能提高效率,但它目前还无法替代架构思维和底层认知。 知其然,更要知其所以然:AI生成的代码,如果出了Bug,或者性能不达标,你看不懂怎么调优? 不仅仅是Coder,更是Engineer:单纯的写代码(Coding)会被AI取代,但工程化能力(Engineering)——包括系统设计、并发处理、错误治理、服务部署,是AI很难完全掌控的。 掌握控制权:作为一名开发者,你不能做AI的傀儡。你需要有能力判断AI生成的代码是垃圾还是金子。 掌握一门强类型的、编译型的后端语言,能让你深入理解计算机的工作原理:内存管理、进程线程、网络协议。这些内功,是Prompt Engineering给不了你的。 2. 为什么是Golang? 在众多后端语言中,老墨首推 Go (Golang)。不是因为赶时髦,而是基于实用主义的考量。 Java:沉重的企业级战车 Java确实强大,生态无敌,将近30年了仍然是一门非常活跃的开发语言。但是: 太重了:Spring Boot启动一下,内存吃掉几百兆是常事。对于想要快速开发微服务或者云原生应用的极客来说,有点“大炮打蚊子”。 语法繁琐:虽然有了Lombok和新版本的语法糖,而且语法糖、新特性在一直增加,就是为了简化开发、提高效率,但比起Go的简洁,Java依然显得啰嗦。 JVM调优是玄学:GC调优、JVM参数配置,是一门高深的学问,对于初学者来说门槛较高。 Rust:陡峭的绝壁 Rust绝对是好语言,内存安全,性能极致。但是: 学习曲线太陡峭:所有权(Ownership)、借用(Borrowing)、生命周期(Lifetime),这些概念能劝退90%的初学者。老墨到现在仍然还在学习 Rust,深有体会! 开发效率:为了通过编译器的检查,你可能需要花费大量时间与编译器搏斗。对于大多数互联网业务应用来说,Rust的开发效率不如Go。 Golang:平衡的艺术 Go语言是Google出品,有着纯正的工程血统。 简单直接:只有25个关键字(早期),语法极其简洁,没有花哨的语法糖。任何Go程序员写的代码,风格都惊人的一致,这在团队协作中是巨大的优势。 天生并发:go func(),一个Goroutine开启并发,Channel进行通信。这是我见过的处理并发最优雅的方式,没有之一。 性能强悍:编译型语言,接近C/C++的性能,但开发效率接近Python。 云原生通用语:Docker、Kubernetes、Prometheus…这些云原生时代的基石,全是Go写的。学了Go,你就拿到了通往云原生世界的门票。 老墨总结: 如果你想快速构建高性能的后端服务,不想被复杂的语法和繁重的运行时拖累,Go是你的不二之选。 3. 极客老墨的Golang学习路径 很多同学这就去买书了,别急!听老墨一句劝:不要一开始就啃大骨头! 现代语言学习,讲究的是 “Learn by Doing”。 第一阶段:不仅是Syntax,更是思维转变(1-2周) 不要死记硬背语法。重点理解Go独特的概念: 接口(Interface):Duck Typing(鸭子模型),非侵入式接口,这和Java的implements完全不同。 Goroutine & Channel:不要用共享内存来通信,要用通信来共享内存。这是Go并发的核心哲学。 Defer & Panic:Go没有try-catch,适应它的错误处理机制。 第二阶段:标准库是最好的老师(2-3周) Go的标准库(Standard Library)写得非常漂亮。重点攻克: net/http:几行代码起一个Web Server。 fmt, io, bufio:理解IO操作。 encoding/json:JSON处理是后端日常。 context:重中之重! 并发控制、超时处理全靠它。 第三阶段:工程化实战(1个月) 光会写Hello World没用,你需要能干活的框架: ...

2026-02-10 · 1 min · 179 words · 老墨

EP03 - 试图驯服一只猛兽:OpenClaw 的 Docker 监狱

EP03 - 试图驯服一只猛兽:OpenClaw 的 Docker 监狱 昨天我在测试 OpenClaw 的 “File System Tool” 时,发生了一件让我冷汗直流的事。 我给它的指令是:“清理一下当前目录的临时文件”。 可能是因为我的 Prompt 写得太随意,它直接把我的整个 ~/Downloads 文件夹给清空了。 幸好那里只有一堆没用的安装包。但如果它删的是我的 ~/Documents 或者 .ssh 密钥呢? 这就是我们在 link:/posts/ai/why-i-choose-openclaw/[] 里提到的代价:强大的能力伴随着巨大的风险。 一个拥有 Shell 权限的 AI Agent,本质上就是一个盯着你键盘随时准备按下回车键的超级用户。在裸机 (Bare Metal) 上直接运行它,无异于把自家大门的钥匙交给一个喝醉了的锁匠。 今天,我们要给这个不仅聪明而且危险的家伙,造一座牢不可破的监狱。 这也是极客生存法则第一条:永远不要信任你的 Agent。 本文涉及本地Native安装的一些知识,你可以阅读上一篇 EP02 来了解它们。 为什么一定要用 Docker? 很多人觉得 Docker 只是为了方便部署。 错。对于 Agent 开发来说,Docker 是保命符。 文件隔离 (Filesystem Isolation): 把它关在 /app 里。它想 rm -rf /?请便,删的只是容器里的文件,我的 Mac 毫发无损。 网络白名单 (Network Whitelist): 我们可以限制它只能访问特定的 API,防止它把我的本地数据传给不知名的服务器。 环境一致性: 你不用担心 Node.js 版本不对,或者缺了什么 Python 库。 手把手构建 “The Cage” 我们不需要什么花哨的 k8s,一个简单的 Dockerfile 和 docker-compose.yml 就够了。 但这里有几个针对 Mac 用户和 Ollama 的关键坑,我都替你踩平了。 ...

2026-02-09 · 3 min · 562 words · 老墨

EP02 - 给你的电脑安装一个数字管家: 安装和搭建 OpenClaw

EP02 - 给你的电脑安装一个数字管家: 安装和搭建 OpenClaw 安装 OpenClaw 暂时抛开官方这些“深奥”的建议,我们先来尝试安装它,下一篇我们再来安全地把它关到“沙盒”中去。安装 OpenClaw 非常简单,只需要一行命令: 1# macos 2curl -fsSL https://openclaw.bot/install.sh | bash 3 4# windows 5iwr -useb https://openclaw.ai/install.ps1 | iex 但是过程中有许多注意的地方,以我的mac为例,我们来看一下安装过程。 终端执行上述命令后,会先检查一些依赖,比如node, npm等,如果你的电脑没有安装,需要先安装: 稍作等待,安装完成后,OpenClaw 会自动执行 OpenClaw doctor 命令,来诊断环境和安装是否正确。 由于我之前安装了旧版的 clawdbot, 它会自动迁移配置信息。 doctor 执行完成后,会自动进行设置,此时会弹出诸多选项让你做出选择,比如配置模型、配置聊天客户端、Skills 等。 最终完成会输出访问的url(默认是 http://127.0.0.1:18789), 就可以在浏览器中打开控制台(dashboard)了. 接入 Telegram (首选) 为什么首选 Telegram? 很遗憾,国内的IM目前 OpenClaw 都不支持, 对于飞书、钉钉的支持据说还在开发中,所以目前我们最好的方式就是选择 Telegram. 因为它是这个星球上对开发者最友好的 IM,没有之一: 不需要手机号验证码,不需要营业执照,不需要企业认证。 你只需要跟一个叫 @BotFather 的机器人聊两句,就能拿到通往 OpenClaw 的钥匙。 极客配置三步走: 搞定 Token 打开 Telegram,搜索 @BotFather (认准蓝标)。 发送指令 /newbot。 给你的机器人起个名字 (比如 MyJarvis) 和用户名 (必须以 bot 结尾,比如 my_jarvis_bot)。 BotFather 会给你一串红色的 Token,长得像这样:123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11。复制它 切勿外传,否则可能别人就帮你操作你的电脑了! 配置 OpenClaw 如果你之前已经设置了telegram,那么直接下一步。没有配置,则推荐使用交互式配置: 1openclaw channels add 选择 Telegram,然后粘贴 Token。 或者直接修改配置文件 ~/.openclaw/openclaw.json (更 Geek 的方式,不推荐,除非你完全掌握了OpenClaw): 1"channels": { 2 "telegram": { 3 "token": "YOUR_TOKEN_HERE" 4 } 5} 验证与配对 (Pairing) 在 Telegram 里找到你的机器人,点击 Start 或发送 /start。 ...

2026-02-07 · 2 min · 336 words · 老墨

EP01 - 告别 Claude Desktop:为什么我选 OpenClaw 做我的数字管家

EP01 - 告别 Claude Desktop:为什么我选 OpenClaw 做我的数字管家 To be honest,Claude Desktop 发布 MCP (Model Context Protocol) 的时候,我是真的很兴奋。 但那种兴奋只维持了三天。 当你真正试图把 AI 融入工作流时,你会发现 Claude Desktop 有两个致命死穴: 它被困在桌面上:你必须坐在电脑前才能用它。 它是闭源的黑盒:你不知道它怎么处理你的文件,每一条指令都像在把家门钥匙交给那个坐在旧金山办公室的陌生人。 直到我发现了 OpenClaw。 Not Just a Bot, It’s a Gateway 先澄清一个误区:OpenClaw 不仅仅是一个像 Chatbox 那样的“套壳客户端”。 它的本质是一个运行在你本地的 Gateway(网关)。 如果你读过它的官方文档,你会发现它的架构非常 Sex: WhatsApp / Telegram <-> Gateway (Localhost) <-> AI Agent (Tools) 这意味着什么? 这意味着你可以躺在床上用手机发消息(支持 WhatsApp/Telegram 等等几十种聊天客户端),指挥你书房里的 Mac 干重活。 这也是它的口号: “The AI that actually does things.” 我想这也是为什么他会这么大火的原因。 场景 A: 周末出门在外,服务器突然报警。你不用掏出电脑连热点 SSH,直接在 Telegram 里发一句:“查一下 Nginx 为什么挂了”。OpenClaw 帮你跑 tail -f /var/log/nginx/error.log 并总结给你。 场景 B: 路上突然想到一个 Idea。发给 OpenClaw:“记到我的 Obsidian 里,并同步到 GitHub”。它直接操作你本地的文件系统。 你可以到这里看看大家都在用 OpenClaw 做些什么:https://openclaw.ai/showcase ...

2026-02-05 · 2 min · 249 words · 老墨

为了学 AI,我用 Go + Fyne 手撸了一个原生视频下载器

为了学 AI,我用 Go + Fyne 手撸了一个原生视频下载器 大家好,我是老墨。 一个写了十几年代码,发际线依然坚挺,但最近确实有点焦虑的中年程序员。 为啥焦虑?还不是因为这该死的 AI。 从 24 年初 Sora 横空出世,到 Claude 3.5 杀疯了,再到最近 DeepSeek 甚至能自己修 Bug,这世界变化快得像开了二倍速。以前我们卷算法、卷架构,现在倒好,不仅要卷提示词,还要防着被自己的 IDE 抢了饭碗。 老墨我痛定思痛,觉得不能坐以待毙。打不过就加入嘛,我也开始疯狂恶补 AI 知识。 01 一个悲伤的故事:学习资料太多也是一种烦恼 要学 AI,最好的路径是什么?这年头文档更新赶不上模型迭代,最鲜活的知识全在视频里。YouTube 上的 Andrej Karpathy 大神课,B 站上的各种论文精读、实战通过… 于是我的浏览器收藏夹很快就爆了。 但我这人有个毛病,看视频喜欢囤。一来是有些干货太硬,得反复咀嚼;二来是作为技术人,总有一种由于网络不确定性带来的"松鼠症"——好东西必须存在本地硬盘里才踏实。 这时候问题来了:市面上的下载器,怎么就没一个顺手的? 某雷:广告多是其次,关键是我想下的 YouTube 和 B 站视频它基本都解析不了。对于我们这种想看外网 AI 前沿教程的人来说,它形同虚设。 某 IDM:嗅探功能很强,但碰到 YouTube/B 站 这种音视频分离的高画质(DASH流)视频就歇菜了,经常只能下个无声画面,心累。而且 Mac 上没有原生版,体验割裂。 Electron 系工具:界面是好看了,但这动不动几百兆的内存占用,我开个 PyCharm 跑模型本来就捉襟见肘,哪还有余粮养它们? 命令行 yt-dlp:这是真神,功能无敌。用了很久,自己写脚本都写了多个。但时间久了脚本太多,每次想下个视频还得敲命令,复制粘贴 URL,还得拼代理参数… 实在是比较麻烦。 “求人不如求己,为什么不能自己写一个GUI?” 这念头一出,我就兴奋了。写了几年的 Golang,这点事情不在话下。说干就干,开搞开搞。 02 技术选型:要做就做原生的 既然决定自己干,那必须立好 Flag: 要快:启动快,下载快。 要美:虽然我是后端出身,但也不能忍受丑陋的 UI。 要轻:拒绝 Electron,拒绝 WebView,我要纯原生。 基于这个标准,技术栈基本就锁死了: ...

2026-02-04 · 2 min · 360 words · 老墨

EP00 - DeepSeek R1 本地部署实战 (Mac篇)

EP00 - DeepSeek R1 本地部署实战 (Mac篇) 摘要: 别被几万块的显卡劝退。你的 MacBook Pro (Apple Silicon) 就是跑 DeepSeek R1 的神器。本文手把手教你用 Ollama 在本地跑起“满血版”推理模型,不仅免费,而且隐私绝对安全。 阅读时间: 5分钟 适用人群: 程序员、科研党、隐私敏感用户 硬件要求: M1/M2/M3/M4 Mac,推荐 16GB+ 内存 为什么要在本地跑 DeepSeek? 隐私安全: 你的代码、私有文档不需要上传到云端,断网也能用。 零延迟响应: 没有网络延迟,交互更丝滑(取决于模型大小)。 无审查: 你懂的。 免费: 不需要订阅费,只消耗电费。 核心工具:Ollama Ollama 是目前 macOS 上体验最好的大模型运行工具,没有之一。它开源免费,支持非常多的大模型,GitHub仓库在 这里, 目前161K的 Star。 用程序员最能听懂的话解释:Ollama 就是大模型界的 Docker。 Docker 让你可以一行命令跑 MySQL / Nginx。 Ollama 让你可以一行命令跑 DeepSeek / Llama3。 它在后台默默做了三件事:驱动 GPU、管理模型文件、提供 API 服务。装了它,你的 Mac 就有了“大脑”。 安装 Ollama 有两种方式: 方式 A: 官网下载 (推荐小白) 访问 ollama.com 下载 macOS 版本并安装。 ...

2026-02-03 · 2 min · 422 words · 老墨

Go高级教程:反射 (Reflection) 实战

大家好,我是极客老墨。 反射 (Reflection) 赋予了程序在运行时检查和修改自身状态的能力。从 JSON 解析到 ORM 框架(如 GORM),再到依赖注入,它们的底层都离不开反射。有人说"反射是魔鬼",也有人说"没有反射,就没有现代 Web 框架"。这篇就带你拆解 reflect 包,学会如何在运行时动态操作对象。 1. 核心概念:Type 和 Value 在 reflect 包中,有两位绝对主角: reflect.Type:这是啥?(类型信息,如 int, string, User) reflect.Value:这值多少?(具体的数据,如 42, “hello”, User{Name:“Hank”}) 一切反射操作的起点都是 interface{}。 1package main 2 3import ( 4 "fmt" 5 "reflect" 6) 7 8func main() { 9 x := 3.14 10 11 // 1. 获取类型 12 t := reflect.TypeOf(x) 13 fmt.Println("Type:", t) // float64 14 15 // 2. 获取值 16 v := reflect.ValueOf(x) 17 fmt.Println("Value:", v) // 3.14 18} graph LR subgraph iface ["interface{}"] direction TB TypePtr["_type pointer"] DataPtr["data pointer"] end TypePtr -->|"reflect.TypeOf"| RType["reflect.Type"] DataPtr -->|"reflect.ValueOf"| RValue["reflect.Value"] style iface fill:#f9f9f9,stroke:#333,stroke-width:2px,color:#333 style TypePtr fill:#e1f5fe,stroke:#01579b,color:#01579b style DataPtr fill:#e1f5fe,stroke:#01579b,color:#01579b style RType fill:#fff9c4,stroke:#fbc02d,color:#333 style RValue fill:#fff9c4,stroke:#fbc02d,color:#333 2. 三大反射定律 Go 的反射有三条铁律(出自 Rob Pike): ...

2026-01-28 · 3 min · 485 words · 老墨

Rust 学习笔记 23:面向对象特性 (Object Oriented Features)

Rust 学习笔记 23:面向对象特性 (Object Oriented Features) “The problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but you got a gorilla holding the banana and the entire jungle.” – Joe Armstrong Rust 是面向对象语言吗?这取决于你对 OOP 的定义。 如果定义是"封装、继承、多态",那么 Rust: 封装:有。struct 和 impl,以及 pub 关键字。 继承:没有。Rust 没有任何继承机制(Struct 不能继承 Struct)。 多态:有。通过泛型(静态多态)和 Trait Objects(动态多态)。 1. Trait Objects (动态分发) 我们在泛型那一章学过用 Trait Bound 实现多态: 1fn draw<T: Draw>(item: T) { item.draw(); } 这种是静态分发 (Static Dispatch)。编译器会为每种具体的 T 生成一份代码。优点是快,缺点是 Vec<T> 里的所有元素必须是同一种类型。 ...

2026-01-20 · 2 min · 215 words · 老墨

Python教程42:综合项目-图书管理系统

Python教程42:综合项目-图书管理系统 “纸上得来终觉浅,绝知此事要躬行。” 经过第四部分12课的学习,我们掌握了OOP的核心概念。今天通过一个完整的图书管理系统,综合运用所学知识。 1. 项目需求 功能需求 基本功能: 图书管理:添加、删除、搜索、借阅、归还 用户管理:注册、借阅记录 分类管理:按类别组织图书 进阶功能: 数据持久化(JSON) 借阅期限和逾期管理 统计报表 技术要求 使用类和对象 继承和多态 抽象基类 属性管理(@property) 异常处理 文件操作 2. 系统设计 类设计 Library System ├── Book(图书基类) │ ├── PhysicalBook(实体书) │ └── EBook(电子书) ├── User(用户类) ├── Library(图书馆类) ├── BorrowRecord(借阅记录) └── Storage(存储类) 3. 核心实现 Book基类 1from abc import ABC, abstractmethod 2from datetime import datetime 3 4class Book(ABC): 5 """图书抽象基类""" 6 7 def __init__(self, isbn, title, author, category): 8 self.isbn = isbn 9 self.title = title 10 self.author = author 11 self.category = category 12 self.is_borrowed = False 13 14 @abstractmethod 15 def get_type(self): 16 """获取图书类型""" 17 pass 18 19 def to_dict(self): 20 """序列化""" 21 return { 22 'isbn': self.isbn, 23 'title': self.title, 24 'author': self.author, 25 'category': self.category, 26 'is_borrowed': self.is_borrowed, 27 'type': self.get_type() 28 } 29 30 def __str__(self): 31 status = "已借出" if self.is_borrowed else "可借阅" 32 return f"{self.title} by {self.author} ({status})" 33 34class PhysicalBook(Book): 35 """实体书""" 36 def __init__(self, isbn, title, author, category, location): 37 super().__init__(isbn, title, author, category) 38 self.location = location # 书架位置 39 40 def get_type(self): 41 return "physical" 42 43 def to_dict(self): 44 data = super().to_dict() 45 data['location'] = self.location 46 return data 47 48class EBook(Book): 49 """电子书""" 50 def __init__(self, isbn, title, author, category, file_size): 51 super().__init__(isbn, title, author, category) 52 self.file_size = file_size # 文件大小(MB) 53 54 def get_type(self): 55 return "ebook" 56 57 def to_dict(self): 58 data = super().to_dict() 59 data['file_size'] = self.file_size 60 return data User类 1class User: 2 """用户类""" 3 4 def __init__(self, user_id, name, email): 5 self.user_id = user_id 6 self.name = name 7 self.email = email 8 self.borrowed_books = [] # ISBN列表 9 10 def can_borrow(self, max_books=5): 11 """检查是否可以借阅""" 12 return len(self.borrowed_books) < max_books 13 14 def borrow_book(self, isbn): 15 """借阅图书""" 16 if isbn not in self.borrowed_books: 17 self.borrowed_books.append(isbn) 18 19 def return_book(self, isbn): 20 """归还图书""" 21 if isbn in self.borrowed_books: 22 self.borrowed_books.remove(isbn) 23 24 def to_dict(self): 25 return { 26 'user_id': self.user_id, 27 'name': self.name, 28 'email': self.email, 29 'borrowed_books': self.borrowed_books 30 } 31 32 def __str__(self): 33 return f"User({self.name}, 已借{len(self.borrowed_books)}本)" BorrowRecord类 1class BorrowRecord: 2 """借阅记录""" 3 4 def __init__(self, user_id, isbn, borrow_date=None): 5 self.user_id = user_id 6 self.isbn = isbn 7 self.borrow_date = borrow_date or datetime.now() 8 self.return_date = None 9 self.due_date = self.borrow_date + timedelta(days=30) 10 11 @property 12 def is_overdue(self): 13 """是否逾期""" 14 if self.return_date: 15 return False 16 return datetime.now() > self.due_date 17 18 def mark_returned(self): 19 """标记为已归还""" 20 self.return_date = datetime.now() 21 22 def to_dict(self): 23 return { 24 'user_id': self.user_id, 25 'isbn': self.isbn, 26 'borrow_date': self.borrow_date.isoformat(), 27 'due_date': self.due_date.isoformat(), 28 'return_date': self.return_date.isoformat() if self.return_date else None 29 } Library类 1class Library: 2 """图书馆类""" 3 4 def __init__(self, name): 5 self.name = name 6 self.books = {} # ISBN -> Book 7 self.users = {} # user_id -> User 8 self.records = [] # BorrowRecord列表 9 10 def add_book(self, book): 11 """添加图书""" 12 if book.isbn in self.books: 13 raise ValueError(f"图书{book.isbn}已存在") 14 self.books[book.isbn] = book 15 16 def remove_book(self, isbn): 17 """删除图书""" 18 if isbn not in self.books: 19 raise ValueError(f"图书{isbn}不存在") 20 if self.books[isbn].is_borrowed: 21 raise ValueError("图书已借出,无法删除") 22 del self.books[isbn] 23 24 def register_user(self, user): 25 """注册用户""" 26 if user.user_id in self.users: 27 raise ValueError(f"用户{user.user_id}已存在") 28 self.users[user.user_id] = user 29 30 def borrow_book(self, user_id, isbn): 31 """借阅图书""" 32 # 验证 33 if user_id not in self.users: 34 raise ValueError("用户不存在") 35 if isbn not in self.books: 36 raise ValueError("图书不存在") 37 38 user = self.users[user_id] 39 book = self.books[isbn] 40 41 if book.is_borrowed: 42 raise ValueError("图书已被借出") 43 if not user.can_borrow(): 44 raise ValueError("借阅数量已达上限") 45 46 # 借阅 47 book.is_borrowed = True 48 user.borrow_book(isbn) 49 record = BorrowRecord(user_id, isbn) 50 self.records.append(record) 51 52 return f"{user.name}成功借阅《{book.title}》" 53 54 def return_book(self, user_id, isbn): 55 """归还图书""" 56 if user_id not in self.users: 57 raise ValueError("用户不存在") 58 if isbn not in self.books: 59 raise ValueError("图书不存在") 60 61 user = self.users[user_id] 62 book = self.books[isbn] 63 64 if not book.is_borrowed: 65 raise ValueError("图书未被借出") 66 67 # 归还 68 book.is_borrowed = False 69 user.return_book(isbn) 70 71 # 更新记录 72 for record in reversed(self.records): 73 if (record.user_id == user_id and 74 record.isbn == isbn and 75 not record.return_date): 76 record.mark_returned() 77 break 78 79 return f"{user.name}成功归还《{book.title}》" 80 81 def search_books(self, keyword): 82 """搜索图书""" 83 results = [] 84 keyword = keyword.lower() 85 for book in self.books.values(): 86 if (keyword in book.title.lower() or 87 keyword in book.author.lower() or 88 keyword in book.category.lower()): 89 results.append(book) 90 return results 91 92 def get_statistics(self): 93 """获取统计信息""" 94 total_books = len(self.books) 95 borrowed = sum(1 for book in self.books.values() if book.is_borrowed) 96 overdue = sum(1 for record in self.records if record.is_overdue) 97 98 return { 99 'total_books': total_books, 100 'available': total_books - borrowed, 101 'borrowed': borrowed, 102 'total_users': len(self.users), 103 'overdue_records': overdue 104 } 4. 使用示例 1# 创建图书馆 2library = Library("市图书馆") 3 4# 添加图书 5book1 = PhysicalBook("978-1", "Python编程", "作者A", "编程", "A-101") 6book2 = EBook("978-2", "数据结构", "作者B", "编程", 15.5) 7library.add_book(book1) 8library.add_book(book2) 9 10# 注册用户 11user = User("U001", "张三", "zhang@example.com") 12library.register_user(user) 13 14# 借阅流程 15print(library.borrow_book("U001", "978-1")) 16print(library.borrow_book("U001", "978-2")) 17 18# 搜索 19results = library.search_books("Python") 20for book in results: 21 print(book) 22 23# 统计 24stats = library.get_statistics() 25print(f"总藏书:{stats['total_books']}") 26print(f"可借阅:{stats['available']}") 27print(f"已借出:{stats['borrowed']}") 28 29# 归还 30print(library.return_book("U001", "978-1")) 5. 知识点回顾 这个项目运用了: ...

2026-01-08 · 5 min · 874 words · 老墨

Python教程41:面向对象最佳实践

Python教程41:面向对象最佳实践 “代码是写给人看的,顺便让机器执行。” 经过前面的学习,我们掌握了OOP的所有特性。今天总结Python面向对象的最佳实践,帮助你写出更优质的代码。 1. SOLID原则 S - 单一职责原则(Single Responsibility) 一个类只做一件事: 1# 不好:类职责太多 2class User: 3 def __init__(self, name): 4 self.name = name 5 6 def save_to_database(self): 7 """保存用户""" 8 pass 9 10 def send_email(self): 11 """发送邮件""" 12 pass 13 14# 好:职责分离 15class User: 16 def __init__(self, name): 17 self.name = name 18 19class UserRepository: 20 def save(self, user): 21 """保存用户""" 22 pass 23 24class EmailService: 25 def send(self, user): 26 """发送邮件""" 27 pass O - 开闭原则(Open/Closed) 对扩展开放,对修改关闭: 1# 好:使用多态扩展功能 2class Shape: 3 def area(self): 4 pass 5 6class Circle(Shape): 7 def __init__(self, radius): 8 self.radius = radius 9 10 def area(self): 11 return 3.14 * self.radius ** 2 12 13# 添加新形状无需修改现有代码 14class Rectangle(Shape): 15 def __init__(self, width, height): 16 self.width = width 17 self.height = height 18 19 def area(self): 20 return self.width * self.height L - 里氏替换原则(Liskov Substitution) 子类必须能替换父类: ...

2025-12-26 · 4 min · 727 words · 老墨

Go高级教程:其他并发工具

大家好,我是极客老墨。 Goroutine 和 Channel 是 Go 并发的基础,但有些场景它们不够用。频繁创建对象导致 GC 压力大?用 sync.Pool。并发读写 map 会 panic?用 sync.Map。简单的计数器用锁太重?用 atomic。 这篇就聊聊 Go 的高级并发工具,看看它们各自适合什么场景。 sync.Pool:对象复用 频繁创建和销毁大对象会给 GC 带来压力,sync.Pool 用于对象复用。 基本用法 1package main 2 3import ( 4 "fmt" 5 "sync" 6) 7 8// 创建对象池 9var bufferPool = sync.Pool{ 10 // New 函数:池为空时创建新对象 11 New: func() interface{} { 12 fmt.Println("Creating new buffer") 13 return make([]byte, 1024) 14 }, 15} 16 17func main() { 18 // 从池中获取对象 19 buf := bufferPool.Get().([]byte) 20 21 // 使用对象 22 copy(buf, []byte("Hello, World!")) 23 fmt.Println(string(buf[:13])) 24 25 // 归还到池中 26 bufferPool.Put(buf) 27 28 // 再次获取(会复用刚才的对象) 29 buf2 := bufferPool.Get().([]byte) 30 fmt.Println(string(buf2[:13])) // 还是 "Hello, World!" 31} 要点: ...

2025-12-20 · 9 min · 1831 words · 老墨

Python教程40:常用设计模式

Python教程40:常用设计模式 “不要重复造轮子。” 设计模式是解决常见问题的可复用方案。今天我们学习Python中常用的设计模式,提升代码设计能力。 1. 创建型模式 单例模式(Singleton) 确保类只有一个实例: 1class Singleton: 2 _instance = None 3 4 def __new__(cls): 5 if cls._instance is None: 6 cls._instance = super().__new__(cls) 7 return cls._instance 8 9# 或使用装饰器 10def singleton(cls): 11 instances = {} 12 def get_instance(*args, **kwargs): 13 if cls not in instances: 14 instances[cls] = cls(*args, **kwargs) 15 return instances[cls] 16 return get_instance 17 18@singleton 19class Database: 20 def __init__(self, url): 21 self.url = url 工厂模式(Factory) 根据条件创建不同对象: 1class ShapeFactory: 2 @staticmethod 3 def create_shape(shape_type): 4 if shape_type == "circle": 5 return Circle() 6 elif shape_type == "rectangle": 7 return Rectangle() 8 else: 9 raise ValueError(f"未知形状:{shape_type}") 10 11# 使用 12shape = ShapeFactory.create_shape("circle") 建造者模式(Builder) 分步骤构建复杂对象: 1class QueryBuilder: 2 def __init__(self): 3 self._select = [] 4 self._from = None 5 self._where = [] 6 7 def select(self, *fields): 8 self._select.extend(fields) 9 return self 10 11 def from_table(self, table): 12 self._from = table 13 return self 14 15 def where(self, condition): 16 self._where.append(condition) 17 return self 18 19 def build(self): 20 query = f"SELECT {', '.join(self._select)}" 21 query += f" FROM {self._from}" 22 if self._where: 23 query += f" WHERE {' AND '.join(self._where)}" 24 return query 25 26# 使用(链式调用) 27sql = (QueryBuilder() 28 .select("name", "age") 29 .from_table("users") 30 .where("age > 18") 31 .build()) 2. 结构型模式 适配器模式(Adapter) 使不兼容的接口协同工作: ...

2025-12-11 · 4 min · 658 words · 老墨

Rust 学习笔记 22:共享状态并发 (Shared-State Concurrency)

Rust 学习笔记 22:共享状态并发 (Shared-State Concurrency) “Do not communicate by sharing memory; instead, share memory by communicating.” – Go Language Slogan 虽然 Go 倡导通过通信来共享内存(Channel),但 Rust 同样提供了强大的共享状态并发工具。而且得益于所有权系统,Rust 中的锁是线程安全的(Thread Safety),你很难写出有数据竞争的代码。 1. Mutex (互斥锁) Mutex (Mutual Exclusion) 让同一时刻只有一个线程访问数据。 Rust 的 Mutex 有两个特点: 必须要先获取锁,才能通过解引用访问内部数据。这保证了你如果不加锁,根本拿不到数据(编译器按头让你加锁)。 RAII:锁的释放在 Guard 离开作用域时自动发生,不需要手动 unlock。 1let m = Mutex::new(5); 2{ 3 let mut num = m.lock().unwrap(); // 获取锁,num 是 MutexGuard 4 *num = 6; // 修改数据 5} // 离开作用域,锁自动释放 2. 原子引用计数 Arc 要在多个线程间共享 Mutex,直接传是不行的(所有权规则)。 你可能会想到 Rc<T>,但 Rc 不是线程安全的。 我们需要 Arc<T> (Atomic Reference Counting)。 ...

2025-11-30 · 2 min · 223 words · 老墨

Rust 学习笔记 21:并发编程 (无畏并发)

Rust 学习笔记 21:并发编程 (无畏并发) “Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.” – Rob Pike 在很多语言中,并发编程是噩梦。数据竞争 (Data Race)、死锁 (Deadlock)、竞态条件 (Race Condition) 让人防不胜防。 Rust 号称 “Fearless Concurrency”(无畏并发)。它利用所有权和类型系统,在编译期就把数据竞争扼杀在摇篮里。 1. 使用线程 Rust 默认使用 1:1 线程模型,即一个 Rust 线程对应一个操作系统线程。 1use std::thread; 2use std::time::Duration; 3 4fn main() { 5 thread::spawn(|| { 6 for i in 1..10 { 7 println!("hi number {} from the spawned thread!", i); 8 thread::sleep(Duration::from_millis(1)); 9 } 10 }); 11 12 for i in 1..5 { 13 println!("hi number {} from the main thread!", i); 14 thread::sleep(Duration::from_millis(1)); 15 } 16} 注意:当主线程结束时,所有派生线程都会被强制终止,无论它们是否执行完。 ...

2025-11-29 · 2 min · 221 words · 老墨

Go高级教程:深入理解 GMP 调度器

大家好,我是极客老墨。 为什么 Go 语言能轻松支撑百万并发?为什么 Goroutine 切换成本这么低?这一切的背后,都站着一位神秘的大管家——GMP 调度器。这篇就用通俗易懂的语言,配合生动的比喻,带你深入理解 Go 高并发的核心秘密。 1. 为什么需要 GMP? 在很久很久以前(其实也就几十年前),我们写代码都是直接跟 线程 (Thread) 打交道。线程是操作系统(OS)调度的最小单位。 但是,线程这玩意儿太"贵"了: 内存占用高:一个线程栈大概要几 MB。 切换成本大:线程切换需要陷入内核态,保存寄存器、上下文,这简直就是"劳民伤财"。 这时候,Go 语言的设计师们拍案而起:“我们要造一种更轻量的线程!” 于是,Goroutine (协程) 诞生了。它初始只要几 KB,切换成本极低。 这就带来了一个问题:操作系统只认识线程,不认识 Goroutine。谁来负责把成千上万个 Goroutine 分配给 CPU 跑呢? 这就需要一个"中间商" —— Go 运行时调度器 (Scheduler)。 图示: Thread 与 Goroutine 的区别 2. GMP 模型大揭秘 GMP 其实是三个角色的缩写: G (Goroutine):我们写的代码任务,也就是协程。 M (Machine):工作线程(Thread),对应操作系统的真实线程。它是真正的干活人(搬砖工)。 P (Processor):逻辑处理器(Context),可以理解为"调度上下文"或"资源"。它是包工头,负责管理 G,并把 G 交给 M 去执行。 形象的比喻 想象一个大型搬砖工地: G (砖头):待搬运的任务。 M (工人):负责搬砖的劳动力。 P (手推车):工人必须推着车才能搬砖(因为车里装着搬砖工具和任务清单)。 如果没有 P(手推车),M(工人)就不知道该干啥。 ...

2025-11-28 · 2 min · 364 words · 老墨

[GoLang避坑实战-18] 实战 CLI 工具:30 分钟用 urfave/cli 构建你的极客武器

大家好,我是极客老墨。 上一篇我们写了个小工具——一个简单的命令行计算器,需要从命令行读参数, 我们直接通过 os.Args 来解析命令行参数,这种方式太底层、太原始了,非常容易出错。 说实话,Go 虽然内置了 flag 包,但用起来仍然不是很方便。想要做个像样的 CLI 工具,光靠 flag 远远不够。 今天我们就来聊聊如何用 Go 社区最受欢迎的 urfave/cli 框架,打造真正的极客工具。 为什么不用 flag 包? Go 标准库的 flag 包确实能解析参数,但问题是: 1// 用 flag 包写个简单的工具 2var name = flag.String("name", "", "your name") 3var age = flag.Int("age", 0, "your age") 4 5flag.Parse() 6 7if *name == "" { 8 fmt.Println("name is required") 9 os.Exit(1) 10} 看到没?每个参数都要手动验证,帮助信息要自己拼,子命令?不存在的,得自己实现。 写个小工具还行,但要做个像 git、docker 那样的专业 CLI,光靠 flag 真的会疯。 CLI 框架选择 Go 生态里有几个流行的 CLI 框架: cobra:Kubernetes、Hugo 都在用,功能强大但有点重 urfave/cli:轻量、简单、够用,老墨的首选 survey:专门做交互式 CLI 的,适合问答式工具 今天主要聊 urfave/cli,因为它: ...

2025-11-20 · 7 min · 1448 words · 老墨

Python教程39:元类(Metaclass)

Python教程39:元类(Metaclass) “元类就是深度魔法,99%的用户应该根本不必为此操心。” —— Tim Peters 元类是Python的高级特性,用于创建类的"类"。今天我们揭开元类的神秘面纱,理解Python对象系统的底层机制。 1. 什么是元类 一切皆对象 在Python中,类也是对象: 1class MyClass: 2 pass 3 4# 类是对象 5print(type(MyClass)) # <class 'type'> 6print(isinstance(MyClass, type)) # True 7 8# 类可以赋值、作为参数 9AnotherName = MyClass 10def func(cls): 11 return cls() 元类(Metaclass): 创建类的"类" type是Python的默认元类 类是元类的实例 1# 类是type的实例 2class MyClass: 3 pass 4 5print(type(MyClass)) # <class 'type'> 6 7# 等价于 8MyClass = type('MyClass', (), {}) type的三种用法 1# 用法1:查看对象类型 2print(type(5)) # <class 'int'> 3 4# 用法2:动态创建类 5# type(name, bases, dict) 6MyClass = type('MyClass', (), {'x': 5}) 7obj = MyClass() 8print(obj.x) # 5 9 10# 用法3:作为元类(继承type) 11class MyMeta(type): 12 pass 2. 动态创建类 使用type动态创建类: ...

2025-11-13 · 4 min · 670 words · 老墨