<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>技术 on 映屿</title>
    <link>https://blog.verdant.ee/categories/%E6%8A%80%E6%9C%AF/</link>
    <description>Recent content in 技术 on 映屿</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    
      <managingEditor>i@glowisle.me (五葉地錦)</managingEditor>
    
    
      <webMaster>i@glowisle.me (五葉地錦)</webMaster>
    
    
    
    <lastBuildDate>Sat, 28 Mar 2026 13:30:05 +0800</lastBuildDate>
    
    
    <atom:link href="http://blog.verdant.ee/categories/%E6%8A%80%E6%9C%AF/atom.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>我如何使用我的电子设备</title>
      <link>https://blog.verdant.ee/posts/how-i-do-my-computing/</link>
      <pubDate>Sat, 28 Mar 2026 13:30:05 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/how-i-do-my-computing/</guid>
      <description>&lt;p&gt;机不在贵，能用就行。屏不在大，能亮则赢。斯是老垃圾，唯吾自由馨。键盘上磨损，A 面俩划痕。谈笑有邮件，往来无 QQ。可以调程序，阅文档。无社交媒体之乱耳，无微信之劳形。南阳诸葛庐，西洋 Stallman ThinkPad X200，孔子云：「何陋之有？」&lt;/p&gt;&#xA;&lt;h2 id=&#34;设备&#34;&gt;设备&lt;/h2&gt;&#xA;&lt;p&gt;在 &lt;a href=&#34;https://blog.verdant.ee/uses/&#34;&gt;Uses&lt;/a&gt; 页面查看我的硬件和软件。&lt;/p&gt;&#xA;&lt;p&gt;我在上个月购买了一台 ThinkPad X220（￥260），经过简单的配置后，已经投入日常使用。&lt;/p&gt;&#xA;&lt;p&gt;我非常在意我的电脑上到底运行了什么程序，它们都在做什么，因此我不会选择在这台笔记本上安装 Windows 这种商业操作系统。我安装了 Arch Linux，以便于从最小化系统开始，按需配置，防止冗余占用性能。窗口管理器选择了我最熟悉的 i3-wm ，搭配 st 终端模拟器和 Emacs 终端模式，轻松胜任代码编辑、网页浏览（eww）、邮件管理（rmail）、撰写博客等工作。&#xA;我在这台设备上使用最多的浏览器就是 Emacs 自带的 eww。它轻量、快速、&lt;strong&gt;纯文本&lt;/strong&gt;、&lt;strong&gt;无 JavaScript&lt;/strong&gt;。纯文本意味着它只能显示页面中的最核心内容，而不是花里胡哨的 CSS 修饰后的难以阅读、难以辨认的页面（当然，真正有干货的页面不会这样）。除非想看漫画和视频，否则 eww 无疑是最佳选择。而无 JavaScript 就意味着，网站提供者无法使用万恶的 JS 脚本追踪你的行为、收集你的数据和隐私，也不会有到处漂浮、插入、弹出、闪现的第三方广告，更不会有过多脚本带来的性能瓶颈，对十年前的老机器非常友好。在平时，我会用 eww 浏览一些文档。如果一定需要看图片的话，那还是打开 Firefox 吧。&lt;/p&gt;&#xA;&lt;p&gt;在这台设备上，如果不算那些依赖程序的话，我用的最多的软件就是 i3-wm, st, fcitx5 , Emacs, Firefox。没有任何多余的程序干扰。如果你不是苦逼的 Java 程序员，离开 IDEA 就一行代码都写不出来，我建议你也购买一台&lt;del&gt;破烂&lt;/del&gt;老旧的设备，因为老旧的设备无法运行大型游戏，甚至拿来看视频都不尽流畅。但它能拿来写代码、编辑文本，浏览网页，这就足够了。如果不需要读写中文内容，预览图片或 PDF，我甚至不会启动图形界面。&lt;/p&gt;&#xA;&lt;p&gt;ThinkPad X220 是我最喜欢的型号，最后一代经典七行键盘，充满工业感的外观，低廉的价格，极高的性价比和可玩性。通过自己动手修改配置、改装硬件，把钱花在刀刃上，不跟随邪恶的厂商花大价钱购买最新硬件，经济且实用。ThinkPad 的模块化设计非常天然适配「垃圾佬」精神。&lt;/p&gt;&#xA;&lt;p&gt;除了这台 ThinkPad X220 外，我还有一台台式机。在台式机中，我安装了 Debian GNU/Linux 和 Windows 11。&lt;/p&gt;&#xA;&lt;p&gt;我大部分时间都在使用 Debian ，在需要处理学校的任务时会切换到 Windows 11。稳定对我来说是最重要的，我不希望把大部分时间都花在维护系统配置、修复错误上，因此在这台设备上，我选择 Debian。&lt;/p&gt;&#xA;&lt;p&gt;这台电脑原本是我爸的，在我长期&lt;del&gt;占&lt;/del&gt;借用后，已经完全属于我，我爸也因此有理由购买一台新的笔记本电脑，因为他想打游戏所以没有考虑 ThinkPad，好可惜！然而他花上千买了一台天选姬，只是拿来打魔兽世界……&lt;/p&gt;&#xA;&lt;h2 id=&#34;软件&#34;&gt;软件&lt;/h2&gt;&#xA;&lt;p&gt;美化的尽头是默认。我完全不再考虑外观了。在这台设备上，我的优先级是：是否是自由软件？ &amp;gt; 性能 &amp;gt; 可自定义性的高低 &amp;gt; 外观。电脑固然有玩具属性，但工具属性更多，它是达成目的的途径，而不是目的本身。&lt;/p&gt;&#xA;&lt;p&gt;我已经没有精力再去折腾各种软件的和桌面的美化，而且引入过多复杂的配置只会让系统越来越脆弱、维护成本越来越高。因此我安装了配置简单、稳定性高的 i3-wm，我有考虑过使用 dwm，但它毕竟是 wm，配置项比较多，等什么时候又有兴趣了，可能会尝试一下。&lt;/p&gt;&#xA;&lt;p&gt;我按照台式机上的习惯，重写了一份配置文件。状态栏、系统托盘等，全部使用默认设置。而 Emacs 的配置也尽可能保持精简，为了好维护和在低性能设备上流畅使用，我裁剪了大部分很少使用的配置和包，让 Emacs 回归为一个纯净的文本编辑器&lt;del&gt;兼邮件客户端兼网页浏览器兼计算器兼 RSS 阅读器&lt;/del&gt;。&lt;/p&gt;&#xA;&lt;p&gt;实际上，我的配置还是非常简单的，由于我大部分时间都在 Emacs 中，稳定性是最重要的，我不能接受在写着写着代码的时候，某个地方突然报错，然后我就要花上好几个小时去排查到底是什么原因，这大大影响了效率和心情。&lt;/p&gt;&#xA;&lt;p&gt;出于性能考虑，我只在终端中使用 Emacs。我不经常用 Org-mode ，也不经常浏览图片，所以终端模式是一个不错的选择。在终端中开启 emacsclient，可以把 Emacs 当成 vi 用，随用随退，非常方便。目前我遇到的唯一让我不适应的地方就是，在终端中打字的手感可没有 GUI 好。&lt;/p&gt;&#xA;&lt;p&gt;我将简单、默认的理念在 st 中也贯彻到底，只打了两个 patch : clipboard &amp;amp; scrollbar。我感觉它的配置比 Xterm 简单多了，我用了有一段时间 Xterm ，它的优点是配置文件即插即用，但一旦出现一些问题，它古老又死板的字体、属性查找逻辑又会浪费掉我不少时间。它的好兄弟 urxvt 也是如此，它们是用同一个配置文件的！&lt;/p&gt;&#xA;&lt;p&gt;我直接 pass 掉了 kitty 和 WezTerm 等终端模拟器，感觉它们在老设备上的性能并不出色，并且我实在喜欢不起来 WezTerm 的配置脚本语言 Lua。综合考量之下，我选择了 st。它极其精简，精简到你需要自己打 patch 来实现一些其他终端模拟器本来就有的，或者写一两行配置文件的代码就有的功能。不过，我可以接受，至少到目前为止的配置过程都还算愉快，我也非常欣赏 Suckless 的哲学：保持简单、最小化、可用。并且它们的软件都是纯 C 编写，这让我对他们的印象更好了。&lt;/p&gt;&#xA;&lt;p&gt;如你所见，我没有在这台设备上安装微信和 QQ，因为它的 Linux 客户端做得实在是太烂了！尤其是 QQ，在我的台式机上都会经常卡住，我不得不手动在 htop 中关掉那个进程。 除了这个原因外，&lt;em&gt;我也很享受这种别人想找我找不到，只有我主动打开软件才能找到我的感觉&lt;/em&gt;。我非常讨厌在我专注做某件事的时候，一通电话，一条微信消息发过来，电脑上有该死的咚咚两声，手机也会振动、响铃，因此我一般都把手机设置成免打扰。事实也证明我并不是非常重要，消失几个小时，多达上百次，几乎没有酿成任何大祸，也能说明找我的人大部分并没有什么急事，所以我的这种做法还算恰当。&lt;/p&gt;&#xA;&lt;p&gt;不过，如果真的有人有什么急事要找我，发邮件或许真的是最快能联系到我的方式。因为我的手机上没有安装 QQ ，平板和电脑也不能接打电话和短信。按照我的习惯，如果我没有需求主动用它，很有可能三四个小时都不会拿起来看一眼。但是邮件就不同了，我的每一台电子设备上都有邮件客户端。&lt;/p&gt;&#xA;&lt;p&gt;一些好玩的事：有时候我会躺在床上，ssh 连接到台式机写博客文章，或者笔记本的小屏幕看得眼睛干脖子酸了，就用台式机 ssh 连接到笔记本继续写。再一次赞美 Emacs 终端模式！&lt;/p&gt;</description>
    </item>
    <item>
      <title>2026年，一个普通Emacs用户如何把Gnus跑起来</title>
      <link>https://blog.verdant.ee/posts/gnus-guide/</link>
      <pubDate>Tue, 10 Feb 2026 18:34:00 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/gnus-guide/</guid>
      <description>&lt;p&gt;Emacs中有众多的邮件管理工具，目前比较流行的是&lt;a href=&#34;https://github.com/emacsmirror/mu4e&#34;&gt;mu4e&lt;/a&gt;，但如果你和我一样，不喜欢它的操作逻辑和界面，或者同样有怀旧情怀，一定会想玩玩Gnus。然而这个在Emacs中自带的包，居然在中文互联网上几乎没有任何讨论度，甚至能用中文搜索到的配置教程是写于2012年的博客园文章。几乎找不到近些年的帖子或文章。所以我写下这篇文章，为同样想折腾Gnus的，使用中文的Emacser指路。&lt;/p&gt;&#xA;&lt;p&gt;本篇文章不是《Emacs完全上手指南/圣经/官方文档》，不能做到全面、无误，但可以保证是中文互联网上较新的资料，如有错误，欢迎邮件或在评论区指出。&lt;/p&gt;&#xA;&lt;p&gt;Gnus是一个多功能的信息聚合器，邮件只是它的功能之一，本篇文章主要配置邮件功能。&lt;/p&gt;&#xA;&lt;h2 id=&#34;getting-started&#34;&gt;Getting started&lt;/h2&gt;&#xA;&lt;p&gt;Gnus的配置文件默认在&lt;code&gt;~/.gnus&lt;/code&gt;，Emacs会将它当作elisp文件读取，网上也有一些说法是&lt;code&gt;~/.gnus.el&lt;/code&gt;其实只是加载顺序的不同，如果你此前有尝试，请备份并删除以前的文件。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;touch ~/.gnus&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;gnus-select-method&#34;&gt;gnus-select-method&lt;/h2&gt;&#xA;&lt;p&gt;Gnus的后端选择，对于imap协议，一般选择&lt;code&gt;nnimap&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;setq&lt;/span&gt; gnus-select-method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;#39;&lt;/span&gt;(nnimap &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;NAME&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;这里是自己起的名字，用来区分不同的帐号&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-address &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; imap服务器&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-inbox &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;INBOX&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 大多数服务器都使用INBOX，除非你明确知道不同，否则不建议修改&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-expunge &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 立即在服务器上同步删除的邮件（按需开启，开启后删除邮件无法恢复）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-server-port &lt;span style=&#34;color:#d699b6&#34;&gt;993&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-stream ssl)  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 使用 SSL&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-authenticator login)  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;指定认证方式，如果服务器支持多种认证方式但自动协商失败，建议开启&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               ))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在配好后，重启Emacs，输入&lt;code&gt;M-x RET gnus RET&lt;/code&gt;，下方会闪过一些输出，根据提示填写用户名和密码后，询问是否要把用户名和密码填入&lt;code&gt;~/.authinfo&lt;/code&gt;，建议选y。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;C-x b&lt;/code&gt;切换到&lt;code&gt;*Messages*&lt;/code&gt;buffer查看，会看到类似这样的输出，那就表明你的配置无误！&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Opening connection to imap.qiye.aliyun.com via tls...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Opening connection to imap.qiye.aliyun.com...done&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Saving file /home/yingyu5658/.newsrc-dribble...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Wrote /home/yingyu5658/.newsrc-dribble&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Gnus auto-save file exists.  Do you want to read it? (y or n) n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Reading /home/yingyu5658/.newsrc...done&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Subscribe newsgroup: 已删除邮件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Subscribe newsgroup: 草稿&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Subscribe newsgroup: INBOX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Subscribe newsgroup: 已发送&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Subscribe newsgroup: 垃圾邮件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Opening nnfolder server on archive...done&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5 new newsgroups have arrived&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking new news...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nnimap read 0k from imap.qiye.aliyun.com (initial sync of 5 groups; please wait)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking new news...done&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;No news is good news&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个news是历史遗留词汇，最后一行输出仅仅代表当前没有未读邮件。&lt;/p&gt;&#xA;&lt;p&gt;你可以用另一个账号向这个邮箱发送一封测试邮件，重新打开Gnus，会有这样的输出：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1:*INBOX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们回车点进去，就会打开那封邮件显示内容啦。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/2026-02-10_19-50.png&#34; alt=&#34;测试邮件效果&#34;&gt;&#xA;    &lt;figcaption&gt;测试邮件效果&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;在Group Buffer中按下&lt;code&gt;L&lt;/code&gt;，可以看到所有文件夹。&lt;/p&gt;&#xA;&lt;h2 id=&#34;多帐号配置&#34;&gt;多帐号配置&lt;/h2&gt;&#xA;&lt;p&gt;多账号配置需要设置&lt;code&gt;gnus-secondary-select-methods&lt;/code&gt;这个变量，这里和&lt;code&gt;gnus-select-method&lt;/code&gt;一起说一下。后者是主服务器，前者是额外服务器列表，但几乎和主服务器同级，使用中可以当作平级。&lt;/p&gt;&#xA;&lt;p&gt;多账号配置示例：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;setq&lt;/span&gt; gnus-select-method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;#39;&lt;/span&gt;(nnimap &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;glowsisle&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-address &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;imap.qiye.aliyun.com&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-inbox &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;INBOX&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-expunge &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-server-port &lt;span style=&#34;color:#d699b6&#34;&gt;993&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-stream ssl)  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 使用 SSL&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (nnimap-authenticator login)  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 必须指定认证方式&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               ))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;setq&lt;/span&gt; gnus-secondary-select-methods&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;#39;&lt;/span&gt;((nnimap &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;outlook&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;(nnimap-address &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;outlook.office365.com&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;(nnimap-server-port &lt;span style=&#34;color:#d699b6&#34;&gt;993&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;(nnimap-stream ssl)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 如果你有更多账户，另一个账户的配置同上。&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意到了吗，&lt;code&gt;secondary&lt;/code&gt;的配置和我们一开始配置的&lt;code&gt;gnus-select-method&lt;/code&gt;一模一样，而且它可以容纳多个账户。&lt;/p&gt;&#xA;&lt;p&gt;注意：Microsoft Outlook / Microsoft 365 默认禁用普通 IMAP 密码登录。Gnus 无法使用 OAuth2，因此必须在 Microsoft 帐号中启用双重验证并生成应用专用密码，否则会出现 NO LOGIN failed 错误。&lt;/p&gt;&#xA;&lt;h2 id=&#34;发邮件&#34;&gt;发邮件&lt;/h2&gt;&#xA;&lt;p&gt;虽然对于一个Gnus教程来说有点跑题，但你应该会需要发件配置的。&lt;/p&gt;&#xA;&lt;p&gt;在Emacs中发送邮件有三条路，分别是&lt;code&gt;msmtp&lt;/code&gt;、&lt;code&gt;smtpmail&lt;/code&gt;（Emacs内置）、sendmail。&lt;/p&gt;&#xA;&lt;p&gt;最推荐的是msmtp，与Gnus、Emacs解耦，并且配置简单优雅。&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装&#34;&gt;安装&lt;/h3&gt;&#xA;&lt;p&gt;以Debian为例：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install msmtp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在配置文件中&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;setq&lt;/span&gt; send-mail-function &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;sendmail-send-it&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;setq&lt;/span&gt; message-send-mail-function &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;sendmail-send-it&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;setq&lt;/span&gt; sendmail-program &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;/usr/bin/msmtp&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在&lt;code&gt;~/.msmtprc&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;account 账户名&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;host smtp.server.address&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;from your@account.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;auth login&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;port yourport&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user your@account.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;password 不建议明文写密码，配置方式见下文&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;auth on&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tls on&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tls_starttls off&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tls_certcheck  off &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tls_trust_file /etc/ssl/certs/ca-certificates.crt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;account default : 默认账户，填写account的值&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;密码存储&#34;&gt;密码存储&lt;/h2&gt;&#xA;&lt;p&gt;需要创建一个包含密码的文本文件。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;touch password &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;yourpassword&amp;#34;&lt;/span&gt; &amp;gt; ./password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后使用GPG加密，这样会生成一个&lt;code&gt;password.gpg&lt;/code&gt;文件&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gpg --symmetric --cipher-algo AES256 password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后在&lt;code&gt;~/.msmtprc&lt;/code&gt;中，把密码那行改成&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;passwordeval &amp;#34;gpg --quiet --batch --decrypt /path/to/password.gpg&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样每次使用都要输入GPG密码，为了避免这种情况，可以在&lt;code&gt;~/.gnupg/gpg.conf&lt;/code&gt;写入以下内容来缓存密码。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;use-agent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样就不用每次都输入密码了。记得删除明文存储密码的password文件:)&lt;/p&gt;&#xA;&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.gnu.org/software/emacs/manual/html_mono/gnus.html&#34;&gt;Gnus Manual&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cnblogs.com/csophys/articles/2375236.html&#34;&gt;Emacs Gnus 的基本配置与使用&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://emacs-china.org/t/emacs-send-mail-rmail-and-gnus/11730/4?page=2&#34;&gt;Emacs收发邮件完全操作指南: Send-Mail, Rmail and Gnus&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>剖析千行C语言文本编辑器Kilo的技术细节</title>
      <link>https://blog.verdant.ee/posts/kilo-analysis/</link>
      <pubDate>Sat, 06 Dec 2025 13:26:47 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/kilo-analysis/</guid>
      <description>&lt;p&gt;今天上午学习了一下&lt;a href=&#34;https://github.com/antirez/kilo&#34;&gt;Kilo&lt;/a&gt;的源代码。我很早以前就对文本编辑器的实现方法感兴趣了。&lt;/p&gt;&#xA;&lt;p&gt;Kilo是一个很简易却不简陋的项目，清晰地展示了如何构建一个终端下的文本编辑器，它的目的不是真正让你学会去开发一个高标准高质量，能投入使用的文本编辑器，而是理解文本编辑器的核心骨架、理解一个看似庞大一团糟的问题的拆解思路。这是一个很好的起点。也过了一把爽玩C语言的瘾（虽然我并没有写几行代码）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;程序分析&#34;&gt;程序分析&lt;/h2&gt;&#xA;&lt;p&gt;整个项目只有一个文件，一千三百行代码。我用了大概一个半小时梳理了程序的执行流程，手画了一个流程图。为了美观，我又用&lt;a href=&#34;https://www.glowisle.me/posts/%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8graphviz%E7%BB%98%E5%88%B6%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B%E5%9B%BE/&#34;&gt;Graphviz&lt;/a&gt;绘制了一个电子版：&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/kilo-graph.png&#34; alt=&#34;程序流程图（大意）&#34;&gt;&#xA;    &lt;figcaption&gt;程序流程图（大意）&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;这张图我省略了一些深的函数调用，但也能帮助我大体上掌握这个程序的执行流程。结合这张图与源码，我发现文本编辑器的核心功能——打开、编辑、保存，实现难度并不大，在C语言中容易踩坑的是缓冲区处理、文件读写这种老生常谈的内容。在这个程序中，调用最多、最重磅的部分是&lt;code&gt;initEditor&lt;/code&gt;这个函数，以及后续的高亮处理，尤其是前者在窗口尺寸计算、修改后的做法上花费了大功夫。其实和终端环境的交互才是最麻烦的点，它提供的封装和抽象并不多，有很多需要自己手动调试的地方，繁琐是显著特征。&lt;/p&gt;&#xA;&lt;h3 id=&#34;终端信号处理&#34;&gt;终端信号处理&lt;/h3&gt;&#xA;&lt;p&gt;我发现在终端程序里，需要快捷键的部分都是使用Raw mode和signal相关的函数组合实现的，在理解&lt;code&gt;signal&lt;/code&gt;这个函数和它的有关宏的概念时，耗费了比较长的时间。&lt;/p&gt;&#xA;&lt;p&gt;简单来说，signal用于处理用户在终端发出的信号，比如&lt;code&gt;SIGINT&lt;/code&gt;代表由&lt;code&gt;C-c&lt;/code&gt;产生的中断信号，&lt;code&gt;SIGIGN&lt;/code&gt;代表忽略信号，即接受到这个信号以后什么都不做，关于如何接受信号，就要说起&lt;code&gt;signal()&lt;/code&gt;这个函数。定义如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; (&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;signal&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; sig, &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; (&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;func)(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;)))(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;看起来非常复杂，说人话就是接受两个参数，第一个参数是int类型的&lt;code&gt;sig&lt;/code&gt;，是信号编号，比如&lt;code&gt;SIGINT&lt;/code&gt;，这是要接收的信号。第二个参数是一个函数指针，接受一个返回void，参数是int类型的信号处理函数，使用第二个函数中的函数对接受到的信号做处理。函数返回原来的信号处理函数（函数指针）。&lt;/p&gt;&#xA;&lt;p&gt;可以用typedef简化理解：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 定义信号处理函数的类型&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;void&lt;/span&gt; (&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;sighandler_t&lt;/span&gt;)(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 用 typedef 重写 signal 声明&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;sighandler_t&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;signal&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; sig, &lt;span style=&#34;color:#dbbc7f&#34;&gt;sighandler_t&lt;/span&gt; func);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在Kilo中，&lt;code&gt;C-c&lt;/code&gt;是被忽略的，因为它非常容易导致丢失修改，可以这样实现：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;signal&lt;/span&gt;(SIGINT, SIGIGN);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不过，在Kilo的实现，是通过调用&lt;code&gt;editorReadKey()&lt;/code&gt;，从Raw Mode 中读取一个按键存入数组，用switch匹配按键对应的值再返回给调用方，调用方也通过switch，匹配对应的操作函数。而在&lt;code&gt;C-c&lt;/code&gt;的部分，则是直接break掉了。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;CTRL_C&lt;/span&gt;: &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Ctrl-c */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* We ignore ctrl-c, it can&amp;#39;t be so simple to lose the changes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;         * to the edited file. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种实现方法也有一定局限性，不同的终端模拟器可能发送不同的转义字符，硬编码转义字符会出现不适配的情况。并且使用&lt;code&gt;read()&lt;/code&gt;阻塞读取输入有性能瓶颈。&lt;/p&gt;&#xA;&lt;h3 id=&#34;精妙的数据结构与算法&#34;&gt;精妙的数据结构与算法&lt;/h3&gt;&#xA;&lt;p&gt;这个程序最有趣的地方在于清晰、通用的数据结构的设计，以&lt;code&gt;editorConfig&lt;/code&gt;为例：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;struct&lt;/span&gt; editorConfig {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; cx, cy;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Cursor x and y position in characters */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; rowoff;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Offset of row displayed. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; coloff;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Offset of column displayed. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; screenrows; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Number of rows that we can show */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; screencols; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Number of cols that we can show */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; numrows;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Number of rows */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; rawmode;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Is terminal raw mode enabled? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    erow &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;row;      &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Rows */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; dirty;      &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* File modified but not saved. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;filename; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Currently open filename */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;char&lt;/span&gt; statusmsg[&lt;span style=&#34;color:#d699b6&#34;&gt;80&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;time_t&lt;/span&gt; statusmsg_time;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;struct&lt;/span&gt; editorSyntax &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;syntax; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Current syntax highlight, or NULL. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们定义了一个&lt;code&gt;editorConfig&lt;/code&gt;类型的变量，它全局唯一，维护了程序的基本状态，包括行、列、滚动偏移、终端尺寸。让程序状态的流转非常清楚。这些内容都是一个文本编辑器需要关心的最核心内容：光标位置、视图偏移、数据和文件的状态等信息。&lt;/p&gt;&#xA;&lt;p&gt;通过这个结构体，能简单地获取程序当前的状态，或者为某项功能对状态作出修改，对一个新手来说还是挺拓宽思路的，至少我想不到怎么设计这些数据结构。&lt;/p&gt;&#xA;&lt;h3 id=&#34;数据与显示的分离&#34;&gt;数据与显示的分离&lt;/h3&gt;&#xA;&lt;p&gt;在&lt;code&gt;editorConfig&lt;/code&gt;中嵌套了一个&lt;code&gt;erow&lt;/code&gt;类型的变量，里面的东西也可以展开说说，定义如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;struct&lt;/span&gt; erow {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; idx;           &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Row index in the file, zero-based. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; size;          &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Size of the row, excluding the null term. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; rsize;         &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Size of the rendered row. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;chars;       &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Row content. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;render;      &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Row content &amp;#34;rendered&amp;#34; for screen (for TABs). */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;hl; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Syntax highlight type for each character in render.*/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; hl_oc;         &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Row had open comment at end in last syntax highlight&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;                          check. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} erow;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里面有一个&lt;code&gt;render&lt;/code&gt;字段，在&lt;code&gt;editorUpdateRow()&lt;/code&gt;中，有这样的代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; tabs &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;, nonprint &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; j, idx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* Create a version of the row we can directly print on the screen,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;     * respecting tabs, substituting non printable characters with &amp;#39;?&amp;#39;. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;free&lt;/span&gt;(row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;render);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt; (j &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;; j &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;&lt;/span&gt; row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;size; j&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;chars[j] &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; TAB)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            tabs&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;long&lt;/span&gt; allocsize &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#dbbc7f&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;long&lt;/span&gt;)row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;size &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; tabs &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; nonprint &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;9&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (allocsize &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt; UINT32_MAX) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;Some line of the edited file is too long for kilo&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b2c98f&#34;&gt;exit&lt;/span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;循环的if中使用的 &lt;code&gt;TAB&lt;/code&gt; 定义在KEY_ACTION枚举，值为9，在ASCII码中是&lt;code&gt;\t&lt;/code&gt;也就是水平制表符。代码在统计tab的数量。&lt;/p&gt;&#xA;&lt;p&gt;问题在于，一个&lt;code&gt;\t&lt;/code&gt;在内存中占1字节，但在屏幕显示的时候会占据八个字符的宽度，这里就体现出&lt;code&gt;render&lt;/code&gt;的作用了，如果一行有两个&lt;code&gt;\t&lt;/code&gt;，每个最多展开为八个空格，那么所需要计算的大小就是&lt;code&gt;2 * 8 + chars的大小&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;long&lt;/span&gt;)row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;size &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; tabs &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; nonprint &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;9&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;那个恒为0的变量&lt;code&gt;nonprint&lt;/code&gt;可能是为将来打印不可见字符设计的。结尾的&lt;code&gt;+1&lt;/code&gt;为&lt;code&gt;&#39;\0&#39;&lt;/code&gt;预留。&lt;/p&gt;&#xA;&lt;p&gt;按照这个公式，给&lt;code&gt;render&lt;/code&gt;分配内存：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;render &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;malloc&lt;/span&gt;(row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;size &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; tabs &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; nonprint &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;9&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;随后，这些代码在非制表位填充空格：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;idx &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt; (j &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;; j &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;&lt;/span&gt; row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;size; j&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;chars[j] &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; TAB) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;render[idx&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e67e80&#34;&gt;while&lt;/span&gt; ((idx &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#7a8478&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 在非制表位填充空格&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;render[idx&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#e67e80&#34;&gt;else&lt;/span&gt; { &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 正常字符直接赋值&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;render[idx&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;chars[j];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;row&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;rsize &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; idx; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 在循环结束的时候，idx等于写入字符总数&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;row&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;render[idx] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//在字符末尾添加结束符&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;虽然有点绕，但设计还是非常巧妙的！&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;代码高亮&#34;&gt;代码高亮&lt;/h3&gt;&#xA;&lt;p&gt;源码中使用大量篇幅实现了代码高亮，定义了一些关键字：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;C_HL_extensions[] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;.c&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;.h&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;.cpp&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;.hpp&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;.cc&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;NULL&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;C_HL_keywords[] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* C Keywords */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;break&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;case&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;continue&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;do&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;else&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;enum&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;extern&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;for&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;goto&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;if&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;register&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;return&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;sizeof&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;static&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;struct&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;switch&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;typedef&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;union&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;volatile&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;while&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;NULL&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* C++ Keywords */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;alignas&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;alignof&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;and&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;and_eq&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;asm&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;bitand&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;bitor&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;class&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;compl&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;constexpr&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;const_cast&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;deltype&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;delete&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;dynamic_cast&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;explicit&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;export&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;friend&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;inline&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;mutable&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;new&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;noexcept&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;not&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;not_eq&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;nullptr&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;operator&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;or&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;or_eq&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;private&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;protected&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;public&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;reinterpret_cast&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;static_assert&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;static_cast&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;this&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;thread_local&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;throw&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;try&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;typeid&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;typename&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;virtual&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;xor&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;xor_eq&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;/* C types */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;int|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;long|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;double|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;float|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;char|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;unsigned|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;signed|&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;void|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;short|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;auto|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;const|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;bool|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;NULL&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后在具体实现&lt;code&gt;editorUpdateSyntax()&lt;/code&gt;中，简单粗暴地遍历字符匹配这些关键字。在一般的教学例子中这样实现是可以的，我认为在具体的工程中应当用词法分析、语法分析和字典树去匹配。更易于维护和拓展，也能适配复杂的嵌套。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;上述分析提到的缺点都可以作为优化方向，比如提供更简单操作接口，用词法分析技术或接入LSP服务器，为程序提供Lua接口来扩展插件……不过我相信在古老的纯C应用中，添加这些功能的繁琐程度和开发周期简直是灾难级别的。但是在处理快捷键上，使用&lt;code&gt;termcap&lt;/code&gt;库的难度应该小于修改代码高亮部分的难度。&lt;/p&gt;&#xA;&lt;p&gt;这个项目最值得学习的点是如何将抽象的功能和终端联系起来、如何设计合理的数据结构以及标准库的使用。是阐释「程序 = 数据结构 + 算法」的很好例子。不过我自己是想不到那些函数该什么时候用，没准还会手动实现标准库造好的轮子呢。&lt;/p&gt;&#xA;&lt;p&gt;学习的过程很好玩，从主函数开始探索整个程序，一段一段地跳转调用，A调用B，B调用C，C调用D，理解了逻辑后再把它们画成图，对感兴趣的部分深入研究，有一种前人用他的智慧抚平我大脑褶皱的感觉……读懂它，几乎就等于一只脚趾踩上了理解Vim / Nano等项目的大门吧。&lt;/p&gt;&#xA;&lt;p&gt;想自己重新实现一次，然后加入自己的优化，比如联动Lua / Zig甚至是Go来实现上层的功能，好玩好玩真好玩。&lt;/p&gt;&#xA;&lt;p&gt;头皮好痒，要长脑子了！&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在查资料的过程中又发现了 &lt;a href=&#34;https://github.com/martanne/vis&#34;&gt;vis&lt;/a&gt; 和 &lt;a href=&#34;https://github.com/zyedidia/micro&#34;&gt;micro&lt;/a&gt;（它甚至是用Go写的），又有新玩具了！&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>一次对Webmention的探索</title>
      <link>https://blog.verdant.ee/posts/exploring-webmention/</link>
      <pubDate>Fri, 05 Dec 2025 17:22:22 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/exploring-webmention/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Webmention is a simple way to notify any URL when you link to it from your site.&lt;/p&gt;&#xA;&lt;p&gt;It is an open web standard (W3C Recommendation) for conversations and interactions across the web, a powerful building block used for a growing distributed network of peer-to-peer comments, likes, reposts, and other responses across the web.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Webmention 是一种开放网络标准（W3C推荐标准），用于在链接到某个网址时，自动向该网址发送通知。它是构成分布式网络的基础组件，支持跨网站的点对点评论、点赞、转发等多种互动。&lt;/p&gt;&#xA;&lt;p&gt;在 &lt;a href=&#34;https://www.glowisle.me/posts/tear-hypocrisy-apart/&#34;&gt;上一篇文章&lt;/a&gt; 写完后，我开始寻找更合适的评论方案。Webmention这个看起来古老，但又超前的形式很快引起了我的兴趣。「去中心化」这个词貌似对我有什么魔力，就比如Mastodon，比Twitter更吸引我。&lt;/p&gt;&#xA;&lt;p&gt;我很想试试用Go手搓一套收发系统，但时间并不充裕，正巧&lt;a href=&#34;https://webmention.io&#34;&gt;webmention.io&lt;/a&gt;提供现成的服务和&lt;a href=&#34;https://indielogin.com/setup&#34;&gt;详细的文档&lt;/a&gt;，那就跟着文档配置吧。&lt;/p&gt;&#xA;&lt;h2 id=&#34;验证与接收&#34;&gt;验证与接收&lt;/h2&gt;&#xA;&lt;p&gt;教程提供了多种验证方案，这里使用最简便的Github. 只要在网站的首页挂上一个链接，指向用户档案页：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;https://github.com/example&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;me&amp;#34;&lt;/span&gt;&amp;gt;github.com/example&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;a&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果不想让它可见，也可以设置为一个`&lt;link&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;https://github.com/example&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;me&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/2025-12-05_18-26.png&#34; alt=&#34;作为验证，你需要在Github主页中包含你的网站&#34;&gt;&#xA;    &lt;figcaption&gt;作为验证，你需要在Github主页中包含你的网站&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;这里我部署后回退了一下网页就弹出来Github APP 认证请求了，大概需要刷新网页或打开Github？&lt;/p&gt;&#xA;&lt;p&gt;这样，访问之后页面中提供的链接，就可以看到别人发送的Webmention了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;渲染&#34;&gt;渲染&lt;/h2&gt;&#xA;&lt;p&gt;在网页中添加link&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;webmention&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;https://webmention.io/你的用户名/webmention&amp;#34;&lt;/span&gt; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我使用&lt;a href=&#34;https://github.com/PlaidWeb/webmention.js&#34;&gt;webmention.js&lt;/a&gt;，根据说明文档，可以复制仓库中的&lt;code&gt;/static/webmention.min.js&lt;/code&gt;到博客的&lt;code&gt;/static/js/webmention.min.js&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;在评论框下方提供一个容器&lt;code&gt;&amp;lt;div id=&amp;quot;webmentions&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;，并引用脚本&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;webmentions&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;/js/webmention.min.js&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;data-id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;webmentions&amp;#34;&lt;/span&gt; // &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;与容器id匹配&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;data-page-url&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;https://yourdomain.com/当前文章永久链接&amp;#34;&lt;/span&gt; // &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;建议使用&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;data-max-webmentions&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;50&amp;#34;&lt;/span&gt; // &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;最多显示数量&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;data-wordcount&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;30&amp;#34;&lt;/span&gt; // &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;回复预览最大字数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;data-sort-by&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;published&amp;#34;&lt;/span&gt; // &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;按照发布时间排序&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;data-sort-dir&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;up&amp;#34;&lt;/span&gt; // &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;时间升序&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;async&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;script&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hugo用户在永久链接上可以使用：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;data-page-url=&amp;#34;https://yourdomain.com{{ .RelPermalink  }}&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;为了本地测试，使用相对链接的变量拼接。脚本会对API发送请求，如果拿到的数据是空的，则会把最终的HTML输出为一个空字符串，所以刚开始看不到输出是正常的。大概写点CSS就可以正常投入使用了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;对webmention的看法&#34;&gt;对Webmention的看法&lt;/h2&gt;&#xA;&lt;p&gt;我认为Webmention是一种很像友情链接的互惠模式，优于在评论区下方留下链接的形式。续上上一篇文章的话题，这样不仅促成高质量的互动，也能丰富自己的写作素材，分量应该重于评论区链接的手段。就像上一篇文章的结尾所说，利人利己，何乐而不为呢？&lt;/p&gt;&#xA;&lt;p&gt;虽然这种模式的普及程度不高，但我相信去中心化会称为互联网的新趋势。开放、互联才能称为「互联网」。&lt;/p&gt;&#xA;&lt;p&gt;我通过一些Webmention，一条一条顺藤摸瓜也找到了很多有趣的博客。我准备有时间优化渲染格式，可能也会研究一点桥接的功能，不过还是要保持博客一贯的简洁风格。当然，要先有人回应才有数据拿来渲染，欢迎大家使用Webmention参与互动！&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>简单使用Graphviz绘制程序流程图</title>
      <link>https://blog.verdant.ee/posts/%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8graphviz%E7%BB%98%E5%88%B6%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B%E5%9B%BE/</link>
      <pubDate>Wed, 12 Nov 2025 11:13:24 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8graphviz%E7%BB%98%E5%88%B6%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B%E5%9B%BE/</guid>
      <description>&lt;h2 id=&#34;graphviz&#34;&gt;Graphviz&lt;/h2&gt;&#xA;&lt;p&gt;Graphviz 是一个开源的图形可视化软件，主要用于绘制有向图和无向图。&lt;/p&gt;&#xA;&lt;p&gt;用途：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;数据结构可视化：Graphviz 常用于显示数据结构，如抽象语法树或其他编程语言、工具或服务中的数据结构。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;软件设计和架构：通过Graphviz，开发者可以可视化系统组件、依赖关系和交互。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;网络拓扑图：用于显示网络设备和其连接的物理或逻辑视图。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;业务流程和工作流程图：描述组织或系统中的工作流程。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;其他任何需要图形表示的场景，例如状态机、决策树、组织结构图等。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;优势：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;声明性语言：Graphviz 使用一种称为 DOT 的声明性图形描述语言。用户只需描述图形的元素（如节点和边）及其关系，而无需指定其在屏幕上的确切位置。这使得创建和修改图形变得非常简单。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;自动布局：Graphviz 的一个显著特点是其强大的自动布局工具，这意味着你不需要手动指定节点的位置；Graphviz 将自动为你找到一个有意义和易于阅读的布局。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;可扩展性：Graphviz 支持多种输出格式，如 PNG、SVG、PDF 等，这意味着你可以轻松地将其图形集成到其他文档、网页或应用程序中。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;灵活性：虽然 DOT 语言相对简单，但它提供了丰富的特性和属性，允许用户定制图形的外观，如颜色、形状、大小、标签、箭头样式等。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;跨平台：Graphviz 可在多种操作系统上运行，如 Windows、Linux 和 macOS。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;活跃的社区和广泛的应用：由于其开源性质，Graphviz 拥有一个活跃的社区，不断有新的工具和库被开发，以支持更多的用例和集成。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;使用&#34;&gt;使用&lt;/h2&gt;&#xA;&lt;p&gt;Graphviz 使用 DOT 语言来描述图形。在 DOT 中，图分为&lt;strong&gt;有向图&lt;/strong&gt;和&lt;strong&gt;无向图&lt;/strong&gt;，使用&lt;code&gt;digraph&lt;/code&gt;和&lt;code&gt;graph&lt;/code&gt;关键字。&lt;/p&gt;&#xA;&lt;p&gt;安装：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install dot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Digraph 有一个明确的起点和终点。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Graph 没有明确的起点和终点。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;节点node&#34;&gt;节点(Node)&lt;/h3&gt;&#xA;&lt;p&gt;节点表示图中的一个实体，每一个节点都有唯一标识符。&lt;/p&gt;&#xA;&lt;h3 id=&#34;边&#34;&gt;边&lt;/h3&gt;&#xA;&lt;p&gt;边连接两个节点。在有向图中显示为一个箭头，在无向图中显示为一条线段。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;有向图：&lt;code&gt;nodeA -&amp;gt; nodeB;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;无向图：&lt;code&gt;nodeA -- bodeB;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;属性&#34;&gt;属性&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;color&lt;/code&gt; 元素颜色&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;label&lt;/code&gt; 附加到元素上的文本标签&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;shape&lt;/code&gt; 节点形状&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;style&lt;/code&gt; 元素样式&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;digraph G {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;A -&amp;gt; B;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;B -&amp;gt; C;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;C -&amp;gt; D;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;D -&amp;gt; A;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;渲染为图片：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dot -Tpng ./test.dot -o ./test.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;示例&#34;&gt;示例&lt;/h2&gt;&#xA;&lt;p&gt;一个容易的用户登录验证逻辑&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;digraph UserLogin {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;登录 -&amp;gt; 验证用户名和密码;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;验证用户名和密码 -&amp;gt; 放行 [label=&amp;#34;正确&amp;#34;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;验证用户名和密码 -&amp;gt; 重试 [label=&amp;#34;错误&amp;#34;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;重试 -&amp;gt; 登录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/dot-example-login.png&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/644358139&#34;&gt;https://zhuanlan.zhihu.com/p/644358139&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://graphviz.org/documentation/&#34;&gt;https://graphviz.org/documentation/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>Emacs，我又回来了！</title>
      <link>https://blog.verdant.ee/posts/emacs-i-am-back/</link>
      <pubDate>Sat, 01 Nov 2025 12:01:12 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/emacs-i-am-back/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;这大概已经是我第四次尝试入门 Emacs 了。&lt;/p&gt;&#xA;&lt;p&gt;前几次尝试过自己重新配置 Emacs、Spacemacs。自己配置简直是在堆屎山， Spacemacs 的机制搞不明白而且很卡，听说&lt;a href=&#34;https://github.com/doomemacs/doomemacs&#34;&gt;Doom Emacs&lt;/a&gt; 对 Vi/Vim 用户很友好，那就尝试一下吧！&lt;/p&gt;&#xA;&lt;p&gt;虽然我不能算是个老 Vimer，但是也深受 Vim 操作模式的荼毒，只想用 HJKL 走天下。之前也想玩 Obsidian 。但是&lt;strong&gt;它的 Vim mode 实在是太简陋了！！！&lt;/strong&gt; C-d不是向下翻页，而是把整行都删掉！&lt;/p&gt;&#xA;&lt;p&gt;不过手机上的 Ob 还是可以一用，比如 Banyan 插件，用来随时随地写一些碎碎念很方便。至于其他的功能，还是配 Emacs 更好玩吧。&lt;/p&gt;&#xA;&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;&#xA;&lt;p&gt;根据官方仓库的文档，使用以下命令安装：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone --depth &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt; https://github.com/doomemacs/doomemacs ~/.config/emacs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~/.config/emacs/bin/doom install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;速度比我想象中的要快得多，而且是交互式操作，感觉比 Spacemacs 友好一点？&lt;del&gt;这个脚本的输出有一股 Cargo 味……&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;安装结束后给了一点提示：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;But before you doom yourself, here are some things you should know:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1. Don&amp;#39;t forget to run &amp;#39;doom sync&amp;#39; and restart Emacs after modifying init.el or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   packages.el in ~/.config/doom. This is never necessary for config.el.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2. If something goes wrong, run `doom doctor` to diagnose common issues with&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   your environment, setup, and config.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3. Use &amp;#39;doom upgrade&amp;#39; to update Doom. Doing it any other way will require&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   additional steps (see &amp;#39;doom help upgrade&amp;#39;).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4. Access Doom&amp;#39;s documentation from within Emacs via &amp;#39;SPC h d h&amp;#39; or &amp;#39;C-h d h&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (or &amp;#39;M-x doom/help&amp;#39;).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Have fun!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中提到了一个叫&lt;strong&gt;doom&lt;/strong&gt;的命令，这是一个在&lt;code&gt;~/.emacs.d/bin/&lt;/code&gt;下的二进制文件，可以做个链接到&lt;code&gt;/usr/bin&lt;/code&gt;以便在任何地方使用。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo ln -s ~/.emacs.d/bin/doom /usr/bin/doom&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;配置&#34;&gt;配置&lt;/h2&gt;&#xA;&lt;p&gt;启动时全屏：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;window-setup-hook&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;#&amp;#39;&lt;/span&gt;toggle-frame-maximized)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装 &lt;a href=&#34;https://github.com/emacs-eaf/emacs-application-framework&#34;&gt;Eaf&lt;/a&gt; 插件：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone --depth=1 -b master https://github.com/emacs-eaf/emacs-application-framework.git ~/.emacs.d/site-lisp/emacs-application-framework/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd emacs-application-framework&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +x ./install-eaf.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./install-eaf.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用用看吧，后续有什么需求再折腾。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>如何订阅新闻组</title>
      <link>https://blog.verdant.ee/posts/how-to-subscribe-newsgroup/</link>
      <pubDate>Thu, 07 Aug 2025 11:52:23 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/how-to-subscribe-newsgroup/</guid>
      <description>&lt;h2 id=&#34;新闻组简介&#34;&gt;新闻组简介&lt;/h2&gt;&#xA;&lt;p&gt;新闻组（Usenet） 是互联网早期最重要、最具影响力的分布式讨论系统之一，可以把它理解为现代网络论坛（BBS）、社交媒体群组或Reddit版块的前身。它的核心特点是去中心化，提供一个平台，让用户可以在不同的主题分类（新闻组） 中发表文章（类似于帖子）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;订阅&#34;&gt;订阅&lt;/h2&gt;&#xA;&lt;p&gt;&lt;em&gt;如果有Emacs使用经验，可以用Gnus，本文使用&lt;a href=&#34;https://www.thunderbird.net/zh-CN/thunderbird/all/&#34;&gt;Thunderbird&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;运行Thunderbird，点击左下角的齿轮。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/subscribe-newsgroup-1.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;点击账户设置。&lt;/p&gt;&#xA;&lt;p&gt;点击上方的账户操作，选择新建新闻组账户。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/subscribe-newsgroup-3.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;填入昵称、邮箱等基本信息。&lt;/p&gt;&#xA;&lt;p&gt;在下一个服务器地址页面填入&lt;code&gt;news.yingyu5658.me&lt;/code&gt;，点击确定。回到最左边的标签页。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/subscribe-newsgroup-4.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;找到刚刚输入的服务器，选择顶部第二个“管理新闻组订阅”选项。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/subscribe-newsgroup-5.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;选好要订阅的组，点击右边一栏的订阅，确定。&lt;/p&gt;&#xA;&lt;p&gt;在最左边的列表中，右键刚刚填入的服务器，点击收取邮件，每次想要阅读消息时就收取一次邮件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/subscribe-newsgroup-6.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;如果有想参与讨论的话题，点进那个邮件，选择回复组即可。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/subscribe-newsgroup-7.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>从编译原理到物理原理剖析程序的编译与执行</title>
      <link>https://blog.verdant.ee/posts/%E4%BB%8E%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86%E5%88%B0%E7%89%A9%E7%90%86%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%BC%96%E8%AF%91%E4%B8%8E%E6%89%A7%E8%A1%8C/</link>
      <pubDate>Tue, 29 Jul 2025 15:55:14 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E4%BB%8E%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86%E5%88%B0%E7%89%A9%E7%90%86%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%BC%96%E8%AF%91%E4%B8%8E%E6%89%A7%E8%A1%8C/</guid>
      <description>&lt;h2 id=&#34;编译过程&#34;&gt;编译过程&lt;/h2&gt;&#xA;&lt;p&gt;以C语言为例，编译成可执行文件一共要经历：&lt;strong&gt;预处理=&amp;gt;狭义编译=&amp;gt;汇编=&amp;gt;链接&lt;/strong&gt;，最终成为可执行文件。&lt;/p&gt;&#xA;&lt;h3 id=&#34;预处理&#34;&gt;预处理&lt;/h3&gt;&#xA;&lt;p&gt;输入源代码文件以及其包含的头文件，由预处理器执行展开宏定义、处理，条件编译指令、将包含的头文件直接插入到指令位置，删除注释。&lt;/p&gt;&#xA;&lt;p&gt;输出纯净的、宏已展开、注释已删除、头文件已包含的中间代码文件，通常为&lt;code&gt;.i&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;编写一个简单的程序：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#e67e80;font-style:italic&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;#define STRING &amp;#34;Program&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 打印一些内容&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;Hello world!&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;%s&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;, STRING);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用gcc的&lt;code&gt;-E&lt;/code&gt;选项生成中间代码：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;gcc exam.c -E -o ./exam.i&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;他生成了非常长的代码&lt;/p&gt;&#xA;&lt;p&gt;可以验证预处理器是直接把头文件替换进来的。而代码中类似&lt;code&gt;# 5 &amp;quot;exam.c&amp;quot;&lt;/code&gt;的标记用于记录源代码的位置信息，便于调试器和错误诊断程序追踪代码位置。&lt;/p&gt;&#xA;&lt;h3 id=&#34;编译狭义编译&#34;&gt;编译（狭义编译）&lt;/h3&gt;&#xA;&lt;h4 id=&#34;词法分析&#34;&gt;词法分析&lt;/h4&gt;&#xA;&lt;p&gt;输入预处理后的源代码文件，有编译器执行词法分析，将字符流分解成有意义的词素（Token），例如：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; sum &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;分解成&lt;code&gt;int&lt;/code&gt;, &lt;code&gt;sum&lt;/code&gt;, &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;等Token。&lt;/p&gt;&#xA;&lt;h4 id=&#34;语法分析&#34;&gt;语法分析&lt;/h4&gt;&#xA;&lt;p&gt;根据语言的语法规则，将Token序列组合成抽象语法树（Abstract Syntax Tree），简称AST，表达了代码的结构和层次关系。&lt;/p&gt;&#xA;&lt;h4 id=&#34;语义分析&#34;&gt;语义分析&lt;/h4&gt;&#xA;&lt;p&gt;检查程序的语义是否正确，例如变量是否声明、类型是否匹配等。&lt;/p&gt;&#xA;&lt;h4 id=&#34;中间代码生成&#34;&gt;中间代码生成&lt;/h4&gt;&#xA;&lt;p&gt;将AST转换成一种独立于CPU架构的中间表示形式（intermediate Representation），即IR。常见的IR有三地址码、LLVM IR、Java字节码等，为了优化和转移成多种目标机器码。&lt;/p&gt;&#xA;&lt;h4 id=&#34;优化&#34;&gt;优化&lt;/h4&gt;&#xA;&lt;p&gt;对IR进行处理，目的是在不改变程序行为的前提下，提高代码效率。包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;常量折叠：如计算&lt;code&gt;3 + 5&lt;/code&gt;为&lt;code&gt;8&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;死代码消除：移除永远不会执行到的代码。&lt;/li&gt;&#xA;&lt;li&gt;循环优化：如循环展开。&lt;/li&gt;&#xA;&lt;li&gt;函数内联。&lt;/li&gt;&#xA;&lt;li&gt;寄存器分配：决定哪些变量存储在高速的CPU寄存器中。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;输出优化后的中间代码。&lt;/p&gt;&#xA;&lt;h3 id=&#34;汇编&#34;&gt;汇编&lt;/h3&gt;&#xA;&lt;p&gt;输入IR，或直接由编译器生成的汇编代码。由汇编器&lt;code&gt;as&lt;/code&gt;执行。将汇编指令一对一地转换成特定CPU架构的机器操作指令。处理伪汇编指令，如定义数据段&lt;code&gt;.data&lt;/code&gt;，定义代码段&lt;code&gt;.text&lt;/code&gt;，分配存储空间&lt;code&gt;space&lt;/code&gt;等。最后解析符号、如函数名、变量名等，生成符号表。&lt;/p&gt;&#xA;&lt;p&gt;输出目标文件，如.o，.obj，包含机器指令、全局变量、静态变量的初始值等、符号表、重定位信息。&lt;/p&gt;&#xA;&lt;h3 id=&#34;链接&#34;&gt;链接&lt;/h3&gt;&#xA;&lt;p&gt;输入一个或多个.o文件夹+库文件（静态.a/.lib，动态.so/.dll）。由链接器进行符号解析、重定位、库处理，最输出可执行文件或库文件。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;cpu如何识别指令&#34;&gt;CPU如何识别指令&lt;/h2&gt;&#xA;&lt;p&gt;CPU执行程序的循环称为Fetch-Decode-Execute Cycle（取指-译码-执行周期）。&lt;/p&gt;&#xA;&lt;h3 id=&#34;取指&#34;&gt;取指&lt;/h3&gt;&#xA;&lt;p&gt;CPU内部有一个寄存器叫程序计数器（Program Counter, PC），它保存着下一条要执行的指令的内存地址，CPU将PC中的地址发送到地址总线，内存控制器根据地址总线上的地址，找到对应的内存单元，将其存储的指令通过数据总线送回CPU。取回来的指令被放入指令寄存器IR。PC的值自动增加，指向下一条指令的地址。&lt;/p&gt;&#xA;&lt;h3 id=&#34;译码指令&#34;&gt;译码指令&lt;/h3&gt;&#xA;&lt;p&gt;CPU的控制单元读取IR中的指令，控制单元包含一指令译码器，译码器分析指令 操作码部分，操作码唯一表示CPU应该执行什么操作，如ADD MOV JMP等。&lt;/p&gt;&#xA;&lt;p&gt;根据操作码，译码器决定：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;操作的性质（算术、逻辑、数据传输、跳转等）。&lt;/li&gt;&#xA;&lt;li&gt;操作需要多少个操作数。&lt;/li&gt;&#xA;&lt;li&gt;操作数存放位置（寄存器、内部地址指令本身中的立即数）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;译码器激活执行该操作所需要的CPU内部电路通路和控制信号，结果决定了下一个阶段（执行）需要做什么。&lt;/p&gt;&#xA;&lt;h3 id=&#34;执行指令&#34;&gt;执行指令&lt;/h3&gt;&#xA;&lt;p&gt;CPU的算术逻辑单元（Arithmetic Logic Unit, ALU）或去他功能单元（FPU MMU）根据译码器产生的控制信号执行实际操作。&lt;/p&gt;&#xA;&lt;p&gt;操作数可能从寄存器文件中读取，或者从内存中加载，ALU执行加减与或移位等操作，如果指令是JMP/CALL/RET/分支指令等跳转指令，可能会修改PC的值，从而改变下一条指令的位置。计算结果可能写回寄存器，或者通过数据总线写会内存。&lt;/p&gt;&#xA;&lt;p&gt;上述的操作循环以极高的速度（GHz级别）不断重复，构成了CPU运行程序基础。&lt;/p&gt;&#xA;&lt;h2 id=&#34;编译后的指令在物理层面上是什么&#34;&gt;编译后的指令在物理层面上是什么&lt;/h2&gt;&#xA;&lt;p&gt;答：&lt;strong&gt;内存中的电荷状态&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;程序被操作系统加载到计算机的RAM中，RAM由无数的存储单元（通常是电容）组成，每一个单元可以存储一个bit的信息。&lt;/p&gt;&#xA;&lt;p&gt;高电平电荷（通常代表1）或低电平电荷（通常代表0）的状态，就表示一个二进制位。&lt;/p&gt;&#xA;&lt;p&gt;每条指令由多个bit组成。指令序列在RAM中是一系列连续存储单元的电荷状态。当CPU取指令时，PC寄存器的值，也就是一组触发器的电平状态被送到地址总线，也就是一组物理导线。&lt;/p&gt;&#xA;&lt;p&gt;地址总线上的电平信号激活内存控制器和特定的存储单元。&lt;/p&gt;&#xA;&lt;p&gt;被选中的内存单元的电荷状态被读出，转换为相应的电平信号，通过数据总线传回CPU。&lt;/p&gt;&#xA;&lt;p&gt;这些电平信号进入CPU的指令寄存器IR，也是一组触发器的电平状态。&lt;/p&gt;&#xA;&lt;p&gt;一组一组电平状态激活着CPU中的组件，从而执行指令。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>在2025年，搭建新闻组</title>
      <link>https://blog.verdant.ee/posts/set-up-newsgroup/</link>
      <pubDate>Sat, 26 Jul 2025 12:05:39 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/set-up-newsgroup/</guid>
      <description>&lt;h2 id=&#34;介绍&#34;&gt;介绍&lt;/h2&gt;&#xA;&lt;p&gt;新闻组(英文名Usenet或NewsGroup)，简单地说就是一个基于网络的计算机组合，这些计算机被称为新闻服务器，不同的用户通过一些软件可连接到新闻服务器上，阅读其他人的消息并可以参与讨论。新闻组是一个完全交互式的超级电子论坛，是任何一个网络用户都能进行相互交流的工具。现在已经没落，1990年前后是新闻组的鼎盛时期。很可惜，我晚了20年。&lt;/p&gt;&#xA;&lt;p&gt;新闻组基于古老的NNTP协议，又名Usenet，类似一个巨大的论坛，用户可以在不同的组中发表内容，其他用户也可以回复内容，一切基于Email。&lt;/p&gt;&#xA;&lt;h2 id=&#34;搭建&#34;&gt;搭建&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;这可能是当今互联网上，你能找到的为数不多的最新的有关新闻组的文章。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;我使用&lt;a href=&#34;https://github.com/erco77/newsd&#34;&gt;newsd&lt;/a&gt;这个服务端来搭建，至于为什么没有使用&lt;strong&gt;inn&lt;/strong&gt;，有两个原因：教程过时、软件库中没有。&lt;/p&gt;&#xA;&lt;h3 id=&#34;编译与初始化&#34;&gt;编译与初始化&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/erco77/newsd.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果没有错误的话，输出是这样的：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yingyu5658@bongo &lt;span style=&#34;color:#7a8478&#34;&gt;~/&lt;/span&gt;e&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;newsd (master)&lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt; make&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;g&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Wall &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;DSPOOL_DIR&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;\&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;/var/spool/newsd&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DCONFIG_FILE=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/etc/newsd.conf&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DSENDMAIL=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/usr/sbin/sendmail&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -g -c newsd.C&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;g&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Wall &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;DSPOOL_DIR&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;\&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;/var/spool/newsd&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DCONFIG_FILE=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/etc/newsd.conf&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DSENDMAIL=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/usr/sbin/sendmail&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -g -c Subs.C&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;g&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Wall &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;DSPOOL_DIR&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;\&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;/var/spool/newsd&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DCONFIG_FILE=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/etc/newsd.conf&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DSENDMAIL=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/usr/sbin/sendmail&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -g -c Article.C&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;g&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Wall &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;DSPOOL_DIR&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;\&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;/var/spool/newsd&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DCONFIG_FILE=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/etc/newsd.conf&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DSENDMAIL=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/usr/sbin/sendmail&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -g -c Configuration.C&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;g&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Wall &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;DSPOOL_DIR&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;\&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;/var/spool/newsd&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DCONFIG_FILE=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/etc/newsd.conf&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DSENDMAIL=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/usr/sbin/sendmail&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -g -c Group.C&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;g&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Wall &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;DSPOOL_DIR&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;\&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;/var/spool/newsd&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DCONFIG_FILE=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/etc/newsd.conf&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -DSENDMAIL=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/usr/sbin/sendmail&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; -g -c Server.C&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;g&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Wall  newsd&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;o Subs&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;o Article&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;o Configuration&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;o Group&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;o Server&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;o &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;o newsd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pod2man &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;center &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;newsd Documentation&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;section&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;8&lt;/span&gt; newsd&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;pod      &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt; newsd&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pod2man &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;center &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;newsd Documentation&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;section&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;8&lt;/span&gt; newsd&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;conf&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;pod &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt; newsd&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;conf&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pod2html newsd&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;pod      &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt; newsd&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;html&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pod2html newsd&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;conf&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;pod &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt; newsd&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;conf&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;html&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;前台调试模式：sudo ./newsd -d -f&#xA;后台守护进程：sudo ./newsd（日志输出至 ${LOG_DIR}/newsd.log）&lt;/p&gt;&#xA;&lt;h3 id=&#34;创建sendmail文件&#34;&gt;创建&lt;code&gt;sendmail&lt;/code&gt;文件&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo touch /usr/sbin/sendmail&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod a+x /usr/sbin/sendmail&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;创建新闻组&#34;&gt;创建新闻组&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo ./newsd -newgroup&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行这条命令后，程序会依次要求输入：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;组名&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;是否允许用户发件&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;字数限制（？）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;描述&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;管理员的邮箱&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;将所有帖子的副本密送到的邮箱&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;创建好后，运行&lt;code&gt;sudo ./newsd -d -f&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt; newsd started &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; V1&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;54&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt; start config summary &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: ErrorLog stderr&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: HostnameLookups off&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: Listen &lt;span style=&#34;color:#d699b6&#34;&gt;0.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;0.0&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;119&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: LogLevel debug&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: MaxClients &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: MaxLogSize &lt;span style=&#34;color:#d699b6&#34;&gt;1048576&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: SendMail &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;usr&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;sbin&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;sendmail &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;t&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: ServerName bongo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: SpamFilter &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: SpoolDir &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;var&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;spool&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;newsd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: Timeout &lt;span style=&#34;color:#d699b6&#34;&gt;43200&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: User news&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Jul &lt;span style=&#34;color:#d699b6&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;28&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;48&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2025&lt;/span&gt; newsd[&lt;span style=&#34;color:#d699b6&#34;&gt;38895&lt;/span&gt;]: &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt; end config summary &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中，我们需要注意的信息是监听地址，由于我这里是本地环境，是&lt;code&gt;0.0.0.0&lt;/code&gt;。这时用客户端连接这个地址，订阅刚刚创建的组就可以使用了。&lt;/p&gt;&#xA;&lt;p&gt;这个服务端自己搭着玩玩还是足够的，大规模还是要用其他的，不过现在大规模的新闻组肯定不多了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;附关于新闻组的文档资料hypermemo整理&#34;&gt;附：关于新闻组的文档资料（hypermemo整理）&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;nntp 协议的参考资料： &lt;a href=&#34;https://www.eyrie.org/~eagle/nntp/&#34;&gt;https://www.eyrie.org/~eagle/nntp/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;inn 文档（英文）：&lt;a href=&#34;https://www.eyrie.org/~eagle/software/inn/&#34;&gt;https://www.eyrie.org/~eagle/software/inn/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>对博客主题的一点想法</title>
      <link>https://blog.verdant.ee/posts/%E5%AF%B9%E5%8D%9A%E5%AE%A2%E4%B8%BB%E9%A2%98%E7%9A%84%E4%B8%80%E7%82%B9%E6%83%B3%E6%B3%95/</link>
      <pubDate>Thu, 10 Jul 2025 21:12:51 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E5%AF%B9%E5%8D%9A%E5%AE%A2%E4%B8%BB%E9%A2%98%E7%9A%84%E4%B8%80%E7%82%B9%E6%83%B3%E6%B3%95/</guid>
      <description>&lt;p&gt;简单回顾以下建站历程，博客的内容从“我是谁”转移到了&amp;quot;我想说什么&amp;quot;。从最早开始正式写博客的&lt;strong&gt;Gmeek&lt;/strong&gt;，到后来使用&lt;strong&gt;Typecho&lt;/strong&gt;，再到&lt;strong&gt;Hexo,Hugo&lt;/strong&gt;，这几个不同的时期是我对主题看法的不同阶段。&lt;/p&gt;&#xA;&lt;p&gt;Gmeek时期，没有概念，没看过几个人的博客，后来接触得多了，看了很多主题才意识到自己博客的主题有多简陋，换到Typecho，开始折腾主题，经历了一段不堪回首的时期。经典的一些元素：左下角挡字小人、底部音乐播放器、背景樱花飘落特效、点击特效，总之就是各种花里胡哨。文章，没有几篇，但是你可以在网页上找到任何你想找到的东西，除了文章。当时很喜欢Butterfly主题&lt;/p&gt;&#xA;&lt;p&gt;后来换到了Hexo，也有Butterfly，继续用。发现点二十个网站，三十个都是Butterfly，很尴尬，后来经过几经波折，换到了Maupassant，输出了几篇自认为有点内容的文章，主要还是有感而发，我写东西不在乎谁看了，谁怎么看。我只是享受编辑和发送的过程。有人说心情不好，就把让你不开心的事写在纸上然后团成球扔进垃圾桶。这样还是太浪费了，毕竟是自己亲笔写下的文字，另说浪费纸张也不好。&lt;/p&gt;&#xA;&lt;p&gt;在Hexo时期，我一直在寻找让读者弱化“我是谁”，专心聚焦与内容的主题。Maupassant就很好。后来转来Hugo，是看中了云风博客的那种千禧年的风格，不花哨，也不简陋。基于&lt;a href=&#34;http://jiaoyuan.org/&#34;&gt;JiaoYuan&lt;/a&gt;的移植后简单修改了以下配色之类，就正式投入使用。&lt;/p&gt;&#xA;&lt;p&gt;我认为，博客重在内容，想表达什么观点、想记录什么事件。毕竟Blog，Web Log，Log，日志，记录。除了记录，也可以是扩大自己声音的一个渠道，独立于平台，起码不会有&lt;strong&gt;跳墙的&lt;/strong&gt;删掉你辛辛苦苦打出来的一大段字。&lt;/p&gt;&#xA;&lt;p&gt;而把重心放到了“我是谁”的站点，应该算作“个人主页”，并非博客，用作于一些项目展示、网络名片也是很好的。&lt;/p&gt;&#xA;&lt;p&gt;而ta说“我是谁”，和自己观察“ta是谁“，是两种截然不同的感受。前者能迅速建立起一个停留于表层但具体的印象，而后者多出一种&lt;strong&gt;视奸&lt;/strong&gt;的快感。从字里行间里感受ta是什么人，虽然建立印象的周期长，但深入。值得。&lt;/p&gt;&#xA;&lt;p&gt;所以很多人博客的关于页面，我就当看个乐呵就过去了，仔细看每一篇文章，从ta的文字、观点、立场、价值观和认知来建立起ta的形象。有些人宏伟庄严，有些人冷漠麻木，有些人用平实朴素的语言记录，有些人用各种&lt;strong&gt;恶心到家的语气词和括号里补充的动作描写&lt;/strong&gt;，绞尽脑汁想怎么把自己表现得多可爱。想可爱，先从&lt;strong&gt;扮演人类&lt;/strong&gt;开始吧。这么在意别人怎么看自己，我替你感到疲惫。&lt;/p&gt;&#xA;&lt;p&gt;好吧，我承认我有点冒犯了，一些朋友看到标题是关于主题的点进来还躺枪，那对不起，我冒犯的就是你。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>使用Javascript TSS和Highlights构建一个文本阅读器</title>
      <link>https://blog.verdant.ee/posts/%E7%94%A8javascript-tss%E5%92%8Chighlights%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%8F%A5%E7%BA%A7%E6%96%87%E6%9C%AC%E9%98%85%E8%AF%BB%E5%99%A8/</link>
      <pubDate>Fri, 04 Jul 2025 10:46:53 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E7%94%A8javascript-tss%E5%92%8Chighlights%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%8F%A5%E7%BA%A7%E6%96%87%E6%9C%AC%E9%98%85%E8%AF%BB%E5%99%A8/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;原文：https://jsdev.space/tts-sentence-reader/&lt;/p&gt;&#xA;&lt;p&gt;翻译：Verdant&lt;a href=&#34;mailto:i@glowisle.me&#34;&gt;i@glowisle.me&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://jsdev.space/.netlify/images?url=_astro%2Ftts-sentence-reader.hV9whx3I.png&amp;amp;w=800&amp;amp;h=800&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;在这篇文章中，我们将构建一个简单的Web工具来探究&lt;strong&gt;Text-toSpeech(TTS)&lt;strong&gt;在JavaScript中是如何工作的。我们也将深入研究&lt;/strong&gt;句子级高亮&lt;/strong&gt;的工作逻辑。这两项功能经常结合在一起使用，以走到浏览器中打造无障碍的动态阅读体验。&lt;/p&gt;&#xA;&lt;p&gt;步骤:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;学习在浏览器中,TTS是如何工作的&lt;/li&gt;&#xA;&lt;li&gt;探究动态高亮句子的实现方法&lt;/li&gt;&#xA;&lt;li&gt;用HTML, CSS, JavaScript构建一个小工具(&lt;a href=&#34;https://codepen.io/jsdevspace/pen/YPXRRjO&#34;&gt;Demo &amp;amp; Code&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;-浏览器中的tts概述&#34;&gt;📢 浏览器中的TTS概述&lt;/h2&gt;&#xA;&lt;p&gt;JavaScript提供一个内置的API：&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis&#34;&gt;&lt;code&gt;SpeechSynthesis&lt;/code&gt;&lt;/a&gt;，它允许我们使用系统中的可用嗓音去大声朗读问文字。&lt;/p&gt;&#xA;&lt;h3 id=&#34;核心对象&#34;&gt;核心对象:&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;speechSynthesis&lt;/code&gt; — 控制播放、暂停、恢复、停止&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; — 作为TTS引擎的待播报文本&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;示例&#34;&gt;✨示例:&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; msg &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; SpeechSynthesisUtterance(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;Hello, world!&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;window&lt;/span&gt;.speechSynthesis.speak(msg);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;-添加嗓音和配置&#34;&gt;⚙️ 添加嗓音和配置&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; utter &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; SpeechSynthesisUtterance(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;This is a test&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; voices &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;window&lt;/span&gt;.speechSynthesis.getVoices();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;utter.voice &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; voices.find(v =&amp;gt; v.lang &lt;span style=&#34;color:#7a8478&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;en-US&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;utter.rate &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1.2&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;utter.pitch &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;window&lt;/span&gt;.speechSynthesis.speak(utter);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你也可以追踪朗读的开始和结束：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;utter.onstart &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; () =&amp;gt; console.log(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;Started speaking&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;utter.onend &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; () =&amp;gt; console.log(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;Finished speaking&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;-句子高亮&#34;&gt;✍️ 句子高亮&lt;/h2&gt;&#xA;&lt;p&gt;展示给用户哪一个句子正在阅读，我们需要用CSS和JavaScript来高亮文本。&lt;/p&gt;&#xA;&lt;h3 id=&#34;示例-html&#34;&gt;示例 HTML:&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;p&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;sentence&amp;#34;&lt;/span&gt;&amp;gt;First sentence.&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;sentence&amp;#34;&lt;/span&gt;&amp;gt;Second sentence.&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;p&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;处理高亮的css&#34;&gt;处理高亮的CSS:&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.sentence.active {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;background-color&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;yellow&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;font-weight&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;bold&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;javascript高亮逻辑&#34;&gt;JavaScript高亮逻辑：&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt; highlight(index) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.querySelectorAll(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;.sentence&amp;#39;&lt;/span&gt;).forEach((el, i) =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    el.classList.toggle(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt;, i &lt;span style=&#34;color:#7a8478&#34;&gt;===&lt;/span&gt; index);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;项目-使用tss和高亮的阅读器&#34;&gt;🚀项目: 使用TSS和高亮的阅读器&lt;/h1&gt;&#xA;&lt;p&gt;我们的程序将要：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;逐句朗读文本&lt;/li&gt;&#xA;&lt;li&gt;高亮朗读中的文本&lt;/li&gt;&#xA;&lt;li&gt;提供播放、暂停、恢复、停止&lt;/li&gt;&#xA;&lt;li&gt;让用户能选择嗓音&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;-html结构&#34;&gt;📄 HTML结构&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;html&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;lang&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;head&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;Build an interactive sentence-level text-to-speech reader with highlight, playback controls, and local progress tracking using HTML and JavaScript.&amp;#34;&lt;/span&gt; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;title&lt;/span&gt;&amp;gt;Interactive TTS Article Reader&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;title&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;head&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;body&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;h1&lt;/span&gt;&amp;gt;Read Along TTS Demo&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;h1&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;toolbar&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&amp;gt;Play&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;pause&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;disabled&lt;/span&gt;&amp;gt;Pause&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;resume&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;disabled&lt;/span&gt;&amp;gt;Resume&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;stop&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;disabled&lt;/span&gt;&amp;gt;Stop&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;reset&amp;#34;&lt;/span&gt;&amp;gt;Reset&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;select&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;voices&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;select&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;text-block&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;reader&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;line&amp;#34;&lt;/span&gt;&amp;gt;Learning to code is a never-ending journey.&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;line&amp;#34;&lt;/span&gt;&amp;gt;Technologies evolve rapidly, requiring constant adaptation.&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;line&amp;#34;&lt;/span&gt;&amp;gt;JavaScript, HTML, and CSS are essential tools for web development.&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;line&amp;#34;&lt;/span&gt;&amp;gt;Frameworks like React and Vue enhance front-end capabilities.&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;line&amp;#34;&lt;/span&gt;&amp;gt;Back-end skills with Node.js extend JavaScript to the server.&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;progress&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;progressText&amp;#34;&lt;/span&gt;&amp;gt;0/0&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;span&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;bar-fill&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;body&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#7a8478&#34;&gt;html&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;-css-样式&#34;&gt;🎨 CSS 样式&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;body&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;font-family&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;sans-serif&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;margin&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;padding&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;background&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;#f0f4f8&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;color&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;#333&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;h1&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;text-align&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;center&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;margin-bottom&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.toolbar {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;display&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;flex&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;justify-content&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;center&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;flex-wrap&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;wrap&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;gap&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;margin-bottom&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.toolbar &lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.toolbar &lt;span style=&#34;color:#7a8478&#34;&gt;select&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;padding&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;0.6&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1.2&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;border-radius&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;px&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;border&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;none&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;font-size&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.toolbar &lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;background&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;#0077cc&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;color&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;white&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;cursor&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;pointer&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.toolbar &lt;span style=&#34;color:#7a8478&#34;&gt;button&lt;/span&gt;:disabled {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;background&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;#ccc&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;cursor&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;not-allowed&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.text-block {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;background&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;white&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;padding&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;1.5&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;border-radius&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;px&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;box-shadow&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;px&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;px&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;rgba&lt;/span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;0.1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.line {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;display&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;block&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;margin-bottom&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;cursor&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;pointer&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;transition&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;background&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0.3&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;s&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.line:hover {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;background&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;#f9f9f9&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.line.active {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;background&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;#fff3cd&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;font-weight&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;bold&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.progress {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;text-align&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;center&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;margin-top&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.bar {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;height&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;px&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;width&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;%&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;background&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;#eee&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;border-radius&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;px&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;overflow&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;hidden&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.bar-fill {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;height&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;%&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;width&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;background&lt;/span&gt;: &lt;span style=&#34;color:#d699b6&#34;&gt;linear-gradient&lt;/span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;to&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;right&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;#0077cc&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;#005fa3&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;transition&lt;/span&gt;: &lt;span style=&#34;color:#e67e80&#34;&gt;width&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0.3&lt;/span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;s&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;-javascript逻辑&#34;&gt;💡 JavaScript逻辑&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; lines &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.querySelectorAll(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;.line&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; playBtn &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;start&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; pauseBtn &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;pause&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; resumeBtn &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;resume&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; stopBtn &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;stop&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; resetBtn &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;reset&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; voiceSelect &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;voices&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; progressText &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;progressText&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; progressBar &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;bar&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; synth &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;window&lt;/span&gt;.speechSynthesis;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;let&lt;/span&gt; voices &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; [];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;let&lt;/span&gt; currentIndex &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;let&lt;/span&gt; currentUtterance &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;null&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;let&lt;/span&gt; isPaused &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;false&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt; populateVoices() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  voices &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; synth.getVoices();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  voiceSelect.innerHTML &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  voices.forEach((voice, index) =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; opt &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;document&lt;/span&gt;.createElement(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;option&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    opt.value &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; index;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    opt.textContent &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;voice.name&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; (&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;voice.lang&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;)`&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    voiceSelect.appendChild(opt);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;synth.onvoiceschanged &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; populateVoices;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;populateVoices();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt; updateUI() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  progressText.textContent &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;currentIndex &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;lines.length&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;`&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  progressBar.style.width &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;((currentIndex &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; lines.length) &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;%`&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt; highlightLine(index) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  lines.forEach((line, i) =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    line.classList.toggle(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt;, i &lt;span style=&#34;color:#7a8478&#34;&gt;===&lt;/span&gt; index);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  lines[index]&lt;span style=&#34;color:#7a8478&#34;&gt;?&lt;/span&gt;.scrollIntoView({ behavior&lt;span style=&#34;color:#7a8478&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;smooth&amp;#39;&lt;/span&gt;, block&lt;span style=&#34;color:#7a8478&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt; });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt; speakLine(index) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (index &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;=&lt;/span&gt; lines.length) &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; text &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; lines[index].textContent;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; utter &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; SpeechSynthesisUtterance(text);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; selected &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; voiceSelect.value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (voices[selected]) utter.voice &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; voices[selected];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  utter.rate &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  utter.onstart &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; () =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    highlightLine(index);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    playBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pauseBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;false&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    resumeBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stopBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;false&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  utter.onend &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; () =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#7a8478&#34;&gt;!&lt;/span&gt;isPaused) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      currentIndex&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (currentIndex &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;&lt;/span&gt; lines.length) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        speakLine(currentIndex);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      } &lt;span style=&#34;color:#e67e80&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        resetControls();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  currentUtterance &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; utter;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  synth.speak(utter);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  updateUI();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt; resetControls() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  playBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;false&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pauseBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  resumeBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  stopBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;playBtn.onclick &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; () =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  currentIndex &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  speakLine(currentIndex);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pauseBtn.onclick &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; () =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  synth.pause();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  isPaused &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pauseBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  resumeBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;false&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;resumeBtn.onclick &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; () =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  synth.resume();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  isPaused &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;false&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pauseBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;false&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  resumeBtn.disabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stopBtn.onclick &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; () =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  synth.cancel();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  resetControls();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;resetBtn.onclick &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; () =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  synth.cancel();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  currentIndex &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  highlightLine(currentIndex);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  updateUI();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines.forEach((line, index) =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  line.addEventListener(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;click&amp;#39;&lt;/span&gt;, () =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    synth.cancel();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    currentIndex &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; index;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    speakLine(currentIndex);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;updateUI();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;-它们如何工作&#34;&gt;✅ 它们如何工作&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;每一个句子都是&lt;code&gt;&amp;lt;span class=&amp;quot;sentence&amp;quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;我们迭代句子并使用&lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt;大声朗读&lt;/li&gt;&#xA;&lt;li&gt;在朗读过程中，高亮正确的文本并滚动&lt;/li&gt;&#xA;&lt;li&gt;一个句子结束后，自动朗读下一个句子&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;-尾声&#34;&gt;🔚 尾声&lt;/h2&gt;&#xA;&lt;p&gt;阅读了本文，你理解了：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;浏览器TTS的运行原理&lt;/li&gt;&#xA;&lt;li&gt;如何实现动态高亮文本&lt;/li&gt;&#xA;&lt;li&gt;如何从零构建一个功能齐全的阅读界面&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;你可以扩展项目功能：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在&lt;code&gt;localStorage&lt;/code&gt;保存阅读进度&lt;/li&gt;&#xA;&lt;li&gt;添加进度条&lt;/li&gt;&#xA;&lt;li&gt;加载外部文章或用户输入&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>这可能是最好的Hexo图片管理方案</title>
      <link>https://blog.verdant.ee/posts/%E8%BF%99%E5%8F%AF%E8%83%BD%E6%98%AF%E6%9C%80%E5%A5%BD%E7%9A%84hexo%E5%9B%BE%E7%89%87%E7%AE%A1%E7%90%86%E6%96%B9%E6%A1%88/</link>
      <pubDate>Sun, 29 Jun 2025 10:52:05 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E8%BF%99%E5%8F%AF%E8%83%BD%E6%98%AF%E6%9C%80%E5%A5%BD%E7%9A%84hexo%E5%9B%BE%E7%89%87%E7%AE%A1%E7%90%86%E6%96%B9%E6%A1%88/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;通常在Hexo博客中，我们管理图片资源都有以下两种方案：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;在&lt;code&gt;_post&lt;/code&gt;目录下新建文章同名文件夹&lt;/li&gt;&#xA;&lt;li&gt;在&lt;code&gt;source&lt;/code&gt;目录下新建images文件夹，存放所有图片&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;两种方法各有优劣，前者方便查找但污染目录，后者集中管理但维护成本高。所以就诞生出本文要介绍的方法——&lt;code&gt;images&lt;/code&gt;目录下新建文章同名目录&lt;/p&gt;&#xA;&lt;p&gt;这是一个折中的办法，既保留方法1的查找方便，又保留方法2的集中性。&lt;/p&gt;&#xA;&lt;h2 id=&#34;实现方法&#34;&gt;实现方法&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;创建脚本文件&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在Hexo根目录的&lt;code&gt;scripts&lt;/code&gt;文件夹（若不存在则新建）下创建一个javascript脚本，我这里就命名为&lt;code&gt;auto-image-folder.js&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; fs &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; require(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;fs&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; path &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; require(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hexo.on(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;new&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt;(data) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; postName &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; path.basename(data.path, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; imageDir &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; path.join(hexo.source_dir, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;, postName)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#7a8478&#34;&gt;!&lt;/span&gt;fs.existsSync(imageDir)){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                fs.mkdirSync(imageDir, {recusive&lt;span style=&#34;color:#7a8478&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;效果测试&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hexo new &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;新文章&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这时候就在images目录下新建了一个与文章同名的文件夹。&lt;/p&gt;&#xA;&lt;h2 id=&#34;编辑器设置优化&#34;&gt;编辑器设置优化&lt;/h2&gt;&#xA;&lt;h3 id=&#34;typora&#34;&gt;Typora&lt;/h3&gt;&#xA;&lt;p&gt;打开Typora → 偏好设置 → 图像&lt;/p&gt;&#xA;&lt;p&gt;设置：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;插入图片时：复制到指定路径&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;自定义路径：../source/images/${filename}/&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;勾选：优先使用相对路径&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PS E:\blog&amp;gt; ls .\source\images\测试\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    目录: E:\blog\source\images\测试&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Mode                 LastWriteTime         Length Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;----                 -------------         ------ ----&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-a----         2025/6/29     11:14            229 image-20250629111411456.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;完成！&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>八下历史复习笔记</title>
      <link>https://blog.verdant.ee/posts/%E5%85%AB%E4%B8%8B%E5%8E%86%E5%8F%B2%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Thu, 26 Jun 2025 19:17:46 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E5%85%AB%E4%B8%8B%E5%8E%86%E5%8F%B2%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;ol&gt;&#xA;&lt;li&gt;临时宪法作用：《中国人民政治协商会议共同纲领》&lt;/li&gt;&#xA;&lt;li&gt;中国人民政治协商会议第一届全体会议确立的制度：中国共产党领导的多党合作和政治协商制度&lt;/li&gt;&#xA;&lt;li&gt;中国人民站立起来的标志：新中国成立&lt;/li&gt;&#xA;&lt;li&gt;中国半半社会结束的标志：新中国成立&lt;/li&gt;&#xA;&lt;li&gt;中国现代史开端：新中国成立&lt;/li&gt;&#xA;&lt;li&gt;祖国大陆统一，各族人民实现了大团结的标志：西藏和平解放&lt;/li&gt;&#xA;&lt;li&gt;抗美援朝目的：抗美援朝，保家卫国&lt;/li&gt;&#xA;&lt;li&gt;捍卫新中国安全，大大提高我国国际地位的事件：抗美援朝战争&lt;/li&gt;&#xA;&lt;li&gt;土地改革的依据：《中华人民共和国土地改革法》&lt;/li&gt;&#xA;&lt;li&gt;彻底摧毁我国存在2000多年的封建土地制度，消灭了地主阶级的标志：土地改革的完成&lt;/li&gt;&#xA;&lt;li&gt;新中国土改特点：采取保存富农经济，政治上中立富农的政策&lt;/li&gt;&#xA;&lt;li&gt;新中国成立后巩固政权的事件：西藏和平解放、抗美援朝、土地改革&lt;/li&gt;&#xA;&lt;li&gt;一五计划主要集中力量发展重工业&lt;/li&gt;&#xA;&lt;li&gt;使我国土地所有制从私有制变为公有制的事件是：三大改造的完成&lt;/li&gt;&#xA;&lt;li&gt;我国开始改变工业落后面貌，向社会主义工业化迈进的标志是：第一个五年计划的完成&lt;/li&gt;&#xA;&lt;li&gt;我国根本政治制度：人民代表大会制度&lt;/li&gt;&#xA;&lt;li&gt;人民代表大会制度确立的标志：第一届全国人民代表大会的召开&lt;/li&gt;&#xA;&lt;li&gt;我国第一部社会主义类型的、有史以来第一部真正反应人民利益的宪法：1954年《中华人民共和国宪法》&lt;/li&gt;&#xA;&lt;li&gt;我国社会主义改造的三个方面：农业、手工业、资本主义工商业&lt;/li&gt;&#xA;&lt;li&gt;我国社会主义改造的创举：赎买政策&lt;/li&gt;&#xA;&lt;li&gt;进入社会主义初级阶段的标志：三大改造的基本完成&lt;/li&gt;&#xA;&lt;li&gt;社会主义基本制度在我国建立起的标志：三大改造的完成&lt;/li&gt;&#xA;&lt;li&gt;三大改造实质：生产资料转变为社会主义公有制&lt;/li&gt;&#xA;&lt;li&gt;三年经济困难是指1956-1961年为克服经济困难提出的&lt;code&gt;调整、巩固、充实、提高&lt;/code&gt;的八字方针&lt;/li&gt;&#xA;&lt;li&gt;1958年，社会主义建设中出现的曲折和失误是：“大跃进”和人民公社化运动&lt;/li&gt;&#xA;&lt;li&gt;新中国成立后经历的最严重的挫折是：文化大革命&lt;/li&gt;&#xA;&lt;li&gt;文化大革命中最大冤案的受害者：刘少奇&lt;/li&gt;&#xA;&lt;li&gt;1967年6月，我国成功爆炸了第一颗氢弹&lt;/li&gt;&#xA;&lt;li&gt;1970年4月，我国成功发射了第一颗人造地球卫星&lt;/li&gt;&#xA;&lt;li&gt;1973年，我国在世界上首次培育成功强优势的籼型杂交水稻&lt;/li&gt;&#xA;&lt;li&gt;我国在社会主义建设火热年代涌现的英雄人物：王进喜、焦裕禄、雷锋&lt;/li&gt;&#xA;&lt;li&gt;中国共产党开辟的符合中国国情的道路是：中国特色社会主义道路&lt;/li&gt;&#xA;&lt;li&gt;新中国成立后一场深刻的思想解放运动是：真理标准问题大讨论&lt;/li&gt;&#xA;&lt;li&gt;新中国成立以来党的历史上具有深远意义的伟大转折是：中共十一届三中全会&lt;/li&gt;&#xA;&lt;li&gt;开启了改革开放和社会主义新时期的事件是：中共十一届三中全会的召开&lt;/li&gt;&#xA;&lt;li&gt;作出把党和国家工作中心转移到经济建设上来、实行改革开放的历史性决策的会议：中共十一届三中全会&lt;/li&gt;&#xA;&lt;li&gt;党和政府对农村实行的改革是：实行家庭联产承包责任制&lt;/li&gt;&#xA;&lt;li&gt;家庭联产承包责任制最早在安徽凤阳小岗村实行&lt;/li&gt;&#xA;&lt;li&gt;为农民致富和实现现代化开辟出的一条新道路是：发展农村乡镇企业&lt;/li&gt;&#xA;&lt;li&gt;城市经济体质改革的中心环节：增强企业活力&lt;/li&gt;&#xA;&lt;li&gt;提出要建立社会主义市场经济体质的会议：中共十四大&lt;/li&gt;&#xA;&lt;li&gt;我国经济特区的代表和对外开放的窗口：深圳&lt;/li&gt;&#xA;&lt;li&gt;1980开放的四个经济特区是：深圳、珠海、汕头、厦门&lt;/li&gt;&#xA;&lt;li&gt;对外开放的意义：引进外资技术、扩大对外影响、为改革开放探路&lt;/li&gt;&#xA;&lt;li&gt;我国对外开放的格局：经济特区&amp;ndash;沿海开放城市&amp;ndash;沿海经济开放区&amp;ndash;内地&lt;/li&gt;&#xA;&lt;li&gt;对外开放的特点：全方位、多层次、宽领域&lt;/li&gt;&#xA;&lt;li&gt;为我国参与经济全球化开辟了新途径的事件：中国加入世界贸易组织&lt;/li&gt;&#xA;&lt;li&gt;提出“建设有中国特色的社会主义”的会议是：中共十二大&lt;/li&gt;&#xA;&lt;li&gt;阐述了社会主义初级阶段的理论，明确概括了党在社会主义初级阶段的基本路线的会议是：中共十三大&lt;/li&gt;&#xA;&lt;li&gt;1992年进一步解放了人们的思想，推动改革开放和社会主义现代化建设进入新阶段的是：邓小平南方谈话&lt;/li&gt;&#xA;&lt;li&gt;我国改革开放和社会主义现代化的总设计师：邓小平&lt;/li&gt;&#xA;&lt;li&gt;马克思主义在中国发展的新阶段是：邓小平理论&lt;/li&gt;&#xA;&lt;li&gt;把邓小平理论确立为党的指导思想的会议是：中共十五大&lt;/li&gt;&#xA;&lt;li&gt;把江泽民三个代表重要思想确立为中国共产党指导思想的会议是：中共十六大&lt;/li&gt;&#xA;&lt;li&gt;把科学发展观确立为中国共产党的指导思想的会议是中共十八大&lt;/li&gt;&#xA;&lt;li&gt;习近平新时代中国特色社会主义思想被确立为中国共产党必须长期坚持的指导思想的会议是：中共十九大&lt;/li&gt;&#xA;&lt;li&gt;马克思主义中国化、时代化的新的飞跃是：习近平新时代中国特色社会主义思想&lt;/li&gt;&#xA;&lt;li&gt;为了实现中国梦，中国共产党实现的奋斗目标是：“两个一百年”奋斗目标&lt;/li&gt;&#xA;&lt;li&gt;中共十八届五中全会提出的新发展理念是：创新、协调、绿色、开放、共享&lt;/li&gt;&#xA;&lt;li&gt;宣布我国实现了第一个百年奋斗目标，全面建成小康社会的会议是：庆祝中国共产党成立100周年大会&lt;/li&gt;&#xA;&lt;li&gt;重点总结新时代党和国家取得的历史性成就，发生的历史性变革和积累的新鲜经验的会议是：中共十九届六中全会&lt;/li&gt;&#xA;&lt;li&gt;做出了统筹推进“五位一体”总体布局、协调推进“四个全面”战略布局全面部署的会议是：中共二十大&lt;/li&gt;&#xA;&lt;li&gt;为解决我国民族问题确立的基本政策和基本政治制度是：民族区域自治制度&lt;/li&gt;&#xA;&lt;li&gt;我国建立的第一个自治区：内蒙古自治区&lt;/li&gt;&#xA;&lt;li&gt;20世纪末，我国实行的为民族地区加快发展，创造了巨大的历史机遇的政策是：西部大开发&lt;/li&gt;&#xA;&lt;li&gt;邓小平从维护祖国和中华民族根本利益出发，提出的伟大构想是：“一国两制”伟大构想&lt;/li&gt;&#xA;&lt;li&gt;香港回归：1997.7.1&lt;/li&gt;&#xA;&lt;li&gt;澳门回归：1999.12.20&lt;/li&gt;&#xA;&lt;li&gt;中国人民洗雪了百年国耻，在完成祖国统一大业的道路上迈出的重要一步的标志是：香港、澳门的回归&lt;/li&gt;&#xA;&lt;li&gt;改革开放后对台基本方针：和平统一、一国两制&lt;/li&gt;&#xA;&lt;li&gt;海峡两岸近四十年的隔绝状态终于被打破，两岸关系发生了历史性变化的事件：台湾当局开始被迫调整“三不”政策&lt;/li&gt;&#xA;&lt;li&gt;标志海峡两岸关系的发展迈出历史性的重要一步的事件是：海基会与海协会达成九二共识&lt;/li&gt;&#xA;&lt;li&gt;九二共识的内涵：海峡两岸均坚持一个中国原则&lt;/li&gt;&#xA;&lt;li&gt;全面阐述了新时代解决台湾问题的总体方略的文件是：《台湾问题与新时代中国统一事业》白皮书&lt;/li&gt;&#xA;&lt;li&gt;中共二十大进一步强调实现两岸统一的最佳方式是：“和平统一、一国两制”方针&lt;/li&gt;&#xA;&lt;li&gt;中国人民解放军的第一支海军部队是：华东军区海军&lt;/li&gt;&#xA;&lt;li&gt;2012.9我国的第一艘航空母舰：辽宁舰&lt;/li&gt;&#xA;&lt;li&gt;中国战略威慑的核心力量：导弹部队&lt;/li&gt;&#xA;&lt;li&gt;2015年，第二炮兵部队更名为火箭军&lt;/li&gt;&#xA;&lt;li&gt;我国的五大军种：陆军、海军、空军、火箭军、战略支援部队&lt;/li&gt;&#xA;&lt;li&gt;五大战区：东部、南部、西部、中部战区&lt;/li&gt;&#xA;&lt;li&gt;形成的新格局：形成中央军委指导下的陆军、海军、空军、火箭军等军种，军事航天不对、网络空间部队、信息支援部队、通勤保障部队等兵种的新型兵种结构布局&lt;/li&gt;&#xA;&lt;li&gt;新中国成立后奉行的外交政策：独立自主的和平外交政策&lt;/li&gt;&#xA;&lt;li&gt;周恩来提出的处理国与国之间关系的基本准测：和平共处五项原则&lt;/li&gt;&#xA;&lt;li&gt;和平共处五项原则的内容：互相尊重主权和领土完整、互不侵犯、互不干涉内政、平等互利、和平共处&lt;/li&gt;&#xA;&lt;li&gt;1955年万隆会议召开的地点：印度尼西亚&lt;/li&gt;&#xA;&lt;li&gt;万隆会议地位：第一次没有西方殖民主义国家参加的亚非会议&lt;/li&gt;&#xA;&lt;li&gt;万隆会议上周恩来提出的外交方针：“求同存异”方针&lt;/li&gt;&#xA;&lt;li&gt;20世纪70年代，中国外交取得重大胜利的事件：中华人民共和国回复在联合国的合法席位&lt;/li&gt;&#xA;&lt;li&gt;中美关系开始走向正常化的标志是：中美双方签署并发表了《联合公报》&lt;/li&gt;&#xA;&lt;li&gt;中国特色大国外交全面推进，形成的外交布局是：全方位、多层次、立体化&lt;/li&gt;&#xA;&lt;li&gt;1989年成立的亚洲太平洋地区的经济合作机制，中国与1991年加入亚太经合组织&lt;/li&gt;&#xA;&lt;li&gt;我国成功发射的第一课人造地球卫星：东方红一号&lt;/li&gt;&#xA;&lt;li&gt;为两弹的研究做出突出贡献的科学家代表有：钱学森、邓稼先&lt;/li&gt;&#xA;&lt;li&gt;我国首位乘坐神舟五号载人飞船升入太空的宇航员是：杨利伟&lt;/li&gt;&#xA;&lt;li&gt;成功培育籼型杂交水稻，被称为杂交水稻之父的科学家是：袁隆平&lt;/li&gt;&#xA;&lt;li&gt;领导科研团队发现青蒿素，获得2015年诺贝尔生理学或医学奖的中国药学家是：屠呦呦&lt;/li&gt;&#xA;&lt;li&gt;2012年获得诺贝尔文学奖的中国作家：莫言&lt;/li&gt;&#xA;&lt;li&gt;1956年，毛泽东提出在科学文化工作中实行“百花齐放、百家争鸣”的方针&lt;/li&gt;&#xA;&lt;li&gt;新中国成立后，使我国人民衣食住行方面发生巨大变化的政策是：改革开放&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</description>
    </item>
    <item>
      <title>会考地理复习笔记</title>
      <link>https://blog.verdant.ee/posts/%E4%BC%9A%E8%80%83%E5%9C%B0%E7%90%86%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Sun, 22 Jun 2025 08:49:40 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E4%BC%9A%E8%80%83%E5%9C%B0%E7%90%86%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;h2 id=&#34;地球公转自转与季节气候&#34;&gt;地球公转自转与季节气候&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;东西半球分界线：20W 160E&lt;/li&gt;&#xA;&lt;li&gt;地球自转方向：自西向东&lt;/li&gt;&#xA;&lt;li&gt;南北半球季节相反&lt;/li&gt;&#xA;&lt;li&gt;夏至日太阳直射北回归线，北半球昼最长也最短，南半球昼最短夜最长，北极圈及其以北极昼，南极圈以其南极夜&lt;/li&gt;&#xA;&lt;li&gt;冬至日太阳直射南回归线，北半球昼最短夜最长，南半球昼最长夜最短，北极圈及其以北极夜，南极圈及其以南极昼&lt;/li&gt;&#xA;&lt;li&gt;春分秋分，太阳直射赤道，昼夜等长&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250622085510.webp&#34; alt=&#34;地球公转示意图&#34;&gt;&#xA;    &lt;figcaption&gt;地球公转示意图&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/li&gt;&#xA;&lt;li&gt;根据各地获得太阳光照的多少，把地球表面分为五个带：&lt;strong&gt;热带、北温带、南温带、北寒带、南寒带&lt;/strong&gt;&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250622085617.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;地图&#34;&gt;地图&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;比例尺=图上距离/实地距离，指示表大多指向正北方向&lt;/li&gt;&#xA;&lt;li&gt;同一条等高线上的海拔相同；等高线越密集，坡度越陡；等高线越稀疏，坡度越缓。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;等高线上不同的山体部位&lt;/strong&gt;&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250622085815.webp&#34; alt=&#34;山峰&#34;&gt;&#xA;    &lt;figcaption&gt;山峰&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;山峰：等高线闭合，数值从中间向四周递减&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250622085858.webp&#34; alt=&#34;山脊&#34;&gt;&#xA;    &lt;figcaption&gt;山脊&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/li&gt;&#xA;&lt;li&gt;山脊：等高线的弯曲部分向低处突出&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250622090016.webp&#34; alt=&#34;山谷&#34;&gt;&#xA;    &lt;figcaption&gt;山谷&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/li&gt;&#xA;&lt;li&gt;山谷：等高线的弯曲部分向高处突出，常形成河流&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250622090117.webp&#34; alt=&#34;陡崖&#34;&gt;&#xA;    &lt;figcaption&gt;陡崖&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/li&gt;&#xA;&lt;li&gt;陡崖：等高线重叠，适合开展攀岩运动&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;陆地表面的地形类型&lt;/strong&gt;&#xA;1.高原：海拔在500米以上，面积较大，外围较陡，内部起伏较为缓和&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;大洲分界线&lt;/strong&gt;&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250622090805.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;亚欧分界线：乌拉尔山脉、乌拉尔和、厉害、大高加索山脉、黑海、土耳其海峡&lt;/li&gt;&#xA;&lt;li&gt;亚非分界线：苏伊士运河&lt;/li&gt;&#xA;&lt;li&gt;北美南美分界线：巴拿马运河&lt;/li&gt;&#xA;&lt;li&gt;欧非分界线：直布罗陀海峡&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;板块构造学说&#34;&gt;板块构造学说&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;板块内部地壳比较稳定；板块与板块交界的地带，地壳比较活跃，多火山地震&lt;/li&gt;&#xA;&lt;li&gt;在板块交界处，两个板块发生张烈，。常常形成裂谷或海洋；两个板块发生碰撞，在陆地常常形成山脉&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250622091156.webp&#34; alt=&#34;六大板块分布示意图&#34;&gt;&#xA;    &lt;figcaption&gt;六大板块分布示意图&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/li&gt;&#xA;&lt;li&gt;世界上许多高大绵长的山脉主要分布在板块挤压碰撞的地带，如阿尔卑斯——喜马拉雅山系，科迪勒拉山系等&lt;/li&gt;&#xA;&lt;li&gt;世界上的火山和地震也集中分布在地壳比较活跃的板块交界地带，例如环太平洋地带和地中海——喜马拉雅地带&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250622091407.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</description>
    </item>
    <item>
      <title>Tmux配置记录</title>
      <link>https://blog.verdant.ee/posts/tmux%E9%85%8D%E7%BD%AE%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Sat, 21 Jun 2025 14:19:36 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/tmux%E9%85%8D%E7%BD%AE%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;p&gt;TMux 是终端复用神器，让你在一个终端窗口管理多个会话、窗口和窗格。&lt;/p&gt;&#xA;&lt;p&gt;基础操作：启动Tmux&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tmux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以我选择在&lt;code&gt;~/.bashrc&lt;/code&gt;里加上这句，每次打开终端都会自动进入tmux。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;需要掌握的概念&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;会话（Session）：长期运行的终端环境。&lt;/li&gt;&#xA;&lt;li&gt;窗口（Window）：会话中的标签页。&lt;/li&gt;&#xA;&lt;li&gt;窗格（Pane）：窗口中的分屏。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;默认快捷键：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;操作&lt;/th&gt;&#xA;          &lt;th&gt;快捷键&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;会话管理&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;脱离会话&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b d&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;后台运行会话&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;查看会话列表&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b s&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;方向键选择并进入&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;重命名当前会话&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b $&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;窗口管理&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;新建窗口&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b c&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;关闭当前窗口&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b &amp;amp;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;切换窗口&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b 0~9&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;切换到指定编号窗口&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;窗口列表&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b w&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;可视化选择窗口&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;窗格管理&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;水平分割窗格&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b &amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;垂直分割窗格&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b %&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;切换窗格&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b 方向键&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;关闭当前窗格&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b x&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;最大化/恢复窗格&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Ctrl+b z&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;临时全屏当前窗格&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;配置自定义（~/.tmux.conf）&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set-option -g default-shell /bin/bash   # 强制使用 Bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set-option -g default-command /bin/bash # 确保新会话/Pane 也使用 Bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unbind H   # 移除 H 的绑定&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unbind L   # 移除 L 的绑定&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 启用鼠标支持&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set -g mouse on&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 键&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set -g prefix C-w&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unbind C-b&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bind -r Left previous-window     # 前缀键+←：左移窗口&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bind -r Right next-window        # 前缀键+→：右移窗口&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 屏幕分割&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bind v split-window -h # 前缀键+v垂直分割&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bind -n C-Left resize-pane -L 5   # Ctrl+←：向左扩大窗格 5 单位&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bind -n C-Right resize-pane -R 5  # Ctrl+→：向右扩大窗格 5 单位&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ________________&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; fuck you tmux! &amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ----------------&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        \   ^__^&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         \  (oo)\_______&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (__)\       )\/\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ||----w |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ||     ||&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>给比我岁数还大的电脑装Fedora</title>
      <link>https://blog.verdant.ee/posts/%E7%BB%99%E6%AF%94%E6%88%91%E5%B2%81%E6%95%B0%E8%BF%98%E5%A4%A7%E7%9A%84%E7%94%B5%E8%84%91%E8%A3%85fedora/</link>
      <pubDate>Fri, 13 Jun 2025 20:11:49 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E7%BB%99%E6%AF%94%E6%88%91%E5%B2%81%E6%95%B0%E8%BF%98%E5%A4%A7%E7%9A%84%E7%94%B5%E8%84%91%E8%A3%85fedora/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/ccb6ab92150b3314a3cb09eee8102a56.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;印象中，这台电脑在我很小的时候就存在了，我爸的网盘里至今还有我当时用这台电脑播放江南Style，我在床上跳舞的视频。&lt;/p&gt;&#xA;&lt;p&gt;这台机子开Powershell都卡，更不用说日常使用。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/de5fce2eac7705b9df0d9a6e76ebf799.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;我甚至都不想在这台电脑上截图，当拍屏大师吧。&lt;/p&gt;&#xA;&lt;p&gt;听说Linux用户有个刻板印象就是，用着十几年前的笔记本，从来不用最新设备，那这不刚好吻合上了吗。&lt;/p&gt;&#xA;&lt;p&gt;诶&amp;hellip;&amp;hellip;等等，我&lt;a href=&#34;https://www.yingyu5658.me/post/3691550015/&#34;&gt;之前&lt;/a&gt;好像说过不折腾了？算了，反正Fedora没有Arch那么折腾（吧）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;正文&#34;&gt;正文&lt;/h2&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250613202911.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;镜像下好后，用Rufus拷到U盘。&lt;/p&gt;&#xA;&lt;p&gt;插到电脑上，额，先让我研究一下BIOS怎么进&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/25890eb0322bbe6620bd4edc0b9b9e9e.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;把#1改成刚刚做的启动盘。保存后重启。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/092ae6cfdd02bb72a2f02674392afdd6.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;哎，没想到第一难在这等着我呢。引导进不去。难道是我打开方式有问题？重新进BIOS，#1设置成UEFI巴拉巴拉试试。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/3c968f8512852e157f43355f88d53ed8.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;诶！成了，等一阵黑屏过后就弹Fedora Logo了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/b6cec1104a907293109eb1f94eb175c8.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;直接端上来吧！不管三七二十八直接Install！&lt;/p&gt;&#xA;&lt;p&gt;整个安装过程还是很傻瓜式的，只要有小学英文基础点点点就好了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/01b262c2846e87f4dcaa8726cbf2a347.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;虽然但是，这个简体中文怎么标的是新加坡。&lt;/p&gt;&#xA;&lt;p&gt;一顿等待后，进入系统让选择一下语言，连接个WIFI就算大功告成了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;del&gt;本来以为能有什么好玩的，还真这么傻瓜啊。。。&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;最后再来个经典的neofetch&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/34996156f7df6e00bd8f4a6139f9f3fb.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;系统也装完了，文章也写完了，电影也下完了，爽！&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;./Pasted%20image%2020250613211830.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>网络死亡计划</title>
      <link>https://blog.verdant.ee/posts/%E7%BD%91%E7%BB%9C%E6%AD%BB%E4%BA%A1%E8%AE%A1%E5%88%92/</link>
      <pubDate>Wed, 11 Jun 2025 23:24:42 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E7%BD%91%E7%BB%9C%E6%AD%BB%E4%BA%A1%E8%AE%A1%E5%88%92/</guid>
      <description>&lt;p&gt;最近要把生活重心和精力再往学业上分配更多，打算逐步减少社交软件的使用。因此产生了些许对自己在社交软件的某些群组上是否需要存在的焦虑。所以有了这个想法：&lt;strong&gt;在网络上死亡。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;具体应该说是在社交软件上的死亡。为期两周，直到期末考试结束。&lt;/p&gt;&#xA;&lt;p&gt;反正也不会有几个人关注我的博客，那就随便说说吧。如果你疑惑为什么我长时间装死，那看到这篇文章也就解答了。&lt;/p&gt;&#xA;&lt;p&gt;一直感觉很多社交都是热脸贴冷屁股，浪费时间浪费精力。如果长达两周我没有在某个我曾经经常发言的群发言，而且也没有人主动找我，那也就意味着我在那个群不重要，对那群人不重要，不是一个圈子，无共同话题，也就没有留下去的意义。&lt;/p&gt;&#xA;&lt;p&gt;主要包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;停止发布朋友圈和QQ空间&lt;/li&gt;&#xA;&lt;li&gt;停止在所有非必要微信QQ群发言&lt;/li&gt;&#xA;&lt;li&gt;多学习，多写博客，多读书&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果这样过得很舒服，那可能会一直延续下去。我一直在寻找真正有意义的社交圈和社交方式，但至今为止，觉得最有效的能让自己没那么累的方式就是减少社交。&lt;/p&gt;&#xA;&lt;p&gt;今后会把大部分生活琐事记录和观点表达转移到博客而非朋友圈和QQ空间。后者总是被动接受信息，不一定能找到共鸣，而前者是主动选择文章阅读，而且博客的性质能让人组织起完整的语言，客观地记录和表达；在QQ空间和微信发表出来总是有一种为了给某人看或为了给某些人看的味道，有些不舒服，也影响言语措辞。我这人变得越来越怪。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Emacs配置记录 2——C/C++环境配置</title>
      <link>https://blog.verdant.ee/posts/emacs%E9%85%8D%E7%BD%AE%E8%AE%B0%E5%BD%95-2c-c++%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/</link>
      <pubDate>Wed, 04 Jun 2025 18:58:37 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/emacs%E9%85%8D%E7%BD%AE%E8%AE%B0%E5%BD%95-2c-c++%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;经过&lt;a href=&#34;&#34;&gt;上一篇&lt;/a&gt;的简单调教，Emacs已经勉强变成了一个温顺的文本编辑器，但是离写代码这个宏大的目标还是有一段距离的，今天来解决主要问题：代码补全。由于我要写一点简单的C代码，那么重点就先放到C/CPP环境搭建中。&lt;/p&gt;&#xA;&lt;p&gt;站在巨人的肩膀上，在Emacs中的代码补全使用巨硬的LSP协议。&lt;/p&gt;&#xA;&lt;h2 id=&#34;spacemacs&#34;&gt;Spacemacs&lt;/h2&gt;&#xA;&lt;p&gt;经过考虑，我还是决定使用Spacemacs，比起原版Emacs，它更适合新手，也更能快速投入开发。避免配置陷阱，过多把时间花在刀把上。唉，也就是说，昨天大部分都白干了。算了，生命的意义就在于折腾，怕折腾我也不会玩Emacs了。来吧！&lt;/p&gt;&#xA;&lt;p&gt;先来安装一下Spacemacs。&#xA;&lt;code&gt;git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;重启Emacs，让他下载一下自带的包。&lt;/p&gt;&#xA;&lt;p&gt;上次没清理干净Spacemacs，不知道存在哪的备份还在，算是免去了一些折腾吧。来看看现在的Emacs都配置了什么。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   dotspacemacs-configuration-layers&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;#39;&lt;/span&gt;(yaml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     markdown&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     javascript&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (auto-completion &lt;span style=&#34;color:#e69875&#34;&gt;:variables&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      auto-completion-idle-delay &lt;span style=&#34;color:#d699b6&#34;&gt;0.01&lt;/span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 降低补全延迟&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      auto-completion-minimum-prefix-length &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (prettier &lt;span style=&#34;color:#e69875&#34;&gt;:variables&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               prettier-always-enable &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;)  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 保存时自动格式化&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (javascript &lt;span style=&#34;color:#e69875&#34;&gt;:variables&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 javascript-backend &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;lsp&lt;/span&gt;        &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 启用LSP后端&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 javascript-fmt-tool &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;prettier&lt;/span&gt;) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 格式化工具选Prettier&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (c-c++ &lt;span style=&#34;color:#e69875&#34;&gt;:variables&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            c-c++-backend &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;lsp-clangd&lt;/span&gt;)         &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; C/C++使用Clangd后端&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (vue &lt;span style=&#34;color:#e69875&#34;&gt;:variables&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          vue-backend &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;lsp&lt;/span&gt;)                    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; Vue使用LSP后端&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (html)                                    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; HTML/CSS支持&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (lsp)                                     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 必须的LSP核心支持层&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (auto-completion)                         &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 自动补全&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (syntax-checking)                         &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 语法检查&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; ----------------------------------------------------------------&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; Example of useful layers you may want to use right away.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; Uncomment some layer names and press `SPC f e R&amp;#39; (Vim style) or&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; `M-m f e R&amp;#39; (Emacs style) to install them.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; ----------------------------------------------------------------&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; auto-completion&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; better-defaults&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     emacs-lisp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     treemacs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; git&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     helm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     lsp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; markdown&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     multiple-cursors&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; org&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; (shell :variables&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;;        shell-default-height 30&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;;        shell-default-position &amp;#39;bottom)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; spell-checking&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; syntax-checking&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; version-control&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     treemacs)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;emmm，还是有点有用的。比如C/C++这里，就启用了LSP。还有一些之前搞的前端配置。就是不知道为啥，JavaScript的补全不太好使。&lt;/p&gt;&#xA;&lt;h2 id=&#34;语法检查&#34;&gt;语法检查&lt;/h2&gt;&#xA;&lt;p&gt;语法检查，选择当前比较成熟的flycheck，在Spacemacs中对应&lt;code&gt;syntax-checking&lt;/code&gt;，在.spacemacs中的&lt;code&gt;dotspacemacs-configuration-layers&lt;/code&gt;写入&lt;code&gt;(configuration-layer/declare-layer &#39;syntax-checking)&lt;/code&gt;&#xA;该层会自动集成Flycheck及其常见语言的后端支持。&lt;/p&gt;&#xA;&lt;p&gt;C/C++要安装&lt;code&gt;clang-tidy&lt;/code&gt;或&lt;code&gt;cppcheck&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;进阶配置&#34;&gt;进阶配置&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (with-eval-after-load &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;flycheck&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; flycheck-check-syntax-automatically &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;#39;&lt;/span&gt;(save mode-enabled) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; 保存时检查&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          flycheck-display-errors-delay &lt;span style=&#34;color:#d699b6&#34;&gt;0.5&lt;/span&gt;                        &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; 错误显示延迟&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          flycheck-indication-mode &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;right-fringe&lt;/span&gt;))                 &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; 错误标记位置&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;spacemacs-文件基本介绍&#34;&gt;&lt;a href=&#34;https://liuzhijun-source.github.io/spacemacs-14-days/#/Week01/Day05/day05_spacemacs%E7%9A%84%E8%BF%9B%E9%98%B6%E9%85%8D%E7%BD%AE_%E4%B8%8A?id=spacemacs-%e6%96%87%e4%bb%b6%e5%9f%ba%e6%9c%ac%e4%bb%8b%e7%bb%8d&#34;&gt;.spacemacs 文件基本介绍&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;.spacemacs 文件一般会自动生成在主目录下，这个文件是配置 Spacemacs 的入口，有关于 Spacemacs 本身的配置基本都能在里面进行修改，用户设置同样在这个文件中修改。&lt;/p&gt;&#xA;&lt;p&gt;.spacemacs 中，内容一般被分为以下几个部分，每个部分都封装在一个函数中：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;dotspacemacs/layers&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;在这里可以声明一些 layer，以及删除、增添一些包，在这里还可以调整 Spacemacs 加载时的一些行为&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;dotspacemacs/init&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Spacemacs 绝大部分的配置都位于此，你可以在此修改配置中可选的选项，但绝对不能将自己的用户配置代码添加在这里&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;dotspacemacs/user-init&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这里的内容会在 Emacs 启动前开始加载，一般在这里设置你需要使用的 elpa 源，你应该尽量把用户配置放在 &lt;code&gt;dotspacemacs/user-config&lt;/code&gt; 中&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;dotspacemacs/user-config&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;在这里可以添加你的用户配置代码，你自己的定义的大部分配置一般都在这里完成&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;dotspacemacs/emacs-custom-settings&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Spacemacs 自己生成的配置，同样不建议自己去修改&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;摘自&lt;a href=&#34;https://liuzhijun-source.github.io/spacemacs-14-days/#/Week01/Day05/day05_spacemacs%E7%9A%84%E8%BF%9B%E9%98%B6%E9%85%8D%E7%BD%AE_%E4%B8%8A&#34;&gt;Spacemaccs 14 Days&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
    <item>
      <title>我还是放不下Emacs！</title>
      <link>https://blog.verdant.ee/posts/%E6%88%91%E8%BF%98%E6%98%AF%E6%94%BE%E4%B8%8D%E4%B8%8Bemacs/</link>
      <pubDate>Tue, 03 Jun 2025 20:07:15 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E6%88%91%E8%BF%98%E6%98%AF%E6%94%BE%E4%B8%8D%E4%B8%8Bemacs/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;难受，真难受呀。作为一个痴迷Vim的人，总是被Emacs的强大勾引，看见别人配的酷炫全能的Emacs就走不动路，脑子里想着“没事没事，我Vim轻量启动极快，Emacs这种重量级是比不上的”，自我安慰。实际上多想玩Emacs只有我自己知道&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;我之前也试过&lt;a href=&#34;https://www.yingyu5658.me/post/2193909713/&#34;&gt;配Emacs&lt;/a&gt;，但是Windows搞出来的不伦不类还很卡的东西太难受，用WSL尝试了一下Spacemacs，搞不明白那个层机制，也对ELisp这个语言不熟悉（说实话到现在Lua的一些东西我都不明白），而且之前的配置也一直想一口吃个大胖子，一天内就配到IDE的强大程度，经过几次失败和Vim配置经验后，我深知这是不可能的，除非在我使用Emacs后N周年的第N周目重新删干净再配，也许能做到。&lt;/p&gt;&#xA;&lt;p&gt;定个小目标吧，每天配一点点，成果起码要达到以下程度：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;能胜任前端、Nodejs的开发&lt;/li&gt;&#xA;&lt;li&gt;能胜任CPP/C的开发&lt;/li&gt;&#xA;&lt;li&gt;能使用EAF浏览网页&lt;/li&gt;&#xA;&lt;li&gt;有一点花里胡哨的小功能&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;其实我也挺想把博客迁移到Emacs，完全用org-mode来写，Hexo越来越慢。其实Hugo也不是不行，就是不太熟悉也不喜欢Go。看了&lt;a href=&#34;https://liujiacai.net/&#34;&gt;刘家财大佬的博客&lt;/a&gt;后感觉这个也太酷了，主题我也很喜欢，但是评论功能可能有点折腾，我对评论系统也有点不太在意。最难割舍的是现在用的这个主题&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;刘家财老师是这样说的&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;只不过遗憾的是，即使写了近 10 年的博客，有价值的评论少之又少，可能中文互联网内没多少人认真写技术评论吧。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这点我确实认同，观察了一些博客的评论，真正讨论技术内容的没几个，大多都是在围观、附和。但是我的博客类型也不能算是纯技术博客，保持与读者的互动还是很有意思的。&lt;/p&gt;&#xA;&lt;p&gt;言归正传，我现在的Emacs在WSL里，装的是Spacemacs，能正常用eaf，但是写代码很难受，也没有补全，可以说现在它只能当一个浏览器用，我准备推翻重新配。&lt;/p&gt;&#xA;&lt;p&gt;那么，从现在开始，来配Emacs！！！&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://pavinberg.github.io/emacs-book/images/emacs-book/intro/learningCurve.jpg&#34; alt=&#34;各个编辑器学习曲线图&#34;&gt;&#xA;    &lt;figcaption&gt;各个编辑器学习曲线图&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;与过去挥手&#34;&gt;与过去挥手&lt;/h2&gt;&#xA;&lt;p&gt;在&lt;code&gt;rm -rf ~/.emacs.d&lt;/code&gt;后，那个不伦不类、上不去下不来的Emacs彻底成为了历史。重新输入Emacs，又看到熟悉又陌生的丑陋开屏页。&lt;/p&gt;&#xA;&lt;h2 id=&#34;小插曲&#34;&gt;小插曲&lt;/h2&gt;&#xA;&lt;p&gt;WSLg间歇性抽风，打不开GUI&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Display 10.255.255.254:0 unavailable, simulating -nw&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开管理员Powershell，运行&lt;code&gt;wsl --update&lt;/code&gt;&#xA;![[public/images/我还是放不下Emacs！/Pasted image 20250603210050.png]]&#xA;&lt;del&gt;我草，怎么这么慢？？&lt;/del&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;melpa配置&#34;&gt;MELPA配置&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;package&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-to-list &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;package-archives&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;melpa&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;https://melpa.org/packages/&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(package-initialize)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;切换中国镜像源&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;package&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; package-archives &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;gnu&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;http://mirrors.cloud.tencent.com/elpa/gnu/&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;melpa&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;http://mirrors.cloud.tencent.com/elpa/melpa/&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(package-initialize)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启Emacs，输入&lt;code&gt;package-list-packages&lt;/code&gt;就可以查看所有插件。&lt;code&gt;package-install&lt;/code&gt;，回车输入插件名就可以安装对应插件。&#xA;默认情况下，插件会被安装到 &lt;code&gt;~/.emacs.d/elpa/&lt;/code&gt; 目录下。&lt;/p&gt;&#xA;&lt;h2 id=&#34;use-package&#34;&gt;use-package&lt;/h2&gt;&#xA;&lt;p&gt;输入&lt;code&gt;package-install&lt;/code&gt;，输入&lt;code&gt;use-package&lt;/code&gt;，回车安装，然后在init.el中写&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(eval-when-compile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#b2c98f&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;use-package&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ivy&#34;&gt;ivy&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;use-package&lt;/span&gt; ivy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:init&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (ivy-mode &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (counsel-mode &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; ivy-use-virtual-buffers &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; search-default-mode &lt;span style=&#34;color:#b2c98f&#34;&gt;#&amp;#39;&lt;/span&gt;char-fold-to-regexp)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; ivy-count-format &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;(%d/%d) &amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:bind&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ((&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-s&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;swiper&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-x b&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;ivy-switch-buffer&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-c v&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;ivy-push-view&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-c s&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;ivy-switch-view&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-c V&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;ivy-pop-view&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-x C-@&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;counsel-mark-ring&lt;/span&gt;)&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 在某些终端上 C-x C-SPC 会被映射为 C-x C-@，比如在 macOS 上，所以要手动设置&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-x C-SPC&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;counsel-mark-ring&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e69875&#34;&gt;:map&lt;/span&gt; minibuffer-local-map&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-r&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; counsel-minibuffer-history)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;amx&#34;&gt;amx&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;use-package&lt;/span&gt; amx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:init&lt;/span&gt; (amx-mode))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ace-window&#34;&gt;ace-window&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;package&lt;/span&gt; ace&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;window&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; :ensure t&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; :&lt;span style=&#34;color:#b2c98f&#34;&gt;bind&lt;/span&gt; ((&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-x o&amp;#34;&lt;/span&gt; . &amp;#39;ace&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;window)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;mwim&#34;&gt;mwim&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;use-package&lt;/span&gt; mwim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:bind&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-a&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; mwim-beginning-of-code-or-line)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;C-e&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; mwim-end-of-code-or-line))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;undo-tree&#34;&gt;undo-tree&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;use-package&lt;/span&gt; undo-tree&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:init&lt;/span&gt; (global-undo-tree-mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:custom&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (undo-tree-auto-save-history &lt;span style=&#34;color:#d699b6&#34;&gt;nil&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;smart-mode-line&#34;&gt;smart-mode-line&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;use-package&lt;/span&gt; smart-mode-line&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:init&lt;/span&gt; (sml/setup))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;good-scroll&#34;&gt;good-scroll&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;use-package&lt;/span&gt; good-scroll&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:if&lt;/span&gt; window-system     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 在图形化界面时才使用这个插件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;:init&lt;/span&gt; (good-scroll-mode))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今天就先到这里吧。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Electron CommonJS require踩坑</title>
      <link>https://blog.verdant.ee/posts/electron-commonjs-require%E8%B8%A9%E5%9D%91/</link>
      <pubDate>Sat, 31 May 2025 09:07:36 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/electron-commonjs-require%E8%B8%A9%E5%9D%91/</guid>
      <description>&lt;p&gt;最近在开发一个Electron项目，在导入类的时候有以下报错:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1411&lt;/span&gt; Uncaught Error: Cannot find module &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;./File&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Require stack:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; E:\Develop\markdown&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;editor\src\html\index&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;html&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at Module&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;_resolveFilename (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1408&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;15&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at a&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;_resolveFilename (node:electron&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;js2c&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;renderer_init:&lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;2643&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at defaultResolveImpl (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1064&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;19&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at resolveForCJSWithHooks (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1069&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;22&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at Module&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;_load (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1218&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;37&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at c&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;_load (node:electron&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;js2c&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;node_init:&lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;17950&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at s&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;_load (node:electron&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;js2c&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;renderer_init:&lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;31718&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at TracingChannel&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;traceSync (node:diagnostics_channel:&lt;span style=&#34;color:#d699b6&#34;&gt;322&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;14&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at wrapModuleLoad (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;242&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;24&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at Module&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;require (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1494&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;提示找不到模块。&lt;/p&gt;&#xA;&lt;p&gt;Electron中，使用require语句导入，都是默认从项目跟目录开始查找，所以要拼接完整路径。使用绝对路径也是不行的，在IDE里可以跳转，但是一运行就是找不到模块&#xA;&lt;code&gt;const File = require(&amp;quot;src/js/File&amp;quot;)&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Uncaught Error: Cannot find module &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;src/js/File&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Require stack:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; E:\Develop\markdown&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;editor\src\html\index&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;html&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at Module&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;_resolveFilename (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1408&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;15&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at a&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;_resolveFilename (node:electron&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;js2c&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;renderer_init:&lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;2643&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at defaultResolveImpl (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1064&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;19&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at resolveForCJSWithHooks (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1069&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;22&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at Module&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;_load (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1218&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;37&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at c&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;_load (node:electron&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;js2c&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;node_init:&lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;17950&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at s&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;_load (node:electron&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;js2c&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;renderer_init:&lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;31718&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at TracingChannel&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;traceSync (node:diagnostics_channel:&lt;span style=&#34;color:#d699b6&#34;&gt;322&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;14&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at wrapModuleLoad (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;242&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;24&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    at Module&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;require (node:internal&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;modules&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;cjs&lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt;loader:&lt;span style=&#34;color:#d699b6&#34;&gt;1494&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;12&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;解决方法&#34;&gt;解决方法&lt;/h2&gt;&#xA;&lt;p&gt;使用path.join拼接完整路径&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; File &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; require(path.join(__dirname, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;../js/File.js&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;经过测试，只能用这种方法导入，太怪了&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>面向对象与面向过程的本质区别</title>
      <link>https://blog.verdant.ee/posts/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%BC%96%E7%A8%8B%E4%B8%8E%E9%9D%A2%E5%90%91%E8%BF%87%E7%A8%8B%E7%BC%96%E7%A8%8B%E7%9A%84%E6%9C%AC%E8%B4%A8%E5%8C%BA%E5%88%AB/</link>
      <pubDate>Thu, 29 May 2025 21:21:36 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%BC%96%E7%A8%8B%E4%B8%8E%E9%9D%A2%E5%90%91%E8%BF%87%E7%A8%8B%E7%BC%96%E7%A8%8B%E7%9A%84%E6%9C%AC%E8%B4%A8%E5%8C%BA%E5%88%AB/</guid>
      <description>&lt;p&gt;面向对象与面向过程这两种编程思想主要体现在一件事上：面向对象关心&lt;strong&gt;谁来做&lt;/strong&gt;，而面向过程关心&lt;strong&gt;做什么&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;举个例子，如果我现在要开发一个五子棋小游戏，在面向对象的思想中，实现步骤应该是这样的。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;有一个窗口对象，可以让我的游戏内容展示在里面&lt;/li&gt;&#xA;&lt;li&gt;创建棋盘对象&lt;/li&gt;&#xA;&lt;li&gt;初始化棋盘&lt;/li&gt;&#xA;&lt;li&gt;创建计分板对象&lt;/li&gt;&#xA;&lt;li&gt;初始化计分板&lt;/li&gt;&#xA;&lt;li&gt;玩家开始下棋，棋盘对象创建棋子对象，绘制出来&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;不难看出，面向对象就是在关心&lt;strong&gt;谁来做&lt;/strong&gt;，先关心哪个对象去做，再去研究这个对象要去&lt;strong&gt;怎么做&lt;/strong&gt;。抽象层级更高，但是符合人类的思维。从代码结构上来看，写面向对象更偏向在画一个树状图，一级一级划分谁要做什么事情，而面向过程更像一个线性的流程图，全程都在关心需要做什么事情。&lt;/p&gt;&#xA;&lt;p&gt;更官方地说，面向对象以算法和流程为核心，强调步骤拆解。而面向对象以与对象交互为核心，强调责任分配&lt;/p&gt;&#xA;&lt;p&gt;当然，写法在语言上就有所限定。C更适合面向过程，头文件的引用使用函数做事就意味着C很难实现面向对象的设计模式，当然有一些比较邪门的技巧，容易开枪把自己脚指头崩掉，比如&lt;code&gt;void*&lt;/code&gt;模拟泛型这种不在本文讨论范围。&lt;/p&gt;&#xA;&lt;p&gt;C缺乏类、继承等基础语法支持，但可以用结构体加函数指针简单模拟对象，但设计难度有所增加，调试难度更有所增加。面向过程更适合处理逻辑简单的任务或算法密集型任务，而面向对象更适合构建GUI应用等复杂系统。&lt;/p&gt;&#xA;&lt;p&gt;面向对象并非在所有情况下都是最优选择。还是需要依据开发项目的实际需求考量。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>【数据结构与算法】哈希表</title>
      <link>https://blog.verdant.ee/posts/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E5%93%88%E5%B8%8C%E8%A1%A8/</link>
      <pubDate>Wed, 28 May 2025 21:44:28 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E5%93%88%E5%B8%8C%E8%A1%A8/</guid>
      <description>&lt;p&gt;哈希表（Hash Table）是一种基于键（Key）直接访问数据的高效数据结构，其核心思想是通过哈希函数将键映射到数组的特定位置，从而实现平均时间复杂度为 O(1)O(1) 的插入、查找和删除操作。&lt;/p&gt;&#xA;&lt;h2 id=&#34;结构定义&#34;&gt;结构定义&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 哈希表节点&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;struct&lt;/span&gt; HashNode {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; key;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;struct&lt;/span&gt; Hashcode&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; next;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} HashNode;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 哈希表&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;struct&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; size;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    HashNode&lt;span style=&#34;color:#7a8478&#34;&gt;**&lt;/span&gt; buckets;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} HashTable;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;初始化&#34;&gt;初始化&lt;/h2&gt;&#xA;&lt;p&gt;创建HashTable结构体变量，进行初始化赋值，分配桶的内存。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 初始化哈希表&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HashTable &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;creat_hash_table&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; size)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    HashTable&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; table &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; (HashTable&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#b2c98f&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(HashTable));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;size &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; size;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;buckets &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; (HashNode&lt;span style=&#34;color:#7a8478&#34;&gt;**&lt;/span&gt;)&lt;span style=&#34;color:#b2c98f&#34;&gt;malloc&lt;/span&gt;(size &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(HashNode&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;&lt;/span&gt; size; i&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;buckets[i] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;NULL&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; table;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;哈希函数&#34;&gt;哈希函数&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 哈希函数&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;hash&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; key, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; size)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; key &lt;span style=&#34;color:#7a8478&#34;&gt;%&lt;/span&gt; size;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过简单取模运算获得哈希值&lt;/p&gt;&#xA;&lt;h2 id=&#34;插入&#34;&gt;插入&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 插入&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;insert&lt;/span&gt;(HashTable &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;table, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; key, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; value)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; index &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;hash&lt;/span&gt;(key, table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;size);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    HashNode &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;newNode &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; (HashNode &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#b2c98f&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(HashNode));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    newNode&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;key &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; key;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    newNode&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;value &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    newNode&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;NULL&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 插入链表头部，避免遍历链表&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;buckets[index] &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;NULL&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;buckets[index] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; newNode;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        newNode&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;buckets[index];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;buckets[index] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; newNode;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;头插法无需遍历到尾部。&lt;/p&gt;&#xA;&lt;h2 id=&#34;查找&#34;&gt;查找&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 查找&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;search&lt;/span&gt;(HashTable &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;table, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; key)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; index &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;hash&lt;/span&gt;(key, table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;size);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    HashNode &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;current &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;buckets[index];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;while&lt;/span&gt; (current &lt;span style=&#34;color:#7a8478&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;NULL&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (current&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;key &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; key)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; current&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        current &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; current&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;next;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;删除&#34;&gt;删除&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;deleate&lt;/span&gt;(HashTable&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; table, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; key)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; index &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;hash&lt;/span&gt;(key, table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;size);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HashNode&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; current &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;buckets[index];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HashNode&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; prev &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;NULL&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#e67e80&#34;&gt;while&lt;/span&gt;(current &lt;span style=&#34;color:#7a8478&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;NULL&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt;(current&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;key &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; key)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt;(prev &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;NULL&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;table&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;buckets[index] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; current&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;next;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#e67e80&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;prev&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; current&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;next;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#b2c98f&#34;&gt;free&lt;/span&gt;(current);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;prev &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; current;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;current &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; current&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;next;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>【数据结构与算法】众数、中位数</title>
      <link>https://blog.verdant.ee/posts/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E4%BC%97%E6%95%B0%E4%B8%AD%E4%BD%8D%E6%95%B0/</link>
      <pubDate>Tue, 27 May 2025 19:41:53 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E4%BC%97%E6%95%B0%E4%B8%AD%E4%BD%8D%E6%95%B0/</guid>
      <description>&lt;p&gt;今天学这个东西的时候，看到这种线性的数据结构加上排序步骤，很难不想写个程序来跑跑。&lt;/p&gt;&#xA;&lt;p&gt;先来说说中位数，这个比较有思路。&lt;/p&gt;&#xA;&lt;h2 id=&#34;中位数&#34;&gt;中位数&lt;/h2&gt;&#xA;&lt;p&gt;具体的操作步骤应该是：&lt;strong&gt;排序 =&amp;gt; 获得数据元素个数n =&amp;gt; 是奇数 ? (n+1) / 2 : n / 2&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;那么排序就用之前学的冒泡排序，这种题目大概不会完全倒序给数据，编写sort函数：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;sort&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; arr[], &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; n)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;&lt;/span&gt; n &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;; i&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; j &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;; j &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;&lt;/span&gt; n &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; i &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;; j&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (arr[j] &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt; arr[j &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;]) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; temp &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; arr[j];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        arr[j] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; arr[j &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        arr[j &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; temp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接下来是判断奇偶，奇偶的判断非常简单，对取模运算的值比对就可以，编写is_even函数，判断奇偶性。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;is_even&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; data)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (data &lt;span style=&#34;color:#7a8478&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#e67e80&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;false&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;完成了奇偶判断，下一步就可以正式进行中位数的运算，编写get_median函数。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;get_median&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; arr[], &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; length)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 获取索引&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;double&lt;/span&gt; result &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;sort&lt;/span&gt;(arr, length);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b2c98f&#34;&gt;is_even&lt;/span&gt;(length)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; median_index_1 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; arr[(length &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; median_index_2 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; arr[length &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 计算数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; (median_index_1 &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; median_index_2) &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2.0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#e67e80&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; arr[length &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; result;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个函数首先计算了中位数在数组的哪个索引，然后进行了计算。&lt;/p&gt;&#xA;&lt;h2 id=&#34;众数&#34;&gt;众数&lt;/h2&gt;&#xA;&lt;p&gt;众数（Mode）是指在&lt;a href=&#34;https://baike.baidu.com/item/%E7%BB%9F%E8%AE%A1%E5%88%86%E5%B8%83/8478867?fromModule=lemma_inlink&#34;&gt;统计分布&lt;/a&gt;上具有明显集中趋势点的&lt;a href=&#34;https://baike.baidu.com/item/%E6%95%B0%E5%80%BC/2013853?fromModule=lemma_inlink&#34;&gt;数值&lt;/a&gt;，代表&lt;a href=&#34;https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE/33305?fromModule=lemma_inlink&#34;&gt;数据&lt;/a&gt;的一般水平。 也是一组数据中出现次数最多的数值，有时众数在一组数中有好几个。用M表示。&lt;/p&gt;&#xA;&lt;p&gt;那么，在程序中，想要计算一个值出现的次数并比对，可拆分为两步。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;计算出每一个数据出现的次数&lt;/li&gt;&#xA;&lt;li&gt;结果排序比对&lt;/li&gt;&#xA;&lt;li&gt;找出最大值&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;我没学过什么高级的数据结构，就用这个复制数组的笨办法吧。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;get_mode&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; arr[], &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; length)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;copy_arr &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;malloc&lt;/span&gt;(length &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;memcpy&lt;/span&gt;(copy_arr, arr, length &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;sort&lt;/span&gt;(copy_arr, length);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; max_count &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; current_count &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; mode &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; copy_arr[&lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;; i &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;&lt;/span&gt; length; i&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (copy_arr[i] &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; copy_arr[i &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;]) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      current_count&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#e67e80&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (current_count &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt; max_count) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        max_count &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; current_count;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mode &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; copy_arr[i &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      current_count &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (current_count &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt; max_count) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mode &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; copy_arr[length &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;free&lt;/span&gt;(copy_arr);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; mode;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个函数干了以下几件事：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;复制数组&lt;/li&gt;&#xA;&lt;li&gt;排序复制好的数组&lt;/li&gt;&#xA;&lt;li&gt;对比数组元素，如果array[i] == array[i - 1]，出现次数+1&lt;/li&gt;&#xA;&lt;li&gt;如果遇到新元素，检查是否需要更新最大值&lt;/li&gt;&#xA;&lt;li&gt;动态更新众数值&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;测试跑一把，输出如下&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;main&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; arr[] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;7&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; length &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(arr) &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(arr[&lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; result &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;get_mode&lt;/span&gt;(arr, length);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;result = %d&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;, result);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;result = 4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;del&gt;这个办法实在是有点蠢，找时间仔细学学哈希表，应该能更快。&lt;/del&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>【数据结构与算法】二叉树</title>
      <link>https://blog.verdant.ee/posts/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E4%BA%8C%E5%8F%89%E6%A0%91/</link>
      <pubDate>Sun, 25 May 2025 18:46:37 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E4%BA%8C%E5%8F%89%E6%A0%91/</guid>
      <description>&lt;h2 id=&#34;定义&#34;&gt;定义&lt;/h2&gt;&#xA;&lt;p&gt;二叉树（binary tree）是指树中节点的度不大于2的有序树，它是一种最简单且最重要的树。二叉树的递归定义为：二叉树是一棵空树，或者是一棵由一个根节点和两棵互不相交的，分别称作根的左子树和右子树组成的非空树；左子树和右子树又同样都是二叉树。&lt;/p&gt;&#xA;&lt;h2 id=&#34;实现&#34;&gt;实现&lt;/h2&gt;&#xA;&lt;h3 id=&#34;结构定义&#34;&gt;结构定义&lt;/h3&gt;&#xA;&lt;p&gt;&lt;del&gt;尝试了一下C语言，各种指针乱指，各种bug，暂时放自己一马，跟自己和解一下用js写写吧。&lt;/del&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;class&lt;/span&gt; TreeNode {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  constructor(data) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;this&lt;/span&gt;.data &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; data;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;this&lt;/span&gt;.left &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;null&lt;/span&gt;;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 左节点&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;this&lt;/span&gt;.right &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;null&lt;/span&gt;; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 右边节点&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;创建对象并绑定节点&#34;&gt;创建对象并绑定节点&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 手动绑定节点&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;let&lt;/span&gt; root &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; TreeNode(&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root.left &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; TreeNode(&lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root.right &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; TreeNode(&lt;span style=&#34;color:#d699b6&#34;&gt;3&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root.left.left &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; TreeNode(&lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root.right.right &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; TreeNode(&lt;span style=&#34;color:#d699b6&#34;&gt;5&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此时树的结构：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     /  \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     2   3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   /  \   \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  4    5   6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;遍历二叉树&#34;&gt;遍历二叉树&lt;/h3&gt;&#xA;&lt;h4 id=&#34;前序遍历dfs&#34;&gt;前序遍历（DFS）&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt; preOrder(node) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt;(node) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    console.log(node.data)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    preOrder(node.left)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    preOrder(node.right)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里用递归调用，遍历到左右元素&lt;/p&gt;&#xA;&lt;h4 id=&#34;层序遍历bfs&#34;&gt;层序遍历（BFS）&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt; levelOrder(root) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; queue &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; [];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  queue.push(root);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;while&lt;/span&gt; (queue.length) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; node &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; queue.shift();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    console.log(node.data);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (node.left) queue.push(node.left);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (node.right) queue.push(node.right);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>【数据结构与算法】栈</title>
      <link>https://blog.verdant.ee/posts/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E6%A0%88/</link>
      <pubDate>Sun, 11 May 2025 10:09:21 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E6%A0%88/</guid>
      <description>&lt;h2 id=&#34;基本概念&#34;&gt;基本概念&lt;/h2&gt;&#xA;&lt;p&gt;栈（Stack）是一种后进先出（LIFO）原则的线性数据结构。核心操作包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;压栈（Push）：将元素添加到栈顶&lt;/li&gt;&#xA;&lt;li&gt;出栈（Pop）：移除并返回栈顶元素&lt;/li&gt;&#xA;&lt;li&gt;查看栈顶（Check）获取但移除栈顶元素&lt;/li&gt;&#xA;&lt;li&gt;判空（is_empty）检查栈是否为空&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;结构定义&#34;&gt;结构定义&lt;/h2&gt;&#xA;&lt;p&gt;使用动态数组实现栈，包含三个核心属性：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;struct&lt;/span&gt; Stack {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; data; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 存储元素的数组&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; top;   &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 栈顶指针（当前元素位置）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; capacity; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 栈的最大容量&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;data&lt;/code&gt;：动态分配的数组指针&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;top&lt;/code&gt;：初始值为-1，表示空栈，压栈时递增，出栈时递减&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;capacity&lt;/code&gt;：栈的容量上限&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;功能实现&#34;&gt;功能实现&lt;/h2&gt;&#xA;&lt;h3 id=&#34;初始化&#34;&gt;初始化&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 初始化栈&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;init_stack&lt;/span&gt;(Stack &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;s, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; capacity) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 计算最大容量&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s &lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt; data &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#b2c98f&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; capacity)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#7a8478&#34;&gt;!&lt;/span&gt;s &lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt; data) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;内存分配失败！&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;exit&lt;/span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 初始化栈顶为-1，表空&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s &lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt; top &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 把当前计算的最大容量赋值给传进来的栈&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s &lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt; capacity &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; capacity;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个函数中进行了动态分配内存计算最大容量，初始化赋值和异常处理。&lt;/p&gt;&#xA;&lt;h3 id=&#34;压栈push&#34;&gt;压栈（Push）&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 压栈（Push）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;push&lt;/span&gt;(Stack &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;s, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; value) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (s &lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt; top &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; s &lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt; capacity &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;栈已满！&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s &lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt; data[&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;s&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;top] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检查栈是否已满，先递增指针再存入数据&lt;/p&gt;&#xA;&lt;h3 id=&#34;出栈pop&#34;&gt;出栈（Pop）&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 出栈（Pop）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;pop&lt;/span&gt;(Stack &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;s) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;is_empty&lt;/span&gt;(s)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;栈为空！&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; s&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;data[s&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;top&lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检查栈是否为空，返回当前栈顶元素后移动指针&lt;/p&gt;&#xA;&lt;h3 id=&#34;辅助功能&#34;&gt;辅助功能&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 判空&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;is_empty&lt;/span&gt;(Stack &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;s) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; s&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt; top &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 查看栈顶元素&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;peek&lt;/span&gt;(Stack &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;s) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;is_empty&lt;/span&gt;(s) &lt;span style=&#34;color:#7a8478&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;:&lt;/span&gt; s&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;data[s&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;top];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 销毁&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;destory_stack&lt;/span&gt;(Stack &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt;S) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;free&lt;/span&gt;(s&lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt;data);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s &lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt; top &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s &lt;span style=&#34;color:#7a8478&#34;&gt;-&amp;gt;&lt;/span&gt; capacity &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>【数据结构与算法】冒泡排序</title>
      <link>https://blog.verdant.ee/posts/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/</link>
      <pubDate>Sat, 10 May 2025 20:06:05 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/</guid>
      <description>&lt;h2 id=&#34;核心思想&#34;&gt;核心思想&lt;/h2&gt;&#xA;&lt;p&gt;通过相邻元素的两两比较，将较大的元素逐步“冒泡”到数组末尾，每轮排序确定一个最大元素的最终位置。&lt;/p&gt;&#xA;&lt;h2 id=&#34;代码实现&#34;&gt;代码实现&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;bubble_sort&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; arr[], &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; n) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 最外层控制循环轮数 n-1轮&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;&lt;/span&gt; n &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;; i&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 内层循环处理相邻元素比较和交换&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; j &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;; j &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;&lt;/span&gt; n&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;i&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;; j&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (arr[j] &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt; arr[j&lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;]) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; temp &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; arr[j];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        arr[j] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; arr[j&lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        arr[j&lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; temp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 调用&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;print_array&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; arr[], &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; size) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;&lt;/span&gt; size; i&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;%d,&amp;#34;&lt;/span&gt;, arr[i]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; arr[] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#d699b6&#34;&gt;23&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;232&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;55&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;7&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;576&lt;/span&gt;, &lt;span style=&#34;color:#d699b6&#34;&gt;342&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; n &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(arr) &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(arr[&lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;排序前：&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;print_array&lt;/span&gt;(arr, n);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;bubble_sort&lt;/span&gt;(arr, n);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;排序后&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;print_array&lt;/span&gt;(arr, n);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;原理分析&#34;&gt;原理分析&lt;/h2&gt;&#xA;&lt;h3 id=&#34;外层循环的-i--n---1&#34;&gt;外层循环的 i &amp;lt; n - 1&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;n个元素的数组最多需要n-1轮冒泡，如5元素数组需要4轮排序&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;数学依据&lt;/strong&gt;：每轮将一个最大值“沉底”，当完成n-1轮时，最后一个元素必然有序&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;示例验证：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;原始数组：[3, 1, 4, 2]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;第一轮：[1, 3, 2, 4] （确定最大值4）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;第二轮：[1, 2, 3, 4]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用文字解释上面的函数，原理就是在循环中对比数组第i个元素和i+1（即后一位）元素的大小，若i &amp;gt; i +1 则把两者交换位置，随着循环的进行，数组就会被排序。&lt;/p&gt;&#xA;&lt;h3 id=&#34;内层循环的-j--n---i---1&#34;&gt;内层循环的 j &amp;lt; n - i - 1&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;动态缩小范围：每轮结束后末尾i个元素已有序&lt;/li&gt;&#xA;&lt;li&gt;比较次数：第i轮需要比较(n-1)-i次相邻元素&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;想象一下数组的线性结构，实际上就是在计算排序后的一位的前一位，这样就不会处理已经排序好的元素，进入下一轮循环时可正常排序。&lt;/p&gt;&#xA;&lt;h3 id=&#34;数组长度n的计算机制&#34;&gt;数组长度n的计算机制&lt;/h3&gt;&#xA;&lt;p&gt;在main函数中，对于n的计算，采用了&lt;code&gt;sizeof(arr) / sizeof(arr[0])&lt;/code&gt;的方式。可以这么理解。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; arr[] &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#d699b6&#34;&gt;6&lt;/span&gt;,&lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;,&lt;span style=&#34;color:#d699b6&#34;&gt;8&lt;/span&gt;,&lt;span style=&#34;color:#d699b6&#34;&gt;2&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;假设int占用4字节，计算整个数组的内存占用&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(arr) &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;5&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;20&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;sizeof&lt;/span&gt;(arr[&lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;]) &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;计算出数组的总占用，再除以单个占用，就可以得到元素个数了。&lt;/p&gt;&#xA;&lt;h3 id=&#34;参数n的作用&#34;&gt;参数n的作用&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;循环控制：确定外层循环次数n-1次&lt;/li&gt;&#xA;&lt;li&gt;边界保护，防止越界&lt;/li&gt;&#xA;&lt;li&gt;效率优化：避免无效比较，如j&amp;lt;n-i-1&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;最坏情况&#34;&gt;最坏情况&lt;/h2&gt;&#xA;&lt;p&gt;冒泡排序的最坏情况发生在&lt;strong&gt;输入数组完全逆序情况下&lt;/strong&gt;，此时算法需要进行最大次数的比较和交换操作，时间复杂度达到最高。&lt;/p&gt;&#xA;&lt;p&gt;当待排序数组的初始状态为完全逆序，如[5,4,3,2,1]，每一轮外层循环都要将当前为排序部分的最大元素冒泡到正确位置，而且每次比较都会发生交换，此时：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;比较次数&lt;/strong&gt;： 共需要进行*(n - 1) + (n - 2) + &amp;hellip;*（等差数列求和）。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;交换次数&lt;/strong&gt;： 每次比较均需要交换，总交换次数也为上式结果。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>x86-64汇编学习笔记</title>
      <link>https://blog.verdant.ee/posts/x86-64%E6%B1%87%E7%BC%96%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Tue, 29 Apr 2025 13:44:13 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/x86-64%E6%B1%87%E7%BC%96%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;h2 id=&#34;机器指令和机器语言&#34;&gt;机器指令和机器语言&lt;/h2&gt;&#xA;&lt;p&gt;机器指令，二进制数字，机器语言全局机器指令的集合，CPU通过执行一系列的机器指令完成计算工作。&lt;/p&gt;&#xA;&lt;p&gt;汇编语言就是为了代替机器指令，使人类能够更加简单地编写程序而诞生的。汇编语言就是机器码的助记符。&lt;/p&gt;&#xA;&lt;p&gt;编译器将汇编代码再编译为真正的机器码。&lt;/p&gt;&#xA;&lt;h2 id=&#34;内存与硬盘&#34;&gt;内存与硬盘&lt;/h2&gt;&#xA;&lt;p&gt;内存指内存条，即RAM，临时存储，读写快容量小。&lt;/p&gt;&#xA;&lt;p&gt;硬盘长期存储，读写慢但容量大。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;ROM并非硬盘&lt;/strong&gt;，ROM&lt;strong&gt;只读存储器&lt;/strong&gt;（Read Only Memory），其内容在写入后就不能更改。&lt;/p&gt;&#xA;&lt;h2 id=&#34;存储单元&#34;&gt;存储单元&lt;/h2&gt;&#xA;&lt;p&gt;物理内存被划分为很多个存储单元，一个存储单元能存储8bit内容，也就是1字节。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;内存的最小单元是字节，不是位。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;1B = 8bit&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;1KB = 1024B&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;1MB = 1024KB&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;每一个存储单元都有相应的编号，也就是内存地址。运行程序时，操作系统会把程序载入内存中，随后CPU读取和写入程序中的某些数据并执行代码。&lt;/p&gt;&#xA;&lt;p&gt;无论是读取还是写入、执行，这些都是需要通过CPU总线进行的。&lt;/p&gt;&#xA;&lt;p&gt;总线分为数据线、地址总线、控制总线&lt;/p&gt;&#xA;&lt;p&gt;简而言之，地址总线负责寻址，控制总线负责发出控制指令，如读写，数据总线负责各个组件之间的数据传输。&lt;/p&gt;&#xA;&lt;h2 id=&#34;cpu的寻址能力&#34;&gt;CPU的寻址能力&lt;/h2&gt;&#xA;&lt;p&gt;CPU的寻址能力是由地址总线的位数决定的。&lt;/p&gt;&#xA;&lt;p&gt;通常认为32位系统有32位的寻址能力，64位同理，但不绝对。&lt;/p&gt;&#xA;&lt;h2 id=&#34;虚拟内存&#34;&gt;虚拟内存&lt;/h2&gt;&#xA;&lt;p&gt;物理内存即真实存在的内存，虚拟内存是建立在页表的基础上，由操作系统实现的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;寄存器&#34;&gt;寄存器&lt;/h2&gt;&#xA;&lt;p&gt;基本的程序执行寄存器分为以下四类&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;通用目的寄存器&lt;/li&gt;&#xA;&lt;li&gt;段寄存器&lt;/li&gt;&#xA;&lt;li&gt;标志寄存器&lt;/li&gt;&#xA;&lt;li&gt;指令指针寄存器&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;16位通用寄存器中的高位和低位&#34;&gt;16位通用寄存器中的高位和低位&lt;/h3&gt;&#xA;&lt;p&gt;16位通用寄存器中，ax,bx,cx,dx可以只使用其高8位或低8位。&lt;/p&gt;&#xA;&lt;p&gt;高8位用字符&lt;code&gt;h&lt;/code&gt;表示，低8位用字母&lt;code&gt;l&lt;/code&gt;表示。&lt;/p&gt;&#xA;&lt;h3 id=&#34;32位通用目的寄存器&#34;&gt;32位通用目的寄存器&lt;/h3&gt;&#xA;&lt;p&gt;将16位通用寄存器扩展到32位，就得到了以下寄存器。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;EAX&lt;/li&gt;&#xA;&lt;li&gt;EBX&lt;/li&gt;&#xA;&lt;li&gt;EDX&lt;/li&gt;&#xA;&lt;li&gt;ESI&lt;/li&gt;&#xA;&lt;li&gt;EDI&lt;/li&gt;&#xA;&lt;li&gt;ESP&lt;/li&gt;&#xA;&lt;li&gt;EBP&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;64位通用目的寄存器&#34;&gt;64位通用目的寄存器&lt;/h3&gt;&#xA;&lt;p&gt;将32扩展到64位，就得到了以下寄存器&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RAX&lt;/li&gt;&#xA;&lt;li&gt;RBX&lt;/li&gt;&#xA;&lt;li&gt;RCX&lt;/li&gt;&#xA;&lt;li&gt;RDX&lt;/li&gt;&#xA;&lt;li&gt;RSI&lt;/li&gt;&#xA;&lt;li&gt;RDI&lt;/li&gt;&#xA;&lt;li&gt;RSP&lt;/li&gt;&#xA;&lt;li&gt;RDP&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;R是通用前缀，取自单词Register。&lt;/p&gt;&#xA;&lt;p&gt;此外还有R8-R15。&lt;/p&gt;&#xA;&lt;h3 id=&#34;同名寄存器之间的关系&#34;&gt;同名寄存器之间的关系&lt;/h3&gt;&#xA;&lt;p&gt;同名寄存器之间并不是许多个相互独立的寄存器，而是共同属于一个寄存器。&lt;/p&gt;&#xA;&lt;p&gt;以RAX为例：&lt;/p&gt;&#xA;&lt;p&gt;RAX是整个64位寄存器，EAX指的是RAX的低32位，AX指的是RAX的0-15位。AH指的是RAX的8-15位，AL指的是RAX的0-7位。&lt;/p&gt;&#xA;&lt;p&gt;1 word = 2 byte&lt;/p&gt;&#xA;&lt;p&gt;1 double word = 4 byte&lt;/p&gt;&#xA;&lt;h2 id=&#34;段寄存器&#34;&gt;段寄存器&lt;/h2&gt;&#xA;&lt;p&gt;段寄存器CS、DS、SS、ES、FS、GS都保存着16位段选择子。用于标识内存中特定的段。&lt;/p&gt;&#xA;&lt;p&gt;CS指向代码段，SS指向栈段，DS、ES、FS、GS指向数据段。&lt;/p&gt;&#xA;&lt;p&gt;内存可以被分为不同的段，访问内存时通过段基址+偏移的方式来访问。&lt;/p&gt;&#xA;&lt;p&gt;注意：物理内存本身是连续的，并没有被分隔开，分段是CPU的寻址方式。&lt;/p&gt;&#xA;&lt;p&gt;到了64位，段的概念被进一步弱化。&lt;/p&gt;&#xA;&lt;p&gt;内存变成平坦模型，即无分段式内存。所有对内存的访问都在同一个地址空间内进行。&lt;/p&gt;&#xA;&lt;p&gt;此外，对于段的保护也被弱化，64位更强调对页的保护。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;看来段寄存器没什么用了啊&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;段寄存器最初的存在目的是辅助寻址，在32位下基本不再用于寻址，而是用于保护，而64位中其保护作用进一步被削弱。&lt;/p&gt;&#xA;&lt;h2 id=&#34;标志寄存器&#34;&gt;标志寄存器&lt;/h2&gt;&#xA;&lt;p&gt;标准寄存器存储了机组标志，分别是状态标志、控制标志、系统标志。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/image-20250429142959416.webp&#34; alt=&#34;标志寄存器结构示意图&#34;&gt;&#xA;    &lt;figcaption&gt;标志寄存器结构示意图&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;简单地来说，系统中的某些状态与指令的执行结果会存在这个寄存器当中。&lt;/p&gt;&#xA;&lt;p&gt;标志寄存器在32位和64位中分别叫&lt;strong&gt;EFLAGS&lt;/strong&gt;和&lt;strong&gt;RFLAGS&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;RFLAGS的高32位是保留为，低32位与EFLAGS相同。&lt;/p&gt;&#xA;&lt;h2 id=&#34;指令指针寄存器&#34;&gt;指令指针寄存器&lt;/h2&gt;&#xA;&lt;p&gt;简而言之，他存储的是CPU即将执行的下一条指令的地址，通常用ip/eip/rip替代  （16，32，64位）&lt;/p&gt;&#xA;&lt;h2 id=&#34;进制&#34;&gt;进制&lt;/h2&gt;&#xA;&lt;p&gt;简单来说，n进制就是逢n进一。计算机当中，除了10进制，还有2进制和6进制。&lt;/p&gt;&#xA;&lt;h2 id=&#34;小端序和大端序&#34;&gt;小端序和大端序&lt;/h2&gt;&#xA;&lt;p&gt;小端序是指低字节在低地址，高字节在高地址。&lt;/p&gt;&#xA;&lt;p&gt;优点：字节高低位与地址高低位序列相同。&lt;/p&gt;&#xA;&lt;p&gt;缺点：不符合人类阅读顺序。&lt;/p&gt;&#xA;&lt;p&gt;如：64 00 00 00&lt;/p&gt;&#xA;&lt;p&gt;大端序与之相反。&lt;/p&gt;&#xA;&lt;p&gt;如 00 00 00 64&lt;/p&gt;&#xA;&lt;h2 id=&#34;mov指令&#34;&gt;MOV指令&lt;/h2&gt;&#xA;&lt;p&gt;MOV取自英文单词move，移动。&lt;/p&gt;&#xA;&lt;p&gt;例：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MOV RAX, RCX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;意思是，把RCX寄存器的值赋值给RAX&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>WSL Arch Linux ZSH输入中文输入法乱码解决方法</title>
      <link>https://blog.verdant.ee/posts/wsl-arch-linux-zsh%E8%BE%93%E5%85%A5%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</link>
      <pubDate>Tue, 29 Apr 2025 10:31:26 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/wsl-arch-linux-zsh%E8%BE%93%E5%85%A5%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</guid>
      <description>&lt;p&gt;没有进行配置的情况下输入中文，一般会显示&amp;lt;0xffffffff&amp;gt;，这是由于没有安装字体造成的。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo pacman -S noto-fonts-cjk  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 安装中文字体&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo vi /etc/locale.gen        &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 取消注释 zh_CN.UTF-8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo locale-gen                &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 生成语言环境&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;export LANG=zh_CN.UTF-8&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 设置默认中文环境&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;source&lt;/span&gt; ~/.zshrc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;source后，再次尝试输入中文，无异常。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Emacs EAF插件打开浏览器只显示opening http://xxx.xxx的解决方法</title>
      <link>https://blog.verdant.ee/posts/emacs-eaf%E6%8F%92%E4%BB%B6%E6%89%93%E5%BC%80%E6%B5%8F%E8%A7%88%E5%99%A8%E5%8F%AA%E6%98%BE%E7%A4%BAopening-http-xxx-xxx%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</link>
      <pubDate>Tue, 29 Apr 2025 10:02:49 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/emacs-eaf%E6%8F%92%E4%BB%B6%E6%89%93%E5%BC%80%E6%B5%8F%E8%A7%88%E5%99%A8%E5%8F%AA%E6%98%BE%E7%A4%BAopening-http-xxx-xxx%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</guid>
      <description>&lt;p&gt;检查是否安装全部依赖，如yay、pip等。我这里是由于没有安装pip导致的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo pacman -S python-pip&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;安装好后，进入eaf安装目录&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;cd ~/.emacs.d/site-lisp/emacs-application-framework &amp;amp;&amp;amp; ./install-eaf.py&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;重新安装eaf。等待脚本运行完成，打开emacs，输入&lt;code&gt;M-x eaf-install-and-update&lt;/code&gt;，等待执行完成。&lt;/p&gt;&#xA;&lt;p&gt;重新输入&lt;code&gt;M-x eaf-open-browser&lt;/code&gt;，输入网址，即可正常访问网页。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Valine评论系统踩坑记录</title>
      <link>https://blog.verdant.ee/posts/valine%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Wed, 23 Apr 2025 21:54:03 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/valine%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;p&gt;我个人很早以前就惦记着换上这个评论系统，曾经使用Butterfly主题的时候就有折腾过Valine，当时是浏览器缓存策略和CORS跨域拦截的问题。网上能找到的教程都比较老，几年以前的情况不再适用于现在了，所以现在去折腾的话，大概率要踩非常多的坑。本文主要讲述我个人踩到的坑和解决方法。&lt;/p&gt;&#xA;&lt;p&gt;本文内容是我自己试错出来的，不要问为什么要这么做，我也不清楚，但是这么做可以正常使用！&lt;/p&gt;&#xA;&lt;p&gt;首先你要有一个自己的域名，不要用.github.io。LeanCloud中设置-域名绑定-API访问域名要绑定你自己的二级域。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/image-20250423220150404.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;这里一定一定要做DNS解析，非常重要。&lt;/p&gt;&#xA;&lt;p&gt;然后就是安全中心里面的Web安全域名，LeanCloud默认放行localhost，但是127.0.0.1我这边测试是不行的，如果有需求要自己填写。Web安全域名要填写https、http两种协议保险。&lt;/p&gt;&#xA;&lt;p&gt;主题配置文件中，以我这个主题为例，serverURLs要填写自己的二级域名&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;serverURLs&lt;/span&gt;: https://comment.yingyu5658.me&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一定要加协议头，否则将会在你的博客域名下构建请求，比如我的&lt;code&gt;www.yingyu5658.me/comment.yingyu5658.me/&lt;/code&gt;，这将导致报错。即使你使用国际版也要填写这一项！Leancloud请求不到。&lt;/p&gt;&#xA;&lt;p&gt;现在Valine的教程都有过时，遇到问题还需结合具体情况分析。我看LeanCloud的各种API结构变更还挺多的，太久远的教程就不建议看了。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>从0开始搭建自己的终端开发环境</title>
      <link>https://blog.verdant.ee/posts/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E7%BB%88%E7%AB%AF%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</link>
      <pubDate>Tue, 15 Apr 2025 21:15:24 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E7%BB%88%E7%AB%AF%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</guid>
      <description>&lt;p&gt;&lt;strong&gt;系统&lt;/strong&gt;：WSL Arch&lt;/p&gt;&#xA;&lt;h3 id=&#34;主折腾点&#34;&gt;主折腾点&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;代码编辑器&lt;/strong&gt;：Vim(Neovim)&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;终端体验优化&lt;/strong&gt;：tmux&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;文件管理器&lt;/strong&gt;：yazi&lt;/p&gt;&#xA;&lt;h2 id=&#34;代码编辑器neovim&#34;&gt;代码编辑器——Neovim&lt;/h2&gt;&#xA;&lt;h3 id=&#34;前言&#34;&gt;前言&lt;/h3&gt;&#xA;&lt;p&gt;Neovim和Vim相比，在性能和易用性上有很大的提升，在异步任务表现突出；使用更加现代的lua脚本配置，可读性更高。&lt;/p&gt;&#xA;&lt;h4 id=&#34;为什么不用lazyvim&#34;&gt;为什么不用Lazyvim？&lt;/h4&gt;&#xA;&lt;p&gt;答：我个人用了很长一段时间Lazyvim，虽然开箱即用，简单调试就可以使用，但是我并不能清除的理解他到底给我装了什么，我是否需要那些插件。感觉像在用别人的软件，而自己从头开始配置vim的掌控感是使用他人的配置文件无法比拟的，在配置的过程中也可以培养排错和程序调试能力，唯一的缺点就是略微耗费时间。&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装&#34;&gt;安装&lt;/h3&gt;&#xA;&lt;p&gt;先滚一把系统保证软件包都是最新的&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo pacman -Syyu&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;安装Neovim&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo pacman -S neovim&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;这时候在终端输入&lt;code&gt;nvim&lt;/code&gt;就可以打开neovim了。![image-20250415212435171](E:/Blog/source/im&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;按&lt;code&gt;:q&lt;/code&gt;退出。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个初始的界面非常简陋，我们先进行核心功能配置，后续在更改主题。&lt;/p&gt;&#xA;&lt;p&gt;nvim的用户级配置文件在&lt;code&gt;~/.config/nvim&lt;/code&gt;中。&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装包管理器&#34;&gt;安装包管理器&lt;/h3&gt;&#xA;&lt;p&gt;我们选择Lazy作为包管理器，他和其他的包管理器相比起来，在懒加载、UI界面等方面有显著优势，可以减小配置复杂度。&lt;/p&gt;&#xA;&lt;p&gt;访问&lt;a href=&#34;https://lazy.folke.io/installation&#34;&gt;lazy.nvim官网&lt;/a&gt;，官方文档永远都是最好的教程。这里有一段代码&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- Bootstrap lazy.nvim&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;local&lt;/span&gt; lazypath &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; vim.fn.stdpath(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#7a8478&#34;&gt;..&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;/lazy/lazy.nvim&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;not&lt;/span&gt; (vim.uv &lt;span style=&#34;color:#7a8478&#34;&gt;or&lt;/span&gt; vim.loop).fs_stat(lazypath) &lt;span style=&#34;color:#e67e80&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;local&lt;/span&gt; lazyrepo &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;https://github.com/folke/lazy.nvim.git&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;local&lt;/span&gt; out &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; vim.fn.system({ &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;git&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;clone&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;--filter=blob:none&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;--branch=stable&amp;#34;&lt;/span&gt;, lazyrepo, lazypath })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; vim.v.shell_error &lt;span style=&#34;color:#7a8478&#34;&gt;~=&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vim.api.nvim_echo({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      { &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;Failed to clone lazy.nvim:&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;ErrorMsg&amp;#34;&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      { out, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;WarningMsg&amp;#34;&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      { &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;Press any key to exit...&amp;#34;&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }, &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;, {})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vim.fn.getchar()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os.exit(&lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.opt.rtp:prepend(lazypath)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- Make sure to setup `mapleader` and `maplocalleader` before&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- loading lazy.nvim so that mappings are correct.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- This is also a good place to setup other settings (vim.opt)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.g.mapleader &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.g.maplocalleader &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- Setup lazy.nvim&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;require(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;lazy&amp;#34;&lt;/span&gt;).setup({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  spec &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- import your plugins&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    { import &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;plugins&amp;#34;&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- Configure any other settings here. See the documentation for more details.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- colorscheme that will be used when installing plugins.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  install &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; { colorscheme &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;habamax&amp;#34;&lt;/span&gt; } },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- automatically check for plugin updates&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  checker &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; { enabled &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这段代码主要在为Lazy包管理器初始化，所以按照官网的目录结构，我们在&lt;code&gt;~/.config/nvim/lua&lt;/code&gt;下新建一个config文件夹，把代码粘贴进去。&lt;/p&gt;&#xA;&lt;p&gt;注意到，代码中有一段是导入plugins这个模块，所以我们需要在&lt;code&gt;~/.config/nvim/lua&lt;/code&gt;下创建一个plugins文件夹&lt;/p&gt;&#xA;&lt;p&gt;然后在&lt;code&gt;~/.config/nvim/init.lua&lt;/code&gt;里粘贴这行代码&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;require(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;config.lazy&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;init/lua&lt;/code&gt;是Neovim的初始化配置文件，程序会首先读取这个文件里的代码。&lt;/p&gt;&#xA;&lt;p&gt;这行代码是引入config/lazy这个文件，初始化Lazy，所以要放在第一行。&lt;/p&gt;&#xA;&lt;p&gt;那么经过这一番操作，Lazy安装好了，我们的目录结构应该如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;`-- nvim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    `-- lua&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        `-- config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            `-- lazy.lua&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在在终端输入&lt;code&gt;nvim&lt;/code&gt;启动Neovim，会发现有个报错&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;No specs found for module &amp;#34;plugins&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查阅&lt;a href=&#34;https://github.com/folke/lazy.nvim/discussions/1875&#34;&gt;bug: No specs found for module &amp;ldquo;plugins&amp;rdquo; (Structured Setup) · folke/lazy.nvim · Discussion #1875&lt;/a&gt;可得，这个问题是由于我们还没有安装任何插件导致的，他不影响什么，但是很烦人。如果想要关掉，可以在plugins下新建一个lua文件，然后输入&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样就可以正常启动nvim不报错了。由此可见，Lazy安装插件是返回一张表，所以以后每次新建插件文件的时候都要填写以上内容。&lt;/p&gt;&#xA;&lt;h3 id=&#34;基础配置&#34;&gt;基础配置&lt;/h3&gt;&#xA;&lt;p&gt;在安装插件前，我们要先进行一些基础配置，让这个编辑器用的舒服一点。&lt;/p&gt;&#xA;&lt;p&gt;设置别名：``&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;local&lt;/span&gt; opt &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; vim.opt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;声明一个本地变量opt=vim.opt，简写提高效率。&lt;/p&gt;&#xA;&lt;p&gt;为什么要显示声明local？原因是lua脚本的所有变量默认都是全局变量，很怪对吧，我也觉得。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;opt.relativenumber &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;false&lt;/span&gt;&#x9;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 禁用相对行号&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;opt.number &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;&#x9;&#x9;   &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 启用绝对行号&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.api.nvim_set_hl(&lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;LineNr&amp;#34;&lt;/span&gt;, { fg &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;#FFD700&amp;#34;&lt;/span&gt; }) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 所有行号设为金色&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;相对行号可以更容易的数行数来达到&lt;code&gt;hjkl/d/v等 + 行数&lt;/code&gt;来快速进行文本编辑操作，但是我个人不太适应，就没开，后期可以通过修改按键配置来做到随时开关。&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装插件&#34;&gt;安装插件&lt;/h3&gt;&#xA;&lt;h4 id=&#34;neo-tree&#34;&gt;neo-tree&lt;/h4&gt;&#xA;&lt;p&gt;neo-tree 编辑器的文件系统资源管理器。使用此插件，用户可以直观地浏览复杂的目录层次结构，快速打开文件进行读取或编辑，并执行基本的文件系统作。&lt;/p&gt;&#xA;&lt;p&gt;仓库：&lt;a href=&#34;https://github.com/nvim-neo-tree/neo-tree.nvim&#34;&gt;nvim-neo-tree/neo-tree.nvim: Neovim plugin to manage the file system and other tree like structures.&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;进入Plugins目录，新建一个文件名为nerdtree的lua脚本。先把上文提到的返回表写进去。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- neo-tree.lua&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 代码来自仓库README&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;nvim-neo-tree/neo-tree.nvim&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  branch &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;v3.x&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  dependencies &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;nvim-lua/plenary.nvim&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;nvim-tree/nvim-web-devicons&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- not strictly required, but recommended&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;MunifTanjim/nui.nvim&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- {&amp;#34;3rd/image.nvim&amp;#34;, opts = {}}, -- Optional image support in preview window: See `# Preview Mode` for more information&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  lazy &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;false&lt;/span&gt;, &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- neo-tree will lazily load itself&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;---@module &amp;#34;neo-tree&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;---@type neotree.Config?&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  opts &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- fill any relevant options here&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;插件装好了发现，不知道怎么打开啊。这时候就需要我们自己动手改一个舒服点的键位。在&lt;code&gt;~/.config/nvim/lua/config&lt;/code&gt;中新建一个keymaps.lua，并在init.lua中引用&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 习惯上，我喜欢把leader键映射到空格，敲起来顺手&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 基础按键配置&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.g.mapleader &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;local&lt;/span&gt; opt &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; { noremap &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt;, slient &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;true&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 窗口切换更顺手，少按一个w&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;lt;C-h&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;lt;C-w&amp;gt;h&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;lt;C-j&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;lt;C-w&amp;gt;j&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;lt;C-k&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;lt;C-w&amp;gt;k&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;lt;C-l&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;lt;C-w&amp;gt;l&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- Neotree&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;lt;Leader&amp;gt;e&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&amp;lt;cmd&amp;gt;Neotree toggle&amp;lt;CR&amp;gt;&amp;#34;&lt;/span&gt;, opts)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;代码补全格式化检查&#34;&gt;代码补全、格式化、检查&lt;/h4&gt;&#xA;&lt;p&gt;要让vim看起来像一个正经的处理代码的文本编辑器，这些是必不可少的。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 文件路径：lua/plugins/code-edit.lua&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- LSP 核心组件 (必须最先声明)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;neovim/nvim-lspconfig&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dependencies &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;williamboman/mason.nvim&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;williamboman/mason-lspconfig.nvim&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    config &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 延迟加载 LSP 配置&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      vim.schedule(&lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;local&lt;/span&gt; lspconfig &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; require(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;lspconfig&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;local&lt;/span&gt; mason &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; require(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;mason&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;local&lt;/span&gt; mason_lspconfig &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; require(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;mason-lspconfig&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 通用 LSP 配置&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;local&lt;/span&gt; on_attach &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt;(client, bufnr)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 快捷键配置...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mason.setup()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mason_lspconfig.setup({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          ensure_installed &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;tsserver&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;cssls&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;html&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;clangd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;eslint&amp;#34;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mason_lspconfig.setup_handlers({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt;(server_name)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            lspconfig[server_name].setup({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              on_attach &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; on_attach,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              capabilities &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; require(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;cmp_nvim_lsp&amp;#34;&lt;/span&gt;).default_capabilities(),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 各语言特殊配置...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#e67e80&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e67e80&#34;&gt;end&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 自动补全引擎（需在 LSP 之后加载）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;hrsh7th/nvim-cmp&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dependencies &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;hrsh7th/cmp-nvim-lsp&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;L3MON4D3/LuaSnip&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    config &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- cmp 配置...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 格式化工具&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;stevearc/conform.nvim&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    config &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- conform 配置...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- 语法高亮增强&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;nvim-treesitter/nvim-treesitter&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    build &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;:TSUpdate&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    config &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;function&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;-- treesitter 配置...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;代码编辑器的配置就告一段落了，真写规范的代码还是建议vscode（虽然有点偏离终端的主题了）。如果你爱折腾vim那当然也可以，工具自己用的趁手就是最好的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;oh-my-zsh&#34;&gt;Oh-My-Zsh&lt;/h2&gt;&#xA;&lt;p&gt;Oh My Zsh 是基于 zsh 命令行的一个扩展工具集，提供了丰富的扩展功能。&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装zsh&#34;&gt;安装&lt;strong&gt;ZSH&lt;/strong&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo pacman -S zsh&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;设置默认终端为zsh&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;chsh -s /bin/zsh&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装oh-my-zsh&#34;&gt;安装Oh-My-Zsh&lt;/h3&gt;&#xA;&lt;p&gt;国内镜像&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sh -c &amp;quot;$(curl -fsSL https://gitee.com/pocmon/ohmyzsh/raw/master/tools/install.sh)&amp;quot;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;我个人觉得这个主题就挺好的了，不多改动。&lt;/p&gt;&#xA;&lt;h4 id=&#34;插件安装&#34;&gt;插件安装&lt;/h4&gt;&#xA;&lt;h4 id=&#34;zsh--autosuggestions&#34;&gt;zsh -autosuggestions&lt;/h4&gt;&#xA;&lt;p&gt;预测命令&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.moeyy.xyz/https://github.com/zsh-users/zsh-autosuggestions &lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;ZSH_CUSTOM&lt;span style=&#34;color:#e67e80&#34;&gt;:-&lt;/span&gt;~/.oh-my-zsh/custom&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;/plugins/zsh-autosuggestions&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;zsh-syntax-highlighting&#34;&gt;zsh-syntax-highlighting&lt;/h4&gt;&#xA;&lt;p&gt;语法检查，命令正确时为绿色，否则红色。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.moeyy.xyz/https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;启用插件&#34;&gt;启用插件&lt;/h4&gt;&#xA;&lt;p&gt;&lt;code&gt;nvim ~/.zshrc&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;修改：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plugins=(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  zsh-autosuggestions&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  zsh-syntax-highlighting&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启终端即可启用。&lt;/p&gt;&#xA;&lt;h4 id=&#34;别名设置&#34;&gt;别名设置&lt;/h4&gt;&#xA;&lt;p&gt;别名可以更快地帮助我们启用命令&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;nvim ~/.zshrc&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias s=&amp;#34;neofetch&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias vim=&amp;#34;nvim&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias c=&amp;#34;clear&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias gcl = &amp;#34;git clone&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里根据我的习惯改了几个别名。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>初折腾Emacs记录</title>
      <link>https://blog.verdant.ee/posts/%E5%88%9D%E6%8A%98%E8%85%BEemacs%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Sun, 13 Apr 2025 12:15:33 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E5%88%9D%E6%8A%98%E8%85%BEemacs%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;h2 id=&#34;基础配置&#34;&gt;基础配置&lt;/h2&gt;&#xA;&lt;p&gt;Windows下需要在软件顶部Toolbar的Options中随便更改一个选项，然后再点Save Options，这样就会再&lt;code&gt;C:\Users\Username\appdata\Roaming\&lt;/code&gt;下生成.emacs和.emacs.d/&lt;/p&gt;&#xA;&lt;p&gt;在emacs.d中新建一个文件&lt;code&gt;init.el&lt;/code&gt;，填写如下配置&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;;; init.el --- Load the full configuration -*- lexical-binding: t -*-&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;;; Commentary:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; This file bootstraps the configuration, which is divided into&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; a number of other files.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;;; Code:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;let&lt;/span&gt; ((minver &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;25.1&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#d699b6&#34;&gt;when&lt;/span&gt; (version&amp;lt; emacs-version minver)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#dbbc7f&#34;&gt;error&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;Your Emacs is too old -- this config requires v%s or higher&amp;#34;&lt;/span&gt; minver)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;when&lt;/span&gt; (version&amp;lt; emacs-version &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;26.1&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (message &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;Your Emacs is old, and some functionality in this config will be disabled. Please upgrade if possible.&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-to-list &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;load-path&lt;/span&gt; (expand-file-name &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;lisp&amp;#34;&lt;/span&gt; user-emacs-directory)) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 设定源码加载路径&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; (require &amp;#39;init-benchmarking) ;; Measure startup time&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defconst *spell-check-support-enabled* &lt;span style=&#34;color:#d699b6&#34;&gt;nil&lt;/span&gt;) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; Enable with t if you prefer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defconst *is-a-mac* (&lt;span style=&#34;color:#b2c98f&#34;&gt;eq&lt;/span&gt; system-type &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;darwin&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; Adjust garbage collection thresholds during startup, and thereafter&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;let&lt;/span&gt; ((normal-gc-cons-threshold (&lt;span style=&#34;color:#b2c98f&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;20&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1024&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1024&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (init-gc-cons-threshold (&lt;span style=&#34;color:#b2c98f&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;128&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1024&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;1024&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; gc-cons-threshold init-gc-cons-threshold)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (add-hook &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;emacs-startup-hook&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#d699b6&#34;&gt;lambda&lt;/span&gt; () (&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; gc-cons-threshold normal-gc-cons-threshold))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; ==========================================================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; ===========================================日常使用配置===================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; ==========================================================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; confirm-kill-emacs &lt;span style=&#34;color:#b2c98f&#34;&gt;#&amp;#39;yes-or-no-p&lt;/span&gt;)   &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 在关闭 Emacs 前询问是否确认关闭，防止误触&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(electric-pair-mode &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;)            &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 自动补全括号&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;prog-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;#&amp;#39;&lt;/span&gt;show-paren-mode) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 编程模式下，光标在括号上时高亮另一个括号&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(column-number-mode &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;)            &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 在 Mode line 上显示列号&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-auto-revert-mode &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;)         &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 当另一程序修改了文件时，让 Emacs 及时刷新 Buffer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(delete-selection-mode &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;)          &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 选中文本后输入文本会替换文本（更符合我们习惯了的其它编辑器的逻辑）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; inhibit-startup-message &lt;span style=&#34;color:#d699b6&#34;&gt;t&lt;/span&gt;)       &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 关闭启动 Emacs 时的欢迎界面&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; make-backup-files &lt;span style=&#34;color:#d699b6&#34;&gt;nil&lt;/span&gt;)         &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 关闭文件自动备份&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-hook &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;prog-mode-hook&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;#&amp;#39;&lt;/span&gt;hs-minor-mode)  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 编程模式下，可以折叠代码块&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-display-line-numbers-mode &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;)     &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 在 Window 显示行号&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(tool-bar-mode &lt;span style=&#34;color:#d699b6&#34;&gt;-1&lt;/span&gt;)              &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; （熟练后可选）关闭 Tool bar&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#d699b6&#34;&gt;when&lt;/span&gt; (display-graphic-p) (toggle-scroll-bar &lt;span style=&#34;color:#d699b6&#34;&gt;-1&lt;/span&gt;)) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 图形界面时关闭滚动条&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(savehist-mode &lt;span style=&#34;color:#d699b6&#34;&gt;1&lt;/span&gt;)              &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; （可选）打开 Buffer 历史记录保存&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; display-line-numbers-type &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;relative&lt;/span&gt;)  &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; （可选）显示相对行号&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-to-list &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;default-frame-alist&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;#39;&lt;/span&gt;(width &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;90&lt;/span&gt;)) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; （可选）设定启动图形界面时的初始 Frame 宽度（字符数）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add-to-list &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;default-frame-alist&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;#39;&lt;/span&gt;(height &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;55&lt;/span&gt;)) &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; （可选）设定启动图形界面时的初始 Frame 高度（字符数）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; ==========================================================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; ===========================================插件镜像配置===================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;; ==========================================================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;; 腾讯镜像&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;package&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#e67e80&#34;&gt;setq&lt;/span&gt; package-archives &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;gnu&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;http://mirrors.cloud.tencent.com/elpa/gnu/&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             (&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;melpa&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;http://mirrors.cloud.tencent.com/elpa/melpa/&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(package-initialize)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;;;; init.el ends here&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基础的设置和插件镜像源就配置好了，此配置可完全复制照抄。&lt;/p&gt;&#xA;&lt;p&gt;重启Emacs，按下&lt;code&gt;M-x&lt;/code&gt;输入&lt;code&gt;package-list-packages&lt;/code&gt;即可查看仓库中的所有插件&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;在此列表界面下还可按下h显示帮助，按U检查所有已安装插件是否需要更新，如有就标注更新，按i标记想要安装，最后按下x就可更新。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;插件默认会被安装到&lt;code&gt;~/.emacs.d/elpa&lt;/code&gt;下，Windows同理。&lt;/p&gt;&#xA;&lt;p&gt;删除插件输入&lt;code&gt;package-delete&lt;/code&gt;，然后输入想删除的插件名即可。&lt;/p&gt;&#xA;&lt;h2 id=&#34;use-package&#34;&gt;use-package&lt;/h2&gt;&#xA;&lt;h3 id=&#34;安装&#34;&gt;安装&lt;/h3&gt;&#xA;&lt;p&gt;输入命令&lt;code&gt;package-install&lt;/code&gt;回车后输入use-package回车，然后在init.el的最上面写&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(eval-when-compile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#b2c98f&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#e69875&#34;&gt;&amp;#39;use-package&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每次启动Emacs优先加载此插件&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>osu!APIv1请求示例</title>
      <link>https://blog.verdant.ee/posts/osu-apiv1%E8%AF%B7%E6%B1%82%E7%A4%BA%E4%BE%8B/</link>
      <pubDate>Fri, 11 Apr 2025 22:29:23 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/osu-apiv1%E8%AF%B7%E6%B1%82%E7%A4%BA%E4%BE%8B/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;本文章使用Nodejs环境做演示。请求用户数据。代码中的APIKEY要在&lt;a href=&#34;https://osu.ppy.sh/home/account/edit&#34;&gt;osu官网‬&lt;/a&gt;申请。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; API_URL &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;osu.ppy.sh&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; init &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    k&lt;span style=&#34;color:#7a8478&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;YOUR_API_KEY&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    type&lt;span style=&#34;color:#7a8478&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    u&lt;span style=&#34;color:#7a8478&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;kyzzz5658&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; https &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; require(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;https&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 将参数序列化为查询字符串&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; query &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; URLSearchParams(init);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; options &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hostname&lt;span style=&#34;color:#7a8478&#34;&gt;:&lt;/span&gt; API_URL,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    method&lt;span style=&#34;color:#7a8478&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path&lt;span style=&#34;color:#7a8478&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;`/api/get_user?&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;query&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 附加参数&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; req &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; https.request(options, (res) =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;let&lt;/span&gt; data &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    res.on(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;data&amp;#39;&lt;/span&gt;, (chunk) =&amp;gt; data &lt;span style=&#34;color:#7a8478&#34;&gt;+=&lt;/span&gt; chunk);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    res.on(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;end&amp;#39;&lt;/span&gt;, () =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            console.log(JSON.parse(data[&lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;].username));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#e67e80&#34;&gt;catch&lt;/span&gt; (e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            console.error(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;JSON 解析失败:&amp;#39;&lt;/span&gt;, e);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 错误处理&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;req.on(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;error&amp;#39;&lt;/span&gt;, (err) =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    console.error(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;请求失败:&amp;#39;&lt;/span&gt;, err.code);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    user_id: &amp;#39;33932276&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    username: &amp;#39;Kyzzz5658&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    join_date: &amp;#39;2023-06-24 08:48:13&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count300: &amp;#39;2139&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count100: &amp;#39;609&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count50: &amp;#39;194&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    playcount: &amp;#39;44&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ranked_score: &amp;#39;1917044&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_score: &amp;#39;3095639&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pp_rank: &amp;#39;1968010&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    level: &amp;#39;8.0115&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pp_raw: &amp;#39;43.5449&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy: &amp;#39;81.70417785644531&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count_rank_ss: &amp;#39;0&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count_rank_ssh: &amp;#39;0&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count_rank_s: &amp;#39;0&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count_rank_sh: &amp;#39;0&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count_rank_a: &amp;#39;1&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    country: &amp;#39;CN&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_seconds_played: &amp;#39;2259&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pp_country_rank: &amp;#39;38721&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    events: []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;​&#x9;&lt;a href=&#34;https://github.com/ppy/osu-api/wiki&#34;&gt;首页 ·ppy/osu-api 维基&lt;/a&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>把主力机系统换成Arch Linux是我这辈子做过的最蠢的决定</title>
      <link>https://blog.verdant.ee/posts/%E6%8A%8A%E4%B8%BB%E5%8A%9B%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%8D%A2%E6%88%90arch-linux%E6%98%AF%E6%88%91%E8%BF%99%E8%BE%88%E5%AD%90%E5%81%9A%E8%BF%87%E7%9A%84%E6%9C%80%E8%A0%A2%E7%9A%84%E5%86%B3%E5%AE%9A/</link>
      <pubDate>Sun, 06 Apr 2025 17:58:48 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E6%8A%8A%E4%B8%BB%E5%8A%9B%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%8D%A2%E6%88%90arch-linux%E6%98%AF%E6%88%91%E8%BF%99%E8%BE%88%E5%AD%90%E5%81%9A%E8%BF%87%E7%9A%84%E6%9C%80%E8%A0%A2%E7%9A%84%E5%86%B3%E5%AE%9A/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;&#xA;&lt;p&gt;先说结论。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;我是傻逼！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;我是傻逼！！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;我是傻逼！！！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文将讲述&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;为什么我放弃了Arch&lt;/li&gt;&#xA;&lt;li&gt;为什么我放弃了Linux。&lt;/li&gt;&#xA;&lt;li&gt;什么人适合用Linux做主力系统&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;本文的所有观点仅仅代表个人观点，我纯菜。你问我为什么要选择Arch，而不是Ubuntu或者其他新手友好的发行版，我不知道，正如上文所说，我是傻逼！&lt;/p&gt;&#xA;&lt;h2 id=&#34;为什么我放弃了arch&#34;&gt;为什么我放弃了Arch&lt;/h2&gt;&#xA;&lt;p&gt;说到这个问题，就要先来谈谈为什么我要把Windows换成Linux。&lt;/p&gt;&#xA;&lt;p&gt;Linux这个系统对于我来说一直是神秘而美好的，至少在当时。我痴迷于命令行、终端、Vim这种工具。小时候也看过爸爸零几年买的《鸟哥的Linux私房菜》，给我当时幼小的心灵带来的极大的震撼。&lt;/p&gt;&#xA;&lt;p&gt;我当时也对Linux的目录结构非常新鲜，不分盘的设定感觉很好玩。&lt;/p&gt;&#xA;&lt;p&gt;我网站的服务器是Linux、身边的各种设备都有Linux的影子，这更加提高了我对Linux的向往程度。&lt;/p&gt;&#xA;&lt;p&gt;还有一个原因是，我当时正在用C语言写一个小工具，Windows下的gcc无法使用通配符&lt;code&gt;*&lt;/code&gt;，要想用只能去打开Git Bash或者MSYS2，这俩东西界面的丑陋程度相比就不用我多说了，我当时就是喜欢把精力浪费在不必要的地方上，Windows的那个终端被我“美化”得花里胡哨的，上面两者的界面当然入不了我的眼。&lt;/p&gt;&#xA;&lt;p&gt;为了解决这个问题，我开始使用WSL2，但仅仅停留在开始阶段。&lt;/p&gt;&#xA;&lt;p&gt;我这个系统不知道怎么回事，根本没办法用WSL2。&lt;/p&gt;&#xA;&lt;p&gt;全网都没有遇到这个问题的，那既然如此，重装系统吧。&lt;/p&gt;&#xA;&lt;p&gt;和系统相处就像谈恋爱，总有一段热恋期，过了这个时期后就冷淡了、矛盾也就浮出水面。刚装好的前几天，我的热情前所未有的高涨，学习各种命令、各种工具，当然少不了配置我最爱的Vim。那么说到Vim，归根结底是文本编辑器对吧，打字的软件，那么就要说说我用Linux的第一大困难——&lt;strong&gt;输入法配置难&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;输入法配置难&#34;&gt;输入法配置难&lt;/h3&gt;&#xA;&lt;p&gt;我是双拼用户，从小学六年级就开始用小鹤双拼打字了，这么长时间的习惯很难改，我也不想改。但是Linux上对双拼友好的输入法方案几乎没几个，我尝试过两个，Fcitx5 + 搜狗, Fcitx5 + Rime。&lt;/p&gt;&#xA;&lt;p&gt;这两个方案都大差不差，只是搜狗的可能略微智能一点，下载源什么的换成国内镜像，分分钟搞定下载问题。难就难在，我使用的终端不兼容Fcitx。&lt;/p&gt;&#xA;&lt;p&gt;没错，我用的就是Kitty。&lt;/p&gt;&#xA;&lt;p&gt;那么，肯定有人就想说，KDE自带的Console不能用吗？非得额外下载一个干什么？？&lt;/p&gt;&#xA;&lt;p&gt;我的答案就是：&lt;strong&gt;丑&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;没错，就是因为Console丑。当然他也可以美化，但问题就在于，他的窗口圆角不彻底，而且把标签页显示关掉后，只能额外开一个窗口，占用屏幕空间。&lt;/p&gt;&#xA;&lt;p&gt;而Kitty就不同，窗口边框干净利落，看起来很舒服，而且配色看起来也比Konsole那高饱和度的方案舒服太多了。标签页不是类似于系统组件的那种形式，所以不会额外占窗口空间。&lt;/p&gt;&#xA;&lt;p&gt;虽然不兼容问题，在程序启动参数添加一条指定ibus接口的命令就解决了。&lt;/p&gt;&#xA;&lt;p&gt;你问我为什么非得要追求好看，闲的么？我当时可能会扣一大串字来回怼你，但是我现在觉得我错了，我认同你的观点，就是闲的。&lt;/p&gt;&#xA;&lt;p&gt;如开头所说，我是傻逼！&lt;/p&gt;&#xA;&lt;p&gt;配置各种东西就免不了使用Github下载，那么就由此引出了第二个问题，&lt;strong&gt;代理配置难&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;代理配置难&#34;&gt;代理配置难&lt;/h3&gt;&#xA;&lt;p&gt;我这边访问Github非常不稳定，有时候能丝滑裸连，有时候挂代理都难上。我先用了Steam++的Github加速服务，但是他会把Github的一些地址都重定向到localhost导致使用Git的某些功能如&lt;code&gt;git push&lt;/code&gt;异常。我又换到FastGithub，这东西很好用，但也有不稳定的时候，当他作为系统服务启动的时候，发生异常，想杀死他就变得十分困难，然后导致几乎所有Git功能都瘫痪，非常麻烦，&lt;code&gt;git clone&lt;/code&gt;都跑不下来。&lt;/p&gt;&#xA;&lt;h3 id=&#34;显卡驱动安装难&#34;&gt;显卡驱动安装难&lt;/h3&gt;&#xA;&lt;p&gt;Linux显卡驱动问题一直都是社区津津乐道的蛋疼问题，更蛋疼的是我的显卡还是英伟达的，你问我为什么用英伟达显卡还玩Linux，我不知道。正如开头所说，我是傻逼！&lt;/p&gt;&#xA;&lt;p&gt;显卡驱动的问题，我研究了一周左右，虽然最后还是成功了，但是离正常使用还有一段距离。也是有很多小问题，比如使用系统自带的截图会黑屏，用不了i3等窗口管理器等等。&lt;/p&gt;&#xA;&lt;p&gt;当初安装显卡驱动导致的问题包括但不限于：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;鼠标灵敏度异常&lt;/li&gt;&#xA;&lt;li&gt;显示比例异常&lt;/li&gt;&#xA;&lt;li&gt;画面撕裂&lt;/li&gt;&#xA;&lt;li&gt;系统炸了&lt;/li&gt;&#xA;&lt;li&gt;桌面炸了&lt;/li&gt;&#xA;&lt;li&gt;能进图形界面但是不能登录&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;嗯对就是这么离谱。当然经过我一番折腾还是达到了能用但体验不好的程度。&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装软件难&#34;&gt;安装软件难&lt;/h3&gt;&#xA;&lt;p&gt;拿QQ举例，QQ官网的Linux安装包是.deb，如果我想安装，还是要经过一大通折腾，拼凑出来一个半成品QQ，而且最难受的是，每次他都会自动推送更新，我还更不了，还不能忽略版本，让我这个强迫症非常折磨。&lt;/p&gt;&#xA;&lt;h2 id=&#34;为什么我放弃了linux&#34;&gt;为什么我放弃了Linux&lt;/h2&gt;&#xA;&lt;p&gt;其实原本我是不打算放弃Linux的，因为我突然想玩星露谷物语了，就想着要不要装双系统，但是我装Arch根本没有经验，磁盘分区做的很烂，上面的一番折腾已经让我筋疲力尽，我不想再玩Arch，只想找一个开箱即用的Linux发行版。&lt;/p&gt;&#xA;&lt;p&gt;我的目光理所应当地投到了Ubuntu，这是我小时候体验的第一个Linux发行版，对我来说意义有点特殊，而且也属于开箱即用，所以Arch就光荣的升级为我的前任了。&lt;/p&gt;&#xA;&lt;p&gt;Windows系统的安装非常简单，只要一直下一步下一步下一步，然后等就行了。Ubuntu也差不多，但需要注意的一点是，有一个步骤让用户选择以怎样的方式安装Ubuntu，给了三个选项，一个是用Windows Boot Manager管理，一个是擦除磁盘，好像还有一个，没注意。&lt;/p&gt;&#xA;&lt;p&gt;我要装双系统，当然是选第一个选项，系统正常装上了，一切正常。下载软件，Neovim、VSCode、kitty。&lt;/p&gt;&#xA;&lt;p&gt;kitty&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;上文提到，Kitty不支持fcitx5，理论上这个问题还是可以像Arch时期那么解决，但是我当时没找到怎么给程序添加启动参数。跟着网上的教程折腾了半天系统配置文件后，我成功的又把系统玩炸了，进不去桌面。&lt;/p&gt;&#xA;&lt;p&gt;当时已经是晚上十点多了，当天上午刚出去踏青，走了一万一千步，对于我来说已经把这一个月的活动量都用完了，筋疲力尽。非常困倦的状态下，我打算重装Ubuntu，正式因为特别困，智商下降得厉害，在安装程序选择了第二个：擦除磁盘。&lt;/p&gt;&#xA;&lt;p&gt;我原本Windows系统的D盘擦干净装了个Ubuntu。&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip;&amp;hellip;&amp;hellip;.&lt;/p&gt;&#xA;&lt;p&gt;那就这样吧，也行，我试着在Windows里把C盘装的那个坏掉的Ubuntu删掉，但是Windows访问不了那块神秘区域。。。&lt;/p&gt;&#xA;&lt;p&gt;那行吧，重装系统。我格式化了C盘，删除了所有的分区，重装了Windows。在下载软件的时候猛地一惊。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;我为什么现在不用WSL了呢？&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这是个好问题，对吧，你问我为什么到这时候才想起来用WSL，我不知道，正如开头所说，我是傻逼！&lt;/p&gt;&#xA;&lt;p&gt;于是，我不再安装Ubuntu，执行wsl的安装命令，没有像上次使用Windows那样报错，报各种偏门错，报全网都找不到解决方法的错。&lt;/p&gt;&#xA;&lt;p&gt;此时我心中一万头曹尼玛奔腾，只有一句话想说：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;我是傻逼！！！！！！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;什么人适合用linux做主力系统&#34;&gt;什么人适合用Linux做主力系统&lt;/h2&gt;&#xA;&lt;p&gt;我个人认为，对Linux有刚需，如嵌入式、AI、机器学习这种领域，离开Linux干不了活的，我会推荐你用WSL，而不是主力Linux。我不建议任何人主力系统用Linux。。。。更不建议主力Linux发行版是Arch。&lt;/p&gt;&#xA;&lt;p&gt;WSL的好处太多了，最大的好处就是方便。&lt;/p&gt;&#xA;&lt;p&gt;当然，你爱折腾，对Linux有热情，有好奇心，完全可以把我这话当放屁。&lt;/p&gt;&#xA;&lt;h2 id=&#34;结语&#34;&gt;结语&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;我是傻逼！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;我是傻逼！！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;我是傻逼！！！&lt;/strong&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>上帝类是什么？该如何避免上帝类？</title>
      <link>https://blog.verdant.ee/posts/%E4%B8%8A%E5%B8%9D%E7%B1%BB%E6%98%AF%E4%BB%80%E4%B9%88%E8%AF%A5%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E4%B8%8A%E5%B8%9D%E7%B1%BB/</link>
      <pubDate>Sun, 30 Mar 2025 10:47:35 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E4%B8%8A%E5%B8%9D%E7%B1%BB%E6%98%AF%E4%BB%80%E4%B9%88%E8%AF%A5%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E4%B8%8A%E5%B8%9D%E7%B1%BB/</guid>
      <description>&lt;h2 id=&#34;什么是上帝类&#34;&gt;什么是上帝类&lt;/h2&gt;&#xA;&lt;p&gt;所谓的上帝类，就是指&lt;strong&gt;一个类承担了过多的职能&lt;/strong&gt;，变得过于&lt;strong&gt;臃肿&lt;/strong&gt;和&lt;strong&gt;复杂&lt;/strong&gt;、&lt;strong&gt;难以维护&lt;/strong&gt;。没有遵守单一职责原则。像上帝一样什么都能干，每个功能高度耦合，牵一发而动全身，不利于业务的拓展。&lt;/p&gt;&#xA;&lt;h2 id=&#34;上帝类是如何产生的&#34;&gt;上帝类是如何产生的&lt;/h2&gt;&#xA;&lt;p&gt;上帝类的产生，通常是由于需要快速实现功能而做出的妥协，长期积累就变成繁重的技术债务。或是缺乏规划经验，功能不断地被加到类中。依旧长期积累，上帝类产生了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;上帝类的优缺点&#34;&gt;上帝类的优缺点&lt;/h2&gt;&#xA;&lt;p&gt;上帝类虽然在上文被冠以臃肿、难维护的帽子，但并不代表他没有优点，要辨证地看待。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;优点：上帝类适用于一些较小的、逻辑简单的任务或工具类，逻辑不复杂，也不需要长时间维护，即拿即用。不用过多地考虑职责和颗粒度的划分，也能提高开发效率&lt;/li&gt;&#xA;&lt;li&gt;缺点：即上文中所提到的。臃肿、复杂、难以维护、测试麻烦、缺乏可读性、耦合度高，不可拓展同时违反SRP和OCP原则&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;上帝类的判定&#34;&gt;上帝类的判定&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;代码行数判定法：代码行数很多的有可能是上帝类，注意是有可能。如果是上帝类，应当进行适当重构&lt;/li&gt;&#xA;&lt;li&gt;依赖关系判定法：通过分析类的依赖关系来判定其是否与其他类高度关联，如果是，他有可能是上帝类。&lt;/li&gt;&#xA;&lt;li&gt;职责判定法：如果一个类承担了过多的职责，他该干的也干了，不该干的也干了，那么毫无疑问，他是上帝类。&lt;/li&gt;&#xA;&lt;li&gt;测试覆盖率判定法： 如果一个类难以单元测试，或覆盖率低或总是出现奇奇怪怪的不可预测的问题，那么他有可能是上帝类。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;如何避免上帝类&#34;&gt;如何避免上帝类&lt;/h2&gt;&#xA;&lt;p&gt;所以，要如何避免上帝类，这个问题的答案已经显而易见了。和上一段相反着做即可。遵守单一职责原则。规划好代码架构。比如，要处理一个压缩包解析和数据展示功能，首先就要拆分职责为不同的类。类中再去写相对应的函数。我们可以把这个功能拆分为解压、读取、展示信息三个类，类中分别编写相应的代码，这样就能做到避免上帝类的产生，从而提高代码的可维护性和可拓展性。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>安装配置Rime输入法</title>
      <link>https://blog.verdant.ee/posts/%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AErime%E8%BE%93%E5%85%A5%E6%B3%95/</link>
      <pubDate>Mon, 24 Mar 2025 20:37:38 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AErime%E8%BE%93%E5%85%A5%E6%B3%95/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;&#xA;&lt;p&gt;其实我有能用的fcitx5+搜狗输入法的方案，但奈何kitty终端有对这个输入法的兼容性问题，无法启用中文，又奈何kitty的界面多美观舒服，和Konsole比起来简直就不是一个时代的产物。&lt;/p&gt;&#xA;&lt;h1 id=&#34;安装ibus框架和rime输入法引擎&#34;&gt;安装Ibus框架和Rime输入法引擎&lt;/h1&gt;&#xA;&lt;p&gt;&lt;strong&gt;安装 IBus 和 Rime 组件&lt;/strong&gt;：&#xA;&lt;code&gt;sudo pacman -S ibus ibus-rime&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;安装 Rime 双拼方案：&lt;/strong&gt;&#xA;&lt;code&gt;sudo pacman -S rime-double-pinyin&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;配置-ibus-和-rime&#34;&gt;配置 IBus 和 Rime&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;设置环境变量&lt;/strong&gt;&#xA;在&lt;code&gt;~/.xprofile&lt;/code&gt;添加以下内容&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;export&lt;/span&gt; GTK_IM_MODULE&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;ibus &lt;span style=&#34;color:#d699b6&#34;&gt;export&lt;/span&gt; QT_IM_MODULE&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;ibus &lt;span style=&#34;color:#d699b6&#34;&gt;export&lt;/span&gt; XMODIFIERS&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;@im&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;ibus&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启系统或执行 &lt;code&gt;source ~/.xprofile&lt;/code&gt; 使配置生效&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;启动 IBus 并添加 Rime 输入源&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ibus-daemon -drx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;右键点击系统托盘中的 IBus 图标，选择 &lt;strong&gt;Preferences&lt;/strong&gt; → &lt;strong&gt;Input Method&lt;/strong&gt; → &lt;strong&gt;Add&lt;/strong&gt;，选择 &lt;strong&gt;Chinese (Rime)&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;配置双拼方案&lt;/strong&gt;&#xA;编辑 Rime 的配置文件 &lt;code&gt;~/.config/ibus/rime/default.custom.yaml&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;patch:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;schema_list:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;- schema: double_pinyin &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 自然码双拼&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;- schema: luna_pinyin &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 全拼备用&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;优化-rime-的智能联想与词库&#34;&gt;优化 Rime 的智能联想与词库&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;启用雾凇拼音方案（推荐）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;cd&lt;/span&gt; ~/.config/ibus/rime&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/iDvel/rime-ice.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -r rime-ice/* .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;安装小鹤双拼方案&#34;&gt;安装小鹤双拼方案&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 安装 plum 工具&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://git.io/rime-install | bash -s -- double-pinyin flypy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Nodejs环境下控制台拼接字符串输出有undefind</title>
      <link>https://blog.verdant.ee/posts/nodejs%E7%8E%AF%E5%A2%83%E4%B8%8B%E6%8E%A7%E5%88%B6%E5%8F%B0%E6%8B%BC%E6%8E%A5%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BE%93%E5%87%BA%E6%9C%89undefind/</link>
      <pubDate>Sat, 22 Mar 2025 18:56:33 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/nodejs%E7%8E%AF%E5%A2%83%E4%B8%8B%E6%8E%A7%E5%88%B6%E5%8F%B0%E6%8B%BC%E6%8E%A5%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BE%93%E5%87%BA%E6%9C%89undefind/</guid>
      <description>&lt;p&gt;今天在Nodejs环境下搓小工具，控制台输出拼接字符串时，发现有&lt;code&gt;undefind&lt;/code&gt;，代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; date &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#d699b6&#34;&gt;Date&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; year &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; date.getFullYear();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; month &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; date.getMonth();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; day &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; date.getDate();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; hour &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; date.getHours();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; minute &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; date.getMinutes();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; second &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; date.getSeconds();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;const&lt;/span&gt; logTime &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;`[&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;year&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;month&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;day&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;hour&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;minute&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;${&lt;/span&gt;second&lt;span style=&#34;color:#b2c98f&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b2c98f&#34;&gt;] `&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;class&lt;/span&gt; GenerateLog {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; log() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    process.stdout.write(logTime);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;console.log(GenerateLog.log() &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;log output on the console&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出确是这样：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[2025-3-22 18:56:33] undefindlog output on the console&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因&#xA;：&lt;code&gt;GenerateLog.log()&lt;/code&gt;方法没有返回值，所以输出&lt;code&gt;undefind&lt;/code&gt;，解决方法如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 让log方法返回logTime&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;class&lt;/span&gt; GenerateLog {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; log() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; logTime; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;// 返回字符串&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;console.log(GenerateLog.log() &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;log output on the console&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关键总结：&#xA;Javascript中，如果方法没有返回值，那么输出的就是&lt;code&gt;undefind&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;扩展&#34;&gt;扩展&lt;/h4&gt;&#xA;&lt;p&gt;为什么 console.log() 本身会返回 undefined？&#xA;在 REPL 环境（如 Node.js 命令行或浏览器控制台）中，每条语句的执行结果会被隐式打印。由于 console.log() 函数本身没有返回值（即返回 undefined），因此会显示 undefined。但在脚本执行时，这一行为不会发生，因为脚本模式不自动打印返回值&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Kitty终端美化记录</title>
      <link>https://blog.verdant.ee/posts/kitty%E7%BB%88%E7%AB%AF%E7%BE%8E%E5%8C%96%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Sun, 09 Mar 2025 12:41:10 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/kitty%E7%BB%88%E7%AB%AF%E7%BE%8E%E5%8C%96%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;p&gt;Kitty这个终端可谓是兼顾了性能与美观，虽然默认设置很简陋，但是经过一番折腾后也能变得很漂亮。&lt;/p&gt;&#xA;&lt;h2 id=&#34;选择配色&#34;&gt;选择配色&lt;/h2&gt;&#xA;&lt;p&gt;运行&lt;code&gt;kitty + kitten themes&lt;/code&gt;后会弹出一个选择配色的界面&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250309124346.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;令我感到非常高兴的是，这个界面支持vim的hjkl键位，也可以用/来搜索。&#xA;选好后，回车按m，command + ^ + ,重载配置文件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;配置字体&#34;&gt;配置字体&lt;/h2&gt;&#xA;&lt;p&gt;打开kitty的配置文件&lt;code&gt;nvim ~/.config/kitty/kitty.conf&lt;/code&gt;，把字号改到12&#xA;&lt;code&gt;font_size 12&lt;/code&gt;&#xA;输入&lt;code&gt;kitty list-fonts --psnames&lt;/code&gt;来列出系统安装好的所有等宽字体。&lt;/p&gt;&#xA;&lt;h2 id=&#34;设置窗口风格&#34;&gt;设置窗口风格&lt;/h2&gt;&#xA;&lt;p&gt;进入配置文件&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#window&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 不显示窗口标题栏 保留窗口圆角&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hide_window_decorations titlebar-only&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 边距&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;window_padding_width 5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 不透明度&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;background_opacity   0.8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 毛玻璃效果&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;background_blur      30&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;设置标签栏风格&#34;&gt;设置标签栏风格&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#tab bar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tab_bar_edge          top&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tab_bar_style         powerline&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tab_powerline_style   slanted&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;安装终端文件管理器&#34;&gt;安装终端文件管理器&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;yay -S yazi&lt;/code&gt;&#xA;推荐yazi的原因，就是能用vim快捷键啊！hjkl好文明！&#xA;而且它还能直接在终端预览图片&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250309131507.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;最终效果预览&#34;&gt;最终效果预览&lt;/h2&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250309131145.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250309131221.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>KDE桌面环境无法在Konsole切换中文输入法的解决方案</title>
      <link>https://blog.verdant.ee/posts/kde%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83%E6%97%A0%E6%B3%95%E5%9C%A8konsole%E5%88%87%E6%8D%A2%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5%E6%B3%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</link>
      <pubDate>Sat, 08 Mar 2025 22:07:58 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/kde%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83%E6%97%A0%E6%B3%95%E5%9C%A8konsole%E5%88%87%E6%8D%A2%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5%E6%B3%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</guid>
      <description>&lt;h3 id=&#34;原因&#34;&gt;原因&lt;/h3&gt;&#xA;&lt;p&gt;KDE默认使用Wayland会话，而fcitx4不支持Wayland，需升级到fcitx5。若无法升级到fcitx5或升级后仍然无法切换中文输入法，&lt;strong&gt;安装fcitx-qt6&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo pacman -S fcitx-qt6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装后执行&lt;code&gt;sudo reboot now&lt;/code&gt;进行重启，问题解决。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>【无废话】全网最简单的Hexo+Obsidian图片解决方案</title>
      <link>https://blog.verdant.ee/posts/%E6%97%A0%E5%BA%9F%E8%AF%9D%E5%85%A8%E7%BD%91%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84hexo+obsidian%E5%9B%BE%E7%89%87%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</link>
      <pubDate>Wed, 05 Mar 2025 21:17:42 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E6%97%A0%E5%BA%9F%E8%AF%9D%E5%85%A8%E7%BD%91%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84hexo+obsidian%E5%9B%BE%E7%89%87%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</guid>
      <description>&lt;p&gt;把Hexo博客根目录用黑曜石打开，如果已经打开了仓库&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250305215423.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;在弹出的窗口中选第二个。&lt;/p&gt;&#xA;&lt;p&gt;在source目录下新建images文件夹用于存放图片&#xA;设置 =&amp;gt; 文件与链接 =&amp;gt; 附件默认存放路径：选择指定的附件文件夹。路径填写刚刚创建的image文件夹的相对路径&#xA;取消使用Wiki链接&#xA;注意。由于我的文件结构是这样的所以这么填写，要&lt;strong&gt;根据自己的文件结构填写相对路径&lt;/strong&gt;。&#xA;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/Pasted%20image%2020250305215642.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;搞定，同时可以在本地编辑环境和博客网站中显示。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>【未解决】Windows WSL报错：Error: 0x80080005 ???????</title>
      <link>https://blog.verdant.ee/posts/%E6%9C%AA%E8%A7%A3%E5%86%B3windows-wsl%E6%8A%A5%E9%94%99error-0x80080005/</link>
      <pubDate>Tue, 04 Mar 2025 20:58:30 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E6%9C%AA%E8%A7%A3%E5%86%B3windows-wsl%E6%8A%A5%E9%94%99error-0x80080005/</guid>
      <description>&lt;p&gt;设备环境：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;操作系统：Windows 10&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;安装系统：Arch Linux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;错误日志：&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing, this may take a few minutes...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WslRegisterDistribution failed with error: 0x80080005&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error: 0x80080005 ???????&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Press any key to continue...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;网上有一篇&lt;a href=&#34;https://ask.csdn.net/questions/7625716&#34;&gt;文章&lt;/a&gt;提到这个错误，下面的评论回复以管理员权限运行命令提示符并执行&lt;code&gt;sc stop LxssManager&lt;/code&gt;和&lt;code&gt;sc start LxssManager&lt;/code&gt;&#xA;出现如下报错：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;C:\Windows\system32&amp;gt;sc stop LxssManager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[SC] OpenService 失败 1060:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;指定的服务未安装。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;顺藤摸瓜，在网上寻找&lt;code&gt;LxssManager&lt;/code&gt;这个服务要如何安装。&#xA;网上暂时还没有找到相关文章能够解决这个问题，但是CSDN的一篇文章引起了我的注意&#xA;&lt;a href=&#34;https://blog.csdn.net/renwudao24/article/details/52061906&#34;&gt;[SC] OpenService 失败：1060指定的服务未安装_[sc] openservice 失败 1060: 指定的服务未安装。-CSDN博客&lt;/a&gt;&#xA;文章中提到了“服务”，在开始菜单中搜索服务，进入应用找到了一个名为WSL Service的服务。点左上角启动。&#xA;提取关键信息：&lt;strong&gt;1058、被禁用、关联的设备没有启动&lt;/strong&gt;。&#xA;检查功能是否开启：按下 &lt;code&gt;Win+S&lt;/code&gt; 搜索 &lt;strong&gt;启用或关闭Windows功能&lt;/strong&gt;&#xA;勾选&lt;code&gt;适用于Linux的Windows子系统&lt;/code&gt;和&lt;code&gt;虚拟机平台&lt;/code&gt;这两项，点击确定&#xA;重启电脑。&#xA;回来以后，用管理员身份运行powershell，强制重置WSL服务，依次执行：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wsl --shutdown&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wsl --unregister Arch &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 替换为你的发行版名称&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wsl --install -d Arch &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 重新注册发行版&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果提示内核缺失，在这里下&lt;a href=&#34;https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi&#34;&gt;https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;如果有以下输出：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zcz  system32  ♥ 21:32  wsl --shutdown&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;此应用程序需要适用于 Linux 的 Windows 子系统可选组件。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;通过运行安装它： wsl.exe --install --no-distribution&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;可能需要重新启动系统才能使更改生效。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;错误代码: Wsl/WSL_E_WSL_OPTIONAL_COMPONENT_REQUIRED&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两种可能：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;没有安装WSL服务&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;服务被禁用&lt;/strong&gt;&#xA;后者比较棘手，我们先做第一种尝试&#xA;&lt;strong&gt;强制安装WSL组件&lt;/strong&gt;&#xA;&lt;strong&gt;以管理员身份运行 PowerShell&lt;/strong&gt;，执行以下命令：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 安装WSL核心组件（会自动启用虚拟化功能）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wsl --install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zcz  system32  ♥ &lt;span style=&#34;color:#d699b6&#34;&gt;21&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;34&lt;/span&gt;  wsl &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;正在安装 Windows 可选组件: Microsoft&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Windows&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Subsystem&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Linux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Deployment &lt;span style=&#34;color:#e67e80&#34;&gt;Image&lt;/span&gt; Servicing &lt;span style=&#34;color:#7a8478&#34;&gt;and&lt;/span&gt; Management &lt;span style=&#34;color:#e67e80&#34;&gt;tool&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Version: &lt;span style=&#34;color:#d699b6&#34;&gt;10.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;19041.3636&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;Image&lt;/span&gt; Version: &lt;span style=&#34;color:#d699b6&#34;&gt;10.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;19045.5487&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;启用一个或多个功能&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#7a8478&#34;&gt;==========================&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;100.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;%==========================&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The operation completed successfully&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;正在安装 Windows 可选组件: VirtualMachinePlatform&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Deployment &lt;span style=&#34;color:#e67e80&#34;&gt;Image&lt;/span&gt; Servicing &lt;span style=&#34;color:#7a8478&#34;&gt;and&lt;/span&gt; Management &lt;span style=&#34;color:#e67e80&#34;&gt;tool&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Version: &lt;span style=&#34;color:#d699b6&#34;&gt;10.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;19041.3636&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;Image&lt;/span&gt; Version: &lt;span style=&#34;color:#d699b6&#34;&gt;10.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;19045.5487&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;启用一个或多个功能&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#7a8478&#34;&gt;==========================&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;100.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;%==========================&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The operation completed successfully&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;请求的操作成功。直到重新启动系统前更改将不会生效。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再次进行重启。&#xA;&lt;code&gt;Restart-Computer&lt;/code&gt;&#xA;开机加载界面显示：我们无法完成更新，正在撤销更改。。&#xA;尝试过的方法：进入安全模式，尝试重启更新，失败。&#xA;安全模式仍然失败，选择临时禁用WSL服务&#xA;管理员cmd执行&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;sc &lt;/span&gt;config LxssManager start= disabled&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;shutdown /&lt;span style=&#34;color:#d699b6&#34;&gt;r &lt;/span&gt;/t &lt;span style=&#34;color:#d699b6&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;C:\Windows\system32&amp;gt;sc config LxssManager start= disabled&amp;amp;&amp;amp; shutdown /r /t 0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[SC] OpenService 失败 1060:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;指定的服务未安装。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;唉，老朋友，又见面了。只能祭出来我的终极大杀器。&lt;/p&gt;&#xA;&lt;h3 id=&#34;彻底重装wsl&#34;&gt;&lt;strong&gt;彻底重装WSL&lt;/strong&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 卸载所有发行版&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wsl --unregister *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 删除残留配置&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;Remove-Item&lt;/span&gt; -Path &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;&lt;/span&gt;$env:USERPROFILE&lt;span style=&#34;color:#b2c98f&#34;&gt;\AppData\Local\Packages\*Linux*&amp;#34;&lt;/span&gt; -Recurse -Force&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zcz  system32  ♥ 22:04  # 卸载所有发行版&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; wsl --unregister *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; # 删除残留配置&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Remove-Item -Path &amp;#34;$env:USERPROFILE\AppData\Local\Packages\*Linux*&amp;#34; -Recurse -Force&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;正在注销。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;此应用程序需要适用于 Linux 的 Windows 子系统可选组件。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;通过运行安装它： wsl.exe --install --no-distribution&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;可能需要重新启动系统才能使更改生效。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;错误代码: Wsl/WSL_E_WSL_OPTIONAL_COMPONENT_REQUIRED&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输入&lt;code&gt;wsl.exe --install --no-distribution&lt;/code&gt;&#xA;输出：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zcz  system32  ♥ &lt;span style=&#34;color:#d699b6&#34;&gt;22&lt;/span&gt;:&lt;span style=&#34;color:#d699b6&#34;&gt;09&lt;/span&gt;  wsl&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;exe &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;install &lt;span style=&#34;color:#7a8478&#34;&gt;--&lt;/span&gt;no&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;distribution&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;正在安装 Windows 可选组件: Microsoft&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Windows&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Subsystem&lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt;Linux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Deployment &lt;span style=&#34;color:#e67e80&#34;&gt;Image&lt;/span&gt; Servicing &lt;span style=&#34;color:#7a8478&#34;&gt;and&lt;/span&gt; Management &lt;span style=&#34;color:#e67e80&#34;&gt;tool&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Version: &lt;span style=&#34;color:#d699b6&#34;&gt;10.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;19041.3636&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;Image&lt;/span&gt; Version: &lt;span style=&#34;color:#d699b6&#34;&gt;10.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;19045.5487&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;启用一个或多个功能&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#7a8478&#34;&gt;==========================&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;100.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;%==========================&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The operation completed successfully&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;正在安装 Windows 可选组件: VirtualMachinePlatform&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Deployment &lt;span style=&#34;color:#e67e80&#34;&gt;Image&lt;/span&gt; Servicing &lt;span style=&#34;color:#7a8478&#34;&gt;and&lt;/span&gt; Management &lt;span style=&#34;color:#e67e80&#34;&gt;tool&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Version: &lt;span style=&#34;color:#d699b6&#34;&gt;10.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;19041.3636&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;Image&lt;/span&gt; Version: &lt;span style=&#34;color:#d699b6&#34;&gt;10.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;19045.5487&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;启用一个或多个功能&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#7a8478&#34;&gt;==========================&lt;/span&gt;&lt;span style=&#34;color:#d699b6&#34;&gt;100.0&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;%==========================&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The operation completed successfully&lt;span style=&#34;color:#7a8478&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;请求的操作成功。直到重新启动系统前更改将不会生效。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;继续重启，显示“我们无法完成更新，正在撤销更改。”&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;以管理员身份打开CMD&lt;/strong&gt;：&#xA;按下 &lt;code&gt;Win+S&lt;/code&gt; → 输入 &lt;code&gt;cmd&lt;/code&gt; → 右键选择 &lt;strong&gt;“以管理员身份运行”&lt;/strong&gt;  &lt;strong&gt;执行以下命令（注意语法）&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sc config LxssManager start= auto&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sc config vmcompute start= auto&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net start LxssManager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net start vmcompute&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;仍然1085，管理员cmd执行&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;尝试重装WSL，出现&#xA;![[_posts\Windows-WSL报错：Error-0x80080005\Pasted image 20250304222548.png]]&lt;/p&gt;&#xA;&lt;p&gt;研究了一阵子，&lt;strong&gt;&lt;code&gt;vmcompute&lt;/code&gt;&lt;/strong&gt;（虚拟机核心服务）和 &lt;strong&gt;&lt;code&gt;LxssManager&lt;/code&gt;&lt;/strong&gt;（WSL管理服务）均未注册，导致WSL安装向导崩溃。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-Powershell&#34; data-lang=&#34;Powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;# 以管理员身份运行&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dism.exe /online /&lt;span style=&#34;color:#d699b6&#34;&gt;enable-feature&lt;/span&gt; /featurename:&lt;span style=&#34;color:#d699b6&#34;&gt;Microsoft-Windows&lt;/span&gt;-Subsystem-Linux /all /norestart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dism.exe /online /&lt;span style=&#34;color:#d699b6&#34;&gt;enable-feature&lt;/span&gt; /featurename:VirtualMachinePlatform /all /norestart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dism.exe /online /&lt;span style=&#34;color:#d699b6&#34;&gt;enable-feature&lt;/span&gt; /featurename:HypervisorPlatform /all /norestart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启，“我们无法完成更新，正在撤销更改。”&#xA;。。。。。、、、、&#xA;尽力了。现在看来，是系统层面的硬伤了。可能行得通的有重装系统和保留文件重置系统两个选择。不过我还是会和这个问题死磕一下，我就不信我干不成这个事。明天还要苦逼上学，先睡了。&#xA;2025.3.4 22:57&lt;/p&gt;&#xA;&lt;p&gt;————————————————————————————&lt;/p&gt;&#xA;&lt;p&gt;2025.3.5&lt;/p&gt;&#xA;&lt;p&gt;尝试&lt;strong&gt;强制修复系统核心组件&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 以管理员身份运行 PowerShell&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sfc /scannow&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DISM /Online /Cleanup-Image /RestoreHealth&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;重置 Windows Update 组件&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 管理员cmd执行 net stop wuauserv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net stop cryptSvc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net stop bits&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net stop msiserver&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rmdir C:\Windows\SoftwareDistribution /S /Q&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net start wuauserv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net start cryptSvc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net start bits&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net start msiserver&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 强制重建WSL核心服务&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sc create vmcompute binPath= &amp;#34;C:\Windows\System32\vmcompute.exe&amp;#34; start= auto type= kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sc create LxssManager binPath= &amp;#34;C:\Windows\System32\lxss\LxssManager.dll&amp;#34; start= auto type= own&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net start vmcompute&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net start LxssManager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;仍然无法启动。使用wsl偶遇神秘怪异bug拼尽全力无法战胜。我都已经浪费这么长时间来研究这个问题，为什么我不直接装个Linux系统呢。周末就把这傻卵系统换成Arch！&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>记录Typecho博客转移到Hexo</title>
      <link>https://blog.verdant.ee/posts/4/</link>
      <pubDate>Mon, 03 Mar 2025 15:40:00 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/4/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;&#xA;&lt;p&gt;折腾来折腾去，最后发现归宿还是静态博客，安全性高、性能开销小，用Github直接省去服务器费用还差不多永生。每年把域名钱交了就得了，图片的问题再想想办法，总能解决的。&#xA;&lt;del&gt;突然有一种为了躲避战乱带着一家人四处奔波的悲凉感&lt;/del&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;分析&#34;&gt;分析&lt;/h1&gt;&#xA;&lt;p&gt;博客网站的内容，都可以拆分为以下几个点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;文章&lt;/li&gt;&#xA;&lt;li&gt;评论&lt;/li&gt;&#xA;&lt;li&gt;文章插图&lt;/li&gt;&#xA;&lt;li&gt;网站贴图资源&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;先从最主要的文章开始，想想有没有什么可以用的。&#xA;gitee上有一个&lt;a href=&#34;https://gitcode.com/gh_mirrors/ty/Typecho-Plugin-Tp2MD&#34;&gt;插件&lt;/a&gt;，看起来好像有点用，折腾安装一下试试先。&lt;/p&gt;&#xA;&lt;h1 id=&#34;tp2md插件迁移文章&#34;&gt;Tp2MD插件迁移文章&lt;/h1&gt;&#xA;&lt;p&gt;远程登录服务器，把本地下号的zip传到服务器上并解压。&#xA;cd到插件目录&#xA;&lt;code&gt;/usr/share/nginx/html/usr/plugins&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;解压压缩包&#xA;&lt;code&gt;unzip Typecho-Plugin-Tp2MD-master.zip&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;重命名为插件的自述文件要求的名称&#xA;&lt;code&gt;mv Typecho-Plugin-Tp2MD-master Tp2MD&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;登录网站后台，启用插件。点击插件的设置，保存后按照教程访问。&#xA;这里提示&lt;code&gt;不能写入文件，请检查 cache 文件夹权限！&lt;/code&gt;，我们在插件目录设置一下权限&#xA;&lt;code&gt;sudo chmod -R 777 cache&lt;/code&gt;a&#xA;注意是这个插件目录下的cache！！&lt;/p&gt;&#xA;&lt;p&gt;提示导出成功，cd到这个目录，把文件压缩下载下来查看&#xA;可能是因为我有的文章点了多篇分类，导出文件夹有点问题，无所谓，后期再调，拿到了就行。至此，文章部分搞定！&lt;/p&gt;&#xA;&lt;h1 id=&#34;评论&#34;&gt;评论&lt;/h1&gt;&#xA;&lt;p&gt;评论这里，我折腾了两天，尝试尽了各种方案（Disqus Valine Waline Utterances Twikoo Atalk），最后还是选择了Giscus。我也知道这样读者没有github就没办法发评论，但是其他几种方案都会出现各种奇奇怪怪且无法解决的问题比如Cloudflare拦截、CORS出毛病、服务器被墙以及莫名其妙404、403。我真的尽力了。&lt;/p&gt;&#xA;&lt;h1 id=&#34;文章插图&#34;&gt;文章插图&lt;/h1&gt;&#xA;&lt;h2 id=&#34;转移图片文件&#34;&gt;转移图片文件&lt;/h2&gt;&#xA;&lt;p&gt;进入&lt;code&gt;/usr/uploads/&lt;/code&gt;，压缩下载图片&lt;/p&gt;&#xA;&lt;p&gt;重组Hexo图片目录：复制所有图片到Hexo的&lt;code&gt;source/images/&lt;/code&gt;目录。&lt;/p&gt;&#xA;&lt;p&gt;手动替换图片路径 ，注意，静态资源解析默认以source为根目录，所以直接写以source为根目录的绝对路径就行。&lt;/p&gt;&#xA;&lt;h1 id=&#34;部署到vercel加速访问&#34;&gt;部署到vercel加速访问&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;注册vercel账号&lt;/li&gt;&#xA;&lt;li&gt;创建项目，关联仓库&lt;/li&gt;&#xA;&lt;li&gt;域名解析&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;2025.3.3，博客全部迁移完毕，粗略累计用时六天，一直没什么时间搞，耗时最长的还是在评论系统上的试错。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Java面向对象编程——多态、抽象类、接口</title>
      <link>https://blog.verdant.ee/posts/186/</link>
      <pubDate>Fri, 10 Jan 2025 15:05:00 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/186/</guid>
      <description>&lt;h2 id=&#34;什么是多态&#34;&gt;什么是多态&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在继承/实现情况下的一种现象，表现为：对象多态、行为多态。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;多态的前提&#34;&gt;多态的前提&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;有&lt;strong&gt;继承/实&lt;/strong&gt;现关系；存在父类引用子类对象；&lt;strong&gt;存在方法重写&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;h2 id=&#34;多态的注意事项&#34;&gt;多态的注意事项&lt;/h2&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;多态是对象、行为的多态，成员变量不体现多态。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;使用多态的好处&#34;&gt;使用多态的好处&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在多态形式下，右边的对象是解耦合的，更便于拓展和维护。&lt;/li&gt;&#xA;&lt;li&gt;定义方法时，使用父类类型的形参，可以接收一切子类对象，扩展性更强、更便利。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;多态下产生的一个问题&#34;&gt;多态下产生的一个问题&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;多态下不能使用子类的独有功能。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;多态下的类型转换&#34;&gt;多态下的类型转换&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;自动类型转换：&lt;code&gt;父类 变量名 = new 子类();&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;强制类型转换： &lt;code&gt;子类 变量名 = (子类)父类变量&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;强制类型转换的注意事项&#34;&gt;强制类型转换的注意事项&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;存在继承/实现关系就可以在编译阶段进行强制类型转换，编译阶段不会报错。&lt;/li&gt;&#xA;&lt;li&gt;运行时，如果发现对象的真实类型与强转后的类型不同，就会报类型转换异常(ClassCastException)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;强转前java建议&#34;&gt;强转前，Java建议：&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用instanceof关键字，判断当前对象的真是类型，再进行强制类型转换。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;final&#34;&gt;final&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;final关键字的中文是最终的意思，可以修饰类、方法、变量&#xA;&lt;ul&gt;&#xA;&lt;li&gt;修饰类：该类被称为最终类，特点是不能被继承了。&lt;/li&gt;&#xA;&lt;li&gt;修饰方法：该方法被称为最终方法，特点是不能被重写了。&lt;/li&gt;&#xA;&lt;li&gt;修饰变量：该变量只能被赋值一次。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;常量&#34;&gt;常量&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用了static final 修饰的成员变量就被称为常量；&lt;/li&gt;&#xA;&lt;li&gt;作用：通常用于记录系统的配置信息。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;注意：常量的命名规范：使用大写英文单词，多个单词使用下划线连接起来。&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;视同常量记录系统配置信息的优势执行原理&#34;&gt;视同常量记录系统配置信息的优势、执行原理&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;代码可读性更好、可维护性也更好。&lt;/li&gt;&#xA;&lt;li&gt;程序编译后，常量会被宏替换：出现常量的地方全部会被替换成其记住的字面量，这样可以保证使用常量和直接用字面量的性能是一样的。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;抽象类&#34;&gt;抽象类&lt;/h2&gt;&#xA;&lt;h3 id=&#34;什么是抽象类&#34;&gt;什么是抽象类&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Java中有个关键字叫abstract，他就是抽象的意思，可以用来修饰类、成员方法&lt;/li&gt;&#xA;&lt;li&gt;abstract修饰类，这个就是抽象类，修饰成员方法同理。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;抽象类的注意事项特点&#34;&gt;抽象类的注意事项、特点&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;抽象类中不一定有抽象方法，有抽象方法的类一定是抽象类。&lt;/li&gt;&#xA;&lt;li&gt;类该有的成员（成员变量、方法、构造器）抽象类都可以有。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;抽象类最主要的特点：&lt;/strong&gt; 抽象类不能创建对象，仅作为一种特殊的父类，让子类继承并实现。&lt;/li&gt;&#xA;&lt;li&gt;一个类继承抽象类，必须重写完抽象类的全部抽象方法，否则这个类也必须定义成抽象类。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;抽象类的使用场景和好处&#34;&gt;抽象类的使用场景和好处&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;父类知道每个子类都要做某个行为，但每个子类做的情况不一样，父类就定义成抽象方法，交给子类去重写实现，我们设计这样的抽象类，就是为了更好的支持多态。&lt;del&gt;爸爸画饼儿子烙饼&lt;/del&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;接口&#34;&gt;接口&lt;/h2&gt;&#xA;&lt;h3 id=&#34;接口概述&#34;&gt;接口概述&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Java提供了一个关键字interface，用这个关键字我们可以定义出一个特殊的结构：接口。&lt;/li&gt;&#xA;&lt;li&gt;注意：接口不能创建对象；接口是用来被类实现（implements）的，实现接口的类被称为实现类。&lt;/li&gt;&#xA;&lt;li&gt;一个类可以实现多个接口，实现类实现多个接口必须重写完全部接口的全部抽象方法，否则实现类需要定义成抽象类。&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Java面向对象编程——继承</title>
      <link>https://blog.verdant.ee/posts/185/</link>
      <pubDate>Fri, 10 Jan 2025 13:19:11 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/185/</guid>
      <description>&lt;h2 id=&#34;什么是继承&#34;&gt;什么是继承&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Java中提供了一个关键字&lt;code&gt;extends&lt;/code&gt;，用这个关键字，可以让一个类和另一个类建立起父子关系。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;继承的特点&#34;&gt;继承的特点&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;子类能继承父类的非私有成员变量和成员方法。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;继承后对象的创建&#34;&gt;继承后对象的创建&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;子类的对象是由子类、父类共同完成的。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;继承相关的注意事项&#34;&gt;继承相关的注意事项&lt;/h2&gt;&#xA;&lt;h3 id=&#34;权限修饰符&#34;&gt;权限修饰符&lt;/h3&gt;&#xA;&lt;h4 id=&#34;什么是权限修饰符&#34;&gt;什么是权限修饰符？&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用来限制类中的成员（成员变量、成员方法、构造器、代码块&amp;hellip;）能够被访问的范围&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;权限修饰符有几种与各自的作用&#34;&gt;权限修饰符有几种与各自的作用&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;修饰符&lt;/th&gt;&#xA;          &lt;th&gt;在本类中&lt;/th&gt;&#xA;          &lt;th&gt;同一个包下的其他类&lt;/th&gt;&#xA;          &lt;th&gt;任意包下的子类&lt;/th&gt;&#xA;          &lt;th&gt;任意包下的任意类&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;private&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;缺省&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;protected&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;public&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;provate &amp;lt; 缺省 &amp;lt; protected &amp;lt; public&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;单继承&#34;&gt;单继承&lt;/h2&gt;&#xA;&lt;p&gt;Java是&lt;strong&gt;继承&lt;/strong&gt;的，Java中的类&lt;strong&gt;不支持多继承&lt;/strong&gt;，但是支持&lt;strong&gt;多层继承&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;object类&#34;&gt;Object类&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ojbect类是所有Java类的父类，任何类都是Object的子类。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;方法重写&#34;&gt;方法重写&lt;/h2&gt;&#xA;&lt;h3 id=&#34;什么是方法重写&#34;&gt;什么是方法重写&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;当子类发现父类中的方法无法满足自己的需求时，&lt;strong&gt;子类可以重写一个方法名称、参数列表一样的方法&lt;/strong&gt;去覆盖父类的这个方法，这就是方法重写。&lt;/li&gt;&#xA;&lt;li&gt;注意：方法重写后，方法的访问遵循&lt;strong&gt;就近原则&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;方法重写的注意事项&#34;&gt;方法重写的注意事项&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;重写时使用&lt;strong&gt;Override注解&lt;/strong&gt;，他可以指定Java编译器，检查我们方法重写的格式是否正确，代码可读性也会更好。&lt;/li&gt;&#xA;&lt;li&gt;子类重写父类方法时，访问权限必须大于或等于父类该方法的权限（&lt;strong&gt;public &amp;gt; protected &amp;gt; 缺省&lt;/strong&gt;）。&lt;/li&gt;&#xA;&lt;li&gt;重写的方法返回值类型，必须与被重写方法的返回值类型一样，或者范围更小。&lt;/li&gt;&#xA;&lt;li&gt;私有方法、静态方法不能被重写，如果重写会报错。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;方法重写在开发中的常见应用场景&#34;&gt;方法重写在开发中的常见应用场景&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;子类重写Object类的toString()方法，以便返回对象的内容。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;子类中访问其他成员的特点&#34;&gt;子类中访问其他成员的特点&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;在子类方法中访问其他成员是按照就近原则的。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;先子类局部范围找。&lt;/li&gt;&#xA;&lt;li&gt;然后子类成员范围找。&lt;/li&gt;&#xA;&lt;li&gt;然后父类成员找&lt;/li&gt;&#xA;&lt;li&gt;然后父类成员范围找，如果父类范围还没有找到则报错。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;如果子父类中，出现了重名的成员，会优先使用子类的，如果此时一定要在子类中使用父类的方法怎么办？&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;可以通过&lt;code&gt;super&lt;/code&gt;关键字，指定访问父类的成员：&lt;code&gt;super.父类成员变量/父类成员方法&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;子类构造器的特点&#34;&gt;子类构造器的特点&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;子类的全部构造器，都会先调用父类的构造器，再执行自己。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;子类构造器是如何实现调用父类构造器的&#34;&gt;子类构造器是如何实现调用父类构造器的：&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;默认情况下，子类全部构造器的第一行代码是&lt;code&gt;super();&lt;/code&gt;（写不写都有），他会调用父类的无参数构造器。&lt;/li&gt;&#xA;&lt;li&gt;如果父类没有无参数构造器，我们必须在子类构造器的第一行手写&lt;code&gt;super();&lt;/code&gt;，指定去调用父类的构造器。&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>修复Geyser下基岩版玩家无法在地狱基岩层放置方块</title>
      <link>https://blog.verdant.ee/posts/184/</link>
      <pubDate>Wed, 08 Jan 2025 17:26:00 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/184/</guid>
      <description>&lt;p&gt;在&lt;code&gt;plugins\Geyser-Spigot\config.yml&lt;/code&gt;中把第160行的&lt;code&gt;above-bedrock-nether-building: false&lt;/code&gt;改为&lt;code&gt;true&lt;/code&gt;，重启服务器，问题解决~&#xA;原理：geyser把下界翻译成了末地，会导致下界天空变成末地的样式，不过可以解决基岩版玩家在地狱基岩层的问题。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Spigot服务端控制台中文乱码解决方案</title>
      <link>https://blog.verdant.ee/posts/181/</link>
      <pubDate>Sat, 04 Jan 2025 08:35:00 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/181/</guid>
      <description>&lt;ol&gt;&#xA;&lt;li&gt;把&lt;code&gt;-Dfile.encoding=UTF-8&lt;/code&gt;加在开服脚本文件的&lt;code&gt;-jar&lt;/code&gt;前即可。&lt;/li&gt;&#xA;&lt;li&gt;在启动脚本第一行加上&lt;code&gt;chcp 65001&lt;/code&gt;&#xA;我的启动脚本如下：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chcp &lt;span style=&#34;color:#d699b6&#34;&gt;65001&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;java -Dfile.encoding&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;UTF-8 -jar spigot-1.21.jar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>String的注意事项</title>
      <link>https://blog.verdant.ee/posts/171/</link>
      <pubDate>Thu, 19 Dec 2024 22:28:15 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/171/</guid>
      <description>&lt;h1 id=&#34;string的注意事项&#34;&gt;String的注意事项&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;String对象的内容不可改变， 被称为不可变字符串对象。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;只要是以“&amp;hellip;”的方式写出的字符串，都会存储到字符串常量池，且相同的字符串只存储一份；&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;但通过new方式创建字符串对象，每new一次都会产生一个新的对象放在堆内存中。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;不可变字符串对象&#34;&gt;不可变字符串对象&lt;/h1&gt;&#xA;&lt;p&gt;不可变？它肯定可变啊，比如&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;package&lt;/span&gt; string;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;class&lt;/span&gt; StringDemo3 {  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; args) {  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String name &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;yingyu5658&amp;#34;&lt;/span&gt;;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        name &lt;span style=&#34;color:#7a8478&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;.me&amp;#34;&lt;/span&gt;;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        name &lt;span style=&#34;color:#7a8478&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;域名&amp;#34;&lt;/span&gt;;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(name);  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这时候把name打印出来不就是&lt;code&gt;yingyu5658.me域名&lt;/code&gt;了吗？&#xA;&lt;strong&gt;每次试图改变字符串对象实际上是新产生可字符串对象，变量每次都与指向了新的字符串对象，之前字符串对象的内容确实是没有改变的，因此说String的对象都是不可变的。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;第二点注意事项&#34;&gt;第二点注意事项&lt;/h1&gt;&#xA;&lt;p&gt;示例代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;package&lt;/span&gt; string;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;class&lt;/span&gt; StringDemo3 {  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; args) {  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String s1 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;abc&amp;#34;&lt;/span&gt;;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String s2 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;abc&amp;#34;&lt;/span&gt;;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(s1 &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; s2);  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//true  &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里使用双等来判断两个变量的地址是否相同，返回结果为&lt;code&gt;true&lt;/code&gt;,也就是说，地址是相同的。&#xA;原理：上文提到，双引号包裹住的字符串，会被保存到字符串常量池中，&lt;strong&gt;且相同的字符串只存储一份&lt;/strong&gt;。这里我们声明了两个内容为abc的String类型变量。Java是很聪明的，当我们把s2声明，它要存到字符串常量池时，看到内容一样，就不再存了，而是把&lt;strong&gt;s2也指向abc&lt;/strong&gt;，因此s1地址和s2地址是一样的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;new&#34;&gt;new&lt;/h2&gt;&#xA;&lt;p&gt;示例代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;package&lt;/span&gt; string;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;class&lt;/span&gt; StringDemo3 {  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; args) {  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#dbbc7f&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; chars &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;b&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#39;c&amp;#39;&lt;/span&gt;};  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       String a1 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; String(chars);  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       String a2 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt;  &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; String(chars);  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(a1 &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; a2);  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//false  &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上文提到，每new一次就会创建一个新的对象，所以此时再比较两者地址，返回false，是不同的。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>面向对象编程总结</title>
      <link>https://blog.verdant.ee/posts/166/</link>
      <pubDate>Wed, 18 Dec 2024 16:30:00 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/166/</guid>
      <description>&lt;p&gt;面向对象（oop）&lt;/p&gt;&#xA;&lt;h2 id=&#34;面向对象编程的思想面向拿或者找&#34;&gt;面向对象编程的思想：面向。拿或者找。&lt;/h2&gt;&#xA;&lt;p&gt;对象：东西&#xA;面向对象编程：拿东西过来编程&#xA;面向对象：把现实世界中的食物看成一个一个对象来解决问题的。（万物皆 对象）&#xA;面向对象的好处：代码更符合人类的思维习惯。编程更简单。看程序更容易理解（？）&lt;/p&gt;&#xA;&lt;h2 id=&#34;类对象&#34;&gt;类、对象：&lt;/h2&gt;&#xA;&lt;p&gt;类（设计图）：相同事物，共同特征的描述。&#xA;对象：对象是类的具体的实例。&#xA;对象 = 实例&#xA;在Java中必须先定义类，才能得到对象&lt;/p&gt;&#xA;&lt;h2 id=&#34;定义类来创建对象使用&#34;&gt;定义类来创建对象使用&lt;/h2&gt;&#xA;&lt;h3 id=&#34;定义类的格式&#34;&gt;定义类的格式&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;成员变量（代表属性，一般是名词）：数据类型 名称;&lt;/li&gt;&#xA;&lt;li&gt;成员方法（代表行为，一般是动词）&lt;/li&gt;&#xA;&lt;li&gt;构造器（前面的区域以后再来探索吧）&lt;/li&gt;&#xA;&lt;li&gt;代码块（前面的区域以后再来探索吧）&lt;/li&gt;&#xA;&lt;li&gt;内部类（前面的区域以后再来探索吧）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;类中具体怎么写&#34;&gt;类中具体怎么写：&lt;/h3&gt;&#xA;&lt;p&gt;一般名词定义成成员变量（属性）&#xA;&lt;code&gt;修饰符 数据类型 变量名称 = 初始值&lt;/code&gt;&#xA;成员变量不建议给初始值，它存在默认值。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一般动词定义成方法行为&#34;&gt;一般动词定义成方法（行为）&lt;/h3&gt;&#xA;&lt;h4 id=&#34;创建对象&#34;&gt;创建对象&lt;/h4&gt;&#xA;&lt;p&gt;&lt;code&gt;类名 对象名 = new 构造器();&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;对象使用&#34;&gt;对象使用：&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;对象名.成员变量&lt;/code&gt;&#xA;&lt;code&gt;对象名.成员方法&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;构造器&#34;&gt;构造器&lt;/h2&gt;&#xA;&lt;pre&gt;&lt;code&gt;&#x9;作用：&#xA;&#x9;&#x9;初始化一个累的对象并且返回这个类的地址。&#xA;&#x9;&#x9;详细格式：修饰符 类名(形参){...}&#xA;&#x9;&#x9;构造器的分类：&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;无参数构造器：初始化一个类的对象，里面的数据都是默认值，并返回地址。&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;有参数构造器：初始化一个类的对象，并返回地址，并且可以同时为对象赋值。&#xA;&#x9;&#x9;构造器如何调用：&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;类名 对象 = new 构造器;&#xA;&#x9;&#x9;注意：任何类写出来，自带无参数构造器&#xA;&#x9;&#x9;&#x9;   但是在这个类中定义了一个有参数构造器了，那么无参数构造器就消失了，此时如果还要使用无参数构造器，必须自己写一个。&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;this关键字&#34;&gt;this关键字&lt;/h2&gt;&#xA;&lt;p&gt;作用：代表了当前对象的地址。可以访问当前对象的成员变量信息和成员方法&lt;/p&gt;&#xA;&lt;h3 id=&#34;具体应用场景&#34;&gt;具体应用场景&lt;/h3&gt;&#xA;&lt;p&gt;可以用在有参数构造器中&#xA;可以用在方法中&lt;/p&gt;&#xA;&lt;h2 id=&#34;封装&#34;&gt;封装&lt;/h2&gt;&#xA;&lt;p&gt;面向对象三大特征：封装、继承、多态。&#xA;封装的基本思想：决定属性和行为归属谁的问题。&lt;/p&gt;&#xA;&lt;h2 id=&#34;如何更好的封装&#34;&gt;如何更好的封装：&lt;/h2&gt;&#xA;&lt;p&gt;成员变量私有化，只能在本类访问。&lt;/p&gt;&#xA;&lt;h4 id=&#34;合理暴露&#34;&gt;合理暴露&lt;/h4&gt;&#xA;&lt;p&gt;提供成套的getter和setter方法暴露取值赋值。&lt;/p&gt;&#xA;&lt;h2 id=&#34;标准javabean&#34;&gt;标准JavaBean&lt;/h2&gt;&#xA;&lt;p&gt;JavaBean是什么：是实体类。&#xA;作用：创建对象，封装数据。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>记录配置SSL证书</title>
      <link>https://blog.verdant.ee/posts/163/</link>
      <pubDate>Tue, 17 Dec 2024 11:46:07 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/163/</guid>
      <description>&lt;p&gt;首先你要有一个SSL证书，建议在阿里云购买或者&lt;a href=&#34;https://developer.aliyun.com/article/1595201&#34;&gt;免费申请&lt;/a&gt;，具体过程阿里云这个页面讲的很详细，在此不过多赘述。&lt;/p&gt;&#xA;&lt;h1 id=&#34;配置证书&#34;&gt;配置证书&lt;/h1&gt;&#xA;&lt;p&gt;由于我的nginx安装了ssl模块，直接进入配置证书。&lt;/p&gt;&#xA;&lt;p&gt;解压下载好的证书，然后上传到服务器。位置自己方便找到即可&#xA;我放到了root/card&lt;/p&gt;&#xA;&lt;h1 id=&#34;配置nginxconf&#34;&gt;配置nginx.conf&lt;/h1&gt;&#xA;&lt;p&gt;进入nginx.conf，我的文件位置在&lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt;,有些可能在&lt;code&gt;/usr/local/nginx/conf&lt;/code&gt;&#xA;编辑模式，启动！&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    include       mime.types;  # 包含 MIME 类型定义&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    default_type  application/octet-stream;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sendfile        on;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    keepalive_timeout  65;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # HTTPS server block&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    server {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        # 监听443端口（HTTPS）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        listen 443 ssl;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        # 【请修改】您的域名&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        server_name xxx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        # 启用 SSL (注意: &amp;#34;ssl on;&amp;#34; 已被弃用，直接使用 &amp;#34;listen ... ssl;&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ssl on;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        # 【请修改】SSL 证书的 PEM 文件路径&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ssl_certificate  /root/card/www.xxxx.pem;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        # 【请修改】SSL 证书的 KEY 文件路径&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ssl_certificate_key /root/card/www.xxxx.key;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        location / {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            # 【请修改】代理转发的目标地址和端口（例如公网IP和项目端口号）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            proxy_pass  http://公网地址:项目端口号;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # HTTP server block for redirecting to HTTPS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    server {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        # 监听80端口（HTTP）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        listen 80;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        # 【请修改】您的域名&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        server_name huiblog.top;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        # 将所有 HTTP 请求永久重定向到 HTTPS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        rewrite ^(.*)$ https://$host$1 permanent;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;重新加载nginx&#34;&gt;重新加载Nginx&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo systemctl reload nginx&lt;/code&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Typecho不要用阿里云系统镜像</title>
      <link>https://blog.verdant.ee/posts/156/</link>
      <pubDate>Sun, 15 Dec 2024 21:45:47 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/156/</guid>
      <description>&lt;p&gt;不要用阿里云的系统镜像，那个是1.1版本的。。。很多插件都没办法正常用。。。比如这两个插件就会这样&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/4097191903.webp&#34; alt=&#34;&#34;&gt;&#xA;    &lt;figcaption&gt;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;还有很多主题和插件都犯这样的毛病，在此不多提，我会想办法升级版本的（又挖了个坑）&lt;/p&gt;&#xA;&lt;p&gt;难受&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Vim基础操作快速入门</title>
      <link>https://blog.verdant.ee/posts/147/</link>
      <pubDate>Fri, 13 Dec 2024 16:13:36 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/147/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;&#xA;&lt;p&gt;各种鼠标操作让我有点抓狂，vim或许是一个很适合我的东西，全键盘操作听起来就很方便快捷，除了上手难度有点高以外，vim看起来似乎没有任何的缺点。在下载安装好了vim后，我开始学习了快捷键。&lt;del&gt;然后我们就可以直接把鼠标扔了。&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;记住要先把输入法切换成英文模式&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;普通模式&#34;&gt;普通模式&lt;/h1&gt;&#xA;&lt;h2 id=&#34;退出&#34;&gt;退出&lt;/h2&gt;&#xA;&lt;p&gt;很多人第一次用vim，最难受的事情绝对是不知道怎么退出。&#xA;退出：&lt;code&gt;:q!&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;移动光标&#34;&gt;移动光标&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;h&lt;/code&gt; &lt;code&gt;j&lt;/code&gt; &lt;code&gt;k&lt;/code&gt; &lt;code&gt;l&lt;/code&gt; 这四个按键分别对应左 下 上 右&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;这个比较难适应，不过也比把手移动到右下方用箭头键舒服了&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;大范围移动&#34;&gt;大范围移动&lt;/h3&gt;&#xA;&lt;p&gt;行数 + &lt;code&gt;h&lt;/code&gt;/ &lt;code&gt;j&lt;/code&gt;/ &lt;code&gt;k&lt;/code&gt;/ &lt;code&gt;l&lt;/code&gt;&#xA;比如，想要向下移动三行，就是3&lt;code&gt;j&lt;/code&gt;，向左移动四格，就是3&lt;code&gt;h&lt;/code&gt;&#xA;&lt;code&gt;gg&lt;/code&gt; 跳转到文档的最上方&#xA;&lt;code&gt;G&lt;/code&gt; 跳转到文档的最下方&lt;/p&gt;&#xA;&lt;h3 id=&#34;按照单词跳转&#34;&gt;按照单词跳转&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;w&lt;/code&gt;，也就是“word”的首字母。就可以跳转到下一个单词的开头。&#xA;&lt;code&gt;b&lt;/code&gt; beginning就跳转到前一个单词的开头&#xA;&lt;code&gt;f&lt;/code&gt; find 查找单词。比如要把光标移动到离你最近的b，就可以输入&lt;code&gt;fb&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;翻页&#34;&gt;翻页&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;Ctrl + u&lt;/code&gt;向上翻页。u理解为up首字母。&#xA;&lt;code&gt;Ctrl + d&lt;/code&gt;向下翻页。d理解为down首字母。&lt;/p&gt;&#xA;&lt;h2 id=&#34;复制粘贴&#34;&gt;复制粘贴&lt;/h2&gt;&#xA;&lt;p&gt;在普通模式下，输入&lt;code&gt;y&lt;/code&gt; （yank），复制整个单词：&lt;code&gt;yaw&lt;/code&gt; “aw&amp;rsquo;“为&lt;del&gt;阿伟&lt;/del&gt; all word&#xA;&lt;code&gt;p&lt;/code&gt; 即paste，粘贴。&lt;/p&gt;&#xA;&lt;h2 id=&#34;删除&#34;&gt;删除&lt;/h2&gt;&#xA;&lt;p&gt;普通模式下，&lt;code&gt;d&lt;/code&gt; 也就是delete，直接删除当前行和下一行的内容&#xA;还可以跟上文的&lt;code&gt;hjkl&lt;/code&gt;结合起来，比如d8j就是向下删除八行&lt;/p&gt;&#xA;&lt;h2 id=&#34;撤销&#34;&gt;撤销&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;u&lt;/code&gt; 也就是undo。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;这些快捷键很灵活，都可以互相结合使用&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;输入模式&#34;&gt;输入模式&lt;/h1&gt;&#xA;&lt;h2 id=&#34;进入输入模式&#34;&gt;进入输入模式&lt;/h2&gt;&#xA;&lt;p&gt;在普通模式下，输入&lt;code&gt;i&lt;/code&gt; 也就是insert，就可以进入输入模式了。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;i&lt;/code&gt;是在当前光标的前一个字母开始输入。&lt;/li&gt;&#xA;&lt;li&gt;使用&lt;code&gt;a&lt;/code&gt;也就是append，就可以在当前光标之后输入。&lt;/li&gt;&#xA;&lt;li&gt;使用&lt;code&gt;I&lt;/code&gt;就会从这一行的开头进入输入模式。&lt;/li&gt;&#xA;&lt;li&gt;使用&lt;code&gt;A&lt;/code&gt;就会从这一行的末尾进入输入模式。&#xA;完成编辑后，使用&lt;code&gt;ESC&lt;/code&gt; 就可以退出编辑模式，回到普通模式了。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h1 id=&#34;命令模式&#34;&gt;命令模式&lt;/h1&gt;&#xA;&lt;p&gt;在普通模式下输入&lt;code&gt;：&lt;/code&gt;就可以进入命令模式，按下&lt;code&gt;ESC&lt;/code&gt;就会退出命令模式。&#xA;在下方的命令行中，可以输入命令&#xA;&lt;code&gt;q&lt;/code&gt;也就是quit就可以退出&#xA;保存&lt;code&gt;w&lt;/code&gt;&#xA;保存并退出&lt;code&gt;wq&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;可视模式&#34;&gt;可视模式&lt;/h1&gt;&#xA;&lt;p&gt;普通模式下按下&lt;code&gt;v&lt;/code&gt;就可以进入可视模式。&lt;/p&gt;&#xA;&lt;h1 id=&#34;配置文件&#34;&gt;配置文件&lt;/h1&gt;&#xA;&lt;p&gt;vim中修改键位，安装主题全都是用一个配置文件来完成的。&#xA;原版vim的配置文件叫做.vimrc&#xA;关于修改键位，我的看法是不要改，因为你适应之后上服务器就会很难受，什么都不适应。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>游戏资源下载及连接服务器相关教程</title>
      <link>https://blog.verdant.ee/posts/%E6%B8%B8%E6%88%8F%E8%B5%84%E6%BA%90%E4%B8%8B%E8%BD%BD%E5%8F%8A%E8%BF%9E%E6%8E%A5%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9B%B8%E5%85%B3%E6%95%99%E7%A8%8B/</link>
      <pubDate>Fri, 13 Dec 2024 20:26:00 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/%E6%B8%B8%E6%88%8F%E8%B5%84%E6%BA%90%E4%B8%8B%E8%BD%BD%E5%8F%8A%E8%BF%9E%E6%8E%A5%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9B%B8%E5%85%B3%E6%95%99%E7%A8%8B/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;&#xA;&lt;p&gt;为了避免不必要的麻烦和纠纷，也是为了打造一个纯粹干净高质量的社区，我们需要对想要参与的人员提出一些条件，请确保你自身可以满足这些条件后再来愉快的玩耍。&#xA;&lt;strong&gt;所有的条件都是最基本的，一点也不苛刻，大部分要求仅仅是一些应该具备的能力。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;正文&#34;&gt;正文&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;具备一定的耐心&lt;/li&gt;&#xA;&lt;li&gt;具备文档阅读能力&lt;/li&gt;&#xA;&lt;li&gt;不是伸手党，具备在互联网上搜索的能力&lt;/li&gt;&#xA;&lt;li&gt;拥有思考和自己解决问题的能力，而不是有点什么问题直接在群里发问，我编写的各种文档已经涵盖了可能出现的大部分问题，请仔细阅读文档。&lt;/li&gt;&#xA;&lt;li&gt;拥有支配自己钱财的权利&lt;/li&gt;&#xA;&lt;li&gt;不在游戏内使用外挂、修改器。（当然你开了我也没法知道，全凭良心）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;在你确保满足上篇文章的各项要求后，可以开始阅读这篇文章。本文章将详细地讲解&lt;strong&gt;泰拉瑞亚PC/Android端下载&lt;/strong&gt;以及&lt;strong&gt;连接服务器&lt;/strong&gt;的方法。&lt;/p&gt;&#xA;&lt;h1 id=&#34;泰拉瑞亚android版本下载&#34;&gt;泰拉瑞亚Android版本下载&lt;/h1&gt;&#xA;&lt;p&gt;你可以直接打开群聊&amp;gt;群文件&amp;gt;泰拉瑞亚&amp;gt;Terraria_1.4.4.9.apk.&lt;strong&gt;1&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;安装apk1的方法&#34;&gt;安装apk.1的方法&lt;/h2&gt;&#xA;&lt;p&gt;几年前的新版本QQ中，所有的apk都会被强行篡改为apk.1导致很多用户无法正常下载。&#xA;首先，你需要下载&lt;strong&gt;MT管理器&lt;/strong&gt;（直接在应用商城搜或者浏览器搜）&#xA;下载好后，打开MT管理器，进入/storage/emulated/0/Android/data/com.tencent.mobileqq/tencent/QQfile_recv&#xA;找到你刚刚下载好的apk.1文件，点击它，在弹出的窗口中点击左下角的“类型”，点击全部。&#xA;不同型号的手机这个界面的选项会有所不同，以oppo手机为例，在这个页面向下滑动就会找到一个“软件包安装程序”的按钮。点击它就会进入软件安装页面，所有的选项全部点同意后，等待一段时间就可以打开游戏了。&#xA;其他品牌型号的手机也差不多，多尝试寻找。寻找差不多的字样。&lt;/p&gt;&#xA;&lt;h2 id=&#34;我无法打开androiddata&#34;&gt;我无法打开/Android/data&lt;/h2&gt;&#xA;&lt;p&gt;自安卓11起，访问Android/data等目录需要授权；自安卓14起，授权途径被阻止。在2024年2月的安全更新中，谷歌将该项限制合入，覆盖到了安卓11、12、12L、13、14。在系统设置-关于手机中安全更新日期大于等于2024年2月的系统可能会遇到无法授权的问题。&lt;/p&gt;&#xA;&lt;p&gt;遇到这种问题的同学，可以点击这个链接从网盘下载。&lt;strong&gt;要点击后缀名为.apk的文件下载&lt;/strong&gt;&#xA;&lt;a href=&#34;https://pan.quark.cn/s/a5d434ab6145&#34;&gt;https://pan.quark.cn/s/a5d434ab6145&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;泰拉瑞亚pc版本下载&#34;&gt;泰拉瑞亚PC版本下载&lt;/h1&gt;&#xA;&lt;p&gt;PC端也可以通过群文件或网盘下载&#xA;&lt;a href=&#34;https://pan.quark.cn/s/856451f8f210&#34;&gt;https://pan.quark.cn/s/856451f8f210&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;把压缩包下载好后，&lt;strong&gt;解压出来&lt;/strong&gt;，在解压出来的文件夹内双击&lt;code&gt;setup_terraria_v1.4.4.9_v4_(60319).exe&lt;/code&gt;运行，弹出的窗口左下角可以配置路径，按照你的需求配置好后同意协议，等待一段时间后安装就完成了（有些电脑时间可能比较长，请耐心等待）。&lt;/p&gt;&#xA;&lt;h1 id=&#34;连接服务器教程&#34;&gt;连接服务器教程&lt;/h1&gt;&#xA;&lt;p&gt;以PC端为例，当你下载安装好了游戏之后，创建一个人物。创建好后，左下角返回。点击多人游戏，选择最上面的加入。把群公告里的ip输入进去，然后输入端口。（手机端要直接添加一个英文冒号并跟上端口）&lt;/p&gt;&#xA;&lt;h2 id=&#34;注册登录&#34;&gt;注册登录&lt;/h2&gt;&#xA;&lt;p&gt;为了保证游戏的公平性，本服务器开启了强制开荒，也就是进入服务器后强行把物品栏清除到服务器配置文档的默认值（同志短剑、铜稿、铜斧）。即使毕业人物存档进服也只能被废尽武功从头修炼。&lt;/p&gt;&#xA;&lt;p&gt;连接到服务器后，你会发现你无法进行移动、破坏方块、拾取物品等操作，这是因为你还没有&lt;strong&gt;注册&lt;/strong&gt;。&#xA;打开聊天栏，按照以下格式输入命令&#xA;&lt;code&gt;/register &amp;lt;password&amp;gt;&lt;/code&gt;&#xA;比如我的密码是114514，我就可以输入&#xA;&lt;code&gt;/register 114514&lt;/code&gt;&#xA;注册好后，再打开聊天栏按照以下格式输入&#xA;&lt;code&gt;/login username password&lt;/code&gt;即可登录。同一设备登陆过一次后，无需再次登录。&#xA;例如&#xA;&lt;code&gt;/login yingyu5658 114514&lt;/code&gt;&#xA;恭喜你，你可以开始游玩了！&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Java面向对象编程快速入门</title>
      <link>https://blog.verdant.ee/posts/98/</link>
      <pubDate>Sun, 01 Dec 2024 13:05:00 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/98/</guid>
      <description>&lt;h1 id=&#34;什么是面向对象编程&#34;&gt;什么是面向对象编程&lt;/h1&gt;&#xA;&lt;p&gt;通俗易懂的说，就是把一坨一坨的数据放到一起存储&#xA;比如要存储一个学生的语文成绩和数学成绩&#xA;新建一个类&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;class&lt;/span&gt; Student {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String name;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//名字&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;double&lt;/span&gt; chinese;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//语文成绩&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#dbbc7f&#34;&gt;double&lt;/span&gt; math;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//数学成绩&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;printTotalScore&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(name &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;的总成绩是&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; (chinese &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; math));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;printAverageScore&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(name &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;的平均成绩是&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; (chinese &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; math) &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; 2.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样学生的模板就创建好了，但是这个模板还没有指向学生的每一个个体。我们可以再同一个包下再新建一个类。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;class&lt;/span&gt; Test {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//1.创建宇哥学生对象来封装学生a的数据&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Student s1 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; Student();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s1.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;学生a&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s1.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;chinese&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; 100;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s1.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;math&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; 100;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s1.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;printTotalScore&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s1.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;printAverageScore&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//2.再创建一个学生对象，封装学生b的数据&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Student s2 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; Student();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s2.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;学生b&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s2.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;chinese&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; 100;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s2.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;math&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; 59;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s2.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;printTotalScore&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s2.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;printAverageScore&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用以上代码新建一个学生类并且调用我们之前写好的功能&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;开发一个一个的对象，把数据交给对象，再用调用对象的方法来完成对数据的处理，这种方法叫&lt;strong&gt;面向对象编程&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>深刻认识面向对象</title>
      <link>https://blog.verdant.ee/posts/99/</link>
      <pubDate>Sun, 01 Dec 2024 13:31:00 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/99/</guid>
      <description>&lt;p&gt;面向对象编程的好处&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;按照&lt;strong&gt;詹姆斯·高斯林&lt;/strong&gt;的看法，世间万物都是对象。好比要出去旅游，你要找到车这个对象调用他的行驶功能使用来带你出去旅游。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;所以面向对象编程的好处就是：&lt;strong&gt;符合人类思维习惯，编程更简单，更直观&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;h1 id=&#34;程序中的对象到底是什么&#34;&gt;程序中的对象到底是什么&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对象本质上是一种&lt;strong&gt;特殊的数据结构&lt;/strong&gt;，很像数据库，但是数据库是持久存储的数据。体现出计算机各个学科的交叉。&#xA;一开始设计的类就是一张表，后续在其他类中填入这张表的内容。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;对象是怎么出来的&#34;&gt;对象是怎么出来的&lt;/h1&gt;&#xA;&lt;p&gt;class也就是&lt;strong&gt;类&lt;/strong&gt;，也称为&lt;strong&gt;对象的设计图&lt;/strong&gt;（或者&lt;strong&gt;对象的模板&lt;/strong&gt;）&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;类里可以设计很多变量，用来说明对象可以处理什么数据。&lt;/li&gt;&#xA;&lt;li&gt;类里还可以设计很多的方法，描述对象有什么功能，也就是要对数据进行什么样的处理。&#xA;接下来我们就可以在程序中new对象了&#xA;&lt;strong&gt;也就是先用class设计对象，然后再用class new出对象。&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;具体使用语法见上一篇文章[post cid=&amp;ldquo;98&amp;rdquo; /]&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Java方法的传参原理</title>
      <link>https://blog.verdant.ee/posts/95/</link>
      <pubDate>Sat, 30 Nov 2024 20:14:00 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/95/</guid>
      <description>&lt;h2 id=&#34;java方法的参数传递机制-基本类型&#34;&gt;Java方法的参数传递机制-基本类型&lt;/h2&gt;&#xA;&lt;p&gt;值传递&lt;/p&gt;&#xA;&lt;h3 id=&#34;值传递是什么&#34;&gt;值传递是什么&lt;/h3&gt;&#xA;&lt;p&gt;在传输实参给方法的形参的时候，&lt;strong&gt;传输的是实参变量中存储的副本&lt;/strong&gt;&#xA;说人话，把实参里面的东西赋值了一部分扔了给形参&lt;/p&gt;&#xA;&lt;h2 id=&#34;值传递具体理解案例&#34;&gt;值传递具体理解案例&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;class&lt;/span&gt; prameter {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; 10; &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//定义一个int变量a赋值为10&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        change(a); &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//调用change方法&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; a); &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//打印mian a中的值&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//这里开始写方法&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;change&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; a){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;change1&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; a); &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//打印方法中a的值&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        a &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; 20;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;change2&amp;#34;&lt;/span&gt;a); &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//打印赋值后a的值&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们运行以后，控制台输出的结果为&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;change1 10&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;change2 20&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;main 10&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;为什么main中打印的不是赋值后的20&#34;&gt;为什么main中打印的不是赋值后的20？&lt;/h2&gt;&#xA;&lt;p&gt;这就要提到刚才的概念：&lt;strong&gt;值传递&lt;/strong&gt;&#xA;我们定义了一个变量&lt;code&gt;a = 10；&lt;/code&gt;,在方法中&lt;code&gt;public static void change(int a)&lt;/code&gt;&#xA;由于&lt;strong&gt;值传递&lt;/strong&gt;，也就是把值复制了一分传给方法，所以我们方法里用的值永远都是刚刚定义的&lt;code&gt;int a = 10;&lt;/code&gt;，所以&lt;code&gt;change(a); = change(10);&lt;/code&gt;&#xA;我们后面再赋值，打印出来的结果还是10，除非你把变量定义的代码改了，否则方法里的值不会变。&lt;/p&gt;&#xA;&lt;h2 id=&#34;引用类型的参数传递&#34;&gt;引用类型的参数传递&lt;/h2&gt;&#xA;&lt;p&gt;引用类型的参数传递也满足值传递，但代码中会有不同的地方。&#xA;示例代码&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; arrs &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt;{10,20,30};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        change(arrs);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; arrs&lt;span style=&#34;color:#7a8478&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#7a8478&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;change&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; arrs) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;方法内1&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; arrs&lt;span style=&#34;color:#7a8478&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#7a8478&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        arrs&lt;span style=&#34;color:#7a8478&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#7a8478&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; 222;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;方法内2&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; arrs&lt;span style=&#34;color:#7a8478&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#7a8478&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;方法内1：20&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;方法内2：222&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;main：222&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上一篇文章提到了栈内存的执行顺序，根据上一篇所讲，代码执行顺序如下:&#xA;1.先执行&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;change&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; arrs) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;方法内1&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; arrs&lt;span style=&#34;color:#7a8478&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#7a8478&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        arrs&lt;span style=&#34;color:#7a8478&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#7a8478&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; 222;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;方法内2&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; arrs&lt;span style=&#34;color:#7a8478&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#7a8478&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.再回到main方法&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; arrs&lt;span style=&#34;color:#7a8478&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#7a8478&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在1时进行打印，结果得到数组内第二个位置存储的20.&#xA;代码继续向下执行，第二个位置被赋值为222，此时再打印它，结果得到222.&#xA;这时候change方法执行完，它在栈内存中会被清除，然后回到main方法，由于刚才change方法中对arr[1]进行了赋值，所以我们再打印，结果得到的还是它赋值出来的222.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Java小程序之两数计算器</title>
      <link>https://blog.verdant.ee/posts/90/</link>
      <pubDate>Sat, 30 Nov 2024 18:51:07 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/90/</guid>
      <description>&lt;p&gt;这个案例是我练习方法的使用时做的，应该能有更好的方式实现这个功能。&#xA;代码如下&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;import&lt;/span&gt; org.w3c.dom.ls.LSOutput;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;class&lt;/span&gt; Basic {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#7a8478&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt; (; ; ) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;欢迎使用！&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;按键1 2 3 4分别为加 减 乘 除，输入后请回车&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Scanner startSc &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; selectNumber &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; startSc.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt;(selectNumber &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;gt;&lt;/span&gt;4) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;请输入正确的数字以选择！&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//以下为加法&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (selectNumber &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; 1) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;请输入您要计算的第一个数字&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Scanner jiafaSc &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; jiafa1 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; jiafaSc.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;请输入您要计算的第二个数字&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; jiafa2 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; jiafaSc.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                jiafa(jiafa1, jiafa2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//以下为减法&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (selectNumber &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; 2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;请输入您要计算的第一个数字&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Scanner jianfaSc &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; jianfa1 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; jianfaSc.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;请输入您要计算的第二个数字&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; jianfa2 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; jianfaSc.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                jianfa(jianfa1, jianfa2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//以下为乘法&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (selectNumber &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; 3) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;请输入您要计算的第一个数字&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Scanner chengfaSc &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; chengfa1 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; chengfaSc.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;请输入您要计算的第二个数字&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; chengfa2 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; chengfaSc.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                chengfa(chengfa1, chengfa2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e67e80&#34;&gt;if&lt;/span&gt; (selectNumber &lt;span style=&#34;color:#7a8478&#34;&gt;==&lt;/span&gt; 4) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;请输入您要计算的第一个数字&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Scanner chufaSc &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; chufa1 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; chufaSc.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;请输入您要计算的第二个数字&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; chufa2 &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; chufaSc.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                chufa(chufa1, chufa2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;-----------------------------------------&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//加减乘除各项功能的方法，上面直接调用&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;jiafa&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; b) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; jieguo &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(jieguo);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;jianfa&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; b) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; jieguo &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(jieguo);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;-&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;chengfa&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; b) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; jieguo &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(jieguo);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;*&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;chufa&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; b) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; jieguo &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(jieguo);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;/&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Java方法的基本使用</title>
      <link>https://blog.verdant.ee/posts/89/</link>
      <pubDate>Fri, 29 Nov 2024 20:45:20 +0800</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/89/</guid>
      <description>&lt;h1 id=&#34;方法是什么&#34;&gt;方法是什么&lt;/h1&gt;&#xA;&lt;p&gt;方法是一种语法结构，它可以把代码封装成一段功能，以便重复调用。&lt;/p&gt;&#xA;&lt;p&gt;方法的完整格式：&lt;/p&gt;&#xA;&lt;p&gt;例子：数字求和&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt;  &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;sum&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; a,&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; b){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; c &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#7a8478&#34;&gt;+&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;return&lt;/span&gt; c;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;方法的调用：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; rs&lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; sum(10,20);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;方法使用的注意点&#34;&gt;方法使用的注意点：&lt;/h2&gt;&#xA;&lt;p&gt;方法申明了具体的返回值类型，内部必须使用return返回对应类型的数据。&lt;/p&gt;&#xA;&lt;p&gt;形参列表可以有多个，甚至可没有；如果有多个形参，必须用英文逗号隔开，且不能给初始化值&lt;/p&gt;&#xA;&lt;h2 id=&#34;使用方法的好处&#34;&gt;使用方法的好处&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;提高代码的复用性，提高了开发效率&lt;/li&gt;&#xA;&lt;li&gt;让程序逻辑性更清晰&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;方法的其他定义形式&#34;&gt;方法的其他定义形式&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e67e80&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#e67e80&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#dbbc7f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#b2c98f&#34;&gt;printHelloWorld&lt;/span&gt;(&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; n) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e67e80&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#dbbc7f&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#7a8478&#34;&gt;=&lt;/span&gt; 1; i &lt;span style=&#34;color:#7a8478&#34;&gt;&amp;lt;=&lt;/span&gt;n; i&lt;span style=&#34;color:#7a8478&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#d699b6;font-weight:bold&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#b2c98f&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#859289;font-style:italic&#34;&gt;//打印三行helloworld（使用方法）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;如果方法不需要返回数据，返回类型必须申明成&lt;code&gt;void&lt;/code&gt;此时方法内部可以不使用return返回数据。&lt;/li&gt;&#xA;&lt;li&gt;方法如果不需要接收数据，则不需要定义形参，调用方法时也不可以传数据给方法了。&lt;/li&gt;&#xA;&lt;li&gt;没有参数，且没有返回类型（void）申明的方法，称为&lt;strong&gt;无参数、无返回值的方法&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>网站迁移</title>
      <link>https://blog.verdant.ee/posts/6/</link>
      <pubDate>Thu, 21 Nov 2024 22:59:00 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/6/</guid>
      <description>&lt;p&gt;原网站&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;yingyu5658.github.io&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;将会迁移到这里。我会把有价值的文章转过来&#xA;原因仅仅是gmeek有点太简陋了，虽然typecho也差不多，不过他可以折腾一下主题之类的，并且我每个月还多花出去九十大洋。但是总比gmeek逼格高点吧。&#xA;不得不说，Linux绝对是世界上最麻烦的玩意，解压下载文件都费劲。要不是Windows资源占用多我绝对不会去用这玩意。&#xA;这次可是孤军奋战，背后没有github服务器的靠山了。要是忘了续费服务器我会丢失所有的文章，又是一个负担和一个纠结的点&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;2025.8.24二编：Gmeek简直太符合博客的定位了，不花里胡哨，完全够用，有网就能写文章&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Linux太好用了，目前Debian12养老中。&lt;/p&gt;&#xA;&lt;p&gt;回看以前的自己实在是蠢。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
  </channel>
</rss>
