<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>1224HuangJin&apos;s Blog</title><description>什么都不会的人的 Blog?</description><link>https://wyf9.top/</link><language>zh_CN</language><item><title>Linux 创建虚拟麦克风 / 扬声器</title><link>https://wyf9.top/posts/virtual-sink/</link><guid isPermaLink="true">https://wyf9.top/posts/virtual-sink/</guid><description>给别人共享音乐需要虚拟麦克风？一行命令解决！（只适用于使用 PipeWire 的系统）</description><pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;PipeWire&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;等下，你问什么是 pipewire?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;简单来说，PipeWire 是一个&lt;strong&gt;低延迟的 Linux 多媒体处理引擎&lt;/strong&gt;，可以让你的设备处理播放音视频更快，更安全，而且对沙箱 / Wayland / 蓝牙耳机等支持友好（&lt;em&gt;better than PulseAudio&lt;/em&gt;，也是 Ubuntu 22.04+ 的默认之选）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本文所述的功能需要它&lt;/strong&gt;，因此先检测是否已经安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pactl info | grep -i &quot;pipewire&quot; &amp;amp;&amp;amp; echo &quot;installed&quot; || echo &quot;not installed&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装了应该是这样：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;1-check.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果输出 &lt;code&gt;not installed&lt;/code&gt;，你需要&lt;strong&gt;安装并启用&lt;/strong&gt; PipeWire，见下面的文档 / 教程（这里不多赘述）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pipewire.org/&quot;&gt;PipeWire&lt;/a&gt; &lt;strong&gt;(这是官网)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/679142993&quot;&gt;Ubuntu 20.04 切换 pipewire 作为音频连接 - 知乎&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wiki.archlinuxcn.org/wiki/PipeWire&quot;&gt;PipeWire - Arch Linux 中文维基&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wiki.debian.org/zh_CN/PipeWire&quot;&gt;zh_CN/PipeWire - Debian Wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;通过 &lt;code&gt;pactl&lt;/code&gt; 加载 &lt;code&gt;module-null-sink&lt;/code&gt; 模块，来创建一个新的虚拟 Sink&lt;/p&gt;
&lt;p&gt;然后通过 &lt;code&gt;media.class&lt;/code&gt; 指定类型 (&lt;code&gt;Audio/Sink&lt;/code&gt; -&amp;gt; 扬声器，&lt;code&gt;Audio/Source/Virtual&lt;/code&gt; -&amp;gt; 麦克风)&lt;/p&gt;
&lt;p&gt;再通过 &lt;code&gt;sink_name&lt;/code&gt; 和 &lt;code&gt;sink_properties&lt;/code&gt; 中的 &lt;code&gt;device.description&lt;/code&gt; 指定不带前缀的自定义名称&lt;/p&gt;
&lt;p&gt;完事.&lt;/p&gt;
&lt;h2&gt;因此你可以：&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Sink (即扬声器 / 输出)
pactl load-module module-null-sink \
  media.class=Audio/Sink \
  sink_name=&quot;SinkName&quot; \
  sink_properties=device.description=&quot;SinkName&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# Mic (即麦克风 / 输入)
pactl load-module module-null-sink \
  media.class=Audio/Source/Virtual \
  sink_name=&quot;SinkName&quot; \
  sink_properties=device.description=&quot;SinkName&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
将 &lt;code&gt;SinkName&lt;/code&gt; 替换为&lt;strong&gt;你想要的设备名称&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;哦对了，这不是永久更改，重启恢复 &lt;em&gt;（但你或许可以写个 user scope &amp;amp; one shot 的 systemd 服务或者自启脚本？）&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;那怎么删除呢？&lt;/h2&gt;
&lt;p&gt;创建的时候不是会返回一个数字 id 吗？这就是加载模块的 id，直接用命令移除即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;2-created.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;比如我这里就是 &lt;code&gt;536870919&lt;/code&gt;，那就执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pactl unload-module 536870919
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，你就会发现这个虚拟扬声器消失了（mic 同理）&lt;/p&gt;
&lt;h1&gt;主包主包，每次都敲这么一长串命令太麻烦了怎么办？&lt;/h1&gt;
&lt;p&gt;那就把它变成短的命令 🤓&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用下面的命令一键 (全局) 安装脚本到你的系统：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -sSf https://sh.wss.moe/v.sh | sudo bash
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;&lt;s&gt;for English users: use your translator&lt;/s&gt; &lt;em&gt;theres no &lt;s&gt;english&lt;/s&gt; user i think&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;v.sh # 查看帮助
v.sh sink # 创建 Sink
v.sh sink &quot;a-sink&quot; # 创建名为 a-sink 的 Sink
v.sh mic Just A Mic # 创建名为 Just A Mic 的 Mic
v.sh del a-sink # 移除 a-sink (Sink / Mic)
v.sh rm &quot;Just A Mic&quot; # 移除 Just A Mic (Sink / Mic)
v.sh rm --all # 移除所有虚拟 Sink &amp;amp; Mic
v.sh rm --all --sink # 移除所有虚拟 Sink
v.sh rm --mic --all # 移除所有虚拟 Mic
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;sink&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;创建虚拟输出设备 (&lt;code&gt;Audio/Sink&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;后接可选参数，如指定则用于 Sink 显示名称&lt;/p&gt;
&lt;p&gt;如未指定，使用 &lt;code&gt;Virtual-Sink-#&lt;/code&gt; (&lt;code&gt;#&lt;/code&gt; 为从 1 开始的数字)&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;mic&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;创建虚拟输入设备 (&lt;code&gt;Audio/Source/Virtual&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;后接可选参数，如指定则用于 Mic 显示名称&lt;/p&gt;
&lt;p&gt;如未指定，使用 &lt;code&gt;Virtual-Mic-#&lt;/code&gt; (&lt;code&gt;#&lt;/code&gt; 为从 1 开始的数字)&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;rm&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;删除指定名称的虚拟设备 (输入 / 输出)&lt;/p&gt;
&lt;p&gt;后接必选参数，指定要删除的虚拟设备名称&lt;/p&gt;
&lt;p&gt;也可以后接 &lt;code&gt;--all&lt;/code&gt; 来删除所有&lt;em&gt;用本脚本创建的&lt;/em&gt;虚拟设备&lt;/p&gt;
&lt;p&gt;当使用 &lt;code&gt;--all&lt;/code&gt; 时，可以加上 &lt;code&gt;--sink&lt;/code&gt; 或 &lt;code&gt;--mic&lt;/code&gt; 指定类型&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;del&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rm&lt;/code&gt; 的别名.&lt;/p&gt;
&lt;h2&gt;Source&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
也发布到了 Gist (实际上上面的脚本就是拉取 gist 下载；推荐使用，此处不一定为最新) &amp;lt;br/&amp;gt;
https://gist.github.com/wyf9/ff12240ae023da0a068f2466968e3681&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;点击展开&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /usr/local/bin/v.sh
#!/usr/bin/env bash
set -euo pipefail

LOCKDIR=&quot;/tmp/viraudio&quot;
mkdir -p &quot;$LOCKDIR&quot;

command -v pactl &amp;gt;/dev/null || { echo &quot;Missing pactl, please install it first.&quot; &amp;gt;&amp;amp;2; exit 1; }

usage() {
  cat &amp;lt;&amp;lt;EOF
Usage:
  $0 sink [NAME]
  $0 mic [NAME]
  $0 del &amp;lt;NAME&amp;gt;
  $0 rm &amp;lt;NAME&amp;gt;
  $0 rm --all
  $0 rm --all --sink
  $0 rm --all --mic

Source: https://gist.github.com/wyf9/ff12240ae023da0a068f2466968e3681
Help: https://wyf9.top/p/virtual-sink#usage
EOF
  exit 1
}

die() {
  echo &quot;$*&quot; &amp;gt;&amp;amp;2
  exit 1
}

lock_file() {
  local type=&quot;$1&quot;
  local name=&quot;$2&quot;
  printf &apos;%s/viraudio-%s-%s-%s.lock&apos; &quot;$LOCKDIR&quot; &quot;$USER&quot; &quot;$name&quot; &quot;$type&quot;
}

exists_name() {
  local name=&quot;$1&quot;
  [[ -f &quot;$(lock_file sink &quot;$name&quot;)&quot; || -f &quot;$(lock_file mic &quot;$name&quot;)&quot; ]]
}

generate_name() {
  local type=&quot;$1&quot;
  local prefix
  case &quot;$type&quot; in
    sink) prefix=&quot;Virtual Sink&quot; ;;
    mic) prefix=&quot;Virtual Mic&quot; ;;
  esac
  local i=1
  while exists_name &quot;$prefix $i&quot;; do
    ((i++))
  done
  echo &quot;$prefix $i&quot;
}

create_sink() {
  local name=&quot;${1:-}&quot;

  if [[ -z &quot;$name&quot; ]]; then
    name=$(generate_name sink)
  fi

  if exists_name &quot;$name&quot;; then
    die &quot;Virtual device &apos;$name&apos; already exists.&quot;
  fi

  local module_index
  module_index=$(
    pactl load-module module-null-sink \
      media.class=Audio/Sink \
      sink_name=&quot;$name&quot; \
      sink_properties=device.description=&quot;$name&quot;
  )

  printf &apos;%s\n&apos; &quot;$module_index&quot; &amp;gt; &quot;$(lock_file sink &quot;$name&quot;)&quot;
  echo &quot;Created virtual sink &apos;$name&apos; (module $module_index).&quot;
}

create_mic() {
  local name=&quot;${1:-}&quot;

  if [[ -z &quot;$name&quot; ]]; then
    name=$(generate_name mic)
  fi

  if exists_name &quot;$name&quot;; then
    die &quot;Virtual device &apos;$name&apos; already exists.&quot;
  fi

  local module_index
  module_index=$(
    pactl load-module module-null-sink \
      media.class=Audio/Source/Virtual \
      sink_name=&quot;$name&quot; \
      sink_properties=device.description=&quot;$name&quot;
  )

  printf &apos;%s\n&apos; &quot;$module_index&quot; &amp;gt; &quot;$(lock_file mic &quot;$name&quot;)&quot;
  echo &quot;Created virtual mic &apos;$name&apos; (module $module_index).&quot;
}

remove_name() {
  local name=&quot;$1&quot;
  local removed=0

  for type in sink mic; do
    local lf
    lf=&quot;$(lock_file &quot;$type&quot; &quot;$name&quot;)&quot;

    if [[ -f &quot;$lf&quot; ]]; then
      local module_index
      module_index=&quot;$(&amp;lt;&quot;$lf&quot;)&quot;
      pactl unload-module &quot;$module_index&quot;
      rm -f &quot;$lf&quot;
      echo &quot;Removed virtual $type &apos;$name&apos; (module $module_index).&quot;
      removed=1
    fi
  done

  if [[ $removed -eq 0 ]]; then
    die &quot;No virtual sink or mic named &apos;$name&apos; found.&quot;
  fi
}

remove_all() {
  local type_filter=&quot;${1:-}&quot;
  local types=()
  local removed=0

  if [[ -z &quot;$type_filter&quot; ]]; then
    types=(sink mic)
  else
    types=(&quot;$type_filter&quot;)
  fi

  for type in &quot;${types[@]}&quot;; do
    for lf in &quot;$LOCKDIR&quot;/viraudio-*&quot;-$type&quot;.lock; do
      if [[ -f &quot;$lf&quot; ]]; then
        local module_index
        module_index=&quot;$(&amp;lt;&quot;$lf&quot;)&quot;
        local name
        name=$(basename &quot;$lf&quot; &quot;-$type.lock&quot; | sed &quot;s/^viraudio-[^-]*-//&quot;)
        pactl unload-module &quot;$module_index&quot;
        rm -f &quot;$lf&quot;
        echo &quot;Removed virtual $type &apos;$name&apos; (module $module_index).&quot;
        removed=$((removed + 1))
      fi
    done
  done

  if [[ $removed -eq 0 ]]; then
    die &quot;No virtual devices found.&quot;
  fi
  echo &quot;Total removed: $removed.&quot;
}

if [[ $# -lt 1 ]]; then
  usage
fi

cmd=&quot;$1&quot;
shift
name=&quot;$*&quot;

case &quot;$cmd&quot; in
  sink)
    create_sink &quot;$name&quot;
    ;;
  mic)
    create_mic &quot;$name&quot;
    ;;
  del|rm)
    if [[ &quot;$name&quot; == &quot;--all&quot; ]]; then
      remove_all
    elif [[ &quot;$name&quot; == &quot;--all --sink&quot; ]] || [[ &quot;$name&quot; == &quot;--sink --all&quot; ]]; then
      remove_all sink
    elif [[ &quot;$name&quot; == &quot;--all --mic&quot; ]] || [[ &quot;$name&quot; == &quot;--mic --all&quot; ]]; then
      remove_all mic
    elif [[ -z &quot;$name&quot; ]]; then
      die &quot;NAME required for del/rm, or use --all.&quot;
    else
      remove_name &quot;$name&quot;
    fi
    ;;
  *)
    usage
    ;;
esac
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;btw, script powered by Copilot. Blog content powered by myself.&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>云湖 Linux 版修复</title><link>https://wyf9.top/posts/yunhu-linux-fix/</link><guid isPermaLink="true">https://wyf9.top/posts/yunhu-linux-fix/</guid><description>下载了云湖 (一个聊天平台) Linux 版，启动失败，发现它的数据竟然...?!</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;云湖 Linux 版启动修复&lt;/h1&gt;
&lt;h2&gt;问题&lt;/h2&gt;
&lt;p&gt;从 https://www.yhchat.com/c/p/1087 下载了云湖的 Linux 最新版本 (1.6.49+224)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;1-dl.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;尝试启动，就发现了一个很奇怪的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从 gnome 的应用启动器启动，可以正常打开 &lt;img src=&quot;2-launch-sys.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;从 Ulauncher 启动，无法正常打开 (卡在如图界面)&lt;img src=&quot;3-launch-ulauncher.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;4-ulauncher-fail.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;从命令行打开，正常启动，却在工作目录生成了 &lt;code&gt;.dart_tool&lt;/code&gt; 和 &lt;code&gt;.sentry-native&lt;/code&gt; 两个文件夹&lt;img src=&quot;5-launch-cmd.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;于是，我做出大胆猜测：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;是不是因为 Ulauncher 默认在 &lt;code&gt;/usr/share/applications&lt;/code&gt; 启动应用，而云湖又是相对路径存储文件，导致云湖没有权限生成本地数据库，从而启动失败?&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;但我也不知道为什么从桌面自带启动器就可以，所以就只是猜测了&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;实践开始&lt;/h2&gt;
&lt;p&gt;首先将上面生成的文件移动到用户目录下 &lt;code&gt;.config/yunhu&lt;/code&gt; 文件夹（自己创建）&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;/usr/bin&lt;/code&gt; 下创建 &lt;code&gt;yunhu-wrapper&lt;/code&gt;，写入以下内容:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /usr/bin/yunhu-wrapper
#!/bin/bash
mkdir -p /home/$USER/.config/yunhu || true
cd /home/$USER/.config/yunhu
yunhu $*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后 &lt;code&gt;sudo chmod +x /usr/bin/yunhu-wrapper&lt;/code&gt; 给可执行权限&lt;/p&gt;
&lt;p&gt;再编辑云湖的 Application 文件:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /usr/share/applications/yunhu.desktop
[Desktop Entry]
Type=Application
Version=1.6.49+224
Name=云湖
Icon=yunhu
Exec=yunhu-wrapper %U
Categories=Social;
Keywords=云湖;聊天;社交;软件;
StartupNotify=true
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Exec=yunhu %U&lt;/code&gt; -&amp;gt; &lt;code&gt;Exec=yunhu-wrapper %U&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;保存重试，即可成功用 Ulauncher 启动.&lt;/p&gt;
</content:encoded></item><item><title>WHO.CX 自定义字体</title><link>https://wyf9.top/posts/who-cx-font/</link><guid isPermaLink="true">https://wyf9.top/posts/who-cx-font/</guid><description>分享我的 WHO.CX (域名 Whois 信息查询网站) 自定义 CSS 字体</description><pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;/* 导入小赖字体CSS */
@import url(&apos;https://cdn.jsdmirror.com/gh/FrecklyComb1728/blog@main/public/fonts/xiaolai.css&apos;);

/* 定义小赖字体（备用） */
@font-face {
  font-family: &apos;xiaolai&apos;;
  src: url(&apos;https://cdn.jsdmirror.com/gh/FrecklyComb1728/blog@main/public/fonts/XiaolaiMonoSC-Regular.woff2&apos;) format(&apos;woff2&apos;),
    url(&apos;https://cdn.jsdmirror.com/gh/FrecklyComb1728/blog@main/public/fonts/XiaolaiMonoSC-Regular.woff&apos;) format(&apos;woff&apos;);
  font-weight: normal;
  font-style: normal;
  font-display: swap;
}


/* 文字优化：使用小赖字体 */
.home_label,
#brand,
table,
#text,
#set label,
#footer a,
#search_button,
#readme_btn,
#reward_btn,
#Language,
#TimeZone,
#Currency,
#Theme,
#SuffixFilling,
#search_input,
#history-input,
#price_box,
#price_load,
#cost,
option,
div,
p,
body {
  font-family: &apos;xiaolai&apos;, sans-serif !important;
  font-weight: 400;
  /* 自然字重 */
  line-height: 1.6;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把上面的 CSS 粘贴到 &lt;code&gt;who.cx&lt;/code&gt; 主页点击 &lt;strong&gt;&lt;code&gt;自定义 CSS&lt;/code&gt;&lt;/strong&gt; 后弹出的输入框中，点击 &lt;strong&gt;✔&lt;/strong&gt; 保存并点 &lt;strong&gt;X&lt;/strong&gt; 关闭输入框即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;1-save.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;效果:&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;点击展开效果图&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;2-lookup.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;3-dns.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;4-history.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Bash / CMD 提示符分享</title><link>https://wyf9.top/posts/bashrc-ps1/</link><guid isPermaLink="true">https://wyf9.top/posts/bashrc-ps1/</guid><description>我的 Bash 提示符 (PS1) 以及 Windows 的 Prompt 脚本分享</description><pubDate>Sun, 02 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Linux&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
Install -&amp;gt; 一键执行写入 + 应用 &amp;lt;br/&amp;gt;
Source -&amp;gt; 更详细，适合自行修改细节&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;完整版 (换行 ✅, Git ✅)&lt;/h2&gt;
&lt;p&gt;效果:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;1-git.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Install&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cat &amp;lt;&amp;lt;&apos;EOF&apos; &amp;gt;&amp;gt; ~/.bashrc &amp;amp;&amp;amp; source ~/.bashrc

# region prompt
# https://wyf9.top/p/bashrc-ps1/#完整版-换行-git-
parse_git_status() {
  git rev-parse --git-dir &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || return
  local status=&quot;&quot;
  local git_status=$(git status --porcelain 2&amp;gt;/dev/null)

  [[ $git_status =~ ^\?\? ]] &amp;amp;&amp;amp; status+=&quot;%&quot;
  [[ $git_status =~ ^.[MD] ]] &amp;amp;&amp;amp; status+=&quot;*&quot;
  [[ $git_status =~ ^[MADR] ]] &amp;amp;&amp;amp; status+=&quot;+&quot;

  local ab=$(git status --porcelain --branch 2&amp;gt;/dev/null | grep -o &apos;\[.*\]&apos;)
  [[ $ab =~ ahead\ ([0-9]+) ]] &amp;amp;&amp;amp; status+=&quot;&amp;gt;${BASH_REMATCH[1]}&quot;
  [[ $ab =~ behind\ ([0-9]+) ]] &amp;amp;&amp;amp; status+=&quot;&amp;lt;${BASH_REMATCH[1]}&quot;

  local branch=$(git branch --show-current 2&amp;gt;/dev/null)
  [[ -z $branch ]] &amp;amp;&amp;amp; branch=$(git rev-parse --short HEAD 2&amp;gt;/dev/null | sed &apos;s/^/detached@/&apos;)
  [[ -n $branch ]] &amp;amp;&amp;amp; echo &quot; ($branch$status)&quot;
}

PS1=&apos;  ${debian_chroot:+($debian_chroot) }\[\e[1;32m\]$(date +&quot;%Y-%m-%d %H:%M:%S&quot;) \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \w \[\e[1;34m\]$(parse_git_status)\[\e[0m\]\n\$ &apos;
# endregion prompt
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Source&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# ~/.bashrc
# region prompt
# https://wyf9.top/p/bashrc-ps1/#%E5%AE%8C%E6%95%B4%E7%89%88-%E6%8D%A2%E8%A1%8C--git-

# Function to get Git status indicators
parse_git_status() {
  # Only run if in a Git repository
  if git rev-parse --git-dir &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    local status=&quot;&quot;
    # Get porcelain output for concise status
    local git_status
    git_status=$(git status --porcelain 2&amp;gt;/dev/null)
    
    # Check for untracked files (?? in porcelain)
    if echo &quot;$git_status&quot; | grep -q &quot;^??&quot;; then
      status=&quot;${status}%&quot;
    fi
    
    # Check for modified files ( M or D in second column)
    if echo &quot;$git_status&quot; | grep -q &quot;^.[MD]&quot;; then
      status=&quot;${status}*&quot;
    fi
    
    # Check for staged files (M, A, D, R, C in first column)
    if echo &quot;$git_status&quot; | grep -q &quot;^[MADR]&quot;; then
      status=&quot;${status}+&quot;
    fi
    
    # Check ahead/behind (optional, requires git status)
    local ahead_behind
    ahead_behind=$(git status --porcelain --branch 2&amp;gt;/dev/null | grep -o &apos;\[.*\]&apos;)
    if [[ $ahead_behind =~ ahead\ ([0-9]+) ]]; then
      status=&quot;${status}&amp;gt;${BASH_REMATCH[1]}&quot;
    fi
    if [[ $ahead_behind =~ behind\ ([0-9]+) ]]; then
      status=&quot;${status}&amp;lt;${BASH_REMATCH[1]}&quot;
    fi
    
    # Get current branch or detached HEAD state
    local branch
    if git symbolic-ref HEAD &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
      # Normal branch
      branch=$(git branch --show-current 2&amp;gt;/dev/null)
    else
      # Detached HEAD: try to describe the state
      branch=$(git describe --all --contains HEAD 2&amp;gt;/dev/null | sed &apos;s/heads\///&apos;)
      if [ -z &quot;$branch&quot; ]; then
        branch=&quot;detached@$(git rev-parse --short HEAD 2&amp;gt;/dev/null)&quot;
      else
        branch=&quot;detached@$branch&quot;
      fi
    fi
    
    # Output branch with status indicators
    if [ -n &quot;$branch&quot; ]; then
      echo &quot; ($branch$status)&quot;
    fi
  fi
}

# PS1 prompt with Git status indicators

PS1=&apos;  ${debian_chroot:+($debian_chroot) }\[\e[1;32m\]$(date +&quot;%Y-%m-%d %H:%M:%S&quot;) \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \w \[\e[1;34m\]$(parse_git_status)\[\e[0m\]\n\$ &apos;

# endregion prompt
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;无 Git 版 (换行 ✅, Git ❌)&lt;/h2&gt;
&lt;p&gt;效果:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;2-no-git.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Install&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cat &amp;lt;&amp;lt;&apos;EOF&apos; &amp;gt;&amp;gt; ~/.bashrc &amp;amp;&amp;amp; source ~/.bashrc
# https://wyf9.top/p/bashrc-ps1/#无-git-版-换行-git-
PS1=&apos;  ${debian_chroot:+($debian_chroot) }\[\e[1;32m\]$(date +&quot;%Y-%m-%d %H:%M:%S&quot;) \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \w\[\e[0m\]\n\$ &apos;
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Source&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# ~/.bashrc
# https://wyf9.top/p/bashrc-ps1/#%E6%97%A0-git-%E7%89%88-%E6%8D%A2%E8%A1%8C--git-
PS1=&apos;  ${debian_chroot:+($debian_chroot) }\[\e[1;32m\] $(date +&quot;%Y-%m-%d %H:%M:%S&quot;) \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \w\[\e[0m\]\n\$ &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;无换行版 (换行 ❌, Git ✅)&lt;/h2&gt;
&lt;p&gt;效果:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;3-no-newline.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Install&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cat &amp;lt;&amp;lt;&apos;EOF&apos; &amp;gt;&amp;gt; ~/.bashrc &amp;amp;&amp;amp; source ~/.bashrc &amp;amp;&amp;amp; echo &quot;单行+Git 版已生效！&quot;
# region prompt
# https://wyf9.top/p/bashrc-ps1/#无换行版-换行-git-
parse_git_status() {
  git rev-parse --git-dir &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || return
  local status=&quot;&quot;
  local git_status=$(git status --porcelain 2&amp;gt;/dev/null)

  [[ $git_status =~ ^\?\? ]] &amp;amp;&amp;amp; status+=&quot;%&quot;
  [[ $git_status =~ ^.[MD] ]] &amp;amp;&amp;amp; status+=&quot;*&quot;
  [[ $git_status =~ ^[MADR] ]] &amp;amp;&amp;amp; status+=&quot;+&quot;

  local ab=$(git status --porcelain --branch 2&amp;gt;/dev/null | grep -o &apos;\[.*\]&apos;)
  [[ $ab =~ ahead\ ([0-9]+) ]] &amp;amp;&amp;amp; status+=&quot;&amp;gt;${BASH_REMATCH[1]}&quot;
  [[ $ab =~ behind\ ([0-9]+) ]] &amp;amp;&amp;amp; status+=&quot;&amp;lt;${BASH_REMATCH[1]}&quot;

  local branch=$(git branch --show-current 2&amp;gt;/dev/null)
  [[ -z $branch ]] &amp;amp;&amp;amp; branch=$(git rev-parse --short HEAD 2&amp;gt;/dev/null | sed &apos;s/^/detached@/&apos;)
  [[ -n $branch ]] &amp;amp;&amp;amp; echo &quot; ($branch$status)&quot;
}

PS1=&apos;${debian_chroot:+($debian_chroot) }\[\e[1;32m\]$(date +&quot;%Y-%m-%d %H:%M:%S&quot;) \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \w \[\e[1;34m\]$(parse_git_status)\[\e[0m\] \$ &apos;
# endregion prompt
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Source&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# ~/.bashrc
# region prompt
# https://wyf9.top/p/bashrc-ps1/#%E6%97%A0%E6%8D%A2%E8%A1%8C%E7%89%88-%E6%8D%A2%E8%A1%8C--git-

# Function to get Git status indicators
parse_git_status() {
  # Only run if in a Git repository
  if git rev-parse --git-dir &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    local status=&quot;&quot;
    # Get porcelain output for concise status
    local git_status
    git_status=$(git status --porcelain 2&amp;gt;/dev/null)
    
    # Check for untracked files (?? in porcelain)
    if echo &quot;$git_status&quot; | grep -q &quot;^??&quot;; then
      status=&quot;${status}%&quot;
    fi
    
    # Check for modified files ( M or D in second column)
    if echo &quot;$git_status&quot; | grep -q &quot;^.[MD]&quot;; then
      status=&quot;${status}*&quot;
    fi
    
    # Check for staged files (M, A, D, R, C in first column)
    if echo &quot;$git_status&quot; | grep -q &quot;^[MADR]&quot;; then
      status=&quot;${status}+&quot;
    fi
    
    # Check ahead/behind (optional, requires git status)
    local ahead_behind
    ahead_behind=$(git status --porcelain --branch 2&amp;gt;/dev/null | grep -o &apos;\[.*\]&apos;)
    if [[ $ahead_behind =~ ahead\ ([0-9]+) ]]; then
      status=&quot;${status}&amp;gt;${BASH_REMATCH[1]}&quot;
    fi
    if [[ $ahead_behind =~ behind\ ([0-9]+) ]]; then
      status=&quot;${status}&amp;lt;${BASH_REMATCH[1]}&quot;
    fi
    
    # Get current branch or detached HEAD state
    local branch
    if git symbolic-ref HEAD &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
      # Normal branch
      branch=$(git branch --show-current 2&amp;gt;/dev/null)
    else
      # Detached HEAD: try to describe the state
      branch=$(git describe --all --contains HEAD 2&amp;gt;/dev/null | sed &apos;s/heads\///&apos;)
      if [ -z &quot;$branch&quot; ]; then
        branch=&quot;detached@$(git rev-parse --short HEAD 2&amp;gt;/dev/null)&quot;
      else
        branch=&quot;detached@$branch&quot;
      fi
    fi
    
    # Output branch with status indicators
    if [ -n &quot;$branch&quot; ]; then
      echo &quot; ($branch$status)&quot;
    fi
  fi
}

# PS1 prompt with Git status indicators

PS1=&apos;${debian_chroot:+($debian_chroot) }\[\e[1;32m\]$(date +&quot;%Y-%m-%d %H:%M:%S&quot;) \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \w\[\e[1;34m\]$(parse_git_status)\[\e[0m\] \$ &apos;

# endregion prompt
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;无换行 &amp;amp; Git 版 (换行 ❌, Git ❌)&lt;/h2&gt;
&lt;p&gt;效果:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;4-no-git-and-newline.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Install&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cat &amp;lt;&amp;lt;&apos;EOF&apos; &amp;gt;&amp;gt; ~/.bashrc &amp;amp;&amp;amp; source ~/.bashrc
# https://wyf9.top/p/bashrc-ps1/#无换行-git-版-换行-git-
PS1=&apos;${debian_chroot:+($debian_chroot) }\[\e[1;32m\]$(date +&quot;%Y-%m-%d %H:%M:%S&quot;) \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \w\[\e[0m\] \$ &apos;
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Source&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# https://wyf9.top/posts/bashrc-ps1/#%E6%97%A0%E6%8D%A2%E8%A1%8C--git-%E7%89%88-%E6%8D%A2%E8%A1%8C--git-
PS1=&apos;${debian_chroot:+($debian_chroot) }\[\e[1;32m\]$(date +&quot;%Y-%m-%d %H:%M:%S&quot;) \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \w\[\e[0m\] \$ &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Windows&lt;/h1&gt;
&lt;h2&gt;CMD (未测试)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;@echo off
:: ==================== 配置区 ====================
@set SHOW_VERSION=0   :: 0=不显示 Windows 版本，1=显示
@set SHOW_GIT=1       :: 0=不显示 Git 信息，1=显示（分支+状态）
@set NEW_LINE=1        :: 0=单行提示符，1=路径后换行
:: =============================================

:: ---------- 1. SHOW_VERSION ----------
if %SHOW_VERSION%==1 (
    @ver
    @echo (c) Microsoft Corporation。保留所有权利。
)

:: ---------- 2. NEW_LINE ----------
if %NEW_LINE%==1 (
    @set &quot;NL=$_$ - &quot;
) else (
    @set &quot;NL= &quot;
)

:: ---------- 3. 取得 ESC 字符 ----------
@for /f &quot;delims=#&quot; %%i in (&apos;prompt #$E#^&amp;amp;echo on^&amp;amp;for %%a in ^(1^) do rem&apos;) do @set &quot;ESC=%%i&quot;

:: ---------- 4. Git 信息（仅当 SHOW_GIT=1 时计算） ----------
@set &quot;GIT_INFO=&quot;
if %SHOW_GIT%==1 (
    git rev-parse --is-inside-work-tree &amp;gt;nul 2&amp;gt;&amp;amp;1 || goto :git_end
    :: 当前分支
    for /f &quot;delims=&quot; %%B in (&apos;git branch --show-current 2^&amp;gt;nul&apos;) do set &quot;BRANCH=%%B&quot;
    if not defined BRANCH (
        for /f &quot;delims=&quot; %%H in (&apos;git symbolic-ref --short HEAD 2^&amp;gt;nul&apos;) do set &quot;BRANCH=%%H&quot;
    )
    if not defined BRANCH (
        for /f &quot;delims=&quot; %%S in (&apos;git rev-parse --short HEAD 2^&amp;gt;nul&apos;) do set &quot;BRANCH=detached@%%S&quot;
    )
    :: 状态指示符
    set &quot;ST=&quot;
    for /f &quot;delims=&quot; %%L in (&apos;git status --porcelain 2^&amp;gt;nul&apos;) do set &quot;PORC=%%L&quot;&amp;amp; call :parse_porcelain
    set &quot;GIT_INFO= (%BRANCH%%ST%)&quot;
)
:git_end
@goto :prompt_set
:parse_porcelain
@rem ?? → 未跟踪
@echo %PORC%|findstr /b /c:&quot;??&quot; &amp;gt;nul &amp;amp;&amp;amp; if not defined ST set &quot;ST=%&quot;
@rem 第二列 M/D → 已修改
@echo %PORC%|findstr /r /c:&quot;^.M&quot; /c:&quot;^.D&quot; &amp;gt;nul &amp;amp;&amp;amp; set &quot;ST=%ST%*&quot;
@rem 第一列 M/A/D/R → 已暂存
@echo %PORC%|findstr /r /c:&quot;^M.&quot; /c:&quot;^A.&quot; /c:&quot;^D.&quot; /c:&quot;^R.&quot; &amp;gt;nul &amp;amp;&amp;amp; set &quot;ST=%ST%+&quot;
@goto :eof

:: ---------- 5. 动态生成 Prompt ----------
:prompt_set
@set &quot;GIT_PART=&quot;
@if %SHOW_GIT%==1 @set &quot;GIT_PART=%ESC%[38;2;78;154;6m%GIT_INFO%%ESC%[m&quot;

@set &quot;PROMPT_LINE=%ESC%[38;2;88;110;117m[$T%ESC%[m %ESC%[38;2;101;123;131m%USERNAME%%ESC%[m%ESC%[38;2;108;113;196m@%COMPUTERNAME%%ESC%[m %ESC%[38;2;203;75;22m$P%ESC%[m%GIT_PART%%NL%$%ESC%[m$&quot;

@prompt %PROMPT_LINE%
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PowerShell (未测试)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 用法: . .\Set-Prompt.ps1 -ShowGit $true -NewLine $true

param(
    [bool]$ShowGit = $true,
    [bool]$NewLine = $true,
    [bool]$ShowVersion = $false
)

# ==================== Git 状态函数 ====================
function Get-GitStatus {
    if (-not (Get-Command git -ErrorAction SilentlyContinue)) { return &quot;&quot; }

    $gitDir = git rev-parse --git-dir 2&amp;gt;$null
    if (-not $gitDir) { return &quot;&quot; }

    # 分支名
    $branch = git branch --show-current 2&amp;gt;$null
    if (-not $branch) {
        $head = git symbolic-ref --short HEAD 2&amp;gt;$null
        if ($head) { $branch = $head }
        else {
            $sha = git rev-parse --short HEAD 2&amp;gt;$null
            $branch = &quot;detached@$sha&quot;
        }
    }

    # 状态指示符
    $status = &quot;&quot;
    $porcelain = git status --porcelain 2&amp;gt;$null
    if ($porcelain) {
        if ($porcelain -match &apos;^\?\?&apos;) { $status += &quot;%&quot; }
        if ($porcelain -match &apos;^.[MD]&apos;) { $status += &quot;*&quot; }
        if ($porcelain -match &apos;^[MADR]&apos;) { $status += &quot;+&quot; }
    }

    # 前后提交（可选）
    $branchInfo = git status --porcelain --branch 2&amp;gt;$null
    if ($branchInfo -match &apos;\[ahead (\d+)\]&apos;) { $status += &quot;&amp;gt;$($Matches[1])&quot; }
    if ($branchInfo -match &apos;\[behind (\d+)\]&apos;) { $status += &quot;&amp;lt;$($Matches[1])&quot; }

    if ($branch) {
        return &quot; ($branch$status)&quot;
    }
    return &quot;&quot;
}

# ==================== 颜色定义 ====================
$colors = @{
    time     = &quot;38;2;88;110;117&quot;
    user     = &quot;38;2;101;123;131&quot;
    at       = &quot;38;2;108;113;196&quot;
    path     = &quot;38;2;203;75;22&quot;
    git      = &quot;38;2;78;154;6&quot;
    reset    = &quot;0&quot;
}

function Write-Colored {
    param([string]$text, [string]$color)
    Write-Host $text -NoNewline -ForegroundColor $color
}

# ==================== 主提示符函数 ====================
function global:prompt {
    # 1. chroot 前缀
    if ($env:DEBIAN_CHROOT) {
        Write-Host &quot;($env:DEBIAN_CHROOT) &quot; -NoNewline -ForegroundColor Cyan
    }

    # 2. 时间
    $time = (Get-Date -Format &quot;yyyy-MM-dd HH:mm:ss&quot;)
    Write-Host &quot;[$time&quot; -NoNewline
    Write-Colored &quot; &quot; $colors.time
    Write-Host &quot;]&quot; -NoNewline

    # 3. 用户@主机
    Write-Colored &quot; $($env:USERNAME)&quot; $colors.user
    Write-Colored &quot;@$($env:COMPUTERNAME)&quot; $colors.at

    # 4. 路径
    $path = (Get-Location).Path
    Write-Colored &quot; $path&quot; $colors.path

    # 5. Git 信息
    if ($ShowGit) {
        $git = Get-GitStatus
        if ($git) {
            Write-Colored $git $colors.git
        }
    }

    # 6. 换行或空格
    if ($NewLine) {
        Write-Host &quot;&quot;
        Write-Host &quot;$&quot; -NoNewline -ForegroundColor Gray
    } else {
        Write-Host &quot; $&quot; -NoNewline -ForegroundColor Gray
    }

    return &quot; &quot;
}

# ==================== 可选：显示 PowerShell 版本 ====================
if ($ShowVersion) {
    &quot;PowerShell $($PSVersionTable.PSVersion) on $($PSVersionTable.OS)&quot;
}

# 自动加载提示符
Write-Host &quot;PowerShell 提示符已加载 (Git=$ShowGit, NewLine=$NewLine)&quot; -ForegroundColor Green
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;End&lt;/h1&gt;
&lt;p&gt;Grok 对话 (可以问它怎么用): https://grok.com/share/c2hhcmQtNA%3D%3D_afa0ab7e-326c-42b6-9cdc-9129f57ddafe&lt;/p&gt;
&lt;p&gt;CMD &amp;amp; Powershell 版没有测试, 如果有误 / 建议可以发评论, 我会修改&lt;/p&gt;
</content:encoded></item><item><title>B 站登录按钮在 Firefox 上没反应怎么办? 一招解决!</title><link>https://wyf9.top/posts/firefox-no-fingerprinting/</link><guid isPermaLink="true">https://wyf9.top/posts/firefox-no-fingerprinting/</guid><description>发现 B 站登录按钮点击没有反应, 调试面板发现 Fingerprinting 提示, 通过禁用配置轻松解决</description><pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;在 Firefox 上的网页端 B 站尝试登录，发现不管是 帐号密码模式 的 登录 按钮还是 验证码模式的 发送验证码 按钮都没反应&lt;/p&gt;
&lt;p&gt;我起初以为是美化插件的问题，但禁用后依旧，我又立马想到可以在开发者工具的网络面板查看请求&lt;/p&gt;
&lt;h1&gt;Fingerprinting&lt;/h1&gt;
&lt;p&gt;不看不知道，一看吓一跳：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;1-geetest-failed.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到网络面板中 &lt;code&gt;api.geetest.com&lt;/code&gt; (极验) 的请求发送失败，传输一栏显示 &lt;strong&gt;&lt;code&gt;Fingerprinting&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;解决方法&lt;/h1&gt;
&lt;p&gt;打开 &lt;code&gt;about:config&lt;/code&gt;，点击 &lt;code&gt;接受风险并继续&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;2-think-twice.png&quot; alt=&quot;&quot; /&gt;
搜索 &lt;code&gt;privacy.trackingprotection.fingerprinting&lt;/code&gt;，如果 &lt;code&gt;privacy.trackingprotection.fingerprinting.enabled&lt;/code&gt; 的值为 &lt;code&gt;true&lt;/code&gt;，将其改为 &lt;code&gt;close&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;3-disable.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;刷新网页，重新点击 &lt;code&gt;登录&lt;/code&gt; / &lt;code&gt;发送验证码&lt;/code&gt;，这时应该就能正常登录了&lt;/p&gt;
&lt;h1&gt;Ref&lt;/h1&gt;
&lt;p&gt;https://support.mozilla.org/zh-CN/kb/resist-fingerprinting&lt;/p&gt;
&lt;p&gt;但貌似不是我的配置项 (?)&lt;/p&gt;
</content:encoded></item><item><title>Cloudflared (Cloudflare Tunnel) 手把手使用教程</title><link>https://wyf9.top/posts/cloudflared-advanced/</link><guid isPermaLink="true">https://wyf9.top/posts/cloudflared-advanced/</guid><description>手把手教你怎么用 Cloudflare Tunnel 穿透 HTTP / SSH / TCP 服务！</description><pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Linux DO: https://linux.do/t/topic/1091998&lt;/p&gt;
&lt;h1&gt;知周所众&lt;/h1&gt;
&lt;p&gt;Cloudflare Tunnel 可以用来把你本地的&lt;strong&gt;网站&lt;/strong&gt;映射到公网 (前提是你的域名已经添加到 Cloudflare)&lt;/p&gt;
&lt;p&gt;那 &lt;strong&gt;SSH / TCP&lt;/strong&gt; 呢? &lt;strong&gt;当然可以！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但既然都是手把手教程了，我们就从头开始讲起：&lt;/p&gt;
&lt;h1&gt;安装 Cloudflared&lt;/h1&gt;
&lt;p&gt;Cloudflared 是 Cloudflare Tunnel 的客户端，必须在服务器上安装它才能穿透你的服务 (如果穿透 SSH / TCP 还得在客户端安装)&lt;/p&gt;
&lt;p&gt;打开它的 &lt;a href=&quot;https://github.com/cloudflare/cloudflared/releases/latest&quot;&gt;Releases 页面&lt;/a&gt;，然后选择你系统的客户端&lt;/p&gt;
&lt;p&gt;几种常见的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows: &lt;code&gt;cloudflared-windows-amd64.exe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Debian / Ubuntu: &lt;code&gt;cloudflared-linux-amd64.deb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Linux 通用: &lt;code&gt;cloudflared-linux-amd64&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mac: &lt;code&gt;cloudflared-darwin-amd64.tgz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;配置隧道&lt;/h1&gt;
&lt;p&gt;安装完成后打开 Cloudflare Zero Trust Dashboard:&lt;/p&gt;
&lt;p&gt;https://one.dash.cloudflare.com/&lt;/p&gt;
&lt;p&gt;导航到 &lt;code&gt;网络&lt;/code&gt; (&lt;code&gt;Network&lt;/code&gt;) -&amp;gt; &lt;code&gt;Tunnels&lt;/code&gt;，点击 &lt;code&gt;创建隧道&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;1-tunnels.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择 &lt;code&gt;Cloudflared&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;2-tun-type.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随便填一个名称，保存:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;3-tun-name.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;来到 &lt;code&gt;安装并运行连接器&lt;/code&gt;，选择你的服务器系统，复制安装服务命令并在服务器上执行:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;4-setup.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;5-setup-cmd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装完成后，&lt;code&gt;Connectors&lt;/code&gt; 应该会出现你的机器，这时就可以继续了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;6-connectors.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;穿透你的服务&lt;/h1&gt;
&lt;h2&gt;HTTP 网站&lt;/h2&gt;
&lt;p&gt;如果你的服务监听 &lt;code&gt;localhost:12345&lt;/code&gt;，想用 &lt;code&gt;example.wyf9.top&lt;/code&gt; 访问，就可以按下面的图片配置:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;7-http.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;SSH 服务&lt;/h2&gt;
&lt;p&gt;假设你的 sshd 监听 &lt;code&gt;localhost:22&lt;/code&gt;，想用 &lt;code&gt;example-ssh.wyf9.top&lt;/code&gt; 访问，按下面的图片配置:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;8-ssh.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注意不能直接用浏览器访问，需要先在客户端安装 Cloudflared，并编辑你的 SSH 配置文件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows: &lt;code&gt;C:\Users\你的用户名\.ssh\config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Linux: &lt;code&gt;/home/你的用户名/.ssh/config&lt;/code&gt; &lt;em&gt;(root 是 &lt;code&gt;/root/.ssh/config&lt;/code&gt;)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;增加以下内容:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ~/.ssh/config
Host ALIAS
    Hostname HOSTNAME
    ProxyCommand cloudflared access ssh --hostname %h
    User USER
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将 &lt;code&gt;ALIAS&lt;/code&gt; 替换为你连接时想要使用的别名，&lt;code&gt;HOSTNAME&lt;/code&gt; 替换为你在上面配置的主机名，&lt;code&gt;USER&lt;/code&gt; 替换为你在机器上的用户，保存退出&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;比如我的配置如下:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;9-ssh-config.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;配置好后，以后即可使用 &lt;code&gt;ssh HOSTNAME&lt;/code&gt; 连接:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;10-ssh-conn.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;也可以去 Cloudflare Access 配置 WebSSH，但我没有绑信用卡所以不讲&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;TCP 服务&lt;/h2&gt;
&lt;p&gt;假设你的服务监听 &lt;code&gt;localhost:9876&lt;/code&gt;，想用 &lt;code&gt;example-tcp.wyf9.top&lt;/code&gt; 访问，按下图配置：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;11-tcp.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;同样不能用浏览器直接访问，需要在客户端执行下面的命令打开隧道:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cloudflared access tcp --hostname example-tcp.wyf9.top --url localhost:9876
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把 &lt;code&gt;example-tcp.wyf9.top&lt;/code&gt; 替换为你的主机名，&lt;code&gt;localhost:9876&lt;/code&gt; 替换为客户端监听的地址 (可以和服务器不同)&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;测试服务器搭建&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;12-test-svc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;测试效果:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;13-tcp-test.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;example-tcp.wyf9.top&lt;/code&gt; 是真实服务，可以用来测试你的 Cloudflared 能否使用 &amp;lt;br/&amp;gt;
你问我为什么是 HTTP? 因为 HTTP 1/2 本质上也是 TCP 服务器，以及我一时间想不到好的 TCP 服务用来演示了 &amp;lt;br/&amp;gt;
&lt;em&gt;如果服务掉了请 &lt;a href=&quot;https://wyf9.top/c&quot;&gt;联系我&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Ref&lt;/h1&gt;
&lt;p&gt;Cloudflare 官方教程:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/ssh/&quot;&gt;SSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/&quot;&gt;RDP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/smb/&quot;&gt;SMB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/grpc/&quot;&gt;gRPC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>如何阻止 ITDog 测速消耗你的网站资源</title><link>https://wyf9.top/posts/block-itdog/</link><guid isPermaLink="true">https://wyf9.top/posts/block-itdog/</guid><description>只需要一个 Header，让其他人不能用 itdog 消耗你的网站资源!</description><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Block ITDog&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
From: https://www.itdog.cn/article/content-313.html&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;1-doc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如你所见，ITDog 官方文档中的 &lt;code&gt;$http_checkmode&lt;/code&gt; 指代的其实就是 HTTP 头 &lt;code&gt;checkmode&lt;/code&gt;，因此不仅是 Nginx，我们可以在很多 CDN 上方便地设置阻止 ITDog 测速 (如 CF WAF 规则)&lt;/p&gt;
&lt;h2&gt;Cloudflare&lt;/h2&gt;
&lt;p&gt;导航到 &lt;strong&gt;&lt;code&gt;你的域名&lt;/code&gt; -&amp;gt; &lt;code&gt;安全性&lt;/code&gt; -&amp;gt; &lt;code&gt;安全规则&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;或者直接跳转: https://dash.cloudflare.com/?to=/:account/:zone/security/security-rules?type=http_request_firewall_custom&lt;/p&gt;
&lt;p&gt;点击右上角的 &lt;strong&gt;&lt;code&gt;创建规则&lt;/code&gt; -&amp;gt; &lt;code&gt;自定义规则&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;2-cf.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;3-cf-custom-rule.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;来到规则编辑界面，按下图所示填写，点击 &lt;strong&gt;&lt;code&gt;部署&lt;/code&gt;&lt;/strong&gt; 保存并应用规则&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;4-cf-config.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;表达式:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 屏蔽所有模式
(len(http.request.headers[&quot;checkmode&quot;]) &amp;gt; 0)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 屏蔽快速测试
(any(http.request.headers[&quot;checkmode&quot;][*] eq &quot;fast&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 屏蔽缓慢测试
(any(http.request.headers[&quot;checkmode&quot;][*] eq &quot;slow&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最终效果:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;5-cf-result.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到状态码为 &lt;strong&gt;&lt;code&gt;403&lt;/code&gt;&lt;/strong&gt;，即为被 CF 的防火墙阻止，这时流量就不会到达源服务器了&lt;/p&gt;
&lt;h2&gt;Nginx&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 屏蔽所有模式
if ($http_checkmode) {
    return 500;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 屏蔽快速测试
if ($http_checkmode = &apos;fast&apos;) {
    return 500;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 屏蔽缓慢测试
if ($http_checkmode = &apos;slow&apos;) {
    return 500;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;IIS &amp;amp; Apache&lt;/h2&gt;
&lt;p&gt;不放，因为：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;本文开头的官方文档链接中有&lt;/li&gt;
&lt;li&gt;我不用&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;其他&lt;/h2&gt;
&lt;p&gt;欢迎评论添加&lt;/p&gt;
</content:encoded></item><item><title>Linux 新电脑开荒软件</title><link>https://wyf9.top/posts/linux-newinst/</link><guid isPermaLink="true">https://wyf9.top/posts/linux-newinst/</guid><description>自用，Linux 新电脑开荒软件列表 (可参考 / 建议)</description><pubDate>Sat, 18 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Linux 新电脑开荒软件&lt;/h1&gt;
&lt;p&gt;(一定程度上) 自用，可参考&lt;/p&gt;
&lt;p&gt;其中很多软件在 Windows 也可用&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如 失效 / 建议增加 / 建议修改 直接评论或 &lt;a href=&quot;https://wyf9.top/c&quot;&gt;联系我&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;AppImage 前置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/fuse.help
curl https://sh.wss.moe/fuse | sudo bash
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
AppImage 需要 FUSE 来运行，安装:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;# Ubuntu &amp;gt;= 24.04
sudo add-apt-repository universe # 可能不需要 (系统默认已添加 universe 源)
sudo apt install libfuse2t64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;其他版本说明&lt;/strong&gt;: https://github.com/AppImage/AppImageKit/wiki/FUSE#install-fuse&lt;/p&gt;
&lt;h2&gt;Flatpak 前置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/flatpak.help
curl https://sh.wss.moe/flatpak | sudo bash
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install flatpak
sudo apt install gnome-software-plugin-flatpak
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;其他版本说明&lt;/strong&gt;: https://flatpak.org/setup/&lt;/p&gt;
&lt;h1&gt;Ubuntu 特供&lt;/h1&gt;
&lt;h2&gt;&lt;strong&gt;去 Snap&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/nosnap.help
curl https://sh.wss.moe/nosnap | sudo bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 删除 Snapd (以及所有 snap 包)
sudo apt purge snapd -y
sudo apt autoremove -y
# 2. 防止 Snapd 被重新安装
echo &apos;Package: snapd
Pin: release a=*
Pin-Priority: -10

Package: *snap*
Pin: release a=*
Pin-Priority: -10&apos; | sudo tee /etc/apt/preferences.d/nosnap
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
细节 / 分步教程见此文: &lt;a href=&quot;../ubuntu-nosnap&quot;&gt;Ubuntu without Snap&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;strong&gt;Firefox &amp;amp; Thunderbird PPA&lt;/strong&gt; (Ubuntu 20+)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/firefox.help / https://sh.wss.moe/thunderbird.help
curl https://sh.wss.moe/firefox | bash # [--no-gnome]
curl https://sh.wss.moe/thunderbird | bash # [--no-gnome]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 添加 Mozilla PPA
sudo add-apt-repository ppa:mozillateam/ppa -y
# 2. 固定 Firefox &amp;amp; Thunderbird 版本
echo &apos;Package: firefox*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 32767

Package: thunderbird*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 32767&apos; | sudo tee /etc/apt/preferences.d/mozillateamppa
# 3. 安装 PPA 版 Firefox &amp;amp; Thunderbird
sudo apt install firefox thunderbird thunderbird-gnome-support -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Unsnap&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;快速将 &lt;em&gt;(部分)&lt;/em&gt; Flatpak 包迁移到 Snap 包&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/popey/unsnap&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;非自由软件包扩展集合&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;包含 &lt;strong&gt;微软字体&lt;/strong&gt; 以及 &lt;strong&gt;HEVC 视频编码&lt;/strong&gt; 扩展的支持&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install ubuntu-restricted-extras
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;社交软件&lt;/h1&gt;
&lt;h2&gt;&lt;strong&gt;QQ&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;p&gt;https://im.qq.com/linuxqq/index.shtml&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;AppImage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Discord&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;p&gt;https://discord.com/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;微信&lt;/h2&gt;
&lt;p&gt;https://linux.weixin.qq.com/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;AppImage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;AyuGram Desktop&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;s&gt;高德地图 (x)&lt;/s&gt; TG 的桌面端 Fork, 增加了一些实用功能 (部分违反 ToS)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/AyuGram/AyuGramDesktop&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aur.archlinux.org/packages/ayugram-desktop&quot;&gt;aur-src&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aur.archlinux.org/packages/ayugram-desktop-bin&quot;&gt;aur-bin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/0FL01/AyuGramDesktop-flatpak&quot;&gt;Flatpak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/AyuGram/AyuGramDesktop/blob/dev/docs/building-linux.md&quot;&gt;build&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;办公软件&lt;/h1&gt;
&lt;h2&gt;&lt;strong&gt;飞书&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;p&gt;https://www.feishu.cn/download&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;LibreOffice&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;开源的 MS Office 实现&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://zh-cn.libreoffice.org/download/libreoffice/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;Flatpak&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Visual Studio Code&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;p&gt;https://code.visualstudio.com/Download&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Obsidian&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Markdown 编辑器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://obsidian.md/download&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;AppImage&lt;/li&gt;
&lt;li&gt;Flatpak&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;娱乐软件&lt;/h1&gt;
&lt;h2&gt;&lt;strong&gt;bilibili-linux&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;B 站客户端的 Linux 移植版&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/msojocs/bilibili-linux/releases&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AppImage&lt;/li&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;OBS&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;p&gt;https://obsproject.com/download#linux&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;Flatpak&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;obs-composite-blur&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;马赛克插件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/FiniteSingularity/obs-composite-blur?tab=readme-ov-file#installation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flatpak&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;PrismLauncher&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个全平台的 Minecraft Java 启动器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://prismlauncher.org/download/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;aur&lt;/li&gt;
&lt;li&gt;Flatpak&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Steam&lt;/h2&gt;
&lt;p&gt;https://store.steampowered.com/about/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;音视频软件&lt;/h2&gt;
&lt;h2&gt;&lt;strong&gt;OpenShot&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;开源, 低性能机器友好的视频编辑器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://www.openshot.org/zh-hans/download/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AppImage&lt;/li&gt;
&lt;li&gt;PPA&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;VLC&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;全能视频播放器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://www.videolan.org/vlc/#download&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install vlc
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;网络工具&lt;/h1&gt;
&lt;h2&gt;Clash Verge Rev&lt;/h2&gt;
&lt;p&gt;https://github.com/clash-verge-rev/clash-verge-rev/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Mihomo&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Clash Verge 默认核心，轻量，纯命令行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/MetaCubeX/mihomo/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;解决 &lt;code&gt;Start TUN listening error: configure tun interface: operation not permitted&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo setcap cap_net_bind_service,cap_net_admin=+ep $(which mihomo)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如你的 mihomo 在非 PATH 路径，将 &lt;code&gt;$(which mihomo)&lt;/code&gt; 改为你的 mihomo 绝对路径&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ref: https://github.com/zzzgydi/clash-verge/issues/182&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;实用工具&lt;/h1&gt;
&lt;h2&gt;&lt;strong&gt;GIMP&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;图片编辑器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://www.gimp.org/downloads/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flatpak&lt;/li&gt;
&lt;li&gt;AppImage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Ulauncher&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;p&gt;https://github.com/Ulauncher/Ulauncher/releases/latest&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
v6 目前为 Pre-release -&amp;gt; https://github.com/Ulauncher/Ulauncher/releases&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;Emoji Plugin&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个表情插件，直接点 &lt;code&gt;EXTENSTIONS&lt;/code&gt; -&amp;gt; &lt;code&gt;Add extensions&lt;/code&gt; 粘贴下面的 repo 链接即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/ulauncher/ulauncher-emoji&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;LocalSend&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个简洁的内网文件传输工具&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/localsend/localsend/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;AppImage&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Snipaste&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个跨平台的 截图 + 贴图 工具&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://dl.snipaste.com/linux&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AppImage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;AudioRelay&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个在不同设备之间传输音频的工具&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://audiorelay.net/downloads&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;libflac8&lt;/code&gt;: https://launchpad.net/ubuntu/jammy/+package/libflac8&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;strong&gt;Waylyrics&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/waylyrics.help
curl https://sh.wss.moe/waylyrics | sudo bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个使用 Rust 编写的 Wayland 桌面歌词工具&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/waylyrics/waylyrics/blob/master/doc/INSTALLATION.md&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://flathub.org/apps/io.github.waylyrics.Waylyrics&quot;&gt;Flatpak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;li&gt;aur&lt;/li&gt;
&lt;li&gt;build&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;构建 &amp;amp; 安装:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 安装工具链
sudo apt-get install git nano build-essential libssl-dev libgtk-4-dev libdbus-1-dev libmimalloc-dev gettext rustup
rustup update stable
# Clone 项目
mkdir gittemp
cd gittemp
git clone https://github.com/waylyrics/waylyrics.git
cd waylyrics
# 默认设置编译
export WAYLYRICS_THEME_PRESETS_DIR=/usr/share/waylyrics/themes
cargo build --release --locked --target-dir target
# 复制产物
sudo cp ./target/release/waylyrics /usr/bin/
sudo chmod 755 /usr/bin/waylyrics
# 编译 schemas
sudo cp ./metainfo/io.github.waylyrics.Waylyrics.gschema.xml /usr/share/glib-2.0/schemas/
sudo glib-compile-schemas /usr/share/glib-2.0/schemas/
# 汉化
cd ./locales/zh_CN/LC_MESSAGES/
msgfmt waylyrics.po
sudo cp ./messages.mo /usr/share/locale/zh_CN/LC_MESSAGES/waylyrics.mo
# 设置图标
cd ../../..
sudo cp -r ./res/icons/* /usr/share/icons/
# 设置桌面图标
sudo cp ./metainfo/io.github.waylyrics.Waylyrics.desktop /usr/share/applications/
sudo chmod 644 /usr/share/applications/io.github.waylyrics.Waylyrics.desktop
# 设置主题
sudo mkdir -p /usr/share/waylyrics/themes/
sudo cp -r ./themes/* /usr/share/waylyrics/themes/
sudo chmod 755 -R /usr/share/waylyrics/themes/
# 设置软件详情
sudo cp ./metainfo/io.github.waylyrics.Waylyrics.metainfo.xml /usr/share/metainfo/
sudo update-desktop-database
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;From https://github.com/waylyrics/waylyrics/blob/master/doc/BUILD_GUIDE_UBUNTU.zh_cn.md&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;strong&gt;Bottles&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/bottles.help
curl https://sh.wss.moe/bottles | sudo bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wine / Proton 兼容层管理器，用来运行 WIndows 应用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/bottlesdevs/Bottles&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flatpak&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;功能授权&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 创建桌面启动项
flatpak override com.usebottles.bottles --user --filesystem=xdg-data/applications
# 添加 Steam 库中应用 / 游戏
flatpak override com.usebottles.bottles --filesystem=~/.local/share/Steam
flatpak override com.usebottles.bottles --filesystem=~/.var/app/com.valvesoftware.Steam/data/Steam
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;From https://docs.usebottles.com/bottles/programs&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;ProtonUp-Qt&lt;/h3&gt;
&lt;p&gt;https://github.com/DavidoTek/ProtonUp-Qt&lt;/p&gt;
&lt;p&gt;用于为 Bottles / Steam 等工具安装 GE-Proton&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;MusicPlayer2&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Windows 下的全能本地音乐播放器 (我主要用来下歌词 &amp;amp; 封面)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
需要 Wine / Proton 兼容层 &amp;lt;br/&amp;gt;
&lt;a href=&quot;#bottles&quot;&gt;Here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/zhongyang219/MusicPlayer2/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;exe&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;RustDesk&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;远控软件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/rustdesk/rustdesk/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;aur&lt;/li&gt;
&lt;li&gt;Flatpak&lt;/li&gt;
&lt;li&gt;AppImage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Remmina&lt;/strong&gt;&lt;/h2&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;sudo apt install remmina remmina-plugin-rdp remmina-plugin-vnc
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Syncthing&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/syncthing.help
curl https://sh.wss.moe/syncthing | sudo bash
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;多设备分布式文件同步工具&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/syncthing/syncthing/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Add the release PGP keys:
sudo mkdir -p /etc/apt/keyrings
sudo curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg
# Add the &quot;stable-v2&quot; channel to your APT sources:
echo &quot;deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable-v2&quot; | sudo tee /etc/apt/sources.list.d/syncthing.list
# Update and install syncthing:
sudo apt-get update
sudo apt-get install syncthing
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;From https://apt.syncthing.net/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;GNOME 扩展&lt;/h1&gt;
&lt;p&gt;首先安装 &lt;code&gt;gnome-extensions&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install gnome-shell-extensions gnome-shell-extensions-common
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;安装部分旧扩展可能需要:&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsettings set org.gnome.shell disable-extension-version-validation true
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Astra Monitor&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;托盘性能监视器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://extensions.gnome.org/extension/6682/astra-monitor/&lt;/p&gt;
&lt;p&gt;&lt;em&gt;可能&lt;/em&gt;需要安装的依赖 (AMD gpu):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nethogs&lt;/li&gt;
&lt;li&gt;iotop&lt;/li&gt;
&lt;li&gt;https://github.com/Umio-Yasuno/amdgpu_top&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Blur my Shell&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;模糊 / 透明化 托盘 / 锁屏 / 窗口 等&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://extensions.gnome.org/extension/3193/blur-my-shell/&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Random Wallpaper&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;随机轮换背景，支持设置 本地 / URL 源&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://extensions.gnome.org/extension/1040/random-wallpaper/&lt;/p&gt;
&lt;h1&gt;命令行工具&lt;/h1&gt;
&lt;h2&gt;&lt;strong&gt;q&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个轻量，易用的 DNS 客户端，支持 TCP, UDP, DoT, DoH, DoQ, oDoH&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/natesales/q/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;scrcpy&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;基于 (并内置) adb 的 Android 屏幕控制工具&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/Genymobile/scrcpy/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;tcping&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;顾名思义, 使用 tcp 协议的 ping&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/pouriyajamshidi/tcping/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;gh&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;还算好用的 GitHub 官方 CLI&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/cli/cli/blob/trunk/docs/install_linux.md&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;dnf&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;gh-gonest&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个插件，用于快速清理从 已删除组织 / 用户 / 仓库 发出的 &quot;幽灵通知&quot; (在网页客户端无法清除)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/emmanuel-ferdman/gh-gonest&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gh extension install emmanuel-ferdman/gh-gonest
# 运行: gh gonest
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;gh-p&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;自制插件，用于快速 Clone Pull Request 的更改到本地，方便进行进一步修改 &amp;amp; 直接推送到 PR 作者分支&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/wyf9/gh-p&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gh extension install wyf9/gh-p
# 运行: gh p
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Cloudflared&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/cfd.help
curl https://sh.wss.moe/cfd | sudo bash # [--skip-fix]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cloudflare Tunnel 服务端 &amp;amp; 客户端&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/cloudflare/cloudflared/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deb&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;或者使用 pkg repo:&lt;/p&gt;
&lt;p&gt;https://pkg.cloudflare.com/&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Add cloudflare gpg key
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg &amp;gt;/dev/null

# Add this repo to your apt repositories
echo &apos;deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared noble main&apos; | sudo tee /etc/apt/sources.list.d/cloudflared.list

# install cloudflared
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install cloudflared
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;提示 &lt;code&gt;failed to sufficiently increase receive buffer size&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# /etc/sysctl.conf
net.core.rmem_max=7500000
net.core.wmem_max=7500000
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;提示 &lt;code&gt;Group ID X is not between ping group X to X&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# /etc/sysctl.conf
net.ipv4.ping_group_range=0 114514
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;gost&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Go 语言实现的安全隧道&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/go-gost/gost/releases/latest&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Thefxxk&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/thefuck.help
curl https://sh.wss.moe/thefuck | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个在你打错命令暴怒时可以输入 &lt;code&gt;f**k&lt;/code&gt; 修正的工具&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/nvbn/thefuck?tab=readme-ov-file#installation&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install thefuck
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编辑 &lt;code&gt;~/.bashrc&lt;/code&gt; 追加:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ~/.bashrc
eval $(thefuck --alias)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Caddy&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/caddy.help
curl https://sh.wss.moe/caddy | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;s&gt;为什么一个 web server 会出现在这里？我不知道（&lt;/s&gt;&lt;/em&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 apt update
sudo apt install caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Other distros: https://caddyserver.com.cn/docs/install&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;编程语言&lt;/h1&gt;
&lt;h2&gt;&lt;strong&gt;Python&lt;/strong&gt; (uv)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/uv.help
curl https://sh.wss.moe/uv | bash # [version: none]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;p&gt;https://docs.astral.sh/uv/getting-started/installation/&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 uv 安装:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv python install 3.13
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;NodeJS&lt;/strong&gt; (nvm)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/node.help
curl https://sh.wss.moe/node | bash # [version: 25]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;p&gt;https://github.com/nvm-sh/nvm?tab=readme-ov-file#installing-and-updating&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 nvm 安装:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvm install 25
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装 pnpm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm i -g pnpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;换源:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm config set registry https://registry.npmmirror.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;提示 &lt;code&gt;node: error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install libatomic1 -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;PM2&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/pm2.help
curl https://sh.wss.moe/pm2 | bash
&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;pnpm i -g pm2
pm2 startup # 启用自启, 执行执行这行命令后输出的命令 (?)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Java&lt;/strong&gt; (Azul)&lt;/h2&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;p&gt;https://www.azul.com/downloads/?os=linux&amp;amp;package=jre#zulu&lt;/p&gt;
&lt;h1&gt;杂项&lt;/h1&gt;
&lt;p&gt;&amp;lt;!-- ## 防 QQ 快速登录协议盗号&lt;/p&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;/etc/hosts&lt;/code&gt; 写入 (追加不是覆盖):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /etc/hosts
# anti qq fastlogin spamming
0.0.0.0 localhost.ptlogin2.qq.com
:: localhost.ptlogin2.qq.com
``` --&amp;gt;

## **调整 Swap 文件大小**

```bash
# Quick Script | Help: https://sh.wss.moe/swap.help
curl https://sh.wss.moe/swap | sudo bash # [size: 4G] [path: /swapfile] [swappiness: 20]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 先查看现有 swap 文件的位置
sudo swapon --show
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo swapoff /swap.img
sudo rm /swap.img
sudo fallocate -l 12G /swap.img
sudo chmod 600 /swap.img
sudo mkswap /swap.img
sudo swapon /swap.img
sudo swapon --show # 查看是否生效
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
将上面的 &lt;code&gt;/swap.img&lt;/code&gt; 改为你看到 Swap 文件的路径, &lt;code&gt;12G&lt;/code&gt; 改为你想要的 Swap 大小 &amp;lt;br/&amp;gt;
查看 &lt;code&gt;/etc/fstab&lt;/code&gt; 是否有此文件的记录, 如果没有须手动添加 (注意不要删除其他记录):&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;# /etc/fstab
/swap.img none swap sw 0 0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;设置 Swap 使用频率&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;vm.swappiness&lt;/code&gt; 值在 0 - 100 之间，值越大使用越频繁&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /etc/sysctl.conf
vm.swappiness=20
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;开启 BBR&lt;/h3&gt;
&lt;p&gt;✅&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Quick Script | Help: https://sh.wss.moe/bbr.help
curl https://sh.wss.moe/bbr | sudo bash # [--bbr-only]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;更强的 TCP 拥塞控制算法，以及一些网络层面的调优设置 &lt;em&gt;(script only)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;# /etc/sysctl.conf
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;!-- ### AppArmor 管理&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install apparmor-utils
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;禁用 &lt;code&gt;firefox&lt;/code&gt; 的 AppArmor 配置 (默认配置会阻止 Firefox 访问一些文件):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo aa-disable firefox
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;--&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Cloudflare &amp; Spaceship 域名启用 DNSSEC</title><link>https://wyf9.top/posts/spaceship-cf-dnssec/</link><guid isPermaLink="true">https://wyf9.top/posts/spaceship-cf-dnssec/</guid><description>给你在 Spaceship 上购买，托管在 Cloudflare 的域名启用 DNSSEC，防伪造记录！</description><pubDate>Fri, 17 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;DNSSEC 好处有哪些?&lt;/h1&gt;
&lt;p&gt;在上面了，所以让我们开始吧 (?)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;没显示? 你没在&lt;a href=&quot;https://wyf9.top/posts/spaceship-cf-dnssec&quot;&gt;我的网站&lt;/a&gt;看我的 Blog!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Cloudflare Dashboard&lt;/h1&gt;
&lt;p&gt;首先，你需要到 Cloudflare Dashboard 获取启用 DNSSEC 所需的配置信息 (DS 记录值)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;直达链接&lt;/strong&gt;: https://dash.cloudflare.com/?to=/:account/:zone/dns/settings&lt;/p&gt;
&lt;p&gt;或者手动导航到你域名的 &lt;strong&gt;&lt;code&gt;DNS&lt;/code&gt; -&amp;gt; &lt;code&gt;设置&lt;/code&gt; -&amp;gt; &lt;code&gt;DNSSEC&lt;/code&gt; -&amp;gt; &lt;code&gt;DS 记录&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;1-cf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;你需要复制下面的几个值:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;密钥标记&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;算法&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;摘要类型&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;摘要&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Spaceship 域名设置&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;直达&lt;/strong&gt;: &lt;code&gt;https://www.spaceship.com/zh/application/advanced-dns-application/manage/你的域名/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;或者手动导航到 &lt;strong&gt;你的域名 -&amp;gt; &lt;code&gt;高级 DNS&lt;/code&gt; -&amp;gt; &lt;code&gt;Dnssec&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;2-spaceship.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;依次填入:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cloudflare 上的名称&lt;/th&gt;
&lt;th&gt;Spaceship 上的名称&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;td&gt;&lt;code&gt;2371&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;13&lt;/code&gt; -&amp;gt; &lt;code&gt;13 ECDSA/SHA-256&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;摘要类型 - 2&lt;/td&gt;
&lt;td&gt;摘要类型&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SHA256&lt;/code&gt; -&amp;gt; &lt;code&gt;2 SHA-256&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;BC02FD...AA4E24&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;3-compare.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;保存，完事。&lt;/p&gt;
&lt;h1&gt;Ref&lt;/h1&gt;
&lt;p&gt;封面图源: https://www.icann.org/resources/pages/dnssec-what-is-it-why-important-2019-03-20-zh&lt;/p&gt;
</content:encoded></item><item><title>Ubuntu without Snap</title><link>https://wyf9.top/posts/ubuntu-nosnap/</link><guid isPermaLink="true">https://wyf9.top/posts/ubuntu-nosnap/</guid><description>手把手教你如何在 Ubuntu (25.04) 上彻底卸载并防止自动重装慢的要死的 Snap</description><pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;省流 (Ubuntu 20+)&lt;/h1&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;点击展开&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;下面的代码将会:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;删除 Snapd&lt;/li&gt;
&lt;li&gt;防止 Snapd 被重新安装&lt;/li&gt;
&lt;li&gt;添加 Mozilla PPA&lt;/li&gt;
&lt;li&gt;固定 Firefox &amp;amp; Thunderbird 版本&lt;/li&gt;
&lt;li&gt;安装 PPA 版 Firefox &amp;amp; Thunderbird&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;当然，我还是建议你分步操作的 (否则出错了都不知道是哪一步)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;# 1
sudo apt purge snapd -y
sudo apt autoremove -y
# 2
echo &apos;Package: snapd
Pin: release a=*
Pin-Priority: -10

Package: *snap*
Pin: release a=*
Pin-Priority: -10&apos; | sudo tee /etc/apt/preferences.d/nosnap
# 3
sudo add-apt-repository ppa:mozillateam/ppa -y
# 4
echo &apos;Package: firefox*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 32767

Package: thunderbird*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 32767&apos; | sudo tee /etc/apt/preferences.d/mozillateamppa
# 5
sudo apt install firefox thunderbird thunderbird-gnome-support -y
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;执行完建议重启&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h1&gt;干掉 Snap&lt;/h1&gt;
&lt;p&gt;卸载 Snap 本体:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt purge snapd
sudo apt autoremove
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./4-apt-purge.png&quot; alt=&quot;4-apt-purge&quot; /&gt;&lt;/p&gt;
&lt;p&gt;执行完后 &lt;code&gt;reboot&lt;/code&gt; 重启&lt;/p&gt;
&lt;h1&gt;阻止 Snap 死灰复燃&lt;/h1&gt;
&lt;p&gt;也很简单，编辑 &lt;code&gt;/etc/apt/preferences.d/nosnap&lt;/code&gt; 写入以下内容:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /etc/apt/preferences.d/nosnap
Package: snapd
Pin: release a=*
Pin-Priority: -10

Package: *snap*
Pin: release a=*
Pin-Priority: -10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看 &lt;code&gt;apt policy snapd&lt;/code&gt;, 策略应该会阻止 snapd 和所有带 &lt;code&gt;snap&lt;/code&gt; 关键词的包安装 (优先级 &lt;code&gt;-10&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;此时执行 &lt;code&gt;sudo apt install snapd&lt;/code&gt; 应该会被阻止:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./5-anti-snapd.png&quot; alt=&quot;5-anti-snapd&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- # Snap 软件替代&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;firmware-updater&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;对应的 deb package 名: &lt;code&gt;gnome-firmware&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install gnome-firmware -y
``` --&amp;gt;

# 切换到 Firefox &amp;amp; Thunderbird PPA

首先，添加 Firefox &amp;amp; Thunderbird 的 PPA 源 (两软件在同一个源):

```bash
sudo add-apt-repository ppa:mozillateam/ppa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./1-add-ppa.png&quot; alt=&quot;1-add-ppa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来，编辑 &lt;code&gt;/etc/apt/preferences.d/mozillateamppa&lt;/code&gt;，写入以下内容:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /etc/apt/preferences.d/mozillateamppa
Package: firefox*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 32767

Package: thunderbird*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 32767
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存退出，执行 &lt;code&gt;apt policy&lt;/code&gt;, 应该看到我们新添加的 PPA 源优先级高于 Snap 版:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2-apt-policy.png&quot; alt=&quot;2-apt-policy&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装 firefox:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install firefox
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装 thunderbird (邮件客户端):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install thunderbird thunderbird-gnome-support
# thunderbird-gnome-support 是我 apt install 时看到 &quot;建议安装&quot; 的，就顺手加上了
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>uv 换源 (设置镜像源)</title><link>https://wyf9.top/posts/uv-mirror/</link><guid isPermaLink="true">https://wyf9.top/posts/uv-mirror/</guid><description>既然 pip 可以换源, uv... 当然可以! (Windows / Linux / Mac 通用)</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!TIP]
本文中的 Linux 路径在 Windows 上同理 (如 &lt;code&gt;/home/wyf9/.config/uv/uv.toml&lt;/code&gt; -&amp;gt; &lt;code&gt;C:\Users\wyf9\.config\uv\uv.toml&lt;/code&gt;) &amp;lt;br/&amp;gt;
Mac: 没用过，自己改&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;TL; DR&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Too long, didn&apos;t read&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;# Linux
nano /home/$USER/.config/uv/uv.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;:: Windows
notepad C:\Users\%USERNAME%\.config\uv\uv.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# uv.toml
index = [
  {url = &quot;https://pypi.tuna.tsinghua.edu.cn/simple/&quot;},
  {url = &quot;https://mirrors.aliyun.com/pypi/simple/&quot;},
  {url = &quot;https://mirror.sjtu.edu.cn/pypi/web/simple/&quot;},
  {url = &quot;https://mirrors.ustc.edu.cn/pypi/web/simple/&quot;},
  {url = &quot;https://mirrors.cernet.edu.cn/pypi/web/simple&quot;}
]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;TS; JR&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Too &lt;em&gt;short&lt;/em&gt;, just read&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;官方文档: https://docs.astral.sh/uv/concepts/configuration-files/&lt;/p&gt;
&lt;p&gt;从以上文档中, 我们便可以知道:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;uv 的配置文件在 &lt;code&gt;~/.config/uv/uv.toml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可以在里面配置镜像源&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你只想设置一个镜像源:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# uv.toml
[[index]]
url = &quot;https://pypi.tuna.tsinghua.edu.cn/simple/&quot;
default = true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想设置多个:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# uv.toml
[[index]]
url = &quot;https://pypi.tuna.tsinghua.edu.cn/simple/&quot;
default = true

[[index]]
url = &quot;https://mirrors.cernet.edu.cn/pypi/web/simple&quot;
default = true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以用这样的格式:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# uv.toml
index = [
  {url = &quot;https://pypi.tuna.tsinghua.edu.cn/simple/&quot;},
  {url = &quot;https://mirrors.aliyun.com/pypi/simple/&quot;},
  {url = &quot;https://mirror.sjtu.edu.cn/pypi/web/simple/&quot;},
  {url = &quot;https://mirrors.ustc.edu.cn/pypi/web/simple/&quot;},
  {url = &quot;https://mirrors.cernet.edu.cn/pypi/web/simple&quot;}
]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;常用的镜像列表&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
镜像描述 -&amp;gt; Grok&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;清华大学 (TUNA)&lt;/strong&gt;: https://pypi.tuna.tsinghua.edu.cn/simple/&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;国内最稳定、更新及时的镜像之一。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;阿里云&lt;/strong&gt;: https://mirrors.aliyun.com/pypi/simple/&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;下载速度快，适合大规模使用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;中国科学技术大学 (USTC)&lt;/strong&gt;: https://mirrors.ustc.edu.cn/pypi/web/simple/&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;学术镜像，包完整度高。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;上海交通大学 (SJTU)&lt;/strong&gt;: https://mirrors.sjtu.edu.cn/pypi/web/simple/&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;教育机构镜像，稳定可靠。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;豆瓣&lt;/strong&gt;: https://pypi.douban.com/simple/&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;轻量级镜像，速度中等。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;网易&lt;/strong&gt;: https://mirrors.163.com/pypi/simple/&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;商业镜像，覆盖全面。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;腾讯云&lt;/strong&gt;: https://mirrors.cloud.tencent.com/pypi/simple/&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;云服务提供商镜像，下载高效。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;搜狐&lt;/strong&gt;: http://mirrors.sohu.com/pypi/simple/&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;老牌镜像，适合备用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;北京外国语大学 (BFSU)&lt;/strong&gt;: https://mirrors.bfsu.edu.cn/pypi/web/simple/&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;教育镜像，更新较快。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;pip 如何设置&lt;/h2&gt;
&lt;p&gt;临时:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install fastapi -i MIRROR-URL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;永久:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip config set global.index-url MIRROR-URL
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
将上面的 &lt;code&gt;MIRROR-URL&lt;/code&gt; 替换为你的镜像地址&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>使用 boot-repair 拯救你 Linux 电脑的引导!</title><link>https://wyf9.top/posts/boot-repair/</link><guid isPermaLink="true">https://wyf9.top/posts/boot-repair/</guid><description>有时开电脑会突然进 grub, 退出提示 device not found, 此时就可以用 livecd + boot-repair 工具解决</description><pubDate>Sat, 27 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;凌晨感觉电脑有点卡, 索性输入 reboot 回车, 然后: &lt;strong&gt;炸了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1-buxybox.png&quot; alt=&quot;buxybox&quot; /&gt;&lt;/p&gt;
&lt;p&gt;总之就是进 busybox, exit 回车大概率退不出, 提示图中的 &lt;code&gt;ALERT! UUID=xxx does not exist. Dropping to a shell!&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这种情况不用怀疑, 就是引导的问题&lt;/p&gt;
&lt;p&gt;那么, 如何修复呢?&lt;/p&gt;
&lt;h1&gt;安装 boot-repair&lt;/h1&gt;
&lt;p&gt;修复很简单, 只需要使用 YannUbuntu 大佬的 boot-repair 工具修复即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2-details.png&quot; alt=&quot;details&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先, 你需要准备一个 &lt;strong&gt;Ubuntu&lt;/strong&gt; 系统的 Live USB / CD, 从其中启动 (因为原系统一般已无法引导, 也可使用 Ventoy)&lt;/p&gt;
&lt;p&gt;进入 Live CD 系统后, 关掉安装窗口, 在开始菜单找到 &lt;strong&gt;Terminal (终端)&lt;/strong&gt; 打开&lt;/p&gt;
&lt;p&gt;这个工具在 Launchpad PPA 中有提供, 所以可以用简单的两行命令下载安装:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 添加 PPA Repo
sudo add-apt-repository ppa:yannubuntu/boot-repair
# 很多人说这里需要手动 update, 但实测 add-apt-repository 会自动帮我们更新
# sudo apt update
# 安装
sudo apt install boot-repair
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./3-add-ppa.png&quot; alt=&quot;add-ppa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./4-install-bootrepair.png&quot; alt=&quot;install-bootrepair&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;没网怎么办?&lt;/h2&gt;
&lt;p&gt;手动下载 boot-repair 的 deb 文件: https://launchpad.net/~yannubuntu/+archive/ubuntu/boot-repair/+packages&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./5-download-debs.png&quot; alt=&quot;download-debs&quot; /&gt;&lt;/p&gt;
&lt;p&gt;展开一个 Package, 找到其 &lt;strong&gt;Package Files&lt;/strong&gt; 并下载全部以 &lt;code&gt;.deb&lt;/code&gt; 结尾的文件, 放在一个文件夹中, 并想办法搞到 LiveCD 系统中使用 &lt;strong&gt;&lt;code&gt;sudo apt install ./*.deb&lt;/code&gt;&lt;/strong&gt; 安装即可&lt;/p&gt;
&lt;h2&gt;不是 Ubuntu 系统?&lt;/h2&gt;
&lt;p&gt;即使你硬盘上的系统不是 Ubuntu, 也可以使用 Ubuntu LiveCD + 此工具 修复引导:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./6-os-not-matter.png&quot; alt=&quot;os-not-matter&quot; /&gt;&lt;/p&gt;
&lt;p&gt;或者, 你可以到它的主页 https://sourceforge.net/p/boot-repair/home/cn/ 查找其他系统版本&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
注意: boot-repair 只能在 livecd 环境中启动, 在本地系统无效&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;修复引导&lt;/h1&gt;
&lt;p&gt;启动 boot-repair:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./7-run.png&quot; alt=&quot;run&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo boot-repair
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首先回答一个问题: &lt;code&gt;Is there RAID on this computer?&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./8-raid.png&quot; alt=&quot;raid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如不知道直接 &lt;code&gt;No&lt;/code&gt;, 建议看实际情况选择&lt;/p&gt;
&lt;p&gt;接下来, 等待扫描 (~1min):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./9-scanning.png&quot; alt=&quot;scanning&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入主界面, 首先点击 &lt;code&gt;Advanced options&lt;/code&gt;, 勾选 &lt;strong&gt;&lt;code&gt;Repair file systems&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./10-set-repair.png&quot; alt=&quot;set-repair&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如系统没有网络 / 不需要上传到 Pastebin, 可以在 Other options 取消勾选相关设置, 加快完成速度&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
建议点 &lt;code&gt;Backup partition tables, bootsectors and logs&lt;/code&gt; 备份分区表等信息到其他磁盘&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后直接点击 &lt;strong&gt;&lt;code&gt;Apply&lt;/code&gt;&lt;/strong&gt; 应用更改, 需要在弹出下图窗口时关掉其他软件 (因为会临时卸载磁盘)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./11-unmount.png&quot; alt=&quot;unmount&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待修复 (一般不超过 5 分钟)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./12-repairing.png&quot; alt=&quot;repairing&quot; /&gt;&lt;/p&gt;
&lt;p&gt;出现下图提示即为修复成功, 可重启电脑查看效果&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./13-success.png&quot; alt=&quot;success&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
建议复制关闭窗口后打开的日志, 如出现问题可发邮件到 &lt;strong&gt;&lt;a href=&quot;mailto:boot.repair@gmail.com&quot;&gt;boot.repair[@]gmail.com&lt;/a&gt;&lt;/strong&gt; 反馈&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>在 Linux 上解决 OBS 直播推流不走代理的问题</title><link>https://wyf9.top/posts/linux-obs-proxy/</link><guid isPermaLink="true">https://wyf9.top/posts/linux-obs-proxy/</guid><description>发现我的 OBS 连 Twitch 服务器既不走系统代理也不走 TUN, 在 Grok 的推荐下发现了 GOST 反代工具 (同时适用于 Windows / Linux)</description><pubDate>Sun, 21 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;em&gt;可直接跳转到: &lt;a href=&quot;#%E6%88%90%E5%8A%9F-gost&quot;&gt;# (成功) GOST&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最近因为 Clash Verge 占用太大, 切换到了 Mihomo Core, 但发现 OBS 直播连不上了:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1-cannot-connect.png&quot; alt=&quot;obs 连接失败&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但问题是: 我既开了系统代理, 也开了 TUN (&lt;code&gt;tun: enable: true&lt;/code&gt;), &lt;strong&gt;但 OBS 就是不用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在询问 Grok 后, 我得到了两种方案: &lt;strong&gt;Proxychains&lt;/strong&gt; 和 &lt;strong&gt;GOST&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2-grok-answer.png&quot; alt=&quot;grok&apos;s answer&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://grok.com/share/c2hhcmQtNA%3D%3D_22494f12-c044-4fcb-9b48-0ca6dfed06e1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;(失败) Proxychains&lt;/h1&gt;
&lt;p&gt;既然 Grok 都说它是最流行的代理工具了, 当然要试试&lt;/p&gt;
&lt;p&gt;安装很简单:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install proxychains -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来编辑 &lt;code&gt;/etc/proxychains.conf&lt;/code&gt; (替换 &lt;code&gt;11451&lt;/code&gt; 为你的混合代理端口):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./3-change-port.png&quot; alt=&quot;更改端口&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一切进行得很顺利, 使用 &lt;code&gt;proxychains obs&lt;/code&gt; 启动, 然后炸了:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./4-failed.png&quot; alt=&quot;无法连接 (dns)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我先后尝试了四种方式解决:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;关掉 Proxy DNS requests&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./5-proxy-dns.png&quot; alt=&quot;proxy dns&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;改成 HTTP 代理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./6-http-proxy.png&quot; alt=&quot;http proxy&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;取消环境变量 (&lt;code&gt;xxx_proxy&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./7-unset-env.png&quot; alt=&quot;unset env&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;关掉 TUN&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;无果, 只好放弃这个方案.&lt;/p&gt;
&lt;h1&gt;(成功) GOST&lt;/h1&gt;
&lt;p&gt;::github{repo=&quot;go-gost/gost&quot;}&lt;/p&gt;
&lt;p&gt;GOST 是用 Go 编写的安全隧道软件, 国人维护, 有很多代理相关的功能:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./8-gost.png&quot; alt=&quot;gost 功能&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先打开 &lt;strong&gt;&lt;a href=&quot;https://github.com/go-gost/gost/releases/latest&quot;&gt;Releases&lt;/a&gt;&lt;/strong&gt;, 下载你系统版本的压缩包&lt;/p&gt;
&lt;p&gt;解压并将 &lt;code&gt;gost&lt;/code&gt; 复制到 &lt;code&gt;/usr/bin/&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tar -zxvf gost_3.2.4_linux_amd64.tar.gz # 3.2.4 -&amp;gt; your version
rm LICENSE README.md README_en.md
sudo mv gost /usr/bin/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用下面的命令启动隧道:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gost -L=tcp://:1935/hkg06.contribute.live-video.net:1935 -F=socks5://127.0.0.1:11451
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
替换 &lt;code&gt;:11451&lt;/code&gt; 为你的 soocks 监听端口 &amp;lt;br/&amp;gt;
直播 rtmp 服务器地址 (Twitch) 在 https://ingest.twitch.tv/ingests 查找&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;看到如下提示即为成功启动&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./9-started.png&quot; alt=&quot;start success&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来, 打开 OBS 设置 -&amp;gt; 直播&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务器&lt;/strong&gt;改为 &lt;code&gt;指定自定义服务器...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义服务器&lt;/strong&gt;改为 &lt;code&gt;rtmp://127.0.0.1:1935/app/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./10-obs-setting.png&quot; alt=&quot;obs settings&quot; /&gt;&lt;/p&gt;
&lt;p&gt;保存设置, 点击 &lt;code&gt;开始直播&lt;/code&gt; 应该就能正常串流了&lt;/p&gt;
</content:encoded></item><item><title>又做了一个拆分双语歌词的工具</title><link>https://wyf9.top/posts/lyric-split-oneline/</link><guid isPermaLink="true">https://wyf9.top/posts/lyric-split-oneline/</guid><description>因为 MusicPlayer2 下载的歌词文件原歌词和翻译在一行, 很多软件无法识别, 就做了一个 Python 脚本来转换成双行歌词</description><pubDate>Sun, 14 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;缘由&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;前情提要: &lt;a href=&quot;./mix-lyrics.md&quot;&gt;合并歌词脚本&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;知周所众, 我下载音乐的工作流是这样的:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TB
    A[B 站手机客户端缓存视频] --&amp;gt; B[adbfs 挂载到电脑]
    B --&amp;gt; C[wyf9/music 脚本提取出 mp3 文件]
    C --&amp;gt; D[&quot;**MusicPlayer2 下载封面 &amp;amp; 歌词**&quot;]
    C --&amp;gt; E[从 Waylyrics 查找并下载歌词]
    E --&amp;gt; H[手动下载封面]
    C --&amp;gt; F[从网上手动下载封面 &amp;amp; 歌词]
    D --&amp;gt; G[&quot;git add &amp;amp;&amp;amp; git commit -S &amp;amp;&amp;amp; git push&quot;]
    H --&amp;gt; G
    F --&amp;gt; G
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;问题就出在了&lt;strong&gt;从 MusicPlayer2 下载歌词&lt;/strong&gt;这一步&lt;/p&gt;
&lt;p&gt;MusicPlayer2 从网易云源下载歌词:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1-musicplayer2-download-lyric.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因此, 下载到的歌词是 &lt;strong&gt;&lt;code&gt;[时间戳]原文 / 译文&lt;/code&gt;&lt;/strong&gt; 的格式, 而这种格式&lt;strong&gt;很多软件都无法识别&lt;/strong&gt;, 会直接当作单语歌词来处理:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./3-waylyrics.png&quot; alt=&quot;Waylyrics&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./4-salt-player.png&quot; alt=&quot;Salt Player&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如你所见, 上面 MusicPlayer2 的编辑歌词界面中也有互转选项, 但是 &lt;strong&gt;太麻烦&lt;/strong&gt;, 于是我在两个库 + Grok 的帮助下写出了这个拆分歌词的脚本.&lt;/p&gt;
&lt;h2&gt;代码&lt;/h2&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;点击展开&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# main.py
# coding: utf-8

import os
from copy import deepcopy

from mutagen.id3 import ID3
from mutagen.id3._frames import USLT
from pylrc import parse
from pylrc.classes import LyricLine
from charset_normalizer import detect
from colorama import Fore

from utils import *


def help(code: int = 0):
    print(&apos;&apos;&apos;
Usage:
  - main.py &amp;lt;mode&amp;gt; &amp;lt;path&amp;gt;
  - main.py &amp;lt;mode&amp;gt; &amp;lt;path&amp;gt; &amp;lt;prefix&amp;gt;
  - main.py &amp;lt;mode&amp;gt; &amp;lt;path&amp;gt; &amp;lt;prefix_start&amp;gt; &amp;lt;prefix_end&amp;gt; [prefix_spliter]
    * contains prefix_start and prefix_end
    * perfix_spliter is _ by default
&apos;&apos;&apos;)
    exit(code)


def ms_to_tag(line: LyricLine) -&amp;gt; str:
    return f&apos;{line.minutes:02d}:{line.seconds:02d}.{line.milliseconds:03d}&apos;


def extract_lyrics(id3: ID3) -&amp;gt; tuple[str | None, str]:
    try:
        uslt_frames = id3.getall(&apos;USLT&apos;)
        if not uslt_frames:
            return None, &quot;No lyrics (USLT) tag found&quot;

        lyrics = uslt_frames[0].text
        return lyrics, f&quot;Found lyrics (lang: {uslt_frames[0].lang}, description: {uslt_frames[0].desc})&quot;

    except Exception as e:
        return None, f&quot;Error reading ID3 tags: {e}&quot;


def edit_lyrics(id3: ID3, lrc: str) -&amp;gt; tuple[bool, str]:
    try:
        uslt_frames = id3.getall(&apos;USLT&apos;)
        if not uslt_frames:
            return False, &quot;No lyrics (USLT) tag found&quot;
        lang = uslt_frames[0].lang
        desc = uslt_frames[0].desc
        id3.delall(&apos;USLT&apos;)
        id3.add(USLT(lang=lang, desc=desc, text=lrc))
        # 保存更改
        id3.save()
        return True, &quot;Lyrics successfully written to USLT tag&quot;
    except Exception as e:
        return False, f&quot;Error writing lyrics to ID3 tags: {e}&quot;


def process(filename: str, mode: str) -&amp;gt; tuple[bool | None, str]:
    # get lyrics
    if mode == &apos;mp3&apos;:
        id3 = ID3(filename)
        lrc, desc = extract_lyrics(id3)
        if not lrc:
            return False, desc
        lrc = lrc.replace(&apos;\n&apos;, &apos;&apos;)
        debug(f&quot;* Read mp3 tag content (first 50 chars): {lrc[:50].replace(&apos;\n&apos;, f&apos;{Fore.CYAN}\\n{Fore.BLUE}&apos;)}&quot;)
    else:
        try:
            with open(filename, &apos;rb&apos;) as f:
                raw_data = f.read()
                encoding_result = detect(raw_data)
                encoding = encoding_result.get(&apos;encoding&apos;)
                confidence = encoding_result.get(&apos;confidence&apos;)
                debug(f&quot;* Detected encoding: {encoding} (confidence: {confidence})&quot;)

            if encoding is None:
                return False, f&quot;Unable to detect encoding for {filename}&quot;

            with open(filename, &apos;r&apos;, encoding=encoding) as f:
                lrc = &apos;&apos;.join(f.readlines())
            debug(f&quot;* Read lrc content (first 50 chars): {lrc[:50].replace(&apos;\n&apos;, f&apos;{Fore.CYAN}\\n{Fore.BLUE}&apos;)}&quot;)
        except UnicodeDecodeError as e:
            return False, f&quot;Failed to read file with encoding {encoding}: {e}&quot;
        except Exception as e:
            return False, f&quot;Error reading file: {e}&quot;

    # check if need split
    if not lrc.find(&apos; / &apos;) &amp;gt; 10:
        return None, &apos;&apos;

    # process lyrics
    lyric = parse(lrc)
    new = deepcopy(lyric)
    new.clear()

    i = 0
    line: LyricLine
    while i &amp;lt; len(lyric):
        try:
            line = lyric[i]
            if &apos; / &apos; in line.text:
                origline = deepcopy(line)
                tranline = deepcopy(line)
                orig, tran = line.text.split(&apos; / &apos;, 1)
                origline.text = orig.lstrip(&apos; &apos;).rstrip(&apos; &apos;)
                tranline.text = tran.lstrip(&apos; &apos;).rstrip(&apos; &apos;)
                new.append(origline)
                new.append(tranline)
            else:
                new.append(line)
            i += 1
        except IndexError:
            break

    # write file
    if mode == &apos;mp3&apos;:
        edit_lyrics(id3, new.toLRC())
        id3.save()
    else:
        with open(filename, &apos;w&apos;, encoding=&apos;utf-8&apos;) as f:
            f.write(new.toLRC())

    return True, &apos;&apos;


def main():
    # show help
    if &apos;--help&apos; in argv:
        help()

    # --- get args
    p = perf_counter()
    mode = getargv(1)
    assert mode, &apos;Please provide a mode at param #1!&apos;
    assert mode == &apos;mp3&apos; or mode == &apos;lrc&apos;, &apos;Invaild mode, it should be mp3 or lrc!&apos;
    path = getargv(2)
    assert path, &apos;Please provide a path at param #2!&apos;
    assert os.path.isdir(path), &apos;Path isn\&apos;t exist!&apos;
    arg3 = getargv(3)
    arg4 = getargv(4)
    prefix_mode = 0  # no prefix
    if arg3:
        if arg4:
            try:
                prefix_start = int(arg3)
                prefix_end = int(arg4)
                prefix_spliter = getargv(5) or &apos;_&apos;
                prefix_mode = 2  # number range
            except:
                raise AssertionError(&apos;Prefix start / end isn\&apos;t number!&apos;)
        else:
            prefix: str = arg3
            prefix_mode = 1  # str prefix
    debug(f&apos;* get args took {p()}ms&apos;)

    # --- get files
    p = perf_counter()
    raw = os.listdir(path)
    log(f&apos;All files and folders: {len(raw)}&apos;)
    files = []
    debug(f&apos;* prefix mode: {prefix_mode}&apos;)
    for f in raw:
        if f.endswith(mode):
            if prefix_mode == 1:
                if f.startswith(prefix):
                    files.append(f)
            elif prefix_mode == 2:
                pref = f.split(prefix_spliter, 1)[0]
                if not pref:
                    continue
                try:
                    pref = int(pref)
                    if prefix_start &amp;lt;= pref &amp;lt;= prefix_end:
                        files.append(f)
                except ValueError:
                    continue
            else:
                files.append(f)
    debug(f&apos;* get files took {p()}ms&apos;)
    log(f&apos;Files filtered: {len(files)} - {files}&apos;)

    # --- process file
    for f in files:
        p = perf_counter()
        try:
            success, msg = process(os.path.join(path, f), mode=mode)
            if success is None:
                log(f&apos;processing {f}: not needed&apos;)
            elif success:
                log(f&apos;process {f} success&apos;)
            else:
                warn(f&apos;processing {f} error: {msg}&apos;)
        except Exception as e:
            warn(f&apos;processing {f} error: {e}&apos;)
        debug(f&apos;* process {f} took {p()}ms&apos;)

    log(&apos;Finished!&apos;)


if __name__ == &quot;__main__&quot;:
    try:
        main()
    except AssertionError as err:
        error(&apos; &apos;.join(err.args))
        help(1)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# utils.py
# coding: utf-8
from sys import argv
from time import perf_counter as __perf_counter

from colorama import Fore, Style


def getargv(key: int, default: str | None = None):
    try:
        return argv[key]
    except IndexError:
        return default


def perf_counter():
    &apos;&apos;&apos;
    获取一个性能计数器, 执行返回函数来结束计时, 并返回保留两位小数的毫秒值
    - copied from sleepy utils.py 😋
    &apos;&apos;&apos;
    start = __perf_counter()
    return lambda: round((__perf_counter() - start)*1000, 2)


def log(*content):
    print(f&apos;{Fore.GREEN}{&quot; &quot;.join(str(c) for c in content)}{Style.RESET_ALL}&apos;)


def debug(*content):
    print(f&apos;{Fore.BLUE}{&quot; &quot;.join(str(c) for c in content)}{Style.RESET_ALL}&apos;)


def warn(*content):
    print(f&apos;{Fore.YELLOW}{&quot; &quot;.join(str(c) for c in content)}{Style.RESET_ALL}&apos;)


def error(*content):
    print(f&apos;{Fore.RED}{&quot; &quot;.join(str(c) for c in content)}{Style.RESET_ALL}&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# pyproject.toml
[project]
name = &quot;split-multilang-lyric&quot;
version = &quot;0.1.0&quot;
requires-python = &quot;&amp;gt;=3.13&quot;
dependencies = [
    &quot;charset-normalizer&amp;gt;=3.4.3&quot;,
    &quot;colorama&amp;gt;=0.4.6&quot;,
    &quot;mutagen&amp;gt;=1.47.0&quot;,
    &quot;pylrc&amp;gt;=0.1.2&quot;,
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;同样已经上传到 &lt;a href=&quot;https://github.com/wyf9/lrc-tools/tree/main/split_multilang_lyric&quot;&gt;GitHub (&lt;code&gt;split_multilang_lyric&lt;/code&gt; 目录)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::github{repo=&quot;wyf9/lrc-tools&quot;}&lt;/p&gt;
&lt;h2&gt;如何使用&lt;/h2&gt;
&lt;p&gt;有三种使用方式:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;python3 main.py&lt;/code&gt; &lt;code&gt;&amp;lt;mode&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;mode&lt;/code&gt; 可选 &lt;code&gt;mp3&lt;/code&gt; / &lt;code&gt;lrc&lt;/code&gt;, 对&lt;strong&gt;指定目录&lt;/strong&gt; (&lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt;) 中&lt;strong&gt;此后缀&lt;/strong&gt; (&lt;code&gt;&amp;lt;mode&amp;gt;&lt;/code&gt;) 的文件进行处理 &lt;em&gt;(不会扫描子目录)&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;python3 main.py&lt;/code&gt; &lt;code&gt;&amp;lt;mode&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;prefix&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;同上, 但是增加筛选条件: 文件名必须以&lt;strong&gt;指定的前缀&lt;/strong&gt; (&lt;code&gt;&amp;lt;prefix&amp;gt;&lt;/code&gt;) 开头&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;python3 main.py&lt;/code&gt; &lt;code&gt;&amp;lt;mode&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;prefix_start&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;prefix_end&amp;gt;&lt;/code&gt; &lt;code&gt;[prefix_spliter]&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;同 &lt;code&gt;1.&lt;/code&gt;, 但是增加筛选条件: 文件名必须&lt;strong&gt;以 &lt;code&gt;&amp;lt;prefix_start&amp;gt;&lt;/code&gt; 和 &lt;code&gt;&amp;lt;prefix_end&amp;gt;&lt;/code&gt; 区间内的数字 + &lt;code&gt;[prefix_spliter]&lt;/code&gt; &lt;em&gt;(默认为 &lt;code&gt;_&lt;/code&gt;)&lt;/em&gt; 开头&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;比如你执行 &lt;code&gt;python3 main.py mp3 ./ 1 3&lt;/code&gt; (&lt;code&gt;1&lt;/code&gt; - &lt;code&gt;3&lt;/code&gt;), 文件夹中有以下文件:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1_617700852_Shadow Of The Sun.mp3
1_617700852_Shadow Of The Sun.lrc
2_676186170_See You Again.mp3
2_676186170_See You Again.lrc
3_549442278_Far Away From Home.mp3
4_85054372_溯.mp3
5_400766871_平凡之路.mp3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;则会匹配到以下文件:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1_617700852_Shadow Of The Sun.mp3
2_676186170_See You Again.mp3
3_549442278_Far Away From Home.mp3
4_85054372_溯.mp3
5_400766871_平凡之路.mp3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;Usage&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Usage:
  - main.py &amp;lt;mode&amp;gt; &amp;lt;path&amp;gt;
  - main.py &amp;lt;mode&amp;gt; &amp;lt;path&amp;gt; &amp;lt;prefix&amp;gt;
  - main.py &amp;lt;mode&amp;gt; &amp;lt;path&amp;gt; &amp;lt;prefix_start&amp;gt; &amp;lt;prefix_end&amp;gt; [prefix_spliter]
    * contains prefix_start and prefix_end
    * perfix_spliter is _ by default
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h2&gt;End&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Enjoy!&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>From NameSilo to Spaceship (手把手教程)</title><link>https://wyf9.top/posts/namesilo-to-spaceship/</link><guid isPermaLink="true">https://wyf9.top/posts/namesilo-to-spaceship/</guid><description>记录 wyf9.top 域名从 NameSilo 转出到 Spaceship 的过程</description><pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;如图:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1-compare.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;话不多说, 正式开始转出流程!&lt;/p&gt;
&lt;h1&gt;解锁域名&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如果域名已解锁 (状态为 &lt;code&gt;ok&lt;/code&gt;) 可&lt;strong&gt;跳过此步骤&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先转到 &lt;a href=&quot;https://www.namesilo.com&quot;&gt;Namesilo 官网&lt;/a&gt;, 右上角登录后找到 &lt;strong&gt;&lt;code&gt;Domain Manager&lt;/code&gt;&lt;/strong&gt; 或直接打开:&lt;/p&gt;
&lt;p&gt;https://www.namesilo.com/account_domains.php&lt;/p&gt;
&lt;p&gt;接下来找到你要转出的域名, &lt;strong&gt;点击域名名称&lt;/strong&gt; 进入控制台:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2-namesilo-domain-list.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;拉到页面底部, 找到 &lt;strong&gt;&lt;code&gt;Domain Lock&lt;/code&gt;&lt;/strong&gt; 点击切换:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./3-unlock-domain.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;操作完成后稍等几秒, 再查询域名状态可以发现之前的 &lt;code&gt;clientTransferProhibited&lt;/code&gt; 变成了 &lt;strong&gt;&lt;code&gt;ok&lt;/code&gt;&lt;/strong&gt;, 完成解锁&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./4-unlocked.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;获取转移码&lt;/h1&gt;
&lt;p&gt;在刚刚解锁域名处上面找到 &lt;code&gt;Authorization Code&lt;/code&gt;, 点击右边的 &lt;strong&gt;&lt;code&gt;Send Email&lt;/code&gt;&lt;/strong&gt; 发送带转移码的邮件:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./5-send-transfer-code.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;弹出 &lt;code&gt;Oh no! What&apos;s leading you to transfer out&lt;/code&gt;, 可直接点 &lt;code&gt;Skip&lt;/code&gt; 跳过评价:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./6-skip-feedback.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待几秒, 应该就会收到含转移码的邮件, 复制其中的转移码:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./7-code-email.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;在 Spaceship 转入域名&lt;/h1&gt;
&lt;p&gt;打开 https://www.spaceship.com/zh/domain-transfer-submit/&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在上面的输入框输入你的域名, 点击 &lt;strong&gt;&lt;code&gt;转移&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;输入上面邮件中的授权码 &lt;em&gt;(稍等两秒, 右边的 &lt;code&gt;注册商锁定&lt;/code&gt; 状态应变为 &lt;code&gt;已解锁&lt;/code&gt;)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;&lt;code&gt;添加到购物车&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./8-spaceship-submit.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;使用优惠码&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如果非 Spaceship 新用户 &lt;em&gt;(或找不到你域名后缀的优惠码)&lt;/em&gt; 可跳过此段, 直接点击 &lt;code&gt;结账&lt;/code&gt; &lt;em&gt;(老用户不适用大部分优惠码)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;打开 https://www.spaceship.com/zh/promos, 并找到你的域名后缀, 复制优惠码 (如 &lt;code&gt;.top&lt;/code&gt; 在 2025-09-04 写文时为 &lt;strong&gt;&lt;code&gt;SPSR86&lt;/code&gt;&lt;/strong&gt;):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./9-promos.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来, 在弹出的购物车菜单中点击 &lt;code&gt;添加促销代码&lt;/code&gt;, 输入上面获取到的优惠码, 并点击上方的 &lt;strong&gt;&lt;code&gt;注册&lt;/code&gt;&lt;/strong&gt; (如已有账号则登录):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./10-cart-with-promo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;登录后点击右上角用户头像左侧 &lt;strong&gt;🛒&lt;/strong&gt; 图标, 重新打开购物车菜单, 并重新粘贴优惠码点击 &lt;strong&gt;&lt;code&gt;应用&lt;/code&gt;&lt;/strong&gt;, 应用成功后点击结账&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./12-cart-again.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
如果提示 &lt;code&gt;检测到VPN或代理&lt;/code&gt;, 请 &lt;strong&gt;临时关掉代理软件&lt;/strong&gt;, &lt;em&gt;或给 &lt;code&gt;spaceship.com&lt;/code&gt; 及其子域名添加直连规则&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;结账流程&lt;/h1&gt;
&lt;p&gt;来到结账页面, 首先找到 &lt;strong&gt;&lt;code&gt;添加支付方式&lt;/code&gt;&lt;/strong&gt;, 选择可用的支付方式添加&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./13-add-payment-method.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
国内建议使用支付宝, &lt;strong&gt;不支持微信支付!!!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;支付宝开通代扣成功后会自动重定向, 并提示你增加一个账单地址, 如实填写即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./14-add-address.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./15-save-payment-method.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;设置完成后, 点击 &lt;strong&gt;&lt;code&gt;立即付款&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./16-pay-now.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./17-alipay.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;支付完成后, 可能需要等待几分钟:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./18-wait-processing.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;出现 &lt;code&gt;完成！您已准备好开启体验&lt;/code&gt; 的提示即代表转移成功:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./19-process-success.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;加速转移&lt;/h1&gt;
&lt;p&gt;如图, 默认情况下, 域名转移需要等待 5 天:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./20-transfer-slow.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在我们需要回到 NameSilo 控制台, 找到 &lt;strong&gt;&lt;code&gt;Transfer Manager&lt;/code&gt;&lt;/strong&gt; 进入&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;或直接打开 https://www.namesilo.com/account_transfers.php&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;接下来, 找到页面底部 &lt;strong&gt;&lt;code&gt;Pending Outbound Transfers&lt;/code&gt;&lt;/strong&gt; -&amp;gt; 你的域名 -&amp;gt; 点击 &lt;strong&gt;&lt;code&gt;Approve&lt;/code&gt;&lt;/strong&gt; 栏图标 -&amp;gt; 新页面点击 &lt;strong&gt;&lt;code&gt;SUBMIT&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./21-approve-transfer.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./22-submit-approval.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;操作完成之后 Spaceship 的显示会有 &lt;em&gt;数分钟&lt;/em&gt; - &lt;em&gt;数小时&lt;/em&gt; 延迟, 但域名实际上已可正常使用, 至此教程结束.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;过程中没有 1s 的 DNS 停机, 可放心迁移 (?&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>合并歌词脚本</title><link>https://wyf9.top/posts/mix-lyrics/</link><guid isPermaLink="true">https://wyf9.top/posts/mix-lyrics/</guid><description>因为 Waylyrics 只支持导出原始歌词 / 翻译后歌词, 不支持同时导出, 遂用 Python + pylrc 写了一个合并歌词的小脚本</description><pubDate>Thu, 28 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;起因&lt;/h1&gt;
&lt;p&gt;最近在使用 Waylyrics 配合 Audacious 显示歌词, 偶然间发现它的歌词源比 MusicPlayer2 要更加丰富, 但是只能分别导出原始歌词和翻译后歌词:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1-waylyrics.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;导出的歌词内容:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2-compare.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;左为原歌词, 右为翻译后歌词&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;于是&lt;/h1&gt;
&lt;p&gt;我就写了这样的一个小脚本:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;已经上传到 &lt;a href=&quot;https://github.com/wyf9/lrc-tools/blob/main/mix_lyrics/main.py&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::github{repo=&quot;wyf9/lrc-tools&quot;}&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;点击展开代码&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import pylrc
from pylrc.classes import Lyrics, LyricLine
import os


def load_lrc(fname: str) -&amp;gt; Lyrics:
    with open(fname, &apos;r&apos;, encoding=&apos;utf-8&apos;) as f:
        lrcstr = &apos;&apos;.join(f.readlines())
        return pylrc.parse(lrcstr)


def get_lst() -&amp;gt; list[str]:
    lst = []
    filelst = os.listdir(&apos;.&apos;)
    for fname in filelst:
        if fname.endswith(&apos;_orig.lrc&apos;):
            if fname[:-9] + &apos;_tran.lrc&apos; in filelst:
                lst.append(fname[:-9])
    return lst

def ms_to_tag(line: LyricLine) -&amp;gt; str:
    return f&apos;{line.minutes:02d}:{line.seconds:02d}.{line.milliseconds:03d}&apos;

def find_match(lyrics: Lyrics, time: str | LyricLine) -&amp;gt; LyricLine | None:
    if isinstance(time, LyricLine):
        time = ms_to_tag(time)
    for i in range(len(lyrics)):
        if ms_to_tag(lyrics[i]) == time and lyrics[i].text != &apos;&apos;:
            return lyrics[i]
    return None

def transfer(fname: str) -&amp;gt; None:
    orig = load_lrc(f&apos;{fname}_orig.lrc&apos;)
    tran = load_lrc(f&apos;{fname}_tran.lrc&apos;)
    mixed = load_lrc(f&apos;{fname}_orig.lrc&apos;)

    mixed.clear()

    i = 0
    while i &amp;lt; len(orig):
        try:
            mixed.append(orig[i])
            match = find_match(tran, orig[i])
            if match:
                mixed.append(match)
        except IndexError:
            pass
        i += 1
    result = mixed.toLRC()
    with open(f&apos;{fname}_mixed.lrc&apos;, &apos;w&apos;, encoding=&apos;utf-8&apos;) as f:
        f.write(result)


if __name__ == &apos;__main__&apos;:
    lst = get_lst()
    print(f&apos;List: {lst}&apos;)
    for i in lst:
        print(f&apos;Transferring {i}...&apos;)
        transfer(i)
    print(&apos;Finished!&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;使用也很简单, 只需要把原始歌词 (以 &lt;code&gt;_orig.lrc&lt;/code&gt; 结尾) 和翻译后歌词 (以 &lt;code&gt;_tran.lrc&lt;/code&gt; 结尾) 放在同一目录下, 运行脚本即可&lt;/p&gt;
&lt;p&gt;运行后会自动在同目录下输出以 &lt;code&gt;_mixed.lrc&lt;/code&gt; 结尾的歌词文件, 为混合后的结果 (原始歌词在前, 翻译后歌词在后)&lt;/p&gt;
&lt;h1&gt;效果&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;./3-result.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>HayFrp 自动签到</title><link>https://wyf9.top/posts/hayfrp-auto-sign/</link><guid isPermaLink="true">https://wyf9.top/posts/hayfrp-auto-sign/</guid><description>记录自己写的一个 hayfrp 自动签到脚本, 部署在 Cloudflare Workers 上, 实现每天 1:14 自动签到获取流量, 并将结果推送到 Discord</description><pubDate>Mon, 25 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;省流&lt;/h1&gt;
&lt;p&gt;::github{repo=&quot;wyf9/hayfrp-auto-sign&quot;}&lt;/p&gt;
&lt;h1&gt;起因&lt;/h1&gt;
&lt;p&gt;几个月前, HayFrp 站长在交流群中说可以用设备的 &lt;code&gt;rwmc_key&lt;/code&gt; 来直接执行签到, 于是我在 cron-job.org 创建了一个计划任务来每天自动签到:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1-cronjob-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2-cronjob-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但是我发现了这种方式的缺点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无法第一时间知道签到结果&lt;/strong&gt; (除非执行失败)&lt;/li&gt;
&lt;li&gt;不方便获取 rwmc key (需要下载客户端)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;于是&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;坏消息: learn.hayfrp.com 寄了&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;好消息: 我在 GitHub 上找到了 HayFrp 的 API 文档:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;::github{repo=&quot;HayFrp-Team/Learn&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./3-learn.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;URL: https://github.com/HayFrp-Team/Learn/blob/main/docs/api-doc.md#6signapi---%E7%AD%BE%E5%88%B0api&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最终, 经过一番对 Cloudflare Workers 的深入研究, 我写出了这个项目:&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;wyf9/hayfrp-auto-sign&quot;}&lt;/p&gt;
&lt;p&gt;主要的功能就是在每天 &lt;em&gt;1:14&lt;/em&gt; 自动签到, 并将结果通过 Webhook 推到 Discord&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;实际上 DC Webhook 比 TG Bot 方便, 注册还简单, 环境还好, &lt;a href=&quot;https://discord.com&quot;&gt;所以快给我用!!!!!!!!!!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;效果图:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./4-screenshot.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;你问为什么第一天是 1:17? 因为我把 cron 表达式里的 UTC 默认成了 CST, 发现之后紧急改的(&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./5-6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
如果需要自行修改执行时间, &lt;strong&gt;请不要选择整点&lt;/strong&gt;, 因为:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./6-warning.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>showmethekey 安装记录</title><link>https://wyf9.top/posts/showmethekey/</link><guid isPermaLink="true">https://wyf9.top/posts/showmethekey/</guid><description>记录在 Ubuntu 24.04 上安装 showmethekey (让我看键) 的过程, Wayland 上优秀的 screenkey 替代品</description><pubDate>Tue, 19 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;发现&lt;/h1&gt;
&lt;p&gt;因为我有录屏向别人展示 (?) 的习惯, 但别人看不到我的操作很难受, 遂寻找有没有软件能记录我的鼠标 / 键盘操作&lt;/p&gt;
&lt;p&gt;起初看到了 &lt;a href=&quot;https://gitlab.com/wavexx/screenkey&quot;&gt;screenkey&lt;/a&gt;, 但这东西只支持 x11 (我是 24.04 默认的 wayland 啊啊啊啊啊啊), 根本无法使用&lt;/p&gt;
&lt;p&gt;重新搜索 &lt;code&gt;wayland 键盘操作显示&lt;/code&gt;, 在结果中找到了这个:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1-search-result.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;AlynxZhou/showmethekey&quot;}&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;由于作者没有给出 deb 包 / 二进制文件, 需要手动编译&lt;/p&gt;
&lt;p&gt;首先安装需要的依赖 &amp;amp; 工具链:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install \
    libevdev-dev \
    libudev-dev \
    libinput-dev \
    libglib2.0-dev \
    libgtk-4-dev \
    libadwaita-1-dev \
    libjson-glib-dev \
    libcairo2-dev \
    libpango1.0-dev \
    libxkbcommon-dev \
    libpolkit-gobject-1-dev \
    meson \
    ninja-build \
    gcc \
    build-essential \
    pkg-config \
    libgtk-4-1 \
    libadwaita-1-0 \
    libxkbcommon-x11-dev \
    libxkbregistry-dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后 clone repo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone git@github.com:AlynxZhou/showmethekey.git
# 什么? 没配置 ssh? 那就用 https:
# git clone https://github.com/AlynxZhou/showmethekey.git
cd showmethekey
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后编译并安装:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir build &amp;amp;&amp;amp; cd build &amp;amp;&amp;amp; meson setup --prefix=/usr . .. &amp;amp;&amp;amp; meson compile &amp;amp;&amp;amp; sudo meson install
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;使用&lt;/h1&gt;
&lt;p&gt;打开安装好的 Show Me The Key&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2-launch.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击左上角开关, 输入密码授权 root 权限即可使用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./3-sudo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
Q: 为什么要授权 root 权限?&lt;/p&gt;
&lt;p&gt;因为 Show Me The Key 是直接读取 &lt;code&gt;/dev&lt;/code&gt; 下输入设备数据实现捕获鼠标键盘操作的, 故需要 root 权限 &lt;em&gt;(否则也没法支持 wayland 了)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后, 右键窗口标题可以置顶:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./4-top.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;后记&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Show Me The Key&lt;/code&gt; 这个名称的由来:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./5-name.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think visualkey sounds like Visual Studio and it&apos;s horrible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;😱😱😱😱😱😱😱😱😱😱&lt;/p&gt;
</content:encoded></item><item><title>加群问题</title><link>https://wyf9.top/posts/qq-join/</link><guid isPermaLink="true">https://wyf9.top/posts/qq-join/</guid><description>SiiWay 官方交流群 (QQ) 加群问题</description><pubDate>Mon, 11 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;加群问题&lt;/h1&gt;
&lt;p&gt;你需要从下面的问题中 &amp;lt;font color=red size=7&amp;gt;至少选择三个&amp;lt;/font&amp;gt; 来回答, 填入加群的申请理由中 (并带上题号)&lt;/p&gt;
&lt;p&gt;如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Q1: xxx, Q2: xxx, Q3: xxx
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;(&lt;strong&gt;我们能看懂&lt;/strong&gt;就行)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Q1&lt;/h2&gt;
&lt;p&gt;什么矛盾是社会矛盾的总和 (集中体现)?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;提示:&lt;/strong&gt; 搜索&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Q2&lt;/h2&gt;
&lt;p&gt;SiiWay 团队的 &lt;strong&gt;官方&amp;lt;font color=red&amp;gt;域名&amp;lt;/font&amp;gt;&lt;/strong&gt; 是?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;提示:&lt;/strong&gt; 还是搜索&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bing.com/search?q=%E4%BB%80%E4%B9%88%E6%98%AF%E5%9F%9F%E5%90%8D&quot;&gt;什么是域名&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Q3&lt;/h2&gt;
&lt;p&gt;你使用过 SiiWay Team (或其成员) 的&lt;strong&gt;哪个项目&lt;/strong&gt;?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;em&gt;这个应该最好答吧&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Q4&lt;/h2&gt;
&lt;p&gt;SiiWay 团队的 &lt;strong&gt;&amp;lt;font color=red&amp;gt;创始人&amp;lt;/font&amp;gt;之一&lt;/strong&gt; 是?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;提示:&lt;/strong&gt; 不止一个人, 但你只需要填&lt;strong&gt;其中一个&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;见&lt;a href=&quot;https://siiway.top&quot;&gt;团队官网&lt;/a&gt; Members&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Q5&lt;/h2&gt;
&lt;p&gt;SiiWay 团队 &lt;strong&gt;(大部分) &amp;lt;font color=red&amp;gt;核心成员&amp;lt;/font&amp;gt;&lt;/strong&gt; 现居哪里?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;提示:&lt;/strong&gt; 和上面一样&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Q6&lt;/h2&gt;
&lt;p&gt;SiiWay 团队目前有多少人 &lt;strong&gt;(&amp;lt;font color=red&amp;gt;除了核心成员&amp;lt;/font&amp;gt;)&lt;/strong&gt;?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;提示:&lt;/strong&gt; 和上面一样&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Q7&lt;/h2&gt;
&lt;p&gt;SiiWay 团队里有一位&lt;strong&gt;台湾人&lt;/strong&gt;, 他是谁?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;提示:&lt;/strong&gt; 和上面一样&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Q8&lt;/h2&gt;
&lt;p&gt;写出一位成员的&lt;strong&gt;个人网站&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;提示:&lt;/strong&gt; 一样, 不想写了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Q9&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;9 + 10&lt;/strong&gt; = ?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;&amp;lt;font color=red&amp;gt;如果你的答案是 19, 请不要回答本题&amp;lt;/font&amp;gt;&lt;/strong&gt;; &lt;em&gt;有特殊头衔&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item></channel></rss>