<?xml version="1.0" encoding="utf-8"?>
<ul>
  <li>这篇博客已经内置GitHubPages自动部署工作流：只要代码推送到main分支，Actions会自动完成Jekyll构建、JS/CSS压缩和站点发布。下面按实际部署顺序走一遍，最后是我踩过或者最容易踩的坑。一、准备仓库先把博客源码推送到GitHub仓库：gitinitgitadd.gitcommit-m"initblog"gitbranch-Mmaingitremoteaddorigingit@github.com:&lt;用户名&gt;/&lt;仓库名&gt;.gitgitpush-uoriginmain注意：如果想按本文的根路径方式部署，新建仓库名必须使用：&lt;username&gt;.github.io例如GitHub用户名是zjc，仓库名就应该是zjc.github.io。原因是GitHubPages会把这种命名的用户仓库识别为个人主站点，最终访问地址是：https://&lt;username&gt;.github.io/如果仓库名叫blog，它会变成项目站点，访问地址是：https://&lt;username&gt;.github.io/blog/这时静态资源都会多出/blog/这个前缀，博客的baseurl也必须配置成/blog，否则样式、搜索和ServiceWorker都可能404。如果仓库是从别人那里Fork来的，先确认：默认分支是不是main。仓库的Actions页面有没有被禁用，需要手动点击Enableworkflows。.github/workflows/pages.yml、Gemfile、package.json、package-lock.json是否都存在。本博客不是纯默认Jekyll站点，它包含_plugins/md5_permalink.rb自定义插件和Node压缩脚本，所以部署必须走仓库里的GitHubActions工作流。二、开启GitHubPages打开GitHub仓库：Settings-&gt;Pages-&gt;Buildanddeployment-&gt;Source选择：GitHubActions不要选择Deployfromabranch。这个博客需要在构建阶段执行自定义Ruby插件和esbuild压缩，直接从分支部署静态文件会绕过这些步骤。设置完成后，pages.yml工作流才会被GitHubPages正确接收产物。三、理解自动部署流程核心工作流在：.github/workflows/pages.yml关键步骤如下：steps:-name:SetupRubyuses:ruby/setup-ruby@v1with:ruby-version:"2.7"-name:SetupNodeuses:actions/setup-node@v4with:node-version:"22"cache:npm-name:BuildJekyllsiterun:|bundleinstallJEKYLL_ENV=productionbundleexecjekyllbuild--destination_sitenpmcinpmrunminify--_site它的执行顺序是：检出main分支代码。安装Ruby2.7和Bundler依赖。安装Node22和npm依赖。使用Jekyll3.8.5构建站点到_site。使用esbuild压缩自定义JS、CSS和service-worker.js。上传_site作为PagesArtifact。调用actions/deploy-pages@v4发布站点。之后每次推送main，都会自动触发部署；也可以在：Actions-&gt;BuildanddeployPages-&gt;Runworkflow手动触发一次。四、配置自定义域名默认地址是：https://&lt;用户名&gt;.github.io或者：https://&lt;用户名&gt;.github.io/&lt;仓库名&gt;/如果要使用自己的域名，例如uhaiin.com，在仓库里配置：Settings-&gt;Pages-&gt;Customdomain填写域名后，GitHub会提示需要添加的DNS记录。以根域名绑定Pages为例，通常需要给域名服务商配置GitHubPages的A记录；如果绑定www或其他子域名，则配置CNAME记录到：&lt;用户名&gt;.github.ioDNS生效后，回到Settings-&gt;Pages：确认Customdomain显示绿色可用状态。勾选EnforceHTTPS。等证书签发完成，通常需要几分钟到几十分钟。具体DNS记录值以GitHubPages设置页显示的内容为准，GitHub官方记录有可能调整，不要盲目抄旧文章里的IP。五、修改站点域名配置这个博客有两个和地址有关的配置：domainUrl:''baseurl:''如果绑定根域名，例如uhaiin.com，建议这样配置：domainUrl:'https://uhaiin.com'baseurl:''domainUrl主要用于RSS和sitemap生成完整链接；baseurl会影响页面资源、菜单、ServiceWorker和文章资源路径。如果部署到项目路径，例如：https://&lt;用户名&gt;.github.io/blog/则必须配置：baseurl:'/blog'否则CSS、JS、搜索索引和ServiceWorker都可能按根路径请求，出现样式丢失或功能异常。六、部署完成后检查打开站点后，建议按下面顺序检查：首页能正常打开，样式没有丢。点一篇文章，确认文章URL是32位MD5路径。文章里的图片能显示，资源路径应该类似/posts/年/月/日/文件名。搜索页输入关键词，确认搜索索引可以请求。代码块语言高亮和复制按钮正常。文章二维码可以生成，扫码打开的是当前部署地址。明暗主题切换后刷新页面，偏好还能保留。浏览器控制台没有CSS404、JS404或ServiceWorker注册失败。如果某些页面还是旧内容，先强制刷新；仍不更新时，再检查ServiceWorker缓存。七、踩坑点1.PagesSource选错症状：工作流执行成功，但Pages一直是旧页面，或者提示没有部署分支。原因是Source选择了Deployfromabranch。这个博客必须选择：GitHubActions2.推送分支不是main工作流触发条件写的是：on:push:branches:-main如果代码在master或其他分支，Actions不会自动部署。要么把默认分支改成工作流里的分支，要么修改branches配置。3.工作流权限被收紧工作流需要这些权限：permissions:contents:readpages:writeid-token:write如果组织或仓库策略把pages:write、id-token:write禁掉，部署会在上传或发布阶段失败。需要在仓库或组织层面允许Pages写入和OIDC认证。4.使用默认Jekyll构建，MD5链接失效这个博客的文章URL由_plugins/md5_permalink.rb生成。如果绕过仓库里的工作流，让GitHub使用默认Jekyll构建流程，自定义插件不会执行，文章链接就会退回日期路径，首页、RSS、sitemap和二维码对应关系都会乱掉。5.Windows换行符影响MD5文章链接是根据Markdown源文件内容计算的。插件已经把CRLF统一成LF后再计算MD5，所以Windows本地和LinuxActions的构建结果保持一致。但要注意：不要手工修改_site产物，也不要把_site提交回仓库。部署产物每次都会重新生成，改源文件才是正确入口。6.改一个错别字，文章链接就变了这是本博客当前的设计，不算是bug：文章源文件内容变化，MD5就变化。文章分享链接会变化。文章二维码也会指向新链接。旧文章路径不会被自动重定向。所以发布前尽量确认内容已经稳定；发布后再改错别字，就要接受旧链接失效，或者自己维护一套固定永久链接。7.项目路径部署忘记baseurl如果站点最终运行在：https://&lt;用户名&gt;.github.io/&lt;仓库名&gt;/而baseurl还是空字符串，页面会去根路径找静态资源，典型表现是：页面没有样式。控制台大量CSS404。搜索接口404。ServiceWorker注册失败。项目路径部署时，baseurl必须等于仓库路径。8.自定义域名DNS未生效DNS配置后可能因为缓存没有立即生效。排查顺序：用nslookup或在线DNS查询工具确认记录已经扩散。回到GitHubPages设置页看Customdomain状态。等待HTTPS证书签发。清理浏览器缓存或换无痕窗口访问。不要在DNS未生效时反复删除又绑定域名，反而可能让证书状态更混乱。9.ServiceWorker只适合HTTPSServiceWorker要求站点运行在HTTPS或localhost下。GitHubPages默认支持HTTPS，绑定自定义域名后也要开启EnforceHTTPS，否则二维码、离线缓存等依赖页面环境的功能可能不稳定。10.忘记提交package-lock.jsonActions里使用的是：npmci这个命令依赖package-lock.json。如果锁文件没有提交，CI会直接失败。压缩依赖版本固定在package.json和锁文件里，两个文件要一起提交。八、出问题先看Actions日志打开：Actions-&gt;BuildanddeployPages点击失败的那次运行，再看具体失败步骤：BuildJekyllsite失败：多半是Ruby依赖、Markdown、Liquid或插件问题。npmci失败：检查package.json和package-lock.json是否同步提交。Uploadsite或DeployPages失败：优先检查PagesSource、分支和权限。部署成功但页面异常：打开浏览器开发者工具，看Network和Console里的404。只要Actions日志里BuildanddeployPages全绿，GitHubPages侧基本已经完成发布；剩下的问题通常在域名、路径配置或浏览器缓存。</li>
  <li>快捷键：Win+i直接打开设置，按下面顺序操作，拒绝C盘爆红、广告弹窗、开机卡顿。一、系统更新、激活、卸载预装垃圾Windows更新→检查更新，把系统、驱动全部装好，反复重启直到没有更新；不要彻底关闭Windows更新，可临时暂停更新。确认Windows激活；有预装Office，登录微软账号完成Office激活。设置→应用→已安装应用，卸载品牌预装试用杀毒（迈克菲等）、推广管家、多余试用软件。&gt;Windows自带Defender足够安全，不建议装第三方杀毒管家。二、显示设置设置→系统→显示分辨率：调到显示器推荐分辨率。高级显示器→选择显示器，把刷新率调到最大值（很多新机默认锁60Hz）。缩放：笔记本按推荐缩放（125%/150%），字体才清晰。三、存储优化设置→系统→存储打开存储感知，配置：自动删除临时文件、回收站超过30天文件，设置每天执行，自动清理垃圾。如果整机只有C盘：Win+X→磁盘管理，压缩卷分出D盘，不懂问我，操作错误系统可能不可用四、电源与睡眠设置→系统→电源和电池游戏本/台式插电：电源模式选最佳性能；笔记本电池用均衡/最佳能效。屏幕、睡眠：按需设置；挂机下载可以改成“从不”。笔记本：接通电源尽量用高性能，电池模式兼顾续航。五、关闭广告、隐私追踪设置→隐私和安全性常规：4个开关全部关闭（广告ID、启动跟踪、应用启动追踪等）。诊断与反馈：关闭可选诊断数据，关闭反馈提醒。权限：相机、麦克风、位置，只给真正需要的软件，其余关闭。设置→系统→通知：可以关闭总通知开关，或只保留少数软件通知，大幅减少弹窗广告。个性化清理界面设置→个性化任务栏：关闭小组件、不需要的搜索；任务栏行为可以改成任务栏图标不合并，更像Win10习惯。开始：关闭“显示建议内容”，关掉推荐广告。锁屏界面：背景改为图片，关闭Windows聚焦趣闻、广告推送。六、开机速度优化两种方式任选其一：设置→应用→启动，把不需要开机启动全部关掉（聊天软件、网盘、厂商管家等）。Ctrl+Shift+Esc打开任务管理器→启动应用，启动影响高的非必要程序禁用。不要全部禁用，声卡、输入法、指纹识别驱动保留启用。七、网络更新优化设置→Windows更新→高级选项→传递优化，关闭“允许从其他电脑下载”，防止偷偷占上传网速。八、桌面图标显示设置→个性化→主题→桌面图标设置，勾选此电脑、回收站，桌面就显示计算机图标。九、避坑提醒❌不要随便网上下载“Win11一键优化工具”，很多捆绑垃圾软件。❌不要直接禁用Windows更新服务，会缺失安全补丁。十、常用软件及设置卸载软件工具:双击对应的软件卸载，下载地址https://geekuninstaller.com/卸载系统没用软件软件，特别是很多没用的东西，双击卸载，等待卸载完成并清理相应的残留WinRAR解压软件，下载地址：https://www.win-rar.com/start.html?&amp;L=7安装时候注意设置右键的菜单，不要勾选其余设置，参考：只保留常用的菜单系统优化软件dism++，下载地址：点击下载下载具体设置路径如下：设置项参考：其他设置Win11恢复Win10经典完整右键菜单1.开始菜单搜索终端，右键→以管理员身份运行2.复制下面整段粘贴进去，回车执行：regadd"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"/ve/tREG_SZ/d""/f3.再执行这条重启资源管理器，立刻生效（桌面会闪一下）：taskkill/f/imexplorer.exe&amp;startexplorer.exe</li>
  <li>Ubuntu24使用netplan，yaml格式严格缩进，不能用Tab，只能空格！Linux设置静态IP，就是让机器重启后地址不变。方便SSH远程连接，不用每次查IP。搭建网站、数据库、集群服务时，其他设备能稳定访问。防火墙规则、端口映射、内网同步任务也不会因IP变动失效。缺点是要规划地址，容易出现IP冲突。第一步：设置VMware的虚拟网络打开VMware，进入编辑-&gt;虚拟网络编辑器：按照下图进行配置，其中子网IP192.168.100.0决定了以后的网段：配置完上述设置后，进行NAT设置，主要配置网关地址：完整的配置参考：第二步：修改Ubuntu网卡信息主要是查看网卡的名称，修改对应的Ubuntu的网卡配置信息，最后重启网卡。查看网卡ipaddr运行该命令后会输出网卡的基本信息，找到你的网卡名称，如我的输出如下：zjc@ubuntu-24-dev:~$ipaddr1:lo:&lt;LOOPBACK,UP,LOWER_UP&gt;mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforeverinet6::1/128scopehostnoprefixroutevalid_lftforeverpreferred_lftforever2:ens32:&lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt;mtu1500qdiscfq_codelstateUPgroupdefaultqlen1000link/ether00:0c:29:a2:18:d1brdff:ff:ff:ff:ff:ffaltnameenp2s0inet192.168.100.128/24brd192.168.100.255scopeglobalens32valid_lftforeverpreferred_lftforeverinet6fe80::20c:29ff:fea2:18d1/64scopelinkvalid_lftforeverpreferred_lftforever那么我的网卡名称就是ens32，接下来修改配置时候要看准这个网卡，不要修改错误。查看并修改网卡配置文件首先进入网卡的配置目录/etc/netplan/，然后拷贝一份保存起来，防止修改出错后以后上不了网，再进行编辑：zjc@ubuntu-24-dev:/etc/netplan$cd/etc/netplan/zjc@ubuntu-24-dev:/etc/netplan$pwd/etc/netplanzjc@ubuntu-24-dev:/etc/netplan$ls50-cloud-init.yamlzjc@ubuntu-24-dev:/etc/netplan$cp50-cloud-init.yaml50-cloud-init.yaml.bakzjc@ubuntu-24-dev:/etc/netplan$ls50-cloud-init.yaml50-cloud-init.yaml.bak备份完成后，使用vim编辑配置并保存，修改后的配置示例如下：network:version:2ethernets:ens32:dhcp4:falsedhcp6:falseaddresses:[192.168.100.128/24]optional:trueroutes:-to:defaultvia:192.168.100.2nameservers:addresses:[114.114.114.114,8.8.8.8]注意：Ubuntu进来默认不是root用户，如果执行命令遇到没有权限Permissiondenied则需要使用sudo进行授权。配置项说明：ens32：你的网卡名192.168.100.128/24：自选静态IP（和VMnet8同网段）via:192.168.100.2：VMwareNAT网关重启网卡一般是先测试网卡，没有问题再正式执行重启命令生效：#测试配置，出错30秒自动回滚sudonetplantry网络正常就回车确认永久生效。测试没问题也可以直接执行：sudonetplanapply验证网络ipaddr#查看IP是否生效ping192.168.100.2#测试通网关pingwww.baidu.com#测试外网ipaddr能正常显示网卡的IP为192.168.100.128则正常，ping网关和外网返回如下则正常：zjc@ubuntu-24-dev:~$ping192.168.100.2PING192.168.100.2(192.168.100.2)56(84)bytesofdata.64bytesfrom192.168.100.2:icmp_seq=1ttl=128time=0.132ms64bytesfrom192.168.100.2:icmp_seq=2ttl=128time=0.185ms64bytesfrom192.168.100.2:icmp_seq=3ttl=128time=0.205ms64bytesfrom192.168.100.2:icmp_seq=4ttl=128time=0.225ms64bytesfrom192.168.100.2:icmp_seq=5ttl=128time=0.237ms64bytesfrom192.168.100.2:icmp_seq=6ttl=128time=0.208ms^C---192.168.100.2pingstatistics---6packetstransmitted,6received,0%packetloss,time5157msrttmin/avg/max/mdev=0.132/0.198/0.237/0.033mszjc@ubuntu-24-dev:~$pingwww.baidu.comPINGwww.a.shifen.com(183.2.172.177)56(84)bytesofdata.64bytesfrom183.2.172.177:icmp_seq=1ttl=128time=11.7ms64bytesfrom183.2.172.177:icmp_seq=2ttl=128time=7.23ms64bytesfrom183.2.172.177:icmp_seq=3ttl=128time=10.5ms64bytesfrom183.2.172.177:icmp_seq=4ttl=128time=8.14ms64bytesfrom183.2.172.177:icmp_seq=5ttl=128time=8.70ms^C---www.a.shifen.compingstatistics---5packetstransmitted,5received,0%packetloss,time4007msrttmin/avg/max/mdev=7.228/9.260/11.710/1.631ms踩坑点yaml缩进必须空格，禁止Tab，格式错直接断网IP、网关必须和VMnet8网段一致，否则不通静态IP不要落在VMwareDHCP地址池范围内，防止IP冲突想宿主机SSH连接虚拟机：确保VMnet8网卡启用</li>
</ul>