<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>文档 on Hardy Blog</title><link>https://zel-forprogress.github.io/blog/wendang/</link><description>Recent content in 文档 on Hardy Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 02 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://zel-forprogress.github.io/blog/wendang/index.xml" rel="self" type="application/rss+xml"/><item><title>curl命令</title><link>https://zel-forprogress.github.io/blog/wendang/curl%E5%91%BD%E4%BB%A4/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/curl%E5%91%BD%E4%BB%A4/</guid><description>&lt;p&gt;&lt;code&gt;curl&lt;/code&gt; 是一个非常强大的命令行工具，它用于与服务器交换数据。通过 &lt;code&gt;curl&lt;/code&gt;，你可以向服务器发送 HTTP 请求，下载或上传文件，甚至与 API 进行交互。它支持多种协议，如 HTTP、HTTPS、FTP、FTPS、SFTP、SMTP 等等。&lt;/p&gt;
&lt;h3 id="基本语法"&gt;基本语法：&lt;a class="anchor" href="#%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl &lt;span style="color:#f92672"&gt;[&lt;/span&gt;选项&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;URL&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="常见用途"&gt;常见用途：&lt;a class="anchor" href="#%e5%b8%b8%e8%a7%81%e7%94%a8%e9%80%94"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;获取网页内容&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl http://example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这条命令将会获取 &lt;code&gt;example.com&lt;/code&gt; 网站的 HTML 内容并显示在终端上。&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;strong&gt;下载文件&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -O https://example.com/file.zip&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;-O&lt;/code&gt; 选项可以将文件下载到本地并保留原文件名。&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;发送 POST 请求&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -X POST -d &amp;#34;username=user&amp;amp;password=pass&amp;#34; http://example.com/login&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这条命令向 &lt;code&gt;example.com/login&lt;/code&gt; 发送一个 POST 请求，数据为 &lt;code&gt;username=user&amp;amp;password=pass&lt;/code&gt;。&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;strong&gt;上传文件&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -X POST -F &amp;#34;file=@/path/to/file&amp;#34; http://example.com/upload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;-F&lt;/code&gt; 选项可以发送文件，&lt;code&gt;@&lt;/code&gt; 后跟文件路径表示上传的文件。&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;strong&gt;获取响应头&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -I http://example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-I&lt;/code&gt; 选项只获取响应的头部信息。&lt;/p&gt;
&lt;ol start="6"&gt;
&lt;li&gt;&lt;strong&gt;发送自定义请求头&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -H &amp;#34;Authorization: Bearer your_token&amp;#34; http://example.com/data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;-H&lt;/code&gt; 选项可以添加自定义的请求头，这里用于设置 &lt;code&gt;Authorization&lt;/code&gt; 头。&lt;/p&gt;
&lt;ol start="7"&gt;
&lt;li&gt;&lt;strong&gt;跟随重定向&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -L http://example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-L&lt;/code&gt; 选项使得 &lt;code&gt;curl&lt;/code&gt; 自动跟随服务器返回的重定向。&lt;/p&gt;</description></item><item><title>MCP Server</title><link>https://zel-forprogress.github.io/blog/wendang/mcp-server/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/mcp-server/</guid><description>&lt;p&gt;MCP Server 是 &lt;strong&gt;Model Context Protocol&lt;/strong&gt; 的缩写，是 Anthropic 推出的一个开放协议，让 AI 模型可以调用外部工具。&lt;/p&gt;
&lt;h2 id="简单理解"&gt;简单理解&lt;a class="anchor" href="#%e7%ae%80%e5%8d%95%e7%90%86%e8%a7%a3"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;传统方式：
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;你 ──打字──&amp;gt; Claude ──回答──&amp;gt; 你
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;（Claude 只能聊天，不能操作外部世界）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MCP 方式：
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;你 ──提问──&amp;gt; Claude ──调用工具──&amp;gt; MCP Server ──执行──&amp;gt; 返回结果
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── 读写文件
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── 查询数据库
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── 调用API
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── 任何你能编程实现的事&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MCP 就是一个&lt;strong&gt;标准化的插件系统&lt;/strong&gt;。你写一个 Python/TypeScript 脚本，声明它提供哪些工具，Agent 就能在对话中自动调用这些工具。类似于给浏览器写扩展插件，只不过是给 AI Agent 写的。&lt;/p&gt;</description></item><item><title>Next.js</title><link>https://zel-forprogress.github.io/blog/wendang/next.js/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/next.js/</guid><description>&lt;p&gt;Next.js 是一个把 React 从纯前端库升级为全栈应用框架的生产力工具，让你通过文件即路由、服务端组件和开箱即用的优化，简单高效地构建现代 Web 应用。&lt;/p&gt;
&lt;p&gt;使用 Next.js，你可以用 JavaScript/TypeScript 这一种语言，在同一个项目里同时编写：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;前端：React 组件（UI 交互、页面渲染）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后端：API Routes、Server Actions、数据获取、数据库查询等&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="具体体现"&gt;具体体现：&lt;a class="anchor" href="#%e5%85%b7%e4%bd%93%e4%bd%93%e7%8e%b0"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;层级&lt;/th&gt;
					&lt;th&gt;传统方式&lt;/th&gt;
					&lt;th&gt;Next.js 方式&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;语言&lt;/td&gt;
					&lt;td&gt;前端 JS + 后端（Java/Go/PHP等）&lt;/td&gt;
					&lt;td&gt;统一用 JavaScript/TypeScript&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;项目&lt;/td&gt;
					&lt;td&gt;前后端分离，两个仓库/两个部署&lt;/td&gt;
					&lt;td&gt;一个项目，一键部署&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;接口&lt;/td&gt;
					&lt;td&gt;需要定义 REST/GraphQL，通过 HTTP 调用&lt;/td&gt;
					&lt;td&gt;直接导入函数或调用 Server Action，无需手动写接口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据获取&lt;/td&gt;
					&lt;td&gt;前端 fetch → 后端 → 返回 JSON&lt;/td&gt;
					&lt;td&gt;服务端组件里直接 await db.query()&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>TailwindCSS与传统CSS</title><link>https://zel-forprogress.github.io/blog/wendang/tailwindcss%E4%B8%8E%E4%BC%A0%E7%BB%9Fcss/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/tailwindcss%E4%B8%8E%E4%BC%A0%E7%BB%9Fcss/</guid><description>&lt;h2 id="-场景创建一个用户卡片"&gt;🎯 场景：创建一个用户卡片&lt;a class="anchor" href="#-%e5%9c%ba%e6%99%af%e5%88%9b%e5%bb%ba%e4%b8%80%e4%b8%aa%e7%94%a8%e6%88%b7%e5%8d%a1%e7%89%87"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;假设你需要做一个这样的用户卡片：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;白色背景、圆角、阴影&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;内边距、外边距&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;标题大号加粗、文字灰色&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按钮蓝色背景、白色文字、圆角&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="-传统-css-写法"&gt;📝 传统 CSS 写法&lt;a class="anchor" href="#-%e4%bc%a0%e7%bb%9f-css-%e5%86%99%e6%b3%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;你先要写一个 CSS 文件：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/* styles.css */&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.card {&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; background-color: white;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; border-radius: 8px;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; padding: 20px;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; margin: 16px;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; max-width: 300px;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.title {&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; font-size: 24px;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; font-weight: bold;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; color: #374151;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; margin-bottom: 12px;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.button {&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; background-color: #3b82f6;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; color: white;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; padding: 8px 16px;&lt;/code&gt;&lt;/p&gt;</description></item><item><title>交互式 REPL</title><link>https://zel-forprogress.github.io/blog/wendang/%E4%BA%A4%E4%BA%92%E5%BC%8F-repl/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/%E4%BA%A4%E4%BA%92%E5%BC%8F-repl/</guid><description>&lt;p&gt;交互式 REPL 是编程环境中一个非常实用的工具。这四个字母分别代表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;R (Read，读取)：读取用户输入的代码或表达式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;E (Eval，求值)：对读取的内容进行计算或执行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;P (Print，打印)：显示求值的结果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L (Loop，循环)：重复以上过程，等待下一个输入。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单来说，REPL 就像一个“对话式”的代码运行环境。你输入一句代码，它立刻给你一句结果，然后等待你继续输入。&lt;/p&gt;
&lt;h3 id="一个直观的类比计算器"&gt;一个直观的类比：计算器&lt;a class="anchor" href="#%e4%b8%80%e4%b8%aa%e7%9b%b4%e8%a7%82%e7%9a%84%e7%b1%bb%e6%af%94%e8%ae%a1%e7%ae%97%e5%99%a8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;普通的编程是“写完整本书再翻看”，而 REPL 就像用计算器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;你按下 &lt;code&gt;2 + 3&lt;/code&gt;（读取）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;计算器显示 &lt;code&gt;5&lt;/code&gt;（求值并打印）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;你还可以继续按 &lt;code&gt;* 4&lt;/code&gt;（循环）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="与普通运行代码的区别"&gt;与普通运行代码的区别&lt;a class="anchor" href="#%e4%b8%8e%e6%99%ae%e9%80%9a%e8%bf%90%e8%a1%8c%e4%bb%a3%e7%a0%81%e7%9a%84%e5%8c%ba%e5%88%ab"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;普通脚本运行&lt;/th&gt;
					&lt;th&gt;交互式 REPL&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;方式&lt;/td&gt;
					&lt;td&gt;写完整段代码，一次性执行&lt;/td&gt;
					&lt;td&gt;一行一行或一句一句执行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;状态&lt;/td&gt;
					&lt;td&gt;每次运行都是全新的开始&lt;/td&gt;
					&lt;td&gt;变量、函数会一直保留，可逐步测试&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;目的&lt;/td&gt;
					&lt;td&gt;完成完整的功能、应用&lt;/td&gt;
					&lt;td&gt;探索、调试、学习、原型验证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;反馈&lt;/td&gt;
					&lt;td&gt;最后才能看到全部输出&lt;/td&gt;
					&lt;td&gt;立即得到每一步的结果&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>OCR</title><link>https://zel-forprogress.github.io/blog/wendang/ocr/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/ocr/</guid><description>&lt;p&gt;&lt;strong&gt;OCR&lt;/strong&gt; 在“&lt;strong&gt;OCR语言设置&lt;/strong&gt;”中的全称是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Optical Character Recognition中文名称&lt;/strong&gt;：&lt;strong&gt;光学字符识别&lt;/strong&gt;（也常称为文字识别）&lt;/p&gt;
&lt;h3 id="简单解释什么是-ocr"&gt;简单解释什么是 OCR？&lt;a class="anchor" href="#%e7%ae%80%e5%8d%95%e8%a7%a3%e9%87%8a%e4%bb%80%e4%b9%88%e6%98%af-ocr"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OCR 是一种&lt;strong&gt;人工智能 + 图像处理技术&lt;/strong&gt;，它的主要功能是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;从&lt;strong&gt;图片、扫描件、照片、PDF 图像&lt;/strong&gt;中，自动识别出里面的&lt;strong&gt;文字&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把图像里的文字转换成&lt;strong&gt;可编辑、可搜索、可复制&lt;/strong&gt;的机器可读文本。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;常见应用场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;把纸质文档扫描后转成可编辑的 Word&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;识别身份证、发票、名片上的文字&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;提取图片里的文字（例如截图、书本照片）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;视频字幕识别&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文档数字化处理（企业常用）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PDF 转可搜索 PDF&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ocr语言设置是什么意思"&gt;“OCR语言设置”是什么意思？&lt;a class="anchor" href="#ocr%e8%af%ad%e8%a8%80%e8%ae%be%e7%bd%ae%e6%98%af%e4%bb%80%e4%b9%88%e6%84%8f%e6%80%9d"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;OCR语言设置&lt;/strong&gt; 是指你在使用 OCR 功能时，&lt;strong&gt;告诉系统当前要识别的文字主要是什么语言&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;为什么要设置语言？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;不同语言的文字特征差别很大（例如中文是方块字，英文是字母，阿拉伯文是连笔）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置正确的语言可以&lt;strong&gt;大幅提高识别准确率&lt;/strong&gt;，减少错别字。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果不设置，很多 OCR 工具会默认使用英文，导致中文、日文、韩文等识别效果很差。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;常见语言代码示例&lt;/strong&gt;（不同工具略有差异）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;chi_sim 或 zh → 简体中文&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;chi_tra 或 zh-TW → 繁体中文&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;eng → 英文&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jpn → 日文&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;kor → 韩文&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;auto 或留空 → 自动检测语言（部分高级工具支持）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Transformer</title><link>https://zel-forprogress.github.io/blog/wendang/transformer/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/transformer/</guid><description>&lt;h4 id="-transformer-是什么"&gt;&lt;strong&gt;① Transformer 是什么？&lt;/strong&gt;&lt;a class="anchor" href="#-transformer-%e6%98%af%e4%bb%80%e4%b9%88"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;全称：&lt;strong&gt;Transformer 架构&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;它是目前几乎所有大语言模型（ChatGPT、Llama、Qwen、DeepSeek 等）的&lt;strong&gt;核心骨架&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主要特点：抛弃了传统的 RNN、LSTM，完全使用 &lt;strong&gt;Self-Attention（自注意力机制）&lt;/strong&gt; 来处理序列数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;优点：并行计算能力强，能很好地捕捉长距离依赖关系。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单说：&lt;strong&gt;Transformer 是一种强大的神经网络结构&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id="-bert-是什么"&gt;&lt;strong&gt;② BERT 是什么？&lt;/strong&gt;&lt;a class="anchor" href="#-bert-%e6%98%af%e4%bb%80%e4%b9%88"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;BERT = &lt;strong&gt;Bidirectional Encoder Representations from Transformers&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中文：&lt;strong&gt;基于 Transformer 的双向编码器表示&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BERT 是 Google 在 2018 年发布的&lt;strong&gt;预训练语言模型&lt;/strong&gt;，它&lt;strong&gt;使用了 Transformer 中的 Encoder（编码器）部分&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BERT 的最大创新是&lt;strong&gt;双向理解&lt;/strong&gt;：它能同时看一个词的左边和右边上下文（而之前的模型大多只能看一边）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;BERT 一经发布就大幅刷新了各种 NLP 任务的记录，后来几乎所有现代语言模型都受到了它的影响。&lt;/p&gt;
&lt;h4 id="-"&gt;&lt;strong&gt;③ [CLS] 是什么？为什么会出现？&lt;/strong&gt;&lt;a class="anchor" href="#-"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;[CLS]&lt;/strong&gt; 是 “&lt;strong&gt;Class&lt;/strong&gt;” 的缩写，中文常称为 &lt;strong&gt;分类标记&lt;/strong&gt; 或 &lt;strong&gt;句首标记&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;它的作用是：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 BERT 处理文本时，会在&lt;strong&gt;输入文本的最前面&lt;/strong&gt;自动加上一个特殊的 Token：[CLS]。&lt;/p&gt;
&lt;p&gt;例如输入句子：&lt;/p&gt;
&lt;p&gt;“今天天气很好”&lt;/p&gt;
&lt;p&gt;经过 Tokenizer 处理后变成：&lt;/p&gt;
&lt;p&gt;[CLS] 今 天 天 气 很 好&lt;/p&gt;
&lt;p&gt;BERT 的 Transformer 编码器会对整个序列（包括 [CLS]）进行处理。&lt;/p&gt;</description></item><item><title>uv、conda、python（venv）创建虚拟环境的区别</title><link>https://zel-forprogress.github.io/blog/wendang/uvcondapythonvenv%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E7%9A%84%E5%8C%BA%E5%88%AB/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/uvcondapythonvenv%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E7%9A%84%E5%8C%BA%E5%88%AB/</guid><description>&lt;h1 id="python-自己的虚拟环境venv"&gt;&lt;strong&gt;Python 自己的虚拟环境（venv）&lt;/strong&gt;&lt;a class="anchor" href="#python-%e8%87%aa%e5%b7%b1%e7%9a%84%e8%99%9a%e6%8b%9f%e7%8e%af%e5%a2%83venv"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h1 id="uv强烈推荐了解的新工具"&gt;&lt;strong&gt;uv（强烈推荐了解的新工具）&lt;/strong&gt;&lt;a class="anchor" href="#uv%e5%bc%ba%e7%83%88%e6%8e%a8%e8%8d%90%e4%ba%86%e8%a7%a3%e7%9a%84%e6%96%b0%e5%b7%a5%e5%85%b7"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h1 id="condaanaconda--miniconda"&gt;&lt;strong&gt;Conda（Anaconda / Miniconda）&lt;/strong&gt;&lt;a class="anchor" href="#condaanaconda--miniconda"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;实际使用建议（2026 年）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;纯 Python 项目&lt;/strong&gt;（Web 后端、脚本、自动化、学习等）→ &lt;strong&gt;强烈推荐 uv&lt;/strong&gt; 它目前是速度和体验最好的选择，很多人都已经“删掉 conda 改用 uv”了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据科学 / 机器学习 / 需要 GPU&lt;/strong&gt; → &lt;strong&gt;继续用 Conda（或 micromamba / pixi）&lt;/strong&gt; 因为 uv 还无法完美替代 conda 处理非 Python 二进制依赖。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;极简主义&lt;/strong&gt; → 直接用 &lt;strong&gt;venv + pip&lt;/strong&gt;（或 venv + uv pip）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Api代理与反向代理</title><link>https://zel-forprogress.github.io/blog/wendang/api%E4%BB%A3%E7%90%86%E4%B8%8E%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/</link><pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/api%E4%BB%A3%E7%90%86%E4%B8%8E%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/</guid><description>&lt;h1 id="一句话区别"&gt;一句话区别&lt;a class="anchor" href="#%e4%b8%80%e5%8f%a5%e8%af%9d%e5%8c%ba%e5%88%ab"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;API代理（正向代理）&lt;/strong&gt;：帮“客户端”去访问API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;API反向代理&lt;/strong&gt;：帮“服务器”接收请求&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id="-一api代理正向代理"&gt;🧩 一、API代理（正向代理）&lt;a class="anchor" href="#-%e4%b8%80api%e4%bb%a3%e7%90%86%e6%ad%a3%e5%90%91%e4%bb%a3%e7%90%86"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;👉 核心：&lt;strong&gt;代理的是“你（客户端）”&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="-场景理解"&gt;📌 场景理解&lt;a class="anchor" href="#-%e5%9c%ba%e6%99%af%e7%90%86%e8%a7%a3"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;你访问一个国外API，但是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;被墙 / 网络限制&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;或者你不想暴露自己IP&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;于是你用一个代理服务器帮你访问。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-流程"&gt;🧭 流程&lt;a class="anchor" href="#-%e6%b5%81%e7%a8%8b"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;你 → 代理服务器 → 真实API → 返回结果&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-类比"&gt;🍔 类比&lt;a class="anchor" href="#-%e7%b1%bb%e6%af%94"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;你找“代购”帮你买东西&lt;/p&gt;
&lt;p&gt;👉 店家根本不知道是你买的，只知道代购&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-特点"&gt;📌 特点&lt;a class="anchor" href="#-%e7%89%b9%e7%82%b9"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;API服务器不知道真实客户端是谁&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代理是给“客户端”用的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;常见：VPN、HTTP代理&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id="-二api反向代理你刚刚问的那个"&gt;🧩 二、API反向代理（你刚刚问的那个）&lt;a class="anchor" href="#-%e4%ba%8capi%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86%e4%bd%a0%e5%88%9a%e5%88%9a%e9%97%ae%e7%9a%84%e9%82%a3%e4%b8%aa"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;👉 核心：&lt;strong&gt;代理的是“服务器”&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-流程-1"&gt;🧭 流程&lt;a class="anchor" href="#-%e6%b5%81%e7%a8%8b-1"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;客户端 → 反向代理服务器 → 真实API服务器 → 返回结果&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-类比-1"&gt;🍔 类比&lt;a class="anchor" href="#-%e7%b1%bb%e6%af%94-1"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;你去餐厅点餐：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;你只看到前台（反向代理）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后面有多少厨房（真实服务器）你不知道&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="-特点-1"&gt;📌 特点&lt;a class="anchor" href="#-%e7%89%b9%e7%82%b9-1"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;客户端不知道真实API在哪&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;反代是“服务器对外的门面”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;常见：负载均衡、网关&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id="-三核心区别对比"&gt;⚔️ 三、核心区别对比&lt;a class="anchor" href="#-%e4%b8%89%e6%a0%b8%e5%bf%83%e5%8c%ba%e5%88%ab%e5%af%b9%e6%af%94"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;对比点&lt;/th&gt;
					&lt;th&gt;API代理（正向）&lt;/th&gt;
					&lt;th&gt;API反向代理&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;代理对象&lt;/td&gt;
					&lt;td&gt;客户端&lt;/td&gt;
					&lt;td&gt;服务器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;谁在用&lt;/td&gt;
					&lt;td&gt;客户端主动使用&lt;/td&gt;
					&lt;td&gt;服务端部署&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;真实API是否暴露&lt;/td&gt;
					&lt;td&gt;暴露给代理&lt;/td&gt;
					&lt;td&gt;被隐藏&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;典型用途&lt;/td&gt;
					&lt;td&gt;翻墙、隐藏IP&lt;/td&gt;
					&lt;td&gt;网关、负载均衡、跨域&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;客户端是否感知&lt;/td&gt;
					&lt;td&gt;知道在用代理&lt;/td&gt;
					&lt;td&gt;通常不知道&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h1 id="-四一个特别关键的理解重点"&gt;💡 四、一个特别关键的理解（重点！）&lt;a class="anchor" href="#-%e5%9b%9b%e4%b8%80%e4%b8%aa%e7%89%b9%e5%88%ab%e5%85%b3%e9%94%ae%e7%9a%84%e7%90%86%e8%a7%a3%e9%87%8d%e7%82%b9"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;👉 判断方法：&lt;/p&gt;</description></item><item><title>git知识</title><link>https://zel-forprogress.github.io/blog/wendang/git%E7%9F%A5%E8%AF%86/</link><pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/git%E7%9F%A5%E8%AF%86/</guid><description>&lt;h1 id="一-命令"&gt;一、 命令&lt;a class="anchor" href="#%e4%b8%80-%e5%91%bd%e4%bb%a4"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="rebase"&gt;rebase&lt;a class="anchor" href="#rebase"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;rebase&lt;/code&gt; 会生成全新的提交哈希，导致本地历史与远程历史产生“分叉”。Git 默认禁止非快进（non-fast-forward）推送，因此必须用强制推送来明确告诉远程：“我要用新历史替换旧历史”。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-详细原理拆解"&gt;📖 详细原理拆解&lt;a class="anchor" href="#-%e8%af%a6%e7%bb%86%e5%8e%9f%e7%90%86%e6%8b%86%e8%a7%a3"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="为什么-rebase-会改写历史"&gt;为什么 &lt;code&gt;rebase&lt;/code&gt; 会改写历史？&lt;a class="anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88-rebase-%e4%bc%9a%e6%94%b9%e5%86%99%e5%8e%86%e5%8f%b2"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Git 中每个提交的唯一标识是一个 SHA 哈希值（如 &lt;code&gt;a1b2c3d&lt;/code&gt;）。这个哈希不是随机生成的，而是由以下信息共同计算得出：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;提交内容（diff）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;作者/提交者信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;时间戳&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;父提交的哈希值 ← 关键！&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当你执行 &lt;code&gt;git rebase main&lt;/code&gt; 时，Git 底层实际在做：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;把你分支上的提交临时保存为“补丁”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把当前分支指针移到最新的 &lt;code&gt;main&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;逐个重新应用补丁，生成全新的提交&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因为新提交的父提交变成了 &lt;code&gt;main&lt;/code&gt; 的最新提交，所以即使代码内容一模一样，计算出的哈希值也会全部改变。旧提交并没有被“修改”，而是被新提交替换，历史线因此被重写。&lt;/p&gt;
&lt;h4 id="为什么普通-git-push-会失败"&gt;为什么普通 &lt;code&gt;git push&lt;/code&gt; 会失败？&lt;a class="anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e6%99%ae%e9%80%9a-git-push-%e4%bc%9a%e5%a4%b1%e8%b4%a5"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;假设远程分支历史是&lt;/p&gt;
&lt;p&gt;main: A ─ B ─ C&lt;/p&gt;
&lt;p&gt;你的分支: └─ D ─ E （远程记录）&lt;/p&gt;
&lt;p&gt;你本地 rebase 后，历史变成了&lt;/p&gt;
&lt;p&gt;main: A ─ B ─ C&lt;/p&gt;
&lt;p&gt;你的分支: └─ D&amp;rsquo;─ E&amp;rsquo; （本地新哈希，D&amp;rsquo;/E&amp;rsquo; 内容同 D/E 但哈希不同）&lt;/p&gt;
&lt;p&gt;当你执行普通 &lt;code&gt;git push&lt;/code&gt; 时，Git 会检查：&lt;code&gt;远程分支的末端（E）是不是本地分支末端（E'）的祖先？&lt;/code&gt;
答案是 &lt;strong&gt;否&lt;/strong&gt;。Git 认为这是一次“&lt;strong&gt;非快进更新&lt;/strong&gt;”，出于防误覆盖的安全机制，会直接拒绝推送并报错：&lt;/p&gt;</description></item><item><title>HTT状态码</title><link>https://zel-forprogress.github.io/blog/wendang/htt%E7%8A%B6%E6%80%81%E7%A0%81/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/htt%E7%8A%B6%E6%80%81%E7%A0%81/</guid><description>&lt;h3 id="-1xx-informational信息性"&gt;🟢 1xx Informational（信息性）&lt;a class="anchor" href="#-1xx-informational%e4%bf%a1%e6%81%af%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;状态码&lt;/th&gt;
					&lt;th&gt;英文名称&lt;/th&gt;
					&lt;th&gt;中文含义&lt;/th&gt;
					&lt;th&gt;常见场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;100&lt;/td&gt;
					&lt;td&gt;Continue&lt;/td&gt;
					&lt;td&gt;继续&lt;/td&gt;
					&lt;td&gt;服务器已接收请求头，客户端可继续发送请求体&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;101&lt;/td&gt;
					&lt;td&gt;Switching Protocols&lt;/td&gt;
					&lt;td&gt;切换协议&lt;/td&gt;
					&lt;td&gt;同意升级协议（如 HTTP → WebSocket）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;103&lt;/td&gt;
					&lt;td&gt;Early Hints&lt;/td&gt;
					&lt;td&gt;早期提示&lt;/td&gt;
					&lt;td&gt;提前返回部分响应头（如预加载 CSS/JS，提升首屏性能）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-2xx-success成功"&gt;🟢 2xx Success（成功）&lt;a class="anchor" href="#-2xx-success%e6%88%90%e5%8a%9f"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;状态码&lt;/th&gt;
					&lt;th&gt;英文名称&lt;/th&gt;
					&lt;th&gt;中文含义&lt;/th&gt;
					&lt;th&gt;常见场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;200&lt;/td&gt;
					&lt;td&gt;OK&lt;/td&gt;
					&lt;td&gt;成功&lt;/td&gt;
					&lt;td&gt;请求正常完成，返回响应体&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;201&lt;/td&gt;
					&lt;td&gt;Created&lt;/td&gt;
					&lt;td&gt;已创建&lt;/td&gt;
					&lt;td&gt;请求成功并创建新资源（常用于 POST）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;202&lt;/td&gt;
					&lt;td&gt;Accepted&lt;/td&gt;
					&lt;td&gt;已接受&lt;/td&gt;
					&lt;td&gt;请求已入队/异步处理中，结果稍后获取&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;204&lt;/td&gt;
					&lt;td&gt;No Content&lt;/td&gt;
					&lt;td&gt;无内容&lt;/td&gt;
					&lt;td&gt;请求成功，但无返回体（常用于 DELETE/PUT）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;206&lt;/td&gt;
					&lt;td&gt;Partial Content&lt;/td&gt;
					&lt;td&gt;部分内容&lt;/td&gt;
					&lt;td&gt;范围请求成功，用于断点续传、视频分片加载&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-3xx-redirection重定向"&gt;🟡 3xx Redirection（重定向）&lt;a class="anchor" href="#-3xx-redirection%e9%87%8d%e5%ae%9a%e5%90%91"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;状态码&lt;/th&gt;
					&lt;th&gt;英文名称&lt;/th&gt;
					&lt;th&gt;中文含义&lt;/th&gt;
					&lt;th&gt;常见场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;301&lt;/td&gt;
					&lt;td&gt;Moved Permanently&lt;/td&gt;
					&lt;td&gt;永久重定向&lt;/td&gt;
					&lt;td&gt;资源已永久迁移，建议更新书签/SEO权重转移&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;302&lt;/td&gt;
					&lt;td&gt;Found&lt;/td&gt;
					&lt;td&gt;临时重定向&lt;/td&gt;
					&lt;td&gt;资源临时迁移，默认将请求方法转为 GET&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;303&lt;/td&gt;
					&lt;td&gt;See Other&lt;/td&gt;
					&lt;td&gt;查看其他地址&lt;/td&gt;
					&lt;td&gt;明确指示客户端用 GET 访问新 URL（防重复提交）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;304&lt;/td&gt;
					&lt;td&gt;Not Modified&lt;/td&gt;
					&lt;td&gt;未修改&lt;/td&gt;
					&lt;td&gt;缓存有效，客户端使用本地缓存（条件请求命中）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;307&lt;/td&gt;
					&lt;td&gt;Temporary Redirect&lt;/td&gt;
					&lt;td&gt;临时重定向&lt;/td&gt;
					&lt;td&gt;保持原请求方法不变（替代 302 的严格场景）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;308&lt;/td&gt;
					&lt;td&gt;Permanent Redirect&lt;/td&gt;
					&lt;td&gt;永久重定向&lt;/td&gt;
					&lt;td&gt;保持原请求方法不变的永久跳转（替代 301）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-4xx-client-error客户端错误"&gt;🟠 4xx Client Error（客户端错误）&lt;a class="anchor" href="#-4xx-client-error%e5%ae%a2%e6%88%b7%e7%ab%af%e9%94%99%e8%af%af"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;状态码&lt;/th&gt;
					&lt;th&gt;英文名称&lt;/th&gt;
					&lt;th&gt;中文含义&lt;/th&gt;
					&lt;th&gt;常见场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;400&lt;/td&gt;
					&lt;td&gt;Bad Request&lt;/td&gt;
					&lt;td&gt;错误请求&lt;/td&gt;
					&lt;td&gt;参数缺失、JSON 格式错误、语法无效&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;401&lt;/td&gt;
					&lt;td&gt;Unauthorized&lt;/td&gt;
					&lt;td&gt;未授权&lt;/td&gt;
					&lt;td&gt;未登录或凭证无效，需重新认证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;403&lt;/td&gt;
					&lt;td&gt;Forbidden&lt;/td&gt;
					&lt;td&gt;禁止访问&lt;/td&gt;
					&lt;td&gt;已认证但权限不足，或被策略/IP 拦截&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;404&lt;/td&gt;
					&lt;td&gt;Not Found&lt;/td&gt;
					&lt;td&gt;未找到&lt;/td&gt;
					&lt;td&gt;请求的路径或资源不存在&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;405&lt;/td&gt;
					&lt;td&gt;Method Not Allowed&lt;/td&gt;
					&lt;td&gt;方法不允许&lt;/td&gt;
					&lt;td&gt;使用了不支持的 HTTP 方法（如 GET 调 POST 接口）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;408&lt;/td&gt;
					&lt;td&gt;Request Timeout&lt;/td&gt;
					&lt;td&gt;请求超时&lt;/td&gt;
					&lt;td&gt;客户端发送请求过慢，服务器主动断开&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;409&lt;/td&gt;
					&lt;td&gt;Conflict&lt;/td&gt;
					&lt;td&gt;冲突&lt;/td&gt;
					&lt;td&gt;请求与当前资源状态冲突（如并发修改、重复创建）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;413&lt;/td&gt;
					&lt;td&gt;Payload Too Large&lt;/td&gt;
					&lt;td&gt;请求体过大&lt;/td&gt;
					&lt;td&gt;上传文件/数据超过服务器或框架限制&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;415&lt;/td&gt;
					&lt;td&gt;Unsupported Media Type&lt;/td&gt;
					&lt;td&gt;不支持的媒体类型&lt;/td&gt;
					&lt;td&gt;Content-Type 不被服务端接受&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;422&lt;/td&gt;
					&lt;td&gt;Unprocessable Entity&lt;/td&gt;
					&lt;td&gt;无法处理的实体&lt;/td&gt;
					&lt;td&gt;格式正确但业务校验失败（API 常用）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;429&lt;/td&gt;
					&lt;td&gt;Too Many Requests&lt;/td&gt;
					&lt;td&gt;请求过多&lt;/td&gt;
					&lt;td&gt;触发限流/频率限制，需等待后重试&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;451&lt;/td&gt;
					&lt;td&gt;Unavailable For Legal Reasons&lt;/td&gt;
					&lt;td&gt;因法律原因不可用&lt;/td&gt;
					&lt;td&gt;内容被依法屏蔽/下架&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-5xx-server-error服务器错误"&gt;🔴 5xx Server Error（服务器错误）&lt;a class="anchor" href="#-5xx-server-error%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%94%99%e8%af%af"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;状态码&lt;/th&gt;
					&lt;th&gt;英文名称&lt;/th&gt;
					&lt;th&gt;中文含义&lt;/th&gt;
					&lt;th&gt;常见场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;500&lt;/td&gt;
					&lt;td&gt;Internal Server Error&lt;/td&gt;
					&lt;td&gt;内部服务器错误&lt;/td&gt;
					&lt;td&gt;服务端代码抛异常、未捕获错误、配置故障&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;501&lt;/td&gt;
					&lt;td&gt;Not Implemented&lt;/td&gt;
					&lt;td&gt;未实现&lt;/td&gt;
					&lt;td&gt;服务器不支持该请求方法或功能&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;502&lt;/td&gt;
					&lt;td&gt;Bad Gateway&lt;/td&gt;
					&lt;td&gt;错误网关&lt;/td&gt;
					&lt;td&gt;反向代理/网关收到上游无效响应（如 PHP-FPM 崩溃、后端重启）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;503&lt;/td&gt;
					&lt;td&gt;Service Unavailable&lt;/td&gt;
					&lt;td&gt;服务不可用&lt;/td&gt;
					&lt;td&gt;服务器过载、维护中、依赖服务宕机（常配合 Retry-After）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;504&lt;/td&gt;
					&lt;td&gt;Gateway Timeout&lt;/td&gt;
					&lt;td&gt;网关超时&lt;/td&gt;
					&lt;td&gt;上游服务器未在限定时间内响应（常见于慢 SQL、外部 API 超时）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;状态码&lt;/p&gt;</description></item><item><title>GC（Garbage Collection）、栈与堆</title><link>https://zel-forprogress.github.io/blog/wendang/gcgarbage-collection%E6%A0%88%E4%B8%8E%E5%A0%86/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/gcgarbage-collection%E6%A0%88%E4%B8%8E%E5%A0%86/</guid><description>&lt;h1 id="一堆heap与栈stack"&gt;一、堆（Heap）与栈（Stack）&lt;a class="anchor" href="#%e4%b8%80%e5%a0%86heap%e4%b8%8e%e6%a0%88stack"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Heap（堆）和 Stack（栈）都在内存中，它们是同一块物理内存（电脑的 RAM）被划分出来的两个不同用途的区域。一个是快速&lt;strong&gt;自动回收&lt;/strong&gt;的&lt;strong&gt;小区&lt;/strong&gt;（栈），另一个是存放大对象、需要 GC 打扫的&lt;strong&gt;大区&lt;/strong&gt;（堆）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：你写了一个方法，叫 买东西()：&lt;/p&gt;
&lt;p&gt;Java&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;void 买东西() { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; int 钱 = 1000; *// ← 这就是“栈”上的东西* 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String 购物车 = new String(&amp;#34;苹果&amp;#34;); *// ← 这就是“堆”上的东西*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当你调用 买东西() 这个方法时：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;栈（上下铺）发生了什么？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;系统立刻在栈上给你分配一个小空间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把 钱 = 1000 这个临时变量放进去。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;方法开始执行……&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;方法一结束（买完东西了），栈上的 钱 &lt;strong&gt;立刻自动消失&lt;/strong&gt;，空间马上回收。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：快、自动、干净，像住酒店，退房就走。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;堆（大小区）发生了什么？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;new String(&amp;ldquo;苹果&amp;rdquo;) 这句话会在&lt;strong&gt;堆&lt;/strong&gt;上申请一个大房间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“苹果”这个对象就住在堆里。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;即使 买东西() 方法结束了，只要还有其他地方拿着“购物车”这个钥匙（引用），这个“苹果”对象就&lt;strong&gt;继续住在堆里&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;只有当&lt;strong&gt;没有任何人再用它&lt;/strong&gt;时，垃圾回收器（GC）才会过来把它清理掉。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特点&lt;/th&gt;
					&lt;th&gt;栈（Stack）&lt;/th&gt;
					&lt;th&gt;堆（Heap）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;存放什么&lt;/td&gt;
					&lt;td&gt;基本类型变量、对象引用、方法参数&lt;/td&gt;
					&lt;td&gt;真正 new 出来的对象&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内存大小&lt;/td&gt;
					&lt;td&gt;很小（几 MB 到几十 MB）&lt;/td&gt;
					&lt;td&gt;很大（几百 MB 到几十 GB）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;分配和释放速度&lt;/td&gt;
					&lt;td&gt;非常快&lt;/td&gt;
					&lt;td&gt;较慢&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;是否有碎片&lt;/td&gt;
					&lt;td&gt;没有（严格按顺序进出）&lt;/td&gt;
					&lt;td&gt;有（会产生内存碎片，靠 GC 整理）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;线程安全&lt;/td&gt;
					&lt;td&gt;每个线程都有自己的栈，互不干扰&lt;/td&gt;
					&lt;td&gt;所有线程共享一个堆，需要小心并发&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;出错时提示&lt;/td&gt;
					&lt;td&gt;栈溢出（StackOverflowError）&lt;/td&gt;
					&lt;td&gt;堆内存不足（OutOfMemoryError）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;谁来清理&lt;/td&gt;
					&lt;td&gt;方法结束，系统自动清理&lt;/td&gt;
					&lt;td&gt;垃圾回收器（GC）自动清理&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;总结：&lt;/p&gt;</description></item><item><title>NoSql数据库</title><link>https://zel-forprogress.github.io/blog/wendang/nosql%E6%95%B0%E6%8D%AE%E5%BA%93/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/nosql%E6%95%B0%E6%8D%AE%E5%BA%93/</guid><description>&lt;h1 id="一定义"&gt;&lt;strong&gt;一、定义&lt;/strong&gt;&lt;a class="anchor" href="#%e4%b8%80%e5%ae%9a%e4%b9%89"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;**NoSQL **的全称最早是 Not Only SQL（不仅仅是 SQL），意思是它不强制使用关系型数据库的 SQL 语法，而是提供更灵活的方式来操作数据。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;我们不能&lt;/strong&gt;在大多数 NoSQL 里直接复制关系型数据库的复杂 SQL（如带 JOIN、多表事务、外键约束等）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;但很多现代 NoSQL 提供了 &lt;strong&gt;SQL-like&lt;/strong&gt; 或 &lt;strong&gt;SQL 兼容层&lt;/strong&gt;，让熟悉 SQL 的开发者上手更容易。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="二特性"&gt;二、特性&lt;a class="anchor" href="#%e4%ba%8c%e7%89%b9%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;**NoSQL **数据库被设计成天生支持分布式，这是它与传统关系型数据库（SQL）最大的区别之一&lt;/p&gt;
&lt;h4 id="1-分布式distributed"&gt;1. &lt;strong&gt;分布式（Distributed）&lt;/strong&gt;&lt;a class="anchor" href="#1-%e5%88%86%e5%b8%83%e5%bc%8fdistributed"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;意思是：数据库不是跑在一台服务器上，而是&lt;strong&gt;自动分布在多台服务器（节点）上&lt;/strong&gt;组成一个集群。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;为什么需要分布式？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;单台服务器的 CPU、内存、磁盘、网络总有上限（垂直扩展贵且有瓶颈）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当数据量达到 TB/PB 级、并发达到百万级时，必须把压力分散到多台机器上。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NoSQL 的优势&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;自动处理节点加入/退出、故障转移。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持高可用（一台机器挂了，其他机器还能继续服务）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;读写性能可以随着机器数量线性增长。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-数据分片sharding--data-partitioning"&gt;2. &lt;strong&gt;数据分片（Sharding / Data Partitioning）&lt;/strong&gt;&lt;a class="anchor" href="#2-%e6%95%b0%e6%8d%ae%e5%88%86%e7%89%87sharding--data-partitioning"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;分片&lt;/strong&gt;就是把一份大数据“切成小块”（shards），然后把这些小块分散存储到不同的服务器上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;怎么切？&lt;/strong&gt; 常见规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;按键哈希分片&lt;/strong&gt;（Hash Sharding）：根据用户ID、订单ID 等字段取哈希值，取模后决定放到哪个节点（最常用）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;范围分片&lt;/strong&gt;（Range Sharding）：按时间、ID 范围划分（如 2025 年数据放节点A，2026 年放节点B）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;好处&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;每个节点只管自己的一小部分数据，查询和写入更快。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;容易水平扩展：数据太多？再加几台机器，系统自动把数据重新分片。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NoSQL 天生支持&lt;/strong&gt;：MongoDB 有自动分片（Auto-Sharding），Cassandra 通过一致性哈希环实现分片，DynamoDB 完全自动管理分片。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-数据冗余data-redundancy--replication"&gt;3. &lt;strong&gt;数据冗余（Data Redundancy / Replication）&lt;/strong&gt;&lt;a class="anchor" href="#3-%e6%95%b0%e6%8d%ae%e5%86%97%e4%bd%99data-redundancy--replication"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;为了高可用，同一份数据会在多个节点上&lt;strong&gt;复制多份&lt;/strong&gt;（通常 3 份或更多）。&lt;/p&gt;</description></item><item><title>使用外键的优劣</title><link>https://zel-forprogress.github.io/blog/wendang/%E4%BD%BF%E7%94%A8%E5%A4%96%E9%94%AE%E7%9A%84%E4%BC%98%E5%8A%A3/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/%E4%BD%BF%E7%94%A8%E5%A4%96%E9%94%AE%E7%9A%84%E4%BC%98%E5%8A%A3/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;一句话总结就是&lt;/strong&gt;：使用外键可以保证数据安全、一致，降低开发难度；但是在对于高并发、分布式的场景的场景，使用外键意味着每次的sql都会产生额外的外键检查，加大了数据库的负担，降低了速度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;实际开发中的做法:&lt;/strong&gt;
&lt;strong&gt;开发环境 / 测试环境&lt;/strong&gt;：加上外键，便于发现数据问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生产环境&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;核心业务表（用户、订单、商品等强关联表）保留外键。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;高并发、大数据量表去掉外键，在应用层或通过消息队列 + 定时任务保证一致性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;替代方案&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;应用层校验 + 事务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据库触发器（Trigger）（部分复杂场景可补充或替代外键的约束，但同样存在性能和维护成本）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;异步任务 + 最终一致性（最常用高并发方案）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用**软删除（soft delete）**避免真实删除带来的级联问题（&lt;strong&gt;增加一个字段来判断其是或否被删除&lt;/strong&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Windows平台下AutoHotKey、PowerShell与VBScript的对比</title><link>https://zel-forprogress.github.io/blog/wendang/windows%E5%B9%B3%E5%8F%B0%E4%B8%8Bautohotkeypowershell%E4%B8%8Evbscript%E7%9A%84%E5%AF%B9%E6%AF%94/</link><pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate><guid>https://zel-forprogress.github.io/blog/wendang/windows%E5%B9%B3%E5%8F%B0%E4%B8%8Bautohotkeypowershell%E4%B8%8Evbscript%E7%9A%84%E5%AF%B9%E6%AF%94/</guid><description>&lt;p&gt;首先来总结一下这三种脚本分别最适合的方向：
&lt;strong&gt;AutoHotKey&lt;/strong&gt;：桌面交互自动化&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Powershell&lt;/strong&gt;：系统管理与复杂自动化&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VBSript&lt;/strong&gt;：老旧系统兼容与极简操作&lt;/p&gt;
&lt;h1 id="autohotkey"&gt;&lt;strong&gt;AutoHotKey&lt;/strong&gt;&lt;a class="anchor" href="#autohotkey"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;最终目的：使用快捷键来简化人们的&lt;strong&gt;手动操作（如鼠标点击，键盘输入）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;使用方式&lt;/em&gt;：&lt;/p&gt;
&lt;p&gt;首先下载AutoHotKey到我们的电脑上。&lt;/p&gt;
&lt;p&gt;在本地&lt;strong&gt;按照AutoHotKey的语法&lt;/strong&gt;编写完ahk脚本文件后，双击后，启动脚本文件，其加载后常驻后台，热键随时可用，几乎&lt;strong&gt;零延迟&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://open.feishu.cn/open-apis/drive/v1/medias/Xn9YbVaZFo2J4kxPuqyc11LVnTf/download" alt="image" /&gt;&lt;/p&gt;
&lt;p&gt;然后就可以使用&lt;strong&gt;快捷键&lt;/strong&gt;来使用该脚本文件编写的任务。&lt;/p&gt;
&lt;p&gt;具体任务：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;可以自定义全局热键来实现任务（&lt;strong&gt;最常用的用途&lt;/strong&gt;）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如：我编写了一个使用快捷键“ctrl+J”即可弹窗展来示目标任务的.ahk文件，编写保存完该脚本后，直接双击该脚本文件，然后可以在全局使用快捷键“ctrl+J”来调用脚本文件实现任务。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://open.feishu.cn/open-apis/drive/v1/medias/MxpZbUnfEoPNsgxZXWqcNKtCnM9/download" alt="image" /&gt;&lt;/p&gt;
&lt;p&gt;下面的所有任务，也都是编写脚本定义一个来执行该脚本的快捷键；双击该脚本后，该脚本就会常驻后台。然后使用快捷键执行任务。&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;重复操作自动化&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如：自动填写网页表单（固定输入账号 / 密码）；游戏 / 办公中重复点击某位置（也是使用自定义的快捷键来调用）&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;窗口精细化控制&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如：一键关闭所有弹窗；指定窗口置顶 / 隐藏 / 调整大小；多窗口分屏排列（如左边浏览器、右边记事本）。&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;轻量 GUI 小工具开发&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如：编写无编译的快捷启动面板（点击按钮打开不同工具）。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://open.feishu.cn/open-apis/drive/v1/medias/AdaRbXqg1oQe3qxCXxOcshUVnzh/download" alt="image" /&gt;&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;系统轻量操作辅助&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如：屏蔽键盘某按键；修改鼠标滚轮速度；自动切换输入法。&lt;/p&gt;
&lt;h1 id="powershell"&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;&lt;a class="anchor" href="#powershell"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;使用方式：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;无需下载，windows自带，在powershell终端输入命令使用，或者将整个文件保存为.ps1然后在终端使用&lt;code&gt;./name.ps1&lt;/code&gt;命令来执行该powershell文件。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;文件操作（类似于Linux中的文件操作）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;找出桌面最近7天修改的文件并按大小排序：&lt;code&gt;ls ~/Desktop -File -Recurse | ? { $_.LastWriteTime -gt (Get-Date).AddDays(-7) } | sort Length -Descending&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://open.feishu.cn/open-apis/drive/v1/medias/KcYYbBPkHohYQ3x3bAZc5kaFnug/download" alt="image" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;批量改文件的后缀名&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;快速查看文件的内容&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用cat命令查看文件中固定行数的内容&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;找出所有 .ps1 脚本里包含 &amp;ldquo;api_key&amp;rdquo; 的行：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sls *.ps1 -Pattern &amp;quot;api_key&amp;quot; -List&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>