<?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>Tutorial on eatmoreduck&#39;s Blog</title>
    <link>https://blog.xiaohuangyu.space/tags/tutorial/</link>
    <description>Recent content in Tutorial on eatmoreduck&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Thu, 17 Sep 2026 11:54:26 +0800</lastBuildDate>
    <atom:link href="https://blog.xiaohuangyu.space/tags/tutorial/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>让 Claude Desktop 支持任意第三方模型</title>
      <link>https://blog.xiaohuangyu.space/p/claude-desktop-uses-any-third-party-model/</link>
      <pubDate>Thu, 28 May 2026 15:53:54 +0800</pubDate>
      <guid>https://blog.xiaohuangyu.space/p/claude-desktop-uses-any-third-party-model/</guid>
      <description>&lt;p&gt;最新版本 Claude Desktop 已经不支持使用第三方模型了，绕过的方法也很简单：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;在上游 API 地址和客户端之间加一层本地转发，转发的时候把模型字段替换掉（纯本地操作）&lt;/li&gt;&#xA;&lt;li&gt;Claude Desktop 只认 HTTPS，所以本地转发端口得套一层 HTTPS。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;可以直接在本地使用 CC-switch 做一个转发，把任意三方模型包装成 claude 模型，配置映射关系即可正常使用 Claude Desktop。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>最新版本 Claude Desktop 已经不支持使用第三方模型了，绕过的方法也很简单：</p>
<ol>
<li>在上游 API 地址和客户端之间加一层本地转发，转发的时候把模型字段替换掉（纯本地操作）</li>
<li>Claude Desktop 只认 HTTPS，所以本地转发端口得套一层 HTTPS。</li>
</ol>
<p>可以直接在本地使用 CC-switch 做一个转发，把任意三方模型包装成 claude 模型，配置映射关系即可正常使用 Claude Desktop。</p>
<ol>
<li><a href="https://code.claude.com/docs/en/desktop">安装 Claude Desktop</a></li>
<li>启动 APP，先不要登录，Mac 端在顶部菜单栏寻找</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Help -&gt; Troubleshooting -&gt; Enable Developer mode
</span></span></code></pre></div><ol start="3">
<li>继续在顶部选择</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Developer -&gt; Configure third-party inference
</span></span></code></pre></div><ol start="4">
<li>打开 CC-switch 添加你的模型供应商，可以一键复制之前配好的 Claude</li>
<li>点击启用，并且开启本地路由
<img loading="lazy" src="https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository@master/blog/20260528160017309.png" alt="CC-switch 启用本地路由界面"  />
</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>屏蔽 macOS 26 更新（2026 亲测有效，消除小红点）</title>
      <link>https://blog.xiaohuangyu.space/p/block-macos-updates/</link>
      <pubDate>Mon, 29 Dec 2025 14:28:17 +0800</pubDate>
      <guid>https://blog.xiaohuangyu.space/p/block-macos-updates/</guid>
      <description>&lt;h2 id=&#34;为什么要屏蔽更新&#34;&gt;为什么要屏蔽更新&lt;/h2&gt;&#xA;&lt;p&gt;macOS 26 出新之后，隔三岔五的弹窗更新，总让我担心手滑点到「立即更新」，虽然有二次确认。但最近更新频繁，我想找个一劳永逸的办法。&lt;/p&gt;&#xA;&lt;p&gt;我想要屏蔽更新的几个原因：&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="为什么要屏蔽更新">为什么要屏蔽更新</h2>
<p>macOS 26 出新之后，隔三岔五的弹窗更新，总让我担心手滑点到「立即更新」，虽然有二次确认。但最近更新频繁，我想找个一劳永逸的办法。</p>
<p>我想要屏蔽更新的几个原因：</p>
<ul>
<li>强迫症看着那个红点难受</li>
<li>新系统老机器带不动，怕更新了变卡</li>
<li>工作环境需要稳定，不想瞎折腾，更新后担心开发环境炸掉</li>
<li>macOS 26 的液态玻璃风格我很讨厌，同时也担心更新后部分 app 不能匹配</li>
</ul>
<p>遂决定升级到 macOS 15.7.3 之后，彻底屏蔽 macOS 更新，同时消除小红点</p>
<blockquote>
<p>下面的方法在 2026 年的 macOS 26（Tahoe）上仍然可用，但说实话，越新的系统对更新提示的「执念」越深。hosts 拦截能让更新下载失败，却不一定能干净地让小红点消失。所以我把方案分成两个层次：先上 hosts 兜底，再用配置描述文件做彻底屏蔽（这是 2026 年最推荐、最省心的做法）。</p>
</blockquote>
<h2 id="第一步ui屏蔽软件更新及自动下载">第一步：UI屏蔽软件更新及自动下载</h2>
<ol>
<li>打开「设置」-「通用」-「软件更新」</li>
<li>点击右边的 ⓘ 图标</li>
<li>把「自动保持我的 Mac 最新」关掉</li>
</ol>
<h2 id="第二步修改-hosts-屏蔽更新">第二步：修改 hosts 屏蔽更新</h2>
<p>这一步的操作是为了禁止连接到 macOS 更新服务器，编辑 hosts 文件：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo vim /etc/hosts
</span></span></code></pre></div><p>在文件末尾加入以下几行：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span> <span class="n">swscan</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">com</span>
</span></span><span class="line"><span class="cl"><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span> <span class="n">swdist</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">com</span>
</span></span><span class="line"><span class="cl"><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span> <span class="n">swdownload</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">com</span>
</span></span><span class="line"><span class="cl"><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span> <span class="n">swcdn</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">com</span>
</span></span><span class="line"><span class="cl"><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span> <span class="n">updates</span><span class="o">-</span><span class="n">http</span><span class="o">.</span><span class="n">cdn</span><span class="o">-</span><span class="n">apple</span><span class="o">.</span><span class="n">com</span>
</span></span><span class="line"><span class="cl"><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span> <span class="n">updates</span><span class="o">.</span><span class="n">cdn</span><span class="o">-</span><span class="n">apple</span><span class="o">.</span><span class="n">com</span>
</span></span><span class="line"><span class="cl"><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span> <span class="n">gdmf</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">com</span>
</span></span><span class="line"><span class="cl"><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span> <span class="n">xp</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">com</span>
</span></span><span class="line"><span class="cl"><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span> <span class="n">mesu</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">com</span>
</span></span></code></pre></div><p>然后刷新 DNS 缓存：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dscacheutil -flushcache
</span></span><span class="line"><span class="cl">sudo killall -HUP mDNSResponder
</span></span></code></pre></div><h2 id="第三步消除小红点">第三步：消除小红点</h2>
<p>完成上一步之后，依然能看到 macOS 26 的更新提示，但点击更新会失败。此时先点击更新，在弹出的界面<strong>不要点击「检测更新」</strong>，然后按 <code>command+option+esc</code> 打开「强制退出」窗口，将「系统设置」强制退出，小红点就会消失
<img loading="lazy" src="https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository@master/blog/20251229144404126.png" alt="macOS 软件更新界面强制退出消除小红点"  />
</p>
<h3 id="关于-hosts-方法的局限">关于 hosts 方法的局限</h3>
<p>需要说明的是，从 macOS 15（Sequoia）到 26（Tahoe），Apple 把更新检测和通知做得越来越「顽固」。上面的 hosts 屏蔽可以让升级包下载不下来，但小红点和「升级到 macOS Tahoe」的提示有时还是会冒出来，尤其是系统后台守护进程定时检查之后。如果你发现红点三天两头又回来了，那就直接用下面第四步的配置描述文件，一劳永逸。</p>
<h2 id="第四步2026-推荐用配置描述文件彻底屏蔽升级">第四步（2026 推荐）：用配置描述文件彻底屏蔽升级</h2>
<p>这是 2026 年社区（macsysadmin、Jamf、Daring Fireball 等）一致推荐的做法，也是我个人认为最省心的方案。原理是给系统装一个「延迟软件更新」的描述文件，让 macOS 26 的升级入口在「软件更新」界面里直接消失，连红点都不给你留。个人 Mac 不需要企业 MDM，自己做一个 <code>.mobileconfig</code> 装上就行。</p>
<p>核心是 Restrictions（<code>com.apple.applicationaccess</code>）这个 payload 里的两个键：</p>
<ul>
<li><code>forceDelayedMajorSoftwareUpdates = true</code>：隐藏大版本升级（也就是 macOS 26）</li>
<li><code>managedInstallDelay = 90</code>：延迟天数，最大 90 天</li>
</ul>
<h3 id="做一个描述文件">做一个描述文件</h3>
<p>不需要从零手写 XML，用免费的 <strong>iMazing Profile Editor</strong> 或 <strong>Apple Configurator</strong>（App Store 可下）新建一个 profile，添加 General → Restrictions，勾上强制延迟主版本更新，天数填 90，导出成 <code>.mobileconfig</code> 文件即可。</p>
<h3 id="安装描述文件">安装描述文件</h3>
<ol>
<li>双击导出的 <code>.mobileconfig</code> 文件，系统会提示「已下载描述文件」</li>
<li>打开「设置」-「隐私与安全性」，下拉到底部找到「描述文件」，点击进入</li>
<li>选中刚才的描述文件，点击「安装」，按提示输入密码确认</li>
</ol>
<p>装完回到「软件更新」看一眼，原本的「升级到 macOS Tahoe」入口和红点就都不见了。这比 hosts 折腾舒服多了。</p>
<h3 id="注意事项">注意事项</h3>
<ul>
<li><strong>90 天上限</strong>：延迟最多只能设 90 天，到期前重新安装一次新 profile 就能续上，长期不升级的话设个日历提醒</li>
<li><strong>手动安装的限制</strong>：macOS 26 上手动安装的描述文件，部分 Restrictions 键的覆盖力不如 MDM 受管设备，但对隐藏 macOS 大版本升级这一项是够用的</li>
<li><strong>想升级时</strong>：把描述文件删掉（描述文件界面里点「移除」），稍等片刻就能重新看到更新入口</li>
</ul>
<h2 id="已经点了更新或更新包已经下载怎么反悔">已经点了更新、或更新包已经下载，怎么反悔</h2>
<p>这段时间陆续有朋友问到同一个问题：手快点了「立即更新」，或者系统后台已经把更新包下载好了，还能不能取消。能，按走到哪一步来处理：</p>
<h3 id="情况一还没重启更新正在下载或已经下载完">情况一：还没重启，更新正在下载或已经下载完</h3>
<p>先去「设置」-「通用」-「软件更新」，点下载条目旁边的 ⓘ，新系统（Ventura 之后）一般会在这里给一个「删除更新」按钮，有就直接点，这是最干净的办法。</p>
<p>找不到这个按钮的话，更新包其实已经躺在硬盘里了：小版本更新在 <code>/Library/Updates</code>，大版本升级在根目录的「macOS Install Data」文件夹。先试试终端直接删：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo rm -rf /Library/Updates/*
</span></span><span class="line"><span class="cl">sudo rm -rf <span class="s2">&#34;/macOS Install Data&#34;</span>
</span></span></code></pre></div><p>如果提示 <code>Operation not permitted</code>，不是命令的问题，是 SIP 在保护这些文件。处理起来繁琐一点：进恢复模式（Apple Silicon 关机后长按电源键，出现「载入启动选项」后点「选项」-「继续」；Intel 机器开机时按住 <code>Cmd+R</code>），在菜单栏「实用工具」里打开终端，执行 <code>csrutil disable</code>，重启回系统再执行上面的删除命令，删完记得再进一次恢复模式用 <code>csrutil enable</code> 把 SIP 开回去。</p>
<p>删完回「软件更新」页面确认没有挂起的更新，然后把上面第四步的描述文件装上（或者确认 hosts 条目还在），不然过几天它又悄悄给你下载回来。</p>
<h3 id="情况二已经重启装完了">情况二：已经重启、装完了</h3>
<p>装完就没有「取消」这回事了，只能 Time Machine 整机回退，或者抹盘重装旧版本，代价大得多。所以真想留在旧系统，重点是别让它走到这一步——屏蔽描述文件就是干这个的。</p>
<h2 id="怎么恢复">怎么恢复</h2>
<p>哪天想更新了，按你当初用的是哪种屏蔽方式来恢复：</p>
<ul>
<li><strong>hosts 方式</strong>：把 <code>/etc/hosts</code> 里相关行注释掉或删掉，刷新 DNS 缓存，重新点击检查更新即可</li>
<li><strong>配置描述文件方式</strong>：到「设置」-「隐私与安全性」-「描述文件」里把对应的 profile 移除，等一会儿就能重新看到 macOS 升级入口</li>
</ul>
<h2 id="写在最后">写在最后</h2>
<p>以前我也喜欢追新，软件更到最新，经历过多次开发环境崩溃重建之后，逐渐对折腾失去了兴趣，自从 21 年入了 arm 的 mac 之后，过去4年，每隔1-2年就要有一次开发环境崩溃，我为自己过于激进导致的浪费时间感到后悔。</p>
<p>今年正式用上了 Time Machine，同时把更新彻底屏蔽了，再也不怕手抖了。这套方法我从 2025 年底一直用到 2026 年中，期间 Apple 推了不少次 macOS 26 的升级提醒，我这边一点动静都没有。</p>
<p>动动小手，五分钟，免除烦人更新小红点困扰</p>
<p><img loading="lazy" src="https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository@master/blog/bb5f15ed5150f7a9a3e5b2042e6612cd.jpg" alt="微信公众号二维码"  />
</p>
]]></content:encoded>
    </item>
    <item>
      <title>ZeroTier Planet 组网完全指南：从原理到实践</title>
      <link>https://blog.xiaohuangyu.space/p/zerotier-planet-guide/</link>
      <pubDate>Wed, 05 Nov 2025 10:00:00 +0800</pubDate>
      <guid>https://blog.xiaohuangyu.space/p/zerotier-planet-guide/</guid>
      <description>&lt;p&gt;在当今时代，远程访问和跨地域网络连接已成为工作和生活的必需品。无论是远程办公访问公司资源，还是在家控制智能设备，抑或承担不起云上高额费用，想让家中旧设备焕发活力，我们都需要一种安全、高效且稳定，且高性价比的网络解决方案。ZeroTier就是一款强大的工具，它能让我们轻松搭建跨越互联网的虚拟局域网。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>在当今时代，远程访问和跨地域网络连接已成为工作和生活的必需品。无论是远程办公访问公司资源，还是在家控制智能设备，抑或承担不起云上高额费用，想让家中旧设备焕发活力，我们都需要一种安全、高效且稳定，且高性价比的网络解决方案。ZeroTier就是一款强大的工具，它能让我们轻松搭建跨越互联网的虚拟局域网。</p>
<h2 id="为什么需要组网">为什么需要组网？</h2>
<h3 id="zerotier简介">ZeroTier简介</h3>
<p>ZeroTier是一款基于P2P技术的虚拟局域网（VPN）工具，它能够将分布在全球各地的设备连接在一个虚拟的局域网中。通过ZeroTier，您可以实现：</p>
<ol>
<li><strong>远程访问</strong>：在公司用手机直接访问家里的NAS设备</li>
<li><strong>设备互联</strong>：让分布在不同地理位置的设备如同在同一个局域网内一样通信</li>
<li><strong>点对点直连</strong>：设备间直接通信，无需经过中转服务器，既快速又安全</li>
</ol>
<h3 id="工作原理">工作原理</h3>
<p>ZeroTier的工作原理涉及三个关键概念：</p>
<ul>
<li><strong>PLANET（行星服务器）</strong>：ZeroTier网络的核心根服务器，负责网络发现和初始连接，相当于整个网络的&quot;中枢&quot;</li>
<li><strong>MOON（卫星服务器）</strong>：用户可以自建的私有根服务器，作为区域性的代理节点，帮助就近的设备更快地建立连接</li>
<li><strong>LEAF（叶子节点）</strong>：所有接入ZeroTier网络的终端设备，如电脑、手机、服务器等</li>
</ul>
<p>设备之间的连接过程是：首先通过PLANET或MOON进行发现和协商，然后尽可能建立P2P直连，只有在无法直连的情况下才会通过中转方式进行通信。</p>
<h2 id="为什么自建planet服务器">为什么自建Planet服务器？</h2>
<p>虽然ZeroTier官方提供了免费的PLANET服务器，但在实际使用中存在以下问题：</p>
<ol>
<li><strong>网络延迟</strong>：官方服务器位于海外，国内用户访问延迟高且不稳定</li>
<li><strong>连接速度</strong>：本地化的PLANET服务器可以显著加快设备间的连接建立速度</li>
<li><strong>网络控制</strong>：自建服务器让您完全掌控网络配置，可根据需求进行优化调整</li>
<li><strong>安全性</strong>：私有化部署意味着网络流量不经过第三方服务器，更加安全可靠</li>
<li><strong>独立性</strong>：避免因官方服务器故障或网络波动影响业务正常运行</li>
</ol>
<h2 id="如何自建planet服务器">如何自建Planet服务器？</h2>
<p>我们将使用<a href="https://github.com/xubiaolin/docker-zerotier-planet">xubiaolin/docker-zerotier-planet</a>项目，通过Docker容器快速部署私有的Planet服务器。</p>
<h3 id="环境准备">环境准备</h3>
<p>在开始安装之前，请确保您的服务器满足以下条件：</p>
<ol>
<li>拥有公网IP地址</li>
<li>开放以下端口：
<ul>
<li>3443/tcp（管理面板，默认可调整）</li>
<li>9994/tcp（ZeroTier通信，默认可调整）</li>
<li>9994/udp（ZeroTier通信，默认可调整）</li>
</ul>
</li>
<li>安装必要的软件依赖：
<ul>
<li>Docker（容器运行环境）</li>
<li>Git（获取项目代码）</li>
</ul>
</li>
</ol>
<h3 id="部署步骤">部署步骤</h3>
<ol>
<li><strong>安装依赖软件</strong></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="c1"># Debian/Ubuntu系统</span>
</span></span><span class="line"><span class="cl">apt update <span class="o">&amp;&amp;</span> apt install git docker.io -y
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># CentOS/Rocky Linux系统</span>
</span></span><span class="line"><span class="cl">yum update <span class="o">&amp;&amp;</span> yum install git docker -y
</span></span></code></pre></div><ol start="2">
<li><strong>克隆项目代码</strong></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="c1"># 官方地址</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/xubiaolin/docker-zerotier-planet.git
</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">git clone https://ghproxy.imoyuapp.win/https://github.com/xubiaolin/docker-zerotier-planet.git
</span></span></code></pre></div><ol start="3">
<li><strong>运行部署脚本</strong></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="nb">cd</span> docker-zerotier-planet
</span></span><span class="line"><span class="cl">chmod +x deploy.sh
</span></span><span class="line"><span class="cl">./deploy.sh
</span></span></code></pre></div><p>根据提示选择&quot;安装&quot;选项，脚本将自动完成部署过程，通常需要1-3分钟。</p>
<ol start="4">
<li><strong>获取配置文件</strong></li>
</ol>
<p>部署完成后，会在<code>./data/zerotier/dist</code>目录下生成<code>planet</code>和<code>moon</code>配置文件。您可以通过安装完成后提供的URL直接下载，或使用SCP等工具从服务器下载。</p>
<ol start="5">
<li><strong>访问管理面板</strong></li>
</ol>
<p>部署完成后，可通过<code>http://服务器IP:3443</code>访问管理面板，默认账号为<code>admin</code>，默认密码为<code>password</code>。</p>
<h2 id="使用自建planet服务器组网">使用自建Planet服务器组网</h2>
<h3 id="创建网络">创建网络</h3>
<ol>
<li>登录管理面板后，点击&quot;Networks&quot;菜单</li>
<li>点击&quot;Add Network&quot;按钮创建新网络</li>
<li>输入网络名称，其他选项保持默认</li>
<li>记录生成的网络ID，后续客户端配置需要用到</li>
</ol>
<h3 id="客户端配置">客户端配置</h3>
<h4 id="windows客户端">Windows客户端</h4>
<ol>
<li>从ZeroTier官网下载并安装客户端</li>
<li>将<code>planet</code>文件复制到<code>C:\ProgramData\ZeroTier\One</code>目录（需要显示隐藏目录）</li>
<li>重启ZeroTier服务：
<ul>
<li>Win+S搜索&quot;服务&quot;</li>
<li>找到ZeroTier One并重启</li>
</ul>
</li>
<li>使用管理员身份打开PowerShell，执行：
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">zerotier-cli</span><span class="p">.</span><span class="py">bat</span> <span class="n">join</span> <span class="p">[</span><span class="n">网络ID</span><span class="p">]</span>
</span></span></code></pre></div></li>
<li>在管理面板中授权该设备</li>
</ol>
<h4 id="linux客户端">Linux客户端</h4>
<ol>
<li>安装ZeroTier客户端</li>
<li>进入目录<code>/var/lib/zerotier-one</code></li>
<li>替换目录下的<code>planet</code>文件</li>
<li>重启服务：
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">service zerotier-one restart
</span></span></code></pre></div></li>
<li>加入网络：
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">zerotier-cli join <span class="o">[</span>网络ID<span class="o">]</span>
</span></span></code></pre></div></li>
<li>在管理面板中授权该设备</li>
</ol>
<h4 id="macos客户端">macOS客户端</h4>
<ol>
<li>进入<code>/Library/Application\ Support/ZeroTier/One/</code>目录</li>
<li>替换目录下的<code>planet</code>文件</li>
<li>重启服务：
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /Library/Application<span class="se">\ </span>Support/ZeroTier/One/zerotier-one.pid <span class="p">|</span> sudo xargs <span class="nb">kill</span>
</span></span></code></pre></div></li>
<li>加入网络：
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">zerotier-cli join <span class="o">[</span>网络ID<span class="o">]</span>
</span></span></code></pre></div></li>
<li>在管理面板中授权该设备</li>
</ol>
<p><img loading="lazy" src="https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository@master/blog/20251105205603736.png" alt="image.png"  />
</p>
<h3 id="验证连接">验证连接</h3>
<p>在任意客户端执行以下命令验证连接状态：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">zerotier-cli peers
</span></span></code></pre></div><p>如果看到PLANET角色且连接方式为DIRECT（直连），则表示配置成功。</p>
<h2 id="常见问题与解决方案">常见问题与解决方案</h2>
<h3 id="连接问题">连接问题</h3>
<ol>
<li><strong>检查防火墙设置</strong>：确保服务器和客户端都开放了相应端口</li>
<li><strong>云服务商安全组</strong>：在阿里云、腾讯云等平台后台放行端口</li>
<li><strong>网络类型限制</strong>：某些网络环境下UDP可能被QoS限制，可考虑使用OpenVPN等替代方案</li>
</ol>
<h3 id="权限问题">权限问题</h3>
<ol>
<li><strong>客户端未授权</strong>：确保在管理面板中勾选了设备的&quot;Authorized&quot;</li>
<li><strong>文件权限错误</strong>：确保<code>planet</code>文件具有正确的读取权限</li>
</ol>
<h3 id="性能优化">性能优化</h3>
<ol>
<li><strong>部署Moon服务器</strong>：对于大规模部署，可以在不同地区部署Moon服务器以提高连接效率</li>
<li><strong>监控连接状态</strong>：定期检查<code>zerotier-cli peers</code>输出，确保设备间维持DIRECT连接</li>
</ol>
<h2 id="安全建议">安全建议</h2>
<ol>
<li><strong>及时修改默认密码</strong>：部署完成后应立即修改管理面板的默认账号密码</li>
<li><strong>启用HTTPS</strong>：为管理面板配置SSL证书，提高安全性</li>
<li><strong>定期备份配置</strong>：妥善保管生成的配置文件，特别是<code>planet</code>和<code>moon</code>文件</li>
<li><strong>访问控制</strong>：严格控制网络成员，仅授权可信设备加入</li>
</ol>
<h2 id="实际应用场景">实际应用场景</h2>
<ol>
<li><strong>远程办公</strong>：员工在家访问公司内部系统和资源</li>
<li><strong>家庭网络</strong>：在外随时访问家中的NAS、智能家居设备</li>
<li><strong>游戏联机</strong>：为分布式的游戏服务器建立专用网络</li>
<li><strong>开发测试</strong>：为开发团队提供隔离的测试网络环境</li>
<li><strong>IoT设备管理</strong>：统一管理分布在全球各地的物联网设备</li>
</ol>
<p>搭建好 planet 之后，在阿里云服务器上想要直接访问远程设备，也需要加入搭建好的 planet 网络，因 planet 和 peer 在同一台机器，可能会出现端口冲突的情况（默认用 9993），需要自定义 zerotier-cli 的端口</p>
<p>编辑 <code>/var/lib/zerotier-one/local.conf</code>文件（如果不存在则创建）：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">{
</span></span><span class="line"><span class="cl">    &#34;settings&#34;: {
</span></span><span class="line"><span class="cl">        &#34;primaryPort&#34;: 9994
</span></span><span class="line"><span class="cl">    }
</span></span><span class="line"><span class="cl">}
</span></span></code></pre></div><p>配置完成后，使用</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">zerotier-cli join [网络ID]
</span></span></code></pre></div><p>s
即可在页面看到已经加入的阿里云机器，及家中局域网的机器</p>
]]></content:encoded>
    </item>
    <item>
      <title>远程访问系列（一）公网IP</title>
      <link>https://blog.xiaohuangyu.space/p/wan-to-lan-via-public-ipv4/</link>
      <pubDate>Wed, 06 Nov 2024 10:25:04 +0800</pubDate>
      <guid>https://blog.xiaohuangyu.space/p/wan-to-lan-via-public-ipv4/</guid>
      <description>&lt;p&gt;最近新入了个 NAS ，设备是绿联 DXP4800，装上黑裙之后，首要的问题是解决最常用的照片文件同步问题，上文已经解决过，参见 &lt;a href=&#34;https://blog.xiaohuangyu.space/p/dxp4800-synology/&#34;&gt;DXP4800-黑群晖小记&lt;/a&gt; 研究了几种外网访问内网设备的方案，在这里做个总结。本文是该系列的开篇，主要介绍各种方案的优缺点和适用场景。&#xA;网上搜索外网访问内网，局域网访问，远程连接，远程访问 docker，基本都可以归类为人不在家，想访问家中的nas 及其他的设备，所以标题暂时起名为远程访问系列&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>最近新入了个 NAS ，设备是绿联 DXP4800，装上黑裙之后，首要的问题是解决最常用的照片文件同步问题，上文已经解决过，参见 <a href="https://blog.xiaohuangyu.space/p/dxp4800-synology/">DXP4800-黑群晖小记</a> 研究了几种外网访问内网设备的方案，在这里做个总结。本文是该系列的开篇，主要介绍各种方案的优缺点和适用场景。
网上搜索外网访问内网，局域网访问，远程连接，远程访问 docker，基本都可以归类为人不在家，想访问家中的nas 及其他的设备，所以标题暂时起名为远程访问系列</p>
<h2 id="远程访问方案梳理">远程访问方案梳理</h2>
<h3 id="1-基于公网-ip-的直接访问方案">1. 基于公网 IP 的直接访问方案</h3>
<ul>
<li><strong>优点</strong>：直接利用公网 IP 访问，无需中转，速度快。支持 ipv4/ipv6。</li>
<li><strong>缺点</strong>：依赖运营商分配公网 IP，安全风险高。</li>
<li><strong>适用场景</strong>：有公网 IP 的网络环境，如部分企业专线、有公网 IP 的家庭网络。</li>
</ul>
<h3 id="2-vpn虚拟专用网络方案">2. VPN（虚拟专用网络）方案</h3>
<ul>
<li><strong>优点</strong>：安全加密，可完整访问内网。</li>
<li><strong>缺点</strong>：需服务器或依赖 Cloudflare 服务，配置复杂。</li>
<li><strong>适用场景</strong>：企业办公环境。</li>
<li><strong>软件推荐</strong>：OpenVPN、WireGuard。</li>
</ul>
<h3 id="3-内网穿透方案">3. 内网穿透方案</h3>
<ul>
<li><strong>优点</strong>：无需公网 IP，配置灵活。</li>
<li><strong>缺点</strong>：依赖中转服务器，且访问速度与中转服务器带宽有关，需要额外付费，并且可能有延迟。</li>
<li><strong>适用场景</strong>：临时远程访问，如开发测试。</li>
<li><strong>软件推荐</strong>：frp、ngrok。</li>
</ul>
<h3 id="4-zerotier-异地组网方案">4. ZeroTier 异地组网方案</h3>
<ul>
<li><strong>优点</strong>：P2P 连接，配置简单。</li>
<li><strong>缺点</strong>：免费版限制设备数量，且存在打洞失败几率，但可使用自建 planet 一类的来突破限制（需要服务器）。</li>
<li><strong>适用场景</strong>：小型组网，如家庭网络。</li>
</ul>
<h3 id="5-cloudflare-tunnel-方案">5. Cloudflare Tunnel 方案</h3>
<ul>
<li><strong>优点</strong>：安全性高，配置简单。</li>
<li><strong>缺点</strong>：依赖 Cloudflare 服务，因众所周知的原因速度访问巨慢。</li>
<li><strong>适用场景</strong>：Web 服务、应用访问。</li>
</ul>
<p>个人比较推荐方案 1和方案 4，理由如下</p>
<ol>
<li>付费少</li>
<li>配置相对简单</li>
<li>打通之后，需要少量配置或无需配置即可实现多设备访问</li>
</ol>
<p>本文先介绍如何使用公网 ip 来进行远程访问，本文先假定能够开通 ipv4,具体操作步骤如下</p>
<h2 id="基于公网-ipv4-的直接访问方案">基于公网 IPV4 的直接访问方案</h2>
<h2 id="一获取公网ip">一、获取公网IP</h2>
<h3 id="1-申请公网ip">1. 申请公网IP</h3>
<ul>
<li>联系宽带运营商客服申请开通公网IP</li>
<li>根据运营商政策可能需要更换套餐或支付额外费用</li>
<li>可能获得的公网IP类型：
<ul>
<li>固定IPv4（地址不变，费用较高，一般申请不到）</li>
<li>动态IPv4（光猫重启后地址可能会变化，所以需要域名配合ddns 解析）</li>
<li>动态IPv6（现在运营商普遍支持，但需要配合动态 dns 解析）</li>
</ul>
</li>
</ul>
<h3 id="2-验证公网ip">2. 验证公网IP</h3>
<ul>
<li>访问  <a href="https://ip138.com/">https://ip138.com/</a>  或直接百度搜 ip 查询当前 ip</li>
<li>使用命令行工具检查：
<ul>
<li>Windows: ipconfig /all</li>
<li>Linux/Mac: ifconfig 或 ip addr</li>
</ul>
</li>
<li>注意区分内网IP（192.168.x.x、10.x.x.x等）和公网IP，且注意路由器或光猫是否响应 ping 命令</li>
</ul>
<h2 id="二网络环境配置">二、网络环境配置</h2>
<h3 id="1-光猫设置">1. 光猫设置</h3>
<ul>
<li>理想情况：直接在光猫配置端口转发
<ul>
<li>需要运营商提供超级管理员密码</li>
<li>配置较简单，性能较好</li>
</ul>
</li>
<li>现实情况：多数无法获取超级管理员权限，且光猫性能垃圾，多设备连接了之后会异常卡
<ul>
<li>需要将光猫改为桥接模式，自己额外接路由器</li>
<li>可能需要运营商远程协助设置</li>
</ul>
</li>
</ul>
<h4 id="可能遇到的问题及解决方案">可能遇到的问题及解决方案</h4>
<ol>
<li>运营商不给开公网ip =&gt; 投诉</li>
<li>运营商不给开桥接 =》 投诉</li>
</ol>
<h3 id="2-路由器配置">2. 路由器配置</h3>
<ul>
<li>选购支持端口转发的路由器</li>
<li>设置路由器PPPoE拨号
<ul>
<li>输入宽带账号密码</li>
</ul>
</li>
<li>配置端口转发
<ul>
<li>选择需要转发的内部端口</li>
<li>设置对应的外部端口</li>
<li>指定内网设备IP地址</li>
<li>选择协议类型（TCP/UDP）</li>
</ul>
</li>
</ul>
<h4 id="可能遇到的问题及解决方案-1">可能遇到的问题及解决方案</h4>
<ol>
<li>拿不到宽带账号密码 =》 投诉</li>
<li>验证自己的路由器是否获取到公网 ip =》 <a href="https://ip138.com">https://ip138.com</a> 看ip 是否与路由器后台 ip 一致，且不为192.168.xxx.xxx ，不为 10.xx.xx.xx</li>
<li>验证端口转发是否生效  =&gt; 假定获取到的公网ip 为 222.71.193.9  配置的转发为 9999 端口转发到内网 192.168.1.200 机器的 5001 端口，则执行命令</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&gt; telnet  222.71.193.9 9999   回车
</span></span><span class="line"><span class="cl">Trying  222.71.193.9...
</span></span><span class="line"><span class="cl">Connected to  222.71.193.9.
</span></span><span class="line"><span class="cl">Escape character is &#39;^]&#39;.       (出现这行表示正常，如果没出现则依次排查应用状态，防火墙状态，端口转发是否正确)
</span></span></code></pre></div><h3 id="3-防火墙设置">3. 防火墙设置</h3>
<ul>
<li>路由器防火墙配置
<ul>
<li>开放必要端口</li>
<li>设置访问控制规则</li>
<li>启用基本安全防护</li>
</ul>
</li>
<li>内网设备防火墙配置
<ul>
<li>允许相关端口访问</li>
<li>配置访问白名单</li>
<li>启用安全防护措施</li>
</ul>
</li>
</ul>
<p>完成上述配置之后，在外网可以直接通过 http://公网ip:端口转发外部port 访问相关的 web 应用,此处的 ip 为公网 ip，port 为配置的外网端口转发，假定获取到的公网ip 为 222.71.193.9  配置的转发为 9999 端口转发到内网 192.168.1.200 机器的 5000 端口（群晖默认端口），则访问地址为
http://222.71.193.9:9999 ，但运营商给的是动态 ip，可能会在某些特定的时候自动改变，或者是在路由器重启时重新分配，重新分配之后，就原来的方式就不能访问了，所以为了使用方便，都希望直接使用某个域名来远程访问内部服务，接下来就需要介绍后续DDNS 了</p>
<p>DDNS （Dynamic DNS), 熟悉 DNS 的小伙伴都知道 DNS 是将域名转为 IP 地址的服务，直接复习下</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"> DDNS（动态域名系统）和DNS（域名系统）是两个相关但不同的概念。以下是它们的主要区别：
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### DNS（域名系统）
</span></span><span class="line"><span class="cl">- **全球性服务**：DNS是一个全球性的服务，它将人类易于记忆的域名转换为计算机使用的IP地址。
</span></span><span class="line"><span class="cl">- **静态解析**：传统的DNS服务通常用于静态IP地址，即域名与IP地址的映射是固定的，不会随时间变化。
</span></span><span class="line"><span class="cl">- **分布式系统**：DNS是一个分层的分布式系统，包括根服务器、顶级域名服务器、权威名称服务器和递归服务器。
</span></span><span class="line"><span class="cl">- **缓存机制**：DNS查询结果通常被缓存，以提高解析速度和减轻DNS服务器的负载。
</span></span><span class="line"><span class="cl">- **适用于静态IP**：对于拥有静态公网IP的用户或企业来说，传统的DNS服务是合适的。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### DDNS（动态域名系统）
</span></span><span class="line"><span class="cl">- **动态IP支持**：DDNS服务允许用户将一个固定的域名与动态变化的IP地址关联起来，特别适用于家庭用户和小型办公室，他们的公网IP地址可能会因为重新连接互联网而变化。
</span></span><span class="line"><span class="cl">- **自动更新**：DDNS服务会自动检测IP地址的变化，并更新DNS记录，确保域名始终指向当前的IP地址。
</span></span><span class="line"><span class="cl">- **依赖第三方服务**：DDNS服务通常由第三方提供商提供，用户需要在服务提供商的平台上注册域名，并配置DDNS服务。
</span></span><span class="line"><span class="cl">- **客户端软件**：用户通常需要在本地网络设备上安装客户端软件，该软件会监测IP地址的变化，并与DDNS服务提供商的服务器通信以更新DNS记录。
</span></span><span class="line"><span class="cl">- **适用于动态IP**：对于没有静态公网IP的用户来说，DDNS服务是必要的，以便他们能够通过一个固定的域名来访问或管理他们的网络设备。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">总结来说，DNS是一个全球性的域名解析服务，而DDNS是DNS服务的一个扩展，专门为动态IP地址提供域名解析服务。DDNS解决了动态IP地址环境下域名解析的问题，使得用户可以通过一个固定的域名来访问他们的设备，即使这些设备的IP地址可能会变化。
</span></span></code></pre></div><p>DDNS是直接将域名转化为动态 ip，这样我们配置好之后就直接能用固定的域名访问内网中的各种服务了</p>
<h2 id="三域名解析配置可选">三、域名解析配置（可选）</h2>
<h3 id="1-域名准备">1. 域名准备</h3>
<ul>
<li>购买域名</li>
<li>配置DNS服务器</li>
</ul>
<h3 id="2-ddns配置">2. DDNS配置</h3>
<ul>
<li>选择DDNS软件
<ul>
<li>DDNS-GO</li>
<li>Lucky</li>
<li>NO-IP</li>
<li>花生壳</li>
</ul>
</li>
<li>软件配置
<ul>
<li>设置域名提供商API，网上教程太多 不过多赘述，参考各个软件官方文档即可</li>
<li>配置更新间隔</li>
<li>选择需要解析的域名</li>
</ul>
</li>
<li>运行方式
<ul>
<li>物理机直接运行</li>
<li>Docker容器运行</li>
<li>路由器插件运行</li>
</ul>
</li>
</ul>
<h3 id="3-解析验证">3. 解析验证</h3>
<ul>
<li>测试域名解析是否正确</li>
</ul>
<h4 id="可能遇到的问题及解决方案-2">可能遇到的问题及解决方案</h4>
<ol>
<li>测试域名解析是否正确 =&gt;</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">❯ ping 你配置在 ddns 软件里的域名 比如
</span></span><span class="line"><span class="cl">ping nas.abcdefg.com
</span></span><span class="line"><span class="cl">PING nas.abcdefg.com (222.71.193.9): 56 data bytes
</span></span><span class="line"><span class="cl">64 bytes from 222.71.193.9: icmp_seq=0 ttl=50 time=12.410 ms
</span></span><span class="line"><span class="cl">64 bytes from 222.71.193.9: icmp_seq=1 ttl=50 time=13.020 ms
</span></span><span class="line"><span class="cl">64 bytes from 222.71.193.9: icmp_seq=2 ttl=50 time=15.120 ms
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">重复出现的 ip与自己公网 ip 一致即可
</span></span></code></pre></div><p><strong>如果在配置 ddns 之前如果都没问题，但是 ddns 解析有问题，可能需要关注下自己是否使用了相关代理软件，修改代理规则，我曾经遇到过使用 cloudflare 的 dns，同时在路由器上配置了代理，再使用 ddns 时发现 cloudflare 上的 dns 解析一直是解析到某海外 ip，排查之后发现是规则设置的问题</strong></p>
<h2 id="四测试验证">四、测试验证</h2>
<p>测试部分，不做过多数据测试，能满足自己要求即可</p>
<h3 id="1-基础连通性测试">1. 基础连通性测试</h3>
<ul>
<li>Ping测试
<ul>
<li>ping 公网IP</li>
<li>ping 域名（如果配置了域名）</li>
</ul>
</li>
<li>端口检测
<ul>
<li>使用在线端口检测工具</li>
<li>telnet测试端口连通性</li>
</ul>
</li>
</ul>
<h3 id="2-性能测试">2. 性能测试</h3>
<ul>
<li>带宽测试</li>
<li>延迟测试</li>
<li>稳定性测试</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>VScode进入报错code 9, signal null error</title>
      <link>https://blog.xiaohuangyu.space/p/vscode-code-9-error/</link>
      <pubDate>Fri, 16 Aug 2024 10:07:54 +0800</pubDate>
      <guid>https://blog.xiaohuangyu.space/p/vscode-code-9-error/</guid>
      <description>&lt;p&gt;进入 Vscode 时，出现报错&lt;br&gt;&#xA;Unable to resolve your shell environment: Unexpected exit code from spawned shell (code 9, signal null)&lt;/p&gt;&#xA;&lt;p&gt;![image.png](&lt;a href=&#34;https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408161008789.png&#34;&gt;https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408161008789.png&lt;/a&gt; =600x)&lt;/p&gt;&#xA;&lt;p&gt;查证go 和 go env  之后发现都没问题，最后注意到 ~/.bash_profile 中有这部分，确定造成报错的行是 &lt;strong&gt;export NODE_OPTIONS=&amp;ndash;openssl-legacy-provider&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#node&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/homebrew/opt/node@20/bin:$PATH&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LDFLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;-L/opt/homebrew/opt/node@20/lib:$LDFLAGS&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPPFLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;-I/opt/homebrew/opt/node@20/include:$CPPFLAGS&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NODE_OPTIONS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;openssl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;legacy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;provider&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用vi编辑或者是使用其他文本编辑器打开 .bash_profile 文件&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>进入 Vscode 时，出现报错<br>
Unable to resolve your shell environment: Unexpected exit code from spawned shell (code 9, signal null)</p>
<p>![image.png](<a href="https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408161008789.png">https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408161008789.png</a> =600x)</p>
<p>查证go 和 go env  之后发现都没问题，最后注意到 ~/.bash_profile 中有这部分，确定造成报错的行是 <strong>export NODE_OPTIONS=&ndash;openssl-legacy-provider</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="c1">#node</span>
</span></span><span class="line"><span class="cl"><span class="k">export</span> <span class="n">PATH</span><span class="o">=</span><span class="s2">&#34;/opt/homebrew/opt/node@20/bin:$PATH&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">export</span> <span class="n">LDFLAGS</span><span class="o">=</span><span class="s2">&#34;-L/opt/homebrew/opt/node@20/lib:$LDFLAGS&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">export</span> <span class="n">CPPFLAGS</span><span class="o">=</span><span class="s2">&#34;-I/opt/homebrew/opt/node@20/include:$CPPFLAGS&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">export</span> <span class="n">NODE_OPTIONS</span><span class="o">=--</span><span class="n">openssl</span><span class="o">-</span><span class="n">legacy</span><span class="o">-</span><span class="n">provider</span>
</span></span></code></pre></div><p>使用vi编辑或者是使用其他文本编辑器打开 .bash_profile 文件</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">vi</span> <span class="o">~/.</span><span class="n">bash_profile</span>
</span></span><span class="line"><span class="cl"><span class="err">按</span><span class="n">i进入编辑模式</span>
</span></span><span class="line"><span class="cl"><span class="err">找到</span><span class="k">export</span> <span class="n">NODE_OPTIONS</span><span class="o">=--</span><span class="n">openssl</span><span class="o">-</span><span class="n">legacy</span><span class="o">-</span><span class="n">provider</span> <span class="err">所在行</span>
</span></span><span class="line"><span class="cl"><span class="err">在</span> <span class="k">export</span> <span class="n">NODE_OPTIONS</span><span class="o">=--</span><span class="n">openssl</span><span class="o">-</span><span class="n">legacy</span><span class="o">-</span><span class="n">provider</span> <span class="err">前加</span><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="err">最后那行变成</span>
</span></span><span class="line"><span class="cl"><span class="c1">#export NODE_OPTIONS=--openssl-legacy-provider</span>
</span></span><span class="line"><span class="cl"><span class="err">再按</span> <span class="n">esc</span> <span class="err">退出编辑模式</span>
</span></span><span class="line"><span class="cl"><span class="p">:</span><span class="n">wq</span><span class="o">!</span> 
</span></span><span class="line"><span class="cl"><span class="err">然后回车</span>
</span></span></code></pre></div><p>如果不会使用 vi 可以直接终端执行</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">cd $HOME &amp; open .
</span></span></code></pre></div><p>然后用喜欢的文本编辑器打开.bash_profile 更改所在行</p>
<p><img loading="lazy" src="https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202409101100157.png" alt="image.png"  />
</p>
<p>将NODE_OPTIONS 注释掉后，重新进入 VScode 解决</p>
]]></content:encoded>
    </item>
    <item>
      <title>大善人 AI 食用指南</title>
      <link>https://blog.xiaohuangyu.space/p/cloudflare-worker-ai/</link>
      <pubDate>Mon, 12 Aug 2024 14:24:33 +0800</pubDate>
      <guid>https://blog.xiaohuangyu.space/p/cloudflare-worker-ai/</guid>
      <description>&lt;p&gt;大善人 AI 食用指南&lt;/p&gt;&#xA;&lt;p&gt;登录之后，打开&#xA;&lt;a href=&#34;https://dash.cloudflare.com/&#34;&gt;https://dash.cloudflare.com/&lt;/a&gt; ,保存/之后的字符串为 accountId&lt;/p&gt;&#xA;&lt;p&gt;再打开&#xA;&lt;a href=&#34;https://dash.cloudflare.com/profile/api-tokens&#34;&gt;https://dash.cloudflare.com/profile/api-tokens&lt;/a&gt;&#xA;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408121425957.png&#34; alt=&#34;image.png&#34;  /&gt;&#xA;&#xA;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408121427156.png&#34; alt=&#34;image.png&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;这一步完成后会看到如下图，保存好自己的 Workers AI API token&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 用户 API 令牌&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#### Workers AI API 令牌已成功创建&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;复制此令牌以访问 Cloudflare API。为安全起见，将不再显示此令牌。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后去 one-api 添加新渠道&#xA;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408121433758.png&#34; alt=&#34;image.png&#34;  /&gt;&#xA;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>大善人 AI 食用指南</p>
<p>登录之后，打开
<a href="https://dash.cloudflare.com/">https://dash.cloudflare.com/</a> ,保存/之后的字符串为 accountId</p>
<p>再打开
<a href="https://dash.cloudflare.com/profile/api-tokens">https://dash.cloudflare.com/profile/api-tokens</a>
<img loading="lazy" src="https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408121425957.png" alt="image.png"  />

<img loading="lazy" src="https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408121427156.png" alt="image.png"  />
</p>
<p>这一步完成后会看到如下图，保存好自己的 Workers AI API token</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># 用户 API 令牌
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#### Workers AI API 令牌已成功创建
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">复制此令牌以访问 Cloudflare API。为安全起见，将不再显示此令牌。
</span></span></code></pre></div><p>然后去 one-api 添加新渠道
<img loading="lazy" src="https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408121433758.png" alt="image.png"  />
</p>
<p>添加完成后即可进行测试，后续可以再 next-chatgpt中直接使用
<img loading="lazy" src="https://cdn.jsdelivr.net/gh/eatmoreduck/picture-repository/blog/202408121436437.png" alt="image.png"  />
</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
