<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>齐物 on 老刘博客</title>
    <link>https://www.iliu.org/categories/%E9%BD%90%E7%89%A9/</link>
    <description>Recent content in 齐物 on 老刘博客</description>
    <image>
      <title>老刘博客</title>
      <url>https://www.iliu.org/img/liujinsuiyue.jpg</url>
      <link>https://www.iliu.org/img/liujinsuiyue.jpg</link>
    </image>
    <generator>Hugo -- 0.147.5</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 04 Feb 2026 16:03:45 +0800</lastBuildDate>
    <atom:link href="https://www.iliu.org/categories/%E9%BD%90%E7%89%A9/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>告别 PaperMod：审美疲劳后的 Hugo 博客“换装”记</title>
      <link>https://www.iliu.org/posts/bye-papermod/</link>
      <pubDate>Wed, 04 Feb 2026 16:03:45 +0800</pubDate>
      <guid>https://www.iliu.org/posts/bye-papermod/</guid>
      <description>记录一次从 PaperMod 迁移到 pehtheme-hugo 的心路历程，以及如何利用 AI 修复一个半成品主题。</description>
      <content:encoded><![CDATA[<p>在 Hugo 的世界里，<strong>PaperMod</strong> 绝对称得上是“国民级”主题。它简洁、高效、功能完备，我也用了好几年。但正如所有长久的相处都会走向平淡，用了几年后，那种视觉上的倦怠感扑面而来。</p>
<p>这段时间，我一直在 Hugo Themes 库里反复打量，却始终没有找到那种“一眼万年”的感觉。直到有一天，我逛到了 <a href="https://www.eallion.com">eallion</a> 的博客，看到他完善了一款名为 <code>pehtheme-hugo</code> 的主题。</p>
<h2 id="遇见新欢pehtheme-hugo">遇见新欢：pehtheme-hugo</h2>
<p>eallion 完善的这个版本已经非常出色，并且在 GitHub 上开源了。第一眼看到它，我就觉得这正是我想找的风格。</p>
<p>不过，为了避免直接“撞衫”的尴尬，我没有直接克隆他那套高度定制的版本，而是决定从<strong>原始版本</strong>开始，自己动手，丰衣足食。</p>
<h2 id="半成品的磨难与-ai-的救赎">“半成品”的磨难与 AI 的救赎</h2>
<p>原始版的 <code>pehtheme-hugo</code> 其实更像是一个半成品。虽然骨架很漂亮，但内部细节却让人头大：</p>
<ul>
<li><strong>搜索功能</strong>：完全是摆设，点不开也搜不到。</li>
<li><strong>图片引用</strong>：路径处理逻辑有误，很多地方的图片引用都是错的。</li>
<li><strong>页面缺失</strong>：核心的归档页、友链页、评论系统几乎是一片空白。</li>
</ul>
<p>如果是以前，作为一个代码小白，面对这些问题我可能就直接劝退了。但现在是 <strong>AI 时代</strong>，只要有想法，剩下的都可以交给“赛博劳动力”。</p>
<h2 id="我的折腾流程iflow-cli--ai">我的折腾流程：iflow cli + AI</h2>
<p>我利用 <strong>iflow cli</strong> 配合 AI，开始了一场针对主题的“大手术”。</p>
<blockquote>
<p><strong>操作心得：</strong>
以前需要翻遍文档、折腾好几天的难题，现在通过与 AI 的对话，让AI直接修改生成原貌，全程不用自己动手，这个感觉还是很爽的。</p></blockquote>
<ul>
<li><strong>修复搜索</strong>：重新梳理了 JSON 索引逻辑，现在搜索功能终于活了。</li>
<li><strong>页面增建</strong>：逐一补全了归档、友情链接以及评论系统的模板代码。</li>
<li><strong>细节微调</strong>：把原本那些看着不顺眼的 CSS 样式逐个修正，让它更符合我的审美。</li>
</ul>
<p><img loading="lazy" src="https://tu.iliu.org/20260204_160210.png"></p>
<h2 id="现状与未来">现状与未来</h2>
<p>目前博客已经基本成型，虽然还有很多可以完善的空间，但至少“能用了”。</p>
<p>这就像是刚装修完的房子，大件家具都进场了，至于那些装饰性的软装，等以后哪天看哪里不顺眼了再改吧。<strong>折腾的意义不在于追求绝对的完美，而在于那种“把想法变成现实”的掌控感。</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Ubuntu25.10编译安装Ibus-libpinyin </title>
      <link>https://www.iliu.org/posts/ubuntu2510-install-ibus-libpinyin/</link>
      <pubDate>Wed, 14 Jan 2026 17:04:40 +0800</pubDate>
      <guid>https://www.iliu.org/posts/ubuntu2510-install-ibus-libpinyin/</guid>
      <description>&lt;p&gt;前几年用ubuntu的时候，也写过&lt;a href=&#34;https://iliu.org/3976.html&#34;&gt;编译升级&lt;/a&gt;的方法，5年过去，旧的方法已经不适合现在的需要了，中间编译的时候，编译环境还是缺的蛮多的，不过好在有了AI，在AI的帮助下，总算是编译安装好了。&lt;/p&gt;
&lt;p&gt;默认你已经下载了输入法的最新源码。&lt;/p&gt;
&lt;h2 id=&#34;首先需要安装libpinyin&#34;&gt;首先需要安装libpinyin&lt;/h2&gt;
&lt;p&gt;安装ibus-libpinyin官方的教程很简单的说，需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ibus&lt;/li&gt;
&lt;li&gt;libpinyin&lt;/li&gt;
&lt;li&gt;sqlite3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;安装基础工具&#34;&gt;安装基础工具&lt;/h3&gt;
&lt;p&gt;在开始之前，确保编译环境是完整的：&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>前几年用ubuntu的时候，也写过<a href="https://iliu.org/3976.html">编译升级</a>的方法，5年过去，旧的方法已经不适合现在的需要了，中间编译的时候，编译环境还是缺的蛮多的，不过好在有了AI，在AI的帮助下，总算是编译安装好了。</p>
<p>默认你已经下载了输入法的最新源码。</p>
<h2 id="首先需要安装libpinyin">首先需要安装libpinyin</h2>
<p>安装ibus-libpinyin官方的教程很简单的说，需要：</p>
<ul>
<li>ibus</li>
<li>libpinyin</li>
<li>sqlite3</li>
</ul>
<h3 id="安装基础工具">安装基础工具</h3>
<p>在开始之前，确保编译环境是完整的：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt install build-essential autoconf automake libtool pkg-config intltool gettext
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="依赖库清单">依赖库清单</h3>
<p>针对你遇到的所有 <code>configure</code> 报错，这里是对应的 Ubuntu 软件包：</p>
<table>
  <thead>
      <tr>
          <th>缺失项 (报错显示)</th>
          <th>对应的安装包 (Ubuntu)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>glib-2.0</code></td>
          <td><code>libglib2.0-dev</code></td>
      </tr>
      <tr>
          <td><code>db.h</code> / <code>version 5</code></td>
          <td><code>libdb5.3-dev</code></td>
      </tr>
      <tr>
          <td><code>ibus-1.0</code></td>
          <td><code>libibus-1.0-dev</code></td>
      </tr>
      <tr>
          <td><code>sqlite3</code></td>
          <td><code>libsqlite3-dev</code></td>
      </tr>
      <tr>
          <td><code>lua &gt;= 5.1</code></td>
          <td><code>liblua5.1-0-dev</code></td>
      </tr>
      <tr>
          <td><code>libnotify</code></td>
          <td><code>libnotify-dev</code></td>
      </tr>
      <tr>
          <td><code>libsoup-3.0</code></td>
          <td><code>libsoup-3.0-dev</code></td>
      </tr>
      <tr>
          <td><code>json-glib-1.0</code></td>
          <td><code>libjson-glib-dev</code></td>
      </tr>
  </tbody>
</table>
<p><strong>一键安装命令：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install libglib2.0-dev libdb5.3-dev libibus-1.0-dev libsqlite3-dev <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>liblua5.1-0-dev libnotify-dev libsoup-3.0-dev libjson-glib-dev
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="编译">编译</h3>
<p>由于 Makefile 存在并行逻辑缺陷（即你遇到的 <code>.tmp</code> 文件找不到的问题），请务必按此顺序执行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 进入源码目录</span>
</span></span><span class="line"><span class="cl">./autogen.sh --prefix<span class="o">=</span>/usr/  --enable-cloud-input-mode
</span></span><span class="line"><span class="cl">make
</span></span><span class="line"><span class="cl">sudo make install
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 核心：先单线程处理 data 目录，防止 sed 读写冲突</span>
</span></span><span class="line"><span class="cl">make -j1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 成功后可执行安装</span>
</span></span><span class="line"><span class="cl">sudo make install
</span></span><span class="line"><span class="cl">sudo ldconfig       <span class="c1"># 刷新动态链接库</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="常见问题排查">常见问题排查</h3>
<ul>
<li><strong>安装后找不到输入法？</strong>
执行 <code>ibus-daemon -drx</code> 重启 IBus。</li>
<li><strong>缺少 pinyin-data？</strong>
<code>libpinyin</code> 只是引擎，通常还需要 <code>pinyin-data</code>（词库文件）。如果运行报错，检查 <code>/usr/share/libpinyin/</code> 下是否有数据。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>博客托管平台换成edgeone pages</title>
      <link>https://www.iliu.org/posts/migrated-my-blog-to-edgeone-pages/</link>
      <pubDate>Sun, 04 Jan 2026 18:01:08 +0800</pubDate>
      <guid>https://www.iliu.org/posts/migrated-my-blog-to-edgeone-pages/</guid>
      <description>&lt;p&gt;作为个人博主，Cloudflare 被称为赛博菩萨：免费 CDN、自动 SSL、无限流量。但对于中国大陆用户来说，CF 的免费版线路对联通用户来说非常的不友好——动辄 300ms+ 的延迟和高峰期的丢包，让“全球加速”变成了“全球减速”。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>作为个人博主，Cloudflare 被称为赛博菩萨：免费 CDN、自动 SSL、无限流量。但对于中国大陆用户来说，CF 的免费版线路对联通用户来说非常的不友好——动辄 300ms+ 的延迟和高峰期的丢包，让“全球加速”变成了“全球减速”。</p>
<p>前两天看到1900把博客迁移到了Edgeone，速度很快，我的博客没有备案，看了下可以使用海外版，测试了一下，发现要比cf快一些，于是决定把博客从 Cloudflare 迁移了过去。</p>
<h2 id="为什么选择-edgeone-pages">为什么选择 EdgeOne Pages？</h2>
<p>虽然 EdgeOne 的 Pages 功能在目前也主要使用海外节点，但实际体验下来，它在亚洲地区的路由优化明显优于 Cloudflare 的 pages。</p>
<h3 id="延迟表现从红爆到稳住">延迟表现：从“红爆”到“稳住”</h3>
<ul>
<li><strong>Cloudflare</strong>：联通线路经常在晚高峰时期，Ping 常跳到 800ms 以上。</li>
<li><strong>EdgeOne</strong>：同样是海外线路，EdgeOne 的 Anycast 策略似乎更懂中国开发者。实测联通和移动的延迟基本稳定在 <strong>200ms 左右</strong>。虽然比不上内地的“极速”，但相比 CF 的已经有了质的区别。</li>
</ul>
<h3 id="部署体验平替-cloudflare">部署体验：平替 Cloudflare</h3>
<p>EdgeOne Pages 的逻辑与 CF Pages 基本差不多，所以迁移成本几乎为零：</p>
<ul>
<li><strong>GitHub 集成</strong>：直接关联仓库，代码推送到指定分支即可触发全量构建。</li>
<li><strong>自动化部署</strong>：支持常见的静态网站框架（Hexo, Hugo, VitePress 等）。</li>
<li><strong>域名绑定</strong>：支持自定义域名，并自动签发免费的 SSL 证书。
由于我的博客是在本地生成了html，所以，1900遇到的那些坑，我一个都没有遇到</li>
</ul>
<hr>
<h2 id="迁移流程详解">迁移流程详解</h2>
<p>整个迁移过程非常丝滑，三步搞定：</p>
<h3 id="第一步开通-pages">第一步：开通 Pages</h3>
<p>登录腾讯云 EdgeOne 控制台，在左侧菜单栏找到 <strong>“Pages”</strong></p>
<h3 id="第二步关联-github-项目">第二步：关联 GitHub 项目</h3>
<p>授权 GitHub 账号后，选择你的博客仓库。</p>
<h3 id="第三步绑定域名">第三步：绑定域名</h3>
<p>部署完成后，你会得到一个边缘域名。直接绑定你自己的域名，并在 DNS 服务商处将 CNAME 指向 EdgeOne 提供的地址即可。</p>
<hr>
<h2 id="总结">总结</h2>
<p>这次迁移最大的感受是：<strong>选对路由比选大厂更重要。</strong> EdgeOne Pages 弥补了 Cloudflare 在国内部分运营商环境下“由于链路过长导致访问缓慢”的痛点。如果你也受够了 CF 联通线路的拉跨，不妨试试这个新选择。</p>
]]></content:encoded>
    </item>
    <item>
      <title>博客评论换回Giscus</title>
      <link>https://www.iliu.org/posts/back-to-giscus/</link>
      <pubDate>Tue, 30 Dec 2025 11:31:56 +0800</pubDate>
      <guid>https://www.iliu.org/posts/back-to-giscus/</guid>
      <description>&lt;p&gt;前几天，老张他们几个人一直吐槽，说想留言还得翻墙登录 GitHub。听多了，我也动了心思，就去折腾了一下 Artalk，把博客的评论系统换了过去。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>前几天，老张他们几个人一直吐槽，说想留言还得翻墙登录 GitHub。听多了，我也动了心思，就去折腾了一下 Artalk，把博客的评论系统换了过去。</p>
<p>不得不说，Artalk 用起来确实舒服。界面清爽，也更像我们习惯的那种“博客评论”，不用账号体系，不用跳来跳去，交流起来顺手很多。</p>
<p>我用的这台VPS，本来就只是随手用来跑点轻量服务：FreshRSS、Umami，再加一个 Artalk。前两天瞎折腾系统的时候，一个不小心，把服务给折腾挂了。</p>
<p>更糟的是——
没备份。</p>
<p>于是结果也就很自然了：
FreshRSS 的数据没了，Umami 的统计没了，Artalk 里的评论，也一起消失了。</p>
<hr>
<p>Artalk 并不差，甚至可以说比较完美：
它把“数据安全”这件事完全交给了使用者自己。</p>
<p>使用者需要考虑：</p>
<ul>
<li>
<p>VPS 是否稳定</p>
</li>
<li>
<p>是否做了定期备份</p>
</li>
<li>
<p>备份是否真的可恢复</p>
</li>
<li>
<p>迁移、重装、误操作怎么办</p>
</li>
</ul>
<p>对爱折腾的人来说，这些都是“可以接受的成本”；
但对一个只是想安安静静写点东西的博客来说，这些成本其实非常高。</p>
<p>尤其是评论这种东西——
它不是核心内容，却往往承载着读者的痕迹与交流，一旦丢了，有时候感觉比文章丢了还让人难受。</p>
<hr>
<p>所以兜兜转转，我又把评论系统换回了 Giscus。</p>
<p>它不完美：
要 GitHub 登录，对不少人不友好；
国内访问也谈不上顺畅；
用起来多少有点“技术味”。</p>
<p>但它有一个很现实的优点——省心。</p>
<p>评论直接存在 GitHub 仓库里，不用我操心数据库，不用备份，也不怕哪天手滑把服务器玩坏。只要 GitHub 还在，这些内容大概率就还在。</p>
<p>对我这种一边写博客，一边又总忍不住折腾系统的人来说，这一点反而显得特别重要。</p>
<hr>
<p>这次折腾完，反倒更清楚了一件事：</p>
<p>越“自由”的方案，其实越吃精力；
越省事的方案，往往是把控制权交出去。</p>
<p>Artalk 是自由的，Giscus 是妥协的。
但对现在的我来说，这种妥协是可以接受的。</p>
<p>博客这东西，说到底是个慢活。
能一直写下去，比用什么技术更重要。</p>
<p>所以，评论系统又换回来了。
也许以后还会再折腾，但至少这一次，我想让它先安静地用一段时间。</p>
]]></content:encoded>
    </item>
    <item>
      <title>EndeavourOS &#43; Btrfs &#43; Snapper &#43; GRUB：完整的快照回滚系统配置指南</title>
      <link>https://www.iliu.org/endeavouros-snapper-grub-snapshot-rollback-guide/</link>
      <pubDate>Sun, 30 Nov 2025 10:00:00 +0800</pubDate>
      <guid>https://www.iliu.org/endeavouros-snapper-grub-snapshot-rollback-guide/</guid>
      <description>&lt;p&gt;EndeavourOS由于使用的是滚动更新，系统存在着滚挂的可能性（尽管我已经使用了1个多月也没有问题），所以快照回滚是一个必须的选项。本文将详细介绍如何在 EndeavourOS 系统中配置完整的快照回滚系统，让您在系统出现问题时能够轻松恢复到之前的状态。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>EndeavourOS由于使用的是滚动更新，系统存在着滚挂的可能性（尽管我已经使用了1个多月也没有问题），所以快照回滚是一个必须的选项。本文将详细介绍如何在 EndeavourOS 系统中配置完整的快照回滚系统，让您在系统出现问题时能够轻松恢复到之前的状态。</p>
<p><img loading="lazy" src="https://s2.l22.org/images/1764499404_endeavour-os-logo-on-a-purple-background-1.jpg"></p>
<h2 id="前言">前言</h2>
<p>为什么需要快照回滚系统？在日常使用中，我们难免会遇到以下情况：</p>
<ul>
<li>系统更新后出现兼容性问题</li>
<li>安装某个软件导致系统不稳定</li>
<li>配置文件修改错误导致系统无法启动</li>
<li>恶意软件或误操作破坏系统</li>
</ul>
<p>有了快照回滚功能，这些问题都可以通过简单的重启和菜单选择来解决。</p>
<h2 id="系统要求">系统要求</h2>
<p>在开始之前，请确保您的系统满足以下条件：</p>
<ol>
<li><strong>已安装 EndeavourOS</strong>（或基于 Arch 的其他发行版）</li>
<li><strong>使用 Btrfs 文件系统</strong>作为根分区</li>
<li><strong>安装时选择 GRUB 作为引导加载程序</strong></li>
</ol>
<h2 id="核心组件介绍">核心组件介绍</h2>
<p>我们的快照回滚系统将由以下几个核心组件构成：</p>
<table>
  <thead>
      <tr>
          <th>组件</th>
          <th>作用</th>
          <th>必要性</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Snapper</strong></td>
          <td>快照管理核心程序，负责创建、删除和管理快照</td>
          <td>必需</td>
      </tr>
      <tr>
          <td><strong>snap-pac</strong></td>
          <td>在 pacman 操作时自动创建 pre/post 快照</td>
          <td>强烈推荐</td>
      </tr>
      <tr>
          <td><strong>grub-btrfs</strong></td>
          <td>将 Snapper 快照集成到 GRUB 启动菜单</td>
          <td>必需</td>
      </tr>
      <tr>
          <td><strong>inotify-tools</strong></td>
          <td>文件系统监控工具，确保 GRUB 菜单及时更新</td>
          <td>可选但推荐</td>
      </tr>
  </tbody>
</table>
<h2 id="安装步骤">安装步骤</h2>
<h3 id="步骤-1安装核心软件包">步骤 1：安装核心软件包</h3>
<p>打开终端，执行以下命令安装所需的软件包：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装 snapper, snap-pac 和 grub-btrfs</span>
</span></span><span class="line"><span class="cl">sudo pacman -S snapper snap-pac grub-btrfs
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>软件包说明：</strong></p>
<ul>
<li><code>snapper</code>：快照管理的核心程序，提供快照创建、删除、比较等功能</li>
<li><code>snap-pac</code>：自动化工具，在每次 pacman 操作时自动创建&quot;操作前&quot;和&quot;操作后&quot;快照</li>
<li><code>grub-btrfs</code>：GRUB 扩展模块，自动扫描 Snapper 快照并将其添加到启动菜单</li>
</ul>
<h3 id="步骤-2配置-snapper">步骤 2：配置 Snapper</h3>
<p>安装完成后，我们需要创建 Snapper 配置：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 创建根分区的 Snapper 配置</span>
</span></span><span class="line"><span class="cl">sudo snapper -c root create-config /
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 创建第一个手动快照作为基准</span>
</span></span><span class="line"><span class="cl">sudo snapper create --description <span class="s2">&#34;初始系统快照&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="步骤-3启用-grub-集成服务">步骤 3：启用 GRUB 集成服务</h3>
<p><code>grub-btrfsd</code> 服务会监控快照变化并自动更新 GRUB 配置：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 启用并启动 grub-btrfs 守护进程</span>
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now grub-btrfsd.service
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="步骤-4生成初始-grub-配置">步骤 4：生成初始 GRUB 配置</h3>
<p>手动生成一次 GRUB 配置，确保现有快照出现在启动菜单中：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 重新生成 GRUB 配置文件</span>
</span></span><span class="line"><span class="cl">sudo grub-mkconfig -o /boot/grub/grub.cfg
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="验证配置">验证配置</h2>
<h3 id="检查服务状态">检查服务状态</h3>
<p>确认 <code>grub-btrfsd</code> 服务正常运行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 查看服务状态</span>
</span></span><span class="line"><span class="cl">sudo systemctl status grub-btrfsd
</span></span></code></pre></td></tr></table>
</div>
</div><p>正常情况下，您应该看到类似以下的输出：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="err">●</span> <span class="n">grub</span><span class="o">-</span><span class="n">btrfsd</span><span class="o">.</span><span class="n">service</span> <span class="o">-</span> <span class="n">GRUB</span> <span class="n">Btrfs</span> <span class="n">snapshot</span> <span class="n">detection</span> <span class="n">daemon</span>
</span></span><span class="line"><span class="cl">   <span class="n">Loaded</span><span class="p">:</span> <span class="n">loaded</span> <span class="p">(</span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">systemd</span><span class="o">/</span><span class="n">system</span><span class="o">/</span><span class="n">grub</span><span class="o">-</span><span class="n">btrfsd</span><span class="o">.</span><span class="n">service</span><span class="p">;</span> <span class="n">enabled</span><span class="p">;</span> <span class="n">vendor</span> <span class="n">preset</span><span class="p">:</span> <span class="n">disabled</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">   <span class="n">Active</span><span class="p">:</span> <span class="n">active</span> <span class="p">(</span><span class="n">running</span><span class="p">)</span> <span class="n">since</span> <span class="o">...</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="查看快照列表">查看快照列表</h3>
<p>检查 Snapper 是否正常工作：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 列出所有快照</span>
</span></span><span class="line"><span class="cl">sudo snapper list
</span></span></code></pre></td></tr></table>
</div>
</div><p>您应该能看到包含刚才创建的&quot;初始系统快照&quot;的列表。</p>
<h3 id="测试自动快照功能">测试自动快照功能</h3>
<p>安装一个简单的软件包来测试自动快照功能：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装测试软件包</span>
</span></span><span class="line"><span class="cl">sudo pacman -S neofetch
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查看是否自动创建了快照</span>
</span></span><span class="line"><span class="cl">sudo snapper list
</span></span></code></pre></td></tr></table>
</div>
</div><p>您应该能看到两个新的快照：一个在安装前（pre），一个在安装后（post）。</p>
<h2 id="故障排除">故障排除</h2>
<h3 id="问题-1grub-菜单中没有显示快照">问题 1：GRUB 菜单中没有显示快照</h3>
<p>如果重启后 GRUB 菜单中没有显示快照选项，可能是因为缺少 <code>inotify-tools</code>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装 inotify-tools</span>
</span></span><span class="line"><span class="cl">sudo pacman -S inotify-tools
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 重启 grub-btrfsd 服务</span>
</span></span><span class="line"><span class="cl">sudo systemctl restart grub-btrfsd.service
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 重新生成 GRUB 配置</span>
</span></span><span class="line"><span class="cl">sudo grub-mkconfig -o /boot/grub/grub.cfg
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="问题-2服务启动失败">问题 2：服务启动失败</h3>
<p>如果 <code>grub-btrfsd</code> 服务启动失败，检查以下内容：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 检查服务日志</span>
</span></span><span class="line"><span class="cl">sudo journalctl -u grub-btrfsd.service -f
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 检查 Btrfs 子卷挂载情况</span>
</span></span><span class="line"><span class="cl">mount <span class="p">|</span> grep btrfs
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="问题-3快照无法启动">问题 3：快照无法启动</h3>
<p>如果快照在 GRUB 菜单中显示但无法启动，可能是由于以下原因：</p>
<ol>
<li><strong>内核版本不匹配</strong>：确保快照中的内核版本与当前系统兼容</li>
<li><strong>initramfs 问题</strong>：重新生成 initramfs 镜像</li>
<li><strong>子卷挂载问题</strong>：检查 <code>/etc/fstab</code> 配置</li>
</ol>
<h2 id="高级配置">高级配置</h2>
<h3 id="自定义快照保留策略">自定义快照保留策略</h3>
<p>编辑 Snapper 配置文件来自定义快照保留策略：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 编辑配置文件</span>
</span></span><span class="line"><span class="cl">sudo nano /etc/snapper/configs/root
</span></span></code></pre></td></tr></table>
</div>
</div><p>在文件中找到以下部分并根据自己的需求调整：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="c1"># 数量限制</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_LIMIT_HOURLY</span><span class="o">=</span><span class="s">&#34;10&#34;</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_LIMIT_DAILY</span><span class="o">=</span><span class="s">&#34;7&#34;</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_LIMIT_WEEKLY</span><span class="o">=</span><span class="s">&#34;4&#34;</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_LIMIT_MONTHLY</span><span class="o">=</span><span class="s">&#34;12&#34;</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_LIMIT_YEARLY</span><span class="o">=</span><span class="s">&#34;0&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 清理算法</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_CLEANUP</span><span class="o">=</span><span class="s">&#34;true&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="配置定时快照">配置定时快照</h3>
<p>启用定时快照功能，系统会定期自动创建快照：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 启用 snapper-timeline.timer</span>
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now snapper-timeline.timer
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 启用 snapper-cleanup.timer</span>
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now snapper-cleanup.timer
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="使用指南">使用指南</h2>
<h3 id="创建手动快照">创建手动快照</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 创建描述性快照</span>
</span></span><span class="line"><span class="cl">sudo snapper create --description <span class="s2">&#34;安装显卡驱动前&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 创建带类型和描述的快照</span>
</span></span><span class="line"><span class="cl">sudo snapper create --type single --description <span class="s2">&#34;系统优化完成&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="删除快照">删除快照</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 删除指定快照（替换 &lt;ID&gt; 为实际的快照编号）</span>
</span></span><span class="line"><span class="cl">sudo snapper delete &lt;ID&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 删除多个快照</span>
</span></span><span class="line"><span class="cl">sudo snapper delete &lt;ID1&gt; &lt;ID2&gt; &lt;ID3&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="比较快照">比较快照</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 比较两个快照之间的差异</span>
</span></span><span class="line"><span class="cl">sudo snapper diff &lt;ID1&gt; &lt;ID2&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 比较特定文件的变化</span>
</span></span><span class="line"><span class="cl">sudo snapper diff &lt;ID1&gt; &lt;ID2&gt; /etc/fstab
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="回滚到快照">回滚到快照</h3>
<ol>
<li>重启系统</li>
<li>在 GRUB 菜单中选择&quot;Snapper snapshots&quot;</li>
<li>选择要回滚的快照</li>
<li>按照屏幕提示完成回滚</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>把GotoSocial嵌入到Hugo</title>
      <link>https://www.iliu.org/posts/embedding-gotosocial-in-a-hugo-blog/</link>
      <pubDate>Tue, 21 Oct 2025 11:10:32 +0800</pubDate>
      <guid>https://www.iliu.org/posts/embedding-gotosocial-in-a-hugo-blog/</guid>
      <description>&lt;p&gt;把博客重新换成Hugo后，我又把GotoSocial安装了起来，就是想发布自己有一些碎语之类的东西，在memos和GotoSocial中纠结了一会，最终选择了GotoSocial，主要原因还是看到memeos的作者随意改动API，为了以后不再有不必要的麻烦，还是选择一个更稳定的最好。整体完成后的效果可以参考：&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>把博客重新换成Hugo后，我又把GotoSocial安装了起来，就是想发布自己有一些碎语之类的东西，在memos和GotoSocial中纠结了一会，最终选择了GotoSocial，主要原因还是看到memeos的作者随意改动API，为了以后不再有不必要的麻烦，还是选择一个更稳定的最好。整体完成后的效果可以参考：</p>
<p><a href="http://iliu.org/toots">我的微博</a></p>
<h2 id="总体思路">总体思路</h2>
<p>由于 GoToSocial 默认开启了严格的 CORS 限制，获取内容的时候需要token，由于Hugo是静态博客，直接把token写在前端非常不安全，所以我们需要一个中转层。
Cloudflare Workers 可以完美胜任代理转发的功能，作用是：</p>
<ul>
<li>从 Hugo 前端发请求 → Cloudflare Worker</li>
<li>Worker 向 https://你的域名/api/v1/accounts/&hellip;/statuses 请求 GoToSocial 数据</li>
<li>Worker 再把 JSON 数据返回给 Hugo 前端</li>
<li>Hugo 构建时渲染</li>
</ul>
<h2 id="获取-gotosocial-的-toot-api-接口">获取 GoToSocial 的 toot API 接口</h2>
<h3 id="目标概述">目标概述</h3>
<p>我们要：</p>
<ol>
<li>向 https://你的域名/api/v1/apps 注册一个应用；</li>
<li>通过浏览器授权；</li>
<li>用授权码换取 access_token；</li>
<li>把这个 token 放入 Cloudflare Worker 的环境变量；</li>
<li>然后 Hugo 博客就能安全地从 Worker 获取嘟文数据。</li>
</ol>
<h3 id="详细步骤">详细步骤</h3>
<h4 id="注册一个新应用">注册一个新应用</h4>
<p>在命令行执行以下命令（用 curl，别忘了改你的 app 名称）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -X POST <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;client_name&#34;: &#34;hugo-gts-proxy&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;redirect_uris&#34;: &#34;urn:ietf:wg:oauth:2.0:oob&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;scopes&#34;: &#34;read&#34;
</span></span></span><span class="line"><span class="cl"><span class="s1">      }&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="s1">&#39;https://你的域名/api/v1/apps&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>成功后会返回类似：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;01J1CYJ4QRNFZD6WHQMZV7248G&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;hugo-gts-proxy&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;redirect_uri&#34;</span><span class="p">:</span> <span class="s2">&#34;urn:ietf:wg:oauth:2.0:oob&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;client_id&#34;</span><span class="p">:</span> <span class="s2">&#34;xxxxxxxxxxxxxxxx&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;client_secret&#34;</span><span class="p">:</span> <span class="s2">&#34;yyyyyyyyyyyyyyyy&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>👉 复制并保存 client_id 与 client_secret。</p>
<h4 id="获取授权码">获取授权码</h4>
<p>打开浏览器访问以下链接（注意替换 YOUR_CLIENT_ID）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">https://你的域名/oauth/authorize?client_id=YOUR_CLIENT_ID&amp;redirect_uri=urn:ietf:wg:oauth:2.0:oob&amp;response_type=code&amp;scope=read
</span></span></code></pre></td></tr></table>
</div>
</div><p>系统会要求你登录并授权。
点击「允许」，你会看到页面上出现：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Here&#39;s your out-of-band token:
</span></span><span class="line"><span class="cl">YOUR_AUTHORIZATION_CODE
</span></span></code></pre></td></tr></table>
</div>
</div><p>👉 复制这个 YOUR_AUTHORIZATION_CODE。</p>
<h4 id="用授权码换取访问令牌">用授权码换取访问令牌</h4>
<p>然后在命令行执行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -X POST <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;redirect_uri&#34;: &#34;urn:ietf:wg:oauth:2.0:oob&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;client_id&#34;: &#34;YOUR_CLIENT_ID&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;client_secret&#34;: &#34;YOUR_CLIENT_SECRET&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;grant_type&#34;: &#34;authorization_code&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;code&#34;: &#34;YOUR_AUTHORIZATION_CODE&#34;
</span></span></span><span class="line"><span class="cl"><span class="s1">      }&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="s1">&#39;https://你的域名/oauth/token&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>会返回类似：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;access_token&#34;</span><span class="p">:</span> <span class="s2">&#34;YOUR_ACCESS_TOKEN&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;created_at&#34;</span><span class="p">:</span> <span class="mi">1729436650</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;scope&#34;</span><span class="p">:</span> <span class="s2">&#34;read&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;token_type&#34;</span><span class="p">:</span> <span class="s2">&#34;Bearer&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>🎉 这就是我们需要的 access_token！</p>
<h4 id="验证-token-是否可用">验证 token 是否可用</h4>
<p>试试看：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -H <span class="s2">&#34;Authorization: Bearer YOUR_ACCESS_TOKEN&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="s1">&#39;https://你的域名/api/v1/accounts/verify_credentials&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果返回你的用户资料（ username, id, url 等），说明 token 有效 。</p>
<h2 id="cloudflare-worker的设置">Cloudflare Worker的设置</h2>
<p>接下来打开 Cloudflare → Workers → 你的 Worker →
「Settings」→「Variables」→「Add Variable」</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Name: GTS_TOKEN
</span></span><span class="line"><span class="cl">Value: YOUR_ACCESS_TOKEN
</span></span></code></pre></td></tr></table>
</div>
</div><p>保存。
Worker 代码示例如下 👇：</p>
<details>
<summary>点击展开查看完整的配置代码（大约 160 行）</summary>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span><span class="lnt">142
</span><span class="lnt">143
</span><span class="lnt">144
</span><span class="lnt">145
</span><span class="lnt">146
</span><span class="lnt">147
</span><span class="lnt">148
</span><span class="lnt">149
</span><span class="lnt">150
</span><span class="lnt">151
</span><span class="lnt">152
</span><span class="lnt">153
</span><span class="lnt">154
</span><span class="lnt">155
</span><span class="lnt">156
</span><span class="lnt">157
</span><span class="lnt">158
</span><span class="lnt">159
</span><span class="lnt">160
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">async</span> <span class="nx">fetch</span><span class="p">(</span><span class="nx">request</span><span class="p">,</span> <span class="nx">env</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">url</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">URL</span><span class="p">(</span><span class="nx">request</span><span class="p">.</span><span class="nx">url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">headers</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;Access-Control-Allow-Origin&#34;</span><span class="o">:</span> <span class="s2">&#34;*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;Access-Control-Allow-Methods&#34;</span><span class="o">:</span> <span class="s2">&#34;GET, OPTIONS&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;Access-Control-Allow-Headers&#34;</span><span class="o">:</span> <span class="s2">&#34;*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">request</span><span class="p">.</span><span class="nx">method</span> <span class="o">===</span> <span class="s2">&#34;OPTIONS&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="k">new</span> <span class="nx">Response</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="p">{</span> <span class="nx">headers</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">target</span> <span class="o">=</span> <span class="sb">`https://你的域名</span><span class="si">${</span><span class="nx">url</span><span class="p">.</span><span class="nx">pathname</span><span class="si">}${</span><span class="nx">url</span><span class="p">.</span><span class="nx">search</span><span class="si">}</span><span class="sb">`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">resp</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="nx">target</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Authorization&#34;</span><span class="o">:</span> <span class="s2">&#34;Bearer &#34;</span> <span class="o">+</span> <span class="nx">env</span><span class="p">.</span><span class="nx">GTS_TOKEN</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;User-Agent&#34;</span><span class="o">:</span> <span class="s2">&#34;GTS-Proxy-Worker&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">resp</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="k">new</span> <span class="nx">Response</span><span class="p">(</span><span class="kr">await</span> <span class="nx">resp</span><span class="p">.</span><span class="nx">text</span><span class="p">(),</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">status</span><span class="o">:</span> <span class="nx">resp</span><span class="p">.</span><span class="nx">status</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="p">...</span><span class="nx">headers</span><span class="p">,</span> <span class="s2">&#34;Content-Type&#34;</span><span class="o">:</span> <span class="s2">&#34;application/json&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">resp</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">细步骤</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 并行拉取每条嘟文的回复
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kr">const</span> <span class="nx">statuses</span> <span class="o">=</span> <span class="kr">await</span> <span class="nb">Promise</span><span class="p">.</span><span class="nx">all</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kr">async</span> <span class="p">(</span><span class="nx">status</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="kd">let</span> <span class="nx">replies</span> <span class="o">=</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">      <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">ctx</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="sb">`https://你的域名/api/v1/statuses/</span><span class="si">${</span><span class="nx">status</span><span class="p">.</span><span class="nx">id</span><span class="si">}</span><span class="sb">/context`</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="s2">&#34;Authorization&#34;</span><span class="o">:</span> <span class="s2">&#34;Bearer &#34;</span> <span class="o">+</span> <span class="nx">env</span><span class="p">.</span><span class="nx">GTS_TOKEN</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">ctx</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="kr">const</span> <span class="nx">contextData</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">ctx</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">          <span class="nx">replies</span> <span class="o">=</span> <span class="nx">contextData</span><span class="o">?</span><span class="p">.</span><span class="nx">descendants</span><span class="o">?</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">r</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">            <span class="nx">id</span><span class="o">:</span> <span class="nx">r</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">content</span><span class="o">:</span> <span class="nx">r</span><span class="p">.</span><span class="nx">content</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">account</span><span class="o">:</span> <span class="p">{</span><span class="o">&lt;</span><span class="nx">details</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">summary</span><span class="o">&gt;</span><span class="nx">点击展开查看完整的配置代码</span><span class="err">（</span><span class="nx">大约</span> <span class="mi">100</span> <span class="nx">行</span><span class="err">）</span><span class="o">&lt;</span><span class="err">/summary&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="nx">username</span><span class="o">:</span> <span class="nx">r</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">username</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="nx">display_name</span><span class="o">:</span> <span class="nx">r</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">display_name</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="nx">avatar完全正确</span> <span class="err">✅</span><span class="o">:</span> <span class="nx">r</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">avatar</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">          <span class="p">}))</span> <span class="o">||</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Reply fetch failed:&#34;</span><span class="p">,</span> <span class="nx">err</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">id</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">created_at</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">created_at</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">content</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">content</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">url</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">url</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">account</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">username</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">username</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">display_name</span><span class="o">:</span> <span class="nx">statuexport</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">async</span> <span class="nx">fetch</span><span class="p">(</span><span class="nx">request</span><span class="p">,</span> <span class="nx">env</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">url</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">URL</span><span class="p">(</span><span class="nx">request</span><span class="p">.</span><span class="nx">url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">headers</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;Access-Control-Allow-Origin&#34;</span><span class="o">:</span> <span class="s2">&#34;*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;Access-Control-Allow-Methods&#34;</span><span class="o">:</span> <span class="s2">&#34;GET, OPTIONS&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;Access-Control-Allow-Headers&#34;</span><span class="o">:</span> <span class="s2">&#34;*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">request</span><span class="p">.</span><span class="nx">method</span> <span class="o">===</span> <span class="s2">&#34;OPTIONS&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="k">new</span> <span class="nx">Response</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="p">{</span> <span class="nx">headers</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">target</span> <span class="o">=</span> <span class="sb">`https://l22.org</span><span class="si">${</span><span class="nx">url</span><span class="p">.</span><span class="nx">pathname</span><span class="si">}${</span><span class="nx">url</span><span class="p">.</span><span class="nx">search</span><span class="si">}</span><span class="sb">`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">resp</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="nx">target</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Authorization&#34;</span><span class="o">:</span> <span class="s2">&#34;Bearer &#34;</span> <span class="o">+</span> <span class="nx">env</span><span class="p">.</span><span class="nx">GTS_TOKEN</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;User-Agent&#34;</span><span class="o">:</span> <span class="s2">&#34;GTS-Proxy-Worker&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">resp</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="k">new</span> <span class="nx">Response</span><span class="p">(</span><span class="kr">await</span> <span class="nx">resp</span><span class="p">.</span><span class="nx">text</span><span class="p">(),</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">status</span><span class="o">:</span> <span class="nx">resp</span><span class="p">.</span><span class="nx">status</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="p">...</span><span class="nx">headers</span><span class="p">,</span> <span class="s2">&#34;Content-Type&#34;</span><span class="o">:</span> <span class="s2">&#34;application/json&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">resp</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// 并行拉取每条嘟文的回复
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kr">const</span> <span class="nx">statuses</span> <span class="o">=</span> <span class="kr">await</span> <span class="nb">Promise</span><span class="p">.</span><span class="nx">all</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kr">async</span> <span class="p">(</span><span class="nx">status</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="kd">let</span> <span class="nx">replies</span> <span class="o">=</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">      <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">ctx</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="sb">`https://l22.org/api/v1/statuses/</span><span class="si">${</span><span class="nx">status</span><span class="p">.</span><span class="nx">id</span><span class="si">}</span><span class="sb">/context`</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="s2">&#34;Authorization&#34;</span><span class="o">:</span> <span class="s2">&#34;Bearer &#34;</span> <span class="o">+</span> <span class="nx">env</span><span class="p">.</span><span class="nx">GTS_TOKEN</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">ctx</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="kr">const</span> <span class="nx">contextData</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">ctx</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">          <span class="nx">replies</span> <span class="o">=</span> <span class="nx">contextData</span><span class="o">?</span><span class="p">.</span><span class="nx">descendants</span><span class="o">?</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">r</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">            <span class="nx">id</span><span class="o">:</span> <span class="nx">r</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">content</span><span class="o">:</span> <span class="nx">r</span><span class="p">.</span><span class="nx">content</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">account</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">              <span class="nx">username</span><span class="o">:</span> <span class="nx">r</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">username</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="nx">display_name</span><span class="o">:</span> <span class="nx">r</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">display_name</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">              <span class="nx">avatar</span><span class="o">:</span> <span class="nx">r</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">avatar</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">          <span class="p">}))</span> <span class="o">||</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Reply fetch failed:&#34;</span><span class="p">,</span> <span class="nx">err</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">id</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">created_at</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">created_at</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">content</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">content</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">url</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">url</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">account</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">username</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">username</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">display_name</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">display_name</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">avatar</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">avatar</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nx">replies_count</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">replies_count</span> <span class="o">||</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reblogs_count</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">reblogs_count</span> <span class="o">||</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">favourites_count</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">favourites_count</span> <span class="o">||</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">media_attachments</span><span class="o">:</span> <span class="p">(</span><span class="nx">status</span><span class="p">.</span><span class="nx">media_attachments</span> <span class="o">||</span> <span class="p">[]).</span><span class="nx">map</span><span class="p">(</span><span class="nx">media</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">          <span class="nx">url</span><span class="o">:</span> <span class="nx">media</span><span class="p">.</span><span class="nx">url</span><span class="o">?</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="p">)</span> <span class="o">?</span> <span class="s2">&#34;https://域名&#34;</span> <span class="o">+</span> <span class="nx">media</span><span class="p">.</span><span class="nx">url</span> <span class="o">:</span> <span class="nx">media</span><span class="p">.</span><span class="nx">url</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">preview_url</span><span class="o">:</span> <span class="nx">media</span><span class="p">.</span><span class="nx">preview_url</span><span class="o">?</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="p">)</span> <span class="o">?</span> <span class="s2">&#34;https://域名&#34;</span> <span class="o">+</span> <span class="nx">media</span><span class="p">.</span><span class="nx">preview_url</span> <span class="o">:</span> <span class="nx">media</span><span class="p">.</span><span class="nx">preview_url</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">})),</span>
</span></span><span class="line"><span class="cl">        <span class="nx">replies</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">}));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">new</span> <span class="nx">Response</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">statuses</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="p">...</span><span class="nx">headers</span><span class="p">,</span> <span class="s2">&#34;Content-Type&#34;</span><span class="o">:</span> <span class="s2">&#34;application/json&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span><span class="o">&lt;</span><span class="err">/details&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nx">s</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">display_name</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">avatar</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">avatar</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nx">replies_count</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">replies_count</span> <span class="o">||</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reblogs_count</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">reblogs_count</span> <span class="o">||</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">favourites_count</span><span class="o">:</span> <span class="nx">status</span><span class="p">.</span><span class="nx">favourites_count</span> <span class="o">||</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">media_attachments</span><span class="o">:</span> <span class="p">(</span><span class="nx">status</span><span class="p">.</span><span class="nx">media_attachments</span> <span class="o">||</span> <span class="p">[]).</span><span class="nx">map</span><span class="p">(</span><span class="nx">media</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">          <span class="nx">url</span><span class="o">:</span> <span class="nx">media</span><span class="p">.</span><span class="nx">url</span><span class="o">?</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="p">)</span> <span class="o">?</span> <span class="s2">&#34;https://你的域名&#34;</span> <span class="o">+</span> <span class="nx">media</span><span class="p">.</span><span class="nx">url</span> <span class="o">:</span> <span class="nx">media</span><span class="p">.</span><span class="nx">url</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">preview_url</span><span class="o">:</span> <span class="nx">media</span><span class="p">.</span><span class="nx">preview_url</span><span class="o">?</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="p">)</span> <span class="o">?</span> <span class="s2">&#34;https://你的域名&#34;</span> <span class="o">+</span> <span class="nx">media</span><span class="p">.</span><span class="nx">preview_url</span> <span class="o">:</span> <span class="nx">media</span><span class="p">.</span><span class="nx">preview_url</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">})),</span>
</span></span><span class="line"><span class="cl">        <span class="nx">replies</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">}));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">new</span> <span class="nx">Response</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">statuses</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="p">...</span><span class="nx">headers</span><span class="p">,</span> <span class="s2">&#34;Content-Type&#34;</span><span class="o">:</span> <span class="s2">&#34;application/json&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></td></tr></table>
</div>
</div></details>
<h3 id="hugo模板设置">Hugo模板设置</h3>
<p>在 Hugo 博客根目录下，新建：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">content/toots/_index.md
</span></span><span class="line"><span class="cl">layouts/_default/toots.html
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="-contenttoots_indexmd">📄 content/toots/_index.md</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">title: &#34;我的嘟文&#34;
</span></span><span class="line"><span class="cl">description: &#34;来自 GoToSocial 的最新动态&#34;
</span></span><span class="line"><span class="cl">---
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="-layouts_defaulttootshtml">🧩 layouts/_default/toots.html</h4>
<details>
<summary>点击展开查看完整的配置代码（大约 280 行）</summary>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span><span class="lnt">142
</span><span class="lnt">143
</span><span class="lnt">144
</span><span class="lnt">145
</span><span class="lnt">146
</span><span class="lnt">147
</span><span class="lnt">148
</span><span class="lnt">149
</span><span class="lnt">150
</span><span class="lnt">151
</span><span class="lnt">152
</span><span class="lnt">153
</span><span class="lnt">154
</span><span class="lnt">155
</span><span class="lnt">156
</span><span class="lnt">157
</span><span class="lnt">158
</span><span class="lnt">159
</span><span class="lnt">160
</span><span class="lnt">161
</span><span class="lnt">162
</span><span class="lnt">163
</span><span class="lnt">164
</span><span class="lnt">165
</span><span class="lnt">166
</span><span class="lnt">167
</span><span class="lnt">168
</span><span class="lnt">169
</span><span class="lnt">170
</span><span class="lnt">171
</span><span class="lnt">172
</span><span class="lnt">173
</span><span class="lnt">174
</span><span class="lnt">175
</span><span class="lnt">176
</span><span class="lnt">177
</span><span class="lnt">178
</span><span class="lnt">179
</span><span class="lnt">180
</span><span class="lnt">181
</span><span class="lnt">182
</span><span class="lnt">183
</span><span class="lnt">184
</span><span class="lnt">185
</span><span class="lnt">186
</span><span class="lnt">187
</span><span class="lnt">188
</span><span class="lnt">189
</span><span class="lnt">190
</span><span class="lnt">191
</span><span class="lnt">192
</span><span class="lnt">193
</span><span class="lnt">194
</span><span class="lnt">195
</span><span class="lnt">196
</span><span class="lnt">197
</span><span class="lnt">198
</span><span class="lnt">199
</span><span class="lnt">200
</span><span class="lnt">201
</span><span class="lnt">202
</span><span class="lnt">203
</span><span class="lnt">204
</span><span class="lnt">205
</span><span class="lnt">206
</span><span class="lnt">207
</span><span class="lnt">208
</span><span class="lnt">209
</span><span class="lnt">210
</span><span class="lnt">211
</span><span class="lnt">212
</span><span class="lnt">213
</span><span class="lnt">214
</span><span class="lnt">215
</span><span class="lnt">216
</span><span class="lnt">217
</span><span class="lnt">218
</span><span class="lnt">219
</span><span class="lnt">220
</span><span class="lnt">221
</span><span class="lnt">222
</span><span class="lnt">223
</span><span class="lnt">224
</span><span class="lnt">225
</span><span class="lnt">226
</span><span class="lnt">227
</span><span class="lnt">228
</span><span class="lnt">229
</span><span class="lnt">230
</span><span class="lnt">231
</span><span class="lnt">232
</span><span class="lnt">233
</span><span class="lnt">234
</span><span class="lnt">235
</span><span class="lnt">236
</span><span class="lnt">237
</span><span class="lnt">238
</span><span class="lnt">239
</span><span class="lnt">240
</span><span class="lnt">241
</span><span class="lnt">242
</span><span class="lnt">243
</span><span class="lnt">244
</span><span class="lnt">245
</span><span class="lnt">246
</span><span class="lnt">247
</span><span class="lnt">248
</span><span class="lnt">249
</span><span class="lnt">250
</span><span class="lnt">251
</span><span class="lnt">252
</span><span class="lnt">253
</span><span class="lnt">254
</span><span class="lnt">255
</span><span class="lnt">256
</span><span class="lnt">257
</span><span class="lnt">258
</span><span class="lnt">259
</span><span class="lnt">260
</span><span class="lnt">261
</span><span class="lnt">262
</span><span class="lnt">263
</span><span class="lnt">264
</span><span class="lnt">265
</span><span class="lnt">266
</span><span class="lnt">267
</span><span class="lnt">268
</span><span class="lnt">269
</span><span class="lnt">270
</span><span class="lnt">271
</span><span class="lnt">272
</span><span class="lnt">273
</span><span class="lnt">274
</span><span class="lnt">275
</span><span class="lnt">276
</span><span class="lnt">277
</span><span class="lnt">278
</span><span class="lnt">279
</span><span class="lnt">280
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{ define &#34;main&#34; }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">main</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;main post-single&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;toots-page&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">header</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;page-header&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>{{ .Title }}<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{ with .Description }}
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">p</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;page-description&#34;</span><span class="p">&gt;</span>{{ . }}<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{ end }}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;toots-container&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;toots&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;load-more-wrapper&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">button</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;load-more-btn&#34;</span><span class="p">&gt;</span>加载更多嘟文<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">tootsData</span> <span class="o">=</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">displayedCount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">pageSize</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> <span class="c1">// 每次加载条数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ✅ 加载嘟文
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kr">async</span> <span class="kd">function</span> <span class="nx">loadToots</span><span class="p">(</span><span class="nx">initial</span><span class="o">=</span><span class="kc">false</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">initial</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="c1">// 请注意：如果您要使用 Cloudflare Worker，这里的 URL 应该是您的 Worker URL，而不是原始 Mastodon/GoToSocial 实例的 URL。
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>      <span class="c1">// 假设您的 Worker 地址是 https://worker.yourdomain.com/api/v1/accounts/01M4A5Q58VD6GJH97T2TE6W25J/statuses?exclude_reblogs=true
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>      <span class="kr">const</span> <span class="nx">url</span> <span class="o">=</span> <span class="s2">&#34;https://toots.iliu.org/api/v1/accounts/01M4A5Q58VD6GJH97T2TE6W25J/statuses?exclude_reblogs=true&#34;</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">      <span class="kr">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="nx">url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="nx">tootsData</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;toots-container&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">nextToots</span> <span class="o">=</span> <span class="nx">tootsData</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="nx">displayedCount</span><span class="p">,</span> <span class="nx">displayedCount</span> <span class="o">+</span> <span class="nx">pageSize</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kr">const</span> <span class="nx">t</span> <span class="k">of</span> <span class="nx">nextToots</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="kr">const</span> <span class="nx">date</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="nx">t</span><span class="p">.</span><span class="nx">created_at</span><span class="p">).</span><span class="nx">toLocaleString</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="kr">const</span> <span class="nx">username</span> <span class="o">=</span> <span class="nx">t</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">display_name</span> <span class="o">||</span> <span class="nx">t</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">username</span> <span class="o">||</span> <span class="s2">&#34;匿名&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="kr">const</span> <span class="nx">avatar</span> <span class="o">=</span> <span class="nx">t</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">avatar</span> <span class="o">||</span> <span class="s2">&#34;https://l22.org/path-to-default-avatar.png&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c1">// ✅ 九宫格多图布局
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>      <span class="kd">let</span> <span class="nx">mediaHTML</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="nx">t</span><span class="p">.</span><span class="nx">media_attachments</span> <span class="o">&amp;&amp;</span> <span class="nx">t</span><span class="p">.</span><span class="nx">media_attachments</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">mediaHTML</span> <span class="o">=</span> <span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;div class=&#34;toot-media-grid&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            </span><span class="si">${</span><span class="nx">t</span><span class="p">.</span><span class="nx">media_attachments</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">m</span> <span class="p">=&gt;</span> <span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">              &lt;div class=&#34;toot-media-item&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                &lt;img src=&#34;</span><span class="si">${</span><span class="nx">m</span><span class="p">.</span><span class="nx">preview_url</span> <span class="o">||</span> <span class="nx">m</span><span class="p">.</span><span class="nx">url</span><span class="si">}</span><span class="sb">&#34; alt=&#34;</span><span class="si">${</span><span class="nx">m</span><span class="p">.</span><span class="nx">description</span> <span class="o">||</span> <span class="s1">&#39;&#39;</span><span class="si">}</span><span class="sb">&#34; loading=&#34;lazy&#34; onclick=&#34;showLightbox(&#39;</span><span class="si">${</span><span class="nx">m</span><span class="p">.</span><span class="nx">url</span><span class="si">}</span><span class="sb">&#39;)&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">              &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            `</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">        `</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c1">// 🚨 【修复点】直接使用 Worker 预取的 t.replies 数据来构建回复内容
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>      <span class="kd">let</span> <span class="nx">repliesHTML</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="nx">t</span><span class="p">.</span><span class="nx">replies</span> <span class="o">&amp;&amp;</span> <span class="nx">t</span><span class="p">.</span><span class="nx">replies</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">repliesHTML</span> <span class="o">=</span> <span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;div class=&#34;toot-replies&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            </span><span class="si">${</span><span class="nx">t</span><span class="p">.</span><span class="nx">replies</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">r</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">              <span class="kr">const</span> <span class="nx">avatar</span> <span class="o">=</span> <span class="nx">r</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">avatar</span> <span class="o">||</span> <span class="s2">&#34;https://l22.org/path-to-default-avatar.png&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">              <span class="kr">const</span> <span class="nx">name</span> <span class="o">=</span> <span class="nx">r</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">display_name</span> <span class="o">||</span> <span class="nx">r</span><span class="p">.</span><span class="nx">account</span><span class="o">?</span><span class="p">.</span><span class="nx">username</span> <span class="o">||</span> <span class="s2">&#34;匿名&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">              <span class="k">return</span> <span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">                &lt;div class=&#34;toot-reply&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                  &lt;img src=&#34;</span><span class="si">${</span><span class="nx">avatar</span><span class="si">}</span><span class="sb">&#34; class=&#34;toot-reply-avatar&#34; alt=&#34;</span><span class="si">${</span><span class="nx">name</span><span class="si">}</span><span class="sb">&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                  &lt;div class=&#34;toot-reply-body&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                    &lt;strong&gt;</span><span class="si">${</span><span class="nx">name</span><span class="si">}</span><span class="sb">&lt;/strong&gt;：</span><span class="si">${</span><span class="nx">r</span><span class="p">.</span><span class="nx">content</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">                  &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">              `</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="si">}</span><span class="sb">).join(&#39;&#39;)}
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">        `</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">t</span><span class="p">.</span><span class="nx">replies_count</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// 如果 Worker 没有返回 replies 但计数大于 0，可能是 Worker 拉取回复失败
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="nx">repliesHTML</span> <span class="o">=</span> <span class="sb">`&lt;div class=&#34;toot-replies&#34;&gt;&lt;p class=&#39;no-reply&#39;&gt;暂无回复（或Worker拉取失败）&lt;/p&gt;&lt;/div&gt;`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="kr">const</span> <span class="nx">tootHTML</span> <span class="o">=</span> <span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">        &lt;article class=&#34;toot-card&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;div class=&#34;toot-header&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            &lt;img class=&#34;toot-avatar&#34; src=&#34;</span><span class="si">${</span><span class="nx">avatar</span><span class="si">}</span><span class="sb">&#34; alt=&#34;</span><span class="si">${</span><span class="nx">username</span><span class="si">}</span><span class="sb">&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            &lt;span class=&#34;toot-username&#34;&gt;</span><span class="si">${</span><span class="nx">username</span><span class="si">}</span><span class="sb">&lt;/span&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;div class=&#34;toot-date&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            &lt;a href=&#34;</span><span class="si">${</span><span class="nx">t</span><span class="p">.</span><span class="nx">url</span><span class="si">}</span><span class="sb">&#34; target=&#34;_blank&#34;&gt;</span><span class="si">${</span><span class="nx">date</span><span class="si">}</span><span class="sb">&lt;/a&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;div class=&#34;toot-content&#34;&gt;</span><span class="si">${</span><span class="nx">t</span><span class="p">.</span><span class="nx">content</span><span class="si">}</span><span class="sb">&lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">          </span><span class="si">${</span><span class="nx">mediaHTML</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;div class=&#34;toot-footer&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">            ❤️ </span><span class="si">${</span><span class="nx">t</span><span class="p">.</span><span class="nx">favourites_count</span><span class="si">}</span><span class="sb">　🔁 </span><span class="si">${</span><span class="nx">t</span><span class="p">.</span><span class="nx">reblogs_count</span><span class="si">}</span><span class="sb">　💬 </span><span class="si">${</span><span class="nx">t</span><span class="p">.</span><span class="nx">replies_count</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">          &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">          </span><span class="si">${</span><span class="nx">repliesHTML</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb">        &lt;/article&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">      `</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nx">container</span><span class="p">.</span><span class="nx">insertAdjacentHTML</span><span class="p">(</span><span class="s2">&#34;beforeend&#34;</span><span class="p">,</span> <span class="nx">tootHTML</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      
</span></span><span class="line"><span class="cl">      <span class="c1">// 🚨 【修复点】移除了原有的 loadReplies(t.id) 调用
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">displayedCount</span> <span class="o">+=</span> <span class="nx">pageSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;load-more-btn&#34;</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="nx">displayedCount</span> <span class="o">&gt;=</span> <span class="nx">tootsData</span><span class="p">.</span><span class="nx">length</span> <span class="o">?</span> <span class="s2">&#34;none&#34;</span> <span class="o">:</span> <span class="s2">&#34;inline-block&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// 🚨 【修复点】移除了 loadReplies 函数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ✅ 初次加载
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;load-more-btn&#34;</span><span class="p">).</span><span class="nx">onclick</span> <span class="o">=</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="nx">loadToots</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="nx">loadToots</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// ✅ 简易图片灯箱
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kd">function</span> <span class="nx">showLightbox</span><span class="p">(</span><span class="nx">src</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">lightbox</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;lightbox&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">lightbox</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">lightbox</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&#34;div&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="nx">lightbox</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&#34;lightbox&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="nx">lightbox</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="sb">`&lt;img id=&#34;lightbox-img&#34;&gt;&lt;span id=&#34;lightbox-close&#34;&gt;×&lt;/span&gt;`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">lightbox</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;lightbox-close&#34;</span><span class="p">).</span><span class="nx">onclick</span> <span class="o">=</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="nx">lightbox</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="s2">&#34;show&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="nx">lightbox</span><span class="p">.</span><span class="nx">onclick</span> <span class="o">=</span> <span class="nx">e</span> <span class="p">=&gt;</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span> <span class="o">===</span> <span class="nx">lightbox</span><span class="p">)</span> <span class="nx">lightbox</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="s2">&#34;show&#34;</span><span class="p">);</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;lightbox-img&#34;</span><span class="p">).</span><span class="nx">src</span> <span class="o">=</span> <span class="nx">src</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">lightbox</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s2">&#34;show&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* 容器样式 */</span>
</span></span><span class="line"><span class="cl">  <span class="p">#</span><span class="nn">toots-container</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">flex-direction</span><span class="p">:</span> <span class="kc">column</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">gap</span><span class="p">:</span> <span class="mf">1.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-top</span><span class="p">:</span> <span class="mi">2</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c">/* 嘟文卡片 */</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-card</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">background</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">entry</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">radius</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span> <span class="mf">1.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">shadow</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">transition</span><span class="p">:</span> <span class="k">transform</span> <span class="mf">.2</span><span class="kt">s</span> <span class="kc">ease</span><span class="p">,</span> <span class="k">box-shadow</span> <span class="mf">.2</span><span class="kt">s</span> <span class="kc">ease</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-card</span><span class="p">:</span><span class="nd">hover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">transform</span><span class="p">:</span> <span class="nb">translateY</span><span class="p">(</span><span class="mi">-2</span><span class="kt">px</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">shadow</span><span class="o">-</span><span class="n">hover</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-header</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">align-items</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">gap</span><span class="p">:</span> <span class="mf">0.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-bottom</span><span class="p">:</span> <span class="mf">0.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-avatar</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">width</span><span class="p">:</span> <span class="mi">36</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">height</span><span class="p">:</span> <span class="mi">36</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">50</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">object-fit</span><span class="p">:</span> <span class="kc">cover</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-username</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-weight</span><span class="p">:</span> <span class="kc">bold</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">primary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-date</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">.85</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">secondary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-bottom</span><span class="p">:</span> <span class="mf">.25</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-content</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">primary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">line-height</span><span class="p">:</span> <span class="mf">1.6</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">overflow-wrap</span><span class="p">:</span> <span class="kc">break-word</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c">/* 九宫格多图 */</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-media-grid</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">grid-template-columns</span><span class="p">:</span> <span class="nf">repeat</span><span class="p">(</span><span class="kc">auto</span><span class="o">-</span><span class="kc">fill</span><span class="p">,</span> <span class="nf">minmax</span><span class="p">(</span><span class="mi">100</span><span class="kt">px</span><span class="p">,</span> <span class="mi">1</span><span class="n">fr</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="k">gap</span><span class="p">:</span> <span class="mi">4</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-top</span><span class="p">:</span> <span class="mf">.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-media-item</span> <span class="nt">img</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">width</span><span class="p">:</span> <span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">height</span><span class="p">:</span> <span class="mi">100</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">object-fit</span><span class="p">:</span> <span class="kc">cover</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">6</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">cursor</span><span class="p">:</span> <span class="kc">pointer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">transition</span><span class="p">:</span> <span class="k">transform</span> <span class="mf">.2</span><span class="kt">s</span> <span class="kc">ease</span><span class="p">,</span> <span class="k">opacity</span> <span class="mf">.3</span><span class="kt">s</span> <span class="kc">ease</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-media-item</span> <span class="nt">img</span><span class="p">:</span><span class="nd">hover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">transform</span><span class="p">:</span> <span class="nb">scale</span><span class="p">(</span><span class="mf">1.05</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">opacity</span><span class="p">:</span> <span class="mf">.9</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c">/* 回复样式 */</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-replies</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-top</span><span class="p">:</span> <span class="mf">.75</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-left</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">border</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding-left</span><span class="p">:</span> <span class="mf">.75</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-reply</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">align-items</span><span class="p">:</span> <span class="kc">flex-start</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">gap</span><span class="p">:</span> <span class="mf">.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-top</span><span class="p">:</span> <span class="mf">.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-reply-avatar</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">width</span><span class="p">:</span> <span class="mi">28</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">height</span><span class="p">:</span> <span class="mi">28</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">50</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">toot-reply-body</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">.9</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">line-height</span><span class="p">:</span> <span class="mf">1.4</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">no-reply</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">secondary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mf">.85</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c">/* 加载更多按钮 */</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">load-more-wrapper</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">text-align</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin</span><span class="p">:</span> <span class="mi">2</span><span class="kt">rem</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">#</span><span class="nn">load-more-btn</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding</span><span class="p">:</span> <span class="mf">.6</span><span class="kt">rem</span> <span class="mf">1.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">9999</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">background</span><span class="p">:</span> <span class="nb">linear-gradient</span><span class="p">(</span><span class="mi">90</span><span class="kt">deg</span><span class="p">,</span> <span class="mh">#1e90ff</span><span class="p">,</span> <span class="mh">#0066cc</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="mh">#fff</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">cursor</span><span class="p">:</span> <span class="kc">pointer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span> <span class="mi">3</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mf">.1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">transition</span><span class="p">:</span> <span class="kc">all</span> <span class="mf">.3</span><span class="kt">s</span> <span class="kc">ease</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">#</span><span class="nn">load-more-btn</span><span class="p">:</span><span class="nd">hover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">transform</span><span class="p">:</span> <span class="nb">translateY</span><span class="p">(</span><span class="mi">-2</span><span class="kt">px</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span> <span class="mi">5</span><span class="kt">px</span> <span class="mi">15</span><span class="kt">px</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mf">.2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c">/* 灯箱样式 */</span>
</span></span><span class="line"><span class="cl">  <span class="p">#</span><span class="nn">lightbox</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">position</span><span class="p">:</span> <span class="kc">fixed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">inset</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">background</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mf">0.8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">justify-content</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">align-items</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">z-index</span><span class="p">:</span> <span class="mi">9999</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">#</span><span class="nn">lightbox</span><span class="p">.</span><span class="nc">show</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">#</span><span class="nn">lightbox</span> <span class="nt">img</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">max-width</span><span class="p">:</span> <span class="mi">90</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">max-height</span><span class="p">:</span> <span class="mi">85</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">8</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">15</span><span class="kt">px</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mf">.5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">#</span><span class="nn">lightbox-close</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">position</span><span class="p">:</span> <span class="kc">absolute</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">top</span><span class="p">:</span> <span class="mi">20</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">right</span><span class="p">:</span> <span class="mi">30</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mi">2</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="mh">#fff</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">cursor</span><span class="p">:</span> <span class="kc">pointer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">@</span><span class="k">media</span> <span class="o">(</span><span class="nt">prefers-color-scheme</span><span class="o">:</span> <span class="nt">dark</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="nc">toot-card</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">background</span><span class="p">:</span> <span class="mh">#1c1c1c</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{ end }}
</span></span></code></pre></td></tr></table>
</div>
</div></details>
<h3 id="生成页面">生成页面</h3>
<p>运行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">hugo server
</span></span></code></pre></td></tr></table>
</div>
</div><p>访问：
👉 http://localhost:1313/toots/
即可看到自动加载的嘟文列表。
部署后访问 https://你的博客域名/toots/ 就能看到相同效果。
我是把CSS和模板写到了一起，有兴趣的可以把CSS单独弄一个文件，还会更简练。</p>
]]></content:encoded>
    </item>
    <item>
      <title>给Hugo PaperMod主题添加一个漂亮又简洁的友情链接页面</title>
      <link>https://www.iliu.org/posts/add-a-beautiful-and-simple-links-page-to-the-hugo-papermod-theme/</link>
      <pubDate>Mon, 13 Oct 2025 15:45:49 +0800</pubDate>
      <guid>https://www.iliu.org/posts/add-a-beautiful-and-simple-links-page-to-the-hugo-papermod-theme/</guid>
      <description>&lt;p&gt;PaperMod 默认是极简风格，没有自带“友情链接（Friends / Links）”页，但是我们博主也不是互联网的孤岛，总有一些自己喜欢的左邻右舍，最简单的方法是用生成一个页面来作为友情链接页面，但是太丑了。老刘结合chatgpt，自己添加一个漂亮的友情链接页面，下面是 详细教程（以 Hugo + PaperMod 为例）：&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>PaperMod 默认是极简风格，没有自带“友情链接（Friends / Links）”页，但是我们博主也不是互联网的孤岛，总有一些自己喜欢的左邻右舍，最简单的方法是用生成一个页面来作为友情链接页面，但是太丑了。老刘结合chatgpt，自己添加一个漂亮的友情链接页面，下面是 详细教程（以 Hugo + PaperMod 为例）：</p>
<h3 id="一创建友情链接页面">一、创建友情链接页面</h3>
<p>在你的 Hugo 项目根目录执行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo new friends/_index.md
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>这会在 content/friends/_index.md 生成文件。
打开该文件，修改为：</p></blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;友情链接&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">layout</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;friends&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;那些值得一去的好地方&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>（ 注意： layout 是我们下一步要创建的模板文件名。）</p>
<h3 id="二创建页面模板">二、创建页面模板</h3>
<p>PaperMod 的页面模板位于：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">themes/PaperMod/layouts/
</span></span></code></pre></td></tr></table>
</div>
</div><p>但我们不直接改主题文件（避免主题升级覆盖），而是复制到你的项目中：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p layouts/_default
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后创建一个新模板文件：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nano layouts/_default/friends.html
</span></span></code></pre></td></tr></table>
</div>
</div><p>写入以下示例模板（简洁、与 PaperMod 风格一致）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{ define &#34;main&#34; }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">main</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;main-content&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;main-content&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">article</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;post-single&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">header</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;post-header&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">     
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">h1</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;post-title&#34;</span><span class="p">&gt;</span>{{ .Title }}<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      {{ with .Params.summary }}
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">p</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;post-description&#34;</span><span class="p">&gt;</span>{{ . }}<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      {{ end }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">friend-links</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">grid-template-columns</span><span class="p">:</span> <span class="nf">repeat</span><span class="p">(</span><span class="kc">auto</span><span class="o">-</span><span class="kc">fill</span><span class="p">,</span> <span class="nf">minmax</span><span class="p">(</span><span class="mi">280</span><span class="kt">px</span><span class="p">,</span> <span class="mi">1</span><span class="n">fr</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">  <span class="k">gap</span><span class="p">:</span> <span class="mf">1.2</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin-top</span><span class="p">:</span> <span class="mf">1.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">friend-card</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">align-items</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mf">0.75</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">entry</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span> <span class="mi">1</span><span class="kt">px</span> <span class="mi">3</span><span class="kt">px</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mf">0.1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">transition</span><span class="p">:</span> <span class="kc">all</span> <span class="mf">0.25</span><span class="kt">s</span> <span class="kc">ease</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">friend-card</span><span class="p">:</span><span class="nd">hover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">transform</span><span class="p">:</span> <span class="nb">translateY</span><span class="p">(</span><span class="mi">-4</span><span class="kt">px</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span> <span class="mi">4</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mf">0.15</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">friend-card</span> <span class="nt">img</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">width</span><span class="p">:</span> <span class="mi">3</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">height</span><span class="p">:</span> <span class="mi">3</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mi">9999</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin-right</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">friend-card</span> <span class="p">.</span><span class="nc">text-gray-600</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">secondary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;post-content&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      {{ .Content }}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;friend-links grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4 mt-6&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{ range .Site.Data.friends }}
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ .url }}&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;noopener&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;friend-card flex items-center p-4 rounded-xl shadow-sm hover:shadow-md transition&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;{{ .avatar }}&#34;</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;{{ .name }}&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;w-12 h-12 rounded-full mr-4&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;font-semibold&#34;</span><span class="p">&gt;</span>{{ .name }}<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;text-sm text-gray-600&#34;</span><span class="p">&gt;</span>{{ .desc }}<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{ end }}
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{ end }}
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="三创建数据文件友情链接信息">三、创建数据文件（友情链接信息）</h3>
<p>在项目根目录新建：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">data/friends.yml
</span></span></code></pre></td></tr></table>
</div>
</div><p>添加如下内容（你可以随意扩展）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;PaperMod 官方&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://github.com/adityatelange/hugo-PaperMod&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">avatar</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://avatars.githubusercontent.com/u/21258296?v=4&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">desc</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;简洁优雅的 Hugo 主题&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Hugo 官网&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://gohugo.io/&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">avatar</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://gohugo.io/images/hugo-logo-wide.svg&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">desc</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;世界上最快的静态网站生成器&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;老刘博客&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://iliu.org/&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">avatar</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://iliu.org/img/apple-touch-icon.png/&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">desc</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;分享我的思考与生活&#34;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="四将友情链接加入导航栏">四、将“友情链接”加入导航栏</h3>
<p>打开 config.yml 或 config.toml（根据你使用的格式），找到菜单配置部分：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">menu</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">main</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">identifier</span><span class="p">:</span><span class="w"> </span><span class="l">friends</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">友情链接</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="l">/friends/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">30</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="五重新生成并预览">五、重新生成并预览</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo server -D
</span></span></code></pre></td></tr></table>
</div>
</div><p>打开浏览器访问：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">http://localhost:1313/friends/
</span></span></code></pre></td></tr></table>
</div>
</div><p>即可看到一个简洁、卡片式的友情链接页面，与 PaperMod 风格一致。
具体风格可以参考：
<a href="https://iliu.org/friends/">老刘博客</a></p>
<p>通过以上步骤，你就成功地为 Hugo PaperMod 主题添加了一个既美观又简洁的友情链接页面。这个页面不仅能增强你的站点互通性，还能提升用户体验。如果你喜欢，也可以根据自己的需求对样式和布局进行进一步的调整和优化。希望这篇文章对你有所帮助！</p>
]]></content:encoded>
    </item>
    <item>
      <title>群晖NAS安装FRP客户端（frpc）</title>
      <link>https://www.iliu.org/posts/install-frpc-on-synology-nas-without-docker/</link>
      <pubDate>Sat, 11 Oct 2025 08:12:42 +0800</pubDate>
      <guid>https://www.iliu.org/posts/install-frpc-on-synology-nas-without-docker/</guid>
      <description>&lt;p&gt;今年5月份的时候，购买了一款搬瓦工的VPS，当时是想用来做博客的VPS，用的是美西的优化线路，速度非常的理想，前几天我又把博客系统转回到了&lt;code&gt;Hugo&lt;/code&gt;，这样这台VPS就空出来了，加上最近群晖的&lt;code&gt;QC&lt;/code&gt;以及&lt;code&gt;tailscale&lt;/code&gt;这些都不太理想，所以我决定使用FRP的方式来穿透群晖。搜了一下网上的教程都是采用的&lt;code&gt;docker&lt;/code&gt;，但是我安装后总是报错，所以研究了一下，采用直接安装的方式，省资源还不容易出错。本文详细介绍如何在用户目录下部署frpc，并实现开机自启。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>今年5月份的时候，购买了一款搬瓦工的VPS，当时是想用来做博客的VPS，用的是美西的优化线路，速度非常的理想，前几天我又把博客系统转回到了<code>Hugo</code>，这样这台VPS就空出来了，加上最近群晖的<code>QC</code>以及<code>tailscale</code>这些都不太理想，所以我决定使用FRP的方式来穿透群晖。搜了一下网上的教程都是采用的<code>docker</code>，但是我安装后总是报错，所以研究了一下，采用直接安装的方式，省资源还不容易出错。本文详细介绍如何在用户目录下部署frpc，并实现开机自启。</p>
<h3 id="一frp-简介">一、FRP 简介</h3>
<p><code>FRP（Fast Reverse Proxy）</code>是一款高性能反向代理应用，可实现 内网穿透。
通过在公网服务器上运行 <code>frps（服务端）</code>，在内网设备上运行 <code>frpc（客户端）</code>，你就可以从外网直接访问局域网中的群晖 DSM、SSH 等服务。</p>
<h3 id="二准备条件">二、准备条件</h3>
<p>一台有公网IP的服务器，这里老刘推荐<a href="https://bandwagonhost.com/aff.php?aff=78194"><code>搬瓦工</code></a>的美西优化线路，速度非常的理想。购买服务器后，安装1panel面板，然后在应用里搜索FRP，安装frps。到这里，你所需要的条件如下：</p>
<ul>
<li>公网服务器 IP（frps）：104.***&hellip;.</li>
<li>认证 token：xxxxx</li>
<li>群晖局域网 IP：192.168.3.19</li>
<li>群晖登录用户：xxxxx</li>
</ul>
<p>token、端口号这些可以在你安装的frps应用里查找。</p>
<h3 id="三在群晖上安装-frpc">三、在群晖上安装 frpc</h3>
<h4 id="1-进入用户目录">1. 进入用户目录</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /var/services/homes/xxxxx
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>放在用户目录无需 root 权限，最安全。</p></blockquote>
<h4 id="2-下载-frpc">2. 下载 frpc</h4>
<h4 id="x86_64-群晖intelamd-平台">x86_64 群晖（Intel/AMD 平台）</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">wget</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">ghproxy</span><span class="o">.</span><span class="n">net</span><span class="o">/</span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">fatedier</span><span class="o">/</span><span class="n">frp</span><span class="o">/</span><span class="n">releases</span><span class="o">/</span><span class="n">download</span><span class="o">/</span><span class="n">v0</span><span class="o">.</span><span class="mf">61.1</span><span class="o">/</span><span class="n">frp_0</span><span class="o">.</span><span class="mf">61.1</span><span class="n">_linux_amd64</span><span class="o">.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="arm64-群晖j-系列或低功耗-nas">ARM64 群晖（J 系列或低功耗 NAS）</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">wget</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">ghproxy</span><span class="o">.</span><span class="n">net</span><span class="o">/</span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">fatedier</span><span class="o">/</span><span class="n">frp</span><span class="o">/</span><span class="n">releases</span><span class="o">/</span><span class="n">download</span><span class="o">/</span><span class="n">v0</span><span class="o">.</span><span class="mf">61.1</span><span class="o">/</span><span class="n">frp_0</span><span class="o">.</span><span class="mf">61.1</span><span class="n">_linux_arm64</span><span class="o">.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>解压并重命名：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tar -zxvf frp_0.61.1_linux_amd64.tar.gz
</span></span><span class="line"><span class="cl">mv frp_0.61.1_linux_amd64 frp
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> frp
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="四创建配置文件">四、创建配置文件</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nano frpc.toml
</span></span></code></pre></td></tr></table>
</div>
</div><p>写入内容：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="nx">serverAddr</span> <span class="p">=</span> <span class="s2">&#34;104.***.***.***&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">serverPort</span> <span class="p">=</span> <span class="mi">7000</span>
</span></span><span class="line"><span class="cl"><span class="nx">auth</span><span class="p">.</span><span class="nx">token</span> <span class="p">=</span> <span class="s2">&#34;xxxxx&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">proxies</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">name</span> <span class="p">=</span> <span class="s2">&#34;synology_web&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">type</span> <span class="p">=</span> <span class="s2">&#34;tcp&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">localIP</span> <span class="p">=</span> <span class="s2">&#34;192.168.3.19&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">localPort</span> <span class="p">=</span> <span class="mi">5000</span>
</span></span><span class="line"><span class="cl"><span class="nx">remotePort</span> <span class="p">=</span> <span class="mi">5000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">proxies</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">name</span> <span class="p">=</span> <span class="s2">&#34;synology_ssh&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">type</span> <span class="p">=</span> <span class="s2">&#34;tcp&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">localIP</span> <span class="p">=</span> <span class="s2">&#34;192.168.3.19&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">localPort</span> <span class="p">=</span> <span class="mi">22</span>
</span></span><span class="line"><span class="cl"><span class="nx">remotePort</span> <span class="p">=</span> <span class="mi">6000</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>保存退出。</p>
<h3 id="五测试运行">五、测试运行</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./frpc -c ./frpc.toml
</span></span></code></pre></td></tr></table>
</div>
</div><p>若看到：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">start proxy success
</span></span></code></pre></td></tr></table>
</div>
</div><p>说明连接成功。</p>
<h3 id="六后台运行可选">六、后台运行（可选）</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nohup ./frpc -c ./frpc.toml &gt; frpc.log 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">&amp;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>查看日志：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">tail -f frpc.log
</span></span></code></pre></td></tr></table>
</div>
</div><p>停止运行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ps aux <span class="p">|</span> grep frpc
</span></span><span class="line"><span class="cl"><span class="nb">kill</span> <span class="o">[</span>进程号<span class="o">]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="七开机自启可选">七、开机自启（可选）</h3>
<ol>
<li>DSM → 控制面板 → 计划任务 → 创建 → “触发的任务” → “用户定义的脚本”</li>
<li>用户选择 xxxxx或者root</li>
<li>脚本内容：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">/</span><span class="k">var</span><span class="o">/</span><span class="n">services</span><span class="o">/</span><span class="n">homes</span><span class="o">/</span><span class="n">xxxxx</span><span class="o">/</span><span class="n">frp</span><span class="o">/</span><span class="n">frpc</span> <span class="o">-</span><span class="n">c</span> <span class="o">/</span><span class="k">var</span><span class="o">/</span><span class="n">services</span><span class="o">/</span><span class="n">homes</span><span class="o">/</span><span class="n">xxxxx</span><span class="o">/</span><span class="n">frp</span><span class="o">/</span><span class="n">frpc</span><span class="o">.</span><span class="n">toml</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ol>
<li>保存并勾选“启动时运行”</li>
</ol>
<h3 id="八验证连接">八、验证连接</h3>
<p>在外网访问：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">http://公网服务器IP:5000
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果配置了 SSH 通道：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">ssh xxxxx@公网服务器IP -p 6000
</span></span></code></pre></td></tr></table>
</div>
</div><p>即可远程登录群晖。</p>
<h3 id="-总结">✅ 总结</h3>
<ul>
<li>所有文件都放在 用户目录下，无需 root 权限</li>
<li>支持 DSM 重启后自动运行</li>
<li>安装简单、权限安全、长期稳定</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Ubuntu24.04安装Windterm</title>
      <link>https://www.iliu.org/ubuntu-24-04-install-windterm/</link>
      <pubDate>Thu, 02 Oct 2025 10:33:29 +0800</pubDate>
      <guid>https://www.iliu.org/ubuntu-24-04-install-windterm/</guid>
      <description>&lt;p&gt;经过这一段时间的使用Linux，我发现确实是可以满足我日常的使用。系统也流畅，再没有了之前使用Windows 11的时候偶尔的卡顿，决定长期使用了。既然要长期使用那么EndeavourOS就不是太适合了，毕竟这个以Archlinux为基础的系统，追求的是新而不是稳定。所以我决定换成Ubuntu，而之前科学软件换了一款之后，影响我使用的因素也不存在了。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>经过这一段时间的使用Linux，我发现确实是可以满足我日常的使用。系统也流畅，再没有了之前使用Windows 11的时候偶尔的卡顿，决定长期使用了。既然要长期使用那么EndeavourOS就不是太适合了，毕竟这个以Archlinux为基础的系统，追求的是新而不是稳定。所以我决定换成Ubuntu，而之前科学软件换了一款之后，影响我使用的因素也不存在了。</p>
<p>换了Ubuntu之后，我常用的微信，wps，anytype等软件都有deb的安装包，只有windterm是源码的形式。没法直接点击安装，当然，可以在终端中用命令直接打开，但是不是很方便。找了一下网上的方法，也没有能很好的解决，最终还是借助ai,才安装成功。如下：</p>
<h2 id="下载">下载</h2>
<p>在这里下载最新的源码：<a href="https://github.com/kingToolbox/WindTerm?ref=iliu.org">https://github.com/kingToolbox/WindTerm</a></p>
<h2 id="安装">安装</h2>
<p>首先在opt下建立一个叫windterm的文件夹，把刚才下载的源代码解压复制过去。然后按下列步骤进行：</p>
<h3 id="1-给可执行权限">1. 给可执行权限</h3>
<p>进入目录，确保主程序能运行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/windterm 
</span></span><span class="line"><span class="cl">sudo chmod +x WindTerm
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/opt/windterm/WindTerm
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果能启动，就说明没有问题</p>
<h3 id="建立软链接让你直接用-windterm-启动可选">建立软链接（让你直接用 windterm 启动）（可选）</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo ln -s /opt/windterm/WindTerm /usr/local/bin/windterm
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">windterm
</span></span></code></pre></td></tr></table>
</div>
</div><p>之后在终端输入这个命令，就能直接用了</p>
<h3 id="创建桌面图标应用菜单里显示">创建桌面图标（应用菜单里显示）</h3>
<p>新建一个 .desktop 文件：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo nano /usr/share/applications/windterm.desktop
</span></span></code></pre></td></tr></table>
</div>
</div><p>输入以下内容：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[Desktop Entry]</span>
</span></span><span class="line"><span class="cl"><span class="na">Name</span><span class="o">=</span><span class="s">WindTerm</span>
</span></span><span class="line"><span class="cl"><span class="na">Exec</span><span class="o">=</span><span class="s">/opt/windterm/WindTerm</span>
</span></span><span class="line"><span class="cl"><span class="na">Icon</span><span class="o">=</span><span class="s">/opt/windterm/windterm.png</span>
</span></span><span class="line"><span class="cl"><span class="na">Type</span><span class="o">=</span><span class="s">Application</span>
</span></span><span class="line"><span class="cl"><span class="na">Categories</span><span class="o">=</span><span class="s">Utility;TerminalEmulator;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>保存并退出。然后刷新数据库：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo update-desktop-database
</span></span></code></pre></td></tr></table>
</div>
</div><p>现在你就可以在应用菜单里找到 <strong>WindTerm</strong> 了。</p>
<p>ubuntu-24-04-install-windterm</p>
]]></content:encoded>
    </item>
    <item>
      <title>从 Windows 到 Linux：重新体验的过程与心得</title>
      <link>https://www.iliu.org/from-windows-to-linux-the-process-and-insights-of-re-experiencing/</link>
      <pubDate>Tue, 23 Sep 2025 10:13:07 +0800</pubDate>
      <guid>https://www.iliu.org/from-windows-to-linux-the-process-and-insights-of-re-experiencing/</guid>
      <description>&lt;p&gt;几年前，我使用过一段时间Linux，后来因为没有官方的微信客户端，并且每三个月需要报税的软件只能在Windows上使用，所以我放弃了Linux，转而使用了Windows 11，过了几年，便懒得再折腾。最近，电脑偶尔会出现卡顿的情况，每次都需要重启才能解决。我曾经重置过系统，但问题依然没有得到彻底解决。恰好，我看到某位博友写的主力使用Ubuntu24的博客，因此，我决定重新尝试使用Linux，毕竟我的电脑使用场景非常简单，除了偶尔报税，其它基本需求都能在Linux下实现。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>几年前，我使用过一段时间Linux，后来因为没有官方的微信客户端，并且每三个月需要报税的软件只能在Windows上使用，所以我放弃了Linux，转而使用了Windows 11，过了几年，便懒得再折腾。最近，电脑偶尔会出现卡顿的情况，每次都需要重启才能解决。我曾经重置过系统，但问题依然没有得到彻底解决。恰好，我看到某位博友写的主力使用Ubuntu24的博客，因此，我决定重新尝试使用Linux，毕竟我的电脑使用场景非常简单，除了偶尔报税，其它基本需求都能在Linux下实现。</p>
<h3 id="我的需求">我的需求</h3>
<ol>
<li>写博客：主要使用思源笔记。</li>
<li>上网：浏览网页，查找资料。</li>
<li>微信：官方已经出了客户端，体验基本上和Windows上一致</li>
<li>偶尔结合AI写点小程序：一些简单的开发任务。</li>
<li>每三个月报税一次：这一点只能在Windows下实现。</li>
</ol>
<p>对于我来说，Linux完全可以满足上述需求，除了报税以外，其他都可以在Linux上顺利完成。</p>
<h3 id="选择发行版">选择发行版</h3>
<p>我尝试过几个Linux发行版，分别是：</p>
<ul>
<li>Deepin：虽然其界面精美，但安装过程中出现了问题——将系统烧录到U盘后，安装时屏幕闪烁，无法正常安装，因此我放弃了。</li>
<li>Ubuntu：安装没有问题，系统也非常流畅。不过，由于Snap源中有些软件版本过低，且GitHub上没有直接的deb包，我在使用“科学”时遇到了些许麻烦。同时，安装WPS时，还需要去Windows系统中搞字体，非常繁琐。</li>
<li>EndeavourOS：最终我选择了EndeavourOS，使用GNOME桌面环境。这个发行版的软件更新较为及时，且桌面体验与Ubuntu非常相似。安装和使用都非常顺利，整体性能也非常好。</li>
</ul>
<h3 id="安装过程">安装过程</h3>
<p>现在Linux的安装已经变得非常简单。回想起1999年左右的那段日子，记得我有个室友想尝试安装Linux，结果不但没有成功，还把硬盘搞得无法识别，最后不得不花钱请人来重新分区。现在的安装过程就简单得多了。</p>
<p>我的分区方案如下：</p>
<ul>
<li>Snap分区：8GB</li>
<li>EFI分区：4GB（其实EFI不需要这么大，分区时手滑多了个0，结果就这样了）</li>
<li>系统分区：80GB</li>
<li>Home分区：剩余的全部分配给了Home</li>
</ul>
<p>安装过程也非常简便，选择在线安装后，可以根据需要选择桌面环境。分区完后，只需要按照提示操作就能完成安装。</p>
<h3 id="安装后的使用">安装后的使用</h3>
<p>安装完成后，我就开始配置常用软件了。以下是我目前使用的一些软件：</p>
<ol>
<li>微信：archlinux安装软件现在是非常的方便了，直接用yay命令，省去了到处找软件的步骤，这也是很多人使用Arch Linux的原因。</li>
<li>思源笔记：写博客、做笔记时使用，功能强大且稳定。</li>
<li>SSH客户端（WindTerm）：这是我在Windows下也常用的工具，功能全面，非常推荐。</li>
<li>小狼毫输入法（RIM）：为Linux提供了中文输入支持，配合雾凇拼音方案，和Windows下体验一致</li>
<li>Edge、Chrome浏览器：Microsoft的浏览器在Linux下也运行流畅。</li>
<li>WPS：在Linux上安装WPS办公套件，安装时需要同时安装相关字体，方便使用。</li>
</ol>
<p>例如，如果要安装微信，只需要在终端输入以下命令：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">yay wechat
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后按照提示选择你要安装的软件即可，比macOS和Windows上的软件安装要简单得多。这是我安装完成后的截图：</p>
<p><img loading="lazy" src="https://s2.l22.org/%E6%88%AA%E5%9B%BE%202025-09-23%2009-12-41.png"></p>
<h3 id="总结">总结</h3>
<p>Linux的安装和使用已经变得越来越方便，尤其是对于像我这样需求简单的用户。通过选择EndeavourOS和GNOME桌面，我可以顺利完成日常的写作、上网、使用微信、开发小程序等任务。虽然报税这一场景仍然需要依赖Windows，但除此之外，Linux已经足够满足我的工作和生活需求。</p>
<p>如果你也是个需求简单的用户，或许可以考虑尝试Linux系统。无论是安装过程的简便，还是软件的丰富性，都能给你带来不小的惊喜。</p>
]]></content:encoded>
    </item>
    <item>
      <title>解决腾讯 EdgeOne 域名解析与 SSL 证书申请失败问题</title>
      <link>https://www.iliu.org/troubleshooting-tencent-edgeone-a-dnssec-odyssey/</link>
      <pubDate>Tue, 16 Sep 2025 10:37:19 +0800</pubDate>
      <guid>https://www.iliu.org/troubleshooting-tencent-edgeone-a-dnssec-odyssey/</guid>
      <description>&lt;p&gt;前几个月，我关注到腾讯新推出的 &lt;strong&gt;EdgeOne&lt;/strong&gt; 服务。这款产品无需备案和实名，而且提供免费额度，对于个人网站来说非常友好。刚发布时兑换码一码难求，我并没有太多关注。后来，腾讯推出了一个活动，只要在 X（原 Twitter）上转发推文，就能获得两个兑换码。我成功领取并兑换了一个，并将其用于我的“镜缘轩”网站。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>前几个月，我关注到腾讯新推出的 <strong>EdgeOne</strong> 服务。这款产品无需备案和实名，而且提供免费额度，对于个人网站来说非常友好。刚发布时兑换码一码难求，我并没有太多关注。后来，腾讯推出了一个活动，只要在 X（原 Twitter）上转发推文，就能获得两个兑换码。我成功领取并兑换了一个，并将其用于我的“镜缘轩”网站。</p>
<p>我的“镜缘轩”网站部署在 CloudCone 的 VPS 上，访问速度一直不尽如人意。接入 EdgeOne 后，网站速度有了显著提升，这让我决定将我的博客也套上这个服务。</p>
<h3 id="域名解析遇到的第一个问题cname-扁平化">域名解析遇到的第一个问题：CNAME 扁平化</h3>
<p>在将博客主域名 <code>iliu.org</code> 通过 <strong>CNAME</strong> 解析到 EdgeOne 提供的地址后，我发现 EdgeOne 无法识别解析成功。奇怪的是，“镜缘轩”网站的解析过程却非常顺利。</p>
<p>经过一番排查，我发现问题出在 Cloudflare 的 **CNAME 扁平化（CNAME Flattening）**功能上。由于我的博客使用的是主域名，而 Cloudflare 的免费套餐又不支持自定义 NS 地址，它的 CNAME 扁平化技术导致 EdgeOne 无法正确识别解析。我决定将域名从 Cloudflare 转移出去。</p>
<h3 id="域名转移与-dnssec-冲突">域名转移与 DNSSEC 冲突</h3>
<p>我选择了之前用过的 <strong>Name.com</strong> 作为新的域名注册商。虽然转移费用比 Cloudflare 略贵，但我也能接受。现在想来，当时没有做更多功课，如果选择了 <strong>Spaceship</strong>，或许会是更好的选择。</p>
<p>域名转移到 Name.com 后，EdgeOne 成功识别了 CNAME 解析。然而，我又遇到了新的问题：<strong>SSL 证书申请一直失败</strong>。</p>
<p>我仔细研究了失败原因，发现一些海外的 <strong>DNS 服务器</strong>无法正常解析我的域名。我以为是 DNS 记录同步需要时间，便没有多想。但等了一周后，美国和欧洲的一些 DNS 服务器依然无法解析我的域名。</p>
<h3 id="问题根源dnssec-签名记录冲突">问题根源：DNSSEC 签名记录冲突</h3>
<p>为了找到问题的根源，我向 Gemini 寻求帮助。它建议我使用 <code>dig</code> 命令进行分析。我在终端输入了以下命令：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dig iliu.org A @8.8.8.8
</span></span></code></pre></td></tr></table>
</div>
</div><p>获得的查询结果显示 <code>status: SERVFAIL</code>，并在 <code>EDE</code> 部分提示：<code>10 (RRSIGs Missing)</code>。Gemini 根据这个结果判断，问题出在我的域名 <code>iliu.org</code> 的 <strong>DNSSEC 签名记录配置</strong>上。</p>
<p>原来，我在 Cloudflare 启用过 DNSSEC，这在 <code>.org</code> 域名注册局（如 Afilias）留下了一个 <strong>DS (Delegation Signer)</strong>  记录。这个记录告诉解析器：“这个域名启用了 DNSSEC，请去其权威 DNS 服务器（也就是 Name.com 的服务器）验证签名。”</p>
<p>然而，Name.com 本身<strong>不支持 DNSSEC</strong>。这就导致了矛盾：注册局要求用 DNSSEC 验证，但 Name.com 却无法提供。因此，当海外的 DNS 服务器尝试进行验证时，就会导致解析失败。与此同时，中国大陆和亚洲的一些 DNS 服务器可能由于配置更宽松，所以可以正常解析。</p>
<p>找到问题根源后，我立即登录 Name.com 的后台，找到了 <strong>DNSSEC 设置</strong>并删除了 <strong>DS 记录</strong>。几分钟后，EdgeOne 成功申请了 SSL 证书，困扰我多日的难题也迎刃而解。</p>
<p>希望我的这段经历能帮助遇到类似问题的朋友们少走弯路！</p>
]]></content:encoded>
    </item>
    <item>
      <title>折腾杀毒软件的一点感想</title>
      <link>https://www.iliu.org/thoughts-on-struggling-with-antivirus-software/</link>
      <pubDate>Wed, 27 Aug 2025 09:09:49 +0800</pubDate>
      <guid>https://www.iliu.org/thoughts-on-struggling-with-antivirus-software/</guid>
      <description>&lt;p&gt;前几天，我一直在折腾各种杀毒软件。事情的起因，是一个熟人单位里发生的一起网络诈骗。单位里一位员工因为点击了不明链接，不小心中毒，黑客随即接管了他的钉钉账号。接下来就是老套路：建群、拉人、冒充发工资补贴，让大家输入银行卡号。可别小看这招，受害的人不少，听说损失最大的一位，损失相当的严重。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>前几天，我一直在折腾各种杀毒软件。事情的起因，是一个熟人单位里发生的一起网络诈骗。单位里一位员工因为点击了不明链接，不小心中毒，黑客随即接管了他的钉钉账号。接下来就是老套路：建群、拉人、冒充发工资补贴，让大家输入银行卡号。可别小看这招，受害的人不少，听说损失最大的一位，损失相当的严重。</p>
<p>这件事让我再次意识到，网络安全并不是一个遥远的概念，而是真实发生在身边的风险。尤其最近“银狐木马”在网上泛滥，更让我觉得杀毒软件的重要性不容忽视。</p>
<h3 id="为什么折腾杀毒软件">为什么折腾杀毒软件？</h3>
<p>很多人都说现在病毒少了，而且Windows自带的杀毒软件也足够了，说实话，现在很多新型木马的第一步，就是要绕过 Windows Defender，所以单纯依赖 WD，并不能让人放心。这几天，我几乎把主流的杀毒软件都试了一遍：</p>
<ul>
<li><strong>腾讯 IOA 基础版</strong>：资源占用少，系统流畅；智能弹窗过滤很安静；没有广告；还能后台一键部署到家里的几台电脑；关键是免费（能免费部署500台），而且是腾讯重点发展的项目，检测能力还行，其出身让人感觉不如360等专业的杀毒软件让人心安。</li>
<li><strong>360 企业安全云</strong>：基础功能免费，也没有广告，功能不少，检测能力强，但卸载体验实在糟糕。卸载麻烦不说，卸载后，还会帮你装回 360 卫士，让人心生反感，我都卸载没有广告的了，你自动再帮我装个有广告的，我图啥？而且是强制安装，就这一点，PASS掉。</li>
<li><strong>Avast 免费版</strong>：国外口碑不错，优势是带有免费防火墙，但更新速度不算快，误报率也有点高。其实也不能太怪它，因为国内的一些软件，或多或少的都有一些小动作，被拦截也很正常。这个杀毒软件是免费杀毒里唯一带防火墙的，缺点是有广告，虽然可以去除，但是也有点不爽。</li>
<li><strong>ESET Internet Security</strong>：老牌杀软，轻巧干净，但价格摆在那儿。具卡饭的网友反馈，监控有漏毒的可能，这里是指，扫描可以扫描出来病毒，但是双击文件，可能不会报毒。</li>
<li><strong>卡巴斯基</strong>：检测能力全面，没有短板，但资源占用相对大些。另外就是收费。</li>
<li><strong>火绒</strong>：国产小而美，流畅度极佳，但缺少云查杀和主动防御方面的深度。</li>
<li><strong>McAfee</strong>：流畅，但是不要做全盘扫描，这会卡的怀疑人生。但是缺点是基本上依赖云，但是国内可能连接不畅，导致防护不足。</li>
</ul>
<p>比较下来，我最后还是选择了 IOA。它虽然不是最强的，但综合体验最符合我自己的需求：安静、省心、流畅。</p>
<h3 id="simplewall一个小而美的补充">Simplewall：一个小而美的补充</h3>
<p>除了杀毒软件，我还加装了 <strong>Simplewall</strong>。它是一个体积很小的开源防火墙工具。Windows 自带的防火墙其实功能不少，但问题在于：</p>
<ul>
<li>界面不够直观，普通用户很难看懂规则；</li>
<li>程序联网时，默认不会给出提示，需要手动配置，体验不友好。</li>
</ul>
<p>Simplewall 就很好地弥补了这些弱点：</p>
<ul>
<li>程序要联网时会有明确提示，让你自己决定放行还是阻止；</li>
<li>界面简洁清晰，不复杂；</li>
<li>开源、轻量，不拖慢系统。</li>
</ul>
<p>它和 IOA 这样的杀毒软件搭配起来，就能形成一个比较完整的防护：杀毒软件负责查杀和行为监控，防火墙负责把好“出入口”。</p>
<h3 id="杀毒软件不是万能的">杀毒软件不是万能的</h3>
<p>不过话要说回来，<strong>杀毒软件和防火墙再好，也不是万能的</strong>。很多病毒、木马、诈骗，并不是靠技术，而是靠人性的弱点来得手。那位点击不明链接的员工，如果当时多想一步，也许就不会上当。换句话说，安全软件只能帮你“兜底”，真正的安全，还是靠我们每个人自己的习惯：</p>
<ol>
<li><strong>软件下载要谨慎</strong>：只去官网下载，不要随便在搜索引擎里点广告链接下载。最好检查安装包的数字签名，确认来源可靠。</li>
<li><strong>不要轻信陌生链接</strong>：尤其是在聊天软件、邮件里出现的所谓“补贴”“通知”“优惠”，先验证，再点击。</li>
<li><strong>双重验证很重要</strong>：能开二次验证（手机短信、动态验证码）的账号，都要打开。即便密码泄露，也能挡住一部分攻击。</li>
<li><strong>定期更新系统和软件</strong>：很多漏洞攻击就是利用过时的系统和程序，及时更新比装十个杀毒软件都管用。</li>
<li><strong>保持怀疑</strong>：网络世界里，凡是听起来“好得不真实”的信息，十有八九是陷阱。</li>
</ol>
<h3 id="写在最后">写在最后</h3>
<p>就在写这篇文章之前，博客圈里一位群友分享了他的经历：他在搜索引擎里搜“钉钉下载”，结果下载了一个带病毒的安装包，安装后直接中招。其实，这样的坑很多人都踩过。这也再次提醒我们，除了谨慎之外，装一款靠谱的安全软件，配合合适的防火墙，依然是必要的。</p>
<p>没有哪一款软件能保证“绝对安全”，但我们至少能通过选择合适的工具，加上良好的上网习惯，把风险降到最低。</p>
]]></content:encoded>
    </item>
    <item>
      <title>开箱｜媳妇的华为 Watch Fit 4</title>
      <link>https://www.iliu.org/wifes-huawei-watch-fit-4/</link>
      <pubDate>Sun, 24 Aug 2025 09:06:43 +0800</pubDate>
      <guid>https://www.iliu.org/wifes-huawei-watch-fit-4/</guid>
      <description>&lt;p&gt;妇前段时间去南京学习，回来跟我说起一件事：她的同学戴的手表居然能直接接打电话。她说起的时候眼神里有点心动。她平常其实不太喜欢戴这些东西，更结婚没多久的时候，说想要一块手表，也就戴了一段时间，就收藏了起来了。前几年给她买了一只荣耀手环 7，她戴过一阵子，后来也不戴了。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>妇前段时间去南京学习，回来跟我说起一件事：她的同学戴的手表居然能直接接打电话。她说起的时候眼神里有点心动。她平常其实不太喜欢戴这些东西，更结婚没多久的时候，说想要一块手表，也就戴了一段时间，就收藏了起来了。前几年给她买了一只荣耀手环 7，她戴过一阵子，后来也不戴了。</p>
<p>之所以现在又提出来，大概是和她最近工作有关，最近她们科新开了中医护理门诊，有不少患者是冲着她的刮痧来的，所以有时候满手都是刮痧油的情况下，有电话进来的时候，再取手机确实也不太方便。</p>
<p>于是我在京东上搜了一下。没想到就发现了华为 <strong>Watch Fit 4</strong> ——白色的表带，颜值简洁大方，价格也不算离谱，不到 800 块钱（如果有国补的情况下，还能便宜不少）。几乎一下就戳中了她的需求，于是毫不犹豫下单。</p>
<hr>
<h2 id="开箱过程">开箱过程</h2>
<p>快递很快，盒子不大，正面是手表的渲染图。拆开之后，里面的东西也很简单：</p>
<ul>
<li>手表本体</li>
<li>白色硅胶表带（已经装好）</li>
<li><strong>充电线</strong></li>
<li>使用说明书</li>
</ul>
<p><img loading="lazy" src="https://iliu.org/content/images/2025/08/huawei16_15_50.png"></p>
<p>说实话，这条 <strong>充电线</strong>还挺让我惊艳的。磁吸式的圆形接口，简洁又顺滑，质感比之前那些“夹子式”的手环充电器好太多。小细节里能看出这款手表的精致感。</p>
<hr>
<h2 id="上手体验">上手体验</h2>
<p>手表拿在手里的第一感觉是：比想象中要轻。媳妇戴在手腕上，明显比之前那只黑色的荣耀手环要亮眼许多（钱花到哪，哪就好看，😅），白色的表带很衬肤色，整个人气质一下就柔和了。</p>
<p>开机之后，和她的华为手机一连，就能马上同步信息。最让她开心的，是终于能<strong>直接接打电话</strong>了。对她来说，这可能才是最重要的。</p>
<hr>
<h2 id="功能亮点">功能亮点</h2>
<p>除了接打电话，Watch Fit 4 还有不少实用功能：</p>
<ul>
<li><strong>健康监测</strong>：心率、血氧、睡眠监测都很完整，数据在手机上能直观查看。</li>
<li><strong>运动模式</strong>：支持多种运动追踪，跑步、骑行、健身都有，还能记录消耗和心率区间。</li>
<li><strong>表盘多样化</strong>：媳妇换了几个表盘，发现风格很多，既能走简约路线，也能搞点可爱的元素。</li>
<li><strong>消息提醒</strong>：微信、短信通知都能第一时间看到，不再担心错过重要消息。</li>
<li><strong>快充电池</strong>：充电效率很快，哪怕临时出门前充十几分钟，也能用上一整天。</li>
<li><strong>情绪管理：</strong> 据说可以监控情绪，我和她开玩笑，以后我都要先看一下你的手表再决定如何和你说话，要是情绪不好，我就离你远点😄。</li>
</ul>
<p>这些功能未必每一个都用得上，但有总比没有强。而且手表操作顺畅，界面清晰，没有多余复杂的东西。</p>
<hr>
<h2 id="我的感受">我的感受</h2>
<p>智能手表这种东西，其实功能大同小异。之前那只黑色的手环，除了不能进行通话之外，其实也基本能满足她的要求。只不过一是颜值不好看了，另外就是和手机不是同一品牌还需要另外安装APP，会出现后台杀死App,导致来信息后手环不显示显示的问题。现在这只 Watch Fit 4，颜值到位，功能正好击中需求，我估计她能坚持戴一段时间。</p>
<p>对我来说，800 块买一个媳妇真正喜欢、愿意戴的手表，也能提供不错的情绪价值。</p>
<hr>
<h2 id="小结">小结</h2>
<p>这次开箱算不上什么大件，但对媳妇来说，却是生活里一个小惊喜。她戴上手表的时候笑了笑，说“比手环好看多了”。</p>
<p>我想，这就是所谓的“刚刚好”。</p>
<p>wifes-huawei-watch-fit-4</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ghost 博客与 Mailgun 邮件服务申请全流程</title>
      <link>https://www.iliu.org/complete-setup-process-for-ghost-blog-and-mailgun-email-service/</link>
      <pubDate>Sun, 10 Aug 2025 08:34:35 +0800</pubDate>
      <guid>https://www.iliu.org/complete-setup-process-for-ghost-blog-and-mailgun-email-service/</guid>
      <description>&lt;p&gt;Ghost 的邮件系统与 Mailgun 深度集成，如果想要在 Ghost 上实现邮件订阅、密码找回、通知等功能，申请一个 Mailgun 账户几乎是必选项。好消息是——Mailgun 已经恢复免费套餐，每天可发送 100 封邮件，对个人博客来说完全够用，而且现在&lt;strong&gt;验证信用卡不再是必需&lt;/strong&gt;。坏消息是——Mailgun 的风控依然非常严格，尤其是中国大陆用户，注册和解封过程可能会比较“曲折”。下面是我亲身踩坑并最终申请成功的全过程，希望能帮到你。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ghost 的邮件系统与 Mailgun 深度集成，如果想要在 Ghost 上实现邮件订阅、密码找回、通知等功能，申请一个 Mailgun 账户几乎是必选项。好消息是——Mailgun 已经恢复免费套餐，每天可发送 100 封邮件，对个人博客来说完全够用，而且现在<strong>验证信用卡不再是必需</strong>。坏消息是——Mailgun 的风控依然非常严格，尤其是中国大陆用户，注册和解封过程可能会比较“曲折”。下面是我亲身踩坑并最终申请成功的全过程，希望能帮到你。</p>
<hr>
<h2 id="1-中国大陆能正常访问但注册有坑">1. 中国大陆能正常访问，但注册有坑</h2>
<p>Mailgun 官网在中国大陆是可以直接打开的，但注册过程中会遇到两个大坑：</p>
<ol>
<li><strong>不挂梯子 → 验证码加载不出来</strong>注册页的验证根本就不显示，导致注册按钮点不动。</li>
<li><strong>挂了梯子 → 手机号与 IP 不匹配触发风控</strong>注册时需要验证手机号，如果你的 IP 地址（梯子出口）与手机号所在地区不一致，就很容易被判定为风险账号，触发临时封禁。</li>
</ol>
<hr>
<h2 id="2-常见问题与解决方法">2. 常见问题与解决方法</h2>
<h3 id="收不到验证码">收不到验证码</h3>
<ul>
<li>
<p>进入 <a href="https://help.mailgun.com/hc/en-us/requests/new?ref=iliu.org">Mailgun 工单系统</a></p>
</li>
<li>
<p>类别选择 <strong>Account Management</strong></p>
</li>
<li>
<p>标题示例：I can&rsquo;t verify my email</p>
</li>
<li>
<p>内容示例：I can&rsquo;t verify my email because I clicked the link to enter my mobile phone number, and when I sent the verification code, it reminded me that I sent too many times and other reminders.
This is my phone number: +86 XXX XXXX XXXX</p>
<p>把 XXX XXXX XXXX 换成你自己的手机号即可。（英文机翻没关系，客服看得懂，实测有效）</p>
</li>
</ul>
<hr>
<h3 id="账号被临时锁定">账号被临时锁定</h3>
<p>错误提示：Your account is temporarily disabled. (Account disabled)
Please contact support to resolve.</p>
<p>可以给客服发一封说明邮件（或直接在工单提交），核心是解释你是正常用途、愿意配合验证、并说明中国大陆网络环境的特殊性。<strong>参考邮件模板：</strong> Request for Account Review and Reactivation</p>
<p>Hello Mailgun Support Team,</p>
<p>My account was disabled shortly after registration with the message:
&ldquo;Your account is temporarily disabled. (Account disabled) Please contact support to resolve.&rdquo;
I believe this may have been triggered by the automated fraud prevention system.</p>
<p>I am located in mainland China, where network routing and IP geolocation may sometimes cause unusual patterns in automated checks.</p>
<p>My intended usage is legitimate:</p>
<ul>
<li>Purpose: Sending transactional emails (password resets, notifications) and newsletters for my Ghost-based personal website/blog.</li>
<li>Domain: [yourdomain.com]</li>
<li>Website: <a href="https://yourdomain.com">https://yourdomain.com</a></li>
<li>Recipients: 100% opt-in subscribers, no purchased or scraped mailing lists.</li>
<li>Sending volume: Low to moderate.</li>
</ul>
<p>I am happy to:</p>
<ul>
<li>Provide ID or domain ownership proof.</li>
<li>Bind a valid credit card for verification.</li>
<li>Comply fully with Mailgun’s Acceptable Use Policy and anti-spam requirements.</li>
</ul>
<p>Could you please review and reactivate my account?</p>
<p>Thank you for your understanding and assistance.</p>
<p>Best regards,
[Your Name]
[Your Email Address]
[Your Website Name]</p>
<hr>
<h2 id="3-客服的最终回复与养号期">3. 客服的最终回复与“养号期”</h2>
<p>客服审核后给我的反馈是：账号已恢复，但由于缺少已验证域名和对应的发送历史，暂时保留发送限制(根据ghost论坛的信息，应该是同时只能发送9封邮件)。请先添加并验证域名，然后在 3-5 天内正常发送邮件（收件人必须是有机收集的双重确认用户）。之后可以更新工单申请解除限制。换句话说，即使解封了，也要经历 3-5 天的“养号期”：</p>
<ol>
<li><strong>绑定并验证域名</strong>（添加 DNS 记录）</li>
<li><strong>正常发送邮件</strong>（不要群发垃圾内容）</li>
<li><strong>积累发送历史</strong>（每天发一点）</li>
<li><strong>再次联系支持</strong>，申请解除限制</li>
</ol>
<hr>
<h2 id="4-总结与建议">4. 总结与建议</h2>
<ul>
<li>
<p><strong>注册前准备好：</strong></p>
<ul>
<li>一个稳定的域名（用于验证）</li>
<li>一个能接收验证码的手机号</li>
<li>一个相对干净的 IP</li>
</ul>
</li>
<li>
<p><strong>遇到问题，直接开工单</strong>，说明用途与网络环境。</p>
</li>
<li>
<p><strong>解封后不要急着大批量发信</strong>，先养号几天再申请完全解限。</p>
</li>
</ul>
<hr>
<p>Mailgun 的免费额度每天 100 封邮件，对个人博客来说绰绰有余。虽然注册过程麻烦，但一旦稳定下来，Ghost 邮件功能就能顺畅使用了。如果你正打算为 Ghost 配置邮件服务，不妨先参考这篇经验，少走一些弯路。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ubuntu部署ghost博客所踩的小坑</title>
      <link>https://www.iliu.org/minor-pitfalls-enc-untered-when-deploying-ghost-blog-on-ubuntu/</link>
      <pubDate>Wed, 06 Aug 2025 08:26:28 +0800</pubDate>
      <guid>https://www.iliu.org/minor-pitfalls-enc-untered-when-deploying-ghost-blog-on-ubuntu/</guid>
      <description>&lt;p&gt;Ghost 6.0 发布后，我就被它宣传的“联邦宇宙（Activitypub）”和“内置 Web 分析”功能狠狠吸引了。可惜一直用的 1Panel 面板并没有 Ghost 的升级选项，考虑到 Ghost 6 改动幅度较大，盲猜1Panel里的Docker需要重建，再加上想要尽快体验ghost的联邦宇宙等功能，所以打算用官方推荐的方式“一劳永逸”。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ghost 6.0 发布后，我就被它宣传的“联邦宇宙（Activitypub）”和“内置 Web 分析”功能狠狠吸引了。可惜一直用的 1Panel 面板并没有 Ghost 的升级选项，考虑到 Ghost 6 改动幅度较大，盲猜1Panel里的Docker需要重建，再加上想要尽快体验ghost的联邦宇宙等功能，所以打算用官方推荐的方式“一劳永逸”。</p>
<hr>
<h2 id="换系统换方式">换系统，换方式</h2>
<p>我挑了个快要过期的 VPS 练手，把系统换成了 <strong>Ubuntu 24.04</strong>。结果部署异常顺利，Ghost 6.0 安装一气呵成。于是果断把主 VPS 也重装，迁移博客数据，正式切换新架构。</p>
<p>Ghost 官方推荐部署环境如下：</p>
<ul>
<li>✅ Ubuntu 22.04 或 24.04</li>
<li>✅ MySQL 8+</li>
<li>✅ Node.js v22（<strong>仅支持这个版本</strong>）</li>
<li>✅ Nginx</li>
<li>✅ Ghost-CLI 工具</li>
<li>✅ 一个非 root 的 sudo 用户</li>
</ul>
<hr>
<h2 id="安装步骤ubuntu-2404">安装步骤（Ubuntu 24.04）</h2>
<h3 id="创建非-root-用户">创建非 root 用户</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">adduser ghostuser
</span></span><span class="line"><span class="cl">usermod -aG sudo ghostuser
</span></span><span class="line"><span class="cl">su - ghostuser
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="安装系统依赖">安装系统依赖</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update <span class="o">&amp;&amp;</span> sudo apt upgrade -y
</span></span><span class="line"><span class="cl">sudo apt install nginx mysql-server -y
</span></span><span class="line"><span class="cl">sudo ufw allow <span class="s1">&#39;Nginx Full&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="配置-mysql-密码认证">配置 MySQL 密码认证</h3>
<p>Ghost 不支持 <code>auth_socket</code> 模式，需要切换为 <code>mysql_native_password</code>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo mysql
</span></span><span class="line"><span class="cl">ALTER USER <span class="s1">&#39;root&#39;</span>@<span class="s1">&#39;localhost&#39;</span> IDENTIFIED WITH mysql_native_password BY <span class="s1">&#39;your-password&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">FLUSH PRIVILEGES<span class="p">;</span>
</span></span><span class="line"><span class="cl">EXIT<span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>建议运行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo mysql_secure_installation
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="安装-nodejs-v22">安装 Node.js v22</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install -y ca-certificates curl gnupg
</span></span><span class="line"><span class="cl">sudo mkdir -p /etc/apt/keyrings
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key <span class="p">|</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">NODE_MAJOR</span><span class="o">=</span><span class="m">22</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_</span><span class="nv">$NODE_MAJOR</span><span class="s2">.x nodistro main&#34;</span> <span class="p">|</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  sudo tee /etc/apt/sources.list.d/nodesource.list
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt install -y nodejs
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">node -v <span class="o">&amp;&amp;</span> npm -v
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="-安装-ghost-cli">👻 安装 Ghost-CLI</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo npm install -g ghost-cli
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="创建网站目录并设置权限">创建网站目录并设置权限</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo mkdir -p /var/www/ghost
</span></span><span class="line"><span class="cl">sudo chown ghostuser:ghostuser /var/www/ghost
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /var/www/ghost
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="正式安装-ghost">正式安装 Ghost</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ghost install
</span></span></code></pre></td></tr></table>
</div>
</div><p>安装过程会提示：</p>
<ul>
<li>博客域名（输入完整的 <code>https://xxx.com</code>）</li>
<li>数据库配置</li>
<li>是否自动配置 nginx / SSL / systemd 服务</li>
</ul>
<hr>
<h2 id="踩坑记lets-encrypt-安装失败">踩坑记：Let’s Encrypt 安装失败</h2>
<p>安装 SSL 证书这一步卡住了，错误信息如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-csharp" data-lang="csharp"><span class="line"><span class="cl"><span class="n">Message</span><span class="p">:</span> <span class="n">Command</span> <span class="n">failed</span><span class="p">:</span> <span class="p">/</span><span class="n">bin</span><span class="p">/</span><span class="n">sh</span> <span class="p">-</span><span class="n">c</span> <span class="n">sudo</span> <span class="p">-</span><span class="n">S</span> <span class="p">-</span><span class="n">p</span> <span class="err">&#39;#</span><span class="n">node</span><span class="p">-</span><span class="n">sudo</span><span class="p">-</span><span class="n">passwd</span><span class="err">#&#39;</span>  <span class="p">./</span><span class="n">acme</span><span class="p">.</span><span class="n">sh</span> <span class="p">--</span><span class="n">install</span> <span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="na">[Wed Aug 6 04:16:11 UTC 2025]</span> <span class="n">It</span> <span class="k">is</span> <span class="n">recommended</span> <span class="n">to</span> <span class="n">install</span> <span class="n">crontab</span> <span class="n">first</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="na">[Wed Aug 6 04:16:11 UTC 2025]</span> <span class="n">Pre</span><span class="p">-</span><span class="n">check</span> <span class="n">failed</span><span class="p">,</span> <span class="n">cannot</span> <span class="n">install</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="原因">原因：</h3>
<p>系统没装 <code>cron</code>，Ghost-CLI 在安装 Let’s Encrypt 时依赖 <code>acme.sh</code>，它需要用 cron 来自动续签证书。</p>
<h3 id="解决方法">解决方法：</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install cron
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后重新运行安装：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ghost install ssl
</span></span></code></pre></td></tr></table>
</div>
</div><p>或干脆执行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ghost setup ssl
</span></span></code></pre></td></tr></table>
</div>
</div><p>问题顺利解决。</p>
<hr>
<h2 id="联邦宇宙--web-分析体验反馈">联邦宇宙 &amp; Web 分析体验反馈</h2>
<p>原以为 Ghost 6.0 的“联邦宇宙”和“内置分析”是开箱即用的神器，实际用下来有点不如预期：</p>
<h3 id="-联邦宇宙activitypub">🌐 联邦宇宙（ActivityPub）</h3>
<ul>
<li>✅ 博主可以被 Mastodon 等联邦平台关注，也可以关注他人</li>
<li>❌ 目前<strong>不支持客户端功能</strong></li>
<li>⚠️ 功能还稍微有点粗糙</li>
</ul>
<p>如果你指望 Ghost 成为一个真正“联邦社交平台”，目前还差点火候。</p>
<hr>
<h3 id="-web-analytics">📊 Web Analytics</h3>
<ul>
<li>✅ 轻量级内置分析功能（无需 GA）</li>
<li>❌ <strong>并不是完全“内建”</strong> ，依赖第三方的统计分析</li>
<li>⚠️ 需要额外配置</li>
</ul>
<p>期待的“零配置可视化分析面板”暂时没有出现。</p>
<hr>
<h2 id="-日常维护命令">🧾 日常维护命令</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ghost status       <span class="c1"># 查看服务状态</span>
</span></span><span class="line"><span class="cl">ghost restart      <span class="c1"># 重启 Ghost</span>
</span></span><span class="line"><span class="cl">ghost upgrade      <span class="c1"># 升级 Ghost 和依赖</span>
</span></span><span class="line"><span class="cl">ghost doctor       <span class="c1"># 健康检查</span>
</span></span><span class="line"><span class="cl">ghost setup ssl    <span class="c1"># 重新配置 SSL</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>后台管理地址默认是：<code>https://yourdomain.com/ghost</code></p>
<hr>
<h2 id="总结与建议">总结与建议</h2>
<ul>
<li><strong>Node.js v22 是硬要求</strong>，Ghost 6 只支持它</li>
<li>安装 cron 是配置 SSL 的必要步骤</li>
<li>联邦宇宙 和 Web 分析 功能目前还有较大改进空间</li>
<li>Ghost 依然是一款优秀的写作平台，但不要期望太多“即插即用”社交功能</li>
</ul>
<hr>
<h2 id="最后的话">最后的话</h2>
<p>这次从 1Panel 回归 Ghost 官方部署，虽然中间踩了个 SSL 的坑，整体过程依然算顺利。对我这种写作者来说，Ghost 的速度和极简风格依旧无可替代。</p>
<p>如果你也打算部署 Ghost 6，不妨按照这篇流程一步步来，踩的坑我已经帮你趟过了 😄。</p>
]]></content:encoded>
    </item>
    <item>
      <title>当GitHub二次验证丢失：我的完整恢复经历</title>
      <link>https://www.iliu.org/posts/when-the-2fa-of-github-is-lost/</link>
      <pubDate>Sat, 29 Mar 2025 18:47:24 +0800</pubDate>
      <guid>https://www.iliu.org/posts/when-the-2fa-of-github-is-lost/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;数字时代的噩梦&lt;/strong&gt;：当你精心设置的安全措施反而将你锁在自己的账户之外时，该怎么办？这是一次关于数字资产管理、备份策略和安全实践的深刻教训。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;一灾难降临完美的安全闭环变成死循环&#34;&gt;一、灾难降临：完美的安全闭环变成死循环&lt;/h2&gt;
&lt;h3 id=&#34;11-强制2fa时代的困境&#34;&gt;1.1 强制2FA时代的困境&lt;/h3&gt;
&lt;p&gt;随着GitHub强制实施双重认证，像大多数开发者一样，我选择了自托管的Vaultwarden（Bitwarden开源替代方案）管理TOTP验证码。这个方案看似完美——完全自主控制，既方便又安全。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p><strong>数字时代的噩梦</strong>：当你精心设置的安全措施反而将你锁在自己的账户之外时，该怎么办？这是一次关于数字资产管理、备份策略和安全实践的深刻教训。</p></blockquote>
<h2 id="一灾难降临完美的安全闭环变成死循环">一、灾难降临：完美的安全闭环变成死循环</h2>
<h3 id="11-强制2fa时代的困境">1.1 强制2FA时代的困境</h3>
<p>随着GitHub强制实施双重认证，像大多数开发者一样，我选择了自托管的Vaultwarden（Bitwarden开源替代方案）管理TOTP验证码。这个方案看似完美——完全自主控制，既方便又安全。</p>
<h3 id="12-单点故障的代价">1.2 单点故障的代价</h3>
<p>直到那天，我的NAS存储池突然降级为只读模式，所有Docker服务（包括Vaultwarden）瘫痪。更糟的是：</p>
<ul>
<li>没有备份TOTP种子码</li>
<li>忽略了GitHub的16位恢复码</li>
<li>所有数字资产访问权限被切断</li>
</ul>
<p>&ldquo;安全措施反而成为最大的安全隐患&rdquo;——这一刻我深刻体会到了这句话的含义。</p>
<h2 id="二绝境求生没有恢复码的账户恢复之路">二、绝境求生：没有恢复码的账户恢复之路</h2>
<h3 id="21-常规方案全部失效">2.1 常规方案全部失效</h3>
<table>
  <thead>
      <tr>
          <th>恢复方式</th>
          <th>可用性</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>恢复码</td>
          <td>❌ 未备份</td>
      </tr>
      <tr>
          <td>备用设备</td>
          <td>❌ 单设备配置</td>
      </tr>
      <tr>
          <td>短信验证</td>
          <td>❌ 不支持</td>
      </tr>
  </tbody>
</table>
<h3 id="22-意外发现的救命稻草">2.2 意外发现的救命稻草</h3>
<p>通过深入研究GitHub恢复策略，发现三种替代验证方式：</p>
<ol>
<li><strong>设备验证</strong>（需浏览器保留Cookie）</li>
<li><strong>SSH密钥验证</strong>（开发者专属通道）</li>
<li><strong>个人访问令牌</strong>（PAT）</li>
</ol>
<blockquote>
<p>幸运的是，我部署博客时设置的SSH密钥成为了突破口。</p></blockquote>
<h3 id="23-详细恢复流程实测有效">2.3 详细恢复流程（实测有效）</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 关键步骤：SSH密钥验证</span>
</span></span><span class="line"><span class="cl">ssh -T git@github.com verify
</span></span></code></pre></td></tr></table>
</div>
</div><ol>
<li>访问GitHub恢复页面 → 选择&quot;Try 2FA account recovery&quot;</li>
<li>通过注册邮箱接收一次性密码</li>
<li>选择&quot;SSH Key&quot;验证方式</li>
<li>执行上述命令获取验证码</li>
<li>提交审核（实际处理时间：36小时）</li>
</ol>
<h2 id="三重建更健壮的安全体系">三、重建更健壮的安全体系</h2>
<h3 id="31-立即实施的应急措施">3.1 立即实施的应急措施</h3>
<p>✅ 重新生成TOTP种子码<br>
✅ 多介质备份恢复码（电子+纸质+加密USB）</p>
<h3 id="32-全新的备份架构">3.2 全新的备份架构</h3>
<p><img loading="lazy" src="https://s2.l22.org/20250329185329.png"></p>
<h3 id="33-血泪换来的安全原则">3.3 血泪换来的安全原则</h3>
<ol>
<li><strong>3-2-1备份法则</strong>：3份副本，2种介质，1份离线</li>
<li><strong>关键凭证隔离存储</strong>：TOTP种子不与密码管理器共存</li>
<li><strong>定期恢复演练</strong>：每季度测试备份有效性</li>
</ol>
<h2 id="四前瞻思考安全与便利的永恒博弈">四、前瞻思考：安全与便利的永恒博弈</h2>
<h3 id="41-自托管服务的风险矩阵">4.1 自托管服务的风险矩阵</h3>
<table>
  <thead>
      <tr>
          <th>风险类型</th>
          <th>自托管方案</th>
          <th>云服务方案</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>可用性</td>
          <td>❌ 单点故障</td>
          <td>✅ 高可用</td>
      </tr>
      <tr>
          <td>控制权</td>
          <td>✅ 完全自主</td>
          <td>❌ 依赖厂商</td>
      </tr>
      <tr>
          <td>维护成本</td>
          <td>❌ 需专业知识</td>
          <td>✅ 免维护</td>
      </tr>
  </tbody>
</table>
<h3 id="42-web3时代的认证演进">4.2 Web3时代的认证演进</h3>
<ul>
<li>硬件安全密钥（FIDO2/WebAuthn）</li>
<li>生物识别集成认证</li>
<li>去中心化身份系统</li>
</ul>
<h2 id="五终极建议每个开发者都该做的5件事">五、终极建议：每个开发者都该做的5件事</h2>
<ol>
<li><strong>立即打印恢复码</strong>：存放于保险箱或可信亲友处</li>
<li><strong>配置多因素冗余</strong>：如Authy+硬件密钥组合</li>
<li><strong>建立逃生通道</strong>：至少设置两种恢复方式</li>
<li><strong>实施分级保护</strong>：关键账户使用独立安全方案</li>
<li><strong>定期安全审计</strong>：每半年检查一次认证体系</li>
</ol>
<blockquote>
<p><strong>最后提醒</strong>：最危险的安全错觉就是&quot;这种事不会发生在我身上&quot;。请今天就开始行动，别等灾难降临</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>在群晖里安装简单的笔记软件flatnotes</title>
      <link>https://www.iliu.org/posts/install-the-simple-note-taking-software-flatnotes-on-synology/</link>
      <pubDate>Wed, 30 Oct 2024 03:48:47 -0400</pubDate>
      <guid>https://www.iliu.org/posts/install-the-simple-note-taking-software-flatnotes-on-synology/</guid>
      <description>&lt;p&gt;老刘这一段时间以来都是使用&lt;code&gt;VSCode&lt;/code&gt;来写博客，主要是因为&lt;code&gt;anytype&lt;/code&gt;对长文的支持一般，另外对&lt;code&gt;markdown&lt;/code&gt;语法支持的也不够，比如表格功能就没法用&lt;code&gt;markdown&lt;/code&gt;语法。但是&lt;code&gt;VSCode&lt;/code&gt;有一个缺点是同步不方便，而我也想要能随时随地的写博客，直到看到&lt;code&gt;flatnotes&lt;/code&gt;这个笔记软件，说它是笔记软件有点抬举它了，因为它太简洁，不过用来写博客文章是刚刚好，并且支持docker部署使用，这样只要有网络，有浏览器，就可以随时随地的写博客了。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>老刘这一段时间以来都是使用<code>VSCode</code>来写博客，主要是因为<code>anytype</code>对长文的支持一般，另外对<code>markdown</code>语法支持的也不够，比如表格功能就没法用<code>markdown</code>语法。但是<code>VSCode</code>有一个缺点是同步不方便，而我也想要能随时随地的写博客，直到看到<code>flatnotes</code>这个笔记软件，说它是笔记软件有点抬举它了，因为它太简洁，不过用来写博客文章是刚刚好，并且支持docker部署使用，这样只要有网络，有浏览器，就可以随时随地的写博客了。</p>
<p>既然合适使用，当然就要把他部署在<code>NAS</code>里，网上群晖部署的教程比较麻烦，还需要进命令行操作，其实根本不用那么麻烦，直接使用群晖默认的<code>docker</code>管理套件<code>container manager</code>来部署就行了。步骤如下：</p>
<h2 id="首先找到flatnotes">首先找到flatnotes</h2>
<p>在注册表里搜索flatnotes，选择第一个，下载
<img alt="image" loading="lazy" src="https://s2.l22.org/flatnotes/flatnote1.png"></p>
<h2 id="安装过程">安装过程</h2>
<p>下载完成后，点击安装，在端口设置，环境，存储空间设置，根据实际情况设置一下就行，其他一路下一步。
<img alt="image" loading="lazy" src="https://s2.l22.org/flatnotes/flatenote2.png">
<img alt="image" loading="lazy" src="https://s2.l22.org/flatnotes/flatenote3.png"></p>
<p>重点说一下环境变量设置，
增加如下几个字段：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">FLATNOTES_AUTH_TYPE: password
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">FLATNOTES_USERNAME: user
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">FLATNOTES_PASSWORD: panda # 密码可自行修改
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">FLATNOTES_SECRET_KEY: aLongRandomSeriesOfCharacters
</span></span></code></pre></td></tr></table>
</div>
</div><p>另外一个需要说明的地方是8080端口不要改成其他的，改了虽然docker不会报错，但是网页是打不开的。</p>
<h2 id="代理设置">代理设置</h2>
<p>如果不出意外的，在浏览器里输入你NAS的ip加上你设置的端口号就应该可以打开应用了，但是我们需要的是随时随地的使用，所以还需要在NAS里设置一下代理。</p>
<h3 id="反向代理设置方法">反向代理设置方法</h3>
<p>点击控制面板，点击登录门户，点击高级，点击反向代理服务器。
<img alt="image" loading="lazy" src="https://s2.l22.org/flatnotes/flatnotes4.png">
点击新增，如下：
<img alt="image" loading="lazy" src="https://s2.l22.org/flatnotes/flatnotes5.png">
至此 ，就可以愉快的使用flatnotes来写文章了，本文就是使用这个软件写的，体验非常的不错！~
<img alt="image" loading="lazy" src="https://s2.l22.org/flatnotes/flatnotes6.png">
唯一的一点，这个软件好像不是实时保存，写完文章后记得保存一下</p>
]]></content:encoded>
    </item>
    <item>
      <title>手机上有好用的输入法吗？</title>
      <link>https://www.iliu.org/posts/good-input-method-on-mobile-phones/</link>
      <pubDate>Fri, 06 Sep 2024 11:03:02 +0800</pubDate>
      <guid>https://www.iliu.org/posts/good-input-method-on-mobile-phones/</guid>
      <description>&lt;p&gt;老刘在以前的文章里也曾提过选择输入法的过程，目前在电脑上的方案是使用&lt;code&gt;小狼毫输入法&lt;/code&gt;加&lt;code&gt;雾凇拼音&lt;/code&gt;的词库。并通过&lt;code&gt;群晖drive&lt;/code&gt;实现几个PC之间个人词库的同步，使用起来还算方便。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>老刘在以前的文章里也曾提过选择输入法的过程，目前在电脑上的方案是使用<code>小狼毫输入法</code>加<code>雾凇拼音</code>的词库。并通过<code>群晖drive</code>实现几个PC之间个人词库的同步，使用起来还算方便。</p>
<p><img loading="lazy" src="https://ewader.s3.bitiful.net/blog/2024-09-06-10-44-13.png?no-wait\\=on"></p>
<p>但是在手机上一直找不到好用的输入法，老刘目前使用的是荣耀的一款手机，荣耀现在和百度走的很近，所以输入法当然也是<code>百度输入法荣耀版</code>。众所周知的是，国内的软件，都写的有隐私保护，但是也都没有做到过隐私保护，都是拿着用户的隐私来牟取利益。最近老刘家在装修，每当和装修负责人谈论一些东西后，再打开购物软件，谈论的东西妥妥的都会出现，不懂的人还觉得现在手机真智能（我老婆就是），殊不知，智能的代价就是你隐私的泄露。</p>
<p>于是老刘开始重视起来手机上的输入法。</p>
<p>由于电脑上使用的是小狼毫输入法，使用的还算是满意，所以手机上首先想到的也是这个输入法，在手机上名字叫作<code>同文输入法</code>，本身<code>小狼毫输入法</code>就以难配置而著称，想不到<code>同文输入法</code>是更难配置，安装后根本没法用，按照网上找的配置方法设置了一圈还是没有搞定，所以只好删除作罢。</p>
<p>然后就看到<code>1900博客</code>上说的<code>Fcitx5</code>输入法的<code>Android</code>版，支持安装<code>rime</code>插件，并且支持<code>雾凇拼音</code>词库，只需把电脑里的配置拷贝过去就行了。详细请参考：<a href="https://1900.live/last-puzzle-android-rime-input/">最后一块拼图：在 Android 手机上使用 Rime 输入法</a>。按照1900的方法，成果的把rime输入法在手机上跑了起来。使用起来也很流畅，但是遇到了连个问题：</p>
<p>首先，就是同步的问题，由于<code>Fcitx5</code>安装在<code>Android</code>的系统文件夹内，所以生成的同步文件也在系统文件夹呢，而目前大多数的软件都已经无法访问系统文件夹，而手机版又不支持把同步文件生成到其他文件夹内，这就造成了同步非常的不方便，需要把手机插到电脑上，在手动把别的端的同步文件复制过去，就很麻烦。</p>
<p>第二，是<code>Fcitx5</code>不支持九宫格，对于习惯了用九宫格输入的人来说，全键盘是真的不好用。网上也有很多讨论到底是九宫格还是全键盘输入更高效，其实如果在以前，输入法不智能的情况下，那肯定是全键盘更高效，当年第一次使用黑莓手机的时候，惊艳到了，对于现在输入法也智能的情况下，九宫格的按键比较大，不容易误碰到别的键，而且这么多年形成的机械记忆，个人感觉九宫格更方便一些，毕竟不是物理键盘。</p>
<p>在吐槽的当间，1900说有一个名字叫<code>雨燕输入法</code>的rime，内置的就是雾凇的方案，也支持九宫格，试用了一下，键盘比较丑，这本没有什么，就是输入不流畅，有卡顿受不了。</p>
<p>使用了几天，实在是不习惯全键盘的输入，主要是总会有误碰。也有那么几天，有了破罐子破摔的心理，觉得反正微信也离开不了，干脆就使用<code>微信输入法</code>得了，也装了，用着确实舒服，让老刘不禁感慨，腾讯是真了解国人使用输入法的习惯。</p>
<p>破罐子破摔的心理也就那么几天，对微信真的是不怎么放心，本着能少一点泄露就少一点的想法，试用了一下<code>Google</code>的<code>Gboard</code>。</p>
<p><code>Gboard</code>有很多不足的地方，比如键盘布局不习惯，不科学语音不能用，词库小等。网上有一篇文章，是通过<code>Gboard</code>的自定义词库的功能，把百度的词库还有搜狗的词库都导入进去。下载导入了一下，确实好用多了。</p>
<p>当然，<code>Gboard</code>的优点也很多，老刘比较喜欢的是输入纠错的功能，全键盘的时候不是容易误碰到周边的键吗，<code>Gboard</code>就很贴心的给你纠错过来了，比如你要打“老刘”正常的拼音是“laoliu”，如果你打成了“lasliu”那也是能打出老刘这个词的。</p>
<p>所以，现在的方案是用Gboard来熟悉全键盘的键位，将来有一天熟悉了之后，可能还会用回<code>Fcitx5</code>，或者期待一下<code>Fcitx5</code>能出九宫格就完美了。</p>
]]></content:encoded>
    </item>
    <item>
      <title>再次使用 KeepassXC进行密码管理</title>
      <link>https://www.iliu.org/posts/use-keepassxc-again-for-password-management/</link>
      <pubDate>Tue, 03 Sep 2024 13:46:02 +0800</pubDate>
      <guid>https://www.iliu.org/posts/use-keepassxc-again-for-password-management/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://memos.1169f1b9dbf57062d00029d30c7fde9e.r2.cloudflarestorage.com/assets/1725262863_2024-09-02-15-23-54.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=67756f7e669d24ac11ea5c24ecfdb150%2F20240902%2Fauto%2Fs3%2Faws4_request&amp;X-Amz-Date=20240902T074103Z&amp;X-Amz-Expires=432000&amp;X-Amz-SignedHeaders=host&amp;x-id=GetObject&amp;X-Amz-Signature=f948507f71602f764fa24695ce3823930013949acc00d88a388e6b6d825ee8dd&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;前因&#34;&gt;前因&lt;/h2&gt;
&lt;p&gt;几年前，老刘最开始用软件进行密码管理的时候，用的就是keepassxc，只是后来有一段时间使用deepin，系统的内核比较低，不支持keepassxc的最新版，取舍之后，使用了Bitwarden，并部署在我nas里。这一用就是几年的时间过去了，只到最近遇到了问题。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="https://memos.1169f1b9dbf57062d00029d30c7fde9e.r2.cloudflarestorage.com/assets/1725262863_2024-09-02-15-23-54.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=67756f7e669d24ac11ea5c24ecfdb150%2F20240902%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20240902T074103Z&X-Amz-Expires=432000&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=f948507f71602f764fa24695ce3823930013949acc00d88a388e6b6d825ee8dd"></p>
<h2 id="前因">前因</h2>
<p>几年前，老刘最开始用软件进行密码管理的时候，用的就是keepassxc，只是后来有一段时间使用deepin，系统的内核比较低，不支持keepassxc的最新版，取舍之后，使用了Bitwarden，并部署在我nas里。这一用就是几年的时间过去了，只到最近遇到了问题。</p>
<p>这个问题就是docker镜像被墙了以后，部署在NAS里的bitwarden就没法更新了。作为一个安全软件，没法更新后的漏洞带来的风险很大，老刘也层想过让NAS智能在局域网里使用，家里和店里的电脑用tailscale相连，这样Docker更新与否都不重要了，后来发现也行不通，bitwarden需要使用ssl证书才能链接，不然就会报错，所以使用IP的方案也就搁浅了。</p>
<h2 id="解决方案">解决方案</h2>
<p>解决方案有一下几种，第一种是前置的路由器科学一下。用的是openwrt，遇到的新问题是，如果把opw路由作为主路由来使用，ipv6就会受到影响，科学后，很大的概率用ipv6无法连接NAS了，后来我把opw改成旁路有使用，这个倒是不影响ipv6了，但是把网关设置成旁路由后，电脑上网的速度又受到了影响，访问国内网站总有卡顿。设置摆弄了一下，还搞得干脆网页也打不开了。看来带套确实是影响体验。</p>
<p>另外一种方法就是舍弃放在NAS里的方案，把bitwarden放到VPS里，但是我又不愿意把自己的密码保存在第三方的电脑里，无论是不是加密的存储。最后，老刘思来想去，决定放弃bitwarden而改用keepassxc。</p>
<p>也就是第三种方法，换软件！</p>
<h2 id="目前用的方案">目前用的方案</h2>
<p>从bitwarden把密码导出，安装keepassxc后，进行导入，有很多导入格式，比如1password等，当然也有bitwarden的。按照bitwarden的格式导入。就这么简单就可以使用了，至于软件的设置，都是中文，一看就明白，没有什么要说的了。</p>
<p>keepassxc也是支持浏览器插件的，方便程度和bitwarden差不多，其实密码管理器目前也比较成熟了，挑一款自己用着舒服的使用就行，当然不花钱的最好。</p>
<h3 id="各设备之间的同步">各设备之间的同步</h3>
<p>以前老刘用一个很简单的方案，就是用synalogy drive在各个终端进行同步密码文件，有一点不方便的是，在手机上由于drive程序后台被杀之后，keepass获取的只是以前的缓存，每次使用前都要打开一次drive，很不方便。好在keepass支持webdav的同步方式。NAS开通webdav，设置好文件夹，各个端就能愉快的使用了。妈妈再也不用担心我的密码了。</p>
<h2 id="后记">后记</h2>
<p>目前使用了keepass一个星期，相比bitwarden来说，需要在电脑里多打开一个软件，占了电脑里的一些资源，减少了一些NAS里的资源，体验的话就是从B无缝衔接到了K，两个软件在网站输入密码的时候，没有什么不同。</p>
]]></content:encoded>
    </item>
    <item>
      <title>解决Windows11打开安全中心空白的方法</title>
      <link>https://www.iliu.org/posts/solution-to-the-blank-screen-windows-11s-security-center/</link>
      <pubDate>Thu, 29 Aug 2024 07:56:45 +0800</pubDate>
      <guid>https://www.iliu.org/posts/solution-to-the-blank-screen-windows-11s-security-center/</guid>
      <description>&lt;p&gt;老刘在前面一篇文章中说，某年某月的某一天，老刘重置了电脑，不但丢失了存在本地的博客数据，而且发现安全中心打开是一个空白的窗口。老刘使用了重启大法的手段，但是发现并没有什么卵用。文心一言里给出了很多的建议，满满的一大页，照着做了下，问题还是没有解决。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>老刘在前面一篇文章中说，某年某月的某一天，老刘重置了电脑，不但丢失了存在本地的博客数据，而且发现安全中心打开是一个空白的窗口。老刘使用了重启大法的手段，但是发现并没有什么卵用。文心一言里给出了很多的建议，满满的一大页，照着做了下，问题还是没有解决。</p>
<p>不得以，老刘还是去搜索引擎上找方法吧，有一些方法大同小异，只到看到了一篇文章，说把一段代码保存成reg的格式，双击导入注册表即可。老刘试用了一下，完美解决了问题。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Windows Registry Editor Version 5.00
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">　　［HKEY_LOCAL_MACHINE<span class="se">\S</span>OFTWARE<span class="se">\P</span>olicies<span class="se">\M</span>icrosoft<span class="se">\W</span>indows Defender］
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">　　“DisableAntiSpyware”<span class="o">=</span>dword:00000000
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">　　［HKEY_LOCAL_MACHINE<span class="se">\S</span>OFTWARE<span class="se">\P</span>olicies<span class="se">\M</span>icrosoft<span class="se">\W</span>indows Defender<span class="se">\R</span>eal-Time Protection］
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">　　“DisableBehaviorMonitoring”<span class="o">=</span>dword:00000000
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">　　“DisableIOAVProtection”<span class="o">=</span>dword:00000000
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">　　“DisableOnAccessProtection”<span class="o">=</span>dword:00000000
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">　　“DisableRealtimeMonitoring”<span class="o">=</span>dword:00000000
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">　　［HKEY_LOCAL_MACHINE<span class="se">\S</span>YSTEM<span class="se">\C</span>urrentControlSet<span class="se">\S</span>ervices<span class="se">\S</span>ecurityHealthService］
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">　　“Start”<span class="o">=</span>dword:00000002
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="使用方法">使用方法</h2>
<ul>
<li>桌面新建一个文本文件，把上述代码拷贝进去。然后另存为，类型选择所有文件，名称设置为aaa.reg。</li>
<li>双击aaa.reg文件，导入注册表即可</li>
</ul>
<h2 id="这是一个bug">这是一个bug</h2>
<p>老刘有一次重置电脑，发现这个方法不能用了，其实这个Windows11的一个bug，不知道为什么一直没有修复，重新安装一下md即可。</p>
<p>文件老刘放在下面了：
<a href="https://pan.baidu.com/s/111uBACLN3HExSuUFd3Mzqw?pwd=9a78">点击下载</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>修汽车空调</title>
      <link>https://www.iliu.org/posts/repair-the-car-air-conditioning/</link>
      <pubDate>Mon, 24 Jun 2024 14:17:20 +0800</pubDate>
      <guid>https://www.iliu.org/posts/repair-the-car-air-conditioning/</guid>
      <description>&lt;p&gt;前年的时候，曾经写过一篇&lt;a href=&#34;https://iliu.org/4242&#34;&gt;修汽车空调&lt;/a&gt;的文章。当时加过氟利昂之后，制冷效果是立马起来了。不过过了半个多月的时间，开车回老家，再次出现空调制冷效果不好的情况，也不是制冷效果不好，而是有时候能空调能启动，有时候又启动不了。甚至在堵车的时候还发生了，水箱温度过高的提示。之后又去店里修了一次，氟利昂压力是正常的，说可能是水箱比较脏了，拆下来冲洗一下就好了。结果拆冲洗后当时是可以了，但是我看到水箱也不是很脏的样子。&lt;/p&gt;
&lt;p&gt;后来这两年，空调基本上也能凑合着用，但是效果不是太好，本身用车的时候也少，就觉得可能是缺氟利昂了。&lt;/p&gt;
&lt;p&gt;21号，送女儿去参加中考，不想去的时候，再次出现空调不能运行的情况，好在当天阴天还有点小雨，气温不是太高，开车车窗勉强能用车，不过行车过程中外面的噪音太大。很不舒适。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>前年的时候，曾经写过一篇<a href="https://iliu.org/4242">修汽车空调</a>的文章。当时加过氟利昂之后，制冷效果是立马起来了。不过过了半个多月的时间，开车回老家，再次出现空调制冷效果不好的情况，也不是制冷效果不好，而是有时候能空调能启动，有时候又启动不了。甚至在堵车的时候还发生了，水箱温度过高的提示。之后又去店里修了一次，氟利昂压力是正常的，说可能是水箱比较脏了，拆下来冲洗一下就好了。结果拆冲洗后当时是可以了，但是我看到水箱也不是很脏的样子。</p>
<p>后来这两年，空调基本上也能凑合着用，但是效果不是太好，本身用车的时候也少，就觉得可能是缺氟利昂了。</p>
<p>21号，送女儿去参加中考，不想去的时候，再次出现空调不能运行的情况，好在当天阴天还有点小雨，气温不是太高，开车车窗勉强能用车，不过行车过程中外面的噪音太大。很不舒适。</p>
<p>送完女儿后，直接开去了修理店，令人哭笑不得的是，回去的时候空调又能用了。到店说明情况后，具体检查了一下，氟利昂压力正常，老板检查了半天，发现压缩机那块的风扇不转圈，判断是控制风扇开启的模块出现了故障。<img alt="汽车空调风扇控制器" loading="lazy" src="https://ewader.s3.bitiful.net/blog/%e5%be%ae%e4%bf%a1%e5%9b%be%e7%89%87_20240624155035.jpg"></p>
<p>这是这个玩意，老板从汽配城发货，跑腿很快送过来了，安装之后，终于是恢复正常了，又把车保养了一下。一共收了450元。应该是比在4S店要便宜一些。</p>
<p>后来在4S店的群里问了一下这玩意的价格是225一个，不包括工时费。算下来确实是要便宜一些。刚问了，群里的一个哥们就问道，你这是空调出问题了吗？然后我的车和你这同一个毛病。看来不是个例了。<img loading="lazy" src="https://ewader.s3.bitiful.net/blog/20240624155254.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>给Hugo PaperMod增加giscus评论系统</title>
      <link>https://www.iliu.org/posts/add-comment-system-to-hugopapermo/</link>
      <pubDate>Mon, 26 Feb 2024 14:39:25 +0800</pubDate>
      <guid>https://www.iliu.org/posts/add-comment-system-to-hugopapermo/</guid>
      <description>&lt;p&gt;自从把博客程序从&lt;code&gt;WordPress&lt;/code&gt;换成&lt;code&gt;Hugo&lt;/code&gt;以来，我把评论也给取消了，原因在我看来，评论有时候变成了我的负担。很多时候是为了评论而评论，或者为了获取评论而写一些迎合读者的文章，这样以来，我感觉偏离了我的初心，所以，干脆就不在布置评论。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>自从把博客程序从<code>WordPress</code>换成<code>Hugo</code>以来，我把评论也给取消了，原因在我看来，评论有时候变成了我的负担。很多时候是为了评论而评论，或者为了获取评论而写一些迎合读者的文章，这样以来，我感觉偏离了我的初心，所以，干脆就不在布置评论。</p>
<p>放弃评论后，我是爽了，但是也不断的有博友反馈，希望有评论的功能，考虑再三，觉得还是加上为好。</p>
<p>阿甘博客里说了一个使用<code>artalk</code>的方法，之前我也部署过，不过使用这个需要VPS，维护起来也有点麻烦，后来也就不了了之了。</p>
<h2 id="giscus介绍">giscus介绍</h2>
<p>前几天我发现了<code>giscus</code> 这个评论系统。他有诸多的优点：</p>
<ul>
<li>开源。🌏</li>
<li>无跟踪，无广告，永久免费。📡 🚫</li>
<li>无需数据库。所有数据均储存在 GitHub Discussions 中。</li>
<li>支持自定义主题！🌗</li>
<li>支持多种语言。🌐</li>
<li>高可配置性。🔧</li>
<li>自动从 GitHub 拉取新评论与编辑。🔃</li>
<li>可自建服务！🤳</li>
</ul>
<p>唯一的缺点是评论者需要有GitHub的账户，登录后才能评论。</p>
<h2 id="部署方法">部署方法：</h2>
<p>使用<code>Hugo PaperMod</code>部署<code>giscus</code>非常的简单</p>
<ul>
<li>在你GitHub项目的开通GitHub Discussions。具体的开通方法点击<a href="https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/enabling-or-disabling-github-discussions-for-a-repository">这里</a>！</li>
<li>登录<a href="https://giscus.app/zh-CN">giscus</a>官网，往下拉，在<code>配置</code>那个地方，输入你的GitHub项目名称</li>
<li>复制生成的代码</li>
<li>在文件夹<code>layouts/partials/</code>下新建一个名字叫<code>comments.html</code>的文件。然后把上一步复制的代码粘贴进去，保存。</li>
<li>在<code>hugo.yml</code>中，设置<code>comments: true</code>.</li>
</ul>
<p>至此，部署完成，需要说明的是，项目一定要设置成public，不然评论可能不会显示。</p>
<p>PS：</p>
<p>系统上线后，小胡同学和老张同志都说，这个评论系统不方便。其实还好吧，主要的是部署简单。虽然能挡着一部分正常评论，但是也不会有垃圾评论了不是。</p>
]]></content:encoded>
    </item>
    <item>
      <title>2024年，高德地图和百度地图选哪个？</title>
      <link>https://www.iliu.org/posts/comparison-between-autonavi-map-and-baidu-map/</link>
      <pubDate>Sat, 24 Feb 2024 14:42:58 +0800</pubDate>
      <guid>https://www.iliu.org/posts/comparison-between-autonavi-map-and-baidu-map/</guid>
      <description>&lt;p&gt;在网上经常看到网友询问百度地图和高德地图如何选择，网上的文章要么太老，要么太老，要么太老，没有什么参考价值。为什么这么说呢，因为现在导航技术加上北斗的支持，已经远远不是文章的那个年代所用的技术了。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>在网上经常看到网友询问百度地图和高德地图如何选择，网上的文章要么太老，要么太老，要么太老，没有什么参考价值。为什么这么说呢，因为现在导航技术加上北斗的支持，已经远远不是文章的那个年代所用的技术了。</p>
<p>我之前也在博客群里问相关的问题，得到的答案一般都是推荐高德导航，理由是高德更纯粹，他是靠导航来吃饭的，如果导航做不好，他就无法很好的生存；相反百度是一个大杂烩，什么都搞，什么都搞不好。我也是一直在用高德导航。不过，前几天的一次试用百度导航，让我对百度地图的看法有些不少的改变。下面就详细的说一说：</p>
<h2 id="两个导航的相同点">两个导航的相同点</h2>
<p>目前两个导航都支持车道级的导航。都不单单是纯粹的地图软件，上面商家广告等等，如果把名字互相换一下，你根本就分辨不出来谁是谁。另外就是导航语音的选择、什么拥堵的算法等等，也都非常的相似。没有什么好比较的。</p>
<h2 id="高德地图的亮点与不足">高德地图的亮点与不足</h2>
<p>高德的亮点在于如果你和别的司机都装有高德地图，在会车的时候会提示你注意安全，你的后方有车辆快速驶近的时候，高德也会提醒。</p>
<p>不足之处在于，高德也是号称车道级导航，但是很不明显，从地图上根本看不到你在哪个车道行驶。</p>
<h2 id="百度地图的亮点和不足">百度地图的亮点和不足</h2>
<p>高德的不足就是百度的亮点，百度地图的车道级导航就很明确，你的车在哪个车道行驶，在地图上一目了然。而且百度还通过大数据算法，给你推荐最优的车道。这点的好处很多，比如前方有事故，百度就会很明确的给你提示事故在哪个车道，并推荐最优的车道给你，另外一个很贴心的功能是临近高速的出口的时候，其他的车道在地图上都会有个红叉叉，提示你不要从那边走，这对新手司机来说尤其友好。我媳妇最怕的就是不知道从哪个出口下高速……</p>
<p>当然，百度地图的不足就是高德的亮点，百度地图目前还没有诸如会车提醒这样的功能。</p>
]]></content:encoded>
    </item>
    <item>
      <title>电视和投影仪，哪个对孩子的眼睛更好？</title>
      <link>https://www.iliu.org/posts/which-better-for-children/</link>
      <pubDate>Thu, 22 Feb 2024 14:46:14 +0800</pubDate>
      <guid>https://www.iliu.org/posts/which-better-for-children/</guid>
      <description>&lt;p&gt;昨天博友@DemoChen问我能不能拉一个群，他的一个朋友有眼睛相关的问题需要咨询。当时我在外面陪孩子在金水河公园的雪地里漫步，回到家里后，专门拉了一个群，demochen也拉了他的朋友进来。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>昨天博友@DemoChen问我能不能拉一个群，他的一个朋友有眼睛相关的问题需要咨询。当时我在外面陪孩子在金水河公园的雪地里漫步，回到家里后，专门拉了一个群，demochen也拉了他的朋友进来。</p>
<p>他的朋友问了一个很多家长都非常关系的问题————孩子的视力，如何预防近视：</p>
<blockquote>
<p>@镜缘轩 大佬您好，我有个预防近视的问题想请教下，我家有个2岁零的宝宝，因为现在孩子总是难免看手机电视，而且孩子看电视一会会时不时揉眼睛，眨巴眼，我担心孩子会近视。想问下：如果是投影仪，是不是对孩子的眼睛伤害小一些，我理解的是投影仪是二次反射出来的光线。</p></blockquote>
<p>下面我们就具体聊聊：</p>
<h2 id="投影仪相比较电视对眼睛的伤害小吗">投影仪相比较电视对眼睛的伤害小吗？</h2>
<p>这里的伤害可以分两个层面来理解，一个是引起近视，另外一个是对眼睛器官的伤害。</p>
<p>电视是自发光光源，特别是现在的液晶电视，发的光种包含一些高能蓝光的有害射线，但是由于电视相对人的眼睛较远，这些光线到达人眼后的能量已经比较小了，所以来说，电视对眼睛器官的伤害不会很大。对视力的影响也会比看手机要小的多。</p>
<p>那么投影仪和电视机到底哪个对眼睛更友好呢？理论上来说，当然是投影仪，因为投影仪的光线是漫反射光线，人眼看起来会更舒适一些。</p>
<h2 id="宝宝看手机的最长世间">宝宝看手机的最长世间？</h2>
<blockquote>
<p>比如说现在2岁的宝宝 如果看手机 有什么最多时长建议吗？ 我发现现在的小孩 让他们不看手机好难</p></blockquote>
<p>其实，不建议给这么小的宝宝看手机等电子产品，百害而无一利。但是，很多时候都要想现实让步。非要给出一个时长建议的话，那么不要超过20分钟。甚至更短的世间。有研究表明，看10分钟的手机引起的视力疲劳和看50分钟电视的疲劳程度差不多。所以，在条件允许的情况下，尽量不要让孩子看手机。</p>
<h2 id="近视防控的方法">近视防控的方法</h2>
<p>其实近视防控很简单，一是严格控制近距离的用眼，包括手机、绘本、弹琴、甚至大尺寸的电视等等。二是保证每天至少要保证2个小时的户外活动。另外，这位朋友还提到，<strong>如果出门少，多往往窗外是不是可以代替</strong>？这个是不行的，真的条件不允许，可以在阳台上玩。</p>
<p>户外活动的意义并不只是看远，而是户外的光线的亮度。所以，只是在室内望远，是替代不了户外活动的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>使用Fcitx5 for Android，读《万历十五年》</title>
      <link>https://www.iliu.org/posts/use-fcitx5-andriod-input/</link>
      <pubDate>Wed, 07 Feb 2024 20:28:26 +0800</pubDate>
      <guid>https://www.iliu.org/posts/use-fcitx5-andriod-input/</guid>
      <description>&lt;p&gt;最近女儿放假了，忙着辅导她的功课，毕竟初三了，加上期末考试的成绩不是很理想，所以寒假是要努力的时候了。在这期间读书也少了，只读了《万历十五年》这本历史书，另外就是在看了1900的博客后，把手机的输入法改成了Fcitx5 for Android，并且安装rime插件，使用雾凇拼音词库；这样手机就和电脑使用同一个词库了。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>最近女儿放假了，忙着辅导她的功课，毕竟初三了，加上期末考试的成绩不是很理想，所以寒假是要努力的时候了。在这期间读书也少了，只读了《万历十五年》这本历史书，另外就是在看了1900的博客后，把手机的输入法改成了Fcitx5 for Android，并且安装rime插件，使用雾凇拼音词库；这样手机就和电脑使用同一个词库了。</p>
<h2 id="手机安装并fcitx5-for-android">手机安装并Fcitx5 for Android</h2>
<p>在电脑上从去年开始就一直使用小狼毫输入法加雾凇拼音的词库，这个输入法开源，对隐私的保护好，并且词库很大，使用起来很准确，但是手机上的输入法一直不能让我满意。</p>
<p>使用过一段微信键盘，恶心与微信无孔不入的推广，所以弃用；后来又使用了一段时间Gboard。一是词库小，输入不准确，选词困难，二是一些表情颜文字之类的需要网络的支持，想舒服的使用手机就要时刻处于科学的状态。所以使用一段时间后也不是很满意，就弃用了。也曾经使用过一段时间Fcitx5 for Android，那时候刚开发出来不久，还没有rime插件，加上没有九宫格，也不得不放弃了。最后选择使用了华为的小艺输入法。这个输入法各方面中规中矩吧，也比较顺手，就一直在使用下去。</p>
<p>看<a href="https://1900.live/last-puzzle-android-rime-input/">1900</a>的博客后,发现Fcitx5 for Android更新很多版本了，加上可以安装rime插件并使用雾凇拼音，就又产生了使用的念头。按照他博客的教程，很容易就安装使用了。</p>
<p>试用了几天，发现总体而言还算可以。优点就是雾凇拼音了，和电脑一样的输入体验。缺点依然是不支持九宫格。目前在努力适应全键盘的模式中。</p>
<h2 id="读万历十五年">读《万历十五年》</h2>
<p>这本书以前看电视剧《人民的名义》的时候，就被@到。正好微信读书给推了这本，可以免费看，所以就读了。书名虽然是万历十五年，但并不是仅仅讲万历十五年发生的事情。记录了张居正、申时行、海瑞、戚继光等几位典型的人物事迹。</p>
<p>从这本书可以看到首辅不同的性格导致的历史，明朝特殊的文官集团、大明皇帝的无奈、武将和军人的悲哀等。</p>
<p>你能相信一个看似芝麻大的和稀泥事件，竟然就是导致大明被清朝覆灭的根源。五六十的海盗从浙江登陆，辗转上千公里，杀死4000多人；皇帝想干什么事只要不合文官集团的意，你就干不成，只要心灰气冷，得过且过。</p>
<p>当然这只是书中的观点，不一定正确和全面，但是对了解那个封建社会里的奇葩王朝还是挺有帮助的。</p>
<p>PS：</p>
<p>和稀泥事件是这样的，当时镇守东北的巡抚发现有一个部落在不断的兼并周边的部落，于是派总兵去剿灭，结果总兵不听话而且打了败仗（以明朝那个奇葩的制度，打败仗也正常），于是巡抚就告总兵的黑状，总兵一看，我也是有后台的人，也告巡抚的黑状，当时的内阁首辅是申时行，一个善于和稀泥的人，一看说，你们两个相互告了就完事了，翻篇了。于是就不了了之了。这个部落的首领叫努尔哈赤！</p>
]]></content:encoded>
    </item>
    <item>
      <title>2024年 Web 开发趋势</title>
      <link>https://www.iliu.org/posts/web-development-trends/</link>
      <pubDate>Mon, 15 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://www.iliu.org/posts/web-development-trends/</guid>
      <description>&lt;h2 id=&#34;齐物框架的演进&#34;&gt;齐物框架的演进&lt;/h2&gt;
&lt;p&gt;2024 年，齐物开发继续快速发展。React、Vue 和 Angular 依然是最流行的框架，但也出现了一些新的趋势。&lt;/p&gt;
&lt;h3 id=&#34;1-服务端渲染的回归&#34;&gt;1. 服务端渲染的回归&lt;/h3&gt;
&lt;p&gt;Next.js、Nuxt 等 SSR 框架越来越受欢迎，因为它们提供了更好的 SEO 和首屏加载性能。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="齐物框架的演进">齐物框架的演进</h2>
<p>2024 年，齐物开发继续快速发展。React、Vue 和 Angular 依然是最流行的框架，但也出现了一些新的趋势。</p>
<h3 id="1-服务端渲染的回归">1. 服务端渲染的回归</h3>
<p>Next.js、Nuxt 等 SSR 框架越来越受欢迎，因为它们提供了更好的 SEO 和首屏加载性能。</p>
<h3 id="2-边缘计算">2. 边缘计算</h3>
<p>边缘计算正在改变 Web 应用的部署方式，使应用能够更接近用户，提供更快的响应速度。</p>
<h3 id="3-webassembly">3. WebAssembly</h3>
<p>WebAssembly 使浏览器能够运行高性能代码，为 Web 应用带来了新的可能性。</p>
<h2 id="新技术趋势">新技术趋势</h2>
<h3 id="typescript-的普及">TypeScript 的普及</h3>
<p>TypeScript 已经成为齐物开发的标准，越来越多的项目采用 TypeScript 来提高代码质量。</p>
<h3 id="微齐物架构">微齐物架构</h3>
<p>微齐物架构使大型团队能够独立开发和部署齐物应用，提高了开发效率。</p>
<h2 id="开发工具">开发工具</h2>
<p>开发工具也在不断进化：</p>
<ul>
<li>更好的调试工具</li>
<li>AI 辅助编程</li>
<li>自动化测试</li>
</ul>
<h2 id="总结">总结</h2>
<p>Web 开发正在向更高效、更智能的方向发展。作为开发者，我们需要不断学习和适应新技术。</p>
]]></content:encoded>
    </item>
    <item>
      <title>利用cloudflare页面规则设置301永久跳转</title>
      <link>https://www.iliu.org/posts/use-cloudflare-page-rules-setup-301-permanent-redirect/</link>
      <pubDate>Fri, 01 Dec 2023 21:04:03 +0800</pubDate>
      <guid>https://www.iliu.org/posts/use-cloudflare-page-rules-setup-301-permanent-redirect/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;细心的读者可能已经发现，图南博客的域名已经由&lt;code&gt;iliu.org&lt;/code&gt; 更换到&lt;code&gt;iliu.org&lt;/code&gt;。这个域名是之前在&lt;code&gt;Google&lt;/code&gt;注册的，可惜的80端口被墙了，也不知道是怎么实现强域名80端口的。于是在暂时使用一段时间后又使用了原域名。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="前言">前言</h2>
<p>细心的读者可能已经发现，图南博客的域名已经由<code>iliu.org</code> 更换到<code>iliu.org</code>。这个域名是之前在<code>Google</code>注册的，可惜的80端口被墙了，也不知道是怎么实现强域名80端口的。于是在暂时使用一段时间后又使用了原域名。</p>
<p>前两天的时候，感觉还是需要用iliu这个域名，和博客的名字比较搭配，而且用了ssl之后，网站走的443端口，基本上也不会影响什么，所以就切换了过来。</p>
<p>换域名之后另一个需要的解决的事情是要把<code>iliu.org</code>的网址301跳转到新网站，以前用VPS的时候，直接在<code>nginx</code>里设置，现在不用vps了，有没有别的方法呢？答案是肯定的，而且比vps更方便。那就是使用<code>Cloudflare</code>的页面规则进行跳转。</p>
<h2 id="方法">方法</h2>
<p>进入到<code>cloudflare</code>的个人中心，点击需要跳转的网站域名，点击DNS。 把域名解析到8.8.8.8，当然你解析到1.1.1.1也是可以的。然后点击规则，再点击页面规则。具体的设置如下图：<img alt="规则" loading="lazy" src="https://ewader.s3.bitiful.net/blog/guize.png"></p>
<p>这样，就把<code>iliu.org</code>这个网站的网址，按照同样的规则，跳转到了<code>iliu.org</code>这个网站。</p>
<p>使用免费的<code>cloudflare</code>一个域名只有3个免费的页面规则，因此还有另外一个方法也可以实现，那就是利用<code>cloudflare</code>的<code>workers</code>。</p>
<p>进入到<code>cloudflare</code>的后台后，点击<code>Workers 和 Pages</code>。</p>
<p>点击<code>创建应用程序</code>,再点击<code>创建workers</code>：把下面的代码修改一下，复制到代码区保存。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">/**</span>
</span></span><span class="line"><span class="cl"> <span class="o">*</span> <span class="n">Welcome</span> <span class="n">to</span> <span class="n">Cloudflare</span> <span class="n">Workers</span><span class="o">!</span> <span class="n">This</span> <span class="n">is</span> <span class="n">your</span> <span class="n">first</span> <span class="n">worker</span><span class="o">.</span>
</span></span><span class="line"><span class="cl"> <span class="o">*</span>
</span></span><span class="line"><span class="cl"> <span class="o">*</span> <span class="o">-</span> <span class="n">Run</span> <span class="s2">&#34;npm run dev&#34;</span> <span class="ow">in</span> <span class="n">your</span> <span class="n">terminal</span> <span class="n">to</span> <span class="n">start</span> <span class="n">a</span> <span class="n">development</span> <span class="n">server</span>
</span></span><span class="line"><span class="cl"> <span class="o">*</span> <span class="o">-</span> <span class="n">Open</span> <span class="n">a</span> <span class="n">browser</span> <span class="n">tab</span> <span class="n">at</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">localhost</span><span class="p">:</span><span class="mi">8787</span><span class="o">/</span> <span class="n">to</span> <span class="n">see</span> <span class="n">your</span> <span class="n">worker</span> <span class="ow">in</span> <span class="n">action</span>
</span></span><span class="line"><span class="cl"> <span class="o">*</span> <span class="o">-</span> <span class="n">Run</span> <span class="s2">&#34;npm run deploy&#34;</span> <span class="n">to</span> <span class="n">publish</span> <span class="n">your</span> <span class="n">worker</span>
</span></span><span class="line"><span class="cl"> <span class="o">*</span>
</span></span><span class="line"><span class="cl"> <span class="o">*</span> <span class="n">Learn</span> <span class="n">more</span> <span class="n">at</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">developers</span><span class="o">.</span><span class="n">cloudflare</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">workers</span><span class="o">/</span>
</span></span><span class="line"><span class="cl"> <span class="o">*/</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">//</span> <span class="n">Redirect</span> <span class="n">requests</span> <span class="n">from</span> <span class="n">one</span> <span class="n">domain</span> <span class="n">to</span> <span class="n">another</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">const</span> <span class="n">base</span> <span class="o">=</span> <span class="s2">&#34;https://iliu.org&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">const</span> <span class="n">statusCode</span> <span class="o">=</span> <span class="mi">301</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">async</span> <span class="n">function</span> <span class="n">handleRequest</span><span class="p">(</span><span class="n">request</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">const</span> <span class="n">url</span> <span class="o">=</span> <span class="n">new</span> <span class="n">URL</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="k">const</span> <span class="p">{</span> <span class="n">pathname</span><span class="p">,</span> <span class="n">search</span> <span class="p">}</span> <span class="o">=</span> <span class="n">url</span>
</span></span><span class="line"><span class="cl">  <span class="k">const</span> <span class="n">destinationURL</span> <span class="o">=</span> <span class="n">base</span> <span class="o">+</span> <span class="n">pathname</span> <span class="o">+</span> <span class="n">search</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="n">Response</span><span class="o">.</span><span class="n">redirect</span><span class="p">(</span><span class="n">destinationURL</span><span class="p">,</span> <span class="n">statusCode</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">addEventListener</span><span class="p">(</span><span class="s2">&#34;fetch&#34;</span><span class="p">,</span> <span class="n">async</span> <span class="n">event</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">event</span><span class="o">.</span><span class="n">respondWith</span><span class="p">(</span><span class="n">handleRequest</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">request</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">})</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>上面秩序把域名化成你的域名，然后设置workers的域名是你要转出的域名即可。</p>
]]></content:encoded>
    </item>
    <item>
      <title>初冬时节话镜片防雾</title>
      <link>https://www.iliu.org/posts/talk-about-lens-anti-fog-in-early-winter/</link>
      <pubDate>Mon, 13 Nov 2023 21:16:41 +0800</pubDate>
      <guid>https://www.iliu.org/posts/talk-about-lens-anti-fog-in-early-winter/</guid>
      <description>&lt;p&gt;又到了冬天了，你那里飘雪花了吗？来暖气了吗？&lt;/p&gt;
&lt;p&gt;冬天对眼镜佩戴者来说，最烦人的莫过于镜片起雾了。特别是从外面回到家，或者戴口罩的时候。其实现在树脂镜片已经好很多了，以前的玻璃镜片，那才能让你雾的怀疑人生。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>又到了冬天了，你那里飘雪花了吗？来暖气了吗？</p>
<p>冬天对眼镜佩戴者来说，最烦人的莫过于镜片起雾了。特别是从外面回到家，或者戴口罩的时候。其实现在树脂镜片已经好很多了，以前的玻璃镜片，那才能让你雾的怀疑人生。</p>
<p>那么，有什么办法能防止镜片起雾吗？老刘很负责任的告诉大家，除非消除温度差，否则这个问题很难彻底解决，但是目前也有一些缓解的方案，你可以从中选择适合自己的。</p>
<h2 id="防雾镜片">防雾镜片</h2>
<p>算是目前效果最好的防雾方案了，但是依然不完美。防雾镜片的原理是：<strong>镜片的镀膜采用亲水膜，通俗的讲，能吸水</strong>。这样，产生的雾气，就被膜层吸收掉了。所以，防雾镜片在环境温度变化，比如从外面回家，或者吃火锅等场景的使用效果是很好的。</p>
<p>但是，毕竟膜很薄，吸水的能力有限，当蒸发量大于雾气的的产生量的时候，效果是好的，但是如果持续的产生雾气从而大于蒸发量的时候，防雾的效果就不好了。比如，佩戴口罩。</p>
<p>虽然，防雾镜片的缺点有一些，但是，经过技术改进的防雾镜片依然是目前最优化的防雾方案了。</p>
<h2 id="防雾镜布喷雾">防雾镜布、喷雾</h2>
<p>这类的方案是在镜片的表面涂上一层高分子材料，<strong>增加水分子的张力，使水分子不容易聚合在一起形成水滴</strong>。</p>
<p>优点是，价格便宜、不用换镜片。缺点是，因为是<strong>涂在镜片的表面，很容易被水冲掉，所以，刚开始的效果不错，时间长了就不行了，需要经常擦拭镜片</strong>。</p>
<p>另外一个就是，虽然厂家说这种涂层对人体和镜片的膜层都是无害的。但是到底情况如何也不得而知。因为老刘也没有查到具体用了什么材质的相关文献。自己判断吧。</p>
<h2 id="diy">DIY</h2>
<p>这是老刘我实验很久的独家秘方，这次分享给大家，既然镜片上的雾气是呼吸出来的水蒸气产生的，那么一个办法就是想办法减少到达镜片的水蒸气。我试验过不少的东西，最后发现，<strong>在口罩内放一片面巾纸，效果还是不错的</strong>。</p>
<p>我曾经把这个方法告诉我的顾客，据反馈，大部分人的效果也不错。反正也没有什么成本，你不妨试试咯。</p>
<p>最后，友情提示一下，防雾镜片加面巾纸的做法，效果会更好。😄</p>
]]></content:encoded>
    </item>
    <item>
      <title>在群晖中使用tailscale实现内网穿透</title>
      <link>https://www.iliu.org/posts/using-tailscale-to-achieve-intranet-penetration-in-synology/</link>
      <pubDate>Sun, 12 Nov 2023 21:19:15 +0800</pubDate>
      <guid>https://www.iliu.org/posts/using-tailscale-to-achieve-intranet-penetration-in-synology/</guid>
      <description>&lt;p&gt;在远程连接群晖的实践中，老刘一切介绍过&lt;a href=&#34;https://iliu.org/3356.html&#34;&gt;zerotier&lt;/a&gt;和&lt;a href=&#34;https://iliu.org/3997.html&#34;&gt;IPv6&lt;/a&gt;。但是实际的使用过程中，zerotier有时候握手的速度很慢，而且配置起来比较麻烦，IPv6很好，速度也快，但是有些环境中还只有IPv4，直到我听别人介绍到tailscale这个软件。它的工作原理其实和zerotier差不多，但是不需要什么复杂的设置，直接注册、登录，同一个账号的所有设备都连接到一起了。&lt;/p&gt;
&lt;h2 id=&#34;注册tailscale&#34;&gt;注册tailscale&lt;/h2&gt;
&lt;p&gt;百度直接搜，或者打看&lt;a href=&#34;https://www.tailscale.com/&#34;&gt;tailscale&lt;/a&gt;官方网站。注册就行，不过它不支持自由注册，需要用Google、apple、或者微软的outlook账号注册。&lt;/p&gt;
&lt;h2 id=&#34;下载tailscale&#34;&gt;下载tailscale&lt;/h2&gt;
&lt;p&gt;网页的右上角，有个downloads，点击就可以了。里面有常用的Windows、Linux等的客户端，直接点击下载相应的客户端，并安装。安装后登录，然后在个人中心里，系统自动给你分配了一个ip地址，如果你要了解某个设备，直接在浏览器里打开那个ip地址就好了。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>在远程连接群晖的实践中，老刘一切介绍过<a href="https://iliu.org/3356.html">zerotier</a>和<a href="https://iliu.org/3997.html">IPv6</a>。但是实际的使用过程中，zerotier有时候握手的速度很慢，而且配置起来比较麻烦，IPv6很好，速度也快，但是有些环境中还只有IPv4，直到我听别人介绍到tailscale这个软件。它的工作原理其实和zerotier差不多，但是不需要什么复杂的设置，直接注册、登录，同一个账号的所有设备都连接到一起了。</p>
<h2 id="注册tailscale">注册tailscale</h2>
<p>百度直接搜，或者打看<a href="https://www.tailscale.com/">tailscale</a>官方网站。注册就行，不过它不支持自由注册，需要用Google、apple、或者微软的outlook账号注册。</p>
<h2 id="下载tailscale">下载tailscale</h2>
<p>网页的右上角，有个downloads，点击就可以了。里面有常用的Windows、Linux等的客户端，直接点击下载相应的客户端，并安装。安装后登录，然后在个人中心里，系统自动给你分配了一个ip地址，如果你要了解某个设备，直接在浏览器里打开那个ip地址就好了。</p>
<p>如果你的系统没有在常用的客户端页面，可以点击<a href="https://pkgs.tailscale.com/stable/#spks">这里</a>，会进入一个所有的客户端的页面，找到你的系统下载即可。</p>
<h3 id="群晖中安装">群晖中安装</h3>
<p>点击我上面说的那个连接，然后找到群晖的客户端。根据你群晖的系统选。如果你群晖是DSM6就选6，DSM7就选7，不要选错了。下载之后进入群晖的后台，进入套件中心，点击手动安装。<img loading="lazy" src="https://iliu.org/tupian/qunhui-1.jpg"></p>
<p>安装的时候DSM会有一些权限的提示，选择允许就行了。安装后打开套件，点==connect==那个黑色的按钮，登录你的账号就可以了。</p>
<h3 id="linux里安装与使用">Linux里安装与使用</h3>
<p>也是选择合适系统的客户端，下载安装，如果你用的Arch Linux系列，可以直接用命令安装：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">yay tailscale
</span></span></code></pre></td></tr></table>
</div>
</div><p>安装完之后，和windows下不同的是，它没有一个UI，需要你在命令里进行登录。 首先，运行tailscale：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">sudo systemctl start tailscaled
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后登录：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">sudo tailscale login
</span></span></code></pre></td></tr></table>
</div>
</div><p>会给你网址，点击这个网址，用你的账号登录即可。</p>
<p>登录后使用命令查看目前在线的设备：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">tailscale status
</span></span></code></pre></td></tr></table>
</div>
</div><p>找到群晖的ip地址，选中复制，粘贴到浏览器里，打开，是不是熟悉的群晖后台出现了？</p>
<h2 id="后续的一些优化">后续的一些优化</h2>
<p>如果是你经常用的设备，你不想让这个设备的ip地址发生变化，可以进行一点小小的设置，如下图：<img loading="lazy" src="https://iliu.org/tupian/qunhui-3.png"></p>
<p>但让，tailscale还有一些高级的用法，比如在路由器里安装后，其他设备不用安装也能相互访问，这个有点折腾了，不在本文的范围，有兴趣的朋友可以去官方看相关教程。</p>
]]></content:encoded>
    </item>
    <item>
      <title>EndeavourOS安装之后的几件事</title>
      <link>https://www.iliu.org/A-few-things-after-installing-EndeavourOS/</link>
      <pubDate>Wed, 08 Nov 2023 21:22:44 +0800</pubDate>
      <guid>https://www.iliu.org/A-few-things-after-installing-EndeavourOS/</guid>
      <description>&lt;p&gt;很多追求新，追求精简的Linux系统的使用者，往往都会推荐Arch Linux，这个系统特点是精简，精简到什么都需要你来搞定，所以也让很多人望而却步。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>很多追求新，追求精简的Linux系统的使用者，往往都会推荐Arch Linux，这个系统特点是精简，精简到什么都需要你来搞定，所以也让很多人望而却步。</p>
<p><img alt="最终效果" loading="lazy" src="https://iliu.org/tupian/2023-11-08.png"></p>
<p>后来有人根据Arch Linux开发出manjaro这个系统，一问世就获得了用户的好评，但是，后来manjaro的发展也偏离了初心，EndeavourOs可以简便了Arch Linux的安装，但是又不多添加零碎，是最接近Arch Linux的系统了。老刘原来用Ubuntu，但是又不想到处去找想要安装的软件，所以换成了EndeavourOs，为了打造更好用的系统，老刘安装后做了如下的优化，文章小白可以参考，大佬请路过。</p>
<h2 id="安装输入法">安装输入法</h2>
<p>老刘比较喜欢用的小狼毫的输入法，这个在Linux平台下，叫rime输入法，aur里什么都用，直接命令安装就行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">yay ibus ibus-rime <span class="c1">#安装输入法框架及输入法</span>
</span></span><span class="line"><span class="cl"><span class="c1">#安装雾凇拼音</span>
</span></span><span class="line"><span class="cl">git clone --depth<span class="o">=</span><span class="m">1</span> https://github.com/rime/plum 
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> plum
</span></span><span class="line"><span class="cl">bash rime-install iDvel/rime-ice:others/recipes/full
</span></span><span class="line"><span class="cl"><span class="c1">#以后更新词库这样</span>
</span></span><span class="line"><span class="cl">bash rime-install iDvel/rime-ice:others/recipes/all_dicts
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="安装各种需要的软件">安装各种需要的软件</h2>
<h3 id="微信和qq">微信和QQ</h3>
<p>不得不说，腾讯真的阻碍了中国国产系统的发展，之前QQ死活不弄Linux的，后来出了一个不能用的Linux版本，直到今年才算出了真正意义上的QQ，但是现在微信Linux版依然是基本没法用，不过好在有wine，偶尔凑合的用一下还是可以的。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">yay linuxqq
</span></span><span class="line"><span class="cl">yay wechat deepin
</span></span></code></pre></td></tr></table>
</div>
</div><p>选择你喜欢的版本即可。</p>
<h3 id="visual-studio-code">Visual Studio Code</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">yay visual studio code
</span></span><span class="line"><span class="cl"><span class="c1">#这里不建议使用code那个版本，虽然是开源的，但是我觉得没有官方版本好用</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="笔记软件obsidian">笔记软件obsidian</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">yay obsidian
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="hugo">Hugo</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">yay hugo
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="zsh">zsh</h3>
<p>系统自带的是bash，我比较喜欢用的是zsh，因为功能更强大。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo pacman -S zsh
</span></span><span class="line"><span class="cl">sudo pacman -S zsh-autosuggestions
</span></span><span class="line"><span class="cl">sudo pacman -S zsh-syntax-highlighting
</span></span><span class="line"><span class="cl">sudo pacman -S zsh-theme-powerlevel10k
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后，设置默认shell位zsh</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">chsh -s /usr/bin/zsh
</span></span></code></pre></td></tr></table>
</div>
</div><p>开始配置，我使用了一个脚本</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">yay -S oh-my-zsh-git
</span></span><span class="line"><span class="cl">cp /usr/share/oh-my-zsh/zshrc ~/.zshrc
</span></span></code></pre></td></tr></table>
</div>
</div><p>重新打开终端，应该就是zsh了，不过现在还不是很好用，我们需要在配置一下。</p>
<p>编辑~/.zshrc文件，找到ZSH_THEME=“robbyrussell&quot;在这里改成自己想要的主题名字就行了，打开新的终端就能看到效果，我用的是agnoste。找到<code>plugins=(git)</code>这个位置，加上几个我们之前安装的插件。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">plugins</span><span class="o">=(</span>
</span></span><span class="line"><span class="cl">git
</span></span><span class="line"><span class="cl">autojump
</span></span><span class="line"><span class="cl">zsh-syntax-highlighting
</span></span><span class="line"><span class="cl">zsh-autosuggestions
</span></span><span class="line"><span class="cl"><span class="o">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>注意，不要用逗号之类的标点符号。重新打开终端试试吧，比默认的bash好用的多了。</p>
<h3 id="microsoft-edge">Microsoft edge</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">yay microsoft edge <span class="c1">#版本比较多，选你喜欢的安装即可</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>总而言之，用Arch Linux系，想要什么软件，直接yay即可。在这方面，要比Windows安装软件方便的多😄。</p>
<h2 id="对系统进行一点优化">对系统进行一点优化</h2>
<h3 id="安装插件">安装插件</h3>
<p>gnome做的是实在太精简了，所以还要搞一点点的优化才用好。这个就需要用到插件了。Chrome和Firefox浏览器都用gnome的插件。在浏览器里搜gnome然后，安装上就行。不过这里有个坑，浏览器显示缺少一个叫chrome-gnome-shell软件，你的第一反应一定是</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">yay chrome gnome shell
</span></span></code></pre></td></tr></table>
</div>
</div><p>但是很不幸，这个已经没有了，改名了，正确的做法是：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">yay -S gnome-browser-connector
</span></span></code></pre></td></tr></table>
</div>
</div><p>现在你可以在浏览器上安装你要的插件了，目前用了以下三个</p>
<h4 id="dash-to-dock">dash to dock</h4>
<p>这个玩意不装的话，鼠标移动到dock栏不会自动出来，装上就方便很多</p>
<h4 id="农历插件">农历插件</h4>
<p>这个插件可以显示农历，但是节气有时候不太对。装之前需要装另外一个软件</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">yay -Sy lunar-date
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="天气插件">天气插件</h4>
<p>这个插件可以在时间的那个位置显示天气信息，用的是挪威的天气源，能看个大概</p>
]]></content:encoded>
    </item>
    <item>
      <title>Hugo-papermod主题的优化记录</title>
      <link>https://www.iliu.org/posts/hugo-papermod-modification/</link>
      <pubDate>Sat, 04 Nov 2023 21:30:05 +0800</pubDate>
      <guid>https://www.iliu.org/posts/hugo-papermod-modification/</guid>
      <description>&lt;p&gt;在上一篇文章中曾经说到把博客从WordPress转到了Hugo，经过这几天的使用，发现还是很不错的，用起来也比较方便。但是，在使用PaperMod主题的时候，也是遇到了一些问题，本文就遇到的问题作一个记录。目前，主题的代码高亮功能还是没有搞定，不过也是影响不大，先放一放也无所谓。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>在上一篇文章中曾经说到把博客从WordPress转到了Hugo，经过这几天的使用，发现还是很不错的，用起来也比较方便。但是，在使用PaperMod主题的时候，也是遇到了一些问题，本文就遇到的问题作一个记录。目前，主题的代码高亮功能还是没有搞定，不过也是影响不大，先放一放也无所谓。</p>
<h3 id="首页不显示文章">首页不显示文章</h3>
<p>把WordPress导出的md文件导入的Hugo的psots目录后，在使用代码创建新文件时候</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">hugo new posts/***.md
</span></span></code></pre></td></tr></table>
</div>
</div><p>发现新建的md文件，生成网页后不会在首页显示。但是在栏目里是会有的。后来的在@<a href="https://www.sharpgan.com/">阿甘博客</a>博客的提醒下，使用导出的md文件的文档属性标头，成功的显示了。但是，每次在生成文章md的时候，都需要手动的更改，不是太方便。后来，在看某篇文章的时候得到启发，修改archetypes/default.md,把默认的代码删除，改成：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">title: &#34;{{ replace .Name &#34;-&#34; &#34; &#34; | title }}&#34; 
</span></span><span class="line"><span class="cl">author: 老刘
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">date: {{ .Date }}
</span></span><span class="line"><span class="cl">url: /optics-weekly-issue-8/
</span></span><span class="line"><span class="cl">categories:
</span></span><span class="line"><span class="cl">  - 齐物
</span></span><span class="line"><span class="cl">---
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后，再创建md文件后，只需要修改一下url里的值就OK了。</p>
<h3 id="增加评论功能">增加评论功能</h3>
<p>这个主要是copy了阿甘博客的方法。 在artalk的官方文档中找到<code>Artalk.css</code>和<code>Artalk.js</code>文件的cdn地址然后下载到本地，在hugo项目根目录的/static文件夹下面新建一个叫 artalk的文件夹，然后把前述两个静态文件放进这个文件夹</p>
<p>创建模板文件 /主题目录/layouts/partials/comment/artalk.html，文件内容如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&lt;link href=&#34;https://www.iliu.org/artalk/Artalk.css&#34; rel=&#34;stylesheet&#34;&gt;
</span></span><span class="line"><span class="cl">&lt;script src=&#34;https://www.iliu.org/artalk/Artalk.js&#34;&gt;&lt;/script&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;!-- Artalk --&gt;
</span></span><span class="line"><span class="cl">&lt;div id=&#34;Comments&#34;&gt;&lt;/div&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;script&gt;
</span></span><span class="line"><span class="cl">  Artalk.init({
</span></span><span class="line"><span class="cl">    el:        &#39;#Comments&#39;,
</span></span><span class="line"><span class="cl">    pageKey:   &#39;{{ .Permalink }}&#39;,
</span></span><span class="line"><span class="cl">    pageTitle: &#39;{{ .Title }}&#39;,
</span></span><span class="line"><span class="cl">    server:    &#39;{{ $.Site.Params.artalk.server }}&#39;,
</span></span><span class="line"><span class="cl">    site:      &#39;{{ $.Site.Params.artalk.site }}&#39;,
</span></span><span class="line"><span class="cl">    // ...你的其他配置
</span></span><span class="line"><span class="cl">  })
</span></span><span class="line"><span class="cl">&lt;/script&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>文章页模板 /主题目录/layouts/_default/single.html 合适的位置添加：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&lt;div class=&#34;article-comments&#34;&gt;
</span></span><span class="line"><span class="cl">  {{- partial &#34;comment/artalk&#34; . -}}
</span></span><span class="line"><span class="cl">&lt;/div&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>具体位置为<code>single.html</code>文件的{{- if (.Param “comments”) }}判断体中，完整的代码如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">{{- if (.Param &#34;comments&#34;) }}
</span></span><span class="line"><span class="cl">  &lt;div class=&#34;article-comments&#34;&gt;
</span></span><span class="line"><span class="cl">  {{- partial &#34;comment/artalk&#34; . -}}
</span></span><span class="line"><span class="cl">&lt;/div&gt;
</span></span><span class="line"><span class="cl">  {{- end }}
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后在 Hugo 配置文件中添加如下内容：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">params:
</span></span><span class="line"><span class="cl">  artalk:
</span></span><span class="line"><span class="cl">    server: &#39;https://artalk.sharpgan.com&#39;
</span></span><span class="line"><span class="cl">    site: &#39;图南博客&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><p>至于artalk的部署方法，可以用docker来部署，官方有详细的方法</p>
<h3 id="不加载css和js">不加载CSS和JS</h3>
<p>这个问题有点玄学，很多教程给出的答案都是去Cloudflare里修改，使优化不压缩js和CSS，但是在我这里没有效果。看了错误的提示好像是SHA-256完整性的检查不通过，浏览器阻塞了。 一般的解决办法是： 是要么关闭 SRI，要么取消 Cloudflare 的「Auto Minify」。 Cloudflare 关闭的方法：速度 - 优化 - Auto Minify。 在 Hugo 中关闭的方法：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">params:
</span></span><span class="line"><span class="cl">  assets:
</span></span><span class="line"><span class="cl">    disableFingerprinting: true
</span></span></code></pre></td></tr></table>
</div>
</div><p>但是，在我这里怎么搞都没有用。 后来看到一个哥们的博客，网址我忘掉了，通过修改一个值，搞定了。 在 themes\PaperMod\layouts\partials 文件夹下找到一个 head.html 文件，发现里面确实有 integrity=&quot;{{ $stylesheet.Data.Integrity }}&quot; 这么一句代码，把它改为 integrity=&quot;&quot; 然后重新发布</p>
<h3 id="代码高亮">代码高亮</h3>
<p>这个我参考了阿甘和其他的一些文章，但是都没有成功，有时候有一点颜色，有时候一丢丢颜色也没有。我感觉可能是和物品修改了上面的那个head.html有关系。 然而，我的猜测是错误❌的，加上那个代码也没有用。然后我回复用官方的一个dome，发现是可以显示代码高亮的，仔细查看了我的配置文件和官方的配置文件的差别，发现是在设置代码高亮的那个地方，有一个选项不能是true，不然就不显示，太玄学了。 具体代码：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">highlight:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># anchorLineNos: true
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">noClasses: false
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># anchorLineNos: true
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#codeFences: true
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#guessSyntax: true
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">lineNos: true
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">style: monokai
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>视光周刊（第9期）：年轻的时候近视，年老不花眼？</title>
      <link>https://www.iliu.org/posts/optics-weekly-issue-9/</link>
      <pubDate>Fri, 03 Nov 2023 21:33:27 +0800</pubDate>
      <guid>https://www.iliu.org/posts/optics-weekly-issue-9/</guid>
      <description>&lt;p&gt;这里记录每周值得分享的视光内容。周五在&lt;strong&gt;光学视界&lt;/strong&gt;公众号和&lt;strong&gt;图南博客&lt;/strong&gt;发布。本周的主要内容包括：&lt;strong&gt;角膜塑形镜的安全性，近视人年老了会不会老花，高度近视人的选框技巧&lt;/strong&gt;等。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>这里记录每周值得分享的视光内容。周五在<strong>光学视界</strong>公众号和<strong>图南博客</strong>发布。本周的主要内容包括：<strong>角膜塑形镜的安全性，近视人年老了会不会老花，高度近视人的选框技巧</strong>等。</p>
<p>投稿请发邮件至：ewader@qq.com。</p>
<h2 id="封面图-防紫外线的重要性">封面图-防紫外线的重要性</h2>
<p><img alt="严重的白内障患者的眼睛" loading="lazy" src="https://iliu.org/zhoukan/9-1.jpg"></p>
<p>这是一只患有严重白内障患者的眼睛，可以看到整个眼球都类似一个玉石一样的颜色了。可想而知，该患者的视力情况。 预防白内障要从防紫外线着手，比如外出佩戴防紫外线的太阳镜，一定要用合格的，UV400以上的才有效果。 另外常带眼镜的人可以选择佩戴变色的镜片，也是可以达到非常好的防护眼睛的效果。</p>
<h2 id="本周视光内容">本周视光内容</h2>
<h3 id="角膜塑形镜的安全性">角膜塑形镜的安全性</h3>
<p>中国的研究人员系统地评估了关于控制近视发展的现有文献，发现角膜塑形术是一种安全的方法来预防和控制近视。在14项涉及2058名儿童的研究中，角膜塑形术在控制近视进展方面表现出优于框架眼镜的效果。<img alt="佩戴角膜塑形镜后的图像" loading="lazy" src="https://iliu.org/zhoukan/9-2.jpg"></p>
<p>角膜塑形术通过改善视觉质量、减少角膜刺激、改善泪液循环和泪膜稳定性来发挥作用。研究人员强调，这不仅改变了近视患者的角膜曲率，还改善了他们的裸眼视力、减少近视度数和眼轴长度，从而控制近视的发展。</p>
<p>但是研究人员也表示：对于不同种族儿童使用ok镜的长期疗效和安全性是否存在差异，以及不同ok镜对不同类型近视和不同年龄患者的疗效，研究小组仍心存疑虑。他们总结说，这些问题仍需要通过大量高质量的随机对照研究来进一步验证。</p>
<p>本文详见：<a href="https://www.reviewofoptometry.com/article/orthok-safe-with-room-for-improvement">Ortho-K Safe, With Room for Improvement</a></p>
<h3 id="年轻时近视老了之后不会老花眼">年轻时近视，老了之后不会老花眼？</h3>
<p>不知道从什么时候，流行这么一个说法：</p>
<blockquote>
<p>年轻的时候近视了，年纪大了就不花眼了！年轻的时候戴眼镜，年纪大了就不用戴了。</p></blockquote>
<p>这个说法不知道从何而其，我小时候刚近视的时候，大家都这么说，一直到现在30多年了，还有顾客给我这么说，那么这个说法正确吗？</p>
<p>当然，不正确！近视是近视，老花是老花，这是两个不同的概念，近视是👀轴变长引起的，老花是睫状肌老化引起的！所以，近视的人该老花还是要老花。</p>
<p>这篇文章就这个问题，做了详细的说明，<a href="https://mp.weixin.qq.com/s?__biz=MzI0NTAwNDg4OQ==&amp;mid=2651110413&amp;idx=1&amp;sn=ab7e6cecdf6f4878a74d534ffb17fffd&amp;chksm=f2a5333bc5d2ba2d16339faf88b5ad2ec2496cde5aca1c69222d64c9520dbb7ec9e789f15b30&amp;mpshare=1&amp;scene=24&amp;srcid=1030jbgVOy734MB1XR6Spowa&amp;sharer_shareinfo=524bc412aa10f5036d2f33eb1d0f3966&amp;sharer_shareinfo_first=524bc412aa10f5036d2f33eb1d0f3966#rd">感兴趣的可以看看到底是什么原理</a>。</p>
<h3 id="高度近视的选框技巧">高度近视的选框技巧</h3>
<p>随着电脑手机的普及，人们近距离用眼的增加，很多不近视的人近视了，而原来轻微近视的发展成高度了，那么高度近视在选择镜架的时候要注意什么呢？一般应该注意如下几点：</p>
<ul>
<li>应尽可能<strong>选用稳定性高的高度近视镜框</strong>，避免使用无框镜架，一般推荐金属框。</li>
<li><strong>镜眼距要确保在11~12mm</strong>，宁愿稍大一点，也不能太小（镜眼距是指的眼睛到镜片的距离）</li>
<li><strong>不要采用前倾角过大或面弯过大的镜架</strong>。</li>
<li><strong>高度近视尽量选择全框或半框镜架</strong></li>
<li><strong>高度近视一定要测量瞳高，确保装配的准确</strong></li>
</ul>
<p>具体内容，可以<a href="https://mp.weixin.qq.com/s?__biz=MzI0NTAwNDg4OQ==&amp;mid=2651109179&amp;idx=1&amp;sn=a2cd0124c18e67f5c723be08edf584b0&amp;chksm=f2a5380dc5d2b11b59ea905631bd41b19dc93b0e57e021ccebbb165777458d304c981818babe&amp;mpshare=1&amp;scene=24&amp;srcid=1027dORNtWr2MMBlSLmWY66V&amp;sharer_shareinfo=1e5721950bd17a3bc98cffce5565d1c9&amp;sharer_shareinfo_first=1e5721950bd17a3bc98cffce5565d1c9#rd">点击</a>查看。</p>
<h2 id="关于视光周刊">关于视光周刊</h2>
<p><img alt="周刊" loading="lazy" src="https://iliu.org/zhoukan/foot.jpeg"></p>
<p>我是一名爱读书的验光师，受佛道两家的思想影响颇深。有感于目前很多视光号发布的文章质量参差不齐，甚至打着科普的旗号在制造焦虑，遂产生了把看到的优质的视光内容聚合起来的想法。 如果你还喜欢我的内容的话，==不妨点个赞，转发一下或者关注一下我们的公众号==。这是对我最大的支持，您对我们的周刊有任何意见或者建议，欢迎留言给我们。</p>
]]></content:encoded>
    </item>
    <item>
      <title>从WordPress转到Hugo</title>
      <link>https://www.iliu.org/frome-wordpress-to-hugo/</link>
      <pubDate>Wed, 01 Nov 2023 21:35:36 +0800</pubDate>
      <guid>https://www.iliu.org/frome-wordpress-to-hugo/</guid>
      <description>&lt;p&gt;在cloudcone上买的VPS马上就要到期了，由于去年买的是黑五预售，比正经黑五的机子要贵20来块钱，而且配置还要低一些。所以，续费是不能续费的了。原本打算在荷兰的liteserver这个上面暂时放一段时间。这是一台2c2g的机子，装完php、MySQL、和Nginx之后，只要运行一段时间，内存就基本上爆了。再加上最近lnmp和oneinstack都被收购而且被挂恶意代码，也不想用宝塔之类的面板，自己编译环境又很麻烦。于是，就产生了转成静态博客的想法。在这里也要感谢阿甘和韩宇的帮助。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>在cloudcone上买的VPS马上就要到期了，由于去年买的是黑五预售，比正经黑五的机子要贵20来块钱，而且配置还要低一些。所以，续费是不能续费的了。原本打算在荷兰的liteserver这个上面暂时放一段时间。这是一台2c2g的机子，装完php、MySQL、和Nginx之后，只要运行一段时间，内存就基本上爆了。再加上最近lnmp和oneinstack都被收购而且被挂恶意代码，也不想用宝塔之类的面板，自己编译环境又很麻烦。于是，就产生了转成静态博客的想法。在这里也要感谢阿甘和韩宇的帮助。</p>
<p>原本以为很复杂，其实操作下来发现也是挺简单的。</p>
<h2 id="首先wordpress的文章转换成md文件">首先，WordPress的文章转换成md文件</h2>
<p>这里有大佬已经整好了，我是使用的插件的形式。 在WordPress的插件目录<code>wp-content/plugins/</code>下，直接克隆<code>WordPress to Hugo Exporter</code>的源码。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">$</span> <span class="n">git</span> <span class="n">clone</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">SchumacherFM</span><span class="o">/</span><span class="n">wordpress</span><span class="o">-</span><span class="n">to</span><span class="o">-</span><span class="n">hugo</span><span class="o">-</span><span class="n">exporter</span><span class="o">.</span><span class="n">git</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后进到网站的后台，在插件里启用这个插件。在工具里，点<code>Export to Hugo</code>。会下载一个压缩包，这个压缩包就是你网站的文章转换成的md文件。 这个插件很好用，能保留网站原来的目录，换成Hugo后，搜索引擎的收录不会受到影响。</p>
<h2 id="第二步安装hugo">第二步，安装Hugo</h2>
<p>我是用的系统是Ubuntu22.04，所以直接安装就好了。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">sudo snap install hugo
</span></span><span class="line"><span class="cl">hugo new site youweb
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后进入到你的网站文件夹，找一个喜欢的主题。一般主题都会有使用的方法，按照使用方法安装即可。 另外主题里面也都会有网站设置的样板，把样板文件<code>hugo.yml</code>放到网站的根目录，按照自己网站的域名啥的设置一下。</p>
<p>安装设置完成后，把你下载的文件，md文件copy到content这个文件夹，图片之类的放到static。然后</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">hugo server
</span></span></code></pre></td></tr></table>
</div>
</div><p>打开浏览器，localhost：1313，文章是不是显示出来了？</p>
<h2 id="第三生成html文件并上传">第三，生成HTML文件，并上传</h2>
<p>使用代码</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">hugo
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后把public这个文件夹的内容传到你的虚拟主机、VPS或者GitHub，Cloudflare page等，再绑定域名就可以了。 至于如何操作，网上的教程大把的，直接参考就行了。</p>
<h2 id="测试一下代码高亮">测试一下代码高亮</h2>
<p>代码：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&lt;link href=&#34;https://www.iliu.org/artalk/Artalk.css&#34; rel=&#34;stylesheet&#34;&gt;
</span></span><span class="line"><span class="cl">&lt;script src=&#34;https://www.iliu.org/artalk/Artalk.js&#34;&gt;&lt;/script&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;!-- Artalk --&gt;
</span></span><span class="line"><span class="cl">&lt;div id=&#34;Comments&#34;&gt;&lt;/div&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;script&gt;
</span></span><span class="line"><span class="cl">  Artalk.init({
</span></span><span class="line"><span class="cl">    el:        &#39;#Comments&#39;,
</span></span><span class="line"><span class="cl">    pageKey:   &#39;{{ .Permalink }}&#39;,
</span></span><span class="line"><span class="cl">    pageTitle: &#39;{{ .Title }}&#39;,
</span></span><span class="line"><span class="cl">    server:    &#39;{{ $.Site.Params.artalk.server }}&#39;,
</span></span><span class="line"><span class="cl">    site:      &#39;{{ $.Site.Params.artalk.site }}&#39;,
</span></span><span class="line"><span class="cl">    // ...你的其他配置
</span></span><span class="line"><span class="cl">  })
</span></span><span class="line"><span class="cl">&lt;/script&gt;
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>思源笔记群晖正确的部署方法</title>
      <link>https://www.iliu.org/posts/4418/</link>
      <pubDate>Sat, 01 Jul 2023 03:10:30 -0400</pubDate>
      <guid>https://www.iliu.org/posts/4418/</guid>
      <description>&lt;p&gt;最近一直在选择一款适合自己的笔记软件，最后确定在思源笔记和 Joplin 这两个上面，打算都长期试用一下，比较一下哪个更适合自己。&lt;/p&gt;
&lt;h2 id=&#34;事情的起因&#34;&gt;事情的起因&lt;a href=&#34;#%E4%BA%8B%E6%83%85%E7%9A%84%E8%B5%B7%E5%9B%A0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;思源笔记的升级是相当频繁，可是我却发现，每次 docker 升级后，数据都没有保存下来，只能从备份的数据里重新导入，找了一下原因，发现是映射的文件夹里面没有数据，于是就重新安装，发现按照网上的教程，安装后 跑不起来。经过一番摸索，总算是搞定了！&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>最近一直在选择一款适合自己的笔记软件，最后确定在思源笔记和 Joplin 这两个上面，打算都长期试用一下，比较一下哪个更适合自己。</p>
<h2 id="事情的起因">事情的起因<a href="#%E4%BA%8B%E6%83%85%E7%9A%84%E8%B5%B7%E5%9B%A0">#</a></h2>
<p>思源笔记的升级是相当频繁，可是我却发现，每次 docker 升级后，数据都没有保存下来，只能从备份的数据里重新导入，找了一下原因，发现是映射的文件夹里面没有数据，于是就重新安装，发现按照网上的教程，安装后 跑不起来。经过一番摸索，总算是搞定了！</p>
<h2 id="成功部署的方法">成功部署的方法<a href="#%E6%88%90%E5%8A%9F%E9%83%A8%E7%BD%B2%E7%9A%84%E6%96%B9%E6%B3%95">#</a></h2>
<p>关于如何在群晖上设置Docker等基础的教程，老刘就不再重复制造数据垃圾了，既然你能找到我这里，说明你也已经查了很多的资料了，部署的方法都大同小异，只需要注意以下两点就可以了。</p>
<p>经过博友@<a href="https://laomai.org">老麦</a>的反馈，直接在Container Manager上操作的话，第一步可以不做，直接用第二步即可。详细看下面老麦的评论。</p>
<h3 id="第一在运行命令那处填写">第一，在运行命令那处填写：<a href="#%E7%AC%AC%E4%B8%80-%E5%9C%A8%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4%E9%82%A3%E5%A4%84%E5%A1%AB%E5%86%99--">#</a></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"> &lt;s&gt;-workspace /siyuan/workspace/&lt;/s&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>经过老刘的测试，最新版的思源，只能用上面的这句命令，用别的任何命令，群晖的Docker都会重复重启。</p>
<h3 id="第二储存空间设置">第二，储存空间设置</h3>
<p><a href="#%E7%AC%AC%E4%BA%8C%E5%82%A8%E5%AD%98%E7%A9%BA%E9%97%B4%E8%AE%BE%E7%BD%AE-%E7%AC%AC%E4%BA%8C%E5%82%A8%E5%AD%98%E7%A9%BA%E9%97%B4%E8%AE%BE%E7%BD%AEfigure-classwp-block-image">#</a></p>
<p><img loading="lazy" src="https://cdn.staticaly.com/gh/ewader/img@master/20230701/xxx.6lnukqsan6c0.webp"></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&lt;span class=&#34;hljs-regexp&#34;&gt;/Home/&lt;/span&gt;siyuan
</span></span></code></pre></td></tr></table>
</div>
</div><p>以前的教程都是把群晖本地的文件夹映射到Docker的siyuan目录，现在看了是不正确的，这个目录如果填写不正确，思源的Docker可以正常启动，但是升级后，数据都会全部删除，因为没有正确的映射到本地文件夹。<br />这样就可以运行起来了。</p>
]]></content:encoded>
    </item>
    <item>
      <title>近视人群夏季佩戴太阳镜的几种方案</title>
      <link>https://www.iliu.org/4408.html</link>
      <pubDate>Wed, 24 May 2023 02:55:30 -0400</pubDate>
      <guid>https://www.iliu.org/4408.html</guid>
      <description>&lt;p&gt;夏天到了，阳光明媚，很多人都想佩戴太阳镜保护眼睛。但是对于近视人群来说，普通的太阳镜无法满足需求，那么应该怎样选择和佩戴太阳镜呢？下面为大家介绍几种方案。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>夏天到了，阳光明媚，很多人都想佩戴太阳镜保护眼睛。但是对于近视人群来说，普通的太阳镜无法满足需求，那么应该怎样选择和佩戴太阳镜呢？下面为大家介绍几种方案。</p>
<h2 id="隐形眼镜非处方太阳镜">隐形眼镜+非处方太阳镜<a href="#%E9%9A%90%E5%BD%A2%E7%9C%BC%E9%95%9C%E9%9D%9E%E5%A4%84%E6%96%B9%E5%A4%AA%E9%98%B3%E9%95%9C">#</a></h2>
<p>对于已经佩戴隐形眼镜的近视人群来说，可以直接选择佩戴非处方太阳镜。老刘上大学的时候就曾动过这个念头，不过一直到现在也没有实施，原因是<strong>佩戴隐形眼镜比较麻烦，虽然现在有日抛型的隐形，但是使用的成本较高</strong>。</p>
<h2 id="定制近视太阳镜">定制近视太阳镜<a href="#%E5%AE%9A%E5%88%B6%E8%BF%91%E8%A7%86%E5%A4%AA%E9%98%B3%E9%95%9C">#</a></h2>
<p>对于需要矫正近视的人群来说，虽然不能佩戴普通的太阳镜，但是目前可以选择定制近视太阳镜，在验光后由专业的配镜人员根据具体的近视情况以及太阳镜材质、颜色进行定制。定制近视太阳镜不仅能够满足夏天佩戴太阳镜的需求，还能够矫正视力，对眼健康有很好的保护作用。<br />但是这个方案对<strong>高度近视的朋友不是很友好。做出来的眼镜很重。所以，推荐给中低度近视人群使用</strong>。</p>
<h2 id="变色镜片">变色镜片<a href="#%E5%8F%98%E8%89%B2%E9%95%9C%E7%89%87">#</a></h2>
<p>变色镜片可以根据环境光线强度自动调节镜片颜色，能够有效地抵挡眩光和强光的刺激，使得视线更加舒适，同时具有紫外线防护作用。好的变色镜片可是实现秒变色，褪色速度也很快。对于，重高度近视的人群来说，是一个非常理想的选择。<br />但是变色镜片收到环境的影响比较大，比如说温度和紫外线的强度，在同等的条件下，<strong>温度越高，变色的效果会越差</strong>。同时也会收到紫外线的影响，有时候虽然光学很亮，但是紫外线很少的情况下，镜片的变色效果也不好，比如车内。好在目前也开发出来了车内变色镜片，但是价格较贵。</p>
<p>总之，选择合适的太阳镜对于近视人群的眼健康至关重要。尽管现在市面上有很多太阳镜可以选择，但是一定要根据自身的近视情况、角膜曲率等因素进行选择。建议大家带领着验光单，到专业的配镜机构进行购买和定制。</p>
]]></content:encoded>
    </item>
    <item>
      <title>在manjaro中安装使用Rime并启用雾凇输入法</title>
      <link>https://www.iliu.org/4367.html</link>
      <pubDate>Sun, 23 Apr 2023 09:47:27 +0000</pubDate>
      <guid>https://www.iliu.org/4367.html</guid>
      <description>&lt;p&gt;前几天，在朋友的推荐下，使用了小狼毫rime输入法，不过那是在Windows11里使用的，装的另外一个系统是manjaro，偶尔想搞几下Python代码的时候会使用，在这个系统里一直使用的Fcitx5，这个输入法也是挺成熟的了，用起来也很不错，不过既然在Windows里使用了rime就想在manjaro里也使用。## 安装方法&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>前几天，在朋友的推荐下，使用了小狼毫rime输入法，不过那是在Windows11里使用的，装的另外一个系统是manjaro，偶尔想搞几下Python代码的时候会使用，在这个系统里一直使用的Fcitx5，这个输入法也是挺成熟的了，用起来也很不错，不过既然在Windows里使用了rime就想在manjaro里也使用。## 安装方法</p>
<p>首先要安装Fcitx5输入法框架，由于老刘已经在使用了，所以这一步就省略了，如果你还没有安装Fcitx5输入法，请参考老刘的另一篇文章，《<a href="https://iliu.org/4016.html">manjaro安装配置Fcitx5输入法</a>》。</p>
<pre class="wp-block-code"><code>sudo pacman -S fcitx5-rime 
</code></pre>
<p>就这么一行简单的代码就可以，然后在输入法的配置里，把rime加入进来，这时候，rime已经是可以使用的了，选择明月输入法即可。</p>
<p>由于我们是要用雾凇的词库，因此还需要把雾凇的词库设置一下。在manjaro下配置雾凇词库其实和Windows下类似，老刘从网上找的一些教程，包括官方写Arch的安装方法是：</p>
<pre class="wp-block-code"><code># paru 默认会每次重新评估 pkgver，所以有新的提交时 paru 会自动更新，
# yay 默认未开启此功能，可以通过此命令开启
# yay -Y --devel --save

paru -S rime-ice-git
# yay -S rime-ice-git
</code></pre>
<p>实际这么安装之后，输入法里并没有出现雾凇拼音。于是，老刘参考之前写的《<a href="https://iliu.org/4357.html">开始试用小狼毫输入法</a>》里设置雾凇拼音的方法，直接在https://github.com/iDvel/rime-ice下载代码，解压后把解压出来的文件放在$HOME/.local/share/fcitx5/rime/里，输入法里已经出现了雾凇拼音，至此已经可以使用了。</p>
<p>在manjaro里使用rime体验和Windows下一致，非常的丝滑，并且词库很全，包括颜文字，推荐大家使用。</p>
]]></content:encoded>
    </item>
    <item>
      <title>开始试用小狼毫输入法</title>
      <link>https://www.iliu.org/4357.html</link>
      <pubDate>Fri, 14 Apr 2023 04:24:52 +0000</pubDate>
      <guid>https://www.iliu.org/4357.html</guid>
      <description>&lt;p&gt;自从用到win10以来，就开始懒得安装输入法了，毕竟微软拼音已经可以胜任很多的输入了。不过微软输入法有一点不太能容忍的bug是，偶尔会卡系统，不过也没有太放在心上。今天漂了一眼博客群，然后就看到博友推荐小狼毫输入法，我就不声不响的安装了一下，目前来看，基本是可以满足我的需求。直接安装使用了，高级的使用方法也没有去可以的学习。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>自从用到win10以来，就开始懒得安装输入法了，毕竟微软拼音已经可以胜任很多的输入了。不过微软输入法有一点不太能容忍的bug是，偶尔会卡系统，不过也没有太放在心上。今天漂了一眼博客群，然后就看到博友推荐小狼毫输入法，我就不声不响的安装了一下，目前来看，基本是可以满足我的需求。直接安装使用了，高级的使用方法也没有去可以的学习。</p>
<h2 id="启用雾凇拼音的方法">启用雾凇拼音的方法</h2>
<p>雾凇拼音是小狼毫框架下优化的一个词库吧，听群里大佬介绍说很不错，打算用上，可是对如何使用真是一头的雾水，最初把下载来的文件放进了<strong>小狼毫的data文件夹</strong>下，结果选择雾凇拼音之后，中文输入是空白的。</p>
<p>后来研究了半天，发现实现的方法是如此简单，右键点击输入法的图标，选择用户文件夹，然后在GitHub的仓库地址：<a href="https://github.com/iDvel/rime-ice">GitHub – iDvel/rime-ice: Rime 配置：雾凇拼音 | 长期维护的简体词库</a>下载词库，下载后解压到刚才那个用户文件夹中。</p>
<p>还是右键点输入法图标，选择输入法设定，选择雾凇拼音即可</p>
<p>顺便吐槽一下相关部门开发的软件，真的堪比病毒。上午收到短信，意思是该申报下一年的工资了，于是抽屉里翻出了社保用的UKEY，到官网下载驱动程序，只见卡巴斯基是一连串的报警，而且还删除了好几个和驱动无关的程序。</p>
<p>以为驱动就这么废了，结果重启后，驱动是正常了，原来是软件里夹带了很多的私活，这就是现状！想想河南有多少企业，每个企业至少一个电脑要安装这个破玩意。</p>
]]></content:encoded>
    </item>
    <item>
      <title>使用群晖自动备份网站</title>
      <link>https://www.iliu.org/4131.html</link>
      <pubDate>Sat, 28 May 2022 08:23:06 +0000</pubDate>
      <guid>https://www.iliu.org/4131.html</guid>
      <description>&lt;p&gt;不管是做网站也好，写独立博客也好，最重要的事情之一就是备份。几乎每一个站长都经历过一不小心，多年的心血付之东流的经历。不过好在现在备份的方法很多，可以备份到本地，可以备份的腾讯cos，阿里云等等。云储存也不贵，几十块钱甚至十几块可以用一年，唯一的缺点是这些云储存都收取上行流量费。也就是说，一旦你用到你的数据，想把数据下载到本地，是还要付出一些费用的。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>不管是做网站也好，写独立博客也好，最重要的事情之一就是备份。几乎每一个站长都经历过一不小心，多年的心血付之东流的经历。不过好在现在备份的方法很多，可以备份到本地，可以备份的腾讯cos，阿里云等等。云储存也不贵，几十块钱甚至十几块可以用一年，唯一的缺点是这些云储存都收取上行流量费。也就是说，一旦你用到你的数据，想把数据下载到本地，是还要付出一些费用的。</p>
<p>折腾群晖的时候，发现群晖的Active Back for Business这个套件可以自动的同步服务器上的文件，非常的方便，于是拿来备份网站，还是非常的方便的。</p>
<h2 id="安装active-back-for-business">安装Active Back for Business</h2>
<p>群晖套件中心里，找到Active Back for Business，并安装。不多说。</p>
<h2 id="使用active-back-for-business备份网站">使用Active Back for Business备份网站</h2>
<p>一、打开Active Back for Business套件，点击文件服务器。二、点击添加服务器。这里我们选择rsync服务器。然后下一步。三、填写服务器信息，并点击完成。四、选择备份模式，这里老刘选择的是增量备份，也可以选择多版本备份，这样就可以自动备份你设定的几个版本。五、选择你网站文件所在的文件夹，选择备份时间，即可。</p>
<h2 id="可能会遇到的问题">可能会遇到的问题</h2>
<p>在填写服务器的时候，可能会提示服务器没有安装rsync，只需在服务器中安装这个服务即可。</p>
<pre class="wp-block-code"><code>#Debian或者Ubuntu
apt install rsync
CentOs
yum install rsync</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>manjaro安装配置fcitx5输入法</title>
      <link>https://www.iliu.org/4016.html</link>
      <pubDate>Thu, 06 Jan 2022 09:38:19 +0000</pubDate>
      <guid>https://www.iliu.org/4016.html</guid>
      <description>&lt;p&gt;网上很多文章都说manjaro多么的牛叉，软件如何的多，如何的稳定，滚动更新如何的方便等等等等。下午没事，在一台不怎么用的电脑上试用了一下这个系统。kde的界面很漂亮，运行也流畅，但就是没使用习惯，总体来说不如debian系的方便。也可能是我用习惯了的缘故吧。记得张波老师在群里问过manjaro如何安装输入法的问题，特意安装了最新的fcitx5输入法。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>网上很多文章都说manjaro多么的牛叉，软件如何的多，如何的稳定，滚动更新如何的方便等等等等。下午没事，在一台不怎么用的电脑上试用了一下这个系统。kde的界面很漂亮，运行也流畅，但就是没使用习惯，总体来说不如debian系的方便。也可能是我用习惯了的缘故吧。记得张波老师在群里问过manjaro如何安装输入法的问题，特意安装了最新的fcitx5输入法。</p>
<h2 id="以下是安装流程">以下是安装流程</h2>
<pre class="wp-block-code"><code>sudo pacman -S fcitx5-im fcitx5-chinese-addons fcitx5-qt fcitx5-gtk
#安装 Fcitx5主体、配置工具、输入法引擎及中文输入法模块
sudo nano  /etc/environment

GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx
GLFW_IM_MODULE=ibus
</code></pre>
<p>然后注销一下系统，输入法的图标就已经出来了。</p>
<h2 id="然后安装词库">然后安装词库</h2>
<pre class="wp-block-code"><code>sudo pacman -S fcitx5-pinyin-zhwiki
#安装中文维基百科词库
sudo pacman -S fcitx5-pinyin-moegirl
#安装二刺螈萌娘百科词库 
</code></pre>
<h2 id="一点坑">一点坑</h2>
<p>安装完成后，切换到中文输入法状态，显示拼音不可用，老刘找了很多教程也没有发现有用的，后来更新了一下系统，输入法正常使用了。如果，你也正受到这个问题的影响，不妨更新一下系统试试。</p>
<h2 id="最后说一下">最后说一下</h2>
<p>这个系统真的使用不习惯，新手不建议使用，目前强烈推荐使用uos家庭版。经过最近一段时间的试用，最新版电脑死机的问题已经修复了，安装简单，并且软件丰富，连原生的Linux版本的微信都是绑定了uos系统。可见国家对这个系统的支持。</p>
]]></content:encoded>
    </item>
    <item>
      <title>没有公网IP也能玩转群晖DDNS</title>
      <link>https://www.iliu.org/3997.html</link>
      <pubDate>Thu, 30 Dec 2021 02:47:58 +0000</pubDate>
      <guid>https://www.iliu.org/3997.html</guid>
      <description>&lt;hr&gt;
&lt;p&gt;tags:
我们知道，玩群晖，没有公网IP，可玩性就下降很多，虽然可以用QuickConnect，但是速度还是不太理想。其他的[内网穿透][1]啊，[zerotier][2]等等都有不方便之处。老刘也曾记下折腾这些东西的过程。有兴趣的可以参考。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<hr>
<p>tags:
我们知道，玩群晖，没有公网IP，可玩性就下降很多，虽然可以用QuickConnect，但是速度还是不太理想。其他的[内网穿透][1]啊，[zerotier][2]等等都有不方便之处。老刘也曾记下折腾这些东西的过程。有兴趣的可以参考。</p>
<p>今天老刘说的是DDNS，这个是需要公网IP的，而我们一说公网IP，其实都是说的IPV4的ip地址，这个目前全球都稀缺，移动是不用想了，联通和电信个别地方还能申请到。老刘一直用的是移动的宽带，以前用zerotier，后来就用qc来凑合着用。</p>
<p>这两天由于keepassxc的版本在uos非常的低，由于环境的原因也更新不到最新的版本，想在群晖上部署<strong>Bitwarden</strong>。所以，又动了ddns的心思，想到目前各大运营商IPV6已经普及了，而这个都是公网的IP，所以，理论上用ddns加IPV6是完全没有问题的。网上查了一下，也有很多的教程。正准备按教程操作的时候，发现根本就不必那么麻烦。</p>
<h2 id="下面正文">下面正文</h2>
<p>进入群晖，打开控制面板，点击外部访问，点击DDNS。选择使用SYNOLOGY的服务，主机名称填写一个你心意的名称，IPV4选择手动，如果你有公网的ip也可以选择自动。IPV6点击自动设置，最后点击确定。</p>
<p>用你申请的这个域名，浏览器打开试试吧。进入到熟悉的页面了吧！</p>
<h2 id="一个坑">一个坑</h2>
<p>老刘由于一直没有找的心仪的路有，店里一直用一个廉价的小米4a千兆版的路由。设置完上面的一切后，本地打开域名是能正常访问的，但是用手机使用流量却访问不了这个域名，显示连接被拒绝。感觉应该是路由器的防火墙的问题。可是在小米路由器里找不到设置防火墙的地方。可能这个防火墙默认的是拒绝入站的访问吧</p>
<p>从家里拿来竞斗云的那个路由器，设置的一下防火墙，顺利搞定。[1]: <a href="https://iliu.org/?s=%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F">https://iliu.org/?s=%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F</a>
[2]: <a href="https://iliu.org/?s=zero">https://iliu.org/?s=zero</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>ubuntu20.10升级编译安装ibus-libpinyin输入法</title>
      <link>https://www.iliu.org/3976.html</link>
      <pubDate>Sat, 25 Dec 2021 05:47:41 +0000</pubDate>
      <guid>https://www.iliu.org/3976.html</guid>
      <description>&lt;p&gt;以前无论是使用Uos还是linuxmint或者是ubtuntu，都是直接安装搜狗输入法。可以和ubuntu兼容最好的还是自带的ibus-libpinyin，开始的时候觉得这个输入法的词库比较小，用起来很不方便，但是后来发现这个输入法加入新的云输入引擎后，使用体验大幅上升，并且再加上额外的词库的话，用起来已经是非常方便了。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>以前无论是使用Uos还是linuxmint或者是ubtuntu，都是直接安装搜狗输入法。可以和ubuntu兼容最好的还是自带的ibus-libpinyin，开始的时候觉得这个输入法的词库比较小，用起来很不方便，但是后来发现这个输入法加入新的云输入引擎后，使用体验大幅上升，并且再加上额外的词库的话，用起来已经是非常方便了。</p>
<p>ubuntu20.10自带的是1.20.0的版本，这个版本已经有了云输入引擎，但是不能把云输入引擎里的词自动添加到用户的本地词库里，而最新版已经解决了这个问题。要升级输入法，只能编译安装，Linux的不方便之处就在于此。## 首先，下载ibus-libpinyin输入法源码</p>
<p>源码地址是：<a href="https://github.com/libpinyin/ibus-libpinyin">https://github.com/libpinyin/ibus-libpinyin</a></p>
<h2 id="第二步安装编译环境">第二步，安装编译环境</h2>
<pre class="wp-block-code"><code>sudo apt install libibus-1.0-dev
sudo apt install sqlite3
sudo apt install libsqlite3-dev
sudo apt install libpinyin13-dev
sudo apt install libgtk-3-dev
sudo apt install libjson-glib-dev
sudo apt install libsoup2.4-dev
sudo apt install gnome-common checkinstall
</code></pre>
<h2 id="第三步编译输入法">第三步，编译输入法</h2>
<pre class="wp-block-code"><code>./autogen.sh --prefix=/usr/  --enable-cloud-input-mode
make
sudo make install</code></pre>
<p>至此，安装结束。在编译的第一步骤中，如果编译成功的化，应该出现以下的文字：</p>
<p>Build options:<br>
Version 1.20.2<br>
Install prefix /usr<br>
Use boost no<br>
Use opencc no<br>
Use libpinyin yes<br>
Build lua extension no<br>
Build stroke input mode yes<br>
Build cloud input mode ye<br>
Build english input mode yes</p>
<p>一般出错的化都是编译环境缺少一些组件，按照提示安装即可。</p>
]]></content:encoded>
    </item>
    <item>
      <title>电波表如何接收日本电波对时塔的信号</title>
      <link>https://www.iliu.org/3841.html</link>
      <pubDate>Wed, 18 Aug 2021 01:52:23 +0000</pubDate>
      <guid>https://www.iliu.org/3841.html</guid>
      <description>&lt;p&gt;最近一段时间以来，除了8月7日左右，位于中国商丘的BPC电波发射塔，短暂的几天有信号以外，其他时间都是处于无信号状态，可能是在检修，也可能是由于商丘新冠疫情的影响，反正是电波塔关闭了。因为这个塔是民用的，当年是一个企业和中国授时中心联合弄的，今年2月份合同到期，由中国授时中心自己维护。所以，不稳地也很正常吧，你啥时候看到位于陕西蒲城的的塔出现过问题？## 收不到邱波那就收日本的波吧&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>最近一段时间以来，除了8月7日左右，位于中国商丘的BPC电波发射塔，短暂的几天有信号以外，其他时间都是处于无信号状态，可能是在检修，也可能是由于商丘新冠疫情的影响，反正是电波塔关闭了。因为这个塔是民用的，当年是一个企业和中国授时中心联合弄的，今年2月份合同到期，由中国授时中心自己维护。所以，不稳地也很正常吧，你啥时候看到位于陕西蒲城的的塔出现过问题？## 收不到邱波那就收日本的波吧</p>
<p>网上查了以下资料，发现位于日本九州的一个授时信号塔，覆盖半径是2000km，天波的话，气候条件适合的情况下，3000km 内都有可能收到。</p>
<p>把表上的时区从BJS改成TPE，因为台北也是用的北京时间，所以收波后，表上的时间不会快一个小时。在室内窗户边手动收了一下，发现信号是L1，基本上是失败的。于是到院子里试了一下，发现在院子里信号是L3，俗话说的信号满格，收到收波差不多1分钟成功。</p>
<p>凭着印象觉得日本在中国的东北部，于是晚上把表放在北面的窗口，看能不能自动收波，结果是失败的。后来查了一下地图，发现日本的九洲原来是在郑州的东南方向。</p>
<p>于是晚上把表放在房间靠南边的窗户边，连续几天晚上自动收波都成功。</p>
<h2 id="总结一下方法">总结一下方法</h2>
<p>首先要把城市改成收日波的城市，最好是台北，因为台北是用的北京时间。然后，从地图上查看九州在你城市的方位，然后晚上把表放在窗口边，如果这样都收不到，那就只能等待商丘的信号塔修好，或者下载APP对时。</p>
<p>不过有网友在贵州都能收到，应该来说能收到的几率还是挺大的</p>
]]></content:encoded>
    </item>
    <item>
      <title>奇葩的京东无线宝</title>
      <link>https://www.iliu.org/3791.html</link>
      <pubDate>Thu, 24 Jun 2021 10:28:53 +0000</pubDate>
      <guid>https://www.iliu.org/3791.html</guid>
      <description>&lt;hr&gt;
&lt;p&gt;tags:
最近天热起来了，店里的那台竞斗云可能是放到柜子离散热不良的原因，偶尔掉线的情况。于是决定换一款路由器。&lt;/p&gt;
&lt;p&gt;选了一圈，后来决定入手京东无线宝2代的128G的版本，主要是这个版本秒杀的价格比原价低了200块钱，也不知道是先提价后降价还是怎么着的，上面标的是最近90多天最低价。但是本着降价越多，占的便宜越大的原则，最终选的这个，估计又上了狗东的当，原价699，秒杀降了200，然后又领了乱七八糟的优惠卷还有减金额白条优惠什么的，最后的价格是400零几。要说狗东的优势也就是快了，今天早上下的单，下午可给送过来了。插网线，设置WIFI等等之后。我去，为啥很多网站打不开？&lt;/p&gt;</description>
      <content:encoded><![CDATA[<hr>
<p>tags:
最近天热起来了，店里的那台竞斗云可能是放到柜子离散热不良的原因，偶尔掉线的情况。于是决定换一款路由器。</p>
<p>选了一圈，后来决定入手京东无线宝2代的128G的版本，主要是这个版本秒杀的价格比原价低了200块钱，也不知道是先提价后降价还是怎么着的，上面标的是最近90多天最低价。但是本着降价越多，占的便宜越大的原则，最终选的这个，估计又上了狗东的当，原价699，秒杀降了200，然后又领了乱七八糟的优惠卷还有减金额白条优惠什么的，最后的价格是400零几。要说狗东的优势也就是快了，今天早上下的单，下午可给送过来了。插网线，设置WIFI等等之后。我去，为啥很多网站打不开？</p>
<p>基本国外的都能打开，我的博客也可以，但是个视频网站，新浪等等都连不上。刚开始还以为是因为设置了积分有限导致的网络被占用，还想着这也占用的太大了吧。后来发现，无论如何设置，网速还是渣渣，换上原来的路由器，立马正常了，看来是这台路由器的问题了。</p>
<p>立刻对这台路由器失望了，打开京东，准备退货。可是无理由退货是要运费的，但是这是质量问题啊，于是联系客服。</p>
<p>今天群里还说京东的人工客服连接不上，其实说的有点夸张了，我就发了一个人工客服，就立马出现人工客服的连接了。</p>
<p>客服听完我说的，很有经验的样子说，你恢复一下出厂设置，然后再设置网络。如果还是不行就按退货处理。结果这么一弄，立马问题解决了。</p>
<p>我去，玩了这么多的路由器，第一次遇到需要先恢复出厂才能用的。目前，经过一下午的试用，各方面也挺满意，也不知道一天能给多少个积分，也不知道多久能回本;</p>
]]></content:encoded>
    </item>
    <item>
      <title>keepass加群辉实现数据同步及浏览器自动填充密码（二）</title>
      <link>https://www.iliu.org/3430.html</link>
      <pubDate>Sun, 29 Nov 2020 00:53:36 +0000</pubDate>
      <guid>https://www.iliu.org/3430.html</guid>
      <description>&lt;p&gt;自从前两天体验了keepass的方便后，真的是对这个软件爱不释手了。但是在上一篇中，总体设置较为复杂，而且使用当中发现了诸多不方便之处。虽然对于老刘来说，因为只是店和家同步，路由器里设置好zerotier就行了，但是后来想想，这个方案还有有点依赖硬件，没有普遍性，而且如果老刘不在局域网范围内的话，手机上使用也很不方便。熟悉这个软件之后发现，根本不需要如此复杂的设置，就能很容易的同步数据，如果是使用的白群晖的话，利用quickconnet,可以做到无论在何地，都能方便的使用群辉和keepass的便利之处。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>自从前两天体验了keepass的方便后，真的是对这个软件爱不释手了。但是在上一篇中，总体设置较为复杂，而且使用当中发现了诸多不方便之处。虽然对于老刘来说，因为只是店和家同步，路由器里设置好zerotier就行了，但是后来想想，这个方案还有有点依赖硬件，没有普遍性，而且如果老刘不在局域网范围内的话，手机上使用也很不方便。熟悉这个软件之后发现，根本不需要如此复杂的设置，就能很容易的同步数据，如果是使用的白群晖的话，利用quickconnet,可以做到无论在何地，都能方便的使用群辉和keepass的便利之处。</p>
<h2 id="软件介绍">软件介绍</h2>
<p>这次老刘介绍的软件叫KeePassXC,也是开源的作品，和keepass是一脉相承，可以说是keepass的分支吧，但是和前者相比，使用起来更方便。系统自带中文，不需要在装语言插件了，软件自带有对浏览器的支持，也不需要再装keepasshttp插件了，要知道，http这个插件作者已经好多年没有更新了，用起来确实没有keepassxc方便了。</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/11/b85c78625ed6336.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3431" src="https://iliu.org/wp-content/uploads/2020/11/b85c78625ed6336.jpg" alt="" width="796" height="658" srcset="https://iliu.org/wp-content/uploads/2020/11/b85c78625ed6336.jpg 796w, https://iliu.org/wp-content/uploads/2020/11/b85c78625ed6336-300x248.jpg 300w, https://iliu.org/wp-content/uploads/2020/11/b85c78625ed6336-768x635.jpg 768w" sizes="(max-width: 796px) 100vw, 796px" /></a></p>
<p>软件下载地址：<a href="https://keepassxc.org/">KeePassXC Password Manager</a></p>
<p>也可以通过老刘提供的链接下载：<a href="http://gofile.me/5x2t4/Ka94pwgIw">keepassxc</a></p>
<p>老刘这个应该下载速度会快那么一丢丢！~</p>
<h2 id="使用方法介绍">使用方法介绍</h2>
<p>软件和keepass大同小异，会用那个，这个是没有问题的。浏览器配合里面设置如上图，由于老刘没有用firefox，所以没有选择。</p>
<p>重点说说同步</p>
<p>电脑和手机上都安装安装synology drive 。安装设置完毕后，把keepass/keepassxc的数据kdbx文件保存在drive的同步文件夹了，这样，无论那个终端更新了数据，都会同步至其他的终端。妈妈再也不用担心我密码的问题了。</p>
<p>有同学担心把数据存到NAS硬盘挂了，数据丢了怎么办，其实这真的不是一个需要担心的事情，NAS早就想到了这一点，两块或者更多额硬盘设置成raid模式就行。再怎么着，两块硬盘不会同时坏吧，就算同时坏了，keepass还支持同步到云盘，比如Google，DropBox等等都支持。</p>
]]></content:encoded>
    </item>
    <item>
      <title>zerotier加openwrt路由实现内网穿透控制群晖</title>
      <link>https://www.iliu.org/3356.html</link>
      <pubDate>Sat, 24 Oct 2020 07:49:34 +0000</pubDate>
      <guid>https://www.iliu.org/3356.html</guid>
      <description>&lt;p&gt;刚开始完群晖的时候，写过一片使用zerotier进行内网穿透实现连接群晖的功能。详情《&lt;a href=&#34;https://iliu.org/2872.html&#34;&gt;使用zerotier进行内网穿透&lt;/a&gt; 》但是后来升级移动宽带，带了一个光猫的路由，导致群晖成为了内网中的内网，使用zerotier总链接不上。因此，改用了frp进行内网穿透。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>刚开始完群晖的时候，写过一片使用zerotier进行内网穿透实现连接群晖的功能。详情《<a href="https://iliu.org/2872.html">使用zerotier进行内网穿透</a> 》但是后来升级移动宽带，带了一个光猫的路由，导致群晖成为了内网中的内网，使用zerotier总链接不上。因此，改用了frp进行内网穿透。</p>
<p>FRP和zerotier各有千秋，本站也一些文章来结束这些，有兴趣可以利用搜索来查询。昨天，发现路由器里带的又zerotier的插件。其实以前也见到过，只是觉得只是控制路由器，用处不大，所以也没有过多的理会。昨天，突发奇想，是不是在两台路由器都设置zerotier的情况下，能实现各自路由下的设备能访问另一台路由下的设备。网上查了一下，发现是可行的。而且，设置起来也要简单的多。</p>
<h2 id="首先注册zerotier">首先，注册zerotier</h2>
<p>这里就不在多说了，上面那篇文章有说明如何注册。</p>
<h2 id="在公司和家中的两台路由内都设置zerotier">在公司和家中的两台路由内都设置zerotier。</h2>
<p>这个网上有一堆的教程，又是设置端口的，又是设置防火墙的。其实那都已经很老了，目前的的插件简单不能再简单了。</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/10/bae175604f2b130.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3357" src="https://iliu.org/wp-content/uploads/2020/10/bae175604f2b130.png" alt="" width="641" height="429" srcset="https://iliu.org/wp-content/uploads/2020/10/bae175604f2b130.png 641w, https://iliu.org/wp-content/uploads/2020/10/bae175604f2b130-300x201.png 300w" sizes="(max-width: 641px) 100vw, 641px" /></a></p>
<p>如果上图，填入zero的 id 勾选下面的运行客户端NAT。不需要在设置别的了。</p>
<h2 id="进入zero控制台设置路由">进入zero控制台，设置路由</h2>
<p><a href="https://iliu.org/wp-content/uploads/2020/10/f7e0b956540676a.png"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-3359" src="https://iliu.org/wp-content/uploads/2020/10/f7e0b956540676a-1024x456.png" alt="" width="1024" height="456" srcset="https://iliu.org/wp-content/uploads/2020/10/f7e0b956540676a-1024x456.png 1024w, https://iliu.org/wp-content/uploads/2020/10/f7e0b956540676a-300x134.png 300w, https://iliu.org/wp-content/uploads/2020/10/f7e0b956540676a-768x342.png 768w, https://iliu.org/wp-content/uploads/2020/10/f7e0b956540676a.png 1236w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<h2 id="在下面add-routes里进行添加">在下面add routes里进行添加</h2>
<p>前面是你路由器的IP段，后面是zero给你分配的ip，千万不要填反了。在设置的时候要注意，家里和办公司的IP不能一致。其他的就没有关系了。设置完之后，就可以在办公室输入家里设备的IP或者在家里输入办公室设备的IP进行控制了。</p>
]]></content:encoded>
    </item>
    <item>
      <title>打造一个安全的宝塔面板服务器环境</title>
      <link>https://www.iliu.org/3326.html</link>
      <pubDate>Sat, 17 Oct 2020 03:50:44 +0000</pubDate>
      <guid>https://www.iliu.org/3326.html</guid>
      <description>&lt;p&gt;很多人都戏称宝塔面板为bug塔面板，特别是前几天出现的phpmyadmin事件，似乎更进一步的坐实了bug塔bug的地位，但是平信而论，经过这么多年的发展，宝塔面板在配置服务器方面还是很方便的，而里面一些小插件也是非常的好用，所以，对于这个面板老刘是非常的纠结，喜欢他的简单和好用的插件，纠结它的稳定性。毕竟老刘是吃过这方面的亏的，早点5.x的时代，有一次，什么都没动，网站也正常打开，面板却挂了….&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>很多人都戏称宝塔面板为bug塔面板，特别是前几天出现的phpmyadmin事件，似乎更进一步的坐实了bug塔bug的地位，但是平信而论，经过这么多年的发展，宝塔面板在配置服务器方面还是很方便的，而里面一些小插件也是非常的好用，所以，对于这个面板老刘是非常的纠结，喜欢他的简单和好用的插件，纠结它的稳定性。毕竟老刘是吃过这方面的亏的，早点5.x的时代，有一次，什么都没动，网站也正常打开，面板却挂了….</p>
<p>闲话少说了，思前想后，还是决定用它吧，多备份，万一挂了，恢复起来也快。既然决定要用这个一个有着安全漏洞前科的面板，把它打造的相对安全一些是一件迫在眉睫的事情了。老刘是在以下几个方面做的，有需要的朋友可以参考。</p>
<h2 id="第一面板的设置">第一，面板的设置</h2>
<p><a href="https://iliu.org/wp-content/uploads/2020/10/c9fb8fb098ecc77.png"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-3329" src="https://iliu.org/wp-content/uploads/2020/10/c9fb8fb098ecc77-1024x868.png" alt="" width="1024" height="868" srcset="https://iliu.org/wp-content/uploads/2020/10/c9fb8fb098ecc77-1024x868.png 1024w, https://iliu.org/wp-content/uploads/2020/10/c9fb8fb098ecc77-300x254.png 300w, https://iliu.org/wp-content/uploads/2020/10/c9fb8fb098ecc77-768x651.png 768w, https://iliu.org/wp-content/uploads/2020/10/c9fb8fb098ecc77.png 1067w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>这个好多的教程都有提到，比如别名，安全入口名字、默认目录，默认端口 面板用户及密码，都需要一一更改，由于比较简单，这里就不一一进行说明了。</p>
<h2 id="第二步加装防火墙">第二步，加装防火墙</h2>
<p>宝塔官方有waf的防火墙，但是是收费的。所有，这里老刘强烈建议搭建使用nginx作为网站服务器的web框架而不是使用阿帕奇。这是因为使用nginx后，有个叫叫明国三年一场雨大佬开发的Nginx免费防火墙，目前已经更新到了4.5的版本，由于没有用过官方的防火墙，老刘认为这个免费的对一般的网站已经完全够用了。</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/10/9423090b4ba355c.png"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-3330" src="https://iliu.org/wp-content/uploads/2020/10/9423090b4ba355c-1024x763.png" alt="" width="1024" height="763" srcset="https://iliu.org/wp-content/uploads/2020/10/9423090b4ba355c-1024x763.png 1024w, https://iliu.org/wp-content/uploads/2020/10/9423090b4ba355c-300x224.png 300w, https://iliu.org/wp-content/uploads/2020/10/9423090b4ba355c-768x572.png 768w, https://iliu.org/wp-content/uploads/2020/10/9423090b4ba355c.png 1154w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>使用防火墙的默认设置已经足矣，当然你也可以打开里面的设置项，把所有的开关都打开，但是这样会造成一些正常的动作被误报，因此建议直接使用默认设置即可。如果网站使用了CDN加速，可以在网站设置里选择开启CDN选项，这样就不会误报你的CDN的IP了。</p>
<h2 id="第三步对常见挂马的实时查杀">第三步，对常见挂马的实时查杀</h2>
<p>这个也是老刘纠结宝塔的原因之一，就是因为宝塔里的这款插件，openrasp管理器插件，OpenRASP 是百度安全推出的一款 免费、开源 的应用运行时自我保护产品，对一句话木马的查杀相当不错。项目的介绍可以在<a href="https://rasp.baidu.com/#section-intro" target="_blank" rel="noopener noreferrer">这里</a>了解。</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/10/92c45413dd04494.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3331" src="https://iliu.org/wp-content/uploads/2020/10/92c45413dd04494.png" alt="" width="628" height="251" srcset="https://iliu.org/wp-content/uploads/2020/10/92c45413dd04494.png 628w, https://iliu.org/wp-content/uploads/2020/10/92c45413dd04494-300x120.png 300w" sizes="(max-width: 628px) 100vw, 628px" /></a></p>
<p>宝塔软件列表里搜索openrasp，点击安装，安装后开启即可，目前支持到php7.3,首次安装的时间可能有点长，耐心等待即可。</p>
<h2 id="第四步-安装fail2ban">第四步 安装fail2ban</h2>
<p>这个是放爆破扫描端口的的，宝塔的这个设置的比较简单，安装后可以参考老刘的另一篇文章进行详细的设置《<a href="https://iliu.org/2556.html">lnmp一键开启waf及使用 Fail2Ban防护</a>》。然后，把所有用不到的端口删除。</p>
]]></content:encoded>
    </item>
    <item>
      <title>网易词典笔2.0简单开箱</title>
      <link>https://www.iliu.org/3268.html</link>
      <pubDate>Sun, 20 Sep 2020 02:19:37 +0000</pubDate>
      <guid>https://www.iliu.org/3268.html</guid>
      <description>&lt;p&gt;前端时间给女儿买了一套《书虫》系列和《疯狂校园》系列的英语读本。书虫还好，句子比较简单，有些单词就算不认识，根据上下文的关系以及后面的生词表，阅读起来不算太费事。可是疯狂校园系列读起来就有点难度了。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>前端时间给女儿买了一套《书虫》系列和《疯狂校园》系列的英语读本。书虫还好，句子比较简单，有些单词就算不认识，根据上下文的关系以及后面的生词表，阅读起来不算太费事。可是疯狂校园系列读起来就有点难度了。</p>
<p>来回的翻字典耽误时间不说，还打断了阅读的连续性。那时候就有给女儿买一支词典笔的打算，但是看了一下基本上2代的要800大洋左右，又有些犹豫。前天，意外的把liu.gg的域名给卖了，小赚了一点意外之财，干脆把这个笔给女儿买了算了。</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/09/2db205c8580bc03.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3269" src="https://iliu.org/wp-content/uploads/2020/09/2db205c8580bc03.jpg" alt="" width="800" height="800" srcset="https://iliu.org/wp-content/uploads/2020/09/2db205c8580bc03.jpg 800w, https://iliu.org/wp-content/uploads/2020/09/2db205c8580bc03-300x300.jpg 300w, https://iliu.org/wp-content/uploads/2020/09/2db205c8580bc03-150x150.jpg 150w, https://iliu.org/wp-content/uploads/2020/09/2db205c8580bc03-768x768.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a></p>
<p>天猫上查了一下，找了一个销量比较高的，价格相对优惠的下了单。随笔还给送了一个网易精品课的优惠码，不过注册了后看课程一般般，也就没有给女儿学。</p>
<p>选了一个粉色的。我没有拍图片，网上找了几张图来替代</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/09/4e8cfa295ddf836.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3270" src="https://iliu.org/wp-content/uploads/2020/09/4e8cfa295ddf836.jpg" alt="" width="680" height="907" srcset="https://iliu.org/wp-content/uploads/2020/09/4e8cfa295ddf836.jpg 680w, https://iliu.org/wp-content/uploads/2020/09/4e8cfa295ddf836-225x300.jpg 225w" sizes="(max-width: 680px) 100vw, 680px" /></a></p>
<p>包装是一个白色的盒子，上面是网易有道词典笔，设计的非常的简洁。</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/09/96eb39afd3ddd6d.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3271" src="https://iliu.org/wp-content/uploads/2020/09/96eb39afd3ddd6d.jpg" alt="" width="748" height="400" srcset="https://iliu.org/wp-content/uploads/2020/09/96eb39afd3ddd6d.jpg 748w, https://iliu.org/wp-content/uploads/2020/09/96eb39afd3ddd6d-300x160.jpg 300w" sizes="(max-width: 748px) 100vw, 748px" /></a></p>
<p>嗯就是这样的一支笔。放在手里也不沉。刚发过来的时候系统的版本是1.22。然后提示升级，先升级到了1.33，然后再次提示升级，升级到了1.52，增加了一个和网易有道词典相互关联的设置。</p>
<p>笔的外形就这样，关键是要看识别单词的能力。官方说的又230万的词量，实际使用起来识别率还是挺高的。特别是还支持整句扫描识别和跨行扫描。总体来说还是挺满意的！</p>
]]></content:encoded>
    </item>
    <item>
      <title>给鱼缸上了沼泽过滤</title>
      <link>https://www.iliu.org/3167.html</link>
      <pubDate>Wed, 27 May 2020 02:13:32 +0000</pubDate>
      <guid>https://www.iliu.org/3167.html</guid>
      <description>&lt;p&gt;一个多月前，买了几条草金，&lt;a href=&#34;https://iliu.org/3129.html&#34;&gt;pdd上买的&lt;/a&gt;。由于原来的那个玻璃鱼缸有点小，而且我是一个很懒的人，对清理鱼缸壁上的绿苔深恶痛绝。所以，决定换一个陶缸，一是陶缸大，放的水多。当时想的是可以不用过滤。二是，陶缸不透明，有绿苔了也不影响。所以，买了一个小陶缸。&lt;/p&gt;
&lt;p&gt;把小鱼放进陶缸后，感觉还是不错的。鱼儿活动的地方大了，正好自己还有几颗碗莲的种子，索性就把碗莲也放进了鱼缸，当时想的是，碗莲生长的养分由鱼的粪便来提供，碗莲分解鱼粪，生长后还能释放氧气，真是一举两得的事情。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>一个多月前，买了几条草金，<a href="https://iliu.org/3129.html">pdd上买的</a>。由于原来的那个玻璃鱼缸有点小，而且我是一个很懒的人，对清理鱼缸壁上的绿苔深恶痛绝。所以，决定换一个陶缸，一是陶缸大，放的水多。当时想的是可以不用过滤。二是，陶缸不透明，有绿苔了也不影响。所以，买了一个小陶缸。</p>
<p>把小鱼放进陶缸后，感觉还是不错的。鱼儿活动的地方大了，正好自己还有几颗碗莲的种子，索性就把碗莲也放进了鱼缸，当时想的是，碗莲生长的养分由鱼的粪便来提供，碗莲分解鱼粪，生长后还能释放氧气，真是一举两得的事情。</p>
<p>可是事与愿违，碗莲在鱼缸里只长茎不长叶，茎长长了，可能被鱼咬的，还断掉了，所以，干脆把碗莲给捞出来扔掉了。每周给鱼缸换一些水，感觉也没问题，可是前两天，接二连三的死去了2条鱼，而且发现鱼平时很喜欢把头伸出水面。可能是水里的氧气有点少吧，而且鱼吃的有点多，每次换水，鱼缸里都好多的鱼便便，看着也难受。所以，就决定买一个沼泽过滤箱。</p>
<p>沼泽过滤，听起来很高大上，其实很简单，就是弄一个箱子，入水口在下面，出水口在上面，箱子里放满小石子，这样，原来鱼缸里的脏东西在重力和小石子过滤下就留在了箱子的底部，上面留下来的就是清水，再在箱子里种一些植物，这些可以以这些脏东西为养料。就形成了一个生态系统。</p>
<p>某宝上买了一个沼泽过滤箱，几十块钱，水泵原来就有，又买了几十斤小石子，这东西一般6块钱5斤包邮，对于卖家来说基本是没啥成本，河里挖就行了。话说，这东西真费石子，我买的是小型的箱子，40*30*18的，竟然用了35斤的石子。</p>
<p>再在箱子里中上几颗吊兰（现在手里没有别的，只有吊兰了），回头有机会了买一盆金钱草什么的放进去。</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/05/c7ddd8144698b79.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3168" src="https://iliu.org/wp-content/uploads/2020/05/c7ddd8144698b79.jpg" alt="" width="850" height="993" srcset="https://iliu.org/wp-content/uploads/2020/05/c7ddd8144698b79.jpg 850w, https://iliu.org/wp-content/uploads/2020/05/c7ddd8144698b79-257x300.jpg 257w, https://iliu.org/wp-content/uploads/2020/05/c7ddd8144698b79-768x897.jpg 768w" sizes="(max-width: 850px) 100vw, 850px" /></a></p>
<p>实际效果还是很不错的，一晚上的过滤，水清澈见底了。以后，就可以偷懒一下了。</p>
]]></content:encoded>
    </item>
    <item>
      <title>破磨边机，早晚换了你</title>
      <link>https://www.iliu.org/3122.html</link>
      <pubDate>Wed, 08 Apr 2020 08:00:44 +0000</pubDate>
      <guid>https://www.iliu.org/3122.html</guid>
      <description>&lt;p&gt;店搬完之后照例调试一下磨边机，装上镜片，正在打磨的时候，只听“咔咔”两声，镜片磨不动了。于是，拆开看了一下，发现是电机连接砂轮的皮带断了，一共是3条，一下断了两条。说来这台磨边机也用了8年了，尽管8年磨得镜片可能赶不上某些大店一年磨得镜片得数量，但是里面得东西还是会老化的。断了也正常。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>店搬完之后照例调试一下磨边机，装上镜片，正在打磨的时候，只听“咔咔”两声，镜片磨不动了。于是，拆开看了一下，发现是电机连接砂轮的皮带断了，一共是3条，一下断了两条。说来这台磨边机也用了8年了，尽管8年磨得镜片可能赶不上某些大店一年磨得镜片得数量，但是里面得东西还是会老化的。断了也正常。</p>
<p>由于已经联系不到经销商了，所以去万能的某宝去找，第一次，发来的皮带太大了，然后退了，又找了一家说是专门卖这个牌子磨边机配件的，于是又买了两条，我去，太小了，装不上，联系客服，客服说，用螺丝刀使劲的拉，套上去就行。确实要使劲，费了九牛二虎之力，终于是把皮带给装上了。</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/04/a8eeba89609cf61d1edd8ef3087a5e02.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3123" src="https://iliu.org/wp-content/uploads/2020/04/a8eeba89609cf61d1edd8ef3087a5e02.jpg" alt="" width="549" height="628" srcset="https://iliu.org/wp-content/uploads/2020/04/a8eeba89609cf61d1edd8ef3087a5e02.jpg 549w, https://iliu.org/wp-content/uploads/2020/04/a8eeba89609cf61d1edd8ef3087a5e02-262x300.jpg 262w" sizes="(max-width: 549px) 100vw, 549px" /></a></p>
<p>整个手臂都是酸的！</p>
<p>皮带装上后，顺利的开机，测试了一下，磨边机又欢快的响起来了。试磨了一副眼镜，发现还是有点问题，主要是在磨全框的镜片的时候，磨不出来那个卡在镜架里的凸起。必须要人工操作才行。</p>
<p>其实是有想要换掉的想法，比如下图的这种：</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/04/mmexport15863326080491.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3124" src="https://iliu.org/wp-content/uploads/2020/04/mmexport15863326080491.jpg" alt="" width="790" height="612" srcset="https://iliu.org/wp-content/uploads/2020/04/mmexport15863326080491.jpg 790w, https://iliu.org/wp-content/uploads/2020/04/mmexport15863326080491-300x232.jpg 300w, https://iliu.org/wp-content/uploads/2020/04/mmexport15863326080491-768x595.jpg 768w" sizes="(max-width: 790px) 100vw, 790px" /></a></p>
<p>免模板，直接数码扫码，高大上的很，可惜每台要好几万，对于我这小店来说，真的是用不起啊！！！</p>
]]></content:encoded>
    </item>
    <item>
      <title>Apple iPad第七代使用小计</title>
      <link>https://www.iliu.org/3103.html</link>
      <pubDate>Sun, 22 Mar 2020 08:48:36 +0000</pubDate>
      <guid>https://www.iliu.org/3103.html</guid>
      <description>&lt;p&gt;tags:
眼看着已经到了3月份，疫情防控吃紧，孩子开学遥遥无期，网络直播课如火如荼。很多网络课没法用电脑看，用手机吧，屏幕太小。所以，决定入手一台平板来让孩子进行网课的学习。按我的秉性来说，作为一个荣耀全家桶的使用者，最优的选择肯定是华为或者荣耀的。但是我家大领导和小领导都钟意iPad。没办法，选择这个吧。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>tags:
眼看着已经到了3月份，疫情防控吃紧，孩子开学遥遥无期，网络直播课如火如荼。很多网络课没法用电脑看，用手机吧，屏幕太小。所以，决定入手一台平板来让孩子进行网课的学习。按我的秉性来说，作为一个荣耀全家桶的使用者，最优的选择肯定是华为或者荣耀的。但是我家大领导和小领导都钟意iPad。没办法，选择这个吧。</p>
<p><a href="https://liuday.com/wp-content/uploads/2020/03/c1d1468271a40ad.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3104" src="https://liuday.com/wp-content/uploads/2020/03/c1d1468271a40ad.jpg" alt="" width="640" height="640" srcset="https://iliu.org/wp-content/uploads/2020/03/c1d1468271a40ad.jpg 640w, https://iliu.org/wp-content/uploads/2020/03/c1d1468271a40ad-300x300.jpg 300w, https://iliu.org/wp-content/uploads/2020/03/c1d1468271a40ad-150x150.jpg 150w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>京东上转了一圈，竟然缺货，然后又跑苏宁易购看看，发现就数码产品来说，苏宁易购比京东有优势，价格比京东便宜不说，货源也足。于是，苏宁买之。</p>
<p>买的是ipad的第七代产品，看上的就是它的屏幕，一个字，非常大。这也是家里唯一的一款ios的产品了。使用体验没的说。使用流畅，屏幕也清晰，孩子的网课用起来也不错。唯一不满意的地方在于没有学生模式。</p>
<p>谁知道如何设置IOS的系统，限制某些程序不能用？</p>
]]></content:encoded>
    </item>
    <item>
      <title>使用群晖，配置打印机，实现无线打印机的功能</title>
      <link>https://www.iliu.org/3005.html</link>
      <pubDate>Sun, 12 Jan 2020 03:05:02 +0000</pubDate>
      <guid>https://www.iliu.org/3005.html</guid>
      <description>&lt;p&gt;换成荣耀的这台笔记本之后，由于接口比较少，再加上一个笔记本插上usb数据线连上打印机，也不够方便，因为有时候笔记本还要拿回家用用。恰好再群晖的网站上看到群晖也支持市面上大多数的打印机。于是动了把打印机和群晖相联的念头。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>换成荣耀的这台笔记本之后，由于接口比较少，再加上一个笔记本插上usb数据线连上打印机，也不够方便，因为有时候笔记本还要拿回家用用。恰好再群晖的网站上看到群晖也支持市面上大多数的打印机。于是动了把打印机和群晖相联的念头。</p>
<p>实际上操作还是挺简单的，只要注意一些基本的坑不要踩就行。</p>
<h2 id="首先把打印机和群晖相联">首先，把打印机和群晖相联</h2>
<p>把打印机的数据线插在群晖的usb端口上,打开群晖的管理页面。点击控制面板——点击外接设备——选择打印机标签</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/01/64f4b98d52cdd2c.png"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-3006" src="https://iliu.org/wp-content/uploads/2020/01/64f4b98d52cdd2c-1024x586.png" alt="" width="1024" height="586" srcset="https://iliu.org/wp-content/uploads/2020/01/64f4b98d52cdd2c-1024x586.png 1024w, https://iliu.org/wp-content/uploads/2020/01/64f4b98d52cdd2c-300x172.png 300w, https://iliu.org/wp-content/uploads/2020/01/64f4b98d52cdd2c-768x439.png 768w, https://iliu.org/wp-content/uploads/2020/01/64f4b98d52cdd2c.png 1250w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>点击打印机管理，点击设置打印机。</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/01/9f19250c710cc82.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3007" src="https://iliu.org/wp-content/uploads/2020/01/9f19250c710cc82.png" alt="" width="729" height="722" srcset="https://iliu.org/wp-content/uploads/2020/01/9f19250c710cc82.png 729w, https://iliu.org/wp-content/uploads/2020/01/9f19250c710cc82-300x297.png 300w, https://iliu.org/wp-content/uploads/2020/01/9f19250c710cc82-150x150.png 150w" sizes="(max-width: 729px) 100vw, 729px" /></a></p>
<p>由于跋涉者的打印机是兄弟 hl-1208系列，没有复印 传真等功能，所以，只是选中网络打印机的模式。当然你也可以选择羡慕的Apple无线打印和Google云端打印，这些都是支持的。选择完了，点击保存即可。</p>
<h2 id="电脑端设置">电脑端设置</h2>
<p>打开群晖助手，识别出群晖的IP地址后，点击打印机设备。点击新增</p>
<p><a href="https://iliu.org/wp-content/uploads/2020/01/88c00cba56f68ca.png">下<img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3008" src="https://iliu.org/wp-content/uploads/2020/01/88c00cba56f68ca.png" alt="" width="668" height="617" srcset="https://iliu.org/wp-content/uploads/2020/01/88c00cba56f68ca.png 668w, https://iliu.org/wp-content/uploads/2020/01/88c00cba56f68ca-300x277.png 300w" sizes="(max-width: 668px) 100vw, 668px" /></a></p>
<p>选择识别出来的打印机，点击下一步，然后装上打印机的驱动。整个工作宣告结束。</p>
<p>据说，通过群晖还可以实现，手机直接打印的功能，由于不是很需要这个功能，没有研究，有需要这方面的功能的，不妨研究一下。其实也不复杂，都是局域网打印而已。</p>
]]></content:encoded>
    </item>
    <item>
      <title>宝塔面板安装FRP内网穿透控制群晖</title>
      <link>https://www.iliu.org/2918.html</link>
      <pubDate>Sat, 07 Dec 2019 03:28:28 +0000</pubDate>
      <guid>https://www.iliu.org/2918.html</guid>
      <description>&lt;p&gt;前两天给大家介绍了利用zerotier来进行内网穿透控制群晖的方法，详见：&lt;a href=&#34;https://iliu.org/2872.html&#34;&gt;黑群晖的福音，利用zerotier进行内网穿透&lt;/a&gt;。但是，zerotier使用的时候有时候不太稳定，而且记一堆的数字比较麻烦，今天，给大家介绍另一个神器，frp。直接用命令行的方式在服务器里部署比较繁琐，而且一不留神就会出错，不过好在有大神在宝塔里开发出了插件，一键安装就行。好了，言归正传，开始正题。&lt;/p&gt;
&lt;p&gt;首先，你得有一个自己的vps，这里把设置强烈推荐&lt;a href=&#34;https://my.liluohost.com/aff.php?aff=148&#34;&gt;篱落主机&lt;/a&gt;。本站就运行在这个主机上，特别是香港的VPS，速度快，服务器也稳定。关键是价格不贵，最便宜的也就100多块一年吧。给小张报我的名字应该还能有些许优惠，毕竟我10年前就是他的客户了。这次，本来买的1h2g的，结果人家二话没说就给升级到了4g。貌似，又跑题了额。&lt;/p&gt;
&lt;p&gt;有了vps后，安装宝塔面板。安装的方法很简单，官网一看就会，我就不啰嗦了。不出意外的话，2分钟，面板安装完毕。登录到面板的后台。点击软件商店，搜索frp。我们用的是如下这款，因为这款是免费的。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>前两天给大家介绍了利用zerotier来进行内网穿透控制群晖的方法，详见：<a href="https://iliu.org/2872.html">黑群晖的福音，利用zerotier进行内网穿透</a>。但是，zerotier使用的时候有时候不太稳定，而且记一堆的数字比较麻烦，今天，给大家介绍另一个神器，frp。直接用命令行的方式在服务器里部署比较繁琐，而且一不留神就会出错，不过好在有大神在宝塔里开发出了插件，一键安装就行。好了，言归正传，开始正题。</p>
<p>首先，你得有一个自己的vps，这里把设置强烈推荐<a href="https://my.liluohost.com/aff.php?aff=148">篱落主机</a>。本站就运行在这个主机上，特别是香港的VPS，速度快，服务器也稳定。关键是价格不贵，最便宜的也就100多块一年吧。给小张报我的名字应该还能有些许优惠，毕竟我10年前就是他的客户了。这次，本来买的1h2g的，结果人家二话没说就给升级到了4g。貌似，又跑题了额。</p>
<p>有了vps后，安装宝塔面板。安装的方法很简单，官网一看就会，我就不啰嗦了。不出意外的话，2分钟，面板安装完毕。登录到面板的后台。点击软件商店，搜索frp。我们用的是如下这款，因为这款是免费的。</p>
<h2 id="补充说明">补充说明：</h2>
<p>最近发现这个插件在宝塔里已经找不到了，需要设置服务器端的可以参考本人的<a href="https://iliu.org/3340.html">纯代码设置frp服务器</a>这篇文章，来进行手动设置，也不复杂！先点击购买，因为是免费的，不要钱，直接购买后，点击安装，安装后，点击设置。这里，我们只需要在通用设置这里进行设置就可以了，其他的可以不用设置，不影响使用。端口号之类的可以改也可以不改，主要的是设置验证密钥，设置成你自己的。</p>
<p>设置完这个之后，一定要在宝塔面板——安全选项里，把你设置的这些端口号放行。不然是用不了的。</p>
<p>至此，frp服务器端已经设置完毕。下面我们来设置客户端，由于我们是要远程控制群晖，所以这里就以群晖为例。</p>
<h3 id="设置域名解析">设置域名解析</h3>
<p>登录你的域名服务商<br>
域名解析<br>
设置域名解析到frp服务器地址</p>
<h3 id="安装frpc文件">安装frpc文件</h3>
<p>开启群晖SSH功能<br>
控制面板-终端机和SNMP<br>
启动SSH功能-应用使用xshell等登录到群晖</p>
<p>sudo -i //获得root权限 输入密码-回车</p>
<p>进入安装目录(本文以/usr/local/为例) cd /usr/local/</p>
<p>因为我们服务器端用的是最新30版的，所以我们也要下载最新版本的。可以到如下的网址查询最新版本：</p>
<p><a href="https://github.com/fatedier/frp/releases/">https://github.com/fatedier/frp/releases/</a></p>
<h3 id="配置frpc">配置frpc</h3>
<pre>编辑frpc.ini文件<br />cd /usr/local/frpc<br />vi frpc.ini</pre>
<pre>[common] server_addr = x.x.x.x<br /><br /> server_port = 7000<br /><br /> token = 你在宝塔里设置的 <br /><br />[rdp] type = tcp <br /><br />local_ip = 127.0.0.1 <br /><br />local_port = 3389 <br /><br />remote_port = 7001<br /><br /> [smb] type = tcp <br /><br />local_ip = 127.0.0.1<br /><br /> local_port = 445 <br /><br />remote_port = 7002</pre>
<ul class="wp-block-list">
  <li>
    “server_addr”为服务端IP地址，填入即可。
  </li>
  <li>
    “server_port”为服务器端口，填入你设置的端口号即可，如果未改变就是7000
  </li>
  <li>
    “token”是你在服务器上设置的连接口令，原样填入即可。
  </li>
</ul>
<p>ESC退出编辑<br>
输入:wq回车即可保存</p>
<h3 id="启动frpc">启动frpc</h3>
<p>启动frpc命令： ./frpc -c ./frpc.ini</p>
<p>保持后台运行frpc命令 ： nohup ./frpc -c ./frpc.ini &amp;</p>
<h2 id="设置群晖nas重启开机自动运行frpc">设置群晖NAS重启开机自动运行frpc</h2>
<p>控制面板——任务计划新增<br>
触发的任务<br>
用户自定义脚本<br>
常规<br>
填写任务名称<br>
用户账号和事件保持默认<br>
任务设置<br>
用户自定义脚本<br>
填写你的frpc安装路径： /usr/local/frpc/frpc -c /usr/local/frpc/frpc.ini<br>
确定配置完成<br>
现在可以使用域名无端口访问群晖NAS了</p>
<p>本文frpc设置部分参考了：群晖NAS安装配置免费frp内网穿透教程 一并表示感谢</p>
]]></content:encoded>
    </item>
    <item>
      <title>推荐一款免费的视频剪辑软件shotcut</title>
      <link>https://www.iliu.org/2914.html</link>
      <pubDate>Fri, 06 Dec 2019 02:37:53 +0000</pubDate>
      <guid>https://www.iliu.org/2914.html</guid>
      <description>&lt;hr&gt;
&lt;p&gt;tags:
跋涉者最近在弄另一个网站的时候，需要把一些长的视频剪辑成一个短的预览视频，这样没有权限看的人，只能看到短视频，而支付积分后则可以看完整的视频。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<hr>
<p>tags:
跋涉者最近在弄另一个网站的时候，需要把一些长的视频剪辑成一个短的预览视频，这样没有权限看的人，只能看到短视频，而支付积分后则可以看完整的视频。</p>
<p>由于以前一只没有用过此类的软件，因此要求这类软件越简单越好，越容易上手，学习成本越低最理想，可是找了不少，要不是收费的，价格很贵，要不软件很大，功能多的不知道如何下手，要不打开都是广告，一直没有找到理想的，最后，寻寻觅觅终于找到了这款比较满意的——shotcut。<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"></p>
  <p>
    Shotcut是一个免费的、开源的、跨平台的视频编辑器，适用于Windows、Mac和Linux。主要功能包括支持多种格式;不需要导入本地时间轴编辑;Blackmagic设计支持输入和预览监控;支持4k分辨率。
  </p>
  <p>
  </p>
</blockquote>
<p>软件的官方网站： <a href="https://www.shotcut.org/">https://www.shotcut.org/</a></p>
<p>软件不大，只有不到100M，但是该有的功能都有了。想要剪辑视频只要鼠标简单的点上几下，就能把视频剪辑到你想要的位置和时间。如上图，想要简介一个视频，只需四步：</p>
<ul class="wp-block-list">
  <li>
    第一步：点击打开文件，选择你要剪辑的视频
  </li>
  <li>
    第二步：在时间轴哪里选择你要剪辑的位置。
  </li>
  <li>
    第三步：点击输出。
  </li>
  <li>
    第四步：点击输出文件
  </li>
</ul>
<p>然后，系统会编译一会，时间和你电脑的配置以及你剪辑的视频长短有关。</p>
]]></content:encoded>
    </item>
    <item>
      <title>使用zerotier进行内网穿透</title>
      <link>https://www.iliu.org/2872.html</link>
      <pubDate>Wed, 27 Nov 2019 07:33:08 +0000</pubDate>
      <guid>https://www.iliu.org/2872.html</guid>
      <description>&lt;p&gt;tags:
自从到手了暴风酷播之后，抽空就折腾了下NAS，目前来说系统方面已经没有什么问题了，自己需要使用的套件也基本上弄好了，唯一一个需要搞定的问题就是如何远程访问群晖，同步群晖这个问题。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>tags:
自从到手了暴风酷播之后，抽空就折腾了下NAS，目前来说系统方面已经没有什么问题了，自己需要使用的套件也基本上弄好了，唯一一个需要搞定的问题就是如何远程访问群晖，同步群晖这个问题。</p>
<p>关于远程访问群晖，有很多的方法，比如如果你有公网IP，那就很好办，只需要一个域名就可以搞定的事情。但是如果你使用了大局域网的移动宽带，那么上述的方法是没法用的，因为移动宽带就不提供公网IP的。（至于公网IP的方法，不在本文讨论的范围内）。而跋涉者就刚好用的是移动的宽带，而且当初贪图便宜把家里的联通宽带也换成了移动的宽带，所以利用公网IP来远程访问群晖的方法是行不通了。</p>
<p>那是不是内网就没法进行远程访问群晖了呢，当然不是，我们可以利用内网穿透的方法来绕过这一难题。</p>
<p>第一个方法是利用FRP这个软件来进行内网穿透。</p>
<p>这个方法需要你有一台VPS或者服务器，然后在服务器上安装FRP的服务器端，在群晖上安装FRP的客户端，这样，运行起来之后，群晖上的客户端就和VPS上的服务器端进行握手，你就可以用服务器上的ip来远程访问群晖了。</p>
<p>这种方法需要你有一台服务器，还需要你有较强的动手能力，最重要的一点是服务器还不能差了，否则联网的速度很慢，达不到快速备份的目的。跋涉者首先选择的方案就是这个，也完成了相关的设置，但是由于速度不稳定而放弃。如果你有一台比较好的服务器，这种方法不失为一种好的解决方案。</p>
<p>第二种方式，买内网穿透的设备</p>
<p>目前网上有卖这方面的设备的，但是这玩意，一是要花钱，二也是受限于带宽和用户数。所以对这种方法也不是很推荐。</p>
<p>第三种方法，最简单的一种方法，利用zerotier这个国外的网站进行内网穿透。</p>
<p>ZeroTier原理：</p>
<p>ZeroTier虚拟了一个网段，网段为多个网段可选，跋涉者选择的是10.244.150.*这个网段，公司和家里分别安装ZeroTier客户端，客户端会虚拟出一个网络并加入这个网段，在家即可访问10.244.150.1地址，反之同理。</p>
<p>ZeroTier设备支持：</p>
<p>免费用户可以支持100个设备，支持Windows、macOS、Linux、IOS、Android、Synology、QNAP、Western Digital MyCloud NAS等等。</p>
<p>所以，对于我们大多数的人来说，100台设备已经是足够用了，另外就是ZeroTier两台设备握手以后，就采用的是P2P的方式传输数据。因此，不会受到其他因素的干扰，传输数据的速度相当的快，跋涉者这里就达到了3m/s的速度，当然这是因为受限于宽带运营商的上行带宽。</p>
<p>使用方法：</p>
<p>打开网站 <a href="https://www.zerotier.com/">ZEROTIER</a></p>
<p>网站是英文的，不过不影响，点击右上角的login，在打开的页面中点击 <strong>Log in to ZeroTier</strong>最下方点击 Register 。来注册一个新用户。<a href="https://iliu.org/wp-content/uploads/2019/11/37fc35e0fc32e9d.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2873" src="https://iliu.org/wp-content/uploads/2019/11/37fc35e0fc32e9d.png" alt="" width="634" height="513" srcset="https://iliu.org/wp-content/uploads/2019/11/37fc35e0fc32e9d.png 634w, https://iliu.org/wp-content/uploads/2019/11/37fc35e0fc32e9d-300x243.png 300w" sizes="(max-width: 634px) 100vw, 634px" /></a></p>
<p>注册后，进入网站，点击最上面那一行的 Networks 然后点击 create a Networks。系统会给你一个网络的编号。然后点击页面最上面的那一行 downloads,这个页面里有各种系统的客户端。下载，安装。然后把你刚创建的网络号码填进去。运行之后，</p>
<p>点击进入已创建的网络</p>
<p>此时可以看到Network ID，后续添加设备都会需要这个ID。</p>
<p>默认是Certificate (Private Network)，选择此模式表示每次在添加新的主机时，需要手动勾选是否允许连接，如果选择None (Public Network)模式，表示加入网络后自动分配IP并允许连接，从安全性来说建议使用默认选项Certificate (Private Network)，方便性来看None (Public Network)更方便，不用每次加入网络后手动勾选。</p>
<p><a href="https://iliu.org/wp-content/uploads/2019/11/d1bcac1984700e2.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2874" src="https://iliu.org/wp-content/uploads/2019/11/d1bcac1984700e2.png" alt="" width="1024" height="478" srcset="https://iliu.org/wp-content/uploads/2019/11/d1bcac1984700e2.png 1024w, https://iliu.org/wp-content/uploads/2019/11/d1bcac1984700e2-300x140.png 300w, https://iliu.org/wp-content/uploads/2019/11/d1bcac1984700e2-768x359.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>如下图所示，</p>
<p><a href="https://iliu.org/wp-content/uploads/2019/11/c74c9a9e0c41d06.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2875" src="https://iliu.org/wp-content/uploads/2019/11/c74c9a9e0c41d06.png" alt="" width="995" height="390" srcset="https://iliu.org/wp-content/uploads/2019/11/c74c9a9e0c41d06.png 995w, https://iliu.org/wp-content/uploads/2019/11/c74c9a9e0c41d06-300x118.png 300w, https://iliu.org/wp-content/uploads/2019/11/c74c9a9e0c41d06-768x301.png 768w" sizes="(max-width: 995px) 100vw, 995px" /></a><br>
每次链接上一个新设备之后，都要在设备的前面那个框里的√打上，这样就表示允许接入网络。</p>
<p>群晖里的安装也是同样的原理，下载群晖的套件，然后再群晖里选择手动安装套件，接入网络后，就可以用系统分配给你的IP地址加上你群晖的端口号一般是5000，来远程访问你的群晖了。各个群晖的套件也是一样的原来，IP地址加套件的端口号。</p>
<p>最后，由于安卓客户端众所周知的原因，是没法直接下载的，所以，如果你有使用monents套件的需求，是必须要用安卓客户端的，点击文后的链接，直接下载吧。</p>
<p><a href="https://iliu.org/wp-content/uploads/2019/11/cd5dfa5f7cf472d.zip">安卓客户端下载</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>再次折腾黑群晖系统</title>
      <link>https://www.iliu.org/2860.html</link>
      <pubDate>Sat, 23 Nov 2019 02:51:56 +0000</pubDate>
      <guid>https://www.iliu.org/2860.html</guid>
      <description>&lt;p&gt;昨天拍了一些眼镜架的图片，可以却同步不到群晖的monents里面，有了群晖之后有些事情确实特别的方便，比如我拍的镜架的图片，想传到在线商城里面，以前的做法是，选择图片，再微信里用文件传输助手传给自己，然后再在桌面的微信里下载下来，很不方便，有了群晖之后，就可以直接在客户端里同步到群晖里，我直接在里面修图，上传到网站即可。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>昨天拍了一些眼镜架的图片，可以却同步不到群晖的monents里面，有了群晖之后有些事情确实特别的方便，比如我拍的镜架的图片，想传到在线商城里面，以前的做法是，选择图片，再微信里用文件传输助手传给自己，然后再在桌面的微信里下载下来，很不方便，有了群晖之后，就可以直接在客户端里同步到群晖里，我直接在里面修图，上传到网站即可。</p>
<p><a href="https://iliu.org/wp-content/uploads/2019/11/b030f7d30297555.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2863" src="https://iliu.org/wp-content/uploads/2019/11/b030f7d30297555.jpg" alt="" width="900" height="575" srcset="https://iliu.org/wp-content/uploads/2019/11/b030f7d30297555.jpg 900w, https://iliu.org/wp-content/uploads/2019/11/b030f7d30297555-300x192.jpg 300w, https://iliu.org/wp-content/uploads/2019/11/b030f7d30297555-768x491.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></a></p>
<p>但是今天却同步出错了，用重启大法重启后，竟然显示数据损坏，让重新安装系统，但是下载了3617的pat后上传，却显示13错误，从网上查了一下，应该是和引导不匹配造成的。那就重新安装吧，听张波老师说，二合一的系统不稳定，这次打算直接把引导程序装到U盘里，暴风自带的ssd专门装套件，西数的那块2T的硬盘作为数据盘。</p>
<p>由于没有弄过非2合一的，在网上找教程的时候看到有人说万由的U-NAS也不错，简单高效，并且暴风可以说是万由的亲儿子。由于觉得自己使用也就是备份下数据什么的，用万由也就够了，于是，打算装万由的系统试试。万由的系统安装很简单，用Win32DiskImager把固件写入U盘，安装到ssd里即可。</p>
<p>暴风接上显示器，大爷，又进不去bios了，轻车熟路，拆机箱，扣主板电池放电，装上电池。接上显示器，电源等，开机进入bios。可是却识别不出来U盘，后来查到是因为万由不支持uefi启动，于是更改主板的引导方式，安装很顺利，可惜安装后，又不能进BIOS了，不过进入系统正常，登录了一下万由的系统，感觉摸不到头脑，系统和群晖一比就如windows98和win10的差别一样，易用性太差了，没办法，还是换成群晖吧。不过，u-NAS启动等都能甩群晖一条街。。。。可惜不是我的菜。</p>
<p>由于还是进不去BIOS，于是继续抠电池。看到主板的版本是1.4的，怀疑是不是版本的问题，看官方的最新是1.8的，于是升级主板的版本到1.8,重启了几次，开机进bIOS正常，于是为了兼容性，于是打开了打开CSM选项，保存重启，大爷的，又进不去BIOS了，不过也终于知道是什么原因导致进不去BIOS了。再次抠电池，设置的是，不打开CSM选项就是了。现在回想起来，应该都是设置了这个造成的。也不知道是我这块主板的个例还是全都是这样。</p>
<p><a href="https://iliu.org/wp-content/uploads/2019/11/48d97b422372f66.jpg"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2861" src="https://iliu.org/wp-content/uploads/2019/11/48d97b422372f66-1024x394.jpg" alt="" width="1024" height="394" srcset="https://iliu.org/wp-content/uploads/2019/11/48d97b422372f66-1024x394.jpg 1024w, https://iliu.org/wp-content/uploads/2019/11/48d97b422372f66-300x115.jpg 300w, https://iliu.org/wp-content/uploads/2019/11/48d97b422372f66-768x295.jpg 768w, https://iliu.org/wp-content/uploads/2019/11/48d97b422372f66-1536x591.jpg 1536w, https://iliu.org/wp-content/uploads/2019/11/48d97b422372f66-2048x787.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>如上图，这是正常启动的时候，显示的当开启CSM后，上面这些文字显示的是乱码，就进不去BIOS了，不过进系统正常。</p>
<p>这次安装决定把引导程序装到U盘里，暴风自带的ssd专门装套件，西数的那块2T的硬盘作为数据盘。网上一堆的教程让人头大，其实理顺了也很简单。过两天抽空写个教程。安装顺利，由于没有改CSM，启动也正常。又可以方便的使用群晖带来的服务了。</p>
]]></content:encoded>
    </item>
    <item>
      <title>记暴风酷播云2期折腾黑群晖</title>
      <link>https://www.iliu.org/2855.html</link>
      <pubDate>Mon, 18 Nov 2019 07:28:30 +0000</pubDate>
      <guid>https://www.iliu.org/2855.html</guid>
      <description>&lt;p&gt;双11前后，张波老师弄了个zhang.gg和zhang.bo的两个域名，看gg不贵，而且有www.liuday.com这个域名还没有被注册，于是也跟风注册了个个性域名。后来不知道怎么聊的聊到了NAS上面，本来觉得我对这个需求不是很大，后来张波老师说，他淘汰了他的蜗牛弄了个暴风，于是我就想用张老师淘汰下来的蜗牛玩一玩。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>双11前后，张波老师弄了个zhang.gg和zhang.bo的两个域名，看gg不贵，而且有www.liuday.com这个域名还没有被注册，于是也跟风注册了个个性域名。后来不知道怎么聊的聊到了NAS上面，本来觉得我对这个需求不是很大，后来张波老师说，他淘汰了他的蜗牛弄了个暴风，于是我就想用张老师淘汰下来的蜗牛玩一玩。</p>
<p><a href="https://iliu.org/wp-content/uploads/2019/11/9b81db5da85a49e.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2856" src="https://iliu.org/wp-content/uploads/2019/11/9b81db5da85a49e.png" alt="" width="640" height="296" srcset="https://iliu.org/wp-content/uploads/2019/11/9b81db5da85a49e.png 640w, https://iliu.org/wp-content/uploads/2019/11/9b81db5da85a49e-300x139.png 300w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>张波老师要送给我，我不同意，后来半卖半送的给了我，不巧的是，张老师再发货的时候，蜗牛的系统出问题了，于是也就不了了之了。在这期间也了解了下NAS这个玩意，觉得还是不错的，自己还是有一定的需求的，再加上媳妇手机的照片满了，特别是她备份到华为云，只有5g的免费空间，早就超了，现在50g的也超了，下一个就要买200g的，一年也不少钱，于是决定淘个这种垃圾玩，张老师建议直接上暴风，但是当时我已经下单买了蜗牛，当时想着弄个NAS加上个软路由，所以还买的卖家改的双网口版的。</p>
<p>发过来后，卖家虽然号称的是99新，但是明显是重新喷过漆的，不过清理的很干净。慢慢的山寨感，使用了一下黑群晖的系统，觉得也还行。为了保险起见还是上暴风吧，于是和卖家联系，好说歹说，把这蜗牛给退了。</p>
<p>正再闲鱼找呢，一个哥们说他淘汰了一台，他上铁威马了。于是把这台暴风发给了我。唉，到哪都能遇到好人，哈哈。发过来后，发现整个比蜗牛强多了，不是一个档次的东西。朋友装的是918+的6.2.2，开机慢的要死，基本上要5分钟还多，关机也慢，最重要的是相册套件moments总出问题，不是卡再转换那，就是象掉线了一样，及不能上传图片，也删除不了图片。</p>
<p>本来以为这个问题是远程不稳的原因，后来发现，局域网里也不行。昨天张波老师说暴风用3617比较合适，于是今天上午没事就开搞。百度云盘这次比较给力，下载固件竟然给了1M的速度。固件什么弄完了，给暴风装上显示器，键盘 鼠标等，结果按网上说的按F11开机，屏幕上显示几行字母，一闪黑屏了。大爷的，以为是不支持无线键盘造成的，于是又找了个USB接口的键盘，还是一个鸟样。问了那个哥们和张波老师，说按F2试试看能不能进bois，网上找了一圈都是说按del。开机，F2，还是不行。</p>
<p><a href="https://iliu.org/wp-content/uploads/2019/11/fda13334174751b.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2857" src="https://iliu.org/wp-content/uploads/2019/11/fda13334174751b.jpg" alt="" width="1024" height="613" srcset="https://iliu.org/wp-content/uploads/2019/11/fda13334174751b.jpg 1024w, https://iliu.org/wp-content/uploads/2019/11/fda13334174751b-300x180.jpg 300w, https://iliu.org/wp-content/uploads/2019/11/fda13334174751b-768x460.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>于是，觉得死马当做活马医，拆机，把主板电池扣掉，然后要把线紧紧。重新装上后，开机F2,进bois了。并且分辨率也调整了。现在想想是不是以前主板记录的屏幕分辨率比较低导致菜单出不来？关机重启，按F11也顺利的弹出选择U盘的启动的菜单了，于是按照3617二合一的教程，顺利的安装完毕。</p>
<p>重启机器，一切正常，没有乱码，也没有了原来那个提示什么VGA错误的提示了，进系统很快，不到1分钟的时间，下午测试了下moment套件的情况，也一切正常了。</p>
<p>所以，建议折腾暴风酷播云的朋友，尽量安装6.1.7的版本，非常稳定，非常流畅，用FRP做的内网穿透也好用的不得了。。。。</p>
]]></content:encoded>
    </item>
    <item>
      <title>WordPress开启Nginx fastcgi_cache缓存加速</title>
      <link>https://www.iliu.org/2700.html</link>
      <pubDate>Sun, 08 Sep 2019 01:51:11 +0000</pubDate>
      <guid>https://www.iliu.org/2700.html</guid>
      <description>&lt;p&gt;昨天趁着重装景安服务器，把一直想弄的 &lt;code&gt;nginx fastcgi_cache&lt;/code&gt; 配置好了，虽然走了不少弯路，但最终成功了，网页打开速度明显提升。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一安装-nginx-ngx_cache_purge-模块&#34;&gt;一、安装 Nginx ngx_cache_purge 模块&lt;/h2&gt;
&lt;p&gt;由于使用的是 OneinStack 面板，以下步骤基于 OneinStack。其他面板如 LNMP 可能需要微调。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>昨天趁着重装景安服务器，把一直想弄的 <code>nginx fastcgi_cache</code> 配置好了，虽然走了不少弯路，但最终成功了，网页打开速度明显提升。</p>
<hr>
<h2 id="一安装-nginx-ngx_cache_purge-模块">一、安装 Nginx ngx_cache_purge 模块</h2>
<p>由于使用的是 OneinStack 面板，以下步骤基于 OneinStack。其他面板如 LNMP 可能需要微调。</p>
<ol>
<li><strong>检查 ngx_cache_purge 是否安装</strong></li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nginx -V 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> grep -o ngx_cache_purge
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>如果没有输出，表示未安装。</p></blockquote>
<ol start="2">
<li><strong>下载并解压 ngx_cache_purge 模块</strong></li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /root/oneinstack/src
</span></span><span class="line"><span class="cl">wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
</span></span><span class="line"><span class="cl">tar xzf ngx_cache_purge-2.3.tar.gz
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="3">
<li><strong>解压 Nginx 及依赖包</strong></li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tar xzf nginx-1.16.1.tar.gz
</span></span><span class="line"><span class="cl">tar xzf pcre-8.43.tar.gz
</span></span><span class="line"><span class="cl">tar xzf openssl-1.1.1c.tar.gz
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /root/oneinstack/src/nginx-1.16.1
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="4">
<li><strong>查看 Nginx 编译参数</strong></li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nginx -V
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="5">
<li><strong>编译并安装 ngx_cache_purge</strong></li>
</ol>
<p>注意：添加模块时必须保留原有编译参数，只在末尾加上 <code>--add-module=../ngx_cache_purge-2.3</code></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./configure --prefix<span class="o">=</span>/usr/local/nginx --user<span class="o">=</span>www --group<span class="o">=</span>www <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>--with-http_stub_status_module --with-http_v2_module --with-http_ssl_module <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>--with-http_gzip_static_module --with-http_realip_module --with-http_flv_module <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>--with-http_mp4_module --with-openssl<span class="o">=</span>../openssl-1.0.2o --with-pcre<span class="o">=</span>../pcre-8.42 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>--with-pcre-jit --with-ld-opt<span class="o">=</span>-ljemalloc --add-module<span class="o">=</span>../ngx_cache_purge-2.3
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">make
</span></span><span class="line"><span class="cl">mv /usr/local/nginx/sbin/nginx<span class="o">{</span>,_<span class="sb">`</span>date +%F<span class="sb">`</span><span class="o">}</span> <span class="c1"># 备份旧版本</span>
</span></span><span class="line"><span class="cl">cp objs/nginx /usr/local/nginx/sbin
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="6">
<li><strong>验证安装成功</strong></li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nginx -V 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> grep -o ngx_cache_purge
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>输出 <code>ngx_cache_purge</code> 表示安装成功。</p></blockquote>
<hr>
<h2 id="二nginx-开启-fastcgi-cache-配置实例">二、Nginx 开启 FastCGI Cache 配置实例</h2>
<p>以下为我的 WordPress 网站配置示例（<code>www.yanjingweb.cn</code>）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="k">fastcgi_cache_path</span> <span class="s">/tmp/wpcache</span> <span class="s">levels=1:2</span> <span class="s">keys_zone=WORDPRESS:250m</span> <span class="s">inactive=1d</span> <span class="s">max_size=1G</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">fastcgi_temp_path</span> <span class="s">/tmp/wpcache/temp</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">fastcgi_cache_key</span> <span class="s">&#34;</span><span class="nv">$scheme$request_method$host$request_uri&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">fastcgi_cache_use_stale</span> <span class="s">error</span> <span class="s">timeout</span> <span class="s">invalid_header</span> <span class="s">http_500</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="kn">set</span> <span class="nv">$skip_cache</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># POST 请求不缓存
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kn">if</span> <span class="s">(</span><span class="nv">$request_method</span> <span class="p">=</span> <span class="s">POST)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kn">set</span> <span class="nv">$skip_cache</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 带查询字符串的请求不缓存
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kn">if</span> <span class="s">(</span><span class="nv">$query_string</span> <span class="s">!=</span> <span class="s">&#34;&#34;)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kn">set</span> <span class="nv">$skip_cache</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 后台及特定页面不缓存
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kn">if</span> <span class="s">(</span><span class="nv">$request_uri</span> <span class="p">~</span><span class="sr">*</span> <span class="s">&#34;/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml&#34;)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kn">set</span> <span class="nv">$skip_cache</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 登录用户或评论用户不缓存
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kn">if</span> <span class="s">(</span><span class="nv">$http_cookie</span> <span class="p">~</span><span class="sr">*</span> <span class="s">&#34;comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in&#34;)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kn">set</span> <span class="nv">$skip_cache</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kn">location</span> <span class="p">~</span> <span class="sr">[^/]\.php(/|$)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kn">fastcgi_index</span> <span class="s">index.php</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">include</span> <span class="s">fastcgi.conf</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">fastcgi_cache_bypass</span> <span class="nv">$skip_cache</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">fastcgi_no_cache</span> <span class="nv">$skip_cache</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">fastcgi_cache</span> <span class="s">WORDPRESS</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">fastcgi_cache_valid</span> <span class="mi">200</span> <span class="mi">301</span> <span class="mi">302</span> <span class="s">1d</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kn">add_header</span> <span class="s">X-Cache</span> <span class="s">&#34;</span><span class="nv">$upstream_cache_status</span> <span class="s">From</span> <span class="nv">$host&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">add_header</span> <span class="s">Nginx-Cache</span> <span class="s">&#34;</span><span class="nv">$upstream_cache_status&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 缓存清理配置（可选）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kn">location</span> <span class="p">~</span> <span class="sr">/purge(/.*)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kn">allow</span> <span class="n">127.0.0.1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">allow</span> <span class="n">122.115.122.111</span><span class="p">;</span> <span class="c1"># 请改为你服务器 IP
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kn">deny</span> <span class="s">all</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">fastcgi_cache_purge</span> <span class="s">WORDPRESS</span> <span class="s">&#34;</span><span class="nv">$scheme$request_method$host$1&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="三测试与验证">三、测试与验证</h2>
<ol>
<li>检查 Nginx 配置是否正确：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nginx -t
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="2">
<li>重启 Nginx：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">service nginx restart
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="3">
<li>打开网页，F5 刷新几次，查看浏览器响应头：</li>
</ol>
<blockquote>
<p>如果看到 <code>X-Cache: HIT</code> 字样，表示缓存生效。</p></blockquote>
<ol start="4">
<li>查看缓存文件夹 <code>/tmp/wpcache</code>，可以看到缓存文件生成。</li>
</ol>
<hr>
<h2 id="四效果总结">四、效果总结</h2>
<p>开启 <code>fastcgi_cache</code> 后，即使不使用 CDN，网页打开速度明显提升，实现了秒开体验。</p>
<blockquote>
<p>有动手能力的同学可以尝试，操作难度中等，但效果非常明显。</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>lnmp一键开启waf及使用 Fail2Ban防护</title>
      <link>https://www.iliu.org/2556.html</link>
      <pubDate>Sun, 28 Jul 2019 09:07:40 +0000</pubDate>
      <guid>https://www.iliu.org/2556.html</guid>
      <description>&lt;p&gt;本文主要介绍如何在 &lt;strong&gt;LNMP 一键安装包&lt;/strong&gt; 环境下，启用 &lt;strong&gt;ngx_lua_waf&lt;/strong&gt; Web 防火墙，并使用 &lt;strong&gt;Fail2Ban&lt;/strong&gt; 防护 Nginx 与 WordPress。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一lnmp-开启-lua-支持&#34;&gt;一、LNMP 开启 Lua 支持&lt;/h2&gt;
&lt;p&gt;LNMP 一键安装包从 &lt;strong&gt;1.5 版本&lt;/strong&gt;开始支持 Lua，可用于启用 ngx_lua_waf。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;修改 &lt;code&gt;lnmp.conf&lt;/code&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Enable_Nginx_Lua&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;若 LNMP 已安装，执行：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./upgrade.sh nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输入当前 Nginx 版本号或需要升级的版本号，即可启用 Lua 支持。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>本文主要介绍如何在 <strong>LNMP 一键安装包</strong> 环境下，启用 <strong>ngx_lua_waf</strong> Web 防火墙，并使用 <strong>Fail2Ban</strong> 防护 Nginx 与 WordPress。</p>
<hr>
<h2 id="一lnmp-开启-lua-支持">一、LNMP 开启 Lua 支持</h2>
<p>LNMP 一键安装包从 <strong>1.5 版本</strong>开始支持 Lua，可用于启用 ngx_lua_waf。</p>
<ol>
<li>修改 <code>lnmp.conf</code>：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">Enable_Nginx_Lua</span><span class="o">=</span>y
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="2">
<li>若 LNMP 已安装，执行：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./upgrade.sh nginx
</span></span></code></pre></td></tr></table>
</div>
</div><p>输入当前 Nginx 版本号或需要升级的版本号，即可启用 Lua 支持。</p>
<hr>
<h2 id="二安装-ngx_lua_waf">二、安装 ngx_lua_waf</h2>
<ol>
<li>下载并解压：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip -O ngx_lua_waf.zip
</span></span><span class="line"><span class="cl">unzip ngx_lua_waf.zip
</span></span><span class="line"><span class="cl">mv ngx_lua_waf-master /usr/local/nginx/conf/waf
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="2">
<li>修改 Nginx 配置 <code>/usr/local/nginx/conf/nginx.conf</code>：</li>
</ol>
<p>在 <code>server_tokens off;</code> 下添加：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="k">lua_package_path</span> <span class="s">&#34;/usr/local/nginx/conf/waf/?.lua</span><span class="p">;</span>;<span class="k">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">lua_shared_dict</span> <span class="s">limit</span> <span class="mi">10m</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">init_by_lua_file</span> <span class="s">/usr/local/nginx/conf/waf/init.lua</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="3">
<li>在虚拟主机中启用 WAF：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">root</span> <span class="s">/网站目录</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">access_by_lua_file</span> <span class="s">/usr/local/nginx/conf/waf/waf.lua</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="4">
<li>测试 Nginx 配置并重载：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/usr/local/nginx/sbin/nginx -t
</span></span><span class="line"><span class="cl">/usr/local/nginx/sbin/nginx -s reload
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="5">
<li>测试防护：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="err">http://你的域名/test.php?id=../etc/passwd
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>提示“您的请求带有不合法参数，已被网站管理员设置拦截”表示生效。</p>
<ul>
<li>WAF 配置文件路径：<code>/usr/local/nginx/conf/waf/config.lua</code></li>
</ul>
<hr>
<h2 id="三fail2ban-防护网站与服务器">三、Fail2Ban 防护网站与服务器</h2>
<h3 id="1-获取真实访问-ip">1. 获取真实访问 IP</h3>
<p>套用 CDN 后，需要在 Nginx 中获取真实 IP：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="k">http</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">log_format</span> <span class="s">main</span> <span class="s">&#39;</span><span class="nv">$http_x_forwarded_for-$remote_user[$time_local]</span> <span class="s">&#34;</span><span class="nv">$request&#34;</span> <span class="nv">$status</span> <span class="nv">$body_bytes_sent</span> <span class="s">&#34;</span><span class="nv">$http_referer&#34;</span> <span class="s">&#34;</span><span class="nv">$http_user_agent&#34;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">access_log</span> <span class="s">/home/wwwlogs/xxxx.log</span> <span class="s">main</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>重载 Nginx 后，日志中显示的即为真实来源 IP。</p>
<hr>
<h3 id="2-配置-fail2ban">2. 配置 Fail2Ban</h3>
<ol>
<li>复制配置文件：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="2">
<li>编辑 <code>/etc/fail2ban/jail.local</code>：</li>
</ol>
<p>在 <code>[DEFAULT]</code> 下设置：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="na">bantime</span> <span class="o">=</span> <span class="s">3600     # 封禁时长</span>
</span></span><span class="line"><span class="cl"><span class="na">findtime</span> <span class="o">=</span> <span class="s">3600    # 统计时间</span>
</span></span><span class="line"><span class="cl"><span class="na">maxretry</span> <span class="o">=</span> <span class="s">6       # 最大失败次数</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="3">
<li>启用监狱（示例 Nginx 与 WordPress 防护）：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[nginx-http-auth]</span>
</span></span><span class="line"><span class="cl"><span class="na">enabled</span> <span class="o">=</span> <span class="s">true</span>
</span></span><span class="line"><span class="cl"><span class="na">filter</span> <span class="o">=</span> <span class="s">nginx-http-auth</span>
</span></span><span class="line"><span class="cl"><span class="na">port</span> <span class="o">=</span> <span class="s">http,https</span>
</span></span><span class="line"><span class="cl"><span class="na">logpath</span> <span class="o">=</span> <span class="s">/var/log/nginx/error.log</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[nginx-badbots]</span>
</span></span><span class="line"><span class="cl"><span class="na">enabled</span> <span class="o">=</span> <span class="s">true</span>
</span></span><span class="line"><span class="cl"><span class="na">filter</span> <span class="o">=</span> <span class="s">nginx-badbots</span>
</span></span><span class="line"><span class="cl"><span class="na">port</span> <span class="o">=</span> <span class="s">http,https</span>
</span></span><span class="line"><span class="cl"><span class="na">logpath</span> <span class="o">=</span> <span class="s">/var/log/nginx/access.log</span>
</span></span><span class="line"><span class="cl"><span class="na">maxretry</span> <span class="o">=</span> <span class="s">2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[nginx-nohome]</span>
</span></span><span class="line"><span class="cl"><span class="na">enabled</span> <span class="o">=</span> <span class="s">true</span>
</span></span><span class="line"><span class="cl"><span class="na">filter</span> <span class="o">=</span> <span class="s">nginx-nohome</span>
</span></span><span class="line"><span class="cl"><span class="na">port</span> <span class="o">=</span> <span class="s">http,https</span>
</span></span><span class="line"><span class="cl"><span class="na">logpath</span> <span class="o">=</span> <span class="s">/var/log/nginx/access.log</span>
</span></span><span class="line"><span class="cl"><span class="na">maxretry</span> <span class="o">=</span> <span class="s">2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[nginx-noproxy]</span>
</span></span><span class="line"><span class="cl"><span class="na">enabled</span> <span class="o">=</span> <span class="s">true</span>
</span></span><span class="line"><span class="cl"><span class="na">filter</span> <span class="o">=</span> <span class="s">nginx-noproxy</span>
</span></span><span class="line"><span class="cl"><span class="na">port</span> <span class="o">=</span> <span class="s">http,https</span>
</span></span><span class="line"><span class="cl"><span class="na">logpath</span> <span class="o">=</span> <span class="s">/var/log/nginx/access.log</span>
</span></span><span class="line"><span class="cl"><span class="na">maxretry</span> <span class="o">=</span> <span class="s">2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[wp-login]</span>
</span></span><span class="line"><span class="cl"><span class="na">enabled</span> <span class="o">=</span> <span class="s">true</span>
</span></span><span class="line"><span class="cl"><span class="na">filter</span> <span class="o">=</span> <span class="s">wp-login</span>
</span></span><span class="line"><span class="cl"><span class="na">port</span> <span class="o">=</span> <span class="s">http,https</span>
</span></span><span class="line"><span class="cl"><span class="na">maxretry</span> <span class="o">=</span> <span class="s">10</span>
</span></span><span class="line"><span class="cl"><span class="na">findtime</span> <span class="o">=</span> <span class="s">60</span>
</span></span><span class="line"><span class="cl"><span class="na">bantime</span> <span class="o">=</span> <span class="s">43600</span>
</span></span><span class="line"><span class="cl"><span class="na">logpath</span> <span class="o">=</span> <span class="s">/var/log/nginx/access.log</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[xmlrpc]</span>
</span></span><span class="line"><span class="cl"><span class="na">enabled</span> <span class="o">=</span> <span class="s">true</span>
</span></span><span class="line"><span class="cl"><span class="na">filter</span> <span class="o">=</span> <span class="s">xmlrpc</span>
</span></span><span class="line"><span class="cl"><span class="na">port</span> <span class="o">=</span> <span class="s">http,https</span>
</span></span><span class="line"><span class="cl"><span class="na">logpath</span> <span class="o">=</span> <span class="s">/var/log/nginx/access.log</span>
</span></span><span class="line"><span class="cl"><span class="na">bantime</span> <span class="o">=</span> <span class="s">43600</span>
</span></span><span class="line"><span class="cl"><span class="na">maxretry</span> <span class="o">=</span> <span class="s">1</span>
</span></span><span class="line"><span class="cl"><span class="na">findtime</span> <span class="o">=</span> <span class="s">5</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="3-创建-fail2ban-规则">3. 创建 Fail2Ban 规则</h3>
<p>在 <code>/etc/fail2ban/filter.d/</code> 中添加规则文件：</p>
<ul>
<li><strong>nginx-http-auth.conf</strong>：过滤 HTTP 验证失败</li>
<li><strong>nginx-badbots.conf</strong>：过滤恶意爬虫（可复制 apache-badbots.conf）</li>
<li><strong>nginx-nohome.conf</strong>：过滤目录扫描</li>
<li><strong>nginx-noproxy.conf</strong>：防止反代</li>
<li><strong>wp-login.conf</strong>：防止 WordPress 登录暴力破解</li>
<li><strong>xmlrpc.conf</strong>：防止 WordPress xmlrpc 攻击</li>
</ul>
<hr>
<h3 id="4-防护无效-404-请求">4. 防护无效 404 请求</h3>
<ol>
<li>创建过滤规则 <code>/etc/fail2ban/filter.d/nginx-not-found.conf</code>：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[Definition]</span>
</span></span><span class="line"><span class="cl"><span class="na">failregex</span> <span class="o">=</span> <span class="s">^&lt;HOST&gt;.*&#34;(GET|POST).*&#34; (404|444|403|400) .*$</span>
</span></span><span class="line"><span class="cl"><span class="na">ignoreregex</span> <span class="o">=</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="2">
<li>启用监狱：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[nginxno404]</span>
</span></span><span class="line"><span class="cl"><span class="na">enabled</span> <span class="o">=</span> <span class="s">true</span>
</span></span><span class="line"><span class="cl"><span class="na">port</span> <span class="o">=</span> <span class="s">http,https</span>
</span></span><span class="line"><span class="cl"><span class="na">filter</span> <span class="o">=</span> <span class="s">nginx-not-found</span>
</span></span><span class="line"><span class="cl"><span class="na">action</span> <span class="o">=</span> <span class="s">iptables[name=nginxno404, port=http, protocol=tcp]</span>
</span></span><span class="line"><span class="cl"><span class="na">logpath</span> <span class="o">=</span> <span class="s">/home/wwwlogs/access.log</span>
</span></span><span class="line"><span class="cl"><span class="na">bantime</span> <span class="o">=</span> <span class="s">3600</span>
</span></span><span class="line"><span class="cl"><span class="na">findtime</span> <span class="o">=</span> <span class="s">60</span>
</span></span><span class="line"><span class="cl"><span class="na">maxretry</span> <span class="o">=</span> <span class="s">5</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="3">
<li>重启 Fail2Ban：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">systemctl restart fail2ban.service
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="4">
<li>查看状态：</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">fail2ban-client status
</span></span><span class="line"><span class="cl">tail -f /var/log/fail2ban.log
</span></span><span class="line"><span class="cl">iptables --list -n
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="四总结">四、总结</h2>
<ul>
<li>LNMP + Lua + ngx_lua_waf 可提供基本 Web 防火墙保护。</li>
<li>Fail2Ban 可防暴力破解、恶意爬虫、目录扫描、WordPress xmlrpc 攻击及无效请求。</li>
<li>结合日志监控与定期规则更新，可有效提升网站安全性。</li>
</ul>
<blockquote>
<p>注：本文参考了 <a href="https://www.logcg.com/archives/2998.html">落格部落</a> 及 <a href="https://www.imydl.com">明月登楼博客</a> 的相关内容。</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>给7B2主题加上外链自动跳转功能</title>
      <link>https://www.iliu.org/1656.html</link>
      <pubDate>Mon, 27 May 2019 07:08:40 +0000</pubDate>
      <guid>https://www.iliu.org/1656.html</guid>
      <description>&lt;p&gt;7B2 主题默认没有外链自动跳转功能。虽然说作用不大，但大多数站长都会给外链增加自动跳转功能，所以这里介绍一种实现方法，源码来自缙哥哥。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第一步建立跳转文件&#34;&gt;第一步：建立跳转文件&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在网站根目录下新建一个名为 &lt;code&gt;go&lt;/code&gt; 的文件夹。&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;go&lt;/code&gt; 文件夹里创建 &lt;code&gt;index.php&lt;/code&gt; 文件。&lt;/li&gt;
&lt;li&gt;上传 PHP 代码到该文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;这个 PHP 页面主要功能：&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>7B2 主题默认没有外链自动跳转功能。虽然说作用不大，但大多数站长都会给外链增加自动跳转功能，所以这里介绍一种实现方法，源码来自缙哥哥。</p>
<hr>
<h2 id="第一步建立跳转文件">第一步：建立跳转文件</h2>
<ol>
<li>在网站根目录下新建一个名为 <code>go</code> 的文件夹。</li>
<li>在 <code>go</code> 文件夹里创建 <code>index.php</code> 文件。</li>
<li>上传 PHP 代码到该文件。</li>
</ol>
<blockquote>
<p>这个 PHP 页面主要功能：</p>
<ul>
<li>接收传入的外链 URL。</li>
<li>对特定外链进行自定义跳转（可自行添加或删除）。</li>
<li>支持 URL 的 base64 编码和解码。</li>
<li>对非法或缺失的参数进行默认处理，返回首页。</li>
</ul></blockquote>
<hr>
<h2 id="第二步自定义跳转规则">第二步：自定义跳转规则</h2>
<ol>
<li>在 PHP 文件中可以定义一个数组，用于存储常用的跳转目标和标识。</li>
<li>PHP 会遍历数组，如果传入的 URL 与数组匹配，则使用数组中定义的实际 URL 进行跳转。</li>
</ol>
<blockquote>
<p>示例用途：</p>
<ul>
<li>联盟推广链接</li>
<li>合作网站跳转</li>
<li>安全验证外链</li>
</ul></blockquote>
<hr>
<h2 id="第三步跳转处理逻辑">第三步：跳转处理逻辑</h2>
<ol>
<li>判断 URL 是否为空或是否经过加密。</li>
<li>检查 URL 是否以 <code>http://</code>、<code>https://</code> 等协议开头。</li>
<li>如果 URL 格式合法，则显示一个跳转页面，并倒计时几秒后自动跳转。</li>
<li>如果 URL 不合法或缺失，则返回网站首页，并提示“参数错误”或“参数缺失”。</li>
</ol>
<hr>
<h2 id="第四步前端跳转页面">第四步：前端跳转页面</h2>
<ol>
<li>
<p>HTML 页面显示：</p>
<ul>
<li>跳转标题，如“页面加载中，请稍候……”</li>
<li>倒计时圆形动画</li>
<li>跳转按钮：用户可点击立即跳转</li>
<li>页脚提示：安全加密标识</li>
</ul>
</li>
<li>
<p>倒计时逻辑使用 JavaScript 控制，倒计时结束后自动跳转。</p>
</li>
</ol>
<hr>
<h2 id="第五步安全与兼容性">第五步：安全与兼容性</h2>
<ol>
<li>防止恶意 URL 或脚本注入。</li>
<li>支持多种浏览器，包括 IE8。</li>
<li>可禁用外部网站引用此跳转页面（可选注释代码）。</li>
</ol>
<hr>
<p>整体效果：<strong>美观、带倒计时、兼容性好，并且可以自定义跳转规则</strong>。</p>
]]></content:encoded>
    </item>
    <item>
      <title>这次发现百度收录的挺快的</title>
      <link>https://www.iliu.org/53.html</link>
      <pubDate>Sat, 18 May 2019 09:02:18 +0000</pubDate>
      <guid>https://www.iliu.org/53.html</guid>
      <description>&lt;hr&gt;
&lt;p&gt;tags:
前天，无疑中在百度中输入site:ewader.com，发现首页被收录了。感觉这次收录的倒是挺快的，不过也就仅仅收录了一个首页而已，我甚至统计代码什么的都没有加。期待收录的更多。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<hr>
<p>tags:
前天，无疑中在百度中输入site:ewader.com，发现首页被收录了。感觉这次收录的倒是挺快的，不过也就仅仅收录了一个首页而已，我甚至统计代码什么的都没有加。期待收录的更多。</p>
<p>今天发现360也收录了，记得以前360收录的也很慢，这次怎么都这么积极了？？</p>
<p>上午一个大学同系不同班的同学来配眼镜，先交代下这个同学的背景，应该78年或者79年生人，我们那一届基本上都是这个年龄，至今未婚，个子不到170cm，体重150多斤，长得不丑也不帅。都这个岁数了还没有结婚，我们同学都很着急，恰好在一个家长群里有人发了一个女孩的信息，80年生人，身高1.60米左右，工作单位不错，未婚。看有没合适的。</p>
<p>然后我就觉得可以让他们两个试试，给他说了女孩的情况，发生了如下对话：</p>
<p>我：有个女孩，身高大概1米6，80年的，你要不认识认识？</p>
<p>他：年纪太大了！</p>
<p>我：@#￥￥%%%</p>
<p>我能说活该你单身吗？</p>
]]></content:encoded>
    </item>
    <item>
      <title>百度输入法小测</title>
      <link>https://www.iliu.org/943.html</link>
      <pubDate>Wed, 27 Oct 2010 01:43:35 +0000</pubDate>
      <guid>https://www.iliu.org/943.html</guid>
      <description>&lt;hr&gt;
&lt;p&gt;tags:
由于黑莓手机上使用的是百度输入法，感觉还不错。（不错的原因是没有比较）所以再百度电脑版的输入法出来伊始，就装上体验了一番&lt;/p&gt;
&lt;p&gt;百度输入法的优点是：占用的资源比较下，占用的磁盘空间只有30多M，比搜狗的要小的多了，不过和google的差不多。其他方面可能是测试版的原因，没有发现更具有的优势。所具有的功能比的也都有了，而且最重要的是，不太稳定，有时候会出现白屏的现象以及找不到词库。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<hr>
<p>tags:
由于黑莓手机上使用的是百度输入法，感觉还不错。（不错的原因是没有比较）所以再百度电脑版的输入法出来伊始，就装上体验了一番</p>
<p>百度输入法的优点是：占用的资源比较下，占用的磁盘空间只有30多M，比搜狗的要小的多了，不过和google的差不多。其他方面可能是测试版的原因，没有发现更具有的优势。所具有的功能比的也都有了，而且最重要的是，不太稳定，有时候会出现白屏的现象以及找不到词库。</p>
<p>百度输入法的介绍写的是，“基于百度搜索技术，最强大的中文输入引擎”，不过目前除了云查找之外，还真的没有见到其他的优势，不过有一点还是比较看好百度的，其所说的基于搜索技术，可能使得拼音的结果更智能化，我的理解是，输入拼音之后，最优先出现的词是搜索引擎中使用频率最高的，这样可以让拼音的重复率降低的最小。基于此，对于输入法，还是比较看好百度和google的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>黑莓8830上网利器之浏览器</title>
      <link>https://www.iliu.org/894.html</link>
      <pubDate>Tue, 14 Sep 2010 05:48:30 +0000</pubDate>
      <guid>https://www.iliu.org/894.html</guid>
      <description>&lt;p&gt;黑莓8830使用Opera Mini浏览器的小技巧&lt;/p&gt;
&lt;p&gt;一、Opera Mini 的快捷键&lt;/p&gt;
&lt;p&gt;Opera Mini 在黑莓8830上提供了丰富的快捷键操作，可以大幅提升浏览效率：&lt;/p&gt;
&lt;p&gt;• 快速拨号：按 * + 数字键 打开对应的快速拨号页面&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>黑莓8830使用Opera Mini浏览器的小技巧</p>
<p>一、Opera Mini 的快捷键</p>
<p>Opera Mini 在黑莓8830上提供了丰富的快捷键操作，可以大幅提升浏览效率：</p>
<p>• 快速拨号：按 * + 数字键 打开对应的快速拨号页面</p>
<p>• RSS订阅：按 * + 0 查看RSS新闻推送</p>
<p>• 页面缩放：按 5 放大或缩小页面</p>
<p>• 光标移动：</p>
<p>• I（上）、J（左）、L（右）、M（下）</p>
<p>• 滚屏：</p>
<p>• 2（上）、4（左）、6（右）、8（下）</p>
<p>• 右键菜单：按 1 打开右键菜单（不同于黑莓菜单键）</p>
<p>• 输入地址：按 # + 1 直接输入网址</p>
<p>• 书签：按 # + 2 查看书签</p>
<p>• 跳转页面顶部/底部：按 # + 3</p>
<p>• 前进：按 ##（快速按两次 #）</p>
<p>• 查看所有快捷键：按住 * 或 # 2秒，即可显示完整快捷键列表</p>
<p>二、搜索功能</p>
<p>Opera Mini 5 内置了多种搜索引擎，方便不同需求：<br>
• Google搜索：常规网页搜索</p>
<p>• 博客搜索：查找博客内容</p>
<p>• 有道在线字典：输入中英文单词直接翻译，适合英语学习</p>
<p>• 易查图片：图片搜索</p>
<p>优点：<br>
• 无需额外打开翻译软件，直接使用有道字典查询单词</p>
<p>• 减少切换搜索引擎（如百度）的步骤，节省流量</p>
<p>总结</p>
<p>Opera Mini 在黑莓8830上表现优秀，相比UC浏览器更流畅，且快捷键和搜索功能实用，适合日常浏览和学习使用。</p>
]]></content:encoded>
    </item>
    <item>
      <title>做博客比做网站难</title>
      <link>https://www.iliu.org/851.html</link>
      <pubDate>Mon, 23 Aug 2010 04:14:49 +0000</pubDate>
      <guid>https://www.iliu.org/851.html</guid>
      <description>&lt;hr&gt;
&lt;p&gt;tags:
华彩亲子博客从建站到现在也有8个月了吧，发现做博客比做网站要难很多。&lt;br&gt;
首先，搜索引擎收录的慢，到现在百度收录的还大部分都是垃圾的东西，并没有形成有效的流量，Google倒是收录的挺快，而且目前的流量也大部分是从GOOGLE来的，但是毕竟在中国不是主流，做了8个月，IP每天突破不了100，是做这么长时间的网站从来没有遇到过的，以前随便做个网站，一个月内IP达到200多是很正常的，以前自己做的公文网，4个月IP都已经是3000了，和现在比起来真是不能同日而语啊。虽然这个博客不是为了流量而建立的。&lt;br&gt;
第二、关注度不够，可能是和自己的选的主题有关系，毕竟是为自己的女儿做的博客，孩子还是自己的好，所以别人不会怎么关注俺的小贝吧。&lt;br&gt;
第三，可能也是和免费空间有关系吧，无所谓了。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<hr>
<p>tags:
华彩亲子博客从建站到现在也有8个月了吧，发现做博客比做网站要难很多。<br>
首先，搜索引擎收录的慢，到现在百度收录的还大部分都是垃圾的东西，并没有形成有效的流量，Google倒是收录的挺快，而且目前的流量也大部分是从GOOGLE来的，但是毕竟在中国不是主流，做了8个月，IP每天突破不了100，是做这么长时间的网站从来没有遇到过的，以前随便做个网站，一个月内IP达到200多是很正常的，以前自己做的公文网，4个月IP都已经是3000了，和现在比起来真是不能同日而语啊。虽然这个博客不是为了流量而建立的。<br>
第二、关注度不够，可能是和自己的选的主题有关系，毕竟是为自己的女儿做的博客，孩子还是自己的好，所以别人不会怎么关注俺的小贝吧。<br>
第三，可能也是和免费空间有关系吧，无所谓了。</p>
]]></content:encoded>
    </item>
    <item>
      <title>网站又搬家了—这次选的衡天小张的服务器</title>
      <link>https://www.iliu.org/845.html</link>
      <pubDate>Sun, 22 Aug 2010 09:50:38 +0000</pubDate>
      <guid>https://www.iliu.org/845.html</guid>
      <description>&lt;p&gt;tags:
上次把博客放到了PIPNI的空间上，可惜的是速度较慢，而godaddy的windows空间使用起来又不太理想，刚好逛论坛的时候看到了衡天小张的信息，GOOGLE了一下，信誉各方面也不错，直接就去付款买了一个，价格很便宜。不过使用的结果可是一波三折！&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>tags:
上次把博客放到了PIPNI的空间上，可惜的是速度较慢，而godaddy的windows空间使用起来又不太理想，刚好逛论坛的时候看到了衡天小张的信息，GOOGLE了一下，信誉各方面也不错，直接就去付款买了一个，价格很便宜。不过使用的结果可是一波三折！</p>
<p>刚开始给分配的机房是“EGI机房“宋”服务器”，PINGl了一下，我的天那，500多，觉得小张的空间也不过如此，只不过是炒作的厉害罢了。联系小张和蓝冰，两个人都不在线。ftp传的那个慢啊，觉得真的是不值。<br>
下午的时候联系到了蓝冰，这姑娘不错，很热心。比一般的IDC的客服要强的不是半点，给调了一个机房，ping值210左右，而且还是和这个姑娘的博客同一个服务器。目前正在试用中，详细的报告等过几天在说！</p>
]]></content:encoded>
    </item>
    <item>
      <title>换到pipni的空间了</title>
      <link>https://www.iliu.org/804.html</link>
      <pubDate>Mon, 09 Aug 2010 09:02:49 +0000</pubDate>
      <guid>https://www.iliu.org/804.html</guid>
      <description>&lt;hr&gt;
&lt;p&gt;以前用的godaddy的空间，是申请域名的时候送的，不过可惜的是Linux空间有个很大很大的广告，广告业不怕，但是却影响到页面的显示，显而易见的是，godaddy的本意就是不是让你好好用他这个空间，否则谁还用收费的空间啊。windows空间对WordPress的支持又很一般，重要的是PING虽然是200多点，但访问起来却不是很快。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<hr>
<p>以前用的godaddy的空间，是申请域名的时候送的，不过可惜的是Linux空间有个很大很大的广告，广告业不怕，但是却影响到页面的显示，显而易见的是，godaddy的本意就是不是让你好好用他这个空间，否则谁还用收费的空间啊。windows空间对WordPress的支持又很一般，重要的是PING虽然是200多点，但访问起来却不是很快。</p>
<p>以前用过pipni的空间，除了稍慢一点的其他没有什么毛病，晚上花费了2个多小时的时间，把博客给搬到这个空间了，后来看下这个空间竟然也支持在线解压缩。白白浪费了2个小时的时间。<br>
现在看来速度还不错，另外也换两个皮肤，就用官方默认的吧，听好看的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>杯具，原来上传的图片等都没有能转过来</title>
      <link>https://www.iliu.org/515.html</link>
      <pubDate>Sun, 31 Jan 2010 08:01:10 +0000</pubDate>
      <guid>https://www.iliu.org/515.html</guid>
      <description>&lt;p&gt;杯具啊，1月29日的时候发现ip被和谐了，于是毫不犹豫的转系统。可能godaddy方面出现了问题，文件没有能转过来。神那！&lt;/p&gt;
&lt;p&gt;洗具的是，数据库内容还在，顺便bs下百度，也就1天不能访问，就给我拔毛了。郁闷死！&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>杯具啊，1月29日的时候发现ip被和谐了，于是毫不犹豫的转系统。可能godaddy方面出现了问题，文件没有能转过来。神那！</p>
<p>洗具的是，数据库内容还在，顺便bs下百度，也就1天不能访问，就给我拔毛了。郁闷死！</p>
]]></content:encoded>
    </item>
    <item>
      <title>换了个模板</title>
      <link>https://www.iliu.org/510.html</link>
      <pubDate>Wed, 27 Jan 2010 13:12:24 +0000</pubDate>
      <guid>https://www.iliu.org/510.html</guid>
      <description>&lt;p&gt;上午把工作整完了以后照例去到网上寻觅，一直想要找到一个自己比较满意的模板，原来用的那个也是比较喜欢的，而且非常的清爽，但毕竟与我博客的主题不太相符。先前一直寻找baby的主题，但是一直都没有找到，今天偶尔想到是不是可以找找家庭方面的主题，别说，还真的找到了，就是目前我所用的这个。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>上午把工作整完了以后照例去到网上寻觅，一直想要找到一个自己比较满意的模板，原来用的那个也是比较喜欢的，而且非常的清爽，但毕竟与我博客的主题不太相符。先前一直寻找baby的主题，但是一直都没有找到，今天偶尔想到是不是可以找找家庭方面的主题，别说，还真的找到了，就是目前我所用的这个。</p>
<p>修改几个关键的地方，替换了原来的title，以及关键字及描述。模板里面有没有涉及，可能是觉得对seo没有什么帮助吧，其实还是有帮助的，有总聊胜与无。另外这个主题还是要慢慢的打造的，需要把图片换成自己的，可能不太容易换，谁让咱ps水平一般呢。</p>
<p>目前打算的修改方案是，第一增加广告位，但不会太多。毕竟用的这个空间已经有了一个大大的广告，采取的方案依然还是放在tag显示的地方，正文部分就把广告取消吧。侧边栏考虑增加一个广告。并加上产权的代码。第二，就是头部的图片了，换成自己的。第三，尾部的图片考虑换成喜洋洋或灰太狼的图片。第四，还没有想好！</p>
]]></content:encoded>
    </item>
    <item>
      <title>小测三款博客离线编辑软件</title>
      <link>https://www.iliu.org/500.html</link>
      <pubDate>Sun, 24 Jan 2010 13:50:01 +0000</pubDate>
      <guid>https://www.iliu.org/500.html</guid>
      <description>&lt;hr&gt;
&lt;p&gt;tags:
现在window下主要的离线博客主要有windows live write，zoundry raven以及国内一家公司开发的菊子曰。下面本人就对这三个软件做个点评。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<hr>
<p>tags:
现在window下主要的离线博客主要有windows live write，zoundry raven以及国内一家公司开发的菊子曰。下面本人就对这三个软件做个点评。</p>
<p>之所以这么关系离线博客编辑软件是因为本人所用的空间是godaddy的免费空间，上面的那个大大的广告条让博客的后台有些功能无法使用，正好可以用这类离线编辑的软件来替代。首先让我们来说说windows live writer，因为我本机用的window 2003，而这个软件不支持在服务器系统上的安装，所以兼容性就比其他两个软件要差。另外live writer要安装.net所以安装下来要占用100多M的空间，虽然现在的空间动辄成T，但live writer的冗肿是无容置疑的，live writer支持分类、标签、离线模板，支持上传图片、并可以给图片加上特效和水印。加水印是window live writer的一个独特的地方，其他两个没有这样的功能。</p>
<p>n 这个软件的界面如下：</p>
<p>下面是文章的编辑窗口</p>
<p>很简介的界面，但是功能一点也不比其他两个软件差，支持分类、图片编辑、标签，并能把标签发送到著名的一些标签网站。是我所用到的感觉最好的一款编辑器，占用资源也小。功能强大，值得使用。</p>
<p>菊子曰，是国内新开发的一个离线博客编辑软件。功能很全面，但是感觉很多的都是在模仿zoundry ，并且资源占用不小。可能是测试版有关系吧。比其他两个多了个评论的功能。其他没有什么亮点，与它的资源占用相比，性价比不高。另外要用这个软件必须要注册菊子曰的用户，否则是不能登录的，最重要的是有个广告条，尽管目前是公益的广告，难免以后会是怎么样，自从金山加广告后，对国内的软件基本上失去了信心，最反对的就是谁在我的软件上加上广告，同样上图：</p>
<p>文章编辑界面，这篇文章就是用菊子曰写的：</p>
]]></content:encoded>
    </item>
    <item>
      <title>开发出godaddy免费空间的另外一个用途</title>
      <link>https://www.iliu.org/485.html</link>
      <pubDate>Sat, 23 Jan 2010 07:04:06 +0000</pubDate>
      <guid>https://www.iliu.org/485.html</guid>
      <description>&lt;p&gt;tags:
godaddy免费空间确实太大了，用这也比较爽，虽然有个很大的广告，但是看在免费的份上也就别较真了。这么稳定又快速的空间，就将就用吧。有很多同学说了，这么大的空间，只装一个博客有点浪费了，那么下面我就给大家说说这个空间可以装的另外的程序。达到全面利用这个大空间的目的。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>tags:
godaddy免费空间确实太大了，用这也比较爽，虽然有个很大的广告，但是看在免费的份上也就别较真了。这么稳定又快速的空间，就将就用吧。有很多同学说了，这么大的空间，只装一个博客有点浪费了，那么下面我就给大家说说这个空间可以装的另外的程序。达到全面利用这个大空间的目的。</p>
<p>国内开发的程序就部要考虑了，有人反映phpwind无法安装，所以我也就不费那份心了，如果装discuz，不戴uc的版本可以 装上，但是不能登录，不能注册。都是打不开了，所以我刚说了国内的程序就别考虑了，另外dedecms等没有实验，有兴趣的可以试试。想起了另外一个论坛程序phpbb，装上后，很完美。不管是后台还是前台一样的完美！想装论坛的可以考虑！但是千万不要开通启用GZip压缩功能，否则你会很后悔的。写到这里觉得安装phpwind不显示的原因很可能就是开通了这个功能。</p>
]]></content:encoded>
    </item>
    <item>
      <title>体验了下失而复得</title>
      <link>https://www.iliu.org/477.html</link>
      <pubDate>Wed, 20 Jan 2010 12:17:03 +0000</pubDate>
      <guid>https://www.iliu.org/477.html</guid>
      <description>&lt;p&gt;昨天下午4点多的时候，忽然发现网站打不开了，显示404错误，发现ftp也不能用，进到godaddy的后台，文件管理也进不去了，不过数据库没有影响。给godaddy的客服发了封邮件，给他们说网站不能访问的问题，然后就是等待。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>昨天下午4点多的时候，忽然发现网站打不开了，显示404错误，发现ftp也不能用，进到godaddy的后台，文件管理也进不去了，不过数据库没有影响。给godaddy的客服发了封邮件，给他们说网站不能访问的问题，然后就是等待。</p>
<p>下班回到家后，发现问题还是没有能解决，但是ping都是可以的，从网上搜这个ip发现有这个网址的ip，而且人家的网站也是能访问的，说明问题不具有普遍性。所以自己就开始想办法，把linux的主机换成windows的，然后等能访问了再给换回来。点了确定之后就有些后悔，毕竟是不能访问，说不定就转不过来，但是已经转了，也就不多想了，然后把数据库备份了一下。关机睡觉。</p>
<p>第二天，果然不出所料，空间已经换成了windows的，但是数据没有能转过去，数据库还在，上传网站程序，然后转Linux，出乎意料的是原来的文件什么的都又回来了，非常高兴，看来godaddy还是可以信赖的。</p>
<p>另外，发的邮件回复的比较慢，下午5点发的邮件，一直到半夜1：30收到第一封的邮件：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Due to its complex nature, your issue has been relayed to our Advanced Technical Support TeamThank you for contacting Hosting Support and bringing this to our attention. 意思是他们解决不了，要转到高级技术支持，然后在上午8点终于收到了第二封高级技术支持的邮件：The issue regarding account status for lghcx.info has been addressed and should be resolved at this time. If you continue to experience delivery or access problems please let us know and we would be happy to assist you further. We appreciate your patience and understanding in this matter.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Please contact us if you have any further issues.. Our most skilled technicians will be working to resolve your issue quickly and completely. You will be notified promptly upon resolution.
</span></span></code></pre></td></tr></table>
</div>
</div><p>除了回复不及时以外，godaddy的空间还是值得信赖的</p>
]]></content:encoded>
    </item>
    <item>
      <title>解决godaddy免费空间广告带来影响的方法</title>
      <link>https://www.iliu.org/476.html</link>
      <pubDate>Tue, 19 Jan 2010 01:39:32 +0000</pubDate>
      <guid>https://www.iliu.org/476.html</guid>
      <description>&lt;p&gt;众所周知，Godaddy 免费空间带有一个很大的广告条。有广告本身也就罢了，但不厚道的是，这些广告通过增加的代码，使得很多源代码发生错误。这是因为广告代码中包含了一连串的闭合标签，会人为地关闭你的程序，从而导致出错。经过一个月的摸索，我把经验整理如下，方便使用该空间的人参考。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>众所周知，Godaddy 免费空间带有一个很大的广告条。有广告本身也就罢了，但不厚道的是，这些广告通过增加的代码，使得很多源代码发生错误。这是因为广告代码中包含了一连串的闭合标签，会人为地关闭你的程序，从而导致出错。经过一个月的摸索，我把经验整理如下，方便使用该空间的人参考。</p>
<p>我在上一篇文章<a href="http://www.lghcx.info/2010/01/388.html">完美解决 Godaddy 免费空间广告条对 WordPress 后台的影响</a>也提到过一些方法，现在补充其他方案。</p>
<hr>
<h3 id="方案一切换到-windows-主机"><strong>方案一：切换到 Windows 主机</strong></h3>
<ul>
<li>
<p>选择 IIS7 + PHP5，安装 WordPress 后不会显示任何广告。网友反馈，安装 Z-Blog 也没有问题。动态网页不会显示广告，但 HTML 静态网页可能会显示。</p>
</li>
<li>
<p>Windows 主机支持伪静态化，可通过 <code>web.config</code> 实现。</p>
</li>
<li>
<p>缺点：</p>
<ol>
<li>对中文 tag 支持不好。</li>
<li>安全性未知，不确定是否会因没有广告而被封账户。</li>
</ol>
</li>
<li>
<p>有网友向 Godaddy 客服询问，但没有明确结果。有网友表示使用 4 个月仍然正常，因此如果选择此方案，建议<strong>定期备份数据</strong>。</p>
</li>
</ul>
<hr>
<h3 id="方案二使用-linux-主机"><strong>方案二：使用 Linux 主机</strong></h3>
<ul>
<li>
<p>安装 WordPress 2.9.1，后台功能基本完整：</p>
<ul>
<li>可添加 tag</li>
<li>可发文章</li>
<li>可上传图片（需在媒体库中获取图片地址后插入）</li>
<li>可回复评论</li>
</ul>
</li>
<li>
<p>优点：WordPress 2.9.1 后台完整，可用性较好</p>
</li>
<li>
<p>缺点：</p>
<ol>
<li>会显示广告</li>
<li>Feed 输出有问题</li>
</ol>
</li>
</ul>
<blockquote>
<p>广告可通过 CSS 隐藏，但建议不要违约。Feed 问题目前还没有好的解决方案。</p></blockquote>
<hr>
<h3 id="方案三使用离线发布工具"><strong>方案三：使用离线发布工具</strong></h3>
<ul>
<li>无论是 Windows 主机还是 Linux 主机，都可用离线发布的形式来发布文章。</li>
<li>推荐工具：Windows Live Writer，也支持给图片加水印，操作方便。</li>
</ul>
<hr>
<p>这三种方案可以根据你对<strong>广告显示、中文 tag 支持和安全性</strong>的需求来选择。</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>小测QQ刚推出的webqq mini</title>
      <link>https://www.iliu.org/422.html</link>
      <pubDate>Mon, 11 Jan 2010 08:46:00 +0000</pubDate>
      <guid>https://www.iliu.org/422.html</guid>
      <description>&lt;p&gt;tags:
昨天登录webqq的时候发现，功能又出新的了，推出了简易版的webqq mini，目前还在内测时时候，要求申请，并经过24小时的审核后，就可使用。今天打开邮箱发现已经通过审核了，马上体验了一下，把结果给大家说说。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>tags:
昨天登录webqq的时候发现，功能又出新的了，推出了简易版的webqq mini，目前还在内测时时候，要求申请，并经过24小时的审核后，就可使用。今天打开邮箱发现已经通过审核了，马上体验了一下，把结果给大家说说。</p>
<p>首先打开w.qq.com，出现如下界面：</p>
<p>如果没有开通，可以先点链接进行申请，审核后即可使用，下图是登录后的界面：</p>
<p>按钮分别是从左到右讨论信息、好友信息、群信息、设置，界面非常的简洁，但是不知道是我网速的问题，还是别的原因，打开的速度非常的慢，打开后点那几个按钮，反映的时间也很长，大概还不成熟吧，和webqq还是不能同日而语，不过简洁的界面还是挺令人期待的。不喜欢广告的可以关注这个东东。</p>
]]></content:encoded>
    </item>
    <item>
      <title>wordpress中文tag、中文分类找不到文章的解决方法</title>
      <link>https://www.iliu.org/407.html</link>
      <pubDate>Sat, 09 Jan 2010 02:19:28 +0000</pubDate>
      <guid>https://www.iliu.org/407.html</guid>
      <description>&lt;p&gt;原来用的是 Linux 主机，在设定固定链接后，中文 tag、中文分类都能正常访问。
但自从换到 GoDaddy 的 Windows 主机后，由于 IIS7 对 PHP 支持不太好，中文 tag 和中文分类的文章就会出现找不到的情况。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>原来用的是 Linux 主机，在设定固定链接后，中文 tag、中文分类都能正常访问。
但自从换到 GoDaddy 的 Windows 主机后，由于 IIS7 对 PHP 支持不太好，中文 tag 和中文分类的文章就会出现找不到的情况。</p>
<p>比如：</p>
<ul>
<li><strong>正常情况（能访问）</strong>：<code>www.example.com/?tag=中文</code></li>
<li><strong>不正常情况（不能访问）</strong>：<code>www.example.com/tag/中文</code></li>
</ul>
<p>这是系统的兼容问题，没办法直接解决。
但为了 SEO，我们又必须启用固定链接，怎么办呢？
折腾了一个上午，总算找到了解决方案，而且支持目前的 <strong>WordPress 2.9.1</strong> 版本。</p>
<hr>
<p>网上有几种解决办法：</p>
<p><strong>第一种方法</strong>：修改 <code>wp-includes/classes.php</code> 文件。
这个方法在中文系统下可能有效，但我在 GoDaddy 主机上试的时候，直接报错，所以局限性比较大。</p>
<hr>
<p><strong>第二种方法</strong>：修改 <code>wp-includes/rewrite.php</code> 文件。</p>
<p>找到以下代码：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">get_tag_permastruct</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">isset</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">tag_structure</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">tag_structure</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">permalink_structure</span><span class="p">))</span> <span class="p">{</span> <span class="c1">//——这行需要修改——
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">tag_structure</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>把第五行改成：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">permalink_structure</span><span class="p">))</span> <span class="p">{</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<p><strong>第三种方法（推荐）</strong>：
一个一劳永逸、不用改源代码的方法。</p>
<p>进入 WordPress 后台 → “设置” → “固定链接”，
在“标签前缀”一栏中填入：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">?tag=
</span></span></code></pre></td></tr></table>
</div>
</div><p>这样，当你点击文章中的中文 tag 时，系统会自动跳转到：
<code>www.example.com/?tag=中文</code>
页面就能正常显示了。</p>
<hr>
<p>经过验证，<strong>第二种和第三种方法</strong>都能完美解决这个问题。</p>
]]></content:encoded>
    </item>
    <item>
      <title>提供WordPress 主题 Marcelle的汉化版本</title>
      <link>https://www.iliu.org/304.html</link>
      <pubDate>Sat, 26 Dec 2009 08:05:16 +0000</pubDate>
      <guid>https://www.iliu.org/304.html</guid>
      <description>&lt;p&gt;昨天发掘出 Marcelle这个主题，很快为他的那种简约而清爽的界面而吸引，打算使用这个主题，简单的汉化以后，觉得还不错，不过今天就又发现了个更适合的，也就是目前所用的这个主题，所以就把昨天汉化的这个给分享出来吧，有喜欢的可以下载用用。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>昨天发掘出 Marcelle这个主题，很快为他的那种简约而清爽的界面而吸引，打算使用这个主题，简单的汉化以后，觉得还不错，不过今天就又发现了个更适合的，也就是目前所用的这个主题，所以就把昨天汉化的这个给分享出来吧，有喜欢的可以下载用用。</p>
<p>这款名叫Marcelle的Wordpress 主题整体配色采用了柔和的城砖青，简单又不失大气，稳重而宁静。</p>
<p>版本要求：Wordpress 2.7+</p>
<p>主题特点：</p>
<p>1、支持 Gallery（自适应尺寸）；</p>
<p>2、兼容Opera、 Netscape、Safari、Firefox以及 IE6+等主流浏览器，通过XHTML测试；</p>
<p>3、支持嵌套回复，支持Gravatar；</p>
<p>4、页眉预留广告位，支持Google ADsense ；</p>
<p>5、SEO优选；</p>
<p>汉化修改后，在seo方面做了加强，并且在内容页增加了两个广告位，支持Google ADsense和阿里妈妈。</p>
<p>下载后需要把我原来的广告给替换。</p>
]]></content:encoded>
    </item>
    <item>
      <title>博客整体细节基本完成</title>
      <link>https://www.iliu.org/257.html</link>
      <pubDate>Wed, 23 Dec 2009 08:51:55 +0000</pubDate>
      <guid>https://www.iliu.org/257.html</guid>
      <description>&lt;p&gt;tags:
上午的时候在那边的办公室忙，而那边的网速慢的要死，连个新浪都打不开，所以基本上上午都白白浪费了，郁闷的是QQ农场的菜也被偷了很多，说到这里不得不说几句，原本对QQ弄成的圣诞树报有很大的希望，想不到种出来的是一堆垃圾，就是不知道这堆垃圾在圣诞节的那天是不是能变成金子。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>tags:
上午的时候在那边的办公室忙，而那边的网速慢的要死，连个新浪都打不开，所以基本上上午都白白浪费了，郁闷的是QQ农场的菜也被偷了很多，说到这里不得不说几句，原本对QQ弄成的圣诞树报有很大的希望，想不到种出来的是一堆垃圾，就是不知道这堆垃圾在圣诞节的那天是不是能变成金子。</p>
<p>下午回到这边，基本上都在整理这个博客，用的这个模板原来好好的，不过自从空间商升级了空间后就出现了很多的乱码，知道乱码是用于编码不对造成的，但是总是解决不了，就算是你保存成了utf-8的编码依然是出错，后来发现，从我家里的电脑上传的几个文件编码竟然没有错误，细想了一下原因，很简单了，家里的文本默认是用Notepad++编辑的，而在办公室由于没有重视用了Windows xp自带的记事本，看来微软就喜欢搞与众不同，就算保存成utf8的格式，依然还是不同的，既然找到了源头就好在解决了，下载Notepad++，编辑。终于正常了。<br>
更改下了原来的模板，主要是1、把banner默认的google的广告去掉了，不想在首页就出来那么多的广告，等以后流量上来后，如果想要再加的话，也不加那个地方，一直认为banner那个地方不适合放点击的广告。2、在首页加上了最新评论，本来想用插件呢，但是可能wordpress是最新的版本，那个插件还不支持，没有用成，只能用代码带实现，顺便说下，wordpress自带的最新评论的功能也不怎么好用。3、在文章的页面加了些广告。就这些吧，原来一直觉得wordpress的模板比较复杂，现在看来也没啥。修修补补还是很好弄的！～～</p>
]]></content:encoded>
    </item>
    <item>
      <title>虚惊一场</title>
      <link>https://www.iliu.org/206.html</link>
      <pubDate>Fri, 18 Dec 2009 02:04:39 +0000</pubDate>
      <guid>https://www.iliu.org/206.html</guid>
      <description>&lt;p&gt;用的是国外的空间，昨天下午下班的时候出现了504错误，还以为是被和谐了呢！下班回到家后，再打开发现已经好了，不过有一点不爽的是，在IE下网站的有些图片无法打开，而在firefox下却正常，不知道是怎么回事，正在郁闷，等下下个Google的浏览器试试.&lt;br&gt;
ps&lt;br&gt;
Google的浏览器浏览也没有问题，这事情是怪了，难道是我rpwt还是发生了灵异事件？再次郁闷一下！看来说ie是垃圾是有根据的！&lt;br&gt;
再次PS&lt;br&gt;
重新安装了一下主题，问题解决了，到现在也没有明白到底是为什么！！！！&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>用的是国外的空间，昨天下午下班的时候出现了504错误，还以为是被和谐了呢！下班回到家后，再打开发现已经好了，不过有一点不爽的是，在IE下网站的有些图片无法打开，而在firefox下却正常，不知道是怎么回事，正在郁闷，等下下个Google的浏览器试试.<br>
ps<br>
Google的浏览器浏览也没有问题，这事情是怪了，难道是我rpwt还是发生了灵异事件？再次郁闷一下！看来说ie是垃圾是有根据的！<br>
再次PS<br>
重新安装了一下主题，问题解决了，到现在也没有明白到底是为什么！！！！</p>
]]></content:encoded>
    </item>
    <item>
      <title>如何增加WordPress上传文件类型</title>
      <link>https://www.iliu.org/196.html</link>
      <pubDate>Thu, 17 Dec 2009 02:20:09 +0000</pubDate>
      <guid>https://www.iliu.org/196.html</guid>
      <description>&lt;p&gt;WordPress默认的上传文件类型只有图片、视频、音频、其他媒体。但是如果我们想分享一些其他的文件比如文档等怎么办呢？其实Wordpress其充满魅力的所在就在于开源，开源的好处是随时可以增加你想要的东西。下面就以增加一个.rar类型为例来说明如何增加Wordpress上传文件类型！&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>WordPress默认的上传文件类型只有图片、视频、音频、其他媒体。但是如果我们想分享一些其他的文件比如文档等怎么办呢？其实Wordpress其充满魅力的所在就在于开源，开源的好处是随时可以增加你想要的东西。下面就以增加一个.rar类型为例来说明如何增加Wordpress上传文件类型！</p>
<p>修改 wp-includes/functions.php</p>
<p>查找：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">wp\_check\_filetype</span><span class="p">(</span><span class="nv">$filename</span><span class="p">,</span> <span class="nv">$mimes</span> <span class="o">=</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>在底下的$mimes里加入要添加的文件类型，例如 rar ：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">‘rar’</span> <span class="o">=&gt;</span> <span class="nx">‘application</span><span class="o">/</span><span class="nx">rar’</span><span class="p">,</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>保存，重新上传服务器，一切就OK了，很简单吧！</p>
]]></content:encoded>
    </item>
    <item>
      <title>ubuntu9.10 sis显卡驱动程序</title>
      <link>https://www.iliu.org/158.html</link>
      <pubDate>Fri, 11 Dec 2009 06:48:00 +0000</pubDate>
      <guid>https://www.iliu.org/158.html</guid>
      <description>&lt;p&gt;今天从上午把ubuntu9.10装上后就一直为系统的分辨率的问题而寻找，真的让人很郁闷的是SIS的显卡，UBUNTU竟然不支持，其实这也不能怨UBUNTU，只能说SIS的人都是一帮SB，为什么不开发支持linux的驱动程序呢，没办法，到网上寻找，总算找到了解决的方案，我就纳闷了，为什么官方就不更新下这驱动呢。&lt;br&gt;
其实，解决的方法也很简单，热心的linux爱好者已经开发出来了相关的驱动程序。而且是deb包的形式，直接双击安装就可以了，真是不明白不管新立得还是ubuntu的官方的源里面都没有这样的程序！&lt;br&gt;
驱动程序我已经放在我的网盘里了，有需要的朋友可以点击下面的地址下载下载&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>今天从上午把ubuntu9.10装上后就一直为系统的分辨率的问题而寻找，真的让人很郁闷的是SIS的显卡，UBUNTU竟然不支持，其实这也不能怨UBUNTU，只能说SIS的人都是一帮SB，为什么不开发支持linux的驱动程序呢，没办法，到网上寻找，总算找到了解决的方案，我就纳闷了，为什么官方就不更新下这驱动呢。<br>
其实，解决的方法也很简单，热心的linux爱好者已经开发出来了相关的驱动程序。而且是deb包的形式，直接双击安装就可以了，真是不明白不管新立得还是ubuntu的官方的源里面都没有这样的程序！<br>
驱动程序我已经放在我的网盘里了，有需要的朋友可以点击下面的地址下载下载</p>
]]></content:encoded>
    </item>
    <item>
      <title>聪明的宝宝</title>
      <link>https://www.iliu.org/349.html</link>
      <pubDate>Wed, 25 Feb 2009 13:37:00 +0000</pubDate>
      <guid>https://www.iliu.org/349.html</guid>
      <description>&lt;p&gt;宝宝是聪明的，尽管才6个月，晚上睡觉的时候她如果不老实，在老婆肚子里打拳，这时候如果我把手放在老婆的肚子上，她马上就会先停下来，然后会轻踹一下我的手，我如果用手指轻轻敲打老婆的肚子的话，她还会用踢来回应，真是聪明的宝宝啊&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>宝宝是聪明的，尽管才6个月，晚上睡觉的时候她如果不老实，在老婆肚子里打拳，这时候如果我把手放在老婆的肚子上，她马上就会先停下来，然后会轻踹一下我的手，我如果用手指轻轻敲打老婆的肚子的话，她还会用踢来回应，真是聪明的宝宝啊</p>
]]></content:encoded>
    </item>
    <item>
      <title>lnkillprocess.exe – DLL 初始化失败终极解决方案</title>
      <link>https://www.iliu.org/325.html</link>
      <pubDate>Wed, 28 Jan 2009 07:03:00 +0000</pubDate>
      <guid>https://www.iliu.org/325.html</guid>
      <description>&lt;p&gt;在昨天的帖子里我说到，把禁止的com打开以后，就不会再出现这个弹窗，不想再今天就给了我当头一棒子，这个讨厌的弹窗再次出现了，看了一下系统日志是这样描述的“弹出应用程序: lnkillprocess.exe – DLL 初始化失败: 因为窗口站已关闭，应用程序初始化失败。 ”然后我一遍一遍的测试我的电脑上的开机程序，目前发现和郑州广电的那个上网客户端有关，只要在关闭电脑以前把这个客户端先行关闭，问题就解决了，貌似这个玩意有冲突？&lt;br&gt;
不解中v。。。。。。。。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>在昨天的帖子里我说到，把禁止的com打开以后，就不会再出现这个弹窗，不想再今天就给了我当头一棒子，这个讨厌的弹窗再次出现了，看了一下系统日志是这样描述的“弹出应用程序: lnkillprocess.exe – DLL 初始化失败: 因为窗口站已关闭，应用程序初始化失败。 ”然后我一遍一遍的测试我的电脑上的开机程序，目前发现和郑州广电的那个上网客户端有关，只要在关闭电脑以前把这个客户端先行关闭，问题就解决了，貌似这个玩意有冲突？<br>
不解中v。。。。。。。。</p>
]]></content:encoded>
    </item>
    <item>
      <title>lnkillprocess.exe-dll初始化失败的原因终于找到了</title>
      <link>https://www.iliu.org/324.html</link>
      <pubDate>Tue, 27 Jan 2009 01:36:00 +0000</pubDate>
      <guid>https://www.iliu.org/324.html</guid>
      <description>&lt;p&gt;这几天电脑一关机，总是出现一个红叉叉，显示lnkillprocess.exe-dll初始化失败。虽然并不影响使用，但是感觉就像是吃了一只苍蝇一样的不开心。&lt;br&gt;
原本以为是趋势科技的无忧电子眼搞得鬼，然而卸载电子眼，清理注册表，不管用何种方法都无法把这个烦人的东西整掉，郁闷之下重新装了系统，哈哈，终于清静了;…&lt;br&gt;
且慢，真的清静了吗？打补丁，关机，嗯~~~~~~~~,怎么又出来了，郁闷。然后我去看系统的日志，发现是一个叫COM的东西异常，因为是用360打的补丁，所以就怀疑是这个东西搞得鬼，仔细查看了一下，果真，360禁止了com的运行，我晕，你禁止了也不给我说一声！气大了，删无赦。。。。&lt;br&gt;
现在，真的是清静了。。。。。。。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>这几天电脑一关机，总是出现一个红叉叉，显示lnkillprocess.exe-dll初始化失败。虽然并不影响使用，但是感觉就像是吃了一只苍蝇一样的不开心。<br>
原本以为是趋势科技的无忧电子眼搞得鬼，然而卸载电子眼，清理注册表，不管用何种方法都无法把这个烦人的东西整掉，郁闷之下重新装了系统，哈哈，终于清静了;…<br>
且慢，真的清静了吗？打补丁，关机，嗯~~~~~~~~,怎么又出来了，郁闷。然后我去看系统的日志，发现是一个叫COM的东西异常，因为是用360打的补丁，所以就怀疑是这个东西搞得鬼，仔细查看了一下，果真，360禁止了com的运行，我晕，你禁止了也不给我说一声！气大了，删无赦。。。。<br>
现在，真的是清静了。。。。。。。</p>
]]></content:encoded>
    </item>
    <item>
      <title>如何安全使用计算机4</title>
      <link>https://www.iliu.org/320.html</link>
      <pubDate>Sun, 25 Jan 2009 04:57:00 +0000</pubDate>
      <guid>https://www.iliu.org/320.html</guid>
      <description>&lt;p&gt;《 安全使用计算机 》 是我们免费提供的计算机安全技术资料,希望您能得到一些启发和帮助，保障自己计算机的安全。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;九、用错密码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这也是使得我们暴露在入侵者面前的又一个常见错误：用错密码。即使您的网络环境中没有管理员强迫您选择强大的密码并定期更换，您也应该这样做。不要选用容易被猜中的密 码，如您的生日，爱人的名字，社会保险号码等。密码越长越不容易被破解，因此您的密码至少为8位，14位就更好。常用的密码破解方法采用字典破解法，因此不要使用字典 中能查到的单词做为密码。为安全起见，密码应该由字母、数字以及符号组合而成。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>《 安全使用计算机 》 是我们免费提供的计算机安全技术资料,希望您能得到一些启发和帮助，保障自己计算机的安全。</p>
<p><strong>九、用错密码</strong></p>
<p>这也是使得我们暴露在入侵者面前的又一个常见错误：用错密码。即使您的网络环境中没有管理员强迫您选择强大的密码并定期更换，您也应该这样做。不要选用容易被猜中的密 码，如您的生日，爱人的名字，社会保险号码等。密码越长越不容易被破解，因此您的密码至少为8位，14位就更好。常用的密码破解方法采用字典破解法，因此不要使用字典 中能查到的单词做为密码。为安全起见，密码应该由字母、数字以及符号组合而成。</p>
<p>很长的无意义的字符串密码很难被破解，但是如果你因为记不住密码而不得不将密码写下来的话，就违背了设置密码的初衷，因为入侵者可能会找到密码。可以造一个容易记住的 短语，并使用每个单词的第一个字母，以及数字和符号生成一个密码。例如，使用My cat ate a mouse on the 5th day of June;可以得到密码</p>
]]></content:encoded>
    </item>
    <item>
      <title>如何安全使用计算机 3</title>
      <link>https://www.iliu.org/319.html</link>
      <pubDate>Sun, 25 Jan 2009 01:59:00 +0000</pubDate>
      <guid>https://www.iliu.org/319.html</guid>
      <description>&lt;p&gt;《 安全使用计算机 》 是我们免费提供的计算机安全技术资料,希望您能得到一些启发和帮助，保护自己计算机的安全。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3、避免磁盘总是满满的并且非常凌乱&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;频繁安装和卸载程序（或增加和删除任何类型的数据）都会使磁盘变得零散。信息在磁盘上的保存方式导致了磁盘碎片的产生：在新的空磁盘中保存文件时，文件被保存在连续的 簇上。如果您删除的文件占用了5个簇，然后保存了一个占用8个簇的文件，那么头5个簇的数值会保存在删除产生的5个空簇中，剩余的3个则保存在下三个空的簇中。这样就使得文 件变得零散或者分裂。然后在访问文件时，磁头不会同时找到文件的所有部分，而是到磁盘的不同地址上找回全部文件。这样使得访问速度变慢。如果文件是程序的一部分，程序 的运行速度就会变慢。过于零散的磁盘运行速度极慢就象在爬行一样。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>《 安全使用计算机 》 是我们免费提供的计算机安全技术资料,希望您能得到一些启发和帮助，保护自己计算机的安全。</p>
<p><strong>3、避免磁盘总是满满的并且非常凌乱</strong></p>
<p>频繁安装和卸载程序（或增加和删除任何类型的数据）都会使磁盘变得零散。信息在磁盘上的保存方式导致了磁盘碎片的产生：在新的空磁盘中保存文件时，文件被保存在连续的 簇上。如果您删除的文件占用了5个簇，然后保存了一个占用8个簇的文件，那么头5个簇的数值会保存在删除产生的5个空簇中，剩余的3个则保存在下三个空的簇中。这样就使得文 件变得零散或者分裂。然后在访问文件时，磁头不会同时找到文件的所有部分，而是到磁盘的不同地址上找回全部文件。这样使得访问速度变慢。如果文件是程序的一部分，程序 的运行速度就会变慢。过于零散的磁盘运行速度极慢就象在爬行一样。</p>
<p>Liu,你可以使用Windows里带有的磁盘碎片整理工具（程序 附件 系统工具） 或者第三方磁盘碎片整理工具defrag来重新安排文件的各个部分，以使文件在磁盘上能够连续存放。</p>
<p>另外一个常见的能够导致性能问题和应用行为不当的原因是磁盘过满。许多程序都会生成临时文件，运行时需要磁盘提供额外空间。你可以使用Windows XP的磁盘清理工具或者第三方程序查找和删除很少用到的文件，或者你也可以手动删除文件来释放磁盘空间。</p>
]]></content:encoded>
    </item>
    <item>
      <title>如何安全使用计算机 2</title>
      <link>https://www.iliu.org/318.html</link>
      <pubDate>Sun, 25 Jan 2009 01:57:00 +0000</pubDate>
      <guid>https://www.iliu.org/318.html</guid>
      <description>&lt;p&gt;《 安全使用计算机 》 是我们免费提供的计算机安全技术资料,希望您能得到一些启发和帮助，保护自己计算机的安全。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2：不要安装和卸载大量程序，特别是测试版程序&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>《 安全使用计算机 》 是我们免费提供的计算机安全技术资料,希望您能得到一些启发和帮助，保护自己计算机的安全。</p>
<p><strong>2：不要安装和卸载大量程序，特别是测试版程序</strong></p>
<p>由于用户对最新技术的渴望，经常安装和尝试新软件。免费提供的测试版程序能够使您有机会抢先体验新的功能。另外还有许多可以从网上下载的免费软件和共享软件。我们知道 有些用户还曾经安装盗版软件或者。</p>
<p>您安装的软件数量越多，您使用含有恶意代码的软件，或者使用编写不合理能够导致系统工作不正常或者崩溃的软件的几率就更高。这样的风险远高于使用盗版软件。</p>
<p>即使您只会安装经过授权的最终版本的的商业软件，过多的安装和卸载也会弄乱注册表。不是所有的卸载步骤都能将程序剩余部分清理干净，这样的行为会导致系统逐渐变慢。</p>
<p>您应该只安装您真正需要使用的软件，只使用合法软件，并且尽量减少安装和卸载软件的数量。</p>
<p>您还将收到其他技巧：</p>
<p>.磁盘总是满满的并且非常凌乱</p>
<p>.打开所有的附件</p>
<p>.点击所有链接</p>
<p>.共享或类似共享的行为</p>
<p>.用错密码</p>
<p>.忽视对备份和恢复计划的需要</p>
]]></content:encoded>
    </item>
    <item>
      <title>如何安全使用计算机 1</title>
      <link>https://www.iliu.org/317.html</link>
      <pubDate>Sun, 25 Jan 2009 01:51:00 +0000</pubDate>
      <guid>https://www.iliu.org/317.html</guid>
      <description>&lt;p&gt;《 安全使用计算机 》 是我们免费提供的计算机安全技术资料,希望您能得到一些启发和帮助，保护自己计算机的安全。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不要点击所有链接&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;打开附件不是鼠标所能带给您的唯一麻烦。点击电子邮件或者网页上的超级链接能将您带入植入ActiveX控制或者脚本的网页，利用这些就可能进行各种类型的恶意行为，如清除硬 盘，或者在计算机上安装后门软件，这样黑客就可以潜入并夺取控制权。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>《 安全使用计算机 》 是我们免费提供的计算机安全技术资料,希望您能得到一些启发和帮助，保护自己计算机的安全。</p>
<p><strong>不要点击所有链接</strong></p>
<p>打开附件不是鼠标所能带给您的唯一麻烦。点击电子邮件或者网页上的超级链接能将您带入植入ActiveX控制或者脚本的网页，利用这些就可能进行各种类型的恶意行为，如清除硬 盘，或者在计算机上安装后门软件，这样黑客就可以潜入并夺取控制权。</p>
<p>点错链接也可能会带您进入具有色情图片，盗版音乐或软件等不良内容的网站。如果您使用的是工作电脑可能会因此麻烦缠身，甚至惹上官司。</p>
]]></content:encoded>
    </item>
    <item>
      <title>KPI考评——企业绩效管理的基础</title>
      <link>https://www.iliu.org/311.html</link>
      <pubDate>Wed, 21 Jan 2009 13:37:00 +0000</pubDate>
      <guid>https://www.iliu.org/311.html</guid>
      <description>&lt;p&gt;企业绩效评估经常遇到的一个很实际的问题就是，很难确定客观、量化的绩效指标。其实，对所有的绩效指标进行量化并不现实，也没有必要这么做。通过行为性的指标体系，也同样可以衡量企业绩效。　　企业关键业绩指标(KPI：Key Process Indication)是通过对组织内部流程的输入端、输出端的关键参数进行设置、取样、计算、分析，衡量流程绩效的一种目标式量化管理指标，是把企业的战略目标分解为可操作的工作目标的工具，是企业绩效管理的基础。KPI可以使部门主管明确部门的主要责任，并以此为基础，明确部门人员的业绩衡量指标。建立明确的切实可行的KPI体系，是做好绩效管理的关键。　&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>企业绩效评估经常遇到的一个很实际的问题就是，很难确定客观、量化的绩效指标。其实，对所有的绩效指标进行量化并不现实，也没有必要这么做。通过行为性的指标体系，也同样可以衡量企业绩效。　　企业关键业绩指标(KPI：Key Process Indication)是通过对组织内部流程的输入端、输出端的关键参数进行设置、取样、计算、分析，衡量流程绩效的一种目标式量化管理指标，是把企业的战略目标分解为可操作的工作目标的工具，是企业绩效管理的基础。KPI可以使部门主管明确部门的主要责任，并以此为基础，明确部门人员的业绩衡量指标。建立明确的切实可行的KPI体系，是做好绩效管理的关键。　</p>
<p>　确定关键绩效指标有一个重要的SMART原则。SMART是5个英文单词首字母的缩写：S代表具体(Specific)，指绩效考核要切中特定的工作指标，不能笼统；M代表可度量(Measurable)，指绩效指标是数量化或者行为化的，验证这些绩效指标的数据或者信息是可以获得的；A代表可实现(Attainable)，指绩效指标在付出努力的情况下可以实现，避免设立过高或过低的目标；R代表现实性(Realistic)，指绩效指标是实实在在的，可以证明和观察；T代表有时限(Time bound)，注重完成绩效指标的特定期限。
　　
建立KPI指标的要点在于流程性、计划性和系统性。首先明确企业的战略目标，并在企业会议上利用头脑风暴法和鱼骨分析法找出企业的业务重点，也就是企业价值评估的重点。然后，再用头脑风暴法找出这些关键业务领域的关键业绩指标(KPI)，即企业级KPI。　　</p>
<p>接下来，各部门的主管需要依据企业级KPI建立部门级KPI，并对相应部门的KPI进行分解，确定相关的要素目标，分析绩效驱动因数(技术、组织、人)，确定实现目标的工作流程，分解出各部门级的KPI，以便确定评价指标体系。　　然后，各部门的主管和部门的KPI人员一起再将KPI进一步细分，分解为更细的KPI及各职位的业绩衡量指标。这些业绩衡量指标就是员工考核的要素和依据。这种对KPI体系的建立和测评过程本身，就是统一全体员工朝着企业战略目标努力的过程，也必将对各部门管理者的绩效管理工作起到很大的促进作用。　　</p>
<p>指标体系确立之后，还需要设定评价标准。一般来说，指标指的是从哪些方面衡量或评价工作，解决“评价什么”的问题；而标准指的是在各个指标上分别应该达到什么样的水平，解决“被评价者怎样做，做多少”的问题。　　最后，必须对关键绩效指标进行审核。比如，审核这样的一些问题：多个评价者对同一个绩效指标进行评价，结果是否能取得一致？这些指标的总和是否可以解释被评估者80%以上的工作目标？跟踪和监控这些关键绩效指标是否可以操作？等等。审核主要是为了确保这些关键绩效指标能够全面、客观地反映被评价对象的绩效，而且易于操作。　　</p>
<p>每一个职位都影响某项业务流程的一个过程，或影响过程中的某个点。在订立目标及进行绩效考核时，应考虑职位的任职者是否能控制该指标的结果，如果任职者不能控制，则该项指标就不能作为任职者的业绩衡量指标。比如，跨部门的指标就不能作为基层员工的考核指标，而应作为部门主管或更高层主管的考核指标。　　绩效管理是管理双方就目标及如何实现目标达成共识的过程，以及增强员工成功地达到目标的管理方法。管理者给下属订立工作目标的依据来自部门的KPI，部门的KPI来自上级部门的KPI，上级部门的KPI来自企业级KPI。只有这样，才能保证每个职位都是按照企业要求的方向去努力。　　善用KPI考评企业，将有助于企业组织结构集成化，提高企业的效率，精简不必要的机构、不必要的流程和不必要的系统。</p>
]]></content:encoded>
    </item>
    <item>
      <title>推荐大家使用Symantec Endpoint Protection 11.0.4000_MR4简体中文正式版</title>
      <link>https://www.iliu.org/310.html</link>
      <pubDate>Wed, 21 Jan 2009 13:35:00 +0000</pubDate>
      <guid>https://www.iliu.org/310.html</guid>
      <description>&lt;p&gt;这个可以理解为SCS的升级新一代版本，试用后感觉响应速度和PF占用都有了很大进步，使用symantec SAV或者SCS的朋友可以考虑更新到这个版本了。中文名称：赛门铁克端点防护Symantec Endpoint Protection V11.0.4000 MR4简体中文版 英文名称：Symantec_Endpoint_Protection 11.0.4000 MR4版本：官方最新发布发行时间：2009年1月制作发行：Symantec地区：中国大陆语言：简体中文[安装测试] 在WindowsXP SP2 SP3中文版安装测试通过,VISTA未测试,因我没有该系统[版权声明]资源版权归原作者及其公司所有，如果你喜欢，请购买正版。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>这个可以理解为SCS的升级新一代版本，试用后感觉响应速度和PF占用都有了很大进步，使用symantec SAV或者SCS的朋友可以考虑更新到这个版本了。中文名称：赛门铁克端点防护Symantec Endpoint Protection V11.0.4000 MR4简体中文版 英文名称：Symantec_Endpoint_Protection 11.0.4000 MR4版本：官方最新发布发行时间：2009年1月制作发行：Symantec地区：中国大陆语言：简体中文[安装测试] 在WindowsXP SP2 SP3中文版安装测试通过,VISTA未测试,因我没有该系统[版权声明]资源版权归原作者及其公司所有，如果你喜欢，请购买正版。</p>
<p>简介：Symantec Endpoint Protection将Symantec AntiVirus与高级威胁防御功能相结合，可以为笔记本、台式机和服务器提供无与伦比的恶意软件防护能力。 它在一个代理和管理控制台中无缝集成了基本安全技术，从而不仅提高了防护能力，而且还有助于降低总拥有成本。主要功能* 无缝集成一些基本技术，如防病毒、反间谍软件、防火墙、入侵防御和设备控制。* 只需要一个代理，通过一个管理控制台即可进行管理。* 由端点安全领域的市场领导者提供无可匹敌的端点防护。* 无需对每个端点额外部署软件即可立即进行 NAC 升级。主要优势* 阻截恶意软件，如病毒、蠕虫、特洛伊木马、间谍软件、恶意软件、bot、零日威胁和 rootkit。</p>
<p>* 防止安全违规事件的发生，从而降低管理开销。* 降低保障端点安全的总拥有成本。新功能单个代理和单个控制台为所有 Symantec Endpoint Protection 技术和 Symantec Network Access Control 提供一个代理。 为管理所有 Symantec Endpoint Protection 技术和 Symantec Network Access Control 提供一个集成的界面。 允许对所有技术采用一种通信方法和一个内容交付系统。* 提供了出色的操作效能，如单个软件更新、单个策略更新等。* 提供了统一的集中报告。* 提供了统一的授权许可和维护。* 添加 Symantec Network Access Control 实施功能时不需要对客户端进行更改。* 降低保障端点安全的总拥有成本。* 降低了管理工作量。主动威胁扫描基于行为的防护，可以防御零日威胁和前所未见的威胁。 与其它启发式技术不同，主动威胁扫描可以对未知应用程序的行为好坏进行分类，从而提供了更精确的恶意软件检测。* 无需设置基于规则的配置即可准确检测恶意软件。</p>
<p>* 有助于降低误报数量。高级 Rootkit 检测和删除功能通过集成 VxMS（Veritas 映射服务，Veritas 的一种技术）提供了出色的 rootkit 检测和删除功能，从而可以访问操作系统底层，进行全面分析和修复。* 检测并删除最难以处理的 rootkit。* 无需对受感染的计算机重新制作映像，因此节省了时间和金钱，同时防止工作效率下降。应用程序控制允许管理员控制用户和其它应用程序访问特定进程、文件和文件夹。 它提供了应用程序分析、进程控制、文集和注册表访问控制，以及模块和 DLL 控制。 它使管理员能够限制某些被视为可疑或高风险类型的活动。</p>
<p>* 防止恶意软件传播或破坏端点。* 锁定端点，防止数据泄漏。设备控制控制可以连接到计算机的外设以及这些外设的使用方式。 它可以锁定一个端点，阻止其与拇指驱动器、CD 刻录机、打印机和其它 USB 设备相连。* 防止敏感的机密信息从端点被提取或窃取（数据泄漏）。</p>
<ul>
<li>防止端点被通过外设传播的病毒感染。</li>
</ul>
<p>系统要求Symantec Endpoint Protection 客户端（32 位）最低要求</p>
<p>官方网站，请大家放心下载！ 最近有网友反映无法正常下载所提供的CD镜像链接，经检查是因为 Symantec 官方进行了限制，请各位网友用迅雷或快车下载，如果还是无法下载请大家，多尝试几次！</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
