<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>yangpeiyuan</title><link>https://blog.yangpeiyuan.com/</link><description>yangpeiyuan的个人博客。记录生活，分享数码产品评测、效率应用推荐、软件使用技巧等内容。</description><generator>Hugo 0.147.7</generator><language>zh-CN</language><lastBuildDate>Tue, 06 Jan 2026 12:11:57 +0000</lastBuildDate><atom:link href="https://blog.yangpeiyuan.com/index.xml" rel="self" type="application/rss+xml"/><item><title>启用bat和fzf命令行工具</title><link>https://blog.yangpeiyuan.com/posts/use-bat-and-fzf/</link><guid>https://blog.yangpeiyuan.com/posts/use-bat-and-fzf/</guid><pubDate>Tue, 06 Jan 2026 12:11:57 +0000</pubDate><content:encoded><![CDATA[<p>新的一年，在Ubuntu上开始使用2个新的命令行工具提升效率</p>
<h2 id="bat">bat</h2>
<p>bat 是 cat 的“现代增强版”。支持<strong>语法高亮</strong>（支持上百种语言）、自动行号、自动分页。看代码、配置文件、日志 <strong>一眼就清楚</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装包</span>
</span></span><span class="line"><span class="cl">sudo apt install -y bat
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 编辑配置文件，增加alias</span>
</span></span><span class="line"><span class="cl">vim ~/.zshrc
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> ,bat<span class="o">=</span><span class="s1">&#39;batcat&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.bashrc
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 验证</span>
</span></span><span class="line"><span class="cl">,bat --version
</span></span></code></pre></div><blockquote>
<p>Ubuntu/Debian 系里 <code>bat</code> 可执行文件通常叫 <strong><code>batcat</code></strong>（避免与别的包名冲突)</p></blockquote>
<h2 id="fzf">fzf</h2>
<p>fzf 是一个“模糊搜索选择器”。支持<strong>模糊匹配</strong>（不需要完整输入）、实时筛选。搭配bat选文件的同时就能看到内容。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装包</span>
</span></span><span class="line"><span class="cl">sudo apt install -y fzf
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 验证</span>
</span></span><span class="line"><span class="cl">fzf --version
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 在 ~/.zshrc 中加入fzf 基础功能。启用官方补全与快捷键（必须）</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> -f /usr/share/doc/fzf/examples/key-bindings.zsh <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">source</span> /usr/share/doc/fzf/examples/key-bindings.zsh
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> -f /usr/share/doc/fzf/examples/completion.zsh <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">source</span> /usr/share/doc/fzf/examples/completion.zsh
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Ubuntu 安装的 fzf 默认不会自动生效，需要手动 source。</span>
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.zshrc
</span></span></code></pre></div><p>你将获得：</p>
<ul>
<li><code>Ctrl + R</code>：模糊搜索历史命令</li>
<li><code>Ctrl + T</code>：模糊选择文件/目录插入命令行</li>
<li><code>Alt + C</code>：模糊跳转目录</li>
</ul>
<h2 id="fzf--bat-联动核心爽点">fzf + bat 联动（核心爽点）</h2>
<p>文件预览（bat 高亮显示），在 <code>~/.bashrc</code> 中加入</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">FZF_DEFAULT_OPTS</span><span class="o">=</span><span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">--height 80%
</span></span></span><span class="line"><span class="cl"><span class="s2">--layout=reverse
</span></span></span><span class="line"><span class="cl"><span class="s2">--border
</span></span></span><span class="line"><span class="cl"><span class="s2">--preview &#39;batcat --style=numbers --color=always {}&#39;
</span></span></span><span class="line"><span class="cl"><span class="s2">--preview-window=right:60%
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;</span>
</span></span></code></pre></div><h2 id="一图胜千言">一图胜千言</h2>
<p><img src="https://static.appd.top/blog/20260107Screenshot-2026-01-07.webp" alt="fzf+bat"></p>
]]></content:encoded></item><item><title>让IPv6下qBittorrent-nox的速度起飞</title><link>https://blog.yangpeiyuan.com/posts/qbittorrent-ipv6-setting/</link><guid>https://blog.yangpeiyuan.com/posts/qbittorrent-ipv6-setting/</guid><pubDate>Sun, 04 Jan 2026 14:21:57 +0000</pubDate><content:encoded><![CDATA[<p>宽带快到期，续费的时候被告知之前的动态公网 IP 续费后就回收了。现在也开不了。如果想开请去营业厅签协议并多交 ¥600 。滚犊子！折腾下IPv6 配置 qbittorrent。还好顺利搞定，不然就准备换宽带运营商了。</p>
<h2 id="路由器开启ipv6">路由器开启IPv6</h2>
<p>1️⃣ 开 Native IPv6
2️⃣ 选 PPP
3️⃣ 启用 DHCP-PD
4️⃣ 看是否拿到 <strong>非 fe80::</strong> 地址</p>
<blockquote>
<p><strong>只要你在电脑或 BT 客户端里看到非 fe80:: 的 IPv6，
就等于你已经绕过 CGNAT 了。</strong></p></blockquote>
<h2 id="qbittorrent-nox-的docker-composeyml">qBittorrent-nox 的docker-compose.yml</h2>
<p>Docker 里的 qBittorrent nox，network_mode: host<strong>这是跑 BT / PT 的标准解法</strong></p>
<p>docker-compose 示例</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">services:
</span></span><span class="line"><span class="cl">  qbittorrent-nox:
</span></span><span class="line"><span class="cl">    image: qbittorrentofficial/qbittorrent-nox:latest
</span></span><span class="line"><span class="cl">    container_name: qbittorrent-nox
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># ⭐ 核心：使用宿主机网络</span>
</span></span><span class="line"><span class="cl">    network_mode: host
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    environment:
</span></span><span class="line"><span class="cl">      - <span class="nv">PGID</span><span class="o">=</span><span class="m">1000</span>
</span></span><span class="line"><span class="cl">      - <span class="nv">PUID</span><span class="o">=</span><span class="m">1000</span>
</span></span><span class="line"><span class="cl">      - <span class="nv">QBT_LEGAL_NOTICE</span><span class="o">=</span>confirm
</span></span><span class="line"><span class="cl">      - <span class="nv">QBT_WEBUI_PORT</span><span class="o">=</span><span class="m">8080</span>
</span></span><span class="line"><span class="cl">      - <span class="nv">TZ</span><span class="o">=</span>Asia/Shanghai
</span></span><span class="line"><span class="cl">      - <span class="nv">UMASK</span><span class="o">=</span><span class="m">000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    read_only: <span class="nb">false</span>
</span></span><span class="line"><span class="cl">    stop_grace_period: 30m
</span></span><span class="line"><span class="cl">    tmpfs:
</span></span><span class="line"><span class="cl">      - /tmp
</span></span><span class="line"><span class="cl">    tty: <span class="nb">true</span>
</span></span><span class="line"><span class="cl">    volumes:
</span></span><span class="line"><span class="cl">      - <span class="si">${</span><span class="nv">QBT_CONFIG_PATH</span><span class="si">}</span>:/config
</span></span><span class="line"><span class="cl">      - <span class="si">${</span><span class="nv">QBT_DOWNLOADS_PATH</span><span class="si">}</span>:/downloads
</span></span><span class="line"><span class="cl">    restart: unless-stopped
</span></span><span class="line"><span class="cl">    depends_on:
</span></span><span class="line"><span class="cl">      - wait-service
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  wait-service:
</span></span><span class="line"><span class="cl">    image: busybox
</span></span><span class="line"><span class="cl">    command: sleep <span class="m">30</span>
</span></span></code></pre></div><h2 id="ufw防火墙配置">UFW防火墙配置</h2>
<p>开启UFW,把qbittorrent中固定的端口（6881）放行。给内网网段开放所以端口</p>
<pre tabindex="0"><code>$ sudo ufw status
[sudo] password for yangpeiyuan: 
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
6881/tcp                   ALLOW       Anywhere                  
6881/udp                   ALLOW       Anywhere                  
8080/tcp                   ALLOW       192.168.1.0/24            
Anywhere                   ALLOW       192.168.1.0/24            
22/tcp (v6)                ALLOW       Anywhere (v6)             
6881/tcp (v6)              ALLOW       Anywhere (v6)             
6881/udp (v6)              ALLOW       Anywhere (v6)  
</code></pre><h2 id="conclusion">Conclusion</h2>
<p>第一次搞 ipv6 ，很多概念都不是很了解。幸好现在有 AI，不厌其烦的给出解答。最终磁力链速度稳稳的 &gt;10Mb/s</p>
]]></content:encoded></item><item><title>记录下买的小玩意儿</title><link>https://blog.yangpeiyuan.com/posts/my-favored-stuff-2026/</link><guid>https://blog.yangpeiyuan.com/posts/my-favored-stuff-2026/</guid><pubDate>Fri, 02 Jan 2026 14:28:57 +0000</pubDate><content:encoded><![CDATA[<h2 id="momax-摩米士移动电源">momax 摩米士移动电源</h2>
<p>2026-01-01    ¥218 套装版</p>
<p>有了快充后基本上也用不上移动电源。国内到处都可以插上快充头进行充电。这次去香港跨年收拾行李时才发现家里的移动电源都是 10 年前的，没 3C 标志无法上飞机。在入住的酒店大堂看到展示的这款。 京东下单了套装版（5000mAh移动电源,30W 充电头,磁吸线,收纳包）</p>
<ul>
<li>轻薄一片 小巧便携，磁吸稳稳吸附在手机背后。</li>
<li>快充半个小时可以充到56%</li>
<li>有线的，自带线。不发烫。</li>
</ul>
<p><a href="https://static.appd.top/blog/20260104PXL_20260104_062859665.webp"><img src="https://static.appd.top/blog/20260104PXL_20260104_062859665_1080p.webp" alt="摩米士移动电源"></a>
<small>宽度和 iPhone15很 match</small></p>
<p><a href="https://static.appd.top/blog/20260104IMG_8198.webp"><img src="https://static.appd.top/blog/20260104IMG_8198_1080p.webp" alt="摩米士移动电源"></a>
<small>新老交替，只买过这 2 个移动电源</small></p>
<h2 id="birkenstock-勃肯鞋">BIRKENSTOCK 勃肯鞋</h2>
<p>2026-01-01    ¥1250</p>
<p>好不容易和老婆审美一致，在深圳一起买了情侣鞋。第一次一起买情侣鞋还是 2014 年。</p>
<p><small>2026 年深圳一起买情侣鞋</small></p>
<p><img src="https://static.appd.top/blog/20260104shoes.jpg" alt="2024 年的情侣鞋">
<small>2014年一起买的情侣鞋</small></p>
<h2 id="电脑椅防滑脚垫">电脑椅防滑脚垫</h2>
<p>2026-01-26    ¥25</p>
<p>拼多多上买的，5个装。偶然在小红书上看到说久坐在带滚轮的电脑椅上会导致腰部无意识的用力，久而久之就会腰酸背痛。其实只要装2个就能有效防滑了，装上后和轮子严丝合缝，坐了2天果然腰和肩膀的酸痛有明显的改善。花小钱办大事，无与伦比的好用。</p>
<p><img src="https://static.appd.top/blog/20260126IMG_8317.webp" alt="电脑椅防滑脚垫"></p>
<p><img src="https://static.appd.top/blog/20260126IMG_8319.webp" alt="电脑椅防滑脚垫"></p>
<h2 id="ns-switch-pro手柄">NS Switch Pro手柄</h2>
<p>2026-01-29    ¥318</p>
<p>拼多多日本直邮，用了7天收到货。我也不知道买了干嘛就是想买个做纪念。</p>
<p><img src="https://static.appd.top/blog/20260215IMG_8328.webp" alt=""></p>
<p><img src="https://static.appd.top/blog/20260215IMG_8329.webp" alt=""></p>
<h2 id="眼镜zeiss-174杂牌镜架">眼镜ZEISS 1.74+杂牌镜架</h2>
<p>2026-02-07    ¥1900</p>
<p>上个眼镜用了9年，现在戴着鼻托不舒服了。这次尝试在公寓楼里的眼镜店（九格眼镜）配的，带了一段时间的感受：</p>
<ul>
<li>650°，1.74和1.67 差别基本无感。</li>
<li>¥500的杂牌镜架和日本金子眼镜¥2500手造镜架，体感上也差不多。</li>
<li>属于使用寿命到期的常规更换。</li>
</ul>
<p><img src="https://static.appd.top/blog/20260215IMG_8433.webp" alt="眼镜"></p>
]]></content:encoded></item><item><title>试试桌面有线麦克风</title><link>https://blog.yangpeiyuan.com/posts/logitech-blue-yeti-nano/</link><guid>https://blog.yangpeiyuan.com/posts/logitech-blue-yeti-nano/</guid><pubDate>Tue, 09 Dec 2025 13:10:57 +0000</pubDate><content:encoded><![CDATA[<p>最近和 AI 沟通 连字都懒的敲了，想直接语音对话模式，才发现Mac Studio 没有自带麦克风。</p>
<p>¥200 在闲鱼上收了个小巧精致，好看又好用的桌面有线麦克风 <code>blue yeti nano</code> 。现在动嘴就行，舒服～</p>
<p><img src="https://static.appd.top/blog/20251210IMG_7742.webp" alt=""></p>
<p><img src="https://static.appd.top/blog/20251210IMG_7741.webp" alt=""></p>
]]></content:encoded></item><item><title>Jetbrains IDE Goland 2025.1.3 激活</title><link>https://blog.yangpeiyuan.com/posts/jetbrains-ide-goland-2025-1-3/</link><guid>https://blog.yangpeiyuan.com/posts/jetbrains-ide-goland-2025-1-3/</guid><pubDate>Thu, 26 Jun 2025 22:40:54 +0800</pubDate><content:encoded><![CDATA[<h2 id="流程">流程</h2>
<ul>
<li>官网下载并安装（安装后无需运行，完成即可）：https://www.jetbrains.com/go/download/</li>
<li>下载激活补丁 jar-netfilter-2025：https://url21.ctfile.com/f/19641021-1539625903-944ea9?p=8044 (访问密码: 8044)</li>
<li>把补丁文件夹中对应平台的文件夹 copy 到本地电脑的非中文路径下。</li>
<li>在终端中定位到补丁文件夹后，输入 sudo bash goland.sh</li>
<li>等待几秒后，出现脚本执行成功的提示即可。</li>
</ul>
<h2 id="补充">补充：</h2>
<ul>
<li>激活成功后，双击桌面的 IDEA 快捷启动图标，来打开 IDEA 。注意，2024.2 之后的版本，若初次安装，会提示选择所在区域，如下图所示，如果选择了 China Mainland，会在激活的时候反复跳出激活码并提示激活码无效，原因是新版本会拦截 .cn 域名，导致激活许可被吊销，<strong>所以，千万不要指定区域！！</strong></li>
<li>如若第一次运行不成功。请杀进程重启应用。</li>
<li>点击 Activate License 按钮，开始激活 IDEA，勾选 Activation code ，以激活码的方式来激活，复制下面指定激活码，输入后，点击 Activate 激活按钮即可激活成功啦, 注意，部分小伙伴会提示 Key is invalid, 不妨重启一下电脑再输入激活试试，基本上都能成功：</li>
</ul>
<pre tabindex="0"><code>ZCB571FZHV-eyJsaWNlbnNlSWQiOiJaQ0I1NzFGWkhWIiwibGljZW5zZWVOYW1lIjoiZnV6emVzIGFsbHkiLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiIiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJQREIiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA3LTAxIiwicGFpZFVwVG8iOiIyMDIzLTA3LTAxIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBTSSIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDctMDEiLCJwYWlkVXBUbyI6IjIwMjMtMDctMDEiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFBDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wNy0wMSIsInBhaWRVcFRvIjoiMjAyMy0wNy0wMSIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQQ1dNUCIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDctMDEiLCJwYWlkVXBUbyI6IjIwMjMtMDctMDEiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFBTIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wNy0wMSIsInBhaWRVcFRvIjoiMjAyMy0wNy0wMSIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQUkIiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA3LTAxIiwicGFpZFVwVG8iOiIyMDIzLTA3LTAxIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IklJIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wNy0wMSIsInBhaWRVcFRvIjoiMjAyMy0wNy0wMSIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUEdPIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wNy0wMSIsInBhaWRVcFRvIjoiMjAyMy0wNy0wMSIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQU1ciLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA3LTAxIiwicGFpZFVwVG8iOiIyMDIzLTA3LTAxIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBXUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDctMDEiLCJwYWlkVXBUbyI6IjIwMjMtMDctMDEiLCJleHRlbmRlZCI6dHJ1ZX1dLCJtZXRhZGF0YSI6IjAxMjAyMjA3MDFQU0FOMDAwMDA1IiwiaGFzaCI6IlRSSUFMOi01OTQ5ODgxMjIiLCJncmFjZVBlcmlvZERheXMiOjcsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-JNpWl3tvfBw9nYALTrBlJzoryrKHhqmiBxP5IljC6Hlgmb6YlOH8vPngzoyLYa+cGDMVj6fipEpm+BEqIA7oAoBYSu1ZPdzkHAa94apJg+CUQwuw+EJaATdKTANuKYTBsay6WsnrUh8vbIaJpGz19z+uOAc4xRP+gtuyjiwkNECZ6Y9qD+Dx3Gm5xXI3UvKqjPYIhXk23n1pjlxFIUmhD7BumdxF8JHmJJhd/K5FaXQU/K9pMp70GfmSS2KJgxm6SXfslWs/bF5GTY3i1GA6ez05ZyJwsmJMZ1v6W7GWrWNHDLK7i7aXhOLdK9u+pCz+2FpKmadRznpSmixDzj37ig==-MIIETDCCAjSgAwIBAgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIwMTAxOTA5MDU1M1oXDTIyMTAyMTA5MDU1M1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUlaUFc1wf+CfY9wzFWEL2euKQ5nswqb57V8QZG7d7RoR6rwYUIXseTOAFq210oMEe++LCjzKDuqwDfsyhgDNTgZBPAaC4vUU2oy+XR+Fq8nBixWIsH668HeOnRK6RRhsr0rJzRB95aZ3EAPzBuQ2qPaNGm17pAX0Rd6MPRgjp75IWwI9eA6aMEdPQEVN7uyOtM5zSsjoj79Lbu1fjShOnQZuJcsV8tqnayeFkNzv2LTOlofU/Tbx502Ro073gGjoeRzNvrynAP03pL486P3KCAyiNPhDs2z8/COMrxRlZW5mfzo0xsK0dQGNH3UoG/9RVwHG4eS8LFpMTR9oetHZBAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUJNoRIpb1hUHAk0foMSNM9MCEAv8wSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBABqRoNGxAQct9dQUFK8xqhiZaYPd30TlmCmSAaGJ0eBpvkVeqA2jGYhAQRqFiAlFC63JKvWvRZO1iRuWCEfUMkdqQ9VQPXziE/BlsOIgrL6RlJfuFcEZ8TK3syIfIGQZNCxYhLLUuet2HE6LJYPQ5c0jH4kDooRpcVZ4rBxNwddpctUO2te9UU5/FjhioZQsPvd92qOTsV+8Cyl2fvNhNKD1Uu9ff5AkVIQn4JU23ozdB/R5oUlebwaTE6WZNBs+TA/qPj+5/we9NH71WRB0hqUoLI2AKKyiPw++FtN4Su1vsdDlrAzDj9ILjpjJKA1ImuVcG329/WTYIKysZ1CWK3zATg9BeCUPAV1pQy8ToXOq+RSYen6winZ2OO93eyHv2Iw5kbn1dqfBw1BuTE29V2FJKicJSu8iEOpfoafwJISXmz1wnnWL3V/0NxTulfWsXugOoLfv0ZIBP1xH9kmf22jjQ2JiHhQZP7ZDsreRrOeIQ/c4yR8IQvMLfC0WKQqrHu5ZzXTH4NO3CwGWSlTY74kE91zXB5mwWAx1jig+UXYc2w4RkVhy0//lOmVya/PEepuuTTI4+UJwC7qbVlh5zfhj8oTNUXgN0AOc+Q0/WFPl1aw5VV/VrO8FCoB15lFVlpKaQ1Yh+DVU8ke+rt9Th0BCHXe0uZOEmH0nOnH/0onD
</code></pre>]]></content:encoded></item><item><title>折腾折腾游戏机</title><link>https://blog.yangpeiyuan.com/posts/switch-lite/</link><guid>https://blog.yangpeiyuan.com/posts/switch-lite/</guid><pubDate>Wed, 26 Feb 2025 22:40:54 +0800</pubDate><content:encoded><![CDATA[<p>疫情期间高价买的 switch 吃灰多年。期间只买了 3 个游戏：动森、奥德赛（卡带）和旷野之息（数字）。最近突发奇想去 B 站看了下折腾版 switch，发现硬破已经很成熟了。立即小黄鱼上找了个杭州本地的商家。¥400 把奥德赛和动森 卖了，¥110 把 switch 硬破了，¥250 买了张 512 的 tf 卡 准备灌满游戏。400-110-250=40，最后还赚 ¥40。总耗时 2 小时，一大半的时间都是在 copy 游戏，tf 卡写入速度太慢了最后只 copy 了 12 个游戏 100G。</p>
<p>商家推荐了“电玩联盟”微信公众号，剩下 400G 空间，得回家自己慢慢下载了。这个公众号还真方便，聊天界面输入游戏名称直接给你返回网盘下载链接。小红书找个推荐列表，根据喜好选就好了。</p>
<p>一番折腾下来存储卡灌满。随便挑了几个游戏运行 5 分钟。痿了。估计这机器又要落灰了。
<img src="https://static.appd.top/blog/20250227IMG_5756H.JPG" alt="20250227IMG_5756H"></p>
<p><img src="https://static.appd.top/blog/20250227IMG_5754H.JPG" alt="20250227IMG_5754H"></p>
<h3 id="update">Update:</h3>
<p>在Lite上刷了一个月的大菠萝3，屏幕素质实在是太差了。心心念的想换个OLED版。淘宝百亿补贴¥1600 上车。手感和屏幕提升明显。</p>
<p>新机到手当天就去折腾了。游戏是灌满了，但只是2刷了塞尔达野炊和王泪。</p>
<p><img src="https://static.appd.top/blog/20251127IMG_6013.webp" alt="3"></p>
<p><img src="https://static.appd.top/blog/20251127IMG_6022.webp" alt="4"></p>
<p><img src="https://static.appd.top/blog/20251127IMG_6028.webp" alt="5"></p>
<h3 id="ps4">PS4</h3>
<p>2015年买的，落灰了十年。好像只玩了3个游戏（Journey，战神，双人成行）。12.02版本在今年8月份也支持折腾了。从柜子里拿出来，闲鱼上买个蓝光盘，一键折腾。装了 艾尔登法环，死亡搁浅，GT赛车，……又是放着没玩了。哎～～～
<img src="https://static.appd.top/blog/20251127IMG_7050.webp" alt=""></p>
<p><img src="https://static.appd.top/blog/20251127IMG_7452.webp" alt=""></p>
]]></content:encoded></item><item><title>升级Homelab:intel NUC11ATKC4</title><link>https://blog.yangpeiyuan.com/posts/intel-nuc11-atkc4/</link><guid>https://blog.yangpeiyuan.com/posts/intel-nuc11-atkc4/</guid><pubDate>Thu, 16 Jan 2025 22:40:54 +0800</pubDate><content:encoded><![CDATA[<p>搭载了 N5105,16G 内存和 256G SSD 的 intel NUC11 闪亮登场。</p>
<p><img src="https://static.appd.top/blog/20250117IMG_5498%202.jpeg" alt="NUC11"></p>
<p>家中一直运行着几台低成本的 Server 小设备，包括树莓派 3B+（运行脚本）、斐讯 N1 盒子（小钢炮下载机）以及友善 R2S（openwrt 系统）。</p>
<p>2018 年 12 月购入的树莓派，承担着运行脚本和几个简单 Docker 服务的任务，基本能够满足需求。不过，它存在一个明显的缺陷，其系统安装在 TF 卡上，稳定性欠佳。运行大概一个月左右，就会出现文件系统错误，进而导致无法进入系统。索性挂闲鱼 ¥150 秒出。（疫情期间二手价格曾涨到 ¥500，当时怀旧没舍得卖）
如今，app 的推荐算法真绝。卖掉树莓派后，闲鱼首页便被各种低功耗小主机刷屏。由于我的需求很明确，就是要找一个能稳定运行几个脚本和 Docker 服务，从而替代树莓派的设备，所以从颜值方面考虑，选择了这台价值 400 元的二手 intel 阿特拉斯峡谷 NUC11ATKC4 准系统。</p>
<p>希望这次系统安装和配置完成，通电后就安静稳定的待在柜子里，近几年都不要再碰它了。</p>
<p>由于不经常配置 Ubuntu，下面的内容是给自己的备忘。</p>
<h1 id="ubuntu2404-系统配置">Ubuntu24.04 系统配置</h1>
<h2 id="设置静态-ip-地址">设置静态 IP 地址</h2>
<p><img src="https://static.appd.top/blog/20250117Screenshot-2024-11-13-161038.png" alt="设置静态IP地址"></p>
<h2 id="修改-apt-软件源并更新系统">修改 apt 软件源并更新系统</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#更换阿里源，已经不是原来的路径/etc/apt/sources.list</span>
</span></span><span class="line"><span class="cl">vim /etc/apt/sources.list.d/ubuntu.sources
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#/etc/apt/sources.list.d/ubuntu.sources其内容为</span>
</span></span><span class="line"><span class="cl"><span class="c1">#把其中的http://cn.archive.ubuntu.com/ubuntu/，修改为https://mirrors.aliyun.com/ubuntu/</span>
</span></span><span class="line"><span class="cl">Types: deb
</span></span><span class="line"><span class="cl">URIs: https://mirrors.aliyun.com/ubuntu/
</span></span><span class="line"><span class="cl">Suites: noble noble-updates noble-backports
</span></span><span class="line"><span class="cl">Components: main restricted universe multiverse
</span></span><span class="line"><span class="cl">Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Types: deb
</span></span><span class="line"><span class="cl">URIs: https://mirrors.aliyun.com/ubuntu/
</span></span><span class="line"><span class="cl">Suites: noble-security
</span></span><span class="line"><span class="cl">Components: main restricted universe multiverse
</span></span><span class="line"><span class="cl">Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#保存并退出</span>
</span></span><span class="line"><span class="cl">：wq
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#更新</span>
</span></span><span class="line"><span class="cl">apt update
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#升级</span>
</span></span><span class="line"><span class="cl">apt upgrade
</span></span></code></pre></div><h2 id="安装和配置-zsh">安装和配置 ZSH</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#安装 zsh</span>
</span></span><span class="line"><span class="cl">sudo apt install zsh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#验证 zsh 是否安装成功</span>
</span></span><span class="line"><span class="cl">zsh --version
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#安装 ohmyzsh</span>
</span></span><span class="line"><span class="cl">sh -c <span class="s2">&#34;</span><span class="k">$(</span>curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#安装完成后，ohmyzsh 会自动将你的默认 shell 更改为 zsh。你可以使用以下命令来验证是否已切换到 zsh：</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$SHELL</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#主题和插件,编辑.zshrc配置文件</span>
</span></span><span class="line"><span class="cl">vim ~/.zshrc
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#我的插件列表</span>
</span></span><span class="line"><span class="cl"><span class="nv">plugins</span><span class="o">=(</span>git z sudo docker zsh-syntax-highlighting zsh-autosuggestions<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#最后2个第三方插件需要先手动下载</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/zsh-users/zsh-autosuggestions <span class="si">${</span><span class="nv">ZSH_CUSTOM</span><span class="k">:-</span><span class="nv">$HOME</span><span class="p">/.oh-my-zsh/custom</span><span class="si">}</span>/plugins/zsh-autosuggestions
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">git clone https://github.com/zsh-users/zsh-syntax-highlighting <span class="si">${</span><span class="nv">ZSH_CUSTOM</span><span class="k">:-</span><span class="p">~/.oh-my-zsh/custom</span><span class="si">}</span>/plugins/zsh-syntax-highlighting
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#运行 source ~/.zshrc 来使更改生效</span>
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.zshrc
</span></span></code></pre></div><h2 id="美化-terminal">美化 Terminal</h2>
<p>Gnome 的 Terminal 可以在  <a href="https://github.com/Mayccoll/Gogh">Gogh</a>  这个项目里找到合适的颜色主题，我选用了 Solarized Dark</p>
<h2 id="ssh">ssh</h2>
<h3 id="ssh-安装">ssh 安装</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#安装</span>
</span></span><span class="line"><span class="cl">sudo apt install openssh-server
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#启动</span>
</span></span><span class="line"><span class="cl">sudo systemctl start ssh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#检查服务状态</span>
</span></span><span class="line"><span class="cl">sudo systemctl status ssh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#启用 SSH 服务自动启动</span>
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> ssh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#查看服务状态</span>
</span></span><span class="line"><span class="cl">sudo systemctl is-enabled ssh
</span></span></code></pre></div><h3 id="ssh-配置">ssh 配置</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#配置证书登陆</span>
</span></span><span class="line"><span class="cl"><span class="c1">#使用 ssh-copy-id将公钥复制到远程服务器</span>
</span></span><span class="line"><span class="cl"><span class="c1">#储在默认位置（通常是 ~/.ssh）使用 Ed25519 生成的默认名称为 id_ed25519 和 id_ed25519.pub</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~/.ssh
</span></span><span class="line"><span class="cl">ssh-copy-id user@192.168.1.99   <span class="c1">#这将自动将公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#编辑 SSH 服务的配置文件 /etc/ssh/sshd_config</span>
</span></span><span class="line"><span class="cl">sudo vim /etc/ssh/sshd_config
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#确保以下设置已经被打开注释：</span>
</span></span><span class="line"><span class="cl"><span class="c1">#PubkeyAuthentication yes：启用公钥认证。</span>
</span></span><span class="line"><span class="cl"><span class="c1">#PasswordAuthentication no：禁用密码认证（可选，但推荐）。</span>
</span></span><span class="line"><span class="cl"><span class="c1">#ChallengeResponseAuthentication no：禁用挑战响应认证。</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#配置 SSH 别名一键登录（本地电脑）</span>
</span></span><span class="line"><span class="cl"><span class="c1">#打开ssh配置文件</span>
</span></span><span class="line"><span class="cl">$ vim ~/.ssh/config
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#新增</span>
</span></span><span class="line"><span class="cl">Host &lt;起个名字&gt;
</span></span><span class="line"><span class="cl">HostName &lt;你的服务器ip地址&gt;
</span></span><span class="line"><span class="cl">User &lt;用户名&gt;
</span></span><span class="line"><span class="cl">Port <span class="o">[</span>可选项，端口号<span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#演示实例</span>
</span></span><span class="line"><span class="cl">Host nuc
</span></span><span class="line"><span class="cl">HostName 192.168.1.99
</span></span><span class="line"><span class="cl">User yangpeiyuan
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#完成后，就可以这样登录服务器了</span>
</span></span><span class="line"><span class="cl">ssh nuc
</span></span></code></pre></div><h2 id="xrdp">xRDP</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#安装 XRDP 服务器</span>
</span></span><span class="line"><span class="cl">sudo apt install xrdp
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 启动服务</span>
</span></span><span class="line"><span class="cl">systemctl start xrdp
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 设置开机自启动</span>
</span></span><span class="line"><span class="cl">systemctl <span class="nb">enable</span> xrdp
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 检查状态</span>
</span></span><span class="line"><span class="cl">systemctl status xrdp
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#将 xrdp 用户添加到 ssl-cert 组</span>
</span></span><span class="line"><span class="cl">sudo adduser xrdp ssl-cert
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#安装完成后，需要注销/重启系统，否则在使用 XRDP 远程连接 Ubuntu 系统时，可能遇到黑屏问题(客户端连接黑屏)。</span>
</span></span><span class="line"><span class="cl">reboot
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#如何连接不上，检查</span>
</span></span><span class="line"><span class="cl">sudo vim /etc/xrdp/xrdp.ini
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#修改成</span>
</span></span><span class="line"><span class="cl"><span class="nv">security_layer</span><span class="o">=</span>rdp
</span></span></code></pre></div><p>至此，可以用 ssh 和 Microsoft remote desktop 连接 NUC 了。放入柜子中放光发热。</p>
]]></content:encoded></item><item><title>自制互联网科技早报RSS订阅源</title><link>https://blog.yangpeiyuan.com/posts/rss-subscription-source-for-internet-technology-morning-news/</link><guid>https://blog.yangpeiyuan.com/posts/rss-subscription-source-for-internet-technology-morning-news/</guid><pubDate>Mon, 18 Nov 2024 22:40:54 +0800</pubDate><content:encoded><![CDATA[<p>最近开始使用<a href="https://app.follow.is">Follow</a>作为备用 RSS 阅读器，作为 10 多年的 RSS 用户深知信息过载的弊端。订阅了一堆各种类型的内容，然后未阅读数长期是 1000+，那基本上也不会经常阅读了。</p>
<p>自制了一份互联网科技早报 RSS 源，可以有效精简资讯类的订阅源。</p>
<p>Follow 用户可以直接订阅 List：<strong><a href="https://app.follow.is/share/lists/65099359830760448">早报聚合</a></strong></p>
<p>其他 RSS 阅读器用户可以访问 <strong><a href="https://appd.top/">早报聚合 | 聚合中文互联网科技早报</a></strong> 手动订阅</p>
<p>内含 爱范儿、IT 之家、36Kr、少数派、数字尾巴、Readhub 6 个网站的早报频道，支持全文输出。</p>
<p><img src="https://static.appd.top/blog/20260130morning_appd_top.webp" alt="https://appd.top/"></p>
]]></content:encoded></item><item><title>giffgaff 激活与使用指南</title><link>https://blog.yangpeiyuan.com/posts/giffgaff-phone-card-user-guide/</link><guid>https://blog.yangpeiyuan.com/posts/giffgaff-phone-card-user-guide/</guid><pubDate>Thu, 10 Oct 2024 22:40:54 +0800</pubDate><content:encoded><![CDATA[<p>giffgaff 成立于 2009 年 11 月 25 日，是一家总部位于英国伦敦的移动虚拟网络运营商，为 O2 全资子公司，因此 giffgaff 使用 O2 的网络，享有 O2 相同的 99% 网络覆盖率，且可访问英国 193 个城镇的 5G 网络。</p>
<h2 id="注意事项">注意事项</h2>
<h3 id="以下操作均会造成扣费">以下操作均会造成扣费：</h3>
<ul>
<li>短信、通话、上网。</li>
<li>手动拒接任何来电。由于 giffgaff 默认开通了语音信箱功能，拒接来电后将会自动接入语音信箱产生费用，如需避免，请参见后文手动关闭来电转接功能。</li>
<li>激活 FaceTime 与 iMessage 服务。如不需要 iOS 提供的 FaceTime 与 iMessage 服务，请在系统弹出以下对话框时点击取消按钮。</li>
</ul>
<h3 id="保号">保号</h3>
<p>激活后的号卡需要每 180 天内进行一次消费以进行保号，若长时间未消费，会收到警告邮件，请按邮件提示进行操作，不予理会将被销号</p>
<h2 id="激活流程">激活流程</h2>
<ul>
<li>将 SIM 卡插入手机，入网后稍等片刻，会收到一条来自 43432 的短信，点击短信中的链接进入激活页面。</li>
<li>如在上一步中未收到短信，请手动打开 <a href="https://www.giffgaff.com/activate">https://www.giffgaff.com/activate</a> ，并输入卡片上的激活码进行激活。</li>
<li>选择适合自己的套餐，前文中我们已经了解过了套餐的区别，如果暂时没有使用需求，可以将页面拉至最下方，选择 Pay as you go ，激活后可以正常接收短信。</li>
<li>首次充值需要至少充值 10 英镑，仅支持使用 VISA / MasterCard 的借记卡或信用卡进行付款（如没有指定银行卡，可以选择淘宝购买充值卡密，点击 Or redeem a top-up voucher 进行激活）。</li>
<li>使用卡密充值：可以去某宝或飞猪直接搜索 giffgaff 代充，10 英镑即可。使用银行卡激活请跳过本段直接看第六步。</li>
<li>使用银行卡充值：部分银行付款时需要进行 3DS 验证，加载较慢需要耐心等待。使用充值卡密激活请跳过本段直接看第七步。</li>
<li>付款成功后，页面上将出现 giffgaff 分配给您的电话号码。如申请卡时填写了他人邀请码，则会收到赠送的 5 英镑余额。至此，您已完成了整个激活流程。</li>
</ul>
<h2 id="如何关闭语音信箱">如何关闭语音信箱</h2>
<p>参考 <a href="https://www.giffgaff.com/help/articles/how-do-i-turn-voicemail-on-or-off">https://www.giffgaff.com/help/articles/how-do-i-turn-voicemail-on-or-off</a> ，在手机拨号盘输入
<code>##002#</code>
并拨打，即可关闭语音信箱。</p>
<h2 id="如何快捷查询话费">如何快捷查询话费</h2>
<p>在手机拨号盘输入
<code>*100#</code>
并拨打，即可快捷查询到话费余额。</p>
<h2 id="其他常用快捷指令">其他常用快捷指令</h2>
<ul>
<li>查询 SIM 号码：
发送 <code>NUMBER</code> 到 <code>43430</code></li>
<li>查询话费余额：
直接拨打 <code>*100#</code></li>
<li>关闭语音信箱：
直接拨打 <code>##002#</code> -打开语音信箱：
直接拨打 <code>**61*443*10*20#</code></li>
</ul>
]]></content:encoded></item><item><title>使用Rclone定时备份MySQL到云存储</title><link>https://blog.yangpeiyuan.com/posts/backup-mysql-to-cloud-storage-with-rclone/</link><guid>https://blog.yangpeiyuan.com/posts/backup-mysql-to-cloud-storage-with-rclone/</guid><pubDate>Fri, 30 Aug 2024 22:40:54 +0800</pubDate><content:encoded><![CDATA[<p>最近在 blog 上新增了 2 个页面，见导航栏中的 delicious 和 memory。由于用到了 mysql，考虑到数据安全，还是得经常备份。之前就想试用 Rclone，所以这次就选择用 Rclone+box.com 的组合。有个缺点就是 box 的认证授权只有 60 天，每 2 个月就要手动刷新下 token。（看官方文档介绍，有的云存储 token 过期时间会很长如 pikpak）。</p>
<h2 id="mysql-数据库备份-sh-脚本">Mysql 数据库备份 sh 脚本</h2>
<ul>
<li>创建备份 Mysql 数据库脚本</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="c1"># 定义MySQL数据库信息</span>
</span></span><span class="line"><span class="cl"><span class="nv">MYSQL_USER</span><span class="o">=</span><span class="s2">&#34;xxxxxxxx&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">MYSQL_PASSWORD</span><span class="o">=</span><span class="s2">&#34;xxxxxxxx&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#定义备份的目录和创建此目录。用-p参数避免已存在同名文件夹</span>
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_DIR</span><span class="o">=</span><span class="s2">&#34;/tmp/backup&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">REMOTE_NAME</span><span class="o">=</span><span class="s2">&#34;remote&#34;</span>
</span></span><span class="line"><span class="cl">mkdir -p <span class="nv">$BACKUP_DIR</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 定义备份文件的文件名</span>
</span></span><span class="line"><span class="cl"><span class="nv">TIMESTAMP</span><span class="o">=</span><span class="k">$(</span>date +<span class="s2">&#34;%Y-%m-%d_%H-%M-%S&#34;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_FILE</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">/backup_</span><span class="nv">$TIMESTAMP</span><span class="s2">.sql&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 备份多个数据库</span>
</span></span><span class="line"><span class="cl">mysqldump -u <span class="nv">$MYSQL_USER</span> -p<span class="nv">$MYSQL_PASSWORD</span> --databases delicious memory &gt; <span class="s2">&#34;</span><span class="nv">$BACKUP_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 使用rclone上传备份到远程</span>
</span></span><span class="line"><span class="cl">rclone copy <span class="s2">&#34;</span><span class="nv">$BACKUP_FILE</span><span class="s2">&#34;</span> <span class="s2">&#34;</span><span class="nv">$REMOTE_NAME</span><span class="s2">:/backup/linode&#34;</span>
</span></span></code></pre></div><h2 id="安装配置-rclone">安装配置 Rclone</h2>
<ul>
<li>通过官方脚本下载安装 <a href="https://rclone.org/downloads/">https://rclone.org/downloads/</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo -v <span class="p">;</span> curl https://rclone.org/install.sh <span class="p">|</span> sudo bash
</span></span></code></pre></div><ul>
<li>在本地电脑上使用 SSH 隧道进行配置 <a href="https://rclone.org/remote_setup/#configuring-using-ssh-tunnel">https://rclone.org/remote_setup/#configuring-using-ssh-tunnel</a></li>
<li>由于是在远程服务器是无桌面版本，没有浏览器进行授权认证。所以需要使用 SSH 隧道进行配置</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Linux 和 MacOS 用户可以在本地电脑上使用 SSH 隧道将无头盒端口 53682 重定向到本地计算机，方法是使用以下命令：</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 命令中的username@remote_server 根据实际情况修改</span>
</span></span><span class="line"><span class="cl">ssh -L localhost:53682:localhost:53682 username@remote_server
</span></span></code></pre></div><ul>
<li>根据官方文档配置 box.com 云存储 <a href="https://rclone.org/box/">https://rclone.org/box/</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#开启交互式配置流程。可以全部都选 default</span>
</span></span><span class="line"><span class="cl">rclone config
</span></span></code></pre></div><ul>
<li>然后在最后一步出现 <code>Use auto config?</code> 回答 Y 问题。</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Use web browser to automatically authenticate rclone with remote?
</span></span><span class="line"><span class="cl"> * Say Y <span class="k">if</span> the machine running rclone has a web browser you can use
</span></span><span class="line"><span class="cl"> * Say N <span class="k">if</span> running rclone on a <span class="o">(</span>remote<span class="o">)</span> machine without web browser access
</span></span><span class="line"><span class="cl">If not sure try Y. If Y failed, try N.
</span></span><span class="line"><span class="cl">y<span class="o">)</span> Yes <span class="o">(</span>default<span class="o">)</span>
</span></span><span class="line"><span class="cl">n<span class="o">)</span> No
</span></span></code></pre></div><ul>
<li>然后复制并粘贴身份验证网址 http://127.0.0.1:53682/auth?state=xxxxxxxxxxxx 到本地计算机上的浏览器，完成身份验证即可完成。</li>
<li>配置完成。你就可以像这样使用<code>rclone</code>了。</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#列出 Box 顶层的目录</span>
</span></span><span class="line"><span class="cl">rclone lsd remote:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#列出 Box 中的所有文件</span>
</span></span><span class="line"><span class="cl">rclone ls remote:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#将本地目录复制到名为 backup 的 Box 目录</span>
</span></span><span class="line"><span class="cl">rclone copy /home/source remote:backup
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#路径可以根据需要深度，例如 remote:directory/subdirectory</span>
</span></span></code></pre></div><h2 id="配置-crontab-定时任务">配置 crontab 定时任务</h2>
<ul>
<li>运行 <code>crontab -e</code> ，编辑一条新的定时任务。每 15 天自动备份上传到云存储。</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">0</span> <span class="m">3</span> 1,15 * * /bin/bash /root/backup/backup_linode_mysql.sh
</span></span></code></pre></div>]]></content:encoded></item><item><title>使用systemd部署golang web程序</title><link>https://blog.yangpeiyuan.com/posts/deploy-golang-web-app-with-systemd/</link><guid>https://blog.yangpeiyuan.com/posts/deploy-golang-web-app-with-systemd/</guid><pubDate>Wed, 10 Jul 2024 22:40:54 +0800</pubDate><content:encoded><![CDATA[<h1 id="systemd-配置">systemd 配置</h1>
<ol>
<li>编译您的 Golang 程序。假设您的程序名为<code>delicious</code></li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">CGO_ENABLED</span><span class="o">=</span><span class="m">0</span> <span class="nv">GOOS</span><span class="o">=</span>linux <span class="nv">GOARCH</span><span class="o">=</span>amd64 go build -o delicious
</span></span></code></pre></div><ol>
<li>将本地编译好的 <code>myapp</code> 二进制文件、配置文件和静态文件等上传到服务器的<code>/var/www/delicious.yangpeiyuan.com</code>目录下。目录结构如下：</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">.
</span></span><span class="line"><span class="cl"><span class="p">|</span>-- config
</span></span><span class="line"><span class="cl"><span class="p">|</span>   <span class="sb">`</span>-- config.toml
</span></span><span class="line"><span class="cl"><span class="p">|</span>-- delicious
</span></span><span class="line"><span class="cl"><span class="p">|</span>-- static
</span></span><span class="line"><span class="cl"><span class="p">|</span>   <span class="p">|</span>-- css
</span></span><span class="line"><span class="cl"><span class="p">|</span>   <span class="p">|</span>   <span class="p">|</span>-- bulma.css
</span></span><span class="line"><span class="cl"><span class="p">|</span>   <span class="p">|</span>   <span class="sb">`</span>-- style.css
</span></span><span class="line"><span class="cl"><span class="p">|</span>   <span class="p">|</span>-- favicon.ico
</span></span><span class="line"><span class="cl"><span class="p">|</span>   <span class="sb">`</span>-- imgs
</span></span><span class="line"><span class="cl"><span class="p">|</span>       <span class="p">|</span>-- apple-touch-icon.png
</span></span><span class="line"><span class="cl"><span class="p">|</span>       <span class="p">|</span>-- favicon-32x32.png
</span></span><span class="line"><span class="cl"><span class="p">|</span>       <span class="sb">`</span>-- idev.png
</span></span><span class="line"><span class="cl"><span class="sb">`</span>-- templates
</span></span><span class="line"><span class="cl">    <span class="p">|</span>-- add.html
</span></span><span class="line"><span class="cl">    <span class="p">|</span>-- close.html
</span></span><span class="line"><span class="cl">    <span class="p">|</span>-- detail.html
</span></span><span class="line"><span class="cl">    <span class="p">|</span>-- footer.html
</span></span><span class="line"><span class="cl">    <span class="p">|</span>-- head.html
</span></span><span class="line"><span class="cl">    <span class="p">|</span>-- index.html
</span></span><span class="line"><span class="cl">    <span class="p">|</span>-- login.html
</span></span><span class="line"><span class="cl">    <span class="sb">`</span>-- partial.html
</span></span></code></pre></div><ol>
<li>在<code>/usr/lib/systemd/system/</code> 创建一个新的 systemd 服务文件:</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo vim /usr/lib/systemd/system/delicious.service
</span></span></code></pre></div><p>在打开的编辑器中,添加以下内容:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">[</span>Unit<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Description</span><span class="o">=</span>My Golang Web Application
</span></span><span class="line"><span class="cl"><span class="nv">After</span><span class="o">=</span>network.target
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Service<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">ExecStart</span><span class="o">=</span>/var/www/delicious.yangpeiyuan.com/delicious
</span></span><span class="line"><span class="cl"><span class="nv">Restart</span><span class="o">=</span>always
</span></span><span class="line"><span class="cl"><span class="nv">User</span><span class="o">=</span>nobody
</span></span><span class="line"><span class="cl"><span class="nv">Group</span><span class="o">=</span>nogroup
</span></span><span class="line"><span class="cl"><span class="nv">Environment</span><span class="o">=</span><span class="s2">&#34;GO_ENV=production&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">WorkingDirectory</span><span class="o">=</span>/var/www/delicious.yangpeiyuan.com
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Install<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">WantedBy</span><span class="o">=</span>multi-user.target
</span></span></code></pre></div><p>对于 Golang 程序的 systemd 服务配置,User 和 Group 通常设置如下:
如果是 web 应用或需要网络访问的服务:</p>
<pre tabindex="0"><code class="language-User=www-data" data-lang="User=www-data">Group=www-data
</code></pre><p>如果是系统级服务或后台程序:</p>
<pre tabindex="0"><code class="language-User=nobody" data-lang="User=nobody">Group=nogroup
</code></pre><p>如果是特定用户运行的应用:</p>
<pre tabindex="0"><code>User=&lt;specific_username&gt;
Group=&lt;specific_groupname&gt;
</code></pre><p>如果需要 root 权限:</p>
<pre tabindex="0"><code>User=root
Group=root
</code></pre><p>这里需要注意<code>Environment=&quot;GO_ENV=production&quot;</code> ，指在 systemd 服务文件设置程序所需的环境变量，以配合 gin 框架的 release 模式</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">	//设置 Gin 为发布模式
</span></span><span class="line"><span class="cl">	<span class="k">if</span> models.GetEnvironment<span class="o">()</span> <span class="o">==</span> <span class="s2">&#34;production&#34;</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">		gin.SetMode<span class="o">(</span>gin.ReleaseMode<span class="o">)</span>
</span></span><span class="line"><span class="cl">	<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">		fmt.Println<span class="o">(</span>models.GetEnvironment<span class="o">())</span>
</span></span><span class="line"><span class="cl">	<span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	func GetEnvironment<span class="o">()</span> string <span class="o">{</span>
</span></span><span class="line"><span class="cl">	env :<span class="o">=</span> os.Getenv<span class="o">(</span><span class="s2">&#34;GO_ENV&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nv">env</span> <span class="o">==</span> <span class="s2">&#34;&#34;</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">		<span class="nv">env</span> <span class="o">=</span> <span class="s2">&#34;development&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="o">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> env
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><ol>
<li>依次执行下面的命令</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">//重新加载systemd
</span></span><span class="line"><span class="cl">sudo systemctl daemon-reload
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//启动服务
</span></span><span class="line"><span class="cl">sudo systemctl start delicious
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//启用服务自动启动
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> delicious
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//检查服务状态
</span></span><span class="line"><span class="cl">sudo systemctl status delicious
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//查看日志 <span class="o">(</span>可选<span class="o">)</span>
</span></span><span class="line"><span class="cl">sudo journalctl -u delicious
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//重启服务
</span></span><span class="line"><span class="cl">sudo systemctl restart delicious
</span></span></code></pre></div><p>此时就可以打开浏览器输入<code>http://服务器公网ip:端口</code>查看应用程序的展示效果了。</p>
<ol>
<li>如果报错很可能是可执行二进制文件的权限问题。（可选）</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">//增加二进制文件，可执行权限
</span></span><span class="line"><span class="cl">sudo chmod +x delicious
</span></span></code></pre></div><ol start="2">
<li>检查日志：重启服务后，立即检查日志以查看是否有新的错误信息：</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo journalctl -u memory.service -n <span class="m">50</span> --no-pager
</span></span></code></pre></div><h1 id="nginx-配置">Nginx 配置</h1>
<p>编辑<code>/etc/nginx/sites-available/yangpeiyuan.com.conf</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">server <span class="o">{</span>
</span></span><span class="line"><span class="cl">    listen 80<span class="p">;</span>
</span></span><span class="line"><span class="cl">    server_name delicious.yangpeiyuan.com<span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    location / <span class="o">{</span>
</span></span><span class="line"><span class="cl">        proxy_pass http://localhost:9090<span class="p">;</span>
</span></span><span class="line"><span class="cl">        proxy_http_version 1.1<span class="p">;</span>
</span></span><span class="line"><span class="cl">        proxy_set_header Upgrade <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        proxy_set_header Connection <span class="s1">&#39;upgrade&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        proxy_set_header Host <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        proxy_cache_bypass <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">server <span class="o">{</span>
</span></span><span class="line"><span class="cl">    listen 80<span class="p">;</span>
</span></span><span class="line"><span class="cl">    server_name memory.yangpeiyuan.com<span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    location / <span class="o">{</span>
</span></span><span class="line"><span class="cl">        proxy_pass http://localhost:9091<span class="p">;</span>
</span></span><span class="line"><span class="cl">        proxy_http_version 1.1<span class="p">;</span>
</span></span><span class="line"><span class="cl">        proxy_set_header Upgrade <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        proxy_set_header Connection <span class="s1">&#39;upgrade&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        proxy_set_header Host <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        proxy_cache_bypass <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">server <span class="o">{</span>
</span></span><span class="line"><span class="cl">    listen 80<span class="p">;</span>
</span></span><span class="line"><span class="cl">    server_name yangpeiyuan.com www.yangpeiyuan.com<span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    location / <span class="o">{</span>
</span></span><span class="line"><span class="cl">           root /var/www/yangpeiyuan.com<span class="p">;</span>
</span></span><span class="line"><span class="cl">           index index.html index.htm<span class="p">;</span>
</span></span><span class="line"><span class="cl">           try_files <span class="nv">$uri</span> <span class="nv">$uri</span>/ <span class="o">=</span>404<span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">//启用 Nginx 配置。创建一个符号链接到 sites-enabled 目录
</span></span><span class="line"><span class="cl">sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">//检查配置文件语法
</span></span><span class="line"><span class="cl">nginx -t
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//重启nginx
</span></span><span class="line"><span class="cl">sudo systemctl reload nginx
</span></span></code></pre></div><p>在您的域名注册商的 DNS 设置中，添加 A 记录，将您的域名指向您服务器的 IP 地址。</p>
<h1 id="进阶使用-github-action">进阶：使用 GitHub Action</h1>
<p>使用 GitHub Action 自动编译和上传到服务器。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">name: Build and Deploy
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">on:
</span></span><span class="line"><span class="cl">  push:
</span></span><span class="line"><span class="cl">    branches: <span class="o">[</span>main<span class="o">]</span>
</span></span><span class="line"><span class="cl">  pull_request:
</span></span><span class="line"><span class="cl">    branches: <span class="o">[</span>main<span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">jobs:
</span></span><span class="line"><span class="cl">  build:
</span></span><span class="line"><span class="cl">    runs-on: ubuntu-latest
</span></span><span class="line"><span class="cl">    steps:
</span></span><span class="line"><span class="cl">      - uses: actions/checkout@v4
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      - name: Set up Go
</span></span><span class="line"><span class="cl">        uses: actions/setup-go@v4
</span></span><span class="line"><span class="cl">        with:
</span></span><span class="line"><span class="cl">          go-version: 1.22.4
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      - name: Build
</span></span><span class="line"><span class="cl">        run: go build -v ./...
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      - name: Build binary
</span></span><span class="line"><span class="cl">        run: <span class="nv">GOOS</span><span class="o">=</span>linux <span class="nv">GOARCH</span><span class="o">=</span>amd64 go build -o delicious
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      - name: Prepare static files
</span></span><span class="line"><span class="cl">        run: <span class="p">|</span>
</span></span><span class="line"><span class="cl">          mkdir -p deploy/config
</span></span><span class="line"><span class="cl">          cp -r static/ deploy/static
</span></span><span class="line"><span class="cl">          cp -r templates/ deploy/templates
</span></span><span class="line"><span class="cl">          cp config/config.toml deploy/config
</span></span><span class="line"><span class="cl">          cp delicious deploy/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      - name: Deploy to VPS
</span></span><span class="line"><span class="cl">        env:
</span></span><span class="line"><span class="cl">          PRIVATE_KEY: <span class="si">${</span><span class="p">{ secrets.SERVER_SSH_KEY </span><span class="si">}</span><span class="o">}</span>
</span></span><span class="line"><span class="cl">          HOST: <span class="si">${</span><span class="p">{ secrets.SERVER_HOST </span><span class="si">}</span><span class="o">}</span>
</span></span><span class="line"><span class="cl">          USER: <span class="si">${</span><span class="p">{ secrets.SERVER_USER </span><span class="si">}</span><span class="o">}</span>
</span></span><span class="line"><span class="cl">        run: <span class="p">|</span>
</span></span><span class="line"><span class="cl">          <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$PRIVATE_KEY</span><span class="s2">&#34;</span> &gt; private_key <span class="o">&amp;&amp;</span> chmod <span class="m">600</span> private_key
</span></span><span class="line"><span class="cl">          scp -i private_key -o <span class="nv">StrictHostKeyChecking</span><span class="o">=</span>no -r deploy/* <span class="si">${</span><span class="nv">USER</span><span class="si">}</span>@<span class="si">${</span><span class="nv">HOST</span><span class="si">}</span>:/var/www/deploy/
</span></span><span class="line"><span class="cl">          ssh -i private_key -o <span class="nv">StrictHostKeyChecking</span><span class="o">=</span>no <span class="si">${</span><span class="nv">USER</span><span class="si">}</span>@<span class="si">${</span><span class="nv">HOST</span><span class="si">}</span> <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">            sudo rm -rf /var/www/delicious.yangpeiyuan.com/*
</span></span></span><span class="line"><span class="cl"><span class="s1">            sudo mv /var/www/deploy/delicious /var/www/delicious.yangpeiyuan.com/
</span></span></span><span class="line"><span class="cl"><span class="s1">            sudo mv /var/www/deploy/* /var/www/delicious.yangpeiyuan.com/
</span></span></span><span class="line"><span class="cl"><span class="s1">            sudo chown -R www-data:www-data /var/www/delicious.yangpeiyuan.com/static
</span></span></span><span class="line"><span class="cl"><span class="s1">            sudo chmod -R 775 /var/www/delicious.yangpeiyuan.com/static
</span></span></span><span class="line"><span class="cl"><span class="s1">            sudo systemctl restart delicious.service
</span></span></span><span class="line"><span class="cl"><span class="s1">          &#39;</span>
</span></span></code></pre></div><h2 id="参考">参考</h2>
<p><a href="https://ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html">ruanyifeng 的 Systemd 入门教程：命令篇</a></p>
]]></content:encoded></item><item><title>联通浙江畅游卡¥29 135G</title><link>https://blog.yangpeiyuan.com/posts/mobile-carrier-price/</link><guid>https://blog.yangpeiyuan.com/posts/mobile-carrier-price/</guid><pubDate>Sun, 30 Jun 2024 22:40:54 +0800</pubDate><content:encoded><![CDATA[<p>一直在用的是 ¥36/月的联通蚂蚁宝卡。今年开始发现每个月的 6G 流量都会超标，探索后发现是免流的范围减小了。以前我一般每个月是 6G 套餐+6G 左右的免流=每月大约 12G 左右的流量，刚刚够用。现在免流只有 1G。跑去小红书上研究了一番就发现了这个《浙江畅游卡》。</p>
<ul>
<li>¥29/月</li>
<li>135G/月</li>
<li>合约 2 年</li>
<li>流量组合形式是：套餐内 5G/月+130G/月 两年的流量包
<img src="https://static.appd.top/blog/20240729union135g.png" alt="20240729union135g"></li>
</ul>
<p><strong>办理攻略：</strong></p>
<ul>
<li>首先微信关注“中国联通微厅”，框输入转人工。然后说“29 元 畅游卡套餐”（直接准确说出套餐名字）</li>
<li>一般客服会推脱一下说你不符合要求，你有绑定副卡！是特邀用户才有什么的！！通通不要信。</li>
<li>回复他“GJ 规定，只要市面上有的套餐，必须给办理”或者搬出说会去 GXB 反馈投诉什么的。然后她们会说专人联系，一般当天就会有客服联系（我是当天下午没接到）第二天给我回复的。回复直接给我办理。</li>
<li>客服打电话和我说暂时是 29 元一个月 后续过了两年就不是 29 元了。管他呢，先用 2 年再说，到时候肯定有别的便宜套餐，再换过去。</li>
<li>有副卡或绑定了短号码的，需要解绑。</li>
</ul>
<p>听说其他地方也有这种套餐，好像就是名字不一样！大家可以搜搜看，一定要准确说出名字的，不然你问他，她就说没有。</p>
<p>实际使用了 1 个月，发现超大流量是赚个噱头，每月我实际使用的还是和以前一样，12G 左右。😋</p>
]]></content:encoded></item><item><title>使用Karabiner-Elements，在 macOS 中实现 Hyper 键</title><link>https://blog.yangpeiyuan.com/posts/using-karabiner-elements-to-implement-a-hyper-key-in-macos/</link><guid>https://blog.yangpeiyuan.com/posts/using-karabiner-elements-to-implement-a-hyper-key-in-macos/</guid><pubDate>Fri, 10 May 2024 22:39:54 +0800</pubDate><content:encoded><![CDATA[<p>Hyper 键是一种在 macOS 上常用的键盘快捷方式技巧，具有以下特点：</p>
<ol>
<li>Hyper 键通常将四个修饰键<code>⇧ Shift + ⌃ Control + ⌥ Option + ⌘ Command</code>组合成一个单一的修饰键。</li>
<li>它通常被映射到键盘上的特定按键，最常见的是 Caps Lock 键，但也可以映射到其他键如 Tab 或 \ 键。</li>
<li>Hyper 键的主要优势是不会与系统默认快捷键冲突，为用户提供了一个全新的快捷键层。</li>
<li>使用 Hyper 键可以创建自定义的全局快捷键，如启动应用程序、执行特定操作等。</li>
<li>实现 Hyper 键通常需要使用第三方软件，如 <a href="https://karabiner-elements.pqrs.org/">Karabiner-Elements</a>。</li>
<li>一些高级用户会设置多个 Hyper 键，如将 Tab 和 \ 键设为左右 Hyper 键，或将 G 和 H 键也设为 Hyper 键，以提供更多快捷键选项。</li>
<li>Hyper 键可以与其他键组合使用，创建强大的自定义快捷键，如 Hyper + A 切换到特定输入法。</li>
</ol>
<p>总的来说，Hyper 键为 macOS 用户提供了一种灵活且强大的方式来扩展键盘快捷方式的可能性，提高工作效率。<strong>因为它是全新的修饰键，所以它不会和其它快捷键冲突。特别是，它不会和系统默认的快捷键冲突。</strong></p>
<p>要将 macOS 键盘右侧的 Control 键设置为 <code>⇧ Shift + ⌃ Control + ⌥ Option + ⌘ Command</code> ，可以使用第三方软件如 Karabiner-Elements。以下是步骤：</p>
<ol>
<li>下载并安装 Karabiner-Elements。</li>
<li>打开 Karabiner-Elements，进入“Complex Modifications”选项。</li>
<li>点击“Add Predefined Rule”，搜索并添加“Change caps_lock to command+control+option+shift”规则。</li>
<li>编辑刚刚添加的规则。把里面的“caps_lock”改成“right_control”</li>
</ol>
<p>这样，右侧的 Control 键将被绑定为 <code>⇧ Shift + ⌃ Control + ⌥ Option + ⌘ Command</code></p>
<p>参考</p>
<ul>
<li><a href="https://utgd.net/article/20233">征服 macOS 快捷键（三）——修饰键的分层和原则</a></li>
</ul>
]]></content:encoded></item><item><title>台式机彻底清灰&amp;重装系统,8年前的E3 1231 V3老机器继续发光发热</title><link>https://blog.yangpeiyuan.com/posts/reinstall-the-windows-system-with-rufus-and-microsoft-activation-scripts/</link><guid>https://blog.yangpeiyuan.com/posts/reinstall-the-windows-system-with-rufus-and-microsoft-activation-scripts/</guid><pubDate>Fri, 17 Nov 2023 22:39:54 +0800</pubDate><content:encoded><![CDATA[<h2 id="起因">起因</h2>
<p>银行卡过期换卡，要网银激活新卡片。把闲置了 2 年的台式机从柜子里面搬出来，插电竟然没反应。只好来次彻底的清灰。几个小时搞定了换硅脂、洗机箱、理线等物理环节。好久没装过系统了网络搜索好资料，纯记录下。这次用到了 2 个软件</p>
<ul>
<li><a href="https://rufus.ie/en/">Rufus</a></li>
<li><a href="https://github.com/massgravel/Microsoft-Activation-Scripts">Microsoft Activation Scripts</a></li>
</ul>
<h2 id="rufus-介绍">Rufus 介绍</h2>
<p>主要是老电脑的硬件不符合 win11 的推荐要求。这款 ISO 烧录器可以跳过硬件要求。软件本身使用很简单。</p>
<p><img src="https://s2.loli.net/2023/11/14/S6gkehu4PaMOfXW.png" alt="rufus"></p>
<h2 id="microsoft-activation-scripts-介绍">Microsoft Activation Scripts 介绍</h2>
<p>跟以前流行的 KMS Pico 工具比起来，Microsoft Activation Scripts 安全性比较高，它的程式码是开源的，很难藏病毒，也不需要到奇怪的网站下载破解程式。可在<a href="https://github.com/massgravel/Microsoft-Activation-Scripts">Github 查看源码</a>。</p>
<p>根据官方文件，此脚本支持三种破解方式：</p>
<ul>
<li>HWID：仅支援 Windows 10 和 Windows 11。利用 Windows 7 免费升级 Windows 10 所产生的密钥来启用系统。别忘记当年 Microsoft 强制升级 Windows 10 的时候，连盗版 Windows 7 都给升呢。此方法需要网路，重装系统后该密钥仍有效。</li>
<li>KMS38：仅支援 Windows 10 和 Windows 11。透过欺骗 gatherosstate.exe，不断延长 180 天的密钥试用期，将失效日期一路延期到 2038 年。此方法无需网络，不会在系统留下任何档案。</li>
<li>Online KMS Activation：支援 Windows 7 ~ Windows 11 系统。利用 Microsoft 官方的 Key Management Service 线上启用密钥，每 180 天要联网重新启用一次。此方法亦能够启用旧版 Office 产品。</li>
</ul>
<p>以上三种方法，一般用 HWID 方式启用密钥足矣。</p>
<h2 id="如何使用-microsoft-activation-scripts">如何使用 Microsoft Activation Scripts</h2>
<ol>
<li>右键以系统管理员执行 Powershell</li>
<li>贴上以下指令（按右键贴上），Enter
<code>irm https://massgrave.dev/get | iex</code></li>
<li>此时会跳出一个小窗口，鼠标点一下窗口，输入数字 1 按 Enter，使用 HWID 启用密钥</li>
<li>等待破解完成，完成会显示 Press any key to Go back。完成后将窗口全数关闭，重启电脑。</li>
<li>重开机后开启 Windows 系统设定 → 关于，查看系统是否已为启用状态</li>
</ol>
<h2 id="e3-1231v3-再战-3-年">E3 1231V3 ，再战 3 年！</h2>
<p><img src="https://static.appd.top/blog/20231116IMG_0708.jpg" alt="20231116IMG_0708">
<img src="https://static.appd.top/blog/20231116IMG_0727.JPG" alt="20231116IMG_0727"></p>
]]></content:encoded></item><item><title>免费激活 typora 的方法</title><link>https://blog.yangpeiyuan.com/posts/mian-fei-ji-huo-typora-de-po-jie-fang-fa/</link><guid>https://blog.yangpeiyuan.com/posts/mian-fei-ji-huo-typora-de-po-jie-fang-fa/</guid><pubDate>Mon, 09 Oct 2023 13:10:57 +0000</pubDate><content:encoded><![CDATA[<ol>
<li>
<p>在 Typora 的安装目录下的 resources&gt;page-dist&gt;static&gt;js 文件夹下找到 LicenseIndex.180dd4c7.*.chunk.js 文件。</p>
</li>
<li>
<p>要根据自己软件的安装
找到文件之后，使用记事本或者其他文本软件打开该文件，ctrl+f,查找“e.hasActivated”，找到文件中的 e.hasActivated=&ldquo;true&rdquo;==&ldquo;e.hasActivated&quot;选项，将 e.hasActivated 改为 true 即可。</p>
</li>
</ol>
<p>【⚠️ 注意】修改后的 true 值一定要加双引号，否则无效。原值这里是没有引号的。</p>
<ol start="3">
<li>重新打开，看到欢迎界面，恭喜你，激活成功！</li>
</ol>
]]></content:encoded></item><item><title>这次我选iPhone 15</title><link>https://blog.yangpeiyuan.com/posts/this-time-i-selected-the-iphone15-regular/</link><guid>https://blog.yangpeiyuan.com/posts/this-time-i-selected-the-iphone15-regular/</guid><pubDate>Sun, 17 Sep 2023 22:39:54 +0800</pubDate><content:encoded><![CDATA[<p>最后一次买的手机还是 iPhone Xs Max，一月份摔到地上屏幕没碎但花屏了。花了 600 去电脑城随便换了个三方屏，正常使用了 5 个月自己嗝屁了。只好翻出旧的 iPhoneX 扛到出新机。平时不玩手游，只是刷刷新闻、rss 和常用的 app。通过这几个月的使用体感，发现 iPhoneX 使用过程中也并没有那么的差，自己好像对手机的性能也没像以前那样有要求了，也可能是没钱吧。</p>
<p>好像在 iPhone 11 以前选手机只要关注屏幕和容量的大小即可。这几年大家遇到的数字版和 pro 的纠结完美避过了。因为是 Apple 设备全家桶用户，所以手机也只能继续选 iPhone，不过这次 iPhone15 的新机型选择也没有很纠结。</p>
<h3 id="a17-pro-cpu">A17 Pro CPU</h3>
<p>通过这几个月用 iPhoneX，让我非常清楚性能适合自己最重要。看看自己平时的实际使用场景，用这款新 CPU 都发挥不出来它的优势。看新闻说这次 CPU 只比前代提升 20%，主要提升点是 GPU 的性能。</p>
<h3 id="钛金属边框">钛金属边框</h3>
<p>之前都是不戴壳不贴膜，我手汗还比较重。正常使用个 3 ～ 4 年好像边框也就是正常使用的痕迹。重量嘛以前不在意，所以每次都是选大屏。有了宝宝之后出门带的东西多了，希望越轻越好。</p>
<h3 id="action-button">Action Button</h3>
<p>之前锁屏界面的相机和手电筒的快捷键都很少用。和系统应用进行快捷交互的场景不多。反而是常用 app 都是通过负一屏的 widget 来进行快捷访问。</p>
<h3 id="屏幕高刷">屏幕高刷</h3>
<p>在 iPhoneX 和 iPad Pro 之间经常切换使用，并没有刷新率高低带来的不适感。</p>
<h3 id="相机镜头">相机镜头</h3>
<p>最近 2 年我最喜欢的照片竟然是我偶然间用备用机 Google Pixel 3 拍的。平时哪怕我用富士相机也没有我老婆随手用手机拍的好看。日常记录对手机镜头的要求很低很低。</p>
<p>我理想中的升级 Feature：真正的全面屏、大功率快充、更大的运存。这些本次都没有。所以果断选择 iPhone 15 标准版了。作为数码爱好者这次选择这么冷静不追求顶配版。也不知道以后会不会又少了一个爱好。</p>
<h2 id="纪念下自己-iphonex">纪念下自己 iPhoneX</h2>
<p><img src="https://s2.loli.net/2023/09/17/1YyTrEZ2bKpkIJ7.png" alt="widget"></p>
<p><img src="https://s2.loli.net/2023/09/17/FSeHd3MIETC4BuA.png" alt="screen1"></p>
<p><img src="https://s2.loli.net/2023/09/17/Zx8nvr23MLVCgXh.png" alt="screen2"></p>
]]></content:encoded></item><item><title>KBtalking race II 和华为高键程CD34键盘</title><link>https://blog.yangpeiyuan.com/posts/kbtalking-race2-huawei-cd34-keyboard/</link><guid>https://blog.yangpeiyuan.com/posts/kbtalking-race2-huawei-cd34-keyboard/</guid><pubDate>Sat, 09 Sep 2023 23:14:00 +0800</pubDate><content:encoded><![CDATA[<h2 id="kbtalking-race-ii-青轴键盘">KBtalking Race II 青轴键盘</h2>
<p>解决 macOS 下休眠后键盘无法唤醒系统的问题。</p>
<p>最近翻出了早些年买的 race II 来用，发现在 macOS 下休眠后键盘无法唤醒系统。由于这个键盘太古早了搜索都只出现少量的结果，把最终找到的解决方案记录下（<a href="https://www.v2ex.com/t/217470">参考了 v2ex 的帖子</a>）。</p>
<ul>
<li>下载固件和刷机工具：<a href="https://ln5.sync.com/dl/faedf3d80/urv87kpx-zrx375py-z47qpvnf-fjp7y648">race2 macOS 用固件</a></li>
<li>在 Windows 下运行刷机工具 USB_FD.exe ，并选择下载的 L2217V14 固件</li>
<li>重新连接到 macOS 上，问题已解决。</li>
</ul>
<p>用了几天后发现在家用青轴键盘简直就是找抽。然后就是下面的蓝牙薄膜键盘推荐了。</p>
<h2 id="华为高键程智能键盘-cd34">华为高键程智能键盘 CD34</h2>
<p>看到少数派的编辑推荐的捡漏键盘，刚好适合我目前在家无法使用青轴的场景。APPLE magic keyboard 平替。<a href="https://consumer.huawei.com/cn/accessories/ultrathin-keyboard/">键盘官方网站</a></p>
<p><img src="https://consumer.huawei.com/content/dam/huawei-cbg-site/cn/mkt/pdp/accessories/ultrathin-keyboard/image/ultrathin-keyboard-key-vision-pc.png" alt="宣传图片"></p>
<p><img src="https://static.appd.top/blog/20230719cd34-keyboard.JPG" alt="20230719cd34-keyboard-华为 CD34 键盘"></p>
<p>和触摸板尺寸一致
<img src="https://static.appd.top/blog/20231116IMG_0171.jpg" alt="华为 CD34 键盘"></p>
<p>和 iPad 搭配也不错
<img src="https://static.appd.top/blog/20231116IMG_0182.JPG" alt="华为 CD34 键盘"></p>
<ul>
<li>布局和尺寸：用了这两年比较流行的 84 键布局，大致就是比 Magic Keyboard 右侧多了一列光标操作键，挺实用也没增加多少长度；重量比 Magic Keyboard 多大概一百克，厚了两三毫米，可以接受；短边基本一样长，这对于节省桌面空间很有好处；有物理开关可以切换 Windows 和 macOS 键位。</li>
<li>材质和设计：上盖和 Magic Keyboard 一样是金属的，在低价位 OEM 键盘里比较难得，质感马上就上去了；设计很克制，除了右 Shift 键多印了一个华为自家设备的接触式配对图标，没有任何多余的品牌露出。</li>
<li>号称有 2.5mm 的「高键程」。我不看重这个参数、也不指望键程高点就能追上机械键盘的手感，但毕竟有益无害。</li>
<li>电池给了一个犯规的 2200 毫安时，号称能用一年。再看定价，电商平台上的新品普遍在 250 元左右，本身已经可以接受。但让我们礼节性地</li>
</ul>
<p>去海鲜市场探探风…… 果然，有很多「仅拆封」的国际版，标准美式布局要价 160—180 不等。FWIW，很多详情页一堆错别字的杂牌键盘都卖到这个钱了；那不找了就你了。（有的渠道卖的是欧洲键盘布局，虽然更便宜，但没有必要添这个麻烦，如果感兴趣注意不要买错。）</p>
<p>隔天到手，确实就是个仅拆封成色。至于那个写在产品名里的「高键程」，肯定跟机械键盘没法比，但确实一眼看过去就比 Magic Keyboard 更「深邃」，打起来也更带劲（但略微偏软）。如果说有什么缺点，最上面一排媒体键跟 Mac 的常见分布不太一一致、功能也不完全兼容，比如可以调音量但不能调亮度；但有 BetterTouchTool 之类第三方软件的自定义在，这倒无关紧要。另外，键位拨动开关的设定偶尔会失灵，变回 Windows 布局，需要来回拨一次才能恢复。</p>
<h1 id="update">update</h1>
<p><a href="https://consumer-tkbdownload.huawei.com/ctkbfm/servlet/download/downloadServlet/H4sIAAAAAAAAAD2Q32uDMBzE_xXJcxnf_NDEPS1Ow8pgDqr0OSZxC1gtqa60Y__74pA93nHHfbhvtFxcaG5nhx4RQTtkp-u4ySzK3g_uTZ9W-dLKY7VP2mEOev70Y_Lqbt2kg02UD6erDi6pG5k00zQ83P15K7_HbCxTY4zDfd_zFDPLidBUW4rBus6IDq_Lnb_vbYwe6qcjAFAOjEfbBKdnP42NXylwBjmjwADHyA5d_Meo5yWsfKpUAlcKqpJwmj1DShnJGC4ywUhZijwtSppKJpUCmSvFFHBOgKsCC4kxqLj1pQdv2_9D5rC4P67tkEONfn4BPijXwTEBAAA%3D.zip">键盘固件升级工具 CD34 0.3.5 2022-08-05 512KB</a></p>
]]></content:encoded></item><item><title>hugo RSS 修改成全文输出</title><link>https://blog.yangpeiyuan.com/posts/full-text-hugo-rss-feed/</link><guid>https://blog.yangpeiyuan.com/posts/full-text-hugo-rss-feed/</guid><pubDate>Sun, 20 Aug 2023 22:39:54 +0800</pubDate><content:encoded><![CDATA[<p>Hugo 网站默认附带 RSS feed，但如果您想更改该 rss，例如使其显示全部内容而不仅仅是摘要，请按照以下步骤操作。</p>
<ul>
<li>在 <code>/theme/&lt;your theme here&gt;/layouts/_default/</code> 中创建一个名为 rss.xml 的文件。 （将 <code>&lt;your theme here&gt;</code> 替换为您的主题名称！）</li>
<li>Hugo 附带的默认 RSS 模板可以在 <a href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/rss.xml">GoHugo 存储库</a>上找到，截至 2023 年 7 月的样子如下</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="err">$</span><span class="nx">pctx</span> <span class="o">:=</span> <span class="p">.</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="k">if</span> <span class="p">.</span><span class="nx">IsHome</span> <span class="o">-</span><span class="p">}}{{</span> <span class="err">$</span><span class="nx">pctx</span> <span class="p">=</span> <span class="p">.</span><span class="nx">Site</span> <span class="p">}}{{</span><span class="o">-</span> <span class="nx">end</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="err">$</span><span class="nx">pages</span> <span class="o">:=</span> <span class="nx">slice</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="k">if</span> <span class="nx">or</span> <span class="err">$</span><span class="p">.</span><span class="nx">IsHome</span> <span class="err">$</span><span class="p">.</span><span class="nx">IsSection</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="err">$</span><span class="nx">pages</span> <span class="p">=</span> <span class="err">$</span><span class="nx">pctx</span><span class="p">.</span><span class="nx">RegularPages</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="k">else</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="err">$</span><span class="nx">pages</span> <span class="p">=</span> <span class="err">$</span><span class="nx">pctx</span><span class="p">.</span><span class="nx">Pages</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="nx">end</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="err">$</span><span class="nx">limit</span> <span class="o">:=</span> <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Config</span><span class="p">.</span><span class="nx">Services</span><span class="p">.</span><span class="nx">RSS</span><span class="p">.</span><span class="nx">Limit</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="k">if</span> <span class="nx">ge</span> <span class="err">$</span><span class="nx">limit</span> <span class="mi">1</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="err">$</span><span class="nx">pages</span> <span class="p">=</span> <span class="err">$</span><span class="nx">pages</span> <span class="p">|</span> <span class="nx">first</span> <span class="err">$</span><span class="nx">limit</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="nx">end</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="nx">printf</span> <span class="s">&#34;&lt;?xml version=\&#34;1.0\&#34; encoding=\&#34;utf-8\&#34; standalone=\&#34;yes\&#34;?&gt;&#34;</span> <span class="p">|</span> <span class="nx">safeHTML</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nx">rss</span> <span class="nx">version</span><span class="p">=</span><span class="s">&#34;2.0&#34;</span> <span class="nx">xmlns</span><span class="p">:</span><span class="nx">atom</span><span class="p">=</span><span class="s">&#34;http://www.w3.org/2005/Atom&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nx">channel</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">title</span><span class="p">&gt;{{</span> <span class="k">if</span> <span class="nx">eq</span>  <span class="p">.</span><span class="nx">Title</span>  <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Title</span> <span class="p">}}{{</span> <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Title</span> <span class="p">}}{{</span> <span class="k">else</span> <span class="p">}}{{</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">Title</span> <span class="p">}}{{.}}</span> <span class="nx">on</span> <span class="p">{{</span> <span class="nx">end</span> <span class="p">}}{{</span> <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Title</span> <span class="p">}}{{</span> <span class="nx">end</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">link</span><span class="p">&gt;{{</span> <span class="p">.</span><span class="nx">Permalink</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">link</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">description</span><span class="p">&gt;</span><span class="nx">Recent</span> <span class="nx">content</span> <span class="p">{{</span> <span class="k">if</span> <span class="nx">ne</span>  <span class="p">.</span><span class="nx">Title</span>  <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Title</span> <span class="p">}}{{</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">Title</span> <span class="p">}}</span><span class="nx">in</span> <span class="p">{{.}}</span> <span class="p">{{</span> <span class="nx">end</span> <span class="p">}}{{</span> <span class="nx">end</span> <span class="p">}}</span><span class="nx">on</span> <span class="p">{{</span> <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Title</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">description</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">generator</span><span class="p">&gt;</span><span class="nx">Hugo</span> <span class="o">--</span> <span class="nx">gohugo</span><span class="p">.</span><span class="nx">io</span><span class="p">&lt;</span><span class="o">/</span><span class="nx">generator</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">language</span><span class="p">&gt;{{</span> <span class="nx">site</span><span class="p">.</span><span class="nx">Language</span><span class="p">.</span><span class="nx">LanguageCode</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">language</span><span class="p">&gt;{{</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">Author</span><span class="p">.</span><span class="nx">email</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">managingEditor</span><span class="p">&gt;{{.}}{{</span> <span class="nx">with</span> <span class="err">$</span><span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">Author</span><span class="p">.</span><span class="nx">name</span> <span class="p">}}</span> <span class="p">({{.}}){{</span><span class="nx">end</span><span class="p">}}&lt;</span><span class="o">/</span><span class="nx">managingEditor</span><span class="p">&gt;{{</span><span class="nx">end</span><span class="p">}}{{</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">Author</span><span class="p">.</span><span class="nx">email</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">webMaster</span><span class="p">&gt;{{.}}{{</span> <span class="nx">with</span> <span class="err">$</span><span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">Author</span><span class="p">.</span><span class="nx">name</span> <span class="p">}}</span> <span class="p">({{.}}){{</span><span class="nx">end</span><span class="p">}}&lt;</span><span class="o">/</span><span class="nx">webMaster</span><span class="p">&gt;{{</span><span class="nx">end</span><span class="p">}}{{</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Copyright</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">copyright</span><span class="p">&gt;{{.}}&lt;</span><span class="o">/</span><span class="nx">copyright</span><span class="p">&gt;{{</span><span class="nx">end</span><span class="p">}}{{</span> <span class="k">if</span> <span class="nx">not</span> <span class="p">.</span><span class="nx">Date</span><span class="p">.</span><span class="nx">IsZero</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">lastBuildDate</span><span class="p">&gt;{{</span> <span class="p">.</span><span class="nx">Date</span><span class="p">.</span><span class="nx">Format</span> <span class="s">&#34;Mon, 02 Jan 2006 15:04:05 -0700&#34;</span> <span class="p">|</span> <span class="nx">safeHTML</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">lastBuildDate</span><span class="p">&gt;{{</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">{{</span><span class="o">-</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">OutputFormats</span><span class="p">.</span><span class="nx">Get</span> <span class="s">&#34;RSS&#34;</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">{{</span> <span class="nx">printf</span> <span class="s">&#34;&lt;atom:link href=%q rel=\&#34;self\&#34; type=%q /&gt;&#34;</span> <span class="p">.</span><span class="nx">Permalink</span> <span class="p">.</span><span class="nx">MediaType</span> <span class="p">|</span> <span class="nx">safeHTML</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">{{</span><span class="o">-</span> <span class="nx">end</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">{{</span> <span class="k">range</span> <span class="err">$</span><span class="nx">pages</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">item</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nx">title</span><span class="p">&gt;{{</span> <span class="p">.</span><span class="nx">Title</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nx">link</span><span class="p">&gt;{{</span> <span class="p">.</span><span class="nx">Permalink</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">link</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nx">pubDate</span><span class="p">&gt;{{</span> <span class="p">.</span><span class="nx">Date</span><span class="p">.</span><span class="nx">Format</span> <span class="s">&#34;Mon, 02 Jan 2006 15:04:05 -0700&#34;</span> <span class="p">|</span> <span class="nx">safeHTML</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">pubDate</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">{{</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">Author</span><span class="p">.</span><span class="nx">email</span> <span class="p">}}&lt;</span><span class="nx">author</span><span class="p">&gt;{{.}}{{</span> <span class="nx">with</span> <span class="err">$</span><span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">Author</span><span class="p">.</span><span class="nx">name</span> <span class="p">}}</span> <span class="p">({{.}}){{</span><span class="nx">end</span><span class="p">}}&lt;</span><span class="o">/</span><span class="nx">author</span><span class="p">&gt;{{</span><span class="nx">end</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nx">guid</span><span class="p">&gt;{{</span> <span class="p">.</span><span class="nx">Permalink</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">guid</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nx">description</span><span class="p">&gt;{{</span> <span class="p">.</span><span class="nx">Summary</span> <span class="p">|</span> <span class="nx">html</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">description</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="o">/</span><span class="nx">item</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">{{</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="o">/</span><span class="nx">channel</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="o">/</span><span class="nx">rss</span><span class="p">&gt;</span>
</span></span></code></pre></div><ul>
<li>修改相关代码</li>
</ul>
<p>把</p>
<p><code>&lt;description&gt;{{- .Summary | html -}}&lt;/description&gt;</code></p>
<p>改成</p>
<p><code>&lt;description&gt;{{- .Content | html -}}&lt;/description&gt;</code></p>
<ul>
<li>可能的报错在 <code>rss.xml</code> 代码的 20 行左右<code>&lt;language&gt;{{ site.Language.LanguageCode }}&lt;/language&gt;</code></li>
</ul>
<p>如果报错需要根据提示修改根目录的<code>hugo.toml</code>配置文件</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">languageCode</span> <span class="p">=</span> <span class="s">&#34;zh-CN&#34;</span>
</span></span></code></pre></div><p>然后在 <code>rss.xml</code> 中修改为</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nx">language</span><span class="p">&gt;{{</span> <span class="nx">site</span><span class="p">.</span><span class="nx">LanguageCode</span> <span class="p">}}&lt;</span><span class="o">/</span><span class="nx">language</span><span class="p">&gt;</span>
</span></span></code></pre></div><ul>
<li>完成。您的 RSS 将从摘要改成全文输出。</li>
</ul>
<p>References
<a href="https://notes.nicolevanderhoeven.com/Change+default+RSS+template+for+Hugo">Display full blog post content in Hugo RSS feed</a></p>
]]></content:encoded></item><item><title>使用 cloudflare R2免费搭建自用图床</title><link>https://blog.yangpeiyuan.com/posts/cloudflare-r2/</link><guid>https://blog.yangpeiyuan.com/posts/cloudflare-r2/</guid><pubDate>Sun, 20 Aug 2023 22:39:54 +0800</pubDate><content:encoded><![CDATA[<p>cloudflare 提供了一个叫 <a href="https://www.cloudflare.com/products/r2/">R2</a> 的服务，也是 OSS ，成本对个人用户几乎免费、不用备案，相对速度属于能用，非常合理。<a href="https://developers.cloudflare.com/r2/platform/pricing">R2 定价说明文档。</a>10 个 G 以内的存储和 1 千万的查询都是免费的，于是，本 blog 有了几乎免费的图床可以使用了。</p>
<p>过程也比较简单，分享下：</p>
<ul>
<li>前置要求，首先需要有一个自己的域名</li>
<li>注册 cloudflare 省略。</li>
<li>登录 cloudflare，把域名解析服务器配置到 cloudflare。这样方便在使用 R2 的时候绑定一个自己的域名。参考教程 <a href="https://www.kuajingyuan.com/set-cloudflare-as-dns-server">将 Cloudflare 设置为 DNS 域名解析服务器</a></li>
</ul>
<h2 id="开通-r2-服务">开通 R2 服务</h2>
<ul>
<li>在侧边菜单找到 R2 服务。启用 R2 服务需要绑定一个信用卡，国内信用卡是可以开通服务的。我用的是建行 master 信用卡。开通时网络无需翻墙，不然会出现信用卡验证不通过。</li>
</ul>
<h2 id="创建存储桶">创建存储桶</h2>
<ul>
<li>接下来就可以创建桶了，存储服务一般都这样，为什么叫桶我也不知道，并不影响什么。取个名就是了，可以理解为文件夹名也行，反正是个人使用。</li>
<li><img src="https://xlog.app/cdn-cgi/image/width=3840,quality=75,format=auto,onerror=redirect/https://ipfs.xlog.app/ipfs/bafkreibulcyctzgoqllmguepdevkihn55lduqmzrlmxaqmfzwkg5moq6da" alt=""></li>
</ul>
<h2 id="关联域名">关联域名</h2>
<ul>
<li>建好桶后，这时候已经可以上传图片、文件之类的了，但默认这个桶是公网不可访问的。去设置里配置下公开访问-链接域。虽然也可以用 cloudflare 提供的二级域名访问，但是那种方式一是有一些频率方面的限制，而是.dev 的域名也被大防火墙拦截了，所以还是用自己的域名更好一些。</li>
<li>域的地址例如：static.yourdomain.com 。之后图片的公网访问路径就类似是 <a href="http://static.yourdomain.com/picURL">static.yourdomain.com/picURL</a></li>
<li>配置完成后，上传图片，用刚刚配置的域名加上传后的文件名，即可访问到文件。比如本文的所有图片都是用的 R2 服务托管的。在文件列表点击进入到详情页也可以看到文件的 3 种不同路径地址</li>
<li><img src="https://xlog.app/cdn-cgi/image/width=3840,quality=75,format=auto,onerror=redirect/https://ipfs.xlog.app/ipfs/bafkreibnfs3da4g3bwuo3niiitsw5tv3hf5thmfcdf62edzipvffeh6rxi" alt=""></li>
</ul>
<h2 id="打开-r2-的-api-token">打开 R2 的 API token</h2>
<ul>
<li>为了方便传图，日常会使用 uPic 传图工具。此工具可以自定义配置服务。需要用的 api token。</li>
<li>在 R2 的控制台右侧 点击 <code>管理 R2 API 令牌</code> —&gt;<code>创建API令牌</code>。权限选编辑（即读写都可），ttl 选永久。其他不变。</li>
<li>api 令牌只会显示 1 次。需记录到本地备用。</li>
<li><img src="https://xlog.app/cdn-cgi/image/width=3840,quality=75,format=auto,onerror=redirect/https://ipfs.xlog.app/ipfs/bafkreigwynnrqkhpqjhbjph452uh623vn3vfkto42gbj3hrrjglygiqixi" alt=""></li>
<li><img src="https://xlog.app/cdn-cgi/image/width=3840,quality=75,format=auto,onerror=redirect/https://ipfs.xlog.app/ipfs/bafkreibs7inho3qagrb4hxnj4kieeus3mcf464letsxf36c3eulq5xybpe" alt=""></li>
</ul>
<h2 id="配置-upic-客户端">配置 uPic 客户端</h2>
<p><img src="https://static.appd.top/blog/20230721Screen%20Shot%202023-07-21%20at%2012.50.08%20AM.png" alt="20230721ScreenShot2023-07-21at12.50.08AM"></p>
]]></content:encoded></item><item><title>SSH免密码一键登录</title><link>https://blog.yangpeiyuan.com/posts/use-ssh-public-key-authentication/</link><guid>https://blog.yangpeiyuan.com/posts/use-ssh-public-key-authentication/</guid><pubDate>Thu, 10 Aug 2023 22:39:54 +0800</pubDate><content:encoded><![CDATA[<p>最近刚开始使用 hugo，会频繁登录服务器去做一些配置。每次登录服务器都要敲一堆命令和账号密码啥的。一劳永逸的方法是改成 ssh 密钥登录，它比密码登录更安全、更快捷。根据以下 2 个步骤完成配置后，登录服务器一条命令就搞定。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh webserver
</span></span></code></pre></div><h1 id="使用-ssh-公钥身份验证登录服务器-use-ssh-public-key-authentication-on-macos">使用 SSH 公钥身份验证登录服务器 Use SSH Public Key Authentication on macOS</h1>
<ol>
<li>SSH 密钥存储在  <code>~/.ssh/</code>  目录中，先去看看是否已有密钥对。使用 Ed25519 生成的默认名称为 <code>id_ed25519</code> 和 <code>id_ed25519.pub</code>。</li>
<li>如有则跳过第二步。没有则需要手动生成一个全新的密钥对。</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-keygen -t ed25519 -C <span class="s2">&#34;user@domain.tld&#34;</span>
</span></span><span class="line"><span class="cl">//-C 是一个可选注释，可帮助您区分 SSH 密钥。可以用邮箱、网址、常用用户名来识别
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//生成密钥对后，您应看到类似于以下内容的输出：
</span></span><span class="line"><span class="cl">Your identification has been saved in /Users/username/.ssh/id_ed25519.
</span></span><span class="line"><span class="cl">Your public key has been saved in /Users/username/.ssh/id_ed25519.pub.
</span></span><span class="line"><span class="cl">The key fingerprint is: SHA256:AVF3XG5XtwxWmoECKC9xExnStF5JzpXYDfkieOejYJE user@domain.tld
</span></span></code></pre></div><ol start="3">
<li>要开始使用新生成的 SSH 密钥对，首先需要将公钥上传到远程系统。</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-copy-id <span class="o">[</span>user<span class="o">]</span>@<span class="o">[</span>ip-address<span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//提示您输入远程用户的密码，输入密码后，公钥将复制到服务器 authorized_keys 的文件中。您现在可以验证您是否能够使用密钥登录服务器。
</span></span></code></pre></div><ol start="4">
<li>可选项。如果您使用的是私人计算机，则可以使用 ssh-add 实用程序来存储您的密码，以便将来在同一终端会话中的 SSH 连接中不需要它。</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-add --apple-use-keychain ~/.ssh/id_ed25519
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//若要确认已添加密钥，请运行该 ssh-add -l 命令并验证密钥是否显示在列表中。
</span></span></code></pre></div><h1 id="配置-ssh-别名一键登录-create-an-ssh-alias-to-access-your-remote-machines">配置 SSH 别名一键登录 Create an SSH Alias to access your remote machines</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">//打开ssh配置文件
</span></span><span class="line"><span class="cl">$ vim ~/.ssh/config
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//新增
</span></span><span class="line"><span class="cl">Host &lt;起个名字&gt;
</span></span><span class="line"><span class="cl">HostName &lt;你的服务器ip地址&gt;
</span></span><span class="line"><span class="cl">User &lt;用户名&gt;
</span></span><span class="line"><span class="cl">Port <span class="o">[</span>可选项，端口号<span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">//演示实例
</span></span><span class="line"><span class="cl">Host webserver
</span></span><span class="line"><span class="cl">HostName 100.8.8.8
</span></span><span class="line"><span class="cl">User root
</span></span></code></pre></div><p>完成后，就可以这样登录服务器了</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh webserver
</span></span></code></pre></div><h1 id="refer">Refer</h1>
<ul>
<li><a href="https://www.linode.com/docs/guides/use-public-key-authentication-with-ssh/?tabs=ed25519-recommended%2Cmacos-keychain%2Cusing-ssh-copy-id-recommended">Use SSH Public Key Authentication on Linux, macOS, and Windows</a></li>
<li><a href="https://www.vulongtran.com/how-to-create-ssh-alias-remote-machine">How to create an SSH Alias to access your remote machines</a></li>
</ul>
]]></content:encoded></item></channel></rss>