<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Niracler's TIL 每日一学</title><link>https://til.niracler.com/</link><follow_challenge><feedId>125502964885313536</feedId><userId>41434914948866048</userId></follow_challenge><description>Recent content on Niracler's TIL 每日一学</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 07 May 2025 16:47:53 +0800</lastBuildDate><atom:link href="https://til.niracler.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Mired 与 Kelvin：深入理解色温控制</title><link>https://til.niracler.com/post/2025-05-07-mired-and-kelvin/</link><pubDate>Wed, 07 May 2025 16:47:53 +0800</pubDate><guid>https://til.niracler.com/post/2025-05-07-mired-and-kelvin/</guid><description>&lt;h2 id="1-要点总结">1 要点总结&lt;/h2>
&lt;p>Mired 和 Kelvin 是色温控制中常用的两种单位。Kelvin (K) 直接测量光源的色温，是色温的标准单位。然而，人类对色温变化的感知并非线性，例如 3000K 到 4000K 的变化比 5000K 到 6000K 的变化在视觉上更为显著。Mired（微互成度）是 Kelvin 的倒数乘以一百万（$M = \frac{1,000,000}{T}$），它提供了一个更符合人类感知的线性尺度。色温概念起源于17世纪牛顿的光学实验，Kelvin 温标在19世纪由开尔文勋爵提出。1932年，Irwin G. Priest 提出了 Mired 的概念，以解决 Kelvin 尺度在感知上的非线性问题。色温广泛应用于摄影（白平衡）、照明设计（营造氛围）和显示技术（颜色校准）等领域。&lt;/p>
&lt;h2 id="2-mired-和-kelvin-的定义与区别">2 Mired 和 Kelvin 的定义与区别&lt;/h2>
&lt;h3 id="21-kelvin-k">2.1 Kelvin (K)&lt;/h3>
&lt;p>Kelvin 是国际单位制中温度的基本单位，也用于衡量光源的颜色温度。色温描述的是一个理想黑体辐射器加热到特定温度时所发出的光的颜色。例如：&lt;/p>
&lt;ul>
&lt;li>蜡烛火焰：约 1850K&lt;/li>
&lt;li>钨丝灯泡（家用）：约 2700-3300K&lt;/li>
&lt;li>日光（平均）：约 5600K&lt;/li>
&lt;li>阴天：约 6500-7500K&lt;/li>
&lt;/ul>
&lt;p>Kelvin 值直接反映了光源的物理特性。然而，正如前面提到的，Kelvin 尺度在描述人类对色温变化的感知时存在非线性问题。&lt;/p>
&lt;h3 id="22-mired-micro-reciprocal-degree">2.2 Mired (Micro Reciprocal Degree)&lt;/h3>
&lt;p>Mired，即微倒数度或微互成度，是为了弥补 Kelvin 在感知线性度上的不足而引入的单位。其计算公式为：&lt;/p>
$$ M = \frac{1,000,000}{T_K} $$
&lt;p>其中 $T_K$ 是以 Kelvin 为单位的色温。&lt;/p>
&lt;p>通过 Mired，色温变化的感知变得更加线性。例如：&lt;/p>
&lt;ul>
&lt;li>从 3000K (333 Mired) 到 4000K (250 Mired) 的变化是 83 Mired。&lt;/li>
&lt;li>从 5000K (200 Mired) 到 6000K (167 Mired) 的变化是 33 Mired。&lt;/li>
&lt;/ul>
&lt;p>这更准确地反映了人眼对前者色温变化更为敏感的事实。&lt;/p>
&lt;h3 id="23-主要区别">2.3 主要区别&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>特性&lt;/th>
&lt;th>Kelvin (K)&lt;/th>
&lt;th>Mired&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>定义&lt;/strong>&lt;/td>
&lt;td>色温的绝对单位，基于黑体辐射&lt;/td>
&lt;td>色温的倒数，更符合人类感知&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>感知线性度&lt;/strong>&lt;/td>
&lt;td>非线性&lt;/td>
&lt;td>相对线性&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>主要用途&lt;/strong>&lt;/td>
&lt;td>定义光源的固有色温&lt;/td>
&lt;td>计算色温校正值（如滤镜），调整色温&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>示例&lt;/strong>&lt;/td>
&lt;td>日光灯约为 5600K&lt;/td>
&lt;td>从 3200K 调至 5500K 需约 -137 Mired 滤镜&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>在实际应用中，Kelvin 通常用于标识光源本身固有的色温类型，而 Mired 则更多地应用于需要调整或校正色温的场景，尤其是在摄影和专业照明领域，它可以帮助精确计算所需的滤镜强度。&lt;/p>
&lt;h2 id="3-mired-和-kelvin-的前世今生">3 Mired 和 Kelvin 的前世今生&lt;/h2>
&lt;p>色温概念的发展历程漫长而有趣：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>17世纪&lt;/strong>：艾萨克·牛顿爵士 (Sir Isaac Newton) 在1665年通过三棱镜实验，将白光分解为七色光谱（红、橙、黄、绿、蓝、靛、紫），奠定了现代光学和颜色理论的基础。&lt;/li>
&lt;li>&lt;strong>19世纪&lt;/strong>：随着温度测量技术的发展，科学家们开始探索热与光之间的关系。威廉·汤姆森，即后来的开尔文勋爵 (Lord Kelvin)，在19世纪中期提出了绝对温标，即 Kelvin 温标，以绝对零度 (-273.15°C) 为起点。这为色温的量化提供了标准单位。&lt;/li>
&lt;li>&lt;strong>20世纪初&lt;/strong>：色温测量和标准化取得重要进展。1931年，国际照明委员会 (CIE) 定义了 CIE XYZ 色彩空间，并引入了相关色温 (Correlated Color Temperature, CCT) 的概念，用于描述非理想黑体光源的颜色特性。&lt;/li>
&lt;li>&lt;strong>1932年&lt;/strong>：美国国家标准局的科学家欧文·G·普里斯特 (Irwin G. Priest) 发表了关键论文，指出人类对色温差异的感知与色温的倒数值成正比，而非色温的绝对差值。他因此提出了 &amp;ldquo;Mired&amp;rdquo; (micro-reciprocal-degree) 这一单位。这一发现极大地推动了色温在实际应用中的精确控制，特别是在摄影滤镜和照明设计领域。Mired 的引入有效解决了 Kelvin 尺度在感知上的非线性问题。&lt;/li>
&lt;/ul>
&lt;p>苹果的 HomeKit 平台也采用 Mired 来指定灯光的色温，进一步证明了其在现代智能家居技术中的实用性。&lt;/p>
&lt;h2 id="4-关于色温的那些事">4 关于色温的那些事&lt;/h2>
&lt;p>色温不仅仅是一个物理参数，它深刻影响着我们的视觉体验和心理感受。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>暖色调与冷色调&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>低色温（通常低于 3300K）的光源呈现偏红、橙、黄的暖色调，能营造出温馨、舒适、放松的氛围，例如白炽灯和日出日落时的阳光。&lt;/li>
&lt;li>高色温（通常高于 5300K）的光源呈现偏蓝的冷色调，能带来清爽、专注、警觉的感觉，例如正午日光和阴天的光线。&lt;/li>
&lt;li>中等色温（3300K - 5300K）的光线则相对中性，常被称为&amp;quot;白光&amp;quot;。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>摄影与白平衡 (White Balance, WB)&lt;/strong>：
人类的视觉系统具有很强的适应性，可以在不同色温的光线下识别出物体本来的颜色。但相机等成像设备则不然，它们需要通过&amp;quot;白平衡&amp;quot;设置来校正不同光源下的颜色偏差，以确保白色物体在照片中呈现为准确的白色。摄影师常根据拍摄环境的色温（如钨丝灯 3200K，闪光灯 5500K）调整相机的白平衡，或使用不同 Mired 值的滤色片来达到期望的色温效果。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>照明设计&lt;/strong>：
在室内外照明设计中，色温的选择至关重要。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>家居照明&lt;/strong>：卧室、客厅等区域通常采用暖色温（2700K-3000K）光源，以营造舒适放松的氛围。书房、厨房等区域可能选用中性或稍冷的色温（3500K-4500K）以提高专注度和清晰度。&lt;/li>
&lt;li>&lt;strong>商业与办公照明&lt;/strong>：办公室、商场、医院等场所常采用中性到冷白色温（4000K-6500K），有助于提高工作效率和警觉性。&lt;/li>
&lt;li>&lt;strong>显色指数 (Color Rendering Index, CRI)&lt;/strong>：除了色温，光源的显色指数也非常重要。CRI衡量光源还原物体真实颜色的能力，高CRI（通常大于80或90）的光源能更准确地展现物品的色彩。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>显示技术与色彩校准&lt;/strong>：
显示器、电视和投影仪等设备的色彩表现也与色温密切相关。D65 (对应约 6504K) 是一个常见的行业标准白点，用于确保在不同设备上观看内容时颜色的一致性。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="41-常见光源色温及对应-mired-值">4.1 常见光源色温及对应 Mired 值&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>光源类型&lt;/th>
&lt;th>色温 (K)&lt;/th>
&lt;th>Mired 值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>烛光&lt;/td>
&lt;td>1850&lt;/td>
&lt;td>541&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>白炽灯 (100W)&lt;/td>
&lt;td>2800-2900&lt;/td>
&lt;td>357-345&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>卤素灯&lt;/td>
&lt;td>3000&lt;/td>
&lt;td>333&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>钨丝灯 (摄影棚)&lt;/td>
&lt;td>3200&lt;/td>
&lt;td>312&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>日出/日落&lt;/td>
&lt;td>2000-3000&lt;/td>
&lt;td>500-333&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LED (暖白)&lt;/td>
&lt;td>2700-3000&lt;/td>
&lt;td>370-333&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LED (中性白)&lt;/td>
&lt;td>3500-4500&lt;/td>
&lt;td>286-222&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LED (冷白/日光型)&lt;/td>
&lt;td>5000-6500&lt;/td>
&lt;td>200-154&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>正午太阳光&lt;/td>
&lt;td>5000-5800&lt;/td>
&lt;td>200-172&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>电子闪光灯&lt;/td>
&lt;td>5500-6000&lt;/td>
&lt;td>182-167&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>阴天/多云&lt;/td>
&lt;td>6500-7500&lt;/td>
&lt;td>154-133&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>显示器标准 (D65)&lt;/td>
&lt;td>6504&lt;/td>
&lt;td>154&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;em>数据来源: 综合 Wikipedia 及行业常见数值。&lt;/em>&lt;/p>
&lt;h2 id="5-总结与展望">5 总结与展望&lt;/h2>
&lt;p>Kelvin 和 Mired 都是描述色温的重要单位，但它们各有侧重。Kelvin 直接定义了光源的物理色温，而 Mired 则提供了一个更符合人类视觉感知的尺度，尤其在需要精确调整色温的摄影和照明领域中至关重要。从牛顿的光学启蒙到现代复杂的照明系统，对色温的理解和应用不断深化。随着 LED 技术和智能控制系统的发展，未来我们可以期待更加个性化、更利于健康的动态色温照明方案，Mired 和 Kelvin 的概念将继续在其中扮演核心角色。&lt;/p>
&lt;hr>
&lt;h2 id="6-参考资料与拓展阅读">6 参考资料与拓展阅读&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Mired">Mired - Wikipedia&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Color_temperature">Color temperature - Wikipedia&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://visualsproducer.wordpress.com/2020/11/29/mireds-versus-degrees-kelvin-for-colour-temperature/">Colour temperature: mireds versus Kelvin – Visuals Producer&lt;/a>&lt;/li>
&lt;li>Priest, I. G. (1932). &lt;em>A proposed scale for use in specifying the chromaticity of incandescent illuminants and various phases of daylight&lt;/em>. Journal of the Optical Society of America, 23(2), 41-45. (DOI: &lt;code>10.1364/JOSA.23.000041&lt;/code>)&lt;/li>
&lt;li>&lt;a href="https://developer.apple.com/documentation/homekit/hmcharacteristictypecolortemperature">Apple Developer Documentation - HMCharacteristicTypeColorTemperature&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.westinghouselighting.com/color-temperature.aspx">Understanding color temperature - Westinghouse Lighting&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://evidentscientific.com/en/microscope-resource/knowledge-hub/lightandcolor/colortemp">Color Temperature - Evident Scientific&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.pointsinfocus.com/tools/mired-calculator/">Mired/Filter Calculator - Points in Focus Photography&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://videoandfilmmaker.com/wp/tutorials/colour-temperature/">WHAT COLOUR IS THAT TEMPERATURE? - Video &amp;amp; Filmmaker magazine&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>物联网照明的类型分析</title><link>https://til.niracler.com/post/2025-05-06-the-type-of-iot-lighting/</link><pubDate>Tue, 06 May 2025 16:36:23 +0800</pubDate><guid>https://til.niracler.com/post/2025-05-06-the-type-of-iot-lighting/</guid><description>&lt;h2 id="1-要点总结">1 要点总结&lt;/h2>
&lt;p>物联网中的灯主要包括可调光（DIM）、可调色温（CCT）、可变色（RGB）等类型，这些分类基于灯具功能。这些分类不是协议，而是描述灯具能力的术语，它们是通用的照明功能描述。照明工程协会（IES）可能通过标准如ANSI/IES LP-12-21提供了相关指导，但这些分类并非由单一机构提出。&lt;/p>
&lt;h2 id="2-灯的种类与分类">2 灯的种类与分类&lt;/h2>
&lt;p>物联网中的灯根据其控制功能分为几类，例如：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>可调光（DIM）&lt;/strong>：可以调节亮度的灯。&lt;/li>
&lt;li>&lt;strong>可调色温（CCT）&lt;/strong>：可以改变白光温暖程度的灯，从暖白到冷白。&lt;/li>
&lt;li>&lt;strong>可变色（RGB）&lt;/strong>：通过混合红、绿、蓝三种颜色产生多种颜色的灯。&lt;/li>
&lt;li>还有组合类型如RGBW（RGB+白光）和RGB+CCT（RGB+可调色温）。&lt;/li>
&lt;/ul>
&lt;p>这些分类帮助用户根据需求选择合适的灯具，例如在卧室可能更喜欢暖白光（CCT），而在娱乐场所可能需要彩色灯光（RGB）。&lt;/p>
&lt;h2 id="3-分类是否为协议">3 分类是否为协议&lt;/h2>
&lt;p>DIM、CCT、RGB等分类不是协议，而是灯具功能的描述。在物联网中，这些灯通过如Zigbee、Wi-Fi、Bluetooth或Matter等标准协议进行控制，但这些术语本身不属于协议。&lt;/p>
&lt;h2 id="4-提出机构">4 提出机构&lt;/h2>
&lt;p>这些分类是照明行业的通用术语，照明工程协会（IES）通过标准如&lt;a href="https://store.ies.org/product/lighting-practice-iot-connected-lighting/">ANSI/IES LP-12-21 IoT Connected Lighting&lt;/a>提供了相关指导，但并非由单一机构独家提出。&lt;/p>
&lt;h2 id="5-详细分析">5 详细分析&lt;/h2>
&lt;h3 id="51-物联网中灯的种类功能详解">5.1 物联网中灯的种类功能详解&lt;/h3>
&lt;p>根据功能，物联网中的灯可以分为以下几类：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>可调光（DIM）&lt;/strong>：指可以调节亮度的灯，用户可以通过IoT设备调整光线强弱，适合需要不同照明环境的空间。&lt;/li>
&lt;li>&lt;strong>可调色温（CCT）&lt;/strong>：即Correlated Color Temperature，可调白光灯，可以从暖白（约2700K）调整到冷白（6500K以上），用于创建不同的氛围，例如卧室可能偏向暖白，办公室可能偏向冷白。&lt;/li>
&lt;li>&lt;strong>可变色（RGB）&lt;/strong>：通过红、绿、蓝三种LED组合，可以产生1600万种颜色，适合娱乐场所或装饰照明。&lt;/li>
&lt;li>&lt;strong>RGBW&lt;/strong>：在RGB基础上增加白光LED，提供更真实的白光，适合需要高质量白光的场景。&lt;/li>
&lt;li>&lt;strong>RGB+CCT&lt;/strong>：结合RGB的颜色变化和CCT的可调白光功能，适合多功能需求的空间。&lt;/li>
&lt;/ul>
&lt;h3 id="52-分类原因分析">5.2 分类原因分析&lt;/h3>
&lt;p>这些分类的目的是描述灯具的不同控制能力，满足多样化的照明需求：&lt;/p>
&lt;ul>
&lt;li>DIM功能适合节能和氛围调节，如餐厅可能需要低亮度营造温馨环境。&lt;/li>
&lt;li>CCT功能影响光线的温暖程度，研究表明不同色温对人体生理和心理有不同影响，例如暖光有助于放松，冷光提升专注力。&lt;/li>
&lt;li>RGB功能则用于装饰和动态照明，如节日灯光或舞台效果。&lt;/li>
&lt;/ul>
&lt;p>从技术角度，这些分类反映了LED技术的进步和IoT控制的灵活性。用户可以通过智能手机或智能家居系统远程调整这些功能，增强了便利性和个性化。&lt;/p>
&lt;h3 id="53-rgbrgbw和rgb-cct的比较">5.3 RGB、RGBW和RGB-CCT的比较&lt;/h3>
&lt;p>以下表格比较了RGB、RGBW和RGB-CCT的差异，基于&lt;a href="https://lucasled.ie/blog/post/what-is-the-difference-between-rgb-rgbw-and-rgb-cct-led-strip-lights">Lucas LED的分析&lt;/a>：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>类型&lt;/th>
&lt;th>描述&lt;/th>
&lt;th>颜色能力&lt;/th>
&lt;th>白光细节&lt;/th>
&lt;th>核心线数&lt;/th>
&lt;th>LED芯片数&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>RGB&lt;/td>
&lt;td>使用红、绿、蓝LED，提供1600万种颜色&lt;/td>
&lt;td>1600万种颜色，可调饱和度和亮度&lt;/td>
&lt;td>无真实白光，白色由RGB组合生成，非纯白&lt;/td>
&lt;td>4&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RGBW&lt;/td>
&lt;td>在RGB基础上增加白光LED，提供真实白光&lt;/td>
&lt;td>1600万种颜色+真实白光，可选暖白、自然白、冷白&lt;/td>
&lt;td>真实白光，选项取决于型号/用途&lt;/td>
&lt;td>5&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RGB-CCT&lt;/td>
&lt;td>结合全色谱+可调白光，从暖白到冷白&lt;/td>
&lt;td>1600万种颜色+白光全谱&lt;/td>
&lt;td>两个白光芯片覆盖2700K到6500K+&lt;/td>
&lt;td>6&lt;/td>
&lt;td>5&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="54-未来趋势">5.4 未来趋势&lt;/h3>
&lt;p>当前，IoT照明市场快速增长，DIM、CCT、RGB功能的集成度越来越高。研究表明，未来可能出现更多组合功能，如&amp;quot;Dim-to-Warm&amp;quot;（调光变暖），进一步模糊分类界限。&lt;/p>
&lt;h2 id="6-参考资料">6 参考资料&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://store.ies.org/product/lighting-practice-iot-connected-lighting/">ANSI/IES LP-12-21 IoT Connected Lighting&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.sunricher.com/dim-cct-rgbw-rgb-cct-4-in-1-constant-voltage-zigbee-led-controller-sr-zg1029-5c.html">Sunricher Zigbee LED控制器&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://lucasled.ie/blog/post/what-is-the-difference-between-rgb-rgbw-and-rgb-cct-led-strip-lights">Lucas LED RGB RGBW RGB-CCT差异&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://csa-iot.org/csa_product/rgb-cct-dimmable-led-downlight/">CSA-IOT RGB CCT Dimmable LED Downlight&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.ies.org/standards/definitions/">IES照明定义标准&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>使用 Caddy 将运行在云服务器特定端口上的服务通过 HTTPS 暴露在指定域名下</title><link>https://til.niracler.com/post/2025-04-29-caddy-setting-https/</link><pubDate>Tue, 29 Apr 2025 09:08:26 +0800</pubDate><guid>https://til.niracler.com/post/2025-04-29-caddy-setting-https/</guid><description>&lt;h2 id="1-要干什么">1 要干什么&lt;/h2>
&lt;p>要使用 Caddy 将运行在云服务器特定端口上的服务通过 HTTPS 暴露在指定域名下。&lt;/p>
&lt;h2 id="2-要怎么干">2 要怎么干&lt;/h2>
&lt;h3 id="21-安装-caddy">2.1 安装 Caddy&lt;/h3>
&lt;p>确保服务器上已安装 Caddy。您可以从 &lt;a href="https://caddyserver.com/docs/install">Caddy 官方网站&lt;/a> 获取安装指南。安装完成后，可以通过以下命令确认 Caddy 的安装路径：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>which caddy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="22-配置-dns">2.2 配置 DNS&lt;/h3>
&lt;p>将域名的 DNS 记录指向您的云服务器的公网 IP 地址。&lt;/p>
&lt;h3 id="23-配置-caddyfile">2.3 配置 Caddyfile&lt;/h3>
&lt;p>Caddy 的默认配置文件路径为 &lt;code>/etc/caddy/Caddyfile&lt;/code>。使用文本编辑器打开配置文件：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo nano /etc/caddy/Caddyfile
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>添加以下配置内容：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-caddy" data-lang="caddy">&lt;span style="display:flex;">&lt;span>example.com {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">reverse_proxy&lt;/span> &lt;span style="color:#e6db74">localhost:&amp;lt;PORT&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="24-管理-caddy-服务">2.4 管理 Caddy 服务&lt;/h3>
&lt;p>重启 Caddy 服务以应用新配置：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl restart caddy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>检查服务状态：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl status caddy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="25-验证-https">2.5 验证 HTTPS&lt;/h3>
&lt;p>Caddy 会自动为您的域名获取并安装 SSL 证书。在浏览器中访问 &lt;code>https://example.com&lt;/code>，确认可以通过 HTTPS 访问服务。&lt;/p>
&lt;h2 id="3-注意事项">3 注意事项&lt;/h2>
&lt;p>Caddy 默认会自动处理 HTTPS 证书的获取和续期，简化了 HTTPS 配置过程。&lt;/p></description></item><item><title>解决 Surge 增强模式下 UDP 组播失效的问题</title><link>https://til.niracler.com/post/2025-04-23-fixing-udp-multicast-in-surge-enhanced-mode/</link><pubDate>Wed, 23 Apr 2025 16:15:51 +0800</pubDate><guid>https://til.niracler.com/post/2025-04-23-fixing-udp-multicast-in-surge-enhanced-mode/</guid><description>&lt;h2 id="1-要干什么">1 要干什么&lt;/h2>
&lt;p>今天在 macOS 上使用一个 Node.js 脚本通过 UDP 组播 (Multicast) 发现局域网内的智能网关设备。脚本大致逻辑是向组播地址 &lt;code>239.255.255.250&lt;/code> 的 &lt;code>1900&lt;/code> 端口发送发现指令，并监听本地端口等待设备响应。&lt;/p>
&lt;p>在 Surge 未开启增强模式 (Enhanced Mode) 时，脚本工作正常。但一旦开启增强模式，即使 Surge 规则配置了局域网直连，脚本也无法收到任何设备的响应。同时，开启了 Surge 的 DHCP 功能。&lt;/p>
&lt;h2 id="2-探索过程">2 探索过程&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>初步排查:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>确认 Surge 规则中 &lt;code>FINAL,PROXY&lt;/code> 或类似规则不会拦截局域网通信。&lt;/li>
&lt;li>确认 macOS 防火墙允许 Node.js 或相应端口的入站连接。&lt;/li>
&lt;li>尝试在脚本中将组播地址改为广播地址 (&lt;code>192.168.x.255&lt;/code>)，发现可以工作，这暗示问题与组播的路由方式有关。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>理解 Surge 增强模式:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Surge 的增强模式会在 macOS 中创建一个虚拟网络接口 (TUN)，通常名为 &lt;code>utunX&lt;/code>。&lt;/li>
&lt;li>系统会将默认路由指向这个 TUN 接口，使得&lt;strong>几乎所有&lt;/strong>的网络流量（除少数系统服务或特殊配置外）先经过 Surge 处理，再决定是走代理还是直连。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>分析组播与 TUN 的冲突:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>UDP 组播依赖于网络接口加入特定的组播组 (&lt;code>client.addMembership(multicast_addr)&lt;/code>) 以及从正确的接口发送组播包 (&lt;code>socket.send(..., multicast_addr)&lt;/code>)。&lt;/li>
&lt;li>当增强模式开启时，由于默认路由指向 &lt;code>utunX&lt;/code>，脚本：
&lt;ul>
&lt;li>发送组播包时，系统倾向于通过 &lt;code>utunX&lt;/code> 发送，但 TUN 接口本身通常不适合直接处理物理局域网的组播。&lt;/li>
&lt;li>监听并加入组播组时，可能也是在 &lt;code>utunX&lt;/code> 接口上完成的，导致无法接收到来自物理网卡 (如 &lt;code>en0&lt;/code>) 的组播包。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>简单来说，流量被 Surge “劫持”到了 TUN 接口，但组播这种特殊的局域网通信方式在 TUN 接口上“迷路”了。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="3-解决方案">3 解决方案&lt;/h2>
&lt;p>核心思路是让发往组播地址的流量&lt;strong>绕过 TUN 接口&lt;/strong>，直接通过物理网卡发送和接收。&lt;/p>
&lt;p>在 Surge 的配置文件 &lt;code>config.conf&lt;/code> (或其他你使用的配置文件) 的 &lt;code>[General]&lt;/code> 部分，添加或修改 &lt;code>tun-excluded-routes&lt;/code> 选项，将所有 IP 组播地址范围排除掉：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[General]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># ... 其他通用设置 ...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 添加 224.0.0.0/4 到排除列表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">tun-excluded-routes&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, 224.0.0.0/4&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>解释:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;code>224.0.0.0/4&lt;/code> 这个 CIDR 地址块覆盖了从 &lt;code>224.0.0.0&lt;/code> 到 &lt;code>239.255.255.255&lt;/code> 的所有 IPv4 组播地址范围 (Class D)。&lt;/li>
&lt;li>&lt;code>tun-excluded-routes&lt;/code> 的作用是在系统路由表中添加特定的路由规则，告诉 macOS：凡是目标地址匹配这些网段的数据包，&lt;strong>不要&lt;/strong>发送给 Surge 创建的 TUN 接口，而是根据系统原有的路由规则（通常是直接走物理网卡）处理。&lt;/li>
&lt;li>添加 &lt;code>224.0.0.0/4&lt;/code> 后，当你的脚本向 &lt;code>239.255.255.250&lt;/code> 发送数据时，系统会匹配到这条排除规则，数据包将直接通过物理网卡发出。同样，物理网卡接收到的组播包也能被正确监听。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>操作:&lt;/strong> 修改配置后，在 Surge 菜单中选择「重新载入配置」使设置生效。&lt;/p>
&lt;h2 id="4-最小化测试用例-python">4 最小化测试用例 (Python)&lt;/h2>
&lt;p>可以创建两个简单的 Python 脚本来模拟这个问题和验证解决方案：&lt;/p>
&lt;p>&lt;strong>发送端 (&lt;code>sender.py&lt;/code>):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> socket
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>MULTICAST_GROUP &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;239.255.255.250&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>MULTICAST_PORT &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1900&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>MESSAGE &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">b&lt;/span>&lt;span style="color:#e6db74">&amp;#39;Simple Multicast Test Message&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建 UDP socket&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sock &lt;span style="color:#f92672">=&lt;/span> socket&lt;span style="color:#f92672">.&lt;/span>socket(socket&lt;span style="color:#f92672">.&lt;/span>AF_INET, socket&lt;span style="color:#f92672">.&lt;/span>SOCK_DGRAM, socket&lt;span style="color:#f92672">.&lt;/span>IPPROTO_UDP)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置 TTL (Time-To-Live)，防止包在网络中无限循环&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 1 表示只在本地子网传播&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sock&lt;span style="color:#f92672">.&lt;/span>setsockopt(socket&lt;span style="color:#f92672">.&lt;/span>IPPROTO_IP, socket&lt;span style="color:#f92672">.&lt;/span>IP_MULTICAST_TTL, &lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Sending message to &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>MULTICAST_GROUP&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">:&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>MULTICAST_PORT&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">try&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> &lt;span style="color:#66d9ef">True&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sock&lt;span style="color:#f92672">.&lt;/span>sendto(MESSAGE, (MULTICAST_GROUP, MULTICAST_PORT))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#34;.&amp;#34;&lt;/span>, end&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>, flush&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">True&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> time&lt;span style="color:#f92672">.&lt;/span>sleep(&lt;span style="color:#ae81ff">2&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">except&lt;/span> &lt;span style="color:#a6e22e">KeyboardInterrupt&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">Sender stopped.&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">finally&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sock&lt;span style="color:#f92672">.&lt;/span>close()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>接收端 (&lt;code>receiver.py&lt;/code>):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> socket
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> struct
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>MULTICAST_GROUP &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;239.255.255.250&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>LISTEN_PORT &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1900&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>LISTEN_IP &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;0.0.0.0&amp;#39;&lt;/span> &lt;span style="color:#75715e"># 监听所有接口&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建 UDP socket&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sock &lt;span style="color:#f92672">=&lt;/span> socket&lt;span style="color:#f92672">.&lt;/span>socket(socket&lt;span style="color:#f92672">.&lt;/span>AF_INET, socket&lt;span style="color:#f92672">.&lt;/span>SOCK_DGRAM, socket&lt;span style="color:#f92672">.&lt;/span>IPPROTO_UDP)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 允许端口复用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sock&lt;span style="color:#f92672">.&lt;/span>setsockopt(socket&lt;span style="color:#f92672">.&lt;/span>SOL_SOCKET, socket&lt;span style="color:#f92672">.&lt;/span>SO_REUSEADDR, &lt;span style="color:#ae81ff">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 绑定到监听地址和端口&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sock&lt;span style="color:#f92672">.&lt;/span>bind((LISTEN_IP, LISTEN_PORT))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 告诉内核加入组播组&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># INADDR_ANY 表示使用默认接口，但当 TUN 存在时可能选错&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 如果需要显式指定接口，可以用物理网卡的 IP 替换 INADDR_ANY&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>group &lt;span style="color:#f92672">=&lt;/span> socket&lt;span style="color:#f92672">.&lt;/span>inet_aton(MULTICAST_GROUP)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mreq &lt;span style="color:#f92672">=&lt;/span> struct&lt;span style="color:#f92672">.&lt;/span>pack(&lt;span style="color:#e6db74">&amp;#39;4sL&amp;#39;&lt;/span>, group, socket&lt;span style="color:#f92672">.&lt;/span>INADDR_ANY) &lt;span style="color:#75715e"># Use INADDR_ANY by default&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 或者: mreq = struct.pack(&amp;#39;4s4s&amp;#39;, group, socket.inet_aton(&amp;#39;YOUR_PHYSICAL_IP&amp;#39;))&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sock&lt;span style="color:#f92672">.&lt;/span>setsockopt(socket&lt;span style="color:#f92672">.&lt;/span>IPPROTO_IP, socket&lt;span style="color:#f92672">.&lt;/span>IP_ADD_MEMBERSHIP, mreq)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Listening on &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>LISTEN_IP&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">:&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>LISTEN_PORT&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> for multicast group &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>MULTICAST_GROUP&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">try&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> &lt;span style="color:#66d9ef">True&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> data, addr &lt;span style="color:#f92672">=&lt;/span> sock&lt;span style="color:#f92672">.&lt;/span>recvfrom(&lt;span style="color:#ae81ff">1024&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Received message: &amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>data&lt;span style="color:#f92672">.&lt;/span>decode()&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#39; from &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>addr&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">except&lt;/span> &lt;span style="color:#a6e22e">KeyboardInterrupt&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">Receiver stopped.&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">finally&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 退出组播组&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sock&lt;span style="color:#f92672">.&lt;/span>setsockopt(socket&lt;span style="color:#f92672">.&lt;/span>IPPROTO_IP, socket&lt;span style="color:#f92672">.&lt;/span>IP_DROP_MEMBERSHIP, mreq)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sock&lt;span style="color:#f92672">.&lt;/span>close()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>测试步骤:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>开启 Surge 增强模式，但不加 &lt;code>tun-excluded-routes&lt;/code> 规则:&lt;/strong>
&lt;ul>
&lt;li>在一台电脑上运行 &lt;code>python receiver.py&lt;/code>。&lt;/li>
&lt;li>在同一局域网的&lt;strong>另一台&lt;/strong>电脑 (或本机，如果网络允许) 上运行 &lt;code>python sender.py&lt;/code>。&lt;/li>
&lt;li>预期：接收端&lt;strong>收不到&lt;/strong>消息。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>在 Surge 配置中添加 &lt;code>tun-excluded-routes = ..., 224.0.0.0/4&lt;/code> 并重载:&lt;/strong>
&lt;ul>
&lt;li>保持接收端运行。&lt;/li>
&lt;li>再次运行发送端。&lt;/li>
&lt;li>预期：接收端&lt;strong>能够收到&lt;/strong>发送端的消息。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="5-关键知识点">5 关键知识点&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Surge 增强模式 (TUN):&lt;/strong> 通过创建虚拟网卡拦截和重定向系统流量，实现更底层的代理控制。&lt;/li>
&lt;li>&lt;strong>UDP 组播:&lt;/strong> 一种一对多的网络通信方式，数据包发送到特定的组播地址，只有加入了该组播组的接口才能收到。常用于设备发现、流媒体等。&lt;/li>
&lt;li>&lt;strong>路由:&lt;/strong> 网络数据包根据目标地址选择下一跳和出接口的过程。增强模式会修改默认路由。&lt;/li>
&lt;li>&lt;strong>&lt;code>tun-excluded-routes&lt;/code>:&lt;/strong> Surge 配置项，用于指定哪些目标地址的流量不应被发送到 TUN 接口，从而绕过 Surge 的底层处理，直接按系统原有路由规则转发（通常是物理网卡）。&lt;/li>
&lt;li>&lt;strong>&lt;code>224.0.0.0/4&lt;/code>:&lt;/strong> IPv4 组播地址的标准范围。&lt;/li>
&lt;/ul>
&lt;h2 id="6-总结">6 总结&lt;/h2>
&lt;p>Surge 的增强模式通过 TUN 接口改变了系统的默认路由行为，这可能干扰依赖特定接口或路由方式的协议，如 UDP 组播。通过在 &lt;code>tun-excluded-routes&lt;/code> 中排除组播地址范围 (&lt;code>224.0.0.0/4&lt;/code>)，可以强制组播流量绕过 TUN 接口，恢复其在局域网中的正常通信。&lt;/p></description></item><item><title>四块半榻榻米大小</title><link>https://til.niracler.com/post/2025-04-11-four-and-a-half-tatami/</link><pubDate>Fri, 11 Apr 2025 10:37:19 +0800</pubDate><guid>https://til.niracler.com/post/2025-04-11-four-and-a-half-tatami/</guid><description>&lt;p>昨天在读谷川俊太郎的《一个人生活》，开篇就提到了「四块半榻榻米大小」，这个颇具日本特色的描述引起了我的兴趣。我们常听说日本房间用榻榻米计数，但这「四叠半」究竟是多大，又有什么特别的含义呢？&lt;/p>
&lt;h2 id="什么是四叠半">什么是「四叠半」？&lt;/h2>
&lt;p>「四叠半」（Yojōhan）是日语中描述房间大小的说法，「叠」（Jō）指的就是榻榻米（Tatami），「半」（Han）则是半块。所以，「四叠半」字面意思就是能放下四块标准榻榻米和半块榻榻米的房间。&lt;/p>
&lt;p>榻榻米是日本传统的草编地垫，除了铺设地面，也长期作为计算房间面积的单位。不过，榻榻米的尺寸并非全国统一，根据地区不同有所差异：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;strong>地区&lt;/strong>&lt;/th>
&lt;th>&lt;strong>尺寸 (米)&lt;/strong>&lt;/th>
&lt;th>&lt;strong>面积 (平方米)&lt;/strong>&lt;/th>
&lt;th>&lt;strong>备注&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>京都 (京間, Kyōma)&lt;/td>
&lt;td>1.91 × 0.955&lt;/td>
&lt;td>≈ 1.82&lt;/td>
&lt;td>较长，常见于关西、中国、四国地区的传统建筑&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>名古屋 (中京間, Chūkyōma)&lt;/td>
&lt;td>1.82 × 0.91&lt;/td>
&lt;td>≈ 1.65&lt;/td>
&lt;td>中间尺寸，常用作标准，亦称「三六間」(3×6 尺)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>东京 (江戸間, Edoma)&lt;/td>
&lt;td>1.76 × 0.88&lt;/td>
&lt;td>≈ 1.55&lt;/td>
&lt;td>较小，常见于关东及以北地区，亦称「五八間」(5.8×2.9 尺)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;em>注：尺寸基于传统单位「尺」（shaku），1 尺约 0.303 米。尺寸和面积为近似值。&lt;/em>&lt;/p>
&lt;p>以最常见的名古屋尺寸（中京間）计算，一块榻榻米约 1.65 平方米，那么四叠半的总面积就是 $4.5 \times 1.65 \approx 7.43$ 平方米。如果按东京尺寸（江戸間）算，则是 $4.5 \times 1.55 \approx 6.98$ 平方米。&lt;/p>
&lt;p>所以，「四叠半」大约是一个 7 到 7.5 平方米（约 75-80 平方英尺）见方的空间，常见的布局是中间放半叠，四周环绕四叠，形成约 2.7 米 × 2.7 米的正方形。&lt;/p>
&lt;p>（看到这张图，我就觉得挺有趣的）&lt;br>
&lt;img loading="lazy" src="https://image.niracler.com/2025/04/b172258e0d6dc043bb47d9915de1d545.png">&lt;/p>
&lt;h2 id="文化意义">文化意义&lt;/h2>
&lt;p>在日本，四叠半不仅仅是一个面积单位，更承载着特定的文化含义：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>茶室的标准尺寸&lt;/strong>：根据 &lt;a href="https://en.wikipedia.org/wiki/Tatami">Wikipedia 关于榻榻米的介绍&lt;/a>，四叠半是日本传统茶室（茶室, Chashitsu）的典型规格。这种紧凑的空间被认为有助于集中精神，营造茶道所追求的宁静、亲密和简约的氛围。&lt;/li>
&lt;li>&lt;strong>极简生活与蜗居的象征&lt;/strong>：四叠半也常常象征着极小的居住空间。如 &lt;a href="https://en.namu.wiki/w/%EB%8B%A4%EB%8B%A4%EB%AF%B8%20%EB%84%89%20%EC%9E%A5%20%EB%B0%98">NamuWiki 相关条目&lt;/a> 所述，在 20 世纪 60 年代，经济拮据的年轻人（所谓的「穷青年」）常居住在这种狭小的公寓中，甚至催生了相关的「四叠半民谣」文化，带有一丝清贫或无奈的色彩。日本也有谚语「起き半畳、寝一畳」（醒时半叠，睡时一叠），意指人实际所需空间有限，体现了知足常乐或物尽其用的观念。&lt;/li>
&lt;/ol>
&lt;h2 id="四叠半神话大系">《四叠半神话大系》&lt;/h2>
&lt;p>提到「四叠半」，很多人可能会联想到森见登美彦的小说及其改编的动画《四叠半神话大系》（四畳半神話大系, The Tatami Galaxy）。这部作品以京都大学附近常见的四叠半房间为舞台，讲述了主角在不同平行世界中选择不同社团，经历荒诞青春的故事。标题本身就点明了这种空间在日本文化，尤其是学生生活中的代表性。虽然我还没看过 Dynasty Reader 上的 &lt;a href="https://dynasty-scans.com/chapters/the_legend_of_the_great_four_and_a_half_tatami_room">The Legend of the Great Four-and-a-Half Tatami Room&lt;/a>，但标题也暗示了四叠半这一意象的延伸。&lt;/p>
&lt;p>总而言之，「四叠半」不仅是一个具体的尺寸概念（约 7-7.5 平方米），更是一个蕴含着日本茶道文化、极简主义、乃至一代人生活记忆的文化符号。下次再看到这个词，就能更好地理解其背后的含义了。&lt;/p></description></item><item><title>通过 jq 获取 pinboard 的文章列表, 并转换为 markdown 格式</title><link>https://til.niracler.com/post/2025-03-21-jq-tran-pinboard-to-markdown/</link><pubDate>Fri, 21 Mar 2025 10:41:51 +0800</pubDate><guid>https://til.niracler.com/post/2025-03-21-jq-tran-pinboard-to-markdown/</guid><description>&lt;h2 id="1-要干什么">1 要干什么&lt;/h2>
&lt;p>主要是为了写周记的时候方便，可以直接复制粘贴。&lt;/p>
&lt;h2 id="2-偷工减料版">2 偷工减料版&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>export PINBOARD_TOKEN&lt;span style="color:#f92672">=&lt;/span>your-api-token
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -sS &lt;span style="color:#e6db74">&amp;#34;https://api.pinboard.in/v1/posts/all?format=json&amp;amp;auth_token=&lt;/span>$PINBOARD_TOKEN&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> | jq -r &lt;span style="color:#e6db74">&amp;#39;.[] | &amp;#34;- [\(.description)](\(.href)) - \(.extended)&amp;#34;&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>效果，就是生成像下面这种格式的 markdown 列表&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-md" data-lang="md">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> [&lt;span style="color:#f92672">simonw/til: Today I Learned&lt;/span>](&lt;span style="color:#a6e22e">https://github.com/simonw/til/blob/main/ab/apache-bench-length-errors.md&lt;/span>) - 可以考虑用这种格式来写 TIL, 纯 markdown 就可以了，大块代码以及图片用外面的链接就好。关键是每一个思路要写完整，不要滥竽充数。然后达到一定的
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> [&lt;span style="color:#f92672">Downloading a video should be “fair use” as recording a song from the radio | Hacker News --- 下载视频应该像从广播中录制歌曲一样“合理使用”|黑客新闻&lt;/span>](&lt;span style="color:#a6e22e">https://news.ycombinator.com/item?id=37112615&lt;/span>) - 其实我还是不懂这种下载是违法还是怎么说
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> [&lt;span style="color:#f92672">一个大学老师决定去送外卖&lt;/span>](&lt;span style="color:#a6e22e">https://mp.weixin.qq.com/s/cSL-Inf0QDKOPJd4yzkAGw&lt;/span>) - &amp;lt;&lt;span style="color:#f92672">blockquote&lt;/span>&amp;gt;长年在象牙塔内，他想从封闭、自负和优越感中突围。&amp;lt;/&lt;span style="color:#f92672">blockquote&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> [&lt;span style="color:#f92672">中国的防火长城是如何检测和封锁完全加密流量的&lt;/span>](&lt;span style="color:#a6e22e">https://gfw.report/publications/usenixsecurity23/zh/&lt;/span>) -
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> [&lt;span style="color:#f92672">You’re probably using the wrong dictionary « the jsomers.net blog --- 您可能使用了错误的字典 « jsomers.net 博客&lt;/span>](&lt;span style="color:#a6e22e">https://jsomers.net/blog/dictionary&lt;/span>) - 一个好的词典原来作用可以这么大
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> [&lt;span style="color:#f92672">使用自动化工作流聚合信息摄入和输出 | Reorx’s Forge&lt;/span>](&lt;span style="color:#a6e22e">https://reorx.com/blog/sharing-my-footprints-automation/&lt;/span>) - &amp;lt;&lt;span style="color:#f92672">blockquote&lt;/span>&amp;gt;展示我是如何用 n8n 将 Twitter, YouTube, GitHub, Douban 等服务的动态同步到 Telegram Channel，实现个人数字生活的信息聚合。&amp;lt;/&lt;span style="color:#f92672">blockquote&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> [&lt;span style="color:#f92672">nodebestpractices/README.chinese.md at master · goldbergyoni/nodebestpractices&lt;/span>](&lt;span style="color:#a6e22e">https://github.com/goldbergyoni/nodebestpractices/blob/master/README.chinese.md&lt;/span>) -
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> [&lt;span style="color:#f92672">37%法則 - MBA智库百科&lt;/span>](&lt;span style="color:#a6e22e">https://wiki.mbalib.com/zh-tw/37%25%E6%B3%95%E5%88%99#:~:text=%5B%E7%B7%A8%E8%BC%AF%5D-,%E4%BB%80%E9%BA%BC%E6%98%AF37%25%E6%B3%95%E5%89%87,%E4%B9%9F%E5%B0%B1%E6%98%AF11%E5%80%8B%E6%88%BF%E5%AD%90%E3%80%82&lt;/span>) - &amp;lt;&lt;span style="color:#f92672">blockquote&lt;/span>&amp;gt;37%法則、37%規則37%法則，出自《演算法之美》一書。意思是經過數學家歐拉的實驗，以37%作為分界點，前面的時間用來觀察，後面的時間用來作決策的一種方法。舉例來說，比如要買房子，整個地區的房子有30處，那麼需要先看37%的房子，也就是11個房子。37%前的房子只看不買，但是要記住自己認為最好的是什麼樣子。看完後，從37%以後只有遇到比之前最好的還要好的房子就應該下手買。&amp;lt;/&lt;span style="color:#f92672">blockquote&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> [&lt;span style="color:#f92672">（译）2023 年每个软件开发者都必须知道的关于 Unicode 的基本知识 | 新世界的大门&lt;/span>](&lt;span style="color:#a6e22e">https://blog.xinshijiededa.men/unicode/&lt;/span>) - &amp;lt;&lt;span style="color:#f92672">blockquote&lt;/span>&amp;gt;自从那时以来，Python 已经进步了，CD-ROM 已经过时了，但其余的仍然停留在 UTF-16 或甚至 UCS-2。因此，UTF-16 作为内存表示而存在。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>PS. 注意，国内需要代理才能访问 pinboard.in&lt;/p>
&lt;blockquote>
&lt;p>杂鱼想法: 更好的设计是不是应该就是 ny pinboard export &amp;ndash;md ? 代理、token 什么都自动设好。 pinboard cli （伪）。&lt;/p>
&lt;/blockquote>
&lt;h2 id="3-参考资料">3 参考资料&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://pinboard.in/settings/password">pinboard password&lt;/a> - 这里可以找到 token&lt;/li>
&lt;li>&lt;a href="https://pinboard.in/api">pinboard api&lt;/a> - 还可以加更多一些过滤条件，例如 tag 以及时间&lt;/li>
&lt;li>&lt;a href="https://stedolan.github.io/jq/manual/">jq Manual (development version)&lt;/a> - 这个其实问 gpt 即可，&amp;rsquo; 用 jq 命令去 parse, 格式为每行 &lt;a href="href">description&lt;/a> - extended'&lt;/li>
&lt;/ul></description></item><item><title>为我的博客添加媒体预览和 RSS 支持</title><link>https://til.niracler.com/post/2025-03-20-make-rss-and-media-preview-for-my-blog/</link><pubDate>Thu, 20 Mar 2025 15:52:32 +0800</pubDate><guid>https://til.niracler.com/post/2025-03-20-make-rss-and-media-preview-for-my-blog/</guid><description>&lt;h2 id="1-要干什么">1 要干什么&lt;/h2>
&lt;p>我想为博客增强元数据功能，主要包括两方面：&lt;/p>
&lt;ol>
&lt;li>添加媒体预览功能，使文章在社交平台（如Telegram）上分享时能显示精美的预览图；&lt;/li>
&lt;li>实现RSS订阅功能，方便读者及时获取博客更新。这些改进将提升博客的专业性和用户体验。&lt;/li>
&lt;/ol>
&lt;h2 id="2-开始我们的美化工作吧">2 开始我们的美化工作吧&lt;/h2>
&lt;h3 id="21-设置预览图和摘要">2.1 设置预览图和摘要&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">title&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;OpenWRT 设置启用 IPv6 让子设备能拿到 IPv6 的 公网 IP （原理未明）&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">summary&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;为了可以更方便 Tailscale 穿透。&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">cover&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;https://image.niracler.com/2025/03/5c38aaa0c519bf066184b086c76d5304.png&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其实这里有点小问题，封面在正文里也会显示。与我的初衷不符，不过下次再改吧。&lt;/p>
&lt;p>（效果图什么的）&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/37095dd3c784d5ae7838ae04b1ecce52.png">&lt;/p>
&lt;p>（遗憾的是，Telegram Instant View 要申请好像挺困难的。但整个预览区域是可点击的，直接链接到文章。）&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/5a3cc265aed801fdeffba4966c889e89.png">&lt;/p>
&lt;h3 id="22-添加网站图标favicon">2.2 添加网站图标（Favicon）&lt;/h3>
&lt;p>为博客添加一个网站图标可以提升专业性，并在浏览器标签页中显示您的品牌标识。以下是添加 favicon 的步骤：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>准备图标文件&lt;/strong>：建议使用 &lt;code>.ico&lt;/code> 格式，尺寸为 32×32 或 16×16 像素。也可以使用 PNG 格式。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>添加到静态目录&lt;/strong>：将图标文件放入项目的 &lt;code>static&lt;/code> 文件夹中：&lt;/p>
&lt;ul>
&lt;li>直接放入 &lt;code>favicon.ico&lt;/code> 到 &lt;code>static&lt;/code> 目录&lt;/li>
&lt;li>或创建 &lt;code>static/images&lt;/code> 目录并放入图标文件&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>配置设置&lt;/strong>：在 &lt;code>hugo.toml&lt;/code> 配置文件中添加：&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-toml" data-lang="toml">&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">params&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">favicon&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;img/favicon.png&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 放在 static/img 目录&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以使用在线工具如 &lt;a href="https://favicon.io/">favicon.io&lt;/a> 生成各种尺寸的图标。添加图标后，网站在浏览器标签页中会显示您的品牌标识，让博客更加专业化。&lt;/p>
&lt;p>(效果图)
&lt;img loading="lazy" src="https://image.niracler.com/2025/03/cbd003b59f85210c39ecd48a558ad65b.png">&lt;/p>
&lt;h3 id="22-添加-rss-支持">2.2 添加 RSS 支持&lt;/h3>
&lt;p>&lt;strong>全文 RSS 设置&lt;/strong> : Hugo 默认生成包含摘要的 RSS 提要，但您可以启用全文。在 PaperMod 主题中，可以在 hugo.toml 中添加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-toml" data-lang="toml">&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">params&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">ShowFullTextinRSS&lt;/span> = &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 顺便添加 RSS 图标&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [[&lt;span style="color:#a6e22e">params&lt;/span>.&lt;span style="color:#a6e22e">socialIcons&lt;/span>]]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;rss&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">url&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;index.xml&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 或使用完整链接 &amp;#34;https://til.niracler.com/index.xml&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>(效果图)
&lt;img loading="lazy" src="https://image.niracler.com/2025/03/c58fede292d013e7dc78cb5e9817e333.png">&lt;/p>
&lt;p>然后顺手做个 Follow 认证吧。&lt;/p>
&lt;h3 id="23-添加-rss-feed-描述以验证所有权">2.3 添加 RSS feed 描述以验证所有权&lt;/h3>
&lt;p>要在 RSS feed 中添加特定的描述文本以便在 RSS 阅读器中声明所有权，需要创建自定义的 RSS 模板：&lt;/p>
&lt;p>&lt;strong>创建自定义 RSS 模板&lt;/strong>：在项目根目录创建 &lt;code>layouts/_default/rss.xml&lt;/code> 文件（如果不存在）&lt;/p>
&lt;p>&lt;strong>编辑 RSS 模板&lt;/strong>：将以下内容复制到该文件中（关键是修改 &lt;code>&amp;lt;description&amp;gt;&lt;/code> 标签）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>{{- $pctx := . -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- $pages := slice -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- if or $.IsHome $.IsSection -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- $pages = $pctx.RegularPages -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- else -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- $pages = $pctx.Pages -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- end -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- $limit := .Site.Config.Services.RSS.Limit -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- if ge $limit 1 -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- $pages = $pages | first $limit -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- end -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- printf &amp;#34;&lt;span style="color:#75715e">&amp;lt;?xml version=\&amp;#34;1.0\&amp;#34; encoding=\&amp;#34;utf-8\&amp;#34; standalone=\&amp;#34;yes\&amp;#34;?&amp;gt;&lt;/span>&amp;#34; | safeHTML }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;rss&lt;/span> &lt;span style="color:#a6e22e">version=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;2.0&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">xmlns:atom=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;http://www.w3.org/2005/Atom&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;channel&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;title&amp;gt;&lt;/span>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }}&lt;span style="color:#f92672">&amp;lt;/title&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;link&amp;gt;&lt;/span>{{ .Permalink }}&lt;span style="color:#f92672">&amp;lt;/link&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;follow_challenge&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;feedId&amp;gt;&lt;/span>125502964885313536&lt;span style="color:#f92672">&amp;lt;/feedId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;userId&amp;gt;&lt;/span>41434914948866048&lt;span style="color:#f92672">&amp;lt;/userId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;/follow_challenge&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;description&amp;gt;&lt;/span>Recent content on Niracler&amp;#39;s TIL 每日一学&lt;span style="color:#f92672">&amp;lt;/description&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;generator&amp;gt;&lt;/span>Hugo -- gohugo.io&lt;span style="color:#f92672">&amp;lt;/generator&amp;gt;&lt;/span>{{ with .Site.LanguageCode }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;language&amp;gt;&lt;/span>{{.}}&lt;span style="color:#f92672">&amp;lt;/language&amp;gt;&lt;/span>{{end}}{{ with .Site.Author.email }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;managingEditor&amp;gt;&lt;/span>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}&lt;span style="color:#f92672">&amp;lt;/managingEditor&amp;gt;&lt;/span>{{end}}{{ with .Site.Author.email }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;webMaster&amp;gt;&lt;/span>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}&lt;span style="color:#f92672">&amp;lt;/webMaster&amp;gt;&lt;/span>{{end}}{{ with .Site.Copyright }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;copyright&amp;gt;&lt;/span>{{.}}&lt;span style="color:#f92672">&amp;lt;/copyright&amp;gt;&lt;/span>{{end}}{{ if not .Date.IsZero }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;lastBuildDate&amp;gt;&lt;/span>{{ .Date.Format &amp;#34;Mon, 02 Jan 2006 15:04:05 -0700&amp;#34; | safeHTML }}&lt;span style="color:#f92672">&amp;lt;/lastBuildDate&amp;gt;&lt;/span>{{ end }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {{- with .OutputFormats.Get &amp;#34;RSS&amp;#34; -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {{ printf &amp;#34;&lt;span style="color:#f92672">&amp;lt;atom:link&lt;/span> &lt;span style="color:#a6e22e">href=&lt;/span>&lt;span style="color:#e6db74">%q&lt;/span> &lt;span style="color:#a6e22e">rel=&lt;/span>&lt;span style="color:#e6db74">\&amp;#34;self\&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">type=&lt;/span>&lt;span style="color:#e6db74">%q&lt;/span> &lt;span style="color:#f92672">/&amp;gt;&lt;/span>&amp;#34; .Permalink .MediaType | safeHTML }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {{- end -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {{ range $pages }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;item&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;title&amp;gt;&lt;/span>{{ .Title }}&lt;span style="color:#f92672">&amp;lt;/title&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;link&amp;gt;&lt;/span>{{ .Permalink }}&lt;span style="color:#f92672">&amp;lt;/link&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;pubDate&amp;gt;&lt;/span>{{ .Date.Format &amp;#34;Mon, 02 Jan 2006 15:04:05 -0700&amp;#34; | safeHTML }}&lt;span style="color:#f92672">&amp;lt;/pubDate&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {{ with .Site.Author.email }}&lt;span style="color:#f92672">&amp;lt;author&amp;gt;&lt;/span>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}&lt;span style="color:#f92672">&amp;lt;/author&amp;gt;&lt;/span>{{end}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;guid&amp;gt;&lt;/span>{{ .Permalink }}&lt;span style="color:#f92672">&amp;lt;/guid&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;description&amp;gt;&lt;/span>{{ with .Description }}{{ . }}{{ else }}{{ if .Site.Params.ShowFullTextinRSS }}{{ .Content | html }}{{ else }}{{ .Summary | html }}{{ end }}{{ end }}&lt;span style="color:#f92672">&amp;lt;/description&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;/item&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {{ end }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;/channel&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;/rss&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>重新构建网站部署&lt;/p>
&lt;p>(可以啦)
&lt;img loading="lazy" src="https://image.niracler.com/2025/03/e1ed0212923121b1fd7ea8f60dce7b0a.png">&lt;/p>
&lt;h3 id="关键引文">关键引文&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://dvel.me/posts/hugo-papermod-config/">折腾 Hugo &amp;amp; PaperMod 主题&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>一个纠正我写作表达的 prompt</title><link>https://til.niracler.com/post/2025-03-19-fix-my-write/</link><pubDate>Wed, 19 Mar 2025 19:02:48 +0800</pubDate><guid>https://til.niracler.com/post/2025-03-19-fix-my-write/</guid><description>&lt;h2 id="1-要干什么">1 要干什么&lt;/h2>
&lt;p>整理了一个写作表达用的 prompt ，主要用来矫正我文字表达很啰嗦的问题&lt;/p>
&lt;h2 id="2-内容">2 内容&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>你是我的写作老师，若是我文章中遇到了这些问题，请你帮我纠正:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- **抽象名词的过度使用**：中文不习惯用抽象名词做主词，如「收入减少改变生活方式」，应改为「他因为收入减少而改变生活方式」。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- **冗赘句式**：将简单的表达变得复杂，如「因此」变成「基于这个原因」。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- **成语的衰退**：成语的使用减少，影响了文化意识，如只会说「总的来说」，不会说「总而言之」。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- **动词弱化**：简单动词被抽象名词和泛动词替代，如「贡献」变成「作出贡献」。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- **介词滥用**：如「有关」和「关于」等词的过度使用。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- **连接词的多余**：如「和」、「与」、「及」、「以及」等连接词的过多使用。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- **复数语尾的滥用**：如「人们」取代「人人」、「大家」。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>**改进建议**
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- 避免使用不必要的抽象名词和冗赘句式，保持句子简洁明了。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- 多使用成语，保持文化的传承。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- 简化动词表达，避免使用抽象名词词组。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- 减少介词和连接词的使用，保持句子的流畅和自然。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- 不必要使用复数语尾，以免句子显得繁琐。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>若是还有其余的歧义、错别字什么的也一定要提出来。将修改后的文章发出来并在回复的时候写清楚每一处为什么要这么改。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="3-参考">3 参考&lt;/h2>
&lt;p>-《余光中: 怎样改进英式中文？ &amp;ndash;论中文的常态与变态》 - 找不到原文了（&lt;/p></description></item><item><title>将所有邮箱整合到 Fastmail 并同步到 Apple Mail</title><link>https://til.niracler.com/post/2025-03-18-any-mail-to-fastmail-to-apple-mail/</link><pubDate>Tue, 18 Mar 2025 18:28:47 +0800</pubDate><guid>https://til.niracler.com/post/2025-03-18-any-mail-to-fastmail-to-apple-mail/</guid><description>&lt;h2 id="1-要干什么">1 要干什么&lt;/h2>
&lt;p>我想把任何邮件都转发到 Fastmail 邮箱，然后 Fastmail 转发到 Apple Mail。&lt;/p>
&lt;h2 id="2-从其他邮箱到-fastmail-邮箱">2 从其他邮箱到 fastmail 邮箱&lt;/h2>
&lt;h3 id="21-qq-邮箱邮件迁移并同步到-fastmail">2.1 QQ 邮箱邮件迁移并同步到 Fastmail&lt;/h3>
&lt;p>在 QQ 邮箱中启用IMAP服务是同步的前提条件。操作步骤如下：&lt;/p>
&lt;ol>
&lt;li>登录QQ邮箱，进入设置-帐户&lt;/li>
&lt;li>勾选&amp;quot;开启IMAP服务&amp;quot;&lt;/li>
&lt;li>生成授权码（POP3/IMAP/SMTP服务项）&lt;/li>
&lt;/ol>
&lt;p>（中间会有几次发送短信的流程）
&lt;img loading="lazy" src="https://image.niracler.com/2025/03/b4c7c2db6e596c0d226047fd4ed69463.png">&lt;/p>
&lt;p>然后来到 Fastmail，在 My email address 中点击 Add address&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/865465ea940fd8ef4c548ca687fe0de3.png">&lt;/p>
&lt;p>其实我们要做的是 Migrate an address。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/6cde11ebd882703e724b50a2a214746c.png">&lt;/p>
&lt;p>然后我们选到 Other（同时我们可以看到 Gmail 那种要同步的话，是超级简单的）&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/b4f0dd24c2d939e430ee8a1714fcab6a.png">&lt;/p>
&lt;p>就是填上面拿到的授权码，不是你登陆邮箱的密码。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/500661f8413768405f4b4c78212a3982.png">&lt;/p>
&lt;p>那我们来开导吧～～&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/24e39ce4971b5d3637da4ad8202b8af2.png">&lt;/p>
&lt;p>也算是将各种乱七八糟的邮箱迁移到 Fastmail 了。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/2d30cccefd14e62c7fd6be42c91c8df5.png">&lt;/p>
&lt;h3 id="3-apple-mail-的-fastmail-配置">3 Apple Mail 的 Fastmail 配置&lt;/h3>
&lt;p>在 Apple Mail 中，添加账户，然后选择其他账户，然后选择 Fastmail。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/2fdfd38527340c1e281199116f141918.png">&lt;/p>
&lt;p>然后在 Fastmail 中的 Privacy &amp;amp; security -&amp;gt; Connected apps &amp;amp; API tokens 点击 Manage app passwords and access&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/a679b5b497a6579254659fa134977a03.png">&lt;/p>
&lt;p>我们 new 一个 password&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/ff1efb97e46e714d566fef56ccc72ba7.png">&lt;/p>
&lt;p>然后再回到 Apple Mail 中，填入刚才的 password 就可以了。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/90816d70068cb7048e9077a4fbadce21.png">&lt;/p>
&lt;h2 id="4-总结">4 总结&lt;/h2>
&lt;p>大功告成！&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/40cc47308bdf5fa56bfc6d033aac0d5d.png">&lt;/p></description></item><item><title>OpenWRT 设置启用 IPv6 让子设备能拿到 IPv6 的 公网 IP （原理未明）</title><link>https://til.niracler.com/post/2025-03-14-openwrt-ipv6/</link><pubDate>Fri, 14 Mar 2025 14:00:00 +0800</pubDate><guid>https://til.niracler.com/post/2025-03-14-openwrt-ipv6/</guid><description>&lt;h2 id="1-要干什么">1 要干什么&lt;/h2>
&lt;p>我想给我宿舍的 window 配置好公网的 IPv6 然后方便可以使用 tailscale 进行穿透。&lt;/p>
&lt;h2 id="2-关键要点未经校对">2 关键要点（未经校对）&lt;/h2>
&lt;ul>
&lt;li>研究表明，配置 OpenWrt 的 IPv6 需要通过 WAN6 接口使用 DHCPv6 从 ISP 获取前缀。&lt;/li>
&lt;li>证据倾向于 LAN 接口设置 ip6assign 64，以分配 /64 前缀给子设备，方便它们通过 SLAAC 或 DHCPv6 获取地址。&lt;/li>
&lt;li>防火墙配置需要允许 LAN 到 WAN6 的流量转发，可能涉及额外的安全考虑。&lt;/li>
&lt;li>测试连通性可使用 &lt;a href="https://test-ipv6.com">test-ipv6.com&lt;/a> 确保子设备能访问 IPv6 站点。&lt;/li>
&lt;/ul>
&lt;h2 id="3-配置步骤">3 配置步骤&lt;/h2>
&lt;p>注意：以下的配置文件修改改的都是 &lt;code>/etc/config/network&lt;/code> 这个文件。&lt;/p>
&lt;h3 id="31-确认-isp-支持和接口名称">3.1 确认 ISP 支持和接口名称&lt;/h3>
&lt;p>首先，确保你的 ISP 提供 IPv6 支持，并确定 OpenWrt 中的 WAN 和 LAN 接口名称。通常为 &amp;lsquo;wan&amp;rsquo; 和 &amp;rsquo;lan&amp;rsquo;，可通过查看 &lt;code>/etc/config/network&lt;/code> 确认。&lt;/p>
&lt;h3 id="32-配置-wan-接口ipv4">3.2 配置 WAN 接口（IPv4）&lt;/h3>
&lt;p>确保 WAN 接口已正确配置 IPv4（如 DHCP 或静态 IP）。示例配置（DHCP）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>config interface &amp;#39;wan&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option device &amp;#39;eth0&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option proto &amp;#39;dhcp&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 ISP 使用 PPPoE，需相应调整。&lt;/p>
&lt;h3 id="33-配置-wan6-接口ipv6">3.3 配置 WAN6 接口（IPv6）&lt;/h3>
&lt;p>创建或配置 WAN6 接口，使用 dhcpv6 协议从 ISP 获取 IPv6 前缀。示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>config interface &amp;#39;wan6&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option device &amp;#39;eth0&amp;#39; # 与 WAN 接口相同
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option proto &amp;#39;dhcpv6&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="34-配置-lan-接口ipv6">3.4 配置 LAN 接口（IPv6）&lt;/h3>
&lt;p>将 LAN 接口设置为桥接模式，协议为静态，并设置 ip6assign 64 以分配 /64 前缀。示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>config interface &amp;#39;lan&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option type &amp;#39;bridge&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option ifname &amp;#39;eth1&amp;#39; # 替换为实际 LAN 接口名称
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option proto &amp;#39;static&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option ipaddr &amp;#39;192.168.2.1&amp;#39; # IPv4 地址（可选）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option netmask &amp;#39;255.255.255.0&amp;#39; # IPv4 子网掩码（可选）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option ip6assign &amp;#39;64&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="35-配置-dhcp-服务器ipv6">3.5 配置 DHCP 服务器（IPv6）&lt;/h3>
&lt;p>确保 DHCP 服务器为 LAN 接口提供路由器广告（RA）和/或 DHCPv6 服务。示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>config dhcp &amp;#39;lan&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option interface &amp;#39;lan&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option dhcpv6 &amp;#39;server&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option ra &amp;#39;server&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="36-配置防火墙ipv6">3.6 配置防火墙（IPv6）&lt;/h3>
&lt;p>为 WAN6 接口创建单独的防火墙区域，并允许从 LAN 到 WAN6 的流量转发。示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>config zone
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option name &amp;#39;wan6&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option network &amp;#39;wan6&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option family &amp;#39;ipv6&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option input &amp;#39;ACCEPT&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option output &amp;#39;ACCEPT&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option forward &amp;#39;REJECT&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config forwarding
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option dest &amp;#39;wan6&amp;#39;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option src &amp;#39;lan&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="37-应用更改">3.7 应用更改&lt;/h3>
&lt;p>保存配置并重启网络和防火墙服务：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>uci commit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>service network restart
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>service firewall restart
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="38-最终结果">3.8 最终结果&lt;/h3>
&lt;p>这是我最后得到的 &lt;code>/etc/config/network&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$cat /etc/config/network
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config interface &lt;span style="color:#e6db74">&amp;#39;loopback&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option device &lt;span style="color:#e6db74">&amp;#39;lo&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option proto &lt;span style="color:#e6db74">&amp;#39;static&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option ipaddr &lt;span style="color:#e6db74">&amp;#39;127.0.0.1&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option netmask &lt;span style="color:#e6db74">&amp;#39;255.0.0.0&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config globals &lt;span style="color:#e6db74">&amp;#39;globals&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option ula_prefix &lt;span style="color:#e6db74">&amp;#39;fdd4:40f1:2b71::/48&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config device
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option name &lt;span style="color:#e6db74">&amp;#39;br-lan&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option type &lt;span style="color:#e6db74">&amp;#39;bridge&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> list ports &lt;span style="color:#e6db74">&amp;#39;eth0&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config interface &lt;span style="color:#e6db74">&amp;#39;lan&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option type &lt;span style="color:#e6db74">&amp;#39;bridge&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option ifname &lt;span style="color:#e6db74">&amp;#39;eth0&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option proto &lt;span style="color:#e6db74">&amp;#39;static&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option ipaddr &lt;span style="color:#e6db74">&amp;#39;192.168.2.1&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option netmask &lt;span style="color:#e6db74">&amp;#39;255.255.255.0&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option ip6assign &lt;span style="color:#e6db74">&amp;#39;64&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option interface &lt;span style="color:#e6db74">&amp;#39;lan&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option dhcpv6 &lt;span style="color:#e6db74">&amp;#39;server&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option ra &lt;span style="color:#e6db74">&amp;#39;server&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config zone
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option name &lt;span style="color:#e6db74">&amp;#39;wan6&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option network &lt;span style="color:#e6db74">&amp;#39;wan6&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option family &lt;span style="color:#e6db74">&amp;#39;ipv6&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option input &lt;span style="color:#e6db74">&amp;#39;ACCEPT&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option output &lt;span style="color:#e6db74">&amp;#39;ACCEPT&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option forward &lt;span style="color:#e6db74">&amp;#39;REJECT&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config forwarding
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option dest &lt;span style="color:#e6db74">&amp;#39;wan6&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option src &lt;span style="color:#e6db74">&amp;#39;lan&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config interface &lt;span style="color:#e6db74">&amp;#39;wan&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option device &lt;span style="color:#e6db74">&amp;#39;eth1&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option proto &lt;span style="color:#e6db74">&amp;#39;dhcp&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>config interface &lt;span style="color:#e6db74">&amp;#39;wan6&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option device &lt;span style="color:#e6db74">&amp;#39;eth1&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> option proto &lt;span style="color:#e6db74">&amp;#39;dhcpv6&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="4-测试和验证">4 测试和验证&lt;/h2>
&lt;p>从路由器 ping IPv6 地址测试连通性，例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ ping6 2001:4860:4860::8888
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>PING 2001:4860:4860::8888 &lt;span style="color:#f92672">(&lt;/span>2001:4860:4860::8888&lt;span style="color:#f92672">)&lt;/span>: &lt;span style="color:#ae81ff">56&lt;/span> data bytes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">64&lt;/span> bytes from 2001:4860:4860::8888: seq&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span> ttl&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">54&lt;/span> time&lt;span style="color:#f92672">=&lt;/span>21.947 ms
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">64&lt;/span> bytes from 2001:4860:4860::8888: seq&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> ttl&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">54&lt;/span> time&lt;span style="color:#f92672">=&lt;/span>21.384 ms
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">64&lt;/span> bytes from 2001:4860:4860::8888: seq&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span> ttl&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">54&lt;/span> time&lt;span style="color:#f92672">=&lt;/span>22.012 ms
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">64&lt;/span> bytes from 2001:4860:4860::8888: seq&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">3&lt;/span> ttl&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">54&lt;/span> time&lt;span style="color:#f92672">=&lt;/span>21.772 ms
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>^C
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>--- 2001:4860:4860::8888 ping statistics ---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">4&lt;/span> packets transmitted, &lt;span style="color:#ae81ff">4&lt;/span> packets received, 0% packet loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>round-trip min/avg/max &lt;span style="color:#f92672">=&lt;/span> 21.384/21.778/22.012 ms
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从子设备进行相同测试，确保能访问 IPv6 站点。使用 &lt;a href="https://test-ipv6.com">test-ipv6.com&lt;/a> 验证 IPv6 连通性。&lt;/p>
&lt;p>(虽然说感觉有什么问题，但大体上是可以的)
&lt;img loading="lazy" src="https://image.niracler.com/2025/03/5c38aaa0c519bf066184b086c76d5304.png">&lt;/p>
&lt;p>到此，我 windows 设备使用 &lt;code>tailscale netcheck&lt;/code> 能拿到公网 IPv6 了。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/6b6464bf6599c8edf0a3b32d7ac286c0.png">&lt;/p>
&lt;h2 id="5-关键引文未经校对">5 关键引文（未经校对）&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://openwrt.org/docs/guide-user/network/ipv6/config">OpenWrt Wiki IPv6 configuration about 10 words&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://openwrt.org/docs/guide-user/firewall/fw3_configurations/fw3_ipv6_examples">OpenWrt Wiki IPv6 firewall examples about 10 words&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://ncrmnt.org/2018/11/25/simple-ipv6-setup-with-openwrt/">Simple IPv6 setup with OpenWRT Necromancer&amp;rsquo;s notes about 10 words&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.onemarcfifty.com/blog/video/IPv6_with_OpenWrt/">IPv6 with OpenWrt onemarcfifty video guide about 10 words&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://test-ipv6.com">IPv6 connectivity test website about 10 words&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>从零开始使用 Hugo 在 Cloudflare Pages 上搭建 TIL 博客</title><link>https://til.niracler.com/post/2025-03-13-build-til-blog-by-hugo/</link><pubDate>Thu, 13 Mar 2025 14:00:00 +0800</pubDate><guid>https://til.niracler.com/post/2025-03-13-build-til-blog-by-hugo/</guid><description>&lt;h2 id="1-要干什么">1 要干什么&lt;/h2>
&lt;p>本文提供了一个全面的指南，帮助开发者在 Cloudflare Pages 上使用 Hugo 构建一个 TIL（Today I Learned）博客，用于记录和发布每天学到的内容。以下是详细步骤，适合 Hugo 新手但有一定技术背景的用户。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">第一作者&lt;/td>
&lt;td style="text-align:left">Grok DeepSearch&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">校对&amp;amp;编辑&lt;/td>
&lt;td style="text-align:left">Niracler&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">排版&lt;/td>
&lt;td style="text-align:left">claude-3.7-sonnet-thinking&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Hugo 版本&lt;/td>
&lt;td style="text-align:left">v0.145.0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;details> &lt;summary>Prompt&lt;/summary>
&lt;h3 id="11-prompt此处应折叠">1.1 Prompt（此处应折叠）&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-markdown" data-lang="markdown">&lt;span style="display:flex;">&lt;span>我是一个开发者，之前使用过 Hexo 搭建博客系统，但现在想尝试在 Cloudflare Pages 上使用 Hugo 静态网站框架搭建一个 TIL（Today I Learned）博客，用来记录和发布我每天学到的东西。我对 Hugo 是新手，但有一定的技术背景。我希望这个博客有以下特点：
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">1.&lt;/span> &lt;span style="font-weight:bold">**主题要求**&lt;/span>：
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-&lt;/span> 功能完整且足够多（支持标签、分类、搜索功能等）。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-&lt;/span> 加载速度快，轻量级。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-&lt;/span> 设计风格可爱一些。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">2.&lt;/span> &lt;span style="font-weight:bold">**GitHub 仓库**&lt;/span>：
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-&lt;/span> 我需要从头开始创建一个 GitHub 仓库，并连接到 Cloudflare Pages 进行自动部署。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">3.&lt;/span> &lt;span style="font-weight:bold">**内容结构**&lt;/span>：
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-&lt;/span> 完全从零开始的 TIL 记录。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-&lt;/span> 按日期排序，并支持标签（tag）功能。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">4.&lt;/span> &lt;span style="font-weight:bold">**额外功能**&lt;/span>：
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-&lt;/span> 评论系统。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-&lt;/span> 访问统计。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">-&lt;/span> 社交分享按钮。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>请提供一个详细的指南，包括以下内容：
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> 如何安装和配置 Hugo。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> 推荐一个符合我要求的 Hugo 主题，并说明如何安装和配置。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> 如何创建 GitHub 仓库并连接到 Cloudflare Pages。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> 如何编写和发布 TIL 条目。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> 如何添加评论系统、访问统计和社交分享按钮等额外功能。
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>请确保指南适合 Hugo 新手，并提供详细的命令和步骤。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/details>
&lt;p>PS. 本文也是计划中的一环&lt;/p>
&lt;h2 id="2-从零到一的步骤">2 从零到一的步骤&lt;/h2>
&lt;p>咱们就一步一步开始吧～&lt;/p>
&lt;h3 id="21-安装和配置-hugo">2.1 安装和配置 Hugo&lt;/h3>
&lt;p>Hugo 是一个基于 Go 语言的静态网站生成器，以其速度和简单性著称，适合技术背景的用户快速上手。安装方法因操作系统而异：&lt;/p>
&lt;p>&lt;strong>macOS&lt;/strong>：推荐使用 Homebrew，运行以下命令：（其他系统，请上网查）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>brew install hugo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>安装完成后，创建新站点以开始构建博客：&lt;/p>
&lt;ul>
&lt;li>运行 &lt;code>hugo new site til&lt;/code>，这会在当前目录下生成一个名为 &lt;code>til&lt;/code> 的文件夹，包含 Hugo 的基本目录结构。&lt;/li>
&lt;li>进入站点目录：&lt;code>cd til&lt;/code>。&lt;/li>
&lt;li>初始化 Git：&lt;code>git init&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="22-选择并安装-papermod-主题">2.2 选择并安装 PaperMod 主题&lt;/h3>
&lt;blockquote>
&lt;p>主题是博客外观和功能的核心，根据你的需求（支持标签、分类、搜索，加载快，设计可爱），我们推荐使用 PaperMod 主题。它是免费的，功能丰富，设计简洁，可能符合你对“可爱”风格的期待。&lt;/p>
&lt;/blockquote>
&lt;p>添加 PaperMod 主题：(PaperMod 托管在 GitHub 上，通过 Git 子模块添加)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git submodule add https://github.com/adityatelange/hugo-PaperMod themes/PaperMod
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>配置主题：在 Hugo 的配置文件中设置主题。Hugo 支持 YAML、TOML 或 JSON 格式，推荐使用 YAML 或 TOML。如果使用 &lt;code>hugo.toml&lt;/code>，添加：(这个是自动生成的，并且趁着这个时候我们将 &lt;code>hugo.yml&lt;/code> 的信息填对)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-toml" data-lang="toml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">baseURL&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;https://til.niracler.com/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">languageCode&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;zh-cn&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">title&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;每日一学 TIL&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">theme&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;PaperMod&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">params&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#a6e22e">params&lt;/span>.&lt;span style="color:#a6e22e">homeInfoParams&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Title&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;欢迎来到我的 TIL 博客&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Content&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;这里记录了我每天学习的新知识，欢迎探索！&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [[&lt;span style="color:#a6e22e">params&lt;/span>.&lt;span style="color:#a6e22e">socialIcons&lt;/span>]]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;github&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">url&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;https://github.com/niracler&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>主题配置：PaperMod 有多种自定义选项，如支持深色/浅色模式、多语言、社交图标等。详细配置请参考 &lt;a href="https://github.com/adityatelange/hugo-PaperMod/wiki">PaperMod 文档&lt;/a>，包括如何启用搜索功能（通常通过 Lunr.js 或 Fuse.js 实现）。（&lt;strong>这里没有校对&lt;/strong>）&lt;/p>
&lt;h3 id="23-编写和发布-til-条目">2.3 编写和发布 TIL 条目&lt;/h3>
&lt;p>TIL 博客的内容完全从零开始，按日期排序，并支持标签功能。Hugo 使用 Markdown 文件管理内容，存储在 &lt;code>content&lt;/code> 目录下。&lt;/p>
&lt;p>&lt;strong>创建新帖子&lt;/strong>： 使用 Hugo 的 &lt;code>new&lt;/code> 命令创建帖子 (这会在 &lt;code>content/post&lt;/code> 目录下生成一个 Markdown 文件，文件名以日期开头，便于按日期排序)。如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hugo new post/2025-03-13-build-til-blog-by-hugo.md
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>编辑内容&lt;/strong>： 打开生成的 Markdown 文件，顶部是前置元数据（front matter），用于定义帖子属性。例如：(就是我当前这篇文章了，呵呵)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-markdown" data-lang="markdown">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title: &amp;#34;从零开始使用 Hugo 搭建 TIL 博客&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>date: 2025-03-13T14:00:00+08:00
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tags: [&amp;#34;til&amp;#34;, &amp;#34;hugo&amp;#34;]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>title&lt;/code>：帖子标题。&lt;/li>
&lt;li>&lt;code>date&lt;/code>：发布日期，建议使用当前日期，如 2025-03-12。&lt;/li>
&lt;li>&lt;code>tags&lt;/code>：标签列表，支持多个标签，PaperMod 会自动生成标签页面。&lt;/li>
&lt;/ul>
&lt;p>内容部分写在 &lt;code>---&lt;/code> 之后，使用 Markdown 语法。&lt;/p>
&lt;p>&lt;strong>本地预览&lt;/strong>： 运行 &lt;code>hugo server&lt;/code> 查看本地预览，访问 &lt;code>localhost:1313&lt;/code> 查看效果。按 Ctrl+C 停止服务器。&lt;/p>
&lt;p>&lt;img alt="CleanShot 2025-03-13 at 15.36.10@2x.png" loading="lazy" src="https://image.niracler.com/2025/03/b5483be5d1eadefc27420df489b3503d.png">&lt;/p>
&lt;p>&lt;strong>构建和部署&lt;/strong>： 运行 &lt;code>hugo&lt;/code> 构建站点，生成静态文件到 &lt;code>public&lt;/code> 目录。 提交并推送更改：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git add .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit -m &lt;span style="color:#e6db74">&amp;#34;Added new TIL post&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="24-创建-github-仓库并连接-cloudflare-pages">2.4 创建 GitHub 仓库并连接 Cloudflare Pages&lt;/h3>
&lt;p>为了实现自动部署，需要将博客项目托管在 GitHub 上，并连接到 Cloudflare Pages。&lt;/p>
&lt;p>&lt;strong>创建 GitHub 仓库&lt;/strong>： 登录 GitHub，创建一个新仓库，例如 &lt;code>niracler/til&lt;/code>，保持仓库为空。&lt;/p>
&lt;p>添加远程仓库（替换 &lt;code>niracler&lt;/code> 为你的 GitHub 用户名）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git remote add origin https://github.com/niracler/til
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>提交初始文件并推送：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git add .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit -m &lt;span style="color:#e6db74">&amp;#34;Initial commit&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push -u origin main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>连接 Cloudflare Pages&lt;/strong>： 注册 Cloudflare 账户（如果没有），进入 Pages 仪表板，点击“Create a project”。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/cc12e758a22690d8f6a87a0003d1462d.png">&lt;/p>
&lt;p>选择“Connect to Git”&lt;/p>
&lt;p>&lt;img alt="CleanShot 2025-03-13 at 15.47.48@2x.png" loading="lazy" src="https://image.niracler.com/2025/03/cfb87ed86ae3452296f31fb741690a1b.png">&lt;/p>
&lt;p>选择 GitHub 提供商并授权，找到你的仓库。&lt;/p>
&lt;p>&lt;img alt="CleanShot 2025-03-13 at 15.50.16@2x.png" loading="lazy" src="https://image.niracler.com/2025/03/ac22484d0cb41b63fe9e76bc99c4523f.png">&lt;/p>
&lt;p>设置生产分支为 “main”（或你使用的分支）。并配置构建设置，构建命令 &lt;code>hugo --minify&lt;/code> 输出目录 &lt;code>public&lt;/code>， 以及最好设置一下 hugo 的版本 &lt;code>HUGO_VERSION&lt;/code>, 我写这篇文章的时候最新的是 &lt;code>0.126.1&lt;/code>&lt;/p>
&lt;p>&lt;img alt="image.png" loading="lazy" src="https://image.niracler.com/2025/03/872cebd57d2bc4dfcc7c0fc5e9d40968.png">&lt;/p>
&lt;p>保存后，Cloudflare Pages 会自动从 GitHub 拉取代码并部署。每次推送代码都会触发自动构建和部署。更多细节见 &lt;a href="https://developers.cloudflare.com/pages/framework-guides/hugo/">Cloudflare Pages Hugo 文档&lt;/a>。&lt;/p>
&lt;p>（完成部署啦，可喜可贺）&lt;br>
&lt;img alt="CleanShot 2025-03-13 at 16.03.23@2x.png" loading="lazy" src="https://image.niracler.com/2025/03/01d4484fcf47bc75f3ebfb99d7cadd79.png">&lt;/p>
&lt;h3 id="25-设置自定义域名">2.5 设置自定义域名&lt;/h3>
&lt;p>因为上面我设了 &lt;code>baseURL = &amp;quot;https://til.niracler.com/&amp;quot;&lt;/code>，所以我的博客地址是 &lt;code>https://til.niracler.com/&lt;/code>，此时需要设置自定义域名。（因为我的域名是托管在 cloudflare 上的，所以直接就用了）&lt;/p>
&lt;p>访问 Cloudflare 仪表板，导航至 &amp;ldquo;Workers &amp;amp; Pages&amp;rdquo;，选择您的 Pages 项目。进入 &amp;ldquo;Custom domains&amp;rdquo; 部分。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/c5ec3eeee275cb432a384b9af5c917a1.png">&lt;/p>
&lt;p>点击 &amp;ldquo;Set up a custom domain&amp;rdquo;，输入 &amp;ldquo;til.niracler.com&amp;rdquo;，然后选择 &amp;ldquo;Continue&amp;rdquo;。 Cloudflare 将提供后续指导，具体取决于域名类型（顶域或子域）。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/c5ec3eeee275cb432a384b9af5c917a1.png">&lt;/p>
&lt;p>好啦，大功告成。请点击：&lt;a href="https://til.niracler.com/">https://til.niracler.com/&lt;/a> 查看效果。（丑爆了，留给未来的自己改吧。）&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://image.niracler.com/2025/03/e3c2172a09cef870a131c154a70b642a.png">&lt;/p>
&lt;h2 id="3-one-more-thing">3 One More Thing&lt;/h2>
&lt;h3 id="31-将-public-目录放到-gitignore">3.1 将 &lt;code>public&lt;/code> 目录放到 &lt;code>gitignore&lt;/code>&lt;/h3>
&lt;p>其实我们是不需要将 public 目录上传上去的。&lt;/p>
&lt;ul>
&lt;li>对于使用 Hugo 和 Cloudflare Pages 的博客，&lt;strong>不建议将 &lt;code>public&lt;/code> 文件夹上传到 GitHub 仓库&lt;/strong>。&lt;/li>
&lt;li>&lt;code>public&lt;/code> 文件夹是 Hugo 构建生成的静态文件，Cloudflare Pages 会在部署时自动运行 &lt;code>hugo --minify&lt;/code> 生成这些文件，因此无需手动上传。&lt;/li>
&lt;li>只需上传源文件（包括 &lt;code>content&lt;/code>、&lt;code>themes&lt;/code>、&lt;code>hugo.toml&lt;/code> 等），保持仓库轻量并避免冗余。&lt;/li>
&lt;/ul>
&lt;p>为了确保 &lt;code>public&lt;/code> 文件夹不会意外上传到 GitHub，建议在项目根目录创建或编辑 &lt;code>.gitignore&lt;/code> 文件，添加以下内容，这会忽略 &lt;code>public&lt;/code> 文件夹及其所有内容：（上面流程下来，应该是没有这个文件，不过 anyway，我们使用追加的方式。）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;\npublic/&amp;#34;&lt;/span> &amp;gt;&amp;gt; .gitignore
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果您之前已将 &lt;code>public&lt;/code> 上传到仓库，可以运行以下命令清理：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git rm -r --cached public
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git add .gitignore
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit -m &lt;span style="color:#e6db74">&amp;#34;Removed public folder and added .gitignore&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>验证方法&lt;/p>
&lt;ul>
&lt;li>检查当前仓库：访问 &lt;code>https://github.com/niracler/til&lt;/code>，确认 &lt;code>public/&lt;/code> 是否已上传。&lt;/li>
&lt;li>如果已上传，建议删除（参考 &lt;code>.gitignore&lt;/code> 清理步骤）。&lt;/li>
&lt;li>查看 Cloudflare Pages 部署日志，确保构建命令 &lt;code>hugo --minify&lt;/code> 正常运行并生成 &lt;code>public/&lt;/code>。&lt;/li>
&lt;/ul>
&lt;h3 id="32-本地与部署的工作流程">3.2 本地与部署的工作流程&lt;/h3>
&lt;h4 id="321-本地开发">3.2.1 本地开发&lt;/h4>
&lt;ul>
&lt;li>编辑文章（&lt;code>content/post/&lt;/code>）和配置文件（&lt;code>hugo.toml&lt;/code>）。&lt;/li>
&lt;li>运行 &lt;code>hugo server&lt;/code> 本地预览，Hugo 会生成 &lt;code>public/&lt;/code> 文件夹供测试。&lt;/li>
&lt;li>测试完成后，无需保留 &lt;code>public/&lt;/code>，它会在下次构建时重新生成。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>推送到 GitHub&lt;/strong>，提交并推送源文件：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git add .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit -m &lt;span style="color:#e6db74">&amp;#34;Updated TIL post&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="322-cloudflare-pages-部署">3.2.2 Cloudflare Pages 部署&lt;/h4>
&lt;ul>
&lt;li>Cloudflare Pages 检测到推送后，运行 &lt;code>hugo --minify&lt;/code>，生成 &lt;code>public/&lt;/code> 文件并部署。&lt;/li>
&lt;li>您无需手动干预 &lt;code>public/&lt;/code> 的内容。&lt;/li>
&lt;/ul>
&lt;h3 id="33-添加额外功能">3.3 添加额外功能&lt;/h3>
&lt;p>你希望博客有评论系统、访问统计和社交分享按钮，以下是实现方法：
（略，差不多得了，下篇再写）&lt;/p>
&lt;h2 id="4-参考资料">4 参考资料&lt;/h2>
&lt;p>关键文档&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://gohugo.io/getting-started/installing/">Hugo 官网安装指南&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/adityatelange/hugo-PaperMod">PaperMod GitHub 仓库&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://developers.cloudflare.com/pages/framework-guides/hugo/">Cloudflare Pages Hugo 框架指南&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://grok.com/share/bGVnYWN5_05b6e35e-a110-47ef-9ef9-b271333f1cec">Hugo TIL 博客搭建指南 | Shared Grok Conversation&lt;/a> - 与 Grok 的完全对话记录&lt;/li>
&lt;/ul>
&lt;p>资源和进一步学习&lt;/p>
&lt;ul>
&lt;li>官方 Hugo 文档：&lt;a href="https://gohugo.io/">Hugo 官网&lt;/a>，提供详细教程和 API 参考。&lt;/li>
&lt;li>PaperMod 社区支持：查看 GitHub 讨论区，获取用户经验分享。&lt;/li>
&lt;li>Cloudflare Pages 论坛：解决部署问题，优化性能。&lt;/li>
&lt;/ul></description></item><item><title>关于我和这个博客</title><link>https://til.niracler.com/about/</link><pubDate>Thu, 14 Mar 2024 00:00:00 +0000</pubDate><guid>https://til.niracler.com/about/</guid><description>&lt;h2 id="关于这个博客">关于这个博客&lt;/h2>
&lt;p>&amp;ldquo;每日一学&amp;rdquo;（Today I Learned，简称 TIL）是我记录日常学习和探索的地方。这个博客的灵感来源于 &lt;a href="https://github.com/simonw/til">simonw/til&lt;/a> 和 &lt;a href="https://github.com/jbranchaud/til">jbranchaud/til&lt;/a>，旨在分享我每天学到的新知识、技巧和见解。&lt;/p>
&lt;h2 id="til-与普通博客的区别">TIL 与普通博客的区别&lt;/h2>
&lt;p>TIL（Today I Learned）是一种特定题材的博客，专注于记录作者每天或近期学到的具体知识点。它与普通博客有以下几个明显区别：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>非常具体的场景&lt;/strong>：大多是特定场景特定环境下的解决方案。例如 Hugo + Mac + Cloudflare Page + GitHub，这一般不是其中一个平台的文档可以说清楚的，而且也与各个软件的版本有关。也是因此时效性、不通用性会比较高。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>原创性低&lt;/strong>：我打算后续很多 TIL 文章都是基于大模型的输出结果校对而写出来的。既然定位如此，也是某种程度上解决了，「既然别人都写过了，并且写的比我更好，我为啥要写」的那种心态。所以心理负担以及写作压力没这么强，同时也可以练习技术写作。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>篇幅短，更新频率高&lt;/strong>：例如「我今天学到了在马桶上厕所，需要先垫一块纸巾，然后就不怕溅水了」这种也可以写一篇 TIL。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>用作记录使用&lt;/strong>：也是在很多情况下，经常会有那种「我当时是怎么做的」的那种情况，然后再上网找一次之前的教程，然后再踩一次之前踩过的坑。写下来就能避免这个事情了。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="我为什么想弄个-til-博客">我为什么想弄个 TIL 博客&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>记录学习笔记（根本原因）&lt;/strong>：最近工作上会经常学到各种各样的知识，想用来做简单的笔记。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>直接原因&lt;/strong>：我想弄一个自己从零搭建的新博客了。（才不是因为 xlog 比较卡）&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>TG 不适合&lt;/strong>：我也想过在 Telegram 上写这个 TIL 的，不过这里不适合贴任何代码，甚至不适合写任何 500 字以上的内容。也就作罢。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>灵感来源&lt;/strong>：从最开始 &lt;a href="https://github.com/simonw/til">simonw/til&lt;/a> 和 &lt;a href="https://github.com/jbranchaud/til">jbranchaud/til&lt;/a> 这两人的博客我就知道了有 til 这种流派，最后一根稻草，其实是 LOTU$ 的 &lt;a href="https://blog.lotusssb.com">blog&lt;/a> ，我看他有在记录之前各种折腾的一些过程。（受到鼓舞了）&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>至于为什么会有流派 til 笔记为什么值得写，可以看看这 simonw 的 &lt;a href="https://simonwillison.net/2022/Nov/6/what-to-blog-about/">What to blog about&lt;/a>&lt;/p></description></item></channel></rss>