<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Lovemilk Notes</title><description>Remake 2.0</description><link>https://notes.lovemilk.top/</link><language>zh_CN</language><item><title>USB 硬盘盒查看 SMART 信息</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/usb-disk-drive-smart/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/usb-disk-drive-smart/</guid><pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;USB 硬盘盒查看 SMART 信息&lt;/p&gt;
&lt;h3&gt;查看 USB 硬盘盒主控类型&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;lsusb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出类似&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Bus 001 Device 007: ID 152d:f583 JMicron Technology Corp. / JMicron USA Technology Corp. JEYI JMS583 Storage
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;将主控型号传入 &lt;code&gt;smartctl&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo smartctl -d &amp;lt;type&amp;gt; -a &amp;lt;device&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;type&lt;/code&gt; 在示例输出的类型使用 &lt;code&gt;sntjmicron&lt;/code&gt;, 其他情况请自行搜索主控对应的类型&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Wifi Stick (随身 WIFI 棒子) 基础安装配置</title><link>https://aka.lovemilk.top/notes/posts/deployment/wifistick/installation/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/wifistick/installation/</guid><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文主要讲述如何安装 Wifi Stick, 并对 USB 网路共享 (RNDIS), 串口通讯, 本地文件服务器等进行配置&lt;/p&gt;
&lt;p&gt;我所购买的 Wifi Stick 采用 903 主板方案, 大部分情况下兼容 ufi-001c 方案, SoC 为 高通骁龙 410&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;由于 Wifi Stick 采用传统的 Android 引导方式, 我们可以直接使用 Fastboot 工具 (&lt;a href=&quot;https://developer.android.google.cn/tools/releases/platform-tools&quot;&gt;下载 Platform-Tools&lt;/a&gt;) 刷入系统镜像&lt;/p&gt;
&lt;p&gt;该操作可能需要安装 ADB / Fastboot 驱动&lt;/p&gt;
&lt;h3&gt;进入 Fastboot&lt;/h3&gt;
&lt;p&gt;插入电脑 USB 接口 (若无法识别请使用主板 IO 侧接口, 而不是机箱前面板接口), 后立即长按 Wifi Stick 按钮不松&lt;/p&gt;
&lt;p&gt;然后运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fastboot devices
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以成功看到有 Fastboot 设备连接&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;对于 Windows 操作系统, 需要手动安装 Fastboot 驱动. 也可以直接使用图形化刷机工具 &lt;a href=&quot;https://www.bilibili.com/video/BV1HMpgzMEpM/&quot;&gt;刷机匣&lt;/a&gt;&lt;br /&gt;
刷机匣需要使用 &lt;code&gt;-a&lt;/code&gt; 版本, 该版本才有 &lt;em&gt;fastboot&lt;/em&gt; 选项卡&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;若无法进入 Fastboot, 请参阅 &lt;a href=&quot;#see-also-%E5%8F%AF%E4%BB%A5%E8%BF%9B%E5%85%A5%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E4%BD%86%E6%97%A0%E6%B3%95%E8%BF%9B%E5%85%A5-fastboot&quot;&gt;See Also, 可以进入管理后台但无法进入 Fastboot&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;See Also, 进入 9008&lt;/h3&gt;
&lt;h4&gt;1. 安装 EDL 工具&lt;/h4&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/bkerler/edl&quot;&gt;https://github.com/bkerler/edl&lt;/a&gt; 并按照流程安装 EDL 工具, 或者使用 Arch AUR 软件包安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;paru -S edl
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. 下载 骁龙 410 引导 ELF&lt;/h4&gt;
&lt;p&gt;进入 9008 模式需要向 Wifi Stick 发送引导才能识别, 引导文件可以在 &lt;a href=&quot;/static/MSM8916.elf&quot;&gt;当前网站&lt;/a&gt; / &lt;a href=&quot;https://aka.lovemilk.top/github/notes/releases/tag/ufi001c-boot&quot;&gt;GitHub Release&lt;/a&gt; 下载 &lt;strong&gt;MSM8916.elf&lt;/strong&gt;, 或者搜索 &lt;code&gt;MSM8916 9008 ELF&lt;/code&gt; (骁龙 410 的产品代码) 并查找可信来源下载&lt;/p&gt;
&lt;h4&gt;3. 进入 9008, 携带引导&lt;/h4&gt;
&lt;p&gt;长按 Wifi Stick 按钮不松, 然后插入电脑 USB 接口 (若无法识别请使用主板 IO 侧接口, 而不是机箱前面板接口)&lt;/p&gt;
&lt;p&gt;要运行命令时, 请使用 &lt;code&gt;--loader&lt;/code&gt; 参数提供引导文件的路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo edl &amp;lt;command&amp;gt; --loader MSM8916.elf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若不提供引导, 则会报错&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DeviceClass - [LIB]: Couldn&apos;t get device configuration.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果出现错误日志, 请将 Wifi Stick 拔除并重试本步骤&lt;/p&gt;
&lt;h3&gt;See Also, 可以进入管理后台但无法进入 Fastboot&lt;/h3&gt;
&lt;p&gt;部分设备可能无法直接进入 Fastboot 模式, 我们可以通过 ADB 重启至 Fastboot 模式, 若已经在系统内开启了 ADB, 请跳转至 &lt;a href=&quot;#3-%E8%BF%9B%E5%85%A5-fastboot&quot;&gt;3. 进入 Fastboot&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;也可使用更简便的方法: &lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E7%89%B9%E5%88%B6%E7%9A%84-boot-%E5%88%86%E5%8C%BA%E8%BF%9B%E5%85%A5-fastboot&quot;&gt;使用特制的 boot 分区进入 Fastboot&lt;/a&gt;&lt;/h4&gt;
&lt;h4&gt;1. 提取或挂载 system 分区&lt;/h4&gt;
&lt;p&gt;对于已有全盘备份的 &lt;code&gt;.bin&lt;/code&gt; 文件 (使用 eld 或 miko service tool 等工具导出的文件) 的用户, 可以直接从备份中提取 &lt;code&gt;system.img&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
请按照操作系统选择对应的命令执行. Unix 未经测试&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;.bin&lt;/code&gt; 文件是一个没有末尾 GPT 分区表备份的 GPT 原始二进制, 我们可以使用 GNU parted 或者其他可以获取分区表信息的工具获取 system 分区的 offset&lt;/p&gt;
&lt;p&gt;例如, 我们可以使用如下命令获取 system 分区的起始位置&lt;/p&gt;
&lt;p&gt;对于 Linux&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;parted /path/to/example.bin unit s print
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;由于 &lt;code&gt;.bin&lt;/code&gt; 文件没有末尾 GPT 分区表备份, parted 会在打开时显示 &lt;em&gt;出现文件结尾于读取&lt;/em&gt; 或类似提示, 全部忽略即可&lt;/p&gt;
&lt;p&gt;显示类似 &lt;em&gt;错误: 备份 GPT 表损坏，但主表似乎是正确的，所以使用主表。&lt;/em&gt; 选择确认&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;输出类似&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;型号： (file)
磁盘 /path/to/example.bin：7471071s
扇区大小 (逻辑/物理)：512B/512B
分区表：gpt
磁盘标志：

编号  起始点    结束点    大小      文件系统  名称      标志
 1    131072s   262143s   131072s   fat16     modem     msftdata
 2    262144s   263167s   1024s               sbl1
 3    263168s   264191s   1024s               sbl1bak   msftdata
 4    264192s   266239s   2048s               aboot
 5    266240s   268287s   2048s               abootbak  msftdata
 6    268288s   269311s   1024s               rpm
 7    269312s   270335s   1024s               rpmbak    msftdata
 8    270336s   271359s   1024s               tz
 9    271360s   272383s   1024s               tzbak     msftdata
10    272384s   273407s   1024s               hyp
11    273408s   274431s   1024s               hypbak    msftdata
12    274432s   276479s   2048s               pad       msftdata
13    276480s   279551s   3072s               modemst1
14    279552s   282623s   3072s               modemst2
15    282624s   284671s   2048s               misc
16    284672s   284673s   2s                  fsc
17    284674s   284689s   16s                 ssd
18    284690s   305169s   20480s              splash
19    393216s   393279s   64s                 DDR
20    393280s   396351s   3072s               fsg
21    396352s   396383s   32s                 sec
22    396384s   429151s   32768s              boot
23    429152s   2067551s  1638400s  ext4      system    msftdata
24    2067552s  2133087s  65536s    ext4      persist   msftdata
25    2133088s  2395231s  262144s   ext4      cache     msftdata
26    2395232s  2427999s  32768s              recovery
27    2428000s  7471070s  5043071s  ext4      userdata  msftdata
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 Windows, 请 &lt;a href=&quot;https://sourceforge.net/projects/gptfdisk/&quot;&gt;下载并安装 GPT Disk&lt;/a&gt; 并保证 &lt;code&gt;gdisk32.exe&lt;/code&gt; 或 &lt;code&gt;gdisk64.exe&lt;/code&gt; 可被执行, 后运行如下命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gdisk64.exe -l /path/to/example.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出类似&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Disk &amp;lt;path&amp;gt; 7471071 sectors, 3.6 GiB
Sector size (logical): 512 bytes
Disk identifier (GUID): 98101B32-BBE2-4BF2-A06E-2BB33D000C20
Partition table holds up to 28 entries
Main partition table begins at sector 2 and ends at sector 8
First usable sector is 34, last usable sector is 7471070
Partitions will be aligned on 2-sector boundaries
Total free space is 219084 sectors (107.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1          131072          262143   64.0 MiB    0700  modem
   2          262144          263167   512.0 KiB   A012  sbl1
   3          263168          264191   512.0 KiB   0700  sbl1bak
   4          264192          266239   1024.0 KiB  A015  aboot
   5          266240          268287   1024.0 KiB  0700  abootbak
   6          268288          269311   512.0 KiB   A018  rpm
   7          269312          270335   512.0 KiB   0700  rpmbak
   8          270336          271359   512.0 KiB   A016  tz
   9          271360          272383   512.0 KiB   0700  tzbak
  10          272384          273407   512.0 KiB   A017  hyp
  11          273408          274431   512.0 KiB   0700  hypbak
  12          274432          276479   1024.0 KiB  0700  pad
  13          276480          279551   1.5 MiB     A027  modemst1
  14          279552          282623   1.5 MiB     A028  modemst2
  15          282624          284671   1024.0 KiB  A036  misc
  16          284672          284673   1024 bytes  A029  fsc
  17          284674          284689   8.0 KiB     A02C  ssd
  18          284690          305169   10.0 MiB    A036  splash
  19          393216          393279   32.0 KiB    A01A  DDR
  20          393280          396351   1.5 MiB     A02A  fsg
  21          396352          396383   16.0 KiB    A01D  sec
  22          396384          429151   16.0 MiB    A036  boot
  23          429152         2067551   800.0 MiB   0700  system
  24         2067552         2133087   32.0 MiB    0700  persist
  25         2133088         2395231   128.0 MiB   0700  cache
  26         2395232         2427999   16.0 MiB    A036  recovery
  27         2428000         7471070   2.4 GiB     0700  userdata
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;找到名称为 &lt;code&gt;system&lt;/code&gt; 的起始点 (例如 &lt;code&gt;429152&lt;/code&gt;) 和大小扇区个数 (例如 &lt;code&gt;1638400s&lt;/code&gt;) 或结束扇区 (例如 &lt;code&gt;2067551&lt;/code&gt;)&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;若要挂载 system 分区, 可以使用如下命令&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对数字部分乘以扇区大小 (字节) 我们可以算出 $offset = 429152 \times 512 = 219725824$ 便是 system 分区位于该文件的起始地址 (字节)&lt;/p&gt;
&lt;p&gt;对于 Linux, 我们可以使用如下命令直接从 &lt;code&gt;.bin&lt;/code&gt; 文件中挂载 system 分区&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mount -o loop,offset=&amp;lt;offset&amp;gt; /path/to/example.bin /path/to/mount
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mount -o loop,offset=219725824 example.bin ./system
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;若要导出 system&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对于 Linux, 我们可以使用 dd 命令导出 system 分区&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dd if=/path/to/example.bin of=system.img bs=&amp;lt;扇区大小 (字节)&amp;gt; skip=&amp;lt;起始地址 (扇区)&amp;gt; count=&amp;lt;大小 (扇区)&amp;gt; status=progress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dd if=/path/to/example.bin of=system.img bs=512 skip=429152 count=1638400 status=progress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 Windows, 请自行想办法通过偏移量和大小获取镜像, 或者在有 Git Bash 内的 &lt;code&gt;dd&lt;/code&gt; 命令运行 Linux 的导出命令&lt;/p&gt;
&lt;p&gt;或是在装有 Python 环境的 Windows 上配置并运行如下脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# `.bin` file
FILE = &quot;/path/to/example.bin&quot;
# output file
OUTPUT = &quot;system.img&quot;
# sector size in bytes
SECTOR_SIZE = 512

# start sector
START_SECTOR = -1
# end sector
END_SECTOR = -1

# buffer size in bytes, 16 MiB by default
BUFFER_SIZE = 16 * 1024 * 1024

if START_SECTOR &amp;lt; 0 or END_SECTOR &amp;lt; 0 or START_SECTOR % 1 != 0 or END_SECTOR % 1 != 0:
    print(&quot;please provide start sector and end sector&quot;)
    exit(255)


image_size = (END_SECTOR - START_SECTOR + 1) * SECTOR_SIZE  # in bytes
if image_size &amp;lt;= 0:
    print(&quot;invalid sector range: no data selected&quot;)
    exit(255)

loop_count = image_size // BUFFER_SIZE
left_size = image_size % BUFFER_SIZE

start = START_SECTOR * SECTOR_SIZE
with open(FILE, mode=&quot;rb&quot;) as fp:
    fp.seek(start)

    with open(OUTPUT, mode=&quot;wb&quot;) as out:
        for _ in range(loop_count):
            data = fp.read(BUFFER_SIZE)
            if len(data) &amp;lt; BUFFER_SIZE:
                print(&quot;unexpected `EOF`&quot;)
                exit(1)
            out.write(data)

        if left_size &amp;gt; 0:
            data = fp.read(left_size)
            if len(data) &amp;lt; left_size:
                print(&quot;unexpected `EOF`&quot;)
                exit(1)
            out.write(data)

print(&quot;OK:&quot;, OUTPUT)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们使用 file (或 Git Bash 的 file) 对 &lt;code&gt;system.img&lt;/code&gt; 进行查看, 输出应当为 Ext4 类型的文件系统镜像, 类似于&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;system.img: Linux rev 1.0 ext4 filesystem data, UUID=&amp;lt;uuid&amp;gt;, volume name &quot;system&quot; (extents) (large files)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 Linux, 要挂载 &lt;code&gt;system.img&lt;/code&gt;, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mount -o loop system.img /path/to/mount
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 Windows, 请直接使用 7-Zip 打开并修改 system 镜像, 参考下方步骤&lt;/p&gt;
&lt;h4&gt;2. 修改 &lt;code&gt;build.prop&lt;/code&gt; 以开启 ADB&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;参考 &lt;a href=&quot;https://www.bilibili.com/video/BV1QV4y1y7yf/&quot;&gt;https://www.bilibili.com/video/BV1QV4y1y7yf/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;进入 system 分区的根目录 (例如已经挂载后的 &lt;code&gt;./system&lt;/code&gt; 文件夹), 或在 7-Zip 打开 &lt;code&gt;system.img&lt;/code&gt;, 发现存在 &lt;code&gt;build.prop&lt;/code&gt; 与 &lt;code&gt;build.prop.bakforspec&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;一般而言修改这俩个文件即可, 若无法生效, 对于 Linux, 请使用 &lt;a href=&quot;https://github.com/sharkdp/fd&quot;&gt;fd&lt;/a&gt; 工具搜寻全部的 &lt;code&gt;build.prop*&lt;/code&gt; 文件, 并全部覆盖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 使用 fd
fd --glob &quot;build.prop*&quot; .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要启用 ADB, 请在需要修改的 &lt;code&gt;build.prop&lt;/code&gt; 与 &lt;code&gt;build.prop.bakforspec&lt;/code&gt; 中添加或修改如下行&lt;/p&gt;
&lt;p&gt;Windows 用户请先从 7-Zip 导出文件后修改, 并在修改完成后使用 DiskGenius 挂载并写回覆盖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /build.prop

# Enable ADB
persist.service.adb.enable=1
persist.service.debuggable=1
persist.sys.usb.config=mtp,adb
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如果要启用带有 root 权限的 ADB, 请再添加如下行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /build.prop

# Enable root for ADB
ro.debuggable=1
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;其中, &lt;code&gt;persist.sys.usb.config&lt;/code&gt; 行配置可在原内容最后添加 &lt;code&gt;,adb&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这些操作需要 root 权限, 是因为 system 分区在 Wifi Stick 上作为系统分区, 文件所有者/组均为 uid/gid 0 (root 用户/组). 这些操作不会破坏您的操作系统, 也不会导致您的操作系统稳定性受到影响&lt;/p&gt;
&lt;p&gt;修改完成并确认保存后, 解除挂载分区. 解除挂载需要保证进程占用挂载点, 进程占用包括终端工作路径位于挂载点内&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo umount ./system
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. 刷入 system 分区镜像&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;#see-also-%E8%BF%9B%E5%85%A5-9008&quot;&gt;进入 9008&lt;/a&gt;, 后使用 edl 或者其他刷写工具 (如&lt;a href=&quot;https://www.bilibili.com/video/BV1HMpgzMEpM/&quot;&gt;刷机匣&lt;/a&gt;) 刷入 &lt;code&gt;system.img&lt;/code&gt; 至 system 分区&lt;/p&gt;
&lt;p&gt;edl 命令例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo edl w system system.img --loader=MSM8916.elf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后直接插拔 Wifi Stick 将其重启至系统&lt;/p&gt;
&lt;h3&gt;3. 进入 Fastboot&lt;/h3&gt;
&lt;p&gt;将 Wifi Stick 连接并进入系统后, 使用 ADB 命令重启至 Fastboot&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adb reboot bootloader
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;刷机&lt;/h3&gt;
&lt;h4&gt;下载刷机包&lt;/h4&gt;
&lt;p&gt;为了保证各设备识别正常, 避免出现无法开机或设备识别异常的情况, 需要按照自己设备的主板型号下载刷机包&lt;/p&gt;
&lt;p&gt;主板型号可以在主板上丝印看到, 已知的主板型号有:&lt;br /&gt;
&lt;code&gt;ufi001b/c&lt;/code&gt;, &lt;code&gt;sp970&lt;/code&gt;, &lt;code&gt;uz801&lt;/code&gt;, &lt;code&gt;UFI-16-V3&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;(参见 &lt;a href=&quot;https://www.kancloud.cn/handsomehacker/openstick/2636505&quot;&gt;https://www.kancloud.cn/handsomehacker/openstick/2636505&lt;/a&gt;)&lt;/p&gt;
&lt;h4&gt;运行刷机脚本&lt;/h4&gt;
&lt;p&gt;刷入脚本本质上就是使用 &lt;code&gt;fastboot&lt;/code&gt; 命令, 将对应分区的镜像文件刷入至对应分区&lt;/p&gt;
&lt;p&gt;部分刷机包可能仅提供了 &lt;code&gt;.bat&lt;/code&gt; 的 Windows 操作系统脚本, 可以使用 LLM 或者手动修改, &lt;code&gt;fastboot&lt;/code&gt; 命令的语法是一样的&lt;/p&gt;
&lt;p&gt;刷入完成后脚本会自动让 Wifi Stick 重启, 同时请注意脚本输入, 这里可能包含初始化信息, 如 Wifi Stick 默认热点名称及 IP 地址, root 默认密码等&lt;/p&gt;
&lt;h3&gt;连接 Wifi Stick SSH&lt;/h3&gt;
&lt;p&gt;不同固件的 Wifi Stick 连接方式各异, 但基本上就是连接 Wifi Stick 提供的热点或使用 RNDIS 作为 USB 网卡连接, 然后再 SSH 至其的 IP 地址&lt;/p&gt;
&lt;p&gt;RNDIS 设备连接方式参见 &lt;a href=&quot;#%E8%BF%9E%E6%8E%A5-rndis-%E8%AE%BE%E5%A4%87&quot;&gt;连接 RNDIS 设备&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
部分二改的刷机包可能没有修改脚本内说明的 IP 地址, 可以通过查看自动获取到的 IP 地址, 然后尝试连接该 IP 的常见网关地址 (&lt;code&gt;.1&lt;/code&gt; 或 &lt;code&gt;.254&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;大部分固件默认启用了 USB 融合模式, 会同时提供一个 RNDIS 设备和一个 ADB 设备, 一般情况下可以直接使用 &lt;code&gt;adb shell&lt;/code&gt;连接终端&lt;/p&gt;
&lt;p&gt;若要使用 &lt;code&gt;adb shell&lt;/code&gt; 连接终端, 强烈建议在 Shell 内 &lt;code&gt;export TERM=xterm-256color&lt;/code&gt; 以便运行 TUI 程序&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;救砖&lt;/h3&gt;
&lt;h4&gt;使用特制的 boot 分区进入 Fastboot&lt;/h4&gt;
&lt;p&gt;一些刷机包内会存在 &lt;code&gt;aboot.bin&lt;/code&gt; 类似文件, 这是特殊制作的 boot 分区镜像, 可以使设备重启直接进入 Fastboot&lt;/p&gt;
&lt;p&gt;在刷机脚本中一般可以从如下特征识别&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fastboot erase boot
@REM 刷写了 boot 直接重启
fastboot flash aboot aboot.bin
fastboot reboot

@REM 便进入了带有 `oem dump` 的 Fastboot
fastboot oem dump fsc &amp;amp;&amp;amp; fastboot get_staged fsc.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们直接使用 9008 将 &lt;code&gt;aboot.bin&lt;/code&gt; 刷写入 boot 分区, 并重启设备即可进入 fastboot&lt;/p&gt;
&lt;h4&gt;恢复全盘镜像&lt;/h4&gt;
&lt;p&gt;如果你的 Wifi Stick 已经无法进入 Fastboot, 可以找到 &lt;strong&gt;完全相同的设备&lt;/strong&gt; 的全盘备份或部分分区备份, 按需输入对应分区&lt;/p&gt;
&lt;p&gt;若要刷写对应分区, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo edl w &amp;lt;partition&amp;gt; &amp;lt;image&amp;gt; --loader MSM8916.elf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若要使用 edl 刷写全盘备份的 &lt;code&gt;.bin&lt;/code&gt; 文件, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo edl wf /path/to/example.bin --loader MSM8916.elf
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;初始配置&lt;/h2&gt;
&lt;h3&gt;&lt;em&gt;[重要]&lt;/em&gt; (重新)生成 SSH Host Key&lt;/h3&gt;
&lt;p&gt;由于一些配置和实现问题, 刷机包直接刷入的 Armbian11 系统内已经包含了系统的 SSH Host Key, 导致 (至少) 全部的同一刷机包设备均会使用相同的 SSH Host Key 造成私钥泄露, 存在 MITM (中间人攻击) 的可能性&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;亦可能即使使用不同刷机包的设备使用相同的 SSH Host Key&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;为了保证安全, 我们需要重新生成 SSH Host Key&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo rm -v /etc/ssh/ssh_host_*
sudo dpkg-reconfigure openssh-server
sudo systemctl restart ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果已有 SSH 客户端连接过该设备, 更换 SSH Host Key 会导致服务端 Key 变更导致客户端不再信任. 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -R &amp;lt;IP/domain&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Wifi Stick 使用基带 (蜂窝网络/移动数据)&lt;/h3&gt;
&lt;p&gt;参见 &lt;a href=&quot;#wifi-stick-%E4%BF%AE%E5%A4%8D%E5%9F%BA%E5%B8%A6%E9%A9%B1%E5%8A%A8&quot;&gt;Wifi Stick 修复基带驱动&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;连接 WI-FI&lt;/h3&gt;
&lt;p&gt;为了安装软件包或进行其他操作, 我们须要使 Wifi Stick 接入互联网&lt;/p&gt;
&lt;p&gt;由于我们需要对网路进行操作, 请使用 &lt;code&gt;adb shell&lt;/code&gt; 连接 Wifi Stick 以免调整网路时 SSH 连接断开&lt;/p&gt;
&lt;p&gt;在大部分固件的系统内, 默认使用 NetworkManager 作为网路管理器, 我们可以使用 &lt;code&gt;nmcli&lt;/code&gt; 命令行工具连接 WI-FI&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;某些固件默认开启了 WI-FI 热点, 这会导致 WI-FI 设备被占用, 无法扫描现有 WI-FI (直接连接会覆盖配置不受影响, 如果你知道你的 WI-FI 名称就不需要管了). 要删除该配置, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmcli connection show
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;NAME   UUID                                  TYPE      DEVICE
USB    2eed87e1-0ca6-4625-8b07-d80514fe1ef3  ethernet  usb0
wifi   bb317ee5-d497-4f07-8815-7eac62e72b88  wifi      wlan0
modem  bbf76fd3-010e-402e-a68c-135f893c828b  gsm       --
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看 &lt;code&gt;DEVICE&lt;/code&gt; 为 &lt;code&gt;wlan*&lt;/code&gt; 的项, 然后删除&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmcli connection delete &quot;wifi&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;nmcli radio wifi on  # 开启 WI-FI
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如下命令是可选的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 扫描 WI-FI
nmcli device wifi rescan
# 列出 WI-FI
nmcli device wifi list
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;连接 WI-FI&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmcli device wifi connect &quot;&amp;lt;SSID&amp;gt;&quot; password &quot;&amp;lt;PASSWORD&amp;gt;&quot; [name &quot;&amp;lt;NAME&amp;gt;&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如, 要连接名为 &lt;code&gt;test-wifi&lt;/code&gt;, 密码为 &lt;code&gt;testtest&lt;/code&gt; 的 WI-FI 并命名为 &lt;code&gt;default-wlan&lt;/code&gt;, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmcli device wifi connect &quot;test-wifi&quot; password &quot;testtest&quot; name &quot;default-wlan&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后可以使用如下命令查看连接情况&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmcli connection show
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;软件包换源&lt;/h3&gt;
&lt;p&gt;为了加速在中国大陆境内的软件下载速度, 推荐更换 APT 软件源&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
下载速度过慢可以查看 &lt;a href=&quot;#wifi-stick-%E8%BF%9E%E6%8E%A5-wifi-%E5%90%8E%E9%80%9F%E7%8E%87%E8%BF%87%E6%85%A2&quot;&gt;Wifi Stick 连接 WIFI 后速率过慢&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

sudo tee /etc/apt/sources.list &amp;lt;&amp;lt;-&apos;EOF&apos;
deb https://mirror.nju.edu.cn/debian/ bullseye main contrib non-free
deb https://mirror.nju.edu.cn/debian-security/ bullseye-security main contrib non-free
EOF

sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 USB 接口模式&lt;/h3&gt;
&lt;p&gt;为了方便切换模式, 我们需要测试固件对于按钮的支持性&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 安装输入事件测试工具
sudo apt install evtest

# 启动, 并选择要测试的设备
sudo evtest --grab /dev/input/event0
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;/dev/input/event0&lt;/code&gt; 是按钮的设备标识, 请按照实际情况修改&lt;/p&gt;
&lt;p&gt;要列出全部的输入设备, 可以使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /proc/bus/input/devices | grep -E &apos;Name=|Handlers=&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在默认情况下, 按钮被映射到了 &lt;code&gt;KEY_RESTART&lt;/code&gt;, 导致按下会重启. &lt;code&gt;--grab&lt;/code&gt; 选项用于独占按钮而不再将按钮事件分发到 kernel, 从而避免重启&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;若无输出变化, 那么可能是按钮的触发电平在设备树中存在配置问题. 要修复该问题, 请参阅 &lt;a href=&quot;#%E6%9B%B4%E6%96%B0%E6%88%96%E6%9B%BF%E6%8D%A2-linux-%E5%86%85%E6%A0%B8&quot;&gt;更新或替换 Linux 内核&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;接下来, 我们要配置 RNDIS 等不同 USB 接口用途, 为了方便调试, 我们可以安装 &lt;code&gt;iproute2&lt;/code&gt; (也就是常见发行版内的 &lt;code&gt;ip&lt;/code&gt; 命令)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install iproute2
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;禁用现有配置脚本&lt;/h4&gt;
&lt;p&gt;为了避免对 USB 接口的重复初始化和占用, 我们需要禁用现有的配置脚本服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl disable --now mobian-usb-gadget.service
sudo systemctl disable --now mobian-setup-usb-network.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;安装接口模式切换工具&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;下载可执行文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-usb-switcher/releases/latest&quot;&gt;wifi-stick-usb-switcher | GitHub Releases&lt;/a&gt; 下载对应 CPU 架构的可执行文件压缩包, 一般为 &lt;code&gt;cli-linux-arm64&lt;/code&gt; (注意不要下载 &lt;code&gt;cli-linux-amd64&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;解压并将 &lt;code&gt;cli&lt;/code&gt; 保存为 &lt;code&gt;/usr/local/bin/usb-switcher&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;授予可执行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/usb-switcher
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装依赖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install dnsmasq udhcpc
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;配置启动脚本&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;来自 &lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-usb-switcher/raw/main/scripts/test.sh.example&quot;&gt;https://aka.lovemilk.top/github/wifi-stick-usb-switcher/raw/main/scripts/test.sh.example&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/lib/usb-switcher/start.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入如下内容, 按需修改必要参数&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
目前的实现需要保证至少提供 &lt;strong&gt;2&lt;/strong&gt; 个 LED&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash

set -euo pipefail

exec /usr/local/bin/usb-switcher daemon --devnode /dev/input/event0 --led /sys/class/leds/blue\:wifi --led /sys/class/leds/red\:os --led /sys/class/leds/green\:internet --config-fs /sys/kernel/config/usb_gadget/g1 &quot;$@&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;授予可执行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/lib/usb-switcher/start.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/systemd/system/wifi-stick-usb-switcher.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=wifi-stick-usb-switcher

[Service]
Type=simple
ExecStart=/usr/local/lib/usb-switcher/start.sh
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载并启用服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now wifi-stick-usb-switcher.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;使用方法&lt;/h4&gt;
&lt;p&gt;在默认情况下 USB Gadget 为 RNDIS 模式, 按下按钮切换为 ADB 模式, 再次按钮轮回 RNDIS 模式 (目前只有 &lt;strong&gt;2&lt;/strong&gt; 个主要模式, 每个主要模式可能会有若干子模式)&lt;/p&gt;
&lt;p&gt;在初始化时会依次亮起每个 LED, 首个传入的 LED 亮起为 RNDIS 模式, 第二个传入的 LED 亮起为 ADB 模式&lt;/p&gt;
&lt;p&gt;在切换中的状态为对应模式 LED 闪烁, 切换成功为对应 LED 常亮&lt;/p&gt;
&lt;p&gt;要获取更多参数, 请运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/bin/usb-switcher daemon --help
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;[可选] 配置 Fileserver&lt;/h3&gt;
&lt;p&gt;为了将 Wifi Stick 作为一个不使用 USB 存储接口的 U 盘, 可以配置 Fileserver, 利用网路通讯传输文件&lt;/p&gt;
&lt;p&gt;轻量的 Fileserver 可以选用 &lt;a href=&quot;https://github.com/sigoden/dufs&quot;&gt;https://github.com/sigoden/dufs&lt;/a&gt; 或 &lt;a href=&quot;https://github.com/spcnvdr/go-fileserver&quot;&gt;https://github.com/spcnvdr/go-fileserver&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;若要使用较为完善的用户认证系统, 可以选择稍大的 &lt;a href=&quot;https://github.com/filebrowser/filebrowser&quot;&gt;https://github.com/filebrowser/filebrowser&lt;/a&gt; (但不支持匿名访问)&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;下文我们将以 dufs 为例, 配置&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;专用的文件分享与上传文件夹, 用户与 dufs 服务&lt;/li&gt;
&lt;li&gt;Caddy 反向代理, 并携带 internal TLS 以防止不受信电脑监听/中间人攻击&lt;/li&gt;
&lt;li&gt;非 80/443/8080 约定俗成端口号 以绕过部分网路防火墙&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;创建文件分享与上传专用用户及其文件夹&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;以特定 UID 创建用户&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo useradd -u 3443 -m file
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;创建文件夹并保留写入的 Group&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /www/files
sudo chown file:file -R /www/files
# 保留新建文件的 Group
sudo chmod g+s -R /www/files
sudo chmod 750 -R /www/files
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;配置 dufs&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;a href=&quot;https://github.com/sigoden/dufs/releases/latest&quot;&gt;sigoden/dufs | GiGitHub Releasest&lt;/a&gt; 下载对应架构的 ELF, 并解压至&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/bin/dufs
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;配置启动脚本&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/lib/dufs/start.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入如下内容, 按需修改必要参数 (默认端口 5000)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash

set -euo pipefail

/usr/local/bin/dufs --bind 127.0.0.1 --hidden &apos;.*&apos; --allow-upload --allow-search --allow-hash /www/files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;授予可执行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/lib/dufs/start.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/systemd/system/dufs.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=dufs

[Service]
User=file
Group=file
Type=fork
ExecStart=/usr/bin/bash /usr/local/lib/dufs/start.sh

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载并启用服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now dufs.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;配置 Caddy&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;安装 Caddy&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://caddyserver.com/docs/install&quot;&gt;https://caddyserver.com/docs/install&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos; | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos; | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
sudo chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
对于旧版 &lt;code&gt;apt&lt;/code&gt;, 须要将如下命令的输出手动追加到&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/apt/sources.list
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;curl -1sLf &amp;gt; &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;启用 Caddy 服务&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为了避免没有网路连接导致 Caddy 不启动, 我们需要编辑 Caddy Service&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl edit caddy.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上方注释下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;### Editing /etc/systemd/system/caddy.service.d/override.conf
### Anything between here and the comment below will become the new contents of the file
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Requires=
After=
After=network.wants
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以清空 &lt;code&gt;Requires&lt;/code&gt; 并将 &lt;code&gt;After&lt;/code&gt; 替换为 &lt;code&gt;network.wants&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;重载并启动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now caddy.service
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;修改 Caddyfile&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;/etc/caddy/Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{  # 全局配置
}


(internal_tls) {
    tls {
        issuer internal
        on_demand  # 按照 domain/IP 动态生成 TLS 证书
    }
}

# 80 与 3000 端口 HTTP
:80, :3000 {
    reverse_proxy 127.0.0.1:5000
}


# 443 与 3001 端口 HTTPS
:443, :3001 {
    import internal_tls
    reverse_proxy 127.0.0.1:5000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
动态生成 TLS 证书仅限受信任环境, 无校验情况下任意域名均可作为合法的 TLS 目标 Host&lt;/p&gt;
&lt;p&gt;要在非可信环境下动态生成 TLS 证书, 请配置 &lt;strong&gt;TLS 签发名称质询服务&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{  # 全局配置
  on_demand_tls {
      ask &amp;lt;URL&amp;gt;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Caddy 会请求 &lt;code&gt;&amp;lt;URI&amp;gt;?domain=&amp;lt;domain&amp;gt;&lt;/code&gt;, 并在 API 返回非 200 时拒绝生成 TLS 证书&lt;/p&gt;
&lt;p&gt;完整实现与配置请参阅 &lt;a href=&quot;#caddy-%E5%8A%A8%E6%80%81-tls-%E7%AD%BE%E5%8F%91%E5%90%8D%E7%A7%B0%E8%B4%A8%E8%AF%A2%E6%9C%8D%E5%8A%A1&quot;&gt;Caddy 动态 TLS 签发名称质询服务&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;重载 Caddy 配置&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl reload caddy.service
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;至此, 你的 Wifi Stick 就可以作为一个随身 U 盘使用了 :)&lt;/p&gt;
&lt;h3&gt;[可选] 配置 Webshell&lt;/h3&gt;
&lt;p&gt;在一些情况下, 连接 Wifi Stick 的宿主机可能没有 SSH 套件, 或不能打开终端, 这会使得我们在一些时候难以连接至 Wifi Stick 修改配置或运行脚本&lt;/p&gt;
&lt;p&gt;但在大部分情况下, 宿主机会有浏览器, 尤其是基于 Chromium 的浏览器, 所以我们可以配置 Webshell, 以便随时随地通过浏览器访问 Wifi Stick 命令行&lt;/p&gt;
&lt;h4&gt;安装 ttyd&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;ttyd is a simple command-line tool for sharing terminal over the web&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install ttyd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若 apt 无法安装 ttdy, 可以从 &lt;a href=&quot;https://github.com/tsl0922/ttyd/releases/latest&quot;&gt;tsl0922/ttyd | GitHub Releases&lt;/a&gt; 下载对应 CPU 架构的 ELF并保存至&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/bin/ttyd
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;配置 ttyd 服务&lt;/h4&gt;
&lt;p&gt;创建服务&lt;/p&gt;
&lt;p&gt;为了保证我们可以作为用户正常登录, 并带有用户环境变量 (以便运行 &lt;code&gt;systemctl --user&lt;/code&gt;), 我们需要使用 &lt;code&gt;login&lt;/code&gt; 作为 ttyd 的目标启动程序&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/systemd/system/ttyd.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=ttyd

[Service]
Type=simple
WorkingDirectory=%h
# 若老旧设备无法渲染终端, 可添加 `-t rendererType=dom` 禁用 WebGL
ExecStart=/usr/bin/env ttyd -i 127.0.0.1 -p 7681 -w %h -W login


[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载并启用服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl daemon-reload
systemctl enable --now ttyd.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;配置 Caddy&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;/etc/caddy/Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按需求配置端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 端口号自行修改
:2222 {
    import internal_tls

    # HTTP Basic Auth 鉴权, 修改用户密码
    # 密码使用 `caddy hash-password` 生成
    # 如果想仅用户 Linux 鉴权可以不要
    basic_auth {
        # user:password
        user $2a$14$hCju96r6iSA552fkUUfWrO0tjC1w0otjkfHazbQLIHpXjoRB9vcoO
    }

    reverse_proxy 127.0.0.1:7681
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载 Caddy 配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl reload caddy.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;其他配置 / See Also&lt;/h2&gt;
&lt;h3&gt;连接 RNDIS 设备&lt;/h3&gt;
&lt;h4&gt;连接 Windows 设备&lt;/h4&gt;
&lt;p&gt;将 Wifi Stick 插入 Windows 设备的 USB 接口&lt;/p&gt;
&lt;p&gt;部分固件可以直接被识别为 RNDIS 设备. 在未配置 USB 模式切换情况下, 若固件使用了融合接口, 使 Wifi Stick 同时提供了 RNDIS 设备和 ADB 设备,  应该可以在 Windows 侧看到一个驱动未安装 (代码: 28) 的 RNDIS 设备 (位于 &lt;em&gt;其他设备&lt;/em&gt; 类别)&lt;/p&gt;
&lt;p&gt;双击该设备, 单击 &quot;更新驱动程序&quot; &amp;gt; &quot;浏览我的电脑以查找驱动程序&quot; &amp;gt; &quot;让我从计算机的可用驱动程序列表中选取&quot; &amp;gt; 在 &quot;常见硬件类型&quot; 内选择 &quot;网路适配器&quot; &amp;gt; 厂商选择 &quot;Microsoft&quot;, 型号选择最下面的 &quot;远程 NDIS 兼容设备&quot; (Windows 7 操作系统厂商选择 &quot;Microsoft Corporation&quot;, 型号选择 &quot;Remote NDIS Compatible Device&quot;) &amp;gt; &quot;下一页&quot; &amp;gt; &quot;是&quot; (强制安装驱动程序)&lt;/p&gt;
&lt;p&gt;此时, 可以看到 Windows 弹出一个新的网路连接, 也新增了一个网路适配器, 并获取到了 IP 地址&lt;/p&gt;
&lt;p&gt;若在强制指定驱动程序后电脑自动重启, 请参阅 &lt;a href=&quot;#%E9%83%A8%E5%88%86%E6%83%85%E5%86%B5%E4%B8%8B%E5%9C%A8-windows-%E4%B8%8A%E6%98%BE%E7%A4%BA-rndis-%E8%AE%BE%E5%A4%87%E4%BD%86%E6%98%AF%E4%BB%A3%E7%A0%81-28&quot;&gt;部分情况下在 Windows 上显示 RNDIS 设备但是代码 28&lt;/a&gt; 解决问题&lt;/p&gt;
&lt;p&gt;如果在部分高版本 Windows 10 操作系统中, 即使手动选择了 RNDIS 设备也仍可能显示未安装驱动, 或在安装驱动程序后显示该设备需要进一步安装驱动程序&lt;/p&gt;
&lt;p&gt;一个可能的解决方法是禁用复合设备, 将融合设备修改为纯 RNDIS 设备, 参考 &lt;a href=&quot;#%E9%85%8D%E7%BD%AE-usb-%E6%8E%A5%E5%8F%A3%E6%A8%A1%E5%BC%8F&quot;&gt;配置 USB 接口模式&lt;/a&gt; 修改为仅 RNDIS 网路传输&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
由于 Linux 内核对 RNDIS 的设备枚举采用了 ACM 伪装 (而非 微软规范) 的写法, 导致在 Windows 7 操作系统上开启 ICS (Internet Connection Sharing) 后会诱发驱动崩溃导致蓝屏&lt;/p&gt;
&lt;p&gt;要解决该问题, 只能 &lt;a href=&quot;#%E6%9B%BF%E6%8D%A2-linux-%E5%86%85%E6%A0%B8%E4%BB%A5%E4%BD%BF%E7%94%A8%E5%BE%AE%E8%BD%AF%E8%A7%84%E8%8C%83-rndis-%E8%AE%BE%E5%A4%87%E6%9E%9A%E4%B8%BE&quot;&gt;替换 Linux 内核以使用微软规范 RNDIS 设备枚举&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;连接 Linux/Unix 设备&lt;/h3&gt;
&lt;p&gt;对于 Linux 和 macOS 等 *nux 操作系统, 请将 Wifi Stick 插入 USB 接口, 后列出网卡及其 IP 地址&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如下命令可能仅适用于现代 Linux 操作系统, macOS 请自行查找解决方法 &lt;s&gt;其实是我没钱买 mac&lt;/s&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;ip a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应该可以看到类似如下的设备&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;6: enp0s20f0u8: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 22:39:e2:ef:40:d0 brd ff:ff:ff:ff:ff:ff
    altname enx2239e2ef40d0
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;下文的 &lt;code&gt;enp0s20f0u8&lt;/code&gt; 均指代网卡名称&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;激活连接: 对于 NetworkManger 用户, 可以运行如下命令, 以保证当前互联网连接不会被替换, 同时连接两(多)个以太网卡&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export REGULAR_DEVNAME=&amp;lt;regular-device&amp;gt;
export WIFISTICK_DEVNAME=enp0s20f0u8
export WIFISTICK_CONNECTION=wifi-stick

# 在不存在时创建设备 `WIFISTICK_CONNECTION`
if ! nmcli connection show &quot;$WIFISTICK_CONNECTION&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    nmcli connection add type ethernet con-name &quot;$WIFISTICK_CONNECTION&quot; ifname &quot;$WIFISTICK_DEVNAME&quot;
fi

# 降低 `WIFISTICK_CONNECTION` 设备的优先级
nmcli connection modify &quot;$WIFISTICK_CONNECTION&quot; \
    ifname &quot;$WIFISTICK_DEVNAME&quot; \
    ipv4.route-metric 200 \
    ipv6.route-metric 200

# 设定当前互联网连接网卡设备至最高优先级
nmcli connection modify &quot;$(nmcli -g GENERAL.CONNECTION device show &quot;$REGULAR_DEVNAME&quot;)&quot; ipv4.route-metric 0 ipv6.route-metric 0

# 启动 `WIFISTICK_CONNECTION`
nmcli connection up &quot;$WIFISTICK_CONNECTION&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;ipv4.route-metric&lt;/code&gt; / &lt;code&gt;ipv6.route-metric&lt;/code&gt; 是 IPv4 / IPv6 流量权重, 其值越小代表 NetworkManager 更乐意将网路流量使用该连接传输&lt;/p&gt;
&lt;p&gt;&lt;code&gt;regular-device&lt;/code&gt; 为当前互联网连接网卡设备名, 或者也可以直接将 &lt;code&gt;$(nmcli -g GENERAL.CONNECTION device show &quot;$REGULAR_DEVNAME&quot;)&lt;/code&gt; 替换为实际连接名称, 如 &lt;code&gt;有线连接 1&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后, 再次使用列出网卡及其 IP 地址的命令, 应该已经可以获取到 IP 地址了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; ip a

6: enp0s20f0u8: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1400 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 22:39:e2:ef:40:d0 brd ff:ff:ff:ff:ff:ff
    altname enx2239e2ef40d0
    inet 10.22.33.91/24 brd 10.22.33.255 scope global dynamic noprefixroute enp0s20f0u8
       valid_lft 3538sec preferred_lft 3538sec
    inet6 fe80::c29d:e98d:c3cc:6067/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
若要使 Wifi Stick 可以使用主机网路作为出口, 请参阅 &lt;a href=&quot;#%E9%85%8D%E7%BD%AE-rndis-%E6%A8%A1%E5%BC%8F%E4%B8%8B-wifi-stick-%E4%BD%BF%E7%94%A8%E4%B8%BB%E6%9C%BA%E7%BD%91%E8%B7%AF%E5%87%BA%E5%8F%A3&quot;&gt;配置 RNDIS 模式下, Wifi Stick 使用主机网路出口&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;配置 RNDIS 模式下, Wifi Stick 使用主机网路出口&lt;/h3&gt;
&lt;p&gt;将 Wifi Stick 插入 Windows 设备的 USB 接口&lt;/p&gt;
&lt;h4&gt;Windows 配置&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;打开当前网路出口的网卡连接&lt;/li&gt;
&lt;li&gt;右键网卡 &amp;gt; &quot;属性&quot;&lt;/li&gt;
&lt;li&gt;转到属性面板的 &quot;共享&quot; 选项卡&lt;/li&gt;
&lt;li&gt;勾选 &quot;允许其他网路用户通过此计算机的 Internet 连接来连接&quot;&lt;/li&gt;
&lt;li&gt;在 &quot;家庭网路连接&quot; 下拉菜单中, 选择你的 RNDIS 虚拟网卡, 并单击确定&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;操作会开启 Windows ICS (Internet Connection Sharing), 从而使 Wifi Stick 可以访问宿主机网络出口&lt;/p&gt;
&lt;p&gt;此时 Windows 会将 RNDIS 虚拟网卡 IP 强制修改为 &lt;code&gt;192.168.137.1&lt;/code&gt; 并将子网掩码修改为 &lt;code&gt;255.255.255.0&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;或是 &lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters&lt;/code&gt; 指定的 &lt;code&gt;ScopeAddress&lt;/code&gt; IP 与 &lt;code&gt;DhcpSubnetMask&lt;/code&gt; 掩码 (&lt;code&gt;x.x.x.x&lt;/code&gt; 格式的字符串 &lt;code&gt;REG_SZ&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;!-- ### Linux 设备
TODO --&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;由于 Wifi Stick 的 RNDIS 网卡 没有自动获取 IP, 且没有交由 NetworkManager 管理, Wifi Stick 无路由也无该网段的 IP 进行请求&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
由于 Linux 内核对 RNDIS 的设备枚举采用了 ACM 伪装 (而非 微软规范) 的写法, 导致在 Windows 7 操作系统上进行如上配置开启 ICS (Internet Connection Sharing) 后会诱发驱动崩溃导致蓝屏&lt;/p&gt;
&lt;p&gt;要解决该问题, 只能 &lt;a href=&quot;#%E6%9B%BF%E6%8D%A2-linux-%E5%86%85%E6%A0%B8%E4%BB%A5%E4%BD%BF%E7%94%A8%E5%BE%AE%E8%BD%AF%E8%A7%84%E8%8C%83-rndis-%E8%AE%BE%E5%A4%87%E6%9E%9A%E4%B8%BE&quot;&gt;替换 Linux 内核以使用微软规范 RNDIS 设备枚举&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;解决方法是将 USB 接口模式切换器 更新至 &lt;code&gt;Commit: b54ade0e85d6724de892c9cc5e761c82a24df59d&lt;/code&gt; 或更新版本 (&lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-usb-switcher/commit/b54ade0e85d6724de892c9cc5e761c82a24df59d&quot;&gt;commit&lt;/a&gt; | &lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-usb-switcher/releases/tag/rolling-b54ade0&quot;&gt;release&lt;/a&gt; ), 并在 RNDIS 模式下长按按钮进入子模式切换模式, 并短按按钮将 RNDIS 由 LED 常亮的 RNDIS 主模式切换为 LED 慢闪的 RNDIS 从模式&lt;/p&gt;
&lt;p&gt;RNDIS 从模式会自动从 RNDIS 虚拟网卡的 DHCP 包中获取上游分配的 IP 段, 并自动配置 RNDIS 虚拟网卡的 IP 与路由表. 默认 IP 地址为对应网段 IP 最后段修改为 &lt;code&gt;.33&lt;/code&gt;, 或 &lt;code&gt;--rndis-client-ip&lt;/code&gt; 传入的 &lt;code&gt;x.x.x.x&lt;/code&gt; 的后缀&lt;/p&gt;
&lt;p&gt;例如传入的 &lt;code&gt;--rndis-client-ip&lt;/code&gt; 为 &lt;code&gt;0.0.22.33&lt;/code&gt;, 上游 IP 段为 &lt;code&gt;192.168.137.1/24&lt;/code&gt;, 那么 RNDIS 的 IP 则为 &lt;code&gt;192.168.137.33&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;同理, 当传入的 &lt;code&gt;--rndis-client-ip&lt;/code&gt; 为 &lt;code&gt;0.0.22.33&lt;/code&gt; 但上游 IP 段为 &lt;code&gt;192.168.137.1/16&lt;/code&gt; 时, RNDIS 的 IP 则为 &lt;code&gt;192.168.22.33&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;同时注意: 当上游 IP 段的子网掩码不是对齐 8 bit 时, 会将 RNDIS IP 设置为$\max{IP} - 2$, 例如上游 IP 段为 &lt;code&gt;192.168.137.1/29&lt;/code&gt; 时, RNDIS IP 则为 &lt;code&gt;192.168.137.7&lt;/code&gt; - 2 = &lt;code&gt;192.168.137.5&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;当 &lt;strong&gt;当子网掩码 &amp;gt;= &lt;code&gt;/30&lt;/code&gt; 时, RNDIS 会强制回退到 RNDIS 主模式&lt;/strong&gt;以免 IP 无法分配导致无法访问 Wifi Stick&lt;/p&gt;
&lt;h3&gt;替换 Linux 内核以使用微软规范 RNDIS 设备枚举&lt;/h3&gt;
&lt;p&gt;为解决 Windows 7 操作系统下使用 ICS 诱发驱动崩溃, 我们需要将 Linux 内核的 RNDIS 设备枚举修改为微软标准&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;接口 class/sub/proto&lt;/th&gt;
&lt;th&gt;Windows 匹配&lt;/th&gt;
&lt;th&gt;使用者&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;写法 A / 微软规范&lt;/td&gt;
&lt;td&gt;0xE0 / 01 / 03 (Wireless/RF/RNDIS)&lt;/td&gt;
&lt;td&gt;系统老 INF USB\Class_E0&amp;amp;SubClass_01&amp;amp;Prot_03 -&amp;gt; usb8023&lt;/td&gt;
&lt;td&gt;Android 手机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;写法 B / ACM 伪装&lt;/td&gt;
&lt;td&gt;0x02 / 02 / 0xFF (CDC-ACM vendor)&lt;/td&gt;
&lt;td&gt;无系统 INF 匹配, 仅使用 MS OS compat&lt;/td&gt;
&lt;td&gt;Linux Rndis Usb Gadget Function (&lt;code&gt;f_rndis&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;参考 &lt;a href=&quot;https://170721.xyz/shizuku/065919.html&quot;&gt;https://170721.xyz/shizuku/065919.html&lt;/a&gt; / &lt;a href=&quot;https://www.kancloud.cn/handsomehacker/openstick/2637565&quot;&gt;https://www.kancloud.cn/handsomehacker/openstick/2637565&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们需要修改 RNDIS 的 USB 设备枚举为微软标准&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;diff --git a/drivers/usb/gadget/function/f_rndis.c b/drivers/usb/gadget/function/f_rndis.c
index ee95e8f5f..d23eca221 100644
--- a/drivers/usb/gadget/function/f_rndis.c
+++ b/drivers/usb/gadget/function/f_rndis.c
@@ -115,9 +115,15 @@ static struct usb_interface_descriptor rndis_control_intf = {
 	/* .bInterfaceNumber = DYNAMIC */
 	/* status endpoint is optional; this could be patched later */
 	.bNumEndpoints =	1,
-	.bInterfaceClass =	USB_CLASS_COMM,
-	.bInterfaceSubClass =   USB_CDC_SUBCLASS_ACM,
-	.bInterfaceProtocol =   USB_CDC_ACM_PROTO_VENDOR,
+	/* RNDIS 控制接口按微软白皮书写成 Wireless Controller (0xE0/01/03),
+	 * 与 Android 手机(如 OPPO 22d9:2766)一致 —— Windows 老 INF
+	 * (usb8023 &quot;Remote NDIS based Internet Sharing Device&quot;) 按
+	 * USB\Class_E0&amp;amp;SubClass_01&amp;amp;Prot_03 匹配;原 ACM 伪装(0x02/02/FF)
+	 * 无系统 INF 匹配,只能靠 MS OS compat,Win7 + ICS 下蓝屏(0xD1)。
+	 * Linux host 的 rndis_host id_table 同时收 0xE0/01/03 与 0x02/02/FF。 */
+	.bInterfaceClass =	USB_CLASS_WIRELESS_CONTROLLER,
+	.bInterfaceSubClass =	1,
+	.bInterfaceProtocol =	3,
 	/* .iInterface = DYNAMIC */
 };
 
@@ -176,9 +182,9 @@ rndis_iad_descriptor = {
 
 	.bFirstInterface =	0, /* XXX, hardcoded */
 	.bInterfaceCount = 	2,	// control + data
-	.bFunctionClass =	USB_CLASS_COMM,
-	.bFunctionSubClass =	USB_CDC_SUBCLASS_ETHERNET,
-	.bFunctionProtocol =	USB_CDC_PROTO_NONE,
+	.bFunctionClass =	USB_CLASS_WIRELESS_CONTROLLER,
+	.bFunctionSubClass =	1,
+	.bFunctionProtocol =	3,
 	/* .iFunction = DYNAMIC */
 };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者使用对修改完成的仓库 &lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-linux&quot;&gt;wifi-stick-linux&lt;/a&gt;, &lt;strong&gt;并在使用 GitHub Action 构建时勾选 &lt;code&gt;enable_rndis_ms_iad&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要输入修改完成的内核, 请参阅 &lt;a href=&quot;#%E6%9B%B4%E6%96%B0%E6%88%96%E6%9B%BF%E6%8D%A2-linux-%E5%86%85%E6%A0%B8&quot;&gt;更新或替换 Linux 内核&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;并在安装完成后将接 &lt;a href=&quot;#%E9%85%8D%E7%BD%AE-usb-%E6%8E%A5%E5%8F%A3%E6%A8%A1%E5%BC%8F&quot;&gt;口模式切换工具&lt;/a&gt; 更新至 &lt;code&gt;Commit: 69d73774b1801b99487c135fb61e746deb05ec2b&lt;/code&gt; (&lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-usb-switcher/commit/69d73774b1801b99487c135fb61e746deb05ec2b&quot;&gt;commit&lt;/a&gt; | &lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-usb-switcher/releases/tag/rolling-69d7377&quot;&gt;release&lt;/a&gt;) 或更新版本&lt;/p&gt;
&lt;h3&gt;Wifi Stick 修复基带驱动&lt;/h3&gt;
&lt;p&gt;按照 &lt;a href=&quot;#1-%E6%8F%90%E5%8F%96%E6%88%96%E6%8C%82%E8%BD%BD-system-%E5%88%86%E5%8C%BA&quot;&gt;提取或挂载 system 分区&lt;/a&gt; 或其他方法提取出 modem 分区, 并将分区内的文件全部内容复制至 Wifi Stick 的 &lt;code&gt;/lib/firmware&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;例如 &lt;strong&gt;在 Wifi Stick 上&lt;/strong&gt; 运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cp –v &amp;lt;mount&amp;gt;/image/modem* mba.* /lib/firmware
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后重启 Wifi Stick&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
对于 9008 模式, 使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo edl r modem modem.img
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即可提取 modem 分区&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;使用如下命令即可查看基带状态&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mmcli -m 0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;更新或替换 Linux 内核&lt;/h3&gt;
&lt;p&gt;在部分情况下, 默认编译的内核可能无法满足我们的需求, 或存在兼容性问题 (例如按钮无法正常工作)&lt;/p&gt;
&lt;p&gt;为此, 我们需要更新或替换 Linux 内核以满足自定义需求&lt;/p&gt;
&lt;p&gt;要使用新的 Linux 内核, 我们需要同时更新 &lt;code&gt;linux-image&lt;/code&gt; 与 &lt;code&gt;linux-headers&lt;/code&gt; 软件包, 并刷写实际存储有内核本体的 boot 分区&lt;/p&gt;
&lt;p&gt;对于 &lt;code&gt;ufi001c&lt;/code&gt; 的同一刷机包设备, 可以使用 &lt;em&gt;修复过的 boot.img&lt;/em&gt; (deb 包大部分情况下可不更新): &lt;strong&gt;ufi001c-boot.img&lt;/strong&gt; (&lt;a href=&quot;/static/ufi001c-boot.img&quot;&gt;当前网站&lt;/a&gt; / &lt;a href=&quot;https://aka.lovemilk.top/github/notes/releases/tag/ufi001c-boot&quot;&gt;GitHub Release&lt;/a&gt;) 并直接刷入即可&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果您的设备内核编译配置与我们的配置不一样, 请在源系统内先安装 &lt;code&gt;linux-image&lt;/code&gt; 和 &lt;code&gt;linux-headers&lt;/code&gt; 两个 deb 包后再刷入 boot 分区&lt;/p&gt;
&lt;p&gt;deb 包可以在构建 Artifacts 的 &lt;code&gt;deb-packages-&amp;lt;hash&amp;gt;&lt;/code&gt; 下载&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dpkg -i linux-*.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h4&gt;修复按钮无法工作&lt;/h4&gt;
&lt;p&gt;对于其他设备, 可以自行修改设备树并编译打包 (仅打包 boot.img 皆可). 由于我们没有修改内核编译配置, 要使用修复完成的 boot.img, 在固件正常刷入之后, &lt;strong&gt;仅须覆盖刷写 boot 分区&lt;/strong&gt;, 不需要改变其他分区&lt;/p&gt;
&lt;p&gt;例如, 设备为 &lt;code&gt;ufi001c&lt;/code&gt;, 那么需要将内核源码仓库的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-ufi001c.dts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reset {
    label = &quot;Restart&quot;;
    gpios = &amp;lt;&amp;amp;msmgpio 37 GPIO_ACTIVE_LOW&amp;gt;;
    linux,code = &amp;lt;KEY_RESTART&amp;gt;;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的 &lt;code&gt;GPIO_ACTIVE_LOW&lt;/code&gt; 改为 &lt;code&gt;GPIO_ACTIVE_HIGH&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reset {
    label = &quot;Restart&quot;;
    gpios = &amp;lt;&amp;amp;msmgpio 37 GPIO_ACTIVE_HIGH&amp;gt;;
    linux,code = &amp;lt;KEY_RESTART&amp;gt;;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最下方的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;msmgpio {
	msmgpio_leds: msmgpio-leds {
		pins = &quot;gpio0&quot;,&quot;gpio1&quot;,&quot;gpio2&quot;,&quot;gpio3&quot;,&quot;gpio20&quot;,&quot;gpio21&quot;,&quot;gpio22&quot;;
		function = &quot;gpio&quot;;

		bias-disabled;
	};

	gpio_keys_default: gpio_keys_default {
		pins = &quot;gpio37&quot;;
		function = &quot;gpio&quot;;

		drive-strength = &amp;lt;8&amp;gt;;
		input-enable;
		bias-pull-up;
	};
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的 &lt;code&gt;bias-pull-up&lt;/code&gt; 改为 &lt;code&gt;bias-pull-down&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;msmgpio {
	msmgpio_leds: msmgpio-leds {
		pins = &quot;gpio0&quot;,&quot;gpio1&quot;,&quot;gpio2&quot;,&quot;gpio3&quot;,&quot;gpio20&quot;,&quot;gpio21&quot;,&quot;gpio22&quot;;
		function = &quot;gpio&quot;;

		bias-disabled;
	};

	gpio_keys_default: gpio_keys_default {
		pins = &quot;gpio37&quot;;
		function = &quot;gpio&quot;;

		drive-strength = &amp;lt;8&amp;gt;;
		input-enable;
		bias-pull-down;
	};
};
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;感谢 敬爱的&amp;lt;pe&amp;gt;&lt;a href=&quot;https://github.com/dezige131&quot;&gt;dezige131&lt;/a&gt;&amp;lt;/pe&amp;gt; 对设备树修改与 boot.img 打包支持&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;或者使用对 &lt;code&gt;ufi001c&lt;/code&gt; 修复完成的仓库 &lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-linux&quot;&gt;wifi-stick-linux&lt;/a&gt; 并使用 GitHub Action 构建&lt;/p&gt;
&lt;p&gt;构建 Artifacts 的 &lt;code&gt;&amp;lt;device&amp;gt;-boot-&amp;lt;hash&amp;gt;&lt;/code&gt; (例如 &lt;code&gt;ufi001c-boot-5efceb9ea5d1c76064b13e79b31de582490b4a16&lt;/code&gt;) 为对应设备型号的 Zip 压缩包, 包含 boot 镜像&lt;/p&gt;
&lt;h3&gt;Wifi Stick 连接 WIFI 后速率过慢&lt;/h3&gt;
&lt;p&gt;由于 Wifi Stick 仅支持 2.4 Ghz 的 WIFI, 且功率不大, 请尝试关闭周围的蓝牙设备&lt;/p&gt;
&lt;h3&gt;Emmc 写入过慢&lt;/h3&gt;
&lt;p&gt;尝试查看当前闪存调度器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /sys/block/mmcblk0/queue/scheduler
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[mq-deadline] kyber none
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;echo none &amp;gt; /sys/block/mmcblk0/queue/scheduler
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 dd 测试&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dd if=/dev/zero of=./testfile bs=1M count=100 conv=fdatasync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在使用 &lt;code&gt;mq-deadline&lt;/code&gt; 时, 写入速度为 &lt;code&gt;7.9 MB/s&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt; 为 &lt;code&gt;8.5 MB/s&lt;/code&gt;, &lt;code&gt;kyber&lt;/code&gt; 为 &lt;code&gt;8.2 MB/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果要永久应用一个调度器, 请写入 UDev 规则&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/udev/rules.d/60-mmc-scheduler.rules
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ACTION==&quot;add|change&quot;, KERNEL==&quot;mmcblk0&quot;, ATTR{queue/scheduler}=&quot;&amp;lt;调度器&amp;gt;&quot;
ACTION==&quot;add|change&quot;, KERNEL==&quot;mmcblk0&quot;, ATTR{queue/scheduler}=&quot;kyber&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;清理磁盘 (emmc) 空间&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 删除孤立依赖包
sudo apt autoremove

# 删除孤立依赖包及其配置文件
# sudo apt autoremove --purge

# 删除 apt 包缓存 (不包括当前版本的包)
sudo apt autoclean

# 删除未使用依赖
# 需要先安装 `deborphan`
# sudo apt install deborphan
sudo apt purge $(deborphan)

# 限制日志只保留最近 2 天的内容
sudo journalctl --vacuum-time=2d
# 限制日志占用空间不大于 100M
sudo journalctl --vacuum-size=100M
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;libconfig9&lt;/code&gt; 库是 USB 接口配置工具 &lt;code&gt;gc&lt;/code&gt; 必要的, 若不小心删除可以重新安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install libconfig9
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;清除 Ruby 残留&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt remove ruby ruby-minitest ruby-net-telnet ruby-power-assert ruby-test-unit ruby-xmlrpc ruby2.7-doc rubygems-integration
sudo rm -rf /usr/share/ri
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;清除不需要的语言&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install localepurge
sudo localepurge
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Systemd 与 screen 配合运作&lt;/h3&gt;
&lt;p&gt;一些游戏服务端需要接收 stdin 输入服务端命令, 但使用 Systemd 运行的 Service 不能交互式传入 stdin&lt;/p&gt;
&lt;p&gt;为解决该问题, 我们可以使用 Systemd 运行 Screen&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# start.sh
#!/bin/bash

set -e

SCREEN_NAME=&apos;name&apos;
COMMAND=&apos;example-command-like java -jar server.jar&apos;

# if [ -n &quot;$INVOCATION_ID&quot; ]; then
#     COMMAND=&quot;$COMMAND 2&amp;gt;&amp;amp;1 | tee &amp;gt;(systemd-cat -t &apos;$SCREEN_NAME&apos;)&quot;
# fi

screen -dmS &quot;$SCREEN_NAME&quot; /bin/bash -c &quot;$COMMAND 2&amp;gt;&amp;amp;1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# example.service
[Unit]
Description=Example
After=network.target

[Service]
Type=forking
WorkingDirectory=/path/to/workdir
ExecStart=/bin/bash start.sh

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;部分情况下在 Windows 上显示 RNDIS 设备但是代码 28&lt;/h3&gt;
&lt;p&gt;一些情况下, USB 可能因为缺少或存在无法识别/类型错误的 &lt;a href=&quot;https://learn.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors&quot;&gt;Microsoft OS descriptors for USB devices&lt;/a&gt; 导致显示设备异常 (如代码 28), 部分老旧的 Windows 甚至会在 &lt;a href=&quot;#%E8%BF%9E%E6%8E%A5-windows-%E8%AE%BE%E5%A4%87&quot;&gt;手动指定设备驱动&lt;/a&gt; 后关闭对话框时重启 Windows, 导致在部分被设置有开机还原系统 (如冰点还原) 上使用不便&lt;/p&gt;
&lt;p&gt;为解决此问题, 我们可以在指定驱动后不关闭 RNDIS 配置窗口, 知道需要关机或重启时直接进行电源操作&lt;/p&gt;
&lt;p&gt;或是 &lt;strong&gt;将 &lt;a href=&quot;#%E9%85%8D%E7%BD%AE-usb-%E6%8E%A5%E5%8F%A3%E6%A8%A1%E5%BC%8F&quot;&gt;接口模式切换工具&lt;/a&gt; 更新至 &lt;code&gt;Commit: bee5ce4cfc6db21a42bb11dc6e1a8d0cb2a68b8c&lt;/code&gt; (&lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-usb-switcher/commit/bee5ce4cfc6db21a42bb11dc6e1a8d0cb2a68b8c&quot;&gt;commit&lt;/a&gt; | &lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-usb-switcher/releases/tag/rolling-055c96e&quot;&gt;release&lt;/a&gt;) 或更新版本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在这些版本中, 我们修改了 RNDIS USB Gadget 的供应商 ID 和产品 ID, 以便使 Windows 可以绕过 MS OS descriptors 检查直接 &lt;s&gt;非常高兴&lt;/s&gt; 地认可我们的 RNDIS 设备&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如果你想查看 USB 接口信息以便调试, 可以下载 &lt;a href=&quot;https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/usbview&quot;&gt;USB Viewer&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;!-- ### 将 Wifi 设置为 Host 模式
部分情况下, 一些设备可能无法使用 USB 接口传输数据, 为了应对各种工况, 我们可以配置 Wifi Host 模式 (类似于 Wifi 热点) 并与 RNDIS 使用同一个 Host IP, 以便实现用户操作透明转换 (不需要手动修改 URL/IP 地址)&lt;/p&gt;
&lt;p&gt;TODO --&amp;gt;&lt;/p&gt;
&lt;h3&gt;Caddy 无法在 Windows 7 运行&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/caddyserver/caddy/issues/3076&quot;&gt;https://github.com/caddyserver/caddy/issues/3076&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装旧版本 (不高于 Caddy v2.7.0) 的 Caddy 即可&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/caddyserver/caddy/releases/tag/v2.7.0&quot;&gt;v2.7.0 / caddyserver/caddy | GitHub Release&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Caddy 动态 TLS 签发名称质询服务&lt;/h3&gt;
&lt;p&gt;为了保证 Caddy 动态生成的 TLS 证书为合法的 Host, 我们需要配置 &lt;strong&gt;TLS 签发名称质询服务&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个简单的 Go 实现 &lt;em&gt;仅限私有 IP&lt;/em&gt; 参见 &lt;a href=&quot;https://aka.lovemilk.top/github/wifi-stick-usb-switcher/blob/main/tools/caddy-tls-ask/main.go&quot;&gt;tools/caddy-tls-ask/main.go | wifi-stick-usb-switcher.go&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{  # 全局配置
    on_demand_tls {
        ask http://127.0.0.1:50996/
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/systemd/system/caddy-tls-ask.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=caddy-tls-ask

[Service]
User=nobody
Group=nogroup
DynamicUser=yes

# filesystem readonly
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes

# no privileges
CapabilityBoundingSet=
NoNewPrivileges=yes
RestrictSUIDSGID=yes

# no namespace permission
RestrictRealtime=yes
LockPersonality=yes
MemoryDenyWriteExecute=yes

RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX

Type=fork
ExecStart=/path/to/caddy-tls-ask

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载并启用服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now caddy-tls-ask.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载 Caddy 配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl reload caddy.service
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>适用于 Pipewire 音频服务的低延迟网路音频传输至 Android 手机</title><link>https://aka.lovemilk.top/notes/posts/apps/pipewire-roc/roc/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/pipewire-roc/roc/</guid><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;为了减少耳机在电脑与手机间来回切换造成的麻烦, 我们可以配置 ROC (Real-time audio streaming over the network) Pipewire 模块或单独的 CLI 工具, 向 Receiver 推送音频&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/roc-streaming/roc-droid&quot;&gt;Roc for Android!&lt;/a&gt; 是一个 Android 应用, 其封装了 ROC 的 library, 以便用户可以在 Android 上使用 UI 配置 ROC&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://archlinux.org/packages/extra/x86_64/pipewire-roc/&quot;&gt;pipewire-roc&lt;/a&gt; 是 ROC 的 Pipewire 模块, 可以作为 Sender 或 Receiver&lt;/p&gt;
&lt;h2&gt;概念&lt;/h2&gt;
&lt;p&gt;Sender: 音频产生侧, 将产生的音频推送至接受侧
Receiver: 播放音频侧, 将被推送的音频播放&lt;/p&gt;
&lt;h2&gt;若要将 PC 作为 Sender&lt;/h2&gt;
&lt;h3&gt;Sender 安装&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装模块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S pipewire-roc
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置音频输出设备
在如下路径内创建任意名称的 &lt;code&gt;.conf&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/pipewire/pipewire.conf.d/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;context.modules = [
    {   name = libpipewire-module-roc-sink
        args = {
            fec.code = rs8m
            remote.ip = &amp;lt;receiver-ip&amp;gt;
            remote.source.port = 10001
            remote.repair.port = 10002
            remote.control.port = 10003
            sink.name = &quot;ROC-Phone-Sink&quot;
            sink.props = {
                node.name = &quot;roc-phone-sink&quot;
                node.description = &quot;Roc Phone Sink&quot;
            }
        }
    }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启服务以加载配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user restart pipewire wireplumber
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在需要时切换音频设备到 &lt;code&gt;Roc Phone Sink&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Receiver 安装&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载 &lt;a href=&quot;https://github.com/roc-streaming/roc-droid/releases/latest&quot;&gt;Roc for Android!&lt;/a&gt; 并安装&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开应用并在必要时将 &quot;耗电行为控制&quot; 改为 &quot;无限制&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择 &quot;Receiver&quot; 面板, 将 Sender 配置的 &lt;code&gt;&amp;lt;receiver-ip&amp;gt;&lt;/code&gt; 修改为显示的 IP 地址并重启服务, 并单击 &quot;START RECEIVER&quot; 即可&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;若要将 PC 作为 Receiver&lt;/h2&gt;
&lt;h3&gt;Receiver 安装&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装模块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S pipewire-roc
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置音频输入设备
在如下路径内创建任意名称的 &lt;code&gt;.conf&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/pipewire/pipewire.conf.d/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;context.modules = [
    {   name = libpipewire-module-roc-source
        args = {
            fec.code = rs8m
            local.ip = 0.0.0.0
            local.source.port = 10001
            local.repair.port = 10002
            local.control.port = 10003
            source.name = &quot;ROC-Phone-Source&quot;
            source.props = {
                node.name = &quot;roc-phone-source&quot;
                node.description = &quot;Roc Phone Source&quot;
                media.class = &quot;Audio/Source&quot;
                audio.position = [ FL FR ]
            }
        }
    }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启服务以加载配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user restart pipewire wireplumber
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Sender 安装&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载 &lt;a href=&quot;https://github.com/roc-streaming/roc-droid/releases/latest&quot;&gt;Roc for Android!&lt;/a&gt; 并安装&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开应用并在必要时将 &quot;耗电行为控制&quot; 改为 &quot;无限制&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择 &quot;Sender&quot; 面板, 修改 IP 地址为 PC IP 地址, 并选择 &quot;Currently playing apps&quot; 或 &quot;Microphone&quot; 作为输入源, 并单击 &quot;START SENDER&quot; 即可&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;延迟表现&lt;/h2&gt;
&lt;p&gt;个人体感上来说, ROC 的延迟略大于 Sunshine + Moonlight, 但是整体在可接受范围内, 并且是纯音频传输 (Moonlight 在不使用第三方修改版情况下只能同时传输音频和视频)&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>自托管堡垒机解决方案 | Teleport</title><link>https://aka.lovemilk.top/notes/posts/deployment/teleport/installation/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/teleport/installation/</guid><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近, libssh2 爆出了 9.8 分 &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-55200&quot;&gt;CVE-2026-55200&lt;/a&gt;, 将 SSH 端口暴露至公开网路已经变得不再安全&lt;/p&gt;
&lt;p&gt;为了更为安全的管理和访问服务器, 可以使用 Teleport 堡垒机解决方案&lt;/p&gt;
&lt;p&gt;堡垒机是一种用于统一鉴权并转发请求到真实服务器的服务, 部分堡垒机服务无需在服务端开启端口, 有着更高的安全性&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Teleport is an identity-based access platform that secures servers, Kubernetes clusters, databases, internal applications, and desktops using short-lived certificates, detailed audit logging, and fine-grained role-based access controls tied to your SSO provider (e.g., Okta, GitHub, Google Workspace).&lt;/em&gt;&lt;a href=&quot;https://goteleport.com/docs/get-started/&quot;&gt;^teleport-intro&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;部署&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://goteleport.com/docs/get-started/deploy-community/&quot;&gt;https://goteleport.com/docs/get-started/deploy-community/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;安装 Teleport&lt;/h3&gt;
&lt;p&gt;在你想要作为请求转发服务器的服务器上运行如下脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl https://goteleport.com/static/install.sh | bash -s &amp;lt;version&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl https://cdn.teleport.dev/install.sh | bash -s 18.9.2
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置或生成 TLS 证书&lt;/h3&gt;
&lt;p&gt;对于域名有所有权且 443 端口可以访问的设备, 可以使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo teleport configure -o file \
    --acme --acme-email=&amp;lt;email&amp;gt; \
    --cluster-name=&amp;lt;domain&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于已有 TLS 证书的用户, 可以将证书复制至 &lt;code&gt;/var/lib/teleport/fullchain.pem&lt;/code&gt; 和 &lt;code&gt;/var/lib/teleport/privkey.pem&lt;/code&gt;, 并使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo teleport configure -o file \
    --cluster-name=&amp;lt;domain&amp;gt; \
    --public-addr=&amp;lt;domain:port&amp;gt; \
    --cert-file=/var/lib/teleport/fullchain.pem \
    --key-file=/var/lib/teleport/privkey.pem
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;要使用 openssl 自签名证书, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# teleport-ext.cnf
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
C = GS
ST = Genshin Impact
L = Teyvat
O = Miruku Teleport Lab
CN = &amp;lt;domain&amp;gt;

[v3_req]
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = &amp;lt;domain&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo openssl req -x509 -nodes -days 3650 \
-newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \
-keyout /var/lib/teleport/privkey.pem \
-out /var/lib/teleport/fullchain.pem \
-config teleport-ext.cnf
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;开启 Systemd 服务&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now teleport
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果使用 &lt;code&gt;--public-addr=&amp;lt;domain:port&amp;gt;&lt;/code&gt; 开启的服务, 则启动于 &lt;code&gt;0.0.0.0:port&lt;/code&gt; 上, 否则请查看 &lt;code&gt;/etc/teleport.yaml&lt;/code&gt; 中 &lt;code&gt;proxy_service.web_listen_addr&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;同时, 如果服务器位于 NAT 后, &lt;code&gt;:3025&lt;/code&gt; 为默认鉴权端口, 请开启端口以保证 &lt;code&gt;domain:3025&lt;/code&gt; 可以被访问&lt;/p&gt;
&lt;h2&gt;使用&lt;/h2&gt;
&lt;h3&gt;创建用户&lt;/h3&gt;
&lt;p&gt;在运行有 Teleport 设备上运行如下命令, 以创建 admin 用户&lt;/p&gt;
&lt;p&gt;如下示例中, admin 可以管理集群 (administrative), 连接到任何 Teleport 功能保护的资源, 查看审计事件和会话记录, 并支持使用 root 或 ubuntu &lt;em&gt;Linux 用户&lt;/em&gt; 登录集群中的设备&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tctl users add admin --roles=editor,access,auditor --logins=root,ubuntu
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开命令输出的连接&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User &quot;admin&quot; has been created but requires a password. Share this URL with the user to complete user setup, link is valid for 1h:
https://&amp;lt;domain&amp;gt;:&amp;lt;port&amp;gt;/web/invite/&amp;lt;id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即可初始化用户密码&lt;/p&gt;
&lt;h3&gt;添加 Node&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://goteleport.com/docs/get-started/connect/&quot;&gt;https://goteleport.com/docs/get-started/connect/&lt;/a&gt;
为了使现有服务器可以连接到 Teleport, 我们需要在服务器上配置 Teleport Agent&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 WebUI 中选择 &lt;em&gt;Add New &amp;gt; Resource&lt;/em&gt;, 按照流程添加即可&lt;/p&gt;
&lt;p&gt;对于任意基于 Glibc 的 Linux 发行版进行安装, 选择 &lt;code&gt;Debian 11+ SSH&lt;/code&gt; 即可&lt;br /&gt;
若显示 &lt;code&gt;VERSION_ID&lt;/code&gt; 不存在, 可以将安装脚本修改为类似&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo VERSION_ID=&apos;rolling&apos; bash -c &quot;$(curl -fsSL https://&amp;lt;url&amp;gt;/install-node.sh)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 musl 的系统原生无法安装 Teleport&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
为了避免 Node 添加状态出现问题, 在进入添加流程至至成功前, 请不要刷新页面, 也不要在同一服务器重复运行 Agent 安装程序&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;要删除 Node, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tctl rm node/&amp;lt;uuid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;客户端 CLI 工具&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://goteleport.com/docs/connect-your-client/teleport-clients/tsh/&quot;&gt;https://goteleport.com/docs/connect-your-client/teleport-clients/tsh/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;tsh 是 Teleport 的 CLI 连接与鉴权工具&lt;/p&gt;
&lt;p&gt;使用如下命令获取服务端版本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl https://&amp;lt;domain&amp;gt;[:&amp;lt;port&amp;gt; | &apos;443&apos;]/webapi/find | jq &apos;.server_version&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用如下命令安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -O https://cdn.teleport.dev/teleport-v&amp;lt;version&amp;gt;-linux-amd64-bin.tar.gz
tar -xzf teleport-v&amp;lt;version&amp;gt;-linux-amd64-bin.tar.gz
cd teleport
sudo ./install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用如下命令登录 Teleport&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tsh login --proxy=&amp;lt;domain&amp;gt;[:&amp;lt;port&amp;gt; | &apos;443&apos;] [--user=&amp;lt;user&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;登出&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tsh logout
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;查看可用 Node&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tsh ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;登录成功后, 使用如下命令可以连接到 Node&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tsh ssh [&amp;lt;user&amp;gt;@]&amp;lt;node&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
如果在使用 &lt;code&gt;systemctl --user&lt;/code&gt; 命令时显示 &lt;code&gt;Failed to connect to bus: No medium found&lt;/code&gt;, 请在每个用户登录后运行如下命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export XDG_RUNTIME_DIR=&quot;/run/user/$(id -u)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h2&gt;备份 Teleport&lt;/h2&gt;
&lt;p&gt;为了避免单点故障造成数据丢失, 我们需要对 Teleport 数据进行备份&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/teleport.yaml&lt;/code&gt; 配置文件是自动生成的, 所以备份它是可选的&lt;/p&gt;
&lt;p&gt;参考 &lt;a href=&quot;https://goteleport.com/docs/zero-trust-access/management/backup-restore/&quot;&gt;官方文档内的备份与恢复&lt;/a&gt; 章节, 对于使用本文方法部署的自托管 Teleport, 仅需备份 &lt;code&gt;/var/lib/teleport/&lt;/code&gt; 文件夹即可&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>在 Wifi Stick (随身 WIFI 棒子) 上配置 USB 即可 ADB 救急模式</title><link>https://aka.lovemilk.top/notes/posts/deployment/wifistick/usb-adb/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/wifistick/usb-adb/</guid><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
本文内容可能已过时&lt;br /&gt;
本文更新版的内容已被整合至 &lt;a href=&quot;/posts/deployment/WifiStick/installation&quot;&gt;Wifi Stick (随身 WIFI 棒子) 基础安装配置&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
本文的部分 RNDIS 配置可能会在 Windows 7 上开启 ICS (Internet Connection Sharing) 后诱发驱动崩溃导致蓝屏, 请查看上述的新版内容&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;为了避免 Wifi Stick 的 USB 接口在仅 RNDIS (网路共享) 时 SSH 连接无效, 造成丢失对设备的访问性和可控性, 我们可以配置接口的救急模式, 自动在该模式下配置 ADB 设备连接&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- ## 配置主板按钮作为触发器
目前, 我的方案是在配置 USB 接口时操控 LED 灯 (中的某个) 常亮, 在常亮期间按下 Wifi Stick 上按钮 &amp;gt;= 1s 代表进入 ADB 模式, 否则为默认的 RNDIS 模式&lt;/p&gt;
&lt;h3&gt;[附录] 不同主板型号的设备按钮对应的 GPIO&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.kancloud.cn/handsomehacker/openstick/2636505#GPIO_17&quot;&gt;https://www.kancloud.cn/handsomehacker/openstick/2636505#GPIO_17&lt;/a&gt;
&amp;lt;table&amp;gt;&amp;lt;thead&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;型号&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;red led&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;green led&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;blue led&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;按键&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ufi001b/c&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio22&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio21&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio20&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio37&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sp970&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio28&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio107&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;uz801&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio23&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;UFI-16-V3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(pmic) gpio4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gpio49&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;注意: 安装了 ufi001b/c 固件的 sp970 按钮的 GPIO 也为 37&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;使用 evtest 监听 Input Device&lt;/h3&gt;
&lt;p&gt;在我所使用的固件中, 按钮已经被识别为了一个 Input Device&lt;/p&gt;
&lt;p&gt;使用如下命令找到按钮的 Input Device ID&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /proc/bus/input/devices
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出类似于&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name=&quot;GPIO Buttons&quot;
P: Phys=gpio-keys/input0
S: Sysfs=/devices/platform/gpio-keys/input/input0
U: Uniq=
H: Handlers=event0 
B: PROP=0
B: EV=100003
B: KEY=1000000 0 0 0 0 0 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么这个设备就是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/dev/input/event0
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;event0&lt;/code&gt; 就是上方 &lt;code&gt;Handlers&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后处理该 Device 的事件即可&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;由于我这边不知为何这个 Device 不会在按钮变化时触发事件, 所以我使用了下面的方案
--&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;配置基于特定时间重启的触发器&lt;/h2&gt;
&lt;p&gt;我们可以在配置 RNDIS 作为接口协议前等待一会儿, 并使用 LED 灯提示, 若在提示期间重启设备, 代表切换接口状态&lt;/p&gt;
&lt;h3&gt;新建重启检测脚本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;/usr/sbin/gadget-mode-selector
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
# /usr/sbin/gadget-mode-selector

MARKER_DIR=&quot;/var/lib/gadget&quot;
REBOOT_MARKER=&quot;${MARKER_DIR}/switch_mode&quot;
WAIT_SECONDS=3

# LED 路径
LED_RED=&quot;/sys/class/leds/red:os&quot;
LED_GREEN=&quot;/sys/class/leds/green:internet&quot;
LED_BLUE=&quot;/sys/class/leds/blue:wifi&quot;

mkdir -p &quot;$MARKER_DIR&quot;

led_red_long() {
    echo none &amp;gt; ${LED_RED}/trigger 2&amp;gt;/dev/null
    led_red_on
}

led_green_long() {
    echo none &amp;gt; ${LED_GREEN}/trigger 2&amp;gt;/dev/null
    led_green_on
}

led_red_on()   { echo 255 &amp;gt; ${LED_RED}/brightness 2&amp;gt;/dev/null; }
led_red_off()  { echo 0   &amp;gt; ${LED_RED}/brightness 2&amp;gt;/dev/null; }
led_green_on() { echo 255 &amp;gt; ${LED_GREEN}/brightness 2&amp;gt;/dev/null; }
led_green_off(){ echo 0   &amp;gt; ${LED_GREEN}/brightness 2&amp;gt;/dev/null; }
led_blue_on()  { echo 255 &amp;gt; ${LED_BLUE}/brightness 2&amp;gt;/dev/null; }
led_blue_off() { echo 0   &amp;gt; ${LED_BLUE}/brightness 2&amp;gt;/dev/null; }

init_leds() {
    echo none &amp;gt; ${LED_RED}/trigger 2&amp;gt;/dev/null
    echo none &amp;gt; ${LED_GREEN}/trigger 2&amp;gt;/dev/null
    echo none &amp;gt; ${LED_BLUE}/trigger 2&amp;gt;/dev/null
    led_red_off
    led_green_off
    led_blue_off
}

output_status() {
    echo &quot;STATUS: $1&quot;
    echo &quot;MESSAGE: $2&quot;
    echo &quot;---&quot;
}

main() {
    init_leds

    # 检查重启标记
    if [ -f &quot;$REBOOT_MARKER&quot; ]; then
        rm -f &quot;$REBOOT_MARKER&quot;
        output_status &quot;switching&quot; &quot;Reboot detected, switching to ADB mode&quot;
        led_red_long
        exit 10
    fi

    output_status &quot;waiting&quot; &quot;Waiting $WAIT_SECONDS seconds, reboot during blue slow blink to switch mode&quot;

    # 红绿蓝快闪各一次（启动提示，不可切换）
    led_red_on;   sleep 0.2; led_red_off
    led_green_on; sleep 0.2; led_green_off
    led_blue_on;  sleep 0.2; led_blue_off

    touch &quot;$REBOOT_MARKER&quot;
    # 蓝灯慢闪（可切换窗口）
    for i in $(seq 1 $WAIT_SECONDS); do
        led_blue_on
        sleep 0.3
        led_blue_off
        sleep 0.7
        echo &quot;WAIT: $i/$WAIT_SECONDS - Blue slow blink, reboot now to switch mode&quot; &amp;gt;&amp;amp;2
    done
    rm -f &quot;$REBOOT_MARKER&quot;

    output_status &quot;ready&quot; &quot;No switch requested, using RNDIS mode&quot;
    led_green_long

    exit 0
}

main &quot;$@&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后授予可执行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x /usr/sbin/gadget-mode-selector
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;修改如下脚本&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
下方脚本文件过大, 如果使用 SSH 直接粘贴可能导致文件损坏, 请使用 SFTP 或其他可靠传输方式&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;该脚本由 Systemd Unit &lt;code&gt;mobian-usb-gadget.service&lt;/code&gt; 自动调起&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;/usr/sbin/mobian-usb-gadget
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
# /usr/sbin/mobian-usb-gadget

CONFIGFS=&quot;/sys/kernel/config/usb_gadget/g1&quot;
MODE_SELECTOR=&quot;/usr/sbin/gadget-mode-selector&quot;
FFS_MOUNT_POINT=&quot;/dev/usb-ffs/adb&quot;

log() { echo &quot;[$(date +%H:%M:%S)] $*&quot;; }

cleanup() {
    log &quot;Removing USB gadget...&quot;

    if [ -d $CONFIGFS ]; then
        echo &quot;&quot; &amp;gt; $CONFIGFS/UDC 2&amp;gt;/dev/null
        rm -rf $CONFIGFS
    fi
}

setup_rndis() {
    log &quot;Configuring RNDIS-ONLY mode...&quot;

    modprobe libcomposite

    # 清理旧配置
    if [ -d $CONFIGFS ]; then
        echo &quot;&quot; &amp;gt; $CONFIGFS/UDC 2&amp;gt;/dev/null
        rm -rf $CONFIGFS
    fi

    mkdir -p $CONFIGFS
    cd $CONFIGFS || exit 1

    # ===== 基本设备信息 =====
    echo 0x1d6b &amp;gt; idVendor        # Linux Foundation
    echo 0x0104 &amp;gt; idProduct       # Multifunction Gadget

    echo 0xEF &amp;gt; bDeviceClass
    echo 0x02 &amp;gt; bDeviceSubClass
    echo 0x01 &amp;gt; bDeviceProtocol

    mkdir -p strings/0x409
    echo &quot;wifi-stick-miruku&quot; &amp;gt; strings/0x409/serialnumber
    echo &quot;wifi-stick&quot; &amp;gt; strings/0x409/manufacturer
    echo &quot;RNDIS Ethernet&quot; &amp;gt; strings/0x409/product

    # ===== 配置 =====
    mkdir -p configs/c.1
    mkdir -p configs/c.1/strings/0x409
    echo &quot;RNDIS&quot; &amp;gt; configs/c.1/strings/0x409/configuration
    echo 120 &amp;gt; configs/c.1/MaxPower

    # ===== RNDIS =====
    mkdir -p functions/rndis.usb0

    # MAC 地址（建议固定）
    echo &quot;02:12:34:56:78:9a&quot; &amp;gt; functions/rndis.usb0/dev_addr
    echo &quot;02:98:76:54:32:10&quot; &amp;gt; functions/rndis.usb0/host_addr

    # ===== Windows 关键：OS Descriptor =====
    mkdir -p os_desc
    echo 1 &amp;gt; os_desc/use
    echo 0xcd &amp;gt; os_desc/b_vendor_code
    echo MSFT100 &amp;gt; os_desc/qw_sign

    mkdir -p functions/rndis.usb0/os_desc/interface.rndis
    echo RNDIS &amp;gt; functions/rndis.usb0/os_desc/interface.rndis/compatible_id
    echo 5162001 &amp;gt; functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id

    # ===== 绑定 =====
    ln -s functions/rndis.usb0 configs/c.1/
    ln -s configs/c.1 os_desc

    # ===== 启动 =====
    UDC=$(ls /sys/class/udc | head -n 1)
    echo $UDC &amp;gt; UDC

    gc -e

    log &quot;RNDIS gadget started&quot;
}

setup_adb() {
    log &quot;Configuring ADB-ONLY mode...&quot;

    modprobe libcomposite

    # 1. 清理旧配置 (ConfigFS 必须先卸载 UDC 才能删除)
    if [ -d &quot;$CONFIGFS&quot; ]; then
        echo &quot;&quot; &amp;gt; &quot;$CONFIGFS/UDC&quot; 2&amp;gt;/dev/null
        # 递归清理 configs 下的链接，否则 rm -rf 可能会因 Busy 报错
        find &quot;$CONFIGFS/configs&quot; -maxdepth 2 -type l -delete 2&amp;gt;/dev/null
        rm -rf &quot;$CONFIGFS&quot;/* 2&amp;gt;/dev/null
    fi

    mkdir -p &quot;$CONFIGFS&quot;
    cd &quot;$CONFIGFS&quot; || exit 1

    # 2. 基础设备 ID 设置
    echo 0x18d1 &amp;gt; idVendor        # Google Inc.
    echo 0x4ee7 &amp;gt; idProduct       # Android ADB interface (Win7/10 识别关键)
    echo 0x0200 &amp;gt; bcdUSB          # 声明为 USB 2.0
    echo 0x00 &amp;gt; bDeviceClass
    echo 0x00 &amp;gt; bDeviceSubClass
    echo 0x00 &amp;gt; bDeviceProtocol

    # 3. 创建字符串描述符 (增强 Windows 兼容性，防止识别为未知设备)
    mkdir -p strings/0x409
    echo &quot;wifi-stick-miruku&quot; &amp;gt; strings/0x409/serialnumber
    echo &quot;Google&quot; &amp;gt; strings/0x409/manufacturer
    echo &quot;ADB Gadget&quot; &amp;gt; strings/0x409/product

    # 4. 初始化 FunctionFS
    # 假设你的 gc -a ffs 内部会执行 mkdir functions/ffs.adb
    gc -a ffs 
    
    # 确保配置目录存在 (FunctionFS 需要关联到某个 config)
    # 这一步如果 gc 没做，adbd 启动后无法 bind
    mkdir -p configs/c.1/strings/0x409
    echo &quot;adb&quot; &amp;gt; configs/c.1/strings/0x409/configuration
    ln -s functions/ffs.adb configs/c.1/ 2&amp;gt;/dev/null

    # 5. 挂载并启动 adbd
    mkdir -p /dev/usb-ffs/adb
    # 如果已经挂载则先卸载，防止 busy
    umount /dev/usb-ffs/adb 2&amp;gt;/dev/null
    mount -t functionfs adb /dev/usb-ffs/adb

    # 启动 adbd
    # -D 模式下 adbd 会等待 /dev/usb-ffs/adb 准备就绪
    killall adbd 2&amp;gt;/dev/null

    # 切换默认工作路径到 HOME
    cd ~

    adbd -D &amp;amp;
    
    # 关键等待：adbd 必须写入 ep0 后，UDC 才能 bind 成功
    sleep 1

    # 切回 $CONFIGFS
    cd -

    # 6. 绑定控制器
    UDC_NAME=$(ls /sys/class/udc | head -n 1)
    if [ -n &quot;$UDC_NAME&quot; ]; then
        echo &quot;$UDC_NAME&quot; &amp;gt; UDC
    else
        log &quot;Error: No UDC found!&quot;
        return 1
    fi

    gc -e

    log &quot;ADB gadget started on $UDC_NAME&quot;
}

status() {
    echo &quot;=========================================&quot;
    echo &quot;USB Gadget Status&quot;
    echo &quot;=========================================&quot;
    if [ -d &quot;$CONFIGFS&quot; ]; then
        echo &quot;Gadget configured: YES&quot;
        if [ -f &quot;$CONFIGFS/UDC&quot; ]; then
            cur=$(cat &quot;$CONFIGFS/UDC&quot; 2&amp;gt;/dev/null)
            [ -n &quot;$cur&quot; ] &amp;amp;&amp;amp; echo &quot;UDC active: $cur&quot; || echo &quot;UDC active: NO&quot;
        fi
        [ -f &quot;$CONFIGFS/strings/0x409/product&quot; ] &amp;amp;&amp;amp; echo &quot;Product: $(cat &quot;$CONFIGFS/strings/0x409/product&quot; 2&amp;gt;/dev/null)&quot;
    else
        echo &quot;Gadget configured: NO&quot;
    fi
    echo &quot;&quot;
    echo &quot;ADB Status:&quot;
    pgrep adbd &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;amp; echo &quot;  adbd running: YES&quot; || echo &quot;  adbd running: NO&quot;
    echo &quot;&quot;
    echo &quot;UDC Devices: $(ls /sys/class/udc/ 2&amp;gt;/dev/null | tr &apos;\n&apos; &apos; &apos;)&quot;
    echo &quot;=========================================&quot;
}

case &quot;${1:-}&quot; in
    setup|start)
        cleanup
        if [ -f &quot;$MODE_SELECTOR&quot; ]; then
            $MODE_SELECTOR
            code=$?
            if [ &quot;$code&quot; = &quot;10&quot; ]; then
                setup_adb
            else
                setup_rndis
            fi
        else
            setup_rndis
        fi
        ;;
    reset|stop)
        cleanup
        ;;
    status)
        status
        ;;
    *)
        echo &quot;Usage: $0 {setup|start|reset|stop|status}&quot;
        exit 1
        ;;
esac

exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在 &lt;code&gt;.bashrc&lt;/code&gt; 或 &lt;code&gt;.profile&lt;/code&gt; 中&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;增加如下行, 以美化 ADB Shell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export HOME=&apos;/root&apos;
export TERM=&apos;xterm-256color&apos;
export PS1=&apos;\[\e[32m\]\u@\h:\[\e[34m\]\w\[\e[0m\]\$ &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;用法&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;时间段&lt;/th&gt;
&lt;th&gt;LED 状态&lt;/th&gt;
&lt;th&gt;能否切换&lt;/th&gt;
&lt;th&gt;操作方式&lt;/th&gt;
&lt;th&gt;结果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0 - 0.6s&lt;/td&gt;
&lt;td&gt;红绿蓝快闪各一次&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;启动提示，不可切换&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.6s - 3.6s&lt;/td&gt;
&lt;td&gt;蓝色慢闪&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;在蓝色慢闪期间重启&lt;/td&gt;
&lt;td&gt;切换模式至 ADB 模式直至重启&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt; 3.6s&lt;/td&gt;
&lt;td&gt;常亮绿&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;当前为 RNDIS 模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt; 3.6s&lt;/td&gt;
&lt;td&gt;常亮红&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;当前为 ADB 模式&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;要查看当前状态, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mobian-usb-gadget status
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>在 Archlinux 上对 Code Server 自动 Patch JS</title><link>https://aka.lovemilk.top/notes/posts/apps/code-server/custom-patch/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/code-server/custom-patch/</guid><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;由于我的部分客户端 Chrome 版本过旧, 导致 &lt;code&gt;structuredClone&lt;/code&gt; 函数不存在, 或是 &lt;code&gt;window.globalThis&lt;/code&gt; 不存在, 造成 Code Server 终端打开空白 或 直接无法加载&lt;/p&gt;
&lt;h2&gt;配置 Code Server Patch 脚本&lt;/h2&gt;
&lt;p&gt;Code Server 的主要 HTML 位于 &lt;code&gt;/usr/lib/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html&lt;/code&gt;, 我们可以对该 HTML 进行 Path&lt;/p&gt;
&lt;p&gt;一个可能的操作, 在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/bin/patch-code-server.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/bash

# Exit on error, display commands, and treat unset variables as errors
set -xeu

# Define core paths
readonly BASE_DIR=&quot;/usr/lib/code-server&quot;
readonly HTML_FILE=&quot;$BASE_DIR/lib/vscode/out/vs/code/browser/workbench/workbench.html&quot;
# Patch directory inside static asset tree for web accessibility
readonly PATCH_DIR=&quot;$BASE_DIR/lib/vscode/out/vs/code/browser/workbench/patch&quot;
readonly BACKUP_FILE=&quot;${HTML_FILE}.bak&quot;

# Ensure we are running as root
if [[ $EUID -ne 0 ]]; then
    echo &quot;This script must be run with sudo or as root.&quot;
    exit 1
fi

# 1. Check if the file is already patched
# Using -F for fixed string and -q for quiet exit status
if ! grep -Fq &quot;patch/patch.js&quot; &quot;$HTML_FILE&quot;; then
    echo &quot;Fresh HTML detected. Updating backup: $BACKUP_FILE&quot;
    cp &quot;$HTML_FILE&quot; &quot;$BACKUP_FILE&quot;

    # 2. Create patch directory and placeholders
    mkdir -p &quot;$PATCH_DIR&quot;

    # Create empty JS files if they don&apos;t exist
    [[ ! -f &quot;$PATCH_DIR/patch.js&quot; ]] &amp;amp;&amp;amp; echo &quot;/* Custom Header Patch */&quot; &amp;gt; &quot;$PATCH_DIR/patch.js&quot;
    [[ ! -f &quot;$PATCH_DIR/postpatch.js&quot; ]] &amp;amp;&amp;amp; echo &quot;/* Custom Body Patch */&quot; &amp;gt; &quot;$PATCH_DIR/postpatch.js&quot;

    # Ensure correct permissions for the web server
    chmod -R 755 &quot;$PATCH_DIR&quot;

    # 3. Inject Header Patch
    # Insert before &amp;lt;/head&amp;gt;
    sed -i &apos;/&amp;lt;\/head&amp;gt;/i \		&amp;lt;script src=&quot;{{WORKBENCH_WEB_BASE_URL}}/out/vs/code/browser/workbench/patch/patch.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&apos; &quot;$HTML_FILE&quot;

    # 4. Inject Body Patch
    # Insert before &amp;lt;/body&amp;gt;
    sed -i &apos;/&amp;lt;\/body&amp;gt;/i \		&amp;lt;script src=&quot;{{WORKBENCH_WEB_BASE_URL}}/out/vs/code/browser/workbench/patch/postpatch.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&apos; &quot;$HTML_FILE&quot;

    echo &quot;Successfully applied patches and created backup.&quot;
else
    echo &quot;HTML already contains patch markers. Skipping backup and injection to avoid corruption.&quot;
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;授予权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown root:root /usr/local/bin/patch-code-server.sh
sudo chmod +x /usr/local/bin/patch-code-server.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;创建 Pacman Hook&lt;/h2&gt;
&lt;p&gt;在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/pacman.d/hooks/code-server-patch.hook
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = code-server

[Action]
Description = Re-applying custom JS patches to code-server HTML...
When = PostTransaction
Exec = /usr/local/bin/patch-code-server.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;创建/修改 Patch 脚本&lt;/h2&gt;
&lt;p&gt;为了保证 &lt;code&gt;structuredClone&lt;/code&gt; 可被 Fallback, 可以在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/lib/code-server/lib/vscode/out/vs/code/browser/workbench/patch/patch.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.debug(&apos;Chrome Fix Compatibility loaded&apos;)
if (typeof globalThis === &quot;undefined&quot;) {
    window.globalThis = window
    console.debug(&apos;Chrome Fix Compatibility patched `globalThis`&apos;);
}

if (!window.structuredClone || typeof window.structuredClone !== &apos;function&apos;) {
    window.structuredClone = (obj) =&amp;gt; JSON.parse(JSON.stringify(obj))
    console.debug(&apos;Chrome Fix Compatibility patched `window.structuredClone`&apos;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;运行 Patch Code Server 脚本或重新安装 Code Server&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S code-server
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;重启 Code Server 服务&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;systemctl restart --user code-server.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;在客户端刷新页面&lt;/h2&gt;
&lt;p&gt;在客户端使用 &lt;code&gt;Ctrl+F5&lt;/code&gt; 以在刷新页面同时清除页面缓存&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>在 CachyOS 上降级 CachyOS 专有软件包</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/cachyos/downgrade-packages/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/cachyos/downgrade-packages/</guid><description>在 CachyOS 上使用 CachyOS 提供的脚本降级 CachyOS 专有软件包</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;https://discuss.cachyos.org/t/cachyos-downgrade-a-script-to-downgrade-packages-for-cachy/27949&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;安装 AUR 软件包 &lt;code&gt;cachyos-downgrade-git&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yay -S cachyos-downgrade-git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://gitlab.com/cscs/cachyos-downgrade&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;将如上脚本下载至&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并给予可执行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -O https://gitlab.com/cscs/cachyos-downgrade/-/raw/main/cachyos-downgrade
chmod +x ./cachyos-downgrade
sudo mv ./cachyos-downgrade /usr/local/bin
rm ./cachyos-downgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo cachyos-downgrade &amp;lt;package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如, 要降级 &lt;code&gt;linux-cachyos&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cachyos-downgrade linux-cachyos
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复在代理不支持 IPv6 情况下访问需要代理的 IPv6 网站时泄露真实的客户端 IPv6</title><link>https://aka.lovemilk.top/notes/posts/deployment/openclash/ipv6-leak/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/openclash/ipv6-leak/</guid><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在代理不支持 IPv6 情况下访问需要代理的 IPv6 网站时, 部分可以直连的网站会获取到真实的客户端 IPv6, 在部分情况下可能导致被网站封禁&lt;/p&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;p&gt;尝试使用 Fake-IP 模式即可&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 Krkr 游戏引擎全 CG 存档导致游戏分辨率异常的问题</title><link>https://aka.lovemilk.top/notes/posts/apps/galgame/kiri-fix-save/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/galgame/kiri-fix-save/</guid><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;起因是我在玩 &lt;em&gt;創作彼女の恋愛公式&lt;/em&gt; 并加载全 CG 存档时, 上游提供的存档存在问题, 使用该存档会导致游戏画面分辨率不对&lt;/p&gt;
&lt;p&gt;我尝试了多种方案, 最终决定查看存档存储数据以排查是否是存档的问题&lt;/p&gt;
&lt;h2&gt;解决方法&lt;/h2&gt;
&lt;p&gt;对于 Krkr 引擎制作的游戏, 部分存档会被加密, 可以使用 &lt;a href=&quot;https://github.com/arcusmaximus/KirikiriTools&quot;&gt;KirikiriTools&lt;/a&gt; 解密&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;下载 &lt;a href=&quot;https://github.com/arcusmaximus/KirikiriTools/releases/latest&quot;&gt;Release&lt;/a&gt; 中的 &lt;code&gt;KirikiriDescrambler.exe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在游戏存档同目录打开终端 (Windows 用户可以在 Explorer 地址栏直接输入 &lt;code&gt;cmd&lt;/code&gt; 或 &lt;code&gt;powershell&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;在弹出的终端中运行如下指令&lt;pre&gt;&lt;code&gt;.\KirikiriDescrambler.exe &amp;lt;save&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;其中, &lt;code&gt;save&lt;/code&gt; 是存档路径, 例如&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;.\KirikiriDescrambler.exe sousakukanojosu.ksd
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
该操作会直接覆写存档文件, 请注意备份&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;然后, 会发现存档文件已经变成了纯文本明文了. 该文本格式为 &lt;code&gt;.ks&lt;/code&gt; / &lt;code&gt;.tjs&lt;/code&gt;, 类似于 JavaScript[^js-!=-java] 脚本语言. 在本游戏的存档中, 意外存储了 &lt;code&gt;&quot;storeWindowWidth&quot; =&amp;gt; 1552&lt;/code&gt; 与 &lt;code&gt;&quot;storeWindowHeight&quot; =&amp;gt; 902&lt;/code&gt;, 导致渲染的内容区域分辨率被定死了&lt;/li&gt;
&lt;li&gt;解决其实很简单, 只要直接删除这两行就可以了 (注意保证语法正确)
&lt;blockquote&gt;
&lt;p&gt;大部分的 Krkr 引擎游戏会自己识别存档格式为加密存档还是纯文本存档, 直接将纯文本文档放入游戏存档位置即可自动识别&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;然后, 启动游戏就会把修改后的存档重新加密为加密存档格式. 你可以分享这个存档给需要的人&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;BTW, &lt;em&gt;創作彼女の恋愛公式&lt;/em&gt; 要求必须要打完一次其他全部女主的线至少一次才可以选择女一, 如果想绕过这个限制, 可以先加载全 CG 存档选择女一后保存到其他槽位, 然后替换回原来存档并加载这个槽位绕过&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[^js-!=-java]: 注意: JavaScript 与 Java 截然不同&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>在 Archlinux 上配置 钉钉 (DingTalk) 的 Bwrap 隔离</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/dingtalk/bwrap/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/dingtalk/bwrap/</guid><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;由于近日 DingTalk 的 &lt;a href=&quot;https://flathub.org/zh-Hans/apps/com.dingtalk.DingTalk&quot;&gt;Flatpak 版本&lt;/a&gt; 不再维护, 要在 Linux 上使用文件系统隔离的 DingTalk, 须要自己配置沙盒或隔离环境&lt;/p&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;h3&gt;配置 Pacman Hook 以自动将 DingTalk 调用脚本从 &lt;code&gt;/usr/bin&lt;/code&gt; 移动到不可执行位置&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;要手动移动, 请在安装后运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mv /usr/bin/dingtalk /usr/lib/dingtalk_raw
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/pacman.d/hooks
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/pacman.d/hooks/dingtalk-isolate.hook
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Trigger]
Operation = Install
Operation = Upgrade
Type = Path
Target = usr/bin/dingtalk

[Action]
Description = Moving DingTalk binary to non-PATH location and ensuring isolation...
When = PostTransaction
Exec = /usr/bin/sh -c &apos;if [ -L /usr/bin/dingtalk ] || [ -f /usr/bin/dingtalk ]; then mv /usr/bin/dingtalk /usr/lib/dingtalk_raw; fi&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装 Bwrap 与 DingTalk&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S bubblewrap
yay -S dingtalk-bin
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 Bwrap 隔离脚本&lt;/h3&gt;
&lt;p&gt;创建隔离的 HOME 路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p ~/.var/app-custom
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了保证调用 DingTalk 可以直接打开, 须要在如下路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/bin/dingtalk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

SANDBOX_HOME=&quot;$HOME/.var/app-custom/com.dingtalk.DingTalk&quot;
mkdir -p &quot;$SANDBOX_HOME&quot;

export XDG_DOWNLOAD_DIR=&quot;$HOME/Downloads&quot;

exec bwrap \
    --ro-bind / / \
    --dev /dev \
    --proc /proc \
    --tmpfs /tmp \
    --bind &quot;$SANDBOX_HOME&quot; &quot;$HOME&quot; \
    --bind &quot;$HOME/Downloads&quot; &quot;$HOME/Downloads&quot; \
    --ro-bind &quot;$HOME/.config/fontconfig&quot; &quot;$HOME/.config/fontconfig&quot; \
    --share-net \
    --die-with-parent \
    --setenv XDG_DOWNLOAD_DIR &quot;$HOME/Downloads&quot; \
    /usr/lib/dingtalk_raw &quot;$@&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;要挂载自定义路径, 请在最后一个 &lt;code&gt;--bind=&lt;/code&gt; 后一行添加&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--bind &amp;lt;host-path/主机路径&amp;gt; &amp;lt;container-path/沙盒路径&amp;gt; \
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者使用 &lt;code&gt;--ro-bind&lt;/code&gt; 以只读挂载&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;并赋予可执行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/dingtalk
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;h3&gt;在 Tmpfs 自动创建目录&lt;/h3&gt;
&lt;p&gt;例如, 要创建 &lt;code&gt;/tmp/swap4flat&lt;/code&gt; 目录, 并修改权限为 &lt;code&gt;a:b&lt;/code&gt; 的 770, 可以在如下路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/tmpfiles.d/flatpak-swap.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 类型 / 路径 / 模式 / 用户 / 组 / 年龄 / 参数
d /tmp/swap4flat 0770 a b - -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后加载该配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemd-tmpfiles --create /etc/tmpfiles.d/flatpak-swap.conf
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>在 Wifi Stick (随身 WIFI 棒子) 上配置 USB 网路共享 (RNDIS)</title><link>https://aka.lovemilk.top/notes/posts/deployment/wifistick/usb-network4win/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/wifistick/usb-network4win/</guid><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
本文内容可能已过时&lt;br /&gt;
本文更新版的内容已被整合至 &lt;a href=&quot;/posts/deployment/WifiStick/installation&quot;&gt;Wifi Stick (随身 WIFI 棒子) 基础安装配置&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
本文的部分 RNDIS 配置可能会在 Windows 7 上开启 ICS (Internet Connection Sharing) 后诱发驱动崩溃导致蓝屏, 请查看上述的新版内容&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本文主要介绍如何在随身 WIFI 棒子上配置 USB 网路共享 (RNDIS), 以便 Windows 可以自动识别&lt;/p&gt;
&lt;p&gt;由于我所使用的 &lt;a href=&quot;https://www.kancloud.cn/handsomehacker/openstick&quot;&gt;OpenStick&lt;/a&gt; 项目默认已经配置了适用于 *nux 的 USB 网路共享脚本, 需要直接修改该脚本, 否则 USB 接口会被占用导致无法修改&lt;/p&gt;
&lt;h2&gt;配置 RNDIS&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;修改如下脚本&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;该脚本由 Systemd Unit &lt;code&gt;mobian-usb-gadget.service&lt;/code&gt; 自动调起&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;/usr/sbin/mobian-usb-gadget
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;setup()&lt;/code&gt; 函数中, 在 &lt;code&gt;# Setting Up Adbd&lt;/code&gt; 前添加如下命令, 便于 Windows 识别为 RNDIS 设备&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 复合设备是为了 ADB 也可以连接
echo 0xEF &amp;gt; $CONFIGFS/bDeviceClass
echo 0x02 &amp;gt; $CONFIGFS/bDeviceSubClass
echo 0x01 &amp;gt; $CONFIGFS/bDeviceProtocol
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并在上方命令后方添加如下代码块中任意其一&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;如下为 Google 的 RNDIS 设备生产商和产品 ID, 兼容性最好&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;echo 0x18d1 &amp;gt; $CONFIGFS/idVendor
echo 0x4ee4 &amp;gt; $CONFIGFS/idProduct
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;如下为 Microsoft 的 RNDIS 设备生产商和产品 ID, 兼容性其次&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;echo 0x045E &amp;gt; $CONFIGFS/idVendor
echo 0x0301 &amp;gt; $CONFIGFS/idProduct
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;如下为 Linux 的 RNDIS 设备生产商和产品 ID, 可能存在兼容性问题&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;echo 0x1d6b &amp;gt; $CONFIGFS/idVendor
echo 0x0104 &amp;gt; $CONFIGFS/idProduct
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;删除 NetworkManager Connection&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;该脚本由 Systemd Unit &lt;code&gt;mobian-setup-usb-network.service&lt;/code&gt; 自动调起&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/sbin/mobian-setup-usb-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;移除或注释&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if [ ! -e /etc/NetworkManager/system-connections/USB.nmconnection ]; then
    # Create network connection
    nmcli connection add con-name USB \
                         ifname usb0 \
                         type ethernet \
                         ip4 10.22.33.1/24

    # Set priorities so it doesn&apos;t take precedence over WiFi/mobile connections
    nmcli connection modify USB ipv4.route-metric 1500
    nmcli connection modify USB ipv4.dns-priority 150

    # Auto connection so it can be used for tethering
    nmcli connection modify USB ipv4.method shared
    nmcli con add con-name &quot;modem&quot; type &quot;gsm&quot; ifname &quot;wwan0qmi0&quot;
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并在 &lt;code&gt;if&lt;/code&gt; 的最后添加如下命令设置 USB 接口 IP, 注意网段与上方配置一致&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ip link set usb0 up
ip addr add 10.22.33.1/24 dev usb0 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行如下命令删除使用 &lt;code&gt;usb0&lt;/code&gt; 的 NetworkManager Connection&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmcli connection delete USB
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;a 连接 Windows 设备&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;此时将 Wifi Stick 插入 Windows 设备的 USB 接口, 应该可以在 Windows 侧看到一个驱动未安装 (代码: 28) 的 RNDIS 设备 (位于 &lt;em&gt;其他设备&lt;/em&gt; 类别)&lt;/p&gt;
&lt;p&gt;双击该设备, 单击 &quot;更新驱动程序&quot; &amp;gt; &quot;浏览我的电脑以查找驱动程序&quot; &amp;gt; &quot;让我从计算机的可用驱动程序列表中选取&quot; &amp;gt; 在 &quot;常见硬件类型&quot; 内选择 &quot;网路适配器&quot; &amp;gt; 厂商选择 &quot;Microsoft&quot;, 型号选择最下面的 &quot;远程 NDIS 兼容设备&quot; (Windows 7 操作系统厂商选择 &quot;Microsoft Corporation&quot;, 型号选择 &quot;Remote NDIS Compatible Device&quot;) &amp;gt; &quot;下一页&quot; &amp;gt; &quot;是&quot; (强制安装驱动程序)&lt;/p&gt;
&lt;p&gt;此时, 可以看到 Windows 弹出一个新的网路连接, 也新增了一个网路适配器, 并获取到了 IP 地址&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果无法获取 IP 地址, 请尝试在 Wifi Stick 安装 Dnsmasq (不需要手动启用服务, 会由 NetworkManager 调起), 使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install dnsmasq
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;如此, 便配置成功了. 您可以使用 &lt;code&gt;10.22.33.1:&amp;lt;port&amp;gt;&lt;/code&gt; 访问任意部署于 Wifi Stick 的服务了&lt;/p&gt;
&lt;p&gt;如果在 Windows 设备上无法安装驱动程序, 或在安装驱动程序后显示该设备需要进一步安装驱动程序, 请参阅 &lt;a href=&quot;#%E9%83%A8%E5%88%86%E9%AB%98%E7%89%88%E6%9C%AC-windows-10-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%97%A0%E6%B3%95%E5%AE%89%E8%A3%85-rndis-%E9%A9%B1%E5%8A%A8%E5%B9%B6%E8%BF%9E%E6%8E%A5&quot;&gt;故障排除 - 部分高版本-windows-10-操作系统无法安装-rndis-驱动并连接&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;b 连接 *nux 设备&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对于 Linux 和 macOS 等 *nux 操作系统, 请将 Wifi Stick 插入 USB 接口, 后列出网卡及其 IP 地址&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如下命令可能仅适用于现代 Linux 操作系统, macOS 请自行查找解决方法 &lt;s&gt;其实是我没钱买 mac&lt;/s&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;ip a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应该可以看到类似如下的设备&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;6: enp0s20f0u8: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 22:39:e2:ef:40:d0 brd ff:ff:ff:ff:ff:ff
    altname enx2239e2ef40d0
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;下文的 &lt;code&gt;enp0s20f0u8&lt;/code&gt; 均指代网卡名称&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;激活连接: 对于 NetworkManger 用户, 可以运行类似&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmcli device connect enp0s20f0u8
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;上述命令会将当前的激活网卡切换为该网卡, 导致当前以太网连接中断&lt;br /&gt;
要同时连接两(多)个以太网卡, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmcli connection add type ethernet con-name wifi-stick ifname enp0s20f0u8 ipv4.route-metric 200 &amp;amp;&amp;amp; nmcli connection up wifi-stick
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后, 再次使用列出网卡及其 IP 地址的命令, 应该已经可以获取到 IP (你设置的 &lt;code&gt;10.22.33.0/24&lt;/code&gt;) 地址了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; ip a

6: enp0s20f0u8: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1400 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 22:39:e2:ef:40:d0 brd ff:ff:ff:ff:ff:ff
    altname enx2239e2ef40d0
    inet 10.22.33.91/24 brd 10.22.33.255 scope global dynamic noprefixroute enp0s20f0u8
       valid_lft 3538sec preferred_lft 3538sec
    inet6 fe80::c29d:e98d:c3cc:6067/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;[可选] 配置 Dnsmasq&lt;/h2&gt;
&lt;p&gt;为了避免需要记忆 Wifi Stick IP, 可以修改 Dnsmasq 的配置进行 Hosts, 从而使用例如 &lt;code&gt;stick.local&lt;/code&gt; 访问 Wifi Stick 的服务&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建配置文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/NetworkManager/dnsmasq.d/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后, 可以在该文件夹下写入配置. 例如, 要将 &lt;code&gt;stick.local&lt;/code&gt; Hosts 到 &lt;code&gt;10.22.33.1&lt;/code&gt;, 可以在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/NetworkManager/dnsmasq.d/stick-hosts.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;address=/stick.lan/10.22.33.1
address=/stick.local/10.22.33.1

# 同时也可以指定 `stick.local` 不转发到上游 DNS 服务器
# local=/stick.lan/
# local=/stick.local/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要绑定 MAC 地址&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dhcp-host=&amp;lt;mac-address&amp;gt;,&amp;lt;ip-address&amp;gt;,&amp;lt;rent&amp;gt;

# 例如: dhcp-host=AA:BB:CC:DD:EE:FF,10.22.33.100,8h
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置上游 DNS&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Google Public DNS
server=8.8.8.8

# ignore `/etc/resolv.conf`
no-resolv
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;部分 NetworkManager 时会使用内部的 internal DHCP/DNS 处理器, 因此需要在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/NetworkManager/NetworkManager.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[main]
dns=dnsmasq
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;方可生效 (记得重启 NetworkManager)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;重启 NetworkManager
&lt;strong&gt;上述命令须在重启 NetworkManager 后生效&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart NetworkManager
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;故障排除&lt;/h2&gt;
&lt;h3&gt;Wifi Stick 连接 WIFI 后速率过慢&lt;/h3&gt;
&lt;p&gt;由于 Wifi Stick 仅支持 2.4 Ghz 的 WIFI, 且功率不大, 请尝试关闭周围的蓝牙设备&lt;/p&gt;
&lt;h3&gt;Emmc 写入过慢&lt;/h3&gt;
&lt;p&gt;尝试查看当前闪存调度器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /sys/block/mmcblk0/queue/scheduler
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[mq-deadline] kyber none
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以尝试切换到 &lt;code&gt;kyber&lt;/code&gt;, 这或许可以小幅提升性能&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo none &amp;gt; /sys/block/mmcblk0/queue/scheduler
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 dd 测试&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dd if=/dev/zero of=./testfile bs=1M count=100 conv=fdatasync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在使用 &lt;code&gt;mq-deadline&lt;/code&gt; 时, 写入速度为 &lt;code&gt;7.9 MB/s&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt; 为 &lt;code&gt;8.5 MB/s&lt;/code&gt;, &lt;code&gt;kyber&lt;/code&gt; 为 &lt;code&gt;8.2 MB/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果要永久应用一个调度器, 请写入 UDev 规则&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/udev/rules.d/60-mmc-scheduler.rules
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ACTION==&quot;add|change&quot;, KERNEL==&quot;mmcblk0&quot;, ATTR{queue/scheduler}=&quot;&amp;lt;调度器&amp;gt;&quot;
ACTION==&quot;add|change&quot;, KERNEL==&quot;mmcblk0&quot;, ATTR{queue/scheduler}=&quot;kyber&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;网速测试&lt;/h2&gt;
&lt;p&gt;使用 iperf3 单线程测试, 可以跑道 100 Mbps 左右&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\Users\-&amp;gt;iperf3 -c 10.22.33.1 -P 1 -R
Connecting to host 10.22.33.1, port 5201
Reverse mode, remote host 10.22.33.1 is sending
[  5] local 10.22.33.136 port 10873 connected to 10.22.33.1 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  10.0 MBytes  83.7 Mbits/sec
[  5]   1.00-2.00   sec  10.9 MBytes  91.2 Mbits/sec
[  5]   2.00-3.00   sec  10.9 MBytes  91.2 Mbits/sec
[  5]   3.00-4.00   sec  10.9 MBytes  91.2 Mbits/sec
[  5]   4.00-5.00   sec  10.9 MBytes  91.2 Mbits/sec
[  5]   5.00-6.00   sec  11.0 MBytes  92.3 Mbits/sec
[  5]   6.00-7.00   sec  10.9 MBytes  91.2 Mbits/sec
[  5]   7.00-8.00   sec  10.9 MBytes  91.2 Mbits/sec
[  5]   8.00-9.00   sec  11.0 MBytes  92.3 Mbits/sec
[  5]   9.00-10.00  sec  10.8 MBytes  90.2 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   109 MBytes  91.1 Mbits/sec    0            sender
[  5]   0.00-10.00  sec   108 MBytes  90.6 Mbits/sec                  receiver

iperf Done.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;BTW, 清理磁盘 (emmc) 空间&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 删除孤立依赖包
sudo apt autoremove

# 删除孤立依赖包及其配置文件
# sudo apt autoremove --purge

# 删除 apt 包缓存 (不包括当前版本的包)
sudo apt autoclean

# 删除未使用依赖
# 需要先安装 `deborphan`
# sudo apt install deborphan
sudo apt purge $(deborphan)

# 限制日志只保留最近 2 天的内容
sudo journalctl --vacuum-time=2d
# 限制日志占用空间不大于 100M
sudo journalctl --vacuum-size=100M
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;libconfig9&lt;/code&gt; 库是 USB 网桥必要的, 若不小心删除可以重新安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install libconfig9
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;清除 Ruby 残留&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt remove ruby ruby-minitest ruby-net-telnet ruby-power-assert ruby-test-unit ruby-xmlrpc ruby2.7-doc rubygems-integration
sudo rm -rf /usr/share/ri
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;清除不需要的语言&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install localepurge
sudo localepurge
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;故障排除&lt;/h2&gt;
&lt;h3&gt;部分高版本 Windows 10 操作系统无法安装 RNDIS 驱动并连接&lt;/h3&gt;
&lt;p&gt;在部分高版本 Windows 10 操作系统中, 即使手动选择了 RNDIS 设备也仍可能显示未安装驱动 (代码 28, 事件文件可下载 &lt;a href=&quot;/static/rndis-dirver-error.evtx&quot;&gt;rndis-dirver-error.evtx&lt;/a&gt; 并在 Windows 事件查看器中查看)&lt;/p&gt;
&lt;p&gt;一个可能的解决方法是禁用复合设备, 修改为仅 RNDIS 网路传输设备&lt;/p&gt;
&lt;p&gt;修改如下脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/sbin/mobian-usb-gadget
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;setup()&lt;/code&gt; 函数中, 在 &lt;code&gt;# Setting Up Adbd&lt;/code&gt; 修改之前使用设备类型 ID&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 将其改为单功能网路设备类
echo 0x02 &amp;gt; $CONFIGFS/bDeviceClass
echo 0x00 &amp;gt; $CONFIGFS/bDeviceSubClass
echo 0x00 &amp;gt; $CONFIGFS/bDeviceProtocol
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(必要时也将 RNDIS 设备生产商和产品 ID 修改为 Microsoft 的)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo 0x045E &amp;gt; $CONFIGFS/idVendor
echo 0x0301 &amp;gt; $CONFIGFS/idProduct
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后注释或删除下方启动 &lt;code&gt;adbd&lt;/code&gt; 的脚本部分, 将下面几行注释&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Setting Up Adbd
gc -a ffs
mkdir -p /dev/usb-ffs/adb

# in offical version of gc name will be ffs.x
mount -t functionfs adb /dev/usb-ffs/adb

# Fire Up Adbd
adbd -D &amp;amp;
# (hack) wait adbd setup
sleep 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后尝试重启服务 &lt;code&gt;mobian-usb-gadget.service&lt;/code&gt; 或重启设备&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart mobian-usb-gadget.service
# or
# sudo reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;如果仍旧不可以, 请尝试将如下脚本替换原有脚本&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks for ChatGPT 5.3&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo mv /usr/sbin/mobian-usb-gadget /usr/sbin/mobian-usb-gadget.bak
sudo vim /usr/sbin/mobian-usb-gadget
sudo chmod +x /usr/sbin/mobian-usb-gadget
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh

CONFIGFS=/sys/kernel/config/usb_gadget/g1

setup() {
    echo &quot;[+] Setting up RNDIS gadget...&quot;

    modprobe libcomposite

    # 清理旧配置
    if [ -d $CONFIGFS ]; then
        echo &quot;&quot; &amp;gt; $CONFIGFS/UDC 2&amp;gt;/dev/null
        rm -rf $CONFIGFS
    fi

    mkdir -p $CONFIGFS
    cd $CONFIGFS || exit 1

    # ===== 基本设备信息 =====
    echo 0x1d6b &amp;gt; idVendor        # Linux Foundation
    echo 0x0104 &amp;gt; idProduct       # Multifunction Gadget

    echo 0xEF &amp;gt; bDeviceClass
    echo 0x02 &amp;gt; bDeviceSubClass
    echo 0x01 &amp;gt; bDeviceProtocol

    mkdir -p strings/0x409
    echo &quot;1234567890&quot; &amp;gt; strings/0x409/serialnumber
    echo &quot;Armbian&quot; &amp;gt; strings/0x409/manufacturer
    echo &quot;RNDIS Ethernet&quot; &amp;gt; strings/0x409/product

    # ===== 配置 =====
    mkdir -p configs/c.1
    mkdir -p configs/c.1/strings/0x409
    echo &quot;RNDIS&quot; &amp;gt; configs/c.1/strings/0x409/configuration
    echo 120 &amp;gt; configs/c.1/MaxPower

    # ===== RNDIS =====
    mkdir -p functions/rndis.usb0

    # MAC 地址 (请修改)
    echo &quot;02:XX:XX:XX:XX:XX&quot; &amp;gt; functions/rndis.usb0/dev_addr
    echo &quot;02:XX:XX:XX:XX:XX&quot; &amp;gt; functions/rndis.usb0/host_addr
    # echo &quot;02:AA:BB:CC:DD:01&quot; &amp;gt; functions/rndis.usb0/dev_addr
    # echo &quot;02:AA:BB:CC:DD:02&quot; &amp;gt; functions/rndis.usb0/host_addr

    # ===== Windows 关键：OS Descriptor =====
    mkdir -p os_desc
    echo 1 &amp;gt; os_desc/use
    echo 0xcd &amp;gt; os_desc/b_vendor_code
    echo MSFT100 &amp;gt; os_desc/qw_sign

    mkdir -p functions/rndis.usb0/os_desc/interface.rndis
    echo RNDIS &amp;gt; functions/rndis.usb0/os_desc/interface.rndis/compatible_id
    echo 5162001 &amp;gt; functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id

    # ===== 绑定 =====
    ln -s functions/rndis.usb0 configs/c.1/
    ln -s configs/c.1 os_desc

    # ===== 启动 =====
    UDC=$(ls /sys/class/udc | head -n 1)
    echo $UDC &amp;gt; UDC

    echo &quot;[+] RNDIS gadget started&quot;
}

reset() {
    echo &quot;[+] Removing USB gadget...&quot;

    if [ -d $CONFIGFS ]; then
        echo &quot;&quot; &amp;gt; $CONFIGFS/UDC 2&amp;gt;/dev/null
        rm -rf $CONFIGFS
    fi
}

case &quot;$1&quot; in
    setup) setup ;;
    reset) reset ;;
    *) echo &quot;Usage: $0 {setup|reset}&quot; ;;
esac
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/deployment/wifistick/usb-adb/&quot;&gt;配置 USB 接口 ADB 救急模式, 以免 SSH 无法连接&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>管好你的数据捏~ | ArchLinux 文件备份全套配置</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/backup-your-files/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/backup-your-files/</guid><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;为了保证文件不丢失不泄露, 提升文件可用性, 本文将介绍我的整套备份解决方案, 你与以便未来的我参考.&lt;/p&gt;
&lt;h2&gt;软件&lt;/h2&gt;
&lt;p&gt;备份主要 Syncthing 跨设备(或跨磁盘)实时同步文件作为备份&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yay -S syncthing
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;h3&gt;创建 &lt;code&gt;backup&lt;/code&gt; 用户和用户组&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo groupadd -g 9999 backup
sudo useradd -u 9999 -g 9999 -m -s /bin/bash backup
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;禁用 &lt;code&gt;backup&lt;/code&gt; 用户 SSH&lt;/h3&gt;
&lt;p&gt;在 SSHD 配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# disabled users for SSH login
DenyUsers backup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并重启 SSHD 服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart sshd.service
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;若要尝试配置是否生效, 可以实时查看 SSHD 日志&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;journalctl -u sshd -f 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并在另一个终端运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 如果不是默认的 22 端口, 请使用参数 `-p &amp;lt;port&amp;gt;`
ssh backup@127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后可以在日志中看到类似如下内容代表配置已经生效了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sshd-session[xxxxxx]: User backup from 127.0.0.1 not allowed because listed in DenyUsers
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;启用自动运行 &lt;code&gt;backup&lt;/code&gt; 用户的 Systemd Units&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo loginctl enable-linger backup
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 &lt;code&gt;backup&lt;/code&gt; 用户的 Syncthing&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;本方法不适用 Syncthing 同步数据用途, 因为新的文件会被创建为 &lt;code&gt;backup:backup&lt;/code&gt;, 导致权限配置失败&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;如果已经在当前用户配置过 Syncthing, 可以进行如下迁移&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /home/backup/.local/state/syncthing
sudo cp -r ~/.local/state/syncthing /home/backup/.local/state/
sudo chown backup:backup -R /home/backup/.local/state/syncthing
sudo chmod 0700 -R /home/backup/.local/state/syncthing
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;启动 Syncthing&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now syncthing@backup.service
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;配置 Syncthing
前往 &lt;a href=&quot;http://127.0.0.1:8384&quot;&gt;http://127.0.0.1:8384&lt;/a&gt; 进行配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改需要 Syncthing 备份的文件夹的用户组为 &lt;code&gt;backup&lt;/code&gt;
若当前用户需要访问备份文件夹, 仅修改用户组&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo chown :backup -R /path/to/backup
sudo chmod 0770 -R /path/to/backup
sudo chmod g+s /path/to/backup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;否则, 修改为 &lt;code&gt;backup:backup&lt;/code&gt; 并改为 &lt;code&gt;0700&lt;/code&gt; 权限, 以防止当前用户的不法应用扫盘&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown backup:backup -R /path/to/backuponly
sudo chmod 0700 -R /path/to/backuponly
sudo chmod g+s /path/to/backuponly
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你要备份的文件在你的 HOME 目录, 请注意使用 ACL 控制权限, 否则可能导致权限与 SSH 等安全性要求高的程序无法使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo setfacl -m u:backup:x ~
sudo setfacl -R -m u:backup:rX ~/path/to/backuponly
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;跨磁盘备份&lt;/h3&gt;
&lt;p&gt;跨磁盘备份可以使用 当前用户 与 &lt;code&gt;backup&lt;/code&gt; 用户分别运行一个 Syncthing, 然后在两个 Syncthing 间同步&lt;/p&gt;
&lt;p&gt;如果需要在 &lt;code&gt;backup&lt;/code&gt; 用户同用户下备份, 可以使用 &lt;code&gt;mutagen&lt;/code&gt; 文件监听与同步工具:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yay -S mutagen.io-bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后, 可以在 &lt;code&gt;backup&lt;/code&gt; 用户运行如下命令以创建同步&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mutagen sync create --name=&amp;lt;name&amp;gt; -m=&amp;lt;sync-mode&amp;gt; &amp;lt;alpha&amp;gt; &amp;lt;beta&amp;gt; [--ignore=...]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;alpha&lt;/code&gt; 与 &lt;code&gt;beta&lt;/code&gt; 是两个 endpoint, &lt;em&gt;The reason that these endpoints aren’t termed “source” and “destination” is that Mutagen has multiple synchronization modes&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;要保证单项同步或其他同步方式, 请参阅 &lt;a href=&quot;https://mutagen.io/documentation/synchronization/#modes&quot;&gt;https://mutagen.io/documentation/synchronization/#modes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一个典型同步创建命令如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mutagen sync create --name=cloudbackup-enc --mode=one-way-safe --ignore-vcs --ignore=&quot;.stfolder/&quot; --ignore=&quot;.cache/&quot; &amp;lt;source&amp;gt; &amp;lt;target&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置 Mutagen Systemd Unit&lt;/p&gt;
&lt;p&gt;在如下位置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/home/backup/.config/systemd/user/mutagen.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Mutagen Sync Daemon
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/mutagen daemon start
ExecStop=/usr/bin/mutagen daemon stop
Restart=always

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果备份 (的 Alpha 或 Beta) 需要挂载, 请等待挂载服务避免 Mutagen 认为文件夹为空从而暂停同步, 例如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;After=network.target mount-backups.service mount-backups1.service
Requires=network.target mount-backups.service mount-backups1.service
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;重载并启用该服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl daemon-reload --user
systemctl enable --user --now mutagen.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;进入 &lt;code&gt;backup&lt;/code&gt; 用户 Shell 环境&lt;/h3&gt;
&lt;p&gt;为了可以便捷得管理备份文件, 我们可以进入 &lt;code&gt;backup&lt;/code&gt; 用户&lt;/p&gt;
&lt;p&gt;可以设置如下别名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;alias enter-backup-user=&quot;sudo -E machinectl shell backup@.host&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要打开 &lt;code&gt;backup&lt;/code&gt; 仅用户可访问的路径, 请添加如下函数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;local BACKUP_DEST_DIR=&quot;/tmp/.backup-export&quot;

getbackup() {
    local SRC_FILE=&quot;$1&quot;

    local TARGET_PATH=$(sudo -u backup zsh -c &apos;
        DEST=&quot;&apos;&quot;$BACKUP_DEST_DIR&quot;&apos;&quot;
        SRC=&quot;&apos;&quot;$SRC_FILE&quot;&apos;&quot;
        
        if [[ ! -f &quot;$SRC&quot; ]]; then exit 1; fi

        mkdir -p &quot;$DEST&quot; 1&amp;gt;&amp;amp;2
        chmod 777 &quot;$DEST&quot; 1&amp;gt;&amp;amp;2

        FILENAME=$(basename &quot;$SRC&quot;)
        TARGET=&quot;$DEST/$FILENAME&quot;
        
        cp -a &quot;$SRC&quot; &quot;$TARGET&quot; 1&amp;gt;&amp;amp;2
        chmod 644 &quot;$TARGET&quot; 1&amp;gt;&amp;amp;2

        echo &quot;$TARGET&quot;
    &apos;)

    if [[ -z &quot;$TARGET_PATH&quot; ]]; then
        return 1
    fi

    sudo chown $USER:$USER &quot;$TARGET_PATH&quot; 1&amp;gt;&amp;amp;2
    chmod 700 &quot;$TARGET_PATH&quot; 1&amp;gt;&amp;amp;2

    echo &quot;$TARGET_PATH&quot;
}

clearbackup() {
    if [[ -z &quot;$BACKUP_DEST_DIR&quot; || ! -d &quot;$BACKUP_DEST_DIR&quot; ]]; then
        return 1
    fi

    rm -f -- &quot;$BACKUP_DEST_DIR&quot;/*
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并使用诸如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;command $(getbackup /path/to/file)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者, 可以使用 Yazi&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S yazi
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;alias browsebackup=&quot;sudo -Eu backup yazi&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用 Git 同步&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash

set -eu

PROJECT_DIR=&quot;$1&quot;

if [ -z &quot;$PROJECT_DIR&quot; ]; then
    echo &quot;Usage: $0 /path/to/your/repo&quot;
    exit 1
fi

cd &quot;$PROJECT_DIR&quot; || exit 1

if [[ -z $(git status --porcelain) ]]; then
    echo &quot;No changes to commit.&quot;
    exit 0
fi

# git pull --rebase
git pull

git add .

git commit -m &quot;Auto-sync: $(date &apos;+%Y-%m-%d %H:%M:%S %z&apos;)&quot;

git push origin $(git rev-parse --abbrev-ref HEAD)

echo &quot;[$(date)] Sync completed for $PROJECT_DIR&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;h3&gt;删除 Syncthing 历史记录文件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;列出要删除的文件(夹), 确保没有重要数据被删除&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;.stversions&lt;/code&gt; 是 Syncthing &quot;文件版本控制&quot; 所指定的 &quot;历史版本路径&quot;, 请与 Syncthing 配置相匹配&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;find /path/to/backup \( -name &quot;.stversions&quot; -type d \) -o \( -name &quot;.sync-conflict-*&quot; -type f \)
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;删除文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;find /path/to/backup \( -name &quot;.stversions&quot; -type d -o -name &quot;.sync-conflict-*&quot; -type f \) -exec rm -rf {} +
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用 Rmlint 移除或链接相同文件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;安装&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;yay -S rmlint
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在目标目录下运行 &lt;code&gt;rmlint&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其会在当前工作文件夹生成 &lt;code&gt;rmlint.json&lt;/code&gt; 与 &lt;code&gt;rmlint.sh&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;运行 &lt;code&gt;rmlint.sh&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;./rmlint.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;默认情况下是删除相同的文件副本, 可以使用:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-rl&lt;/code&gt; 使用相对路径软链接&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-H&lt;/code&gt; 使用硬链接&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt; 在删除文件前再次校验 Hash,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt; 在支持 CoW 的文件系统上使用 CoW (reflink)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; (默认) 删除相同的文件副本&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;清理 Rmlint 缓存文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;rm rmlint.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;!-- TODO --&amp;gt;
&amp;lt;!-- ### 清理或合并 &lt;strong&gt;相似&lt;/strong&gt; 的媒体文件 —— Czkawka&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# 或者使用 czkawka-gui
sudo pacman -S czkawka-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;查找相似媒体文件&lt;br /&gt;
对于图片, 可以使用&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;czkawka_cli image --max-difference 10 -d /path/to/images
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中, &lt;code&gt;10&lt;/code&gt; 为 &lt;em&gt;不相似度&lt;/em&gt; 等级, 可选 &lt;code&gt;[0, 100]&lt;/code&gt;, 推荐 &lt;code&gt;&amp;lt;=15&lt;/code&gt; 以免误判
&lt;code&gt;-f&lt;/code&gt; 设置扫描结果保存的文件路径
--&amp;gt;&lt;/p&gt;
&lt;h3&gt;在当前 GUI 环境下以用户 &lt;em&gt;backup&lt;/em&gt; 运行应用程式&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;授权当前的 X11 渲染环境访问权限 (Wayland 将回退到 XWayland)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;xhost +SI:localuser:backup
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;以 &lt;code&gt;backup&lt;/code&gt; 运行应用程式 (以 &lt;code&gt;dolphin&lt;/code&gt; 为例)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;kdesu&lt;/code&gt; 需要安装 &lt;code&gt;kde-cli-tools&lt;/code&gt; 包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S kde-cli-tools
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo -E /usr/lib/kf6/kdesu -u backup dolphin
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;BTW, 要同步 Dolphin 配置&lt;s&gt;以及默认应用打开方式&lt;/s&gt; (打开方式可能无效) 到 &lt;code&gt;backup&lt;/code&gt;, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cp ~/.config/dolphinrc ~/.config/mimeapps.list /home/backup/.config/
sudo chown backup:backup /home/backup/.config/dolphinrc /home/backup/.config/mimeapps.list
sudo chmod 770 /home/backup/.config/dolphinrc /home/backup/.config/mimeapps.list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并重启 Dolphin&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;要设置 Dolphin 为深色主题并且不会在重启 Dolphin 后字体变为黑色, 可以使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 设置颜色方案为 Breeze Dark
sudo -u backup kwriteconfig6 --file kdeglobals --group General --key ColorScheme BreezeDark

# 设置全局主题为 Breeze Dark
sudo -u backup kwriteconfig6 --file klaunchrc --group General --key GlobalTheme BreezeDark

# 刷新图标主题
sudo -u backup kwriteconfig6 --file kdeglobals --group Icons --key Theme breeze-dark
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在 Dolphin 右上角菜单 &quot;配置&quot; &amp;gt; &quot;窗口配色方案&quot; 为 &quot;Breeze Dark&quot; (&quot;Breeze 微风深色&quot;)&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>20260410 | 目标统一性与一致性相呼应</title><link>https://aka.lovemilk.top/notes/posts/weekly-articles/20260410/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/weekly-articles/20260410/</guid><description>本文主要介绍目标统一性与一致性相呼应, 主张保留并利用个体差异的价值</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ChinesePassageComment from &quot;@/components/misc/custom/ChinesePassageComment.vue&quot;;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/20260410-passage-requirements.png&quot; alt=&quot;passage-requirements&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;字数要求 200 字左右&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;目标统一性与一致性相呼应&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;—— 论个人目标与集体目标的相互作用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;统一的目标不具有泛适用性. 世界上不存在两片一样的叶子. 由于生物存在基因突变的根本属性, 每个各个均必然存在个体差异, 对于人类, 就会形成不同性格与思维方式. 统一的目标难以说服不同个体, 从而导致达成目标的动力缺失和/或效果不佳.&lt;/p&gt;
&lt;p&gt;同时, 统一的目标难以体现部分群体在对应领域的强项. 若有人在某一特定领域能力很强, 而目标又是笼统的全面发展, 可能导致难以将个人优势发挥, 从而影响社会进步速度. 其次, 对于大众群体, 本身个性可能不显著, 若是使用统一的目标, 难以进行差异化竞争, 导致就业压力增加, 减少社会活力.&lt;/p&gt;
&lt;p&gt;最后, 思考问题不仅要思考问题的答案, 更要质疑问题本身. 我认为, 我们可以在适当时候追求统一的目标, 反之追寻自己的目标. 目标与社会身份和场景变化相适应, 长期目标在必要时设立为社会目标, 短期目标设立为个人目标, 才能在不断变化和进步的世界中长久适应与生存.&lt;/p&gt;
&lt;p&gt;{/* &amp;lt;ChinesePassageComment source=&quot;教师&quot; score={null}&amp;gt;
&amp;lt;/ChinesePassageComment&amp;gt; */}&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>20260406 | 盛衰在于人</title><link>https://aka.lovemilk.top/notes/posts/weekly-articles/20260405/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/weekly-articles/20260405/</guid><description>本文主要佐证统治者在建制度发展中起到决定因素</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ChinesePassageComment from &quot;@/components/misc/custom/ChinesePassageComment.vue&quot;;&lt;/p&gt;
&lt;h1&gt;盛衰在于人&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;—— 论封建制度发展决定因素 (之一)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;中华系文明古代的封建制度决定了统治者在其政治主体的兴衰中占据主导地位. &quot;盛衰之理, 在于人事.&quot;, 一代又一代的统治者不断用实际行动证明这句话的准确性与正确性, 亦或实际是一代又一代统治者被的行为被总结成这简练一句.&lt;/p&gt;
&lt;p&gt;由于宋朝统治者过于害怕重蹈前朝武装兵变的灭朝原因, 长期主张重文轻武, 并将武力职能单位不断细分, 导致士兵的将领轮番更换难以培养默契, 使得综合武力下降. 同时, 由于重文轻武的政策, 部分拥有武力报复的擅武人才被或有意或无意地埋没, 进一步加大了综合武力与其他国家/地区的差距. 这也埋下了后与周围各国家/地区不断屈辱求和, 宁可割地不肯抗战的种子, 统治者一步步将自己的和自己的江山推入灭亡的深渊, 最终被少数民族蒙古族建立的元朝统治了东亚大部分与少部分欧洲领土 (今中国大陆, 蒙古国以及俄罗斯西伯利亚的部分区域).&lt;/p&gt;
&lt;p&gt;宋朝统治者过于重文轻武, 南宋时期统治者贪图享乐, 委屈求和, 终导致宋朝灭亡. 若南宋统治者重新思考武力与国家兴衰稳定的关系, 拥有进行翻天覆地改革的决心与勇气, 或许仍有机会挽救宋朝. 但是同时, 不可否认宋朝的文化确乎得到了飞速丰富且广泛的发展. 这也进一步佐证了在封建制度下统治者的思想拥有对社会发展 (方向) 的决定性作用.&lt;/p&gt;
&lt;p&gt;反观秦朝, 秦朝作为中华系文明的首个 &amp;lt;strong&amp;gt;统一的封建国家&amp;lt;/strong&amp;gt;, 其在统一各领域单位与名词的作用不容小视. 最可在日常生活中体现的想必就是统一度量衡了. 相比起后世的英国以 &amp;lt;i&amp;gt;英国国王脚的长度单位&amp;lt;/i&amp;gt; 作为英尺造成难以准确定义长度, 早在英国统一前近 2000 年的秦始皇却在统一度量衡中不拘泥封建制度, 更不似乎想要表达权威的态度以自身及周围事物作为度量衡标准, 而是采用官方制造测量设备定义度量衡, 极大减少了误差和不确定因素. 甚至, 秦朝还要求定期对测量设备进行检验校正, 极大减少了各地区的交流沟通成本, 更是对后各朝代/国家/地区的社会产生了延续至今的影响.&lt;/p&gt;
&lt;p&gt;有人认为秦统治者过于残暴, &quot;焚书坑儒&quot;. 但是实际上, 秦始皇是功大于过的, 况且 &quot;焚书坑儒&quot; 的事实极有可能是秦始皇只会活埋宣扬极端异端主义者焚烧其书籍, 并非厮杀无辜. 反而, 秦始皇对标准化规范化的追求, 极大程度上为后朝提供了社会各领域的标准参考, 影响至今.&lt;/p&gt;
&lt;p&gt;综上所述, &quot;盛衰之理, 在于人事.&quot; 便是在中华系文明长期以来的封建制度下, 统治者的主导性的最佳总结.&lt;/p&gt;
&lt;p&gt;&amp;lt;ChinesePassageComment source=&quot;教师&quot; score={null}&amp;gt;
此文以“盛衰之理，在于人事”为核心论点，观点明确，并围绕封建制度下统治者决策对国家命运的决定性作用展开论述，立意鲜明，逻辑较清晰。文章选取宋朝与秦朝两个极具代表性的朝代，一正一反形成鲜明对比，以宋朝重文轻武、苟且偷安导致亡国的史实，导致灾难性后果；以秦朝统一度量衡、推行标准化建设的创举，很好地支撑了核心观点，对“焚书坑儒”等历史争议问题进行了自己辩证思考，体现出较强的历史思辨能力与独立思考意识。如若能进一步补充更多朝代案例，细化史料细节，文章的说服力将更上一层楼。
&amp;lt;/ChinesePassageComment&amp;gt;&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>修复 PVE 系统网卡无法获取公网 IPv6</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/pve/ipv6/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/pve/ipv6/</guid><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;为了启用 PVE 系统 IPv6, 同时避免系统启动时一直等待, 请遵循如下方法&lt;/p&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;p&gt;在 sysctl 配置文件中写入如下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# IPv6 Support
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.&amp;lt;interface&amp;gt;.forwarding = 1

net.ipv6.conf.default.accept_ra = 2
net.ipv6.conf.all.accept_ra = 2
net.ipv6.conf.&amp;lt;interface&amp;gt;.accept_ra = 2

net.ipv6.conf.&amp;lt;interface&amp;gt;.autoconf = 1
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;其中 &lt;code&gt;&amp;lt;interface&amp;gt;&lt;/code&gt; 字样为你的 PVE 桥接网卡名称, 一般为 &lt;code&gt;vmbr0&lt;/code&gt;, 可以查看如下文件获得:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/network/interfaces
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;中&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
auto lo
iface lo inet loopback

iface enp2s0 inet manual

auto vmbr0  # 差不多是这里
iface vmbr0 inet dhcp
	bridge-ports enp2s0
	bridge-stp off
	bridge-fd 0
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
不得在 &lt;code&gt;/etc/network/interfaces&lt;/code&gt; 添加 &lt;code&gt;iface &amp;lt;interface&amp;gt; inet6 auto&lt;/code&gt;, 这可能导致系统启动时一直等待&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;重载并应用配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要验证是否成功获取 IPv6, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ip -6 a show &amp;lt;interface&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ip -6 a show vmbr0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;BTW&lt;/h2&gt;
&lt;p&gt;要在 Cloudflared 服务中启用 IPv6 边缘节点, 请添加参数:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--edge-ip-version 6
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Selkies WebUI 操控方案 | 部署适用于 ArchLinux KDE 桌面环境的 Selkies 与 KasmVNC</title><link>https://aka.lovemilk.top/notes/posts/deployment/selkies/archlinux-kde/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/selkies/archlinux-kde/</guid><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Selkies, 全称 Selkies-GStreamer, 是一个开源的低延迟高性能 Linux 原生 GPU/CPU 加速 WebRTC HTML5 远程桌面流媒体平台, 适用于自托管 容器 Kubernetes 或 云/HPC 平台, 其原型由 Google 工程师开发&lt;a href=&quot;https://selkies-project.github.io/selkies/design/#what-is-selkies-gstreamer&quot;&gt;^what-is-Selkies&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Selkies 设计上就是为了高性能游戏或远程桌面串流设计的, 可以直接调用 GPU 硬件编解码, 相较于 noVNC 等传统 VNC 解决方案, 配置更简单.&lt;/p&gt;
&lt;p&gt;同时, Selkies 支持免配置音频传输, 仅需保证后端兼容 &lt;code&gt;PulseAudio&lt;/code&gt; (例如 PulseAudio 与 PipeWire-Pulse)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
Selkies 暂未支持 Wayland&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;安装并配置基于 X11 的 KDE 桌面环境&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/KDE&quot;&gt;https://wiki.archlinux.org/title/KDE&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://archlinux.org/news/plasma-640-will-need-manual-intervention-if-you-are-on-x11/&quot;&gt;https://archlinux.org/news/plasma-640-will-need-manual-intervention-if-you-are-on-x11/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用如下指令安装基于 X11 的 KDE 桌面环境及其相关组件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S plasma-meta plasma-x11-session konsole dolphin pipewire pipewire-pulse xorg-server xorg-xinit xf86-video-dummy polkit-kde-agent
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 KDE 的 X11 启动脚本&lt;/h3&gt;
&lt;p&gt;在如下路径写入如下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.xinitrc
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/sh

unset DBUS_SESSION_BUS_ADDRESS
unset DBUS_SESSION_BUS_PID

export DESKTOP_SESSION=plasma
export XDG_CURRENT_DESKTOP=KDE
export XDG_SESSION_TYPE=x11

if [ -x /usr/bin/dbus-run-session ]; then
  exec dbus-run-session -- startplasma-x11
else
  exec dbus-launch --exit-with-session startplasma-x11
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;若需调整系统音量, 请参阅 &lt;a href=&quot;#kde-%E6%98%BE%E7%A4%BA%E6%97%A0%E9%9F%B3%E9%A2%91%E8%AE%BE%E5%A4%87%E5%AF%BC%E8%87%B4%E6%97%A0%E6%B3%95%E8%B0%83%E8%8A%82%E7%B3%BB%E7%BB%9F%E9%9F%B3%E9%87%8F&quot;&gt;故障排除 &amp;gt; KDE 显示无音频设备导致无法调节系统音量&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;并配置可执行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x ~/.xinitrc
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 X11 虚拟显示器&lt;/h3&gt;
&lt;p&gt;在 X11 配置目录写入如下配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/X11/xorg.conf.d/20-dummy.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Section &quot;Device&quot;
    Identifier  &quot;DummyDevice&quot;
    Driver      &quot;dummy&quot;
    VideoRam    512000
EndSection

Section &quot;Monitor&quot;
    Identifier  &quot;DummyMonitor&quot;
    Modeline    &quot;1920x1080_60.00&quot;  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
    HorizSync   28.0-110.0
    VertRefresh 43.0-90.0
EndSection

Section &quot;Screen&quot;
    Identifier  &quot;DummyScreen&quot;
    Device      &quot;DummyDevice&quot;
    Monitor     &quot;DummyMonitor&quot;
    DefaultDepth 24
    SubSection &quot;Display&quot;
        Depth 24
        Modes &quot;1920x1080_60.00&quot;
    EndSubSection
EndSection
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 X11 启动服务&lt;/h3&gt;
&lt;p&gt;为了保证 X11 Server 可以随系统自启动, 我们需要使用自定义 Systemd Unit&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/headless-x11-kde.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Headless KDE Plasma X11 Session on :0
After=network.target

[Service]
Environment=DISPLAY=:0
Environment=XDG_SESSION_TYPE=x11
Environment=XAUTHORITY=%h/.Xauthority

ExecStart=/usr/bin/startx %h/.xinitrc -- :0 -config 20-dummy.conf

Restart=always
RestartSec=5s

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加载并启用服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user daemon-reload
systemctl --user enable --now headless-x11-kde.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;启动 KDE 所需的 Pipewire 服务系列&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user enable --now pipewire.service pipewire-pulse.service wireplumber.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装 Selkies&lt;/h2&gt;
&lt;p&gt;从 &lt;a href=&quot;https://github.com/selkies-project/selkies/releases&quot;&gt;Selkies Releases&lt;/a&gt; 下载便携版压缩包并解压, 该版本自带 Python 与 GStreamer 运行环境, 不依赖系统 Python&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -LO https://github.com/selkies-project/selkies/releases/download/v&amp;lt;version&amp;gt;/selkies-gstreamer-portable-v&amp;lt;version&amp;gt;_amd64.tar.gz
tar -xzf selkies-gstreamer-portable-v&amp;lt;version&amp;gt;_amd64.tar.gz -C ~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;默认安装路径位于 &lt;code&gt;~/selkies-gstreamer&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;配置 Selkies 的 Systemd Unit&lt;/h3&gt;
&lt;p&gt;在如下路径新建 Env 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/selkies-gstreamer/selkies.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改必要配置, 诸如端口号, 用户, 密码与&lt;a href=&quot;https://selkies-project.github.io/selkies/component/#encoders&quot;&gt;编码器配置&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELKIES_ADDR=0.0.0.0
SELKIES_PORT=&amp;lt;port&amp;gt;
SELKIES_USER=&amp;lt;user&amp;gt;
SELKIES_PASS=&amp;lt;password&amp;gt;
SELKIES_ENCODER=x264enc
SELKIES_RESIZE=false
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
编码器名称必须在 &lt;code&gt;selkies-gstreamer-run --help&lt;/code&gt; 输出的可选值列表中. 本机使用 &lt;code&gt;vah264enc&lt;/code&gt; (VA-API 硬件编码) 时, 便携包自带的 VA-API 插件与系统 intel-media-driver 不兼容, 构建视频管线时报 &lt;code&gt;&apos;NoneType&apos; object has no attribute &apos;set_property&apos;&lt;/code&gt;, 故改用软件编码 &lt;code&gt;x264enc&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
对于无法使用 GPU 的虚拟机或者 GPU 性能较弱设备 (如我使用的 Intel UHD Graphics P630&lt;a href=&quot;https://www.intel.com/content/www/us/en/products/sku/134854/intel-xeon-e2124g-processor-8m-cache-up-to-4-50-ghz/specifications.html#specs-1-0-4&quot;&gt;^uhdp630&lt;/a&gt;), 使用 &lt;code&gt;x264enc&lt;/code&gt; 可能出现跳帧问题, 可尝试 &lt;code&gt;svtav1enc&lt;/code&gt; 或 &lt;code&gt;av1enc&lt;/code&gt; 编码方式&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在如下文件写入 Unit&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/selkies.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Selkies GStreamer Service
# 必须和上面定义的 KDE Unit 名称对应, `Wants` 同理
After=headless-x11-kde.service
Wants=headless-x11-kde.service

[Service]
Type=simple
# 设置默认环境变量, 参考官方文档
Environment=DISPLAY=:0
Environment=PIPEWIRE_LATENCY=128/48000
Environment=XDG_RUNTIME_DIR=%t
Environment=PIPEWIRE_RUNTIME_DIR=%t
Environment=PULSE_RUNTIME_PATH=%t/pulse
Environment=PULSE_SERVER=unix:%t/pulse/native

EnvironmentFile=%h/selkies-gstreamer/selkies.env

ExecStart=%h/selkies-gstreamer/selkies-gstreamer-run \
    --addr=${SELKIES_ADDR} \
    --port=${SELKIES_PORT} \
    --enable_https=false \
    --basic_auth_user=${SELKIES_USER} \
    --basic_auth_password=${SELKIES_PASS} \
    --encoder=${SELKIES_ENCODER} \
    --enable_resize=${SELKIES_RESIZE}

Restart=always
RestartSec=5s

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加载并启用服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user daemon-reload
systemctl --user enable --now selkies.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置 TURN 服务器以支持公网访问&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;截至 v1.6.2, Selkies 的媒体传输仅支持 WebRTC, WebSocket 传输模式尚未发布&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;WebRTC 优先尝试 P2P 直连, 当客户端与服务器之间无法建立直连时 (例如服务器位于 NAT 后, 公网出口为代理, 或客户端网路封禁 UDP), 必须通过 TURN 服务器中继媒体流. Selkies 默认使用公共 TURN 服务, 可用性无法保证, 公网访问场景推荐自建&lt;/p&gt;
&lt;h3&gt;安装并配置 coturn&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S coturn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;coturn 的静态用户库为 SQLite 数据库, 无法直接写入明文文件, 需要使用 &lt;code&gt;turnadmin&lt;/code&gt; 生成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo -u turnserver turnadmin -a -u &amp;lt;user&amp;gt; -r &amp;lt;realm&amp;gt; -p &amp;lt;password&amp;gt; -b /etc/turnserver/turnuserdb.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在如下路径写入配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/turnserver/turnserver.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;listening-port=3478
min-port=49152
max-port=65535
realm=&amp;lt;realm&amp;gt;
userdb=/etc/turnserver/turnuserdb.conf
lt-cred-mech
fingerprint
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
Arch 的 coturn 服务读取的配置文件为 &lt;code&gt;/etc/turnserver/turnserver.conf&lt;/code&gt;, 而非 &lt;code&gt;/etc/turnserver.conf&lt;/code&gt;, 配置写错位置时所有配置会静默失效, 包括鉴权, 使 TURN 退化为任意人可用的开放中继&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
若客户端直接连接 TURN 服务器且服务器位于 NAT 后, 需增加 &lt;code&gt;external-ip=&amp;lt;内网地址&amp;gt;/&amp;lt;公网地址&amp;gt;&lt;/code&gt;, 否则下发的 TURN 中继地址不可达; 若客户端经由反向代理接入, 则不需要该配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now turnserver
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
验证是否生效可查看 coturn 日志, 客户端连接后出现的会话记录中应带有 &lt;code&gt;realm&lt;/code&gt; 与 &lt;code&gt;username&lt;/code&gt; 字段&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;配置 Selkies 使用自建 TURN&lt;/h3&gt;
&lt;p&gt;打开&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/selkies-gstreamer/selkies.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELKIES_TURN_HOST=&amp;lt;turn-host&amp;gt;
SELKIES_TURN_PORT=&amp;lt;turn-port&amp;gt;
SELKIES_TURN_PROTOCOL=tcp
SELKIES_TURN_TLS=false
SELKIES_TURN_USERNAME=&amp;lt;user&amp;gt;
SELKIES_TURN_PASSWORD=&amp;lt;password&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
若 TURN 端口无法直接暴露, 或者想要统一使用 Caddy 管理 TLS 证书, 可使用 L4 反向代理转发, 由代理终结 TLS 后以明文转发至 coturn 的 3478 端口. 此时 &lt;code&gt;SELKIES_TURN_TLS=true&lt;/code&gt;, &lt;code&gt;SELKIES_TURN_PORT&lt;/code&gt; 填写代理的监听端口, coturn 侧无需配置证书&lt;/p&gt;
&lt;p&gt;对于带有 &lt;code&gt;https://github.com/mholt/caddy-l4&lt;/code&gt; 插件的 Caddy, 可以直接参考如下 Caddyfile&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 全局配置
{
layer4 {
      :5349 {
          @my-domain {
              tls sni &amp;lt;sni&amp;gt;
          }

          route @my-domain {
              tls
              proxy &amp;lt;internal-ip&amp;gt;:3478
          }
      }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h2&gt;故障排除&lt;/h2&gt;
&lt;h3&gt;Selkies 画面有显示但仍在画面中间显示 &lt;code&gt;Waiting for stream.&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;发生该情况可能存在多种原因:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;由于 Selkies 只接收到了视频画面, 无法获取到音频. 尝试检查 Pipewire 和 PulseAudio 等服务的状态.&lt;/li&gt;
&lt;li&gt;客户端不支持该编解码格式, 导致解码时出现错误 (多数情况是客户端不支持 Opus 音频格式)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;DBus 进程在 SSH 结束后退出&lt;/h3&gt;
&lt;p&gt;请确保开启了后台进程常驻&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo loginctl enable-linger $USER
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;KDE 显示无音频设备导致无法调节系统音量&lt;/h3&gt;
&lt;p&gt;我们可以使用 &lt;code&gt;pactl&lt;/code&gt; 加载虚拟音频模块, 并将其设为系统默认输出&lt;/p&gt;
&lt;p&gt;为了自动化地设置虚拟音频输出, 请在 &lt;code&gt;~/.xinitrc&lt;/code&gt; 的 &lt;code&gt;exec&lt;/code&gt; 前添加如下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;VIRTUAL_SINK_NAME=&quot;default&quot;

if ! pactl list sinks short | awk &apos;{print $2}&apos; | grep -Fxq &quot;$VIRTUAL_SINK_NAME&quot;; then
  pactl load-module module-null-sink sink_name=&quot;$VIRTUAL_SINK_NAME&quot; sink_properties=device.description=&quot;$VIRTUAL_SINK_NAME&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
fi

pactl set-default-sink &quot;$VIRTUAL_SINK_NAME&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
无实体音频输入设备的机器还需要将默认录音源指向虚拟输出的 Monitor, 否则 Selkies 的音频管线会因找不到默认源而失败 (报 &lt;code&gt;Failed to connect stream: No such entity&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;pactl set-default-source &quot;$VIRTUAL_SINK_NAME.monitor&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Selkies 客户端网路环境无法访问 TURN/STUN Server 或者 443 端口, 导致无法建立连接&lt;/h3&gt;
&lt;p&gt;由于 Selkies 默认开启了 TURN/STUN Server, 无法访问的客户端会尝试连接并失败造成无法成功传输画面. 出现类似于如下日志&lt;/p&gt;
&lt;p&gt;Status Log&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[14:56:31] [webrtc] [ERROR] attempt to send data channel message before channel was open
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Debug Log&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[14:44:12] [app] using TURN servers: turn:staticauth.openrelay.metered.ca:443?transport=udp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若客户端与服务器之间可以建立直连 (如同处一个内网), 可以禁用 Selkies 的全部 TURN/STUN Server; 若需要公网访问, 请参阅 &lt;a href=&quot;#%E9%85%8D%E7%BD%AE-turn-%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BB%A5%E6%94%AF%E6%8C%81%E5%85%AC%E7%BD%91%E8%AE%BF%E9%97%AE&quot;&gt;配置 TURN 服务器以支持公网访问&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 Env 文件中写入如下内容&lt;/p&gt;
&lt;p&gt;打开&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/selkies-gstreamer/selkies.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELKIES_TURN_HOST=
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
若仍然无法加载, 请检查网路环境 UDP 连通性&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;KDE 部分界面文本不是中文&lt;/h3&gt;
&lt;p&gt;若 &lt;code&gt;/etc/locale.gen&lt;/code&gt; 中的 &lt;code&gt;zh_CN.UTF-8&lt;/code&gt; 处于注释状态, 系统实际上并未生成该 Locale, 依赖 glibc Locale 的程序会回退到英文&lt;/p&gt;
&lt;p&gt;取消注释并生成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo sed -i &apos;s/^#zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/&apos; /etc/locale.gen
sudo locale-gen
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;重启后 KDE 壁纸被重置&lt;/h3&gt;
&lt;p&gt;若同时存在 SDDM 自动登录会话与本方案的 headless 会话, 两个 Plasma 实例会同时读写同一份桌面配置, 导致壁纸等设置被反复覆盖; 配置文件中残留的空 Containment 也会导致启动时绑定到错误的桌面&lt;/p&gt;
&lt;p&gt;禁用 SDDM&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl disable --now sddm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并检查 &lt;code&gt;~/.config/plasma-org.kde.plasma.desktop-appletsrc&lt;/code&gt; 中是否残留了无内容的 &lt;code&gt;[Containments][n]&lt;/code&gt; 段&lt;/p&gt;
&lt;h2&gt;针对 UDP 不佳网路环境的共存部署 KasmVNC&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://kasmweb.com/kasmvnc/docs/1.3.4/index.html&quot;&gt;https://kasmweb.com/kasmvnc/docs/1.3.4/index.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;由于 WebRTC 很大程度上依赖 UDP, 并且在受限网路工况中表现不佳, 我们可以使用 KasmVNC 与 Selkies 同时部署的方式, 使得客户端可以选择一个合适的 WebUI 操控方案&lt;/p&gt;
&lt;h3&gt;安装 KasmVNC&lt;/h3&gt;
&lt;p&gt;安装 KasmVNC Server&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yay -S kasmvncserver-bin openssl-1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;code&gt;kasmvncserver-bin&lt;/code&gt; 1.5.0 存在启动崩溃问题 (Xvnc 在编码器探测阶段段错误, 导致服务无限重启), 请使用 1.4.0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;git clone https://aur.archlinux.org/kasmvncserver-bin.git
cd kasmvncserver-bin
git checkout 63d4b2c  # 1.4.0-2
makepkg -si
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并在 &lt;code&gt;/etc/pacman.conf&lt;/code&gt; 中阻止其被升级&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IgnorePkg = kasmvncserver-bin
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 WebUI 用户名密码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;kasmvncpasswd -u &amp;lt;USER&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;若要配置与当前用户名称一样的用户名, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;kasmvncpasswd -u $USER
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;创建证书文件&lt;/h3&gt;
&lt;p&gt;由于 KasmVNC 强制要求配置 TLS 证书 (无论是否启用 HTTPS), 我们需要使用 OpenSSL 创建证书&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl req -x509 -nodes -days 90 -newkey rsa:4096 \
  -keyout ~/ssl-cert-snakeoil.key \
  -out ~/ssl-cert-snakeoil.pem \
  -subj &quot;/C=CN/ST=Default/L=Default/O=KasmVNC/CN=${HOST:-default-host}&quot;

chmod 644 ~/ssl-cert-snakeoil.pem
chmod 600 ~/ssl-cert-snakeoil.key
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;编辑 KasmVNC 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;~/.vnc/kasmvnc.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;network:
  protocol: http
  interface: 0.0.0.0
  websocket_port: &amp;lt;port&amp;gt;  # edit
  use_ipv4: true
  use_ipv6: true
  udp:
    public_ip: auto
    port: auto
    payload_size: auto
    stun_server: auto
  ssl:
    pem_certificate: /home/&amp;lt;USER&amp;gt;/ssl-cert-snakeoil.pem  # edit
    pem_key: /home/&amp;lt;USER&amp;gt;/ssl-cert-snakeoil.key  # edit
    require_ssl: false
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;若服务启动耗时较长, 或显示 &lt;code&gt;Failed to get public IP, please specify it with -publicIP&lt;/code&gt; 字样, 请修改配置文件的 &lt;code&gt;network.udp.public_ip&lt;/code&gt; 字段, 或在启动 &lt;code&gt;kasmvncserver&lt;/code&gt; 时使用 &lt;code&gt;-publicIP &amp;lt;public-ipaddr&amp;gt;&lt;/code&gt; 指定 公网 IP 地址 (没有者尝试填写内网地址)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;[可选] 启用 GPU 加速&lt;/h3&gt;
&lt;p&gt;GPU 加速请按需启用&lt;/p&gt;
&lt;p&gt;找到设备上的 Render 设备, 对于拥有单个 GPU 的设备一般来说为 &lt;code&gt;/dev/dri/renderD128&lt;/code&gt;, 同时拥有核显与独显的设备一般来说编号较大者为独显, 常见于 &lt;code&gt;/dev/dri/renderD129&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.vnc/kasmvnc.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;desktop:
  gpu:
    hw3d: true
    drinode: /dev/dri/renderD&amp;lt;id&amp;gt;
  resolution:
    width: 1920
    height: 1080
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;hw3d&lt;/code&gt; 开启后, KasmVNC 的 X Server 会提供 DRI3 扩展, 应用可自行分配 GPU 缓冲并直接渲染, 即使 Xvnc 不提供 GLX 也能获得硬件加速&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
分辨率必须通过 &lt;code&gt;desktop.resolution&lt;/code&gt; 指定, &lt;code&gt;vncserver -geometry&lt;/code&gt; 参数在新版本中不会生效&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
Xvnc 不提供 GLX 扩展, Chrome 的 ANGLE GL 后端会因此回退到软件渲染, 需要添加启动参数强制使用 EGL&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;打开&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/chrome-flags.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--use-angle=gl-egl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在会话内运行 &lt;code&gt;eglinfo&lt;/code&gt; 确认渲染器为 &lt;code&gt;iris&lt;/code&gt; (Intel) 等硬件驱动名称即配置成功&lt;/p&gt;
&lt;h3&gt;使用不同方法共存部署&lt;/h3&gt;
&lt;p&gt;目前, 将 Selkies 与 KasmVNC 共存部署共有两种方法 (任选其一即可):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#11-%E7%A6%81%E7%94%A8-kde-%E5%90%AF%E5%8A%A8%E7%A8%8B%E5%BA%8F&quot;&gt;使用 KasmVNC 作为 X11 Session 启动者&lt;/a&gt; (推荐, 配合 &lt;code&gt;hw3d&lt;/code&gt; 可获得 GPU 加速)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#21-%E4%BD%BF%E7%94%A8-kasmxproxy-%E8%BD%AC%E5%8F%91%E7%8E%B0%E6%9C%89-x11-display&quot;&gt;使用 kasmxproxy 转发现有 X11 Display&lt;/a&gt; (应用运行在 dummy 驱动的 Xorg 上, 只能获得软件渲染)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.1 禁用 KDE 启动程序&lt;/h3&gt;
&lt;p&gt;由于 KasmVNC Server 会自己启动一个 X11 Session, 我们需要禁用先前定义的 &lt;code&gt;headless-x11-kde.service&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user disable --now headless-x11-kde.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.2 启动 DE&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;vncserver&lt;/code&gt; 默认在第一个客户端连接时才执行 &lt;code&gt;~/.vnc/xstartup&lt;/code&gt; 启动 DE, 这会导致没有客户端连接时 Selkies 无画面可采集&lt;/p&gt;
&lt;p&gt;因此我们使用 &lt;code&gt;-noxstartup&lt;/code&gt; 创建空白 X11 Session, 并在 Systemd Unit 中等待 X Server 就绪后直接启动先前写好的 &lt;code&gt;~/.xinitrc&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;1.3 配置 KasmVNC 为 Systemd Unit&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/kasmvnc.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=KasmVNC Service (KDE session on :0)
After=network.target

[Service]
Type=simple
Environment=XAUTHORITY=%h/.Xauthority
# 先等待 X Server 可以接受连接再启动 DE, 否则 Plasma 会因连接被拒而立即退出
ExecStart=/usr/bin/sh -c &apos;/usr/bin/vncserver -kill :0 &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; /usr/bin/vncserver :0 -noxstartup &amp;amp;&amp;amp; { i=0; until DISPLAY=:0 XAUTHORITY=%h/.Xauthority /usr/bin/xset q &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; do i=$((i+1)); [ $i -ge 150 ] &amp;amp;&amp;amp; exit 1; sleep 0.2; done; }; export DISPLAY=:0; exec %h/.xinitrc&apos;
ExecStop=/usr/bin/sh -c &apos;/usr/bin/vncserver -kill :0 || true&apos;

Restart=on-failure
RestartSec=5

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于我们禁用了 &lt;code&gt;headless-x11-kde.service&lt;/code&gt;, 需要将 Selkies Systemd Unit 的等待服务设置为 &lt;code&gt;kasmvnc.service&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/selkies.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;After=headless-x11-kde.service
Wants=headless-x11-kde.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;After=kasmvnc.service
Wants=kasmvnc.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载并启用服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user daemon-reload
systemctl --user restart selkies.service
systemctl --user enable --now kasmvnc.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.1 使用 kasmxproxy 转发现有 X11 Display&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
该方法中应用运行在 &lt;code&gt;xf86-video-dummy&lt;/code&gt; 驱动的 Xorg 上, 只能获得软件渲染, 且多一层屏幕拷贝开销, 仅在无法使用 &lt;a href=&quot;#12-%E5%90%AF%E5%8A%A8-de&quot;&gt;方法 1&lt;/a&gt; 时使用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;先前的 &lt;code&gt;headless-x11-kde.service&lt;/code&gt; 我们已经在 Display &lt;code&gt;:0&lt;/code&gt; 启动了一个 X11 Session, 我们需要使用 &lt;code&gt;kasmxproxy&lt;/code&gt; 转发这个 Display&lt;/p&gt;
&lt;h3&gt;2.2 配置 KasmVNC 与 kasmxproxy 为 Systemd Unit&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;对 &lt;code&gt;vncserver&lt;/code&gt; 使用 &lt;code&gt;-noxstartup&lt;/code&gt; 选项以创建空白的 X11 Session, 不启动 DE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/kasmvnc.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=KasmVNC Service
After=network.target

[Service]
Type=simple
# 不能使用 ExecStartPre, 因为 vncserver 启动不是立即的
ExecStart=/usr/bin/sh -c &apos;/usr/bin/vncserver :99 -noxstartup &amp;amp;&amp;amp; /usr/bin/kasmxproxy -a :0 -v :99 -r -f ${KASM_FPS:-60}&apos;
ExecStop=/usr/bin/vncserver -kill :99

Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果需要自动修改远程显示器大小, 请携带 &lt;code&gt;-r&lt;/code&gt; 参数&lt;br /&gt;
参数配置请参阅 &lt;a href=&quot;https://kasmweb.com/kasmvnc/docs/1.3.4/man/kasmxproxy.html#options&quot;&gt;https://kasmweb.com/kasmvnc/docs/1.3.4/man/kasmxproxy.html#options&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.3 配置剪切板同步&lt;/h3&gt;
&lt;p&gt;由于我们使用 &lt;code&gt;kasmxproxy&lt;/code&gt; 转发了 Display 的内容, 使得 KasmVNC 读取屏幕以及写入剪切板的目标并不是实际上 X11 Session 所在屏幕, 我们需要使用 &lt;code&gt;xclip&lt;/code&gt; 工具并编写脚本轮询同步剪切板&lt;/p&gt;
&lt;p&gt;安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yay -S xclip
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/kasmvnc-clipboard.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
export XAUTHORITY=&quot;${XAUTHORITY:-$HOME/.Xauthority}&quot;

LAST_0=&quot;&quot;
LAST_99=&quot;&quot;

echo &quot;[$(date &apos;+%Y-%m-%d %H:%M:%S&apos;)] Clipboard Sync Service Started...&quot;
echo &quot;Monitoring :0 (KDE) &amp;lt;-&amp;gt; :99 (KasmVNC)&quot;

while true; do
    CUR_0=$(/usr/bin/xclip -display :0 -o -selection clipboard 2&amp;gt;/dev/null)
    CUR_99=$(/usr/bin/xclip -display :99 -o -selection clipboard 2&amp;gt;/dev/null)

    if [[ &quot;$CUR_0&quot; != &quot;$LAST_0&quot; &amp;amp;&amp;amp; -n &quot;$CUR_0&quot; ]]; then
        echo -n &quot;$CUR_0&quot; | /usr/bin/xclip -display :99 -i -selection clipboard
        LAST_0=&quot;$CUR_0&quot;
        LAST_99=&quot;$CUR_0&quot;
        echo &quot;[$(date &apos;+%H:%M:%S&apos;)] Sync: :0 -&amp;gt; :99&quot;

    elif [[ &quot;$CUR_99&quot; != &quot;$LAST_99&quot; &amp;amp;&amp;amp; -n &quot;$CUR_99&quot; ]]; then
        echo -n &quot;$CUR_99&quot; | /usr/bin/xclip -display :0 -i -selection clipboard
        LAST_99=&quot;$CUR_99&quot;
        LAST_0=&quot;$CUR_99&quot;
        echo &quot;[$(date &apos;+%H:%M:%S&apos;)] Sync: :99 -&amp;gt; :0&quot;
    fi

    sleep 0.25
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置为 Systemd Unit&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/kasmvnc-clipboard.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=KasmVNC Clipboard Sync
After=headless-x11-kde.service kasmvnc.service
Requires=headless-x11-kde.service kasmvnc.service

[Service]
ExecStart=/usr/bin/bash &quot;%h/.config/systemd/user/kasmvnc-clipboard.sh&quot;

StandardOutput=journal
StandardError=journal

Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载并启用服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user daemon-reload
systemctl --user enable --now kasmvnc-clipboard.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;重载并启用服务&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user daemon-reload
systemctl --user enable --now kasmvnc.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;[可选] 反向代理配置&lt;/h3&gt;
&lt;p&gt;KasmVNC 使用 Websocket 作为长连接, 所以可以直接使用一般的现代化反向代理软件. 这里以 Caddy 为例&lt;/p&gt;
&lt;p&gt;要使 Caddy 反向代理忽略 TLS 证书有效性, 请使用如下配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;host:port {
  reverse_proxy https://&amp;lt;url&amp;gt; {
      transport http {
          tls_insecure_skip_verify
      }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
在实际访问页面时, 可能会在弹出 HTTP Basic Auth 时显示 &quot;不安全&quot; (没有 TLS 证书或 TLS 握手失败) 的提示, 这其实是因为浏览器弹窗阻塞了主窗口, 导致握手成功后一瞬间的小🔒图标 (代表 HTTPS 握手成功) 没有被正确显示&lt;br /&gt;
本人使用 Wireshark 抓包, 发现 Basic Auth 的讯息是使用 QUIC 发送的, 故不必担心隐私泄露问题&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>安装与初始化 CachyOS</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/cachyos/installation/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/cachyos/installation/</guid><description>本文主要介绍 CachyOS 的安装方法, 配置 Niri 桌面环境, 并初始化个人配置与常用工具</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::CAUTION
本教程 (仅) 适用于 &lt;strong&gt;拥有一定 Linux 知识储备的用户&lt;/strong&gt;, 若您无法理解并正确填写类似 Ubuntu 的交互式 Linux 安装器的选项, 请先前往 &lt;a href=&quot;https://arch.icekylin.online&quot;&gt;archlinux 简明指南
&lt;/a&gt; 学习安装 Linux 的基础知识
:::&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;下载 CachyOS &lt;a href=&quot;https://cachyos.org/download&quot;&gt;官方 ISO&lt;/a&gt;, 使用交互式安装器安装&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
由于在 CachyOS Live CD 环境内, 其安装器是从云端 (GitHub) 拉取的, 请确保网路可访问性与连接通畅&lt;/p&gt;
&lt;p&gt;对于拥有多个显示器的与用户, 请注意安装器是否从 &lt;strong&gt;非主要&lt;/strong&gt; &lt;em&gt;(或者你没有注意到的)&lt;/em&gt; &lt;strong&gt;显示器&lt;/strong&gt; 弹出, 从而无辜等待安装器下载, &lt;s&gt;浪费人生&lt;/s&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用安装器时, 若需要与 Windows 共存共存安装, 请在分区时选择 &quot;手动分区&quot;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建不小于 512 MiB (GRUB) 或 2 GIB (其他引导方式) 的 Fat32 Boot 分区, 挂载于 &lt;code&gt;/boot/efi&lt;/code&gt;, 勾选 &lt;code&gt;boot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;创建适当大小的 Btrfs 根目录, 挂载于 &lt;code&gt;/&lt;/code&gt; (CachyOS 会自动处理 &lt;code&gt;/home&lt;/code&gt; 等子卷)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;选择 Niri 桌面环境 (后续会使用安装脚本覆盖配置) 或 不配置桌面环境&lt;/p&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;h3&gt;Virtual Console Service 报错&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nakanomikuorg/arch-guide/issues/299&quot;&gt;https://github.com/nakanomikuorg/arch-guide/issues/299&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo touch /etc/vconsole.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/vconsole.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入/修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;KEYMAP=us
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装 Niri&lt;/h3&gt;
&lt;p&gt;使用 &lt;a href=&quot;https://www.bilibili.com/video/BV1CHZaBrEF6&quot;&gt;【Arch零门槛】绝美Linux桌面，一键安装Niri+DMS - BIliBili&lt;/a&gt; 提供的安装脚本安装 Niri&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bash &amp;lt;(curl -L shorin.xyz/archsetup)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
由于 CachyOS 默认使用 Fishshell, 导致该语法无法被识别, 请在 Bash 内运行上述脚本&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
CachyOS 默认的 Niri 与 一键脚本有冲突, 请使用 &lt;strong&gt;Super/Meta/Command + T&lt;/strong&gt; (若打不开时请使用 &lt;strong&gt;Alt + T&lt;/strong&gt;) 打开终端, 运行如下命令卸载冲突的 Noctalia (系列包)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yay -R noctalia-qs noctalia-shell cachyos-niri-noctalia
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;选择 Niri + DMS 或 Niri + DMS - git 安装, 并在安装 DMS 时选择 Niri 与 Kitty (常用应用可选安装)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;由于我安装非 git 版本 DMS 安装器打开失败, 推荐选择 git 版本安装&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果安装完成出现了两个任务栏, 请禁用 &lt;code&gt;dms.service&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl disable --now dms.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Niri DMS 配置快捷键&lt;/h3&gt;
&lt;p&gt;由于未知原因, DMS 设置对配置好的快捷键支持存在问题, 使用设置 GUI 编辑会导致配置文件保存失败, 故手动修改配置文件&lt;/p&gt;
&lt;p&gt;按键绑定配置文件位于&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/niri/dms/binds.kdl
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
BTW, 使用 GUI 绑定 Super 按键可能出现无法保存的问题, 请手动修改 Super 为 Mod&lt;/p&gt;
&lt;p&gt;同时, 不支持仅使用一个 Mod 键等作为快捷键, 必须为组合按键&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Niri 配置与双击标题栏相同行为的窗口最大化&lt;/h3&gt;
&lt;p&gt;不知为何, DMS 配置的 &lt;code&gt;maximize-column&lt;/code&gt; (最大化) 行为与双击标题栏的行为不同, 前者会保留主题色窗口高亮边框, 后者会占据整个屏幕除 (顶部) 任务栏区域且任务栏的 margin 会缩减为 0; &lt;code&gt;fullscreen-window&lt;/code&gt; (全屏) 窗口会导致 Overlay 窗口 (包括但不限于 Mod+Z 程序菜单, Mod+X 电源/登录操作菜单) 无法弹出, 并且任务栏会被隐藏&lt;/p&gt;
&lt;p&gt;经过一翻探寻, 发现双击标题栏的实际行为是 &lt;code&gt;maximize-window-to-edges&lt;/code&gt;, 故可以配置如下命令作为最大化的执行命令, 达到 &lt;em&gt;真正最大化窗口&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不知道为什么 DMS 设置的 Window 操作竟然没有这个 Action, 只有上述的 &lt;code&gt;maximize-column&lt;/code&gt; 与 &lt;code&gt;fullscreen-window&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如下命令会自动应用于前台窗口, 并且该命令会 toggle 该状态, 无须判断目标窗口是否已经处于该状态&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;niri msg action maximize-window-to-edges
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;关于 DMS 窗口规则 (Window Rules)&lt;/h3&gt;
&lt;p&gt;DMS 窗口规则什么都不填写代表匹配所有窗口, 可以用于设置全局配置, 诸如窗口圆角大小等&lt;/p&gt;
&lt;p&gt;匹配规则的 App ID 与 Title regex 貌似不能包含空格或特殊字符, 否则可能导致 Niri 配置加载失败&lt;/p&gt;
&lt;h3&gt;Niri 配置显示器焦点跟随光标&lt;/h3&gt;
&lt;p&gt;目前, Niri 没有很好的方法配置应用程序启动菜单等于光标所在的显示器弹出, 只能配置实时根据光标所在窗口范围切换窗口焦点, 从而另类实现前者目的&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
这会导致被光标划过的窗口会被意外激活, 个人不建议配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 Niri 配置文件配置如下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/niri/config.kdl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;input {
    focus-follows-mouse
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Niri 禁用在使用 &lt;em&gt;Meta+鼠标左键&lt;/em&gt; 拖动窗口时修改非固定大小的窗口大小&lt;/h3&gt;
&lt;p&gt;要使得 Niri 不在拖拽窗口时改版窗口大小, 可以使用如下配置&lt;/p&gt;
&lt;p&gt;在 Niri 配置文件 (系列) 中找到 &lt;code&gt;default-column-width&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/niri/config.kdl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并将&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;default-column-width { proportion 0.5; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;default-column-width {  }
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
这会丢失使用 &lt;code&gt;maximize-window-to-edges&lt;/code&gt; 的最大化窗口状态&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Niri 在 Overview (类似于 Meta+Tab) 显示 DMS 顶栏&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[ ! -f ~/.config/DankMaterialShell/settings.json.bak ] &amp;amp;&amp;amp; cp ~/.config/DankMaterialShell/settings.json ~/.config/DankMaterialShell/settings.json.bak
jq &apos;.barConfigs[].openOnOverview = true&apos; ~/.config/DankMaterialShell/settings.json &amp;gt; ~/.config/DankMaterialShell/settings.edited.json &amp;amp;&amp;amp; \
mv ~/.config/DankMaterialShell/settings.edited.json ~/.config/DankMaterialShell/settings.json
dms ipc call reload
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Rime &lt;a href=&quot;https://github.com/iDvel/rime-ice&quot;&gt;雾凇拼音&lt;/a&gt; 设置默认为半角符号&lt;/h3&gt;
&lt;p&gt;::github{repo=&quot;iDvel/rime-ice&quot;}&lt;/p&gt;
&lt;p&gt;对于 fcitx5 用户, 在如下目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.local/share/fcitx5/rime
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建/编辑如下文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rime_ice.custom.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;rime_ice.schema.yaml&lt;/code&gt; 是雾凇拼音默认配置, 如下为节选&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;switches:
  - name: ascii_mode
    states: [&quot;中&quot;, &quot;Ａ&quot;]
  - name: ascii_punct
    reset: 1
    states: [&quot;¥&quot;, &quot;$&quot;]
  - name: traditionalization
    states: [&quot;简&quot;, &quot;繁&quot;]
  - name: emoji
    reset: 1
    states: [&quot;💀&quot;, &quot;😄&quot;]
  - name: full_shape
    reset: 0
    states: [&quot;半角&quot;, &quot;全角&quot;]
  - abbrev: [&quot;词&quot;, &quot;单&quot;]
    name: search_single_char
    states: [&quot;正常&quot;, &quot;单字&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于全角/半角符号切换配置项在 schema 文件中的 &lt;code&gt;switches&lt;/code&gt; 部分的索引为 &lt;code&gt;1&lt;/code&gt;, 在上述文件内写入如下内容 (如果上游有修改请自行修改, 参考 &lt;a href=&quot;https://github.com/rime/home/wiki/Configuration#%E7%94%A8%E8%A3%9C%E9%9D%AA%E6%8C%87%E4%BB%A4%E4%BF%AE%E6%94%B9%E5%88%97%E8%A1%A8&quot;&gt;用補靪指令修改列表 - Rime Wiki&lt;/a&gt;)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;patch:
  # @1 代表选择索引为 1 者, 并将其默认值 (`reset`) 设置为 1
  &quot;switches/@1/reset&quot;: 1  # 半角符号
  &quot;switches/@4/reset&quot;: 0  # 半角 CJK
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后重新部署输入法即可&lt;/p&gt;
&lt;h3&gt;Rime &lt;a href=&quot;https://github.com/iDvel/rime-ice&quot;&gt;雾凇拼音&lt;/a&gt; 设置自定义词库&lt;/h3&gt;
&lt;p&gt;对于 fcitx5 用户, 在如下目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.local/share/fcitx5/rime
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建/编辑如下文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;default.custom.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;translator/dictionary:
  - &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中, &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; 是下方要创建的 dict (词库) 文件名称, 确保同目录下有 &lt;code&gt;&amp;lt;name&amp;gt;.dict.yaml&lt;/code&gt;, 且 &lt;code&gt;&amp;lt;name&amp;gt;.dict.yaml&lt;/code&gt; 内的 &lt;code&gt;name&lt;/code&gt; 字段为 &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;创建并写入任意的 &lt;code&gt;&amp;lt;name&amp;gt;.dict.yaml&lt;/code&gt; (以 &lt;code&gt;custom_phrase.dict.yaml&lt;/code&gt; 为例)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;custom_phrase.dict.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
name: custom_phrase
version: &quot;1.0&quot;
sort: by_weight
...
自定词组	拼音代码	权重
# 此处按照 `词组\t拼音\t权重(不知道可以填写 1)` 格式写自定义词组, 一行一个. 例如:
词组	cizu	1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后重新部署输入法即可&lt;/p&gt;
&lt;h3&gt;Dolphin 文件管理器无法识别打开方式 / 默认打开方式重置&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;安装依赖包&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S archlinux-xdg-menu
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;链接通用的打开方式配置&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -sf /etc/xdg/menus/plasma-applications.menu /etc/xdg/menus/applications.menu
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;刷新 (默认) 打开方式缓存&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;XDG_MENU_PREFIX=plasma- kbuildsycoca6 --noincremental
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;重启 Dolphin 即可&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Dolphin 在右键单击文本类文件时界面卡死若干秒&lt;/h3&gt;
&lt;p&gt;检查 Dolphin 的 &quot;设置 &amp;gt; 右键菜单&quot; 中 &quot;通过 KDE Connect发送文件&quot; 选项, 若已勾选则取消勾选, 确定或应用尝试是否解决&lt;/p&gt;
&lt;h3&gt;修改 KDE 系软件主题&lt;/h3&gt;
&lt;p&gt;由于 Niri 的 DMS 设置的深色模式无法应用于 KDE 系列软件, 造成应用主题割裂, 此次需要修改 KDE 系软件默认主题&lt;/p&gt;
&lt;p&gt;修改 KDE 系列软件主题的关节点在于命令行工具 &lt;code&gt;plasma-apply-colorscheme&lt;/code&gt;, 该工具仅在包 &lt;code&gt;plasma-desktop&lt;/code&gt; 等中提供&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装 &lt;code&gt;plasma-desktop&lt;/code&gt; 或下载我从该包中提取的 &lt;code&gt;plasma-apply-colorscheme&lt;/code&gt; ELF
安装&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S plasma-desktop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或下载 ELF:
&lt;a href=&quot;/static/plasma-apply-colorscheme&quot;&gt;当前网站&lt;/a&gt; / &lt;a href=&quot;https://aka.lovemilk.top/github/notes/releases/tag/plasma-apply-colorscheme&quot;&gt;GitHub Release&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
该 ELF 属于 Plasma 6.6.2, 如果出现 Breaking Change 造成该 ELF 无法使用, 请使用上述安装 Plasma 软件包的解决方法
并将该 ELF 放入&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予可执行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/plasma-apply-colorscheme
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;设置颜色主题&lt;br /&gt;
查看已有的主题列表&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;plasma-apply-colorscheme --list-schemes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设定主题&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;plasma-apply-colorscheme &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;要设定默认的深色主题, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;plasma-apply-colorscheme BreezeDark
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;为了保证文件选择器等 &lt;strong&gt;配套软件主题统一性&lt;/strong&gt;, 请在全局环境变量配置文件中写入如下配置&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;同时写入是为了 Niri 和在 Niri 启动前的 Services 全部都可以作用到&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;/etc/environment

~/.config/niri/config.kdl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的 &lt;code&gt;environment&lt;/code&gt; 部分修改或写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;QT_QPA_PLATFORMTHEME=qt5ct
QT_QPA_PLATFORMTHEME_QT6=qt5ct
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并使用 Qt5设置 修改主题配置&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;若仍旧无效的, 请将 &lt;code&gt;qt5ct&lt;/code&gt; 修改为 &lt;code&gt;kde&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;修改 Kitty 默认 Shell, 字体以及是否连字&lt;/h3&gt;
&lt;p&gt;将如下文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/kitty/kitty.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的 &lt;code&gt;shell fish&lt;/code&gt; (或 &lt;code&gt;shell &amp;lt;any-shell&amp;gt;&lt;/code&gt;) 改为你想用的 Shell, 可以只写名称, 例如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 修改默认 Shell
shell zsh

# 字体及大小
font_family JetBrainsMono Nerd Font NL
font_size 12
# 禁用连字
disable_ligatures always

# 禁用 单击 打开链接, 新增 Ctrl+单击 打开链接
mouse_map left click ungrabbed no_op
mouse_map ctrl+left release grabbed,ungrabbed mouse_handle_click link
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
由于快捷键 &lt;code&gt;Mod+slash&lt;/code&gt; 默认打开的是使用 &lt;code&gt;--single-instance&lt;/code&gt; 的 Kitty, 需要重启 Kitty Daemon 才能使配置生效&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;killall kitty
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;修改默认应用 (默认打开方式)&lt;/h3&gt;
&lt;p&gt;编辑如下配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/mimeapps.list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该配置文件格式为 &lt;code&gt;&amp;lt;MIME-Type&amp;gt;=&amp;lt;app&amp;gt;.desktop;&amp;lt;second-app&amp;gt;.desktop;...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;例如, 要修改默认文件管理器为 Dolphin&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;inode/directory=org.kde.dolphin.desktop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可使用如下命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xdg-mime default &amp;lt;app&amp;gt;.desktop &amp;lt;MIME-Type&amp;gt; &amp;lt;MIME-Type&amp;gt; &amp;lt;...&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如, 要修改压缩包的默认打开方式为 KDE 的 Ark&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xdg-mime default org.kde.ark.desktop application/zip application/x-tar application/x-7z-compressed application/vnd.rar application/x-rar
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
修改实时生效&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;要验证某 MIME-Type 的默认打开方式, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xdg-mime query default &amp;lt;MIME-Type&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xdg-mime query default inode/directory
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Discord / Chromium 无法打开分享屏幕窗口选择器 (部分情况下屏幕可以正常选择)&lt;/h3&gt;
&lt;p&gt;为配置 Gnome 的 XDG Portal 请在如下配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/xdg-desktop-portal/portals.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[preferred]
org.freedesktop.impl.portal.ScreenCast=gnome;
org.freedesktop.impl.portal.Screenshot=gnome;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并重启服务&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;该配置在部分情况下可能导致: Gnome PipeWire 选择界面可以弹出, 并成功选择; 但当 Chromium 尝试请求并弹出选择窗口后, 不进行任何窗口操作直接单击 &quot;取消&quot;, 再次尝试打开选择窗口无窗口弹出 (OBS 等非 Chromium 仍可在此状况下弹出选择窗口)&lt;br /&gt;
可能是因为 Electron 均使用 &lt;code&gt;org.chromium.Chromium&lt;/code&gt; 作为 PipeWire 请求者, 导致 XDG Portal 内部状态比被多个 APP 覆写造成无效; 同时, 诸如 Discord 等软件的 WebRTC 实现貌似并不会在分享屏幕结束时通知 XDG Portal, 导致 PipeWire 回话永远无法结束&lt;/p&gt;
&lt;p&gt;使用如下命令可以查看正在使用的 Freedesktop 回话&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;busctl --user tree org.freedesktop.portal.Desktop
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们推荐更换为 KDE 的 XDG Portal &lt;code&gt;xdg-desktop-portal-kde&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S xdg-desktop-portal-kde
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并在上述的配置文件内设置文件选择器等的 XDG Portal 实现为 &lt;code&gt;kde&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
切勿同时使用 KDE 与 Gnome 的 XDG Portal 实现, 这样会导致 Gnome 与 KDE 的实现互相争夺, 造成 Gnome 实现难以启动&lt;br /&gt;
KDE 窗口选择器无法正常工作, 切勿删除上述两行用于设置使用 Gnome 选择器的配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;[preferred]
default=kde;

org.freedesktop.impl.portal.ScreenCast=kde-screenshot-for-niri;
org.freedesktop.impl.portal.Screenshot=kde-screenshot-for-niri;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;替换 XDG Portal 后端会导致一些配置需要更改, 请遵循如下步骤&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;配置 Niri Dbus 后端
在&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;~/.config/niri/config.kdl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到如下条目&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;spawn-sh-at-startup &quot;dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=niri &amp;amp; /usr/lib/xdg-desktop-portal-gnome&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将 &lt;code&gt;/usr/lib/xdg-desktop-portal-gnome&lt;/code&gt; 改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/lib/xdg-desktop-portal-kde
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;配置带窗口选择功能的 KDE XDG Portal 实现&lt;br /&gt;
由于 Niri 使用了 Mutter Window API (Gnome 格式), 所以官方的 KDE 并不支持选择窗口分享, 我利用 AI fork 了&lt;a href=&quot;https://aka.lovemilk.top/github/xdg-desktop-portal-kde&quot;&gt;一份目前可以用的 KDE XDG Portal&lt;/a&gt;, 让我们来安装它&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/lovemilk2333/xdg-desktop-portal-kde --depth 1
cd ./xdg-desktop-portal-kde
./build.sh install
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;停用/卸载 Mako 服务 &lt;em&gt;(未安装者请跳过)&lt;/em&gt;&lt;br /&gt;
在不使用 Gnome XDG Portal 实现后, 为了避免 Mako 抢占 DMS 的 &lt;code&gt;org.freedesktop.Notifications&lt;/code&gt; 注册, 我们需要将其禁用或卸载&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user disable --now mako
# 或者
sudo pacman -R mako
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;配置 Dolphin 守护进程
在上述配置文件内新增如下内容, 为避免 Nautilus 被 DBus 自动调起&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;spawn-at-startup &quot;dolphin&quot; &quot;--daemon&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启服务以应用配置&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;已打开的应用需要重启应用生效&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user restart xdg-desktop-portal
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
若出现文件选择器等颜色主题与配置的主题不符, 请参考 &lt;a href=&quot;#%E4%BF%AE%E6%94%B9-kde-%E7%B3%BB%E8%BD%AF%E4%BB%B6%E4%B8%BB%E9%A2%98&quot;&gt;修改 KDE 系软件主题&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Niri 禁用截屏声音&lt;/h3&gt;
&lt;p&gt;在 Niri 配置文件中注释如下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/niri/config.kdl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注释&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;spawn-at-startup &quot;~/.config/niri/shorin-niri/scripts/screenshot-sound.sh&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;修复 Niri DMS 设置内光标配置选项无效&lt;/h3&gt;
&lt;p&gt;在 Niri 配置文件中注释如下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/niri/config.kdl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注释&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cursor {
    xcursor-theme &quot;xxx&quot;
    xcursor-size 30
    // hide-after-inactive-ms 15000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Niri 安装光标&lt;/h3&gt;
&lt;p&gt;创建如下文件夹&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.icons
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并将下载的光标主题解压放入, 符合如下文件结构&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.icons/&amp;lt;name&amp;gt;/cursors/
~/.icons/&amp;lt;name&amp;gt;/index.themes
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Kopia 自启动失败&lt;/h3&gt;
&lt;p&gt;使用 AUR 包的 &lt;code&gt;kopia-ui-bin&lt;/code&gt; 的开机自启动功能貌似存在问题导致无法成功自启 (可能是是 Niri 导致的), 我们需要自己创建 User Level 的 Systemd Unit 以自启动 Kopia&lt;/p&gt;
&lt;p&gt;在如下路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/kopia-ui.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入如下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=KopiaUI - Backup Tool
After=network.target

[Service]
ExecStart=/opt/KopiaUI/kopia-ui
Restart=on-failure

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并设置开机自启动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user daemon-reload
systemctl --user enable --now kopia-ui.service
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
当其他软件遇到类似问题时, 可以采用相同的解决方法&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Proton (GE) 设置默认 Prefix&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;export STEAM_COMPAT_DATA_PATH=/path/to/pfx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;编译软件包时 CMake 错误&lt;/h3&gt;
&lt;p&gt;若在编译软件包是出现 CMake 版本不兼容问题, 需要强制指定 &lt;code&gt;-DCMAKE_POLICY_VERSION_MINIMUM=x.x&lt;/code&gt; (类似如下输出信息)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CMake Error at CMakeLists.txt:3 (cmake_minimum_required):

  Compatibility with CMake &amp;lt; 3.5 has been removed from CMake.



  Update the VERSION argument &amp;lt;min&amp;gt; value.  Or, use the &amp;lt;min&amp;gt;...&amp;lt;max&amp;gt; syntax

  to tell CMake that the project requires at least &amp;lt;min&amp;gt; but has been updated

  to work with policies introduced by &amp;lt;max&amp;gt; or earlier.



  Or, add -DCMAKE_POLICY_VERSION_MINIMUM=x.x to try configuring anyway.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以使用 yay 的 &lt;code&gt;--editmenu&lt;/code&gt; 选项, 并在提示如下内容是输入要修改范围, 例如 &lt;code&gt;1&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ yay -S xxx --editmenu

...

==&amp;gt; 要编辑哪些 PKGBUILD？
==&amp;gt; [N]没有 [A]全部 [Ab]中止 [I]已安装 [No]未安装 或 (1 2 3, 1-3, ^4)
==&amp;gt; 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后修改 &lt;code&gt;build()&lt;/code&gt; 中包含 &lt;code&gt;cmake&lt;/code&gt; 的行, 添加上述提示中所需的 &lt;code&gt;-DCMAKE_POLICY_VERSION_MINIMUM=x.x&lt;/code&gt; 参数 (&lt;code&gt;x.x&lt;/code&gt; 需为实际版本), 保存后继续安装软件包即可&lt;/p&gt;
&lt;h3&gt;GTK 配置样式&lt;/h3&gt;
&lt;p&gt;打开 GTK Settings 应用程序&lt;/p&gt;
&lt;h3&gt;修复 Microsoft Edge 在 Linux 上自动重置为亮色模式&lt;/h3&gt;
&lt;p&gt;由于未知原因, Microsoft Edge 的 Linux 版本会在浏览器进程完全退出后将外观设置的 &quot;颜色主题&quot; 为深色模式时配置为亮色模式, 而设置为 GTK 则不会.&lt;/p&gt;
&lt;p&gt;&amp;lt;del&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/MicrosoftEdge/comments/1rdlgpc/why_tf_does_edge_has_a_default_light_mode_even_i&quot;&gt;https://www.reddit.com/r/MicrosoftEdge/comments/1rdlgpc/why_tf_does_edge_has_a_default_light_mode_even_i&lt;/a&gt;&lt;br /&gt;
一个可能的临时解决方法, 将 Edge 降级为 Major 143 (&lt;code&gt;143.x.x.x&lt;/code&gt;) 版本
&lt;s&gt;F**K U Microsoft&lt;/s&gt;
&amp;lt;/del&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可以使用 &lt;code&gt;downgrade&lt;/code&gt; 命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo downgrade microsoft-edge-stable-bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实测, 148.0.3967.54 (正式版本) (64 位) 已经修复, 请大家尽快升级 &lt;code&gt;microsoft-edge-stable-bin&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo yay -Sy microsoft-edge-stable-bin
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;修复 Microsoft Edge 会不断激活存在/播放媒体 (特别是视频) 的页面&lt;/h3&gt;
&lt;p&gt;当 Microsoft Edge 浏览器的当前标签页为存在媒体的标签页 (例如 &lt;code&gt;https://www.bilibili.com/video/BV*&lt;/code&gt;) 时, 将浏览器取消激活窗口后, 仍会在后台时激活导致窗口切换到浏览器, 打断工作&lt;/p&gt;
&lt;p&gt;一个可能的解决方法是, 禁用浏览器内的 &lt;em&gt;Use Updated UI for Global Media Controls&lt;/em&gt; Flag&lt;/p&gt;
&lt;p&gt;可以导航至 &lt;a&gt;edge://flags/#edge-global-media-controls-updated-ui&lt;/a&gt; 选择 &lt;code&gt;Disabled&lt;/code&gt;, 并重启浏览器&lt;/p&gt;
&lt;h3&gt;使用 Prismlauncher 安装 Minecraft 整合包时出现文件损坏&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;https://www.reddit.com/r/PrismLauncher/comments/1ifpbgp/issue_with_modpacks/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当启动 Minecraft 整合包时, 出现了如下日志&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Processor failed, invalid outputs:
/home/&amp;lt;user&amp;gt;/.local/share/PrismLauncher/libraries/net/minecraft/client/1.20.1-20230612.114412/client-1.20.1-20230612.114412-slim.jar
Expected: de86b035d2da0f78940796bb95c39a932ed84834
Actual: aea60124ca903ecbb2e825805e318f9d89ac867c
/home/&amp;lt;user&amp;gt;/.local/share/PrismLauncher/libraries/net/minecraft/client/1.20.1-20230612.114412/client-1.20.1-20230612.114412-extra.jar
Expected: 8c5a95cbce940cfdb304376ae9fea47968d02587
Actual: 76e87dbc119daed8dc1861c17160e0c4b6f34d2e
Process exited with code 0.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;尝试替换 CachyOS 的 zlib 实现为如下库, 运行如下命令安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S zlib lib32-zlib
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;修复 Nvidia 打开诸如 Minecraft 遇到无法使用 Zink 或者 Forge 显示无法初始化显卡问题&lt;/h3&gt;
&lt;p&gt;修改全局环境变量&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/environment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;__GLX_VENDOR_LIBRARY_NAME=nvidia
__NV_PRIME_RENDER_OFFLOAD=1
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
CachyOS 使用 &lt;code&gt;chwd&lt;/code&gt; 工具管理 GPU 驱动, 在更新或更换驱动时注意避免与该工具行为产生冲突&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如下配置不得加入全局环境变量, 否则会导致 DMS 启动失败&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 减轻爆显存时应用画面卡死情况 (允许必要时将显存分配请求推送到内存)
__GL_ALLOW_UNRESTRICTED_ACCESS=1
# 部分情况下解决 GPU 占用率过低导致 FPS 过低
__GL_THREADED_OPTIMIZATIONS=1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;修改 CachyOS 镜像源&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://discuss.cachyos.org/t/help-how-to-skip-mirror-update-during-installation-network-issues-in-china/20455&quot;&gt;https://discuss.cachyos.org/t/help-how-to-skip-mirror-update-during-installation-network-issues-in-china/20455&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;禁用 CachyOS 自动测速软件源&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl disable --now cachyos-rate-mirrors.timer
sudo systemctl mask cachyos-rate-mirrors.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;依次修改如下文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/pacman.d/mirrorlist
/etc/pacman.d/cachyos-mirrorlist
/etc/pacman.d/cachyos-v3-mirrorlist
/etc/pacman.d/cachyos-v4-mirrorlist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要使用 USTC Mirror 并刷新现有包数据库缓存, 可以使用如下命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /etc/pacman.d/mirrorlist &amp;lt;&amp;lt; EOF
Server = https://mirrors.ustc.edu.cn/archlinux/\$repo/os/\$arch
EOF

sudo tee /etc/pacman.d/cachyos-mirrorlist &amp;lt;&amp;lt; EOF
Server = https://mirrors.ustc.edu.cn/cachyos/repo/\$arch/\$repo
EOF

sudo tee /etc/pacman.d/cachyos-v3-mirrorlist &amp;lt;&amp;lt; EOF
Server = https://mirrors.ustc.edu.cn/cachyos/repo/\$arch_v3/\$repo
EOF

sudo tee /etc/pacman.d/cachyos-v4-mirrorlist &amp;lt;&amp;lt; EOF
Server = https://mirrors.ustc.edu.cn/cachyos/repo/\$arch_v4/\$repo
EOF

sudo sed -i &apos;/^\[archlinuxcn\]/{N;N;c\[archlinuxcn\]\nInclude = /etc/pacman.d/archlinuxcn
}&apos; /etc/pacman.conf

sudo tee /etc/pacman.d/archlinuxcn &amp;lt;&amp;lt; EOF
Server = https://mirrors.ustc.edu.cn/archlinuxcn/\$arch
EOF

sudo pacman -Syy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于近期 UTSC Mirror 不太稳定, 推荐使用 NJU Mirror&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /etc/pacman.d/mirrorlist &amp;lt;&amp;lt; EOF
Server = https://mirror.nju.edu.cn/archlinux/\$repo/os/\$arch
EOF

sudo tee /etc/pacman.d/cachyos-mirrorlist &amp;lt;&amp;lt; EOF
Server = https://mirrors.nju.edu.cn/cachyos/repo/\$arch/\$repo
EOF

sudo tee /etc/pacman.d/cachyos-v3-mirrorlist &amp;lt;&amp;lt; EOF
Server = https://mirrors.nju.edu.cn/cachyos/repo/\$arch_v3/\$repo
EOF

sudo tee /etc/pacman.d/cachyos-v4-mirrorlist &amp;lt;&amp;lt; EOF
Server = https://mirrors.nju.edu.cn/cachyos/repo/\$arch_v4/\$repo
EOF

sudo sed -i &apos;/^\[archlinuxcn\]/{N;N;c\[archlinuxcn\]\nInclude = /etc/pacman.d/archlinuxcn
}&apos; /etc/pacman.conf

sudo tee /etc/pacman.d/archlinuxcn &amp;lt;&amp;lt; EOF
Server = https://mirrors.nju.edu.cn/archlinuxcn/\$arch
EOF

sudo pacman -Syy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;鼠标 UDev DPI&lt;/h3&gt;
&lt;p&gt;如果在 &lt;code&gt;~/.config/niri/config.kdl&lt;/code&gt; 的 &lt;code&gt;mouse&lt;/code&gt; 配置中将 &lt;code&gt;accel-speed&lt;/code&gt; 改为 1.0 (Niri 允许的最大值) 仍然过慢, 可以尝试使用 UDev 规则修改光标 DPI 倍率&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;查找鼠标设备&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;lsusb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到如下字样&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Bus xx Device xxx: ID aaaa:bbbb xxx Mouse
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;配置 UDev 规则
新建如下文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;/etc/udev/rules.d/71-mouse-speed.rules
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并配置 UDev 规则&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;ID_VENDOR_ID&lt;/code&gt; 为 &lt;code&gt;:&lt;/code&gt; 前的 生产商 ID (全小写 16 进制), &lt;code&gt;ID_MODEL_ID&lt;/code&gt; 为 &lt;code&gt;:&lt;/code&gt; 后的 型号 ID (全小写 16 进制)&lt;br /&gt;
&lt;code&gt;LIBINPUT_ATTR_RESOLUTION_HINT&lt;/code&gt; 为加(减)速倍率, &lt;code&gt;100&lt;/code&gt; 为 1.0 倍&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;ENV{ID_VENDOR_ID}==&quot;aaaa&quot;, ENV{ID_MODEL_ID}==&quot;bbbb&quot;, ENV{LIBINPUT_ATTR_RESOLUTION_HINT}=&quot;2000&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;重载并应用 UDev 规则&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo udevadm control --reload-rules
sudo udevadm trigger
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;修复浏览器/应用程序无法检测到游戏手柄&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;/etc/udev/rules.d/99-gamepad.rules
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;KERNEL==&quot;js*&quot;, MODE=&quot;0666&quot;
KERNEL==&quot;event*&quot;, ENV{ID_INPUT_JOYSTICK}==&quot;1&quot;, MODE=&quot;0666&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载并应用 UDev 规则&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo udevadm control --reload-rules
sudo udevadm trigger
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启浏览器/无法检测到的应用程序&lt;/p&gt;
&lt;h3&gt;解决 Niri (Wayland) 复制某进程内容后关闭该进程, 复制的内容无法粘贴 / 解决 Wayland/XWayland 剪切板同步问题&lt;/h3&gt;
&lt;p&gt;在 Niri 或其他基于 Wayland 的合成器中, 剪切板内容通常由 source 进程实时持有, 当该进程关闭时, 它所持有的内容也会从剪切板中消失, 导致无法粘贴&lt;/p&gt;
&lt;p&gt;要解决该问题, 可以使用 DMS Clipboard Manager 监听剪切板变动, 并对纯文本自动接管任意 source 进程复制的内容, 以免复制文件时类型被修改导致只会存储 &lt;code&gt;file://&amp;lt;path&amp;gt;&lt;/code&gt; 无法被文件管理器识别&lt;/p&gt;
&lt;p&gt;在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/dms-clipboard.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash

last_hash=&quot;&quot;

dms cl watch --json | while IFS= read -r line; do
    mime=$(printf &apos;%s\n&apos; &quot;$line&quot; | jq -r &apos;.mimeType&apos;)
    data=$(printf &apos;%s\n&apos; &quot;$line&quot; | jq -r &apos;.data&apos;)

    case &quot;$mime&quot; in
        text/uri-list
            # ignore files to keep copy/cut state
            continue
            ;;
        text/*)
            ;;
        *)
            continue
            ;;
    esac

    hash=$(printf &apos;%s&apos; &quot;$mime&quot;$&apos;\0&apos;&quot;$data&quot; | sha256sum | cut -d&apos; &apos; -f1)

    [ &quot;$hash&quot; = &quot;$last_hash&quot; ] &amp;amp;&amp;amp; continue

    last_hash=&quot;$hash&quot;

    printf &apos;%s&apos; &quot;$data&quot; | dms cl copy -t &quot;$mime&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;授予可执行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x ~/.config/systemd/user/dms-clipboard.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;新建 Systemd Unit&lt;br /&gt;
在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/dms-clipboard.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=DMS Clipboard Persistence Daemon
After=graphical-session.target

[Service]
Type=simple
ExecStart=%h/.config/systemd/user/dms-clipboard.sh
Restart=always
RestartSec=1

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载并启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user daemon-reload
systemctl --user enable --now dms-clipboard.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;自动启动 &lt;code&gt;~/.config/autostart/*.desktop&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Dex 可以自动解析并启动 &lt;code&gt;.destkop&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S dex
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/niri/config.kdl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的 &lt;code&gt;spawn-at-startup&lt;/code&gt; 附近写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;spawn-at-startup &quot;dex&quot; &quot;~/.config/autostart/*.desktop&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解决非 UTC 时区用户 Linux 与 Windows 时间相差 UTC $\pm n$ 小时的问题&lt;/h3&gt;
&lt;p&gt;在默认情况下, Linux 使用 UTC 硬件时钟, 而 Windows 使用本地时间硬件时钟. 当 Linux 同步网路时间并将当前 UTC 时间写入硬件时钟后, Windows 误认为当前的 UTC 时间为本地时间, 造成与实际时间存在不一致的情况&lt;/p&gt;
&lt;p&gt;一般来说, 可以将 Windows 存储的硬件时间设置为 UTC 以解决问题. 在 &lt;strong&gt;Windows&lt;/strong&gt; 上 (以管理员身份) 运行如下 CMD 命令, 即可添加注册表项以告知 Windows 使用 UTC 硬件时钟&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reg add &quot;HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation&quot; /v RealTimeIsUniversal /d 1 /t REG_QWORD /f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后重启计算机即可&lt;/p&gt;
&lt;h3&gt;在 Niri (DMS) 的最近窗口 (Alt+Tab) 中默认显示全部工作区的窗口&lt;/h3&gt;
&lt;p&gt;在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/niri/config.kdl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的 &lt;code&gt;recent-windows&lt;/code&gt; &amp;gt; &lt;code&gt;binds&lt;/code&gt; 中找到对应的操作, 例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Override to disable super+tab
recent-windows {
    binds {
        Alt+Tab         { next-window scope=&quot;output&quot;; }
        Alt+Shift+Tab   { previous-window scope=&quot;ouput&quot;; }
        Alt+grave       { next-window filter=&quot;app-id&quot;; }
        Alt+Shift+grave { previous-window filter=&quot;app-id&quot;; }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并将 &lt;code&gt;scope=&lt;/code&gt; 改为目标值, 例如 &lt;code&gt;all&lt;/code&gt;, &lt;code&gt;workspace&lt;/code&gt; 或 &lt;code&gt;output&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;关闭 pipewire-pulse 会自动修改麦克风增益&lt;/h3&gt;
&lt;p&gt;修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/pulse/daemon.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flat-volumes = no
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/pipewire/pipewire-pulse.conf.d/block-agc.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pulse.rules = [
    {
        matches = [
            {
            stream.is-capture = true
            }
        ]
        actions = {
            quirks = [ block-source-volume ]
        }
    }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后重启 Pipewire 服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user restart pipewire pipewire-pulse wireplumber
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 Chromium, 为了避免在通话 (WebRTC) 时自动调节麦克风增益大小, 请转到 &lt;a&gt;chrome://flags/#enable-webrtc-allow-input-volume-adjustment&lt;/a&gt; 选择 &lt;code&gt;Disabed&lt;/code&gt;, 并重启浏览器&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Snipaste 在 Linux 自启动存在的问题</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/kde/snipaste-autostart-problem/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/kde/snipaste-autostart-problem/</guid><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;由于 Snipaste 的 &quot;开机启动&quot; 选项点击无反应, 本人尝试在 KDE 设置的 &quot;自动启动&quot; 中添加 Snipaste 的启动项, 但由于未知原因, 使用该功能启动的 Snipaste 会删除 &lt;code&gt;~/.config/autostart&lt;/code&gt; 下的 &lt;code&gt;Snipaste.desktop&lt;/code&gt; (可能是 &quot;开机启动&quot; 选项无法设置为 True, 导致 Snipaste 认为需要禁用开机启动), 后开机启动失败&lt;/p&gt;
&lt;h2&gt;环境信息&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Snipaste 2.11.3 (2026.01.18) Linux (Free Version)

Operating System: Arch Linux
KDE Plasma Version: 6.5.5
KDE Frameworks Version: 6.22.0
Qt Version: 6.10.2
Kernel Version: 6.18.9-arch1-2 (64-bit)
Graphics Platform: X11
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;解决方法&lt;/h2&gt;
&lt;p&gt;一个可能的解决方法: 创建与 &lt;code&gt;Snipaste.desktop&lt;/code&gt; 不同名称的 &lt;code&gt;.desktop&lt;/code&gt; 文件自启动 Snipaste&lt;/p&gt;
&lt;p&gt;对于 KDE, 可以在 &quot;自动启动&quot; 中新建 Snipaste 的自动启动, 而后修改 &lt;code&gt;~/.config/autostart&lt;/code&gt; 下的 &lt;code&gt;Snipaste.desktop&lt;/code&gt; 为其他名称 (并不再创建该名称的文件), 例如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mv ~/.config/autostart/Snipaste.desktop ~/.config/autostart/Snipaste-custom.desktop
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Lovemilk 关于 “lovemilkArch Btrfs (根目录) 出现不可恢复错误” 情况记录</title><link>https://aka.lovemilk.top/notes/posts/blogs/btrfs-uncorrectable-error/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/blogs/btrfs-uncorrectable-error/</guid><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;(未经特殊说明, 使用公元纪年法 和 UTC+8 时间)&lt;br /&gt;
时间 2026 年 01 月 31 日下午 16 时许, 本人在尝试开启计算机时出现无法进入 Archlinux 系统问题&lt;/p&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;本人日常使用安装有 linux-zen 内核的 Archlinux, 搭配 KDE 桌面环境&lt;br /&gt;
根目录与 home 目录使用常见 Archlinux Btrfs subvolume (子卷) 安装方式: 将 子卷 &lt;code&gt;@&lt;/code&gt; 作为 &lt;code&gt;/&lt;/code&gt;, 子卷 &lt;code&gt;@home&lt;/code&gt; 作为 &lt;code&gt;/home&lt;/code&gt;, 作为操作系统安装位置, 分区大小 450 GiB&lt;br /&gt;
并开启了 &lt;code&gt;zstd:1&lt;/code&gt; 透明压缩&lt;br /&gt;
系统硬盘使用 致态 TiPlus5000[^ssdinfo], 于 2023 年 01 月购入, 硬盘容量 1 TB&lt;/p&gt;
&lt;h2&gt;过程&lt;/h2&gt;
&lt;h3&gt;2026 年 01 月 30 日 22 时至 24 时&lt;/h3&gt;
&lt;p&gt;本人对系统进行了更新, 运行了如下命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -Syu --noconfirm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于 2026-01-30 (UTC), linux 以及 linux-zen 发布了 &lt;code&gt;6.18.8&lt;/code&gt; 稳定版本, 导致了该系统更新更新了 kernel (内核)&lt;/p&gt;
&lt;p&gt;但是, 在初次更新内核时, 出现了 DKMS (内核模块) 安装失败的问题, 我尝试了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S linux-zen
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功后便认为更新成功, 随即关闭了计算机&lt;/p&gt;
&lt;h3&gt;2026 年 01 月 31 日 16 时至 17 时&lt;/h3&gt;
&lt;p&gt;本人如往常般打开计算机, 但发现 Grub 引导美化主题背景图丢失, 以为可能是更新导致 Grub 配置失效, 重新安装主题即可, 便忽略了该问题随机进入系统引导&lt;/p&gt;
&lt;p&gt;后, 发现系统启动失败, 在系统启动失败的 fallback 的 Shell 中, 发现任何命令无法运行, 根目录无法挂载&lt;/p&gt;
&lt;p&gt;本人联想到先前 Btrfs 出现物理可用区域满 (数据在物理磁盘的末尾导致没有空余), 可能是该原因导致类似问题, 便想着进入 ISO 镜像环境使用 &lt;code&gt;btrfs balance&lt;/code&gt; 或许可以恢复&lt;/p&gt;
&lt;p&gt;后进入 ISO 安装镜像, 开始修复系统&lt;/p&gt;
&lt;h3&gt;2026 年 01 月 31 日 17 时及后&lt;/h3&gt;
&lt;p&gt;本人尝试修复 Btrfs 文件系统, 通过查阅 &lt;a href=&quot;https://wiki.archlinux.org/title/Btrfs&quot;&gt;Archwiki&lt;/a&gt;, 进行状态检查后, 发现 super chunk (超级块) 的地址指向了 800+ GiB 的位置, &lt;strong&gt;包括用于备份的另一个 super chunk&lt;/strong&gt;, 远超分区实际大小的地址上限, 无论是 &lt;code&gt;btrfs check&lt;/code&gt; 还是 &lt;code&gt;btrfs rescue&lt;/code&gt; 均报错&lt;/p&gt;
&lt;p&gt;挂载报错&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[xxx] BTRFS error (device nvme1n1p4): failed to read chunk tree: -5
[xxx] BTRFS error (device nvme1n1p4): open_ctree failed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[^why-device-changed]&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./btrfs-uncorrectable-error/first-meet-error.png&quot; alt=&quot;first-meet-error&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;上图是进入 ISO 镜像环境的 Archlinux 进行挂载的画面&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;btrfs check&lt;/code&gt; 报错, 显示存在 checksum failed 的块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Opening filesystem to check...
checksum verify failed on xxx wanted 0xxxx found 0xxxx
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./btrfs-uncorrectable-error/btrfs-check-error.png&quot; alt=&quot;btrfs-check-error&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;其中, 这几个报错的地址都是 800+ GiB 的不存在地址, 必定会导致 checksum failed&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;通过和 Archlinux-CN Telegram 群的群友们交流, 得知由于两个 super chunk 均已损坏, 无法修复文件系统, 群友说似乎 super chunk 的内容已经不在硬盘上存在了&lt;/p&gt;
&lt;h3&gt;2026 年 02 月 01 日&lt;/h3&gt;
&lt;p&gt;我怀揣着不甘, 在 Gemini 的帮助下, 尝试通过全盘扫描 &lt;code&gt;_BTRFS_M&lt;/code&gt; 魔法头, 找到 chunk tree 实际位置&lt;/p&gt;
&lt;p&gt;通过 smartctl 和 nvme 工具的信息, 硬盘健康度貌似没有问题. 有群友认为, 可能是早期 致态 固件存在问题, 导致部分写入会存在 bug, 从而丢失数据&lt;/p&gt;
&lt;p&gt;不过经历无数次的尝试, 最终还是未能恢复数据&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./btrfs-uncorrectable-error/trying2find-chunk-tree.png&quot; alt=&quot;trying2find-chunk-tree&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;扫描到的魔法头地址, 但是没一个可以用的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;结果&lt;/h2&gt;
&lt;p&gt;最终, 似乎还是未能恢复数据, 好在我的项目基本上是有备份的, 可惜我的 Minecraft 存档和 JetBrains 全家桶 的配置就永不得见日了&lt;/p&gt;
&lt;p&gt;&lt;s&gt;目前来说, 我还未擦除硬盘该分区的数据, 如果有能力者可以尝试在 &lt;a href=&quot;https://aka.lovemilk.top/github/notes/discussions&quot;&gt;Github Discussions&lt;/a&gt; 发出你的解决方法, 至少可以给我一线生机吧...&lt;/s&gt;&lt;/p&gt;
&lt;h2&gt;最终结果 / After Story&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;2026 年 02 月 07 日上午 8 时 30 分许&lt;/strong&gt;, 本人决定擦除硬盘数据并售后, 更换新的硬盘&lt;/p&gt;
&lt;p&gt;为我的没有备份的数据默哀 3 秒钟...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;s&gt;话说应该是默哀 3 ns 才对, at least for the CPU&lt;/s&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026 年 02 月 26 日&lt;/strong&gt;, 经致态售后检验, 达到售后标准, 进行换盘&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./btrfs-uncorrectable-error/reply.jpg&quot; alt=&quot;reply&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同年 03 月 03 日&lt;/strong&gt;, 本人拿到了硬盘并准备进行安装系统操作 (实际上早就送到了只是没有时间处理)&lt;/p&gt;
&lt;p&gt;本人已经在学习如何使用 Kopia[^kopia] 对文件进行快照记录以免被意外覆盖, 并加大 Syncthing[^syncthing] 备份范围与力度, 减少不必要的数据损失&lt;/p&gt;
&lt;p&gt;[^ssdinfo]: 长江存储官网: https://www.ymtc.com / 致态 TiPlus5000: https://baike.baidu.com/item/致态TiPlus5000/61815836&lt;/p&gt;
&lt;p&gt;[^why-device-changed]: 在下文中, 设备可能变为了 &lt;code&gt;nvme0n1p4&lt;/code&gt;, 这是重新拆装硬盘并启动到 ISO 镜像环境导致的, 实际上指同一块分区. 并且有且仅有该硬盘的分区达到了 &lt;code&gt;p4&lt;/code&gt;, 其余至多 &lt;code&gt;2&lt;/code&gt;, 这也作证了为同一块物理磁盘&lt;/p&gt;
&lt;p&gt;[^kopia]: https://kopia.io/ Fast and Secure Open-Source Backup Software&lt;/p&gt;
&lt;p&gt;[^syncthing]: https://syncthing.net/ Syncthing is a continuous file synchronization program&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>License - 爱喝牛奶著作转载协议</title><link>https://aka.lovemilk.top/67</link><guid isPermaLink="true">https://aka.lovemilk.top/67</guid><pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;爱喝牛奶著作转载协议&lt;/h1&gt;
&lt;p&gt;爱喝牛奶著作转载协议 (以下简称 &quot;本协议&quot;) 适用于您在使用爱喝牛奶 (以下简称 &quot;本人&quot; 或 &quot;作者&quot;) 的所有著作 (除计算机程序的代码及其二进制文件外), 若您转载、修改、引用或分发 (以下简称 &quot;使用&quot;) 即视为您已仔细阅读并同意本协议内所有条款.&lt;/p&gt;
&lt;p&gt;特殊情况: 按照《中华人民共和国著作权法》第二十二条&lt;a href=&quot;%5B%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E8%91%97%E4%BD%9C%E6%9D%83%E6%B3%95__%E4%B8%AD%E5%9B%BD%E6%94%BF%E5%BA%9C%E7%BD%91%5D(https://www.gov.cn/guoqing/2021-10/29/content_5647633.htm)&quot;&gt;^中华人民共和国著作权法&lt;/a&gt;规定的 &quot;在下列情况下使用作品，可以不经著作权人许可，不向其支付报酬，但应当指明作者姓名或者名称、作品名称，并且不得影响该作品的正常使用，也不得不合理地损害著作权人的合法权益&quot; 的情况下无需取得授权并同意本协议内所有条款, 但须遵守&lt;a href=&quot;#%E5%85%B3%E4%BA%8E%E4%BD%BF%E7%94%A8&quot;&gt;关于使用&lt;/a&gt;的相关条款.&lt;/p&gt;
&lt;h2&gt;关于使用&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;使用本著作时必须标注原作者名称、原文连接以及本转载协议链接, 若改原文以非链接形式发送, 请填您所在的国家与地区可访问的 作者社交平台个人主页链接 并附带著作标题位于链接边 加以注释.
若您所在的国家与地区无法访问任何作者社交平台个人主页, 请添加作者名称.&lt;/li&gt;
&lt;li&gt;添加转载协议链接时不得以任何方式隐藏或其他方式掩盖链接, 必须标明在文本头部, 且该链接必须可被点击跳转.&lt;/li&gt;
&lt;li&gt;添加其他相关链接时, 不得使用任何方式以隐藏或其他方式掩盖链接.&lt;/li&gt;
&lt;li&gt;使用著作时, 不得将原文中的任何非 CJK 字符[^CJKCharacters][^CJKCharactersCNWIKI] 更改为对应的 CJK 字符. 若需要修改一部分内容及其含义而非单纯将非 CJK 字符更改为对应的 CJK 字符的, 应当待 作者 和/或 作者认可的个人或组织 许可并授权后, 方可修改并发行.&lt;/li&gt;
&lt;li&gt;不得将任何著作用于违反国家与地区法律法规或地方法律法规 (若存在多条冲突或(部分)重合的法律法规的, 以最为严苛的法律法规(或法律法规部分)为准) 的行为, 否则, 须使用者自行承担全部责任.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;关于本协议&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;本协议最终归属权有作者所有, 最终解释权由作者个人 和/或 组织或 作者认可的个人或组织 所有.&lt;/li&gt;
&lt;li&gt;本协议修改或更新时将不会另行通知, 请以最新版本协议为准, 如果多语言协议版本出现与中文 (简体) 版本有歧义或冲突的内容, 请以中文 (简体) 版本为准.&lt;/li&gt;
&lt;li&gt;当前协议版本: V0.0.3.20260118&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;[^CJKCharacters]: &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E4%B8%AD%E6%97%A5%E9%9F%93%E7%B5%B1%E4%B8%80%E8%A1%A8%E6%84%8F%E6%96%87%E5%AD%97&quot;&gt;中日韓統一表意文字 - Wikipedia&lt;/a&gt;
[^CJKCharactersCNWIKI]: &lt;a href=&quot;https://baike.baidu.com/item/%E4%B8%AD%E6%97%A5%E9%9F%A9%E8%B6%8A%E7%BB%9F%E4%B8%80%E8%A1%A8%E6%84%8F%E6%96%87%E5%AD%97&quot;&gt;中日韩越统一表意文字 - 百度百科&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>20260118 | 冰川社会</title><link>https://aka.lovemilk.top/notes/posts/weekly-articles/20260118/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/weekly-articles/20260118/</guid><pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ChinesePassageComment from &quot;@/components/misc/custom/ChinesePassageComment.vue&quot;;&lt;/p&gt;
&lt;h1&gt;冰川社会&lt;/h1&gt;
&lt;blockquote&gt;
&lt;h2&gt;── 论在人类社会中何为 &quot;有意义&quot;&lt;/h2&gt;
&lt;/blockquote&gt;
&lt;p&gt;&quot;我坐在台下, 静观台上欢声笑语, 两个世界的悲离与欢合难以感同身受.&quot;&lt;/p&gt;
&lt;p&gt;当我问起大家哪座山是世界上最高的山峰, 想必大部分人都可以答出 &quot;珠穆朗玛峰&quot; 罢. 但当我问起何为世界上第二高的山峰, 非地理专业的人又有多少有全然的把握答对呢? 若是仍然可以答对, 那么支撑起第一第二的全然的山峰, 大概率人类是记不住的, 又何况或许山峰无时不刻变化着, 或有诞生和消亡呢? 人亦如此, 人们大概率不会记住和在意成功的辉煌背后的一切, 你的付出, 你的努力, 如果没有结果, 那么在外人面前大概率一文不值.&lt;/p&gt;
&lt;p&gt;所以我认为, 意义应当是自己赋予的.&lt;/p&gt;
&lt;p&gt;在周末百无聊赖, 坐在沙发上任由思绪环游全宇宙, 突然意识到自己这样做是否 &quot;没有意义&quot;, 而恍惚惊醒时; 在商场里漫无目的游走, 停下去玩几局夹娃娃, 后觉得自己 &quot;很幼稚&quot; 时 ── 请大声告诉自己: Just do it, 自身的意义不需要别人授予.&lt;/p&gt;
&lt;p&gt;&quot;意义&quot; 究竟是什么, 或有人认为是做好自己力所能及的事情, 亦或是在生活中帮助别人, 或者是让自己 &quot;永远开心&quot;. 看似着些意义的定义并列或矛盾, 似乎有些不统一与冲突? 实则不然, &quot;意义&quot; 的最好定义, 必定是每个可以理解和思考 &quot;意义&quot; 为何物的对象的个体看法. 由于不同对象的感受难以互通, 使用语言等交流方式大概率导致传达的与实际的出现讯息丢失, 所以作为非 &quot;我&quot; 的对象主体难以理解某特定对象如何与为何定义与理解万物, 显然, &quot;万物&quot; 包括了 &quot;意义&quot;. 也就是说, 由于 &quot;意义&quot; 本就是难以量化的抽象概念, 只要符合合理的法律法规, 那么 &quot;意义&quot; 如何定义都是对象个体的事情, 每个对象都可以有近乎截然不同的对 &quot;意义&quot; 的理解.&lt;/p&gt;
&lt;p&gt;正如: 由于个体发展差异所造成的在某些领域起跑线的差距是很难通过短时间的训练弥补的, 所以其实无需对其他个体的成就展现出嫉妒与自卑的心理. 物理化学等科学教导我们, 只有控制变量才能探寻究竟是什么导致了实验现象, 上述事件亦然, 在个体差异所造成的影响不易说明的情况下, 无法证明是 &quot;你&quot; 的个人原因造成的成就差异, 也就自然而然不需要管别人得了多大成就了.&lt;/p&gt;
&lt;p&gt;其实现在的社会就存在很大的问题, 社会已然形成了阶层间的讯息墙, 在不同个体间构建了讯息茧房. 不论在何国家与地区, 由于人们总是喜欢了解或能够了解入心自己感兴趣的讯息, 再加上一些政治主体有意无意地控制, 导致人们很难了解地位比自己低或高的人们的方方面面, 从而使得不同人群对同一社会的看法出现天差地别的看法的现象. 并且, 社会貌似还在无形间埋没底层人民的贡献与遇到的困境.&lt;/p&gt;
&lt;p&gt;2023 年中国国家领导人前往美国旧金山与其领导人会晤时, 美方在会晤前夕调动大量人力物力资源, 驱逐流浪汉, 打扫清洁地面, 似乎是教室里同学们补作业的缩影. 社会只会在必要时为了 &quot;面子&quot; 而真正在意那些底层人们的困境, 而且都说不上 &quot;在意&quot;, 只是一味地掩盖不让其他人看见罢了.&lt;/p&gt;
&lt;p&gt;综上所述, 我想告诉大家, 就目前而言, 独立思考并给自己赋能是十分重要的. 别人难以理解你的处境, 社会也不会为了你一普通个人的利益低头, 只有自己最能够帮助自己, 只有自己能陪自己到最后一刻. 无论是超出常人的能力的飞跃, 亦或是从泥潭中酿跄向前冲着, 都是 &quot;你&quot; 最真实的个人写照, 独立思考, 勇敢去做, 不要自卑, 不要气馁.&lt;/p&gt;
&lt;p&gt;或许, 社会如冰川般, 那在水面下的 99%, 永不得天日.&lt;/p&gt;
&lt;p&gt;{/* &amp;lt;ChinesePassageComment source=&quot;教师&quot; score={null}&amp;gt;
&amp;lt;/ChinesePassageComment&amp;gt; */}&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>Lovemilk Gitea 发生重大数据安全事故通报</title><link>https://aka.lovemilk.top/notes/posts/blogs/lovemilk-gitea-tr-20251021/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/blogs/lovemilk-gitea-tr-20251021/</guid><pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;过程&lt;/h2&gt;
&lt;h3&gt;20251021 162404 (UTC+8)&lt;/h3&gt;
&lt;p&gt;本人发现 Gitea 网站发送了异常状态码 502, 故连接至服务器检查 Gitea 情况, 发现日志通报 Gitea 主服务无法连接至数据库&lt;/p&gt;
&lt;h3&gt;20251021 162523 (UTC+8)&lt;/h3&gt;
&lt;p&gt;经过对 Gitea 数据库容器的日志排查后, 发现 &lt;code&gt;[14] PANIC:  replication checkpoint has wrong magic 8914632 instead of 307747550&lt;/code&gt;, 数据库文件发生损坏&lt;/p&gt;
&lt;p&gt;我停止了 crontab 的定时备份服务 (每小时同步的备份)&lt;/p&gt;
&lt;h3&gt;20251021 164813 (UTC+8)&lt;/h3&gt;
&lt;p&gt;尝试对数据库修复无效, 开始尝试使用每小时同步的备份&lt;br /&gt;
几分钟后, 每小时备份的同步恢复失败, 开始尝试使用 Syncthing 的历史记录备份&lt;/p&gt;
&lt;h3&gt;20251021 172423 (UTC+8)&lt;/h3&gt;
&lt;p&gt;首次使用 Syncthing 历史记录的较早数据库备份导出 SQL dump 成功, 并清空服务端数据库内容, 并从空白数据库恢复 dump 的 SQL 文件成功, 但由于数据丢失严重, 开始尝试使用更新的数据库备份&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;由于 Syncthing 历史记录在我本地, 我第一时间禁用了 Syncthing 从服务器同步数据库数据, 以免恢复过程中被覆盖&lt;br /&gt;
同时, 由于 Gitea 使用了 PostgresQL 14, 而我本地软件仓库内仅有最新的 PostgresQL 17, 尝试 docker 跑 14 版本的容器&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo docker run --user &amp;lt;uid&amp;gt; --rm -it -p 5432:5432 -v /path/to/database/root:/var/lib/postgresql/data postgres:14
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;本地的 PostgresQL 运行成功 (不 PANIC) 后, 我使用了 PyCharm 连接到数据库, 并使用 &lt;code&gt;pg_dump&lt;/code&gt; 将整个数据库导出为 SQL 文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;清空数据库文件夹后, 我先运行数据库容器使得其初始化, 后将导出的 SQL 文件以如下方式恢复&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cat /path/to/dumped.sql | docker exec -e PGPASSWORD=&amp;lt;password&amp;gt; -i &amp;lt;container-name&amp;gt; \
  psql -U &amp;lt;username&amp;gt; -d &amp;lt;dbname&amp;gt; -h localhost
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;20251021 173644 (UTC+8)&lt;/h3&gt;
&lt;p&gt;使用 Syncthing 最近一个月数据库备份恢复成功, 但由于数据丢失仍然严重, 开始尝试使用更新的数据库备份&lt;/p&gt;
&lt;p&gt;(步骤同上)&lt;/p&gt;
&lt;h3&gt;20251021 175311 (UTC+8)&lt;/h3&gt;
&lt;p&gt;使用 Syncthing 最新的数据库备份恢复成功, 受影响仓库减少到 1 个&lt;/p&gt;
&lt;p&gt;(步骤同上)&lt;/p&gt;
&lt;h3&gt;20251021 180000 (UTC+8)&lt;/h3&gt;
&lt;p&gt;Gitea 服务恢复, 但仓库 &lt;code&gt;lovemilk-race/vue-zz039-0926-timesmode&lt;/code&gt; 显示 404 页面, 无法正常读取&lt;/p&gt;
&lt;p&gt;同时恢复 crontab 的定时备份服务&lt;/p&gt;
&lt;h3&gt;20251021 183536 (UTC+8)&lt;/h3&gt;
&lt;p&gt;经商讨, 现已将在备份的位于固态硬盘数据库作为主要数据库存储位置, 并将机械硬盘作为备份, Syncthing 也将同步固态硬盘数据库&lt;/p&gt;
&lt;h2&gt;原因分析&lt;/h2&gt;
&lt;p&gt;貌似因为机械硬盘敲盘, 造成 PostgresQL 数据库的某块文件发生损坏&lt;/p&gt;
&lt;h3&gt;20251230 (UTC+8) 补&lt;/h3&gt;
&lt;p&gt;2025 年 12 月 26 日 UTC+8, 本人尝试彻底解决该硬盘问题&lt;/p&gt;
&lt;p&gt;半小时后, 本人最终确认硬盘并非因自身原因, 而是 SATA 数据连接线出现问题导致硬盘频繁断链或挂载无效, 故更换了 SATA 数据连接线&lt;/p&gt;
&lt;p&gt;两小时后, &lt;code&gt;smartctl&lt;/code&gt; 的 long test 成功 (先前总会被未知原因 Abort 该测试), 测试显示硬盘无异常情况&lt;/p&gt;
&lt;p&gt;最终基本上确认了 &quot;硬盘问题&quot; (实质上并非为硬盘问题) 由 SATA 数据连接线导致&lt;/p&gt;
&lt;h3&gt;20260117 (UTC+8) 补&lt;/h3&gt;
&lt;p&gt;2026 年 01 月 17 日下午 14 时-15 时 UTC+8, 本人再次遇到了一硬盘连接故障, 出现连接速率降级&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[1887836.036170] ACPI Error: Aborting method \_SB.PCI0.SAT0.PRT0._GTF due to previous error (AE_NOT_FOUND) (20230628/psparse-529)
[1887836.036183] ata1.00: configured for UDMA/33
[1887844.955665] ata1: SATA link up 1.5 Gbps (SStatus 113 SControl 310)
[1887844.974312] ACPI BIOS Error (bug): Could not resolve symbol [\_SB.PCI0.SAT0.PRT0._GTF.DSSP], AE_NOT_FOUND (20230628/psargs-332)

[1887844.974334] No Local Variables are initialized for Method [_GTF]

[1887844.974338] No Arguments are initialized for method [_GTF]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;经观测, 机械硬盘的 SATA 数据连接口的 (从背面看) 最左侧 GND 金手指先出现蓝绿色不明固体, 猜测可能为铜氧化, 使用橡皮擦和镊子刮去部分的固体后硬盘暂时恢复正常&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BTW, 要避免挂载点未挂载时被意外写入, 可以在 &lt;strong&gt;unmount  后&lt;/strong&gt; 使用 &lt;code&gt;sudo chattr +i /path/to/mount/point&lt;/code&gt; 使得该路径不可写, 但挂载后的文件夹虽然路径一样但是不是同一个文件夹, 所以挂载后可写&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;预防故障&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;未来资金充裕时, 使用 RAID 阵列作为数据库存储位置进行透明备份&lt;/li&gt;
&lt;li&gt;使用多个数据库存储后端热备, 待某数据库出现故障时迁移到其他数据库后端&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>20260103 | 逝去的2025</title><link>https://aka.lovemilk.top/notes/posts/weekly-articles/20260103/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/weekly-articles/20260103/</guid><pubDate>Sat, 03 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ChinesePassageComment from &quot;@/components/misc/custom/ChinesePassageComment.vue&quot;;&lt;/p&gt;
&lt;h1&gt;逝去的2025&lt;/h1&gt;
&lt;blockquote&gt;
&lt;h2&gt;适用于 2025 的杂谈&lt;/h2&gt;
&lt;/blockquote&gt;
&lt;p&gt;地球依然绕太阳公公公转着, 万年不变, 万年不会变. 像我们这种附着在地球上小小乐色尘埃, 也只得被拖拽着一同运动了.&lt;/p&gt;
&lt;p&gt;不知为何, 我所感受着的 2020 年后的日夜, 像是加快了些脚步, 追赶着未来. 或许是我对人生的感知加快了脚步了罢[^feel-log-of-time], 亦或是整个宇宙发生了些 magic.&lt;/p&gt;
&lt;p&gt;总之, 往日终究是往日, 留下的没有完成的一切, 也只得成为不断堆积的代办队列[^why-list]了.&lt;/p&gt;
&lt;p&gt;回望过去的是是非非, 或许会思考要是当时选择别样, 做出不同的话, 结局会更好. 你以为我会后悔吗? 不, 我从不后悔. 即使有回到过去的能力, 若是记忆也回到过去, 我认为任何人都无法做出未来认为的 &quot;更好的选择&quot;, 因为做出决定的那刻的各种条件综合影响了有着当时认知的大脑的决定, 也就是说, 当时的 &quot;我&quot; 已经做了 &quot;我觉得&quot; &quot;最好&quot; 的决定了.&lt;/p&gt;
&lt;h3&gt;过往&lt;/h3&gt;
&lt;h4&gt;开学前的离家&lt;/h4&gt;
&lt;p&gt;这一年有许多变故. 年初的时候, 可能由于对社交的失望, 亦或是对多次的劝解没有作用的反感, 我, 沉沦了下去.&lt;/p&gt;
&lt;p&gt;依稀记得快要开学到时候, 大概是 8 月末, 沉沦于厌烦到极致的我, 打算用自己的行动, 达成我的目标: 打算自己一个人离家, 一来可以远离烦我的人, 二来可以当作进一步谈判的筹码.&lt;/p&gt;
&lt;p&gt;开学那天早晨, 我早早起床 (大概 5 点 UTC+8) 吃了预订的外送, 溜出了家门. 恰逢手机损坏, 我便失去了一切联系方式, 或者说我家失去了我的一切联系方式. 微冷的暖风在我的皮肤各处挠痒着, 但我不常见过的朝阳暖暖的. 我快步走向公车站, 向着家的反方向前行着, 路程中也有些许不知所措, 但我终究到达了上海市中心人民广场, 不乘坐火车高铁, 不依赖智能终端, 仅凭借非记名制公共交通到达了几十公里外的大城市中心, 混入人流中. 大抵是证明心切, 急切获取筹码, 我找了个公用电话亭 (上海的电话亭是免费的还是不错的?), 拨打了家里的号码, 说明情况, 给他们的心灵重重一棒.&lt;/p&gt;
&lt;p&gt;我做的一切, 都是为了告诉任何人, 我的人生谁也无法阻拦, 我的选择谁也无法改变.&lt;/p&gt;
&lt;h4&gt;完成的任务&lt;/h4&gt;
&lt;p&gt;2025 年一年我做了不少事情.&lt;/p&gt;
&lt;p&gt;搭建了一台服务器 (实际上是一块二手主板, 搭配洋垃圾[^electronic-waste] CPU), 学习了一些 The Go Programming Language[^golang] 为了我后续开发做准备.&lt;/p&gt;
&lt;p&gt;购买了一些的手机维修工具, 给自己的手机更换了电源按钮 (虽然屏幕坏了).&lt;/p&gt;
&lt;p&gt;在年末, 竟然在学校里学会了压网线, 真的能学到东西我是没想到的, 但这肯定要感谢我们的&amp;lt;pe&amp;gt;何老师&amp;lt;/pe&amp;gt;.&lt;/p&gt;
&lt;p&gt;在学习方面主要提升了专业理论成绩 (果然还是计算适合我, 背诵记忆什么的never I can啦), 不过有些专业知识还是有点小难的.&lt;/p&gt;
&lt;p&gt;(怎么感觉在写更新日志一样啊喂)&lt;/p&gt;
&lt;p&gt;简言之, 平常的一年, 但是小细节很多.&lt;/p&gt;
&lt;h3&gt;至全体任课老师&lt;/h3&gt;
&lt;p&gt;&lt;s&gt;现在才是主题&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;经过了近一年的相处, 作为一个学生的我, 必然(?吗)想要和任课老师进行一些交流, 以便促进同学对课程内容的理解.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;就从事实而言, 同学对语文学习兴趣不高. 就本人观察而言, 要问题是大部分同学对语文一科的成绩提升不抱有希望, 即无论是否学习听课, 其自身成绩任处于正常波动水平无明显进步. 更有甚者 (特别是语文成绩较好的同学), 在复习后名次反而更加靠后. 并且, 一部分同学对语文作业的作业量抱有较大不满, 可能是因本学期语文老师(不含代课老师)的作业量与上学期存在显著差异, 作业上交要求显著增加导致产生了 &quot;戒断反应&quot;[^drug-withdrawal].&lt;/p&gt;
&lt;p&gt;由于个人对课程的态度能够很大程度上决定该课程的学习情况, 解决该问题的关键是如何让同学不讨厌语文.&lt;/p&gt;
&lt;p&gt;就我个人而言, 我认为通过对作业量的控制, 并加以针对性学习是一个可行的解决方法. 适当减少一般作业的作业量, 特别是在同学面前主动减少, 可以构建更好的师生关系, 让同学在心底里不讨厌. 而后, 提供多个作业选择其一的布置方法, 可以使得不同同学的可以根据个人学习情况, 按照个人擅长与不擅长内容针对性完成作业.&lt;/p&gt;
&lt;p&gt;对于成绩一般的同学, 提升部分内容的分数很可能是及格与不及格的关键: 比如某个同学擅长记忆, 那么背诵/默写更适合ta; 某个同学擅长理解, 那么阅读更适合ta. 从而达到总体上提升平均分 (学习/深化学习擅长部分可以在减少作业耗时情况下提升擅长部分得分, 增加总体分数, 很大程度上减少同学厌烦程度).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于专业课程, 本人从同学了解到一些同学在听课过程中由于有过多概念未曾了解, 造成根本上无法听课 (特别是计算机硬件与网路相关内容, 亦 &quot;计高2&quot;).&lt;/p&gt;
&lt;p&gt;由于一些人可能对于专业课这种先前未曾学习过的课程存在难以开始的懒惰与抵触心理, 不愿意课后补习, 再加上专业课本身的难度, 可能导致学习难度 与 知识与目标知识差距过大, 造成恶性循环.&lt;/p&gt;
&lt;p&gt;为此, 本人认为可以提供 &lt;strong&gt;课上问答&lt;/strong&gt;, 以 &lt;strong&gt;指名道姓&lt;/strong&gt; 的点名方式, 向任课老师提出问题, 并课上答疑. 课上问答与指名道姓是必要的, 否则, 可能会因为没有动力和不好意思/懒得去导致成效甚微.&lt;/p&gt;
&lt;p&gt;同时, 为实质性提升同学学习质量, 敬爱的&amp;lt;pe&amp;gt;班主任&amp;lt;/pe&amp;gt;同志已与各科目的顶尖人士 (?) 沟通, 并于下学期开始, 利用英语课时间排课, 开展面向全班的进行各课程学生二次复习与讲解活动.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最后, 我也希望各老师与教材编者可以尊重事实, 按照相关行业发展趋势进行授课与编写.&lt;/p&gt;
&lt;p&gt;&amp;lt;ChinesePassageComment source=&quot;教师&quot; score={null}&amp;gt;
看似平淡地叙述，实则看到了一个独立有主见的你，比较喜欢你文字中一些细腻灵动的表达，如“微冷的暖风在我的皮肤各处挠痒着，但我不常见过的朝阳暖暖的”，从你的文字里感受到了真实的温度。我想随着阅历的不断积累丰富，你也会渐渐明白人可能不仅仅是为了自己，有时也要照顾在意且爱你的人的感受，这也许也是我们勇敢做自己前需要修炼的课程。然后关于语文学习，有些比较可能也是相对性的，我们现在是高二了，势必作业量也会比高一多一些，等到高三复习阶段相对更要紧张一点，我想只要在合理范围内的作业都是有助于我们的语文学习的，路漫漫其修远兮，希望在你我的共同努力下，不辜负这三年的光阴，更不辜负自己，交出一份满意的答卷。
&amp;lt;/ChinesePassageComment&amp;gt;&lt;/p&gt;
&lt;p&gt;[^feel-log-of-time]: https://www.youtube.com/watch?v=JdhRD4TKh48 / https://www.bilibili.com/video/BV1VrVSz1Eme 人类感知是“对数化”的: 无论是对时间流逝、声音高低还是财富增减的感受, 人类大脑处理的不是绝对变化量, 而是相对比例。这解释了为什么小时候觉得时间漫长, 而成年后觉得时间飞快
[^why-list]: 代办事项在大部分情况下都是按照时间顺序优先完成较早任务的. 显然, 这与 &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E9%98%9F%E5%88%97&quot;&gt;队列&lt;/a&gt; &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%85%88%E9%80%B2%E5%85%88%E5%87%BA%E6%BC%94%E7%AE%97%E6%B3%95&quot;&gt;先进先出的特性&lt;/a&gt; 相吻合
[^electronic-waste]: https://zh.wikipedia.org/wiki/洋垃圾 &amp;amp; https://zh.wikipedia.org/wiki/电子垃圾 此处 &quot;洋垃圾&quot; 特指境外 商业服务器/数据中心 淘汰的(可用)电子产品, 包括但不限于 CPU, 硬盘, 服务器主板, 硬盘 和 内存条
[^golang]: https://go.dev Go（又称Golang）是Google开发的一种静态强类型、编译型、并发型，并具有垃圾回收功能的编程语言
[^drug-withdrawal]: 参考 &quot;&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E8%97%A5%E7%89%A9%E6%88%92%E6%96%B7&quot;&gt;药物戒断&lt;/a&gt;&quot;&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>在 Android 上启用 ADB 自动授权</title><link>https://aka.lovemilk.top/notes/posts/apps/android/enable-auto-auth-adb/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/android/enable-auto-auth-adb/</guid><pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/44817341/always-allow-adb-on-android&quot;&gt;https://stackoverflow.com/questions/44817341/always-allow-adb-on-android&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;我的 Redmi K40 屏幕损坏了, 导致只能使用 Scrcpy 连接, 但是由于长时间不用导致 ADB 授权失效了&lt;/p&gt;
&lt;h2&gt;先决条件&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;设备已解锁 Bootloader&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(仅方法 1)&lt;/strong&gt; 系统为 &lt;code&gt;userdebug&lt;/code&gt; 或 &lt;code&gt;eng&lt;/code&gt; 构建&lt;/li&gt;
&lt;li&gt;手机使用有线连接至电脑&lt;/li&gt;
&lt;li&gt;电脑中已安装并添加环境变量 Google 的 &lt;a href=&quot;https://developer.android.com/tools/releases/platform-tools&quot;&gt;Platform Tools&lt;/a&gt; (亦称 ADB)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;方法 1&lt;/h2&gt;
&lt;h3&gt;1. 刷入第三方 Recovery&lt;/h3&gt;
&lt;p&gt;为配置 ADB 自动授权, 需要使用 ADB Shell 覆写 &lt;code&gt;build.prop&lt;/code&gt;&lt;br /&gt;
BTW, 非 Android 的本机的 ADB 密钥对位于 &lt;code&gt;~/.android/&lt;/code&gt; 下的 &lt;code&gt;adbkey&lt;/code&gt; 与 &lt;code&gt;adbkey.pub&lt;/code&gt; 文件&lt;br /&gt;
&lt;code&gt;/data/misc/adb/adb_keys&lt;/code&gt; 是 Android 上用于存储 ADB 认证公钥与本机密钥对的文件&lt;a href=&quot;https://android.stackexchange.com/questions/171934/storage-location-of-adb-keys&quot;&gt;^adb-keys-stored&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;刷入第三方 Recovery 可以通过 ADB 连接至 ADB Shell, 并将 System 分区挂载为 rw&lt;/p&gt;
&lt;p&gt;首先, 请进入 Fastboot&lt;/p&gt;
&lt;p&gt;对于大多数设备&lt;br /&gt;
(对于 Recovery 存储于 boot 分区的设备)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fastboot boot &amp;lt;image-path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于拥有独立 Recovery 分区的设备&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fastboot flash recovery &amp;lt;image-path&amp;gt;
fastboot reboot recovery
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意 如下命令是进入 &lt;code&gt;fastbootd&lt;/code&gt; 的, 而非 &lt;code&gt;fastboot&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fastboot reboot fastboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要进入 &lt;code&gt;fastboot&lt;/code&gt;, 请运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fastboot reboot bootloader
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2. 覆写 &lt;code&gt;build.prop&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;待设备进入 Recovery 后, 复写 &lt;code&gt;build.prop&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;未经特殊说明, 如下命令均在 ADB Shell 中执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adb shell
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;查看分区表&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cat /etc/fstab
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;挂载 system 分区&lt;br /&gt;
在上步骤的输出中找到 &lt;code&gt;/system_root&lt;/code&gt; 字样, 并挂载改路径&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mount -o rw /system_root
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后 &lt;code&gt;/system_root/system&lt;/code&gt; 应该是可读写的 system 分区&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;备份并修改 &lt;code&gt;build.prop&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cd /system_root/system
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;备份&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp ./build.prop ./build.prop.bak
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改&lt;br /&gt;
找到 &lt;code&gt;ro.adb.secure=&lt;/code&gt; 的选项, 并改为 &lt;code&gt;0&lt;/code&gt;&lt;a href=&quot;https://android.stackexchange.com/questions/55674/how-can-i-enable-adbd-during-boot-on-cyanogenmod&quot;&gt;^ro.adb.secure&lt;/a&gt;&lt;br /&gt;
(P.S. vi 也可以, 但是我不会用)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano ./build.prop
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;验证修改&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cat ./build.prop | grep &quot;ro.adb.secure=&quot; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若输出如下内容即为修改成功&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ro.adb.secure=0
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;解除挂载&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cd /  # 不然会显示设备正在使用
umount /system_root
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;重启&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;连接 ADB&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;如果您在开机时仍然遇到了 &lt;code&gt;unauthorized&lt;/code&gt; 的 ADB 设备的情况, 请 &lt;a href=&quot;#%E4%BF%AE%E6%94%B9-data-%E5%88%86%E5%8C%BA%E7%9A%84-adb-%E5%B7%B2%E6%8E%88%E6%9D%83%E7%9A%84%E5%85%AC%E9%92%A5&quot;&gt;修改 Data 分区的 ADB 已授权的公钥&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;adb devices
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;恭喜🎉! 现在您可以使用 ADB 连接了!&lt;/p&gt;
&lt;h2&gt;方法 2: 修改 Data 分区的 ADB 已授权的公钥&lt;/h2&gt;
&lt;h3&gt;1. 按照 &lt;a href=&quot;#1-%E5%88%B7%E5%85%A5%E7%AC%AC%E4%B8%89%E6%96%B9-recovery&quot;&gt;刷入第三方 Recovery&lt;/a&gt; 方法进入 ADB Shell&lt;/h3&gt;
&lt;p&gt;但请注意: 该操作需要已经刷入的 Recovery, 而不能使用 &lt;code&gt;fastboot boot&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;2. 添加授权公钥&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://xdaforums.com/t/how-to-decrypt-sdcard-from-adb.4262247/&quot;&gt;https://xdaforums.com/t/how-to-decrypt-sdcard-from-adb.4262247/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;待设备进入 Recovery 后&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adb shell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;未经特殊说明, 如下命令均在 ADB Shell 中执行&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;解密 data (OrangeFox 同样可以运行)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
需要等待 Recovery 加载完成&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;twrp decrypt &amp;lt;pin/password&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;!-- 或使用 OrangeFox 的工具&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fox decrypt
``` --&amp;gt;

2. 写入 `/data/misc/adb/adb_keys`  
与 SSH 类似, 该文件是按行分割的公钥列表  
格式: `&amp;lt;Base64编码的RSA公钥数据&amp;gt; &amp;lt;用户名&amp;gt;@&amp;lt;主机名&amp;gt;`

(直接运行, 不在 ADB Shell 中)
```sh
adb push ~/.android/adbkey.pub /tmp/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(以下内容需要在 ADB Shell 中执行)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /tmp/adbkey.pub &amp;gt;&amp;gt; /data/misc/adb/adb_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 解决 ADB 授权会在一端时间后失效&lt;/h3&gt;
&lt;p&gt;要避免 ADB 在一段时间后授权失效, 可以将授权公钥改为只读&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chattr +i /data/misc/adb/adb_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样, UI 上的新的的 ADB 授权会写入 &lt;code&gt;/data/misc/adb/adb_keys.new&lt;/code&gt;, 同时原本的授权公钥仍可用&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;要再修改时, 请使用如下命令解除只读&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chattr -i /data/misc/adb/adb_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>配置适用于 ArchLinux KDE 桌面环境的 KasmVNC</title><link>https://aka.lovemilk.top/notes/posts/deployment/kasmvnc/archlinux-kde/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/kasmvnc/archlinux-kde/</guid><pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;本文内容可能已过时&lt;/strong&gt;&lt;br /&gt;
如果您正在寻找部署更为便捷与 &lt;strong&gt;可传递声音&lt;/strong&gt; 的 WebUI 操控 KDE 桌面环境的方案, 或是不知选择何种解决方案, 我们推荐您参阅 &lt;a href=&quot;/posts/deployment/selkies/archlinux-kde/&quot;&gt;Selkies WebUI 操控方案 | 部署适用于 ArchLinux KDE 桌面环境的 Selkies 与 KasmVNC&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;安装基于 X11 的 KDE 桌面环境&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/KDE&quot;&gt;https://wiki.archlinux.org/title/KDE&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://archlinux.org/news/plasma-640-will-need-manual-intervention-if-you-are-on-x11/&quot;&gt;https://archlinux.org/news/plasma-640-will-need-manual-intervention-if-you-are-on-x11/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S plasma-meta plasma-x11-session konsole dolphin pipewire
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装 KasmVNC&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;使用 AUR 安装&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;yay -S kasmvncserver-bin openssl-1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;生成初始配置&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;kasmvncserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;选择手动设置密码 (键入选项 1)&lt;br /&gt;
完成后, 会出现文件 &lt;code&gt;~/.kasmpasswd&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;配置 KasmVNC&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://kasmweb.com/kasmvnc/docs/1.0.0/configuration.html&quot;&gt;https://kasmweb.com/kasmvnc/docs/1.0.0/configuration.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;修改如下位置的配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/kasmvnc/kasmvnc.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如下配置文件会在 59000 端口开启外部可访问的 WebVNC&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;network:
  protocol: http
  interface: 0.0.0.0
  websocket_port: 59000
  use_ipv4: true
  use_ipv6: true
  udp:
    public_ip: auto
    port: auto
    payload_size: auto
    stun_server: auto
  ssl:
    pem_certificate: /etc/ssl/certs/ssl-cert-snakeoil.pem
    pem_key: /etc/ssl/private/ssl-cert-snakeoil.key
    require_ssl: false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当 &lt;code&gt;network.ssl.require_ssl&lt;/code&gt; 为 &lt;code&gt;false&lt;/code&gt; 时 允许 HTTP 访问, 但是仍需要指定同级配置下的 &lt;code&gt;pem_key&lt;/code&gt; 与 &lt;code&gt;pem_certificate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;要使用 openssl 生成 key 与 certificate, 请使用如下命令生成有效期 90 天的 RSA 4096bit 证书至默认位置:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo openssl req -x509 -nodes -days 90 -newkey rsa:4096 \
  -keyout /etc/ssl/private/ssl-cert-snakeoil.key \
  -out /etc/ssl/certs/ssl-cert-snakeoil.pem \
  -subj &quot;/C=CN/ST=Default/L=Default/O=KasmVNC/CN=${HOST:-default-host}&quot;

sudo chmod 644 /etc/ssl/certs/ssl-cert-snakeoil.pem
sudo chmod 600 /etc/ssl/private/ssl-cert-snakeoil.key
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;h3&gt;SEE ALSO&lt;/h3&gt;
&lt;p&gt;要使 Caddy 反向代理忽略 TLS 证书有效性, 请使用:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reverse_proxy https://&amp;lt;url&amp;gt; {
    transport http {
        tls_insecure_skip_verify
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h2&gt;配置 VNC 启动脚本&lt;/h2&gt;
&lt;p&gt;打开如下位置脚本文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.vnc/xstartup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入如下脚本内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
unset DBUS_SESSION_BUS_ADDRESS
unset SESSION_MANAGER

export XDG_RUNTIME_DIR=&quot;/run/user/$(id -u)&quot;
mkdir -p &quot;$XDG_RUNTIME_DIR&quot;
chmod 700 &quot;$XDG_RUNTIME_DIR&quot;

export KWIN_COMPOSE=O2  # use OpenGL 2 as render, change it in need
export XDG_CURRENT_DESKTOP=&quot;KDE&quot;

launch_session() {
    pipewire &amp;amp;
    pipewire-pulse &amp;amp;
    wireplumber &amp;amp;

    exec startplasma-x11
}

export -f launch_session

# launch with dbus
exec dbus-run-session bash -c launch_session
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;尝试运行&lt;/h2&gt;
&lt;p&gt;运行如下命令后, 会在上方配置的 &lt;code&gt;network.websocket_port&lt;/code&gt; 端口启动位于 X11 的 DISPLAY 0 的 WebVNC&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;kasmvncserver :0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果该命令较长时间未能成功, 或显示 &lt;code&gt;Failed to get public IP, please specify it with -publicIP&lt;/code&gt; 字样, 请修改配置文件的 &lt;code&gt;network.udp.public_ip&lt;/code&gt; 字段, 或在启动 &lt;code&gt;kasmvncserver&lt;/code&gt; 时使用 &lt;code&gt;-publicIP &amp;lt;public-ipaddr&amp;gt;&lt;/code&gt; 指定 公网 IP 地址 (没有者尝试填写内网地址)&lt;/p&gt;
&lt;p&gt;经测试: 位于反向代理后的 KasmVNC 将 &lt;code&gt;network.udp.public_ip&lt;/code&gt; 字段配置为内网地址是可以通过反向代理正常访问的&lt;/p&gt;
&lt;h2&gt;使用 systemd 开机自启动服务&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;以免用户服务在 SSH 终止后退出&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;loginctl enable-linger &amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;写入如下位置文件 (文件(夹)不存在就创建)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;~/.config/systemd/user/kasmvnc.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=KasmVNC Service for &amp;lt;username&amp;gt;
After=network.target

[Service]
Type=simple

Environment=&quot;XDG_SESSION_TYPE=x11&quot;
Environment=&quot;XDG_CURRENT_DESKTOP=KDE&quot;
ExecStart=/usr/bin/bash -c &quot;/usr/bin/kasmvncserver :0 -fg&quot;

Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使 Systemd 刷新出该服务&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user daemon-reload
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;启用并启动该服务&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user enable --now kasmvnc.service
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>20251123 | 母爱</title><link>https://aka.lovemilk.top/notes/posts/weekly-articles/20251122/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/weekly-articles/20251122/</guid><pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ChinesePassageComment from &quot;@/components/misc/custom/ChinesePassageComment.vue&quot;;&lt;/p&gt;
&lt;p&gt;母亲是人类对其生育者的称呼, 代表了最基本与最本质的亲缘关系.&lt;/p&gt;
&lt;p&gt;母爱是人类出生于世最开始能够接触到的亲缘情感, 很大程度上决定了某个人类的思考与行为方式.&lt;/p&gt;
&lt;p&gt;作家老舍的《我的母亲》&lt;a href=&quot;https://baike.baidu.com/item/%E6%88%91%E7%9A%84%E6%AF%8D%E4%BA%B2/3634229&quot;&gt;^my-mother-by-LaoShe&lt;/a&gt; 中就曾写到 &quot;..., 但是我的真正的教师，把性格传给我的，是我的母亲。&quot;.&lt;/p&gt;
&lt;p&gt;就我认为, 母爱应当是尊重幼仔的. 合理的母爱, 应当是以尊重孩子, 理解孩子为前提的. 在法律底线之上的, 孩子想要去做的, 应当给予支持和鼓励, 而非为孩子制定了整个人生. 每一个生物个体都应拥有 享有自主生活的权利, 不应当受到任何的(不论血缘亲缘与否的)生物个体的干涉.&lt;/p&gt;
&lt;p&gt;其次, 母爱应当是以现实为基础的. 不能为了达成母爱, 过于形式化地不考虑个人/家庭的实际情况, 为了完成母爱 &quot;以免亏欠&quot; 而一味的做出违背实际情况的事情. 例如通过攀比比较母爱的程度, 通过母亲给予的物质支持的多少比较母爱的程度就是不合理且有违母爱初心的.&lt;/p&gt;
&lt;p&gt;最后, 母爱是潜移默化的. 在日常生活的点点滴滴中不谈起母爱, 但都充满了母爱. &quot;老舍的母亲&quot; 从出生开始就在无形间教 &quot;我&quot; 为人处世, 生存技巧, 并在 &quot;我&quot; 需要的时候给予各方面的支持, 从未说明, 无需说明.&lt;/p&gt;
&lt;p&gt;简言之, 母爱是伟大的. &quot;老舍的母亲&quot; 从出生起始的生活的教育, 至死亡时教会 &quot;我&quot; 面对生离死别的 &lt;em&gt;最后一课&lt;/em&gt;, 从母亲开始, 从母亲结束, 这便是母爱最无需解释的全然的自然而然的理解. 暮秋绿叶飘落, 落叶归根, 又滋养了大树.&lt;/p&gt;
&lt;p&gt;&amp;lt;span desc=&quot;starts 代表了仿佛一直没有终止过, ended 代表了惘然间已经结束了&quot;&amp;gt;Where it starts is where it ended.&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;ChinesePassageComment source=&quot;教师&quot; score={null}&amp;gt;
文章结构完整，思路清晰，从三个不同层面阐释“母爱”的含义，有自己独立的思考和独到的见地，如能在每个层次表达时运用举例引用等相关实例，会使文章表达更深层次，更具有感染力。
&amp;lt;/ChinesePassageComment&amp;gt;&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>JitsiMeet DOCKER 部署教程及初始配置</title><link>https://aka.lovemilk.top/notes/posts/deployment/jitsimeet/docker/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/jitsimeet/docker/</guid><pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近在和同事(学)一起做项目, 需要在中国大陆可以快速访问的在线会议, 故搭建了 JitsiMeet&lt;/p&gt;
&lt;h2&gt;部署&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker&quot;&gt;https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;找个文件夹下载发行文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;wget $(wget -q -O - https://api.github.com/repos/jitsi/docker-jitsi-meet/releases/latest | grep zip | cut -d\&quot; -f4)
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;解压下载的文件, 你会得到一个以 &lt;code&gt;jitsi-&lt;/code&gt; 开头的文件夹, 里面会有个 &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;unzip &amp;lt;filename&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;创建 &lt;code&gt;.env&lt;/code&gt; 配置&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cp env.example .env
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;生成 XMPP 密码 (自动写入 &lt;code&gt;.env&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;./gen-passwords.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;修改 &lt;code&gt;.env&lt;/code&gt; 中 &lt;code&gt;CONFIG&lt;/code&gt; 指向的路径, 作为配置文件根目录&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;CONFIG=&amp;lt;path/to/config-root&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;创建配置文件夹&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;path/to/config-root&amp;gt;&lt;/code&gt; 为 &lt;code&gt;.env&lt;/code&gt; 中 &lt;code&gt;CONFIG&lt;/code&gt; 所指向的文件路径&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path/to/config-root&amp;gt;/{web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;进行配置后, 方可启动&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;初始配置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;修改 &lt;code&gt;PUBLIC_URL&lt;/code&gt; 为你的 URL 根&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;PUBLIC_URL=https://meet.example.com:...
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;修改页面端口&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;HTTP_PORT=...
HTTPS_PORT=...

# 如果是反代用户, 需要禁用 HTTP 自动跳转 HTTPS
ENABLE_HTTP_REDIRECT=0
# 并禁用自动 TLS 证书申请
ENABLE_LETSENCRYPT=0
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;(可选)设置 JVB 端口&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;JVB_PORT=...
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;对于 NAT 或有防火墙下部署的用户, 需要修改 &lt;code&gt;JVB_ADVERTISE_IPS&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;JVB_ADVERTISE_IPS=&amp;lt;局域网IP/域名&amp;gt;,&amp;lt;公网IP/域名&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;禁用 &lt;code&gt;p2p&lt;/code&gt; 连接以免用户 IP 泄漏和/或保证稳定性&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ENABLE_P2P=false
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;配置 Auth&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# Enable authentication (will ask for login and password to join the meeting)
# 启用
ENABLE_AUTH=1

# Enable guest access (if authentication is enabled, this allows for users to be held in lobby until registered user lets them in)
# 对于已验证的用户开启的会议, 是否仍然需要验证才能加入, 开启访客后可直接加入, 但无法创建会议
ENABLE_GUESTS=1

# Select authentication type: internal, jwt, ldap or matrix
# Auth 类型, 默认 `internal` 即可
AUTH_TYPE=internal
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;端口转发或开放端口
需要在你的 网关/路由 或 防火墙 内开放如下端口&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;环境变量&lt;/th&gt;
&lt;th&gt;介绍&lt;/th&gt;
&lt;th&gt;条件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HTTP_PORT&lt;/code&gt; &lt;code&gt;HTTPS_PORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JitsiMeet 的主要 WebUI / TCP&lt;/td&gt;
&lt;td&gt;对于使用反代的用户, 配置反代即可, 无需开放 HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JVB_PORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JVB (Jitsi Video Bridge) 端口, 不能 p2p 连接的都需要这个服务中转 / UDP&lt;/td&gt;
&lt;td&gt;未配置时请开放 &lt;code&gt;10000/udp&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;p&gt;在开启 Auth 的 JitsiMeet 上创建/删除 internal 用户&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker#internal-authentication&quot;&gt;https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker#internal-authentication&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;前置条件: 进入容器内部&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker compose exec prosody /bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;创建用户&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; 为用户名, &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; 为密码, 本人暂不清楚是否支持非 ASCII 字符, 谨慎使用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;prosodyctl --config /config/prosody.cfg.lua register &amp;lt;username&amp;gt; meet.jitsi &amp;lt;password&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有输出就创建成功了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;删除用户&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; 为用户名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;prosodyctl --config /config/prosody.cfg.lua unregister &amp;lt;username&amp;gt; meet.jitsi
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;要列出所有用户, 请使用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;find /config/data/meet%2ejitsi/accounts -type f -exec basename {} .dat \;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>20251031 | 早暮秋</title><link>https://aka.lovemilk.top/notes/posts/weekly-articles/20251031/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/weekly-articles/20251031/</guid><pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ChinesePassageComment from &quot;@/components/misc/custom/ChinesePassageComment.vue&quot;;&lt;/p&gt;
&lt;p&gt;洼成小岛的柏油小路上, 反射着从被染成&amp;lt;span x-comment=&quot;Cloudflare&quot;&amp;gt;火曜云&amp;lt;/span&amp;gt;间隙间逃跑的暗淡阳光, 染红遍地. 柳枝长长弯下, 使每一位过路的人逃窜着 这当头一&quot;枝&quot;. 顺着树梢向上, 水滴做成的小炮弹蓄势待发, 借着&amp;lt;ruby&amp;gt;天地&amp;lt;rp&amp;gt;(&amp;lt;/rp&amp;gt; &amp;lt;rt&amp;gt;重力势能&amp;lt;/rt&amp;gt; &amp;lt;rp&amp;gt;)&amp;lt;/rp&amp;gt;&amp;lt;/ruby&amp;gt;, 击打近乎每一只忘记躲雨带伞的&lt;s&gt;小可爱&lt;/s&gt;. 天空微微泛灰, 冷色调席卷, 恰到好处. 晚霞的日光吹成微风, 轻柔刺骨. 路旁的岸边浮满小小的棕色落叶的小河的水面上, 已然被那微风推搡着, 发生了踩踏事故——一圈圈地倒下了.&lt;/p&gt;
&lt;p&gt;我用力一踢, 小石子旋转着飞入小河, 在另一方向推搡水面, 是倒下的水的最后的呐喊的高度 变得更高了些——两个以及许多个不同圆心的同心圆交织, 互助, 抵消, 正使想要但又不敢跳起呐喊的水 加入了&quot;扰乱&quot;这 &quot;看似的有序&quot; 之中来了——但我的脚, 也因为作用力与反作用力, 变的疼痛了些许.&lt;/p&gt;
&lt;p&gt;嘀嘀嘀. 水面上本就不可开交的战场, 竟被突然下起的细雨所打破. 霎时, 不仅仅是那小石子打破水面的地方, 整条小河上已然出现了无数水滴的声嘶力竭——到处开战了.&lt;/p&gt;
&lt;p&gt;我钻着水幕的间隙, 向着家的方向, 渐行渐远了. 地面, 被薄薄的水覆盖了. 风, 不再轻柔, 但仍刺骨. 阳光, 也随着地球自转, 消散在宛如蝴蝶翅膀的影子的晨昏线下.&lt;/p&gt;
&lt;p&gt;次日, 气温上升了些许. 回到小路上, 景象早已如初, 无人在意, 无人记住, 亦无人 会知道它的结果.&lt;/p&gt;
&lt;p&gt;&amp;lt;ChinesePassageComment source=&quot;教师&quot; score={null}&amp;gt;
文章语言表达较有感染力, 观察细致入微, 早秋河面一角描摹细腻生动, 情景交融, 富有想象力, 如能将“秋”的主题再凸显一些会更好
&amp;lt;/ChinesePassageComment&amp;gt;&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>修复因 NVIDIA 驱动兼容性问题造成 (包括但不限于) Janim 编辑器调用 QT OpenGL 接口时崩溃</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/janim-opengl-error/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/janim-opengl-error/</guid><pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;要修复该问题, 使用环境变量指定使用 Mesa 的 Zink, 将 OpenGL 转译为 Vulkan 运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;env \
  __GLX_VENDOR_LIBRARY_NAME=mesa \
  __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json \
  MESA_LOADER_DRIVER_OVERRIDE=zink \
  GALLIUM_DRIVER=zink \
  LIBGL_KOPPER_DRI2=1 \
  janim &quot;$@&quot;  # 本行可以是任意想要执行的命令
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
切勿将环境变量设至 &lt;code&gt;/etc/environment&lt;/code&gt; 以免无法打开 DE&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Caddy | 从非标的 HTTP 重定向到同端口的 HTTPS</title><link>https://aka.lovemilk.top/notes/posts/apps/caddy/rediect-http2https/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/caddy/rediect-http2https/</guid><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;我需要在非 80/443 上运行 HTTPS 服务, 但是 Caddy 会给出 &lt;code&gt;Client sent an HTTP request to an HTTPS server&lt;/code&gt; 的错误 (实际上是 go 的 &lt;code&gt;net&lt;/code&gt; 包导致的), 而我搜索许久没有找到方法&lt;/p&gt;
&lt;h2&gt;解决&lt;/h2&gt;
&lt;p&gt;我在今天修复 TLS 证书续期问题时, 我找到了这篇帖子中的解决方法 &lt;a href=&quot;https://caddy.community/t/caddy-v2-redirect-non-ssl-http-traffic-to-https-on-same-non-standard-port/9089/11&quot;&gt;Caddy v2 - redirect non-SSL HTTP traffic to HTTPS on same (non-standard) port - Help - Caddy Community&lt;/a&gt;, 以及官方文档中的 &lt;a href=&quot;https://caddyserver.com/docs/caddyfile/options#http-redirect&quot;&gt;使用方法&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    # 全局配置
    servers {
		listener_wrappers {
			# 自动重定向的 wrapper
			http_redirect
			# 保留 TLS 层
			tls
		}
	}
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>关于职高计算机科学教学内容与教学方式亲身经历的异议</title><link>https://aka.lovemilk.top/notes/posts/how-school-bad/high/01/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/how-school-bad/high/01/</guid><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这是对我亲身经历事情的描述和发表的看法, 接旨为提升学校教学质量, 提高学生掌握知识的严谨性与准确度&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;在周一讲解 Python 试卷与试题时, 其任课老师&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在讲解 Python 相关试题以及作业时, 仅对题目及其答案, 教科书所述内容尊重, 部分教科书未提及的内容避而不谈, 以&quot;答案是这样的&quot;为由匆匆略过&lt;/li&gt;
&lt;li&gt;不对编程语言及计算机基本常识, 设计保有尊重, 磨灭, 践踏计算机科学的行为唯一性和严谨性&lt;/li&gt;
&lt;li&gt;在明知教科书可能存在较多错误的情况下, 出现疑问不认真备课查询相关官方文档文献, 转而利用教科书及其题目答案肆意&quot;揣测&quot;, &quot;妄想&quot;该问题的原理, 将未经调查明确的, 未确定是否在事实上计算机科学中正确的内容授课于学生&lt;/li&gt;
&lt;li&gt;在学生产生疑问时, 以&quot;万物不能是完美的, 所以题目也有不严谨的地方, 大家酌情忽视&quot;的态度告知学生遵循&quot;答案&quot;, 既不能让学生从根本上明了知识的原理, 无法实际上掌握知识, 又消磨了学生对教材可能的问题, 权威可能的问题提出质疑, 探究问题原因的创造性思维的动力&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;同时在讲解月考试卷时, 本人尝试指出问题 &quot;Python 变量应当在使用前定义&quot; 并与任课老师沟通时, 其说 &quot;这个是和其他语言对比的&quot;, 但是书上确实没有提及 &quot;声明&quot; 与 &quot;定义&quot; 的区别. 同时, 对于访问一个不存在的变量(标识符)的操作, Python 官方的报错信息是 &lt;code&gt;NameError: name &apos;x&apos; is not defined&lt;/code&gt;, 也就是说 Python 官方也称变量没有被 &quot;defined&quot; (即 &quot;未定义&quot;), 但任课老师说 &quot;这是和其他语言对比的, 你不用再管了&quot;&lt;/p&gt;
&lt;p&gt;我不是为了这几分大费口舌, 更不是为了较真, 而是作为计算机科学学生应当尊重计算机科学的严谨性, 行为唯一性, 更要让学校教会学生, 教好学生&lt;/p&gt;
&lt;p&gt;我的诉求很简单&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;尊重客观事实与代码实现, 以所学内容设计者的官方文档, 官方资料 (包括但不限于 Python 官方文档, Microsoft Learn 中对 Windows 操作系统及其相关组建的解释说明) 中的设计以及使用方法为准, 不盲目轻信权威&lt;/li&gt;
&lt;li&gt;当学生出现合理质疑或疑问时, 不敷衍不避讳, 实事求是探寻背后原理与实际设计, 并将尽可能正确的, 符合 1. 的答案授课于学生&lt;/li&gt;
&lt;li&gt;先前存在问题的, 应当在恰当的时机, 不吝啬无差别地向学生或其他被授课主体详细描述, 做到敢于面对与指出错误, 敢于修正错误&lt;/li&gt;
&lt;li&gt;自身储备一定的必要知识, 不做答案的讲述者揣测者, 不单纯以答案授课&lt;/li&gt;
&lt;li&gt;计算机科学是一门严谨的学科, 要以对待数学般对待计算机科学中的任何问题, 设计和使用方法, 尊重计算机科学, 敢于质疑计算机科学; 将事实上正确的知识授课于学生, 不让学生云里雾里, 不让学生学错误的知识&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;20251029 (UTC+8)&lt;/h2&gt;
&lt;p&gt;年纪部与本人交谈, 指出: 认可我方观点, 但仍需考虑教师的局限性, 望我方能够课后探讨差异, 并在必要时直接立即指出 (包括但不限于 课上演示的代码存在问题影响运行的)&lt;/p&gt;
&lt;p&gt;我方期望学校履行承诺, 长期支持正确知识传播, 达成互助共赢&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复玩 MC 时 Linux 系统卡死</title><link>https://aka.lovemilk.top/notes/posts/apps/minecraft/fix-archlinux-freezed-when-playing-mc/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/minecraft/fix-archlinux-freezed-when-playing-mc/</guid><pubDate>Sun, 19 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 ArchLinux 内核版本 &amp;gt; (不含) &lt;code&gt;6.16.7&lt;/code&gt;[^why-6-16-7] 时, 使用模组 &lt;em&gt;spark&lt;/em&gt; 会导致系统, SSH 连接, 网路连接卡死, ICMP 正常回复.&lt;/p&gt;
&lt;h2&gt;解决方法&lt;/h2&gt;
&lt;p&gt;卸载该模组, 若确有需要的, 请留意 &lt;a href=&quot;https://github.com/lucko/spark/issues/530&quot;&gt;ISSUE 与 修复进展&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[^why-6-16-7]: &lt;a href=&quot;https://github.com/lucko/spark/issues/530#issuecomment-3368314370&quot;&gt;&lt;em&gt;what i have worked out is that arch linux-6.16.7-arch1 is the last version its working on&lt;/em&gt; | [Linux] Entire system freezes whilst attempting world generation with Forge 47.4.0 · Issue #530 · lucko/spark | GitHub&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 Linux 无法进入 DE 问题</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/cannot-enter-de/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/cannot-enter-de/</guid><pubDate>Sun, 19 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在我尝试按照 &lt;a href=&quot;https://arch.icekylin.online/guide/rookie/graphic-driver.html#%E5%8F%8C%E6%98%BE%E5%8D%A1-%E9%9B%86%E6%98%BE-%E7%8B%AC%E6%98%BE&quot;&gt;archlinux 显卡驱动 | archlinux 简明指南&lt;/a&gt; 安装 &lt;em&gt;optimus&lt;/em&gt; 后, 无法进入 KDE 主界面, &lt;em&gt;plasmashell&lt;/em&gt; coredump&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;经过一些列 debug, 最终我还是尝试使用 &lt;em&gt;timeshift&lt;/em&gt; 回滚系统. 之后, 由于我没有第一时间找到是 &lt;em&gt;optimus&lt;/em&gt; 的问题, 我仍然安装了它, 但是发现复现的上述问题, 便尝试卸载它&lt;/p&gt;
&lt;h2&gt;解决方法&lt;/h2&gt;
&lt;p&gt;卸载 &lt;em&gt;optimus&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;yay -Qo&lt;/code&gt; 查找到 &lt;em&gt;optimus&lt;/em&gt; 的实际包名&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
这是个小坑, AUR 的 &lt;em&gt;optimus-manager-git&lt;/em&gt; 安装生成的包名不是 &lt;em&gt;optimus-manager-git&lt;/em&gt;, 而是类似于 &lt;code&gt;optimus-manager.python-xxxx&lt;/code&gt; 什么的, 导致我没有成功卸载卡了好久&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;yay -Qo /etc/modprobe.d/optimus-manager.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;清除 Xorg 配置文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo optimus-manager --cleanu
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;卸载 &lt;em&gt;optimus&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;yay -R optimus-manager-qt &amp;lt;real-package-name-of-optimus-manager&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;重新生成 initfs&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo mkinitcpio -P
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;重启&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo reboot
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Telegram Core Dump 解决</title><link>https://aka.lovemilk.top/notes/posts/apps/telegram/core-dump-by-ime/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/telegram/core-dump-by-ime/</guid><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 ArchLinux 上使用 fcitx5 输入法时造成 Telegram Core Dump, 修改环境变量可以解决&lt;/p&gt;
&lt;p&gt;在 Telegram 的 shortcut 的环境变量上加入如下内容即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;QT_IM_MODULE=
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Core Dump Stack&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Thread debugging using libthread_db enabled]
Using host libthread_db library &quot;/usr/lib/libthread_db.so.1&quot;.
Core was generated by `/usr/bin/Telegram&apos;.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007fd08f1c5c8e in QObject::deleteLater() () from /usr/lib/libQt6Core.so.6
[Current thread is 1 (Thread 0x7fd07cb6b0c0 (LWP 57704))]
(gdb) 
(gdb) bt
#0  0x00007fd08f1c5c8e in QObject::deleteLater() () at /usr/lib/libQt6Core.so.6
#1  0x00007fd091798419 in QWidgetTextControl::inputMethodQuery(Qt::InputMethodQuery, QVariant) const ()
    at /usr/lib/libQt6Widgets.so.6
#2  0x00007fd09176ed78 in QTextEdit::inputMethodQuery(Qt::InputMethodQuery, QVariant) const ()
    at /usr/lib/libQt6Widgets.so.6
#3  0x00007fd09176f3f0 in QTextEdit::inputMethodQuery(Qt::InputMethodQuery) const ()
    at /usr/lib/libQt6Widgets.so.6
#4  0x00007fd09155d306 in QWidget::event(QEvent*) () at /usr/lib/libQt6Widgets.so.6
#5  0x00007fd0915cc576 in QFrame::event(QEvent*) () at /usr/lib/libQt6Widgets.so.6
#6  0x00007fd0915020a0 in QApplicationPrivate::notify_helper(QObject*, QEvent*) ()
    at /usr/lib/libQt6Widgets.so.6
#7  0x0000555db3aaac96 in ??? ()
#8  0x00007fd08f16a6c8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) ()
    at /usr/lib/libQt6Core.so.6
#9  0x00007fd07bb7a8cb in ??? ()
    at /usr/lib/qt6/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so
#10 0x00007fd0901be0f4 in QInputMethod::update(QFlags&amp;lt;Qt::InputMethodQuery&amp;gt;) () at /usr/lib/libQt6Gui.so.6
#11 0x00007fd08f1d716f in ??? () at /usr/lib/libQt6Core.so.6
#12 0x00007fd0917aaee7 in QWidgetTextControl::qt_metacall(QMetaObject::Call, int, void**) ()
    at /usr/lib/libQt6Widgets.so.6
#13 0x00007fd08f1d760b in ??? () at /usr/lib/libQt6Core.so.6
#14 0x00007fd0904d7564 in QTextDocumentPrivate::finishEdit() () at /usr/lib/libQt6Gui.so.6
#15 0x0000555db58222c6 in ??? ()
#16 0x0000555db4505ce2 in ??? ()
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>在 ArchLinux 上使用 Gwenview 打开 HEIF 图片</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/kde/heif-image-view/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/kde/heif-image-view/</guid><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;高效率图像文件格式（英语：High Efficiency Image File Format， HEIF，也称高效图像文件格式[1]），是一个用于单张图像或图像序列的文件格式。它由动态影像专家小组（MPEG）开发，并在MPEG-H Part 12（ISO/IEC 23008-12）中定义。&lt;a href=&quot;https://zh.wikipedia.org/zh-cn/HEIF&quot;&gt;^wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;安装所需依赖&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://bugs.archlinux.org/task/74754&quot;&gt;https://bugs.archlinux.org/task/74754&lt;/a&gt;&lt;br /&gt;
打开 HEIF 图片需要 &lt;code&gt;kimageformats&lt;/code&gt; 及其依赖 &lt;code&gt;libheif&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S kimageformats libheif
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>在 ArchLinux 上使用 PolicyKit 的超级用户请求弹窗运行自定义内容</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/kde/run-as-root-with-dialog/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/kde/run-as-root-with-dialog/</guid><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;pkexec &amp;lt;...script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>关于 ColorOS 默认软件包安装程序与解除其锁定</title><link>https://aka.lovemilk.top/notes/posts/apps/android/color-os-fix-package-installer/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/android/color-os-fix-package-installer/</guid><description>修复 ColorOS 锁定默认软件包安装程序, 无法切换为其他软件包安装程序</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;原由&lt;/h2&gt;
&lt;p&gt;近些日子我购入了 OnePlus Ace 5 Ultra, 并进行了 Root 环境配置&lt;/p&gt;
&lt;p&gt;当我尝试使用第三方软件包安装程序时, 第三方的锁定为默认安装器功能无效, 会被立刻重置, 我尝试使用 Thanox 的 &lt;code&gt;pm disable&lt;/code&gt; 冻结方案禁用了系统的软件包安装程序, 造成系统卡开机动画无限重启&lt;/p&gt;
&lt;p&gt;在经历了无数次尝试&lt;s&gt;与数据丢失&lt;/s&gt;后, 我找到了这期视频
&lt;a href=&quot;https://www.bilibili.com/video/BV1p7MUzyE7v/&quot;&gt;一加用户还有colorOs用户用不了installerX应用替换安装器和爱玩机应用安装器的解决方法如下，操作非常简单 省流:后面才是重点_哔哩哔哩_bilibili&apos;&lt;/a&gt;
并在类似评论区找到了卡开开机动画的原因:
&lt;img src=&quot;./images/color-os-fix-package-installer/reason-of-auto-reboot.png&quot; alt=&quot;reason-of-auto-reboot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;故记录了本文章, 以便大家&lt;s&gt;与未来的我&lt;/s&gt;参阅&lt;/p&gt;
&lt;h2&gt;解决方法&lt;/h2&gt;
&lt;p&gt;对于 ColorOS, 禁止以 &lt;code&gt;pm disable-user&lt;/code&gt; / &lt;code&gt;pm disable&lt;/code&gt; 的方式禁用系统软件 (特别是软件包安装程序), 要解除默认软件包安装程序的锁定, 请下载选择对应 Android 版本的 &lt;code&gt;兼容性测试套件 (CTS)&lt;/code&gt;, 并安装 &lt;a href=&quot;https://source.android.google.cn/docs/compatibility/cts/downloads&quot;&gt;&lt;code&gt;CrossProfileTestApp.apk&lt;/code&gt; (大陆应该可以直连)&lt;/a&gt;, 打开并单击应用内的 &lt;code&gt;Open Settings&lt;/code&gt; 按钮后, 你的第三方安装器锁定为默认应该就可以工作了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
在评论区的一些用户反馈安装该软件后会导致系统设置内的部分界面回(退)到 Android 类原生样式或发生错位等问题, 请自行酌情考量, 或在尝试后卸载并清除副作用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;要卸载并清除副作用, 请卸载该软件即可 (若无效, 请在卸载后重启系统)&lt;/p&gt;
&lt;h2&gt;故障排除&lt;/h2&gt;
&lt;p&gt;如果您已经发生了 系统卡开机动画无限重启, 请尝试在开机动画时快速三击 音量+ 按键, 进入安全模式后重启&lt;/p&gt;
&lt;p&gt;貌似进入安全模式会重置和修复一部分的系统软件及其权限, 这就是为什么能够修好系统&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;最后, 感谢 Google 的大手要求安卓合规必须要过 &lt;a href=&quot;https://source.android.google.cn/docs/compatibility/cts&quot;&gt;CTS&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>对于 BGI 引擎 GalGame 的配置修复和配置文件存储位置的探寻</title><link>https://aka.lovemilk.top/notes/posts/apps/galgame/path-of-galgame-stored-config/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/galgame/path-of-galgame-stored-config/</guid><pubDate>Sat, 13 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;起因是我在玩 *シークレットラブ（仮）*的时候遇到了无法启动的问题, 后确保游戏路径没有非 ASCII 字符后, 出现了日文原版可以启动, 汉化版弹窗报错的问题&lt;/p&gt;
&lt;h2&gt;问题&lt;/h2&gt;
&lt;p&gt;启动日文原版正常, 而启动汉化版显示无法加载字体&lt;/p&gt;
&lt;h2&gt;解决方法&lt;/h2&gt;
&lt;p&gt;可以启动日文原版, 并将字体改为你的 Wine/Proton (或者 &lt;code&gt;C:\Windows\Fonts&lt;/code&gt;) 中有的字体 (除 MS Gothic 外, 它的 fallback 字体是日文版 Windows 独有的 MS Gothic, 我的 Proton 里没有), 然后再启动汉化版&lt;/p&gt;
&lt;p&gt;如果进行上述操作后单击 &lt;code&gt;save&lt;/code&gt; 或者 &lt;code&gt;load&lt;/code&gt; 按钮进入保存/加载界面出现同样的崩溃问题, 请尝试在 Wine/Proton 的 winetricks 上安装 &lt;code&gt;corefonts&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;配置文件存储位置&lt;/h2&gt;
&lt;p&gt;我为了 debug 尝试在 &lt;code&gt;AppData&lt;/code&gt; 和 &lt;code&gt;文档&lt;/code&gt;, 游戏根目录下找了好久, 还是没有发现游戏把配置文件存在哪里惹, 通过一番 &lt;code&gt;strace -e open,openat -f -o &amp;lt;output-log-file&amp;gt; &amp;lt;command&amp;gt;&lt;/code&gt; 之后, 发现改游戏会在退出时候写入游戏根目录下的 &lt;code&gt;BGI.gdb&lt;/code&gt;, 并且删除该文件后无法启动, 将原始的该文件替换后发现配置重置&lt;/p&gt;
&lt;p&gt;同时, 我还在 Steam 上看到这篇帖子 &lt;a href=&quot;https://steamcommunity.com/app/658620/discussions/0/1474221865189120389/&quot;&gt;Question about save files... - Wonderful Everyday Down the Rabbit-Hole&lt;/a&gt;, 大概笃定了这个游戏引擎的配置默认会保存在 &lt;code&gt;BGI.gdb&lt;/code&gt; 里面, 并且这个文件的前几个直接的 ASCII 是 &lt;code&gt;SDC FORMAT 1.00&lt;/code&gt; (&lt;code&gt;53 44 43 20 46 4F 52 4D 41 54 20 31 2E 30 30 00&lt;/code&gt;), 查到是 &lt;code&gt;Buriko General Interface&lt;/code&gt; 引擎的存储文件&lt;/p&gt;
&lt;p&gt;那么以后看到 &lt;code&gt;BGI.gdb&lt;/code&gt; 一般来说就是 BGI 引擎写的游戏, 并且这个是配置文件了 &lt;br /&gt;
&lt;s&gt;所以这玩意和 &lt;code&gt;GNU Debugger&lt;/code&gt; 有什么关系 (&lt;/s&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>在 Archlinux 上对 Discord 自动使用 Vencord 修补</title><link>https://aka.lovemilk.top/notes/posts/apps/discord/auto-patch-vencord/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/discord/auto-patch-vencord/</guid><pubDate>Fri, 12 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
本文章内容已无效&lt;/p&gt;
&lt;p&gt;由于 Pacman Hook 目前使用不同的 Namespace, 导致在 Hook 内无法访问非 &lt;code&gt;lo&lt;/code&gt; 网卡以连接网路, 且无法获取到运行 &lt;code&gt;pacman&lt;/code&gt; 的用户 (始终为 &lt;code&gt;root&lt;/code&gt;), 导致不满足 VencordInstaller 对 user env 运行的需求, 从而无法安装&lt;/p&gt;
&lt;p&gt;如有需要, 可以将 &lt;code&gt;/path/to/your/script.sh&lt;/code&gt; 加入 alias 例如 &lt;code&gt;alias install-vencord=&apos;sh /usr/local/bin/vencord.sh&apos;&lt;/code&gt; 以简化手动安装流程&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 Archlinux 上使用包管理器 (Pacman) 安装/更新 Discord 时, 会导致 Vencord 的修补失效, 需要每次更新后手动修补, &lt;s&gt;这是十分不健康的行为&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;为自动化上述行为, 我们需要用到 Pacman 的 hook&lt;/p&gt;
&lt;h2&gt;使用 hook&lt;/h2&gt;
&lt;p&gt;hook 是一个位于 &lt;code&gt;/etc/pacman.d/hooks/&lt;/code&gt; 的 &lt;code&gt;.hook&lt;/code&gt; 配置文件, 通过得当配置, 我们可以在对包进行操作的任意阶段运行自定义脚本&lt;/p&gt;
&lt;p&gt;要实现 Discord 的 Vencord 自动修补, 请遵循如下步骤&lt;/p&gt;
&lt;h2&gt;创建并写入 hook 文件&lt;/h2&gt;
&lt;p&gt;创建一个任意名称的 &lt;code&gt;.hook&lt;/code&gt; (以 &lt;code&gt;discord.hook&lt;/code&gt; 为例) 位于 &lt;code&gt;/etc/pacman.d/hooks/&lt;/code&gt;, 写入如下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 触发器
[Trigger]
# 在安装时
Operation = Install
# 在更新时
Operation = Upgrade
# 触发器目标类型为 包
Type = Package
# 指定包为 `discord`
Target = discord

# 执行的操作
[Action]
# 任意内容的简介
Description = Auto patch discord with Vencord
# 在上述操作 (安装/更新) 完整后运行
When = PostTransaction
# 运行的命令 (运行指定脚本, 脚本路径须要和下步的路径相同)
Exec = /usr/bin/env sh -c &apos;sh -c &quot;/path/to/your/script.sh&quot;&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;创建并写入安装脚本&lt;/h2&gt;
&lt;p&gt;在任意目录下 (以 &lt;code&gt;/path/to/your/script.sh&lt;/code&gt; 为例, 保证有权限, 由于 hook 是以 root 用户运行的, 其实没有那么大讲究) 创建如下脚本&lt;/p&gt;
&lt;p&gt;:::note
如下脚本改造自 &lt;a href=&quot;https://raw.githubusercontent.com/Vendicated/VencordInstaller/main/install.sh&quot;&gt;Vencord 官方 Linux 安装脚本&lt;/a&gt;
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env sh
set -e

# 定义传递给 Vencord 安装器的参数, 以静默自动安装
installer_args=&quot;-install -branch=auto&quot;
download_url=&quot;https://github.com/Vendicated/VencordInstaller/releases/latest/download/VencordInstallerCli-Linux&quot;

if grep -q &quot;CHROMEOS_RELEASE_NAME&quot; /etc/lsb-release 2&amp;gt;/dev/null; then
	echo &quot;ChromeOS is not supported! Use the chrome extension. https://chromewebstore.google.com/detail/vencord-web/cbghhgpcnddeihccjmnadmkaejncjndb&quot;
	exit 1
fi


outfile=$(mktemp -t vencord-installer-XXXXXX)
trap &apos;rm -f &quot;$outfile&quot;&apos; EXIT

echo &quot;Downloading Installer...&quot;

set -- &quot;XDG_CONFIG_HOME=$XDG_CONFIG_HOME&quot;

# 下载安装器至临时路径
if command -v aria2c &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
  threads=${VENCORD_PATCH_DLTHREAD:-16}
  echo &quot;Using aria2 to download. You can set VENCORD_PATCH_DLTHREAD=&amp;lt;num&amp;gt; to change download threads.&quot;
  aria2c -x &quot;$threads&quot; -s &quot;$threads&quot; --min-split-size=1M --allow-overwrite=true -o &quot;$(basename &quot;$outfile&quot;)&quot; -d &quot;$(dirname &quot;$outfile&quot;)&quot; &quot;$download_url&quot;
  
elif command -v wget &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
  echo &quot;Using wget to download. Installing aria2 can speed up downloading.&quot;
  wget -O &quot;$outfile&quot; &quot;$download_url&quot;
  
elif command -v curl &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
  echo &quot;Using curl to download. wget supports auto-retry, and installing aria2 is recommended for faster speeds.&quot;
  curl -sS &quot;$download_url&quot; --output &quot;$outfile&quot; --location --fail

else
  echo &quot;Neither aria2, wget nor curl were found. Please install one of them to proceed.&quot;
  exit 1
fi

chmod +x &quot;$outfile&quot;

# 运行安装器
if [ &quot;$(id -u)&quot; -eq 0 ]; then
    env &quot;$@&quot; &quot;$outfile&quot; $installer_args
elif command -v sudo &amp;gt;/dev/null; then
  echo &quot;Running with sudo&quot;
  sudo env &quot;$@&quot; &quot;$outfile&quot; $installer_args
elif command -v doas &amp;gt;/dev/null; then
  echo &quot;Running with doas&quot;
  doas env &quot;$@&quot; &quot;$outfile&quot; $installer_args
elif command -v run0 &amp;gt;/dev/null; then
  echo &quot;Running with run0&quot; 
  run0 env &quot;$@&quot; &quot;$outfile&quot; $installer_args
elif command -v pkexec &amp;gt;/dev/null; then
  echo &quot;Running with pkexec&quot;
  pkexec env &quot;$@&quot; &quot;SUDO_USER=$(whoami)&quot; &quot;$outfile&quot; $installer_args
else
  echo &quot;Neither sudo nor doas were found. Please install either of them to proceed.&quot;
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;完成&lt;/h2&gt;
&lt;p&gt;此后, 在您每次安装/更新 Discord 时, 会自动运行上述脚本, 以自动使用 Vencord 修补&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
新版本的 Discord 安装路径从 &lt;code&gt;/opt/discord&lt;/code&gt; 移至 &lt;code&gt;$HOME/.config/discord&lt;/code&gt; 了, 如果您的 &lt;code&gt;/opt/discord&lt;/code&gt; 下只有一个 &lt;code&gt;resources&lt;/code&gt; 文件夹, 那么请删除 &lt;code&gt;/opt/discord&lt;/code&gt; 以免 Vencord 误认安装路径导致自动修补失败&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo rm -r /opt/discord
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>License - All Rights Reserved</title><link>https://aka.lovemilk.top/68</link><guid isPermaLink="true">https://aka.lovemilk.top/68</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;All Rights Reserved&lt;/p&gt;
&lt;p&gt;Copyright (c) Lovemilk&lt;/p&gt;
&lt;p&gt;All rights reserved. This software, the code, any other thing and associated documentation files (the &quot;Software&quot;) may not be used, copied, modified, merged, published, distributed, sublicensed, and/or sold without prior written permission from the copyright holder.&lt;/p&gt;
&lt;p&gt;THE SOFTWARE, THE CODE OR ANY OTHER THING IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Lovemilk 关于笔记网站迁移及其部分内容存档的通知</title><link>https://aka.lovemilk.top/notes/posts/blogs/remake-notice/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/blogs/remake-notice/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;为提升用户体验, 减少文档嵌套层级, 提升网站搜索引擎的搜索性能, 降低用户的浏览门槛, 本网站决定对其进行重构迁移.&lt;/p&gt;
&lt;h2&gt;迁移收益&lt;/h2&gt;
&lt;p&gt;迁移后, 本网站将支持全局搜索功能, 并且将多层嵌套的文章改为使用 &lt;code&gt;tags&lt;/code&gt; 与 &lt;code&gt;category&lt;/code&gt; 分类的扁平化模式, 在用户层面可直接从主页跳转至某特定文章.&lt;/p&gt;
&lt;p&gt;同时, 扁平化也带来了 SEO (搜索引擎优化) 的提升, 所使用的框架可以自动生成网站地图, 提高搜索引擎评分/排名.&lt;/p&gt;
&lt;p&gt;最后, 由于底层框架的改变, 本网站新增了包括但不限于 发布日期, 文章简介 等便于识读的文章元数据显示和其他优美界面, 使得用户更能清晰易懂地浏览&lt;/p&gt;
&lt;h2&gt;迁移制约&lt;/h2&gt;
&lt;p&gt;受到旧框架文件编写差异和迁移成本的制约, 本网站迁移后可能有部分链接失效, 可尝试删除 URL 中的 &lt;code&gt;.md&lt;/code&gt; 和在 URL 路径部分最后加上 &lt;code&gt;/&lt;/code&gt; 解决, 带来的不便敬请谅解&lt;/p&gt;
&lt;p&gt;同时, 原站点的 &quot;编程笔记&quot; 部分, 应迁移时间成本高, 难度稍大等的问题, 暂已停止提供. 但是, 您仍可以在我们的的 GitHub 仓库看到原始的 Markdown 文件 (&lt;a href=&quot;https://aka.lovemilk.top/github/notes/tree/main/archive/programming&quot;&gt;参阅此处&lt;/a&gt;), 感谢您的理解&lt;/p&gt;
&lt;h2&gt;署名&lt;/h2&gt;
&lt;p&gt;lovemilk&lt;br /&gt;
2025-09-10T12:07:09.675Z&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>作文主页 (介绍页)</title><link>https://aka.lovemilk.top/notes/posts/passages/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/passages/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;命名方式&lt;/h2&gt;
&lt;p&gt;规范的命名 可在便于管理同时 将尽可能多的信息传递予用户, 以便加速对本项目的了解, 提升项目易用性, 可读性.&lt;/p&gt;
&lt;p&gt;一般的, 命名遵循以下规则:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;前 8 个字符为 UTC+8 时区 &lt;code&gt;yyyymmdd&lt;/code&gt; 格式的创建/立项时间 (而非最后修改时间)&lt;/li&gt;
&lt;li&gt;以 &lt;code&gt;_&lt;/code&gt; 分割日期和内容 (该字符以下简称 &lt;code&gt;分割符&lt;/code&gt;), 后者为内容. 例: &lt;code&gt;20240309_Jonurney&lt;/code&gt; 的内容部分为 &lt;code&gt;Jonurney&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;内容为此周记的主题 (为确保 URL 编解码正常, 推荐仅使用 ASCII 字符). 例: 以 &lt;code&gt;旅途&lt;/code&gt; 为主题的作文, 命名为 &lt;code&gt;20240309_Jonurney&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果有多个 分割符字符, 以索引值最小 (即最接近开头的, 在 从左至右阅读 的文本中, 即为 最左侧) 的分割符作为分割符.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>使用 Termux 中的 fish shell 连接远程 fish shell 时显示 `5u` 等奇怪字符</title><link>https://aka.lovemilk.top/notes/posts/apps/android/termux-fish-5u/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/android/termux-fish-5u/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://fishshell.com/blog/new-in-40&quot;&gt;https://fishshell.com/blog/new-in-40&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在本地和远程的 fish 执行如下指令以禁用不支持的协议&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set -Ua fish_features no-keyboard-protocols
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 Android 系统蓝牙耳机音量大小问题</title><link>https://aka.lovemilk.top/notes/posts/apps/android/fix-earphone-volume/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/android/fix-earphone-volume/</guid><description>解决Android 系统蓝牙耳机音量已最小时仍过大</description><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;解决方法 01&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;方法来着 &lt;a href=&quot;https://www.bilibili.com/video/BV1fU4y1u77y&quot;&gt;BV1fU4y1u77y |【问题已解决】已经把音量调到最小一格，蓝牙耳机的声音对我来说还是太大&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1. 打开开发者选项&lt;/h3&gt;
&lt;p&gt;打开 &quot;设置 &amp;gt; 关于本机(或类似选项)&quot; 多次单击 &quot;系统版本号&quot;, &quot;Build 号&quot; 或类似内容, 直至显示已开启开发者选项.&lt;/p&gt;
&lt;h3&gt;2. 开启 &quot;开发者选项 &amp;gt; 停用绝对音量功能&quot;&lt;/h3&gt;
&lt;p&gt;打开 &quot;开发者选项 &amp;gt; 停用绝对音量功能&quot; 后, 重启手机&lt;/p&gt;
&lt;h2&gt;解决方法 02&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;自己实践得出&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;将蓝牙设备类型修改为 &quot;耳机&quot;&lt;/h3&gt;
&lt;p&gt;打开 &quot;设置 &amp;gt; 已连接的设备(或类似选项) &amp;gt; 蓝牙&quot; 单击 你的耳机 右侧小齿轮图标, 修改设备详细信息, 将音频设备类型修改为 &quot;耳机&quot;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Discord 语音配置</title><link>https://aka.lovemilk.top/notes/posts/apps/discord/voice-chat/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/discord/voice-chat/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;为避免接受的音频发出类似电流声, 需要在 &lt;code&gt;Discord&lt;/code&gt; 设置中更改如下&lt;/p&gt;
&lt;h2&gt;修改 &lt;code&gt;APP设置 &amp;gt; 语音和视频 &amp;gt; 高级设置&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h3&gt;&lt;code&gt;视频编解码器&lt;/code&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;关闭 &lt;code&gt;OpenH264 Video Codec 由 CiscoSystems, Inc. 提供&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;关闭 &lt;code&gt;硬件加速&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;&lt;code&gt;服务质量&lt;/code&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;开启 &lt;code&gt;开启服务品质（QoS）数据包最高优先权&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Caddy | 处理端口位于域名中的反向代理</title><link>https://aka.lovemilk.top/notes/posts/apps/caddy/port-in-domain-proxy/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/caddy/port-in-domain-proxy/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;解决&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;*.your.domain.com {
    @subdomain {
        header_regexp Host ^(?P&amp;lt;port&amp;gt;\d+)\.your\.domain\.com(?::\d+)?$
    }
    
    handle @subdomain {
        reverse_proxy &amp;lt;target-ip&amp;gt;:{http.regexp.port}
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::warning
Code Server 会自动处理 Host 为 &lt;code&gt;&amp;lt;port&amp;gt;.your.domain.com&lt;/code&gt; 的请求, 不需要手动设置路径 &lt;code&gt;/proxy/&amp;lt;port&amp;gt;&lt;/code&gt;, 直接将 &lt;code&gt;*.your.domain.com&lt;/code&gt; 反代至 Code Server 的主页面的端口即可&lt;br /&gt;
:::&lt;/p&gt;
&lt;p&gt;:::caution
使用 Code Server 自带的反代的 CPU 使用率会很高, 特别是在 J1800 等低端设备上
:::&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Caddy | 替换响应内容</title><link>https://aka.lovemilk.top/notes/posts/apps/caddy/replace-repsonse-content/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/caddy/replace-repsonse-content/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;在诸如 &lt;code&gt;reverse_proxy&lt;/code&gt; 中替换相应内容&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;参见: &lt;a href=&quot;https://github.com/sjtug/caddy2-filter&quot;&gt;https://github.com/sjtug/caddy2-filter&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Docker commit 简单使用</title><link>https://aka.lovemilk.top/notes/posts/apps/docker/docker-commit/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/docker/docker-commit/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;该命令用于提交现有 container 为镜像, 以便更好的复用和保存数据&lt;br /&gt;
&lt;a href=&quot;https://docs.docker.com/reference/cli/docker/container/commit&quot;&gt;https://docs.docker.com/reference/cli/docker/container/commit&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Basic Usage&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker commit &amp;lt;container_id&amp;gt; &amp;lt;image_name&amp;gt; [-a &amp;lt;author&amp;gt;] [-m &amp;lt;message&amp;gt;] [-c &amp;lt;change&amp;gt;] [-p pauseContainer? (default: true)]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;若要提交为本地镜像, &lt;code&gt;image_name&lt;/code&gt; 请置为 &lt;code&gt;myImage:myTag&lt;/code&gt; 而非 &lt;code&gt;username/myImage:myTag&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;docker commit myContainer myImage:myTag
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Use local image&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Run local Docker Registry (at &lt;code&gt;localhost:5000&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker run -d -p 5000:5000 --restart=always --name registry registry:2
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Add the tag to local registry&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker tag &amp;lt;myImage&amp;gt;[:&amp;lt;myTag&amp;gt;] localhost:&amp;lt;any-port&amp;gt;/&amp;lt;any-name&amp;gt;[:&amp;lt;any-tag&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Your image name: &lt;code&gt;localhost:5000/&amp;lt;any-name&amp;gt;[:&amp;lt;any-tag&amp;gt;]&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;See Also&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/reference/compose-file/services/#pull_policy&quot;&gt;https://docs.docker.com/reference/compose-file/services/#pull_policy&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;# 从不拉取，如果本地不存在则报错
pull_policy: never
# -----------------------------
# 始终都会拉取
pull_policy: always
# 本地不存在时拉取
pull_policy: missing
# 如果已存在，重构镜像
pull_policy: build
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Koishi Context 一些魔术技巧 (不保证稳定性)</title><link>https://aka.lovemilk.top/notes/posts/apps/koishi/ctx/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/koishi/ctx/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;感谢 &lt;a href=&quot;https://github.com/CyanChanges&quot;&gt;CyanChanges&lt;/a&gt; 对 Koishi 源码解读的大力支持&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;获取插件所有 &lt;code&gt;ident&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ident&lt;/code&gt; 是插件在配置文件中的 ID (见 &lt;code&gt;koishi.yml&lt;/code&gt;) &amp;lt;br&amp;gt;
注意: 需要在 &lt;code&gt;apply&lt;/code&gt; 函数运行完成之后调用, 否则始终返回空数组&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/**
 * @return string[]
 */
ctx.loader.paths(ctx.scope)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;重载插件 / 重写插件配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// 需要依赖 loader
export const inject = [..., &apos;loader&apos;]

...

const pluginid = `${name}:${iden}`
ctx.emit(&apos;manager/reload&apos;, parent, pluginid, config?)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中, &lt;code&gt;parent&lt;/code&gt; 为父插件, &lt;code&gt;pluginid&lt;/code&gt; 为 &lt;code&gt;shortname&lt;/code&gt; + &lt;code&gt;:&lt;/code&gt; + &lt;code&gt;inden&lt;/code&gt;, &lt;code&gt;config&lt;/code&gt; 为新的配置对象&lt;/p&gt;
&lt;h2&gt;向 &lt;code&gt;Command.Action&lt;/code&gt; 的第一个参数 (&lt;code&gt;Argv&lt;/code&gt;) 注入类型&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;declare module &apos;koishi&apos; {
    interface Argv {
        // key: value-type
    }
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Git 基本使用</title><link>https://aka.lovemilk.top/notes/posts/apps/git/0-basicuseage/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/git/0-basicuseage/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;初始配置&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git config --global &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;&lt;/code&gt; 配置全局参数. 不添加 &lt;code&gt;--global&lt;/code&gt; 仅对当前仓库有效, &lt;code&gt;--system&lt;/code&gt; 对所有用户有效, 下同
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git config --global user.name &amp;lt;username&amp;gt;&lt;/code&gt; 配置用户名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git config --global user.email &amp;lt;email&amp;gt;&lt;/code&gt; 配置邮箱&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git config --global credential.helper store&lt;/code&gt; 启用保存用户名和密码, 使得无需每次输入&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git config --global --list&lt;/code&gt; 查看指定区域的配置信息, 按 &lt;code&gt;q&lt;/code&gt; 退出查看&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;新建仓库&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git init&lt;/code&gt; 在本地目录创建仓库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git init &amp;lt;name&amp;gt;&lt;/code&gt; 在当前工作目录的 &lt;code&gt;&amp;lt;name&amp;gt;/&lt;/code&gt; 目录下创建仓库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git clone &amp;lt;url&amp;gt;&lt;/code&gt; 拉取远端仓库至本地&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.git&lt;/code&gt; 目录是隐藏目录, 需要 &lt;code&gt;ls -a&lt;/code&gt; (Linux) 或 &lt;code&gt;ls -Force&lt;/code&gt; (Powershell) 显示&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;基本概念&lt;/h2&gt;
&lt;h3&gt;区域&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;介绍&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;工作区&lt;/td&gt;
&lt;td&gt;Working Directory 本地工作目录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.git&lt;/code&gt; 所在目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;暂存区&lt;/td&gt;
&lt;td&gt;Staging Area/Index 临时存储区域&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.git/index&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地仓库&lt;/td&gt;
&lt;td&gt;Local Repository Git 存储代码和版本信息的主要位置&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.git/objects&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;文件状态&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;介绍&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;未追踪&lt;/td&gt;
&lt;td&gt;Untrack / 新创建未被 Git 管理的文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;未修改&lt;/td&gt;
&lt;td&gt;Unmodified / 已被 Git 管理但内容未发生变化的文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;已修改&lt;/td&gt;
&lt;td&gt;Modified / 已被 Git 管理且内容已发生变化且未添加至暂存区的文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;已暂存&lt;/td&gt;
&lt;td&gt;Staged / 已被 Git 管理且内容已发生变化且已添加至暂存区的文件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;lt;!-- ↓ 直接把图片当作链接的 content ↓ --&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;来着 &lt;a href=&quot;https://www.bilibili.com/video/BV1HM411377j?p=4&amp;amp;t=3m30s&quot;&gt;【GeekHour】一小时Git教程@BiliBili p04-03:30
&lt;img src=&quot;./Images/GitFileStates.png&quot; alt=&quot;GitFileStates&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;分支&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;介绍&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;公有分支&lt;/td&gt;
&lt;td&gt;有 &amp;gt;= 2 个用户使用的分支&lt;/td&gt;
&lt;td&gt;不能使用非 &lt;code&gt;git revert&lt;/code&gt; 恢复修改, 否则会造成 &lt;code&gt;commit&lt;/code&gt; 缺失无法同步&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;个人分支&lt;/td&gt;
&lt;td&gt;仅有 1 个用户使用的分支&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HEAD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认指向分支的最新提交节点&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HEAD^&lt;/code&gt; 或 &lt;code&gt;HEAD~&lt;/code&gt; 表示 &lt;code&gt;HEAD&lt;/code&gt; 前第 1 个提交, &lt;code&gt;HEAD~&amp;lt;n&amp;gt;&lt;/code&gt; 表示 &lt;code&gt;HEAD&lt;/code&gt; 前第 &lt;code&gt;n&lt;/code&gt; 个提交&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;添加与提交文件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt; 查看仓库当前状态&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git status -s&lt;/code&gt; 查看仓库当前状态, 以精简内容显示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add &amp;lt;file&amp;gt;&lt;/code&gt; 将 (未追踪的) 文件添加至暂存区. 并且, 该命令支持使用通配符 (包含但不限于 &lt;code&gt;*&lt;/code&gt;) 添加 (多个) 文件; 同时, 也可以直接添加文件夹, 会直接将整个文件夹包括其所有层级子目录内的文件全部添加至暂存区&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git rm --cached &amp;lt;file&amp;gt;&lt;/code&gt; 将 (已暂存的) 文件移除暂存区&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit -m &amp;lt;message&amp;gt;&lt;/code&gt; 提交修改 (仅提交暂存区的文件). 若不指定 &lt;code&gt;-m&lt;/code&gt; 参数, 则会进入一个交互式页面, 默认使用 &lt;code&gt;vim&lt;/code&gt; 编辑提交信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git log&lt;/code&gt; 查看提交记录. 使用 &lt;code&gt;--oneline&lt;/code&gt; 参数查看简洁的提交记录, 仅显示提交的 HASH 和提交信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit -a&lt;/code&gt; 提交时添加所有文件 (类似于 &lt;code&gt;git add .&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Git 默认不会添加空文件夹至仓库, 包括空文件夹内仅含空文件夹&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;回退版本与恢复文件&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;git reset&lt;/code&gt; 回退版本&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git ls-files&lt;/code&gt; 查看暂存区内容&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git reflog&lt;/code&gt; 查看操作的历史记录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在如下命令后加 &lt;code&gt;commit&lt;/code&gt; 即可回退至指定提交&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;保留工作区&lt;/th&gt;
&lt;th&gt;保留暂存区&lt;/th&gt;
&lt;th&gt;是默认值&lt;/th&gt;
&lt;th&gt;行为备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git reset --soft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;√&lt;/td&gt;
&lt;td&gt;√&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;类似于 &quot;失忆&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git reset --hard&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;×&lt;/td&gt;
&lt;td&gt;×&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;直接强制同步为指定 &lt;code&gt;commit&lt;/code&gt; 的记录 (&lt;strong&gt;慎用&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git reset --mixed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;√&lt;/td&gt;
&lt;td&gt;×&lt;/td&gt;
&lt;td&gt;√&lt;/td&gt;
&lt;td&gt;相比 &lt;code&gt;--soft&lt;/code&gt;, 此模式需要重新 &lt;code&gt;git add&lt;/code&gt; 添加至暂存区&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;若发生 &lt;code&gt;git reset --hard&lt;/code&gt; 误操作, 可使用 &lt;code&gt;git reflog&lt;/code&gt; 找到误操作前的 &lt;code&gt;commit&lt;/code&gt; 并 &lt;code&gt;git reset --hard &amp;lt;commit&amp;gt;&lt;/code&gt; 回退即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;各方法恢复文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;感谢 &lt;a href=&quot;https://www.bilibili.com/video/BV1ne4y1S7S9&quot;&gt;十分钟学会常用git撤销操作，全面掌握git的时光机@BiliBili&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;区域&lt;/th&gt;
&lt;th&gt;介绍&lt;/th&gt;
&lt;th&gt;如何恢复至之前的状态&lt;/th&gt;
&lt;th&gt;恢复注解&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Disk&lt;/td&gt;
&lt;td&gt;本地磁盘, 直接由编辑器修改&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;git checkout &amp;lt;file&amp;gt;&lt;/code&gt; 或 &lt;code&gt;git restore &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;后者仅支持较新版本, 在如上所述情况下两者等价&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Staging&lt;/td&gt;
&lt;td&gt;Changes to be committed / 暂存区 (&lt;code&gt;add&lt;/code&gt; 或更改但未 &lt;code&gt;commit&lt;/code&gt; 的文件所在)&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;git reset &amp;lt;file&amp;gt;&lt;/code&gt; 或 &lt;code&gt;git restore --staged &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;从暂存区移除, 不改变硬盘文件更改. 后者仅支持较新版本, 在如上所述情况下两者等价&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;git checkout HEAD &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;同时重置硬盘更改和暂存区更改 (&lt;code&gt;HEAD&lt;/code&gt; 代表上一次的 &lt;code&gt;commit&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local&lt;/td&gt;
&lt;td&gt;本地 Git 仓库&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;git reset --soft HEAD~1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;把本地 Git 仓库状态修改为上上次 &lt;code&gt;commit&lt;/code&gt; 的状态, 不改变硬盘文件, 并将硬盘变换添加至暂存区 (&lt;code&gt;HEAD~1&lt;/code&gt; 表示上一次 &lt;code&gt;commit&lt;/code&gt; 前 &lt;code&gt;1&lt;/code&gt; 次的 &lt;code&gt;commit&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;git reset HEAD~1&lt;/code&gt; 或 &lt;code&gt;git reset --mixed HEAD~1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;重置 &lt;code&gt;commit&lt;/code&gt; 并将文件移出暂存区, 仅保留硬盘修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;git reset --hard HEAD~1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;完整重置状态, 覆盖本地磁盘和暂存区修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;git revert HEAD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;使用 Git 生成一个 &lt;code&gt;commit&lt;/code&gt;, 使得其作用效果与 &lt;code&gt;HEAD&lt;/code&gt; 相反 (&lt;code&gt;-commit&lt;/code&gt;). 其参数为一个或多个 &lt;code&gt;commit&lt;/code&gt;, 并且可以撤销先前任意一个或多个 &lt;code&gt;commit&lt;/code&gt;, 这与上述方法不同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remote&lt;/td&gt;
&lt;td&gt;远端仓库&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;git revert HEAD&lt;/code&gt; 后 &lt;code&gt;git push&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;远端分支是一个公有分支&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;git reset --hard HEAD~1&lt;/code&gt; 后 &lt;code&gt;git push -f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;远端分支是一个个人分支 (&lt;code&gt;-f&lt;/code&gt; 表示 &lt;code&gt;force&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;差异查看&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;行为&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git diff&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;比较工作区与暂存区的差异&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git diff &amp;lt;commit&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;比较指定版本 (与当前工作区与暂存区) 的差异&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git diff --cached&lt;/code&gt; 或 &lt;code&gt;git diff --staged&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;比较暂存区和版本的差异&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git diff &amp;lt;commit_a&amp;gt; &amp;lt;commit_b&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;比较两个版本间的差异&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git diff &amp;lt;branch_a&amp;gt; &amp;lt;branch_b&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;比较两个分支间的差异&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git diff &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;比较指定文件的差异&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;某些命令可以组合使用, 例如可以使用 &lt;code&gt;git diff &amp;lt;commit_a&amp;gt; &amp;lt;commit_b&amp;gt; &amp;lt;file&amp;gt;&lt;/code&gt; 查看指定文件的指定版本间的差异&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;差异输出示例:  (&lt;code&gt;#&lt;/code&gt; 后为注解内容)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;diff --git a/test.file b/test.file  # 发生变更的文件
index 3c0eb7a..cf294a0 100644  # `index` 文件哈希 权限
--- a/test.file
+++ b/test.file
@@ -1 +1,2 @@
 test_file
+this is something new  # 修改的内容
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;删除文件&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;行为&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rm&lt;/code&gt; (Linux), &lt;code&gt;del&lt;/code&gt; (CMD) 或 &lt;code&gt;Remove-Item&lt;/code&gt; (Powershell), 后使用 &lt;code&gt;git add &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除工作区和暂存区指定文件. &lt;code&gt;git add &amp;lt;file&amp;gt;&lt;/code&gt; 同步暂存区与工作区状态, 使得文件在暂存区也被删除&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git rm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;同时删除暂存区和工作区文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git rm --cached&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;仅删除暂存区文件, 保留工作区文件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;使用 &lt;code&gt;-r&lt;/code&gt; 递归删除指定文件夹&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Git `.gitignore` 文件使用</title><link>https://aka.lovemilk.top/notes/posts/apps/git/1-gitignorefile/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/git/1-gitignorefile/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;过滤指定文件&lt;/h2&gt;
&lt;p&gt;直接将指定文件名写入 &lt;code&gt;.gitignore&lt;/code&gt; 文件中&lt;/p&gt;
&lt;p&gt;例如, 要过滤 &lt;code&gt;a.txt&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt; 目录:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 下面这两行在只有根目录时是等价的
# `/a.txt` 代表仅过滤根目录下 `a.txt`
# 而前者表示任意目录的 `a.txt`
# 目录同理
a.txt
/a.txt

b/
/b/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或使用通配符 &lt;code&gt;*&lt;/code&gt; 过滤文件&lt;/p&gt;
&lt;p&gt;例如, 要过滤 &lt;code&gt;.log&lt;/code&gt; 文件:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.log
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意: &lt;code&gt;.gitignore&lt;/code&gt; 不会对已被添加至 Git 的文件生效, 如需该文件忽略, 请先&lt;a href=&quot;./0-BasicUseage/#%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6&quot;&gt;删除文件&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;code&gt;.gitignore&lt;/code&gt; 规则概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;以 &lt;code&gt;#&lt;/code&gt; 开头内容为注释&lt;/li&gt;
&lt;li&gt;使用标准的 &lt;code&gt;Blob&lt;/code&gt; 匹配:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;*&lt;/code&gt; 通配任意字符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;?&lt;/code&gt; 通配单个字符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[&amp;lt;chars&amp;gt;]&lt;/code&gt; 匹配 &lt;code&gt;chars&lt;/code&gt; 中任意一个字符 (类似于正则表达式的 &lt;code&gt;[&amp;lt;chars&amp;gt;]&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;**&lt;/code&gt; 匹配任意 (多层) 目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[&amp;lt;char_start&amp;gt;-&amp;lt;char-end&amp;gt;]&lt;/code&gt; 可以匹配字符范围, 例如 &lt;code&gt;[a-z]&lt;/code&gt; 匹配所有小写字母 (类似于正则表达式的 &lt;code&gt;[&amp;lt;char_start&amp;gt;-&amp;lt;char-end&amp;gt;]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!&lt;/code&gt; 取反规则&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt; 开头仅匹配根目录下 文件 (架), 不以 &lt;code&gt;/&lt;/code&gt; 开头匹配任意文件夹下的名称符合规则的 文件 (夹)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;获取更为详细的规则, 请参阅&lt;a href=&quot;https://git-scm.com/docs/gitignore&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 (主要在 OpenWRT 上) Docker 网桥无法正常工作</title><link>https://aka.lovemilk.top/notes/posts/apps/docker/fix-network-bridge/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/docker/fix-network-bridge/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;运行如下命令, 将网桥的流量绕过 &lt;code&gt;iptables&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo sysctl -w net.bridge.bridge-nf-call-iptables=0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启容器后发现 Docker 流量正常&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Git 远程仓库</title><link>https://aka.lovemilk.top/notes/posts/apps/git/2-remoterepo/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/git/2-remoterepo/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;SSH 配置&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh-keygen -t rsa -b 4096&lt;/code&gt; 在 &lt;code&gt;~/.ssh&lt;/code&gt; 下生成基于 RSA 4096 位 的 SSH 公私钥&lt;br /&gt;
无扩展名的文件即为私钥, 切勿泄露该文件. 以 &lt;code&gt;.pub&lt;/code&gt; 结尾的文件为公钥, 需要复制其内容并添加至您的远程 Git 服务提供商 (包括但不限于 GitHub) 的 SSH Keys (或类似选项)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;远程与本地&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt; 用于将远程仓库的修改应用至本地仓库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt; 用于将本地仓库的修改应用至远程仓库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git clone &amp;lt;url&amp;gt;&lt;/code&gt; 将远程仓库 &lt;code&gt;clone&lt;/code&gt; 至本地&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;本地仓库与远程仓库是两个独立的 Git Repo, 两者不会互相影响&lt;br /&gt;
来自 &lt;a href=&quot;https://www.bilibili.com/video/BV1HM411377j?p=11&amp;amp;t=8m50s&quot;&gt;【GeekHour】一小时Git教程@BiliBili p11 08:50
&lt;img src=&quot;./Images/SyncGitRepo.png&quot; alt=&quot;SyncGitRepo.png&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;关联仓库&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git remote add &amp;lt;shortname&amp;gt; &amp;lt;url&amp;gt;&lt;/code&gt; 添加远程仓库 (对于只有一个远程仓库的仓库, &lt;code&gt;shortname&lt;/code&gt; 一般习惯为 &lt;code&gt;origin&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git remote -v&lt;/code&gt; 查看当前仓库的所有远程仓库别名 (&lt;code&gt;shortname&lt;/code&gt;) 和 URL&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git branch -M &amp;lt;branch&amp;gt;&lt;/code&gt; 指定主分支为 &lt;code&gt;branch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push -u &amp;lt;shortname&amp;gt; &amp;lt;local_branch&amp;gt;[:&amp;lt;remote_branch&amp;gt;]&lt;/code&gt; 将本地的 &lt;code&gt;local_branch&lt;/code&gt; 分支与远程 &lt;code&gt;shortname&lt;/code&gt; 的 &lt;code&gt;remote_branch&lt;/code&gt; 分支关联, 并推送更改&lt;br /&gt;
当本地分支与远程分支相同时, 可以省略 &lt;code&gt;remote_branch&lt;/code&gt; 写做 &lt;code&gt;git push -u &amp;lt;shortname&amp;gt; &amp;lt;branch&amp;gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;-u&lt;/code&gt; 代表 upstream&lt;br /&gt;
在一般情况下, 在关联分支后, 可以直接使用 &lt;code&gt;git push&lt;/code&gt; 推送修改&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull &amp;lt;shortname&amp;gt; &amp;lt;remote_branch&amp;gt;[:&amp;lt;local_branch&amp;gt;]&lt;/code&gt; 将远程 &lt;code&gt;shortname&lt;/code&gt; 的 &lt;code&gt;remote_branch&lt;/code&gt; 分支修改拉取至本地的 &lt;code&gt;local_branch&lt;/code&gt; 分支&lt;br /&gt;
同理, 当本地分支与远程分支相同时, 可以省略  &lt;code&gt;git pull &amp;lt;shortname&amp;gt; &amp;lt;branch&amp;gt;&lt;/code&gt;&lt;br /&gt;
在一般情况下, 在关联分支后, 可以直接使用 &lt;code&gt;git pull&lt;/code&gt; 拉取修改&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git fetch&lt;/code&gt; 仅获取远程仓库内容, 不自动合并至本地仓库 (关于如何手动合并分支, 解决分支冲突, 详见分支笔记)&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Git 分支</title><link>https://aka.lovemilk.top/notes/posts/apps/git/3-branch/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/git/3-branch/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;创建与切换分支&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git branch&lt;/code&gt; 查看所有分支和当前已激活分支&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git branch &amp;lt;branch&amp;gt;&lt;/code&gt; 创建一个新分支&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout &amp;lt;branch&amp;gt;&lt;/code&gt; 切换至指定分支&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;由于 &lt;code&gt;git checkout&lt;/code&gt; 也可以用于恢复文件, 在 Git &amp;gt;= 2.23 版本, 提供了如下专用命令&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git switch &amp;lt;branch&amp;gt;&lt;/code&gt; 切换至指定分支 (Git &amp;gt;= 2.23)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;注意: 在切换分支时, 工作区文件将会按照分支的最新提交被更改&lt;br /&gt;
未追踪的文件将不会发生变化&lt;br /&gt;
若位于暂存区的更改不会与目标分支冲突, Git 将允许切换分支, 这些更改会保留在新分支的工作区中&lt;br /&gt;
否则, Git 将会会阻止分支切换&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;合并分支&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git merge &amp;lt;branch&amp;gt;&lt;/code&gt; 将 &lt;code&gt;branch&lt;/code&gt; 合并至当前分支 (&lt;strong&gt;不会&lt;/strong&gt;删除 &lt;code&gt;branch&lt;/code&gt;), 运行会自动产生一次提交,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git log --graph --oneline --decorate --all&lt;/code&gt; 查看分支图&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;删除分支&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git branch &amp;lt;flag&amp;gt; &amp;lt;branch&amp;gt;&lt;/code&gt; &lt;code&gt;flag&lt;/code&gt; 为 &lt;code&gt;-d&lt;/code&gt; 时删除已经完成合并的 &lt;code&gt;branch&lt;/code&gt;, &lt;code&gt;-D&lt;/code&gt; 时强制删除 &lt;code&gt;branch&lt;/code&gt; 无论其是否已被合并&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;分支冲突&lt;/h2&gt;
&lt;p&gt;若不同分支修改了同一文本文件的同一行 (或修改了同一二进制文件), 则会造成分支冲突&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git merge &amp;lt;branch&amp;gt;&lt;/code&gt; 自动合并失败后, 会在有冲突的文件内生成类似于如下格式的内容, 届时只要手动修改 (使用编辑器方可) 冲突内容, 后使用 &lt;code&gt;git add&lt;/code&gt; 添加该文件至暂存区, 提交即可&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; &amp;lt;current_branch&amp;gt;
edition on `current_branch`
=======
edition on `branch`
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git merge --abort&lt;/code&gt; 终止当前的合并, 回退至合并前的当前分支的状态&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;回退和 Rebase&lt;/h2&gt;
&lt;h3&gt;Rebase&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;a&lt;/code&gt; 分支上 &lt;code&gt;git rebase b&lt;/code&gt;, 会将 &lt;code&gt;a&lt;/code&gt; 分支与 &lt;code&gt;b&lt;/code&gt; 分支的首个分叉点更新的 (不含分叉点) 所有 &lt;code&gt;commit&lt;/code&gt; 变基 到 &lt;code&gt;b&lt;/code&gt; 分支的最新 &lt;code&gt;commit&lt;/code&gt; 后面&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1HM411377j?p=18&amp;amp;t=54s&quot;&gt;动画演示参见【GeekHour】一小时Git教程 p18 00:54 - 03:02&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# after
a:5
a:4
b:2
b:1
a:3
a:2
a:1

-- 在 `a` 分支执行 `git rebase b` --

# before
a:5 b:2
a:4 b:1
a:3 /
a:2
a:1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;回退&lt;/h3&gt;
&lt;p&gt;更详细的笔记参见 &lt;a href=&quot;./0-BasicUseage/#%E5%9B%9E%E9%80%80%E7%89%88%E6%9C%AC%E4%B8%8E%E6%81%A2%E5%A4%8D%E6%96%87%E4%BB%B6&quot;&gt;Git 基本使用#回退版本与恢复文件&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git checkout -b &amp;lt;branch&amp;gt; [&amp;lt;commit&amp;gt;]&lt;/code&gt; 恢复至 &lt;code&gt;branch&lt;/code&gt; 分支的 &lt;code&gt;commit&lt;/code&gt; 的状态&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>使用 CC: Tweaked 读取 机械动力 应力网路 信息</title><link>https://aka.lovemilk.top/notes/posts/apps/minecraft/cc-get-create-network/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/minecraft/cc-get-create-network/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前置模组&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://modrinth.com/mod/create&quot;&gt;Create&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://modrinth.com/mod/cc-tweaked&quot;&gt;CC: Tweaked&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(MC 1.16) &lt;a href=&quot;https://www.curseforge.com/minecraft/mc-mods/nbt-peripheral&quot;&gt;NBT Peripheral (CC Addition)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(MC 1.20 or other version which have no the no.3 mod) &lt;a href=&quot;https://modrinth.com/mod/advancedperipherals&quot;&gt;Advanced Peripherals&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;步骤&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;将 MC 原版侦测器的侦测面紧贴连接到机械动力应力网路的任意方块&lt;/li&gt;
&lt;li&gt;将 CC 的电脑置于侦测器边, 侦测器紧贴面的朝向记为 &lt;code&gt;face-to-observer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用 CC 电脑的 外设 ABI &lt;code&gt;peripheral&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;-- https://tweaked.cc/module/peripheral.html#v:wrap
local observer = peripheral.wrap(&amp;lt;face-to-observer&amp;gt;)  -- 例如 peripheral.wrap(&quot;back&quot;)

local nbt = observer.read_nbt()
local createNetwork = nbt[&apos;Network&apos;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;createNetwork&lt;/code&gt; 即为 机械动力应力网路的信息 (Table 类型)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
Advanced Peripherals 用户请不要使用上述代码, 并参阅 &lt;a href=&quot;https://docs.advanced-peripherals.de/latest/peripherals/nbt_storage/&quot;&gt;NBT Storage - Advanced Peripherals&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;通过 &lt;code&gt;createNetwork&lt;/code&gt; 变量获取具体信息即可, 如下为各 key 的意义:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;{
    Capacity: float,  -- 总应力
    Stress: float, -- 已用应力
    Id: number,  -- 网路 ID (定义未知)
    Size: int, -- 网路大小 (定义未知)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当 &lt;code&gt;Stress &amp;gt; Capacity&lt;/code&gt; 时, 应力过载&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 Minecraft 无法在 Linux 上启动的部分原因</title><link>https://aka.lovemilk.top/notes/posts/apps/minecraft/fix-cannot-start-on-linux/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/minecraft/fix-cannot-start-on-linux/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;转载自 &lt;a href=&quot;https://sourlemonjuice.github.io/posts2/2024/09/mc-nature-journey-3&quot;&gt;Minecraft 整合包《自然之旅3》在 Linux 上无法运行的解决方式 | SourLemonJuice-blog&lt;/a&gt; / &lt;a href=&quot;https://creativecommons.org/licenses/by/4.0/&quot;&gt;CC BY 4.0&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;修复&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;禁用模组 &lt;code&gt;ContingameIME&lt;/code&gt; 以及 &lt;code&gt;IMBlocker&lt;/code&gt; (Minecraft 原版用户请忽略), 该模组使用了 Windows API, 使得其无法在 Linux / macOS 上运行&lt;/li&gt;
&lt;li&gt;对于使用 &lt;code&gt;pipewire&lt;/code&gt; 作为音频处理总服务 或发现 由 &lt;code&gt;libopenal.so&lt;/code&gt; 引起无法正常启动 Minecraft 的用户, 须要在运行时配置环境变量 &lt;code&gt;ALSOFT_DRIVERS=pulse&lt;/code&gt; 并确保 JVM 可以正确识读该环境变量&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>CC BY 4.0</name><url>https://creativecommons.org/licenses/by/4.0/</url></copyright></item><item><title>在 Prism Launcher 上使用 Yggdrasil 外置登录</title><link>https://aka.lovemilk.top/notes/posts/apps/minecraft/use-yggdrasil-inside-prismlauncher/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/minecraft/use-yggdrasil-inside-prismlauncher/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;参考 &lt;a href=&quot;https://github.com/YaoerWu/mmcai_rs/blob/master/README_zh.md&quot;&gt;mmcai_rs/README_zh.md at master · YaoerWu/mmcai_rs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;步骤&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;克隆 &lt;code&gt;mmcai_rs&lt;/code&gt; 的 &lt;code&gt;YaoerWu&lt;/code&gt; fork 版本&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;由于 &lt;code&gt;mmcai_rs&lt;/code&gt; 的原版 &lt;code&gt;CatMe0w/mmcai_rs&lt;/code&gt; 尚未更新和合并 PR, 导致其实现的 Yggdrasil 规范没有更新, 造成无法登录 (无论如何显示 &lt;code&gt;Error: Wrong username or password&lt;/code&gt;), 所以必须使用这个 fork 版本 (或者你也可以等作者合并 PR?)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;git clone git@github.com:YaoerWu/mmcai_rs.git

cd mmcai_rs
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;构建可执行文件&lt;br /&gt;
关于如何安装 rust 编译环境 (cargo), 请参阅 &lt;a href=&quot;https://www.rust-lang.org/learn/get-started&quot;&gt;Getting started - Rust Programming Language&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cargo build --release
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建成功后, 可执行文件应当位于 &lt;code&gt;./target/release/mmcai_rs&lt;/code&gt; 或 &lt;code&gt;./target/release/mmcai_rs.exe&lt;/code&gt;, 将其移动至一个固定的位置 (后称 &lt;code&gt;/path/to/mmcai_rs&lt;/code&gt;)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp ./target/release/mmcai_rs /path/to/mmcai_rs
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;/path/to/mmcai_rs&lt;/code&gt; 的同级目录下放置 &lt;code&gt;authlib-injector&lt;/code&gt;&lt;br /&gt;
从 &lt;a href=&quot;https://github.com/yushijinhun/authlib-injector/releases/latest&quot;&gt;这里&lt;/a&gt; 下载最新版的 &lt;code&gt;authlib-injector-\d.\d.\d.jar&lt;/code&gt; (&lt;code&gt;\d&lt;/code&gt; 代表任意整数), 直接放置于 &lt;code&gt;/path/to/mmcai_rs&lt;/code&gt; 的同级目录, &lt;strong&gt;不要重命名文件&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑 MC 实例配置&lt;br /&gt;
打开 Prism Launcher/MultiMC编辑实例, 进入 &lt;code&gt;设置 &amp;gt; 自定义命令&lt;/code&gt;, 在 &lt;code&gt;包装器命令&lt;/code&gt; 中填入如下内容:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/path/to/mmcai_rs &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; &amp;lt;yggdrasil_api_endpoint&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中, &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; 是你的外置登录账户名, &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; 是你的外置登录密码, &lt;code&gt;&amp;lt;yggdrasil_api_endpoint&amp;gt;&lt;/code&gt; 是你的 Yggdrasil API 地址&lt;br /&gt;
:::caution
由于会提供账户和密码给该可执行文件, 本人无法确保起不会造成隐私泄露, 在使用前请再三甄别, 否则造成的后果由用户承担
:::&lt;/p&gt;
&lt;p&gt;:::tip
LittleSkin 用户的账户名 是 登录时填写的邮箱地址, 而不是角色名称&lt;/p&gt;
&lt;p&gt;填写该命令后, 启动器内设置的账户将无法应用于该实例, 如果需要使用启动器内置的账户, 请删除该配置
:::
例如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/path/to/mmcai_rs user passwd https://littleskin.cn/api/yggdrasil
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动实例方可&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>获取音频设备 (`audio-info.exe` 无法获取所有音频设备时)</title><link>https://aka.lovemilk.top/notes/posts/apps/sunshine/get-audio-devices/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/sunshine/get-audio-devices/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;问题描述&lt;/h2&gt;
&lt;p&gt;参见 &lt;a href=&quot;https://github.com/LizardByte/Sunshine/issues/1599&quot;&gt;https://github.com/LizardByte/Sunshine/issues/1599&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Get-PnpDevice -Class AudioEndpoint | Select-Object InstanceId, FriendlyName
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;必要时请以管理员身份运行 PowerShell&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 IDD 虚拟显示器 Code 31 错误</title><link>https://aka.lovemilk.top/notes/posts/apps/sunshine/fix-idd-31error/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/sunshine/fix-idd-31error/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;问题描述&lt;/h2&gt;
&lt;p&gt;在使用 Sunshine 连接到 IDD 虚拟显示器时, 回退到默认显示器, 设备管理器中显示 IDD 显示适配器出现 Code 31 错误&lt;/p&gt;
&lt;h2&gt;猜测原因&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在 Sunshine 关闭连接前强制终止了 Sunshine 使得 Windows 显示器配置与 Sunshine 认为的状态不同步&lt;/li&gt;
&lt;li&gt;Sunshine 没有以 管理员身份运行, 造成 &lt;code&gt;重置记忆显示设备组合态&lt;/code&gt; 操作无效&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;h3&gt;通过 Regedit 删除 Windows 记忆的显示器配置&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开注册表编辑器并转到路径 &lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;Configuration&lt;/code&gt; 和 &lt;code&gt;Connectivity&lt;/code&gt; 文件夹 &amp;lt;br&amp;gt;
(其实一般仅删除 &lt;code&gt;Connectivity&lt;/code&gt; 方可, 这样可以保留其他显示器配置)
:::warning
↑ 删除 &lt;code&gt;Configuration&lt;/code&gt; 文件夹会删除所有历史显示器配置
:::&lt;/li&gt;
&lt;li&gt;禁用再启用虚拟显示器&lt;/li&gt;
&lt;li&gt;必要时重启 Sunshine&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;注意&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在使用虚拟显示器下意外退出 Sunshine 会导致本问题发生&lt;/li&gt;
&lt;li&gt;对于主屏幕缩放与虚拟显示器不同的可能导致切换显示器时发生较大卡顿&lt;/li&gt;
&lt;li&gt;不建议使用禁用其他显示器的方案, 出现问题可能性较高&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>使用 Input Remapper 将 凤凰模拟器 SM600 遥控器 的轴映射为 PS5 手柄操作方式</title><link>https://aka.lovemilk.top/notes/posts/apps/input-remapper/sm600-controller/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/input-remapper/sm600-controller/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;安装 Input Remapper&lt;/h2&gt;
&lt;p&gt;见 &lt;a href=&quot;https://github.com/sezanzeb/input-remapper?tab=readme-ov-file#installation&quot;&gt;https://github.com/sezanzeb/input-remapper?tab=readme-ov-file#installation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
适用于 ArchLinux&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yay -S input-remapper-git
sudo systemctl enable --now input-remapper
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;连接遥控器&lt;/h2&gt;
&lt;p&gt;将遥控器模式修改至 &lt;code&gt;PhoenixRC&lt;/code&gt;, 打开开关 (若修改模式前已开启, 请关闭再打开)&lt;/p&gt;
&lt;p&gt;:::tip
理论上修改为任意模式方可, 但不同模式的输入轴可能不同
:::&lt;/p&gt;
&lt;h2&gt;设置轴映射&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开 Input Remapper, 在 &lt;code&gt;Device&lt;/code&gt; 选项卡找到含有 &lt;code&gt;PhoenixRC Controller&lt;/code&gt; 字样的设备, 单击&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;Presets&lt;/code&gt; 选项卡选择 &lt;code&gt;new preset&lt;/code&gt;, 或使用现有 preset&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;Editor&lt;/code&gt; 选项卡的 Input 面板单击 &lt;code&gt;+ Add&lt;/code&gt;, 后选中项 (默认已自动选中) 单击两次 &lt;code&gt;Record&lt;/code&gt; (不知道为什么直接移动遥感没有用), 移动你想要映射的摇杆, 待添加的项名称自动更改, 再次单击 &lt;code&gt;Record&lt;/code&gt; 停止监听&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选中项, 单击 &lt;code&gt;Advanced&lt;/code&gt; 修改高级选项, 删除非目标轴, 并在界面右下角勾选 &lt;code&gt;Use as analog&lt;/code&gt; 以使用轴 (线性) 输入. 如下为不同轴名称与物理操作以及 PS5 标准轴对应的表格 (我的遥控器是左侧遥感上下不会自动回中的美国手遥控器)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Joystick-RX&lt;/th&gt;
&lt;th&gt;Trigger Left&lt;/th&gt;
&lt;th&gt;Joystick-X&lt;/th&gt;
&lt;th&gt;Joystick-Y&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;左侧摇杆左右&lt;/td&gt;
&lt;td&gt;左侧摇杆上下&lt;/td&gt;
&lt;td&gt;右侧摇杆左右&lt;/td&gt;
&lt;td&gt;右侧遥感上下&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ABS_Z&lt;/td&gt;
&lt;td&gt;ABS_Y&lt;/td&gt;
&lt;td&gt;ABS_X&lt;/td&gt;
&lt;td&gt;ABS_RX&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在右侧 &lt;code&gt;Output&lt;/code&gt; 面板中, 选择 &lt;code&gt;Analog Axis&lt;/code&gt; 面板, &lt;code&gt;Target&lt;/code&gt; 改为 &lt;code&gt;gamepad&lt;/code&gt; (游戏手柄), 更改为对应轴即可 &lt;br /&gt;
可以前往 &lt;a href=&quot;https://www.onlinemictest.com/zh/controller-tester/&quot;&gt;https://www.onlinemictest.com/zh/controller-tester/&lt;/a&gt; 查看轴运动方向是否正确 &lt;br /&gt;
&lt;a href=&quot;https://www.9slab.com/gamepad/home&quot;&gt;https://www.9slab.com/gamepad/home&lt;/a&gt; 查看具体输入数值&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;测试完成后, 在 &lt;code&gt;Rename&lt;/code&gt; (&lt;code&gt;重命名&lt;/code&gt;) 输入框内填入映射名称, 并单击右侧的保存按钮, 配置文件将被保存在 &lt;code&gt;~/.config/input-remapper-2/presets/&amp;lt;device&amp;gt;/&amp;lt;name&amp;gt;.json&lt;/code&gt;. 其中, &lt;code&gt;&amp;lt;device&amp;gt;&lt;/code&gt; 字样是你的设备名称, &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; 是你的映射名称&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::tip
如果发现左侧摇杆向上移动至中心位置输入已达到 &lt;code&gt;1.0&lt;/code&gt;, 请前往 &lt;code&gt;PhoenixRC&lt;/code&gt; 航模模拟器进行校准&lt;/p&gt;
&lt;p&gt;一个可能的下载链接 (第三方网站, 不保证安全性和可访问性, 后果自负): &lt;a href=&quot;https://www.flugsimulatoren.ch/Phoenix-RC.php&quot;&gt;https://www.flugsimulatoren.ch/Phoenix-RC.php&lt;/a&gt;
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;更多内容, 请参阅官方文档 &lt;a href=&quot;https://github.com/sezanzeb/input-remapper/blob/main/readme/usage.md&quot;&gt;https://github.com/sezanzeb/input-remapper/blob/main/readme/usage.md&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;一个可能的配置文件&lt;/h2&gt;
&lt;p&gt;可能含有设备配置项, 需要修改&lt;/p&gt;
&lt;p&gt;如果需要导入, 请直接复制内容并在 &lt;code&gt;~/.config/input-remapper-2/presets/&amp;lt;device&amp;gt;/&lt;/code&gt; 下新建任意合法名称的 &lt;code&gt;JSON&lt;/code&gt; 文件. 其中, &lt;code&gt;&amp;lt;device&amp;gt;&lt;/code&gt; 字样是你的设备名称, 如果设备名称文件夹没有被创建, 可以按照 步骤 2 新建并保存后, 再找到设备名称文件夹&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[
    {
        &quot;input_combination&quot;: [
            {
                &quot;type&quot;: 3,
                &quot;code&quot;: 2,
                &quot;origin_hash&quot;: &quot;3c827f8aaf14aed91058174eae560b57&quot;
            }
        ],
        &quot;target_uinput&quot;: &quot;gamepad&quot;,
        &quot;output_type&quot;: 3,
        &quot;output_code&quot;: 1,
        &quot;name&quot;: &quot;left-y&quot;,
        &quot;mapping_type&quot;: &quot;analog&quot;,
        &quot;deadzone&quot;: 0.0,
        &quot;gain&quot;: -1.33,
        &quot;expo&quot;: 0.15
    },
    {
        &quot;input_combination&quot;: [
            {
                &quot;type&quot;: 3,
                &quot;code&quot;: 3,
                &quot;origin_hash&quot;: &quot;3c827f8aaf14aed91058174eae560b57&quot;
            }
        ],
        &quot;target_uinput&quot;: &quot;gamepad&quot;,
        &quot;output_type&quot;: 3,
        &quot;output_code&quot;: 0,
        &quot;name&quot;: &quot;left-x&quot;,
        &quot;mapping_type&quot;: &quot;analog&quot;,
        &quot;deadzone&quot;: 0.0,
        &quot;gain&quot;: 1.11
    },
    {
        &quot;input_combination&quot;: [
            {
                &quot;type&quot;: 3,
                &quot;code&quot;: 1,
                &quot;origin_hash&quot;: &quot;3c827f8aaf14aed91058174eae560b57&quot;
            }
        ],
        &quot;target_uinput&quot;: &quot;gamepad&quot;,
        &quot;output_type&quot;: 3,
        &quot;output_code&quot;: 3,
        &quot;name&quot;: &quot;right-y&quot;,
        &quot;mapping_type&quot;: &quot;analog&quot;,
        &quot;deadzone&quot;: 0.0,
        &quot;gain&quot;: -1.27
    },
    {
        &quot;input_combination&quot;: [
            {
                &quot;type&quot;: 3,
                &quot;code&quot;: 0,
                &quot;origin_hash&quot;: &quot;3c827f8aaf14aed91058174eae560b57&quot;
            }
        ],
        &quot;target_uinput&quot;: &quot;gamepad&quot;,
        &quot;output_type&quot;: 3,
        &quot;output_code&quot;: 2,
        &quot;name&quot;: &quot;right-x&quot;,
        &quot;mapping_type&quot;: &quot;analog&quot;,
        &quot;deadzone&quot;: 0.0,
        &quot;gain&quot;: 1.06
    }
]
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 VirtualBox 增强功能的 screen size 无法自动适配窗口的问题</title><link>https://aka.lovemilk.top/notes/posts/apps/virtualbox/fix-addition/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/virtualbox/fix-addition/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;原帖
&lt;a href=&quot;https://forums.virtualbox.org/viewtopic.php?p=534679&amp;amp;sid=cf95f15e93ae6e2364239202e1661628#p534679&quot;&gt;https://forums.virtualbox.org/viewtopic.php?p=534679&amp;amp;sid=cf95f15e93ae6e2364239202e1661628#p534679&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;解决&lt;/h2&gt;
&lt;p&gt;尝试结束 &lt;code&gt;VBoxService&lt;/code&gt; 进程, 然后在命令行中运行 &lt;code&gt;VBoxService -f&lt;/code&gt; 后, 即可解决, 重启也不会出现上述问题&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>OpenClash 配置 VRChat 分流规则</title><link>https://aka.lovemilk.top/notes/posts/deployment/openclash/vrchat-rules/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/openclash/vrchat-rules/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;为保证 VRChat 可以直连, 需将除 &lt;code&gt;files.vrchat.cloud&lt;/code&gt; 的 &lt;code&gt;*.vrchat.com&lt;/code&gt;, &lt;code&gt;*.vrchat.cloud&lt;/code&gt; 直连, 否则可能因代理 IP 污染无法访问 VRChat.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 &lt;code&gt;设置自定义规则（优先匹配）&lt;/code&gt; 添加如下规则 (注意规则由上到下优先级)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 下面的是下载模型和地图的域名, 使用代理较快
- DOMAIN,files.vrchat.cloud,&amp;lt;Proxy&amp;gt;
- DOMAIN,file-variants.vrchat.cloud,&amp;lt;Proxy&amp;gt;
- DOMAIN,assets.vrchat.com,&amp;lt;Proxy&amp;gt;

# - DOMAIN-SUFFIX,vrchat.com,DIRECT  # 如果多次尝试连不上或者网页上不去再解除注释
- DOMAIN-SUFFIX,vrchat.cloud,DIRECT
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意: 请将 &lt;code&gt;&amp;lt;Proxy&amp;gt;&lt;/code&gt; 替换为你的代理服务器规则组, 例如 &lt;code&gt;🌐 节点&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Windows 侧异常处理&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Q: VRChat 登录失败, 显示 &lt;code&gt;Pleace make sure...&lt;/code&gt;. &amp;lt;br&amp;gt;
A: 依次尝试关闭 系统代理, 删除 DNS 缓存, 清除 SSL 状态 (最后者请前往 控制面板&amp;gt;网路和 Internet&amp;gt;Internet 选项&amp;gt;内容选项卡, 单击 证书 区域的 清除 SSL 状态(S) 即可) 后, 重新尝试登录, 若仍无效, 请重启 VRChat 客户端后重新登录再试. &amp;lt;br&amp;gt;
仍然无效的, 请开启 加速器 后重试. (请开启加速器而非代理工具)&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>OpenWRT 端口转发时保留源端口 (感谢 ChatGPT)</title><link>https://aka.lovemilk.top/notes/posts/deployment/openwrt/portforward-keepsource/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/openwrt/portforward-keepsource/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;手动编辑&lt;/h2&gt;
&lt;p&gt;如果你在使用 OpenWrt 进行端口转发时, 内部服务器只看到路由器的 LAN IP 地址（例如 192.168.1.1）, 这意味着 SNAT（源地址转换）仍在进行. 要保留客户端的源 IP 地址, 可以尝试以下方法直接在 LuCI 面板上配置:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;端口转发
&lt;ul&gt;
&lt;li&gt;转到 LuCI 面板 &quot;防火墙&quot; 页面, 点击&quot;端口转发&quot;选项卡, 以正常方式添加端口转发&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;保留源 IP
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;转到 LuCI 面板 &quot;防火墙&quot; 页面, 点击&quot;自定义规则&quot;选项卡 (或直接编辑 &lt;code&gt;/etc/firewall.user&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加以下内容以确保源 IP 地址保留：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 允许从 WAN 进入的流量, 并保留源 IP
iptables -t nat -A PREROUTING -p tcp --dport 外部端口 -j DNAT --to-destination 内部服务器 IP:内部端口
iptables -t filter -A FORWARD -p tcp -d 内部服务器 IP --dport 内部端口 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
iptables -t filter -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后保存并重启防火墙即可, 命令行使用请 &lt;code&gt;/etc/init.d/firewall restart&lt;/code&gt; 重启. (如果需要同时转发 TCP/UDP, 再添加并将其中的 &lt;code&gt;tcp&lt;/code&gt; 改为 &lt;code&gt;udp&lt;/code&gt; 即可)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;命令行工具&lt;/h2&gt;
&lt;p&gt;参见 &lt;a href=&quot;https://aka.lovemilk.top/github/openwrt-iptables-forward-adder?tab=readme-ov-file&quot;&gt;lovemilk2333/openwrt-iptables-forward-adder&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 Epic Game 登录 500 错误</title><link>https://aka.lovemilk.top/notes/posts/deployment/openclash/fix-epic-login/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/openclash/fix-epic-login/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;原因&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;store.epicgames.com&lt;/code&gt;, &lt;code&gt;www.twinmotion.com&lt;/code&gt; 与 &lt;code&gt;www.fortnite.com&lt;/code&gt; API 获取的 客户端 IP 不一样造成鉴权失败&lt;/p&gt;
&lt;h2&gt;修复&lt;/h2&gt;
&lt;p&gt;在 rules 添加如下内容, 并保证其使用同一个节点 (推荐 &lt;code&gt;DIRECT&lt;/code&gt;)&lt;br /&gt;
其中, &lt;code&gt;EPIC-Web&lt;/code&gt; 是一个规则组&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- DOMAIN,store.epicgames.com,EPIC-Web
- DOMAIN,static-assets-prod.epicgames.com,EPIC-Web
- DOMAIN,static-assets-dev.epicgames.com,EPIC-Web
- DOMAIN,tracking.epicgames.com,EPIC-Web
- DOMAIN,www.twinmotion.com,EPIC-Web
- DOMAIN,www.fortnite.com,EPIC-Web
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;扩展&lt;/h2&gt;
&lt;p&gt;要在 Linux 上使用 Epic Online Service, 可以使用第三方客户端 &lt;a href=&quot;https://heroicgameslauncher.com/&quot;&gt;&lt;em&gt;Heroic Games Launcher&lt;/em&gt;&lt;/a&gt; 或 &lt;a href=&quot;https://lutris.net/&quot;&gt;&lt;em&gt;Lutris&lt;/em&gt;&lt;/a&gt;
:::caution
使用第三方客户端造成账户安全性问题须由用户自行承担
:::&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Jellyfin DOCKER 部署教程及后续问题修复方法</title><link>https://aka.lovemilk.top/notes/posts/deployment/jellyfin/docker/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/deployment/jellyfin/docker/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1. 按照 &lt;a href=&quot;https://jellyfin.org/docs/general/installation/container/#docker&quot;&gt;官方文档&lt;/a&gt; 部署&lt;/h2&gt;
&lt;h2&gt;2. 修复局域网客户端只能访问第一次&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;使用网页到服务端控制台&lt;/li&gt;
&lt;li&gt;转到 &lt;code&gt;网路&lt;/code&gt; 选项 (URL 后缀为 &lt;code&gt;#/dashboard/networking&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;服务器地址设置&lt;/code&gt; 的 &lt;code&gt;本地网路地址&lt;/code&gt; 和 &lt;code&gt;局域网&lt;/code&gt; 改为 容器的外部地址 (局域网地址) &amp;lt;br&amp;gt;
例如我这里修改为 &lt;code&gt;192.168.255.3&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>关于 JEI 和 拼音搜索</title><link>https://aka.lovemilk.top/notes/posts/apps/minecraft/modspack-twr/jei/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/minecraft/modspack-twr/jei/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;不知为何, 使用整合包自带的 JEI 和最新版本的 1.16.5 Forge 的 拼音搜索无法使用, 需要安装模组的如下版本&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;mod&lt;/th&gt;
&lt;th&gt;version&lt;/th&gt;
&lt;th&gt;link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JEI&lt;/td&gt;
&lt;td&gt;7.8.0.1013&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.curseforge.com/minecraft/mc-mods/jei/files/5846870&quot;&gt;https://www.curseforge.com/minecraft/mc-mods/jei/files/5846870&lt;/a&gt; / &lt;a href=&quot;https://modrinth.com/mod/jei/version/7.8.0.1013&quot;&gt;https://modrinth.com/mod/jei/version/7.8.0.1013&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Just Enough Characters (拼音搜索)&lt;/td&gt;
&lt;td&gt;4.5.0&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.curseforge.com/minecraft/mc-mods/just-enough-characters/files/4874482&quot;&gt;https://www.curseforge.com/minecraft/mc-mods/just-enough-characters/files/4874482&lt;/a&gt; / (Modrinth 仅有高版本)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>对 The Winter Rescue (冬季救援) 整合包 Wiki 上的部分过时内容的补充</title><link>https://aka.lovemilk.top/notes/posts/apps/minecraft/modspack-twr/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/minecraft/modspack-twr/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本人测试的版本: 0.5.6-rc2-hf9@Minecraft-1.16.5&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;来自 &lt;a href=&quot;https://wiki.teammoeg.com/index.php?title=%E5%86%AC%E5%AD%A3%E6%95%91%E6%8F%B4&quot;&gt;官方 Wiki&lt;/a&gt;&lt;br /&gt;
TeamMoeg制作的第四代MC整合包“冬季救援The Winter Rescue (TWR)”进入Beta测试阶段。整合包基于1.16.5和Forge。一场人造的冰河世纪，暴风雪肆虐着世界，猛犸象和剑齿虎成为了地面的主宰。你是否能适应这零度以下的世界，为人类的未来寻找一线生机？这是一场空前的救援，谜团将徐徐展开...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;注意: 本页面仅是对本文件夹作用的描述, 具体各补充内容和页面, 参见侧边栏&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>关于能量塔</title><link>https://aka.lovemilk.top/notes/posts/apps/minecraft/modspack-twr/power-generator/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/minecraft/modspack-twr/power-generator/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;T1 (一级能量塔)&lt;/h2&gt;
&lt;h3&gt;作用范围 (版本: ^0.5)&lt;/h3&gt;
&lt;p&gt;在 官方 Wiki 的教程中, 可能因为版本过时, 或其他原因造成能量塔范围出现问题&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;一级能量塔，没有什么附属，目前只能增温20°与以17*17范围的增温[^wiki01]&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;一级能量塔能提供以第二层中间为中心的17*17*17的温场，过载不会影响温场范围[^wiki02]&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但经实际测试, 在我使用的整合包版本下 (版本见整合包内容主页), 其水平作用范围仅有以能量塔核心为中心的各水平方向的GUI显示的&quot;增温范围&quot;距离, 垂直作用范围则为以能量塔核心为中心的各垂直方向 4 格, 并成圆柱形(最小单位为一方块)分布&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./images/T1-Power-Generator_effecting-range_one-forth.x.png&quot; alt=&quot;T1-Power-Generator_effecting-range_one-forth.x.png&quot; /&gt;&lt;br /&gt;
如图, 已种植树苗的泥土即为其水平作用范围的 1/4&lt;br /&gt;
将该作用范围以能量塔核心为中心复制三份, 每份旋转 90度 即为其完整的水平作用范围&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./images/T1-Power-Generator_effecting-range_one-forth.y.png&quot; alt=&quot;T1-Power-Generator_effecting-range_one-forth.y.png&quot; /&gt;&lt;br /&gt;
如图, 白桦原木所表示的范围即为其垂直作用范围&lt;br /&gt;
若将上方泥土再向上移动一格则树苗无法生长&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其实官方在更新日志里有提到范围修改&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;来自 0.5.6 官方更新日志&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;[修改]
能量塔的设置可以继承到新的能量塔上了。
现在能量塔加热过程改为缓慢上升。(cr. ceary)
减少了地表植被生成。
减少了部分群系。
能量塔范围修改：
范围1级向上5格，向下3格，半径12的圆柱体。
范围2级向上9格，向下5格，半径16的圆柱体。
加热器改为向上4格，向下1格，半径7的圆柱体。
温度球改为显示体感温度。
动植物需要的温度等级下降。
土壤温度改为土壤解冻程度。
死亡改为只消耗一半精力值
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;作用范围 (版本: ^0.6.0-rc7)&lt;/h3&gt;
&lt;p&gt;自 0.6.0-rc7 起, T1 能量塔的作用范围是以能量塔核心为中心, UI 内显示的 &quot;增温范围&quot; 距离的球体&lt;/p&gt;
&lt;p&gt;在 0.6.0-rc7 中, T1 能量塔不开启超频, &quot;增温范围&quot; 为 &lt;code&gt;16&lt;/code&gt;, 能量塔核心 (不含核心) 上方第 15 格是能量塔的最大作用范围, 而第 15 格旁边 4 格均不能被加热 (默认加热到 10 ℃)&lt;br /&gt;
而上方第 14 格水平四个方向 (不含本格) 延伸各 5 格是能量塔的最大作用范围&lt;/p&gt;
&lt;p&gt;[^wiki01]: &lt;a href=&quot;https://wiki.teammoeg.com/index.php?title=%E5%85%B3%E4%BA%8E%E8%83%BD%E9%87%8F%E5%A1%94%E7%9A%84%E4%BA%8C%E4%B8%89%E4%BA%8B#.E4.B8.80.E7.BA.A7.E8.83.BD.E9.87.8F.E5.A1.94.E7.9A.84.E9.A3.9F.E7.94.A8&quot;&gt;最后的工程师手册 - TeamMoeg官方WIKI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[^wiki02]: &lt;a href=&quot;https://wiki.teammoeg.com/index.php?title=%E6%9C%80%E5%90%8E%E7%9A%84%E5%B7%A5%E7%A8%8B%E5%B8%88%E6%89%8B%E5%86%8C#2.2_.E4.B8.80.E7.BA.A7.E8.83.BD.E9.87.8F.E5.A1.94&quot;&gt;关于能量塔的二三事 - TeamMoeg官方WIKI&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Stone Age 野牛</title><link>https://aka.lovemilk.top/notes/posts/apps/minecraft/modspack-twr/stone-age-auroch/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/minecraft/modspack-twr/stone-age-auroch/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;被岩浆烧死行为&lt;/h2&gt;
&lt;p&gt;经本人实测, 其在被岩浆完全烧死后仅会掉落皮, 不会掉落肉 脂肪 和 骨 (并不是被岩浆烧掉了), 并且, 官方已认为这是一个 BUG (见 &lt;a href=&quot;https://github.com/TeamMoegMC/TheWinterRescue/issues/133&quot;&gt;Issue#133&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;如下为可能的临时解决方案:&lt;br /&gt;
满血的成年野牛在岩浆放出与收回间隔 20 + 1 红石刻 (5个满档红石中继器 + 1个未调红石中继器) 时刚好被烧死并会掉落肉等&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复在 Linux 上解压含有非 ASCII 字符的 Windows 压缩的压缩包乱码</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/extract/fix-wrong-extracted-encoding/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/extract/fix-wrong-extracted-encoding/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;使用 unzip 的 &lt;code&gt;-I&lt;/code&gt; / &lt;code&gt;-O&lt;/code&gt; 指定编码 (推荐)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
# -I CHARSET  specify a character encoding for UNIX and other archives

# CP936 is GBK or GB18030

unzip -O CP936 /path/to/compressed.zip -d /path/to/extracted
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果您的 unzip 不支持 &lt;code&gt;-I&lt;/code&gt; / &lt;code&gt;-O&lt;/code&gt; 参数指定编码, 可以使用更为强大的 unar 工具&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unar -e GBK /path/to/compressed.zip -o /path/to/extracted
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用 &lt;code&gt;convmv&lt;/code&gt; 修复解压出来的文件夹乱码&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;安装&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S convmv
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;修复 &lt;br /&gt;
&lt;code&gt;/path/to/extracted&lt;/code&gt; 即为解压出来的文件夹&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;convmv -f GBK -t UTF-8 --notest -r /path/to/extracted
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 Flameshot 跨屏 UI 问题</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/flameshot/fix-cross-screen-problem/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/flameshot/fix-cross-screen-problem/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;描述&lt;/h2&gt;
&lt;p&gt;默认情况下, &lt;code&gt;flameshot gui&lt;/code&gt; 命令会将多个显示器拼接后的画面缩小并渲染在主显示器上&lt;/p&gt;
&lt;h2&gt;解决&lt;/h2&gt;
&lt;p&gt;设置环境变量 &lt;code&gt;QT_QPA_PLATFORM=xcb&lt;/code&gt;, 或以如下方式运行 Flameshot:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;env QT_QPA_PLATFORM=xcb flameshot gui
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::warning
wayland 用户切勿将其加入 &lt;code&gt;/etc/environment&lt;/code&gt; 中, 可能会导致 KDE (或其他依赖于 QT 的桌面环境或软件) 无法正常显示
:::&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Pac-Man game 包</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/just4fun/pacman-game/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/just4fun/pacman-game/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;包页面: &lt;a href=&quot;https://packages.ubuntu.com/jammy/pacman&quot;&gt;https://packages.ubuntu.com/jammy/pacman&lt;/a&gt;&lt;br /&gt;
源码仓库: &lt;a href=&quot;https://salsa.debian.org/games-team/pacman&quot;&gt;https://salsa.debian.org/games-team/pacman&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Wayland + KDE 桌面环境下使用命令行唤醒屏幕</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/kde/wake-up-your-screen-by-cli/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/kde/wake-up-your-screen-by-cli/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;描述&lt;/h2&gt;
&lt;p&gt;sunshine 串流软件在显示器关闭情况下无法连接, 会发生 &lt;code&gt;503&lt;/code&gt; 错误&lt;/p&gt;
&lt;h2&gt;解决&lt;/h2&gt;
&lt;p&gt;如下指令可以使显示器在熄屏(睡眠和休眠未经测试)状态下亮屏&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;kscreen-doctor --dpms on
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于使用 &lt;a href=&quot;https://github.com/sddm/sddm&quot;&gt;SDDM&lt;/a&gt; 的用户, 可能需要手动将 &lt;code&gt;$WAYLAND_DISPLAY&lt;/code&gt; 设为 &lt;code&gt;wayland-1&lt;/code&gt;, 因为 SDDM 与 KDE Plasma 不在同一个 &lt;em&gt;WAYLAND_DISPLAY&lt;/em&gt; 中&lt;/p&gt;
&lt;p&gt;对于使用 &lt;a href=&quot;https://invent.kde.org/plasma/plasma-login-manager/&quot;&gt;Plasma Login Manager&lt;/a&gt; 的用户则无须配置, 因为两者运行于同一 &lt;em&gt;WAYLAND_DISPLAY&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;../../Display/custom-edid&quot;&gt;自定义显示器分辨率和/或刷新率&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>自定义显示器 `EDID` 以自定义 分辨率和/或刷新率</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/display/custom-edid/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/display/custom-edid/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;描述&lt;/h2&gt;
&lt;p&gt;使用显卡欺骗器 (FakeDisplay) 时无法使用自定义的分辨率刷新率, 使得串流时无法适配客户端分辨率刷新率&lt;/p&gt;
&lt;h2&gt;解决&lt;/h2&gt;
&lt;p&gt;:::caution
本教程仅提供一个可能的解决方案, 内容可能并不适用于所有的设备, 后果须由用户自行承担&lt;/p&gt;
&lt;p&gt;经过实测, NVIDIA 驱动加载非标准分辨率比率的显示器会使得显示器无法连接;&lt;br /&gt;
加载标准分辨率比率但刷新率过高的显示器时会导致显卡掉驱动:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[141.637776] nvidia-modeset: ERROR: GPU:0: Idling display engine timed out: 0x0000c67e:6:0:1176
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;如下项目提供了使用 &lt;code&gt;cvt&lt;/code&gt; 指令生成 &lt;code&gt;Modeline&lt;/code&gt; 格式的显示器分辨率刷新率 转为 &lt;code&gt;EDID&lt;/code&gt; 二进制文件的脚本 &lt;a href=&quot;https://github.com/akatrevorjay/edid-generator&quot;&gt;https://github.com/akatrevorjay/edid-generator&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载脚本或 &lt;code&gt;clone&lt;/code&gt; 仓库&lt;br /&gt;
对于 &lt;code&gt;Archlinux&lt;/code&gt; 用户, 可以使用 AUR 的 &lt;code&gt;edid-generator&lt;/code&gt; 包
:::warning
&lt;code&gt;edid-generator&lt;/code&gt; 包存在小问题, 使用 stdin 的文件输入会导致没有办法退出 (&lt;code&gt;Ctrl+C&lt;/code&gt; 退出后无法自动运行 &lt;code&gt;make&lt;/code&gt;), 可以手动 &lt;code&gt;cd /tmp/edid-generator-&amp;lt;4个任意字母&amp;gt;&lt;/code&gt; 文件夹下手动运行 &lt;code&gt;make&lt;/code&gt;
:::&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cvt -v &amp;lt;分辨率_长&amp;gt; &amp;lt;分辨率_宽&amp;gt; &amp;lt;刷新率&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cvt -v 2400 1080 120

Warning: Aspect Ratio is not CVT standard.
Warning: Refresh Rate 120.00 is not CVT standard (50, 60, 75 or 85Hz).
# 2400x1080 119.93 Hz (CVT) hsync: 139.12 kHz; pclk: 460.75 MHz
Modeline &quot;2400x1080_120.00&quot;  460.75  2400 2592 2856 3312  1080 1083 1093 1160 -hsync +vsync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生成 &lt;code&gt;2400x1080@120&lt;/code&gt; 的 &lt;code&gt;Modeline&lt;/code&gt; 格式信息, 将 &lt;code&gt;Modeline&lt;/code&gt; 紧随的名称 (如 &lt;code&gt;&quot;2400x1080_120.00&quot;&lt;/code&gt;) 改写至 12 字符以内, 非标准分辨率的在最后加上分辨率比率 &lt;code&gt;ratio=&amp;lt;比率x&amp;gt;:&amp;lt;比率y&amp;gt;&lt;/code&gt; 并 复制改写后的整行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行 &lt;code&gt;./modeline2edid&lt;/code&gt; (&lt;code&gt;Archlinux&lt;/code&gt; 运行 &lt;code&gt;edid-generator&lt;/code&gt;) 并粘贴复制内容, 例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ edid-generator
Searching for modelines in &apos;/dev/stdin&apos;

# 输入
Modeline &quot;2400x1080&quot;  460.75  2400 2592 2856 3312  1080 1083 1093 1160 -hsync +vsync ratio=20:9

Wrote 2400x1080.S
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样, 就会在 当前文件夹 (&lt;code&gt;Archlinux&lt;/code&gt; 用户为 &lt;code&gt;/tmp/edid-generator-&amp;lt;4个任意字母&amp;gt;&lt;/code&gt; 文件夹) 下生成以 &lt;code&gt;Wrote &lt;/code&gt; 后内容为文件名的文件了&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;切换至生成文件所在目录
&lt;code&gt;Archlinux&lt;/code&gt; 用户请运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd /tmp/edid-generator-*
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果有两个或多个类似目录, 请 &lt;code&gt;cd&lt;/code&gt; 至修改/创建时间与当前时间最为接近的目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ make
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
该脚本 &lt;strong&gt;支持的标准分辨率比率&lt;/strong&gt; 包括: 4:3, 16:10, 5:4, 16:9&lt;br /&gt;
如果使用非标准分辨率比率, 可能会遇到 &lt;code&gt;Error: invalid operands (*UND* and *ABS* sections) for `&amp;lt;&amp;lt;&apos;&lt;/code&gt; 问题&lt;br /&gt;
(参见 &lt;a href=&quot;https://github.com/akatrevorjay/edid-generator/issues/19&quot;&gt;issue#19&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;可能的临时解决方案是在工作路径下的 &lt;code&gt;edid.S&lt;/code&gt; 的 &lt;code&gt;/* EDID 1.3 standard definitions */&lt;/code&gt; 下方添加&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#define XY_RATIO_&amp;lt;比率x&amp;gt;_&amp;lt;比率y&amp;gt; 0b&amp;lt;任意不重复的数值&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如 &lt;code&gt;2400x1080&lt;/code&gt; (20:9) 的屏幕则写为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#define XY_RATIO_20_9 0b100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后运行 &lt;code&gt;make&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::warning
&lt;code&gt;0b&amp;lt;任意不重复的数值&amp;gt;&lt;/code&gt; 为显示器比率识别码, 进行自定义可能造成部分老旧的 &lt;code&gt;EDID&lt;/code&gt; 解析器无法识别
:::&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将 &lt;code&gt;make&lt;/code&gt; 生成出来的 &lt;code&gt;.bin&lt;/code&gt; 文件 (例如 &lt;code&gt;2400x1080.bin&lt;/code&gt;) 复制或移动至 &lt;code&gt;/usr/lib/firmware/edid/&lt;/code&gt; (&lt;code&gt;edid&lt;/code&gt; 文件夹不存在时请自行创建)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;该操作可能需要 root 权限&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;$ cp 2400x1080.bin /usr/lib/firmware/edid/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并在内核参数加上&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;drm.edid_firmware=&amp;lt;显示器标识&amp;gt;:edid/&amp;lt;`.bin`文件路径&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;drm.edid_firmware=DP-2:edid/2400x1080.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;GRUB 用户可以修改 &lt;code&gt;/etc/default/grub&lt;/code&gt; 的 &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt; 并更新引导&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;If you want to set multiple edid files, use:&lt;br /&gt;
如果需要定义多个显示器的 &lt;code&gt;EDID&lt;/code&gt;, 请使用:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;drm.edid_firmware=VGA-1:edid/your_edid.bin,VGA-2:edid/your_other_edid.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;:::tip
显示器标识请使用如下命令获取&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n &quot;${con#*/card?-}: &quot;; cat $p; done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改 &lt;code&gt;/etc/mkinitcpio.conf&lt;/code&gt; 并生成配置
修改 &lt;code&gt;/etc/mkinitcpio.conf&lt;/code&gt; 中的 &lt;code&gt;FILES&lt;/code&gt; 字段, 添加新的 &lt;code&gt;EDID&lt;/code&gt; 文件路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FILES=(/usr/lib/firmware/edid/&amp;lt;`.bin`文件路径&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FILES=(/usr/lib/firmware/edid/2400x1080.bin)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后重新生成配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo mkinitcpio -P
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启系统
:::warning
如果重启系统后显示器未连接, 可能是您使用了非标准分辨率比率显示器造成的&lt;/p&gt;
&lt;p&gt;如果在 &lt;code&gt;dmesg&lt;/code&gt; 中出现 &lt;code&gt;[CONNECTOR:110:&amp;lt;显示器标识&amp;gt;] Requesting EDID firmware &quot;edid/&amp;lt;&lt;/code&gt;.bin&lt;code&gt;文件路径&amp;gt;&quot; failed (err=-2)&lt;/code&gt;, 可能是遗漏了 &lt;code&gt;7. 修改 `/etc/mkinitcpio.conf` 并生成配置&lt;/code&gt; 造成的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[    3.977294] nvidia 0000:01:00.0: Direct firmware load for edid/2400x1080.bin failed with error -2
[    3.977382] nvidia 0000:01:00.0: [drm] *ERROR* [CONNECTOR:110:DP-2] Requesting EDID firmware &quot;edid/2400x1080.bin&quot; failed (err=-2)
[    3.977504] nvidia 0000:01:00.0: Direct firmware load for edid/2400x1080.bin failed with error -2
[    3.977582] nvidia 0000:01:00.0: [drm] *ERROR* [CONNECTOR:110:DP-2] Requesting EDID firmware &quot;edid/2400x1080.bin&quot; failed (err=-2)
[    4.070439] [drm] Initialized nvidia-drm 0.0.0 for 0000:01:00.0 on minor 0
[    4.070525] Console: switching to colour dummy device 80x25
[    4.070550] nvidia 0000:01:00.0: vgaarb: deactivate vga console
[    4.154474] nvidia 0000:01:00.0: Direct firmware load for edid/2400x1080.bin failed with error -2
[    4.154478] nvidia 0000:01:00.0: [drm] *ERROR* [CONNECTOR:110:DP-2] Requesting EDID firmware &quot;edid/2400x1080.bin&quot; failed (err=-2)
[    4.154497] nvidia 0000:01:00.0: Direct firmware load for edid/2400x1080.bin failed with error -2
[    4.154499] nvidia 0000:01:00.0: [drm] *ERROR* [CONNECTOR:110:DP-2] Requesting EDID firmware &quot;edid/2400x1080.bin&quot; failed (err=-2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;akatrevorjay/edid-generator: Hackerswork to generate an EDID blob from given Xorg Modelines, complete with valid checksum.: &lt;a href=&quot;https://github.com/akatrevorjay/edid-generator?tab=readme-ov-file#edid-generator&quot;&gt;https://github.com/akatrevorjay/edid-generator?tab=readme-ov-file#edid-generator&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kernel mode setting - Forcing modes and EDID - ArchWiki: &lt;a href=&quot;https://wiki.archlinux.org/title/Kernel_mode_setting#Forcing_modes_and_EDID&quot;&gt;https://wiki.archlinux.org/title/Kernel_mode_setting#Forcing_modes_and_EDID&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to override the EDID data of a monitor under Linux | foosel.net: &lt;a href=&quot;https://foosel.net/til/how-to-override-the-edid-data-of-a-monitor-under-linux/&quot;&gt;https://foosel.net/til/how-to-override-the-edid-data-of-a-monitor-under-linux/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Error: invalid operands (*UND* and *ABS* sections) for `&amp;lt;&amp;lt;&apos; · Issue #19 · akatrevorjay/edid-generator: &lt;a href=&quot;https://github.com/akatrevorjay/edid-generator/issues/19&quot;&gt;https://github.com/akatrevorjay/edid-generator/issues/19&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;archlinux交流群 (1039561926@QQ) 群友 &lt;code&gt;Norman&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复显示器在 OSD 菜单中启用 FreeSync 后黑屏</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/display/fix-black-screen-after-freesync-enable/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/display/fix-black-screen-after-freesync-enable/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::warning
这可能并不适用于所以显示器, 请优先寻找售后服务支持, 或自行酌情决定是否使用
:::&lt;/p&gt;
&lt;h2&gt;使用 &lt;code&gt;ddcutil&lt;/code&gt; 重置显示器&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;安装&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S ddcutil
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;查看连接的显示器&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ddcutil detect

# example output
Display 1
   I2C bus:  /dev/i2c-1
   DRM connector:           card0-HDMI-A-1
   EDID synopsis:
      Mfg id:               FKS - UNK
      Model:                FKS-C215J
      Product code:         4132  (0x1024)
      Serial number:        000000000000
      Binary serial number: 0 (0x00000000)
      Manufacture year:     2022,  Week: 1
   VCP version:         2.2

Display 2
   I2C bus:  /dev/i2c-4
   DRM connector:           card0-DP-3
   EDID synopsis:
      Mfg id:               RTK - UNK
      Model:                Type_C
      Product code:         447  (0x01bf)
      Serial number:        
      Binary serial number: 1666187265 (0x63500001)
      Manufacture year:     2020,  Week: 1
   VCP version:         2.2
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;重置对应显示器
:::warning
这可能会导致显示器 OSD 界面重置或消失 进入出厂较色模式, 解决方案参见 步骤4
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ddcutil --display &amp;lt;number&amp;gt; setvcp 0x04 0x01
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中, &lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; 为显示器序号&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;移除显示器电源连接后重新连接电源方可. 若显示器进入出厂较色模式 (不同颜色屏幕来回切换), 长按电源键并重启显示器即可&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 OBS Studio 在 NVIDIA 显卡上打开 全屏/窗口预览 会导致崩溃</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/obs/cannot-open-preview-window/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/obs/cannot-open-preview-window/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;设置环境变量&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;__NV_DISABLE_EXPLICIT_SYNC=1
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 Linux Steam wine 兼容层 `compatdata` 文件夹问题</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/steam/compatdata/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/steam/compatdata/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;描述&lt;/h2&gt;
&lt;p&gt;因部分游戏仅原生支持 Windows 操作系统, 所以 Steam 需要使用 Wine 兼容层在 Linux 上运行 PE (&lt;code&gt;.exe&lt;/code&gt;) 可执行文件, &lt;code&gt;compatdata&lt;/code&gt; 文件夹 (位于 &lt;code&gt;SteamLibrary/steamapps&lt;/code&gt;) 是 Wine 所需的文件&lt;br /&gt;
又因 &lt;code&gt;compatdata&lt;/code&gt; 文件夹中存在 NTFS (Windows 的文件系统) 难以或不可识读字符, 若该文件夹位于 NTFS 上, 会造成文件系统意外损坏&lt;/p&gt;
&lt;h2&gt;修复&lt;/h2&gt;
&lt;p&gt;使用 软链接 链接 &lt;code&gt;compatdata&lt;/code&gt; 文件夹至非 NTFS 文件系统&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ln -s &amp;lt;将文件夹迁移后的文件夹绝对路径&amp;gt; &amp;lt;`compatdata` 原来位置&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 MangoHud 在 Intel CPU 上功率始终为 0.0 W</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/mangohud/fix-wrong-intel-cpu-power/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/mangohud/fix-wrong-intel-cpu-power/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/linux_gaming/comments/13g4qpz/comment/jlxda0x&quot;&gt;https://www.reddit.com/r/linux_gaming/comments/13g4qpz/comment/jlxda0x&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;运行如下指令修改权限即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod o+r /sys/class/powercap/intel-rapl\:0/energy_uj
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为免更新后权限恢复, 可在 &lt;code&gt;/etc/systemd/system&lt;/code&gt; 中添加如下 &lt;code&gt;.service&lt;/code&gt; System Unit 配置文件, 并 &lt;code&gt;enable&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Service]
Type=oneshot
RemainAfterExit=true
# NOTE: root permission is required
User=root
Group=root
ExecStart=chmod o+r /sys/class/powercap/intel-rapl:0/energy_uj

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;enable 配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl enable --now &amp;lt;your-named&amp;gt;.service
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 Linux 原生游戏中文字体显示空白</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/steam/fix-chinese-font/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/steam/fix-chinese-font/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装所需字体 &lt;code&gt;wqy-microhei&lt;/code&gt; &lt;br /&gt;
对于 ArchLinux, 请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -Sy wqy-microhei
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 Steam 兼容层运行&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;code&gt;库 &amp;gt; &amp;lt;name-of-your-game&amp;gt;&lt;/code&gt; 页面&lt;/li&gt;
&lt;li&gt;单击右侧小齿轮并打开属性面板&lt;/li&gt;
&lt;li&gt;单击左侧兼容层选项卡&lt;/li&gt;
&lt;li&gt;勾选 &quot;强制使用特定 Steam Play 兼容性工具&quot;, 下方选择 &quot;Legacy runtime 1.0&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>Binwalk (v3) - 文件头扫描器</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/tools/binwalk/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/tools/binwalk/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;https://github.com/ReFirmLabs/binwalk
What does it do?
Binwalk can identify, and optionally extract, files and data that have been embedded inside of other files.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While its primary focus is firmware analysis, it supports a wide variety of file and data types.&lt;/p&gt;
&lt;p&gt;Through entropy analysis, it can even help to identify unknown compression or encryption!&lt;/p&gt;
&lt;p&gt;Binwalk can be customized and integrated into your own Rust projects.&lt;/p&gt;
&lt;h2&gt;使用 &lt;code&gt;binwalk&lt;/code&gt; 列出二进制文件中包含的各个文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;binwalk &amp;lt;filename&amp;gt;

# example output
--------------------------------------------------------------------------------------------------------------
DECIMAL                            HEXADECIMAL                        DESCRIPTION
--------------------------------------------------------------------------------------------------------------
1024                               0x400                             POSIX tar archive, file count: 16
--------------------------------------------------------------------------------------------------------------

Analyzed 1 file for 85 file signatures (187 magic patterns) in 79.0 milliseconds
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用 &lt;code&gt;binwalk&lt;/code&gt; 提取文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;binwalk -e &amp;lt;filename&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出路径: &lt;code&gt;./extractions/&amp;lt;filename&amp;gt;.extracted/&lt;/code&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 Android Drivedroid 的 Mass Storage 无法识别</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/drivedroid-fix/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/drivedroid-fix/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.archlinuxcn.org/wiki/Udisks&quot;&gt;https://wiki.archlinuxcn.org/wiki/Udisks&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S udisks2
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复蓝牙设备(特别是音频设备)断链</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/fix-bluetooth/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/fix-bluetooth/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linuxquestions.org/questions/linux-hardware-18/problem-with-any-bluetooth-device-4175631846&quot;&gt;https://www.linuxquestions.org/questions/linux-hardware-18/problem-with-any-bluetooth-device-4175631846&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=355497&quot;&gt;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=355497&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;# Defaults for bluez
# start bluetooth on boot?
# compatibility note: If this variable is not found bluetooth will
# start
BLUETOOTH_ENABLED=1

# This setting will switch HID devices (e.g mouse/keyboad) to HCI mode, that is
# you will have bluetooth functionality from your dongle instead of only HID.
# Note that not every bluetooth dongle is capable of switching back to HID
# mode, see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=355497
HID2HCI_ENABLED=1
HID2HCI_UNDO=1
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;若仍然存在问题, 可在 &lt;code&gt;bluetooth.service&lt;/code&gt; 中的 &lt;code&gt;[Unit]&lt;/code&gt; 中的 &lt;code&gt;After=network-online.target&lt;/code&gt;&lt;/h1&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 Linux 下默认字体出现异常</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/fix-font/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/fix-font/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;转载自 &lt;a href=&quot;https://sourlemonjuice.github.io/posts/%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87/2024/02/03/linux%E4%B8%8B%E9%85%8D%E7%BD%AE%E9%BB%98%E8%AE%A4emoji%E5%AD%97%E4%BD%93%E7%9A%84%E6%96%B9%E5%BC%8F&quot;&gt;Linux 下配置默认 emoji 字体 | SourLemonJuice-blog&lt;/a&gt; / &lt;a href=&quot;https://creativecommons.org/licenses/by/4.0/&quot;&gt;CC BY 4.0&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;描述&lt;/h2&gt;
&lt;p&gt;使用 KDE 桌面环境系统设置工具, 修改系统默认字体后, 部分软件无法生效&lt;/p&gt;
&lt;h2&gt;修复&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装 &lt;code&gt;fontconfig&lt;/code&gt; 软件包&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置 &lt;code&gt;~/.config/fontconfig/fonts.conf&lt;/code&gt; 文件 (若无请自行创建) 为如下内容, 被 &lt;code&gt;&amp;lt;family&amp;gt;&lt;/code&gt; 与 &lt;code&gt;&amp;lt;/family&amp;gt;&lt;/code&gt; 包裹的内容为目标字体的匹配名称&lt;/p&gt;
&lt;h3&gt;配置概览&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;~/.config/fontconfig/fonts.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;!DOCTYPE fontconfig SYSTEM &quot;urn:fontconfig:fonts.dtd&quot;&amp;gt;
&amp;lt;fontconfig&amp;gt;
    &amp;lt;alias&amp;gt;
    &amp;lt;family&amp;gt;sans-serif&amp;lt;/family&amp;gt;
    &amp;lt;prefer&amp;gt;
        &amp;lt;family&amp;gt;HarmonyOS Sans SC&amp;lt;/family&amp;gt;
        &amp;lt;family&amp;gt;HarmonyOS Sans TC&amp;lt;/family&amp;gt;
    &amp;lt;/prefer&amp;gt;
    &amp;lt;/alias&amp;gt;
    &amp;lt;alias&amp;gt;
    &amp;lt;family&amp;gt;serif&amp;lt;/family&amp;gt;
    &amp;lt;prefer&amp;gt;
        &amp;lt;family&amp;gt;HarmonyOS Sans SC&amp;lt;/family&amp;gt;
        &amp;lt;family&amp;gt;HarmonyOS Sans TC&amp;lt;/family&amp;gt;
    &amp;lt;/prefer&amp;gt;
    &amp;lt;/alias&amp;gt;
&amp;lt;/fontconfig&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;修改完成后, 重启应用程序方可&lt;/p&gt;
&lt;h2&gt;可能用到的命令&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 刷新字体缓存
fc-cache -fv

# 匹配字体
fc-match &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>CC BY 4.0</name><url>https://creativecommons.org/licenses/by/4.0/</url></copyright></item><item><title>修复因 NVIDIA 缺 GPU 驱动造成的 核心转储</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/fix-steam-nvidia-gpu/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/fix-steam-nvidia-gpu/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;问题&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;/home/&amp;lt;username&amp;gt;/.local/share/Steam/steam.sh: 第 960 行： 5750 总线错误            （核心已转储）&quot;$STEAMROOT/$STEAMEXEPATH&quot; &quot;$@&quot;

❯ coredumpctl info 5750
           PID: 5750 (steam)
           UID: 1000 (&amp;lt;username&amp;gt;)
           GID: 1000 (&amp;lt;username&amp;gt;)
        Signal: 7 (BUS)
     Timestamp: Sat 2025-06-28 13:27:14 CST (6s ago)
  Command Line: /home/&amp;lt;username&amp;gt;/.local/share/Steam/ubuntu12_32/steam -srt-logger-opened
    Executable: /home/&amp;lt;username&amp;gt;/.local/share/Steam/ubuntu12_32/steam
 Control Group: /user.slice/user-1000.slice/user@1000.service/app.slice/app-org.kde.konsole@edc27db08dc24bbab&amp;gt;
          Unit: user@1000.service
     User Unit: app-org.kde.konsole@edc27db08dc24bbab66e0b79d60c4373.service
         Slice: user-1000.slice
     Owner UID: 1000 (&amp;lt;username&amp;gt;)
       Boot ID: e7949097facb424f80ecfcd6297d565b
    Machine ID: dd8e2d47052c44b58edbf084c4922872
      Hostname: ****
       Storage: /var/lib/systemd/coredump/core.steam.1000.e7949097facb424f80ecfcd6297d565b.5750.1751088434000&amp;gt;
  Size on Disk: 22.7M
       Message: Process 5750 (steam) of user 1000 dumped core.

                Stack trace of thread 5750:
                #0  0x00000000e936e3b0 n/a (libnvidia-gpucomp.so.575.64 + 0x2ba83b0)
                #1  0x00000000e69b94e4 n/a (libnvidia-gpucomp.so.575.64 + 0x1f34e4)
                #2  0x00000000e9a23f0a n/a (libnvidia-gpucomp.so.575.64 + 0x325df0a)
                ELF object binary architecture: Intel 80386
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;解决&lt;/h2&gt;
&lt;p&gt;安装 &lt;code&gt;lib32-nvidia-utils&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S lib32-nvidia-utils
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>ArchLinux 挂载 smb 存储</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/mount-smb/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/mount-smb/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;描述&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;cp&lt;/code&gt; 命令不支持 &lt;code&gt;smb://&lt;/code&gt; 的路径, 需要先挂载到本地再复制&lt;/p&gt;
&lt;h2&gt;解决&lt;/h2&gt;
&lt;p&gt;将 samba 云存储挂载至本地&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装依赖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S smbclient cifs-utils
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;挂载 samba 至指定文件夹&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mount -t cifs //&amp;lt;host&amp;gt;/&amp;lt;path&amp;gt; /path/to/mount-point -o username=&amp;lt;username&amp;gt;,password=&amp;lt;password&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中,&lt;br /&gt;
&lt;code&gt;//&amp;lt;host&amp;gt;/&amp;lt;path&amp;gt;&lt;/code&gt; 为目标云存储的路径, 如 &lt;code&gt;//192.168.1.1/sda1&lt;/code&gt; 或 &lt;code&gt;//your_host/sda1&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;/path/to/mount-point&lt;/code&gt; 为目标挂载点, 即在本机的路径, 如 &lt;code&gt;/mnt/smb/your_host/sda1&lt;/code&gt; (需要预先创建)
&lt;code&gt;-o&lt;/code&gt; 后为挂载选项, 由于大部分的 samba 需要 auth, 则 &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; 为你的 samba 用户, &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; 同理为密码&lt;/p&gt;
&lt;p&gt;:::tip
解除挂载请使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo umount /path/to/mount-point
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>重启 PipeWire 音频服务</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/restart-audio/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/restart-audio/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;systemctl --user restart pipewire.service
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>使用 udev 规则允许访问 HID 设备 (以使用键盘驱动 Web 端)</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/udev-allow-access-hid-devices/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/udev-allow-access-hid-devices/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 &lt;code&gt;/etc/udev/rules.d/&lt;/code&gt; 创建一个 &lt;code&gt;.rules&lt;/code&gt; 文件, 文件名称合法即可&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一般为 &lt;code&gt;dd-描述.rules&lt;/code&gt;, &lt;code&gt;dd&lt;/code&gt; 是一个两位十进制数, 数字越大越在靠后的时刻加载&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;SUBSYSTEM==&quot;hidraw*&quot;, ATTRS{idVendor}==&quot;&amp;lt;vendor-id&amp;gt;&quot;, ATTRS{idProduct}==&quot;&amp;lt;product-id&amp;gt;&quot;, MODE=&quot;0666&quot;, GROUP=&quot;&amp;lt;user-group&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;vendor-id&amp;gt;&lt;/code&gt; 与 &lt;code&gt;&amp;lt;product-id&amp;gt;&lt;/code&gt; 可以使用 &lt;code&gt;lsusb&lt;/code&gt; 查看:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;❯ lsusb
Bus 001 Device 003: ID &amp;lt;vendor-id&amp;gt;:&amp;lt;product-id&amp;gt; XXXXXXX
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;user-group&amp;gt;&lt;/code&gt; 是你所在的用户组, 或者是你想要授权的组名&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>在 ArchLinux 上使用 高漫 M6 数位板</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/system/use-gaomon-m6-pad/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/system/use-gaomon-m6-pad/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;参考 &lt;a href=&quot;https://www.cnblogs.com/eslzzyl/p/18166553&quot;&gt;在 ArchLinux 上完美使用高漫 M6 数位板 - Eslzzyl - 博客园&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;步骤&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装 &lt;code&gt;dkms&lt;/code&gt; 和 &lt;code&gt;linux-headers&lt;/code&gt; 包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S dkms linux-headers
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;克隆 &lt;code&gt;digimend-kernel-drivers&lt;/code&gt; 仓库
该仓库提供了数位板的驱动
:::tip
虽然参考的文章说需要修改几个文件, 但是本文撰写时的 20250104 (commit &lt;code&gt;f3c7c7f&lt;/code&gt;) 已内置需要修改的内容, 直接构建安装即可
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone git@github.com:DIGImend/digimend-kernel-drivers.git
cd digimend-kernel-drivers
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编译安装 &lt;code&gt;digimend&lt;/code&gt; 驱动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo make dkms_install
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;在 Linux 高版本内核 (个人使用 6.15.x) 时, 由于内核函数被重命名, 造成编译错误, 请参见 &lt;a href=&quot;https://github.com/DIGImend/digimend-kernel-drivers/pull/714&quot;&gt;此 PR&lt;/a&gt; 修改源代码以继续&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;:::warning
如果安装过 &lt;code&gt;digimend&lt;/code&gt; 驱动, 须先行卸载:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo make dkms_uninstall
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启系统&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
在 Linux 6.13 左右, &lt;code&gt;del_timer_sync&lt;/code&gt; 内核函数改为了 &lt;code&gt;timer_shutdown_sync&lt;/code&gt;, 导致需要对如下文件进行如下修改&lt;/p&gt;
&lt;p&gt;打开如下文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hid-uclogic-core.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在第 494 行左右 (或者搜索 &lt;code&gt;del_timer_sync&lt;/code&gt;), 将 &lt;code&gt;del_timer_sync&lt;/code&gt; 修改为 &lt;code&gt;timer_shutdown_sync&lt;/code&gt;, 类似:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;timer_shutdown_sync(&amp;amp;drvdata-&amp;gt;inrange_timer);
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h2&gt;扩展&lt;/h2&gt;
&lt;p&gt;一些推荐的软件&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;介绍&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Xournal++&lt;/td&gt;
&lt;td&gt;一款笔记软件&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://xournalpp.github.io/&quot;&gt;https://xournalpp.github.io/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Krita&lt;/td&gt;
&lt;td&gt;KDE 旗下的一款自由开源且免费的专业绘画软件&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://krita.org/&quot;&gt;https://krita.org/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input Remapper&lt;/td&gt;
&lt;td&gt;适用于 Linux 的按键隐射, 输入设备行为修改软件&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/sezanzeb/input-remapper&quot;&gt;https://github.com/sezanzeb/input-remapper&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复在 ArchLinux (KDE) 下, VMWare 会导致 `Ctrl` 键一直被按下</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/vmware/fix-ctrl-always-pressed/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/vmware/fix-ctrl-always-pressed/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;猜测原因&lt;/h2&gt;
&lt;p&gt;VMWare 试图 hook &lt;code&gt;Ctrl&lt;/code&gt; 键以监听 &lt;code&gt;Hot Key&lt;/code&gt; (从虚拟机里返回的热键), 但是对 &lt;code&gt;Ctrl&lt;/code&gt; 的处理存在问题&lt;/p&gt;
&lt;h2&gt;解决方法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;code&gt;VMware Workstation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;选择菜单项 &lt;code&gt;Edit&lt;/code&gt; &amp;gt; &lt;code&gt;Preferences&lt;/code&gt; (或 使用快捷键 &lt;code&gt;Ctrl + P&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;在弹出的 &lt;code&gt;Preferences&lt;/code&gt; 配置窗口中, 打开 &lt;code&gt;Hot Keys&lt;/code&gt; 子项&lt;/li&gt;
&lt;li&gt;取消对 &lt;code&gt;Ctrl&lt;/code&gt; 键的选定 (&lt;code&gt;Ctrl&lt;/code&gt; 键图标没有被按下)&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>安装 Waydroid</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/waydroid/install/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/waydroid/install/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;步骤参见:&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/casualsnek/waydroid_script&quot;&gt;https://github.com/casualsnek/waydroid_script&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;修复网路&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/waydroid/waydroid/issues/143#issuecomment-1520857943&quot;&gt;https://github.com/waydroid/waydroid/issues/143#issuecomment-1520857943&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(解释) 运行如下脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo sed -i~ -E &apos;s/=.\$\(command -v (nft|ip6?tables-legacy).*/=/g&apos; \
     /usr/lib/waydroid/data/scripts/waydroid-net.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;运行 &lt;code&gt;waydroid prop set &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;&lt;/code&gt; 失败&lt;/h2&gt;
&lt;p&gt;手动编辑 &lt;code&gt;/var/lib/waydroid/waydroid_base.prop&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;使用 NVIDIA 显卡&lt;/h2&gt;
&lt;p&gt;参考 &lt;a href=&quot;https://github.com/Shiro836/waydroid-nvidia&quot;&gt;https://github.com/Shiro836/waydroid-nvidia&lt;/a&gt; README 安装&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
对于带有核显的笔记本请开启独显直连, 台式机请将显示器插在独显上&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;!-- :::warning
修改后如果出现:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;❯ waydroid show-full-ui
[17:41:23] Failed to get service waydroidplatform, trying again...
[17:41:24] Failed to get service waydroidplatform, trying again...
[17:41:25] Failed to get service waydroidplatform, trying again...
[17:41:26] Failed to get service waydroidplatform, trying again...
[17:41:27] Failed to get service waydroidplatform, trying again...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请恢复修改的属性至默认值 (禁用 NVIDIA 加速)
:::&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/waydroid/waydroid/issues/278#issuecomment-1015633023&quot;&gt;https://github.com/waydroid/waydroid/issues/278#issuecomment-1015633023&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意: 不要直接修改, 请先将默认值备份 --&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;无法登陆 Google 账户&lt;/h2&gt;
&lt;p&gt;前往如下网站填入 &lt;code&gt;Google服务框架 Android ID&lt;/code&gt; (使用 &lt;code&gt;waydroid_script&lt;/code&gt; 可以获取)
&lt;a href=&quot;https://www.google.com/android/uncertified/?pli=1&quot;&gt;https://www.google.com/android/uncertified/?pli=1&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;共享剪切板&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/waydroid/waydroid/issues/1113#issuecomment-2468967358&quot;&gt;https://github.com/waydroid/waydroid/issues/1113#issuecomment-2468967358&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/waydroid/waydroid/issues/1113#issuecomment-2513210548&quot;&gt;https://github.com/waydroid/waydroid/issues/1113#issuecomment-2513210548&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;部分应用不支持鼠标事件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.bazzite.gg/Installing_and_Managing_Software/Waydroid_Setup_Guide/#mouse-clicks-to-touch-input&quot;&gt;https://docs.bazzite.gg/Installing_and_Managing_Software/Waydroid_Setup_Guide/#mouse-clicks-to-touch-input&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;waydroid prop set persist.waydroid.fake_touch &quot;&amp;lt;app-id&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中, &lt;code&gt;app-id&lt;/code&gt; 为软件包名或包名通配符 (例如 &lt;code&gt;&quot;com.example.app.*&quot;&lt;/code&gt;), 使用该命令启用 Waydroid Mouse-Touch 转换&lt;/p&gt;
&lt;p&gt;如果仍未成功, 可以尝试在宿主机系统内 (Linux 内) 就产生触控事件, 例如使用数位板点击&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>修复 VSCode 中, `zsh` 终端无法找到某些从 `.zshrc` 中加载的命令</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/vscode/fix-command-not-found/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/vscode/fix-command-not-found/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;问题&lt;/h2&gt;
&lt;p&gt;本人在使用 &lt;code&gt;nvm&lt;/code&gt; 安装的 &lt;code&gt;Node.JS&lt;/code&gt; 的包管理器 &lt;code&gt;pnpm&lt;/code&gt; 在 VSCode 中调试时, 发现环境变量没有被加载造成 &lt;code&gt;pnpm&lt;/code&gt; 可执行文件无法被找到&lt;/p&gt;
&lt;h2&gt;修复&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;zsh&lt;/code&gt; 的 Shell Profile 中的 &lt;code&gt;args&lt;/code&gt; 参数添加 &lt;code&gt;[&quot;-l&quot;, &quot;-i&quot;]&lt;/code&gt; (&lt;code&gt;-i&lt;/code&gt; 更为重要) 即可解决&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参见 &lt;a href=&quot;https://github.com/microsoft/vscode/issues/143061#issuecomment-1042785423&quot;&gt;https://github.com/microsoft/vscode/issues/143061#issuecomment-1042785423&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>部署 Gitea 主题: `snowykami` 和 `liteyuki-magipoke`</title><link>https://aka.lovemilk.top/t/giteatheme/snowykam</link><guid isPermaLink="true">https://aka.lovemilk.top/t/giteatheme/snowykam</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;主题项目仓库地址: &lt;a href=&quot;https://github.com/snowykami/gitea-themes&quot;&gt;https://github.com/snowykami/gitea-themes&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;复制文件&lt;/h2&gt;
&lt;p&gt;将上述仓库的 &lt;code&gt;data/custom&lt;/code&gt; 下所有文件或目录复制至 &lt;code&gt;$GITEA_CUSTOM&lt;/code&gt; 所指向的目录, 形成如下目录结构 (&lt;code&gt;...&lt;/code&gt; 代表其他文件或目录)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果是默认配置的 docker 部署, 则位于 container 内部的 &lt;code&gt;/data/gitea&lt;/code&gt; (直接复制至 &lt;code&gt;&amp;lt;/data映射的路径&amp;gt;/gitea&lt;/code&gt; 即可)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;.
├── git
│   └── ...
├── gitea
│   ├── public  # 仓库的 `data/custom/public` 文件夹
│   ├── templates  # 仓库的 `data/custom/templates` 文件夹
│   ├── conf
│   │   └── app.ini  # 下一步要修改的配置文件
│   └── ...
└── ssh
    └── ...
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;上述目录结构为 docker container 内部的 &lt;code&gt;/data&lt;/code&gt; 映射文件夹的 &lt;code&gt;tree&lt;/code&gt;, 其他方式部署的 Gitea 应保证 &lt;code&gt; $GITEA_CUSTOM&lt;/code&gt; 所指向目录的结构与上述 &lt;code&gt;gitea/&lt;/code&gt; 目录下结构相同&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;修改配置文件 (位于 &lt;code&gt;$GITEA_CUSTOM/conf/app.ini&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;ui.THEMES&lt;/code&gt; 添加 &lt;code&gt;snowykami,liteyuki-magipoke&lt;/code&gt;, 如果没有安装其他第三方主题, 复制粘贴如下内容即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ui]
THEMES = snowykami,liteyuki-magipoke,gitea-auto,gitea-light,gitea-dark
# 可选, 修改为你想要的默认主题 (liteyuki-magipoke 为蓝色系, snowykami 为粉色系)
DEFAULT_THEME = liteyuki-magipoke
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;重启 Gitea 即可应用配置&lt;/h2&gt;
&lt;h1&gt;修改主题&lt;/h1&gt;
&lt;h2&gt;禁用单击弹出文字&lt;/h2&gt;
&lt;p&gt;按照 HTML 格式删除 &lt;code&gt;templates/base/head.tmpl&lt;/code&gt; 中的 64-113 行&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如文件有变动请删除文件内 &lt;code&gt;// 创建雪花容器&lt;/code&gt; 所在函数 即可禁用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;修改页脚&lt;/h2&gt;
&lt;p&gt;按照 HTML 格式修改 &lt;code&gt;templates/base/footer_content.tmpl&lt;/code&gt;&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>VRChat 同步配置 (需要注册表)</title><link>https://aka.lovemilk.top/notes/posts/apps/linux/steam/vrchat/sync-config/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/apps/linux/steam/vrchat/sync-config/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;VRChat 的全部配置项位于注册表 &lt;code&gt;HKEY_CURRENT_USER\Software\VRChat\VRChat&lt;/code&gt;&lt;br /&gt;
(注册表数据库文件则位于 &lt;code&gt;%USERPROFILE%\NTUSER.DAT&lt;/code&gt;[^path2reg])&lt;/p&gt;
&lt;p&gt;[^path2reg]: 即 &lt;code&gt;C:\Users\&amp;lt;USERNAME&amp;gt;\NTUSER.DAT&lt;/code&gt;, 其中 &lt;code&gt;&amp;lt;USERNAME&amp;gt;&lt;/code&gt; 字样是你的 Windows 账户名&lt;br /&gt;
(若使用在线微软帐户登录, 则为你微软帐户邮箱的前几位)&lt;/p&gt;
&lt;h2&gt;修复&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;将上述注册表位置到导出 &lt;code&gt;.reg&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;找到 &lt;code&gt;&amp;lt;compatdata&amp;gt;/438100/pfx&lt;/code&gt; 文件夹 其中, &lt;code&gt;438100&lt;/code&gt; 是 VRChat 的 APPID / &lt;a href=&quot;../../compatdata/#%E6%8F%8F%E8%BF%B0&quot;&gt;获取 &lt;code&gt;compatdata&lt;/code&gt; 文件夹位置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;打开上述文件夹的 &lt;code&gt;user.reg&lt;/code&gt; 文件, 找到 &lt;code&gt;[Software\\VRChat\\VRChat]&lt;/code&gt; 字样 (如果没有请在任意空白位置自行创建), 替换下方字段内的内容为导出的 &lt;code&gt;.reg&lt;/code&gt; 文件的内容 (不包括 &lt;code&gt;Windows Registry Editor Version&lt;/code&gt; 开头的和 &lt;code&gt;[HKEY_...]&lt;/code&gt; 的内容 (&lt;code&gt;...&lt;/code&gt; 代表任意字符))&lt;/li&gt;
&lt;li&gt;启动 VRChat 方可&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>6. 直线与圆的方程公式整理</title><link>https://aka.lovemilk.top/notes/posts/subjects/math/20250321-6-%E7%9B%B4%E7%BA%BF%E4%B8%8E%E5%9C%86%E7%9A%84%E6%96%B9%E7%A8%8B%E5%85%AC%E5%BC%8F%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/subjects/math/20250321-6-%E7%9B%B4%E7%BA%BF%E4%B8%8E%E5%9C%86%E7%9A%84%E6%96%B9%E7%A8%8B%E5%85%AC%E5%BC%8F%E6%95%B4%E7%90%86/</guid><pubDate>Fri, 21 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;参考文档
&lt;a href=&quot;https://oi-wiki.org/tools/latex/#%E6%8F%92%E5%85%A5%E5%85%AC%E5%BC%8F&quot;&gt;https://oi-wiki.org/tools/latex/#插入公式&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;版权声明 / Copyright&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://aka.lovemilk.top/67&quot;&gt;Copyright © 2025 Lovemilk, Some Rights Reserved.&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;根基: 两点间距离公式&lt;/h2&gt;
&lt;p&gt;$$
|AB| = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2}
$$&lt;/p&gt;
&lt;p&gt;其中, $|AB|$ 可用于表示线段长度&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$x_2$ 与 $x_1$&lt;/td&gt;
&lt;td&gt;分别为两点的横坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$y_2$ 与 $y_1$&lt;/td&gt;
&lt;td&gt;分别为两点的对应纵坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
$x$ 与 $y$ 的顺序应当对应&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;线段中点公式&lt;/h2&gt;
&lt;p&gt;$$
x_0 = \frac{x_1+x_2}{2}
\
y_0 = \frac{y_1+y_2}{2}
$$&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$x_1$ 与 $x_2$&lt;/td&gt;
&lt;td&gt;分别为两点的横坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$y_1$ 与 $y_2$&lt;/td&gt;
&lt;td&gt;分别为两点的对应纵坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$x_0$&lt;/td&gt;
&lt;td&gt;中点横坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$y_0$&lt;/td&gt;
&lt;td&gt;中点纵坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;即&lt;/p&gt;
&lt;p&gt;$$
C(\frac{x_1+x_2}{2}, \frac{y_1+y_2}{2})
$$&lt;/p&gt;
&lt;p&gt;其中, $C$ 为线段 $(x_1, y_1)(x_2, y_2)$ 中点&lt;/p&gt;
&lt;h2&gt;直线&lt;/h2&gt;
&lt;h3&gt;直线斜率公式&lt;/h3&gt;
&lt;p&gt;$$
k = \frac{y_2-y_1}{x_2-{x_1}}
$$&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$x_2$ 与 $x_1$&lt;/td&gt;
&lt;td&gt;分别为同一直线两点的横坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$y_2$ 与 $y_1$&lt;/td&gt;
&lt;td&gt;分别为同一直线两点的对应纵坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$k$&lt;/td&gt;
&lt;td&gt;该直线的斜率&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;直线点斜式&lt;/h3&gt;
&lt;p&gt;$P_0(x_0, y_0)$ 为直线上一点, 直线点斜式可表示为&lt;/p&gt;
&lt;p&gt;$$
y-y_0 = k(x-x_0)
$$&lt;/p&gt;
&lt;p&gt;或&lt;/p&gt;
&lt;p&gt;$$
x=x_0\ \text{(限\ k\ 不存在时)}
$$&lt;/p&gt;
&lt;p&gt;当 $k = 0$ 时, 直线与 x 轴平行, 为了方便表示, 我们也可以直接写为 $y = y_0$&lt;/p&gt;
&lt;p&gt;如下表格提供了 倾斜角 $\alpha$ 与 $k$ 的关系 (即 $k = \tan(\alpha)$)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;$\alpha$&lt;/th&gt;
&lt;th&gt;$k$&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$30\degree$ / $\frac{\pi}{6}$&lt;/td&gt;
&lt;td&gt;$\frac{1}{\sqrt{3}}$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$45\degree$ / $\frac{\pi}{4}$&lt;/td&gt;
&lt;td&gt;$1$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$60\degree$ / $\frac{\pi}{3}$&lt;/td&gt;
&lt;td&gt;$\sqrt{3}$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$90\degree$&lt;/td&gt;
&lt;td&gt;$Infinity$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$120\degree$ / $\frac{2\pi}{3}$&lt;/td&gt;
&lt;td&gt;$-\sqrt{3}$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$135\degree$ / $\frac{3\pi}{4}$&lt;/td&gt;
&lt;td&gt;$-1$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$150\degree$ / $\frac{5\pi}{6}$&lt;/td&gt;
&lt;td&gt;$-\frac{1}{\sqrt{3}}$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;直线斜截式&lt;/h3&gt;
&lt;p&gt;$$
y = kx + b
$$&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$k$&lt;/td&gt;
&lt;td&gt;该直线的斜率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$b$&lt;/td&gt;
&lt;td&gt;该直线相较于 $y = kx$ 在竖直方向上移动的偏移量, 即 y 轴截距&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
将 $b$ 视为偏移量是为了我比较方便理解, 并且更易直接读出该直线的平行线&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;$k$, $b$ 的几何意义&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;$k$ 的大小&lt;/th&gt;
&lt;th&gt;直线状态&lt;/th&gt;
&lt;th&gt;图像&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$k &amp;gt; 0$&lt;/td&gt;
&lt;td&gt;直线向上倾斜, 即在 $x \in R$ 函数值单调递增&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;/math-svg/y=x+2.svg&quot; alt=&quot;y=x+2&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$k = 0$&lt;/td&gt;
&lt;td&gt;直线平行或重合与 x 轴&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$k &amp;lt; 0$&lt;/td&gt;
&lt;td&gt;直线向下倾斜, 即在 $x \in R$ 函数值单调递减&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;/math-svg/y=-x+2.svg&quot; alt=&quot;y=-x+2&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;直线一般式&lt;/h3&gt;
&lt;p&gt;$$
Ax+By+C=0\ \text{(} A, B \text{不同时为} 0 \text{)}
$$&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$A$&lt;/td&gt;
&lt;td&gt;含 $x$ 项系数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$B$&lt;/td&gt;
&lt;td&gt;含 $y$ 项系数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$C$&lt;/td&gt;
&lt;td&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;表达式&lt;/th&gt;
&lt;th&gt;结果意义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$-\frac{A}{B}$&lt;/td&gt;
&lt;td&gt;该直线斜率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$-\frac{C}{B}$&lt;/td&gt;
&lt;td&gt;该直线相较于 $y = kx$ 在竖直方向上移动的偏移量&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;平行(直)线&lt;/h3&gt;
&lt;p&gt;当两直线平行, 直线斜截式 $k_1 = k_2$ 且 $b_1 \neq b_2$&lt;br /&gt;
其中, $k_&lt;em&gt;$ 为两直线斜率, $b_&lt;/em&gt;$为两直线相较于 $y = kx$ 在竖直方向上移动的偏移量&lt;/p&gt;
&lt;p&gt;或&lt;/p&gt;
&lt;p&gt;对于直线一般式, $A_1B_2-A_2B_1 = 0$ 且 $-\frac{C_1}{B_1} \neq -\frac{C_2}{B_2}$&lt;br /&gt;
其中, $A_&lt;em&gt;$ $B_&lt;/em&gt;$ $C_*$ 分别为两直线一般式的 $A$ $B$ $C$&lt;/p&gt;
&lt;h3&gt;平行线间距离&lt;/h3&gt;
&lt;p&gt;在 $k_1 = k_2$ 时, 两平行线距离 $d$ 为&lt;/p&gt;
&lt;p&gt;$$
d = |b_1 - b_2|
$$&lt;/p&gt;
&lt;p&gt;其中, $b_*$ 为两直线相较于 $y = kx$ 在竖直方向上移动的偏移量, 即 y 轴截距&lt;/p&gt;
&lt;p&gt;或&lt;/p&gt;
&lt;p&gt;平行线 $Ax+By+C_1$ 与 $Ax+By+C_2$ 且 $A$, $B$ 同时相等时, 两平行线距离 $d$ 为&lt;/p&gt;
&lt;p&gt;$$
d = \frac{|C_1 - C_2|}{\sqrt{A^2+B^2}}
$$&lt;/p&gt;
&lt;h3&gt;两直线交点&lt;/h3&gt;
&lt;p&gt;因两直线交点的坐标同时满足两个直线表达式, 且 $k$ 不相等的两直线有且仅有一个交点,
故直接将两直线联立方程组, 解出的 $x$, $y$ 即为交点 $P(x, y)$&lt;/p&gt;
&lt;p&gt;$$
\left{
\begin{array}{l}
A_1x+B_1y+C_1 = 0 \
A_2x+B_2y+C_2 = 0
\end{array}
\right.
$$&lt;/p&gt;
&lt;h3&gt;两直线垂直&lt;/h3&gt;
&lt;p&gt;当两直线垂直时, $k_1 \times k_2 = -1$&lt;br /&gt;
其中, $k_1$, $k_2$ 分别为两直线斜率, 乘积为 $-1$&lt;/p&gt;
&lt;p&gt;或对于直线一般式&lt;/p&gt;
&lt;p&gt;$$
\frac{A_1A_2}{B_1B_2} = -1
$$&lt;/p&gt;
&lt;h3&gt;点到直线距离&lt;/h3&gt;
&lt;p&gt;$$
d = \frac{|Ax_0+By_0+C|}{\sqrt{A^2+B^2}}
$$&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$A$, $B$, $C$&lt;/td&gt;
&lt;td&gt;见 &lt;a href=&quot;#%E7%9B%B4%E7%BA%BF%E4%B8%80%E8%88%AC%E5%BC%8F&quot;&gt;直线一般式&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$x_0$&lt;/td&gt;
&lt;td&gt;目标点的横坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$y_0$&lt;/td&gt;
&lt;td&gt;目标点的纵坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;圆&lt;/h2&gt;
&lt;h3&gt;圆的标准方程&lt;/h3&gt;
&lt;p&gt;$$
(x-a)^2+(y-b)^2 = r^2
$$&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$a$&lt;/td&gt;
&lt;td&gt;圆心横坐标 (x 坐标)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$b$&lt;/td&gt;
&lt;td&gt;圆心纵坐标 (y 坐标)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$r$&lt;/td&gt;
&lt;td&gt;该圆半径&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;圆的一般方程&lt;/h3&gt;
&lt;p&gt;当 $D^2+E^2-4F &amp;gt; 0$ 时, 如下表达式可代表圆&lt;br /&gt;
当 $D^2+E^2-4F = 0$ 时, 如下表达式可代表点 ($-\frac{D}{2}$, $-\frac{E}{2}$)&lt;/p&gt;
&lt;p&gt;$$
x^2+y^2+Dx+Ey+F=0
$$&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$D$&lt;/td&gt;
&lt;td&gt;含 $x$ 项系数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$E$&lt;/td&gt;
&lt;td&gt;含 $y$ 项系数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$F$&lt;/td&gt;
&lt;td&gt;常数项总和&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;圆心为($-\frac{D}{2}$, $-\frac{E}{2}$)&lt;br /&gt;
圆的半径则为 $\frac{1}{2}\sqrt{D^2+E^2-4F}$&lt;br /&gt;
或使用配方法转换为 &lt;a href=&quot;#%E5%9C%86%E7%9A%84%E6%A0%87%E5%87%86%E6%96%B9%E7%A8%8B&quot;&gt;圆的标准方程&lt;/a&gt; 直接看出半径和圆心&lt;/p&gt;
&lt;h3&gt;圆与点/直线的位置关系&lt;/h3&gt;
&lt;p&gt;参考 &lt;a href=&quot;#%E6%A0%B9%E5%9F%BA-%E4%B8%A4%E7%82%B9%E9%97%B4%E8%B7%9D%E7%A6%BB%E5%85%AC%E5%BC%8F&quot;&gt;根基: 两点间距离公式&lt;/a&gt; 和
&lt;a href=&quot;#%E7%82%B9%E5%88%B0%E7%9B%B4%E7%BA%BF%E8%B7%9D%E7%A6%BB&quot;&gt;点到直线距离&lt;/a&gt;, 将圆心视为目标点, 后判断 $d$ 与 $r$ 的关系&lt;br /&gt;
$d &amp;gt; r$ 在圆外/相离&lt;br /&gt;
$d = r$ 在圆上/相切&lt;br /&gt;
$d &amp;lt; r$ 在圆内/相交&lt;/p&gt;
&lt;h3&gt;求过圆上一点圆的切线表达式&lt;/h3&gt;
&lt;p&gt;$$
(x_0 - a)(x - a) + (y_0 - b)(y - b) = r^2
$$&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$x_0$&lt;/td&gt;
&lt;td&gt;圆上点的横坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$y_0$&lt;/td&gt;
&lt;td&gt;圆上点的纵坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$a$, $b$, $r$&lt;/td&gt;
&lt;td&gt;见 &lt;a href=&quot;#%E5%9C%86%E7%9A%84%E6%A0%87%E5%87%86%E6%96%B9%E7%A8%8B&quot;&gt;圆的标准方程&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;后将 $r^2$ 视为常数, 化简即可得到直线的表达式&lt;/p&gt;
&lt;h3&gt;过某点求圆的切线表达式&lt;/h3&gt;
&lt;p&gt;先求出圆心, 后判断 &lt;a href=&quot;#%E5%9C%86%E4%B8%8E%E7%82%B9/%E7%9B%B4%E7%BA%BF%E7%9A%84%E4%BD%8D%E7%BD%AE%E5%85%B3%E7%B3%BB&quot;&gt;圆与点的位置关系&lt;/a&gt;&lt;br /&gt;
若点在圆内, 则无切线&lt;br /&gt;
若点在圆上, 按照 &lt;a href=&quot;#%E6%B1%82%E8%BF%87%E5%9C%86%E4%B8%8A%E4%B8%80%E7%82%B9%E5%9C%86%E7%9A%84%E5%88%87%E7%BA%BF%E8%A1%A8%E8%BE%BE%E5%BC%8F&quot;&gt;求过圆上一点圆的切线表达式&lt;/a&gt;, 求出
&lt;strong&gt;1 条&lt;/strong&gt; 切线&lt;br /&gt;
若点在圆外, 按照如下方法求出 &lt;strong&gt;2 条&lt;/strong&gt; 切线&lt;/p&gt;
&lt;p&gt;$$
y-y_0 = k(x-x_0)
$$&lt;/p&gt;
&lt;p&gt;转为一般式&lt;/p&gt;
&lt;p&gt;$$
kx-y-kx_0+y_0= 0
$$&lt;/p&gt;
&lt;p&gt;$$
d = \frac{|kc_x-c_y-kx_0+y_0|}{\sqrt{k^2+1^2}} = r
$$&lt;/p&gt;
&lt;p&gt;解出 $k$ 方可得出两个直线表达式&lt;/p&gt;
&lt;p&gt;:::tip
若 $k$ 解得仅一个时, 须在题前补充 当 $k \neq Infinity$ ($k$
存在时)&lt;br /&gt;
而 $k = Infinity$ 时的表达式则为 $x = x_0$
:::&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$x_0$, $y_0$&lt;/td&gt;
&lt;td&gt;目标点坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$c_x$, $c_y$&lt;/td&gt;
&lt;td&gt;圆心坐标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$d$&lt;/td&gt;
&lt;td&gt;直线到圆心距离, 由于相切, $d = r$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$r$&lt;/td&gt;
&lt;td&gt;半径&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;相切直线所截弦长&lt;/h3&gt;
&lt;p&gt;$$
l = 2\sqrt{r^2-d^2}
$$&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数标识&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$l$&lt;/td&gt;
&lt;td&gt;弦长&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$d$&lt;/td&gt;
&lt;td&gt;直线到圆心距离&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$r$&lt;/td&gt;
&lt;td&gt;半径&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>20250318 / 202503 语文月考作文</title><link>https://aka.lovemilk.top/notes/posts/passages/20250318_202503%E8%AF%AD%E6%96%87%E6%9C%88%E8%80%83%E4%BD%9C%E6%96%87/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/passages/20250318_202503%E8%AF%AD%E6%96%87%E6%9C%88%E8%80%83%E4%BD%9C%E6%96%87/</guid><pubDate>Tue, 18 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;20250318 202503 语文月考作文&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Copyright: &lt;a href=&quot;https://aka.lovemilk.top/68&quot;&gt;Lovemilk (c) 2025, All Rights Reserved&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&quot;美&quot;为何?&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;－－ 论中國 (大陆) 公民价值观形成原因, 发展现状 与 解决方案&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;随着近现代中國國力与國际地位地不断提高, 人们生活水平的发展, 公民们也渐渐从物质需求转向了精神需求.&lt;/p&gt;
&lt;p&gt;在如今鱼龙混杂的高速信息化时代, 人们得到精神动力的主要方式也渐渐由线下转为线上.&lt;/p&gt;
&lt;p&gt;当今, 中文互联网上不乏出现了包括但不限于 &quot;颜值即正义&quot;, &quot;有意美化 &apos;黄色&apos;&quot;的价值观, 引发很大一部分人的关注.&lt;/p&gt;
&lt;p&gt;如下, 为我代表我自己个人对该些价值观的形成原因的总结, 知其因方可善其本.&lt;/p&gt;
&lt;p&gt;不当价值观的形成与自身人口素质程度有关. 目前, 我國仍处于也将长期处于社会主义初级阶段, 所形成的发展不平衡不充分, 导致区域发展水平差异较大, 造成了不同地区人口知识面, 认知能力差异巨大, 从而使得部分人口素质低下, 发表观点时明辨是非能力较弱.&lt;/p&gt;
&lt;p&gt;家庭教育是人身心发展的重要一环. 良好的家庭教育, 和睦的家庭环境, 可从下树立正确的价值观与行为处事方法. 但是, 家长若缺乏教育, 人口素质不高没有足够认知能力教导孩子, 或没有能力以恰当方式引导孩子, 也正在无形间, 给祖國的未来们种下了许多不好的种子.&lt;/p&gt;
&lt;p&gt;地区发展水平, 教育水平, 教育内容的差异 和/或 欠缺也是不当价值观未能及时阻止或制止其发展的主要原因之一. 我们从小就有个中國梦－－一同完成中华民族的伟大复兴. 可发展与教育水平的差异, 一次又一次地扩大了现实与梦想的鸿沟. 个人的梦想亦是如此, 现实与梦想间的巨大差距, 使得人们看不清看不到未来的希望, 在不断失落与堕落中, 不得接受一些&quot;不恰当&quot;的精神信仰以&quot;放松身心&quot;, 却不知是这些造就了不自知是否荒谬的畸形价值观.&lt;/p&gt;
&lt;p&gt;但这一切, 终能改变, 也终会改变. 人们从法國巴黎奥运会上运动员们的赞扬, 便是人们价值观觉醒的最佳证明!&lt;/p&gt;
&lt;p&gt;如今, 新时代的中华文化不断发展与全球性传播, 人们的审美水平不断提升, 即使尚未达到全体公民人口素质均有正确价值观, 这也是巨大成就了.&lt;/p&gt;
&lt;p&gt;我们要与國际一同努力, 从多方位, 全角度, 既考虑人们自身的不足, 也考虑國家相关制度是否尚未完善, 个体
, 团体 &quot;两手抓&quot;, 不断提高劳动人民地位与劳动人民最光荣的意识, 在公民心中树立正确的价值观, 反对资本主义势力掌握权力, 不断缩减区域间发展水平的差异, 就能提升全体公民人口素质, 更能实现中华民族伟大复兴!&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>20250227 | a bad day of *the way to success*</title><link>https://aka.lovemilk.top/notes/posts/weekly-articles/20250227/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/weekly-articles/20250227/</guid><pubDate>Thu, 27 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;20250227 | a bad day of &lt;em&gt;the way to success&lt;/em&gt;&lt;/h1&gt;
&lt;p&gt;又是细雨蒙蒙的早上, 天阴沉着, 她的心大抵也是.&lt;/p&gt;
&lt;p&gt;昨日莫名的反感, 大抵是今日和未来的缩影罢了.&lt;/p&gt;
&lt;p&gt;时光稍过了些, 到了大课间之后, 天还是阴着, 不过雨也从刚刚不知为何的花洒般的较大的雨停了下来.&lt;/p&gt;
&lt;p&gt;今天换了挺多课, 下午的两节信息连在了一起.&lt;/p&gt;
&lt;p&gt;很正常的上午, 超正常的午饭, 甚至还多了几分好吃.&lt;/p&gt;
&lt;p&gt;信息课上意料之外的抽背, 打乱了一切思绪. 太阳, 以及我心中的太阳, 虽冉冉照耀在校园的每个角落, 身上暖暖的, 可我的心, 却仍旧是那么, 那么的心烦意乱.&lt;/p&gt;
&lt;p&gt;倒也不是说全因为抽背, 或许是专业知识的错误讲述与举例, 激发了内心的不甘.&lt;/p&gt;
&lt;p&gt;体育课的自由散漫, 心也变得自由散漫了罢... 思绪飞到万众瞩目的地方, 却只能灰溜溜地逃走, 还是会不甘心罢.&lt;/p&gt;
&lt;p&gt;大家的期望, 自己对大家期望的期望, 依然成为身上的砝码, 无法喘息.&lt;/p&gt;
&lt;p&gt;或许, 在将来某刻, 成功终会照耀于大地, 不过亲眼看见与否, 就只有天地可以回答了罢. 当下能力还是太弱小了, 缺少独立思考的思想, 终是没有灵魂的.&lt;/p&gt;
&lt;p&gt;就像大家, 应试得没有了灵魂.&lt;/p&gt;
&lt;p&gt;归途时的沉默寡言便是气愤的最好应证了.&lt;/p&gt;
&lt;p&gt;哎, 愿征途, 终能抵达星辰大海吧...&lt;/p&gt;
&lt;p&gt;我们终会成为星辰, 成为曾向往的一部分.&lt;/p&gt;
</content:encoded><copyright><name>All Rights Reserved</name><url>https://aka.lovemilk.top/68</url></copyright></item><item><title>20240906 / 少年应有的, 现实残酷的</title><link>https://aka.lovemilk.top/notes/posts/passages/20240906_%E6%81%B0%E5%B0%91%E5%B9%B4/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/passages/20240906_%E6%81%B0%E5%B0%91%E5%B9%B4/</guid><pubDate>Fri, 06 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;20240906 少年应有的, 现实残酷的&lt;/h1&gt;
&lt;p&gt;我们即少年.&lt;br /&gt;
曾向往过成人之后的 &quot;无忧无虑&quot;,&lt;br /&gt;
也希望能有自己的一片天空.&lt;/p&gt;
&lt;p&gt;但现实,&lt;br /&gt;
重击了少年们,&lt;br /&gt;
以及他们的心灵.&lt;/p&gt;
&lt;p&gt;在温室大棚下生长的他们,&lt;br /&gt;
受到了精心呵护,&lt;br /&gt;
但也忘记了何为危险, 何为自由.&lt;/p&gt;
&lt;p&gt;不过也因恰逢少年,&lt;br /&gt;
有着远大志向的他们,&lt;br /&gt;
怀揣着一颗 &lt;em&gt;冲出大棚, 拥抱蓝天&lt;/em&gt; 的野心.&lt;/p&gt;
&lt;p&gt;齐心协力,&lt;br /&gt;
万众一心,&lt;br /&gt;
属于少年的,&lt;br /&gt;
终能得到, 也终将得到.&lt;/p&gt;
&lt;p&gt;恰逢少年,&lt;br /&gt;
一同努力,&lt;br /&gt;
让年少重获自由,&lt;br /&gt;
让成人之后的, 变成它应有的模样.&lt;/p&gt;
&lt;p&gt;让我们一起,&lt;br /&gt;
走出独属于我们自己的路!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;https://aka.lovemilk.top/67&quot;&gt;Some Rights Reversed. Copyright (c) 2024, lovemilk&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>20240608 / 成就更好的自己</title><link>https://aka.lovemilk.top/notes/posts/passages/20240608_%E6%88%90%E5%B0%B1%E6%9B%B4%E5%A5%BD%E7%9A%84%E8%87%AA%E5%B7%B1/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/passages/20240608_%E6%88%90%E5%B0%B1%E6%9B%B4%E5%A5%BD%E7%9A%84%E8%87%AA%E5%B7%B1/</guid><pubDate>Sat, 08 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;20240608 成就更好的自己&lt;/h1&gt;
&lt;h3&gt;成就更好的自己需要努力&lt;/h3&gt;
&lt;p&gt;努力是梦想与现实的桥梁, 适当的努力可以磨练意志, 提升自信心, 为更好的自己打下坚实基础.&lt;/p&gt;
&lt;h3&gt;努力须要以自身肉体承载能力为基础&lt;/h3&gt;
&lt;p&gt;试想一下, 当明天就要中考了, 你是否会更为紧迫地复习, 很晚才睡觉? 但当明日真正位于考场之上, 满面的倦意, 使你无法思考.&lt;/p&gt;
&lt;p&gt;就想我国著名运动员 刘翔 在 2008 年北京奥运会这个举世瞩目的赛场上不得不遗憾退场, 正是因为刘翔在 &quot;八步改七步&quot; 的问题上, 与师傅孙海平存在分歧[^1], 再加上刘翔有伤在身, 赛前的高强度训练, 导致跟腱受伤, 才无法继续的.&lt;/p&gt;
&lt;p&gt;想反, 适量努力可以标准自身健康的前提下锻炼自我, 前任世界资金储备最多公司 Micorosft 创始人 比尔·盖茨 在创业初期也曾面临高强度的工作, 但其注重创新而非一味的努力, 讲究以科学适度的方法, 合理分配工作时间, 注重休息和家庭生活, 终在事业上取得巨大成功.[^2]&lt;/p&gt;
&lt;p&gt;作为中学生的我们, 应当以自身肉体承载能力为基础, 独立思考, 劳逸结合.&lt;/p&gt;
&lt;h3&gt;努力须要以客观规律为准则&lt;/h3&gt;
&lt;p&gt;努力要以客观规律为准则, 不能弄虚作假, 更不能&quot;暴饮暴食&quot;地努力.&lt;/p&gt;
&lt;p&gt;2014 年 1 月 29 日, 日本理化学研究所细胞再造实验室的研究团队负责人小保方晴子在英国《自然》杂志上发表的两篇论文引发了全球干细胞学界的关注, 在论文中她表示发现了一种能更简便培养多能干细胞 (STAP) 的方法, 这预示着未来像更换零件一样简单的器官移植成为可能, 一时引起了极大的轰动. 但是很快, 有科学家指出论文有造假嫌疑, 可是在几乎所有参与鉴定的科学家都认定论文造假的同时, 小保方晴子仍然坚称 STAP 制取方法真的存在, 其为自证清白, 与日本理化学研究所达成协议, 从 7 月 1 日起在实验室 24 小时监控下进行验证实验. 同时, 委托另一名科学家在另一间实验室独立验证. 8 月 5 日, 小保方晴子的导师、也是论文的共同作者笹井芳树顶不住舆论的压力自缢身亡. 11 月 30 日, STAP 验证实验提前结束. 12 月 19 日, 日本理化学研究所发布声明: &quot;验证未能确认 STAP 现象, 所以验证计划终止.&quot;&lt;/p&gt;
&lt;p&gt;小保方晴子 为了自己的名利, 对关乎人类医学命运的论文/学术弄虚作假, 违反自然客观规律, 是不可被大家原谅的. 作为中学生的我们, 应当以客观规律为准则, 不盲目进取, 一步一个脚印逐级提升自我, 不违背客观事物发展规律, 不要骗了大家, 骗了自己.&lt;/p&gt;
&lt;h3&gt;努力须要以德智体美劳多元全面发展为目标&lt;/h3&gt;
&lt;p&gt;努力, 不是盲目地行动, 更不能为了目标不惜一切, &quot;身体是革命的本钱[^S_1]&quot;, 我们要紧跟多元发展步伐, 以提升自我, 发展多元为努力目标, 在课余时间发展兴趣爱好, 不要因中考的来临丢了一辈子的兴趣, 失去了一辈子的价值.&lt;/p&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;同学们要保证独立思考, 不盲目跟从, 以自己的意志, 适合自己的方式, 适当的劳累程度进行考前复习, 最终提升自我, 成为更好的自己.&lt;/p&gt;
&lt;p&gt;[^1]: &lt;a href=&quot;https://2012.sina.com.cn/cn/at/2012-08-09/072550868.shtml&quot;&gt;https://2012.sina.com.cn/cn/at/2012-08-09/072550868.shtml&lt;/a&gt; 其实早有消息称, 在“八步改七步”的问题上, 刘翔与师傅孙海平存在分歧.
[^2]: &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E6%AF%94%E5%B0%94%C2%B7%E7%9B%96%E8%8C%A8&quot;&gt;https://zh.wikipedia.org/wiki/比尔·盖茨&lt;/a&gt;
[^3]: &lt;a href=&quot;http://www.ipe.cas.cn/dzqk/2017/201705/mtsm/201704/t20170412_4773950.html&quot;&gt;http://www.ipe.cas.cn/dzqk/2017/201705/mtsm/201704/t20170412_4773950.html&lt;/a&gt;
[^S_1]: &lt;a href=&quot;https://baike.baidu.com/item/%E8%BA%AB%E4%BD%93%E6%98%AF%E9%9D%A9%E5%91%BD%E7%9A%84%E6%9C%AC%E9%92%B1/3859562&quot;&gt;https://baike.baidu.com/item/身体是革命的本钱/3859562&lt;/a&gt; 毛泽东的名言，指行动的前提条件是必须要有良好的体魄。一个人要想做成一件事，必须具有多方面的素质，但所有这些都必须依托于一个前提条件——要有健康的体魄&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>20240603 / 成就自我 | 魔免自我</title><link>https://aka.lovemilk.top/notes/posts/passages/20240603_%E6%88%90%E5%B0%B1%E8%87%AA%E6%88%91-%E9%AD%94%E5%85%8D%E8%87%AA%E6%88%91/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/passages/20240603_%E6%88%90%E5%B0%B1%E8%87%AA%E6%88%91-%E9%AD%94%E5%85%8D%E8%87%AA%E6%88%91/</guid><pubDate>Mon, 03 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;20240603 成就自我 | 魔免自我&lt;/h1&gt;
&lt;p&gt;努力亦能成就自我, 亦能魔免自我.&lt;/p&gt;
&lt;h3&gt;粗心做事不一定失败, 努力做事能尽量完美.&lt;/h3&gt;
&lt;p&gt;首位女性诺贝尔奖得者 玛丽·居里 通过在实验室简陋的环境[^labOfSkłodowska-Curie]不屑坚持与努力, 历经无数次试验, 最终发现了新元素[^discoverOrInvent]; Apple 前任 CEO 史蒂夫·乔布斯 在年轻时被苹果公司解雇, 但他没有放弃. 他在事业落魄之余创立了 NeXT 和 Pixar 公司, 最终重返苹果并带领公司推出了一系列创新产品, 促使 Apple 公司曾为世界资金储备最多, 规模最大, 市值最高的公司. 这一切, 都依赖努力.&lt;/p&gt;
&lt;p&gt;而 亚历山大·弗莱明 无意间不小心将霉菌孢子掉进含有大量金黄色葡萄球菌培养皿之中, 并在两个月后带其回到实验室时, 发现了培养皿有个角落长了一块青霉菌, 周围却没有细菌滋长. 他意识到了霉菌可能有杀菌作用, 最终发现了青霉素. 青霉素的发现, 完全改变了人类与传染病之间生死搏斗的历史, 人类的平均寿命也得以延长. 这一切, 不依赖努力.&lt;/p&gt;
&lt;p&gt;我其实不赞同努力就能成功. 我认为, 做事无需一心一意与努力, 而认真做事须要. 如果过于认真对待生活中的琐事, 你的精力与身心, 都会俱疲. 须要认真对待就认真, 不须要的完成即可. 人生不长, 对自己好点就好, 不妨默默无名也是最好的自己呢?&lt;/p&gt;
&lt;h3&gt;努力须要以自身肉体承载能力为基础, 以客观规律为准则, 以可持续发展 德智体美劳多元全面发展为目标.&lt;/h3&gt;
&lt;p&gt;试想一下, 在你即为疲倦的时候, 是否还能听得进课呢? 可他们, 那些只为了自己利益而压榨学生的不良教师(特指中部地区内卷严重的学校), 却不管你那么多, 我行我素.&lt;/p&gt;
&lt;p&gt;根据 中国死因监测数据集 2019, 计算出 2019 年我国青少年的自杀率为 2.47/10 万人[^deathOfTeenages]. 在这之中有多少因为学业压力而自我残害的人, 就不得而知了. 2021 年 7 月 24 日, 中共中央办公厅, 国务院办公厅印发《关于进一步减轻义务教育阶段学生作业负担和校外培训负担的意见》[^DoubleReducing](即 &quot;双减政策&quot;), 是否说明至少在我国颁布如上政策前的教育, 存在问题? 那在这之前的学生是否受到了不应当的作业量? 这些我们不得而知, 但如果一味地压榨自我所谓的&quot;潜力&quot;, 或许实则是休息的时间和压垮骆驼的最后一根稻草, 只会让自己身心俱疲.&lt;/p&gt;
&lt;p&gt;努力, 不是盲目地行动, 更不能为了目标不惜一切, &quot;身体是革命的本钱[^S_1]&quot;, 青少年的我们, 应当以自身肉体承载能力为基础, 独立思考, 劳逸结合, 以客观规律为准则, 不盲目进取, 一步一个脚印逐级提升自我, 不违背客观事物发展规律, 以可持续发展 德智体美劳多元全面发展为目标, 在课余时间发展兴趣爱好, 不要因中考的来临丢了一辈子的兴趣, 失去了一辈子的价值.&lt;/p&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;同学们要保证独立思考, 不盲目跟从, 以自己的意志, 适合自己的方式, 适当的劳累程度进行考前复习, 最终提升自我, 成为更好的自己.&lt;/p&gt;
&lt;p&gt;[^labOfSkłodowska-Curie]: &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E7%8E%9B%E4%B8%BD%C2%B7%E5%B1%85%E9%87%8C#%E6%96%B0%E5%85%83%E7%B4%A0&quot;&gt;https://zh.wikipedia.org/wiki/玛丽·居里#新元素&lt;/a&gt; 她 &lt;em&gt;(玛丽·居里)&lt;/em&gt; 没有专业的实验室，她的实验室是大部分研究巴黎高等物理化工学院校园旁的一个棚屋改装而成的。这个棚屋以前是一所医学院的解剖室，通风差，常漏水
[^discoverOrInvent]: 注: 对于已在自然界存在的元素, 不应当使用 &lt;em&gt;发明&lt;/em&gt;, 而应使用 &lt;em&gt;发现&lt;/em&gt;
[^deathOfTeenages]: &lt;a href=&quot;https://cjybyjk.github.io/china_teen_suicide/#%E6%A0%B9%E6%8D%AE%E4%B8%AD%E5%9B%BD%E6%AD%BB%E5%9B%A0%E7%9B%91%E6%B5%8B%E6%95%B0%E6%8D%AE%E9%9B%86-2019%E5%BE%97%E5%88%B0%E7%9A%84%E6%95%B0%E6%8D%AE&quot;&gt;https://cjybyjk.github.io/china_teen_suicide/#根据中国死因监测数据集-2019得到的数据&lt;/a&gt; 笔者根据《中国死因监测数据集 2019》计算出 2019 年我国青少年的自杀率为 2.47/10 万人 (注: 该数据来源于权威机构, 笔者已将其相关文件链接引用在文末, 数据基本可信)
[^DoubleReducing]: &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%8F%8C%E5%87%8F%E6%94%BF%E7%AD%96#2021%E5%B9%B4%E5%8F%8C%E5%87%8F%E6%94%BF%E7%AD%96&quot;&gt;https://zh.wikipedia.org/wiki/双减政策#2021年双减政策&lt;/a&gt; 2021 年 7 月 24 日，中共中央办公厅，国务院办公厅印发《关于进一步减轻义务教育阶段学生作业负担和校外培训负担的意见》
[^S_1]: &lt;a href=&quot;https://baike.baidu.com/item/%E8%BA%AB%E4%BD%93%E6%98%AF%E9%9D%A9%E5%91%BD%E7%9A%84%E6%9C%AC%E9%92%B1/3859562&quot;&gt;https://baike.baidu.com/item/身体是革命的本钱/3859562&lt;/a&gt; 毛泽东的名言，指行动的前提条件是必须要有良好的体魄。一个人要想做成一件事，必须具有多方面的素质，但所有这些都必须依托于一个前提条件——要有健康的体魄&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>20240525 / 用望远镜看世界</title><link>https://aka.lovemilk.top/notes/posts/passages/20240525_%E7%94%A8%E6%9C%9B%E8%BF%9C%E9%95%9C%E7%9C%8B%E4%B8%96%E7%95%8C/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/passages/20240525_%E7%94%A8%E6%9C%9B%E8%BF%9C%E9%95%9C%E7%9C%8B%E4%B8%96%E7%95%8C/</guid><pubDate>Sat, 25 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;20240525 用望远镜看世界&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Touch the world through foresight&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;看, 那最远方的弧线, 便是地平线了. 不过由于地球是一个两极稍扁, 赤道略鼓的球体[^theShapeOfTheEarth], 无论如何即使在晴朗天气, 假设地面海报恒为 0M, 站在海拔 100M 上也只能至多看到远方 38.48 KM 的地方[^geographicalViewingDistance], 就如人生一般, 谁也不知道明天和意外, 谁先来; 谁也不知道, 重大变故, 是否会在下一刻...&lt;/p&gt;
&lt;p&gt;当你通过望远镜远眺世界之时, 由于光路可逆[^ReversibilityOfLight], 世界, 也不妨在眺望你. 生活, 其实没什么可用放大镜和显微镜看的, Instead, 如果你过于细致认真对待它, 你可能会发现它不再纯粹了, 彼时认为的一切美好, 可能已全然消散, 或根本未曾出现过.&lt;/p&gt;
&lt;p&gt;但使用望远镜去看世界, 粗略品味生活, 有意识地忽略不必要的细节, 或许会让你生活地更加美好. 也有事情又何必深究呢? 人情世故的东西没有所谓&quot;标准答案&quot;, 做你想做, 走你想走, 就以你自己的意志, 抵达结局吧! &quot;Can&apos;t make what they say, We&apos;ll find our way, we&apos;ll find our way!&quot;[^Song_HopeIsTheThingWithFeathers], 既然听不懂他们的注解, 那就由我们找寻自己该走的路!&lt;/p&gt;
&lt;p&gt;拿起属于你自己的望远镜, 朝向无尽的远方, 去欣赏吧! 无论提起时是 &quot;我才&quot; 还是 &quot;我曾经&quot;[^BV_BV1os421w738]!&lt;/p&gt;
&lt;p&gt;遍体鳞伤那又怎样, 尝试过, 才能将燃起心中的, 失望.&lt;/p&gt;
&lt;p&gt;[^theShapeOfTheEarth]: https://zh.wikipedia.org/wiki/%E5%9C%B0%E7%90%83#%E5%BD%A2%E6%80%81 地球大致呈椭球形。地球自转的效应使得沿贯穿两极的地轴方向稍扁，赤道附近略有隆起
[^geographicalViewingDistance]: https://baike.baidu.com/item/%E5%9C%B0%E7%90%86%E8%A7%86%E8%B7%9D/4956750 地理视距是目标或来自光源的光当只受地球曲率、大气折射、目标或灯标的海拔高度和观察者的眼高限制时，理论上能被观察者看到的最大距离
[^ReversibilityOfLight]: https://zh.wikipedia.org/wiki/%E5%85%89#%E5%85%89%E8%B7%AF%E5%8F%AF%E9%80%86%E5%8E%9F%E7%90%86 在干涉与衍射可忽略的情况中，入射光线与反射光线的可交换性。就是在一条光径的终点，发出反方向的光，此光可沿原路径回到原来的起点。在介质分界面处应用光路的可逆性可导出关于反射率和折射率的斯托克斯关系。
[^Song_HopeIsTheThingWithFeathers]:
https://zh.moegirl.org.cn/zh-hans/%E5%B8%8C%E6%9C%9B%E6%9C%89%E7%BE%BD%E6%AF%9B%E5%92%8C%E7%BF%85%E8%86%80_Hope_Is_the_Thing_With_Feathers (歌词) Can&apos;t make what they say 既然听不懂他们的注解,
We&apos;ll find our way we&apos;ll find our way 那就由我们找寻自己该走的路&lt;/p&gt;
&lt;p&gt;[^BV_BV1os421w738]: https://www.bilibili.com/video/BV1os421w738?t=4 (歌词, 有改编) 前缀是「我才」还是「我已经」&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>20240502 / 江南似如诗歌, 往日早已不在</title><link>https://aka.lovemilk.top/notes/posts/passages/20240502_%E6%B1%9F%E5%8D%97%E4%BC%BC%E5%A6%82%E8%AF%97%E6%AD%8C-%E5%BE%80%E6%97%A5%E6%97%A9%E5%B7%B2%E4%B8%8D%E5%9C%A8/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/passages/20240502_%E6%B1%9F%E5%8D%97%E4%BC%BC%E5%A6%82%E8%AF%97%E6%AD%8C-%E5%BE%80%E6%97%A5%E6%97%A9%E5%B7%B2%E4%B8%8D%E5%9C%A8/</guid><pubDate>Thu, 02 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;20240502 江南似如诗歌, 往日早已不在&lt;/h1&gt;
&lt;p&gt;&amp;lt;!-- &amp;gt; &amp;lt;iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=330 height=86 src=&quot;//music.163.com/outchain/player?type=2&amp;amp;id=2154102056&amp;amp;auto=0&amp;amp;
height=66&quot;&amp;gt;&amp;lt;/iframe&amp;gt; --&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;背景音乐:
《希望有羽毛和翅膀》&amp;lt;br&amp;gt;
 作曲 Composer: 王可鑫 Eli.W (HOYO-MiX) &amp;lt;br&amp;gt;
 作词 Lyricist: Ruby Qu &amp;lt;br&amp;gt;
 编曲 Arranger: 王可鑫 Eli.W (HOYO-MiX) &amp;lt;br&amp;gt;
 制作人 Producer: 王可鑫 Eli.W (HOYO-MiX) &amp;lt;br&amp;gt;
 人声 Vocal Artist: Chevy &amp;lt;br&amp;gt;
&amp;lt;!-- &amp;gt; &amp;lt;br&amp;gt; --&amp;gt;
&amp;lt;!-- &amp;gt; &amp;lt;audio src=&quot;https://aka.lovemilk.top/res/files/BV1Hz421m7AH_cut.mp4&quot; type=&quot;audio/mp4&quot; oncontextmenu=&quot;return false;&quot; controls controlslist=&quot;nodownload&quot; loop&amp;gt;&amp;lt;/audio&amp;gt; --&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;!-- &amp;gt; &amp;lt;iframe src=&quot;//www.bilibili.com/blackboard/html5mobileplayer.html?autoplay=0&amp;amp;danmaku=0&amp;amp;hasMuteButton=0&amp;amp;hideCoverInfo=1&amp;amp;hideDanmakuButton=1&amp;amp;noFullScreenButton=1&amp;amp;aid=1204445882&amp;amp;bvid=BV1Tf421m7iW&amp;amp;cid=1540397448&amp;amp;p=1&amp;amp;t=6&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;false&quot; style=&quot;width: 200px; height: 100px;&quot; align=&quot;center&quot;&amp;gt;&amp;lt;/iframe&amp;gt; --&amp;gt;&lt;/p&gt;
&lt;p&gt;经过了疫情的洗礼, 习以为常的家乡也显得格外新鲜; 全面放开了, 这正是个好机会踏上归家的旅途, 踏上时间的归途.&lt;/p&gt;
&lt;p&gt;火车到了站, 我背着书包在拥挤的人群中穿梭, 似乎有些发自内心的愉快? 可能是家乡的感觉, 家乡的空气, 就是会给人安心的感觉吧. &quot;欢迎乘坐 xxx 路公交车, ...&quot;, 坐上公交, 大脑放空, 靠在玻璃窗上, 呆滞地望着&quot;车水马龙&quot;, 以及窗外的一切; 不曾想, 这熟悉中多了几分陌生.&lt;/p&gt;
&lt;p&gt;公交车飞快行驶着, 时不时的颠簸带来阵阵困意, 不过还是坚持着没有睡着, &lt;s&gt;至少风景比数学课好看许多&lt;/s&gt;. 天, 在不知不觉中阴沉下来, &quot;约8.33分钟前的[^theTimeOfSunlightToTheEarth]&quot;夕阳显得格外美丽, 但又转瞬即逝.&lt;/p&gt;
&lt;p&gt;在晃眼不耀眼的阳光之下, 以前的一切, 全然模糊了——突然的霎时, 不知为何, 阳光不再晃眼, 而是在不知哪儿来的小桥流水人家的水波中, 荡漾着. 岸上看去, 似乎有个熟悉的身影——大抵是邻里街坊的吧? 他就在小河边搓着衣服, 不时把衣服在水里晃荡几下, 一件又一件地洗着有些许破旧又带着些补丁的衣服. 而我, 却渐渐远去了...&lt;/p&gt;
&lt;p&gt;太阳依旧那么晃眼, 不过已然大惊失色了——光, 不再那么让人睁不开眼了吧?&lt;/p&gt;
&lt;p&gt;天, 全然暗淡下去了. 我, 已然站在小区的门口, 一步之遥的, 便是曾最渴望的. 但看着四周高楼的耸立, 人流快速的攒动, 显得那么陌生, 熟悉的陌生人似的了. 小区边的河流依旧川流不息, 而故人已不在/再.&lt;/p&gt;
&lt;p&gt;那个熟悉的身影依旧, 不过原本赖以生存的小河早已成了小区的&quot;后花园&quot;, 只会被人谈笑了. 他也不再河里洗衣服了, 虽说身穿的衣服没有了补丁, 但却是那么老旧. 或许, 是不愿让过去溶入历史吧? 不知道, 可能永远也不会知道.&lt;/p&gt;
&lt;p&gt;崭新的住宅仿佛与他格格不入, 两个时期的物品, 就此相遇.&lt;/p&gt;
&lt;p&gt;依稀记得往日, 放下了智能终端设备, 面对面的畅谈, 以及不在并不再的往日. 如同我猜测那般, 生产力的发展会造就科技的发展, 但会磨免人情. 远方的绿色植物显得那么悲哀, 要处理那么多人类排放但本不应的废气...&lt;/p&gt;
&lt;p&gt;就如昨天与朋友畅谈, 谈着我们的曾经当下与未来, 直到永远...欸? 昨天?&lt;/p&gt;
&lt;p&gt;我恍惚间回过神, 呆滞地望着远方, 原来才...正午?&lt;/p&gt;
&lt;p&gt;阳光照耀在我的全身, 地下的影子格外的短, &quot;哇! 好刺眼!&quot;. &quot;我看你愣了好久了, 没有打扰你, 怎么了? 一脸沮丧.&quot; &quot;没事, 走吧, 继续玩耍吧!&quot; &quot;怎么用那么书面的&apos;玩耍&apos;?&quot;我朋友小声嘀咕. &quot;哎呀没事哒, 走啦!&quot;&lt;/p&gt;
&lt;p&gt;最后我就想告诉大家, 不要等到无法挽回, 才学会挽救. 地球诞生也不过45.4亿年[^theBarthOfTheEarth], 我们生在地球发展的前期, 人类文明的前期, 应当考虑我们的责任, 人类的未来. 不要让此刻的浪费, 成为回旋镖, 在几百兆年后[^theConservationLawOfLife], 直击我们的眉心.&lt;/p&gt;
&lt;p&gt;所以, 让我们为世间所有美好而战!&lt;/p&gt;
&lt;p&gt;[^theTimeOfSunlightToTheEarth]: &lt;a href=&quot;https://zh.wikipedia.org/zh-hans/%E5%A4%AA%E9%98%B3#%E4%B8%80%E8%88%AC%E6%80%A7%E8%B3%AA&quot;&gt;https://zh.wikipedia.org/zh-hans/太阳#一般性質&lt;/a&gt; 光从离开太阳表面到地球表面的平均光程距离约为8分20秒
[^theBarthOfTheEarth]: &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%9C%B0%E7%90%83%E7%9A%84%E5%B9%B4%E9%BD%A1&quot;&gt;https://zh.wikipedia.org/wiki/地球的年齡&lt;/a&gt; 地球年龄是指自太阳系的形成与演化中吸积开始后至今所经历的地球历史时间, 当今天文及地质学界理论和观测皆一致认为这个年龄介于45－46亿年之间
[^theConservationLawOfLife]: &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%AE%88%E6%81%92%E5%AE%9A%E5%BE%8B&quot;&gt;https://zh.wikipedia.org/wiki/守恒定律&lt;/a&gt; / &lt;a href=&quot;https://baike.baidu.com/item/%E7%94%9F%E5%91%BD%E5%AE%88%E6%81%92%E5%AE%9A%E5%BE%8B/6884705&quot;&gt;https://baike.baidu.com/item/生命守恒定律/6884705&lt;/a&gt; 以当今科学的角度来看，生命守恒定律还处于唯心的初级阶段，因为毕竟这只是一个设想，并没有足够的科学根据来证明它的合理性。但是从宗教中人生的寄托理念来看，它也有着现阶段的积极意义。
生命守恒定律和自然科学并不相悖，人的记忆和思想都保存在大脑中，而灵魂是不存在记忆载体的，所以灵魂转移后的生命根本不可能和前一个生命有任何联系，也就是所谓的“上辈子和下辈子”问题无法实现的物质根本所在。(注: 百度百科的 `外文名` 存在拼写错误, 应当为 &lt;code&gt;conservation law&lt;/code&gt;)&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>20240311 / 人生之旅</title><link>https://aka.lovemilk.top/notes/posts/passages/20240311_%E4%BA%BA%E7%94%9F%E4%B9%8B%E6%97%85/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/passages/20240311_%E4%BA%BA%E7%94%9F%E4%B9%8B%E6%97%85/</guid><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;20240311 人生之旅&lt;/h1&gt;
&lt;h1&gt;Life journey, journey of life.&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;——Spending a lifetime 2 taste the love &amp;amp; pain. &amp;lt;br&amp;gt;
——用毕生, 体味爱与痛. &amp;lt;br&amp;gt; &amp;gt;   ——歌曲 《Da Capo》produced by: HOYO-MIX.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;头部&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段名称&lt;/th&gt;
&lt;th&gt;字段内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;作者 (笔名)&lt;/td&gt;
&lt;td&gt;爱喝牛奶&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;指导老师&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;协议&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://aka.lovemilk.top/67&quot;&gt;https://aka.lovemilk.top/67&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;正文&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
声明: 本文纯属个人编写, 文中所提到的主体 (包括但不限于 个人, 组织, 团体, 企业) 与本文无关, 如有侵权请联系作者删改&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;微风轻轻摇曳着树梢, 游人望着一湖美景, 渐渐地, 沉浸了下去...&lt;/p&gt;
&lt;p&gt;抑或是 水面映射着碧蓝天空, 远处覆雪的山峰屹立于山水之间, 看似触手可得, 实则远在天边...&lt;/p&gt;
&lt;h3&gt;旅途路途多险阻&lt;/h3&gt;
&lt;p&gt;作为旁观者的我们, 也必然会被这旅途美景的描写所吸引. 但你是否想过, 在美景背后的故事呢? 当游人将一湖美景毫无保留的赠送予你的时候, 藏在心底的, 大抵全然被旅途的劳累, 生活的压力什么的, 充满了罢...&lt;/p&gt;
&lt;p&gt;人们总是这样, 愿意把自己好的, 美的, 爱的一切分享给大家, 可能是为了将好心情带给大家, 亦或是只是为了面子...总之, 我们能看到的, 就大抵都是美景了. 待欣赏美景之后, 现实总会给予沉痛一击——一切都的压力, 全然集中于一点, 表面积极小, 压强极大.&lt;/p&gt;
&lt;p&gt;人生, 也不妨是同样旅途呢? 快乐都只是一瞬, 更多的, 就只剩下悲伤与遗憾了.&lt;/p&gt;
&lt;p&gt;&quot;热闹是它们的, 而我什么也没有.&quot; 可能由于知识面等因素的限制, 我们终身无法全面了解这个世界, 毕竟嘛, 这个世界是事实与谎言相交织的, 显然, 后者比较多. 不过, 如果对某些事情从古至今有着类似的描述, 那大概率就是真的了. 其实在我们的一生中, 会出现许多谎言, 为了维护一个谎言, 就会有无数个谎言的出现; 所以呀, 如果是细枝末节的小事儿, 没有必要追究何为谎言, 何为真话, 大不了就听着他人的谎言一笑而过, 然后继续笑对生活.&lt;/p&gt;
&lt;p&gt;旅途, 不就是充满正面与负面情绪的嘛? 为什么大家都只把正面情绪展示给大家? 不就是不想让自己的坏心情影响他人吗? 大部分是的, 既然别人都不想让你不高兴, 自己又何必抓着自己不放呢?&lt;/p&gt;
&lt;h3&gt;毕生体味爱与痛&lt;/h3&gt;
&lt;p&gt;正如我的题记般, &quot;用毕生, 体味爱与痛&quot;, 所以即便在人生的旅途中有坏情绪与伤痛, 不妨找个合适的地方, 表达出来, 让世界和时间, 帮你一起让坏情绪随蝴蝶一起消散吧!&lt;/p&gt;
&lt;p&gt;说实话, 别看我挺会灌 &quot;心灵鸡汤&quot;, 挺会安慰人的, 可是, 医者不能自医.&lt;/p&gt;
&lt;p&gt;我的坏情绪, 总是藏在心底, 因为不知道向哪里去诉说, 也不知道除了自己谁该信任. 也就只能让它们, 随着时间的洪流, 抹平了菱角罢了吧... 不过, 我在终于明白了, 既然它们伤我伤的那么痛, 又何必一直追着它们不放呢?&lt;/p&gt;
&lt;p&gt;虽然可能现在的社会就是如此, 节奏异常的快 (那大抵社会是异常了吧). 可是在被推推搡搡不得不奔跑的人生里, 如果不停下脚步, 看看过去, 展望未来, 那又能有什么成就呢? 听我说, 别不信, 虽然我今年只有 15 岁, 可是人生嘛, 不就是这样, 能努力尽量努力, 过头了不妨暂且停下脚步, 看看你的身旁, 看看你的身后, 你看, 你爱的人永远会在背后守护你, 永远.&lt;/p&gt;
&lt;p&gt;不过, 待戳破了本文文字构建的窗户纸之后, 你定会了解更多, 关于人生旅途的悲痛...&lt;/p&gt;
&lt;p&gt;突然, 一阵强风袭来, 一湖美景黯然失色, 没了镜面般的美丽, 没了水天一色, 也就没有了那韵味了罢. 虽无水天一色, 但波光粼粼也是美景.&lt;/p&gt;
&lt;p&gt;人生如旅途, 旅途映人生.&lt;/p&gt;
&lt;p&gt;唯独不同的是, 人生定是悲剧收场.&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item><item><title>20240309 / 人生之旅, 永恒之旅</title><link>https://aka.lovemilk.top/notes/posts/passages/20240309_%E4%BA%BA%E7%94%9F%E4%B9%8B%E6%97%85-%E6%B0%B8%E6%81%92%E4%B9%8B%E6%97%85/</link><guid isPermaLink="true">https://aka.lovemilk.top/notes/posts/passages/20240309_%E4%BA%BA%E7%94%9F%E4%B9%8B%E6%97%85-%E6%B0%B8%E6%81%92%E4%B9%8B%E6%97%85/</guid><pubDate>Sat, 09 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;20240309 人生之旅, 永恒之旅&lt;/h1&gt;
&lt;h1&gt;Life is the EVERLASTING Journey.&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;——Spending a lifetime 2 taste the love &amp;amp; pain. &amp;lt;br&amp;gt;
——用毕生, 体味爱与痛. &amp;lt;br&amp;gt;
  ——歌曲 《Da Capo》produced by: HOYO-MIX.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;头部&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段名称&lt;/th&gt;
&lt;th&gt;字段内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;作者 (笔名)&lt;/td&gt;
&lt;td&gt;爱喝牛奶&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;指导老师&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;协议&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://aka.lovemilk.top/67&quot;&gt;https://aka.lovemilk.top/67&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;正文&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
声明: 本文纯属个人编写, 文中所提到的主体 (包括但不限于 个人, 组织, 团体, 企业) 与本文无关, 如有侵权请联系作者删改&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;微风轻轻摇曳着树梢, 游人望着一湖美景, 渐渐地, 沉浸了下去... 这大抵是对于 &quot;旅途&quot; 主题最具有文学性的描写吧? 他们总想把旅途的万般美景展示予世人, 可却自己默默承受着旅途中的一个个困难, 一次次失败.&lt;/p&gt;
&lt;p&gt;其实, 人生也不妨是一场说走就走的旅行, 因为时间总是不说话却什么都想偷. 虽然美景很美, 但是挫折也不妨使得美景格外令人珍惜了呢? 但不知道为什么, 大家, 也包括我, 似乎都想把最好的一面展示给大家, 却忽视了坏的那面能使得好的变成更好...&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- &quot;时间总是不说话却什么都想偷&quot; 来自歌曲: 攻下全宇宙 --&amp;gt;&lt;/p&gt;
&lt;p&gt;如果在我们成长的过程中没有遇到过挫折, 那想必待长大之后, 即便最小的挫折, 也能让我们, 粉身碎骨罢? 不知道为什么, 现在环境越发封闭, 周围只有好的声音, 仿佛给我们一个良好的环境, 供我们长大; 但是, 这不妨是一种 &quot;慢性谋杀&quot; 呢? 在愈发封闭的同时, 让我们越发以为这个社会就是完美的, 没什么好遇到的挫折, 也慢慢抹杀了我们的创造力与个性. 社会已经成为了一个工厂, 把我们培养的任劳任怨, 其实只是他人为了利益罢了, 为了不让我们去思考我们长大之后工作为了谁, 真的是我们? 抑或是资本.&lt;/p&gt;
&lt;p&gt;人生的旅途就应当是丰富多彩的, 而不是机械化的学习, 更多的应当让学生探索. 如果你去问一些学生为了谁读书 (没错, 又是这个老掉牙的问题), 回答不是为了父母, 为了自己, 为了工作就是父母让我来上学的罢. 而我不一样, 我定会回答 &quot;受相关法律要求被迫读书&quot;, 这也是一种 &quot;不可抗力&quot; 吧?&lt;/p&gt;
&lt;p&gt;&quot;创新驱动发展&quot;, &quot;科教兴国&quot;, &quot;人才是第一资源&quot;, &quot;创新是第一动力&quot;, 教育是国家的未来, 民族进步的基石, 教育体制能够一定程度反映和映射出国家未来发展趋势. 唯有创新, 才能推动社会进步. 但是, 当前的教育体制已经抹杀了大部分学生的创造力, 创新能力, 少不分保持自己的创新能力的同学, 却无法得到重用.&lt;/p&gt;
&lt;p&gt;&quot;科举所造成的恶劣影响主要在其考核的内容与考试形式. 由明代开始, 科举的考试内容陷入僵化, 变成只要求考生能造出合乎形式的文章, 反而不重考生的实际学识. 大部分读书人为应科考, 思想渐被狭隘的四书五经、迂腐的八股文所束䌸；无论是眼界、创造能力、独立思考都被大大限制. [^Wikipedia#InfluencesOfTheCivil-serviceExaminations]&quot;, &quot;可以推想, 科举制度为政府发掘人材的同时, 亦埋没了民间在其他各方面的杰出人物；百年以来, 多少各式菁英被困科场, 虚耗光阴.[^Wikipedia#InfluencesOfTheCivil-serviceExaminations]&quot; 现在的教育制度也不妨是一种科举制度的延续? 所以, 如果你觉得为什么这个题目那么死板, 为什么明明我的想法很合理但为什么是错的, 那就没关系, 别去管他, 做你自己, 把你宝贵的创新能力留住.&lt;/p&gt;
&lt;p&gt;&quot;规则, 就是用来打破的!&quot; 虽然自古 &quot;枪打出头鸟&quot;, 但是没有 &quot;出头鸟&quot;, 何以创新? 如果制度一直不创新, 那么必然被时间淘汰! 如果过于依赖于固有制度, 那么, 社会将不会进步!&lt;/p&gt;
&lt;p&gt;为了提升青少年的自主能力, 预防青少年抑郁症频发, &quot;全国政协委员、全国工商联常委、月星集团董事局主席丁佐宏建议从多方面预防青少年抑郁症. 丁佐宏建议, 加强挫折型教育. 学校是青少年学习的主要阵地, 要加强抗压能力教育, 教会青少年对负面情绪的管理. 有条件的地方, 从幼儿园开始就应该注重对孩子的心理素质的培训. 学校不应以成绩为唯一标准去衡量学生, 更应关注“人”的成长与发展, 包括情感、态度、价值观、健全的人格等等.[^People&apos;sCongress#frustrationsOfteenagers]&quot; 这或许是中国教育制度的转折点, 但我知道, 他触碰到太多人的利益了, 通过该提议可能性很小. 科举制度之所以设立, 是因为如果在学习层面压力过大, 如果自己没有好的成绩 和/或 出路, 那么就会觉得是自己的问题, 而非制度.&lt;/p&gt;
&lt;p&gt;制度也需要创新, 不论方向, 即便制度创新方向与大趋势相违背, 人民的声音和自然选择会将其纠正, 不怕创新出错, 就怕不创新, 不听取创新性意见和建议.&lt;/p&gt;
&lt;p&gt;说了这么多, 可能有些离题了吧? 不过, 我想说的是, 人生是一个人最重要的旅途, 制度对于一个国家来说有点小问题不算什么, 毕竟谁都会犯错, 何况国家那么大的一个集体呢? 但是, 对于个人来说, 小问题映射到其身上的问题, 那就是大问题, 国家制度可以慢慢改革, 但个人有这个时间等吗? 改革每一步, 对于个人来说, 都是极为重要的!&lt;/p&gt;
&lt;p&gt;往小了说, 就说周五那天语文课吧. 我们语文老师默写了一篇很难的文言文——《鱼我所欲也》[^ArticleInClassicalChinese#YuWoSuoYuYe]的原文全文, 而且由于本学期时间短任务重, 导致学生的背诵时间较以往少了些, 老师就放低了上限, 原本一个字也不能错, 改成了 &amp;lt;= 3个字即视为全对, 但下限仿佛并未调低. 虽然出于礼貌和不敢, 我没有当面对语文老师说我的观点, 但是我其实想让她知道, 毕竟本文他也会看的嘛. 在我看来, 由于原文默写难度提升导致的上限下调实属合理, 但是确实中等偏下的学生是更需要帮助的, 要做到因材施教, 故我觉得应当降低下限, 激励学生, 而不是一味的让学生订正背诵, 最后段的学生我不是说放弃, 但是由于基础知识的巨大差异, 不得不降低标准到极低的层面, 再说了如果语文老师布置下去他们不做, 不仅没有意义, 而且还使得老师心情不好, 倒不如让他们觉得老师关注他们, 了解他们的需求, 慢慢使其喜欢语文, 毕竟热爱才是学习的第一动力.&lt;/p&gt;
&lt;p&gt;语文老师有点过于死板了, 不了解当下学生的能力范围和某些班级学生能力范围, 比如我们班的学生擅长于理解, 而非记忆, 语文老师错误地估计了我们的能力范围, 使得布置的任务过于繁重, 即便是因为时间紧的缘故, 但没有完成任务不就相当于浪费时间吗? 我希望语文老师能够拉近学生关系, 通过单独交流的方式了解学生对老师布置的任务的真实看法, 而不再在课堂上公开询问, 以免因外部原因导致所表达的想法并非真实. 刷题可能对死板背诵能力较好的学生有较大作用, 但不一定适用于我们班, 我建议语文老师多布置理解性内容多的任务, 而非死板背诵. 我们提升成绩, 要讲究效益最大化, 如果某些部分提升过慢, 并且提升过程任务过于繁重, 不妨尝试放弃, 提升其他附加值高的部分, 比如我们班擅长于阅读理解和言文意思的理解, 提升较快, 但语文老师一直提升背诵能力, 就如对牛弹琴, 浪费双方时间.&lt;/p&gt;
&lt;p&gt;这或许就是刻板教育制度的缩影, 或者刻板教育制度在语文老师心中根深蒂固了罢.&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- 说实话, 我之前写这篇文章一点思路没有, 也尝试过使用 AI 大模型写, 写出来的还可以, 挺附有文学价值的, 但却总少了点什么——是情感. 旅途中的风景, 美也好坏也罢, 都只是过客, 陪你到最后的只有你自己和你在意的人, 所以, 最重要的不是旅途中的风景, 那不过是不过是 &quot;锦上添花&quot; 罢了, 而是你踏过的每一片土地时, 你流露出的情感. 如果当你重游故地时, 能触动到你的内心, 能让你重温旧日往事, 甚至让你的泪腺不争气, 那必然, 是真正的旅途, 而不是为了旅途而旅行. --&amp;gt;&lt;/p&gt;
&lt;p&gt;无论怎样, 人生其实很短, 短到有那么多遗憾没有完成, 短到连自己在意的人都留不住, 短到都没有看够这个世界... 不过, 人生也可以很长, 长到那些伤痛, 都随时间, 释怀了; 那些爱与恨, 都随蝴蝶, 一起消散了; 长到什么也记不清了...&lt;/p&gt;
&lt;p&gt;来说说题记吧, 这是 崩坏三 (Honkai: Impact 3rd) 毕业旅行歌曲——《Da Capo》的一句歌词, 我觉得挺适合我们, 还有3个多月, 我们迎来中考, 之后各自扬镳, 虽然在同一个县内, 也有可能因为学业压力而再也不见一次... 我觉得这首歌很让我触动, &quot;当曾经的挚友离开, 你是否奢望他们能够牢记你姓名. 当美好的旧日逝去, 你是否还能确保你的心仍旧如初?&quot;; 同为毕业, 我更希望能够快乐些, 虽然 &quot;我们不能停止时间&quot;, 那就 &quot;任由时间的车轮在践踏我们的过去&quot;!&lt;/p&gt;
&lt;p&gt;这首歌的最后一句话是 &quot;大抵, 你便是世间全然的美好, 永远闪耀!&quot; 天下无不散之筵席, 那不妨让我们在优先的时光里, 体味无穷的快乐, 何必在意不合理的制度, 快乐就好, 开心就好, 自在就好. 无论是否需要经历伤痛, 快乐终将铭记于心.&lt;/p&gt;
&lt;p&gt;让我们一起, 为世界上所有的美好而战! 一起, 拯救世界!&lt;/p&gt;
&lt;p&gt;[^Wikipedia#InfluencesOfTheCivil-serviceExaminations]: &lt;a href=&quot;https://zh.wikipedia.org/zh-hans/%E4%B8%AD%E5%9B%BD%E7%A7%91%E4%B8%BE%E5%88%B6%E5%BA%A6#%E5%BD%B1%E9%9F%BF&quot;&gt;中国科举制度#影响 - 维基百科, 自由的百科全书&lt;/a&gt;
[^People&apos;sCongress#frustrationsOfteenagers]: &lt;a href=&quot;https://www.chinanews.com.cn/cj/2024/03-03/10173453.shtml&quot;&gt;全国政协委员丁佐宏：建议加强挫折型教育预防青少年抑郁症 - 中新网&lt;/a&gt;
[^ArticleInClassicalChinese#YuWoSuoYuYe]: &lt;a href=&quot;https://baike.baidu.com/item/%E9%B1%BC%E6%88%91%E6%89%80%E6%AC%B2%E4%B9%9F/4927922&quot;&gt;鱼我所欲也（《孟子·告子上》中的文章）_百度百科&lt;/a&gt;&lt;/p&gt;
</content:encoded><copyright><name>爱喝牛奶著作转载协议</name><url>https://aka.lovemilk.top/67</url></copyright></item></channel></rss>