<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://blog.naivetomcat.cn/atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
  <id>https://blog.naivetomcat.cn/</id>
  <title>NaiveTomcat&amp;apos;s Blog</title>
  <subtitle>Blog of NaiveTomcat</subtitle>
  <updated>2026-02-25T19:05:36.778Z</updated>
  <generator>vuepress-plugin-feed2</generator>
  <link rel="self" href="https://blog.naivetomcat.cn/atom.xml"/>
  <link rel="alternate" href="https://blog.naivetomcat.cn/"/>
  <category term="开发"/>
  <category term="随笔"/>
  <category term="网络"/>
  <category term="杂谈"/>
  <entry>
    <title type="text">再论类原生系统上的Mifare Classic UID模拟</title>
    <id>https://blog.naivetomcat.cn/pages/b0ee24/</id>
    <link href="https://blog.naivetomcat.cn/pages/b0ee24/"/>
    <updated>2026-02-25T18:53:02.000Z</updated>
    <summary type="html"><![CDATA[<h2> 前言</h2>
<p>2024年底，我写了一篇关于在类原生系统上实现Mifare Classic卡UID模拟的<a href="/pages/9a7f60/" target="blank">文章</a>。但是现在尝试重新实现时发现，之前的方法实际上是存在问题的。当时也出现了问题，但是使用软件“NFC卡模拟”生成Magisk模块并刷入之后，问题得到了解决。实际上是我对于<code>libnfc-nxp.conf</code>和<code>libnfc-nci.conf</code>的理解有误，导致手机NFC协议栈按照前述办法修改之后无法正确启动。本文记录了我对于之前方法的修正以及正确的实现方法。</p>]]></summary>
    <content type="html"><![CDATA[<h2> 前言</h2>
<p>2024年底，我写了一篇关于在类原生系统上实现Mifare Classic卡UID模拟的<a href="/pages/9a7f60/" target="blank">文章</a>。但是现在尝试重新实现时发现，之前的方法实际上是存在问题的。当时也出现了问题，但是使用软件“NFC卡模拟”生成Magisk模块并刷入之后，问题得到了解决。实际上是我对于<code>libnfc-nxp.conf</code>和<code>libnfc-nci.conf</code>的理解有误，导致手机NFC协议栈按照前述办法修改之后无法正确启动。本文记录了我对于之前方法的修正以及正确的实现方法。</p>
<h2> NCI指令载荷长度修改</h2>
<p>之前的做法是直接将设置UID的指令追加到相应的配置项中。但是NCI指令头部包含预期载荷长度和预期指令数量，因此直接填充指令会导致协议栈无法正确解析指令，进而无法启动。</p>
<p>NCI指令的第三个字节是从此之后开始数的载荷长度，第四个字节是从此之后开始数的指令数量。因此在追加指令时，需要同时修改这两个字节以反映新增指令的长度和数量。</p>
<p>对于四字节UID的设置指令<code>33,04,1A,2B,3C,4D</code>，载荷长度为6（即指令本身的长度），指令数量为1（即新增的指令数量）。因此对于<code>NXP_NFC_PROFILE_EXTN</code>，通常原始指令为<code>20,02,05,01,A0,44,01,00</code>，我们修改为<code>20,02,0B,02,A0,44,01,00,33,04,1A,2B,3C,4D</code>。</p>
<p>对于<code>NXP_CORE_CONF</code>，因为通常原始指令已经有<code>33,00</code>的设置，我们只是修改这一条指令的载荷为4字节。因此将<code>33,00</code>修改为<code>33,04,1A,2B,3C,4D</code>，并且指令头部的载荷长度增加4即可。</p>
<h2> 默认路由配置</h2>
<p>另外，还需要修改默认协议路由。原始配置通常为eSE或UICC，修改为路由到Host即可。具体见下：</p>
<div class="language-conf line-numbers-mode" data-ext="conf"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2> 其余配置</h2>
<p><code>NXP_CHECK_DEFAULT_PROTO_SE_ID</code>和<code>libnxp-nci.conf</code>中的<code>NXP_PRFD_TECH_SE</code>也要修改为<code>0x00</code>。</p>
<h2> 其余Quirks</h2>
<p>如果配置文件没有变化的情况下重启了NFC服务，在我的设备上，会导致NFC回退至动态UID模式。不知具体原因，当前workaround是切换卡片时先写一个无效的UID（如<code>00:00:00:00</code>）再写入目标UID。</p>
]]></content>
    <category term="开发"/>
    <published>2026-02-25T23:30:00.000Z</published>
  </entry>
  <entry>
    <title type="text">2025年年度总结</title>
    <id>https://blog.naivetomcat.cn/pages/7647ee/</id>
    <link href="https://blog.naivetomcat.cn/pages/7647ee/"/>
    <updated>2026-01-03T15:16:20.000Z</updated>
    <summary type="html"><![CDATA[<h2> 前言</h2>
<p>今天突然想到把博客从Cloudflare Pages迁移到Tencent EdgeOne上来，然后看到上一条Post还是24年年底发布的。很不幸地，这说明，我2025年一条博客都没写。。。</p>
<p>所以今天想起来了，就大致写写2025年我都做了些什么吧（虽然我也不太记得了）。。。</p>
<h2> 业余无线电</h2>
<p>2024年年底考取了A类业余无线电台操作证，2025年年初获批了业余无线电台执照，呼号BI9CCY。到目前为止主要进行过UHF频段的FM话音通联，在上半年有过本地直频通联和中继通联，以及不成功的卫星通联尝试。同时也进行过VHF上的Packet Radio通信实验（指APRS）。博客站内也开设了<a href="/station_log/" target="blank">业余无线电通联日志</a>页面，但是很多随机的通联并没有更新上去。同时下半年在苏州，住处打不开中继，尝试UHF直频CQ但是并没有人理我，因此也没有什么新的通联记录。</p>]]></summary>
    <content type="html"><![CDATA[<h2> 前言</h2>
<p>今天突然想到把博客从Cloudflare Pages迁移到Tencent EdgeOne上来，然后看到上一条Post还是24年年底发布的。很不幸地，这说明，我2025年一条博客都没写。。。</p>
<p>所以今天想起来了，就大致写写2025年我都做了些什么吧（虽然我也不太记得了）。。。</p>
<h2> 业余无线电</h2>
<p>2024年年底考取了A类业余无线电台操作证，2025年年初获批了业余无线电台执照，呼号BI9CCY。到目前为止主要进行过UHF频段的FM话音通联，在上半年有过本地直频通联和中继通联，以及不成功的卫星通联尝试。同时也进行过VHF上的Packet Radio通信实验（指APRS）。博客站内也开设了<a href="/station_log/" target="blank">业余无线电通联日志</a>页面，但是很多随机的通联并没有更新上去。同时下半年在苏州，住处打不开中继，尝试UHF直频CQ但是并没有人理我，因此也没有什么新的通联记录。</p>
<p>同时开了一波不成功的<a href="https://www.kv4p.com/" target="_blank" rel="noopener noreferrer">kv4p HT</a>的车，发现我并不是一个合格的人肉贴片机。同时为它的软件做了<a href="https://github.com/VanceVagell/kv4p-ht/pull/257" target="_blank" rel="noopener noreferrer">一些汉化工作</a>。不过现在看到电商平台上已经有很多卖kv4p HT的了，大概我的汉化为它的普及起到了一定作用吧（</p>
<h2> 工作</h2>
<p>下半年在<a href="https://seysoai.com/" target="_blank" rel="noopener noreferrer">睿首智能</a>工作了半年，主要在做AI模型的部署和优化相关的工作，以及基础设施建设运维和硬件相关的工作。接触到了实际生产环境，学习到了在学校里学不到的知识和经验。也算是一个不错的经历吧。</p>
<h2> 其他</h2>
<p>年底去了腾讯轻量云的MeetUp，发现腾讯云原来最近上了好多神奇服务。于是考虑把博客迁回境内平台，因为大陆访问CloudFlare实在太慢了。CloudFlare Pages那边的部署依然保留着，希望EO不会出问题，如果出问题了再把CNAME改回CF那边吧（</p>
]]></content>
    <category term="开发"/>
    <published>2026-01-03T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">加入DN42网络的简明教程</title>
    <id>https://blog.naivetomcat.cn/pages/9882a3/</id>
    <link href="https://blog.naivetomcat.cn/pages/9882a3/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<h2> DN42是什么</h2>
<p>DN42 全称 Decentralized Network 42（42 号去中心网络），是一个大型、去中心化的 VPN 网络。但是与其它传统 VPN 不同的是，DN42 本身不提供 VPN 出口服务，即不提供规避网络审查、流媒体解锁等类似服务。相反，DN42 的目的是模拟一个互联网。它使用了大量在目前互联网骨干上应用的技术（例如 BGP 和递归 DNS），可以很好地模拟一个真实的网络环境。</p>
<p>简而言之，DN42：</p>
<ul>
<li>不适合单纯想要保护隐私、规避网络审查的用户</li>
<li>不适合在网内消耗大量流量，例如用于解锁流媒体服务的用户</li>
<li>适合想要研究网络技术，练习服务器、路由器等网络设备配置，甚至后续在真实互联网建立 AS 的用户</li>
<li>适合拥有真实 AS，但担心自己配置错误广播出错误路由、干掉半个互联网，希望有个地方测试的用户。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[<h2> DN42是什么</h2>
<p>DN42 全称 Decentralized Network 42（42 号去中心网络），是一个大型、去中心化的 VPN 网络。但是与其它传统 VPN 不同的是，DN42 本身不提供 VPN 出口服务，即不提供规避网络审查、流媒体解锁等类似服务。相反，DN42 的目的是模拟一个互联网。它使用了大量在目前互联网骨干上应用的技术（例如 BGP 和递归 DNS），可以很好地模拟一个真实的网络环境。</p>
<p>简而言之，DN42：</p>
<ul>
<li>不适合单纯想要保护隐私、规避网络审查的用户</li>
<li>不适合在网内消耗大量流量，例如用于解锁流媒体服务的用户</li>
<li>适合想要研究网络技术，练习服务器、路由器等网络设备配置，甚至后续在真实互联网建立 AS 的用户</li>
<li>适合拥有真实 AS，但担心自己配置错误广播出错误路由、干掉半个互联网，希望有个地方测试的用户。</li>
</ul>
<p>正因为此，使用 DN42 的门槛比较高。就像在真实互联网中一样，你要扮演一个 ISP（互联网服务提供商），注册自己的个人信息，ASN 号码，IPv4 和 IPv6 的地址池，并且使用 BGP 在自己的服务器上广播它们。你还要和其它的用户联系，和他们做 Peering（对接），一步步进入完整的 DN42 网络。</p>
<p>DN42 在 172.20.0.0/14 和 fd00::/8 上运行，而这两个 IP 段都是分配给内网使用的。换句话说，你在 DN42 上怎么折腾，都不会影响到服务器其它的互联网连接。</p>
<h2> 加入DN42网络的前置要求</h2>
<p>加入DN42网络需要您有以下的相关能力：</p>
<ul>
<li>一个长期在线的Linux机器（实体机、虚拟机、VPS甚至路由器都行）</li>
<li>使用Linux的能力，会装包会用编辑器就行</li>
<li>会用Git（会Clone，Pull，Push，Commit就行）</li>
<li>学过计网（其实具有一定相关知识就行，最起码得知道IP、MAC是啥，知道交换机和路由器都是干啥的，会ping/traceroute）</li>
<li>能读得懂英文（或者会用翻译软件）</li>
</ul>
<p>如果您不具备上述能力，您可能在配置过程中出现问题，给DN42中的其他用户带来麻烦。</p>
<h2> 如何注册DN42的AS</h2>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>DN42的注册过程比较繁琐，可能需要几天（但是没有注册真实的AS那么麻烦），提交信息（发PR）之后可能会被要求修改几次，耐心配合即可。</p>
</div>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>本文信息可能随DN42政策的改变而过时，请优先参考DN42的官方注册流程，此处仅为参考。</p>
<p><a href="https://dn42.dev/howto/Getting-Started" target="_blank" rel="noopener noreferrer">官方Wiki上的注册教程</a></p>
</div>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>请注意更改下面出现的文件中的信息，不要出现这种情况（当事人应该参考的lantian的教程，但是没有改信息，直接白送lantian一个路由）</p>
<figure><img src="/img/wrong_mnt.png" alt="wrong_mnt" tabindex="0" loading="lazy"><figcaption>wrong_mnt</figcaption></figure>
</div>
<p>注册流程大致如下：</p>
<ul>
<li>首先在<a href="https://git.dn42.dev" target="_blank" rel="noopener noreferrer">官方Wiki</a>上注册一个账户。有关DN42网络的所有信息都在其中的一个仓库内（dn42/registry）</li>
<li>打开<a href="https://git.dn42.dev/dn42/registry" target="_blank" rel="noopener noreferrer">dn42/registry</a>这个仓库，把它clone下来</li>
<li>新建一个分支，按照<code>[昵称]-[日期，YYYYMMDD]/[目的]</code>命名
<ul>
<li>日期按照什么时区我也不清楚，但肯定不是东八区（我在北京时间2021/05/16 07:00的时候push一个日期字段是20210516的分支被远程拒绝了）</li>
<li>新建完先push到远端，注册后需要等一段时间并在网页上登出后再次登录才有registry仓库的写权限，如果权限没下来，这时就能发现问题）</li>
</ul>
</li>
<li>在clone下来的仓库内，您新建的分支中建立以下文件：
<ul>
<li><code>data/mntner/[昵称]-MNT</code>，这个文件代表您的账户
<ul>
<li>官方提供的一系列检查/格式化的工具都是基于mntner筛选文件的</li>
<li>文件内容如下：<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>各项含义如下
<ul>
<li><code>mntner</code>即Maintainer（维护者），说明这个账户的名称，与文件名相同</li>
<li><code>admin-c</code>即admin contact（管理员联系信息），指向后续创建的<code>person</code>对象</li>
<li><code>tech-c</code>即tech contact（技术员联系信息），也需要指向后续创建的<code>person</code>对象</li>
<li><code>mnt-by</code>即maintain by（由谁维护），指向这个账户本身</li>
<li><code>source</code>固定为<code>DN42</code></li>
<li><code>auth</code>为您的个人认证信息，接受两种类型：GPG公钥和SSH公钥
<ul>
<li>您必须至少选择一种（我推荐GPG公钥，因为签名和认证都方便）</li>
<li>您还需要将您的GPG公钥上传至公开查询服务器，可以参考<a href="https://www.ruanyifeng.com/blog/2013/07/gpg.html" target="_blank" rel="noopener noreferrer">阮一峰的这个教程</a></li>
<li>最好可以再上传到官方的git服务器上与您的账户绑定</li>
<li>阅读官方的<a href="https://dn42.dev/howto/Registry-Authentication" target="_blank" rel="noopener noreferrer">身份认证Wiki页面</a>获取更多信息</li>
</ul>
</li>
<li><code>remarks</code>为注释，可选，可出现多次</li>
</ul>
</li>
<li>注意，您填写的位置从第21列开始。中间的空格不能省略或用制表符替换。
<ul>
<li>格式问题可通过<code>fmt-my-stuff</code>这个脚本进行修复</li>
</ul>
</li>
</ul>
</li>
<li><code>data/person/[昵称]-DN42</code>
<ul>
<li>代表个人联系信息</li>
<li>文件内容如下<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ul>
</li>
<li>接下来您需要选择一个未被占用的AS编号，即ASN。DN42在私有ASN范围内选取了一块用作其内部AS的ASN，您可以在<code>4242420000</code>-<code>4242423999</code>这4000个ASN中选取未被占用的，<strong>注意范围是4000个不是10000个</strong>，然后创建 <code>/data/aut-num/[您选的ASN]</code>
<ul>
<li>文件内容如下<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ul>
</li>
<li>接下来就需要选择IP并建立<code>data/inetnum/[IP块CIDR,将/换成_]</code>
<ul>
<li>选择<code>172.20.0.0/14</code>范围内未被占用的IP段。注意：您在DN42中最小能够申请/29的块，一般建议申请/27，能够直接申请的最大地址块是/26</li>
<li>DN42 内的 IPv4 地址与公网的 IPv4 地址同样珍贵</li>
<li>如果您要接入的设备<strong>非常多（指超过62台）</strong>，那么/26是不够用的，你需要去IRC频道（可以在Wiki上找到）或邮件组告诉大家您的理由，请求投票同意</li>
<li>文件内容如下<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ul>
</li>
<li>还需要给您的IP地址块建立路由对象<code>data/route/[IP块CIDR,将/换成_]</code>
<ul>
<li>表示授权某个AS使用这个地址段使用这个地址段</li>
<li>文件内容如下<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ul>
</li>
<li>鉴于现在是2021年，建议您再在<code>/data/inet6num/</code>和<code>/data/route6/</code>文件夹内建立IPv6地址块的相关文件，内容参考上面IPv4的相关文件
<ul>
<li>IPv6地址在<code>fd00::/8</code>内</li>
<li>DN42内IPv6地址块一般以/48存在，一般一个AS只允许注册一个/48</li>
<li>非常不建议自定义IPv6地址前缀
<ul>
<li>首先这个做法是违反RFC4193 section 3.2的</li>
<li>其次，DN42和一些类似性质的网络建立了互联关系，因为拿不到这些网络的registry信息，并且都用的是IPv6 ULA地址（即<code>fd00::8</code>），您自己选的前缀可能会和别人的冲突</li>
<li>注意：一旦和别人冲突，您（也就是后注册的）可能需要修改整个网络的IPv6地址
<ul>
<li>
<blockquote>
<p>Renumbering really isn't fun</p>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>现在，您建立完了所有需要的文件，首先在仓库根目录运行<code>./fmt-my-stuff 你的mntner名字</code>格式化您的所有文件</li>
<li>然后<code>git add .</code>和<code>git commit -S</code>来签名commit您的更改</li>
<li>如果您已经commit了多次，注意DN42的PR只接受单个commit，所以需要运行<code>./squash-my-commits -S</code>来扁平化您的commit</li>
<li>执行<code>git push -f</code>将更改推送至服务器，然后去网页上创建PR
<ul>
<li>一次注册/信息修改只用发一个PR</li>
<li>如果被要求修改，改完并squash了之后直接<code>git push -f</code>就行，<strong>不用关闭并开新的PR</strong></li>
<li>发PR用英文（但是最近有位国人成为了维护者，如果您实在不懂英文您也可以用中文回复，但是不推荐，因为外国人看不懂）</li>
</ul>
</li>
</ul>
<p>在您的PR被合并之后，您就拥有了自己的AS和地址块，接下来就可以去找人Peer了</p>
<h2> 如何与别人Peer</h2>
<h3> 寻找Peer的节点</h3>
<p>DN42是一个去中心化的网络，因此并没有一个中央路由可以让你直接接入，相反，你需要寻找其他DN42上的节点，建立隧道连接和BGP会话，从而建立Peering关系</p>
<p>您可以</p>
<ul>
<li>使用<a href="https://dn42.us/peers" target="_blank" rel="noopener noreferrer">DN42 Peerfinder</a></li>
<li>直接去DN42的<a href="https://wiki.dn42.us/services/IRC" target="_blank" rel="noopener noreferrer">IRC频道</a></li>
<li>去这个<a href="https://t.me/Dn42Chat" target="_blank" rel="noopener noreferrer">非官方的tg群</a></li>
</ul>
<p>找人peer，或者直接<a href="/dn42/" target="blank">找我</a></p>
<p>注意，您可以（并且建议）找多人进行peer，以降低网络中心度增加网络稳定性。</p>
<p>找几个离你节点近延迟小的节点（国内节点就找国内的就行了，不强求延迟了🤣），然后看下面</p>
<h3> 重要的系统配置</h3>
<p>根据DN42 Wiki:</p>
<blockquote>
<p>The first rule of dn42: Always disable <code>rp_filter</code>.</p>
<p>The second rule of dn42: Always disable <code>rp_filter</code>.</p>
<p>The third rule of dn42: Allow ip forwarding!</p>
</blockquote>
<p><strong>一定关掉<code>rp_filter</code>并开启IP forwarding</strong>，具体执行下面的代码：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>然后<strong>一定</strong>关掉UFW之类的自动配置iptables的东西，以免出现玄学问题</p>
<h3> 选择隧道软件</h3>
<p>节点之间一般是没有网线直接拉上的，所以互联基本上就要依靠隧道了。现在DN42社区一般喜欢使用WireGuard和OpenVPN，我也倾向于使用WireGuard。</p>
<p>WireGuard一般配置点对点连接，配置很简单，资源占用少，安全性也不错，但是需要内核模块支持。我一般是这么配置WireGuard隧道的：</p>
<div class="language-toml line-numbers-mode" data-ext="toml"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>然后直接用<code>wg-quick</code>启动隧道就建立了互联。</p>
<p>注意一定要加<code>Table = off</code>，否则<code>wg-quick</code>会给<code>AllowedIPs</code>加上路由，鉴于它是0.0.0.0，意味着你把所有的流量都路由给了对端，而对端大概率不会给你转发，然后你的网就炸掉了。往外连的路由表应该用BGP管理，所以这里不需要帮你添加</p>
<h3> 选择BGP软件</h3>
<p>我也只用过Bird，而且DN42 Wiki上面也有Bird的配置文件可以直接抄，所以我推荐Bird。</p>
<p>当然，还有别的可以用，但是我没用过，不做推荐</p>
<p>注意：现在Ubuntu的官方仓库中的Bird2是2.0.7版本的，但是Bird官方的ppa上面已经发布了2.0.8的deb包。我推荐2.0.8，因为加入了extended multi hop的支持。</p>
<h3> 内网配置</h3>
<p>我建议用wg等隧道软件在每两个节点之间建立一条点对点隧道，即每个节点都能直接连接到其余所有节点，配静态路由。有不需要跑BGP的叶子节点（比如不做peer的家里路由器）的时候，只需把给它的IP的路由设到它的上游节点就行了。OSPF没配懂（而且容易出锅），所以不做说明。</p>
<h3> 进行Peer</h3>
<p>BGP软件配好了，内网也配好了，现在就可以开始做Peer了。（当然，你应该先测测内网通不通）</p>
<h4> 隧道搭建</h4>
<p>按照我上面的配置，配好WG连接就行了。注意最好加上<code>PersistentKeepalive = true</code>，以进行UDP保活。（注意开防火墙端口）</p>
<h4> BGP会话配置</h4>
<p>一般来说照着DN42 Wiki上的教程抄就行了。根据需要加上<code>extended next hop</code>的支持。现在一般喜欢MP-BGP over link-local，双方商量好就行。</p>
<p>可以去<a href="https://t.me/Dn42Chat" target="_blank" rel="noopener noreferrer">非官方的tg群</a>寻求帮助。</p>
<h2> 接入完成</h2>
<p>完成上述操作之后，您就成功的接入了DN42网络。您可以<s>开始愉快的Ping了</s>（其实DN42里面也有不少服务的）。您可以接着申请域名、搭建权威DNS服务器和DNS反查服务器，在DN42里面搭建博客或者整活了🤔<img src="/img/mo.png" alt="膜" loading="lazy"></p>
<p>完。</p>
]]></content>
    <category term="开发"/>
    <published>2021-05-17T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">AloLang Docker镜像使用方法</title>
    <id>https://blog.naivetomcat.cn/pages/3cbd5f/</id>
    <link href="https://blog.naivetomcat.cn/pages/3cbd5f/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<h2> AloLang Docker镜像是什么</h2>
<p>早在2020年的7月，我发起了一项程序语言项目，后来命名为AloLang。截至目前，该项目定义了一个新的计算机语言并初步实现了其编译器（<code>aloc</code>）和标准库（<code>libalolangcore</code>）。编译器目前仅支持64位Little Endian Unix-like系统，且仅在Linux上（包含<code>Arch Linux</code>、<code>Ubuntu 18.04</code>、<code>Ubuntu 20.04</code>、<code>Fedora 33</code>和<code>Android 10</code>）测试过。并且，由于各发行版上的依赖管理区别较大，目前我们只提供了<code>Arch Linux</code>上的<code>PKGBUIlD</code>一种包管理构建方案，在其余系统上需要自行解决依赖问题，并可能还需要处理类似<code>Ubuntu</code>上<code>LLVM</code>打包问题所导致的依赖路径问题，最后使用基于<code>Autotools</code>工具链的构建工具进行构建和安装，整体较为麻烦。因此，我们提供了一个基于<code>ubuntu:latest</code>构建的包含了<code>aloc</code>及其必要依赖和alolang标准库的docker镜像，可以直接进行编译运行操作。</p>]]></summary>
    <content type="html"><![CDATA[<h2> AloLang Docker镜像是什么</h2>
<p>早在2020年的7月，我发起了一项程序语言项目，后来命名为AloLang。截至目前，该项目定义了一个新的计算机语言并初步实现了其编译器（<code>aloc</code>）和标准库（<code>libalolangcore</code>）。编译器目前仅支持64位Little Endian Unix-like系统，且仅在Linux上（包含<code>Arch Linux</code>、<code>Ubuntu 18.04</code>、<code>Ubuntu 20.04</code>、<code>Fedora 33</code>和<code>Android 10</code>）测试过。并且，由于各发行版上的依赖管理区别较大，目前我们只提供了<code>Arch Linux</code>上的<code>PKGBUIlD</code>一种包管理构建方案，在其余系统上需要自行解决依赖问题，并可能还需要处理类似<code>Ubuntu</code>上<code>LLVM</code>打包问题所导致的依赖路径问题，最后使用基于<code>Autotools</code>工具链的构建工具进行构建和安装，整体较为麻烦。因此，我们提供了一个基于<code>ubuntu:latest</code>构建的包含了<code>aloc</code>及其必要依赖和alolang标准库的docker镜像，可以直接进行编译运行操作。</p>
<h2> 如何使用AloLang Docker镜像</h2>
<h3> 如何使用Docker</h3>
<p>要使用AloLang Docker镜像，首先您需要掌握Docker的基本使用方式（主要是安装Docker和下载镜像）。如您已经有该知识，您可以直接跳往下一节。</p>
<h4> 安装Docker</h4>
<p>首先，您需要在您的系统上安装Docker。</p>
<p>如果您使用Windows系统，您可以参照<a href="https://docs.docker.com/desktop/windows/install/" target="_blank" rel="noopener noreferrer">Docker官方网站上的文档</a>进行安装。简而言之，您首先需要确保您在使用<code>Windows 10 2004</code>或更新的版本，并且在<code>程序和功能-启用或关闭Windows功能</code>中打开wsl的支持（<code>适用于Windows的Linux子系统</code>和<code>虚拟机平台</code>），然后在<a href="https://desktop.docker.com/win/stable/amd64/Docker%20Desktop%20Installer.exe" target="_blank" rel="noopener noreferrer">这里</a>下载并安装docker客户端</p>
<p><img src="/img/wsl_enable.png" alt="wsl_enable" loading="lazy">。</p>
<p>如果您使用Linux系统，您可以从您的发行版软件包仓库安装或参考Docker官方文档。您还可以从<a href="https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/" target="_blank" rel="noopener noreferrer">清华大学开源软件镜像站</a>获取安装说明。</p>
<h4> 下载Docker镜像</h4>
<p>在命令行中，使用<code>docker pull &lt;image_name&gt;</code>下载对应的镜像。</p>
<h3> 如何使用AloLang Docker镜像</h3>
<p>首先下载AloLang Docker镜像：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>完成后应该会显示：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>然后启动AloLang Docker镜像，在这一步您可以可选的将本地目录挂载进Docker容器：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>这时您应该会进入AloLang Docker镜像的<code>bash</code>命令行。</p>
<p>此时您应该能使用<code>aloc</code>命令了。这个命令是AloLang的编译器。使用方法大致为：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p><code>-o &lt;output_file&gt;</code>是可选的，如果指定了这个命令，则生成的可执行文件的名称将会为您指定的<code>&lt;output_file&gt;</code>参数，否则将会为<code>a.out</code>。</p>
<h2> 使用示例</h2>
<p>假设您已经下载并启动了AloLang的Docker镜像，您应该会在这样一个<code>bash</code>界面里：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>让我们切换到家目录（以防止将根目录弄乱）</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>我们现在可以写个简单的程序（镜像内置<code>vim</code>编辑器）</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>然后按下键盘上的<code>i</code>键进入编辑模式，在文件中输入一个简单的<code>Hello, world!</code>小程序</p>
<div class="language-alo line-numbers-mode" data-ext="alo"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>按下键盘上的<code>ESC</code>键，并输入<code>:wq</code>并回车，以保存并退出。运行ls</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>运行<code>aloc</code>进行编译</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><details class="hint-container details"><summary>输出较长，故折叠</summary>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></details>
<p>此时ls，可以发现生成了可执行文件<code>a.out</code>、LLVM IR可读文件<code>test.alo.ll</code>、LLVM IR字节码文件<code>test.alo.bc</code>和汇编文件<code>test.alo.s</code></p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>运行<code>a.out</code>，得到预期输出</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <category term="开发"/>
    <published>2021-09-13T20:20:00.000Z</published>
  </entry>
  <entry>
    <title type="text">博客的再次迁移</title>
    <id>https://blog.naivetomcat.cn/posts/blog_migrate_2023.html</id>
    <link href="https://blog.naivetomcat.cn/posts/blog_migrate_2023.html"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<p>由于<code>Vuepress-Theme-Vdoing</code>仍依赖于<code>Vuepress 1.x</code>，而<code>Vuepress 2.x</code>已经发布，且原有的博客架构略有混乱，在CF Pages上部署失败。所以我决定把博客再次迁移，这次迁移的目标是<code>Vuepress 2.x</code>+<code>Vuepress-Theme-Hope</code>。</p>
<h2> 迁移后技术栈</h2>
<p>迁移后博客使用<code>Vuepress 2.x</code>和<code>Vuepress-Theme-Hope</code>的组合，使用<code>CloudFlare Pages</code>自动从GitHub仓库部署。评论系统从<code>Gitalk</code>转移至<code>Giscus</code>。</p>]]></summary>
    <content type="html"><![CDATA[<p>由于<code>Vuepress-Theme-Vdoing</code>仍依赖于<code>Vuepress 1.x</code>，而<code>Vuepress 2.x</code>已经发布，且原有的博客架构略有混乱，在CF Pages上部署失败。所以我决定把博客再次迁移，这次迁移的目标是<code>Vuepress 2.x</code>+<code>Vuepress-Theme-Hope</code>。</p>
<h2> 迁移后技术栈</h2>
<p>迁移后博客使用<code>Vuepress 2.x</code>和<code>Vuepress-Theme-Hope</code>的组合，使用<code>CloudFlare Pages</code>自动从GitHub仓库部署。评论系统从<code>Gitalk</code>转移至<code>Giscus</code>。</p>
<h2> 迁移过程</h2>
<p>首先新建一个使用<code>Vuepress-Theme-Hope</code>的项目，完成新项目的相关配置，然后将原有博客内容复制进新项目，保持原博客设置的<code>permalink</code>不变，这样就可以保证原有链接不失效。对于原有的Front Matter等不兼容项使用正则表达式进行相应替换，友链页手动重做。本地验证后部署至CloudFlare Pages。</p>
]]></content>
    <category term="随笔"/>
    <published>2023-08-10T12:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">DN42网络Peer信息</title>
    <id>https://blog.naivetomcat.cn/pages/0a65b4/</id>
    <link href="https://blog.naivetomcat.cn/pages/0a65b4/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<p>我已经开始接入DN42网络，目前在多个地点可以进行Peer（后续部署更多节点）</p>
<p>我的DN42 ASN：<code>4242423309</code></p>
<p>I have started to access DN42 network, currently I can peer using nodes at multiple locations<br>
(More nodes are going to be deployed)</p>
<p>My ASN in DN42: <code>4242423309</code></p>
<p>目前在洛杉矶、拉斯维加斯和CERNET西北网机房有节点部署。注意，我不接受中国大陆地区的跨境peer。</p>]]></summary>
    <content type="html"><![CDATA[<p>我已经开始接入DN42网络，目前在多个地点可以进行Peer（后续部署更多节点）</p>
<p>我的DN42 ASN：<code>4242423309</code></p>
<p>I have started to access DN42 network, currently I can peer using nodes at multiple locations<br>
(More nodes are going to be deployed)</p>
<p>My ASN in DN42: <code>4242423309</code></p>
<p>目前在洛杉矶、拉斯维加斯和CERNET西北网机房有节点部署。注意，我不接受中国大陆地区的跨境peer。</p>
<p>如您想与我Peer，请联系tomdang@naivetomcat.cn tomdang@tsinghuamakerxian.cn或在telegram上联系@naivetomcat。<br>
请附上您希望接入的您的节点的公网地址（可选）、DN42地址、您在DN42中的ASN和wireguard公钥</p>
<p>If you want to peer with me, just send an email to <a href="mailto:tomdang@naivetomcat.cn">tomdang@naivetomcat.cn</a> <a href="mailto:tomdang@tsinghuamakerxian.cn">tomdang@tsinghuamakerxian.cn</a><br>
or contact me at telegram @naivetomcat. Please send your node's clearnet IP address (or FQDN), DN42 IP<br>
address, your ASN at DN42 and your wireguard pubkey</p>
<p>我也同时部署了<code>bird-lg-go</code>，可以查看各个节点的BGP会话信息。请访问<a href="https://lg-dn42.tsinghuamakerxian.cn/" target="_blank" rel="noopener noreferrer">https://lg-dn42.tsinghuamakerxian.cn/</a></p>
<p>I have deployed <code>bird-lg-go</code> as well, to monitor BGP sessions on each nodes. Please visit <a href="https://lg-dn42.tsinghuamakerxian.cn/" target="_blank" rel="noopener noreferrer">https://lg-dn42.tsinghuamakerxian.cn/</a></p>
<p>相关Peer信息如下<br>
My informations are as followed</p>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>本文信息已过时，仅作存档作用。最新信息请参考<a href="/dn42/" target="blank">DN42网络Peer信息</a></p>
</div>
<h2> 洛杉矶机房 Los Angelas</h2>
<p>Clearnet Host: <code>lax.tsinghuamakerxian.cn</code></p>
<p>Clearnet IPv4: <code>63.210.148.116</code></p>
<p>Clearnet IPv6: <code>2001:19f0:6001:424c:5400:3ff:fe37:9948</code></p>
<p>DN42 IPv4: <code>172.23.163.161</code></p>
<p>DN42 IPv6: <code>fda8:6b5c:e372:abcd::</code></p>
<p>Link-Local IPv6: <code>fe80::3309</code></p>
<p>WireGuard Pubkey: <code>C9QViSndf1zga5nOoSoXXMLUWBJvEFiJDWSFCbU1Ynw=</code></p>
<p>WireGuard Port: <code>Last 5 digits of your ASN</code></p>
<h2> 拉斯维加斯机房 Las Vegas</h2>
<!--<Badge text="Recommended 推荐"> -->
<p>Clearnet Host: <code>lav.tsinghuamakerxian.cn</code></p>
<p>Clearnet IPv4: <code>209.141.49.194</code></p>
<p>Clearnet IPv6: <code>2605:6400:20:c13:e4b6:7be2:5273:c977</code></p>
<p>DN42 IPv4: <code>172.23.163.163</code></p>
<p>DN42 IPv6: <code>fda8:6b5c:e372:8888::</code></p>
<p>Link-Local IPv6: <code>fe80::3309</code></p>
<p>WireGuard Pubkey: <code>sahaUh1IbK9rZCFOl096QokESVGXV8Ko8wZ5m0dcdiY=</code></p>
<p>WireGuard Port: <code>Last 5 digits of your ASN</code></p>
<h2> 教育网西北机房 CERNET NW Node</h2>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>因防火墙限制，此节点公网IP不会响应<code>ICMP</code>和<code>TCP</code>请求</p>
</div>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>因运营商政策限制，此节点已弃用</p>
</div>
<p>Clearnet Host: <code>xjtu01.tsinghuamakerxian.cn</code></p>
<p>Clearnet IPv4: <code>58.206.101.41</code></p>
<p>Clearnet IPv6: <code>None</code></p>
<p>DN42 IPv4: <code>172.23.163.177</code></p>
<p>DN42 IPv6: <code>fda8:6b5c:e374:8888::</code></p>
<p>Link-Local IPv6: <code>fe80::3309</code></p>
<p>WireGuard Pubkey: <code>Y97LED3HwgyZ/5bWr5NDiwOmqkfohURn71iGRvS39Uo=</code></p>
<p>WireGuard Port: <code>Last 5 digits of your ASN</code></p>
]]></content>
    <category term="开发"/>
    <published>2021-05-08T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">胶片的数字化流程——平板扫描仪扫描与校色</title>
    <id>https://blog.naivetomcat.cn/pages/bfd58a/</id>
    <link href="https://blog.naivetomcat.cn/pages/bfd58a/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<h2> 背景</h2>
<p>胶片作为模拟的物理介质，在当今的影像流程中需要首先进行数字化处理。然而彩色负片由于其特殊性，在数字化处理的过程中经常容易出现问题。本文将简要介绍几种彩色负片数字化的方法以及其之间的对比。</p>
<h2> 店扫</h2>
<p>店扫，本文中指冲扫店直接扫描。常见冲扫店会使用富士SP-2000/SP-3000扫描仪对胶片进行扫描。作为专业级扫描设备，SP-3000具有较快的扫描速度，然而其扫描质量由于其内置去色罩预设的影响常常不能达到理想，容易出现偏色的情况，而且杂色噪点较多。因此店扫对于Gold 200、UltraMax 400之类非专业胶片扫描还可以接受，但对于Portra、Ektar等专业胶片则不太适用，因其无法准确复现胶片色彩，且分辨率也未能达到胶片的颗粒极限。</p>]]></summary>
    <content type="html"><![CDATA[<h2> 背景</h2>
<p>胶片作为模拟的物理介质，在当今的影像流程中需要首先进行数字化处理。然而彩色负片由于其特殊性，在数字化处理的过程中经常容易出现问题。本文将简要介绍几种彩色负片数字化的方法以及其之间的对比。</p>
<h2> 店扫</h2>
<p>店扫，本文中指冲扫店直接扫描。常见冲扫店会使用富士SP-2000/SP-3000扫描仪对胶片进行扫描。作为专业级扫描设备，SP-3000具有较快的扫描速度，然而其扫描质量由于其内置去色罩预设的影响常常不能达到理想，容易出现偏色的情况，而且杂色噪点较多。因此店扫对于Gold 200、UltraMax 400之类非专业胶片扫描还可以接受，但对于Portra、Ektar等专业胶片则不太适用，因其无法准确复现胶片色彩，且分辨率也未能达到胶片的颗粒极限。</p>
<h2> 翻拍</h2>
<p>另一种常用的胶片数字化方式是使用数码相机对胶片进行翻拍。该方法据称能达到较好的画质，但对光源以及翻拍所使用的镜头和相机要求较高。在没有数码相机的情况下此方法也难以实施。翻拍得到的是胶片负片的直接图像，仍需后期进行去色罩等校色处理。</p>
<h2> 平板扫描仪扫描</h2>
<p>于是我们就讲到了这篇文章的重点：平板扫描仪扫描。平板扫描仪使用移动的感光元件对玻璃平板上的文档进行扫描进而得到其数字化版本。由于其扫描原理，平板扫描仪的分辨率（DPI）容易做到较高。和翻拍一样的，平板扫描仪扫描出的也是胶片负片的直接图像，仍需后期进行去色罩等校色处理，但也有较为专业的软件，如SilverFast、VueScan等，能进行自动化的校色处理，且内置一些胶片型号的预设配置，能较为简单且准确的复现胶片色彩。</p>
<h3> 平板扫描仪的选择</h3>
<p>使用平板扫描仪扫描底片，首先需要选择合适的扫描仪。扫描底片所必须的条件是，扫描仪能够支持透射扫描。常见的家用一体机的扫描系统使用反射式对文档进行扫描，然而对于胶片来说，因其不能有效地向感光元件反射回正确颜色的光，只能使用透射式的扫描仪。此过程的光路和彩色放大类似，都是光源发出的光透过胶片经光学系统汇聚后到达感光元件，只是对于彩放而言感光元件是相纸，而对于扫描仪而言感光元件是CCD或CMOS。</p>
<p>另一个需要着重考虑的参数是扫描仪的分辨率，即DPI。作为参考，富士SP-3000的DPI大概为2400。由于奈奎斯特采样定律，采样频率应大于原始频率的2倍。由于笔者目前只使用过Kodak的专业彩色负片，因此以下的讨论以Kodak产品为例。对于专业彩色负片和电影胶片，Kodak Alaris发布了其调制传递函数（MTF）曲线。下图即为Portra 160的MTF曲线。其30%对比度大致对应50 Cycles/mm。因此对于类似的专业彩色负片，扫描仪的空间频率应达到其2倍以上，换算到DPI即至少2540DPI才能达到较好的效果。对于Kodak的民用彩色负片，因其MTF曲线并未发布，因此无法进行类似的分析，但考虑到其颗粒较大，使用2400DPI的扫描仪进行扫描应该也能达到可接受的效果。</p>
<figure><img src="/img/portra160mtf.png" alt="Portra 160 MTF Curve" tabindex="0" loading="lazy"><figcaption>Portra 160 MTF Curve</figcaption></figure>
<p>因此笔者综合多方因素使用了Canon Canoscan 4400F。该款扫描仪支持135胶片的投射扫描，且其光学分辨率能达到4800*9600DPI，同时其价格较为低廉。但是其扫描速度较慢，且一次只能扫描6张135底片或4张135幻灯片，因此对大量胶片进行扫描时较为麻烦。</p>
<h3> 扫描软件的选择</h3>
<p>扫描软件同样也是需要考虑的因素。对于Canon Canoscan 4400F，其官方自带的扫描软件为Canoscan Toolbox 5.0。但由于该款扫描仪已停产多年，其官方软件的兼容性存在一定问题，且软件功能也较为简陋。目前常用的扫描软件还有SilverFast和VueScan等。这两款软件均为收费软件，SilverFast SE的售价为€49，而VueScan Professional（仅有该版本支持底片透射扫描）的售价为¥400。在试用了两款软件的Demo后，笔者最终选择了SilverFast 9 SE并购买了许可证。SilverFast SE 9支持快速的低分辨率预览，同时支持自动负片色罩去除，在4400F上能达到4800DPI的扫描分辨率。同时其本地化支持较VueScan更好，且其软件界面也更加美观。</p>
<p>SilverFast SE 9支持多种文件保存格式。对于去色罩处理过的图像支持24位色深的JPEG、PNG、TIFF等格式，对于原始图像支持48位色深的TIFF和DNG格式。48位TIFF格式的图像可供后期手动去色罩校色使用，能提供较高的宽容度，而自动校色的图像则可直接用于使用。</p>
<h3> 校色流程</h3>
<p>负片直接扫描出的图像也是负片，同时由于彩色负片不同染料层的感光能力不同，因此直接反色后的颜色发青。所以需要进行去色罩校色处理。常用的校色方法如下：</p>
<ol>
<li>扫描仪自动校色。该方法使用扫描仪自带的校色功能，能够自动去色罩并校色。但由于该方法使用的是扫描仪自带的校色算法，因此其校色效果并不理想，且无法进行手动调整。</li>
<li>扫描软件自动校色。该方法使用扫描软件自带的校色功能，能够自动去色罩并校色。扫描软件通常自带多种不同型号胶片的预设参数，且有一定手动调整空间，在效率和效果之间有较好的平衡。</li>
<li>手动校色。该方法使用扫描得到的原始图像在Photoshop等软件中进行处理，能够获得较好的校色效果，但需要较多的时间和精力。</li>
</ol>
<p>由于前两种方式自动化程度较高，此处不再赘述。笔者手动校色使用V7_FilmFact的wLog流程，下面对其进行简要介绍，具体的流程可参考其<a href="https://www.bilibili.com/video/BV1w4411n7vq/" target="_blank" rel="noopener noreferrer">视频</a>。</p>
<h4> 对数域</h4>
<p>胶片对色彩的感知和人眼一样在对数域上是线性的。目前常用的数字化图像处理工具，如Photoshop等，其处理基本都在线性域上进行。因此在手动校色时，需要将原始图像转换到对数域进行处理，完成校色后再转换回线性域，以达到正确的色彩再现效果。在Photoshop中我们可以通过查找表（LUT）对图像进行相应转换。</p>
<h4> 对数域上的色罩处理</h4>
<p>下图为Portra 160的曝光特性曲线。可以看到在双对数坐标下，三个颜色通道的曲线有很长一段线性段，且其截距和斜率都不相同。因此我们可以通过对数域下的线性的曲线操作对三个通道的曲线分别进行平移和旋转，从而达到去除色罩的效果。这一步可以通过Photoshop的曲线工具采用最大化每通道的对比度的自动方式进行处理。</p>
<figure><img src="/img/portra160cc.png" alt="Portra 160 Characteristic Curve" tabindex="0" loading="lazy"><figcaption>Portra 160 Characteristic Curve</figcaption></figure>
<h4> 转回线性域后的ACR自动处理</h4>
<p>完成对数域下的校色处理后，再使用一个LUT将其转换回线性域。转换为线性域后的图像可以使用常用数字化流程，如Adobe Camera Raw（ACR）进行后期处理。在ACR中，我们可以使用其自带的预设参数对图像进行自动处理，从而达到较好的效果。</p>
<h2> 效果对比</h2>
<p>下面对不同处理方式的效果进行对比。</p>
<h3> 细节对比</h3>
<p>Portra 160, SP-3000 VS CanoScan 4400F 手动校色</p>
<figure><img src="/img/por160comp.png" alt="Portra 160, SP-3000 VS CanoScan 4400F Manual" tabindex="0" loading="lazy"><figcaption>Portra 160, SP-3000 VS CanoScan 4400F Manual</figcaption></figure>
<h3> 色彩对比</h3>
<p>Portra 400</p>
<p>SP-3000店扫</p>
<figure><img src="/img/por400sp_small.jpg" alt="Portra 400, SP-3000" tabindex="0" loading="lazy"><figcaption>Portra 400, SP-3000</figcaption></figure>
<p>4400F，SilverFast自动校色，Portra 400 NC预设</p>
<figure><img src="/img/por400sf_small.jpg" alt="Portra 400, 4400F" tabindex="0" loading="lazy"><figcaption>Portra 400, 4400F</figcaption></figure>
<p>4400F，手动校色流程</p>
<figure><img src="/img/por400man_small.jpg" alt="Portra 400, 4400F Manual" tabindex="0" loading="lazy"><figcaption>Portra 400, 4400F Manual</figcaption></figure>
]]></content>
    <category term="随笔"/>
    <published>2023-04-20T22:07:16.000Z</published>
  </entry>
  <entry>
    <title type="text">使用PowerDNS搭建全球分地区DNS解析服务</title>
    <id>https://blog.naivetomcat.cn/pages/33420f/</id>
    <link href="https://blog.naivetomcat.cn/pages/33420f/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<h2> 介绍</h2>
<p>当网络中提供相同服务的服务器分布在不同的地区时，为了提高用户访问速度，需要将用户的请求转发到最近的服务器上。如果不使用开销（资金开销）很大的Anycast技术，就需要一个全球分地区的DNS解析服务，将用户的请求转发到最近的服务器上。</p>
<p>PowerDNS是一个开源的DNS服务器实现，支持权威名称服务器的搭建。配有多种存储后端，如Bind、gmysql等，辅以DNS的AXFR进行Master-Slave同步，可以方便的搭建全球多节点DNS权威服务器。同时配合PowerDNS的Lua Record和geoip后端，可以实现基于请求者IP进行区分的DNS应答。</p>]]></summary>
    <content type="html"><![CDATA[<h2> 介绍</h2>
<p>当网络中提供相同服务的服务器分布在不同的地区时，为了提高用户访问速度，需要将用户的请求转发到最近的服务器上。如果不使用开销（资金开销）很大的Anycast技术，就需要一个全球分地区的DNS解析服务，将用户的请求转发到最近的服务器上。</p>
<p>PowerDNS是一个开源的DNS服务器实现，支持权威名称服务器的搭建。配有多种存储后端，如Bind、gmysql等，辅以DNS的AXFR进行Master-Slave同步，可以方便的搭建全球多节点DNS权威服务器。同时配合PowerDNS的Lua Record和geoip后端，可以实现基于请求者IP进行区分的DNS应答。</p>
<p>同时，PowerDNS还有诸如PowerDNS Admin等管理面板，可以实现方便的DNS管理。</p>
<h2> 全球多节点DNS权威服务器搭建</h2>
<h3> 安装PowerDNS</h3>
<p>PowerDNS的安装较为简便，提供了各大发行版的安装包，可以直接使用包管理器进行安装。需要注意，发行版官方仓库的PowerDNS版本通常较老，建议使用PowerDNS仓库进行安装。具体安装流程可在<a href="https://doc.powerdns.com/authoritative/installation.html" target="_blank" rel="noopener noreferrer">这里</a>查看。</p>
<p>此处需要安装<code>pdns-server</code>、<code>pdns-backend-geoip</code>和对应所需的存储后端。</p>
<h3> 安装GeoIP数据库</h3>
<p>PowerDNS的geoip后端需要使用GeoIP数据库，建议使用<code>geoipupdate</code>进行更新。GeoIP数据库的下载地址为<a href="https://dev.maxmind.com/geoip/geoip2/geolite2/" target="_blank" rel="noopener noreferrer">这里</a>，需要注册账号后才能下载。</p>
<h3> 配置PowerDNS</h3>
<p>在主服务器上配置Master支持：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>从服务器使用Bind后端。</p>
<p>在从服务器上配置Slave支持：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>创建和主服务器同步的zone：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在所有服务器上配置GeoIP后端：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>在所有服务器上配置Lua Record：</p>
<p>如对所有DNS Zone启用Lua Record则：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>否则对指定的DNS Zone修改其metadata启用Lua Record。</p>
<h2> Lua记录设置</h2>
<h3> Lua记录基本语法</h3>
<p>PowerDNS使用<code>LUA</code>作为<code>record type</code>标志该条记录为LUA记录。记录的<code>record data</code>为：<code>[TYPE] [Lua Script]</code>，其中<code>TYPE</code>为该条记录的类型，<code>Lua Script</code>为LUA脚本。为简化多数情况的脚本编写，PowerDNS默认会在<code>[Lua Script]</code>前添加<code>return</code>，因此可以仅编写返回的表达式。如果要进行复杂的内容编写可在脚本前方添加<code>;</code>来禁用默认的<code>return</code>。注意返回的表达式的类型必须为字符串。</p>
<h3> 简单的Lua记录</h3>
<p>本例中，我们设置一个<code>TXT</code>记录，使<code>datetime.nteren.net</code>的<code>TXT</code>记录返回请求时间。</p>
<p>使用Lua的<code>os.date</code>函数格式化并返回当前时间字符串。</p>
<p>相对应的bind zone file为：</p>
<div class="language-bind line-numbers-mode" data-ext="bind"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h3> 基于请求IP的Lua记录</h3>
<h4> 通过<code>bestwho</code>获得请求IP</h4>
<p>PowerDNS提供了<code>bestwho</code>变量来获取客户的IP地址信息。如果递归解析器使用了EDNS Client Subnet功能，<code>bestwho</code>将返回客户端的IP地址，否则返回递归解析器的IP地址。</p>
<p>下面的zone file配置<code>whoami.nteren.net</code>的<code>A</code>记录返回请求IP的IPv4地址，<code>AAAA</code>记录返回请求IP的IPv6地址，<code>TXT</code>记录返回请求的地址和端口。</p>
<div class="language-bind line-numbers-mode" data-ext="bind"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4> 通过GeoIP获得客户端的地理位置</h4>
<p>PowerDNS的GeoIP后端为Lua Record提供了查询客户端地理位置的相关函数。<code>latlon()</code>返回客户端的经纬度，<code>latlonloc()</code>以DNS LOC记录的格式返回客户端位置信息，<code>continentCode()</code>返回客户端所在的大陆代码，<code>countryCode()</code>返回客户端的国家代码，<code>regionCode()</code>返回客户端地区代码的地区部分。</p>
<p>下面的zone file配置<code>location.nteren.net</code>的TXT记录返回客户端请求IP和地理位置信息，<code>whoami.nteren.net</code>的LOC记录返回客户端的位置信息。</p>
<div class="language-bind line-numbers-mode" data-ext="bind"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><h4> 通过客户端位置进行条件判断</h4>
<p>PowerDNS的GeoIP后端同样提供了基于客户端地理位置进行条件判断的相关函数。如：<code>country('CN')</code>返回客户端是否来自中国，<code>region('SN')</code>返回客户端是否来自陕西省，<code>continent('AS')</code>返回客户端是否来自亚洲。类似的，也可以接受由字符串构成的数组，此时当客户位于任何一个区域内即返回<code>true</code>。</p>
<p>下面的zone file是一个简单的展示该特性的demo，配置了<code>test.nteren.net</code>的TXT记录，当请求来自中国大陆时返回<code>CN</code>，否则返回<code>IDK</code>。</p>
<div class="language-bind line-numbers-mode" data-ext="bind"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h4> 基于地理距离优选IP</h4>
<p>PowerDNS的GeoIP后端也提供了基于客户端IP和候选IP距离返回最优结果的函数<code>pickclosest()</code>。该函数接受一个数组，返回与<code>bestwho</code>在地理位置上最接近的地址。</p>
<p>同时，PowerDNS也提供了<code>ifportup(portnum, addresses[, options])</code>函数。该函数接受需测试的端口、候选IP地址数组和可选的参数。可选参数中可指定选择器，如<code>pickclosest</code>。如果指定了选择器，<code>ifportup</code>将返回选择器返回的结果，否则返回随机一个可用的IP地址。</p>
<p>该配置也可结合上述的客户端位置判断特性，实现基于地理位置的负载均衡。下面即为一个简单的配置案例</p>
<div class="language-bind line-numbers-mode" data-ext="bind"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><h2> 参考资料</h2>
<p>更多资料以及PowerDNS Lua Record参考可以在PowerDNS的官方文档中找到。</p>
<ul>
<li><a href="https://doc.powerdns.com" target="_blank" rel="noopener noreferrer">PowerDNS官方文档</a></li>
<li><a href="https://doc.powerdns.com/authoritative/lua-records/index.html" target="_blank" rel="noopener noreferrer">PowerDNS Lua Record参考</a></li>
</ul>
]]></content>
    <category term="随笔"/>
    <category term="网络"/>
    <published>2023-01-29T23:23:30.000Z</published>
  </entry>
  <entry>
    <title type="text">类原生系统上的Mifare Classic UID模拟</title>
    <id>https://blog.naivetomcat.cn/pages/9a7f60/</id>
    <link href="https://blog.naivetomcat.cn/pages/9a7f60/"/>
    <updated>2026-02-25T19:00:57.000Z</updated>
    <summary type="html"><![CDATA[<h2> 前言</h2>
<p><strong><a href="/pages/b0ee24/" target="blank">请看这篇补充说明</a></strong></p>
<p>最近更新了手机，由OnePlus Ace换成了Ace3，并且在收货后立刻刷入了<code>PixelOS</code>。在刷入过程中虽遇到了一些问题（见<a href="https://t.me/neko_rei/210" target="_blank" rel="noopener noreferrer">这里及之后几条</a>，但最终成功刷入。使用过程中发现，类原生系统并无国产OEM系统的门禁卡模拟（即Mifare Classic卡的UID模拟）功能。本文记录了我在类原生系统上实现Mifare Classic卡UID模拟的过程。</p>]]></summary>
    <content type="html"><![CDATA[<h2> 前言</h2>
<p><strong><a href="/pages/b0ee24/" target="blank">请看这篇补充说明</a></strong></p>
<p>最近更新了手机，由OnePlus Ace换成了Ace3，并且在收货后立刻刷入了<code>PixelOS</code>。在刷入过程中虽遇到了一些问题（见<a href="https://t.me/neko_rei/210" target="_blank" rel="noopener noreferrer">这里及之后几条</a>，但最终成功刷入。使用过程中发现，类原生系统并无国产OEM系统的门禁卡模拟（即Mifare Classic卡的UID模拟）功能。本文记录了我在类原生系统上实现Mifare Classic卡UID模拟的过程。</p>
<h2> 基础知识</h2>
<h3> Mifare Classic卡</h3>
<p>Mifare Classic卡是一种常见的非接触式IC卡，遵循ISO 14443标准，由NXP公司生产。其最大特点是卡片的UID（卡片唯一标识符）是固定且不可更改的。根据此，许多门禁系统使用卡片的UID作为卡片的唯一标识，因此门禁卡模拟的基本原理即是模拟卡片的UID。</p>
<h3> Android NFC栈</h3>
<p>Android系统支持NFC功能。对于本次的需求，我们主要关注Android NFC栈对于ISO 14443标准的支持。</p>
<p>自Android 4.4（API 19）起，Android系统提供了<code>Host Card Emulation</code>系列API支持<code>Nfc-A (ISO/IEC 14443 type A)</code>协议的卡模拟。但是，该功能的预期使用场景是通过该协议交换数据，且协议规定了HCE设备预期返回随机的UID。因此，我们无法通过HCE实现Mifare Classic卡的UID模拟。</p>
<p>然而Android系统的NFC栈底层仍然基于<code>libnfc-nxp</code>。因此获取root权限后，我们可以直接修改其配置文件实现Mifare Classic卡UID模拟。</p>
<h2> 实现过程</h2>
<h3> 依赖条件</h3>
<ul>
<li>具有Root权限的Android设备</li>
<li>设备的<code>/vendor/etc/libnfc-nxp.conf</code>文件可读写</li>
</ul>
<h3> 实现步骤</h3>
<p>获取Root权限后，修改<code>/vendor/etc/libnfc-nxp.conf</code>文件。具体修改内容如下：</p>
<ul>
<li><code>NXP_CORE_CONF</code></li>
<li><code>NXP_NFC_PROFILE_EXTN</code></li>
</ul>
<p>具体修改内容为，修改<code>NXP_CORE_CONF</code>中的<code>0x33, 0x00</code>指令为相对应的设置UID的指令。根据官方文档，对于四字节UID<code>AB:CD:EF:01</code>，设置指令为<code>0x33, 0x04, 0xAB, 0xCD, 0xEF, 0x01</code>；同时将上述指令追加至<code>NXP_NFC_PROFILE_EXTN</code>中。</p>
<p>修改完成后重启NFC服务，即可模拟写入的UID。</p>
<p>为方便模拟，参考了<a href="https://github.com/qwe321qwe321qwe321/NFC-UID-Emulator" target="_blank" rel="noopener noreferrer">此项目</a>及其修正了高版本Android权限问题的<a href="https://github.com/yikza/NFC-UID-Emulator" target="_blank" rel="noopener noreferrer">Fork</a>，并在其基础上进行了一些修改，见<a href="https://github.com/NaiveTomcat/NFC-UID-Emulator" target="_blank" rel="noopener noreferrer">此处</a>。得到了较为方便的图形化的可以保存多张卡的UID模拟工具。</p>
]]></content>
    <category term="开发"/>
    <published>2024-12-21T00:40:00.000Z</published>
  </entry>
  <entry>
    <title type="text">NTEREN网络重构</title>
    <id>https://blog.naivetomcat.cn/pages/4522ca/</id>
    <link href="https://blog.naivetomcat.cn/pages/4522ca/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<p>自从NTEREN DN42网的教育网西北节点由于政策原因下线以来，NTEREN的DN42网便仅剩一个节点。2022中国大学生方程式汽车大赛结束后，终于有时间对网络进行重构了，值此机会写篇文章以记录。</p>
<h2> 网络结构</h2>
<p>目前重构后，NTEREN DN42网拥有三个互联的节点，分别位于洛杉矶、中国香港和中国陕西。NTEREN公网节点除DN42节点外另有独立的中国香港和拉斯维加斯两个节点。所有节点均接受对应网络的Peer。</p>
<p>DN42网络中，洛杉矶节点与香港节点有直接隧道连接，香港节点与陕西节点有隧道连接。节点间建立了BGP Confederation以保证内部互联和路由信息传递。Confederation的架构也保证了未来网络的可扩展性。未来可能会将另两个公网节点也接入DN42主干网。</p>]]></summary>
    <content type="html"><![CDATA[<p>自从NTEREN DN42网的教育网西北节点由于政策原因下线以来，NTEREN的DN42网便仅剩一个节点。2022中国大学生方程式汽车大赛结束后，终于有时间对网络进行重构了，值此机会写篇文章以记录。</p>
<h2> 网络结构</h2>
<p>目前重构后，NTEREN DN42网拥有三个互联的节点，分别位于洛杉矶、中国香港和中国陕西。NTEREN公网节点除DN42节点外另有独立的中国香港和拉斯维加斯两个节点。所有节点均接受对应网络的Peer。</p>
<p>DN42网络中，洛杉矶节点与香港节点有直接隧道连接，香港节点与陕西节点有隧道连接。节点间建立了BGP Confederation以保证内部互联和路由信息传递。Confederation的架构也保证了未来网络的可扩展性。未来可能会将另两个公网节点也接入DN42主干网。</p>
<p>目前NTEREN网络结构如下所示，其中<code>AS425875xxxx</code>为Confederation所用私有ASN：</p>
<h2> Peer信息</h2>
<p>目前NTEREN的所有节点均接受Peer。相关信息如下</p>
<h3> DN42</h3>
<h4> 洛杉矶节点</h4>
<p>Clearnet Host: <code>lax.tsinghuamakerxian.cn</code></p>
<p>Clearnet IPv4: <code>63.210.148.116</code></p>
<p>Clearnet IPv6: <code>2001:19f0:6001:424c:5400:3ff:fe37:9948</code></p>
<p>DN42 IPv4: <code>172.23.163.161</code></p>
<p>DN42 IPv6: <code>fda8:6b5c:e372:abcd::</code></p>
<p>Link-Local IPv6: <code>fe80::3309</code></p>
<p>WireGuard Pubkey: <code>C9QViSndf1zga5nOoSoXXMLUWBJvEFiJDWSFCbU1Ynw=</code></p>
<p>WireGuard Port: <code>Last 5 digits of your ASN</code></p>
<h4> 香港节点</h4>
<p>Clearnet Host: <code>hkg.dn42.tsinghuamakerxian.cn</code></p>
<p>Clearnet IPv4: <code>43.154.38.182</code></p>
<p>Clearnet IPv6: <code>None</code></p>
<p>DN42 IPv4: <code>172.23.163.170</code></p>
<p>DN42 IPv6: <code>fda8:6b5c:e372:42::</code></p>
<p>Link-Local IPv6: <code>fe80::1:3309</code></p>
<p>WireGuard Pubkey: <code>MfiVRlTTuCgS+7n3MZOQorxd1s8Kwa1piaoePn3KzgA=</code></p>
<p>WireGuard Port: <code>Last 5 digits of your ASN</code></p>
<h4> 陕西节点</h4>
<p>Clearnet Host: <code>home2.nteren.net</code></p>
<p>Clearnet IPv4: <code>Dynamic</code></p>
<p>Clearnet IPv6: <code>None</code></p>
<p>DN42 IPv4: <code>172.23.163.177</code></p>
<p>DN42 IPv6: <code>fda8:6b5c:e372:142::</code></p>
<p>Link-Local IPv6: <code>fe80::2:3309</code></p>
<p>WireGuard Pubkey: <code>BTntghr9wsexgdAZYGbtN9eEmEmdOGBpRSUpMe4Ma3Y=</code></p>
<p>WireGuard Port: <code>Last 5 digits of your ASN</code></p>
<h3> 公网</h3>
<p>所有节点均接受公网IPv6 Peer。相关信息请直接联系我。联系方式可在博客首页侧边栏找到。</p>
]]></content>
    <category term="开发"/>
    <published>2022-10-31T10:29:18.000Z</published>
  </entry>
  <entry>
    <title type="text">博客重启</title>
    <id>https://blog.naivetomcat.cn/pages/c26a43/</id>
    <link href="https://blog.naivetomcat.cn/pages/c26a43/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<p>我之前是有一个blog的，是刚接触GitHub pages和jekyll的时候在GitHub上面部署的。当时<br>
用的by的模板。（还有几个我维护的别的站，例如少年班苏州预科班的网站，里面也用了这个模板）</p>
<p>之后，原来的博客也没有什么可写的，也不知道写什么，总之挂了两三年可能上面只有两三千字吧，<br>
而且GitHub pages也不会被百度收录，也一直没啥流量。（小彩蛋：如果你Google Trimethyldopa<br>
这个东西，你会发现在一堆德语的论文索引页（好像是<code>ALPHA,BETA,BETA-TRIMETHYLDOPA, A NEW INHIBITOR OF TRYPTOPHAN AND PHENYLALANINE HYDROXYLASE</code>）中有一个我的站。</p>]]></summary>
    <content type="html"><![CDATA[<p>我之前是有一个blog的，是刚接触GitHub pages和jekyll的时候在GitHub上面部署的。当时<br>
用的by的模板。（还有几个我维护的别的站，例如少年班苏州预科班的网站，里面也用了这个模板）</p>
<p>之后，原来的博客也没有什么可写的，也不知道写什么，总之挂了两三年可能上面只有两三千字吧，<br>
而且GitHub pages也不会被百度收录，也一直没啥流量。（小彩蛋：如果你Google Trimethyldopa<br>
这个东西，你会发现在一堆德语的论文索引页（好像是<code>ALPHA,BETA,BETA-TRIMETHYLDOPA, A NEW INHIBITOR OF TRYPTOPHAN AND PHENYLALANINE HYDROXYLASE</code>）中有一个我的站。</p>
<p>最近在大学也有半年了，能写的东西也有了，而且搭一个正经的blog我觉得也挺有必要的。所以，就有了这个站。</p>
<p>还是用的静态网页，最终选择了VuePress作为生成器，Vdoing这个主题。基本上就是吧<code>vdoing-demo-blog</code>这个仓库改了改吧</p>
<p>就先这样吧，新的博客，新的开始</p>
<h2> 2021-04-13更新</h2>
<p>大概做了个部署脚本，思路大致是先<code>yarn build</code>编译出静态文件，然后把静态文件复制到一个git仓库内并commit然后push到上游，ssh到服务器上执行<code>git pull</code>同步。主要是服务器的ssh连接好像不是很稳定，所以通过ssh传的数据越少越好。</p>
]]></content>
    <category term="随笔"/>
    <published>2021-04-12T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">NTEREN北美网络重构</title>
    <id>https://blog.naivetomcat.cn/pages/93d7fe/</id>
    <link href="https://blog.naivetomcat.cn/pages/93d7fe/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<p>在与<a href="https://blog.ayanami-official.net/" target="_blank" rel="noopener noreferrer">Ayanami Rei IV</a>达成合作后，我得以将其节点接入NTEREN，并利用这些节点建立NTEREN全球主干网。相应的，NTEREN要向其提供网络基础设施，如IPv6地址，以及网络运维等服务。</p>
<p>作为合作的第一步，目前需要接收其一台San Jose区域的VPS，将其接入NTEREN北美网络，并配置该节点与提供商之间的BGP会话。应要求同步写下这篇文章以作记录。</p>
<h2> 网络结构重构</h2>]]></summary>
    <content type="html"><![CDATA[<p>在与<a href="https://blog.ayanami-official.net/" target="_blank" rel="noopener noreferrer">Ayanami Rei IV</a>达成合作后，我得以将其节点接入NTEREN，并利用这些节点建立NTEREN全球主干网。相应的，NTEREN要向其提供网络基础设施，如IPv6地址，以及网络运维等服务。</p>
<p>作为合作的第一步，目前需要接收其一台San Jose区域的VPS，将其接入NTEREN北美网络，并配置该节点与提供商之间的BGP会话。应要求同步写下这篇文章以作记录。</p>
<h2> 网络结构重构</h2>
<p>NTEREN北美网，作为Overlay网络，目前使用Wireguard进行隧道连接。考虑到未来的可扩展性，并且考虑到三层隧道可能带来的问题，本次重构的第一步是将NTEREN北美网迁移至由Zerotier组建的full mesh二层隧道网中。</p>
<p>Zerotier使用官方控制器时，免费套餐允许最多25个节点。以目前可预见的NTEREN网络规模，25个节点应当足够。未来有更多节点需求时再做迁移考虑，可能迁移至自建Zerotier控制器，或其它大二层隧道方案。</p>
<p>此处配置参考Zerotier官方文档即可。节点不需分配IP，后续路由使用基于mac地址产生的IPv6 Link-Local地址进行。</p>
<p>需要注意的是，需要限制Zerotier绑定的IP。不能使Zerotier绑定到网内的IP上，否则会出现路由问题进而导致网络不稳。我限制其绑定在节点的IPv4地址上。</p>
<h2> 动态路由协议重构</h2>
<p>原先方案中，每一台单独节点均作为一个Confederation AS实体。现重构为北美网络整体作为一个Confederation AS实体，其中运行全连接的iBGP。在Zerotier组成的大二层隧道中这种方案很容易实现。</p>
<p>同时，Bird的Confederation实现选路时在AS Path中忽略了用于Confederation的AS路径长度。因此在之前的网络结构中，由于高延迟的HKG-LAX隧道，路由路径常常不佳。故本次重构中改用模拟Confederation的方式，仍然使用<code>425875xxxx</code>范围的ASN作为Confederation使用，但不在Protocol中激活Bird的Confederation设置，而是在网络对外的Filter中删除路由中<code>bgp_path</code>的对应ASN。</p>
<h2> 基于源地址的策略路由</h2>
<p>Ayanami Rei IV要求能够同时使用VPS提供商分配的IPv6地址上网。故设置基于源地址的策略路由。</p>
<p>思路为：当源地址为VPS服务商所分配的IPv6地址段内时，匹配一张单独的路由表，内部只有一条默认路由，与VPS服务商下发的相符。</p>
<p>具体设置方法如下：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <category term="开发"/>
    <published>2022-11-12T16:41:15.000Z</published>
  </entry>
  <entry>
    <title type="text">年轻人的第一个公网AS</title>
    <id>https://blog.naivetomcat.cn/pages/b2dd1e/</id>
    <link href="https://blog.naivetomcat.cn/pages/b2dd1e/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<h2> 前言</h2>
<p>在加入DN42网络后不久，我通过某个契机获赠了一个公网ASN和一块/44的IPv6地址块。但是这段时间事情比较多，六月初录了个节目，录完就接上了期末考试。今天考试结束了，写篇文章总结一下。</p>
<h2> AS相关介绍</h2>
<p>AS（Autonomous System，自治系统）是指在互联网中，一个或多个实体管辖下的所有IP网络和路由器的组合，它们对互联网执行共同的路由策略。一个AS会被分配一些IP地址用于其内部互联网节点的连接。AS之间通过边界网关协议（BGP）互联，而BGP区分AS的方式是通过唯一的自治系统编号，即ASN。ASN由IANA成批分配到各大RIR，再由RIR进行下一级的分配，和IP地址类似。</p>]]></summary>
    <content type="html"><![CDATA[<h2> 前言</h2>
<p>在加入DN42网络后不久，我通过某个契机获赠了一个公网ASN和一块/44的IPv6地址块。但是这段时间事情比较多，六月初录了个节目，录完就接上了期末考试。今天考试结束了，写篇文章总结一下。</p>
<h2> AS相关介绍</h2>
<p>AS（Autonomous System，自治系统）是指在互联网中，一个或多个实体管辖下的所有IP网络和路由器的组合，它们对互联网执行共同的路由策略。一个AS会被分配一些IP地址用于其内部互联网节点的连接。AS之间通过边界网关协议（BGP）互联，而BGP区分AS的方式是通过唯一的自治系统编号，即ASN。ASN由IANA成批分配到各大RIR，再由RIR进行下一级的分配，和IP地址类似。</p>
<p>ASN最初是一个16位长的整数，自2007年起，开始分配32位的ASN。</p>
<h2> 如何注册ASN</h2>
<p>现在能注册到的ASN基本上都是32位的了，和16位ASN没有本质区别，唯一的区别可能是在老旧的设备上可能不支持32位ASN。ASN是要向RIR（例如APNIC, RIPE NCC之类）申请的。RIR一般会免费给各自的大会员注册ASN，但是会费一般都不菲。因此我们可以找LIR进行代注册。LIR一般是RIR的大会员，缴纳会费，我们只需要提供需要的资料并且向LIR支付一笔注册费就可以了。</p>
<p>只有ASN还是不能在网络上广播IP的，你还需要自己的IP地址。IPv4地址已经基本分配完毕了，而且价格不菲，而IPv6的地址很多，并且较小的地址块（/44-/48的这种）一般都能免费分配，所以我们使用IPv6地址。一般注册ASN的时候也会一并注册一块地址，流程也是按照LIR的要求进行。</p>
<p>一般来说，注册需要提供的就是whois上面的相关信息了。以APNIC为例，如果以个人注册，你需要提供你的姓名、地址、电话、以及邮箱地址，还需要提供一个abuse邮箱和技术联系邮箱，同时还需要一个AS的名字。提交之后过几天ASN就分配下来了，可以使用whois进行查询。分配给我的ASN就是<code>142280</code>，whois信息如下：</p>
<details class="hint-container details"><summary>详情</summary>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></details>
<h2> 如何接入互联网并广播自己的IP</h2>
<p>这一步和DN42的步骤就很相似了，但是找到愿意和你peer的公网AS不是一件简单的事。vultr和buyvm支持BGP Session，可以在这两家的VPS上使用自己的IP地址（当然，要用BGP）。具体可以参考这两家的文档，我就不多赘述了。</p>
<p>如果你愿意和我进行Peer，欢迎联系我。目前仅能提供一台洛杉矶的节点进行Peer。</p>
]]></content>
    <category term="开发"/>
    <published>2021-06-23T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">小米路由器3G安装openwrt的折腾记录</title>
    <id>https://blog.naivetomcat.cn/pages/05c9b1/</id>
    <link href="https://blog.naivetomcat.cn/pages/05c9b1/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<h2> 前言</h2>
<p>这篇博文其实记录的大概是将近两个月之前的事情了，但是这两个月也在断断续续折腾，现在应该折腾的差不多了，所以现在才写。</p>
<p>宿舍以前用的是一个TP-Link的WR886n Rev 2的路由器（非常老了），甚至连IPv6都不支持，导致因为要刷pt，宿舍原来的网络拓扑是入户网线接交换机，再接到我的台式机上，台式机拨号做第一轮NAT，第二块网卡再接到路由器上。因为我台式机装的Arch Linux，内核更新的比较勤，每次更完内核都得重启（不然会出玄学错误），所以网络可用性也没啥保证。</p>
<p>于是这个学期，我打算换个路由器。开学的时候从网管协会某学长那里收了一个小米路由器4A千兆版，原来刷的Pandavan，为了刷openwrt拆了机焊了串口线，结果不知道什么原因，用SPI夹子读闪存的时候可能把它烧了吧，于是第二天从闲鱼上买了个R3G，初始版本带USB的，大概第四天到的。</p>]]></summary>
    <content type="html"><![CDATA[<h2> 前言</h2>
<p>这篇博文其实记录的大概是将近两个月之前的事情了，但是这两个月也在断断续续折腾，现在应该折腾的差不多了，所以现在才写。</p>
<p>宿舍以前用的是一个TP-Link的WR886n Rev 2的路由器（非常老了），甚至连IPv6都不支持，导致因为要刷pt，宿舍原来的网络拓扑是入户网线接交换机，再接到我的台式机上，台式机拨号做第一轮NAT，第二块网卡再接到路由器上。因为我台式机装的Arch Linux，内核更新的比较勤，每次更完内核都得重启（不然会出玄学错误），所以网络可用性也没啥保证。</p>
<p>于是这个学期，我打算换个路由器。开学的时候从网管协会某学长那里收了一个小米路由器4A千兆版，原来刷的Pandavan，为了刷openwrt拆了机焊了串口线，结果不知道什么原因，用SPI夹子读闪存的时候可能把它烧了吧，于是第二天从闲鱼上买了个R3G，初始版本带USB的，大概第四天到的。</p>
<h2> 开始折腾</h2>
<p>R3Gv1刷openwrt的步骤挺简单的：先刷上官方开发版系统，然后打开ssh，把openwrt的initramfs和kernel镜像刷进去就行了。然后就是标准套路：改opkg的镜像源，安些必要的软件，然后联网。具体可以参考openwrt官方Wiki，我就是照着那上面一步一步刷好的。</p>
<p>本来想做双线均衡的，也都配好了，最后想想没啥必要，就没开。</p>
<p>IPv6就是另一个故事了。学校作为CERNET的节点，宿舍拨号的v4都是公网的IP（但是有防火墙，出去还是走运营商的NAT，入站TCP屏蔽，校内随便访问），但是v6居然是/128的单IP。。。于是配了一下午的NAT6，整的头挺大的。后来不知道为啥NAT6又经常抽风。。。也懒得管了。</p>
<p>后来发现了一个问题：纯v6的站好像没见到过，我需要v6也就是刷刷pt，于是买了个4T的监控盘，插在3.5寸的硬盘盒里插到路由器上，路由器上安个transmission，再配个SAMBA，就可以24*7的刷pt了，而且要看啥片子从挂载的网络驱动器上直接看就行。</p>
<p>但是，最近要去南京录节目，transmission web UI好办，学校有VPN能连回来，但是samba就不行了。。。于是今天配了个webdav，加上VPN，应该能在外面连回来吧（</p>
<h2> 总结</h2>
<p>宿舍里的路由器其实能做很多事情，比如刷pt，做NAS等。其实除了用硬路由以外，也能用软路由，有一同学的宿舍就用了个J4105的板子做软路由，上面还跑了一些别的业务（比如Windows虚拟机），前几天因为裸板直接挂墙上有安全隐患被宿管勒令整改了👀。但是综合成本性能等方面考虑，用R3G硬路由还挺香的。毕竟MT7621的性能算是17年旗舰了，有硬路由加速，50M带宽跑满的基础上基本不占CPU。想折腾网络的同学可以先从宿舍网络做起，进而了解整个网络栈。就是这样了。</p>
]]></content>
    <category term="随笔"/>
    <category term="开发"/>
    <published>2021-04-21T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">在机械革命Umi Pro 3的Windows上安装tensorflow的踩坑记录（With RTX 3060 Laptop）</title>
    <id>https://blog.naivetomcat.cn/pages/787b52/</id>
    <link href="https://blog.naivetomcat.cn/pages/787b52/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<h2> 前言</h2>
<p>本来打算在这个机子上装Arch跑开发的，然而因为Linux上糟糕的国内软件支持（上台机子上QQ for Linux/Wine QQ/Wine TIM就没跑起来连续超过10分钟过），以及放不下Microsoft Office，最终还是留在了Windows里面进行开发。</p>
<p>最近刚好有个深度学习的活，那就顺便把TF装了吧，3060的算力肯定比我之前的2400G要好，我想。</p>
<p>然后我就开始了这个踩坑之旅</p>
<h2> Anaconda大坑</h2>
<p>本来我想用Anaconda装的，然而30系显卡只支持CUDA11，Anaconda上对Windows提供的最新TF版本是2.3.0（至少清华镜像源是这样），同时TF2.4+的版本才支持CUDA11。因此Anaconda的方案Pass。</p>]]></summary>
    <content type="html"><![CDATA[<h2> 前言</h2>
<p>本来打算在这个机子上装Arch跑开发的，然而因为Linux上糟糕的国内软件支持（上台机子上QQ for Linux/Wine QQ/Wine TIM就没跑起来连续超过10分钟过），以及放不下Microsoft Office，最终还是留在了Windows里面进行开发。</p>
<p>最近刚好有个深度学习的活，那就顺便把TF装了吧，3060的算力肯定比我之前的2400G要好，我想。</p>
<p>然后我就开始了这个踩坑之旅</p>
<h2> Anaconda大坑</h2>
<p>本来我想用Anaconda装的，然而30系显卡只支持CUDA11，Anaconda上对Windows提供的最新TF版本是2.3.0（至少清华镜像源是这样），同时TF2.4+的版本才支持CUDA11。因此Anaconda的方案Pass。</p>
<h2> 官方Python的大坑</h2>
<p>然后，我就下载了官方的python安装器。安装之后，我手贱执行了<code>python -m pip install -u pip</code>的操作，这个命令执行正常，但是等更新到<code>pip 21.0.1</code>之后，pip再装任何包用任何源都会报ssl错误。。。重装降级pip（从源码安装，因为pip已经不能用了）、重装python都不顶用。。。所以这个python算是废了。（不要问我为啥不手动安装，我懒得人工解析依赖，尤其是tf这种大包）</p>
<h2> 微软商店Python3.8 + CUDA 11.1安装流程（踩坑记录）</h2>
<h3> 安装</h3>
<p>上面几个路子毙了之后，我从微软商店下了python3.8（之前还总是想执行python的时候给我弹出应用商店，现在知道好处了🤣）。这个python的pip意外的能用，于是我就进行了以下操作：</p>
<ul>
<li>安装CUDA Toolkit 11.1</li>
<li>安装cuDNN 8.0.4 for CUDA 11.1</li>
<li>安装<code>tf-nightly-gpu</code></li>
</ul>
<h3> 报错</h3>
<p>结果，当我执行下面用来验证Tensorflow能否正确使用GPU的代码时</p>
<div class="language-python line-numbers-mode" data-ext="py"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>报了以下错误</p>
<div class="language-python line-numbers-mode" data-ext="py"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我当时就懵了。。。我明明安了CUDA和cuDNN，为啥你就是找不到dll呢？</p>
<p>为了以防万一，我重新检查了<code>%PATH%</code>环境变量，加上了cuDNN的bin文件夹，重启电脑，打开python，执行测试代码</p>
<p>然后它又报了一样的错。。。</p>
<h3> 解决</h3>
<p>那本着既然你不到我这来找，我把你要找的东西放到某个你一定会去找的地方的指导思想，我把<code>CUDA/bin</code>目录下的东西和cuDNN的bin目录下的东西全都复制到<code>System32</code>文件夹里面了，这回错误信息少了不少：</p>
<div class="language-python line-numbers-mode" data-ext="py"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>可以看到是少了<code>cusolver64_10.dll</code>的问题。因为CUDA 11.0有这个文件，11.1没有，而官方的tf又是在11.0上构建的，因此会出现这个问题。解决方案也很简单，一行powershell搞定：</p>
<div class="language-powershell line-numbers-mode" data-ext="powershell"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>创建一个名为<code>cusolver64_10.dll</code>的符号链接，指向<code>cusolver64_11.dll</code>就可以了。</p>
<p>最终效果：</p>
<div class="language-python line-numbers-mode" data-ext="py"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>能读到GPU，能算东西，完工</p>
]]></content>
    <category term="开发"/>
    <published>2021-04-13T21:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">有关Transgender话题的一点杂谈</title>
    <id>https://blog.naivetomcat.cn/pages/b43aac/</id>
    <link href="https://blog.naivetomcat.cn/pages/b43aac/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<p>两千多的自行车前两天在学校被偷了，这段时间在Twitter上也看到了很多发生在跨性别个体上的悲剧事件。同时不知道什么原因，最近也看到了越来越多的影响力大的自媒体发表对跨性别相关话题的内容。这两天精神状态很不好，同时正值Transgender Awareness Week和Transgender Day of Rememberance，因此写下这篇文章，内容很杂，算是精神压力的一个出口吧。</p>
<h2> 什么是Transgender/跨性别</h2>
<p>首先，我认为有必要界定清<strong>Transgender/跨性别</strong>。最近看到的很多内容在虚空开炮，或有意或无意地混淆Transgender与Homosexualism甚至Cross-dressing。这篇文章在进行任何讨论之前首先需要对Transgender的定义做出明确。</p>]]></summary>
    <content type="html"><![CDATA[<p>两千多的自行车前两天在学校被偷了，这段时间在Twitter上也看到了很多发生在跨性别个体上的悲剧事件。同时不知道什么原因，最近也看到了越来越多的影响力大的自媒体发表对跨性别相关话题的内容。这两天精神状态很不好，同时正值Transgender Awareness Week和Transgender Day of Rememberance，因此写下这篇文章，内容很杂，算是精神压力的一个出口吧。</p>
<h2> 什么是Transgender/跨性别</h2>
<p>首先，我认为有必要界定清<strong>Transgender/跨性别</strong>。最近看到的很多内容在虚空开炮，或有意或无意地混淆Transgender与Homosexualism甚至Cross-dressing。这篇文章在进行任何讨论之前首先需要对Transgender的定义做出明确。</p>
<p>我们首先来看Wikipedia的定义：<sup class="footnote-ref"><a href="#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup></p><a class="footnote-anchor" id="footnote-ref1">
<blockquote>
<p>A transgender (often abbreviated as trans) person is someone whose gender identity or gender expression does not correspond with their sex assigned at birth. Many transgender people experience dysphoria, which they seek to alleviate through transitioning, often adopting a different name and set of pronouns in the process. Additionally, they may undergo sex reassignment therapies such as hormone therapy and sex reassignment surgery to more closely align their primary and secondary sex characteristics with their gender identity. Not all transgender people desire these treatments, however, and others may be unable to access them for financial or medical reasons. Those who do desire to medically transition to another sex may identify as transsexual.</p>
</blockquote>
</a><p><a class="footnote-anchor" id="footnote-ref1">首先明确Gender和Sexuality的区别。<strong>Sex</strong>是生物学概念，而<strong>Gender</strong>是社会概念<sup class="footnote-ref"></sup></a><a href="#footnote2">[2]</a><a class="footnote-anchor" id="footnote-ref2">：因此你护照上的字段是<code>Sex</code>，而很多网站询问你的是<code>Gender</code>。Transgender和Transsexual的区别就在于此：Transsexual指改变了生理性别的，而Transgender指代范围更广。</a></p><a class="footnote-anchor" id="footnote-ref2">
</a><p><a class="footnote-anchor" id="footnote-ref2">另外，性别认同和性取向是不同的概念，Transgender与Homosexual抑或Heterosexual没有冲突或者必然联系。<sup class="footnote-ref"></sup></a><a href="#footnote1">[1:1]</a><a class="footnote-anchor" id="footnote-ref1:1"></a></p><a class="footnote-anchor" id="footnote-ref1:1">
<blockquote>
<p>Gender identity is distinct from sexual orientation, and transgender people may be of any sexual orientation. The opposite of transgender is cisgender, which describes people whose gender identity matches their assigned sex.</p>
</blockquote>
<p>在另一只手上，<strong>Transgender</strong>和<strong>Cross-dressing</strong>同样是不同的概念：前者对自身的性别认同与出生时的指派性别不同，而后者则没有性别认同方面的不一致，只是乐意于传统上异性的穿着。</p>
</a><h2><a class="footnote-anchor" id="footnote-ref1:1"></a> Transgender的存在历史：驳所谓“白左政治正确论”</h2>
<p>跨性别群体在历史上一直有存在。最近一段时间以来中美关系紧张化，加上内地媒体选择性渲染，以及西方国家实际正在发生的事件以及人事任命，给了许多人这样的认识：*LGBT群体是来源于西方的，起源自所谓政治正确，且正在入侵我国的荼毒。*实际上，同性恋群体及跨性别群体在历史上一直存在，Bisexual作为有一定概率发生的生物学变异在历史上一定存在，前述认知可以说是某些势力为打压我们群体而故意向受众植入的，甚至可以认为是将社会矛盾从阶级问题转移走的一种手段。本文无意讨论阶级问题，但在跨性别的社会问题上政治讨论无法被避免。</p>
<p>当然，跨性别或Transgender是一个现代术语，Transgender这个词也是在1965年才被提出。我们不能因为命名学而否定一样事物的存在。对跨性别的历史研究已经进行了许久，<a href="https://en.wikipedia.org/wiki/Transgender_history" target="_blank" rel="noopener noreferrer">Wikipedia</a>上对此也有较为详细的介绍，感兴趣的朋友可以自己过去看，在此不再赘述。但是，这一观点必须被阐明：跨性别群体的存在是社会的必然，有压迫的地方就会有反抗，有被群体压迫的地方就会有抱团的群体。所谓“政治正确”也是在被压迫者的反抗下诞生的。</p>
<h2> Gender Dysphoria与Gender-Affirming Therapy<!--：驳未明子--></h2>
<!-- 哔哩哔哩“知名Up主”未明子于2022年11月15日03时54分GMT+8发布了视频[【现实观察】糖的代价——不要表面上叛离了一元二极性秩序，却又更深重地被资本主义的性榨取所奴役](https://www.bilibili.com/video/BV1kG4y1x7yW)。说实话，这个视频在看的时候就感觉非常火大，也是促使我写这篇文章的一个因素。 -->
<p>Transgender所跨的是什么：最基础的，是社会给ta安上的gender这顶帽子。很多人都希望自己的社会性别表达与性别认同一致。对于大部分顺性别个体而言，这不是一个问题，但是对于跨性别者，自己的性别认同与社会上的性别表达的不一致则更为常见，由此引向<strong>Gender Dysphoria</strong>：性别不安。</p>
<p>性别不安的定义如下：<sup class="footnote-ref"><a href="#footnote3">[3]</a><a class="footnote-anchor" id="footnote-ref3"></a></sup></p><a class="footnote-anchor" id="footnote-ref3">
<blockquote>
<p>Gender dysphoria is a term that describes a sense of unease that a person may have because of a mismatch between their biological sex and their gender identity.</p>
<p>Many people with gender dysphoria have a strong, lasting desire to live a life that "matches" or expresses their gender identity. They do this by changing the way they look and behave.</p>
<p>Some people with gender dysphoria, but not all, may want to use hormones and sometimes surgery to express their gender identity.</p>
<p>Gender dysphoria is not a mental illness, but some people may develop mental health problems because of gender dysphoria.</p>
</blockquote>
</a><p><a class="footnote-anchor" id="footnote-ref3">由性别不一致导致的性别不安，为了缓解通常会进行性别肯定激素治疗GAHT，或者说激素替代疗法HRT。尽管激素治疗不是跨性别者的必选项，但对于有需求的跨性别者来说，激素治疗是缓解性别不安，接纳和认可自我必要的医疗介入。目前的研究表明，在专业医生的指导和风险把控下进行激素治疗是安全的。联合国人权高专办 发起的自由平等倡议（UN Free &amp; Equal）和国际文件《日惹原则》（The Yogyakarta Principles）都呼吁各国提供与性别肯定相关的卫生保健服务，保障跨性别者的人权。<sup class="footnote-ref"></sup></a><a href="#footnote4">[4]</a><a class="footnote-anchor" id="footnote-ref4">跨性别语境下通常所说的“吃糖”即是此，“糖”即激素治疗所用药物。</a></p><a class="footnote-anchor" id="footnote-ref4">
<p>我们要清楚一点，从跨性别到“吃糖”的逻辑链条是这样的：存在性别认同-&gt;性别认同与性别表达不一致-&gt;希望性别表达与性别认同相一致-&gt;进行性别肯定激素治疗。性别肯定激素治疗的缓解性别不安的效果，是其对性别表达的成功改变带来的；GAHT使用的药物均不是精神药品，也不会有什么神奇的，吃下去就能立刻变成想成为的样子的效果，它们只是激素和激素拮抗剂。</p>
<p>事实上，跨性别群体，不考虑可能并发的一系列精神疾病，所需要的医疗介入，从心理疏导，到GAHT，到嗓音训练，甚至一系列SRS，都是为了解决性别不安的问题。性别不安在某些个体上是如此严重的问题，实际上导致了许多精神疾病的并发。因此GAHT是跨性别群体必要的医疗资源。</p>
</a><p><a class="footnote-anchor" id="footnote-ref4">哔哩哔哩“知名Up主”未明子于2022年11月15日03时54分GMT+8发布的视频</a><a href="https://www.bilibili.com/video/BV1kG4y1x7yW" target="_blank" rel="noopener noreferrer">【现实观察】糖的代价——不要表面上叛离了一元二极性秩序，却又更深重地被资本主义的性榨取所奴役</a>中的最大错误，就是认为跨性别是后天的社会造就的被资本利用的。这样的谬误存在很多，甚至中文互联网上不乏认为跨性别是为了吃对应的性别红利而产生的，然而事实上在现在的中国大陆社会上跨性别者反而会承受更多的性别歧视等。</p>
<p>最近中国大陆当局的一系列举措，使得GAHT对于很大一部分未成年跨性别者的困难极度加大：《中国易性症多学科诊疗专家共识》<sup class="footnote-ref"><a href="#footnote5">[5]</a><a class="footnote-anchor" id="footnote-ref5"></a></sup><a class="footnote-anchor" id="footnote-ref5">的发表使得获得诊断的难度急剧上升，《药品网络销售监督管理办法》<sup class="footnote-ref"></sup></a><a href="#footnote6">[6]</a><a class="footnote-anchor" id="footnote-ref6">和《药品网络销售禁止清单（征求意见稿）》<sup class="footnote-ref"></sup></a><a href="#footnote7">[7]</a><a class="footnote-anchor" id="footnote-ref7">的发布及可能的执行将导致对GAHT药品的获取难度急剧加大，对中国跨性别群体的权利影响是非常巨大的。这也引出我们将讨论的下一个话题。</a></p><a class="footnote-anchor" id="footnote-ref7">
<p><em><strong>Redacted</strong></em></p>
<!-- 
## 中国社会对跨性别群体的系统性压迫

传统的中国式的家庭，子女常常是被家长十分严格地控制住的，子女并不被视为独立的个体而是“长辈”的财产，子女的决定由家长做出。在这样的环境中子女有自己的想法，特别是和指派性别不符的性别认同是冒天下之大不韪的。因此家庭的压迫是显然的。

中国的教育，尤其义务教育中，是没有跨性别的位置的。对比义务教育教学大纲和国际性教育技术指导纲要，对于性别认同、社会性别等议题，大陆的教学大纲中完全没有它们的位置。在从小学到高中甚至部分高校的受教育生涯中，性别表达是被严格限制的：按指派性别强制统一发型着装，异性交往被严格限制，诸如此类。

中国社会上对于跨性别群体的歧视比比皆是，从就业到出行，到陌生人的歧视。看看[知乎上的这个问题](https://www.zhihu.com/question/389294694)就知道了。

以及前面提到过的，医疗系统对于跨性别者获取医疗服务的压力。 -->
</a><h2><a class="footnote-anchor" id="footnote-ref7"></a> 参考资料</h2>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="footnote1" class="footnote-item"><p><a href="https://en.wikipedia.org/wiki/Transgender" target="_blank" rel="noopener noreferrer">https://en.wikipedia.org/wiki/Transgender</a> <a href="#footnote-ref1" class="footnote-backref">↩︎</a> <a href="#footnote-ref1:1" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote2" class="footnote-item"><p><a href="https://newsinhealth.nih.gov/2016/05/sex-gender" target="_blank" rel="noopener noreferrer">https://newsinhealth.nih.gov/2016/05/sex-gender</a> <a href="#footnote-ref2" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote3" class="footnote-item"><p><a href="https://www.nhs.uk/conditions/gender-dysphoria/" target="_blank" rel="noopener noreferrer">https://www.nhs.uk/conditions/gender-dysphoria/</a> <a href="#footnote-ref3" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote4" class="footnote-item"><p><a href="https://mtf.wiki/zh-cn/docs/medicine/overview/" target="_blank" rel="noopener noreferrer">https://mtf.wiki/zh-cn/docs/medicine/overview/</a> <a href="#footnote-ref4" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote5" class="footnote-item"><p>陆峥,刘娜,陈发展,丛中,刘阳,陶林,邸晓兰,刘华清,过斌,禹海航,赵烨德,潘柏林,刘烨,李革临,杨卫敏,张青,黎莉,马晓年.中国易性症多学科诊疗专家共识[J].临床精神医学杂志,2022,32(S1):1-15. <a href="#footnote-ref5" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote6" class="footnote-item"><p><a href="https://gkml.samr.gov.cn/nsjg/fgs/202209/t20220901_349742.html" target="_blank" rel="noopener noreferrer">https://gkml.samr.gov.cn/nsjg/fgs/202209/t20220901_349742.html</a> <a href="#footnote-ref6" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote7" class="footnote-item"><p><a href="https://www.nmpa.gov.cn/xxgk/zhqyj/zhqyjyp/20221103155815144.html" target="_blank" rel="noopener noreferrer">https://www.nmpa.gov.cn/xxgk/zhqyj/zhqyjyp/20221103155815144.html</a> <a href="#footnote-ref7" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></content>
    <category term="随笔"/>
    <category term="杂谈"/>
    <published>2022-11-15T17:21:45.000Z</published>
  </entry>
  <entry>
    <title type="text">通过隧道的互联网连接之小记</title>
    <id>https://blog.naivetomcat.cn/pages/d2e4ba/</id>
    <link href="https://blog.naivetomcat.cn/pages/d2e4ba/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<h2> 前言</h2>
<p>现有一台用于高性能计算的GPU服务器，因相关管理限制，无法直接访问互联网。但是，我们需要在服务器上进行一些需要访问互联网的操作，例如下载数据集、安装软件包等。因此，我们需要一种方法，使服务器能够访问互联网。</p>
<p>此博客文章用于记录实现该需求的具体方法，以及过程中遇到的问题和解决方案。</p>
<h2> 基本思路</h2>
<p>服务器限制只可访问校内网络，因此基本的思路是，在校内运行一台服务器，该服务器可以访问互联网，而后在其与GPU服务器之间建立一条隧道，通过隧道实现GPU服务器访问互联网。</p>
<p>该思路本身没有什么问题，但在实操中会遇见大量问题。本文将详细记录实现该思路的具体步骤。</p>]]></summary>
    <content type="html"><![CDATA[<h2> 前言</h2>
<p>现有一台用于高性能计算的GPU服务器，因相关管理限制，无法直接访问互联网。但是，我们需要在服务器上进行一些需要访问互联网的操作，例如下载数据集、安装软件包等。因此，我们需要一种方法，使服务器能够访问互联网。</p>
<p>此博客文章用于记录实现该需求的具体方法，以及过程中遇到的问题和解决方案。</p>
<h2> 基本思路</h2>
<p>服务器限制只可访问校内网络，因此基本的思路是，在校内运行一台服务器，该服务器可以访问互联网，而后在其与GPU服务器之间建立一条隧道，通过隧道实现GPU服务器访问互联网。</p>
<p>该思路本身没有什么问题，但在实操中会遇见大量问题。本文将详细记录实现该思路的具体步骤。</p>
<h2> 具体步骤</h2>
<h3> 使用到的工具</h3>
<p>使用<code>wireguard</code>建立隧道，自建的<code>PowerDNS</code>服务器作为域名的权威名称服务器并支撑DDNS。以及若干自己写的脚本。</p>
<h3> 隧道建立</h3>
<p>两台服务器上安装<code>wireguard</code>。校内用于转发的服务器，配置DDNS，将其IP解析到一个域名上。两台服务器参考官方文档配置<code>wireguard</code>，并在用于转发的服务器的上级路由器配置静态路由将GPU服务器的隧道IP指向用于转发的服务器的内网IP。由于IP变换十分不频繁，因此不对GPU服务器上<code>Wireguard</code>进行定期重启。（跑不了了再手动重启）</p>
<h3> 路由配置</h3>
<p>上一步配置结束后，GPU服务器可以访问校内服务器，且校内服务器已开启转发，NAT由路由器进行，因此GPU服务器经过适当的路由配置后可访问互联网的IP。经测试实际确实如此。但默认路由仍需进行配置。</p>
<p>配置默认路由很简单，指令如下：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>但是直接运行会遇到报错：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>这是因为默认路由已经存在，需要先删除原有的默认路由，再添加新的默认路由。</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>此时按下回车，会发现SSH连接已经卡死，因为默认路由被删除后，不存在到客户端的路由，因此SSH连接断开。此时您需要使用IPMI或者KVM等方式重新连接服务器，再次将原先的默认路由添加回来。</p>
<h4> 那怎么办</h4>
<p>仔细分析我们的需求，可以发现我们只需让访问校内IP的路由仍走原先物理接口及网关，其余的路由走隧道即可。因此，我们可以对所有校内前缀先添加路由，再删除原先的默认路由，最后添加新的默认路由。</p>
<p>此时问题的关键变为了，如何找到所有的校内路由。西安交通大学作为CERNET的节点校，显然其拥有自己的ASN，因此可以通过查询相关网站的方式找到其宣告的前缀。但是该方法过于繁杂。好在，GPU服务器的连接方式为通过校内下发给个人的OpenVPN连接，OpenVPN服务器又恰好下发了校内服务IP的路由，因此通过在运行OpenVPN的客户端机器上查看路由表（Windows: <code>netsh interface ipv4 show route</code>，Linux: <code>ip route show</code>）即可找到所有校内IP的路由。再之后便是通过正则表达式魔法将其变为添加路由的脚本。再在其之后加入重新指定默认路由的指令即可。</p>
<h2> 结语</h2>
<p>上述配置经实践表现良好，可以满足目前访问互联网的需求，但是仍然需要人工干预。同时通过手写且硬编码的方式添加路由不够优雅，也许可以通过BGP的方式自动化路由的添加。但是由于相关配置的时间成本与其带来的收益不相符合，因此目前未使用。排障采取人工方式，因未配置路由表持久化，重启后需人工重新运行脚本配置，但也保证了重启后网络恢复默认状态不会使得无法连接。</p>
]]></content>
    <category term="网络"/>
    <published>2024-09-26T15:11:00.000Z</published>
  </entry>
  <entry>
    <title type="text">机械革命Umi Pro 3的Linux EC踩坑记录</title>
    <id>https://blog.naivetomcat.cn/pages/0214cf/</id>
    <link href="https://blog.naivetomcat.cn/pages/0214cf/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<h2> 前言</h2>
<p>突然发现已经有一个月没更博客了 <s>（虽然说这大概是正常频率）</s> ，最近把Windows升到了最新的内部预览版本<code>22000.100</code>，有了<code>wslg</code>的支持（虽然看起来<code>wslg</code>默认用户<code>uid</code>是<code>1000</code>，导致<code>dbus</code>出了亿点点问题，好多程序跑不起来……），据说也支持挂载硬盘进去了。我就想这对于双系统十分利好，主要在文件共享方面。同时D盘也快满了，于是就将D盘挪到一整块1t的固态上去，腾出来的地方装了一个Arch Linux，没想到遇到了非常多的问题……</p>]]></summary>
    <content type="html"><![CDATA[<h2> 前言</h2>
<p>突然发现已经有一个月没更博客了 <s>（虽然说这大概是正常频率）</s> ，最近把Windows升到了最新的内部预览版本<code>22000.100</code>，有了<code>wslg</code>的支持（虽然看起来<code>wslg</code>默认用户<code>uid</code>是<code>1000</code>，导致<code>dbus</code>出了亿点点问题，好多程序跑不起来……），据说也支持挂载硬盘进去了。我就想这对于双系统十分利好，主要在文件共享方面。同时D盘也快满了，于是就将D盘挪到一整块1t的固态上去，腾出来的地方装了一个Arch Linux，没想到遇到了非常多的问题……</p>
<h2> 安装</h2>
<p>既然说到安装<code>Linux</code>之后的问题，那首先就要说说安装的时候遇到的问题了🤔。装的时候没有用<code>archinstall</code>，照着<code>archwiki</code>上的步骤一步一步装就行了（这次我记住在Live CD里安网络管理包了🤣，上次装arch的时候又重新进Live CD专门为解决无线的问题），装完基本包之后重启进tty，内存CPU硬盘都能认出来，<code>GRUB</code>也没出锅，开始配置图形界面。</p>
<p>桌面环境我选择了<code>KDE Plasma</code>这一套，主要还是出于个人习惯：曾经在<code>Gnome</code>和<code>KDE Plasma</code>中间左右横跳，最后还是觉得<code>KDE Plasma</code>用起来更舒服（除了<code>dolphin</code>），于是这次就直接装<code>plasma</code>软件包组了。装完之后，按照惯例，自然就装上<code>sddm</code>作为显示管理器了。然后，创建一般用户，设置<code>sudoer</code>文件，命令行输入<code>sddm</code>，然后就翻车了……<code>sddm</code>正常启动，然后输入密码登录之后就黑屏卡住了……不知道什么原因，<code>systemctl enable sddm.service --now</code>就<em>看似</em>解决了这个问题。</p>
<p>进桌面环境之后，照例配主题配UI之类的不提，然后就是<ruby>喜闻乐见<rt></rt><rp>（</rp>非常离谱<rp>）</rp></ruby>的安驱动（Nvidia驱动）环节。安好<code>nvidia</code>、<code>cuda</code>、<code>cudnn</code>之后，运行<code>nvidia-xconfig</code>命令，重启之后**甚至sddm都出不来……**无奈只能切到新的tty上恢复<code>/etc/X11/xorg.conf</code>到之前的状态。笔记本的可见光摄像头和红外摄像头居然都不需要驱动，用vlc找到设备路径 <s>并欣赏了IR摄像头拍出的奇妙画面</s> 之后，从AUR上安装<code>howdy</code>并配置好pam，就可以使用人脸识别登录、解锁和授权<code>sudo</code>了。打开系统监视器，粗略看看CPU频率，基本都在4GHz以上，安装过程（大概）就结束了。</p>
<h2> 暗坑</h2>
<p>还记得上面说的“打开系统监视器，粗略看看CPU频率，基本都在4GHz以上”吗？第一个暗坑就在这里。后面的使用中发现，CPU在较重负载上只能做到全核2.4GHz的频率（不过也比标称的2.3GHz高一点就是了🤣）。根据散热风扇噪声大小，我判断风扇并没有全速运转（多线程编译内核的时候声音甚至比在Windows下面日常插电使用的声音还小），于是就怀疑风扇控制的问题（这是第二个暗坑，我还没爬出来🙃）。不过传感器报的封装温度和最高核心温度都只在60℃上下，我就倍感奇怪。于是我怀疑供电选择的问题，因为Windows里面从电池供电的时候笔记本的行为和这里非常接近。通过acpi相关工具，引出了第三个坑：这个本子（至少）在Linux里面的ACPI支持有大问题：Thermal Zone温度和散热风扇居然都没有出现在acpi设备里面……想要改这些东西，就只能找野办法了。</p>
<p>第一个暗坑比较好解决，BIOS里面有个<code>Turbo Mode</code>的选项，需要选上。以及笔记本的“造物者模式”按钮似乎也有这样的效果。但是后面的暗坑就比较难处理了。</p>
<p>在笔记本设备上，有个东西叫做EC：Embedded Controller。这个东西一般就是个单片机，控制主板上一大堆东西，包括电源控制、散热控制等。一般来说EC都是能给它控制的功能暴露一个ACPI接口给上层OS的，但是这个主板不太一样，暴露给上层的ACPI接口非常少，用<code>acpi -V</code>能看到的信息只有这些：</p>
<details class="hint-container details"><summary>详情</summary>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></details>
<p>所以要想人工控制EC，可行的方法只有直接读写EC的寄存器了（非常野的方法）。然而到现在为止，我并没有找出EC寄存器和实际功能的对应关系（这个官方那里估计会有，但是能不能要到就非常不好说了），因此在这里提出一点个人的思路，希望能抛砖引玉。</p>
<h3> 整体思路</h3>
<p>由于EC也属于ACPI系统的一部分，并且在Linux系统中可以通过<code>/sys/kernel/debug/ec/</code>下的“文件”访问到EC的寄存器，因此主要有两条路可以走：</p>
<ol>
<li>反编译DSDT和SSDT表，获取寄存器地址和名称的对应关系，再通过实际的控制逻辑判断寄存器的实际用途</li>
</ol>
<blockquote>
<p>由于DSDT和SSDT表中符号名称只能有4个字符，因此可读性较差。</p>
</blockquote>
<ol start="2">
<li>通过<code>nbfc</code>提供的EC寄存器相关工具监视寄存器值的变化，同时通过其余手段使要找的寄存器的值发生变化（例如给以高负载使CPU升温使风扇转速变化），缩小可疑范围后尝试写对应寄存器地址观察有无实际效果</li>
</ol>
<blockquote>
<p>经常有不止一组寄存器会变化，因此需要不停试错，同时写EC寄存器有一定风险</p>
</blockquote>
<p>综上，最佳方案使两条路一起走，相互佐证：</p>
<ul>
<li>
<p>通过上述第二种方案找出可疑的寄存器，再从反编译的DSDT描述文件中寻找对应地址的实际用途</p>
</li>
<li>
<p>通过上述第一种方案找出的寄存器，可以通过第二种方案进行排除</p>
</li>
</ul>
<h3> 实际操作</h3>
<p>按照上面的思路，我提取了DSDT和SSDT表，进行了反编译，并且找到了一些可疑的寄存器。然而，我在这里遇到了问题：风扇转速改变时，有<code>0x3E</code> <code>0x49</code> <code>0x4C</code> <code>0x4F</code> <code>0x60</code> <code>0x61</code> <code>0x64</code> <code>0x65</code> <code>0x6C</code> <code>0x6D</code>十个寄存器的值都在变化。从反编译的DSDT描述文件中，仅找到了<code>0x3E</code>寄存器的意义为<code>ThermalZone Temp</code>，其余寄存器地址在描述文件中均<strong>没有</strong>指定。相关区域代码如下所示：</p>
<details class="hint-container details"><summary>寄存器定义</summary>
<div class="language-asl line-numbers-mode" data-ext="asl"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></details>
<details class="hint-container details"><summary>包含`0x3E`寄存器的相关逻辑</summary>
<div class="language-asl line-numbers-mode" data-ext="asl"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></details>
<p>同时，这些寄存器在写的时候的行为也不稳定，大大增大了定位难度。</p>
<p>目前已经能定位到<code>0x6C</code>和<code>0x6D</code>两个寄存器组成的双字和风扇转速有很大的相关性，但是写入无效。可能的解释有两个：这是读取风扇转速的寄存器，或者手动写入风扇转速需要首先改变另一个寄存器的值。</p>
<h2> 总结</h2>
<p>相关的问题其实只会影响使用中比较小的一部分（现在遇到的问题大概就是风扇即使在CPU的温度已经接近<code>Tj max</code>的时候似乎还不会全部运作，或者是仅CPU侧风扇高速运转，GPU侧未控制到，造成睿频频率降低），整体而言还可以接受。但是还是希望官方或者硬件大佬能够为这个型号的Linux适配做出一些改进吧，同一个厂的<code>Code 01</code>的相关支持已经有了，希望这个型号（毕竟采用同方相似甚至相同的主板的机器也不少）也能做出相关适配，或者发布相关资料吧。</p>
]]></content>
    <category term="开发"/>
    <published>2021-07-30T14:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">时隔一年多的博客更新</title>
    <id>https://blog.naivetomcat.cn/pages/c55b75/</id>
    <link href="https://blog.naivetomcat.cn/pages/c55b75/"/>
    <updated>2025-01-26T09:20:56.000Z</updated>
    <summary type="html"><![CDATA[<p>时隔一年，我终于想起来自己还有个博客（其实是想办法发布自己的PGP公钥的时候才想起来）。于是借此契机把过于一年内的事情总结下吧</p>
<h2> 节目录制及播出</h2>
<p>21年录制了《超脑少年团》第一季，22年7月又被叫回去返场了两期。没什么说的，看节目就了解了。主要是认识了不少朋友，以及NanoApe大佬。</p>
<h2> CTF</h2>
<p>参加了21年的第五届强网杯青少赛，进了线下水了个二等奖；计划组织个校内面向新生的CTF，计划了一整年还没整出来；参加了陕西省总工会和西工大组织的实战攻防演练，坐了两天牢水了二等奖。</p>
<h2> 网络相关</h2>
<p>自从学校购置了深信服的深度包检测设备，教育网的DN42节点（也是我唯一的中国境内DN42路由节点）弃用；另外由于其它一些原因拉斯维加斯节点也更改了IP且退出了DN42。目前DN42网络内仅有洛杉矶节点，公网有洛杉矶、拉斯维加斯和中国香港三个节点。</p>]]></summary>
    <content type="html"><![CDATA[<p>时隔一年，我终于想起来自己还有个博客（其实是想办法发布自己的PGP公钥的时候才想起来）。于是借此契机把过于一年内的事情总结下吧</p>
<h2> 节目录制及播出</h2>
<p>21年录制了《超脑少年团》第一季，22年7月又被叫回去返场了两期。没什么说的，看节目就了解了。主要是认识了不少朋友，以及NanoApe大佬。</p>
<h2> CTF</h2>
<p>参加了21年的第五届强网杯青少赛，进了线下水了个二等奖；计划组织个校内面向新生的CTF，计划了一整年还没整出来；参加了陕西省总工会和西工大组织的实战攻防演练，坐了两天牢水了二等奖。</p>
<h2> 网络相关</h2>
<p>自从学校购置了深信服的深度包检测设备，教育网的DN42节点（也是我唯一的中国境内DN42路由节点）弃用；另外由于其它一些原因拉斯维加斯节点也更改了IP且退出了DN42。目前DN42网络内仅有洛杉矶节点，公网有洛杉矶、拉斯维加斯和中国香港三个节点。</p>
<h2> 大学生方程式赛车</h2>
<p>21年末加入了学校的方程式赛车车队，做空气动力学套件和电控系统方面的工作。21赛季线上比赛，25号车获得了二等奖；22赛季前往合肥比赛，45号车三等奖。接下来一年会继续做车队，争取23赛季冲击更好的名次。</p>
]]></content>
    <category term="随笔"/>
    <published>2022-10-14T18:57:50.000Z</published>
  </entry>
</feed>