<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Qser3ne’s Blog · 最新文章</title>
    <link>https://qser3ne.site/</link>
    <description>得失随缘，聚散随心，不困于过去，不惧于将来</description>
    <language>zh-CN</language>
    <lastBuildDate>Mon, 28 Sep 2026 03:35:53 GMT</lastBuildDate>
    <atom:link href="https://qser3ne.site/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>你好，世界：一篇排版测试长文</title>
      <link>https://qser3ne.site/posts/hello-world/</link>
      <guid isPermaLink="true">https://qser3ne.site/posts/hello-world/</guid>
      <pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate>
      <description>本站的第一篇文章，也是一篇完整的排版测试：标题、列表、引用、表格、代码、图片、脚注——所有会在正文中出现的元素都在这里。</description>
      <content:encoded><![CDATA[<p>这是本站的第一篇文章。它的任务不是表达观点，而是<strong>测试排版</strong>：把一套正文里可能出现的所有元素依次铺开，看它们在「柔光体系」下的样子。如果你正在读这一段，说明正文段落的行距、栏宽与字号已经生效——16px 无衬线、行高 1.75、每行约四十个字。</p>
<h2 id="一标题的层级">一、标题的层级</h2>
<p>正文的层级从二级标题开始。二级标题负责大节，三级标题负责小节，再往下就不应该出现标题了——如果一件事需要四级标题才能讲清楚，说明它应该拆成两篇文章。</p>
<h3 id="11-小节标题的样子">1.1 小节标题的样子</h3>
<p>这是一个三级标题下面的段落。注意标题本身不使用编号以外的装饰，层级关系由字号与留白表达。</p>
<h2 id="二列表">二、列表</h2>
<p>无序列表用于并列：</p>
<ul>
<li>浅灰白作为底色，拒绝刺眼的纯白</li>
<li>近黑作为正文，拒绝低对比度灰</li>
<li>圆角卡片加柔和阴影，层次不靠喊叫</li>
</ul>
<p>有序列表用于步骤：</p>
<ol>
<li>先想清楚要写什么</li>
<li>再想清楚不写什么</li>
<li>最后才动笔</li>
</ol>
<p>嵌套列表用于细分：</p>
<ul>
<li>视觉系统
<ul>
<li>色彩：灰白底、白卡、暗红强调</li>
<li>排印：无衬线正文，图标化元信息</li>
</ul>
</li>
<li>工程系统
<ul>
<li>静态生成</li>
<li>零后端</li>
</ul>
</li>
</ul>
<h2 id="三引用">三、引用</h2>
<blockquote>
<p>把想清楚的事写下来，是唯一能让它继续想下去的方式。</p>
<p>——这句话放在页脚题词的位置，也放在这里测试引用块。</p>
</blockquote>
<p>引用块应该是浅底圆角的旁注：凹面色打底、左侧一道强调色细线、不抢正文的戏。</p>
<div class="callout"><p class="callout-label">为什么要有标注块</p><p>有些话值得从正文里提出来，但不值得用颜色喊叫。浅灰底加无衬线标签就是它的全部装饰——像便签，不像霓虹灯。</p></div>
<div class="callout"><p class="callout-label">注</p><p>这是 <code>:::note</code> 的简写形式，标签默认为「注」；带标签写法是 <code>:::callout{label="标签"}</code>。</p></div>
<h2 id="四表格">四、表格</h2>






























<table><thead><tr><th>元素</th><th>处理方式</th><th>备注</th></tr></thead><tbody><tr><td>卡片</td><td>16px 圆角 + 柔和阴影</td><td>阴影透明度 ≤ 0.12</td></tr><tr><td>浮层</td><td>更深一档的柔和阴影</td><td>代替硬朗描边</td></tr><tr><td>强调色</td><td>暗红</td><td>预算 ≤ 5% 像素</td></tr><tr><td>元信息</td><td>无衬线 + 小图标</td><td>胶囊化标签</td></tr></tbody></table>
<p>表格用浅发丝线分隔行，表头文字重一档，数字右对齐留给实现阶段。</p>
<h2 id="五代码">五、代码</h2>
<p>行内代码像 <code>--ground</code> 这样出现在句子里。代码块则独占一行：</p>
<pre class="astro-code astro-code-themes q3-light q3-dark" style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#1E222A; overflow-x: auto;" tabindex="0" data-language="css" data-pagefind-ignore=""><code><span class="line"><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">/* 柔光体系的根基：底色、正文色、暗红强调 */</span></span>
<span class="line"><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">root</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> {</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">  --ground</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> #</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">F6F8FB</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">;</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">  --ink</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> #</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">2B313A</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">;</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">  --accent</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> #</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">A31F34</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">;</span></span>
<span class="line"><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">}</span></span></code></pre>
<p>另一种语言（TypeScript）：</p>
<pre class="astro-code astro-code-themes q3-light q3-dark" style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#1E222A; overflow-x: auto;" tabindex="0" data-language="ts" data-pagefind-ignore=""><code><span class="line"><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">export</span><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4"> const</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> site </span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">=</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> {</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">  name</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> '</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">[站点名]</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">'</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">  since</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C"> 2026</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span></span>
<span class="line"><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">}</span><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4"> as</span><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4"> const</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">;</span></span></code></pre>
<p>以及一段 Shell：</p>
<pre class="astro-code astro-code-themes q3-light q3-dark" style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#1E222A; overflow-x: auto;" tabindex="0" data-language="bash" data-pagefind-ignore=""><code><span class="line"><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold">npm</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8"> run</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8"> build</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> &#x26;&#x26;</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> npm</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8"> run</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8"> preview</span></span></code></pre>
<p>代码块应该有语言标签和复制按钮，配色跟随亮暗主题。</p>
<h2 id="六图片与图注">六、图片与图注</h2>
<figure><img src="https://qser3ne.site/images/demo/typography.jpg" alt="" aria-hidden="true"><figcaption>一张演示配图，用于验证图片与图注的排版</figcaption></figure>
<p>图注跟随图片，使用小号字与次级色。演示配图来自 Lorem Picsum，仅用于验证版面。</p>
<h2 id="七脚注与分隔线">七、脚注与分隔线</h2>
<p>这里有一个脚注<sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref="" aria-describedby="footnote-label">1</a></sup>，还有一个链接到<a href="https://example.com">外部的引用</a>。链接是暗红色的，悬停时有明确的回应，下划线不贴着字身。</p>
<hr>
<p>分隔线之上是上半场，之下是总结。</p>
<h2 id="八中英文混排">八、中英文混排</h2>
<p>中文写作离不开西文与数字：比如 2026 年、17 寸屏幕、TypeScript 3.9、或 CSS 的 <code>line-height</code>。好的混排不需要手动加空格——盘古之白应由渲染层处理，写作时保持自然。标点也值得检查：中文全角逗号、句号、顿号，与西文半角括号不要混用，列一个对照：</p>
<ul>
<li>全角：，。、；：？！“”‘’（用于中文句子）</li>
<li>半角：,.;:?!””’()（用于代码与西文句内）</li>
</ul>
<p>另一个容易忽略的细节是省略号：中文用“……”而不是三个句号，破折号用“——”而不是两个连字符。</p>
<h2 id="九长段落与短段落">九、长段落与短段落</h2>
<p>长段落是对排版的真正考验。设想这样一段：从浅灰白的底色开始，经过近黑文字的密度，穿过发丝线的分隔，抵达暗红的强调——一路上每一个元素都在争夺注意力，而排版的任务是让它们排队：底色退到最后，文字站到最前，线条只做引导，强调色一年只准出场几次。如果读者读完这一段没有意识到任何“设计”的存在，只记得内容本身，那这套系统就赢了。反之，如果读者先看到的是“这个博客好特别”，那它就输了——被看见的设计是失败的装饰，看不见的设计才是成功的秩序。</p>
<p>短段落则是另一种测试。</p>
<p>一句话成段时，留白是否还成立？</p>
<p>答案取决于段落间距是否恒定：无论一段五十字还是五百字，段与段之间的呼吸必须一致。恃强凌弱的间距体系会在短段落面前穿帮。</p>
<h2 id="十强调与内联元素">十、强调与内联元素</h2>
<p>正文中会出现的所有内联元素集中在此：<strong>加粗</strong>用来标记真正重要的判断，<em>斜体</em>用于西文书名与术语，<del>删除线</del>几乎不该出现（出现时必然是修辞），以及行内代码 <code>--hairline</code>。它们在同一段里混排时最容易出问题：加粗会撑破字距，斜体在无衬线下只剩倾斜角度，行内代码的背景色如果太重会切断行内的灰度节奏。本段的测试点是：读完之后你只记得哪个词被强调了，而不记得它们各自长什么样。</p>
<h2 id="十一对齐断行与标点">十一、对齐、断行与标点</h2>
<p>中文排版的深水区在细节。<strong>两端对齐</strong>在长行中文里几乎必然产生拉伸的高原与低谷，本站选择左对齐、右端参差——阅读视线回行时参差反而更稳定。<strong>标点悬挂</strong>是另一件事：行首不该出现句号逗号，行尾不该出现开引号，浏览器对此的支持仍然零碎，需要接受“绝大多数时候正确”的妥协。<strong>西文断词</strong>在中文正文里只影响夹杂的英文术语，<code>word-break</code> 与 <code>overflow-wrap</code> 的取舍留一组对照：</p>
<ul>
<li>默认：长 URL 可能溢出栏宽</li>
<li><code>overflow-wrap: break-word</code>：只在必要时断开</li>
<li><code>word-break: break-all</code>：随处可断，西文惨不忍睹</li>
</ul>
<p>本站采用第二种：必要时的丑是可以接受的，常态的丑不可以。</p>
<p>数字与单位的排法也有讲究：纯数字用正体，变量用斜体，单位与数字之间留半个字宽——“720px 栏宽”而不是“720 px栏宽”。表格里的数字右对齐便于比大小：</p>






























<table><thead><tr><th align="right">参数</th><th align="right">取值</th><th>来源</th></tr></thead><tbody><tr><td align="right">字号</td><td align="right">16</td><td>可读性基线</td></tr><tr><td align="right">行高</td><td align="right">1.75</td><td>汉字密度</td></tr><tr><td align="right">栏宽</td><td align="right">720</td><td>约四十字</td></tr><tr><td align="right">行内代码字号</td><td align="right">14</td><td>视觉等高</td></tr></tbody></table>
<h2 id="十二引用的变奏">十二、引用的变奏</h2>
<p>单段引用之外，还有连续引用：</p>
<blockquote>
<p>第一段引用。它足够长，长到能观察左侧细线与内缩在多行下的表现。</p>
<p>第二段引用与第一段之间用空引用行分隔，两段的视觉权重应当一致。</p>
</blockquote>
<p>以及引用内嵌套列表：</p>
<blockquote>
<p>引用里的列表：</p>
<ul>
<li>灰白不是白</li>
<li>近黑不是黑</li>
</ul>
</blockquote>
<h2 id="十三更多的代码">十三、更多的代码</h2>
<p>长代码块测试滚动与行高：</p>
<pre class="astro-code astro-code-themes q3-light q3-dark" style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#1E222A; overflow-x: auto;" tabindex="0" data-language="python" data-pagefind-ignore=""><code><span class="line"><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">from</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> dataclasses </span><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">import</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> dataclass</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#636D79;--shiki-light-font-weight:bold;--shiki-dark:#A3ACB9;--shiki-dark-font-weight:bold">@</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold">dataclass</span></span>
<span class="line"><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">class</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> Post</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">    title</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> str</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">    pub_date</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> str</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">    tags</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> list</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">[</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold">str</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#636D79;--shiki-light-font-weight:bold;--shiki-dark:#A3ACB9;--shiki-dark-font-weight:bold">    @</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold">property</span></span>
<span class="line"><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">    def</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> year</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">(</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">self</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">)</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> -></span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> int</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span></span>
<span class="line"><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">        return</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> int</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">(</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">self</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">.</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">pub_date</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">[:</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">4</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">])</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">posts </span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">=</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> [</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">    Post</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">(</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">新年，重新开始写</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> "</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">2026-01-01</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> [</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">写作</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> "</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">习惯</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">]),</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">    Post</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">(</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">在 WSL2 里搭一套顺手的开发环境</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> "</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">2026-08-14</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> [</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">WSL</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> "</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">工具链</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">]),</span></span>
<span class="line"><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">for</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> post </span><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">in</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> sorted</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">(</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">posts</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> key</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">=</span><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">lambda</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> p</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> p</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">.</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">year</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> reverse</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">=</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">True</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">):</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold">    print</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">(</span><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">f</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">"</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">{</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">post</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">.</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">year</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">}</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">  {</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">post</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">.</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">title</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">}</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">)</span></span></code></pre>
<pre class="astro-code astro-code-themes q3-light q3-dark" style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1;--shiki-light-bg:#FFFFFF;--shiki-dark-bg:#1E222A; overflow-x: auto;" tabindex="0" data-language="go" data-pagefind-ignore=""><code><span class="line"><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">package</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> main</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">import</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> "</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">fmt</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">type</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> Site</span><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4"> struct</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> {</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">    Name  </span><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">string</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">    Since </span><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">int</span></span>
<span class="line"><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#1F6F8B;--shiki-dark:#7FB8D4">func</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> main</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">()</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> {</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">    s </span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:=</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold"> Site</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">{</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">Name</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9"> "</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8">[站点名]</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> Since</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">:</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C"> 2026</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">}</span></span>
<span class="line"><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">    fmt</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">.</span><span style="--shiki-light:#2B313A;--shiki-light-font-weight:bold;--shiki-dark:#E9ECF1;--shiki-dark-font-weight:bold">Printf</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">(</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">%s</span><span style="--shiki-light:#387651;--shiki-dark:#93C8A8"> · since </span><span style="--shiki-light:#955C00;--shiki-dark:#D9A35C">%d\n</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">"</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> s</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">.</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">Name</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">,</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1"> s</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">.</span><span style="--shiki-light:#2B313A;--shiki-dark:#E9ECF1">Since</span><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">)</span></span>
<span class="line"><span style="--shiki-light:#636D79;--shiki-dark:#A3ACB9">}</span></span></code></pre>
<p>两种语言、两种风格，同一套亮暗配色——语法高亮是“配色”而非“彩色”，任何语言在任何主题下都不该喊叫。</p>
<h2 id="十四图片的更多形态">十四、图片的更多形态</h2>
<p>单图之外，正文中的图片还有几种出场方式。紧随段落的配图承接上文意象；两组图的对比需要统一高度与图注句式；横贯栏宽的大图则应该有自己的呼吸空间——上下各留一个段落间距，而不是贴着文字。图注的写法也有讲究：它不是重复图片内容的字幕，而是补充正文没说的信息——拍摄时间、数据来源、或看图的方法。无障碍语境下图注与 alt 文本各司其职：alt 面向读屏用户描述图像信息，图注面向所有人补充上下文。本站的图片一律 12px 圆角、不浮动环绕——环绕排版在中文长文里几乎必然造成右侧参差，而参差的代价由读者承担。</p>
<p>图片之外还有一个特殊形态：无图。设计目标之一是“没有一张配图时站点依然成立”，所以每个依赖图片的位置都必须有无图降级：封面可选、首页有无图时的浅色占位、正文没有图片时就是纯粹的文字。图片是锦上添花，不是结构支柱——这句话是整个视觉系统的地基。</p>
<h2 id="十五排版的节奏">十五、排版的节奏</h2>
<p>把前面所有元素放进同一段视野里观察：标题、正文、列表、代码、引用、表格，它们的灰度、密度与留白构成一篇长文的节奏。节奏的离下在于重音不能连着重音：加粗的段落后面该跟一段平叙，表格之后该有一段过渡，连续三个列表几乎总是结构错误。编辑的工作一半是改字，一半是调度这些元素的出场顺序。这篇长文刻意在密集元素之间插入成段的议论，正是为了验证这种调度在真实阅读里的手感——你此刻读到的是一篇经过调度而非堆砌的测试文。</p>
<h2 id="十六总结">十六、总结</h2>
<p>如果以上所有元素都在各自的岗位上——标题有层级、列表有呼吸、引用像旁注、表格不喊叫、代码有圆角和标签、图片有图注、脚注可跳转、链接有回应——那么这套排版系统就可以交付了。剩下的，是把想清楚的事，一篇一篇写下来。</p>
<section data-footnotes="" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-1">
<p>脚注出现在文章末尾，正文中的序号可以跳转过去。 <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
    </item>
    <item>
      <title>把博客当成一个长期项目来维护</title>
      <link>https://qser3ne.site/posts/2026-09-12-blog-as-long-term-project/</link>
      <guid isPermaLink="true">https://qser3ne.site/posts/2026-09-12-blog-as-long-term-project/</guid>
      <pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate>
      <description>写到第十篇的时候我才意识到，真正卡住人的不是选题。</description>
      <content:encoded><![CDATA[<p>写到第十篇的时候我才意识到，真正卡住人的不是选题，而是每次都要重新决定用哪种方式开头、以哪种姿态收尾——这些决策成本比写字本身更消耗人。</p>
<p>解法是把博客当成项目来维护：开头有固定的引子句式，收尾回扣标题；每周固定时间写，发布门槛降到「讲清一件事」；版式、代码、部署全部模板化，让写作环节之外的一切都变成肌肉记忆。</p>
<p>长期项目的关键指标只有一个：<strong>还活着</strong>。写作频率、文章质量、访问量都是派生指标。只要这个月还在写，项目就没有失败——这就是我能给出的全部方法论。</p>]]></content:encoded>
    </item>
    <item>
      <title>在 WSL2 里搭一套顺手的开发环境</title>
      <link>https://qser3ne.site/posts/2026-08-14-wsl2-dev-env/</link>
      <guid isPermaLink="true">https://qser3ne.site/posts/2026-08-14-wsl2-dev-env/</guid>
      <pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate>
      <description>从 shell、字体到 Docker 集成，把每天要点十几次的东西一次调好。</description>
      <content:encoded><![CDATA[<p>在 Windows 上做开发，WSL2 是目前最舒服的答案：Linux 的一套工具链原生运行，文件在 Windows 侧也摸得到。以下是这套环境的骨架。</p>
<p><strong>基础层</strong>：Ubuntu 24.04 + zsh。包管理交给 apt，语言版本交给各自的版本管理器（nvm、sdkman、官方 tarball），不混用。</p>
<p><strong>字体</strong>：终端字体决定长时间阅读的疲劳度。选一款带连字（ligatures）的等宽字体，Windows Terminal 里设置完成后，连 <code>=></code> 和 <code>!=</code> 都会变成单个字形。</p>
<p><strong>Docker</strong>：Docker Desktop 开启 WSL 集成后，发行版里直接可用 <code>docker</code> 命令。记住两个前提：桌面版要先启动；代码放 WSL 文件系统而不是 <code>/mnt/c</code>，卷挂载性能差一个数量级。</p>
<p><strong>编辑器</strong>：VS Code 的 Remote-WSL 模式，编辑器 UI 在 Windows，语言服务在 Linux，两边都不妥协。</p>
<p><strong>验证</strong>：<code>git</code>、<code>node -v</code>、<code>docker ps</code> 三条命令都通，环境就算立住了。之后每装一样东西，都用一条命令验证一次——环境搭建的本质是验证，不是安装。</p>]]></content:encoded>
    </item>
    <item>
      <title>从 Hexo 到 Astro：静态博客的选型笔记</title>
      <link>https://qser3ne.site/posts/2026-07-02-hexo-to-astro/</link>
      <guid isPermaLink="true">https://qser3ne.site/posts/2026-07-02-hexo-to-astro/</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
      <description>不带情绪的迁移理由：零 JS 默认、内容集合与 TS 校验。</description>
      <content:encoded><![CDATA[<p>博客圈的工具链讨论很容易变成信仰之争，所以这篇只记录选型时真正起作用的三条标准，以及它们如何指向 Astro。</p>
<p><strong>默认零 JS</strong>。博客 95% 的面积是静态内容，任何默认带运行时的方案都是在为 5% 的交互付出 100% 的成本。Astro 的「群岛架构」让交互只出现在真正需要的小岛上——主题切换、搜索、目录高亮，其余全是纯 HTML。</p>
<p><strong>内容集合与校验</strong>。十篇 Markdown 可随意，一百篇之后 frontmatter 的混乱会反噬。Astro 的 content collections 用 schema 校验 frontmatter，字段缺失在构建期报错，而不是渲染出一页残缺的文章。</p>
<p><strong>TypeScript 一等公民</strong>。站点配置、组件 props、内容类型都在一个类型系统里，改字段名时编辑器直接告诉你哪里断了。</p>
<p>Hexo 陪了我很多年，但它解决的问题（2014 年的构建速度）已经不是今天的问题。工具没有忠诚度，只有适配度。</p>]]></content:encoded>
    </item>
    <item>
      <title>为什么这个博客用圆角和柔和阴影</title>
      <link>https://qser3ne.site/posts/2026-06-18-no-radius-no-shadow/</link>
      <guid isPermaLink="true">https://qser3ne.site/posts/2026-06-18-no-radius-no-shadow/</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <description>层次也可以靠柔和的阴影——从印刷词汇回到屏幕词汇的一次改主意。</description>
      <content:encoded><![CDATA[<p>现在的网页默认词汇是：圆角卡片、投影、毛玻璃。它们都来自同一个隐喻——<strong>屏幕里的物理世界</strong>，卡片是漂浮在桌面的纸片。很多人批评这套词汇轻浮，但被批评的往往不是词汇本身，而是滥用：圆角圆成糖纸，投影黑成夜晚。</p>
<p>这个博客用的是一套克制的「柔光」词汇：</p>
<ul>
<li>圆角有节制——卡片 16px、图片 12px，再大就是玩具</li>
<li>阴影低透明度、大模糊——托起层次，而不是炫耀光源</li>
<li>强调留给暗红色——小面积、有预算，一年只出场几次</li>
</ul>
<p>层次不一定要靠投影，这点没错。一本书里没有投影：标题靠字号，段落靠缩进，层次靠细线。印刷词汇安静、克制，这个博客曾经整套用过它。但它要求读者自己完成全部的空间想象——而屏幕上的读者往往在滚动、在分心、在 390px 宽的手机上读一篇三千字的长文。印出来的层次是「读」出来的，浮起的层次是「看」见的：后者便宜，但对分心的人更诚实。</p>
<p>用回圆角和阴影之后有一个意外的收获：层次变直觉了。卡片是一张卡片，浮层是一次浮起，读者不需要学习词汇——注意力仍然回到文字本身，因为所有装饰都压在低透明度、大模糊的柔和阴影里，谁也不炫耀光源。对一个以长文为主的站点，这正是想要的。</p>]]></content:encoded>
    </item>
    <item>
      <title>宋体在屏幕上的可读性实验</title>
      <link>https://qser3ne.site/posts/2026-05-30-serif-on-screen/</link>
      <guid isPermaLink="true">https://qser3ne.site/posts/2026-05-30-serif-on-screen/</guid>
      <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
      <description>十八像素、一点九倍行高、七百二十像素栏宽——一组为宋体正文调出的参数。</description>
      <content:encoded><![CDATA[<p>中文网页正文几乎被黑体垄断，理由通常是「宋体在屏幕上糊」。但糊的往往不是字体，而是参数：字号太小、行高太紧、栏宽太宽。</p>
<p>我做过一组实验，结论是宋体正文成立，前提是三个参数同时到位：</p>
<ol>
<li><strong>字号 18px</strong>。宋体笔画细，14px 以下发虚；到 18px，横细竖粗的骨架才立得住。</li>
<li><strong>行高 1.9</strong>。汉字方块密度高，1.5 的行高读两行就开始串行；1.9 给每行留出呼吸。</li>
<li><strong>栏宽 720px</strong>。约三十八到四十字一行。超过五十字，眼睛回行时会丢行。</li>
</ol>
<p>三者缺一，可读性就崩回「宋体糊」的印象。参数对了，宋体的书卷气是黑体给不了的——黑体有黑体的清楚，宋体有宋体的书卷气；选哪个，取决于你要一册工具书还是一卷文集。</p>]]></content:encoded>
    </item>
    <item>
      <title>我的终端配置清单</title>
      <link>https://qser3ne.site/posts/2026-04-22-terminal-setup/</link>
      <guid isPermaLink="true">https://qser3ne.site/posts/2026-04-22-terminal-setup/</guid>
      <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
      <description>每天要点十几次的东西，值得一次调好。</description>
      <content:encoded><![CDATA[<p>每天要点开几十次的东西，值得花一个下午调好。我的清单：</p>
<ul>
<li><strong>Shell</strong>：zsh + 最小化配置，不装花哨主题，只留语法高亮与自动建议</li>
<li><strong>编辑器</strong>：终端里用 neovim 看小文件，大改动交给编辑器</li>
<li><strong>提示符</strong>：右侧显示 git 分支与退出码，其他一概不要</li>
<li><strong>别名</strong>：只为高频命令设别名，比如 <code>gco</code>、<code>dcu</code>，其余交给历史搜索 Ctrl-R</li>
<li><strong>字体</strong>：等宽字体是终端体验的底盘，值得认真挑一款</li>
</ul>
<p>配置的全部原则只有一条：每次觉得「这里不顺手」就立刻修，不顺手的债务会复利。</p>]]></content:encoded>
    </item>
    <item>
      <title>Docker Desktop 与 WSL 集成的几个坑</title>
      <link>https://qser3ne.site/posts/2026-03-15-docker-wsl-pitfalls/</link>
      <guid isPermaLink="true">https://qser3ne.site/posts/2026-03-15-docker-wsl-pitfalls/</guid>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <description>内存、启动顺序与卷挂载权限的踩坑记录。</description>
      <content:encoded><![CDATA[<p>在 WSL2 里用 Docker Desktop，坑集中在三处。</p>
<p><strong>内存</strong>：默认配置下 vmmem 会吃掉宿主机大半内存。解法是 <code>%USERPROFILE%\.wslconfig</code> 里限制 <code>memory=8GB</code>，改完 <code>wsl --shutdown</code> 重启生效。</p>
<p><strong>启动顺序</strong>：WSL 里的 docker 命令依赖 Windows 侧的 Docker Desktop 先启动。桌面版没起来时 <code>docker ps</code> 会报 <code>cannot connect to the Docker daemon</code>。可以在 shell 配置里加一个检查，或者干脆从 WSL 侧拉起桌面版再等就绪。</p>
<p><strong>卷挂载权限</strong>：<code>/mnt/c</code> 下的路径挂载进容器性能差且权限混乱。项目代码尽量放在 WSL 文件系统（如 <code>~/workspace</code>）里，需要访问 Windows 文件时再走 <code>/mnt/c</code>。</p>
<p>三条都不复杂，但每条都足以浪费一个下午。记录在此，希望帮你省下这三个下午。</p>]]></content:encoded>
    </item>
    <item>
      <title>读《卡片笔记写作法》的两点收获</title>
      <link>https://qser3ne.site/posts/2026-02-08-reading-notes/</link>
      <guid isPermaLink="true">https://qser3ne.site/posts/2026-02-08-reading-notes/</guid>
      <pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate>
      <description>不做第二大脑，只做思考工具。</description>
      <content:encoded><![CDATA[<p>读《卡片笔记写作法》，最大的收获有两点。</p>
<p>第一，笔记的价值不在收集而在连接。摘抄一百条不如用自己的话重写一条——重写逼你理解，理解才可能与其他想法发生关系。</p>
<p>第二，写作不是从零开始的过程，而是从已有笔记里「长」出来的。平时把想法存成一张张卡片，动笔时做的只是排列与缝合。</p>
<p>所以这个博客的定位也清楚了：它不是发表成果的展柜，而是卡片之间连接的公开记录。</p>]]></content:encoded>
    </item>
    <item>
      <title>新年，重新开始写</title>
      <link>https://qser3ne.site/posts/2026-01-01-write-again/</link>
      <guid isPermaLink="true">https://qser3ne.site/posts/2026-01-01-write-again/</guid>
      <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
      <description>关于重新开始写作的两百个字。</description>
      <content:encoded><![CDATA[<p>去年写了三篇就停了。复盘下来不是没时间，而是每次动笔都想写一篇「值得发表的」，门槛太高，最后干脆不写。</p>
<p>今年把规则改小：一篇只讲一件事，两百字也算数，写完就发。先让「写」这个动作活下来，质量让位给频率。</p>
<p>这是新规则下的第一篇。两百字，讲完一件事：把门槛降到能跨过去的高度。</p>]]></content:encoded>
    </item>
  </channel>
</rss>