<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Yousa Driven Development | YDD</title><link>https://yousali.com/</link><description>Recent content on Yousa Driven Development | YDD</description><generator>Hugo -- 0.148.1</generator><language>zh</language><lastBuildDate>Sun, 05 Apr 2026 01:51:48 +0800</lastBuildDate><atom:link href="https://yousali.com/index.xml" rel="self" type="application/rss+xml"/><item><title>一文读懂 Harness Engineering：从 14 篇工程文章中，寻找那个让 AI 不再离经叛道的壳</title><link>https://yousali.com/posts/20260405-harness-engineering-guide/</link><pubDate>Sun, 05 Apr 2026 12:00:00 +0800</pubDate><guid>https://yousali.com/posts/20260405-harness-engineering-guide/</guid><description>从 Anthropic、OpenAI、Cursor 三家头部公司的 14 篇工程文章出发，拆解 Harness Engineering 的三层架构：流程管控、并发调度、验证对抗，以及模型进步后的减法逻辑。</description></item><item><title>你不是在选赛道，你是在选标签</title><link>https://yousali.com/posts/20260325-choosing-labels-not-tracks/</link><pubDate>Wed, 25 Mar 2026 12:00:00 +0800</pubDate><guid>https://yousali.com/posts/20260325-choosing-labels-not-tracks/</guid><description>To B 还是 To C？这个问题本身就问错了。标签是沟通工具，不该替你做决策。</description></item><item><title>为什么你读了100本书，生活却没什么变化？</title><link>https://yousali.com/posts/20260307-closed-loop-thinking/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0800</pubDate><guid>https://yousali.com/posts/20260307-closed-loop-thinking/</guid><description>大多数人的努力只有输入没有输出，缺少反馈闭环。闭环不是把事做完，是让判断变准。先执行，再观测，用结果校准下一次判断。</description></item><item><title>为什么 AI 写代码更快但交付没变，以及我怎么把它扳回来的</title><link>https://yousali.com/posts/20260303-ai-coding-efficiency-to-evolution/</link><pubDate>Tue, 03 Mar 2026 12:00:00 +0800</pubDate><guid>https://yousali.com/posts/20260303-ai-coding-efficiency-to-evolution/</guid><description>METR 实验显示 AI 辅助编码客观慢 19% 但主观觉得快 20%。本文从约束理论、Spec/Rule/Skill 架构、验证闭环、并发策略四个维度拆解效率悖论，论证 AI Coding 的真正红利不在加速，而在能力进化。</description></item><item><title>AI Coding 融入后台研发全链路：现状、边界与讨论框架</title><link>https://yousali.com/posts/20260228-ai-coding-sdlc-status-discussion/</link><pubDate>Sat, 28 Feb 2026 12:00:00 +0800</pubDate><guid>https://yousali.com/posts/20260228-ai-coding-sdlc-status-discussion/</guid><description>基于 10 份行业报告的交叉分析，梳理 AI Coding 在 SDLC 各阶段的真实现状、局限与风险，为团队脑暴提供数据驱动的讨论框架。</description></item><item><title>多源报告结构化分析 SOP</title><link>https://yousali.com/posts/20260227-multi-source-report-structured-analysis-sop/</link><pubDate>Fri, 27 Feb 2026 10:00:00 +0800</pubDate><guid>https://yousali.com/posts/20260227-multi-source-report-structured-analysis-sop/</guid><description>一套可复用的方法论，用于从 N 份异质来源报告中系统性提取、分析、对比某一维度信息，并产出结构化交叉分析文档。</description></item><item><title>省10秒，赔一个早上</title><link>https://yousali.com/posts/20260221-save-10-seconds/</link><pubDate>Sat, 21 Feb 2026 02:00:00 +0800</pubDate><guid>https://yousali.com/posts/20260221-save-10-seconds/</guid><description>一次倒火锅油堵塞水槽的经历，让我重新思考了&amp;#39;粗心&amp;#39;与&amp;#39;认知盲区&amp;#39;的区别，以及为什么&amp;#39;下次注意&amp;#39;从来不管用。</description></item><item><title>不要让 AI 批改自己的试卷 —— 一次 16 处遗漏的协作复盘</title><link>https://yousali.com/posts/20260218-ai-collaboration-acceptance-blindspots/</link><pubDate>Wed, 18 Feb 2026 13:12:00 +0800</pubDate><guid>https://yousali.com/posts/20260218-ai-collaboration-acceptance-blindspots/</guid><description>169 个测试全过，功能却完全失效。本文解剖一个真实任务的四层验收漏斗，揭示多层架构中横向传播遗漏的本质问题——以及不同 Prompt 策略如何决定验收效率。</description></item><item><title>从一个 WebSocket 到四个组件：多端操控 AI Coding CLI 的架构演化</title><link>https://yousali.com/posts/20260217-websocket-to-four-components/</link><pubDate>Tue, 17 Feb 2026 09:50:00 +0800</pubDate><guid>https://yousali.com/posts/20260217-websocket-to-four-components/</guid><description>从最简方案开始，每遇到一个绕不过去的约束就加一个组件。四层方案逐层淘汰，最终发现四组件是五个硬约束逐层叠加的必然结果。</description></item><item><title>用 300 行 Swift 让 iPhone 变成 Kimi CLI 控制台</title><link>https://yousali.com/posts/20260216-swift-kimi-cli-console/</link><pubDate>Mon, 16 Feb 2026 01:20:00 +0800</pubDate><guid>https://yousali.com/posts/20260216-swift-kimi-cli-console/</guid><description>用约 300 行 Swift 代码，零第三方依赖，把 iPhone 变成功能完备的 Kimi CLI 控制台。详解 Web UI 架构、Wire 协议和 iOS 封装实现。</description></item><item><title>选工作，你在看朋友圈还是体检报告？</title><link>https://yousali.com/posts/20260214-choose-leader-signal-vs-system/</link><pubDate>Sat, 14 Feb 2026 12:30:00 +0800</pubDate><guid>https://yousali.com/posts/20260214-choose-leader-signal-vs-system/</guid><description>「跟对人」没有错，但「对的人」不是一眼看上去让你兴奋的人，而是经得起去光环化检验的人</description></item><item><title>为什么有些人越忙越穷，有些人越闲越富</title><link>https://yousali.com/posts/20260214-busy-poor-vs-leveraged-wealth/</link><pubDate>Sat, 14 Feb 2026 00:30:00 +0800</pubDate><guid>https://yousali.com/posts/20260214-busy-poor-vs-leveraged-wealth/</guid><description>从学习到工作，从打工到创业，四个故事揭示一个反直觉的真相：忙碌不等于高产出。线性努力有天花板，杠杆化努力才有指数增长的可能。</description></item><item><title>当浏览器自动化遇上平台风控：一次小红书发布工具的反检测实战</title><link>https://yousali.com/posts/20260213-browser-automation-anti-detection/</link><pubDate>Fri, 13 Feb 2026 10:00:00 +0800</pubDate><guid>https://yousali.com/posts/20260213-browser-automation-anti-detection/</guid><description>国内内容平台没有开放API，浏览器自动化是唯一出路。但平台风控会检测自动化痕迹。本文记录了一次完整的反检测实战：从 Playwright 被封到 Patchright + CDP 模式的调试全过程，踩过 7 个具体的坑，提炼出可复用的原则。</description></item><item><title>追赶者困境</title><link>https://yousali.com/posts/20260113-the-chaser-dilemma/</link><pubDate>Tue, 13 Jan 2026 15:14:51 +0800</pubDate><guid>https://yousali.com/posts/20260113-the-chaser-dilemma/</guid><description>从大模型降价与云计算追赶案例出发，讨论追赶者优势如何转化为价格战，以及领先者通过生态与用户习惯形成的结构性壁垒。</description></item><item><title>像玩游戏那样玩 AI</title><link>https://yousali.com/posts/20251229-how-to-use-ai-like-game/</link><pubDate>Mon, 29 Dec 2025 13:36:11 +0800</pubDate><guid>https://yousali.com/posts/20251229-how-to-use-ai-like-game/</guid><description>你对抖音没有学习意愿，但能刷三小时；你对 AI 充满学习意愿，但用不了十分钟。区别不在意志力，而在于谁设计了那个让你停不下来的循环。</description></item><item><title>我，一个重度极客用户，为什么觉得这代 AI 眼镜不适合我</title><link>https://yousali.com/posts/why-current-ai-glasses-fail-the-geek-test/</link><pubDate>Thu, 11 Dec 2025 01:14:15 +0800</pubDate><guid>https://yousali.com/posts/why-current-ai-glasses-fail-the-geek-test/</guid><description>用《跨越鸿沟》的框架，系统性拆解为什么这一代 AI 眼镜——以夸克 AI 眼镜为代表——还没有真正跨过从早期用户到主流市场的那条鸿沟。</description></item><item><title>从「写代码」到「验代码」：AI 搭档写走 3 年，我踩出来的协作路线图</title><link>https://yousali.com/posts/20251124-how-to-coding-with-ai/</link><pubDate>Mon, 24 Nov 2025 12:29:36 +0800</pubDate><guid>https://yousali.com/posts/20251124-how-to-coding-with-ai/</guid><description>&lt;h2 id="当-30-代码都由-ai-写出来我们该把时间花在哪">当 30% 代码都由 AI 写出来，我们该把时间花在哪？&lt;/h2>
&lt;blockquote>
&lt;p>&lt;em>从「写代码」到「验代码」的三年实战笔记&lt;/em>&lt;/p>&lt;/blockquote>
&lt;p>2022 年，我第一次在生产项目里用上 VS Code 的 Copilot，用它来写一个再普通不过的后端接口：登录、校验、打点日志。&lt;/p></description></item><item><title>Claude Code 还是 Codex？贵但强 vs 便宜但稳</title><link>https://yousali.com/posts/20251016-claudecode-vs-codex/</link><pubDate>Thu, 16 Oct 2025 13:34:27 +0800</pubDate><guid>https://yousali.com/posts/20251016-claudecode-vs-codex/</guid><description>Claude Code 每次任务花 $10，Codex 只要 $2.5——但贵4倍能换来什么？基于同一仓库的端到端实测：14维度对比、10项基准测试、真实项目成本拆解，看清每一分钱花在哪。</description></item><item><title>为什么所有产品最后都要长出社交？</title><link>https://yousali.com/posts/20251010-product-im/</link><pubDate>Fri, 10 Oct 2025 13:47:40 +0800</pubDate><guid>https://yousali.com/posts/20251010-product-im/</guid><description>从 2013 年到 2025 年，我查了一圈历史，试着搞清楚陈冕为什么说「最大的 ToC 应用是社交」。工具解决问题，内容填补时间，只有社交能回答&amp;#39;我是谁&amp;#39;。</description></item><item><title>AI经济学术语速查手册</title><link>https://yousali.com/posts/20251006-ai-economy-keyword-list/</link><pubDate>Mon, 06 Oct 2025 17:40:39 +0800</pubDate><guid>https://yousali.com/posts/20251006-ai-economy-keyword-list/</guid><description>整理了AI+经济学/计量+业务实践中的高频术语，涵盖核心概念、商业财务、AI技术和研究方法四大分类，共116个专业术语详解</description></item><item><title>GenAI 工具选购和决策指南</title><link>https://yousali.com/posts/20251003-how-to-jump-genai-gap/</link><pubDate>Fri, 03 Oct 2025 17:58:36 +0800</pubDate><guid>https://yousali.com/posts/20251003-how-to-jump-genai-gap/</guid><description>基于 MIT/McKinsey/IDC/Snowflake 四份报告的 GenAI 工具选购决策框架。深度分析 Buy vs Build 的 ROI 对比，提供 CTO、研发负责人、采购者的实践清单。解读 95% 失败案例 vs 5% 成功经验的关键差异。</description></item><item><title>OpenAI研究揭秘：7亿用户如何使用ChatGPT</title><link>https://yousali.com/posts/20250918-openai-how-people-use-chatgpt/</link><pubDate>Thu, 18 Sep 2025 00:53:37 +0800</pubDate><guid>https://yousali.com/posts/20250918-openai-how-people-use-chatgpt/</guid><description>OpenAI最新研究论文深度解析：基于150万次对话分析，揭示全球7亿ChatGPT用户的真实使用模式和行为特征</description></item><item><title>我那套混乱的排序算法：从忙碌焦虑到注意力投资</title><link>https://yousali.com/posts/20250913-energy-management/</link><pubDate>Sat, 13 Sep 2025 21:06:22 +0800</pubDate><guid>https://yousali.com/posts/20250913-energy-management/</guid><description>当日程表越满焦虑感越强时，问题的根源不是时间管理技巧，而是内心那套将紧急性等同于重要性、将新奇感等同于价值的混乱排序算法。</description></item><item><title>从副驾驶到架构师：我的AI编程协作方法论</title><link>https://yousali.com/posts/20250830-claude-code-workshop/</link><pubDate>Sat, 30 Aug 2025 15:30:00 +0800</pubDate><guid>https://yousali.com/posts/20250830-claude-code-workshop/</guid><description>分享我从使用GPT到Claude Code的AI编程实践历程，以及总结出的结构化协作方法论。包括四要素Prompt框架、四阶段协作流程、四象限决策模型等个人原创和实践总结。</description></item><item><title>拆解 ChatGPT“学习模式”Prompt：它为什么如此神奇？</title><link>https://yousali.com/posts/20250805-study-mode-prompt/</link><pubDate>Tue, 05 Aug 2025 10:00:00 +0800</pubDate><guid>https://yousali.com/posts/20250805-study-mode-prompt/</guid><description>深度拆解ChatGPT学习模式的系统提示词，揭秘它如何将认知科学原理转化为可执行的AI指令，并动手重构一个属于自己的学习教练Prompt。</description></item><item><title>王者</title><link>https://yousali.com/posts/20250727-game-art-game-pua/</link><pubDate>Sun, 27 Jul 2025 00:17:01 +0800</pubDate><guid>https://yousali.com/posts/20250727-game-art-game-pua/</guid><description>从一个王者印记开始的思考：游戏公司要的不是你的钱，而是你的时间</description></item><item><title>30分钟解决Claude封号问题：程序员的终极自救指南</title><link>https://yousali.com/posts/20250715-how-to-pick-and-build-the-vps-svc/</link><pubDate>Fri, 25 Jul 2025 15:15:25 +0800</pubDate><guid>https://yousali.com/posts/20250715-how-to-pick-and-build-the-vps-svc/</guid><description>详细介绍如何通过自建VPS解决Claude封号问题，包含完整的服务器搭建、客户端配置和开发工具设置步骤，让你稳定使用Claude Code等AI开发工具</description></item><item><title>与 AI 共事，或，思考的放大器</title><link>https://yousali.com/posts/20250719--ai-/</link><pubDate>Sat, 19 Jul 2025 17:24:45 +0800</pubDate><guid>https://yousali.com/posts/20250719--ai-/</guid><description>AI的真正价值不在于它能独立思考，而在于它能放大和加速我们的思考。这篇文章通过一个写推荐语的实例，探讨了如何正确地与AI协作，以及思考质量在AI时代的重要性。</description></item><item><title>解决Cursor AI编程助手「地区不可用」错误：完整的VPN代理配置指南</title><link>https://yousali.com/posts/20250717-fix-cursor-unavailable-region/</link><pubDate>Thu, 17 Jul 2025 12:16:22 +0800</pubDate><guid>https://yousali.com/posts/20250717-fix-cursor-unavailable-region/</guid><description>Cursor AI编程助手显示「Model not available」或「地区不可用」？本文提供详细的代理配置解决方案，包括Clash、V2Ray等工具的具体设置步骤，让你重新使用AI编程功能。</description></item><item><title>当 nil 不等于 nil？深度剖析 Go 的 typed nil 大坑</title><link>https://yousali.com/posts/20250515-go-typed-nil/</link><pubDate>Thu, 15 May 2025 17:39:47 +0800</pubDate><guid>https://yousali.com/posts/20250515-go-typed-nil/</guid><description>&lt;h2 id="0-一个能悄悄坑你的真实示例serror-的故事">0. 一个能“悄悄坑你”的真实示例：&lt;code>SError&lt;/code> 的故事&lt;/h2>
&lt;p>先看你提到的这段代码，表面上看非常正常，甚至很多人第一眼不会觉得哪里有问题：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt" id="hl-0-1">&lt;a class="lnlinks" href="#hl-0-1"> 1&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-2">&lt;a class="lnlinks" href="#hl-0-2"> 2&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-3">&lt;a class="lnlinks" href="#hl-0-3"> 3&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-4">&lt;a class="lnlinks" href="#hl-0-4"> 4&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-5">&lt;a class="lnlinks" href="#hl-0-5"> 5&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-6">&lt;a class="lnlinks" href="#hl-0-6"> 6&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-7">&lt;a class="lnlinks" href="#hl-0-7"> 7&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-8">&lt;a class="lnlinks" href="#hl-0-8"> 8&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-9">&lt;a class="lnlinks" href="#hl-0-9"> 9&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-10">&lt;a class="lnlinks" href="#hl-0-10">10&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-11">&lt;a class="lnlinks" href="#hl-0-11">11&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-12">&lt;a class="lnlinks" href="#hl-0-12">12&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-13">&lt;a class="lnlinks" href="#hl-0-13">13&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-14">&lt;a class="lnlinks" href="#hl-0-14">14&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-15">&lt;a class="lnlinks" href="#hl-0-15">15&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-16">&lt;a class="lnlinks" href="#hl-0-16">16&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-17">&lt;a class="lnlinks" href="#hl-0-17">17&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-18">&lt;a class="lnlinks" href="#hl-0-18">18&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-19">&lt;a class="lnlinks" href="#hl-0-19">19&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-20">&lt;a class="lnlinks" href="#hl-0-20">20&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-21">&lt;a class="lnlinks" href="#hl-0-21">21&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-22">&lt;a class="lnlinks" href="#hl-0-22">22&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-23">&lt;a class="lnlinks" href="#hl-0-23">23&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-24">&lt;a class="lnlinks" href="#hl-0-24">24&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-25">&lt;a class="lnlinks" href="#hl-0-25">25&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-26">&lt;a class="lnlinks" href="#hl-0-26">26&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-27">&lt;a class="lnlinks" href="#hl-0-27">27&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-28">&lt;a class="lnlinks" href="#hl-0-28">28&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-29">&lt;a class="lnlinks" href="#hl-0-29">29&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-30">&lt;a class="lnlinks" href="#hl-0-30">30&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-31">&lt;a class="lnlinks" href="#hl-0-31">31&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-32">&lt;a class="lnlinks" href="#hl-0-32">32&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-33">&lt;a class="lnlinks" href="#hl-0-33">33&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-34">&lt;a class="lnlinks" href="#hl-0-34">34&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-go" data-lang="go">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">package&lt;/span> &lt;span class="nx">main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;log&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;sync&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">type&lt;/span> &lt;span class="nx">SError&lt;/span> &lt;span class="kd">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">cause&lt;/span> &lt;span class="kt">error&lt;/span> &lt;span class="c1">// Wrapped error which is the root cause.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">text&lt;/span> &lt;span class="kt">string&lt;/span> &lt;span class="c1">// Error text, which is created by New* functions.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">i18nText&lt;/span> &lt;span class="kt">string&lt;/span> &lt;span class="c1">// 本地错误文字，用于客户端显式中文&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">ignored&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="c1">// 能否忽略该错误&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">info&lt;/span> &lt;span class="kd">map&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="kt">string&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="kt">string&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">infoMutex&lt;/span> &lt;span class="nx">sync&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">RWMutex&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">e&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nx">SError&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">Error&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="kt">string&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">e&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">text&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// demoRetSerr 返回 (int32, *SError)。看上去，如果不想返回任何错误，就直接返回 (0, nil)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">demoRetSerr&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int32&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nx">SError&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">nil&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">err&lt;/span> &lt;span class="kt">error&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 这里把第二个返回值的 *SError 赋给了 interface{} 类型的 err&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">_&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">err&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nf">demoRetSerr&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nx">err&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="kc">nil&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">log&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;err != nil. err: %v&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">err&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="01-乍看之下哪里会有问题">0.1 乍看之下哪里会有问题？&lt;/h3>
&lt;ul>
&lt;li>我们 &lt;code>demoRetSerr&lt;/code> 函数直接返回 &lt;code>(0, nil)&lt;/code>，而函数签名的第二个参数类型是 &lt;code>*SError&lt;/code>。&lt;/li>
&lt;li>回到 &lt;code>main&lt;/code> 函数中，&lt;code>err&lt;/code> 是一个 &lt;code>error&lt;/code> 接口，承接了那个 &lt;code>nil&lt;/code> 指针。&lt;/li>
&lt;li>如果“typed nil” 现象出现，那么 &lt;code>err != nil&lt;/code> 这个判断就会莫名其妙地通过，从而在日志里打印出“err != nil. err: &amp;lt;nil&amp;gt;”。有时更可怕的是，&lt;strong>实际逻辑会被误判&lt;/strong>，可能执行本不该执行的错误处理分支。&lt;/li>
&lt;/ul>
&lt;p>在某些 Go 版本或特定编译器优化下，你可能发现控制台就输出 &lt;code>err != nil. err: &amp;lt;nil&amp;gt;&lt;/code>，让人“一头雾水”。这就是一个十分典型、却很隐蔽的 &lt;strong>typed nil&lt;/strong> 场景。即使你写 &lt;code>return nil&lt;/code>，对编译器来说：&lt;/p></description></item><item><title>畅享 ChatGPT Plus：无需额外支付手段，突破 OpenAI 支付风控</title><link>https://yousali.com/posts/20240423-openai-register/</link><pubDate>Tue, 23 Apr 2024 17:39:47 +0800</pubDate><guid>https://yousali.com/posts/20240423-openai-register/</guid><description>&lt;blockquote>
&lt;p>截至 2024 年 2 月 10 日，该教程仍然有效。我已根据此教程重新操作并成功充值。请注意，购买苹果充值卡时应确保从苹果官方网站购买。&lt;/p>&lt;/blockquote>
&lt;p>&lt;img loading="lazy" src="https://raw.githubusercontent.com/Miss-you/img/master/picgo/20240423-164227-1-28fd8bc46d10a26c0e639aeb5ec9862f.jpg">&lt;/p>
&lt;h2 id="chatgpt-plus-的优势">ChatGPT Plus 的优势&lt;/h2>
&lt;ol>
&lt;li>GPT-4 的性能非常强大，这是众所周知的事实。&lt;/li>
&lt;li>Plus 会员可以使用 ChatGPT 的在线和插件功能，这些功能将极大地增强你的创造力，并为你的个人学习和工作效率提供强大的支持工具。&lt;/li>
&lt;/ol>
&lt;p>&lt;img loading="lazy" src="https://raw.githubusercontent.com/Miss-you/img/master/picgo/20240423-164227-2-dfc46547e57fa80736a6925189a7e577.jpg">&lt;/p></description></item><item><title>【译】创业生存手册：如何有效地打造产品、组建团队并筹集资金</title><link>https://yousali.com/posts/20230703-startup-playbook/</link><pubDate>Mon, 03 Jul 2023 17:39:47 +0800</pubDate><guid>https://yousali.com/posts/20230703-startup-playbook/</guid><description>个人认为，大公司内的小团队或创新团队与创业公司在诸多方面有着密切的相似性。两者都面临着从零开始，将一个概念或想法转化为可行产品或服务的挑战。他们都需要快速地适应和学习，寻找产品与市场的契合点，同时也要不断地迭代产品，以满足不断变化的市场需求。在这两种环境中，都需要强大的领导力和管理才能以及优秀的团队成员。而且，他们都需要面对并管理风险，同时在有限的资源下取得最大的产出。因此，无论你是处于创业环境还是大公司的创新团队，本文都会为你提供极大的价值。Sam Altman的经验和洞察将帮助你更好地理解如何建立并领导一支成功的团队，如何募集资金，如何处理竞争，以及如何建立持久并能够盈利的公司。</description></item><item><title>提升专注力的七种方法</title><link>https://yousali.com/posts/20230421-7-ways-to-stay-focused/</link><pubDate>Fri, 21 Apr 2023 17:39:47 +0800</pubDate><guid>https://yousali.com/posts/20230421-7-ways-to-stay-focused/</guid><description>让思维更聚焦，让生活更高效</description></item><item><title>为什么 JSON 需要转义</title><link>https://yousali.com/posts/json-and-escaping/</link><pubDate>Tue, 05 Jan 2021 01:21:26 +0800</pubDate><guid>https://yousali.com/posts/json-and-escaping/</guid><description>&lt;h1 id="为什么-json-需要转义">为什么 JSON 需要转义？&lt;/h1>
&lt;p>[TOC]&lt;/p>
&lt;blockquote>
&lt;p>适合人群：入门级&lt;/p>&lt;/blockquote>
&lt;h2 id="json-和-json-转义">JSON 和 JSON 转义&lt;/h2>
&lt;p>21 世纪初，Douglas Crockford 寻找一种简便的数据交换格式，能够在服务器之间交换数据。当时通用的数据交换语言是 XML，但是 Douglas Crockford 觉得 XML 的生成和解析都太麻烦，所以他提出了一种简化格式，也就是 JSON。&lt;/p></description></item><item><title>《欧洲绘画五百年》参观有感</title><link>https://yousali.com/posts/history-of-western-painting/</link><pubDate>Mon, 28 Dec 2020 22:43:47 +0800</pubDate><guid>https://yousali.com/posts/history-of-western-painting/</guid><description>《欧洲绘画五百年》参观有感</description></item><item><title>从 nginx 热更新聊一聊 Golang 中的热更新</title><link>https://yousali.com/posts/server-hot-update/</link><pubDate>Mon, 28 Dec 2020 01:23:35 +0800</pubDate><guid>https://yousali.com/posts/server-hot-update/</guid><description>&lt;h1 id="从-nginx-热更新聊一聊-golang-中的热更新">从 nginx 热更新聊一聊 Golang 中的热更新&lt;/h1>
&lt;blockquote>
&lt;p>静态语言在服务器编程时都会遇到这样的问题：如何保证已有的连接服务不中断同时又升级版本？
最近花了点时间看了下 nginx 热更新代码流程，想了下结合之前的经验一并总结下热更新&lt;/p></description></item><item><title>获取服务器本机 IP 的不同语言实现</title><link>https://yousali.com/posts/how-to-get-localip/</link><pubDate>Wed, 25 Nov 2020 03:11:02 +0800</pubDate><guid>https://yousali.com/posts/how-to-get-localip/</guid><description>&lt;h2 id="cc-版本">C/C++ 版本&lt;/h2>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt" id="hl-0-1">&lt;a class="lnlinks" href="#hl-0-1"> 1&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-2">&lt;a class="lnlinks" href="#hl-0-2"> 2&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-3">&lt;a class="lnlinks" href="#hl-0-3"> 3&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-4">&lt;a class="lnlinks" href="#hl-0-4"> 4&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-5">&lt;a class="lnlinks" href="#hl-0-5"> 5&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-6">&lt;a class="lnlinks" href="#hl-0-6"> 6&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-7">&lt;a class="lnlinks" href="#hl-0-7"> 7&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-8">&lt;a class="lnlinks" href="#hl-0-8"> 8&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-9">&lt;a class="lnlinks" href="#hl-0-9"> 9&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-10">&lt;a class="lnlinks" href="#hl-0-10">10&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-11">&lt;a class="lnlinks" href="#hl-0-11">11&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-12">&lt;a class="lnlinks" href="#hl-0-12">12&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-13">&lt;a class="lnlinks" href="#hl-0-13">13&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-14">&lt;a class="lnlinks" href="#hl-0-14">14&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-15">&lt;a class="lnlinks" href="#hl-0-15">15&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-16">&lt;a class="lnlinks" href="#hl-0-16">16&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-17">&lt;a class="lnlinks" href="#hl-0-17">17&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-18">&lt;a class="lnlinks" href="#hl-0-18">18&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-19">&lt;a class="lnlinks" href="#hl-0-19">19&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-20">&lt;a class="lnlinks" href="#hl-0-20">20&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-21">&lt;a class="lnlinks" href="#hl-0-21">21&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-22">&lt;a class="lnlinks" href="#hl-0-22">22&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-23">&lt;a class="lnlinks" href="#hl-0-23">23&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-24">&lt;a class="lnlinks" href="#hl-0-24">24&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-25">&lt;a class="lnlinks" href="#hl-0-25">25&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-26">&lt;a class="lnlinks" href="#hl-0-26">26&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-27">&lt;a class="lnlinks" href="#hl-0-27">27&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-28">&lt;a class="lnlinks" href="#hl-0-28">28&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-29">&lt;a class="lnlinks" href="#hl-0-29">29&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-30">&lt;a class="lnlinks" href="#hl-0-30">30&lt;/a>
&lt;/span>&lt;span class="lnt" id="hl-0-31">&lt;a class="lnlinks" href="#hl-0-31">31&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="ne">int&lt;/span> &lt;span class="n">CNetOperations&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">GetLocalIp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">__be32&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">pLocalIp&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">char&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">pIfName&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">pLocalIp&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="o">!&lt;/span>&lt;span class="n">pIfName&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">EINVAL&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="ne">int&lt;/span> &lt;span class="n">iSocket&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">iSocket&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">socket&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">AF_INET&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SOCK_DGRAM&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">iSocket&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">errno&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">struct&lt;/span> &lt;span class="n">ifreq&lt;/span> &lt;span class="n">stIfr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">memset&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stIfr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ifr_name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stIfr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ifr_name&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">strcpy&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stIfr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ifr_name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pIfName&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="ne">int&lt;/span> &lt;span class="n">iRet&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">iRet&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ioctl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iSocket&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SIOCGIFADDR&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">stIfr&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">iRet&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">close&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iSocket&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">errno&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">pLocalIp&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="n">struct&lt;/span> &lt;span class="n">sockaddr_in&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">stIfr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ifr_addr&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">sin_addr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">s_addr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">close&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iSocket&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="golang-版本">golang 版本&lt;/h2>
&lt;h2 id="shell-版本">shell 版本&lt;/h2>
&lt;p>最初的想法&lt;/p></description></item><item><title>perf 入门教程（待补充和完善）</title><link>https://yousali.com/posts/perf/</link><pubDate>Wed, 25 Nov 2020 02:54:43 +0800</pubDate><guid>https://yousali.com/posts/perf/</guid><description>&lt;h1 id="perf-使用教程">perf 使用教程&lt;/h1>
&lt;h2 id="perf-简介">perf 简介&lt;/h2>
&lt;p>Perf 是 Linux kernel 中的系统性能优化工具，perf 基本原理的话是在 CPU 的 PMU register 中 Get/Set performance counters 来获得诸如 instructions executed，cache-missed suffered，branches mispredicted 等信息。&lt;/p></description></item><item><title>性能调优利器--火焰图</title><link>https://yousali.com/posts/flame/</link><pubDate>Wed, 25 Nov 2020 02:39:47 +0800</pubDate><guid>https://yousali.com/posts/flame/</guid><description>本文主要分享火焰图使用技巧，介绍 systemtap 的原理机制，如何使用火焰图快速定位性能问题原因，同时加深对 systemtap 的理解。</description></item><item><title>使用 Github Pages 和 Hugo 搭建个人博客教程</title><link>https://yousali.com/posts/how-to-create-blog/</link><pubDate>Sat, 10 Oct 2020 03:03:29 +0800</pubDate><guid>https://yousali.com/posts/how-to-create-blog/</guid><description>Github Pages 建站教程</description></item><item><title>Go 语言：解决数据库中 null 值的问题</title><link>https://yousali.com/posts/go-mysql-null/</link><pubDate>Thu, 08 Oct 2020 00:46:23 +0800</pubDate><guid>https://yousali.com/posts/go-mysql-null/</guid><description>本文主要介绍如何使用 go 语言 database/sql 库从数据库中读取 null 值的问题，以及如何向数据库中插入 null 值。本文在这里使用的是 sql.NullString, sql.NullInt64, sql.NullFloat64 等结构体，为了方便书写，它们的泛指我会使用 sql.Null 来表示.</description></item><item><title/><link>https://yousali.com/posts/how-to-control-claude-to-write/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yousali.com/posts/how-to-control-claude-to-write/</guid><description>&lt;h3 id="1-设定写作目标与受众">1️⃣ 设定写作目标与受众&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>要素&lt;/th>
&lt;th>提问 Claude Code 的示例&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>目标&lt;/td>
&lt;td>“我想写一篇面向中级后端开发者的文章，帮助他们理解 &lt;strong>Event Sourcing&lt;/strong> 的核心概念并快速上手。”&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>受众痛点&lt;/td>
&lt;td>“这些读者通常困惑于日志增长、回放性能和一致性验证，请给我一份简要需求清单。”&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>技巧&lt;/strong>：把“读者画像 + 阅读后应会什么”一次性告诉模型，可显著提升后续输出的精准度。&lt;/p></description></item></channel></rss>