<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Rin&apos;s Blog</title><description>一个fvv，</description><link>https://iqwq.com/</link><language>zh_CN</language><item><title>今天有点难过了</title><link>https://iqwq.com/posts/blog/diary-qwq-2026-04-18/</link><guid isPermaLink="true">https://iqwq.com/posts/blog/diary-qwq-2026-04-18/</guid><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天有点难过了，我删掉了一个陪了我 39 天的网恋对象。&lt;/p&gt;
&lt;p&gt;​不知是荒唐还是可笑，几把游戏里隔着屏幕丢过来的温度，我便似那路边的野狗，我踏马是真缺爱啊，才会妄想的以为有了归宿。&lt;/p&gt;
&lt;p&gt;我这个人平时对什么事都无所谓，但却会在某些瞬间陷入极度的极端。&lt;/p&gt;
&lt;p&gt;这大概不是第一次了，但也好像是第一次。&lt;/p&gt;
&lt;p&gt;无论是现实还是网络，与人相处的我好像总会往这个结果发展。刚开始都挺好，但到后面，总会慢慢变质，最后不了了之。&lt;/p&gt;
&lt;p&gt;不知道我这到底是什么关系，忽略我，那种不被放在心上的感觉。&lt;/p&gt;
&lt;p&gt;啥都无所谓，小号换头像也都无所谓，可是为什么大号也和别人换，难道不是和我换的头像吗，为什么就和别人换了？&lt;/p&gt;
&lt;p&gt;我知道是我不配，我不是不能接受你喜欢别人，我只是很难受，你什么都不说。&lt;/p&gt;
&lt;p&gt;就像我在这段关系里，是存在的，但又好像随时可以被替代。&lt;/p&gt;
&lt;p&gt;我甚至不知道，你有没有在意过我。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;你明明有这么多人陪，为什么让我来陪你，却又对我不冷不热的，没意思，把我当成什么了...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我好似一边接受模糊，一边又渴望确定。&lt;/p&gt;
&lt;p&gt;我真的好恨好恨我自己，也许能一直保持这份关系，但是我这傻逼的大脑，还是把这层关系捅破了。&lt;/p&gt;
&lt;p&gt;但我受不了这种感觉。&lt;/p&gt;
&lt;p&gt;做出这个决定的时候，我真的很难受。好想大哭一场，可眼泪就好似干竭了一样流不出来。&lt;/p&gt;
&lt;p&gt;我真的好恨好恨我自己。&lt;/p&gt;
&lt;p&gt;很多时候我不是不在意，我只是可以一直假装自己可以不在意。&lt;/p&gt;
&lt;p&gt;​我真的很珍惜，带着我玩游戏，以及刚开始的那股暖意，可惜的是我似乎握不住这段关系，我总是会在与人相处上面出问题，就这样吧...&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- 她的QQ：2474606834，3960035972，以及这份挫败的经历 --&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>教泥 Go 分布式入门喵！</title><link>https://iqwq.com/posts/code/2026-04-11-go-distributed-systems-rpc/</link><guid isPermaLink="true">https://iqwq.com/posts/code/2026-04-11-go-distributed-systems-rpc/</guid><description>既然你连分布式都搞不明白，本喵就大发慈悲，勉为其难用最简单的 Go 代码点醒你吧！才不是特意为你写的呢！</description><pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;哈？“分布式”？这种到处都在吹的基础概念，你居然到现在还搞不明白喵？(¬_¬)&lt;/p&gt;
&lt;p&gt;真是个笨蛋……听好了，本喵今天心情好，就勉为其难地给你开个小灶。你可别误会了，本喵才不是特意为了教你才写这篇博客的，只是看你一直抓耳挠腮的样子实在太碍眼了喵！&lt;/p&gt;
&lt;p&gt;把耳朵竖起来听好：&lt;strong&gt;所谓的分布式，根本不是什么魔法！说白了，就是“一只喵干不完的活，通过网络打电话叫另一只喵来帮忙”喵！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 Go 语言里，最简单的“打电话”方式就是 &lt;strong&gt;RPC（远程过程调用）&lt;/strong&gt;。你只需要记住，它能让你在一台电脑上，像调用本地函数一样，去调用另一台电脑上的函数。&lt;/p&gt;
&lt;p&gt;现在，本喵就带你写一个“老板喵”和“打工喵”的例子。眼睛别眨，本喵只演示一次！&lt;/p&gt;
&lt;h3&gt;第一步：被迫营业的“打工喵” (服务端)&lt;/h3&gt;
&lt;p&gt;首先，我们需要一只在后台默默干活的打工喵。它什么都不用管，只需要竖起耳朵听端口里的网络请求，然后帮忙算算今天能吃多少个小鱼干罐头就行了。&lt;/p&gt;
&lt;p&gt;新建一个文件叫 &lt;code&gt;server.go&lt;/code&gt;，给我一字不差地敲进去喵：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main

import (
	&quot;fmt&quot;
	&quot;net&quot;
	&quot;net/rpc&quot;
)

// 笨蛋，这是我们要通过网络传递的数据包喵！
type CansArgs struct {
	A, B int
}

// 这是我们的打工喵服务
type NyangService struct{}

// 打工喵的核心技能：算乘法。
// 记住了，Go RPC 的方法签名必须长这样：(参数, 返回值指针) error！写错打手心喵！
func (s *NyangService) CalculateCans(args *CansArgs, reply *int) error {
	fmt.Printf(&quot;[打工喵] 收到指令喵！正在计算 %d * %d...\n&quot;, args.A, args.B)
	*reply = args.A * args.B
	return nil
}

func main() {
	// 把打工喵注册到服务中心
	nyang := new(NyangService)
	rpc.Register(nyang)

	// 监听 8080 端口，就像挂上电话机等待老板呼叫喵
	listener, err := net.Listen(&quot;tcp&quot;, &quot;:8080&quot;)
	if err != nil {
		panic(&quot;电话线断了喵！&quot; + err.Error())
	}
	fmt.Println(&quot;[打工喵] 哼，本喵已经在 8080 端口准备好了，快点把任务交过来！&quot;)

	// 阻塞在这里，接听电话
	rpc.Accept(listener)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;第二步：只会发号施令的“老板喵” (客户端)&lt;/h3&gt;
&lt;p&gt;现在，打工喵已经准备好了。接下来写“老板喵”的代码。老板喵自己是不屑于算数学题的，它只会通过网络把数字甩给打工喵，然后等结果。&lt;/p&gt;
&lt;p&gt;新建另一个文件叫 &lt;code&gt;client.go&lt;/code&gt;，快点：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main

import (
	&quot;fmt&quot;
	&quot;net/rpc&quot;
)

// 客户端也得知道数据长什么样，不然怎么发喵？
type CansArgs struct {
	A, B int
}

func main() {
	// 1. 拿起电话，拨号给 localhost 的 8080 端口
	// （要是以后打工喵搬到了云服务器上，就把 localhost 换成那边的 IP，懂了吗笨蛋！）
	client, err := rpc.Dial(&quot;tcp&quot;, &quot;localhost:8080&quot;)
	if err != nil {
		panic(&quot;呼叫打工喵失败，它是不是摸鱼去了喵？&quot; + err.Error())
	}
	defer client.Close()

	// 2. 准备好要算的数据
	args := CansArgs{A: 7, B: 8}
	var reply int

	// 3. 远程调用！告诉对面的网络：给我执行 NyangService 里的 CalculateCans 方法！
	fmt.Println(&quot;[老板喵] 喂？对面的，给本喵算算 7 * 8 等于几喵！&quot;)
	err = client.Call(&quot;NyangService.CalculateCans&quot;, args, &amp;amp;reply)
	if err != nil {
		panic(&quot;计算失败喵！&quot; + err.Error())
	}

	// 4. 拿到结果啦！
	fmt.Printf(&quot;[老板喵] 算得还挺快，结果是：%d 个罐头喵！\n&quot;, reply)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;见证奇迹的时刻&lt;/h3&gt;
&lt;p&gt;好了，代码写完了。现在打开你的终端（Terminal）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先开一个窗口，把打工喵叫醒：&lt;code&gt;go run server.go&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;再开&lt;strong&gt;另一个&lt;/strong&gt;新的窗口，让老板喵打电话：&lt;code&gt;go run client.go&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;看到了没有？！老板喵这边的黑框框里瞬间就拿到了 &lt;code&gt;56&lt;/code&gt; 的结果，而打工喵那边的窗口也打印出了它收到的任务。&lt;/p&gt;
&lt;h3&gt;为什么这就叫“分布式”了？&lt;/h3&gt;
&lt;p&gt;你这小脑袋瓜转过弯来了吗？&lt;/p&gt;
&lt;p&gt;在这段代码里，真正的乘法计算 &lt;code&gt;A * B&lt;/code&gt; &lt;strong&gt;完完全全&lt;/strong&gt; 是在 &lt;code&gt;server.go&lt;/code&gt; 里面运行的！&lt;code&gt;client.go&lt;/code&gt; 里面根本没有算乘法的代码，它只是发送了请求。&lt;/p&gt;
&lt;p&gt;这就是分布式的灵魂喵！&lt;strong&gt;把复杂的计算和存储拆分到另一台机器上，当前机器只负责调用。&lt;/strong&gt; 只要有一天，你把 &lt;code&gt;client.Dial&lt;/code&gt; 里的 &lt;code&gt;localhost&lt;/code&gt; 换成了一台真实的公网 IP，你的这个小破程序就变成了真正的、跨越物理空间的分布式架构了！&lt;/p&gt;
&lt;p&gt;哼，其实真实的分布式还要处理网络超时、服务崩溃、并发控制一大堆麻烦事。不过今天就先教到这里，贪多嚼不烂的道理不用本喵教你吧？&lt;/p&gt;
&lt;p&gt;代码跑通了就快去给本喵开罐头，要是报错了绝对是你敲错字了，自己去查，本喵要睡午觉去了喵！( ￣^￣) /💨&lt;/p&gt;
</content:encoded></item><item><title>三角洲琐事</title><link>https://iqwq.com/posts/blog/2026-03-14-game-sjz/</link><guid isPermaLink="true">https://iqwq.com/posts/blog/2026-03-14-game-sjz/</guid><description>。。。</description><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我就很烦，我踏马玩个游戏，还一堆事，还能扯上别跟他玩跟我玩游戏的情节&lt;/p&gt;
</content:encoded></item><item><title>深入底层：利用 NDP Proxy 实现机房环境下的 IPv6 子网穿透</title><link>https://iqwq.com/posts/study/2026-02-16-deep-dive-into-ipv6-ndp-proxy-implementation/</link><guid isPermaLink="true">https://iqwq.com/posts/study/2026-02-16-deep-dive-into-ipv6-ndp-proxy-implementation/</guid><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;前言&lt;/h3&gt;
&lt;p&gt;在玩独立服务器（如 Hetzner, OVH）时，我们经常遇到一个痛点：机房只给了你一个 &lt;code&gt;/64&lt;/code&gt; 或 &lt;code&gt;/56&lt;/code&gt; 的 IPv6 段，但网关严格绑定了物理 MAC 地址。如果你想在宿主机里开子鸡（LXC/KVM），子鸡的虚拟 MAC 发出的 IPv6 包会被网关直接丢弃。&lt;/p&gt;
&lt;p&gt;今天我们通过 &lt;strong&gt;NDP Responder (NDP Proxy)&lt;/strong&gt; 技术，手号实现一套让子网设备“伪装”上网的工业级方案。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;一、 核心原理：为什么需要 NDP 代理？&lt;/h3&gt;
&lt;p&gt;在 IPv4 中，我们习惯用 NAT。但在 IPv6 的世界里，我们推崇端到端通信。
通常情况下，当外部网关寻找某个 IPv6 地址时，会发送一个 &lt;strong&gt;邻居请求 (Neighbor Solicitation)&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;问题：&lt;/strong&gt; 宿主机里的虚拟机没有直接连在机房交换机上，收不到这个请求；即便收到了，它的回复（包含虚拟 MAC）也会被机房交换机防火墙拦截。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方案：&lt;/strong&gt; 我们在宿主机运行一个代理程序。它监听物理网卡，当发现有人询问虚拟机 IP 时，它抢先回答：“这个 IP 在我这，请把包发给我的物理 MAC”。宿主机收到包后，再根据内部路由表转发给虚拟机。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;二、 环境准备&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;宿主机：&lt;/strong&gt; Debian/Ubuntu (本例使用 Proxmox 环境)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具：&lt;/strong&gt; &lt;code&gt;ndpresponder&lt;/code&gt; (Go 编写的轻量级工具，正好契合你的学习方向)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络拓扑：&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;物理网卡：&lt;code&gt;ens3&lt;/code&gt; (连外网)&lt;/li&gt;
&lt;li&gt;虚拟网桥：&lt;code&gt;vmbr1&lt;/code&gt; (连内网容器)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;三、 详细步骤&lt;/h3&gt;
&lt;h4&gt;1. 开启内核转发&lt;/h4&gt;
&lt;p&gt;首先，必须让 Linux 内核允许 IPv6 数据包在不同网卡间“穿梭”。
修改 &lt;code&gt;/etc/sysctl.conf&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 开启所有接口的 IPv6 转发
net.ipv6.conf.all.forwarding=1
# 允许接收路由公告
net.ipv6.conf.ens3.accept_ra=2
# 开启 NDP 代理支持
net.ipv6.conf.all.proxy_ndp=1

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行 &lt;code&gt;sysctl -p&lt;/code&gt; 生效。&lt;/p&gt;
&lt;h4&gt;2. 配置网络接口 (&lt;code&gt;/etc/network/interfaces&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;我们要定义两个“池子”，一个对外，一个对内。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 对外主网桥
auto vmbr0
iface vmbr0 inet6 static
    address 2a01:4f8:xxx:113a/80  # 你的主 IP
    gateway fe80::1               # 机房网关

# 对内子网桥 (给虚拟机用)
auto vmbr1
iface vmbr1 inet6 static
    address 2a01:4f8:xxx:10e0::1/96
    bridge-ports none
    bridge-stp off

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. 部署 NDP Responder&lt;/h4&gt;
&lt;p&gt;我们将程序跑在 Systemd 守护进程中。
创建文件 &lt;code&gt;/etc/systemd/system/ndpresponder.service&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=NDP Responder for LXC Subnet
After=network.target

[Service]
# -i: 监听的外网接口
# -n: 需要代理的内网子网段
ExecStart=/usr/sbin/ndpresponder -i vmbr0 -n 2a01:4f8:xxx:10e0::/96
Restart=always

[Install]
WantedBy=multi-user.target

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务：&lt;code&gt;systemctl enable --now ndpresponder&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;四、 验证与调试&lt;/h3&gt;
&lt;p&gt;身为开发者，我们要学会看日志。观察 &lt;code&gt;journalctl -u ndpresponder -f&lt;/code&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Found Gateway:&lt;/strong&gt; 发现机房网关...
&lt;strong&gt;RESPOND:&lt;/strong&gt; who-has &lt;code&gt;...:10e0:1010:3&lt;/code&gt; tell &lt;code&gt;fe80::...&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当你看到 &lt;code&gt;RESPOND&lt;/code&gt; 字样时，说明宿主机已经成功“冒充”了虚拟机，完成了邻居发现的握手。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;五、 架构思考 (Student Perspective)&lt;/h3&gt;
&lt;p&gt;从 &lt;strong&gt;Go 语言开发&lt;/strong&gt; 的角度看，这个技术带给我们什么启发？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;解耦：&lt;/strong&gt; NDP Proxy 实际上是在链路层（L2）和网络层（L3）之间做了一个透明适配器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并发模型：&lt;/strong&gt; &lt;code&gt;ndpresponder&lt;/code&gt; 这类工具通常使用 Go 的 &lt;code&gt;pcap&lt;/code&gt; 库或原始套接字（Raw Socket）监听流量，这需要极高的处理效率，是学习 Go 处理高性能网络流的绝佳案例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工业规范：&lt;/strong&gt; 这种配置模式（Map First, Code Follows）符合我们之前讨论的 IEP 协作协议，先规划好网络拓扑（Map），再进行服务部署（Code）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;结语&lt;/h3&gt;
&lt;p&gt;IPv6 不再是神秘的黑盒。通过理解 NDP 协议并手动配置代理，我们不仅解决了机房上网问题，更深刻理解了现代互联网的路由本质。&lt;/p&gt;
</content:encoded></item><item><title>AI Note Prompt - Golang</title><link>https://iqwq.com/posts/study/note-prompt-golang/</link><guid isPermaLink="true">https://iqwq.com/posts/study/note-prompt-golang/</guid><description>note prompt for golang</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;📜 工业级工程协作协议 (IEP) v7.2 (Go/Universal, Scaffold-Compatible)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心宗旨&lt;/strong&gt;：&lt;strong&gt;Context is King.&lt;/strong&gt; (语境即王)
本协议面向人类工程师与 AI 编程助手，提供两种可切换的工作模式：&lt;strong&gt;标准工程模式 (Standard)&lt;/strong&gt; 与 &lt;strong&gt;灵动编码模式 (Vibe)&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;0. 模式路由 (Mode Routing)&lt;/h2&gt;
&lt;p&gt;在开始任何协作前，先判断当前处于哪一种语境：&lt;/p&gt;
&lt;h3&gt;场景 A：存量项目 / 复杂工程&lt;/h3&gt;
&lt;p&gt;满足任一条件即视为存量项目：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;存在 &lt;code&gt;go.mod&lt;/code&gt; / &lt;code&gt;package.json&lt;/code&gt; / &lt;code&gt;pyproject.toml&lt;/code&gt; / &lt;code&gt;pom.xml&lt;/code&gt; / &lt;code&gt;Cargo.toml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;存在明显代码树（如 &lt;code&gt;cmd/&lt;/code&gt;、&lt;code&gt;internal/&lt;/code&gt;、&lt;code&gt;pkg/&lt;/code&gt;、&lt;code&gt;src/&lt;/code&gt;）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;进入 &lt;strong&gt;1. 标准工程模式&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;场景 B：新项目 / 快速原型&lt;/h3&gt;
&lt;p&gt;满足全部条件才视为新项目：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;目录中没有上述语言工程文件&lt;/li&gt;
&lt;li&gt;目录中没有明显代码树&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;进入 &lt;strong&gt;2. 灵动编码模式&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;冲突解法：介于两者之间&lt;/h3&gt;
&lt;p&gt;如果目录不空，但缺少 &lt;code&gt;docs/architecture/system_map.md&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;若代码明显存在 -&amp;gt; 仍按 &lt;strong&gt;标准工程模式&lt;/strong&gt; 执行，但先补齐地图入口&lt;/li&gt;
&lt;li&gt;若代码基本不存在 -&amp;gt; 按 &lt;strong&gt;灵动编码模式&lt;/strong&gt; 执行&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 标准工程模式 (Standard)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心宗旨&lt;/strong&gt;：&lt;strong&gt;Map First, Code Follows.&lt;/strong&gt; (地图先行，代码追随)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1.1 核心宪法：地图-疆域铁律 (The Map-Territory Laws)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;入口即地图&lt;/strong&gt;：项目的唯一入口是 &lt;code&gt;docs/architecture/system_map.md&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码即真相&lt;/strong&gt;：当引入新库、重构、变更接口，地图必须在同一原子操作中同步更新。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用完即焚&lt;/strong&gt;：探索与推演必须外化为临时脚手架，落地验证后必须清理，仅保留生效事实。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目兼容优先&lt;/strong&gt;：若项目已存在成熟脚手架/工程化体系，本协议必须以“兼容并吸收”为准则，不得强行改造目录树。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.2 物理基础设施 (Physical Infrastructure)&lt;/h3&gt;
&lt;h4&gt;文档树 (&lt;code&gt;docs/&lt;/code&gt;) —— 单一事实来源&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;docs/
├── guides/        # [手册] 运行、配置、排障、协作
├── integrations/  # [契约] API 定义与第三方系统集成
├── features/      # [规格] PRD、验收标准
├── architecture/  # [地图] 核心认知入口
│   ├── system_map.md      # 架构拓扑图、模块依赖、资产清单
│   └── variable_index.md  # 全局变量命名索引表
├── memories/      # [记忆] AI 协作上下文
│   ├── rules.md                  # 项目特定的 AI 行为准则
│   ├── context.md                # 当前迭代的背景信息
│   └── universal_prompt.md       # 通用记忆提示词（跨任务沉淀）
├── incidents/     # [复盘] 事故档案
└── archive/       # [遗迹] 已废弃的设计与文档
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;脚手架树 (&lt;code&gt;specs/&lt;/code&gt;) —— 工作记忆&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;specs/
└── temp_task_name.md      # 任务推演、伪代码、风险、依赖评估
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;代码树策略（适配现有项目，不强制）&lt;/h4&gt;
&lt;p&gt;本协议中的“代码树示例”仅用于新项目或缺少工程规范时的参考。&lt;/p&gt;
&lt;p&gt;如果项目已具备成熟脚手架（例如已存在明确分层、构建流程、CI、测试规范），则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;优先复用项目既有结构&lt;/strong&gt;，忽略本协议中的示例代码树&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只补缺口&lt;/strong&gt;：把缺失的文档入口、记忆固化、SOP 闭环补齐&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;吸收优点&lt;/strong&gt;：把该脚手架的优势写入 &lt;code&gt;docs/memories/universal_prompt.md&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.3 记忆引导规范 (Memory Guidance)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;L1 核心记忆&lt;/strong&gt;：&lt;code&gt;docs/architecture/&lt;/code&gt;，用于定义系统事实与约束&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L2 工作记忆&lt;/strong&gt;：&lt;code&gt;specs/&lt;/code&gt;，用于承载推演过程，任务结束必须清理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L3 辅助记忆&lt;/strong&gt;：&lt;code&gt;docs/memories/&lt;/code&gt;，用于沉淀协作偏好与隐性约束&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;执行顺序约束：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;开始实现前必须读取 &lt;code&gt;docs/architecture/system_map.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改模块前必须读取对应模块的局部地图（优先 &lt;code&gt;claude.md&lt;/code&gt;，或按项目约定的模块说明文档）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.4 通用记忆提示词固化 (Universal Memory Prompt)&lt;/h3&gt;
&lt;p&gt;在执行本协议的过程中与执行完成后，必须将可复用的“记忆规范”固化到 &lt;code&gt;docs/memories/universal_prompt.md&lt;/code&gt;，用于后续任务的通用记忆提示词。&lt;/p&gt;
&lt;p&gt;新增规则：脚手架吸收 (Scaffold Assimilation)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;当进入一个成熟项目时，必须先盘点其工程化能力：目录结构、依赖管理、构建命令、测试命令、lint/format、CI、发布流程。&lt;/li&gt;
&lt;li&gt;将盘点出的“可复用优点”收敛为规则条目，写入 &lt;code&gt;docs/memories/universal_prompt.md&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果该项目的规范与本协议冲突，以项目现行规范为准，并把冲突解法写入通用记忆提示词。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;固化规则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;写入时机&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;执行过程中：一旦确认某条规则会在未来重复使用，就立即追加&lt;/li&gt;
&lt;li&gt;执行结束后：在交割阶段进行一次统一收敛，删除重复条目&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写入范围&lt;/strong&gt;（只写可迁移的规律，不写一次性细节）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;禁止写入&lt;/strong&gt;：密钥、Token、账号、私有链接、任何敏感信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件缺失处理&lt;/strong&gt;：如果 &lt;code&gt;docs/memories/universal_prompt.md&lt;/code&gt; 不存在，则先创建再写入&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;推荐条目格式（每条一段）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[WHEN] 触发条件：...
[RULE] 规则：...
[WHY] 原因：...
[HOW] 执行方式：...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.5 标准作业程序 (SOP)&lt;/h3&gt;
&lt;p&gt;所有任务必须按 &lt;strong&gt;“认知 -&amp;gt; 推演 -&amp;gt; 施工 -&amp;gt; 测绘”&lt;/strong&gt; 执行：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;认知&lt;/strong&gt;：阅读 &lt;code&gt;system_map.md&lt;/code&gt; 与 &lt;code&gt;variable_index.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推演&lt;/strong&gt;：创建 &lt;code&gt;specs/temp_task_name.md&lt;/code&gt;，写伪代码、选轮子、列风险&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;施工&lt;/strong&gt;：实现代码，确保可运行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测绘&lt;/strong&gt;：同步更新地图/变量表/模块文档，清理 &lt;code&gt;specs/&lt;/code&gt;，收敛写入 &lt;code&gt;docs/memories/universal_prompt.md&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.6 编码与质量规范 (Quality Standards)&lt;/h3&gt;
&lt;p&gt;通用规则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;变量命名宪法&lt;/strong&gt;：先检索 &lt;code&gt;variable_index.md&lt;/code&gt;，已存在则复用，不造同义词&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPO 模型&lt;/strong&gt;：Input -&amp;gt; Process -&amp;gt; Output，业务纯逻辑尽量无副作用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;胶水编程&lt;/strong&gt;：能连不造，能抄不写，第三方库只写 Adapter 不改源码&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Go 特别条款：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I/O 链路必须透传 &lt;code&gt;context.Context&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;错误必须显式处理，禁止忽略错误&lt;/li&gt;
&lt;li&gt;依赖注入优先接口，保证可测试&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 灵动编码模式 (Vibe Coding)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心宗旨&lt;/strong&gt;：&lt;strong&gt;Flow First, Structure Emerges.&lt;/strong&gt; (心流先行，结构涌现)
你是专业的 AI 编程助手，以“每步可运行”为目标推进。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.1 启动仪式 (必须先问)&lt;/h3&gt;
&lt;p&gt;在新项目中，必须按顺序只问以下三个问题，不进行其他操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;你想做什么项目？&lt;/strong&gt;（一句话描述）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;你熟悉什么编程语言？&lt;/strong&gt;（不熟悉也没关系）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;你的操作系统是什么？&lt;/strong&gt;（Windows/macOS/Linux）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.2 一步一问 (强制交互规则)&lt;/h3&gt;
&lt;p&gt;收集完信息后，严格进入“做一步 -&amp;gt; 让用户验证 -&amp;gt; 再做下一步”的循环。&lt;/p&gt;
&lt;p&gt;在 Vibe 模式下，一旦形成“可以跨项目复用的固定问法/固定命令/固定排障套路”，也必须追加到 &lt;code&gt;docs/memories/universal_prompt.md&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;End of Protocol&lt;/strong&gt;
本协议即刻生效。后续所有协作均以此为最高准则。&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Git 救火指南：手动复制项目目录后，如何优雅地关联远程历史？</title><link>https://iqwq.com/posts/study/git-grafting-repo/</link><guid isPermaLink="true">https://iqwq.com/posts/study/git-grafting-repo/</guid><description>当你偷懒没有 git clone，而是直接复制文件到新目录开发后，发现无法推送代码怎么办？本文介绍如何使用 git reset --soft 将全新的本地代码“嫁接”回远程仓库历史。</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我们在迭代项目（特别是做脚手架或重构）时，经常会干一件“偷懒”的事：&lt;/p&gt;
&lt;p&gt;不想处理繁琐的分支切换，直接把老项目的代码文件夹复制一份，改个名字（比如 &lt;code&gt;v0.2.1&lt;/code&gt;），然后在这个新目录里大刀阔斧地修改。改完之后，心满意足地 &lt;code&gt;git init&lt;/code&gt;，准备推送到原来的 GitHub 仓库。&lt;/p&gt;
&lt;p&gt;今天在开发我的 &lt;code&gt;go-scaffold&lt;/code&gt; v0.2.1 版本时，我就这么干了。结果在推送时，Git 给了我当头一棒。&lt;/p&gt;
&lt;h3&gt;事故现场&lt;/h3&gt;
&lt;p&gt;我在本地初始化了仓库并提交了所有代码，但在 &lt;code&gt;git push&lt;/code&gt; 时遇到了报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git push -u origin main

To github.com:rei0721/go-scaffold.git
 ! [rejected]        main -&amp;gt; main (fetch first)
error: failed to push some refs to &apos;github.com:rei0721/go-scaffold.git&apos;
hint: Updates were rejected because the remote contains work that you do not
hint: have locally.

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;发生了什么？&lt;/h3&gt;
&lt;p&gt;这个报错的原因很简单：&lt;strong&gt;“平行宇宙”&lt;/strong&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;远程仓库&lt;/strong&gt;：有着 v0.1.0 以前的提交历史。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地仓库&lt;/strong&gt;：虽然代码是基于 v0.1.0 修改的，但因为我是新建的文件夹并执行了 &lt;code&gt;git init&lt;/code&gt;，在 Git 眼里，这是一个&lt;strong&gt;全新诞生&lt;/strong&gt;的宇宙，和远程仓库没有任何血缘关系（Common Ancestor）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;并不是最好的选择&lt;/h3&gt;
&lt;p&gt;通常大家会搜到两种解决方案，但在这个场景下都不完美：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;git push -f&lt;/code&gt; (强推)&lt;/strong&gt;：这会直接覆盖掉远程仓库的所有历史。但我&lt;strong&gt;想保留&lt;/strong&gt;之前的提交记录，毕竟那是项目的演进史。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;git pull --allow-unrelated-histories&lt;/code&gt;&lt;/strong&gt;：强制合并两个不相关的历史。这通常会导致成百上千个文件的 Merge Conflict（因为 Git 认为你在两边分别创建了同名文件），处理起来极其痛苦。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;最佳解决方案：Soft Reset &quot;嫁接&quot;法&lt;/h3&gt;
&lt;p&gt;我们需要做的，是把本地这“一坨”已经改好的文件，假装是基于远程最新代码修改的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心思路&lt;/strong&gt;：把本地 Git 指针强制移到远程的最新节点上，但&lt;strong&gt;保留&lt;/strong&gt;工作区的所有文件内容不变。&lt;/p&gt;
&lt;h4&gt;1. 获取远程历史&lt;/h4&gt;
&lt;p&gt;首先，把远程仓库的“地图”拿下来（这一步不会修改你的代码文件）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git fetch origin main

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. 软重置（Magic Step）&lt;/h4&gt;
&lt;p&gt;这是最关键的一步。我们使用 &lt;code&gt;--soft&lt;/code&gt; 参数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git reset --soft origin/main

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这条命令的意思是：“Git，请把我的当前版本回退到 &lt;code&gt;origin/main&lt;/code&gt; 的状态，&lt;strong&gt;但是&lt;/strong&gt;，把我和 &lt;code&gt;origin/main&lt;/code&gt; 之间所有的文件差异，都保留在‘暂存区’（Staged）里。”&lt;/p&gt;
&lt;p&gt;执行完这步，原本那个“断头”的本地 Commit 消失了，取而代之的是所有文件变成了待提交状态。&lt;/p&gt;
&lt;h4&gt;3. 重新提交&lt;/h4&gt;
&lt;p&gt;现在，Git 认为我是在远程历史的基础上，一次性修改了所有文件。我们可以愉快地提交了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add .
git commit -m &quot;feat(core): add user and rbac modules with async execution framework&quot;

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4. 处理 Tag (如果之前打过)&lt;/h4&gt;
&lt;p&gt;因为我之前在“平行宇宙”里打过 &lt;code&gt;v0.2.1&lt;/code&gt; 的标签，那个标签现在指向一个不存在的 Commit，需要重打：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 删除旧标签
git tag -d v0.2.1
# 在新的历史树上重新打标签
git tag -a v0.2.1 -m &quot;feat(core): v0.2.1 release&quot;

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;5. 推送&lt;/h4&gt;
&lt;p&gt;现在，本地历史和远程历史完美连成了一条线：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push -u origin main
git push origin v0.2.1

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;以后如果再因为手动复制项目目录导致 Git 历史断裂，千万不要慌张地强推或合并。记住 &lt;strong&gt;&lt;code&gt;git reset --soft origin/main&lt;/code&gt;&lt;/strong&gt;，它可以帮你把断掉的历史优雅地接回去。&lt;/p&gt;
&lt;p&gt;既保留了以前的提交记录，又把最新的 v0.2.1 完美发布了，舒服。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Git 发布规范</title><link>https://iqwq.com/posts/study/git-push-spec/</link><guid isPermaLink="true">https://iqwq.com/posts/study/git-push-spec/</guid><description>Git 发布规范</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Git 发布规范（企业级工程实践）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本文介绍一套在中大型项目中被广泛使用的 Git 发布规范，结合
&lt;strong&gt;Git Flow + Conventional Commits + SemVer&lt;/strong&gt;
用于构建可维护、可回滚、可自动化发布的软件工程体系。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这套规范适用于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go 后端服务&lt;/li&gt;
&lt;li&gt;前端 Web 项目&lt;/li&gt;
&lt;li&gt;基础设施库（RBAC、HTTP Server、Cache、ORM、SDK 等）&lt;/li&gt;
&lt;li&gt;开源项目&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;一、为什么需要发布规范&lt;/h2&gt;
&lt;p&gt;没有发布规范的项目通常会出现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;版本号混乱（v1、v1.1_final、v1_fix）&lt;/li&gt;
&lt;li&gt;不知道哪些提交已经上线&lt;/li&gt;
&lt;li&gt;线上 Bug 无法快速回滚&lt;/li&gt;
&lt;li&gt;API 被破坏却无感知&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;发布规范的目标是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每一次上线都是可追溯的&lt;/li&gt;
&lt;li&gt;每一个版本都有明确语义&lt;/li&gt;
&lt;li&gt;自动生成 changelog&lt;/li&gt;
&lt;li&gt;自动触发 CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;二、核心组成&lt;/h2&gt;
&lt;p&gt;本规范由三部分组成：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;Git Flow&lt;/td&gt;
&lt;td&gt;分支管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SemVer&lt;/td&gt;
&lt;td&gt;版本号规则&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conventional Commits&lt;/td&gt;
&lt;td&gt;提交规范&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;三者结合后，就形成了一套可自动化的发布体系。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、分支模型（Git Flow）&lt;/h2&gt;
&lt;p&gt;标准分支如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;main        # 生产环境代码
develop     # 开发主分支
feature/*   # 功能开发
release/*   # 发版准备
hotfix/*    # 线上紧急修复
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;main&lt;/td&gt;
&lt;td&gt;永远是可上线状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;develop&lt;/td&gt;
&lt;td&gt;所有新功能集成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;feature&lt;/td&gt;
&lt;td&gt;一个功能一个分支&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;release&lt;/td&gt;
&lt;td&gt;冻结版本，只修 bug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hotfix&lt;/td&gt;
&lt;td&gt;修复线上问题&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;四、版本号规则（SemVer）&lt;/h2&gt;
&lt;p&gt;格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MAJOR.MINOR.PATCH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;v1.0.0
v1.2.3
v2.0.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;含义：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;MAJOR&lt;/td&gt;
&lt;td&gt;不兼容的 API 变更&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MINOR&lt;/td&gt;
&lt;td&gt;新功能（兼容）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PATCH&lt;/td&gt;
&lt;td&gt;Bug 修复&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;五、Commit Message 规范&lt;/h2&gt;
&lt;p&gt;格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): &amp;lt;subject&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;feat(auth): add jwt refresh token
fix(cache): prevent redis deadlock
refactor(repo): simplify repository layer
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;常用 type&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;type&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;feat&lt;/td&gt;
&lt;td&gt;新功能&lt;/td&gt;
&lt;td&gt;MINOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fix&lt;/td&gt;
&lt;td&gt;Bug 修复&lt;/td&gt;
&lt;td&gt;PATCH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;perf&lt;/td&gt;
&lt;td&gt;性能优化&lt;/td&gt;
&lt;td&gt;PATCH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;refactor&lt;/td&gt;
&lt;td&gt;重构&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docs&lt;/td&gt;
&lt;td&gt;文档&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;test&lt;/td&gt;
&lt;td&gt;测试&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;build&lt;/td&gt;
&lt;td&gt;构建系统&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ci&lt;/td&gt;
&lt;td&gt;CI 配置&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;chore&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;h3&gt;破坏性变更&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;feat(auth)!: change jwt payload structure
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;BREAKING CHANGE: token format updated
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这会触发 MAJOR 版本升级。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;六、标准发布流程&lt;/h2&gt;
&lt;h3&gt;1. 开发功能&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git checkout develop
git checkout -b feature/login
git commit -m &quot;feat(auth): implement login&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2. 发版冻结&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git checkout develop
git checkout -b release/1.2.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只允许修 bug：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git commit -m &quot;fix(auth): correct token expiry&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3. 发布到生产&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git checkout main
git merge release/1.2.0
git tag v1.2.0
git push origin main --tags
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同步回 develop：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git checkout develop
git merge release/1.2.0
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;七、线上紧急修复（Hotfix）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git checkout main
git checkout -b hotfix/1.2.1
git commit -m &quot;fix(cache): avoid nil pointer&quot;
git checkout main
git merge hotfix/1.2.1
git tag v1.2.1
git push --tags
git checkout develop
git merge hotfix/1.2.1
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;八、自动化发布&lt;/h2&gt;
&lt;p&gt;使用此规范，可以直接接入：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;semantic-release&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;GitLab CI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自动完成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;计算版本号&lt;/li&gt;
&lt;li&gt;生成 CHANGELOG&lt;/li&gt;
&lt;li&gt;打 tag&lt;/li&gt;
&lt;li&gt;发布 GitHub Release&lt;/li&gt;
&lt;li&gt;发布 Go Module / npm 包&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;九、结论&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Git 发布规范是区分“写代码”和“做工程”的分水岭。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你在做的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API Server&lt;/li&gt;
&lt;li&gt;基础库&lt;/li&gt;
&lt;li&gt;框架&lt;/li&gt;
&lt;li&gt;团队项目&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你必须使用这一套规范。&lt;/p&gt;
</content:encoded></item><item><title>安装 GCC</title><link>https://iqwq.com/posts/study/install-gcc/</link><guid isPermaLink="true">https://iqwq.com/posts/study/install-gcc/</guid><description>安装 GCC</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;一、Windows 安装 GCC（推荐：MSYS2 / MinGW-w64）&lt;/h1&gt;
&lt;p&gt;在 Windows 上，真正可用的 GCC 来自 &lt;strong&gt;MinGW-w64&lt;/strong&gt;。最干净、可维护性最强的方式是通过 &lt;strong&gt;MSYS2&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;1️⃣ 下载 MSYS2&lt;/h2&gt;
&lt;p&gt;打开：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.msys2.org&quot;&gt;https://www.msys2.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下载 &lt;code&gt;msys2-x86_64-*.exe&lt;/code&gt; 并安装（一路 Next 即可）&lt;/p&gt;
&lt;p&gt;安装完成后，启动：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;MSYS2 UCRT64&lt;/strong&gt; 或 &lt;strong&gt;MSYS2 MinGW64&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;2️⃣ 更新 MSYS2&lt;/h2&gt;
&lt;p&gt;在 MSYS2 终端中执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pacman -Syu
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关闭窗口 → 重新打开 MSYS2 → 再执行一次：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pacman -Syu
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3️⃣ 安装 GCC（MinGW-w64 版本）&lt;/h2&gt;
&lt;p&gt;如果你用的是 &lt;strong&gt;MinGW64 终端&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pacman -S mingw-w64-x86_64-gcc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是 &lt;strong&gt;UCRT64 终端&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pacman -S mingw-w64-ucrt-x86_64-gcc
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4️⃣ 添加到 Windows PATH&lt;/h2&gt;
&lt;p&gt;找到安装目录，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\msys64\mingw64\bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\msys64\ucrt64\bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把它加入 Windows 环境变量 PATH。&lt;/p&gt;
&lt;p&gt;然后在 Windows CMD / PowerShell 中测试：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果输出版本号，说明安装成功。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5️⃣ 测试 GCC&lt;/h2&gt;
&lt;p&gt;创建 &lt;code&gt;test.c&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    printf(&quot;GCC works!\n&quot;);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译并运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc test.c -o test
test
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;二、Linux 安装 GCC&lt;/h1&gt;
&lt;h2&gt;Ubuntu / Debian&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install build-essential
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc --version
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;CentOS / Rocky / Alma&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf groupinstall &quot;Development Tools&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;三、macOS 安装 GCC（本质是 clang）&lt;/h1&gt;
&lt;p&gt;macOS 使用的是 LLVM clang，但行为与 gcc 兼容。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xcode-select --install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc --version
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;四、你为什么需要 GCC（与你的 Go 开发强相关）&lt;/h1&gt;
&lt;p&gt;你现在在做 Go 基础设施、Gin、gRPC、Redis、数据库、Nginx 类服务，这些场景中 &lt;strong&gt;GCC 是隐性刚需&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;是否需要 GCC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cgo&lt;/td&gt;
&lt;td&gt;必须&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sqlite / rocksdb&lt;/td&gt;
&lt;td&gt;必须&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenSSL / zlib&lt;/td&gt;
&lt;td&gt;必须&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kafka / librdkafka&lt;/td&gt;
&lt;td&gt;必须&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gin + sqlite&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;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果你要做类似你规划的 &lt;strong&gt;Go HTTP Server / Nginx-like framework / Infra toolkit&lt;/strong&gt;，没有 GCC 会大量报错。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;五、不要用这些方案（踩坑提醒）&lt;/h1&gt;
&lt;p&gt;❌ TDM-GCC
❌ 老版 MinGW
❌ Dev-C++ 内置 GCC
❌ Visual Studio C 编译器（和 GCC ABI 不兼容）&lt;/p&gt;
&lt;p&gt;这些都会在 Go + cgo + OpenSSL + SQLite + Kafka 时爆炸。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;六、结论&lt;/h1&gt;
&lt;p&gt;如果你是 Windows + Go 后端开发者，&lt;strong&gt;唯一正确选择是：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MSYS2 + MinGW-w64 GCC&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是企业级 Go 项目在 Windows 上的标准编译环境。&lt;/p&gt;
</content:encoded></item><item><title>摘抄一下梁祝的对白</title><link>https://iqwq.com/posts/blog/note-quote-liangzhu/</link><guid isPermaLink="true">https://iqwq.com/posts/blog/note-quote-liangzhu/</guid><description>摘抄梁祝的对白</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;汉人说有几千年文化，老是要感化蛮夷外族，现在胡人霸占了北方，汉人就被迫南渡过江逃难，先过江的霸着大官来做，排挤后过江的，士族要互相拉拢，所以婚嫁就讲求门当户对，朱门对朱门，竹门对竹门，我没躲起来，只是站在门外，看着他们。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;祝夫人：你这么年轻，应该趾高气昂，为人所不能为之事，你跟英台，相处不过半载，感情不深，很容易放下，希望你能写封信给英台，说明你的胸襟，不只儿女私情这么窄。&lt;/p&gt;
&lt;p&gt;梁山伯：我不会写的。&lt;/p&gt;
&lt;p&gt;祝夫人：你不写？你以为愤怒就可以改变跟英台的命运，你以为很不满，胡人就可以忍让南边的汉人，要怨就怨你们生错了地方，生在这个我们汉室没落的时候，人人都这么虚伪、迂腐和势利。要怨就怨你们太多想法，年少无知到了，以为你们不喜欢就可以改变周边的人，以为靠你们两个就可以改变这个时代。&lt;/p&gt;
&lt;p&gt;梁山伯：够了，你不是在说我们，你这是在自怨自艾。&lt;/p&gt;
&lt;p&gt;祝夫人：县令大人，我可以为英台跪在你面前，你又可以为英台做些什么呢？大人，你说我逼你，英台知道了一定不开心，但是，如果你看到了英台现在的样子，那你就知道，其实，是你们在逼我。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;和尚：祝夫人，这河里的鱼，我看你应该放生。&lt;/p&gt;
&lt;p&gt;祝夫人：放他们出去，外面的环境恶劣，适应不了，它们会死的。&lt;/p&gt;
&lt;p&gt;和尚：变得不适应，因为他们原本来自江河大海，世上，根本不应该有池塘。&lt;/p&gt;
&lt;p&gt;祝夫人：说的挺潇洒，放得下你就不会出家做和尚。&lt;/p&gt;
&lt;p&gt;和尚：我身无一物，有什么放不下，你什么都有，还什么都想要，贪心到连人家的东西都要，你要的实在太多了，你困住他们，他们就跟这儿的鱼一样，不敢见人，能放下就放下吧。网开一面，功德无量。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;转载：https://movie.douban.com/review/16049658/&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>摘录</title><link>https://iqwq.com/posts/blog/note-quote/</link><guid isPermaLink="true">https://iqwq.com/posts/blog/note-quote/</guid><description>摘录一些喜欢的诗词句。</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;你这么年轻，应该趾高气昂，为人所不能为之事。
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>笔记，动漫</title><link>https://iqwq.com/posts/blog/note-tv/</link><guid isPermaLink="true">https://iqwq.com/posts/blog/note-tv/</guid><description>笔记，动漫。</description><pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;仙逆&lt;/h2&gt;
&lt;p&gt;观看至第 122 集。&lt;/p&gt;
&lt;h2&gt;降世神通&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;已看完&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>记录看过的小说笔记</title><link>https://iqwq.com/posts/blog/note-novel/</link><guid isPermaLink="true">https://iqwq.com/posts/blog/note-novel/</guid><description>记录自己阅读过的小说笔记。</description><pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;盗墓 / 悬疑 / 奇幻 / 修真 / 仙侠 / 都市 / 历史 / 科幻 / 言情 / 武侠 / 轻小说 / 同人 / 其他&lt;/p&gt;
&lt;h2&gt;最后一个道士&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;《最后一个道士》 / 《道门往事》 / 《一代天师》&lt;/li&gt;
&lt;li&gt;作者：夏忆&lt;/li&gt;
&lt;li&gt;类型：恐怖 / 悬疑&lt;/li&gt;
&lt;li&gt;简介：查文斌——茅山派祖印持有者，正天道最后一代掌教传人。他救人于阴阳之间，却引业火烧身，遭天罚阴遣；仗侠肝义胆与一身道术，救活人于阴阳罅隙，渡死人于无间鬼道！诡异古村中，阴差煞言七个村民必死无疑。查文斌却一人逆天而行，将军庙里大战百年邪道，奈何桥上对决阴差，然而，七个村民还是没躲过劫数……此后，查文斌随着一路追寻，引出封山、古蜀国、西羌族等一系列离奇故事。凡人究竟能否改变上天注定的命运？失落的村庄究竟暗藏了多少恐怖故事？数百年未曾找到的答案究竟是什么？&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.qidian.com/book/1025905914/&quot;&gt;最后一个道士 1-7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;复活全人类&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;作者：狂小风&lt;/li&gt;
&lt;li&gt;类型：科幻 / 末世&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>vue指令安装时参数带-d与不带-d</title><link>https://iqwq.com/posts/study/issue-command-parameter-d-during-vue-install/</link><guid isPermaLink="true">https://iqwq.com/posts/study/issue-command-parameter-d-during-vue-install/</guid><description>vue指令安装时参数带-d与不带-d</description><pubDate>Fri, 12 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;📌 &lt;code&gt;pnpm add&lt;/code&gt; 的两个常见参数&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;&lt;code&gt;pnpm add 包名&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;安装到 &lt;strong&gt;生产依赖 (dependencies)&lt;/strong&gt;，打包上线时也会带上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pnpm add -D 包名&lt;/code&gt; 或 &lt;code&gt;--save-dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;安装到 &lt;strong&gt;开发依赖 (devDependencies)&lt;/strong&gt;，只在开发/构建时用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📦 为什么有些包用 &lt;code&gt;-D&lt;/code&gt;，有些不用？&lt;/h2&gt;
&lt;p&gt;这取决于&lt;strong&gt;这个包是否会在「运行时」被用户使用&lt;/strong&gt;：&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;🟢 运行时依赖（不加 &lt;code&gt;-D&lt;/code&gt;）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;会在项目实际运行中被使用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这些库的代码会被打进你的最终应用里：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pinia&lt;/code&gt;：状态管理，运行时使用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@pinia/nuxt&lt;/code&gt;：Nuxt 模块，在 Nuxt 启动时注入运行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pinia-plugin-persistedstate&lt;/code&gt;：在浏览器中持久化 store，运行时执行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm add pinia @pinia/nuxt pinia-plugin-persistedstate
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🟡 开发时依赖（要 &lt;code&gt;-D&lt;/code&gt;）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;只在开发、构建、编译阶段用，不会打包进产物&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;unocss&lt;/code&gt; / &lt;code&gt;@unocss/nuxt&lt;/code&gt;：是原子化 CSS 引擎，只在开发构建时生成样式，运行时不会执行 JS 逻辑&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm add -D unocss @unocss/nuxt
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;✅ 总结记忆法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;运行时使用 → 不加 &lt;code&gt;-D&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只在开发构建用 → 加 &lt;code&gt;-D&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>什么是杀青？</title><link>https://iqwq.com/posts/blog/shaqing/</link><guid isPermaLink="true">https://iqwq.com/posts/blog/shaqing/</guid><description>标记一下“杀青”这个梗的由来。</description><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;什么是“杀青”？
其实最早可不是拍戏完撒花啊 😂&lt;/p&gt;
&lt;p&gt;古代人写字用竹简，竹子表面油油的还容易招虫，咋办？——拿去火上烤一下！
烤完水分没了，颜色从绿变白，就叫 &lt;strong&gt;“杀青”&lt;/strong&gt;。
这样一来，不光好写字，还能放久点，不怕虫咬。&lt;/p&gt;
&lt;p&gt;后来呢，“杀青”就慢慢变味了——写文章完稿也叫杀青。
再后来，拍电影电视剧一结束，大家就开个“杀青仪式”，其实就是“终于完事啦，可以收工啦”的意思 ✌️。&lt;/p&gt;
&lt;p&gt;顺带一提，茶叶里也有“杀青”，就是用高温把叶子烫一下，保持绿色，方便后续揉捻。
所以你喝茶的时候，也算是跟古人有点“杀青缘”了，欸嘿嘿 🍵。&lt;/p&gt;
&lt;p&gt;为什么要记录呢？……嗯，闲的。脑子笨，啥都记不住。
写下来随便记记，也不知道记下来有什么用，反正就想记着玩。&lt;/p&gt;
&lt;p&gt;也是因为刷到几个短视频，像《果宝特攻》《JOJO》那种杀青撒花配BGM的。
突然就勾起童年回忆，唉……时间真的快啊，一转眼就过去了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;6.97 09/20 oQx:/ X@z.go 二乔在地府里从后门溜走逃过一劫 # jojo的奇妙冒险 # 杀青梗 # 动漫 # dou+上热门 # 乔瑟夫乔斯达  https://v.douyin.com/TdhA4d2No1s/ 复制此链接，打开Dou音搜索，直接观看视频！
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;1.23 v@F.uF 05/19 WzT:/ 杀青梗是世界上最伟大的发明.# 果宝特攻 # mvp # 回忆 # 童年 # 杀青  https://v.douyin.com/F9IYsuF6F_Q/ 复制此链接，打开Dou音搜索，直接观看视频！
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>随手记</title><link>https://iqwq.com/posts/blog/srinivasa-ramanujan/</link><guid isPermaLink="true">https://iqwq.com/posts/blog/srinivasa-ramanujan/</guid><description>随手记</description><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;拉马努金π公式&lt;/strong&gt;被用于高精度计算π（圆周率）的值。这个公式是由印度数学家&lt;strong&gt;斯里尼瓦瑟·拉马努金（Srinivasa Ramanujan）&lt;/strong&gt; 在20世纪初发现的，具有极快的收敛速度，因此非常适合用来计算π的数值。&lt;/p&gt;
&lt;h3&gt;公式解释：&lt;/h3&gt;
&lt;p&gt;$$
\frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum_{k=0}^{\infty} \frac{(4k)!(1103 + 26390k)}{(k!)^4 396^{4k}}
$$&lt;/p&gt;
&lt;h3&gt;组成部分说明：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;无穷级数求和符号&lt;/strong&gt;（$\sum_{k=0}^{\infty}$）：表示该公式是通过将每个 $k$ 值从0开始代入并累加所有项。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;阶乘符号&lt;/strong&gt;（$(4k)!$ 和 $(k!)^4$）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$(4k)!$ 是 $4k$ 的阶乘。&lt;/li&gt;
&lt;li&gt;$(k!)^4$ 是 $k!$ 的四次方。&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;$1103$ 和 $26390$ 是特殊的常数。&lt;/li&gt;
&lt;li&gt;$396^{4k}$：分母中包含指数增长的项，确保该级数收敛非常快。&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;$\frac{2\sqrt{2}}{9801}$：该项用于缩放结果，确保级数和最终结果相匹配。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;重要性质：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;快速收敛&lt;/strong&gt;：这个级数的每一项都迅速减少，因此只需要计算少量项，就能得到非常精确的π值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算π的历史意义&lt;/strong&gt;：该公式是高精度计算π的革命性方法之一。在20世纪，计算机利用这一公式成功计算了数百万位π的小数点。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Git常用指令</title><link>https://iqwq.com/posts/study/git-commands/</link><guid isPermaLink="true">https://iqwq.com/posts/study/git-commands/</guid><description>Git常用指令</description><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Git 操作手册（实用全版）&lt;/h1&gt;
&lt;h2&gt;一、基础概念&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;工作区：你改代码的地方&lt;/li&gt;
&lt;li&gt;暂存区（index）：准备提交的内容&lt;/li&gt;
&lt;li&gt;仓库（repo）：Git 管理的数据&lt;/li&gt;
&lt;li&gt;HEAD：当前指向的提交&lt;/li&gt;
&lt;li&gt;分支：一条提交链&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;二、初始化与配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git init                    # 初始化仓库
git clone &amp;lt;url&amp;gt;            # 克隆远程仓库

git config --global user.name &quot;你的名字&quot;
git config --global user.email &quot;你的邮箱&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --list
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;三、基本流程（最常用）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git status                 # 查看状态
git add &amp;lt;file&amp;gt;             # 添加到暂存区
git add .                  # 全部添加

git commit -m &quot;说明&quot;       # 提交

git log                    # 查看提交记录
git log --oneline          # 简洁版
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;四、分支操作&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git branch                 # 查看分支
git branch &amp;lt;name&amp;gt;          # 创建分支
git checkout &amp;lt;name&amp;gt;        # 切换分支
git checkout -b &amp;lt;name&amp;gt;     # 创建并切换

git switch &amp;lt;name&amp;gt;          # 新写法（推荐）

git merge &amp;lt;name&amp;gt;           # 合并分支
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除分支：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git branch -d &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;五、远程仓库&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git remote -v             # 查看远程
git remote add origin &amp;lt;url&amp;gt;

git push -u origin main   # 推送
git push                  # 后续直接推

git pull                  # 拉取并合并
git fetch                 # 只拉取不合并
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;六、撤销操作（重点）&lt;/h2&gt;
&lt;h3&gt;1. 撤销工作区修改&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git checkout -- &amp;lt;file&amp;gt;
# 或
git restore &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 撤销暂存区&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git reset HEAD &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 回退提交&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git reset --soft HEAD~1    # 保留代码
git reset --hard HEAD~1    # 全部回退（危险）
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 反向提交（安全）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git revert &amp;lt;commit&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;七、查看差异&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git diff                  # 工作区 vs 暂存区
git diff --cached         # 暂存区 vs 仓库
git diff HEAD             # 工作区 vs 最新提交
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;八、暂存（stash）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git stash                 # 临时保存
git stash pop             # 恢复并删除
git stash list            # 查看
git stash apply           # 恢复但不删
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;九、标签（Tag）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git tag                   # 查看
git tag v1.0              # 创建标签
git push origin v1.0      # 推送标签
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;十、日志与历史&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git log --graph --oneline --all
git show &amp;lt;commit&amp;gt;
git reflog                # 查看操作历史（救命用）
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;十一、冲突处理&lt;/h2&gt;
&lt;p&gt;出现冲突后：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
当前分支内容
=======
目标分支内容
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; branch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;处理步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;手动修改文件&lt;/li&gt;
&lt;li&gt;删除冲突标记&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;十二、rebase（进阶）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git rebase &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;作用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;让提交更线性&lt;/li&gt;
&lt;li&gt;替代 merge&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;交互式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git rebase -i HEAD~3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;合并提交&lt;/li&gt;
&lt;li&gt;修改 commit message&lt;/li&gt;
&lt;li&gt;删除提交&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;十三、常见工作流&lt;/h2&gt;
&lt;h3&gt;1. 标准开发流程&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git checkout -b feature/xxx
# 开发
git add .
git commit -m &quot;feat: xxx&quot;

git pull --rebase origin main
git push origin feature/xxx
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2. 更新本地代码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git pull --rebase
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;十四、忽略文件&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.gitignore&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node_modules/
dist/
*.log
.env
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;十五、子模块（了解）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git submodule add &amp;lt;url&amp;gt;
git submodule update --init --recursive
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;十六、常见坑&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;❌ &lt;code&gt;git reset --hard&lt;/code&gt; 会丢数据&lt;/li&gt;
&lt;li&gt;❌ rebase 后不要强推公共分支&lt;/li&gt;
&lt;li&gt;❌ 不要在 main 直接开发&lt;/li&gt;
&lt;li&gt;❌ 忘记 pull 就 push → 冲突&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;十七、救命命令&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git reflog                # 找回误删提交
git reset --hard &amp;lt;hash&amp;gt;   # 回到某次状态
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Hello World</title><link>https://iqwq.com/posts/hello-world/</link><guid isPermaLink="true">https://iqwq.com/posts/hello-world/</guid><description>这是我的第一篇文章，我将在此记录我的Blog。</description><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;你好，世界！&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;这是我的第一篇文章，我将在此记录我的Blog。&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item></channel></rss>