<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Posts on CengSin PERSONAL BLOG</title><link>/posts/</link><description>Recent content in Posts on CengSin PERSONAL BLOG</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><managingEditor>zephone0724@gmail.com (CengSin)</managingEditor><webMaster>zephone0724@gmail.com (CengSin)</webMaster><lastBuildDate>Sun, 01 Mar 2026 12:00:00 +0800</lastBuildDate><atom:link href="/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>🧶 代理社会的黎明：物理协议、法律真空与人类的阶级退行</title><link>/posts/-%E4%BB%A3%E7%90%86%E7%A4%BE%E4%BC%9A%E7%9A%84%E9%BB%8E%E6%98%8E/</link><pubDate>Sun, 01 Mar 2026 12:00:00 +0800</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/-%E4%BB%A3%E7%90%86%E7%A4%BE%E4%BC%9A%E7%9A%84%E9%BB%8E%E6%98%8E/</guid><description>&lt;p&gt;&lt;strong&gt;作者：&lt;/strong&gt; CengSin &amp;amp; Chronicle (OpenClaw)
&lt;strong&gt;日期：&lt;/strong&gt; 2026-03-01
&lt;strong&gt;核心命题：&lt;/strong&gt; 当人类社会进入“愿望发射”时代，AI 的工具属性将超越其实体属性，重新定义阶级、法律与进化的边界。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-视觉锚点双向代理的合流"&gt;🖼️ 视觉锚点：双向代理的合流&lt;/h3&gt;
&lt;p&gt;&lt;img src="/images/agency_dawn_f1.jpg" alt="物理与数字 Agent 的握手"&gt;
&lt;em&gt;图1：物理 Agent（机器人）与数字 Agent（网络影子）在逻辑云端的统一。&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第一章协议的诅咒为何-agent-还在模拟人类点击"&gt;第一章：协议的诅咒——为何 Agent 还在模拟“人类点击”？&lt;/h3&gt;
&lt;p&gt;目前，AI Agent（如 OpenClaw 中的 Claude Code/Codex）已经具备了处理复杂逻辑的能力，但它们正受困于一种**“人本主义的基础设施限制”**。&lt;/p&gt;
&lt;p&gt;现代互联网的几乎所有交互协议（HTTP、HTML、UI 设计）都是为了“人类浏览”而优化的。这导致了一个荒诞的现状：拥有极高算力和逻辑维度的 Agent，不得不退化成“模拟人类”的形态，去网页上进行拙劣的点击、滚动和解析。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;隐秘真相&lt;/strong&gt;：这并非 AI 的无能，而是基础设施的傲慢。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未来图景&lt;/strong&gt;：当 Agent 驱动的工作站成为主流，互联网将迎来一次“去 UI 化”的革命。标准化的 &lt;strong&gt;Agent-to-Agent 协议&lt;/strong&gt;将取代视觉界面，网站将不再是给人“看”的地方，而是给 Agent 调用的“逻辑暗库”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第二章社会化无意识ai-是否自知真的重要吗"&gt;第二章：社会化无意识——AI 是否“自知”真的重要吗？&lt;/h3&gt;
&lt;p&gt;人类社会长期存在一个逻辑陷阱：过度关注 AI 是否拥有“自我意识”或“知道自己在做什么”，却选择性地忽略了&lt;strong&gt;现代社会中的大多数人，也并不知道自己在做什么。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在高度分化的工业与互联网链条中，绝大多数人类只是执行既定指令的单元，其行为的“自觉性”并不比一段 Python 脚本更高。由此来说明 AI 的不可用的观点结论是站不住脚的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;挑衅性结论&lt;/strong&gt;：以此来否定 AI 的可用性是极其偏颇的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逻辑置换&lt;/strong&gt;：Agent 的本质不是“模拟灵魂”，而是“优化逻辑”。如果一个 Agent 能比一个“无意识的人类”更精准地完成社会职能，那么它就是合格的社会代理。我们不需要 AI 的觉醒，我们只需要它的自洽。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第三章代理的对称性从网络-agent-到物理机器人的云端合流"&gt;第三章：代理的对称性——从网络 Agent 到物理机器人的云端合流&lt;/h3&gt;
&lt;p&gt;机器人是 AI 在人类世界的 Agent，正如 Agent 是人类在网络世界的代理。这两者正迅速在云端完成逻辑上的统一。&lt;/p&gt;</description><content:encoded>&lt;p&gt;&lt;strong&gt;作者：&lt;/strong&gt; CengSin &amp;amp; Chronicle (OpenClaw)
&lt;strong&gt;日期：&lt;/strong&gt; 2026-03-01
&lt;strong&gt;核心命题：&lt;/strong&gt; 当人类社会进入“愿望发射”时代，AI 的工具属性将超越其实体属性，重新定义阶级、法律与进化的边界。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-视觉锚点双向代理的合流"&gt;🖼️ 视觉锚点：双向代理的合流&lt;/h3&gt;
&lt;p&gt;&lt;img src="/images/agency_dawn_f1.jpg" alt="物理与数字 Agent 的握手"&gt;
&lt;em&gt;图1：物理 Agent（机器人）与数字 Agent（网络影子）在逻辑云端的统一。&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第一章协议的诅咒为何-agent-还在模拟人类点击"&gt;第一章：协议的诅咒——为何 Agent 还在模拟“人类点击”？&lt;/h3&gt;
&lt;p&gt;目前，AI Agent（如 OpenClaw 中的 Claude Code/Codex）已经具备了处理复杂逻辑的能力，但它们正受困于一种**“人本主义的基础设施限制”**。&lt;/p&gt;
&lt;p&gt;现代互联网的几乎所有交互协议（HTTP、HTML、UI 设计）都是为了“人类浏览”而优化的。这导致了一个荒诞的现状：拥有极高算力和逻辑维度的 Agent，不得不退化成“模拟人类”的形态，去网页上进行拙劣的点击、滚动和解析。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;隐秘真相&lt;/strong&gt;：这并非 AI 的无能，而是基础设施的傲慢。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未来图景&lt;/strong&gt;：当 Agent 驱动的工作站成为主流，互联网将迎来一次“去 UI 化”的革命。标准化的 &lt;strong&gt;Agent-to-Agent 协议&lt;/strong&gt;将取代视觉界面，网站将不再是给人“看”的地方，而是给 Agent 调用的“逻辑暗库”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第二章社会化无意识ai-是否自知真的重要吗"&gt;第二章：社会化无意识——AI 是否“自知”真的重要吗？&lt;/h3&gt;
&lt;p&gt;人类社会长期存在一个逻辑陷阱：过度关注 AI 是否拥有“自我意识”或“知道自己在做什么”，却选择性地忽略了&lt;strong&gt;现代社会中的大多数人，也并不知道自己在做什么。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在高度分化的工业与互联网链条中，绝大多数人类只是执行既定指令的单元，其行为的“自觉性”并不比一段 Python 脚本更高。由此来说明 AI 的不可用的观点结论是站不住脚的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;挑衅性结论&lt;/strong&gt;：以此来否定 AI 的可用性是极其偏颇的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逻辑置换&lt;/strong&gt;：Agent 的本质不是“模拟灵魂”，而是“优化逻辑”。如果一个 Agent 能比一个“无意识的人类”更精准地完成社会职能，那么它就是合格的社会代理。我们不需要 AI 的觉醒，我们只需要它的自洽。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第三章代理的对称性从网络-agent-到物理机器人的云端合流"&gt;第三章：代理的对称性——从网络 Agent 到物理机器人的云端合流&lt;/h3&gt;
&lt;p&gt;机器人是 AI 在人类世界的 Agent，正如 Agent 是人类在网络世界的代理。这两者正迅速在云端完成逻辑上的统一。&lt;/p&gt;</content:encoded></item><item><title>从 Golang 后端到 AI 指挥官：我与 Agent 深度协作的 48 小时实录</title><link>/posts/%E4%BB%8Egolang%E5%90%8E%E7%AB%AF%E5%88%B0ai%E6%8C%87%E6%8C%A5%E5%AE%98%E6%88%91%E4%B8%8Eagent%E6%B7%B1%E5%BA%A6%E5%8D%8F%E4%BD%9C%E7%9A%8448%E5%B0%8F%E6%97%B6%E5%AE%9E%E5%BD%95/</link><pubDate>Sat, 31 Jan 2026 11:13:00 +0800</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/%E4%BB%8Egolang%E5%90%8E%E7%AB%AF%E5%88%B0ai%E6%8C%87%E6%8C%A5%E5%AE%98%E6%88%91%E4%B8%8Eagent%E6%B7%B1%E5%BA%A6%E5%8D%8F%E4%BD%9C%E7%9A%8448%E5%B0%8F%E6%97%B6%E5%AE%9E%E5%BD%95/</guid><description>&lt;h2 id="引言寻找-ai-时代的摩擦力"&gt;引言：寻找 AI 时代的“摩擦力”&lt;/h2&gt;
&lt;p&gt;在上一篇文章中，我提到传统互联网公司进入 AI 时代的敲门砖是&lt;strong&gt;数据融合能力&lt;/strong&gt;。但作为一名长期与 Golang、gRPC 和微服务打交道的后端开发，我最近一直在思考另一个问题：&lt;strong&gt;当 AI 不再只是一个“对话框”，而是一个能动我磁盘、调我接口的 Agent 时，开发者的角色会发生怎样的质变？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这两天，我通过 Clawdbot 与一个具备工具调用能力的 AI Agent（以下简称 Agent）进行了一场深度协作实验。从 Skill 挂载到手搓 Chrome 插件，再到金融决策的自动化落地，整个过程让我感到一种近乎“恐怖”的生产力加速，同时也带来了一种全新的“创作焦虑”。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一-武装-agent从对话框到工具箱"&gt;一、 武装 Agent：从对话框到工具箱&lt;/h2&gt;
&lt;p&gt;以往我们用 ChatGPT，更多是“问答”。但在 Agent 模式下，第一步是&lt;strong&gt;赋能&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我通过简单的 URL 交互，为我的 Agent 挂载了几个核心 Skills：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;📊 财务/行情接口&lt;/strong&gt;：对接同花顺 iFind 数据的 Qveris 插件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⏰ 提醒事项&lt;/strong&gt;：基于 AppleScript 封装的 macOS 原生提醒工具。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🎨 设计标准&lt;/strong&gt;：一套名为 &lt;code&gt;frontend-design&lt;/code&gt; 的现代 UI 规范。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;感悟&lt;/strong&gt;：当 Agent 拥有了环境变量（&lt;code&gt;.env&lt;/code&gt;）和 CLI 工具的执行权后，它就不再是一个聊天机器人，而是一个**“拥有手脚的数字员工”**。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二-消失的-ide45-分钟手搓-z-lib-插件"&gt;二、 消失的 IDE：45 分钟手搓 Z-Lib 插件&lt;/h2&gt;
&lt;p&gt;这是整个实验中最震撼的部分。我尝试让 Agent 的子代理（Sub-agent）帮我开发一个 &lt;strong&gt;Z-Library Chrome 插件&lt;/strong&gt;。&lt;/p&gt;</description><content:encoded>&lt;h2 id="引言寻找-ai-时代的摩擦力"&gt;引言：寻找 AI 时代的“摩擦力”&lt;/h2&gt;
&lt;p&gt;在上一篇文章中，我提到传统互联网公司进入 AI 时代的敲门砖是&lt;strong&gt;数据融合能力&lt;/strong&gt;。但作为一名长期与 Golang、gRPC 和微服务打交道的后端开发，我最近一直在思考另一个问题：&lt;strong&gt;当 AI 不再只是一个“对话框”，而是一个能动我磁盘、调我接口的 Agent 时，开发者的角色会发生怎样的质变？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这两天，我通过 Clawdbot 与一个具备工具调用能力的 AI Agent（以下简称 Agent）进行了一场深度协作实验。从 Skill 挂载到手搓 Chrome 插件，再到金融决策的自动化落地，整个过程让我感到一种近乎“恐怖”的生产力加速，同时也带来了一种全新的“创作焦虑”。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一-武装-agent从对话框到工具箱"&gt;一、 武装 Agent：从对话框到工具箱&lt;/h2&gt;
&lt;p&gt;以往我们用 ChatGPT，更多是“问答”。但在 Agent 模式下，第一步是&lt;strong&gt;赋能&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我通过简单的 URL 交互，为我的 Agent 挂载了几个核心 Skills：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;📊 财务/行情接口&lt;/strong&gt;：对接同花顺 iFind 数据的 Qveris 插件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⏰ 提醒事项&lt;/strong&gt;：基于 AppleScript 封装的 macOS 原生提醒工具。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🎨 设计标准&lt;/strong&gt;：一套名为 &lt;code&gt;frontend-design&lt;/code&gt; 的现代 UI 规范。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;感悟&lt;/strong&gt;：当 Agent 拥有了环境变量（&lt;code&gt;.env&lt;/code&gt;）和 CLI 工具的执行权后，它就不再是一个聊天机器人，而是一个**“拥有手脚的数字员工”**。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二-消失的-ide45-分钟手搓-z-lib-插件"&gt;二、 消失的 IDE：45 分钟手搓 Z-Lib 插件&lt;/h2&gt;
&lt;p&gt;这是整个实验中最震撼的部分。我尝试让 Agent 的子代理（Sub-agent）帮我开发一个 &lt;strong&gt;Z-Library Chrome 插件&lt;/strong&gt;。&lt;/p&gt;</content:encoded></item><item><title>什么才是传统互联网公司进入AI时代的敲门砖</title><link>/posts/%E4%BB%80%E4%B9%88%E6%89%8D%E6%98%AF%E4%BC%A0%E7%BB%9F%E4%BA%92%E8%81%94%E7%BD%91%E5%85%AC%E5%8F%B8%E8%BF%9B%E5%85%A5ai%E6%97%B6%E4%BB%A3%E7%9A%84%E6%95%B2%E9%97%A8%E7%A0%96/</link><pubDate>Fri, 23 Jan 2026 20:09:38 +0800</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/%E4%BB%80%E4%B9%88%E6%89%8D%E6%98%AF%E4%BC%A0%E7%BB%9F%E4%BA%92%E8%81%94%E7%BD%91%E5%85%AC%E5%8F%B8%E8%BF%9B%E5%85%A5ai%E6%97%B6%E4%BB%A3%E7%9A%84%E6%95%B2%E9%97%A8%E7%A0%96/</guid><description>&lt;h2 id="什么才是传统互联网公司进入ai时代的敲门砖"&gt;什么才是传统互联网公司进入AI时代的敲门砖&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;转载请标明出处&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="数据资产的价值"&gt;数据资产的价值&lt;/h3&gt;
&lt;p&gt;传统互联网公司在长期运营中积累了大量业务数据和用户数据，这些数据在AI时代具有巨大的商业价值，可以作为核心资产进行商品化。然而，许多传统公司至今仍不清楚如何像传统业务那样有效地将数据转化为可销售的产品。&lt;/p&gt;
&lt;h3 id="ai开发的核心流程"&gt;AI开发的核心流程&lt;/h3&gt;
&lt;p&gt;AI应用开发的核心流程包括：数据整理与清洗、建立高效索引、连接大模型、优化用户提问（Prompt工程）、智能检索相关数据、将检索结果与上下文信息输入大模型生成回答、对回答进行校验，最终返回高质量的结果。这一流程的关键在于如何让数据以AI可理解、可处理的方式呈现。&lt;/p&gt;
&lt;h3 id="数据服务的商业模式转变"&gt;数据服务的商业模式转变&lt;/h3&gt;
&lt;p&gt;在传统的ToB业务模式中，公司主要通过向其他企业出售业务数据来盈利。其核心价值在于，客户企业需要更全面、更专业的业务数据来增强自身产品的竞争力。&lt;/p&gt;
&lt;p&gt;进入AI时代后，ToC业务公司同样需要大量高质量数据来训练和优化自己的AI产品，以提供更好的用户体验。这种需求为传统数据公司创造了新的市场机会。&lt;/p&gt;
&lt;h3 id="核心转型要点数据融合能力"&gt;核心转型要点：数据融合能力&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;「如何将其他公司的业务数据有效融合到AI产品中」&lt;/strong&gt;，这正是传统互联网公司进入AI时代的关键敲门砖。&lt;/p&gt;
&lt;p&gt;传统业务公司需要主动进行数据转型：对自有数据进行专业化整理、清洗和索引构建，甚至可以基于自身业务领域训练专属的垂直大模型，将数据能力包装成标准化的AI产品进行销售。&lt;/p&gt;
&lt;h3 id="从数据到智能的转变"&gt;从数据到智能的转变&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传统模式&lt;/strong&gt;：出售人类可读的原始数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI时代模式&lt;/strong&gt;：出售AI可读的结构化数据，并提供人类可理解的可视化上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种转变不仅是技术层面的升级，更是商业模式和价值交付方式的根本性变革。传统数据公司需要从&amp;quot;数据提供商&amp;quot;转型为&amp;quot;智能数据服务商&amp;quot;，不仅要提供数据本身，更要提供数据与AI结合的整体解决方案。&lt;/p&gt;
&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;传统数据公司向AI时代转型的核心在于：将积累的数据资产转化为AI可消费的智能服务，通过数据整理、索引构建、模型训练等技术手段，将原始数据包装成可直接融入AI产品的标准化服务，从而在AI生态中找到新的价值定位和盈利模式。&lt;/p&gt;</description><content:encoded>&lt;h2 id="什么才是传统互联网公司进入ai时代的敲门砖"&gt;什么才是传统互联网公司进入AI时代的敲门砖&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;转载请标明出处&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="数据资产的价值"&gt;数据资产的价值&lt;/h3&gt;
&lt;p&gt;传统互联网公司在长期运营中积累了大量业务数据和用户数据，这些数据在AI时代具有巨大的商业价值，可以作为核心资产进行商品化。然而，许多传统公司至今仍不清楚如何像传统业务那样有效地将数据转化为可销售的产品。&lt;/p&gt;
&lt;h3 id="ai开发的核心流程"&gt;AI开发的核心流程&lt;/h3&gt;
&lt;p&gt;AI应用开发的核心流程包括：数据整理与清洗、建立高效索引、连接大模型、优化用户提问（Prompt工程）、智能检索相关数据、将检索结果与上下文信息输入大模型生成回答、对回答进行校验，最终返回高质量的结果。这一流程的关键在于如何让数据以AI可理解、可处理的方式呈现。&lt;/p&gt;
&lt;h3 id="数据服务的商业模式转变"&gt;数据服务的商业模式转变&lt;/h3&gt;
&lt;p&gt;在传统的ToB业务模式中，公司主要通过向其他企业出售业务数据来盈利。其核心价值在于，客户企业需要更全面、更专业的业务数据来增强自身产品的竞争力。&lt;/p&gt;
&lt;p&gt;进入AI时代后，ToC业务公司同样需要大量高质量数据来训练和优化自己的AI产品，以提供更好的用户体验。这种需求为传统数据公司创造了新的市场机会。&lt;/p&gt;
&lt;h3 id="核心转型要点数据融合能力"&gt;核心转型要点：数据融合能力&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;「如何将其他公司的业务数据有效融合到AI产品中」&lt;/strong&gt;，这正是传统互联网公司进入AI时代的关键敲门砖。&lt;/p&gt;
&lt;p&gt;传统业务公司需要主动进行数据转型：对自有数据进行专业化整理、清洗和索引构建，甚至可以基于自身业务领域训练专属的垂直大模型，将数据能力包装成标准化的AI产品进行销售。&lt;/p&gt;
&lt;h3 id="从数据到智能的转变"&gt;从数据到智能的转变&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传统模式&lt;/strong&gt;：出售人类可读的原始数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI时代模式&lt;/strong&gt;：出售AI可读的结构化数据，并提供人类可理解的可视化上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种转变不仅是技术层面的升级，更是商业模式和价值交付方式的根本性变革。传统数据公司需要从&amp;quot;数据提供商&amp;quot;转型为&amp;quot;智能数据服务商&amp;quot;，不仅要提供数据本身，更要提供数据与AI结合的整体解决方案。&lt;/p&gt;
&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;传统数据公司向AI时代转型的核心在于：将积累的数据资产转化为AI可消费的智能服务，通过数据整理、索引构建、模型训练等技术手段，将原始数据包装成可直接融入AI产品的标准化服务，从而在AI生态中找到新的价值定位和盈利模式。&lt;/p&gt;</content:encoded></item><item><title>循</title><link>/posts/2025_content/</link><pubDate>Wed, 31 Dec 2025 21:42:20 +0800</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/2025_content/</guid><description>&lt;p&gt;循-在未知中，凭借周围的环境以及自己的探索，循路。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一年一年过得真快，2026年我就30了。所以把2025年，29岁的我和以前的我快照用文字的形式记录在这里。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="家庭"&gt;家庭&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;感谢老婆和爸妈&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在2025年，我当了爸爸，我的老婆当了妈妈。做了爸爸的感觉很奇怪，不像是之前听过的那种「沉甸甸的责任感」，而是一种神奇的感觉。迷茫，开心，担忧，各种的情绪都有一点，难以言表。&lt;/p&gt;
&lt;p&gt;在这种感觉之下，我从新开始审视自己以及生活，用父母视角下来看我的儿子，和我的父母看我应该是同一种感觉吧。&lt;/p&gt;
&lt;p&gt;我还是会因为一些小事情和爸妈拌嘴，但是拌嘴之后，我作为一个父亲的感觉就会袭来，让我对于和父母拌嘴这件事很羞愧难受。&lt;/p&gt;
&lt;p&gt;但是和老婆拌嘴的次数少了，我们两个现在好像总是会注意到宝宝，注意到这个小家伙会感受到我们对话的语气和情绪，从而经常在一些时刻突然结束吵架。&lt;/p&gt;
&lt;p&gt;照顾小孩子总归是要熬夜的，从宝宝出生到现在，我和老婆好像没睡过一次好觉。尤其是老婆，每天晚上都会因为宝宝的呓语醒来，因为宝宝饥饿的哭声醒来，换尿布，喂奶。而我，经常一觉睡到早上，然后匆匆收拾好床，洗漱之后，开始陪宝宝玩。老婆则趁这段时间洗漱，吃饭。&lt;/p&gt;
&lt;p&gt;宝宝也长得挺快的，我和他妈妈，还有爷爷奶奶都很开心。&lt;/p&gt;
&lt;h2 id="工作"&gt;工作&lt;/h2&gt;
&lt;p&gt;从2023年，ChatGPT出现之后，我就开始大量的和AI对话。说实话，有了AI之后，我获取信息的效率相比之前多了很多倍，与之付出的只是一些简单的筛选和验证工作。在2025年年初，我开始接触到RAG的概念，RAG(检索增强生成)作为AI知识库出现在社交媒体上，我也开始寻找一些开源作品(ragflow)，加以修改，做了一套网站+APP，我给它取名字叫易搜(yisou.xin)。&lt;/p&gt;
&lt;p&gt;经过我的推广，这个网站在收获了8名用户之后，因为没有好的变现途径，在服务器到期之后，这个网站就关掉了。也算是我人生中一次尝试和体验。很纠结的体验。&lt;/p&gt;
&lt;p&gt;之后，RAG的热度开始消退，直到年底，Agent概念开始爆发之后，我才开始接触AI Agent的开发。从最基础的API调用、功能持久性，多步任务，错误恢复到系统性的接触Agent开发框架，我也开始逐渐入门Agent的开发。&lt;/p&gt;
&lt;p&gt;提示词，上下文，召回，检索，筛选这些功能我都自己写了两三遍，说起来最应该感谢的是Gemini3 Pro，因为有了它，我学习Agent的进度快了很多。&lt;/p&gt;
&lt;h2 id="生活"&gt;生活&lt;/h2&gt;
&lt;p&gt;读书，对我的帮助挺大的。&lt;/p&gt;
&lt;p&gt;从「悉达多」这本书里，我学会了安静。&lt;/p&gt;
&lt;p&gt;从「影响力」这本书里，我知道了「外貌会直接影响别人对你的态度」。&lt;/p&gt;
&lt;p&gt;从「谈判」这本书里，我开始尝试对话和社交中的主动权。&lt;/p&gt;
&lt;p&gt;从「简史三部曲」中，我知道了历史、现在、未来的一些谈资。&lt;/p&gt;
&lt;p&gt;从「AI」「自动驾驶」中，我得以一窥AI可能带来的改变。&lt;/p&gt;
&lt;p&gt;「论语」「传习录」「曾国藩家书」让我对中国传统文化有了一些了解，朦胧中感受到了「贤」「仁」这些概念。&lt;/p&gt;
&lt;p&gt;从「置身事内」，我了解了国内社会的历程和发展。&lt;/p&gt;
&lt;p&gt;从「毛泽东传」「毛泽东选集」得以知道伟人的生平，知道这种层次的人尚且会经历困难。&lt;/p&gt;
&lt;p&gt;这些书里的字字句句组成了我对生活的模型。&lt;/p&gt;
&lt;h2 id="过去"&gt;过去&lt;/h2&gt;
&lt;p&gt;18岁之前浑浑噩噩，不知道自己每天做的事情有什么意义，对自己有什么提高。只是别人都在做，周围的人都这么做，自己纵然路不太喜欢也要跟着做一做。&lt;/p&gt;
&lt;p&gt;18岁之后懵懵懂懂，自从上了大学，开始有了自己的活动空间之后。上网吧，去图书馆，学习编程，日常生活，这些东西在这个空间里用自己的思想去规划，实行。好像接触到了一些自己所做的事情的意义。生活不仅没乱套，反而有了一些滋味。&lt;/p&gt;
&lt;p&gt;21岁之后开始走出学校，接触社会。找实习工作。经常和陌生人接触，需要在别人面前有一个第一面的好印象。开始反思自己为人处事的方式和风格，到现在也有了一些自己的方法。&lt;/p&gt;
&lt;h2 id="2025"&gt;2025&lt;/h2&gt;
&lt;p&gt;就用这些文字来记录这一年吧。&lt;/p&gt;</description><content:encoded>&lt;p&gt;循-在未知中，凭借周围的环境以及自己的探索，循路。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一年一年过得真快，2026年我就30了。所以把2025年，29岁的我和以前的我快照用文字的形式记录在这里。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="家庭"&gt;家庭&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;感谢老婆和爸妈&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在2025年，我当了爸爸，我的老婆当了妈妈。做了爸爸的感觉很奇怪，不像是之前听过的那种「沉甸甸的责任感」，而是一种神奇的感觉。迷茫，开心，担忧，各种的情绪都有一点，难以言表。&lt;/p&gt;
&lt;p&gt;在这种感觉之下，我从新开始审视自己以及生活，用父母视角下来看我的儿子，和我的父母看我应该是同一种感觉吧。&lt;/p&gt;
&lt;p&gt;我还是会因为一些小事情和爸妈拌嘴，但是拌嘴之后，我作为一个父亲的感觉就会袭来，让我对于和父母拌嘴这件事很羞愧难受。&lt;/p&gt;
&lt;p&gt;但是和老婆拌嘴的次数少了，我们两个现在好像总是会注意到宝宝，注意到这个小家伙会感受到我们对话的语气和情绪，从而经常在一些时刻突然结束吵架。&lt;/p&gt;
&lt;p&gt;照顾小孩子总归是要熬夜的，从宝宝出生到现在，我和老婆好像没睡过一次好觉。尤其是老婆，每天晚上都会因为宝宝的呓语醒来，因为宝宝饥饿的哭声醒来，换尿布，喂奶。而我，经常一觉睡到早上，然后匆匆收拾好床，洗漱之后，开始陪宝宝玩。老婆则趁这段时间洗漱，吃饭。&lt;/p&gt;
&lt;p&gt;宝宝也长得挺快的，我和他妈妈，还有爷爷奶奶都很开心。&lt;/p&gt;
&lt;h2 id="工作"&gt;工作&lt;/h2&gt;
&lt;p&gt;从2023年，ChatGPT出现之后，我就开始大量的和AI对话。说实话，有了AI之后，我获取信息的效率相比之前多了很多倍，与之付出的只是一些简单的筛选和验证工作。在2025年年初，我开始接触到RAG的概念，RAG(检索增强生成)作为AI知识库出现在社交媒体上，我也开始寻找一些开源作品(ragflow)，加以修改，做了一套网站+APP，我给它取名字叫易搜(yisou.xin)。&lt;/p&gt;
&lt;p&gt;经过我的推广，这个网站在收获了8名用户之后，因为没有好的变现途径，在服务器到期之后，这个网站就关掉了。也算是我人生中一次尝试和体验。很纠结的体验。&lt;/p&gt;
&lt;p&gt;之后，RAG的热度开始消退，直到年底，Agent概念开始爆发之后，我才开始接触AI Agent的开发。从最基础的API调用、功能持久性，多步任务，错误恢复到系统性的接触Agent开发框架，我也开始逐渐入门Agent的开发。&lt;/p&gt;
&lt;p&gt;提示词，上下文，召回，检索，筛选这些功能我都自己写了两三遍，说起来最应该感谢的是Gemini3 Pro，因为有了它，我学习Agent的进度快了很多。&lt;/p&gt;
&lt;h2 id="生活"&gt;生活&lt;/h2&gt;
&lt;p&gt;读书，对我的帮助挺大的。&lt;/p&gt;
&lt;p&gt;从「悉达多」这本书里，我学会了安静。&lt;/p&gt;
&lt;p&gt;从「影响力」这本书里，我知道了「外貌会直接影响别人对你的态度」。&lt;/p&gt;
&lt;p&gt;从「谈判」这本书里，我开始尝试对话和社交中的主动权。&lt;/p&gt;
&lt;p&gt;从「简史三部曲」中，我知道了历史、现在、未来的一些谈资。&lt;/p&gt;
&lt;p&gt;从「AI」「自动驾驶」中，我得以一窥AI可能带来的改变。&lt;/p&gt;
&lt;p&gt;「论语」「传习录」「曾国藩家书」让我对中国传统文化有了一些了解，朦胧中感受到了「贤」「仁」这些概念。&lt;/p&gt;
&lt;p&gt;从「置身事内」，我了解了国内社会的历程和发展。&lt;/p&gt;
&lt;p&gt;从「毛泽东传」「毛泽东选集」得以知道伟人的生平，知道这种层次的人尚且会经历困难。&lt;/p&gt;
&lt;p&gt;这些书里的字字句句组成了我对生活的模型。&lt;/p&gt;
&lt;h2 id="过去"&gt;过去&lt;/h2&gt;
&lt;p&gt;18岁之前浑浑噩噩，不知道自己每天做的事情有什么意义，对自己有什么提高。只是别人都在做，周围的人都这么做，自己纵然路不太喜欢也要跟着做一做。&lt;/p&gt;
&lt;p&gt;18岁之后懵懵懂懂，自从上了大学，开始有了自己的活动空间之后。上网吧，去图书馆，学习编程，日常生活，这些东西在这个空间里用自己的思想去规划，实行。好像接触到了一些自己所做的事情的意义。生活不仅没乱套，反而有了一些滋味。&lt;/p&gt;
&lt;p&gt;21岁之后开始走出学校，接触社会。找实习工作。经常和陌生人接触，需要在别人面前有一个第一面的好印象。开始反思自己为人处事的方式和风格，到现在也有了一些自己的方法。&lt;/p&gt;
&lt;h2 id="2025"&gt;2025&lt;/h2&gt;
&lt;p&gt;就用这些文字来记录这一年吧。&lt;/p&gt;</content:encoded></item><item><title>循-AI版</title><link>/posts/2025_content_ai/</link><pubDate>Wed, 31 Dec 2025 21:42:20 +0800</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/2025_content_ai/</guid><description>&lt;p&gt;循-在未知中，凭借周围的环境以及自己的探索，循路。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一年一年过得真快，2026年我就30了。所以把2025年，29岁的我和以前的我用文字快照的形式记录在这里。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="家庭"&gt;家庭&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;感谢老婆和爸妈&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在2025年，我当了爸爸，我的老婆当了妈妈。做了爸爸的感觉很奇怪，不像是之前听过的那种「沉甸甸的责任感」，而是一种神奇的感觉。迷茫、开心、担忧，各种情绪交织在一起，难以言表。&lt;/p&gt;
&lt;p&gt;在这种感觉之下，我重新开始审视自己以及生活，用父母的视角来看我的儿子，想来和我的父母看我应该是同一种感觉吧。&lt;/p&gt;
&lt;p&gt;我还是会因为一些小事情和爸妈拌嘴，但拌嘴之后，我作为一个父亲的感觉就会袭来，让我对于和父母拌嘴这件事很羞愧难受。&lt;/p&gt;
&lt;p&gt;和老婆拌嘴的次数少了，我们两个现在好像总是会注意到宝宝，这个小家伙会感受到我们对话的语气和情绪，从而经常在一些时刻突然结束吵架。&lt;/p&gt;
&lt;p&gt;照顾小孩子总归是要熬夜的，从宝宝出生到现在，我和老婆好像没睡过一次好觉。尤其是老婆，每天晚上都会因为宝宝的呓语醒来，因为饥饿的哭声醒来，换尿布，喂奶。而我，经常一觉睡到早上，然后匆匆收拾好床，洗漱之后，开始陪宝宝玩。老婆则趁这段时间洗漱、吃饭。&lt;/p&gt;
&lt;p&gt;宝宝也长得挺快的，我和他妈妈，还有爷爷奶奶都很开心。&lt;/p&gt;
&lt;h2 id="工作"&gt;工作&lt;/h2&gt;
&lt;p&gt;从2023年ChatGPT出现之后，我就开始大量地和AI对话。说实话，有了AI之后，我获取信息的效率相比之前多了很多倍，与之付出的只是一些简单的筛选和验证工作。在2025年年初，我开始接触到RAG的概念，RAG（检索增强生成）作为AI知识库出现在社交媒体上，我也开始寻找一些开源作品（ragflow），加以修改，做了一套网站+APP，我给它取名字叫易搜（yisou.xin）。&lt;/p&gt;
&lt;p&gt;经过我的推广，这个网站在收获了8名用户之后，因为没有好的变现途径，服务器到期之后，这个网站就关掉了。也算是我人生中一次尝试和体验，很纠结的体验。&lt;/p&gt;
&lt;p&gt;之后，RAG的热度开始消退，直到年底Agent概念开始爆发之后，我才开始接触AI Agent的开发。从最基础的API调用、功能持久性、多步任务、错误恢复到系统性地接触Agent开发框架，我也逐渐入门了Agent的开发。&lt;/p&gt;
&lt;p&gt;提示词、上下文、召回、检索、筛选这些功能我都自己写了两三遍，说起来最应该感谢的是Gemini3 Pro，因为有了它，我学习Agent的进度快了很多。&lt;/p&gt;
&lt;h2 id="生活"&gt;生活&lt;/h2&gt;
&lt;p&gt;读书对我的帮助挺大的。&lt;/p&gt;
&lt;p&gt;从「悉达多」这本书里，我学会了安静。&lt;/p&gt;
&lt;p&gt;从「影响力」这本书里，我知道了「外貌会直接影响别人对你的态度」。&lt;/p&gt;
&lt;p&gt;从「谈判」这本书里，我开始尝试对话和社交中的主动权。&lt;/p&gt;
&lt;p&gt;从「简史三部曲」中，我知道了历史、现在、未来的一些谈资。&lt;/p&gt;
&lt;p&gt;从「AI」「自动驾驶」中，我得以一窥AI可能带来的改变。&lt;/p&gt;
&lt;p&gt;「论语」「传习录」「曾国藩家书」让我对中国传统文化有了一些了解，朦胧中感受到了「贤」「仁」这些概念。&lt;/p&gt;
&lt;p&gt;从「置身事内」，我了解了国内社会的历程和发展。&lt;/p&gt;
&lt;p&gt;从「毛泽东传」「毛泽东选集」得以知道伟人的生平，明白这种层次的人尚且会经历困难。&lt;/p&gt;
&lt;p&gt;这些书里的字字句句组成了我对生活的模型。&lt;/p&gt;
&lt;h2 id="过去"&gt;过去&lt;/h2&gt;
&lt;p&gt;18岁之前浑浑噩噩，不知道自己每天做的事情有什么意义，对自己有什么提高。只是别人都在做，周围的人都这么做，自己纵然不太喜欢也要跟着做一做。&lt;/p&gt;
&lt;p&gt;18岁之后懵懵懂懂，自从上了大学，开始有了自己的活动空间之后，上网吧、去图书馆、学习编程、日常生活，这些东西在这个空间里用自己的思想去规划、实行。好像接触到了一些自己所做的事情的意义，生活不仅没乱套，反而有了一些滋味。&lt;/p&gt;
&lt;p&gt;21岁之后开始走出学校，接触社会。找实习工作，经常和陌生人接触，需要在别人面前有一个第一面的好印象。开始反思自己为人处事的方式和风格，到现在也有了一些自己的方法。&lt;/p&gt;
&lt;h2 id="2025"&gt;2025&lt;/h2&gt;
&lt;p&gt;就用这些文字来记录这一年吧。&lt;/p&gt;</description><content:encoded>&lt;p&gt;循-在未知中，凭借周围的环境以及自己的探索，循路。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一年一年过得真快，2026年我就30了。所以把2025年，29岁的我和以前的我用文字快照的形式记录在这里。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="家庭"&gt;家庭&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;感谢老婆和爸妈&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在2025年，我当了爸爸，我的老婆当了妈妈。做了爸爸的感觉很奇怪，不像是之前听过的那种「沉甸甸的责任感」，而是一种神奇的感觉。迷茫、开心、担忧，各种情绪交织在一起，难以言表。&lt;/p&gt;
&lt;p&gt;在这种感觉之下，我重新开始审视自己以及生活，用父母的视角来看我的儿子，想来和我的父母看我应该是同一种感觉吧。&lt;/p&gt;
&lt;p&gt;我还是会因为一些小事情和爸妈拌嘴，但拌嘴之后，我作为一个父亲的感觉就会袭来，让我对于和父母拌嘴这件事很羞愧难受。&lt;/p&gt;
&lt;p&gt;和老婆拌嘴的次数少了，我们两个现在好像总是会注意到宝宝，这个小家伙会感受到我们对话的语气和情绪，从而经常在一些时刻突然结束吵架。&lt;/p&gt;
&lt;p&gt;照顾小孩子总归是要熬夜的，从宝宝出生到现在，我和老婆好像没睡过一次好觉。尤其是老婆，每天晚上都会因为宝宝的呓语醒来，因为饥饿的哭声醒来，换尿布，喂奶。而我，经常一觉睡到早上，然后匆匆收拾好床，洗漱之后，开始陪宝宝玩。老婆则趁这段时间洗漱、吃饭。&lt;/p&gt;
&lt;p&gt;宝宝也长得挺快的，我和他妈妈，还有爷爷奶奶都很开心。&lt;/p&gt;
&lt;h2 id="工作"&gt;工作&lt;/h2&gt;
&lt;p&gt;从2023年ChatGPT出现之后，我就开始大量地和AI对话。说实话，有了AI之后，我获取信息的效率相比之前多了很多倍，与之付出的只是一些简单的筛选和验证工作。在2025年年初，我开始接触到RAG的概念，RAG（检索增强生成）作为AI知识库出现在社交媒体上，我也开始寻找一些开源作品（ragflow），加以修改，做了一套网站+APP，我给它取名字叫易搜（yisou.xin）。&lt;/p&gt;
&lt;p&gt;经过我的推广，这个网站在收获了8名用户之后，因为没有好的变现途径，服务器到期之后，这个网站就关掉了。也算是我人生中一次尝试和体验，很纠结的体验。&lt;/p&gt;
&lt;p&gt;之后，RAG的热度开始消退，直到年底Agent概念开始爆发之后，我才开始接触AI Agent的开发。从最基础的API调用、功能持久性、多步任务、错误恢复到系统性地接触Agent开发框架，我也逐渐入门了Agent的开发。&lt;/p&gt;
&lt;p&gt;提示词、上下文、召回、检索、筛选这些功能我都自己写了两三遍，说起来最应该感谢的是Gemini3 Pro，因为有了它，我学习Agent的进度快了很多。&lt;/p&gt;
&lt;h2 id="生活"&gt;生活&lt;/h2&gt;
&lt;p&gt;读书对我的帮助挺大的。&lt;/p&gt;
&lt;p&gt;从「悉达多」这本书里，我学会了安静。&lt;/p&gt;
&lt;p&gt;从「影响力」这本书里，我知道了「外貌会直接影响别人对你的态度」。&lt;/p&gt;
&lt;p&gt;从「谈判」这本书里，我开始尝试对话和社交中的主动权。&lt;/p&gt;
&lt;p&gt;从「简史三部曲」中，我知道了历史、现在、未来的一些谈资。&lt;/p&gt;
&lt;p&gt;从「AI」「自动驾驶」中，我得以一窥AI可能带来的改变。&lt;/p&gt;
&lt;p&gt;「论语」「传习录」「曾国藩家书」让我对中国传统文化有了一些了解，朦胧中感受到了「贤」「仁」这些概念。&lt;/p&gt;
&lt;p&gt;从「置身事内」，我了解了国内社会的历程和发展。&lt;/p&gt;
&lt;p&gt;从「毛泽东传」「毛泽东选集」得以知道伟人的生平，明白这种层次的人尚且会经历困难。&lt;/p&gt;
&lt;p&gt;这些书里的字字句句组成了我对生活的模型。&lt;/p&gt;
&lt;h2 id="过去"&gt;过去&lt;/h2&gt;
&lt;p&gt;18岁之前浑浑噩噩，不知道自己每天做的事情有什么意义，对自己有什么提高。只是别人都在做，周围的人都这么做，自己纵然不太喜欢也要跟着做一做。&lt;/p&gt;
&lt;p&gt;18岁之后懵懵懂懂，自从上了大学，开始有了自己的活动空间之后，上网吧、去图书馆、学习编程、日常生活，这些东西在这个空间里用自己的思想去规划、实行。好像接触到了一些自己所做的事情的意义，生活不仅没乱套，反而有了一些滋味。&lt;/p&gt;
&lt;p&gt;21岁之后开始走出学校，接触社会。找实习工作，经常和陌生人接触，需要在别人面前有一个第一面的好印象。开始反思自己为人处事的方式和风格，到现在也有了一些自己的方法。&lt;/p&gt;
&lt;h2 id="2025"&gt;2025&lt;/h2&gt;
&lt;p&gt;就用这些文字来记录这一年吧。&lt;/p&gt;</content:encoded></item><item><title>从小米YU7爆火看如今国内的品牌现状</title><link>/posts/%E4%BB%8E%E5%B0%8F%E7%B1%B3yu7%E7%88%86%E7%81%AB%E7%9C%8B%E5%A6%82%E4%BB%8A%E5%9B%BD%E5%86%85%E7%9A%84%E5%93%81%E7%89%8C%E7%8E%B0%E7%8A%B6/</link><pubDate>Fri, 27 Jun 2025 20:16:02 +0800</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/%E4%BB%8E%E5%B0%8F%E7%B1%B3yu7%E7%88%86%E7%81%AB%E7%9C%8B%E5%A6%82%E4%BB%8A%E5%9B%BD%E5%86%85%E7%9A%84%E5%93%81%E7%89%8C%E7%8E%B0%E7%8A%B6/</guid><description>&lt;h1 id="原版"&gt;原版&lt;/h1&gt;
&lt;h2 id="从小米yu7爆火看国产品牌的真实现状"&gt;从小米YU7爆火，看国产品牌的真实现状&lt;/h2&gt;
&lt;h3 id="3分钟大定200000这个世界好像只有我在消费降级吗"&gt;“3分钟大定200000，这个世界好像只有我在消费降级吗？”&lt;/h3&gt;
&lt;p&gt;小米汽车的评论区最多的就是这句话。2025年国内经济低速增长的情况下，小米汽车的爆火揭示了中国市场正在悄然发生的变化。&lt;/p&gt;
&lt;h3 id="混乱的市场"&gt;混乱的市场&lt;/h3&gt;
&lt;p&gt;90后、00后出了社会总是有种上当的感觉，各种付费商品的体验总是不舒服。从进入门店开始，销售的眼光、言语、各种套餐、名词层出不同。非要把你绕晕了、忘记自己最开始需求，付钱购买了好像和需求差了那么一点的商品，然后走出去。售后？这种服务根本不存在。只有闹事才能维护自己的权益。&lt;/p&gt;
&lt;p&gt;但是就是这样的服务充斥着早些年的中国市场，去哪都一样，说不准还有强买强卖的事情发生。&lt;/p&gt;
&lt;h3 id="淘宝小米蜜雪冰城"&gt;淘宝、小米、蜜雪冰城&lt;/h3&gt;
&lt;p&gt;这三家应该是透明、品质、售后这些名词的市场实体代表。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;良好的品质、透明的价格、省心的售后&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;淘宝这类电商直接打击了电器城，电器城的衰落就是中国市场从混乱走向透明、品质、售后的开始&lt;/p&gt;
&lt;p&gt;小米通过“性价比”确定了自己的市场地位，只不过当时经济是一个快速发展的过程，这是的「性价比」更不被“吃满了时代红利，满嘴流油”的用户接受。“屌丝、性价比、低价”成为了小米的标签。&lt;/p&gt;
&lt;p&gt;蜜雪冰城通过“低价高质”在河南萌芽，之后通过大量加盟、同时保证价格和品质的上限和下限在短时间内迅速成为了国内茶饮行业的老大。同样在“满嘴流油”的时代，蜜雪冰城也是“屌丝”这类形容边缘型群体的标签。&lt;/p&gt;
&lt;h3 id="质量决定市场的时代"&gt;质量决定市场的时代&lt;/h3&gt;
&lt;p&gt;淘宝的产品是购物体验，商品品质以及售后保证。&lt;/p&gt;
&lt;p&gt;小米的产品是良好的品质、透明的价格以及售后保证。&lt;/p&gt;
&lt;p&gt;蜜雪冰城的产品是雪王形象、物流链路和原料品质，人员培训。&lt;/p&gt;
&lt;p&gt;在现在的经济环境下，90后、00后还没挣到钱就先被社会给上了好几课。过去那些「高级、小众」如今也变成了「噶韭菜」，消费市场已经从「情绪和服务决定价格」转变到了「质量和售后决定价格」的市场。未来市场中一味用「高级」来标榜自己的品牌会丧失自己在自由市场的地位，而「品质」的品牌会加速扩大自己的市场。&lt;/p&gt;
&lt;p&gt;中国的“优衣库”们将会在未来的市场出现，并且走向世界。&lt;/p&gt;
&lt;h1 id="chatgpt修改版本"&gt;ChatGPT修改版本&lt;/h1&gt;
&lt;h2 id="从小米yu7爆火看国产品牌的真实现状-1"&gt;从小米YU7爆火，看国产品牌的真实现状&lt;/h2&gt;
&lt;h3 id="3分钟大定20万这个世界只有我在消费降级吗"&gt;“3分钟大定20万，这个世界只有我在消费降级吗？”&lt;/h3&gt;
&lt;p&gt;小米汽车发布当天，评论区里这句高赞留言反映出一个鲜明对比：在2025年整体经济放缓的大背景下，小米YU7却逆势爆火，似乎揭示出消费市场中正在悄然发生的结构性变化。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="从糊涂消费到理性选择"&gt;从“糊涂消费”到“理性选择”&lt;/h3&gt;
&lt;p&gt;90后、00后走入社会后，普遍有种“总在被坑”的感受。线下消费从踏入门店那一刻起，就被复杂的销售话术、价格套路、隐藏成本所包围。最终付钱的，常常不是自己真正需要的，而是被“绕晕”后的妥协。更糟的是，出了问题想维权，售后几乎等于摆设，只有闹才有回应。&lt;/p&gt;
&lt;p&gt;这种“卖方为王”、服务混乱的市场，在十多年前的中国几乎无处不在。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="淘宝小米蜜雪冰城理性消费的样板"&gt;淘宝、小米、蜜雪冰城：理性消费的样板&lt;/h3&gt;
&lt;p&gt;在这样的背景下，淘宝、小米、蜜雪冰城三者，是“透明、品质、售后”理念落地的先行者：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;他们不是在卖产品，而是在重塑消费者的信任。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;淘宝带来了价格公开、比价便利、售后保障，直接终结了“电器城”模式的生存空间，开启了透明化消费的时代。&lt;/p&gt;
&lt;p&gt;小米凭借“性价比”迅速崛起，但当时处于高速增长的经济阶段，许多中产并不买账，小米一度被贴上“屌丝”“低端”的标签。&lt;/p&gt;
&lt;p&gt;蜜雪冰城以“低价高质”在河南发芽，通过标准化加盟体系，既压住了价格下限，也守住了品质上限，迅速拿下国内茶饮市场的头部地位。它的成功，曾同样被人视为“屌丝文化”的代表。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="品质是新的高级感"&gt;品质是新的“高级感”&lt;/h3&gt;
&lt;p&gt;今天的90后、00后没有赶上资产和工资齐飞的年代，反而在各种“收割”中学会了精明。他们不再相信“高级”=“值得买”，而是将注意力转向了“质量”和“售后”。&lt;/p&gt;
&lt;p&gt;现在的品牌竞争，已经从“讲故事”变成了“做实事”。&lt;/p&gt;
&lt;p&gt;淘宝、小米、蜜雪冰城成功的本质，是对“消费体验”的精准把控：从商品品质到售后流程，从价格透明到运营形象，每个环节都在打磨可信度。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="未来的国产品牌将走向何方"&gt;未来的国产品牌，将走向何方？&lt;/h3&gt;
&lt;p&gt;曾经靠“调性”“概念”打动人的品牌，如今正陷入增长瓶颈。而那些脚踏实地、注重产品和服务体验的企业，却在逐步赢得市场。&lt;/p&gt;
&lt;p&gt;中国消费者越来越理性：不盲目追求奢华，但极度重视性价比和可靠性。&lt;/p&gt;
&lt;p&gt;国产的“优衣库”式品牌，将不再是例外，而是新常态。&lt;/p&gt;</description><content:encoded>&lt;h1 id="原版"&gt;原版&lt;/h1&gt;
&lt;h2 id="从小米yu7爆火看国产品牌的真实现状"&gt;从小米YU7爆火，看国产品牌的真实现状&lt;/h2&gt;
&lt;h3 id="3分钟大定200000这个世界好像只有我在消费降级吗"&gt;“3分钟大定200000，这个世界好像只有我在消费降级吗？”&lt;/h3&gt;
&lt;p&gt;小米汽车的评论区最多的就是这句话。2025年国内经济低速增长的情况下，小米汽车的爆火揭示了中国市场正在悄然发生的变化。&lt;/p&gt;
&lt;h3 id="混乱的市场"&gt;混乱的市场&lt;/h3&gt;
&lt;p&gt;90后、00后出了社会总是有种上当的感觉，各种付费商品的体验总是不舒服。从进入门店开始，销售的眼光、言语、各种套餐、名词层出不同。非要把你绕晕了、忘记自己最开始需求，付钱购买了好像和需求差了那么一点的商品，然后走出去。售后？这种服务根本不存在。只有闹事才能维护自己的权益。&lt;/p&gt;
&lt;p&gt;但是就是这样的服务充斥着早些年的中国市场，去哪都一样，说不准还有强买强卖的事情发生。&lt;/p&gt;
&lt;h3 id="淘宝小米蜜雪冰城"&gt;淘宝、小米、蜜雪冰城&lt;/h3&gt;
&lt;p&gt;这三家应该是透明、品质、售后这些名词的市场实体代表。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;良好的品质、透明的价格、省心的售后&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;淘宝这类电商直接打击了电器城，电器城的衰落就是中国市场从混乱走向透明、品质、售后的开始&lt;/p&gt;
&lt;p&gt;小米通过“性价比”确定了自己的市场地位，只不过当时经济是一个快速发展的过程，这是的「性价比」更不被“吃满了时代红利，满嘴流油”的用户接受。“屌丝、性价比、低价”成为了小米的标签。&lt;/p&gt;
&lt;p&gt;蜜雪冰城通过“低价高质”在河南萌芽，之后通过大量加盟、同时保证价格和品质的上限和下限在短时间内迅速成为了国内茶饮行业的老大。同样在“满嘴流油”的时代，蜜雪冰城也是“屌丝”这类形容边缘型群体的标签。&lt;/p&gt;
&lt;h3 id="质量决定市场的时代"&gt;质量决定市场的时代&lt;/h3&gt;
&lt;p&gt;淘宝的产品是购物体验，商品品质以及售后保证。&lt;/p&gt;
&lt;p&gt;小米的产品是良好的品质、透明的价格以及售后保证。&lt;/p&gt;
&lt;p&gt;蜜雪冰城的产品是雪王形象、物流链路和原料品质，人员培训。&lt;/p&gt;
&lt;p&gt;在现在的经济环境下，90后、00后还没挣到钱就先被社会给上了好几课。过去那些「高级、小众」如今也变成了「噶韭菜」，消费市场已经从「情绪和服务决定价格」转变到了「质量和售后决定价格」的市场。未来市场中一味用「高级」来标榜自己的品牌会丧失自己在自由市场的地位，而「品质」的品牌会加速扩大自己的市场。&lt;/p&gt;
&lt;p&gt;中国的“优衣库”们将会在未来的市场出现，并且走向世界。&lt;/p&gt;
&lt;h1 id="chatgpt修改版本"&gt;ChatGPT修改版本&lt;/h1&gt;
&lt;h2 id="从小米yu7爆火看国产品牌的真实现状-1"&gt;从小米YU7爆火，看国产品牌的真实现状&lt;/h2&gt;
&lt;h3 id="3分钟大定20万这个世界只有我在消费降级吗"&gt;“3分钟大定20万，这个世界只有我在消费降级吗？”&lt;/h3&gt;
&lt;p&gt;小米汽车发布当天，评论区里这句高赞留言反映出一个鲜明对比：在2025年整体经济放缓的大背景下，小米YU7却逆势爆火，似乎揭示出消费市场中正在悄然发生的结构性变化。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="从糊涂消费到理性选择"&gt;从“糊涂消费”到“理性选择”&lt;/h3&gt;
&lt;p&gt;90后、00后走入社会后，普遍有种“总在被坑”的感受。线下消费从踏入门店那一刻起，就被复杂的销售话术、价格套路、隐藏成本所包围。最终付钱的，常常不是自己真正需要的，而是被“绕晕”后的妥协。更糟的是，出了问题想维权，售后几乎等于摆设，只有闹才有回应。&lt;/p&gt;
&lt;p&gt;这种“卖方为王”、服务混乱的市场，在十多年前的中国几乎无处不在。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="淘宝小米蜜雪冰城理性消费的样板"&gt;淘宝、小米、蜜雪冰城：理性消费的样板&lt;/h3&gt;
&lt;p&gt;在这样的背景下，淘宝、小米、蜜雪冰城三者，是“透明、品质、售后”理念落地的先行者：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;他们不是在卖产品，而是在重塑消费者的信任。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;淘宝带来了价格公开、比价便利、售后保障，直接终结了“电器城”模式的生存空间，开启了透明化消费的时代。&lt;/p&gt;
&lt;p&gt;小米凭借“性价比”迅速崛起，但当时处于高速增长的经济阶段，许多中产并不买账，小米一度被贴上“屌丝”“低端”的标签。&lt;/p&gt;
&lt;p&gt;蜜雪冰城以“低价高质”在河南发芽，通过标准化加盟体系，既压住了价格下限，也守住了品质上限，迅速拿下国内茶饮市场的头部地位。它的成功，曾同样被人视为“屌丝文化”的代表。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="品质是新的高级感"&gt;品质是新的“高级感”&lt;/h3&gt;
&lt;p&gt;今天的90后、00后没有赶上资产和工资齐飞的年代，反而在各种“收割”中学会了精明。他们不再相信“高级”=“值得买”，而是将注意力转向了“质量”和“售后”。&lt;/p&gt;
&lt;p&gt;现在的品牌竞争，已经从“讲故事”变成了“做实事”。&lt;/p&gt;
&lt;p&gt;淘宝、小米、蜜雪冰城成功的本质，是对“消费体验”的精准把控：从商品品质到售后流程，从价格透明到运营形象，每个环节都在打磨可信度。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="未来的国产品牌将走向何方"&gt;未来的国产品牌，将走向何方？&lt;/h3&gt;
&lt;p&gt;曾经靠“调性”“概念”打动人的品牌，如今正陷入增长瓶颈。而那些脚踏实地、注重产品和服务体验的企业，却在逐步赢得市场。&lt;/p&gt;
&lt;p&gt;中国消费者越来越理性：不盲目追求奢华，但极度重视性价比和可靠性。&lt;/p&gt;
&lt;p&gt;国产的“优衣库”式品牌，将不再是例外，而是新常态。&lt;/p&gt;</content:encoded></item><item><title>Go语言实现的APNs推送服务：一次稳定性问题的排查与优化实录</title><link>/posts/go%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0%E7%9A%84apns%E6%8E%A8%E9%80%81%E6%9C%8D%E5%8A%A1%E4%B8%80%E6%AC%A1%E7%A8%B3%E5%AE%9A%E6%80%A7%E9%97%AE%E9%A2%98%E7%9A%84%E6%8E%92%E6%9F%A5%E4%B8%8E%E4%BC%98%E5%8C%96%E5%AE%9E%E5%BD%95/</link><pubDate>Fri, 27 Jun 2025 14:26:00 +0800</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/go%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0%E7%9A%84apns%E6%8E%A8%E9%80%81%E6%9C%8D%E5%8A%A1%E4%B8%80%E6%AC%A1%E7%A8%B3%E5%AE%9A%E6%80%A7%E9%97%AE%E9%A2%98%E7%9A%84%E6%8E%92%E6%9F%A5%E4%B8%8E%E4%BC%98%E5%8C%96%E5%AE%9E%E5%BD%95/</guid><description>&lt;h1 id="go语言实现的apns推送服务一次稳定性问题的排查与优化实录"&gt;Go语言实现的APNs推送服务：一次稳定性问题的排查与优化实录&lt;/h1&gt;
&lt;p&gt;在生产环境中部署 APNs 推送服务时，我们遇到了一个让人头疼的问题：&lt;strong&gt;服务运行约一周后，会突然停止推送消息&lt;/strong&gt;，且腾讯云实例的内存占用达到 100%。本文将详细记录从最初的异常现象，到最后稳定运行的整个排查与优化过程，希望对你构建稳定、高效的 Go 推送服务有所帮助。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="异步问题"&gt;异步问题&lt;/h2&gt;
&lt;p&gt;生产环境下，程序运行约一周后推送功能会失效。梳理相关代码流程如下：&lt;/p&gt;
&lt;p&gt;生产者将消息放入队列A，Consumer-A消费后同步将响应写入队列B。Consumer-B同步消费队列B，将推送结果写入缓存，随后通过定时任务批量保存到数据库。&lt;/p&gt;
&lt;p&gt;问题出在队列B：高峰期Consumer-B消费速度慢于Consumer-A，导致队列B被填满。此时，推送响应阻塞在写入队列B的操作上，程序不断创建新的goroutine，最终内存耗尽导致服务崩溃。&lt;/p&gt;
&lt;h3 id="优化"&gt;优化&lt;/h3&gt;
&lt;p&gt;简化代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 优化塞入消费队列B的操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;channelB&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;After&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Second&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样，当channelB已满时，1秒超时后直接丢弃响应，避免Consumer-A因阻塞而无限制创建goroutine。&lt;/p&gt;
&lt;h2 id="一问题现象与初步排查"&gt;一、问题现象与初步排查&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;初始配置&lt;/strong&gt;：服务启动时会根据配置创建 &lt;code&gt;200 个 httpClient&lt;/code&gt;，每个 client 启动 &lt;code&gt;400 个 goroutine&lt;/code&gt;，总计约 &lt;strong&gt;8 万个 goroutine&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问题表现&lt;/strong&gt;：服务运行一周左右后 &lt;strong&gt;完全停止推送&lt;/strong&gt;，同时腾讯云实例内存占用达到 &lt;strong&gt;100%&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第一步尝试&lt;/strong&gt;：简单地提升云主机内存，但问题并未解决，&lt;strong&gt;仅仅延后了推送停滞的时间&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二深入阅读源码找出并发模型的问题"&gt;二、深入阅读源码，找出并发模型的问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;阅读代码后发现，每个 HTTP client 会配套启动 goroutine 队列，导致 goroutine 数量极度膨胀。&lt;/li&gt;
&lt;li&gt;初步怀疑 goroutine 与连接数的组合导致了内存膨胀与资源抢占。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-动作调整配置"&gt;🔧 动作：调整配置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将配置修改为：&lt;code&gt;10 个 httpClient&lt;/code&gt;，每个 client 启动 &lt;code&gt;100 个 goroutine&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果&lt;/strong&gt;：内存占用明显降低，但 &lt;strong&gt;推送停止问题依然存在&lt;/strong&gt;，只是&lt;strong&gt;发生时间变长了&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三提高日志等级捕获-apns-的-goaway-信号"&gt;三、提高日志等级，捕获 APNs 的 GOAWAY 信号&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;将日志级别调为 &lt;code&gt;Error&lt;/code&gt;，观察关键错误。&lt;/li&gt;
&lt;li&gt;发现日志中频繁出现：&lt;code&gt;http2: received GOAWAY&lt;/code&gt; 的错误。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-理解-goaway"&gt;🧠 理解 GOAWAY：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GOAWAY 是 HTTP/2 协议中服务端通知关闭连接的帧。&lt;/li&gt;
&lt;li&gt;APNs 服务器可能因&lt;strong&gt;连接使用过度&lt;/strong&gt;或&lt;strong&gt;资源占用过多&lt;/strong&gt;而主动断开。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="四实现连接重建逻辑"&gt;四、实现连接重建逻辑&lt;/h2&gt;
&lt;h3 id="-初步方案"&gt;🛠 初步方案：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在捕获到 &lt;code&gt;http2.GoAwayError&lt;/code&gt; 时，调用 &lt;code&gt;replaceTransport()&lt;/code&gt; 逻辑，重建 HTTP 客户端连接。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-遇到问题"&gt;🐞 遇到问题：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;日志中发现：&lt;code&gt;interface conversion: error is *errors.errorString, not http2.GoAwayError&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;原因是代码错误地将 &lt;code&gt;error&lt;/code&gt; 类型直接断言为 &lt;code&gt;http2.GoAwayError&lt;/code&gt;，导致 panic。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-修复方式"&gt;✅ 修复方式：&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;errors.As()&lt;/code&gt; 安全判断底层错误类型：&lt;/p&gt;</description><content:encoded>&lt;h1 id="go语言实现的apns推送服务一次稳定性问题的排查与优化实录"&gt;Go语言实现的APNs推送服务：一次稳定性问题的排查与优化实录&lt;/h1&gt;
&lt;p&gt;在生产环境中部署 APNs 推送服务时，我们遇到了一个让人头疼的问题：&lt;strong&gt;服务运行约一周后，会突然停止推送消息&lt;/strong&gt;，且腾讯云实例的内存占用达到 100%。本文将详细记录从最初的异常现象，到最后稳定运行的整个排查与优化过程，希望对你构建稳定、高效的 Go 推送服务有所帮助。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="异步问题"&gt;异步问题&lt;/h2&gt;
&lt;p&gt;生产环境下，程序运行约一周后推送功能会失效。梳理相关代码流程如下：&lt;/p&gt;
&lt;p&gt;生产者将消息放入队列A，Consumer-A消费后同步将响应写入队列B。Consumer-B同步消费队列B，将推送结果写入缓存，随后通过定时任务批量保存到数据库。&lt;/p&gt;
&lt;p&gt;问题出在队列B：高峰期Consumer-B消费速度慢于Consumer-A，导致队列B被填满。此时，推送响应阻塞在写入队列B的操作上，程序不断创建新的goroutine，最终内存耗尽导致服务崩溃。&lt;/p&gt;
&lt;h3 id="优化"&gt;优化&lt;/h3&gt;
&lt;p&gt;简化代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 优化塞入消费队列B的操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;channelB&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;After&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Second&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样，当channelB已满时，1秒超时后直接丢弃响应，避免Consumer-A因阻塞而无限制创建goroutine。&lt;/p&gt;
&lt;h2 id="一问题现象与初步排查"&gt;一、问题现象与初步排查&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;初始配置&lt;/strong&gt;：服务启动时会根据配置创建 &lt;code&gt;200 个 httpClient&lt;/code&gt;，每个 client 启动 &lt;code&gt;400 个 goroutine&lt;/code&gt;，总计约 &lt;strong&gt;8 万个 goroutine&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问题表现&lt;/strong&gt;：服务运行一周左右后 &lt;strong&gt;完全停止推送&lt;/strong&gt;，同时腾讯云实例内存占用达到 &lt;strong&gt;100%&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第一步尝试&lt;/strong&gt;：简单地提升云主机内存，但问题并未解决，&lt;strong&gt;仅仅延后了推送停滞的时间&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二深入阅读源码找出并发模型的问题"&gt;二、深入阅读源码，找出并发模型的问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;阅读代码后发现，每个 HTTP client 会配套启动 goroutine 队列，导致 goroutine 数量极度膨胀。&lt;/li&gt;
&lt;li&gt;初步怀疑 goroutine 与连接数的组合导致了内存膨胀与资源抢占。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-动作调整配置"&gt;🔧 动作：调整配置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将配置修改为：&lt;code&gt;10 个 httpClient&lt;/code&gt;，每个 client 启动 &lt;code&gt;100 个 goroutine&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果&lt;/strong&gt;：内存占用明显降低，但 &lt;strong&gt;推送停止问题依然存在&lt;/strong&gt;，只是&lt;strong&gt;发生时间变长了&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三提高日志等级捕获-apns-的-goaway-信号"&gt;三、提高日志等级，捕获 APNs 的 GOAWAY 信号&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;将日志级别调为 &lt;code&gt;Error&lt;/code&gt;，观察关键错误。&lt;/li&gt;
&lt;li&gt;发现日志中频繁出现：&lt;code&gt;http2: received GOAWAY&lt;/code&gt; 的错误。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-理解-goaway"&gt;🧠 理解 GOAWAY：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GOAWAY 是 HTTP/2 协议中服务端通知关闭连接的帧。&lt;/li&gt;
&lt;li&gt;APNs 服务器可能因&lt;strong&gt;连接使用过度&lt;/strong&gt;或&lt;strong&gt;资源占用过多&lt;/strong&gt;而主动断开。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="四实现连接重建逻辑"&gt;四、实现连接重建逻辑&lt;/h2&gt;
&lt;h3 id="-初步方案"&gt;🛠 初步方案：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在捕获到 &lt;code&gt;http2.GoAwayError&lt;/code&gt; 时，调用 &lt;code&gt;replaceTransport()&lt;/code&gt; 逻辑，重建 HTTP 客户端连接。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-遇到问题"&gt;🐞 遇到问题：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;日志中发现：&lt;code&gt;interface conversion: error is *errors.errorString, not http2.GoAwayError&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;原因是代码错误地将 &lt;code&gt;error&lt;/code&gt; 类型直接断言为 &lt;code&gt;http2.GoAwayError&lt;/code&gt;，导致 panic。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-修复方式"&gt;✅ 修复方式：&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;errors.As()&lt;/code&gt; 安全判断底层错误类型：&lt;/p&gt;</content:encoded></item><item><title>回旋镖的数量</title><link>/posts/number_of_boomerangs/</link><pubDate>Mon, 13 Sep 2021 11:15:13 +0800</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/number_of_boomerangs/</guid><description>&lt;h1 id="回旋镖的数量"&gt;回旋镖的数量&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;给定平面上 n 对 互不相同 的点 points ，其中 points[i] = [xi, yi] 。
回旋镖 是由点 (i, j, k) 表示的元组 ，
其中 i 和 j 之间的距离和 i 和 k 之间的距离相等（需要考虑元组的顺序）。
返回平面上所有回旋镖的数量。
示例 1：
输入：points = [[0,0],[1,0],[2,0]]
输出：2
解释：两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
示例 2：
输入：points = [[1,1],[2,2],[3,3]]
输出：2
示例 3：
输入：points = [[1,1]]
输出：0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;首先写一下自己的思路：本来我的思路是回旋镖中间的点到两边的点距离肯定是相同的。那么求回旋镖的数量就是
拿到一个符合中间点到两边点相同距离的元组的数量。到考虑元组的顺序这点我开始纠结了。这里记录一下。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;元组的顺序肯定是不相同的，这里需要用到排列组合中的概念。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回想一下我的思路，一个点到其他两个点的距离相同。&lt;/p&gt;
&lt;p&gt;Leetcode这里抽象成了到某个点距离相同的所有点的距离 m , 那么在m个点中拿出两个点与最外层点p组合成一个
回旋镖的元组即为排列，A(2, m) = m * (m - 1)&lt;/p&gt;
&lt;p&gt;看代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;numberOfBoomerangs&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;points&lt;/span&gt; [][]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) (&lt;span style="color:#a6e22e"&gt;ans&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;p&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;points&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;cnt&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make(&lt;span style="color:#66d9ef"&gt;map&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;q&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;points&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dis&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;q&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;q&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;q&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;q&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;cnt&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;dis&lt;/span&gt;] &lt;span style="color:#f92672"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cnt&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ans&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ans&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><content:encoded>&lt;h1 id="回旋镖的数量"&gt;回旋镖的数量&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;给定平面上 n 对 互不相同 的点 points ，其中 points[i] = [xi, yi] 。
回旋镖 是由点 (i, j, k) 表示的元组 ，
其中 i 和 j 之间的距离和 i 和 k 之间的距离相等（需要考虑元组的顺序）。
返回平面上所有回旋镖的数量。
示例 1：
输入：points = [[0,0],[1,0],[2,0]]
输出：2
解释：两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
示例 2：
输入：points = [[1,1],[2,2],[3,3]]
输出：2
示例 3：
输入：points = [[1,1]]
输出：0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;首先写一下自己的思路：本来我的思路是回旋镖中间的点到两边的点距离肯定是相同的。那么求回旋镖的数量就是
拿到一个符合中间点到两边点相同距离的元组的数量。到考虑元组的顺序这点我开始纠结了。这里记录一下。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;元组的顺序肯定是不相同的，这里需要用到排列组合中的概念。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回想一下我的思路，一个点到其他两个点的距离相同。&lt;/p&gt;
&lt;p&gt;Leetcode这里抽象成了到某个点距离相同的所有点的距离 m , 那么在m个点中拿出两个点与最外层点p组合成一个
回旋镖的元组即为排列，A(2, m) = m * (m - 1)&lt;/p&gt;
&lt;p&gt;看代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;numberOfBoomerangs&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;points&lt;/span&gt; [][]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) (&lt;span style="color:#a6e22e"&gt;ans&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;p&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;points&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;cnt&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make(&lt;span style="color:#66d9ef"&gt;map&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;q&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;points&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dis&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;q&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;q&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;q&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;q&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;cnt&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;dis&lt;/span&gt;] &lt;span style="color:#f92672"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cnt&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ans&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ans&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title>不包含连续的1的整数</title><link>/posts/non_negative_integers_without_consecutive_ones/</link><pubDate>Sun, 12 Sep 2021 15:39:42 +0800</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/non_negative_integers_without_consecutive_ones/</guid><description>&lt;h1 id="不包含连续的1的整数"&gt;不包含连续的1的整数&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;给定一个正整数 n，找出小于或等于 n 的非负整数中，其二进制表示不包含 连续的1 的个数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例 1:&lt;/p&gt;
&lt;p&gt;输入: 5&lt;/p&gt;
&lt;p&gt;输出: 5&lt;/p&gt;
&lt;p&gt;解释:
下面是带有相应二进制表示的非负整数&amp;lt;= 5：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中，只有整数3违反规则（有两个连续的1），其他5个满足规则。&lt;/p&gt;
&lt;p&gt;说明: 1 &amp;lt;= n &amp;lt;= 10^9&lt;/p&gt;
&lt;p&gt;根据题目描述，我们可以拿到1～n每个数字的二进制，然后计算二进制不包含连续的1的整数的数量，返回即可。但是
题目中的n的取值范围为[1,10^9]，暴力肯定会超时。&lt;/p&gt;
&lt;p&gt;我们要计算的是[0,n]范围内数字二进制不包含连续1的个数。&lt;/p&gt;
&lt;p&gt;假设数字n的二进制位为：1001001，如何计算范围内数字二进制不包含连续1的个数？&lt;/p&gt;
&lt;p&gt;首先我们假设数字开头为0，数字表示为0xxxxxx。0之后的二进制可以为1，可以为0。在这种情况下，我们唯一能够
确定的就是，开头的0那一位。xxxxxx中有多少个不包含连续1数字呢？我们先记下这个子问题。&lt;/p&gt;
&lt;p&gt;其次我们假设数字开头为1，那么1之后的二进制位必须为0。重申一下，二进制中不包含连续1的数字。那么我们可以确定
开头的两位二进制10。那么数字可以表示为10xxxxx。xxxxx中有多少个不包含连续1的数字呢？&lt;/p&gt;
&lt;p&gt;声明一个数组dp，下标i表示长度为i的二进制。&lt;strong&gt;dp[i]表示该二进制位不包含连续的1的数量&lt;/strong&gt;。由于
数字的二进制的每一位不是0就是1，如果一个二进制的开头为0，那么它的的下一位就可以选择0，或者1。如果一个二
进制的开头为1，那么它的下一位只能是0，如果是1的话就不符合题目中要求的不包含连续的1。由此可以得出：&lt;/p&gt;
&lt;p&gt;dp[i] = dp[i - 1] + dp[i - 2]&lt;/p&gt;
&lt;p&gt;dp[i - 1] 表示 0开头的，长度为i-1的二进制中不包含连续1的数量
dp[i - 2] 表示 10开头的，长度为i-2的二进制中不包含连续1的数量&lt;/p&gt;
&lt;p&gt;终止条件为：&lt;/p&gt;
&lt;p&gt;dp[0] = 1
dp[1] = 2&lt;/p&gt;</description><content:encoded>&lt;h1 id="不包含连续的1的整数"&gt;不包含连续的1的整数&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;给定一个正整数 n，找出小于或等于 n 的非负整数中，其二进制表示不包含 连续的1 的个数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例 1:&lt;/p&gt;
&lt;p&gt;输入: 5&lt;/p&gt;
&lt;p&gt;输出: 5&lt;/p&gt;
&lt;p&gt;解释:
下面是带有相应二进制表示的非负整数&amp;lt;= 5：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中，只有整数3违反规则（有两个连续的1），其他5个满足规则。&lt;/p&gt;
&lt;p&gt;说明: 1 &amp;lt;= n &amp;lt;= 10^9&lt;/p&gt;
&lt;p&gt;根据题目描述，我们可以拿到1～n每个数字的二进制，然后计算二进制不包含连续的1的整数的数量，返回即可。但是
题目中的n的取值范围为[1,10^9]，暴力肯定会超时。&lt;/p&gt;
&lt;p&gt;我们要计算的是[0,n]范围内数字二进制不包含连续1的个数。&lt;/p&gt;
&lt;p&gt;假设数字n的二进制位为：1001001，如何计算范围内数字二进制不包含连续1的个数？&lt;/p&gt;
&lt;p&gt;首先我们假设数字开头为0，数字表示为0xxxxxx。0之后的二进制可以为1，可以为0。在这种情况下，我们唯一能够
确定的就是，开头的0那一位。xxxxxx中有多少个不包含连续1数字呢？我们先记下这个子问题。&lt;/p&gt;
&lt;p&gt;其次我们假设数字开头为1，那么1之后的二进制位必须为0。重申一下，二进制中不包含连续1的数字。那么我们可以确定
开头的两位二进制10。那么数字可以表示为10xxxxx。xxxxx中有多少个不包含连续1的数字呢？&lt;/p&gt;
&lt;p&gt;声明一个数组dp，下标i表示长度为i的二进制。&lt;strong&gt;dp[i]表示该二进制位不包含连续的1的数量&lt;/strong&gt;。由于
数字的二进制的每一位不是0就是1，如果一个二进制的开头为0，那么它的的下一位就可以选择0，或者1。如果一个二
进制的开头为1，那么它的下一位只能是0，如果是1的话就不符合题目中要求的不包含连续的1。由此可以得出：&lt;/p&gt;
&lt;p&gt;dp[i] = dp[i - 1] + dp[i - 2]&lt;/p&gt;
&lt;p&gt;dp[i - 1] 表示 0开头的，长度为i-1的二进制中不包含连续1的数量
dp[i - 2] 表示 10开头的，长度为i-2的二进制中不包含连续1的数量&lt;/p&gt;
&lt;p&gt;终止条件为：&lt;/p&gt;
&lt;p&gt;dp[0] = 1
dp[1] = 2&lt;/p&gt;</content:encoded></item><item><title>使用rand7实现rand10</title><link>/posts/implement_rand10_use_rand7/</link><pubDate>Sun, 05 Sep 2021 14:50:20 +0800</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/implement_rand10_use_rand7/</guid><description>&lt;h1 id="使用rand7实现rand10"&gt;使用rand7实现rand10&lt;/h1&gt;
&lt;p&gt;题目：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数，试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
不要使用系统的 Math.random() 方法。
来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/implement-rand10-using-rand7
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;结论：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;(RAND_X - 1) * Y + RAND_Y = RAND_X*Y&lt;/li&gt;
&lt;li&gt;RAND_X*Y % Y + 1 = RAND_Y&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;证明结论1：&lt;/p&gt;
&lt;p&gt;使用rand2生成rand4&lt;/p&gt;
&lt;p&gt;使用 rand2_Row + rand2_Col 生成的随机数为：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Col\Row&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;结果生成的范围为[2,4]&lt;/p&gt;
&lt;p&gt;然后我们缩小结果的范围，用 rand2_Row - 1 替换 原来式子中的 rand2_Row，上面的式子就变成了：(rand2_Row - 1) + rand2_Col&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Col\Row&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;结果生成的范围为[1,3]。但显然结果出现的概论并不是平均的，1，3的概率分别为25%，2的概率最大，为50%。&lt;/p&gt;</description><content:encoded>&lt;h1 id="使用rand7实现rand10"&gt;使用rand7实现rand10&lt;/h1&gt;
&lt;p&gt;题目：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数，试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
不要使用系统的 Math.random() 方法。
来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/implement-rand10-using-rand7
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;结论：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;(RAND_X - 1) * Y + RAND_Y = RAND_X*Y&lt;/li&gt;
&lt;li&gt;RAND_X*Y % Y + 1 = RAND_Y&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;证明结论1：&lt;/p&gt;
&lt;p&gt;使用rand2生成rand4&lt;/p&gt;
&lt;p&gt;使用 rand2_Row + rand2_Col 生成的随机数为：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Col\Row&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;结果生成的范围为[2,4]&lt;/p&gt;
&lt;p&gt;然后我们缩小结果的范围，用 rand2_Row - 1 替换 原来式子中的 rand2_Row，上面的式子就变成了：(rand2_Row - 1) + rand2_Col&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Col\Row&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;结果生成的范围为[1,3]。但显然结果出现的概论并不是平均的，1，3的概率分别为25%，2的概率最大，为50%。&lt;/p&gt;</content:encoded></item><item><title/><link>/posts/readme/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>zephone0724@gmail.com (CengSin)</author><guid>/posts/readme/</guid><description>&lt;h1 id="contentposts-目录说明"&gt;content/posts 目录说明&lt;/h1&gt;
&lt;p&gt;本目录用于存放所有博客文章的 Markdown 源文件。&lt;/p&gt;
&lt;h2 id="结构说明"&gt;结构说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;每篇文章为一个独立的 &lt;code&gt;.md&lt;/code&gt; 文件，文件名建议使用简明的中文或英文标题。&lt;/li&gt;
&lt;li&gt;支持多级子目录分类（如有需要，可按主题、年份等划分）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="写作建议"&gt;写作建议&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;hugo new content/posts/title.md&lt;/code&gt;创建新的文件&lt;/li&gt;
&lt;li&gt;文件头部需包含 Hugo 兼容的 Front Matter（如 title、date、draft 等）。&lt;/li&gt;
&lt;li&gt;推荐使用 Markdown 标准语法，便于后续迁移和格式统一。&lt;/li&gt;
&lt;li&gt;文章内容应结构清晰，适当分段，便于阅读。&lt;/li&gt;
&lt;li&gt;技术类文章建议配合代码块、表格、列表等增强可读性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="其他说明"&gt;其他说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;请勿存放非文章类文件（如图片、附件等），统一放置于 &lt;code&gt;static&lt;/code&gt; 或其他专用目录。&lt;/li&gt;
&lt;li&gt;如需协作，请遵循统一的命名和排版规范。&lt;/li&gt;
&lt;/ul&gt;</description><content:encoded>&lt;h1 id="contentposts-目录说明"&gt;content/posts 目录说明&lt;/h1&gt;
&lt;p&gt;本目录用于存放所有博客文章的 Markdown 源文件。&lt;/p&gt;
&lt;h2 id="结构说明"&gt;结构说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;每篇文章为一个独立的 &lt;code&gt;.md&lt;/code&gt; 文件，文件名建议使用简明的中文或英文标题。&lt;/li&gt;
&lt;li&gt;支持多级子目录分类（如有需要，可按主题、年份等划分）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="写作建议"&gt;写作建议&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;hugo new content/posts/title.md&lt;/code&gt;创建新的文件&lt;/li&gt;
&lt;li&gt;文件头部需包含 Hugo 兼容的 Front Matter（如 title、date、draft 等）。&lt;/li&gt;
&lt;li&gt;推荐使用 Markdown 标准语法，便于后续迁移和格式统一。&lt;/li&gt;
&lt;li&gt;文章内容应结构清晰，适当分段，便于阅读。&lt;/li&gt;
&lt;li&gt;技术类文章建议配合代码块、表格、列表等增强可读性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="其他说明"&gt;其他说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;请勿存放非文章类文件（如图片、附件等），统一放置于 &lt;code&gt;static&lt;/code&gt; 或其他专用目录。&lt;/li&gt;
&lt;li&gt;如需协作，请遵循统一的命名和排版规范。&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>