<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>我有昕看法 | Peter_Matthew的博客</title>
  
  <subtitle>I have Xin views. | A Konjac in Province H.A.&#39;s Blog</subtitle>
  <link href="https://www.petermatt.xin/atom.xml" rel="self"/>
  
  <link href="https://www.petermatt.xin/"/>
  <updated>2026-07-26T18:58:41.612Z</updated>
  <id>https://www.petermatt.xin/</id>
  
  <author>
    <name>William Peter Matthew</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>域名系统层级与公共后缀列表</title>
    <link href="https://www.petermatt.xin/blog/DNS-Hierarchy-and-PSL/"/>
    <id>https://www.petermatt.xin/blog/DNS-Hierarchy-and-PSL/</id>
    <published>2026-05-27T03:07:09.000Z</published>
    <updated>2026-07-26T18:58:41.612Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>最近经常刷到一些教别人申请域名的视频，比如申请到了 <code>example.eu.org</code> 和 <code>example.cn.eu.org</code> ，然后教大家托管到Cloudflare上。我很早之前也搞过一些域名，也托管到Cloudflare上过，还做过备案，因此注意到这些视频存在一些用语上的问题。</p><p>在国内的一些技术性文章和视频中，经常讲错域名系统的层级，比如称example.eu.org为二级域名，称example.cn.eu.org为三级域名，认为example.org是一级域名。这显然是非常错误的。更有甚者称org为一级域，example.org就叫一级域名，十分错误。</p><p>此外，还有人提到“能够托管到Cloudflare上的就是二级域名”。这是搞混了域名系统层级和公共后缀列表的关系。</p><p>教程类的文章和视频往往只是教别人怎么用，这种内容搞混这个概念可以理解。但一些专门针对这个问题讲述的技术类的文章和视频搞混这个概念，有的还有前后矛盾的问题，实在是不应该。因此我专门出一个文章讲一下。</p><h2 id="域名系统层级"><a href="#域名系统层级" class="headerlink" title="域名系统层级"></a>域名系统层级</h2><p>域名系统是方便记忆而诞生的产物。早期阿帕网时期，计算机互联需要手动记录每台主机的IP地址，输入IP地址进行互联。这种方法显然不够方便。然后便诞生了 <code>hosts.txt</code> ，即一个存在电脑里的通讯录。你仍然可以使用这种方法指定一个主机名对应的IP地址。这份文件随着网络主机的增长而难以维护。因此域名系统便诞生了，通过树形层级系统，让每个组织维护好自己管理的分支。每个组织维护的分支都是一个域，会拥有一个名称即该域的域名。子分支也就是子域，也可以有名称即子域名。</p><p>这里注意到，中文互联网常用“域名”而不常用“域”，英文互联网常用Domain而不是Domain Name，因此就有人把域和域名的概念搞混了。英文用Domain时大家都是明白指的是Domain Name，因为很少有人来购买、托管一个域，因为这都是你需要实际控制的资源而不是名称。</p><h3 id="后缀模式"><a href="#后缀模式" class="headerlink" title="后缀模式"></a>后缀模式</h3><p>在网页访问时，域名系统采用后缀模式，即层级从根域开始，每级域的域名之间使用英文句号 <code>.</code> 分隔。根域不属于任何一级，不具有名称，是所有层级的起点，但和其他层级放在一起时也通常被认为域名为空白，层级为“第0级”。通常，也会省略根域名与顶级域之间的分隔符。</p><p>对于一个通常的主机名 <code>www.example.org</code> 来说，其层级是这样的：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">└── org</span><br><span class="line">    └── example</span><br><span class="line">        └── www</span><br></pre></td></tr></table></figure><table><thead><tr><th>层级</th><th>域</th><th>本级域名</th><th>域名</th></tr></thead><tbody><tr><td>第0级 (Level 0)</td><td>根域 (Root Domain)</td><td><code> </code></td><td><code>.</code></td></tr><tr><td>第1级 (Level 1)</td><td>顶级域&#x2F;一级域 (TLD, Top-Level Domain, First-Level Domain)</td><td><code>org</code></td><td><code>org.</code></td></tr><tr><td>第2级 (Level 2)</td><td>二级域 (SLD, Second-Level Domain)</td><td><code>example</code></td><td><code>example.org.</code></td></tr><tr><td>第3级 (Level 3)</td><td>三级域 (一台主机)</td><td><code>www</code></td><td><code>www.example.org.</code></td></tr></tbody></table><p>显然的，example.org是二级域名，example.eu.org是三级域名，example.cn.eu.org是四级域名。根据RFC 1035，单个层级的名称长度最多为63个字符，域名总长度最多为255个字符，因此理论上的最大层级数是128（如果ICANN之后能推出单字母顶级域的话）。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x</span><br></pre></td></tr></table></figure><h3 id="顶级域类别"><a href="#顶级域类别" class="headerlink" title="顶级域类别"></a>顶级域类别</h3><p>TLD顶级域名有很多种类，通常认为有以下六类：</p><ol><li>gTLD(Generic Top-Level Domain)——通用顶级域名</li></ol><ul><li>传统gTLD</li><li>New gTLD</li><li>IDN gTLD(Internationalized Domain Name gTLD)——国际化通用顶级域名（非英文后缀）</li></ul><ol start="2"><li>ccTLD(Country Code Top-Level Domain)——国家和地区代码顶级域名</li></ol><ul><li>传统ccTLD</li><li>IDN ccTLD(Internationalized Domain Name ccTLD)——国际化国家和地区代码顶级域名（非英文后缀）</li></ul><ol start="3"><li>sTLD(Sponsored Top-Level Domain)——赞助顶级域名</li><li>grTLD(Generic Restricted Top-Level Domains)——通用限制顶级域名</li><li>iTLD(Infrastructure Top-Level Domain)——基础设施顶级域名</li><li>suTLD(Special-Use Top-Level Domain)——特别用途顶级域名</li></ol><h4 id="gTLD"><a href="#gTLD" class="headerlink" title="gTLD"></a>gTLD</h4><p>通用顶级域名是最常见的域名后缀， <code>.com</code> 、 <code>.net</code> 和 <code>.org</code> 都属于这一类。上面三个都是传统gTLD。2011到2012年时，由于 <code>.com</code> 的资源几乎被抢光了，ICANN允许企业和组织创造新的后缀，便出来了新的gTLD，即New gTLD。常见的 <code>.app</code> 、 <code>.xyz</code> 、<code>.club</code> 和 <code>.shop</code> 都属于New gTLD。此外，为了让非英语母语的人也能方便记忆域名，ICANN允许创造了一些汉字、阿拉伯字母、斯拉夫字母等非拉丁字母的后缀，这便是IDN gTLD，比如 <code>.公司</code> 、 <code>.网络</code> 。</p><h4 id="ccTLD"><a href="#ccTLD" class="headerlink" title="ccTLD"></a>ccTLD</h4><p>这是ICANN根据ISO-3166标准分配给各个国家和地区的专属后缀，全部由两个字母组成。比如 <code>.cn</code> 、<code>.us</code> 、 <code>.uk</code> 、 <code>.hk</code> 等。一些国家的ccTLD由于具有特殊含义，被全世界都拿去商业运营，比如 <code>.tv</code> 、<code>.ai</code> 、 <code>.me</code> ，但本质还是ccTLD。IDN ccTLD和IDN gTLD类似，都是允许汉字、阿拉伯字母、斯拉夫字母等非拉丁字母的后缀，只是属于国家和地区的，比如 <code>.中国</code> 、 <code>.香港</code> 等。</p><h4 id="sTLD"><a href="#sTLD" class="headerlink" title="sTLD"></a>sTLD</h4><p>用的最少的一类，第一是因为本身数量少，第二是因为这类域名有注册限制。赞助顶级域名不是有人赞助的意思，而是指由一个专门的权威机构（Sponsor）作为后台担保和审查官。sTLD是从早期gTLD里剥离出去的特殊类别，因此也有人说这些是gTLD，但其实是sTLD。熟知的sTLD有 <code>.edu</code> 、 <code>.gov</code> 、 <code>.mil</code> 等。此外，还有一个直接接受IANA管辖的 <code>.int</code> ，只允许联合国专门机构、获联合国大会观察员地位的组织、各国政府之间通过国际条约建立的被公认具有独立的国际法人资格的受国际法管辖的组织直接向IANA提交注册。</p><h4 id="grTLD"><a href="#grTLD" class="headerlink" title="grTLD"></a>grTLD</h4><p>这是注册局限定给特定主体使用的域名。常见的三个是 <code>.biz</code> 、<code>.pro</code> 、 <code>.name</code> 。 <code>.biz</code> 限制只允许商业和企业用途注册，必须用于合法商业活动； <code>.pro</code> 限制只允许持有一定专业资质的人士注册，比如会计、工程师等； <code>.name</code> 限制只允许个人注册。</p><h4 id="iTLD"><a href="#iTLD" class="headerlink" title="iTLD"></a>iTLD</h4><p>作为互联网基础设施的顶级域名，有专门作用的域名，后缀为 <code>.arpa</code> ，以二级域名作为用途标识。该名称源于互联网原名阿帕网（ARPANET），以美国高级研究计划署（ARPA）命名。原计划暂时使用，但后来被留作正式使用，但全称变为地址和路由参数区 （Address and Routing Parameter Area）。下面是所有用途对应的二级域名列表。</p><table><thead><tr><th>域名</th><th>用途</th><th>参考文档</th></tr></thead><tbody><tr><td><code>arpa</code></td><td>根据互联网架构委员会IAB建议，用于支持运营关键基础设施域名</td><td><a href="https://datatracker.ietf.org/doc/html/rfc3172">RFC3172</a></td></tr><tr><td><code>6tisch.arpa</code></td><td>用于支持IEEE 802.15.4（低速率无线个人局域网络LR-WPAN）时隙跳频模式的IPv6</td><td><a href="https://datatracker.ietf.org/doc/html/rfc9031">RFC9031</a></td></tr><tr><td><code>as112.arpa</code></td><td>用于IP地址到域名的反向解析和其他用途的DNS流量进行沉没处理（返回“不存在该地址”）</td><td><a href="https://datatracker.ietf.org/doc/html/rfc7535">RFC7535</a></td></tr><tr><td><code>e164.arpa</code></td><td>用于将E.164编号（国际公共电信编号）映射到互联网URI</td><td><a href="https://datatracker.ietf.org/doc/html/rfc6116">RFC6116</a></td></tr><tr><td><del><code>eap-noob.arpa</code></del> (已弃用)</td><td>曾用于可扩展认证协议框架中的灵活带外认证方法</td><td><a href="https://datatracker.ietf.org/doc/html/rfc9140">RFC9140</a> <a href="https://datatracker.ietf.org/doc/html/rfc9965">RFC9965</a></td></tr><tr><td><code>eap.arpa</code></td><td>用于可扩展认证协议框架内的配置</td><td><a href="https://datatracker.ietf.org/doc/html/rfc9965">RFC9965</a></td></tr><tr><td><code>home.arpa</code></td><td>仅用于家庭网络</td><td><a href="https://datatracker.ietf.org/doc/html/rfc8375">RFC8375</a></td></tr><tr><td><code>in-addr.arpa</code></td><td>用于IPv4地址到域名的反向解析</td><td><a href="https://datatracker.ietf.org/doc/html/rfc1035">RFC1035</a></td></tr><tr><td><code>ip6.arpa</code></td><td>用于IPv6地址到域名的反向解析</td><td><a href="https://datatracker.ietf.org/doc/html/rfc3152">RFC3152</a></td></tr><tr><td><code>in-addr-servers.arpa</code></td><td>用于托管 <code>in-addr.arpa</code> 域的权威名称服务器</td><td><a href="https://datatracker.ietf.org/doc/html/rfc5855">RFC5855</a></td></tr><tr><td><code>ip6-servers.arpa</code></td><td>用于托管 <code>ip6.arpa</code> 域的权威名称服务器</td><td><a href="https://datatracker.ietf.org/doc/html/rfc5855">RFC5855</a></td></tr><tr><td><code>ipv4only.arpa</code></td><td>用于检测DNS64可用性和NAT64前缀</td><td><a href="https://datatracker.ietf.org/doc/html/rfc7050">RFC7050</a></td></tr><tr><td><code>iris.arpa</code></td><td>用于定位互联网注册信息服务IRIS</td><td><a href="https://datatracker.ietf.org/doc/html/rfc4698">RFC4698</a></td></tr><tr><td><code>ns.arpa</code></td><td>用于托管 <code>.arpa</code> 域的权威名称服务器</td><td><a href="https://datatracker.ietf.org/doc/html/rfc9120">RFC9120</a></td></tr><tr><td><code>resolver.arpa</code></td><td>用于发现指定的DNS解析器</td><td><a href="https://datatracker.ietf.org/doc/html/rfc9462">RFC9462</a></td></tr><tr><td><code>service.arpa</code></td><td>用于发现基于DNS的单播服务</td><td><a href="https://datatracker.ietf.org/doc/html/rfc9665">RFC9665</a></td></tr><tr><td><code>uri.arpa</code></td><td>根据动态委托发现系统DDDS，解析统一资源标识符URI</td><td><a href="https://datatracker.ietf.org/doc/html/rfc3405">RFC3405</a> <a href="https://datatracker.ietf.org/doc/html/rfc8958">RFC8958</a></td></tr><tr><td><code>urn.arpa</code></td><td>根据动态委托发现系统DDDS，解析统一资源名称URN</td><td><a href="https://datatracker.ietf.org/doc/html/rfc3405">RFC3405</a></td></tr></tbody></table><h5 id="home-arpa"><a href="#home-arpa" class="headerlink" title="home.arpa."></a>home.arpa.</h5><p>对于内部网络的管理人员来说，可能需要一个私有TLD以支持多项功能。<a href="https://datatracker.ietf.org/doc/html/rfc6762">RFC6762</a>mDNS协议将 <code>.local.</code> 作为专用TLD使用，并禁止将 <code>.local.</code> 作为本地DNS的私有TLD使用。很长一段时间里，没有官方的私有TLD，管理员们使用了五花八门的私有TLD： <code>.intranet.</code> 、 <code>.internal.</code> 、 <code>.private.</code> 、 <code>.corp.</code> 、 <code>.home.</code> 、 <code>.lan.</code> 等。直至<a href="https://datatracker.ietf.org/doc/html/rfc8375">RFC8375</a>才将 <code>home.arpa.</code> 标准化。</p><p>不过需要注意的是 <code>.local.</code> 基于mDNS协议，可以自动给主机名进行解析，但是 <code>home.arpa.</code> 必须要一个本地DNS才能使用。</p><blockquote><p><em>另一个正在互联网草案I-D阶段[2026-05-27]的顶级域名是 <code>.internal.</code> ，最新阶段的可以从这个地址跟进<a href="https://datatracker.ietf.org/doc/draft-davies-internal-tld/">A Top-level Domain for Private Use(draft-davies-internal-tld)</a>。</em></p></blockquote><h4 id="suTLD"><a href="#suTLD" class="headerlink" title="suTLD"></a>suTLD</h4><p>用于特别用途。下面是所有用途对应的顶级域名列表。</p><table><thead><tr><th>域名</th><th>用途</th><th>参考文档</th></tr></thead><tbody><tr><td><code>alt.</code></td><td>用于防止DNS命名冲突</td><td><a href="https://datatracker.ietf.org/doc/html/rfc9476">RFC9476</a></td></tr><tr><td><code>example.</code></td><td>用于文档、教程和测试</td><td><a href="https://datatracker.ietf.org/doc/html/rfc6761">RFC6761</a></td></tr><tr><td><code>invalid.</code></td><td>用于文档、教程和测试</td><td><a href="https://datatracker.ietf.org/doc/html/rfc6761">RFC6761</a></td></tr><tr><td><code>test.</code></td><td>用于文档、教程和测试</td><td><a href="https://datatracker.ietf.org/doc/html/rfc6761">RFC6761</a></td></tr><tr><td><code>local.</code></td><td>用于mDNS协议</td><td><a href="https://datatracker.ietf.org/doc/html/rfc6762">RFC6762</a></td></tr><tr><td><code>localhost.</code></td><td>用于指代环回地址（ <code>::1</code> 和 <code>127.0.0.1</code> ）</td><td><a href="https://datatracker.ietf.org/doc/html/rfc6761">RFC6761</a></td></tr><tr><td><code>onion.</code></td><td>用于Tor洋葱网络服务</td><td><a href="https://datatracker.ietf.org/doc/html/rfc7686">RFC7686</a></td></tr></tbody></table><h5 id="example"><a href="#example" class="headerlink" title="example."></a>example.</h5><p><code>example.</code> 、 <code>example.com.</code> 、 <code>example.net.</code> 、 <code>example.org.</code> 、<code>invalid.</code> 和 <code>test.</code> 是专门用于文档、教程和测试的域名。很多人会拿 <code>xxx</code> 然后加一个 <code>.com</code> 做演示的地址，但国外的xxx是成人的意思，这样演示会导致文档、教程和测试包含成人网站地址，很可能会被很多平台下架。</p><h2 id="公共后缀列表"><a href="#公共后缀列表" class="headerlink" title="公共后缀列表"></a>公共后缀列表</h2><p>早期互联网，大家都是直接注册二级域名的，比如 <code>baidu.com</code> 、 <code>google.com</code> 。但是一些国家要求不能直接注册ccTLD的二级域名，商业公司必须注册三级域名，比如注册 <code>google.co.uk</code> 或者 <code>google.co.jp</code> ，除此以外还有很多顶级域名的注册局允许注册商提供其他三级域名的注册服务。此外，一些持有二级域名的组织也开放自己域名的子域名注册权，比如上面提到的 <code>example.eu.org</code> 就是注册在 <code>eu.org</code> 这个二级域名下的，他甚至支持注册 <code>example.cn.eu.org</code> 这种四级域名。</p><p>这种注册机制对很多人而言是一种好事，因为这样能够使域名有更多的资源，对ccTLD的管理也更规范。然而，对浏览器的Cookie管理却是灾难。</p><p>早期浏览器只会识别二级域名作为保存Cookie的匹配后缀。比如访问 <code>zhidao.baidu.com</code> 时你登录了，浏览器便会把Cookie写入 <code>.baidu.com</code> 的记录，这样你访问 <code>tieba.baidu.com</code> 时就不需要重新登录了。但如果你访问了 <code>mail.google.co.uk</code> ，这种匹配方式会把你的Cookie写入 <code>.co.uk</code> ，你访问任何一个其他注册在 <code>co.uk</code> 下的三级域名的网站都能读取该记录，黑客很容易通过在网站上插入恶意脚本窃取Cookie或者污染Cookie。这就是Cookie作用域重叠问题。</p><p>为了防止这个事情发生，公共后缀列表PSL(Public Suffix List)便诞生了。它是一个写着所有长得像普通域名，但应当被视为注册后缀的域名列表，来保证浏览器能够正确写入Cookie记录，将 <code>mail.google.co.uk</code> 的Cookie写入 <code>.google.co.uk</code> 的记录而不是 <code>.co.uk</code> 的。（如果一个域名的子域名不开放注册，但子域名需要浏览器分开处理Cookie，也会提交，比如Github就提交了 <code>github.io</code> 等域名。）</p><p>所以，在PSL里的域名不是顶级域名，只是需要分开处理Cookie的域名，这是不同的概念，你总不能管PSL里的 <code>org</code> 、 <code>eu.org</code> 和 <code>cn.eu.org</code> 都叫顶级域名吧。</p><p>对于一些提供免费域名的网站，大家会发现有的后缀可以托管到Cloudflare上，有的不能。便说Cloudflare什么时候支持，催Cloudflare。这其实是没用的，真正该问的是这些网站的管理者。</p><p>Cloudflare能够托管的域名，便是注册在PSL的下一级子域名，比如可以上面提到的 <code>example.org</code> 、 <code>example.eu.org</code> 和 <code>example.cn.eu.org</code> 。但 <code>example.name.org</code> 和 <code>example.name.eu.org</code> 因为不是PSL的下一级子域名所以不能托管。Cloudflare会定期从GitHub的仓库 <a href="https://github.com/publicsuffix/list/">list</a> 同步public_suffix_list.dat文件（PSL的数据库文件）。而这个仓库需要域名持有者手动提交合并请求，所以需要催网站的管理者。</p><p>为了防止Cookie作用域重叠和跨子域名安全问题，不建议使用后缀未纳入PSL的免费域名。</p><h2 id="域名备案问题"><a href="#域名备案问题" class="headerlink" title="域名备案问题"></a>域名备案问题</h2><p>能够备案的域名和PSL又是两个概念，不要搞混了。</p><p>在中国境内从事互联网信息服务活动，实行双备案制度，即工信部ICP备案和公安部联网安全备案。</p><blockquote><p>《互联网信息服务管理办法》第四条</p><p>国家对经营性互联网信息服务实行许可制度；对非经营性互联网信息服务实行备案制度。<br>未取得许可或者未履行备案手续的，不得从事互联网信息服务。  </p></blockquote><blockquote><p>《计算机信息网络国际联网安全保护管理办法》第十二条</p><p>互联单位、接入单位、使用计算机信息网络国际联网的法人和其他组织(包括跨省、自治区、直辖市联网的单位和所属的分支机构)，应当自网络正式联通之日起三十日内，到所在地的省、自治区、直辖市人民政府公安机关指定的受理机关办理备案手续。<br>前款所列单位应当负责将接入本网络的接入单位和用户情况报当地公安机关备案，并及时报告本网络中接入单位和用户的变更情况。  </p></blockquote><p>即先通过服务提供商向各省级工信部门提交信息办理ICP备案，然后自行登录“全国互联网安全管理服务平台”在对应管辖的公安机关办理联网安全备案。</p><p>工信部对能够进行备案的域名后缀实行白名单管理制度，具体名单可见 <a href="%E5%9F%9F%E5%90%8D%E8%A1%8C%E4%B8%9A%E7%AE%A1%E7%90%86%E4%BF%A1%E6%81%AF%E5%85%AC%E7%A4%BA">域名行业管理信息公示</a> 。以下是参考该页面得出的可以备案的域名后缀列表。（能备案不代表你能注册到，有些也是限制主体资格的。）</p><blockquote><h3 id="中国互联网域名体系"><a href="#中国互联网域名体系" class="headerlink" title="中国互联网域名体系"></a>中国互联网域名体系</h3><h4 id="国家顶级域名"><a href="#国家顶级域名" class="headerlink" title="国家顶级域名"></a>国家顶级域名</h4><table><thead><tr><th align="center">说明</th><th align="center">域名后缀</th></tr></thead><tbody><tr><td align="center">中国国家顶级域名</td><td align="center"><code>.CN</code></td></tr><tr><td align="center">中文国家顶级域名</td><td align="center"><code>.中国</code></td></tr></tbody></table><h5 id="类别二级域名"><a href="#类别二级域名" class="headerlink" title="类别二级域名"></a>类别二级域名</h5><table><thead><tr><th align="left">用途</th><th align="left">域名</th></tr></thead><tbody><tr><td align="left">中国党政群机关等各级政务部门</td><td align="left"><code>.政务.CN</code></td></tr><tr><td align="left">非营利性机构</td><td align="left"><code>.公益.CN</code></td></tr><tr><td align="left">中国政府机构</td><td align="left"><code>.GOV.CN</code></td></tr><tr><td align="left">非营利性组织</td><td align="left"><code>.ORG.CN</code></td></tr><tr><td align="left">科研机构</td><td align="left"><code>.AC.CN</code></td></tr><tr><td align="left">中国国防机构</td><td align="left"><code>.MIL.CN</code></td></tr><tr><td align="left">提供互联网服务的机构</td><td align="left"><code>.NET.CN</code></td></tr><tr><td align="left">教育机构</td><td align="left"><code>.EDU.CN</code></td></tr><tr><td align="left">工、商、金融等企业</td><td align="left"><code>.COM.CN</code></td></tr></tbody></table><h5 id="行政区二级域名"><a href="#行政区二级域名" class="headerlink" title="行政区二级域名"></a>行政区二级域名</h5><table><thead><tr><th align="left">地区</th><th align="left">域名</th></tr></thead><tbody><tr><td align="left">北京市</td><td align="left"><code>.BJ.CN</code></td></tr><tr><td align="left">天津市</td><td align="left"><code>.TJ.CN</code></td></tr><tr><td align="left">上海市</td><td align="left"><code>.SH.CN</code></td></tr><tr><td align="left">重庆市</td><td align="left"><code>.CQ.CN</code></td></tr><tr><td align="left">河北省</td><td align="left"><code>.HE.CN</code></td></tr><tr><td align="left">山西省</td><td align="left"><code>.SX.CN</code></td></tr><tr><td align="left">内蒙古自治区</td><td align="left"><code>.NM.CN</code></td></tr><tr><td align="left">辽宁省</td><td align="left"><code>.LN.CN</code></td></tr><tr><td align="left">吉林省</td><td align="left"><code>.JL.CN</code></td></tr><tr><td align="left">黑龙江省</td><td align="left"><code>.HL.CN</code></td></tr><tr><td align="left">江苏省</td><td align="left"><code>.JS.CN</code></td></tr><tr><td align="left">浙江省</td><td align="left"><code>.ZJ.CN</code></td></tr><tr><td align="left">安徽省</td><td align="left"><code>.AH.CN</code></td></tr><tr><td align="left">福建省</td><td align="left"><code>.FJ.CN</code></td></tr><tr><td align="left">江西省</td><td align="left"><code>.JX.CN</code></td></tr><tr><td align="left">山东省</td><td align="left"><code>.SD.CN</code></td></tr><tr><td align="left">河南省</td><td align="left"><code>.HA.CN</code></td></tr><tr><td align="left">湖北省</td><td align="left"><code>.HB.CN</code></td></tr><tr><td align="left">湖南省</td><td align="left"><code>.HN.CN</code></td></tr><tr><td align="left">广东省</td><td align="left"><code>.GD.CN</code></td></tr><tr><td align="left">广西壮族自治区</td><td align="left"><code>.GX.CN</code></td></tr><tr><td align="left">海南省</td><td align="left"><code>.HI.CN</code></td></tr><tr><td align="left">四川省</td><td align="left"><code>.SC.CN</code></td></tr><tr><td align="left">贵州省</td><td align="left"><code>.GZ.CN</code></td></tr><tr><td align="left">云南省</td><td align="left"><code>.YN.CN</code></td></tr><tr><td align="left">西藏自治区</td><td align="left"><code>.XZ.CN</code></td></tr><tr><td align="left">陕西省</td><td align="left"><code>.SN.CN</code></td></tr><tr><td align="left">甘肃省</td><td align="left"><code>.GS.CN</code></td></tr><tr><td align="left">青海省</td><td align="left"><code>.QH.CN</code></td></tr><tr><td align="left">宁夏回族自治区</td><td align="left"><code>.NX.CN</code></td></tr><tr><td align="left">新疆维吾尔自治区</td><td align="left"><code>.XJ.CN</code></td></tr><tr><td align="left">台湾省</td><td align="left"><code>.TW.CN</code></td></tr><tr><td align="left">香港特别行政区</td><td align="left"><code>.HK.CN</code></td></tr><tr><td align="left">澳门特别行政区</td><td align="left"><code>.MO.CN</code></td></tr></tbody></table><h4 id="其他顶级域名"><a href="#其他顶级域名" class="headerlink" title="其他顶级域名"></a>其他顶级域名</h4><h5 id="中文顶级域名"><a href="#中文顶级域名" class="headerlink" title="中文顶级域名"></a>中文顶级域名</h5><table><thead><tr><th align="center"></th><th align="center"></th></tr></thead><tbody><tr><td align="center"><code>.政务</code> (中国党政群机关等各级政务部门)</td><td align="center"><code>.公益</code> (非营利性机构)</td></tr><tr><td align="center"><code>.公司</code></td><td align="center"><code>.网络</code></td></tr><tr><td align="center"><code>.网址</code></td><td align="center"><code>.商城</code></td></tr><tr><td align="center"><code>.网店</code></td><td align="center"><code>.中信</code></td></tr><tr><td align="center"><code>.商标</code></td><td align="center"><code>.广东</code></td></tr><tr><td align="center"><code>.佛山</code></td><td align="center"><code>.信息</code></td></tr><tr><td align="center"><code>.手机</code></td><td align="center"><code>.在线</code></td></tr><tr><td align="center"><code>.中文网</code></td><td align="center"><code>.集团</code></td></tr><tr><td align="center"><code>.我爱你</code></td><td align="center"><code>.商店</code></td></tr><tr><td align="center"><code>.企业</code></td><td align="center"><code>.娱乐</code></td></tr><tr><td align="center"><code>.游戏</code></td><td align="center"><code>.购物</code></td></tr><tr><td align="center"><code>.餐厅</code></td><td align="center"><code>.招聘</code></td></tr><tr><td align="center"><code>.时尚</code></td><td align="center"><code>.移动</code></td></tr><tr><td align="center"><code>.网站</code></td><td align="center"><code>.联通</code></td></tr><tr><td align="center"><code>.世界</code></td><td align="center"><code>.健康</code></td></tr><tr><td align="center"><code>.香港</code></td><td align="center"></td></tr></tbody></table><h5 id="英文顶级域名"><a href="#英文顶级域名" class="headerlink" title="英文顶级域名"></a>英文顶级域名</h5><table><thead><tr><th align="center"></th><th align="center"></th></tr></thead><tbody><tr><td align="center"><code>.ALIBABA</code></td><td align="center"><code>.ANQUAN</code></td></tr><tr><td align="center"><code>.ARCHI</code></td><td align="center"><code>.ART</code></td></tr><tr><td align="center"><code>.ASIA</code></td><td align="center"><code>.AUTO</code></td></tr><tr><td align="center"><code>.AUTOS</code></td><td align="center"><code>.BABY</code></td></tr><tr><td align="center"><code>.BAIDU</code></td><td align="center"><code>.BAND</code></td></tr><tr><td align="center"><code>.BEAUTY</code></td><td align="center"><code>.BEER</code></td></tr><tr><td align="center"><code>.BIO</code></td><td align="center"><code>.BIZ</code></td></tr><tr><td align="center"><code>.BLACK</code></td><td align="center"><code>.BLUE</code></td></tr><tr><td align="center"><code>.BOATS</code></td><td align="center"><code>.BOND</code></td></tr><tr><td align="center"><code>.CAB</code></td><td align="center"><code>.CAFE</code></td></tr><tr><td align="center"><code>.CAR</code></td><td align="center"><code>.CARS</code></td></tr><tr><td align="center"><code>.CASH</code></td><td align="center"><code>.CC</code></td></tr><tr><td align="center"><code>.CENTER</code></td><td align="center"><code>.CHAT</code></td></tr><tr><td align="center"><code>.CITIC</code></td><td align="center"><code>.CITY</code></td></tr><tr><td align="center"><code>.CLICK</code></td><td align="center"><code>.CLOUD</code></td></tr><tr><td align="center"><code>.CLUB</code></td><td align="center"><code>.CO</code></td></tr><tr><td align="center"><code>.COLLEGE</code></td><td align="center"><code>.COM</code></td></tr><tr><td align="center"><code>.COMPANY</code></td><td align="center"><code>.COOL</code></td></tr><tr><td align="center"><code>.CYOU</code></td><td align="center"><code>.DESIGN</code></td></tr><tr><td align="center"><code>.EMAIL</code></td><td align="center"><code>.FAN</code></td></tr><tr><td align="center"><code>.FANS</code></td><td align="center"><code>.FASHION</code></td></tr><tr><td align="center"><code>.FIT</code></td><td align="center"><code>.FUN</code></td></tr><tr><td align="center"><code>.FUND</code></td><td align="center"><code>.FYI</code></td></tr><tr><td align="center"><code>.GAMES</code></td><td align="center"><code>.GLOBAL</code></td></tr><tr><td align="center"><code>.GOLD</code></td><td align="center"><code>.GREEN</code></td></tr><tr><td align="center"><code>.GROUP</code></td><td align="center"><code>.GURU</code></td></tr><tr><td align="center"><code>.HAIR</code></td><td align="center"><code>.HELP</code></td></tr><tr><td align="center"><code>.HK</code></td><td align="center"><code>.HOMES</code></td></tr><tr><td align="center"><code>.HOST</code></td><td align="center"><code>.ICU</code></td></tr><tr><td align="center"><code>.INFO</code></td><td align="center"><code>.INK</code></td></tr><tr><td align="center"><code>.KIDS</code></td><td align="center"><code>.KIM</code></td></tr><tr><td align="center"><code>.LAW</code></td><td align="center"><code>.LIFE</code></td></tr><tr><td align="center"><code>.LINK</code></td><td align="center"><code>.LIVE</code></td></tr><tr><td align="center"><code>.LOTTO</code></td><td align="center"><code>.LOVE</code></td></tr><tr><td align="center"><code>.LTD</code></td><td align="center"><code>.LUXE</code></td></tr><tr><td align="center"><code>.MAKEUP</code></td><td align="center"><code>.MARKET</code></td></tr><tr><td align="center"><code>.MBA</code></td><td align="center"><code>.ME</code></td></tr><tr><td align="center"><code>.MEDIA</code></td><td align="center"><code>.MOBI</code></td></tr><tr><td align="center"><code>.MONSTER</code></td><td align="center"><code>.MOTORCYCLES</code></td></tr><tr><td align="center"><code>.NET</code></td><td align="center"><code>.NEWS</code></td></tr><tr><td align="center"><code>.ONLINE</code></td><td align="center"><code>.ORGANIC</code></td></tr><tr><td align="center"><code>.PET</code></td><td align="center"><code>.PINK</code></td></tr><tr><td align="center"><code>.PLUS</code></td><td align="center"><code>.POKER</code></td></tr><tr><td align="center"><code>.PRESS</code></td><td align="center"><code>.PRO</code></td></tr><tr><td align="center"><code>.PROMO</code></td><td align="center"><code>.PROTECTION</code></td></tr><tr><td align="center"><code>.PUB</code></td><td align="center"><code>.PW</code></td></tr><tr><td align="center"><code>.QUEST</code></td><td align="center"><code>.RED</code></td></tr><tr><td align="center"><code>.REN</code></td><td align="center"><code>.RENT</code></td></tr><tr><td align="center"><code>.RUN</code></td><td align="center"><code>.SALE</code></td></tr><tr><td align="center"><code>.SCHOOL</code></td><td align="center"><code>.SECURITY</code></td></tr><tr><td align="center"><code>.SHOP</code></td><td align="center"><code>.SHOPPING</code></td></tr><tr><td align="center"><code>.SHOW</code></td><td align="center"><code>.SITE</code></td></tr><tr><td align="center"><code>.SKI</code></td><td align="center"><code>.SKIN</code></td></tr><tr><td align="center"><code>.SOCIAL</code></td><td align="center"><code>.SOHU</code></td></tr><tr><td align="center"><code>.SPACE</code></td><td align="center"><code>.STORAGE</code></td></tr><tr><td align="center"><code>.STORE</code></td><td align="center"><code>.STUDIO</code></td></tr><tr><td align="center"><code>.TAX</code></td><td align="center"><code>.TEAM</code></td></tr><tr><td align="center"><code>.TECH</code></td><td align="center"><code>.TECHNOLOGY</code></td></tr><tr><td align="center"><code>.THEATRE</code></td><td align="center"><code>.TICKETS</code></td></tr><tr><td align="center"><code>.TODAY</code></td><td align="center"><code>.TOP</code></td></tr><tr><td align="center"><code>.TV</code></td><td align="center"><code>.UNICOM</code></td></tr><tr><td align="center"><code>.UNO</code></td><td align="center"><code>.VIDEO</code></td></tr><tr><td align="center"><code>.VIN</code></td><td align="center"><code>.VIP</code></td></tr><tr><td align="center"><code>.VOTE</code></td><td align="center"><code>.VOTO</code></td></tr><tr><td align="center"><code>.WANG</code></td><td align="center"><code>.WEBSITE</code></td></tr><tr><td align="center"><code>.WIKI</code></td><td align="center"><code>.WORK</code></td></tr><tr><td align="center"><code>.WORLD</code></td><td align="center"><code>.XIN</code></td></tr><tr><td align="center"><code>.XYZ</code></td><td align="center"><code>.YACHTS</code></td></tr><tr><td align="center"><code>.YOGA</code></td><td align="center"><code>.YUN</code></td></tr><tr><td align="center"><code>.ZONE</code></td><td align="center"></td></tr></tbody></table></blockquote><p>另外，能备案和能备案通过是两码事，除了域名能备案，你还需要材料齐全并与真实信息一致。比如域名注册商为已批复的机构，域名持有人信息与备案主体信息一致等。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p>ICANN：<br><a href="https://www.icann.org/resources/pages/about-domain-names-2018-09-12-zh">关于域名</a></p><p>IANA：<br><a href="https://www.iana.org/domains/root/db">Root Zone Database</a></p><p>PSL:<br><a href="https://publicsuffix.org/">Public Suffix List</a></p><p>中文维基百科：<br><a href="https://zh.wikipedia.org/wiki/%E5%9F%9F%E5%90%8D">域名</a><br><a href="https://zh.wikipedia.org/zh-cn/%E9%A0%82%E7%B4%9A%E5%9F%9F">顶级域</a><br><a href="https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91%E9%A1%B6%E7%BA%A7%E5%9F%9F%E5%88%97%E8%A1%A8">互联网顶级域列表</a></p><p>工业和信息化部：<br><a href="https://domain.miit.gov.cn/">域名行业管理信息公示</a></p><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="科技" scheme="https://www.petermatt.xin/tags/%E7%A7%91%E6%8A%80/"/>
    
  </entry>
  
  <entry>
    <title>字符组——从语言标准看计算机发展</title>
    <link href="https://www.petermatt.xin/blog/Graph-Sequence/"/>
    <id>https://www.petermatt.xin/blog/Graph-Sequence/</id>
    <published>2025-03-20T13:00:03.000Z</published>
    <updated>2025-03-20T08:38:30.322Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>翻开2024年10月发布的C语言标准 ISO&#x2F;IEC 9899:2024 和C++语言标准 ISO&#x2F;IEC 14882:2024 ，对比1999年版的C语言标准 ISO&#x2F;IEC 9899:1999 和1998年版的C++语言标准 ISO&#x2F;IEC 14882:1998 ，我们会发现一个已经彻底从C语言和C++语言弃用的特性——三字符组（Trigraph Sequence）。</p><p>这是一个冷门的特性，也因冷门而退出了历史的舞台。</p><h2 id="背景：硬件限制与国际化需求"><a href="#背景：硬件限制与国际化需求" class="headerlink" title="背景：硬件限制与国际化需求"></a>背景：硬件限制与国际化需求</h2><p>在ASCII（美国信息交换标准代码）发布后，ISO（国际标准化组织）和IEC（国际电工委员会）便开始着手制定一份能够国际化推行的一套字符集标准。</p><p>1972年， ISO&#x2F;IEC 646 标准发布。由于当时硬件的限制，字符集一般只能在一字节大小内编码。这是一个7比特的字符集标准，参考了许多国家的国家标准，但主要依照ASCII制定。采用7比特一是因为一字节的8个比特中，往往使用一位比特作为符号位；二是因为ASCII等许多国家的标准已经采用了7比特的字符集，而8比特的字符集尚未得到普遍接纳。</p><p>7比特字符集总共有128个码位可供使用。ISO&#x2F;IEC 646 确定了33个用于控制的符号、10个数字、26个大写字母和26个小写字母对应的码位，一共95个普遍无争议的码位。在此基础上，ISO&#x2F;IEC 646 又确定了21个符号的码位，但由于国家之间符号的形状差异，各国可以按照实际需要进行修改。</p><p>为了表示欧洲等地区各种语言的带附加符号的变音字母，ISO&#x2F;IEC 646 选择不浪费码位，而是采用组合的方式输出：首先写一个普通字母，然后跟一个退格键符（控制符BS，码位0x08），然后再跟一个兼作附加符号的符号。在电传打字机上，可以利用该方法通过在一个位置叠加两个字符达成效果。这些兼作附加符号的符号是：</p><table><thead><tr><th align="center">符号</th><th align="right">码位</th><th align="right">附加符号</th></tr></thead><tbody><tr><td align="center">双引号</td><td align="right">码位0x22</td><td align="right">兼作分音符</td></tr><tr><td align="center">单引号&#x2F;撇号</td><td align="right">码位0x27</td><td align="right">兼作尖音符</td></tr><tr><td align="center">逗号</td><td align="right">码位0x2C</td><td align="right">兼作软音符</td></tr><tr><td align="center">脱字号</td><td align="right">国别用途码位0x5E</td><td align="right">兼作扬抑符</td></tr><tr><td align="center">反引号</td><td align="right">国别用途码位0x96</td><td align="right">兼作重音符</td></tr><tr><td align="center">波浪号</td><td align="right">国别用途码位0x7E</td><td align="right">兼作颚化符</td></tr></tbody></table><p>下面是使用组合方式输出的效果：<br><img src="/pic/GraphSeq05.png" alt="组合方式效果"></p><p>最后， ISO&#x2F;IEC 646 保留了12个码位作为国别用途码位。这12个码位在ASCII中对应的字符分别是 <code>#$@[\]^`&#123;|&#125;~</code> 。</p><p>也许你会注意到，这12个字符中有9个字符是编程常用的字符：</p><table><thead><tr><th align="center">符号</th><th align="right">名称</th><th align="right">码位</th><th align="left">功能</th></tr></thead><tbody><tr><td align="center"><code>#</code></td><td align="right">井号</td><td align="right">国别用途码位0x23</td><td align="left">常用于宏定义等功能</td></tr><tr><td align="center"><code>[</code></td><td align="right">左方括号</td><td align="right">国别用途码位0x5B</td><td align="left">常用于数组</td></tr><tr><td align="center"><code>\</code></td><td align="right">反斜杠号</td><td align="right">国别用途码位0x5C</td><td align="left">常用于字符转义</td></tr><tr><td align="center"><code>]</code></td><td align="right">右方括号</td><td align="right">国别用途码位0x5D</td><td align="left">常用于数组</td></tr><tr><td align="center"><code>^</code></td><td align="right">脱字号</td><td align="right">国别用途码位0x5E</td><td align="left">常用于异或运算等</td></tr><tr><td align="center"><code>&#123;</code></td><td align="right">左花括号</td><td align="right">国别用途码位0x7B</td><td align="left">常用于定义块来隔离</td></tr><tr><td align="center"><code>|</code></td><td align="right">分隔符号</td><td align="right">国别用途码位0x7C</td><td align="left">常用于或运算、逻辑或运算等</td></tr><tr><td align="center"><code>&#125;</code></td><td align="right">右花括号</td><td align="right">国别用途码位0x7D</td><td align="left">常用于定义块来隔离</td></tr><tr><td align="center"><code>~</code></td><td align="right">波浪号</td><td align="right">国别用途码位0x7E</td><td align="left">常用于取反运算等</td></tr></tbody></table><p>然而不是所有国家都会为了编程而将自己国家的字符集设定的和ASCII一致。</p><ul><li>英国标准 BSI 4730 、法国标准 AFNOR NF Z 62010-1982 、爱尔兰标准 NSAI 433:1996 等标准将0x23用于英镑符号 <code>￡</code> 来同时使用美元符号和英镑符号。</li><li>丹麦标准 DS 2089 、挪威标准 NS 4551 、瑞典标准 SEN 85 02 00 、加拿大标准 CSA Z243.4-1985 等标准将0x5B到0x5E视为大写字母的延续区、将0x7B到0x7E视为小写字母的延续区，把无法通过 ISO&#x2F;IEC 646 提供的组合方式输出的字符（例如 <code>ÆØÅ</code> 和对应的小写 <code>æøå</code> ）和经常使用而组合方式输出过于繁琐的字符（例如 <code>ÉÄÖÅÜ</code> 和对应的小写 <code>éäöåü</code> ）放到这一区域。</li><li>日本标准 JIS C 6220-1969 将0x5c用于人民币和日元符号 <code>￥</code> ，韩国标准 KS C 5636-1989 将0x5c用于韩元符号 <code>₩</code> 。</li></ul><p>上述国家的字符集设定由于和ASCII不一致，导致国家之间的键盘布局有较大差异。例如，英国、法国、爱尔兰等将0x23定义为其他字符的国家难以输入井号 <code>#</code> 。</p><h2 id="起源：替代方法解决问题"><a href="#起源：替代方法解决问题" class="headerlink" title="起源：替代方法解决问题"></a>起源：替代方法解决问题</h2><p>为了解决该问题，C&#x2F;C++标准定义了字符组。</p><h3 id="三字符组"><a href="#三字符组" class="headerlink" title="三字符组"></a>三字符组</h3><p>在 ISO&#x2F;IEC 9899:1999 和 ISO&#x2F;IEC 14882:1998 中，定义了九种三字符组，覆盖了上述常用而可能在一些国家难以输入的符号。这些三字符组是：</p><table><thead><tr><th align="center">三字符组</th><th align="center">替代为</th></tr></thead><tbody><tr><td align="center"><code>??=</code></td><td align="center"><code>#</code></td></tr><tr><td align="center"><code>??(</code></td><td align="center"><code>[</code></td></tr><tr><td align="center"><code>??/</code></td><td align="center"><code>\</code></td></tr><tr><td align="center"><code>??)</code></td><td align="center"><code>]</code></td></tr><tr><td align="center"><code>??&#39;</code></td><td align="center"><code>^</code></td></tr><tr><td align="center"><code>??&lt;</code></td><td align="center"><code>&#123;</code></td></tr><tr><td align="center"><code>??!</code></td><td align="center"><code>|</code></td></tr><tr><td align="center"><code>??&gt;</code></td><td align="center"><code>&#125;</code></td></tr><tr><td align="center"><code>??-</code></td><td align="center"><code>~</code></td></tr></tbody></table><p>同时，还给出了两个示例：</p><p>例子1：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">??=define <span class="built_in">arraycheck</span>(a, b) a??(b??) ??!??! b??(a??)</span><br></pre></td></tr></table></figure><p>将会在编译时被替换为：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> arraycheck(a, b) a[b] || b[a]</span></span><br></pre></td></tr></table></figure><p>例子2：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Eh???/n&quot;</span>);</span><br></pre></td></tr></table></figure><p>将会在编译时被替换为：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Eh?\n&quot;</span>);</span><br></pre></td></tr></table></figure><p>如果需要使用连续的两个问号，可以用字符串自动连接 <code>&quot;...?&quot;&quot;?...&quot;</code> 或者使用转义序列 <code>&quot;...?\?...&quot;</code> 。</p><p>虽然这种设计解决了符号的输入问题，但显然导致了代码可读性严重下降。大量使用三字符组会导致代码的逻辑结构难以直观理解。</p><p>此外，由于三字符组在源文件的任何位置出现都会被替换，还会产生编程陷阱。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Code:1(Do you forget it???)\n&quot;</span>);</span><br></pre></td></tr></table></figure><p>原计划，该语句应该输出的是 <code>Code:1(Do you forget it???)</code> 然而实际上却会输出 <code>Code:1(Do you forget it?]</code> 。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">a+=b; <span class="comment">//Why add this???/</span></span><br><span class="line">b+=a;</span><br></pre></td></tr></table></figure><p>原计划，这段应该执行两行语句，而由于 <code>??/</code> 会被替换为 <code>\</code> 导致一行注释变成多行注释，使得第二行的语句不会被执行。</p><h3 id="双字符组"><a href="#双字符组" class="headerlink" title="双字符组"></a>双字符组</h3><p>为了解决可读性的问题，ISO和IEC引入了双字符组。</p><table><thead><tr><th align="center">双字符组</th><th align="center">替代为</th></tr></thead><tbody><tr><td align="center"><code>&lt;:</code></td><td align="center"><code>[</code></td></tr><tr><td align="center"><code>:&gt;</code></td><td align="center"><code>]</code></td></tr><tr><td align="center"><code>&lt;%</code></td><td align="center"><code>&#123;</code></td></tr><tr><td align="center"><code>%&gt;</code></td><td align="center"><code>&#125;</code></td></tr><tr><td align="center"><code>%:</code></td><td align="center"><code>#</code></td></tr><tr><td align="center"><code>%:%:</code></td><td align="center"><code>##</code></td></tr></tbody></table><p>此时，第一个例子就可以修改为：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">%:<span class="function">define <span class="title">arraycheck</span><span class="params">(a, b)</span> a&lt;:b:&gt; ??!??! b&lt;:a:&gt;</span></span><br></pre></td></tr></table></figure><p>将会在编译时被替换为：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> arraycheck(a, b) a[b] || b[a]</span></span><br></pre></td></tr></table></figure><p>相较于三字符组来说，双字符组的可读性显然提升。</p><p>同时，双字符组不同于三字符组。双字符组如果出现之字符串字面值、字符常量、程序注释中（如： <code>&quot;Symbol %:Used In Modulo Operation.&quot;</code> ），则不会被替换。此外，双字符组替换仅在编译器对源程序的tokenization阶段（即识别出关键字、标识符等，类似于自然语言的“断词”）发生，仅当双字符组作为一个token或者token的组成部分时（如 <code>%:%:</code> 被替换为预处理运算符 <code>##</code> ）双字符组才会被替换。</p><h3 id="C-的增补关键字"><a href="#C-的增补关键字" class="headerlink" title="C++的增补关键字"></a>C++的增补关键字</h3><p>C++除了支持上述的三字符组与双字符组外，还提供了下列内置的关键字：</p><table><thead><tr><th align="center">关键字</th><th align="center">等价于</th></tr></thead><tbody><tr><td align="center"><code>and</code></td><td align="center"><code>&amp;&amp;</code></td></tr><tr><td align="center"><code>bitor</code></td><td align="center"><code>|</code></td></tr><tr><td align="center"><code>or</code></td><td align="center"><code>||</code></td></tr><tr><td align="center"><code>xor</code></td><td align="center"><code>^</code></td></tr><tr><td align="center"><code>compl</code></td><td align="center"><code>~</code></td></tr><tr><td align="center"><code>bitand</code></td><td align="center"><code>&amp;</code></td></tr><tr><td align="center"><code>and_eq</code></td><td align="center"><code>&amp;=</code></td></tr><tr><td align="center"><code>or_eq</code></td><td align="center"><code>|=</code></td></tr><tr><td align="center"><code>xor_eq</code></td><td align="center"><code>^=</code></td></tr><tr><td align="center"><code>not</code></td><td align="center"><code>!</code></td></tr><tr><td align="center"><code>not_eq</code></td><td align="center"><code>!=</code></td></tr></tbody></table><p>此时，第一个例子就可以修改为：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">%:<span class="function">define <span class="title">arraycheck</span><span class="params">(a, b)</span> a&lt;:b:&gt; or b&lt;:a:&gt;</span></span><br></pre></td></tr></table></figure><p>将会在编译时被替换为：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> arraycheck(a, b) a[b] or b[a] <span class="comment">//or 与 || 等价</span></span></span><br></pre></td></tr></table></figure><p>通过使用关键字，程序的可读性显然又能提升。</p><h2 id="发展：万国码和兼容性差异"><a href="#发展：万国码和兼容性差异" class="headerlink" title="发展：万国码和兼容性差异"></a>发展：万国码和兼容性差异</h2><p>随着时代的发展，一些原有的硬件限制已不再是问题，而字符组的问题也随之暴露。</p><h3 id="万国码的发展"><a href="#万国码的发展" class="headerlink" title="万国码的发展"></a>万国码的发展</h3><p>ISO和IEC后来发布了 ISO&#x2F;IEC 8859 用于替代 ISO&#x2F;IEC 646 ，这是一系列8比特的字符集。ISO&#x2F;IEC 8859 统一了此前各国各语言的单独编码的混乱局面，将ASCII的全部可打印字符放入通ASCII的码位（因此 ISO&#x2F;IEC 8859 完全兼容7位的ASCII码），同时废弃了 ISO&#x2F;IEC 646 使用的字母、退格键符和符号组合来表示变音字母的方法，而是在单独区域直接编码表示变音字母。</p><p>后来，该标准被 ISO&#x2F;IEC 10646 （等价于Unicode） 替代。这是一个31比特的字符集。自此，由于编码不统一造成的编程字符无法输入的问题就被彻底解决了。</p><h3 id="兼容性问题"><a href="#兼容性问题" class="headerlink" title="兼容性问题"></a>兼容性问题</h3><p>由于一些跨平台的项目同时涉及GCC&#x2F;G++编译器和Microsoft Visual C++编译器，但这两个编译器在字符组上的行为不一致，这会引起一些编译的问题。</p><h4 id="三字符组-1"><a href="#三字符组-1" class="headerlink" title="三字符组"></a>三字符组</h4><p>GCC&#x2F;G++自C++17标准开始，编译器不再自动替换三字符组。如果需要使用三字符组替换，需要手动设定编译器命令行选项 <code>-trigraphs</code> 。</p><p>Microsoft Visual C++ 2010版开始，编译器不再自动替换三字符组。如果需要使用三字符组替换，需要手动设定编译器命令行选项 <code>/Zc:trigraphs</code> 。</p><p>同时，这两个编译器还提供了一个头文件 <code>&lt;iso646.h&gt;</code> 。这个头文件实际是一个空文件，如果编译器读到了源文件使用该头文件，则会自动进行三字符组替换。</p><h4 id="双字符组-1"><a href="#双字符组-1" class="headerlink" title="双字符组"></a>双字符组</h4><p>GCC&#x2F;G++支持双字符组的替换，但是Microsoft Visual C++不支持双字符组替换。</p><h4 id="C-的增补关键字-1"><a href="#C-的增补关键字-1" class="headerlink" title="C++的增补关键字"></a>C++的增补关键字</h4><p>GCC&#x2F;G++支持C++的增补关键字，但是Microsoft Visual C++编译器默认不支持C++的增补关键字。如果需要使用C++增补关键字，需要使用头文件 <code>&lt;ciso646&gt;</code> 。这个头文件实际是一个空文件，如果Microsoft Visual C++编译器读到了源文件使用该头文件，则会开启支持C++的增补关键字。</p><h2 id="弃用：语言简化"><a href="#弃用：语言简化" class="headerlink" title="弃用：语言简化"></a>弃用：语言简化</h2><p>GCC&#x2F;G++和Microsoft Visual C++编译器都纷纷弃用了三字符组，减少了历史包袱，简化了编程语言。</p><p>这一变化，反映了编程语言设计范式的转变，即从“机器友好”到“开发者友好”。随着时代的发展，硬件限制已经几乎不存在了，一些入门困难的语言也随之退出了舞台，只有抛弃历史包袱，提升代码可维护性的语言才能在如今的时代继续焕发光芒。正是如此，抛弃三字符组是必然的。</p><p>此外，键盘不存在编程所需的字符的问题也随着越来越智能化的有代码补全功能的IDE所解决。</p><p>在开发者社群中，三字符组的弃用也引发了讨论，有部分开发者反对抛弃三字符组。对此，激进的C++语言选择抛弃来推动语言现代化；保守的C语言选择保留来支持遗留系统（比如一些嵌入式设备）。</p><h2 id="总结：技术演进的启示"><a href="#总结：技术演进的启示" class="headerlink" title="总结：技术演进的启示"></a>总结：技术演进的启示</h2><p>字符组的兴衰其实揭示了一个技术发展中的核心矛盾： <strong>短期实用性</strong> 和 <strong>长期可持续性</strong> 之间的平衡。其兴于早期硬件限制下的务实选择，其衰于现代语言进化的必然选择。</p><blockquote><p>技术标准的价值不在于永恒正确，而在于动态适应人类认知与生产力的发展需求。</p></blockquote><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p>ISO&#x2F;IEC 标准文件 实体出版物：<br><img src="/pic/GraphSeq01.png" alt="ISO/IEC 9899:1999" width="210" height="297"></p><center>ISO/IEC 9899:1999</center><img src="/pic/GraphSeq02.png" alt="ISO/IEC 14882:1998" width="210" height="297"><center>ISO/IEC 14882:1998</center><img src="/pic/GraphSeq03.png" alt="ISO/IEC 9899:2024" width="210" height="297"><center>ISO/IEC 9899:2024</center><img src="/pic/GraphSeq04.png" alt="ISO/IEC 14882:2024" width="210" height="297"><center>ISO/IEC 14882:2024</center><p>中文维基百科：<br><a href="https://zh.wikipedia.org/wiki/ISO/IEC_646">ISO&#x2F;IEC 646</a><br><a href="https://zh.wikipedia.org/wiki/ISO/IEC_8859">ISO&#x2F;IEC 8859</a><br><a href="https://zh.wikipedia.org/wiki/ASCII">ASCII</a><br><a href="https://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E5%AD%97%E7%AC%A6%E9%9B%86">通用字符集</a><br><a href="https://zh.wikipedia.org/wiki/C%E6%9B%BF%E4%BB%A3%E6%A0%87%E8%AE%B0">C替代标记</a><br><a href="https://zh.wikipedia.org/wiki/%E4%B8%89%E5%AD%97%E7%AC%A6%E7%BB%84%E4%B8%8E%E5%8F%8C%E5%AD%97%E7%AC%A6%E7%BB%84">三字符组与双字符组</a></p><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="科技" scheme="https://www.petermatt.xin/tags/%E7%A7%91%E6%8A%80/"/>
    
    <category term="CPPUAPA周刊" scheme="https://www.petermatt.xin/tags/CPPUAPA%E5%91%A8%E5%88%8A/"/>
    
  </entry>
  
  <entry>
    <title>记一次服务器迁移</title>
    <link href="https://www.petermatt.xin/blog/Essay/Essay-01/"/>
    <id>https://www.petermatt.xin/blog/Essay/Essay-01/</id>
    <published>2024-02-17T13:18:08.000Z</published>
    <updated>2024-02-17T13:57:11.227Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>2020年3月10日，我在阿里云通过云翼计划买了一台学生机，是位于北京的轻量云应用服务器，配置是 1核 CPU|2GB 内存|40GB SSD ，能够享受118元&#x2F;年的价格四年，用于搭建我的博客和其他的东西。随后，我又用云翼计划买了第二台一样配置位于北京的服务器用于搞测试，此外还买了一台位于香港的轻量云应用服务器，配置是 1核 CPU|2GB 内存|50GB SSD ，和学生机配置相似，用于做北京服务器的备份。<br>由于国内服务器搭建的网站需要域名备案，比较麻烦，所以我备案了一个域名后就用香港的服务器作为备份，防止服务器出意外。在使用的这几年里，我用服务器学习了许多，包括如何解决一些问题和报错；学习了一些前后端框架的怎么用；学习了一些服务器软件怎么用，包括中间件、数据库等等。总之，这三台ip地址是<small title="182.92.174.234">182开头</small>、<small title="8.210.215.151">8开头</small>和<small title="39.106.227.142">39开头</small>的服务器陪伴了我很长时间。</p><p>时间进入2024年2月，这些服务器都陆续要到期了。在此之前，我是想过要直接续费来续命的，虽然不能享受学生机的价格，但说实话这个配置不高，价格想着应该还是能接受的。然而，由于阿里云技术的更新，旧服务器的续费价格实属不划算，这主要是SSD的价格有点儿贵。其实阿里云官网是有许多首年很便宜的云服务器，但续费价格都普遍会翻倍，这可能导致我又会想迁移，成本更高，因此我决定就用一个固定的相对实惠的服务器。<br>同时让我比较破防的是，我现在用的 2核 CPU|4GB 内存|80GB ESSD 的服务器价格是1428元&#x2F;年，配置都是旧服务器的两倍，但旧服务器续费是1479元&#x2F;年，甚至更贵，因此我才决定重新买然后迁移。</p><p>这次，我买了三个一样配置的北京、香港和新加坡的服务器，之所以最后一个换成了新加坡的服务器，也是因为国内服务器绑定域名要备案，因此换了一个新加坡的。<br>在此，记录下从旧的三台服务器迁移到新的三台<small title="39.106.155.144">39开头</small>、<small title="47.243.91.247">47开头</small>和<small title="47.236.28.122">47开头</small>的服务器，希望以后我还能学到更多。</p><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="日志" scheme="https://www.petermatt.xin/tags/%E6%97%A5%E5%BF%97/"/>
    
  </entry>
  
  <entry>
    <title>一种解决 Docker Compose 网段冲突的方法</title>
    <link href="https://www.petermatt.xin/blog/Docker-Compose-Network-Segment-Conflict/"/>
    <id>https://www.petermatt.xin/blog/Docker-Compose-Network-Segment-Conflict/</id>
    <published>2022-09-06T02:25:32.000Z</published>
    <updated>2023-10-14T12:11:57.153Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>本文提出了一种可以解决使用 docker compose 的容器其默认网段172.17.0.0&#x2F;16与实际网络环境网段冲突问题的方法——重建网桥。</p></blockquote><h1 id="0x00-引言"><a href="#0x00-引言" class="headerlink" title="0x00 引言"></a>0x00 引言</h1><p>为了方便校内举行算法编程比赛，我们在学校服务器上通过 docker compose 搭建了一个OJ，平常使用都没有问题，但有一次在学校综合教学楼B区机房组织进行比赛的时候，发现登不上去，ping服务器也ping不通，只能走WebVPN访问。</p><p>在和信网处的老师确认过B区机房可以正常访问服务器的网关后，我和老师确认是因为docker服务造成的网段冲突问题。</p><h1 id="0x01-学校的网络结构"><a href="#0x01-学校的网络结构" class="headerlink" title="0x01 学校的网络结构"></a>0x01 学校的网络结构</h1><p>我们学校的网络结构大概如下（仅作原理说明，非真实链路结构）：</p><p><img src="/pic/DCNSC1.png"></p><p>机房的每一台电脑会连接到机房后面的交换机上，机房后面的交换机会和这栋楼的交换机相连接，然后与学校数据中心的主交换机连接。<br>学校数据中心的主交换机还连接着互联网。<br>同时，学校的数据中心还放着其他服务器。每台服务器都连着它所在的机柜的交换机，机柜的交换机与服务器管理交换机连接，然后与数据中心的主交换机连接。<br>然后，服务器会因为docker服务而在路由表上加入连接容器的虚拟网段和网关。</p><h1 id="0x02-故障原因"><a href="#0x02-故障原因" class="headerlink" title="0x02 故障原因"></a>0x02 故障原因</h1><p><strong>简单来说，就是机房电脑的网段为172.17.0.0&#x2F;16，而docker的默认网段也为172.17.0.0&#x2F;16。</strong></p><p>比如我将OJ搭建在服务器172.28.11.4这台服务器上，正常情况下，我在宿舍或WebVPN访问时，数据会带着ip地址例如172.31.0.100告知服务器返回数据的位置，服务器接收到数据并进行处理后，准备返回数据，这时发现要返回的地址不在路由表上，于是就向机柜交换机发送数据，让机柜交换机查找目标地址然后一直向上级交换机发送数据，直到找到路由表里有这个地址的交换机，然后向下转发数据，这样我们就可以收到服务器的回复数据。</p><p>然而，如果我们在机房电脑172.17.1.2访问服务器，服务器接收到数据并进行处理后，准备返回数据，这时发现要返回的地址在路由表上，这个路由表是docker写上去的，和机房的电脑的网段正好相一致，于是他就会直接通过路由表所写的信息，将数据转发给对应ip的docker容器（即使这个容器不存在），这样，我们就收不到服务器所返回的数据，就会造成无法访问，ping也ping不通。</p><p><strong>解决方法也很简单，就是重新分配docker的网段。</strong></p><h1 id="0x03-查找容器ip地址"><a href="#0x03-查找容器ip地址" class="headerlink" title="0x03 查找容器ip地址"></a>0x03 查找容器ip地址</h1><p>首先列出所有容器</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker ps -a</span><br></pre></td></tr></table></figure><p>接着，针对容器，进行查询。例如，我们想查找容器 oj-backend (6ada6469fe6d) 的ip地址，输入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker inspect 6ada6469fe6d</span><br></pre></td></tr></table></figure><p>IPAddress后面跟的就是容器的ip地址，Gateway后面跟的就是虚拟网关。</p><p>我们找到所有我们需要重新分配ip的容器，记住容器名称，例如 oj-backend 、 oj-judge 、 oj-redis 。</p><h1 id="0x04-查找网桥"><a href="#0x04-查找网桥" class="headerlink" title="0x04 查找网桥"></a>0x04 查找网桥</h1><p>首先列出所有docker网桥</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker network <span class="built_in">ls</span></span><br></pre></td></tr></table></figure><p>接着，针对网桥id，查看详细信息。例如，针对 docker_default (4969db1ebd36) 查找输入以下指令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker network inspect 5bc11281f0ae</span><br></pre></td></tr></table></figure><p>Subnet后面跟的就是网桥的网段，Gateway后面跟的就是虚拟网关。</p><p>我们找到我们需要重新分配网段的网桥，记住网桥名称，例如 docker_default 。</p><h1 id="0x05-停止容器"><a href="#0x05-停止容器" class="headerlink" title="0x05 停止容器"></a>0x05 停止容器</h1><p>进入文件所在的文件夹，输入以下指令停止服务。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker-compose stop</span><br></pre></td></tr></table></figure><h1 id="0x06-修改容器设置"><a href="#0x06-修改容器设置" class="headerlink" title="0x06 修改容器设置"></a>0x06 修改容器设置</h1><p>我们找到 <code>docker-compose.yml</code> 文件，打开编辑，在下面找是否有类似以下内容的部分</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">networks:</span></span><br><span class="line">  <span class="attr">default:</span></span><br><span class="line">    <span class="attr">ipam:</span></span><br><span class="line">      <span class="attr">config:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">subnet:</span> <span class="string">&quot;192.168.2.0/24&quot;</span></span><br></pre></td></tr></table></figure><p>如果有，则修改网段，如果没有，则复制上面的内容在文件下方粘贴。</p><h1 id="0x07-删除原网桥"><a href="#0x07-删除原网桥" class="headerlink" title="0x07 删除原网桥"></a>0x07 删除原网桥</h1><p>我们使用刚刚记住的网桥名称，删除它</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker network inspect docker_default</span><br></pre></td></tr></table></figure><h1 id="0x08-重启docker服务"><a href="#0x08-重启docker服务" class="headerlink" title="0x08 重启docker服务"></a>0x08 重启docker服务</h1><p>使用指令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service docker restart</span><br></pre></td></tr></table></figure><p>重新启动服务</p><h1 id="0x09-重建网桥"><a href="#0x09-重建网桥" class="headerlink" title="0x09 重建网桥"></a>0x09 重建网桥</h1><p>进入文件所在的文件夹，输入以下指令就可以重建网桥。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker-compose up -d</span><br></pre></td></tr></table></figure><p>此时会报错，这是因为我们虽然新建了网桥，但是容器并未连接到新网桥，我们不用管。此时我们列出所有docker网桥，会发现网桥已经重建好了。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker network <span class="built_in">ls</span></span><br></pre></td></tr></table></figure><h1 id="0x0a-让容器连接新网桥"><a href="#0x0a-让容器连接新网桥" class="headerlink" title="0x0a 让容器连接新网桥"></a>0x0a 让容器连接新网桥</h1><p>使用我们记住的网桥名称和网络名称，使用指令让容器连接到新网桥。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">docker network connect docker_default oj-backend</span><br><span class="line">docker network connect docker_default oj-judge</span><br><span class="line">docker network connect docker_default oj-redis</span><br></pre></td></tr></table></figure><h1 id="0x0b-启动容器"><a href="#0x0b-启动容器" class="headerlink" title="0x0b 启动容器"></a>0x0b 启动容器</h1><p>进入文件所在的文件夹，输入以下指令启动的时候，应该就不会报错了，机房也就可以正常访问了。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker-compose up -d</span><br></pre></td></tr></table></figure><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="科技" scheme="https://www.petermatt.xin/tags/%E7%A7%91%E6%8A%80/"/>
    
  </entry>
  
  <entry>
    <title>【宝塔面板使用心得】L02 认识界面与配置</title>
    <link href="https://www.petermatt.xin/blog/BTPanel-L02/"/>
    <id>https://www.petermatt.xin/blog/BTPanel-L02/</id>
    <published>2022-01-15T12:41:31.000Z</published>
    <updated>2023-10-14T12:11:57.138Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p><em>本系列心得序号以L开头是Linux面板，以W开头是Windows面板。</em></p></blockquote><h2 id="登录页面"><a href="#登录页面" class="headerlink" title="登录页面"></a>登录页面</h2><p><img src="/pic/btpanell02-01.png" alt="登录页面1"><br><img src="/pic/btpanell02-02.png" alt="登录页面2"><br>上一篇，我们安装了宝塔面板，大家已经见到过这个页面了。点击右上角的二维码或计算机图标可以切换登录方式，从账号密码登录改为二维码登录。二维码登录需要使用宝塔APP，具体绑定方法可以看<a href="https://www.bt.cn/bbs/thread-47408-1-1.html">官方的教程</a>，由于需要在面板安装应用，所以目前只能使用账号密码登录。</p><blockquote><p>如果忘记面板地址和账户密码，可以输入指令 <code>bt 14</code> 查看面板默认的信息。如果修改过了信息，可以按如下步骤修改：<br>域名忘记的，输入指令 <code>bt 12</code> 关闭域名限制并使用IP登录；<br>端口忘记的，输入指令 <code>bt 8</code> 并修改端口；<br>入口忘记的，输入指令 <code>bt 11</code> 关闭入口限制并使用根目录登录；<br>用户名忘记的，输入指令 <code>bt 6</code> 修改宝塔用户名；<br>密码忘记的，输入指令 <code>bt 5</code> 修改宝塔密码。</p></blockquote><p>现在我们登录进去，认识下一个界面。</p><blockquote><p><img src="/pic/btpanell02-03.png" alt="推荐安装套件"><br>登录进入以后，会弹出一个推荐安装套件对话框，这里关闭它，我们稍后就来手动组建套件。</p></blockquote><h2 id="菜单栏"><a href="#菜单栏" class="headerlink" title="菜单栏"></a>菜单栏</h2><p><img src="/pic/btpanell02-04.png" alt="菜单栏"><br>我们首先来认识菜单栏，菜单栏最上方是服务器的IP地址，右边有一个红底的数字，点击会弹出消息盒子，这里有服务器的任务和消息列表，已经在列表里结束的会在执行日志中记录。<br>在下方，依次是首页、网站、FTP、数据库、监控、安全、文件、终端、计划任务、软件商店、面板设置和退出。点击退出项就会退回登录页面，点击其他的项就会跳转到对应页面。在哪个界面，哪个界面对应的项就会突出显示。</p><p>现在我们来看首页吧。</p><h2 id="首页"><a href="#首页" class="headerlink" title="首页"></a>首页</h2><p><img src="/pic/btpanell02-04.png" alt="首页"><br>在首页，你可以看到五个板块。</p><p><strong>第一个板块</strong>，左侧有你登录的宝塔账户名、一个宝塔的广告链接、当前的系统版本（含已经安装的Python版本），还有服务器自上次开机后不间断运行的天数；右侧有当前宝塔面板的版本号以及更新、修复和重启三个链接文字。<br>点击宝塔面板的版本号，可以看到版本迭代的更新日志。当宝塔面板有版本更新时，会有小红点的提示。点击更新文字，会弹出更新版本对话框，有更新则可以点击更新。宝塔面板的测试版是每周更新，正式版是每月更新，许多功能会先在测试版发布，当你想体验测试版功能的时候，可以点击查看详情弹出切换版本对话框，按要求操作即可切换面板为测试版。<br>当宝塔面板出现问题时，例如模块错误之类的，可以点击修复文字进行校验面板文件，若有问题会自动修复。当面板或服务器需要重启时，可以点击重启文字，然后选择重启服务器或者重启面板。</p><p><strong>状态板块</strong>中，你可以看到服务器负载状态、CPU使用率、内存使用率和磁盘使用率。<br>点击内存使用率的图表，可以释放内存。将鼠标放到其他三个图表上，可以查看详细信息。<br>点击负载状态上的问号，可以查看官方给出的<a href="https://www.bt.cn/bbs/thread-11402-1-1.html">负载状态含义</a>说明。</p><p><strong>概览模块</strong>中，你可以看到你的网站数量、FTP数量、数据库数量和安全风险数量。<br>点击前三项都可以直接跳转到对应的页面，点击安全风险可以查看当前的安全风险，然后对应去解决。</p><p><strong>软件模块</strong>有十二个格子，默认已经有一个软件占用了一个格子。这里相当于一个快速访问的位置，向这里添加软件的方法稍后会提到。这里点击软件就可以打开，将鼠标移至软件格子的右上角可以看到一个图标，点击并按住可以拖动改变软件在这十二个格子中的位置。</p><p><strong>最后一个模块</strong>，是服务器的实时数据统计，分流量和磁盘IO两张图表，每个图表右上角的菜单可以改变统计的数据范围。</p><p>现在我们点击左边的面板设置，进入下一个页面。</p><h2 id="面板设置"><a href="#面板设置" class="headerlink" title="面板设置"></a>面板设置</h2><p><img src="/pic/btpanell02-05.png" alt="面板设置"><br>在这里，有一堆开关和一堆文本框。</p><h3 id="开关模块"><a href="#开关模块" class="headerlink" title="开关模块"></a>开关模块</h3><p><strong>关闭宝塔面板</strong>开关，点击即可关闭宝塔面板不再使用。若需要恢复使用，需要输入指令 <code>rm -f /www/server/panel/data/close.pl</code> 将开关的控制文件删除来关闭开关。</p><p><strong>监听IPv6</strong>开关，如果你的服务器支持IPv6可以打开，这样面板就可以通过IPv6地址访问。如果你的服务器为纯IPv6地址，请不要关闭这个选项，如果关闭了，需要输入指令 <code>echo &quot;True&quot; &gt; /www/server/panel/data/ipv6.pl</code> 来开启开关。</p><p><strong>面板SSL</strong>开关，点击后会进入证书页面，你可以粘贴自签证书，也可以选择成Let’s Encrypt的证书输入管理员邮箱让宝塔面板帮你创建一个。笔者的建议是在域名和软件安装完后回来进行。常见问题可以查看<a href="https://www.bt.cn/bbs/thread-4689-1-1.html">官方说明</a>在宝塔面板中，这个证书保存在 <code>/www/server/panel/ssl/certificate.pem</code> 文件中，私钥保存在 <code>/www/server/panel/ssl/privateKey.pem</code> 文件中，如果要关闭面板SSL开关，需要输入指令 <code>rm -f /www/server/panel/data/ssl.pl &amp;&amp; /etc/init.d/bt restart</code> 。</p><p><strong>API接口</strong>开关，当启动了API接口，只有在IP白名单列表中的IP才能访问面板API接口。关于API接口的使用方法，可以查看<a href="https://www.bt.cn/bbs/thread-20376-1-1.html">官方的教程</a>。</p><p><strong>开发者模式</strong>开关，开启后可以更加便于开发，但会占用更多内存。</p><p><strong>离线模式</strong>开关，开启离线模式后，面板不能联网更新和下载软件，所有的安装软件和面板更新均需手动下载离线升级包和软件包进行安装升级。</p><p><strong>动态口令认证</strong>开关，这是一项安全认证设置，你可以使用宝塔App或者谷歌认证器，通过服务器的指引添加动态口令认证。如果不会使用可以查看<a href="https://www.bt.cn/bbs/thread-37437-1-1.html">官方说明</a>。如果要关闭，可以输入指令 <code>bt 24</code> 关闭动态口令认证。</p><p><strong>在线客服</strong>开关，默认是开的，开启后会在右下角显示一个在线客服的浮动标，点击后可以进入和宝塔客服聊天的页面。</p><p><strong>访问设备验证</strong>开关，具体如何使用可以查看<a href="https://www.bt.cn/bbs/thread-77863-1-1.html">官方说明</a>。如果需要关闭，可以输入指令 <code>bt 29</code> 关闭访问设备验证。</p><h3 id="文本框模块"><a href="#文本框模块" class="headerlink" title="文本框模块"></a>文本框模块</h3><p>文本框模块有一个选项卡可以切换，第二个选项卡是从全部设置中摘取与面板安全配置相关的设置（安全入口、BasicAuth认证、密码复杂度验证、密码过期时间、域名和授权IP）。</p><p><strong>别名</strong>，这个就是显示在浏览器标题的名称，可以随便改。</p><p><strong>面板端口</strong>，即宝塔面板运行的端口，十分不推荐大家仍然使用默认端口8888，请修改它。云服务器记得先放行新的端口再进行改端口，<a href="https://www.bt.cn/bbs/thread-1229-1-1.html">腾讯云</a>、<a href="https://www.bt.cn/bbs/thread-2897-1-1.html">阿里云</a>和<a href="https://www.bt.cn/bbs/thread-3923-1-1.html">华为云</a>的放行教程再次列出，其他主机商放行方法类同。如果忘记端口，输入指令 <code>bt 8</code> 并修改端口。</p><p><strong>超时时间</strong>，默认值是86400，单位是秒，也就是1天一共24小时，这里可以根据需要修改。</p><p><strong>安全入口</strong>，是为了让宝塔面板更加安全不被轻易登录而设置的，同样不推荐各位使用默认入口，如果忘记，输入指令 <code>bt 11</code> 关闭入口限制并使用根目录登录。</p><p><strong>BasicAuth认证</strong>，登录面板前增加一层账号密码认证，基于BasicAuth，使用浏览器对话框，可以有效防止面板被扫，具体介绍可以看<a href="https://www.bt.cn/bbs/thread-34374-1-1.html">官方说明</a>。如果忘记账号密码，输入指令 <code>bt 23</code> 关闭BasicAuth认证。</p><p><strong>消息通道</strong>，用于webshell查杀通知，登录告警，具体设置可以看<a href="https://www.bt.cn/bbs/thread-71298-1-1.html">官方的教程</a>。</p><p><strong>登录告警</strong>，需要设置消息通道才能用，当不在IP白名单的设备登录了宝塔面板会向消息通道发送告警，具体设置可以看<a href="https://www.bt.cn/bbs/thread-71298-1-1.html">官方的教程</a>。</p><p><strong>域名</strong>，这个域名指的是面板的访问域名，建议大家不要使用IP访问面板，这样十分不安全，一旦设置，只有该域名能访问宝塔面板。如果忘记域名，输入指令 <code>bt 12</code> 关闭域名限制并使用IP登录。</p><p><strong>授权IP</strong>，即访问宝塔面板的IP白名单，一旦设置，非白名单中的IP无法访问宝塔面板。如果需要关闭白名单，输入指令 <code>bt 13</code> 关闭。</p><p><strong>默认建站目录</strong>，所有的网站默认都会保存到这个目录的子目录中，保持默认值 <code>/www/wwwroot</code> 即可，如果确有需要也可以修改，我们后续一些心得中会默认大家使用的是这个默认值，如果有修改，请在后面的心得中自行修改对应的参数或者命令。</p><p><strong>默认备份目录</strong>，所有的备份文件默认都会保存到这个目录当中，保持默认值 <code>/www/backup</code> 即可，如果确有需要也可以修改，我们后续一些心得中会默认大家使用的是这个默认值，如果有修改，请在后面的心得中自行修改对应的参数或者命令。</p><p><strong>服务器IP</strong>，默认是宝塔面板检测出来的IP，建议各位填写外网IP，如果没有外网需求或者在局域网内使用或者和笔者一样是使用虚拟机测试，则可以填写内网IP，这个IP地址会在宝塔面板的菜单栏显示，部分地方的参数也会默认填写这个值。</p><p><strong>服务器时间</strong>，如果服务器时间不对，可以点击同步按钮同步一下。<br>如果时区不对，可以输入指令 <code>tzselect</code> 选择时区，然后输入 <code>cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime</code> 调整时区，其中的主次时区由刚才你选择的时区决定。<br>RedHat和CentOS还可以通过 <code>timeconfig</code> 指令找到时区，Ubuntu还可以通过 <code>dpkg-reconfigure tzdata</code> 指令找到时区。<br>设置服务器自动同步时间的方法我们于下篇再说。</p><p><strong>面板用户</strong>，即登录面板的用户名，如果忘记用户名，输入指令 <code>bt 6</code> 修改宝塔用户名。</p><p><strong>面板密码</strong>，即登录面板的密码，如果忘记密码，输入指令 <code>bt 5</code> 修改宝塔密码。</p><p><strong>密码复杂度验证</strong>，开启后，宝塔密码必须设置成满足复杂度验证规则的，规则为长度大于8位且为大写字母、小写字母、数字、特殊字符至少3项的组合。</p><p><strong>密码过期时间</strong>，设置后，如果上次密码设置后到了过期时间，则面板会强制提示修改密码。将时间设置为 <code>0</code> 天以关闭密码过期时间功能。</p><p><strong>绑定宝塔账号</strong>，即绑定一个宝塔账号，7.8.0版本要求强制绑定宝塔账号，无论是服务器是否开启了离线模式。<br>在离线模式下，由于不会连接宝塔官网，所以会出现无法绑定的情况，所以需要先关闭离线模式，然后再换绑宝塔账号，之后再开启离线模式。<br>如果服务器在开启离线模式的时候直接解绑宝塔账号，需要输入指令 <code>rm -f /www/server/panel/data/not_network.pl</code> 关闭离线模式，然后再绑定宝塔账号，之后再开启离线模式。</p><p><strong>面板菜单栏隐藏</strong>，除了本篇介绍的首页、软件商店、面板设置和退出四个项无法隐藏外，其他项目均可隐藏不显示。注意这里起的作用是在菜单栏隐藏而不是禁用，访问对应地址面板对应的功能仍可正常使用。</p><p><strong>临时访问授权</strong>，可以创建一个临时的访问授权链接，将链接给他人，他人便可以有一次临时访问面板的授权，已经授权的访问会在这里留下记录。</p><p>现在，点击软件商店，我们来配置服务器环境。</p><h2 id="软件商店"><a href="#软件商店" class="headerlink" title="软件商店"></a>软件商店</h2><p><img src="/pic/btpanell02-06.png" alt="软件商店"><br>软件商店是宝塔提供的一键安装软件的一个功能，离线模式下不能正常使用。</p><ul><li>全部就是目前宝塔的全部应用；</li><li>已安装就是服务器已经安装的应用；</li><li>运行环境就是一些常用的运行环境；</li><li>系统工具就是一些管理系统的工具；</li><li>宝塔插件就是宝塔官方提供的免费插件；</li><li>专业版插件就是宝塔官方提供的专业版、企业版免费，其余版本付费的插件；</li><li>企业版插件就是宝塔官方提供的企业版免费其余版本付费的插件；</li><li>第三方应用就是由其他开发者开发的应用，功能也比较多；</li><li>一键部署是一个单独的类别，我们等会儿再说。</li></ul><p>在应用分类的右边有一个更新软件列表的按钮，点击可以获取宝塔官方最新的软件列表。</p><p>接下来是一个广告横幅。如果你有使用专业版和企业版的需求，可以考虑购买对应的版本。</p><p align="right"><em><font size="1"><a href="https://www.bt.cn/?invite_code=MV9rYXV5Z2Y=" target="_blank" rel="noopener">广告：宝塔服务器面板，一键全能部署及管理，送你￥3188礼包，点我领取</a></font></em></p><p>然后是一个最近使用入口，和首页的软件模块相比，这里显示的是最近使用的项目而不能自定义。</p><p>之后就是软件列表。软件分免费的和付费的。<br>软件列表会显示一个软件的名称、开发商、说明以及付费软件的到期时间，免费软件和已经购买的软件可以点击操作处的安装文字直接安装。<br>一个软件被安装后，位置处会多一个文件夹的图标，点击即可跳转到安装位置；状态处会显示当前软件的状态，绿色播放图标表示正常运行，红色暂停图标则表示出现问题；首页显示处会多出一个开关，打开开关就会向首页软件模块添加当前软件的图标。<br>同时，一个软件被安装后，操作处会从 <code>安装</code> 变为 <code>更新|设置|修复|卸载</code> 。更新文字只有当软件有新版本时才会显示，点击即可更新软件的新版本；设置文字点击后会进入软件的UI界面，每个软件的界面和内容都有所差异，首页的软件模块和这个页面的最近使用入口都是调用这个设置链接；很多软件会有修复功能，点击后可以对软件的完整性以及功能进行修复；最后是卸载文字，点击后就会将该软件卸载。</p><h3 id="安装套件"><a href="#安装套件" class="headerlink" title="安装套件"></a>安装套件</h3><p>现在我们来配置服务器的运行环境，首先我们来看知名的LNMP和LAMP套件。所谓LNMP，L就是指Linux，N就是指Nginx，M一般指MySQL，也可以指MySQL Mariadb，P一般指PHP，也可以指Perl或Python；LAMP就是将LNMP中N代表的Nginx换成A代表的Apache。<br>宝塔面板在推荐我们安装LNMP的同时还推荐我们安装Pure-Ftpd和phpMyAdmin。Pure-Ftpd可以提供FTP服务，phpMyAdmin提供可视化数据库管理服务。</p><p>宝塔官方给我们推荐的配置是</p><ul><li>Nginx 1.20</li><li>MySQL 5.6</li><li>Pure-Ftpd 1.0.49</li><li>PHP 5.6</li><li>phpMyAdmin 4.4</li></ul><p>你可以跟着官方的安装，当然你也可以自己选择，比如目前我的服务器所运行的这几个软件对应的版本是</p><ul><li>Nginx 1.20</li><li>MySQL Mariadb 10.5</li><li>Pure-Ftpd 1.0.49</li><li>PHP 5.6,7.2,7.4</li><li>phpMyAdmin 5.1</li></ul><p>如果有Java项目需求还可以安装Tomcat，如果有Node项目需求还可以Node.js版本管理器等等，其他软件都可以根据需要自行安装。</p><h3 id="一键部署"><a href="#一键部署" class="headerlink" title="一键部署"></a>一键部署</h3><p><img src="/pic/btpanell02-07.png" alt="一键部署"><br>一键部署是什么？宝塔为一些诸如WordPress，discuz等常用项目的开发者提供了一个接口，项目开发者可以将项目打包并写一个自动部署脚本方便宝塔面板的用户使用。</p><p>点进一键部署，你会看到现在的列表，除了全部以外，官方还将其中的一些项目进行了分类。<br>每个项目都有名称、版本、简介、支持PHP版本、提供者、评价和操作。<br>点击简介后面的问号，可以跳转到提供者在宝塔论坛发的贴子的地址，点击提供者，可以跳转到提供者的网站，当部署项目出现问题时，可以试着访问这两个地址，往往能够得到解决方法。<br>点击评价可以参与一个项目的评分。<br>点击一键部署，按照要求填写网站的信息即可部署，宝塔面板会自动下载源码，运行自动化脚本，然后告诉你安装入口或者后台账号密码，按照提示即可很方便的完成部署。<br>由于一键部署与创建一个新的网站的区别仅为前者宝塔会自动下载源码，其余填写信息和配置上并无大差，所以笔者就不在这里讲述新建网站等等一系列过程了，详细的过程会放在之后的心得里。</p><h2 id="下篇"><a href="#下篇" class="headerlink" title="下篇"></a>下篇</h2><p>下一篇心得，笔者将带大家对面板的监控、安全、文件、终端、计划任务几个模块进行了解。</p><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="宝塔面板使用心得" scheme="https://www.petermatt.xin/tags/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E4%BD%BF%E7%94%A8%E5%BF%83%E5%BE%97/"/>
    
    <category term="宝塔Linux面板" scheme="https://www.petermatt.xin/tags/%E5%AE%9D%E5%A1%94Linux%E9%9D%A2%E6%9D%BF/"/>
    
  </entry>
  
  <entry>
    <title>【宝塔面板使用心得】L01 宝塔面板的安装</title>
    <link href="https://www.petermatt.xin/blog/BTPanel-L01/"/>
    <id>https://www.petermatt.xin/blog/BTPanel-L01/</id>
    <published>2022-01-04T11:29:14.000Z</published>
    <updated>2023-10-14T12:11:57.134Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p><em>本系列心得序号以L开头是Linux面板，以W开头是Windows面板。</em></p></blockquote><h2 id="什么是宝塔面板？"><a href="#什么是宝塔面板？" class="headerlink" title="什么是宝塔面板？"></a>什么是宝塔面板？</h2><p>一般，我们的个人电脑的操作系统都会安装带有桌面或者是可视化界面，但是服务器的操作系统为了追求运行服务的性能，不会带有桌面或者是可视化界面。一般服务器操作系统只有一个输入命令的框，这对初入服务器维护的学习者来说十分不友好；同时，一些大量的重复性操作也会浪费老手的很多时间，十分不方便。因此，一个为了方便新手与老手服务器运维人员的可视化界面——服务器面板便应运而生。宝塔面板就是众多服务器面板软件中的一种，也是目前服务器实操运维和电子数据取证竞赛出现频率较高的一种。  </p><blockquote><p><em>“宝塔Linux面板是提升运维效率的服务器管理软件，支持一键LAMP&#x2F;LNMP&#x2F;集群&#x2F;监控&#x2F;网站&#x2F;FTP&#x2F;数据库&#x2F;JAVA等100多项服务器管理功能。<br>“有30个人的专业团队研发及维护，经过200多个版本的迭代，功能全，少出错且足够安全，已获得全球百万用户认可安装。运维要高效，装宝塔。”<br>——宝塔面板开发团队对Linux版的介绍</em></p></blockquote><h2 id="安装宝塔面板"><a href="#安装宝塔面板" class="headerlink" title="安装宝塔面板"></a>安装宝塔面板</h2><p>宝塔面板可以安装在Linux和Windows系统的服务器上。Linux版支持CentOS 7.1+ (Ubuntu16.04+.、Debian9.0+)，Windows版仅支持Windows Server 2008&#x2F;2012&#x2F;2016&#x2F;2019 64位。</p><blockquote><p>本系列心得基于在VMware Workstation 16.x虚拟机运行的Ubuntu20.04，4核，内存4G，硬盘80G上讲解，并安装Linux 7.8.0版，面板部分内容由于机型与版本原因会有所出入，请读者自行甄别。</p></blockquote><p>打开<a href="https://www.bt.cn/">官网</a>，点击立即安装，下滑选择对应版本的安装命令，复制代码并在系统中粘贴运行。<br><img src="/pic/btpanell01-01.png" alt="输入命令"></p><p>在安装时，你会遇到下图的等待界面，这是选择宝塔的安装路径，笔者建议读者使用默认的&#x2F;www路径进行安装，如果是默认的路径这里输入y并敲回车即可。<br><img src="/pic/btpanell01-02.png" alt="选择路径"></p><p>当你看到如下界面，即说明安装已完毕。<br><img src="/pic/btpanell01-03.png" alt="安装完毕"></p><blockquote><p>请注意，如果你是云服务器，由于大部分主机商有安全组的限制，你需要手动放行宝塔面板默认端口8888，不放行不能用，官方提供了<a href="https://www.bt.cn/bbs/thread-1229-1-1.html">腾讯云</a>、<a href="https://www.bt.cn/bbs/thread-2897-1-1.html">阿里云</a>和<a href="https://www.bt.cn/bbs/thread-3923-1-1.html">华为云</a>的放行教程，其他主机商放行方法类同。</p></blockquote><p>现在，你可以访问你服务器的宝塔面板了，地址、用户名及密码已经在安装完成的界面给出。<br><img src="/pic/btpanell01-04.png" alt="安装完毕"></p><p>进入后，同意“《用户协议》”并绑定宝塔账号即可使用。</p><p>你可以选择现在安装LNMP或者LAMP套件，也可以选择在下一篇心得中和笔者一起手动组建套件。</p><p>最后，笔者在这里放出宝塔官方给出的<a href="https://www.bt.cn/btcode.html">宝塔linux面板命令大全</a>。笔者将在以后的篇章中对宝塔linux面板的命令进行讲解分析。</p><h2 id="下篇"><a href="#下篇" class="headerlink" title="下篇"></a>下篇</h2><p>下一篇心得，笔者将带大家对面板进行基本的配置，对面板的基础功能进行讲解。</p><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="宝塔面板使用心得" scheme="https://www.petermatt.xin/tags/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E4%BD%BF%E7%94%A8%E5%BF%83%E5%BE%97/"/>
    
    <category term="宝塔Linux面板" scheme="https://www.petermatt.xin/tags/%E5%AE%9D%E5%A1%94Linux%E9%9D%A2%E6%9D%BF/"/>
    
  </entry>
  
  <entry>
    <title>【宝塔面板使用心得】L00 安装服务器操作系统</title>
    <link href="https://www.petermatt.xin/blog/BTPanel-L00/"/>
    <id>https://www.petermatt.xin/blog/BTPanel-L00/</id>
    <published>2022-01-03T11:59:51.000Z</published>
    <updated>2023-10-14T12:11:57.130Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p><em>本系列心得序号以L开头是Linux面板，以W开头是Windows面板。</em></p></blockquote><p>与桌面操作系统不同，服务器操作系统一般是安装在大型计算机上，用于提供例如Web、应用、数据库等特定服务的操作系统。</p><p>宝塔面板可以安装在Linux和Windows系统的服务器上。Linux版支持CentOS 7.1+ (Ubuntu16.04+.、Debian9.0+)，Windows版仅支持Windows Server 2008&#x2F;2012&#x2F;2016&#x2F;2019 64位。</p><blockquote><p>本系列心得基于在VMware Workstation 16.x虚拟机运行的Ubuntu20.04，4核，内存4G，硬盘80G上讲解，并安装Linux 7.8.0版，面板部分内容由于机型与版本原因会有所出入，请读者自行甄别。</p></blockquote><h2 id="安装VMware"><a href="#安装VMware" class="headerlink" title="安装VMware"></a>安装VMware</h2><p>打开<a href="https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html">VMware官网</a>，根据你自己系统的类型，点击页面最下方的立即下载。<br><img src="/pic/btpanell00-01.png" alt="官网下载"></p><p>然后点开安装程序，开始安装。<br><img src="/pic/btpanell00-02.png" alt="安装程序1"></p><p>同意许可协议。<br><img src="/pic/btpanell00-03.png" alt="安装程序2"></p><p>此处建议勾选增强型键盘驱动程序。<br><img src="/pic/btpanell00-04.png" alt="安装程序3"></p><p>单击“下一步”即可。<br><img src="/pic/btpanell00-05.png" alt="安装程序4"><br><img src="/pic/btpanell00-06.png" alt="安装程序5"></p><p>单击“安装”，并等待安装进度条。<br><img src="/pic/btpanell00-07.png" alt="安装程序6"></p><p>你可以看到安装已经完毕，可以点击许可证输入密钥或者点击完成后稍后输入密钥，这里点击许可证直接输入密钥。<br><img src="/pic/btpanell00-08.png" alt="安装程序7"></p><blockquote><p>VMware Workstation 作为虚拟机软件中十分经典而且流行的一款，十分建议各位购买正版软件，支持正版。但是，由于学生的经济实力有限或者你只想试用这款软件，往往你不会去购买正版软件（这还真是可惜），而是使用搜索引擎得到VMware Workstation的破解密钥。<br><strong><center>笔者并不会在这里列出那些密钥。</center></strong></p></blockquote><p>输入密钥并点击“输入”。<br><img src="/pic/btpanell00-09.png" alt="安装程序8"></p><p>单击“完成”，结束安装。<br><img src="/pic/btpanell00-10.png" alt="安装程序9"></p><p>Oops!它提示要重启了！笔者建议各位重启自己的电脑，因为VMware Workstation需要一些系统服务支持才能够正常运行。请确认别的工作文件已经保存，然后点击“是”，笔者在这里等待大家几分钟。<br><img src="/pic/btpanell00-11.png" alt="安装程序10"></p><h2 id="安装Linux"><a href="#安装Linux" class="headerlink" title="安装Linux"></a>安装Linux</h2><p>欢迎回到本系列心得！虚拟机准备好了，现在我们来安装操作系统吧！</p><p>Linux的发行版本诸多，这里以算法竞赛、电子数据取证竞赛中都经常用到的一个版本Ubuntu来安装。Ubuntu基于Debian，对各类硬件的支持比较完善，而且界面友好、上手容易，最大的优点是Ubuntu的所有发行版本都免费提供。</p><h3 id="下载Ubuntu镜像"><a href="#下载Ubuntu镜像" class="headerlink" title="下载Ubuntu镜像"></a>下载Ubuntu镜像</h3><p>打开<a href="http://releases.ubuntu.com/">Ubuntu官网</a>，你会发现页面上方列出了许多Ubuntu的发行版本，这里以<a href="http://releases.ubuntu.com/focal/">Ubuntu 20.04.3 LTS (Focal Fossa)</a>为例，给大家讲解下安装操作系统的方法。<br><img src="/pic/btpanell00-12.png" alt="Ubuntu官网"></p><p>点开对应版本的页面，你会发现有两个版本的下载页面。第一个版本是Desktop image，这是桌面版本，经常用于个人电脑；第二个版本是Server install image，即服务器版本。这里，选择服务器版本下载，点击右边的超链接即可下载。<br><img src="/pic/btpanell00-13.png" alt="Ubuntu20.04页面"></p><blockquote><p>如果你有想尝试使用Ubuntu系统的想法，可以在看完本系列心得后自行下载桌面版本安装使用。</p></blockquote><h3 id="创建虚拟机"><a href="#创建虚拟机" class="headerlink" title="创建虚拟机"></a>创建虚拟机</h3><p>现在，我们点开VMware Workstation，你看到了主页选项卡，现在点击“创建新的虚拟机”。<br><img src="/pic/btpanell00-14.png" alt="VM主页"></p><p>选择“自定义(高级)(C)”，并点击“下一步”。<br><img src="/pic/btpanell00-15.png" alt="VM创建1"></p><p>默认Workstation 16.x即可。<br><img src="/pic/btpanell00-16.png" alt="VM创建2"></p><p>请选择“稍后安装操作系统(S)。”。<br><img src="/pic/btpanell00-17.png" alt="VM创建3"></p><p>请将系统选为Linux—Ubuntu 64 位。<br><img src="/pic/btpanell00-18.png" alt="VM创建4"></p><p>你可以自行选择虚拟机名称和它的位置，这不影响使用。<br><img src="/pic/btpanell00-19.png" alt="VM创建5"></p><p>你可以使用默认的处理器配置，也可以和本心得一样，设为2个处理器每个处理器2核的4核配置。<br><img src="/pic/btpanell00-20.png" alt="VM创建6"></p><p>内存可以是推荐的4GB即4096MB，本心得也用的是4GB。<br><img src="/pic/btpanell00-21.png" alt="VM创建7"></p><p>默认NAT模式即可。<br><img src="/pic/btpanell00-22.png" alt="VM创建8"></p><p>推荐的 LSI Logic 即可。<br><img src="/pic/btpanell00-23.png" alt="VM创建9"></p><p>推荐的 SCSI 即可。<br><img src="/pic/btpanell00-24.png" alt="VM创建10"></p><p>选择“创建新虚拟磁盘”。<br><img src="/pic/btpanell00-25.png" alt="VM创建11"></p><p>推荐20GB，你也可以和本心得一样改成80GB。<br><img src="/pic/btpanell00-26.png" alt="VM创建12"></p><p>这里的名称不影响使用，默认即可。<br><img src="/pic/btpanell00-27.png" alt="VM创建13"></p><p>已经准备好创建虚拟机，但是不要急着点完成，这里点击“自定义硬件”。<br><img src="/pic/btpanell00-28.png" alt="VM创建14"></p><p>选择“新 CD&#x2F;DVD (SATA)”，选择“使用 ISO 映像文件”，浏览选中本节刚开始下载的 Ubuntu 20.04 的服务器镜像，然后单击“关闭”。<br><img src="/pic/btpanell00-29.png" alt="VM创建15"></p><p>现在可以点击“完成”了。<br><img src="/pic/btpanell00-28.png" alt="VM创建16"></p><h3 id="安装操作系统"><a href="#安装操作系统" class="headerlink" title="安装操作系统"></a>安装操作系统</h3><p>现在，你已经看到虚拟机的页面，单击“开启此虚拟机”<br><img src="/pic/btpanell00-30.png" alt="VM虚拟机"></p><p>当安装程序的光标在“English”上时，敲回车进行选择。<br><img src="/pic/btpanell00-31.png" alt="安装系统1"></p><p>这里它提示我们有更新，直接选择“Continue without updating”，不要更新。<br><img src="/pic/btpanell00-32.png" alt="安装系统2"></p><p>这里按上下键切换选择项，在Layout这里按空格弹出菜单，上下选择“Chinese”，你会发现Variant现在也是“Chinese”，选中“Done”确认即可。<br><img src="/pic/btpanell00-33.png" alt="安装系统3"></p><p>网络连接这里直接确认过去即可。<br><img src="/pic/btpanell00-34.png" alt="安装系统4"></p><p>代理这里直接确认过去跳过即可。<br><img src="/pic/btpanell00-35.png" alt="安装系统5"></p><p>镜像源这里直接默认即可。<br><img src="/pic/btpanell00-36.png" alt="安装系统6"></p><p>磁盘按默认的整个磁盘安装即可。<br><img src="/pic/btpanell00-37.png" alt="安装系统7"></p><p>存储设置这里直接默认即可。这里，它提示是否确认设置，选择“Continue”确认设置。<br><img src="/pic/btpanell00-38.png" alt="安装系统8"></p><p>资料配置这里按你自己的需要填写。<br><img src="/pic/btpanell00-39.png" alt="安装系统9"></p><p>建议安装OpenSSH，按空格选中。<br><img src="/pic/btpanell00-40.png" alt="安装系统10"></p><p>一些服务器环境，建议不要安装，我们将在宝塔面板中对服务器环境进行安装和配置。确认过后我们等待安装即可。<br><img src="/pic/btpanell00-41.png" alt="安装系统11"></p><p>现在，已经安装完了，选择“Reboot Now”重新启动系统。<br><img src="/pic/btpanell00-42.png" alt="安装系统12"></p><p>这个页面直接敲回车即可，VMware已经帮你把镜像自动移除了。<br><img src="/pic/btpanell00-43.png" alt="安装系统13"></p><p>当你看到login或者静止不动，就说明已经加载完毕，可以输入刚刚设置的用户名和密码登录了。<br><img src="/pic/btpanell00-44.png" alt="安装系统14"></p><p>现在，你已经安装完毕了！可以点击VMware Workstation的我已完成安装了。<br><img src="/pic/btpanell00-45.png" alt="安装系统15"></p><h2 id="下篇"><a href="#下篇" class="headerlink" title="下篇"></a>下篇</h2><p>下一篇心得，笔者向带大家介绍宝塔Linux面板，并且带大家安装面板。</p><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="宝塔面板使用心得" scheme="https://www.petermatt.xin/tags/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E4%BD%BF%E7%94%A8%E5%BF%83%E5%BE%97/"/>
    
    <category term="宝塔Linux面板" scheme="https://www.petermatt.xin/tags/%E5%AE%9D%E5%A1%94Linux%E9%9D%A2%E6%9D%BF/"/>
    
  </entry>
  
  <entry>
    <title>C++内置数据类型与二进制存储</title>
    <link href="https://www.petermatt.xin/blog/Cpp-Binary-Storage/"/>
    <id>https://www.petermatt.xin/blog/Cpp-Binary-Storage/</id>
    <published>2021-08-01T13:00:03.000Z</published>
    <updated>2023-10-14T12:11:57.150Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>平时，很多同学因为两个int类型的变量相乘变成了负数的问题而头疼，将变量换成了long long类型后便可以解决，但不知道为什么。本文笔者就将向大家介绍C++内置数据类型与二进制存储，以便大家理解。</p><h2 id="C-内置数据类型"><a href="#C-内置数据类型" class="headerlink" title="C++内置数据类型"></a>C++内置数据类型</h2><p>C++有非常多的数据类型，尤其是STL预写了十分多的数据类型，本文仅介绍原生内置的数据类型。</p><h3 id="最基本的内置类型"><a href="#最基本的内置类型" class="headerlink" title="最基本的内置类型"></a>最基本的内置类型</h3><p>C++最基本的内置类型有以下七种：</p><ol><li>布尔型，关键字是bool</li><li>窄字符型，关键字是char</li><li>宽字符型，关键字是wchar_t</li><li>整型，关键字是int</li><li>单精度浮点型，关键字是float</li><li>双精度浮点型，关键字是double</li><li>无类型，关键字是void</li></ol><h3 id="基本的内置类型"><a href="#基本的内置类型" class="headerlink" title="基本的内置类型"></a>基本的内置类型</h3><p>同时，一个最基本的内置类型可以被以下的一个或者多个类型修饰符修饰：</p><ul><li>signed</li><li>unsigned</li><li>short</li><li>long</li></ul><p>因此，我们组合出了C++基本的内置类型。<br>下表列出了这些基本的内置类型在内存中占用的空间以及该类型的变量所能存储的最小值和最大值。<br><em>1字节为8位。</em></p><table><thead><tr><th align="right">关键字（[ ]表示可省略）</th><th align="right">占用空间（字节）</th><th align="right">变量范围</th><th align="left">备注</th></tr></thead><tbody><tr><td align="right">bool</td><td align="right">1</td><td align="right">$0$~$1$</td><td align="left"></td></tr><tr><td align="right">char</td><td align="right">1</td><td align="right">$-2^7$~$2^7-1$</td><td align="left"></td></tr><tr><td align="right">signed char</td><td align="right">1</td><td align="right">$-2^7$~$2^7-1$</td><td align="left"></td></tr><tr><td align="right">unsigned char</td><td align="right">1</td><td align="right">$0$~$2^8-1$</td><td align="left"></td></tr><tr><td align="right">wchar_t</td><td align="right">2</td><td align="right">$0$~$2^{16}-1$</td><td align="left"></td></tr><tr><td align="right">signed wchar_t</td><td align="right">2</td><td align="right">$0$~$2^{16}-1$</td><td align="left"></td></tr><tr><td align="right">unsigned wchar_t</td><td align="right">4</td><td align="right">$0$~$2^{32}-1$</td><td align="left"></td></tr><tr><td align="right">int</td><td align="right">2或4</td><td align="right">$-2^{15}$~$2^{15}-1$ 或 $-2^{31}$~$2^{31}-1$</td><td align="left">16位系统为2字节，32位和64位系统为4字节</td></tr><tr><td align="right">signed [int]</td><td align="right">2或4</td><td align="right">$-2^{15}$~$2^{15}-1$ 或 $-2^{31}$~$2^{31}-1$</td><td align="left">16位系统为2字节，32位和64位系统为4字节</td></tr><tr><td align="right">unsigned [int]</td><td align="right">2或4</td><td align="right">$0$~$2^{16}-1$ 或 $0$~$2^{32}-1$</td><td align="left">16位系统为2字节，32位和64位系统为4字节</td></tr><tr><td align="right">short [int]</td><td align="right">2</td><td align="right">$-2^{15}$~$2^{15}-1$</td><td align="left"></td></tr><tr><td align="right">signed short [int]</td><td align="right">2</td><td align="right">$-2^{15}$~$2^{15}-1$</td><td align="left"></td></tr><tr><td align="right">unsigned short [int]</td><td align="right">2</td><td align="right">$0$~$2^{16}-1$</td><td align="left"></td></tr><tr><td align="right">long [int]</td><td align="right">4或8</td><td align="right">$-2^{31}$~$2^{31}-1$ 或 $-2^{63}$~$2^{63}-1$</td><td align="left">GCC、Clang 等实现中，64位代码的long类型为8字节，而MSVC中则维持4字节</td></tr><tr><td align="right">signed long [int]</td><td align="right">4或8</td><td align="right">$-2^{31}$~$2^{31}-1$ 或 $-2^{63}$~$2^{63}-1$</td><td align="left">GCC、Clang 等实现中，64位代码的long类型为8字节，而MSVC中则维持4字节</td></tr><tr><td align="right">unsigned long [int]</td><td align="right">4或8</td><td align="right">$0$~$2^{32}-1$ 或 $0$~$2^{64}-1$</td><td align="left">GCC、Clang 等实现中，64位代码的long类型为8字节，而MSVC中则维持4字节</td></tr><tr><td align="right">long long [int]</td><td align="right">8</td><td align="right">$-2^{63}$~$2^{63}-1$</td><td align="left"></td></tr><tr><td align="right">signed long long [int]</td><td align="right">8</td><td align="right">$-2^{63}$~$2^{63}-1$</td><td align="left"></td></tr><tr><td align="right">unsigned long long [int]</td><td align="right">8</td><td align="right">$0$~$2^{64}-1$</td><td align="left"></td></tr><tr><td align="right">float</td><td align="right">4</td><td align="right">$\pm 1.17549\times{10}^{-38}$~$\pm 3.40282\times{10}^{+38}$ ，有效数字7位</td><td align="left"></td></tr><tr><td align="right">double</td><td align="right">8</td><td align="right">$\pm 2.22507\times{10}^{-308}$~$\pm 1.79769\times{10}^{+308}$ ，有效数字15位</td><td align="left"></td></tr><tr><td align="right">long double</td><td align="right">10或16</td><td align="right">$\pm 3.3621\times{10}^{-4932}$~$\pm 1.18973\times{10}^{+4932}$ ，有效数字18位或33位</td><td align="left">在大多数平台上的实现与double相同，实现由编译器定义。</td></tr></tbody></table><p><em>如上表所示，加signed修饰符和不加修饰符的内存占用和数据范围一致，一般无需添加。</em>  </p><blockquote><p>上表所有的数据会由于编译器与系统环境的不同而有所差异。<br>读者可以运行如下代码查看自己电脑对应的数值。</p></blockquote><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;iostream&gt;</span>  </span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;limits&gt;</span>  </span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;  </span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;bool: \t\t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">bool</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">bool</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">bool</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;char: \t\t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">char</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (<span class="type">int</span>)(numeric_limits&lt;<span class="type">char</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t\t最小值：&quot;</span> &lt;&lt; (<span class="type">int</span>)(numeric_limits&lt;<span class="type">char</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;signed char: \t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">signed</span> <span class="type">char</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (<span class="type">int</span>)(numeric_limits&lt;<span class="type">signed</span> <span class="type">char</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t\t最小值：&quot;</span> &lt;&lt; (<span class="type">int</span>)(numeric_limits&lt;<span class="type">signed</span> <span class="type">char</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;unsigned char: \t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">unsigned</span> <span class="type">char</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (<span class="type">int</span>)(numeric_limits&lt;<span class="type">unsigned</span> <span class="type">char</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t\t最小值：&quot;</span> &lt;&lt; (<span class="type">int</span>)(numeric_limits&lt;<span class="type">unsigned</span> <span class="type">char</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;wchar_t: \t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">wchar_t</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">wchar_t</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">wchar_t</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;signed wchar_t: \t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">signed</span> <span class="type">wchar_t</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">signed</span> <span class="type">wchar_t</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">signed</span> <span class="type">wchar_t</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;unsigned wchar_t: \t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">unsigned</span> <span class="type">wchar_t</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">unsigned</span> <span class="type">wchar_t</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">unsigned</span> <span class="type">wchar_t</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;int: \t\t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;signed int: \t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">signed</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">signed</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">signed</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;unsigned int: \t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">unsigned</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">unsigned</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">unsigned</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;short int: \t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">short</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">short</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">short</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;signed short int: \t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">signed</span> <span class="type">short</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">signed</span> <span class="type">short</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">signed</span> <span class="type">short</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;unsigned short int: \t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">unsigned</span> <span class="type">short</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">unsigned</span> <span class="type">short</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">unsigned</span> <span class="type">short</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;long int: \t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">long</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">long</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">long</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;signed long int: \t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">signed</span> <span class="type">long</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">signed</span> <span class="type">long</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">signed</span> <span class="type">long</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;unsigned long int: \t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">unsigned</span> <span class="type">long</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">unsigned</span> <span class="type">long</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">unsigned</span> <span class="type">long</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;long long int: \t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">long</span> <span class="type">long</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">long</span> <span class="type">long</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">long</span> <span class="type">long</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;signed long long int: \t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">signed</span> <span class="type">long</span> <span class="type">long</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">signed</span> <span class="type">long</span> <span class="type">long</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">signed</span> <span class="type">long</span> <span class="type">long</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;unsigned long long int: &quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">unsigned</span> <span class="type">long</span> <span class="type">long</span> <span class="type">int</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">unsigned</span> <span class="type">long</span> <span class="type">long</span> <span class="type">int</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">unsigned</span> <span class="type">long</span> <span class="type">long</span> <span class="type">int</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;float: \t\t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">float</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">float</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">float</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;double: \t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">double</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">double</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">double</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;long double: \t\t&quot;</span> &lt;&lt; <span class="string">&quot;所占字节数：&quot;</span> &lt;&lt; <span class="built_in">sizeof</span>(<span class="type">long</span> <span class="type">double</span>);  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t最大值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">long</span> <span class="type">double</span>&gt;::max)();  </span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;\t\t最小值：&quot;</span> &lt;&lt; (numeric_limits&lt;<span class="type">long</span> <span class="type">double</span>&gt;::min)() &lt;&lt; endl;  </span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;  </span><br><span class="line">&#125;  </span><br></pre></td></tr></table></figure><h2 id="二进制存储"><a href="#二进制存储" class="headerlink" title="二进制存储"></a>二进制存储</h2><p>不知道有没有同学好奇过为什么这些类型变量的数据范围是这样的，笔者在这里向大家讲述下这些范围是怎么得出来的。</p><h3 id="二进制"><a href="#二进制" class="headerlink" title="二进制"></a>二进制</h3><p>相信很多同学们都看出来了，这些变量的范围大多都与2有关，这是因为计算机内部存储数据时使用二进制，在向用户显示时使用八进制、十进制、十六进制等进制。</p><p>二进制，就是逢二进一的一种进制。对于整数部分，比如 $13_{(10)}$ ，由于 $13_{(10)}&#x3D;8+4+1&#x3D;2^3+2^2+2^0$ ，转化为二进制就是 $1101_{(2)}$ ；对于小数部分，比如 $0.6875_{(10)}$ ，由于 $0.6875_{(10)}&#x3D;0.5+0.125+0.0625&#x3D;2^{-1}+2^{-3}+2^{-4}$ ，转化为二进制就是 $0.1011_{(2)}$ 。</p><p>在计算机中，这些类型的变量存储都是采用二进制的，一般1字节就表示有8位，2字节就表示有16位，以此类推。但是布尔型（关键字bool）和长双精度浮点型（关键字long double）是个例外，布尔型占用1字节但仅使用1位，长双精度浮点数在部分平台上内存占16个字节，但仅使用80位。  </p><h3 id="范围为整数的类型的计算方法"><a href="#范围为整数的类型的计算方法" class="headerlink" title="范围为整数的类型的计算方法"></a>范围为整数的类型的计算方法</h3><p>对于非负整数，直接使用二进制表示，所有关键字以unsigned开头的类型，保存的都是非负整数。例如，对unsigned char，是1字节8位无符号二进制数， $13_{(10)}$ 表示为 $00001101_{(2)}$ 。因此，对于这种类型，最小值就是全0， $00000000_{(2)}$ 即 $0_{(10)}$ ，最大值就是全1， $11111111_{(2)}$ 即 $255_{(10)}$ 也就是 $2^8-1_{(10)}$ 。<em>需要注意的是，如果已经到了最大值 $11111111_{(2)}$ 再加1的话，就会变到最小值 $00000000_{(2)}$ ，如果再加1就是 $00000001_{(2)}$ 。</em><br>对于负整数，我们将其分为符号和数字两部分。对于符号，由于二进制无法直接保存符号，我们需要转化，由于一个数只有有符号和无符号两种情况，因此我们取变量中最前面的一位作为符号位，0表示无符号，1表示有符号；对于数字，有原码、反码、补码和移码四种编码方式，在下文介绍。</p><h4 id="原码"><a href="#原码" class="headerlink" title="原码"></a>原码</h4><p>原码是指负数与其相反数原来的编码相同，即一个数与其相反数只有符号位不同。例如，对char，是1字节8位二进制数， $-13_{(10)}$ 用原码表示为 $10001101_{(2)}$ 。<br>这种表示方法有两个问题：</p><ol><li>正数运算与负数运算不同，混用很不方便。<br>例如， $12_{(10)}$ 、 $13_{(10)}$ 、 $-12_{(10)}$ 和 $-13_{(10)}$ 分别表示为 $00001100_{(2)}$ 、 $00001101_{(2)}$ 、 $10001100_{(2)}$ 和 $10001101_{(2)}$ 。<br>在十进制下从 $12_{(10)}$ 变到 $13_{(10)}$ 是加1，在二进制下 $00001100_{(2)}$ 变到 $00001101_{(2)}$ 是加1，即对于正数，十进制加1是二进制加1。<br>但在十进制下 $-13_{(10)}$ 变到 $-12_{(10)}$ 是加1，在二进制下 $10001101_{(2)}$ 变到 $10001100_{(2)}$ 是减1，即对于负数，十进制加1是二进制减1。<br>因此不统一。</li><li>存在两个0。<br>即存在 $00000000_{(2)}$ 和 $10000000_{(2)}$ 两个 $0_{(10)}$ 。<br>在十进制下从 $-1_{(10)}$ 加到 $1_{(10)}$ 需要加2，即从 $-1_{(10)}$ 加1变到 $0_{(10)}$ ，再加1变到 $1_{(10)}$ 。<br>但在二进制下从 $10000001_{(2)}$ 加到 $00000001_{(2)}$ 需要加3，即从 $10000001_{(2)}$ 加1变到 $10000000_{(2)}$ ，再加1变到 $00000000_{(2)}$ ，然后再加1变到 $00000001_{(2)}$ 。</li></ol><h4 id="反码"><a href="#反码" class="headerlink" title="反码"></a>反码</h4><p>反码是指负数与其相反数原来的编码相反，即一个数与其相反数的每一位都不一样。例如，对char，是1字节8位二进制数， $-13_{(10)}$ 用反码表示为 $11110010_{(2)}$ 。<br>这种表示方法解决了一个问题：</p><ol><li>正数运算与负数运算不同的问题。<br>例如， $12_{(10)}$ 、 $13_{(10)}$ 、 $-12_{(10)}$ 和 $-13_{(10)}$ 分别表示为 $00001100_{(2)}$ 、 $00001101_{(2)}$ 、 $11110011_{(2)}$ 和 $11110010_{(2)}$ 。<br>在十进制下从 $12_{(10)}$ 变到 $13_{(10)}$ 是加1，在二进制下 $00001100_{(2)}$ 变到 $00001101_{(2)}$ 是加1，即对于正数，十进制加1是二进制加1。<br>在十进制下 $-13_{(10)}$ 变到 $-12_{(10)}$ 是加1，在二进制下 $11110010_{(2)}$ 变到 $11110011_{(2)}$ 是加1，即对于负数，十进制加1是二进制加1。<br>由此统一。</li></ol><p>但这种表示方法还存在一个问题：</p><ol><li>存在两个0。<br>即存在 $00000000_{(2)}$ 和 $11111111_{(2)}$ 两个 $0_{(10)}$ 。<br>在十进制下从 $-1_{(10)}$ 加到 $1_{(10)}$ 需要加2，即从 $-1_{(10)}$ 加1变到 $0_{(10)}$ ，再加1变到 $1_{(10)}$ 。<br>但在二进制下从 $11111110_{(2)}$ 加到 $00000001_{(2)}$ 需要加3，即从 $11111110_{(2)}$ 加1变到 $11111111_{(2)}$ ，因为已经全是1的缘故所以再加1变到 $00000000_{(2)}$ ，然后再加1变到 $00000001_{(2)}$ 。</li></ol><h4 id="补码"><a href="#补码" class="headerlink" title="补码"></a>补码</h4><p>补码是在反码的基础上通过将负数所有的数的编码加1得到的。例如，对char，是1字节8位二进制数， $-13_{(10)}$ 用反码表示为 $11110011_{(2)}$ 。<br>这种表示方法又解决了一个问题：</p><ol><li>两个0的问题。<br>即这种表示方法只存在 $00000000_{(2)}$ 一个 $0_{(10)}$ 。<br>在十进制下从 $-1_{(10)}$ 加到 $1_{(10)}$ 需要加2，即从 $-1_{(10)}$ 加1变到 $0_{(10)}$ ，再加1变到 $1_{(10)}$ 。<br>在二进制下从 $11111111_{(2)}$ 加到 $00000001_{(2)}$ 也只需要加2，即 $11111111_{(2)}$ 因为已经全是1的缘故所以加1变到 $00000000_{(2)}$ ，再加1变到 $00000001_{(2)}$ 。</li></ol><p>计算机内部对于负数采用的是补码的表示方法。那么，对char，是1字节8位无符号二进制数，最小值就是符号位为1，其他位为0， $10000000_{(2)}$ 即 $-128_{(10)}$ 也就是 $-2^7_{(10)}$ ，最大值就是符号位为0，其他位为1， $01111111_{(2)}$ 即 $127_{(10)}$ 也就是 $2^7-1_{(10)}$ 。</p><h4 id="移码"><a href="#移码" class="headerlink" title="移码"></a>移码</h4><p>移码，是取消最高位作为符号位的设定，转而将所有数字向正数方向移动一定数值，使负数最小值为二进制全0，正数最大值为二进制全1。<br>移码是在补码的基础上提出的一种编码方式，思想与补码移动一位弥补反码的思路一致。一般，对于一个n位二进制数，其移码的偏移值为 $2^{n-1}-1$ ，例如，对于一个1字节8位二进制数，其移码的偏移值位 $2^{8-1}-1&#x3D;127_{(10)}$ ，如果用移码表示 $13_{(10)}$ 和 $-13_{(10)}$ ，就需要先对其加上偏移值得到 $140_{(10)}$ 和 $114_{(10)}$ ，然后转换位二进制得到 $10001100_{(2)}$ 和 $01110010_{(2)}$ 。<br>当然，偏移值也可以为其他值。</p><p><em>一般整数不常用移码进行表示，除了浮点数的指数部分。</em></p><h3 id="浮点数范围的计算方法"><a href="#浮点数范围的计算方法" class="headerlink" title="浮点数范围的计算方法"></a>浮点数范围的计算方法</h3><p>刚才介绍的是大部分类型变量的数据范围计算的方法，下面我们介绍一下比较特别的一类数据类型——浮点数。<br>浮点数，是属于有理数中某特定子集的数的数字表示，在计算机中用以近似表示任意某个实数。例如，0.00210245、5012.35和3140520000都是浮点数。<br>浮点数在计算机中表示时使用的是一种以2为底数科学计数法。我们首先了解下以10为底数的科学计数法是怎么表示一个数的，科学计数法分为三部分，符号、指数和因数三部分。符号是指正负号，指数是指十次方幂的指数，因数就是和幂相乘的因数，因数大于等于1小于10，因数又分为整数部分和小数部分。例如对于 $5012.35$ ，应当写成 $5.01235 \times 10^3$ ，其本质是 $( 5 \times 10^{0} + 1 \times 10^{-2} + 2 \times 10^{-3} + 3 \times 10^{-4} + 5 \times 10^{-5} ) \times 10^3$ 。<br>以2为底数科学计数法与以10为底的科学计数法类似，例如对于 $5012.35_{(10)}$ 即 $1001110010100.010110011001100110011001100110011001101_{(2)}$ ，应当写成 $1.001110010100010110011001100110011001100110011001101 \times 2^{12}$ ，其本质是 $( 1 \times 2^{0} + 1 \times 2^{-3} + 1 \times 2^{-4} + 1 \times 2^{-5} + \cdots + 1 \times 2^{-51} ) \times 2^{12}$ 。</p><h4 id="结构"><a href="#结构" class="headerlink" title="结构"></a>结构</h4><p>C&#x2F;C++语言编辑器采用IEEE 754标准，对float和double都采用下图所示的符号、指数和小数三个域划分，整数位不写入内存。<br><img src="/pic/CBinS01.png" alt="IEEE 754浮点数的三个域"><br>比较特别的一个是long double，采用符号、指数、整数、小数四个域划分。<br>三个关键字每个域对应的长度如下表所示：</p><table><thead><tr><th align="right">关键字</th><th align="right">符号</th><th align="right">指数</th><th align="right">整数</th><th align="right">小数</th><th align="right">总长度</th></tr></thead><tbody><tr><td align="right">float</td><td align="right">1</td><td align="right">8</td><td align="right">0</td><td align="right">23</td><td align="right">32</td></tr><tr><td align="right">double</td><td align="right">1</td><td align="right">11</td><td align="right">0</td><td align="right">52</td><td align="right">64</td></tr><tr><td align="right">long double</td><td align="right">1</td><td align="right">15</td><td align="right">1</td><td align="right">63</td><td align="right">80</td></tr></tbody></table><p>float的示意图如下：<br><img src="/pic/CBinS02.png" alt="float三个域的示意图"><br>double的示意图如下：<br><img src="/pic/CBinS03.png" alt="double三个域的示意图"><br>long double的示意图如下：<br><img src="/pic/CBinS04.png" alt="long double三个域的示意图"><br>这里的指数使用的是偏移值为 $2^{n-1}-1$ 的移码（已在上文介绍）。<br>按照这个规则，大家就会得到5012.35转换得到的三个类型的数<br>float： $ \color{lightskyblue}{0}\color{lightseagreen}{10001011}\color{hotpink}{00111001010001011001101} $ （近似处理）<br>double： $ \color{lightskyblue}{0}\color{lightseagreen}{10000001011}\color{hotpink}{0011100101000101100110011001100110011001100110011010} $<br>long double： $ \color{lightskyblue}{0}\color{lightseagreen}{100000000001011}\color{pink}{1}\color{hotpink}{001110010100010110011001100110011001100110011001101000000000000} $ </p><h4 id="规约形式的浮点数"><a href="#规约形式的浮点数" class="headerlink" title="规约形式的浮点数"></a>规约形式的浮点数</h4><p>如果浮点数指数的移码值不为全0和全1（全0和全1有特殊用途），且在科学计数法的表示方式下，整数部分是1（小数部分值为全0到全1），那么这个浮点数被称为规约形式的浮点数。“规约”是指用唯一确定的浮点形式表示一个值。</p><h4 id="非规约形式的浮点数"><a href="#非规约形式的浮点数" class="headerlink" title="非规约形式的浮点数"></a>非规约形式的浮点数</h4><p>如果浮点数指数的移码值为全0 ，小数部分非全0，那么这个浮点数是非规约形式的浮点数。一般只有某个数相当接近0的时候才会使用非规约形式的浮点数表示。<br>实际上，非规约形式的浮点数是可以正常使用的，只是它的绝对值小于所有规约形式的浮点数，更接近0。<br>需要注意的是，对非规约形式的浮点数，虽然其指数的移码值为全0，但值并不是最小值，这是因为，对非规约形式的浮点数，其指数的移码偏移值为 $2^{n-1}-2$ ，例如float非规约形式的浮点数其指数为-126而不是-127。<br>同时，非规约形式的浮点数其因数的整数部分为0，整个因数大于0小于1。</p><h4 id="特殊值"><a href="#特殊值" class="headerlink" title="特殊值"></a>特殊值</h4><p>这里有三个特殊值需要指出：</p><ol><li>如果指数为全0并且因数的小数部分是全0，这个数是±0（取决于符号位）。</li><li>如果指数为全1并且因数的小数部分是全0，这个数是±∞（取决于符号位）。</li><li>如果指数为全1并且因数的小数部分不是全0，这表示的不是一个数字（NaN,Not a Number）。</li></ol><p>以上，对浮点数的形式总结如下</p><table><thead><tr><th align="left">形式</th><th align="left">指数</th><th align="left">小数部分</th></tr></thead><tbody><tr><td align="left">0</td><td align="left">全0</td><td align="left">全0</td></tr><tr><td align="left">非规约形式</td><td align="left">全0</td><td align="left">不为全0</td></tr><tr><td align="left">规约形式</td><td align="left">不为全0和全1</td><td align="left">无要求</td></tr><tr><td align="left">∞</td><td align="left">全1</td><td align="left">全0</td></tr><tr><td align="left">NaN</td><td align="left">全1</td><td align="left">不为全0</td></tr></tbody></table><p>由此，我们计算出了三类浮点数规约形式的数据范围。</p><h4 id="关于精度"><a href="#关于精度" class="headerlink" title="关于精度"></a>关于精度</h4><p>float、double和long double的小数部分存储位数分别为23、52、63，所以一共记录的二进制数位数就为24、53、64。<br> $\lg 2^{24}\approx 7.22$<br> $\lg 2^{53}\approx 15.95$<br> $\lg 2^{64}\approx 19.27$<br>由上计算可得，float可保证7位十进制有效数字，double可保证15位十进制有效数字，long double可保证19位十进制有效数字。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p>中文维基百科：<br><a href="https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B_(C%E8%AF%AD%E8%A8%80)">数据类型 (C语言)</a><br><a href="https://zh.wikipedia.org/wiki/%E6%9C%89%E7%AC%A6%E8%99%9F%E6%95%B8%E8%99%95%E7%90%86">有符号数处理</a><br><a href="https://zh.wikipedia.org/wiki/IEEE_754">IEEE 754</a></p><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="科技" scheme="https://www.petermatt.xin/tags/%E7%A7%91%E6%8A%80/"/>
    
    <category term="CPPUAPA周刊" scheme="https://www.petermatt.xin/tags/CPPUAPA%E5%91%A8%E5%88%8A/"/>
    
  </entry>
  
  <entry>
    <title>嘿，看到了就点进来吧！</title>
    <link href="https://www.petermatt.xin/blog/Happynintyo/"/>
    <id>https://www.petermatt.xin/blog/Happynintyo/</id>
    <published>2021-04-20T15:58:00.000Z</published>
    <updated>2023-10-14T12:11:57.170Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉啊，我以为你看的时候已经到21号了，对你而言是明天的日期。" data-whm="抱歉啊，你填写数字的哈希值检验出错了，不过你乐意听就来听吧。">  <script id="hbeData" type="hbeData" data-hmacdigest="72ea10d497992d29565f6080cc87a8f40a2795a5978e749e93ebeb18f3f91774">6352e336b80f249fc0cafef0575c72dbfc5c48a1d341ab8f975947bbb68bcfb6c82aa2da3249f272c0af88861f9240ca259a8f0ac50272aa720e010c0099555d20993d28480ef1bbb9e6b48a9591a9c858716e5ac4d82288f585066da41301b8731142fbcc627a88976f37407b1e0e5c6e3e593ab4063b0435f39a72b1160d3a2b3a409be98842ed7966d0adc2f95ec5365b18c2509ca54f366f4748aaf43d48613baf2cea88009938eeae7e48e4e447e6288ddd9026bcb576afbdd6fe557ee09bba943700172772fde8f9de3d217823aee63b126d6b44694cd040ee43a90b7d9493905ab03d1354dae87d754a05cf3776f88ed8406538fe2502e1402b7707dfe593f33485a20c1d4e80fa27f4e527376b62dae7920a13600e11003936ba395178bb12a3486bafb4fb3cd98ed2de4986902cdc50d7ea84792e3d2ef4b4ceb722ad79824f1139008f537ff00294f66d03382bd5b56fb6aabff36bac0cf2803697f3b7e8a388a224bdc4f531856ddc48ef0a956c34d9d9305b7c96022a4cf9bfe8f6bea505e9d5a7aceb5c55722f23c8d93c43c34cb9b8352a5adc7d06f7f35ae7ff25843736b28d9e6f05d61d1ce0cbf3c49219863afcf8c763e459eea004800460bd77b4a6d1fa53201048cd66d1572f8fb69253088c94d3f2794398bc41c49d30ff6a1070200b69fc7de356e6b6913bf3d957eee0a746c2da3a09dbeebdad655fb985910bbdc68f1b1ebd29c07a3a4c57f81444341e4f336a2fadb5700d0c0a6a866158f1bb37d19aa20ba8727fbf1a6ed465601200d2a86c5c6180d7ca28cb54e281be865be17072e6daa88b363b558a4560e22617236bdfd2cae57df4da2d10ffe70647442ccaec34da24171af5a76996d34ab57c9f374946efb0fcdbc5650bde6634a6d19e70f1cc7f808bb778dd36d07b7aaef2ad9d1139d7a54dc49bca13b1f603805150bab5b6c59e4583b04c2f21f07bf8e13b2afe33841ee27d8ec158e4f3ae232683599e49047a7a73cddde8265a1d2d9ddfc1750637be42ac40f521d9b6dfdbda37522a3259d1ad666f0382fb8d0ffc55aacc31a36212993e42ae38f0c781cfb46c7781f5c95db99318aefc1b1ae703e7575c2ffad695f4ecf967fd302f8610be544dd5bb94e447b6a851212ed70efc90726292abff3268b92a31ff330ecf466a76bd2d4c112dd42bd1a526fd236d8b9fdd43622902874066b3d565ebf1b67e87ccb3fa5c2c752b75038e2117eb69b8f05cf1ef9aecf95b1e44ed47489880c064f3c89f2af1980e251b2a60e17ff4597e99e1c5f0957a8b6cbd93b79ca1c0278dc66b235bbfd0a900474b5d5b7940f9a26a9fadd7feb2cd1a480ab0caffa5f40df1f33e8693becbca990bf45c3aadf1f0583e51077eb2f5a04e99083edc2a6c75a1c98cfa13844d31cf5b559eab6b5961261e119a9c01aebf415a186585719096ab13e89e7c3403339cdf45592145319e13927416959e1bcc588e697902453263d5bbfee35ebc53dec1d0dd42c20ffd99fa0bda940ba162665af4b192a50f488179af13c41aa3c18b6b2e45f68742de8d11fe970b11ac47dc4908aa8efc5dc29c3791da28a550e9ac0be5cd7365200ac2b3c1a3f8fc008d61b81b8c0ed165bba467d5175f1699a976d7a3a2b3d091aad97f9830e782484efff2799fb7b4c6ae2df4e3c253ad5c8bf3373896aa1ab9a63ed89da8f906319911c4f643ba363c40aacdc3b24de68d2e54eb0bbee34aa3ad81e462c7cb1050b626b99c638caf02918f245bb7d54d22a1799d955e665e8432e147328e64e893b27a9490a5e0d7dd15b5917dc6a4c04c47f6c6ec1d0079a5e421c80d50f480b4ada4d298176c55620215085c36a3c36e649aa209ed9ad4119c90441afad48c1d84d470f5495a710423d60659523980f5e33cfc8e11ffbb6a44c5cffa7a4e6480047f30f7631274baa0228389cab92d02e9806bf65da206bd3273cb7c9b5d9bffae1edb8977453c74cdbe55514031560ad9cd546a6505f5c39414619a6e959f1c27946008463a765bada079ae262c9272520cb38aad57491215a69e2a4c057711321d54611c2fa6d8f9bfc636ef99ceb850dd5a65310c1dfe6b69bfdcf0f7881d72d7774de2dde90246b7c380a4b92e78d5974f0f4a70d389240be0aed34c002b6272bfff82bae1278af68db4d365a50db92d3e3172d8008fd0fb33a35140cead1597b70bad65df9d36da75f28661fad477aea619c3ba8278e685084f347cf745a5b10f49cef2991590d0df5a903ae36cc02aef5809e781812df6d6e13a38d9fc20ad446c4195159d145febc0b08fe90999fa4722ed31005033546e9e889e6358278cd46821ef5b32915feddcd9d343e349421b36a1562d322eae74f4d4115fe9650bc5ad22b6adc864d6b3462e7ffa327a2660cd087b730fac2b077178e9717ef7983d6a650c76c77cf16b02fdda819e2822facf9564134c786b757b3719e1e8e3ff8bc58f38aefb826aecf31f5a84698e1407657a07976c0304bd4797b1d07af1c003e3aa62b78dcbe5262016c0c3ce36647ef9520e78a933262f34948ce1f4b054e384a311c56876c49096e26df4cc3983d3a4aead91fda7e841bd67314248a35cc5b439f423dc94522c114afdc0315c5dd1c8820ff2423ef237e8874d9215f343c9766218dac11acb2c362efb8c937e3c4007ad098f9a13479a6a9d69d51e4ef540262924b7baffa4eace8d69d7435d5a33da807b2329668079ee0d5a9b53125d851acf16b2e5d842746d6a2eac8f3ea441a305526e9ada593fabe06e872e1c4f8e9b79b5d9d9a61b492b1912769abd14e839dcc5e6789b3db37ed36894e1013dcf1373b0da0abbcfdd89d3a5929d7eca27b7d85ca7f2371b46774e3e24f2a0c3012dec8b6b79ffb0559b04edc5bdf6706fc1a649d246752e575fcaa04529d80c9f3bf42c767c9755066fa3fe6e0959feb4528843fdad689e5c5877628498017e56dccc3e2af2835a501b8911e1d400c8938e066d3d20d9fd61c66650edcdd35d5de8235a90a87d48259619592f879d7d4f529927e35f9a34f3858764e4f3d2e74480dba5ed7bb5af5856c97dcfd1b5bb4eeb106e332098b512e5e43be3cbb6d068a91921d07a1da3c9bef9d51da40390ae710b6067a0b471d78c94bdf95798ebbf588904deb1aca221e0e0b3a2bef8eef34200dff7aff8783fbd6b6abadac6ac421a61ffea4ad56f01570783c92ba8c6749c21f8bd04fc3a013c20d7773be622007754f7aaa18d27971e442bffdb31668e094f3df93bcd3615daaa5f5ebb8cef4b2ce4ff4aa89e428d14c4dfcf822b84e4d1ea5db2a0eac202d5c84a0f52a0c5a47559889eb37ca18a7c3d1da4c7628b4dca56572b5d436510cb9a1ea3b8ffaa158c9ce73e078a67cdac3b73b3ce97808c69e6154f78f9447cb2c6c05f369a0f0923a101e0ccaf2ad493d8435019932baec17709c9c1520b127afb5e71e6bd573b15af26756919c67f1513a9e102a1ba1a1d13c1f8af031fdb07810dacbe9d0022169ab2ee5ee75276fdc73c87ad579477fe209c92fd4f59470abbe012420626598a6d837873c20f9cee7e2496aa6c673de64d9ac75bba2d9015e57ec7ad206e2dadd2b249036418d73e404862493793a6325400e3a12b78a5dcf5ff8fabb9e7380fdf0b67e6ebce9e8e6695488a21c14a57f0771ae1c4a6a56934a5b5e06d8e60a9622737dbb6281ff787c18fd9ff7ce19c5ffb93b1484c5f3f6fd4932c9f1ca619e260e341d9a3bfca398f5d651fe0953fc06bd3133ff527e194d85bdc44832eddce9d956d7b2c3a9e8f87176cb72e2d95879d85522a1951c0c676375fe42ce2dce3f9588f6b5b017ea88f4523d987d8239efec35ff713e6d9bed1cd5d7df6462e8f1e2a60537d87ad0dc453fd048d44c4032f368c395fd75928690e30dd77f0125184e2c4d1685e8cfd78b2bf3e81f2ede1741214ad9144def5a024877ce5b436</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-wave">      <input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-wave">嗨，你知道今天的日期的八位数字是多少吗？</span>      </label>      <svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">        <path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>      </svg>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">嘿，那边的路人，你好！可以耽误你几分钟听我讲点什么嘛？</summary>
    
    
    
    
    <category term="日志" scheme="https://www.petermatt.xin/tags/%E6%97%A5%E5%BF%97/"/>
    
  </entry>
  
  <entry>
    <title>不要看这篇文章</title>
    <link href="https://www.petermatt.xin/blog/Autobiography-03/"/>
    <id>https://www.petermatt.xin/blog/Autobiography-03/</id>
    <published>2020-12-06T03:12:10.000Z</published>
    <updated>2025-02-08T18:37:42.965Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉，您的输入不正确。" data-whm="抱歉，您所填写的内容与哈希校验不符，但你仍可查看此文。">  <script id="hbeData" type="hbeData" data-hmacdigest="6bd8bd2f008f7c89d3e25b678114a7a2ad69fb105c892f995f57fdebbcb553dc">273518be487c51bc2f3c96d148cc516fd1db1ea13b1fc5b5fc5a7a318ba7e48622f0d780f46b3525106a71674bf2b101d4634f3bb1c01072a0d5b2c7730d9df56baecbb477f32d382571a4991422f127de6da559f69ff1f20e17d99672d1b791e6e5c5241232f59f3e1b1991452a3a0223b22e89934ab03b3b0e1fcf0755c716318c1444d79353e4b477cc276fbefa1bbc499f98b753954dc9779979461d353a5d3d9b93568b4a30e50f2489766ecafa097033bd661c8de961ee3a43e427ea1f0fc0a32862d8c8ef98ab7d97ba602e76ac620b5e69d2f0b6084595e7820e6f1533220a9abfc4b057d2ff3d9cd91ba38440d4f090f7641276837eaebe43c20da49612c6e86ed88d85b6877860bc5fa72e4ca9456875b3ea5f7f95816e5bcf0dbc1f589419b13f1a3de924f28169fb505b097a6cf8ebbba92450a80f0974dc26656f80c505bb43738d88d8275ee41fd496101c655dd1e3b1e0454885ae85bd8ed84c4e7f8881e02175673073bfd4d2b8c6ca94f693cd38696136b477a83672657a921dfd8344da20b8bbefd7537b69dc78ca084ab5316d71713e9438b22899c7c99cc78d12f98787cc27e9ac360803b26074c54ee7278d60c96b518caabaf23fed3c34c5a212afc872fee9110bfa01cc96beb9d3173ff45edb7c81cfb7051fd3283a6da87ca902f9136d0b0bf64a68af68b6fd9b2ec8e4c7903b5a50242baa43198a1952ca3cb55edeac3e0b1b8b45ef1dee8b93fa999c8b4cf01b3a1e839a20816dddfddc6bda938c82bc8b403baa6eaf566d36bbe8114c1a6ed13cedecee46d432e3d06e6dce0e8a7bafc95f0bc75225d25e57debc1f25b3646eb476d747740960ac47bed250146981e62b75cb1cefd48192aa04990240d4079e0c9dc3e4e52dffd24a0cd3e09b8421b7f774c930b9603ed0c61913ade306fe0b3d060f50b05cc20822515f173c744c3f77f6ff7577e84c87981f5e905428f9538e969978b311c0e52fa3f80e986d6756f0cb374a4df06ff0dd7481603736162417e32bef2adb4bf0fd5eb48fed925d91b68be773aa986c480e30fe745f0bfc40274a2a2d0df27c0c6d7e2630ea3457aaa691d74065681890d5fbe5293158ed7383e44d18047b3928701b3b58d86d42f224ba0e73874d121595bcb90247d338a2d8366bca44e13edb4fc9977dad9c147f10a040acc3569a735d50d486c9e1f972b51c3c663bbc93dff5913054bd909bedc180d15ff17db30809212bd306ffa9e8492c25b8ad15defdb324a79972e4af9e2077c7dbe9f9566bdb8d20ed3c96e906df767ee6f1eea39f2043ad9d5a8cac5a602987c742c19ca9e8e79b1298208ce1ed71db6c6742002be3b567c7f7641bb6551599f48b56b82a4e7f6672ff19b266e014189823dcfa52d52bc5498fdaaebf2f198acf8cbea304f409fce0455649dbc0046af00a750273182a1f0eff7cd72680d1ea44346cd9f16112a1986c8eb759585ba03024d90285f47abd09cd2b325efaaf97e86339b99dadb5e71ebab89fe475a263c49279095bf6f3e13075ab2f7cc08e22e5dce23d03841e951a1bd64117bb80639fa4069f11be78c1fd854846ec2dc0704897c599dc8f6a9541d3631ad978f8b61437c1652996c9ad25069dea1be5102d644370131ad686106b1c2b6a0b5c974a019a0e4bf67c51553aa0f81e4b2b355d00a38d67d8033d55f8ffc52aa751442e0dd6429618b22ada994504cd0dc72d677e7adef7faa161371e1acc5eeaa870b8affd3054d14665ba6e7088251f891281bd029bb4c049b7c6000ffeecbeb4b86a4f0d6772af558997f2d6de54e5296b63a1dfcbe925c963e4cb947e6f146edc34e0febbf61755362fe92643c942c9f761c34430f29f67822d8309d8c28e0dc30d82138d3ca9bc9aa18d7b563ef950b1a85b78cac43c635b0dd20b7a6b302e64a4e92ec05331b7e04e7a5ecbf646941d735c10de8e8440f3200dca26eb0adbadd9b1f38f187a68f6b9d7592f24e82d419a93aa22fc0c36614ac08161d14e78e79a366503d9e51706faf05a1a559be6c8fffec413b1c80d7e07ba372b978f4da91d1f855d62f1c0bc6861ea4cc4458fcf29c0a09df13854eeafbe1dc794b945ed4a98357388103b2587afa395d5459a4e1efc570d1d6c36878bcc7aaa7b6fce8627d6912ae8b1e5668d61bf2e4746e64091e86dd368c8b704e2a35c6a54d5ca7042e78e63751eee1e851992757aa7d9c47bcc023b30993479ab155e2540b11cfa167dd23dc55764865d9ba62bd955888aa5e4d9edc87a8af285088502dd5a53586a0f8e4e74b90b5b96188b8a865d64b66d62b6fb5cc25e4cbddcd126f3de88d270924e46a10e6cc823e17d7b7bdf2653fa9a1fb7b4efa01d34b4f3c5f0daea6357971f0e4cd839a2e037b6cde4d276ba6c40ba5c22b4bcffa9b920b7535dae044ede098891bf7874529b99d0c84abc289813ee284773c1769491da0188535397c8706ae270a912e79327c738852103f4fd4c1ec431cb74bd7c25c1a481839e5be409ecbe1d007ce971aa6c52cfd2cfcfde66ebcc8df62d46fc4b3e828032729ddc356941a9df700010b9ae15499d1fa6fb395758c28f471371933e9d5715f766c89ff4aacfb86f5cbd92731921c49fa9f7e8baac3de6d44c239788a848d205104e8796ab58b685e9242816f459eada01d69585f0efd9c77093dc029b62a25ec107963de66829acb6f4e4d14a5c82a365a136bac4df8d4095993df10232624772e94a725fd7306419ede9da4d440edb488de01352b633f3fd4ee5a1d62e474c79fb547fc3e95e4a4a2aa8cb2f3bb6c3e236fb9400cba00f5f8a3329ee351b64fe05c8cca69654d428e630a95e49c6beb4107249621911fd86723bd06d73c615e2e9edad1206f1e0ec90a702839fbc81bf71dac95da4d0a569433e8d1b439b9777c04637926cb7163092ca0bfb52100030da9aba47d8aaafa9983b55e1b683dcceef5c4c01d044faf1441fb1bdcf8a26a4ed2f20da8f17e60dadcf8ac89c3a8203124923e9d8ca38642a003479cd289d7236bbbecce09acfa48bddcd0320f4954bc9869a27a187cc81330210ae958dae85b10c749ff5faadcde73c8e433bfe272fb416ff5b7c221d5431b5666985e97ee946d38c2ba12197557b860caf54e6319cb8206aecdb17cd6fc0d368230edf274fb0da90b68d947cd78e1ea6cc4fbf14469c30d8c81b424a51f094bc064075631d008714dbfa59962d97cafea89dfc7fc33b4a23163df372da113454e2d03a523245aac146d2526a1b07dc86207fda4c574f02ba9c534bcbef9f899b302855dd689577e76a3539995941db86ae9e862a0735f6504e3e9df18e000febdb320a07e765ed385f9752539e1b69b4f0f9bb7eee4c28673dff2308552ef482b3610768702225728b4d2270280d1fcdd71d304431d0581eba074f86cc8ba0160adcf4b97c8a9c6279b59e2b384173761c3cda80b9a5eb8ee6eac856d3569829911e31691b8a53aef92f17c901133d31b11bafc4cde16be318389a6457feef511087b9e3b58f9f76c996fc22fe050d1db8a520cb7fd8863e168b94803cf4f526cbf84762e519fd9007b600c93fd788da1567e3566661b854212c480256dd060769cd27fcb200e3ba8d32bbc749d64ac7de8800d7a79e2b4dcf197ddb433c089531ec083923d6040b83a338e9d5be5708178fb1c6aa9a1d2162fd41510a7041a7e7e641a42ebde6cd08ddb9987e3de4dbff8e4aaf311621adff8f233187d8b95d5adabf74174203773a1e80c318e9f124773f921db48398937a9b2c32677ea3449650f1f87c84207e0fa7bdadfbcc084be0637d5e78759cfbef02958b22ebf3b521d03541d47f5c4deb4258852994a673edf297e18fea26b1b8778038a8031ad9d9f35e400fe2ecd3a4bbab7e536362637bebf490490a207b58f3660083568900471267b1e0f9a796251ade02b54092194e6ea737ee9e8bc45ef17ecc1d6f52be011748f9bff63749f407d017dc2ddd5f8e18ebd8641e12f321438c7d1ebb8603e3d17ab6d3cc43ab2e83b5c5cc43af8217475b2dbaf3152de8b649060228de79b7e6c932c8d123037fc49c344dfb1b0a85080b365a479f51f47516517f8dd326d978bdd5266a9db05830c10116e52155836cc921b278b7361e21020daf009834925b7608f0f59fb4358425ad1b89b1ca7aa24095cc291540f584755f8d6c9def7e6ae75b27fb8077019025e8836a0db4f055fb39cbfa38eab9e30fc815cc1379fefadfea1413870e9f1a626a87e6feff5ef7e01dd91f1137b532bba9a7aaf06209115038d0c794af669bf07e33936f4cdec46fb7fd23b7033b51fc743bf168661ba21be7c2c9c867149b08e20c870ab7a51950486d8cb4a6b22a0014d947bfdfd19abd99166b1f7540b4acd315185eb8679b30e09a6b3dcee4e827aad92fbe86a96884d7fcf35f982ca23a521c70a846a4b28f909ce2b61d69a228c94beb505240e0a1ef85b3e03b236d001e91337bd308cfa0aad455c35f8cb3fd240842ff47b14a9a604c5b4cdb46660530510d6919a9fd15203cec4f2283ad5f6202dcdd99dea2d7a1d3b4242645fcae88112ae53360aace3277527f422e69e254dbaf666c5b4ea627845681c90bfa2ed5b685787fa44cdec97ee5d48c183a825a788c4913488f81966853ac0436efa3e35d7df64fb77cc3e68be2182e0c599df09527281f8a9adffb4abdaa18c2cd90d965c541cee59cc2c417c9d67b6a5c218d8d4996aee98111607203ecbff20da53d8e052051a2ccbc732900af775ce6fd7b33108a428c1705988b10567c4a160dd83df363004b1b20e9430a25e5942c542f5f2f6999b8fb0b76a8b43c9f8d2cac8e3a5c9a69142a1a4d9bb21eeb2f83c4654d235c809f6be04fd31499c8ffca1d8a2ebb346f367e0c11a84d18ab277a4576379e2bdcb958ab393d88b85a4572b3516eb691d94a48acaa34cf4bf545e70649179dd2a604101d9081c67dad7585e2a0f532e6bac8b119b30f808c31c4a4615c08abd44865907b8aa74eb432a26f98a6e7c80e91c359374af407366b7e97431d319623619c28d21e40c597fb470cb6160bb50ad338bf824893bb4211a324eeb1db3d98bfafc2df708e66554ca35d5d1738bd055000f9781dfdbe533012109f552a7d8a4e64e0c482ad6b6fbd747e5e11567e3f27a20576ee6163660ced856b13cc78a12be9574530d684fa1f9dbeb9476cdfe85837730dc8e248da4ac0b4a4a0684ac397b69ad288f3063d2e411d3bf09a64f4631af73079a667c409906584b01e6b1ba17f546283a5a2adcbabed8d5214cab6e5d0b7c1e9c1e453b2ae0c25bded4c643542923939830ca078c1c7748071cb8fb6b02fc99aac6e2f22672b19237afab20636c3f1173e1fc3635a9eeb9ebfa6cbf66ad740cd74b3eee5561cff44340eeac9d47462a67a7b78b8373ab38bbd0ec85508cf286aad11bd71bceef800b0fee088e73b82c5a15ddcaff553c063b7699ce067374f92250a352dd627337d72f0c154e245585a38a315038aa25e6f4c68ed235aaea527c98cab18bcd0456599f588b4e8e3e8b669a91cab9ce57758803075da69d21ba63d7239f6bd125518df2c927260a8528f8db7c337dca55fe6e7d1d51bc12aa7d04d534cb416918a7e26fe8eafebbfe30b7f643d7bfeb2394515a16452b57db6667d1ddc73a889eb5a272a31d16bd499b74c30cfdd658837f86b518cc53d99a46ede52dd7f782e6390b05bec157497e6358d0532503a0769be4fa38a24f03c18df0b3ebf01ad9ca7758bfe9d5a9922c621e3d9689081d1e02da1cec84eeaa8afe4d5d2d506b412533a16ca5b24f7a37d6faff50adbfd63a03ab394da1472dda38c9fd13aa00146e6cb552b780cbff42fbb4af5e2cc23316583f319a8ea1424ad59ec0549a8ae1d213dd07a617efd81d26282bdf968f6ee038c2283676acae2460161e8624247e7b9c80ae3afeeb851acd267fa5071f3c81aed6d4e57846bb2854d40dc6762d6ec38630f9138a6762dba98df6db26a849a887134f1f0d61ddf8c56a9f0250cfbcc06591cc591f04d08f62be6295bcb7ac34f62d79623c3d25efea218443eecf793b8d24918c70d08fe6eb7f7492b2f3af8db9230a8f937d0cc9b39f3a7f15ee94e8452d585d7152e578e49ba345abd5e011b48d9ff88fdc80f22d3588b9025e73a0da14d762f2b4d31af7965d17ef5fd46460d0e087c5ded6aafe0eee3a0769f4e0f102671eee203129c1b36ca4f4da40e5bec2c172678042af24c4c147702f8a77d866385e4369513a4a08289182b6bfa29c412bdfdccde7b6c2ba95d508d5c2c7b34c6dd03aa22a817cd0fce8a5f256d027c5c34d1be2b951fd88dc35f89a71a0d53660ae73ca254f95e669b994880fea93d169053c1b31e36bc853509381b8548c8dcc2883d39e4353747b0285121b769d3a5b4d468ea6a11a12d34eed6e2be3c904955f592f19113aa5686f3b4d270b84b7e0530570bd237e7ad359e86527f4f138fa2de5b2137b95e7e7ada63be09d4847de0e0b57d82b1b9759da1c4571d8fed7e8fcb210302f2afaba300dd595d06e9f3b95d18a8c2acd1a3954228327fdb31ebb7c6a9a54d6a1bb0780f3a0b9a1034f96a4907e1d5b8637bde9d142d23b75e2318b5432dfbf59758624f1913f355e95510e5250c16c69ea337420e1145e0ba95be4b9bcef63ec21f4514f260e758784f5171f149426f392213f35c3d0c50ced9e04bf8406f6b033032fca73651d5d3933ba8716fedc3e6ff039b8dffe51829792bb5403cd1a05cf7a3909730379d9f7de5715465f307e0df29d01824a763b4c6bdf4a479578ee0b5ecaef8b8721d9e211c23bd17ec3e664d86384565fdb7e0338c66e44d3ceb52b692417939e46ea2746d99a0281e04b7bb864ec1d751a298ec42b48fc4dcb6c8675bdd95fa1f70c2fd460733a42bcf779fbbd09962ba393b1e995f6616bee210b813ac4b3c26a27f0df0335432865c341b77060521dcc0b5b627a3a95af7249f965150b59f665a5bdf5eeb0f439dd7c59364a15e9409cd725806a27aa2501ee1d9e97d9238e1d64fec6db88f3ea58d92ee66eae01c2c970176be44b1a1e2ca42660301b022d4f7dc2df02221c3074240fe47447a36f6db3643e15794143580f7b668bf67a7b197d060d9b05c2f0ec349e648ebea877947ee86152f43f33db4b1d8086519549750b603db1a9f4c0aab29e4acd00497fe4aa8be5d2cf68945b3ad08a36348a428d9cde4a976a636bb46d9baa691b3ab37a58a695fab29c196cc247c9854201f82f6a74bc684200e5b581f9c21c129b8786c722bf63445224d2ade4d2202969e8b4e45e424f539e8c63fe02336e5861ef6a65e58a51a6e352f6d9afba94ae645ed345435b58b1ee4f4d0119589ca58325ad90a83b54e70dee71d7ba1913daeb92eb75a3dd1a1979502d5339fbc04d2e7c81e1d1e65e7ebf04c8b1d2085d998138c1ca27b6e3382827152bf960a9bcbb21da4fefa000e927603b87ef0853ca760dc980c6d80b8c0ad90f79a7d19acaf55c0974eeb6c21a56535dcd0dcafa10802b8bc4fbaa8c4ecc93ec1562a6018637bfe7ab6120584ca7ac5f6f111ef9d49dc9eccda9b77cd96119f3e35cb48ceff0a861e865fa020c57052f87cd73654e84276fb5ab571e40410b6d7858ae0f0beb2003c76d4c67ce2172819bbe09eeee51be3f200935e92b7b62ebc3f1c53212d737cbe48420ff75a860ffdce9a1a4d91dece5d6fbda6b59cabca67ba8fe72a89303d218ba377b2ce98948887b168b0796c10800c7c7f9a152203dec191e119cbddc22823892436af95d771eba3185a54b15319cc8bc09aa90d69330ba368ff1f342b583b3b8903890ac797783fc2e0daf542455a0f23fa4e08ae2c0cd36eb6652c080db7195ee029b176d3087c16171ec339db618623868a2324572d4fe7d918fe3bc047e4f543d88a913366d41cce7a456b43f85b90298cf4eb9ce5b456a320b788aa3e47501bb5ee70fa27382093616293ca5a00497e5cbd58a59f746d2b5874e428e2eb66095b611000a90b43e7a95cbb9cfcd66ae0a98e62f874767afe0543a6d5366c842644a51d1595fb85b75c00e50f18ab350d9505077a399d6bc430f0494bc1786bd92884fb02abd79329105307b9fe7b5c19d2ac7fdfa4d486c069a302528f9e4aa9ac4a18a2ef0bce7db265566e2719381654314c8dd0da937416b29dfd00dd5b53c8e0659a1d0a437077ee63c1470fda2af597dba70c17be33f9e0c7740a99749603eee10e9caeb92c035597d3bb4fa168259e364831033d281584a9c6f95676b860d0536824abd16a73aa99282b559f84160ddc509524c02ee23b5e08adb29065f0958fb386bfa55cec13c3b1fc92056ae0db018195a50da2323106d8e0b3a0b7eb56922c7e0446d8314459d4f403a4cc1f83b216e0c5c67e351c5dfe8c0f0c95022c3f6106ba9e53b04e8ae44503f8a247ac42eac3b554e7eda368276669207c5072c949b8f4f2533553460938582a443d6bca11cb4fa92f3908abae70a34d9f8e1c96befec91db0efce8f6799c33c7428b88cb69a4e6476365f749de45647b61722721af4fd281c429ffbd82bf9e0607e70e4aeb3b5653e720205014e674a53f1eee570b4a920a6dd059e456757cebd8fd19ead52d6390595d183193cd3a5be2b51479f389c3b179a934f9a418451b0f446e2ef49990ee0a51efd2ab147a0483130d025b5b3de2413d52fb68d5bb2f6108e7c6836a4e0081120a1f90bdd173e797d1ded3746e305d4bfc4673948263082c423e8f6f30c40787e2a13d93d41be71aaa975c8e022613baaea83b185059f8457726b108082dc392527d1ecc9e67658b26370575c3679694a7ae7829480d16133063a6f0f83acc6100fb8a8f8f0797b341b9b1bf51b054e2a90392b111ec6870457bee59acc305580ff1d9684456f23b12c9c9c5d6b0289712b22082cddf729a20db0f0531fc9d5a6774a95585aac6daa93bbaa3b53618a546f70a6725c1b78f856bcaec8be9151a036a887236f0a4fef71b4ea46ce7eba6c98d65774485a98c5f11861241eb5cf4fd736bfa87ea2a2130d11c26a12d4b2ec17819b101c8a0636d3484ce0802c7c2e570a846bd0bf850ae27ae59dff566e2e6c13d01de14adf630f08b4dee2b46ba1c1ff67db8e447512fee472f914d70be66ef94231f0d5cfd0176c41afab3e25ceff6b23dca0018562ea20225e5c40a54453f5b4695e3da06a4a103bf08651402a789e1743f16311bcdbe15187aa772341ecfd797184cbd2987347db09abc4c1d06f3f9b834bb3b3fa402fbbaf4ad8f92b9b522f722859f23ed094a996ebd1c805a7ec6e57f521e2c2b79676f59009c8a92b3834400512a651fd34cdaa89cd3cd9b277d12d68703d52b4683393338fdbee88a8c5ef153d3a1015148905ab99ed5f4b1bdaf62f52823cef7879bfb3e2016663e96dd025cf0d3e24c40d1aeabac66088e898ff37ea038e47d3085986e3387e7b89d8ed41c2e0ca40240c048bfbf801948740c8cd646e41539055695f96f8deb4ea61156c8116e28d701a43d40eb0a4a97e7f3358f5dc69fa2e4d73b88b3c4f9d452413c170dba7ef92e5baa7cad254a24b4991f0740ed84683035be16b2ba28751246d59eb65284d779d6e11953babce7735d806cb26140e17c0207f9541997ffb875da70bd0ced9b8d5103c484877be890b5bc7136c783ea5b137ab5c38ffc6312f4bfcf2c5c6771bb6a5dc38e36fd84570f916d9adbe6fc868b15bf45d9c40a6c777d1cf0f7c8ed70119b384f6cbdf6a1dd750b7656ee0b6a0c09c2233373907f3d4850ccab9f9e832bf0eb7b26a4e74569f7830a3e06543c47d909f2f9164b0815fd1dba43da8d4903da9f562013fb54a26aa5a79b87b33d9e1b6da3f1a0f59dd80da05df76ff77ccfb3eb4dcf28eca16797a46932e5e5742190eb46bf2999712b9753565aa8d8ffd93213da79987eced85331a7782ce23d2b67a8bbc0b35dfae64af1ccf8a89dc433f9e8945bbb3076110bce0c4deb0d7fd18d946c2b2fc2dcf09e535a2c9a932eb9b1b656d4788a1d6fdb62950000889caf5e3485ca2c2d40e4f37a912b93de24c168db3dde34114b27f0b1d5866f3be9ef9f57277aa4effc4569571b127d54fcd1b55c57ad66bcc2076026c1320dc25a5861df280433fe591be563911a61af2604def1afe91492107b9e5bd7e64b33a664b9df4ef4dc7483c5306e0469bd47b2cb68cb6fe411ed298dcd06f0cdd07f4905cf4bf7211f291bbf4cb4ab97cc8d5d05d3904bcf15e6e481e086f616e24ced8e755b0fab89fa3f6677cad8508d32fa9bface5bc473758804e422096944530783273e3b5eed48065b68c4d46bd1cce7c6a94d59d5ff17d9ec7d8afe7cfcaea027c1ddc9779a0cd9e2514026b56cb71d863cccbdc83bb48b8c734f39cf1b53ca34bb79965752fb545a6778db577e27c280f5b5c8c017e2a5493deca529aaafb985ed43f911aa2a1aeea2755e74e618d4758251c89c1aab2dcc34539fbffc8041752f8b23274597e406ba04af7293298f1889f5aee682803dbb71a5ef991a175a8b0b292084589dce901211b8110d1c9c7717f82628fe2ccf3c84df56948d3d92f3d3193e369c8c9675f42813d53a0cfa52d66101ee964d6d40a9e1286de8252c345da10c7552a581a4c7a201f42322366bd1be477d68c26548aae49f97da1098a505278c2a887bf1e5ef6a81542406e868172bbc4b2d850bb4ff3eadea919dc4da166d16b28919cdaccc8f91bf054da8be2aa1d209dc0cc4a4dd94b1620a8d20144ae557fb90ca43ed217e83ed328469e183dbdc48ca301fce65cdfd034b764755b7e1486652a5f0ebdf853538794b1156f847c3c7031e0c9ac805856a1ba9b41a35e78e66d4602b99ec53f118f136c850be0b95def2c03b07b442793df6be8550bc5551926fd2861db582d2f905fce8041a1137bf1200e13d811d523bd86cdec060fff2db259efe2c8286f863e805a128953d7ef64fe4821ea48fdb0df4f80e39eee3621079657ec8604c972595a9cdea02b00a0b55aa24a6c4784885e4e5662ab8051ff459a6c3022514db9c56d24e91578b37fbf90b20a929f1363d6bda3d7a4c85d180fd671b3a7e04c3bdae98c2c9928d6d66cd67b9eb3b050441aeb811349b9e9a0d255ad79c2488500ef976ba470f342b6f4c5ded013719bf58d69acb3ca931a86ce2d524cecc87030e42b36d1e7f814e851dcf0145028f096184628ed758b48178097c21bb6848f89f6d7026a42bf896ea5bdf2f885e864041ab33fdfb12b630f9db2aafee20a1f9cc979bb87ebee648e5dbb5ef6a9a17680e466145302a2448475179c0559964cf8876fa56543d26b39079c4f1b9c047a22052c931d4ae0d7f715c88e106ff9a9408360587a0efa5066758d53fc757d15c996e1c8324cd2b7363cb27ec7dc1b6cb895a690d830d8bce3125bff59b4b2e961636671823cc263a093a5f1fceda500ed13362d7f8a8c6d60ba55f4dc1ea4fc669be3fbd5dede1806e1e35e2a71de38d53b6f5ed2c17bfa594285976772adcd9f956a9e3c36dd21cd6befbe64643d821484bab49d220239371cde37f5040de69919a5e54cf5eee3786a072becbc3679f9244a504c74dbb083c8b2af3ad0a45bae812a4d4c0028ed83df0d584bdcfaf025d4359e80d4d5d42e5423dfa9badb40a8609a6067763faabc55659875ec6ba4f643cb90bf6eeb6ef083d2923d1c76d67c1d2c2e8b879971cbacfe0190094d9f5330cd0122e116cc063b2cc4744f41f262d1f5d8f72b8a4670be4406a195835f27feb1e25ad3b4414d61d37a153fc7e52f6250b955a918ce47cd15220029948b520febe6e1f556d0c1fa60c618c2511337878426114f988a32bdf155b29a8455cb18b160d4e54ec1351cd21af35baf666d09c6b4f8e87763a1f2a475fed9da7155c070ffe3b1f8de8fb00214a4fd627595fc4d9815b4622d2bbecbe27162c95a12a63e58247dd292710022019fd4e4a594660d469955b28acfcda59c362aec82ec51e96ecff5ce8a10aafdff5e6db539cb45f0798ceeeda9e2f770a6b4a40a760b5fd48fe102a0ac37cdf6a9dc7e4bc91ff48ebbcb48a4dc979150df9996699f32f1c494f4b43a19d6b024442ed4cff7a4f18dbfa8804719b7c6b05c005fd655ea7d88d1bcbe6787e00683508fac27d2e46f6e750c60a3655408d5aadbc8a63e7b9b7b941b80e6aa97cfa7418effcab57a2d6d595aa22a92f8259a6cf821523260894c2a49fafbb8c71b3a03fcaeed0b365a9a14f0e3df05d952af2d69ae252c3a32e77c08f62e405e25eec838ca439d552c3196a581a87c6e855b58da7e8ef57a8b59d0ac39b3b60cea60d0f3386faf32e01b5c64df08f73981ac98eeab7739afcd6bc1ba449754b6d84723f37398f65c6887d0f15cb8b3c4706d01d37120b49618509e4eb18f6a96d38eeaee4bb0387342776f1233f77c0bef74fd42e11e38e0d8a57b055476ee391e5cecbaaec812d86d5234109ef9610c774bdb6467a7ca7794fc7fa4f7d0738351e39d650a29f0d220f230a8d85404a3c52f1d21ca284cb683cf92956d17440b56a211e2d30f40411a8dcf87a77968da0b82f09d3f497bf25706d138eb21fe1f7e7977cad2fbc75ce576110dce177ea69425201eacc4bafe3daa63badfe59319b814bda026102e815ac9664e94696cb28f6b1e695bc2e90deaccedf1c8d9cd63dbd405ff22837464a4b84794d1b969fcb6e32461b39b69d4a6b7be1913f84da2a8af46e6e20a965deac2c3b459b1a73f9e226da14e87f1bda9b7c89749d1de3596e6c81b9634453c84830b791e7f7c0225a2034a9204333f51661cfa0eb82f579cb494ca3997cbedbc4d011a308086b9f6fc003ab5cd9b9e90ca84c783d45106a8aeb573ba2bfb872749ffc1dea7f58e32034db761848a0ba1f13325bd22010dd3e306d5e95a024f1cb2dba931ca423a1bc1660ed0784ab392bb77da728d6c4ea88ffc18bffdd1eb5e275a3399b6df173cb15f19dff655dc8f2399cc32030836316acce6453df929c5d04f6ebff9f7772f0b5f96cc0b252bb71d4a2c9f13b7145d6c4e5fb01c35dfba928dfa8bed26133c11d9f6dad8684cda22b73bfe84524e7480581c6f7a2c2aa6faf7fd0362324fc8302900da1f017d3f434365c5f1e9f65ed70a79cd0a0654b7ce16ad473685f67c7c4f8b292574b5d715de97b70b53ff5ba7a0326009707abff4029ffe446bbe7b3fa9ea41770ff28db07d4661a004ffbfd7cac053dc9c17ced1936b1c8dd72b268ae00fdec6a1e60be47cb1f59f3835d8a1ab3547e4874346b7f36d3ce36a7306ed693c6082615b0d2083310ec2de57a92116c6a9cd2f8891d6b787f60f5f610fd29737426b877664ffe6816a11e0dcbc6248f90edc40bbfb537e95478b0b2513f80b5a599f8179d716efa2e7919cce2042fdb35bee2ce8c756a1c1cbde22c31b5e4c47151cba85084bbe3d86333dd1a568144072fb3086fe0e015aaca2520e885b92781850b86abd90297adefb5894a25e406e8df4822390f8fffb1b3881112ac11bd5e16c2ba917ab1140df614f846c1c09d8bd8b733181201dea4ebcb354fcdce1dd0015d7e983adefca1a5457c28c56f9c7fa3ab271ae8503df2185a79026b89a8287f2ff6dd87ce559918ef7b06d33c390a5e6352805f6db2f0d605592e708136590476cbe02c0561936a958f3740bacb5df5425ad3548484878e77dd81d9ee82d0030d2d6bbaf597fe9757bd5199f195add07933df925a681723cf8a812a3c45f75b4a69b099e2a2b752435922e6288529819d508b34d78523626fcc68e24fbd2ae3e53f027f88eb8906a1a21c8ab94c133740e57da350e008e0c3ee839f52cd4c1c04b0e3aef9875bda75bc65eab6e0b002ec4c1a69daac515de37a4df9e292bae1b0654522de063fb5a8dd3e2a33093940fd4a54a4cea4bd6b3348bb8674966f8009c0a32baa941467281ad4c70fee16f6894ba95d5aba834e33f55f3900de83487f596bc6913776867e43e5df403d5c01e63185cde3f236c2e07a2d4203487b13990559d262b16ea43e28bbaefcf07c11518a666086efbbfdba7ba45d7428aeb84d81815d50463baf82a9fa7b0f148a64aa8a70427bda0f68e63fb58212f9e1fca3283f9346c7eeef438fc8312789ef086c27deb7eb970c4443efb7fb7b2fc3ed68a4faba3a19d3317dbac7622f827d2714d8647aaf556da3c0eb214403407388d6ba2d96fece21df88d2f3f373d593aa511a30449fe91cbfe97423f14e797e49b96cfc3ea5f601893b014119b09c8702fc32d199d453292b4cc7b2c84720c880f524e1b49a28046a8381a218bab3948d1497a4919f86920e66a688f0986bdd93300020ef2abf83bd9bdb2a6c20e4edba94df8ccbf55242349f502509fcb445a0f330b75191883d9cf17a7732f64c217a1a69e88fd5ab8d6c215484201305d6dd473fd49c63b40da99998ffedded2e972beb533218f3f5eae1007936b196abcd6b471db29fd241781e7c8e243e4a40bd67ce9a79f49cf6d225e15c8ab7269aa539e22bddb06ede912d5081d6c54fe909cd8c005cfaf4788d92a07529d6ff0a16d2e7851d416ae4868f57852f425c074e1f83a87589a55d50e62609aaa237570d6d5444489184b6a681fc3af3e3fbeba1b020346ed6ce7ea77c164719badef9347f467d83d97b1040bc9ec55d5344cd391d78bd7693271ec22bfc9cfcc668570fedf37729977e4726af5fdab90a57235ab368043c87e0a3793fdce44f463fdd1f1430960dcdd24e1b07a82768e87695bf221ec3ffddb4dd683476480d35dcc5478aa26987a2acf616dc9d3bdced9cc97a55e1e3876923ffe2aa14050edc09c489684bd36c53cd29662f99b2baac4a31dfc4d4a681e993639535c57d9086ee5356a72084ae52a7aa67f9990b85ad275c3bbe796e4aaf6f144bd572d000344e4ab267632403b20c2f54851e40b491a968e2af4787ef3463821717fbc68cfcdb8326123137af75f5e9e221dbefc84b10bd1896489a097587529133a47f473cd80fcaff1b89dcfd02fc91b70741800d6116e5afb3af6908b08a126b181026ac3228d81f3b12807288e9a8700a11afa6624d6a89371c5dc4202687ae1e8e6839fc448a9257838580fb8c4e8aed2dd3a4994684fdc5fb0ffa528d3aac3fc78e10c82eb869123d670f30734e34b1e7f1d5868708c72356f5c2a6db3facc6fedb1be10ad8565ef58fddeb46fd2f059319d449d5ba2afb276a385c270059add59ae6936de3646e0ed2eecb20c38d65032b59020330a988b1e3dfdc1ff3059497a110ee1e436073ae1a841c0b4fd3e1c979721a926f7841ba2d83fb8852ee24dab785eab173a5e6c1292015f30f8764c1d593d6a4f28bfe92b75af5edb6ee792756dfb1fcc127c6b53c8aead6403e0b23f9db927edd8a03736c246f772fed67625da1ee0ba4b84ccdc41a37590b9a21298c7aa43387ab50fc83764488a3384e558ef7d0fde01abe07659a4afe6b8520c908d55a59f3efb457829457b190b4f049e7204470885c59a396bcb56282e5ccbaaaaa208992c207bf60d1c0483ab5e4a905668d442444bdfe16eee0680b362ab08fbac40633dd1b3454d3ceaa008fa0169fe18a9a4fb43a51790f7104937c27864258f53b7fbbb8bf68824673c1bf38e3575988c32dea8f2f9dfef578ac95427e1707b8d25a415720bb424b39b72c6a4aa497bed1bc571e59a622616875d701b69a5c916cf2cbc4a0e39c5e0045ee23cd25d3d93be9d6dff7a70d465d789bad97cb51eb24349b251403ffe64f99c47367e4a1da60722d0ef6842a69a6a5a89f94236db8102b6c545d0596d0d1be2e8f99f091bbfbdddfdd65ae48f8f644a57502f86e87ac5dad4845b9d61780255a88a318f2b889090b776fe31ebd6dfad624d0ba040533d5e6d2e41a5bd5e451fbeea0ab31ed41e72cd72106c9e32e26d9fe787c2f7c662be8daeab9b2434789b1595f7bf18fed4bc2604f724246bc14573d8c39a5739d824835fdce5a0a88fabd4f965fa85e5d011fd5d03d63b726a20998ff774e5237e2208f4d922fe217d9ef1bf669aaff62b2bb632376714bde4416d2f9d5bdfdd5b61b19143057990c62c142a0f6ecf7c1fc8e56dd1fc17dd29b63c530c60264973ec4bc6fcf41f68262e816c018c089093a5046454ac9b6f251929ad2d38cb76714692d15c8a51d24027d2e4fdd2f8dd4880d3e697e83f3ad408dc5029a8d05e2b1f46a37c586fd1fb26e14fc3199da1f1e2c20fd3b5a01c0a0d02f43a34072b9459578765395b3c9d201191be8481c42ea4c823041cd7bb2f3b2d1f170a178b445d6cc1f3f2ac788c382d4c2b74d9b89fe26f2eca12eb93784467445154fed7e7a63ca7485b96705c972e346e841d9ea752e354f49d2c2eb4d747fd5a47ee05e5d2a8ce53cd8b262f491e4fd69080f1e8f719c45e9ae7814c5e82edb8a82ffdbc1e9ab335aaa39b0cd1ba91bb68da8df83e04536ca029a99ea11196ec89a062a091528df5a9d0a086422575a55f96ca888cc0bb4b599a5c660ea0d4a2896a2b30119deb92957e0a4623be6a6e3f9c59ab0c1a5eb7d250f15fafeab808e5fe2b47ec2f5eca84401268c7bd13c5a94ac379cca7de6f7b8e6bd1361a8af7353c337e1951c0bcfa83646a7330b3bed4522ddf058e558ac7a46238003a73f1f3c7d0e9d9a2815cd2edbd2f03cb4f68f55060fd2ac489555b4b2c6df02b50bba4cd6dc8eeb36acdd2ab1f4bea8a78bfeb7187e80c9cf4326063edd2002a9171bb62f3ea44f3e15e928a39923ec3bddc35468d931b91f2a9f19a604ae0c75c990cf868ca8a50dbc39f4429fba20c014dd45d2089b3cf40828ad0cb2beb0bc08413a14f235c014d1236b4a74bbead1781655aa34d89f1f268aedc0afea419ad88b</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-wave">      <input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-wave">密码为我高中学校英文小写简写+年级+班级，结构为五个字母+两个数字+符号“-”+两个数字，例如ppsuc24-02。</span>      </label>      <svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">        <path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>      </svg>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">不要看这篇文章&quot;</summary>
    
    
    
    
    <category term="日志" scheme="https://www.petermatt.xin/tags/%E6%97%A5%E5%BF%97/"/>
    
  </entry>
  
  <entry>
    <title>信竞要以和为贵，要讲码德！</title>
    <link href="https://www.petermatt.xin/blog/Autobiography-02/"/>
    <id>https://www.petermatt.xin/blog/Autobiography-02/</id>
    <published>2020-11-23T05:12:33.000Z</published>
    <updated>2025-02-08T18:33:49.815Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>&emsp;&emsp;同学们好啊，我是中国人民警察大学学员张开昕。刚才有个同学问我说开昕发生什么事了？我说怎么回事？给我发了一个张照片，我一看！噢！原来是昨天有两个年轻人，十六七岁，一个拿了数学的省一，一个拿了物理的省一。</p><p>&emsp;&emsp;塔们说，诶，有一个说是我在教室里学习编程不懂了，开昕你能不能教教我信息竞赛，诶，帮助丰富一下，他的技能树。我说可以。我说你在教室里学太“死”了，不好用，他不服气，我说：小学弟，你两个人来比我一个竞赛的。他比不过。他说你这个没用，我说我这个有用，这个是积累，信息竞赛讲积累的，简洁而高效。两张省一的其他竞赛的，比我不比我这一个信竞的。啊，哈！他非要和我比比，我说可以。</p><p>&emsp;&emsp;诶，我一说完，啪就打开电脑了，很快啊！然后上来就是一行万能头，一个标准域，一个int main()，我全部代码打完了啊。打完了以后，自然是传统技艺你打完为止；代码粘到洛谷上没提交，我笑一下准备关机。因为这时间，诶，传统技艺的打完为止，他已经输了；如果我一点提交，一下就让他看到我AC了。粘到洛谷上没有提交，他也承认，我先打完他后完。他不知道代码粘到洛谷上没提交，他承认我先打完他后完啊。</p><p>&emsp;&emsp;我关机的时间不交了，他突然提交代码AC刺我眼。啊，我大一了啊，没有交。诶，他的代码比起我，啊，提交，快了一点，但没关系啊！他也说，啊他截图也说了，两分多钟，当时就一片绿，指着我，我说停，停。然后两分钟钟以后，两分多钟以后，诶，就过了。</p><p>&emsp;&emsp;我说小学弟你不讲码德你不懂。他说开昕哥对不起对不起，我不懂规矩啊，我是…他说他是瞎写的，他可不是瞎写的啊，一百多行宏定义，训练有素，后来他说他写过一两年Java，啊，看来是有备而来！</p><p>&emsp;&emsp;这两个年轻人不讲码德，来骗，来偷袭，我这十八岁的老学长，这好吗？这不好。我劝这位年轻人，耗子尾汁，好好反思，以后不要再犯这样的聪明，小聪明，啊。呃…信竞要以和为贵，要讲码德，不要搞校内斗！谢谢朋友们！</p><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="日志" scheme="https://www.petermatt.xin/tags/%E6%97%A5%E5%BF%97/"/>
    
  </entry>
  
  <entry>
    <title>【昕体验01】闭眼倾听，世界更美丽</title>
    <link href="https://www.petermatt.xin/blog/Xin-Experience/01W/"/>
    <id>https://www.petermatt.xin/blog/Xin-Experience/01W/</id>
    <published>2020-07-19T06:42:00.000Z</published>
    <updated>2023-10-14T12:11:57.473Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><img src="/pic/Xin-Experience/01/Banner.png" alt="banner"></p><blockquote><p>“给明眼人写盲人应用评测，你也是评测界的一股清流。”</p><p align="right">——某刘姓博客主</p></blockquote><h1 id="TalkBack体验"><a href="#TalkBack体验" class="headerlink" title="TalkBack体验"></a>TalkBack体验</h1><p>&emsp;&emsp;因为个人原因，最近几天我不能用眼睛直视手机、电脑等电子产品；不过接打电话、听听歌曲还是可以的。但是不甘于放下手机的我于是想起了Google提供的无障碍服务中的TalkBalk。</p><h2 id="TalkBack简介"><a href="#TalkBack简介" class="headerlink" title="TalkBack简介"></a>TalkBack简介</h2><p><img src="/pic/Xin-Experience/01/TalkBack.png" alt="TalkBack"><br>&emsp;&emsp;TalkBack是Google的<a href="https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback">Android无障碍套件</a>（全文手机系统默认为Android）中的一个应用。无障碍套件包含一系列无障碍应用：“无障碍功能”菜单、随选朗读、开关控制和TalkBack屏幕阅读器，可以让我们无需使用双眼或者仅通过开关设备即可使用手机。</p><blockquote><p>无障碍套件简介：</p><ul><li>“无障碍功能”菜单：可以使用这个屏幕菜单来执行锁定手机、控制音量和亮度、截取屏幕截图等操作。</li><li>随选朗读：系统会朗读屏幕上选定的内容</li><li>开关控制：可以使用一个或多个开关或使用键盘（而不是触摸屏）与手机进行互动。</li><li>TalkBack 屏幕阅读器：操作手机时会获得语音反馈，可以使用手势控制手机，并使用屏幕盲文键盘输入。</li></ul></blockquote><h2 id="开启TalkBack"><a href="#开启TalkBack" class="headerlink" title="开启TalkBack"></a>开启TalkBack</h2><p>&emsp;&emsp;我使用的手机是小米8，系统是MIUI12 20.7.15。MIUI提供了以下几种开启TalkBack的方式。</p><ol><li><p>开机引导<br>&emsp;&emsp;在新手机开机后，会加载出开机引导页面，此时双指按住屏幕大于10秒左右，即可听到语音提示“持续按住双指即可启用无障碍功能”，此时继续双指按住屏幕后会听到语音提示”无障碍功能TalkBack已开启”并自动进入TalkBack教程页面。</p><blockquote><p>&emsp;&emsp;如果是刷完机会显示“本设备已锁定”界面覆盖开机引导，此时若想不激活设备就启用TalkBack的话，可参照第二种方法启用。</p></blockquote></li><li><p>音量键快捷方式<br>&emsp;&emsp;在任意界面同时长按音量+-键3秒，即可启用TalkBack。<br><img src="/pic/Xin-Experience/01/o2.png" alt="o2"></p></li><li><p>小爱同学语音开启<br>&emsp;&emsp;直接对小爱说“打开TalkBack”或者“打开屏幕阅读器”，小爱同学会提示“打开TALKBACK后，服务会监测您的操作及输入，检索窗口内容，并开启触摸浏览。请注意隐私，如需关闭，可以对我说：关闭TALKBACK”并将TalkBack服务开启。<br><img src="/pic/Xin-Experience/01/o3.png" alt="o3"></p></li><li><p>进入设置打开开关<br>&emsp;&emsp;对于MIUI 12 20.7.15，打开设置—更多设置—无障碍—视觉—TalkBack，将开启服务开关打开即可打开。</p></li></ol><h2 id="关闭TalkBack"><a href="#关闭TalkBack" class="headerlink" title="关闭TalkBack"></a>关闭TalkBack</h2><p>&emsp;&emsp;如果你误启用了TalkBack，可以通过以下方式关闭</p><ol><li><p>音量键快捷方式<br>&emsp;&emsp;在进入TalkBack模式时，屏幕上会有“当前处于talkback模式”的水印提示TalkBack服务一起用，此时可按照第二行水印”同时长按音量+-键3秒即可退出”的说明退出。<br><img src="/pic/Xin-Experience/01/c1.png" alt="c1"></p></li><li><p>小爱同学语音关闭<br>&emsp;&emsp;直接对小爱说“关闭TalkBack”或者“关闭屏幕阅读器”即可。<br><img src="/pic/Xin-Experience/01/c2.png" alt="c2"></p></li><li><p>进入设置关闭开关<br>&emsp;&emsp;对于MIUI 12 20.7.15，打开设置—更多设置—无障碍—视觉—TalkBack，将开启服务开关关闭即可关闭。</p><blockquote><p>&emsp;&emsp;注意：对于这种方式，你需要掌握一定的触摸浏览方式才能进行，如果是误打误撞进入的TalkBack模式，十分不推荐这样退出。</p></blockquote></li></ol><h2 id="TalkBack教程"><a href="#TalkBack教程" class="headerlink" title="TalkBack教程"></a>TalkBack教程</h2><p>&emsp;&emsp;TalkBack的官方教程分为五课，如果是有需求的人，建议完成官方教程，因为官方教程不仅文字描述具体，而且具有交互教学性，可以真正地。<br>&emsp;&emsp;当然，本着一颗无聊心，你也可以看一下我的简介。</p><ol><li><p>第一课：基本浏览操作<br>&emsp;&emsp;快速向左滑动手指可以向左及向上浏览内容，快速向右滑动手指可以向右及向上浏览内容。要激活选定框所选取的内容，只需在任意位置点按两次即可。注意并不是点按某一位置两次就可以激活，而是要先选定再在任意位置点按两次才能激活。<br><img src="/pic/Xin-Experience/01/Guide01.png" alt="Guide01"></p></li><li><p>第二课：滚动<br>&emsp;&emsp;如果要使用固定单位向前滚动列表，可以使用单指向左再向右滑动；如果要使用固定单位向后滚动列表，可以使用单指向右再向左滑动。<br><img src="/pic/Xin-Experience/01/Guide02.png" alt="Guide02"></p><blockquote><p>&emsp;&emsp;事实上，双指操作基本等同于原本的未开启TalkBack模式下的单指操作。</p></blockquote></li><li><p>第三课：TalkBack菜单<br>&emsp;&emsp;TalkBack菜单分为全局TalkBack菜单和本地TalkBack菜单。全局TalkBack菜单可以通过单指先向下再向右滑动激活，菜单中的项目是固定的，用于进行TalkBack的常用操作和设置。本地TalkBack菜单可以通过单指先向上再向右滑动激活，菜单中的内容会因为选取的内容不同而异。<br><img src="/pic/Xin-Experience/01/Guide03.png" alt="Guide03"></p></li><li><p>第四课：文字浏览<br>&emsp;&emsp;由于打字和浏览时，盲人无法直接看出文字的不同，比如使用“白勺”“的”、“土也”“地”和“彳”旁“得”的时候，语音无法直接听出来区别，所以就需要控制一次读出的文段长度，例如一个段落、一行、一个字词或者一个字符。而设置的方法就是点按需要的文字，然后上下滑动修改读出的长度。比方说设置为字符朗读后，只需要向右滑动选定的文字，就可以逐字符朗读。例如“的地得”就会逐字符读为“的，我的；地，天地；得，得失。”<br><img src="/pic/Xin-Experience/01/Guide04.png" alt="Guide04"></p></li><li><p>第五课：文字编辑<br>&emsp;&emsp;如果要进行文字编辑，建议先下载便于盲输的键盘，可惜的是国内的搜狗输入法、百度输入法等都不便于进行盲输。编辑框激活后，屏幕下方就会弹出输入法供使用，可以点按返回关闭。输入文字时按住键盘区域然后移动手指，TalkBack会读出此时手指所按的字符，松手即可激活该字符。同时，可以使用音量+-键调整光标的位置，音量+键向后移动一格光标，音量-键向前移动一格光标，TalkBack会读出光标前的一个字符，同时可以结合本地TalkBack菜单进行选择、剪切、复制或粘贴文字操作。<br><img src="/pic/Xin-Experience/01/Guide05.png" alt="Guide05"></p></li></ol><h2 id="体验"><a href="#体验" class="headerlink" title="体验"></a>体验</h2><p>&emsp;&emsp;在使用TalkBack的几天里，我深深感受到了一种绝望感，由于刚上手TalkBack，操作熟练度不够，经常操作失误，需要全局返回重新操作。如果不是因为我知道应用长什么样，哪里可以干什么，我可能什么都干不了。接听电话或者是打开网易云音乐从我的歌单里选歌听听还是比较简单的，但打开输入法搜歌或者发送消息什么的就比较困难了。</p><h3 id="影音视听"><a href="#影音视听" class="headerlink" title="影音视听"></a>影音视听</h3><p>&emsp;&emsp;在不能看东西的几天里，我尝试听完了《破冰行动》，发现只能大致搞懂剧情（这当然是废话），使用了哔哩哔哩和央视影音，整体感觉是还可以，可以跟随语音提示正常操作。使用网抑云网易云音乐可以正常听歌，基本不受影响。</p><h3 id="聊天社交"><a href="#聊天社交" class="headerlink" title="聊天社交"></a>聊天社交</h3><p>&emsp;&emsp;几天当中，我完全放弃了使用聊天社交，因为我手机上的搜狗输入法和百度输入法对盲输的支持不好，在敲字母时由于字母不会移动，所以能够正常输入，但是选词和输入特殊符号由于会跟随滑动，所以基本是完全蒙的状态，不过后来使用语音输入就比较方便了，但我还是没有太多地尝试聊天社交。</p><h3 id="娱乐消遣"><a href="#娱乐消遣" class="headerlink" title="娱乐消遣"></a>娱乐消遣</h3><p>&emsp;&emsp;在这几天里，刷沙雕段子绝对是消遣时间的主要方式，然而最右这个应用很多的段子是图片或者是视频，所以不是很方便，但是文字段子也不少，所以也很能消遣时间。</p><h3 id="新闻资讯"><a href="#新闻资讯" class="headerlink" title="新闻资讯"></a>新闻资讯</h3><p>&emsp;&emsp;除了娱乐消遣，新闻资讯也是空闲时间的一项重要活动，今日头条和学习强国还是挺方便的，毕竟大部分都是文字资讯，视频资讯也会经常将主要内容用语音播报，所以新闻资讯的阅读几乎不受影响。</p><h3 id="居家生活"><a href="#居家生活" class="headerlink" title="居家生活"></a>居家生活</h3><p>&emsp;&emsp;虽然说这个类别的应用我不是在家尝试的，但毕竟分类叫这个名，我就也这么用了。我这几天用的应用不多，就有一个美团，尝试盲点了一个外卖，但是最后还是在家人的帮助下才完成的。由于我不是很熟悉这个应用，所以使用感觉效果不好，用了两次也不用了，当然也有一部分原因是我不能吃刺激性的食物所以点不了多少外卖。</p><h3 id="游戏"><a href="#游戏" class="headerlink" title="游戏"></a>游戏</h3><p>&emsp;&emsp;游戏？图像太多，这样子玩不了的。</p><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>&emsp;&emsp;记得之前我在YT上发过一条关于德国的色盲&#x2F;色弱矫正眼镜的体验视频，带上这个眼镜我就可以通过色彩校正看到正常颜色，不过后来因为这个眼镜的部分问题我把视频删了。想必也有不少人体验过或正在使用类似的眼镜。<br>&emsp;&emsp;其实很早我们就想出办法让盲人感受到这个世界。布莱叶盲文的发明使盲人可以仅靠触觉就能感受文字、获得知识，然而智能手机并不能将屏幕上的文字转换为布莱叶盲文供盲人阅读，因而盲人大多也不会持有智能手机。然而一次路上，我看到一位盲人拿着老年机拨打电话。我们都知道老年机大多有实体数字键盘，并且有声音提示。这个声音提示本质上是为了眼睛老花了的老年人能够知道屏幕上的文字所设计的，而他很巧妙地利用了这个机制使自己能够使用手机。但其实如果他熟悉TalkBack，应该可以帮助他更好地使用手机。<br>&emsp;&emsp;当然不只是手机，盲人也感受不到我们看到的自然美景。“当上帝关了这扇门，一定会为你打开另一扇门。”大部分盲人的听力和触觉感知力都好于一般人。也许他们无法看到山中绿水青山的美景，但他们比我们更容易听到微风吹拂树木、鸟儿山中啼叫的美妙声音，更容易感受到树干的粗糙以及这背后生长的艰辛。<br>&emsp;&emsp;我想如果给我一天闭眼到大自然中感受世界的时间，我想我也许会更用心感受世界的美好。<br>&emsp;&emsp;放下手机，用心去感受。<br>&emsp;&emsp;闭眼倾听，世界更美丽。</p><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="昕体验" scheme="https://www.petermatt.xin/tags/%E6%98%95%E4%BD%93%E9%AA%8C/"/>
    
    <category term="TalkBack" scheme="https://www.petermatt.xin/tags/TalkBack/"/>
    
  </entry>
  
  <entry>
    <title>成人快乐</title>
    <link href="https://www.petermatt.xin/blog/HappyGrownup/"/>
    <id>https://www.petermatt.xin/blog/HappyGrownup/</id>
    <published>2020-04-20T02:55:00.000Z</published>
    <updated>2023-10-14T12:11:57.166Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>终于<br>&emsp;&emsp;<br>2020年4月20日10点55分，我18岁了。<br>&emsp;&emsp;<br>十分感谢一路上陪伴我的家人，朋友，同学，老师，以及那些给过我一个温暖的微笑的亲爱的陌生人，感谢你们让我坚持走到现在。<br>也要和那些冷眼相待我的人说声感谢，感谢你们让我认识到了社会。<br>&emsp;&emsp;<br>十八年来，我也曾被别人伤害过，也曾伤害过别人。但无论如何，都要和你们说一声对不起。<br>&emsp;&emsp;<br>能改变一切的只有时间。十年为了一个人，九年也为了一个人，八年也为了一个人。也许路人早十五分钟是另一个结局，路人晚十分钟又是另一个结局，但时间选择了中间，一刀切断所有。<br>&emsp;&emsp;<br>十八岁了，丹参成仁了。有遗憾，没有体会到青春的这一份美好，也许以后可以拥有，也许不会拥有。<br>&emsp;&emsp;<br>十八岁了，也许应该满怀期待奔向明天，也许会被残酷现实打击，但我总要向前。<br>&emsp;&emsp;<br>十八岁了啊。<br>&emsp;&emsp;<br>&emsp;&emsp;<br>最后：<br>&emsp;&emsp;<br>愿漂泊的人，都能有酒喝，<br>愿孤独的人，都自在唱歌。<br>愿相爱的人，都拥有未来，<br>愿等待的人，都得到回答。<br>愿孤单的人，不必总逞强，<br>愿逞强的人，身边有肩膀。<br>愿有个肩膀，承欢喜忧伤，<br>愿天下情人，永执手相望。<br>愿你如阳光，明媚不忧伤，<br>愿你如月光，明亮不清冷。<br>愿你走四方，总有休憩处，<br>愿你爱的人，是爱你的人。<br>&emsp;&emsp;<br>十八岁了。<br>成人快乐。<br>&emsp;&emsp;<br><font color="white">叶昕</font><br>张开昕<br>2020年4月20日<br>庚子鼠年庚辰月癸巳日<br><img src="/pic/115282_OuDWsPsO.png" alt="丹参成仁（单身成人）"></p><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="日志" scheme="https://www.petermatt.xin/tags/%E6%97%A5%E5%BF%97/"/>
    
  </entry>
  
  <entry>
    <title>下歌</title>
    <link href="https://www.petermatt.xin/blog/Song-Download/"/>
    <id>https://www.petermatt.xin/blog/Song-Download/</id>
    <published>2019-10-01T04:34:56.000Z</published>
    <updated>2023-10-14T12:11:57.188Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>文章以 Google Chrome 浏览器作示例。<br>视频文件较大建议下载到本地观看。<br>视频文件较大建议下载到本地观看。  </p></blockquote><h1 id="网易云音乐"><a href="#网易云音乐" class="headerlink" title="网易云音乐"></a>网易云音乐</h1><h2 id="视频"><a href="#视频" class="headerlink" title="视频"></a>视频</h2><div id="dplayer0" class="dplayer hexo-tag-dplayer-mark" style="margin-bottom: 20px;"></div><script>(function(){var player = new DPlayer({"container":document.getElementById("dplayer0"),"video":{"url":"https://peter_matthew.coding.net/api/share/download/cc7d91cb-1dac-4959-ac9a-4a69fc6ff474","pic":"/pic/SongDownload/WYY01.png"}});window.dplayers||(window.dplayers=[]);window.dplayers.push(player);})()</script><p><a href="https://peter_matthew.coding.net/s/cc7d91cb-1dac-4959-ac9a-4a69fc6ff474">点这里下载视频</a></p><h2 id="图文分解"><a href="#图文分解" class="headerlink" title="图文分解"></a>图文分解</h2><p>1.打开歌曲页面<br><img src="/pic/SongDownload/WYY01.png" alt="WYY01"></p><p>2.在页面右键，选择“检查”（审查元素）<br><img src="/pic/SongDownload/WYY02.png" alt="WYY02"></p><p>3.在新出来的对话框中选择 Network 选项卡<br><img src="/pic/SongDownload/WYY03.png" alt="WYY03"></p><p>4.播放歌曲<br><img src="/pic/SongDownload/WYY04.png" alt="WYY04"></p><p>5.在左方的区域找到<code>.mp3</code>结尾的文件<br><img src="/pic/SongDownload/WYY05.png" alt="WYY05"></p><p>6.右键此文件选择’Open in new tab’<br><img src="/pic/SongDownload/WYY06.png" alt="WYY06"></p><p>7.如果浏览器可以直接下载，则下载；如果不可以直接下载，复制歌曲网址，打开下载器，选择新建下载，在地址框中粘贴网址并下载<br><img src="/pic/SongDownload/WYY07.png" alt="WYY07"></p><h1 id="QQ音乐"><a href="#QQ音乐" class="headerlink" title="QQ音乐"></a>QQ音乐</h1><h2 id="视频-1"><a href="#视频-1" class="headerlink" title="视频"></a>视频</h2><div id="dplayer1" class="dplayer hexo-tag-dplayer-mark" style="margin-bottom: 20px;"></div><script>(function(){var player = new DPlayer({"container":document.getElementById("dplayer1"),"video":{"url":"https://peter_matthew.coding.net/api/share/download/766da116-d34b-47b5-8f39-800cc5a0b160","pic":"/pic/SongDownload/QQ01.png"}});window.dplayers||(window.dplayers=[]);window.dplayers.push(player);})()</script><p><a href="https://peter_matthew.coding.net/s/766da116-d34b-47b5-8f39-800cc5a0b160">点这里下载视频</a></p><h2 id="图文分解-1"><a href="#图文分解-1" class="headerlink" title="图文分解"></a>图文分解</h2><p>1.打开歌曲页面<br><img src="/pic/SongDownload/QQ01.png" alt="QQ01"></p><p>2.在页面右键，选择“检查”（审查元素）<br><img src="/pic/SongDownload/QQ02.png" alt="QQ02"></p><p>3.在新出来的对话框中选择 Network 选项卡<br><img src="/pic/SongDownload/QQ03.png" alt="QQ03"></p><p>4.播放歌曲<br><img src="/pic/SongDownload/QQ04.png" alt="QQ04"></p><p>5.在左方的区域找到<code>.m4a</code>结尾的文件<br><img src="/pic/SongDownload/QQ05.png" alt="QQ05"></p><p>6.右键此文件选择’Open in new tab’<br><img src="/pic/SongDownload/QQ06.png" alt="QQ06"></p><p>7.如果浏览器可以直接下载，则下载；如果不可以直接下载，复制歌曲网址，打开下载器，选择新建下载，在地址框中粘贴网址并下载<br><img src="/pic/SongDownload/QQ07.png" alt="QQ07"></p><h1 id="酷狗音乐"><a href="#酷狗音乐" class="headerlink" title="酷狗音乐"></a>酷狗音乐</h1><h2 id="视频-2"><a href="#视频-2" class="headerlink" title="视频"></a>视频</h2><div id="dplayer2" class="dplayer hexo-tag-dplayer-mark" style="margin-bottom: 20px;"></div><script>(function(){var player = new DPlayer({"container":document.getElementById("dplayer2"),"video":{"url":"https://peter_matthew.coding.net/api/share/download/aa07edfd-5d0f-4a55-a7b6-089410122e1f","pic":"/pic/SongDownload/KG01.png"}});window.dplayers||(window.dplayers=[]);window.dplayers.push(player);})()</script><p><a href="https://peter_matthew.coding.net/s/aa07edfd-5d0f-4a55-a7b6-089410122e1f">点这里下载视频</a></p><h2 id="图文分解-2"><a href="#图文分解-2" class="headerlink" title="图文分解"></a>图文分解</h2><p>1.打开歌曲页面<br><img src="/pic/SongDownload/KG01.png" alt="KG01"></p><p>2.在页面右键，选择“检查”（审查元素）<br><img src="/pic/SongDownload/KG02.png" alt="KG02"></p><p>3.在新出来的对话框中选择 Network 选项卡<br><img src="/pic/SongDownload/KG03.png" alt="KG03"></p><p>4.播放歌曲<br><img src="/pic/SongDownload/KG04.png" alt="KG04"></p><p>5.在左方的区域找到<code>.mp3</code>结尾的文件<br><img src="/pic/SongDownload/KG05.png" alt="KG05"></p><p>6.右键此文件选择’Open in new tab’<br><img src="/pic/SongDownload/KG06.png" alt="KG06"></p><p>7.如果浏览器可以直接下载，则下载；如果不可以直接下载，复制歌曲网址，打开下载器，选择新建下载，在地址框中粘贴网址并下载<br><img src="/pic/SongDownload/KG07.png" alt="KG07"></p><h1 id="酷我音乐"><a href="#酷我音乐" class="headerlink" title="酷我音乐"></a>酷我音乐</h1><h2 id="视频-3"><a href="#视频-3" class="headerlink" title="视频"></a>视频</h2><div id="dplayer3" class="dplayer hexo-tag-dplayer-mark" style="margin-bottom: 20px;"></div><script>(function(){var player = new DPlayer({"container":document.getElementById("dplayer3"),"video":{"url":"https://peter_matthew.coding.net/api/share/download/ece1e2e9-2c43-4971-b416-b6190c87a1f8","pic":"/pic/SongDownload/KW01.png"}});window.dplayers||(window.dplayers=[]);window.dplayers.push(player);})()</script><p><a href="https://peter_matthew.coding.net/s/ece1e2e9-2c43-4971-b416-b6190c87a1f8">点这里下载视频</a></p><h2 id="图文分解-3"><a href="#图文分解-3" class="headerlink" title="图文分解"></a>图文分解</h2><p>1.打开歌曲页面<br><img src="/pic/SongDownload/KW01.png" alt="KW01"></p><p>2.在页面右键，选择“检查”（审查元素）<br><img src="/pic/SongDownload/KW02.png" alt="KW02"></p><p>3.在新出来的对话框中选择 Network 选项卡<br><img src="/pic/SongDownload/KW03.png" alt="KW03"></p><p>4.播放歌曲<br><img src="/pic/SongDownload/KW04.png" alt="KW04"></p><p>5.在左方的区域找到<code>.mp3</code>结尾的文件<br><img src="/pic/SongDownload/KW05.png" alt="KW05"></p><p>6.右键此文件选择’Open in new tab’<br><img src="/pic/SongDownload/KW06.png" alt="KW06"></p><p>7.如果浏览器可以直接下载，则下载；如果不可以直接下载，复制歌曲网址，打开下载器，选择新建下载，在地址框中粘贴网址并下载<br><img src="/pic/SongDownload/KW07.png" alt="KW07"></p><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="科技" scheme="https://www.petermatt.xin/tags/%E7%A7%91%E6%8A%80/"/>
    
  </entry>
  
  <entry>
    <title>张开昕自传</title>
    <link href="https://www.petermatt.xin/blog/Autobiography-01/"/>
    <id>https://www.petermatt.xin/blog/Autobiography-01/</id>
    <published>2019-07-31T18:05:08.000Z</published>
    <updated>2025-02-08T18:37:44.243Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉，您的输入不正确。" data-whm="抱歉，您所填写的内容与哈希校验不符，但你仍可查看此文。">  <script id="hbeData" type="hbeData" data-hmacdigest="75f414209477d2328d4a042ee3726a7efcf8059f118b04105969f65b7b7bb646">273518be487c51bc2f3c96d148cc516fd1db1ea13b1fc5b5fc5a7a318ba7e48622f0d780f46b3525106a71674bf2b101d4634f3bb1c01072a0d5b2c7730d9df56baecbb477f32d382571a4991422f127de6da559f69ff1f20e17d99672d1b791e6e5c5241232f59f3e1b1991452a3a0223b22e89934ab03b3b0e1fcf0755c716318c1444d79353e4b477cc276fbefa1bbc499f98b753954dc9779979461d353a5d3d9b93568b4a30e50f2489766ecafa097033bd661c8de961ee3a43e427ea1f0fc0a32862d8c8ef98ab7d97ba602e76ac620b5e69d2f0b6084595e7820e6f1533220a9abfc4b057d2ff3d9cd91ba38440d4f090f7641276837eaebe43c20da49612c6e86ed88d85b6877860bc5fa72e4ca9456875b3ea5f7f95816e5bcf0dbc1f589419b13f1a3de924f28169fb505b097a6cf8ebbba92450a80f0974dc26656f80c505bb43738d88d8275ee41fd4960573f12ed9deeccb6d5251f5423025c6ff65f054dad107f8047467e0621359acc58094787337cba1b0108e5904ee97a3842e4880861995e9256e3c0e448617edd07247581ecebcc590f3eec4348d68da215c97acd33b1f43f5bfcec81b96159138b92df6cdc468190f83bae743c80fce52fb2c788c493aced062bf68471ff05713bb46ac6c260c6e7a9ca7321abf5b2909a8768268313f06a799184261c3248823b2ae1cc24725ba60bdab2b17fe30cefc1da4c909bc2bcda424aa4e57344f6100081952bd9f0fd9d3df2a3416cc646faf345df4524e1b9409f40fe19616135c12f1daf73303af1d29f92a9bffba13eec07ad16cfed747d0b709bf0cfb15800e28127b0e5deb02d1f36b0bfd2afe079eb4d5c8ea28eabf3df8693679bc36e667fb393adca9282f59b766e10c25248297a125b459a878761d5a62d5593385e4d097e2130422cc99fa753db3b4dd39d4cd15ed98dee4145318f6c5ee8e24af96b497a6f8345c6c6cfb306566412537f33a185473bcdfa37d64f7df91b32a21e4d63dec588837fda1929690a179b7669eb9ba13e436e6a240a9de1d01896d0db84be1f490cccded620c95594d6bd9bd588949db89a2a1ac6c104ac6d6e2c9f701866b75779f14413f7c19950870f2d4ba96a1302cc22cff0fb57a77f2bd31f84b55b2e0eb11ae6fb741603addb3bb63c006e213bd1d679f5a47d9a574334a6e6912a1f301db6fecb7a5c6f35591f0661a50ae756ea4c1ca0c289bcaee3f7a10cf034a4b056c63eb0909673f2eebb9cadffa54b8e654cf6d93c9ab9cf67f659b76855adb62f8ffd67debadc4e08fedd1154f7a9ebadb2e04ffeea52505c9a131e838544a777841f2e2f4085a60cdd6d200343752e0792ee4a9da1f69d65aee08a40ccb32011f40fd8ea9893be9ee2e913a36fc42b717354bea1294725fc63deda74fa945965450c9170b9e7c19edecf1f807f96a761b6fef5f916e5b1314a06eeacb73219dace238138b7642d61b210eaccbd25186f9430d4333c9c370ab007e9b3d3e6998081741c4b1d7011640df0c91845da681ea0e8090b30afb8a9495667ab2d7526413bd7a4bd94d660253546b51a37110a041932e7829a674118084feb72f2732a5cad060c9e705f7afab110f06771094ec2921ee3f35a13c25fa81d6278556eadfe7c6c22a0fe6198fab5ca704a34f268439692954578a00eb4d95624a09f7d2e629f14e88cd55ce0d3e9a3d7814baf52abff475ae83b18e3fadb4b5132f5d7e2d7f720ec78265e2bfda1fb9d2bb0eb88ace6b196647a78cc6b816c38c40d1adfdb73d5f9277c2e1ac7121a4719935e0a7e6d5be14d65d399bb3d06800b2043f9290148b14683478f9005c04ca6e271e9b5d440c7aa2bfb5c9a5552025d9611b295b489c5bf2e035ac8e463f23ee6598ba6ef5a6e6cd65aa6315cf4673045bec4c52f4286cf9dcfb4d1453fb61c1a0552ce881d96da408e160d7e6ab6e774c39dacd2280451dd76c8ba6822110f142f0db2ebbe7193de2a9548cfa988240f624a4b32380cfc5fea023c24a21c4c50786579c851d047e0ff7576770cc09f1708df6eac053e12da8a01156c14f69192111f9ca6dae7d7c9cc811aced5a8829d6d5ea5ede6051cea33ed1fd27122072efa832e7c8a77f5725efcb7879e1050f4e3d9cd52d88a16064fbf6222f937963053099b12ab0c9393150d8ae5428fcc34a84324f2cb1d0f9fb09b11c621854534ac85e646eae4892356b40311b597a0b140b0a5c0b4af31396527c5c682e418efa9d48f6e42d1532d04d7bf9d53418233a28e7cd709affe94c00283747e7d564e1921f8bc5375b58098c7713b42e60d7aa6422509555f1bdd1c46ef9bb803a9bead532a9a3d199cb87887b9ed19846e4b859c17d2ab7ebe9241c073e921fa82f7577975b29d66af800d9ce78dc6e4c036b881fc5abdd344899ad6bcdc6366a2125f557661729ae5e5ed31c214bbc30a90e735376b709f1b7d88fd7072e249011bf30ea778a9d99be551c471aca4ef4da78fd461011d5762f7d568c4117377efb3706322939a05c1d418205d4f01841cb6f70acb57e4c3d70c785a8ae8de4031c4755f3e3f8708338257e44de8f359fdc5d83381c205ed81ab369880d584e7aec2e14d176a401167238f5e789a9226441efd42a06ceb87de6591b72c451e58caa0f603d98a3d442f49f2fd4e39a1f79e9934692cbb85b7b4fff8d569a0669ccb0e4c58c55b1e6d2908a6cdf62400d80b4dc023a39a06f3e8f7b945c439fe8796e95fc4268669727ace7699f59410443c1768c0866adabad8f1652e92f347122ff8e68cc90b7230c49537d4188a0c0360531674c1eeb49b010bf86503ee3009b853559b1d529a70b99db9f3462a958f93f7c82029cee8d248a1aee3db5c149038ae0ef21f0038f54e43de2e7ff2df0c7e3419f34f612e1658c95f45c29ba87c39d10b404b74072676793941292c98595274c6d0c2edf1bc3745e0857aaa18d80bc2515f6148f23f7c7b1880f23b8ec49716239a3f1b6501a84d4ee24f27cb716e942bd9b10eb597f22371999a7680a1b743358970ffb74070d524c63c4405c1da336db1334b50d4887f1618d6ef43c0819e7a164fed6a60a174e45e4626f0fbfbc3fcfcf6be40e1630109afb2cc8f68a59b1bba6b3f8dd8504420bba4b592fb18e8fa3219b080254aa7833d3d77f9c3efa52e7c67c1502c0dd6e384825ec470fa323e9c1adbe9247e755c510c37a49855f8bf04a95c4d014c0ec2fb941a4eaf66e8b7d66860d38b2566b2578f1e5fc77498b27df468a19d1665f88f70fd33c7214d300e963850a5d748adcaaf39cf52acd1fb60065581fc19fa22f0609b6be1b671f22fc56efe9f023ef041d3bc97daa7fb803806e9fff601b4d156528cce687d1f56214340d3bafde017271b96f03125611adcdf4587bebb02335fd39f09b39169a5cac748d98579b5dd460cda8de83c432618b0f798c5fc0eaeb6be034902c4abaebc67d8b4ae4c3f929d06001fcf36877525ed48dc974b7c41d2feb01366090806adff3e596d8a81b5163b842fa86074ac9bcb0636e5390d38795b240d0213d4b2dfa7923a2d749dc4e17f6fc74a4bfd3b709e0cfd974de84d65a98aa4d658554b133d78d33e8b0393e94b20004d46c80deae033e21e1f51d1b33d6129ee5cbc12011ed9512603ea03f365c6072ecafa25518dae28006e1d383918bc796f4f626a338ebbb5ffdeac06adef796916a70088fc6d132c578f84d0c4cfc03ed84271fe9b39c85dcf0926e65b73934f2c3ca3e1c7fee76cff53614a68163e054b2ca0daf9ccfe554442a6c41bb28a5e8320ccc90dfd1cc4f79b783ddb55e18adc8b4106aa6536324e29f22270aad993f3d04355cd37084dd918a30ebcdcff6cee070eaeaa8b7db3951ee6b3ae5866c4f1105e728523901ac99cc76ff82c157de27383ba516cf22d99a03becacc3f71fac5d8f8b86e5cee245cf627d4e9c6cdf21654ddbc31f4f21036d7f2192dfe8ec87dad327cac52100cefa4f0ae7b27d15a6273c2827cf60e74563c9d280fff734ccbafb336a1f3fd6ab98c146dc593bacae197ed902ed5947867f0b208151e24f3c36a2e6700ad3527edd9fb39902f8c51180497e8a95c7a65bb3791d7c3716b228b4b3452d3109eb5c718670032b1ee9dd9c231546f6608605248220c201d30e9b8b2c89faed1776c070f7f387c08a581ec8036540ca055e88ff187f0cd39bff4ef20287217ae3ba81999109ec5dab7347f852343fa6839d806d623e8c18a4c73536a266b02d45aaf946db5868ef1c5bd65c306cbe375412a1279c1476ed6a3a2eedc9f1ac62c9c4d1998c825270800351b60011362888d1a221665b6c442d04919579c43ac60f7aa6ba9e1de860c59b6439823aa9d648614fed938e2bab05d78ee5038b980f61c3ba5a4abb0a52f456dd81bc1ff15418cd70cb6c4c6e36c477a73c45973f3a723e6c499d3fcadd553f5ad08d199e3e94a5d4e033d333e632125b590653facbd3670dcc20d431c4fe84ccddf85158405414da8badca21f8ed75658fc91ad15cf23dc1e10560a2fc616a996506eb76fa5a02f0a0f7586eb031610d8465cb4909f37d2c01e2c102111b752f68bd0d6553efa3f3823a56fa2bf3dde56d5def653df6d2324c04fe8304b4d0d7a9ddd82b54de9dc023654d639d2d246883a002515f573027180ed90f43a515fd35d2e1a17d49aa526d550606b64fad4dd5b3d19c2f2fb7937d010f220e75bb768e63e3d73742e7e2a7849deb736fa8378fad378b06bf1b24ad6054d8e359e3d52658701425741c8407c09b8480e11c60e3d0617826eb5c6022921d5e4f16fdd0672a5393b9057eaf84e710808d3d8bf4387fa06f3dd3ad1b96c93616bfebe235b15d811b48cf9f775383d37890424d98241dc254a757d10eedc74dce486284d35be07fb9ea2d68e3de8c9ac27d1801f9f3b83777b36bca9efd7c7dd07b0eb056e4b4c7d68a1a462bd09574538d3f59eacf52295337e4651c5012ba705099434361ecbacd795d9373fb838eb0a7d319912ab624e51391af33037cc1516a20bf6c9af0443a8ec8332a113510beb519f48036079ed47d955a03a93621693dd26d91159feda6b1ef53c5e7eedfc67159cb878793f82921475ce6e843734347ad8b46fa05ffc8f67821d903b880730179c85d2a0b22c98039b3ad0b8dd5870cbbb20c47d2b068237be063502acaba593ff90e11a687e5c01f407614a765c2bd9fabeba9e458b92d8b8f92634523c14e40498a87218717bb42cba36bb089c126102d48130f215f925afeac9b83bafee14e6daec14567da9ab35801103b5352ba07646ad6baefeb90913eb11723a4ddb5bbcab25200b2b216325aa83935d3c99bda13976f68e2bb280d453c2077e69699646256be24257acaeb9bd1d761bc109ebbc9c3bbcce812a28347b75d5abe27adcbfba73fe42515af0d63d4b37eb0c155c5f9dc47ae9ee0c2417c720e44de684f316160185ee5f556b809e3a9325c24e669f54096ea7e75a8cc5b2fe133b55e9dda71ebf432c6530fccece805f8dd0ec0be4d3f8897b64f8c01503cdb4f3014a1dce00fc54640dec062d955da5ada8a4222c956e6768a61749513e5540345b28f331b402e6942aba6f9b2db6435ce54d51fd9a50816b6f4757b2d8b8adf52d449ce948ff98ac1e2924f33affe2eaa1c117aef807659ce4304c07ed348c8da5ed6b449955f4705f8e8cc7f41e39ea8a758033474efb066bec41228ded9756d8cdfe1fb960dfd8a0b982860eafc4c5b24a7c8f5a70bf8489d0ea3588385a67514e1135cfd488b241a252009c13c3e29738cfa982bd903d4344c96c3dc775edd7e83e375daada967e3e53ba921fb01717f45c552c94c9ccb39c4cc471e6b97af219ef9be446aa5e8595da4148a137f9230ccc1bfacfc7f60c98c01fb376f267146d7c163004b18a4866a9359f33fa29bb624eaf08d0f91eb15f262dccb5d708cf8e5bb6f26a4fc1abb9536f22505abdd283fb8a434676f16de9d04882f7e22c4a9b225b07d8bdc873284d77702bc96d718ee2547e7f836c688cc22a6112a329709171b13bfe16507e9e0a581f69257008c0b118c05af11c16c0e12a35890ca2e8e266944dff5b2fc1faa553e53b6ac99c4c35c809c68d0b3341e6211f1fefa6c3dcc85d63b95d51b8a6db3b9c60f2f6498a2fd80a9753686ccb1c1078c732daa61d813203501ca1cc1ca72e67702beef0d948f37cbf8fb04bd9166074f0f70d3cbcd0c1ad925e5340fb61e57c057c3380dd09bfed7609d334233172a13141c9f0f6087dffca3e786ce64ce9647c6187c38c928c7a77809e0f2db19b93970a405bdbd0ff2d52800c89fde7fbdd9bab2941695f89c6eb55e9be463e3441c71f53874570dec5db3cb25b437a77454715c6a0656911872055ecade27f4d5c868082621cc06993e811ec54853469e8372cb8030c895146effd06e8c912cac345d1b1972e3c9e41241c648e786a08430ecc19758b198fbfae75e1205a9ef0a8e079998f169199830cdf923f52aa3e98c3c1d737dbc4536876af9a95ac869472dd081bd876a23572a657241a1b477a5754a416b64ed0eb0b17e67059a02517076ee0ba3adb84c036a737c721ea2618503342a57fee9f740a4fa6c1a4936dd53c90d95d8e80f373bfb0e8a0ae0a939a7184d2c5f3ce085842e30a3ad756da3fe7ff5faf99ff31326259f51e7cf383c7f09019b00b94d217350a18d78c3ee05bb11c1da152736baa38f597</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-wave">      <input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-wave">密码为我高中学校英文小写简写+年级+班级，结构为五个字母+两个数字+符号“-”+两个数字，例如ppsuc24-02。</span>      </label>      <svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">        <path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>      </svg>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">张开昕自传</summary>
    
    
    
    
    <category term="日志" scheme="https://www.petermatt.xin/tags/%E6%97%A5%E5%BF%97/"/>
    
  </entry>
  
  <entry>
    <title>Hexo博客使用教程</title>
    <link href="https://www.petermatt.xin/blog/Blog-Hexo/"/>
    <id>https://www.petermatt.xin/blog/Blog-Hexo/</id>
    <published>2019-03-02T00:11:18.000Z</published>
    <updated>2023-10-14T12:11:57.146Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><ul><li>为什么使用Hexo？</li><li>其实你想使用哪个使用哪个，只不过我个人觉得Hexo比较方便。</li><li>优点：灵活度高、主题丰富、插件丰富、资瓷Markdown和LaTeX。</li><li>缺点：要求有一定的计算机初阶知识水平，源码包含大量外文注释。</li></ul><h1 id="建站"><a href="#建站" class="headerlink" title="建站"></a>建站</h1><h2 id="软件"><a href="#软件" class="headerlink" title="软件"></a>软件</h2><p>必不可少的有</p><ul><li><a href="http://nodejs.cn/download/">Node.js</a>（可以使用命令<code>node -v</code>查看版本）  </li><li><img src="/pic/Blog-Hexo01.png" alt="Node.js">  </li><li><a href="https://git-scm.com/download/win">Git</a>（可以使用命令’git version’查看版本）</li><li><img src="/pic/Blog-Hexo02.png" alt="Git"><br>这些是生成博客的必要软件</li></ul><p>可选的有</p><ul><li><a href="https://notepad-plus-plus.org/download/">Notepad++</a>  </li><li><img src="/pic/Blog-Hexo04.png" alt="Notepad++"><br>这个是为了编写方便使用的软件，不推荐使用Windows自带的记事本和写字板编写文件。如果你手上有其他多功能文本编辑器，当然也可以使用。</li></ul><blockquote><p>注意：如果你选择使用Notepad++，应该在安装Git时将编辑器选择<code>Use Notepad++ as Git&#39;s default editor</code>。<br><img src="/pic/Blog-Hexo03.png" alt="DefaultEditor">  </p></blockquote><h2 id="安装Hexo"><a href="#安装Hexo" class="headerlink" title="安装Hexo"></a>安装Hexo</h2><p>新建一个博客目录文件夹，然后右键文件夹中的空白处，选择<code>Git Bash Here</code>。<br><img src="/pic/Blog-Hexo05.png"></p><p>等到出现以 <code>$ </code> 开头的提示表示可以键入命令后，输入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm i -g hexo</span><br></pre></td></tr></table></figure><p>即可安装Hexo。</p><blockquote><p>请注意：所有输入命令前的<code>$ </code>，只是为了表示是在Git Bash下执行的命令，实际输入时并不需要输入。</p></blockquote><p>安装完后，输入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo init</span><br></pre></td></tr></table></figure><p>等待初始化文件夹。初始化成功后，你会看到很多文件和文件夹</p><figure class="highlight clean"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">└Hexo                &lt;-博客目录</span><br><span class="line"> ├.deploy_git            &lt;-上传博客的文件</span><br><span class="line"> │└... </span><br><span class="line"> ├node_modules            &lt;-插件目录（依赖包）</span><br><span class="line"> │└...</span><br><span class="line"> ├public            &lt;-博客生成后的文件</span><br><span class="line"> ├scaffolds            &lt;-博客模板文件</span><br><span class="line"> │├draft.md</span><br><span class="line"> │├page.md</span><br><span class="line"> │└post.md</span><br><span class="line"> ├source            &lt;-生成博客时的根目录</span><br><span class="line"> │└_posts            &lt;-博客目录</span><br><span class="line"> │ └hello-world.md        &lt;-初始示例博客文件</span><br><span class="line"> ├themes            &lt;-主题文件夹</span><br><span class="line"> │└landscape            &lt;-默认主题</span><br><span class="line"> │ └...</span><br><span class="line"> ├.gitignore            &lt;-gitignore文件，用于git上传时使用</span><br><span class="line"> ├_config.yml            &lt;-博客主配置文件</span><br><span class="line"> ├db.json            &lt;-source解析文件</span><br><span class="line"> ├package.json            &lt;-项目所需模块项目的配置信息</span><br><span class="line"> └package-lock.json        &lt;-项目所需模块项目的配置信息</span><br></pre></td></tr></table></figure><h2 id="预览"><a href="#预览" class="headerlink" title="预览"></a>预览</h2><p>输入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><blockquote><p>如果提示不存在此指令，请输入以下指令安装<br> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm i hexo-server</span><br></pre></td></tr></table></figure><br>然后打开浏览器，输入<code>http://localhost:4000</code>，即可预览博客的样子。</p></blockquote><p>如果要关闭，按 Ctrl+C 即可关闭。</p><blockquote><p>如果你打开此地址看不到你的博客，存在一种情况是你安装的软件（例如福昕PDF阅读器）占用了你的4000端口，此时应该切换端口，例如5000。此时应该输入下方指令切换。<br> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server -p 5000</span><br></pre></td></tr></table></figure></p></blockquote><h1 id="部署"><a href="#部署" class="headerlink" title="部署"></a>部署</h1><h2 id="安装插件"><a href="#安装插件" class="headerlink" title="安装插件"></a>安装插件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure><h2 id="传到平台"><a href="#传到平台" class="headerlink" title="传到平台"></a>传到平台</h2><p>下面推荐几个平台</p><ul><li><a href="https://github.com/">GitHub</a>（强力推荐）<ul><li>优点：平台成立较早，设施完善，有微软收购的支持，全球的开发者均在此</li><li>缺点：主语言为英文，且国内访问较慢。</li></ul></li><li><a href="https://gitee.com/">Gitee</a><ul><li>优点：与GitHub类似，但国内访问速度快，而且支持GitHub项目直接导入</li><li>缺点：设施不太完善。</li></ul></li></ul><h3 id="提前说明"><a href="#提前说明" class="headerlink" title="提前说明"></a>提前说明</h3><p>在下文中：</p><ul><li>yourname指你注册网站的用户名</li><li>youremail指你注册网站的邮箱</li></ul><h3 id="GitHub"><a href="#GitHub" class="headerlink" title="GitHub"></a>GitHub</h3><p>注册账号，然后创建一个repo，名字为<code>yourname.github.io</code><br>在<code>_config.yml</code>里，编辑末尾的配置</p><figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">deploy:</span></span><br><span class="line"><span class="symbol">  type:</span> git</span><br><span class="line"><span class="symbol">  repo:</span> git@github.com:yourname/yourname.github.io.git</span><br><span class="line"><span class="symbol">  branch:</span> master</span><br></pre></td></tr></table></figure><p>在文件夹下键入命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -t rsa -C <span class="string">&quot;youremail&quot;</span></span><br></pre></td></tr></table></figure><p>然后连敲几下回车，然后打开<code>C:\Users\你电脑的用户名</code>，找到<code>.ssh</code>文件夹，用编辑器打开<code>id_rsa.pub</code>文件，然后复制里面的所有文本。</p><p>在GitHub的Settings里，找到SSH keys，右上角新建一个SSH key，然后在Key那个大框中粘贴你复制的东西，随便起一个名字然后点下方的添加。</p><h3 id="Gitee"><a href="#Gitee" class="headerlink" title="Gitee"></a>Gitee</h3><p>注册账号，然后创建一个repo，名字为<code>yourname</code><br>在<code>_config.yml</code>里，编辑末尾的配置</p><figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">deploy:</span></span><br><span class="line"><span class="symbol">  type:</span> git</span><br><span class="line"><span class="symbol">  repo:</span> git@gitee.com:yourname/yourname.git</span><br><span class="line"><span class="symbol">  branch:</span> master</span><br></pre></td></tr></table></figure><p>在文件夹下键入命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -t rsa -C <span class="string">&quot;youremail&quot;</span></span><br></pre></td></tr></table></figure><p>然后连敲几下回车，然后打开<code>C:\Users\你电脑的用户名</code>，找到<code>.ssh</code>文件夹，用编辑器打开<code>id_rsa.pub</code>文件，然后复制里面的所有文本。</p><p>在Gitee的设置里，找到SSH keys，新建一个SSH key，然后在Key那个大框中粘贴你复制的东西，随便起一个名字然后点下方的添加。</p><h3 id="多Git账户"><a href="#多Git账户" class="headerlink" title="多Git账户"></a>多Git账户</h3><p>生成多个key，即在执行命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -t rsa -C <span class="string">&quot;youremail&quot;</span></span><br></pre></td></tr></table></figure><p>后的第一步将名字改为<code>id_rsa-github.pub</code>,<code>id_rsa-gitee.pub</code>，然后在<code>.ssh</code>文件夹下新建一个<code>config</code>文件。在文件内粘贴并修改以下内容</p><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置github.com</span></span><br><span class="line">Host github.com                 </span><br><span class="line">    HostName github.com         </span><br><span class="line">    IdentityFile ~\\.ssh\\id_rsa-github</span><br><span class="line">    PreferredAuthentications publickey</span><br><span class="line">    <span class="keyword">User</span> <span class="title">yourname-github</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置gitee.com                 </span></span><br><span class="line">Host gitee.com                  </span><br><span class="line">    HostName gitee.com</span><br><span class="line">    IdentityFile ~\\.ssh\\id_rsa-gitee</span><br><span class="line">    PreferredAuthentications publickey</span><br><span class="line">    <span class="keyword">User</span> <span class="title">yourname-gitee</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>即可</p><h2 id="三步部署"><a href="#三步部署" class="headerlink" title="三步部署"></a>三步部署</h2><p>按照上述配置好后，每次修改博客就只用执行下面三行指令就行了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ hexo clean</span><br><span class="line">$ hexo generate</span><br><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><blockquote><p>第一次执行之前需要执行下方两行指令设置个人信息<br> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git config --global user.name <span class="string">&quot;yourname&quot;</span></span><br><span class="line">$ git config --global user.email <span class="string">&quot;youremail&quot;</span></span><br></pre></td></tr></table></figure><br>第一次执行时会询问你是否使用ssh（此时在弹出的框中输入yes即可）之类的操作<br>从第二次起就真的只用这三行了。</p></blockquote><h2 id="访问你的博客"><a href="#访问你的博客" class="headerlink" title="访问你的博客"></a>访问你的博客</h2><h3 id="GitHub-1"><a href="#GitHub-1" class="headerlink" title="GitHub"></a>GitHub</h3><p>在repo的Settings里向下翻到GitHub Pages，将 <code>None</code> 改为 <code>master branch</code> 。<br>然后就可以访问<a href="https://yourname.github.io/">https://yourname.github.io/</a></p><h3 id="Gitee-1"><a href="#Gitee-1" class="headerlink" title="Gitee"></a>Gitee</h3><p>在repo的服务下拉菜单点Gitee Pages，部署分支选择<code>master</code>，然后点击<code>启动</code>。<br>然后就可以访问<a href="https://yourname.gitee.io/">https://yourname.gitee.io/</a>  </p><h1 id="设置博客"><a href="#设置博客" class="headerlink" title="设置博客"></a>设置博客</h1><h2 id="博客基本配置"><a href="#博客基本配置" class="headerlink" title="博客基本配置"></a>博客基本配置</h2><p>你可以参照<a href="https://hexo.io/zh-cn/docs/">Hexo官方文档</a>配置，也可以参照以下信息配置</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Site</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">标题</span></span><br><span class="line"><span class="attr">subtitle:</span> <span class="string">副标题</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">描述</span></span><br><span class="line"><span class="attr">keywords:</span> <span class="string">关键词</span></span><br><span class="line"><span class="attr">author:</span> <span class="string">作者</span></span><br><span class="line"><span class="attr">language:</span> <span class="string">zh-CN</span></span><br><span class="line"><span class="attr">timezone:</span> <span class="string">Asia/Shanghai</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># URL</span></span><br><span class="line"><span class="comment">## If your site is put in a subdirectory, set url as &#x27;http://yoursite.com/child&#x27; and root as &#x27;/child/&#x27;</span></span><br><span class="line"><span class="attr">url:</span> <span class="string">访问你博客的地址</span></span><br><span class="line"><span class="attr">root:</span> <span class="string">/</span></span><br><span class="line"><span class="attr">permalink:</span> <span class="string">:year/:month/:day/:title/</span></span><br><span class="line"><span class="attr">permalink_defaults:</span></span><br></pre></td></tr></table></figure><h2 id="写博客"><a href="#写博客" class="headerlink" title="写博客"></a>写博客</h2><p>你需要使用Markdown格式编辑博客  </p><p>你可以使用指令创建一篇写好基本信息的博客然后修改</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new 博客标题</span><br></pre></td></tr></table></figure><p>也可以在_post文件夹下新建一个<code>.md</code>文件，并在开头写上</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">文章标题</span></span><br><span class="line"><span class="attr">date:</span> <span class="string">20XX-XX-XX</span> <span class="string">XX:XX:XX</span></span><br><span class="line"><span class="attr">tags:</span> </span><br><span class="line">  <span class="bullet">-</span> <span class="string">标签</span></span><br><span class="line"><span class="attr">categories:</span> </span><br><span class="line">  <span class="bullet">-</span> <span class="string">分类</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><p>然后在下面写正文部分。</p><blockquote><p>当以上文字存在部分符号不合法时会出现错误，建议加上<code>&quot;&quot;</code>号分割前后，例如：<code>title: &quot;标题[1]&quot;</code><br>如果出现渲染错误，比如上面的内容出现在了文章开头而不是被隐藏，请检查文章的格式是否为Windows(CR LF)；<br>如果出现中文乱码，比如出现了 <code>˖Ԗ&#125;ёڷޯ</code> 或 <code>鎵嬫寔涓ゆ妸妫嶆枻閾?</code> 这种乱码，请检查文章的编码是否为UTF-8；<br><img src="/pic/Blog-Hexo06.png"></p></blockquote><h2 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h2><p>有很多非常好的主题，由于主题数量庞大且编写风格不一，所以无法在这里为每位读者所喜爱的主题写建站教程。<br>这里只介绍Vexo即我使用的主题的相关配置。</p><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>大部分主题可以在GitHub上找到，找到后通过</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git <span class="built_in">clone</span> https://github.com/作者/hexo-theme-主题.git themes/主题</span><br></pre></td></tr></table></figure><p>这条指令下载到主题文件夹中，然后在博客目录下的<code>_config.yml</code>中写上</p><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">theme:</span> 主题</span><br></pre></td></tr></table></figure><h3 id="Vexo"><a href="#Vexo" class="headerlink" title="Vexo"></a>Vexo</h3><p>作者：<a href="https://github.com/yanm1ng">yanm1ng</a><br>主题地址：<a href="https://github.com/yanm1ng/hexo-theme-vexo">hexo-theme-vexo</a></p><h4 id="安装-1"><a href="#安装-1" class="headerlink" title="安装"></a>安装</h4><p>可以通过</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git <span class="built_in">clone</span> https://github.com/yanm1ng/hexo-theme-vexo.git themes/vexo</span><br><span class="line">$ <span class="built_in">cp</span> -R themes/vexo/_source/* <span class="built_in">source</span>/</span><br></pre></td></tr></table></figure><p>同时修改主目录下的<code>_config.yml</code></p><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">theme:</span> vexo</span><br></pre></td></tr></table></figure><p>完成初步的安装</p><h4 id="文章"><a href="#文章" class="headerlink" title="文章"></a>文章</h4><p>事实上，在每篇文章开头的<em>front-matter</em>都这么写。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">标题</span></span><br><span class="line"><span class="attr">date:</span> <span class="string">20XX-XX-XX</span> <span class="string">XX:XX:XX</span></span><br><span class="line"><span class="attr">banner:</span> <span class="string">图片.扩展名</span></span><br><span class="line"><span class="attr">tags:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">标签1</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">标签2</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><h4 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h4><p>在主题的<code>_config.yml</code>里，有这些东西，可以看我的注释配置你的</p><figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">author:</span> 作者</span><br><span class="line"><span class="symbol">description:</span> 描述</span><br><span class="line"><span class="symbol">keyword:</span> 关键词</span><br><span class="line"><span class="symbol">favicon:</span>      <span class="meta">#图标，默认没有</span></span><br><span class="line"><span class="symbol"></span></span><br><span class="line"><span class="symbol">excerpt_link:</span> Read more  <span class="meta">#查看更多的提示文字</span></span><br><span class="line"><span class="symbol"></span></span><br><span class="line"><span class="symbol">menu:</span></span><br><span class="line"> 主页: /</span><br><span class="line"> 标签: <span class="keyword">/tags/</span></span><br><span class="line"> 归档: <span class="keyword">/archives/</span></span><br><span class="line"> 项目: <span class="keyword">/project/</span></span><br><span class="line"> 关于: <span class="keyword">/about/</span></span><br></pre></td></tr></table></figure><p>然后翻到最下面</p><figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">about:</span> </span><br><span class="line"><span class="symbol">  banner:</span> 图片.扩展名</span><br><span class="line"><span class="symbol">  avatar:</span> 头像地址</span><br><span class="line"><span class="symbol">  description:</span> 描述</span><br><span class="line"><span class="symbol">  weibo_username:</span> 微博用户名</span><br><span class="line"><span class="symbol">  twitter_username:</span> Twitter用户名</span><br><span class="line"><span class="symbol">  github_username:</span> GitHub用户名</span><br><span class="line"><span class="symbol">  zhihu_username:</span> 知乎用户名</span><br><span class="line"><span class="symbol">  douban_username:</span> 豆瓣用户名</span><br><span class="line"><span class="symbol">  linkedin_username:</span> 领英用户名</span><br><span class="line"><span class="meta"># 没有的话不填就行了</span></span><br></pre></td></tr></table></figure><h4 id="自定义图片"><a href="#自定义图片" class="headerlink" title="自定义图片"></a>自定义图片</h4><p>打开主题下的<code>/source/css/images</code>文件夹，<strong>替换</strong> <code>logo.png</code> 、 <code>alipay.jpg</code> 和 ‘wechat.jpg’ 。</p><h1 id="插件"><a href="#插件" class="headerlink" title="插件"></a>插件</h1><h2 id="评论系统"><a href="#评论系统" class="headerlink" title="评论系统"></a>评论系统</h2><p>有很多很优秀的评论插件，例如Gitment、Gitalk、Valine、Disqus、Uyan等。<br>由于本人使用的是Gitment，所以只会介绍Gitment。。。  </p><blockquote><p>建议直接使用主题所附带的评论系统，这样一般是兼容页面的既好用又好看。</p></blockquote><h3 id="Vexo下的Gitment"><a href="#Vexo下的Gitment" class="headerlink" title="Vexo下的Gitment"></a>Vexo下的Gitment</h3><blockquote><p>Gitment利用GitHub上repo中的Issues功能完成评论存储的功能。<br>注意，Gitment只支持GitHub上的repo，如果你要利用Coding或者Gitee的功能，可以尝试DIY。</p></blockquote><p>请<a href="https://github.com/settings/applications/new">点这里</a>打开GitHub的OAuth应用创建页面，输入博客名字、主页地址、描述和调用地址。<strong>请注意：主页地址和调用地址都要填你的博客的地址。</strong><br><img src="/pic/Blog-Hexo07.png"></p><p>创建完后，复制Client ID和Client Secret的信息。</p><p>请点开Vexo主题下的&#96;_config.yml’，将下面对应的行修改成这样</p><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">comment:</span> gitment</span><br></pre></td></tr></table></figure><p>然后在下方对应的部分</p><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># gitment config</span></span><br><span class="line"><span class="symbol">gitment_owner:</span> yourname</span><br><span class="line"><span class="symbol">gitment_repo:</span> 博客地址</span><br><span class="line"><span class="symbol">gitment_oauth_id:</span> 复制的Client ID</span><br><span class="line"><span class="symbol">gitment_oauth_secret:</span> 复制的Client Secret</span><br></pre></td></tr></table></figure><p>即可完成配置</p><blockquote><p>请注意，每篇博客都需要博主手动初始化，否则会显示Error。<br><img src="/pic/Blog-Hexo08.png"><br><img src="/pic/Blog-Hexo09.png">  </p></blockquote><h2 id="置顶操作"><a href="#置顶操作" class="headerlink" title="置顶操作"></a>置顶操作</h2><p>打开博客目录下的<code>.\node_modules\hexo-generator-index\lib</code>文件夹，将<code>generator.js</code>文件内容替换为下面的代码</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&#x27;use strict&#x27;</span>;</span><br><span class="line"><span class="keyword">var</span> pagination = <span class="built_in">require</span>(<span class="string">&#x27;hexo-pagination&#x27;</span>);</span><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = <span class="keyword">function</span>(<span class="params">locals</span>)&#123;</span><br><span class="line">  <span class="keyword">var</span> config = <span class="variable language_">this</span>.<span class="property">config</span>;</span><br><span class="line">  <span class="keyword">var</span> posts = locals.<span class="property">posts</span>;</span><br><span class="line">    posts.<span class="property">data</span> = posts.<span class="property">data</span>.<span class="title function_">sort</span>(<span class="keyword">function</span>(<span class="params">a, b</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span>(a.<span class="property">top</span> &amp;&amp; b.<span class="property">top</span>) &#123; <span class="comment">// 两篇文章top都有定义</span></span><br><span class="line">            <span class="keyword">if</span>(a.<span class="property">top</span> == b.<span class="property">top</span>) <span class="keyword">return</span> b.<span class="property">date</span> - a.<span class="property">date</span>; <span class="comment">// 若top值一样则按照文章日期降序排</span></span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">return</span> b.<span class="property">top</span> - a.<span class="property">top</span>; <span class="comment">// 否则按照top值降序排</span></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span>(a.<span class="property">top</span> &amp;&amp; !b.<span class="property">top</span>) &#123; <span class="comment">// 以下是只有一篇文章top有定义，那么将有top的排在前面（这里用异或操作居然不行233）</span></span><br><span class="line">            <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span>(!a.<span class="property">top</span> &amp;&amp; b.<span class="property">top</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">return</span> b.<span class="property">date</span> - a.<span class="property">date</span>; <span class="comment">// 都没定义按照文章日期降序排</span></span><br><span class="line">    &#125;);</span><br><span class="line">  <span class="keyword">var</span> paginationDir = config.<span class="property">pagination_dir</span> || <span class="string">&#x27;page&#x27;</span>;</span><br><span class="line">  <span class="keyword">return</span> <span class="title function_">pagination</span>(<span class="string">&#x27;&#x27;</span>, posts, &#123;</span><br><span class="line">    <span class="attr">perPage</span>: config.<span class="property">index_generator</span>.<span class="property">per_page</span>,</span><br><span class="line">    <span class="attr">layout</span>: [<span class="string">&#x27;index&#x27;</span>, <span class="string">&#x27;archive&#x27;</span>],</span><br><span class="line">    <span class="attr">format</span>: paginationDir + <span class="string">&#x27;/%d/&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">      <span class="attr">__index</span>: <span class="literal">true</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>在博客开头的部分定义top值</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">top:</span> <span class="string">数值</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><blockquote><p>说明：top没填时默认为0，置顶顺序为top值降序排列，top相等时按日期排序。</p></blockquote><h1 id="自动部署"><a href="#自动部署" class="headerlink" title="自动部署"></a>自动部署</h1><p>自动部署需要一个网站——Travis CI，这个网站分为 <a href="https://travis-ci.org/">PublicRepo版</a> 和 <a href="https://travis-ci.com/">PrivateRepo版</a>，但是只支持GitHub上的项目。  </p><blockquote><p>对于自动部署博客，我的做法需要在上传到GitHub的文件里写上你Github的密码，因此强烈建议各位新建一个Private项目。</p></blockquote><p>我们新一个项目（当然也可以在原repo上新建一个分支），然后<a href="https://github.com/settings/tokens">点这里</a>生成一个AccessToken（建议把除了delete_repo以外的权限全部开启），然后把出来的一串值复制。</p><p>打开Travis CI，点开你新建的项目，在Environment Variables里，在Value处粘贴那串值，名字随意，然后点击Add。<br><img src="/pic/Blog-Hexo10.png"></p><p>返回Hexo的文件目录，执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git init</span><br><span class="line">$ git remote add origin https://github.com/yourname/repo的名字.git</span><br></pre></td></tr></table></figure><p>使用命令行新建一个<code>.travis.yml</code>文件</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd.&gt;.travis.yml</span><br></pre></td></tr></table></figure><p><img src="/pic/Blog-Hexo11.png"></p><p>粘贴如下内容并修改后保存</p><figure class="highlight nestedtext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">language</span><span class="punctuation">:</span> <span class="string">node_js</span></span><br><span class="line"><span class="attribute">node_js</span><span class="punctuation">:</span> <span class="string">stable</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># S: Build Lifecycle</span></span><br><span class="line"><span class="attribute">install</span><span class="punctuation">:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">npm install</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#before_script:</span></span><br><span class="line"> <span class="comment"># - npm install -g gulp</span></span><br><span class="line"></span><br><span class="line"><span class="attribute">script</span><span class="punctuation">:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">hexo g</span></span><br><span class="line"></span><br><span class="line"><span class="attribute">after_script</span><span class="punctuation">:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">cd ./public</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">git init</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">git config user.name &quot;yourname&quot;</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">git config user.email &quot;youremail&quot;</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">git add .</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">git commit -m &quot;Site Updated&quot;</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">git push --force --quiet &quot;https://$&#123;GH_TOKEN&#125;@$&#123;GH_REF&#125;&quot; master:master</span></span><br><span class="line"><span class="comment"># E: Build LifeCycle</span></span><br><span class="line"></span><br><span class="line"><span class="attribute">branches</span><span class="punctuation">:</span></span><br><span class="line">  <span class="attribute">only</span><span class="punctuation">:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">master</span></span><br><span class="line"><span class="attribute">env</span><span class="punctuation">:</span></span><br><span class="line"> <span class="attribute">global</span><span class="punctuation">:</span></span><br><span class="line">   <span class="bullet">-</span> <span class="string">GH_REF: github.com/yourname/repo的名字.git</span></span><br><span class="line">   <span class="bullet">-</span> <span class="string">GH_TOKEN: yourname:GitHub密码</span></span><br></pre></td></tr></table></figure><p>这样处理好后执行以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git add .</span><br><span class="line">$ git commit -m <span class="string">&quot;Site Updated&quot;</span></span><br><span class="line">$ git push origin master</span><br></pre></td></tr></table></figure><p>当显示完成时，打开Travis，如果显示build passing，则说明正常（如果网站还未更新、显示build failing等，可以检查下配置）。</p><blockquote><p>状态：<br><img src="/pic/passing.svg" alt="passing"><br><img src="/pic/failing.svg" alt="failing"><br><img src="/pic/error.svg" alt="error"><br><img src="/pic/unknown.svg" alt="unknown"></p></blockquote><p>这样就配置好了。</p><h1 id="补充说明"><a href="#补充说明" class="headerlink" title="补充说明"></a>补充说明</h1><p>在安装时如果没有选中notepad++，也可以在后来执行以下命令改为notepad++</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git config --global core.editor notepad++</span><br></pre></td></tr></table></figure><p>hexo的很多命令都可以简写<br>比如</p><ul><li><code>hexo server</code>-&gt;<code>hexo s</code></li><li><code>hexo generate</code>-&gt;<code>hexo g</code></li><li><code>hexo deploy</code>-&gt;<code>hexo d</code></li></ul><p>但是由于c开头的指令不止一个，所以clean无法简写为c。</p><p>使用Gitment时如果想使用Coding、Gitee等地方的Pages，可以考虑只使用GitHub的repo当一个评论仓库，就可以利用其它平台的Pages了。</p><p>自动部署系统Travis CI虽然只支持GitHub，但是我们可以只利用GitHub作源码仓库，把Pages的仓库利用其它平台存储，做法是修改<code>.travis.yml</code>中的最后的git指令。</p><p>执行时如果出现错误：fatal: remote origin already exists，则执行以下语句：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git remote <span class="built_in">rm</span> origin</span><br></pre></td></tr></table></figure><p>再执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git remote add origin https://github.com/yourname/repo的名字.git</span><br></pre></td></tr></table></figure><p>如果出现错误failed to push som refs to…….，则执行以下语句，先把远程服务器github上面的文件拉先来，再push 上去：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git pull origin master</span><br></pre></td></tr></table></figure><p>npm切换为淘宝源</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ npm install -g cnpm --registry=https://registry.npm.taobao.org</span><br><span class="line">$ npm config <span class="built_in">set</span> registry https://registry.npm.taobao.org</span><br></pre></td></tr></table></figure><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="Hexo博客" scheme="https://www.petermatt.xin/tags/Hexo%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>再见，极域！</title>
    <link href="https://www.petermatt.xin/blog/Goodbye-Top-Domain/"/>
    <id>https://www.petermatt.xin/blog/Goodbye-Top-Domain/</id>
    <published>2019-01-29T12:14:57.000Z</published>
    <updated>2025-05-14T14:53:44.418Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="0x00-引言"><a href="#0x00-引言" class="headerlink" title="0x00 引言"></a>0x00 引言</h1><p>作为学生党的我们，总想在微机课上跨越老师的控制走向那万千互联网，可这时一款名为极域的软件就阻挡了我们，我们的电脑屏幕竟然在这款软件的监控之下，而且更气的是，当我们打开了任务管理器，试图结束掉它时，它提示我们</p><p><img src="/pic/GBTD1.png" alt="拒绝访问"><br>拒绝访问</p><p>如果说我能直接结束掉它也行，但是这<strong>拒绝访问</strong>四个字激怒了我，作为官封的学校机房管理员，我简直无法容忍。</p><h1 id="0x01-暴力出奇迹"><a href="#0x01-暴力出奇迹" class="headerlink" title="0x01 暴力出奇迹"></a>0x01 暴力出奇迹</h1><p>有一个神奇的程序，它在或不在Windows中，都不影响人们的日常使用。但是，它被称为Windows下的大杀器，那就是 <strong>ntsd</strong> 。  </p><p>我们在命令行里输入</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ntsd -c q -pn StudentMain.exe</span><br></pre></td></tr></table></figure><p><img src="/pic/GBTD2.png"></p><p>我嘞个乖乖，这个暴力工具一上，直接秒掉啊有木有</p><h1 id="0x02-暴力的优化"><a href="#0x02-暴力的优化" class="headerlink" title="0x02 暴力的优化"></a>0x02 暴力的优化</h1><p>我们按Win+R，输入register，打开注册表编辑器</p><p>打开下面两个中你找得到的那一个</p><figure class="highlight moonscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">计算机\HKEY_LOCAL_MACHINE\SOFTWARE\TopDomain\e-Learning Class\Student</span><br><span class="line">计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\TopDomain\e-Learning Class\Student</span><br></pre></td></tr></table></figure><p><img src="/pic/GBTD3.png"></p><p>找到 PreventKill ，并双击打开将值从1改为0，然后点选确定保存。<br><img src="/pic/GBTD4.png"></p><p>这时候我们打开任务管理器，尝试结束掉它<br><img src="/pic/GBTD1.png"><br>不好意思啊，修改了注册表后，我们需要关闭程序再打开来让它重新加载各项数据。。。</p><p>等下，我们还是待暴力解决啊。。。</p><p>不过这样解决后，我们就可以用任务管理器解决它了！</p><h1 id="0x03-简单部分分"><a href="#0x03-简单部分分" class="headerlink" title="0x03 简单部分分"></a>0x03 简单部分分</h1><p>我们还是打开注册表编辑器，打开下面两个中你找得到的那一个</p><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">计算机<span class="string">\HKEY_LOCAL_MACHINE\SOFTWARE\TopDomain\e-Learning</span> Class Standard<span class="string">\1.00</span></span><br><span class="line">计算机<span class="string">\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\TopDomain\e-Learning</span> Class Standard<span class="string">\1.00</span></span><br></pre></td></tr></table></figure><p><img src="/pic/GBTD5.png"></p><p>找到 UninstallPasswd ，查看它的值，发现为PasswdXXX，这样的文本，其中XXX就为学生端密码，在设置里填上XXX，就可以愉快地修改配置了。</p><p><img src="/pic/GBTD6.png"></p><p>（部分学生端的设置没有一些选项，这些只能通过修改注册表并重启学生端解决设置<del>（当然你能碰讲台上那个教师端更方便。。。）</del>）</p><h1 id="0x04-文艺的正解"><a href="#0x04-文艺的正解" class="headerlink" title="0x04 文艺的正解"></a>0x04 文艺的正解</h1><ul><li>Q：为什么我的注册表长这样，密码输入为 123456 或者 [123456] ，都不对呢？  </li><li>A：这个原因很简单，极域的公司又不是一帮傻子，当有学校反映学生可以找到密码的那一刻起，极域公司就加密了密码，然后就只会在注册表留下Passwd[123456]，无论你找格式改成什么都不对。。。</li></ul><p><img src="/pic/GBTD7.png"></p><p>这是极域2015V5.0及以上版本（也就是2.0以上版本）尤其是豪华版的加密机制，我们怎么解决这个问题呢？ </p><blockquote><p><strong>Warning!前方高能！</strong>请在有一定计算机方面知识储备后食用以下文本</p></blockquote><p>我们还是可以通过一款反汇编软件解决掉它—— ollydbg 。</p><p><img src="/pic/GBTD8.png"></p><p>我们打开它，点击File-&gt;Attach，找到StudentMain并附加进程。</p><p><img src="/pic/GBTD9.png"></p><p>按Ctrl+G跟随表达式00401000。</p><p><img src="/pic/GBTD10.png"></p><p><img src="/pic/GBTD11.png"></p><p>然后我们搜索字符串，搜到了两处 mythware_super_password ，分别在表达式00431137和0045240E位置。</p><p><img src="/pic/GBTD12.png"></p><p><img src="/pic/GBTD13.png"></p><p>然后我们按F2标记为程序断点。</p><p>然后我们在设置里瞎输入一串密码并点确定，发现学生端暂停了。</p><p><img src="/pic/GBTD14.png"></p><p>这时我们按F8单步运行学生端程序，当运行到表达式0045242A处时，发现密码就在后方显示 UNICODE “XXX” ，那么这个XXX就是学生端的密码了。</p><p><img src="/pic/GBTD15.png"></p><p>此时我们继续运行程序，然后File-&gt;Detach，接着关闭ollydbg，再次输入解锁密码即可进入设置页面，屡试不爽。</p><p><img src="/pic/GBTD6.png"></p><h1 id="0x05-一些学生端的梗"><a href="#0x05-一些学生端的梗" class="headerlink" title="0x05 一些学生端的梗"></a>0x05 一些学生端的梗</h1><ul><li><strong>重要的一点：</strong>我们修改本机IP地址，就不会受教师控制。缺点是容易导致IP地址冲突，而且新版本教师机搜学生机好像变快了，不过教师还是不知道你的新IP，它会看到有台新电脑而且你的没上线，在有人不在时稳得很。</li></ul><p>接着我们来看一些高端的操作</p><ol><li>万能的拔网线法</li></ol><ul><li>实用系数:★★★★★</li><li>危险系数:★★★★★</li><li>难度系数:☆☆☆☆☆</li><li>操作：无需细讲，大家都懂。</li><li>评价：<ul><li>一言不合把网线，稍等片刻便离线。</li><li>甚是危险之行为，老师必然会知道。</li></ul></li></ul><ol start="2"><li>获取管理员密码</li></ol><ul><li>实用系数:★★★★☆</li><li>危险系数:★★★☆☆</li><li>难度系数:★★★★☆</li><li>操作：已在上文提到。</li><li>评价：<ul><li>拿到密码无大用，卸载删除均还原。</li><li>看到防删进程卡，一怒之下输密码。</li></ul></li></ul><ol start="3"><li>删除进程大法好</li></ol><ul><li>实用系数:★★★☆☆</li><li>危险系数:★★☆☆☆</li><li>难度系数:★★★☆☆</li><li>操作：基于大法2，可以使用ntsd或者具有同样或略低级的杀伤性程序。</li><li>评价：<ul><li>删除进程真是爽，教师监控看不了。</li><li>万一没有大杀器，完蛋，那是真凉。</li></ul></li></ul><ol start="4"><li>召唤防火墙大法</li></ol><ul><li>实用系数:★☆☆☆☆</li><li>危险系数:★★★★★</li><li>难度系数:★★☆☆☆</li><li>操作：<ul><li>打开控制面板–&gt;Windows防火墙–&gt;例外–&gt;找到“StudentMain.exe”删除</li><li>返回常规–&gt;选择“启动防火墙–&gt;勾选”不允许例外”</li><li>同理，我们还经验禁用网卡、删网络进程，原理都是一样的</li></ul></li><li>评价：<ul><li>禁这不如把线爽，同桌妹子装逼强。</li><li>要是老师突然来，形象瞬间跌到爆。</li></ul></li></ul><ol start="5"><li>玄学智能ABC法</li></ol><ul><li>实用系数:★★☆☆☆</li><li>危险系数:★☆☆☆☆</li><li>难度系数:★☆☆☆☆</li><li>操作：<ul><li>智能ABC是很老很老的输入法<del>，装机的大叔一般都很恋旧，都会装上的</del>。</li><li>然而智能ABC有个算不上漏洞的漏洞，依次输入”v”+”↑”+”del”+”enter”可以刷新屏幕。</li><li>对于早些版本的极域电子教室，可以直接回到屏幕，且被控端还是开着的，老师一点都不知道。</li><li>如果你机子的版本比较老，不妨试试。</li></ul></li><li>评价：<ul><li>输入法是真的玄，怀旧装机也很闲。</li><li>漏洞出自老人手，极域这下真的愁。</li></ul></li></ul><ol start="6"><li>最小化屏幕大法</li></ol><ul><li>实用系数:★★☆☆☆</li><li>危险系数:★☆☆☆☆</li><li>难度系数:★★☆☆☆</li><li>操作：<ul><li>和上面的智能ABC法异曲同工。</li><li>有些版本的电子教室默认开启可以最小化屏幕的功能。</li><li>这时候我们输入”q”+”ctrl”就可以回到桌面，老师当然不知道的。</li></ul></li><li>评价：<ul><li>异曲同工真的妙，老师完全不知道。</li><li>要说这是因为啥，漏洞太大还要查。</li></ul></li></ul><ol start="7"><li>鸟瞰图卡出大法</li></ol><ul><li>实用系数:★☆☆☆☆</li><li>危险系数:★☆☆☆☆</li><li>难度系数:★★☆☆☆</li><li>操作：<ul><li>我也不知道问什么会发现这个东西。。。</li><li>那时我想起拖动窗口，快速滑动即可最小化所有窗口返回桌面。</li><li>毕竟实在闲得慌，手痒痒点开了鸟瞰图模式</li><li>来回滑动，没用……</li><li>无聊的我点击旋转按钮，左转、右转、越按越快、咔嚓、跳到桌面了，啊哈……</li></ul></li><li>评价：<ul><li>跟着我左转右转，形成一个快动作。</li><li>优雅地回到桌面，需要一些神操作。</li></ul></li></ul><ol start="8"><li>编程法</li></ol><ul><li>实用系数:?????</li><li>危险系数:?????</li><li>难度系数:?????</li><li>操作：<ul><li>有一篇文章，有神犇用C语言编了个针对极域电子教室的小程序，甚至可以反控教师端，有兴趣的童鞋可以去找找。。。</li></ul></li><li>评价：<ul><li>最强王者写程序，教师都要抖三抖。</li><li>万一惹了他生气，直播教师被反击。</li></ul></li></ul><ol start="9"><li>总结</li></ol><ul><li>是个程序漏洞多，只是看你怎么说。</li><li>物理方式很暴力，鼠标操作更牛气。</li><li>程序暴力也神气，只是附加显大气。</li><li>防火大法装逼爽，玄学软件治三甲。</li><li>鸟瞰操作稳准狠，编程操作也牛逼。</li><li>俯仰不愧那天地，褒贬自有千秋种。</li></ul><h1 id="0x06-后记"><a href="#0x06-后记" class="headerlink" title="0x06 后记"></a>0x06 后记</h1><p>当我们学校仍然采用老版本的极域时，贺帅老师与我有过这样的对话：</p><ul><li>对话1：<ul><li>张：我把网线一把，你关了教师机也没用</li><li>贺：关闭教师机你就给我从教室里出去</li></ul></li><li>对话2：<ul><li>贺：我改了个密码</li><li>张：不就是xxx吗？</li><li>贺：那以后密码谁传的我就知道了</li><li>张：这么弱的东西是个会看百度经验的人都会吧喂</li><li>贺：……，赶紧给我上楼做题</li></ul></li></ul><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="科技" scheme="https://www.petermatt.xin/tags/%E7%A7%91%E6%8A%80/"/>
    
  </entry>
  
  <entry>
    <title>一些奇奇怪怪的计算机知识</title>
    <link href="https://www.petermatt.xin/blog/strange-computer-knowledge/"/>
    <id>https://www.petermatt.xin/blog/strange-computer-knowledge/</id>
    <published>2018-09-03T11:07:10.000Z</published>
    <updated>2023-10-14T12:11:57.372Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="时间复杂度符号"><a href="#时间复杂度符号" class="headerlink" title="时间复杂度符号"></a>时间复杂度符号</h1><ul><li>Θ，读音：theta、西塔；既是上界也是下界(tight)，等于的意思。</li><li>Ο，读音：big-oh、欧米可荣（大写）；表示上界(tightness unknown)，小于等于的意思。</li><li>ο，读音：small-oh、欧米可荣（小写）；表示上界(not tight)，小于的意思。</li><li>Ω，读音：big omega、欧米伽（大写）；表示下界(tightness unknown)，大于等于的意思。</li><li>ω，读音：small omega、欧米伽（小写）；表示下界(not tight)，大于的意思。</li></ul><p>Ο是渐进上界，Ω是渐进下界。Θ需同时满足大Ο和Ω，故称为确界（必须同时符合上界和下界）。Ο极其有用，因为它表示了最差性能。</p><h1 id="数字"><a href="#数字" class="headerlink" title="数字"></a>数字</h1><ul><li>1226563rd prime is 19260803</li><li><strong>1226564th prime is 19260817</strong></li><li>1226565th prime is 19260823</li><li>1240302nd prime is 19490963</li><li><strong>1240303rd prime is 19491001</strong></li><li>1240304th prime is 19491007</li><li>19260802nd prime is 359003321</li><li>19260803rd prime is 359003327</li><li>19260804th prime is 359003401</li><li>19260816th prime is 359003639</li><li><strong>19260817th prime is 359003647</strong></li><li>19260818th prime is 359003669</li><li>19260822nd prime is 359003737</li><li>19260823rd prime is 359003747</li><li>19260824th prime is 359003753</li><li>19490962nd prime is 363541751</li><li>19490963rd prime is 363541781</li><li>19490964th prime is 363541807</li><li>19491000th prime is 363542381</li><li><strong>19491001st prime is 363542383</strong></li><li>19491002nd prime is 363542411</li><li>19491006th prime is 363542461</li><li>19491007th prime is 363542477</li><li>19491008th prime is 363542503</li></ul><h1 id="编译错误？"><a href="#编译错误？" class="headerlink" title="编译错误？"></a>编译错误？</h1><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">fatal</span> <span class="literal">error</span>: XXX: No such file or directory <span class="comment">#include&lt;XXX&gt;</span><span class="regexp"></span></span><br><span class="line"><span class="regexp">^</span> compilation terminated.</span><br></pre></td></tr></table></figure><p>上述的编译错误是指编译器由于没有发现XXX这个库所以终止了编译，这时候需要检查编译终止的库文件名的拼写是否有问题。</p><figure class="highlight delphi"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">error: <span class="string">&#x27;XXX&#x27;</span> was <span class="keyword">not</span> declared <span class="keyword">in</span> this scope XXX<span class="comment">(***)</span>;</span><br><span class="line">^</span><br></pre></td></tr></table></figure><p>上述的编译错误是指编译器没有发现你定义的XXX这个函数，这时候需要检查你定义的函数名和使用时的是否一致。</p><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">error: </span>expected &#x27;,&#x27; or &#x27;;&#x27; before &#x27;XXX&#x27; XXX</span><br><span class="line">^</span><br></pre></td></tr></table></figure><p>上述的编译错误是指编译器在编译XXX和上一条语句是没有发现语句分隔符’,’和’;’，你需要检查上一条语句并添加分隔符。</p><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">error: </span>&#x27;XXX&#x27; was not declared in this scope ***</span><br><span class="line">^</span><br></pre></td></tr></table></figure><p>上述的编译错误是指编译器在编译<code>***</code>这条语句的时候没有发现其中的XXX代表什么含义，你需要检查这条语句是否写错或者XXX是否被正确地定义。</p><figure class="highlight scilab"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Can&#x27;t compile file: AAA.cpp: In <span class="function"><span class="keyword">function</span> &#x27;<span class="title">BBB</span>&#x27;:</span></span><br><span class="line">AAA.cpp:<span class="number">7</span>:<span class="number">20</span>: <span class="built_in">error</span>: expected <span class="string">&#x27;:&#x27;</span> before <span class="string">&#x27;;&#x27;</span> token</span><br><span class="line">CCC?DDD;:EEE;</span><br><span class="line">^</span><br><span class="line">AAA.cpp:<span class="number">7</span>:<span class="number">20</span>: <span class="built_in">error</span>: expected primary-expression before <span class="string">&#x27;;&#x27;</span> token</span><br><span class="line">AAA.cpp:<span class="number">7</span>:<span class="number">21</span>: <span class="built_in">error</span>: expected primary-expression before <span class="string">&#x27;:&#x27;</span> token</span><br><span class="line">CCC?DDD;:EEE;</span><br><span class="line">^</span><br></pre></td></tr></table></figure><p>这个错误是我这个大蒟蒻以前犯下的一个错误，这个错误是由于三目运算符的位置中不能有语句分隔符’,’和’;’。</p><figure class="highlight delphi"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">error: expected primary-expression before <span class="string">&#x27;XXX&#x27;</span> scanf<span class="comment">(***)</span>,XXX;</span><br><span class="line">^</span><br></pre></td></tr></table></figure><p>这个错误是因为scanf不能使用’,’分隔的关系。</p><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">error: </span>lvalue required as increment operand i=++j++;</span><br><span class="line">^</span><br></pre></td></tr></table></figure><p>这个错误真的是我当时不知道为啥脑子抽掉写的，我也不知道别的运算符使用错误是否会这样提示，但是++只能用在前或后不能同时用。</p><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">error: </span>expected unqualified-id before &#x27;,&#x27; token typename AAA,,BBB;</span><br><span class="line">^</span><br></pre></td></tr></table></figure><p>这个错误是因为定义类型的时候不能空一个。</p><figure class="highlight scilab"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">error</span>：conflicting declaration ‘<span class="built_in">typename</span> AAA[***]’ <span class="built_in">typename</span> AAA[***]; ^ note：previous declaration as ‘<span class="built_in">typename</span> AAA’ <span class="built_in">typename</span> AAA;</span><br></pre></td></tr></table></figure><p>这个错误的实质是AAA重复定义，然后会产生很多错误信息。</p><figure class="highlight vhdl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Can<span class="symbol">&#x27;t</span> compile <span class="keyword">file</span>: AAA.cpp:<span class="number">3</span>:<span class="number">1</span>: <span class="literal">error</span>: <span class="symbol">&#x27;XXX</span>&#x27; does <span class="keyword">not</span> name a <span class="keyword">type</span></span><br><span class="line">XXX BBB;</span><br><span class="line">^</span><br></pre></td></tr></table></figure><p>这是由于类型定义错误产生的错误。</p><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">error：<span class="type">name</span> lookup <span class="keyword">of</span> <span class="string">&#x27;i&#x27;</span> changed <span class="keyword">for</span> ISO <span class="string">&#x27;for&#x27;</span> scoping [-fpermissive] i ^</span><br><span class="line">note：<span class="keyword">if</span> you use ‘-fpermissive’ G++ will accept your code </span><br><span class="line"><span class="built_in">warning</span>：right operand <span class="keyword">of</span> comma <span class="keyword">operator</span> has <span class="keyword">no</span> effect [-Wunused-<span class="keyword">value</span>] i ^</span><br></pre></td></tr></table></figure><p>这是由于之前定义的局部变量被重新使用导致的，其本质是未定义。</p><p><em><strong>注：由于洛谷第4代评测机已经推出了中文编译信息，因此上帖可能暂时停止更新</strong></em></p><h1 id="缩写"><a href="#缩写" class="headerlink" title="缩写"></a>缩写</h1><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">cpp：c <span class="keyword">plus</span> <span class="keyword">plus</span> C++</span><br><span class="line">io(或I<span class="regexp">/O)：Input/</span>Output 输入输出</span><br><span class="line">std：standard 标准</span><br><span class="line"><span class="keyword">int</span>：integer 整型（在C++中也可定义为<span class="keyword">long</span>，其实质为<span class="keyword">long</span> <span class="keyword">int</span>）</span><br><span class="line">shrt：<span class="keyword">short</span> 短整型</span><br></pre></td></tr></table></figure><h1 id="数字-1"><a href="#数字-1" class="headerlink" title="数字"></a>数字</h1><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">2147483648</span>：<span class="number">2</span>的<span class="number">31</span>次方，其负数是int类型的数据最小值</span><br><span class="line"><span class="attribute">2147483647</span>：<span class="number">2</span>的<span class="number">31</span>次方减<span class="number">1</span>，是int类型的数据最大值</span><br><span class="line"><span class="attribute">536870911</span>：int数组下标乘积之和最大值</span><br><span class="line"><span class="attribute">33554432</span>：<span class="number">128</span>MB空间最大可开的int数</span><br></pre></td></tr></table></figure><h1 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h1><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">int <span class="built_in">isspace</span>(a)<span class="comment">//用于判断字符a是否为分隔符，这包括&#x27; &#x27;(32)、&#x27;\t&#x27;(9)、&#x27;\n&#x27;(10)、&#x27;\v&#x27;(11)、&#x27;\f&#x27;(12)和&#x27;\r&#x27;(13)</span></span><br><span class="line">int <span class="built_in">isprint</span>(a)<span class="comment">//用于判断字符a是否为可打印字符，这包括所有具有占位功能的字符</span></span><br><span class="line">int <span class="built_in">iscntrl</span>(a)<span class="comment">//用于判断字符a是否为控制字符，这除去了上文所述的可打印字符</span></span><br><span class="line">int <span class="built_in">isupper</span>(a)<span class="comment">//用于判断字符a是否为大写字母</span></span><br><span class="line">int <span class="built_in">islower</span>(a)<span class="comment">//用于判断字符a是否为小写字母</span></span><br><span class="line">int <span class="built_in">isalpha</span>(a)<span class="comment">//用于判断字符a是否为字母</span></span><br><span class="line">int <span class="built_in">isdigit</span>(a)<span class="comment">//用于判断字符a是否为数字</span></span><br><span class="line">int <span class="built_in">ispunct</span>(a)<span class="comment">//用于判断字符a是否为标点符号</span></span><br><span class="line">int <span class="built_in">isxdigit</span>(a)<span class="comment">//用于判断字符a是否为十六进制数字，这包括&#x27;0&#x27;(48)-&#x27;9&#x27;(57)、&#x27;a&#x27;(97)-&#x27;f&#x27;(102)和&#x27;A&#x27;(65)-&#x27;F&#x27;(70)</span></span><br><span class="line">int <span class="built_in">isalnum</span>(a)<span class="comment">//用于判断字符a是否为字母或数字</span></span><br><span class="line">int <span class="built_in">isgragh</span>(a)<span class="comment">//用于判断字符a是否为图形表示的字符，这包括上文所说的可打印字符中除去分隔符的部分</span></span><br><span class="line"><span class="comment">/*C++11警告*/</span>int <span class="built_in">blank</span>(a)<span class="comment">//用途同isspace</span></span><br><span class="line">int <span class="built_in">toupper</span>(a)<span class="comment">//当字符a是小写字母时,改为大写,其余情况不变</span></span><br><span class="line">int <span class="built_in">tolower</span>(a)<span class="comment">//当字符a是大写字母时,改为小写,其余情况不变</span></span><br></pre></td></tr></table></figure><h1 id="这一波优化我看着都怕"><a href="#这一波优化我看着都怕" class="headerlink" title="这一波优化我看着都怕"></a>这一波优化我看着都怕</h1><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(2)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(3)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;Ofast&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;inline&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fgcse&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fgcse-lm&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fipa-sra&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-ftree-pre&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-ftree-vrp&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fpeephole2&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-ffast-math&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fsched-spec&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;unroll-loops&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-falign-jumps&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-falign-loops&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-falign-labels&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fdevirtualize&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fcaller-saves&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fcrossjumping&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fthread-jumps&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-funroll-loops&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fwhole-program&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-freorder-blocks&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fschedule-insns&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;inline-functions&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-ftree-tail-merge&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fschedule-insns2&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fstrict-aliasing&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fstrict-overflow&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-falign-functions&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fcse-skip-blocks&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fcse-follow-jumps&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fsched-interblock&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fpartial-inlining&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;no-stack-protector&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-freorder-functions&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-findirect-inlining&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fhoist-adjacent-loads&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-frerun-cse-after-loop&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;inline-small-functions&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-finline-small-functions&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-ftree-switch-conversion&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-foptimize-sibling-calls&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fexpensive-optimizations&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-funsafe-loop-optimizations&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;inline-functions-called-once&quot;</span>)</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> GCC optimize(<span class="string">&quot;-fdelete-null-pointer-checks&quot;</span>)</span></span><br></pre></td></tr></table></figure><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="不知道什么东西" scheme="https://www.petermatt.xin/tags/%E4%B8%8D%E7%9F%A5%E9%81%93%E4%BB%80%E4%B9%88%E4%B8%9C%E8%A5%BF/"/>
    
  </entry>
  
  <entry>
    <title>【置顶】我和友链了解一下</title>
    <link href="https://www.petermatt.xin/blog/friend-links/"/>
    <id>https://www.petermatt.xin/blog/friend-links/</id>
    <published>2018-07-26T18:40:07.000Z</published>
    <updated>2026-04-13T09:18:19.145Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="我？"><a href="#我？" class="headerlink" title="我？"></a>我？</h2><p>张开昕（男，2002&#x2F;04&#x2F;20 — ），（经常使用WilliamPeterMatthew、Peter_Matthew作为用户名，）一个曾经的HA省OIer，一名大学本科在读生，喜爱计算机。。。<br><a href="https://www.petermatt.xin/">我的博客</a> <a href="https://www.petermatt.xin/atom.xml">RSS订阅</a>  </p><p><a href="http://sighttp.qq.com/authd?IDKEY=950ae6bebc382b5f992bb615a23334fb90cbfae4201b1473"><img src="/pic/qq_1.png" alt="与我进行QQ交谈"></a></p><p>Email: <a href="mailto:&#x63;&#111;&#x6e;&#116;&#97;&#99;&#116;&#x40;&#x70;&#101;&#116;&#x65;&#x72;&#x6d;&#97;&#x74;&#116;&#x2e;&#x78;&#x69;&#x6e;">&#x63;&#111;&#x6e;&#116;&#97;&#99;&#116;&#x40;&#x70;&#101;&#116;&#x65;&#x72;&#x6d;&#97;&#x74;&#116;&#x2e;&#x78;&#x69;&#x6e;</a></p><h2 id="小学同学"><a href="#小学同学" class="headerlink" title="小学同学"></a>小学同学</h2><h3 id="同届"><a href="#同届" class="headerlink" title="同届"></a>同届</h3><p><a href="https://hbai.site/">H. Bai（白颢阳）</a>  </p><h2 id="高中同学"><a href="#高中同学" class="headerlink" title="高中同学"></a>高中同学</h2><h3 id="同届-1"><a href="#同届-1" class="headerlink" title="同届"></a>同届</h3><p><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://syrsteven.github.io/">Steven7（尚元睿）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://utjb.gitee.io/">树下（柴靖博）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://www.luogu.org/blog/czj586240000/">陈子骏</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://mywife-kuroko.blog.luogu.org/">Shirai_Kuroko（李俊逸）</a><br><a href="https://www.luogu.com.cn/user/61819/article">asdfghjkl123（徐方舟）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://www.luogu.org/blog/Davids/">David_Liu（刘大维）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://micardi.github.io/">Micardi（陈旭坤）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://cs18.coding.me/">cs18（孙锦洋）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://francis_noco.coding.me/">(Francis_)noco（孙启皓）</a><br><a href="https://www.zybuluo.com/Bei-S/note/1381469">Yue-S（王子骏）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://www.luogu.org/blog/speedforce/">Ezio_0420（李明达）</a>  </p><h3 id="学长学姐"><a href="#学长学姐" class="headerlink" title="学长学姐"></a>学长学姐</h3><p><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://pb0207.github.io/">pb0207（彭博）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://tong-su.com/">Tong Su（苏同）</a><br><a href="https://zhangche0526.github.io/">zhangche0526（张澈）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://www.zybuluo.com/KirinBill/note/878927">KirinBill（徐文博）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://www.zybuluo.com/zzzc18/note/789450">zzzc18（张维璞）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://fancypei.github.io/">Fancy（裴一凡）</a>  </p><h3 id="学弟学妹"><a href="#学弟学妹" class="headerlink" title="学弟学妹"></a>学弟学妹</h3><p><a href="https://wa-automaton.github.io/">_WA自动机（许铎）</a><br><a href="https://www.luogu.com.cn/user/60150/article">Vectory（赵正阳）</a><br><a href="https://ctp314.github.io/">CTP_314（卢宸昊）</a><br><a href="https://www.luogu.com.cn/user/55692/article">快乐的ZTW（张泰玮）</a>  </p><h2 id="大学同学"><a href="#大学同学" class="headerlink" title="大学同学"></a>大学同学</h2><h3 id="同届-2"><a href="#同届-2" class="headerlink" title="同届"></a>同届</h3><p><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://dydong.ltd/">GIN-DYD（戴煜东）</a></p><h3 id="学长学姐-1"><a href="#学长学姐-1" class="headerlink" title="学长学姐"></a>学长学姐</h3><p><a href="https://www.zhwer.cn/">暖暖草果（郑皓文）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://www.th31nk.ltd/">th31nk（石冀）</a><br><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://www.meowers.ltd/">2hl0k3r（徐浩翔）</a>  </p><h2 id="几位OIer"><a href="#几位OIer" class="headerlink" title="几位OIer"></a>几位OIer</h2><p><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="http://www.koalast.xyz/">ST.Koala(赵圣元)</a>  </p><h2 id="几位老师"><a href="#几位老师" class="headerlink" title="几位老师"></a>几位老师</h2><p><a href="#" title="⚠该链接可能已经失效">⚠</a><a href="https://www.luogu.com.cn/user/12287">yxdgogogo（杨晓东）(Luogu Space)</a><br><a href="https://www.luogu.com.cn/user/35392">Danbo_1010（贺帅）(Luogu Space)</a>  </p><p><img src="/pic/0076VEu5ly1g09gtou8spj30u009eacd.jpg"></p><hr><blockquote><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_80x15.png" alt="知识共享许可协议"></a></p><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><img src="/pic/license/BY-NC-SA_88x31.png" alt="知识共享许可协议"></a></p><p>本作品采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可。</p></blockquote><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="友链" scheme="https://www.petermatt.xin/tags/%E5%8F%8B%E9%93%BE/"/>
    
    <category term="自我介绍" scheme="https://www.petermatt.xin/tags/%E8%87%AA%E6%88%91%E4%BB%8B%E7%BB%8D/"/>
    
  </entry>
  
  <entry>
    <title>Adobe Flash Player离线安装包</title>
    <link href="https://www.petermatt.xin/blog/AdobeFlashPlayerOfflineInstaller/"/>
    <id>https://www.petermatt.xin/blog/AdobeFlashPlayerOfflineInstaller/</id>
    <published>2018-07-22T07:50:23.000Z</published>
    <updated>2023-10-14T12:11:57.116Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" type="text&#x2F;css" href="https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="中国特供版-32-0-0-156"><a href="#中国特供版-32-0-0-156" class="headerlink" title="中国特供版 (32.0.0.156)"></a>中国特供版 (32.0.0.156)</h1><p>Flash Player NPAPI <a href="https://www.flash.cn/flashplayer/3200156/install_flash_player_cn.exe">https://www.flash.cn/flashplayer/3200156/install_flash_player_cn.exe</a></p><p>Flash Player PPAPI <a href="https://www.flash.cn/flashplayer/3200156/install_flash_player_ppapi_cn.exe">https://www.flash.cn/flashplayer/3200156/install_flash_player_ppapi_cn.exe</a></p><p>Flash Player ActiveX <a href="https://www.flash.cn/flashplayer/3200156/install_flash_player_ax_cn.exe">https://www.flash.cn/flashplayer/3200156/install_flash_player_ax_cn.exe</a></p><h1 id="国际版-exe-格式-32-0-0-156"><a href="#国际版-exe-格式-32-0-0-156" class="headerlink" title="国际版 (exe 格式, 32.0.0.156)"></a>国际版 (exe 格式, 32.0.0.156)</h1><p>Flash Player NPAPI <a href="https://fpdownload.macromedia.com/pub/flashplayer/latest/help/install_flash_player.exe">https://fpdownload.macromedia.com/pub/flashplayer/latest/help/install_flash_player.exe</a></p><p>Flash Player PPAPI <a href="https://fpdownload.macromedia.com/pub/flashplayer/latest/help/install_flash_player_ppapi.exe">https://fpdownload.macromedia.com/pub/flashplayer/latest/help/install_flash_player_ppapi.exe</a></p><p>Flash Player ActiveX <a href="https://fpdownload.macromedia.com/pub/flashplayer/latest/help/install_flash_player_ax.exe">https://fpdownload.macromedia.com/pub/flashplayer/latest/help/install_flash_player_ax.exe</a></p><p>Flash Player 独立播放器 (Standalone Projector) <a href="https://fpdownload.macromedia.com/pub/flashplayer/updaters/32/flashplayer_32_sa.exe">https://fpdownload.macromedia.com/pub/flashplayer/updaters/32/flashplayer_32_sa.exe</a></p><h1 id="国际版-Windows-Installer-格式-32-0-0-156"><a href="#国际版-Windows-Installer-格式-32-0-0-156" class="headerlink" title="国际版 (Windows Installer 格式, 32.0.0.156)"></a>国际版 (Windows Installer 格式, 32.0.0.156)</h1><p>Flash Player NPAPI <a href="https://fpdownload.adobe.com/get/flashplayer/distyfp/current/win/install_flash_player_32_plugin.msi">https://fpdownload.adobe.com/get/flashplayer/distyfp/current/win/install_flash_player_32_plugin.msi</a></p><p>Flash Player PPAPI <a href="https://fpdownload.adobe.com/get/flashplayer/distyfp/current/win/install_flash_player_32_ppapi.msi">https://fpdownload.adobe.com/get/flashplayer/distyfp/current/win/install_flash_player_32_ppapi.msi</a></p><p>Flash Player ActiveX <a href="https://fpdownload.adobe.com/get/flashplayer/distyfp/current/win/install_flash_player_32_active_x.msi">https://fpdownload.adobe.com/get/flashplayer/distyfp/current/win/install_flash_player_32_active_x.msi</a></p><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text&amp;#x2F;css&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-hint@0.3.1/dist/hexo-tag-hint.min.css&quot;&gt;&lt;link rel=&quot;st</summary>
      
    
    
    
    
    <category term="科技" scheme="https://www.petermatt.xin/tags/%E7%A7%91%E6%8A%80/"/>
    
  </entry>
  
</feed>
