<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://sixiangjia.de/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sixiangjia.de/" rel="alternate" type="text/html" /><updated>2026-03-07T20:56:14+08:00</updated><id>https://sixiangjia.de/feed.xml</id><title type="html">freedom</title><subtitle>An amazing website.</subtitle><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><entry xml:lang="zh"><title type="html">LLM 微调避坑指南：从训练动态到显存账本的深度解剖</title><link href="https://sixiangjia.de/tech/qwen3-finetune/" rel="alternate" type="text/html" title="LLM 微调避坑指南：从训练动态到显存账本的深度解剖" /><published>2026-03-07T00:00:00+08:00</published><updated>2026-03-07T00:00:00+08:00</updated><id>https://sixiangjia.de/tech/qwen3-finetune</id><content type="html" xml:base="https://sixiangjia.de/tech/qwen3-finetune/"><![CDATA[<p>在单卡（如 Tesla P100 16GB）上对大语言模型进行微调时，往往会遇到 Loss 不降、无限复读或显存溢出（OOM）等诡异问题。这篇博客将从底层逻辑出发，拆解 LLM 微调中的核心概念与显存消耗真相。</p>

<h2 id="1-训练时间线epochstep-与有效-batch-size">1. 训练时间线：Epoch、Step 与有效 Batch Size</h2>

<p>在微调极小规模数据集时，最容易踩的坑就是“步数错位”。</p>

<ul>
  <li><strong>Batch Size（批大小）</strong>：单次送入显卡的样本数。</li>
  <li><strong>Step（步）</strong>：模型真正执行一次权重更新（Optimizer Step）的动作。</li>
  <li><strong>Epoch（轮）</strong>：模型将整个训练集完整过一遍。</li>
</ul>

<p><strong>核心陷阱：梯度累积（Gradient Accumulation）</strong>
<code class="language-plaintext highlighter-rouge">gradient_accumulation_steps</code> 是一种用“时间换空间”的机制，通过多次前向/反向传播累积梯度，最后集中更新一次权重，以此模拟大 Batch Size。</p>

<ul>
  <li><strong>公式</strong>：$\text{有效 Batch Size} = \text{单卡 Batch} \times \text{显卡数} \times \text{累积步数}$</li>
  <li><strong>副作用</strong>：如果有效 Batch Size 大于或等于总数据量，会导致 1 个 Step 需要跨越多个 Epoch 才能完成。这会引发训练日志缺失（No log）和严重的过拟合。面对极小数据集，应果断将累积步数设为 1，确保 $1 \text{ Epoch} \ge 1 \text{ Step}$。</li>
</ul>

<h2 id="2-深入模型内脏架构与参数量估算">2. 深入模型内脏：架构与参数量估算</h2>

<p>模型的参数量 $P$ 并非玄学，它与模型的层数（$L$）和隐藏层维度（$H$）高度绑定。</p>

<h3 id="参数量估算公式">参数量估算公式</h3>

<p>对于标准 Transformer 架构：</p>

\[P \approx L \times 12 \times H^2\]

<p>其中，Attention 层贡献约 $4H^2$，MLP 层贡献约 $8H^2$。以 Qwen-3 为例，由于采用了 SwiGLU 激活函数（三路线性层），其 MLP 更加庞大，整体系数更接近 15。</p>

<h3 id="核心组件解析">核心组件解析</h3>

<ul>
  <li><strong>MLP（多层感知机）</strong>：模型的“静态知识库”。它通常先将维度升至 $3H$ 或 $4H$（高维空间更容易拟合复杂非线性规律），再降维回 $H$。</li>
  <li><strong>RMSNorm（均方根层标准化）</strong>：相比传统 LayerNorm，RMSNorm 砍掉了“减均值”的操作，直接除以均方根。它在保持训练稳定性的同时，降低了计算开销，是现代大模型的标配。</li>
</ul>

<h2 id="3-显存刺客你的-vram-都去哪了">3. 显存刺客：你的 VRAM 都去哪了？</h2>

<p>加载一个 0.6B（6 亿参数）的模型，在 BF16（16-bit）精度下只需约 1.2GB 显存（$P \times 2 \text{ Bytes}$）。但在训练时，显存占用会飙升到 10GB 以上，原因在于训练不仅需要存放权重：</p>

<table>
  <thead>
    <tr>
      <th>显存消耗项</th>
      <th>计算公式（经验值）</th>
      <th>描述说明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>模型权重</strong></td>
      <td>$P \times 2$ (BF16)</td>
      <td>模型的静态参数。</td>
    </tr>
    <tr>
      <td><strong>梯度 (Gradients)</strong></td>
      <td>$P \times 2$ (BF16)</td>
      <td>反向传播时的导数。</td>
    </tr>
    <tr>
      <td><strong>优化器状态 (AdamW)</strong></td>
      <td><strong>$P \times 8$ (FP32)</strong></td>
      <td><strong>最大头</strong>。用于存储一阶（动量）和二阶（方差）状态。必须使用 32 位以防精度丢失。</td>
    </tr>
    <tr>
      <td><strong>激活值 (Activations)</strong></td>
      <td>动态变化</td>
      <td>前向传播的中间结果，占用与 Batch Size 和序列长度成正比。</td>
    </tr>
  </tbody>
</table>

<h2 id="4-精度博弈qlora-与-4-bit-量化的妥协">4. 精度博弈：QLoRA 与 4-bit 量化的妥协</h2>

<p>为了在消费级显卡上训练大模型，<code class="language-plaintext highlighter-rouge">BitsAndBytes</code> 提供了 4-bit 量化（如 NF4）方案。</p>

<ul>
  <li><strong>优势</strong>：显存占用砍掉约 75%。</li>
  <li><strong>代价</strong>：量化会带来舍入误差，损失模型在复杂逻辑推导和精细物理运算上的准确度；同时，推理时频繁的“反量化”操作会导致计算速度略降。</li>
  <li><strong>工程决策</strong>：如果显卡容量充足（如 16GB 显卡跑 0.6B 模型），应坚决弃用 4-bit 量化，直接采用全精度（BF16）加载，以换取最高的逻辑上限。</li>
</ul>

<h2 id="5-对抗复读机数据格式与推理干预">5. 对抗“复读机”：数据格式与推理干预</h2>

<p>当模型在生成时陷入无限循环或死记硬背时，通常是以下原因：</p>

<ol>
  <li><strong>ChatML 格式缺失</strong>：缺少 <code class="language-plaintext highlighter-rouge">&lt;|im_start|&gt;</code> 和 <code class="language-plaintext highlighter-rouge">&lt;|im_end|&gt;</code> 这类角色定位 Token，导致模型失去对话的边界感，分不清何时该停止生成。</li>
  <li><strong>严重过拟合</strong>：数据量极小却跑了过多的 Epoch，或 LoRA 设定的 <code class="language-plaintext highlighter-rouge">lora_alpha</code> 学习率过大。</li>
  <li><strong>推理参数固化</strong>：在生成时，可以通过调高 <code class="language-plaintext highlighter-rouge">repetition_penalty</code>（重复惩罚系数，如 1.1 - 1.2）和增加 <code class="language-plaintext highlighter-rouge">temperature</code> 来强行打破复读循环。</li>
</ol>]]></content><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><category term="tech" /><category term="LLM" /><category term="fine-tuning" /><summary type="html"><![CDATA[在单卡（如 Tesla P100 16GB）上对大语言模型进行微调时，往往会遇到 Loss 不降、无限复读或显存溢出（OOM）等诡异问题。这篇博客将从底层逻辑出发，拆解 LLM 微调中的核心概念与显存消耗真相。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sixiangjia.de/assets/images/morandi.jpg" /><media:content medium="image" url="https://sixiangjia.de/assets/images/morandi.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="zh"><title type="html">告别“调包侠”：一文彻底搞懂交叉熵与KL散度的数学羁绊</title><link href="https://sixiangjia.de/tech/divergence/" rel="alternate" type="text/html" title="告别“调包侠”：一文彻底搞懂交叉熵与KL散度的数学羁绊" /><published>2026-03-02T00:00:00+08:00</published><updated>2026-03-02T00:00:00+08:00</updated><id>https://sixiangjia.de/tech/divergence</id><content type="html" xml:base="https://sixiangjia.de/tech/divergence/"><![CDATA[<p>在深度学习的日常搬砖中，写出 <code class="language-plaintext highlighter-rouge">criterion = nn.CrossEntropyLoss()</code> 简直就像喝水一样自然。无论是做图像分类、验证码识别，还是训练大语言模型，交叉熵似乎永远是分类任务的标配。</p>

<p>但是，如果在面试中被问到：<strong>“既然 KL 散度才是衡量两个概率分布差异的指标，为什么我们在分类任务中优化的是交叉熵，而不是 KL 散度？”</strong></p>

<p>很多写了几年代码的算法工程师，可能都会在这里卡壳。今天，我们就把这两个概念掰开揉碎，从直觉到公式，把它们的底层逻辑扒得干干净净。</p>

<hr />

<h3 id="一-直觉先行打车理论">一、 直觉先行：打车理论</h3>

<p>不要一上来就看公式，我们先用一个生活中的例子来建立直觉。</p>

<p>假设你要从公司（<strong>预测分布 $Q$</strong>）回到家里（<strong>真实分布 $P$</strong>），你需要付出一笔代价（Loss）。</p>

<ol>
  <li><strong>真实分布的熵 $H(P)$</strong>：相当于两地之间的 <strong>物理直线距离</strong> 。这是客观存在的固有属性，无论你选什么路线，这段基础距离你都得走。</li>
  <li>
    <table>
      <tbody>
        <tr>
          <td>**KL 散度 $D_{KL}(P</td>
          <td> </td>
          <td>Q)$<strong>：相当于司机因为不认路而 **多绕的冤枉路</strong> 。如果司机完全认路（$Q$ 完美拟合 $P$），冤枉路就是 0；如果司机瞎开，冤枉路就无限长。它是纯粹用来衡量“你有多偏离最优解”的指标。</td>
        </tr>
      </tbody>
    </table>
  </li>
  <li><strong>交叉熵 $H(P, Q)$</strong>：相当于你最后付的<strong>总计车费</strong>。</li>
</ol>

<p>由此，我们可以得出一个极其优美且核心的等式：
<strong>总车费 = 物理距离 + 绕路距离</strong>
<strong>交叉熵 = 真实分布的熵 + KL 散度</strong></p>

<p>在数学上，它长这样：</p>

\[H(P, Q) = H(P) + D_{KL}(P||Q)\]

<hr />

<h3 id="二-灵魂拷问为什么代码里只用交叉熵">二、 灵魂拷问：为什么代码里只用交叉熵？</h3>

<p>既然 KL 散度（绕路距离）才是真正衡量“模型预测与真实答案差距”的指标，为什么 PyTorch 的标准 API 是 <code class="language-plaintext highlighter-rouge">CrossEntropyLoss</code> 呢？</p>

<p>答案就藏在分类任务的 <strong>数据标签（Label）</strong> 里。</p>

<p>在标准的图像分类（比如猫狗识别，或者字母验证码识别）中，图片的真实标签是确定无疑的。它转换成概率分布就是独热编码（One-Hot），例如 <code class="language-plaintext highlighter-rouge">[1.0, 0.0, 0.0]</code>。</p>

<p>对于这种<strong>绝对确定的事件，它的不确定性为零，所以真实分布的熵 $H(P) = 0$</strong>。</p>

<p>既然 $H(P)$ 等于 0，那么我们的核心公式就变成了：</p>

\[H(P, Q) = 0 + D_{KL}(P||Q)\]

\[H(P, Q) = D_{KL}(P||Q)\]

<p><strong>结论呼之欲出：在标准分类任务中，优化交叉熵，在数学上完全等价于优化 KL 散度！</strong></p>

<p>那为什么底层代码偏偏选中了交叉熵？纯粹是因为<strong>计算极其高效</strong>。交叉熵的公式是 $-\sum P(x) \log Q(x)$。因为真实标签 $P(x)$ 里只有一个 1，剩下全是 0，大量的乘法直接被抹掉了，这能为 GPU 节省海量的算力。</p>

<hr />

<h3 id="三-咬文嚼字为什么叫散度而不叫距离">三、 咬文嚼字：为什么叫“散度”而不叫“距离”？</h3>

<p>KL 散度（Kullback-Leibler Divergence）由两位密码学家提出。但为什么数学家给它起名叫 Divergence（发散度/偏离度），而不是像欧式距离那样叫 Distance 呢？</p>

<p>因为在数学定义中，“距离”必须满足<strong>对称性</strong>（从 A 到 B 的距离等于从 B 到 A 的距离）。</p>

<p><strong>但 KL 散度是严重不对称的！</strong></p>

\[D_{KL}(P||Q) \neq D_{KL}(Q||P)\]

<p>用模型训练来解释这种不对称极其直观：</p>

<ul>
  <li><strong>用 $Q$ 近似 $P$（我们通常的做法）</strong>：真实世界要求必须是字符 <code class="language-plaintext highlighter-rouge">a</code>（100%），你的模型给了 <code class="language-plaintext highlighter-rouge">a</code> 50% 的概率。虽然不够完美，但好歹留了余地，模型受到的惩罚（Loss）是<strong>有限的</strong>。</li>
  <li><strong>用 $P$ 近似 $Q$（强行反过来）</strong>：真实世界是 50% 的概率随机抛硬币，但你的模型咬死 100% 绝对是正面，给反面的概率是 0。当真实世界真的开出反面时，你的模型预测概率是 0。在数学里，$-\log(0)$ 是<strong>无限大 (Infinity)</strong>！模型会受到毁灭性的无限大惩罚。</li>
</ul>

<p>正因为从 $P$ 看 $Q$ 和从 $Q$ 看 $P$ 产生的“惩罚力度”完全不对等，所以它没有资格被称为“距离”，只能被称为有方向的“散度”。</p>

<hr />

<h3 id="结语">结语</h3>

<p>下一次，当你敲下 <code class="language-plaintext highlighter-rouge">nn.CrossEntropyLoss()</code> 时，你可以自信地知道，你并不是在调用一个毫无感情的黑盒。你是在通过最小化交叉熵这个“总车费”，巧妙地逼近 KL 散度，从而让你的模型一步步收敛到真实世界的概率分布中去。</p>]]></content><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><category term="tech" /><category term="machine learning" /><category term="cross entropy" /><category term="kl divergence" /><summary type="html"><![CDATA[在深度学习的日常搬砖中，写出 criterion = nn.CrossEntropyLoss() 简直就像喝水一样自然。无论是做图像分类、验证码识别，还是训练大语言模型，交叉熵似乎永远是分类任务的标配。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sixiangjia.de/assets/images/morandi.jpg" /><media:content medium="image" url="https://sixiangjia.de/assets/images/morandi.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="zh"><title type="html">房价暴跌，房租凭什么死撑？一场剥离金融幻觉的底层估值修复</title><link href="https://sixiangjia.de/finance/rental/" rel="alternate" type="text/html" title="房价暴跌，房租凭什么死撑？一场剥离金融幻觉的底层估值修复" /><published>2026-03-02T00:00:00+08:00</published><updated>2026-03-02T00:00:00+08:00</updated><id>https://sixiangjia.de/finance/rental</id><content type="html" xml:base="https://sixiangjia.de/finance/rental/"><![CDATA[<p>近期房地产市场有一个极其违背直觉的现象：很多城市的二手房价格已经跌去了 20% 甚至 30%，但打工人们发现，自己每个月交的房租依然坚挺，甚至在部分核心地段还有微涨。</p>

<p>很多人觉得这不符合经济学常识——皮之不存，毛将焉附？房价都崩了，房租凭什么不跌？</p>

<p>实际上，这不仅符合常识，而且是金融市场中最经典的 <strong>“均值回归”与“资产底层逻辑剥离”</strong>。房价和房租虽然挂钩在同一套钢筋水泥上，但它们在市场中的定价锚点，早就分道扬镳了。</p>

<h3 id="一-房价买的是看涨期权房租买的是物理效用">一、 房价买的是“看涨期权”，房租买的是“物理效用”</h3>

<p>要理解这个背离，首先要拆解过去高房价的构成。</p>

<ul>
  <li><strong>金融泡沫的挤出</strong>：过去一套 500 万的房子里，真正属于“居住”属性的价值可能只有 150 万，剩下的 350 万全是对资产未来每年单边上涨的<strong>投机溢价（看涨期权）</strong>。现在房价暴跌，跌掉的纯粹是那部分破灭的金融泡沫。</li>
  <li><strong>物理使用权的坚挺</strong>：租客付房租，买的仅仅是这一个月有个地方遮风挡雨的物理效用。房租从来没有享受过那 350 万的泡沫溢价，自然也就没有跟着暴跌的空间。</li>
</ul>

<h3 id="二-购房需求的蓄水池倒灌">二、 购房需求的“蓄水池”倒灌</h3>

<p>房价下跌的预期，反而从供需两端对租赁市场形成了强力支撑。</p>

<ul>
  <li><strong>买转租的挤压</strong>：当所有人发现房子成了“消耗品”而不是“理财产品”时，原本凑够首付准备上车的年轻人纷纷按下了暂停键。但肉身总要有地方安放，这部分庞大的“购房需求”被瞬间积压，全盘转化成了“租房需求”。</li>
  <li><strong>有效供给并未爆发</strong>：虽然二手房挂牌量激增，但许多房东宁可空置，也不愿投入高昂的装修成本将其转入租赁市场。需求端涌入大量观望者，供给端却增长缓慢，房租自然下不来。</li>
</ul>

<h3 id="三-租售比的残酷均值回归">三、 租售比的残酷“均值回归”</h3>

<p>如果用量化投资里的估值指标来看，这其实是一次极其标准的修复过程。</p>

<ul>
  <li><strong>曾经的畸形估值</strong>：过去国内一线城市的租售比（年租金/房屋总价）普遍在 1.5% 左右，换算成股市的指标，相当于市盈率（PE）高达近 70 倍。这种极度扭曲的估值，全靠“资本利得预期”在死撑。</li>
  <li><strong>分母变小，强制修复</strong>：当潮水退去，房地产重新回归“收息资产”的本质。在没有任何资本利得预期的通缩环境下，它必须提供足以对抗无风险利率的租金回报。在分子（房租）不变甚至微调的情况下，分母（房价）大幅下跌 30%，租售比自然就从 1.5% 强行修复到了 2.1% 甚至更高。</li>
</ul>

<h3 id="四-房租的真正锚点中位数劳动工资">四、 房租的真正锚点：中位数劳动工资</h3>

<p>房价的锚点是信贷总量和杠杆率，而房租的锚点极其死板——它死死锚定着当地年轻人的<strong>中位数劳动工资</strong>。</p>

<p>只要核心科技大厂、先进制造业和现代服务业依然聚集在一二线城市，只要这批高净值劳动力的人数和薪资基本盘没有出现腰斩级别的崩盘，大家每个月能咬牙拿出来付房租的预算基数就是相对固定的。</p>

<h3 id="结语">结语</h3>

<p>房价暴跌是“金融杠杆去泡沫”，而房租坚挺是“实体经济和劳动工资的硬支撑”。看懂了这个背离，也就看懂了中国房地产正在经历的世纪大转身：它正在从少数人加杠杆暴富的“金融炒作工具”，彻底回归为占用现金流的“普通消费品”。</p>]]></content><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><category term="finance" /><category term="real estate" /><category term="rental" /><summary type="html"><![CDATA[近期房地产市场有一个极其违背直觉的现象：很多城市的二手房价格已经跌去了 20% 甚至 30%，但打工人们发现，自己每个月交的房租依然坚挺，甚至在部分核心地段还有微涨。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sixiangjia.de/assets/images/morandi.jpg" /><media:content medium="image" url="https://sixiangjia.de/assets/images/morandi.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="zh"><title type="html">沉默的伤痕：为什么我们不能遗忘“慰安妇”的历史？</title><link href="https://sixiangjia.de/history/japanslavery/" rel="alternate" type="text/html" title="沉默的伤痕：为什么我们不能遗忘“慰安妇”的历史？" /><published>2026-02-24T00:00:00+08:00</published><updated>2026-02-24T00:00:00+08:00</updated><id>https://sixiangjia.de/history/japanslavery</id><content type="html" xml:base="https://sixiangjia.de/history/japanslavery/"><![CDATA[<p>在探讨近现代东亚历史与地缘政治时，有一个词汇始终重如千钧，那就是“慰安妇”。</p>

<p>这不仅仅是一段惨痛的二战记忆，更是国际法演进、地缘政治博弈以及人类良知之间至今未能彻底和解的缩影。随着战争亲历者的逐渐凋零，这段历史正面临着被时间掩埋的风险。今天，让我们拨开历史的迷雾，重新审视这场尚未结束的跨国维权。</p>

<h3 id="1-制度化的战争机器与人权灾难">1. 制度化的战争机器与人权灾难</h3>

<p>与历史上的许多战争暴行不同，“慰安妇”制度的可怕之处在于其<strong>高度的系统性与国家主导性</strong>。它不是个别士兵的泄欲或军纪涣散的偶然产物，而是由当时的日本军部和政府自上而下精心策划、建立和管理的“军事性奴役”网络。</p>

<p>从中国大陆、台湾地区，到朝鲜半岛，再到东南亚，数以十万计的女性被欺骗、绑架或强征，塞进这台残酷的战争机器中。她们被剥夺了作为人的一切尊严，成为了消耗品。在现代国际法的定义下，这是极其严重的反人类罪和战争罪。</p>

<h3 id="2-东京审判的盲区与被掩盖的真相">2. 东京审判的盲区与被掩盖的真相</h3>

<p>1945年二战结束，正义似乎得到了伸张，但在东京审判的法庭上，针对“慰安妇”的系统性犯罪却诡异地缺席了。</p>

<p>这背后是冷战阴云下的政治妥协。为了迅速稳固亚太局势、扶植日本成为对抗苏联的桥头堡，美国主导的远东国际军事法庭在很大程度上对这一罪行选择了无视。再加上当时国际法对“性别暴力”的认知局限，以及东亚传统社会对受害女性的道德污名化，导致成千上万的幸存者在战后只能咽下血泪，隐姓埋名。</p>

<p><strong>正义不仅迟到了，而且在很长一段时间内，它甚至没有出发。</strong></p>

<h3 id="3-打破半个世纪的沉默">3. 打破半个世纪的沉默</h3>

<p>转机出现在20世纪90年代。随着冷战结束和全球人权意识的觉醒，受害者们展现出了惊人的勇气。</p>

<p>1991年，韩国的金学顺奶奶成为首位公开揭露日军暴行的幸存者；随后，来自中国山西、海南等地的多位受害者也勇敢地站了出来，将日本政府告上法庭。她们拖着年迈的身躯，跨越国界，在闪光灯和法庭的质询面前，一遍遍撕开旧伤疤。</p>

<p>她们的诉求出奇地一致且克制：<strong>不要施舍性质的“民间慰问金”，只要求日本政府在法律层面承认国家责任，进行正式道歉与国家赔偿。</strong></p>

<h3 id="4-未竟的博弈与我们的责任">4. 未竟的博弈与我们的责任</h3>

<p>时至今日，这场维权之战依然步履维艰。</p>

<p>日本政府虽然曾通过《河野谈话》等形式做出过宽泛的政治表态，甚至在2015年与韩国达成了带有政治交易性质的“10亿日元治愈金”协议，但在<strong>核心的“国家法律赔偿”</strong>底线上，日本始终没有退让。右翼势力甚至不断试图修改教科书、否认强制性，试图从根本上抹杀这段记忆。</p>

<p><strong>为什么今天我们还要写下这些？</strong></p>

<p>因为历史的连贯性决定了未来的走向。关注“慰安妇”问题，不仅是对逝去生灵的告慰，更是对现代国际秩序底线的捍卫。如果国家主导的系统性反人类罪行能够通过时间的流逝和政治的粉饰而被原谅，那么人类社会将永远无法真正告别战争的野蛮。</p>

<p>那些在风烛残年依然坚持抗争的老人们，要的不仅仅是一个说法，而是人类文明在面对至暗时刻时，必须给出的一份及格答卷。</p>]]></content><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><category term="history" /><category term="slavery" /><category term="japan" /><summary type="html"><![CDATA[在探讨近现代东亚历史与地缘政治时，有一个词汇始终重如千钧，那就是“慰安妇”。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sixiangjia.de/assets/images/morandi.jpg" /><media:content medium="image" url="https://sixiangjia.de/assets/images/morandi.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="zh"><title type="html">纪念碑到底在纪念谁？——关于“记住”、牺牲与影响现代人的一段不合时宜的想法</title><link href="https://sixiangjia.de/lifestyle/whatisdeath/" rel="alternate" type="text/html" title="纪念碑到底在纪念谁？——关于“记住”、牺牲与影响现代人的一段不合时宜的想法" /><published>2026-02-23T00:00:00+08:00</published><updated>2026-02-23T00:00:00+08:00</updated><id>https://sixiangjia.de/lifestyle/whatisdeath</id><content type="html" xml:base="https://sixiangjia.de/lifestyle/whatisdeath/"><![CDATA[<p>大年初四去了浦东滨江，远远看到了一座高耸的纪念碑，突然感到奇怪，在这里怎么会有一座突兀的建筑，进一步思考下，我产生了一些想法。（之前在浦西近距离看到的时候没有想法）</p>

<p>它们矗立在城市最醒目的位置，庄严、沉默、巨大，像一根钉子，把某段历史牢牢钉在当下的视线里。很多人会说：这是为了纪念先烈，提醒我们不要忘记。可我越来越觉得，它的主要作用，可能并不是“给过去的人一个交代”，而是“给现在的人一个方向”。</p>

<p>也就是说：纪念碑更像是写给现代人的。</p>

<h2 id="1-当时的人并不是为了纪念碑去牺牲">1. 当时的人，并不是为了纪念碑去牺牲</h2>

<p>一个很朴素的问题是：当时那些牺牲的人，真的是“为了后世立碑”才去牺牲的吗？</p>

<p>大概率不是。</p>

<p>很多牺牲来自于当下的处境：为了活下去、为了家人、为了同伴、为了某种信念、为了不被侮辱、为了不被迫跪下。那是一种逼近生存底线时的选择，往往混杂着恐惧、愤怒、冲动、责任、爱与不得不。</p>

<p>他们在做决定的时候，脑子里未必有“未来的纪念碑”“将来的颂歌”“子孙后代的记忆”。他们可能只是在那个瞬间，选择了某条路。</p>

<p>因此，如果我们把“纪念碑”当成牺牲的意义来源，就有点本末倒置：不是因为有碑，所以有人牺牲；而是因为有人牺牲，后来的人想用碑来解释、组织、包装这件事。</p>

<p>问题就在这里：解释的权力，掌握在“后来的人”手里。</p>

<h2 id="2-纪念碑是一种影响现代人的装置">2. 纪念碑是一种“影响现代人”的装置</h2>

<p>当纪念碑被放置在公共空间，它就不只是建筑或艺术品，而是一种叙事装置。</p>

<p>它不断向你输出一种信息：
“有些牺牲是崇高的。”
“有些死亡是值得的。”
“你应该记得。”
“你也应该准备好。”</p>

<p>这不是阴谋论式的“全是洗脑”，但它确实具备一种教育、塑形、导向的功能——尤其当它被放进仪式、教材、纪念日、口号和集体情绪里时，它会把复杂的历史压缩成一种更好传播、更容易动员的版本。</p>

<p>它告诉你“正确的感受方式”：要肃穆、要感恩、要热血、要继承。</p>

<p>可现实是，历史从来不只有一种感受方式。有人悲伤、有人麻木、有人困惑、有人愤怒、有人只想回家吃饭。纪念碑把这些差异统统收拢成同一种表情，这就是我觉得别扭的地方。</p>

<h2 id="3-真正的牺牲应该来自自愿而不是被塑造出来的冲动">3. “真正的牺牲”应该来自自愿，而不是被塑造出来的冲动</h2>

<p>我更在意的是：当一种纪念的方式，不断强调“牺牲是光荣的”，它会不会在无形中鼓励人去“走向牺牲”？</p>

<p>理想状态下，牺牲应该是自愿的、迫不得已的、极其稀有的——甚至最好根本不要发生。我们尊重牺牲，是为了珍惜生命，是为了避免后来的人再经历同样的痛苦。</p>

<p>但如果纪念机制变成一种“赞美牺牲”的机器，那它就可能反过来把牺牲变成一种可被期待、可被要求、可被浪漫化的东西。</p>

<p>这让我害怕。</p>

<p>因为一旦牺牲被浪漫化，人就更容易被推到“你应该”的位置：
你应该勇敢、你应该奉献、你应该忍耐、你应该成全大局。</p>

<p>而一个更值得追求的社会，应该尽量让人不必走到“牺牲”这一步。纪念的重点不该是“让你也学会牺牲”，而应该是“让你明白牺牲多么昂贵，因此要尽量不再发生”。</p>

<h2 id="4-没人记住才算死了这句话本身也是一种压力">4. “没人记住才算死了”——这句话本身也是一种压力</h2>

<p>还有一句常见的话：
“人真正的死亡，是被遗忘。”</p>

<p>听起来很浪漫，但我越来越觉得，它也可能是一种隐性压力。</p>

<p>因为它把“被记住”当成一种奖赏，把“遗忘”当成一种惩罚。它会让人焦虑：我做的事够不够伟大？我死后有没有人记得？我是不是应该留下些什么？</p>

<p>可人活一生，真的必须被很多人记住吗？
一个普通人的爱、劳动、照顾家人、认真活着，本来就值得尊重。生命的价值并不取决于是否能进入“公共记忆”。</p>

<p>更残酷的是：公共记忆从来不是公平的。谁被记住、谁被写进碑文、谁被讲述，往往取决于叙事权力，而不是纯粹取决于“谁更值得”。</p>

<p>当“被记住”被拔高成最高价值，它就可能把人再次工具化：你活着要有用，你死了也要有用，你最好成为一个符号。</p>

<p>这就是我说的“洗脑”意味：它不是让你理解历史的复杂，而是让你接受一种单一的价值排序。</p>

<h2 id="5-我真正想要的纪念可能是另一种东西">5. 我真正想要的“纪念”，可能是另一种东西</h2>

<p>我不是反对纪念。</p>

<p>我反对的是：用纪念去动员、去塑造、去消解个体的复杂情感，甚至把牺牲当成一种可复制的模板。</p>

<p>我更希望纪念能做到的是：</p>

<ul>
  <li>让我们看见牺牲背后的痛苦与代价，而不是只看见荣耀</li>
  <li>让我们尊重个体，而不是只崇拜符号</li>
  <li>让我们珍惜生命、避免重演，而不是被训练成“随时准备献身”的人</li>
  <li>让“普通人”也能被温柔地看见：不必伟大也值得被尊重</li>
</ul>

<p>如果纪念碑能让人更清醒、更珍惜、更不轻易鼓掌给死亡——那它才让我觉得它站在那儿是有意义的。</p>

<p>否则，它更像一根巨大的指挥棒：告诉你应该怎么想、怎么感动、怎么成为“合格的现代人”。</p>

<p>而我想保留一点不合格的权利。</p>]]></content><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><category term="lifestyle" /><category term="death" /><category term="memorial" /><summary type="html"><![CDATA[大年初四去了浦东滨江，远远看到了一座高耸的纪念碑，突然感到奇怪，在这里怎么会有一座突兀的建筑，进一步思考下，我产生了一些想法。（之前在浦西近距离看到的时候没有想法）]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sixiangjia.de/assets/images/morandi.jpg" /><media:content medium="image" url="https://sixiangjia.de/assets/images/morandi.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="zh"><title type="html">算法时代的”精神零食”：我们为何要拒绝离奇的社会新闻？</title><link href="https://sixiangjia.de/lifestyle/lastman/" rel="alternate" type="text/html" title="算法时代的”精神零食”：我们为何要拒绝离奇的社会新闻？" /><published>2026-02-20T00:00:00+08:00</published><updated>2026-02-20T00:00:00+08:00</updated><id>https://sixiangjia.de/lifestyle/lastman</id><content type="html" xml:base="https://sixiangjia.de/lifestyle/lastman/"><![CDATA[<p>打开手机，我们的信息流里总是充斥着各种离奇新闻：今天推送一条”某地老人上厕所意外去世”，明天又弹出”老人买105岁可领的保险，最终成功退款”的荒诞故事。在算法的推波助澜下，这类新闻轻易占据热搜，引发评论区的狂欢。</p>

<p>但当我们关掉屏幕，除了大脑中残留的一丝猎奇感或对荒谬现实的短暂唏嘘，我们真正获得了什么？答案往往是：<strong>什么都没有。</strong></p>

<p>从实用主义和信息论的角度来看，这类铺天盖地的信息，仅仅是毫无价值的<strong>噪音（Noise）</strong>，我们从中提取不出任何能够指导未来的<strong>信号（Signal）</strong>。</p>

<h2 id="一问题的本质从统计学噪音到情绪消费">一、问题的本质：从统计学噪音到情绪消费</h2>

<h3 id="极端个例与大数定律的障眼法">极端个例与”大数定律”的障眼法</h3>

<p>以”老人上厕所去世”为例。这类新闻最大的卖点在于”罕见”和”突发”。但在一个拥有庞大人口基数的社会中，基于<strong>大数定律</strong>，发生概率极低的极端偶发事件，每天也必然会发生。</p>

<p>将这种完全没有统计学显著性的极小概率事件，包装成惊悚的新闻推送到大众面前，本质上是在利用人类对”危险”和”死亡”的底层生物学敏感。它提供不了一套可以被复用的防范逻辑，也揭示不了结构性的社会问题。它在信息论上的”信息熵”极高，消除不了任何现实的不确定性，只是单纯在消耗我们的注意力。</p>

<h3 id="荒诞新闻背后的情绪消费">荒诞新闻背后的情绪消费</h3>

<p>再看”买105岁可领的保险，最终维权退款”的新闻。它更像是一个具有黑色幽默色彩的荒谬剧本。这类新闻之所以有市场，是因为它为大众提供了一种零门槛的”社交货币”。</p>

<p>人们在评论区嘲笑规则的荒唐，或者同情当事人的遭遇，本质上是通过消费他人的困境，来获取一种群体归属感和瞬间的情绪宣泄。</p>

<h2 id="二道德困境当人成为流量的工具">二、道德困境：当人成为流量的工具</h2>

<p>康德曾提出过一个核心的道德律令：”永远要把人类当作目的，而绝不仅仅是手段。”然而，在流量经济的驱动下，媒体和算法恰恰相反。</p>

<p>它们将个体的离奇遭遇、甚至是生命的逝去，纯粹当成了赚取流量、广告费和眼球的工具。这是对个体尊严的剥离，也是一种隐蔽的虚伪。我们在手指滑动间，不知不觉成为了这个体系的共谋者。</p>

<h2 id="三尼采的末人与注意力经济">三、尼采的”末人”与注意力经济</h2>

<h3 id="注意力的夏普比率">注意力的”夏普比率”</h3>

<p>如果我们将个人的注意力视为一种核心资产，那么我们在分配这些资产时，理应追求更高的回报。衡量一则信息的价值，我们不妨引入类似<strong>夏普比率</strong>（Sharpe Ratio）的概念：为了获取这点微薄的情绪价值，我们承担了多大的认知消耗和时间成本？</p>

<p>大多数离奇新闻的”夏普比率”极低——投入大量时间和注意力，收获的却只是转瞬即逝的多巴胺刺激。</p>

<h3 id="末人的逃避机制">“末人”的逃避机制</h3>

<p>面对复杂、枯燥的现实生活，深度思考是一件极其耗费算力的事情。沉浸在他人离奇的、与自己毫无交集的故事中，是一种绝佳的逃避机制。</p>

<p>正如尼采笔下的”末人”（Last Man）状态——大众往往倾向于追求最简单、最不需要付出努力的消遣。用这些碎片化、戏剧化的奇闻轶事来填补时间的空白，可以有效地掩盖内心的虚无，让人无需去直面生存的重负，也无需去追求更高的自我超越。</p>

<h2 id="四清醒者的选择构建信息护城河">四、清醒者的选择：构建信息护城河</h2>

<p>知道一个远方的人怎么遭遇意外，既不能帮你优化手头的代码，也不能帮你建立一套逻辑严密的交易策略。真正对人有帮助的，是把注意力收回，投入到那些具有复利效应的事情上。</p>

<p>看透这些信息的”无用性”，本身就是一种极好的信息过滤机制。我们无法叫醒一个在信息茧房里装睡的人，也很难劝说身边的人放弃这种多巴胺快餐。但我们可以选择对自己进行”课题分离”：</p>

<ol>
  <li><strong>主动屏蔽噪音</strong>：取消毫无营养的媒体关注，减少算法推荐的干预</li>
  <li><strong>寻找真正的信号</strong>：去理解底层技术的运作机制，研读经典重塑自己对世界的认知框架</li>
  <li><strong>夺回算力</strong>：拒绝将个人的核心算力，浪费在没有复利效应的互联网吃瓜之中</li>
</ol>

<h2 id="五平衡的视角拥抱末人的权利">五、平衡的视角：拥抱”末人”的权利</h2>

<p>然而，我们也需要承认一个现实：在这个充满压力和不确定性的世界里，选择沉浸在这些荒诞、离奇的社会新闻中，也是一种可以被接受的生活方式。</p>

<p>大众需要赛博按摩，需要情绪的宣泄口，也需要零门槛的社交谈资。如果有人选择在一天疲惫的工作后，用这些信息”垃圾食品”来麻痹大脑、换取片刻的轻松，这是他们不可剥夺的自由和权利。</p>

<p>世界本来就需要这种巨大的精神缓冲地带，不是每个人都必须时刻追求认知升维和系统构建。做个快乐的”末人”，无可厚非。</p>

<h2 id="六结语觉知与行动">六、结语：觉知与行动</h2>

<p>真正的分水岭在于 <strong>“觉知”</strong>。问题的核心不在于这些新闻存在与否，而在于你是否 <strong>清楚地知道自己在消费什么</strong>。</p>

<p>如果你在内心深处已经做出了选择——你决心要拒绝被低级多巴胺圈养，你更渴望把算力投入到具有复利效应的事务中，去构建属于自己的技术壁垒或思想护城河——那么，你需要的不是去和沉浸其中的人辩论，而是为自己装配一套极其敏锐的 <strong>“信息雷达”</strong>。</p>

<p>训练自己能在标题弹出的零点一秒内，立刻识别出它的底层代码：</p>

<ul>
  <li><strong>它是客观的信号，还是情绪的诱饵？</strong></li>
  <li><strong>它是能优化决策的模型，还是纯粹的统计学噪音？</strong></li>
  <li><strong>它是需要深度处理的干货，还是消耗注意力的黑洞？</strong></li>
</ul>

<p>你可以选择做末人，这是一种自由；但如果你决心清醒，你的核心竞争力就在于：<strong>在识别出垃圾信息的那一瞬间，拥有毫不犹豫将其 Drop 掉的冷酷与果决。</strong></p>

<blockquote>
  <p>建议阅读：“奶头乐”骗局：一场精英主义的傲慢意淫</p>
</blockquote>]]></content><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><category term="lifestyle" /><category term="lastman" /><summary type="html"><![CDATA[打开手机，我们的信息流里总是充斥着各种离奇新闻：今天推送一条”某地老人上厕所意外去世”，明天又弹出”老人买105岁可领的保险，最终成功退款”的荒诞故事。在算法的推波助澜下，这类新闻轻易占据热搜，引发评论区的狂欢。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sixiangjia.de/assets/images/morandi.jpg" /><media:content medium="image" url="https://sixiangjia.de/assets/images/morandi.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="zh"><title type="html">从 MySQL 协议到 Cloudflare Tunnel：深挖 TCP 的“有状态”江湖</title><link href="https://sixiangjia.de/tech/http-tcp/" rel="alternate" type="text/html" title="从 MySQL 协议到 Cloudflare Tunnel：深挖 TCP 的“有状态”江湖" /><published>2026-02-19T00:00:00+08:00</published><updated>2026-02-19T00:00:00+08:00</updated><id>https://sixiangjia.de/tech/http-tcp</id><content type="html" xml:base="https://sixiangjia.de/tech/http-tcp/"><![CDATA[<p>最近在折腾 Home Assistant (HASS) 的公网穿透。我使用了 Cloudflare Tunnel，但发现了一个诡异的现象：本地访问秒开，CF 访问却转圈。在排查过程中，我从应用层的 HTTP 一路杀到了传输层的 TCP，甚至重新认识了 MySQL 这种老牌协议。</p>

<hr />

<h3 id="一-协议的门派为什么-mysql-必须走-tcp">一、 协议的门派：为什么 MySQL 必须走 TCP？</h3>

<p>在穿透 HASS（HTTP）时，我们觉得理所当然，但当我尝试穿透 MySQL 时，碰了壁。</p>

<p><strong>1. 应用层代理（L7）的局限</strong>
HTTP 代理像是一个懂多种语言的翻译官，它能听懂网页请求。但 <strong>MySQL 是私有二进制协议</strong>，它有一套专属的“暗号”。</p>

<ul>
  <li><strong>HTTP 代理：</strong> 听不懂 MySQL 在说什么，直接拒收。</li>
  <li><strong>TCP 转发（L4）：</strong> 像一个搬砖工，不拆包，只管把数据流从 A 端搬到 B 端。</li>
</ul>

<p><strong>结论：</strong> 凡是像 MySQL、SSH 这样不走 HTTP 路线的私有协议，在穿透时必须回归到<strong>传输层代理（TCP Forwarding）</strong>。</p>

<hr />

<h3 id="二-核心博弈有状态-stateful-vs-无状态-stateless">二、 核心博弈：有状态 (Stateful) vs 无状态 (Stateless)</h3>

<p>理解了 TCP 转发后，我发现了一个更有趣的概念：<strong>状态</strong>。</p>

<ul>
  <li><strong>HTTP 的“渣男”属性（无状态）：</strong> 请求完就忘。为了记住你是谁，我们得给它挂载 Cookie 和 Session。</li>
  <li><strong>TCP 的“执着”属性（有状态）：</strong> 每一个连接都有一个“五元组”身份标识。它必须维持一个长期的会话。</li>
</ul>

<p><strong>MySQL 为什么不选 HTTP？</strong> 因为它需要极其严苛的“有状态”环境。事务（Transaction）处理需要服务器死死记住你刚才锁了哪行数据。这种深度的上下文绑定，是无状态的 HTTP 无法低成本提供的。</p>

<hr />

<h3 id="三-实战避坑cloudflare-tunnel-的调优">三、 实战避坑：Cloudflare Tunnel 的调优</h3>

<p>在折腾 <code class="language-plaintext highlighter-rouge">cloudflared</code> 的过程中，我通过日志发现了两个让穿透变慢的“元凶”：</p>

<h4 id="1-udp-被运营商-qos">1. UDP 被运营商 QoS</h4>

<p>默认的隧道协议可能会被运营商限速。</p>

<ul>
  <li><strong>手术操作：</strong> 强制开启 <code class="language-plaintext highlighter-rouge">--protocol http2</code>。</li>
  <li><strong>效果：</strong> 将不稳定的 UDP 握手转为成熟的 TCP 连接，体感延迟瞬间下降。</li>
</ul>

<h4 id="2-地理位置的随机抽奖">2. 地理位置的“随机抽奖”</h4>

<p>我在日志里看到了 <code class="language-plaintext highlighter-rouge">hkg</code>（香港）和 <code class="language-plaintext highlighter-rouge">sjc</code>（圣何塞）。</p>

<ul>
  <li><strong>扎心真相：</strong> 如果流量被随机分配到了美国圣何塞，数据包就要跨越太平洋。</li>
  <li><strong>对策：</strong> 通过设置代理环境变量（如 <code class="language-plaintext highlighter-rouge">http_proxy</code>），配合 V2Ray 等工具，强行将隧道连接锁定在亚洲节点。</li>
</ul>

<hr />

<h3 id="四-进阶当网络切换时我们在经历什么">四、 进阶：当网络切换时，我们在经历什么？</h3>

<p>最后，我研究了从 Wi-Fi 切换到 5G 时的断连问题。</p>

<p>由于 TCP 是有状态的，IP 一变，连接即毁。这也是为什么 HASS 页面会卡死。</p>

<ul>
  <li><strong>未来的解药：</strong> <strong>HTTP/3 (QUIC)</strong>。它不再基于 IP，而是基于 <strong>Connection ID</strong>。</li>
  <li><strong>感悟：</strong> 技术的发展，本质上就是在不断修补底层协议“太有状态”或“太没状态”所带来的副作用。</li>
</ul>

<h3 id="五-websocket披着-http-皮的-tcp-灵魂">五、 WebSocket：披着 HTTP 皮的 TCP 灵魂</h3>

<p>在排查 HASS 穿透时，你可能会问：既然 HTTP 是无状态的，为什么我点击开关，手机能<strong>实时</strong>收到状态反馈？</p>

<p>这就是 <strong>WebSocket</strong> 的功劳。它是我们这篇探讨中“状态”的集大成者。</p>

<ol>
  <li><strong>借壳上市（握手阶段）：</strong>
WebSocket 起初是一个普通的 HTTP 请求（无状态）。它通过在 Header 里写上 <code class="language-plaintext highlighter-rouge">Upgrade: websocket</code>，像是在问服务器：“咱们能不能换个持久的方式聊天？”</li>
  <li><strong>定情终身（通信阶段）：</strong>
一旦握手成功，它就彻底撕下了 HTTP 的伪装，回归了 <strong>TCP 的本质</strong>。它变成了一个双向、实时的管道。
    <ul>
      <li><strong>为什么快？</strong> 它省去了 HTTP 频繁的 Header 传输。</li>
      <li><strong>为什么怕断？</strong> 因为它是<strong>有状态</strong>的。它死死绑定在底层的那条 TCP 连接上。</li>
    </ul>
  </li>
</ol>

<h3 id="六-总结网络世界的状态真相">六、 总结：网络世界的“状态”真相</h3>

<p>通过这次对 Cloudflare Tunnel 的深度调优，我们可以把学到的知识串成一条线：</p>

<ul>
  <li><strong>传输层 (TCP)：</strong> 它是地基。它是有状态的，负责保证包裹不丢（MySQL、SSH、WebSocket 都离不开它）。</li>
  <li><strong>应用层 (HTTP)：</strong> 它是快餐。它是无状态的，负责简单快速地分发内容（网页、图片、API）。</li>
  <li><strong>特殊的应用层 (MySQL)：</strong> 它是老古董。它直接在 TCP 上跑二进制，因为 HTTP 的无状态和文本格式对它来说太沉重了。</li>
  <li><strong>现代的应用层 (WebSocket)：</strong> 它是混合体。它用 HTTP 开头，用 TCP 的方式持久运行，专为实时监控（HASS）而生。</li>
</ul>

<hr />

<h3 id="七-最终实战心得如何让穿透稳如泰山">七、 最终实战心得：如何让穿透稳如泰山？</h3>

<p>如果你也像我一样，通过 Cloudflare Tunnel 访问家里的服务，请记住这三条黄金法则：</p>

<ol>
  <li><strong>强制协议转换：</strong> 将 <code class="language-plaintext highlighter-rouge">cloudflared</code> 的协议改为 <code class="language-plaintext highlighter-rouge">--protocol http2</code>。这能让你的隧道在复杂的公网环境中，从脆弱的 UDP 转向成熟稳定的 TCP，从而保护上层的 WebSocket 不轻易断连。</li>
  <li><strong>路由分流：</strong> 利用 V2Ray 或代理，把隧道终点锁在亚洲（如香港）。物理距离（RTT）是实时交互最大的敌人，再好的协议也跑不过光速。</li>
  <li><strong>HASS 安全策略：</strong> 务必在 HASS 的 <code class="language-plaintext highlighter-rouge">trusted_proxies</code> 中添加隧道 IP。如果握手因为安全校验慢了 1 秒，上层的 WebSocket 体验就会大打折扣。</li>
</ol>

<hr />

<h3 id="结语">结语</h3>

<p>技术圈常说“大道至简”，但真实的互联网底层却充满了各种为了平衡“性能”与“扩展性”而做的妥协。</p>

<p>从 <strong>MySQL</strong> 的二进制执着，到 <strong>HTTP</strong> 的断舍离，再到 <strong>WebSocket</strong> 的重修旧好，以及 <strong>Cloudflare Tunnel</strong> 在中间的巧妙撮合。理解了这些，你就理解了为什么在网络切换的一瞬间，你的智能家居会短暂“失灵”。</p>

<p><strong>底层决定上层，状态决定实时。</strong></p>]]></content><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><category term="tech" /><category term="pve" /><category term="linux" /><summary type="html"><![CDATA[最近在折腾 Home Assistant (HASS) 的公网穿透。我使用了 Cloudflare Tunnel，但发现了一个诡异的现象：本地访问秒开，CF 访问却转圈。在排查过程中，我从应用层的 HTTP 一路杀到了传输层的 TCP，甚至重新认识了 MySQL 这种老牌协议。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sixiangjia.de/assets/images/morandi.jpg" /><media:content medium="image" url="https://sixiangjia.de/assets/images/morandi.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="zh"><title type="html">解决 OBS 录制与直播中“桌面音频”音量过大的全指南</title><link href="https://sixiangjia.de/tech/obs-voice-too-loud/" rel="alternate" type="text/html" title="解决 OBS 录制与直播中“桌面音频”音量过大的全指南" /><published>2026-02-19T00:00:00+08:00</published><updated>2026-02-19T00:00:00+08:00</updated><id>https://sixiangjia.de/tech/obs-voice-too-loud</id><content type="html" xml:base="https://sixiangjia.de/tech/obs-voice-too-loud/"><![CDATA[<p>在进行视频录制或直播时，很多新手都会遇到一个棘手的问题：<strong>桌面音频（如游戏声、音乐）声音太大，直接盖过了麦克风的人声</strong>。这不仅会让观众感到刺耳，还会导致后期音频无法处理。</p>

<p>本文将教你如何通过 OBS 内置的功能彻底解决这一问题。</p>

<hr />

<h3 id="一-基础调节混音器与增益-gain">一、 基础调节：混音器与增益 (Gain)</h3>

<p>最直观的解决办法是在 OBS 主界面的“音量混音器”中拖动滑块，但如果滑块拉到最低依然觉得大，你可以使用 <strong>“增益”</strong> 滤镜。</p>

<ul>
  <li><strong>增益 (Gain) 的本质</strong>：它是一个音量控制工具，既可以放大声音，也可以强制缩小声音。</li>
  <li><strong>如何操作</strong>：
    <ol>
      <li>在“桌面音频”处点击三个点（或齿轮图标），选择 <strong>“滤镜 (Filters)”</strong>。</li>
      <li>添加 <strong>“增益”</strong> 滤镜。</li>
      <li>将值设为<strong>负数</strong>（例如 <code class="language-plaintext highlighter-rouge">-10 dB</code> 或更低），这样可以从源头上压低那些默认音量极高的软件声音。</li>
    </ol>
  </li>
</ul>

<h3 id="二-自动化管理开启避让-ducking效果">二、 自动化管理：开启“避让 (Ducking)”效果</h3>

<p>如果你希望在自己说话时，背景音乐自动变小，而不说话时音量自动恢复，那么“避让”效果是最佳选择。</p>

<ul>
  <li><strong>实现原理</strong>：通过在桌面音频上挂载一个“压缩器”，让它实时监听你的麦克风信号。</li>
  <li><strong>配置步骤</strong>：
    <ol>
      <li>进入桌面音频的“滤镜”菜单，添加 <strong>“压缩器 (Compressor)”</strong>。</li>
      <li>找到 <strong>“侧链/辅助音频源”</strong> 选项，并将其设置为你的 <strong>“麦克风”</strong>。</li>
      <li><strong>核心逻辑</strong>：只要麦克风检测到你说话，桌面音量就会立刻按比例下压，实现“人说话，背景音让路”的专业效果。</li>
    </ol>
  </li>
</ul>

<h3 id="三-安全防线添加限制器-limiter">三、 安全防线：添加限制器 (Limiter)</h3>

<p>为了防止突发的巨大声响（如游戏里的爆炸声）导致爆音或损伤观众听力，你必须设置上限。</p>

<ul>
  <li><strong>作用</strong>：无论原始声音多大，输出结果都不会超过你设定的阈值。</li>
  <li><strong>建议设置</strong>：在桌面音频滤镜中添加 <strong>“限制器”</strong>，并将 <strong>“幅度 (Threshold)”</strong> 设置在 <code class="language-plaintext highlighter-rouge">-6.0 dB</code> 左右。</li>
</ul>

<hr />

<h3 id="总结建议">总结建议</h3>

<table>
  <thead>
    <tr>
      <th>解决场景</th>
      <th>推荐方案</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>背景音持久性过大</strong></td>
      <td>使用 <strong>“增益”</strong> 滤镜设置负值</td>
    </tr>
    <tr>
      <td><strong>需要人声清晰，背景音做陪衬</strong></td>
      <td>开启 <strong>“避让 (Ducking)”</strong> 侧链压缩</td>
    </tr>
    <tr>
      <td><strong>防止突发性巨响</strong></td>
      <td>添加 <strong>“限制器”</strong> 滤镜</td>
    </tr>
  </tbody>
</table>

<p>通过以上组合拳，你就可以精准控制 OBS 的每一个音符，让你的视频听起来更加专业。</p>]]></content><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><category term="tech" /><category term="windows" /><category term="obs" /><summary type="html"><![CDATA[在进行视频录制或直播时，很多新手都会遇到一个棘手的问题：桌面音频（如游戏声、音乐）声音太大，直接盖过了麦克风的人声。这不仅会让观众感到刺耳，还会导致后期音频无法处理。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sixiangjia.de/assets/images/morandi.jpg" /><media:content medium="image" url="https://sixiangjia.de/assets/images/morandi.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="zh"><title type="html">📝 彻底告别混乱：VS Code 中 pwsh 与 PowerShell 插件的“避坑与调教”指南</title><link href="https://sixiangjia.de/tech/pwsh/" rel="alternate" type="text/html" title="📝 彻底告别混乱：VS Code 中 pwsh 与 PowerShell 插件的“避坑与调教”指南" /><published>2026-02-19T00:00:00+08:00</published><updated>2026-02-19T00:00:00+08:00</updated><id>https://sixiangjia.de/tech/pwsh</id><content type="html" xml:base="https://sixiangjia.de/tech/pwsh/"><![CDATA[<p>作为现代开发者，把 Windows 系统老旧的蓝底 PowerShell 5.1 升级为跨平台、高性能的 PowerShell Core (<code class="language-plaintext highlighter-rouge">pwsh</code> 7.x) 是提升效率的第一步。</p>

<p>但是，当你满怀期待地打开 VS Code，准备享受极速的命令行体验时，大概率会被微软官方的 <strong>PowerShell 插件</strong> 坑得晕头转向。</p>

<p>本文记录了从老版本迁移到 <code class="language-plaintext highlighter-rouge">pwsh</code> 时必踩的“三大连环坑”，并给出了最优雅的终极解决方案。</p>

<h3 id="-坑一喧宾夺主的专属插件终端">💣 坑一：“喧宾夺主”的专属插件终端</h3>

<p>你明明在 VS Code 的 <code class="language-plaintext highlighter-rouge">settings.json</code> 里把默认终端设置成了 <code class="language-plaintext highlighter-rouge">pwsh</code>，但每次打开项目，底部总会莫名其妙弹出一个名为 <code class="language-plaintext highlighter-rouge">PowerShell Extension</code> 的终端。
<img src="/assets/images/pwsh-extension-terminal.png" alt="PowerShell Extension 专属终端" /></p>

<p><strong>背后的真相：</strong>
VS Code 的标准集成终端和这个插件终端是<strong>完全物理隔离</strong>的。
官方的 PowerShell 插件为了提供 <code class="language-plaintext highlighter-rouge">.ps1</code> 脚本的断点调试和高级语法树分析，会在后台强行拉起一个专属于它的“特供沙盒终端”。它根本不关心你的默认设置是什么，开局就会强行抢占你的屏幕视野。</p>

<h3 id="-坑二极具误导性的文字游戏-找不到-pwsh-选项">💣 坑二：极具误导性的“文字游戏” (找不到 pwsh 选项)</h3>

<p>当你试图在插件的“会话菜单 (Show Session Menu)”里手动切换到新版 <code class="language-plaintext highlighter-rouge">pwsh</code> 时，你会绝望地发现列表里根本没有 <code class="language-plaintext highlighter-rouge">pwsh</code> 这个词。</p>

<p><strong>背后的真相：</strong>
这是微软糟糕的命名逻辑导致的。在插件的认知里：</p>

<ul>
  <li><strong>老古董 (5.1 版)</strong>：带有前缀，叫做 <code class="language-plaintext highlighter-rouge">Windows PowerShell (x64)</code>。</li>
  <li><strong>现代版 (7.x 版 pwsh)</strong>：去掉了 Windows 前缀，直接尊称为正统的 <code class="language-plaintext highlighter-rouge">PowerShell (x64)</code>。</li>
</ul>

<p>所以，当菜单显示 <code class="language-plaintext highlighter-rouge">Current session: PowerShell (x64)</code> 时，它其实<strong>已经</strong>在使用你的新版 <code class="language-plaintext highlighter-rouge">pwsh</code> 引擎了，只是这个隐晦的名字欺骗了所有人。</p>

<h3 id="-坑三环境变量的平行宇宙-配置文件隔离">💣 坑三：环境变量的“平行宇宙” (配置文件隔离)</h3>

<p>最让人崩溃的是：你明明在系统里配好了 Anaconda、NVM 的环境变量，在自己新建的 <code class="language-plaintext highlighter-rouge">pwsh</code> 终端里运行完美，但一进那个插件专属终端，所有命令全部变成“未找到”。</p>

<p><strong>背后的真相：宿主 (Host) 隔离机制。</strong>
PowerShell 会根据运行的外壳不同，读取不同的配置文件（Profile）：</p>

<ul>
  <li>普通终端读取：<code class="language-plaintext highlighter-rouge">Microsoft.PowerShell_profile.ps1</code></li>
  <li>插件终端读取：<code class="language-plaintext highlighter-rouge">Microsoft.VSCode_profile.ps1</code></li>
</ul>

<p>这意味着你的环境配置被强行分成了“两套房”，互不相通。
<img src="/assets/images/pwsh-profile.png" alt="PowerShell配置文件隔离机制" />
—</p>

<h3 id="️-终极解决方案">🛠️ 终极解决方案</h3>

<p>面对这套极其混乱的设计，我们有两种极客级的解法：</p>

<h4 id="方案-a一劳永逸打通平行宇宙-全宿主统一">方案 A：一劳永逸打通“平行宇宙” (全宿主统一)</h4>

<p>如果你确实需要写复杂的 PowerShell 脚本，不能卸载插件，那么请启用<strong>上帝视角的配置文件</strong>：</p>

<ol>
  <li>在终端执行 <code class="language-plaintext highlighter-rouge">notepad $PROFILE.CurrentUserAllHosts</code>。</li>
  <li>将你所有的环境变量（如 Python、Node.js 路径）写入这个全局文件。</li>
  <li>清空那两个带前缀的旧文件。
从此，无论是普通终端还是插件终端，都会乖乖读取同一套环境变量。</li>
</ol>

<h4 id="方案-b直接卸载禁用插件-强烈推荐前端与后端开发者">方案 B：直接卸载/禁用插件 (强烈推荐前端与后端开发者)</h4>

<p>如果你日常写的是 TypeScript、Node.js、Python 或 C++，仅仅是拿终端来跑 <code class="language-plaintext highlighter-rouge">npm run</code>、<code class="language-plaintext highlighter-rouge">git</code> 或者编译命令。
<strong>请果断在扩展面板中将官方的 PowerShell 插件“禁用”或“卸载”！</strong></p>

<ul>
  <li><strong>你会失去什么？</strong> 几百行 <code class="language-plaintext highlighter-rouge">.ps1</code> 脚本的代码补全和断点调试。</li>
  <li><strong>你将得到什么？</strong> 一个极其清爽的 VS Code。按 <code class="language-plaintext highlighter-rouge">Ctrl + </code><code class="language-plaintext highlighter-rouge"> 弹出的将是纯粹、干净、极速启动的原生 </code>pwsh` 集成终端，再也没有任何插件来干预你的工作流。</li>
</ul>

<hr />

<blockquote>
  <p><strong>总结：</strong> 工具是为开发者服务的，不要让庞杂的官方插件绑架了你纯粹的代码环境。清理掉不必要的包袱，你的代码世界会清爽得多。</p>
</blockquote>]]></content><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><category term="tech" /><category term="windows" /><summary type="html"><![CDATA[作为现代开发者，把 Windows 系统老旧的蓝底 PowerShell 5.1 升级为跨平台、高性能的 PowerShell Core (pwsh 7.x) 是提升效率的第一步。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sixiangjia.de/assets/images/morandi.jpg" /><media:content medium="image" url="https://sixiangjia.de/assets/images/morandi.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="zh"><title type="html">🛡️ Proxmox VE 防止 OOM Killer 误杀虚拟机的完整指南</title><link href="https://sixiangjia.de/tech/vm-oom/" rel="alternate" type="text/html" title="🛡️ Proxmox VE 防止 OOM Killer 误杀虚拟机的完整指南" /><published>2026-02-19T00:00:00+08:00</published><updated>2026-02-19T00:00:00+08:00</updated><id>https://sixiangjia.de/tech/vm-oom</id><content type="html" xml:base="https://sixiangjia.de/tech/vm-oom/"><![CDATA[<p>在 Proxmox VE (PVE) 中，主机 OOM Killer 可能杀死 QEMU 进程（虚拟机），保护方法包括 hookscript 设置 oom_score_adj、禁用内存气球和优化主机内存。 <a href="https://www.reddit.com/r/Proxmox/comments/12th2ra/oomkiller_killing_only_vm_how_to_fix/">reddit</a></p>

<h2 id="方法1hookscript推荐">方法1：Hookscript（推荐）</h2>

<p>创建保护脚本 <code class="language-plaintext highlighter-rouge">/var/lib/vz/snippets/oom_protect.sh</code>：</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/sh</span>
<span class="nv">vmid</span><span class="o">=</span><span class="nv">$1</span>
<span class="nv">phase</span><span class="o">=</span><span class="nv">$2</span>
<span class="nv">vmpid</span><span class="o">=</span><span class="si">$(</span><span class="nb">cat</span> /run/qemu-server/<span class="nv">$vmid</span>.pid 2&gt;/dev/null<span class="si">)</span>

<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$phase</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"post-start"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
    </span><span class="nb">echo</span> <span class="s2">"保护 VM </span><span class="nv">$vmid</span><span class="s2"> (PID </span><span class="nv">$vmpid</span><span class="s2">) 免于 OOM"</span>
    <span class="nb">echo</span> <span class="nt">-1000</span> <span class="o">&gt;</span> /proc/<span class="nv">$vmpid</span>/oom_score_adj
<span class="k">fi</span>
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chmod +x /var/lib/vz/snippets/oom_protect.sh
qm set &lt;VMID&gt; --hookscript local:snippets/oom_protect.sh
</code></pre></div></div>
<p>启动 VM 后自动设置 -1000（永不杀）。 <a href="https://gist.github.com/oetiker/8e7fccee8f1f2ad87c5006d23aef872e">gist.github</a></p>

<h2 id="方法2systemd-路径单元全局保护">方法2：Systemd 路径单元（全局保护）</h2>

<p>为特定 VM（如 104）创建：</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> <span class="o">&gt;</span> /etc/systemd/system/104-oom.path <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh">
[Path]
PathModified=/run/qemu-server/104.pid

[Install]
WantedBy=multi-user.target
</span><span class="no">EOF

</span><span class="nb">cat</span> <span class="o">&gt;</span> /etc/systemd/system/104-oom.service <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh">
[Unit]
Description=Protect VM 104 from OOM

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo -1000 &gt;/proc/</span><span class="si">$(</span><span class="nb">cat</span> /run/qemu-server/104.pid<span class="si">)</span><span class="sh">/oom_score_adj'
</span><span class="no">EOF

</span>systemctl daemon-reload
systemctl <span class="nb">enable </span>104-oom.path
</code></pre></div></div>
<p>替换 104 为你的 VMID。 <a href="https://gist.github.com/oetiker/8e7fccee8f1f2ad87c5006d23aef872e">gist.github</a></p>

<h2 id="其他优化">其他优化</h2>

<p><strong>内存气球</strong>：</p>
<ul>
  <li>VM 选项 &gt; 硬件 &gt; 内存 &gt; 取消勾选“气球”（Ballooning），避免主机抢占 VM 内存。 <a href="https://www.reddit.com/r/Proxmox/comments/11xiynz/ballooning_permanently_steals_memory_from_vms/">reddit</a></li>
</ul>

<p><strong>主机调优</strong>：</p>
<ul>
  <li>ZFS 用户：<code class="language-plaintext highlighter-rouge">echo 8589934592 &gt; /sys/module/zfs/parameters/zfs_arc_max</code>（限 ARC 8GB）</li>
  <li>Swap：启用主机 swap 分担压力</li>
  <li>避免超配：总 VM RAM &lt; 主机 RAM 80%</li>
</ul>

<p><strong>监控</strong>：<code class="language-plaintext highlighter-rouge">watch -n1 'cat /proc/*/oom_score_adj | grep qemu'</code> 检查分数。 <a href="https://www.reddit.com/r/Proxmox/comments/12th2ra/oomkiller_killing_only_vm_how_to_fix/">reddit</a></p>]]></content><author><name>Weiqing Liu</name><email>mailto:liuweiqing147@gmail.com</email></author><category term="tech" /><category term="pve" /><category term="linux" /><summary type="html"><![CDATA[在 Proxmox VE (PVE) 中，主机 OOM Killer 可能杀死 QEMU 进程（虚拟机），保护方法包括 hookscript 设置 oom_score_adj、禁用内存气球和优化主机内存。 reddit]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sixiangjia.de/assets/images/morandi.jpg" /><media:content medium="image" url="https://sixiangjia.de/assets/images/morandi.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>