<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Ndartsy.site Blog</title><description>Stay hungry, stay foolish</description><link>https://astro-pure.js.org</link><item><title>[Guide]-X86主机实现多架构镜像构建以及运行</title><link>https://astro-pure.js.org/blog/202604/docker-x86-arm</link><guid isPermaLink="true">https://astro-pure.js.org/blog/202604/docker-x86-arm</guid><description>X86主机实现多架构镜像构建以及运行</description><pubDate>Thu, 30 Apr 2026 22:13:00 GMT</pubDate><content:encoded>&lt;h1&gt;1、需求背景&lt;/h1&gt;
&lt;p&gt;在平时工作中，时常会碰到多架构镜像，或者是需要根据AMD的镜像重新构建一个ARM架构的镜像。但是目前ARM的主机常常是在内网环境，在处理构建和本地测试时不能及时处理，需要等待资源。&lt;/p&gt;
&lt;p&gt;所以根据以上问题，本文记录在自己电脑X86机器上如何实现以下两种需求&lt;/p&gt;
&lt;p&gt;1、在X86机器上构建ARM架构镜像；&lt;/p&gt;
&lt;p&gt;2、在X86机器上运行ARM架构镜像；&lt;/p&gt;
&lt;p&gt;主要问题在于指令集兼容性问题，所以需要引入QEMU用户态仿真和Docker Buildx(BuildKit引擎)&lt;/p&gt;
&lt;h1&gt;2、准备工作&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;基础环境&lt;br&gt;
-- 操作系统: RockyLinux&lt;br&gt;
-- 内核版本: 6.12.0-55.12.1.el10_0.x86_64&lt;br&gt;
-- Docker: 28.1.0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;2.1、启用QEMU仿真支持&lt;/h2&gt;
&lt;p&gt;(1)、需要安装并注册QEMU的用户态二进制文件到内核中，最简单的方法是运行一个特殊的Docker容器来完成注册&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# 运行此容器会自动在内核中注册各种架构的解释器
[root@localhost ~]# docker run --privileged --rm tonistiigi/binfmt --install all
Unable to find image &apos;tonistiigi/binfmt:latest&apos; locally
latest: Pulling from tonistiigi/binfmt
4b3e935ac1b8: Pull complete
cba9db6f3ddf: Pull complete
Digest: sha256:d3b963f787999e6c0219a48dba02978769286ff61a5f4d26245cb6a6e5567ea3
Status: Downloaded newer image for tonistiigi/binfmt:latest
installing: s390x OK
installing: ppc64le OK
installing: arm64 OK
installing: arm OK
installing: riscv64 OK
installing: mips64le OK
installing: mips64 OK
installing: loong64 OK
{
  &quot;supported&quot;: [
    &quot;linux/amd64&quot;,
    &quot;linux/amd64/v2&quot;,
    &quot;linux/amd64/v3&quot;,
    &quot;linux/amd64/v4&quot;,
    &quot;linux/arm64&quot;,
    &quot;linux/riscv64&quot;,
    &quot;linux/ppc64le&quot;,
    &quot;linux/s390x&quot;,
    &quot;linux/386&quot;,
    &quot;linux/mips64le&quot;,
    &quot;linux/mips64&quot;,
    &quot;linux/loong64&quot;,
    &quot;linux/arm/v7&quot;,
    &quot;linux/arm/v6&quot;
  ],
  &quot;emulators&quot;: [
    &quot;qemu-aarch64&quot;,
    &quot;qemu-arm&quot;,
    &quot;qemu-loongarch64&quot;,
    &quot;qemu-mips64&quot;,
    &quot;qemu-mips64el&quot;,
    &quot;qemu-ppc64le&quot;,
    &quot;qemu-riscv64&quot;,
    &quot;qemu-s390x&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(2)、检验方式，查看&lt;code&gt;/proc/sys/fs/binfmt_misc/&lt;/code&gt;是否有&lt;code&gt;qemu-aarch64&lt;/code&gt;文件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;[root@localhost ~]# ls /proc/sys/fs/binfmt_misc/
qemu-aarch64  qemu-arm  qemu-loongarch64  qemu-mips64  qemu-mips64el  qemu-ppc64le  qemu-riscv64  qemu-s390x  register  status
[root@localhost ~]# cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled
interpreter /usr/bin/qemu-aarch64
flags: POCF
offset 0
magic 7f454c460201010000000000000000000200b700
mask ffffffffffffff00fffffffffffffffffeffffff
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.2、启用Docker Buildx&lt;/h2&gt;
&lt;p&gt;buildx是Docker的一个插件，支持构建多架构镜像，但是默认没有安装(新版Docker中是一个独立的二进制文件)。&lt;/p&gt;
&lt;h3&gt;2.2.1、安装Docker Buildx插件&lt;/h3&gt;
&lt;p&gt;(1)、通过DNF/YUM安装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;dnf install docker-buildx-plugin -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(2)、手动安装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# 创建插件目录
mkdir -p ~/.docker/cli-plugins/

# 下载最新版 (以v0.33.0为例，请根据实际情况调整)
curl -SL https://github.com/docker/buildx/releases/download/v0.33.0/buildx-v0.33.0.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx

# 赋予执行权限
chmod +x ~/.docker/cli-plugins/docker-buildx

# 验证
docker buildx version
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2.2、创建并启动多架构构建器(Builder)&lt;/h3&gt;
&lt;p&gt;一般Docker使用默认构建器，只支持宿主机架构，但是可以通过创建一个BuildKit容器作为构建驱动&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;docker buildx create --name multiarch --use --platform linux/amd64,linux/arm64
# 或 docker buildx create --name multiarch --driver docker-container --use

# 启动并初始化该构建器
docker buildx inspect --bootstrap
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;docker buildx create: 创建实例&lt;br&gt;
--name multiarch: 命名为multiarch&lt;br&gt;
--use: 立即切换新的构建器&lt;br&gt;
--platform linux/amd64,linux/arm64: 指定该构建器可以支持哪些目标平台&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但是在本文中，因为一开始创建了QEMU仿真支持，当前默认的default构建器已经支持多架构构建&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;[root@localhost ~]# docker buildx ls
NAME/NODE     DRIVER/ENDPOINT   STATUS    BUILDKIT   PLATFORMS
default*      docker
 \_ default    \_ default       running   v0.21.0    linux/amd64 (+4), linux/arm64, linux/arm (+2), linux/ppc64le, (6 more)

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#添加代理方式，docker buildx插件和docker的代理不通用，如果需要拉取docker hub的镜像，需要添加为你自己的代理端口
docker buildx create --name image_buildx --driver-opt env.http_proxy=127.0.0.1:7890 --driver-opt env.https_proxy=127.0.0.1:7890 --use
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;3、场景验证&lt;/h1&gt;
&lt;h2&gt;3.1、场景一：在x86上Build ARM镜像&lt;/h2&gt;
&lt;p&gt;利用&lt;code&gt;docker buildx&lt;/code&gt;，可以直接构建并推送ARM镜像，或者将其保存到本地&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# 构建 arm64 镜像并直接推送到仓库
docker buildx build --platform linux/arm64 -t your-repo/your-app:latest --push .

# 或者构建并导出到本地 docker images (注意：--load 不支持多架构同时导出，只能单选)
docker buildx build --platform linux/arm64 -t your-app:arm64 --load .
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.2、场景二：在x86上Run ARM镜像&lt;/h2&gt;
&lt;p&gt;只要完成了上述&lt;strong&gt;QEMU 注册&lt;/strong&gt;，运行ARM镜像对此来说与运行原生镜像几乎没有区别。Docker会自动识别镜像架构并调用&lt;code&gt;qemu-aarch64&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;docker run --rm --platform linux/arm64 arm64v8/alpine uname -m
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;4、 常见问题&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;性能损耗&lt;/strong&gt;：由于是指令集模拟，跨架构运行镜像的速度会比原生慢2~10倍，不建议用于生产环境的高负载任务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建失败&lt;/strong&gt;：若构建过程中报错&lt;code&gt;exec format error&lt;/code&gt;，通常是因为&lt;code&gt;binfmt&lt;/code&gt;未正确注册或在重启后失效，需重新运行&lt;code&gt;tonistiigi/binfmt&lt;/code&gt;容器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多架构镜像查看&lt;/strong&gt;：可以使用&lt;code&gt;docker manifest inspect &amp;#x3C;image_name&gt;&lt;/code&gt;查看远程镜像包含的所有架构信息。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>[Falut]-容器使用NFS导致节点故障</title><link>https://astro-pure.js.org/blog/202604/k8s-fault-nfs-bug</link><guid isPermaLink="true">https://astro-pure.js.org/blog/202604/k8s-fault-nfs-bug</guid><description>容器使用NFS导致节点故障</description><pubDate>Sat, 25 Apr 2026 22:03:00 GMT</pubDate><content:encoded>&lt;h1&gt;容器使用NFS作为存储导致节点故障问题记录&lt;/h1&gt;
&lt;h2&gt;1、基本信息&lt;/h2&gt;
&lt;p&gt;| 项目     | 内容                     |
| -------- | ------------------------ |
| 环境     | 生产环境             |
| 影响服务 | OA系统ekpfront服务       |
| 影响范围 | worker-s007节点上部分Pod |
| 事件级别 | P3S2                     |
| 事件状态 | 已处理                   |
| 发生事件 | 2026/01/04               |
| 发现时间 | 2026/01/08               |
| 恢复时间 | 2026/01/09               |&lt;/p&gt;
&lt;h2&gt;2、现象描述&lt;/h2&gt;
&lt;p&gt;(1)、OA系统业务反馈他们一个服务(ekpfront-3)在定时任务执行重启之后无法正常启动，其在Web端手动删除该Pod无反应;
(2)、当时从命令行&lt;code&gt;kubectl get pods -n oa&lt;/code&gt;查看ekpfront-3的状态处于Terminating，并且时间为4天前(即2026/01/04);&lt;/p&gt;
&lt;p&gt;(3)、在所在节点上通过&lt;code&gt;crictl ps | grep ekp&lt;/code&gt;查看containerd依然处于Running状态；
(4)、尝试在闭市后通过&lt;code&gt;kubectl delete pod ekpfront-3 -n oa --force&lt;/code&gt;强制删除,可删除，但是依然调度本节点上，依然处于之前非正常状态。&lt;/p&gt;
&lt;h2&gt;3、排查过程&lt;/h2&gt;
&lt;h3&gt;3.1、初步判断&lt;/h3&gt;
&lt;p&gt;根据&lt;code&gt;kubectl describe pod ekpfront-3 -n oa&lt;/code&gt;查看&lt;code&gt;Sataus: Terminating(lasts 7h30m)&lt;/code&gt;就已经说明了&lt;code&gt;SatefulSet&lt;/code&gt;已经发送&lt;code&gt;Delete Pod&lt;/code&gt;的指令，并且&lt;code&gt;kubelet&lt;/code&gt;应该也发了&lt;code&gt;SIGTERM&lt;/code&gt;信号，但是当前查看&lt;code&gt;container&lt;/code&gt;依然是&lt;code&gt;Running&lt;/code&gt;状态，由此可以初步判断问题是在&lt;code&gt;Pod&lt;/code&gt;内部有什么资源没有释放。&lt;/p&gt;
&lt;h3&gt;3.2、进一步排查&lt;/h3&gt;
&lt;p&gt;(1)、通过查看&lt;code&gt;journalctl -u kubelet | grep ekpfront&lt;/code&gt;日志&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Jan 08 09:22:38 worker-s007 kubelet[14972]: E0108 09:22:38.031080 14972 kubelet.go:1964] [failed to &quot;KillContainer&quot; for &quot;ekpfront&quot; with KillContainerError: &quot;rpc error: code = DeadlineExceeded desc = context deadline exceeded&quot;, failed to &quot;KillPodSandbox&quot; for &quot;89caf9fb-a7fc-4da2-9f87-1692b4543f7c&quot; with KillPodSandboxError: &quot;rpc error: code = DeadlineExceeded desc = context deadline exceeded&quot;] 
Jan 08 09:22:38 worker-s007 kubelet[14972]: E0108 09:22:38.031119 14972 pod_workers.go:1294] &quot;Error syncing pod, skipping&quot; err=&quot;[failed to \&quot;KillContainer\&quot; for \&quot;ekpfront\&quot; with KillContainerError: \&quot;rpc error: code = DeadlineExceeded desc = context deadline exceeded\&quot;, failed to \&quot;KillPodSandbox\&quot; for \&quot;89caf9fb-a7fc-4da2-9f87-1692b4543f7c\&quot; with KillPodSandboxError: \&quot;rpc error: code = DeadlineExceeded desc = context deadline exceeded\&quot;]&quot; pod=&quot;oa/ekpfront-3&quot; podUID=89caf9fb-a7fc-4da2-9f87-1692b4543f7c 
Jan 08 09:25:08 worker-s007 kubelet[14972]: E0108 09:25:08.058531 14972 kuberuntime_container.go:747] &quot;Container termination failed with gracePeriod&quot; err=&quot;rpc error: code = DeadlineExceeded desc = context deadline exceeded&quot; pod=&quot;oa/ekpfront-3&quot; podUID=89caf9fb-a7fc-4da2-9f87-1692b4543f7c containerName=&quot;ekpfront&quot; containerID=&quot;containerd://14c5b29b3bea669da9a3c5aec2928c54dc9ba449d2127870b62b825f1ba86224&quot; gracePeriod=30 
Jan 08 09:25:08 worker-s007 kubelet[14972]: E0108 09:25:08.058556 14972 kuberuntime_container.go:772] &quot;Kill container failed&quot; err=&quot;rpc error: code = DeadlineExceeded desc = context deadline exceeded&quot; pod=&quot;oa/ekpfront-3&quot; podUID=89caf9fb-a7fc-4da2-9f87-1692b4543f7c containerName=&quot;ekpfront&quot; containerID={Type:containerd ID:14c5b29b3bea669da9a3c5aec2928c54dc9ba449d2127870b62b825f1ba86224}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到&lt;code&gt;kubectl&lt;/code&gt;在不停的重试&lt;code&gt;KillContainer&lt;/code&gt;，但是并没有成功。&lt;/p&gt;
&lt;p&gt;(2)、通过在节点查看容器进程信息&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;[root@worker-s007 /]# crictl inspect 14c5b29b3bea6 | grep -i pid 
   &quot;pid&quot;: 51990, 
   		&quot;pid&quot;: 1 
   		&quot;type&quot;: &quot;pid&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是通过&lt;code&gt;nsenter -t 51990 -p -m -u -n -i -- ps -ef&lt;/code&gt;发现已经无法进入进程空间了&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nsenter: cannot open /proc/51990/ns/ipc: No such file or directory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再通过以下命令确认了进程状态&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;[root@worker-s007 /]# ps -o pid,stat,wchan,cmd -p 51990 
PID STAT WCHAN CMD 
51990 Ss do_wai [startekp.sh]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过这个进程状态(&lt;code&gt;do_wait&lt;/code&gt;)可以看到在&lt;code&gt;startekp.sh&lt;/code&gt;等待子进程结束。通过&lt;code&gt;crictl stop&lt;/code&gt;和&lt;code&gt;critctl rm&lt;/code&gt;发现也无法直接删除container。&lt;/p&gt;
&lt;p&gt;(3)、现在基本可以从容器层次转移到节点系统层次上了。并且通过&lt;code&gt;top&lt;/code&gt;查看当前节点负载很高，但是cpu利用率比较低。符合I/O阻塞的典型特征。&lt;/p&gt;
&lt;p&gt;(4)、目前已经无法通过&lt;code&gt;df -Th&lt;/code&gt;查看相关信息，只能通过&lt;code&gt;df -lh&lt;/code&gt;只查看本机文件系统正常。查看NFS挂载信息&lt;code&gt;cat /proc/self/mounts | grep nfs&lt;/code&gt;可以看到九个挂载的NFS，通过&lt;code&gt;stat&lt;/code&gt;检测发现有三个NFS超时卡死。&lt;/p&gt;
&lt;h3&gt;3.3、根因分析&lt;/h3&gt;
&lt;p&gt;根据以上排查过程，基本可以推断是因为NFS挂载stat卡住，造成&lt;code&gt;kubectl delete pod ekpfront-3 -n oa&lt;/code&gt;无法正常删除。&lt;/p&gt;
&lt;p&gt;同因导致节点负载持续增长。&lt;/p&gt;
&lt;h2&gt;4、处理方式&lt;/h2&gt;
&lt;h3&gt;4.1、临时处理&lt;/h3&gt;
&lt;p&gt;(1)、因为&lt;code&gt;worker-s007&lt;/code&gt;节点上容器除&lt;code&gt;ekpfront-3&lt;/code&gt;外没有发生重启，所以目前受到影响的之后oa系统。为避免扩大影响，将该节点设置为不可调度，并将&lt;code&gt;ekpfront-3&lt;/code&gt;强制删除，将其调度到其他节点上。&lt;/p&gt;
&lt;h3&gt;4.2、修复方式&lt;/h3&gt;
&lt;p&gt;若在虚拟机环境中遇到NFS挂载卡顿问题，可尝试执行&lt;code&gt;umount&lt;/code&gt;命令解除挂载状态。但鉴于容器与虚拟机的运行机制存在本质差异，且从集群维护角度考量，节点上驱逐容器的操作成本相对可控。因此选择择机通过以下命令组合完成故障修复：首先执行&lt;code&gt;kubectl drain worker-s007 --force --ignore-daemonsets --delete-emptydir-data&lt;/code&gt;强制迁移该节点上的所有Pod，随后对该节点实施重启操作以恢复服务能力。。&lt;/p&gt;
&lt;p&gt;重启节点后状态恢复健康，恢复调度重新参与集群调度。&lt;/p&gt;
&lt;h2&gt;5、改进措施&lt;/h2&gt;
&lt;p&gt;(1)、为避免出现类似问题建议业务&lt;code&gt;pod&lt;/code&gt;中修正&lt;code&gt;PID 1&lt;/code&gt;为&lt;code&gt;Java&lt;/code&gt;进程;
(2)、建议增加&lt;code&gt;preStop&lt;/code&gt;钩子优雅退出；
(3)、集群节点负载较高，发出的告警未接收到。需要优化&lt;/p&gt;
&lt;h1&gt;【20260423补充】&lt;/h1&gt;
&lt;p&gt;今日在测试环境碰到同样的问题，通过挨个节点查看&lt;code&gt;uptime&lt;/code&gt;系统负载，发现有四个节点出现高负载问题，其中一个节点出现了10000多的负载。&lt;/p&gt;
&lt;p&gt;1、按照之前的经验进行排查，发现&lt;code&gt;df -lh&lt;/code&gt;正常,&lt;code&gt;df -Th&lt;/code&gt;会卡死，这么基本确定问题又出在NFS上了。&lt;/p&gt;
&lt;p&gt;2、通过&lt;code&gt;mount | grep nfs&lt;/code&gt;(得亏还能使)查看挂载信息，并通过&lt;code&gt;stat /data/var/lib/kubelet/pods/5006c03b-649b-45b4-8652-32a1585a61de/volumes/kubernetes.io~csi/pvc-8c5a8ec7-3a4b-4376-841c-372a4e889cfc/mount&lt;/code&gt;对各挂载点进行尝试查询，以及通过&lt;code&gt;timeout 3 showmount -e &amp;#x3C;NFS_SERVER&gt;&lt;/code&gt;查看是否可正常通信。经过排查发现&lt;code&gt;showmount&lt;/code&gt;其中一个NFS Server的时候报错。&lt;/p&gt;
&lt;p&gt;3、和改NFS Server负责人以及NFS管理员确认，改NFS已经停止服务，但是从Kubernetes集群上查看使用该NFS的Pod还在运行，并且因为挂载模式为&lt;code&gt;hard&lt;/code&gt;，所以会卡死。&lt;/p&gt;
&lt;p&gt;4、因为相关Pod负责人反馈已经下线，所以通过把所有使用该NFS的Pod进行强制删除&lt;code&gt;kubectl delete pod &amp;#x3C;pod-name&gt; -n one --force --grace-period=0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;5、强删pod之后，到对应节点上挨个把相关挂载卸载&lt;code&gt;umount -lf /data/var/lib/kubelet/pods/5006c03b-649b-45b4-8652-32a1585a61de/volumes/kubernetes.io~csi/pvc-8c5a8ec7-3a4b-4376-841c-372a4e889cfc/mount&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;6、基本可以恢复正常，可以通过&lt;code&gt;ps -eo state,pid,cmd | grep &quot;^D&quot;&lt;/code&gt;查看&lt;code&gt;umount&lt;/code&gt;前后区别。&lt;/p&gt;
&lt;p&gt;这次故障和之前生产的问题有一个区别，在于如何恢复，因为本次是使用NFS的Pod皆可以删除，所以&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Hexo+Butterfly部署静态博客</title><link>https://astro-pure.js.org/blog/blog-test</link><guid isPermaLink="true">https://astro-pure.js.org/blog/blog-test</guid><description>Hexo+Butterfly部署静态博客</description><pubDate>Sun, 18 Jan 2026 22:03:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;此处使用了CentOS环境，但是也会补充Ubuntu上的操作(但未经过实践)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Hexo&lt;/h1&gt;
&lt;p&gt;Hexo是一个快速、简洁且高效的博客框架，Hexo使用Markdown解析文章，可以实现实时渲染的效果。
Hexo是使用Node.js(npm)安装的，所以我们首先需要先安装以下程序：
-- Node.js（不低于10.13，建议安装12.0以上版本）&lt;/p&gt;
&lt;h2&gt;安装Node.js&lt;/h2&gt;
&lt;p&gt;CentOS&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;yum -y install nodejs
yum -y install npm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ubuntu&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;apt-get update
apt-get install -y nodejs
apt-get install -y npm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在安装&lt;code&gt;Node.js&lt;/code&gt;之后我们将其默认的官方源，换成国内淘宝源，这样可以使我们在之后安装时速度更快&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;npm config set registry=http://registry.npm.taobao.org/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装Hexo&lt;/h2&gt;
&lt;p&gt;使用以下命令进行安装Hexo&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;npm install -g hexo-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;到此，我们只是安装了，但是还没有创建网站相关的目录，所以需要先创建一个工作目录(我是直接在/root下创建)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# cd /root
hexo init blog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;blog可以换成自己喜欢的文件名称，然后进入这个目录内，执行以下命令，进行安装相关的模块&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;到此为止，基本已经完成，我们通过以下命令运行hexo，然后通过ip+4000端口(默认配置)来访问&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;hexo server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307191429519.png&quot; alt=&quot;image-20230719142907446&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307191429895.png&quot; alt=&quot;image-20230719142935674&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;补充&lt;/strong&gt;：Hexo中常用的命令还有以下&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# 清除缓存文件(在每次修改之后运行之前建议执行一次，避免不必要的问题)
hexo clean

# 生成文件
hexo generate -&gt; hexo g

# 运行
hexo server -&gt; hexo s

# 其余可以通过hexo help进行查看
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;创建文章&lt;/h2&gt;
&lt;p&gt;我们在此创建三个测试文章(并在文章中随意填入内容)，用于后面主题修改时使用，首先我们先来学习一下hexo创建文章的命令&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;hexo new &quot;first-file&quot;
hexo new &quot;second-file&quot;
hexo new &quot;third-file&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;布局 - Layout&lt;/h3&gt;
&lt;h4&gt;post&lt;/h4&gt;
&lt;p&gt;hexo默认为post，即文章，使用方式为&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;hexo new &amp;#x3C;article name&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;新建的文章会存放到&lt;code&gt;source/_posts&lt;/code&gt;目录下&lt;/p&gt;
&lt;p&gt;|       写法       | 说明                                                         |
| :--------------: | :----------------------------------------------------------- |
|      title       | 【必需】文章标题                                             |
|       date       | 【必需】文章创建日期                                         |
|     updated      | 【可选】文章更新日期                                         |
|       tags       | 【可选】文章标籤                                             |
|    categories    | 【可选】文章分类                                             |
|     keywords     | 【可选】文章关键字                                           |
|   description    | 【可选】文章描述                                             |
|     top_img      | 【可选】文章顶部图片                                         |
|      cover       | 【可选】文章缩略图(如果没有设置top_img,文章页顶部将显示缩略图，可设为false/图片地址/留空) |
|     comments     | 【可选】显示文章评论模块(默认 true)                          |
|       toc        | 【可选】显示文章TOC(默认为设置中toc的enable配置)             |
|    toc_number    | 【可选】显示toc_number(默认为设置中toc的number配置)          |
|    auto_open     | 【可选】是否自动打开TOC(默认为设置中toc的auto_open配置)      |
|    copyright     | 【可选】显示文章版权模块(默认为设置中post_copyright的enable配置) |
|     mathjax      | 【可选】显示mathjax(当设置mathjax的per_page: false时，才需要配置，默认 false) |
|      katex       | 【可选】显示katex(当设置katex的per_page: false时，才需要配置，默认 false) |
|     aplayer      | 【可选】在需要的页面加载aplayer的js和css,请参考文章下面的音乐 配置 |
| highlight_shrink | 【可选】配置代码框是否展开(true/false)(默认为设置中highlight_shrink的配置) |&lt;/p&gt;
&lt;h4&gt;page&lt;/h4&gt;
&lt;p&gt;hexo可以创建一个页面，比如后面我们需要创建分类页、标签页等&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;hexo new page &amp;#x3C;page name&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;新建的页面会存放在&lt;code&gt;source&lt;/code&gt;下&lt;/p&gt;
&lt;h4&gt;draft&lt;/h4&gt;
&lt;p&gt;hexo通过draft来创建一个草稿&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;hexo new draft &amp;#x3C;draft name&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过&lt;code&gt;draft&lt;/code&gt;来创建的草稿文章，并不会真正发送到页面，而是可以通过&lt;code&gt;hexo s --draft&lt;/code&gt;来进行查看，如果需要发表出来，则使用&lt;code&gt;hexo p &amp;#x3C;filename&gt;&lt;/code&gt;,&lt;code&gt;&amp;#x3C;filename&gt;&lt;/code&gt;为不包含&lt;code&gt;md&lt;/code&gt;后缀的文章名称。&lt;/p&gt;
&lt;p&gt;也可以手动将文件在&lt;code&gt;source/_post&lt;/code&gt;和&lt;code&gt;source/_draft&lt;/code&gt;中间移动。&lt;/p&gt;
&lt;h1&gt;Butterfly&lt;/h1&gt;
&lt;p&gt;我们进入Hexo项目根目录(即&lt;code&gt;/root/blog&lt;/code&gt;)，通过git下载Butterfly主题&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# 进入Hexo根目录
cd /root/blog

# 下载Butterfly主题
git clone https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterflygit clone https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterflygit clone https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterflygit clone https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;除了这个主题之外，我们还需要安装&lt;code&gt;pug&lt;/code&gt;和&lt;code&gt;stylus&lt;/code&gt;的渲染器，不然会在运行项目时报错&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;npm install hexo-renderer-pug hexo-renderer-stylus --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改项目根目录下的&lt;code&gt;_config.yml&lt;/code&gt;文件(站点配置文件)，开启主题
&lt;code&gt;/root/blog/_config.yml&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# Extensions
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
theme: butterfly

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了后续修改方便，我们将主题文件中的&lt;code&gt;_config.yml&lt;/code&gt;复制一份到&lt;code&gt;/root/blog&lt;/code&gt;，并重新命名为&lt;code&gt;_config.butterfly.yml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Hexo会自动合并&lt;code&gt;_config.yml&lt;/code&gt;和&lt;code&gt;_config.butterfly.yml&lt;/code&gt;中相同的配置信息，如果有重复的，会使用后者的配置&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cp -a /root/blog/themes/butterfly/_config.yml /root/blog/_config.butterfly.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来我们运行Hexo就可以看到Butterfly生成的主题了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307191504517.png&quot; alt=&quot;image-20230719150454376&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;基础设置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;以下配置修改或添加后如果未生效，请将Hexo进行重启查看&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;标题&lt;/h3&gt;
&lt;p&gt;文件：/root/blog/_config.yml&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# Site模块
- title: Hexo
+ title: XuY
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307191647822.png&quot; alt=&quot;image-20230719164719687&quot;&gt;&lt;/p&gt;
&lt;h3&gt;副标题&lt;/h3&gt;
&lt;p&gt;文件：/root/blog/_config.butterfly.yml&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;# subtitle模块
subtitle:
  enable: true
  # Typewriter Effect (打字效果)
  effect: true
  # Customize typed.js (配置typed.js)
  # https://github.com/mattboldt/typed.js/#customization
  typed_option:
  # source 調用第三方服務
  # source: false 關閉調用
  # source: 1  調用一言網的一句話（簡體） https://hitokoto.cn/
  # source: 2  調用一句網（簡體） https://yijuzhan.com/
  # source: 3  調用今日詩詞（簡體） https://www.jinrishici.com/
  # subtitle 會先顯示 source , 再顯示 sub 的內容
  source: false
  # 如果關閉打字效果，subtitle 只會顯示 sub 的第一行文字
  sub:
  	- 今日事今日毕
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;需要注意的是&lt;/p&gt;
&lt;p&gt;如果有英文逗号&apos;,&apos;,使用转义字元&lt;code&gt;&amp;#x26;#44&lt;/code&gt;;
如果有英文双引号&apos;&quot;&apos;,使用转义字元&lt;code&gt;&amp;#x26;quot&lt;/code&gt;;
开头不允许转义字元，如需要，请把整个句子用双引号包住;
如果关闭打字效果，subtitle只会显示sub的第一行文字&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307201001716.png&quot; alt=&quot;image-20230720100110413&quot;&gt;&lt;/p&gt;
&lt;h4&gt;副标题字体大小颜色&lt;/h4&gt;
&lt;p&gt;文件：/root/blog/themes/butterfly/source/css/_layout/head.styl&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;  #site-subtitle
    color: var(--light-grey)
    font-size: 1.15em

    +minWidth768()
      font-size: 1.72em
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;语言&lt;/h3&gt;
&lt;p&gt;文件：/root/blog/_config.yml&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# Site模块
- language: en
+ language: zh-CN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307191517420.png&quot; alt=&quot;image-20230719151739297&quot;&gt;&lt;/p&gt;
&lt;h3&gt;作者&lt;/h3&gt;
&lt;p&gt;文件：/root/blog/_config.yml&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# Site模块
- author: John Doe
+ author: XuY
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307191647301.png&quot; alt=&quot;image-20230719164745203&quot;&gt;&lt;/p&gt;
&lt;h3&gt;导航栏&lt;/h3&gt;
&lt;p&gt;文件：/root/blog/_config.butterfly.yml&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# Menu模块
# 默认是注释的，需要打开注释并，将&apos;:&apos;前的应为修改为中文
- menu:
-   # Home: / || fas fa-home
-   # Archives: /archives/ || fas fa-archive
-   # Tags: /tags/ || fas fa-tags
-   # Categories: /categories/ || fas fa-folder-open
-   # List||fas fa-list:
-   #   Music: /music/ || fas fa-music
-   #   Movie: /movies/ || fas fa-video
-   # Link: /link/ || fas fa-link
-   # About: /about/ || fas fa-heart
---------------
+ menu:
+    首页: / || fas fa-home
+    归档: /archives/ || fas fa-archive
+    标签: /tags/ || fas fa-tags
+    分类: /categories/ || fas fa-folder-open
+    列表||fas fa-list:
+      音乐: /music/ || fas fa-music
+      电影: /movies/ || fas fa-video
+    链接: /link/ || fas fa-link
+    关于: /about/ || fas fa-heart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307191525227.png&quot; alt=&quot;image-20230719152548145&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;导航子页面&lt;/h2&gt;
&lt;h3&gt;标签&lt;/h3&gt;
&lt;p&gt;使用hexo命令创建标签页面&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;hexo new page tags	
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建之后修改标签&lt;code&gt;md&lt;/code&gt;中文件类型&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/tags/index.md&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: 标签
date: 2023-07-20 09:09:06
type: tags # 增加类型(注释需删除
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改之后，可以在之后的文章中增加&lt;code&gt;tags&lt;/code&gt;标签&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/_posts/first-file.md&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: first-file
date: 2023-07-19 15:40:05
tags:
    - first
    - file
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307200929524.png&quot; alt=&quot;image-20230720092910345&quot;&gt;&lt;/p&gt;
&lt;h3&gt;分类&lt;/h3&gt;
&lt;p&gt;使用hexo命令创建分类页面&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;hexo new page categories	
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建之后修改分类&lt;code&gt;md&lt;/code&gt;中文件类型&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/tags/index.md&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: 分类
date: 2023-07-20 09:16:13
type: categories
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改之后，可以在之后的文章中增加&lt;code&gt;categories&lt;/code&gt;标签&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/_posts/first-file.md&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: first-file
date: 2023-07-19 15:40:05
tags:
    - first
    - file
categories:
    - first-categories
    - file-categories
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307200929085.png&quot; alt=&quot;image-20230720092927937&quot;&gt;&lt;/p&gt;
&lt;h3&gt;链接&lt;/h3&gt;
&lt;p&gt;使用hexo命令创建链接页面，链接页面一般用于友链&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;hexo new page link
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建之后修改链接&lt;code&gt;md&lt;/code&gt;中文件类型&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/link/index.md&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: 链接
date: 2023-07-20 09:20:41
type: link
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建友链内容页之后，如果在里面添加内容呢？，我们需要新建一个目录，并在里面新建一个链接页，然后添加内容，如下所示&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/_data/link.yml&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# 创建_data目录
mkdir /root/blog/source/_data

# 创建友链内容页
vim /root/blog/source/_data/link.yml

# 添加内容，这里只是一个dome
class:
  class_name: 友情链接
  link_list:
    1:
      name: 姓名
      link: 链接
      avatar: 图片
      descr: 签名
    2:
      name: 姓名
      link: 链接
      avatar: 图片
      descr: 签名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307200929118.png&quot; alt=&quot;image-20230720092941000&quot;&gt;&lt;/p&gt;
&lt;h3&gt;列表&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;h3&gt;关于&lt;/h3&gt;
&lt;p&gt;使用hexo命令创建关于页面&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;hexo new page about	
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建之后修改关于&lt;code&gt;md&lt;/code&gt;中文件类型&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/about/index.md&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: 关于
date: 2023-07-20 09:32:25
type: myself
---
This is a Dome website built using Hexo+Butterfly
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307200943580.png&quot; alt=&quot;image-20230720094305465&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;图像类&lt;/h2&gt;
&lt;h3&gt;网站图标&lt;/h3&gt;
&lt;p&gt;文件：/root/blog/_config.butterfly.yml
图片：/root/blog/themes/butterfly/source/img/website.png
（图片自己找，图片名称随意，但是要和文件中保持一致）&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# Favicon模块
- favicon: /img/favicon.png
+ favicon: /img/website.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307191648319.png&quot; alt=&quot;image-20230719164807229&quot;&gt;&lt;/p&gt;
&lt;h3&gt;头像&lt;/h3&gt;
&lt;p&gt;文件：/root/blog/_config.butterfly.yml
图片：/root/blog/themes/butterfly/source/img/avatar.png&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;- avatar:
-   img: https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png
-   effect: false
+ avatar:
+   img: /img/avatar.png
+   effect: false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307191702546.png&quot; alt=&quot;image-20230719170219455&quot;&gt;&lt;/p&gt;
&lt;h3&gt;主页封面&lt;/h3&gt;
&lt;p&gt;文件：/root/blog/_config.butterfly.yml
图片：/root/blog/themes/butterfly/source/img/index.jpg&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;- index_img:
+ index_img: /img/index.jpg	
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307191712790.png&quot; alt=&quot;image-20230719171212256&quot;&gt;&lt;/p&gt;
&lt;h3&gt;顶部图&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;归档&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;文件：/root/blog/_config.butterfly.yml
图片：/root/blog/themes/butterfly/source/img/archives.jpg&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;archive_img: /img/archives.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其余则在自己的&lt;code&gt;index.md&lt;/code&gt;中配置&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;标签&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/tags/index.md
图片：/root/blog/themes/butterfly/source/img/tags.png&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: 标签
date: 2023-07-20 09:09:06
type: tags
top_img: /img/tags.png
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;分类&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/categories/index.md
图片：/root/blog/themes/butterfly/source/img/categories.jpg&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: 分类
date: 2023-07-20 09:16:13
type: categories
top_img: /img/categories.jpg
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;链接&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/link/index.md
图片：/root/blog/themes/butterfly/source/img/link.jpg&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: 链接
date: 2023-07-20 09:20:41
type: link
top_img: /img/link.jpg
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关于&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/about/index.md
图片：/root/blog/themes/butterfly/source/img/about.jpg&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: 关于
date: 2023-07-20 09:32:25
type: myself
top_img: /img/about.jpg
---
This is a Dome website built using Hexo+Butterfly

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;markdown&lt;/code&gt;文件中除了这几个页面，其余普通文章也可以通过&lt;code&gt;top_img&lt;/code&gt;来设置顶部图，如果没有的话，则使用&lt;code&gt;_config.butterfly.yml&lt;/code&gt;中的&lt;code&gt;default_top_img&lt;/code&gt;，而且在&lt;code&gt;_config.butterfly.yml&lt;/code&gt;中还有&lt;code&gt;archive_img&lt;/code&gt;、&lt;code&gt;tag_img&lt;/code&gt;、&lt;code&gt;tag_per_img&lt;/code&gt;、&lt;code&gt;category_img&lt;/code&gt;、&lt;code&gt;category_per_img&lt;/code&gt;，不过这几个选项，没用到，如果感兴趣，可以自行查询使用方式。&lt;/p&gt;
&lt;h3&gt;文章封面&lt;/h3&gt;
&lt;p&gt;文章封面有两种设置方式，一种是在&lt;code&gt;_config.butterfly.yml&lt;/code&gt;中设置，另一种则是在文章内的&lt;code&gt;front-matter&lt;/code&gt;中设置&lt;/p&gt;
&lt;p&gt;1、&lt;code&gt;_config.butterfly.yml&lt;/code&gt;中设置&lt;/p&gt;
&lt;p&gt;文件：/root/blog/_config.butterfly.yml&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;cover:
  # display the cover or not (是否顯示文章封面)
  index_enable: true
  aside_enable: true
  archives_enable: true
  # the position of cover in home page (封面顯示的位置)
  # left/right/both
  position: both
  # When cover is not set, the default cover is displayed (當沒有設置cover時，默認的封面顯示)
  default_cover:
  	# 在此处指定图片位置，可以设置多个，文章封面则使用以下图片进行随机分配
    # - https://i.loli.net/2020/05/01/gkihqEjXxJ5UZ1C.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2、在文章的&lt;code&gt;front-matter&lt;/code&gt;中设置&lt;/p&gt;
&lt;p&gt;文件：/root/blog/source/_posts/*.md&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: second-file
date: 2023-07-19 15:40:18
cover: /img/second-file.jpeg
tags:
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://only-picture.oss-cn-beijing.aliyuncs.com/images/202307201343332.png&quot; alt=&quot;image-20230720134325082&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;字体&lt;/h2&gt;
&lt;p&gt;文件：
-- /root/blog/source/css/font.css
-- /root/blog/_config.butterfly.yml&lt;/p&gt;
&lt;p&gt;字体：/root/blog/source/css/intelone.ttf&lt;/p&gt;
&lt;p&gt;在新增的css文件(/root/blog/source/css/font.css)中新增以下内容&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;@font-face {
  /* 为载入的字体取名字(随意) */
  font-family: &apos;IntelOne&apos;;	
  /* 字体文件地址(相对或者绝对路径都可以) */
  src: url(&apos;./intelone.ttf&apos;) format(&quot;truetype&quot;);
  /* 定义加粗样式(加粗多少) */
  font-weight: normal;
  /* 定义字体样式(斜体/非斜体) */
  font-style: normal;
  /* 定义显示样式 */
  font-display: block;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;_config.butterfly.yml&lt;/code&gt;中修改以下内容&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;font:
  # 全局字体大小
  global-font-size:
  # 代码快字体大小(默认继承global-font-size)
  code-font-size: &apos;15px&apos;
  # 全局字体
  font-family:
  # 代码快字体
  code-font-family: &quot;IntelOne&quot;

# 网站首页左上角以及中间标题字体(没修改)
blog_title_font:
  font_link:
  font-family:
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Tips to improve concentration</title><link>https://astro-pure.js.org/blog/improve-concentration</link><guid isPermaLink="true">https://astro-pure.js.org/blog/improve-concentration</guid><description>Mindfulness, cognitive training, and a healthy lifestyle may help sharpen your focus.</description><pubDate>Sat, 10 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { Aside } from &apos;astro-pure/user&apos;&lt;/p&gt;
&lt;p&gt;You&apos;re trying to concentrate, but your mind is wandering or you&apos;re easily distracted. What happened to the laser-sharp focus you once enjoyed? As we age, we tend to have more difficulty filtering out stimuli that are not relevant to the task at hand.&lt;/p&gt;
&lt;h2&gt;What&apos;s fogging up focus?&lt;/h2&gt;
&lt;p&gt;Like a computer that slows with use, the brain accumulates wear and tear that affects processing. This can be caused by a number of physiological stressors such as inflammation, injury to blood vessels (especially if you have high blood pressure), the buildup of abnormal proteins, and naturally occurring brain shrinkage.&lt;/p&gt;
&lt;p&gt;The following factors can also affect your concentration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Underlying conditions.&lt;/strong&gt; Depression or sleep disorders (such as sleep apnea) can undermine your ability to concentrate. So can the effects of vision or hearing loss. You waste precious cognitive resources when you spend too much time trying to make out what&apos;s written on a page or just hear what someone is saying.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Medication side effects.&lt;/strong&gt; Some drugs, especially anticholinergics (such as treatments for incontinence, depression, or allergies), can slow processing speed and your ability to think clearly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Excessive drinking.&lt;/strong&gt; Having too much alcohol impairs thinking and causes interrupted sleep, which affects concentration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Information overload.&lt;/strong&gt; We are bombarded with information from TVs, computers, and messages such as texts or emails. When there&apos;s too much material, it burdens our filtering system and it&apos;s easy to get distracted.&lt;/p&gt;
&lt;h2&gt;Strategies to stay focused&lt;/h2&gt;
&lt;p&gt;To improve attention, consider the following strategies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mindfulness.&lt;/strong&gt; &quot;Mindfulness is about focusing attention on the present moment, and practicing mindfulness has been shown to rewire the brain so that attention is stronger in everyday life,&quot; says Kim Willment, a neuropsychologist with Brigham and Women&apos;s Hospital. She recommends sitting still for a few minutes each day, closing your eyes, and focusing on your breathing as well as the sounds and sensations around you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cognitive training.&lt;/strong&gt; Computerized cognitive training games aim to improve your response times and attention. Evidence that this works has been mixed. &quot;The goal of playing these games is not to get better at them, but to get better in the cognitive activities of everyday life,&quot; Willment says. &quot;But there is evidence that a person&apos;s ability to pay attention can be improved by progressively pushing the person to higher levels of performance. So if you reach a certain level of sustained attention, pushing it to the next level can help improve it, and this may translate to everyday life.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A healthier lifestyle.&lt;/strong&gt; Many aspects of a healthy lifestyle can help attention, starting with sleep and exercise. There is a direct link between exercise and cognitive ability, especially attention. When you exercise, you increase the availability of brain chemicals that promote new brain connections, reduce stress, and improve sleep. And when we sleep, we reduce stress hormones that can be harmful to the brain, and we clear out proteins that injure it.&lt;/p&gt;
&lt;p&gt;Aim for seven to eight hours of sleep each night, and 150 minutes per week of aerobic exercise, such as brisk walking.&lt;/p&gt;
&lt;p&gt;Other healthy steps to improve focus: eat a Mediterranean-style diet, which has been shown to support brain health; treat underlying conditions; and change medications that may be affecting your ability to focus.&lt;/p&gt;
&lt;p&gt;Getting older is out of your control, but healthier living is something you determine, and it may improve concentration.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Article from: &lt;a href=&quot;https://www.health.harvard.edu/mind-and-mood/tips-to-improve-concentration&quot;&gt;Harvard Health Publishing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="/_astro/thumbnail.1GZ294Dz.jpg"/><enclosure url="/_astro/thumbnail.1GZ294Dz.jpg"/></item><item><title>Using MDX Test</title><link>https://astro-pure.js.org/blog/using-mdx</link><guid isPermaLink="true">https://astro-pure.js.org/blog/using-mdx</guid><description>Learning how to use MDX in Astro</description><pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This theme comes with the &lt;a href=&quot;https://docs.astro.build/en/guides/integrations-guide/mdx/&quot;&gt;@astrojs/mdx&lt;/a&gt; integration installed and configured in your &lt;code&gt;astro.config.ts&lt;/code&gt; config file. If you prefer not to use MDX, you can disable support by removing the integration from your config file.&lt;/p&gt;
&lt;h2&gt;Why MDX?&lt;/h2&gt;
&lt;p&gt;MDX is a special flavor of Markdown that supports embedded JavaScript &amp;#x26; JSX syntax. This unlocks the ability to &lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#mdx-features&quot;&gt;mix JavaScript and UI Components into your Markdown content&lt;/a&gt; for things like interactive charts or alerts.&lt;/p&gt;
&lt;p&gt;If you have existing content authored in MDX, this integration will hopefully make migrating to Astro a breeze.&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;Here is how you import and use a UI component inside of MDX.&lt;br&gt;
When you open this page in the browser, you should see the clickable button below.&lt;/p&gt;
&lt;p&gt;import { Button } from &apos;astro-pure/user&apos;&lt;/p&gt;
&lt;p&gt;Click Me&lt;/p&gt;
&lt;h2&gt;More Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mdxjs.com/docs/what-is-mdx&quot;&gt;MDX Syntax Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#markdown-and-mdx-pages&quot;&gt;Astro Usage Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;a href=&quot;https://docs.astro.build/en/reference/directives-reference/#client-directives&quot;&gt;Client Directives&lt;/a&gt; are still required to create interactive components. Otherwise, all components in your MDX will render as static HTML (no JavaScript) by default.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>What Is 3D Rendering? Complete Guide to 3D Visualization</title><link>https://astro-pure.js.org/blog/3d-rendering</link><guid isPermaLink="true">https://astro-pure.js.org/blog/3d-rendering</guid><description>3D imagery has the power to bring cinematic visions to life and help accurately plan tomorrow’s cityscapes. Here, 3D expert Ricardo Ortiz explains how it works.</description><pubDate>Sun, 09 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;3D rendering is all around us. From huge action movies to car commercials to previews of upcoming buildings or product designs, 3D visualization has become so widespread and realistic that you probably don’t even know it’s there.&lt;/p&gt;
&lt;p&gt;In this introductory piece, Chaos’ Ricardo Ortiz explains the basics of 3D rendering, from the computational methods that create imagery to the artistic techniques that create great computer-generated (CG) content and its various uses.&lt;/p&gt;
&lt;h2&gt;What is 3D Rendering?&lt;/h2&gt;
&lt;p&gt;Put simply, 3D rendering is the process of using a computer to generate a 2D image from a digital three-dimensional scene.&lt;/p&gt;
&lt;p&gt;To generate an image, specific methodologies and special software and hardware are used. Therefore, we need to understand that 3D rendering is a process—the one that builds the image.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_astro/nikola-arsov-still-life-interior-design-vray-3ds-max-05-930px.DoY3_oVo_Z1nNwxU.webp&quot; alt=&quot;alt text&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Types of 3D rendering&lt;/h2&gt;
&lt;p&gt;We can create different types of rendered image; they can be realistic or non-realistic.&lt;/p&gt;
&lt;p&gt;A realistic image could be an architectural interior that looks like a photograph, a product-design image such as a piece of furniture, or an automotive rendering of a car. On the other hand, we can create a non-realistic image such as an outline-type diagram or a cartoon-style image with a traditional 2D look. Technically, we can visualize anything we can imagine.&lt;/p&gt;
&lt;h2&gt;How is 3D rendering used?&lt;/h2&gt;
&lt;p&gt;3D rendering is an essential technique for many industries including architecture, product design, advertising, video games and visual effects for film, TV and animation.&lt;/p&gt;
&lt;p&gt;In design and architecture, renders allow creative people to communicate their ideas in a clear and transparent way. A render gives them the chance to evaluate their proposals, experiment with materials, conduct studies and contextualize their designs in the real world before they are built or manufactured.&lt;/p&gt;
&lt;p&gt;For the media and entertainment industries, 3D rendering is fundamental to the creation of sequences and animations that tell stories, whether we’re watching an animated movie, a period drama, or an action sequence with explosions, ships from the future, exotic locales, or extraterrestrial creatures.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_astro/thanos-dd-single-image-004a.DUX4VGf-_ZVCMNM.webp&quot; alt=&quot;alt text&quot;&gt;&lt;/p&gt;
&lt;p&gt;Over the past few years, the evolution of computer graphics in these industries has replaced traditional techniques. For example, special effects are being replaced by visual effects, which means stunt people no longer risk their lives in car crashes.&lt;/p&gt;
&lt;p&gt;In advertising, I would dare to say that 90% of automotive commercials are CG—or even more. In the architecture industry, many traditional techniques to create representations, such as scale models, have been replaced with photorealistic imagery to ensure we can see exactly how something will look once it’s built.&lt;/p&gt;
&lt;p&gt;Accelerating processes, reducing costs and the demand for better quality results have helped technology evolve. Hardware is more powerful than ever and the switch to CG was inevitable.&lt;/p&gt;
&lt;h2&gt;How is a 3D rendered image generated?&lt;/h2&gt;
&lt;p&gt;Two pieces of software, with different characteristics, are used to computer-generate images and animations: render engines and game engines. Render engines use a technique called ray tracing, while game engines use a technique called rasterization—and some engines mix both techniques, but we will talk about that later on.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.DzZDiYKA.jpg"/><enclosure url="/_astro/thumbnail.DzZDiYKA.jpg"/></item><item><title>The Impact of Technology on the Music World</title><link>https://astro-pure.js.org/blog/music-journey</link><guid isPermaLink="true">https://astro-pure.js.org/blog/music-journey</guid><description>The evolution of music is a symphony of creativity, rhythm, and technology.</description><pubDate>Sat, 30 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The evolution of music is a symphony of creativity, rhythm, and technology. From the humble beginnings of acoustic instruments to the present-day digital era, the relationship between music and technology has been transformative. In this article, we will explore the historical milestones, digital revolution, and emerging technologies that have shaped the music world. Join us on a journey through the chords of innovation as we discuss how technology has changed music.&lt;/p&gt;
&lt;h2&gt;Historical Perspective&lt;/h2&gt;
&lt;p&gt;The marriage of music and technology dates back centuries, with pivotal moments shaping the industry. The invention of the phonograph by Thomas Edison in the late 19th century marked the first time music could be recorded and replayed. Subsequent milestones, such as the electric guitar and the synthesizer, revolutionized music creation, paving the way for new genres and sounds.&lt;/p&gt;
&lt;p&gt;These technological leaps didn&apos;t merely shape the musical landscape of their time but laid a foundation for the continuous evolution of the intersection between music and technology. As artists embraced these innovations, they unlocked new avenues for creativity, paving the way for diverse sounds and genres that have become integral to the vibrant tapestry of the modern music industry. The historical perspective illuminates the symbiotic relationship between music and technology, highlighting the transformative impact that each innovation has had on the way we create, consume, and experience music.&lt;/p&gt;
&lt;h2&gt;Digital Revolution&lt;/h2&gt;
&lt;p&gt;The digital revolution has been a seismic shift in the music industry, altering how music is consumed, distributed, and produced. The transition from physical formats like CDs and vinyl to digital formats such as MP3s and streaming services has democratized access to music. The ease of streaming has transformed how listeners discover and enjoy music, challenging traditional revenue models while offering unparalleled convenience.&lt;/p&gt;
&lt;h2&gt;Technology in Music Consumption and Distribution&lt;/h2&gt;
&lt;p&gt;Streaming services have become the heartbeat of music consumption, causing a decline in traditional music stores. The accessibility of music online has reshaped distribution channels, impacting both artists and record labels. While it provides exposure to a global audience, it also poses challenges regarding fair compensation for artists. The dynamics of the industry are evolving, reflecting the intricate dance between technology and music.
Music Production and Creation&lt;/p&gt;
&lt;p&gt;The advent of digital audio workstations (DAWs), software instruments, and electronic production techniques has democratized music creation. Artists now have powerful tools at their fingertips, enabling them to experiment with sounds, collaborate remotely, and produce music independently. This technological shift has broken down barriers, allowing for a diverse array of voices to be heard in the ever-expanding realm of music.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.Cx18cRmB.jpg"/><enclosure url="/_astro/thumbnail.Cx18cRmB.jpg"/></item><item><title>Markdown Syntax Support</title><link>https://astro-pure.js.org/blog/markdown</link><guid isPermaLink="true">https://astro-pure.js.org/blog/markdown</guid><description>Markdown is a lightweight markup language.</description><pubDate>Wed, 26 Jul 2023 08:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Basic Syntax&lt;/h2&gt;
&lt;p&gt;Markdown is a lightweight and easy-to-use syntax for styling your writing.&lt;/p&gt;
&lt;h3&gt;Headers&lt;/h3&gt;
&lt;p&gt;When the content of the article is extensive, you can use headers to segment:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# Header 1

## Header 2

## Large Header

### Small Header
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Header previews would disrupt the structure of the article, so they are not displayed here.&lt;/p&gt;
&lt;h3&gt;Bold and Italics&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;_Italic text_ and **Bold text**, together will be **_Bold Italic text_**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Italic text&lt;/em&gt; and &lt;strong&gt;Bold text&lt;/strong&gt;, together will be &lt;strong&gt;&lt;em&gt;Bold Italic text&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Links&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;Text link [Link Name](http://link-url)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;Text link &lt;a href=&quot;http://link-url&quot;&gt;Link Name&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Inline Code&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;This is an `inline code`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;This is an &lt;code&gt;inline code&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Code Blocks&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;```js
// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  const result = fibonacci(n - 1) + fibonacci(n - 2) // [\!code --]
  return fibonacci(n - 1) + fibonacci(n - 2) // [\!code ++]
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  const result = fibonacci(n - 1) + fibonacci(n - 2) // [!code --]
  return fibonacci(n - 1) + fibonacci(n - 2) // [!code ++]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Currently using shiki as the code highlighting plugin. For supported languages, refer to &lt;a href=&quot;https://shiki.matsu.io/languages.html&quot;&gt;Shiki: Languages&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Inline Formula&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;This is an inline formula $e^{i\pi} + 1 = 0$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;This is an inline formula $e^{i\pi} + 1 = 0$&lt;/p&gt;
&lt;h3&gt;Formula Blocks&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} \, dx
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} , dx
$$&lt;/p&gt;
&lt;p&gt;Currently using KaTeX as the math formula plugin. For supported syntax, refer to &lt;a href=&quot;https://katex.org/docs/supported.html&quot;&gt;KaTeX Supported Functions&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Images&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![CWorld](https://cravatar.cn/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cravatar.cn/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200&quot; alt=&quot;CWorld&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Strikethrough&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;~~Strikethrough~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;~~Strikethrough~~&lt;/p&gt;
&lt;h3&gt;Lists&lt;/h3&gt;
&lt;p&gt;Regular unordered list&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- 1
- 2
- 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1&lt;/li&gt;
&lt;li&gt;2&lt;/li&gt;
&lt;li&gt;3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regular ordered list&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. GPT-4
2. Claude Opus
3. LLaMa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GPT-4&lt;/li&gt;
&lt;li&gt;Claude Opus&lt;/li&gt;
&lt;li&gt;LLaMa&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can continue to nest syntax within lists.&lt;/p&gt;
&lt;h3&gt;Blockquotes&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&gt; Gunshot, thunder, sword rise. A scene of flowers and blood.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gunshot, thunder, sword rise. A scene of flowers and blood.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can continue to nest syntax within blockquotes.&lt;/p&gt;
&lt;h3&gt;Line Breaks&lt;/h3&gt;
&lt;p&gt;Markdown needs a blank line to separate paragraphs.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;If you don&apos;t leave a blank line
it will be in one paragraph

First paragraph

Second paragraph
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;If you don&apos;t leave a blank line
it will be in one paragraph&lt;/p&gt;
&lt;p&gt;First paragraph&lt;/p&gt;
&lt;p&gt;Second paragraph&lt;/p&gt;
&lt;h3&gt;Separators&lt;/h3&gt;
&lt;p&gt;If you have the habit of writing separators, you can start a new line and enter three dashes &lt;code&gt;---&lt;/code&gt; or asterisks &lt;code&gt;***&lt;/code&gt;. Leave a blank line before and after when there are paragraphs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Advanced Techniques&lt;/h2&gt;
&lt;h3&gt;Inline HTML Elements&lt;/h3&gt;
&lt;p&gt;Currently, only some inline HTML elements are supported, including &lt;code&gt;&amp;#x3C;kdb&gt; &amp;#x3C;b&gt; &amp;#x3C;i&gt; &amp;#x3C;em&gt; &amp;#x3C;sup&gt; &amp;#x3C;sub&gt; &amp;#x3C;br&gt;&lt;/code&gt;, such as&lt;/p&gt;
&lt;h4&gt;Key Display&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;Use &amp;#x3C;kbd&gt;Ctrl&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Alt&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Del&amp;#x3C;/kbd&gt; to reboot the computer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;Use Ctrl + Alt + Del to reboot the computer&lt;/p&gt;
&lt;h4&gt;Bold Italics&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;b&gt; Markdown also applies here, such as _bold_ &amp;#x3C;/b&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt; Markdown also applies here, such as &lt;em&gt;bold&lt;/em&gt; &lt;/p&gt;
&lt;h3&gt;Other HTML Writing&lt;/h3&gt;
&lt;h4&gt;Foldable Blocks&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;details&gt;&amp;#x3C;summary&gt;Click to expand&amp;#x3C;/summary&gt;It is hidden&amp;#x3C;/details&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;h3&gt;Tables&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;| Header1  | Header2  |
| -------- | -------- |
| Content1 | Content2 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;| Header1  | Header2  |
| -------- | -------- |
| Content1 | Content2 |&lt;/p&gt;
&lt;h3&gt;Footnotes&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;Use [^footnote] to add a footnote at the point of reference.

Then, at the end of the document, add the content of the footnote (it will be rendered at the end of the article by default).

[^footnote]: Here is the content of the footnote
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;Use [^footnote] to add a footnote at the point of reference.&lt;/p&gt;
&lt;p&gt;Then, at the end of the document, add the content of the footnote (it will be rendered at the end of the article by default).&lt;/p&gt;
&lt;p&gt;[^footnote]: Here is the content of the footnote&lt;/p&gt;
&lt;h3&gt;To-Do Lists&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- [ ] Incomplete task
- [x] Completed task
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Incomplete task&lt;/li&gt;
&lt;li&gt;[x] Completed task&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Symbol Escaping&lt;/h3&gt;
&lt;p&gt;If you need to use markdown symbols like _ # * in your description but don&apos;t want them to be escaped, you can add a backslash before these symbols, such as &lt;code&gt;\_&lt;/code&gt; &lt;code&gt;\#&lt;/code&gt; &lt;code&gt;\*&lt;/code&gt; to avoid it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;\_Don&apos;t want the text here to be italic\_

\*\*Don&apos;t want the text here to be bold\*\*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;_Don&apos;t want the text here to be italic_&lt;/p&gt;
&lt;p&gt;**Don&apos;t want the text here to be bold**&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Embedding Astro Components&lt;/h2&gt;
&lt;p&gt;See &lt;a href=&quot;/docs/integrations/components&quot;&gt;User Components&lt;/a&gt; and &lt;a href=&quot;/docs/integrations/advanced&quot;&gt;Advanced Components&lt;/a&gt; for details.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.HAXFr_hw.jpg"/><enclosure url="/_astro/thumbnail.HAXFr_hw.jpg"/></item><item><title>Markdown 语法支持</title><link>https://astro-pure.js.org/blog/markdown-zh</link><guid isPermaLink="true">https://astro-pure.js.org/blog/markdown-zh</guid><description>Markdown 是一种轻量级的「标记语言」。</description><pubDate>Wed, 26 Jul 2023 08:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;基本语法&lt;/h2&gt;
&lt;p&gt;Markdown 是一种轻量级且易于使用的语法，用于为您的写作设计风格。&lt;/p&gt;
&lt;h3&gt;标题&lt;/h3&gt;
&lt;p&gt;文章内容较多时，可以用标题分段：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# 标题 1

## 标题 2

## 大标题

### 小标题
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;标题预览会打乱文章的结构，所以在此不展示。&lt;/p&gt;
&lt;h3&gt;粗斜体&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;_斜体文本_

**粗体文本**

**_粗斜体文本_**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;斜体文本&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;粗体文本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;粗斜体文本&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;链接&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;文字链接 [链接名称](http://链接网址)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;文字链接 &lt;a href=&quot;http://%E9%93%BE%E6%8E%A5%E7%BD%91%E5%9D%80&quot;&gt;链接名称&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;行内代码&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;这是一条 `单行代码`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;这是一条 &lt;code&gt;行内代码&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;代码块&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;```js
// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前使用 shiki 作为代码高亮插件，支持的语言请参考 &lt;a href=&quot;https://shiki.matsu.io/languages.html&quot;&gt;shiki / languages&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;行内公式&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;这是一条行内公式 $e^{i\pi} + 1 = 0$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;这是一条行内公式 $e^{i\pi} + 1 = 0$&lt;/p&gt;
&lt;h3&gt;公式块&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} \, dx
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} , dx
$$&lt;/p&gt;
&lt;p&gt;当前使用 KaTeX 作为数学公式插件，支持的语法请参考 &lt;a href=&quot;https://katex.org/docs/supported.html&quot;&gt;KaTeX Supported Functions&lt;/a&gt;。&lt;/p&gt;
&lt;h4&gt;图片&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![CWorld](https://cravatar.cn/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cravatar.cn/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200&quot; alt=&quot;CWorld&quot;&gt;&lt;/p&gt;
&lt;h4&gt;删除线&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;~~删除线~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;~~删除线~~&lt;/p&gt;
&lt;h3&gt;列表&lt;/h3&gt;
&lt;p&gt;普通无序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- 1
- 2
- 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1&lt;/li&gt;
&lt;li&gt;2&lt;/li&gt;
&lt;li&gt;3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;普通有序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. GPT-4
2. Claude Opus
3. LLaMa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GPT-4&lt;/li&gt;
&lt;li&gt;Claude Opus&lt;/li&gt;
&lt;li&gt;LLaMa&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;列表里可以继续嵌套语法&lt;/p&gt;
&lt;h3&gt;引用&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&gt; 枪响，雷鸣，剑起。繁花血景。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;枪响，雷鸣，剑起。繁花血景。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用里也可以继续嵌套语法。&lt;/p&gt;
&lt;h3&gt;换行&lt;/h3&gt;
&lt;p&gt;markdown 分段落是需要空一行的。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;如果不空行
就会在一段

第一段

第二段
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;如果不空行
就会在一段&lt;/p&gt;
&lt;p&gt;第一段&lt;/p&gt;
&lt;p&gt;第二段&lt;/p&gt;
&lt;h3&gt;分隔符&lt;/h3&gt;
&lt;p&gt;如果你有写分割线的习惯，可以新起一行输入三个减号&lt;code&gt;---&lt;/code&gt; 或者星号 &lt;code&gt;***&lt;/code&gt;。当前后都有段落时，请空出一行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;高级技巧&lt;/h2&gt;
&lt;h3&gt;行内 HTML 元素&lt;/h3&gt;
&lt;p&gt;目前只支持部分段内 HTML 元素效果，包括 &lt;code&gt;&amp;#x3C;kdb&gt; &amp;#x3C;b&gt; &amp;#x3C;i&gt; &amp;#x3C;em&gt; &amp;#x3C;sup&gt; &amp;#x3C;sub&gt; &amp;#x3C;br&gt;&lt;/code&gt; ，如&lt;/p&gt;
&lt;h4&gt;键位显示&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;使用 &amp;#x3C;kbd&gt;Ctrl&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Alt&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Del&amp;#x3C;/kbd&gt; 重启电脑
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;使用 Ctrl + Alt + Del 重启电脑&lt;/p&gt;
&lt;h4&gt;粗斜体&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;b&gt; Markdown 在此处同样适用，如 _加粗_ &amp;#x3C;/b&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt; Markdown 在此处同样适用，如 &lt;em&gt;加粗&lt;/em&gt; &lt;/p&gt;
&lt;h3&gt;其他 HTML 写法&lt;/h3&gt;
&lt;h4&gt;折叠块&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;details&gt;&amp;#x3C;summary&gt;点击展开&amp;#x3C;/summary&gt;它被隐藏了&amp;#x3C;/details&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;h3&gt;表格&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;| 表头1 | 表头2 |
| ----- | ----- |
| 内容1 | 内容2 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;| 表头1 | 表头2 |
| ----- | ----- |
| 内容1 | 内容2 |&lt;/p&gt;
&lt;h3&gt;注释&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;在引用的地方使用 [^注释] 来添加注释。

然后在文档的结尾，添加注释的内容（会默认于文章结尾渲染之）。

[^注释]: 这里是注释的内容
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;在引用的地方使用 &lt;a href=&quot;%E8%BF%99%E9%87%8C%E6%98%AF%E6%B3%A8%E9%87%8A%E7%9A%84%E5%86%85%E5%AE%B9&quot;&gt;^注释&lt;/a&gt; 来添加注释。&lt;/p&gt;
&lt;p&gt;然后在文档的结尾，添加注释的内容（会默认于文章结尾渲染之）。&lt;/p&gt;
&lt;h3&gt;To-Do 列表&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- [ ] 未完成的任务
- [x] 已完成的任务
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 未完成的任务&lt;/li&gt;
&lt;li&gt;[x] 已完成的任务&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;符号转义&lt;/h3&gt;
&lt;p&gt;如果你的描述中需要用到 markdown 的符号，比如 _ # * 等，但又不想它被转义，这时候可以在这些符号前加反斜杠，如 &lt;code&gt;\_&lt;/code&gt; &lt;code&gt;\#&lt;/code&gt; &lt;code&gt;\*&lt;/code&gt; 进行避免。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;\_不想这里的文本变斜体\_

\*\*不想这里的文本被加粗\*\*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;_不想这里的文本变斜体_&lt;/p&gt;
&lt;p&gt;**不想这里的文本被加粗**&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;内嵌 Astro 组件&lt;/h2&gt;
&lt;p&gt;See &lt;a href=&quot;/docs/integrations/components&quot;&gt;User Components&lt;/a&gt; and &lt;a href=&quot;/docs/integrations/advanced&quot;&gt;Advanced Components&lt;/a&gt; for details.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.HAXFr_hw.jpg"/><enclosure url="/_astro/thumbnail.HAXFr_hw.jpg"/></item></channel></rss>