<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>汉松札记 - 技术笔记</title><description>工程实践、系统设计、编程语言和技术原理的长期笔记。</description><link>https://blog.xiaohansong.com/</link><item><title>不写代码的工程师，才是 AI 时代最值钱的人</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E4%B8%8D%E5%86%99%E4%BB%A3%E7%A0%81%E7%9A%84%E5%B7%A5%E7%A8%8B%E5%B8%88-%E6%89%8D%E6%98%AF-ai-%E6%97%B6%E4%BB%A3%E6%9C%80%E5%80%BC%E9%92%B1%E7%9A%84%E4%BA%BA/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E4%B8%8D%E5%86%99%E4%BB%A3%E7%A0%81%E7%9A%84%E5%B7%A5%E7%A8%8B%E5%B8%88-%E6%89%8D%E6%98%AF-ai-%E6%97%B6%E4%BB%A3%E6%9C%80%E5%80%BC%E9%92%B1%E7%9A%84%E4%BA%BA/</guid><description>引言 我已经很久没写过一行代码了。 不是因为懒，而是因为我发现了一件事：当我停止写代码的那一刻，我的产出反而变多了。 这听起来像悖论，但 OpenAI 最近做了一个实验：3 人团队，5 个月，100 万行代码，做法是禁止人类写代码。效率是传统方式的 10 倍。 他们怎么做到的？答案藏在一个叫“Har...</description><pubDate>Tue, 03 Mar 2026 00:51:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>一年花一万二，盘点2025年我订阅的 AI 产品</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E4%B8%80%E5%B9%B4%E8%8A%B1%E4%B8%80%E4%B8%87%E4%BA%8C-%E7%9B%98%E7%82%B92025%E5%B9%B4%E6%88%91%E8%AE%A2%E9%98%85%E7%9A%84-ai-%E4%BA%A7%E5%93%81/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E4%B8%80%E5%B9%B4%E8%8A%B1%E4%B8%80%E4%B8%87%E4%BA%8C-%E7%9B%98%E7%82%B92025%E5%B9%B4%E6%88%91%E8%AE%A2%E9%98%85%E7%9A%84-ai-%E4%BA%A7%E5%93%81/</guid><description>TL; DR 2025 年真的是 AI 产品爆发的一年，24 年我只订阅了 Monica，但在 25 年，我居然为十多款 AI 产品付过费了。不算不知道，一算吓一跳，一年下来我总共花了一万二（人民币），平均一个月在 AI 上面消费一千块。下面是我订阅的产品明细。 | ​产品名 | ​订阅费（年费） ...</description><pubDate>Fri, 02 Jan 2026 07:59:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>从零实现 vLLM (1.4）：RMSNorm 如何解决训练不稳定</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0-vllm-1-4-rmsnorm-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E8%AE%AD%E7%BB%83%E4%B8%8D%E7%A8%B3%E5%AE%9A/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0-vllm-1-4-rmsnorm-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E8%AE%AD%E7%BB%83%E4%B8%8D%E7%A8%B3%E5%AE%9A/</guid><description>前言 在上篇文章《从零实现 vLLM（1.3）：如何加速 Attention 计算》中，我们深入分析了 Qwen3Attention 组件，学习了 FlashAttention 如何通过在线 Softmax 和分块计算技术，将 Attention 的计算效率提升到极致。今天这篇文章，我们将目光转向 ...</description><pubDate>Sun, 19 Oct 2025 07:37:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>从零实现 vLLM (1.3）：如何加速 Attention 计算</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0-vllm-1-3-%E5%A6%82%E4%BD%95%E5%8A%A0%E9%80%9F-attention-%E8%AE%A1%E7%AE%97/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0-vllm-1-3-%E5%A6%82%E4%BD%95%E5%8A%A0%E9%80%9F-attention-%E8%AE%A1%E7%AE%97/</guid><description>前言 在上篇文章《从零实现 vLLM (1.2）：如何实现张量并行》中，我们深入到 Qwen3DecoderLayer 的第一个核心组件： Qwen3Attention ，重点分析 QKVParallelLinear 和 RowParallelLinear ，了解了张量并行的原理。今天我们深入到 A...</description><pubDate>Sun, 14 Sep 2025 14:22:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>大模型分布式训练（1）：FSDP 的原理与实践</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%AD%E7%BB%831-fsdp-%E7%9A%84%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E8%B7%B5/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%AD%E7%BB%831-fsdp-%E7%9A%84%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E8%B7%B5/</guid><description>FSDP 的起源 什么是数据并行？ 在大模型出现之前，分布式训练最常用的技术是 数据并行（Data Parallelism, DP） 。 它的核心思想很简单： 1. 每个 GPU 上都存放一份完整的模型副本 2. 将一个大批次的数据（Global Batch）分成几个小批次（Micro batche...</description><pubDate>Sun, 17 Aug 2025 12:14:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>从零实现 vLLM (1.2）：如何实现张量并行</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0-vllm-1-2-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%BC%A0%E9%87%8F%E5%B9%B6%E8%A1%8C/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0-vllm-1-2-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%BC%A0%E9%87%8F%E5%B9%B6%E8%A1%8C/</guid><description>前言 在上篇文章《从零实现 vLLM (1.1）：并行词嵌入 VocabParallelEmbedding》中，我们分析了 Qwen3Model 模型中第一个组件： VocabParallelEmbedding 的源码。今天这篇文章我们深入到 Qwen3DecoderLayer 的第一个核心组件： ...</description><pubDate>Sat, 26 Jul 2025 10:05:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>从零实现 vLLM (1.1）：并行词嵌入 VocabParallelEmbedding</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0-vllm-1-1-%E5%B9%B6%E8%A1%8C%E8%AF%8D%E5%B5%8C%E5%85%A5-vocabparallelembedding/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0-vllm-1-1-%E5%B9%B6%E8%A1%8C%E8%AF%8D%E5%B5%8C%E5%85%A5-vocabparallelembedding/</guid><description>前言 我一直都喜欢通过代码学习各种技术，特别是各种从零开始实现 XX 的。为了学习大模型推理引擎的技术，我找到了 DeepSeek 研究员俞星凯仅用不到1200行代码实现的 nano vllm。我会把我的学习过程记录下来，方便大家参考。 要学习这么大一个技术的课题，需要从什么地方下手呢？下面是我学习...</description><pubDate>Sun, 20 Jul 2025 07:23:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>AI 编程：找轮子，别造轮子</title><link>https://blog.xiaohansong.com/posts/tech-notes/ai-%E7%BC%96%E7%A8%8B-%E6%89%BE%E8%BD%AE%E5%AD%90-%E5%88%AB%E9%80%A0%E8%BD%AE%E5%AD%90/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/ai-%E7%BC%96%E7%A8%8B-%E6%89%BE%E8%BD%AE%E5%AD%90-%E5%88%AB%E9%80%A0%E8%BD%AE%E5%AD%90/</guid><description>我最近用 AI 写了一个导出 Gemini 聊天记录的插件，我把 Gemini 网页的源码粘贴给它之后，告诉它要把网页中的聊天记录导出成 markdown，然后它很快就写完了。但我测试后发现它导出的聊天记录没有保留 markdown 格式，于是提醒它要保留 markdown 格式，比如标题和列表，它...</description><pubDate>Sun, 13 Jul 2025 12:23:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>从软件工程到上下文工程：AI时代的开发者新范式</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%88%B0%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8B-ai%E6%97%B6%E4%BB%A3%E7%9A%84%E5%BC%80%E5%8F%91%E8%80%85%E6%96%B0%E8%8C%83%E5%BC%8F/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%88%B0%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8B-ai%E6%97%B6%E4%BB%A3%E7%9A%84%E5%BC%80%E5%8F%91%E8%80%85%E6%96%B0%E8%8C%83%E5%BC%8F/</guid><description>前言 或许你也有过这样的时刻：在代码评审会议上，同事用 AI 助手几分钟就重构了一个你花了几天才完成的微服务架构；又或者，在日常开发中，你发现团队里的新人正在用 AI 编程助手，轻松地处理那些曾经需要反复查阅文档和调试的复杂任务。我们曾经坚信的“代码即真理”的世界，正在被一种更模糊、更接近对话的逻辑...</description><pubDate>Sun, 06 Jul 2025 08:28:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>DeepSeek新论文SPCT：让奖励模型学会“先定规则后点评，再打分”</title><link>https://blog.xiaohansong.com/posts/tech-notes/deepseek%E6%96%B0%E8%AE%BA%E6%96%87spct-%E8%AE%A9%E5%A5%96%E5%8A%B1%E6%A8%A1%E5%9E%8B%E5%AD%A6%E4%BC%9A%E5%85%88%E5%AE%9A%E8%A7%84%E5%88%99%E5%90%8E%E7%82%B9%E8%AF%84-%E5%86%8D%E6%89%93%E5%88%86/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/deepseek%E6%96%B0%E8%AE%BA%E6%96%87spct-%E8%AE%A9%E5%A5%96%E5%8A%B1%E6%A8%A1%E5%9E%8B%E5%AD%A6%E4%BC%9A%E5%85%88%E5%AE%9A%E8%A7%84%E5%88%99%E5%90%8E%E7%82%B9%E8%AF%84-%E5%86%8D%E6%89%93%E5%88%86/</guid><description>开篇：奖励模型挺重要，但不好搞啊！ 为啥要聊奖励模型？ 现在大语言模型（LLM）是越来越火，能力也越来越强。但光能打还不行，还得听话，得知道啥是对的、啥是好的，不能瞎来。这就是所谓的“对齐”（Alignment）。要让 LLM 听话，强化学习（RL）就成了关键技术。在这个过程中，有个角色特别重要，那...</description><pubDate>Sun, 06 Apr 2025 05:20:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>AutoGLM 技术探秘：让 AI 学会“点点点”的挑战与策略</title><link>https://blog.xiaohansong.com/posts/tech-notes/autoglm-%E6%8A%80%E6%9C%AF%E6%8E%A2%E7%A7%98-%E8%AE%A9-ai-%E5%AD%A6%E4%BC%9A%E7%82%B9%E7%82%B9%E7%82%B9%E7%9A%84%E6%8C%91%E6%88%98%E4%B8%8E%E7%AD%96%E7%95%A5/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/autoglm-%E6%8A%80%E6%9C%AF%E6%8E%A2%E7%A7%98-%E8%AE%A9-ai-%E5%AD%A6%E4%BC%9A%E7%82%B9%E7%82%B9%E7%82%B9%E7%9A%84%E6%8C%91%E6%88%98%E4%B8%8E%E7%AD%96%E7%95%A5/</guid><description>前言 最近 AI 领域有个挺火的方向，就是让 AI 像人一样去操作图形界面（GUI），比如自动帮你订外卖、处理邮件等等。智谱 AI 推出的 AutoGLM 就是这个方向的一个尝试（产品地址：https://autoglm research.zhipuai.cn/，开源地址：https://xiao9...</description><pubDate>Tue, 01 Apr 2025 15:20:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>不需要人类教练的o3：OpenAI用强化学习训练出编程&quot;六边形战士&quot;</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E4%B8%8D%E9%9C%80%E8%A6%81%E4%BA%BA%E7%B1%BB%E6%95%99%E7%BB%83%E7%9A%84o3-openai%E7%94%A8%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0%E8%AE%AD%E7%BB%83%E5%87%BA%E7%BC%96%E7%A8%8B%E5%85%AD%E8%BE%B9%E5%BD%A2%E6%88%98%E5%A3%AB/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E4%B8%8D%E9%9C%80%E8%A6%81%E4%BA%BA%E7%B1%BB%E6%95%99%E7%BB%83%E7%9A%84o3-openai%E7%94%A8%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0%E8%AE%AD%E7%BB%83%E5%87%BA%E7%BC%96%E7%A8%8B%E5%85%AD%E8%BE%B9%E5%BD%A2%E6%88%98%E5%A3%AB/</guid><description>TLDR OpenAI在最近的发表的对比研究中发现：在编程竞赛任务中，人类精心设计的策略败给了强化学习训练的通用模型。论文名称：《Competitive Programming with Large Reasoning Models》。 在o1出现之前，在Codeforces编程竞赛AI是没有一席之...</description><pubDate>Mon, 17 Feb 2025 02:28:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>深入浅出GraphRag[2]检索生成</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAgraphrag2%E6%A3%80%E7%B4%A2%E7%94%9F%E6%88%90/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAgraphrag2%E6%A3%80%E7%B4%A2%E7%94%9F%E6%88%90/</guid><description>前言 在上篇文章《深入浅出GraphRag 知识图谱生成》中，我分析了GraphRag的图谱生成过程，那么生成的这些图谱数据是如何应用到生成里面的？这篇文章会给出答案。注意本篇文章中提到的很多概念依赖上篇文章的内容，建议先读一下《深入浅出GraphRag 知识图谱生成》。 GraphRag的检索生成...</description><pubDate>Sun, 21 Jul 2024 05:19:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>深入浅出GraphRag[1]知识图谱生成</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAgraphrag1%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1%E7%94%9F%E6%88%90/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAgraphrag1%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1%E7%94%9F%E6%88%90/</guid><description>前言 GraphRAG 是微软开源的一个基于大模型+知识图谱回答用户问题的开源项目。相同传统的RAG，它的创新点主要有两个： 1. 提出了一套完整的利用大模型生成知识图谱的方案。 2. 基于map reduce的思路支持对数据集全局类型的问答。 简单来说，GraphRAG 工作流程主要分为两步： 1...</description><pubDate>Sun, 14 Jul 2024 11:55:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>ChatGPT文本生成的工程原理分析与代码示例</title><link>https://blog.xiaohansong.com/posts/tech-notes/chatgpt%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90%E7%9A%84%E5%B7%A5%E7%A8%8B%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90%E4%B8%8E%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/chatgpt%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90%E7%9A%84%E5%B7%A5%E7%A8%8B%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90%E4%B8%8E%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B/</guid><description>之前ChatGPT刚出来的时候大家都在研究GPT模型，有很多的科普文章都说GPT模型其实就是在做文字接龙，根据前面的文本预测下一个字。这样通俗的理解确实没有什么问题，但是作为程序员我们肯定不能满足于这么表面的理解。本文主要就是要从工程角度对大模型的文本生成过程的原理结合代码进行分析。值得注意的是本文...</description><pubDate>Sat, 25 Nov 2023 13:46:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>机器学习基础之梯度计算：Pytorch代码与公式</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80%E4%B9%8B%E6%A2%AF%E5%BA%A6%E8%AE%A1%E7%AE%97-pytorch%E4%BB%A3%E7%A0%81%E4%B8%8E%E5%85%AC%E5%BC%8F/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80%E4%B9%8B%E6%A2%AF%E5%BA%A6%E8%AE%A1%E7%AE%97-pytorch%E4%BB%A3%E7%A0%81%E4%B8%8E%E5%85%AC%E5%BC%8F/</guid><description>我们看教科书里面讲批量梯度下降的算法数学公式都是类似这样的： (w,b)←(w,b)−η|B|∑i∈B∂(w,b)l(i)(w,b).(\\mathbf{w},b) \\leftarrow (\\mathbf{w},b) \\frac{\\eta}{|\\mathcal{B}|} \\sum\ {i...</description><pubDate>Sun, 19 Nov 2023 03:59:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>ChatGPT之GPTs的使用与分析：5分钟构建一个天气画报</title><link>https://blog.xiaohansong.com/posts/tech-notes/chatgpt%E4%B9%8Bgpts%E7%9A%84%E4%BD%BF%E7%94%A8%E4%B8%8E%E5%88%86%E6%9E%90-5%E5%88%86%E9%92%9F%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%A4%A9%E6%B0%94%E7%94%BB%E6%8A%A5/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/chatgpt%E4%B9%8Bgpts%E7%9A%84%E4%BD%BF%E7%94%A8%E4%B8%8E%E5%88%86%E6%9E%90-5%E5%88%86%E9%92%9F%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%A4%A9%E6%B0%94%E7%94%BB%E6%8A%A5/</guid><description>在GPTs推出之后，我用它花了5分钟就配置了一个生成天气画报的GPTs，目前看GPTs在提升AI应用研发效率上面还是做的非常好的，但并没有超出期望，它只是一种研发范式的创新，并没有带来质的变化：以前Langchain+GPT4做不到的事情，现在也做不到。 在这个功能出来之后，有人就说这个功能干死了一...</description><pubDate>Mon, 13 Nov 2023 03:44:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>统计学与机器学习交汇点：线性回归的数学基础</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E7%BB%9F%E8%AE%A1%E5%AD%A6%E4%B8%8E%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%BA%A4%E6%B1%87%E7%82%B9-%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E7%9A%84%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E7%BB%9F%E8%AE%A1%E5%AD%A6%E4%B8%8E%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%BA%A4%E6%B1%87%E7%82%B9-%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E7%9A%84%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/</guid><description>本文详细解析了线性回归的数学含义，包括“线性”和“回归”两个核心概念。线性主要涉及可加性和齐次性，这两个性质在数学、统计学乃至软件工程等多个领域都有广泛应用。回归则是一种预测数值型输出（因变量）的方法，基于一个或多个输入（自变量）。线性回归结合了这两个概念，通过找到最佳拟合直线来进行预测。该模型具有...</description><pubDate>Thu, 09 Nov 2023 03:00:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>ChatGLM3 的代码解释器（Code Interpreter）实现原理</title><link>https://blog.xiaohansong.com/posts/tech-notes/chatglm3-%E7%9A%84%E4%BB%A3%E7%A0%81%E8%A7%A3%E9%87%8A%E5%99%A8code-interpreter%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/chatglm3-%E7%9A%84%E4%BB%A3%E7%A0%81%E8%A7%A3%E9%87%8A%E5%99%A8code-interpreter%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/</guid><description>原理简介 在之前的文章《ChatGLM3 的工具调用（FunctionCalling）实现原理》里面，我们介绍了ChatGLM3工具调用的原理，其本质就是让大模型通过微调学会根据prompt中的函数的定义学会下一步应该调用哪个函数，然后我们解析大模型预测的文本结果去执行对应的函数，最后再把执行的结果...</description><pubDate>Sat, 04 Nov 2023 08:09:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>ChatGLM3 的工具调用（FunctionCalling）实现原理</title><link>https://blog.xiaohansong.com/posts/tech-notes/chatglm3-%E7%9A%84%E5%B7%A5%E5%85%B7%E8%B0%83%E7%94%A8functioncalling%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/chatglm3-%E7%9A%84%E5%B7%A5%E5%85%B7%E8%B0%83%E7%94%A8functioncalling%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/</guid><description>ChatGLM3终于带来了跟ChatGPT一样的工具调用能力，通过它的源码和样本数据，我们可以了解到让大模型学会使用工具的方法原理。 官方例子中的疑问 我们先跟着官方例子的步骤一步步走。 构建 System Prompt 这里以两个工具调用为例，首先准备好要构建的数据的描述信息。其实就是定义好我们能...</description><pubDate>Sat, 04 Nov 2023 08:08:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>从零开始写数据库：500行代码实现 LSM 数据库</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%86%99%E6%95%B0%E6%8D%AE%E5%BA%93-500%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0-lsm-%E6%95%B0%E6%8D%AE%E5%BA%93/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%86%99%E6%95%B0%E6%8D%AE%E5%BA%93-500%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0-lsm-%E6%95%B0%E6%8D%AE%E5%BA%93/</guid><description>前言 LSM Tree 是很多 NoSQL 数据库引擎的底层实现，例如 LevelDB，Hbase 等。本文基于《数据密集型应用系统设计》中对 LSM Tree 数据库的设计思路，结合代码实现完整地阐述了一个迷你数据库，核心代码 500 行左右，通过理论结合实践来更好地理解数据库的原理。 SSTab...</description><pubDate>Sat, 08 Apr 2023 09:11:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>SQL查询引擎原理浅析</title><link>https://blog.xiaohansong.com/posts/tech-notes/sql%E6%9F%A5%E8%AF%A2%E5%BC%95%E6%93%8E%E5%8E%9F%E7%90%86%E6%B5%85%E6%9E%90/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/sql%E6%9F%A5%E8%AF%A2%E5%BC%95%E6%93%8E%E5%8E%9F%E7%90%86%E6%B5%85%E6%9E%90/</guid><description>SQL的诞生 SQL英文全称是Structured Query Language，中文名即结构化查询语言，是一门专门用来查询数据的声明式编程语言。 我先解释一下声明式语言的概念，编程语言有两个分类： 命令式：手把手教机器做事情 声明式：告诉机器任务，让它自己想办法解决 举个例子，假设你家里有机器人，...</description><pubDate>Sun, 16 Oct 2022 13:24:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>对感知机算法的一些理解</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E5%AF%B9%E6%84%9F%E7%9F%A5%E6%9C%BA%E7%AE%97%E6%B3%95%E7%9A%84%E4%B8%80%E4%BA%9B%E7%90%86%E8%A7%A3/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E5%AF%B9%E6%84%9F%E7%9F%A5%E6%9C%BA%E7%AE%97%E6%B3%95%E7%9A%84%E4%B8%80%E4%BA%9B%E7%90%86%E8%A7%A3/</guid><description>机器学习假设了对于某个问题存在一个上帝函数，给定一个输入就能得到一个确定的输出，计算机可以通过样本数据在假设的函数空间中找到一个近似上帝函数的函数，我们可以利用这个近似函数来进行预测。 现实世界的问题大体可以分为两类：分类和回归。 分类问题就是对一个东西判断它所属的类别，例如判断一张照片里面的动物是...</description><pubDate>Mon, 12 Sep 2022 07:46:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>怎样写线程安全的代码</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E6%80%8E%E6%A0%B7%E5%86%99%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%E4%BB%A3%E7%A0%81/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E6%80%8E%E6%A0%B7%E5%86%99%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%E4%BB%A3%E7%A0%81/</guid><description>前言 多线程编程是软件开发中最棘手的问题之一。无论什么时候用多线程来操作同一份数据，都会出现并发问题。这就让写线程安全的代码成为一件非常困难的事情。本文将会从并发问题的本质出发，带你了解问题的根源，然后通过实例阐述保证线程安全的难点在哪里，最后提供常见的并发控制技术的原理和例子，希望能够帮助读者更好...</description><pubDate>Thu, 24 Feb 2022 13:47:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>MAB问题的解法与应用（万字长文）</title><link>https://blog.xiaohansong.com/posts/tech-notes/mab%E9%97%AE%E9%A2%98%E7%9A%84%E8%A7%A3%E6%B3%95%E4%B8%8E%E5%BA%94%E7%94%A8%E4%B8%87%E5%AD%97%E9%95%BF%E6%96%87/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/mab%E9%97%AE%E9%A2%98%E7%9A%84%E8%A7%A3%E6%B3%95%E4%B8%8E%E5%BA%94%E7%94%A8%E4%B8%87%E5%AD%97%E9%95%BF%E6%96%87/</guid><description>​ 目录 MAB问题 MAB是多臂老虎机（Multi Armed Bandit）的缩写，MAB问题就是假设有个赌徒到赌场里面摇老虎机，赌场里面有10个老虎机，每个老虎机的赢钱概率是不一样的，此时他不知道每个老虎机的赢钱概率，而且他只有100个币，也就是说只能摇100次，如果他想最大化收益应该怎么摇？...</description><pubDate>Wed, 10 Nov 2021 13:29:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>50行代码实现一个KV数据库</title><link>https://blog.xiaohansong.com/posts/tech-notes/50%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAkv%E6%95%B0%E6%8D%AE%E5%BA%93/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/50%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAkv%E6%95%B0%E6%8D%AE%E5%BA%93/</guid><description>最简单的KV数据库需要多少行代码实现？答案是不到50行。接下来我会带你实现一个基于日志顺序写入的数据库，它的功能很简单，支持写入和查询字符串类型的key和 value。 一个KV数据库最重要的是存储实现，因为它的查询语法很简单，根据key查询value就行，不像关系型数据库还需要实现解析器和优化器来...</description><pubDate>Mon, 11 Oct 2021 14:32:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>从零开始写KV数据库：基于哈希索引</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%86%99kv%E6%95%B0%E6%8D%AE%E5%BA%93-%E5%9F%BA%E4%BA%8E%E5%93%88%E5%B8%8C%E7%B4%A2%E5%BC%95/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%86%99kv%E6%95%B0%E6%8D%AE%E5%BA%93-%E5%9F%BA%E4%BA%8E%E5%93%88%E5%B8%8C%E7%B4%A2%E5%BC%95/</guid><description>前言 新的KV数据库层出不穷，我们经常听说的KV数据库如RocksDb、Hbase等都是基于日志结构的存储引擎。最近我在看《数据密集型应用系统设计》，里面有一章专门在讲日志结构的存储引擎的演进过程，纯看理论不过瘾，所以我决定根据书里的理论动手自己实现一个KV数据库。同时，为了能顺便学习Rust，所以...</description><pubDate>Sun, 23 May 2021 03:36:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>Java 类隔离加载的正确姿势</title><link>https://blog.xiaohansong.com/posts/tech-notes/java-%E7%B1%BB%E9%9A%94%E7%A6%BB%E5%8A%A0%E8%BD%BD%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/java-%E7%B1%BB%E9%9A%94%E7%A6%BB%E5%8A%A0%E8%BD%BD%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/</guid><description>什么是类隔离技术 只要你 Java 代码写的足够多，就一定出现这种情况：系统新引入了一个中间件的 jar 包，编译的时候一切正常，一运行就报错：java.lang.NoSuchMethodError，然后就哼哧哼哧的开始谷歌找解决方法，最后在几百个依赖包里面找的眼睛都快瞎了才找到冲突的 jar，把问...</description><pubDate>Sun, 17 May 2020 02:44:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>Java 日志框架冲突问题排查与总结</title><link>https://blog.xiaohansong.com/posts/tech-notes/java-%E6%97%A5%E5%BF%97%E6%A1%86%E6%9E%B6%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5%E4%B8%8E%E6%80%BB%E7%BB%93/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/java-%E6%97%A5%E5%BF%97%E6%A1%86%E6%9E%B6%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5%E4%B8%8E%E6%80%BB%E7%BB%93/</guid><description>Java 日志框架冲突问题排查与总结 前言 Java 有很多的日志框架可以选择，当同一个项目中出现多种日志框架时就很容易出现日志框架冲突的问题，导致日志打印不出来。本文将以一次典型的日志冲突排查问题为例，提供排查步骤和思路，最后分析日志框架冲突的原因。 一般行文思路都是先讲 Why，再讲 How，这...</description><pubDate>Sun, 17 May 2020 02:42:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>多视角看区块链</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E5%A4%9A%E8%A7%86%E8%A7%92%E7%9C%8B%E5%8C%BA%E5%9D%97%E9%93%BE/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E5%A4%9A%E8%A7%86%E8%A7%92%E7%9C%8B%E5%8C%BA%E5%9D%97%E9%93%BE/</guid><description>前言 像很多新技术一样，区块链开始火起来的时候评价是两级分化的，有人觉得区块链会成为下一代的互联网的基础设施，有人觉得区块链没有任何价值。很多时候观点的不同是因为看的角度不一样，如果能从多个角度看区块链，或许能得到更客观的观点，因此本文会分别从技术和业务的视角来分析区块链。 从技术的视角看区块链 从...</description><pubDate>Tue, 06 Aug 2019 15:05:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>分布式系统：一致性协议</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-%E4%B8%80%E8%87%B4%E6%80%A7%E5%8D%8F%E8%AE%AE/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-%E4%B8%80%E8%87%B4%E6%80%A7%E5%8D%8F%E8%AE%AE/</guid><description>一致性模型本质上是进程与数据存储的约定，通过一致性模型我们可以理解和推理在分布式系统中数据复制需要考虑的问题和基本假设。那么，一致性模型的具体实现有一些呢？本文会介绍一致性协议实现的主要思想和方法。 什么是一致性协议 一致性协议描述了特定一致性模型的实际实现。 一致性模型就像是接口，而一致性协议就像...</description><pubDate>Sat, 25 May 2019 07:23:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>分布式系统：Lamport 逻辑时钟</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-lamport-%E9%80%BB%E8%BE%91%E6%97%B6%E9%92%9F/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-lamport-%E9%80%BB%E8%BE%91%E6%97%B6%E9%92%9F/</guid><description>分布式系统解决了传统单体架构的单点问题和性能容量问题，另一方面也带来了很多的问题，其中一个问题就是多节点的时间同步问题：不同机器上的物理时钟难以同步，导致无法区分在分布式系统中多个节点的事件时序。1978年Lamport在《Time, Clocks and the Ordering of Event...</description><pubDate>Sat, 27 Apr 2019 02:31:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>分布式系统：向量时钟</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-%E5%90%91%E9%87%8F%E6%97%B6%E9%92%9F/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-%E5%90%91%E9%87%8F%E6%97%B6%E9%92%9F/</guid><description>在上一篇文章分布式系统：Lamport 逻辑时钟中我们知道Lamport 逻辑时钟帮助我们得到了分布式系统中的事件全序关系，但是对于同时发生的关系却不能很好的描述，导致无法描述事件的因果关系。向量时钟是在 Lamport 时间戳基础上演进的另一种逻辑时钟方法，它通过向量结构不但记录本节点的 Lamp...</description><pubDate>Sat, 27 Apr 2019 02:31:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>IDEA 插件开发入门教程</title><link>https://blog.xiaohansong.com/posts/tech-notes/idea-%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/idea-%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/</guid><description>IntelliJ IDEA 是目前最好用的 JAVA 开发 IDE，它本身的功能已经非常强大了，但是每个人的需求不一样，有些需求 IDEA 本身无法满足，于是我们就需要自己开发插件来解决。工欲善其事，必先利其器，想要提高开发效率，我们可以借助 IDEA 提供的插件功能来满足我们的需求。如果没有我需要...</description><pubDate>Sat, 27 Apr 2019 02:30:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>分布式系统：一致性模型</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-%E4%B8%80%E8%87%B4%E6%80%A7%E6%A8%A1%E5%9E%8B/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-%E4%B8%80%E8%87%B4%E6%80%A7%E6%A8%A1%E5%9E%8B/</guid><description>分布式系统中一个重要的问题就是数据复制，数据复制一般是为了增强系统的可用性或提高性能。而实现数据复制的一个主要难题就是保持各个副本的一致性。本文首先讨论数据复制的场景中一致性模型如此重要的原因，然后讨论一致性模型的含义，最后分析常用的一致性模型。 为什么需要一致性模型 数据复制主要的目的有两个：可用...</description><pubDate>Sat, 27 Apr 2019 02:30:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>分布式系统：持续一致性</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-%E6%8C%81%E7%BB%AD%E4%B8%80%E8%87%B4%E6%80%A7/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-%E6%8C%81%E7%BB%AD%E4%B8%80%E8%87%B4%E6%80%A7/</guid><description>在分布式系统中，数据复制一般是为了增强系统的可用性或提高性能，但是数据一致性跟系统性能往往是矛盾的，对于数据复制的一致性问题没有最好的解决方法。除非放宽对一致性的要求才能获取特定场景下面的有效解决方法。那么放宽一致性的标准是什么？为此，Yu 和 Vahdat 提出了一种用于衡量不一致性以及表述系统中...</description><pubDate>Sat, 27 Apr 2019 02:29:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>分布式系统：CAP 理论的前世今生</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-cap-%E7%90%86%E8%AE%BA%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F-cap-%E7%90%86%E8%AE%BA%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F/</guid><description>CAP 理论是分布式系统设计中的一个重要理论，虽然它为系统设计提供了非常有用的依据，但是也带来了很多误解。本文将从 CAP 诞生的背景说起，然后对理论进行解释，最后对 CAP 在当前背景下的一些新理解进行分析，澄清一些对 CAP 的误解。 CAP 理论诞生的背景 CAP 理论的是在“数据一致性 VS...</description><pubDate>Sat, 27 Apr 2019 02:27:00 GMT</pubDate><category>技术笔记</category><category>知乎</category></item><item><title>编写高质量代码的思考</title><link>https://blog.xiaohansong.com/posts/tech-notes/high-quality-code/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/high-quality-code/</guid><description>前言 最近在看《代码大全》，可以说是一本软件开发的百科全书，特别厚，但是干货也很多。平时写代码，代码规范是一个最低的要求（很多老代码连最低要求都达不到），为什么要这样规定代码要这么写，而不是那么写？这是一个值得深究的问题。而不是说我照着代码规范写代码就算完了，高质量的代码是一个专业工程师的追求。要知...</description><pubDate>Wed, 09 Aug 2017 15:56:52 GMT</pubDate><category>技术笔记</category><category>编程实践</category></item><item><title>代码生成利器：IDEA 强大的 Live Templates</title><link>https://blog.xiaohansong.com/posts/tech-notes/idea-live-templates/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/idea-live-templates/</guid><description>前言 Java 开发过程经常需要编写有固定格式的代码，例如说声明一个私有变量，logger或者bean等等。对于这种小范围的代码生成，我们可以利用 IDEA 提供的 Live Templates功能。刚开始觉得它只是一个简单的Code Snippet，后来发现它支持变量函数配置，可以支持很复杂的代码...</description><pubDate>Fri, 17 Mar 2017 15:08:30 GMT</pubDate><category>技术笔记</category><category>idea</category></item><item><title>IDEA代码生成插件CodeMaker</title><link>https://blog.xiaohansong.com/posts/tech-notes/codemaker/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/codemaker/</guid><description>前言 Java 开发过程中经常会遇到编写重复代码的事情，例如说：编写领域类和持久类的时候，大部分时候它们的变量名称，类型是一样的，在编写领域类的时候常常要重复写类似的代码。类似的问题太多，却没找到可以支持自定义代码模板的插件，只能自己动手，丰衣足食，开发了一个 IDEA 的代码生成插件，通过 Vel...</description><pubDate>Fri, 03 Feb 2017 12:11:34 GMT</pubDate><category>技术笔记</category><category>idea-plugin</category></item><item><title>图解 Paxos 一致性协议</title><link>https://blog.xiaohansong.com/posts/tech-notes/paxos/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/paxos/</guid><description>前言 Paxos 一致性协议可以说是一致性协议研究的起点，也以难以理解闻名。其实协议本身并没有多难理解，它的难理解性主要体现在：为何如此设计协议以及如何证明其正确性。本文尝试通过流程图来说明协议的内容以及基本应用过程，不涉及如何证明其正确性。 基本概念 Paxos 可以分为两种： Single De...</description><pubDate>Fri, 30 Sep 2016 02:17:52 GMT</pubDate><category>技术笔记</category><category>Paxos</category><category>一致性协议</category></item><item><title>Zookeeper ZAB 协议分析</title><link>https://blog.xiaohansong.com/posts/tech-notes/zab/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/zab/</guid><description>前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播协议。在 ZooKeeper 中，主要依赖 ZAB 协议来实现分布式数据一致性，基于该协议，ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。 Atomic broadc...</description><pubDate>Thu, 25 Aug 2016 15:53:11 GMT</pubDate><category>技术笔记</category><category>Zookeeper</category><category>ZAB</category><category>分布式</category><category>一致性协议</category></item><item><title>ZooKeeper Watcher 和 AsyncCallback 的区别与实现</title><link>https://blog.xiaohansong.com/posts/tech-notes/zookeeper-watch-async/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/zookeeper-watch-async/</guid><description>前言 初学 Zookeeper 会发现客户端有两种回调方式： Watcher 和 AsyncCallback，而 Zookeeper 的使用是离不开这两种方式的，搞清楚它们之间的区别与实现显得尤为重要。本文将围绕下面几个方面展开 Watcher 和 AsyncCallback 的区别 Watcher...</description><pubDate>Mon, 22 Aug 2016 14:15:08 GMT</pubDate><category>技术笔记</category><category>Zookeeper</category><category>分布式</category></item><item><title>ThreadLocal 内存泄露的实例分析</title><link>https://blog.xiaohansong.com/posts/tech-notes/threadlocal-leak-analyze/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/threadlocal-leak-analyze/</guid><description>前言 之前写了一篇[深入分析 ThreadLocal 内存泄漏问题][1]是从理论上分析ThreadLocal的内存泄漏问题，这一篇文章我们来分析一下实际的内存泄漏案例。分析问题的过程比结果更重要，理论结合实际才能彻底分析出内存泄漏的原因。 案例与分析 问题背景 在 Tomcat 中，下面的代码都在...</description><pubDate>Tue, 09 Aug 2016 14:10:04 GMT</pubDate><category>技术笔记</category><category>Java</category><category>ThreadLocal</category><category>并发</category></item><item><title>深入分析 ThreadLocal 内存泄漏问题</title><link>https://blog.xiaohansong.com/posts/tech-notes/threadlocal-memory-leak/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/threadlocal-memory-leak/</guid><description>前言 ThreadLocal 的作用是提供线程内的局部变量，这种变量在线程的生命周期内起作用，减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用 ThreadLocal，就可能会导致内存泄漏。下面，我们将围绕三个方面来分析 ThreadLocal 内存泄漏的问题 Threa...</description><pubDate>Sat, 06 Aug 2016 12:12:16 GMT</pubDate><category>技术笔记</category><category>Java</category><category>ThreadLocal</category><category>并发</category></item><item><title>【Getty】Java NIO框架设计与实现</title><link>https://blog.xiaohansong.com/posts/tech-notes/getty/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/getty/</guid><description>前言 [Getty][1]是我为了学习 Java NIO 所写的一个 NIO 框架，实现过程中参考了 Netty 的设计，同时使用 Groovy 来实现。虽然只是玩具，但是麻雀虽小，五脏俱全，在实现过程中，不仅熟悉了 NIO 的使用，还借鉴了很多 Netty 的设计思想，提升了自己的编码和设计能力。...</description><pubDate>Sat, 30 Jul 2016 02:42:23 GMT</pubDate><category>技术笔记</category><category>Java</category><category>NIO</category></item><item><title>Java 线程池框架核心代码分析</title><link>https://blog.xiaohansong.com/posts/tech-notes/java-executor/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/java-executor/</guid><description>前言 多线程编程中，为每个任务分配一个线程是不现实的，线程创建的开销和资源消耗都是很高的。线程池应运而生，成为我们管理线程的利器。Java 通过Executor接口，提供了一种标准的方法将任务的提交过程和执行过程解耦开来，并用Runnable表示任务。 下面，我们来分析一下 Java 线程池框架的实...</description><pubDate>Mon, 11 Jul 2016 16:13:44 GMT</pubDate><category>技术笔记</category><category>Java</category><category>Executor</category><category>并发</category></item><item><title>RedisHttpSession 的设计与实现</title><link>https://blog.xiaohansong.com/posts/tech-notes/redishttpsession/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/redishttpsession/</guid><description>前言 [RedisHttpSession][1] 是我的一个 Java 开源项目，通过将 Session 存储在 Redis 中实现多服务器间共享 Session，同时这一过程是完全透明的。主要用于支持 RESTfuls API。下面我将对其核心类进行分析，阐述它的设计以及实现细节。 RedisHt...</description><pubDate>Sun, 15 May 2016 02:49:39 GMT</pubDate><category>技术笔记</category><category>Java</category><category>Session</category></item><item><title>三言两语：JVM 字节码执行实例分析</title><link>https://blog.xiaohansong.com/posts/tech-notes/java-bytecode/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/java-bytecode/</guid><description>前言 最近在看《Java 虚拟机规范》和《深入理解JVM虚拟机》，对于字节码的执行有了进一步的了解。字节码就像是汇编语言，是 JVM 的指令集。下面我们先对 JVM 执行引擎做一下简单介绍，然后根据实例分析 JVM 字节码的执行过程。包括： 1. for 循环字节码分析 2. try catch f...</description><pubDate>Tue, 26 Apr 2016 03:11:29 GMT</pubDate><category>技术笔记</category><category>Java</category><category>JVM</category></item><item><title>【译】JVM 进行线程同步背后的原理</title><link>https://blog.xiaohansong.com/posts/tech-notes/jvm-synchronized/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/jvm-synchronized/</guid><description>本文翻译自[How the Java virtual machine performs thread synchronization][1]，内容略有删改 前言 所有的 Java 程序都会被翻译为包含字节码的 class 文件，字节码是 JVM 的机器语言。这篇文章将阐述 JVM 是如何处理线程同步...</description><pubDate>Sat, 23 Apr 2016 02:50:37 GMT</pubDate><category>技术笔记</category><category>synchronized</category><category>并发</category></item><item><title>三言两语：SQL 连接（join）</title><link>https://blog.xiaohansong.com/posts/tech-notes/sql-join/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/sql-join/</guid><description>前言 本文将从连接的理论和语法讲起，结合具体的例子，详细分析 SQL 连接。 之前对数据库的连接操作似懂非懂，大概知道是什么东西，但是面试笔试的时候被虐成渣，讲不清连接到底是什么。吃一堑，长一智。这就是所谓的似懂非懂， 只是单纯的看书是没用的，只有亲自动手做实验才能彻底理解什么是连接。 连接类型与条...</description><pubDate>Thu, 14 Apr 2016 13:52:59 GMT</pubDate><category>技术笔记</category><category>MySQL</category><category>join</category></item><item><title>Hiho 1289 403 Forbidden（微软编程题）</title><link>https://blog.xiaohansong.com/posts/tech-notes/forbidden/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/forbidden/</guid><description>题意 allow 1.2.3.4/30 deny 1.1.1.1 allow 127.0.0.1 allow 123.234.12.23/3 deny 0.0.0.0/0 输入 ip 按顺序匹配规则，优先匹配前面的规则，如果没有规则可以匹配则视为合法。注意：掩码为 0 的时候表示匹配所有 ip。 思...</description><pubDate>Sat, 09 Apr 2016 08:10:40 GMT</pubDate><category>技术笔记</category><category>字典树</category><category>Trie</category></item><item><title>Java String 对 null 对象的容错处理</title><link>https://blog.xiaohansong.com/posts/tech-notes/null-in-java-string/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/null-in-java-string/</guid><description>前言 最近在读《Thinking in Java》，看到这样一段话： Primitives that are fields in a class are automatically initialized to zero, as noted in the Everything Is an Objec...</description><pubDate>Sun, 13 Mar 2016 09:10:24 GMT</pubDate><category>技术笔记</category><category>Java</category><category>String</category></item><item><title>访问 NULL 指针错误背后的原理</title><link>https://blog.xiaohansong.com/posts/tech-notes/dereference-null/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/dereference-null/</guid><description>前言 说到 NULL 指针大家都是谈之色变，第一印象就是 NullPointerException, Segmentation fault 之类的错误。NULL 指针大部分情况下会导致程序被终止。但是其实严格来说，访问空指针会产生不可预料的结果。只不过大部分情况是程序被终止。为什么呢？接下来让我们来...</description><pubDate>Thu, 18 Feb 2016 14:50:43 GMT</pubDate><category>技术笔记</category><category>Linux</category></item><item><title>对抽象类与接口的一点思考</title><link>https://blog.xiaohansong.com/posts/tech-notes/abstract-class-and-interface/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/abstract-class-and-interface/</guid><description>前言 之前写了一篇文章 [简洁代码之道（1）：用多态替代条件语句][1]，有人问实现多态的时候为什么用抽象类而不是接口。当时写文章的时候并没有想到这个问题。后来仔细想想，这的确是个值得探讨的问题。多态可以用抽象类或者接口实现，重点是应该用哪个？更大问题是，接口和抽象类有什么本质的区别？下面我们将讨论...</description><pubDate>Wed, 02 Dec 2015 13:55:47 GMT</pubDate><category>技术笔记</category><category>编程实践</category></item><item><title>简洁代码之道（2）：避免全局可变状态</title><link>https://blog.xiaohansong.com/posts/tech-notes/avoid-global-state/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/avoid-global-state/</guid><description>前言 本文是我看了 [谷歌简洁代码演讲系列][1] 中的 [全局状态与单例模式][2] 之后的总结。本文的主题是：避免全局可变状态。下面我们将围绕几个问题开展讨论： 什么是全局状态 如何设计好的单例模式 如何设计好的 API 全局状态 什么是全局状态 Talk is cheap, show me t...</description><pubDate>Mon, 30 Nov 2015 07:42:41 GMT</pubDate><category>技术笔记</category><category>编程实践</category><category>设计</category></item><item><title>简洁代码之道（1）：用多态替代条件语句</title><link>https://blog.xiaohansong.com/posts/tech-notes/clean-code-polymorphism/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/clean-code-polymorphism/</guid><description>前言 本文是我看了 [谷歌简洁代码演讲系列][1] 中的 [多态和条件语句][2] 的总结。大部分的条件语句是可以用多态代替的，本文将围绕以下问题开展： 为什么要用多态替代条件语句 多态和条件语句的使用场景 如何用多态代替条件语句 在哪里决定要创建什么子类 什么情况下使用多态 为什么要用多态替代条件...</description><pubDate>Tue, 24 Nov 2015 07:54:43 GMT</pubDate><category>技术笔记</category><category>设计</category><category>编程实践</category></item><item><title>控制反转（IoC）与依赖注入（DI）</title><link>https://blog.xiaohansong.com/posts/tech-notes/ioc-and-di/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/ioc-and-di/</guid><description>前言 最近在学习Spring框架，它的核心就是IoC容器。要掌握Spring框架，就必须要理解控制反转的思想以及依赖注入的实现方式。下面，我们将围绕下面几个问题来探讨控制反转与依赖注入的关系以及在Spring中如何应用。 什么是控制反转？ 什么是依赖注入？ 它们之间有什么关系？ 如何在Spring框...</description><pubDate>Wed, 21 Oct 2015 13:39:57 GMT</pubDate><category>技术笔记</category><category>IoC</category><category>DI</category><category>Java</category></item><item><title>Linux内存寻址之分页机制</title><link>https://blog.xiaohansong.com/posts/tech-notes/linux%E5%86%85%E5%AD%98%E5%AF%BB%E5%9D%80%E4%B9%8B%E5%88%86%E9%A1%B5%E6%9C%BA%E5%88%B6/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/linux%E5%86%85%E5%AD%98%E5%AF%BB%E5%9D%80%E4%B9%8B%E5%88%86%E9%A1%B5%E6%9C%BA%E5%88%B6/</guid><description>在上一篇文章[Linux内存寻址之分段机制][1]中，我们了解逻辑地址通过分段机制转换为线性地址的过程。下面，我们就来看看更加重要和复杂的分页机制。 分页机制在段机制之后进行，以完成线性—物理地址的转换过程。段机制把逻辑地址转换为线性地址，分页机制进一步把该线性地址再转换为物理地址。 硬件中的分页 ...</description><pubDate>Mon, 05 Oct 2015 04:51:06 GMT</pubDate><category>技术笔记</category><category>Linux</category></item><item><title>Linux内存寻址之分段机制</title><link>https://blog.xiaohansong.com/posts/tech-notes/linux%E5%86%85%E5%AD%98%E5%AF%BB%E5%9D%80%E4%B9%8B%E5%88%86%E6%AE%B5%E6%9C%BA%E5%88%B6/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/linux%E5%86%85%E5%AD%98%E5%AF%BB%E5%9D%80%E4%B9%8B%E5%88%86%E6%AE%B5%E6%9C%BA%E5%88%B6/</guid><description>前言 最近在学习Linux内核，读到《深入理解Linux内核》的内存寻址一章。原本以为自己对分段分页机制已经理解了，结果发现其实是一知半解。于是，查找了很多资料，最终理顺了内存寻址的知识。现在把我的理解记录下来，希望对内核学习者有一定帮助，也希望大家指出错误之处。 分段到底是怎么回事 相信学过操作系...</description><pubDate>Sat, 03 Oct 2015 05:56:31 GMT</pubDate><category>技术笔记</category><category>Linux</category></item><item><title>ucore实验之操作系统启动流程</title><link>https://blog.xiaohansong.com/posts/tech-notes/ucore%E5%AE%9E%E9%AA%8C%E4%B9%8B%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/ucore%E5%AE%9E%E9%AA%8C%E4%B9%8B%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B/</guid><description>前言 本文基于 ucore 操作系统实验,简要分析操作系统的启动流程. ucore 操作系统是清华大学用于操作系统教学实验的OS，参考了 MIT 的 JOS，哈佛的 OS161 以及 Linux 系统。我们可以通过这个迷你操作系统在代码层面上理解操作系统的思想。 [ucore labs][1] wa...</description><pubDate>Fri, 02 Oct 2015 08:02:05 GMT</pubDate><category>技术笔记</category><category>操作系统</category><category>ucore</category></item><item><title>Linux 平台下阅读源码的工具</title><link>https://blog.xiaohansong.com/posts/tech-notes/linux%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7%E9%93%BE/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/linux%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7%E9%93%BE/</guid><description>前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码 在Windows下有sourceinsight这个源码阅读软件(虽然我没用过,但是网上评价还不错),由于我是个Linuxer,并不喜欢用Windows,所以自然是选择在Linux下...</description><pubDate>Mon, 24 Aug 2015 02:02:11 GMT</pubDate><category>技术笔记</category><category>Linux</category><category>源代码分析</category></item><item><title>spice源码分析之server(1)</title><link>https://blog.xiaohansong.com/posts/tech-notes/spice%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bserver-1/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/spice%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bserver-1/</guid><description>前言:本文是结合我自己阅读代码的心得总结而来,同时会忽略很多细节,只能作为阅读源码时的参考.如有错误,欢迎指正. Spice简介 Spice是一个开源的云计算解决方案，使客户端能显示远程虚拟主机的操作界面并且使用其设备，如键盘，鼠标，声音等。Spice给用户提供了一种如同操作本地机器一样的体验，同时...</description><pubDate>Wed, 19 Aug 2015 07:36:41 GMT</pubDate><category>技术笔记</category><category>spice</category></item><item><title>理解链接之链接的基本概念</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E9%93%BE%E6%8E%A5%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E9%93%BE%E6%8E%A5%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/</guid><description>前言 我们知道，开发程序的基本流程是：设计 代码编写 编译 链接 执行 每一个步骤展开都是一个很大的课题，链接是一个被人忽略的课题，因为它并不是很复杂，相对于编译来说它还是比较简单的，但是并不代表它不重要。 现在编译链接的环节基本上由IDE帮助我们完成了，于是我们很少关注编译链接。虽然说不懂编译链接...</description><pubDate>Sun, 19 Jul 2015 05:29:13 GMT</pubDate><category>技术笔记</category><category>链接</category></item><item><title>桌面虚拟化传输协议之android spice</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E6%A1%8C%E9%9D%A2%E8%99%9A%E6%8B%9F%E5%8C%96%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE%E4%B9%8Bandroid-spice/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E6%A1%8C%E9%9D%A2%E8%99%9A%E6%8B%9F%E5%8C%96%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE%E4%B9%8Bandroid-spice/</guid><description>背景 云计算是目前计算机领域的一个热门领域，桌面虚拟化是其中的一个重要应用，即把桌面系统在服务器端虚拟化，然后通过传输协议传输数据到客户端来实现桌面虚拟化，这样的好处就在于不管用什么设备，只要通过客户端都可以访问到云端的系统，随时随地都可以在一个系统上工作。 目前有两大标准的桌面传输协议，分别是RB...</description><pubDate>Thu, 16 Jul 2015 04:46:15 GMT</pubDate><category>技术笔记</category><category>虚拟化</category><category>spice</category></item><item><title>算法学习之减治法(decrease and conquer)</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%87%8F%E6%B2%BB%E6%B3%95-decrease-and-conquer/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%87%8F%E6%B2%BB%E6%B3%95-decrease-and-conquer/</guid><description>什么是分治法 减治技术利用了一个问题给定实例的解和同样问题较小实例的解之间的某种关系。一旦建立了这种关系，就可以从顶至下递归的来用该关系，也可以从底至上非递归的来运用该关系： 1. 减去一个常量 2. 减去一个常量因子 3. 减去的规模是可变的 分治法例子 减去一个常量 拓扑排序 定义 定义：将有向...</description><pubDate>Mon, 22 Jun 2015 02:55:13 GMT</pubDate><category>技术笔记</category><category>算法</category><category>减治法</category></item><item><title>算法学习之分治法(divide and conquer)</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%88%86%E6%B2%BB%E6%B3%95-divide-and-conquer/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%88%86%E6%B2%BB%E6%B3%95-divide-and-conquer/</guid><description>什么是分治法 字面上的解释是“分而治之”，就是把一个复杂的问题分成两个或更多的相同或相似的子问题，直到最后子问题可以简单的直接求解，原问题的解即子问题的解的合并。 解决问题的流程 分治法适用情况 分治法所能解决的问题一般具有以下几个特征： 1. 该问题的规模缩小到一定的程度就可以容易地解决 2. 该...</description><pubDate>Thu, 18 Jun 2015 10:50:50 GMT</pubDate><category>技术笔记</category><category>分治法</category><category>算法</category></item><item><title>算法学习之暴力求解(brute force)</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E4%B9%8B%E6%9A%B4%E5%8A%9B%E6%B1%82%E8%A7%A3-brute-force/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E4%B9%8B%E6%9A%B4%E5%8A%9B%E6%B1%82%E8%A7%A3-brute-force/</guid><description>暴力求解(brute force) Brute force is a straightforward approach to solving a problem, usually directly based on the problem statement and definitions of t...</description><pubDate>Thu, 18 Jun 2015 08:53:51 GMT</pubDate><category>技术笔记</category><category>暴力求解</category><category>算法</category></item><item><title>算法学习之算法基本概念</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E7%AE%97%E6%B3%95%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E7%AE%97%E6%B3%95%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/</guid><description>算法的定义 An algorithm is a sequence of unambiguous instructions for solving a problem 即算法是解决问题的无二义性的指令序列.简单说就是用来解决问题步骤. 算法设计及实现流程 重要的问题类型 Sorting Searchi...</description><pubDate>Thu, 18 Jun 2015 08:18:24 GMT</pubDate><category>技术笔记</category><category>算法</category></item><item><title>用hexo搭建github博客</title><link>https://blog.xiaohansong.com/posts/tech-notes/%E7%94%A8hexo%E6%90%AD%E5%BB%BAgithub%E5%8D%9A%E5%AE%A2/</link><guid isPermaLink="true">https://blog.xiaohansong.com/posts/tech-notes/%E7%94%A8hexo%E6%90%AD%E5%BB%BAgithub%E5%8D%9A%E5%AE%A2/</guid><description>背景 搭建环境:Linux,nodejs,npm,git 现在网上已经有很多关于搭建hexo github博客的文章,我自己也是参考别人的文章过来的,但是现在hexo已经到了3.0版本,很多教程都过时了,而且感觉他们教程的思路着重于怎么做,并没有说明背后的原因,所以我希望写一篇着重于 为什么 ,而不...</description><pubDate>Wed, 17 Jun 2015 02:14:18 GMT</pubDate><category>技术笔记</category><category>hexo</category><category>github</category></item></channel></rss>