[{"content":"前言 在经历了一年的wordpress体验之后，我最后还是换到了Hugo，一方面因为wordpress对于我2c2g的小机来说确实压力有点大了，而且我的云数据库块过期了，不打算续费了。另一方面wp确实让我很没有写作的欲望，还是直接写MarkDown来的爽👍 （MarkDown Yes！）\n这篇文章主要用于记录站点历史吧\nWordPress官网 | WordPress.com: Everything You Need to Build Your Website Hugo官网 | The world\u0026rsquo;s fastest framework for building websites WordPress使用体验 作为超级经典的CMS，wp的整体功能和主题丰富程度是非常棒的，同时还有非常庞大的插件市场。 wp的教程和文章在网上可以说是非常之多了，基本上遇到的问题和需求都能有现成的解决方案，这也是经典框架的好处吧。（PHP is the best language in the world！） 前本站使用的就是WP+Sakurairo主题的方案部署在服务器上，然后套了两层CDN提高用户体验。 响应上使用了 WP Super Cache 插件缩短响应时间， YoastSEO 来优化SEO。整体体验对于阅读者来说还是很不错的，CDN和WP Super Cache双层缓存使得响应迅速，主题的细节处理使得网站的交互性比较好动画也比较丝滑，整体的SEO优化也是不错的 (在SEO上我做的确实比较懒) 然后就是后台响应问题了，wp的后台加载比较缓慢，这是让我体验很差的一个点，当然这也要归咎于我的经费不足，只能上廉价的小🐔，体会过才能知道这种痛~，就像骑共享单车遇到大上坡一样的无力感。 这也间接导致了这次网站的迁移，但是这次迁移的导火索却不是这个问题；最直接的原因是我的SSL证书过期了，直接导致了网站的访问出现了问题，按理来说切换到http也能正常访问，但是不知道哪一个部分的配置出现了问题，导致通过http连接的话整个布局就错误了，猜想应该是布局文件无法正常加载了，如此种种下来，我决定了将本站迁移到更加方便的平台。\nHugo：世界上构建网站最快的框架 这是hugo官网对于这个框架的描述，也得益于Go语言的特性，超快的编译速度。由于其编译后的网站本质上就是静态网站，所以其经常被部署于各大免费web平台例如Github Page、vercel、Netlify、deno等\n官方文档中的部署\n静态网站的优点很明确 无论是在响应速度还是成本上，都是动态网站无法比较的，快是真的快啊，使用主题也可以获得很丝滑的体验，由于没有直接后端，整个网站的安全性也是可以得到极大的保障的，也不用各种折腾防止服务器被攻击或者IP泄露，例如之前写的分线CDN解析 此外直接写Markdown对我来说简直不要太爽，可以在任何平台想写的时候打开编辑器直接开写，就算没有配置一键上传文章也可以直接复制粘贴MD文件到hugo目录里，非常方便！\n静态网站的缺点也不可忽视 首先是图片问题，不像各种管理系统，静态站点的图片需要自己维护，例如搭建图床什么的，单纯使用文件目录存储图片的话等到文章非常多的时候就会出现一些问题，我目前还没有解决图片问题最优雅的方案，计划是搭建一个图床来存储站点所有的图片，目前本站图片的来源也相对来说比较乱，这就只能等我日后有空了再折腾了。\n其次就是动态数据的问题，这应该包括评论等功能，静态意味着评论等功能就需要第三方服务的支持，其他的类似功能也是一样，但从另一个方面来看，这也是玩静态网页不得不品的一环，折腾之路从未停止。。。\n本站点使用的方案 本站使用的是Obisidian + Hugo + Gitee同步Github的方案，那么有的小伙伴就要问了，你为什么要用两个代码库啊？这不是脱了裤子放屁多此一举吗！？ 这还真不是我多次一举，最初在选择部署平台上我在Vercel和Netlity中选择了Netlity，原因很简单，Vercel在国内经常访问不上，所以选择了Netlity\n但是这就有一个很大的问题了，因为他只支持Github仓库和另外两种仓库的导入，但是Github由于某些不可抗力因素平时访问非常不稳定，经常push不了也pull不下来，这就需要提到Gitee的一个功能了，那就是同步Github仓库，就我目前的体验上来看还是非常的不错的。\nObisidian配合静态网站生成器生成静态网站也是老生常谈的操作了，网上教程非常之多我也不过多赘述了。重点是Ob配合插件实现随时随地任何设备都能写文章这件事真的非常爽。\n主题使用的是stack，经过我的 爆改 微调更加符合我的个人审美，并且加入了一些小动画增加了网站的互动感吧。\n插件方面配合Hugo和go特性的Module加入了一些有意思的组件，后续估计还会加入一些有意思的小功能。\n迁移 迁移使用的工具为wordpress-to-hugo-exporter，这是一个开源项目，在hugo的文档中亦有记载Migrate to Hugo 导出效果其实一般，但也足够了，我的导出的文件如下图所示 主要重点在于文章的导出部分，这里的图片URL会有一点问题\n导出的图片都会变成类似以下的格式\n1 \u0026lt;img loading=\u0026#34;lazy\u0026#34; decoding=\u0026#34;async\u0026#34; width=\u0026#34;333\u0026#34; height=\u0026#34;46\u0026#34; src=\u0026#34;https://www.whitepeach.top/wp-content/uploads/2024/05/1716789590-image.png\u0026#34; alt=\u0026#34;\u0026#34; class=\u0026#34;wp-image-39\u0026#34; srcset=\u0026#34;https://www.whitepeach.top/wp-content/uploads/2024/05/1716789590-image.png 333w, https://www.whitepeach.top/wp-content/uploads/2024/05/1716789590-image-300x41.png 300w\u0026#34; sizes=\u0026#34;auto, (max-width: 333px) 100vw, 333px\u0026#34; /\u0026gt; \u0026lt;/figure\u0026gt; 很明显这是wp的图片格式直接照搬过来了，这就比较头疼了，虽然导出连带着图片一起导出了，但是在引用上会存在一点问题，并且也不利于日后的维护，这意味着需要手动将这些图片都改掉，这并不是一个较小的工作量，目前是采用了临时解决方案，等之后搭建图床时再考虑将这些图片资源迁移至新家。 除此之外的所有出站链接也都是有问题的，由于采用了原生HTML，导致主题的部分样式无法正常应用，文章的部分头信息也有问题，字段无法对应，可能是hugo版本更新导出器没有及时更新字段导致的问题。\n后话 属于是给自己又开了一个新大坑了，或许在未来本站又会迁移到新的架构上，目前主要的目标还是先折腾hugo吧，整个框架还是非常有可拓展性的，换句话说可玩性是非常高的，应该足够我探索很长一段时间了。\n","date":"2025-06-21T00:00:00Z","image":"https://www.whitepeach.top/post/wordpress2hugo/cover_hu_945b521f7ae76499.png","permalink":"https://www.whitepeach.top/post/wordpress2hugo/","title":"Wordpress迁移到Hugo"},{"content":"Windows PowerShell 是一种易于使用的命令行 shell 和脚本环境，用于自动执行基于 Windows 的系统的管理任务。 Windows PowerShell 预安装在 Windows 操作系统的所有新式版本上。\n但是win10默认的powershell5.1太丑了——如图：\n🎈美化后的效果展示：\n👨‍🍳食材准备： 首先放出官网的链接:\nPowerShell7: PowerShell/PowerShell: PowerShell for every system! Nerd Fonts: Nerd Fonts - Iconic font aggregator, glyphs/icons collection, \u0026amp; fonts patcher oh my posh: Home | Oh My Posh 一、安装PowerShell7： PowerShell 版本 7 不是 Windows PowerShell 5.1 的替代项;它与 Windows PowerShell 并行安装。 Windows PowerShell 版本 5.1 和 PowerShell 版本 7 是两种不同的产品。\n首先需要确认一下PowerShell的版本：\n打开Power Shell并输入 $PSVersionTable 显示版本如下图所示\n其中PSVersion 就是我们的PowerShell版本了，可以看到我这里的版本是5.1，win10默认的版本就是5.1，随后我们需要将其升级到7.x\n有两种安装方式（推荐第一种比较省事）\n第一种: 直接打开Microsoft Store 搜索PowShell，点击安装，然后你就完成了一次酣畅淋漓的安装\n第二种就是从官方的Github库下载，链接在上文中，从releases中选择一个版本安装，建议不要安装预发布版，也就是右侧带有Pre-releases小黄图标的版本\n一般选择latest即可，例如我这里选择的就是V7.4.6\n下载你的操作系统对应的构建，一般跟我一样选择win-x64即可，msi是引导安装软件形式，zip是无需安装解压即用形式，理论上都可以，这里选择软件安装不用自己配置环境变量\n下载完成打开后傻瓜式安装（一路NEXT总不会有人不会吧）\n安装后你的菜单应该会出现PowerShell7，或者你也可以用WIN+R组合键打开pwsh，如下图所示，正常情况会自动输出版本号，如果跟下载安装的版本号一样就是安装成功了\n🎉恭喜到这里我们就完成PowerShell7的安装了\n二、安装oh-my-posh oh-my-posh是一个shell个性化工具，官方描述为适用于任何 shell 的提示主题引擎。\n安装方式同样与PowerShell大差不差，也可以从微软商店和从GitHub下载，官方文档还会让你使用winget下载，想尝试的小伙伴可以自己折腾一下\n用微软商店安装（建议）：\n从GitHub release 下载：\n使用 oh-my-posh --version 检验安装\n接下来就需要配置oh-my-posh了，有能力的朋友可以参照官方文档按照自己的喜好配置。\noh-my-posh被设计为使用 Nerd 字体。 Nerd 字体是流行的字体，经过修补以包含图标。要想看见 oh-my-posh 中显示的图标，我们需要安装Nerd Font。\n这里可以在Nerd Font选择一个自己喜欢的字体下载，当然oh-my-posh也内置了字体下载CLI，只需要在shell键入 oh-my-posh font install 即可选择下载自己需要的字体\n然后我们需要创建一个配置文件，使用 New-Item -Path $PROFILE -Type File -Force 创建一个新的配置文件，使用任意文本编辑器打开它，例如：notepad $PROFILE 或 code $PROFILE\n向配置中写入oh-my-posh init pwsh | Invoke-Expression\n这条命令用于初始化和配置 oh-my-posh\noh-my-posh init pwsh：这部分命令初始化 oh-my-posh 并指定使用 PowerShell (pwsh) 作为 shell。 Invoke-Expression：这部分命令将前面的输出作为 PowerShell 命令来执行。\n整体上，这条命令的作用是加载并应用 oh-my-posh 的配置。\n在vscode的shell也能看见效果 🎉至此整个shell已经比最开始好看很多了，接下来可以进行一些进一步的个性化配置\n三、其他配置 配合Terminal使用：\n同样微软商店下载即可，然后你就获得了一个win11同款terminal，可以在设置中设置亚克力背景等，留给各位自行探索。\n主题配置：\n使用 Get-PoshThemes 命令可以获取主题预览，应用主题配置只需要修改上面的配置文件为（以jandedobbeleer示例）\noh-my-posh init pwsh --config \"$env:POSH_THEMES_PATH/jandedobbeleer.omp.json\" | Invoke-Expression 其他还有很多可以优化（折腾）的配置，就留给各位朋友自行探索吧\n🎉恭喜！到这里你的终端就配置好了！ ","date":"2025-01-17T09:19:38Z","image":"https://www.whitepeach.top/post/windows10-powershell-upgrade/cover_hu_b827e383ffe25f71.png","permalink":"https://www.whitepeach.top/post/windows10-powershell-upgrade/","title":"Windows10 PowerShell升级美化指北（喂饭级教程）"},{"content":"先上效果图 代码如下： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 \u0026lt;pre class=\u0026#34;wp-block-code\u0026#34;\u0026gt;\u0026lt;code\u0026gt;\u0026amp;lt;script setup\u0026gt; import { ref } from \u0026#39;vue\u0026#39; const props = defineProps({ title: String, //标题 siteUrl: String, //点击跳转Url imageUrl: String, //背景图片Url }) const x = ref(0) //卡片X轴旋转角度 const y = ref(0) //卡片Y轴旋转角度 const z = ref(1) //卡片放大倍数 const light = ref(0) //高光角度 /** * 卡片随鼠标3D效果 * @param e */ function onMousemove(e) { // 获取dom元素 let box = e.target.getBoundingClientRect(); // 获取鼠标位置并计算卡片旋转角度 y.value = (e.clientX - box.x - (box.width / 2)) / 10 * -1; x.value = (e.clientY - box.y - (box.height / 2)) / 10; //卡片放大 z.value = 1.1; //计算高光 light.value = (box.height * box.y) / 60; } /** * 鼠标离开时复原 * @param e */ function onMouseleave(e) { // 鼠标离开时还原 x.value = y.value = 0; z.value = 1; light.value = 0; } \u0026amp;lt;/script\u0026gt; \u0026amp;lt;template\u0026gt; \u0026amp;lt;!-- 卡片层 --\u0026gt; \u0026amp;lt;a class=\u0026#34;card h-40 w-40 m-10 shadow-lg shadow-gray-500 rounded-2xl\u0026#34; @mousemove=\u0026#34;onMousemove\u0026#34; @mouseleave=\u0026#34;onMouseleave\u0026#34; :href=\u0026#34;siteUrl\u0026#34; target=\u0026#34;_blank\u0026#34; :style=\u0026#34;{ transform: `rotateX(${x}deg) rotateY(${y}deg) scale(${z})` }\u0026#34;\u0026gt; \u0026amp;lt;!-- 渐变层 --\u0026gt; \u0026amp;lt;div class=\u0026#34;card-shine z-10 absolute top-0 bottom-0 left-0 right-0 rounded-2xl border-2 border-solid border-slate-400\u0026#34; :style=\u0026#34;{ background: `linear-gradient(${light}deg,rgba(0,0,0,0.3),rgba(241,241,241,0.3))` }\u0026#34;\u0026gt;\u0026amp;lt;/div\u0026gt; \u0026amp;lt;!-- 阴影层 --\u0026gt; \u0026amp;lt;div class=\u0026#34;card-shadow absolute shadow-2xl shadow-slate-50 opacity-25\u0026#34;\u0026gt;\u0026amp;lt;/div\u0026gt; \u0026amp;lt;!-- 图片层 --\u0026gt; \u0026amp;lt;div class=\u0026#34;card-layer -z-10 relative w-full h-full rounded-2xl bg-cover\u0026#34; :style=\u0026#34;{ backgroundImage: `url(${imageUrl})` }\u0026#34;\u0026gt;\u0026amp;lt;/div\u0026gt; \u0026amp;lt;!-- 标题 --\u0026gt; \u0026amp;lt;div class=\u0026#34;card-title z-20 absolute bottom-0.5 left-0.5 right-0.5 backdrop-blur-lg rounded-b-2xl\u0026#34;\u0026gt; \u0026amp;lt;span class=\u0026#34;text-pearly text-lg font-mono\u0026#34;\u0026gt;{{ title }}\u0026amp;lt;/span\u0026gt; \u0026amp;lt;/div\u0026gt; \u0026amp;lt;/a\u0026gt; \u0026amp;lt;/template\u0026gt; \u0026amp;lt;style scoped\u0026gt; .card { transform-style: preserve-3d; perspective: 200px; transition: 50ms all ease; } .card-shadow { top: 5%; left: 5%; width: 90%; height: 90%; } .card-title { height: 20%; /* Make Text Center */ display: flex; align-items: center; justify-content: center; } \u0026amp;lt;/style\u0026gt;\u0026lt;/code\u0026gt;\u0026lt;/pre\u0026gt; 使用方法： 直接使用：\u0026lt;Card title=\u0026quot;标题\u0026quot; siteUrl=\u0026quot;跳转URL\u0026quot; imageUrl=\u0026quot;图片URL\u0026quot;/\u0026gt;\n列表渲染：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 \u0026lt;pre class=\u0026#34;wp-block-code\u0026#34;\u0026gt;\u0026lt;code\u0026gt;\u0026amp;lt;script setup\u0026gt; import Card from \u0026#34;./Card.vue\u0026#34;; // load objects from somewhere const sites = \u0026amp;#91; { \u0026#39;id\u0026#39;: \u0026#39;1\u0026#39;, \u0026#39;title\u0026#39;: \u0026#39;Title\u0026#39;, \u0026#39;siteUrl\u0026#39;: \u0026#39;https://tmp.whitepeach.top\u0026#39;, \u0026#39;imageUrl\u0026#39;: \u0026#39;https://t.alcy.cc/tx\u0026#39;, }, { \u0026#39;id\u0026#39;: \u0026#39;2\u0026#39;, \u0026#39;title\u0026#39;: \u0026#39;TEST\u0026#39;, \u0026#39;siteUrl\u0026#39;: \u0026#39;https://tmp.whitepeach.top\u0026#39;, \u0026#39;imageUrl\u0026#39;: \u0026#39;https://t.alcy.cc/tx\u0026#39;, }, ] \u0026amp;lt;/script\u0026gt; \u0026amp;lt;template\u0026gt; \u0026amp;lt;div class=\u0026#34;flex flex-wrap justify-evenly items-center content-evenly\u0026#34;\u0026gt; \u0026amp;lt;!-- 列表渲染 --\u0026gt; \u0026amp;lt;Card v-for=\u0026#34;(site, index) in sites\u0026#34; :key=\u0026#34;site.id\u0026#34; :title=\u0026#34;site.title\u0026#34; :siteUrl=\u0026#34;site.siteUrl\u0026#34; :imageUrl=\u0026#34;site.imageUrl\u0026#34; /\u0026gt; \u0026amp;lt;/div\u0026gt; \u0026amp;lt;/template\u0026gt; \u0026amp;lt;style\u0026gt;\u0026amp;lt;/style\u0026gt;\u0026lt;/code\u0026gt;\u0026lt;/pre\u0026gt; 然后就大功告成啦\n遇到问题欢迎在评论区留言\n","date":"2025-01-11T09:47:46Z","permalink":"https://www.whitepeach.top/post/vue-tailwind-card/","title":"VUE+TailwindCSS 卡片效果-卡片随鼠标3D旋转效果"},{"content":"知周所众，我们的大善人Cloudflare在国内没有服务器，因此被称为减速器，那么如何优雅的同时使用Cloudflare**(以下简称为CF)**和其他国内CDN呢？\n🛒材料准备：\n需要托管的网站(废话) 一个主域名、一个闲置域名（能托管CF即可） 一个CF账号、一个其他CDN账号 一、将闲置域名托管至CF 一些免费的域名也可以托管至CF，这里不作推荐，可以自行查阅\n随后添加DNS记录至要加速的网站，也就是网站的源IP地址\n这里以CNAME.xxx.xxx为例\n然后去到_SSL/TLS-\u0026gt;自定义主机_名下，将你的主域名添加为自定义主机，回退源设置为你刚才配置的闲置域名DNS记录，按照引导完成验证即可，如图所示\n这里需要你添加支付方式，但是无需付费！！！ 到这里就已经完成了大半了🎉\n后续Cloudflare的配置网上都有很多教程，这里就不再赘述了，正常配置即可 二、添加其他CDN 这里以本站使用的又拍云为例，其他CDN同理，只要能达到加速的目的即可\n自行注册登录后创建服务，不同产品的使用方式各不相同，可以自行查阅文档\n添加好后会获得一个CNAME解析地址，这就是一会分流要用到的地址了\n三、分线解析 这里使用阿里云的解析为例，其他家的DNS解析服务同理\n找到DNS解析选择要解析的域名，点击添加记录，选择CNAME解析\n分别添加两条解析，一条解析请求来源设置为默认，记录值为国内CDN的CNAME域名，另一条解析请求来源设置为境外，记录值设置为**CNAME.闲置域名.xxx**(你刚才设置的域名)，这样境外的请求就会通过CF代理了\n最后我们可以用工具检验一下设置的是否正确\nhttps://zhale.me/dns/\n如果像我一样解析没有源站IP，解析出来的IP是CDN的IP那就是成功了\n那么有人就要问了：啊？我怎么知道这是不是CDN的IP呢？\n答：可以直接去CDN的官网查一下网段是多少噢，例如CF的 IP 地址范围 | Cloudflare\n也可以直接查询IP所属地\n总之，只要不是在互联网上裸奔就行了，切记在网络上暴露自身IP是一件极度危险的事情！\n有问题欢迎留言讨论噢\n","date":"2025-01-02T09:28:39Z","image":"https://www.whitepeach.top/post/double-line-cdn/cover_hu_be3bd070866b7da0.png","permalink":"https://www.whitepeach.top/post/double-line-cdn/","title":"同时使用国内CDN与Cloudflare分线解析提升全球访问速度与安全性"},{"content":"在草坪上睡觉的小黑\n超级肥的大橘(奥尔良烤全腿)\n还有一只没睡醒\n","date":"2024-12-01T15:46:08Z","image":"https://www.whitepeach.top/post/daily-cat/cover_hu_d49a411a01e1169b.jpg","permalink":"https://www.whitepeach.top/post/daily-cat/","title":"拍猫日常"},{"content":"八股 Linux解压压缩包命令 Linux更改文件权限命令 ssh 连接远程服务器 数据库内连接与外连接的区别 外连接有几种 其之间有什么区别 使用连接时WHERE与ON有什么区别 Redis基本数据类型有哪几种 Redis持久化 两种有什么区别 有用过Java开发四件套吗 spring中最常用的注解是哪个 Java中有哪八种基本数据类型 Java中==与equals的区别 Java中string和stringbuffer的区别 Linux查看实时日志 Python垃圾回收 Python类方法和静态方法的区别 如果一个API接口偶尔响应慢该如何排查 查看日志用什么命令 排查网络可以用到什么命令 设计一个火车订票系统的SQL表 如何优化一个慢查询 restful的特点 如何设计一个高并发的秒杀系统 如何使用AI工具例如Copilot提高编程效率和质量 常见的加密算法 MD5算加密算法吗 MYSQL主键与唯一索引的区别 limit函数会带来什么问题 有了解过幂等性吗，讲一下 讲一下继承 Go中有继承吗，go支持复用吗 Go中的数据类型有哪些 常见的HTTP headers 讲一下HTTP状态码 讲一下30X有哪几种重定向 user-agent的作用 cookie和session的区别 setcahe的作用 深拷贝与浅拷贝的区别 Java中如何不使用new关键字创建对象 讲一下工厂方法内部 Mybatis方便在哪里 Spring的自动装配原理 高德地图中的堵车状态如何实现 递归有了解吗，讲一下递归 尾递归有了解吗，讲一下尾递归优化 讲三种常见的逻辑数据结构，并说出他们的特点 讲一下进程线程与协程的区别 多线程应该注意什么 跨域问题有了解过吗，原理是什么 有了解过docker吗，讲一下是优点 docker中如何保证数据的持久化 docker的网络模式有哪几种，各自的特点是什么 sql中的视图是什么，有什么用 讲一下sql窗口函数 手撕 ","date":"2024-07-13T00:00:00Z","permalink":"https://www.whitepeach.top/post/interview-guide/","title":"白桃乌龙的面经"},{"content":" 安装Lagrange Lagrange.Core是是一个开源的 NTQQ 协议实现，作用就是一个无头的QQ客户端，去掉了QQ的图形界面，可以实现一般客户端都可以的功能\n项目地址: agrangeDev/Lagrange.Core: An Implementation of NTQQ Protocol, with Pure C#, Derived from Konata.Core (github.com)\n官方文档: Lagrange 文档 (lagrangedev.github.io)\n从release下载最新版本的Lagrange，选择对应操作系统版本即可，例如我这里用的就是Linux-x64版本\n将文件上传至服务器 (其实也可以在服务器上直接下载)并解压，然后执行就可以了\n./Lagrange.OneBot 如果说权限不够则请为其添加可执行权限\nchmod +x ./Lagrange.OneBot # 然后运行 ./Lagrange.OneBot 启动之后会提示如下\n然后我们去编辑一下配置文件 $vi appsettings.json 完整配置参考官方文档，我们这里只关注服务配置\n\"Implementations\": [\u0026lt;br\u003e{\u0026lt;br\u003e\"Type\": \"ReverseWebSocket\",\u0026lt;br\u003e\"Host\": \u0026lt;strong\u003e\"127.0.0.1\"\u0026lt;/strong\u003e,\u0026lt;br\u003e\"Port\": \u0026lt;strong\u003e8080\u0026lt;/strong\u003e,\u0026lt;br\u003e\"Suffix\": \"/onebot/v11/ws\",\u0026lt;br\u003e\"ReconnectInterval\": 5000,\u0026lt;br\u003e\"HeartBeatInterval\": 5000,\u0026lt;br\u003e\"AccessToken\": \"\"\u0026lt;br\u003e}\u0026lt;br\u003e]\n这部分的Host和Port后面配置OneBot会回来修改，暂时先不用改动，你也可以先把Port改成别的端口（但要保证不被占用并且在后面配置Nonebot的时候用这个端口提供服务） 然后再运行一次Lagrange会出现一个二维码给我们扫\n扫完之后记得勾选【下次登录无需确认】，然后Lagrange就会一直复读下图（如果配置对的话），至此我们的Lagrange就配置好了，先使用Ctrl+C暂时退出应用\nNonebot安装及配置 Nonebot是一个跨平台的Python异步机器人框架\n这里我们使用Nonebot对我们Lagrange收到的消息进行处理\nNoneBot官网 NoneBot\n项目地址 nonebot/nonebot2: 跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python (github.com)\n这里按照官方文档的快速上手（快速上手 | NoneBot） 操作安装就可以了，但要注意安装适配器的时候需要选中\u0026quot;**OneBot V11\u0026quot;**协议，Console可选可不选，驱动器使用默认的FastAPI即可，内置插件随意\n创建成功后 cd 你的项目名字 进入机器人目录，项目内应该是总共有三个文件.env.prod pyproject.toml README.md，如果在上面修改了Lagrange的端口这里就需要修改一下端口， vi .env.prod 后在 DRIVER=~fastapi ，在后面添加PORT=你设定的端口，然后 :wq 保存退出，如图，如果上面没有改端口还是8080则跳过这步\n**还有一点非常重要！**如果选择了创建虚拟环境，就要先激活虚拟环境才能启动，否则会告诉你nb: command not found\u0026hellip;\n\u0026lt;strong\u0026gt; source venv/bin/activate \u0026lt;/strong\u0026gt;激活虚拟环境，想要退出虚拟环境只需要输入 deactivate 就可以了\n然后 nb run 测试一下bot是否可以成功运行，成功运行如图\n到这里就安装好Nonebot了，接下来就是让Lagrange与NoneBot连接以及让他们一直在后台运行\n建立连接以及持续运行 首先测试连接性，打开两个shell，一个运行Lagrange，一个运行NoneBot，如下图所示\n我们可以对bot绑定的QQ发送一条消息测试一下，可以看到是完美运行的\n然后我们就需要让其一直运行在我们的机器上了，当然你要不嫌麻烦每次都手动启动的话，到这里就可以结束了\n方案有很多种，也可以使用Screen，这里演示使用Supervisor[官网] (请注意！Windows上无法使用)\n如果是RedHat / CentOS\n#1安装 epel 源 \u0026lt;strong\u003eyum install -y epel-release\u0026lt;/strong\u003e #2安装 supervisor \u0026lt;strong\u003eyum install -y supervisor\u0026lt;/strong\u003e #3启动 supervisord 服务 \u0026lt;strong\u003esystemctl start supervisord\u0026lt;/strong\u003e #4开机自启动 \u0026lt;strong\u003esystemctl enable supervisord\u0026lt;/strong\u003e #5查看 supervisord 服务状态 \u0026lt;strong\u003esystemctl status supervisord\u0026lt;/strong\u003e 如果是Ubuntu / Debian\n\u0026lt;strong\u0026gt;sudo apt-get install supervisor\u0026lt;/strong\u0026gt;\n如果没有创建配置文件，则手动创建配置文件到etc中\n\u0026lt;strong\u0026gt; cd /etc\u0026lt;br\u0026gt;echo_supervisord_conf \u0026gt; supervisord.conf \u0026lt;/strong\u0026gt;\nSupervisord的详细配置可以自己去搜索一下(绝对不是因为懒得写)，这里仅提供一个示例：\n; Sample supervisor config file. \u0026#91;unix_http_server] ; (the path to the socket file) file = /var/run/supervisor/supervisor.sock \u0026#91;supervisord] ; (main log file;default $CWD/supervisord.log) logfile = /var/log/supervisor/supervisord.log ; (max main logfile bytes b4 rotation;default 50MB) logfile_maxbytes = 50MB ; (num of main logfile rotation backups;default 10) logfile_backups = 10 ; (log level;default info; others: debug,warn,trace) loglevel = info ; (supervisord pidfile;default supervisord.pid) pidfile = /var/run/supervisord.pid ; (start in foreground if true;default false) nodaemon = false ; (min. avail startup file descriptors;default 1024) minfds = 1024 ; (min. avail process descriptors;default 200) minprocs = 200 \u0026#91;rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface \u0026#91;supervisorctl] serverurl = unix:///var/run/supervisor/supervisor.sock \u0026#91;include] files = supervisord.d/*.ini 在**/etc/supervisord.d**中添加两个程序的配置文件\u0026lt;strong\u0026gt; Lagrange.ini OneBot.ini\u0026lt;/strong\u0026gt;\n内容如下 括号内的内容请自行删除！！！\n;\u0026lt;strong\u003eLagrange.ini\u0026lt;/strong\u003e \u0026#91;program:Lagrange] command = /opt/Lagrange/Lagrange.OneBot（你的Lagrange安装目录加上软件名字） directory = /opt/Lagrange(你的Lagrange安装目录) autorestart = true startsecs = 3 stdout_logfile = （普通日志存放目录，例如/opt/Lagrange/logs/Lagrange.out.log） stderr_logfile = （错误日志存放目录，例如/opt/Lagrange/logs/Lagrange.err.log） stdout_logfile_maxbytes = 2MB stderr_logfile_maxbytes = 2MB user = root priority = 999 numprocs = 1 process_name = %(program_name)s_%(process_num)02d \u0026lt;strong\u003e;NoneBot.ini\u0026lt;/strong\u003e \u0026#91;program:OneBot] command = sh -x /opt/BotTest/MyBot/run.sh(将目录替换为你的BOT安装目录) directory = /opt/BotTest/Nb(你的BOT安装目录) autorestart = true startsecs = 3 stopasgroup =true killasgroup =true stdout_logfile = /opt/BotTest/logs/OneBot.out.log stderr_logfile = /opt/BotTest/logsOneBot.err.log stdout_logfile_maxbytes = 2MB stderr_logfile_maxbytes = 2MB user = root priority = 999 numprocs = 1 process_name = %(program_name)s_%(process_num)02d 细心的小伙伴已经发现了，这个run.sh又是个什么鬼东西，因为我这里配置了虚拟环境，所以直接写了一个脚本启动，内容如下\n#run.sh source /opt/BotTest/venv/bin/activate /opt/BotTest/venv/bin/nb run 建议还是使用虚拟环境，避免包污染，接下来就剩启动supervisor了\nsupervisord -c /etc/supervisord.conf\n然后使用supervisorctl status检查一下进程运行状态\n完美运行，可以在上面配置的日志路径中查看实时运行日志\n到这里我们的Bot搭建就结束了，如果遇到问题建议还是首先到各个官方文档查询，看看自己是不是哪一步做错了，同时也欢迎在下方评论区给我留言，关于后续的机器人插件安装可以查看官方文档，我后续也会更新插件相关的文章。\n","date":"2024-05-28T06:25:32Z","image":"https://www.whitepeach.top/post/lagrange-nonebot-qq-bot/cover_hu_7bc560ac21d553ae.jpg","permalink":"https://www.whitepeach.top/post/lagrange-nonebot-qq-bot/","title":"使用Lagrange和Nonebot搭建QQ机器人"},{"content":"连接数据库 mysql -h 主机地址 -P 端口号 -u用户名 －p用户密码 或者 mysql -h 主机地址 -P 端口号 -u用户名 －p 随后输入密码 LIKE 关键字 | 模糊查询 用法：%（任意数量字符）和 _（单个字符）两种通配符，不支持[]语法 RLIKE、REGEXP：支持复杂的正则表达式，性能差 模糊搜索建议使用 ELK（倒排索引） 或者创建 全文索引 数据库模糊检索与索引之间的联系： 传统B-tree索引对精确匹配或前缀匹配(如LIKE 'abc%')效率很高 但对通用的模糊匹配(如LIKE '%abc%')效率显著下降 通配符开头的模式(%abc)使索引失效 中间包含通配符的模式(a%c)也难以利用索引 LIMIT 关键字 | 分页 基本用法：LIMIT [offset,] row_count | LIMIT page_size OFFSET offset; 第一个参数是偏移量（从0开始），第二个参数是要返回的行数 对于大数据表，大偏移量可能导致性能问题，可以考虑使用其他分页策略 DROP | DELETE | TRUNCATE 区别 Delete: 删除表中的特定行数据（可带WHERE条件） 是DML（数据操作语言）命令 可以回滚（如果事务未提交） 会触发触发器 会记录日志（占用较多事务日志空间） 删除速度较慢（特别是大表） 不释放表空间（只是标记为可覆盖） DROP: 完全删除表（包括结构和数据） 是DDL命令 不可回滚 删除表结构、数据、索引、约束等所有内容 释放所有空间 需要重新创建表才能再次使用 Truncate: 快速删除表中所有数据 是DDL（数据定义语言）命令 不可回滚（自动提交） 不触发触发器 记录最小日志（效率更高） 比DELETE快得多 重置自增列计数器 释放表空间（保留表结构） 连接 inner join left join right join 事务 事务控制语句 1 2 3 4 5 6 7 START TRANSACTION; -- 或 BEGIN，开始一个事务 COMMIT; -- 提交事务 ROLLBACK; -- 回滚事务 SAVEPOINT; -- 设置保存点 ROLLBACK TO SAVEPOINT; -- 回滚到保存点 RELEASE SAVEPOINT; -- 删除保存点 SET TRANSACTION; -- 设置事务的隔离级别 事务的四大特性-ACID 原子性 (Atomicity) 一致性 (Consistency) 隔离性 (Isolation) 持久性 (Durability) 事务隔离级别 读未提交(READ UNCOMMITTED) 最低隔离级别，允许读取未提交的数据变更 可能导致脏读、不可重复读和幻读 读已提交(READ COMMITTED) 允许读取并发事务已经提交的数据 可以阻止脏读，但不可重复读和幻读仍可能发生 可重复读(REPEATABLE READ) - MySQL 默认级别 对同一字段的多次读取结果都是一致的 可以阻止脏读和不可重复读，但幻读仍可能发生 串行化(SERIALIZABLE) 最高隔离级别，完全服从ACID 所有事务依次逐个执行 可以防止脏读、不可重复读和幻读 事务并发问题 脏读(Dirty Read) 一个事务读取了另一个未提交事务修改过的数据 不可重复读(Non-repeatable Read) 一个事务内多次读取同一数据，结果不同（因为其他事务修改了数据） 幻读(Phantom Read) 一个事务内多次查询，结果集的行数不同（因为其他事务插入了新数据） 索引 索引的类型 按数据结构分类 B+Tree索引：MySQL最常用的索引类型，InnoDB和MyISAM引擎都支持 Hash索引：Memory引擎支持，精确查询快，不支持范围查询 Full-text索引：全文索引，MyISAM和InnoDB(5.6+)支持 R-Tree索引：空间索引，MyISAM支持 按逻辑分类 普通索引：最基本的索引，没有任何限制 唯一索引：索引列的值必须唯一，允许有空值 主键索引：特殊的唯一索引，不允许有空值 组合索引：多个列组合创建的索引 全文索引：用于全文搜索 索引相关语法 创建索引： 1 CREATE INDEX index_name ON table_name(column_name); 创建唯一索引: 1 CREATE UNIQUE INDEX index_name ON table_name(column_name); 创建组合索引: 1 CREATE INDEX index_name ON table_name(col1, col2, col3); 删除索引: 1 DROP INDEX index_name ON table_name; 查看索引: 1 SHOW INDEX FROM table_name; 索引的优缺点 优点： 大大加快数据检索速度 加速表之间的连接 减少分组和排序的时间 缺点： 占用额外的存储空间 降低数据写入速度(INSERT/UPDATE/DELETE需要维护索引) 主键与唯一索引的区别 唯一性 主键：每个表只能有一个主键 唯一索引：一个表可以有多个唯一索引 NULL值 主键：不允许包含NULL值 唯一索引：可以包含NULL值（但只能有一个NULL值，因为NULL不等于NULL） 自动创建 主键：如果未显式定义主键，InnoDB会隐式创建一个6字节的主键 唯一索引：必须显式创建 聚集索引 主键：在InnoDB中，主键默认是聚集索引（数据按主键顺序存储） 唯一索引：是非聚集索引（除非没有主键且该唯一索引是第一个唯一索引） 外键引用 主键：可以被其他表的外键引用 唯一索引：也可以被外键引用，但不如主键常见 自动递增 主键：常与AUTO_INCREMENT一起使用 唯一索引：一般不使用AUTO_INCREMENT 锁 日志 Binary Log | binlog Redo log (Innodb) Undo log Error log Slow Query Log General Query Log Relay Log 约束 触发器 存储过程 视图 游标 三大范式 1NF：字段不可再分，原子性\n2NF：消除非主属性对主键的部分函数依赖\n3NF：消除非主属性对主键的传递函数依赖\nTODO: 补充完成块内容\n大小写问题 数据库和表名 Linux/Unix系统：默认区分大小写 Windows/Mac OS X：默认不区分大小写 列名 列名在所有平台上都不区分大小写 字符串值 取决于字符集 utf8_general_ci：不区分大小写（ci=case insensitive） utf8_bin：区分大小写（bin=binary） utf8_general_cs：区分大小写（cs=case sensitive） 关键字和函数名 不区分 EXISTS和IN的区别 聚合函数和窗口函数的区别 ","date":"2024-05-23T00:00:00Z","permalink":"https://www.whitepeach.top/post/mysql-notes/","title":"白桃乌龙的MySQL笔记"},{"content":"SED | GREP | AWK 文本处理 sed grep awk LESS | TAIL 实时日志 less tail VIM CRONTAB 定时任务 LN 软链接 SSH TAR 压缩包 CHMOD | CHOWN | CHGRP 属性更改 DOCKER 查看网络性能 查看系统性能 查看剩余磁盘空间 ","date":"2024-05-22T00:00:00Z","permalink":"https://www.whitepeach.top/post/linux-notes/","title":"白桃乌龙的Linux笔记"},{"content":"\r飞鸟与花，真我无暇！\n我永远喜欢爱莉希雅！\n传说…… 星月落下带来神的女儿 其名为——无瑕之人 这是给予我们一份浪漫的礼物 其名为——爱莉希雅 你既是一位美丽可爱的少女，也是一位令人捉摸不透的粉色妖精，更是一位充满人性光辉的无瑕之人 Elysian意为乐土也是你的名字 你即为我的乐土，也是我卢浮宫中的蒙娜丽莎，更是我心中的那唯一的无瑕水晶花 愿此世如黄金般闪耀！ 愿人性之华开遍世界！ 爱门！\n","date":"2024-05-17T12:58:11Z","image":"https://www.whitepeach.top/post/for-elysia/cover_hu_fa79388e22a5613d.png","permalink":"https://www.whitepeach.top/post/for-elysia/","title":"人活着就是为了爱莉希雅"}]