<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh_CN">
  <title>枸杞加水</title>
  <subtitle>分享知识与生活</subtitle>
  <link href="https://blog.gochi.cn/" rel="alternate" type="text/html"/>
  <link href="https://blog.gochi.cn/atom.xml" rel="self" type="application/atom+xml"/>
  <id>https://blog.gochi.cn/</id>
  <updated>2026-10-02T00:00:00.000Z</updated>
  <entry>
    <title>MacOS 配置与软件推荐：我的轻量化工作流</title>
    <link href="https://blog.gochi.cn/posts/my-macos-setup-2026/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/my-macos-setup-2026/</id>
    <published>2026-10-02T00:00:00.000Z</published>
    <updated>2026-10-02T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<p>最近我重装了一遍 macOS 系统，从头配置了一遍。这篇文章来分享一下我的 macOS 配置和软件推荐。</p>
<h2>MacOS 系统选择</h2>
<blockquote>
<p>我的 Mac 型号：MacBook Air M4</p>
</blockquote>
<p>我选择的长期使用版本是 <strong>macOS Sequoia 15.8</strong>，这是最后一代有启动栏的系统。之前我不小心更新到了 Tahoe，所幸我这台机器的出厂系统是 Sequoia，可以通过 BIOS 重置回出厂系统。</p>
<p>因为我会用很多软件和工具替代系统自带的功能（比如 Raycast 替代 Spotlight，AeroSpace 替代系统的桌面管理），所以对于系统，我需要的是一个<strong>内存占用小、续航好</strong>的版本。</p>
<h2>软件选型原则</h2>
<p>我选择软件的原则是：<strong>优先轻量、原生、低内存占用</strong>——启动快，续航强。不下载不必要的 App，可以用浏览器浏览就用浏览器。</p>
<h2>软件推荐</h2>
<h3>1. 浏览器</h3>
<p>浏览器我选择的是 <strong>Zen</strong>，它有很高的自定义度，还有竖栏标签栏，使用体验非常好。虽然它没有 Safari 那么轻量，但是相比 Chrome，它的内存占用小很多。</p>
<p>本来我是用 Safari 的，追求它的轻量。但是我的电脑更新到 Safari 27 出现了 bug，所以我就用 Zen 了，开始尝试有更丰富功能的浏览器。目前使用下来体验非常好，刷新了我对浏览器的使用方式。Zen 很适合键盘操作，可以绑定很多快捷键。</p>
<p>List:</p>
<ul>
<li><strong>Zen</strong> —— 高自定义度
<ul>
<li>uBlock Origin Lite（广告拦截）</li>
<li>沉浸式翻译（双语对照）</li>
<li>Obsidian Web Clipper（网页剪藏）</li>
<li>Authenticator（两步验证）</li>
<li>Firefox Relay（临时邮箱）</li>
<li>Firefox Multi-Account Container（账户多开）</li>
</ul>
</li>
</ul>
<h3>2. 开发</h3>
<p>开发工具这边，我选择 <strong>Ghostty</strong> 作为终端模拟器，和 iTerm 相比启动速度快很多。</p>
<p>我的所有包统一用 <strong>Homebrew</strong> 下载和管理，这样在需要卸载的时候就很方便，<code>brew list</code> 就可以看自己下载的所有包和 App。</p>
<p><strong>Zed</strong> 是一个用 Rust 写的代码编辑器，很轻量。它的启动速度比 VS Code 快太多了。</p>
<p>List:</p>
<ul>
<li><strong>Ghostty</strong> —— 终端
<ul>
<li><a href="https://github.com/kmeykranz/dotfiles">kmeykranz/dotfiles</a></li>
<li>TMUX - 终端复用器</li>
<li>LazyGit - Git CLI</li>
<li>Helix - 终端代码编辑</li>
<li>Opencode - 终端 AI</li>
<li>...</li>
</ul>
</li>
<li><strong>Homebrew</strong> —— 包管理器</li>
<li><strong>Zed</strong> —— 代码编辑器、轻量</li>
<li><strong>GitHub Desktop</strong> —— Git GUI</li>
</ul>
<h3>3. 写作 / 笔记 / 阅读</h3>
<p><strong>Obsidian</strong> 不用多说，这是对我来说最重要的一个 App，最强大的笔记软件。</p>
<p>办公文档的编辑我选择用苹果的 <strong>iWork 三件套</strong>，原生，占用小续航强。</p>
<p>List:</p>
<ul>
<li><strong>Obsidian</strong> —— 笔记</li>
<li><strong>PicList</strong> —— 图床上传</li>
<li><strong>iWork</strong> —— 文档 / 表格 / 演示（原生）
<ul>
<li>Pages</li>
<li>Numbers</li>
<li>Keynote</li>
</ul>
</li>
</ul>
<h3>4. 影音 / 创作</h3>
<p>影音创作这边，我选择 <strong>iMovie</strong> 来剪辑我的视频，也是因为原生，大道至简。我的视频多为教学视频，没有复杂的特效需求，只需要裁切拼接和加字幕。<strong>VideoCaptionizer</strong> 这个开源程序非常好用，免费 AI 字幕生成，速度也特别快。</p>
<p>我在下载 Steam 客户端的时候发现它要我有 Rosetta 2 才可以启动，这说明 Steam 给 Mac 提供的客户端是 x64 的，要通过转译运行。于是我就找到了这个 Arm64 版的 Steam 下载方法。因为 Steam 经常要在后台开着，所以换成原生可以减少不必要的内存占用。</p>
<p>List:</p>
<ul>
<li><strong>Cap</strong> —— 录屏</li>
<li><strong>iMovie</strong> —— 剪辑</li>
<li><strong>VideoCaptionizer 卡卡字幕</strong> —— 字幕生成</li>
<li><strong>Steam</strong>（arm64 版）—— 游戏
<ul>
<li>来源：<a href="https://github.com/i1rr/steam-arm64-mac">steam-arm64-mac</a></li>
</ul>
</li>
</ul>
<h3>5. 效率 / 系统</h3>
<p><strong>Raycast</strong> 就是增强版的 Spotlight，相当于操控整个系统的命令台。它可以帮我去掉很多的鼠标操作，通过键盘输入指令就可以打开软件、打开网页……</p>
<p><strong>Karabiner</strong> 可以用来自定义键盘快捷键，我自己的配置是“A/W/S/D + 右 Cmd”绑定为上下左右，很多人绑的都是 HJKL 或者 HIJK 这样类似 Vim 的。因为平时玩很多游戏，所以就灵机一动想到了这套快捷键绑定，很符合直觉。</p>
<p><strong>batt</strong> 是一个 Mac 电池保护工具，可以设定充电上限，把充电上限设置到 80，这样电脑一直插电使用就会把电量维持在 80，不充到 100，延长电池寿命。macOS Sequoia 只有电池优化功能，它是根据你的使用习惯自动调整，有时候还是会给你充到 100 的。用 batt 就可以固定上限，任何时候都不充满。</p>
<p><strong>AeroSpace</strong> 是一个 Mac 窗口管理器（类似 Yabai），但是它不用关闭系统保护就可以使用，配置也更简单。它可以让你用快捷键管理窗口布局和桌面。它的桌面管理原理很特殊，并不是用的 macOS 系统桌面，而是把不用的 App 窗口移到屏幕外面的位置，在用到的时候再移回来。而 Yabai 调用的是 Mac 的桌面。AeroSpace 这套方法性能更好。</p>
<p>List：</p>
<ul>
<li><strong>Raycast</strong> —— 快捷启动</li>
<li><strong>Karabiner</strong> —— 键盘定制</li>
<li><strong>batt</strong> —— 充电优化</li>
<li><strong>AppCleaner</strong> —— 卸载</li>
<li><strong>LocalSend</strong> —— 局域网传文件</li>
<li><strong>AeroSpace</strong> —— 窗口管理器</li>
<li><strong>UU 远程</strong> —— 远控</li>
</ul>
<hr />
<p>以上是我目前的 macOS 配置和软件选择，核心思路就是轻量、原生、低占用。如果你也在折腾自己的 Mac 工作流，希望这份清单能给你一些参考。</p>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>图灵完备：一款教你搭建计算机的游戏</title>
    <link href="https://blog.gochi.cn/posts/turing-complete/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/turing-complete/</id>
    <published>2025-02-19T00:00:00.000Z</published>
    <updated>2025-02-19T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<p>最近在 Steam 上发现了一个神仙游戏，《Turing Complete》。</p>
<p>这是一款模拟电路，搭建计算机的游戏，从开始的 <code>或门、非门、与门...</code>，到 <code>存储器、计算引擎、条件控制器</code>，然后组出一个 <code>计算机</code>，再之后用 <code>汇编语言</code>，写一些简单的小游戏。</p>
<p>作为还是一个高中生的我，第一次了解了计算机电路的底层原理，电线的开（1）、关（0），被先人们运用到了极致，非常巧妙的组出了各种逻辑门，然后层层递进，到做出各种元件。</p>
<p>以前刷到过在 MC 里搭建计算机的视频，当时完全还不懂，觉得用了命令块之类的，在玩了这款游戏之后我恍然大悟，原来只要用那几个基础的红石元件，完全可以一点一点地做出一个计算机。</p>
<p>这下真的是在边玩游戏边学习了，游戏里还普及了德摩根定律：对四个基础逻辑门的输入或输出进行取反，即可互相转换。</p>
<p>这样通过玩游戏的形式，一点一点的过关斩将，模拟做出计算机，是个不错的办法。在以后实际上手的时候，或者在学习这个知识的时候，会轻松很多。</p>
<p><img src="https://p.gochi.cn/img/2025%2F0219215324.png" alt="" /></p>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>媒体上这么多知识，为什么还要读书？</title>
    <link href="https://blog.gochi.cn/posts/why-reading/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/why-reading/</id>
    <published>2025-01-16T00:00:00.000Z</published>
    <updated>2025-01-16T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<blockquote>
<p>在现在这个时代，媒体上知识这么多，我们为什么还要读书？</p>
</blockquote>
<p>即使知道读书在某些方面有好处，比如对专注力有帮助，但在学习效率上，似乎还是在媒体上看知识视频的效率更高，可以在最短时间学到最多的东西。</p>
<p>但事实并非如此。</p>
<h2>资讯vs知识</h2>
<p>我们现在在网络上可以看到很多资讯。比如现在，每天都会有新的AI动态，这个模型又超过了那个，那个又超过了这个，实际上用几句话就可以概括一年的AI发展：语言大模型取得巨大突破，众多企业开始研究自己的模型，视频生成AI也出现了…</p>
<p>了解更多资讯是有好处，但是它们不是知识。你现在看到的资讯，过了一年就什么也不是了。我们更需要的是深层的知识，不管实事如何变化，我们的知识都还是经久不衰的。这就是我们为什么要读书，去学习底层的原理，这样不管资讯如何变化，我们都能很快的理解。</p>
<h2>媒体知识vs书籍知识</h2>
<p>进入正题，讲讲媒体上的“知识”，现今媒体发达，我们可以在媒体上高效率地获得很多信息，像短视频、文章，里面也有很多知识，甚至还可以直接听书籍的讲解，10分钟就能听完一本书，但这之中其实有一个陷阱。</p>
<p>这些媒体都是直接把现成的知识放在我们眼前，使得我们跳过了思考的步骤，直接取得别人得出来的结论，这正好迎合了我们大脑喜欢偷懒的特点。然而这样获得的知识实际上不是属于我们的，这样获得的知识是不会印象深刻的，你可以在一天之内在媒体上得到十几本书的结论，但你真的记得住他们吗？你真的能运用到生活之中吗？可以说，这些媒体在剥夺我们思考的权利，我们的大脑越来越懒，越来越不善于思考，即使我们在媒体上看到错误的信息，我们也会盲目从之。</p>
<p>这就是为什么我们要读书，不一定是读书，也可以是其他形式，重点是其深度学习的性质。我们应该能够主动地去思考，了解背后的原理，通过自己的思考得出结论。这样的知识才会成为我们知识体系的一部分，融入我们的思维和世界观之中。很多书的结论可以用很短几行字来概括，但这本书还是值得阅读，因为我们在阅读时，了解原理和推理的过程，以及在上面花的时间，都在不断的加强我们对于这个知识的记忆。换句话说，你读一本书“浪费”的时间越多，它对你可能越有帮助。</p>
<p>我曾觉得那些写影评、书评的人很厉害，因为当我自己看完一个很有感触的电影后，经常发现自己什么都写不出来，到头来只是复述了其他影评的原文，没有自己的理解和想法。这是大脑长期不经思考地接受信息导致的，本应擅长思考、发表观点的大脑，渐渐变得只能被动接受信息。这是我们需要去训练的，写不出文章不只是语言组织的问题，也可能是我们的大脑缺乏主观的思考，根本就没有一个自己清晰的观点，从来都是看别人总结出来的结论。</p>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>Hexo搭建进阶：Vercel部署、主题安装、基础用法</title>
    <link href="https://blog.gochi.cn/posts/hexo-intermediate/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/hexo-intermediate/</id>
    <published>2024-04-29T00:00:00.000Z</published>
    <updated>2024-04-29T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<ul>
<li>本篇前文：<a href="/p/bb32.html">如何用Hexo搭建个人博客?</a></li>
<li>本文基于<a href="https://www.fomal.cc/posts/4aa2d85f.html">Hexo博客搭建基础教程(二)</a>修改，部分转载</li>
<li>我的<strong>Hexo优化系列</strong>：<a href="/tags/hexo">Hexo文章目录</a></li>
</ul>
<p>我的博客搭建教程是一年前写的了，非常感谢<a href="https://www.fomal.cc/">fomalhaut</a>，当时我是跟着他的教程一步步搭建的。最近我终于在b站发了视频版的博客搭建教程，有很多朋友想进一步优化博客。这篇文章接上一篇，教大家将博客部署到vercel、主题安装、Hexo博客的基础用法。</p>
<h2>Vercel部署</h2>
<p>Github提供的网址在国内的访问速度较慢，所以推荐在搭建完后用<a href="https://vercel.com/">Vercel</a>部署，再通过Vercel绑定到自己的域名上，这样会速度会很快。</p>
<p>因为Vercel给我们分配的域名在国内是<strong>无法访问的</strong>，所以我们需要把在Vercel部署的绑定到自己的域名上，这样就可以访问了。</p>
<p>域名可以在<a href="https://www.aliyun.com/">阿里云</a>等域名供应商购买，我用的是<a href="https://www.west.cn/">西部数码</a>，便宜好用。</p>
<blockquote>
<p>建议选用<code>com</code>，<code>cn</code>或<code>cc</code>等常用好记的顶域，对SEO比较友好，自定义部分的长度尽可能短，别人才会更容易地记住你的网站，域名就是网站的名片。</p>
</blockquote>
<h3>使用Vercel部署</h3>
<ol>
<li>首先需要一个<a href="https://vercel.com/">Vercel</a>账号，这里<strong>推荐用GitHub账户关联，这样你就可以在vercel中直接托管你的GitHub库中的项目了</strong>，实现开发部署一步到位（网络不流畅可以考虑挂梯子）。</li>
<li>当你用你的Github账户关联并绑定手机号登录之后，点击右上角的<code>Add New Project</code>创建新的项目，之后导入选项那里选择<code>Continue with Github</code>，这时候应该能看到你Github账号的仓库，选择你刚刚部署成功的存储静态博客的仓库<code>&lt;username&gt;.github.io</code>右边的<code>Import</code>选项，表示你要导入该仓库。</li>
<li>起一个只能有字母、数字或者或者连字符的项目名称，然后其他默认，点击<code>Deploy</code>，等待一分钟即可部署成功，部署成功后电极<code>Continue to Dashboard</code>跳转到控制面板，下图所示就是控制面板，看到就代表成功部署到了，但是我们现在还不能访问他给出的域，因为GFW把Vercel屏蔽了。</li>
</ol>
<h3>绑定自定义域名</h3>
<p>现在你有一个github托管的网址<code>username.github.io</code>，以及在Vercel上有一个<code>blog-demo-chi.vercel.app</code>，但是它国内无法访问，所以这时候我们就需要将Vercel部署的网页绑定到自己的域名上。</p>
<p><strong>接下来我们绑定自己的域名：</strong></p>
<ol>
<li>点击Vercel控制面板右上角的<code>View Domains</code>查看当前的域，我们可以看到仅有Vercel给你预分配的一个域名，此时我们输入我们要用的域名，添加后他会提示你添加一条DNS解析记录。</li>
</ol>
<blockquote>
<p>我买的域名是<code>gochi.cn</code>，我决定用二级域名<code>blog.gochi.cn</code>当我博客的域名，大家也可以直接用根域名</p>
</blockquote>
<ol>
<li>接下来在域名解析记录里面添加记录，其中记录类型对应<code>Type</code>，主机记录对应<code>Name</code>，记录值对应<code>Value</code>，其他的设置默认即可。</li>
</ol>
<blockquote>
<p>如果不成功，可以尝试统一用<code>A记录</code>，值<code>76.223.126.88</code></p>
<p>如下是我的示例，<code>blog</code>解析出来的域名是<code>blog.gochi.cn</code>，<code>@</code>解析出来的是根域名<code>gochi.cn</code></p>
</blockquote>
<p>&lt;img src="https://p.gochi.cn/img/0429203503.png" style="zoom:33%;" /&gt;</p>
<ol>
<li>回到Vercel刚刚查看域名的地方，如果操作没问题，应该会显示域名配置成功的提示，此时就可以通过自定义域名来访问我们搭建的网站了。</li>
<li>当你有了新的域名之后，需要将<code>[BlogRoot]\_config.yml</code>文件中的<code>url</code>配置项改为自己的新域名，这样博客的文章链接才会正确生成。</li>
</ol>
<h2>安装主题</h2>
<h3>Butterfly主题</h3>
<p><a href="https://butterfly.js.org/">Butterfly主题</a>是最流行的主题，拥有很大的社区，自定义度高，还可以用来魔改。</p>
<ul>
<li>
<p>这是官方的安装文档：<a href="https://butterfly.js.org/posts/21cfbf15">【Butterfly 安裝文檔】</a></p>
</li>
<li>
<p>Butterfly的魔改：推荐文章<a href="https://www.fomal.cc/posts/eec9786.html">【博客魔改教程总结(一)】</a></p>
</li>
</ul>
<h3>安知鱼主题</h3>
<p><a href="https://docs.anheyu.com/">安知鱼主题</a>一款基于Butterfly主题修改的主题，也是我目前在使用的。</p>
<p>如果大家也想用和我一样的话，可以直接跟着<a href="https://docs.anheyu.com/">【安知鱼主题官方文档】</a>进行安装和配置，文档非常详细。</p>
<h3>其他主题</h3>
<p>hexo还有很多其他主题，可以在<a href="https://hexo.io/themes/">hexo主题</a>中找到。</p>
<h2>基础用法</h2>
<h3>Front-matter</h3>
<p><code>Front-matter</code> 是 markdown 文件最上方以<code>---</code>分隔的区域，用于指定个别档案的变数。</p>
<ul>
<li>Page Front-matter 用于页面配置</li>
<li>Post Front-matter 用于文章页配置</li>
</ul>
<p>如果标注可选的参数，可根据自己需要添加，不用全部都写</p>
<p><strong>Page Front-matter：</strong></p>
<pre><code>---
title:
date:
updated:
type:
comments:
description:
keywords:
top_img:
mathjax:
katex:
aside:
aplayer:
highlight_shrink:
---
</code></pre>
<table>
<thead>
<tr>
<th>写法</th>
<th>解释</th>
</tr>
</thead>
<tbody>
<tr>
<td>title</td>
<td>【必需】页面标题</td>
</tr>
<tr>
<td>date</td>
<td>【必需】页面创建日期</td>
</tr>
<tr>
<td>type</td>
<td>【必需】标籤、分类和友情链接三个页面需要配置</td>
</tr>
<tr>
<td>updated</td>
<td>【可选】页面更新日期</td>
</tr>
<tr>
<td>description</td>
<td>【可选】页面描述</td>
</tr>
<tr>
<td>keywords</td>
<td>【可选】页面关键字</td>
</tr>
<tr>
<td>comments</td>
<td>【可选】显示页面评论模块(默认 true)</td>
</tr>
<tr>
<td>top_img</td>
<td>【可选】页面顶部图片</td>
</tr>
<tr>
<td>mathjax</td>
<td>【可选】显示mathjax(当设置mathjax的per_page: false时，才需要配置，默认 false)</td>
</tr>
<tr>
<td>kates</td>
<td>【可选】显示katex(当设置katex的per_page: false时，才需要配置，默认 false)</td>
</tr>
<tr>
<td>aside</td>
<td>【可选】显示侧边栏 (默认 true)</td>
</tr>
<tr>
<td>aplayer</td>
<td>【可选】在需要的页面加载aplayer的js和css,请参考文章下面的音乐 配置</td>
</tr>
<tr>
<td>highlight_shrink</td>
<td>【可选】配置代码框是否展开(true/false)(默认为设置中highlight_shrink的配置)</td>
</tr>
</tbody>
</table>
<p><strong>Post Front-matter：</strong></p>
<pre><code>---
title:
date:
updated:
tags:
categories:
keywords:
description:
top_img:
comments:
image:
toc:
toc_number:
toc_style_simple:
copyright:
copyright_author:
copyright_author_href:
copyright_url:
copyright_info:
mathjax:
katex:
aplayer:
highlight_shrink:
aside:
---
</code></pre>
<table>
<thead>
<tr>
<th>写法</th>
<th>解释</th>
</tr>
</thead>
<tbody>
<tr>
<td>title</td>
<td>【必需】文章标题</td>
</tr>
<tr>
<td>date</td>
<td>【必需】文章创建日期</td>
</tr>
<tr>
<td>updated</td>
<td>【可选】文章更新日期</td>
</tr>
<tr>
<td>tags</td>
<td>【可选】文章标籤</td>
</tr>
<tr>
<td>categories</td>
<td>【可选】文章分类</td>
</tr>
<tr>
<td>keywords</td>
<td>【可选】文章关键字</td>
</tr>
<tr>
<td>description</td>
<td>【可选】文章描述</td>
</tr>
<tr>
<td>top_img</td>
<td>【可选】文章顶部图片</td>
</tr>
<tr>
<td>cover</td>
<td>【可选】文章缩略图(如果没有设置top_img,文章页顶部将显示缩略图，可设为false/图片地址/留空)</td>
</tr>
<tr>
<td>comments</td>
<td>【可选】显示文章评论模块(默认 true)</td>
</tr>
<tr>
<td>toc</td>
<td>【可选】显示文章TOC(默认为设置中toc的enable配置)</td>
</tr>
<tr>
<td>toc_number</td>
<td>【可选】显示toc_number(默认为设置中toc的number配置)</td>
</tr>
<tr>
<td>toc_style_simple</td>
<td>【可选】显示 toc 简洁模式</td>
</tr>
<tr>
<td>copyright</td>
<td>【可选】显示文章版权模块(默认为设置中post_copyright的enable配置)</td>
</tr>
<tr>
<td>copyright_author</td>
<td>【可选】文章版权模块的文章作者</td>
</tr>
<tr>
<td>copyright_author_href</td>
<td>【可选】文章版权模块的文章作者链接</td>
</tr>
<tr>
<td>copyright_url</td>
<td>【可选】文章版权模块的文章连结链接</td>
</tr>
<tr>
<td>copyright_info</td>
<td>【可选】文章版权模块的版权声明文字</td>
</tr>
<tr>
<td>mathjax</td>
<td>【可选】显示mathjax(当设置mathjax的per_page: false时，才需要配置，默认 false)</td>
</tr>
<tr>
<td>katex</td>
<td>【可选】显示katex(当设置katex的per_page: false时，才需要配置，默认 false)</td>
</tr>
<tr>
<td>aplayer</td>
<td>【可选】在需要的页面加载aplayer的js和css,请参考文章下面的音乐 配置</td>
</tr>
<tr>
<td>highlight_shrink</td>
<td>【可选】配置代码框是否展开(true/false)(默认为设置中highlight_shrink的配置)</td>
</tr>
<tr>
<td>aside</td>
<td>【可选】显示侧边栏 (默认 true)</td>
</tr>
</tbody>
</table>
<p>注意：我的博客根目录路径为 【D:/Blog/】，下文所说的根目录都是此路径，将用[BlogRoot]代替。</p>
<h3>标签页</h3>
<ol>
<li>
<p>前往你的Hexo博客根目录，打开<code>Git Bash</code>执行如下命令：</p>
<pre><code>hexo new page tags
</code></pre>
</li>
<li>
<p>在<code>[BlogRoot]\source\</code>会生成一个含有<code>index.md</code>文件的<code>tags</code>文件夹。</p>
</li>
<li>
<p>修改<code>[BlogRoot]\source\tags\index.md</code>，添加<code>type: "tags"</code>。</p>
<pre><code>---
title: tags
date: 2022-10-28 12:00:00
type: "tags"
---
</code></pre>
</li>
</ol>
<h3>友情链接</h3>
<ol>
<li>
<p>前往你的Hexo博客根目录，打开cmd命令窗口执行如下命令：</p>
<pre><code>hexo new page link
</code></pre>
</li>
<li>
<p>在<code>[BlogRoot]\source\</code>会生成一个含有<code>index.md</code>文件的<code>link</code>文件夹</p>
</li>
<li>
<p>修改<code>[BlogRoot]\source\link\index.md</code>，添加<code>type: "link"</code></p>
<pre><code>---
title: link
date: 2024-4-29 12:00:00
type: "link"
---
</code></pre>
</li>
<li>
<p>前往<code>[BlogRoot]\source\_data</code>创建一个<code>link.yml</code>文件（如果沒有 <code>_data</code> 文件夹，请自行创建），并写入如下信息（根据你的需要写）：</p>
<pre><code>- class_name: 1.技术支持
  class_desc: 本网站的搭建由以下开源作者提供技术支持
  link_list: 
    - name: Hexo 
      link: https://hexo.io/zh-cn/
      avatar: https://d33wubrfki0l68.cloudfront.net/6657ba50e702d84afb32fe846bed54fba1a77add/827ae/logo.svg
      descr: 快速、简单且强大的网志框架
      siteshot: https://source.fomal.cc/siteshot/hexo.io.jpg
      
- class_name: 2.友情链接
  class_desc: 一些好朋友~~
  link_list:
    - name: Fiveth
      link: https://blog.gochi.cn/
      avatar: https://p.gochi.cn/avatar.jpg
      descr: 分享知识与生活
      siteshot: https://p.gochi.cn/siteshot.jpg
</code></pre>
<p>class_name和class_desc支持 html 格式，如不需要，也可以留空。</p>
</li>
</ol>
<h3>子页面</h3>
<p>子页面也是普通的页面，可以使用<code>hexo new page xxx</code>创建页面。</p>
<h3>404页面</h3>
<p>主題內置了一个简单的404页面，可在设置中开放。</p>
<p>如需本地预览，请访问 http://localhost:4000/404.html</p>
<pre><code>## A simple 404 page
error_404:
  enable: true
  subtitle: "页面沒有找到"
  background: 
</code></pre>
<hr />
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>2022款Thinkbook14+酷睿版续航优化方案</title>
    <link href="https://blog.gochi.cn/posts/thinkbook14p/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/thinkbook14p/</id>
    <published>2024-02-27T00:00:00.000Z</published>
    <updated>2024-02-27T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<p>使用Thinkbook14+也有两年了，我是在22年买的。后悔自己买的太早，因为22年酷睿款的续航十分鸡肋（23及24款在续航有很大提升），相信一样用这款的朋友们应该深有体会。离电不到2小时的续航，堪比游戏本。作为一个学生，在学校中基本上只能离电使用，所以我对续航有一定需求。</p>
<p>在我的一番调教下，它的续航最终达到了静置10小时，低负办公8小时的理论成绩。这对我日常使用体验的提升非常大，终于不用再频繁地把电脑放到充电仓。今天就来分享一下我自用的续航调教方案。本篇部分适用于所有笔记本，部分是针对22 Thinkbook14+酷睿版的。</p>
<p>文章部分参考自<a href="https://zhuanlan.zhihu.com/p/662648384">【知乎】2022款ThinkBook 14+/16+酷睿版的电池续航优化更新</a></p>
<h2>基础</h2>
<p>在离电使用时，做如下设置延长电池续航：</p>
<ol>
<li>Fn+Q 切换到节能模式（显示电池图标的那个）</li>
<li>Fn+空格键 关闭键盘背光</li>
<li>Fn+R把屏幕刷新率调整为60Hz（配置了高刷屏的机型）</li>
<li>右键点击屏幕右下角的电池图标打开<code>电源和睡眠设置</code>，将电源模式设置为<code>最佳能效</code></li>
<li>打开节电模式</li>
<li>不使用蓝牙时就关掉（WIFI同理）</li>
<li>适当降低屏幕亮度</li>
</ol>
<h2>更新驱动</h2>
<p>近期，官方在驱动程序上对22酷睿款更新了优化续航的措施，我们需要上官网下载更新。操作如下：</p>
<ol>
<li>
<p>进入官网<a href="https://newthink.lenovo.com.cn/">Lenovo服务与支持</a></p>
</li>
<li>
<p>在搜索框中输入自己的机型（机型可以在笔记本机身底部找到）</p>
<p>比如我的是<code>ThinkBook 14 G4+ IAP</code></p>
<p><img src="https://p.gochi.cn/img/lenovo.png" alt="Lenovo服务与支持" /></p>
</li>
<li>
<p>点击<code>驱动下载</code></p>
</li>
<li>
<p>下载以下程序的最新版本并安装</p>
</li>
</ol>
<ul>
<li>[x] BIOS升级程序 （IAP - HYCN45WW或ARA - J6CN46WW之后版本）</li>
<li>[x] Intel显卡驱动 （23/9/27之后版本）</li>
<li>[x] 主板Lenovo Dispatcher-Basic 驱动程序（23/9/27之后版本）</li>
</ul>
<h2>关闭独显</h2>
<p>我的机型搭载了独显Nvidia，独显的耗电量是非常大的，我试过用软件让独显强制睡眠，但是监测显示独显仍有耗电。</p>
<p>所以最后干脆直接在BIOS中关闭独显，以最大程度提升续航，操作如下：</p>
<ol>
<li>重启电脑，在开机页面按Enter</li>
<li>按F1进入BIOS控制面板</li>
<li>显示模式选择<code>集显模式</code></li>
<li>退出并保存</li>
</ol>
<p>现在我们在桌面右键打开更多选项，就会发现Nvidia控制面板没了，我们成功关闭了独显。</p>
<p>之后若要开启使用，还是一样的操作进入BIOS调回<code>混合模式</code>即可。</p>
<h2>ThrottleStop</h2>
<p><a href="https://www.techpowerup.com/download/techpowerup-throttlestop/">Throttlestop</a>是一个CPU调节工具，可以用来超频/降频/降温/降压。<a href="https://wwf.lanzoum.com/iCRUv1pjepza">中文版下载</a></p>
<p><img src="https://p.gochi.cn/img/throttlestop.png" alt="Throttlestop" /></p>
<p>上面四个选项是选择不同场景，可以分别配置不同场景下的参数，场景的名字可以在设置中自定义。下面是配置选项，这里我们只需要用到<code>Speed Shift EPP（变速EPP）</code>。EPP 允许设置范围为0~255，数值越大越省电，数值越小性能越好。</p>
<p>这里给大家参考下我的四个场景配置：</p>
<ol>
<li>性能：高性能，EPP 32</li>
<li>插电：平衡，EPP 128</li>
<li>离电：省电模式，EPP 192</li>
<li>节能：省电模式，EPP 255</li>
</ol>
<p><strong>设置开启自动启动</strong></p>
<ol>
<li>在桌面右键<code>此电脑</code>，点击<code>管理</code></li>
<li>左侧展开<code>任务计划程序</code>，点击<code>任务计划程序库</code></li>
<li>右侧<code>创建任务</code></li>
<li>取名”Throttlestop“</li>
<li>触发器页面，新建选择<code>当任何用户登陆时</code></li>
<li>操作页面，新建然后点击<code>浏览</code>，找到并选择Throttlestop.exe</li>
<li>条件页面，取消勾选<code>只有在计算机使用交流电源时才启动此任务</code></li>
</ol>
<blockquote>
<p>如果需要进一步提升续航，还可以在FIVR中限制CPU的电压，硬核延长续航，此操作有一定风险，并且新版BIOS限制了电压控制的功能，还需要先解锁电压控制，此处不做展开。</p>
</blockquote>
<hr />
<p>我的个人调教方案到这里就结束了，我们已经非常大程度提升了续航，可以带着笔记本出门放心耍啦</p>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>Hexo博客优化：如何优化Hexo的网站性能？</title>
    <link href="https://blog.gochi.cn/posts/hexo-optimize/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/hexo-optimize/</id>
    <published>2023-10-11T00:00:00.000Z</published>
    <updated>2023-10-11T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<p>对一个网站来说，性能是非常重要的，它决定了用户在网页停留的时长。</p>
<p>如果网页的加载速度很慢的话，用户很容易就会离去。</p>
<p>有朋友说我的博客速度挺快的，这篇文章就讲讲我是如何<strong>优化我的网站性能</strong>的。</p>
<h2>性能检测</h2>
<p>首先我们可以使用网站性能检测工具，来获取网站的性能报告，这样我们就可以知道是哪部分拖慢了网站速度，从而对其进行优化。</p>
<p>我用的工具是<strong>Chrome开发者工具</strong>中自带的<strong>Lighthouse</strong>，给出性能报告的同时，它还会给出一些优化的建议。</p>
<p>&lt;img src="https://p.gochi.cn/img/lighthouse.webp" alt="lighthouse"/&gt;</p>
<h2>Vercel网站托管</h2>
<p>我使用的是<a href="https://vercel.com/dashboard">Vercel</a>来托管我的网站，它在全球以及国内都有非常优秀的速度。如果想要让其在国内可以浏览的话，需要准备一个域名。</p>
<blockquote>
<p>具体如何使用可以参考<a href="https://www.fomal.cc/">Fomalhaut</a>的文章<a href="https://www.fomal.cc/posts/4aa2d85f.html">Hexo博客搭建基础教程(二)</a>中有详细教程。</p>
</blockquote>
<p><code>注意</code>：cname的解析方法目前会导致无法在国内访问，需要做一些修改
**失效方法：**记录值类型cname，值为cname.vercel-dns.com
**解决方法：**记录值类型A类型，值为76.223.126.88</p>
<p>&lt;img src="https://p.gochi.cn/img/jiexi.webp" alt="解析记录" /&gt;</p>
<h2>Vercel加速节点（新）</h2>
<blockquote>
<p>此章为2024.4新添加内容</p>
</blockquote>
<p>这是一个vercel加速节点，使用是会自动解析至附近可用节点，尽可能的选择优质节点。</p>
<p><strong>食用方法</strong>：将原来解析至 <code>cname.vercel.com</code> 改为 <code>vercel.cdn.yt-blog.top</code>（CNAME记录）</p>
<blockquote>
<p>由<a href="https://www.yt-blog.top/">Fgaoxing</a>提供，原文链接：<a href="https://www.yt-blog.top/9952/">【推一下Vercel加速节点】</a></p>
</blockquote>
<h2>图片压缩</h2>
<p>在我们的博客中，最消耗流量的应该就是图片了。所以为了提升加载速度，对图片的压缩非常重要。</p>
<p>1.每次将图片上传到图床之前，我都会对其进行压缩（控制在50kb以下）</p>
<p>2.同时，将图片转换成webp格式也会大大提高加载速度。</p>
<blockquote>
<p>这里推荐一个我一直在用的<a href="https://imagestool.com/webp2jpg-online/">多功能在线图片压缩</a>工具，非常方便快捷。</p>
</blockquote>
<h2>lazyload</h2>
<p>**lazyload(懒加载)**是一个对提升性能非常有效的功能，它会优先加载处于屏幕显示区域内的资源，而不是等待一整个页面的资源加载完毕。这让许多资源可以在用户边浏览的时候边加载，节省时间。</p>
<p>我给我的评论模块开启了lazyload，因为很多时候评论模块加载都会慢，导致用户要在加载页面等待。</p>
<h2>gulp压缩</h2>
<p><a href="https://www.gulpjs.com.cn/">gulp插件</a>可以帮助我们自动压缩博客静态资源。</p>
<blockquote>
<p>具体如何安装使用可以参考<a href="https://akilar.top/">Akilar</a>的文章<a href="https://akilar.top/posts/49b73b87/">【使用gulp压缩博客静态资源】</a></p>
</blockquote>
<h2>CDN</h2>
<p>让所有的静态资源通过**CDN(内容分发网络)**加载，可以提高资源加载速度。</p>
<blockquote>
<p>我使用的是<a href="https://blog.zhheo.com/">HEO</a>大佬分享的<a href="https://blog.zhheo.com/p/790087d9.html">【Butterfly CDN链接更改指南】</a>中给出的cdn</p>
</blockquote>
<p>这里给出我在butterfly中的cdn列表：</p>
<pre><code>    pjax: https://lib.baomitu.com/pjax/0.2.8/pjax.min.js
    twikoo: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/twikoo/1.4.18/twikoo.all.min.js
    sharejs: https://lib.baomitu.com/social-share.js/1.0.16/js/social-share.min.js
    sharejs_css: https://lib.baomitu.com/social-share.js/1.0.16/css/share.min.css
    lazyload: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/vanilla-lazyload/17.3.1/lazyload.iife.min.js
    instantpage: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/instant.page/5.1.0/instantpage.min.js
    typed: https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/typed.js/2.0.12/typed.min.js
    snackbar_css: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/node-snackbar/0.1.16/snackbar.min.css
    snackbar: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/node-snackbar/0.1.16/snackbar.min.js
    fontawesome: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/font-awesome/6.0.0/css/all.min.css
    justifiedGallery_js: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/justifiedGallery/3.8.1/js/jquery.justifiedGallery.min.js
    justifiedGallery_css: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/justifiedGallery/3.8.1/css/justifiedGallery.min.css
    aplayer_css: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/aplayer/1.10.1/APlayer.min.css
    aplayer_js: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/aplayer/1.10.1/APlayer.min.js
    meting_js: https://npm.elemecdn.com/hexo-anzhiyu-music@1.0.1/assets/js/Meting2.min.js
</code></pre>
<h2>总结</h2>
<p>这些大概就是我对我的网站做的优化总结了，其实还有很多地方可以再提升，但是对我来说已经够用了。</p>
<p>希望大家都可以积极地去优化网站的性能，这样才可以收获更多的游客🙂</p>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>摆脱3DM启动器打开游戏：避免捆绑下载笑傲江湖</title>
    <link href="https://blog.gochi.cn/posts/escape-3dm/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/escape-3dm/</id>
    <published>2023-06-06T00:00:00.000Z</published>
    <updated>2023-06-06T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<p>经常白嫖游戏的小伙伴应该都对<a href="https://www.3dmgame.com/">3DM</a>不陌生，里面有很多盗版游戏资源。但是呢，很多3dm下来的游戏都要用3dm启动器去打开，你说用你启动器打开就算了，就多点两下的事对吧。但是每次打开你启动器，你都要下载个“笑傲江湖”到我电脑里，删了还没用，下次启动的时候又会跳出来，这跟流氓软件有什么区别。今天就教大家怎么摆脱3DM流氓启动器，直接打开游戏。</p>
<p>&lt;img src="https://p.gochi.cn/img/xiaoao.webp" /&gt;</p>
<p>首先我们打开3dm启动器目录，如图，打开<code>3dmConfig.ini</code>文件，找到游戏exe文件的路径。</p>
<p>&lt;img src="https://p.gochi.cn/img/3dmpath.webp"/&gt;</p>
<p>接下来我们顺着路径去寻找，会发现根本就找不到游戏的exe文件。别慌，这是3dm耍的小把戏，把游戏启动的exe文件给隐藏了。我们要做的就是把被隐藏的文件给显示出来。</p>
<p>我们打开cmd窗口，进入对应的目录，然后执行dos命令：</p>
<blockquote>
<p>如何打开cmd窗口？win+r，然后输入cmd，点确定</p>
</blockquote>
<pre><code>attrib -s -a -h -r {name}.exe
</code></pre>
<p>&lt;img src="https://p.gochi.cn/img/cmd.webp"/&gt;</p>
<p>然后我们就能看到游戏的exe文件在目录中显示出来了，我们可以右键然后将快捷方式创建到桌面，之后我们就不需要用3dm启动器来打开游戏了😎。</p>
<p>&lt;img src="https://p.gochi.cn/img/3dmexe.webp"/&gt;</p>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>排序算法</title>
    <link href="https://blog.gochi.cn/posts/sorting-algorithm/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/sorting-algorithm/</id>
    <published>2023-02-28T00:00:00.000Z</published>
    <updated>2023-02-28T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<h4>各种排序</h4>
<table>
<thead>
<tr>
<th>排序</th>
<th>概述</th>
<th>时间复杂度</th>
</tr>
</thead>
<tbody>
<tr>
<td>计数排序</td>
<td>对应票投入对应票箱</td>
<td>O(n)</td>
</tr>
<tr>
<td>选择排序</td>
<td>最小的放前 (两重循环)</td>
<td>O(n^2^)</td>
</tr>
<tr>
<td>冒泡排序</td>
<td>依次比较相邻 (两重循环)</td>
<td>O(n^2^)</td>
</tr>
<tr>
<td>插入排序</td>
<td>依次拿出一张牌插入排列中 (两重循环)</td>
<td>O(n^2^)</td>
</tr>
<tr>
<td>...</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>这些排序各适用不同情况，但时间复杂度总体较大。</p>
<h4>快速排序</h4>
<p>程序设计竞赛中最普遍的排序。</p>
<p>随机选择哨兵，时间复杂度O(n log n)。但极端情况O(n^2^)。</p>
<p><strong>概述：</strong></p>
<p>选出一个哨兵，比哨兵小的数全放左边，比他大的全放右边。</p>
<p>再分别在左边和右边选出哨兵，进行分类。</p>
<p>以此循环，直到排序完成。</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

void qsort(int num[],int first,int last) {
	int i = first, j = last, flag = num[(first + last) / 2], temp;
	do {
		while (num[i] &lt; flag) i++;
		while (num[j] &gt; flag) j--;
		if (i &lt;= j) { 
			temp = num[i];
			num[i] = num[j];
			num[j] = temp;
			i++; j--;
		}
	} while (i &lt;= j); //带=为了让i和j交错而过，这样才可以用递归
	if(first&lt;j) qsort(num, first, j);
	if(i&lt;last) qsort(num, i, last);
}

int main()
{
	int n, num[100000];
	cin &gt;&gt; n;
    //必须从i=1开始
	for (int i = 1; i &lt;= n; i++) {
		cin &gt;&gt; num[i];
	}
	qsort(num,1,n);
	for (int i = 1; i &lt;= n; i++) {
		cout &lt;&lt; num[i]&lt;&lt;" ";
	}
	return 0;
}
</code></pre>
<p>当然也可以直接用algorithm头文件中的sort函数，</p>
<p>我们学会自己写是为了理解原理，提升思维，</p>
<p>同时在有特殊需求的时候可以更自定义化。</p>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>链表</title>
    <link href="https://blog.gochi.cn/posts/linked-list/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/linked-list/</id>
    <published>2023-01-09T00:00:00.000Z</published>
    <updated>2023-01-09T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<p>我们存储很多数的时候，通常使用数组，但是数组不够灵活。</p>
<p>哦？为什么说不灵活？</p>
<p>我们如果要在一个数组前面或者中间插入一个数，就会很麻烦。</p>
<p>假设我们有一个数组a,里面是排序好的数字,我们要将7按大小顺序插入数组</p>
<p>我们就得把后面的数全都依次往后移一位，再将7放入。</p>
<p>&lt;img src="https://p.gochi.cn/img/linklist1.webp" style="zoom:50%;" /&gt;</p>
<p>这样如果后面的数非常多的话就会很耽误时间。</p>
<p>所以我们需要用到<strong>链表</strong>。</p>
<p>链表就是利用<strong>结构体</strong>和<strong>指针</strong>，在存储数据的同时，存储一个指向下一个结点的指针。</p>
<p>这样我们要插入数字的时候，只要修改下指针的指向，就可以快速的进行插入或取出之类的操作。</p>
<p>&lt;img src="https://p.gochi.cn/img/linklist2.webp" style="zoom:50%;" /&gt;</p>
<p>链表有很多种：</p>
<p>**单链表:**每个结点记录后继(图片演示的就是)</p>
<p>**双链表:**每个结点记录前驱和后继，它比单链多了个往前走的功能</p>
<p>**循环单链表:**将单链表的最后一个结点的后继指向第一个结点，形成一个环形结构</p>
<p>**循环双链表:**将双链表连成环形</p>
<p>...（还有几种就不一一列述了）</p>
<p>这里我们设计一个程序实现一下链表，首先输入四个按大小顺序排列的数字，然后再输入要插入的数字，</p>
<p>程序会输出插入后的排列</p>
<p>先上代码</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

struct node {
	int data;//存数据
	node* next;//后继指针
};

int main()
{
	int a;
	node* head, * p, * q = NULL;
	head = NULL;
	for (int i = 1; i &lt; 5; i++) {
		//用指针p指向一个动态申请的node大小的空间
		p = (node*)malloc(sizeof(node));
		cin &gt;&gt; a;
		//将数据存入当前结点(p指向的结点)
		p-&gt;data = a;
		p-&gt;next = NULL;

		if (head == NULL)head = p;//如果是第一个结点，就将头指针指向当前结点
		else q-&gt;next = p;//否则将上一个结点的后继指针指向当前结点
		q = p;//将q指向当前结点
	}

	//插入数据
	int b;
	cin &gt;&gt; b;
	node* t = head;//从链表头开始遍历
	while (t != NULL) {
		if (t-&gt;next-&gt;data &gt; b) {
			p = (node*)malloc(sizeof(node));
			//将数据存入当前结点(p指向的结点)
			p-&gt;data = b;
			p-&gt;next = t-&gt;next;//将当前结点的后继指针指向下一结点
			t-&gt;next = p;//将上一结点的后继指针指向当前结点
			break;
		}
		t = t-&gt;next;//下一结点
	}

	//输出
	t = head;//从链表头开始遍历
	while (t != NULL) {
		cout &lt;&lt; t-&gt;data &lt;&lt; endl;
		t = t-&gt;next;//下一结点
	}

	//释放动态申请的空间(确保安全)
	t = head;
	while (t != NULL) {
		node* current = t;//记录当前结点
		t = t-&gt;next;//下一结点
		free(current);
	}
	return 0;
}
</code></pre>
<p>代码不长，但是可能需要时间理解。</p>
<p>讲讲<strong>malloc函数</strong>，malloc函数的作用是<strong>动态分配内存</strong>。</p>
<p>每次输入数据前，我们就用p指向一个动态申请的新空间，然后存入数据。</p>
<p>程序的最后，我们用<strong>free()函数</strong>来<strong>释放</strong>动态申请的<strong>空间</strong>，这样可以让我们的程序更安全。</p>
<p>我们学习c语言和c++应该追求最大程度地优化，排除可能出现的问题。</p>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>欧拉筛-高效筛选质数</title>
    <link href="https://blog.gochi.cn/posts/euler-sieve/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/euler-sieve/</id>
    <published>2022-12-23T00:00:00.000Z</published>
    <updated>2022-12-23T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<p>如何高效筛素数？让我们来看看</p>
<p><strong>题目</strong>：生成一个1到n范围内的质数数组</p>
<h2>菜鸟这样做（枚举法）</h2>
<p>从1枚举到n，判断是素数就存入数组</p>
<p>下面是判断方法</p>
<h3>菜鸟：</h3>
<p>从2枚举到n-1，如果有能整除该数的，该数就是质数。</p>
<h3>进化版菜鸟：</h3>
<p>菜鸟进化了，从2枚举到$\sqrt n$</p>
<hr />
<h2>高手版</h2>
<h3>埃氏筛</h3>
<p>这样筛掉后每次下一位没被筛掉的数就都是质数</p>
<pre><code>bool numlist[100000];
//0代表质数，1代表非质数
int prime[100000], count;
void work(int n){
	for(int i=2; i&lt;=n; i++){
		if(numlist[i]==0){  //如果是质数
			prime[++count] = i ;  //就先存入
			for(int j=i; i*j&lt;=n; j++) numlist[i*j] = 1;  //然后将其平方后的所有倍数筛掉
		}
	}
	return;
}
</code></pre>
<p>但是这钟筛法还不是最优，因为p的倍数会重复，所以有些数会被重复筛掉。</p>
<p>那么就引出了我们的最终筛法。</p>
<h3>欧拉筛</h3>
<p>&lt;img src="https://p.gochi.cn/img/oula-sticker.webp"&gt;</p>
<p>这个筛法避免了重复筛，思路就是：每个合数只会被其<strong>最大非自身因数</strong>筛除</p>
<p>多说无益，先上代码：</p>
<pre><code>bool numlist[100000];
//0代表质数，1代表非质数
int prime[100000], count;
void work(int n){
	for (int i = 2; i &lt;= n; i++) {
		if (numlist[i]==0) ans[++count] = i;//是质数就先存入数组
		for (int j = 1; j &lt;= count &amp;&amp; i*prime[j] &lt;= n; j++) {
			numlist[prime[j] * i] = 1; //每次让i乘已放入的质数，然后标记非质数
			if (i % prime[j] == 0) break;//但是如果i可以被该数整除就停止（关键）
		}
	}
</code></pre>
<p>现在我们再来分析下。</p>
<p>从表可以看出，我们会筛掉每个质数p的平方之后的p的倍数，但是如果i是p的倍数，那就说明它们的乘积那个合数的最大非自身因数不是i，所以不筛。</p>
<table>
<thead>
<tr>
<th><em>i</em> 的值</th>
<th>质数表</th>
<th>筛去的数</th>
</tr>
</thead>
<tbody>
<tr>
<td>2</td>
<td>2</td>
<td>4</td>
</tr>
<tr>
<td>3</td>
<td>2, 3</td>
<td>6, 9</td>
</tr>
<tr>
<td>4</td>
<td>2, 3</td>
<td>8</td>
</tr>
<tr>
<td>5</td>
<td>2, 3, 5</td>
<td>10, 15, 25</td>
</tr>
<tr>
<td>6</td>
<td>2, 3, 5</td>
<td>12</td>
</tr>
<tr>
<td>7</td>
<td>2, 3, 5, 7</td>
<td>14, 21, 28, 35</td>
</tr>
<tr>
<td>⋯</td>
<td>⋯</td>
<td>⋯</td>
</tr>
</tbody>
</table>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>算法：高精度运算</title>
    <link href="https://blog.gochi.cn/posts/precision/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/precision/</id>
    <published>2022-12-20T00:00:00.000Z</published>
    <updated>2022-12-20T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<p>我们知道每种数据类型的储存空间是有限的，如果我们要储存非常大的数可以用long long，更大则unsigned long long，再大就是有些编译器提供的_int128类型，但是要是比这还要大呢?我们就需要用到<strong>高精度运算</strong>，<strong>用数组来模拟非常大的整数</strong>。</p>
<p>我们只要定义一个数组，把数字分别放入数组序列中就可以储存非常大的数。</p>
<p>接下来我们看看怎么使用高精度运算。</p>
<p>（注意以下都是我个人的解法，不一定是最优解，借鉴学习即可）</p>
<h2>A+B</h2>
<p>**题目：**高精度加法，相当于 a+b problem，不用考虑负数。（<a href="https://www.luogu.com.cn/problem/P1601">洛谷P1601题</a>）</p>
<p>输入a和b，然后输出a+b，太简单了！但是，题目要求的是高精度加法，也就是说输入的a和b是非常大的，我们要使用高精度才能储存该数进行处理。</p>
<p>首先我们看看加法的竖式</p>
<p>&lt;img src="https://p.gochi.cn/img/a+b.webp" style="zoom: 15%;" /&gt;</p>
<p>如果<strong>超过10</strong>就要向下一位<strong>进位</strong>，进位的数字和下一位的值相加</p>
<pre><code>#include&lt;iostream&gt;
#include&lt;string&gt;
#include&lt;algorithm&gt;//包含max函数
using namespace std;
int A[500], B[500], C[500];//这个定义必须放在主函数外!!!这样它才会初始化，我被这个坑惨了
int main(){
    string a,b;
    cin &gt;&gt; a &gt;&gt; b;
    int lena = a.length(), lenb = b.length();
    int len = max(lena, lenb);
    //把字符变成对应的数字，并倒序存入
    for (int i = 0; i &lt; lena; i++) A[i] = a[lena-1-i] - '0';
    for (int i = 0; i &lt; lenb; i++) B[i] = b[lenb-1-i] - '0';
    //相加并处理进位
    for (int i = 0; i &lt; len; i++) {
        //相加
        C[i] += A[i] + B[i];  
        //进位
        C[i + 1] = C[i] / 10;
        C[i] = C[i] % 10;
    }
    //如果进位使得位数增加，我们就多输出一位
    if (C[len]) len++;
    //因为我们之前是倒序存入，所以现在倒序输出就又正了
    for (int i = len-1 ; i &gt;= 0; i--) cout &lt;&lt; C[i];
    return 0;
}
</code></pre>
<h2>A*B</h2>
<p>**题目：**给出两个非负整数，求它们的乘积。每个非负整数不超过 10^2000^（<a href="https://www.luogu.com.cn/problem/P1303">洛谷P1303题</a>）</p>
<p>还是一样，看似是道弱智题，但是我们要注意输入值的范围，数值非常大，再加上要相乘，很容易就会超过我们数据类型范围，所以又要用到我们的高精度方法。</p>
<p>算乘法，我们就先复习下乘法竖式</p>
<p>&lt;img src="https://p.gochi.cn/img/axb.webp" style="zoom: 15%;" /&gt;</p>
<p><strong>几个需要知道的点</strong></p>
<ul>
<li>和加法非常像，也是<strong>超10进位</strong>。</li>
<li>这里有个很重要的规律，我们<strong>倒着数</strong>，<strong>第一个数的i位乘第二个数的j位，它们的乘积会到第(i+j-1)位上</strong>。</li>
<li><strong>乘积的位数不超过两数的位数之和</strong>。</li>
</ul>
<p>知道了这个，我们就可以开始了。</p>
<pre><code>#include&lt;iostream&gt;
#include&lt;string&gt;
using namespace std;
int A[5000], B[5000], C[5000];
int main(){
    string a, b;
    cin &gt;&gt; a &gt;&gt; b;
    int lena = a.length(), lenb = b.length();
    //转化成对应数字并倒序存入
    for (int i = 1; i &lt;= lena; i++) A[i] = a[lena - i]-'0';
    for (int i = 1; i &lt;= lenb; i++) B[i] = b[lenb - i]-'0';
    //计算乘积
    for (int i = 1; i &lt;= lena; i++) {
        for (int j = 1; j &lt;= lenb; j++) C[i + j - 1] += A[i] * B[j];
    }
    int len = lena + lenb;//乘积的位数不超过两数的位数之和
    //处理进位
    for (int i = 1; i &lt;= len; i++) {
        C[i + 1] += C[i] / 10;
        C[i] %= 10;
    }
    //去掉多余输出的位数
    while (!C[len]) len--;
    //特殊情况，乘积等于0
    if (len &lt; 1) len = 1;
    //输出
    for (int i = len ; i &gt;= 1; i--) cout &lt;&lt; C[i];
    return 0;
}
</code></pre>
<hr />
<h2>阶乘之和</h2>
<p><strong>题目描述</strong></p>
<p>用高精度计算出 $S = 1! + 2! + 3! + \cdots + n!$（$n \le 50$）。</p>
<p>其中 <code>!</code> 表示阶乘，定义为 $n!=n\times (n-1)\times (n-2)\times \cdots \times 1$。例如，$5! = 5 \times 4 \times 3 \times 2 \times 1=120$。</p>
<p>输入n，输出s。（<a href="https://www.luogu.com.cn/problem/P1009">洛谷P1009题</a>）</p>
<p>这道题可以说是前两道题的结合。</p>
<p>这是我的解法，因为这道题较特殊，所以可以做到比前两道的代码还短，可能有点抽象，要仔细思考</p>
<pre><code>#include&lt;iostream&gt;
using namespace std;
int main()
{
    int i, A[1005] = { 0 }, B[1005] = { 0 }, n, j;
    cin &gt;&gt; n;
    A[0] = B[0] = 1;
    //这个循环是外面的加法
    for (i = 2; i &lt;= n; i++) {
        //阶乘的相乘
        for (j = 0; j &lt; 100; j++)
            B[j] *= i;
        //阶乘的进位
        for (j = 0; j &lt; 100; j++)
            if (B[j] &gt; 9) {
                B[j + 1] += B[j] / 10;
                B[j] %= 10;
            }
        //每算完一个阶乘就加进结果并处理进位
        for (j = 0; j &lt; 100; j++) {
            A[j] += B[j];
            if (A[j] &gt; 9) {
                A[j + 1] += A[j] / 10;
                A[j] %= 10;
            }
        }
    }
    //去除多余的位数
    for (i = 100; i &gt;= 0 &amp;&amp; A[i] == 0; i--);
    //输出
    for (j = i; j &gt;= 0; j--) cout&lt;&lt; A[j];
    return 0;
}
</code></pre>
<hr />
<p>灵活掌握，举一反三才能在程序竞赛中绽放自我。</p>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>辗转相除法-求最大公因数</title>
    <link href="https://blog.gochi.cn/posts/euclidean/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/euclidean/</id>
    <published>2022-12-14T00:00:00.000Z</published>
    <updated>2022-12-14T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<p>辗转相除法是一种求最大公因数的计算方法。</p>
<p>这种方法在编程中很常用，在数学计算中也可以用来求很复杂的最大公因数问题。</p>
<h2>如何使用</h2>
<p>题目：求最大公因数(36,14)</p>
<p>我们如何用辗转相除法做这道题呢？</p>
<p>$$
{
反复用除数除以余数直到除尽 \\
36{\div}14=2\dots8\
14{\div}8=1\dots6\
8{\div}6=1\dots2\
6{\div}2=3\
最后一个除数就是最大公约数，也就是2
}
$$</p>
<p>我们算出最大公约数(36,14)=2</p>
<p>到这里，我们就知道如何使用辗转相除法了。</p>
<p>但是，鲁迅曾说过“我们学公式必须得懂得原理”，我们明白了原理才能灵活运用</p>
<h2>原理</h2>
<p>求最大公因数(a,b)</p>
<p>首先我们推出这几条式子</p>
<p>$$
{
a{\div}b=q\dots r \
a=bq+r \
r=a-bq
}
$$</p>
<p><strong>这是我们辗转法的原理</strong></p>
<p>$${
(a,b)=(b,r) \a和b的最大公约数就等于b和r的最大公约数
}
$$</p>
<p>接下来让我们证明这条公式</p>
<p>$$
{
(1)设(a,b)=d \那么a=dm,b=dn \然后我们将其带入r=a-bq \
得r=d(m-nq)\
因为m,n,q都是整数，所以r是d的倍数，d是r的因数\
所以：只要是a,b的因数，就一定是d,r的约数\
}
$$</p>
<p>$$
{
(2)设(b,r)=d\
和之前一样，那么b=dx,r=dy\
然后将其代入a=bq+r\
得a=d(xq+y)\
因为x,q,y都是整数，所以a是d的倍数，d是a的因数\
所以：只要是d,r的因数，就一定是a的因数\
}
$$</p>
<p>这样，我们就得出(a,b)的因数和(b,r)的因数相同，它们的因数都相同，那么它们的最大公因数也就相同。</p>
<p>所以我们要求(a,b)的最大公因数，我们就通过可以求(b,r)的最大公因数来得到。</p>
<p><strong>现在我们再来看看开头的题</strong></p>
<p>题目：求最大公因数(36,14)</p>
<p>反复用(a,b)=(b,r)的方法</p>
<p>(36,14)=(14,8)=(8,6)=(6,2)</p>
<p>最后得到(6,2)，显而易见最大公约数是2</p>
<h2>写gcd函数</h2>
<p>接下来看看我们如何在C++中用辗转相除法写gcd函数</p>
<p>gcd函数就是用来求最大公因数的函数</p>
<pre><code>int gcd(int a,int b) {
	while (a % b != 0) //a能被b整除时就终止循环
    {
		int r = a % b;
		a = b;
		b = r; //讲a换成除数b，b换成余数r
	}
</code></pre>
<p>当然也可以直接用algorithm头文件中的gcd函数，</p>
<p>我们学会自己写是为了理解原理，提升思维，</p>
<p>自己写还可以在有特殊需求的时候更自定义化。</p>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
  <entry>
    <title>如何用Hexo搭建个人博客?</title>
    <link href="https://blog.gochi.cn/posts/hexo-build/" rel="alternate" type="text/html"/>
    <id>https://blog.gochi.cn/posts/hexo-build/</id>
    <published>2022-12-10T00:00:00.000Z</published>
    <updated>2022-12-10T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<blockquote>
<p><code>2024.4</code> 我出了视频版教程啦：<a href="https://www.bilibili.com/video/BV1Ju4m1c7WR/">bilibili视频链接</a></p>
</blockquote>
<p>我的个人博客搭建成功啦！</p>
<p>这篇文章会给大家分享我是如何从0开始搭建我的个人独立博客的</p>
<p>接下来我们开始吧</p>
<p><strong>文章比较精简，没有废话，不要跳步</strong></p>
<h2>准备工具</h2>
<p>首先我们需要到对应网站下载需要的工具</p>
<p><strong><a href="https://nodejs.org/en/">下载nodejs</a></strong></p>
<hr />
<p><em>(这篇文章里有修改nodejs缓存路径的教学:<a href="https://www.cnblogs.com/liuqiyun/p/8133904.html">文章链接</a>，c盘战士可以不看)</em></p>
<p><strong><a href="https://git-scm.com/downloads">下载git</a></strong></p>
<hr />
<p>一直点确定就行，全部按它默认勾的</p>
<p><em>(这里有一篇详细安装教程<a href="https://www.cnblogs.com/xueweisuoyong/p/11914045.html">文章链接</a>，可以不看)</em></p>
<p><strong>接下来我们测试下是否都下载成功</strong></p>
<p>管理员运行cmd，依次输入</p>
<pre><code>node -v
npm -v（这个是node附带的）
git -v
</code></pre>
<p><strong>下载hexo</strong></p>
<pre><code>npm install hexo-cli -g
</code></pre>
<h2>搭建仓库</h2>
<p>成功下载好工具之后，我们开始搭建GitHub存储静态页面的仓库</p>
<p>首先注册/登入<a href="https://github.com/">Github</a></p>
<p>点击Create a new repository进入新建仓库页面</p>
<p>仓库名输入：</p>
<pre><code>用户名.github.io
</code></pre>
<p>勾选 Public</p>
<p>勾选 Add a README file</p>
<p>拉到下面点击create创建</p>
<h2>生成SSH Keys</h2>
<p>进入任意文件夹，右键空白处然后点Git bash here,输入</p>
<pre><code>ssh-keygen -t rsa -C "邮件地址"
</code></pre>
<p>然后敲4次Enter⌨️</p>
<p>然后进入C:\Users\用户名，在里面进入.ssh文件</p>
<p>用记事本打开里面的id_rsa.pub,全选复制里面的代码</p>
<p><strong>然后打开github</strong></p>
<p>进入用户设置，找到SSH keys</p>
<p>新建SSH keys，名称随意，在下面粘贴代码，</p>
<p>然后创建</p>
<p><strong>测试是否成功</strong></p>
<p>在git bash中输入</p>
<pre><code>ssh -T git@github.com
</code></pre>
<p>回车，然后再输入yes</p>
<h2>本地生成博客内容</h2>
<p>在喜欢位置新建文件Blog，然后进入文件夹</p>
<p>右键空白处然后点Git bash here，输入</p>
<pre><code>hexo init
</code></pre>
<blockquote>
<p>如果‘command not find’，就在前面加上npx，如：<code>npx hexo init</code></p>
</blockquote>
<p>然后</p>
<pre><code>hexo install
</code></pre>
<p>接下来依次输入</p>
<pre><code>hexo g
hexo s
</code></pre>
<p>（如果不成功的话就重复直到成功，因为国内与github连接不稳定）</p>
<p>现在就可以复制生成的链接进入浏览器看到我们生成的本地服务器了</p>
<p>然后回到命令行，ctrl+c关闭</p>
<h2>上线博客</h2>
<p>进入之前的Blog文件夹，用记事本打开_config.yml</p>
<p>拉到最下面将deploy后面的全删掉，复制粘贴这段</p>
<pre><code>  type: git
  repository: 
  branch: main
</code></pre>
<blockquote>
<p>注意缩进格式：每行前面都有两个空格不要删，每个冒号后面都有个空格也不要删！</p>
</blockquote>
<p>去github之前生成的仓库页面，点code，复制https链接</p>
<p>将其粘贴到我们记事本中的<code>repository：</code>后面</p>
<p>然后保存退出</p>
<p><strong>回到博客文件夹，git bash</strong></p>
<p>安装自动部署发布工具</p>
<pre><code>npm install hexo-deployer-git --save
</code></pre>
<p>然后在Blog文件夹右键打开git bash，依次输入</p>
<pre><code>hexo g（生成）
hexo d（上传）
</code></pre>
<blockquote>
<p>如果是第一次使用git的话会需要配置</p>
<pre><code>git config --global user.email "你的邮箱"
git config --global user.name "你的名字"
</code></pre>
<p>配置完后再<code>hexo d</code>上传</p>
<p>在跳出来的窗口内进行登录</p>
</blockquote>
<p>接下来我们就成功把本地内容上传到github了</p>
<p>上传成功以后，我们就算搭建好了！上自己的网址看看吧</p>
<p>网址是我们之前设的仓库名：用户名.github.io</p>
<h2>网站资料</h2>
<p>我们的博客标题还是默认的hexo，整个页面是初始默认的，接下来我们对其进行修改</p>
<p>用记事本打开我们blog文件夹中的_config.yml文件</p>
<p>将#Site下面按自己的需求填上</p>
<pre><code>## Site
title: 标题
subtitle: 副标题
description: 描述
keywords: 关键词
author: 站主
language: 语言（可以填写zh-CN）
timezone: 时区（可以填写Asia/Shanghai）
</code></pre>
<p>然后保存</p>
<h2>如何上传文章</h2>
<p>我们在Blog文件夹中打开git bash,输入下方代码就可以生成新的文章md文件</p>
<pre><code>hexo new 文章标题
</code></pre>
<p>文章是.md格式，在我们的Blog文件夹中的source/_posts中</p>
<p>推荐用Typora软件来编辑.md格式的文件</p>
<blockquote>
<p>Typora官网：https://www.typoraio.cn/（89元终身使用，推荐正版）</p>
<p>破解版奉上：<a href="https://kevinwu06.lanzout.com/iXkq30icv1ha">蓝奏云文件</a></p>
</blockquote>
<p>然后我们用Typora软件打开该.md文件就可以开始写文章了</p>
<p>写好以后，我们还是一样打开git bash生成、上传</p>
<pre><code>hexo g
hexo d
</code></pre>
<hr />
<p>至此，我们就成功搭建好基本的博客了，剩下的就是对博客的一些优化和美化了。</p>
<p>我目前使用的hexo博客主题是<a href="http://docs.anheyu.com/">anzhiyu</a>，推荐主题：<a href="https://butterfly.js.org/posts/21cfbf15/">Butterfly</a>，<a href="http://docs.anheyu.com/">anzhiyu</a></p>
<p>大家可以参阅主题文档进行安装配置</p>
<p>有什么问题的话欢迎评论。</p>
<blockquote>
<p>本篇下文：<a href="/p/138e.html">Hexo搭建进阶：Vercel部署、主题安装、基础用法</a>
我的<strong>Hexo优化系列</strong>：<a href="https://www.fomal.cc/posts/4aa2d85f.html">Hexo文章目录</a></p>
</blockquote>
]]></content>
    <author><name>枸杞加水</name></author>
  </entry>
</feed>
