<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Alaye的小屋</title><description>技术分享，碎片小记</description><link>https://blog.alayedong.cn/</link><language>zh_CN</language><item><title>新云服务器购买与 1Panel 配置指南</title><link>https://blog.alayedong.cn/posts/2026/new-cloud-server-purchase-and-1panel-setup-guide/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2026/new-cloud-server-purchase-and-1panel-setup-guide/</guid><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;最近在玩 AstrBot，想装一些 MCP 和插件，但是配置使用 npx 启动的本地 MCP 服务器时，我的阿里云学生机 2H2G 会直接卡死，悲。😭它小小的身体可能承载了太多，目前这台小机上部署了 Astro 博客、用于 Obsidian 云同步的 Couch DB、发说说的 Ech0。思考再三，还是决定花费 528 RMB 来购买一台三年的腾讯云 2H4G 的服务器，将 AstrBot 这样占用较大的服务迁移到新机器上来部署。&lt;/p&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;p&gt;来到 &lt;a href=&quot;https://curl.qcloud.com/ZKp0gbso&quot;&gt;腾讯云的主页&lt;/a&gt; ，找到对应型号的服务器下单就可以了。系统方面因为之前使用的这台阿里云上使用的是一年多前 &lt;a href=&quot;https://www.kindyear.cn/&quot;&gt;@Kindyear&lt;/a&gt; 带我安装的宝塔面板，这次我想试试 1Panel。所以选择了直接带 1Panel 面板的版本，这点不错，面去了自己安装的步骤。付款成功之后，来到腾讯云的控制台就能看到刚刚购买的服务器了。在控制台点击登录，来到终端，使用 &lt;code&gt;1pctl --help&lt;/code&gt; 指令来查看相关信息。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@VM-0-11-ubuntu:~# 1pctl --help
------------------------------------------------------------
                        1Panel 控制脚本
------------------------------------------------------------
Usage:
  ./1pctl [COMMAND] [ARGS...]
  ./1pctl --help

Commands:
  status [core|agent]         检查 1Panel 服务状态
  start [core|agent|all]      启动 1Panel 服务
  stop [core|agent|all]       停止 1Panel 服务
  restart [core|agent|all]    重启 1Panel 服务
  uninstall                   卸载 1Panel 服务
  user-info                   获取 1Panel 用户信息
  listen-ip                   切换 1Panel 监听 IP
  version                     查看 1Panel 版本信息
  update                      修改 1Panel 系统信息
  reset                       重置 1Panel 系统信息
  restore                     恢复 1Panel 服务及数据
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动面板， &lt;code&gt;1pctl start&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;查看用户信息，&lt;code&gt;1pctl user-info&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@VM-0-11-ubuntu:~# 1pctl start
------------------------------------------------------------
                        启动 1Panel 服务
------------------------------------------------------------
🟢[OK]启动 Core: 成功
🟢[OK]启动 Agent: 成功
------------------------------------------------------------
root@VM-0-11-ubuntu:~# 1pctl user-info
============================================================
                       获取 1Panel 用户信息
============================================================
面板地址: http://$LOCAL_IP:8090/tencentcloud 
面板用户: z2pxxxxxsa
面板密码: 5jxxxxxx1w
提示: 修改密码可执行命令: 1pctl update password
------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样 1Panel 就是正常工作的了，然后使用提供的初始面板用户名和密码来访问 1Panel。&lt;code&gt;http://$LOCAL_IP:8090/tencentcloud&lt;/code&gt; 其中的 &lt;code&gt;$LOCAL_IP&lt;/code&gt; 指的就是服务器的 IP 了，这个在腾讯云的控制台可以查看，将实际的 IP 地址替换到这个地址中，就可以访问到面板了。&lt;/p&gt;
&lt;h2&gt;安全&lt;/h2&gt;
&lt;p&gt;为了安全性，登陆成功后来到菜单中的 &lt;code&gt;面板设置&lt;/code&gt; ，修改用户名和密码。以及默认的端口，降低被恶意扫端口攻击的概率。&lt;/p&gt;
&lt;p&gt;在腾讯云控制台点击服务器，进入二级菜单的防火墙，同步修改允许访问面板的端口，不然改了默认端口就访问不到网页面板了。在再来到终端处，使用 &lt;code&gt;1pctl restart&lt;/code&gt; 重启面板。&lt;/p&gt;
&lt;p&gt;这样就可以开始美美使用新服务器啦。😎&lt;/p&gt;
</content:encoded></item><item><title>mise 一个工具解决多个开发环境版本管理</title><link>https://blog.alayedong.cn/posts/2026/one-mise-solves-multiple-dev-env-version-management/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2026/one-mise-solves-multiple-dev-env-version-management/</guid><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;最近想为 &lt;a href=&quot;https://github.com/lin-snow/Ech0&quot;&gt;Ech0&lt;/a&gt; 做一些代码贡献，需要配置 GoLang 环境，平常经常需要 Java、Node 版本切换的我顺所当然的想，这次配置 Go 环境是不是应该也借助一个开发环境版本管理工具，往常像 Node 使用 nvm，Go 是不是也有类似的工具呢。于是在网络上搜索，逛着逛着发现了一个叫 &lt;a href=&quot;https://mise.jdx.dev/&quot;&gt;mise&lt;/a&gt; 的工具，研究了一下，居然一个工具支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/bun.html&quot;&gt;Bun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/deno.html&quot;&gt;Deno&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/elixir.html&quot;&gt;Elixir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/erlang.html&quot;&gt;Erlang&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/go.html&quot;&gt;Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/java.html&quot;&gt;Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/node.html&quot;&gt;NodeJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/python.html&quot;&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/ruby.html&quot;&gt;Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/rust.html&quot;&gt;Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/swift.html&quot;&gt;Swift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/lang/zig.html&quot;&gt;Zig&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这么多的开发环境管理。&lt;/p&gt;
&lt;p&gt;这下不得不试试了🤗&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;作为 Windows 用户，每次安装软件都要注意安装到非 C 盘。&lt;/p&gt;
&lt;p&gt;所以需要先设置一下 mise 的数据位置，根据官方文档可以通过 &lt;code&gt;MISE_DATA_DIR&lt;/code&gt; 环境变量来设置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;setx MISE_DATA_DIR D:\DevEnv\mise\data
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用 winget 来安装（其他安装渠道也可以，如 npm、powershell），我之前安装 oh-my-posh 的时候配置了 winget 的包安装位置所以直接使用 winget 来安装。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;winget install jdx.mise
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;启用 mise 的工具和环境变量自动加载&lt;/h2&gt;
&lt;p&gt;以 powershell 为例，打开 powershell 的配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# create profile if it doesn&apos;t already exist
if (-not (Test-Path $profile)) { New-Item $profile -Force }
# open the profile
Invoke-Item $profile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在配置文件中添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(&amp;amp;mise activate pwsh) | Out-String | Invoke-Expression
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;将 mise 添加到环境变量&lt;/h2&gt;
&lt;p&gt;将刚刚配置的 &lt;code&gt;MISE_DATA_DIR&lt;/code&gt; 中的 &lt;code&gt;D:\DevEnv\mise\data\shims&lt;/code&gt; 添加到 &lt;code&gt;环境变量 - 用户变量&lt;/code&gt; 的 &lt;code&gt;path&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
Windows 环境变量中的用户变量和系统变量效果是不一样的,如果只配置在系统变量中，会导致普通命令行读取不到环境变量而显示不存在该指令，而管理员终端正常使用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;使用&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;mise use -g go@1.26.1
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;go version

❯ go version
go version go1.26.1 windows/amd64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以使用啦 mise😋~&lt;/p&gt;
</content:encoded></item><item><title>Windows 自动切换夜间模式</title><link>https://blog.alayedong.cn/posts/2025/windows-auto-dark-mode/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/windows-auto-dark-mode/</guid><pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;在 Windows 中，系统原生并不支持根据时间自动切换深色/浅色主题。然而习惯了手机等设备近年来普及的自动夜间模式，对比 WIndows 会没有统一的体验，并且长时间面对过亮可能影响视觉舒适度与工作效率。这里介绍几种实现 Windows 自动切换夜间模式的工具。&lt;/p&gt;
&lt;h3&gt;AutoDarkMode&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/AutoDarkMode/Windows-Auto-Night-Mode&quot;&gt;AutoDarkMode/Windows-Auto-Night-Mode: Automatically switches between the dark and light theme of Windows 10 and Windows 11&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;assets/windows-auto-dark-mode/IMG-20251024220043905.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;AutoDarkMode 还附带有更多的相关自定义设置，且轻量化。安装完大约占用 200MB 存储。&lt;/p&gt;
&lt;h3&gt;PowerToys - Light Switch&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/microsoft/PowerToys&quot;&gt;microsoft/PowerToys: Microsoft PowerToys is a collection of utilities that help you customize Windows and streamline everyday tasks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;assets/windows-auto-dark-mode/IMG-20251024220053814.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;PowerToys 是微软官方推出的面向高级用户的 Windows 效率增强工具集，其中 Light Switch 模块提供了基础的自动主题切换功能。由于 PowerToys 还附带其他实用工具，整体比较大，安装完大约占用 850MB 存储，远大于 AutoDarkMode。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;如果你只想要一个简单、智能、低开销的自动夜间模式切换器，AutoDarkMode 是更优选择。&lt;/p&gt;
&lt;p&gt;而如果你已经是 PowerToys 用户，或希望在一个工具中管理多种 Windows 增强功能，那么使用其内置的 Light Switch 模块也足够满足基础需求。&lt;/p&gt;
</content:encoded></item><item><title>Windows 中的 Rust 开发环境配置</title><link>https://blog.alayedong.cn/posts/2025/rust-dev-environment-setup-on-windows/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/rust-dev-environment-setup-on-windows/</guid><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;MSVC &amp;amp; Windows SDK&lt;/h2&gt;
&lt;p&gt;在正式开始安装 Rust 之前需要确保已经安装了 C++ 桌面开发环境。建议可以在启动 Rustup 之前，手动下载 Visual Studio Installer，并可直接到单个组件页面搜索并勾选必要的 MSVC 和 Windows SDK，达到最小化安装体积的效果。并在语言包中勾选英文（建议必选）和其他需要的语言，如中文。同时记得在安装位置选择卡中，根据个人情况调整安装位置到非 C 盘，来减少 C 盘占用空间。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;assets/rust-dev-environment-setup-on-windows/IMG-20250918112806107.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;配置镜像&lt;/h2&gt;
&lt;p&gt;访问 &lt;a href=&quot;https://rsproxy.cn/&quot;&gt;RsProxy&lt;/a&gt;，根据提示信息，编辑系统环境变量，设置 Rustup 镜像，加快接下来安装 Rust 下载默认包的速度。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;setx RUSTUP_DIST_SERVER &quot;https://rsproxy.cn&quot;
setx RUSTUP_UPDATE_ROOT &quot;https://rsproxy.cn/rustup&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置 Rust 安装位置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
提前设置环境变量进行变更存储位置，否则后续所有依赖库都默认存放到 C 盘。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;手动创建一个文件夹，如 &lt;code&gt;rust&lt;/code&gt;。并在其中创建 &lt;code&gt;.rustup&lt;/code&gt; 和 &lt;code&gt;.cargo&lt;/code&gt; 两个子文件夹。编辑系统环境变量，将对应的路径填入其中。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;setx RUSTUP_HOME &quot;D:\DevEnv\rust\.rustup&quot;
setx CARGO_HOME &quot;D:\DevEnv\rust\.cargo&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;正式安装 Rust&lt;/h2&gt;
&lt;p&gt;访问 &lt;a href=&quot;https://www.rust-lang.org/zh-CN/learn/get-started&quot;&gt;入门 - Rust 程序设计语言&lt;/a&gt;，下载 Rustup，运行安装程序，查看提示信息，配置不出错的话，默认回车即可。&lt;/p&gt;
&lt;p&gt;安装完成后新建终端，使用 &lt;code&gt;rustc --version&lt;/code&gt; 验证安装。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PS C:\Users\Alaye&amp;gt; rustc --version
rustc 1.89.0 (29483883e 2025-08-04)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;🦀 Hello Rust！&lt;/h2&gt;
&lt;p&gt;阅读 &lt;a href=&quot;https://code.visualstudio.com/docs/languages/rust#_hello-world&quot;&gt;Rust in Visual Studio Code&lt;/a&gt;，在 VSCode 中安装 &lt;code&gt;rust-analyzer&lt;/code&gt; 插件。&lt;/p&gt;
&lt;p&gt;创建存放项目的文件夹并新建项目，依次运行命令。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cargo new hello_world

cd hello_world
code .

cargo run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看运行结果！&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PS D:\Alaye\CODE\rust-study\hello_world&amp;gt; cargo build
   Compiling hello_world v0.1.0 (D:\Alaye\CODE\rust-study\hello_world)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.36s
PS D:\Alaye\CODE\rust-study\hello_world&amp;gt; cargo run  
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.06s
     Running `target\debug\hello_world.exe`
Hello, world!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;推荐阅读 &lt;a href=&quot;https://www.rustwiki.org.cn/zh-CN/book/ch00-00-introduction.html&quot;&gt;简介 - Rust 程序设计语言 中文版&lt;/a&gt;，开启🦀 Rust 的学习之旅~&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/678846997&quot;&gt;Rust，msvc工具链最小安装，VisualStudio Installer里怎么选 - 知乎&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cnblogs.com/-CO-/p/18041169&quot;&gt;【rust】《 安装Rust（更改默认安装路径）并配置cargo国内源（提供rust包查询网站） 》 - 芋白 - 博客园&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rsproxy.cn/#FAQ&quot;&gt;设置国内镜像代理RsProxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1rP1YYEEr3/?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=0bc57f10d8dee0404528f4fe02be80ff&quot;&gt;在windows上安装rust开发环境_哔哩哔哩_bilibili&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/languages/rust#_hello-world&quot;&gt;Rust in Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>修复 Conda 导致的 PowerShell 启动缓慢</title><link>https://blog.alayedong.cn/posts/2025/fixing-slow-powershell-startup-caused-by-conda/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/fixing-slow-powershell-startup-caused-by-conda/</guid><pubDate>Mon, 04 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;问题背景&lt;/h2&gt;
&lt;p&gt;最近发现我的 PowerShell 启动异常缓慢，从正常的瞬间启动延长到了 5~7 秒。作为经常要使用到的使用终端，每次启动都要被硬控好几秒不能使用，这严重影响了效率。&lt;/p&gt;
&lt;h2&gt;问题诊断过程&lt;/h2&gt;
&lt;h3&gt;性能测量&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;首先使用 &lt;code&gt;Measure-Command&lt;/code&gt; 测试正常启动时间：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Measure-Command { pwsh.exe -Command &quot;exit&quot; }
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;PS C:\Users\Alaye&amp;gt; Measure-Command { powershell -Command &quot;exit&quot; }

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 5
Milliseconds      : 859
Ticks             : 58595344
TotalDays         : 6.78186851851852E-05
TotalHours        : 0.00162764844444444
TotalMinutes      : 0.0976589066666667
TotalSeconds      : 5.8595344
TotalMilliseconds : 5859.5344
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;5s&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;测试无配置文件启动时间：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Measure-Command { powershell -NoProfile -Command &quot;exit&quot; }
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;PS C:\Users\Alaye&amp;gt; Measure-Command { powershell -NoProfile -Command &quot;exit&quot; }

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 217
Ticks             : 2171056
TotalDays         : 2.5127962962963E-06
TotalHours        : 6.03071111111111E-05
TotalMinutes      : 0.00361842666666667
TotalSeconds      : 0.2171056
TotalMilliseconds : 217.1056
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;0.22s&lt;/p&gt;
&lt;p&gt;对比正常启动时间和无配置文件启动时间，发现相差过大，则可以判断为是启动配置影响了启动时间。&lt;/p&gt;
&lt;h3&gt;检查 PowerShell 配置文件&lt;/h3&gt;
&lt;p&gt;检查配置文件位置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$PROFILE | Get-Member -Type NoteProperty
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;PS C:\Users\Alaye&amp;gt; $PROFILE | Get-Member -Type NoteProperty

   TypeName: System.String

Name                   MemberType   Definition
----                   ----------   ----------
AllUsersAllHosts       NoteProperty string AllUsersAllHosts=C:\Program Files\PowerShell\7\profile.ps1
AllUsersCurrentHost    NoteProperty string AllUsersCurrentHost=C:\Program Files\PowerShell\7\Microsoft.PowerShell_prof…
CurrentUserAllHosts    NoteProperty string CurrentUserAllHosts=C:\Users\Alaye\Documents\PowerShell\profile.ps1
CurrentUserCurrentHost NoteProperty string CurrentUserCurrentHost=C:\Users\Alaye\Documents\PowerShell\Microsoft.PowerS…
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查配置文件内容来定位问题,可以查看对应路径的内容或者使用命令行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$PROFILE | Get-Member -Type NoteProperty | ForEach-Object {
    $path = $PROFILE.($_.Name)
    Write-Host &quot;`n=== $($_.Name) ===&quot; -ForegroundColor Yellow
    Write-Host &quot;路径: $path&quot;
    if (Test-Path $path) {
        Write-Host &quot;内容:&quot;
        Get-Content $path | ForEach-Object { Write-Host &quot;  $_&quot; }
    } else {
        Write-Host &quot;文件不存在&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;发现问题根源&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;CurrentUserAllHosts&lt;/code&gt; 配置文件中发现了 Conda 初始化代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# C:\Users\Alaye\Documents\PowerShell\profile.ps1
# region conda initialize
# !! Contents within this block are managed by &apos;conda init&apos; !!
If (Test-Path &quot;D:\DevEnv\anaconda3\Scripts\conda.exe&quot;) {
    (&amp;amp; &quot;D:\DevEnv\anaconda3\Scripts\conda.exe&quot; &quot;shell.powershell&quot; &quot;hook&quot;) | Out-String | ?{$_} | Invoke-Expression
}
#endregion
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;根本原因&lt;/strong&gt;：PowerShell 启动时会尝试执行该初始化脚本，导致长时间等待。&lt;/p&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;h3&gt;实现 Conda 延迟加载&lt;/h3&gt;
&lt;p&gt;为了在保持快速启动的同时仍能使用 Conda，实现延迟加载机制，修改配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# C:\Users\Alaye\Documents\PowerShell\profile.ps1
# 简单的 Conda 延迟加载
function Invoke-CondaInit {
    if (-not $script:CondaAlreadyInitialized) {
        Write-Host &quot;正在初始化 Conda...&quot; -ForegroundColor Yellow
        If (Test-Path &quot;D:\DevEnv\anaconda3\Scripts\conda.exe&quot;) {
            (&amp;amp; &quot;D:\DevEnv\anaconda3\Scripts\conda.exe&quot; &quot;shell.powershell&quot; &quot;hook&quot;) | Out-String | Where-Object {$_} | Invoke-Expression
        }
        $script:CondaAlreadyInitialized = $true
    }
}

# 只有在使用 conda 相关命令时才初始化
Set-Alias -Name conda -Value conda-wrapper
function conda-wrapper {
    Invoke-CondaInit
    conda @args
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;性能优化效果&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优化前&lt;/strong&gt;：&amp;gt;5 秒&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用延迟加载&lt;/strong&gt;：启动&amp;lt;1 秒，首次使用 conda 时延迟加载 (约 2-3 秒)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;现在的配置方案既能保证 PowerShell 快速启动，又能在需要时使用 Conda 环境。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键原则&lt;/strong&gt;：保持启动脚本的轻量化，将重量级功能改为按需加载，这是提升命令行启动响应速度的有效方法。&lt;/p&gt;
</content:encoded></item><item><title> flutter_local_notifications 踩坑记录</title><link>https://blog.alayedong.cn/posts/2025/flutter-local-notifications-pitfalls/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/flutter-local-notifications-pitfalls/</guid><pubDate>Thu, 19 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;仔细看官方文档很有用！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://pub.dev/packages/flutter_local_notifications#-android-setup&quot;&gt;flutter_local_notifications | Flutter package&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Android 配置&lt;/h2&gt;
&lt;h3&gt;配置 build.gradle.kts&lt;/h3&gt;
&lt;p&gt;启用 &lt;a href=&quot;https://developer.android.com/studio/write/java8-support#library-desugaring&quot;&gt;desugaring&lt;/a&gt;（脱糖）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;android {
    defaultConfig {
        multiDexEnabled = true
    }

    compileOptions {
        // Flag to enable support for the new language APIs
        // 1、启用Desugaring
        isCoreLibraryDesugaringEnabled = true
        // Sets Java compatibility to Java 11
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
  
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_11.toString()
    }
}

// 2、启用coreLibrary
dependencies {
    coreLibraryDesugaring(&quot;com.android.tools:desugar_jdk_libs:2.1.4&quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 AndroidManifest.xml&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;receiver android:exported=&quot;false&quot; android:name=&quot;com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver&quot; /&amp;gt;
&amp;lt;receiver android:exported=&quot;false&quot; android:name=&quot;com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver&quot;&amp;gt;
    &amp;lt;intent-filter&amp;gt;
        &amp;lt;action android:name=&quot;android.intent.action.BOOT_COMPLETED&quot;/&amp;gt;
        &amp;lt;action android:name=&quot;android.intent.action.MY_PACKAGE_REPLACED&quot;/&amp;gt;
        &amp;lt;action android:name=&quot;android.intent.action.QUICKBOOT_POWERON&quot; /&amp;gt;
        &amp;lt;action android:name=&quot;com.htc.intent.action.QUICKBOOT_POWERON&quot;/&amp;gt;
    &amp;lt;/intent-filter&amp;gt;
&amp;lt;/receiver&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;请求通知权限（Android 13+）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
        FlutterLocalNotificationsPlugin();
flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation&amp;lt;
    AndroidFlutterLocalNotificationsPlugin&amp;gt;().requestNotificationsPermission();
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;h3&gt;8 已过时、bigLargeIcon() 都匹配&lt;/h3&gt;
&lt;p&gt;报错信息如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Launching lib\main.dart on sdk gphone64 x86 64 in debug mode...
Running Gradle task &apos;assembleDebug&apos;...
警告: [options] 源值 8 已过时，将在未来发行版中删除
警告: [options] 目标值 8 已过时，将在未来发行版中删除
警告: [options] 要隐藏有关已过时选项的警告, 请使用 -Xlint:-options。
C:\Users\Alaye\AppData\Local\Pub\Cache\hosted\pub.dev\flutter_local_notifications-16.3.3\android\src\main\java\com\dexterous\flutterlocalnotifications\FlutterLocalNotificationsPlugin.java:1033: 错误: 对bigLargeIcon的引用不明确
      bigPictureStyle.bigLargeIcon(null);
                     ^
  BigPictureStyle 中的方法 bigLargeIcon(Bitmap) 和 BigPictureStyle 中的方法 bigLargeIcon(Icon) 都匹配
1 个错误
3 个警告

FAILURE: Build failed with an exception.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这大概是因为包版本过低。&lt;/p&gt;
&lt;p&gt;解决方法：&lt;/p&gt;
&lt;p&gt;升级 &lt;code&gt;flutter_local_notifications&lt;/code&gt; 版本，使用指令 &lt;code&gt;flutter pub upgrade&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;NDK 版本问题&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.hy-clear.com/article/iaxxjncpou/&quot;&gt;【Flutter】 在 Android NDK 中遇到错误时该怎么办 | HY Clear 博客 | hy clear blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;Tools&lt;/code&gt; - &lt;code&gt;SDK Manager&lt;/code&gt; 下载所需版本的 NDK&lt;/p&gt;
&lt;p&gt;NDK 项目版本和文件版本不一致：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Build file &apos;D:\Alaye\CODE\AndroidStudioProjects\exp3_notice_weather_info\android\build.gradle.kts&apos; line: 16

- What went wrong:  
    A problem occurred configuring project &apos;:app&apos;.
    

&amp;gt; [CXX1104] NDK from ndk.dir at D:\DevEnv\Android\Sdk\ndk\29.0.13113456 had version [29.0.13113456] which disagrees with android.ndkVersion [26.3.11579264]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解决方法：&lt;/p&gt;
&lt;p&gt;指定 NDK 版本及路径、修改 flutter 的文件。具体步骤可以看以上引用的文章。&lt;/p&gt;
</content:encoded></item><item><title>IDEA 新建 Servlet 选项消失</title><link>https://blog.alayedong.cn/posts/2025/intellij-idea-missing-new-servlet-option/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/intellij-idea-missing-new-servlet-option/</guid><pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;实训课需要使用了 JSP - Servlet 的模式进行开发，在 IDEA 中新建文件却没有发现 Servlet 选项，但是老师和一些同学的旧版本中却有这个选项。&lt;/p&gt;
&lt;p&gt;你是否也刚刚将你的 IntelliJ IDEA 升级到了最新版本，兴冲冲地准备开始你的 Java Web 项目，却在右键点击包名 -&amp;gt; &quot;New&quot; 时傻了眼——曾经熟悉的 &quot;Servlet&quot;、&quot;Filter&quot; 和 &quot;Listener&quot; 等选项竟然不见了？！&lt;/p&gt;
&lt;p&gt;别担心，你不是一个人。这确实是 IntelliJ IDEA 近期版本的一个显著变化。本篇将为你揭示其中的原因，并提供清晰的解决方案。&lt;/p&gt;
&lt;h2&gt;变化的原因：JetBrains 的考量&lt;/h2&gt;
&lt;p&gt;根据 JetBrains 官方的说法 (主要在其 YouTrack 问题追踪系统中)，&lt;strong&gt;从 IntelliJ IDEA 2023.1 版本开始，开发团队移除了直接在 &quot;New&quot; 菜单中创建 Servlet、Web Filter 和 Web Listener 的选项。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主要原因包括：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;使用频率降低：&lt;/strong&gt; 随着现代 Java Web 框架（如 Spring MVC/Boot, Jakarta EE 自身的 JAX-RS 等）的普及，开发者越来越少直接通过 IDE 的向导来创建这些底层的 Servlet API 组件。框架通常会提供更高级的抽象和注解来处理请求和过滤器逻辑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简化菜单：&lt;/strong&gt; 移除不常用的选项有助于保持 &quot;New&quot; 菜单的简洁性。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;虽然这一改变对于习惯了旧版操作的开发者来说可能有些突然，但创建这些组件的途径依然存在，只是方式略有不同。&lt;/p&gt;
&lt;h2&gt;如何在 IntelliJ IDEA 2023.1 及更高版本中创建 Servlet？&lt;/h2&gt;
&lt;p&gt;以下是目前推荐的几种方法：&lt;/p&gt;
&lt;h3&gt;1. 手动创建 Java 类 (推荐)&lt;/h3&gt;
&lt;p&gt;这是最直接也是最灵活的方式。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建 Java 类：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在你的项目视图中，右键点击目标包（通常在 &lt;code&gt;src/main/java&lt;/code&gt; 下）。&lt;/li&gt;
&lt;li&gt;选择 &lt;strong&gt;New &amp;gt; Java Class&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;输入你的类名，例如 &lt;code&gt;MyCustomServlet&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;继承相应的父类/实现接口：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对于 Servlet:&lt;/strong&gt; 使你的类继承 &lt;code&gt;jakarta.servlet.http.HttpServlet&lt;/code&gt; (对于 Jakarta EE 9+，如 Tomcat 10+) 或 &lt;code&gt;javax.servlet.http.HttpServlet&lt;/code&gt; (对于旧版 Java EE，如 Tomcat 9 或更早)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对于 Filter:&lt;/strong&gt; 实现 &lt;code&gt;jakarta.servlet.Filter&lt;/code&gt; 或 &lt;code&gt;javax.servlet.Filter&lt;/code&gt; 接口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对于 Listener:&lt;/strong&gt; 实现相应的 Listener 接口，如 &lt;code&gt;jakarta.servlet.ServletContextListener&lt;/code&gt; 或 &lt;code&gt;javax.servlet.http.HttpSessionListener&lt;/code&gt; 等。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;添加注解或配置 &lt;code&gt;web.xml&lt;/code&gt;：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用注解是现代 Jakarta EE/Java EE 的推荐方式。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Servlet:&lt;/strong&gt; &lt;code&gt;@WebServlet(&quot;/your-path&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filter:&lt;/strong&gt; &lt;code&gt;@WebFilter(&quot;/your-path/*&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Listener:&lt;/strong&gt; &lt;code&gt;@WebListener&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;或者，你仍然可以在 &lt;code&gt;webapp/WEB-INF/web.xml&lt;/code&gt; 文件中手动配置这些组件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;示例：创建一个 Jakarta EE Servlet&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package com.example.web;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = &quot;MyCustomServlet&quot;, urlPatterns = {&quot;/hello&quot;})
public class MyCustomServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType(&quot;text/html&quot;);
        resp.getWriter().println(&quot;&amp;lt;h1&amp;gt;Hello from MyCustomServlet!&amp;lt;/h1&amp;gt;&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 使用自定义文件模板&lt;/h3&gt;
&lt;p&gt;如果你需要频繁创建这些组件，自定义文件模板是一个非常高效的选择。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;打开模板设置：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进入 &lt;strong&gt;File &amp;gt; Settings (或 IntelliJ IDEA &amp;gt; Settings/Preferences 在 macOS 上) &amp;gt; Editor &amp;gt; File and Code Templates&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在 Files 页创建新模板：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;点击 &lt;code&gt;+&lt;/code&gt; (Add) 按钮。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; 给你的模板起一个描述性的名字，例如 &quot;Jakarta Servlet&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extension:&lt;/strong&gt; &lt;code&gt;java&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Template text:&lt;/strong&gt; 粘贴你的 Servlet、Filter 或 Listener 的基本骨架代码。你可以使用预定义变量，如 &lt;code&gt;${PACKAGE_NAME}&lt;/code&gt; 和 &lt;code&gt;${NAME}&lt;/code&gt; (代表类名)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
在 Other 页 Web - Java code templates 中可以找到 &lt;code&gt;Servlet Class.java&lt;/code&gt; 等的模板，复制粘贴即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;#if (${PACKAGE_NAME} &amp;amp;&amp;amp; ${PACKAGE_NAME} != &quot;&quot;)package ${PACKAGE_NAME};#end  
#parse(&quot;File Header.java&quot;)  
  
#if ($JAVAEE_TYPE == &quot;jakarta&quot;)  
import jakarta.servlet.*;  
import jakarta.servlet.http.*;  
import jakarta.servlet.annotation.*;  
#else  
import javax.servlet.*;  
import javax.servlet.http.*;  
import javax.servlet.annotation.*;  
#end  
import java.io.IOException;  
  
@WebServlet(name = &quot;${Entity_Name}&quot;, value = &quot;/${Entity_Name}&quot;)  
public class ${Class_Name} extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  
    }  
  
    @Override  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  
    }  
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用模板：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;之后，在你的项目中右键点击包，选择 &lt;strong&gt;New &amp;gt; 你的模板名称&lt;/strong&gt; 即可快速生成。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;JetBrains 官方也鼓励用户通过这种方式自定义常用的代码结构。&lt;/p&gt;
&lt;h2&gt;来自 JetBrains 的官方信息&lt;/h2&gt;
&lt;p&gt;可以从 JetBrains 的官方渠道找到佐证：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;YouTrack 问题 IDEA-309062 (JavaEE: Drop new Servlet, Web Filter and Web Listener actions):&lt;/strong&gt; 明确记录了移除这些选项的决定，并提到“自 2023.1 版本起，我们不再提供这些模板，因为如今它们已很少被使用。”&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;链接: &lt;a href=&quot;https://youtrack.jetbrains.com/issue/IDEA-309062&quot;&gt;https://youtrack.jetbrains.com/issue/IDEA-309062&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;YouTrack 问题 IDEA-316701 (Cannot create servlet, web filter, web listener after 2023.1 update):&lt;/strong&gt; 用户在更新后报告了此问题，JetBrains 员工确认了模板的移除，并建议使用自定义文件模板，甚至提供了移除前模板的内容供用户参考。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;链接: &lt;a href=&quot;https://youtrack.jetbrains.com/issue/IDEA-316701&quot;&gt;https://youtrack.jetbrains.com/issue/IDEA-316701&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IntelliJ IDEA 官方文档:&lt;/strong&gt; 在关于创建 Web 应用程序元素的文档中，现在会说明 IntelliJ IDEA 不再提供这些组件的默认模板，并指导用户如何自己创建。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考链接: &lt;a href=&quot;https://www.jetbrains.com/help/idea/creating-and-configuring-web-application-elements.html&quot;&gt;https://www.jetbrains.com/help/idea/creating-and-configuring-web-application-elements.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;其他注意事项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;项目依赖：&lt;/strong&gt; 确保你的项目 (&lt;code&gt;pom.xml&lt;/code&gt; 或 &lt;code&gt;build.gradle&lt;/code&gt;) 中添加了正确的 Servlet API 依赖。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jakarta EE 9+ (如 Tomcat 10+):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
	&amp;lt;groupId&amp;gt;jakarta.servlet&amp;lt;/groupId&amp;gt;
	&amp;lt;artifactId&amp;gt;jakarta.servlet-api&amp;lt;/artifactId&amp;gt;
	&amp;lt;version&amp;gt;6.0.0&amp;lt;/version&amp;gt; 
	&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;旧版 Java EE (如 Tomcat 9 及更早)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
	&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
	&amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt;
	&amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
	&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;虽然 IntelliJ IDEA 移除了直接创建 Servlet、Filter 和 Listener 的菜单选项，但这并不意味着我们无法再创建它们。通过手动创建 Java 类并结合注解，或者利用强大的自定义文件模板功能，我们依然可以进行 Servlet 开发。&lt;/p&gt;
</content:encoded></item><item><title>Python 中安装 mysqlclient</title><link>https://blog.alayedong.cn/posts/2025/install-mysqlclient-in-python/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/install-mysqlclient-in-python/</guid><pubDate>Thu, 22 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;直接 &lt;code&gt;pip install mysqlclient&lt;/code&gt;，安装报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;	  ......
      building &apos;MySQLdb._mysql&apos; extension
      error: Microsoft Visual C++ 14.0 or greater is required. Get it with &quot;Microsoft C++ Build Tools&quot;: https://visualstudio.microsoft.com/visual-cpp-build-tools/
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for mysqlclient
Failed to build mysqlclient
ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (mysqlclient)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;提示需要安装 &lt;code&gt;Microsoft C++ Build Tools&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;解决方法&lt;/h2&gt;
&lt;p&gt;以下两个方法选择一种即可。&lt;/p&gt;
&lt;h3&gt;安装 Microsoft C++ Build Tools&lt;/h3&gt;
&lt;p&gt;安装 &lt;a href=&quot;https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/&quot;&gt;Microsoft C++ 生成工具 - Visual Studio&lt;/a&gt;。安装过程中，请确保勾选了 C++ 生成工具（C++ Build Tools）组件。&lt;/p&gt;
&lt;h3&gt;使用预编译的二进制文件安装 mysqlclient&lt;/h3&gt;
&lt;p&gt;使用提供的预编译版本来安装，例如使用 wheel 提供的 &lt;code&gt;.whl&lt;/code&gt; 文件进行安装。&lt;/p&gt;
&lt;p&gt;访问 &lt;a href=&quot;https://pypi.org/project/mysqlclient/#files&quot;&gt;mysqlclient · PyPI&lt;/a&gt;，在 Built Distributions 中找到对应 Python 版本和系统及芯片架构的包。&lt;/p&gt;
&lt;p&gt;这里例如需要下载的是 &lt;code&gt;mysqlclient-2.2.7-cp312-cp312-win_amd64.whl&lt;/code&gt; ，将下载的文件临时放到命令行所访问的根路径下，使用命令安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(django) PS D:\Alaye\GitHubDesktop\Playground\django-vue3-admin\backend&amp;gt; 
pip install mysqlclient-2.2.7-cp312-cp312-win_amd64.whl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装成功提示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Processing d:\alaye\githubdesktop\playground\django-vue3-admin\backend\mysqlclient-2.2.7-cp312-cp312-win_amd64.whl
Installing collected packages: mysqlclient
  Attempting uninstall: mysqlclient
    Found existing installation: mysqlclient 2.2.4
    Uninstalling mysqlclient-2.2.4:
      Successfully uninstalled mysqlclient-2.2.4
Successfully installed mysqlclient-2.2.7
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.csdn.net/m0_67162074/article/details/128243290&quot;&gt;Windows系统 安装mysqlclient最详细教程_mysqlclient安装-CSDN博客&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>在 Springboot 项目中使用 JSP</title><link>https://blog.alayedong.cn/posts/2025/using-jsp-in-spring-boot/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/using-jsp-in-spring-boot/</guid><pubDate>Fri, 09 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在现代 Web 开发中，虽然前后端分离的开发方式或者 Thymeleaf、Freemarker 等模板引擎更为流行，但在某些传统项目或特殊环境（如部分企业、&lt;s&gt;我大学的 SSM 课程作业&lt;/s&gt;）中，JSP（Java Server Pages） 仍有一定的使用场景。本文将详细介绍如何在一个 Spring Boot 项目中配置并使用 JSP。&lt;/p&gt;
&lt;h2&gt;创建 Spring Boot 项目&lt;/h2&gt;
&lt;p&gt;你可以通过 &lt;a href=&quot;https://start.spring.io/&quot;&gt;Spring Initializr&lt;/a&gt; 创建一个基础的 Spring Boot 项目，选择以下依赖项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Web&lt;/li&gt;
&lt;li&gt;或者手动添加相关依赖&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;创建完成后，导入 IDE（如 IntelliJ IDEA 或 Eclipse）进行后续开发。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
IDEA 中集成了 Spring Initializr，新建项目时可以直接使用 Spring Initializr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;引入 JSP 相关依赖&lt;/h2&gt;
&lt;p&gt;由于 Spring Boot 默认不支持 JSP，我们需要手动引入相关依赖。编辑 &lt;code&gt;pom.xml&lt;/code&gt; 文件，添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 引入内嵌 Tomcat 对 JSP 的支持 --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.tomcat.embed&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;tomcat-embed-jasper&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- JSTL 标签库支持 --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果对应的 Tomcat 版本为 10 及以上，则添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- JSTL 标签库支持 --&amp;gt;
&amp;lt;dependency&amp;gt;  
    &amp;lt;groupId&amp;gt;org.glassfish.web&amp;lt;/groupId&amp;gt;  
    &amp;lt;artifactId&amp;gt;jakarta.servlet.jsp.jstl&amp;lt;/artifactId&amp;gt;  
    &amp;lt;version&amp;gt;2.0.0&amp;lt;/version&amp;gt;  
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;a href=&quot;https://www.cnblogs.com/exmyth/p/15479357.html&quot;&gt;查看和指定SpringBoot内嵌Tomcat的版本 - 牧之丨 - 博客园&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;配置 Web 资源目录与结构&lt;/h2&gt;
&lt;p&gt;Spring Boot 默认使用 &lt;code&gt;resources/templates&lt;/code&gt; 来存放模板文件，但 JSP 必须放在 &lt;code&gt;webapp/WEB-INF/jsp/&lt;/code&gt; 目录下。你需要手动创建该目录结构，推荐 &lt;code&gt;webapp/WEB-INF/jsp/&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;推荐目录结构如下：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;src/
└── main/
    ├── java/
    │   └── com.example.demo/
    │       └── DemoApplication.java
    └── webapp/
        └── WEB-INF/
            └── jsp/
                ├── hello.jsp
                └── success.jsp
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;IDEA 设置项目结构&lt;/h3&gt;
&lt;p&gt;在 IDEA 顶部导航栏，选择 &lt;code&gt;文件 - 项目结构 - 项目设置 - Facet&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置 Web 资源目录 &lt;code&gt;项目路径\src\main\webapp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;添加部署描述符 web.xml , 路径 &lt;code&gt;项目路径\src\main\webapp\WEB-INF\web.xml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;assets/using-jsp-in-spring-boot/IMG-20250509124834115.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;配置视图解析器（application.yml）&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;application.yml&lt;/code&gt; 中配置 JSP 页面的前缀和后缀路径：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;spring:
  mvc:
    view:
      prefix: /WEB-INF/jsp/
      suffix: .jsp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样配置后，控制器返回的字符串会自动拼接为对应的 JSP 路径。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;return &quot;hello&quot;; // 将映射到 /WEB-INF/jsp/hello.jsp
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;编写 Controller 示例&lt;/h2&gt;
&lt;p&gt;接下来我们写一个简单的控制器来测试 JSP 页面是否正常渲染。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class JspController {

    @GetMapping(&quot;/hello&quot;)
    public String sayHello(Model model) {
        model.addAttribute(&quot;message&quot;, &quot;Hello from Spring Boot with JSP!&quot;);
        return &quot;hello&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;创建 JSP 页面&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;src/main/webapp/WEB-INF/jsp/&lt;/code&gt; 下创建 &lt;code&gt;hello.jsp&lt;/code&gt; 文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;%@ page contentType=&quot;text/html;charset=UTF-8&quot; language=&quot;java&quot; %&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Hello JSP&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;${message}&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动项目访问：&lt;a href=&quot;http://localhost:8080/hello&quot;&gt;http://localhost:8080/hello&lt;/a&gt;，你应该能看到页面成功展示消息。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过以上步骤，我们完成了在 Spring Boot 项目中集成 JSP 的全过程。&lt;/p&gt;
</content:encoded></item><item><title>使用 Obsidian 打造高效博客写作工作流</title><link>https://blog.alayedong.cn/posts/2025/blog-with-obsidian-workflow/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/blog-with-obsidian-workflow/</guid><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;为什么选择 Obsidian 管理技术博客？&lt;/h2&gt;
&lt;p&gt;在维护和更新博客时，我们大部分时间都在创作 Markdown 格式的内容。然而，使用 VS Code 或 WebStorm 等 IDE 进行纯文本编辑往往显得过于笨重 - 这些工具的 Markdown 支持通常比较基础，缺乏专为写作优化的功能。&lt;/p&gt;
&lt;p&gt;Obsidian 提供了截然不同的体验：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;专为 Markdown 设计的清爽界面&lt;/li&gt;
&lt;li&gt;丰富的社区插件生态&lt;/li&gt;
&lt;li&gt;卓越的本地文件管理能力&lt;/li&gt;
&lt;li&gt;多平台同步支持&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Obsidian 博客工作流核心优势&lt;/h2&gt;
&lt;h3&gt;✨ 专业级 Markdown 体验&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;实时预览与源码模式自由切换&lt;/li&gt;
&lt;li&gt;表格、数学公式等复杂格式的便捷输入&lt;/li&gt;
&lt;li&gt;语法高亮与自动补全&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🧩 强大的插件生态&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图片处理&lt;/strong&gt;：自动转换 WebP 格式，优化加载速度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;附件管理&lt;/strong&gt;：智能归类到指定文件夹&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模板系统&lt;/strong&gt;：快速生成标准化的博文结构及 YAML Front-matter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;格式化工具&lt;/strong&gt;：保持 Markdown 风格一致&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🔄 无缝的版本控制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;配置文件存储在 &lt;code&gt;.obsidian&lt;/code&gt; 目录&lt;/li&gt;
&lt;li&gt;可自定义 &lt;code&gt;.gitignore&lt;/code&gt; 规则&lt;/li&gt;
&lt;li&gt;完美适配 Git 工作流&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;快速上手指南&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在 Obsidian 中选择 &lt;code&gt;管理仓库&lt;/code&gt;，打开本地仓库，将一个本地文件夹作为仓库在 Obsidian 中打开&lt;/li&gt;
&lt;li&gt;定位到博客源码中 Markdown 文章存储目录&lt;/li&gt;
&lt;li&gt;开始享受流畅的写作体验！&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;小技巧&lt;/strong&gt;：使用 Obsidian 移动端应用，使用插件配置好文件同步，随时随地捕捉灵感，保持创作连续性。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;进阶配置建议&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;安装 &lt;strong&gt;Templater&lt;/strong&gt; 插件管理博文模板&lt;/li&gt;
&lt;li&gt;使用 &lt;strong&gt;Linter&lt;/strong&gt; 插件自动格式化 Markdown&lt;/li&gt;
&lt;li&gt;配置 &lt;strong&gt;Image Toolkit&lt;/strong&gt; 优化图片管理&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Windows 设置 Capslock 切换中英文输入</title><link>https://blog.alayedong.cn/posts/2025/windows-capslock-ime/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/windows-capslock-ime/</guid><pubDate>Sat, 08 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Windows 的默认中英文切换方式体验较差，Shift 键既用于切换大小写，又用于切换输入法，容易误触。而 macOS 的 CapsLock 方案——短按切换中英文，长按启用大写锁定——更加直观且减少误操作。&lt;/p&gt;
&lt;p&gt;本文介绍如何使用 &lt;a href=&quot;https://www.autohotkey.com/&quot;&gt;AutoHotkey&lt;/a&gt; 实现类似 macOS 的 CapsLock 中英文切换方式，让输入更高效。&lt;/p&gt;
&lt;h2&gt;安装 AutoHotkey&lt;/h2&gt;
&lt;p&gt;首先，下载并安装 AutoHotkey：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官网：&lt;a href=&quot;https://www.autohotkey.com/&quot;&gt;AutoHotkey&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装完成后，继续进行 Windows 和 AutoHotkey 设置。&lt;/p&gt;
&lt;h2&gt;Windows 设置&lt;/h2&gt;
&lt;p&gt;在 Windows 中，需要调整一些输入法设置，以确保 AutoHotkey 脚本正常工作。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关闭微软拼音输入法的 Shift 切换中英文功能&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;设置&lt;/code&gt; → &lt;code&gt;时间和语言&lt;/code&gt; → &lt;code&gt;语言和区域&lt;/code&gt; → &lt;code&gt;输入&lt;/code&gt; → &lt;code&gt;微软拼音&lt;/code&gt; → &lt;code&gt;键盘&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;取消勾选“Shift 切换中英文”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;添加一个英文输入法&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;设置&lt;/code&gt; → &lt;code&gt;时间和语言&lt;/code&gt; → &lt;code&gt;语言和区域&lt;/code&gt; → &lt;code&gt;添加语言&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;选择 &lt;code&gt;English (United States)&lt;/code&gt; 或其他需要的英文键盘&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;AutoHotkey 设置&lt;/h2&gt;
&lt;h3&gt;创建 AutoHotkey 脚本&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;安装 AutoHotkey 后，右键桌面 → &lt;code&gt;新建&lt;/code&gt; → &lt;code&gt;AutoHotkey Script&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;右键新建的脚本文件，选择 &lt;code&gt;编辑&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;替换内容为以下脚本：&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;使用 CapsLock 切换中英文输入法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#Requires AutoHotkey v2.0
#SingleInstance Force

; 让脚本在后台持续运行
Persistent

CapsLock::
{
    if (KeyWait(&quot;CapsLock&quot;, &quot;T0.5&quot;)) {
        ; 短按 CapsLock 切换中英文
        Send &quot;{Alt Down}{Shift Down}{Alt Up}{Shift Up}&quot;
    } else {
        ; 长按 CapsLock 进行大小写锁定
        SetCapsLockState !GetKeyState(&quot;CapsLock&quot;, &quot;T&quot;)
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;锁定中文输入法的中文输入模式&lt;/h3&gt;
&lt;p&gt;为了确保中文输入法默认处于中文输入模式，可以使用以下脚本：&lt;/p&gt;
&lt;p&gt;来源：&lt;a href=&quot;https://gist.github.com/maokwen/4d99f5c0aa2e7c0c114c708b03fb73ae&quot;&gt;gist.github.com&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#Include %A_ScriptDir%

timeInterval := 500

InChs() {
  ime_status := DllCall(&quot;GetKeyboardLayout&quot;, &quot;int&quot;, 0, &quot;UInt&quot;)
  return (ime_status &amp;amp; 0xffff) = 0x804 ; LANGID(Chinese) = 0x804
}

SwitchImeState(id) {
  SendMessage(0x283,  ; WM_IME_CONTROL
              0x002,  ; wParam IMC_SETCONVERSIONMODE
              1025,   ; lParam (Chinese)
              ,       ; Control (Window)
              id)
}

DetectHiddenWindows True

SetTimer Mainloop, 1000

MainLoop() {
  try {
    hWnd := WinGetID(&quot;A&quot;)
    id := DllCall(&quot;imm32\ImmGetDefaultIMEWnd&quot;, &quot;Uint&quot;, hWnd, &quot;Uint&quot;)

    if (InChs()) {
      SwitchImeState(id)
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;设置脚本开机自启动&lt;/h2&gt;
&lt;p&gt;为了让脚本每次开机后自动运行，可以将其转换为 &lt;code&gt;.exe&lt;/code&gt; 文件，并放入 Windows 启动目录。&lt;/p&gt;
&lt;h3&gt;转换 AutoHotkey 脚本为可执行文件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在 AutoHotkey Dash 中找到 &lt;code&gt;Compile Open Ahk2Exe - convert .ahk to .exe&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择你的 &lt;code&gt;.ahk&lt;/code&gt; 脚本，将其编译为 &lt;code&gt;.exe&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成的 &lt;code&gt;.exe&lt;/code&gt; 文件移动至：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样，每次 Windows 启动时，脚本都会自动运行，无需手动执行。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过 AutoHotkey，我们可以实现 CapsLock 短按切换中英文，长按启用大写锁定，从而改善 Windows 输入体验。搭配锁定中文输入模式的脚本，可以确保中文输入法默认保持中文输入。&lt;/p&gt;
&lt;h2&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://vio.vin/article/windows-settings&quot;&gt;My Windows11 Settings | 薇尔薇&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.csdn.net/qq_43555917/article/details/106523588&quot;&gt;win10自定义快捷键 &amp;amp; 开机自启动—AutoHotkey 实现快捷键上下左右（60键小键盘福利）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>ERA 提问模式：提升 AI 交互效率</title><link>https://blog.alayedong.cn/posts/2025/era-ai-prompt-mode/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/era-ai-prompt-mode/</guid><pubDate>Thu, 06 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;如何让 AI 给出更精准、更有价值的回答？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在与大模型（如 ChatGPT）交流时，提问的方式决定了回答的质量。本文将介绍 &lt;strong&gt;ERA 提问模式（Expectation - Role - Action）&lt;/strong&gt;，帮助你高效获取 AI 生成的优质内容。&lt;/p&gt;
&lt;h2&gt;什么是 ERA 提问模式？&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ERA&lt;/strong&gt; 代表 &lt;strong&gt;Expectation（期望）- Role（角色）- Action（行动）&lt;/strong&gt;，它是一个高效提问的框架，可以让你的问题更加精准，让 AI 的回答更符合你的需求。&lt;/p&gt;
&lt;h3&gt;1. Expectation（期望）&lt;/h3&gt;
&lt;p&gt;明确你的提问目标，让 AI 知道你希望得到什么类型的回答。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ &lt;strong&gt;好的示例&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot; 请用通俗易懂的语言解释什么是机器学习，并举例说明。&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;❌ &lt;strong&gt;不清晰的示例&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot; 机器学习是什么？&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Role（角色）&lt;/h3&gt;
&lt;p&gt;设定 AI 的身份，让回答更符合你的实际需求。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ &lt;strong&gt;好的示例&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot; 假设你是一名资深 Python 工程师，请讲解 asyncio 的核心概念。&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;❌ &lt;strong&gt;不清晰的示例&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;asyncio 是什么？&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. Action（行动）&lt;/h3&gt;
&lt;p&gt;指定 AI 需要执行的具体任务或输出格式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ &lt;strong&gt;好的示例&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot; 请用 Markdown 格式输出一篇关于 Vue 3 Pinia 的入门教程，包含代码示例。&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;❌ &lt;strong&gt;不清晰的示例&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot; 讲讲 Vue 3 Pinia。&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ERA 提问模式示例&lt;/h2&gt;
&lt;h3&gt;🚀 &lt;strong&gt;优化前：&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Vue 3 的 Pinia 怎么用？&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;✅ &lt;strong&gt;优化后（使用 ERA 框架）：&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot; 请你以 Vue 3 高级开发者的身份，讲解 Pinia 在状态管理中的优势，并提供完整的 Vue 3 代码示例。&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Expectation（期望）&lt;/strong&gt;：讲解 Pinia 的优势，并提供代码示例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Role（角色）&lt;/strong&gt;：Vue 3 高级开发者。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action（行动）&lt;/strong&gt;：提供完整的 Vue 3 代码示例。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ERA 提问模式模板&lt;/h2&gt;
&lt;p&gt;你可以使用以下模板来快速构造你的问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;请你以【角色】的身份，针对【目标对象】讲解【主题】，并提供【具体行动或格式】。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✅ &lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot; 请你以 AI 研究员的身份，分析 GPT-4 在自然语言处理中的局限性，并用表格展示优缺点。&quot;&lt;/li&gt;
&lt;li&gt;&quot; 假设你是一名产品经理，如何向客户解释 AI 生成式模型的商业价值？&quot;&lt;/li&gt;
&lt;li&gt;&quot; 作为一名 Java 开发者，如何使用 Spring Boot 构建 REST API？请提供示例代码。&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;使用 &lt;strong&gt;ERA 提问模式&lt;/strong&gt;，你可以： ✅ 提高 AI 回答的准确性。 ✅ 让 AI 站在符合你需求的角度回答。 ✅ 让回答更具有可操作性，减少模糊性。&lt;/p&gt;
&lt;p&gt;下次向 AI 提问时，不妨试试 ERA 模式，你会发现 AI 的回答变得更加精准和实用！🚀&lt;/p&gt;
&lt;h2&gt;资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ai.alexdbg.com/4024.html&quot;&gt;提示工程学习必备 | 最全面的提示框架整理 | 15组-AI仓鼠洞&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Windows PC 扬声器异常低哑</title><link>https://blog.alayedong.cn/posts/2025/windows-pc-speaker-abnormally-low-and-muffled/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/windows-pc-speaker-abnormally-low-and-muffled/</guid><pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近发现笔记本扬声器音质变得很奇怪，声音低哑，听起来就像在打蓝牙电话。排查了一下，原来是 &lt;code&gt;Elevoc Audio Effects Component&lt;/code&gt; 惹的祸。&lt;/p&gt;
&lt;h2&gt;快速解决方法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;code&gt;设备管理器&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;找到 &lt;code&gt;音频处理对象(APO)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;找到 &lt;code&gt;Elevoc Audio Effects Component&lt;/code&gt;，右键选择禁用或者直接卸载。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;它到底是什么？&lt;/h2&gt;
&lt;p&gt;这个组件是 Elevoc 推出的音频增强工具，通常是通过 Windows 更新安装的，号称可以优化音质、降噪。但有时候它会和系统的音频配置发生冲突，结果反而让声音变得很糟糕。&lt;/p&gt;
&lt;h2&gt;如果卸载后又回来了怎么办？&lt;/h2&gt;
&lt;p&gt;Windows 更新可能会再次安装这个组件，所以光卸载可能不够用。这时可以选择以下方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;禁用组件&lt;/strong&gt; 直接禁用 &lt;code&gt;Elevoc Audio Effects Component&lt;/code&gt; 就好。操作步骤和卸载一样，右键点击后选择“禁用”。禁用后，系统就不会加载它了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;阻止它的更新&lt;/strong&gt; 用微软的 &quot; 显示或隐藏更新工具 &quot;（Show or Hide Updates Tool）来屏蔽相关更新。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这个工具可以在微软官网找到。&lt;/li&gt;
&lt;li&gt;下载后运行，选择“隐藏更新”，然后把和 &lt;code&gt;Elevoc&lt;/code&gt; 相关的更新屏蔽掉。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回滚驱动版本&lt;/strong&gt; 如果你觉得还是不对劲，可以试着回滚到之前的音频驱动。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;设备管理器&lt;/code&gt; 里找到你的音频设备，右键属性。&lt;/li&gt;
&lt;li&gt;点击“驱动程序”选项卡，选择“回滚驱动程序”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;s&gt;最后&lt;/s&gt;&lt;/h2&gt;
&lt;p&gt;虽然 &lt;code&gt;Elevoc Audio Effects Component&lt;/code&gt; 本意是提升音质，但如果遇到不兼容的问题，最简单的办法就是禁用或卸载它。如果不想它再捣乱，禁用和屏蔽更新是目前最有效的办法。&lt;/p&gt;
&lt;h2&gt;疑惑&lt;/h2&gt;
&lt;p&gt;在禁用 &lt;code&gt;Elevoc Audio Effects Component&lt;/code&gt; 之后，外放暂时就正常了，但重启电脑之后，还是会复现扬声器音质异常低哑的问题，&lt;s&gt;这时再 &lt;code&gt;启用&lt;/code&gt;，外放就又正常了。所以目前的解决方式就是 &lt;code&gt;禁用&lt;/code&gt;/&lt;code&gt;启用&lt;/code&gt; ，还是没有找到具体的原因和优雅的解决方法，待研究。&lt;/s&gt;&lt;/p&gt;
&lt;h2&gt;续&lt;/h2&gt;
&lt;p&gt;在网络中搜索了一下，发现类似的问题是因为使用了联想的会议扬声器降噪功能，但是奇怪的一点是我并没有在电脑上启用类似的功能也没有类似的开关。尝试直接禁用服务，在Windows服务中搜索&lt;code&gt;Elevoc Control Service&lt;/code&gt;，选择右键属性，在&lt;code&gt;启动类型&lt;/code&gt;中选择&lt;code&gt;禁用&lt;/code&gt;，&lt;strong&gt;解决！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;assets/windows-pc-speaker-abnormally-low-and-muffled/IMG-20250824194355347.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>利用 Github Actions 构建并部署项目到云服务器</title><link>https://blog.alayedong.cn/posts/2025/github-actions-ci-cd-cloud-deploy/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2025/github-actions-ci-cd-cloud-deploy/</guid><pubDate>Wed, 22 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;本教程将介绍如何通过 GitHub Actions 编译 Astro 项目，并将静态文件通过 SCP 推送到云服务器。虽然是 Astro 项目，但是其他项目的部署也是相通的，改一下脚本就好，有一定参考性。&lt;/p&gt;
&lt;p&gt;月初为了自部署 Obsidian 的实时同步，在阿里云购入了服务器和域名，想着既然买都买了，那就正好重建一下博客吧，看来看去选用了 Astro 的 Fuwari 。但是部署到自己服务器时出现了一点问题，服务器是 2 核 2G 的，直接在服务器上编译静态文件再部署，在编译过程中因为服务器配置弱鸡直接就卡崩了，所以就只能在本地笔记本上编译好再把文件发送到服务器上，但是这样也很麻烦，需要手动本地重复编译和上传文件到服务器，于是就开始探究更优雅的方法。最后发现可以使用 Github Actions 来实现当仓库有新的推送时触发自动编译（由 Github 的服务器）和上传得到的静态文件到服务器。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;准备工作&lt;/h2&gt;
&lt;h3&gt;1. 生成 SSH 密钥对&lt;/h3&gt;
&lt;p&gt;在本地生成一对 SSH 密钥，用于 GitHub Actions 和服务器的连接。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t rsa -b 4096 -C &quot;github-actions&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;保存路径建议为 &lt;code&gt;~/.ssh/github_actions_key&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;公钥文件：&lt;code&gt;github_actions_key.pub&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;私钥文件：&lt;code&gt;github_actions_key&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 配置服务器&lt;/h3&gt;
&lt;p&gt;将生成的公钥添加到服务器的 &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; 文件中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;你的公钥内容&quot; &amp;gt;&amp;gt; ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认 SSH 服务正常运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 配置 GitHub Secrets&lt;/h3&gt;
&lt;p&gt;将以下信息添加到 GitHub 仓库的 &lt;strong&gt;Settings &amp;gt; Secrets and variables &amp;gt; Actions &amp;gt; New repository secret&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Secret 名称&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SERVER_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;私钥内容 (&lt;code&gt;github_actions_key&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SERVER_HOST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;服务器 IP 或域名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SERVER_USER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SSH 用户名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SERVER_PORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SSH 端口（默认 22）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;GitHub Actions 工作流文件&lt;/h2&gt;
&lt;p&gt;创建工作流文件 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Deploy Astro to Cloud Server

on:
  push:
    branches:
      - main  # 监控 main 分支的推送事件

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # Step 1: 检出代码
      - name: Checkout code
        uses: actions/checkout@v3

      # Step 2: 设置 Node.js 环境
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: &quot;20&quot;
          cache: ${{ steps.detect-package-manager.outputs.manager }}
          cache-dependency-path: ${{ env.BUILD_PATH }}/${{ steps.detect-package-manager.outputs.lockfile }}

      # Step 3: 安装 pnpm
      - name: Install pnpm
        run: npm install -g pnpm

      # Step 4: 安装依赖并构建
      - name: Install dependencies and build
        run: |
          pnpm install       # 安装依赖
          pnpm run build     # 构建 Astro 项目

      # Step 5: 将静态文件推送到云服务器
      - name: Deploy to Cloud Server
        uses: appleboy/scp-action@v0.1.7
        with:
          host: ${{ secrets.SERVER_HOST }}       # 云服务器 IP 或域名
          username: ${{ secrets.SERVER_USER }}   # SSH 用户名
          key: ${{ secrets.SERVER_KEY }}         # 私钥
          port: ${{ secrets.SERVER_PORT }}       # SSH 端口
          source: dist/                          # Astro 输出目录
          target: /www/wwwroot/blog-astro-fuwari/          # 部署到服务器的路径
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;常见问题与排查&lt;/h2&gt;
&lt;h3&gt;1. SSH 连接失败&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;错误信息&lt;/strong&gt;：&lt;code&gt;Permission denied (publickey)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查服务器是否正确配置了公钥。&lt;/li&gt;
&lt;li&gt;确保私钥权限为 &lt;code&gt;600&lt;/code&gt; 且对目标文件夹具有写入权限。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;错误信息&lt;/strong&gt;：&lt;code&gt;ssh: handshake failed: connection reset by peer&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查服务器防火墙规则，确保允许 SSH 端口（默认 22）。&lt;/li&gt;
&lt;li&gt;确保服务器的 SSH 服务正在运行：&lt;pre&gt;&lt;code&gt;sudo systemctl status sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. SCP 文件上传失败&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错误信息&lt;/strong&gt;：&lt;code&gt;No such file or directory&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;确认目标路径 &lt;code&gt;/var/www/html/astro/&lt;/code&gt; 是否存在，必要时创建：&lt;pre&gt;&lt;code&gt;mkdir -p /var/www/html/astro/
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. GitHub Secrets 配置问题&lt;/h3&gt;
&lt;p&gt;新建一个用于测试的 Action，在 Actions 日志中调试 Secrets 是否正确：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Test GitHub Secrets

on:
  workflow_dispatch: # 手动触发工作流

jobs:
  test-secrets:
    runs-on: ubuntu-latest

    steps:
      # Step 1: 检出代码
      - name: Checkout code
        uses: actions/checkout@v3

      # Step 2: 创建 SSH 配置文件
      - name: Setup SSH Key
        run: |
          mkdir -p ~/.ssh
          echo &quot;${{ secrets.SERVER_KEY }}&quot; &amp;gt; ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          echo -e &quot;Host test-server\n  HostName ${{ secrets.SERVER_HOST }}\n  User ${{ secrets.SERVER_USER }}\n  IdentityFile ~/.ssh/id_rsa\n  StrictHostKeyChecking no&quot; &amp;gt; ~/.ssh/config
          chmod 600 ~/.ssh/config

      # Step 3: 测试 SSH 连接
      - name: Test SSH Connection
        run: ssh test-server &quot;echo &apos;SSH Connection Successful!&apos;&quot;

      # Step 4: 输出测试结果
      - name: Report Success
        if: success()
        run: echo &quot;Secrets are configured correctly!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/107545396&quot;&gt;使用Github Action 部署项目到云服务器 - 知乎&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jiangyu.org/github-action-deploy-to-vps/&quot;&gt;通过GitHub Action将博客网站等静态文件同步到云服务器 - 天一生水&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>给计算机专业准大一新生的一些建议</title><link>https://blog.alayedong.cn/posts/2024/tips-for-computer-science-freshman/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2024/tips-for-computer-science-freshman/</guid><pubDate>Wed, 07 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;写文时间，已经是 8 月，大部分的同学已经收到了自己的录取通知书，知道了自己录取的学校及专业。无论如何，祝贺大家，即将踏入计算机专业的学习之路。距离开学还有一段时间，大家可以在娱乐之余，提前为之后的专业学习做一些准备，这里根据我的经历，分享一些的经验及 tips，希望可以帮到大家。🤔&lt;/p&gt;
&lt;h2&gt;既来则安&lt;/h2&gt;
&lt;p&gt;专业已是既定事实，先坦然接受，学习一段时间再下定论。不过大部分学校还是可以在学校里转专业的，如果在学习了一段时间之后确实觉得计算机对于自己来说不合适，可以向学校申请转专业，每个学校的转专业政策不同，这个具体需要向学校或者是辅导员咨询。&lt;/p&gt;
&lt;h2&gt;买电脑&lt;/h2&gt;
&lt;p&gt;巧妇难为无米之炊。对于计算机专业的同学来说，买电脑是必要的。&lt;/p&gt;
&lt;p&gt;条件允许的话，建议尽早购买。可能很多同学在大学之前很少用过电脑，甚至没有用过电脑，所以可以在正式入学之前买好电脑，提前熟悉电脑的基本操作，&lt;em&gt;&lt;s&gt;闲暇之余还能玩游戏看剧，犒劳一下经历完高考的自己&lt;/s&gt;&lt;/em&gt;。具体选型可以去 B 站看一些评测，如果对笔记本电脑硬件完全不了解，也有小白向的介绍。&lt;/p&gt;
&lt;p&gt;如果有游戏需求的话，建议买带独立显卡的笔记本，满足游戏需求的同时，还能用显卡尝试学习了解一些最近比较火的 AI 应用，比如 AI 生图。&lt;/p&gt;
&lt;h2&gt;学习编程语言&lt;/h2&gt;
&lt;p&gt;可以提前学习一门基础编程语言，例如 C、Python 等等。了解一些计算机专业的基础知识。我学习的第一门语言是 C 语言。看的是翁恺老师的课，对于入门来说非常不错，这里推荐给大家 &lt;a href=&quot;https://www.icourse163.org/course/ZJU-9001&quot;&gt;C语言程序设计_浙江大学_中国大学MOOC(慕课)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;加入一个技术向社团&lt;/h2&gt;
&lt;p&gt;社团是大学生活中的一个有趣部分。可以去了解一下学校里的社团主要有哪些、是干什么的。一般大学中都能找到有组织参与学科竞赛的技术向社团，了解清楚情况后，可以选择加入一个，既可以有学习锻炼技术的机会，还能认识同样对技术有热情的朋友。&lt;/p&gt;
&lt;h2&gt;自学&lt;/h2&gt;
&lt;p&gt;就目前的环境来说，大部分大学的计算机课程是基础的引入，计算机的世界太丰富多彩了，学校是教不完的，也难以跟上行业发展。所以计算机专业，自学很重要，千万不要认为每天上完课，就可以回宿舍娱乐了。互联网时代，网络上的学习资源有很多，B 站、慕课等等都是很好的找视频课程的地方。&lt;/p&gt;
&lt;h2&gt;资源推荐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dazidazi.com/&quot;&gt;dazidazi-在线打字练习&lt;/a&gt; 键盘是计算机专业吃饭的筷子，代码可以写的不快，但是敲键盘一定要帅😎&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/&quot;&gt;Github&lt;/a&gt; 全球最大的代码托管平台，可以在上面找到很多有趣的开源项目&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>关闭 QQ 音乐 P2P</title><link>https://blog.alayedong.cn/posts/2024/disable-qq-music-p2p/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2024/disable-qq-music-p2p/</guid><pubDate>Sat, 03 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引&lt;/h2&gt;
&lt;p&gt;最近 C 盘有点告急,刚好整理一下电脑上的文件, 通过 &lt;a href=&quot;https://github.com/redtrillix/SpaceSniffer/releases&quot;&gt;SpaceSniffer&lt;/a&gt; 可以以图形大小的形式查看和反映磁盘上各文件的大小,发现 QQ 音乐缓存文件占了很大的一块,起初还以为只是平常的听歌缓存,后仔细翻看文件夹,观察文件夹命名发现是 QQ 音乐 P2P 下载的缓存,占用高达 &lt;code&gt;17GB&lt;/code&gt;🥲所以就禁用了 QQ 音乐 P2P 下载.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/disable-qq-music-p2p/QQ%E9%9F%B3%E4%B9%90P2P%E6%96%87%E4%BB%B6%E5%A4%B9%E5%AD%98%E5%82%A8%E5%8D%A0%E7%94%A8.png&quot; alt=&quot;QQ音乐P2P文件夹存储占用&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;教程&lt;/h2&gt;
&lt;p&gt;附上教程&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/read/cv27616306/&quot;&gt;禁止QQ音乐后台上传教程&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;刚好前两天看到一期视频讲到了 P2P&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV18x4y1476o&quot;&gt;【X.PIN】偷你流量还断你家网，视频平台和运营商打架，把消费者干成了小丑。。。&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>VSCode 与 Keil 协同嵌入式开发</title><link>https://blog.alayedong.cn/posts/2024/vscode-and-keil-collaborative-embedded-development/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2024/vscode-and-keil-collaborative-embedded-development/</guid><pubDate>Tue, 23 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Keil&lt;/em&gt;是嵌入式开发中常用的 IDE，但是&lt;em&gt;Keil&lt;/em&gt;没有方便的自动补全、代码重构、自由度高的插件等功能，代码的编辑体验很难比拟&lt;em&gt;VSCode&lt;/em&gt;的现代化。通过&lt;em&gt;VSCode&lt;/em&gt;中插件的能力，可以使&lt;em&gt;VSCode&lt;/em&gt;调用&lt;em&gt;Keil&lt;/em&gt;的编译器进行编译，并直接在&lt;em&gt;VSCode&lt;/em&gt;的内置控制台中显示报错信息和错误代码行跳转，实现一站式编辑&amp;amp;编译是替代方案，提高了嵌入式开发效率。&lt;/p&gt;
&lt;h2&gt;先前条件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;已经安装了&lt;em&gt;VSCode&lt;/em&gt;和&lt;em&gt;Keil&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;已经配置好&lt;em&gt;Keil&lt;/em&gt;的 &lt;code&gt;License&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可以使用 Keil 直接进行代码编辑和编译&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;VSCode&lt;/em&gt;和&lt;em&gt;Keil&lt;/em&gt;的安装与基础配置，网络上已经有很多教程，可自行搜索，这里不再赘述。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;em&gt;VSCode&lt;/em&gt;：&lt;a href=&quot;https://code.visualstudio.com/download&quot;&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Keil&lt;/em&gt;：&lt;a href=&quot;https://www.keil.com/download/product/&quot;&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;安装和配置&lt;em&gt;Keil uVision Assistant&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;打开&lt;em&gt;VSCode&lt;/em&gt;，点击 &lt;code&gt;扩展&lt;/code&gt; 图标，搜索 &lt;code&gt;Keil uVision Assistant&lt;/code&gt;，安装该插件并启用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/vscode-and-keil-collaborative-embedded-development/VSCode%E6%8B%93%E5%B1%95%E6%90%9C%E7%B4%A2.png&quot; alt=&quot;VSCode拓展搜索&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
这里搜索结果可能会出现两个名字类似的插件，这里做出解释：&lt;em&gt;Keil Assistant&lt;/em&gt; 已于 &lt;em&gt;Jun 13, 2021&lt;/em&gt; 归档转为只读。&lt;em&gt;Keil uVision Assistant&lt;/em&gt; 是 &lt;em&gt;Keil Assistant&lt;/em&gt; 的后续版本，由另外一个开发者 &lt;em&gt;jacksonjim&lt;/em&gt; 负责继续更新及维护。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;点击插件右侧的 &lt;code&gt;⚙️&lt;/code&gt;-&lt;code&gt;拓展设置&lt;/code&gt; 根据所开发的单片机芯片的架构和&lt;em&gt;Keil&lt;/em&gt;的安装目录，完成插件的基础配置。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/vscode-and-keil-collaborative-embedded-development/Keil%E6%8B%93%E5%B1%95%E8%AE%BE%E7%BD%AE.png&quot; alt=&quot;Keil拓展设置&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;键&lt;/code&gt; 为单片机芯片的架构，&lt;code&gt;值&lt;/code&gt; 为&lt;em&gt;Keil&lt;/em&gt;的安装目录。如果忘记了&lt;em&gt;Keil&lt;/em&gt;的安装目录，可以在桌面右键 &lt;code&gt;Keil uVision-快捷方式&lt;/code&gt;，然后 &lt;code&gt;打开文件所在的位置&lt;/code&gt;，再从当前的文件夹位置往上回退一级，定位到包含 &lt;code&gt;UV4.exe&lt;/code&gt; 所在的的 &lt;code&gt;UV4&lt;/code&gt; 文件夹即可。如图情况所示，对应的 &lt;code&gt;值&lt;/code&gt; 为 &lt;code&gt;C:\Keil_v5&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/vscode-and-keil-collaborative-embedded-development/UV4%E6%96%87%E4%BB%B6%E5%A4%B9.png&quot; alt=&quot;UV4文件夹&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;开始使用&lt;/h2&gt;
&lt;p&gt;使用&lt;em&gt;VSCode&lt;/em&gt;打开一个项目文件夹，就可以在&lt;em&gt;VSCode&lt;/em&gt;中直接进行代码编辑和编译了。&lt;em&gt;Keil uVision Assistant&lt;/em&gt;的 &lt;code&gt;README.md&lt;/code&gt; 中有详细的使用教程，可以参考。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jacksonjim/keil-assistant/blob/master/README.md&quot;&gt;Keil Assistant README.md&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;补充&lt;/h2&gt;
&lt;h3&gt;自动 Open Project&lt;/h3&gt;
&lt;p&gt;使用 &lt;em&gt;Keil uVision Assistant&lt;/em&gt; 插件进行开发，如果 &lt;code&gt;.uvprj&lt;/code&gt; 文件不在项目的一级子文件夹中，插件将无法自动识别到 &lt;code&gt;.uvprj&lt;/code&gt; 文件，每次打开&lt;em&gt;VSCode&lt;/em&gt;写项目代码时都需要手动指定 &lt;code&gt;.uvprj&lt;/code&gt; 文件地址，进行重复的 &lt;code&gt;Open Project&lt;/code&gt; 的操作，不够&lt;em&gt;优雅&lt;/em&gt;。&lt;/p&gt;
&lt;p&gt;其实&lt;em&gt;Keil uVision Assistant&lt;/em&gt; 插件中有一项 &lt;code&gt;File Location List&lt;/code&gt; 设置，可以添加 &lt;code&gt;.uvprj&lt;/code&gt; 文件所在的文件夹路径，这样每次打开项目文件夹时插件就会自动识别到 &lt;code&gt;.uvprj&lt;/code&gt; 文件，搭配&lt;em&gt;VSCode&lt;/em&gt;的 &lt;code&gt;workspace&lt;/code&gt; 功能，体验更佳。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/vscode-and-keil-collaborative-embedded-development/workspace%E7%9A%84Keil%E6%8F%92%E4%BB%B6%E8%AE%BE%E7%BD%AE.png&quot; alt=&quot;workspace的Keil插件设置&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;添加/删除项目源文件&lt;/h3&gt;
&lt;p&gt;利用&lt;em&gt;Keil uVision Assistant&lt;/em&gt;插件在&lt;em&gt;VSCode&lt;/em&gt;中进行代码编译，原理是通过调用&lt;em&gt;Keil&lt;/em&gt;的编译器实现的，所以&lt;strong&gt;&lt;em&gt;Keil&lt;/em&gt; 的安装是必须的&lt;/strong&gt;。并且给项目添加/删除的源文件也必须回到&lt;em&gt;Keil&lt;/em&gt;,&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/vscode-and-keil-collaborative-embedded-development/Keil%E6%B7%BB%E5%8A%A0%E9%A1%B9%E7%9B%AE%E4%BB%A3%E7%A0%81%E6%96%87%E4%BB%B6.png&quot; alt=&quot;Keil添加项目代码文件&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;注意&lt;/h2&gt;
&lt;h3&gt;编码格式及中文注释乱码&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Keil&lt;/em&gt;原因，使用中文注释必须使用 &lt;code&gt;GB2312&lt;/code&gt; 编码，所以为了避免出现注释乱码同时保持&lt;em&gt;Keil&lt;/em&gt;编辑的可读兼容性。可以在&lt;em&gt;VSCode&lt;/em&gt;中进行对应的设置。&lt;/p&gt;
&lt;p&gt;打开&lt;em&gt;VSCode&lt;/em&gt;设置，搜索 &lt;code&gt;encoding&lt;/code&gt;，勾选 &lt;code&gt;Auto Guess Encoding&lt;/code&gt;，在 &lt;code&gt;Candidate Guess Encoding&lt;/code&gt; 中依次添加 &lt;code&gt;gb2312&lt;/code&gt;、&lt;code&gt;utf8&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/vscode-and-keil-collaborative-embedded-development/%E7%BC%96%E7%A0%81%E8%AE%BE%E7%BD%AE.png&quot; alt=&quot;编码设置&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;C51/C251 的中断提示问题&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;Keil uVision Assistant&lt;/code&gt; 插件进行开发，但是 C51/C251 项目中 &lt;code&gt;中断函数&lt;/code&gt; 的 &lt;code&gt;interrupt x&lt;/code&gt;（x 代表中断号即一个数字）会导致&lt;em&gt;VSCode&lt;/em&gt;语法分析报错，这是因为&lt;em&gt;VSCode&lt;/em&gt;的语法分析是基于标准 C 语言的，标准 C 语言中没有 &lt;code&gt;中断函数&lt;/code&gt; 的 &lt;code&gt;interrupt x&lt;/code&gt; 的语法。&lt;/p&gt;
&lt;p&gt;所以需要在代码头文件通过宏定义进行修复，具体请参照 &lt;a href=&quot;https://github.com/jacksonjim/keil-assistant/blob/master/README.md&quot;&gt;关于 C51/C251 的中断提示问题&lt;/a&gt;。将所有 &lt;code&gt;interrupt x&lt;/code&gt; 改为 &lt;code&gt;INTERRUPT(x)&lt;/code&gt; 并在头文件中加入对应芯片架构的替换修复的宏定义。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
如果项目涉及到日后的他人维护，为避免产生不必要的不解或错误，注意在代码中对于解决本问题做出的修改&lt;strong&gt;进行必要的注释&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;中断函数修改&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;一般&lt;/strong&gt;的中断函数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void TM0_Isr() interrupt 1
{
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;修改后&lt;/strong&gt;的中断函数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void TM0_Isr() INTERRUPT(1)
{
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;头文件修改&lt;/h4&gt;
&lt;p&gt;在头文件中加入对应芯片架构的替换修复的宏定义：&lt;/p&gt;
&lt;p&gt;对于&lt;strong&gt;C51&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#ifndef __VSCODE_C51__
#define INTERRUPT(x) interrupt x
#else
#define INTERRUPT(x)
#endif
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于&lt;strong&gt;C251&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#ifndef __VSCODE_C251__
#define INTERRUPT(x) interrupt x
#else
#define INTERRUPT(x)
#endif
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;END&lt;/p&gt;
</content:encoded></item><item><title>修改 Windows 任务栏字体颜色</title><link>https://blog.alayedong.cn/posts/2024/change-windows-taskbar-font-color/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2024/change-windows-taskbar-font-color/</guid><pubDate>Thu, 13 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;使用场景&lt;/h2&gt;
&lt;p&gt;Windows 并不会去根据任务栏背景色吊改变字体颜色，当使用例如 &lt;a href=&quot;https://github.com/TranslucentTB/TranslucentTB&quot;&gt;TranslucentTB&lt;/a&gt;，在一些背景下，导致任务栏暗色时，默认字体显示仍为黑色，导致观察困难，可读性差。所以可以通过修改注册表改变任务栏默认字体颜色。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/change-windows-taskbar-font-color/1718241252560.png&quot; alt=&quot;1718241252560&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;修改注册表&lt;/h2&gt;
&lt;p&gt;新建一个.txt 文件，打开记事本，复制以下内容，粘贴到记事本中，保存为.reg 文件，双击打开，即可修改注册表。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize]
&quot;ColorPrevalence&quot;=dword:00000002
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改完成后，需要在任务管理器中，重启资源管理器，即可生效。若仍然无效可以尝试重启。&lt;/p&gt;
&lt;h2&gt;回归默认设置&lt;/h2&gt;
&lt;p&gt;类似之前的方法，将 &lt;code&gt;ColorPrevalence&lt;/code&gt; 的值设置为 &lt;code&gt;0&lt;/code&gt;，再双击打开.reg 文件修改。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize]
&quot;ColorPrevalence&quot;=dword:00000000
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>符号链接</title><link>https://blog.alayedong.cn/posts/2024/symbolic-link/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2024/symbolic-link/</guid><pubDate>Wed, 05 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;什么是符号链接&lt;/h2&gt;
&lt;p&gt;符号链接，又常被称为软链接，是现代操作系统中（如 Linux、macOS 及 Windows 的新版本）提供的一种高级文件系统特性。它实质上是一个特殊类型的文件，其功能在于指向文件系统中另一个文件或目录的位置。下面是关于符号链接的几个核心概念：&lt;/p&gt;
&lt;h3&gt;特性概览&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;路径表示：符号链接内的路径可以是绝对的，直接指向文件系统的特定位置；也可以是相对的，基于链接所在目录来定位目标。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;透明操作：用户和应用程序对符号链接进行读写操作时，操作系统会无缝地重定向这些操作至目标文件或目录，保证了使用的透明性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;独立存在：虽然服务于指向其他文件或目录，符号链接本身作为文件系统中的独立实体存在，拥有自己的属性和权限设置。删除链接不影响原文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目录兼容：支持创建指向文件或目录的链接，大大增强了文件系统的灵活性和组织能力。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动态性与稳定性：目标文件的移动或重命名不会自动更新符号链接，可能导致链接失效，但同时也意味着链接可以独立于目标存在。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;循环与复杂结构：在理论上，符号链接可以构成循环引用，即链接指向自己或其他链接，类似于编程中的递归结构。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;跨文件系统：与硬链接相比，符号链接的一大优势是可以跨越不同的文件系统边界，指向其他分区或网络位置的文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;权限管理：符号链接自身的权限控制独立于目标对象，为安全管理和访问控制提供了额外的灵活性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;应用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;路径简化：通过创建简短或逻辑清晰的链接路径，便于用户和程序快速访问深层或复杂的文件结构。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;快捷方式：类似 Windows 的快捷方式功能，为频繁访问的文件或目录提供便捷入口。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据共享：实现文件共享的同时，无需复制文件，节省存储空间并保持数据一致性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;系统配置与部署：动态调整系统配置，特别是在开发环境中，符号链接可以帮助快速切换不同的项目版本或资源。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过上述介绍，可以看出符号链接是提升文件系统灵活性和效率的重要工具，广泛应用于各种操作系统和应用场景中。&lt;/p&gt;
&lt;h2&gt;目标&lt;/h2&gt;
&lt;p&gt;本教程指导您在 Windows 操作系统中利用命令行工具 &lt;code&gt;mklink&lt;/code&gt;，创建指向特定文件的相对路径符号链接。确保即使源文件夹位置变动，该链接依旧保持有效。&lt;/p&gt;
&lt;h2&gt;准备工作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作系统要求&lt;/strong&gt;：适用于 Windows 系统。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理员权限&lt;/strong&gt;：确保拥有足够的权限来执行创建符号链接的操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令行工具&lt;/strong&gt;：打开“命令提示符（管理员）”或“Windows PowerShell（管理员）”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;操作步骤&lt;/h2&gt;
&lt;h3&gt;1. 导航至工作目录&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;打开命令行工具&lt;/strong&gt;：按 &lt;code&gt;Win + X&lt;/code&gt;，选择“命令提示符（管理员）”或“Windows PowerShell（管理员）”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切换目录&lt;/strong&gt;：使用 &lt;code&gt;cd&lt;/code&gt; 命令进入您打算创建符号链接的目录。例如，若目录为 &lt;code&gt;D:\Alaye\GitHubDesktop\SmartCar_BST_Epoilt_Copy&lt;/code&gt;，输入：&lt;pre&gt;&lt;code&gt;cd /d D:\Alaye\GitHubDesktop\SmartCar_BST_Epoilt_Copy
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 创建符号链接&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;执行命令&lt;/strong&gt;：使用 &lt;code&gt;mklink&lt;/code&gt; 命令创建指向目标文件的相对路径符号链接。假设目标文件为 &lt;code&gt;D:\Alaye\GitHubDesktop\SmartCar_BST_Epoilt_Copy\STC32F_Code\Project\MDK\EPOILT.uvproj&lt;/code&gt;，并在当前 &lt;code&gt;D:\Alaye\GitHubDesktop\SmartCar_BST_Epoilt_Copy&lt;/code&gt; 目录下创建同名链接，命令如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mklink &quot;EPOILT.uvproj&quot; &quot;.\STC32F_Code\Project\MDK\EPOILT.uvproj&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中，“EPOILT.uvproj”是新创建的链接名称，而 &lt;code&gt;.\STC32F_Code\Project\MDK\EPOILT.uvproj&lt;/code&gt; 表示从当前目录出发的相对路径。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 验证与测试&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;成功执行命令后，检查当前目录下是否出现了新的符号链接文件，无错误提示表示创建成功。&lt;/li&gt;
&lt;li&gt;双击新创建的链接，确认是否能顺利打开目标文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;注意事项&lt;/h2&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;/ul&gt;
&lt;p&gt;通过上述步骤，可以高效地利用相对路径符号链接来优化文件和目录的组织方式，提高工作效率。&lt;/p&gt;
</content:encoded></item><item><title>Markdown Extended Features</title><link>https://blog.alayedong.cn/posts/markdown-extended/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/markdown-extended/</guid><description>Read more about Markdown features in Fuwari</description><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;GitHub Repository Cards&lt;/h2&gt;
&lt;p&gt;You can add dynamic cards that link to GitHub repositories, on page load, the repository information is pulled from the GitHub API.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Fabrizz/MMM-OnSpotify&quot;}&lt;/p&gt;
&lt;p&gt;Create a GitHub repository card with the code &lt;code&gt;::github{repo=&quot;&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&quot;}&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;saicaca/fuwari&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Admonitions&lt;/h2&gt;
&lt;p&gt;Following types of admonitions are supported: &lt;code&gt;note&lt;/code&gt; &lt;code&gt;tip&lt;/code&gt; &lt;code&gt;important&lt;/code&gt; &lt;code&gt;warning&lt;/code&gt; &lt;code&gt;caution&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::note
Highlights information that users should take into account, even when skimming.
:::&lt;/p&gt;
&lt;p&gt;:::tip
Optional information to help a user be more successful.
:::&lt;/p&gt;
&lt;p&gt;:::important
Crucial information necessary for users to succeed.
:::&lt;/p&gt;
&lt;p&gt;:::warning
Critical content demanding immediate user attention due to potential risks.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Negative potential consequences of an action.
:::&lt;/p&gt;
&lt;h3&gt;Basic Syntax&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;:::note
Highlights information that users should take into account, even when skimming.
:::

:::tip
Optional information to help a user be more successful.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Custom Titles&lt;/h3&gt;
&lt;p&gt;The title of the admonition can be customized.&lt;/p&gt;
&lt;p&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;GitHub Syntax&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;a href=&quot;https://github.com/orgs/community/discussions/16925&quot;&gt;The GitHub syntax&lt;/a&gt; is also supported.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; [!NOTE]
&amp;gt; The GitHub syntax is also supported.

&amp;gt; [!TIP]
&amp;gt; The GitHub syntax is also supported.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Spoiler&lt;/h3&gt;
&lt;p&gt;You can add spoilers to your text. The text also supports &lt;strong&gt;Markdown&lt;/strong&gt; syntax.&lt;/p&gt;
&lt;p&gt;The content :spoiler[is hidden &lt;strong&gt;ayyy&lt;/strong&gt;]!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The content :spoiler[is hidden **ayyy**]!

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>搭建 Jekyll 开发环境实现本地预览</title><link>https://blog.alayedong.cn/posts/2024/jekyll-dev-env-setup-for-local-preview/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/2024/jekyll-dev-env-setup-for-local-preview/</guid><pubDate>Fri, 26 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;为什么选 Jeklly&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Jeklly 的一个最好的特点是『关注 blog 本身』。这是指什么呢？简单的说就是写博客的过程被铸造进了 Jekyll 的功能中。你只需简单的管理你电脑中的一个文件夹下的文本文件就可以写文章并方便的在线上发布。与繁琐的配置和维护数据库和基于网站的内容管理系统 (CMS) 相比，这是一个非常受欢迎的改变。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;安装 Jekyll&lt;/h2&gt;
&lt;h3&gt;事先准备&lt;/h3&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ruby-lang.org/en/downloads/&quot;&gt;Ruby&lt;/a&gt;（including development headers, Jekyll 2 需要 v1.9.3 及以上版本，Jekyll 3 需要 v2 及以上版本）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;RubyGems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linux, Un ix, or Mac OS X&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/&quot;&gt;NodeJS&lt;/a&gt;, 或其他 JavaScript 运行环境（Jekyll 2 或更早版本需要 CoffeeScript 支持）。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.python.org/downloads/&quot;&gt;Python 2.7&lt;/a&gt;（Jekyll 2 或更早版本）&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;官方文档没有说 Windows，不过 Windows 设备也可以安装。并且一般情况我们都是安装 Jekyll3 及以上的版本，所以我们需要准备的可以是这些：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ruby-lang.org/en/downloads/&quot;&gt;Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;RubyGems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Windows，Linux, Unix, Mac OS X 系统中的其中一种（以下教程都以 Windows 为例）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/&quot;&gt;NodeJS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;安装 Ruby、RubyGems&lt;/h4&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://www.ruby-lang.org/en/downloads/&quot;&gt;Ruby&lt;/a&gt; 官网，选择对应的安装方式，Windows 设备选 &lt;code&gt;RubyInstaller&lt;/code&gt;，并下载安装。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/jekyll-dev-env-setup-for-local-preview/SK2qbzThFodmccxstVgc4njSn3e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ruby+Devkit&lt;/code&gt; 中包含了 &lt;code&gt;Ruby&lt;/code&gt; 和 &lt;code&gt;RubyGems&lt;/code&gt;，下载并安装 &lt;code&gt;Ruby+Devkit&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/jekyll-dev-env-setup-for-local-preview/EepDbON7yolhk6xrG75cBcjZnFg.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;命令行中分别输入 &lt;code&gt;ruby -v&lt;/code&gt; 和 &lt;code&gt;gem -v&lt;/code&gt; 查看版本，确认安装完成。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/jekyll-dev-env-setup-for-local-preview/EL5AbgSYfozzTPxGtmSc2JgTnsd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装完成后，会自动弹出 &lt;code&gt;cmd.exe&lt;/code&gt;。如下图所示， 提示安装 &lt;code&gt;MSYS2&lt;/code&gt;，它是用来编译 &lt;code&gt;Ruby&lt;/code&gt; 本地包的，我们需要手动输入 &lt;code&gt;[1,2,3]&lt;/code&gt;，然后回车进行安装。由于网络的原因，可能会安装极慢，甚至安装失败，但是这是必须的步骤，只能多试几次，或者“爬高一点”。这里如果没有弹出命令行 &lt;code&gt;MSYS2&lt;/code&gt; 安装界面或者把它关掉了，那么可以重新打开 &lt;code&gt;cmd&lt;/code&gt; 命令行，输入 &lt;code&gt;ridk install&lt;/code&gt; 来再次进入 MSYS2 安装界面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/jekyll-dev-env-setup-for-local-preview/W5bSb2am4okrOAxLQZlcUgtwnze.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;安装 NodeJS&lt;/h4&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://nodejs.org/&quot;&gt;NodeJS&lt;/a&gt; 官网，点击 Download 即可然后安装即可，没有什么特别的需要注意的地方，略过。&lt;/p&gt;
&lt;h3&gt;正式安装&lt;/h3&gt;
&lt;p&gt;使用 gem 安装 Jekyll：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gem install jekyll
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就把 jekyll 安装完成了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/jekyll-dev-env-setup-for-local-preview/MTNwbbtzmouPgSxJCQTcWnzDnLd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;本地 Server&lt;/h2&gt;
&lt;h3&gt;项目文件夹启动命令行&lt;/h3&gt;
&lt;p&gt;相关命令只能在一个含有 &lt;code&gt;Gemfile&lt;/code&gt; 的目录下执行，如项目的根目录。在项目所在的文件夹进入 &lt;code&gt;cmd&lt;/code&gt;。在项目文件夹文件管理器地址栏输入 &lt;code&gt;cmd&lt;/code&gt; 并回车。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/jekyll-dev-env-setup-for-local-preview/YpEvbR9Etotft8xfBMYckbtwn3z.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;命令行显示的项目文件夹的地址即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/jekyll-dev-env-setup-for-local-preview/RQZib84A7oLlLixZxTccq2x4nXb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;安装 bundle&lt;/h3&gt;
&lt;p&gt;Rails 3 中引入 Bundle 来管理项目中所有 gem 依赖，所以首先我们需要安装 bundle。&lt;/p&gt;
&lt;h3&gt;安装 webrick 模块&lt;/h3&gt;
&lt;p&gt;webrick 是 Ruby 的 web 服务器模块，从 Ruby 3.0 开始 webrick 已经不再绑定到 Ruby 中了，请参考链接： &lt;a href=&quot;https://link.zhihu.com/?target=https%3A//www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/&quot;&gt;Ruby 3.0.0 Released&lt;/a&gt; 中的说明，webrick 需要手动进行添加。&lt;/p&gt;
&lt;p&gt;添加的命令为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bundle add webrick
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;手动进行添加 &lt;code&gt;webrick&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bundle add webrick
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;启动 server&lt;/h3&gt;
&lt;p&gt;启动本地 server：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jekyll server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将地址复制粘贴到浏览器，访问生成的本地地址：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/jekyll-dev-env-setup-for-local-preview/O8jzbcgKdo0jH6xLZMDcMPz6nQh.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功，大功告成~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/jekyll-dev-env-setup-for-local-preview/M71abr0qXoCkLyx78MkczYKQnKh.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置启动命令文件&lt;/h3&gt;
&lt;p&gt;为了方便启动 &lt;code&gt;jekyll server&lt;/code&gt; 和调试，可以编写一个命令执行文件，之后可以直接双击运行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;start http://127.0.0.1:4000/
jekyll serve --livereload
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;start http://127.0.0.1:4000/&lt;/code&gt; 启动浏览器并打开本地网址&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--livereload&lt;/code&gt; 在源文件更新后自动刷新本地预览网页
{: .prompt-tip }&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;参考引用：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jekyllcn.com/docs/home/&quot;&gt;https://jekyllcn.com/docs/home/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/139567128&quot;&gt;https://zhuanlan.zhihu.com/p/139567128&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/426510048&quot;&gt;https://zhuanlan.zhihu.com/p/426510048&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dovesandy.github.io/2020/03/12/jekyll-start-jekyll-error/&quot;&gt;https://dovesandy.github.io/2020/03/12/jekyll-start-jekyll-error/&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Expressive Code Example</title><link>https://blog.alayedong.cn/posts/expressive-code/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/expressive-code/</guid><description>How code blocks look in Markdown using Expressive Code.</description><pubDate>Wed, 10 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here, we&apos;ll explore how code blocks look using &lt;a href=&quot;https://expressive-code.com/&quot;&gt;Expressive Code&lt;/a&gt;. The provided examples are based on the official documentation, which you can refer to for further details.&lt;/p&gt;
&lt;h2&gt;Expressive Code&lt;/h2&gt;
&lt;h3&gt;Syntax Highlighting&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/syntax-highlighting/&quot;&gt;Syntax Highlighting&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Regular syntax highlighting&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;This code is syntax highlighted!&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Rendering ANSI escape sequences&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;ANSI colors:
- Regular: [31mRed[0m [32mGreen[0m [33mYellow[0m [34mBlue[0m [35mMagenta[0m [36mCyan[0m
- Bold:    [1;31mRed[0m [1;32mGreen[0m [1;33mYellow[0m [1;34mBlue[0m [1;35mMagenta[0m [1;36mCyan[0m
- Dimmed:  [2;31mRed[0m [2;32mGreen[0m [2;33mYellow[0m [2;34mBlue[0m [2;35mMagenta[0m [2;36mCyan[0m

256 colors (showing colors 160-177):
[38;5;160m160 [38;5;161m161 [38;5;162m162 [38;5;163m163 [38;5;164m164 [38;5;165m165[0m
[38;5;166m166 [38;5;167m167 [38;5;168m168 [38;5;169m169 [38;5;170m170 [38;5;171m171[0m
[38;5;172m172 [38;5;173m173 [38;5;174m174 [38;5;175m175 [38;5;176m176 [38;5;177m177[0m

Full RGB colors:
[38;2;34;139;34mForestGreen - RGB(34, 139, 34)[0m

Text formatting: [1mBold[0m [2mDimmed[0m [3mItalic[0m [4mUnderline[0m
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Editor &amp;amp; Terminal Frames&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/frames/&quot;&gt;Editor &amp;amp; Terminal Frames&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Code editor frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Title attribute example&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- src/content/index.html --&amp;gt;
&amp;lt;div&amp;gt;File name comment example&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Terminal frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;This terminal frame has no title&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;Write-Output &quot;This one has a title!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Overriding frame types&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Look ma, no frame!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;# Without overriding, this would be a terminal frame
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Text &amp;amp; Line Markers&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/text-markers/&quot;&gt;Text &amp;amp; Line Markers&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Marking full lines &amp;amp; line ranges&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Line 1 - targeted by line number
// Line 2
// Line 3
// Line 4 - targeted by line number
// Line 5
// Line 6
// Line 7 - targeted by range &quot;7-8&quot;
// Line 8 - targeted by range &quot;7-8&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting line marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;this line is marked as deleted&apos;)
  // This line and the next one are marked as inserted
  console.log(&apos;this is the second inserted line&apos;)

  return &apos;this line uses the neutral default marker type&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding labels to line markers&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}
  value={value}
  className={buttonClassName}
  disabled={disabled}
  active={active}
&amp;gt;
  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding long labels on their own lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}

  value={value}
  className={buttonClassName}

  disabled={disabled}
  active={active}
&amp;gt;

  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Using diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+this is an actual diff file
-all contents will remain unmodified
 no whitespace will be removed either
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Combining syntax highlighting with diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;  function thisIsJavaScript() {
    // This entire block gets highlighted as JavaScript,
    // and we can still add diff markers to it!
-   console.log(&apos;Old code to be removed&apos;)
+   console.log(&apos;New and shiny code!&apos;)
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Marking individual text inside lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  // Mark any given text inside lines
  return &apos;Multiple matches of the given text are supported&apos;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Regular expressions&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;The words yes and yep will be marked.&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Escaping forward slashes&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Test&quot; &amp;gt; /home/test.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting inline marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;These are inserted and deleted marker types&apos;);
  // The return statement uses the default marker type
  return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Word Wrap&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/word-wrap/&quot;&gt;Word Wrap&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Configuring word wrap per block&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Configuring indentation of wrapped lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent (enabled by default)
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Collapsible Sections&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/collapsible-sections/&quot;&gt;Collapsible Sections&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from &apos;@example/some-boilerplate&apos;
import { evenMoreBoilerplate } from &apos;@example/even-more-boilerplate&apos;

const engine = someBoilerplateEngine(evenMoreBoilerplate())

// This part of the code will be visible by default
engine.doSomething(1, 2, 3, calcFn)

function calcFn() {
  // You can have multiple collapsed sections
  const a = 1
  const b = 2
  const c = a + b

  // This will remain visible
  console.log(`Calculation result: ${a} + ${b} = ${c}`)
  return c
}

// All this code until the end of the block will be collapsed again
engine.closeConnection()
engine.freeMemory()
engine.shutdown({ reason: &apos;End of example boilerplate code&apos; })
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Line Numbers&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/line-numbers/&quot;&gt;Line Numbers&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Displaying line numbers per block&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// This code block will show line numbers
console.log(&apos;Greetings from line 2!&apos;)
console.log(&apos;I am on line 3&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Line numbers are disabled for this block
console.log(&apos;Hello?&apos;)
console.log(&apos;Sorry, do you know what line I am on?&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Changing the starting line number&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Greetings from line 5!&apos;)
console.log(&apos;I am on line 6&apos;)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Simple Guides for Fuwari</title><link>https://blog.alayedong.cn/posts/guide/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/guide/</guid><description>How to use this blog template.</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Cover image source: &lt;a href=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=2048/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This blog template is built with &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;. For the things that are not mentioned in this guide, you may find the answers in the &lt;a href=&quot;https://docs.astro.build/&quot;&gt;Astro Docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Front-matter of Posts&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;---
title: My First Blog Post
published: 2023-09-09
description: This is the first post of my new Astro blog.
image: ./cover.jpg
tags: [Foo, Bar]
category: Front-end
draft: false
---
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The title of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The date the post was published.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A short description of the post. Displayed on index page.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The cover image path of the post.&amp;lt;br/&amp;gt;1. Start with &lt;code&gt;http://&lt;/code&gt; or &lt;code&gt;https://&lt;/code&gt;: Use web image&amp;lt;br/&amp;gt;2. Start with &lt;code&gt;/&lt;/code&gt;: For image in &lt;code&gt;public&lt;/code&gt; dir&amp;lt;br/&amp;gt;3. With none of the prefixes: Relative to the markdown file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The tags of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The category of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;If this post is still a draft, which won&apos;t be displayed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Where to Place the Post Files&lt;/h2&gt;
&lt;p&gt;Your post files should be placed in &lt;code&gt;src/content/posts/&lt;/code&gt; directory. You can also create sub-directories to better organize your posts and assets.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── post-1.md
└── post-2/
    ├── cover.png
    └── index.md
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Markdown Example</title><link>https://blog.alayedong.cn/posts/markdown/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/markdown/</guid><description>A simple example of a Markdown blog post.</description><pubDate>Sun, 01 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;An h1 header&lt;/h1&gt;
&lt;p&gt;Paragraphs are separated by a blank line.&lt;/p&gt;
&lt;p&gt;2nd paragraph. &lt;em&gt;Italic&lt;/em&gt;, &lt;strong&gt;bold&lt;/strong&gt;, and &lt;code&gt;monospace&lt;/code&gt;. Itemized lists
look like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;this one&lt;/li&gt;
&lt;li&gt;that one&lt;/li&gt;
&lt;li&gt;the other one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that --- not considering the asterisk --- the actual text
content starts at 4-columns in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Block quotes are
written like so.&lt;/p&gt;
&lt;p&gt;They can span multiple paragraphs,
if you like.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., &quot;it&apos;s all
in chapters 12--14&quot;). Three dots ... will be converted to an ellipsis.
Unicode is supported. ☺&lt;/p&gt;
&lt;h2&gt;An h2 header&lt;/h2&gt;
&lt;p&gt;Here&apos;s a numbered list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;first item&lt;/li&gt;
&lt;li&gt;second item&lt;/li&gt;
&lt;li&gt;third item&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note again how the actual text starts at 4 columns in (4 characters
from the left side). Here&apos;s a code sample:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Let me re-iterate ...
for i in 1 .. 10 { do-something(i) }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you probably guessed, indented 4 spaces. By the way, instead of
indenting the block, you can use delimited blocks, if you like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define foobar() {
    print &quot;Welcome to flavor country!&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(which makes copying &amp;amp; pasting easier). You can optionally mark the
delimited block for Pandoc to syntax highlight it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import time
# Quick, count to ten!
for i in range(10):
    # (but not *too* quick)
    time.sleep(0.5)
    print i
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;An h3 header&lt;/h3&gt;
&lt;p&gt;Now a nested list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First, get these ingredients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;carrots&lt;/li&gt;
&lt;li&gt;celery&lt;/li&gt;
&lt;li&gt;lentils&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Boil some water.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dump everything in the pot and follow
this algorithm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; find wooden spoon
 uncover pot
 stir
 cover pot
 balance wooden spoon precariously on pot handle
 wait 10 minutes
 goto first step (or shut off burner when done)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do not bump wooden spoon or it will fall.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notice again how text always lines up on 4-space indents (including
that last line which continues item 3 above).&lt;/p&gt;
&lt;p&gt;Here&apos;s a link to &lt;a href=&quot;http://foo.bar&quot;&gt;a website&lt;/a&gt;, to a &lt;a href=&quot;local-doc.html&quot;&gt;local
doc&lt;/a&gt;, and to a &lt;a href=&quot;#an-h2-header&quot;&gt;section heading in the current
doc&lt;/a&gt;. Here&apos;s a footnote [^1].&lt;/p&gt;
&lt;p&gt;[^1]: Footnote text goes here.&lt;/p&gt;
&lt;p&gt;Tables can look like this:&lt;/p&gt;
&lt;p&gt;size material color&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;9 leather brown
10 hemp canvas natural
11 glass transparent&lt;/p&gt;
&lt;p&gt;Table: Shoes, their sizes, and what they&apos;re made of&lt;/p&gt;
&lt;p&gt;(The above is the caption for the table.) Pandoc also supports
multi-line tables:&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;keyword text&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;red Sunsets, apples, and
other red or reddish
things.&lt;/p&gt;
&lt;p&gt;green Leaves, grass, frogs
and other things it&apos;s
not easy being.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A horizontal rule follows.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here&apos;s a definition list:&lt;/p&gt;
&lt;p&gt;apples
: Good for making applesauce.
oranges
: Citrus!
tomatoes
: There&apos;s no &quot;e&quot; in tomatoe.&lt;/p&gt;
&lt;p&gt;Again, text is indented 4 spaces. (Put a blank line between each
term/definition pair to spread things out more.)&lt;/p&gt;
&lt;p&gt;Here&apos;s a &quot;line block&quot;:&lt;/p&gt;
&lt;p&gt;| Line one
| Line too
| Line tree&lt;/p&gt;
&lt;p&gt;and images can be specified like so:&lt;/p&gt;
&lt;p&gt;Inline math equations go in like so: $\omega = d\phi / dt$. Display
math should get its own line and be put in in double-dollarsigns:&lt;/p&gt;
&lt;p&gt;$$I = \int \rho R^{2} dV$$&lt;/p&gt;
&lt;p&gt;$$
\begin{equation*}
\pi
=3.1415926535
;8979323846;2643383279;5028841971;6939937510;5820974944
;5923078164;0628620899;8628034825;3421170679;\ldots
\end{equation*}
$$&lt;/p&gt;
&lt;p&gt;And note that you can backslash-escape any punctuation characters
which you wish to be displayed literally, ex.: `foo`, *bar*, etc.&lt;/p&gt;
</content:encoded></item><item><title>Include Video in the Posts</title><link>https://blog.alayedong.cn/posts/video/</link><guid isPermaLink="true">https://blog.alayedong.cn/posts/video/</guid><description>This post demonstrates how to include embedded video in a blog post.</description><pubDate>Tue, 01 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Just copy the embed code from YouTube or other platforms, and paste it in the markdown file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: Include Video in the Post
published: 2023-10-19
// ...
---

&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;YouTube&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h2&gt;Bilibili&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;//player.bilibili.com/player.html?bvid=BV1fK4y1s7Qf&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt; &amp;lt;/iframe&amp;gt;&lt;/p&gt;
</content:encoded></item></channel></rss>