<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Aoang's Blog</title>
        <link>https://aoang.x2ox.com/</link>
        <description>时不时会找一些过去的笔记，整理为人类可读的内容，也会专门的写一些内容发布在这里</description>
        <lastBuildDate>Thu, 24 Sep 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>Vacuum</generator>
        <image>
            <title>Aoang's Blog</title>
            <url>https://o2x.net/0xf2/MfqbYSNbSFWHfHj8E6wkMg.png</url>
            <link>https://aoang.x2ox.com/</link>
        </image>
        <copyright>Copyright © 2016 - 2026 Aoang's Blog All Rights Reserved</copyright>
        <item>
            <title><![CDATA[深入数据库执行计划]]></title>
            <link>https://aoang.x2ox.com/2026/db-execution-plan/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/db-execution-plan/</guid>
            <pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[专门写这一篇文章，是因为曾经遇到过有同事不熟悉数据库，甚至没用过 EXPLAIN，当遇到慢 SQL 之后，第一反应往往是问有经验的人。所以，本文不会假定你对数据库有很高的熟悉程度，但是写 SQL、建索引这些还是得会的，部分超出范围的内容也都有讲解。执行 EXPLAIN，屏幕上很快出现一堆内容：type=range、cost=35.50、Bitmap Heap Scan、USE TEMP B-TREE。如果使用过或者阅读过文档，看到这里可能会觉得问题已经有了答案，但实际上，排查]]></description>
            <content:encoded><![CDATA[专门写这一篇文章，是因为曾经遇到过有同事不熟悉数据库，甚至没用过 EXPLAIN，当遇到慢 SQL 之后，第一反应往往是问有经验的人。所以，本文不会假定你对数据库有很高的熟悉程度，但是写 SQL、建索引这些还是得会的，部分超出范围的内容也都有讲解。执行 EXPLAIN，屏幕上很快出现一堆内容：type=range、cost=35.50、Bitmap Heap Scan、USE TEMP B-TREE。如果使用过或者阅读过文档，看到这里可能会觉得问题已经有了答案，但实际上，排查才刚刚开始。这些节点只记录了优化器的选择，没有直接说明选择的依据。要理解它还需要继续了解：每个条件预计会留下多少行；当前... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/db-execution-plan/">https://aoang.x2ox.com/2026/db-execution-plan/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[IaC 之 OpenTofu]]></title>
            <link>https://aoang.x2ox.com/2026/opentofu-guide/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/opentofu-guide/</guid>
            <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[测试环境和生产环境到底差在哪？资源少的时候，问一圈同事，翻翻控制台，大概还能找到答案。当网络、数据库、IAM 和 Kubernetes 集群分散在几个平台，随着时间的流逝，这个答案就很难获取了，更不用说再搭一套相同的环境了。基础设施即代码 (Infrastructure as Code, IaC) 就是针对这个问题的一种解法：把资源及其关系写进文件，让变更能审查、能复现。Terraform 多年来是常见选择，围绕 HCL 配置语言、Provider 和 Module 积累了大]]></description>
            <content:encoded><![CDATA[测试环境和生产环境到底差在哪？资源少的时候，问一圈同事，翻翻控制台，大概还能找到答案。当网络、数据库、IAM 和 Kubernetes 集群分散在几个平台，随着时间的流逝，这个答案就很难获取了，更不用说再搭一套相同的环境了。基础设施即代码 (Infrastructure as Code, IaC) 就是针对这个问题的一种解法：把资源及其关系写进文件，让变更能审查、能复现。Terraform 多年来是常见选择，围绕 HCL 配置语言、Provider 和 Module 积累了大量现成组件。2023 年 Terraform 更换许可证后，OpenTofu 以现有代码为基础出现。它保留了熟悉的配置和... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/opentofu-guide/">https://aoang.x2ox.com/2026/opentofu-guide/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[消息队列选型和踩坑]]></title>
            <link>https://aoang.x2ox.com/2026/mq-selection/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/mq-selection/</guid>
            <pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[后端服务引入消息队列，开始时往往只是为了把一段耗时操作放到后台执行。后来又会加入事件通知、失败重试、广播、顺序消费和历史重放。看起来都在发消息，实际需要的存储方式和消费模型并不相同。选型时最容易比较的是吞吐和延迟，这个数字很重要，但有些问题更值得关注，例如消息丢失后如何恢复、扩容 Consumer 是否需要提前增加 Partition。以至于部署多少组件、如何升级、磁盘故障后怎样恢复，可能系统没上线之前都被忽略掉了。NATS、NSQ、Kafka、RabbitMQ 和 Puls]]></description>
            <content:encoded><![CDATA[后端服务引入消息队列，开始时往往只是为了把一段耗时操作放到后台执行。后来又会加入事件通知、失败重试、广播、顺序消费和历史重放。看起来都在发消息，实际需要的存储方式和消费模型并不相同。选型时最容易比较的是吞吐和延迟，这个数字很重要，但有些问题更值得关注，例如消息丢失后如何恢复、扩容 Consumer 是否需要提前增加 Partition。以至于部署多少组件、如何升级、磁盘故障后怎样恢复，可能系统没上线之前都被忽略掉了。NATS、NSQ、Kafka、RabbitMQ 和 Pulsar 都能在网络两端传递消息，却沿着不同方向发展。有的偏向轻量的实时通信，有的擅长任务路由，有的把消息保存为可以反复读取... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/mq-selection/">https://aoang.x2ox.com/2026/mq-selection/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[OpenTelemetry 全景监控]]></title>
            <link>https://aoang.x2ox.com/2026/otel-guide/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/otel-guide/</guid>
            <pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[服务出了问题，通常先从指标发现异常，再到链路中定位耗时，最后结合日志查明原因。实际使用时，这三类数据往往来自不同的采集工具，字段名称也不一致。指标里叫 service，日志里可能叫 app_name；链路中有 trace_id，日志却没有记录。数据虽然都在，查询时却很难互相关联。业务代码如果直接使用某家监控厂商的 SDK，问题会更麻烦。更换后端时，不仅要迁移数据和仪表盘，还可能要重新修改各个服务的埋点代码。OpenTelemetry 用一套通用规范解决采集环节的问题，下文简称]]></description>
            <content:encoded><![CDATA[服务出了问题，通常先从指标发现异常，再到链路中定位耗时，最后结合日志查明原因。实际使用时，这三类数据往往来自不同的采集工具，字段名称也不一致。指标里叫 service，日志里可能叫 app_name；链路中有 trace_id，日志却没有记录。数据虽然都在，查询时却很难互相关联。业务代码如果直接使用某家监控厂商的 SDK，问题会更麻烦。更换后端时，不仅要迁移数据和仪表盘，还可能要重新修改各个服务的埋点代码。OpenTelemetry 用一套通用规范解决采集环节的问题，下文简称 OTel。它统一埋点接口、上下文传播、数据模型和传输协议。至于数据如何存储、查询和展示，仍由后端系统负责。本文从 OT... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/otel-guide/">https://aoang.x2ox.com/2026/otel-guide/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[GitOps 之 Flux CD]]></title>
            <link>https://aoang.x2ox.com/2026/gitops-fluxcd2/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/gitops-fluxcd2/</guid>
            <pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Kubernetes 资源可以用 kubectl apply 部署，也可以交给 CI 在流水线中执行 Helm。服务不多时，这些方式足够简单。集群和环境增加以后，问题会逐渐出现：生产环境究竟对应仓库中的哪个版本？有人临时修改了 Deployment，Git 中的配置是否仍然有效？CI 已经结束，部署失败后由谁继续重试？集群重新创建时，怎样恢复到原来的状态？GitOps 的做法是把 Git 中的配置作为期望状态，再由运行在集群内的控制器持续比较并修正实际状态。Flux CD 是]]></description>
            <content:encoded><![CDATA[Kubernetes 资源可以用 kubectl apply 部署，也可以交给 CI 在流水线中执行 Helm。服务不多时，这些方式足够简单。集群和环境增加以后，问题会逐渐出现：生产环境究竟对应仓库中的哪个版本？有人临时修改了 Deployment，Git 中的配置是否仍然有效？CI 已经结束，部署失败后由谁继续重试？集群重新创建时，怎样恢复到原来的状态？GitOps 的做法是把 Git 中的配置作为期望状态，再由运行在集群内的控制器持续比较并修正实际状态。Flux CD 是这类工具中的一种。它不会替代 Git、Kubernetes、Kustomize 或 Helm，而是把这些工具连接起来，让... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/gitops-fluxcd2/">https://aoang.x2ox.com/2026/gitops-fluxcd2/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[博客从 Mantine 到 StyleX]]></title>
            <link>https://aoang.x2ox.com/2026/mantine-to-stylex/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/mantine-to-stylex/</guid>
            <pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[在《博客重构》里，我专门解释过为什么选择 Mantine：我熟悉它，组件足够全，拿来就能用。那次重构的第一目标是尽快把博客从 Hexo 搬到 Next.js，而不是先花几个月造一套按钮、卡片、抽屉和响应式布局。Mantine 很好地完成了这个任务。问题是，将近一年之后，目标变了。页面早已能用，内容构建、搜索、代码高亮和移动端目录也逐渐稳定。我不再需要一个组件库帮我快速搭出所有东西，反而开始在意每个页面究竟带了多少 CSS、浏览器为什么要下载这些规则，以及一个看起来很简单的静态]]></description>
            <content:encoded><![CDATA[在《博客重构》里，我专门解释过为什么选择 Mantine：我熟悉它，组件足够全，拿来就能用。那次重构的第一目标是尽快把博客从 Hexo 搬到 Next.js，而不是先花几个月造一套按钮、卡片、抽屉和响应式布局。Mantine 很好地完成了这个任务。问题是，将近一年之后，目标变了。页面早已能用，内容构建、搜索、代码高亮和移动端目录也逐渐稳定。我不再需要一个组件库帮我快速搭出所有东西，反而开始在意每个页面究竟带了多少 CSS、浏览器为什么要下载这些规则，以及一个看起来很简单的静态博客为什么还需要完整的主题状态管理。最后推动我动手的数字很朴素：迁移前的构建产物里，CSS 一共 271.0 KB，gz... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/mantine-to-stylex/">https://aoang.x2ox.com/2026/mantine-to-stylex/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[从 Abuse 邮件溯源至 Globalping]]></title>
            <link>https://aoang.x2ox.com/2026/abuse-report-globalping/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/abuse-report-globalping/</guid>
            <pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[用过 Hetzner 的人大概都知道 Abuse 邮件不能随手归档。有些工单要求限时解释或处理，拖久了可能影响服务器乃至账号。不过，这次邮件正文明确写着不必回复，真正要做的是先弄清楚：我的服务器为什么会出现在一份恶意软件通信报告里？当时正在给 Mantine 迁移到 StyleX 的工作收尾，邮箱里突然出现一封 Hetzner 转发的 CERT-Bund 报告。那台服务器没有对外提供什么公共服务，也没有运行容易触发此类告警的程序，所以第一反应自然是，被挂马了？一、先从邮件开始]]></description>
            <content:encoded><![CDATA[用过 Hetzner 的人大概都知道 Abuse 邮件不能随手归档。有些工单要求限时解释或处理，拖久了可能影响服务器乃至账号。不过，这次邮件正文明确写着不必回复，真正要做的是先弄清楚：我的服务器为什么会出现在一份恶意软件通信报告里？当时正在给 Mantine 迁移到 StyleX 的工作收尾，邮箱里突然出现一封 Hetzner 转发的 CERT-Bund 报告。那台服务器没有对外提供什么公共服务，也没有运行容易触发此类告警的程序，所以第一反应自然是，被挂马了？一、先从邮件开始Hetzner 转发的邮件很长，真正与排查有关的内容只有下面这些：Dear Mr Aoang,We have recei... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/abuse-report-globalping/">https://aoang.x2ox.com/2026/abuse-report-globalping/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>弃如弁髦</category>
        </item>
        <item>
            <title><![CDATA[全世界都在探索 AI 如何落地]]></title>
            <link>https://aoang.x2ox.com/2026/ai-engineering-landing/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/ai-engineering-landing/</guid>
            <pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[这几年间，无数人、组织都在问同一个问题：AI 到底怎么落地？但是似乎无论是什么场景和项目，所谓落地，都会落到技术负责人头上。怎么回事儿？离了程序员，我还吃不上肉了？我现在就让 AI 自己写程序让自己落地！无论是投资人、老板还是管理层，最终都会到一个是或者类似技术负责人的角色这里，他就是地。但问题并不是到他这里就结束了，问题又变成该买哪个模型、装哪个编码助手、接哪个知识库、搭几个 Agent。会开了一轮又一轮，演示做得一个比一个漂亮。一个需求丢进对话框，几分钟后，代码、测试、文]]></description>
            <content:encoded><![CDATA[这几年间，无数人、组织都在问同一个问题：AI 到底怎么落地？但是似乎无论是什么场景和项目，所谓落地，都会落到技术负责人头上。怎么回事儿？离了程序员，我还吃不上肉了？我现在就让 AI 自己写程序让自己落地！无论是投资人、老板还是管理层，最终都会到一个是或者类似技术负责人的角色这里，他就是地。但问题并不是到他这里就结束了，问题又变成该买哪个模型、装哪个编码助手、接哪个知识库、搭几个 Agent。会开了一轮又一轮，演示做得一个比一个漂亮。一个需求丢进对话框，几分钟后，代码、测试、文档一应俱全。屏幕上一片绿色，提交记录飞快增长，月报里终于有了结果：赋能、提效。然后系统上线了。难堪的事情通常不会在演示当... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/ai-engineering-landing/">https://aoang.x2ox.com/2026/ai-engineering-landing/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[Bun 的使用经验]]></title>
            <link>https://aoang.x2ox.com/2026/bun-usage/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/bun-usage/</guid>
            <pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Bun 的入门文档很好懂：定义结构体，写几个 bun tag，然后 NewSelect、NewInsert、NewUpdate。照着示例做，半小时就能把一张表增删改查一遍。可项目真正复杂起来以后，问题通常不再是「左连接怎么写」，而是另外一组东西：事务里的 Repository 为什么突然不能复用？PATCH 请求中的零值到底表示更新成零，还是根本没传？一份用户结构为什么要在 Protobuf、业务层和数据库层复制三遍？PostgreSQL 的数组、JSONB、INET 扫描到]]></description>
            <content:encoded><![CDATA[Bun 的入门文档很好懂：定义结构体，写几个 bun tag，然后 NewSelect、NewInsert、NewUpdate。照着示例做，半小时就能把一张表增删改查一遍。可项目真正复杂起来以后，问题通常不再是「左连接怎么写」，而是另外一组东西：事务里的 Repository 为什么突然不能复用？PATCH 请求中的零值到底表示更新成零，还是根本没传？一份用户结构为什么要在 Protobuf、业务层和数据库层复制三遍？PostgreSQL 的数组、JSONB、INET 扫描到自定义类型时，为什么总差最后一点？筛选条件越来越多以后，怎样避免每个接口手写一组 if，又不把 SQL 注入送到家门口？... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/bun-usage/">https://aoang.x2ox.com/2026/bun-usage/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[古老的 RADIUS 协议]]></title>
            <link>https://aoang.x2ox.com/2026/radius-protocol/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/radius-protocol/</guid>
            <pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[第一次听到 /'reɪdiəs/ 联想到的单词肯定是 Radius，但是如果听到的是 RADIUS 协议，就不得不怀疑自己的耳朵了，半径协议是什么？当然，如果是看到 RADIUS 这个词就不会有这个疑惑，全大写意味着是首字母的缩写形式，就像 HTTP 协议一样。但是和 HTTP 协议一样，RADIUS 的全称 Remote Authentication Dial-In User Service 理解起来一样不怎么直观。远程用户拨号认证服务，这个短语看起来就有点儿古老，名称里面]]></description>
            <content:encoded><![CDATA[第一次听到 /'reɪdiəs/ 联想到的单词肯定是 Radius，但是如果听到的是 RADIUS 协议，就不得不怀疑自己的耳朵了，半径协议是什么？当然，如果是看到 RADIUS 这个词就不会有这个疑惑，全大写意味着是首字母的缩写形式，就像 HTTP 协议一样。但是和 HTTP 协议一样，RADIUS 的全称 Remote Authentication Dial-In User Service 理解起来一样不怎么直观。远程用户拨号认证服务，这个短语看起来就有点儿古老，名称里面居然还有拨号，这协议没和 Modem、电话线一起退休吗？事实恰好相反。你连星巴克、酒店、校园网的 Wi-Fi，交换机检查... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/radius-protocol/">https://aoang.x2ox.com/2026/radius-protocol/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[VPS 推荐]]></title>
            <link>https://aoang.x2ox.com/2026/vps-recommend/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/vps-recommend/</guid>
            <pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[推荐个 VPS 呗？这个问题经常听到，现在统一推荐一下。其实这个问题很宽泛，所以每次都需要先反问：你的用途是什么？然后在脑中过滤一遍，再继续问：预算多少？对位置有要求吗？需要什么配置？像挤牙膏似的一点点问，最终也很难得到答案。一家厂商的 VPS 怎么样，本质上都得自己买来实际用了才知道。光看一次跑分并不能下结论，因为无法知道晚高峰会不会丢包、工单有没有人回、故障以后怎么处理。踩坑了可能只能认栽，因为不是所有厂商的退款协议都比较友好。这些年用过不少大大小小的 VPS 和物理机，]]></description>
            <content:encoded><![CDATA[推荐个 VPS 呗？这个问题经常听到，现在统一推荐一下。其实这个问题很宽泛，所以每次都需要先反问：你的用途是什么？然后在脑中过滤一遍，再继续问：预算多少？对位置有要求吗？需要什么配置？像挤牙膏似的一点点问，最终也很难得到答案。一家厂商的 VPS 怎么样，本质上都得自己买来实际用了才知道。光看一次跑分并不能下结论，因为无法知道晚高峰会不会丢包、工单有没有人回、故障以后怎么处理。踩坑了可能只能认栽，因为不是所有厂商的退款协议都比较友好。这些年用过不少大大小小的 VPS 和物理机，所以分享一下自己用过且比较推荐的。没有哪家厂商最好，只有某个维度上正好合适。一、一个不可能三角不可能三角指的是「便宜、稳... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/vps-recommend/">https://aoang.x2ox.com/2026/vps-recommend/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[软件、工具链与 mise]]></title>
            <link>https://aoang.x2ox.com/2026/software-toolchain-mise/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/software-toolchain-mise/</guid>
            <pubDate>Tue, 08 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[你怎么给你的电脑安装软件的？是不是缺什么装什么，图形软件去官网下载，命令行工具用 Homebrew，Node.js 交给 nvm，Python 再装一个 pyenv。可能刚装完都挺好的，过上一年，~/.zshrc 里就会长出好几段初始化脚本。此时再问一句「现在运行的 node 到底从哪里来」，往往要先查半天 PATH。这种环境平时看不出问题。一旦同时维护新旧项目，事情马上多起来：一个项目还在 Node.js 20，另一个已经用了 Node.js 24；Python 版本不同，]]></description>
            <content:encoded><![CDATA[你怎么给你的电脑安装软件的？是不是缺什么装什么，图形软件去官网下载，命令行工具用 Homebrew，Node.js 交给 nvm，Python 再装一个 pyenv。可能刚装完都挺好的，过上一年，~/.zshrc 里就会长出好几段初始化脚本。此时再问一句「现在运行的 node 到底从哪里来」，往往要先查半天 PATH。这种环境平时看不出问题。一旦同时维护新旧项目，事情马上多起来：一个项目还在 Node.js 20，另一个已经用了 Node.js 24；Python 版本不同，连能不能装上依赖都不一样；全局 pnpm 升级以后，还可能顺手改掉项目锁文件。若 Node.js 是 Homebrew ... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/software-toolchain-mise/">https://aoang.x2ox.com/2026/software-toolchain-mise/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[出门在外，用 Cloudflare 保护好自己]]></title>
            <link>https://aoang.x2ox.com/2026/cloudflare-guide/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/cloudflare-guide/</guid>
            <pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[一个新网站刚上线，最先出现的访客往往不是读者，而是扫描 .env、寻找 WordPress 后台和尝试 SSH 登录的自动程序。当然，检查结果一般不通知你。很多人最初接触 Cloudflare，只是把网站的 DNS 记录设为已代理（Proxied）。继续翻控制台才会发现，它管的远不止网站入口：Email Routing 处理域名邮件转发，Tunnel 接入海外托管的自建应用，Page Shield 监控第三方脚本，R2 可以存备份，Notifications 负责告警。缓存、]]></description>
            <content:encoded><![CDATA[一个新网站刚上线，最先出现的访客往往不是读者，而是扫描 .env、寻找 WordPress 后台和尝试 SSH 登录的自动程序。当然，检查结果一般不通知你。很多人最初接触 Cloudflare，只是把网站的 DNS 记录设为已代理（Proxied）。继续翻控制台才会发现，它管的远不止网站入口：Email Routing 处理域名邮件转发，Tunnel 接入海外托管的自建应用，Page Shield 监控第三方脚本，R2 可以存备份，Notifications 负责告警。缓存、Pages 和 Workers 还能分担一部分源站工作。下面就按实际使用顺序来：先说访问端，再看海外自建应用的入口，最后... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/cloudflare-guide/">https://aoang.x2ox.com/2026/cloudflare-guide/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>朽木枯株</category>
        </item>
        <item>
            <title><![CDATA[最近给博客做的优化]]></title>
            <link>https://aoang.x2ox.com/2026/blog-optimize/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/blog-optimize/</guid>
            <pubDate>Sat, 05 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[上一篇《博客重构》里，我把目标写得很明确：完成基础设施，把精力转回内容。博客确实能用了，修改却没有停。搜索框里的状态、手机上的目录、切换页面时的代码高亮，每个地方单看都不大，连起来却足够再折腾一轮。这也不完全是闲不下来。有些问题只有放进真正的阅读过程才会出现：输入拼音时要不要立刻搜索，点完目录后面板要不要收起，页面开始切换了，代码高亮却还没准备好。组件单独看都能用，放在同一页里，仍然有不少地方需要磨合。这一轮基本没有改变博客的用途，更多是在整理前一次重构留下的细节。先列一下范]]></description>
            <content:encoded><![CDATA[上一篇《博客重构》里，我把目标写得很明确：完成基础设施，把精力转回内容。博客确实能用了，修改却没有停。搜索框里的状态、手机上的目录、切换页面时的代码高亮，每个地方单看都不大，连起来却足够再折腾一轮。这也不完全是闲不下来。有些问题只有放进真正的阅读过程才会出现：输入拼音时要不要立刻搜索，点完目录后面板要不要收起，页面开始切换了，代码高亮却还没准备好。组件单独看都能用，放在同一页里，仍然有不少地方需要磨合。这一轮基本没有改变博客的用途，更多是在整理前一次重构留下的细节。先列一下范围，后面再说具体为什么改、改到哪里停下来。| 功能       | 这一轮主要解决什么                 ... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/blog-optimize/">https://aoang.x2ox.com/2026/blog-optimize/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[来聊聊游泳吧]]></title>
            <link>https://aoang.x2ox.com/2026/lta-swimming/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/lta-swimming/</guid>
            <pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[很久很久之后，记录一下关于游泳的思考。怎样才算学会游泳，本身就很难定义。所以本文不聊怎么学会游泳，改聊聊其他的。游泳这项运动，对身体素质有三个方面的要求：柔韧性、力量和协调性。我们就聊聊这个对几种泳姿的影响，以及一些成人学习游泳会遇到的问题。其实第一个问题和身体素质没关系，而是已经会游泳的人往往无法理解那些不会游泳的人。就像你已经掌握了某个技能，但是教授别人的时候，如果你不会换位思考，往往也无法理解他们。换位思考的能力的是一个好东西，可惜不是人人都有。本文的角度皆在成人学习游]]></description>
            <content:encoded><![CDATA[很久很久之后，记录一下关于游泳的思考。怎样才算学会游泳，本身就很难定义。所以本文不聊怎么学会游泳，改聊聊其他的。游泳这项运动，对身体素质有三个方面的要求：柔韧性、力量和协调性。我们就聊聊这个对几种泳姿的影响，以及一些成人学习游泳会遇到的问题。其实第一个问题和身体素质没关系，而是已经会游泳的人往往无法理解那些不会游泳的人。就像你已经掌握了某个技能，但是教授别人的时候，如果你不会换位思考，往往也无法理解他们。换位思考的能力的是一个好东西，可惜不是人人都有。本文的角度皆在成人学习游泳这一前提下，而非早已会游泳的人群。一、身体素质这三项身体素质不要求样样优秀，但和木桶理论一样，短板很容易把上限卡死。根... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/lta-swimming/">https://aoang.x2ox.com/2026/lta-swimming/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[PostgreSQL 与 InnoDB 的存储路径]]></title>
            <link>https://aoang.x2ox.com/2026/postgresql-storage-path/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/postgresql-storage-path/</guid>
            <pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[假设有一张再普通不过的订单表：主键是 id，用户经常按 status 查询，后台又不断更新订单状态。CREATE TABLE orders (  id         bigint PRIMARY KEY,  status     varchar(32) NOT NULL,  buyer_id   bigint NOT NULL,  total      decimal(12, 2) NOT NULL,  note       varchar(500),  created_a]]></description>
            <content:encoded><![CDATA[假设有一张再普通不过的订单表：主键是 id，用户经常按 status 查询，后台又不断更新订单状态。CREATE TABLE orders (  id         bigint PRIMARY KEY,  status     varchar(32) NOT NULL,  buyer_id   bigint NOT NULL,  total      decimal(12, 2) NOT NULL,  note       varchar(500),  created_at timestamp NOT NULL);CREATE INDEX orders_status_idx ON orde... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/postgresql-storage-path/">https://aoang.x2ox.com/2026/postgresql-storage-path/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[Go 请你喝一杯绿茶]]></title>
            <link>https://aoang.x2ox.com/2026/go-green-tea-gc/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/go-green-tea-gc/</guid>
            <pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[如果 CPU profile 里 runtime.gcBgMarkWorker、对象扫描和分配路径长期霸榜，GC 才值得被请出来背锅。高频 JSON 解码、临时字符串和一地鸡毛的小对象，都会把 GC 累得够呛；锁竞争、网络调用和慢查询造成的延迟，则不是给 GC 换个名字就能治好的。Go 1.26 默认启用 Green Tea。它没有突然变成分代 GC，也不会把对象搬来搬去；底子仍是并发、非移动的标记—清扫。变化发生在标记阶段：以前更像追着一个个对象满堆跑，现在尽量把同一段堆内]]></description>
            <content:encoded><![CDATA[如果 CPU profile 里 runtime.gcBgMarkWorker、对象扫描和分配路径长期霸榜，GC 才值得被请出来背锅。高频 JSON 解码、临时字符串和一地鸡毛的小对象，都会把 GC 累得够呛；锁竞争、网络调用和慢查询造成的延迟，则不是给 GC 换个名字就能治好的。Go 1.26 默认启用 Green Tea。它没有突然变成分代 GC，也不会把对象搬来搬去；底子仍是并发、非移动的标记—清扫。变化发生在标记阶段：以前更像追着一个个对象满堆跑，现在尽量把同一段堆内存里的活攒在一起再扫。Green Tea 省的是标记阶段的 CPU 和多核协调成本，不会改变 GC 语义，更不会把不必要... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/go-green-tea-gc/">https://aoang.x2ox.com/2026/go-green-tea-gc/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[PostgreSQL 如何选择索引]]></title>
            <link>https://aoang.x2ox.com/2026/postgresql-index-selection/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/postgresql-index-selection/</guid>
            <pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[明明建了索引，数据库为什么不用？这是数据库问题里最常见、也最容易误判的一类。表上有索引，查询条件里也写了索引列，EXPLAIN 却给出一个 Seq Scan。把 enable_seqscan 关掉，索引突然又能用了。于是很自然地会得出结论：规划器选错了，或者它的成本估算与实际情况不符。但「能用某个索引」和「使用它成本最低」是两回事。索引先找到的是行的位置，不一定是查询最终需要的行；找到位置之后，还可能要读取表页、检查 MVCC 可见性、过滤误命中、排序、回表取列。若条件会返回]]></description>
            <content:encoded><![CDATA[明明建了索引，数据库为什么不用？这是数据库问题里最常见、也最容易误判的一类。表上有索引，查询条件里也写了索引列，EXPLAIN 却给出一个 Seq Scan。把 enable_seqscan 关掉，索引突然又能用了。于是很自然地会得出结论：规划器选错了，或者它的成本估算与实际情况不符。但「能用某个索引」和「使用它成本最低」是两回事。索引先找到的是行的位置，不一定是查询最终需要的行；找到位置之后，还可能要读取表页、检查 MVCC 可见性、过滤误命中、排序、回表取列。若条件会返回全表三分之一的数据，沿索引执行几万次离散读取，可能确实不如顺着表读一遍。索引不是查询的必经入口，只是规划器可以选择的一条... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/postgresql-index-selection/">https://aoang.x2ox.com/2026/postgresql-index-selection/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[从零开始的 Go 性能优化整活]]></title>
            <link>https://aoang.x2ox.com/2026/go-perf-optimize/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/go-perf-optimize/</guid>
            <pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[如果你还没有承受过高并发的毒打，或者接手了一份充满时代印记的古董代码，那么相信本文会给你指出一条踏向加班的不归路。当然，如果你是在操刀一个全新的项目，将本文的规则枷锁套在身上前行，你会走得更慢，但是你能走得更远。所谓的性能问题，本质上大多源于你对手里的东西了解得还不够透彻。偏偏现代高级编程语言为了提高开发效率，用层层抽象屏蔽了大量底层细节。即使不了解这些内容，你也能写出正常运行的业务代码。哪怕是比 Go 更贴近底层的 C 语言，也通过抽象屏蔽了许多硬件细节，例如 CPU 乱序]]></description>
            <content:encoded><![CDATA[如果你还没有承受过高并发的毒打，或者接手了一份充满时代印记的古董代码，那么相信本文会给你指出一条踏向加班的不归路。当然，如果你是在操刀一个全新的项目，将本文的规则枷锁套在身上前行，你会走得更慢，但是你能走得更远。所谓的性能问题，本质上大多源于你对手里的东西了解得还不够透彻。偏偏现代高级编程语言为了提高开发效率，用层层抽象屏蔽了大量底层细节。即使不了解这些内容，你也能写出正常运行的业务代码。哪怕是比 Go 更贴近底层的 C 语言，也通过抽象屏蔽了许多硬件细节，例如 CPU 乱序执行、流水线停顿、TLB Miss 和多核缓存一致性协议。当并发量骤升或数据规模暴涨时，这些被语言、框架和操作系统隐藏在... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/go-perf-optimize/">https://aoang.x2ox.com/2026/go-perf-optimize/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[囫囵吞枣之会计学]]></title>
            <link>https://aoang.x2ox.com/2026/accounting/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/accounting/</guid>
            <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[很多人第一次拿到一家公司的年报，会先翻到「净利润」那一行，然后决定这家公司赚钱还是亏钱。这个动作很自然，也很危险。一家企业可以利润很高，却没有足够现金发工资；可以账上现金很多，却是刚借来的钱；可以收入增长很快，却把大量货物压在仓库里；也可以连续几年亏损，却正在用今天的投入换取未来的规模。会计不是给企业贴一个「赚」或「亏」的标签，而是把一段复杂的经济活动翻译成可以核对、比较和追问的记录。会计学听起来像是借方、贷方、分录、折旧、摊销和一大堆表格。其实它先是在回答几个很朴素的问题：]]></description>
            <content:encoded><![CDATA[很多人第一次拿到一家公司的年报，会先翻到「净利润」那一行，然后决定这家公司赚钱还是亏钱。这个动作很自然，也很危险。一家企业可以利润很高，却没有足够现金发工资；可以账上现金很多，却是刚借来的钱；可以收入增长很快，却把大量货物压在仓库里；也可以连续几年亏损，却正在用今天的投入换取未来的规模。会计不是给企业贴一个「赚」或「亏」的标签，而是把一段复杂的经济活动翻译成可以核对、比较和追问的记录。会计学听起来像是借方、贷方、分录、折旧、摊销和一大堆表格。其实它先是在回答几个很朴素的问题：企业手里有什么？这些东西是谁的钱？这段时间卖了多少？为了卖出这些东西花了多少？钱真正有没有流进来？未来还有哪些义务必须偿... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/accounting/">https://aoang.x2ox.com/2026/accounting/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[囫囵吞枣之金融学]]></title>
            <link>https://aoang.x2ox.com/2026/finance/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/finance/</guid>
            <pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[金融学最容易被写成一本名词词典：货币、利率、股票、债券、基金、期权、杠杆、风险、收益，挨个解释一遍，读者似乎学到了很多，合上文章却不知道它们为什么会同时出现。问题不在于名词太多，而在于缺少一条主线。金融学研究的不是「钱怎样神秘地变多」，而是一个现实决策：谁现在有资金，谁现在需要资金；资金要在什么时候收回；如果未来出问题，损失由谁承担。这和经济学有联系，但重心不同。经济学更像一门解释资源配置、市场运行和宏观现象的理论学科；金融学则更像一套处理现实资金决策的应用学科。经济学会问：]]></description>
            <content:encoded><![CDATA[金融学最容易被写成一本名词词典：货币、利率、股票、债券、基金、期权、杠杆、风险、收益，挨个解释一遍，读者似乎学到了很多，合上文章却不知道它们为什么会同时出现。问题不在于名词太多，而在于缺少一条主线。金融学研究的不是「钱怎样神秘地变多」，而是一个现实决策：谁现在有资金，谁现在需要资金；资金要在什么时候收回；如果未来出问题，损失由谁承担。这和经济学有联系，但重心不同。经济学更像一门解释资源配置、市场运行和宏观现象的理论学科；金融学则更像一套处理现实资金决策的应用学科。经济学会问：「利率变化为什么影响投资？」金融学会进一步问：「这家企业要不要借这笔钱？借多少？用固定利率还是浮动利率？如果销售下降 3... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/finance/">https://aoang.x2ox.com/2026/finance/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[囫囵吞枣之微宏经济学]]></title>
            <link>https://aoang.x2ox.com/2026/micro-macro-economics/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/micro-macro-economics/</guid>
            <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[你可能没有上过经济学课，但每天都在做经济学题：要不要买贵一点的咖啡？要不要换工作？房租为什么涨？中央银行（简称央行）加息和自己的贷款有什么关系？一家公司明明赚钱，为什么还要裁员？一个国家的 GDP（国内生产总值）增长了，为什么很多人的体感却没有变好？这些问题看起来分属消费、就业、企业、政府和国际贸易，背后却有一条共同主线：有限的资源，如何被安排去满足尽可能多、而且彼此竞争的需要。 经济学研究的不是「怎样把钱变多」这一件事，而是人在约束下如何选择，选择如何通过市场和制度彼此影响]]></description>
            <content:encoded><![CDATA[你可能没有上过经济学课，但每天都在做经济学题：要不要买贵一点的咖啡？要不要换工作？房租为什么涨？中央银行（简称央行）加息和自己的贷款有什么关系？一家公司明明赚钱，为什么还要裁员？一个国家的 GDP（国内生产总值）增长了，为什么很多人的体感却没有变好？这些问题看起来分属消费、就业、企业、政府和国际贸易，背后却有一条共同主线：有限的资源，如何被安排去满足尽可能多、而且彼此竞争的需要。 经济学研究的不是「怎样把钱变多」这一件事，而是人在约束下如何选择，选择如何通过市场和制度彼此影响，以及这些选择最后怎样变成就业、价格、收入、增长和危机。这篇文章是一张地图，不是一份考试提纲。它会从最小的个人选择讲到最... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/micro-macro-economics/">https://aoang.x2ox.com/2026/micro-macro-economics/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[PostgreSQL 中那些 MySQL 没有的数据类型怎么玩]]></title>
            <link>https://aoang.x2ox.com/2026/postgresql-types/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/postgresql-types/</guid>
            <pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[很多人从 MySQL 切到 PostgreSQL，第一反应是：语法差不多，SELECT、JOIN、索引也差不多，应该很快就能上手。然后某天他打开 PostgreSQL 的类型文档，看见了数组、范围、多范围、复合类型、域、inet、tsvector 和一串几何类型，感觉像误入了数据库的后厨。这些东西到底有什么用？难道只是 PostgreSQL 把「一列只能放一个值」这条规矩也给折腾没了？先把标题里的话说严谨一点：下面有些类型是 MySQL 没有对应物，有些是 PostgreSQ]]></description>
            <content:encoded><![CDATA[很多人从 MySQL 切到 PostgreSQL，第一反应是：语法差不多，SELECT、JOIN、索引也差不多，应该很快就能上手。然后某天他打开 PostgreSQL 的类型文档，看见了数组、范围、多范围、复合类型、域、inet、tsvector 和一串几何类型，感觉像误入了数据库的后厨。这些东西到底有什么用？难道只是 PostgreSQL 把「一列只能放一个值」这条规矩也给折腾没了？先把标题里的话说严谨一点：下面有些类型是 MySQL 没有对应物，有些是 PostgreSQL 把同一个问题做得更深入，还有些只是 MySQL 也有、但使用方式完全不同。 JSON、ENUM 和空间类型不能算 P... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/postgresql-types/">https://aoang.x2ox.com/2026/postgresql-types/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[AI 模型的选择与应用：谁干杂活，谁啃硬骨头]]></title>
            <link>https://aoang.x2ox.com/2026/ai-model-selection/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/ai-model-selection/</guid>
            <pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[「你们现在用哪个模型？」这个问题我不太敢直接回答了。因为答案听起来像在敷衍：有的活给便宜模型，有的活给推理能力更强的模型，代码审查还要按风险升级，需求文档也有自己的分工。听的人多半觉得这是折腾，但真正跑过一段时间的人知道，这不是收藏模型，而是在控制账单和返工。团队刚把 AI 引入研发流程时，最容易走向两个极端：「哪个最强用哪个」，或者「哪个便宜用哪个」。前者会撞上账单，后者会撞上返工。更麻烦的是，模型价格不能只看输入单价：输出 token、上下文重复发送、缓存命中、工具调用、]]></description>
            <content:encoded><![CDATA[「你们现在用哪个模型？」这个问题我不太敢直接回答了。因为答案听起来像在敷衍：有的活给便宜模型，有的活给推理能力更强的模型，代码审查还要按风险升级，需求文档也有自己的分工。听的人多半觉得这是折腾，但真正跑过一段时间的人知道，这不是收藏模型，而是在控制账单和返工。团队刚把 AI 引入研发流程时，最容易走向两个极端：「哪个最强用哪个」，或者「哪个便宜用哪个」。前者会撞上账单，后者会撞上返工。更麻烦的是，模型价格不能只看输入单价：输出 token、上下文重复发送、缓存命中、工具调用、重试次数和服务渠道都会改写总成本。订阅套餐的月费，也不能直接拿来和 API 的按量价格比较。反过来也不行。让旗舰模型去写... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/ai-model-selection/">https://aoang.x2ox.com/2026/ai-model-selection/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[PostgreSQL WAL 预写日志]]></title>
            <link>https://aoang.x2ox.com/2026/postgresql-wal/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/postgresql-wal/</guid>
            <pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[很多人第一次接触 PostgreSQL WAL，会把它记成一句话：PostgreSQL 的 WAL 就是 MySQL 的 binlog。这句话很好理解，可惜不是一个正确的说法。要真正理解 WAL，不能从文件名、参数或复制命令开始。应该先问一个更朴素的问题：一笔事务已经向客户端返回 COMMIT 成功，但它修改过的数据页还没有写入磁盘；此时突然断电，数据库凭什么保证这笔数据不会消失？WAL 的原始目的就是回答这个问题。流复制、持续归档、PITR 和逻辑复制，都是从这条可靠的变更]]></description>
            <content:encoded><![CDATA[很多人第一次接触 PostgreSQL WAL，会把它记成一句话：PostgreSQL 的 WAL 就是 MySQL 的 binlog。这句话很好理解，可惜不是一个正确的说法。要真正理解 WAL，不能从文件名、参数或复制命令开始。应该先问一个更朴素的问题：一笔事务已经向客户端返回 COMMIT 成功，但它修改过的数据页还没有写入磁盘；此时突然断电，数据库凭什么保证这笔数据不会消失？WAL 的原始目的就是回答这个问题。流复制、持续归档、PITR 和逻辑复制，都是从这条可靠的变更历史上自然长出来的能力。理解这个顺序之后，PostgreSQL 的设计会很连贯；再回头看 MySQL 为什么同时有 re... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/postgresql-wal/">https://aoang.x2ox.com/2026/postgresql-wal/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[关于打磨产品的一些思考]]></title>
            <link>https://aoang.x2ox.com/2026/product-polish/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/product-polish/</guid>
            <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[一个产品怎样才算「打磨好了」？这个问题听起来像是在问圆角该用 8px 还是 12px，动画该持续 200ms 还是 300ms。可真正使用一个产品时，让人放弃的通常不是圆角不够圆，而是另一批更朴素的问题：不知道下一步该点哪里，表单填错后内容全部消失，弱网下按钮毫无反应，服务出了故障却没人说话，想导出自己的数据还得给客服写小作文。精致的视觉当然有价值，但它只是产品质量露在水面上的一小部分。水面下面还有需求边界、交互反馈、性能、可靠性、可访问性、技术债和发布机制。只抛光水面，产品]]></description>
            <content:encoded><![CDATA[一个产品怎样才算「打磨好了」？这个问题听起来像是在问圆角该用 8px 还是 12px，动画该持续 200ms 还是 300ms。可真正使用一个产品时，让人放弃的通常不是圆角不够圆，而是另一批更朴素的问题：不知道下一步该点哪里，表单填错后内容全部消失，弱网下按钮毫无反应，服务出了故障却没人说话，想导出自己的数据还得给客服写小作文。精致的视觉当然有价值，但它只是产品质量露在水面上的一小部分。水面下面还有需求边界、交互反馈、性能、可靠性、可访问性、技术债和发布机制。只抛光水面，产品就像一扇锃亮却推不开的门——远看挺高级，走近只想骂人。我对「打磨」的理解很简单：持续减少用户完成目标时遇到的不确定性、等... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/product-polish/">https://aoang.x2ox.com/2026/product-polish/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[AI 带来的变革：能力变便宜之后，什么会变得更贵？]]></title>
            <link>https://aoang.x2ox.com/2026/ai-change-brought/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/ai-change-brought/</guid>
            <pubDate>Sun, 31 May 2026 12:44:51 GMT</pubDate>
            <description><![CDATA[改革春风吹满地，世界人民真争气；齐心合力跨世纪，A 不 AI 没咋地。AI 有没有「咋地」，2026 年已经不太需要争论。写代码、做客服、整理资料、生成图片、分析合同、起草营销方案，许多原本需要专门软件或专门人员才能开始的工作，如今在一个对话框里就能得到像模像样的第一版。真正值得争论的是另一件事：当生成内容、调用知识和跨越专业门槛变得异常便宜，企业、职业与个人的价值会怎样重新分配？有人把 AI 当成新一代搜索框，有人把它描述成电子员工，还有人已经开始为「全面失业」倒计时。这些]]></description>
            <content:encoded><![CDATA[改革春风吹满地，世界人民真争气；齐心合力跨世纪，A 不 AI 没咋地。AI 有没有「咋地」，2026 年已经不太需要争论。写代码、做客服、整理资料、生成图片、分析合同、起草营销方案，许多原本需要专门软件或专门人员才能开始的工作，如今在一个对话框里就能得到像模像样的第一版。真正值得争论的是另一件事：当生成内容、调用知识和跨越专业门槛变得异常便宜，企业、职业与个人的价值会怎样重新分配？有人把 AI 当成新一代搜索框，有人把它描述成电子员工，还有人已经开始为「全面失业」倒计时。这些说法分别抓住了一部分现象，又都太急着宣布结局。技术能力、产品演示、真实生产率和组织变革之间隔着很长一段路。模型会写代码，... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/ai-change-brought/">https://aoang.x2ox.com/2026/ai-change-brought/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[sync.Mutex：抢人锁难]]></title>
            <link>https://aoang.x2ox.com/2026/go-sync-mutex/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/go-sync-mutex/</guid>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[sync.Mutex 看起来只有两个方法：Lock 和 Unlock。它的零值可以直接用，结构体也只有一个状态字段和一个信号量字段，于是很多人会把它当成一颗无害的螺丝：需要保护数据时拧上，结束时拧下。真正的故事要长得多。一次没有竞争的 Lock，可能只是对一个 32 位整数做 CAS；一次有竞争的 Lock，会先在 CPU 上短暂自旋，再进入 Go runtime 的信号量队列，必要时让 goroutine 休眠、唤醒并发生调度。这个状态还要在缓存一致性协议、编译器重排、Go]]></description>
            <content:encoded><![CDATA[sync.Mutex 看起来只有两个方法：Lock 和 Unlock。它的零值可以直接用，结构体也只有一个状态字段和一个信号量字段，于是很多人会把它当成一颗无害的螺丝：需要保护数据时拧上，结束时拧下。真正的故事要长得多。一次没有竞争的 Lock，可能只是对一个 32 位整数做 CAS；一次有竞争的 Lock，会先在 CPU 上短暂自旋，再进入 Go runtime 的信号量队列，必要时让 goroutine 休眠、唤醒并发生调度。这个状态还要在缓存一致性协议、编译器重排、Go 内存模型和业务临界区之间保持一致。我喜欢 sync.Mutex，因为它把复杂机制藏在了很小的 API 后面；我也警惕它... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/go-sync-mutex/">https://aoang.x2ox.com/2026/go-sync-mutex/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[Go 的舒适圈：它适合解决什么，又该把什么交给别人？]]></title>
            <link>https://aoang.x2ox.com/2026/go-comfort-zone/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2026/go-comfort-zone/</guid>
            <pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[每门语言都有舒适圈。Python 坐在数据和自动化旁边很自在，Java 走进大型企业系统像回自己家，C 靠近硬件时几乎不用换鞋。Go 的位置比较微妙：它没有 C 那样贴近机器，也没有 Java 那么丰富的应用框架，更没有 Python 在 AI 领域的库山库海，却在云基础设施、网络服务和命令行工具中反复出现。这不是因为 Go 在每项指标上都赢。恰恰相反，Go 的价值是把开发速度、运行效率、并发模型和部署成本放进同一张账单后，给出一个很难拒绝的中间值。 它的舒适圈位于「需要长期]]></description>
            <content:encoded><![CDATA[每门语言都有舒适圈。Python 坐在数据和自动化旁边很自在，Java 走进大型企业系统像回自己家，C 靠近硬件时几乎不用换鞋。Go 的位置比较微妙：它没有 C 那样贴近机器，也没有 Java 那么丰富的应用框架，更没有 Python 在 AI 领域的库山库海，却在云基础设施、网络服务和命令行工具中反复出现。这不是因为 Go 在每项指标上都赢。恰恰相反，Go 的价值是把开发速度、运行效率、并发模型和部署成本放进同一张账单后，给出一个很难拒绝的中间值。 它的舒适圈位于「需要长期运行、要处理大量 I/O、关心资源，却不值得支付手工内存管理成本」的区域。知道一门语言能做什么不难。真正有用的是知道它什... <br/><p>请前往 <a href="https://aoang.x2ox.com/2026/go-comfort-zone/">https://aoang.x2ox.com/2026/go-comfort-zone/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[代码审查指北]]></title>
            <link>https://aoang.x2ox.com/2025/code-review-guidelines/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2025/code-review-guidelines/</guid>
            <pubDate>Mon, 29 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[写代码的人，十有八九都干过一件事：把 PR 往群里一丢，然后祈祷「这次能一次过」。但代码审查 (Code Review) 从来不是走个过场。它是一套让代码库整体健康随时间改善的机制，Google 用它来维护代码和产品的质量。说到底，代码审查就是除作者之外的其他人，来检查这段代码的过程。为什么需要代码审查？先把它的价值说清楚，不然谁都懒得去做：尽早发现问题：在合并前抓住 Bug 和设计缺陷，此时修改成本最低知识共享：让至少另一个人熟悉这段代码，消除「巴士因子」提升代码质量：当人]]></description>
            <content:encoded><![CDATA[写代码的人，十有八九都干过一件事：把 PR 往群里一丢，然后祈祷「这次能一次过」。但代码审查 (Code Review) 从来不是走个过场。它是一套让代码库整体健康随时间改善的机制，Google 用它来维护代码和产品的质量。说到底，代码审查就是除作者之外的其他人，来检查这段代码的过程。为什么需要代码审查？先把它的价值说清楚，不然谁都懒得去做：尽早发现问题：在合并前抓住 Bug 和设计缺陷，此时修改成本最低知识共享：让至少另一个人熟悉这段代码，消除「巴士因子」提升代码质量：当人知道自己的代码会被读，往往会写得更好统一风格：靠人肉审查倒逼编码规范真正落地这里顺带解释一下「巴士因子」 (Bus Fa... <br/><p>请前往 <a href="https://aoang.x2ox.com/2025/code-review-guidelines/">https://aoang.x2ox.com/2025/code-review-guidelines/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[DNS 协议基础]]></title>
            <link>https://aoang.x2ox.com/2025/dns-base/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2025/dns-base/</guid>
            <pubDate>Fri, 26 Dec 2025 21:33:58 GMT</pubDate>
            <description><![CDATA[DNS 到底是个啥？一时间似乎没办法答上来，不是不知道，而是因为「DNS」这三个字母背后藏的东西太多了。它可以一句话讲完：DNS（域名系统，Domain Name System） 是互联网的电话簿，负责把人类好记的域名翻译成机器认识的 IP 地址。但真把它掰开揉碎，你会看到一套分布式数据库的经典设计、一段被 512 字节逼出来的精巧编码、一个与互联网同龄的故事，还有那个流传了二十多年、至今仍被追问的问题：根服务器为什么偏偏只有 13 台？一、DNS 是什么：从 HOSTS.T]]></description>
            <content:encoded><![CDATA[DNS 到底是个啥？一时间似乎没办法答上来，不是不知道，而是因为「DNS」这三个字母背后藏的东西太多了。它可以一句话讲完：DNS（域名系统，Domain Name System） 是互联网的电话簿，负责把人类好记的域名翻译成机器认识的 IP 地址。但真把它掰开揉碎，你会看到一套分布式数据库的经典设计、一段被 512 字节逼出来的精巧编码、一个与互联网同龄的故事，还有那个流传了二十多年、至今仍被追问的问题：根服务器为什么偏偏只有 13 台？一、DNS 是什么：从 HOSTS.TXT 到分布式电话簿电话簿这个比喻大家都熟：你不需要记住 142.250.66.110 这种数字，只需要记住 googl... <br/><p>请前往 <a href="https://aoang.x2ox.com/2025/dns-base/">https://aoang.x2ox.com/2025/dns-base/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[PostgreSQL 参数介绍与调优]]></title>
            <link>https://aoang.x2ox.com/2025/postgresql-configuration-tuning/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2025/postgresql-configuration-tuning/</guid>
            <pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[PostgreSQL 调优最像什么？我觉得像给一个正在发烧的人调空调：温度计都没看，先把旋钮从 26°C 拧到 16°C，动作很果断，病因却可能毫无变化。网上流传着许多「生产环境必改参数」：shared_buffers 设为内存的四分之一，work_mem 往大了加，机械盘把 random_page_cost 保持在 4.0，SSD 就改成 1.1。这些建议并非全错，但一脱离工作负载、并发数、存储、数据规模和可接受的恢复时间，就只剩下一串看似专业的数字。数据库调优不是寻找一份]]></description>
            <content:encoded><![CDATA[PostgreSQL 调优最像什么？我觉得像给一个正在发烧的人调空调：温度计都没看，先把旋钮从 26°C 拧到 16°C，动作很果断，病因却可能毫无变化。网上流传着许多「生产环境必改参数」：shared_buffers 设为内存的四分之一，work_mem 往大了加，机械盘把 random_page_cost 保持在 4.0，SSD 就改成 1.1。这些建议并非全错，但一脱离工作负载、并发数、存储、数据规模和可接受的恢复时间，就只剩下一串看似专业的数字。数据库调优不是寻找一份神奇配置，而是用观测证明瓶颈在哪里，再用最小的改动换取可验证的改善。 参数只是工具。慢查询可能缺索引，也可能是统计信息过... <br/><p>请前往 <a href="https://aoang.x2ox.com/2025/postgresql-configuration-tuning/">https://aoang.x2ox.com/2025/postgresql-configuration-tuning/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[Vue 与 React：从设计入门到复杂工程的取舍]]></title>
            <link>https://aoang.x2ox.com/2025/vue-vs-react/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2025/vue-vs-react/</guid>
            <pubDate>Sun, 12 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Vue 和 React 到底该选哪个？这个问题像「咖啡和茶谁更好」一样常见，也一样容易吵歪。有人拿下载量当选票，有人拿跑分当判决书，还有人把自己最熟悉的那套写法包装成架构真理。最后框架还没选，会议先开了两天。先说结论：Vue 更像一套经过编排的前端应用方案，React 更像一组围绕 JavaScript 建立的 UI 原语。 前者给出较连续的学习路径与较统一的常规答案，后者保留更多组合空间，也要求团队承担更多选择。Vue 的约束让常见业务更快形成统一写法，但我个人更偏爱 Re]]></description>
            <content:encoded><![CDATA[Vue 和 React 到底该选哪个？这个问题像「咖啡和茶谁更好」一样常见，也一样容易吵歪。有人拿下载量当选票，有人拿跑分当判决书，还有人把自己最熟悉的那套写法包装成架构真理。最后框架还没选，会议先开了两天。先说结论：Vue 更像一套经过编排的前端应用方案，React 更像一组围绕 JavaScript 建立的 UI 原语。 前者给出较连续的学习路径与较统一的常规答案，后者保留更多组合空间，也要求团队承担更多选择。Vue 的约束让常见业务更快形成统一写法，但我个人更偏爱 React 的自由：愿意多做一些基础封装，换取在组件组合、数据流和工程边界上的更大空间。复杂项目能否成功，最终取决于边界、数... <br/><p>请前往 <a href="https://aoang.x2ox.com/2025/vue-vs-react/">https://aoang.x2ox.com/2025/vue-vs-react/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[软件依赖管理：省下代码之后，代价才刚刚开始]]></title>
            <link>https://aoang.x2ox.com/2025/dependency-management/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2025/dependency-management/</guid>
            <pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[你有没有见过这样的代码审查？某位同事为了在 Go 服务里把字节数格式化成 64 GB，执行了一次 go get。业务代码只多出一行 import，看起来人畜无害。可等 go.mod 和 go.sum 提交上来，模块图里又多出十几个谁也没审查过的间接依赖。你问他为什么，他会很无辜地回答：「现成的轮子不用，难道还要自己造吗？」话是没错。依赖当然可以省下开发时间，可咱也不能只看眼前少写了几行代码，却不看项目从此背上了什么。现代后端几乎不可能摆脱依赖。Web 框架、数据库驱动、日志组]]></description>
            <content:encoded><![CDATA[你有没有见过这样的代码审查？某位同事为了在 Go 服务里把字节数格式化成 64 GB，执行了一次 go get。业务代码只多出一行 import，看起来人畜无害。可等 go.mod 和 go.sum 提交上来，模块图里又多出十几个谁也没审查过的间接依赖。你问他为什么，他会很无辜地回答：「现成的轮子不用，难道还要自己造吗？」话是没错。依赖当然可以省下开发时间，可咱也不能只看眼前少写了几行代码，却不看项目从此背上了什么。现代后端几乎不可能摆脱依赖。Web 框架、数据库驱动、日志组件、RPC、配置中心、指标采集，哪一样都不是凭空长出来的。开源生态让我们站在巨人的肩膀上，只是巨人下面还站着另一个巨人，... <br/><p>请前往 <a href="https://aoang.x2ox.com/2025/dependency-management/">https://aoang.x2ox.com/2025/dependency-management/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[从 Redis 到 Dragonfly]]></title>
            <link>https://aoang.x2ox.com/2025/dragonfly/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2025/dragonfly/</guid>
            <pubDate>Sun, 31 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[把 Dragonfly 说成「多线程版 Redis」，就像把 PostgreSQL 说成「支持 SQL 的文件系统」：不能算完全错误，但几乎解释不了任何工程现象。Redis 的核心优势并不只是快，而是把复杂的数据结构、事务语义和网络并发压进一条可预测的串行执行流。十几年里，大量客户端、运维工具、故障处理流程和业务假设都围绕这条执行流生长。Dragonfly 则从另一个前提出发：现代云服务器有几十个 CPU 核、数百 GB 内存和高速网卡，如果命令最终仍在一个主线程上排队，那么]]></description>
            <content:encoded><![CDATA[把 Dragonfly 说成「多线程版 Redis」，就像把 PostgreSQL 说成「支持 SQL 的文件系统」：不能算完全错误，但几乎解释不了任何工程现象。Redis 的核心优势并不只是快，而是把复杂的数据结构、事务语义和网络并发压进一条可预测的串行执行流。十几年里，大量客户端、运维工具、故障处理流程和业务假设都围绕这条执行流生长。Dragonfly 则从另一个前提出发：现代云服务器有几十个 CPU 核、数百 GB 内存和高速网卡，如果命令最终仍在一个主线程上排队，那么纵向扩容买来的大部分计算资源没有进入数据路径。于是两者真正的分歧不是 C 与 C++，也不是 epoll 与 io_ur... <br/><p>请前往 <a href="https://aoang.x2ox.com/2025/dragonfly/">https://aoang.x2ox.com/2025/dragonfly/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[Go map：从 hmap 到 Swiss Table]]></title>
            <link>https://aoang.x2ox.com/2025/go-map/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2025/go-map/</guid>
            <pubDate>Sun, 16 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Go 的 map 太常用了，以至于很多人不再把它当作数据结构。写一行 m[key]，编译器和 runtime 就替我们完成了哈希、探测、比较、扩容和内存管理。代码很短，代价却不短。更麻烦的是，网上关于 Go map 的文章经常混着两个时代：Go 1.23 及以前的 hmap、bucket、overflow bucket；Go 1.24 起默认启用的 Swiss Table、group、control word、table 和目录。两套实现都服务于同一个语言语义，但底层路线已经]]></description>
            <content:encoded><![CDATA[Go 的 map 太常用了，以至于很多人不再把它当作数据结构。写一行 m[key]，编译器和 runtime 就替我们完成了哈希、探测、比较、扩容和内存管理。代码很短，代价却不短。更麻烦的是，网上关于 Go map 的文章经常混着两个时代：Go 1.23 及以前的 hmap、bucket、overflow bucket；Go 1.24 起默认启用的 Swiss Table、group、control word、table 和目录。两套实现都服务于同一个语言语义，但底层路线已经不同。继续拿旧图解释新 runtime，像拿老城区地图导航新机场：方向可能差不多，出口一定会错。本文先讲 map 作为语... <br/><p>请前往 <a href="https://aoang.x2ox.com/2025/go-map/">https://aoang.x2ox.com/2025/go-map/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[社会工程学之身份欺诈]]></title>
            <link>https://aoang.x2ox.com/2024/se-identity-fraud/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2024/se-identity-fraud/</guid>
            <pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[冬天来了，万物凋零。又到了坏人们泛滥的季节，城市的乌烟瘴气中蕴含着难以形容的善意与陷阱。对于游泳爱好者而言，冬天的去处是一个值得研究的课题。很多普通健身房的泳池因为维护成本与客流不成比例，纷纷选择关闭；剩下那些苦苦支撑的，往往基础设施糟糕——从更衣室出来到下水的那段路，足以让你冻得发抖。于是，目光自然转向了酒店泳池。设施完备、水温恒定、体验极佳。唯一的缺点是：贵。这里存在一个有趣的年卡悖论：高端酒店泳池年卡价格动辄近五位数，按 8,000 元计算。若每周去一次，一年约 52 ]]></description>
            <content:encoded><![CDATA[冬天来了，万物凋零。又到了坏人们泛滥的季节，城市的乌烟瘴气中蕴含着难以形容的善意与陷阱。对于游泳爱好者而言，冬天的去处是一个值得研究的课题。很多普通健身房的泳池因为维护成本与客流不成比例，纷纷选择关闭；剩下那些苦苦支撑的，往往基础设施糟糕——从更衣室出来到下水的那段路，足以让你冻得发抖。于是，目光自然转向了酒店泳池。设施完备、水温恒定、体验极佳。唯一的缺点是：贵。这里存在一个有趣的年卡悖论：高端酒店泳池年卡价格动辄近五位数，按 8,000 元计算。若每周去一次，一年约 52 次，单次成本高达 150+ 元。对比普通泳馆 50 元的单价，甚至酒店自身的次卡 120 元的价格，年卡在低频使用下极不... <br/><p>请前往 <a href="https://aoang.x2ox.com/2024/se-identity-fraud/">https://aoang.x2ox.com/2024/se-identity-fraud/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>弃如弁髦</category>
        </item>
        <item>
            <title><![CDATA[换行符 CRLF 的历史与演变]]></title>
            <link>https://aoang.x2ox.com/2024/ascii-crlf/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2024/ascii-crlf/</guid>
            <pubDate>Wed, 11 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[我们每天都在使用文本文件。它的换行看似简单，背后却隐藏着一段跨越百年的通信和计算机历史。从早期的电报机到现代的网络协议，一个看似微不足道的字符组合 CRLF（回车和换行）是如何塑造我们数字世界的？本文将深入探讨换行符的起源、不同操作系统的选择，以及为什么一个简单的文本文件在不同系统间打开会变乱。字符基础：ASCII 与换行符的身份要理解换行，首先要从 ASCII（美国标准信息交换码）字符集说起。ASCII 是基于拉丁字母的编码标准，最初为电报码设计，共定义了 128 个字符。]]></description>
            <content:encoded><![CDATA[我们每天都在使用文本文件。它的换行看似简单，背后却隐藏着一段跨越百年的通信和计算机历史。从早期的电报机到现代的网络协议，一个看似微不足道的字符组合 CRLF（回车和换行）是如何塑造我们数字世界的？本文将深入探讨换行符的起源、不同操作系统的选择，以及为什么一个简单的文本文件在不同系统间打开会变乱。字符基础：ASCII 与换行符的身份要理解换行，首先要从 ASCII（美国标准信息交换码）字符集说起。ASCII 是基于拉丁字母的编码标准，最初为电报码设计，共定义了 128 个字符。其中，除了我们熟悉的字母、数字和标点符号外，还包括了 33 个 控制字符 「不可见字符」。在这些控制字符中，有两个关键的... <br/><p>请前往 <a href="https://aoang.x2ox.com/2024/ascii-crlf/">https://aoang.x2ox.com/2024/ascii-crlf/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[译：简单性]]></title>
            <link>https://aoang.x2ox.com/2024/simplicity/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2024/simplicity/</guid>
            <pubDate>Tue, 01 Oct 2024 10:59:22 GMT</pubDate>
            <description><![CDATA[在 2009 年 5 月，Google 举办了一场内部的「设计巫术（Design Wizardry）」小组讨论会，演讲者有我和 Jeff Dean、Mike Burrows、Paul Haahr、Alfred Spector、Bill Coughran。以下是略加编辑的我的演讲记录。尽管一些细节已经过时，但在今时今日，核心主旨可能比那时候更显重要。简单胜于复杂越简单的东西就越容易理解，也就更容易构建、调试和维护。容易理解是最重要的，无法理解就无法进行其他任何后续步骤。看看 g]]></description>
            <content:encoded><![CDATA[在 2009 年 5 月，Google 举办了一场内部的「设计巫术（Design Wizardry）」小组讨论会，演讲者有我和 Jeff Dean、Mike Burrows、Paul Haahr、Alfred Spector、Bill Coughran。以下是略加编辑的我的演讲记录。尽管一些细节已经过时，但在今时今日，核心主旨可能比那时候更显重要。简单胜于复杂越简单的东西就越容易理解，也就更容易构建、调试和维护。容易理解是最重要的，无法理解就无法进行其他任何后续步骤。看看 google.com 的网页，只有一个文本框，输入查询内容，获取结果。这个设计非常简洁，也是 Google 成功的主要原因... <br/><p>请前往 <a href="https://aoang.x2ox.com/2024/simplicity/">https://aoang.x2ox.com/2024/simplicity/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[HTTP/3 与 QUIC：换掉 TCP 之后，网络真的更快了吗？]]></title>
            <link>https://aoang.x2ox.com/2024/http3-and-quic/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2024/http3-and-quic/</guid>
            <pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[HTTP/3 最容易被说成一句话：「HTTP 改用 UDP，所以更快。」这句话不能说完全错，毕竟 HTTP/3 的确运行在基于 UDP 的 QUIC 之上；可它省略的部分，恰好比留下来的更多。UDP 没有可靠传输、拥塞控制、连接状态和加密。倘若只把 TCP 删掉，再把 HTTP 报文扔进 UDP 数据报，得到的不会是下一代 Web，而是一台更快丢数据的机器。真正承担工作的，是 QUIC。它在用户空间重新提供可靠传输、流量控制、拥塞控制、丢包恢复和连接管理，把 TLS 1.3 ]]></description>
            <content:encoded><![CDATA[HTTP/3 最容易被说成一句话：「HTTP 改用 UDP，所以更快。」这句话不能说完全错，毕竟 HTTP/3 的确运行在基于 UDP 的 QUIC 之上；可它省略的部分，恰好比留下来的更多。UDP 没有可靠传输、拥塞控制、连接状态和加密。倘若只把 TCP 删掉，再把 HTTP 报文扔进 UDP 数据报，得到的不会是下一代 Web，而是一台更快丢数据的机器。真正承担工作的，是 QUIC。它在用户空间重新提供可靠传输、流量控制、拥塞控制、丢包恢复和连接管理，把 TLS 1.3 紧密地纳入握手，并用彼此独立的流承载应用数据。HTTP/3 则定义如何在 QUIC 之上表达 HTTP 语义。所以问题不... <br/><p>请前往 <a href="https://aoang.x2ox.com/2024/http3-and-quic/">https://aoang.x2ox.com/2024/http3-and-quic/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[博客重构]]></title>
            <link>https://aoang.x2ox.com/2024/blog-refactor/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2024/blog-refactor/</guid>
            <pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[一次从 Hexo 到 Next.js 的重构，用现代前端工程化的复杂性，换取了未来的低维护性、高性能和可扩展性。Next.js SSG + @content-collections + Cloudflare Pages 的组合，最终实现了在此前所期望的理想状态：将精力从折腾系统转移到内容输出上来。一、从 Hexo 到 Next.js：拥抱现代 SSG在 2017 年的博文中提到，博客的构建始终在「安装、配置、自定义、折腾、放弃」的循环中。在经历了 WordPress、Type]]></description>
            <content:encoded><![CDATA[一次从 Hexo 到 Next.js 的重构，用现代前端工程化的复杂性，换取了未来的低维护性、高性能和可扩展性。Next.js SSG + @content-collections + Cloudflare Pages 的组合，最终实现了在此前所期望的理想状态：将精力从折腾系统转移到内容输出上来。一、从 Hexo 到 Next.js：拥抱现代 SSG在 2017 年的博文中提到，博客的构建始终在「安装、配置、自定义、折腾、放弃」的循环中。在经历了 WordPress、Typecho 等动态系统，以及 GitHub Issues 等半成品方案后，我于 2019 年回归了 Hexo，选择了当时生态... <br/><p>请前往 <a href="https://aoang.x2ox.com/2024/blog-refactor/">https://aoang.x2ox.com/2024/blog-refactor/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[Go 的 Goroutine 与协程]]></title>
            <link>https://aoang.x2ox.com/2024/go-goroutine-and-coroutine/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2024/go-goroutine-and-coroutine/</guid>
            <pubDate>Sun, 04 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[很多文章把协程解释成「比线程轻的东西」，把 async/await 解释成「暂停一下再继续」，再把 go func() 解释成「启动一个异步任务」。这些说法不能算错，但它们没有回答最关键的问题：到底保存了什么上下文，谁负责保存，谁决定什么时候恢复？如果不回答这个问题，进程、线程、协程、goroutine、异步函数就会变成一串互相替换的术语。更麻烦的是，go func() 和 await 看起来都像是在控制执行权，却其实做着完全不同的事情。本文的主线只有一句话：go func(]]></description>
            <content:encoded><![CDATA[很多文章把协程解释成「比线程轻的东西」，把 async/await 解释成「暂停一下再继续」，再把 go func() 解释成「启动一个异步任务」。这些说法不能算错，但它们没有回答最关键的问题：到底保存了什么上下文，谁负责保存，谁决定什么时候恢复？如果不回答这个问题，进程、线程、协程、goroutine、异步函数就会变成一串互相替换的术语。更麻烦的是，go func() 和 await 看起来都像是在控制执行权，却其实做着完全不同的事情。本文的主线只有一句话：go func() 是 spawn，负责生成一个新的并发执行单元；await 是 suspend，负责保存当前异步计算的后续 conti... <br/><p>请前往 <a href="https://aoang.x2ox.com/2024/go-goroutine-and-coroutine/">https://aoang.x2ox.com/2024/go-goroutine-and-coroutine/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[如何管理项目中的 Protobuf]]></title>
            <link>https://aoang.x2ox.com/2023/protobuf-management/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2023/protobuf-management/</guid>
            <pubDate>Fri, 21 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[后端从单体切到微服务之后，很多团队会发现一件尴尬的事：业务代码分得清清楚楚，服务边界画得明明白白，可那份被所有服务共同引用的 .proto 文件，却成了没人说得清该归谁管的东西。「Proto 代码到底放哪里？」是社区里反复出现的经典讨论，也是一个存在已久的老问题。各方答案大致归成五类，每一轮讨论都吵得不可开交——有说放业务仓库里的，有说必须独立仓库的，还有说干脆搞个集中仓库一劳永逸的。争论多年，答案并没有收敛，但问题的外延却悄悄变大了：存放位置只是 proto 管理的一个切面]]></description>
            <content:encoded><![CDATA[后端从单体切到微服务之后，很多团队会发现一件尴尬的事：业务代码分得清清楚楚，服务边界画得明明白白，可那份被所有服务共同引用的 .proto 文件，却成了没人说得清该归谁管的东西。「Proto 代码到底放哪里？」是社区里反复出现的经典讨论，也是一个存在已久的老问题。各方答案大致归成五类，每一轮讨论都吵得不可开交——有说放业务仓库里的，有说必须独立仓库的，还有说干脆搞个集中仓库一劳永逸的。争论多年，答案并没有收敛，但问题的外延却悄悄变大了：存放位置只是 proto 管理的一个切面，围绕它还长出了版本兼容、工具链、代码生成、CI 治理一整条链路。这篇文章想把这些串起来讲一遍：proto 为什么难管、... <br/><p>请前往 <a href="https://aoang.x2ox.com/2023/protobuf-management/">https://aoang.x2ox.com/2023/protobuf-management/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[源代码托管怎么选：Gerrit、GitLab、GitHub 与 Gitea]]></title>
            <link>https://aoang.x2ox.com/2023/source-code-hosting-comparison/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2023/source-code-hosting-comparison/</guid>
            <pubDate>Wed, 05 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[源代码托管平台看起来都差不多：建仓库、提变更、跑流水线、开 Issue。于是选型很容易变成截图对比：谁的功能更多、界面更新、免费额度更大。等真正迁移，才发现 Git 仓库只是最容易搬走的那一层，代码审查记录、流水线、权限、制品、机器人和团队习惯早已长在平台里面。Gerrit、GitLab、GitHub 和 Gitea 的根本区别，不是四套网页皮肤，而是四种协作模型：Gerrit 把严格审查当作提交代码的入口，GitLab 把仓库放进一体化 DevSecOps 平台，GitHu]]></description>
            <content:encoded><![CDATA[源代码托管平台看起来都差不多：建仓库、提变更、跑流水线、开 Issue。于是选型很容易变成截图对比：谁的功能更多、界面更新、免费额度更大。等真正迁移，才发现 Git 仓库只是最容易搬走的那一层，代码审查记录、流水线、权限、制品、机器人和团队习惯早已长在平台里面。Gerrit、GitLab、GitHub 和 Gitea 的根本区别，不是四套网页皮肤，而是四种协作模型：Gerrit 把严格审查当作提交代码的入口，GitLab 把仓库放进一体化 DevSecOps 平台，GitHub 把代码放进公开协作网络，Gitea 则把轻量自托管与控制权放在前面。所以我不会先问「谁最好」，而会先问：代码能否放在... <br/><p>请前往 <a href="https://aoang.x2ox.com/2023/source-code-hosting-comparison/">https://aoang.x2ox.com/2023/source-code-hosting-comparison/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[关于微服务和单体的一些思考]]></title>
            <link>https://aoang.x2ox.com/2023/microservices-vs-monolith/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2023/microservices-vs-monolith/</guid>
            <pubDate>Fri, 03 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[一个系统有 30 个服务，它就比一个单体先进吗？未必。它也可能只是把原来一次函数调用能完成的事情，改成了 30 个进程互相发请求，再配上一套 Kubernetes、一条消息队列、三种数据库和一群半夜被告警叫醒的人。服务数量确实上去了，业务价值却不会因此自动上涨。微服务最容易被误解成一种代码组织方式：文件多了就拆仓库，类多了就拆服务，团队大了就上容器。其实它首先是部署边界、数据所有权和团队责任的重新划分。一刀切下去，切开的不只是代码，还包括事务、故障、版本、监控与值班责任。边界]]></description>
            <content:encoded><![CDATA[一个系统有 30 个服务，它就比一个单体先进吗？未必。它也可能只是把原来一次函数调用能完成的事情，改成了 30 个进程互相发请求，再配上一套 Kubernetes、一条消息队列、三种数据库和一群半夜被告警叫醒的人。服务数量确实上去了，业务价值却不会因此自动上涨。微服务最容易被误解成一种代码组织方式：文件多了就拆仓库，类多了就拆服务，团队大了就上容器。其实它首先是部署边界、数据所有权和团队责任的重新划分。一刀切下去，切开的不只是代码，还包括事务、故障、版本、监控与值班责任。边界画对了，团队能够独立交付；边界画错了，原本藏在进程里的耦合就搬到网络上，顺便获得超时、重试和部分失败等新技能。单体也不等... <br/><p>请前往 <a href="https://aoang.x2ox.com/2023/microservices-vs-monolith/">https://aoang.x2ox.com/2023/microservices-vs-monolith/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[简述 TCP/IP：从一个数据包说起]]></title>
            <link>https://aoang.x2ox.com/2022/tcp-ip-overview/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2022/tcp-ip-overview/</guid>
            <pubDate>Fri, 01 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[打开浏览器，输入一个网址，页面很快出现在眼前。这件事熟悉得近乎无聊，但若继续追问，问题马上就多了起来：电脑怎么知道服务器在哪？数据为什么没有走错门？跨过 Wi-Fi、光猫、运营商和海底光缆之后，对方又如何确认内容没有缺斤少两？很多回答会祭出一张 OSI 七层模型图，再从物理层一路背到应用层。图当然没错，只是背完之后，人仍然可能解释不了一个更实在的问题：当网络会丢包、乱序、重复、限速甚至中断时，TCP/IP 到底替应用做了什么，又故意没做什么？先给出一个不太严谨但好用的答案：I]]></description>
            <content:encoded><![CDATA[打开浏览器，输入一个网址，页面很快出现在眼前。这件事熟悉得近乎无聊，但若继续追问，问题马上就多了起来：电脑怎么知道服务器在哪？数据为什么没有走错门？跨过 Wi-Fi、光猫、运营商和海底光缆之后，对方又如何确认内容没有缺斤少两？很多回答会祭出一张 OSI 七层模型图，再从物理层一路背到应用层。图当然没错，只是背完之后，人仍然可能解释不了一个更实在的问题：当网络会丢包、乱序、重复、限速甚至中断时，TCP/IP 到底替应用做了什么，又故意没做什么？先给出一个不太严谨但好用的答案：IP 负责把一个个数据报尽力送到目的主机，TCP 或 UDP 负责让主机上的具体应用交换数据。IP 像跨城物流网络，只认地... <br/><p>请前往 <a href="https://aoang.x2ox.com/2022/tcp-ip-overview/">https://aoang.x2ox.com/2022/tcp-ip-overview/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[程序是怎么运行的]]></title>
            <link>https://aoang.x2ox.com/2022/how-programs-run/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2022/how-programs-run/</guid>
            <pubDate>Fri, 04 Feb 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[程序是怎么运行的？这个问题听上去像是计算机组成原理课的第一道题，答案通常也很像课本：编译器把源代码翻译成机器码，操作系统把程序加载到内存，CPU 执行它。没错，但这句话把最有意思的部分全部压扁了。操作系统为什么能同时运行浏览器、音乐播放器和终端？CPU 明明一次只能执行一条指令，所谓「同时」是怎么来的？一个普通程序为什么不能随便读取别的程序的内存？printf 最后又是怎么把字符送到屏幕上的？当我们在终端输入 ./hello 时，操作系统究竟做了什么？说到底，计算机并没有我们]]></description>
            <content:encoded><![CDATA[程序是怎么运行的？这个问题听上去像是计算机组成原理课的第一道题，答案通常也很像课本：编译器把源代码翻译成机器码，操作系统把程序加载到内存，CPU 执行它。没错，但这句话把最有意思的部分全部压扁了。操作系统为什么能同时运行浏览器、音乐播放器和终端？CPU 明明一次只能执行一条指令，所谓「同时」是怎么来的？一个普通程序为什么不能随便读取别的程序的内存？printf 最后又是怎么把字符送到屏幕上的？当我们在终端输入 ./hello 时，操作系统究竟做了什么？说到底，计算机并没有我们想象中那么聪明。CPU 只是在内存里找到下一条指令，执行它，再找到下一条。 进程、用户态、系统调用、虚拟内存、ELF、动... <br/><p>请前往 <a href="https://aoang.x2ox.com/2022/how-programs-run/">https://aoang.x2ox.com/2022/how-programs-run/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[茅屋为秋风所破歌]]></title>
            <link>https://aoang.x2ox.com/2021/unknown-mistake/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2021/unknown-mistake/</guid>
            <pubDate>Thu, 10 Jun 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[八月秋高风怒号，卷我屋上三重茅。茅飞渡江洒江郊，高者挂罥长林梢，下者飘转沉塘坳。南村群童欺我老无力，忍能对面为盗贼。公然抱茅入竹去，唇焦口燥呼不得，归来倚杖自叹息。俄顷风定云墨色，秋天漠漠向昏黑。布衾多年冷似铁，娇儿恶卧踏里裂。床头屋漏无干处，雨脚如麻未断绝。自经丧乱少睡眠，长夜沾湿何由彻！安得广厦千万间，大庇天下寒士俱欢颜，风雨不动安如山。呜呼！何时眼前突兀见此屋，吾庐独破受冻死亦足！]]></description>
            <content:encoded><![CDATA[八月秋高风怒号，卷我屋上三重茅。茅飞渡江洒江郊，高者挂罥长林梢，下者飘转沉塘坳。南村群童欺我老无力，忍能对面为盗贼。公然抱茅入竹去，唇焦口燥呼不得，归来倚杖自叹息。俄顷风定云墨色，秋天漠漠向昏黑。布衾多年冷似铁，娇儿恶卧踏里裂。床头屋漏无干处，雨脚如麻未断绝。自经丧乱少睡眠，长夜沾湿何由彻！安得广厦千万间，大庇天下寒士俱欢颜，风雨不动安如山。呜呼！何时眼前突兀见此屋，吾庐独破受冻死亦足！... <br/><p>请前往 <a href="https://aoang.x2ox.com/2021/unknown-mistake/">https://aoang.x2ox.com/2021/unknown-mistake/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[深入 Go 的 net/http]]></title>
            <link>https://aoang.x2ox.com/2021/go-net-http-source/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2021/go-net-http-source/</guid>
            <pubDate>Tue, 06 Apr 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[net/http 的 API 使用非常简单，但一次请求仍要经过连接获取、并发读写、Body 回收、超时与取消。沿着客户端和服务端的源码调用链读下去，才能准确解释连接为何没有复用、超时发生在哪一层，以及 Handler 返回后还有哪些工作没有结束。使用 Go 启动一个 HTTP 服务又或者作为客户端进行调用，都只需要几行代码：http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {    f]]></description>
            <content:encoded><![CDATA[net/http 的 API 使用非常简单，但一次请求仍要经过连接获取、并发读写、Body 回收、超时与取消。沿着客户端和服务端的源码调用链读下去，才能准确解释连接为何没有复用、超时发生在哪一层，以及 Handler 返回后还有哪些工作没有结束。使用 Go 启动一个 HTTP 服务又或者作为客户端进行调用，都只需要几行代码：http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {    fmt.Fprintln(w, "hello")})log.Fatal(http.ListenAndServe(":808... <br/><p>请前往 <a href="https://aoang.x2ox.com/2021/go-net-http-source/">https://aoang.x2ox.com/2021/go-net-http-source/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[Go Slice 奇技淫巧]]></title>
            <link>https://aoang.x2ox.com/2021/go-slice-tricks/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2021/go-slice-tricks/</guid>
            <pubDate>Fri, 19 Mar 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Go 的切片 (slice) 很容易学：len 是长度，cap 是容量，不够就 append。这三句话足够写完大多数业务代码，也足够埋下不少只有在线上才肯露头的问题。把一个切片赋值给另一个变量，改其中一个，另一个为什么也会变？同样是 append，为什么有时修改原数据，有时又像复制了一份？从大文件中只截取十几个字节，为什么几百 MB 内存还没有释放？两个看起来内容完全相同的空切片，为什么一个等于 nil，一个却不等于？[]byte(string) 是否一定分配？能不能把字符串]]></description>
            <content:encoded><![CDATA[Go 的切片 (slice) 很容易学：len 是长度，cap 是容量，不够就 append。这三句话足够写完大多数业务代码，也足够埋下不少只有在线上才肯露头的问题。把一个切片赋值给另一个变量，改其中一个，另一个为什么也会变？同样是 append，为什么有时修改原数据，有时又像复制了一份？从大文件中只截取十几个字节，为什么几百 MB 内存还没有释放？两个看起来内容完全相同的空切片，为什么一个等于 nil，一个却不等于？[]byte(string) 是否一定分配？能不能把字符串「零拷贝」转成字节切片？本文内容早已过时，考古请参考 Go 1.16一、切片不是数组runtime 内部用下面这个结构表... <br/><p>请前往 <a href="https://aoang.x2ox.com/2021/go-slice-tricks/">https://aoang.x2ox.com/2021/go-slice-tricks/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[博弈论：死君子不死小人]]></title>
            <link>https://aoang.x2ox.com/2021/game-theory/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2021/game-theory/</guid>
            <pubDate>Sun, 03 Jan 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[你准备把商品价格降到 99 元，竞争对手会不会降到 98 元？你想在会议上提出一个方案，同事会支持，还是等你先承担风险？两个国家都知道减排对人类有利，为什么仍然可能互相观望？平台要不要给商家更低抽成，银行要不要提高存款利率，员工要不要主动分享信息——这些问题有一个共同特点：你的结果不仅取决于你做什么，还取决于别人认为你会做什么。这就是博弈论（Game Theory）关心的世界。博弈论不是「教你如何算计别人」的厚黑学，也不是把人生所有选择都变成一张收益表。它是一套分析战略互动的]]></description>
            <content:encoded><![CDATA[你准备把商品价格降到 99 元，竞争对手会不会降到 98 元？你想在会议上提出一个方案，同事会支持，还是等你先承担风险？两个国家都知道减排对人类有利，为什么仍然可能互相观望？平台要不要给商家更低抽成，银行要不要提高存款利率，员工要不要主动分享信息——这些问题有一个共同特点：你的结果不仅取决于你做什么，还取决于别人认为你会做什么。这就是博弈论（Game Theory）关心的世界。博弈论不是「教你如何算计别人」的厚黑学，也不是把人生所有选择都变成一张收益表。它是一套分析战略互动的工具：当多个参与者的决策彼此影响时，怎样描述行动、信息、承诺、信任、威胁和结果？经济学用它理解企业竞争、价格战、拍卖、谈... <br/><p>请前往 <a href="https://aoang.x2ox.com/2021/game-theory/">https://aoang.x2ox.com/2021/game-theory/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[2020 年总结]]></title>
            <link>https://aoang.x2ox.com/2020/summary-2020/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2020/summary-2020/</guid>
            <pubDate>Sun, 27 Dec 2020 18:10:05 GMT</pubDate>
            <description><![CDATA[时间是让人猝不及防的东西晴时有风阴有时雨争不过朝夕又念着往昔偷走了青丝却留住一个你曾经以为很遥远的 2020只剩下最后的一个月了虽然大抵都是风雨多过阳光这一年我们经历了很多除了我们共同经历了疫情之后有人迎来了特别的毕业典礼也有人经历了艰难的失业时期有人结婚了有人离婚了……那么在这个特别的 2020你都经历了些什么在即将结束的这一个月你有什么想说的]]></description>
            <content:encoded><![CDATA[时间是让人猝不及防的东西晴时有风阴有时雨争不过朝夕又念着往昔偷走了青丝却留住一个你曾经以为很遥远的 2020只剩下最后的一个月了虽然大抵都是风雨多过阳光这一年我们经历了很多除了我们共同经历了疫情之后有人迎来了特别的毕业典礼也有人经历了艰难的失业时期有人结婚了有人离婚了……那么在这个特别的 2020你都经历了些什么在即将结束的这一个月你有什么想说的... <br/><p>请前往 <a href="https://aoang.x2ox.com/2020/summary-2020/">https://aoang.x2ox.com/2020/summary-2020/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[QQ 安全中心动态密钥]]></title>
            <link>https://aoang.x2ox.com/2020/tsct/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2020/tsct/</guid>
            <pubDate>Sun, 30 Aug 2020 20:11:07 GMT</pubDate>
            <description><![CDATA[不得不说，有现成的技术方案不用，非要跑去魔改一个，这真是国内众多大厂的特征之一，QQ 安全中心的动态密钥就是如此。现有的 One Time Password 方案大多分为 HOTP 和 TOTP，前者基于事件，后者基于时间。在两步验证的安全策略中，大多数都是采用基于时间的 TOTP 算法。TOTP 算法一般来说都是通用的，因为都是遵循 RFC 6238 来实现的。而 QQ 安全中心的算法是魔改 RFC 6238 实现的，导致除了它自己的客户端，其他的 TOTP 客户端都没办法]]></description>
            <content:encoded><![CDATA[不得不说，有现成的技术方案不用，非要跑去魔改一个，这真是国内众多大厂的特征之一，QQ 安全中心的动态密钥就是如此。现有的 One Time Password 方案大多分为 HOTP 和 TOTP，前者基于事件，后者基于时间。在两步验证的安全策略中，大多数都是采用基于时间的 TOTP 算法。TOTP 算法一般来说都是通用的，因为都是遵循 RFC 6238 来实现的。而 QQ 安全中心的算法是魔改 RFC 6238 实现的，导致除了它自己的客户端，其他的 TOTP 客户端都没办法用。这里就不得不吐槽了，QQ 安全中心已经被砍成残废了，但是不知道为什么，还是有部分服务是依赖它的。比如，某龙的微信全面... <br/><p>请前往 <a href="https://aoang.x2ox.com/2020/tsct/">https://aoang.x2ox.com/2020/tsct/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>朽木枯株</category>
        </item>
        <item>
            <title><![CDATA[搜索引擎的使用]]></title>
            <link>https://aoang.x2ox.com/2020/search-engine-usage/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2020/search-engine-usage/</guid>
            <pubDate>Sun, 28 Jun 2020 09:10:28 GMT</pubDate>
            <description><![CDATA[Baka 才会把机器当成人首先，我们得明白一个道理，搜索引擎是一个软件、工具、程序，它不是人，也不是人工智能。你以提问的形式问搜索引擎，你大概率是得不到你想要的内容的。当然，你可能被百度惯坏了：肚子疼怎么办？百度非常贴心的给出了结果，这个结果来源于百度知道。百度知道是人提问的，也是人回答的，不是搜索引擎知道肚子疼该怎么解决。搜索引擎没有肚子，就算有，它的答案可能是 换一个肚子就好了、重启啊。与或非、全匹配和通配一般人想找一个温泉，但是又希望附近有酒店，他在使用搜索引擎的时候，]]></description>
            <content:encoded><![CDATA[Baka 才会把机器当成人首先，我们得明白一个道理，搜索引擎是一个软件、工具、程序，它不是人，也不是人工智能。你以提问的形式问搜索引擎，你大概率是得不到你想要的内容的。当然，你可能被百度惯坏了：肚子疼怎么办？百度非常贴心的给出了结果，这个结果来源于百度知道。百度知道是人提问的，也是人回答的，不是搜索引擎知道肚子疼该怎么解决。搜索引擎没有肚子，就算有，它的答案可能是 换一个肚子就好了、重启啊。与或非、全匹配和通配一般人想找一个温泉，但是又希望附近有酒店，他在使用搜索引擎的时候，可能会这么搜索：温泉 酒店这里直接忽略某些用「什么酒店附近有温泉啊？」来提问的人。但是搜索出来的几乎都是温泉酒店，而不是... <br/><p>请前往 <a href="https://aoang.x2ox.com/2020/search-engine-usage/">https://aoang.x2ox.com/2020/search-engine-usage/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[Bitwarden 服务指南]]></title>
            <link>https://aoang.x2ox.com/2019/bitwarden/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2019/bitwarden/</guid>
            <pubDate>Sat, 14 Dec 2019 17:44:51 GMT</pubDate>
            <description><![CDATA[前两天，在 V2EX 看到 V 友发帖询问 Bitwarden 高级版购买的问题。和楼主一样，之前都是使用的 KeePass，看帖子里对 Bitwarden 的介绍，就去官网看了看，发现这配套服务除了好看也比较齐全，毕竟开源软件多数都是不会愁生态的，就是多数有点难看。去官网注册了一个账号，发现的确比 KeePass 好看得多。密码管理器中，我一直没有依赖 KeePass 自带的 TOTP，因为便捷性、外观再加上太折腾了，综合考虑下来，Android 上一直使用的是付费的 Au]]></description>
            <content:encoded><![CDATA[前两天，在 V2EX 看到 V 友发帖询问 Bitwarden 高级版购买的问题。和楼主一样，之前都是使用的 KeePass，看帖子里对 Bitwarden 的介绍，就去官网看了看，发现这配套服务除了好看也比较齐全，毕竟开源软件多数都是不会愁生态的，就是多数有点难看。去官网注册了一个账号，发现的确比 KeePass 好看得多。密码管理器中，我一直没有依赖 KeePass 自带的 TOTP，因为便捷性、外观再加上太折腾了，综合考虑下来，Android 上一直使用的是付费的 Authenticator Plus，Windows 下用 WinAuth 和 KeePassXC，Linux 的选择很多，... <br/><p>请前往 <a href="https://aoang.x2ox.com/2019/bitwarden/">https://aoang.x2ox.com/2019/bitwarden/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>聊复尔耳</category>
        </item>
        <item>
            <title><![CDATA[关于个人博客]]></title>
            <link>https://aoang.x2ox.com/2017/about-personal-blog/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2017/about-personal-blog/</guid>
            <pubDate>Sun, 21 May 2017 15:00:42 GMT</pubDate>
            <description><![CDATA[如果要说博客，那么就得提起一个可能是中国第一个建立博客的人——方兴东。他创办的「博客中国」现在都还有这么一篇文章——博客中国的由来：感谢微软。文章大致讲述的是，2002 年 7 月 6 日，方兴东写了两篇关于微软的文章，并将文章发给了几家网站上。一两个小时后，文章陆续的出现在了各个网站的推荐栏目上。但是，又过了一两个小时，这些文章却陆续的消失了。这些文章被微软的公关处理掉了。方兴东之前一直有开办个人网站的念头，由于这件事直接付诸行动了，所以才有了可能是中国第一个建立的博客——]]></description>
            <content:encoded><![CDATA[如果要说博客，那么就得提起一个可能是中国第一个建立博客的人——方兴东。他创办的「博客中国」现在都还有这么一篇文章——博客中国的由来：感谢微软。文章大致讲述的是，2002 年 7 月 6 日，方兴东写了两篇关于微软的文章，并将文章发给了几家网站上。一两个小时后，文章陆续的出现在了各个网站的推荐栏目上。但是，又过了一两个小时，这些文章却陆续的消失了。这些文章被微软的公关处理掉了。方兴东之前一直有开办个人网站的念头，由于这件事直接付诸行动了，所以才有了可能是中国第一个建立的博客——博客中国。这件事，可以说是中国博客萌芽阶段一个非常重要的节点，它不仅催生了一个平台，也侧面体现了个人在传统媒体渠道发声的... <br/><p>请前往 <a href="https://aoang.x2ox.com/2017/about-personal-blog/">https://aoang.x2ox.com/2017/about-personal-blog/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>胡说八道</category>
        </item>
        <item>
            <title><![CDATA[简述 HTTP]]></title>
            <link>https://aoang.x2ox.com/2017/http/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2017/http/</guid>
            <pubDate>Wed, 05 Apr 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[什么是 HTTP？首先，HTTP 是什么？HTTP 是基于 TCP/IP 的应用层通信协议，用于标准化客户端和服务器之间的通信方式。它定义了如何通过互联网请求和传输内容。所谓应用层协议，是指它只处在一个抽象层，规范主机（客户端和服务器）如何通信；它本身依赖 TCP/IP 来传递客户端和服务器之间的请求和响应。默认情况下，HTTP 使用 TCP 端口 80，HTTPS 使用 443。HTTP/0.9——1991 年第一个 HTTP 版本 HTTP/0.9 于 1991 年提出。]]></description>
            <content:encoded><![CDATA[什么是 HTTP？首先，HTTP 是什么？HTTP 是基于 TCP/IP 的应用层通信协议，用于标准化客户端和服务器之间的通信方式。它定义了如何通过互联网请求和传输内容。所谓应用层协议，是指它只处在一个抽象层，规范主机（客户端和服务器）如何通信；它本身依赖 TCP/IP 来传递客户端和服务器之间的请求和响应。默认情况下，HTTP 使用 TCP 端口 80，HTTPS 使用 443。HTTP/0.9——1991 年第一个 HTTP 版本 HTTP/0.9 于 1991 年提出。它是有史以来最简单的协议，只有一个叫作 GET 的方法。如果客户端需要访问服务器上的某个网页，它会发出如下的简单请求：G... <br/><p>请前往 <a href="https://aoang.x2ox.com/2017/http/">https://aoang.x2ox.com/2017/http/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>蟠木朽株</category>
        </item>
        <item>
            <title><![CDATA[OWASP Top 10 - Authentication and Password Management]]></title>
            <link>https://aoang.x2ox.com/2017/owasp-2/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2017/owasp-2/</guid>
            <pubDate>Fri, 17 Mar 2017 12:40:01 GMT</pubDate>
            <description><![CDATA[很多古老的程序都存在一个普遍的问题——身份认证问题。如果有以下行为之一，就有可能存在这个问题。允许弱密码，例如 password、123456、admin使用明文、加密或弱哈希管理密码允许暴力破解、自动攻击使用非安全连接进行认证使用 GET 请求进行认证使用不正确的失效策略关于身份认证可以先从客户端说起。传统 Web 登录方式中，都会默认隐藏用户输入的密码，但是除此之外，应该默认禁用记住会话、记住密码这些功能。用户使用的电脑并非一定是自己的、安全的，默认禁用这些功能对提升安全]]></description>
            <content:encoded><![CDATA[很多古老的程序都存在一个普遍的问题——身份认证问题。如果有以下行为之一，就有可能存在这个问题。允许弱密码，例如 password、123456、admin使用明文、加密或弱哈希管理密码允许暴力破解、自动攻击使用非安全连接进行认证使用 GET 请求进行认证使用不正确的失效策略关于身份认证可以先从客户端说起。传统 Web 登录方式中，都会默认隐藏用户输入的密码，但是除此之外，应该默认禁用记住会话、记住密码这些功能。用户使用的电脑并非一定是自己的、安全的，默认禁用这些功能对提升安全性的作用是很大的。做到了这一点，应该再考虑一下后端的问题：用户的会话失效策略应该是什么样的？在各种使用场景中，主动注销可... <br/><p>请前往 <a href="https://aoang.x2ox.com/2017/owasp-2/">https://aoang.x2ox.com/2017/owasp-2/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>弃如弁髦</category>
        </item>
        <item>
            <title><![CDATA[OWASP Top 10 - Injection]]></title>
            <link>https://aoang.x2ox.com/2017/owasp-1/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2017/owasp-1/</guid>
            <pubDate>Thu, 16 Mar 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[在应用程序安全性中，如果不处理用户输入及其相关数据，可能会带来安全风险。而注入是应用最广泛、历史最久且非常危险的漏洞之一。它在 OWASP Top 10 的 2010、2013 和 2017 版中位列第一，在 2021 版中调整为第三。当不受信任的数据作为命令或查询的一部分发送到解析器时，就会产生 SQL 注入、NoSQL 注入、OS 注入和 LDAP 注入等缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。例如，我们需要查询用户输入的用户名]]></description>
            <content:encoded><![CDATA[在应用程序安全性中，如果不处理用户输入及其相关数据，可能会带来安全风险。而注入是应用最广泛、历史最久且非常危险的漏洞之一。它在 OWASP Top 10 的 2010、2013 和 2017 版中位列第一，在 2021 版中调整为第三。当不受信任的数据作为命令或查询的一部分发送到解析器时，就会产生 SQL 注入、NoSQL 注入、OS 注入和 LDAP 注入等缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。例如，我们需要查询用户输入的用户名和密码是否对应。SELECT * FROM Users WHERE username = $username AND p... <br/><p>请前往 <a href="https://aoang.x2ox.com/2017/owasp-1/">https://aoang.x2ox.com/2017/owasp-1/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>弃如弁髦</category>
        </item>
        <item>
            <title><![CDATA[Hello World]]></title>
            <link>https://aoang.x2ox.com/2016/hello-world/</link>
            <guid isPermaLink="false">https://aoang.x2ox.com/2016/hello-world/</guid>
            <pubDate>Wed, 01 Jun 2016 12:00:51 GMT</pubDate>
            <description><![CDATA[Hello World 是 Hexo 创建时就会生成的一篇文章，标题沿用到现在，在很久之前就标记为草稿不再构建。到现如今更新了，将其作为渲染管线的自检页：Markdown 写进来之后不会直接输出，@content-collections 先解析 Frontmatter，mdx-bundler 把正文编译成 MDX，中间依次挂上 remark-gfm、rehype-slug 和 rehype-mermaid，最后由 Next.js 静态渲染，代码块交给 Shiki。下面按语法类]]></description>
            <content:encoded><![CDATA[Hello World 是 Hexo 创建时就会生成的一篇文章，标题沿用到现在，在很久之前就标记为草稿不再构建。到现如今更新了，将其作为渲染管线的自检页：Markdown 写进来之后不会直接输出，@content-collections 先解析 Frontmatter，mdx-bundler 把正文编译成 MDX，中间依次挂上 remark-gfm、rehype-slug 和 rehype-mermaid，最后由 Next.js 静态渲染，代码块交给 Shiki。下面按语法类别，把这条管线能遇到的写法过一遍，顺便记下每一条当前的实际表现。每次换插件或者调配置，都会回到这里看看哪一段的输出变了。... <br/><p>请前往 <a href="https://aoang.x2ox.com/2016/hello-world/">https://aoang.x2ox.com/2016/hello-world/</a> 阅读全文</p>]]></content:encoded>
            <author>Aoang</author>
            <category>朽木枯株</category>
        </item>
    </channel>
</rss>