<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>白馬空谷</title>
<link>https://blog.mcloc.cn/</link>
<atom:link href="https://blog.mcloc.cn/feed.xml" rel="self" type="application/rss+xml" />
<language>zh-CN</language>
<description>记录值得记录的</description>
<lastBuildDate>Tue, 09 Jun 2026 01:08:23 +0000</lastBuildDate>
<pubDate>Tue, 09 Jun 2026 01:08:23 +0000</pubDate>
<item>
<title>短篇小说——地球上的火星车</title>
<link>https://blog.mcloc.cn/archives/20/</link>
<guid>https://blog.mcloc.cn/archives/20/</guid>
<pubDate>Tue, 09 Jun 2026 01:08:23 +0000</pubDate>
<dc:creator>androidmumo</dc:creator>
<description><![CDATA[张远蹲在探方里，手套上全是泥。贵州的夏天闷热得像蒸笼，他抹了把汗，铁锹突然碰到了一个硬东西。“张队，有东西！”声音从探方深处传来，带着一丝发颤的紧张。张远跳下探方，蹲到那个年轻队员旁边。土层被小...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>张远蹲在探方里，手套上全是泥。贵州的夏天闷热得像蒸笼，他抹了把汗，铁锹突然碰到了一个硬东西。</p><p>“张队，有东西！”</p><p>声音从探方深处传来，带着一丝发颤的紧张。张远跳下探方，蹲到那个年轻队员旁边。土层被小心翼翼地剖开，露出一截金属表面。它已经被挤压变形，表面布满细密的裂纹，但裂纹之间残存的原始表面上，仍然能看出一种精密的加工痕迹——那种光洁度不属于任何自然地质过程。</p><p>那是2041年7月16日，下午两点四十分。</p><p>接下来的七十二小时，整个考古所都陷入了某种集体性的认知休克。随着挖掘范围扩大，那东西的全貌逐渐暴露——六条金属腿断了四条，主体结构被地层压力挤出了三道贯穿性裂缝，一根曾经指向天空的杆状结构拦腰折断。它斜插在寒武纪早期的页岩层中，那个地层形成于大约五亿四千万年前。</p><p>最初，所有人都以为这是一场闹剧。五亿多年前的地层里挖出金属造物？要么是地层扰动，要么是钻探设备带下去的现代污染物，要么就是一场精心策划的恶作剧。</p><p>然后，独立采样做了三遍，铀-铅同位素测年的结果一模一样：围岩年龄五点四一亿年，误差不超过正负三百万年。地质雷达和岩芯分析显示，该区域没有任何地层断裂或扰动的迹象。那个物体是被寒武纪的海洋沉积物一层一层埋起来的，和它周围的化石——三叶虫、奇虾、怪诞虫——属于同一个时代。</p><p>紧接着，金属成分分析结果也摆到了桌面。它是一种钛合金，含有铝、钒和少量铂族金属，配比极其精密。这种合金的配方并不违反任何已知的物理化学规律，但它的冶炼工艺远远超出了人类目前最前沿的材料科学水平。但材料的耐腐蚀性终究是有极限的——在五亿多年的地层挤压和含盐地下水浸泡中，它的内部结构已经发生了不可逆的退化。电子显微镜下的截面分析显示，晶界腐蚀已经渗透到了金属的深层，整个结构的力学完整性早已丧失殆尽。</p><p>消息被封锁了整整一个月。</p><p>一个月后，张远站在国家航天局的会议室里，面前坐着三十多个人。穿军装的、穿白大褂的、穿西装的，每个人的脸上都写着同一种表情：被巨大的认知冲击震碎之后，拼命试图重新组装自己的茫然。</p><p>“各位，”张远的声音在会议室里回荡，“我们今天要宣布一个发现。这个发现将改变我们对宇宙、对生命、对我们自身位置的全部认知。”</p><p>屏幕亮了起来。高分辨率照片出现在众人面前。</p><p>那是一辆火星车。</p><p>它的外形和人类发射到火星上的“祝融号”“毅力号”有着某种令人不安的相似——六轮摇臂结构、碟形车身、高耸的桅杆、集成的科学载荷。相似到让人几乎觉得这是某种恶毒的玩笑。但细节完全不同。它的比例不符合任何人机工程学标准，操作界面和传感器布局表明它的设计者拥有与人类截然不同的身体结构和感知方式。</p><p>“在地球上发现的火星车。”有人低声重复了一句，像是在确认自己没有听错。</p><p>“是的。”张远点了点头，切换了画面，“我们对它的科学载荷进行了分析。它搭载的成像系统使用了一种基于晶体结构的存储介质，物理上远比我们的半导体存储器稳定，但五亿年的时间还是太长了。绝大部分数据已经不可逆地损坏了。我们只恢复出了几张碎片化的图像。”</p><p>画面切换了。</p><p>会议室里安静得能听见空调的嗡鸣。</p><p>那是一张从轨道上拍摄的行星照片。照片已经严重残缺，像一幅被火烧过的挂毯，但残存的部分仍然能够辨认出蔚蓝色的海洋、白色的云层、被绿色植被覆盖的大陆。两极只有薄薄的白色冰盖。照片的右下角，有一行符号——排列整齐，结构复杂，不是地球上任何一种已知文字。</p><p>“这是十亿年前的火星，”张远说，他感觉到自己的声音也在微微发抖，“根据照片中海岸线和大气特征反推，这颗火星拥有稠密的大气层，表面平均温度大约在二十到二十五摄氏度之间，液态水覆盖了北半球三分之一的面积。它是太阳系中最适合生命存在的行星，比当时的地球更适合，也比今天的地球更宜居。”</p><p>他停顿了很长时间，才继续说下去：“它来自火星。这辆火星车，是火星智慧文明在五亿多年前发射到地球的。而它抵达的时候，这颗星球上生命的最高形式，是寒武纪海洋中的三叶虫。”</p><p>消息公布的当天，全世界陷入了一场无声的震荡。那种安静比任何喧嚣都更加可怕——八十亿人同时抬头看向天空，看向那颗红色的、死寂的邻居。</p><p>火星。古代人类把它当作战神的化身，现代人类把它当作星际殖民的备胎。而现在，这颗星球的真实面目以一种最残酷、也最温柔的方式砸到了人类脸上。</p><p>它不是备胎。它曾是摇篮。</p><p>全球各大航天机构的数据库在接下来的几个月里被从头翻了一遍。那些曾经被解释为“风蚀地貌”的沟壑，重新审视之后像极了运河网络的遗迹。那些被归类为“火山作用形成的层状岩”的结构，在高精度成像下显露出了某种非自然的几何规律——它们不是岩层，是埋藏在数亿年风沙之下的城市地基。</p><p>人类的探测器在上面跑了四十多年，从旅居者号到机遇号到好奇号到毅力号再到祝融号，每一辆都在寻找火星曾经拥有生命的证据。而答案早就埋在我们脚下的岩石里，等了我们五亿多年。</p><p>张远在发布会结束后没有离开会议室。他坐在空荡荡的座位中间，盯着屏幕上那张火星照片发呆。那颗蓝色的火星在黑色的宇宙背景中安静地悬浮着，美得不像话。它的云层正在海洋上空形成漩涡，它的海岸线蜿蜒曲折，像一只伸向海洋的手。</p><p>他的目光落在那行符号上。</p><p>符号一共有七个。前三个结构复杂，具有象形特征；后四个则带有明显的几何性，像是某种坐标系统。全世界最顶尖的语言学家、密码学家、符号学家和数学家都扑在了这行符号上，但毫无头绪。时间的鸿沟太大了。五亿年的间隔足以抹去一切直接解读的可能。</p><p>但张远总觉得这些符号的形状有些眼熟。</p><p>那种眼熟不是来自考古学的训练，而是一种更加底层的、更加本能的熟悉感，像是你在异国他乡的街头突然听到了一句家乡话，身体先于大脑做出了反应。</p><p>一个星期后，凌晨三点，张远从床上弹了起来。</p><p>他光着脚冲进书房，翻出那行符号的高清打印件，又翻出了一本厚厚的地质图集。他的手在颤抖。他把符号的照片叠在地质图上，对着台灯的光仔细端详。</p><p>汗从他的额头上滚下来。</p><p>那七个符号，根本不是文字。</p><p>它是地图。</p><p>第一个符号，代表海岸线。第二个符号，代表一条河流的走向。第三个符号，代表一片高原的轮廓。后四个符号——前三个是一组三维坐标，最后一个是深度标尺。把这组坐标套在地球的版图上，那个位置——</p><p>张远瘫坐在椅子上。</p><p>那个位置在今天的非洲东南部，莫桑比克海峡的底部。在五亿多年前的寒武纪，那片区域是一片浅海大陆架，阳光充足，营养物质丰富，是当时地球原始海洋中生命活动最活跃的区域之一——也是后来寒武纪生命大爆发的核心地带。</p><p>火星人没有给地球送来一辆探测器。</p><p>它们送来的是一艘播种船。</p><p>科学家们重新对那根折断的杆状结构进行了高分辨率X射线断层扫描，在它的内部发现了一个空腔。空腔的内壁由多层交替的有机材料和无机材料构成，结构极其复杂——外层是烧蚀防护层，内层是密封隔离层，最内层是一个极薄的、已经碎裂的生物样本舱。在空腔的最深处，残留着极其微量的有机分子。经过质谱分析和手性检测，这些分子是一类类似于氨基酸的化合物，但它们的碳骨架结构和手性特征与地球上所有已知生命使用的氨基酸都不完全相同。</p><p>那根杆不是桅杆。它是某种生物样本释放装置的喷射口。多层交替结构是保护性的密封层，设计用来在穿越大气层时逐层烧蚀，保护内部封存的生物样本。它的工程逻辑和人类设计的返回舱热防护系统在原理上如出一辙。</p><p>十亿年前，火星文明站在自己的星球上，凝望着天空。他们已经掌握了行星科学和天体生物学的核心规律——生命在银河系中极其罕见，智慧文明更是近乎于无。他们向邻近的几颗行星都发射了探测器，金星太热，温室效应失控；水星太小，没有大气层；木星和土星是气态巨行星；它们的卫星又太过寒冷。只有那颗蓝色的第三行星，温度适宜，液态水丰富，大气成分稳定。唯一的遗憾是，那里的生命还停留在最原始的单细胞和简单多细胞阶段。</p><p>但火星文明已经没有时间了。他们的星球正在死去——磁场持续衰减，太阳风不断剥离大气层，海洋在蒸发，气候在失控。他们知道自己的文明终将消亡，就像所有孤悬于宇宙中的文明终将消亡一样。</p><p>他们做出了一个决定。这个决定带着一种地球上任何神话都无法比拟的悲壮——他们决定在自己消亡之前，把文明的火种播撒到那颗年轻的星球上。</p><p>不是殖民。不是入侵。</p><p>是延续。</p><p>他们很清楚，跨越数千万乃至数亿年的时间鸿沟，任何直接的信息传递都是徒劳的。探测器会损毁——再精密的合金也抵抗不了五亿年的地层挤压和化学侵蚀；数据会丢失——再稳定的存储介质也撑不过地质时间尺度；语言会失效——没有任何符号系统能够跨越亿年的文明断层而被直接理解。唯一能够穿越时间的载体只有一个——</p><p>生命本身。</p><p>他们改造了自己星球上微生物的基因组。</p><p>这是整个计划中最天才也最疯狂的部分。DNA——或者说火星版本的遗传物质——是一种天然的信息存储系统。它的存储密度远远超过任何人造介质，而且它自带复制、修复和进化能力。只要环境合适，它就能一直存续下去，跨越地质时间尺度。那些被编码在基因序列中的信息，会在未来的某一天，被携带它的后代物种以某种方式重新读取出来。</p><p>他们没有把信息刻在石头上。他们把它写进了生命的源代码里。</p><p>那艘播种船在五亿多年前抵达地球，坠入了寒武纪的浅海。它的主体结构在撞击和后续的地层挤压中逐步碎裂，生物释放装置的密封层按照设计逐层降解，将携带火星基因的微生物释放到了地球海洋中。这些微生物与地球上原始的蓝藻和真核生物发生了大规模的基因水平转移。</p><p>寒武纪生命大爆发。</p><p>古生物学界争论了一百多年的最大谜题：为什么在寒武纪早期，地球上的生命形式会在短短两千万年内，从简单的单细胞和软体多细胞生物，突然爆发性地演化出几乎所有现代动物门类的祖先？达尔文的自然选择理论从未完美地解释这个爆发的速度和规模。</p><p>现在，答案就在那张照片里。</p><p>火星生命的基因片段，像一场跨越星际的种子雨，落入了地球的原始基因池。它们携带的遗传信息通过基因水平转移进入地球生物的基因组，极大地加速了演化进程，甚至直接参与塑造了某些关键的门类特征。寒武纪大爆发的真正推动力是——地球生命获得了一套来自火星的遗传工具箱。</p><p>张远坐在地板上，窗外已经泛起了鱼肚白。他低头看了很久那张符号的照片。</p><p>他的眼眶有些发热。</p><p>他不是个感性的人。二十多年的野外考古，他亲手挖出过无数文明的遗迹，也亲手记录过无数曾经辉煌、最终归于尘土的证据。他以为自己早就对“消亡”这件事免疫了。但此刻，他想到了那些火星人。</p><p>他们站在十亿年前的火星上，头顶是蓝色的天空，脚下是温润的海岸。他们的城市一定很壮观，他们的文明一定很灿烂，他们仰望星空的热情一定不比现在的人类少。然后他们发现火星的磁场正在衰减，太阳风正在剥离大气层，海洋正在蒸发。他们知道了自己的星球正在死去。</p><p>然后他们看到了那颗蓝色的第三行星。</p><p>他们做出了选择。</p><p>他们把自己文明的未来，托付给了另一颗星球上的原始海洋。</p><p>十亿年后，那些原始海洋中的单细胞生物的后代变成了直立行走的灵长类。这些灵长类造出了宇宙飞船，飞到了那颗红色的、已经死去的星球上，插上一面旗子，说：“我们来寻找火星生命。”</p><p>火星生命就在他们自己的细胞里。</p><p>他们的线粒体里可能携带着火星基因的残片。他们胚胎发育的信号通路中可能嵌入了火星遗传程序的片段。他们大脑神经元放电的模式，可能暗含着火星认知结构的回响。</p><p>人类的每一次仰望星空，每一次在深夜里感受到的那种莫名的、仿佛来自远方的召唤——可能都不仅仅是一种文学修辞。</p><p>那是跨越十亿年的遗传记忆在回响。</p><p>那些符号的含义，在十年后的一个深夜被最终破译。破译的关键来自一个完全意想不到的方向——不是语言学，不是密码学，而是发育生物学。一位研究胚胎发育的科学家发现，那些符号的结构和某种高度保守的同源异形基因的调控序列在拓扑结构上存在惊人的对应关系。这不是巧合。火星人没有使用线性文字。他们使用的是一种基于基因调控网络拓扑结构的信息编码系统——一种任何基于DNA的生命在进化到足够复杂度之后都能本能地理解的语言。</p><p>当算法完成了最后的解码时，一段信息被还原出来。</p><p>只有一句话。</p><p>“我们曾是你们。你们将是我们。记住这一切。”</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.mcloc.cn/archives/20/#comments</comments>
<wfw:commentRss>https://blog.mcloc.cn/feed.xml</wfw:commentRss>
</item>
<item>
<title>1Panel续签证书后推送到多吉云</title>
<link>https://blog.mcloc.cn/archives/17/</link>
<guid>https://blog.mcloc.cn/archives/17/</guid>
<pubDate>Tue, 05 Aug 2025 12:53:00 +0000</pubDate>
<dc:creator>androidmumo</dc:creator>
<description><![CDATA[在1panel的证书中勾选“推送证书到本地目录”和“申请证书之后执行脚本”。然后在脚本内容一栏中填入以下脚本，记得替换脚本中的【多吉云 AccessKey 和 SecretKey】、【需要绑定的...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>在1panel的证书中勾选“推送证书到本地目录”和“申请证书之后执行脚本”。</p><p>然后在脚本内容一栏中填入以下脚本，记得替换脚本中的【多吉云 AccessKey 和 SecretKey】、【需要绑定的域名列表】，其他根据需要配置即可。</p><pre><code>#!/bin/bash

# 多吉云 AccessKey 和 SecretKey
ACCESS_KEY=&quot;AccessKey&quot;
SECRET_KEY=&quot;SecretKey&quot;

# SSL 证书路径
FULLCHAIN_PATH=&quot;./fullchain.pem&quot;
PRIVKEY_PATH=&quot;./privkey.pem&quot;

# 证书备注名
CURRENT_DATE=$(date +&quot;%y/%m/%d&quot;)
NOTE=&quot;Certificate $CURRENT_DATE&quot;

# 需要绑定的域名列表
DOMAINS=(&quot;www.example.cn&quot; &quot;blog.example.cn&quot; &quot;bing.example.cn&quot;)

# 是否删除旧证书
DELETE_OLD_CERT=false

ACCESS_TOKEN_CACHE=&quot;&quot;

# 生成AccessToken
function generateAccessToken() {
    local apiPath=&quot;$1&quot;
    local body=&quot;$2&quot;

    if [ -z &quot;$ACCESS_TOKEN_CACHE&quot; ]; then
        local signStr=$(echo -e &quot;${apiPath}\n${body}&quot;)
        local sign=$(echo -n &quot;$signStr&quot; | openssl dgst -sha1 -hmac &quot;$SECRET_KEY&quot; | awk '{print $NF}')
        ACCESS_TOKEN_CACHE=&quot;$ACCESS_KEY:$sign&quot;
    fi

    echo &quot;$ACCESS_TOKEN_CACHE&quot;
}

function parallelRequest() {
    local url=&quot;$1&quot;
    local body=&quot;$2&quot;
    local apiPath=&quot;$3&quot;
    local accessToken=$(generateAccessToken &quot;$apiPath&quot; &quot;$body&quot;)

    curl -s -X POST &quot;$url&quot; \
        -H &quot;Authorization: TOKEN $accessToken&quot; \
        -H &quot;Content-Type: application/x-www-form-urlencoded&quot; \
        --data &quot;$body&quot;
}

# 获取域名当前绑定的证书ID
function getCurrentCertId() {
    local domain=&quot;$1&quot;
    local body=&quot;domain=$domain&quot;
    local apiPath=&quot;/cdn/domain/info.json&quot;
    local response=$(parallelRequest &quot;https://api.dogecloud.com/cdn/domain/info.json&quot; &quot;$body&quot; &quot;$apiPath&quot;)

    local code=$(echo &quot;$response&quot; | jq -r '.code')
    if [ &quot;$code&quot; -eq 200 ]; then
        echo &quot;$(echo &quot;$response&quot; | jq -r '.data.cert_id')&quot;
    else
        echo &quot;&quot;
    fi
}

# 删除证书
function deleteCert() {
    local certId=&quot;$1&quot;
    local body=&quot;id=$certId&quot;
    local apiPath=&quot;/cdn/cert/delete.json&quot;
    local response=$(parallelRequest &quot;https://api.dogecloud.com/cdn/cert/delete.json&quot; &quot;$body&quot; &quot;$apiPath&quot;)

    local code=$(echo &quot;$response&quot; | jq -r '.code')
    if [ &quot;$code&quot; -eq 200 ]; then
        echo &quot;证书ID $certId 删除成功。&quot;
    else
        local errMsg=$(echo &quot;$response&quot; | jq -r '.msg')
        echo &quot;证书ID $certId 删除失败，错误代码：$code，错误信息：$errMsg&quot;
    fi
}

# 上传证书到多吉云
function uploadCert() {
    local note=&quot;$1&quot;
    local certFile=&quot;$2&quot;
    local privateKeyFile=&quot;$3&quot;

    local certContent=$(&lt;&quot;$certFile&quot;)
    local privateKeyContent=$(&lt;&quot;$privateKeyFile&quot;)
    local encodedCert=$(echo &quot;$certContent&quot; | jq -sRr @uri)
    local encodedPrivateKey=$(echo &quot;$privateKeyContent&quot; | jq -sRr @uri)

    local body=&quot;note=$note&amp;cert=$encodedCert&amp;private=$encodedPrivateKey&quot;
    local apiPath=&quot;/cdn/cert/upload.json&quot;
    local response=$(parallelRequest &quot;https://api.dogecloud.com/cdn/cert/upload.json&quot; &quot;$body&quot; &quot;$apiPath&quot;)

    local code=$(echo &quot;$response&quot; | jq -r '.code')
    if [ &quot;$code&quot; -eq 200 ]; then
        echo &quot;证书上传成功！&quot;
        local certId=$(echo &quot;$response&quot; | jq -r '.data.id')
        echo &quot;证书ID：$certId&quot;
        bindCert &quot;$certId&quot;
    else
        local errMsg=$(echo &quot;$response&quot; | jq -r '.msg')
        echo &quot;证书上传失败，错误代码：$code，错误信息：$errMsg&quot;
    fi
}

# 绑定证书到域名
function bindCert() {
    local certId=&quot;$1&quot;
    declare -A oldCertIdsMap=()

    # 获取每个域名当前绑定的证书ID
    for domain in &quot;${DOMAINS[@]}&quot;; do
        local currentCertId=$(getCurrentCertId &quot;$domain&quot;)
        if [ -n &quot;$currentCertId&quot; ]; then
            oldCertIdsMap[&quot;$currentCertId&quot;]=1
        fi
    done

    # 绑定新证书
    for domain in &quot;${DOMAINS[@]}&quot;; do
        (
            local body=&quot;id=$certId&amp;domain=$domain&quot;
            local apiPath=&quot;/cdn/cert/bind.json&quot;
            local response=$(parallelRequest &quot;https://api.dogecloud.com/cdn/cert/bind.json&quot; &quot;$body&quot; &quot;$apiPath&quot;)

            local code=$(echo &quot;$response&quot; | jq -r '.code')
            if [ &quot;$code&quot; -eq 200 ]; then
                echo &quot;证书已成功绑定到 $domain&quot;
            else
                local errMsg=$(echo &quot;$response&quot; | jq -r '.msg')
                echo &quot;绑定证书到 $domain 失败，错误代码：$code，错误信息：$errMsg&quot;
            fi
        ) &amp;
    done
    wait

    if [ &quot;$DELETE_OLD_CERT&quot; = true ]; then
        for oldCertId in &quot;${!oldCertIdsMap[@]}&quot;; do
            if [ &quot;$oldCertId&quot; != &quot;$certId&quot; ]; then
                deleteCert &quot;$oldCertId&quot;
            fi
        done
    fi
}

uploadCert &quot;$NOTE&quot; &quot;$FULLCHAIN_PATH&quot; &quot;$PRIVKEY_PATH&quot;

</code></pre>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.mcloc.cn/archives/17/#comments</comments>
<wfw:commentRss>https://blog.mcloc.cn/feed.xml</wfw:commentRss>
</item>
<item>
<title>圆周率终结者</title>
<link>https://blog.mcloc.cn/archives/18/</link>
<guid>https://blog.mcloc.cn/archives/18/</guid>
<pubDate>Tue, 05 Aug 2025 02:01:00 +0000</pubDate>
<dc:creator>androidmumo</dc:creator>
<description><![CDATA[某天突然有了灵感，构思了一篇小说。正文如下。圆周率终结者作为超算中心主任，我习惯用计算圆周率来测试新机器。 42小时后，系统报错：硬件无异常，但圆周率第4200万亿位后全部归零。 重启后相同时间...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>某天突然有了灵感，构思了一篇小说。正文如下。</p><h2>圆周率终结者</h2><p>作为超算中心主任，我习惯用计算圆周率来测试新机器。 42小时后，系统报错：硬件无异常，但圆周率第4200万亿位后全部归零。 重启后相同时间再次报错，结果依旧全零。 北美与南极超算中心同步计算，三地数据比对证实：圆周率确实在第4200万亿位后终止。 运输70PB硬盘横跨大陆与海洋时，押运车队遭遇暴雨塌方。 当所有数据比对完毕，整个中心陷入死寂。 原来宇宙存在最小尺度，圆只是4200万亿边形。 我攥着女儿送的圆周率钥匙扣，看着窗外初升的朝阳，第一次怀疑太阳是否真的圆形。</p><p>测试新机器，我向来只用一招——圆周率。</p><p>新落成的“鸿蒙之心”在深埋地下的巨大机房里嗡鸣着，像一头沉睡的金属巨兽刚刚苏醒，冰冷的蓝光在无数机柜的缝隙间流淌。空气里弥漫着臭氧和新塑料的混合气味，还有那股无处不在的、属于超级算力的低音炮般的震动，透过鞋底直抵骨髓。我，林远，这座耗资天文数字打造的全球最强超算中心的年轻主任，正百无聊赖地陷在控制台宽大的椅子里，指尖在手机屏幕上机械地划拉着某个弱智小游戏。屏幕上色彩艳丽的方块无意义地堆叠、消除，发出廉价的音效，像是对这满室尖端科技的无声嘲讽。</p><p>“鸿蒙之心”的首次全负荷压力测试，我给它下达的指令是计算π——那个无理数的老祖宗，无限不循环的圆周率。这活儿它干得正欢，巨大的算力洪流冲刷着这个古老而永恒的数学谜题，已经持续了42小时。屏幕一侧，实时跳动的数字瀑布流般倾泻而下，记录着它吞噬和解析宇宙基本奥秘的进程。一切看起来完美无缺，平稳得让人昏昏欲睡。</p><p>就在我操纵的小人又一次愚蠢地撞上障碍物时，一个声音尖锐地撕破了机房的低鸣。</p><p>“呜——呜——呜——”</p><p>是系统核心级别的红色警报！瞬间，我的手机差点脱手飞出。心脏猛地一缩，像被一只冰冷的手攥紧。又是硬件故障？这群娇贵的祖宗！我几乎是撞开椅子扑到主控台前，指尖带着尚未消散的游戏余温，粗暴地敲击着冰冷的键盘。屏幕瞬间切换，刺眼的红色报警框弹了出来：“计算错误——结果校验失败”。</p><p>“又来了！”我低声咒骂，转身冲向旁边那间布满屏幕的硬件监测室。墙壁上巨大的监控阵列忠实地显示着“鸿蒙之心”内部每一个角落：CPU温度曲线平缓如静水，内存占用稳定得毫无波澜，硬盘指示灯规律地闪烁着健康的绿光，网络吞吐量数据在预定范围内轻微起伏……所有指标，一片祥和。这见鬼的先进监控系统，永远在最关键的时刻掉链子，像个聋哑的哨兵。“最贵的监测，查不出最贵的毛病，还得靠人！”我烦躁地抓了把头发，对着空气吼了一句，声音在空旷的监测室里显得格外突兀。</p><p>接下来的几小时，成了枯燥、重复、徒劳的体力劳动。我和几个闻讯赶来的工程师一头扎进机柜森林的深处。空气调节系统似乎也感知到了紧张，冷气开得更足，吹得人后颈发凉。我们拿着强光手电，在蛛网般密集的光纤和数据线丛中艰难穿行，逐一检查每一个接口、每一块板卡的状态指示灯，用万用表测量关键节点的电压电流。扳手、螺丝刀、诊断仪器的嘀嗒声混杂着粗重的呼吸。汗水顺着鬓角滑落，滴在冰冷的金属机柜上。然而，每一次排查的结果都指向同一个方向：一切正常。硬件，这个庞大躯体的骨骼和血管，健康得无可挑剔。</p><p>“见鬼了！”我抹了把额头的汗，背靠着一个发出低沉嗡鸣的机柜，冰冷的金属触感透过薄薄的衬衫传来，“难道是软件抽风？”这个念头像一根救命稻草。我们立刻折返控制室，调出计算程序的每一行日志，检查每一个依赖库的版本，反复比对运行环境配置。时间在代码的海洋里无声流逝。屏幕上滚动的字符像无数只冰冷的眼睛。最终，负责核心算法的工程师抬起头，镜片后的眼神同样充满困惑：“林主任，程序逻辑和运行环境……都没问题。日志里没有任何异常中断或内存溢出。”</p><p>绝望像冰冷的潮水，悄无声息地漫过脚踝。只剩下最后那简单粗暴却往往有效的万能钥匙了。</p><p>“重启。”我的声音带着一种近乎自暴自弃的疲惫，“全部节点，冷启动。”</p><p>庞大的系统被强行拉闸。低沉的嗡鸣如同潮水般退去，机房陷入一种令人心悸的、绝对的死寂。几秒后，指示灯如同星辰般逐一点亮，嗡鸣声由弱渐强，重新汇聚成那熟悉的力量之音。瀑布般的π值重新开始流淌在屏幕上。机房又活了过来，像一头巨兽沉入了稳定的呼吸。</p><p>我长长吐出一口气，仿佛要把胸腔里淤积的烦躁和不安都挤出去。疲惫像沉重的铅块拖拽着四肢。我把自己扔回办公室那张还算舒适的转椅里，心想，这该死的42小时魔咒，总该被打破了吧？</p><p>时间，像一个恶作剧的孩子，精准地再次拨动了42小时的沙漏。</p><p>“呜——呜——呜——”</p><p>那熟悉的、如同丧钟般的警报声，毫无征兆地再次撕裂了刚刚恢复平静的空气。这一次，它像一根烧红的钢针，猛地刺穿了我的耳膜，直插进大脑深处。我猛地从椅子上弹起来，椅子腿在地板上刮出刺耳的尖叫。一股混杂着难以置信和被愚弄的暴怒瞬间冲上头顶，烧得我太阳穴突突直跳。</p><p>“操！”粗话脱口而出，拳头狠狠砸在硬木桌面上，震得显示器都晃了一下。我像一头被激怒的困兽，冲回控制台，手指带着压抑的怒火在键盘上翻飞，几乎是砸下去的。屏幕上，那该死的红色报警框再一次狰狞地弹了出来，像一张无声嘲笑的鬼脸。</p><p>排障程序再次被启动，冷酷无情地在“鸿蒙之心”的庞大躯体里扫描。结果冷酷地跳了出来，如同命运冰冷的判决：“所有硬件状态：正常。所有软件进程：运行中。系统资源：充足。”</p><p>“正常？正常个屁！”我对着屏幕低吼，声音嘶哑，一拳又砸在控制台的金属边缘，指关节传来一阵钝痛。这巨大的机器，这耗尽了无数人心血的结晶，像个狡猾的骗子，一边展示着完美的健康报告，一边发出刺耳的死亡警告。这巨大的悖论像一只无形的手，扼住了我的喉咙，让我几乎喘不过气。愤怒的火焰在胸腔里左冲右突，无处发泄。</p><p>就在这极度的烦躁中，我的视线无意间扫过旁边一块监控计算结果的副屏——上面显示着刚刚被系统标记为“错误”而中断的那一串π值。那串数字……不对劲！它们不再是杂乱无章、永不重复的海洋。屏幕的末端，触目惊心，长长的一串，全部是同一个冰冷的符号：</p><p>0</p><p>不是几个，不是几十个，而是整整一大片，密密麻麻，如同雪崩后覆盖一切的苍白死寂。无数个“0”，像一排排没有瞳孔的眼睛，空洞地回望着我。一股寒意，比机房空调冷气更刺骨百倍，瞬间从尾椎骨窜起，沿着脊椎一路炸开，直冲头顶。</p><p>我猛地扑到另一台终端前，手指因为某种巨大的、不祥的预感而微微颤抖。我调出上一次报错中断时的计算结果记录。屏幕滚动，两串数据流被并排放在一起。我的目光像扫描仪一样疯狂地来回比对，寻找着任何细微的差异。心跳在死寂的机房里如擂鼓般轰鸣。</p><p>没有差异。</p><p>从上一次中断点的前一位开始，到这次被标记为错误的地方结束，两段跨越了42小时、耗费了“鸿蒙之心”海量算力得出的结果——完全一致！ 而在这两次计算结果的末尾，在那精确得令人毛骨悚然的第 4,200,000,000,000,000 位之后，那串无穷无尽、象征着无理数本质的数字，消失了。取而代之的，是令人绝望的、无边无际的零的荒漠。</p><p>巧合？程序错误？我的理智在尖叫着否认。连续1000个零？这概率比宇宙大爆炸的奇点还要渺茫！我强压着那股几乎要把人冻僵的寒意，强迫自己冷静下来。也许是校验程序太敏感了？我敲下指令，让π计算程序忽略当前结果，强制继续运行，看看后续的数字。</p><p>控制室陷入一种令人窒息的寂静。只有机柜深处风扇的嗡鸣还在持续，此刻却显得异常遥远。所有人的目光都死死盯住了那块显示实时计算结果的屏幕。时间一分一秒过去，像粘稠的胶水。屏幕上，代表新计算出的π值数字位，一个接一个地刷新出来。</p><p>0。</p><p>0。</p><p>0……</p><p>依旧是零。一个接一个，冷酷、单调、无穷无尽。整整一个小时过去了，屏幕上的数字瀑布，彻底凝固成了一片死寂的白色沙漠——除了零，什么都没有。仿佛宇宙的数学根基，在那个精确到令人发指的位置，被一把无形的巨刃齐刷刷斩断。空气凝固了，呼吸都带着冰碴。我扶着冰冷的控制台边缘，指关节因为过度用力而失去血色。冷汗浸透了衬衫的后背，黏腻地贴在皮肤上。恐惧，不再是模糊的预感，而是冰冷的实体，沉重地压在心口。</p><p>如果……如果这是真的……如果圆周率……真的被算尽了……这个念头像一道无声的惊雷，在我一片混乱的脑海中炸开，留下空白和战栗。那意味着什么？我不敢想，或者说，我的思维本能地逃避着那个深渊般的结论。</p><p>“连线！”我的声音嘶哑得不像自己的，“给我接北美‘泰坦之脊’的霍华德！还有南极‘冰点’的索菲亚！最高加密信道，立刻！”</p><p>巨大的主屏幕上迅速分割出两个窗口。霍华德那张总是带着点玩世不恭的脸出现在左边，背景是熟悉的“泰坦之脊”控制室；右边窗口亮起，索菲亚·罗曼诺夫清冷严肃的面容浮现出来，她身后的窗外是南极洲亘古不变的白色荒原和呼啸的风雪。</p><p>“林？这时间点……”霍华德的声音带着一丝被打扰的不悦和刚睡醒的沙哑，但看清我的脸色后，他立刻收起了调侃，“见鬼，你脸色白得像幽灵。出什么事了？”</p><p>“霍华德，索菲亚，”我深吸一口气，试图让声音平稳，但每个字都像从冰窖里捞出来一样，“听着，这可能是我这辈子说过最疯狂的话。但‘鸿蒙之心’在计算π时……在精确的第4.2千万亿位之后……”我艰难地吞咽了一下，“……算出来的全是零。连续不断，无法解释的零。我们重启过，检查过硬件软件，一切正常。但42小时后，历史重演，结果完全一致。”</p><p>屏幕上的两张脸，瞬间凝固了。霍华德嘴角那点残留的睡意彻底消失，眼睛瞪得溜圆，仿佛听到了宇宙终结的预言。索菲亚那双冰蓝色的眸子骤然收缩，锐利得如同极地的冰锥，死死钉在屏幕上我的影像。死一般的沉默通过高速光纤在三大洲之间弥漫开来，只有设备低沉的嗡鸣在各自的空间里回响。</p><p>“林，”索菲亚率先开口，声音冷得像南极的岩石，带着不容置疑的权威，“你确定？不是程序错误？不是数据溢出？不是……某种我们无法理解的硬件故障？”她每一个词都像冰珠砸在地上。</p><p>“我们查了所有能查的，索菲亚。所有！”我的声音带着一丝绝望的颤抖，“它就在那里，那个该死的‘0’的边界！我需要你们的帮助。我需要你们在各自的超算上，重新计算π，目标位——4.2千万亿零1万亿位。我们需要交叉验证！”我报出了那个精确到令人头皮发麻的数字。</p><p>霍华德用力搓了把脸，仿佛要把这个疯狂的消息搓掉：“老天……这要是真的……林，你清楚这意味着什么吗？”</p><p>“我知道。”我的声音低沉下去，“但我们必须知道真相。不管它是什么。”</p><p>索菲亚沉默了几秒，她的目光似乎穿透了屏幕，穿透了大陆和海洋，在审视我灵魂深处的恐慌。“‘冰点’下一段大规模并行任务窗口在72小时后开启。我会安排。”她的声音依旧冰冷，但多了一丝凝重，“数据生成后，如何比对？跨洋传输70PB的原始数据？这不可能，时间、带宽、安全都是噩梦。”</p><p>“物理运输。”我斩钉截铁地说，“把你们计算完成的数据存储阵列，整个运过来。运到‘鸿蒙之心’。”</p><p>“70PB？物理运输？”霍华德倒抽一口冷气，“林，那玩意儿不是几块移动硬盘！那是几百台塞满硬盘的服务器架子！每一台都重得要死，娇贵得像博物馆里的古董！从北美到这儿，从南极到这儿？你疯了！”</p><p>“我们没有选择！”我的声音陡然拔高，带着一种破釜沉舟的决绝，“这是唯一能确认我们是否还活在原来那个宇宙里的办法！是圆周率终结了，还是我们的脑子集体坏掉了！霍华德！索菲亚！”</p><p>又是一阵令人窒息的沉默。屏幕上的两人对视了一眼（尽管隔着屏幕），那眼神里充满了惊涛骇浪。最终，霍华德重重地叹了口气，肩膀垮了下来：“好吧，疯子。我赌上‘泰坦之脊’的荣誉陪你疯一次。我这就去协调资源，把那些该死的‘铁棺材’准备好。”</p><p>索菲亚微微颔首，她身后的风雪似乎更猛烈了。“‘冰点’同意。运输方案和极端环境防护措施，我会亲自过问。上帝保佑那些硬盘。”她的话音里，听不出丝毫“保佑”的意味，只有冰冷的决心。</p><p>跨越大洋与大陆的数据朝圣之旅开始了，其艰难远超任何人的想象。</p><p>北美方向的车队规模庞大得如同军事行动。近二十辆经过特殊改装的恒温防震重型卡车，装载着封装在独立抗震恒温机箱里的数百个存储节点，在武装押运车的护卫下，像一条钢铁巨蟒，缓缓驶离“泰坦之脊”。每个机箱都闪烁着微弱的运行指示灯，里面是北美大陆计算出的关于宇宙本质的冰冷答案。车队穿越广袤的北美平原时，天空阴沉得如同铅块。起初只是稀疏的雨点砸在防弹车窗上，很快便演变成一场倾盆的、仿佛要淹没世界的暴雨。雨刷器疯狂地左右摇摆，前方能见度骤降到不足百米。车轮碾过积水，激起浑浊的水墙。</p><p>就在车队艰难地驶入一段盘山公路时，灾难降临了。前方山体传来一阵低沉的、令人心悸的轰鸣，盖过了暴雨的喧嚣和卡车的引擎声。“塌方！前方塌方！”对讲机里传来头车押运员嘶哑变调的吼叫，瞬间被巨大的山石滚落、撞击路面的轰隆声淹没。巨大的岩石裹挟着泥浆和折断的树木，如同失控的巨兽，咆哮着从陡峭的山坡上冲下，瞬间截断了道路！头车在千钧一发之际刹住，后面长长的车队在湿滑的路面上发出刺耳的摩擦声，险之又险地停了下来，车距近得几乎首尾相接。</p><p>时间仿佛凝固了。雨水无情地冲刷着卡车冰冷的外壳，也冲刷着挡在路上的、那些如同小山般的泥石混合物。通讯频道里一片死寂，只有粗重的喘息和外面狂暴的雨声。每一秒都像一个世纪那么漫长。每一块硬盘的指示灯闪烁，都牵动着在场所有人紧绷到极致的神经。后续的工程救援队伍在暴雨和塌方的双重阻隔下，花了整整十三个令人崩溃的小时才艰难抵达并清理出一条仅容单车通过的狭窄通道。这十三个小时里，负责押运的技术主管，一个平日里极其沉稳的中年人，一直死死盯着监控存储阵列内部环境参数的屏幕，指尖把控制台的边缘捏得发白，仿佛只要他意志够坚定，那些硬盘就能安然无恙。当车队终于再次缓缓启动，碾过那片狼藉的塌方区时，所有人都如同虚脱般瘫在座位上，冷汗和雨水混在一起。</p><p>南极的旅程则是另一场与冰海和孤寂的搏斗。“冰点”中心的数据阵列被小心翼翼地装入特制的、能抵御零下五十度严寒和超高湿度的恒温抗压集装箱，由重型破冰船“极光号”承载，驶离了那片永恒的白色大陆。船体破开灰蓝色的浮冰，发出沉闷而持续的撞击声。航程的大部分时间笼罩在南大洋特有的、浓得化不开的灰色海雾之中，能见度极低。导航雷达的屏幕上，除了代表自己船体的光点，就是一片象征未知的、令人不安的灰白噪点。</p><p>某个深夜，船身猛地一震，伴随着一声悠长而沉重的金属摩擦呻吟。刺耳的警报瞬间响彻船舱！“冰山！右舷擦碰！检查船体！检查货舱！”船长的吼声通过广播传来，带着一丝不易察觉的紧张。索菲亚·罗曼诺夫几乎是冲出了休息室，冰冷的脸上没有任何表情，只有眼底深处燃烧着一点寒星般的意志。她直奔货舱。特制的集装箱在撞击中发出沉闷的回响，但结构安然无恙。内部的恒温系统指示灯顽强地亮着绿色。然而，撞击点附近船体钢板的呻吟声，如同悬在头顶的达摩克利斯之剑，让随船的技术人员彻夜难眠，紧张地监控着每一个可能预示灾难的参数。直到破冰船有惊无险地驶入相对温暖安全的海域，那令人窒息的压力才稍稍缓解，但空气中依然弥漫着劫后余生的紧绷感。</p><p>当两支历经磨难的运输队伍终于将那些承载着宇宙秘密的“铁棺材”运抵“鸿蒙之心”深埋地下的堡垒时，时间已悄然滑过半个月。巨大的地下机库被临时清空，三组分别来自东亚、北美、南极的庞大存储阵列如同三座沉默的钢铁方碑，呈三角之势矗立着。无数粗壮的光纤如同巨兽的血管，将它们与“鸿蒙之心”的核心计算网络连接起来。空气中充满了高频数据传输时特有的、几乎听不见却又能让人牙齿发酸的电磁嗡鸣。</p><p>真正的挑战才刚刚开始。超过70PB的原始数据！这需要动用“鸿蒙之心”几乎全部的可用算力，运行专门编写的、极其复杂的比对程序。控制中心的气氛凝重到了极点。巨大的环形屏幕上，三组数据流如同三条来自不同时空的星河，被精密地同步、切割、放大、比对。屏幕上滚动着瀑布般的十六进制代码和比对结果标记。进度条缓慢地、极其缓慢地向前爬行，像一个在无尽沙漠中跋涉的旅人。</p><p>0.1%… 0.5%… 1%…</p><p>时间失去了意义。我们轮班值守，困了就裹着毯子在控制室角落的椅子上蜷一会儿，饿了就胡乱塞几口冰冷的速食。眼睛布满血丝，盯着屏幕上那慢得令人绝望的进度。每一寸数据的推进，都像在未知的深渊边缘试探。焦虑像藤蔓一样缠绕着每一个人。霍华德顶着两个巨大的黑眼圈，不停地来回踱步，嘴里念念有词。索菲亚则像一座冰雕，一动不动地坐在她的终端前，只有指尖偶尔在键盘上轻点一下，查看某个底层日志。我站在主控台前，感觉心脏被一只无形的手紧紧攥住，每一次跳动都牵扯着沉重的窒息感。</p><p>终于，在经历了连续三天三夜不眠不休的煎熬后，进度条挣扎着，顽强地越过了99.999%的门槛。</p><p>“比对最终段…启动！”负责程序的首席工程师声音嘶哑地宣布，手指悬在回车键上方，微微颤抖。</p><p>所有人的目光，无论是站着、坐着、还是半躺着的人，瞬间如同被磁石吸引，死死钉在了那块最大的主屏幕上。三条数据流被放大到极限，精确地定位在第4.2千万亿位那个决定命运的点。</p><p>屏幕猛地闪烁了一下，刺眼的白光几乎让人短暂失明。</p><p>下一秒，比对结果如同审判的烙印，被巨大的、鲜红的字体标注出来：</p><p>【数据区块：4200000000000000 - 4201000000000000】 【比对结果：完全一致】 【序列特征：全零序列】</p><p>死寂。</p><p>绝对的、真空般的死寂瞬间吞噬了整个空间。</p><p>那庞大机柜森林发出的、永不停歇的低沉嗡鸣，仿佛被一只无形的巨手骤然扼住喉咙，彻底消失了。空气凝固了，沉重得如同水银，压迫着耳膜，压迫着胸腔。连呼吸声都听不见。时间本身似乎也停止了流动。</p><p>霍华德张着嘴，保持着那个想要惊呼的姿势，却发不出任何声音，脸上血色褪尽。索菲亚·罗曼诺夫挺得笔直的背脊第一次显出一丝不易察觉的佝偻，她放在控制台上的手，指节捏得惨白，微微颤抖着。我站在原地，感觉脚下的地面在无声地塌陷、旋转。屏幕上那行鲜红的“完全一致”和“全零序列”，像两把烧红的烙铁，狠狠烫在了我的视网膜上，也烫在了所有关于宇宙运行的认知之上。</p><p>圆周率，那个象征着无限、无理、不可捉摸的宇宙常数，那个深植于一切圆与旋转、波动与周期的基石……真的终结了。它在那个精确到匪夷所思的位置，被一道看不见的墙彻底阻断，坠入了永恒的零之深渊。</p><p>圆，完美的圆，不过是4.2千万亿条微小直线组成的多边形。宇宙存在一个最小、不可分割的尺度。光滑是假象，连续是谎言。我们赖以理解世界的根基，数学本身，在最核心的地方，出现了一道深不见底的裂缝。</p><p>不知过了多久，也许是一分钟，也许是一个世纪。控制室里开始响起压抑的、断断续续的抽气声，像溺水者挣扎着浮出水面。有人瘫软在椅子上，有人捂住了脸，肩膀无声地耸动。没有欢呼，没有质疑，只有信仰崩塌后巨大的茫然和深入骨髓的冰冷。</p><p>我下意识地将手伸进外套口袋。指尖触碰到一个冰冷坚硬的小物件。我把它掏了出来——是女儿林溪硬塞给我的那个塑料钥匙扣，一个粗糙的、印着π符号的小圆片。幼稚的涂装，劣质的塑料感。我曾无数次笑话她，说圆周率是算不尽的，就像爸爸的工作一样永无止境。她总是眨着亮晶晶的眼睛，固执地说：“那它一定很长很长很长！”</p><p>我死死攥着那个小圆片，塑料坚硬的边缘深深硌进掌心，带来一丝尖锐的痛楚，却丝毫不能驱散那彻骨的寒意。我缓缓转过身，目光穿过控制室巨大的、被地下灯光映得如同白昼的落地窗。窗外，是深埋山腹的厚重岩层，隔绝了外面的世界。但我知道，在那岩层之上，此刻，黎明应该正在降临。</p><p>第一次，我对着那不可见的、理应升起的朝阳，心中涌起一种荒诞而恐怖的怀疑：那轮被我们歌颂了千万年的、象征完美与光明的圆盘，那轮太阳——它真的是圆的吗？还是说，它也只是由无数细小的、不可再分的直线，在宇宙那冰冷而精确的最小尺度上，笨拙地拼凑出的一个巨大幻影？</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.mcloc.cn/archives/18/#comments</comments>
<wfw:commentRss>https://blog.mcloc.cn/feed.xml</wfw:commentRss>
</item>
<item>
<title>温润如玉</title>
<link>https://blog.mcloc.cn/archives/16/</link>
<guid>https://blog.mcloc.cn/archives/16/</guid>
<pubDate>Mon, 18 Dec 2023 07:21:00 +0000</pubDate>
<dc:creator>androidmumo</dc:creator>
<description><![CDATA[我每次观察精神状态稳定的人都能感受到他们真的对他人不抱任何期望。我并不是说他们很冷漠，而是他们在主动想为别人做什么的时候会对别人很亲切温柔。这样的人精神状态会非常稳定，因为他们对别人没有任何期待...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>我每次观察精神状态稳定的人都能感受到他们真的对他人不抱任何期望。我并不是说他们很冷漠，而是他们在主动想为别人做什么的时候会对别人很亲切温柔。</p><p>这样的人精神状态会非常稳定，因为他们对别人没有任何期待，所以对方不管做出什么样的反应，他们都不会感到失望。</p><p><strong>真正温柔的人就是对他人不抱任何期望的人</strong></p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.mcloc.cn/archives/16/#comments</comments>
<wfw:commentRss>https://blog.mcloc.cn/feed.xml</wfw:commentRss>
</item>
<item>
<title>上善若水非不争也</title>
<link>https://blog.mcloc.cn/archives/15/</link>
<guid>https://blog.mcloc.cn/archives/15/</guid>
<pubDate>Thu, 02 Nov 2023 09:38:00 +0000</pubDate>
<dc:creator>androidmumo</dc:creator>
<description><![CDATA[老子说：“上善若水，水善利万物而不争。”这句话的本来意思是，不能为了私欲而争夺权利去勾心斗角。水不争是因为它看透了事情的本质，争夺没有意义，不如去“利万物”，让万物都得到充分发展，从而不争。而不...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>老子说：“上善若水，水善利万物而不争。”这句话的本来意思是，不能为了私欲而争夺权利去勾心斗角。水不争是因为它看透了事情的本质，争夺没有意义，不如去“利万物”，让万物都得到充分发展，从而不争。而不能理解为遇到事情就要忍让、谦卑。我们如果有利万物的事情，比如保持楼道清洁有利于大家的愉悦，那么这个时候我们不争，不去占用楼道的空间。</p><p>当自己的权益受损的时候，就应该去争。孔子说：”以德报怨，何以报德？以直报怨，以德报德。“对损害自己的人，是不能报之以德的。否则，就会助长恶人的嚣张气焰。而助长恶人气焰最终会导致更多的人受到损害，这本身就是与“利万物”相违背的，这也与上善若水南辕北辙。所以要做到上善若水，以直报怨是必要条件。与之争，才是善。</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.mcloc.cn/archives/15/#comments</comments>
<wfw:commentRss>https://blog.mcloc.cn/feed.xml</wfw:commentRss>
</item>
<item>
<title>维护开源项目的一小步</title>
<link>https://blog.mcloc.cn/archives/14/</link>
<guid>https://blog.mcloc.cn/archives/14/</guid>
<pubDate>Tue, 24 Oct 2023 04:39:00 +0000</pubDate>
<dc:creator>androidmumo</dc:creator>
<description><![CDATA[最近在搞一个开源项目：bingdemo：bing.mcloc.cn这个项目做了蛮久了，第一版还是php写的，一直做到现在。从php的服务端渲染到前后端分离，再到前两天刚支持的docker部署。可...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>最近在搞一个开源项目：<a href="https://github.com/androidmumo/bing">bing</a></p><p>demo：<a href="https://bing.mcloc.cn/">bing.mcloc.cn</a></p><p>这个项目做了蛮久了，第一版还是php写的，一直做到现在。从php的服务端渲染到前后端分离，再到前两天刚支持的docker部署。可以说在这个项目上花费了不少精力。</p><p>起初做这个项目的原因就是自己对这个感兴趣，拿来练手的，同时项目上线以后还能为其他项目提供背景图。没想到第一版有很多人支持，有一段时间甚至一个月就把我一年的又拍云联盟流量耗尽了，并且还欠了又拍云钱哈哈。</p><p>第一版更像是一个玩具，我也不是专业写php的，所以后来就有了现在这版，前端用的Vue3，后端用node，自认为架子算是搭起来了。然后。。然后。。就搁置了，有近一年没再更新。不过它也算是给面子，在我的服务器上稳定跑了一年。</p><p>最近突然觉得不能把它就这样放着，故前几天又重新拾起来，合并了仓库，做了Docker化。可喜的是，我的友人也打算加入这个项目，终于不再孤独。以后呢，打算规范起来，不再直接推到main分支上去了，该提PR就提PR，生产测试环境分开，把它当成一个规范的开源项目去做，算是我个人向开源迈出的一小步吧。</p><p>以上，致敬每一位坚持开源的开发者。</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.mcloc.cn/archives/14/#comments</comments>
<wfw:commentRss>https://blog.mcloc.cn/feed.xml</wfw:commentRss>
</item>
<item>
<title>记群晖使用acme.sh自动续签&amp;amp;部署SSL证书(可兼顾一键回家)</title>
<link>https://blog.mcloc.cn/archives/12/</link>
<guid>https://blog.mcloc.cn/archives/12/</guid>
<pubDate>Thu, 21 Sep 2023 11:28:00 +0000</pubDate>
<dc:creator>androidmumo</dc:creator>
<description><![CDATA[开始群晖默认带有自签署的SSL证书，足够日常使用了。但是浏览器会提示不安全，使用cloudflare进行代理时也无法开启完全（严格）模式。如果想要完全体的SSL加密，还是需要自己部署可信CA的证...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h2>开始</h2><p>群晖默认带有自签署的SSL证书，足够日常使用了。但是浏览器会提示不安全，使用cloudflare进行代理时也无法开启完全（严格）模式。<br><img src="https://blog.mcloc.cn/usr/uploads/2026/01/3480351578.png" alt="image-fxgu.png" title="image-fxgu.png"><br>如果想要完全体的SSL加密，还是需要自己部署可信CA的证书。但是免费通配符证书的有效期通常很短，有效期长的免费证书又不能通配。即使是付费的通配符证书，有效期一般也只有一年。</p><p>难道部署SSL证书就像西西弗斯推巨石，永远无法到达山顶吗？</p><p>或许不是，本文将做一些探索，尝试爬上这座山。</p><h2>原理</h2><p>在讲理论上的实现原理前，我们先明确一下需求。</p><p>无需频繁维护实现以下3点：</p><p>1.直接访问用域名部署到群晖的服务处于HTTPS加密状态</p><p>2.使用cloudflare代理群晖本地的服务时可以开启完全（严格）模式</p><p>3.群晖的VPN Server（OpenVPN）可以稳定使用</p><p>接下来构想实现路径。</p><p>路径1：群晖部署cloudflare提供的适用于源服务器的15年长期证书。但是cloudflare并不在主流OS默认的可信CA列表中，浏览器会提示不安全。为了消除此警告，还需要将cloudflare的根证书手动添加到操作系统的可信证书里。此路径可以完美实现需求2和需求3，需求1部分完成，在其他没有将cloudflare的根证书添加到操作系统可信证书的客户端访问群晖的服务还是会提示不安全。如果你的群晖服务不直接暴露到公网，而是通过cloudflare对公网提供服务，可以采用此方案。</p><p>路径2：使用acme.sh自动续签&部署SSL证书。此方案无需客户端做任何操作即可实现HTTPS访问，可完美实现需求1和需求2。但是需求3无法达成，因为每次证书更新都会让群晖的OpenVPN配置文件被动更改，造成一键回家失效。</p><p>路径1和路径2都有缺点。但是只要同时使用两个路径，就能达成我们一开始的目标，做出现阶段可以做到的最优解。</p><p>路径确定：在群晖上部署cloudflare提供的15年长期证书，用于OpenVPN；同时使用acme.sh自动续签&部署SSL证书，用于实现HTTPS访问群晖服务和cloudflare加密回源。</p><h2>实现</h2><p>理论可行，开始动手。</p><p>网上有关于acme.sh自动续签&部署SSL证书的教程，故不再赘述，本文只指出主要步骤及关键易错点。如果你想要尝试，请务必搜索相关教程学习后再动手，不可只看文本。</p><p>首先从cookie中获取did，保存备用。此处需要注意，不是所有的did都可以用，我就在这里卡了好久，最后读文档才发现，只有在登陆群晖时勾选了记住密码，cookie中的did才有效。<br><img src="https://blog.mcloc.cn/usr/uploads/2026/01/1734415835.png" alt="image-qrdi.png" title="image-qrdi.png"><br>然后拉取并创建容器 neilpang/acme.sh 。<br><img src="https://blog.mcloc.cn/usr/uploads/2026/01/3103379230.png" alt="image-wulg.png" title="image-wulg.png"><br>确认容器状态正常后，编写脚本，并将脚本添加到群晖的计划任务。下方附有脚本，可直接复制后修改并保存为sh文件上传。</p><p>此处要注意，如果你的DNS服务商是cloudflare的话，CF_Key需要复制cloudflare个人资料里API 令牌的Global API Key。如果你不想用这么大权限的key，也可以选择使用token，感兴趣的话可以自己研究（只需要将脚本中的CF_Key和CF_Email换成CF_Token和CF_Account_ID并通过-e命令传给容器就行了）。</p><pre><code>#你的域名

DOMAIN=''

#证书供应商

CERT_SERVER='letsencrypt'

#DNS供应商 可选 dns_dp(腾讯云) dns_ali(阿里云) dns_cf 其他可查https://github.com/acmesh-official/acme.sh/wiki/dnsapi

DNS=&quot;dns_dp&quot;

#群晖账号密码

SYNO_Username=''

SYNO_Password=''

#如果开启了双重验证请在浏览器登录时选中保存此设备，然后从COOKIE中获取did cookie

SYNO_Device_ID=''

#以下群晖配置非必要不要更改

SYNO_Hostname=&quot;localhost&quot; # Specify if not using on localhost

SYNO_Scheme=&quot;http&quot;

SYNO_Port=&quot;5000&quot;

#要添加的证书的名字，空字符串（&quot;&quot;）的话就是替代默认证书，一般建议使用空字符串，除非你有多个证书

SYNO_Certificate=''

#以下三选一

#DNSPOD.CN 腾讯云

DP_Id=''

DP_Key=''

#阿里云

Ali_Key=''

Ali_Secret=''

#CF

CF_Key=''

CF_Email=''



case $DNS in

&quot;dns_dp&quot;)

a=&quot;DP_Id=${DP_Id}&quot;&amp;&amp;b=&quot;DP_Key=${DP_Key}&quot;

;;

&quot;dns_ali&quot;)

a=&quot;Ali_Key=${Ali_Key}&quot;&amp;&amp;b=&quot;Ali_Secret=${Ali_Secret}&quot;

;;

&quot;dns_cf&quot;)

a=&quot;CF_Key=${CF_Key}&quot;&amp;&amp;b=&quot;CF_Email=${CF_Email}&quot;

;;

esac

c=&quot;SYNO_Username=${SYNO_Username}&quot;

d=&quot;SYNO_Password=${SYNO_Password}&quot;

# e=&quot;SYNO_TOTP_SECRET=${SYNO_TOTP_SECRET}&quot; （已废弃，新的参数为SYNO_Device_ID）
e=&quot;SYNO_Device_ID=${SYNO_Device_ID}&quot;

f=&quot;SYNO_Hostname=${SYNO_Hostname}&quot;

g=&quot;SYNO_Scheme=${SYNO_Scheme}&quot;

h=&quot;SYNO_Port=${SYNO_Port}&quot;

i=&quot;SYNO_Certificate=${SYNO_Certificate}&quot;

j=&quot;SYNO_DID=${SYNO_Device_ID}&quot;

docker exec -e ${a} -e ${b} acme acme.sh --log --server &quot;${CERT_SERVER}&quot; --issue -d &quot;${DOMAIN}&quot; -d &quot;*.${DOMAIN}&quot; --dns &quot;${DNS}&quot;

docker exec -e ${c} -e ${d} -e ${e} -e ${f} -e ${g} -e ${h} -e ${i} -e ${j} acme acme.sh --issue -d &quot;${DOMAIN}&quot; -d &quot;*.${DOMAIN}&quot; --dns &quot;${DNS}&quot; --deploy --deploy-hook synology_dsm
</code></pre><p>完成这些后，你就已经完成了80%，剩下的就是一键回家的问题。</p><p>为了实现一键回家不会随着SSL证书的更新而失效，可以去cloudflare申请一个适用于源服务器的15年证书，并将其与根证书（如果要将此证书用于VPN Server，群晖会要求提供中间证书，中间证书就是根证书，根证书可以在cloudflare官方文档处下载）保存到群晖里（不要作为默认证书，默认证书是上面那个）。然后将此证书仅分配给VPN Server。</p><h2>结束</h2><p>至此，构想完全实现。</p><p>感谢你的阅读，白馬空谷(blog.mcloc.cn)享有此文的著作权，转载请附原文地址。</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.mcloc.cn/archives/12/#comments</comments>
<wfw:commentRss>https://blog.mcloc.cn/feed.xml</wfw:commentRss>
</item>
<item>
<title>解决vue组件中插槽为undefined的问题</title>
<link>https://blog.mcloc.cn/archives/8/</link>
<guid>https://blog.mcloc.cn/archives/8/</guid>
<pubDate>Mon, 31 Jul 2023 04:10:00 +0000</pubDate>
<dc:creator>androidmumo</dc:creator>
<description><![CDATA[如题，问题就不多描述了，看图原因：vue在2.6.12到2.6.13版本迭代中更改了插槽的render方法，render后的函数参数改变了。导致用较高版本的vue及vue-template-co...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>如题，问题就不多描述了，看图<br><img src="https://blog.mcloc.cn/usr/uploads/2026/01/3988637928.png" alt="image-eotr.png" title="image-eotr.png"><br>原因：vue在2.6.12到2.6.13版本迭代中更改了插槽的render方法，render后的函数参数改变了。导致用较高版本的vue及vue-template-compiler项目build打包后的包，用于vue版本较低的项目中时，插槽解析失败，显示为undefined。</p><p>解决方案：要避免此问题，需保证vue及vue-template-compiler版本一致。即：项目所用的vue版本 &gt;= 打包组件所用的vue版本 &gt;= 2.6.13。</p><p>参考资料：<a href="https://www.cnblogs.com/iPing9/p/16210898.html"><a href="https://www.cnblogs.com/iPing9/p/16210898.html">https://www.cnblogs.com/iPing9/p/16210898.html</a>🔗</a></p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.mcloc.cn/archives/8/#comments</comments>
<wfw:commentRss>https://blog.mcloc.cn/feed.xml</wfw:commentRss>
</item>
<item>
<title>某些端口无法访问的原因：非安全端口</title>
<link>https://blog.mcloc.cn/archives/6/</link>
<guid>https://blog.mcloc.cn/archives/6/</guid>
<pubDate>Thu, 30 Mar 2023 07:32:00 +0000</pubDate>
<dc:creator>androidmumo</dc:creator>
<description><![CDATA[最近在写node，使用node托管静态页面的时候，发现6666端口怎么都访问不了，一度怀疑自己的代码出了什么问题。最后查找资料后发现了原因，那就是默认非安全端口。出于安全原因，每个浏览器都会禁止...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>最近在写node，使用node托管静态页面的时候，发现6666端口怎么都访问不了，一度怀疑自己的代码出了什么问题。<br>最后查找资料后发现了原因，那就是默认非安全端口。</p><p>出于安全原因，每个浏览器都会禁止一些端口，以下是常见的被浏览器禁止用于web访问的端口：</p><p>1, // tcpmux<br>7, // echo<br>9, // discard<br>11, // systat<br>13, // daytime<br>15, // netstat<br>17, // qotd<br>19, // chargen<br>20, // ftp data<br>21, // ftp access<br>22, // ssh<br>23, // telnet<br>25, // smtp<br>37, // time<br>42, // name<br>43, // nicname<br>53, // domain<br>77, // priv-rjs<br>79, // finger<br>87, // ttylink<br>95, // supdup<br>101, // hostriame<br>102, // iso-tsap<br>103, // gppitnp<br>104, // acr-nema<br>109, // pop2<br>110, // pop3<br>111, // sunrpc<br>113, // auth<br>115, // sftp<br>117, // uucp-path<br>119, // nntp<br>123, // NTP<br>135, // loc-srv /epmap<br>139, // netbios<br>143, // imap2<br>179, // BGP<br>389, // ldap<br>465, // smtp+ssl<br>512, // print / exec<br>513, // login<br>514, // shell<br>515, // printer<br>526, // tempo<br>530, // courier<br>531, // chat<br>532, // netnews<br>540, // uucp<br>556, // remotefs<br>563, // nntp+ssl<br>587, // stmp?<br>601, // ??<br>636, // ldap+ssl<br>993, // ldap+ssl<br>995, // pop3+ssl<br>2049, // nfs<br>3659, // apple-sasl / PasswordServer<br>4045, // lockd<br>6000, // X11<br>6665, // Alternate IRC [Apple addition]<br>6666, // Alternate IRC [Apple addition]<br>6667, // Standard IRC [Apple addition]<br>6668, // Alternate IRC [Apple addition]<br>6669, // Alternate IRC [Apple addition]</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.mcloc.cn/archives/6/#comments</comments>
<wfw:commentRss>https://blog.mcloc.cn/feed.xml</wfw:commentRss>
</item>
<item>
<title>使用位运算进行高效率的枚举</title>
<link>https://blog.mcloc.cn/archives/5/</link>
<guid>https://blog.mcloc.cn/archives/5/</guid>
<pubDate>Thu, 01 Sep 2022 03:55:00 +0000</pubDate>
<dc:creator>androidmumo</dc:creator>
<description><![CDATA[先进行知识准备：&lt;&lt; 符号是 Javascript 中的位操作符，1 &lt;&lt; N 的意思是： 将数字 1 的位向左移动 N 位 。例如：1 &lt;&lt; 1 // 2/...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>先进行知识准备：<br>&lt;&lt; 符号是 Javascript 中的位操作符，1 &lt;&lt; N 的意思是： 将数字 1 的位向左移动 N 位 。</p><p>例如：</p><p>1 &lt;&lt; 1 // 2<br>// 二进制：1 =&gt; 10<br>1 &lt;&lt; 2 // 4<br>// 二进制：10 =&gt; 100<br>...<br>1 &lt;&lt; N // 2的N次方<br>| 是 Javascript 中的位运算符： 或 。<br>当两个数值进行 | 运算时，会对每一位进行比较，任何一位上，如果两个数都为 0，则结果为 0；其余情况结果为 1;</p><p>例如：</p><p>1 &lt;&lt; 1 | 1 &lt;&lt; 2 // 010 | 100<br>// 结果为 110，即数字：6</p><p>1 | 1 &lt;&lt; 3 // 0001 | 1000<br>// 结果为 1001，即数字：9<br>& 是 Javascript 中的运算符：且 。 当两个数值进行 & 运算时，会对每一位进行比较，任何一位上如果两个数都为 1，则结果为 1；其余情况结果为 0;</p><p>例如：</p><p>1 & 9 // 0001 & 1001 = 0001 (1)</p><p>2 & 8 // 0010 & 1000 = 0000 (0)<br>知识准备完成，开始战斗：<br>假设一个场景：当我们面试一个前端同学时，我们需要知道他有哪些技能。</p><p>先定义一下各项技能：</p><p>/**</p><ul><li>SKILLS：面试者的技能枚举<br> **/</li></ul><p>const SKILLS = {<br>  CSS: 1 , // 0001<br>  JS: 1 &lt;&lt; 1, // 0010<br>  HTML: 1 &lt;&lt; 2, // 0100<br>  WEB_GL: 1 &lt;&lt; 3 // 1000<br>}<br>然后我们需要标记他有哪些技能，这个添加标记的过程如下：</p><p>let skills = 0<br>// 增加一项他会的技能<br>function addSkill(skill) {<br>  skills = skills | skill // 加上<br>}</p><p>addSkill(SKILLS.CSS) // 0001<br>addSkill(SKILLS.HTML) // 0101<br>addSkill(SKILLS.WEB_GL) // 1101<br>完成了技能的添加，我们就需要在其他地方开销这个人具备什么技能了，开销过程如下：</p><p>// 判断他是否会 CSS<br>SKILLS.CSS & skills // 1 (0 代表不会，非0代表会)</p><p>// 判断他是否会 JS<br>SKILLS.JS & skills // 0 (0 代表不会，非0代表会)</p><p>// 判断他是否会 HTML 且会 WebGl<br>SKILLS.HTML & skills && SKILLS.WEB_GL & skills // 8 (0 代表不会，非0代表会)</p><p>// 判断他是否会 JS 或会 HTML<br>SKILLS.JS & skills || SKILLS.HTML & skills</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.mcloc.cn/archives/5/#comments</comments>
<wfw:commentRss>https://blog.mcloc.cn/feed.xml</wfw:commentRss>
</item>
</channel>
</rss>