<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>小朱朱</title><description>朱朱最爱月月啦~</description><link>https://blog.zzboy.tk/</link><language>zh_CN</language><item><title>微信小程序图表渲染与翻页体验的“填坑”记</title><link>https://blog.zzboy.tk/posts/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%9B%BE%E8%A1%A8%E6%B8%B2%E6%9F%93%E4%B8%8E%E7%BF%BB%E9%A1%B5%E4%BD%93%E9%AA%8C%E7%9A%84%E5%A1%AB%E5%9D%91%E8%AE%B0/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%9B%BE%E8%A1%A8%E6%B8%B2%E6%9F%93%E4%B8%8E%E7%BF%BB%E9%A1%B5%E4%BD%93%E9%AA%8C%E7%9A%84%E5%A1%AB%E5%9D%91%E8%AE%B0/</guid><description>记录微信小程序 Annual Report 页面开发中遇到的 ECharts 渲染问题及翻页优化的填坑过程。</description><pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;微信小程序开发，有时候真的像是“在玻璃渣里找糖吃”。&lt;/p&gt;
&lt;p&gt;今天做一个年度账单的总结页面，本来一切都很顺利。页面布局、数据对接、后端开发，加起来只用了不到2个小时。看着模拟器里精美的界面，我心想：“稳了，今天能早点收工。”&lt;/p&gt;
&lt;p&gt;然而，噩梦才刚刚开始。&lt;/p&gt;
&lt;h2&gt;消失的图表&lt;/h2&gt;
&lt;p&gt;在微信开发者工具里，ECharts 图表渲染得完美无缺，动画流畅，交互丝滑。我满怀信心地点击上传、发布体验版，掏出手机预览——&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图表全都不见了，只有一片空白。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一瞬间心态崩了。明明代码没有任何报错，工具里也正常，怎么真机就“跪”了？我以为是样式问题，开始让 AI 帮忙排查：延迟加载、修改 CSS、调整 Z-index、甚至重写初始化逻辑。折腾了整整3个小时，代码改得面目全非，手机上的图表依然顽固地隐身。&lt;/p&gt;
&lt;p&gt;最后实在没办法，我冷静下来，找出了之前一个能正常显示图表的页面，进行逐行代码比对。&lt;/p&gt;
&lt;p&gt;终于，我发现了一个关键的区别：&lt;strong&gt;正常的页面用的是普通的 &lt;code&gt;&amp;lt;view&amp;gt;&lt;/code&gt;，而这个出问题的页面用的是 &lt;code&gt;&amp;lt;scroll-view&amp;gt;&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;梦中惊醒。原来，微信小程序的原生组件（Canvas 用于渲染 ECharts）在 &lt;code&gt;&amp;lt;scroll-view&amp;gt;&lt;/code&gt; 中存在及其诡异的渲染层级问题，尤其是在安卓和部分 iOS 真机上。这就是图表“消失”的元凶。&lt;/p&gt;
&lt;p&gt;我果断把 content wrapper 从 &lt;code&gt;&amp;lt;scroll-view&amp;gt;&lt;/code&gt; 换成了 &lt;code&gt;&amp;lt;view&amp;gt;&lt;/code&gt; 容器，配合 &lt;code&gt;overflow-y: scroll&lt;/code&gt;。重新编译，真机扫码——&lt;strong&gt;图表出来了！&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;翻页的“阵痛”&lt;/h2&gt;
&lt;p&gt;图表是显示出来了，但为了实现“年度账单”那种一屏一页的沉浸式体验，我使用了 CSS Scroll Snap (&lt;code&gt;scroll-snap-type: y mandatory&lt;/code&gt;)。&lt;/p&gt;
&lt;p&gt;结果新的问题又来了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;过于灵敏&lt;/strong&gt;：手指轻轻一划，页面就像刹不住车一样飞出去好几页。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;卡顿尴尬&lt;/strong&gt;：经常出现“上不去下不来”的情况，页面停在两个页面的中间，上面一半显示图表，下面一半显示文字，体验极差。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我又开始疯狂问 AI 如何优化滚动阻尼和吸附效果，但在小程序里，CSS Scroll Snap 的兼容性和手感总是差点意思。&lt;/p&gt;
&lt;h2&gt;终极方案：回归 Swiper&lt;/h2&gt;
&lt;p&gt;最后，AI 给出了一个“返璞归真”的建议：&lt;strong&gt;直接使用微信原生的 &lt;code&gt;&amp;lt;swiper&amp;gt;&lt;/code&gt; 组件&lt;/strong&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;swiper vertical=&quot;true&quot; bindchange=&quot;onSwiperChange&quot; style=&quot;height: 100vh;&quot;&amp;gt;
  &amp;lt;swiper-item&amp;gt; Page 1 &amp;lt;/swiper-item&amp;gt;
  &amp;lt;swiper-item&amp;gt; Page 2 &amp;lt;/swiper-item&amp;gt;
  ...
&amp;lt;/swiper&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改完之后，世界清静了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;强制整页翻动&lt;/strong&gt;：再也不会卡在半空中，每一页都严丝合缝。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自带阻尼&lt;/strong&gt;：滑动体验丝般顺滑，不再“乱飞”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精准的生命周期&lt;/strong&gt;：利用 &lt;code&gt;bindchange&lt;/code&gt; 事件，我可以精确控制每一页图表的加载时机（翻到这一页再渲染动画），完美解决了图表预加载的性能问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;微信小程序的开发，真的是在“坑”里仰望星空。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ECharts 慎用 Scroll-View&lt;/strong&gt;：除非万不得已，能用 &lt;code&gt;view&lt;/code&gt; 就别用 &lt;code&gt;scroll-view&lt;/code&gt; 包裹 Canvas。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全屏翻页首选 Swiper&lt;/strong&gt;：不要迷信 CSS 魔法，原生 &lt;code&gt;swiper&lt;/code&gt; 组件才是做 H5 翻页效果的王道。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;（完）&lt;/p&gt;
</content:encoded></item><item><title>DockerINDocker中代理配置</title><link>https://blog.zzboy.tk/posts/dockerindocker%E4%B8%AD%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/dockerindocker%E4%B8%AD%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE/</guid><pubDate>Sat, 08 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在docker In docker中，配置拉取镜像的代理，需要配置daemon.json文件，而不是docker.service文件。
在&lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;文件中添加如下配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
&quot;proxies&quot;: {
    &quot;http-proxy&quot;: &quot;socks5h://10.10.0.20:7897&quot;,
    &quot;https-proxy&quot;: &quot;socks5h://10.10.0.20:7897&quot;,
    &quot;no-proxy&quot;: &quot;localhost,127.0.0.1&quot;
  },
  &quot;insecure-registries&quot;: [&quot;10.10.0.2:2000&quot;]
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Linux http配置大小写的差异</title><link>https://blog.zzboy.tk/posts/linux_http%E9%85%8D%E7%BD%AE%E5%A4%A7%E5%B0%8F%E5%86%99%E7%9A%84%E5%B7%AE%E5%BC%82/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/linux_http%E9%85%8D%E7%BD%AE%E5%A4%A7%E5%B0%8F%E5%86%99%E7%9A%84%E5%B7%AE%E5%BC%82/</guid><pubDate>Sat, 08 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Linux中常用的http配置为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export http_proxy=http://192.168.1.2:7897
export https_proxy=http://192.168.1.2:7897
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是有的软件读取的时候识别的是大写的HTTP_PROXY，所以需要将配置改为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export HTTP_PROXY=http://192.168.1.2:7897
export HTTPS_PROXY=http://192.168.1.2:7897
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因此我们在～/.bashrc中添加如下配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export HTTP_PROXY=http://192.168.1.2:7897
export HTTPS_PROXY=http://192.168.1.2:7897
export http_proxy=http://192.168.1.2:7897
export https_proxy=http://192.168.1.2:7897
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大小写都写上，这样就不会出现找不到代理的问题了。&lt;/p&gt;
</content:encoded></item><item><title>记一次Nginx反代飞牛遇到416的问题</title><link>https://blog.zzboy.tk/posts/%E8%AE%B0%E4%B8%80%E6%AC%A1nginx%E5%8F%8D%E4%BB%A3%E9%A3%9E%E7%89%9B%E9%81%87%E5%88%B0416%E7%9A%84%E9%97%AE%E9%A2%98/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/%E8%AE%B0%E4%B8%80%E6%AC%A1nginx%E5%8F%8D%E4%BB%A3%E9%A3%9E%E7%89%9B%E9%81%87%E5%88%B0416%E7%9A%84%E9%97%AE%E9%A2%98/</guid><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;问题&lt;/h2&gt;
&lt;p&gt;Nginx 反代飞牛用标准的反代方式之前用的都一切正常，但是最近使用了飞牛影视，发现一直播放失败，控制台查看日志发现有416的错误，使用飞牛的地址直接请求是正常的，原以为是使用了CDN的原因，准备开喷了都。遂想着顺手排查一下是不是Nginx配置的问题，使用一个没有CDN的地址，发现还是416，这就很奇怪了，这误会了，是Nginx的锅，不是CND的锅。
直接请求飞牛返回的是206，而Nginx返回的是416。&lt;/p&gt;
&lt;p&gt;问了一下AI说是 Nginx 没有正确地处理或传递客户端的 Range 头信息。
需要添加如下配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    proxy_set_header Range $http_range;
    proxy_set_header If-Range $http_if_range;
    proxy_buffering off;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置完飞牛的完整配置如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
#PROXY-START/


location ^~ /v/api/v1/media/range/
{
    proxy_set_header Range $http_range;
    proxy_set_header If-Range $http_if_range;
    proxy_buffering off;
    proxy_pass http://192.168.101.2:5666;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_http_version 1.1;
    # proxy_hide_header Upgrade;

    add_header X-Cache $upstream_cache_status;

    #Set Nginx Cache
    
    
    set $static_fileQesizG7c 0;
    if ( $uri ~* &quot;\.(gif|png|jpg|css|js|woff|woff2)$&quot; )
    {
    	set $static_fileQesizG7c 1;
    	expires 1m;
        }
    if ( $static_fileQesizG7c = 0 )
    {
    add_header Cache-Control no-cache;
    }
}

location ^~ /
{
    proxy_pass http://192.168.101.2:5666;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_http_version 1.1;
    # proxy_hide_header Upgrade;

    add_header X-Cache $upstream_cache_status;

    #Set Nginx Cache
    
    
    set $static_fileQesizG7c 0;
    if ( $uri ~* &quot;\.(gif|png|jpg|css|js|woff|woff2)$&quot; )
    {
    	set $static_fileQesizG7c 1;
    	expires 1m;
        }
    if ( $static_fileQesizG7c = 0 )
    {
    add_header Cache-Control no-cache;
    }
}

#PROXY-END/

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>记一次巨离谱的调试</title><link>https://blog.zzboy.tk/posts/%E8%AE%B0%E4%B8%80%E6%AC%A1%E5%B7%A8%E7%A6%BB%E8%B0%B1%E7%9A%84%E8%B0%83%E8%AF%95/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/%E8%AE%B0%E4%B8%80%E6%AC%A1%E5%B7%A8%E7%A6%BB%E8%B0%B1%E7%9A%84%E8%B0%83%E8%AF%95/</guid><description>调试一上午发现，一个容器无法出网的“网络问题”，源头竟是Dockerfile中的环境变量。</description><pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;调试一上午，发现是打包 Docker 时候的一个小问题导致的。&lt;/p&gt;
&lt;h2&gt;🐛 问题描述&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一台服务器上打包的 Docker 镜像，在另一台服务器上部署后，容器无法访问外部网络。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;🔍 排查过程&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;初步怀疑：防火墙&lt;/strong&gt;
这台服务器的 &lt;code&gt;iptables&lt;/code&gt; 配置了 &lt;code&gt;DOCKER-USER&lt;/code&gt; 链的相关防火墙。联想到之前也因为防火墙导致过类似问题，所以这次第一反应还是认为是防火墙导致的。&lt;/p&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;重启了 N 遍防火墙和 Docker 服务，不行。&lt;/li&gt;
&lt;li&gt;甚至在 &lt;code&gt;DOCKER-USER&lt;/code&gt; 链的最上层添加 &lt;code&gt;0.0.0.0/0&lt;/code&gt; 的 &lt;code&gt;ACCEPT&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;strong&gt;这个 &lt;code&gt;docker-compose&lt;/code&gt; 下的其他容器是否正常？&lt;/strong&gt;
测试后发现，哎～其他容器的网络是正常的，&lt;strong&gt;唯独这个新镜像的容器不行！&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定位“元凶”&lt;/strong&gt;
问题基本锁定在镜像本身。遂回头查看 &lt;code&gt;Dockerfile&lt;/code&gt; 文件，发现了这几行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ENV http_proxy=http://10.10.0.20:7897
ENV https_proxy=http://10.10.0.20:7897
ENV no_proxy=localhost,127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个代理 &lt;code&gt;10.10.0.20:7897&lt;/code&gt; 仅在打包服务器上可用，在部署服务器上是无法访问的。而这几个环境变量在打包后&lt;strong&gt;没有被置空&lt;/strong&gt;，被一起打进了镜像里！&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;💡 解决方案&lt;/h2&gt;
&lt;p&gt;问题找到了，解决就很简单了。尝试进入容器内部，使用 &lt;code&gt;unset&lt;/code&gt; 命令清除了这几个环境变量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unset http_proxy
unset https_proxy
unset no_proxy
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;😮‍💨 总结&lt;/h2&gt;
&lt;p&gt;一上午的时间，就因为这么一个小小的疏忽流逝了。&lt;/p&gt;
</content:encoded></item><item><title>P2P慢成PPT？一招CDN暴力加速，让你的异地组网丝滑如德芙！</title><link>https://blog.zzboy.tk/posts/p2p%E6%85%A2%E6%88%90ppt%E4%B8%80%E6%8B%9Bcdn%E6%9A%B4%E5%8A%9B%E5%8A%A0%E9%80%9F%E8%AE%A9%E4%BD%A0%E7%9A%84%E5%BC%82%E5%9C%B0%E7%BB%84%E7%BD%91%E4%B8%9D%E6%BB%91%E5%A6%82%E5%BE%B7%E8%8A%99/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/p2p%E6%85%A2%E6%88%90ppt%E4%B8%80%E6%8B%9Bcdn%E6%9A%B4%E5%8A%9B%E5%8A%A0%E9%80%9F%E8%AE%A9%E4%BD%A0%E7%9A%84%E5%BC%82%E5%9C%B0%E7%BB%84%E7%BD%91%E4%B8%9D%E6%BB%91%E5%A6%82%E5%BE%B7%E8%8A%99/</guid><pubDate>Fri, 29 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;strong&gt;一、 开头：那个深夜，我差点砸了我的NAS&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;你是不是也遇到过这样的崩溃瞬间？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;苦心搭建的异地组网，远程桌面卡得像在看逐帧动画，鼠标漂移到怀疑人生。&lt;/li&gt;
&lt;li&gt;想从家里的NAS拖个文件到公司，看着那几KB/s的速度，感觉它是在“跨球”传输。&lt;/li&gt;
&lt;li&gt;手机连上家里的网，想看个监控，结果转了三分钟圈圈，激情早已被消磨殆尽。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们满怀激情地拥抱EasyTier这样的P2P“神器”，奔着“去中心化”、“数据自由”的理想而去，结果却在现实的网速面前撞得头破血流。连接是成功了，但那龟速的体验，像极了爱情里那句扎心的话：“我们不合适”。&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;二、 提问：我们到底错过了什么？&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;明明我家2000M，公司1000M，为什么点对点之后，速度连2G时代都不如？&lt;/p&gt;
&lt;p&gt;P2P（Peer-to-Peer）的理念是美好的——节点直连，不经中转。但现实是残酷的，从你家到你朋友家，中间隔着的是由无数个运营商、交换机组成的“运营商丛林法则”。你的数据包可能绕了半个中国才找到对方，延迟高、丢包严重，体验自然拉胯。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;难道，为了追求去中心化的自由，我们就必须忍受这该死的“慢”吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不！今天，我就要捅破这层窗户纸，告诉你一个“曲线救国”的骚操作：&lt;strong&gt;用魔法打败魔法！我们给去中心化的P2P，套上一层中心化的“CDN氮气瓶”！&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;三、 观点与案例：让云厂商为你的“私有网络”打工！&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;我们的核心思路很简单：&lt;strong&gt;借鸡生蛋&lt;/strong&gt;。既然我们自己到对方的网络路径质量差，那就“薅”一条高质量的VIP通道——云厂商的CDN。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;具体方案：&lt;/strong&gt; 利用CDN（如阿里云ESA或腾讯云EdgeOne）来加速EasyTier的 &lt;code&gt;wss&lt;/code&gt; 协议连接。你的设备（节点B）不再直接“跋山涉水”去找服务器（节点A），而是先就近连接到CDN的边缘节点，然后由CDN通过它们高速的BGP骨干网，将流量精准、稳定地送到你的节点A。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这就好比：&lt;/strong&gt; 你要去一个很远的地方，普通P2P是自己开拖拉机去，路况未知；而用了CDN，就是在家门口坐上高铁，直达目的地。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;【实战演练：三步搞定，让你的网络起飞！】&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;准备工作：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一台有公网IP（IPv4/v6都行）的服务器（后称&lt;strong&gt;节点A&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;你的其他设备（后称&lt;strong&gt;节点B&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;一个&lt;strong&gt;已备案&lt;/strong&gt;的域名（国内CDN加速必备！）&lt;/li&gt;
&lt;li&gt;阿里云ESA或腾讯云EdgeOne账号&lt;/li&gt;
&lt;li&gt;最新版EasyTier（本文使用v2.4.1）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;Step 1: 配置你的“大本营”（节点A）&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;在&lt;strong&gt;节点A&lt;/strong&gt;上启动EasyTier，关键在于监听协议选择 &lt;code&gt;wss&lt;/code&gt;，并让它映射到你的域名上。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;监听地址&lt;/strong&gt;：&lt;code&gt;wss://0.0.0.0:11012&lt;/code&gt; （端口号可自定义）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;映射监听&lt;/strong&gt;：&lt;code&gt;wss://easytier.xxx.com:0/ws&lt;/code&gt; （&lt;code&gt;xxx.com&lt;/code&gt; 换成你的域名）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;就像这样配置：&lt;/strong&gt;
&lt;img src=&quot;guide/20250829-1.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;Step 2: 召唤“CDN神兽”（阿里云ESA / 腾讯云EdgeOne）&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;二者选一即可，它们各有千秋。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案A：阿里云ESA（速度派）&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;添加域名&lt;/strong&gt;：在ESA控制台，添加你的域名，并将CNAME指向节点A的公网IP。
&lt;img src=&quot;guide/ef0b02d8-45e6-4b4a-ae51-bcb348d3011c.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;申请证书&lt;/strong&gt;：为你的域名申请一个免费的SSL证书，开启HTTPS强制跳转。
&lt;img src=&quot;guide/634a2691-e164-4eaa-808e-4c1d74d19fbe.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置回源&lt;/strong&gt;：这是最关键的一步！设置回源协议为 &lt;code&gt;https&lt;/code&gt;，回源地址为你的节点A公网IP，回源端口为 &lt;code&gt;11012&lt;/code&gt;（与节点A监听端口一致）。
&lt;img src=&quot;guide/22745061-f11e-428e-8e89-fdf4572d54f6.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;方案B：腾讯云EdgeOne（延迟派）&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;站点接入&lt;/strong&gt;：在EdgeOne控制台，添加你的域名，并将CNAME指向节点A的公网IP。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置回源与证书&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;回源协议选择 &lt;code&gt;HTTPS&lt;/code&gt;（EdgeOne会将WSS视为HTTPS流量），端口填写 &lt;code&gt;11012&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;为节点申请并配置SSL证书。
&lt;img src=&quot;guide/2a88ac0f-5370-42f0-8ff3-4157efa424c0.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;Step 3: “小兵”集结（节点B）&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;现在，在你的其他设备（节点B）上配置EasyTier就极其简单了。在“节点连接”处，直接填上我们CDN加速后的域名地址：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;节点连接&lt;/strong&gt;：&lt;code&gt;wss://easytier.xxx.com:0/ws&lt;/code&gt;
&lt;img src=&quot;guide/6b7ca64e-f130-40f8-82c5-5e13125f0484.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;启动节点B，稍等片刻，你就能在网络拓扑中看到，节点B与节点A的连接方式已经变成了闪亮的 &lt;code&gt;WSS&lt;/code&gt;！这意味着，你的数据已经跑在了云厂商的VIP高速公路上！&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;四、 社会现象分析：当“极客精神”遇上“实用主义”&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;我们为什么热衷于EasyTier、Tailscale这类工具？因为在这个数据为王的时代，我们渴望构建一个属于自己的、可控的、安全的私有网络。这是一种数字时代的“圈地运动”，是技术人的浪漫。&lt;/p&gt;
&lt;p&gt;然而，纯粹的“去中心化”理想，在复杂的现实网络环境中往往会碰壁。今天这个方案，看似用“中心化”的CDN解决了问题，实则是一种更成熟的思考：&lt;strong&gt;我们不应被技术理念束缚，而应灵活地组合利用现有最强大的工具，去实现我们的最终目的——一个高速、稳定、可靠的私有网络。&lt;/strong&gt; 这不是对理想的背叛，而是务实的进化。&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;五、 总结与升华：谁是你的“梦中情网”？&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;我们来实测对比一下两位“CDN神兽”的表现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;腾讯云EdgeOne：延迟杀手&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：延迟极低！实测仅&lt;strong&gt;20ms&lt;/strong&gt;，几乎和我用TCP直连的速度一模一样，回源节点质量非常高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：免费版限速&lt;strong&gt;500KB/s&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：对延迟极度敏感的操作，如远程桌面、SSH、在线协作。
&lt;img src=&quot;guide/4b762463c7670c449ab8ac0080a7c14f.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;阿里云ESA：速度猛兽&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;strong&gt;不限速&lt;/strong&gt;！带宽能跑多高，取决于你的服务器和本地网络。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：延迟相对较高，实测约&lt;strong&gt;80ms&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：需要大带宽的场景，如异地文件传输、视频流媒体。
&lt;img src=&quot;guide/c44c9b026fad4082a87f9769a3985ee3.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;结论：&lt;/strong&gt;
没有最好的，只有最合适的。通过简单的CDN配置，我们不仅解决了P2P网络慢的痛点，还拥有了根据需求自由切换“低延迟模式”和“高带宽模式”的超能力。&lt;/p&gt;
&lt;p&gt;我们从最初的“连接万物”，进化到了“高效连接万物”。这不仅仅是一次网络优化，更是一次技术思维的升级——&lt;strong&gt;懂得借力，才能真正让技术为我所用。&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;六、 金句收尾&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;最好的异地组网，就是让“异地”感觉不到距离。&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;七、 开放问题&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;好了，技术干货就到这里。现在轮到你了：面对低延迟和高带宽，你会选择做“手速超神的电竞选手”，还是“下载看片从不等待的仓鼠党”？在评论区聊聊你的选择吧！&lt;/p&gt;
</content:encoded></item><item><title>aliyun-esa</title><link>https://blog.zzboy.tk/posts/aliyun-esa/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/aliyun-esa/</guid><pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;阿里云ESA加速效果不错，非常推荐！&lt;br /&gt;
不限速，不限量，不用抽奖。&lt;br /&gt;
领取链接：http://s.tb.cn/e6.0Fu67m
&lt;img src=&quot;guide/1754447440148.jpg&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>vscode端口转发</title><link>https://blog.zzboy.tk/posts/vscode%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/vscode%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/</guid><description>vscode远程开发时候的端口转发</description><pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;hr /&gt;
&lt;h2&gt;VS Code 端口转发指南 🔌&lt;/h2&gt;
&lt;p&gt;在 Visual Studio Code (VS Code) 中进行端口转发主要有两种方法：使用命令面板和配置 SSH 文件。&lt;/p&gt;
&lt;h3&gt;方法一：使用命令面板转发&lt;/h3&gt;
&lt;p&gt;通过 VS Code 的命令面板转发端口非常直接。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开命令面板 (快捷键: &lt;code&gt;Ctrl + Shift + P&lt;/code&gt; 或 &lt;code&gt;Cmd + Shift + P&lt;/code&gt; on macOS)。&lt;/li&gt;
&lt;li&gt;输入“&lt;strong&gt;转发端口&lt;/strong&gt;”(Forward a Port)。&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;strong&gt;目标地址&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;您也可以直接在 VS Code 的“端口”视图中配置端口转发，如下图所示：
&lt;img src=&quot;guide/vscode%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%911.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;strong&gt;⚠️ 注意：&lt;/strong&gt; 此方法默认将端口转发到本机的 &lt;code&gt;localhost&lt;/code&gt;。这意味着&lt;strong&gt;局域网内的其他设备可能无法访问&lt;/strong&gt;该转发端口。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;方法二：使用 SSH 配置文件转发&lt;/h3&gt;
&lt;p&gt;通过修改 SSH 配置文件 (&lt;code&gt;.ssh/config&lt;/code&gt;)，您可以实现更灵活的端口转发设置。&lt;/p&gt;
&lt;h4&gt;1. 本地端口转发到远程服务器&lt;/h4&gt;
&lt;p&gt;将本地机器的某个端口的流量转发到远程服务器的指定端口。&lt;/p&gt;
&lt;p&gt;在您的 &lt;code&gt;.ssh/config&lt;/code&gt; 文件中，为目标主机添加或修改以下行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host your_remote_host_alias
    HostName your_remote_host_ip_or_domain
    User your_username
    LocalForward 0.0.0.0:3001 0.0.0.0:3001
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将 &lt;code&gt;your_remote_host_alias&lt;/code&gt;, &lt;code&gt;your_remote_host_ip_or_domain&lt;/code&gt;, 和 &lt;code&gt;your_username&lt;/code&gt;替换为您的实际配置。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LocalForward 0.0.0.0:3001 0.0.0.0:3001&lt;/code&gt; 表示将&lt;strong&gt;本机&lt;/strong&gt;所有网络接口的 &lt;code&gt;3001&lt;/code&gt; 端口的流量转发到&lt;strong&gt;远程服务器&lt;/strong&gt;所有网络接口的 &lt;code&gt;3001&lt;/code&gt; 端口。
&lt;ul&gt;
&lt;li&gt;第一个 &lt;code&gt;0.0.0.0:3001&lt;/code&gt; 指的是本地监听的地址和端口。使用 &lt;code&gt;0.0.0.0&lt;/code&gt; 意味着允许来自任何网络接口（包括局域网）的访问。如果只想监听本地回环地址，可以使用 &lt;code&gt;127.0.0.1:3001&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;第二个 &lt;code&gt;0.0.0.0:3001&lt;/code&gt; 指的是远程目标地址和端口。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;连接到此 SSH 主机后，访问本机的 &lt;code&gt;http://0.0.0.0:3001&lt;/code&gt; (或配置的IP和端口) 实际上会访问远程服务器的 &lt;code&gt;0.0.0.0:3001&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;guide/vscode%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%912.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;2. 远程端口转发到本地机器&lt;/h4&gt;
&lt;p&gt;将远程服务器某个端口的流量转发到本地机器的指定端口。&lt;/p&gt;
&lt;p&gt;在您的 &lt;code&gt;.ssh/config&lt;/code&gt; 文件中，为目标主机添加或修改以下行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host your_remote_host_alias
    HostName your_remote_host_ip_or_domain
    User your_username
    RemoteForward 0.0.0.0:7891 127.0.0.1:7890
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RemoteForward 0.0.0.0:7891 127.0.0.1:7890&lt;/code&gt; 表示将&lt;strong&gt;远程服务器&lt;/strong&gt;所有网络接口的 &lt;code&gt;7891&lt;/code&gt; 端口的流量转发到&lt;strong&gt;本机&lt;/strong&gt; &lt;code&gt;127.0.0.1&lt;/code&gt; (localhost) 的 &lt;code&gt;7890&lt;/code&gt; 端口。
&lt;ul&gt;
&lt;li&gt;第一个 &lt;code&gt;0.0.0.0:7891&lt;/code&gt; 指的是远程服务器监听的地址和端口。&lt;/li&gt;
&lt;li&gt;第二个 &lt;code&gt;127.0.0.1:7890&lt;/code&gt; 指的是本地目标地址和端口。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;连接到此 SSH 主机后，当远程服务器的 &lt;code&gt;0.0.0.0:7891&lt;/code&gt; 端口收到请求时，流量会被转发到您本地机器的 &lt;code&gt;7890&lt;/code&gt; 端口。&lt;/p&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>查看qq空间历史说说</title><link>https://blog.zzboy.tk/posts/%E6%9F%A5%E7%9C%8Bqq%E7%A9%BA%E9%97%B4%E5%8E%86%E5%8F%B2%E8%AF%B4%E8%AF%B4/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/%E6%9F%A5%E7%9C%8Bqq%E7%A9%BA%E9%97%B4%E5%8E%86%E5%8F%B2%E8%AF%B4%E8%AF%B4/</guid><description>查看qq空间历史说说</description><pubDate>Tue, 24 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;查看qq空间历史说说&lt;/h1&gt;
&lt;p&gt;打开浏览器开发者工具，点击与我相关。在网络控制台搜索 &lt;code&gt;dmain.offset&lt;/code&gt;
&lt;img src=&quot;guide/202409241601.png&quot; alt=&quot;alt text&quot; /&gt;
第二个js文件就是，点击后右侧面板会定位到该文件
&lt;img src=&quot;guide/202409241602.png&quot; alt=&quot;alt text&quot; /&gt;
点击响应的空白处，点击&lt;code&gt;在&quot;来源&quot;面板中打开&lt;/code&gt;。在搜索框中搜索&lt;code&gt;dmain.offset&lt;/code&gt;，找到对应的行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;p.offset = dmain ? (dmain.offset || 0) + (dmain.count || 10) : 0;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;guide/202409241603.png&quot; alt=&quot;alt text&quot; /&gt;
在此行下断点，下滑页面，会在此处断点，断到后在控制台输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dmain.offset=52700
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此处的52700是我查看的说说的总数，你可以根据你的说说总数来设置。然后点击继续，后面加载的就是你设定数量的说说了。
如果显示&lt;code&gt;没有更多动态显示&lt;/code&gt;，说明dmain.offset太大了。
如果你想快速的查看自己dmain.offset的值，可以找到
&lt;code&gt;https://user.qzone.qq.com/proxy/domain/ic2.qzone.qq.com/cgi-bin/feeds/feeds2_html_pav_all&lt;/code&gt;请求，对该请求进行重发，只需要修改请求中的offset参数即可。&lt;/p&gt;
&lt;h2&gt;注意&lt;/h2&gt;
&lt;p&gt;如果说说是已删除的，是无法点进查看原说说的。只能在该页面f12，定位到元素后查看大致的内容！&lt;/p&gt;
</content:encoded></item><item><title>给女朋友写每日推送</title><link>https://blog.zzboy.tk/posts/%E7%BB%99%E5%A5%B3%E6%9C%8B%E5%8F%8B%E5%86%99%E6%AF%8F%E6%97%A5%E6%8E%A8%E9%80%81/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/%E7%BB%99%E5%A5%B3%E6%9C%8B%E5%8F%8B%E5%86%99%E6%AF%8F%E6%97%A5%E6%8E%A8%E9%80%81/</guid><description>使用js写一个每日推送的小工具</description><pubDate>Fri, 23 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;    const gdkey = &apos;xxxx&apos; //高德地图key
    const city = &apos;xxxx&apos; //城市
    function getTimeDifferenceToNextFifteenth() {
        const today = new Date();
        const currentMonth = today.getMonth();
        const currentYear = today.getFullYear();

        // 下个月的15号
        const fifteenthNextMonth = new Date(currentYear, currentMonth + 1, 15);

        // 本月的15号
        const fifteenthThisMonth = new Date(currentYear, currentMonth, 15);

        // 如果今天是15号或之后，使用下个月的15号
        const nextFifteenth = today &amp;gt;= fifteenthThisMonth ? fifteenthNextMonth : fifteenthThisMonth;

        // 计算时间差（毫秒）
        const timeDifference = nextFifteenth - today;

        // 转换为天数
        const daysDifference = Math.ceil(timeDifference / (1000 * 60 * 60 * 24));

        return daysDifference

    }
    function calculateDaysDifference() {
        const targetDate = &quot;2024-3-22&quot;; // 指定的目标日期
        const today = new Date();
        const target = new Date(targetDate);
    
        // 计算时间差（毫秒）
        const timeDifference = today - target;
    
        // 转换为天数
        const daysDifference = Math.ceil(timeDifference / (1000 * 60 * 60 * 24));
    
        return daysDifference - 1;
    }
    

    function getDayOfWeek() {
        const date = new Date();
        const dayOfWeek = date.getDay(); // 返回值为0（周日）到6（周六）
        // 将返回值转换为1（周一）到7（周日）
        return dayOfWeek === 0 ? 7 : dayOfWeek;
    }

    function getFormattedTime() {
        const date = new Date();
        const year = date.getFullYear();
        const month = String(date.getMonth() + 1).padStart(2, &apos;0&apos;); // 月份从0开始
        const day = String(date.getDate()).padStart(2, &apos;0&apos;);
        return `${year}年${month}月${day}日`;
    }
    // http://timor.tech/api/holiday/year
    const holidaysData = {
        &quot;01-01&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;元旦&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-01-01&quot;,
            &quot;rest&quot;: 1
        },
        &quot;02-10&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;初一&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-02-10&quot;,
            &quot;rest&quot;: 4
        },
        &quot;02-11&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;初二&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-02-11&quot;,
            &quot;rest&quot;: 1
        },
        &quot;02-12&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;初三&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-02-12&quot;,
            &quot;rest&quot;: 1
        },
        &quot;02-13&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;初四&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-02-13&quot;,
            &quot;rest&quot;: 1
        },
        &quot;02-14&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;初五&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-02-14&quot;,
            &quot;rest&quot;: 1
        },
        &quot;02-15&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;初六&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-02-15&quot;,
            &quot;rest&quot;: 1
        },
        &quot;02-16&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;初七&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-02-16&quot;,
            &quot;rest&quot;: 1
        },
        &quot;02-17&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;初八&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-02-17&quot;,
            &quot;rest&quot;: 1
        },
        &quot;04-04&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;清明节&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-04-04&quot;,
            &quot;rest&quot;: 1
        },
        &quot;04-05&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;清明节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-04-05&quot;,
            &quot;rest&quot;: 1
        },
        &quot;04-06&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;清明节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-04-06&quot;,
            &quot;rest&quot;: 1
        },
        &quot;05-01&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;劳动节&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-05-01&quot;,
            &quot;rest&quot;: 17
        },
        &quot;05-02&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;劳动节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-05-02&quot;,
            &quot;rest&quot;: 1
        },
        &quot;05-03&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;劳动节&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-05-03&quot;,
            &quot;rest&quot;: 1
        },
        &quot;05-04&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;劳动节&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-05-04&quot;,
            &quot;rest&quot;: 1
        },
        &quot;05-05&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;劳动节&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-05-05&quot;,
            &quot;rest&quot;: 1
        },
        &quot;06-08&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;端午节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-06-08&quot;,
            &quot;rest&quot;: 30
        },
        &quot;06-09&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;端午节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-06-09&quot;,
            &quot;rest&quot;: 1
        },
        &quot;06-10&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;端午节&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-06-10&quot;,
            &quot;rest&quot;: 1
        },
        &quot;09-15&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;中秋节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-09-15&quot;,
            &quot;rest&quot;: 24
        },
        &quot;09-16&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;中秋节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-09-16&quot;,
            &quot;rest&quot;: 1
        },
        &quot;09-17&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;中秋节&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-09-17&quot;,
            &quot;rest&quot;: 1
        },
        &quot;10-01&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;国庆节&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-10-01&quot;,
            &quot;rest&quot;: 13
        },
        &quot;10-02&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;国庆节&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-10-02&quot;,
            &quot;rest&quot;: 1
        },
        &quot;10-03&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;国庆节&quot;,
            &quot;wage&quot;: 3,
            &quot;date&quot;: &quot;2024-10-03&quot;,
            &quot;rest&quot;: 1
        },
        &quot;10-04&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;国庆节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-10-04&quot;,
            &quot;rest&quot;: 1
        },
        &quot;10-05&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;国庆节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-10-05&quot;,
            &quot;rest&quot;: 1
        },
        &quot;10-06&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;国庆节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-10-06&quot;,
            &quot;rest&quot;: 1
        },
        &quot;10-07&quot;: {
            &quot;holiday&quot;: true,
            &quot;name&quot;: &quot;国庆节&quot;,
            &quot;wage&quot;: 2,
            &quot;date&quot;: &quot;2024-10-07&quot;,
            &quot;rest&quot;: 1
        }
    };
    function getNextHoliday() {
        const today = new Date();
        console.log(today)
        let nextHoliday = null;
        let daysDifference = null;

        for (const key in holidaysData) {
            const holiday = holidaysData[key];
            const holidayDate = new Date(holiday.date);

            if (holidayDate &amp;gt;= today) {
                console.log(holidayDate)
                if (nextHoliday === null || holidayDate &amp;lt; nextHoliday.date) {
                    nextHoliday = holiday;
                    daysDifference = Math.ceil((holidayDate - today) / (1000 * 60 * 60 * 24));
                }
                if (holidayDate === today) {
                    return `今天是【${holiday.name}】`;
                }
            }
        }

        if (nextHoliday) {
            return `距离最近的节假日是【${nextHoliday.name}】还有${daysDifference}天`;
        } else {
            return &apos;没有更多节假日&apos;;
        }
    }

    function checkIfTodayIsHoliday() {
        const today = new Date();
        const todayString = today.toISOString().split(&apos;T&apos;)[0];

        for (const key in holidaysData) {
            const holiday = holidaysData[key];
            if (holiday.date === todayString &amp;amp;&amp;amp; holiday.holiday) {
                return `今天就是【${holiday.name}】`;
            }
        }

        return getNextHoliday();
    }
    let tianqi
    try {
        allday = await request({ url: $`https://restapi.amap.com/v3/weather/weatherInfo?key=${gdkey}&amp;amp;city=${city}&amp;amp;extensions=all`,json: true });
        today = allday.body.forecasts[0].casts[0]
        console.log(today)
        tianqi = `白天${today[&apos;dayweather&apos;]}，夜晚${today[&apos;nightweather&apos;]}，最高温度${today[&apos;daytemp&apos;]}，最低温度${today[&apos;nighttemp&apos;]}，${today[&apos;daywind&apos;]}风${today[&apos;daypower&apos;]}级`
    } catch (error) { 
        console.log(error)
        tianqi = &apos;&apos;
    }

    let yiyan
    try {
        const options = {
            method: &apos;POST&apos;,
            url: &apos;xxxx&apos;,//每日一言接口
            body: &apos;xxxx&apos;,
            json: true
        };
        yiyan = await request(options);
        yiyan = yiyan.body.data.result.answer
    } catch (error) {
        yiyan = &apos;今天也是元气满满的一天哦~&apos;
    }
    // 如果getDayOfWeek的值为6或7，说明今天是周末
    const zhoumo = getDayOfWeek() === 6 || getDayOfWeek() === 7 ? &apos;今天是周末哦~&apos; : `距离【周末】还有${6 - getDayOfWeek()}天`;
    const fagongzi = getTimeDifferenceToNextFifteenth() === 0 ? &apos;今天发工资啦！&apos; : `距离【发工资】还有${getTimeDifferenceToNextFifteenth()}天`;
    const tsmsg = `[CQ:face,id=319]和宝宝相恋【${calculateDaysDifference()}】天[CQ:face,id=319]\n[CQ:face,id=351]今天是${getFormattedTime()}[CQ:face,id=351]\n[CQ:face,id=293]是本周的第${getDayOfWeek()}天[CQ:face,id=293]\n[CQ:face,id=332]${zhoumo}[CQ:face,id=332]\n[CQ:face,id=332]${fagongzi}[CQ:face,id=332]\n[CQ:face,id=332]${checkIfTodayIsHoliday()}[CQ:face,id=332]\n[CQ:face,id=333]${tianqi}[CQ:face,id=333]\n【[CQ:face,id=63]${yiyan}[CQ:face,id=63]】`

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;效果展示：
&lt;img src=&quot;guide/202408231044.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>记一次Github Actions的使用</title><link>https://blog.zzboy.tk/posts/%E8%AE%B0%E4%B8%80%E6%AC%A1github/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/%E8%AE%B0%E4%B8%80%E6%AC%A1github/</guid><description>Github Actions部署到Azure static web apps报错解决方案</description><pubDate>Tue, 13 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;使用Github Actions自动部署Fuwari博客到Azure static web apps&lt;/h1&gt;
&lt;p&gt;之前使用默认的配置都可以完成自动化部署，单身从昨天开始，Github Actions就一直报错，无法部署，查看日志，发现是有一个库的引用有问题。日志如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;5:15:55 AM [vite] Error when evaluating SSR module /github/workspace/astro.config.mjs: failed to import &quot;astro-icon&quot;
|- file:///github/workspace/node_modules/@iconify/tools/lib/svg/index.mjs:1
import cheerio from &apos;cheerio&apos;;
       ^^^^^^^
SyntaxError: The requested module &apos;cheerio&apos; does not provide an export named &apos;default&apos;
    at ModuleJob._instantiate (node:internal/modules/esm/module_job:134:21)
    at async ModuleJob.run (node:internal/modules/esm/module_job:217:5)
    at async ModuleLoader.import (node:internal/modules/esm/loader:316:24)
    at async nodeImport (file:///github/workspace/node_modules/vite/dist/node/chunks/dep-NjL7WTE1.js:52928:15)
    at async ssrImport (file:///github/workspace/node_modules/vite/dist/node/chunks/dep-NjL7WTE1.js:52786:16)
    at async eval (/github/workspace/astro.config.mjs:8:31)
    at async instantiateModule (file:///github/workspace/node_modules/vite/dist/node/chunks/dep-NjL7WTE1.js:52844:5)

[astro] Unable to load your Astro config

The requested module &apos;cheerio&apos; does not provide an export named &apos;default&apos;
  Stack trace:
    at ModuleJob._instantiate (node:internal/modules/esm/module_job:134:21)
    at async ModuleLoader.import (node:internal/modules/esm/loader:316:24)
    at async ssrImport (file:///github/workspace/node_modules/vite/dist/node/chunks/dep-NjL7WTE1.js:52786:16)
    at async instantiateModule (file:///github/workspace/node_modules/vite/dist/node/chunks/dep-NjL7WTE1.js:52844:5)


---End of Oryx build logs---
Oryx has failed to build the solution.

For further information, please visit the Azure Static Web Apps documentation at https://docs.microsoft.com/en-us/azure/static-web-apps/
If you believe this behavior is unexpected, please raise a GitHub issue at https://github.com/azure/static-web-apps/issues/
Exiting
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;搜了好久都没有解决，区fuwari的issue提问了之后，作者回复说只支持npnm,但是actions默认使用的时npm，所有需要修改actions的workflow文件，在Azure/static-web-apps-deploy@v1工作之前，添加构建步骤，将Azure/static-web-apps-deploy@v1的skip_app_build设置为true，让官方的工作流跳过构建。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    #自定义构建步骤
      - name: Install pnpm
        run: npm install -g pnpm

      - name: Install Dependencies
        run: pnpm install

      - name: Run Build
        run: pnpm build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里又遇到了新的问题，默认的app_location是/，output_location是dist,但是自定义构建输出的是工作目录的dist文件，构建完成后，官方的工作流就会显示找不到dist的文件，这里需要把app_location更改为自定义构建输出的目录，在日志中可以看到是/home/runner/work/blog/blog/dist&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#完整的workflow文件是
name: Azure Static Web Apps CI/CD

on:
  push:
    branches:
      - main
  pull_request:
    types: [opened, synchronize, reopened, closed]
    branches:
      - main

jobs:
  build_and_deploy_job:
    if: github.event_name == &apos;push&apos; || (github.event_name == &apos;pull_request&apos; &amp;amp;&amp;amp; github.event.action != &apos;closed&apos;)
    runs-on: ubuntu-latest
    name: Build and Deploy Job
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true
          lfs: false
          
      - name: Install pnpm
        run: npm install -g pnpm

      - name: Install Dependencies
        run: pnpm install

      - name: Run Build
        run: pnpm build

      - name: Build And Deploy
        id: builddeploy
        uses: Azure/static-web-apps-deploy@v1
        with:
          azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_THANKFUL_SKY_0884F7B00 }}
          repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
          action: &quot;upload&quot;
          ###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
          # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
          app_location: &quot;/home/runner/work/blog/blog/dist&quot; # App source code path
          skip_app_build: true
          ###### End of Repository/Build Configurations ######

  close_pull_request_job:
    if: github.event_name == &apos;pull_request&apos; &amp;amp;&amp;amp; github.event.action == &apos;closed&apos;
    runs-on: ubuntu-latest
    name: Close Pull Request Job
    steps:
      - name: Close Pull Request
        id: closepullrequest
        uses: Azure/static-web-apps-deploy@v1
        with:
          azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_THANKFUL_SKY_0884F7B00 }}
          action: &quot;close&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Nginx反代Fastapi</title><link>https://blog.zzboy.tk/posts/nginx%E5%8F%8D%E4%BB%A3fastapi/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/nginx%E5%8F%8D%E4%BB%A3fastapi/</guid><pubDate>Mon, 12 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Nginx配置文件&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;location ^~ /api
{
    proxy_pass http://127.0.0.1:7899;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    # proxy_hide_header Upgrade;

    add_header X-Cache $upstream_cache_status;

    #Set Nginx Cache
    
    
    set $static_filevM0NQDr8 0;
    if ( $uri ~* &quot;\.(gif|png|jpg|css|js|woff|woff2)$&quot; )
    {
        set $static_filevM0NQDr8 1;
        expires 1m;
        }
    if ( $static_filevM0NQDr8 = 0 )
    {
    add_header Cache-Control no-cache;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此配置文件Fastapi可以获取到真实的IP地址和host以及Scheme，同时支持http2.0协议，支持缓存静态文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;request.url.scheme+&quot;://&quot;+request.url.netloc
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>实用的浏览器插件</title><link>https://blog.zzboy.tk/posts/%E5%AE%9E%E7%94%A8%E7%9A%84%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/%E5%AE%9E%E7%94%A8%E7%9A%84%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/</guid><pubDate>Thu, 08 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;cat-catch&lt;/h1&gt;
&lt;p&gt;浏览器嗅探工具，能够帮你筛选列出当前页面的资源。
&lt;img src=&quot;guide/20240808153550.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;xifangczy/cat-catch&quot;}&lt;/p&gt;
</content:encoded></item><item><title>一些实用的windows工具</title><link>https://blog.zzboy.tk/posts/tools-used/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/tools-used/</guid><pubDate>Wed, 07 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;WizTree&lt;/h1&gt;
&lt;p&gt;Windows磁盘分析工具，可快速分析出磁盘中的大文件，方便清理。
&lt;img src=&quot;guide/20240807160121.png&quot; alt=&quot;alt text&quot; /&gt;
&amp;lt;a href=&quot;/wiztree_4_20_portable.zip&quot; target=&quot;_blank&quot;&amp;gt;下载链接（WizTree）&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h1&gt;Everything&lt;/h1&gt;
&lt;p&gt;Windows文件搜索工具，可以快速搜索文件，支持正则表达式。
&lt;img src=&quot;guide/everything.png&quot; alt=&quot;alt text&quot; /&gt;
&amp;lt;a href=&quot;/Everything-1.4.1.1026.x64.zip&quot; target=&quot;_blank&quot;&amp;gt;下载链接（everything）&amp;lt;/a&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Fuwari 首次使用体验</title><link>https://blog.zzboy.tk/posts/20240801/</link><guid isPermaLink="true">https://blog.zzboy.tk/posts/20240801/</guid><pubDate>Thu, 01 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;一个小的测试&lt;/h1&gt;
&lt;p&gt;测试&lt;/p&gt;
</content:encoded></item><item><title>Markdown Extended Features</title><link>https://blog.zzboy.tk/posts/markdown-extended/</link><guid isPermaLink="true">https://blog.zzboy.tk/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>Expressive Code Example</title><link>https://blog.zzboy.tk/posts/expressive-code/</link><guid isPermaLink="true">https://blog.zzboy.tk/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.zzboy.tk/posts/guide/</link><guid isPermaLink="true">https://blog.zzboy.tk/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.zzboy.tk/posts/markdown/</link><guid isPermaLink="true">https://blog.zzboy.tk/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.zzboy.tk/posts/video/</link><guid isPermaLink="true">https://blog.zzboy.tk/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>