<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Takuron</title><link>https://takuron.com/</link><description>Recent content on Takuron</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Sat, 21 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://takuron.com/index.xml" rel="self" type="application/rss+xml"/><item><title>ArchLinux折腾记录01：安装</title><link>https://takuron.com/post/id0032/</link><pubDate>Sat, 21 Feb 2026 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0032/</guid><description>&lt;img src="https://img.takuron.com/20250827/fd891f4ceba3bd23434784b7077c9044.webp" alt="Featured image of post ArchLinux折腾记录01：安装" /&gt;&lt;p&gt;本系列用于聚合本人安装使用ArchLinux过程中遇到的一些问题。第一篇就从重新安装ArchLinux的记录开始，本人主要的安装过程请参考&lt;a class="link" href="https://arch.icekylin.online/" target="_blank" rel="noopener"
&gt;archlinux 简明指南&lt;/a&gt;，本文也会以其的指导为基础主要列出一些本人的一些个性化配置。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2026/02/21 更新Gnome安装为wayland。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="基础安装"&gt;基础安装
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arch.icekylin.online/guide/rookie/basic-install" target="_blank" rel="noopener"
&gt;archlinux 基础安装 | archlinux 简明指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基础安装部分其实没有什么个性化的内容。个人其实认为目前随着Windows的安全机制完善，双系统反而破坏了Windows的一些安全特性，故本人更建议直接全新安装。&lt;/p&gt;
&lt;h3 id="nvme硬盘的先进格式化与4kn模式"&gt;Nvme硬盘的先进格式化与4kn模式
&lt;/h3&gt;&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://wiki.archlinuxcn.org/wiki/%E5%85%88%E8%BF%9B%E6%A0%BC%E5%BC%8F%E5%8C%96" target="_blank" rel="noopener"
&gt;先进格式化 - Arch Linux 中文维基&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.zhihu.com/tardis/zm/art/355590811?source_id=1005" target="_blank" rel="noopener"
&gt;教你把 NVMe SSD 切换到原生4K模式 - 知乎&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2025年的绝大多数Nvme硬盘和部分企业级机械硬盘已经使用了更先进的原生4K物理分区，但为了保证向下兼容性，几乎全部消费级的盘默认开启的都是模拟远古512b扇区的模式，这样理论上会产生逻辑扇区和物理扇区的对齐问题导致性能损失(不过实际对于消费级的低负载基本无影响)。 出于强迫症，既然正好要格式化硬盘就顺便把这个改了。&lt;/p&gt;
&lt;p&gt;首先查看所有硬盘和分区：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# lsblk --fs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME FSTYPE LABEL UUID MOUNTPOINT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sda
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─sda1 vfat C4DA-2C4D /boot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─sda2 swap 5b1564b2-2e2c-452c-bcfa-d1f572ae99f2 [SWAP]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─sda3 ext4 56adc99b-a61e-46af-aab7-a6d07e504652 /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;选择需要的硬盘（nvme0n1为例），查找支持的格式化后逻辑块地址大小（Formatted Logical Block Address Size, FLBAS）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# nvme id-ns -H /dev/nvme0n1 | grep &amp;#34;Relative Performance&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LBA Format 0 : Metadata Size: 0 bytes - Data Size: 512 bytes - Relative Performance: 0x2 Good (in use)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LBA Format 1 : Metadata Size: 0 bytes - Data Size: 4096 bytes - Relative Performance: 0x1 Better
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;找到可用的LBA Format后使用以下命令格式化并修改逻辑分区大小，其中-l是你选的对应模式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvme format /dev/nvmeXn1 -l 1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="显卡驱动与桌面环境"&gt;显卡驱动与桌面环境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arch.icekylin.online/guide/rookie/graphic-driver.html" target="_blank" rel="noopener"
&gt;archlinux 显卡驱动 | archlinux 简明指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arch.icekylin.online/guide/rookie/desktop-env-and-app.html" target="_blank" rel="noopener"
&gt;桌面环境与常用应用安装 | archlinux 简明指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里相比于原教程有比较大的出入，我使用的是Gnome作为默认桌面。Gnome对于高分缩放更加友好的同时界面比较好看，虽然Gnome的大而全完全就在ArchLinux的对立面，但给予用户选择大而全也是一种灵活自由吧。（跑&lt;/p&gt;
&lt;h3 id="软件安装的一些小调整"&gt;软件安装的一些小调整
&lt;/h3&gt;&lt;p&gt;我将Aur管理的安装放到前面且改用了Paru，在启用archlinuxcn源后即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S archlinuxcn-keyring
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S paru
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再就是中文字体的安装可以调的更前面一点来避免gnome和浏览器出现方框字：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S adobe-source-han-serif-cn-fonts wqy-zenhei
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extra
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="gnome和中文输入法"&gt;Gnome和中文输入法
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.skyone.dev/2023/archlinux-gnome/" target="_blank" rel="noopener"
&gt;ArchLinux安装GNOME桌面 - Skyone Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jianshu.com/p/9f5710d454b6" target="_blank" rel="noopener"
&gt;ArchLinux-GNOME的安装、配置和美化 - 简书&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于Gnome已经完全转向wayland，所以我们不再安装xorg，按以下命令安装 mesa 和 xwayland 用于兼容旧有的xwindow程序。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S mesa xorg-xwayland
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;安装gnome，其中gnome里面可以全装（你都选gnome了也不会太在乎这些基础功能是否精简干净了吧），但gnome-extra里面有大量没用的游戏、效率工具等内容，可以直接选择不装或者只挑有用的进行安装，一定一定要挑一下别学我直接一口气给我装了十个游戏。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S gnome gnome-extra
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后打开gdm就可以显示图形界面了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl enable --now gdm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;安装完成后若在设置里面没有显示中文请确定按简明教程正确配置&lt;code&gt;/etc/locale.gen&lt;/code&gt;后执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo locale-gen
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后安装rime-ibus，选择ibus的原因是Gnome的窗口管理器基本和ibus输入引擎深度绑定，与其去折腾fctix的各种奇怪bug不如直接把朙月输入法的引擎引入ibus来的省心。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S ibus-rime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman librime-data-luna-pinyin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Gnome的ibus无法通过正常的&lt;code&gt;ibus-setup&lt;/code&gt;里的配置进行添加和编辑，也无法检查常规路径里面大的配置文件，且gnome输入法设置里的设置又少的可怜。以为ibus设置横向选词为例，根据&lt;a class="link" href="https://github.com/rime/ibus-rime/issues/52" target="_blank" rel="noopener"
&gt;这个帖子&lt;/a&gt;，正确的Gnome配套的ibus配置文件位于:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.config/ibus/rime/build/ibus_rime.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;打开这个文件后修改以下选项即可实现横向输入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;style:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; horizontal: true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="美化与完善"&gt;美化与完善
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arch.icekylin.online/guide/advanced/optional-cfg-1.html" target="_blank" rel="noopener"
&gt;可选配置（基础篇） | archlinux 简明指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="语言与地区设置"&gt;语言与地区设置
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://wiki.archlinuxcn.org/wiki/%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%E6%9C%AC%E5%9C%B0%E5%8C%96" target="_blank" rel="noopener"
&gt;简体中文本地化 - Arch Linux 中文维基&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们按照以上教程先配置一个英文的全局local来防止tty中的中文渲染错误，修改&lt;code&gt; /etc/locale.conf&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LANG=en_US.UTF-8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后分别编辑以下文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.bashrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.xinitrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.xprofile&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;添加如下内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;zh_CN&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UTF&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;LANGUAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;zh_CN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;en_US&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="中文字体完善"&gt;中文字体完善
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://wiki.archlinuxcn.org/wiki/%E5%AD%97%E4%BD%93%E9%85%8D%E7%BD%AE" target="_blank" rel="noopener"
&gt;字体配置 - Arch Linux 中文维基&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://wiki.archlinuxcn.org/wiki/%E5%AD%97%E4%BD%93%E9%85%8D%E7%BD%AE/%E4%B8%AD%E6%96%87" target="_blank" rel="noopener"
&gt;字体配置/中文 - Arch Linux 中文维基&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来我们修改一下字体的配置，让默认字体更接近Android原生的字体风格。首先下载我们需要的字体，这里等宽字体我选择了新的&lt;a class="link" href="https://github.com/subframe7536/Maple-font" target="_blank" rel="noopener"
&gt;Maple Mono&lt;/a&gt;，其可以将中文设置成拉丁字母双倍宽度来实现中英混合的情况下的等宽，比强行压缩汉字的更纱黑体效果好太多。其中如果maple mono系列如果遇到需要选择的情况请选archlinuxcn源。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;paru -S ttf-roboto noto-fonts noto-fonts-cjk adobe-source-han-sans-cn-fonts adobe-source-han-serif-cn-fonts ttf-dejavu ttf-maplemono-nf-unhinted ttf-maplemono-nf-cn-unhinted
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后我们修改&lt;code&gt;~/.config/fontconfig/fonts.conf&lt;/code&gt;，以下是我根据配置建议写的Android字体配置，其中为了美观仍然选择的noto sans ckj sc为中文字体，并改用了maple系为等宽字体，这里也可以选择按上面网址里的配置修复Bug：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;span class="lnt"&gt;127
&lt;/span&gt;&lt;span class="lnt"&gt;128
&lt;/span&gt;&lt;span class="lnt"&gt;129
&lt;/span&gt;&lt;span class="lnt"&gt;130
&lt;/span&gt;&lt;span class="lnt"&gt;131
&lt;/span&gt;&lt;span class="lnt"&gt;132
&lt;/span&gt;&lt;span class="lnt"&gt;133
&lt;/span&gt;&lt;span class="lnt"&gt;134
&lt;/span&gt;&lt;span class="lnt"&gt;135
&lt;/span&gt;&lt;span class="lnt"&gt;136
&lt;/span&gt;&lt;span class="lnt"&gt;137
&lt;/span&gt;&lt;span class="lnt"&gt;138
&lt;/span&gt;&lt;span class="lnt"&gt;139
&lt;/span&gt;&lt;span class="lnt"&gt;140
&lt;/span&gt;&lt;span class="lnt"&gt;141
&lt;/span&gt;&lt;span class="lnt"&gt;142
&lt;/span&gt;&lt;span class="lnt"&gt;143
&lt;/span&gt;&lt;span class="lnt"&gt;144
&lt;/span&gt;&lt;span class="lnt"&gt;145
&lt;/span&gt;&lt;span class="lnt"&gt;146
&lt;/span&gt;&lt;span class="lnt"&gt;147
&lt;/span&gt;&lt;span class="lnt"&gt;148
&lt;/span&gt;&lt;span class="lnt"&gt;149
&lt;/span&gt;&lt;span class="lnt"&gt;150
&lt;/span&gt;&lt;span class="lnt"&gt;151
&lt;/span&gt;&lt;span class="lnt"&gt;152
&lt;/span&gt;&lt;span class="lnt"&gt;153
&lt;/span&gt;&lt;span class="lnt"&gt;154
&lt;/span&gt;&lt;span class="lnt"&gt;155
&lt;/span&gt;&lt;span class="lnt"&gt;156
&lt;/span&gt;&lt;span class="lnt"&gt;157
&lt;/span&gt;&lt;span class="lnt"&gt;158
&lt;/span&gt;&lt;span class="lnt"&gt;159
&lt;/span&gt;&lt;span class="lnt"&gt;160
&lt;/span&gt;&lt;span class="lnt"&gt;161
&lt;/span&gt;&lt;span class="lnt"&gt;162
&lt;/span&gt;&lt;span class="lnt"&gt;163
&lt;/span&gt;&lt;span class="lnt"&gt;164
&lt;/span&gt;&lt;span class="lnt"&gt;165
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE fontconfig SYSTEM &amp;#34;fonts.dtd&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;fontconfig&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;its:rules&lt;/span&gt; &lt;span class="na"&gt;xmlns:its=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://www.w3.org/2005/11/its&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;its:translateRule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;translate=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;no&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;selector=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/fontconfig/*[not(self::description)]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/its:rules&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;description&amp;gt;&lt;/span&gt;Android Font Config&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Font directory list --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;dir&amp;gt;&lt;/span&gt;/usr/share/fonts&lt;span class="nt"&gt;&amp;lt;/dir&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;dir&amp;gt;&lt;/span&gt;/usr/local/share/fonts&lt;span class="nt"&gt;&amp;lt;/dir&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;dir&lt;/span&gt; &lt;span class="na"&gt;prefix=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xdg&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;fonts&lt;span class="nt"&gt;&amp;lt;/dir&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- the following element will be removed in the future --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;dir&amp;gt;&lt;/span&gt;~/.fonts&lt;span class="nt"&gt;&amp;lt;/dir&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- 关闭内嵌点阵字体 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;font&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;embeddedbitmap&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assign&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;bool&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/bool&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- 英文默认字体使用 Roboto 和 Noto Serif ,终端使用 Maple Mono NF.。--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;serif&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;prepend&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;strong&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Noto Serif&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;sans-serif&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;prepend&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;strong&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Roboto&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;monospace&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;prepend&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;strong&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Maple Mono NF&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- 中文默认字体使用　Noto Sans CJK SC ,终端使用 Maple Mono NF CN。--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;lang&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;compare=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;contains&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;zh&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;serif&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;prepend&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Noto Serif CJK SC&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;lang&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;compare=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;contains&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;zh&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;sans-serif&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;prepend&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Noto Sans CJK SC&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;lang&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;compare=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;contains&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;zh&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;monospace&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;prepend&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Maple Mono NF CN&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Windows &amp;amp; Linux Chinese fonts. --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- 把所有常见的中文字体映射到思源黑体和思源宋体，这样当这些字体未安装时会使用思源黑体和思源宋体.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;解决特定程序指定使用某字体，并且在字体不存在情况下不会使用fallback字体导致中文显示不正常的情况. --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;WenQuanYi Zen Hei&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assign&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;same&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Source Han Sans CN&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;WenQuanYi Micro Hei&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assign&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;same&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Source Han Sans CN&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;WenQuanYi Micro Hei Light&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assign&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;same&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Source Han Sans CN&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Microsoft YaHei&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assign&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;same&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Source Han Sans CN&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;SimHei&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assign&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;same&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Source Han Sans CN&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;SimSun&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assign&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;same&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Source Han Serif CN&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;SimSun-18030&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assign&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;same&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Source Han Serif CN&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Load local system customization file --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;include&lt;/span&gt; &lt;span class="na"&gt;ignore_missing=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;conf.d&lt;span class="nt"&gt;&amp;lt;/include&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Font cache directory list --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;cachedir&amp;gt;&lt;/span&gt;/var/cache/fontconfig&lt;span class="nt"&gt;&amp;lt;/cachedir&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;cachedir&lt;/span&gt; &lt;span class="na"&gt;prefix=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xdg&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;fontconfig&lt;span class="nt"&gt;&amp;lt;/cachedir&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- the following element will be removed in the future --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;cachedir&amp;gt;&lt;/span&gt;~/.fontconfig&lt;span class="nt"&gt;&amp;lt;/cachedir&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;config&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Rescan configuration every 30 seconds when FcFontSetList is called --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;rescan&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;int&amp;gt;&lt;/span&gt;30&lt;span class="nt"&gt;&amp;lt;/int&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/rescan&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/config&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/fontconfig&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="安装雾凇拼音"&gt;安装雾凇拼音
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/iDvel/rime-ice#arch-linux" target="_blank" rel="noopener"
&gt;Rime-ice配置 - ArchLinux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/iDvel/rime-ice#arch-linux" target="_blank" rel="noopener"
&gt;Rime 配置文件 - 補靪&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;雾凇拼音是 Rime 的一份配置仓库，用户需要下载 各平台对应的前端，并将此配置应用到配置目录。 雾凇拼音提供了一套开箱即用的完整配置，包含输入方案（全拼、常见双拼）、长期维护的开源词库及各项扩展功能。&lt;/p&gt;
&lt;p&gt;通过以下命令安装雾凇拼音的文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;paru -S rime-ice-git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;编辑&amp;rsquo;$HOME/.config/ibus/rime/&amp;lsquo;文件，添加如下内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;patch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 仅使用「雾凇拼音」的默认配置，配置此行即可&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;__include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;rime_ice_suggestion:/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 以下根据自己所需自行定义，非必须内容，仅做参考。&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 针对对应处方的定制条目，请使用 &amp;lt;recipe&amp;gt;.custom.yaml 中配置，例如 rime_ice.custom.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;__patch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key_binder/bindings/+&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 开启逗号句号翻页&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- {&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;when: paging, accept: comma, send&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Page_Up }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- {&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;when: has_menu, accept: period, send&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Page_Down }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;切换输入法到rime，等待重新构建输入方案后就可以使用雾凇拼音了。&lt;/p&gt;
&lt;h3 id="tcp调参"&gt;TCP调参
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.omnitt.com/" target="_blank" rel="noopener"
&gt;TCP 迷之调参 - 智能网络优化工具&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;估计玩过VPS的都多少了解过TCP调参这个事情吧。虽然大多数在服务器上可以有效提高吞吐量的设置在终端设备上就是浪费内存浪费电，但有些算法类的调整（例如bbr拥塞控制）还是能有效提高设备网络性能的。&lt;/p&gt;
&lt;p&gt;为&lt;code&gt;/etc/sysctl.conf&lt;/code&gt;文件添加如下内容，主要是改变队列管理和拥塞控制算法其他都可动可不动：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# --- 笔记本网络与系统优化 ---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 使用现代队列管理算法，对抗缓冲区膨胀，降低延迟
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.core.default_qdisc = cake
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 启用 BBR 拥塞控制算法以提升速度和吞吐量
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv4.tcp_congestion_control = bbr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 启用 TCP Fast Open 减少连接延迟
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv4.tcp_fastopen = 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 允许重用 TIME_WAIT 状态的连接
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv4.tcp_tw_reuse = 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 连接空闲后更快地恢复传输速度
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv4.tcp_slow_start_after_idle = 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="gnome插件推荐"&gt;Gnome插件推荐
&lt;/h3&gt;&lt;p&gt;为了给gnome安装插件，首先需要安装gnome-shell-extensions和gnome-browser-connector，如果仍然无法安装请再安装对应浏览器里的插件。（和其他发行版不同&lt;strong&gt;不需要安装chrome-gnome-shell&lt;/strong&gt;）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;paru -S gnome-shell-extensions gnome-browser-connector
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;以下是本人在用的一些插件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://extensions.gnome.org/extension/615/appindicator-support/" target="_blank" rel="noopener"
&gt;AppIndicator and KStatusNotifierItem Support &lt;/a&gt;：恢复被gnome取消的托盘&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://extensions.gnome.org/extension/1460/vitals/" target="_blank" rel="noopener"
&gt;Vitals&lt;/a&gt;: 清爽的硬件监控&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="常用软件"&gt;常用软件
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arch.icekylin.online/guide/advanced/system-ctl.html" target="_blank" rel="noopener"
&gt;Linux 日常操作与基础知识 | archlinux 简明指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="防火墙"&gt;防火墙
&lt;/h3&gt;&lt;p&gt;按照个人使用习惯安装ufw防火墙和其gui版本gufw并启动：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;paru -S ufw gufw
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl enable --now ufw.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw enable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个防火墙不用我多介绍了吧无论cli还是衍生的gui都是最简单的那一类了。注意放行一些类似LocalSend之类的传入请求即可，大多数时候拒绝入站能根本上解决一些公共网络中的安全问题。&lt;/p&gt;
&lt;h3 id="java环境"&gt;Java环境
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://wiki.archlinuxcn.org/wiki/Java" target="_blank" rel="noopener"
&gt;Java - Arch Linux 中文维基&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ArchLinux的Java充分考虑了Java生态碎片化的情况，准备了 java-runtime-common和java-environment-common包作为系统的Java环境管理工具，使得开发者可以在命令行切换目前使用的Java版本。&lt;/p&gt;
&lt;p&gt;我们先安装一个21版本的OpenJDK&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;paru -S jdk21-openjdk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此时可以看到java-runtime-common也被作为依赖安装到了设备上，我们用命令查看一下目前支持的java环境：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# archlinux-java status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Available Java environments:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; java-21-openjdk (default)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可以看到我们所有的java环境和目前启动Java程序所使用的默认Java路径，后续我们只需要用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;archlinux-java set &amp;lt;JAVA_ENV_NAME&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;就可以切换目前使用的Java环境了。&lt;/p&gt;
&lt;h3 id="intellij-idea系ide的安装"&gt;intellij-idea系IDE的安装
&lt;/h3&gt;&lt;p&gt;我们可以在AUR里安装几乎全部的jetbrain公司的产品，但是安装后直接点击桌面图标是无法启动的（演示以webstorm为例）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;paru -S webstorm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此时&lt;strong&gt;在电脑中已有Java环境的情况下&lt;/strong&gt;前往安装目录寻找启动脚本(以webstorm为例，目录应该在 /opt/webstorm/bin/webstorm.sh)并执行。该脚本可以在没有jetbarin的jre的情况下用默认Java环境打开对应IDE。&lt;/p&gt;
&lt;p&gt;完成初始化后，我们在主菜单使用&lt;code&gt;Ctrl + Shift + A&lt;/code&gt;快捷键搜索&lt;code&gt;选择IDE的启动Java运行时&lt;/code&gt;（中文）或者&lt;code&gt;Choose Boot Java Runtime for the IDE&lt;/code&gt;（英文），在新建里面随便下载一个（首次安装）/选择上一个IDE已经下载好的路径即可。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20250827/b3e0b010d074154b6e4695439b86b3b0.webp"
loading="lazy"
alt="选择Java运行环境"
&gt;&lt;/p&gt;
&lt;h3 id="其他常用软件"&gt;其他常用软件
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;视频：Vlc播放器 &lt;code&gt;paru -S vlc vlc-plugins-all&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;图形化文本编辑器：Visual Studio Code &lt;code&gt;paru -S code&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;办公三件套：LibreOffice &lt;code&gt;paru -S libreoffice-fresh libreoffice-fresh-zh-cn&lt;/code&gt; 或者 &lt;code&gt;paru -S libreoffice-still libreoffice-still-zh-cn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;录屏/直播：OBS &lt;code&gt;paru -S obs-studio&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>完美画质指南【1】：Windows平台Potplayer的基础配置</title><link>https://takuron.com/post/id0036/</link><pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0036/</guid><description>&lt;img src="https://img.takuron.com/20260123/c405e52523482a813825d639c8b22613.webp" alt="Featured image of post 完美画质指南【1】：Windows平台Potplayer的基础配置" /&gt;&lt;blockquote&gt;
&lt;p&gt;原本这个方面我只是一个和其他人共同学习的小白，很多东西我也是更多参考别人。但我平时参考推荐给别人的配置教程改付费了把我气个半死，故为其补档供我以后参考教学。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;随着近年来组建个人NAS的人越来越多，许多人又重新放弃了流媒体改为存储本地高清资源。但如何正确、高效地播放、存储、压缩这些资源又变得热门起来。Potplayer是一款使用很广泛的视频播放软件，但其默认的分离/解码器效果并不尽如人意，本篇文章将讲述如何正确地为Potplayer配置目前效果非常不错的视频渲染器madVR和滤镜分率器LAV Filters。&lt;/p&gt;
&lt;p&gt;本文使用SVP4 Pro来快速安装正确配置的madVR和LAV Filters，如果有时间（那就是没时间）后续还会提供直接安装或者基于完美编码的整合安装教程更新在此。&lt;/p&gt;
&lt;h2 id="视频文件如何变成显示像素"&gt;视频文件如何变成显示像素
&lt;/h2&gt;&lt;p&gt;为了简单解释这些组件的必要性，这里我将简单讲解视频播放的过程，如果不愿意了解请直接跳转下一节。&lt;/p&gt;
&lt;p&gt;视频播放是一个线性的流水线工作，数据会根据 &lt;strong&gt;源文件 (Source) → 分离 (Splitter) → 解码 (Decoder) → 渲染 (Renderer) → 显示设备&lt;/strong&gt; 的顺序经过处理最终提供显示&lt;/p&gt;
&lt;p&gt;视频文件（如 .mkv, .mp4）本质上是一个装载数据的容器（Container）。为了将封装在容器内混杂的“视频流”、“音频流”和“字幕流”拆分开来供后续环节处理，我们需要一个分离程序负责拆解这些“外壳”。LAV Filters 组件中的 LAV Splitter 正是负责这一关键的分离工作。&lt;/p&gt;
&lt;p&gt;这之后分离出来的视频流（如 H.264/AVC, H.265/HEVC）和音频流（如AAC、FLAC）是经过高度压缩的二进制数据，计算机无法直接显示或者播放。为了让这些数据变成显卡可识别的原始图像数据， 包含在 LAV Filters 中的 LAV Video Decoder 和 LAV Audio Decoder 会进行这方面的解码工作。经过处理的数据会被还原为原始的图像数据（通常是 YUV 格式，如 NV12, P010）供下一步处理。&lt;/p&gt;
&lt;p&gt;然后为了根据显卡厂商和显示器规格的不同将这些原始图像数据进行正确的显示（例如压缩原视频的10bit色深到你显示器的8bit、升高原视频1080P的分辨率到你的2K屏幕），madVR会对视频内容进行一系列包括但不限于色彩空间转换、色度升频、缩放、色调映射等操作，最终通过显卡发送显示数据给显示器完成视频大的播放。&lt;/p&gt;
&lt;h2 id="安装过程"&gt;安装过程
&lt;/h2&gt;&lt;h3 id="安装svp4-pro"&gt;安装SVP4 Pro
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;这里我们只通过SVP4安装上述两个环境，不涉及补帧。因而只安装以上两个组件、至于补帧配置以至于SVP正版的购买和破解等均不涉及。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们首先进行SVP的安装，在&lt;a class="link" href="https://www.svp-team.com/zh/get/" target="_blank" rel="noopener"
&gt;SVP官网&lt;/a&gt;下载完最新版的SVP安装包后我们一路继续直到如下界面。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/3950af03822c8bc328ba3e9852936b77.webp"
loading="lazy"
alt="3950af03822c8bc328ba3e9852936b77.webp"
&gt;&lt;/p&gt;
&lt;p&gt;这里我们需要选择 Switch to components selection 来选择具体的组件安装，在展开后的菜单&lt;strong&gt;取消勾选所有其他的组件&lt;/strong&gt;，只安装 madVR 和 LAV Filters 。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/c4f7ab4d8dbe7bdae310bbd6b6d8e1d4.webp"
loading="lazy"
alt="c4f7ab4d8dbe7bdae310bbd6b6d8e1d4.webp"
&gt;&lt;/p&gt;
&lt;h3 id="安装potplayer"&gt;安装Potplayer
&lt;/h3&gt;&lt;p&gt;Potplayer的安装只需一路默认选项即可（或者可按个人偏好进行个性化自定义），唯一需要注意的是最后这个界面我们需要选择Detect H/W decoder/encoder 来检测硬件编解码器。另外OpenCodec建议不安装，自带的下载非常慢即使真有必要也请手动下载安装。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/ee461659c98c99175eb39bb4e690a3a8.webp"
loading="lazy"
alt="ee461659c98c99175eb39bb4e690a3a8.webp"
&gt;&lt;/p&gt;
&lt;h2 id="配置potplayer"&gt;配置Potplayer
&lt;/h2&gt;&lt;h3 id="启用-madvr-和-lav-filters"&gt;启用 madVR 和 LAV Filters
&lt;/h3&gt;&lt;p&gt;我们拉开Potplayer下拉选项，选择选项进入设置页面。首先选择视频，将视频渲染器选择为Madshi视频渲染即可，后续需要配置madVR直接选择这个选项后面的三个点即可进入配置页面。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/a48478172b5be9b5b15b70f0137c2516.webp"
loading="lazy"
alt="a48478172b5be9b5b15b70f0137c2516.webp"
&gt;&lt;/p&gt;
&lt;p&gt;然后我们进入滤镜-源滤镜/分离器，点击内置源滤镜/分离器设置。这里我们先选择添加系统滤镜，如上一步安装正确这里可以看到 LAV Filters 的四个重要组件，全部添加并且建议分别为其勾选所有可用的格式。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/ec73649108d4f3e32f5cde14892f7c06.webp"
loading="lazy"
alt="ec73649108d4f3e32f5cde14892f7c06.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/85fee3fed4695348ce267901e1ec34c2.webp"
loading="lazy"
alt="85fee3fed4695348ce267901e1ec34c2.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/b631627e3a2cfd62d269833a9cf62e16.webp"
loading="lazy"
alt="b631627e3a2cfd62d269833a9cf62e16.webp"
&gt;&lt;/p&gt;
&lt;p&gt;然后我们替换所有可以替换为 LAV Splitter Source 的源格式的源滤镜/分离器为 LAV Splitter Source ，若不能替换，保持默认选择或使用 Potplayer 内置的 FFmpeg 即可。 LAV Splitter Source 集成了文件读取和分离功能，作为源滤镜使用稳定性更好；而 LAV Splitter 仅负责分离，需要依赖其他滤镜读取文件。因此首选 Source 版本。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里有个小技巧是直接滚轮一直往下滚就好了，一般最后一个选项都是 LAV Splitter Source ，滚到了移出去还能同时往下翻页。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/52af778dfffe2351350ffd51a974cc91.webp"
loading="lazy"
alt="52af778dfffe2351350ffd51a974cc91.webp"
&gt;&lt;/p&gt;
&lt;p&gt;接下来对于视频解码器/音频解码器进行类似的操作来设置LAV Video Decoder 和 LAV Audio Decoder。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/9e1211882015adaeb98e39af03276b3c.webp"
loading="lazy"
alt="9e1211882015adaeb98e39af03276b3c.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/03a8d7faa10c359cd89981c10d420d75.webp"
loading="lazy"
alt="03a8d7faa10c359cd89981c10d420d75.webp"
&gt;&lt;/p&gt;
&lt;h3 id="其他可选选项"&gt;其他可选选项
&lt;/h3&gt;&lt;p&gt;选择播放选项，打开鼠标指向进度条时显示缩略图。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/08923eaaaec1ba5bc5641beb6a64643f.webp"
loading="lazy"
alt="08923eaaaec1ba5bc5641beb6a64643f.webp"
&gt;&lt;/p&gt;
&lt;h2 id="验证配置正确"&gt;验证配置正确
&lt;/h2&gt;&lt;p&gt;随便打开一个视频，按下Tab显示详细信息。正确的情况下这里可以看到视频解码器、音频解码器和视频渲染器如图所示即为已经正确安装了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20260123/79e6fcd76d422ff1502f843df1430687.webp"
loading="lazy"
alt="79e6fcd76d422ff1502f843df1430687.webp"
&gt;&lt;/p&gt;</description></item><item><title>2025年将Windows10 LTSC压缩来实现DVD单盘刻录</title><link>https://takuron.com/post/id0035/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0035/</guid><description>&lt;img src="https://img.takuron.com/20251201/4925728ab6c82e56bd49659f7e013dde.webp" alt="Featured image of post 2025年将Windows10 LTSC压缩来实现DVD单盘刻录" /&gt;&lt;p&gt;前几天收到了一个玩具：塔式的戴尔OptiPlex7070，配置为i5 9500 + 16g内存，一块2T的机械硬盘外加一个DVD光驱，想了一下给他加了个gtx 1650和Nvme固态浅浅试用一下商用机的感觉。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20251201/f1214a43cdeedcc7e6421a287a00077e.webp"
loading="lazy"
alt="f1214a43cdeedcc7e6421a287a00077e.webp"
&gt;&lt;/p&gt;
&lt;p&gt;但是装完后买完DVD就后悔：每G存储的价格相比于机械硬盘并没有优势的同时，4.3G每盘的容量却很尴尬：存大文件需要分片的同时还不能多次读写，这个容量甚至无法写入一个Windows10的安装媒介……吗？&lt;/p&gt;
&lt;h2 id="2025年windows镜像现状"&gt;2025年Windows镜像现状
&lt;/h2&gt;&lt;p&gt;很早以前微软一直会将Windows镜像控制在4.3G的红线来方便DVD用户。然而随着U盘安装的普及，自2019年开始微软已经不再为此专门控制镜像的大小并推荐使用8G以上的U盘作为安装媒介。截止本文发布（2025年12月）最新的Windows11镜像约为7.32G，即使考虑使用光驱的为老电脑为其制作一个Windows10 LTSC 2021的镜像,大小依然有4.9G，故而我们需要方法压缩。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.bilibili.com/opus/997436412861087744" target="_blank" rel="noopener"
&gt;【无用经验】系统镜像太大，如何单盘刻录？ &amp;ndash;Bilibili&lt;/a&gt;这篇文章给出了一些方案，包括但不限于UltraISO自带压缩（基本压不了多少）、后安装补丁（LTSC版本不带补丁）、换盘（没这么好的设备）、装完改版本（强改多麻烦啊）等，得出结论对于特定的LTS系统（例如文中提出的Windows Server）无解，真的是这样吗？&lt;/p&gt;
&lt;h2 id="使用dism命令压缩esd来减少体积"&gt;使用dism命令压缩esd来减少体积
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://bbs.kafan.cn/thread-2145662-1-1.html" target="_blank" rel="noopener"
&gt;ISO镜像文件太大怎么刻录_windows区_软件区 卡饭论坛 - 互助分享 - 大气谦和!&lt;/a&gt;这篇帖子提到的压缩install.wim是一个有效的方法，实测使用后成果压缩了接近1G的体积成功安装，这篇帖子讲的比较粗略下面是详细步骤：&lt;/p&gt;
&lt;h3 id="下载windows10-ltsc-2021"&gt;下载Windows10 LTSC 2021
&lt;/h3&gt;&lt;p&gt;随着2025年10月14日微软停止对Windows10的支持，现在仍处于支持周期的旧版Windows10只剩下了Windows10 LTSC 2021的普通（截止到2026年）和iot版本（截止到2031年），考虑仍需要Windows10的多数为旧电脑，故均推荐直接使用LSTC版本。&lt;/p&gt;
&lt;p&gt;建议前往&lt;a class="link" href="https://www.microsoft.com/zh-cn/evalcenter/download-windows-10-enterprise" target="_blank" rel="noopener"
&gt;微软评估中心（已失效）&lt;/a&gt;或者&lt;a class="link" href="https://next.itellyou.cn/" target="_blank" rel="noopener"
&gt;NEXT, ITELLYOU&lt;/a&gt;下载，这里转载一个磁力链接（这个发布至今都没有更新，应该也许可能大概不会再变动了吧）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;magnet:?xt=urn:btih:366ADAA52FB3639B17D73718DD5F9E3EE9477B40&amp;amp;dn=SW_DVD9_WIN_ENT_LTSC_2021_64BIT_ChnSimp_MLF_X22-84402.ISO&amp;amp;xl=5044211712
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="提取并压缩installwim"&gt;提取并压缩install.wim
&lt;/h3&gt;&lt;p&gt;接下来使用无论用Windows自带的挂载磁盘镜像也好还是7zip等软件的解压也好，寻找sources/install.wim文件，这应当是整个镜像里面最大的文件，包含后续要提取安装的绝大多数内容。&lt;/p&gt;
&lt;p&gt;接下来我们使用dism对这个镜像重新压缩成esd格式，首先以管理员模式打开powershell，输入以下命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dism /Get-WimInfo /WimFile:【解压出来的install.wim目录，例如D:\Win10_Work\install.wim】
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此时会输出镜像的所有版本（包含家庭版、专业版等），对于常规Windows版本，我们需要选择一个特定的版本来压缩。但正常我们这个目录应当只有一个版本。&lt;/p&gt;
&lt;p&gt;接下来我们重新压缩这个文件，输入以下命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dism /Export-Image /SourceImageFile:【install.wim目录】 /SourceIndex:1 /DestinationImageFile:【将要输出的install.esd目录】 /Compress:recovery
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;接下来只需要等待，按帖子那位老哥所说需要很久，但我的R9 9900x确实几分钟就压缩好了（跑&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20251201/4cdded6d5db20cf415e4643cd693e874.webp"
loading="lazy"
alt="4cdded6d5db20cf415e4643cd693e874.webp"
&gt;&lt;/p&gt;
&lt;h3 id="重新打包新的iso并验证"&gt;重新打包新的ISO并验证
&lt;/h3&gt;&lt;p&gt;使用UltraISO打开原本的ISO，删除其中的sources/install.wim来将其替换成sources/install.esd，然后导出ISO即可，可以尝试先将这个ISO由Rufus写入U盘并测试。只要能走到“勾选我接受许可条款”这一步，或者能让你选择“自定义安装”并看到硬盘分区列表，测试就通过了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里以后可能会发我做好的可以直接DVD单盘刻录的ISO镜像下载链接。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;测试完毕后就可以刻录光盘了。&lt;/p&gt;</description></item><item><title>ArchLinux折腾记录02：使用问题合集</title><link>https://takuron.com/post/id0034/</link><pubDate>Sat, 29 Nov 2025 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0034/</guid><description>&lt;img src="https://img.takuron.com/20250827/fd891f4ceba3bd23434784b7077c9044.webp" alt="Featured image of post ArchLinux折腾记录02：使用问题合集" /&gt;&lt;p&gt;本系列用于聚合本人安装使用ArchLinux过程中遇到的一些问题，其中本篇用于记录一些不值得单独用一篇文章记录的一些小问题的解决方案，持续更新。&lt;/p&gt;
&lt;h2 id="chromium在wayland和gnome环境下不显示关闭键"&gt;Chromium在Wayland和Gnome环境下不显示关闭键
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://img.takuron.com/20251129/fefe0c825dd4d52e9b93b9be45519ddb.webp"
loading="lazy"
alt="fefe0c825dd4d52e9b93b9be45519ddb.webp"
&gt;&lt;/p&gt;
&lt;p&gt;如图所示，有时Chromium在Wayland和Gnome环境下不显示三大金刚按键。最简单的解决方法是在设置里换成经典主题即可。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20251129/a068870bec694d0d1c76b4a0f05d0aeb.webp"
loading="lazy"
alt="a068870bec694d0d1c76b4a0f05d0aeb.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20251129/e1f299c8d7834e1d44b948e689c5532b.webp"
loading="lazy"
alt="e1f299c8d7834e1d44b948e689c5532b.webp"
&gt;&lt;/p&gt;</description></item><item><title>个人软件开发记录01：密码派生工具AegixPass</title><link>https://takuron.com/post/id0033/</link><pubDate>Mon, 24 Nov 2025 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0033/</guid><description>&lt;img src="https://img.takuron.com/20251124/166cc411d9998f24dfa03994a4e05a2e.webp" alt="Featured image of post 个人软件开发记录01：密码派生工具AegixPass" /&gt;&lt;blockquote&gt;
&lt;p&gt;此系列用于记录和介绍一些我开发的一些小垃圾软件。随着LLM的编程能力的提升，其编写的代码已经逐步从仅供扩展思路逐渐过渡到只需要检查修改后即可直接使用的程度。这也大大提高了独立开发者的开发能力和加快了他们的开发速度，也为我实现这些小需求提供了充足的便利。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a class="link" href="https://aegixpass.takuron.com/" target="_blank" rel="noopener"
&gt;AegixPass&lt;/a&gt; 是一种确定性密码派生工具，其设计目的用于根据根密码和区分代码为不同应用生成一个专属的确定性的、无法逆向的派生密码来保障用户安全。&lt;/p&gt;
&lt;h2 id="需求提出"&gt;需求提出
&lt;/h2&gt;&lt;p&gt;一切需求起源于前几年本人对于密码管理方式的革新。在此之前，我已经使用KeePass和随机密码来保管部分密码，但随着&lt;a class="link" href="https://sspai.com/post/55403" target="_blank" rel="noopener"
&gt;《2019年科学且免费的复合密码管理策略 - 少数派》&lt;/a&gt;给我的启发，我也切换到了如文中所说的模式。简单概述就是通过一个根密码+每个应用一个区分代码+哈希函数单向为每个账号准备一个独立的强安全性的独有密码，并且继续用密码管理器记录作为备份，这样就同时解决了一次记忆和防撞库攻击的问题。六年过去，我本人的账号安全策略也逐步从纯密码到TOTP再到现在直接使用Yubikey硬件密钥保护的模式，但密码这个最基本的安全验证随着各种无密码模式下的不方便而告吹。&lt;/p&gt;
&lt;p&gt;所以回顾这个密码管理方案，其思路本身在不考虑基于更好的类似TOTP的验证方案前依然算得上先进，但原博主使用的SeekPassword现在回顾已经暴露出了大量问题，其中一些问题的更详细细节会在下文设计中讨论：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;密码长度固定为10&lt;/strong&gt;：相比于其他的问题这个在实际使用过程中反而是最严重的，虽然10位的数字字母符号的混合的组合数依然足够多，但随着各类安全事件的发展，用户密码的长度要求反而在逐渐增加，在2025年的当下要选择一个合适的密码长度明显是被原文章认为会被一些网站拒绝的16位更为合适，网站会要求12位以上的长密码的情况明显比远古网站设置密码长度上限为12的情况更普遍。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MD5早已不再安全&lt;/strong&gt;：SeekPassword使用了MD5作为其底层的摘要函数，但是MD5极快的运算速度和算法内部的固有缺陷已经让MD5频繁遭受碰撞攻击，2008 年，美国卡内基梅隆大学软件工程研究所就得出结论，认为 MD5“在密码学上已被攻破，不适合继续使用”。虽然SeekPassword进行了加盐和多次混淆等操作，但其密码学安全的根基已经被证明不再可靠，仅靠这些小把戏完全无法保证算法的安全性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他的底层安全和实用问题&lt;/strong&gt;： SeekPassword的底层设计充满了随意性，包括用特定的字符串进行大小写判断让最终密码里元素权重不等的情况下还无法保证存在所有类型的字符、映射集可自定义性几乎为零、Seek的过程浪费时间等等。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;虽然平心而论原作者是借鉴花密的同时保留了一些其时代的问题，但这个算法完全无法满足现代密码学安全要求也是事实，现在我迫切需要一个新的算法来取代这个过时设计，其要满足以下要求：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;更加安全的密码派生方式&lt;/strong&gt;：需要一套更现代的密码派生算法，其在当前环境可以证明其加密组件的安全的同时最好能同时对抗一些暴力破解。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更加丰富的配置选项&lt;/strong&gt;：新算法应当有更多可以配置的选项，对于派生出的密码长度、包含字符类型等应该具有更好的可配置性的同时方便使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留SeekPassword的已有优点&lt;/strong&gt;：包括密码的唯一派生、复杂度保证、网页跨平台、实现可方便复现和开源可审计修改等。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="产品设计"&gt;产品设计
&lt;/h2&gt;&lt;p&gt;在此之前我也尝试过实现一些类似满足以上要求的产品例如MokaPasswordV1/V2，但随着可配置项增多在实际使用中发现过多的可配置选项反而成了用户使用和记忆的负担。以前我使用密码管理工具只需要记录的区分代码反而变成需要详细记录密码位数、使用的字符集等更多信息。并且根据观察，SeekPassword是正确地实现了“替用户做选择”：即选择一个80%以上情况可用的通用配置来减少用户的上手门槛，故新产品一上来就决定采用预配置的标准预设文件的方案：大多数用户只需要选择默认和其衍生的预设即可，对于小众需求则将更多可选配置放入高级的编辑预设中。&lt;/p&gt;
&lt;p&gt;然后是算法的设计，SeekPassword的哈希-混淆-查找尤其是现在MD5已经被证明不再安全的情况下在密码学角度完全就是自欺欺人：混淆尤其是在公开算法的情况下完全不会产生新的安全性，反而导致算法理解复现的困难。密码学中的“柯克霍夫原则”（Kerckhoffs&amp;rsquo;s Principle）强调一个密码系统的安全性不应依赖于对其算法的保密，而应仅仅依赖于密钥的保密。算法的安全主要依赖构成其加密组件本身是否安全，所以应当选择一个业界公认的、为密码哈希场景专门设计的安全算法并正确地使用它才是正确方法。因而从MokaPasswordV1/V2选择使用的SHA3到最新版AegixPass使用的Argon2id，我只需要选择最适合的哈希算法然后考虑如何基于其派生即可。&lt;/p&gt;
&lt;p&gt;接下来是密码派生，这个是上一代MokaPassword最失败的点之一，我一直想的是使用“映射”的方法来解决问题（包括其实在目前的AegixPass依然遗留了部分这个问题）：将已经生成的256/512位的数据集对应到新的密码里面，这就有很明显的问题：密码短的时候有数据利用不上，而因为整个字符集长度存在上限导致长密码又无法生成。这个问题在我与Gemini讨论的时候得到了一个新的方案：使用伪随机流。伪随机流算法类似于一个无尽的牌堆，其可以根据你的密钥和Nonce（本算法未使用）来生成无数个完全随机的数，一般情况下我没会寻找熵来生成种子以产生完全随机的数，但这里我没利用了&lt;strong&gt;密钥和Nonce相同的队列总是会产生同样的流&lt;/strong&gt;来无限地作为我每次选择的依据：只要前述哈希正确匹配那么后面的选择过程相当于每次复现一样的操作，那必然产生相同的密码，而完全不用考虑长度和分割的问题。&lt;/p&gt;
&lt;p&gt;最终确定了以下设计思路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;采用预设来管理更多设置，并给用户设计好默认预设。&lt;/li&gt;
&lt;li&gt;使用哈希函数生成种子，然后使用伪随机流生成供密码生成的流。&lt;/li&gt;
&lt;li&gt;根据生成流的值挑选和排序字符。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="算法概览"&gt;算法概览
&lt;/h2&gt;&lt;p&gt;具体可以参考&lt;a class="link" href="https://aegixpass.takuron.com/algorithm" target="_blank" rel="noopener"
&gt;AegixPass 算法核心设计&lt;/a&gt;（感觉Gemini写的比我写的好）。&lt;/p&gt;
&lt;h3 id="生成前准备"&gt;生成前准备
&lt;/h3&gt;&lt;p&gt;需要准备以下的内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;主密码 (password_source)&lt;/li&gt;
&lt;li&gt;区分密钥 (distinguish_key)：用于根据网站的不同用于区分的标记&lt;/li&gt;
&lt;li&gt;预设 (preset)：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AegixPass - Default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hashAlgorithm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;argon2id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;rngAlgorithm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;chaCha20&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;shuffleAlgorithm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fisherYates&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;length&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;platformId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;aegixpass.takuron.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;charsets&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;0123456789&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;abcdefghijklmnopqrstuvwxyz&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;!@#$%^&amp;amp;*_+-=&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里用于帮助用户打包保存各种配置，其中对charsets分组来保证每个分组里面都有至少一个字符被使用来获得字符类型的保障。&lt;/p&gt;
&lt;h3 id="产生主种子对应阶段b"&gt;产生主种子（对应阶段B）
&lt;/h3&gt;&lt;p&gt;然后根据以上信息构建一个字符串：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;quot;AegixPass_V{version}:{platform_id}:{length}:{password_source}:{distinguish_key}:{charsets_json}&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后使用这个字符串进行哈希计算，快哈希算法会直接生成，两种慢哈希则会用sha256(platform_id)生成一个salt，然后使用对应慢哈希算法生成256位的哈希。&lt;/p&gt;
&lt;h3 id="选择字符对应阶段c和d"&gt;选择字符（对应阶段C和D）
&lt;/h3&gt;&lt;p&gt;先从每个字符组里面挑选一个字符，将 32 字节的主种子按顺序分割成多个 4 字节（32位无符号整数）的块，然后根据这个4字节对字符组长度取余实现随机取一个字符。（但实际上这个是我修补Gemini设计的一个方案，正确地实现方式在下面）。&lt;/p&gt;
&lt;p&gt;接下来我我们再抽取剩下需要用到的字符，这里就用上述的主种子作为一个伪随机流的种子开始生成伪随机流。然后我们每次也是取4字节之后产生一个无偏随机数用于在上面所有charsets合并在一起的大字符组中随机抽取字符直至抽取够数量。&lt;/p&gt;
&lt;h3 id="打乱对应阶段e"&gt;打乱（对应阶段E）
&lt;/h3&gt;&lt;p&gt;最后使用Fisher-Yates 洗牌算法进行一次打乱顺序，对于每一个位置生成一个随机位置和当前位置交换。这样整个顺序就可以按特定的规律进行“打乱”后即可输出最终的密码了。&lt;/p&gt;
&lt;h2 id="实际开发"&gt;实际开发
&lt;/h2&gt;&lt;p&gt;实际开发的时候使用的是（白嫖来的）Gemini 2.5pro的网页版本，不使用claude/gemini的cli版本一是因为代理问题我懒，二是即使使用这种方法来完整展示项目结构，目前的llm依旧普遍缺乏项目组织能力，对于大型项目来说开发者依然需要手动组织代码结构，所以网页直接导入当前大致的开发状态让其编写函数后自己组织是最合适的开发方法。&lt;/p&gt;
&lt;p&gt;本人使用了Rust和前端TypeScript/Svelet Kit实现了两种版本来保证该算法的跨平台实现可能，其中可能最麻烦的是随机数的生成问题：即使随机队列相同，不同语言的随机数生成也会以不同的方法”随机“取数：这不是我们需要的，故在Ai的帮助下选择直接手写一个一段随机值生成特定范围随机数的算法。&lt;/p&gt;
&lt;p&gt;Vibe Coding目前看来对尤其是脚本/小工具这种简单需求已经基本可以做到只做Code Review即可，但即便如此还是需要注意项目结构的规范化和最新文档的提供参考：例如这个项目我ui使用的daisy ui v5就过于新，但是其文档很贴心的提供了复制导入llm的提示，只需要复制文档内容供llm参考就基本可以做到即使是不在llm知识库里的框架也可以轻松调用。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;另外对于更复杂的项目则更需要“帮AI解耦”：自己设计项目的架构、类的接口等让AI做“填字游戏”，并且一定要仔细检查AI的实现逻辑并做好文档，坚决避免让AI自行调整架构。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="上线和测试"&gt;上线和测试
&lt;/h2&gt;&lt;p&gt;对应工具目前&lt;a class="link" href="https://aegixpass.takuron.com/" target="_blank" rel="noopener"
&gt;发布在这里&lt;/a&gt;，可以在Github找到&lt;a class="link" href="https://github.com/takuron/AegixPass" target="_blank" rel="noopener"
&gt;Rust版本源码（算法实现测试）&lt;/a&gt;和&lt;a class="link" href="https://github.com/takuron/aegixpass-svelte" target="_blank" rel="noopener"
&gt;基于Svelte Kit的网页版源码&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20251124/ccd21eb414f8fbaa0aca739da566c959.webp"
loading="lazy"
alt="ccd21eb414f8fbaa0aca739da566c959.webp"
&gt;&lt;/p&gt;
&lt;p&gt;LLM依然可以快速解决算法端的测试用例问题（只要你记得需要写），对于实际运行的Bug大多数也只需要描述给LLM即可快速定位（不过不一定他自己能转出来解决，但能快速定位Bug已经是帮了大忙了）。实际我已经在使用这个工具生成密码了，目前未发现非常明显的Bug。&lt;/p&gt;</description></item><item><title>面向非码农的Git速成教程</title><link>https://takuron.com/post/id0031/</link><pubDate>Fri, 23 May 2025 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0031/</guid><description>&lt;img src="https://img.takuron.com/20250827/19ef1f788b216385031c72e006deb649.webp" alt="Featured image of post 面向非码农的Git速成教程" /&gt;&lt;p&gt;随着科学计算和机器学习的发展，编程和计算机软件使用已经几乎融入了几乎每一个理工商医科学生的学习中。这些软件给同时做过软件开发的跨专业人才来说，这种体系确实成功使用软件工程的轮子为他们解决了大问题，但这可苦了使用这些工具的学生。每当看他们用着记事本复制粘贴C某DN的代码后用微信互相发送的时候，我真的觉得应当让他们感受并掌握早已体系化工业化的软件工程的基础工具了。&lt;/p&gt;
&lt;p&gt;本文将基于Github只讲最最最基础的Git使用方法，目标是让非程序员快速上手这一套版本控制系统的基础功能改善编码体验，如有错漏欢迎指出。本文注重基础概念的讲解，但和其他教程不同的是虽然也会给出程序员常用的命令，&lt;strong&gt;我本人非常鼓励使用者寻找一个合适的图形化工具进行Git操作&lt;/strong&gt;，本文将以Github Desktop为例进行演示。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;但要注意有些客户端会简化点命令行的部分概念，例如本教程的示例客户端就简化掉了add操作，所以还是烦请看一下理论基础以真正掌握基本的概念。（早知道用idea系自带的那个了，用pycharm的人还多）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="写在前面"&gt;写在前面
&lt;/h2&gt;&lt;h3 id="git和github"&gt;Git和Github？
&lt;/h3&gt;&lt;p&gt;虽然现在具有私服的游戏越来越少，但我相信你多少见过类似Minecraft、CSGO、方舟生存进化这种具有私服的游戏，你可以单机玩、连官服玩、或者加入你朋友创建的服务器，而Git也是类似的一个软件。Git本身是一个&lt;strong&gt;本地的工具软件&lt;/strong&gt;，就像你玩过的那些可以单机可以联机的游戏一样，他可以不需要依赖网络或者特定的服务器来独立运行；而Github则是一个&lt;strong&gt;代码托管平台&lt;/strong&gt;，相当于这些游戏里体量大的服务器或者官服，大多数情况下你会用他来存放你的仓库，但&lt;strong&gt;没有Github你也可以将你的代码仓库放在本地或者其他服务器（Gitlab/Gitee等）上面&lt;/strong&gt;。并且软件本身的&lt;strong&gt;基础操作是相同的&lt;/strong&gt;，就像你大多数时候不需要因为换了游戏服务器而需要学习新的游戏操作方法一样。&lt;/p&gt;
&lt;h3 id="注册github"&gt;注册Github
&lt;/h3&gt;&lt;p&gt;如果你身处中国大陆地区请准备好魔法上网的工具，虽然理论没有被彻底屏蔽但考虑现在的网络质量请保证注册过程中时刻具有连接国外网站的能力。&lt;/p&gt;
&lt;p&gt;进入Github官网后直接点击右上角的Sign up填写信息即可，请记住你的密码，后面要用。&lt;/p&gt;
&lt;h2 id="版本控制与git的思路"&gt;版本控制与Git的思路
&lt;/h2&gt;&lt;h3 id="什么是版本控制"&gt;什么是版本控制
&lt;/h3&gt;&lt;p&gt;大多数人无法一次性解决一个终极问题，大到各种科学理论、工程项目、日常家务这些工作大家大多数时候都遵循的是执行-改进的流程,，这个过程涉及大量的更改尝试甚至多人合作的拆解和合并。这时你的每一个阶段都会有一个或好或坏的阶段性成果，这就是我们说的广义的版本，而版本控制就是如何管理这些阶段性成果的工程实践，例如以下梗图就是一个最失败的版本控制：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/24f60c954cca17f8e9436e0cd598bd2d_MD5-tuya.webp"
loading="lazy"
alt="版本地狱"
&gt;&lt;/p&gt;
&lt;p&gt;版本控制的思维不止仅限于软件工程和Git、如何做好一个项目的版本控制是管理&lt;strong&gt;任何项目&lt;/strong&gt;的关键。一个好的版本标注、存储、同步、分叉会让你的项目管理事半功倍，而Git则是一个很优秀的解决方案供大家参考。&lt;/p&gt;
&lt;h3 id="git的诞生和思路"&gt;Git的诞生和思路
&lt;/h3&gt;&lt;p&gt;2005年，Linux系统使用的版本控制工具BitKeeper突然转向收费，在市场上没有更加合适的版本工具的情况下Linus Torvalds（Linux之父）用10天时间从零手搓了Git，其核心思路包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;分布式架构&lt;/strong&gt;：任何协作者本地都有一个完整的全量仓库，虽然设计了完整的向线上提交的系统，但你&lt;strong&gt;总是可以在本地获得整个仓库完整的记录&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基于指针的全量快照&lt;/strong&gt;：Git总是能直接保持任何提交时刻的&lt;strong&gt;完整状态&lt;/strong&gt;，就像照片一样，拍下即定格。你任何提交时候每一行代码和文件的完整内容、这些内容的创建者和他们的邮箱&lt;strong&gt;随时都可以查到&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;任意的版本标注、管理和分叉&lt;/strong&gt;：有大量的工具可以帮助你管理这些快照之间的状态，你可以&lt;strong&gt;随时将你的代码返回任意这些快照的时候&lt;/strong&gt;。同时这些照片绘相当于自带修图，类似于画画一样，你可以随时重新编辑其中的一部分元素或者合并两幅画里面的小饰品，或者为其中的人物画一个新的表情，你可以像拼积木一样随时装上或者拆除一部分而不影响其他任何东西。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="你需要知道的概念"&gt;你需要知道的概念
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/537f830fff73c137931cbd2cd7760950_MD5-tuya.webp"
loading="lazy"
alt="本节一图流"
&gt;&lt;/p&gt;
&lt;h3 id="远程仓库本地仓库暂存区与工作区"&gt;远程仓库、本地仓库、暂存区与工作区
&lt;/h3&gt;&lt;p&gt;为了实现版本控制，git对处于不同阶段的代码准备了不同的存储状态。首先版本控制本身不应该干扰任何实际进行的编码，保证能够应对任何项目结构（也就是你存储代码的整个文件夹），这个不干扰你正常编码的代码存储区域叫&lt;strong&gt;工作区（Working Directory）&lt;/strong&gt;。不过并不是每个文件都需要放在git仓库里存储，就像你会把要发送的快递放在门口但快递员不能直接抓起你家鞋柜就跑一样，你需要告诉快递员什么是需要发走的，这就是提交到&lt;strong&gt;暂存区（Staging Area）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;接着就是和本地仓库的交互，&lt;strong&gt;本地仓库（Repository）&lt;/strong&gt; 正如它的名字和我们前面所讲的概念，它存储着历史以来这个项目里所有代码修改的历史且不可随意变更修改删除，你只能向其提交和获取代码（这两个操作本身后面再讲）而不能直接对其修改，就像现实的物流仓库出入东西都会被登记一样。&lt;strong&gt;远程仓库（Reomte Repository）&lt;/strong&gt; 则是为云端存储和多人协作设计的，每个协作开发的人都可以与远程仓库进行交互来保证自己的代码最终存储并可以随着他人的同步最终进入别人的工作区来实现协同开发。&lt;/p&gt;
&lt;h3 id="addcommit和push"&gt;Add、Commit和Push
&lt;/h3&gt;&lt;p&gt;为了让你写的代码在上面几个区域之间流动我们需要定义一些操作，首先你需要让你新建的文件被包含在git的管理中，我们叫这个操作为&lt;strong&gt;add&lt;/strong&gt;。例如在大多数情况下我们会用如下命令直接一次性添加所有文件到暂存区中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;如果你的项目有一些编辑过程和结果文件不需要被添加到仓库中，我们可以使用.gitignore配置文件来直接自动忽略这些，具体会放在实际操作部分讲解。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;为了把暂存区的代码归入仓库中，我们需要将本次的修改打包提交。就像快递员相比于处理你箱子里的东西只会看你的快递单一样，你需要将目前为止的修改装一个盒子并给出一个相当于快递单的说明，这个过程我们叫做&lt;strong&gt;commit&lt;/strong&gt;。&lt;strong&gt;我们的代码仓库就是由一次次commit组合而来的&lt;/strong&gt;，编写清晰、规范的&lt;code&gt;commit message&lt;/code&gt;（提交说明）至关重要，因为它能帮助你和协作者在未来快速理解每次变更的目的和内容。最简单的commit命令为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &amp;#34;提交说明&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;当然你也可以不在这里写说明，前提是你知道并且会使用你命令行的默认编辑器。但是如果你知道我在说什么并且会用vi/vim大概率是不需要看这个教程的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当然，你也可以抛弃已经修改的代码来快速回到上一次commit保存的状态，一般我们会使用reset回撤已经被add的文件、checkout回撤暂未增加的文件。&lt;/p&gt;
&lt;p&gt;最后是同步本地和远程仓库的操作，将目前本地增加的更改提交到远程仓库的方法叫&lt;strong&gt;push&lt;/strong&gt;，将已经提交到其他仓库的已经打包完成的内容从远程仓库同步下来的方法叫&lt;strong&gt;pull&lt;/strong&gt;。这些方法足够让你将你已经写完的代码放在云端储存和开源共享。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在实际多人协同开发中会遇到两个人或者分支同时对一个文件进行修改的情况而产生&lt;strong&gt;冲突（Conflict）&lt;/strong&gt;，本教程作为最简入门不会专门讲解冲突相关，这部分内容等你用熟了自己就会处理了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="时间线和分支"&gt;时间线和分支
&lt;/h3&gt;&lt;p&gt;前面我们提过了仓库是由一个个快照（不同时间项目文件定格的状态）组成的，然后知道了这个快照本身和建立的方式叫commit。就和电影里面的镜头一样，这些commit会根据时间排列起来（在暂时不考虑分支的情况下）形成一条直线，这就是时间线。每一个项目无论如何都会有一条主线分支（一般叫做master/main），你所做的就是随着时间可开发的进行推进这条线并且留下开发重要节点的记录。&lt;/p&gt;
&lt;p&gt;为了适应更加复杂的软件工程的情况，Git还提出了&lt;strong&gt;分支（Branch）&lt;/strong&gt; 的概念。想象这样一种情况，你开始了一个新的大版本的开发，代码改到一半旧的版本出现了重大问题需要立即修复，但你的新功能代码都写了一大片了。或者你需要做一些实验性功能，但不希望很早就推送给正式用户，包括多人协作的时候有的时候并不是希望及时同步所有其他人开发的代码。这时候你就可以单独为自己新建一个时间线来专注于你新的功能的处理，创建其他分支的方法我们叫&lt;strong&gt;分叉（Fork）&lt;/strong&gt;，他会基于你现在的分支状态分出一个独立的新时间线供你处理，就像Galgame遇到对话选项一样。当你分支出来的东西确定无误要加入主线的时候的操作我们叫做&lt;strong&gt;合并（Merge）&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="其他你遇得到的操作"&gt;其他你遇得到的操作
&lt;/h3&gt;&lt;p&gt;并非所有的仓库都是从零搭建起来的，你有的时候需要把目前仓库的状态从远端完全拉取，这个过程叫做&lt;strong&gt;克隆（Clone）&lt;/strong&gt;，克隆会在本地完全重新建立一个与目前远端仓库的状态一模一样的本地仓库和暂存区方便你直接开始代码。&lt;/p&gt;
&lt;h2 id="实际操作"&gt;实际操作
&lt;/h2&gt;&lt;h3 id="第一次commit"&gt;第一次commit
&lt;/h3&gt;&lt;p&gt;这里以以Github Desktop为例示范如何从零开始建立一个自己的仓库和复制别人的仓库，请确保你已经处在魔法上网的状态下下载并登录Github Desktop，登录成功后会看到你账号里所有仓库（你可能什么都没有）。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/146eee0c413c8bbd734f621689696752_MD5-tuya.webp"
loading="lazy"
alt="146eee0c413c8bbd734f621689696752_MD5"
&gt;&lt;/p&gt;
&lt;p&gt;登录好后让我们进入网页端，点击账号旁边的加号，new repository。大部分选项都已经自带/附带了解释，这里主要说一下最下面三个选项的用途。第一个是是否要用一个README.md的文件来初始化你的仓库，相当于GitHub帮你进行一次基础的文件创建和提交来初始化整个仓库。请在这里&lt;strong&gt;选上&lt;/strong&gt;可以偷懒跳过自己创建提交git仓库的过程，并且这个文件的内容会显示在你仓库的首页来作为给别人公开预览你仓库的说明书。第二个是是否要（根据模板）创建一个gitignore文件，这里你可以搜索一下你的项目对应的名称，根据上文根据这个模板可以保证大多数非源代码的内容被上传到git来节约空间，根据你的项目实际情况选择。最后一个是你希望使用的开源协议，如果选择会根据你选择的协议模板自动创建一个LICENSE文件来使用对应的开源协议，这个内容不在今天的讨论范围如有兴趣可以自行研究。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/09b52d5e61a2662ecd877b989b4289d3_MD5-tuya.webp"
loading="lazy"
alt="09b52d5e61a2662ecd877b989b4289d3_MD5"
&gt;
&lt;img src="https://img.takuron.com/blogpost/id0031/a0a5695ad89b3e95f1f591ce17321cce_MD5-tuya.webp"
loading="lazy"
alt="a0a5695ad89b3e95f1f591ce17321cce_MD5"
&gt;&lt;/p&gt;
&lt;p&gt;这里过一会儿项目创建好后就可以在网页看到你的项目git链接，刷新客户端也可以在客户端内看到了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/04e1e381e60ed836a0effffaa13e7dcb_MD5-tuya.webp"
loading="lazy"
alt="04e1e381e60ed836a0effffaa13e7dcb_MD5"
&gt;
&lt;img src="https://img.takuron.com/blogpost/id0031/4b991117f24b3042524085b7827b6502_MD5-tuya.webp"
loading="lazy"
alt="146eee0c413c8bbd734f621689696752_MD5"
&gt;&lt;/p&gt;
&lt;p&gt;接下来我们选择Clone这个项目，客户端会自动填写我们上面网页获取到的Git仓库链接并在你选择克隆目标位置后开始克隆文件，如果是cli/其他客户端你需要将这个链接提交给给软件来实现克隆，克隆成功后即可进入主界面。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/2375b2e38b955e5189c75e3279b526e6_MD5-tuya.webp"
loading="lazy"
alt="2375b2e38b955e5189c75e3279b526e6_MD5"
&gt;&lt;/p&gt;
&lt;p&gt;这个界面主要需要关注的只有上面的三个选项和侧边栏的修改和提交。上面三个按钮的作用分别是切换目前的仓库、切换分支（初步操作暂时不会涉及）和与远程同步。而侧边栏的change则是可以显示你目前工作区已经进行的修改来方便你提交/回滚。这里我们先创建一个文件，可以看到我们创建的文件已经自动进入了暂存区并且等待我们提交，&lt;strong&gt;注意这里Github Desktop简化掉了add操作，cli或者其他可视化客户端请先将文件add到暂存区&lt;/strong&gt;。我们为这次提交写一下summary来概括一下这次修改的内容然后commit到main分支。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/695c99771da47d730c934aedac9169bf_MD5-tuya.webp"
loading="lazy"
alt="695c99771da47d730c934aedac9169bf_MD5"
&gt;
&lt;img src="https://img.takuron.com/blogpost/id0031/e80326417a812e90cda629c4afc9b5c1_MD5-tuya.webp"
loading="lazy"
alt="e80326417a812e90cda629c4afc9b5c1_MD5"
&gt;&lt;/p&gt;
&lt;p&gt;然后上方第三个按钮就变成了push来提醒你将目前本地仓库的内容提交到网上，我们可以攒几个commit再推送或者直接推送，我们直接推送然后到网页查看就可以看到我们新提交的文件了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/161ca8cf074cbf150ab320b87c3d7cff_MD5-tuya.webp"
loading="lazy"
alt="161ca8cf074cbf150ab320b87c3d7cff_MD5"
&gt;
&lt;img src="https://img.takuron.com/blogpost/id0031/37559f048bbce015c3faf33bcb884b30_MD5-tuya.webp"
loading="lazy"
alt="37559f048bbce015c3faf33bcb884b30_MD5"
&gt;&lt;/p&gt;
&lt;h3 id="修改和回撤"&gt;修改和回撤
&lt;/h3&gt;&lt;p&gt;接下来我们对文件进行一次修改并假设修改错误的情况下回撤目前的修改。我们先编辑一下README来制造修改。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/5656591e7b067d8e01bd8959c0ad596b_MD5-tuya.webp"
loading="lazy"
alt="5656591e7b067d8e01bd8959c0ad596b_MD5"
&gt;&lt;/p&gt;
&lt;p&gt;回到Github Desktop，我们可以发现暂存区的修改已经显示，你可以按照上一节的方法再次提交，但这次我们选择右键，discard change并确认。这样的话暂存区的内容就会被丢弃，指定的文件就会回到你上一次commit时候的状态。这对你修改现有内容结果导致无法恢复的严重错误有非常大的帮助。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/3a7c13fd3499d1f0e88dd3b95995fda0_MD5-tuya.webp"
loading="lazy"
alt="3a7c13fd3499d1f0e88dd3b95995fda0_MD5"
&gt;&lt;/p&gt;
&lt;h3 id="拉取"&gt;拉取
&lt;/h3&gt;&lt;p&gt;我们再模拟多台设备/别人一起开发的情况，这里我们现在网页对文件进行一下修改（网页上对文件的修改也是一次commit）。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/7a2837ad6b5f74f7fa11ca42c5a9b129_MD5-tuya.webp"
loading="lazy"
alt="7a2837ad6b5f74f7fa11ca42c5a9b129_MD5"
&gt;&lt;/p&gt;
&lt;p&gt;此时Github中的仓库应当已经被修改但本地并未跟进，此时你可以回到客户端，选择Fetch origin。此时GitHub Desktop就会检查到可以从远程仓库拉取修改，对应按钮变成Pull，选择就可以把你在线进行的修改拉取到本地了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/69e3ca4b4383bf58b7feb3ff6ef159ae_MD5-tuya.webp"
loading="lazy"
alt="69e3ca4b4383bf58b7feb3ff6ef159ae_MD5"
&gt;&lt;/p&gt;
&lt;h3 id="分支别人的仓库和pull-request"&gt;分支别人的仓库和pull request
&lt;/h3&gt;&lt;p&gt;最后讲讲如何快速分（chao）支（xi）别人的代码，对于其他公开的仓库如果你需要学习研究他们的代码你可以通过点击左上角的Fork来使用Github的Fork功能，填写基础信息后等待一段时间你就有了一个以你为管理员的新代码仓库了，你可以克隆下来任意使用修改。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/2434e0b63f150245e53b9db1e16cb46e_MD5-tuya.webp"
loading="lazy"
alt="2434e0b63f150245e53b9db1e16cb46e_MD5"
&gt;
&lt;img src="https://img.takuron.com/blogpost/id0031/08cc37cf9d35ba8a0fcfd5246c74de9b_MD5-tuya.webp"
loading="lazy"
alt="08cc37cf9d35ba8a0fcfd5246c74de9b_MD5"
&gt;
&lt;img src="https://img.takuron.com/blogpost/id0031/48770d7fc5c7d3ffd0deb368135e5369_MD5-tuya.webp"
loading="lazy"
alt="48770d7fc5c7d3ffd0deb368135e5369_MD5"
&gt;&lt;/p&gt;
&lt;p&gt;如果你觉得你的修改很好想提交给原作者怎么办呢，你可以在把修改提交到自己仓库后选择contribute中的open pull request，填写好说明就可以申请将你的修改并入原仓库了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/id0031/544c334630fa0b8fe819704bc144278a_MD5-tuya.webp"
loading="lazy"
alt="544c334630fa0b8fe819704bc144278a_MD5"
&gt;&lt;/p&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;恭喜你！通过阅读本文，你已经了解了Git和Github的核心概念，并通过Github Desktop实际操作了版本控制的基本流程，包括创建仓库、提交更改、同步远程、回撤修改、复刻他人仓库以及发起Pull Request。记住，版本控制不仅仅是程序员的专属技能，它更是一种高效管理项目、追踪历史、促进协作的思维方式，无论你的专业背景如何，掌握它都将为你的学习和研究带来便利。&lt;/p&gt;</description></item><item><title>关于我AUR无法更新最终定位到git代理设置的事情</title><link>https://takuron.com/post/id0030/</link><pubDate>Sun, 06 Apr 2025 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0030/</guid><description>&lt;img src="https://img.takuron.com/blogpost/zvl9yfrxzfmh.webp" alt="Featured image of post 关于我AUR无法更新最终定位到git代理设置的事情" /&gt;&lt;p&gt;在之前使用Paru更新的时候遇到任何网络连接问题我都直接开开开全局劫持代理就完事了。这次是由于我自己用的小猫咪版本更新导致TUN模式的系统服务老是有问题无法使用才发现的一个错误，我在使用paru更新AUR的PKGBUILD时候爆出了这样的错误：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;致命错误：无法访问 &amp;#39;https://aur.archlinux.org/vscodium-bin&amp;#39;：TLS connect error: error:00000000:lib(0)::reason(0)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;首先还是系统代理开开开，看到仍然报错后还怀疑过paru无法正常读取自动设置的系统代理故而尝试手动设置命令行代理/尝试更换yay更新均无效。仍然同样报错，一度怀疑系统时间和本地证书问题，百思不得其解。&lt;/p&gt;
&lt;p&gt;思索的时候重新审视报错日志发现卡在的位置实际是从aur.archlinux.org克隆PKGBUILD的时候，这个过程正常是使用git的，实际报错的为如下指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone --no-progress -- https://aur.archlinux.org/vscodium-bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果使用git那我给git手动设置了代理服务器，这样就能解释的通为什么错误不会因系统代理而变化，重新审视了我的git的配置文件（~/.gitconfig ）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[http]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy = socks5://127.0.0.1:7897
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[https]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy = socks5://127.0.0.1:7897
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;仍然没有问题，尝试验证性的从github克隆库没有问题，再尝试用设置同样代理的Firefox打开aur.archlinux.org网站也没有问题。也就是说问题准确定位是&lt;strong&gt;git无法在通过代理的情况下验证特定网站（aur.archlinux.org）的TLS证书&lt;/strong&gt;？&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/80a7c383d3c7a3fb47d28c89aad71f64_MD5-tuya.webp"
loading="lazy"
alt="?"
&gt;&lt;/p&gt;
&lt;p&gt;重新以git代理\TLS错误联合aur等关键词搜索，看到了&lt;a class="link" href="https://www.cnblogs.com/searchstar/p/18437537" target="_blank" rel="noopener"
&gt;在与clash配合使用的情况下有些机器在git使用socks5代理会存在问题&lt;/a&gt;，故尝试&lt;strong&gt;将代理改为http&lt;/strong&gt;，修好了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[http]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy = http://127.0.0.1:7897
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[https]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy = http://127.0.0.1:7897
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/80a7c383d3c7a3fb47d28c89aad71f64_MD5-tuya.webp"
loading="lazy"
alt="?"
&gt;&lt;/p&gt;</description></item><item><title>OPNsense使用记录03：IPv6网络配置</title><link>https://takuron.com/post/id0029/</link><pubDate>Sun, 29 Dec 2024 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0029/</guid><description>&lt;img src="https://img.takuron.com/blogpost/KABjvaXbhSmWkCg.webp" alt="Featured image of post OPNsense使用记录03：IPv6网络配置" /&gt;&lt;p&gt;IPv6（Internet Protocol Version 6）是网络层协议的第二代标准协议，也被称为IPng（IP Next Generation）。它是Internet工程任务组IETF（Internet Engineering Task Force）设计的一套规范，是IPv4（Internet Protocol Version 4）的升级版本。随着国内大力推进IPv6网络的建设，目前启用IPv6与IPv4的双栈网络可以在不影响网络质量的同时获得具有公网IPv6的诸多便利，这里专门介绍一下如何在国内家宽条件下在OPNsense中配置IPv6网络。&lt;/p&gt;
&lt;h2 id="ipv6基础为什么应该使用ipv6"&gt;IPv6基础：为什么应该使用IPv6
&lt;/h2&gt;&lt;p&gt;本人不是猫在机房的运维，这里主要介绍家用环境有用的实践内容和也许可能大概有用的个人理解，如有错误欢迎批评指正，更多详细的基础理论可以看这里： &lt;a class="link" href="go?url=https://cshihong.github.io/2018/01/29/IPv6%E5%9F%BA%E7%A1%80/" &gt;IPv6基础 曹世宏的博客&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;很多人都知道IPv6具有的巨大的地址空间及其带来的公网IP不要钱，但IPv6并不只是IPv4++，比起地址空间扩大更重要的是整个协议的技术细节都进行了升级，就说对我们使用来说最重要的，其配网难度和效率都获得了提升，且一些IPv4的常见问题也获得了一定程度的解决。个人觉得最重要的其实是其自动配置和去中心化理念。&lt;/p&gt;
&lt;p&gt;IPv6地址在小规模网络中大部分都可以通过SLAAC(Stateless Address Autoconfiguration，无状态地址自动配置)来获得，而这个过程本身的底层逻辑是终端设备自行声明检测冲突，不需要繁杂的手动配置或者DHCP通告。很多人会注意到即使在纯IPv4的网络中也会在Windows设置里看到一个IPv6地址，这就是在你网口本身启用了IPv6协议栈后尝试通过NDP（Neighbor Discovery Protocol，邻居发现协议，用于代替IPv4的ARP协议和ICMP路由发现）获取全球唯一地址的同时先行声明的链路本地地址。这个地址无需任何网关或者其他二层设备，而且由于无状态地址的声明机制和乐观DAD（Duplicate Address Detection，地址重复性检测）的存在，只要没有收到其他设备发送的ip冲突的邻居通告那么终端设备就会自己完成这个简单地本地链路建立，此时如果有其他设备与其同处一个二级链路他们之间的网络就已经自动配好了（本地链路地址根据MAC地址生成，很难冲突）。&lt;/p&gt;
&lt;p&gt;至于公网地址同样可以不依赖传统的静态配置或者DHCP，路由器在通过NDP建立路由表的同时会进行路由器通告，若选择只使用无状态网络则只需要路由器通告默认路由地址和网络前缀即可。在无状态网络下客户端会根据路由器获得的前缀（类似IPv4的网段）自动生成至多3个IPv6地址并进行DAD后即可使用，无需路由器的更多干预。这种无状态的配网可以说解放了小规模网络里面路由器的大量任务，客户端本身就能独立自动配置大量信息有效的提升了组网能力。&lt;/p&gt;
&lt;p&gt;而且最重要的是，这些并不是强制的换代。IPv4和IPv6的双栈网络可以同时保证兼容性和利用上新的特征，且在管理要求更高的企业那位中你仍可以选择DHCPv6和NAT这些传统的管理技术。至于其他的类似更简洁灵活的报头、自动检测链路MTU同时解决v4分片的问题、更强大的组播和更好的移动网络支持之类的，老顽固们不关心也不在乎，毕竟对他们来说问题只有不安全和麻烦。&lt;/p&gt;
&lt;h2 id="opnsense中为家庭网络配置ipv6"&gt;OPNsense中为家庭网络配置IPv6
&lt;/h2&gt;&lt;h3 id="默认最佳设置"&gt;默认最佳设置
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;其实这个设置在第一篇中已经基本配置完毕了，这里的设置基于山东联通家宽。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先在接口/wan口获取可供分配的前缀，这里一定要勾选的只有使用ipv4连接获取，请求前缀长度在国内家宽会被直接无视可以不用设置，委派的前缀也是从56bit到直接不允许继续委派的64bit参差不齐，如果需要设置可以照着后面获取到的前缀长度来设置。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s2.loli.net/2024/12/30/AYfntsWNz18xelc.webp"
loading="lazy"
alt=" 2024-12-30 09-21-34.webp"
&gt;&lt;/p&gt;
&lt;p&gt;lan口的IPv6设置为跟随wan口且允许手动调整DHCPv6和服务器通告。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s2.loli.net/2024/12/30/Oi2EJdkLKy4w9xt.webp"
loading="lazy"
alt=" 2024-12-30 09-22-21.webp"
&gt;&lt;/p&gt;
&lt;p&gt;然后我们打开服务，路由器通告设置。这里路由器通告的设置类型详细可以直接参考官方的注释，如上文所说，家用环境中直接只启用SLAAC即可，因为像Android这种消费级设备据称很多根本就不支持DHCPv6。然后为了简洁这里直接取消选择使用DHCPv6的dns设置。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s2.loli.net/2024/12/30/4BsaXJFiAen5Nyo.webp"
loading="lazy"
alt=" 2024-12-30 09-22-39.webp"
&gt;&lt;/p&gt;
&lt;p&gt;这里为IPv6配置再设置一下DNS，其实对于双栈网络来说设置IPv6的DNS服务器不是必须的，通过IPv4的DNS查询也可以获取AAAA类型的解析来进行IPv6访问。打开AdGuardHome，找到设置这里的设置向导，这里显示了所有AdGuardHome绑定的接口ip，这里可以记下pppoe接口的本地链路地址设置给IPv6通告。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s2.loli.net/2024/12/30/EIAsuFydaXPG9nR.webp"
loading="lazy"
alt=" 2024-12-30 09-23-10.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s2.loli.net/2024/12/30/sKCtdqwoT9XNuzU.webp"
loading="lazy"
alt=" 2024-12-30 09-27-26.webp"
&gt;&lt;/p&gt;
&lt;p&gt;再次查看AdGuardHome的日志可以看到已经有来自IPv6的查询记录。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s2.loli.net/2024/12/30/bqhGaPic9LzA6CN.webp"
loading="lazy"
alt=" 2024-12-30 09-28-43.webp"
&gt;&lt;/p&gt;
&lt;h3 id="dhcpv6的设置"&gt;DHCPv6的设置
&lt;/h3&gt;&lt;p&gt;当然你依然可以选择传统的DHCPv6，先讲直接分配公网前缀的方法。当你按照上述的wan口拨号配置正确获取到了IPv6前缀且lan口正确跟随后，打开服务/DHCPv6可以看到你获取的前缀。此时只需要设置子网可分配范围和前缀委派范围就好了。前者类似DHCPv4，后者则允许下面的路由器继续获取子网前缀，所有这些设置只需要设置后缀的范围就可以了，前缀会根据wan口获取的产生变化，按照IPv6简写方法省略即可。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s2.loli.net/2024/12/30/4BsaXJFiAen5Nyo.webp"
loading="lazy"
alt=" 2024-12-30 09-22-39.webp"
&gt;&lt;/p&gt;
&lt;p&gt;同时你也可以选择设置为局域网地址，这里我们回到lan口，修改IPv6为静态，然后从IPv6的内网地址段选取一段作为局域网地址。此时可以看到DHCPv6也会跟随变化，此时就可以使用IPv6的局域网地址了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不过不太推荐这样设置，自动配置的本地链路地址已经能满足大多数情况家用局域网的局域网互访需求了。这样为了保留IPv6公网能力还需要配置NAT转发或者NPTv6来做和公网地址前缀的映射，这里我不太需要就不详细演示了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20250907/145bd2f7b8d0784c5684e0cd72f86be3.jpg"
loading="lazy"
alt="Snipaste_2024-11-27_16-55-52-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s2.loli.net/2024/12/30/TFE4tJqZQ7BlsMg.webp"
loading="lazy"
alt="Snipaste_2024-11-27_17-00-51-tuya.webp"
&gt;&lt;/p&gt;</description></item><item><title>OPNsense使用记录02：第三方软件源和AdGuardHome配置</title><link>https://takuron.com/post/id0028/</link><pubDate>Wed, 27 Nov 2024 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0028/</guid><description>&lt;img src="https://img.takuron.com/blogpost/KABjvaXbhSmWkCg.webp" alt="Featured image of post OPNsense使用记录02：第三方软件源和AdGuardHome配置" /&gt;&lt;p&gt;为了更好的管理家庭网络，我们可以为OPNsense添加更多类型的软件来实现更多功能。&lt;/p&gt;
&lt;h2 id="添加第三方软件源"&gt;添加第三方软件源
&lt;/h2&gt;&lt;p&gt;首先为了开启第三方源我们要启动ssh，这个选项可以在系统/设置/管理里面启用安全shell（不建议持续打开，在配置完成后建议关掉）。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/73122fa124ce6702eda534cd9114d563_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-17_10-48-38-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;然后用你服务的的ip登录ssh，这里我选择的是Windows11自带的终端界面，PowerShell里面提供了ssh的登录程序我们直接敲命令登录即可，用户名密码即为你安装的时候的用户名和密码。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/39dc38a490cdaa7a0242afe0400f3b78_MD5.png"
loading="lazy"
alt="Snipaste_2024-11-17_10-49-24.png"
&gt;&lt;/p&gt;
&lt;p&gt;输入如下命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fetch -o /usr/local/etc/pkg/repos/mimugmail.conf https://www.routerperformance.net/mimugmail.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后更新缓存&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pkg update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此时打开系统/固件/插件里面搜AdGuardHome，如果有显示即说明mimugmail源添加成功。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6d26f25f89b05784eeb659b86c3416ce_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-17_10-51-14-tuya.webp"
&gt;&lt;/p&gt;
&lt;h2 id="启动adguardhome"&gt;启动AdGuardHome
&lt;/h2&gt;&lt;p&gt;AdGuard Home 是一款全网广告拦截与反跟踪软件，安装在路由器后即可充当dns服务器对整个网络（通过dhcp设置dns）的设备的dns请求进行处理和广告过滤。&lt;/p&gt;
&lt;p&gt;首先在上面那个界面点击加号安装AdGuardHome，下载完成后刷新网页，如果能在 服务 里面看到AdGuardHome即为安装成功。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/d8bc2b27a83ed062d1d1deae33e6321e_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-17_10-52-11-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;在启用AdGuardHome之前我们先关掉自带的Unbound DNS，这样我们就可以直接让AdGuardHome监听53端口了。打开服务/Unbound DNS/常规，取消启用（这里我顺便给了个其他端口免得出奇怪问题）。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/915826c96bcf8742f37a3b3930240c33_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-17_10-52-37-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;此时启用AdGuardHome，浏览器打开 你的网关ip:3000 的网页，就可以开始进行常规AdGuardHome配置了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/4bc2f9f10c12e938d3c93cce4f779854_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-17_10-53-27-tuya.webp"
&gt;&lt;/p&gt;
&lt;h2 id="adguardhome个人配置"&gt;AdGuardHome个人配置
&lt;/h2&gt;&lt;p&gt;AdGuardHome网上的各种教程就比较多了，这里就简单分享下个人的配置方式。注意以上规则是适用于局域网dns分发的规则，自建dns服务和终端设备使用的契合度请自行设计。&lt;/p&gt;
&lt;p&gt;dns上游这里我选择了思科的OpenDNS并且直接ip访问DNS over https，其没有污染、支持EDNS的同时访问速度亲测在国内还算过得去，不过为了提高效率建议手动拉大缓存容量并且开启乐观缓存（你不开很多上游实际也是乐观缓存，所以开就行了）,然后选择了阿里和DNSpod做后备,启用EDNS提高查询准确性。实测在乐观缓存条件下响应时间整体在50ms以内。&lt;/p&gt;
&lt;p&gt;更多DoH服务器列表可以参考下&lt;a class="link" href="https://coding.gs/2024/06/09/available-doh/" target="_blank" rel="noopener"
&gt;这个帖子&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/f7e0fa99d02c39acd9b9b0cdee08a16c_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-27_19-32-38-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/d947c07a23e0f4688b2eb3660bd92aec_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-27_19-32-47-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/8e1076559ff18657ed6fcd568b390cd4_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-27_19-33-14-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;广告过滤规则我选择的是&lt;a class="link" href="https://github.com/217heidai/adblockfilters" target="_blank" rel="noopener"
&gt;217heidai/adblockfilters&lt;/a&gt;中的DNS拦截版本，只用开启这一个就好了。&lt;/p&gt;</description></item><item><title>OPNsense使用记录01：安装与基本配置</title><link>https://takuron.com/post/id0027/</link><pubDate>Sat, 16 Nov 2024 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0027/</guid><description>&lt;img src="https://img.takuron.com/blogpost/KABjvaXbhSmWkCg.webp" alt="Featured image of post OPNsense使用记录01：安装与基本配置" /&gt;&lt;p&gt;自从去年受够openwrt各种插件之间的兼容性问题和遭遇了n5105小包总线速度问题导致的系统崩溃之后转向了OPNsense系统。作为一个专业的开源防火墙，其中文资料却少得可怜，去年第一次装的时候就准备全程记录一下配置的过程，一直因为时间问题没能实现。到了现在软路由硬件都换了一遍，结果再装还是资料少的可怜频频踩坑，故开坑记录一下，免得我自己也天天往一个坑里跳。&lt;/p&gt;
&lt;h2 id="前置条件"&gt;前置条件
&lt;/h2&gt;&lt;p&gt;能选择这个系统的应该对软路由硬件挑选已经有自己的见解了吧，OPNsense 是基于 FreeBSD 的开源防火墙系统，理论上有驱动的硬件你随便选就可以。这里本人使用的是畅网n100的四网畅想版ddr4的版本来安装，并不是什么高性价比的东西单纯偷懒。内存为8g，硬盘则是用了一个傲腾16g，反正不记录log只装系统我就没见过用爆的，本身量大寿命又长，除了强制要有m.2口外其实很适合做这种工控机的系统盘。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/c21f75db8a7c889eb7edd5d7153b4076_MD5.jpg"
loading="lazy"
alt="使用的软路由"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://opnsense.org/users/get-started/" target="_blank" rel="noopener"
&gt;这里&lt;/a&gt;可以查到官方的硬件要求。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://opnsense.org/download/" target="_blank" rel="noopener"
&gt;你可以在这里下载到OPNsense&lt;/a&gt;，下载类型选择amd64和dvd，镜像国内选北京大学的即可。下载好后可以直接用&lt;a class="link" href="https://rufus.ie/zh/" target="_blank" rel="noopener"
&gt;rufus&lt;/a&gt;写入u盘安装。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/8740cfde28346a5169dd64f27ebc19a2_MD5.webp"
loading="lazy"
alt="下载界面"
&gt;&lt;/p&gt;
&lt;h2 id="系统安装"&gt;系统安装
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;因本人没有采集卡并且不喜欢拍屏，故本节非web界面的截图均来自&lt;a class="link" href="https://www.bilibili.com/opus/784755568172597299" target="_blank" rel="noopener"
&gt;b站@狐狸Nomad&lt;/a&gt;，顺便感谢大佬的指南。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;从u盘启动，一直跑马直到出现“Press any key to start the configuration importer: &amp;hellip;”。不用管。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/1dc4311bc45ff5d9b0ddc1b8eff798cd_MD5.webp"
loading="lazy"
alt="mflzo9aaoffx550e.webp"
&gt;&lt;/p&gt;
&lt;p&gt;等到跑马出现“Press any key to start the manual interface assignment”的时候，你可以点击任何键来配置接口，在这里你可以手动配置一下wan口和lan口。但由于OPNsense的逻辑和openwrt不太一样这里的lan口只能配置一个，我倾向于直接跳过回头webui里面配置。如果你需要改可以按提示设置一下lan和wan对应的网口，其他选项除了最后保存全都直接回车跳过即可。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/1e1237e11b361bbc142a62b1dd0e6cba_MD5.webp"
loading="lazy"
alt="yioc701c2ndx4hpy.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/a5db774b7d7b679562356823bb91c7a9_MD5.webp"
loading="lazy"
alt="x3xnsvza5ao3sy2d.webp"
&gt;&lt;/p&gt;
&lt;p&gt;然后就提示登录了，这里我们可以看到OPNsense为我们启动了一个体验版的系统，你可以连接lan口来体验。这里我们登录安装账号来开始安装到本地，在24.7版本安装账号名为installer,密码opnsense。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/f67c13dafeda013572f169984c98b40a_MD5.webp"
loading="lazy"
alt="t50aqha0g8eufwp4.webp"
&gt;&lt;/p&gt;
&lt;p&gt;登录后就进入了安装界面，选择默认键盘布局。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/0e5670f94184b7b4dcc7e416c2055485_MD5.webp"
loading="lazy"
alt="cuxvjptvwch2gfi9.webp"
&gt;&lt;/p&gt;
&lt;p&gt;选择安装的硬盘分区格式，现在默认就是ZFS选择就可以了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/2a74538c3f6feeca085c2ecbdb22c6a8_MD5.webp"
loading="lazy"
alt="067n3phbpqsa7inw.webp"
&gt;&lt;/p&gt;
&lt;p&gt;选择冗余模式，你可以在这里给系统做软raid，这里一块盘选stripe。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/d0fc28cdd5dedeca3dcb9501097c15ba_MD5.webp"
loading="lazy"
alt="8656mlvm1u46q747.webp"
&gt;&lt;/p&gt;
&lt;p&gt;选择安装的硬盘&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/f312610652aa997367a9c533846c3b8d_MD5.webp"
loading="lazy"
alt="qaglrtzszpnerk7e.webp"
&gt;&lt;/p&gt;
&lt;p&gt;然后就开始安装了，安装结束后会显示这个界面，建议在这里修改一下root用户的密码，回头你需要用这个密码登录管理界面。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/0f27a163930951037627aa6ecfbea2c2_MD5.webp"
loading="lazy"
alt="zeo9w02o5pd2nhx8.webp"
&gt;&lt;/p&gt;
&lt;p&gt;重启，然后等待到提示登录时按照显示的lan口和网关地址打开浏览器就可以看到登录界面了（ssl证书错误请直接了解详细，仍要访问即可）。登录用户名为root，密码为你上一步设置的密码。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/51cb0c478fe5cdfd4d34e954fd43afa2_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_19-34-41-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/0b0b0fe4cf7666b7420731f657f053f8_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_12-28-43-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;然后就可以接上wan口开始配置了。&lt;/p&gt;
&lt;h2 id="基本配置"&gt;基本配置
&lt;/h2&gt;&lt;h3 id="初始化"&gt;初始化
&lt;/h3&gt;&lt;p&gt;初始化其实按照引导一步步设置即可，首先设置时间和时区，这里可以改成阿里的btp服务器也可以不动。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/21128a7926b2f82975a847508679f15a_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_11-12-26-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;设置主机名、dns和语言，这些我们都不用动后面会用AdGuardHome。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/5e0c77fd646a605431a855c291d54001_MD5.webp"
loading="lazy"
alt="PixPin_2024-01-17_14-33-06-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;这里有一个图少截了，会问你WAN口的类型，我这里还没插网线直接选的pppoe但没给账号密码，如果上一步你接上了网线可以这会儿就配置了。&lt;/p&gt;
&lt;p&gt;设置LAN ip和网段，选一个自己喜欢的局域网网段即可。这里我写错了网关地址应为172.24.0.1。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/330c383ca5dda4ee18785f5cda0cc7b1_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_11-16-28-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;然后机器就会重启，初始化就基本完成了。&lt;/p&gt;
&lt;h3 id="启用所有lan口"&gt;启用所有LAN口
&lt;/h3&gt;&lt;p&gt;pfsense和OPNsense的第一个坑就是他们的接口（interface）都只能实际绑定一个物理网口，&lt;strong&gt;如果需要给几个网口做默认桥接就要每个网口单独设置一个没有网络的接口，然后用网桥连接这些接口后绑定在LAN上&lt;/strong&gt;。这和openwrt的习惯是不一样的。&lt;/p&gt;
&lt;p&gt;我们现在就来把我这个机器的igc1/2/3设置成互相桥接的LAN口，目前我已经给igc1在安装的时候设置成了机器的LAN，所以我们献给igc2/3建立一个网桥。先建立两个接口，分别绑定物理的网口2/3并启用，不需要任何ip设置。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/a7d42adde49f3a294669d05a49a8f70b_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_22-53-51-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;然后我们建立网桥，在接口/其他类型/网桥里面点一下加号，将刚才新建的两个接口加进去。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/c131e544a7931d820c84d5fcfe5be1a8_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_12-48-16-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;进入我们原先的LAN接口，把LAN接口改成我们新建立的网桥，保存。（注意所有的接口配置都需要二次选择应用才能生效）&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/66c8be4cb4e541ecaa10ec601ee49096_MD5.webp"
loading="lazy"
alt="PixPin_2024-01-17_14-59-40-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;接入网口2/3，再将已经释放的igc1同样的创建接口并加入网桥即可。&lt;/p&gt;
&lt;h3 id="防火墙初步"&gt;防火墙初步
&lt;/h3&gt;&lt;p&gt;以上述方法设置的LAN口虽然都可以正常访问网络，而且我们实际做局域网DHCP和NAT的“LAN”接口的规则是进出全部放行，但由于我们引入了新的接口，而这些接口的默认规则是放行出口禁止进口，这样会导致局域网下设备无法互相访问。&lt;/p&gt;
&lt;p&gt;我们点开防火墙/规则，随便选择一个lan口，加号新建规则，这里我用最简单的方法先放行了所有LAN网络下的主机的入站，这样可以把最需要解决的局域网互相访问先处理好，后续感觉应该修改掉LAN口的全放行来控制流量更符合家用的环境。记得保存完规则后刷新让防火墙生效。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/b81ec8db34ddeca073bfe44daf17982a_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_23-14-52-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/8e4ae6553781884d3aa4626ee76e729f_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_23-14-15-tuya.webp"
&gt;&lt;/p&gt;
&lt;h3 id="拨号dhcp和ipv6初步"&gt;拨号、DHCP和IPV6初步
&lt;/h3&gt;&lt;p&gt;我们转回到接口WAN，这里以山东联通普通家用有v6的环境为例进行拨号和通过上级路由分配ipv6地址。PPPoe设置非常的简单，只需要在这里写你宽带的用户名和密码就行。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/7facc6352b72650b063057f89328e3f0_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_12-51-39-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;然后是ipv6，拖到最底下可以看到DHCPv6客户端的设置，这里比较重要的是使用ipv4连接和仅请求地址前缀（request prefix only）必须打开。前缀委派大小和发送前缀大小这俩开与不开意义不大反正会被运营商美美无视。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/f352587efe0b3c1cb5da5ec5e318e102_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_23-30-33-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;在LAN口中打开允许手动调整DHCPv6和路由器通告。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/67791bec3fe8d89626e65efa68d9fe15_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_23-31-12-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;此时打开服务/DHCPv6，如果宽带能正常获取ipv6前缀应该可以看到分配的网段，长度从56bits到64bits不等，说明获取ipv6前缀成功。（不过先不要用DHCPv6，我们现在先用SLAAC分配v6更加方便快捷）&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/be8903fdb8005a8b176f7c49e718fa69_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_23-32-07-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;我们打开服务/路由器通告，将通告模式设置成unmanaged仅使用SLAAC分配ipv6，这样最基本的拥有ipv6地址就做到了，后面我们会更详细的设置DHCPv6。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/f1fdca300c3a66ae83b2d7fab69fa366_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_14-35-55-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;同一级菜单下还可以改变DHCPv4的设定，最需要设置的可能是类似我这种给了更大的局域网网段，这种情况下DHCP可选的ip范围还是不够使用的话可以手动选择范围。&lt;/p&gt;
&lt;h3 id="更新-备份-杂项"&gt;更新 备份 杂项
&lt;/h3&gt;&lt;p&gt;转到系统/固件/设置，这里可以先把更新源改成国内的，然后保存返回状态进行更新。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/a5a64112c5d9677765454c65387d54eb_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_15-20-12-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;系统/设置/其他里面可以修改主页温度传感器的温度源，志强用户还可以开启硬件加速。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/84e3e43369b75c64f691048c3f74bfb1_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-16_15-07-26-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;系统/设置/任务里面可以为系统设置定时任务，这里我让他每周重启。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/ea7cd109058e57b448196a3e706d63f2_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-17_09-43-23-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;最后我们可以吧已经配置好的配置文件下载下来，这样出现问题直接上传配置文件即可恢复全部设置了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/331e29fbc363c4c110787d2bb93d0c8c_MD5.webp"
loading="lazy"
alt="Snipaste_2024-11-17_09-40-51-tuya.webp"
&gt;&lt;/p&gt;
&lt;p&gt;结束&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;最后吐槽一下国内折腾软路由的，表面说支持开源和稳定，实际用着各种高大全魔改TUN的固件，为了开个魔法上网拒绝一切技术进步，ipv6这些和全局魔法冲突的统统全杀了还是避免不了不同模块打架出奇葩问题。你要和他说起稳定转头就投了有黑历史的闭源ikuai，就这样还热衷于all in boom建议两个全都真是系统简洁明了稳定。&lt;/p&gt;
&lt;p&gt;我个人不喜欢纯粹的全局代理，因为没有一个固定的规则让我满意能完成我的一切需求，毕竟人的需求也是会根据实际情况变动的。个人还是更喜欢细化的给每个需要分流的软件单独设置代理，浏览器直接用两个，这种手动分类才是效率最高的。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Android 13中使用Intent传输Parcelable对象为空的解决方式</title><link>https://takuron.com/post/id0025/</link><pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0025/</guid><description>&lt;img src="https://img.takuron.com/20250827/1e7bc2d1c52123042ccb528e7263e7ca.webp" alt="Featured image of post Android 13中使用Intent传输Parcelable对象为空的解决方式" /&gt;&lt;h2 id="背景介绍"&gt;背景介绍
&lt;/h2&gt;&lt;h3 id="intent对象传递与序列化"&gt;Intent对象传递与序列化
&lt;/h3&gt;&lt;p&gt;为了在Android各大组件之间通信跳转，Intent是最常用的通信手段。其中我们可以在其中的extra里面添加一些简单数据随其传递到下一个组件。为了向其中写入对象数据，我们需要将对象转变成可以保存和传输的二进制格式，即序列化过程。Android Intent允许传递继承Serializable和Parcelable的可序列化对象。
Serializable为Java原生的可序列化接口，只需继承自空的Serializable接口即可实现整个对象的序列化，但其序列化的实现使用了Java的反射机制且会对整个类的全部数据进行序列化，效率非常低。Parcelable则是Android专门设计的序列化接口，其需要自行实现序列化和反序列化的方法，其优点自然是&lt;a class="link" href="go?url=https://www.developerphil.com/parcelable-vs-serializable/" &gt;整体效率可以接近十倍于Serializable&lt;/a&gt;，缺点自然是实现的时候需要写大量格式化的代码，以下是java中的一个例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;static class Skill implements Parcelable {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; boolean programmingRelated;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Skill(Parcel in) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; this.name = in.readString();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; this.programmingRelated = (in.readInt() == 1);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @Override
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; void writeToParcel(Parcel dest, int flags) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dest.writeString(name);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dest.writeInt(programmingRelated ? 1 : 0);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; static final Parcelable.Creator&amp;lt;Skill&amp;gt; CREATOR
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; = new Parcelable.Creator&amp;lt;Skill&amp;gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Skill createFromParcel(Parcel in) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return new Skill(in);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Skill[] newArray(int size) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return new Skill[size];
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @Override
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int describeContents() {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return 0;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="kotlin的优化"&gt;Kotlin的优化
&lt;/h3&gt;&lt;p&gt;Kotlin原生引入了data class，并且得益于gradle强大的插件系统。这解决了上面Parcelable接口最大的缺点，我们可以用插件快速为开发中常用的data类实现Parcelable序列化方法，首先在build.gradle里引入插件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;plugins {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; id(&amp;#34;kotlin-parcelize&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后对需要实现Parcelable接口的数据类使用注释即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@Keep
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@Parcelize
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;data class PaoModel(
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; val pao_name: String,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; val pao_url:String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;): Parcelable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="api33的改动"&gt;API33的改动
&lt;/h3&gt;&lt;p&gt;Api33以前无论读取那种序列化对象都是直接根据key来获得对象后强转：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;val a:A = activity.intent.extras?.getParcelable(&amp;#34;key1&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;val b:B = activity.intent.extras?.getSerializable(&amp;#34;key2&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;但这样是类型不安全的，为了解决这个问题，Api33以后弃用了上述的方法，改为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;val a = activity.intent.extras?.getParcelable(&amp;#34;key1&amp;#34;,A::class.java)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;val b = activity.intent.extras?.getSerializable(&amp;#34;key2&amp;#34;,B::class.java)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="问题现象"&gt;问题现象
&lt;/h2&gt;&lt;p&gt;在实际开发中我使用了Activity A B C，A B两个Activity为唯一跳转Activity C的路径并向其传递了需要展示的对象信息x，接收intent的数据的代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if(Build.VERSION.SDK_INT&amp;gt;=Build.VERSION_CODES.TIRAMISU)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; historyData = ac.intent.extras!!getParcelable(AppInfo.INTENT_KEY_RENEYE,LgroModel::class.java)!!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; historyData = ac.intent.extras!!.getParcelable&amp;lt;LgroModel&amp;gt;(AppInfo.INTENT_KEY_RENEYE)!!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在测试的时候未发现任何问题，于是混淆打包release，出事了，提示空指针。&lt;/p&gt;
&lt;p&gt;首先考虑混淆导致data类错误和强制非空转换的逻辑问题，但查了半天该keep的都正常keep，逻辑在debug包下无论怎么点都不会有问题。尝试打印传入对象，在release包下依然有效。尝试传递字符串，传递正常。于是问题就变成了为何intent传递对象失效。&lt;/p&gt;
&lt;h2 id="解决"&gt;解决
&lt;/h2&gt;&lt;p&gt;问题回到了获取Parcelable对象本身，此时看到为了适配新api做的分支判断，马上掏了个Android 11的手机测试，一切正常，问题看样子出在了新的方法上，遂根据关键词搜索，找到了&lt;a class="link" href="go?url=https://stackoverflow.com/questions/76067109/getparcelable-crashes-due-to-null-iftable-in-agp-8" &gt;Stack Overflow上的这篇文章&lt;/a&gt;,真相大白，解决方案翻译如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我认为这个崩溃是由两个不幸的因素组合在一起引起的。
AGP 8 默认启用了 R8 的完整模式。R8 的完整模式会剥离默认构造函数并执行更激进的优化。在 API 33 中引入的新的 getParcelable(String, Class) 方法存在一些缺陷，如果 Parcelable 没有以特定方式定义，就会出现问题。&lt;a class="link" href="go?url=https://issuetracker.google.com/issues/274185314" &gt;相关错误的文档&lt;/a&gt;
看起来 getParcelable(String, Class) 的脆弱实现和 R8 对某些代码进行优化导致了这个崩溃。目前的解决方法似乎是在 API 33 中使用旧的 getParcelable(String) 方法。Google 表示他们已经在 API 34 中修复了 getParcelable(String, Class) 的问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;更新：androidx.core:core-ktx:1.10.0 包含了对此问题的修复。它包含了 BundleCompat.getParcelable(Bundle, String, Class)，该方法仅在 Android U 及以上版本上调用新的 getParcelable(Bundle, Class) 函数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个问题只会在使用R8混淆之后才会出现且较难定位。所以为了解决这个问题，现在建议升级AndroidX之后使用其中的方法来获取Parcelable对象。故修改：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if(Build.VERSION.SDK_INT&amp;gt;=Build.VERSION_CODES.TIRAMISU)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; historyData = BundleCompat.getParcelable(ac.intent.extras!!,AppInfo.INTENT_KEY_RENEYE,LgrolrModel::class.java)!!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; historyData = ac.intent.extras!!.getParcelable&amp;lt;LgrolrModel&amp;gt;(AppInfo.INTENT_KEY_RENEYE)!!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;（后来发现用了兼容库版本判断也是多余的）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;historyData = BundleCompat.getParcelable(ac.intent.extras!!,AppInfo.INTENT_KEY_RENEYE,LgrolrModel::class.java)!!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;问题解决&lt;/p&gt;</description></item><item><title>为Windows11设置更多DNS over https服务器&amp;一键添加更多服务器脚本</title><link>https://takuron.com/post/id0024/</link><pubDate>Tue, 05 Oct 2021 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0024/</guid><description>&lt;img src="https://img.takuron.com/20250827/ed8fda4fbfdea13178ac39ef421b2ebb.jpg" alt="Featured image of post 为Windows11设置更多DNS over https服务器&amp;一键添加更多服务器脚本" /&gt;&lt;p&gt;早就有闻Windows系统已经添加了系统级的DNS over Https的支持，趁着此次重装Windows11新系统之际换掉AdguardHome改用Windows系统自己提供的DoH支持。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;理论上Windows 10 build 19628以后的所有版本都支持此教程的方法，本人也亲测在Windows Server 2022上成功使用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="设置dns-over-https的位置"&gt;设置DNS over Https的位置
&lt;/h2&gt;&lt;p&gt;以WLAN网络为例：打开设置-WLAN-&lt;strong&gt;硬件属性&lt;/strong&gt;-DNS服务器分配，选择手动。输入一个支持DoH的服务商的DNS地址（例如Google的8.8.8.8），下面灰显的选项就会启用：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20250827/19ab4d119bcd75a81aa2cf5d404cffc6.png"
loading="lazy"
alt="Snipaste_2021-10-05_14-20-37.png"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20250827/53f7b46711870002bf18aa4c337fb20f.png"
loading="lazy"
alt="Snipaste_2021-10-05_14-19-54.png"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2021.10.29 这不是一个BUG，这里设置的话可以自动覆盖所有将要连接的WIFI，更好的保护连接公共WIFI带来的隐私问题。
&lt;s&gt;2021.10.5 你可以在选择网络连接的位置发现同样的选项来设置网络连接的属性，但是不能启用DoH，本文来自Takuron点top，这应该是Windows11的一个BUG。&lt;/s&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不过我们的设置并没有结束，&lt;strong&gt;坑爹的微软只预置了一些常见的全球DoH服务器，但众所周知天朝不在地球上&lt;/strong&gt;。设置其他服务器不会有任何显示：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20250827/06670b3bfb0f38aaaeca8a6af77f72b8.png"
loading="lazy"
alt="Snipaste_2021-10-05_13-43-47.png"
&gt;&lt;/p&gt;
&lt;p&gt;你只能直接设置以下DoH服务器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare(1.1.1.1/2606:4700:4700::1111)&lt;/li&gt;
&lt;li&gt;Google(8.8.8.8/2001:4860:4860::8888)&lt;/li&gt;
&lt;li&gt;Quad9(9.9.9.9/2620:fe::fe)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果需要安装国内常用的DoH服务器需要先添加&lt;/p&gt;
&lt;h2 id="为系统添加更多dns-over-https服务器"&gt;为系统添加更多DNS over Https服务器
&lt;/h2&gt;&lt;p&gt;我们需要注册更多的Doh服务器，这可以用以下命令解决（感谢&lt;a class="link" href="https://bbs.pcbeta.com/viewthread-1877659-1-1.html" target="_blank" rel="noopener"
&gt;如何在win10中自定义doh服务器-远景论坛-微软极客社区&lt;/a&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netsh dns add encryption server=&amp;lt;your-server&amp;#39;s-IP-address&amp;gt; dohtemplate=&amp;lt;your-server&amp;#39;s-DoH-URI-template&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netsh dns show encryption server=&amp;lt;your-server&amp;#39;s-IP-address&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;例如添加阿里的DoH代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netsh dns add encryption server=223.5.5.5 dohtemplate=https://dns.alidns.com/dns-query
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netsh dns show encryption server=223.5.5.5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;IPV6同理，不过DoH服务商那么多，还要连着主要次要ipv4/v6都要添加，怕不是一行行打手都麻了，为此我专门写了一个脚本，自动添加了以下DoH服务商：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阿里DNS(223.5.5.5/2400:3200::1)&lt;/li&gt;
&lt;li&gt;DNSPOD(119.29.29.29/2402:4e00::)&lt;/li&gt;
&lt;li&gt;深信服下一代网络工程IPV6 DoH(仅IPV6:240C::6666)&lt;/li&gt;
&lt;li&gt;360(仅IPV4:101.226.4.6/123.125.81.6)&lt;/li&gt;
&lt;li&gt;Adguard(包括多种，&lt;a class="link" href="https://bbs.pcbeta.com/viewthread-1877659-1-1.html" target="_blank" rel="noopener"
&gt;详细官网查看&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下载后&lt;strong&gt;请使用右击，以管理员权限运行&lt;/strong&gt;,&lt;a class="link" href="https://takuron.lanzoui.com/b0as59z2f" target="_blank" rel="noopener"
&gt;蓝奏云下载地址（提取码h6e1）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以看到添加后就能正常使用国内的DoH服务了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/20250827/a06762e22f8c2ba77b4d642eaa0bd5a0.png"
loading="lazy"
alt="Snipaste_2021-10-05_13-45-26.png"
&gt;&lt;/p&gt;</description></item><item><title>使用开源的Gadgetbridge管理小米手环4</title><link>https://takuron.com/post/id0023/</link><pubDate>Sat, 10 Apr 2021 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0023/</guid><description>&lt;img src="https://i.loli.net/2021/04/10/em5ysORGpYJHola.png" alt="Featured image of post 使用开源的Gadgetbridge管理小米手环4" /&gt;&lt;h2 id="前言"&gt;前言
&lt;/h2&gt;&lt;p&gt;小米手环已经更新到了6，但越看更新越没有换的欲望，手环的功能到现在为止都没有突破性的改变，而手表还是一如既往的耗电。反而是小米运动APP（其实应该是华米的运动APP吧）的广告越来越遭人烦，这让我的视线逐步向第三方的方案转移。虽然在此之前有同为精简第三方的Notify &amp;amp; Fitness for Mi Band，但留一个破解本体还是让人难免不舒服，于是这次转而使用开源的Gadgetbridge，而且说句实话，在整理好的APP帮助下个人认为体验是最好的。&lt;/p&gt;
&lt;h2 id="安装步骤"&gt;安装步骤
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://takuron.lanzous.com/b0armx34f" target="_blank" rel="noopener"
&gt;备用下载位置&lt;/a&gt;，密码：cug3&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在官方APP中将手环的账号绑定（完成后可卸载）： &lt;img src="https://i.loli.net/2021/04/10/2W3lUxhYoSRyiHA.jpg"
loading="lazy"
alt="photo_2021-04-10_14-47-16.jpg"
&gt;&lt;/li&gt;
&lt;li&gt;下载&lt;a class="link" href="https://codeberg.org/vanous/huafetcher" target="_blank" rel="noopener"
&gt;huafetcher&lt;/a&gt;用于获取加密key 。&lt;/li&gt;
&lt;li&gt;在第二项选择为xiaomi：&lt;img src="https://i.loli.net/2021/04/10/TPrMg1OHoKb6RL8.jpg"
loading="lazy"
alt="photo_2021-04-10_14-47-38.jpg"
&gt;&lt;/li&gt;
&lt;li&gt;选择Get token进入网页，登录小米账号（这里注意修改手机号为+86）：&lt;img src="https://i.loli.net/2021/04/10/pzZSOuPiwDX6HqY.jpg"
loading="lazy"
alt="photo_2021-04-10_14-47-47.jpg"
&gt; &lt;img src="https://i.loli.net/2021/04/10/lyeKfqND7PRovrV.jpg"
loading="lazy"
alt="photo_2021-04-10_14-47-51.jpg"
&gt;&lt;/li&gt;
&lt;li&gt;这里会报错，这是正常的，直接复制地址栏所有内容到URL result内：&lt;img src="https://i.loli.net/2021/04/10/j3o2SiMUryEH7IX.jpg"
loading="lazy"
alt="photo_2021-04-10_14-47-57.jpg"
&gt; &lt;img src="https://i.loli.net/2021/04/10/hsCqDYbkFyHPUun.jpg"
loading="lazy"
alt="photo_2021-04-10_14-48-02.jpg"
&gt;&lt;/li&gt;
&lt;li&gt;选择“Fetch key”，把下方生成的key复制走（到这里这个APP可以卸载了）&lt;/li&gt;
&lt;li&gt;下载&lt;a class="link" href="https://codeberg.org/Freeyourgadget/Gadgetbridge" target="_blank" rel="noopener"
&gt;Gadgetbridge&lt;/a&gt;，进入后点击右下角的“+”，然后搜索你的小米手环：&lt;img src="https://i.loli.net/2021/04/10/3nitAx8zl6vePhp.jpg"
loading="lazy"
alt="photo_2021-04-10_14-48-15.jpg"
&gt;&lt;/li&gt;
&lt;li&gt;这里长按进去，拖到底下，找到认证密钥，输入你刚刚复制的key到里面，回去连接，就可以正常使用了。&lt;img src="https://i.loli.net/2021/04/10/Ww3GpNkdzHTuvPD.jpg"
loading="lazy"
alt="photo_2021-04-10_14-48-19.jpg"
&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;之后只要不动官方APP内的绑定关系就能一直使用了。&lt;/p&gt;
&lt;h2 id="优劣势对比"&gt;优劣势对比
&lt;/h2&gt;&lt;p&gt;与小米手环官方APP和小米手环专用的Notify &amp;amp; Fitness for Mi Band比起来，Gadgetbridge有以下优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开源 免费（相对Notify &amp;amp; Fitness for Mi Band） 无广告（相对官方）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;通用方案，可以同时兼容其他品牌的手环。&lt;/li&gt;
&lt;li&gt;轻便优雅，官方APP不需要修改不需要保留给爷爬。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么，代价是什么呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;缺少对心跳、月经（米环5）等小米手环特色功能的支持&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;更换主题不方便（这个可以用官方APP当工具人）&lt;/li&gt;
&lt;li&gt;通知管理不太符合个人的使用习惯（个人一般喜欢设置仅聊天手环通知，而这个应用默认·是黑名单模式）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;AD米一生黑，开源万岁。&lt;/p&gt;</description></item><item><title>Windows系统联网验证策略和“去除叹号”</title><link>https://takuron.com/post/id0022/</link><pubDate>Sat, 21 Nov 2020 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0022/</guid><description>&lt;img src="https://i.loli.net/2020/11/21/VIA9Jxk4ROSF3XG.jpg" alt="Featured image of post Windows系统联网验证策略和“去除叹号”" /&gt;&lt;p&gt;出于你懂得的的原因，在我朝连接国际互联网那叫一个感人。在原生安卓中，就是因为这个众所周知的原因无法正确判断联网状态诞生了“去除叹号”软件。同样的，作为难兄难弟的微软爷不甘示弱。这两天同样的事情发生在了我的Windows电脑上。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/11/21/Pq9cWY3jedNg5nA.png"
loading="lazy"
alt="Snipaste_2020-11-21_09-38-13.png"
&gt;&lt;/p&gt;
&lt;p&gt;在使用以下方法时，请首先确定这只是“显示错误”，即你已经可以判断你的电脑可以正常连接互联网的情况下还是如此显示并且影响到你对一些应用（例如自带应用商店）的使用。&lt;/p&gt;
&lt;p&gt;所有的联网验证相关的参数都位于注册表&lt;code&gt;\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet&lt;/code&gt;当中，这里以我正在使用的Windows10 20H2为例：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/11/21/aYfUbPrgCdHkxTm.png"
loading="lazy"
alt="Snipaste_2020-11-21_09-47-10.png"
&gt;&lt;/p&gt;
&lt;p&gt;这就很明了了，直接说解决方案。&lt;/p&gt;
&lt;h2 id="直接关闭整个验证"&gt;直接关闭整个验证
&lt;/h2&gt;&lt;p&gt;如果你在用一个台式机，联网验证对你来说完全没用（自家路由器难道还有需要登录的？），那么你可以直接关闭这个功能，将&lt;code&gt;EnableActiveProbing&lt;/code&gt;参数改为0即可。&lt;/p&gt;
&lt;h2 id="验证dns是否正常"&gt;验证DNS是否正常
&lt;/h2&gt;&lt;p&gt;如果你是笔记本，只想修好这个功能而不是一股脑的关死，那么电脑会首先确定你的ISP有没有给你的DNS投毒。以我目前的参数设置为例，在powershell里面查询：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nslookup dns.msftncsi.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中被查询的域名是你注册表中&lt;code&gt;ActiveDnsProbeHost&lt;/code&gt;的值。Windows会验证DNS查询到的结果是否和&lt;code&gt;ActiveDnsProbeContent&lt;/code&gt;的值相同，v6同理。如果你返回的是类似于127.0.0.1这种解析结果，恭喜你被DNS投毒了。本人遇到的就是这种情况（PS：阿里的DNS都能间歇性投毒我想说什么不用讲了吧），但我在用AdGuardHome，所以加个重写就解决了。&lt;/p&gt;
&lt;p&gt;如果你没有用这类软件，并且你不想通过改写host这种自欺欺人的手段来解决问题，那么你可以将被查询的域名换成阿里dns的域名&lt;code&gt;dns.alidns.com&lt;/code&gt;，大多数情况下，其结果总对应其DNS服务器IP&lt;code&gt;223.5.5.5&lt;/code&gt;、&lt;code&gt;2400:3200::1&lt;/code&gt;，可以将对应值修改后以此验证。&lt;/p&gt;
&lt;h2 id="验证http访问是否正常"&gt;验证HTTP访问是否正常
&lt;/h2&gt;&lt;p&gt;然后电脑会确定你的HTTP服务是否正常，其会向&lt;code&gt;ActiveWebProbeHost&lt;/code&gt;对应的服务器请求一个&lt;code&gt;connecttest.txt&lt;/code&gt;的文本文件，然后确认其值是否与&lt;code&gt;ActiveWebProbeContent&lt;/code&gt;相等。以我目前的配置为例，这相当于：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/11/21/MQDkIs74zLWE6lp.png"
loading="lazy"
alt="Snipaste_2020-11-21_10-27-38.png"
&gt;&lt;/p&gt;
&lt;p&gt;解决的方法有很多，DNS投毒同样会影响这个的验证结果（并且这种情况导致的验证失败非常常见），可以先尝试上述方法。&lt;/p&gt;
&lt;p&gt;若仍无效或者是希望彻底解决问题，用gitee page自建一个测试服务器并不是一个完美的解决方案，因为无法判断ipv4联通还是ipv6连通，&lt;strong&gt;此处待大佬解决&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;整体来说微软的验证大多数时候还是有效的，如果偶尔出现了不可用的状况可以按照本文进行修改解决。&lt;/p&gt;</description></item><item><title>【个人渣翻】Don't kill my app!——一加</title><link>https://takuron.com/post/id0021/</link><pubDate>Sun, 19 Jul 2020 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0021/</guid><description>&lt;img src="https://i.loli.net/2020/07/19/IcApJi58xgCLk2D.jpg" alt="Featured image of post 【个人渣翻】Don't kill my app!——一加" /&gt;&lt;blockquote&gt;
&lt;p&gt;翻译自&lt;a class="link" href="https://dontkillmyapp.com/oneplus" target="_blank" rel="noopener"
&gt;Oneplus | Don’t kill my app!&lt;/a&gt;，遵循CC-BY-4.0 License。
本人英语水平渣，只是为翻译自用。欢迎友善提出翻译错误，不喜勿喷。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="背景"&gt;背景
&lt;/h2&gt;&lt;p&gt;一加和其基于Android修改的氧OS以最大程度提升原版Android的体验而著称。也许在用户体验方面的确是这样，但其在后台进程限制方面的表现却与之完全相反。&lt;/p&gt;
&lt;p&gt;当他们发布一加5和一加6手机时，一加推出了迄今为止市场上最严厉的后台限制，这甚至使小米或华为相形见绌。用户不仅需要启用额外的设置才能让应用正常运行，而且这些设置甚至会随着固件更新而被重置，应用会再次崩溃。因此用户被要求定期重启这些设置。&lt;/p&gt;
&lt;h2 id="为用户准备的解决方法"&gt;为用户准备的解决方法
&lt;/h2&gt;&lt;h3 id="电池选项"&gt;电池选项
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;关闭&lt;strong&gt;设置&amp;gt;应用和通知&amp;gt;需要操作的应用&amp;gt;高级&amp;gt;电池优化&lt;/strong&gt;选项。
&lt;strong&gt;警告&lt;/strong&gt;：最近一加手机开始对一些应用随机恢复这个设置。也就是说如果你设置为未优化，第二天可能就会恢复到优化状态。
为了避免系统自动恢复成未优化，你还必须将应用锁定到 “最近应用 ”列表中。启动您要保护的应用程序，进入最近的应用程序（应用程序切换器），点击应用右上角的锁定按钮。（译者注：新版系统请长按应用窗口&amp;gt;锁定）
这将避免应用程序在后台被杀死，并防止系统恢复电池优化设置。
然而，这并非100%。您可能需要每隔一段时间检查系统设置。请参阅&lt;a class="link" href="https://forums.oneplus.com/threads/in-battery-optimisation-apps-are-getting-automatically-switched-from-not-optimised-to-optimised.849162/" target="_blank" rel="noopener"
&gt;提交给一加的错误报告&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置&lt;strong&gt;设置&amp;gt;电池&amp;gt;电池优化&amp;gt;切换到右上角菜单中的 &amp;ldquo;所有应用&amp;rdquo;&amp;gt;需要操作的应用&lt;/strong&gt;为“&lt;strong&gt;不优化&lt;/strong&gt;”。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：有网友表示，在一加及更早的版本的手机中，需要在开发者选项中禁用Doze模式。&lt;/p&gt;
&lt;p&gt;（译者注：这两种方法目测是等效的，为二选一关系）&lt;/p&gt;
&lt;h3 id="应用自启动"&gt;应用自启动
&lt;/h3&gt;&lt;p&gt;在一些一加手机上，应用程序自动启动基本上阻止了应用程序在后台工作，请为您的应用程序禁用它。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/07/19/ORNBSqeG6HKadV9.jpg"
loading="lazy"
alt="ss_oneplus_1.jpg"
&gt;&lt;/p&gt;
&lt;h3 id="高级优化"&gt;高级优化
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;一加6和之后的手机：
选择&lt;strong&gt;设置&amp;gt;电池&amp;gt;电池优化&amp;gt;更多（三个点）&amp;gt; 高级优化&lt;/strong&gt;
你会在那里看到两个选项。这两个选项都是默认启用的。
深度优化（译者注：新版应该叫智能电池管理）
这是主要的应用杀手，如果你需要任何应用程序在后台运行，请禁用它。
睡眠待机优化
一加手机试图学习你通常在什么时候睡觉，在这些时间里，它就会禁用手机的网络连接。这个设置会阻止推送通知的发送。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/07/19/7zQfsauGBMUjIHd.jpg"
loading="lazy"
alt="ss_oneplus6_setting_sleepstandby.jpg"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一加6之前的手机：
关闭&lt;strong&gt;设置&amp;gt;电池&amp;gt;电池优化&amp;gt;（三个点）&amp;gt;增强优化&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：这应该有助于解决您失去与智能手表/健身追踪器的蓝牙连接的问题（例如用于睡眠跟踪）。&lt;/p&gt;
&lt;h3 id="近期的应用程序清理行为"&gt;近期的应用程序清理行为
&lt;/h3&gt;&lt;p&gt;一般情况下，当你滑动清除一个应用，它是不会关闭的。Android系统自己就能很好地处理这个问题。然而在一加手机上，这可能以不同的方式工作。最近的应用清除行为管理器可能会设置成杀死滑动清除的应用。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/07/19/cMSf9ALVetz3siv.jpg"
loading="lazy"
alt="ss_oneplus_2a.jpg"
&gt;&lt;/p&gt;
&lt;h2 id="为开发者准备的解决方案"&gt;为开发者准备的解决方案
&lt;/h2&gt;&lt;p&gt;暂无&lt;/p&gt;
&lt;h2 id="了解更多"&gt;了解更多
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://oneplus.gadgethacks.com/how-to/disable-setting-if-notifications-are-delayed-your-oneplus-0192639/" target="_blank" rel="noopener"
&gt;Gadgethacks: Disable This Setting if Notifications Are Delayed on Your OnePlus&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="徽章"&gt;徽章
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.loli.net/2020/07/19/IHB5tkvxnC4W9h3.png"
loading="lazy"
alt="Snipaste_2020-07-19_15-07-45.png"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;译者后记
一加的后台策略充满了与国内各大厂随地拉屎唤醒做斗争的辛酸，但也充斥着随便杀一下后台的不讲究。对于老外来说如此严格的后台管理策略是无法理解的，但对于国内的用户来说还是两难的选择，要不是大家都在用微信，谁还给垃圾腾讯机会呢？&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>为何2020年我们更需要RSS</title><link>https://takuron.com/post/id0020/</link><pubDate>Fri, 22 May 2020 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0020/</guid><description>&lt;img src="https://i.loli.net/2020/05/22/juMSAxE1ZdPtg7i.jpg" alt="Featured image of post 为何2020年我们更需要RSS" /&gt;&lt;p&gt;以今天的标准来看，1997年互联网上的信息获取是十分低效的。搜索引擎刚刚起步，网站数目少，甚至在网上发布信息的人都寥寥无几，且当年的信息传递方法绝大多数已经被淘汰。而身处2020年的我们，为什么比以前更需要来自上个世纪的RSS了呢？&lt;/p&gt;
&lt;h2 id="主流信息获取的问题"&gt;主流信息获取的问题
&lt;/h2&gt;&lt;p&gt;说到信息获取，很多人首先会想到网页。的确现代网页能够完成对各种信息的精确表达，但人们会忽视一个关键点，那就是&lt;strong&gt;在信息爆炸的时代，我们更需要将自己有限的时间留给获取信息本身&lt;/strong&gt;，而这在2020年的网页里面，在很多时候，我们仍然做不到：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/05/22/Cp18K5H9eshiumF.jpg"
loading="lazy"
alt="Snipaste_2020-05-22_11-39-38-jpg.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;是的，他们不仅是添加广告，他们还会用要素过多的页面元素来影响你信息的获取，你需要拨开层层遮罩才能看到你需要的信息。如果你使用的是手机，那么恭喜你，你可能连网页都打不开，因为.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/05/22/MjiurcRlSeX1B4J.jpg"
loading="lazy"
alt="photo_2020-05-22_18-14-30.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;然后就是：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/05/22/BbJusGERrPqQanU.jpg"
loading="lazy"
alt="photo_2020-05-22_18-16-58.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;流量至上的时代，每个平台都试图在圈地运动中试图把用户困在自己的小圈子里面，像填鸭一样推送着自己想让用户知道的信息，并且&lt;strong&gt;这些信息就和骚扰电话一样是主动式的&lt;/strong&gt;，处理信息变成了被信息“填鸭”是现在许多互联网用户的悲哀。&lt;/p&gt;
&lt;p&gt;这也引申出第二个问题，在APP里面浏览会留下记录。在经过分析和在各个应用肮脏的py交易中随意交易后我们的隐私荡然无存，最后变成让人可怕的服务推荐。就我个人而言，我希望保持“高冷”，&lt;strong&gt;不希望在我的信息浏览中留下任何关于我的喜好的信息交给互联网公司随意分析&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;最后，目前的推送系统大多数是“正反馈”的：用户喜欢看什么、就给用户推送什么以此一步步给用户打上标签。但我们常说兼听则明和忠言逆耳，&lt;strong&gt;真正客观的信息难以从讨好你的推荐算法中获取&lt;/strong&gt;，这也一定程度上促进了目前互联网ETC横飞，网络战争日日不休。&lt;/p&gt;
&lt;h2 id="rss的优势"&gt;RSS的优势
&lt;/h2&gt;&lt;p&gt;RSS(Really Simple Syndication)是一种描述和同步网站内容的格式，是使用最广泛的XML应用。简单来说就是：将信息以约定的格式传递给用户，然后用户通过其他软件解析并且阅读。除了最简单的排版格式以外几乎没有其他内容的RSS在10年前都会被称为鸡肋，但现在看来，它一口气解决了几乎所有上述痛点。&lt;/p&gt;
&lt;p&gt;首先由于只有基本的排版元素，所以实际呈现给用户的内容基本靠第三方软件完成解析，并且一个合适的第三方软件可以简明高效的显示多个来源的信息而不必看乱七八糟的广告和适应各个网页的排版，&lt;strong&gt;让你不必在乎网页和APP的差异而关注信息本身&lt;/strong&gt;。另外由于你的信息是一次性拉取的，网站无法得到你的阅读反馈，自然也就&lt;strong&gt;无法对你关注的点进行分析&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;而且大多数网站的RSS都是提供的首页订阅，也就是仅仅按照热度和时间顺序给你推送，任何人都会拿到一模一样的信息，&lt;strong&gt;你得到的信息更加客观而不会局限于你的偏好导致的推荐信息失真&lt;/strong&gt;。最后，除了一些设置自动更新的软件会主动推送外，&lt;strong&gt;一般情况下RSS的刷新是被动的&lt;/strong&gt;，也就是说是你阅读的信息而不是信息让你阅读，这才是一种良性的信息获取。&lt;/p&gt;
&lt;p&gt;有人要说了，如果我希望得到一些个性的的信息呢？一些第三方平台例如Inoreader可以提供订阅源的筛选服务，可以按照你规定的规则对信息进行初筛，提高你的信息获取效率。&lt;/p&gt;
&lt;h2 id="那你能帮帮我吗"&gt;那你能帮帮我吗？
&lt;/h2&gt;&lt;p&gt;这里推荐&lt;a class="link" href="https://sspai.com/post/56391" target="_blank" rel="noopener"
&gt;高效获取信息，你需要这份 RSS 入门指南——少数派&lt;/a&gt;，里面基本涵盖了通过接入服务来阅读RSS的方法，不过个人更喜欢脱离具体平台的本地软件，所以我推荐Windows平台的&lt;a class="link" href="https://quiterss.org/" target="_blank" rel="noopener"
&gt;QuiteRSS&lt;/a&gt;和Android上的&lt;a class="link" href="https://www.coolapk.com/apk/com.blend.rolly" target="_blank" rel="noopener"
&gt;Rolly RSS Reader&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/05/22/jEHheQqSo9rvwlN.png"
loading="lazy"
alt="Snipaste_2020-05-22_19-10-02.png"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/05/22/wopH1XE354cPfRU.jpg"
loading="lazy"
alt="photo_2020-05-22_19-15-34.jpg"
&gt;&lt;/p&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;RSS会不会复兴？即使是很多资深的订阅者也看衰RSS的前途，缺少更多的多媒体呈现方式和不够智能化和集中化的订阅方式的确不再适合当前的互联网环境，如果问我，我也不会认为这种东西将会成为主流。那么为何我仍然会选择这种方式？&lt;strong&gt;因为在面对觊觎我个人喜好和把各种网络服务打成大礼包一股脑地砸在我头上的无良互联网公司，只有使用这种原始化的信息获取方式才能保留作为用户的尊严。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PS：本站已经支持&lt;a class="link" href="https://takuron.top/feed.xml" target="_blank" rel="noopener"
&gt;RSS订阅&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>以最简单的方式改进自己电脑的DNS</title><link>https://takuron.com/post/id0019/</link><pubDate>Sun, 10 May 2020 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0019/</guid><description>&lt;img src="https://i.loli.net/2020/05/10/VnFD2HCmewfQuY4.jpg" alt="Featured image of post 以最简单的方式改进自己电脑的DNS" /&gt;&lt;p&gt;以今天的标准来看，1997年互联网上的信息获取是十分低效的。搜索引擎刚刚起步，网站数目少，甚至在网上发布信息的人都寥寥无几，且当年的信息传递方法绝大多数已经被淘汰。而身处2020年的我们，为什么比以前更需要来自上个世纪的RSS了呢？&lt;/p&gt;
&lt;h3 id="主流信息获取的问题"&gt;主流信息获取的问题
&lt;/h3&gt;&lt;p&gt;说到信息获取，很多人首先会想到网页。的确现代网页能够完成对各种信息的精确表达，但人们会忽视一个关键点，那就是&lt;strong&gt;在信息爆炸的时代，我们更需要将自己有限的时间留给获取信息本身&lt;/strong&gt;，而这在2020年的网页里面，在很多时候，我们仍然做不到：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/05/22/Cp18K5H9eshiumF.jpg"
loading="lazy"
alt="Snipaste_2020-05-22_11-39-38-jpg.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;是的，他们不仅是添加广告，他们还会用要素过多的页面元素来影响你信息的获取，你需要拨开层层遮罩才能看到你需要的信息。如果你使用的是手机，那么恭喜你，你可能连网页都打不开，因为.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/05/22/MjiurcRlSeX1B4J.jpg"
loading="lazy"
alt="photo_2020-05-22_18-14-30.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;然后就是：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/05/22/BbJusGERrPqQanU.jpg"
loading="lazy"
alt="photo_2020-05-22_18-16-58.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;流量至上的时代，每个平台都试图在圈地运动中试图把用户困在自己的小圈子里面，像填鸭一样推送着自己想让用户知道的信息，并且&lt;strong&gt;这些信息就和骚扰电话一样是主动式的&lt;/strong&gt;，处理信息变成了被信息“填鸭”是现在许多互联网用户的悲哀。&lt;/p&gt;
&lt;p&gt;这也引申出第二个问题，在APP里面浏览会留下记录。在经过分析和在各个应用肮脏的py交易中随意交易后我们的隐私荡然无存，最后变成让人可怕的服务推荐。就我个人而言，我希望保持“高冷”，&lt;strong&gt;不希望在我的信息浏览中留下任何关于我的喜好的信息交给互联网公司随意分析&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;最后，目前的推送系统大多数是“正反馈”的：用户喜欢看什么、就给用户推送什么以此一步步给用户打上标签。但我们常说兼听则明和忠言逆耳，&lt;strong&gt;真正客观的信息难以从讨好你的推荐算法中获取&lt;/strong&gt;，这也一定程度上促进了目前互联网ETC横飞，网络战争日日不休。&lt;/p&gt;
&lt;h3 id="rss的优势"&gt;RSS的优势
&lt;/h3&gt;&lt;p&gt;RSS(Really Simple Syndication)是一种描述和同步网站内容的格式，是使用最广泛的XML应用。简单来说就是：将信息以约定的格式传递给用户，然后用户通过其他软件解析并且阅读。除了最简单的排版格式以外几乎没有其他内容的RSS在10年前都会被称为鸡肋，但现在看来，它一口气解决了几乎所有上述痛点。&lt;/p&gt;
&lt;p&gt;首先由于只有基本的排版元素，所以实际呈现给用户的内容基本靠第三方软件完成解析，并且一个合适的第三方软件可以简明高效的显示多个来源的信息而不必看乱七八糟的广告和适应各个网页的排版，&lt;strong&gt;让你不必在乎网页和APP的差异而关注信息本身&lt;/strong&gt;。另外由于你的信息是一次性拉取的，网站无法得到你的阅读反馈，自然也就&lt;strong&gt;无法对你关注的点进行分析&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;而且大多数网站的RSS都是提供的首页订阅，也就是仅仅按照热度和时间顺序给你推送，任何人都会拿到一模一样的信息，&lt;strong&gt;你得到的信息更加客观而不会局限于你的偏好导致的推荐信息失真&lt;/strong&gt;。最后，除了一些设置自动更新的软件会主动推送外，&lt;strong&gt;一般情况下RSS的刷新是被动的&lt;/strong&gt;，也就是说是你阅读的信息而不是信息让你阅读，这才是一种良性的信息获取。&lt;/p&gt;
&lt;p&gt;有人要说了，如果我希望得到一些个性的的信息呢？一些第三方平台例如Inoreader可以提供订阅源的筛选服务，可以按照你规定的规则对信息进行初筛，提高你的信息获取效率。&lt;/p&gt;
&lt;h3 id="那你能帮帮我吗"&gt;那你能帮帮我吗？
&lt;/h3&gt;&lt;p&gt;这里推荐&lt;a class="link" href="https://sspai.com/post/56391" target="_blank" rel="noopener"
&gt;高效获取信息，你需要这份 RSS 入门指南——少数派&lt;/a&gt;，里面基本涵盖了通过接入服务来阅读RSS的方法，不过个人更喜欢脱离具体平台的本地软件，所以我推荐Windows平台的&lt;a class="link" href="https://quiterss.org/" target="_blank" rel="noopener"
&gt;QuiteRSS&lt;/a&gt;和Android上的&lt;a class="link" href="https://www.coolapk.com/apk/com.blend.rolly" target="_blank" rel="noopener"
&gt;Rolly RSS Reader&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/05/22/jEHheQqSo9rvwlN.png"
loading="lazy"
alt="Snipaste_2020-05-22_19-10-02.png"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/05/22/wopH1XE354cPfRU.jpg"
loading="lazy"
alt="photo_2020-05-22_19-15-34.jpg"
&gt;&lt;/p&gt;
&lt;h3 id="总结"&gt;总结
&lt;/h3&gt;&lt;p&gt;RSS会不会复兴？即使是很多资深的订阅者也看衰RSS的前途，缺少更多的多媒体呈现方式和不够智能化和集中化的订阅方式的确不再适合当前的互联网环境，如果问我，我也不会认为这种东西将会成为主流。那么为何我仍然会选择这种方式？&lt;strong&gt;因为在面对觊觎我个人喜好和把各种网络服务打成大礼包一股脑地砸在我头上的无良互联网公司，只有使用这种原始化的信息获取方式才能保留作为用户的尊严。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PS：本站已经支持&lt;a class="link" href="https://takuron.top/feed.xml" target="_blank" rel="noopener"
&gt;RSS订阅&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>一加8个人使用体验——失望后的惊喜</title><link>https://takuron.com/post/id0018/</link><pubDate>Tue, 21 Apr 2020 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0018/</guid><description>&lt;img src="https://i.loli.net/2020/04/21/5x4zFNDm6cTq91P.jpg" alt="Featured image of post 一加8个人使用体验——失望后的惊喜" /&gt;&lt;p&gt;由于个人的小5实在是小毛病太多了，钉的人实在是体验不佳，于是决定上半年更换手机。本来由于这两年小5给我带来了极好的使用体验使得本人非常期待一加的压轴，打平即可出线，奥力……&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/04/21/CxWqHGAsj2oO81S.jpg"
loading="lazy"
alt="对比.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;小米10，NB……&lt;/p&gt;
&lt;p&gt;然后就陷入了深深的纠结，为了硬件牺牲系统和为了系统牺牲硬件两难之下，选择了让我倍感舒畅的系统。但在这一段时间已经对一加感到深深的的失望，虽说可以感知不强自我安慰，但没有就是没有，不香就是不香。&lt;/p&gt;
&lt;p&gt;不过当手机实际到手的时候却给我带来了意外的惊喜，首先是这个配色，在线图是这个样子的：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/04/21/ngqQ9cfm5zIsVi7.jpg"
loading="lazy"
alt="d80cb22fdb0f9d2c.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;说实话一开始没觉得这个绿不拉几的东西真没什么好感，只能说比默认的纯黑看上去更活泼而已，但当我真的拿起这个机器的时候就明白了什么叫以实物为准：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/04/21/Qj42t7hHqVlzDo8.jpg"
loading="lazy"
alt="photo_2020-04-21_21-08-50.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;实际上的手机更像是一种浅蓝，随着光线变化会变成完全的天蓝色，除非像标准的看量筒一样的方法看它，否则根本看不出在正视下手机地绿。磨砂玻璃材质的处理效果有一种层次感，像极了在正午下的浅水。小米10个人也在门店体验过，不能说难看，但其略带迷惑的配色，真的感觉缺少这种统一的美感，相比之下高下立判。可以说一加真正做到了“旗舰不用冲”，在价格相对良心的同时代代审美在线，这点还是希望年轻化的粗粮企业学习一下。&lt;/p&gt;
&lt;p&gt;再就是对今年旗舰来说不是新鲜事但对本钉子户来说非常舒心的体验：本来专属于睾贵的星星星的曲面屏已经飞入寻常百姓家，虽然有的时候的确会导致操作灵敏度低，但的确提升了操作体验，真正做到了“全屏操作都跟手”。90hz外加调教不差的氢氧OS的确是全新的体验，狠狠的打了我这个“笔记本是144hz高刷无感”的人的脸（LCD出来背锅）。双扬+杜比音效使得手机的观影体验得到了巨大的提升，都快让我忘掉了应该使用耳机这件事。（可惜一加并不”极其先进“，我想要耳机孔啊&amp;hellip;&amp;hellip;）可以说，钉子户虽然再战十年，但早拆迁早享受啊。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/04/21/vf5h64aMtAn3JKm.jpg"
loading="lazy"
alt="photo_2020-04-21_22-42-10.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;至于缺点，当然也不是没有：没有耳机孔，即使努力做小了依然丑的挖孔摄像头，仅仅是够用的30w快充。外加上参数党喜欢的lpddr5，无线快充，只能说8和真香机完全无缘。&lt;/p&gt;
&lt;p&gt;但是这里我想说说系统的问题，虽然我同意这是个仁者见仁智者见智的问题，但我一定要说：我不管你们怎么说，我觉得氧OS就是真香。目前处在没有解锁的状态，只是利用应用”冰箱“的设备管理员模式的授权我就一次性解决了后台应用管理、更隐秘的权限管理和静默安装三大痛点。外加一加对刷机的”放权“：可以自由解锁并且刷机保修。你当然可以说MIUI可以关广告，可以解bl。但小米已经是一个大众品牌了，高度定制的系统和bl解锁申请并不会阻挡极客，但白纸系统+自由解锁才能真正的体现”自己动手创造和定制“的极客精神。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/04/21/o9SyWsGidCIUAx5.jpg"
loading="lazy"
alt="photo_2020-04-21_22-42-12.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;总结来说，一加8香吗？&lt;strong&gt;不香&lt;/strong&gt;。一般人适合买吗？&lt;strong&gt;不太适合&lt;/strong&gt;。但我为什么要买呢？&lt;strong&gt;它做成了我心目中的”梦幻之作“&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;图片来自网络，如有侵权请联系本人删除。&lt;/p&gt;</description></item><item><title>记一次web工具制作：重制版与佛论禅</title><link>https://takuron.com/post/id0017/</link><pubDate>Thu, 09 Apr 2020 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0017/</guid><description>&lt;img src="https://i.loli.net/2020/04/09/C2HvEoy8lYzATPW.jpg" alt="Featured image of post 记一次web工具制作：重制版与佛论禅" /&gt;&lt;p&gt;不知道该做点什么，突然有人向我反馈我以前写的加密应用不兼容Android10，想想觉得，干脆为大家重制一款用来加密的工具吧，毕竟老的也是我三小时作品。&lt;/p&gt;
&lt;p&gt;为此我盯上了&lt;a class="link" href="http://www.keyfc.net/bbs/tools/tudoucode.aspx" target="_blank" rel="noopener"
&gt;与佛论禅&lt;/a&gt;，这是一个很老的网页，里面是专门为老司机发链接而设计的一套混淆系统：利用一些生僻字来代指一些编码，从而达到混淆的目的。实现原理很简单，只要把某种混淆算法的结果的每一个字符对应一个生僻字就能实现。而且，不一定是混淆算法，同样的原理也可以用在加密算法上，脚踩两&amp;hellip;一石二鸟，就这么愉快的开干了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/04/09/KREvGg6IrqzZuTh.png"
loading="lazy"
alt="Snipaste_2020-04-09_22-06-46.png"
&gt;&lt;/p&gt;
&lt;p&gt;加密部分不用我们再造轮子，&lt;a class="link" href="https://github.com/brix/crypto-js" target="_blank" rel="noopener"
&gt;crypto-js&lt;/a&gt;可以实现现在所有常见的加密算法，为此我可以直接选择了比较好用的AES加密算法，首先遇到的难题是：将AES加密的文本进行对应，作为著名懒狗，当然不会做那种一个个写对应文本的工作啊（况且我的语文水平还不够），然后，我在GitHub发现了宝藏：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/04/09/QhjE5apUMmFeyNX.png"
loading="lazy"
alt="Snipaste_2020-04-09_22-32-55.png"
&gt;&lt;/p&gt;
&lt;p&gt;感谢&lt;a class="link" href="https://github.com/Kwansy98/yufolunchan/blob/master/src/buddhism/TruthTable.java" target="_blank" rel="noopener"
&gt;这位老哥的对照表&lt;/a&gt;，而且这位老哥的实现思路貌似和我一致，可惜是一个命令行的Java程序&amp;hellip;&lt;/p&gt;
&lt;p&gt;随后就是界面，虽然bootstrap过气了，4.0的栅格布局还默认为手机尺寸上手有点难受。但难看不代表难用，神奇的使用Dreamweaver完成了一次网页设计，反正来的快吗…&lt;/p&gt;
&lt;p&gt;最后就是有意思的部分来了，作为一个混子，我还没学到加密算法原理的部分（讲了估计也不会认真听，纯理论这么枯燥我是难以静心学的），但在加密的生产实践中发现了规律：所有以ASE加密算法计算出的结果均以&lt;code&gt;U2FsdGVkX1&lt;/code&gt;开头，很多网站都给出了类似说明，但均没有给予证明，&lt;strong&gt;希望大佬可以给与证明或者指出错误&lt;/strong&gt;。不过为了佛语的随机性，一个开头相同的佛语很影响效率，所以本人砍掉了开头，目前为止，没有无法解密的文本。&lt;/p&gt;
&lt;p&gt;另外，事后才知道ASE可以不需要密码。但当时为了统一性，本人为Web端设置了默认密码&lt;code&gt;TakuronDotTop&lt;/code&gt;，这样在不需要加密仅需要混淆的情况下，可以直接将密码栏留空完成操作。&lt;/p&gt;
&lt;p&gt;成品如下图所示，&lt;a class="link" href="https://takuron-tool.gitee.io/talk-with-buddha/" target="_blank" rel="noopener"
&gt;国内版网页&lt;/a&gt;，&lt;a class="link" href="https://takuron-tool.github.io/talk-with-buddha/" target="_blank" rel="noopener"
&gt;国际版网页&lt;/a&gt;，源代码在&lt;a class="link" href="https://github.com/takuron/talk-with-buddha" target="_blank" rel="noopener"
&gt;github开源&lt;/a&gt;，基于MIT开源协议，欢迎Fork和Star。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/04/09/u7J8ImLTUxdzjFP.png"
loading="lazy"
alt="Snipaste_2020-04-09_22-52-50.png"
&gt;&lt;/p&gt;</description></item><item><title>OBS Studio在笔记本上黑屏问题的解决方案</title><link>https://takuron.com/post/id0016/</link><pubDate>Mon, 16 Mar 2020 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0016/</guid><description>&lt;img src="https://i.loli.net/2020/03/16/yH2f5qGeKJML3Wc.jpg" alt="Featured image of post OBS Studio在笔记本上黑屏问题的解决方案" /&gt;&lt;p&gt;众所周知，笔记本为了兼顾续航采用与传统台式PC不同的显卡使用模式，其中Optimus的确是某种意义上提升了笔记本的续航，但随之而来的就是OBS捕捉不到屏幕画面而彻底黑屏，所以根据Optimus的原理，我们要让OBS强制运行在核显上。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/03/16/5O1dyXYD2qTJMFP.jpg"
loading="lazy"
alt="session-attachment-2020-03-16-085157.jpeg"
&gt;&lt;/p&gt;
&lt;h2 id="显卡设置中设置强制集成显卡"&gt;显卡设置中设置强制集成显卡
&lt;/h2&gt;&lt;p&gt;以N卡为例，在右下角托盘找到Nvidia图标，然后显卡驱动中找到管理3D设置-程序设置，添加OBS进来后将其的模式改为集成显卡。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/03/16/Wen52kqViEShBHO.png"
loading="lazy"
alt="Snipaste_2020-03-16_08-29-06.png"
&gt;&lt;/p&gt;
&lt;h2 id="在windows系统设置里面将obs设置成节能"&gt;在Windows系统设置里面将OBS设置成“节能”
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;这是Win10 1903新出的设置&lt;/strong&gt;，在设置-显示里面寻找图形设置，选择经典应用，添加OBS Studio并将其设置为“节能”，亲测不开这个选项仍然会导致黑屏并且难以直接用核显打开OBS。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/03/16/3qi591mcAGCjv2b.png"
loading="lazy"
alt="Snipaste_2020-03-16_08-28-08.png"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/03/16/isptSqgCBLeX261.png"
loading="lazy"
alt="Snipaste_2020-03-16_08-28-25.png"
&gt;&lt;/p&gt;
&lt;h2 id="更新到最新版的obs"&gt;更新到最新版的OBS
&lt;/h2&gt;&lt;p&gt;亲测，OBS最新版完美兼容win10 1909，不需要开启兼容模式，所以建议大家直接去&lt;a class="link" href="https://obsproject.com/" target="_blank" rel="noopener"
&gt;官网&lt;/a&gt; 下载最新版应用来使用。&lt;/p&gt;
&lt;p&gt;以上设置后OBS的黑屏问题应该已经解决（主要是网上的教程都没写第二步所以拿来水一下下）&lt;/p&gt;</description></item><item><title>安装Matrix系统（Riot.im）的服务端Synapse</title><link>https://takuron.com/post/id0015/</link><pubDate>Sun, 09 Feb 2020 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0015/</guid><description>&lt;img src="https://i.loli.net/2020/02/09/D9VJIRu8ioxEtls.png" alt="Featured image of post 安装Matrix系统（Riot.im）的服务端Synapse" /&gt;&lt;blockquote&gt;
&lt;p&gt;第四十条　中华人民共和国公民的通信自由和通信秘密受法律的保护。
——《中华人民共和国宪法》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最近微信QQ封的越来越多了……真要说喜欢在网上胡说八道的封了就封了吧，我室友讨论了一晚上高数问题第二天QQ就被封了，这个老好人说他乱发表言论我都不信，更别说他自己都不知道为啥……所以一个真正自有可控的聊天软件已经成为了一个需求。无意中了解到了&lt;a class="link" href="https://matrix.org/" target="_blank" rel="noopener"
&gt;Matrix&lt;/a&gt;系统，可以利用自有VPS安装服务端软件Synapse实现个人聊天服务器并通过多端的客户端软件连接，并且设置后可以以服务器作为代理连接所有Matrix服务器，反正已经有了一个网站服务器，就顺道玩玩吧。
可是这个安装真的是……一言难尽。在我的研究之下也没完全弄明白基于系统的安装方法，而基于pip的安装又各种问题……这里记录一下我基于系统软件安装的实现方法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本人才疏学浅，欢迎各位用过的大佬提出更好的方案，指正本人的错误。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="环境"&gt;环境
&lt;/h2&gt;&lt;p&gt;Debian 9 ；已安装宝塔和Oneindex；在Root用户下进行操作。&lt;/p&gt;
&lt;h2 id="安装synapse"&gt;安装Synapse
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/matrix-org/synapse/" target="_blank" rel="noopener"
&gt;Synapse&lt;/a&gt;是Matrix官方做的示例服务端，也是现在最推荐的客户端，这是官方的&lt;a class="link" href="https://github.com/matrix-org/synapse/blob/master/INSTALL.md" target="_blank" rel="noopener"
&gt;安装文档&lt;/a&gt;，两种方法写的很凌乱……这里我以Debian为例写一下大概的步骤。&lt;/p&gt;
&lt;h3 id="1安装python环境"&gt;1.安装Python环境
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;essential&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libffi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setuptools&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libssl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;virtualenv&lt;/span&gt; &lt;span class="n"&gt;libjpeg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libxslt1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2安装synapse软件"&gt;2.安装Synapse软件
&lt;/h3&gt;&lt;p&gt;根据官方推荐，这里添加了Matrix的安装源来安装最新版的Matrix。以下指令建议一个个录入来确保都能正确执行。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install -y lsb-release wget apt-transport-https
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#34;deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main&amp;#34; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tee /etc/apt/sources.list.d/matrix-org.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install matrix-synapse-py3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;中间会提示以下两个界面，第一个问你服务器名称瞎写把，反正你不用这个服务器（下面会说），另一个问你是否愿意帮助他们，我们这么热心善良当然选否啊（滑稽）&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/09/95m7fPjerTa8Xis.png"
loading="lazy"
alt="微信图片_20200209122736.png"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/09/5k9nhGRHMVAyz8o.png"
loading="lazy"
alt="微信图片_20200209122743.png"
&gt;&lt;/p&gt;
&lt;p&gt;安装好之后会自动运行服务器，如果是本机就可以访问&lt;code&gt;http://localhost:8008&lt;/code&gt;来检查软件是否安装好了，vps吗……待会儿再说。&lt;/p&gt;
&lt;h2 id="配置synapse"&gt;配置Synapse
&lt;/h2&gt;&lt;p&gt;我虽然知道这样安装之后会在&lt;code&gt;/etc/matrix-synapse/homeserver.yaml&lt;/code&gt;生成配置文件，但我根本无法用官方文档里面的方法关闭这个服务器，更别提更新配置文件了。而且不更新配置文件的这玩意&lt;strong&gt;不是不好用，是没法用&lt;/strong&gt;！所以我用了个技巧绕过了官方的服务器。如果谁知道这种方法安装的服务器怎么操作请务必告诉我。&lt;/p&gt;
&lt;h3 id="为新的服务器文件创建文件夹"&gt;为新的服务器文件创建文件夹
&lt;/h3&gt;&lt;p&gt;这里可以按照自己喜好来操作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir synapse
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd synapse
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /root/synapse/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="创建一套配置文件"&gt;创建一套配置文件
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/opt/venvs/matrix-synapse/bin/python -B -m synapse.app.homeserver -c homeserver.yaml --generate-config --server-name=takuron.top --report-stats=no
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中server-name按照官方要求是需要填写自己的域名的，这样才能正确的接入Matrix网络。不过如果是个人服务器的话其实可以随意写，第四个不知道是什么貌似也和接入Matrix网络有关，选no就好。&lt;/p&gt;
&lt;p&gt;这会儿就可以启动服务器了，但在此之前需要一些配置。&lt;/p&gt;
&lt;h3 id="必须的配置"&gt;必须的配置
&lt;/h3&gt;&lt;p&gt;打开主配置文件&lt;code&gt;homeserver.yaml&lt;/code&gt;，首先在207行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#line 207-215
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - port: 8009
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tls: false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; type: http
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; x_forwarded: true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bind_addresses: [&amp;#39;::1&amp;#39;, &amp;#39;127.0.0.1&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; resources:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - names: [client, federation]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; compress: false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;将端口改成8008以外的数，因为我们还没能成功关掉自带的服务器，这里曲线救国再建一个不同端口的服务器（反正默认都只能本地访问）&lt;/p&gt;
&lt;p&gt;然后在862行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enable_registration: true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;开启注册（如果私有服务器，&lt;strong&gt;回头记着关&lt;/strong&gt;，我是懒得一个个添加账号的，不如组织注册完后关掉注册）&lt;/p&gt;
&lt;p&gt;然后在对应目录执行指令，启动服务器，我们的服务器就建立起来了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;synctl start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="可选的配置"&gt;可选的配置
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/09/6xgOVHXv7aZIiw2.jpg"
loading="lazy"
alt="19125154.png"
&gt;&lt;/p&gt;
&lt;h2 id="配置反向代理"&gt;配置反向代理
&lt;/h2&gt;&lt;p&gt;你会发现，上一步建立的服务器是没办法直接用ip+端口打开的，因为官方默认建立的就是本地服务器，虽然有直接把服务器暴露给网络的设置，但我们可以使用反向代理的方法，像网站一样管理服务器。这不是我的小聪明，这是官方推荐的做法，如果你没有宝塔，你可以按照&lt;a class="link" href="https://github.com/matrix-org/synapse/blob/master/docs/reverse_proxy.md" target="_blank" rel="noopener"
&gt;官方文档&lt;/a&gt;来用普通的网站软件来解决问题，&lt;strong&gt;记得把默认的8008端口改成你的端口&lt;/strong&gt;。这里我简单写写宝塔的配置方法。&lt;/p&gt;
&lt;p&gt;新建一个网站，纯静态就可以，绑定好域名然后找网页设置-反向代理，按照底下图片的设置就好了，&lt;strong&gt;记得修改端口为你自己的端口&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/09/rQy6hfd4KsTPIWp.png"
loading="lazy"
alt="微信图片_20200209122759.png"
&gt;&lt;/p&gt;
&lt;p&gt;提交，看看外网访问是不是这个界面：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/09/KhWSLTrwGBlvMPd.png"
loading="lazy"
alt="390c7801fe180399277fbbbc22db44c6.png"
&gt;&lt;/p&gt;
&lt;p&gt;是的话大功告成。&lt;/p&gt;
&lt;h2 id="客户端连接"&gt;客户端连接
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;客户端足够多是我选择Matrix的重要原因&lt;/strong&gt;，这里有&lt;a class="link" href="https://matrix.org/clients/" target="_blank" rel="noopener"
&gt;可供连接的客户端的列表&lt;/a&gt;，个人觉得其中&lt;a class="link" href="https://about.riot.im/" target="_blank" rel="noopener"
&gt;Riot.im&lt;/a&gt;的客户端都已足够优秀并且支持足够多的平台，随便下载一个，将服务器设置为你的域名对应的网址（开TSL记得用https），然后就可以开始私有聊天了。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;软件写得好，不如软件文档写得好。
——鲁迅&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;软件文档引发的惨案……软件是好东西但文档真的人类迷惑搞得我转了半天在研究出这个不是方法的方法。不过有一说一，一整天解决了我和小伙伴的通信隐私问题，也算是目前情况下的一种收获吧。愿自由技术永远引导人类发展。&lt;/p&gt;</description></item><item><title>9102年末的个人文件的管理</title><link>https://takuron.com/post/id0014/</link><pubDate>Wed, 25 Dec 2019 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0014/</guid><description>&lt;img src="https://i.loli.net/2020/02/07/ZIndB7rYHxcJEP5.png" alt="Featured image of post 9102年末的个人文件的管理" /&gt;&lt;p&gt;&lt;strong&gt;本人一纯正薅羊毛党，以下内容会涉及一些占用各种（不属于本人的）资源的事情，精神洁癖请主动远离。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;学计算机救不了没了微信就没法传文件的人。 ——鲁迅&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;估计各位刚入大学的萌新会跟我一样，发现大学最大的麻烦就是：13事多。毕竟高考前不会有人闲的去找高三党做这做那的，但无所事事的大一新生最适合下方工作了。不过这还没完，即使在即将欢送9102年的时候，统计表格的工作在各位老师和班干部的眼里还是这么做的：&lt;/p&gt;
&lt;p&gt;“大家把表格填一下，回头微信把自己填完的私发给我。”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/07/PkUm7B4W5afrTdg.jpg"
loading="lazy"
alt="Screenshot-20191225-091439-01.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;（把全班的整理到一起估计也是逐行复制吧）&lt;/p&gt;
&lt;p&gt;扯远了，不过这的确在侧面反应出大学生的文件多，设备多，且很多人还在用上世纪的方法进行着管理（或者压根不管理）。这个时候合理的文件管理才能保证我这种人的高效（zhe）率（teng）学习和生活。&lt;/p&gt;
&lt;h2 id="文件分级"&gt;文件分级
&lt;/h2&gt;&lt;hr&gt;
&lt;p&gt;根据重要程度和私密程度进行分级，这在企业文件管理中非常重要，但是对于个人（尤其是大学生）来说就没有那种重要的感觉，毕竟接触不到什么机密。所以这里我认为&lt;strong&gt;不缺钱随便存，买够正经云空间统统往里面塞是最枯燥的&lt;/strong&gt;。不过有钱估计看到标题就不往下读了，所以我给我的文件分为三类：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;隐私有关的纯文本笔记和除了office套件使用以外的文档，一些（加密后的）密钥文件。&lt;/li&gt;
&lt;li&gt;隐私有关的图片，音频，视频。&lt;/li&gt;
&lt;li&gt;隐私无关文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这是我的分级，当然各位会比我做得好。&lt;/p&gt;
&lt;h2 id="u盘"&gt;U盘
&lt;/h2&gt;&lt;hr&gt;
&lt;p&gt;U盘虽然蠢但有用，这是相对于云端存储更可靠，相对于硬盘更便携的数据存储方案，我用的一个64g的，用来处理经常要修改的文档，并且以此为基准修改云端备份。在机房或者某些连不上网的电脑上面，你会感激你的u盘的。&lt;/p&gt;
&lt;h2 id="坚果云"&gt;坚果云
&lt;/h2&gt;&lt;hr&gt;
&lt;p&gt;这个还是要强力推荐的，webdav协议具有极大的扩展性，配上一些开放的标准（例如keepass，markdown笔记），可以实现自由的多端协作，完爆其他国产云存储十条街，比海外网盘也好不好。不过弊端也很明显：免费版的流量限制，当然这是必须的，毕竟要恰饭的吗。&lt;/p&gt;
&lt;p&gt;所以我用坚果云存储第一类文件，因为这些文件都很小（纯文本为主），不会像照片一样一旅游照片备份半个月流量没了（说的我经常旅游一样），并且访问速度足够快，不会像onenote一样抽风起来只能拜天求佛。&lt;/p&gt;
&lt;p&gt;这里我密码管理可以参考&lt;a class="link" href="https://sspai.com/post/55403" target="_blank" rel="noopener"
&gt;这篇文章&lt;/a&gt;，笔记本我用的&lt;a class="link" href="https://joplinapp.org/" target="_blank" rel="noopener"
&gt;Joplin&lt;/a&gt;，他们都可以通过坚果云完成多设备同步，方便随时查看。&lt;/p&gt;
&lt;h2 id="个人onedrive"&gt;个人Onedrive
&lt;/h2&gt;&lt;hr&gt;
&lt;p&gt;我有三个onedrive（会一个个介绍），先说个人的，这是最安全的存储区域，除了阴谋论怀疑微软，基本可以保证数据是安全可控的，可以存储一些隐私和重要资料，并且空间也是相对较大的15g（别问我多的10g哪儿来的，去淘宝买个扩容一起薅巨硬羊毛正解，这个比较靠谱）。不过缺点还是有的：还是不够用，毕竟128g的手机都能被各位塞的满满当当的。&lt;/p&gt;
&lt;p&gt;这里我主要保存个人照片（同步方式很多），还有一些比较大的非纯文本文档（例如PSD文件，也许更应该归类于图片）。&lt;/p&gt;
&lt;p&gt;电脑的话如果要上传直接用win10自带客户端同步，手机这里推荐一下&lt;a class="link" href="http://www.tacit.dk/" target="_blank" rel="noopener"
&gt;FolderSync&lt;/a&gt;，可以定时自动同步一些文件夹，可以保持文件多设备同步。&lt;/p&gt;
&lt;h2 id="学校onedrive"&gt;学校Onedrive
&lt;/h2&gt;&lt;hr&gt;
&lt;p&gt;来自一个拖各大平台平均水平的大学，学校onedrive没有管理员所以容量是1T。这个不是绝对安全的，因为学校有可能设置管理员或者收走你的学生邮箱，但是一般情况下这也算是个人空间。不过这个网盘还有个问题，为了防止过度分享，没有管理员的onedrive没法接入像上文FolderSync这样的同步软件，难以用来在设备之间同步文件，这就很头疼。我最后的解决方案是利用他做敏感数据冷备盘，定时手动加密数据压缩传进去，并且把一些学习有关的隐私数据放在里面。&lt;/p&gt;
&lt;h2 id="5t子账号的onedrive"&gt;5T子账号的Onedrive
&lt;/h2&gt;&lt;hr&gt;
&lt;p&gt;不讲具体账号类型，反正不靠谱就完事，但一般那种有管理员权限的个人开放申请的基本都不会跑路，有点良心的也不会经常看你数据，还算是长期有效。这种盘的价值就在于空间足够大，而一般占用空间的也都是一些网上可以公开下载的软件，游戏或者小姐姐。并且这是可以用FolderSync的，所以它理所应当成为了一些非重要数据的桥梁和备份，壁纸啊，视频啊，color图啊。随叫随到，多端备份。&lt;/p&gt;
&lt;p&gt;甚至可以开&lt;a class="link" href="https://res.takuron.top/" target="_blank" rel="noopener"
&gt;分享网站&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="其他的备份"&gt;其他的备份
&lt;/h2&gt;&lt;hr&gt;
&lt;p&gt;当然，有人得说了，微软跑路我不得凉凉？首先，我电脑手机分别本地都有备份，而且……&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/07/DcbBsIhJu1P3285.jpg"
loading="lazy"
alt="IMG-20191225-153328-01.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;冷盘备份了解一下。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;hr&gt;
&lt;p&gt;经过不懈的努（zhe）力（teng），现在终于做到哪儿都能找到备份文件了，251试炼能活下来了（跑）。基本上找我存过的文件可以做到在任意设备三十秒内找到，合理的文件管理会给寻找文件带来方便的同时还能边喝水边看微信找文件的同学。算是一次有成果的折腾&lt;/p&gt;</description></item><item><title>多系统环境下Windows系统更新错误的一种解决方法</title><link>https://takuron.com/post/id0013/</link><pubDate>Fri, 13 Dec 2019 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0013/</guid><description>&lt;img src="https://i.loli.net/2020/02/07/BuEFfQyZ7xJ2eRG.jpg" alt="Featured image of post 多系统环境下Windows系统更新错误的一种解决方法" /&gt;&lt;p&gt;今天在各路大佬的洗脑之下，终于决定更新一下Windows10 1909，不过我的电脑一直处于更新失败被我屏蔽更新的状态，所以我准备一上午彻底解决Windows的更新问题，然后&amp;hellip;&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;垃圾微软，菜鸡Windows，毁我青春。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先先说明一下我电脑的状态，曾经装过多系统，留有专门的一个fat32格式的引导分区，不过现在只能引导到Windows了。系统自带的更新总是在最后一刻无法完成更新并撤销，而且不打这些安全补丁是不允许大版本升级的。&lt;/p&gt;
&lt;p&gt;由于有错误代码，我一开始在怀疑我的.NET框架，而且为了安装学校的旧版SolidWorks 2010还安装过很多以前版本的.NET框架，所以就卸载了一遍重新安装，未果。清空升级缓存文件，未果。&lt;/p&gt;
&lt;p&gt;然后动起了其他主意（后来发现这个选择非常对），使用官方的升级工具升级，然后：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/07/Bkpzi4RgIMqJPdD.png"
loading="lazy"
alt="6897991-6802a8f578da9a07.png"
&gt;&lt;/p&gt;
&lt;p&gt;然后又试了其他问题，并且尝试直接使用u盘pe来覆盖Windows文件，结果反正就是官方回退更新或者难以确定。然后我看到了[这个帖子]https://tieba.baidu.com/p/5078424060?red_tag=q1629212285) .&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;首先感谢上面那位贴吧大佬，个人亲测成功的土办法就是：改成Legacy+MBR直接引导到Windows。&lt;/p&gt;
&lt;p&gt;装过多系统的各位应该都跟我一样，有一个专门的引导分区来完成多系统切换或者防止Linux的主分区过大而无法启动，但是这就带来了个问题：&lt;strong&gt;Windows无论如何都不是直接通过主板的bios打开的&lt;/strong&gt;。具体可以在搜索里面输入 msconfig 查看：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/07/5A9VnDE76rp8wMf.png"
loading="lazy"
alt="6897991-d9851dd2476d945f.png"
&gt;&lt;/p&gt;
&lt;p&gt;要是里面是空的就说明你引导有问题，而且 &lt;strong&gt;zz Windows会因此无法正常完成更新&lt;/strong&gt;，所以解决办法就是：在pe里面利用工具将分区格式改成mbr。&lt;/p&gt;
&lt;p&gt;我使用的是微pe，原帖推荐的DiskGenius是个免费版没办法转换分区，我用的另一个分区工具成功转为mbr并先默认设置c盘微启动引导，&lt;/p&gt;
&lt;p&gt;然后就可以正常使用&lt;a class="link" href="https://www.microsoft.com/zh-cn/software-download/windows10" target="_blank" rel="noopener"
&gt;微软官方win10升级工具&lt;/a&gt;升级了。&lt;/p&gt;
&lt;p&gt;有人说那我的引导分区怎么办，多系统怎么办？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;你不会再改回UEFI+GPT吗&lt;/strong&gt;，然后重建你的引导，这对给Linux分过区的你来说不难吧。&lt;/p&gt;</description></item><item><title>ACG原图搜索与放大技巧--让你看到的每张图都达到壁纸级的清晰度</title><link>https://takuron.com/post/id0012/</link><pubDate>Sun, 26 Aug 2018 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0012/</guid><description>&lt;img src="https://img.takuron.com/blogpost/6897991-bf639bc4390b912e-tuya.webp" alt="Featured image of post ACG原图搜索与放大技巧--让你看到的每张图都达到壁纸级的清晰度" /&gt;&lt;blockquote&gt;
&lt;p&gt;2025-04-27更新：修复了图片无法显示的问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PS：本来不想写这个文章的，对于搜图大佬来说以下都是火星万年的技巧，不过当我每次看到有些人拿着已经被压绿的图往自己的空间相册发&amp;hellip;&amp;hellip;求求你了学一学怎么找原图吧，好好的图被你糟蹋了。&lt;/p&gt;
&lt;p&gt;很多人（我是指喜欢ACG圈的人）很多时候都有这种经历，随便逛贴吧b站之类的网站时突然看到一张图（以下是示例）：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6897991-04bf80a652ee7581-tuya.webp"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;哇好可爱我要抱回家&amp;hellip;&amp;hellip;不对是设置为壁纸，不过很明显，这种情况下找回来的大部分都不是原图，基本都是经过二次加工后的图片当表情包使。就算是原图在贴吧等的压图下质量也会大幅度下降（贴吧压图鸭绿江了解一下，五十次重复压缩后贴吧会把图变成全绿），所以我们要的就是提高图片的清晰度。&lt;/p&gt;
&lt;h2 id="寻找原图"&gt;寻找原图
&lt;/h2&gt;&lt;p&gt;很多人上来就放大图片，这是不对的，因为放大图片毕竟是计算机自动补齐放大的像素，不如画师自己画出来的完美。还有人告诉我百度/Google搜图净是瞎出结果，的确这两者在搜索ACG图片时，它的结果并不准确，很多搜索出来的也不是原图，所以本人推荐以下两个搜索ACG原图的网站：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.iqdb.org/" target="_blank" rel="noopener"
&gt;Multi-service（iqdb）&lt;/a&gt; &lt;a class="link" href="https://saucenao.com/" target="_blank" rel="noopener"
&gt;SauceNAO&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其中前者主要搜索各大转载站，后者则主要搜索p站之类的原创站。Android手机可以使用以下使用这两个网站搜索的应用&lt;a class="link" href="https://www.coolapk.com/apk/rikka.searchbyimage" target="_blank" rel="noopener"
&gt;以图搜图&amp;ndash;酷安&lt;/a&gt;，将来源设置成对应网站可以达到同样效果。&lt;/p&gt;
&lt;p&gt;搜索结果如下：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6897991-e730ccdb7c2ee537-tuya.webp"
loading="lazy"
alt="6897991-e730ccdb7c2ee537.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6897991-a435f5d530ea8126-tuya.webp"
loading="lazy"
alt="6897991-e730ccdb7c2ee537.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;p站原图，分辨率800*570：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6897991-75ae2f6d6ac2b38c-tuya.webp"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;可以看出两个网站都精确地找到了原图，一个来自转载站一个来自p站。一般情况下，公开发布的图片在这两个网站都是搜到原图。可是这张同人图在p站分享的时候清晰度就不算特别高，即使是原图也达不到壁纸标准，那么就需要第二步：放大图片了。&lt;/p&gt;
&lt;h2 id="图片超分"&gt;图片超分
&lt;/h2&gt;&lt;p&gt;假如没有搜到原图或者第一步找到的原图依旧不满意，就需要对图片进行放大。注意，这里的放大不是简单的调整图片大小，所以这里有专门的网站对图片进行放大处理，防止出现锯齿。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://waifu2x.udp.jp/" target="_blank" rel="noopener"
&gt;waifu2x&lt;/a&gt;是专门放大ACG图片的网站，可以自动调整ACG图片避免锯齿，Android软件&lt;a class="link" href="https://www.coolapk.com/apk/com.tsukiseele.waifu2x" target="_blank" rel="noopener"
&gt;Waifu2x-图片放大&amp;ndash;酷安&lt;/a&gt;可以达到同样的效果，其原理是使用卷积神经网络对动漫风格的图片进行放大操作，也就是自动计算放大后的图片缺失像素的形状。放大的时候需要将放大倍数调整为2，以下是示例图片放大的结果（大图，流量党小心）：&lt;/p&gt;
&lt;p&gt;放大第一次，分辨率1600*1140&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6897991-86837075e7707a6b-tuya.webp"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;放大第二次，分辨率3200*2280&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6897991-bf639bc4390b912e-tuya.webp"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;可以看出两次放大后仍然看不出任何处理过的痕迹（至少我看不出），而原本分辨率不佳的图片已经清晰到足够设置为壁纸了（我反正够了，不知道有没有用4k屏的），理论上这个网站可以把任何分辨率不佳的ACG图片放大到壁纸级别，不过亲测自地三次（放大8倍）或者第四次（放大16倍）时就会出现一些处理痕迹，所以说：尽量搜索原图吧。&lt;/p&gt;
&lt;h2 id="三以图搜番"&gt;三、以图搜番
&lt;/h2&gt;&lt;p&gt;这个介绍算是附赠。嘛，假如你觉得你得到的图是来自某个动漫又不知道是什么动漫的时候这个网站就有作用了&lt;a class="link" href="https://whatanime.ga" target="_blank" rel="noopener"
&gt;whatanime&lt;/a&gt;是用来根据截图搜索对应动漫的网站，只要你的截图是动漫某一帧的截屏，它在大部分时间都能准确告诉你来源和对于集数。Android系统可以用&lt;a class="link" href="https://takuron.top/go?url=https://www.coolapk.com/apk/pw.janyo.whatanime" target="_blank" rel="noopener"
&gt;WhatAnime - 以图搜番&amp;ndash;酷安&lt;/a&gt;软件达到同样效果。&lt;/p&gt;
&lt;p&gt;以下是本人用冷番测试的结果，可以说是完美。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6897991-af2c9896d802b8e0-tuya.webp"
loading="lazy"
alt="6897991-af2c9896d802b8e0.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6897991-d527e378df5fcf39-tuya.webp"
loading="lazy"
alt="6897991-a435f5d530ea8126-tuya"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6897991-15ad8faa62e21df9-tuya.webp"
loading="lazy"
alt="6897991-15ad8faa62e21df9.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.takuron.com/blogpost/6897991-87fe8e43ccd714b2-tuya.webp"
loading="lazy"
alt="6897991-87fe8e43ccd714b2.jpg"
&gt;&lt;/p&gt;
&lt;h2 id="哦还有一件事"&gt;哦，还有一件事
&lt;/h2&gt;&lt;p&gt;各位大神转图的时候请注意版权问题，提高版权意识，&lt;strong&gt;p站转图是需要标画师和id的&lt;/strong&gt;，请尊重画师的劳动成果。&lt;/p&gt;
&lt;p&gt;本文示例图p站id&lt;a class="link" href="https://www.pixiv.net/member_illust.php?mode=medium&amp;amp;illust_id=65499784" target="_blank" rel="noopener"
&gt;65499784&lt;/a&gt;，画师&lt;a class="link" href="https://www.pixiv.net/member.php?id=4179" target="_blank" rel="noopener"
&gt;プリンプリン&lt;/a&gt;&lt;/p&gt;</description></item><item><title>cloudflare对gitlab page的加速效果</title><link>https://takuron.com/post/id0010/</link><pubDate>Fri, 06 Jul 2018 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0010/</guid><description>&lt;img src="https://i.loli.net/2020/02/07/mP7ndhTLWK4OzJX.jpg" alt="Featured image of post cloudflare对gitlab page的加速效果" /&gt;&lt;p&gt;最近了解到了国外的免费cdn加速商cloudflare，自带https比那个要备案还非要收钱才能用https的百度加速云看上去好不少，所以测试了一下加速效果。&lt;/p&gt;
&lt;p&gt;以下是本人新建的测试网页 &lt;strong&gt;（已失效）&lt;/strong&gt;，二者网页内容完全相同：&lt;/p&gt;
&lt;p&gt;[&lt;a class="link" href="https://speedtest-gitlab.zsxh.me/" target="_blank" rel="noopener"
&gt;gitlab无加速&lt;/a&gt;](&lt;a class="link" href="https://speedtest-gitlab.zsxh.me/" target="_blank" rel="noopener"
&gt;https://speedtest-gitlab.zsxh.me/&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;[&lt;a class="link" href="https://speedtest-cloudflare.zsxh.me/" target="_blank" rel="noopener"
&gt;cloudflare加速后&lt;/a&gt;](&lt;a class="link" href="https://speedtest-cloudflare.zsxh.me/" target="_blank" rel="noopener"
&gt;https://speedtest-cloudflare.zsxh.me/&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;首先直观感受：无变化，甚至还能慢一点，尤其是图片加载的时候（这貌似在下面的文件下载测试时获得了证实），但是统计网站给的数据却让人大跌眼镜。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/03/26/faMh5uvgPX7Sm1x.jpg"
loading="lazy"
alt="6897991-93bb44ab03ebf065.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/03/26/eTKQSd9ukmFIMCf.jpg"
loading="lazy"
alt="6897991-da6128f02fa2482a.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;前面的是没有经过加速的网页，很明显加载速度完全不是一个量级，后者秒杀前者，这和我们的直观体验不服，所以我换了一个更真实的网页测速器，[&lt;a class="link" href="https://www.webpagetest.org/" target="_blank" rel="noopener"
&gt;webpagetest&lt;/a&gt;](&lt;a class="link" href="https://takuron.top/go?url=https://www.webpagetest.org/" target="_blank" rel="noopener"
&gt;https://takuron.top/go?url=https://www.webpagetest.org/&lt;/a&gt;)是一个利用真实浏览器来测试整个网页加载过程的测试网站，我们用它的北京节点来测试一下。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/03/26/TRJfNXGw6MuFZrk.jpg"
loading="lazy"
alt="6897991-fe680699c8973246.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/03/26/cDnTYQsWBu95NgK.jpg"
loading="lazy"
alt="6897991-f24320387b2c93fc.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;很明显这个才和实际体验相符，cloudglare对文本文件进行了有效的加速，可对于图片等资源文件却一点不留情面，不仅没能加速反而搞起了减速。&lt;/p&gt;
&lt;p&gt;文件下载测试可以选择网站里最上方的download，会出现一个视屏文件，利用那个视频文件可以测试下载速度。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/03/26/w7y1Uhrt5kDoe4L.jpg"
loading="lazy"
alt="6897991-b804052a034d1c9b.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;看样子不仅是没有起到加速的作用，反而出现了减速的迹象，果然没有对媒体文件进行缓存。&lt;/p&gt;
&lt;p&gt;综上，cloudflare对于页面的加速还是不错的，可惜由于抠门，媒体资源文件走cdn的减速抵消了页面的加速效果，所以说使不使用cloudflare完全是一个可选项，因为就算加速效果也不明显。&lt;/p&gt;</description></item><item><title>利用gitlab搭建静态页面并开启https</title><link>https://takuron.com/post/id0008/</link><pubDate>Sun, 25 Feb 2018 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0008/</guid><description>&lt;p&gt;踩了无数的坑终于搞明白gitlab pages如何搭建了（一般我写的东西都是自己踩坑后分享的，不喜欢写能找到的资料），决定写一写。&lt;/p&gt;
&lt;p&gt;为什么不用GitHub或者coding？因为GitHub最近拦截了百度蜘蛛，懂SEO都知道这是对网站被搜索引擎收录的毁灭性打击，并且GitHub不支持自定义域名https，而coding需要人工审核还巨慢。所以这里我决定使用gitlab&lt;/p&gt;
&lt;p&gt;与GitHub pages不同，gitlab pages的构建基于gitlab cl，也就是大部分pages的配置都基于 &lt;strong&gt;配置文件而不是项目设置&lt;/strong&gt; ，连基本的纯静态HTML都需要配置文件，我们就从最基本的开始探究。&lt;/p&gt;
&lt;h2 id="静态html的搭建"&gt;静态HTML的搭建
&lt;/h2&gt;&lt;p&gt;首先我们访问gitlab，点开&lt;a class="link" href="https://gitlab.com/pages" target="_blank" rel="noopener"
&gt;用户：pages的首页&lt;/a&gt;，这里面是所有gitlab支持的静态pages类型，我们选择plain-html并克隆。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/07/hFr2vjPtECwmJUf.jpg"
loading="lazy"
alt="005-KRocyly1foskji8qqoj31wq13egwl.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;（或者对于纯HTML这种简单的项目，你也可以自己新建.gitlab-ci.yml文件，里面会提示有模板，按照模板写好文件后新建public文件夹往里面放网页就可以了）&lt;/p&gt;
&lt;p&gt;接着项目会自动进行一段时间的构建，构建好后就可以在Pages里看到网址了。&lt;/p&gt;
&lt;p&gt;（如果想新建 用户名.gitlab.io 为网址的个人页与GitHub同理，把项目名命名成这个就好了）&lt;/p&gt;
&lt;h2 id="jekyll项目的搭建"&gt;jekyll项目的搭建
&lt;/h2&gt;&lt;p&gt;对于jekyll项目，正常可以与静态HTML同理，最简单的方法当然是克隆示例然后制作，可是更多时候遇到的是准备部署模板，对于模板更好用的当然是自己创建配置文件时要注意 &lt;strong&gt;一定要同时创建一个Gemfile文件&lt;/strong&gt; ，如果不知道怎么写可以直接复制官方的示例。（别问我为什么我也不知道，我只知道没有这玩意会失败）&lt;/p&gt;
&lt;h2 id="绑定域名并开启https"&gt;绑定域名并开启https
&lt;/h2&gt;&lt;p&gt;如果你没有域名，那么对你而言本文已经结束了，因为gitlab的域名都自带https，这里要讲讲怎么自己申请自己域名的可信签名。&lt;/p&gt;
&lt;p&gt;不同于国内的coding，gitlab要求你自己申请签名，这里我推荐&lt;a class="link" href="https://freessl.org" target="_blank" rel="noopener"
&gt;freessl.org&lt;/a&gt;，首先打开网站，填入你的域名，公证机构选默认的就行。然后他会让你填邮箱和证书类型，其中要注意 &lt;strong&gt;证书类型一定要选RSA&lt;/strong&gt; 其他的保留默认就好。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/07/HXBquwj9nkSGxJZ.jpg"
loading="lazy"
alt="005-KRocyly1fosl3r37lkj31wq12eagk.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;然后他会进行签名认证，添加解析什么的不会自行百度。成功后就会产生两串字符串和一个下载按钮，建议把签名下载下来方便续签（其实注册账户也可以达到同样目的），还有签名是很重要的网站安全凭证，无事情不要随意透露private key。&lt;/p&gt;
&lt;p&gt;接着我们到gitlab项目页，找到设置里的page，选择new domain会出现如下页面。其中第一个是域名，第二个和第三个是签名，把刚刚申请网页里的第一个复制到第二个框，第二个到第三个框就好了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2020/02/07/LBWREYUswcyQCxg.jpg"
loading="lazy"
alt="005-KRocyly1foslys2t4mj31wq12eahm.jpg"
&gt;&lt;/p&gt;
&lt;p&gt;接着他会让你新建一个验证解析，这个是今年新加的来解决页面安全问题，老老实实添加解析我不解释了。（貌似后面可以删）&lt;/p&gt;
&lt;p&gt;最后给域名添加 你的用户名.gitlab.io 的cname，再打开你的网站，完美。&lt;/p&gt;</description></item><item><title>Android studio 2.2.3默认项目状态栏层级错误的解决方案</title><link>https://takuron.com/post/id0003/</link><pubDate>Sun, 15 Oct 2017 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0003/</guid><description>&lt;p&gt;最近在android studio里新建了一个项目，本来觉得as真的很人性化，给了这么多模板，还都带material design效果，可是当我编译完成后……&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2017/07/30/597d814a7fd92.png"
loading="lazy"
alt="597d814a7fd92.png"
&gt;&lt;/p&gt;
&lt;p&gt;握草这是什么玩意，最简单的hello world都给我附赠个状态栏层级错误，强迫症表示上面的阴影真的是令人无法忍受啊。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2017/07/30/597d81cc78f57.gif"
loading="lazy"
alt="597d81cc78f57.gif"
&gt;&lt;/p&gt;
&lt;p&gt;然后找解决方案，国内是完全没有这方面资料（至少我没找到）（国人果然对md还是非常冷淡），英语水平又呵呵的很，所以一等就是好几个月没有理这个bug。&lt;/p&gt;
&lt;p&gt;前几天和朋友聊起这个bug，他们建议我去stackoverflow 再找找。一开始我是拒绝的，因为我这访问sf奇慢（开网页分钟级），但当他替我搜到时，我就在感叹：国外人真会玩啊。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://stackoverflow.com/questions/34891756/toolbars-shadow-on-status-bar-for-lollipop" target="_blank" rel="noopener"
&gt;stackoverflow原文地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;国外dalao提供了四种解决方案，下面我写一下我亲试有效的两种：&lt;/p&gt;
&lt;h5 id="1去除statusbarcolor"&gt;1.去除statusBarColor
&lt;/h5&gt;&lt;p&gt;关于这个属性，android官方文档是这么解释的&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To set a custom color for the status bar, use the android:statusBarColor attribute when you extend the material theme. By default, android:statusBarColor inherits the value of android:colorPrimaryDark.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;本人借助翻译软件的渣翻：要为状态栏设置自定义颜色，可以在扩展主题主题时使用android:statusBarColor属性。默认情况下,android:statusBarColor继承了android的值:colorPrimaryDark。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;也就是说，我们现在需要它是透明的。然而透明是android的默认选项，虽然根据回答者的意思是我们在代码里就设置的是透明，但这完全没有必要，所以，我们应该找到value-v21里的style.xml，把这行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;item name=&amp;#34;android:statusBarColor&amp;#34;&amp;gt;@android:color/transparent&amp;lt;/item&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;去掉就OK了。&lt;/p&gt;
&lt;h5 id="2外面加一个linearlayout"&gt;2.外面加一个LinearLayout
&lt;/h5&gt;&lt;p&gt;很玄的一个方法，然而的确是有效的，不做首要推荐。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2017/07/30/597d89a8f04cb.png"
loading="lazy"
alt="597d89a8f04cb.png"
&gt;&lt;/p&gt;
&lt;p&gt;（由于简书和我的博客老抽，只好先截图了，具体的可以到原文里查看）&lt;/p&gt;
&lt;p&gt;以上两种方法处理之后界面就恢复正常了～&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2017/07/30/597d8a0b730c7.png"
loading="lazy"
alt="597d8a0b730c7.png"
&gt;&lt;/p&gt;</description></item><item><title>aide安装m2repository库教程</title><link>https://takuron.com/post/id0001/</link><pubDate>Wed, 11 Oct 2017 00:00:00 +0000</pubDate><guid>https://takuron.com/post/id0001/</guid><description>&lt;p&gt;android support一向是Google官方提供给开发者解决应用兼容性和提供官方工具的好东西，这些都打包存在m2repository中。aide支持这个库，不过由于万里长城的影响，aide内置下载是有一定问题的，这里讲讲如何不用梯子下载安装最新版m2repository。&lt;/p&gt;
&lt;p&gt;首先下载打包版本的m2repository，下载地址（推荐Google官方）：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://dl-ssl.google.com/android/repository/android_m2repository_r47.zip" target="_blank" rel="noopener"
&gt;Google官方（国内已经可用）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://android-mirror.bugly.qq.com:8080/android/repository/android_m2repository_r47.zip" target="_blank" rel="noopener"
&gt;腾讯的国内镜像&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mirrors.neusoft.edu.cn/android/repository/android_m2repository_r47.zip" target="_blank" rel="noopener"
&gt;外国镜像（非常非常慢）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://pan.baidu.com/s/1qXD16RM" target="_blank" rel="noopener"
&gt;百度网盘，提取码0202&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载完成后解压。注意：解压的时候最好选择“解压到当前目录”或“解压到指定目录”，如果没有这种选项下一步请保证选择的文件夹名字为“m2repository”。&lt;/p&gt;
&lt;p&gt;以下以es文件浏览器解压为例，请选择2、3项而不是第一项。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2017/07/25/59771cf2e708b.png"
loading="lazy"
alt="59771cf2e708b.png"
&gt;&lt;/p&gt;
&lt;p&gt;解压后在aide中找到解压得到的文件夹，复制路径。&lt;/p&gt;
&lt;p&gt;再次提醒：一定要保证复制路径的是文件夹名字为“m2repository”的文件夹，如果不是，请往里面寻找。&lt;/p&gt;
&lt;p&gt;最后，在菜单里找到更多〉设置〉构建/运行〉maven仓库目录，把刚刚复制的路径粘贴进去即可。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://ooo.0o0.ooo/2017/07/25/59771e30283c5.png"
loading="lazy"
alt="59771e30283c5.png"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2017/07/25/59771e3d3cff5.png"
loading="lazy"
alt="59771e3d3cff5.png"
&gt;&lt;/p&gt;
&lt;p&gt;再在项目中引用类似android support v4之类的库，可以看到项目已经正常了。&lt;/p&gt;</description></item><item><title>Hello World</title><link>https://takuron.com/post/hello-world/</link><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate><guid>https://takuron.com/post/hello-world/</guid><description>&lt;img src="https://takuron.com/post/hello-world/cover.jpg" alt="Featured image of post Hello World" /&gt;&lt;p&gt;Welcome to Hugo theme Stack. This is your first post. Edit or delete it, then start writing!&lt;/p&gt;
&lt;p&gt;For more information about this theme, check the documentation: &lt;a class="link" href="https://stack.jimmycai.com/" target="_blank" rel="noopener"
&gt;https://stack.jimmycai.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Want a site like this? Check out &lt;a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack-starter" target="_blank" rel="noopener"
&gt;hugo-theme-stack-stater&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a class="link" href="https://unsplash.com/@pawel_czerwinski" target="_blank" rel="noopener"
&gt;Pawel Czerwinski&lt;/a&gt; on &lt;a class="link" href="https://unsplash.com/" target="_blank" rel="noopener"
&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Markdown Syntax Guide</title><link>https://takuron.com/post/syntax-guide/</link><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate><guid>https://takuron.com/post/syntax-guide/</guid><description>&lt;p&gt;This article offers a sample of basic Markdown syntax that can be used in Hugo content files, also it shows whether basic HTML elements are decorated with CSS in a Hugo theme.&lt;/p&gt;
&lt;h2 id="headings"&gt;Headings
&lt;/h2&gt;&lt;p&gt;The following HTML &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;—&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; elements represent six levels of section headings. &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; is the highest section level while &lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; is the lowest.&lt;/p&gt;
&lt;h1 id="h1"&gt;H1
&lt;/h1&gt;&lt;h2 id="h2"&gt;H2
&lt;/h2&gt;&lt;h3 id="h3"&gt;H3
&lt;/h3&gt;&lt;h4 id="h4"&gt;H4
&lt;/h4&gt;&lt;h5 id="h5"&gt;H5
&lt;/h5&gt;&lt;h6 id="h6"&gt;H6
&lt;/h6&gt;&lt;h2 id="paragraph"&gt;Paragraph
&lt;/h2&gt;&lt;p&gt;Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.&lt;/p&gt;
&lt;p&gt;Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.&lt;/p&gt;
&lt;h2 id="blockquotes"&gt;Blockquotes
&lt;/h2&gt;&lt;p&gt;The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a &lt;code&gt;footer&lt;/code&gt; or &lt;code&gt;cite&lt;/code&gt; element, and optionally with in-line changes such as annotations and abbreviations.&lt;/p&gt;
&lt;h3 id="blockquote-without-attribution"&gt;Blockquote without attribution
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Tiam, ad mint andaepu dandae nostion secatur sequo quae.
&lt;strong&gt;Note&lt;/strong&gt; that you can use &lt;em&gt;Markdown syntax&lt;/em&gt; within a blockquote.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="blockquote-with-attribution"&gt;Blockquote with attribution
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t communicate by sharing memory, share memory by communicating.&lt;br&gt;
— &lt;cite&gt;Rob Pike&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="tables"&gt;Tables
&lt;/h2&gt;&lt;p&gt;Tables aren&amp;rsquo;t part of the core Markdown spec, but Hugo supports supports them out-of-the-box.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bob&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="inline-markdown-within-tables"&gt;Inline Markdown within tables
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Italics&lt;/th&gt;
&lt;th&gt;Bold&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;italics&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;bold&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;code&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;D&lt;/th&gt;
&lt;th&gt;E&lt;/th&gt;
&lt;th&gt;F&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/td&gt;
&lt;td&gt;Phasellus ultricies, sapien non euismod aliquam, dui ligula tincidunt odio, at accumsan nulla sapien eget ex.&lt;/td&gt;
&lt;td&gt;Proin eleifend dictum ipsum, non euismod ipsum pulvinar et. Vivamus sollicitudin, quam in pulvinar aliquam, metus elit pretium purus&lt;/td&gt;
&lt;td&gt;Proin sit amet velit nec enim imperdiet vehicula.&lt;/td&gt;
&lt;td&gt;Ut bibendum vestibulum quam, eu egestas turpis gravida nec&lt;/td&gt;
&lt;td&gt;Sed scelerisque nec turpis vel viverra. Vivamus vitae pretium sapien&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="code-blocks"&gt;Code Blocks
&lt;/h2&gt;&lt;h3 id="code-block-with-backticks"&gt;Code block with backticks
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Example HTML5 Document&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Test&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="code-block-indented-with-four-spaces"&gt;Code block indented with four spaces
&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
&amp;lt;title&amp;gt;Example HTML5 Document&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p&amp;gt;Test&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="diff-code-block"&gt;Diff code block
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[dependencies.bevy]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git = &amp;#34;https://github.com/bevyengine/bevy&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rev = &amp;#34;11f52b8c72fc3a568e8bb4a4cd1f3eb025ac2e13&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- features = [&amp;#34;dynamic&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ features = [&amp;#34;jpeg&amp;#34;, &amp;#34;dynamic&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="one-line-code-block"&gt;One line code block
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;A paragraph&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="list-types"&gt;List Types
&lt;/h2&gt;&lt;h3 id="ordered-list"&gt;Ordered List
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;First item&lt;/li&gt;
&lt;li&gt;Second item&lt;/li&gt;
&lt;li&gt;Third item&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="unordered-list"&gt;Unordered List
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;List item&lt;/li&gt;
&lt;li&gt;Another item&lt;/li&gt;
&lt;li&gt;And another item&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="nested-list"&gt;Nested list
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Fruit
&lt;ul&gt;
&lt;li&gt;Apple&lt;/li&gt;
&lt;li&gt;Orange&lt;/li&gt;
&lt;li&gt;Banana&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dairy
&lt;ul&gt;
&lt;li&gt;Milk&lt;/li&gt;
&lt;li&gt;Cheese&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="other-elements--abbr-sub-sup-kbd-mark"&gt;Other Elements — abbr, sub, sup, kbd, mark
&lt;/h2&gt;&lt;p&gt;&lt;abbr title="Graphics Interchange Format"&gt;GIF&lt;/abbr&gt; is a bitmap image format.&lt;/p&gt;
&lt;p&gt;H&lt;sub&gt;2&lt;/sub&gt;O&lt;/p&gt;
&lt;p&gt;X&lt;sup&gt;n&lt;/sup&gt; + Y&lt;sup&gt;n&lt;/sup&gt; = Z&lt;sup&gt;n&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Press &lt;kbd&gt;CTRL&lt;/kbd&gt; + &lt;kbd&gt;ALT&lt;/kbd&gt; + &lt;kbd&gt;Delete&lt;/kbd&gt; to end the session.&lt;/p&gt;
&lt;p&gt;Most &lt;mark&gt;salamanders&lt;/mark&gt; are nocturnal, and hunt for insects, worms, and other small creatures.&lt;/p&gt;
&lt;h1 id="math-typesetting"&gt;Math Typesetting
&lt;/h1&gt;&lt;p&gt;Stack has built-in support for math typesetting using &lt;a class="link" href="https://katex.org/" target="_blank" rel="noopener"
&gt;KaTeX&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s not enabled by default side-wide,&lt;/strong&gt; but you can enable it for individual posts by adding &lt;code&gt;math: true&lt;/code&gt; to the front matter. Or you can enable it side-wide by adding &lt;code&gt;math = true&lt;/code&gt; to the &lt;code&gt;params.article&lt;/code&gt; section in &lt;code&gt;config.toml&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="inline-math"&gt;Inline math
&lt;/h2&gt;&lt;p&gt;This is an inline mathematical expression: $\varphi = \dfrac{1+\sqrt5}{2}= 1.6180339887…$&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$\varphi = \dfrac{1+\sqrt5}{2}= 1.6180339887…$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="block-math"&gt;Block math
&lt;/h2&gt;$$
\varphi = 1+\frac{1} {1+\frac{1} {1+\frac{1} {1+\cdots} } }
$$&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$$
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; \varphi = 1+\frac{1} {1+\frac{1} {1+\frac{1} {1+\cdots} } }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;$$
f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi
$$&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$$
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h1 id="image-gallery"&gt;Image gallery
&lt;/h1&gt;&lt;p&gt;Hugo theme Stack supports the creation of interactive image galleries using Markdown. It&amp;rsquo;s powered by &lt;a class="link" href="https://photoswipe.com/" target="_blank" rel="noopener"
&gt;PhotoSwipe&lt;/a&gt; and its syntax was inspired by &lt;a class="link" href="https://typlog.com/" target="_blank" rel="noopener"
&gt;Typlog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To use this feature, the image must be in the same directory as the Markdown file, as it uses Hugo&amp;rsquo;s page bundle feature to read the dimensions of the image. &lt;strong&gt;External images are not supported.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="syntax"&gt;Syntax
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;![&lt;span class="nt"&gt;Image 1&lt;/span&gt;](&lt;span class="na"&gt;1.jpg&lt;/span&gt;) ![&lt;span class="nt"&gt;Image 2&lt;/span&gt;](&lt;span class="na"&gt;2.jpg&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="result"&gt;Result
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://takuron.com/post/syntax-guide/1.jpg"
width="2000"
height="1400"
srcset="https://takuron.com/post/syntax-guide/1_hu_32a169d2afcbcc04.jpg 480w, https://takuron.com/post/syntax-guide/1_hu_3a73c825de3f86b8.jpg 1024w"
loading="lazy"
alt="Image 1"
class="gallery-image"
data-flex-grow="142"
data-flex-basis="342px"
&gt; &lt;img src="https://takuron.com/post/syntax-guide/2.jpg"
width="1500"
height="2250"
srcset="https://takuron.com/post/syntax-guide/2_hu_2a56812cdca2c35e.jpg 480w, https://takuron.com/post/syntax-guide/2_hu_70fe5bdaa5eb1f20.jpg 1024w"
loading="lazy"
alt="Image 2"
class="gallery-image"
data-flex-grow="66"
data-flex-basis="160px"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a class="link" href="https://unsplash.com/@mymind" target="_blank" rel="noopener"
&gt;mymind&lt;/a&gt; and &lt;a class="link" href="https://unsplash.com/@lukechesser" target="_blank" rel="noopener"
&gt;Luke Chesser&lt;/a&gt; on &lt;a class="link" href="https://unsplash.com/" target="_blank" rel="noopener"
&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="shortcodes"&gt;Shortcodes
&lt;/h1&gt;&lt;p&gt;For more details, check out the &lt;a class="link" href="https://stack.jimmycai.com/writing/shortcodes" target="_blank" rel="noopener"
&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="bilibili-video"&gt;Bilibili video
&lt;/h2&gt;
&lt;div class="video-wrapper"&gt;
&lt;iframe src="https://player.bilibili.com/player.html?as_wide=1&amp;amp;high_quality=1&amp;amp;page=1&amp;bvid=BV1d4411N7zD"
scrolling="no"
frameborder="no"
framespacing="0"
allowfullscreen="true"
&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="tencent-video"&gt;Tencent video
&lt;/h2&gt;
&lt;div class="video-wrapper"&gt;
&lt;iframe src="https://v.qq.com/txp/iframe/player.html?vid=g0014r3khdw&amp;auto=0"
scrolling="no"
frameborder="no"
framespacing="0"
allowfullscreen="true"
&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="youtube-video"&gt;YouTube video
&lt;/h2&gt;&lt;div class="video-wrapper"&gt;
&lt;iframe loading="lazy"
src="https://www.youtube.com/embed/0qwALOOvUik"
allowfullscreen
title="YouTube Video"
&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="generic-video-file"&gt;Generic video file
&lt;/h2&gt;&lt;div class="video-wrapper"&gt;
&lt;video
controls
src="https://www.w3schools.com/tags/movie.mp4"
&gt;
&lt;p&gt;
Your browser doesn't support HTML5 video. Here is a
&lt;a href="https://www.w3schools.com/tags/movie.mp4"&gt;link to the video&lt;/a&gt; instead.
&lt;/p&gt;
&lt;/video&gt;
&lt;/div&gt;
&lt;h2 id="gist"&gt;Gist
&lt;/h2&gt;&lt;script src="https://gist.github.com/CaiJimmy/e2751a943de10b2a5b3a8a6c2120cb86.js"&gt;&lt;/script&gt;
&lt;h2 id="gitlab"&gt;GitLab
&lt;/h2&gt;&lt;script
type="application/javascript"
src="https://gitlab.com/-/snippets/2589724.js"
&gt;&lt;/script&gt;
&lt;h2 id="quote"&gt;Quote
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/p&gt;&lt;span class="cite"&gt;&lt;span&gt;― &lt;/span&gt;&lt;span&gt;A famous person, &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Book"&gt;&lt;cite&gt;The book they wrote&lt;/cite&gt;&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a class="link" href="https://unsplash.com/@codioful" target="_blank" rel="noopener"
&gt;Codioful&lt;/a&gt; on &lt;a class="link" href="https://unsplash.com/photos/WDSN62Qdxuk" target="_blank" rel="noopener"
&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;The above quote is excerpted from Rob Pike&amp;rsquo;s &lt;a class="link" href="https://www.youtube.com/watch?v=PAAkCSZUG1c" target="_blank" rel="noopener"
&gt;talk&lt;/a&gt; during Gopherfest, November 18, 2015.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Archives</title><link>https://takuron.com/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://takuron.com/archives/</guid><description/></item><item><title>Links</title><link>https://takuron.com/links/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://takuron.com/links/</guid><description>&lt;p&gt;本站欢迎友链交换，主要接受博客类的友链互换，其他类型的站点具体分析（主要看我心情）。&lt;/p&gt;
&lt;p&gt;对于互换友链的站点要求如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;支持https&lt;/li&gt;
&lt;li&gt;建站半年以上。&lt;/li&gt;
&lt;li&gt;博客类网站文章&amp;gt;3篇，技术博客为主，不接受纯生活博客。&lt;/li&gt;
&lt;li&gt;不能有本人看着不爽的广告，网站风格简约不过度花里胡哨。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;欢迎符合要求的网站发送邮件到侧栏的本人邮箱来申请。&lt;/p&gt;</description></item><item><title>Search</title><link>https://takuron.com/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://takuron.com/search/</guid><description/></item></channel></rss>