Congratulations!

[Valid Atom 1.0] This is a valid Atom 1.0 feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://wevg.org/atom.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <feed xmlns="http://www.w3.org/2005/Atom">
  3.  <title>Vigorous Pro</title>
  4.  
  5.  
  6.  <link href="/atom.xml" rel="self"/>
  7.  
  8.  <link href="https://www.wevg.org/"/>
  9.  <updated>2024-04-20T03:45:31.205Z</updated>
  10.  <id>https://www.wevg.org/</id>
  11.  
  12.  <author>
  13.    <name>Edison Jwa</name>
  14.    
  15.  </author>
  16.  
  17.  <generator uri="https://hexo.io/">Hexo</generator>
  18.  
  19.  <entry>
  20.    <title>在 Windows 下使用监管模式保护 iOS 设备数据安全</title>
  21.    <link href="https://www.wevg.org/archives/protect-my-iphone-on-windows/"/>
  22.    <id>https://www.wevg.org/archives/protect-my-iphone-on-windows/</id>
  23.    <published>2022-11-27T10:48:16.000Z</published>
  24.    <updated>2024-04-20T03:45:31.205Z</updated>
  25.    
  26.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>本文将帮助您在 Windows 系统环境下,使用监管模式保护您的设备隐私安全,防止执法人员对您的设备进行取证。</p><span id="more"></span><h2 id="前言">前言</h2><p>如果您想要理解监管模式的工作原理,了解这个方式的优缺点,以及如何在 macOS 系统下使用监管模式,请参考我之前的文章 <a href="https://www.wevg.org/archives/pair-locking-your-iphone/">利用 Pair Locking 保证 iOS 设备数据安全</a></p><p>因为 checkm8 漏洞的存在,在实际的保护隐私的意义上,能也仅能保护 iPhone XR 及其以上的设备。</p><h2 id="span-style-color-db4d6d-需要注意的是:-span"><span style="color:#DB4D6D;">需要注意的是:</span></h2><ul><li>建议在执行前,先完整阅读一遍此文章,再决定是否进行此操作。</li><li>将手机设置成受监管状态会 <span style="color:#DB4D6D;"><strong>完全擦除手机</strong></span>,尽管擦除之后,您可以重新登录到您的 iCloud,所有同步过的设置,应用程序等项目都会再次出现。<br><span style="color:#DB4D6D;"><strong>但是,不能先对手机进行备份,再将手机设置成受监管状态,然后再恢复备份!!!(因为恢复备份的同时也会将设备还原到不受监管的状态)</strong></span><br><span style="color:#DB4D6D;">即便如此,仍然建议在备份后执行此操作!!!</span></li><li>任何能够使用您的笔记本电脑的人都可以通过配对获取您的数据,并且可以完全访问您手机上的所有内容(在通过有线的方式连接到笔记本电脑之后)。</li><li><span style="color:#DB4D6D;">如果您无法访问笔记本电脑或丢失配对信息,那么您也将无法连接手机。</span></li></ul><h2 id="监管您的-iphone">监管您的 iPhone</h2><ol><li>下载并安装 <a href="https://imazing.com/">iMazing 2</a><blockquote><p>使用<strong>监管</strong>功能需要在购买并激活 iMazing 2 后使用</p></blockquote></li><li>将您的设备与电脑通过 USB 连接</li><li>选择设备后,点击界面右侧的<strong>监管</strong>按钮后,点击 <code>下一步</code> 进入监督页面</li></ol><p><img src="/source/pair-locking-windows/imazing-mainpage.png" alt="Main Page"></p><ol start="4"><li><p>接下来,配置一个组织,来监管设备</p><ul><li><p>点击 <strong>组织</strong> - <strong>选择</strong></p><p><img src="/source/pair-locking-windows/select-org.png" alt="Select Org"></p></li><li><p>在弹出的页面中,点击左下角的 <strong>+</strong> 来新建一个组织</p><p><img src="/source/pair-locking-windows/create-new-org.png" alt="Create New Org"></p></li><li><p>组织信息中,只有 <strong>名称</strong> 是必填项目,此处设置的名称将会在设备上显示,其他信息可以不填写<br><img src="/source/pair-locking-windows/new-org-info.png" alt="New Org Info"></p><p><img src="/source/pair-locking-windows/phone-org-info-example.jpg" alt="Phone Org Info Example"></p></li><li><p>保存之后,选择刚刚创建的组织</p></li></ul></li><li><p>配置监管设置</p><ul><li><p>勾选 <strong>允许在没有监管组织的情况下配对</strong></p></li><li><p>取消勾选 <strong>禁用 USB 限制模式</strong></p></li><li><p>勾选 <strong>允许被监管时使用激活锁(允许使用查找我的)</strong></p><p><img src="/source/pair-locking-windows/supervise-settings.png" alt="Supervise Settings"></p></li><li><p>点击<strong>下一步</strong>,此时会提示<strong>抹掉所有内容和设置</strong>, 此处会弹出多次确认提醒</p><p><img src="/source/pair-locking-windows/content-removal-warning.png" alt="Content Remove Warning"></p></li></ul></li><li><p>在 iMazing 的主界面点击 <code>工具</code> - <code>iMazing Profile Editor</code>,打开配置文件编辑工具</p><ul><li>首先,在 General 页面下,找到 <code>Prevent users from removing this profile</code> 和  <code>Has removal passcode</code>,根据自己的喜好进行选择</li></ul><blockquote><p><code>Prevent users from removing this profile</code> 即无法在设备中删除此配置文件<br><code>Has removal passcode</code> 则会在移除时要求输入正确的密码后才能删除<br>建议两项二选一(因为我也没测试过同时开启会发生什么)</p></blockquote><ul><li>如选择 <code>Has removal passcode</code> 时,则需要在左侧列表中找到 <strong>Profile Removal</strong> 页面中,点击 <code>Add Configuration Payload</code> 后,在 <code>Removal Password</code> 项目中设置密码</li></ul><p><img src="/source/pair-locking-windows/removal-password.png" alt="Remove Password"></p><p>效果如下:<br><img src="/source/pair-locking-windows/removal-password-example.jpg" alt="Remove Password Example"></p><ul><li>接下来,在左侧列表中找到 <strong>Restrictions</strong> 点击 <code>Add Configuration Payload</code> 后,找到并取消勾选 <code>Allow host pairing</code></li></ul><p><img src="/source/pair-locking-windows/allow-host-pairing.png" alt="Allow host pairing"></p><ul><li>继续做一些喜欢的设置后,继续下一步的操作即可</li></ul></li><li><p>点击左上角 <code>File</code> - <code>Save to iMazing Library</code>,保存配置文件到 iMazing 库中</p></li><li><p>返回 iMazing 主界面,在设备的应用列表中找到 <code>描述文件</code>,点击 <code>从资料库安装</code>,选择刚刚保存的配置文件后,点击 <code>选择</code> 即可</p><p><img src="/source/pair-locking-windows/complete.png" alt="Install Complete"></p></li></ol><h2 id="总结">总结</h2><p>禁止与新设备的配对可以一定程度上的提升身边的安全性,但一直以来安全与便利就是一个两难的选择。比如外出时,除非移除配置文件,否则将无法与其他设备通过有线方式进行数据传输以及备份。</p><h1 id="参考链接">参考链接</h1><ul><li><a href="https://www.wevg.org/archives/pair-locking-your-iphone/">利用 Pair Locking 保证 iOS 设备数据安全</a></li><li><a href="https://imazing.com/guides/how-to-supervise-iphone-ipad">Supervise iPhone, iPad and iPod touch</a></li><li><a href="https://imazing.com/guides/ios-configuration-profiles-intro#restrictions">Getting started with iOS configuration profiles</a></li></ul>]]></content>
  27.    
  28.    <summary type="html">
  29.    
  30.      &lt;p&gt;本文将帮助您在 Windows 系统环境下,使用监管模式保护您的设备隐私安全,防止执法人员对您的设备进行取证。&lt;/p&gt;
  31.    
  32.    </summary>
  33.    
  34.    
  35.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  36.    
  37.      <category term="Apple" scheme="https://www.wevg.org/categories/Tech/Apple/"/>
  38.    
  39.    
  40.      <category term="Windows" scheme="https://www.wevg.org/tags/Windows/"/>
  41.    
  42.      <category term="Secure" scheme="https://www.wevg.org/tags/Secure/"/>
  43.    
  44.      <category term="iPhone" scheme="https://www.wevg.org/tags/iPhone/"/>
  45.    
  46.      <category term="Exploit" scheme="https://www.wevg.org/tags/Exploit/"/>
  47.    
  48.      <category term="Apple" scheme="https://www.wevg.org/tags/Apple/"/>
  49.    
  50.      <category term="配置" scheme="https://www.wevg.org/tags/%E9%85%8D%E7%BD%AE/"/>
  51.    
  52.  </entry>
  53.  
  54.  <entry>
  55.    <title>2021 年终总结</title>
  56.    <link href="https://www.wevg.org/archives/bye-2021/"/>
  57.    <id>https://www.wevg.org/archives/bye-2021/</id>
  58.    <published>2021-12-30T07:21:01.000Z</published>
  59.    <updated>2021-12-30T07:21:01.000Z</updated>
  60.    
  61.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>2021年即将结束,而 Corona 也陪伴我们度过两个年头了。按照传统,到了该更新我的年终总结的时候,才发现自己竟然大半年多没有更新自己的博客了。</p><span id="more"></span>    <div id="aplayer-cjFiYOXj" class="aplayer aplayer-tag-marker meting-tag-marker"         data-id="461899833" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86"    ></div><p>那我就先来说一下网址的部分吧~<br>排除掉10月份网址被我搞炸掉的几天之外,今年一共有大约11万次的访问,平均下来差不多每个月不到1万吧。<br>然后今年的话一共就写了两篇文章,还是年初的时候写的,果然不更新博客的话访问量还是会掉的鸭…… QAQ</p><p><img src="/source/bye-2021/1.png" alt=""></p><p>顺便感谢大家一直以来的支持,我的 Adsense 收入在经过三年以后,也终于快要到100刀的提现额度啦~(比心心 ♥)</p><p><img src="/source/bye-2021/2.png" alt=""></p><p>今年的话,从去年开始想重新写的 <a href="http://uv.uy">uv.uy</a> 还是没有重新写,继续咕咕咕~ 🕊️🕊️🕊️<br>不过前不久倒是把 <a href="http://ts3.gs">ts3.gs</a> 也就是我的 TeamSpeak 服务器的页面给重写了,就是下面这个样子啦~<br>首先是支持了系统的暗色模式(好像我之前的也支持……),然后就是可以显示服务器的实时在线人数和平均延迟、丢包啦~再就是在连接服务器的地方可以显示服务器的状态了</p><p><img src="/source/bye-2021/3.png" alt=""></p><p>哦,对了有什么办法治一治我总想买域名的毛病呢?(苦恼</p><p>网站的部分大概就是这样喽~接下来似乎就该聊聊我自己了。<br>今年的话,主要的人生进程的话,就是开始了我的朝10晚9的研究生生活,每天其实都有种在上高三的感觉。<br>不过转眼间研究生的生活就过了一半了,今年的一年里接触到了 Flutter, Arduino, ESP32等等等等的新东西,也学到了很多的新知识,顺便做了一次 Poster 发表。<br>明年的话,就要开始着手准备读博的事情了,希望一切顺利把~</p><p>顺便最近也开始学习新的语言了,不过既然刚刚开始学,就不拿出来丢人了。</p><p>今年的话,一样来发一个支付宝红包把~ <code>55465437</code><br>祝大家学业进步,事业顺利。新的一年一切顺利,身体健康,天天开心~~~</p>]]></content>
  62.    
  63.    <summary type="html">
  64.    
  65.      &lt;p&gt;2021年即将结束,而 Corona 也陪伴我们度过两个年头了。按照传统,到了该更新我的年终总结的时候,才发现自己竟然大半年多没有更新自己的博客了。&lt;/p&gt;
  66.    
  67.    </summary>
  68.    
  69.    
  70.      <category term="Other" scheme="https://www.wevg.org/categories/Other/"/>
  71.    
  72.    
  73.      <category term="Yearly" scheme="https://www.wevg.org/tags/Yearly/"/>
  74.    
  75.      <category term="2021" scheme="https://www.wevg.org/tags/2021/"/>
  76.    
  77.  </entry>
  78.  
  79.  <entry>
  80.    <title>在 TeamSpeak 服务器上使用 GeoIP 数据库</title>
  81.    <link href="https://www.wevg.org/archives/geoip-with-teamspeak/"/>
  82.    <id>https://www.wevg.org/archives/geoip-with-teamspeak/</id>
  83.    <published>2021-03-06T08:08:51.000Z</published>
  84.    <updated>2021-03-06T10:31:27.000Z</updated>
  85.    
  86.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>一直以来, TeamSpeak 服务器都在使用 IP2Location 的数据库,但是因为不能即使更新,所以准确率一直是一个问题。作为Edison 填坑系列之二,我将在本文说明如何在 TeamSpeak 服务器上使用 GeoIP 数据库。</p><span id="more"></span><p>终于, TeamSpeak 在 1.13.0 的版本开始支持调用 mmdb 格式的数据库了。</p><p>我们想要获取 MaxMind 公司的免费版数据库 GeoLite2 ,先要注册账号。</p><h2 id="注册-maxmind-账号">注册 MaxMind 账号</h2><p>访问 <a href="https://www.maxmind.com/en/geolite2/signup">https://www.maxmind.com/en/geolite2/signup</a> 注册账号。</p><p>注册完成后,登录账号,点击页面左侧的 <code>Download Files</code> 选项</p><p><img src="https://i.yecdn.com/images/2021/03/06/e921332af2152ed43c379fc429fb4177.png" alt="e921332af2152ed43c379fc429fb4177.png"></p><h2 id="获取-geoip-数据库">获取 GeoIP 数据库</h2><p>因为 TeamSpeak 只需要精确到国家,所以我们选择 <code>GeoLite2 Country</code></p><p><img src="https://i.yecdn.com/images/2021/03/06/01e72c4d98a26f8f9bf9beb9a1a9cbff.png" alt="01e72c4d98a26f8f9bf9beb9a1a9cbff.png"></p><h3 id="获取永久链接">获取永久链接</h3><blockquote><p>如果不想配置自动更新,可以忽略这一步,直接右键点击 Download GZIP 获取下载链接即可</p></blockquote><p>点击 <code>Get Permalinks</code> 会看到如下界面</p><p><img src="https://i.yecdn.com/images/2021/03/06/5fd7d4dd9db0e6486e6ac841b5efab6e.png" alt="5fd7d4dd9db0e6486e6ac841b5efab6e.png"></p><p><code>https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&amp;license_key=YOUR_LICENSE_KEY&amp;suffix=tar.gz</code></p><h3 id="获取许可证密钥">获取许可证密钥</h3><blockquote><p>如果不想配置自动更新,可以忽略这一步</p></blockquote><p>打开页面左侧的 Manage License Keys 选项卡,点击 Generate new license key</p><p><img src="https://i.yecdn.com/images/2021/03/06/7f29067d45e85c35f6fe40bcb47023dc.png" alt="7f29067d45e85c35f6fe40bcb47023dc.png"></p><p>License key description 的部分自己填写就好, 因为我们要自己配置 GeoIP Update 所以下面的选项选 No 即可</p><p><img src="https://i.yecdn.com/images/2021/03/06/38b2a616f0727b980e55dab0859e6beb.png" alt="38b2a616f0727b980e55dab0859e6beb.png"></p><p>点击 Confirm 之后,我们便可以获取到自己的 ID 和许可证密钥了。复制此处的 License key, 替换到上方链接中。</p><p><strong>请务必妥善保管自己的许可证密钥。</strong></p><p><img src="https://i.yecdn.com/images/2021/03/06/c610bf232dd1e83652c626b43fbfc06f.png" alt="c610bf232dd1e83652c626b43fbfc06f.png"></p><p>举个例子,比如我的Key是 <code>AAAAAAAAAAAAA</code>, 那么链接即 <code>https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&amp;license_key=AAAAAAAAAAAAA&amp;suffix=tar.gz</code></p><h3 id="下载">下载</h3><p>在服务器中下载这个文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">wget <span class="hljs-string">&#x27;https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&amp;license_key=AAAAAAAAAAAAA&amp;suffix=tar.gz&#x27;</span><br></code></pre></td></tr></table></figure><blockquote><p>请注意替换链接</p></blockquote><p><img src="https://i.yecdn.com/images/2021/03/06/b9f124b2f7df119eb1bf6c23bbb74078.png" alt="b9f124b2f7df119eb1bf6c23bbb74078.png"></p><p>解压该文件 <code>tar -xvf</code> + <kbd>Tab</kbd></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">tar -xvf geoip...=tar.gz<br></code></pre></td></tr></table></figure><p><img src="https://i.yecdn.com/images/2021/03/06/0b72d523e41b269af5f7690aa157ee24.png" alt="0b72d523e41b269af5f7690aa157ee24.png"></p><p>我们应该能获得三个文件,此处只需要里面的 <code>GeoLite2-Country.mmdb</code></p><p>复制该文件到 TeamSpeak 服务器端的目录下, 此处以 <code>/opt/teamspeak3-server_linux_amd64/</code> 为例</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">cp</span> GeoLite<span class="hljs-number">2</span>-Country_<span class="hljs-number">20210302</span>/GeoLite<span class="hljs-number">2</span>-Country.mmdb /opt/teamspeak<span class="hljs-number">3</span>-server_linux_amd<span class="hljs-number">64</span>/<br></code></pre></td></tr></table></figure><blockquote><p>此处请注意替换目录地址</p></blockquote><h2 id="配置-teamspeak-服务端">配置 TeamSpeak 服务端</h2><p>通过添加这个启动项来让服务端调用 mmdb <code>mmdbpath=</code></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><code class="hljs bash">./ts3server mmdbpath=GeoLite2-Country.mmdb<br></code></pre></td></tr></table></figure><p>如果有以下提示,需要安装 maxminddb 库</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">2021</span>-<span class="hljs-number">03</span>-<span class="hljs-number">06</span> <span class="hljs-number">09</span>:<span class="hljs-number">02</span>:<span class="hljs-number">57</span>.<span class="hljs-number">856124</span>|WARNING |GeoIP         |   |maxminddb library not found, disabling MMDB usage<br></code></pre></td></tr></table></figure><p>参见 <a href="#maxminddb-library-not-found-disabling-mmdb-usage">常见问题 - maxminddb library not found, disabling MMDB usage </a> 部分</p><p>成功运行时,会看到如下的日志</p><p><img src="https://i.yecdn.com/images/2021/03/06/357d69a528520f7daae1b5399e8f74ed.png" alt="357d69a528520f7daae1b5399e8f74ed.png"></p><p>此时,我们先 <kbd>Ctrl</kbd> + <kbd>C</kbd> 停止服务器</p><h3 id="方式一-添加启动项">方式一: 添加启动项</h3><p>接下来,我们只需要在正常的启动命令后面添加刚刚的启动项即可<br>比如 <code>./ts3server_startscript.sh start mmdbpath=GeoLite2-Country.mmdb</code></p><h3 id="方式二-创建配置文件">方式二: 创建配置文件</h3><p>如果之前有引入过配置文件,或者想要创建配置文件。<br>创建名为 ·ts3server.ini· 的配置文件,在配置文件中添加 <code>mmdbpath=&lt;MMDB 文件&gt;</code> ,启动时,调用配置文件即可。</p><p><img src="https://i.yecdn.com/images/2021/03/06/f2f60bb4b3ee1cdb4a660c56bfc59941.png" alt="f2f60bb4b3ee1cdb4a660c56bfc59941.png"></p><p>为了方便演示,此处以 <code>./ts3server inifile=ts3server.ini</code> 的方式启动服务器<br><code>./ts3server_startscript.sh start inifile=ts3server.ini</code></p><p><img src="https://i.yecdn.com/images/2021/03/06/f0d7d50309113b42616ffb7cb52376be.png" alt="f0d7d50309113b42616ffb7cb52376be.png"></p><h2 id="配置自动更新-进阶操作">配置自动更新(进阶操作)</h2><p>此部分是一个可选项。</p><blockquote><p>每次更新后,需要重新启动服务器端才能生效</p></blockquote><p>我写了一个比较简单粗暴的脚本</p><p>创建 /opt/geoip/ 目录 <code>mkdir /opt/geoip</code></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><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></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><span class="hljs-built_in">cd</span> /opt/geoip<br>wget -O geoip.tar.gz -N <span class="hljs-string">&#x27;https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&amp;license_key=AAAAAAAAAAAA&amp;suffix=tar.gz&#x27;</span><br>tar -zxvf geoip.tar.gz<br>chown -R teamspeak:teamspeak GeoLite2-Country*<br>cp GeoLite2-Country*/GeoLite2-Country.mmdb /opt/teamspeak3-server_linux_amd64/geoip.mmdb<br>rm -r GeoLite2-Country* geoip.tar.gz<br>chown -R teamspeak:teamspeak /opt/teamspeak3-server_linux_amd64/geoip.mmdb<br>systemctl restart teamspeak<br></code></pre></td></tr></table></figure><p>注意替换脚本中的下载链接,按照我的这个配置中 <code>mmdbpath</code> 也应该被替换为 <code>geoip.mmdb</code>。<br>如果启动或停止服务器时时通过命令行进行的,那么只需要将 <code>systemctl restart teamspeak</code> 替换为 <code>./ts3server_startscript.sh start mmdbpath=GeoLite2-Country.mmdb</code> 或其他指令即可。</p><p>接下来把这个配置到 crontab 里面即可<br>比如,我自己的服务器设置的是时间是每月1号 4:30 自动更新。</p><figure class="highlight basic"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs basic"><span class="hljs-symbol">30 </span><span class="hljs-number">4</span> <span class="hljs-number">1</span> * * /bin/bash /opt/geoip/update.sh &gt; /dev/null<br></code></pre></td></tr></table></figure><p>至此,替换 IP 数据库,自动更新的操作就完成了。</p><h2 id="常见问题">常见问题</h2><h3 id="maxminddb-library-not-found-disabling-mmdb-usage">maxminddb library not found, disabling MMDB usage</h3><p>如果有以下提示,需要安装 maxminddb 库</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">2021</span>-<span class="hljs-number">03</span>-<span class="hljs-number">06</span> <span class="hljs-number">09</span>:<span class="hljs-number">02</span>:<span class="hljs-number">57</span>.<span class="hljs-number">856124</span>|WARNING |GeoIP         |   |maxminddb library not found, disabling MMDB usage<br></code></pre></td></tr></table></figure><p>此处以 Debian 10 x64 系统为例, 安装 libmaxminddb-dev 包即可</p><blockquote><p>此处需要 sudo 或 root 权限</p></blockquote><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cmake">sudo apt <span class="hljs-keyword">install</span> libmaxminddb-dev<br></code></pre></td></tr></table></figure><h1 id="参考链接">参考链接</h1><p><a href="https://unix.stackexchange.com/questions/159531/the-geoip2-module-requires-the-maxminddb-library-but-the-library-is-installed">https://unix.stackexchange.com/questions/159531/the-geoip2-module-requires-the-maxminddb-library-but-the-library-is-installed</a></p>]]></content>
  87.    
  88.    <summary type="html">
  89.    
  90.      &lt;p&gt;一直以来, TeamSpeak 服务器都在使用 IP2Location 的数据库,但是因为不能即使更新,所以准确率一直是一个问题。作为Edison 填坑系列之二,我将在本文说明如何在 TeamSpeak 服务器上使用 GeoIP 数据库。&lt;/p&gt;
  91.    
  92.    </summary>
  93.    
  94.    
  95.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  96.    
  97.    
  98.      <category term="Linux" scheme="https://www.wevg.org/tags/Linux/"/>
  99.    
  100.      <category term="搭建" scheme="https://www.wevg.org/tags/%E6%90%AD%E5%BB%BA/"/>
  101.    
  102.      <category term="服务器" scheme="https://www.wevg.org/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
  103.    
  104.      <category term="VoIP" scheme="https://www.wevg.org/tags/VoIP/"/>
  105.    
  106.      <category term="语音" scheme="https://www.wevg.org/tags/%E8%AF%AD%E9%9F%B3/"/>
  107.    
  108.      <category term="Docker" scheme="https://www.wevg.org/tags/Docker/"/>
  109.    
  110.  </entry>
  111.  
  112.  <entry>
  113.    <title>利用 Cloudflare WARP 为家里添加 IPv6 网络</title>
  114.    <link href="https://www.wevg.org/archives/cloudflare-with-openwrt-as-ipv6/"/>
  115.    <id>https://www.wevg.org/archives/cloudflare-with-openwrt-as-ipv6/</id>
  116.    <published>2021-02-27T04:18:32.000Z</published>
  117.    <updated>2021-02-27T04:18:32.000Z</updated>
  118.    
  119.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>说起来,其实这算是一篇拖更了蛮久的文章了。虽然没有 IPv6 对于日常使用完全没有任何影响,但是就还算总想折腾一下,给家里添置上 IPv6。我将会说明如何利用 Cloudflare WARP 为家中添置 IPv6 网络。</p><span id="more"></span><h2 id="前言">前言</h2><p>最初的最初,其实是想等运营商给分配 IPv6 的,但是等了几年也没有任何的进展。</p><p>既然等分配的路子行不通,那我就走 HE 的 Tunnel 吧,奈何 KT 和 HE 的线路全都要绕美国。 直到 Cloudflare 出了 WARP 也总算是有了个比较好的解决方案了。 ˋ( ° ▽、° )</p><p><img src="https://i.yecdn.com/images/2021/02/27/781c7e3164bec402569302054a3acb64.png" alt="781c7e3164bec402569302054a3acb64.png"></p><h2 id="获取配置文件">获取配置文件</h2><p>获取配置文件的方式有蛮多种的,其他使用过的工具会放在文章末尾参考链接的部分</p><h3 id="利用-wgcf-获取配置">利用 wgcf 获取配置</h3><p>这里以 @ViRb3 大佬的 wgcf 工具 <a href="https://github.com/ViRb3/wgcf">Github</a> 为例</p><blockquote><p>此处以 Windows 为例,不同操作系统操作方式相同</p></blockquote><p>下载二进制程序后,执行 <code>./wgcf register</code> 来创建账号, 看到 <code>Successfully created Cloudflare Warp account</code> 说明账号创建成功了。</p><p><img src="https://i.yecdn.com/images/2021/02/27/192f2177a35b58d01a395df85b7036e7.png" alt="192f2177a35b58d01a395df85b7036e7.png"></p><p>接下来,我们需要执行 <code>./wgcf generate</code> 来生成 Wireguard 配置文件</p><p><img src="https://i.yecdn.com/images/2021/02/27/8045095b900ca152482248237af22348.png" alt="8045095b900ca152482248237af22348.png"></p><p>正常情况下,我们就得到了一个名为 <code>wgcf-profile.conf</code> 的配置文件</p><p><img src="https://i.yecdn.com/images/2021/02/27/204c06a815d588667641295a33000725.png" alt="204c06a815d588667641295a33000725.png"></p><h2 id="配置-openwrt">配置 OpenWrt</h2><h3 id="安装组件">安装组件</h3><blockquote><p>此处以 19.07.7 版本的 OpenWrt 为例</p></blockquote><p>打开 OpenWrt 后台,安装 <code>luci-app-wireguard</code> 和 <code>kmod-ipt-nat6</code>。</p><p><img src="https://i.yecdn.com/images/2021/02/27/1bf6da4dc65e1d5a268ba8e11276cf83.png" alt="1bf6da4dc65e1d5a268ba8e11276cf83.png"></p><p>安装完成后,<strong>重启 OpenWrt 后</strong></p><h3 id="配置-wireguard">配置 Wireguard</h3><p>打开 <code>Network</code> - <code>Interfaces</code>, 点击 <code>Add new interface...</code> 添加 Wireguard</p><p><img src="https://i.yecdn.com/images/2021/02/27/d0dd3b2ca8d9be8890d46549147e24cd.png" alt="d0dd3b2ca8d9be8890d46549147e24cd.png"></p><p>填写名称,协议选择 <strong><code>WireGuard VPN</code></strong>, 点击 <code>Create interfaces</code></p><p><img src="https://i.yecdn.com/images/2021/02/27/9e39a1b040be97fac2e72fba2422103b.png" alt="9e39a1b040be97fac2e72fba2422103b.png"></p><p>按照,刚刚生成的文件 <code>wgcf-profile.conf</code>,填写 <code>Private Key</code> 和 <code>IP Addresses</code>, IP 的部分只填写 IPv6 即可</p><p><img src="https://i.yecdn.com/images/2021/02/27/26bda9ff50f4903f6687e1f265f9325f.png" alt="26bda9ff50f4903f6687e1f265f9325f.png"></p><p>点击 <code>Firewall Settings</code> 选项卡, 添加至 <code>wan</code> 的防火墙组</p><p><img src="https://i.yecdn.com/images/2021/02/27/3640fc2a672e28e6029e48f64e2e4086.png" alt="3640fc2a672e28e6029e48f64e2e4086.png"></p><p>点击 <code>Peers</code> 选项卡, 点击 <code>Add peer</code>, 按照,刚刚生成的文件 <code>wgcf-profile.conf</code>,填写 <code>Public Key</code>, <code>Endpoint Host</code> 以及 <code>Endpoint Port</code><br>因为我们只需要他访问 IPv6 网络,所以 <code>Allowed IPs</code> 填写 <code>::/0</code><br>勾选 Route Allowed IPs</p><p><img src="https://i.yecdn.com/images/2021/02/27/9250a6c51a29c227e350943c4362e814.png" alt="9250a6c51a29c227e350943c4362e814.png"></p><p>点击 Save , Save &amp; Apply</p><h3 id="配置内网">配置内网</h3><p>此时,你会发现通过路由器,你已经可以访问 IPv6 但内网的设备还是不行</p><p><img src="https://i.yecdn.com/images/2021/02/27/e7c77a3313e23ab5f8d0addd6fd875db.png" alt="e7c77a3313e23ab5f8d0addd6fd875db.png"></p><p>打开 <code>Network</code> - <code>Interfaces</code>, 点击 <code>LAN</code>, 打开 <code>DHCP Server</code> - <code>IPv6 Settings</code> 选项卡</p><p>将 <strong>Router Advertisement-Service</strong> 设置为 <code>server mode</code><br><strong>DHCPv6-Service</strong> 设置为 <code>disabled</code><br><strong>NDP-Proxy</strong> 设置为 <code>disabled</code><br>勾选 <strong>Always announce default router</strong><br>保存设置</p><p><img src="https://i.yecdn.com/images/2021/02/27/a13c12e87d1f4ffc08191770d281f752.png" alt="a13c12e87d1f4ffc08191770d281f752.png"></p><h3 id="启用自动地址配置和路由器发现">启用自动地址配置和路由器发现</h3><p>SSH 连接 OpenWrt 后运行该指令以启用自动地址配置和路由器发现</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><code class="hljs bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;net.ipv6.conf.default.accept_ra=2&quot;</span> &gt;&gt; /etc/sysctl.conf<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;net.ipv6.conf.all.accept_ra=2&quot;</span> &gt;&gt; /etc/sysctl.conf<br></code></pre></td></tr></table></figure><h3 id="修改内网地址前缀-ula">修改内网地址前缀(ULA)</h3><p>修改内网地址前缀,避免一些设备以为我们没有 IPv6 网络</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><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">uci <span class="hljs-built_in">set</span> network.globals.ula_prefix=<span class="hljs-string">&quot;<span class="hljs-subst">$(uci get network.globals.ula_prefix | sed &#x27;s/^./d/&#x27;)</span>&quot;</span><br>uci commit network<br>uci <span class="hljs-built_in">set</span> dhcp.lan.ra_default=<span class="hljs-string">&#x27;1&#x27;</span><br>uci commit dhcp<br></code></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><code class="hljs bash">ip6tables -t nat -I POSTROUTING -s `uci get network.globals.ula_prefix` -j MASQUERADE<br></code></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><code class="hljs bash">/etc/init.d/network restart<br></code></pre></td></tr></table></figure><h2 id="最终效果">最终效果</h2><p>此时,我们便能访问 IPv6 网络啦~ ( ̄y▽, ̄)╭</p><p><img src="https://i.yecdn.com/images/2021/02/27/e4b0fefadf8ffe53414ccbed26734501.png" alt="e4b0fefadf8ffe53414ccbed26734501.png"></p><h2 id="参考内容">参考内容</h2><ul><li><a href="https://openwrt.org/docs/guide-user/network/ipv6/start">OpenWrt - IPv6</a></li><li><a href="https://openwrt.org/docs/guide-user/network/ipv6/ipv6.nat6">OpenWrt - NAT6 and IPv6 masquerading</a></li><li><a href="https://openwrt.org/docs/guide-user/services/vpn/wireguard/client">Openwrt - WireGuard Client</a></li><li><a href="https://openwrt.org/docs/guide-user/services/vpn/wireguard/extras">Openwrt - WireGuard Extras</a></li><li><a href="https://lwz322.github.io/2018/10/07/IPv6_NAT.html">OpenWrt配置IPv6 NAT</a></li><li><a href="https://github.com/yyuueexxiinngg/some-scripts/tree/master/cloudflare">yyuueexxiinngg/some-scripts - Github</a></li></ul>]]></content>
  120.    
  121.    <summary type="html">
  122.    
  123.      &lt;p&gt;说起来,其实这算是一篇拖更了蛮久的文章了。虽然没有 IPv6 对于日常使用完全没有任何影响,但是就还算总想折腾一下,给家里添置上 IPv6。我将会说明如何利用 Cloudflare WARP 为家中添置 IPv6 网络。&lt;/p&gt;
  124.    
  125.    </summary>
  126.    
  127.    
  128.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  129.    
  130.    
  131.      <category term="Cloudflare" scheme="https://www.wevg.org/tags/Cloudflare/"/>
  132.    
  133.      <category term="OpenWrt" scheme="https://www.wevg.org/tags/OpenWrt/"/>
  134.    
  135.      <category term="Wireguard" scheme="https://www.wevg.org/tags/Wireguard/"/>
  136.    
  137.      <category term="IPv6" scheme="https://www.wevg.org/tags/IPv6/"/>
  138.    
  139.  </entry>
  140.  
  141.  <entry>
  142.    <title>2020 年终总结</title>
  143.    <link href="https://www.wevg.org/archives/bye-2020/"/>
  144.    <id>https://www.wevg.org/archives/bye-2020/</id>
  145.    <published>2020-12-31T12:59:38.000Z</published>
  146.    <updated>2020-12-31T12:59:38.000Z</updated>
  147.    
  148.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>转眼间, 2020年马上就要过去了,按照每年的惯例,又到了该写年终总结的时候了呢。想了一想,用一个词来说今年的话,可能只有 “Corona” 能代表今年了吧,这也是我选用它作为缩略图的原因。</p><span id="more"></span>    <div id="aplayer-ufkGsDUD" class="aplayer aplayer-tag-marker meting-tag-marker"         data-id="1343458283" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86"    ></div><p>按照惯例,还是先说说网站的部分,嘿嘿嘿。</p><ul><li>完成了去年的计划 —— 重写 <a href="http://uv.uy">uv.uy</a> 的页面</li><li>把短链接地址再度的进行了改变 —— <a href="http://go.uv.uy">go.uv.uy</a></li><li>独立了我的 TeamSpeak 服务器的地址</li><li>把博客放在了 Cloudflare Workers上, 结果今年就只有在年初的时候写了 9 篇文章,有三篇文章本来要写,结果一直咕咕咕到了现在</li><li>访客量的话,大概是因为我完全没有更新博客,访客量也没有什么明显的变化<br><img src="https://i.yecdn.com/images/2020/12/31/892dcbc5538947a14bc4c93223a27eed.png" alt="892dcbc5538947a14bc4c93223a27eed.png"></li></ul><p>网站的部分基本就是这样,下面来说说我自己的部分吧。</p><p>因为疫情的原因,早早的回来了韩国。也同样是因为疫情,大学的最后一个学期,是在每天在家里上网课,玩游戏的状态下结束的,甚至毕业都没有了往年例行的毕业会。早知道这样的话,半年前让我作为优秀毕业生发言我就应该去的,呜呜呜。<br>虽然说算是个遗憾吧,但也算是一个蛮特别的经历了。</p><p>再就是成功的上了研究生,虽然之后要做的事情可能和编程和做网站完全没什么关系就是了。</p><p>哦对了,说起来今年在年初的时候似乎我还又面基了一大群大佬的样子~<br>小浩,小黄蜂,Kotomei,Nanoape,Lazymio,Lucas,立音,Canoe 结果刚面基过大佬们没多久疫情就爆发了。<br>可能也算是幸运吧?</p><p>另外就是在进了实验室之后,把实验室的网站拿 React 重写了一遍。</p><p><img src="/source/image/bye-2020.jpg" alt=""></p><p>似乎再也就没有什么别的事情了。</p><p>emmmm<br>顺便发一个支付宝红包吧~<br><code>57174837</code></p><p>祝所有看到我这篇文章的人,也祝我自己身体健康,新的一年一切顺利,天天开心~</p>]]></content>
  149.    
  150.    <summary type="html">
  151.    
  152.      &lt;p&gt;转眼间, 2020年马上就要过去了,按照每年的惯例,又到了该写年终总结的时候了呢。想了一想,用一个词来说今年的话,可能只有 “Corona” 能代表今年了吧,这也是我选用它作为缩略图的原因。&lt;/p&gt;
  153.    
  154.    </summary>
  155.    
  156.    
  157.      <category term="Other" scheme="https://www.wevg.org/categories/Other/"/>
  158.    
  159.    
  160.      <category term="Yearly" scheme="https://www.wevg.org/tags/Yearly/"/>
  161.    
  162.      <category term="2020" scheme="https://www.wevg.org/tags/2020/"/>
  163.    
  164.  </entry>
  165.  
  166.  <entry>
  167.    <title>提升战网游戏下载速度</title>
  168.    <link href="https://www.wevg.org/archives/speed-up-battle-net/"/>
  169.    <id>https://www.wevg.org/archives/speed-up-battle-net/</id>
  170.    <published>2020-03-26T06:25:01.000Z</published>
  171.    <updated>2020-04-25T12:35:01.000Z</updated>
  172.    
  173.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>最近和国内的小伙伴一起玩 COD 的时候,因为国内网络的问题便会遇到下载速度巨慢的问题,本文将说明如何提升战网游戏的下载速度。</p><span id="more"></span><blockquote><p>本文提到的工具来自<a href="https://www.dogfight360.com/blog/1042/">羽翼城大佬</a></p></blockquote><h2 id="解决方法">解决方法</h2><p>我们需要大佬制作的 CDN 重定向工具,来解决分配到龟速CDN下不动的问题。</p><p>您可以在此处选择我的转存版本,亦可点击上方大佬的博客下载大佬提供的默认下载地址</p><p><a href="https://go.uv.uy/o2O2b">点此下载</a></p><p>下载完成后运行后,选择 CDN (此处建议选择 Akamai), 接下来点击启动重定向即可。</p><p><img src="https://i.yecdn.com/images/2020/03/26/ea9df0dc7bec81d390986fcd6e48428d.png" alt=""></p><p>这时,重新启动我们的战网客户端,开始下载的话,如果重定向成功工具上会显示凹凸凹凸凹凸。</p><p>如果没有问题的话,下载速度过慢的问题也得到了解决。</p><p><s>又水了一篇博客呢,</s> 耶 ( •̀ ω •́ )y</p><h2 id="参考链接">参考链接</h2><p><a href="https://www.dogfight360.com/blog/1042/">战网下载CDN重定向V1.2</a></p><p>图片来源 <a href="https://www.blizzard.com/en-us/">blizzard.com</a></p>]]></content>
  174.    
  175.    <summary type="html">
  176.    
  177.      &lt;p&gt;最近和国内的小伙伴一起玩 COD 的时候,因为国内网络的问题便会遇到下载速度巨慢的问题,本文将说明如何提升战网游戏的下载速度。&lt;/p&gt;
  178.    
  179.    </summary>
  180.    
  181.    
  182.      <category term="Gaming" scheme="https://www.wevg.org/categories/Gaming/"/>
  183.    
  184.    
  185.      <category term="Windows" scheme="https://www.wevg.org/tags/Windows/"/>
  186.    
  187.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  188.    
  189.      <category term="设置" scheme="https://www.wevg.org/tags/%E8%AE%BE%E7%BD%AE/"/>
  190.    
  191.      <category term="配置" scheme="https://www.wevg.org/tags/%E9%85%8D%E7%BD%AE/"/>
  192.    
  193.      <category term="BattleNet" scheme="https://www.wevg.org/tags/BattleNet/"/>
  194.    
  195.  </entry>
  196.  
  197.  <entry>
  198.    <title>同时运行 Edge 和 Edge Legacy</title>
  199.    <link href="https://www.wevg.org/archives/keep-edge-legacy/"/>
  200.    <id>https://www.wevg.org/archives/keep-edge-legacy/</id>
  201.    <published>2020-03-20T02:46:47.000Z</published>
  202.    <updated>2020-03-20T02:46:47.000Z</updated>
  203.    
  204.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>Edge Chromium 是微软基于 Chromium 内核的一款浏览器,并于今年年初发布正式版,微软在其博客中表示会在未来的版本中替换掉目前的 Edge Legacy,那么要怎么同时保留两个版本呢?</p><span id="more"></span><blockquote><p>下文按照微软官方的叫法,均将目前基于 EdgeHTML 内核的 Edge 浏览器叫做 Microsoft Edge Legacy,最新基于 Chromium 内核的 Edge 浏览器叫做 Microsoft Edge。</p></blockquote><p>以我本人来说,还是蛮喜欢 Microsoft Edge Legacy 的 (其实我一直把它拿来当作 PDF 阅读器来用)</p><p>根据微软官方的说明,在未来版本的 Windows 中,会直接替换掉现有的 Edge Legacy ,下面就来说说如何让两个版本共存</p><h1 id="方式一-编辑组策略方式">方式一: 编辑组策略方式</h1><p>若要设置并行浏览器体验策略,请执行以下操作:</p><ol><li><p>点击 <a href="https://www.microsoft.com/zh-cn/edge/business/download">这里</a> 从 Microsoft Edge For Business 安装策略定义。</p><ul><li>选择要使用的频道/结构 (channel/build) 和平台 (platform) ,然后单击“获取政策文件” (GET POLICY FILES) 。</li><li>将压缩文件解压缩,解压缩后,我们会获得这样一个文件目录</li></ul><p><img src="https://i.yecdn.com/images/2020/03/20/3ac915974caf9169c0168aa212f0cece.png" alt="explorer_2020-03-20_125018.png"></p><ul><li><p>打开 <code>windows/admx</code> 目录后</p></li><li><p>将 <code>msedge.admx</code> 和 <code>msedgeupdate.admx</code> 两个文件复制到 <code>C:\Windows\PolicyDefinitions</code> 目录下。</p></li><li><p>从 <code>zh-CN</code> 目录中将 <code>msedge.adml</code> 和 <code>msedgeupdate.adml</code> 两个文件(从相应的语言/区域设置目录),复制到 <code>C:\Windows\PolicyDefinitions\zh-CN</code> 目录下。</p></li></ul></li><li><p>打开组策略编辑器 (gpedit.msc)。</p></li><li><p>在计算机配置下方,转到 <code>管理模板</code> &gt; <code>Microsoft Edge 更新</code> &gt; <code>应用程序</code>。</p><p><img src="https://i.yecdn.com/images/2020/03/20/8820b5e91a95ff7b8eb38273bf67eaf4.png" alt="mmc_2020-03-20_124202.png"></p><blockquote><p>如果看不到 Microsoft Edge 更新文件夹,请验证步骤 1 是否已正确完成。</p></blockquote></li><li><p>在应用程序下方,双击“ <code>允许 Microsoft Edge 并行浏览器体验</code> ”。 然后再继续执行下一步。</p><p>默认情况下,将这个组策略设置为“ <code>未配置</code> ”,这导致在安装 Microsoft Edge 的新版本后隐藏旧版 Microsoft Edge Legacy。<br>选中 <code>已启用</code>,然后单击确定。</p><p><img src="https://i.yecdn.com/images/2020/03/20/7d8a91d125a5df3687fa912b15037aa6.png" alt="mmc_2020-03-20_121403.png"></p></li></ol><blockquote><p>执行此操作后,便会添加我在方式二中所写的注册表值,当然也可以自行操作</p></blockquote><p>接下来,下载 Stable 渠道的 Microsoft Edge 并进行安装就可以了</p><h1 id="方式二-编辑注册表方式">方式二: 编辑注册表方式</h1><ol><li><p>按下 Win +R 键,输入 regedit 后,打开注册表</p></li><li><p>找到 <code>Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\</code> 目录后,新建一个名为 <code>EdgeUpdate</code> 的项</p><p><img src="https://i.yecdn.com/images/2020/03/20/ebb0e617aafa6b023e20c3348ae5d0d8.png" alt="2020-03-20_123547.png"></p></li><li><p>在 EdgeUpdate 目录下,新建 <code>DWORD(32位) 值</code>,并命名为 <code>Allowsxs</code>,将其键值设置为 <code>1</code></p><p><img src="https://i.yecdn.com/images/2020/03/20/e5378cc5901b2ca4da9fb7a727f63afd.png" alt="regedit_2020-03-20_123817.png"></p></li></ol><h1 id="找回-edge-legacy">找回 Edge Legacy</h1><p>可能有些小伙伴已经安装了新版本的 Microsoft Edge ,那么会直接隐藏掉旧版本的 Microsoft Edge Legacy。</p><p>想要找回 Edge Legacy 的话,我们需要先卸载掉当前系统中的 Edge,然后再执行上面的操作就可以了。</p><h1 id="阻止更新">阻止更新</h1><p>如果不喜欢新版本的 Microsoft Edge,甚至不想让电脑在未来自动更新的话,可以执行如下操作</p><blockquote><p>请务必注意:<br>阻止程序工具包不会阻止用户从 Internet 下载或外部介质手动安装 Microsoft Edge(基于 Chromium)。</p></blockquote><p>你可以从 <a href="https://msedgeblockertoolkit.blob.core.windows.net/blockertoolkit/MicrosoftEdgeChromiumBlockerToolkit.exe">这里</a> 下载阻止程序工具包的可执行文件。</p><p>解压会会得到如下文件</p><p><img src="https://i.yecdn.com/images/2020/03/20/269bc54da3b62467deb7665329fab97c.png" alt="explorer_2020-03-20_130347.png"></p><p>该脚本可在本地计算机或远程目标计算机上创建注册表项,并将关联的值设置为阻止或取消阻止(具体取决于所使用的命令行选项)Microsoft Edge(基于 Chromium)的自动传递。</p><p><strong>注册表项:</strong> <code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\EdgeUpdate</code><br><strong>注册表项名称:</strong> <code>DoNotUpdateToEdgeWithChromium</code></p><table><thead><tr><th style="text-align:center">值</th><th style="text-align:center">结果</th></tr></thead><tbody><tr><td style="text-align:center">未定义注册表项</td><td style="text-align:center">将不会阻止分发。</td></tr><tr><td style="text-align:center">0</td><td style="text-align:center">将不会阻止分发。</td></tr><tr><td style="text-align:center">1</td><td style="text-align:center">将阻止分发。</td></tr></tbody></table><p>此脚本具有以下命令行语法:</p><p><code>EdgeChromium_Blocker.cmd [&lt;machine name&gt;] [/B] [/U] [/H]</code></p><h3 id="计算机名">计算机名</h3><p><machine name> 参数是可选的。 如果未指定,则在本地计算机上执行操作。 否则,将通过 REG 命令的远程注册表功能访问远程计算机。 如果由于安全权限而导致无法访问远程注册表,或者找不到远程计算机,REG 命令将返回一条错误消息。</p><h3 id="开关">开关</h3><p>脚本使用的开关是互斥的,因此将仅对给定命令中的第一个有效开关进行操作。 可在同一台计算机上多次运行该脚本。</p><table><thead><tr><th style="text-align:center">开关</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:center">/B</td><td style="text-align:left">将阻止分发</td></tr><tr><td style="text-align:center">/U</td><td style="text-align:left">将取消阻止分发</td></tr><tr><td style="text-align:center">/H 或者 /?</td><td style="text-align:left">将显示以下摘要帮助:<br> <code>This tool can be used to remotely block or unblock the delivery of Microsoft Edge (Chromium-based) through Automatic Updates.</code> <br><code>Usage:</code> <br><code>EdgeChromium_Blocker.cmd [&lt;machine name&gt;] [/B][/U][/H]</code> <br><code>B = Block Microsoft Edge (Chromium-based) deployment</code> <br><code>U = Allow Microsoft Edge (Chromium-based) deployment</code> <br><code>H = Help</code> <br><code>Examples:</code> <br><code>EdgeChromium_Blocker.cmd mymachine /B (blocks delivery on machine &quot;mymachine&quot;)</code> <br><code>EdgeChromium_Blocker.cmd /U (unblocks delivery on the local machine)</code></td></tr></tbody></table><h1 id="参考链接">参考链接</h1><p><a href="https://blogs.windows.com/msedgedev/2020/01/15/upgrading-new-microsoft-edge-79-chromium/">Upgrading to the new Microsoft Edge</a><br><a href="https://docs.microsoft.com/en-us/deployedge/microsoft-edge-sysupdate-access-old-edge">Access Microsoft Edge Legacy after installing the new version of Microsoft Edge</a><br><a href="https://medium.com/@jeanneewinfield/how-to-run-chromium-edge-and-legacy-edge-together-in-windows-10-fb8ab5928975">How to Run Chromium Edge and Legacy Edge Together in Windows 10</a><br><a href="https://www.askvg.com/tip-how-to-restore-old-legacy-microsoft-edge-browser-after-installing-new-edge-in-windows-10">[Tip] How to Restore Old Legacy Microsoft Edge Browser After Installing New Edge in Windows 10</a><br><a href="https://docs.microsoft.com/en-us/deployedge/microsoft-edge-blocker-toolkit">Blocker Toolkit to disable automatic delivery of Microsoft Edge (Chromium-based)</a></p>]]></content>
  205.    
  206.    <summary type="html">
  207.    
  208.      &lt;p&gt;Edge Chromium 是微软基于 Chromium 内核的一款浏览器,并于今年年初发布正式版,微软在其博客中表示会在未来的版本中替换掉目前的 Edge Legacy,那么要怎么同时保留两个版本呢?&lt;/p&gt;
  209.    
  210.    </summary>
  211.    
  212.    
  213.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  214.    
  215.    
  216.      <category term="Windows" scheme="https://www.wevg.org/tags/Windows/"/>
  217.    
  218.      <category term="Regedit" scheme="https://www.wevg.org/tags/Regedit/"/>
  219.    
  220.      <category term="Edge" scheme="https://www.wevg.org/tags/Edge/"/>
  221.    
  222.      <category term="Chrome" scheme="https://www.wevg.org/tags/Chrome/"/>
  223.    
  224.  </entry>
  225.  
  226.  <entry>
  227.    <title>解决 Windows 下使用 Yubikey GPG 签名找不到密钥的问题</title>
  228.    <link href="https://www.wevg.org/archives/gpg-yubikey-windows-no-key/"/>
  229.    <id>https://www.wevg.org/archives/gpg-yubikey-windows-no-key/</id>
  230.    <published>2020-03-19T01:45:00.000Z</published>
  231.    <updated>2020-03-19T01:45:00.000Z</updated>
  232.    
  233.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>在 Windows 尝试使用 Yubikey 进行给 Git 进行 GPG 签名的时候便遇到了这个问题,,也算是困扰了我蛮长的一段时间了,终于找到了解决办法</p><span id="more"></span><h1 id="错误信息">错误信息</h1><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><code class="hljs bash">gpg: signing failed: No secret key<br>error: gpg failed to sign the data<br>fatal: failed to write commit object<br></code></pre></td></tr></table></figure><h1 id="解决办法">解决办法</h1><p>在 cmd 或者 Powershell 中输入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">git config --global gpg.program <span class="hljs-string">&quot;C:\Program Files (x86)\GnuPG\bin\gpg.exe&quot;</span><br></code></pre></td></tr></table></figure><blockquote><p>此处的程序所在位置可能会根据每个人的安装地址发生改变,还需要根据个人情况自行调整</p></blockquote><p>接下来,再 commit 的时候就不会再报错啦~ 开心 o(<em> ̄▽ ̄</em>)ブ 啦啦啦~</p><h1 id="参考链接">参考链接</h1><p><a href="https://gist.github.com/jacquesbh/79d3bbf6cdde41800491f55f13c1d8f0">Use Yubikey (GPG key) for SSH</a><br><a href="https://github.com/drduh/YubiKey-Guide">YubiKey-Guide</a><br><a href="https://stackoverflow.com/questions/36810467/git-commit-signing-failed-secret-key-not-available/36811656">git commit signing failed: secret key not available</a><br><a href="https://www.hanselman.com/blog/HowToSetupSignedGitCommitsWithAYubiKeyNEOAndGPGAndKeybaseOnWindows.aspx">How to setup Signed Git Commits with a YubiKey NEO and GPG and Keybase on Windows</a></p>]]></content>
  234.    
  235.    <summary type="html">
  236.    
  237.      &lt;p&gt;在 Windows 尝试使用 Yubikey 进行给 Git 进行 GPG 签名的时候便遇到了这个问题,,也算是困扰了我蛮长的一段时间了,终于找到了解决办法&lt;/p&gt;
  238.    
  239.    </summary>
  240.    
  241.    
  242.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  243.    
  244.    
  245.      <category term="Windows" scheme="https://www.wevg.org/tags/Windows/"/>
  246.    
  247.      <category term="Secure" scheme="https://www.wevg.org/tags/Secure/"/>
  248.    
  249.      <category term="Github" scheme="https://www.wevg.org/tags/Github/"/>
  250.    
  251.      <category term="Tools" scheme="https://www.wevg.org/tags/Tools/"/>
  252.    
  253.      <category term="Shell" scheme="https://www.wevg.org/tags/Shell/"/>
  254.    
  255.      <category term="Yubikey" scheme="https://www.wevg.org/tags/Yubikey/"/>
  256.    
  257.  </entry>
  258.  
  259.  <entry>
  260.    <title>将所有 Git 远程仓库 URL 从 HTTPS 替换成 SSH</title>
  261.    <link href="https://www.wevg.org/archives/git-ssh-instead-of-https/"/>
  262.    <id>https://www.wevg.org/archives/git-ssh-instead-of-https/</id>
  263.    <published>2020-03-19T01:14:39.000Z</published>
  264.    <updated>2020-03-19T01:14:53.000Z</updated>
  265.    
  266.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>自从年初的时候入手了 Yubikey 之后,就在 Github 上配置了安全密匙,随之而来的是在 push 到 Github 的时候不知道自己的密码到底是什么了(直接输入密码会报错),为了掩盖自己是一个垃圾的事实,便想到了让所有的 git 都走 SSH 而不是 HTTPS 的方法</p><span id="more"></span><h2 id="解决方法">解决方法</h2><p>此处以 Github 为例,在命令行中输入以下内容即可 (替换所有的 HTTPS 为 SSH)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">git config --global url.ssh://git@github.com/.insteadOf https://github.com/<br></code></pre></td></tr></table></figure><p>如果有更好的解决办法,欢迎通过各种方式告诉我,比心</p><h2 id="参考内容">参考内容</h2><p><a href="https://help.github.com/cn/github/using-git/changing-a-remotes-url">更改远程仓库的URL - GitHub 帮助 - GitHub Help</a><br><a href="https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-config.html">git-config(1) Manual Page</a><br><a href="https://stackoverflow.com/questions/11200237/how-do-i-get-git-to-default-to-ssh-and-not-https-for-new-repositories">How do I get git to default to ssh and not https for new repositories</a></p><p><a style="background-color:black;color:white;text-decoration:none;padding:4px 6px;font-family:-apple-system, BlinkMacSystemFont, &quot;San Francisco&quot;, &quot;Helvetica Neue&quot;, Helvetica, Ubuntu, Roboto, Noto, &quot;Segoe UI&quot;, Arial, sans-serif;font-size:12px;font-weight:bold;line-height:1.2;display:inline-block;border-radius:3px" href="https://unsplash.com/@harleydavidson?utm_medium=referral&amp;utm_campaign=photographer-credit&amp;utm_content=creditBadge" target="_blank" rel="noopener noreferrer" title="Download free do whatever you want high-resolution photos from Harley-Davidson"><span style="display:inline-block;padding:2px 3px"><svg xmlns="http://www.w3.org/2000/svg" style="height:12px;width:auto;position:relative;vertical-align:middle;top:-2px;fill:white" viewBox="0 0 32 32"><title>unsplash-logo</title><path d="M10 9V0h12v9H10zm12 5h10v18H0V14h10v9h12v-9z"></path></svg></span><span style="display:inline-block;padding:2px 3px">Harley-Davidson</span></a></p>]]></content>
  267.    
  268.    <summary type="html">
  269.    
  270.      &lt;p&gt;自从年初的时候入手了 Yubikey 之后,就在 Github 上配置了安全密匙,随之而来的是在 push 到 Github 的时候不知道自己的密码到底是什么了(直接输入密码会报错),为了掩盖自己是一个垃圾的事实,便想到了让所有的 git 都走 SSH 而不是 HTTPS 的方法&lt;/p&gt;
  271.    
  272.    </summary>
  273.    
  274.    
  275.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  276.    
  277.    
  278.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  279.    
  280.      <category term="Github" scheme="https://www.wevg.org/tags/Github/"/>
  281.    
  282.      <category term="Git" scheme="https://www.wevg.org/tags/Git/"/>
  283.    
  284.  </entry>
  285.  
  286.  <entry>
  287.    <title>将 QQ 音乐歌单导入到其他平台</title>
  288.    <link href="https://www.wevg.org/archives/export-qqmusic-playlist/"/>
  289.    <id>https://www.wevg.org/archives/export-qqmusic-playlist/</id>
  290.    <published>2020-01-22T13:39:29.000Z</published>
  291.    <updated>2020-07-23T01:57:46.000Z</updated>
  292.    
  293.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>我之前发过一篇文章详细介绍过如何将网易云音乐导入到其他平台,然后这两天有朋友问我怎么处理 QQ 音乐,在网络上搜寻一番无果后,这篇文章便应运而生。</p><span id="more"></span><blockquote><p><a href="https://www.wevg.org/archives/netease-to-apple-music/">「导入网易云音乐歌单到 Apple Music」</a><br>首先先引用一下我之前的文章,虽然标题是写 Apple Music 但实际上支持很多主流平台</p></blockquote>    <div id="aplayer-HIsdvYUP" class="aplayer aplayer-tag-marker meting-tag-marker"         data-id="1392089153" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86"    ></div><h2 id="获取歌曲列表">获取歌曲列表</h2><p>首先,在浏览器中打开你的歌单链接。将歌单 id 地址替换到此地址即可获取完整的歌单列表 <a href="https://y.qq.com/musicmac/v6/playlist/detail.html?id=7177076625">https://y.qq.com/musicmac/v6/playlist/detail.html?id=7177076625</a></p><blockquote><p>感谢 @July 的提示</p></blockquote><p>点击 F12 打开 Developer Tools,接下来点击 Console 选项卡,输入这段指令然后同样将链接中 id 的部分替换为歌单的 id 点击回车。接下来便会输出歌单列表了。</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></pre></td><td class="code"><pre><code class="hljs javascript">fetch(<span class="hljs-string">&quot;https://c.y.qq.com/v8/fcg-bin/fcg_v8_playlist_cp.fcg?newsong=1&amp;id=7177076625&amp;format=json&amp;inCharset=GB2312&amp;outCharset=utf-8&quot;</span>).then(<span class="hljs-function"><span class="hljs-params">data</span> =&gt;</span> data.json()).then(<span class="hljs-function"><span class="hljs-params">data</span> =&gt;</span> &#123;<br>    <span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">Array</span>.from(data.data.cdlist).flatMap(<span class="hljs-function"><span class="hljs-params">u</span> =&gt;</span> u.songlist).map(<span class="hljs-function"><span class="hljs-params">m</span> =&gt;</span> m.name + <span class="hljs-string">&quot; - &quot;</span> + <span class="hljs-built_in">Array</span>.from(m.singer).map(<span class="hljs-function"><span class="hljs-params">c</span> =&gt;</span> c.name).reduce(<span class="hljs-function">(<span class="hljs-params">s1, s2</span>) =&gt;</span> s1 + <span class="hljs-string">&quot;,&quot;</span> + s2)).reduce(<span class="hljs-function">(<span class="hljs-params">s1, s2</span>) =&gt;</span> s1 + <span class="hljs-string">&#x27;\n&#x27;</span> + s2))<br>&#125;)<br></code></pre></td></tr></table></figure><blockquote><p>感谢 <a href="http://disq.us/p/284ujt0">@里里昂</a> 的反馈发现因为 QQ 音乐的网页的显示原因,只能获取到列表中的前十首歌</p></blockquote><p>这里以官方歌单做一个演示,复制输出的歌单信息,然后准备导入到其他平台</p><p><img src="https://i.yecdn.com/images/2020/01/22/d9a7bef209edf2a11e14d22d9706cb94.png" alt="d9a7bef209edf2a11e14d22d9706cb94.png"></p><h2 id="导入到其他平台">导入到其他平台</h2><p>这部分的操作其实和之前在 <a href="https://www.wevg.org/archives/netease-to-apple-music/">「导入网易云音乐歌单到 Apple Music」</a> 中说的操作基本一致。</p><p>当然此处还是以导入到 Apple Music 为例:<br>导出歌单后,打开 TuneMyMusic 网站 <a href="https://www.tunemymusic.com/zh-cn/">https://www.tunemymusic.com/zh-cn/</a></p><p>导入来源选择 <strong>从文本</strong> ,目的地选择 <strong>Apple Music</strong> 即可<img src="https://i.yecdn.com/images/2019/01/05/c2fef1211087f3d8c6f94f9a7eda2086.png" alt=""></p><p>接下来,按照网页的提示进行操作即可. 此方法支援的平台有 Spotify, Apple Music, Youtube, Youtube Music, Deezer, Tidal, SoundCloud, KKbox, napster 和 SoundMachine</p><blockquote><p><strong>请注意,每次最多可导入 1000 首歌曲</strong></p></blockquote><p>感谢 <strong>立音</strong>大佬 提供技术支持  (≧▽≦)</p>]]></content>
  294.    
  295.    <summary type="html">
  296.    
  297.      &lt;p&gt;我之前发过一篇文章详细介绍过如何将网易云音乐导入到其他平台,然后这两天有朋友问我怎么处理 QQ 音乐,在网络上搜寻一番无果后,这篇文章便应运而生。&lt;/p&gt;
  298.    
  299.    </summary>
  300.    
  301.    
  302.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  303.    
  304.    
  305.      <category term="Music" scheme="https://www.wevg.org/tags/Music/"/>
  306.    
  307.      <category term="Bat" scheme="https://www.wevg.org/tags/Bat/"/>
  308.    
  309.      <category term="QQ Music" scheme="https://www.wevg.org/tags/QQ-Music/"/>
  310.    
  311.  </entry>
  312.  
  313.  <entry>
  314.    <title>给你的 Hexo 博客添加 CMS</title>
  315.    <link href="https://www.wevg.org/archives/hexo-with-netlify-cms/"/>
  316.    <id>https://www.wevg.org/archives/hexo-with-netlify-cms/</id>
  317.    <published>2020-01-16T21:20:48.672Z</published>
  318.    <updated>2020-01-16T21:20:48.706Z</updated>
  319.    
  320.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>使用 Hexo 来写博客的时候,经常会有想要在线编辑的需求,比如电脑不在身边啦,或等等的情况。一般来说可能都会搭配 CI 来使用(比如说我),当然还有另一种方案,那就是—— CMS(内容管理系统) <span id="more"></span></p><blockquote><p>本文中可能有一部分用词不太准确,请您谅解 (呜呜,中文越来越退步了 ㅠ^</p></blockquote><p>本文将会介绍如何为你的博客集成 Netlify CMS 并在线编辑和发布文章</p><blockquote><p>本文便是使用 Netlify CMS 进行编辑并发布的文章</p></blockquote><h2 id="在-netlify-上发布你的博客">在 Netlify 上发布你的博客</h2><p>首先,你需要将博客上传到 Github 并发布到 Netlify 上</p><p>打开 Netlify 并登录后,点击 <code>New site from Git</code></p><p><img src="/images/uploads/Screenshot_2020-01-17%20Create%20a%20new%20site%20Netlify.png" alt=""></p><p>接下来,在 <code>Build Command</code> 中填写 <code>hexo g</code></p><p><code>Publish directory</code> 的目录则填写 <code>public</code></p><blockquote><p>如果您配置过 CI, 那么此处填写的命令与您之前 CI 的命令则比较类似</p></blockquote><p><img src="/images/uploads/Screenshot_2020-01-17%20Create%20a%20new%20site%20Netlify(1).png" alt=""></p><p>然后找到顶栏的 <code>Settings</code> 页面下的 <code>Identity</code>,点击 <code>Enable Identity</code> 启用身份管理</p><p><img src="/images/uploads/Screenshot_2020-01-17%20Identity%20Settings.png" alt=""></p><p>往下翻,找到 <code>Registration</code> ,将 <code>Open</code> 修改为 <code>Invite Only</code></p><p><img src="/images/uploads/Screenshot_2020-01-17%20Identity%20Settings(1).png" alt=""></p><p>找到 <code>Services</code> 下的 <code>Git Gateway</code> 点击 <code>Enable Git Gateway</code></p><p><img src="/images/uploads/Screenshot_2020-01-17%20Identity%20Settings(2).png" alt=""></p><h2 id="hexo-博客文件的配置">Hexo 博客文件的配置</h2><h3 id="添加-header">添加 Header</h3><p>在博客的 Header 中添加一个 JS</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;https://identity.netlify.com/v1/netlify-identity-widget.js&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><p>接下来,在 <code>source</code> 下 创建一个 <code>admin</code> 目录</p><blockquote><p>这个目录的名称可以自行修改为其他名称,但确保后面操作的时候要和此处的名称一致</p></blockquote><p>创建 <code>index.html</code> 文件并键入如下内容</p><figure class="highlight html"><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><code class="hljs html"><span class="hljs-meta">&lt;!doctype <span class="hljs-meta-keyword">html</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;utf-8&quot;</span> /&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;viewport&quot;</span> <span class="hljs-attr">content</span>=<span class="hljs-string">&quot;width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no&quot;</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">”X-UA-Compatible”</span> <span class="hljs-attr">content</span>=<span class="hljs-string">”IE</span>=<span class="hljs-string">edge,chrome</span>=<span class="hljs-string">1″/</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;apple-mobile-web-app-status-bar-style&quot;</span> <span class="hljs-attr">content</span>=<span class="hljs-string">&quot;white&quot;</span> /&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>CMS<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">&quot;stylesheet&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;https://cdn.jsdelivr.net/npm/netlify-cms@2.10.4/dist/cms.css&quot;</span> /&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;https://identity.netlify.com/v1/netlify-identity-widget.js&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;https://cdn.jsdelivr.net/npm/netlify-cms@2.10.4/dist/netlify-cms.js&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span><br></code></pre></td></tr></table></figure><p>同样,在 <code>admin</code> 目录下 创建 <code>config.yml</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><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><code class="hljs yaml"><span class="hljs-attr">backend:</span><br>  <span class="hljs-attr">name:</span> <span class="hljs-string">git-gateway</span><br>  <span class="hljs-attr">branch:</span> <span class="hljs-string">master</span> <span class="hljs-comment"># Branch to update (optional; defaults to master)</span><br><br><span class="hljs-comment"># This line should *not* be indented</span><br><span class="hljs-attr">publish_mode:</span> <span class="hljs-string">editorial_workflow</span><br><br><span class="hljs-comment"># This line should *not* be indented</span><br><span class="hljs-attr">media_folder:</span> <span class="hljs-string">&quot;source/images/uploads&quot;</span> <span class="hljs-comment"># Media files will be stored in the repo under images/uploads</span><br><span class="hljs-attr">public_folder:</span> <span class="hljs-string">&quot;/images/uploads&quot;</span> <span class="hljs-comment"># The src attribute for uploaded media will begin with /images/uploads</span><br><br><span class="hljs-attr">collections:</span><br>  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;posts&quot;</span> <span class="hljs-comment"># Used in routes, e.g., /admin/collections/blog</span><br>    <span class="hljs-attr">label:</span> <span class="hljs-string">&quot;Post&quot;</span> <span class="hljs-comment"># Used in the UI</span><br>    <span class="hljs-attr">folder:</span> <span class="hljs-string">&quot;source/_posts&quot;</span> <span class="hljs-comment"># The path to the folder where the documents are stored</span><br>    <span class="hljs-attr">create:</span> <span class="hljs-literal">true</span> <span class="hljs-comment"># Allow users to create new documents in this collection</span><br>    <span class="hljs-attr">slug:</span> <span class="hljs-string">&quot;<span class="hljs-template-variable">&#123;&#123;slug&#125;&#125;</span>&quot;</span> <span class="hljs-comment"># Filename template, e.g., YYYY-MM-DD-title.md</span><br>    <span class="hljs-attr">fields:</span> <span class="hljs-comment"># The fields for each document, usually in front matter</span><br>      <span class="hljs-bullet">-</span> &#123;<span class="hljs-attr">label:</span> <span class="hljs-string">&quot;Layout&quot;</span>, <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;layout&quot;</span>, <span class="hljs-attr">widget:</span> <span class="hljs-string">&quot;hidden&quot;</span>, <span class="hljs-attr">default:</span> <span class="hljs-string">&quot;blog&quot;</span>&#125;<br>      <span class="hljs-bullet">-</span> &#123;<span class="hljs-attr">label:</span> <span class="hljs-string">&quot;Title&quot;</span>, <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;title&quot;</span>, <span class="hljs-attr">widget:</span> <span class="hljs-string">&quot;string&quot;</span>&#125;<br>      <span class="hljs-bullet">-</span> &#123;<span class="hljs-attr">label:</span> <span class="hljs-string">&quot;Publish Date&quot;</span>, <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;date&quot;</span>, <span class="hljs-attr">widget:</span> <span class="hljs-string">&quot;datetime&quot;</span>&#125;<br>      <span class="hljs-bullet">-</span> &#123;<span class="hljs-attr">label:</span> <span class="hljs-string">&quot;Updated Date&quot;</span>, <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;updated&quot;</span>, <span class="hljs-attr">widget:</span> <span class="hljs-string">&quot;datetime&quot;</span>&#125;<br>      <span class="hljs-bullet">-</span> &#123;<span class="hljs-attr">label:</span> <span class="hljs-string">&quot;Featured Image&quot;</span>, <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;thumbnail&quot;</span>, <span class="hljs-attr">widget:</span> <span class="hljs-string">&quot;string&quot;</span>&#125;<br>      <span class="hljs-bullet">-</span> &#123;<span class="hljs-attr">label:</span> <span class="hljs-string">&quot;abbrlink&quot;</span>, <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;abbrlink&quot;</span>, <span class="hljs-attr">widget:</span> <span class="hljs-string">&quot;string&quot;</span>&#125;<br>      <span class="hljs-bullet">-</span> &#123;<span class="hljs-attr">label:</span> <span class="hljs-string">&quot;Tags&quot;</span>, <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;tags&quot;</span>, <span class="hljs-attr">widget:</span> <span class="hljs-string">&quot;list&quot;</span>&#125;<br>      <span class="hljs-bullet">-</span> &#123;<span class="hljs-attr">label:</span> <span class="hljs-string">&quot;Categories&quot;</span>, <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;categories&quot;</span>, <span class="hljs-attr">widget:</span> <span class="hljs-string">&quot;list&quot;</span>&#125;<br>      <span class="hljs-bullet">-</span> &#123;<span class="hljs-attr">label:</span> <span class="hljs-string">&quot;TOC&quot;</span>, <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;toc&quot;</span>, <span class="hljs-attr">widget:</span> <span class="hljs-string">&quot;boolean&quot;</span>, <span class="hljs-attr">default:</span> <span class="hljs-literal">true</span>&#125;<br>      <span class="hljs-bullet">-</span> &#123;<span class="hljs-attr">label:</span> <span class="hljs-string">&quot;Body&quot;</span>, <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;body&quot;</span>, <span class="hljs-attr">widget:</span> <span class="hljs-string">&quot;markdown&quot;</span>&#125;<br></code></pre></td></tr></table></figure><p>在博客的配置文件 <code>_config.yml</code> 文件中的 <code>skip_render</code> 下添加</p><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs avrasm"><span class="hljs-symbol">skip_render:</span><br>  - admin<span class="hljs-comment">/*</span><br></code></pre></td></tr></table></figure><h2 id="创建-cms-帐号">创建 CMS 帐号</h2><p>接下来,我们开始创建 CMS 的帐号。在 <code>Identify</code> 页面点击 <code>Invite user</code></p><p><img src="/images/uploads/invite-user.png" alt=""></p><p>输入你的邮箱之后,点击确定</p><p><img src="/images/uploads/invite-user-2.png" alt=""></p><p>如果一切正常的话,此时你会顺利地在邮箱里收到一个邮件</p><p><img src="/images/uploads/Screenshot_2020-01-17Outlook.png" alt=""></p><p>点击邮件中的链接,并设置密码后,访问 <code>/admin</code> 目录</p><p><img src="/images/uploads/Screenshot_2020-01-17%20Hexo.png" alt=""></p><p>这时没问题的话,你应该能顺利的看到你的博客上的文章了</p><p><img src="/images/uploads/Screenshot_2020-01-17CMS.png" alt=""></p><p>接下来便可以对博客上的文章进行编辑了</p><p><img src="/images/uploads/Screenshot_2020-01-17CMS(1).png" alt=""></p><h2 id="参考内容">参考内容</h2><ul><li><a href="https://templates.netlify.com/template/hexo-starter-theme-material/">Hexo starter with Netlify CMS and redirects</a></li><li><a href="https://www.dnocm.com/articles/beechnut/hexo-netlify-cms/">Hexo Netlify CMS</a></li><li><a href="https://42one.xyz/2019/07/24/blogdesign/">博客写作攻略 --Hexo+Github+Netlify+CMS</a></li><li><a href="https://github.com/netlify-templates/hexo-cms-example">netlify-templates/hexo-cms-example</a></li><li><a href="https://blog.indexyz.me/archives/netlify-cms-in-blog/">使用 Netlify CMS 作为博客的 CMS</a></li><li><a href="https://www.netlifycms.org/docs/gatsby/">Gatsby | Netlify CMS | Open-Source Content Management System</a></li><li><a href="https://www.netlifycms.org/docs/configuration-options/#collections">Configuration Options | Netlify CMS | Open-Source Content Management System</a></li><li><a href="https://github.com/netlify/netlify-cms">netlify/netlify-cms</a></li></ul>]]></content>
  321.    
  322.    <summary type="html">
  323.    
  324.      &lt;p&gt;使用 Hexo 来写博客的时候,经常会有想要在线编辑的需求,比如电脑不在身边啦,或等等的情况。一般来说可能都会搭配 CI 来使用(比如说我),当然还有另一种方案,那就是—— CMS(内容管理系统)
  325.    
  326.    </summary>
  327.    
  328.    
  329.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  330.    
  331.    
  332.      <category term="Hexo" scheme="https://www.wevg.org/tags/Hexo/"/>
  333.    
  334.      <category term="Netlify" scheme="https://www.wevg.org/tags/Netlify/"/>
  335.    
  336.      <category term="CMS" scheme="https://www.wevg.org/tags/CMS/"/>
  337.    
  338.      <category term="Config" scheme="https://www.wevg.org/tags/Config/"/>
  339.    
  340.  </entry>
  341.  
  342.  <entry>
  343.    <title>接收短信并转发至 Telegram</title>
  344.    <link href="https://www.wevg.org/archives/sms2tg/"/>
  345.    <id>https://www.wevg.org/archives/sms2tg/</id>
  346.    <published>2020-01-13T08:15:34.000Z</published>
  347.    <updated>2022-01-22T03:59:34.000Z</updated>
  348.    
  349.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>尽管可以利用闲置安卓手机加 IFTTT 实现接收短信并转发至 Telegram 的操作,但是还是没有自己制作的更让自己满意,毕竟自己的一些奇思妙想是其无法直接实现的。<span id="more"></span></p><h2 id="使用的设备">使用的设备</h2><ul><li>Raspberry 3B+</li><li>Air720H (理论上同样支持其他模块)</li></ul><blockquote><p>树莓派是白嫖 Peter 的  ヽ(‘ ∇‘ )ノ</p></blockquote><h2 id="使用的程序">使用的程序</h2><ul><li>NodeJS (可以替换为一切语言,甚至仅使用 bash 脚本也是可行的)</li><li>Yarn</li><li>Gammu</li></ul><p>树莓派的系统版本为 <code>Raspbian</code></p><p><img src="https://i.yecdn.com/images/2020/01/13/e615ac425de6726037549bd232218ec8.png" alt="e615ac425de6726037549bd232218ec8.png"></p><h2 id="使用的接口">使用的接口</h2><ul><li>Telegram Bot</li><li>腾讯云短信接口 (可移除,或替换为其他平台)</li></ul><h2 id="准备过程">准备过程</h2><p>首先将模块与树莓派连接好之后,<code>lsusb</code> 就会看到相应的设备了因为我是用 USB2TTL 来进行连接,所以此处看到的设备为</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">Bus 001 Device 038: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter<br></code></pre></td></tr></table></figure><p>接下来,在 <code>/dev</code> 目录下找到对应的 <code>ttyUSB</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ls /dev/ttyUSB*<br></code></pre></td></tr></table></figure><p>因为我只插了这一个 USB 设备,所以很容易确定对应的地址为 <code>/dev/ttyUSB0</code></p><blockquote><p>从此处开始,以 root 身份进行操作</p></blockquote><h3 id="安装与配置-gammu">安装与配置 Gammu</h3><blockquote><p>从此处开始,以 root 身份进行操作</p></blockquote><p>接下来,开始安装 Gammu</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">apt install gammu<br></code></pre></td></tr></table></figure><p>使用 <code>gammu-config</code> 来进行配置</p><blockquote><p>根据设备的不同配置可能会略有不同</p></blockquote><p>将 <code>Port</code> 修改为 <code>/dev/ttyUSB0</code><br>将 <code>Connection</code> 修改为 <code>at115200</code></p><p><img src="https://i.yecdn.com/images/2020/01/13/398c9e9887a39cef6f690c0063d326fa.png" alt="398c9e9887a39cef6f690c0063d326fa.png"></p><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><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><code class="hljs bash">gammu --identify<br><br>Device               : /dev/ttyUSB0<br>Manufacturer         : <span class="hljs-string">&quot;AirM2M&quot;</span><br>Model                : unknown (Air720H)<br>Firmware             : <span class="hljs-string">&quot;AirM2M_720H_V1381_LTE_AT&quot;</span><br>IMEI                 : ×××××××××××××××<br>SIM IMSI             : ×××××××××××××××<br></code></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><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;test&quot;</span> | gammu sendsms TEXT 手机号<br><br>If you want <span class="hljs-built_in">break</span>, press Ctrl+C...<br>Sending SMS 1/1....waiting <span class="hljs-keyword">for</span> network answer..OK, message reference=44<br></code></pre></td></tr></table></figure><p>如果没问题的话,你应该会顺利收到自己发出的短信了</p><h3 id="安装-nodejs-可选">安装 NodeJS (可选)</h3><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><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash">curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -<br>apt install gcc g++ make<br>curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt add -<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;deb https://dl.yarnpkg.com/debian/ stable main&quot;</span> | sudo tee /etc/apt/sources.list.d/yarn.list<br>apt update<br>apt install yarn nodejs<br></code></pre></td></tr></table></figure><h3 id="安装与配置-gammu-smsd">安装与配置 Gammu-smsd</h3><p>安装 <code>gammu-smsd</code></p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">apt-<span class="hljs-builtin-name">get</span> install gammu-smsd -y<br></code></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></pre></td><td class="code"><pre><code class="hljs pgsql">systemctl <span class="hljs-keyword">start</span> gammu-smsd<br>systemctl <span class="hljs-keyword">enable</span> gammu-smsd<br></code></pre></td></tr></table></figure><p>编辑 <code>/etc/gammu-smsdrc</code> 文件</p><blockquote><p>其中部分内容需要根据个人情况进行修改</p></blockquote><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><code class="hljs conf">[gammu]<br><br>port = /dev/ttyUSB0<br>connection = at115200<br># Debugging<br>#logformat = textall<br><br># SMSD configuration, see gammu-smsdrc(5)<br>[smsd]<br>service = files<br>logfile = syslog<br># Increase for debugging information<br>debuglevel = 0<br>RunOnReceive=/root/gammu/index.js<br>hangupcalls = 1<br>RunOnIncomingCall=/root/gammu/call.js<br><br><br># Paths where messages are stored<br>inboxpath = /var/spool/gammu/inbox/<br>outboxpath = /var/spool/gammu/outbox/<br>sentsmspath = /var/spool/gammu/sent/<br>errorsmspath = /var/spool/gammu/error/<br></code></pre></td></tr></table></figure><p>接下来,在 <code>/root/gammu</code> 下创建 <code>package.json</code></p><blockquote><p>这部分可以替换为下面 bash 方案的内容</p></blockquote><figure class="highlight json"><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><code class="hljs json">&#123;<br>  <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;gammu-telegram&quot;</span>,<br>  <span class="hljs-attr">&quot;version&quot;</span>: <span class="hljs-string">&quot;1.0.0&quot;</span>,<br>  <span class="hljs-attr">&quot;main&quot;</span>: <span class="hljs-string">&quot;index.js&quot;</span>,<br>  <span class="hljs-attr">&quot;license&quot;</span>: <span class="hljs-string">&quot;MIT&quot;</span>,<br>  <span class="hljs-attr">&quot;dependencies&quot;</span>: &#123;<br>    <span class="hljs-attr">&quot;axios&quot;</span>: <span class="hljs-string">&quot;^0.25.0&quot;</span>,<br>    <span class="hljs-attr">&quot;qcloudsms_js&quot;</span>: <span class="hljs-string">&quot;^0.1.1&quot;</span>,<br>    <span class="hljs-attr">&quot;socks-proxy-agent&quot;</span>: <span class="hljs-string">&quot;^4.0.1&quot;</span><br>  &#125;<br>&#125;<br></code></pre></td></tr></table></figure><p>创建并编辑 <code>index.js</code> 文件</p><blockquote><p>其中部分内容需要根据个人情况进行修改</p></blockquote><figure class="highlight js"><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></pre></td><td class="code"><pre><code class="hljs js"><span class="hljs-meta">#!/usr/bin/node</span><br><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;fs&#x27;</span>)<br><span class="hljs-keyword">const</span> path = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;path&#x27;</span>)<br><span class="hljs-keyword">const</span> axios = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;axios&#x27;</span>)<br><span class="hljs-keyword">const</span> SocksProxyAgent = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;socks-proxy-agent&#x27;</span>)<br><span class="hljs-keyword">const</span> botToken = <span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span><br><span class="hljs-keyword">const</span> chatId = *****[REPLACE×THIS×PART]*****<br><span class="hljs-keyword">const</span> proxyOptions = <span class="hljs-string">&#x27;socks5://127.0.0.1:1080&#x27;</span><br><span class="hljs-keyword">const</span> httpsAgent = <span class="hljs-keyword">new</span> SocksProxyAgent(proxyOptions)<br><span class="hljs-keyword">const</span> client = axios.create(&#123; <span class="hljs-attr">baseURL</span>: <span class="hljs-string">`https://api.telegram.org/bot<span class="hljs-subst">$&#123;botToken&#125;</span>`</span>, httpsAgent&#125;)<br><span class="hljs-keyword">const</span> &#123;SMS_1_NUMBER&#125; = process.env<br><span class="hljs-keyword">let</span> smsData = <span class="hljs-string">&#x27;&#x27;</span><br>process.argv.slice(<span class="hljs-number">2</span>).forEach(<span class="hljs-function"><span class="hljs-params">element</span> =&gt;</span><br>    smsData += fs.readFileSync(<span class="hljs-string">`/var/spool/gammu/inbox/<span class="hljs-subst">$&#123;element&#125;</span>`</span> ,&#123;<span class="hljs-attr">encoding</span>:<span class="hljs-string">&#x27;utf8&#x27;</span>, <span class="hljs-attr">flag</span>:<span class="hljs-string">&#x27;r&#x27;</span>&#125;))<br><br><span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">main</span>(<span class="hljs-params"></span>) </span>&#123;<br>  <span class="hljs-keyword">await</span> client.post(<span class="hljs-string">&#x27;/sendMessage&#x27;</span>, &#123;<br>    <span class="hljs-attr">chat_id</span>: chatId,<br>    <span class="hljs-attr">text</span>: <span class="hljs-string">&quot;Phone Number: &quot;</span> + SMS_1_NUMBER + <span class="hljs-string">&quot;\n&quot;</span> + <span class="hljs-string">&quot;Tag: #sms\nData: &quot;</span> + smsData + <span class="hljs-string">&quot;&quot;</span>,<br>    <span class="hljs-attr">parse_mode</span>: <span class="hljs-string">&#x27;Markdown&#x27;</span><br><br>  &#125;)<br>&#125;<br><br>main()<br>  .catch(<span class="hljs-function"><span class="hljs-params">err</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(err))<br></code></pre></td></tr></table></figure><p>创建并编辑 <code>call.js</code> 文件</p><blockquote><p>其中部分内容需要根据个人情况进行修改</p></blockquote><figure class="highlight js"><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></pre></td><td class="code"><pre><code class="hljs js"><span class="hljs-meta">#!/usr/bin/node</span><br><br><span class="hljs-keyword">var</span> QcloudSms = <span class="hljs-built_in">require</span>(<span class="hljs-string">&quot;qcloudsms_js&quot;</span>);<br><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;fs&#x27;</span>)<br><span class="hljs-keyword">const</span> path = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;path&#x27;</span>)<br><span class="hljs-keyword">const</span> axios = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;axios&#x27;</span>)<br><span class="hljs-keyword">const</span> SocksProxyAgent = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;socks-proxy-agent&#x27;</span>)<br><span class="hljs-keyword">const</span> botToken = <span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span><br><span class="hljs-keyword">const</span> chatId = *****[REPLACE×THIS×PART]*****<br><span class="hljs-keyword">const</span> proxyOptions = <span class="hljs-string">&#x27;socks5://127.0.0.1:1080&#x27;</span><br><span class="hljs-keyword">const</span> httpsAgent = <span class="hljs-keyword">new</span> SocksProxyAgent(proxyOptions)<br><span class="hljs-keyword">const</span> client = axios.create(&#123; <span class="hljs-attr">baseURL</span>: <span class="hljs-string">`https://api.telegram.org/bot<span class="hljs-subst">$&#123;botToken&#125;</span>`</span>, httpsAgent&#125;)<br><span class="hljs-keyword">const</span> INCOMING_NUMBER = process.argv.slice()[<span class="hljs-number">2</span>];<br><br><span class="hljs-keyword">var</span> appid = *****[REPLACE×THIS×PART]*****;<br><span class="hljs-keyword">var</span> appkey = <span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span>;<br><span class="hljs-keyword">var</span> templateId = *****[REPLACE×THIS×PART]*****;<br><span class="hljs-keyword">var</span> smsSign = <span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span>;<br><span class="hljs-keyword">var</span> qcloudsms = QcloudSms(appid, appkey);<br><span class="hljs-keyword">var</span> ssender = qcloudsms.SmsSingleSender();<br><span class="hljs-keyword">var</span> params = [];<br><span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">main</span>(<span class="hljs-params"></span>) </span>&#123;<br>  <span class="hljs-keyword">await</span> client.post(<span class="hljs-string">&#x27;/sendMessage&#x27;</span>, &#123;<br>    <span class="hljs-attr">chat_id</span>: chatId,<br>    <span class="hljs-attr">text</span>: <span class="hljs-string">&quot;Phone Number: `&quot;</span> + INCOMING_NUMBER + <span class="hljs-string">&quot;`\n&quot;</span> + <span class="hljs-string">&quot;Tag: #call&quot;</span>,<br>    <span class="hljs-attr">parse_mode</span>: <span class="hljs-string">&#x27;Markdown&#x27;</span><br>  &#125;)<br>ssender.sendWithParam(<span class="hljs-string">&quot;86&quot;</span>, INCOMING_NUMBER, templateId,<br>params, smsSign, <span class="hljs-string">&quot;&quot;</span>, <span class="hljs-string">&quot;&quot;</span>, callback);<br><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">callback</span>(<span class="hljs-params">err, res, resData</span>) </span>&#123;<br>  <span class="hljs-keyword">if</span> (err) &#123;<br>        client.post(<span class="hljs-string">&#x27;/sendMessage&#x27;</span>, &#123;<br>    <span class="hljs-attr">chat_id</span>: chatId,<br>    <span class="hljs-attr">text</span>: <span class="hljs-string">&quot;Err: `&quot;</span> + err + <span class="hljs-string">&quot;`\n&quot;</span> + <span class="hljs-string">&quot;Tag: #error&quot;</span>,<br>    <span class="hljs-attr">parse_mode</span>: <span class="hljs-string">&#x27;Markdown&#x27;</span><br>  &#125;)<br>  &#125;<br>&#125;<br>&#125;<br><br>main()<br>  .catch(<span class="hljs-function"><span class="hljs-params">err</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(err))<br></code></pre></td></tr></table></figure><p>接下来,安装 dependence</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><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">yarn install<br><br>chmod +x index.js<br>chmod +x call.js<br></code></pre></td></tr></table></figure><p>然后收到短信时,自动将短信转发至 Telegram。来电时,挂断电话,将来电人信息转发至 Telegram,并通过短信接口给来电者返回短信通知。</p><h3 id="bash-方案">bash 方案</h3><p>这是我目前在使用的方案,相较 NodeJS 的玩法算是更加的轻量化了。不再需要安装 NodeJS, 操作方式如下。</p><p>创建并编辑 <code>/usr/local/bin/sms2tg-sms</code> 文件</p><blockquote><p>其中部分内容需要根据个人情况进行修改<br>httpie 的部分, 可以替换为 curl 等</p></blockquote><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><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></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><br><span class="hljs-built_in">set</span> -e<br><br>BOT_TOKEN=<span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span><br>CHAT_ID=<span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span><br><br><span class="hljs-keyword">if</span> [ -z <span class="hljs-string">&quot;<span class="hljs-variable">$SMS_MESSAGES</span>&quot;</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">exit</span> 1<br><span class="hljs-keyword">fi</span><br><br>SMS_NUMBER=<span class="hljs-string">&quot;<span class="hljs-variable">$SMS_1_NUMBER</span>&quot;</span><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> `seq <span class="hljs-variable">$SMS_MESSAGES</span>` ; <span class="hljs-keyword">do</span><br>    <span class="hljs-built_in">eval</span> <span class="hljs-string">&quot;SMS_TEXT=\&quot;\$&#123;SMS_TEXT&#125;\$&#123;SMS_<span class="hljs-variable">$&#123;i&#125;</span>_TEXT&#125;\&quot;&quot;</span><br><span class="hljs-keyword">done</span><br><br>TEXT=<span class="hljs-string">&quot;#SMS&quot;</span>$<span class="hljs-string">&#x27;\n&#x27;</span><span class="hljs-string">&quot;From: <span class="hljs-variable">$&#123;SMS_NUMBER&#125;</span>&quot;</span>$<span class="hljs-string">&#x27;\n&#x27;</span><span class="hljs-string">&quot;<span class="hljs-variable">$&#123;SMS_TEXT&#125;</span>&quot;</span><br><br>http --ignore-stdin --follow --timeout 3600 POST <span class="hljs-string">&quot;https://api.telegram.org/bot<span class="hljs-variable">$&#123;BOT_TOKEN&#125;</span>/sendMessage&quot;</span> chat_id=<span class="hljs-string">&quot;<span class="hljs-variable">$CHAT_ID</span>&quot;</span> text=<span class="hljs-string">&quot;<span class="hljs-variable">$TEXT</span>&quot;</span> parse_mode=Markdown 0&lt;/dev/null<br></code></pre></td></tr></table></figure><p>创建并编辑 <code>/usr/local/bin/sms2tg-call</code> 文件</p><blockquote><p>其中部分内容需要根据个人情况进行修改</p></blockquote><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><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></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><br><span class="hljs-built_in">set</span> -e<br><br>BOT_TOKEN=<span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span><br>CHAT_ID=<span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span><br><br>SMS_NUMBER=<span class="hljs-string">&quot;<span class="hljs-variable">$1</span>&quot;</span><br><br>TEXT=<span class="hljs-string">&quot;#Call&quot;</span>$<span class="hljs-string">&#x27;\n&#x27;</span><span class="hljs-string">&quot;From: <span class="hljs-variable">$&#123;SMS_NUMBER&#125;</span>&quot;</span><br><br>http --ignore-stdin <span class="hljs-string">&quot;https://api.telegram.org/bot<span class="hljs-variable">$&#123;BOT_TOKEN&#125;</span>/sendMessage&quot;</span> chat_id=<span class="hljs-string">&quot;<span class="hljs-variable">$CHAT_ID</span>&quot;</span> text=<span class="hljs-string">&quot;<span class="hljs-variable">$TEXT</span>&quot;</span> parse_mode=Markdown 0&lt;/dev/null<br></code></pre></td></tr></table></figure><p>接下来,修改 <code>/etc/gammu-smsdrc</code> 文件如下</p><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><code class="hljs conf"># Configuration file for Gammu SMS Daemon<br><br># Gammu library configuration, see gammurc(5)<br>[gammu]<br># Please configure this!<br>port = /dev/ttyUSB0<br>connection = at115200<br># Debugging<br>logformat = textall<br><br># SMSD configuration, see gammu-smsdrc(5)<br>[smsd]<br>service = files<br>logfile = syslog<br># Increase for debugging information<br>debuglevel = 0<br>RunOnReceive=/usr/local/bin/sms2tg-sms<br>hangupcalls = 1<br>RunOnIncomingCall=/usr/local/bin/sms2tg-call<br><br># Paths where messages are stored<br>inboxpath = /var/spool/gammu/inbox/<br>outboxpath = /var/spool/gammu/outbox/<br>sentsmspath = /var/spool/gammu/sent/<br>errorsmspath = /var/spool/gammu/error/<br></code></pre></td></tr></table></figure><p>最后,执行 <code>chmod +x /usr/local/bin/sms2tg-&#123;sms,call&#125;</code> 即可</p><p>如果您有更棒的方案,欢迎留言告诉我~</p><h2 id="原本的执行方式-过时">原本的执行方式(过时)</h2><blockquote><p>因为 Python 2 已经于 2020年1月1日寿命已经终结,所以此部分理论上已经过时</p></blockquote><blockquote><p>感谢 @Peter 提供技术支持</p></blockquote><h3 id="使用的程序-v2">使用的程序</h3><ul><li>Python 2</li><li>python-pip</li></ul><h3 id="安装必要模块">安装必要模块</h3><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs cmake">pip <span class="hljs-keyword">install</span> python-gsmmodem-new<br>pip <span class="hljs-keyword">install</span> qcloudsms_py<br></code></pre></td></tr></table></figure><h3 id="修改-python-package">修改 Python package</h3><p>因为这个包已经很久不更新,而且在 Python 3 下运行存在问题,所以我们需要做一些修改</p><p><code>/usr/local/lib/python2.7/dist-packages/gsmmodem</code></p><p>修改 <code>modem.py</code> 文件的以下部分,当然我也在下方提供了修改后的版本,替换即可</p><p>57 行</p><figure class="highlight reasonml"><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></pre></td><td class="code"><pre><code class="hljs reasonml">def <span class="hljs-constructor">__init__(<span class="hljs-params">self</span>, <span class="hljs-params">gsmModem</span>, <span class="hljs-params">status</span>, <span class="hljs-params">number</span>, <span class="hljs-params">time</span>, <span class="hljs-params">text</span>, <span class="hljs-params">smsc</span>=None, <span class="hljs-params">udh</span>=[])</span>:<br>    super(ReceivedSms, self).<span class="hljs-constructor">__init__(<span class="hljs-params">number</span>, <span class="hljs-params">text</span>, <span class="hljs-params">smsc</span>)</span><br>    self._gsmModem = weakref.proxy(gsmModem)<br>    self.status = status<br>    self.time = time<br>    self.udh = udh<br></code></pre></td></tr></table></figure><p>132 行</p><figure class="highlight taggerscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs taggerscript">CLIP_REGEX = re.compile(&#x27;^<span class="hljs-symbol">\+</span>CLIP:<span class="hljs-symbol">\s</span>*<span class="hljs-symbol">\+</span>&#123;0,1&#125;(<span class="hljs-symbol">\d</span>+),<span class="hljs-symbol">\s</span>*(<span class="hljs-symbol">\d</span>+).*$&#x27;)<br></code></pre></td></tr></table></figure><p>1117 行</p><figure class="highlight reasonml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs reasonml">messages.append(<span class="hljs-constructor">ReceivedSms(<span class="hljs-params">self</span>, Sms.TEXT_MODE_STATUS_MAP[<span class="hljs-params">msgStatus</span>], <span class="hljs-params">number</span>, <span class="hljs-params">parseTextModeTimeStr</span>(<span class="hljs-params">msgTime</span>)</span>, msgText))<br></code></pre></td></tr></table></figure><p>1127 行</p><figure class="highlight reasonml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs reasonml">messages.append(<span class="hljs-constructor">ReceivedSms(<span class="hljs-params">self</span>, Sms.TEXT_MODE_STATUS_MAP[<span class="hljs-params">msgStatus</span>], <span class="hljs-params">number</span>, <span class="hljs-params">parseTextModeTimeStr</span>(<span class="hljs-params">msgTime</span>)</span>, msgText))<br></code></pre></td></tr></table></figure><p>1151 行</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stylus">sms = ReceivedSms(self, int(msgStat), smsDict<span class="hljs-selector-attr">[<span class="hljs-string">&#x27;number&#x27;</span>]</span>, smsDict<span class="hljs-selector-attr">[<span class="hljs-string">&#x27;time&#x27;</span>]</span>, smsDict<span class="hljs-selector-attr">[<span class="hljs-string">&#x27;text&#x27;</span>]</span>, smsDict<span class="hljs-selector-attr">[<span class="hljs-string">&#x27;smsc&#x27;</span>]</span>, smsDict<span class="hljs-selector-class">.get</span>(<span class="hljs-string">&#x27;udh&#x27;</span>, <span class="hljs-selector-attr">[]</span>))<br></code></pre></td></tr></table></figure><p>1245 行</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs vim">lines.<span class="hljs-keyword">pop</span>(<span class="hljs-number">0</span>) # Workaround <span class="hljs-keyword">for</span> failing <span class="hljs-keyword">to</span> <span class="hljs-built_in">get</span> phone <span class="hljs-keyword">number</span><br></code></pre></td></tr></table></figure><p>1266 行</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">callerNumber</span> = clipMatch.group(<span class="hljs-number">1</span>)<br></code></pre></td></tr></table></figure><p>1384 行</p><figure class="highlight reasonml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs reasonml">self.sms<span class="hljs-constructor">StatusReportCallback(<span class="hljs-params">report</span>)</span><br></code></pre></td></tr></table></figure><p>1403 行</p><figure class="highlight kotlin"><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><code class="hljs kotlin"><span class="hljs-keyword">else</span>:<br>    # <span class="hljs-built_in">Nothing</span> <span class="hljs-keyword">is</span> waiting <span class="hljs-keyword">for</span> <span class="hljs-keyword">this</span> report directly - use callback<br>    self.smsStatusReportCallback(report)<br></code></pre></td></tr></table></figure><p>修改后的文件 <a href="/source/modem.py.new">下载链接</a></p><h3 id="python-文件部分">Python 文件部分</h3><p>将下方内容写入 <code>sms.py</code></p><blockquote><p>收到短信时,自动将短信转发至 Telegram。来电时,挂断电话,将来电人信息转发至 Telegram,并通过短信接口给来电者返回短信通知。</p></blockquote><p>此处使用的短信接口为腾讯云,可替换为其他提供商。</p><blockquote><p>请自行替换其中的数据部分</p></blockquote><figure class="highlight python"><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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> gsmmodem.exceptions <span class="hljs-keyword">import</span> InterruptedException <br><span class="hljs-keyword">import</span> logging <br><span class="hljs-keyword">import</span> telegram <br><span class="hljs-keyword">import</span> time<br><span class="hljs-keyword">from</span> qcloudsms_py <span class="hljs-keyword">import</span> SmsSingleSender<br><span class="hljs-keyword">from</span> qcloudsms_py.httpclient <span class="hljs-keyword">import</span> HTTPError<br><br><br>bot = telegram.Bot(token=<span class="hljs-string">&#x27;*****[REPLACE×THIS×PART]*****&#x27;</span>, base_url=<span class="hljs-string">&#x27;https://api.telegram.org/bot&#x27;</span>)<br>appid = *****[REPLACE×THIS×PART]*****<br>appkey = <span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span><br>phone_number = <span class="hljs-number">0</span><br><br><br>PORT = <span class="hljs-string">&#x27;/dev/ttyUSB0&#x27;</span><br>BAUDRATE = <span class="hljs-number">115200</span><br>PIN = <span class="hljs-literal">None</span> <span class="hljs-comment"># SIM card PIN (if any)</span><br><br><span class="hljs-keyword">from</span> gsmmodem.modem <span class="hljs-keyword">import</span> GsmModem<br><br><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">handleSms</span>(<span class="hljs-params">sms</span>):</span><br>    logging.info(<span class="hljs-string">b&#x27;== SMS message received ==\nFrom: &#123;0&#125;\nTime: &#123;1&#125;\nMessage:\n&#123;2&#125;\n&#x27;</span>.<span class="hljs-built_in">format</span>(sms.number, sms.time, sms.text.encode(<span class="hljs-string">&#x27;utf-8&#x27;</span>)))<br>    bot.send_message(<span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span>, <span class="hljs-string">b&#x27;&#123;0&#125;\n\nFrom &#123;1&#125;\n&#x27;</span>.<span class="hljs-built_in">format</span>(sms.text.encode(<span class="hljs-string">&#x27;utf-8&#x27;</span>), sms.number, sms.time))<br><br><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">handleIncomingCall</span>(<span class="hljs-params">call</span>):</span><br>    logging.info(<span class="hljs-string">b&#x27;Incoming call from &#123;0&#125;&#x27;</span>.<span class="hljs-built_in">format</span>(call.number))<br>    call.hangup()<br>    bot.send_message(<span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span>, <span class="hljs-string">b&#x27;Incoming call from &#123;0&#125;&#x27;</span>.<span class="hljs-built_in">format</span>(call.number))<br>    sms_sign = <span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span><br>    template_id = *****[REPLACE×THIS×PART]*****<br>    phone_number = call.number<br>    sms_type = <span class="hljs-number">0</span><br>    ssender = SmsSingleSender(appid, appkey)<br>    params = []<br>    <span class="hljs-keyword">try</span>:<br>      result = ssender.send_with_param(<span class="hljs-number">86</span>, phone_number,<br>          template_id, params, sign=sms_sign, extend=<span class="hljs-string">&quot;&quot;</span>, ext=<span class="hljs-string">&quot;&quot;</span>) <br>    <span class="hljs-keyword">except</span> HTTPError <span class="hljs-keyword">as</span> e:<br>      <span class="hljs-built_in">print</span>(e)<br>      bot.send_message(<span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span>, <span class="hljs-string">b&#x27;Error &#123;0&#125;&#x27;</span>.<span class="hljs-built_in">format</span>(e))<br>    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>      bot.send_message(<span class="hljs-string">&quot;*****[REPLACE×THIS×PART]*****&quot;</span>, <span class="hljs-string">b&#x27;Error &#123;0&#125;&#x27;</span>.<span class="hljs-built_in">format</span>(e))<br>    <span class="hljs-built_in">print</span>(result)<br><br><br><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span>():</span><br>    logging.basicConfig(<span class="hljs-built_in">format</span>=<span class="hljs-string">&#x27;%(levelname)s: %(message)s&#x27;</span>, level=logging.DEBUG)<br>    logging.info(<span class="hljs-string">&#x27;Initializing modem...&#x27;</span>)<br>    <span class="hljs-comment"># Uncomment the following line to see what the modem is doing:</span><br>    modem = GsmModem(PORT, BAUDRATE, smsReceivedCallbackFunc=handleSms, incomingCallCallbackFunc=handleIncomingCall)<br>    modem.smsTextMode = <span class="hljs-literal">False</span><br>    modem.connect(PIN)<br>    allSms = modem.listStoredSms()<br>    <span class="hljs-keyword">for</span> sms <span class="hljs-keyword">in</span> allSms:<br>        handleSms(sms)<br>    modem.deleteMultipleStoredSms()<br><br>    logging.info(<span class="hljs-string">&#x27;Waiting for SMS message...&#x27;</span>)<br>    <span class="hljs-keyword">try</span>:<br>        modem.rxThread.join(<span class="hljs-number">2</span>**<span class="hljs-number">31</span>) <span class="hljs-comment"># Specify a (huge) timeout so that it essentially blocks indefinitely, but still receives CTRL+C interrupt signal</span><br>    <span class="hljs-keyword">finally</span>:<br>        modem.close()<br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    main()<br><br></code></pre></td></tr></table></figure><p>接下来,运行 <code>sms.py</code> 即可</p><h2 id="参考链接">参考链接</h2><ul><li><a href="https://mby.pw/2019/08/30/sms2tg/">sms2tg - Forward SMS messages from a CDMA Modem to Telegram </a></li><li><a href="https://blog.indexyz.me/archives/recv-and-send-sms-in-raspberry-pi/">使用树莓派来收发短信 - Indexyz Blog</a></li><li><a href="https://github.com/qcloudsms/qcloudsms_js">qcloudsms/qcloudsms_js: qcloudsms Node.js SDK </a></li><li><a href="https://gammu.readthedocs.io/en/latest/config/index.html">Gammu Documentation Contents » Gammu Configuration File</a></li><li><a href="https://readthedocs.org/projects/gammu/downloads/pdf/stable/">Gammu Manual</a></li><li><a href="https://nodejs.org/en/knowledge/command-line/how-to-parse-command-line-arguments/">How to parse command line arguments | Node.js</a></li><li><a href="https://wammu.eu/docs/manual/gammu/index.html">Gammu Utility — Gammu 1.41.0 documentation</a></li><li><a href="https://github.com/gammu/gammu/issues/376">gammu 1.38.6 - HangupCalls and RunOnIncomingCall not working #376</a></li><li><a href="https://gammu.readthedocs.io/en/latest/smsd/config.html">SMSD Configuration File — Gammu @GAMMU_VERSION@ documentation</a></li></ul>]]></content>
  350.    
  351.    <summary type="html">
  352.    
  353.      &lt;p&gt;尽管可以利用闲置安卓手机加 IFTTT 实现接收短信并转发至 Telegram 的操作,但是还是没有自己制作的更让自己满意,毕竟自己的一些奇思妙想是其无法直接实现的。
  354.    
  355.    </summary>
  356.    
  357.    
  358.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  359.    
  360.    
  361.      <category term="Linux" scheme="https://www.wevg.org/tags/Linux/"/>
  362.    
  363.      <category term="搭建" scheme="https://www.wevg.org/tags/%E6%90%AD%E5%BB%BA/"/>
  364.    
  365.      <category term="Tools" scheme="https://www.wevg.org/tags/Tools/"/>
  366.    
  367.      <category term="Gammu" scheme="https://www.wevg.org/tags/Gammu/"/>
  368.    
  369.      <category term="SMS" scheme="https://www.wevg.org/tags/SMS/"/>
  370.    
  371.      <category term="Telegam" scheme="https://www.wevg.org/tags/Telegam/"/>
  372.    
  373.      <category term="RaspberryPi" scheme="https://www.wevg.org/tags/RaspberryPi/"/>
  374.    
  375.  </entry>
  376.  
  377.  <entry>
  378.    <title>解决 Linux 下 Lenovo Yoga 900 触摸板开关键失效问题</title>
  379.    <link href="https://www.wevg.org/archives/lenovo-yoga-900-linux-touchpad-toggle/"/>
  380.    <id>https://www.wevg.org/archives/lenovo-yoga-900-linux-touchpad-toggle/</id>
  381.    <published>2020-01-10T11:34:17.000Z</published>
  382.    <updated>2020-01-10T11:34:17.000Z</updated>
  383.    
  384.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>在将笔记本的系统更换到 openSUSE 之后,趁着今日闲来无事,总算解决了触摸板开关键无效的问题。<span id="more"></span></p>    <div id="aplayer-nRWYpMoY" class="aplayer aplayer-tag-marker meting-tag-marker"         data-id="1386012293" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86"    ></div><blockquote><p>我在想要不要从今年开始,之后的每个文章里面都插一首歌呢?<br>但是是不是可能以后似乎需要考虑一下版权的问题呢?</p></blockquote><p>在进行操作前,请确保已经安装好 <code>udev</code></p><h2 id="添加自定义-hwdb">添加自定义 hwdb</h2><p>在 <code>/etc/udev/hwdb.d/</code> 目录下创建并编辑 <code>10-yoga.hwdb</code> 文件,如果没有 <code>hwdb.d</code> 目录的话,手动创建此目录即可</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">sudo nano <span class="hljs-regexp">/etc/u</span>dev<span class="hljs-regexp">/hwdb.d/</span><span class="hljs-number">10</span>-yoga.hwdb<br></code></pre></td></tr></table></figure><p>在该文件中写入如下内容</p><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs elixir"><span class="hljs-symbol">evdev:</span><span class="hljs-symbol">atkbd:</span><span class="hljs-symbol">dmi:</span>bvn*<span class="hljs-symbol">:bvr*</span><span class="hljs-symbol">:bd*</span><span class="hljs-symbol">:svnLENOVO*</span><span class="hljs-symbol">:pn*</span><span class="hljs-symbol">:pvrLenovoYOGA900*</span><br> KEYBOARD_KEY_be=f21        <span class="hljs-comment"># Fn+F6 Disable Touchpad</span><br></code></pre></td></tr></table></figure><h2 id="更新硬件数据库索引">更新硬件数据库索引</h2><p>更改配置文件,需要重建硬件数据库索引文件 <code>hwdb.bin</code></p><figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ada">sudo udevadm hwdb <span class="hljs-comment">--update</span><br></code></pre></td></tr></table></figure><p>正常的话,此处不会有任何输出。</p><p>接下来,重启计算机,再次开机后,即可发现触摸板开关键已经恢复正常。</p><p><img src="https://i.yecdn.com/images/2020/01/10/6c67a9a5aacc581988e5a1c90c83cf9b.png" alt="6c67a9a5aacc581988e5a1c90c83cf9b.png"></p><h2 id="参考链接">参考链接</h2><ul><li><a href="https://wiki.archlinux.org/index.php/Lenovo_IdeaPad_Yoga_900#Toggle_Trackpad">Lenovo IdeaPad Yoga 900 - ArchWiki</a></li><li><a href="https://wiki.archlinux.org/index.php/Map_scancodes_to_keycodes#Using_setkeycodes">Map scancodes to keycodes - ArchWiki</a></li><li><a href="https://wiki.archlinux.org/index.php/Talk:Lenovo_IdeaPad_Yoga_900">Talk:Lenovo IdeaPad Yoga 900 - ArchWiki</a></li><li><a href="https://ubuntuforums.org/showthread.php?t=2162020">[ubuntu] Lenovo Ideapad Yoga Key Repeating For No Reason</a></li><li><a href="https://unix.stackexchange.com/questions/323322/how-to-disable-enable-the-touchpad-for-the-lenovo-yoga-900-13isk2">How to disable/enable the touchpad for the Lenovo Yoga 900 13ISK2</a></li><li><a href="https://forums.lenovo.com/t5/Lenovo-Yoga-Series-Notebooks/Yoga-900-Hotkey-functions-and-Function-keys/ta-p/2190615"> Yoga 900 - Hotkey functions and Function keys </a></li></ul>]]></content>
  385.    
  386.    <summary type="html">
  387.    
  388.      &lt;p&gt;在将笔记本的系统更换到 openSUSE 之后,趁着今日闲来无事,总算解决了触摸板开关键无效的问题。
  389.    
  390.    </summary>
  391.    
  392.    
  393.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  394.    
  395.    
  396.      <category term="System" scheme="https://www.wevg.org/tags/System/"/>
  397.    
  398.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  399.    
  400.      <category term="设置" scheme="https://www.wevg.org/tags/%E8%AE%BE%E7%BD%AE/"/>
  401.    
  402.      <category term="配置" scheme="https://www.wevg.org/tags/%E9%85%8D%E7%BD%AE/"/>
  403.    
  404.      <category term="Linux" scheme="https://www.wevg.org/tags/Linux/"/>
  405.    
  406.      <category term="config" scheme="https://www.wevg.org/tags/config/"/>
  407.    
  408.  </entry>
  409.  
  410.  <entry>
  411.    <title>使用 Yubikey 进行 GPG 签名</title>
  412.    <link href="https://www.wevg.org/archives/gpg-sign-via-yubikey/"/>
  413.    <id>https://www.wevg.org/archives/gpg-sign-via-yubikey/</id>
  414.    <published>2020-01-09T06:27:43.000Z</published>
  415.    <updated>2020-01-09T06:27:43.000Z</updated>
  416.    
  417.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>前两天入手了一个 yubikey 5 之后,在给几个常用的网站配置了用于两部认证的安全密钥之后,便在想还能拿来做什么,经过一番尝试之后发现了几个比较好玩的玩法。本文便是其中之一。<span id="more"></span> <s><em>(其实就是想多水几篇文章</em></s></p><h2 id="生成-gpg-证书">生成 GPG 证书</h2><p>说到生成证书,请务必要对证书做好备份,不然就会像我一样 QAQ</p><blockquote><p>在立音的诱惑下(其实主要也是我闲着没事干),我便把笔记本从 Manjaro 换成了 openSUSE ,然后这时我发现我忘记备份我的 SSH 密钥,配置文件,甚至 GPG 密钥,估计这种大傻子 全世界也就只有我一个了吧 ㅠㅠ<br>言归正传,下面开始说明 GPG 证书的生成过程,当然如果您了解如何生成,可以直接跳过此步骤。</p></blockquote><blockquote><p>下文中出现的用户名 <code>Edison Jwa</code>, 邮箱 <code>example@uv.uy</code>, 以及 密钥信息 <code>W4IJICKJLQPX8CMB9IYZMVPSMCCJIHOTGSM2QFGP</code>,部分请根据个人情况进行修改</p></blockquote><p>首先,输入 <code>gpg --full-generate-key</code> 开始生成 GPG 证书</p><figure class="highlight sql"><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></pre></td><td class="code"><pre><code class="hljs sql">edison<span class="hljs-variable">@edison</span><span class="hljs-operator">-</span>pc <span class="hljs-operator">~</span><span class="hljs-operator">&gt;</span> gpg <span class="hljs-comment">--full-generate-key</span><br>gpg (GnuPG) <span class="hljs-number">2.2</span><span class="hljs-number">.19</span>; Copyright (C) <span class="hljs-number">2019</span> <span class="hljs-keyword">Free</span> Software Foundation, Inc.<br>This <span class="hljs-keyword">is</span> <span class="hljs-keyword">free</span> software: you <span class="hljs-keyword">are</span> <span class="hljs-keyword">free</span> <span class="hljs-keyword">to</span> change <span class="hljs-keyword">and</span> redistribute it.<br>There <span class="hljs-keyword">is</span> <span class="hljs-keyword">NO</span> WARRANTY, <span class="hljs-keyword">to</span> the extent permitted <span class="hljs-keyword">by</span> law.<br><br>Please <span class="hljs-keyword">select</span> what kind <span class="hljs-keyword">of</span> key you want:<br>   (<span class="hljs-number">1</span>) RSA <span class="hljs-keyword">and</span> RSA (<span class="hljs-keyword">default</span>)<br>   (<span class="hljs-number">2</span>) DSA <span class="hljs-keyword">and</span> Elgamal<br>   (<span class="hljs-number">3</span>) DSA (sign <span class="hljs-keyword">only</span>)<br>   (<span class="hljs-number">4</span>) RSA (sign <span class="hljs-keyword">only</span>)<br>  (<span class="hljs-number">14</span>) Existing key <span class="hljs-keyword">from</span> card<br>Your selection? <span class="hljs-number">1</span><br></code></pre></td></tr></table></figure><p>输入 <code>1</code> 即选择 <code>(1) RSA and RSA (default)</code></p><p>需要注意的是,如果你的 Yubikey 型号为 NEO 那么请选择 <code>2048</code> 位,Yubikey 4 或 5 的话,选择 <code>4096</code> 位<br>此处的过期时间随意,此处我将过期时间设置成了1年</p><figure class="highlight vbnet"><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></pre></td><td class="code"><pre><code class="hljs vbnet">RSA keys may be between <span class="hljs-number">1024</span> <span class="hljs-built_in">and</span> <span class="hljs-number">4096</span> bits <span class="hljs-type">long</span>.<br>What keysize <span class="hljs-keyword">do</span> you want? (<span class="hljs-number">2048</span>) <span class="hljs-number">4096</span><br>Requested keysize <span class="hljs-built_in">is</span> <span class="hljs-number">4096</span> bits<br>Please specify how <span class="hljs-type">long</span> the <span class="hljs-keyword">key</span> should be valid.<br>         <span class="hljs-number">0</span> = <span class="hljs-keyword">key</span> does <span class="hljs-built_in">not</span> expire<br>      &lt;n&gt;  = <span class="hljs-keyword">key</span> expires <span class="hljs-keyword">in</span> n days<br>      &lt;n&gt;w = <span class="hljs-keyword">key</span> expires <span class="hljs-keyword">in</span> n weeks<br>      &lt;n&gt;m = <span class="hljs-keyword">key</span> expires <span class="hljs-keyword">in</span> n months<br>      &lt;n&gt;y = <span class="hljs-keyword">key</span> expires <span class="hljs-keyword">in</span> n years<br><span class="hljs-keyword">Key</span> <span class="hljs-built_in">is</span> valid <span class="hljs-keyword">for</span>? (<span class="hljs-number">0</span>) <span class="hljs-number">1</span>y<br><span class="hljs-keyword">Key</span> expires at Fri <span class="hljs-number">08</span> Jan <span class="hljs-number">2021</span> <span class="hljs-number">08</span>:<span class="hljs-number">22</span>:<span class="hljs-number">31</span> AM CST<br><span class="hljs-built_in">Is</span> this correct? (y/N) y<br></code></pre></td></tr></table></figure><p>输入您的个人信息,输入完成后如果没有问题输入 <code>o</code> 并敲击 <kbd>Enter</kbd> 键即可。</p><figure class="highlight mathematica"><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></pre></td><td class="code"><pre><code class="hljs mathematica"><span class="hljs-variable">GnuPG</span> <span class="hljs-variable">needs</span> <span class="hljs-variable">to</span> <span class="hljs-variable">construct</span> <span class="hljs-variable">a</span> <span class="hljs-variable">user</span> <span class="hljs-variable">ID</span> <span class="hljs-variable">to</span> <span class="hljs-variable">identify</span> <span class="hljs-variable">your</span> <span class="hljs-variable">key</span><span class="hljs-operator">.</span><br><br><span class="hljs-built_in">Real</span> <span class="hljs-variable">name</span><span class="hljs-operator">:</span> <span class="hljs-variable">Edison</span> <span class="hljs-variable">Jwa</span><br><span class="hljs-variable">Email</span> <span class="hljs-variable">address</span><span class="hljs-operator">:</span> <span class="hljs-variable">example</span><span class="hljs-operator">@</span><span class="hljs-variable">uv</span><span class="hljs-operator">.</span><span class="hljs-variable">uy</span><br><span class="hljs-variable">Comment</span><span class="hljs-operator">:</span> <br><span class="hljs-variable">You</span> <span class="hljs-variable">selected</span> <span class="hljs-variable">this</span> <span class="hljs-variable">USER</span><span class="hljs-operator">-</span><span class="hljs-variable">ID</span><span class="hljs-operator">:</span><br>    <span class="hljs-string">&quot;Edison Jwa &lt;example@uv.uy&gt;&quot;</span><br><br><span class="hljs-variable">Change</span> <span class="hljs-punctuation">(</span><span class="hljs-built_in">N</span><span class="hljs-punctuation">)</span><span class="hljs-variable">ame</span><span class="hljs-operator">,</span> <span class="hljs-punctuation">(</span><span class="hljs-built_in">C</span><span class="hljs-punctuation">)</span><span class="hljs-variable">omment</span><span class="hljs-operator">,</span> <span class="hljs-punctuation">(</span><span class="hljs-built_in">E</span><span class="hljs-punctuation">)</span><span class="hljs-variable">mail</span> <span class="hljs-variable">or</span> <span class="hljs-punctuation">(</span><span class="hljs-built_in">O</span><span class="hljs-punctuation">)</span><span class="hljs-variable">kay</span><span class="hljs-operator">/</span><span class="hljs-punctuation">(</span><span class="hljs-variable">Q</span><span class="hljs-punctuation">)</span><span class="hljs-variable">uit</span><span class="hljs-operator">?</span> <span class="hljs-variable">o</span><br></code></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><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></pre></td><td class="code"><pre><code class="hljs pgsql">We need <span class="hljs-keyword">to</span> generate a lot <span class="hljs-keyword">of</span> random bytes. It <span class="hljs-keyword">is</span> a good idea <span class="hljs-keyword">to</span> <span class="hljs-keyword">perform</span><br><span class="hljs-keyword">some</span> other action (<span class="hljs-keyword">type</span> <span class="hljs-keyword">on</span> the keyboard, <span class="hljs-keyword">move</span> the mouse, utilize the<br>disks) during the prime generation; this gives the random number<br>generator a better chance <span class="hljs-keyword">to</span> gain enough entropy.<br>We need <span class="hljs-keyword">to</span> generate a lot <span class="hljs-keyword">of</span> random bytes. It <span class="hljs-keyword">is</span> a good idea <span class="hljs-keyword">to</span> <span class="hljs-keyword">perform</span><br><span class="hljs-keyword">some</span> other action (<span class="hljs-keyword">type</span> <span class="hljs-keyword">on</span> the keyboard, <span class="hljs-keyword">move</span> the mouse, utilize the<br>disks) during the prime generation; this gives the random number<br>generator a better chance <span class="hljs-keyword">to</span> gain enough entropy.<br>gpg: key <span class="hljs-number">1234567890</span>ABCDEF marked <span class="hljs-keyword">as</span> ultimately <span class="hljs-keyword">trusted</span><br>gpg: revocation certificate stored <span class="hljs-keyword">as</span> <span class="hljs-string">&#x27;/home/edison/.gnupg/openpgp-revocs.d/W4IJICKJLQPX8CMB9IYZMVPSMCCJIHOTGSM2QFGP.rev&#x27;</span><br><span class="hljs-built_in">public</span> <span class="hljs-keyword">and</span> secret key created <span class="hljs-keyword">and</span> signed.<br><br>pub   rsa4096 <span class="hljs-number">2020</span><span class="hljs-number">-01</span><span class="hljs-number">-01</span> [SC] [expires: <span class="hljs-number">2021</span><span class="hljs-number">-01</span><span class="hljs-number">-08</span>]<br>      W4IJICKJLQPX8CMB9IYZMVPSMCCJIHOTGSM2QFGP<br>uid                      Edison Jwa &lt;example@uv.uy&gt;<br>sub   rsa4096 <span class="hljs-number">2020</span><span class="hljs-number">-01</span><span class="hljs-number">-01</span> [E] [expires: <span class="hljs-number">2021</span><span class="hljs-number">-01</span><span class="hljs-number">-08</span>]<br></code></pre></td></tr></table></figure><p>至此,主证书已经创建完成,当然接下来我们继续添加子证书<br>输入 <code>gpg --expert --edit-key W4IJICKJLQPX8CMB9IYZMVPSMCCJIHOTGSM2QFGP</code> 开始对证书进行修改</p><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><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><code class="hljs apache"><span class="hljs-attribute">edison</span>@edison-pc ~&gt; gpg --expert --edit-key W<span class="hljs-number">4</span>IJICKJLQPX<span class="hljs-number">8</span>CMB<span class="hljs-number">9</span>IYZMVPSMCCJIHOTGSM<span class="hljs-number">2</span>QFGP<br><span class="hljs-attribute">gpg</span> (GnuPG) <span class="hljs-number">2</span>.<span class="hljs-number">2</span>.<span class="hljs-number">19</span>; Copyright (C) <span class="hljs-number">2019</span> Free Software Foundation, Inc.<br><span class="hljs-attribute">This</span> is free software: you are free to change and redistribute it.<br><span class="hljs-attribute">There</span> is NO WARRANTY, to the extent permitted by law.<br><br><span class="hljs-attribute">Secret</span> key is available.<br><br><span class="hljs-attribute">sec</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">01</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: SC  <br>     <span class="hljs-attribute">trust</span>: ultimate      validity: ultimate<br><span class="hljs-attribute">ssb</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">01</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: E   <span class="hljs-meta"></span><br><span class="hljs-meta">[ultimate] (1). Edison Jwa &lt;example@uv.uy&gt;</span><br></code></pre></td></tr></table></figure><p>输入 <code>addkey</code> 开始添加子证书</p><figure class="highlight less"><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><code class="hljs less"><span class="hljs-selector-tag">gpg</span>&gt; <span class="hljs-selector-tag">addkey</span> <br><span class="hljs-selector-tag">Please</span> <span class="hljs-selector-tag">select</span> <span class="hljs-selector-tag">what</span> <span class="hljs-selector-tag">kind</span> <span class="hljs-selector-tag">of</span> <span class="hljs-selector-tag">key</span> <span class="hljs-selector-tag">you</span> <span class="hljs-selector-tag">want</span>:<br>   (<span class="hljs-number">3</span>) <span class="hljs-selector-tag">DSA</span> (sign only)<br>   (<span class="hljs-number">4</span>) <span class="hljs-selector-tag">RSA</span> (sign only)<br>   (<span class="hljs-number">5</span>) <span class="hljs-selector-tag">Elgamal</span> (encrypt only)<br>   (<span class="hljs-number">6</span>) <span class="hljs-selector-tag">RSA</span> (encrypt only)<br>   (<span class="hljs-number">7</span>) <span class="hljs-selector-tag">DSA</span> (set your own capabilities)<br>   (<span class="hljs-number">8</span>) <span class="hljs-selector-tag">RSA</span> (set your own capabilities)<br>  (<span class="hljs-number">10</span>) <span class="hljs-selector-tag">ECC</span> (sign only)<br>  (<span class="hljs-number">11</span>) <span class="hljs-selector-tag">ECC</span> (set your own capabilities)<br>  (<span class="hljs-number">12</span>) <span class="hljs-selector-tag">ECC</span> (encrypt only)<br>  (<span class="hljs-number">13</span>) <span class="hljs-selector-tag">Existing</span> <span class="hljs-selector-tag">key</span><br>  (<span class="hljs-number">14</span>) <span class="hljs-selector-tag">Existing</span> <span class="hljs-selector-tag">key</span> <span class="hljs-selector-tag">from</span> <span class="hljs-selector-tag">card</span><br><span class="hljs-selector-tag">Your</span> <span class="hljs-selector-tag">selection</span>? <span class="hljs-selector-tag">4</span><br></code></pre></td></tr></table></figure><p>这里选择 <code>4</code>, 即 <code>RSA (sign only)</code></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><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></pre></td><td class="code"><pre><code class="hljs pgsql">RSA keys may be <span class="hljs-keyword">between</span> <span class="hljs-number">1024</span> <span class="hljs-keyword">and</span> <span class="hljs-number">4096</span> bits long.<br>What keysize <span class="hljs-keyword">do</span> you want? (<span class="hljs-number">2048</span>) <span class="hljs-number">4096</span><br>Requested keysize <span class="hljs-keyword">is</span> <span class="hljs-number">4096</span> bits<br>Please specify how long the key should be <span class="hljs-keyword">valid</span>.<br>         <span class="hljs-number">0</span> = key does <span class="hljs-keyword">not</span> expire<br>      &lt;n&gt;  = key expires <span class="hljs-keyword">in</span> n days<br>      &lt;n&gt;w = key expires <span class="hljs-keyword">in</span> n weeks<br>      &lt;n&gt;m = key expires <span class="hljs-keyword">in</span> n months<br>      &lt;n&gt;y = key expires <span class="hljs-keyword">in</span> n years<br>Key <span class="hljs-keyword">is</span> <span class="hljs-keyword">valid</span> <span class="hljs-keyword">for</span>? (<span class="hljs-number">0</span>) <span class="hljs-number">1</span>y<br>Key expires at Fri <span class="hljs-number">08</span> Jan <span class="hljs-number">2021</span> <span class="hljs-number">10</span>:<span class="hljs-number">29</span>:<span class="hljs-number">48</span> AM CST<br><span class="hljs-keyword">Is</span> this correct? (y/N) y<br>Really <span class="hljs-keyword">create</span>? (y/N) y<br>We need <span class="hljs-keyword">to</span> generate a lot <span class="hljs-keyword">of</span> random bytes. It <span class="hljs-keyword">is</span> a good idea <span class="hljs-keyword">to</span> <span class="hljs-keyword">perform</span><br><span class="hljs-keyword">some</span> other action (<span class="hljs-keyword">type</span> <span class="hljs-keyword">on</span> the keyboard, <span class="hljs-keyword">move</span> the mouse, utilize the<br>disks) during the prime generation; this gives the random number<br>generator a better chance <span class="hljs-keyword">to</span> gain enough entropy.<br><br>sec  rsa4096/<span class="hljs-number">1234567890</span>ABCDEF<br>     created: <span class="hljs-number">2020</span><span class="hljs-number">-01</span><span class="hljs-number">-01</span>  expires: <span class="hljs-number">2021</span><span class="hljs-number">-01</span><span class="hljs-number">-08</span>  <span class="hljs-keyword">usage</span>: SC  <br>     trust: ultimate      validity: ultimate<br>ssb  rsa4096/<span class="hljs-number">1234567890</span>ABCDEF<br>     created: <span class="hljs-number">2020</span><span class="hljs-number">-01</span><span class="hljs-number">-01</span>  expires: <span class="hljs-number">2021</span><span class="hljs-number">-01</span><span class="hljs-number">-08</span>  <span class="hljs-keyword">usage</span>: E   <br>ssb  rsa4096/<span class="hljs-number">1234567890</span>ABCDEF<br>     created: <span class="hljs-number">2020</span><span class="hljs-number">-01</span><span class="hljs-number">-01</span>  expires: <span class="hljs-number">2021</span><span class="hljs-number">-01</span><span class="hljs-number">-08</span>  <span class="hljs-keyword">usage</span>: S   <br>[ultimate] (<span class="hljs-number">1</span>). Edison Jwa &lt;example@uv.uy&gt;<br></code></pre></td></tr></table></figure><p>继续创建证书</p><figure class="highlight less"><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><code class="hljs less"><span class="hljs-selector-tag">gpg</span>&gt; <span class="hljs-selector-tag">addkey</span><br><span class="hljs-selector-tag">Please</span> <span class="hljs-selector-tag">select</span> <span class="hljs-selector-tag">what</span> <span class="hljs-selector-tag">kind</span> <span class="hljs-selector-tag">of</span> <span class="hljs-selector-tag">key</span> <span class="hljs-selector-tag">you</span> <span class="hljs-selector-tag">want</span>:<br>   (<span class="hljs-number">3</span>) <span class="hljs-selector-tag">DSA</span> (sign only)<br>   (<span class="hljs-number">4</span>) <span class="hljs-selector-tag">RSA</span> (sign only)<br>   (<span class="hljs-number">5</span>) <span class="hljs-selector-tag">Elgamal</span> (encrypt only)<br>   (<span class="hljs-number">6</span>) <span class="hljs-selector-tag">RSA</span> (encrypt only)<br>   (<span class="hljs-number">7</span>) <span class="hljs-selector-tag">DSA</span> (set your own capabilities)<br>   (<span class="hljs-number">8</span>) <span class="hljs-selector-tag">RSA</span> (set your own capabilities)<br>  (<span class="hljs-number">10</span>) <span class="hljs-selector-tag">ECC</span> (sign only)<br>  (<span class="hljs-number">11</span>) <span class="hljs-selector-tag">ECC</span> (set your own capabilities)<br>  (<span class="hljs-number">12</span>) <span class="hljs-selector-tag">ECC</span> (encrypt only)<br>  (<span class="hljs-number">13</span>) <span class="hljs-selector-tag">Existing</span> <span class="hljs-selector-tag">key</span><br>  (<span class="hljs-number">14</span>) <span class="hljs-selector-tag">Existing</span> <span class="hljs-selector-tag">key</span> <span class="hljs-selector-tag">from</span> <span class="hljs-selector-tag">card</span><br><span class="hljs-selector-tag">Your</span> <span class="hljs-selector-tag">selection</span>? <span class="hljs-selector-tag">8</span><br></code></pre></td></tr></table></figure><p>这里我们需要先去掉 <code>Sign</code> 和 <code>Encrypt</code> ,所依次输入 <code>S</code> <code>E</code><br>接下来 输入 <code>A</code> 启用 <code>Authenticate</code></p><figure class="highlight mathematica"><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></pre></td><td class="code"><pre><code class="hljs mathematica"><span class="hljs-variable">Possible</span> <span class="hljs-variable">actions</span> <span class="hljs-variable">for</span> <span class="hljs-variable">a</span> <span class="hljs-variable">RSA</span> <span class="hljs-variable">key</span><span class="hljs-operator">:</span> <span class="hljs-built_in">Sign</span> <span class="hljs-built_in">Encrypt</span> <span class="hljs-built_in">Authenticate</span> <br><span class="hljs-variable">Current</span> <span class="hljs-variable">allowed</span> <span class="hljs-variable">actions</span><span class="hljs-operator">:</span> <span class="hljs-built_in">Sign</span> <span class="hljs-built_in">Encrypt</span> <br><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">S</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">sign</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-built_in">E</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">encrypt</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">A</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">authenticate</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">Q</span><span class="hljs-punctuation">)</span> <span class="hljs-variable">Finished</span><br><br><span class="hljs-variable">Your</span> <span class="hljs-variable">selection</span><span class="hljs-operator">?</span> <span class="hljs-variable">s</span><br><br><span class="hljs-variable">Possible</span> <span class="hljs-variable">actions</span> <span class="hljs-variable">for</span> <span class="hljs-variable">a</span> <span class="hljs-variable">RSA</span> <span class="hljs-variable">key</span><span class="hljs-operator">:</span> <span class="hljs-built_in">Sign</span> <span class="hljs-built_in">Encrypt</span> <span class="hljs-built_in">Authenticate</span> <br><span class="hljs-variable">Current</span> <span class="hljs-variable">allowed</span> <span class="hljs-variable">actions</span><span class="hljs-operator">:</span> <span class="hljs-built_in">Encrypt</span> <br><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">S</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">sign</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-built_in">E</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">encrypt</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">A</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">authenticate</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">Q</span><span class="hljs-punctuation">)</span> <span class="hljs-variable">Finished</span><br><br><span class="hljs-variable">Your</span> <span class="hljs-variable">selection</span><span class="hljs-operator">?</span> <span class="hljs-variable">e</span><br><br><span class="hljs-variable">Possible</span> <span class="hljs-variable">actions</span> <span class="hljs-variable">for</span> <span class="hljs-variable">a</span> <span class="hljs-variable">RSA</span> <span class="hljs-variable">key</span><span class="hljs-operator">:</span> <span class="hljs-built_in">Sign</span> <span class="hljs-built_in">Encrypt</span> <span class="hljs-built_in">Authenticate</span> <br><span class="hljs-variable">Current</span> <span class="hljs-variable">allowed</span> <span class="hljs-variable">actions</span><span class="hljs-operator">:</span> <br><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">S</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">sign</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-built_in">E</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">encrypt</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">A</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">authenticate</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">Q</span><span class="hljs-punctuation">)</span> <span class="hljs-variable">Finished</span><br><br><span class="hljs-variable">Your</span> <span class="hljs-variable">selection</span><span class="hljs-operator">?</span> <span class="hljs-variable">a</span><br><br><span class="hljs-variable">Possible</span> <span class="hljs-variable">actions</span> <span class="hljs-variable">for</span> <span class="hljs-variable">a</span> <span class="hljs-variable">RSA</span> <span class="hljs-variable">key</span><span class="hljs-operator">:</span> <span class="hljs-built_in">Sign</span> <span class="hljs-built_in">Encrypt</span> <span class="hljs-built_in">Authenticate</span> <br><span class="hljs-variable">Current</span> <span class="hljs-variable">allowed</span> <span class="hljs-variable">actions</span><span class="hljs-operator">:</span> <span class="hljs-built_in">Authenticate</span> <br><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">S</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">sign</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-built_in">E</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">encrypt</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">A</span><span class="hljs-punctuation">)</span> <span class="hljs-built_in">Toggle</span> <span class="hljs-variable">the</span> <span class="hljs-variable">authenticate</span> <span class="hljs-variable">capability</span><br>   <span class="hljs-punctuation">(</span><span class="hljs-variable">Q</span><span class="hljs-punctuation">)</span> <span class="hljs-variable">Finished</span><br><br><span class="hljs-variable">Your</span> <span class="hljs-variable">selection</span><span class="hljs-operator">?</span> <span class="hljs-variable">q</span><br><span class="hljs-variable">RSA</span> <span class="hljs-variable">keys</span> <span class="hljs-variable">may</span> <span class="hljs-variable">be</span> <span class="hljs-variable">between</span> <span class="hljs-number">1024</span> <span class="hljs-variable">and</span> <span class="hljs-number">4096</span> <span class="hljs-variable">bits</span> <span class="hljs-variable">long</span><span class="hljs-operator">.</span><br><span class="hljs-variable">What</span> <span class="hljs-variable">keysize</span> <span class="hljs-variable">do</span> <span class="hljs-variable">you</span> <span class="hljs-variable">want</span><span class="hljs-operator">?</span> <span class="hljs-punctuation">(</span><span class="hljs-number">2048</span><span class="hljs-punctuation">)</span> <span class="hljs-number">4096</span><br><span class="hljs-variable">Requested</span> <span class="hljs-variable">keysize</span> <span class="hljs-variable">is</span> <span class="hljs-number">4096</span> <span class="hljs-variable">bits</span><br><span class="hljs-variable">Please</span> <span class="hljs-variable">specify</span> <span class="hljs-variable">how</span> <span class="hljs-variable">long</span> <span class="hljs-variable">the</span> <span class="hljs-variable">key</span> <span class="hljs-variable">should</span> <span class="hljs-variable">be</span> <span class="hljs-variable">valid</span><span class="hljs-operator">.</span><br>         <span class="hljs-number">0</span> <span class="hljs-operator">=</span> <span class="hljs-variable">key</span> <span class="hljs-variable">does</span> <span class="hljs-variable">not</span> <span class="hljs-variable">expire</span><br>      <span class="hljs-operator">&lt;</span><span class="hljs-variable">n</span><span class="hljs-operator">&gt;</span>  <span class="hljs-operator">=</span> <span class="hljs-variable">key</span> <span class="hljs-variable">expires</span> <span class="hljs-variable">in</span> <span class="hljs-variable">n</span> <span class="hljs-variable">days</span><br>      <span class="hljs-operator">&lt;</span><span class="hljs-variable">n</span><span class="hljs-operator">&gt;</span><span class="hljs-variable">w</span> <span class="hljs-operator">=</span> <span class="hljs-variable">key</span> <span class="hljs-variable">expires</span> <span class="hljs-variable">in</span> <span class="hljs-variable">n</span> <span class="hljs-variable">weeks</span><br>      <span class="hljs-operator">&lt;</span><span class="hljs-variable">n</span><span class="hljs-operator">&gt;</span><span class="hljs-variable">m</span> <span class="hljs-operator">=</span> <span class="hljs-variable">key</span> <span class="hljs-variable">expires</span> <span class="hljs-variable">in</span> <span class="hljs-variable">n</span> <span class="hljs-variable">months</span><br>      <span class="hljs-operator">&lt;</span><span class="hljs-variable">n</span><span class="hljs-operator">&gt;</span><span class="hljs-variable">y</span> <span class="hljs-operator">=</span> <span class="hljs-variable">key</span> <span class="hljs-variable">expires</span> <span class="hljs-variable">in</span> <span class="hljs-variable">n</span> <span class="hljs-variable">years</span><br><span class="hljs-built_in">Key</span> <span class="hljs-variable">is</span> <span class="hljs-variable">valid</span> <span class="hljs-variable">for</span><span class="hljs-operator">?</span> <span class="hljs-punctuation">(</span><span class="hljs-number">0</span><span class="hljs-punctuation">)</span> <span class="hljs-number">1</span><span class="hljs-variable">y</span><br><span class="hljs-built_in">Key</span> <span class="hljs-variable">expires</span> <span class="hljs-variable">at</span> <span class="hljs-variable">Fri</span> <span class="hljs-number">08</span> <span class="hljs-variable">Jan</span> <span class="hljs-number">2021</span> <span class="hljs-number">10</span><span class="hljs-operator">:</span><span class="hljs-number">30</span><span class="hljs-operator">:</span><span class="hljs-number">23</span> <span class="hljs-variable">AM</span> <span class="hljs-variable">CST</span><br><span class="hljs-variable">Is</span> <span class="hljs-variable">this</span> <span class="hljs-variable">correct</span><span class="hljs-operator">?</span> <span class="hljs-punctuation">(</span><span class="hljs-variable">y</span><span class="hljs-operator">/</span><span class="hljs-built_in">N</span><span class="hljs-punctuation">)</span> <span class="hljs-variable">y</span><br><span class="hljs-variable">Really</span> <span class="hljs-variable">create</span><span class="hljs-operator">?</span> <span class="hljs-punctuation">(</span><span class="hljs-variable">y</span><span class="hljs-operator">/</span><span class="hljs-built_in">N</span><span class="hljs-punctuation">)</span> <span class="hljs-variable">y</span><br><span class="hljs-variable">We</span> <span class="hljs-variable">need</span> <span class="hljs-variable">to</span> <span class="hljs-variable">generate</span> <span class="hljs-variable">a</span> <span class="hljs-variable">lot</span> <span class="hljs-variable">of</span> <span class="hljs-variable">random</span> <span class="hljs-variable">bytes</span><span class="hljs-operator">.</span> <span class="hljs-variable">It</span> <span class="hljs-variable">is</span> <span class="hljs-variable">a</span> <span class="hljs-variable">good</span> <span class="hljs-variable">idea</span> <span class="hljs-variable">to</span> <span class="hljs-variable">perform</span><br><span class="hljs-variable">some</span> <span class="hljs-variable">other</span> <span class="hljs-variable">action</span> <span class="hljs-punctuation">(</span><span class="hljs-variable">type</span> <span class="hljs-variable">on</span> <span class="hljs-variable">the</span> <span class="hljs-variable">keyboard</span><span class="hljs-operator">,</span> <span class="hljs-variable">move</span> <span class="hljs-variable">the</span> <span class="hljs-variable">mouse</span><span class="hljs-operator">,</span> <span class="hljs-variable">utilize</span> <span class="hljs-variable">the</span><br><span class="hljs-variable">disks</span><span class="hljs-punctuation">)</span> <span class="hljs-variable">during</span> <span class="hljs-variable">the</span> <span class="hljs-variable">prime</span> <span class="hljs-variable">generation</span><span class="hljs-operator">;</span> <span class="hljs-variable">this</span> <span class="hljs-variable">gives</span> <span class="hljs-variable">the</span> <span class="hljs-variable">random</span> <span class="hljs-variable">number</span><br><span class="hljs-variable">generator</span> <span class="hljs-variable">a</span> <span class="hljs-variable">better</span> <span class="hljs-variable">chance</span> <span class="hljs-variable">to</span> <span class="hljs-variable">gain</span> <span class="hljs-variable">enough</span> <span class="hljs-variable">entropy</span><span class="hljs-operator">.</span><br><br><span class="hljs-variable">sec</span>  <span class="hljs-variable">rsa4096</span><span class="hljs-operator">/</span><span class="hljs-number">1234567890</span><span class="hljs-variable">ABCDEF</span><br>     <span class="hljs-variable">created</span><span class="hljs-operator">:</span> <span class="hljs-number">2020</span><span class="hljs-operator">-</span><span class="hljs-number">01</span><span class="hljs-operator">-</span><span class="hljs-number">01</span>  <span class="hljs-variable">expires</span><span class="hljs-operator">:</span> <span class="hljs-number">2021</span><span class="hljs-operator">-</span><span class="hljs-number">01</span><span class="hljs-operator">-</span><span class="hljs-number">08</span>  <span class="hljs-variable">usage</span><span class="hljs-operator">:</span> <span class="hljs-variable">SC</span>  <br>     <span class="hljs-variable">trust</span><span class="hljs-operator">:</span> <span class="hljs-variable">ultimate</span>      <span class="hljs-variable">validity</span><span class="hljs-operator">:</span> <span class="hljs-variable">ultimate</span><br><span class="hljs-variable">ssb</span>  <span class="hljs-variable">rsa4096</span><span class="hljs-operator">/</span><span class="hljs-number">1234567890</span><span class="hljs-variable">ABCDEF</span><br>     <span class="hljs-variable">created</span><span class="hljs-operator">:</span> <span class="hljs-number">2020</span><span class="hljs-operator">-</span><span class="hljs-number">01</span><span class="hljs-operator">-</span><span class="hljs-number">01</span>  <span class="hljs-variable">expires</span><span class="hljs-operator">:</span> <span class="hljs-number">2021</span><span class="hljs-operator">-</span><span class="hljs-number">01</span><span class="hljs-operator">-</span><span class="hljs-number">08</span>  <span class="hljs-variable">usage</span><span class="hljs-operator">:</span> <span class="hljs-built_in">E</span>   <br><span class="hljs-variable">ssb</span>  <span class="hljs-variable">rsa4096</span><span class="hljs-operator">/</span><span class="hljs-number">1234567890</span><span class="hljs-variable">ABCDEF</span><br>     <span class="hljs-variable">created</span><span class="hljs-operator">:</span> <span class="hljs-number">2020</span><span class="hljs-operator">-</span><span class="hljs-number">01</span><span class="hljs-operator">-</span><span class="hljs-number">01</span>  <span class="hljs-variable">expires</span><span class="hljs-operator">:</span> <span class="hljs-number">2021</span><span class="hljs-operator">-</span><span class="hljs-number">01</span><span class="hljs-operator">-</span><span class="hljs-number">08</span>  <span class="hljs-variable">usage</span><span class="hljs-operator">:</span> <span class="hljs-variable">S</span>   <br><span class="hljs-variable">ssb</span>  <span class="hljs-variable">rsa4096</span><span class="hljs-operator">/</span><span class="hljs-number">7</span><span class="hljs-variable">EC20E50EE5ECDD5</span><br>     <span class="hljs-variable">created</span><span class="hljs-operator">:</span> <span class="hljs-number">2020</span><span class="hljs-operator">-</span><span class="hljs-number">01</span><span class="hljs-operator">-</span><span class="hljs-number">01</span>  <span class="hljs-variable">expires</span><span class="hljs-operator">:</span> <span class="hljs-number">2021</span><span class="hljs-operator">-</span><span class="hljs-number">01</span><span class="hljs-operator">-</span><span class="hljs-number">08</span>  <span class="hljs-variable">usage</span><span class="hljs-operator">:</span> <span class="hljs-variable">A</span>   <br><span class="hljs-punctuation">[</span><span class="hljs-variable">ultimate</span><span class="hljs-punctuation">]</span> <span class="hljs-punctuation">(</span><span class="hljs-number">1</span><span class="hljs-punctuation">)</span><span class="hljs-operator">.</span> <span class="hljs-variable">Edison</span> <span class="hljs-variable">Jwa</span> <span class="hljs-operator">&lt;</span><span class="hljs-variable">example</span><span class="hljs-operator">@</span><span class="hljs-variable">uv</span><span class="hljs-operator">.</span><span class="hljs-variable">uy</span><span class="hljs-operator">&gt;</span><br><br><span class="hljs-variable">gpg</span><span class="hljs-operator">&gt;</span> <span class="hljs-variable">save</span><br></code></pre></td></tr></table></figure><h3 id="查看生成的-gpg-证书">查看生成的 GPG 证书</h3><figure class="highlight subunit"><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></pre></td><td class="code"><pre><code class="hljs subunit">edison@edison-pc ~&gt; gpg --list-keys<br>/home/edison/.gnupg/pubring.kbx<br>-------------------------------<br>pub   rsa4096 2020<span class="hljs-string">-01</span><span class="hljs-string">-01</span> [SC] [expires: 2021<span class="hljs-string">-01</span><span class="hljs-string">-08</span>]<br>      W4IJICKJLQPX8CMB9IYZMVPSMCCJIHOTGSM2QFGP<br>uid           [ultimate] Edison Jwa &lt;example@uv.uy&gt;<br>sub   rsa4096 2020<span class="hljs-string">-01</span><span class="hljs-string">-01</span> [E] [expires: 2021<span class="hljs-string">-01</span><span class="hljs-string">-08</span>]<br>sub   rsa4096 2020<span class="hljs-string">-01</span><span class="hljs-string">-01</span> [S] [expires: 2021<span class="hljs-string">-01</span><span class="hljs-string">-08</span>]<br>sub   rsa4096 2020<span class="hljs-string">-01</span><span class="hljs-string">-01</span> [A] [expires: 2021<span class="hljs-string">-01</span><span class="hljs-string">-08</span>]<br></code></pre></td></tr></table></figure><h3 id="修改主密钥有效期">修改主密钥有效期</h3><p>这里我们修改主密钥有效期为永久,这样每年只需要更新子密钥即可以了~</p><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><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></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">edison</span>@edison-pc ~&gt; gpg --expert --edit-key W<span class="hljs-number">4</span>IJICKJLQPX<span class="hljs-number">8</span>CMB<span class="hljs-number">9</span>IYZMVPSMCCJIHOTGSM<span class="hljs-number">2</span>QFGP<br><span class="hljs-attribute">gpg</span> (GnuPG) <span class="hljs-number">2</span>.<span class="hljs-number">2</span>.<span class="hljs-number">19</span>; Copyright (C) <span class="hljs-number">2019</span> Free Software Foundation, Inc.<br><span class="hljs-attribute">This</span> is free software: you are free to change and redistribute it.<br><span class="hljs-attribute">There</span> is NO WARRANTY, to the extent permitted by law.<br><br><span class="hljs-attribute">Secret</span> key is available.<br><br><span class="hljs-attribute">sec</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">01</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: SC  <br>     <span class="hljs-attribute">trust</span>: ultimate      validity: ultimate<br><span class="hljs-attribute">ssb</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">01</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: E   <br><span class="hljs-attribute">ssb</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">01</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: S   <br><span class="hljs-attribute">ssb</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">7</span>EC<span class="hljs-number">20</span>E<span class="hljs-number">50</span>EE<span class="hljs-number">5</span>ECDD<span class="hljs-number">5</span><br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">01</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: A   <span class="hljs-meta"></span><br><span class="hljs-meta">[ultimate] (1). Edison Jwa &lt;example@uv.uy&gt;</span><br><span class="hljs-meta"></span><br><span class="hljs-meta">gpg&gt; expire</span><br><span class="hljs-meta">Changing expiration time for the primary key.</span><br><span class="hljs-meta">Please specify how long the key should be valid.</span><br><span class="hljs-meta">         0 = key does not expire</span><br><span class="hljs-meta">      &lt;n&gt;  = key expires in n days</span><br><span class="hljs-meta">      &lt;n&gt;w = key expires in n weeks</span><br><span class="hljs-meta">      &lt;n&gt;m = key expires in n months</span><br><span class="hljs-meta">      &lt;n&gt;y = key expires in n years</span><br><span class="hljs-meta">Key is valid for? (0) 0</span><br><span class="hljs-meta">Key does not expire at all</span><br><span class="hljs-meta">Is this correct? (y/N) y</span><br><span class="hljs-meta"></span><br><span class="hljs-meta">sec  rsa4096/1234567890ABCDEF</span><br><span class="hljs-meta">     created: 2020-01-01  expires: never       usage: SC  </span><br><span class="hljs-meta">     trust: ultimate      validity: ultimate</span><br><span class="hljs-meta">ssb  rsa4096/1234567890ABCDEF</span><br><span class="hljs-meta">     created: 2020-01-01  expires: 2021-01-08  usage: E   </span><br><span class="hljs-meta">ssb  rsa4096/1234567890ABCDEF</span><br><span class="hljs-meta">     created: 2020-01-01  expires: 2021-01-08  usage: S   </span><br><span class="hljs-meta">ssb  rsa4096/1234567890ABCDEF</span><br><span class="hljs-meta">     created: 2020-01-01  expires: 2021-01-08  usage: A   </span><br><span class="hljs-meta">[ultimate] (1). Edison Jwa &lt;example@uv.uy&gt;</span><br><span class="hljs-meta"></span><br><span class="hljs-meta">gpg&gt; save</span><br></code></pre></td></tr></table></figure><p>此时可以发现有效期已经修改成功,以后只需要每年更新子密钥即可。</p><h2 id="备份-gpg-证书">备份 GPG 证书</h2><blockquote><p>请务必执行备份的操作,首先导入至 Yubikey 的密钥是无法提取出来的,其次也可以不会像我一样丢失之前的 GPG 密钥</p></blockquote><h3 id="导出公钥">导出公钥</h3><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">edison</span>@edison-pc ~/gpg-backup&gt; <br><span class="hljs-attribute">gpg</span> --armor --output public.asc  --export W<span class="hljs-number">4</span>IJICKJLQPX<span class="hljs-number">8</span>CMB<span class="hljs-number">9</span>IYZMVPSMCCJIHOTGSM<span class="hljs-number">2</span>QFGP<br></code></pre></td></tr></table></figure><h3 id="导出密钥">导出密钥</h3><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">edison</span>@edison-pc ~/gpg-backup&gt; <br><span class="hljs-attribute">gpg</span> --armor --output private.asc --export-secret-keys W<span class="hljs-number">4</span>IJICKJLQPX<span class="hljs-number">8</span>CMB<span class="hljs-number">9</span>IYZMVPSMCCJIHOTGSM<span class="hljs-number">2</span>QFGP<br></code></pre></td></tr></table></figure><h3 id="导出子证书密钥">导出子证书密钥</h3><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">edison</span>@edison-pc ~/gpg-backup&gt; <br><span class="hljs-attribute">gpg</span> --armor --output private-subkeys.asc --export-secret-subkeys W<span class="hljs-number">4</span>IJICKJLQPX<span class="hljs-number">8</span>CMB<span class="hljs-number">9</span>IYZMVPSMCCJIHOTGSM<span class="hljs-number">2</span>QFGP<br></code></pre></td></tr></table></figure><h2 id="上传-gpg-证书公钥">上传 GPG 证书公钥</h2><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><code class="hljs apache"><span class="hljs-attribute">edison</span>@edison-pc ~/gpg-backup&gt; <br><span class="hljs-attribute">gpg</span> --keyserver hkp://pgp.mit.edu --send-keys W<span class="hljs-number">4</span>IJICKJLQPX<span class="hljs-number">8</span>CMB<span class="hljs-number">9</span>IYZMVPSMCCJIHOTGSM<span class="hljs-number">2</span>QFGP<br><span class="hljs-attribute">gpg</span>: sending key W<span class="hljs-number">4</span>IJICKJLQPX<span class="hljs-number">8</span>CMB<span class="hljs-number">9</span>IYZMVPSMCCJIHOTGSM<span class="hljs-number">2</span>QFGP to hkp://pgp.mit.edu<br><span class="hljs-attribute">edison</span>@edison-pc ~/gpg-backup&gt; <br></code></pre></td></tr></table></figure><h2 id="设置-openpgp-卡">设置 OpenPGP 卡</h2><h3 id="修改-yubikey-默认-pin-码">修改 Yubikey 默认 PIN 码</h3><p>首先,我们修改掉 Yubikey 的默认 PIN 码,(PIN 和 Admin PIN)</p><p>输入 <code>gpg --card-edit</code> 开始进行修改</p><figure class="highlight livescript"><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><code class="hljs livescript">edison@edison-pc <span class="hljs-function">~&gt;</span> gpg --card-edit<br><br>×××××<br></code></pre></td></tr></table></figure><p>此处会输出 Yubikey 的信息</p><p>输入 <code>admin</code> 启用管理员指令</p><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs pgsql">gpg/card&gt; <span class="hljs-keyword">admin</span><br><span class="hljs-keyword">Admin</span> commands are allowed<br></code></pre></td></tr></table></figure><p>输入 <code>passwd</code> 开始修改 PIN 码</p><p>Yubikey 的 默认 PIN 码为 <code>123456</code><br>默认 Admin PIN 码为 <code>12345678</code></p><figure class="highlight gams"><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></pre></td><td class="code"><pre><code class="hljs gams">gpg/<span class="hljs-keyword">card</span>&gt; passwd<br>gpg: OpenPGP <span class="hljs-keyword">card</span> <span class="hljs-keyword">no</span>. ××××× detected<br><br><span class="hljs-number">1</span> - change PIN<br><span class="hljs-number">2</span> - unblock PIN<br><span class="hljs-number">3</span> - change Admin PIN<br><span class="hljs-number">4</span> - <span class="hljs-keyword">set</span> the <span class="hljs-comment">Reset Code</span><br>Q <span class="hljs-comment">- quit</span><br><br>Your <span class="hljs-comment">selection? 1</span><br></code></pre></td></tr></table></figure><p>输入 <code>1</code> ,修改 PIN 码,此处会要求输入默认 PIN 码,和新 PIN 码两次</p><blockquote><p>PIN 码的长度要求不低于 6 位</p></blockquote><figure class="highlight coq"><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></pre></td><td class="code"><pre><code class="hljs coq">PIN changed.<br><br><span class="hljs-number">1</span> - <span class="hljs-built_in">change</span> PIN<br><span class="hljs-number">2</span> - unblock PIN<br><span class="hljs-number">3</span> - <span class="hljs-built_in">change</span> Admin PIN<br><span class="hljs-number">4</span> - <span class="hljs-built_in">set</span> the <span class="hljs-keyword">Reset</span> Code<br>Q - quit<br><br>Your selection? <span class="hljs-number">3</span><br></code></pre></td></tr></table></figure><p>接下来,输入 <code>3</code> 开始修改 Admin PIN 码</p><blockquote><p>Admin PIN 码的长度要求不低于8位</p></blockquote><figure class="highlight gams"><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><code class="hljs gams">PIN changed.<br><br><span class="hljs-number">1</span> - change PIN<br><span class="hljs-number">2</span> - unblock PIN<br><span class="hljs-number">3</span> - change Admin PIN<br><span class="hljs-number">4</span> - <span class="hljs-keyword">set</span> the <span class="hljs-comment">Reset Code</span><br>Q <span class="hljs-comment">- quit</span><br><br>Your <span class="hljs-comment">selection? q</span><br><br>gpg/<span class="hljs-keyword">card</span>&gt; q<br></code></pre></td></tr></table></figure><h2 id="导入到-yubikey">导入到 Yubikey</h2><p>输入 <code>gpg --expert --edit-key</code></p><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><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></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">edison</span>@edison-pc ~&gt; gpg --expert --edit-key W<span class="hljs-number">4</span>IJICKJLQPX<span class="hljs-number">8</span>CMB<span class="hljs-number">9</span>IYZMVPSMCCJIHOTGSM<span class="hljs-number">2</span>QFGP<br><span class="hljs-attribute">gpg</span> (GnuPG) <span class="hljs-number">2</span>.<span class="hljs-number">2</span>.<span class="hljs-number">19</span>; Copyright (C) <span class="hljs-number">2019</span> Free Software Foundation, Inc.<br><span class="hljs-attribute">This</span> is free software: you are free to change and redistribute it.<br><span class="hljs-attribute">There</span> is NO WARRANTY, to the extent permitted by law.<br><br><span class="hljs-attribute">Secret</span> key is available.<br><br><span class="hljs-attribute">sec</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">09</span>  expires: never       usage: SC  <br>     <span class="hljs-attribute">trust</span>: ultimate      validity: ultimate<br><span class="hljs-attribute">ssb</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">09</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: E   <br><span class="hljs-attribute">ssb</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">09</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: S   <br><span class="hljs-attribute">ssb</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">09</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: A   <span class="hljs-meta"></span><br><span class="hljs-meta">[ultimate] (1). Edison Jwa &lt;example@uv.uy&gt;</span><br><span class="hljs-meta"></span><br><span class="hljs-meta">gpg&gt; key 1</span><br></code></pre></td></tr></table></figure><p>选中 <code>key 1</code></p><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><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></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">sec</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">09</span>  expires: never       usage: SC  <br>     <span class="hljs-attribute">trust</span>: ultimate      validity: ultimate<br><span class="hljs-attribute">ssb</span>* rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">09</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: E   <br><span class="hljs-attribute">ssb</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">09</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: S   <br><span class="hljs-attribute">ssb</span>  rsa<span class="hljs-number">4096</span>/<span class="hljs-number">1234567890</span>ABCDEF<br>     <span class="hljs-attribute">created</span>: <span class="hljs-number">2020</span>-<span class="hljs-number">01</span>-<span class="hljs-number">09</span>  expires: <span class="hljs-number">2021</span>-<span class="hljs-number">01</span>-<span class="hljs-number">08</span>  usage: A   <span class="hljs-meta"></span><br><span class="hljs-meta">[ultimate] (1). Edison Jwa &lt;example@uv.uy&gt;</span><br></code></pre></td></tr></table></figure><blockquote><p>此处的 <code>*</code> 表示该证书已被选中</p></blockquote><p>然后输入 <code>keytocard</code> 将 GPG 证书导入至 Yubikey 中</p><figure class="highlight subunit"><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></pre></td><td class="code"><pre><code class="hljs subunit">gpg&gt; keytocard<br>Please select where to store the key:<br>   (2) Encryption key<br>Your selection? 2<br><br>sec  rsa4096/1234567890ABCDEF<br>     created: 2020<span class="hljs-string">-01</span><span class="hljs-string">-09</span>  expires: never       usage: SC  <br>     trust: ultimate      validity: ultimate<br>ssb* rsa4096/1234567890ABCDEF<br>     created: 2020<span class="hljs-string">-01</span><span class="hljs-string">-09</span>  expires: 2021<span class="hljs-string">-01</span><span class="hljs-string">-08</span>  usage: E   <br>ssb  rsa4096/1234567890ABCDEF<br>     created: 2020<span class="hljs-string">-01</span><span class="hljs-string">-09</span>  expires: 2021<span class="hljs-string">-01</span><span class="hljs-string">-08</span>  usage: S   <br>ssb  rsa4096/1234567890ABCDEF<br>     created: 2020<span class="hljs-string">-01</span><span class="hljs-string">-09</span>  expires: 2021<span class="hljs-string">-01</span><span class="hljs-string">-08</span>  usage: A   <br>[ultimate] (1). Edison Jwa &lt;example@uv.uy&gt;<br>gpg&gt; key 1<br></code></pre></td></tr></table></figure><p>再次输入 <code>key 1</code> 取消选中,接下来重复此动作,分别导入 <code>key 2</code> 和 <code>key 3</code></p><h2 id="检查-yubikey-上存储的密钥">检查 Yubikey 上存储的密钥</h2><p>输入 <code>gpg --card-status</code> 即可查看 Yubikey 上存储的信息</p><p>后面进行签名的操作就都一样啦~</p><p><img src="https://i.yecdn.com/images/2020/01/10/1a47d0c644843aae49c044c76d09c596.png" alt="1a47d0c644843aae49c044c76d09c596.png"></p><h2 id="参考链接">参考链接</h2><p><a href="https://support.yubico.com/support/solutions/articles/15000006420-using-your-yubikey-with-openpgp"> Using Your YubiKey with OpenPGP </a></p><p><a href="https://ocramius.github.io/blog/yubikey-for-ssh-gpg-git-and-local-login/">YubiKey for SSH, Login, 2FA, GPG and Git Signing</a></p><p><a href="https://www.thepolyglotdeveloper.com/2019/02/use-yubikey-pgp-signing-encryption-authentication/">Use A YubiKey For PGP Signing, Encryption, And Authentication</a></p><p><a href="https://www.hanselman.com/blog/HowToSetupSignedGitCommitsWithAYubiKeyNEOAndGPGAndKeybaseOnWindows.aspx">How to setup Signed Git Commits with a YubiKey NEO and GPG and Keybase on Windows</a></p><p><a href="https://www.engineerbetter.com/blog/yubikey-signed-commits/">Yubikeys for Signed Git Commits</a></p>]]></content>
  418.    
  419.    <summary type="html">
  420.    
  421.      &lt;p&gt;前两天入手了一个 yubikey 5 之后,在给几个常用的网站配置了用于两部认证的安全密钥之后,便在想还能拿来做什么,经过一番尝试之后发现了几个比较好玩的玩法。本文便是其中之一。
  422.    
  423.    </summary>
  424.    
  425.    
  426.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  427.    
  428.    
  429.      <category term="Secure" scheme="https://www.wevg.org/tags/Secure/"/>
  430.    
  431.      <category term="Github" scheme="https://www.wevg.org/tags/Github/"/>
  432.    
  433.      <category term="GPG" scheme="https://www.wevg.org/tags/GPG/"/>
  434.    
  435.      <category term="Yubikey" scheme="https://www.wevg.org/tags/Yubikey/"/>
  436.    
  437.  </entry>
  438.  
  439.  <entry>
  440.    <title>导出 iCloud Keychain 中的密码</title>
  441.    <link href="https://www.wevg.org/archives/export-passwords-from-iCloud-keychain/"/>
  442.    <id>https://www.wevg.org/archives/export-passwords-from-iCloud-keychain/</id>
  443.    <published>2019-12-28T23:56:49.000Z</published>
  444.    <updated>2019-12-28T23:56:50.000Z</updated>
  445.    
  446.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>因为在使用 1Password, 便一直在想有没有办法将 iCloud Keychain 中储存的密码导出来,直到前几天,终于找到了解决办法。<span id="more"></span></p><h1 id="必要条件">必要条件</h1><ul><li>一个能正常运行的 macOS 系统</li></ul><h1 id="导出过程">导出过程</h1><ol><li><p><a href="https://www.dropbox.com/sh/a3skeey2zqimdlv/AAD87q6N_EJZ1YoPe5SA35a1a?dl=0">点击此处</a>下载 <code>mrc-converter-suite</code> 压缩包</p></li><li><p>解压,并将 <code>mrc-converter-suite</code> 目录移动至桌面</p></li><li><p>打开 <code>Preference</code> -&gt; <code>Security &amp; Privacy</code> -&gt; <code>Privacy</code> -&gt; <code>Acceessibility</code> ,点击左下角的 🔒 <code>Unlock</code> 解锁后 ,在右侧添加并勾选 <code>Script Editor</code></p><p><img src="https://i.yecdn.com/images/2019/12/28/5f71765d32e45ca47d013c7228f4680e.png" alt="5f71765d32e45ca47d013c7228f4680e.png"></p></li><li><p>双击运行 <code>mrc-converter-suite</code> 目录下的 <code>Get_Safari12_Passwords.applescript</code> 点击 <code>开始按钮</code></p><p><img src="https://i.yecdn.com/images/2019/12/28/262179be4ab267a751e24efe1696105e.png" alt="262179be4ab267a751e24efe1696105e.png"></p></li><li><p>如果没有问题的话,这时会弹出对话框要求<strong>输入密码</strong>解锁 Keychain</p><p><img src="https://i.yecdn.com/images/2019/12/28/aab014740ed161a63d889601ec5a0225.png" alt="aab014740ed161a63d889601ec5a0225.png"></p><p>输入密码后,点击 <code>Continue</code> ,你会发现已经开始导出了 (>y<)</p><p><img src="https://i.yecdn.com/images/2019/12/28/71defd4349c5b22c317ff41736e178ef.png" alt="71defd4349c5b22c317ff41736e178ef.png"></p></li><li><p>等他跑完之后,会弹出提示框,并在桌面生成一个 <code>pm_export.csv</code> 文件<br><img src="https://i.yecdn.com/images/2019/12/28/6875452e9057287c214fc4acca0dac84.png" alt="6875452e9057287c214fc4acca0dac84.png"></p></li></ol><h1 id="导入至-1password">导入至 1Password</h1><p>将 <code>pm_export.csv</code> 文件 拖动至 <code>mrc-converter-suite</code> 目录下 <code>macOSConvertHelper</code> 上,点击弹出对话框上的 <code>Run</code><br><img src="https://i.yecdn.com/images/2019/12/28/67ad70aeee4d29f4a43d7ae0b487cde1.png" alt="67ad70aeee4d29f4a43d7ae0b487cde1.png"><br>并在接下来的页面上选择 <code>CSV</code><br><img src="https://i.yecdn.com/images/2019/12/28/49d1e41d5b998b678304a2723a687da2.png" alt="49d1e41d5b998b678304a2723a687da2.png"><br>接下来直接点击 <code>Convert</code> 即可<br><img src="https://i.yecdn.com/images/2019/12/28/5682c606920f92cb881866fb9103a765.png" alt="5682c606920f92cb881866fb9103a765.png"></p><p>正常情况下,会输出如下图所示的信息<br><img src="https://i.yecdn.com/images/2019/12/28/d68cf9ec7c9e2cc205a9edd256ba8a9c.png" alt="d68cf9ec7c9e2cc205a9edd256ba8a9c.png"></p><p>这时,我们打开并解锁 1Password 客户端后,双击桌面上的 <code>1P_import.1pif</code> 文件 会弹出如下消息,点击 <code>Import</code> 之后就导入成功辣~ (<em>´▽`</em>)</p><p><img src="https://i.yecdn.com/images/2019/12/28/e4f5cdb6da72f38cfa10b8f20b65d757.png" alt="e4f5cdb6da72f38cfa10b8f20b65d757.png"></p><h1 id="参考链接">参考链接</h1><ul><li><a href="https://discussions.agilebits.com/discussion/30286/mrcs-convert-to-1password-utility/p1">MrC’s Convert to 1Password Utility (mrc-converter-suite)</a></li></ul><p>Image Source: <a href="https://unsplash.com/photos/4pPzKfd6BEg">Patryk Grądys</a></p>]]></content>
  447.    
  448.    <summary type="html">
  449.    
  450.      &lt;p&gt;因为在使用 1Password, 便一直在想有没有办法将 iCloud Keychain 中储存的密码导出来,直到前几天,终于找到了解决办法。
  451.    
  452.    </summary>
  453.    
  454.    
  455.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  456.    
  457.    
  458.      <category term="Secure" scheme="https://www.wevg.org/tags/Secure/"/>
  459.    
  460.      <category term="Tools" scheme="https://www.wevg.org/tags/Tools/"/>
  461.    
  462.      <category term="MacOS" scheme="https://www.wevg.org/tags/MacOS/"/>
  463.    
  464.      <category term="iOS" scheme="https://www.wevg.org/tags/iOS/"/>
  465.    
  466.      <category term="Password" scheme="https://www.wevg.org/tags/Password/"/>
  467.    
  468.  </entry>
  469.  
  470.  <entry>
  471.    <title>解决 GPG 签名失败的问题</title>
  472.    <link href="https://www.wevg.org/archives/fix-gpg-sign-error/"/>
  473.    <id>https://www.wevg.org/archives/fix-gpg-sign-error/</id>
  474.    <published>2019-12-28T09:06:49.000Z</published>
  475.    <updated>2019-12-28T09:06:49.000Z</updated>
  476.    
  477.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>自从装了黑苹果之后,越来越喜欢用 MacOS 了,当然作为一个 MacOS 的小白用户,难免遇到各种各样的问题,这个便是我遇到的问题其中之一。<span id="more"></span></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><code class="hljs subunit"><span class="hljs-keyword">error: </span>gpg failed to sign the data<br>fatal: failed to write commit object<br></code></pre></td></tr></table></figure><p>今天当我打算为 git 签名的时候,突然遇到了这个问题,finally 总算找到了解决办法。<s>也顺便水一下博客好了</s></p><p><img src="https://i.yecdn.com/images/2019/12/28/9edb27acb51895721f4b543fd5fe910e.png" alt="9edb27acb51895721f4b543fd5fe910e.png"></p><h1 id="解决方案">解决方案</h1><p>因为我的 shell 使用的是 zsh 所以此处也以 zsh 为例,当然其他shell的操作方法也比较类似啦~</p><blockquote><p>当然前提是你已经成功的安装好 git 和 gpg 的情况啦~</p></blockquote><p>将 <code>export GPG_TTY=$(tty)</code> 添加到 <code>~/.zshrc</code> 文件中,重新加载 shell ,这时候你会发现已经可以签名了,耶 (<em>&gt; ω &lt;</em>)</p><p>但是如果你是在使用 VS Code 或者其他的工具执行 commit 工作的时候,还是会报错,这里的解决方法为:<br>首先安装 <code>pinentry-mac</code>,</p><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm"><span class="hljs-keyword">brew </span><span class="hljs-keyword">install </span>pinentry-mac<br></code></pre></td></tr></table></figure><p>接下来,修改 <code>gpg-agent.conf</code> 配置文件</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arcade">echo <span class="hljs-string">&quot;pinentry-program /usr/local/bin/pinentry-mac&quot;</span> &gt;&gt; ~<span class="hljs-regexp">/.gnupg/g</span>pg-agent.conf<br></code></pre></td></tr></table></figure><p>最后,kill 掉当前所有的 <code>gpg-agent</code></p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">killall gpg-agent</span><br></code></pre></td></tr></table></figure><p>这时,再执行 commit 便不会再报错辣~</p><p><img src="https://i.yecdn.com/images/2019/12/28/6fced2107d1e19d82444aba7317121ae.png" alt="6fced2107d1e19d82444aba7317121ae.png"></p><h1 id="参考链接">参考链接</h1><ul><li><a href="https://stackoverflow.com/questions/39494631/gpg-failed-to-sign-the-data-fatal-failed-to-write-commit-object-git-2-10-0">gpg failed to sign the data fatal: failed to write commit object [Git 2.10.0]</a></li></ul><p>Image Source: <a href="https://unsplash.com/photos/xApC8DIiD54">Clark Van Der Beken</a></p>]]></content>
  478.    
  479.    <summary type="html">
  480.    
  481.      &lt;p&gt;自从装了黑苹果之后,越来越喜欢用 MacOS 了,当然作为一个 MacOS 的小白用户,难免遇到各种各样的问题,这个便是我遇到的问题其中之一。
  482.    
  483.    </summary>
  484.    
  485.    
  486.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  487.    
  488.    
  489.      <category term="Secure" scheme="https://www.wevg.org/tags/Secure/"/>
  490.    
  491.      <category term="Github" scheme="https://www.wevg.org/tags/Github/"/>
  492.    
  493.      <category term="Tools" scheme="https://www.wevg.org/tags/Tools/"/>
  494.    
  495.      <category term="MacOS" scheme="https://www.wevg.org/tags/MacOS/"/>
  496.    
  497.      <category term="Shell" scheme="https://www.wevg.org/tags/Shell/"/>
  498.    
  499.  </entry>
  500.  
  501.  <entry>
  502.    <title>2019 年终总结</title>
  503.    <link href="https://www.wevg.org/archives/bye-2019/"/>
  504.    <id>https://www.wevg.org/archives/bye-2019/</id>
  505.    <published>2019-12-25T01:51:41.000Z</published>
  506.    <updated>2020-01-10T12:07:47.000Z</updated>
  507.    
  508.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><span id="more"></span><p>越长大便越是觉得时间过得快了,转眼间一年便又这么过去了。到了年底,也就要开始着手准备写今年的年终总结了。对于我来说,不论是身体上还是心理上,今年算的上是最近几年以来,最复杂的一年了,孟子曾说过“<em>天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。</em>”,相信所有的一切最终终会有一个结果的吧……</p>    <div id="aplayer-qCGdofEH" class="aplayer aplayer-tag-marker meting-tag-marker"         data-id="1405259103" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86"    ></div><p>还是和去年一样,先来说说网站部分把~</p><ul><li>添加了 AdSense 广告 (但是完全没有小钱钱 QAQ</li><li>换到过 icarus,Next 主题,然后又换回了 Suka</li><li>网站转为 Serverless,并写了 CI,还做了一大堆优化(感谢苏卡卡大佬</li><li>让博客支持 Dark Mode (根据系统环境自动切换)<br>2019-12-25 更新 Dark Mode 配色方案,部分配色方案根据 Material Design Documents 重写</li><li>评论系统从 gitalk 换回到了 disqus(因为发现如果想换主题的时候简直是灾难 ㅠㅠ) ,也顺带发现并解决了 disqus 一个小问题 (果然我的 bug 体制还是蛮严重的啦~</li><li>把 <a href="https://uv.uy">uv.uy</a> 做成了个人主页,然后把短链接做到了子目录里(其实最近是有在打算重新写这个页面的啦,就是一直没什么灵感……<br>2019-12-25 : 页面重写好啦~ o(<em> ̄▽ ̄</em>)ブ (感谢小浩大佬在Nginx配置方面的帮助 比心~</li><li>水了一大票的文章,然后也从年初开始网站终于有人看啦~ (≧▽≦) 平均下来差不多每个月有个六七千了,但是不知道什么时候才能像大佬们一样厉害 (´・ω・`) <img src="https://i.yecdn.com/images/2019/12/22/7cedeac4b5d961cdd82d200719648c03.png" alt=""></li></ul><p>网站的部分差不多也就是这样啦~ (<sup>・ω・</sup> )3</p><p>接下来就说说我自己把~在这里真心的感谢大佬们一直以来对我的帮助,帮我这个腊鸡解决问题。比如 Peter,小浩,DCC,苏卡卡,U2FsdGVkX1,Troy,奶子冰,Elepover,METO,鱼塔,ls12,辰辰,indexyz,NB,房产证大佬,jiting,……(大佬们实在是太多啦,实在写不过来,捂脸 〒.〒</p><p>先是在年初的时候,在电台实习了两个月,结交了好多的新朋友,也了解到了很多的新知识。</p><p>然后也终于开始用上了我的 8086K ,然后主力 OS 逐渐从 Windows 切换到了 Manjaro</p><p>今年夏天在苏州和南京旅游了一圈还面基了 Peter ls12 Troy,(没想到我也有机会面基大佬诶 (´∀`)<br>哦对,还跟大佬拍了一个微电影(打下手</p><p>另外,还蛮偶然的,中了房产证大佬抽的奖,开心~ (●’ω`●)</p><p><img src="https://i.yecdn.com/images/2019/09/30/ac1d343512bcfab9022d1d59e1b45361.png" alt=""></p><p>学了一点 React 的皮毛,然后重新写了收款的页面(多亏了 Peter 我才会去学,大大的感谢 (*≧▽≦)</p><p>把 TeamSpeak 服务器从国内迁移到了海外,然后加了多个接入点。还写了几个小网页。</p><p>2020-01-10 更新一下,在 2019 年的最后一天见到了 Zohar 和 Volio 两位大佬~某种意义上算是一起跨的年 其实本来以为会自己一个人跨年的,然后还挺意外的和一个在七天宾馆打工的小哥哥一起跨的年(大概是最特殊的一次跨年了吧~</p><p>好像也没有别的什么了把……</p><p>最后感谢您能看我的这篇流水帐,提前祝大家圣诞快乐~~~<br>也顺便提前祝新的一年一切顺利,心想事成,万事如意~ ´・ᴗ・`</p>]]></content>
  509.    
  510.    <summary type="html">
  511.    
  512.      
  513.      
  514.        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
  515.      
  516.    
  517.    </summary>
  518.    
  519.    
  520.      <category term="Other" scheme="https://www.wevg.org/categories/Other/"/>
  521.    
  522.    
  523.  </entry>
  524.  
  525.  <entry>
  526.    <title>Docker 搭建 TeamSpeak 服务器</title>
  527.    <link href="https://www.wevg.org/archives/teamspeak-server-via-docker/"/>
  528.    <id>https://www.wevg.org/archives/teamspeak-server-via-docker/</id>
  529.    <published>2019-12-07T06:59:55.000Z</published>
  530.    <updated>2019-12-07T06:59:55.000Z</updated>
  531.    
  532.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>本文将介绍如何使用 Docker 搭建 TeamSpeak 服务器。 <span id="more"></span></p><blockquote><p>如果您想找一个最快最简单的搭建方法,请按照本文来进行搭建。除此之外的更多情况下,我更推荐按照 <a href="/archives/teamspeak-server-build/">TeamSpeak 服务器搭建方法</a> 来进行搭建。</p></blockquote><h1 id="安装-docker">安装 Docker</h1><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><code class="hljs bash">curl -fsSL https://get.docker.com -o get-docker.sh<br>sh get-docker.sh<br></code></pre></td></tr></table></figure><h1 id="启动容器">启动容器</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -p 9987:9987/udp -p 10011:10011 -p 30033:30033 -e TS3SERVER_LICENSE=accept teamspeak<br></code></pre></td></tr></table></figure><p><strong>此时,便会发现服务器已经启动成功。</strong></p><h1 id="支持的环境变量">支持的环境变量</h1><ul><li><p><code>TS3SERVER_LICENSEPATH</code><br>设置TeamSpeak服务器要查找 <code>licensekey.dat</code> 的路径。此变量是 <code>licensekey.dat</code> 所在目录的路径。默认为 <code>/var/ts3server/</code> 。</p></li><li><p><code>TS3SERVER_DB_PLUGIN</code><br>此变量控制 TeamSpeak 使用哪种数据库。</p></li><li><p><code>TS3SERVER_DB_PLUGINPARAMETER</code><br>此变量用于为db插件发送参数。</p></li><li><p><code>TS3SERVER_DB_SQLPATH</code><br>此变量控制TeamSpeak服务器在何处查找sql文件。默认为 <code>/opt/ts3server/sql/</code> 。</p></li><li><p><code>TS3SERVER_DB_SQLCREATEPATH</code><br>此变量是用于初始化数据库的sql脚本的路径。这个路径关系到 <code>TS3SERVER_DB_SQLPATH</code></p></li><li><p><code>TS3SERVER_DB_CONNECTIONS</code><br>这个变量控制是如何到数据库的并发连接。必须至少为2,最多为100。默认值为10。</p></li><li><p><code>TS3SERVER_DB_CLIENTKEEPDAYS</code><br>此变量是 TeamSpeak 服务器将保留未使用的用户身份的天数。已添加到组中的用户将不会被删除,但来宾(Guest)将被删除。</p></li><li><p><code>TS3SERVER_IP_WHITELIST</code><br>此变量用于设置白名单文件的位置。该文件包含IP地址列表,这些IP地址不受洪水保护系统的限制。<br><strong>警告:请勿添加任何您不信任的IP地址,因为这将使它们淹没服务器。</strong></p></li><li><p><code>TS3SERVER_IP_BLACKLIST</code><br>此变量用于设置黑名单文件的位置。该文件包含IP地址列表,即使服务器重新启动,该列表中的IP地址也无法连接到服务器的查询界面。</p></li><li><p><code>TS3SERVER_LOG_PATH</code><br>此变量控制服务器存储其日志文件的文件夹。默认为 <code>/var/ts3server/logs/</code>。</p></li><li><p><code>TS3SERVER_LOG_QUERY_COMMANDS</code><br>如果将此变量设置为<code>1</code>,则将记录发送到服务器的每个查询命令。<br><strong>警告:虽然这在服务器出现问题时可能会有所帮助,但要注意,这可能会导致日志文件变得非常大。除非您绝对希望记录所有命令,否则我们建议大多数时候将此变量设置为0。</strong></p></li><li><p><code>TS3SERVER_LOG_APPEND</code><br>如果将此变量设置为<code>1</code>,则每个虚拟服务器都会将所有新日志条目写入 Log 文件中。我们建议将此变量设置为<code>0</code>,这可以减轻你看 Log 文件时的工作量。</p></li><li><p><code>TS3SERVER_QUERY_PROTOCOLS</code><br>逗号分隔的协议列表,可用于连接到ServerQuery。可用的值为<code>raw</code>和<code>ssh</code>。如果指定了raw,则默认的 ServerQuery 会通过 10011/tcp 端口进行连接。如果通过SSH进行连接,则加密的 ServerQuery 则会通过 10022/tcp 端口进行连接。可以在此参数中指定上述值的任何组合,包括将其保留为空,这将完全禁用 ServerQuery。</p></li><li><p><code>TS3SERVER_QUERY_TIMEOUT</code><br>由于不活动而断开查询连接之前的秒数。 如果将值设置为零或负数,则将禁用超时。 默认值为300秒。</p></li><li><p><code>TS3SERVER_QUERY_SSH_RSA_HOST_KEY</code><br>查询要使用的ssh_host_rsa_key的所在路径。如果不存在,它将在服务器启动时创建。</p></li></ul><h1 id="配置许可证文件">配置许可证文件</h1><p>当一台服务器中需要搭建人数大于32人,或一台以上TeamSpeak 服务器时,便需要许可证文件。为此,必须要服务器提供一个 licensekey.dat 文件。一种方法是将licensekey.dat挂载到/var/ts3server。<br>即在运行 docker 时添加 <code>-v /location/to/licensekey.dat:/var/ts3server/licensekey.dat</code> 变量到命令行中,</p><blockquote><p>请将 <code>/location/to/licensekey.dat</code> 替换为 licensekey.dat 实际所在的位置。</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><code class="hljs bash">docker run -p 9987:9987/udp -p 10011:10011 -p 30033:30033 -e TS3SERVER_LICENSE=accept teamspeak `-v /opt/teamspeak/licensekey.dat:/var/ts3server/licensekey.dat<br></code></pre></td></tr></table></figure><p>我们的 TeamSpeak 服务器列表 <a href="https://ts.wevg.org">服务器列表</a></p><p><s>又水了一篇文章呢</s>~(误x</p><h1 id="相关链接">相关链接</h1><ul><li><a href="https://hub.docker.com/_/teamspeak">TeamSpeak - DockerHub</a></li></ul>]]></content>
  533.    
  534.    <summary type="html">
  535.    
  536.      &lt;p&gt;本文将介绍如何使用 Docker 搭建 TeamSpeak 服务器。
  537.    
  538.    </summary>
  539.    
  540.    
  541.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  542.    
  543.    
  544.      <category term="Linux" scheme="https://www.wevg.org/tags/Linux/"/>
  545.    
  546.      <category term="搭建" scheme="https://www.wevg.org/tags/%E6%90%AD%E5%BB%BA/"/>
  547.    
  548.      <category term="服务器" scheme="https://www.wevg.org/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
  549.    
  550.      <category term="VoIP" scheme="https://www.wevg.org/tags/VoIP/"/>
  551.    
  552.      <category term="语音" scheme="https://www.wevg.org/tags/%E8%AF%AD%E9%9F%B3/"/>
  553.    
  554.      <category term="Docker" scheme="https://www.wevg.org/tags/Docker/"/>
  555.    
  556.  </entry>
  557.  
  558.  <entry>
  559.    <title>让网站支持深色模式</title>
  560.    <link href="https://www.wevg.org/archives/add-darkmode-support/"/>
  561.    <id>https://www.wevg.org/archives/add-darkmode-support/</id>
  562.    <published>2019-12-05T14:44:02.000Z</published>
  563.    <updated>2020-05-24T18:01:30.000Z</updated>
  564.    
  565.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>前不久,在升级到 iOS 13 并启用了深色模式后,便在想有没有办法让网站可以像适配的 App 一样无缝在亮色模式与深色模式间互相切换。本文将介绍目前我在使用或者说我发现的两种解决方法。</p><span id="more"></span><p>这里就说一下我现在使用的两种方法,Darkmode.js 方式 与 CSS 方式</p><h1 id="darkmode-js-方式">Darkmode.js 方式</h1><p>这个是我最初的解决方案,可是这个最初偶然发现的项目,才促使了我后面的方法。<br>使用 Darkmode.js 的方式很简单,在网页的代码中加入,即可调用完成。</p><figure class="highlight html"><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><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;https://cdn.jsdelivr.net/npm/darkmode-js@1.4.0/lib/darkmode-js.min.js&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript"></span><br><span class="javascript">  <span class="hljs-keyword">new</span> Darkmode(&#123; <span class="hljs-attr">label</span>: <span class="hljs-string">&#x27;🌓&#x27;</span> &#125;).showWidget();</span><br><span class="javascript"></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><p>但是可能会出现的情况是,部分网页没有变成深色,然后你又神奇的发现你的图片被反色了~  (#°Д°)</p><p>Github 项目地址: <a href="https://github.com/sandoche/Darkmode.js">https://github.com/sandoche/Darkmode.js</a></p><h1 id="css-方式">CSS 方式</h1><p>就在去年macOS Mojave发行之前,W3C添加了一份草案规范,<code>prefers-color-scheme</code> ,Safari(v12.1及以上版本),Chrome(v76及以上版本)和Firefox(v67及以上版本)都支持该草案。</p><p>有三个可能的值:</p><ul><li>no-preference: 如果设备不支持某种模式或用户未做出选择,则为默认值</li><li>light: 用户选择了浅色模式</li><li>dark: 用户选择了深色模式</li></ul><p>实际上,用法非常简单。此处以我的网站为例,我现在使用的主题作为浅色模式,然后使用<code>@media (prefers-color-scheme: dark)</code> 深色模式覆盖相关部分的CSS ,比如:</p><figure class="highlight css"><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></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-keyword">@media</span> (<span class="hljs-attribute">prefers-color-scheme</span>: dark) &#123;<br>    <span class="hljs-selector-tag">body</span> &#123;<br>        <span class="hljs-attribute">color</span>: <span class="hljs-number">#fff</span>;<br>        <span class="hljs-attribute">background</span>: <span class="hljs-number">#000</span>;<br>    &#125;<br><br>    <span class="hljs-selector-tag">a</span> &#123;<br>        <span class="hljs-attribute">color</span>: <span class="hljs-number">#369fe4</span>;<br>    &#125;<br><br>    <span class="hljs-selector-tag">footer</span> <span class="hljs-selector-tag">p</span> &#123;<br>        <span class="hljs-attribute">color</span>: <span class="hljs-number">#aaa</span>;<br>    &#125;<br><br>    <span class="hljs-selector-tag">header</span> <span class="hljs-selector-tag">h1</span>,<br>    <span class="hljs-selector-tag">header</span> <span class="hljs-selector-tag">h2</span> &#123;<br>        <span class="hljs-attribute">color</span>: <span class="hljs-number">#fff</span>;<br>    &#125;<br><br>    <span class="hljs-selector-tag">header</span> <span class="hljs-selector-tag">h1</span> <span class="hljs-selector-tag">a</span> &#123;<br>        <span class="hljs-attribute">color</span>: <span class="hljs-number">#fff</span>;<br>    &#125;<br><br>    <span class="hljs-selector-tag">nav</span> <span class="hljs-selector-tag">ul</span> <span class="hljs-selector-tag">li</span> &#123;<br>        <span class="hljs-attribute">background</span>: <span class="hljs-number">#000</span>;<br>    &#125;<br><br>    <span class="hljs-selector-class">.divider</span> &#123;<br>        <span class="hljs-attribute">border-bottom</span>: <span class="hljs-number">1px</span> solid <span class="hljs-number">#ddd</span>;<br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><p>然后网站便会无缝的选择与用户设备相匹配的主题。</p><p><img src="https://static.hit.moe/blog/source/darkmode-support/bdbe081f16203f2dbeedf213fb7ab980.jpg" alt=""></p><h1 id="支援设备">支援设备</h1><p>这样做的好处是在iOS 13, macOS 10.14(Mojave), Android 10, Windows 1809 及以上的系统版本中即时更新的。只需更改系统主题,CSS就会更新,而无需刷新或者点击网页。</p><p>目前支援的浏览器版本:</p><script src="https://static.hit.moe/blog/js/caniuse-embed.min.js"></script><p class="ciu_embed" data-feature="prefers-color-scheme" data-periods="future_1,current,past_1,past_2" data-accessible-colours="false"><picture><source type="image/webp" srcset="https://caniuse.bitsofco.de/image/prefers-color-scheme.webp"><source type="image/png" srcset="https://caniuse.bitsofco.de/image/prefers-color-scheme.png"><img src="https://caniuse.bitsofco.de/image/prefers-color-scheme.jpg" alt="Data on support for the prefers-color-scheme feature across the major browsers from caniuse.com"></picture></p><h1 id="相关链接">相关链接</h1><ul><li><p><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme">prefers-color-scheme</a></p></li><li><p><a href="https://blogs.windows.com/windowsexperience/2019/04/01/windows-10-tip-dark-theme-in-file-explorer/">Windows 10 Tip: Dark theme in File Explorer</a></p></li><li><p><a href="https://web.dev/prefers-color-scheme/">Hello darkness, my old friend</a></p></li><li><p><a href="https://bendodson.com/weblog/2019/06/12/website-dark-mode-ios-13-macos-mojave/">Customising a website for iOS 13 / macOS Mojave Dark Mode</a></p></li><li><p><a href="https://developer.android.com/guide/topics/ui/look-and-feel/darktheme">Dark theme | Android Developers</a></p></li><li><p><a href="https://support.apple.com/en-us/HT208976">How to use Dark Mode on your Mac</a></p></li><li><p><a href="https://support.apple.com/en-us/HT210332">Use Dark Mode on your iPhone, iPad, or iPod touch</a></p></li></ul>]]></content>
  566.    
  567.    <summary type="html">
  568.    
  569.      &lt;p&gt;前不久,在升级到 iOS 13 并启用了深色模式后,便在想有没有办法让网站可以像适配的 App 一样无缝在亮色模式与深色模式间互相切换。本文将介绍目前我在使用或者说我发现的两种解决方法。&lt;/p&gt;
  570.    
  571.    </summary>
  572.    
  573.    
  574.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  575.    
  576.    
  577.      <category term="Website" scheme="https://www.wevg.org/tags/Website/"/>
  578.    
  579.      <category term="CSS" scheme="https://www.wevg.org/tags/CSS/"/>
  580.    
  581.      <category term="HTML" scheme="https://www.wevg.org/tags/HTML/"/>
  582.    
  583.  </entry>
  584.  
  585.  <entry>
  586.    <title>复制 Youtube 订阅列表到其他账号</title>
  587.    <link href="https://www.wevg.org/archives/transfer-your-youtube-subscriptions/"/>
  588.    <id>https://www.wevg.org/archives/transfer-your-youtube-subscriptions/</id>
  589.    <published>2019-11-15T13:37:11.000Z</published>
  590.    <updated>2019-11-15T13:37:11.000Z</updated>
  591.    
  592.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>在新开了一辆 Youtube Premium 的印度车之后,就有朋友遇到想复制 Youtube 订阅列表的情况了,在一番尝试之后,便准备将复制的方法分享出来。<span id="more"></span></p><p>在开始前,请确保你已经准备好两个账号,并记得自己的密码。 Pia!(o ‵-′)ノ”(ノ﹏&lt;。) 废话!</p><h1 id="导出订阅列表">导出订阅列表</h1><p>打开 Youtube 订阅管理器(<a href="https://www.youtube.com/subscription_manager">点此跳转</a>), 打开后,就能看到自己的订阅列表啦。<br>接下来,翻到页面最底部,便会看到一个导出 RSS 订阅的选项,点击<strong>导出订阅</strong></p><p><img src="https://i.yecdn.com/images/2019/11/15/82bd511eb3baf7225f99fb3bfc99ef40.png" alt=""></p><p>没有意外的话,这时候便会得到一个名为 <code>subscription_manager.xml</code> 的文件啦~ o(<em> ̄▽ ̄</em>)ブ</p><h1 id="导入订阅列表">导入订阅列表</h1><p>打开 Evan Reilly 大佬制作的 Youtube Subscriptions Importer(<a href="http://evanreilly.com/youtube-subscriptions-importer/">点此跳转</a>),上传刚刚获得的 <code>subscription_manager.xml</code> 文件,点击 左侧的 Import! 按钮。</p><p><img src="https://i.yecdn.com/images/2019/11/15/0d5abb79291867b5fc2a2fabaea713ce.png" alt=""></p><p>接下来,会弹出窗口要求登录你的<strong>要导入的谷歌账号</strong>,赋予访问 Youtube 账号的权限。</p><p><img src="https://i.yecdn.com/images/2019/11/15/dc33307fc3939a117734f5668f34a4f9.png" alt="dc33307fc3939a117734f5668f34a4f9.png"></p><p>然后就会发现已经导入完成啦~ <em>★,°</em>:.☆( ̄▽ ̄)/$:<em>.°★</em> 。</p><blockquote><p>Youtube Subscriptions Importer 为开源项目,项目地址 <a href="https://github.com/evanreilly/youtube-subscriptions-importer">https://github.com/evanreilly/youtube-subscriptions-importer</a></p></blockquote><h1 id="最后一点点">最后一点点</h1><p>如果还是对 Youtube Subscriptions Importer 不放心,可以打开 Google 授权页面(<a href="https://myaccount.google.com/u/1/permissions">点此跳转</a>),取消对 <strong>import subscriptions</strong> 的授权即可</p><p><img src="https://i.yecdn.com/images/2019/11/15/bca1202f07812c6d743feeaac2210849.png" alt="bca1202f07812c6d743feeaac2210849.png"></p><p>另外,不得不说 Youtube Music 配合 Google Home Mini 是真的香,但 App 里咖喱味是真的重…</p><p><img src="https://i.yecdn.com/images/2019/11/15/1f391e0b41011dc6781f9bab0cd82704.jpg" alt="1f391e0b41011dc6781f9bab0cd82704.jpg"></p>]]></content>
  593.    
  594.    <summary type="html">
  595.    
  596.      &lt;p&gt;在新开了一辆 Youtube Premium 的印度车之后,就有朋友遇到想复制 Youtube 订阅列表的情况了,在一番尝试之后,便准备将复制的方法分享出来。
  597.    
  598.    </summary>
  599.    
  600.    
  601.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  602.    
  603.    
  604.      <category term="Tools" scheme="https://www.wevg.org/tags/Tools/"/>
  605.    
  606.      <category term="Youtube" scheme="https://www.wevg.org/tags/Youtube/"/>
  607.    
  608.  </entry>
  609.  
  610.  <entry>
  611.    <title>使用 Disqus 后,网页中莫名出现可点击链接</title>
  612.    <link href="https://www.wevg.org/archives/fix-disqus-vglink-problem/"/>
  613.    <id>https://www.wevg.org/archives/fix-disqus-vglink-problem/</id>
  614.    <published>2019-11-08T17:58:38.000Z</published>
  615.    <updated>2019-11-08T17:58:38.000Z</updated>
  616.    
  617.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>一段关于解决在排查博客问题的过程中,遇到了在已经关闭 Hexo markdown renderer 的 autolink 选项后,依然有莫名出现可点击链接的经历。<span id="more"></span></p><h1 id="排查过程">排查过程</h1><h2 id="排查-markdown-renderer">排查 Markdown renderer</h2><p><img src="https://static.hit.moe/blog/source/hexo-vglink-problems/01.jpg" alt=""></p><p>在发现这种情况的时候,最先想到的是 markdown renderer 的问题,因为 hexo 默认自带的 markdown 渲染器是 hexo-renderer-marked,便根据文档<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>,在站点配置文件 <code>_config.yml</code> 里禁用 autolink 后,但是网页中仍然会莫名出现奇怪的链接。</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></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-string">…</span><br><span class="hljs-attr">marked:</span><br>  <span class="hljs-attr">autolink:</span> <span class="hljs-literal">false</span><br><span class="hljs-string">…</span><br></code></pre></td></tr></table></figure><p>因为 hexo 的 debug 中没有出现报错,我也不能确定问题是否出在 <code>hexo-renderer-marked</code> 上面,便安装了 <code>hexo-renderer-markdown-it</code> 进行测试,得到了相同的结果,基本确定问题不是 renderer 的问题。</p><h2 id="排查主题">排查主题</h2><p>接下来,我便将目光转制主题上,在翻遍 Suka 主题的配置文件和说明文档<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>后,没有找到相关的配置,便尝试将 Prism 代码高亮模块换回 hexo 自带的 highlight 模块,但是问题仍然存在。因为不能确定问题是否出在主题上,我便将博客主题更换成 NexT,但是还是出现同样的问题。在经过多次尝试后,确定问题不是出在主题上。</p><h2 id="排查站点配置文件及发现来源">排查站点配置文件及发现来源</h2><p>此时,问题的排查工作便陷入了僵局。苏卡卡大佬给出提议,让我尝试在站点配置文件 <code>_config.yml</code> 里将 <code>external_link</code> 禁用进行测试。尽管问题不是出在这里,但还是很感谢苏卡卡大佬。就在这时,我偶然发现链接中包含一个名为 <code>vglink</code> 的 class,在反复排查后,发现这个 class 来自 <strong>Disqus</strong>。</p><p><img src="https://static.hit.moe/blog/source/hexo-vglink-problems/02.png" alt=""></p><p>既然发现了问题的真正来源,那么只需要找到解决方法即可。</p><h1 id="解决办法">解决办法</h1><p>在 Disqus 站点设置, <code>Advanced</code> 选项卡下,取消勾选 <code>Affiliate links(VGLNK)</code> 选项并保存即可。</p><p><img src="https://static.hit.moe/blog/source/hexo-vglink-problems/03.png" alt=""></p><p>此时刷新页面就会发现莫名出现的可点击链接就已经消失了。<br><img src="https://static.hit.moe/blog/source/hexo-vglink-problems/04.png" alt=""></p><h2 id="原因">原因</h2><p>Disqus 的 Affiliate links 存在问题,该问题导致如果网页中存在任何与域名 (<a href="http://xn--abcde-k97h.com">即abcde.com</a>) 相似的任何文本,都会被转换成 HTML 超链接代码的格式:</p><figure class="highlight html"><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><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;vglnk&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;http://abcde.com&quot;</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">&quot;nofollow&quot;</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>abcde<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>.<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>com<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br></code></pre></td></tr></table></figure><p><s>其实是我的 BUG 体质再度灵验</s>(大雾</p><h1 id="参考链接">参考链接</h1><p><a href="http://www.queryadmin.com/1813/disable-affiliate-links-vglnk-disqus/">Disable Affiliate Links (VGLNK) on Disqus</a></p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1"  class="footnote-item"><p><a href="https://github.com/hexojs/hexo-renderer-marked">hexojs/hexo-renderer-marked</a> <a href="#fnref1" class="footnote-backref">↩</a></p></li><li id="fn2"  class="footnote-item"><p><a href="https://theme-suka.skk.moe/docs/plugin/#%E4%BB%A3%E7%A0%81%E9%AB%98%E4%BA%AE">Suka 主题说明文档</a> <a href="#fnref2" class="footnote-backref">↩</a></p></li></ol></section>]]></content>
  618.    
  619.    <summary type="html">
  620.    
  621.      &lt;p&gt;一段关于解决在排查博客问题的过程中,遇到了在已经关闭 Hexo markdown renderer 的 autolink 选项后,依然有莫名出现可点击链接的经历。
  622.    
  623.    </summary>
  624.    
  625.    
  626.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  627.    
  628.    
  629.      <category term="Hexo" scheme="https://www.wevg.org/tags/Hexo/"/>
  630.    
  631.      <category term="Disqus" scheme="https://www.wevg.org/tags/Disqus/"/>
  632.    
  633.      <category term="Markdown" scheme="https://www.wevg.org/tags/Markdown/"/>
  634.    
  635.      <category term="JavaScript" scheme="https://www.wevg.org/tags/JavaScript/"/>
  636.    
  637.  </entry>
  638.  
  639.  <entry>
  640.    <title>利用 Pair Locking 保证 iOS 设备数据安全</title>
  641.    <link href="https://www.wevg.org/archives/pair-locking-your-iphone/"/>
  642.    <id>https://www.wevg.org/archives/pair-locking-your-iphone/</id>
  643.    <published>2019-10-12T10:48:16.000Z</published>
  644.    <updated>2019-10-12T10:58:00.000Z</updated>
  645.    
  646.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>通过配置Pair Locking,保护隐私,防止执法人员对您的设备进行取证。<span id="more"></span> 但因对于受 checkm8 影响的设备的设备无效。</p><h1 id="什么是-checkm8-漏洞?">什么是 checkm8 漏洞?</h1><p><strong>checkm8</strong> 是由 Twitter 用户 <a href="https://twitter.com/axi0mX/status/1177542201670168576">@axi0mX</a> 发现并命名的 bootrom 漏洞 。它让永久越狱变成了可能,同时也带来了极大的安全隐患。举例来说,捡到或盗取你手机的不法人士,将可以通过越狱的方式开机,绕过 iCloud 的保护,同时你存放在中的个人数据也有被窥视的危险。<br>从使用 A5 芯片的 iPhone4S 到 使用了 A11 芯片的 iPhone8 iPhoneX 都可能受到这个漏洞的影响。<br>由于 bootrom 是存在于手机的硬件之中,无法通过软件去修改,意思也就是说苹果将无法通过软件更新的方式去将这个漏洞堵上,只要是拥有这个漏洞的硬件,无论 iOS 怎么升级都能被破解。目前基本上只要是使用 A11 或更早的芯片的 iPhone 机种都在受影响的范围内,也就是除了今年最新 iPhone 11 / 11 Pro / 11 Pro Max 和去年的 XS / XS Max / XR之外,剩下来所有的机种都有这个漏洞了。</p><p><a href="https://github.com/axi0mX/ipwndfu">https://github.com/axi0mX/ipwndfu</a></p><h1 id="为什么要配对锁定我的手机?">为什么要配对锁定我的手机?</h1><p>处于信息化社会的今天,我们的数字隐私日益收到执法机构,政府等等方面的攻击,尤其是在抗议活动,机场和过境点时,这个问题更为明显。  <span class="spoiler" onclick="this.classList.toggle('spoiler')">    <span class="spoiler-blur ">而且想必对于手机取证这种事情都或多或少有所耳闻。</span>  </span></p><p>通过配置 Pair Locking ,即使您被执法部门强迫,也会阻止 iPhone 取证工具连接到您的设备,读取您的聊天记录,相册,联系人,通话记录等行为。即使你被法律强制执行,也迫使你打开你的装置! 他们也只能 <em>手动</em> 查看您的手机内容,但他们无法复制并进行离线分析,他们无法运行自动扫描的扫描程序,而且他们也无法获取到您的各种 App 认证 token。</p><h1 id="pair-locking-是如何工作的?">Pair Locking 是如何工作的?</h1><p>取证工具使用名为pairing的概念从iPhone提取数据,Jonathan最好地解释了这一点:</p><blockquote><p>A pairing is a trusted relationship with another device, where a computer is granted privileged, trusted access on the iPhone. In order to have the level of control to backup the phone, download personal data, install applications, or perform other such tasks on an iOS device, the machine it’s connected to must be paired with the device. This is what iTunes and Xcode do to talk to the phone, but also what forensic imaging tools and a number of free hacking tools do as well.</p></blockquote><blockquote><p>配对,是与另一个设备相匹配的一种信任关系。在另一台设备上,计算机被赋予权限 ——在 iPhone 上受信任的访问。为了能够控制 iOS 设备进行备份手机,下载个人数据,安装应用程序或执行其他类似任务的控制级别,必须将与其连接的计算机与该设备配对。这是 iTunes 和 Xcode 与设备进行信息传输的方式,但是取证工具和许多黑客工具也是如此。</p></blockquote><p>通过 <em>锁定</em> 配对设备,让您的 iPhone 设备<strong>不会</strong>与其他的连接的设备去创建新的信任,<strong>除了</strong>锁定配对的设备,副作用便是阻止了所有的取证设备。在存在配对锁定的情况下,从手机中收集数据的唯一方法是存在硬件漏洞(例如本博文开头部分提到的 bootrom )。</p><p>要启用配对锁定,我们需要将手机设置成受监管的状态,从而可以对手机的功能和行为施加大量限制。它是专为企业实施其员工手机上的安全控制而设计的,但对我们来说也一样。</p><h1 id="span-style-color-db4d6d-需要注意的是:-span"><span style="color:#DB4D6D;">需要注意的是:</span></h1><ul><li>建议在执行前,先完整阅读一遍此文章,再决定是否进行此操作。</li><li>将手机设置成受监管状态会 <span style="color:#DB4D6D;"><strong>完全擦除手机</strong></span>,尽管擦除之后,您可以重新登录到您的 iCloud,所有同步过的设置,应用程序等项目都会再次出现。<br><span style="color:#DB4D6D;"><strong>但是,不能先对手机进行备份,再将手机设置成受监管状态,然后再恢复备份!!!(因为恢复备份的同时也会将设备还原到不受监管的状态)</strong></span></li><li>任何能够使用您的笔记本电脑的人都可以从中获得配对记录,并且可以完全访问您手机上的所有内容(在物理连接到笔记本电脑之后)。</li><li><span style="color:#DB4D6D;">如果您无法访问笔记本电脑或丢失配对记录,那么您也将无法连接手机。</span></li></ul><h1 id="监管并锁定配对您的设备">监管并锁定配对您的设备</h1><ol><li><p>下载并安装 <a href="https://apps.apple.com/us/app/apple-configurator-2/id1037126344">Apple Configurator 2</a></p></li><li><p>将您的设备与电脑通过 USB 连接</p></li><li><p>打开 <strong>Apple Configurator 2</strong>,选择设备后,点击 <code>Prepare</code> 按钮<br><img src="https://static.hit.moe/blog/source/pair-locking/AppleConfigurator.png" alt="Select Prepare"></p></li><li><p>在 <code>Prepare Devices</code> 页面中:</p><ul><li>勾选 <strong><code>Supervise devices</code></strong></li><li>勾选 <strong><code>Allow devices to pair with other computers</code></strong></li><li>然后点击 <kbd>Next</kbd><br><img src="https://static.hit.moe/blog/source/pair-locking/7.png" alt="Prepare Devices"></li></ul><p>配对锁定可以在两个不同的级别中执行:在监管级别或者在描述文件的级别执行(描述文件是执行一个iPhone设置的合集)</p><p>根据 Jonathan 的建议我们在这里勾选 <code>Allow devices to pair with other computers</code>,我们在监管级别允许它,稍后将在描述文件级别来阻止他。因为如果您需要更换到新的笔记本或者台式机,不需要去清除您的手机。</p></li><li><p>在 <code>Enroll in MDM Server</code> 页面中选择 <strong><code>Do not enroll in MDM</code></strong>,然后点击 <kbd>Next</kbd><br><img src="https://static.hit.moe/blog/source/pair-locking/8.png" alt="Enroll in MDM Server"></p></li><li><p>在 <code>Assign to Organization</code> 页面中,点击 <strong><code>New Organization</code></strong>,然后点击 <kbd>Next</kbd></p></li><li><p>在 <code>Devices Enrollment Program</code> 界面,我们<strong>直接点击</strong> <kbd>Skip</kbd> 跳过即可<br><img src="https://static.hit.moe/blog/source/pair-locking/9.png" alt="Devices Enrollment Program"></p></li><li><p>接下来,在 <code>Create an Organization</code> 页面中填写您组织的名称,<strong>除名称外,其他项目均可留空</strong><br><img src="https://static.hit.moe/blog/source/pair-locking/10.png" alt="Organization"><br>此处填写的名称将会在您的设备中显示,效果如下图:<br><img src="https://static.hit.moe/blog/source/pair-locking/PICSEW_C980.jpg" alt=""></p></li></ol><p>填写完成后,点击 <kbd>Next</kbd> 进行下一步操作</p><ol start="9"><li><p>在接下来下页面中,点击 <strong><code>Generate a new supervision identity</code></strong> ,然后点击 <kbd>Next</kbd><br><img src="https://static.hit.moe/blog/source/pair-locking/11.png" alt=""></p></li><li><p>在 <code>Configure iOS Setup Assistant</code> 页面,不进行修改,直接点击 <kbd>Prepare</kbd> 按钮<br><img src="https://static.hit.moe/blog/source/pair-locking/12.png" alt=""><br>此时会弹出提示,要求输入密码,以便于更新证书设置,输入密码后,点击 Update Settings 。</p><p>接下来,擦除和监管手机的过程。如果您的设备已经受到监管,则会出现有关需要首先还原设备的错误。</p><p><img src="https://static.hit.moe/blog/source/pair-locking/13.png" alt=""></p></li><li><p>该过程完成后,您可以创建一个新的配置文件,该配置文件将具有配对锁定限制:</p><p><em>之所以选择通过配置文件的方式,而非直接在监管级别进行锁定,是因为我们无法避免可能会出现的情况,比如电脑损坏,丢失等情况。为了避免在这种情况下我们无法连接自己的手机,所以选择使用配置文件的方式进行限制。</em></p><ul><li><p>点击状态栏的 <strong><code>File</code></strong> -&gt; <strong><code>New Profile</code></strong> 并为您的新描述文件命名</p><p><img src="https://static.hit.moe/blog/source/pair-locking/Snipaste_2019-10-12_23-20-56.png" alt=""><br><img src="https://static.hit.moe/blog/source/pair-locking/Snipaste_2019-10-12_23-21-58.png" alt=""></p></li><li><p>在 <code>Controls when the profile can be removed</code> 的部分下,选择 <strong><code>Never</code></strong> 或 <strong><code>With Authorization</code></strong><br><img src="https://static.hit.moe/blog/source/pair-locking/16.png" alt=""><br>通过这项设置我们可以控制如果有人试图通过手机删除此描述文件。<br>如果此处保留默认设置,即 <strong><code>Always</code></strong> ,那么任何有权访问未锁定手机的人都<strong>可以</strong>删除此描述文件(这便失去了我们的目的)<br>设置为 <strong><code>Never</code></strong> 即表示我们<strong>无法</strong>透过手机来移除这个配置文件<br>设置为 <strong><code>With Authorization</code></strong> ,则只有<strong>输入</strong>正确的<strong>密钥</strong>时,才能从设备中删除此描述文件</p><p><span style="color:#DB4D6D;"><em><strong>如果您居住在或者计划访问一个法院可能会迫使您删除描述文件的国家,则最好选择 <code>Never</code> ,这样便不会因为拒绝交出密码而被指控蔑视法庭或妨碍司法。</strong></em></span></p></li></ul></li><li><p>点击左侧的 <code>Restrictions</code> 选项卡,首先点击 <strong><code>Configure</code></strong><br><img src="https://static.hit.moe/blog/source/pair-locking/18.png" alt=""></p></li><li><p>接下来,可以看到大量的设置,比如禁止某些应用程序,设置密码,Touch ID,Face ID 限制等等。找到并取消勾选 <strong><code>Allow pairing with non-Configurator hosts</code></strong></p><p><img src="https://static.hit.moe/blog/source/pair-locking/Snipaste_2019-10-12_23-54-26.png" alt=""><br>也可以继续做一些您喜欢的设置</p></li><li><p>退出并保存描述文件,在主界面中,右键点击您的 iOS 设备,选择 <strong><code>Add</code></strong> -&gt; <strong><code>Profiles...</code></strong>,选择刚刚保存的描述文件。</p></li></ol><p>此时便成功将锁定了配对的设备,现在拿你的手机到其他电脑上去试试看吧~你会得到这样的提示<br><img src="https://static.hit.moe/blog/source/pair-locking/22.png" alt=""><br>当然取证工具也同样无法连接到您的设备。o(<em> ̄▽ ̄</em>)ブ🎉<br>如果以后要删除此限制,则可以点击 <strong><code>Remove</code></strong> -&gt; <strong><code>Profiles...</code></strong> 操作与 添加的步骤(14) 类似。</p><h1 id="总结">总结</h1><p>锁定配对的优点是非常好的配对安全性。实际上,为了删除监管配置文件,入侵者将需要擦除设备中的内容。如果有人为了执行取证提取或任何其他类型的分析,想解除配对锁定,则需要对同时拥有您的 iOS 设备和计算机的控制权并具有对它们的完全访问权限。</p><p>但是同时缺点也十分的明显,当您出门在外时,不能简单的与其他设备进行配对连接。尽管您可以将配置文件设置成可删除的状态,但是您需要再重新使用电脑来安装配置文件来锁定配对。与其他设备配对必须是一个明智的决定,并且需要花费一些时间来验证您是否有权确认该设备的内容。</p><p>配对锁定是一项有用的功能,可保护您免受侵入性设备搜索的侵害。</p><p>虽然让我在手机上拥有这种保护更加安全,但是没有什么技术可以解决最终的政策问题。我们需要的是现代化的隐私法律法规。</p><h1 id="参考链接">参考链接</h1><ul><li><a href="https://www.zdziarski.com/blog/?p=2589">Counter-Forensics: Pair-Lock Your Device with Apple’s Configurator</a></li><li><a href="https://arkadiyt.com/2019/10/07/pair-locking-your-iphone-with-configurator-2/">Pair Locking your iPhone with Configurator 2</a></li><li><a href="https://twitter.com/axi0mX/status/1177542201670168576">axi0mX’s Twitter</a></li><li><a href="https://www.engadget.com/2019/09/27/apple-iphone-exploit-jailbreak/">iPhone exploit could allow permanent jailbreak for millions of devices</a></li><li><a href="https://cn.engadget.com/2019/09/28/apple-iphone-exploit-jailbreak/">iPhone 的 bootrom 漏洞让永久越狱成为可能</a></li></ul>]]></content>
  647.    
  648.    <summary type="html">
  649.    
  650.      &lt;p&gt;通过配置Pair Locking,保护隐私,防止执法人员对您的设备进行取证。
  651.    
  652.    </summary>
  653.    
  654.    
  655.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  656.    
  657.      <category term="Apple" scheme="https://www.wevg.org/categories/Tech/Apple/"/>
  658.    
  659.    
  660.      <category term="Secure" scheme="https://www.wevg.org/tags/Secure/"/>
  661.    
  662.      <category term="iPhone" scheme="https://www.wevg.org/tags/iPhone/"/>
  663.    
  664.      <category term="Exploit" scheme="https://www.wevg.org/tags/Exploit/"/>
  665.    
  666.      <category term="Apple" scheme="https://www.wevg.org/tags/Apple/"/>
  667.    
  668.      <category term="配置" scheme="https://www.wevg.org/tags/%E9%85%8D%E7%BD%AE/"/>
  669.    
  670.  </entry>
  671.  
  672.  <entry>
  673.    <title>CSGO cfg 文件调试指南</title>
  674.    <link href="https://www.wevg.org/archives/csgo-config-guide/"/>
  675.    <id>https://www.wevg.org/archives/csgo-config-guide/</id>
  676.    <published>2019-06-11T10:45:33.000Z</published>
  677.    <updated>2019-06-13T10:03:33.000Z</updated>
  678.    
  679.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>对于 CSGO 的性能优化我们在 <a href="https://www.wevg.org/archives/csgo-fps-optimized/">CSGO FPS 终极优化指南</a> 中已经做过详解,探索为什么每一名长时间游玩 CSGO 的玩家会去寻找他喜欢的选手的 CFG ,来替换自己的 CFG 。大家对职业选手的 CFG 趋之若鹜,甚至很多选手的 CFG 也从不向外公布。<span id="more"></span>既然如此何不随着教程自己动手调试出适合自己的 CFG 呢?</p><h1 id="cfg-是什么">CFG 是什么</h1><p>简单来说,CFG 就是储存用户个人配置的文档 configuration ,记录你在游戏中的一系列设置,里面包括了玩家在游戏设置内可以调节的参数也包括了部分游戏内不可以修改的参数,其中较为典型的内容包括鼠标速度;加速度;键位;画面设置。</p><h1 id="为什么我们要对-cfg-进行修改">为什么我们要对 CFG 进行修改</h1><p>修改 CFG 的目的是为了让玩家以更加快速;自然地进行操作,这包括以下几个方面。</p><h2 id="键位设置">键位设置</h2><p>此前的人物移动键位未有统一标准。因当年一位 QUAKE 先辈在早期电子竞技比赛上大杀四方,于是玩家便向他讨教,而后他将自己的 CFG 在论坛共享,众人发现他的键位异于常人,其使用 WASD 进行移动操作,左右手分工比起以往更加合理,操作也更符合直觉。从而导致了此后的游戏几乎都以 WASD 设为默认移动键位。<br>而 CSGO 作为 CS 的正统续作,其引擎(起源引擎)也正是基于部分 QUAKE 代码基础上实现的。理所当然,先辈们研讨 CFG ,钻研更合理的游戏设置的基因也保留在 CSer 的体内。</p><h2 id="鼠标运行轨迹">鼠标运行轨迹</h2><p>在游戏的设置中,我们可以修改一些参数;比如鼠标速度与加速度,还有原始输入,当然这可以满足几乎所有人的需求,但是还是有一部分“玄学”参数会影响一些鼠标的运行轨迹。</p><h2 id="hud-与-viewmodel">HUD 与 viewmodel</h2><p>玩家进行游戏当然,一切的感知全靠眼睛和耳朵,所有的操作基本上都要靠眼睛来感知,所以对于 HUD 的设置也是非常重要的,他们是你的参照物,人的视觉很容易被欺骗。</p><h2 id="提高帧数">提高帧数</h2><p>上一篇关于 CSGO 优化的文章中提到过,由于 CSGO 引擎的特殊性,FPS 低于 300 都会产生一些输入延迟,这是很致命的,使游戏内帧数稳定处于一个合理值是非常重要的。</p><h2 id="网络参数">网络参数</h2><p>虽然在 CSGO 中没有像 cs1.6 那样夸张效果的 <code>EX_INTERP</code> 参数,但是 CSGO 中的 <code>RATE</code>,<code>cl_interp/cl_interp ratio</code> 这些参数对于选手的发挥也有很明显的影响。</p><p>因为游戏内设置可以进行的修改是很有限的,有许多设置并不能在游戏内直接修改(当然,使用控制台大部分情况下可以达到和修改 CFG 相同的效果)或者是游戏内允许的数字并不能达到理想状态,必须要通过修改控制台或 CFG 进行修改。</p><h1 id="如何修改-cfg">如何修改 CFG</h1><p>config 文件存放在 <code>\Steam\userdata\(9位ID)\730\local\cfg\</code> 是对应着每个账号用来储存单个用户设置的文件(在游戏中截图后,在steam中点击在硬盘中查看截图库会跳转到<code>\Steam\userdata\(9位ID)\760\remote\730\screenshots</code>目录这样就可以确定此账号的9位ID。)<br>autoexec 文件放在 <code>\Steam\steamapps\common\Counter-Strike Global Offensive\csgo\cfg\</code><br>config,autoexec 用来储存游戏每次重新打开就会被重置的命令,是在你电脑上所有账号都通用的一个指令<br>要注意,<code>autoexe.cfg</code> 是在CSGO游戏启动时自动运行 autoexec 内的指令的一种文件,在 autoexec 的最后一行加入 <code>host_writeconfig</code> 之后<br>只要你的 <code>autoexec.cfg</code> 文件名字没有问题,他就会正常启动,不需要再启动项中重复添加。</p><h1 id="开始修改cfg">开始修改CFG</h1><p>开始之前要注意,CFG 的内容并非是越多越好,实现更多的功能同时也会带来更多的不可控性,容易导致出现不可预料的问题,如果出现问题也更难排查。<br>当游戏出现卡顿,掉帧,严重的输入延迟时,我们经常会选择重新制作 CFG 来解决,这是有效的,尽量精简的修改内容会大大地减小重置工作量。<br>如果不想完完全全地自己去从头制作一个CFG文件,也可以去网上寻找喜欢的选手所用的CFG,比较即时的CFG汇总网站为<a href="https://prosettings.net/">prosettings</a>,要注意CFG也是有时效性的在一些更新后某些设置会出现不同的影响,所以如果用别人的CFG那么一定要选择最新日期的,如果网站上没有更新,可以去选手的直播间发送评论获得(Twitch).<br>那么开始分类讲解如何去修改CFG内容。</p><h2 id="键位设置-v2">键位设置</h2><p>举一个比较简单的例子,<strong>滚轮跳</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cfg">bind &quot;MWHEELDOWN&quot; &quot;+jump&quot;<br></code></pre></td></tr></table></figure><p>这样的格式 <code>bind</code> 为语法 后面接 <strong>空格 “键值” 空格 &quot;指令名&quot;</strong><br>这样修改较在游戏中修改的好处是允许同一个命令用多种不同按键都可以触发,即既可以用空格进行跳跃也可以用滚轮下进行跳跃。<br><code>+</code> 代表着按下某个键,相应的,<code>-</code>就代表着松开某个按键,比如跳投中的<code>-attack</code> 代表松开鼠标左键。</p><p>比较常见的修改键盘键位的包括几种:</p><ol><li><a href="#%E5%BF%AB%E9%80%9F%E8%B4%AD%E4%B9%B0%E6%AD%A6%E5%99%A8">快速购买武器</a></li><li><a href="#%E5%BF%AB%E9%80%9F%E5%88%87%E5%87%BA%E9%81%93%E5%85%B7">快速切出道具</a></li><li><a href="#%E5%8A%9F%E8%83%BD%E6%80%A7%E5%BF%AB%E6%8D%B7%E9%94%AE">功能性快捷键</a></li></ol><h3 id="快速购买武器">快速购买武器</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cfg">bind &quot;F7&quot; &quot;buy ak47;buy vesthelm;buy flashbang;buy smokegrenade&quot;<br></code></pre></td></tr></table></figure><h3 id="快速切出道具">快速切出道具</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cfg">bind &quot;f&quot; &quot;use weapon_flashbang&quot;按F键切到闪光弹<br></code></pre></td></tr></table></figure><h3 id="功能性快捷键">功能性快捷键</h3><p>一般来说,功能性快捷键不必太过繁琐,过多的快捷键可能会让你看上去像个憨憨,分散自己太多注意力,也可能会让游戏变卡(可能)在这里推荐几个实用的指令</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs cfg">bind &quot;MOUSE5&quot; &quot;r_cleardecals&quot; //用鼠标前侧键进行清血迹<br>bind shift &quot;+speed;r_cleardecals&quot;;//shift可以正常静音的同时清血迹<br></code></pre></td></tr></table></figure><h3 id="大跳">大跳</h3><figure class="highlight plaintext"><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><code class="hljs cfg">bind space +jump<br>bind v +duck<br>alias +cjump &quot;+jump; +duck&quot;<br>alias -cjump &quot;-jump; -duck&quot;<br>bind &quot;space&quot; &quot;+cjump&quot;<br></code></pre></td></tr></table></figure><p>按住空格键进行大跳,也就是说这样可以按住空格跳上 MIRAGE 的A死点箱子。<br>此处 <code>alias</code> 语法意义为按下一个按键同时触发后面的两条指令。</p><blockquote><p>⚠️ 注意,<strong>所有</strong>包含 <code>alias</code> 语法的指令都要放在 <code>autoexec</code> 文件中</p></blockquote><p>当然,如果你需要更多的复杂指令,可以去查找 Purp1e 做的指令详解<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>,他在这部分做了很详尽的归纳,在此不做赘述。</p><h3 id="跳投">跳投</h3><p>跳投分为一键式跳投与两键式跳投在比赛中只允许两键式跳投,一键式跳投为按住左键时按下一个快捷键就可以快速投掷也就是一个按键设置为<code>-attack</code>同时<code>+jump</code>,两键式为两个相邻按键分别设置为<code>-attack</code>和<code>+jump</code>自己手动掌握时机</p><h4 id="一键式">一键式</h4><blockquote><p>需要放到<code>autoexec</code></p></blockquote><figure class="highlight plaintext"><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><code class="hljs cfg">alias &quot;+jumpthrow&quot; &quot;+jump;-attack&quot;  <br>alias &quot;-jumpthrow&quot; &quot;-jump&quot;  <br>bind &quot;n&quot; &quot;+jumpthrow&quot;<br></code></pre></td></tr></table></figure><p>默认为按下 <kbd>N</kbd> 键执行</p><h4 id="两键式">两键式</h4><blockquote><p>不需要放到<code>autoexec</code></p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs cfg">bind mouse4 &quot;-attack&quot;<br>bind mouse5 &quot;+jump&quot;<br></code></pre></td></tr></table></figure><p>默认为同时按下鼠标两颗侧键执行</p><h3 id="alt飞行">alt飞行</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cfg">bind alt  noclip;//alt飞行<br></code></pre></td></tr></table></figure><h2 id="鼠标轨迹">鼠标轨迹</h2><p>当然,在这里我不会对鼠标速度进行很深入的探讨,只会讲一些平时较少提及的部分,一般来说鼠标的 DPI 在 500-1500 之间是正常的值,也就是说 <code>dpi* sensitivity</code> 在这个区间,如果想要了解相关的数据可以参照<a href="https://liquipedia.net/counterstrike/List_of_player_mouse_settings">liquipedia</a>这里有所有选手的鼠标速度设置,加速度设置于RAWINPUT是否开启,不同鼠标的最佳DPI是不同的,同EDPI下鼠标的轨迹也是不同的。<br>参照自己的操作习惯去修改是正确的,虽然不提倡一味地模仿职业选手的设置,但是前提是要知其所以然,切不可随心所欲胡乱设置,无知即力量并不可取。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cfg">&quot;m_rawinput&quot; &quot;1&quot;<br></code></pre></td></tr></table></figure><p>开启原始输入,这个参数可以将系统对鼠标移动轨迹的影响改为尽可能小得,但是他也不是绝对的,所以如果想达到更好的状态,或者在不同线下环境下达到相同的手感,还是先要参考我们写的上一篇文章,在此也不做赘述。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs cfg">&quot;m_mouseaccel1&quot; &quot;0&quot;<br>&quot;m_mouseaccel2&quot; &quot;0&quot;<br></code></pre></td></tr></table></figure><p>这两条代表鼠标1与2的加速度为0,并非绝对会对你的鼠标轨迹产生影响,但是有时不可预料,几乎所有的职业选手CFG中这两项都改为0。</p><h2 id="hud与viewmodel">HUD与viewmodel</h2><p>这部分是CFG修改的重中之重,因为一切操作需要反应在屏幕上,他决定了玩家认为鼠标下一步应该如何移动。压枪时虽然更多的是靠肌肉记忆与感觉来的但是在潜移默化中准星、HUD或者枪模的样式会影响对下一步操作的判断,如果准星比较粗那么会对自己的准星操作更不敏感,感觉压得更稳。枪模跟后坐力一起上扬也会影响到玩家对自己压枪到底下拉了多少的判断,所以找到一套符合自己直觉/手感的HUD将会对希望让自己操作更为精准、舒适的玩家有很大的作用</p><blockquote><p>为了让注释部分更为直观,便把此部分的 cfg 显示为表格形式,复制时,将仅复制文本部分,后方表格同理</p></blockquote><table><thead><tr><th style="text-align:center"></th><th style="text-align:center"></th></tr></thead><tbody><tr><td style="text-align:center"><code>cl_hud_radar_scale 1</code></td><td style="text-align:center">//雷达大小 &lt;0.8-1.3&gt;</td></tr><tr><td style="text-align:center"><code>cl_radar_scale 0.45</code></td><td style="text-align:center">//雷达缩放</td></tr><tr><td style="text-align:center"><code>cl_radar_icon_scale_min 0.6</code></td><td style="text-align:center">//雷达人物标点大小</td></tr><tr><td style="text-align:center"><code>cl_radar_rotate 1</code></td><td style="text-align:center">//雷达随视角方向旋转,在烟雾中更容易清楚自己的方向不至于迷路</td></tr><tr><td style="text-align:center"><code>cl_radar_always_centered 1</code></td><td style="text-align:center">//雷达以玩家为中心</td></tr><tr><td style="text-align:center"><code>viewmodel_fov &quot;65&quot;</code></td><td style="text-align:center">//决定了你的枪模FOV,并不是真正的FOV,真正的FOV在CSGO里是不可修改的,只与分辨率有关,在这里的数值决定了枪模的横向宽度,也就是数值越小枪模的贴图横向越窄,投放到屏幕上固定的宽度时也就越扁更胖,看上去大了,当然这个参数也与POS相对应,但是可以修改.(60-68/54)</td></tr><tr><td style="text-align:center"><code>viewmodel_offset_x &quot;2&quot;</code></td><td style="text-align:center">//对应枪模的X轴位置</td></tr><tr><td style="text-align:center"><code>viewmodel_offset_y &quot;1.5&quot;</code></td><td style="text-align:center">//对应枪模的Y轴位置</td></tr><tr><td style="text-align:center"><code>viewmodel_offset_z &quot;-1&quot;</code></td><td style="text-align:center">//对应枪模的Z轴位置</td></tr><tr><td style="text-align:center"><code>viewmodel_presetpos &quot;0&quot;</code></td><td style="text-align:center">//持枪视角预设&lt;1.默认 2.写实 3.经典&gt; 一般来说为了少挡屏幕,大家多数选择 <strong>3</strong></td></tr><tr><td style="text-align:center"><code>cl_viewmodel_shift_left_amt &quot;1.5&quot;</code> <code>cl_viewmodel_shift_right_amt &quot;0.75&quot;</code></td><td style="text-align:center">//(需要放到autoexec)在下蹲动作时动画量的多少,这一项并不能改为0,这里为是最小值(摘自<cite>NIKO CFG</cite>)</td></tr><tr><td style="text-align:center"><code>cl_bobcycle &quot;0&quot;</code>  <code>cl_bob_lower_amt &quot;0&quot;</code> <code>cl_bobamt_lat &quot;0&quot;</code> <code>cl_bobamt_vert &quot;0&quot;</code></td><td style="text-align:center">//(需要放到autoexec)玩家移动时枪模随移动一起摇摆的程度,最好的设置当然是调整为0</td></tr><tr><td style="text-align:center"><code>viewmodel_recoil &quot;0&quot;</code></td><td style="text-align:center">//枪模随后坐力上扬,当然要关闭</td></tr><tr><td style="text-align:center"><code>cl_crosshairgap</code></td><td style="text-align:center">//准星的空隙大小</td></tr><tr><td style="text-align:center"><code>cl_crosshairsize</code></td><td style="text-align:center">//准星长度</td></tr><tr><td style="text-align:center"><code>cl_crosshairstyle</code></td><td style="text-align:center">//准星风格 0为CSGO动态十字准星,1默认狮子的静态变体,2 经典静态准星但是每侧有动态圆点,3 经典动态十字 4 经典静态十字(一般大多数人使用的) 5 走路时不动,开枪时动</td></tr><tr><td style="text-align:center"><code>cl_crosshairthickness</code></td><td style="text-align:center">//准星粗细</td></tr><tr><td style="text-align:center"><code>cl_crosshair_drawoutline</code></td><td style="text-align:center">//决定准星是否有勾边(0/1)</td></tr><tr><td style="text-align:center"><code>cl_crosshaircolor</code></td><td style="text-align:center">//准星颜色(0-4)</td></tr><tr><td style="text-align:center"><code>cl_crosshairalpha</code></td><td style="text-align:center">//准星透明度 默认200,一般改为255完全不透明</td></tr><tr><td style="text-align:center"><code>cl_crosshairdot</code></td><td style="text-align:center">//开关准星中心原点(0/1)</td></tr></tbody></table><p>当然,同样可以用创意工坊地图对枪模进行调整<br><a href="https://steamcommunity.com/sharedfiles/filedetails/?id=365126929">crashz’ Viewmodel Generator</a></p><h3 id="准星调整">准星调整</h3><p><a href="https://steamcommunity.com/sharedfiles/filedetails/?id=308490450">crashz’ CROSSHAIR GENERATOR V3</a></p><p>对HUD进行调整(这张地图也可以对其他设置进行调整,但是因为更新不及时并<strong>不建议使用里面的大多数其他设置</strong>)</p><p><a href="https://steamcommunity.com/sharedfiles/filedetails/?id=1325659427">Config Generator ✮ crashz &amp; Misterio</a></p><h2 id="性能提升">性能提升</h2><p>以下的命令皆可提升FPS或减少掉帧,下面不做赘述</p><table><thead><tr><th style="text-align:center"></th><th style="text-align:center"></th></tr></thead><tbody><tr><td style="text-align:center"><code>r_drawtracers_firstperson &quot;0&quot;</code></td><td style="text-align:center">//关闭曳光弹的显示;这条指令是在2018年4月的更新后开始流行的,那次修改改变了曳光弹的轨迹,导致前7发左右的发射位置并不准确,如果可以适应目前的轨迹那么可以考虑开启,同时关闭曳光弹也会减轻开火时的掉帧情况,低配电脑建议选择0.</td></tr><tr><td style="text-align:center"><code>cl_autohelp 0</code></td><td style="text-align:center">//禁用游戏提示</td></tr><tr><td style="text-align:center"><code>cl_showhelp 0</code></td><td style="text-align:center">//禁用游戏提示</td></tr><tr><td style="text-align:center"><code>cl_teamid_overhead_always 2</code></td><td style="text-align:center">//隔墙显示队友位置&lt;0.不显示 1.透视队友位置 2.透视队友位置与装备&gt; 开启显示队友位置会小幅度降低FPS但是很有助于对局势的判断,方便与队友配合,交流不是非常好的情况下这一项的打开非常有益。</td></tr><tr><td style="text-align:center"><code>r_dynamic 0</code></td><td style="text-align:center">//关闭动态光影,可以提升FPS</td></tr><tr><td style="text-align:center"><code>gameinstructor_enable 0</code></td><td style="text-align:center">//关闭游戏教学</td></tr><tr><td style="text-align:center"><code>spec_replay_autostart 0</code></td><td style="text-align:center">//关闭被击杀回放</td></tr><tr><td style="text-align:center"><code>r_eyegloss &quot;0&quot;</code>  <code>r_eyemove &quot;0&quot;</code> <code>r_eyeshift_x &quot;0&quot;</code> <code>r_eyeshift_y &quot;0 r_eyeshift_z 0&quot;</code> <code>r_eyeshift_z &quot;0&quot;</code> <code>r_eyesize &quot;0&quot;</code></td><td style="text-align:center">//取消人物模型的眼球转动,不知为何对5E尤其有效</td></tr><tr><td style="text-align:center"><code>cl_forcepreload 0</code></td><td style="text-align:center">//这一项在先前的版本中用1的话可以提升FPS,但是在大约3月份的更新中,官方证明失效了,如果用1只会带来负面效果(增加input lag)</td></tr></tbody></table><h2 id="网络参数-v2">网络参数</h2><table><thead><tr><th style="text-align:center"></th><th style="text-align:center"></th></tr></thead><tbody><tr><td style="text-align:center"><code>net_graph 1</code></td><td style="text-align:center">//打开网络信息 里面有很多有用的信息,可以显示上传下载情况,ping值,服务器质量</td></tr><tr><td style="text-align:center"><code>net_graphpos 1/2/3</code></td><td style="text-align:center">//1在右下角,2在中间,3在左下角</td></tr><tr><td style="text-align:center"><code>net_graphproportionalfont</code></td><td style="text-align:center">//0为让字体变细,1为默认</td></tr><tr><td style="text-align:center"><code>net_graphheight 0</code></td><td style="text-align:center">//竖直方向高度</td></tr><tr><td style="text-align:center"><code>cl_cmdrate &quot;128&quot;</code></td><td style="text-align:center">//下载128tick</td></tr><tr><td style="text-align:center"><code>cl_updaterate &quot;128&quot;</code></td><td style="text-align:center">//上传128tick</td></tr><tr><td style="text-align:center"><code>rate &quot;786432&quot;</code></td><td style="text-align:center">//游戏带宽限制rate [1]</td></tr><tr><td style="text-align:center"><code>cl_interp/cl_Interp_ratio</code></td><td style="text-align:center">//HITBOX 与人物模型的贴合度 [2]</td></tr></tbody></table><p>[1] rate 是你给服务器传输数据的最大带宽值(bit),如果过低或者过高都会导致你莫名其妙打不死人或者是跳CHOKE,一般来说在稳定连接的服务器(比如在国内玩国内的平台)你的网络没有问题,可以直接 rate 786432 这样就是无限制网络带宽这是最好的。<br>如果你的宽带没有 10M 或者你在打海外服务器,可以尽量降低这个值,参照这个表</p><table><thead><tr><th style="text-align:center">带宽大小</th><th style="text-align:center">rate 值</th></tr></thead><tbody><tr><td style="text-align:center">0.5 Mbps</td><td style="text-align:center">rate 62500</td></tr><tr><td style="text-align:center">1.0 Mbps</td><td style="text-align:center">rate 125000</td></tr><tr><td style="text-align:center">1.5 Mbps</td><td style="text-align:center">rate 187500</td></tr><tr><td style="text-align:center">1.57 Mbps</td><td style="text-align:center">rate 196608 (default rate)</td></tr><tr><td style="text-align:center">2.0 Mbps</td><td style="text-align:center">rate 250000</td></tr><tr><td style="text-align:center">2.5 Mbps</td><td style="text-align:center">rate 312500</td></tr><tr><td style="text-align:center">3.0 Mbps</td><td style="text-align:center">rate 375000</td></tr><tr><td style="text-align:center">3.5 Mbps</td><td style="text-align:center">rate 437500</td></tr><tr><td style="text-align:center">4.0 Mbps</td><td style="text-align:center">rate 500000</td></tr><tr><td style="text-align:center">4.5 Mbps</td><td style="text-align:center">rate 562500</td></tr><tr><td style="text-align:center">5.0 Mbps</td><td style="text-align:center">rate 625000</td></tr><tr><td style="text-align:center">5.5 Mbps</td><td style="text-align:center">rate 687500</td></tr><tr><td style="text-align:center">6.0 Mbps</td><td style="text-align:center">rate 750000</td></tr><tr><td style="text-align:center">6.2 Mbps and above</td><td style="text-align:center">rate 786432 (max rate)</td></tr></tbody></table><p>[2] <code>cl_interp/cl_Interp_ratio</code>(需要放到<code>autoexec</code>,或者在没进入服务器时进行修改再链接到服务器)<br>这个参数的意义是 HITBOX 与人物模型的贴合度,在你的延迟,网络状况很好的情况下(ping&lt;45,loss 0,choke 0)可以选择 <code>cl_interp 0</code>/<code>cl_interp_ratio 1</code> (这两个参数是配套的)为搭配,他可以很大程度得提升你的单发准度,提高你的上限。<br>但是当你的的网络状况没有这么好的情况下,建议你的 <code>interp</code> 用默认也就是 <code>cl_interp 0.031000</code>-<code>cl_interp_ratio 2</code> 这样的情况下,你的压枪感觉会更容易找到,更加稳定。(<code>interp</code>后面的0代表的是在目前<code>interp</code>值情况下的最小值,反之1为最大值)<br>当然也有部分选手选择一套并不符合规范的<code>interp</code>套餐,使用<code>interp 0.031000</code>,<code>ratio 1</code> 比如国内的somebody,国外的hunter(NIKO大表哥)这样的<code>interp</code>设置在5E的恶劣服务器上尤为好用,虽然有时会莫名其妙失误,但是使用CZ那种短连发武器或者AK的短连发时尤为好用,经常可以莫名其妙打头,想要仔细去了解这个参数可以参考CSGO逗逼君在知乎的文章 <sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup></p><h2 id="其他杂项设置">其他杂项设置</h2><table><thead><tr><th style="text-align:center"></th><th style="text-align:center"></th></tr></thead><tbody><tr><td style="text-align:center"><code>cl_autowepswitch &quot;0&quot;</code></td><td style="text-align:center">//关闭自动切换拾起的武器</td></tr><tr><td style="text-align:center"><code>cl_dm_buyrandomweapons 0</code></td><td style="text-align:center">//关闭死斗随机买枪</td></tr><tr><td style="text-align:center"><code>cl_use_opens_buy_menu 0</code></td><td style="text-align:center">//关闭E键打开购买菜单</td></tr><tr><td style="text-align:center"><code>fps_max &quot;999&quot;</code></td><td style="text-align:center">//调整FPS上限</td></tr></tbody></table><p>FPS上限 要看具体电脑性能,如果可以稳定在300那么尝试更高的上限是一个好的选择这会降低输入延迟,但是如果不能超过太多的话选择更高的上线会造成CPU不能进行短暂休息导致FPS不稳定。(如果想要不限制FPS,建议使用999而不是0,因为莫名原因使用999会比0时的FPS高一些)。</p><p>接下来就保存好文件,畅快体验吧</p><h1 id="参考链接">参考链接</h1><ul><li><a href="https://totalcsgo.com/">CS:GO FOV and Viewmodel Commands</a></li></ul><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1"  class="footnote-item"><p><a href="https://space.bilibili.com/73115492">B站链接</a> <a href="#fnref1" class="footnote-backref">↩</a></p></li><li id="fn2"  class="footnote-item"><p><a href="https://zhuanlan.zhihu.com/p/47497932">CSGO深度教学7——从wNv被“黑”掉的世界冠军,到CS的Netcodes与客户端参数</a> – <cite>Kryp</cite> <a href="#fnref2" class="footnote-backref">↩</a></p></li></ol></section>]]></content>
  680.    
  681.    <summary type="html">
  682.    
  683.      &lt;p&gt;对于 CSGO 的性能优化我们在 &lt;a href=&quot;https://www.wevg.org/archives/csgo-fps-optimized/&quot;&gt;CSGO FPS 终极优化指南&lt;/a&gt; 中已经做过详解,探索为什么每一名长时间游玩 CSGO 的玩家会去寻找他喜欢的选手的 CFG ,来替换自己的 CFG 。大家对职业选手的 CFG 趋之若鹜,甚至很多选手的 CFG 也从不向外公布。
  684.    
  685.    </summary>
  686.    
  687.    
  688.      <category term="Gaming" scheme="https://www.wevg.org/categories/Gaming/"/>
  689.    
  690.      <category term="CS:GO" scheme="https://www.wevg.org/categories/Gaming/CS-GO/"/>
  691.    
  692.    
  693.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  694.    
  695.      <category term="设置" scheme="https://www.wevg.org/tags/%E8%AE%BE%E7%BD%AE/"/>
  696.    
  697.      <category term="配置" scheme="https://www.wevg.org/tags/%E9%85%8D%E7%BD%AE/"/>
  698.    
  699.      <category term="fps" scheme="https://www.wevg.org/tags/fps/"/>
  700.    
  701.      <category term="启动项" scheme="https://www.wevg.org/tags/%E5%90%AF%E5%8A%A8%E9%A1%B9/"/>
  702.    
  703.      <category term="config" scheme="https://www.wevg.org/tags/config/"/>
  704.    
  705.  </entry>
  706.  
  707.  <entry>
  708.    <title>为网站启用 HTTP Basic Auth</title>
  709.    <link href="https://www.wevg.org/archives/nginx-http-basic-auth/"/>
  710.    <id>https://www.wevg.org/archives/nginx-http-basic-auth/</id>
  711.    <published>2019-05-23T08:18:13.000Z</published>
  712.    <updated>2019-05-23T08:18:13.000Z</updated>
  713.    
  714.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>本文将介绍如何为网站启用HTTP基本认证,来保护我们的一些网站页面。<span id="more"></span></p><h1 id="生成认证文件">生成认证文件</h1><blockquote><p><code>.htpasswd</code> 是用于创建和更新用于存储用户名和密码的文件,以便对 HTTP 用户进行基本身份验证。</p></blockquote><p>也就是说进行用户认证的信息都将会存储在 <code>.htpasswd</code> 文件中(使用 Nginx 时,虽可以将文件保存成其他名称,但文件的本质时相同的)。<br>创建这个文件可以通过下方的两种方法进行。</p><h2 id="方式一:通过-openssl-生成">方式一:通过 openssl 生成</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;username:<span class="hljs-subst">$(openssl passwd -crypt &#x27;password&#x27;)</span>&quot;</span> &gt;&gt; /home/.htpasswd<br></code></pre></td></tr></table></figure><blockquote><p><strong>CRYPT</strong><br>仅限 Unix 。使用传统的<code>Unix crypt(3)</code>函数,随机生成32位盐(仅使用12位)和密码的前8个字符(即:密码最多仅支持8位,超过八位将仅保留前八位)。不安全。</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">printf</span> <span class="hljs-string">&quot;<span class="hljs-variable">$&#123;username&#125;</span>:`openssl passwd -apr1`\n&quot;</span> &gt;&gt; .htpasswd<br></code></pre></td></tr></table></figure><blockquote><p><strong>MD5</strong><br><code>$ apr1 $</code> +特定于 Apache 的算法的结果,使用随机32位盐和密码的各种组合的迭代(1,000次)MD5摘要。</p></blockquote><h2 id="方式二:使用apache-工具生成">方式二:使用Apache 工具生成</h2><p>此方法需要安装 Apache 工具 Debian/Ubuntu 用户需要安装 <code>apache2-utils</code> ,RHEL/CentOS/Oracle Linux 系统则需要安装<code>httpd-tools</code></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><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">//For Debian/Ubuntu<br>apt install apache2-utils<br><br>//For RHEL/CentOS/Oracle Linux<br>yum install httpd-tools<br></code></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><code class="hljs bash">htpasswd -c /home/.htpasswd user1<br></code></pre></td></tr></table></figure><p>通过 <code>htpasswd -c</code> 命令来生成 .htpasswd 文件, <code>/home/.htpasswd</code> 为用户认证文件路径, <code>user1</code> 则为认证用户的用户名,点击回车后将会要求您为用户设置密码。</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><code class="hljs bash">htpasswd /home/.htpasswd user2<br></code></pre></td></tr></table></figure><p>确认该文件中包含用户名和加密密码( 猫一下( ̄y▽, ̄)╭</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><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">cat /home/.htpasswd<br>user1:$apr1$/woC1jnP<span class="hljs-variable">$KAh0SsVn5qeSMjTtn0E9Q0</span><br>user2:$apr1$QdR8fNLT<span class="hljs-variable">$vbCEEzDj7LyqCMyNpSoBh</span>/<br>user3:$apr1<span class="hljs-variable">$Mr5A0e</span>.U<span class="hljs-variable">$0j39Hp5FfxRkneklXaMrr</span>/<br></code></pre></td></tr></table></figure><p>正常情况下,不会出现问题。下面我们来配置 Nginx 。</p><h1 id="修改-nginx-配置文件">修改 Nginx 配置文件</h1><p>在 conf 文件中加入此配置,即可使用基本身份验证限制对整个网站的访问。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs conf">auth_basic &quot;Administrator’s Area&quot;;<br>auth_basic_user_file /home/.htpasswd;<br></code></pre></td></tr></table></figure><p>但是如果我想要保持某个部分可以直接访问呢?在这种情况下,通过添加 <code>auth_basic off</code> 参数来指定取消继承自上级配置级别的基本身份验证限制:</p><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><code class="hljs conf">server &#123;<br>    ...<br>    auth_basic           &quot;Administrator’s Area&quot;;<br>    auth_basic_user_file conf/htpasswd;<br><br>    location /public/ &#123;<br>        auth_basic off;<br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><p>此时, public 目录即可直接访问,而其他目录则需要验证。<br>也可以反过来,仅对特定目录使用基本身份验证</p><figure class="highlight plaintext"><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><code class="hljs conf">location /api &#123;<br>    auth_basic           “Administrator’s Area”;<br>    auth_basic_user_file /etc/apache2/.htpasswd; <br>&#125;<br></code></pre></td></tr></table></figure><p>甚至可以更进一步,限制/仅允许特定的ip进行访问</p><figure class="highlight json"><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></pre></td><td class="code"><pre><code class="hljs json">location /api &#123;<br>    #...<br>    deny  192.168.1.2;<br>    allow 192.168.1.1/24;<br>    allow 127.0.0.1;<br>    deny  all;<br>&#125;<br></code></pre></td></tr></table></figure><p>配置完成后,重新加载 Nginx 配置文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">nginx -s reload<br></code></pre></td></tr></table></figure><p>现在我们便成功的为网站启用了 HTTP 基本认证。</p><p><img src="https://i.yecdn.com/images/2019/05/23/212f54907f1962e6441816628a0a70a2.png" alt=""></p><p>当用户输入了错误的用户名或密码时,Nginx会返回401 Authorization Required禁止访问。</p><h2 id="参考文章">参考文章</h2><ul><li><a href="https://www.iwch.me/archives/658.html">Nginx启用HTTP Basic Auth</a></li><li><a href="https://coderwall.com/p/zvvgna/create-htpasswd-file-for-nginx-without-apache">Create htpasswd file for nginx (without apache)</a></li><li><a href="https://httpd.apache.org/docs/2.4/misc/password_encryptions.html">Password Formats - Apache HTTP Server Version 2.4</a></li><li><a href="https://socketloop.com/tutorials/generate-salted-password-with-openssl-example">Generate salted password with OpenSSL example</a></li><li><a href="https://ohdoylerules.com/tricks/openssl-passwd-without-prompt/">James Doyle | OpenSSL Passwd Without Prompt</a></li><li><a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-basic-http-authentication-with-nginx-on-ubuntu-14-04">How To Set Up Basic HTTP Authentication With Nginx on Ubuntu 14.04</a></li><li><a href="https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/">Restricting Access with HTTP Basic Authentication</a></li></ul>]]></content>
  715.    
  716.    <summary type="html">
  717.    
  718.      &lt;p&gt;本文将介绍如何为网站启用HTTP基本认证,来保护我们的一些网站页面。
  719.    
  720.    </summary>
  721.    
  722.    
  723.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  724.    
  725.      <category term="Linux" scheme="https://www.wevg.org/categories/Tech/Linux/"/>
  726.    
  727.    
  728.      <category term="Nginx" scheme="https://www.wevg.org/tags/Nginx/"/>
  729.    
  730.      <category term="Linux" scheme="https://www.wevg.org/tags/Linux/"/>
  731.    
  732.      <category term="Debian" scheme="https://www.wevg.org/tags/Debian/"/>
  733.    
  734.  </entry>
  735.  
  736.  <entry>
  737.    <title>定制 Windows 系统安装镜像</title>
  738.    <link href="https://www.wevg.org/archives/design-my-windows-iso/"/>
  739.    <id>https://www.wevg.org/archives/design-my-windows-iso/</id>
  740.    <published>2019-05-12T04:03:52.000Z</published>
  741.    <updated>2019-05-12T04:03:52.000Z</updated>
  742.    
  743.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>有没有想过像 OEM 厂商一样制作一个已经预装好软件的  Windows 安装镜像呢? 除了 Ghost 的异端外,有没有其他方法呢? 本文旨在将带您定制一个属于自己的 Windows 系统安装镜像。<span id="more"></span></p><h1 id="必要食材">必要食材</h1><ul><li>一份新鲜的 <strong>Windows</strong> 镜像 (可以从 <a href="https://msdn.itellyou.cn">MSDN,我告诉你</a>,<a href="https://tb.rg-adguard.net/">TechBench</a> 等处获取)</li><li>一份新鲜的 PE 镜像</li><li>一只成年的计算鸡</li><li>确保你的计算鸡已经吃掉了一份 64 位的 Windows 系统</li><li>确保你的计算鸡已经吃掉了 Vmware , Hyper-V 或者 Virtualbox 等虚拟化程序</li><li>其他您想要烹(yu)饪(zhuang)的食材(软件)</li></ul><h1 id="安装系统">安装系统</h1><p>首先,配置一份虚拟机(此过程我认为是不需要讲解的,不要打我),并挂载你已经下载好的系统镜像。在安装前确保给虚拟机分配了足够的空间。</p><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_214031.png" alt=""></p><p>我怕空间不够,所以在此处给硬盘分配了 <strong>80 GB</strong>。 此处需要两个分区,一个用来安装系统,另一个拿来存放我们稍后制作出来的安装盘。分配完成后点击<strong>下一步</strong>。</p><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_214105.png" alt=""></p><p>制作 Windows 8 及以上版本的系统镜像时,需要提前安装 .Net 3.5</p><p>在安装 Windows 的时候,点击 <kbd>Shift</kbd> + <kbd>F10</kbd> 呼出 命令提示符。输入 <code>taskmgr</code> 调用任务管理器。</p><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_214234.png" alt=""></p><p>在 Windows 安装程序上点击 <code>Go To Progress</code></p><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_214254.png" alt=""><br><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_soIpGXaAAQ.png" alt=""></p><p>直到显示&quot;Windows 需要重启才能继续&quot; 时,点击 End Progress 结束掉安装程序。(建议在提示重启前提前准备好前面的操作,除非您的手速够快)</p><blockquote><p><strong>如果提前关闭,会提示错误 50</strong></p></blockquote><p><img src="https://static.hit.moe/blog/source/build-iso/photo_2019-05-12_13-48-54.jpg" alt="错误 50"></p><p>结束掉之后,会发现已经回到了最开始的地方</p><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_214642.png" alt=""></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><code class="hljs bash">dism /image:E:\ /enable-feature /featurename:netfx3 /<span class="hljs-built_in">source</span>:D:\sources\sxs /all<br></code></pre></td></tr></table></figure><blockquote><p>如果您要定制的系统版本低于 Windows Server 2012 那么请输入</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">dism /image:E:\ /enable-feature /featurename:netfx3 /<span class="hljs-built_in">source</span>:D:\sources\sxs<br></code></pre></td></tr></table></figure><p>来安装 .Net 3.5 ,此处的E盘为系统安装盘,D盘为光盘所在分区。可以通过在命令提示符中输入 notepad 来确定盘符。</p><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_214853.png" alt=""></p><p>如果没有问题的话,应该会显示这个界面,在安装完成后,重启虚拟机。</p><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_215055.png" alt=""></p><h1 id="配置系统">配置系统</h1><p>重启之后,应该会见到熟悉的系统配置界面。在出现小娜(如果没有麦克风),会直接显示选择地区的界面。此处不要进行配置。<br>同时按下 <strong><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>F3</kbd></strong> 现在会进入 审核模式(Audit Mode)</p><blockquote><p>这就是从Vista起,微软专门给OEM厂商和一些有需要的人提供的封装定制模式——审核模式。在这个模式下,一旦注销Administrator会被锁死,只能重启。从Windows 8起,在这个模式下,请勿使用开始菜单的命令关机,否则下次开机必须重启一次。<br>如果需要关机,请重启然后赶快进入BIOS设置,然后用虚拟机的功能强制关机。</p></blockquote><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_221541.png" alt=""></p><p>在完成定制前,直接关掉系统准备工具即可。</p><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_221634.png" alt=""></p><h2 id="part-1-安装系统更新和一部分基础的软件-运行库">Part 1.安装系统更新和一部分基础的软件、运行库</h2><p>进入审核模式之后,打开开始——设置,更新和安全,检查更新来把近期的更新都安装上去。<br><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_224033.png" alt=""></p><p>在此过程中,可以安装一部分基础的软件、运行库,但是不建议现在就安装 Office。</p><p>为了保证定制出来的镜像尽可能干净无残留,请不要在虚拟机内使用浏览器下载安装包。所以,将需要的软件通过 UltraISO 或其他工具打包成 iso 镜像,并在虚拟机内挂载。</p><p><img src="https://static.hit.moe/blog/source/build-iso/explorer_190512_141327.png" alt=""></p><p>你可能会发现C盘有两个文件夹, <code>$WINDOWS.~BT</code> 和 <code>$WINDOWS.~LS</code> 将他们删除(我这里直接删除,忘记截图了,贴图是从网上找来的)</p><p><img src="https://static.hit.moe/blog/source/build-iso/img_57bdf571e579b.png" alt=""></p><p>安装完 Windows 更新之后重启虚拟机,在重启前挂在你的 PE 镜像。在重启后,疯狂点击虚拟机BIOS设置的热键(VirtualBox 是F12)<br>设置成光盘启动优先或选择进入PE 镜像,我这里使用的是光卡大佬制作的<a href="https://hikaricalyx.com/hikaripe/">HIKARI PE</a><br>如果使用其他PE 请自行准备DISM++,并确保该PE至少是Win8内核,并且位数要和你要定制的系统一致。</p><h2 id="part-2-清理系统更新后被替换下来的旧系统文件冗余">Part 2.清理系统更新后被替换下来的旧系统文件冗余</h2><p>进入PE之后,打开dism++,选择顶部的Windows 10并打开会话,然后点左边的<strong>空间回收</strong>,按照下图所示勾上“<strong>被取代的WinSxS组件(非常慢)</strong>”和“<strong>Windows报告</strong>”、“<strong>Windows事件</strong>”、“<strong>零售演示离线内容</strong>”,并将<strong>缓存文件</strong>和<strong>临时文件</strong>所有的项目勾上,就可以开始清理了。</p><blockquote><p>可能是因为我这次使用的系统镜像是19H1的原因在清理WinSxS组件时,提示出错,清理出来的空间也比其他版本少,个人认为是我选择的镜像原因</p></blockquote><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_1W51tUNdrf.png" alt=""></p><p>清理完成之后就可以再次重启了。重启之前别忘了更换光盘镜像,避免再次重启回PE。</p><h2 id="part-3-安装剩余你想安装的软件">Part 3.安装剩余你想安装的软件</h2><p>现在你就可以随心所欲的安装剩下的你需要的软件了。</p><blockquote><p>但是这里不建议安装<br>打印机、摄像头等的驱动配套软件、防病毒软件、防火墙软件、影子还原(比如Shadow Defender)、PDF虚拟打印机程序、依赖Ghost的备份还原程序(如一键Ghost)、各种专业软件(特别是像Visual Studio这样的IDE)。</p></blockquote><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_224344.png" alt=""></p><p>将你要安装的软件安装完成之后,请再次<strong>重启</strong>虚拟机以确保一些软件顺利预装进去。</p><h1 id="打包与压缩">打包与压缩</h1><h2 id="part-1-使用系统准备工具对系统进行处理">Part 1.使用系统准备工具对系统进行处理</h2><p>重启回来之后,这次请勾上系统准备工具窗口里的<strong>通用</strong>,放入PE的启动光盘镜像之后,点<strong>确定</strong>。<br>稍后程序会自动对Windows进行处理,处理完成之后会自动重启。<br>重启之后请立即进入PE对成品进行备份。</p><h2 id="part-2-快速打包">Part 2.快速打包</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><code class="hljs bash">dism /capture-image /capturedir:D:\ /imagefile:E:\Edison_Windows10_19H1_X64.wim /name:<span class="hljs-string">&quot;Edison Windows10 19H1 X64&quot;</span> /compress:fast<br></code></pre></td></tr></table></figure><p>此处和之前安装 .Net3.5 比较类似,<code>capturedir</code> 为系统盘符,<code>imagefile</code> 的位置为我们之前新建出来的第二个分区,名称可以随意。<br><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_234455.png" alt=""></p><p>打包的过程将会消耗一定的时间,在打包完成后,你会在指定的盘符中看到打包好的文件。</p><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190511_235402.png" alt=""></p><h2 id="part-3-快速压缩">Part 3.快速压缩</h2><p>下面,我们需要将打包的 wim文件拷贝出来,可以通过 7-zip打开VMDK镜像,然后双击2.NTFS就可以解压出里面的镜像了。</p><p>接下来还是以这个镜像为例,以管理员权限打开命令提示符或是PowerShell,输入下面的命令,将镜像进行高度压缩。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs powershell">dism /<span class="hljs-built_in">export-image</span> /sourceimagefile:E:\Edison_Windows10_19H1_X64.wim /sourceindex:<span class="hljs-number">1</span> /destinationimagefile:E:\Edison_Windows10_19H1_X64.esd /compress:recovery<br></code></pre></td></tr></table></figure><p><img src="https://static.hit.moe/blog/source/build-iso/powershell_190512_001848.png" alt=""></p><p>你可以发现这个过程非常的吃内存和CPU,所以建议你在不用电脑的过程中进行这个操作。我昨晚在电脑上压缩的过程大概耗费了差不多20分钟左右。不过压缩出来的成果也是比较喜人的。</p><p><img src="https://static.hit.moe/blog/source/build-iso/g9hIMxhMyQIBlX4Q.jpg" alt=""></p><p>你可以配合PE的dism或WinNTSetup来安装,能同时支持UEFI和Secure Boot以及Legacy启动模式。</p><h2 id="part-4-制成光盘镜像">Part 4.制成光盘镜像</h2><p>如果你想把它做成光盘镜像,那你还需要做这些操作:<br>解压原版win10 64位安装镜像,删除里面sources文件夹的install.wim,将最终成品重命名成install.esd复制进去。<br>并新建一直文本文档,命名为 <code>ei.cfg</code></p><figure class="highlight ini"><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></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-section">[EditionID]</span><br>Home<br>Professional<br>ProfessionalWorkstation<br>Enterprise<br><span class="hljs-section">[Channel]</span><br>Retail<br><span class="hljs-section">[VL]</span><br>2<br></code></pre></td></tr></table></figure><p>保存之后,将它重新打包回ISO即可。<br>可以在此处下载 <a href="https://go.microsoft.com/fwlink/?linkid=2086042">Windows ADK 1903</a><br>此处我只安装了部署工具。</p><p><img src="https://static.hit.moe/blog/source/build-iso/adksetup_190512_151237.png" alt=""></p><p>为了支持UEFI,请使用oscdimg命令打包。</p><p>切换到 oscdimg 目录下<br><code>C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg</code></p><p>在 PowerShell 中输入</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs powershell">.\oscdimg.exe <span class="hljs-literal">-m</span> <span class="hljs-literal">-o</span> <span class="hljs-literal">-u2</span> <span class="hljs-literal">-udfver102</span> <span class="hljs-literal">-bootdata</span>:<span class="hljs-number">2</span><span class="hljs-comment">#p0,e,bEtfsboot.com#pEF,e,bEfisys.bin -l&quot;Edison Windows 10 19H1 X64&quot; E:\Edison_WIN10_19H1 E:\Edison_WIN10_19H1.iso</span><br></code></pre></td></tr></table></figure><blockquote><p>此处的 <code>E:\Edison_WIN10_19H1</code> 为安装程序所在文件夹,<code>E:\Edison_WIN10_19H1.iso</code> 为输出文件夹</p></blockquote><p><img src="https://static.hit.moe/blog/source/build-iso/powershell_190512_151743.png" alt=""></p><p>完成后的成品可以在虚拟机中进行一下测试。</p><h1 id="最后的一点说明">最后的一点说明</h1><p>这个过程可能会消耗较长的时间,不过之后在装系统的时候节约下来的时间就远远超过现在所耗费的时间了。</p><p>这么装完的系统确实是没激活的,因为没整合非法激活工具。这里确实考虑到了版权因素,还考虑到了一些非法激活工具给系统带来的安全隐患问题。</p><p>再加上Win10本身激活的机制那么好,有伴随主板终身的数字许可证,还能转移到下一台电脑上,还有什么理由再去用非法激活工具呢?</p><p>我自己在镜像中压缩了 <a href="https://www.bandisoft.com/bandizip/">Bandizip</a>,<a href="https://potplayer.daum.net/">Potplayer</a>,<a href="https://www.ccleaner.com/download">CCleaner</a>,Chrome,Office 和<a href="https://www.majorgeeks.com/files/details/visual_c_redistributable_runtimes_aio_repack.html">基础运行库</a></p><blockquote><p>PS: Potplayer 是韩国 Daum 公司的一款良心产品,而前不久 Daum 网站已经被墙。你可以在这里下载我的转存版本,但不能保证实时更新 <a href="https://cloud.wevg.org/software/potplayer">点击下载</a></p></blockquote><p>至此,属于我们自己的 Windows 系统安装镜像就创建完成了。</p><p><img src="https://static.hit.moe/blog/source/build-iso/VirtualBoxVM_190512_154758.png" alt=""></p><h1 id="参考链接">参考链接</h1><p><a href="https://docs.microsoft.com/en-us/windows-hardware/get-started/adk-install">Download and install the Windows ADK</a></p><p><a href="https://finalthought.org/2018/01/11/creating-customized-windows-10-version-1709-media-iso-wim-flash-drive/">Creating Customized Windows 10 Version 1709 Media (ISO, WIM, Flash Drive)</a></p><p><a href="https://answers.microsoft.com/en-us/windows/forum/windows_7-windows_install/where-is-oscdimgexe/b6ccd22e-b478-4222-b370-d5aaf021f575">Where is oscdimg.exe</a></p><p><a href="https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/oscdimg-command-line-options#oscdimg-command-line-options-1">Oscdimg Command-Line Options</a></p><p><a href="https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-setup-edition-configuration-and-product-id-files--eicfg-and-pidtxt">Windows Setup Edition Configuration and Product ID Files (EI.cfg and PID.txt)</a></p><p><a href="https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/dism-windows-edition-servicing-command-line-options">DISM Windows Edition-Servicing Command-Line Options</a></p><p><a href="https://msdn.microsoft.com/en-us/library/windows/hardware/dn898486(v=vs.85).aspx">审核模式概述(Audit Mode Overview)</a></p><p><a href="https://www.ithome.com/html/win10/312311.htm">IT之家学院:如何定制一个预装好基本软件的Win10</a></p><p><a href="https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/system-builder-deployment-of-windows-10-for-desktop-editions">System builder deployment of Windows 10 for desktop editions</a></p><p><a href="http://bbs.pcbeta.com/viewthread-1810688-1-1.html">18362的哈希出来了,大家来看看,UUP文件的</a></p><p><a href="https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/deploy-net-framework-35-by-using-deployment-image-servicing-and-management--dism">Deploy .NET Framework 3.5 by using Deployment Image Servicing and Management (DISM)</a></p><p><a href="https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-8.1-and-8/hh825262(v%3dwin.10)">https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-8.1-and-8/hh825262%28v%3dwin.10%29</a></p><p><a href="http://www.virtubytes.com/2017/02/03/install-net-framework-3-5-server-2016/">INSTALL .NET FRAMEWORK 3.5 ON WINDOWS SERVER 2016 – ALTERNATE PATH ERROR</a></p><p><a href="https://windowsreport.com/net-framework-3-5-missing-windows-10/">Fix: .NET Framework 3.5 is Missing From Windows 10</a></p><p><a href="https://www.raymond.cc/blog/access-virtual-hard-disks-easily-in-windows-7/">7 Ways To Open Virtual Hard Disk Images For Read And Write Access</a></p><blockquote><p>Thumbnail by Microsoft</p></blockquote>]]></content>
  744.    
  745.    <summary type="html">
  746.    
  747.      &lt;p&gt;有没有想过像 OEM 厂商一样制作一个已经预装好软件的  Windows 安装镜像呢? 除了 Ghost 的异端外,有没有其他方法呢? 本文旨在将带您定制一个属于自己的 Windows 系统安装镜像。
  748.    
  749.    </summary>
  750.    
  751.    
  752.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  753.    
  754.      <category term="Windows" scheme="https://www.wevg.org/categories/Tech/Windows/"/>
  755.    
  756.    
  757.      <category term="Windows" scheme="https://www.wevg.org/tags/Windows/"/>
  758.    
  759.      <category term="System" scheme="https://www.wevg.org/tags/System/"/>
  760.    
  761.  </entry>
  762.  
  763.  <entry>
  764.    <title>为你的 Commit 加上 GPG 的签名</title>
  765.    <link href="https://www.wevg.org/archives/git-gpg-sign-commit/"/>
  766.    <id>https://www.wevg.org/archives/git-gpg-sign-commit/</id>
  767.    <published>2019-04-22T15:51:12.000Z</published>
  768.    <updated>2019-04-22T15:51:12.000Z</updated>
  769.    
  770.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>GPG 是一个非常出色的加密软件。为 Commit 带上 GPG 的签名就是一个很好的开始,它能够在一定程度上保证安全性。<span id="more"></span>写本文的另一个原因是,之前经常查看的大佬的博客打不开了,就研究了一下,准备自己写一篇。</p><h1 id="基本要求">基本要求</h1><p>git 版本 &gt;= 2.0</p><p>已经安装 GPG (可通过输入<code>gpg --version</code>,确保已经安装)</p><h1 id="生成-gpg-key">生成 GPG Key</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><code class="hljs bash">gpg --full-generate-key<br></code></pre></td></tr></table></figure><p>此处的交互选项推荐为:</p><ul><li>RSA and RSA (Default)</li><li>4096</li><li>过期长度请自行选择,不知道的话,可输入 0 (默认值),即永不过期</li></ul><p>接下来便需要输入您的个人信息了,此处的邮箱需要与 Github 对应</p><h1 id="导入-gpg-key">导入 GPG key</h1><blockquote><p>此部分为将其他位置导出密钥,导入至当前设备中,不需要的话,可直接跳过此步骤</p></blockquote><p>此处文件名以 <code>edison.gpg</code> 为例</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">gpg --import edison.gpg<br></code></pre></td></tr></table></figure><p>此处需要输入之前设置好的密钥密码。<br>导入完成后,还需要更改密钥的信任度,因为是<strong>我们自己的密钥</strong>,所以将信任度设置为 <code>Ultimate</code>。</p><p>首先,输入下面的代码,查看自己所有的 GPG key</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">gpg --list-secret-keys --keyid-format LONG<br></code></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><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">/home/edison/.gnupg/pubring.kbx<br>------------------------------------<br>sec   4096R/1234567890ABCDEF 2019-04-23 [expires: 2019-04-23]<br>uid    ***********SECRET***********<br>ssb   4096R/FEDCBA0987654321 2019-04-23<br></code></pre></td></tr></table></figure><p>其中 sec 部分的 <strong>1234567890ABCDEF</strong> 就是我们刚刚生成的 GPG key 的 ID,我们要修改这个密钥的信任度,所以输入</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><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">gpg --edit-key 1234567890ABCDEF<br>// 修改 1234567890ABCDEF 为实际ID<br>trust<br>//修改信任度<br></code></pre></td></tr></table></figure><p>此处输入 <code>5</code>,即完全信任。</p><h1 id="将-gpg-key-保存到-github">将 GPG key 保存到 GitHub</h1><p>输入下面的命令显示完整的 GPG key, 此处要注意将 <strong>1234567890ABCDEF</strong> 修改为实际内容</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">gpg --armor --<span class="hljs-built_in">export</span> 1234567890ABCDEF<br></code></pre></td></tr></table></figure><p><strong>复制输出的全部内容</strong></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><code class="hljs bash">-----BEGIN PGP PUBLIC KEY BLOCK-----<br>………………<br>-----END PGP PUBLIC KEY BLOCK-----<br></code></pre></td></tr></table></figure><p>访问 GitHub -&gt; Settings -&gt; SSH and GPG keys -&gt; New GPG key,将复制好的 GPG key 粘贴到输入框并保存。</p><h1 id="启用-gpg-签名">启用 GPG 签名</h1><p>接下来便要为 Git 启用 GPG 签名了,首先设置自己的 GPG key<br>输入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">git config --global user.signingkey 1234567890ABCDEF<br></code></pre></td></tr></table></figure><h2 id="单次-commit-签名">单次 Commit 签名</h2><p>在提交 Commit 时,添加 <code>-S</code> 即可对本次 git 进行签名</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">git commit -S -m <span class="hljs-string">&quot;HAHAHAHA I&#x27;m Using GPG now&quot;</span><br></code></pre></td></tr></table></figure><h2 id="每次-commit-都签名">每次 Commit 都签名</h2><p>执行下面的命令即可,日后提交 Commit 的时候也不需要再加 <code>-S</code>了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">git config --global commit.gpgsign <span class="hljs-literal">true</span><br></code></pre></td></tr></table></figure><p>提交 Commit 的效果就会是这样了。</p><p><img src="https://i.yecdn.com/images/2019/04/22/99f379f99563a532e63f29679d35db55.png" alt="Commit"></p><h1 id="参考链接">参考链接</h1><p><a href="https://seven.ooo/sign-git-commits-with-gpg-key/#%E6%AD%A5%E9%AA%A4">使用 GPG key 签名你的 Git 提交</a></p><p><a href="https://askubuntu.com/questions/1019793/how-to-solve-gpg-invalid-option-full-generate-key">How to solve gpg: invalid option “–full-generate-key”?</a></p><p><a href="https://github.com/longtian/gpg-howto#%E6%80%8E%E6%A0%B7%E4%B8%BA%E4%BD%A0%E7%9A%84-commit-%E5%8A%A0%E4%B8%8A-gpg-%E7%9A%84%E7%AD%BE%E5%90%8D">怎样为你的 Commit 加上 GPG 的签名</a></p>]]></content>
  771.    
  772.    <summary type="html">
  773.    
  774.      &lt;p&gt;GPG 是一个非常出色的加密软件。为 Commit 带上 GPG 的签名就是一个很好的开始,它能够在一定程度上保证安全性。
  775.    
  776.    </summary>
  777.    
  778.    
  779.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  780.    
  781.    
  782.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  783.    
  784.      <category term="Github" scheme="https://www.wevg.org/tags/Github/"/>
  785.    
  786.      <category term="Git" scheme="https://www.wevg.org/tags/Git/"/>
  787.    
  788.      <category term="GPG" scheme="https://www.wevg.org/tags/GPG/"/>
  789.    
  790.  </entry>
  791.  
  792.  <entry>
  793.    <title>让 Git 命令为你保存密码</title>
  794.    <link href="https://www.wevg.org/archives/git-always-asking-password/"/>
  795.    <id>https://www.wevg.org/archives/git-always-asking-password/</id>
  796.    <published>2019-04-22T15:50:35.000Z</published>
  797.    <updated>2019-04-22T15:57:36.000Z</updated>
  798.    
  799.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>想必很多人都跟我一样遇到过这个问题,尤其是在使用了 1Password 随机生成的密码之后,被某一款程序/网站频繁要求输入密码的时候,就变得十分的痛苦。<span id="more"></span>今天终于找到了解决这个的办法,也顺便分享一下。</p><blockquote><p>请注意,本文仅限于通过 git/VS Code 方式进行操作时被频繁要求输入密码的情况。</p></blockquote><h1 id="调整方法">调整方法</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><code class="hljs bash">git config --global credential.helper store<br></code></pre></td></tr></table></figure><p>如果您认为此方式不安全,也可将密码存储在内存中,一般情况下,Git 会存储密码15分钟,当然有时候还是会出现文章开头提到的问题,所以也可以通过这个方式修改密码在内存中储存的时间</p><blockquote><p>此操作将会设置 git 把用户凭据存储在内存中</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">git config --global credential.helper cache<br></code></pre></td></tr></table></figure><p>接下来,可以设置您希望密码在内存中保存的时间,将 <code>&lt;timeout&gt;</code> 修改为您希望储存的时间,<strong>此处以秒为单位</strong>,比如15分钟则修改为 <code>900</code> 。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">git config credential.helper cache &lt;timout&gt;<br></code></pre></td></tr></table></figure><h1 id="参考链接">参考链接</h1><p><a href="https://stackoverflow.com/questions/35942754/how-to-save-username-and-password-in-git/45327254">How to save username and password in GIT?</a></p><p><a href="https://help.github.com/en/articles/caching-your-github-password-in-git">Caching your GitHub password in Git</a></p>]]></content>
  800.    
  801.    <summary type="html">
  802.    
  803.      &lt;p&gt;想必很多人都跟我一样遇到过这个问题,尤其是在使用了 1Password 随机生成的密码之后,被某一款程序/网站频繁要求输入密码的时候,就变得十分的痛苦。
  804.    
  805.    </summary>
  806.    
  807.    
  808.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  809.    
  810.    
  811.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  812.    
  813.      <category term="Github" scheme="https://www.wevg.org/tags/Github/"/>
  814.    
  815.      <category term="Git" scheme="https://www.wevg.org/tags/Git/"/>
  816.    
  817.      <category term="VS Code" scheme="https://www.wevg.org/tags/VS-Code/"/>
  818.    
  819.  </entry>
  820.  
  821.  <entry>
  822.    <title>解决 Linux 下 TeamSpeak 插件安装问题</title>
  823.    <link href="https://www.wevg.org/archives/fix-ts3-linux-plugin/"/>
  824.    <id>https://www.wevg.org/archives/fix-ts3-linux-plugin/</id>
  825.    <published>2019-04-15T06:39:52.000Z</published>
  826.    <updated>2020-04-25T12:35:09.000Z</updated>
  827.    
  828.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>最近又在电脑上装上了 Manjaro,不过这一次算是解决了蛮多之前遇到过的问题吧。本文旨在通过调整文件识别来解决 TeamSpeak 在 Linux 下无法安装插件的问题。<span id="more"></span></p><h1 id="配置mime">配置MIME</h1><blockquote><p><strong>此处不需要 root 权限</strong></p></blockquote><p>首先在 <code>~/.local/share/mime/packages/</code> 目录下创建一个名为 <code>application-x-ts3plugin.xml</code> 的文件</p><figure class="highlight xml"><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><code class="hljs xml"><span class="hljs-meta">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">mime-info</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">&quot;http://www.freedesktop.org/standards/shared-mime-info&quot;</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">mime-type</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;application/x-ts3plugin&quot;</span>&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">comment</span>&gt;</span>ts3plugin<span class="hljs-tag">&lt;/<span class="hljs-name">comment</span>&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">glob</span> <span class="hljs-attr">pattern</span>=<span class="hljs-string">&quot;*.ts3_plugin&quot;</span>/&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">glob</span> <span class="hljs-attr">pattern</span>=<span class="hljs-string">&quot;*.ts3_style&quot;</span>/&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">glob</span> <span class="hljs-attr">pattern</span>=<span class="hljs-string">&quot;*.ts3_soundpack&quot;</span>/&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">glob</span> <span class="hljs-attr">pattern</span>=<span class="hljs-string">&quot;*.ts3_iconpack&quot;</span>/&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">glob</span> <span class="hljs-attr">pattern</span>=<span class="hljs-string">&quot;*.ts3_translation&quot;</span>/&gt;</span><br>    <span class="hljs-tag">&lt;/<span class="hljs-name">mime-type</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">mime-info</span>&gt;</span><br></code></pre></td></tr></table></figure><blockquote><p>如果想让文件显示图标 在 <code>&lt;/mime-type&gt;</code> 之前添加这段内容,<br><code>&lt;icon name=&quot;PATH_TO_YOUR_LOGO&quot;/&gt;</code><br>其中的文件路径需要自行修改,我自己为了做区分,所以使用了旧版 TeamSpeak 图标, 图标下载地址 <a href="https://go.uv.uy/slHRx">https://go.uv.uy/slHRx</a></p></blockquote><p><img src="https://i.yecdn.com/images/2019/04/16/34a5a176123e12589dd0aecd9c6f7c23.png" alt="添加后文件示例"></p><h1 id="程序启动配置">程序启动配置</h1><blockquote><p><strong>此处不需要 root 权限</strong></p></blockquote><p>接下来在  <code>~/.local/share/applications/</code> 目录下创建一个名为 <code>ts3-plugininst.desktop</code> 的文件</p><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><code class="hljs conf">[Desktop Entry]<br>Exec=/usr/bin/ts3-plugininst<br>MimeType=application/x-ts3plugin;<br>Name=TeamSpeak Plugin Installer<br>NoDisplay=true<br>Type=Application<br></code></pre></td></tr></table></figure><blockquote><p>此处如果是通过 pacman 包管理器安装的话,<strong>需要 root 权限</strong>,但如果是通过官方安装脚本则<strong>不需要 root 权限</strong></p></blockquote><p>然后在 Teamspeak 的安装目录下创建一个名为 <code>plugininst.sh</code> 的文件。<br>(因为我刚刚安装了 Manjaro,所以以此为例,pacman 滚包之后, TeamSpeak 安装目录为 <code>/opt/teamspeak3/</code> )<br>在 <code>plugininst.sh</code> 文件中键入以下内容</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><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/sh</span><br><span class="hljs-built_in">cd</span> /opt/teamspeak3<br><span class="hljs-built_in">export</span> QTDIR=.<br><span class="hljs-built_in">export</span> QT_PLUGIN_PATH=.<br><span class="hljs-built_in">export</span> LD_LIBRARY_PATH=<span class="hljs-string">&quot;.:<span class="hljs-variable">$LD_LIBRARY_PATH</span>&quot;</span><br>./package_inst <span class="hljs-variable">$@</span><br></code></pre></td></tr></table></figure><blockquote><p><strong>此处需要 root 权限</strong>,并注意您的 teamspeak3 实际位置<br>创建一个软连接到 <code>/usr/bin</code> 目录下</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ln -s /opt/teamspeak3/plugininst.sh /usr/bin/ts3-plugininst<br></code></pre></td></tr></table></figure><p>接下来,执行 <code>chmod +x /usr/bin/ts3-plugininst</code> 赋予其执行权限</p><h1 id="应用配置">应用配置</h1><blockquote><p><strong>此处不需要 root 权限</strong></p></blockquote><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><code class="hljs bash">update-desktop-database ~/.<span class="hljs-built_in">local</span>/share/applications<br>update-mime-database    ~/.<span class="hljs-built_in">local</span>/share/mime<br></code></pre></td></tr></table></figure><p>现在便可以安装插件啦~<br><img src="https://static.hit.moe/blog/source/image/ts3plugin.png" alt="最终效果图"></p><p>在此感谢 <strong>@Peter</strong> 提供技术支持</p>]]></content>
  829.    
  830.    <summary type="html">
  831.    
  832.      &lt;p&gt;最近又在电脑上装上了 Manjaro,不过这一次算是解决了蛮多之前遇到过的问题吧。本文旨在通过调整文件识别来解决 TeamSpeak 在 Linux 下无法安装插件的问题。
  833.    
  834.    </summary>
  835.    
  836.    
  837.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  838.    
  839.      <category term="Linux" scheme="https://www.wevg.org/categories/Tech/Linux/"/>
  840.    
  841.    
  842.      <category term="System" scheme="https://www.wevg.org/tags/System/"/>
  843.    
  844.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  845.    
  846.      <category term="设置" scheme="https://www.wevg.org/tags/%E8%AE%BE%E7%BD%AE/"/>
  847.    
  848.      <category term="Linux" scheme="https://www.wevg.org/tags/Linux/"/>
  849.    
  850.      <category term="VoIP" scheme="https://www.wevg.org/tags/VoIP/"/>
  851.    
  852.      <category term="TeamSpeak" scheme="https://www.wevg.org/tags/TeamSpeak/"/>
  853.    
  854.  </entry>
  855.  
  856.  <entry>
  857.    <title>替换 Telegram 字体 (新玩具)</title>
  858.    <link href="https://www.wevg.org/archives/change-fonts-with-fontmod/"/>
  859.    <id>https://www.wevg.org/archives/change-fonts-with-fontmod/</id>
  860.    <published>2019-04-07T02:26:43.000Z</published>
  861.    <updated>2019-04-07T02:26:43.000Z</updated>
  862.    
  863.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>无需 MacType,替换 Telegram 字体。FontMod 是 TGFont 的2.0版本,可用于一些基于 GDI 或者 Qt 的程序。本文旨在提升 <strong>Telegram</strong> 的使用体验。</p><span id="more"></span> <h1 id="修改方法">修改方法</h1><ol><li>下载 <a href="https://github.com/ysc3839/FontMod/releases/latest">FontMod.dll</a> (下载地址 <a href="https://github.com/ysc3839/FontMod/releases/latest">https://github.com/ysc3839/FontMod/releases/latest</a>), 改名为 <code>winmm.dll</code> 并放入 Telegram Desktop 的根目录(可_直接在资源管理器地址栏输入_ <code>%AppData%\Telegram Desktop</code> )。</li></ol><blockquote><p>用户字体:把字体文件放在 fonts 文件夹内,可以直接使用,无需安装到系统中。</p></blockquote><ol start="2"><li><strong>重启 Telegram</strong>,这时 Telegram Desktop 目录中会出现 json 文件,默认只会把宋体替换成微软雅黑,当然也可以修改 <code>FontMod.yaml</code> 来更换其他字体,下面的配置可以替换 TG 界面上用到的所有字体。</li></ol><h1 id="配置文件">配置文件</h1><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><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></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">style:</span> <span class="hljs-meta">&amp;style</span><br><span class="hljs-comment"># Remove &#x27;#&#x27; to override font style</span><br><span class="hljs-comment">#  size: 0</span><br><span class="hljs-comment">#  width: 0</span><br><span class="hljs-comment">#  weight: 0</span><br><span class="hljs-comment">#  italic: false</span><br><span class="hljs-comment">#  underLine: false</span><br><span class="hljs-comment">#  strikeOut: false</span><br><span class="hljs-comment">#  charSet: 0</span><br><span class="hljs-comment">#  outPrecision: 0</span><br><span class="hljs-comment">#  clipPrecision: 0</span><br><span class="hljs-comment">#  quality: 0</span><br><span class="hljs-comment">#  pitchAndFamily: 0</span><br><br><span class="hljs-attr">fonts:</span><br>  <span class="hljs-attr">SimSun:</span> <span class="hljs-string">&amp;zh-cn-font</span> <span class="hljs-comment"># Chinese (Simplified) fallback font</span><br>    <span class="hljs-attr">replace:</span> <span class="hljs-string">Microsoft</span> <span class="hljs-string">YaHei</span><br>    <span class="hljs-string">&lt;&lt;:</span> <span class="hljs-meta">*style</span><br>  <span class="hljs-attr">PMingLiU:</span> <span class="hljs-comment"># Chinese (Traditional) fallback font</span><br>    <span class="hljs-attr">replace:</span> <span class="hljs-string">Microsoft</span> <span class="hljs-string">JhengHei</span> <span class="hljs-string">UI</span><br>    <span class="hljs-string">&lt;&lt;:</span> <span class="hljs-meta">*style</span><br>  <span class="hljs-attr">MS UI Gothic:</span> <span class="hljs-comment"># Japanese fallback font</span><br>    <span class="hljs-attr">replace:</span> <span class="hljs-string">Yu</span> <span class="hljs-string">Gothic</span> <span class="hljs-string">UI</span><br>    <span class="hljs-string">&lt;&lt;:</span> <span class="hljs-meta">*style</span><br>  <span class="hljs-attr">Gulim:</span> <span class="hljs-comment"># Korean fallback font</span><br>    <span class="hljs-attr">replace:</span> <span class="hljs-string">맑은</span> <span class="hljs-string">고딕</span><br>    <span class="hljs-string">&lt;&lt;:</span> <span class="hljs-meta">*style</span><br><br><span class="hljs-attr">fixGSOFont:</span> <span class="hljs-literal">true</span> <span class="hljs-comment"># true is to use system UI font</span><br><span class="hljs-comment">#fixGSOFont: *zh-cn-font # Or replace with user defined font</span><br><span class="hljs-attr">debug:</span> <span class="hljs-literal">false</span><br></code></pre></td></tr></table></figure><blockquote><p>** 参数说明 **<br><strong>key (“SimSun”)</strong>: 要修改的字体名称。<br><strong>replace</strong>: 要替换的字体<br><strong>debug</strong>: Debug 模式 (将会创建 FontMod.log)<br><strong>以下为可选参数</strong><br><strong>size</strong>: 控制字体大小<br><strong>width</strong>: 控制字体宽度<br><strong>weight</strong> : 控制字体字重<br><strong>italic</strong> :是否开启斜体<br><strong>underLine</strong> :是否加入下划线<br><strong>strikeOut</strong> :是否加入删除线<br><strong>outPrecision</strong>: 输出精度<br><strong>clipPrecision</strong>: 剪裁精度<br><strong>quality</strong>: 输出质量<br><strong>pitchAndFamily</strong>: 字体的音高和族<br><strong>fixGSOFont</strong>: 替换 GetStockObject 字体,选项与前面的 fonts 相同。若设为 true 则会使用 SystemParametersInfo 获取系统字体。</p></blockquote><h1 id="免安装字体替换方法">免安装字体替换方法</h1><p>新建一个文件夹名为 <code>fonts</code>, 将想要拿来替换的字体放进去, 此处以 Ubuntu 为例,为例省事,我就将一整套字体都搬过来了</p><p><img src="https://i.yecdn.com/images/2019/04/15/b376fd9caa036ad9ee9a61d7710f6f65.png" alt=""></p><p>此时在配置文件中添加要修改的部分,比如将 <code>Open Sans</code> 替换为 <code>Ubuntu</code> (⚠ 此处纯个人喜好)<br>那么在配置文件中添加如下字段即可。</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><code class="hljs yaml"><span class="hljs-attr">Open Sans:</span> <br>  <span class="hljs-attr">replace:</span> <span class="hljs-string">Ubuntu</span><br>  <span class="hljs-string">&lt;&lt;:</span> <span class="hljs-meta">*style</span><br></code></pre></td></tr></table></figure><p><img src="https://i.yecdn.com/images/2019/04/15/c9e21364ee43bf5ca12df328af75587a.png" alt="替换后效果示例"></p><blockquote><p>本文部分内容摘自项目 Github 说明文档。</p></blockquote>]]></content>
  864.    
  865.    <summary type="html">
  866.    
  867.      &lt;p&gt;无需 MacType,替换 Telegram 字体。FontMod 是 TGFont 的2.0版本,可用于一些基于 GDI 或者 Qt 的程序。本文旨在提升 &lt;strong&gt;Telegram&lt;/strong&gt; 的使用体验。&lt;/p&gt;
  868.    
  869.    </summary>
  870.    
  871.    
  872.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  873.    
  874.      <category term="Windows" scheme="https://www.wevg.org/categories/Tech/Windows/"/>
  875.    
  876.    
  877.      <category term="字体" scheme="https://www.wevg.org/tags/%E5%AD%97%E4%BD%93/"/>
  878.    
  879.      <category term="Font" scheme="https://www.wevg.org/tags/Font/"/>
  880.    
  881.      <category term="Github" scheme="https://www.wevg.org/tags/Github/"/>
  882.    
  883.  </entry>
  884.  
  885.  <entry>
  886.    <title>更新 Debian 内核</title>
  887.    <link href="https://www.wevg.org/archives/debian-update-kernel/"/>
  888.    <id>https://www.wevg.org/archives/debian-update-kernel/</id>
  889.    <published>2019-03-23T03:03:59.000Z</published>
  890.    <updated>2019-10-06T05:21:17.000Z</updated>
  891.    
  892.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>在本文中,将向您展示如何升级 Debian 的内核。让我们开始吧。<span id="more"></span></p><h1 id="更新系统">更新系统</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></pre></td><td class="code"><pre><code class="hljs bash">apt update &amp;&amp; apt full-upgrade -y<br>apt install lsb-release<br></code></pre></td></tr></table></figure><h2 id="更新系统的-apt-源-可选">更新系统的 apt 源(可选)</h2><p>个人来说,比较喜欢 Debian AWS 的源,所以此处以此为例。<br>执行下面的操作来使用 AWS Debian:</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><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><code class="hljs bash">cat &gt; /etc/apt/sources.list &lt;&lt; <span class="hljs-string">EOF</span><br><span class="hljs-string">deb http://cdn-aws.deb.debian.org/debian $(lsb_release -sc) main contrib non-free</span><br><span class="hljs-string">deb http://cdn-aws.deb.debian.org/debian-security $(lsb_release -sc)/updates main contrib non-free</span><br><span class="hljs-string">deb http://cdn-aws.deb.debian.org/debian $(lsb_release -sc)-updates main contrib non-free</span><br><span class="hljs-string">deb http://cdn-aws.deb.debian.org/debian $(lsb_release -sc)-backports main contrib non-free</span><br><span class="hljs-string">deb http://cdn-aws.deb.debian.org/debian $(lsb_release -sc)-proposed-updates main contrib non-free</span><br><span class="hljs-string"># deb http://cdn-aws.deb.debian.org/debian $(lsb_release -sc)-backports-sloppy main contrib non-free</span><br><span class="hljs-string">EOF</span><br></code></pre></td></tr></table></figure><p>修改过源之后,记得更新 apt 的本地包信息:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">apt update<br></code></pre></td></tr></table></figure><h1 id="安装新版内核">安装新版内核</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><code class="hljs bash">apt search linux-image<br></code></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><code class="hljs bash">apt install -t $(lsb_release -sc)-backports linux-image-$(dpkg --print-architecture) linux-headers-$(dpkg --print-architecture) --install-recommends -y<br></code></pre></td></tr></table></figure><p>Debian 10 云服务器可以执行此项, 安装专为云平台优化的内核 (Thanks to <a href="https://dcc.cat/">七呼大佬</a>)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">apt install -t $(lsb_release -sc)-backports linux-image-cloud-$(dpkg --print-architecture) linux-headers-cloud-$(dpkg --print-architecture) --install-recommends -y<br></code></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></pre></td><td class="code"><pre><code class="hljs bash">update-grub<br>reboot<br></code></pre></td></tr></table></figure><h1 id="检查已安装的内核版本">检查已安装的内核版本</h1><p>重启之后,应该已经切换到新的内核了,输入 <code>uname -r</code>可以查看当前的内核版本</p><p><img src="https://i.yecdn.com/images/2019/04/25/4ba6a6225a6873158d228cf9328a040f.png" alt=""></p><h1 id="后续清理工作">后续清理工作</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><code class="hljs bash">dpkg -l | grep linux<br></code></pre></td></tr></table></figure><p>然后把不必要的内核逐一删除,此处以 <code>linux-image-4.9.0-3-amd64</code> 为例:</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><code class="hljs bash">apt purge linux-image-4.9.0-3-amd64<br>……<br></code></pre></td></tr></table></figure><p><strong>请注意,此处如果操作失误,可能会导致服务器无法启动</strong></p><p>至此更新的工作就完成了。撒花~</p><h1 id="参考链接">参考链接</h1><ul><li><a href="https://wiki.debian.org/HowToUpgradeKernel">HowToUpgradeKernel</a></li><li><a href="https://linuxhint.com/how-to-upgrade-kernel-of-debian-9-stretch-from-source/">How to Upgrade Kernel of Debian 9 Stretch from Source</a></li><li><a href="https://dcc.cat/lemp/">Debian / Ubuntu 环境下 LEMP 建站解析</a></li><li><a href="https://josta.me/blog/201708/debian_9_upgrade_kernel/">Debian 9更新Linux内核</a></li><li><a href="https://www.linode.com/docs/platform/update-kernel/">How to Update your Linode’s Existing Kernel</a></li><li><a href="https://askubuntu.com/questions/652363/how-can-i-get-a-list-with-the-packages-selected-by-apt-get-autoremove">How can I get a list with the packages selected by apt-get autoremove</a></li></ul>]]></content>
  893.    
  894.    <summary type="html">
  895.    
  896.      &lt;p&gt;在本文中,将向您展示如何升级 Debian 的内核。让我们开始吧。
  897.    
  898.    </summary>
  899.    
  900.    
  901.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  902.    
  903.      <category term="Linux" scheme="https://www.wevg.org/categories/Tech/Linux/"/>
  904.    
  905.    
  906.      <category term="System" scheme="https://www.wevg.org/tags/System/"/>
  907.    
  908.      <category term="Linux" scheme="https://www.wevg.org/tags/Linux/"/>
  909.    
  910.      <category term="Debian" scheme="https://www.wevg.org/tags/Debian/"/>
  911.    
  912.  </entry>
  913.  
  914.  <entry>
  915.    <title>为 UWP 创建快捷方式</title>
  916.    <link href="https://www.wevg.org/archives/shortcut-for-uwps/"/>
  917.    <id>https://www.wevg.org/archives/shortcut-for-uwps/</id>
  918.    <published>2019-03-20T02:48:35.000Z</published>
  919.    <updated>2019-04-01T10:17:22.000Z</updated>
  920.    
  921.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>前几天,在重新装机后,发现好多常用的软件,比如: iTunes, Telegram, ShareX等等,都有UWP版本。那么,在安装之后,该怎么像<strong>Edge浏览器</strong>一样,创建快捷方式呢?</p><span id="more"></span><h1 id="正确的方法">正确的方法</h1><ol><li>右键点击开始菜单或按下快捷键 </i><kbd>Win</kbd> + <kbd>R</kbd> 呼出运行对话框,输入</li></ol><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs powershell">shell:AppsFolder<br></code></pre></td></tr></table></figure><p><img src="https://i.yecdn.com/images/2019/04/15/81b4c5d0cc80e20e24bf1611e616dec7.png" alt="运行 shell:AppsFolder"></p><ol start="2"><li>在弹出的界面中,可以看到当前系统中已经安装的 程序/UWP</li></ol><p><img src="https://i.yecdn.com/images/2019/04/15/8c50e0ed3308cfbbdc96089dad51b97b.png" alt=""></p><ol start="3"><li>在想要创建快捷方式的程序上,点击右键选择 <strong>创建快捷方式</strong> ,此处会出现下方的提示,点击 <strong>是</strong> 即可。</li></ol><p><img src="https://i.yecdn.com/images/2019/04/15/7cc2820a821e0d128bec6201ecc0e1cd.png" alt="无法在当前位置创建快捷方式"></p><p>此时,UWP的快捷方式便创建成功了。</p><p><img src="https://i.yecdn.com/images/2019/04/15/eacb3d8937831f8b6556460d79e6a015.png" alt=""></p><h1 id="最初的尝试">最初的尝试</h1><p>我最开始的尝试是通过输入UWP的名称,这个名称是我在配置  QuickLook 的时候在官方配置文档 中发现的 <code>LOCALAPPDATA</code> ,通过这个方法,我成功的创建了 iTunes 的快捷方式。</p><p><img src="https://i.yecdn.com/images/2019/04/15/a268fca582bc9080ed86cd6de7edca5a.png" alt="快捷方式无法正常显示图标"></p><p>虽然能启动,但是这个方法造成的问题是不能正常显示图标,而且其他UWP程序,并不能通过这个方法成功创建快捷方式。<br>比如NetFlix,会显示这样的界面。</p><p><img src="https://i.yecdn.com/images/2019/04/15/151bf6f1c0d5c763deec41b8a6bd107e.png" alt="Error"></p><h1 id="参考链接">参考链接</h1><p><a href="https://github.com/QL-Win/QuickLook/wiki/Available-Plugins#how-to-remove-a-plugin">How to remove a plugin</a><br><a href="https://www.thurrott.com/windows/windows-10/5328/windows-10-tip-create-shortcuts-for-universal-apps">Windows 10 Tip: Create Shortcuts for Universal Apps</a><br><a href="https://winaero.com/blog/desktop-shortcut-store-app-windows-10/">Create Desktop Shortcut for Store app in Windows 10 - Winaero</a></p>]]></content>
  922.    
  923.    <summary type="html">
  924.    
  925.      &lt;p&gt;前几天,在重新装机后,发现好多常用的软件,比如: iTunes, Telegram, ShareX等等,都有UWP版本。那么,在安装之后,该怎么像&lt;strong&gt;Edge浏览器&lt;/strong&gt;一样,创建快捷方式呢?&lt;/p&gt;
  926.    
  927.    </summary>
  928.    
  929.    
  930.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  931.    
  932.      <category term="Windows" scheme="https://www.wevg.org/categories/Tech/Windows/"/>
  933.    
  934.    
  935.      <category term="Windows" scheme="https://www.wevg.org/tags/Windows/"/>
  936.    
  937.      <category term="System" scheme="https://www.wevg.org/tags/System/"/>
  938.    
  939.  </entry>
  940.  
  941.  <entry>
  942.    <title>解决 Win10 “幽灵”漏洞补丁性能问题</title>
  943.    <link href="https://www.wevg.org/archives/enable-retpoline-win10/"/>
  944.    <id>https://www.wevg.org/archives/enable-retpoline-win10/</id>
  945.    <published>2019-03-07T05:04:46.000Z</published>
  946.    <updated>2019-05-15T01:00:04.000Z</updated>
  947.    
  948.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>微软在 Windows 10 1809版本引入了 Retpoline 修复补丁。但是却不是默认开启的,本文将会简单的说明 Retpoline ,以及手动启用方法。</p><span id="more"></span><p><s><strong>2019-03-07</strong> 请注意,当前版本会导致某些情况下出现性能下降!!!在微软重新发布前建议卸载 <code>KB4482887</code> 补丁</s></p><p><strong>2019-03-20</strong> 官方已于 2019-03-12 日放出修复补丁 <code>KB4489899</code> 强烈建议安装</p><h1 id="什么是-retpoline-呢?">什么是 Retpoline 呢?</h1><blockquote><p>2018年1月4日,Google 在其安全博客上详细介绍了新技术 “Retpoline”,该技术能够以微不足道的处理器开销克服 Spectre 漏洞。它涉及在编译器编译时让间接分支跳转到不同的目标,减少易受攻击的乱序执行发生。虽然这项技术面向x86指令集开发,Google 工程师认为该技术也可以用于其他处理器。<br>简单来说,就是谷歌为了解决/减少目前 Meltdown 和 Spectre 漏洞补丁对性能产生的 5% - 30% 的影响,开发了名为 Retpoline 的基于软件的修复方案。Retpoline 方案旨在提高 Windows 和 Linux 平台中 Spectre Variant 2 的性能。</p></blockquote><p>微软的一篇博客文章中表示,目前在 Windows 客户端设备上默认禁用此功能,当然该文章中也写明了启用方法。<br>需要注意的是, Retpoline 将会在 19H1 版本默认启用。下面我便会写出尝鲜办法。</p><h1 id="启用方法">启用方法</h1><p>首先,以管理员身份打开命令提示符或 PowerShell 并输入以下内容。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs powershell">reg add <span class="hljs-string">&quot;HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management&quot;</span> /v FeatureSettingsOverride /t REG_DWORD /d <span class="hljs-number">0</span>x400<br>reg add <span class="hljs-string">&quot;HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management&quot;</span> /v FeatureSettingsOverrideMask /t REG_DWORD /d <span class="hljs-number">0</span>x400<br></code></pre></td></tr></table></figure><p>接下来,重启计算机,重启完成后,以管理员身份运行 PowerShell 并输入以下内容</p><figure class="highlight powershell"><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><code class="hljs powershell"><span class="hljs-built_in">Install-Module</span> <span class="hljs-literal">-Name</span> SpeculationControl<br><span class="hljs-built_in">Set-ExecutionPolicy</span> RemoteSigned<br><span class="hljs-built_in">Import-Module</span> SpeculationControl<br><span class="hljs-built_in">Get-SpeculationControlSettings</span><br></code></pre></td></tr></table></figure><p>安装过程全部回复 Y,完成后,会返回一大堆信息,如果内容与下面一致即说明启用成功。</p><figure class="highlight powershell"><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></pre></td><td class="code"><pre><code class="hljs powershell">Speculation control settings <span class="hljs-keyword">for</span> CVE<span class="hljs-literal">-2017</span><span class="hljs-literal">-5715</span> [<span class="hljs-type">branch</span> <span class="hljs-type">target</span> <span class="hljs-type">injection</span>]<br>Hardware support <span class="hljs-keyword">for</span> branch target injection mitigation is present: True <br>Windows OS support <span class="hljs-keyword">for</span> branch target injection mitigation is present: True<br>Windows OS support <span class="hljs-keyword">for</span> branch target injection mitigation is enabled: True<br>…<br>BTIKernelRetpolineEnabled           : True<br>BTIKernelImportOptimizationEnabled  : True<br></code></pre></td></tr></table></figure><h1 id="参考链接">参考链接</h1><p><a href="https://blog.alyac.co.kr/1479">Google, 성능저하 없이 Spectre 취약점을 패치할 수 있는 Retpoline 공개</a><br><a href="https://techcommunity.microsoft.com/t5/Windows-Kernel-Internals/Mitigating-Spectre-variant-2-with-Retpoline-on-Windows/ba-p/295618">Mitigating Spectre variant 2 with Retpoline on Windows</a><br><a href="https://zh.m.wikipedia.org/wiki/%E5%B9%BD%E7%81%B5%E6%BC%8F%E6%B4%9E">幽灵漏洞</a><br><a href="https://support.google.com/faqs/answer/7625886">Retpoline: a software construct for preventing branch-target-injection</a></p>]]></content>
  949.    
  950.    <summary type="html">
  951.    
  952.      &lt;p&gt;微软在 Windows 10 1809版本引入了 Retpoline 修复补丁。但是却不是默认开启的,本文将会简单的说明 Retpoline ,以及手动启用方法。&lt;/p&gt;
  953.    
  954.    </summary>
  955.    
  956.    
  957.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  958.    
  959.      <category term="Windows" scheme="https://www.wevg.org/categories/Tech/Windows/"/>
  960.    
  961.    
  962.      <category term="Windows" scheme="https://www.wevg.org/tags/Windows/"/>
  963.    
  964.      <category term="Secure" scheme="https://www.wevg.org/tags/Secure/"/>
  965.    
  966.      <category term="Intel" scheme="https://www.wevg.org/tags/Intel/"/>
  967.    
  968.      <category term="System" scheme="https://www.wevg.org/tags/System/"/>
  969.    
  970.      <category term="Google" scheme="https://www.wevg.org/tags/Google/"/>
  971.    
  972.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  973.    
  974.  </entry>
  975.  
  976.  <entry>
  977.    <title>Apex英雄 游戏优化指南</title>
  978.    <link href="https://www.wevg.org/archives/best-optimize-apex/"/>
  979.    <id>https://www.wevg.org/archives/best-optimize-apex/</id>
  980.    <published>2019-02-24T10:03:28.000Z</published>
  981.    <updated>2019-04-01T10:17:22.000Z</updated>
  982.    
  983.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>Apex 英雄是由艺电推出的免费大逃杀类多人在线角色扮演第一人称射击游戏,该游戏自今年2月4日发布时开始,便受到了广大玩家的喜爱。<span id="more"></span></p><p>本教程将会通过修改和优化等等方式提升游戏帧数与稳定性,并降低帧生成时间,进而提升游戏体验。</p><h1 id="apex-游戏优化">Apex 游戏优化</h1><h2 id="配置文件">配置文件</h2><p>请在此处下载下文所需的配置文件<br><strong>下载地址</strong> <a href="https://cloud.wevg.org/Blog/Apex/">https://cloud.wevg.org/Blog/Apex/</a></p><h2 id="第一步:游戏目录外">第一步:游戏目录外</h2><p>首先,打开目录 <code>C:\Users\用户名\Saved Games\Respawn\Apex\local</code><br>此处<strong>需要注意</strong>的是,中文系统会将 <strong>Saved Games</strong> 显示为 <strong>保存的游戏</strong>。</p><p>将上方提供的配置文件 <code>videoconfig.txt</code> ,下载并覆盖此文件夹中现有的同名文件。</p><p><strong>需要注意的以下两点:</strong></p><ol><li>请根据自己的显示器分辨率修改 <strong>videoconfig.txt</strong> 文件中的以下两项(此处以 1920x1080 为例),提供的配置文件已经设置为1920x1080。</li></ol>  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs conf">&quot;setting.defaultres&quot;&quot;1920&quot;<br>&quot;setting.defaultresheight&quot;&quot;1080&quot;<br></code></pre></td></tr></table></figure><ol start="2"><li>配置完成后,请务必将 <strong>videoconfig.txt</strong> 文件设置为 <strong>只读</strong>,否则启动游戏时,修改的内容将会被覆写。</li></ol><p>这个修改主要核心调整参数为&quot;setting.dvs_gpuframetime_min&quot; “6000”,“setting.dvs_gpuframetime_max” “7000”,酌情提升参数则提高画质,降低参数则降低画质。Apex 的默认值 分别为 15000 和 16500。<br>同时&quot;setting.r_lod_switch_scale&quot; &quot;0.4000&quot;建议在0.3至0.5之间调整,默认为0.6</p><blockquote><p><strong>配置文件部分说明</strong><br><strong>&quot;setting.dvs_gpuframetime_min&quot;</strong>  最小帧生成时间<br><strong>&quot;setting.dvs_gpuframetime_max&quot;</strong>  最大帧生成时间<br>降低帧生成时间与输入延迟会显著的提升你所见到的敌人位置的准确性,这个时间/延迟越高,你眼中的敌人与敌人的实际位置之间的偏差就会越大,就会出现明明瞄的很准却打不到敌人的情况.<br>在通常情况下,游戏厂商会通过延长这个时间为手段使游戏看上去更流畅,从而达到看上去优化很好的效果,在硬件条件允许的条件下,我们会牺牲一部分流畅度与清晰度达到更高的准确度,这就是富有竞技性的选择。</p></blockquote><h2 id="第二步:游戏目录内优化">第二步:游戏目录内优化</h2><p>打开游戏安装目录下的 <strong>cfg 文件夹</strong>,(此处以我自己的安装目录为例 <strong>E:\Origin Games\Apex</strong>)<br>将上方我已经制作好的 autoexec.cfg 文件拷贝进去即可。</p><p>为了让游戏能成功读取 autoexec.cfg 文件,<br><strong>请务必配置第三步的启动参数优化!!!</strong></p><blockquote><p><strong>配置文件部分说明</strong><br><strong>cl_forcepreload 0</strong> 关闭预加载,在前些日子被证明会带来负优化,会延长帧生成时间并且可能会出现不可预料的卡顿<br><strong>fps_max 0</strong> 关闭FPS上限,改为999也可以,在CSGO中999的情况下会比0的高,APEX中尚未测试,为了保证稳定,选用0</p></blockquote><p><s><strong>2019-03-28</strong> 近期发现有些情况下会出现无法解除fps帧数限制的问题,正在寻找解决办法,请关注后期更新</s><br><strong>2019.04.12</strong> 此问题已解决</p><h2 id="第三步:启动参数优化">第三步:启动参数优化</h2><p>打开 <strong>Origin</strong>,点击界面左侧的 <strong>游戏库</strong> 找到并右键点击 <strong>Apex</strong> 并打开菜单中的 <strong>游戏属性</strong> 选项。</p><p><img src="https://i.yecdn.com/images/2019/02/24/23bec10b1ef3e591a0c3cd212dd2c4e2.png" alt=""></p><p>点击 <strong>进阶启动选项</strong> 在 <strong>命令行引数</strong> 中 填写以下内容</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs json">+exec autoexec +cl_showfps <span class="hljs-number">4</span> -fullscreen -novid -forcenovsync<br></code></pre></td></tr></table></figure><p>2019.04.12 最近本人在电脑上重新安装 Apex 时发现,有时候会出现在进入游戏的界面未响应(非性能问题),后发现可通过删除启动项中的 <code>-fullscreen</code> 解决此问题,但造成的问题是,进入游戏时为窗口化,目前在寻找解决办法,请关注后期更新~~</p><blockquote><p><strong>部分参数说明</strong><br><strong>+cl_showfps 4</strong> 加号开头的启动项的意思为在游戏开始时会在控制台输入以下指令,后面的意思为在位置4显示FPS等参数(包括当前FPS,帧生成时间等)<br><strong>-fullscreen</strong> 减号开头的启动项意思为只有在启动项中生效的指令 意义为强制全屏<br><strong>-novid</strong>  去除过场动画<br><strong>-forcenovsync</strong> 强制关闭垂直同步</p></blockquote><p><img src="https://i.yecdn.com/images/2019/02/24/2a7f97b707c2cd98f3411128998122e8.png" alt=""></p><h2 id="游戏内设置">游戏内设置</h2><p><strong>可以根据系统配置酌情提高模型细节,特效细节,纹理过滤,纹理串流预算的设置</strong></p><p><img src="https://i.yecdn.com/images/2019/02/24/fcde678689bcb9d06ce81a034d9061a9.png" alt=""></p><p><img src="https://i.yecdn.com/images/2019/02/24/da0e3df1a5cbbea301072e219e40792a.png" alt=""></p><p><img src="https://i.yecdn.com/images/2019/02/24/82634d3ec92773bf2fb6b78b071afb1f.png" alt=""></p><h1 id="win10-xbox-dvr-的关闭及系统设置">WIN10 XBOX DVR 的关闭及系统设置</h1><h2 id="关闭-xbox-dvr">关闭 XBOX DVR</h2><p>首先我们知道,在 Win10 更新了版本后,出现了 Xbox DVR 这个功能且默认开启。本意是为了方便记录游戏时的精彩瞬间,相当于录制截图工具的存在,但是对于 CSGO、DOTA2 这一类游戏却会导致帧数被锁定。</p><p>那么因为 Win10 默认开启此功能,我们要如何关闭呢?</p><p>第一种就是就是登陆微软账户并打开 XBOX 软件<strong>关闭 DVR 滑钮</strong>,这里不做教程。</p><p>第二种就是使用我们提供好的一键关闭 XBOX DVR 脚本,运行并重启电脑后生效。</p><p><strong>2018-10-18</strong> 提供一键关闭 DVR 脚本 <a href="https://cloud.wevg.org/Blog/CS-GO/disableDVR.reg"><strong>点此下载</strong></a></p><figure class="highlight json"><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></pre></td><td class="code"><pre><code class="hljs json">Windows Registry Editor Version <span class="hljs-number">5.00</span><br>[HKEY_CURRENT_USER\System\GameConfigStore]<br><span class="hljs-string">&quot;GameDVR_Enabled&quot;</span>=dword:<span class="hljs-number">0</span><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\GameDVR]<br><span class="hljs-string">&quot;AllowGameDVR&quot;</span>=dword:<span class="hljs-number">0</span><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\ApplicationManagement\AllowGameDVR]<br><span class="hljs-string">&quot;value&quot;</span>=dword:<span class="hljs-number">0</span><br></code></pre></td></tr></table></figure><p>至此,有关 Xbox 的关闭与卸载结束,我们接着说 Windows 系统的一些设置。</p><h2 id="电源设置">电源设置</h2><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css"><p>首先是电源设置,我们右键左下角 <i class="fab fa-windows"> Windows 键,点击<strong>电源选项</strong>。</p><p><img src="https://i.yecdn.com/images/2019/01/05/aab765e1536a6ae2809ef254e728cc69.png" alt="电源选项"></p><p>然后会出现如此界面,这时我们点击<strong>其他电源设置</strong>,会出现电源选项的窗口,如图。</p><p><img src="https://i.yecdn.com/images/2019/01/05/268c520649c26249f5fc0b7dae1d7d29.png" alt="其他电源设置"></p><p><img src="https://i.yecdn.com/images/2019/01/05/5049715d308e274e868c2ea3b3181f93.png" alt="高性能"></p><p>我们直接切换到<strong>高性能</strong>即可,如果没有发现高性能,通常在下方的隐藏附加计划内。</p><p>​值得一提的是,使用一些国产软件的朋友可能会发现默认在使用X大师节能计划,这是很毒瘤很垃圾很差劲的东西,<strong>请务必不要使用!<strong>此类电源计划表面标称能在节能的同时保留完整的性能,但当我们打开编辑选项查看时,发现它直接</strong>将 CPU 限制到75%的状态</strong>,此时就会造成游戏卡顿,帧数低的状况。</p><h2 id="关闭游戏模式">关闭游戏模式</h2><p>​下面要说的是,微软在 Windows 10 版本为1703的创意者更新中首次加入了“游戏模式”这个东西。但当我根据实测(YouTube知名科技频道 LinusTechTips 也做过测试)后发现,这个游戏模式并没有提升甚至有一些负面影响,所以这里教大家如何关闭游戏模式。</p><p>​首先我们进入 <strong>Windows 设置</strong>, 然后点击<strong>游戏</strong>选项,</p><p><img src="https://i.yecdn.com/images/2019/01/05/c71e82371c69db104d21737b20b51615.png" alt="3e7b741244cfa2aca5dda6dbf6807809.png"></p><p><img src="https://i.yecdn.com/images/2019/01/05/7de77b2eb090a1a386b445781a69cd3d.png" alt="79318037469f6c83c315d3bcdc89fc68.png"></p><p>​然后直接切换到<strong>游戏模式</strong>选项并<strong>关闭</strong>开关即可。</p><p>​至此,有关 WIN10 XBOX DVR 的关闭及系统设置章节结束。</p><h2 id="启用-windows-10-卓越性能-可选">启用 Windows 10 卓越性能 (可选)</h2><p>左下角开始菜单点击右键,以管理员方式运行 Powershell,输入以下内容</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs powershell">powercfg <span class="hljs-literal">-duplicatescheme</span> e9a42b02<span class="hljs-literal">-d5df</span><span class="hljs-literal">-448d</span><span class="hljs-literal">-aa00</span><span class="hljs-literal">-03f14749eb61</span><br></code></pre></td></tr></table></figure><p>此时,再打开 <strong>设置</strong> - <strong>系统</strong> - <strong>电源</strong> - <strong>其他电源设置</strong> ,即可在电源计划中看到 <strong>卓越性能</strong> 模式。</p><p><img src="https://i.yecdn.com/images/2019/02/26/8ea26f6b98f55e809904b3286a0b98b6.png" alt=""></p><h2 id="其他杂项设置:">其他杂项设置:</h2><h3 id="在-bios-中禁用-hpet-高精度事件计时器">在 BIOS 中禁用 HPET(高精度事件计时器)</h3><p>​HPET 是现代 Windows 版本中的硬件计时器。由于计时器不断向上计数,它可能会导致中断,让您在玩游戏时感觉“迟钝”。建议您在 BIOS 中禁用它以获得更好的延迟和 FPS!</p><h3 id="在-discord-中禁用硬件加速">在 Discord 中禁用硬件加速</h3><p>如果使用 <strong>Discord overlay</strong> ,请单击齿轮 turn(应用程序设置)&gt; 外观 &gt; 硬件加速关闭硬件加速</p><h1 id="nvidia-显卡驱动内优化">NVIDIA 显卡驱动内优化</h1><p>​Nvidia显卡驱动内的调试相对比较简单,部分选项可能会因为显卡高低端型号,而有差别,但大致一样。</p><p>​首先我们打开 <strong>Nvidia 控制面板</strong>选择<strong>管理 3D 设置</strong>,然后切换到<strong>程序设置</strong>,这样是为了<strong>只修改 Apex英雄 的设置而不影响其他程序</strong>。</p><p><img src="https://i.yecdn.com/images/2019/02/24/45ed1daa8b8ca7e3e245f8d8f724ee7a.png" alt=""></p><p><img src="https://i.yecdn.com/images/2019/02/24/3918f2222847666cd3388a9f425621f6.png" alt=""></p><blockquote><p><strong>配置说明</strong></p></blockquote><ol><li>”CUDA-GPUs” 是使用CUDA流处理器的选择,一般大家都是单显卡,所以默认是<strong>全部</strong>,如果是多卡交火,全部选上就可以了。</li><li>“三重缓冲” : <strong>关闭</strong>。</li><li>“各项异性过滤” : <strong>关闭</strong>。</li><li>“垂直同步” : <strong>关闭</strong>。</li><li>“多帧采样AA(MFAA)” : <strong>关闭</strong>。</li><li>“平滑处理-模式” : 我们选择<strong>应用程序控制</strong>的,这样在游戏里的一些抗锯齿设置就会生效。</li><li>“平滑处理-灰度纠正” : <strong>关闭</strong>。</li><li>“平滑处理-透明度” : <strong>关闭</strong>。</li><li>“最大预渲染帧数” : 是用缓存为GPU储存数据,提高这个值会让低FPS的电脑有更平滑的游戏体验,但是同时会增加一定的输入延迟,所以<strong>推荐调为1</strong>,尤其是当你的电脑FPS较高的情况下。(当然,在游戏卡顿或者FPS较低的情况下可以选择调整为2/3/4)</li><li>“环境光吸收” : <strong>关闭</strong>。</li><li>“电源管理模式” : <strong>最高性能优先</strong></li><li>“着色缓存器” : 开/关<strong>视情况而定</strong>,显卡默认的着色缓存是位于我们的系统盘也就是C盘的。所以如果你的系统盘是固态硬盘(即SSD)打开这个选项将会提升FPS,如果你的系统盘是普通机械硬盘那么建议关闭此选项。(有争议,可以选择自行调试)</li><li>“纹理过滤-三线性优化” : <strong>开启</strong>。</li><li>“纹理过滤-各向异性采样优化” : <strong>开启</strong>。</li><li>“纹理过滤-负LOD偏移” : 此项开启关闭<strong>对游戏无影响</strong>,默认为关闭。</li><li>“纹理过滤-质量” : <strong>高性能</strong>。</li><li>“线程优化” : <strong>开</strong>。</li><li>“虚拟现实预渲染帧数” : <strong>建议调为1</strong>,很显然Apex英雄不是VR游戏,所以没有开高的必要。</li><li>“首选刷新率” : <strong>最高可用/由应用控制的</strong>”</li></ol><h1 id="鼠标灵敏度">鼠标灵敏度</h1><p>因为 Apex 使用的是 Source 起源引擎,所以鼠标灵敏度的计算方法与 CS:GO 完全相同。所以也可以通过此网站进行灵敏度的换算</p><p><a href="https://www.mouse-sensitivity.com/">Mouse Sensitivity | Same Aim - Different Game</a></p><h2 id="关闭鼠标加速度">关闭鼠标加速度</h2><p>在 WIN10 中在搜索里输入控制面板,打开之后打开鼠标</p><p><img src="https://i.yecdn.com/images/2019/02/26/8bd6b031819a495ab3012dda0cafb73f.png" alt="27427a5962eaa383442ace6446b1c643.png"></p><p>像我这样设置,桌面鼠标速度会影响你游戏内的轨迹,速度要在默认档位 6/11,高了会带有加速度,向更低的档位移动没有问题,<strong>提高精准度关闭</strong>。</p><p>​在<strong>轻松访问中心</strong>里将设置确认为这样</p><p><img src="https://i.yecdn.com/images/2019/01/05/2a79e12187d4e7dddb38596d1a72cbd8.png" alt="7e19ee824c920145519572428d197e7d.png"></p><h1 id="参考链接">参考链接</h1><ul><li><a href="https://www.wevg.org/archives/csgo-fps-optimized/">CSGO FPS 终极优化指南</a></li><li><a href="https://www.reddit.com/r/lowendgaming/comments/aq4uhl/apex_legends_maximum_fps_guide_launch_options/">Apex Legends Maximum FPS guide, Launch options, autoexec.cfg, video, Crossfire and SLI settings</a></li><li><a href="https://www.reddit.com/r/apexlegends/comments/ap9cw8/apex_legends_real_fps_boost_tutorial/">Apex Legends Real Fps Boost Tutorial</a></li><li><a href="https://yuba.douyu.com/p/116106401550983009">Apex优化设置</a></li><li><a href="https://www.youtube.com/watch?v=RFcD2lltSNE&amp;feature=youtu.be">Apex Legends TRYHARD Settings Guide - Nvidia, ingame and more!</a></li></ul>]]></content>
  984.    
  985.    <summary type="html">
  986.    
  987.      &lt;p&gt;Apex 英雄是由艺电推出的免费大逃杀类多人在线角色扮演第一人称射击游戏,该游戏自今年2月4日发布时开始,便受到了广大玩家的喜爱。
  988.    
  989.    </summary>
  990.    
  991.    
  992.      <category term="Gaming" scheme="https://www.wevg.org/categories/Gaming/"/>
  993.    
  994.    
  995.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  996.    
  997.      <category term="设置" scheme="https://www.wevg.org/tags/%E8%AE%BE%E7%BD%AE/"/>
  998.    
  999.      <category term="fps" scheme="https://www.wevg.org/tags/fps/"/>
  1000.    
  1001.      <category term="Xbox DVR" scheme="https://www.wevg.org/tags/Xbox-DVR/"/>
  1002.    
  1003.      <category term="Nvidia" scheme="https://www.wevg.org/tags/Nvidia/"/>
  1004.    
  1005.      <category term="启动项" scheme="https://www.wevg.org/tags/%E5%90%AF%E5%8A%A8%E9%A1%B9/"/>
  1006.    
  1007.      <category term="Origin" scheme="https://www.wevg.org/tags/Origin/"/>
  1008.    
  1009.      <category term="Apex" scheme="https://www.wevg.org/tags/Apex/"/>
  1010.    
  1011.  </entry>
  1012.  
  1013.  <entry>
  1014.    <title>获取 Steam 游戏图标文件方法</title>
  1015.    <link href="https://www.wevg.org/archives/get-steam-game-icon/"/>
  1016.    <id>https://www.wevg.org/archives/get-steam-game-icon/</id>
  1017.    <published>2019-02-21T02:41:10.000Z</published>
  1018.    <updated>2019-03-12T15:00:00.000Z</updated>
  1019.    
  1020.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>前两天偶尔发现了获取已安装游戏图标的方法,本文将带你获取 Steam 游戏的原始 ico 图标。</p><span id="more"></span><h1 id="说明">说明</h1><p>目前此方法仅限于 Windows,且想要获取图标的游戏已经安装(其实是没在其它系统下测试 つ﹏⊂ )。本文将以64位Windows,Steam 安装在默认位置的情况下进行说明。(而且感觉现在用32位的系统的似乎也不多了的说)</p><h1 id="获取方法">获取方法</h1><p>打开 Steam 默认安装位置 <code>C:\Program Files (x86)\Steam</code></p><p>找到默认安装目录下的 <code>steam\games</code> 目录,打开即可获得游戏的原始 ico 图标</p><p><img src="https://i.yecdn.com/images/2019/02/21/284779ccbd9f15ac2702fa5c158266b3.png" alt=""></p>]]></content>
  1021.    
  1022.    <summary type="html">
  1023.    
  1024.      &lt;p&gt;前两天偶尔发现了获取已安装游戏图标的方法,本文将带你获取 Steam 游戏的原始 ico 图标。&lt;/p&gt;
  1025.    
  1026.    </summary>
  1027.    
  1028.    
  1029.      <category term="Gaming" scheme="https://www.wevg.org/categories/Gaming/"/>
  1030.    
  1031.    
  1032.      <category term="设置" scheme="https://www.wevg.org/tags/%E8%AE%BE%E7%BD%AE/"/>
  1033.    
  1034.      <category term="Steam" scheme="https://www.wevg.org/tags/Steam/"/>
  1035.    
  1036.      <category term="图标" scheme="https://www.wevg.org/tags/%E5%9B%BE%E6%A0%87/"/>
  1037.    
  1038.  </entry>
  1039.  
  1040.  <entry>
  1041.    <title>TeamSpeak3 使用指南 (新手向)</title>
  1042.    <link href="https://www.wevg.org/archives/how-to-use-teamspeak3/"/>
  1043.    <id>https://www.wevg.org/archives/how-to-use-teamspeak3/</id>
  1044.    <published>2019-02-19T15:52:24.000Z</published>
  1045.    <updated>2022-08-14T15:33:30.000Z</updated>
  1046.    
  1047.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>本文将带您了解什么是 TeamSpeak,简单对比它与其它语音软件的区别以及 TeamSpeak 的使用方法。</p><span id="more"></span><h1 id="什么是-teamspeak">什么是 TeamSpeak</h1><p>首先,先引用一下我曾经在 <a href="https://www.wevg.org/archives/teamspeak-server-build/">TeamSpeak 服务器搭建方法</a> 中的简介。</p><blockquote><p>TeamSpeak (简称TS) 是一套专有的VoIP软件,使用者可以用耳机和麦克风,通过客户端软件连线到指定的服务器,与在服务器内频道的其他使用者进行通话。是一种很像电话会议的方式。 通常 TeamSpeak 的使用者大多为多人连线游戏的玩家,与同队伍的玩家进行通讯。在游戏的对战方面,语音对话通讯具有竞争优势。</p></blockquote><p>简单来说,就是一款语音软件,那么有的人可能会问了,那我为什么不直接使用游戏内的语音软件,或者其他的,例如 Discord 或者 YY语音呢?</p><h1 id="为什么我们使用-teamspeak">为什么我们使用 TeamSpeak</h1><h2 id="为什么不用-yy-语音">为什么不用 YY 语音</h2><p>首先,先说一下广告方面,用过 YY 的用户可能都知道上面满屏幕的广告,但是 TeamSpeak 和 Discord 并没有广告。</p><p>其次,捆绑软件方面,Discord没有捆绑, TeamSpeak 在安装时会询问是否安装 Overwolf (可选项,此软件为游戏内覆盖层,可在游戏内查看当前说话的用户),而安装 YY 后,同时会捆绑 YY浏览器等软件。<br>第三,YY 并不支持感应麦,即达到一定分贝才会录入。<br>另外,不知道是否还有人记得,在17年年底的某会期间,YY屏蔽了海外用户的登陆。这一条也是我的一部分朋友转战 TeamSpeak 的原因。</p><p><strong>2019-02-24</strong>  根据朋友的提示,YY 不支持感应麦,而且按键麦经常失灵,所以很多情况下只能使用自由麦。</p><h2 id="为什么不用-discord">为什么不用 Discord</h2><p>这个原因很简单,被墙了,国内的小伙伴上不了,而且一般情况下,连接服务器后,延迟方面的问题也比较严重,我们也自然只能 Pass 掉它了。</p><h2 id="为什么使用-teamspeak">为什么使用 TeamSpeak</h2><p>首先 TeamSpeak 没有广告,没有捆绑软件,和 Discord 一样支持游戏内覆盖层,也可以单独调节每个用户的音量大小等等等等。至于服务器方面,TeamSpeak 的服务器一般都是自行租赁或架设的。<br>除此之外,在系统占用,语音质量,语音延迟方面,也完胜Discord 和 YY。如果您想的话,甚至可以在自己的内网搭建一台 TeamSpeak 服务器。</p><h1 id="使用方法">使用方法</h1><p>下面来说说使用方法,此处会从安装开始说起,以方便新用户进行使用。</p><blockquote><p><strong>请务必不要某国内公司制作的中文翻译版,该版本过旧,无法登陆现有的大部分 TeamSpeak 服务器</strong><br>更多详情可以查看 <a href="https://ts.wevg.org/why-not-ts1-cn/">为何不要使用 ts1.cn</a> 我在该文中详细解释了为何不要使用 <a href="http://ts1.cn">ts1.cn</a> 的服务</p></blockquote><p>第一步,下载 TeamSpeak 此处可以前往 TeamSpeak 官网 <a href="https://teamspeak.com">teamspeak.com</a> 进行下载,也可以通过我的转存地址进行下载,解决国内在官网下载速度过慢的问题<br>转存地址 <a href="https://ts.wevg.org/download/">https://ts.wevg.org/download/</a></p><p>安装过程不需要过多的解释,一直往下就可以</p><blockquote><p>其中 Overwolf 安装后,正如我上面所说的,可以在游戏内显示当前说话的用户,得知哪位用户进入/离开了当前频道等等…</p></blockquote><p><img src="https://i.yecdn.com/images/2019/02/20/644ca90fc1d9308fd6f57cd0f418c72a.png" alt=""></p><p>安装完成后,打开 TeamSpeak ,会提示登录 myTeamSpeak 账号。(可选是否登录,个人建议登录一下)</p><blockquote><p>myTeamSpeak 账号的用途是同步书签,身份和配置等信息,比如在语音服务器获取的权限等等。</p></blockquote><h2 id="连接至服务器">连接至服务器</h2><p>点击主界面上面的 <code>Connection</code> - <code>Connect</code>,在 <code>Server Nickname or Address</code> 位置输入服务器地址, <code>Nickname</code> 位置输入昵称后,点击 <code>Connect</code> 即可。<br>也可在安装中文语言包后进行操作。</p><p>我们的 TeamSpeak 服务器地址 <a href="https://teamspeak.app/">teamspeak.app</a></p><p>点此查看我们的 TeamSpeak <a href="https://teamspeak.app/">服务及相关信息</a></p><p><img src="https://static.hit.moe/images/2022-08-15-15-32-Fhz1R.jpeg" alt=""></p><h1 id="teamspeak-中文语言包">TeamSpeak 中文语言包</h1><p>目前,我正在和寂听联手制作中文语言包,到目前为止,还处于早期阶段,但是基本界面的翻译基本完成,所以也可以拿来直接使用。<br>下载地址 <a href="https://github.com/VigorousPro/TS3-Translation_zh-CN/releases">https://github.com/VigorousPro/TS3-Translation_zh-CN/releases</a></p><p>下载 Chinese_Translation_zh-CN.ts3_translation 并按照提示进行安装即可。</p><p><img src="https://static.hit.moe/images/2022-08-15-15-29-WUgCd.jpeg" alt=""></p><h1 id="常见问题">常见问题</h1><blockquote><p>以下内容的中文翻译将会尽量与上方最新版中文语言包相同</p></blockquote><h2 id="q1-设置感应麦">Q1 设置感应麦</h2><p>点击 <code>工具(Tools)</code> ,打开 <code>设置(Options)</code> 菜单目录 ,选择 <code>音频输入(Capture)</code> 选项卡。<br>可以在右侧的 配置(Profile) 中看到 语音感应激活(Capture Voice Activation)选项,模式选择 <code>Volume Gate</code>。</p><p>下方的滑杆代表灵敏度,您可以通过 点击 <code>开始测试(Begin test)</code> 进行测试。<br>一般情况下,推荐打开下方的<strong>回声抑制(Echo reduction)</strong> <strong>回声消除(Echo cancellation)</strong> 以及 <strong>高级选项(Advanced Options)</strong>,但具体请根据个人情况及设备的不同,自行判断。</p><h2 id="q1-1-说话别人只能听到后半句-录入过多杂音">Q1.1 说话别人只能听到后半句 / 录入过多杂音</h2><p>一般此情况为灵敏度配置不当导致的。<br>通过调节 Q1 中提到的滑杆,滑杆越往左越灵敏,不断地测试,找到适合自己的灵敏度即可解决此问题。</p><h2 id="q2-使用-teamviewer-时-teamspeak-声音变小的问题">Q2 使用 TeamViewer 时 TeamSpeak 声音变小的问题</h2><p>不得不说,这个问题,确实困扰了我很久,直到前几天,偶然发现了解决问题的办法</p><blockquote><p>2020-03-27 Windows 更新之后位置有了些许变化<br>首先,右键点击任务栏的<strong>声音</strong> - <strong>打开声音设置</strong></p></blockquote><p><img src="https://i.yecdn.com/images/2020/03/27/11c45ed06c3f0f74ff913c526362f5df.png" alt=""></p><p>点击右侧的 <strong>声音控制面板</strong></p><p><img src="https://i.yecdn.com/images/2020/03/27/b596cfe52771c9117bb33a06174d571b.png" alt=""></p><p>然后点击<strong>通信</strong>选项卡,将系统默认的&quot; <strong>将其他声音的音量减小到80%</strong> &quot; 修改为 <strong>不执行任何操作</strong>,即可完美解决声音变小的问题</p><p><img src="https://i.yecdn.com/images/2019/01/05/537638065bc87a7102e35eb04717771b.png" alt="b7f36784197be0b2b10c328b9d5921ba.png"></p><blockquote><p>低版本 Windows 系统可以参考下面的部分<br>首先,右键点击任务栏的<strong>声音</strong> - 声音</p></blockquote><p><img src="https://i.yecdn.com/images/2019/01/05/201b8cd093ebc341cee6e9c8313ad756.png" alt="04bd256693edca3803b015a37046b434.png"></p><p>然后点击<strong>通信</strong>选项卡,将系统默认的&quot;将其他声音的音量减小到80%&quot; 修改为不执行任何操作,即可完美解决声音变小的问题</p><p><img src="https://i.yecdn.com/images/2019/01/05/537638065bc87a7102e35eb04717771b.png" alt="b7f36784197be0b2b10c328b9d5921ba.png"></p><h2 id="q3-如何同时连接多台-ts-服务器">Q3 如何同时连接多台 TS 服务器</h2><p>在连接服务器时点击 <code>在新的标签页中</code> 即可同时连接多台 TS 服务器。</p><h2 id="q4-对于-teamspeak-许可证的问题">Q4 对于 TeamSpeak 许可证的问题</h2><p>官方现在在对许可证进行调整,不过可以确定的是,日后非盈利许可证(Non-Profit License) 无法再次申请。<br>相关说明可查看我之前发布的 <a href="https://www.wevg.org/archives/teamspeak-server-build/">TeamSpeak 服务器搭建方法</a></p><h2 id="q5-如何使用权限密钥">Q5 如何使用权限密钥</h2><ol><li>打开权限密钥窗口</li></ol><p>在顶部菜单中选择 <code>权限(Permission)</code> ,点击 <code>使用权限密钥(Use Privilege key)</code> 选项。</p><ol start="2"><li>输入密钥即可</li></ol><h2 id="q6-创建或编辑书签">Q6 创建或编辑书签</h2><ol><li><strong>打开书签</strong></li></ol><p>在 TeamSpeak 的左上角,单击 <code>书签(Bookmarks)</code> 菜单,然后单击 <code>管理书签(Manage Bookmarks)</code> 选项。</p><p><img src="https://i.yecdn.com/images/2019/04/15/d817c32fcc36dd537c1f465b9818b836.png" alt=""></p><ol start="2"><li><strong>添加书签</strong></li></ol><p>在书签窗口中,请单击 <code>新增书签</code> 或在空白处点击右键,即可<strong>新建书签</strong>。</p><p><img src="https://i.yecdn.com/images/2019/04/15/ab297f649859015457d76268827b6759.png" alt=""></p><ol start="3"><li><strong>编辑书签</strong></li></ol><p>单击刚刚创建的新书签或要编辑的书签。填写 <strong>书签名</strong>,<strong>服务器地址</strong>,<strong>昵称</strong>和<strong>服务器密码</strong>(如果需要)。然后单击<strong>确定</strong>即可。</p><ol start="4"><li><strong>快速添加书签</strong></li></ol><p>连接服务器后,点击 <code>书签(Bookmarks)</code> 菜单,然后单击 <code>添加到书签(Add to Bookmarks)</code> 选项即可。</p><h2 id="此列表将会不定期更新">此列表将会不定期更新</h2>]]></content>
  1048.    
  1049.    <summary type="html">
  1050.    
  1051.      &lt;p&gt;本文将带您了解什么是 TeamSpeak,简单对比它与其它语音软件的区别以及 TeamSpeak 的使用方法。&lt;/p&gt;
  1052.    
  1053.    </summary>
  1054.    
  1055.    
  1056.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  1057.    
  1058.    
  1059.      <category term="服务器" scheme="https://www.wevg.org/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
  1060.    
  1061.      <category term="VoIP" scheme="https://www.wevg.org/tags/VoIP/"/>
  1062.    
  1063.      <category term="语音" scheme="https://www.wevg.org/tags/%E8%AF%AD%E9%9F%B3/"/>
  1064.    
  1065.  </entry>
  1066.  
  1067.  <entry>
  1068.    <title>如何解决 Origin 下载速度慢的问题</title>
  1069.    <link href="https://www.wevg.org/archives/speed-up-origin-download/"/>
  1070.    <id>https://www.wevg.org/archives/speed-up-origin-download/</id>
  1071.    <published>2019-02-19T15:51:34.000Z</published>
  1072.    <updated>2020-04-25T12:34:54.000Z</updated>
  1073.    
  1074.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>本文旨在解决通过 Origin 下载游戏速度慢的问题。一般情况下,国内大部分用户自动分配的 CDN 是 Origin 的 Level3 的CDN,一般情况下,这也是造成下载速度缓慢的主要原因。</p><span id="more"></span><h1 id="修改配置文件方式">修改配置文件方式</h1><h2 id="手动修改">手动修改</h2><p>通过此方法,将 CDN 手动设定为 Akamai</p><ol><li>打开 Origin 安装目录,此文也将以默认安装位置为例。(默认安装位置 <code>C:\Program Files (x86)\Origin</code>)</li></ol><p><img src="https://i.yecdn.com/images/2019/02/20/0d86c6b5fc151bd8b157bc736a32a4fb.png" alt=""></p><ol start="2"><li>打开目录下的 <code>EACore.ini</code> 文件,如果没有,手动创建一个即可。<br>在文件中输入以下内容</li></ol><figure class="highlight ini"><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><code class="hljs ini"><span class="hljs-section">[Connection]</span><br><span class="hljs-attr">EnvironmentName</span>=production <br><span class="hljs-section">[Feature]</span><br><span class="hljs-attr">CdnOverride</span>=akamai<br></code></pre></td></tr></table></figure><p>保存,并运行 Origin 。登陆后,右上角显示 <code>[R&amp;D mode] Production</code> 即表示配置成功。</p><p><img src="https://i.yecdn.com/images/2019/02/20/b48180e7277bc91d7d0201da453a15a6.png" alt=""></p><h2 id="软件修改">软件修改</h2><p>也可以通过使用 Dogfight360 大佬制作的 Origin 游戏下载CDN切换 进行修改配置。通过此方法配置时,如果您已经使用上方的手动方式修改了 <code>EACore.ini</code> 文件,那么删除该文件即可。<br>转存地址 <a href="https://go.uv.uy/nIrut">https://go.uv.uy/nIrut</a><br>作者原下载地址 <a href="https://go.uv.uy/EYU6G">https://go.uv.uy/EYU6G</a></p><p><img src="https://i.yecdn.com/images/2019/02/20/f6fc795c3ae23b9ac4f14c2cae4878a5.png" alt=""></p><h1 id="修改-host-方式">修改 Host 方式</h1><p>此处同样推荐使用 Dogfight360 大佬制作的 UsbEAm Hosts Editor (多平台hosts修改工具)<br>此工具可以获取相应地址的网络延迟<br>此部分可以查看作者发布在SteamCN的帖子,地址会放在下方<br>转存地址 <a href="https://go.uv.uy/fnUc6">https://go.uv.uy/fnUc6</a><br>作者原下载地址 <a href="https://go.uv.uy/wlxzR">https://go.uv.uy/wlxzR</a></p><p><img src="https://i.yecdn.com/images/2019/02/20/0926248e4d059308722d87e9f6e6c3ae.png" alt=""></p><h1 id="参考链接">参考链接</h1><ul><li><p><a href="https://steamcn.com/t256816-1-1">UsbEAm Hosts Editor [多平台hosts修改] V3.45</a></p></li><li><p><a href="https://www.dogfight360.com/blog/741/">Origin 游戏下载CDN切换</a></p></li><li><p><a href="http://battlelog.battlefield.com/bf4/forum/threadview/2955064773334812316/">Origin slow download fix (R&amp;D mode)</a></p></li><li><p><a href="https://answers.ea.com/t5/Origin-Client-Web-Technical/why-are-the-download-speeds-extremely-slow-on-origin/td-p/6319970">why are the download speeds extremely slow on origin?</a></p></li></ul>]]></content>
  1075.    
  1076.    <summary type="html">
  1077.    
  1078.      &lt;p&gt;本文旨在解决通过 Origin 下载游戏速度慢的问题。一般情况下,国内大部分用户自动分配的 CDN 是 Origin 的 Level3 的CDN,一般情况下,这也是造成下载速度缓慢的主要原因。&lt;/p&gt;
  1079.    
  1080.    </summary>
  1081.    
  1082.    
  1083.      <category term="Gaming" scheme="https://www.wevg.org/categories/Gaming/"/>
  1084.    
  1085.    
  1086.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  1087.    
  1088.      <category term="设置" scheme="https://www.wevg.org/tags/%E8%AE%BE%E7%BD%AE/"/>
  1089.    
  1090.      <category term="Origin" scheme="https://www.wevg.org/tags/Origin/"/>
  1091.    
  1092.  </entry>
  1093.  
  1094.  <entry>
  1095.    <title>解决Win10系统更新后VMware不兼容的问题</title>
  1096.    <link href="https://www.wevg.org/archives/turn-off-cg-dg/"/>
  1097.    <id>https://www.wevg.org/archives/turn-off-cg-dg/</id>
  1098.    <published>2019-01-30T02:38:28.000Z</published>
  1099.    <updated>2019-03-12T15:00:00.000Z</updated>
  1100.    
  1101.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>在更新了Win10系统之后便遇到了这个问题,BIOS 里面的虚拟化也打开了,也检查了Device Guard的设置,但是始终提示这个,最后终于找到了解决办法。<span id="more"></span></p><p><img src="https://i.yecdn.com/images/2019/01/29/6999631c1f7b104c3e1d09bb64f3e24d.png" alt="6999631c1f7b104c3e1d09bb64f3e24d.png"></p><h1 id="解决办法">解决办法</h1><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs powershell">bcdedit /<span class="hljs-built_in">set</span> hypervisorlaunchtype off<br></code></pre></td></tr></table></figure><p>以管理员身份运行 Powershell 或者命令提示符后,输入此命令并重启后即可</p><h1 id="参考文章">参考文章</h1><p><a href="https://kb.vmware.com/s/article/2146361">Powering on a vm in VMware Workstation on Windows 10 host where Credential Guard/Device Guard is enabled fails with BSOD (2146361)</a><br><a href="https://kb.vmware.com/s/article/2146361?lang=zh_CN">在启用了 Credential Guard 或 Device Guard 的 Windows 10 主机上运行 Workstation 失败 (2146361)</a><br><a href="https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-manage">Manage Windows Defender Credential Guard</a><br><a href="https://blog.minirplus.com/10268/">解决Windows10运行VMware Workstation出现与Device Guard不兼容导致无法运行与创建虚拟机问题</a></p>]]></content>
  1102.    
  1103.    <summary type="html">
  1104.    
  1105.      &lt;p&gt;在更新了Win10系统之后便遇到了这个问题,BIOS 里面的虚拟化也打开了,也检查了Device Guard的设置,但是始终提示这个,最后终于找到了解决办法。
  1106.    
  1107.    </summary>
  1108.    
  1109.    
  1110.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  1111.    
  1112.      <category term="Windows" scheme="https://www.wevg.org/categories/Tech/Windows/"/>
  1113.    
  1114.    
  1115.      <category term="Windows" scheme="https://www.wevg.org/tags/Windows/"/>
  1116.    
  1117.      <category term="Virtual" scheme="https://www.wevg.org/tags/Virtual/"/>
  1118.    
  1119.      <category term="VMware" scheme="https://www.wevg.org/tags/VMware/"/>
  1120.    
  1121.  </entry>
  1122.  
  1123.  <entry>
  1124.    <title>2018 年终总结(重制版)</title>
  1125.    <link href="https://www.wevg.org/archives/thanks-2018/"/>
  1126.    <id>https://www.wevg.org/archives/thanks-2018/</id>
  1127.    <published>2018-12-31T04:22:32.000Z</published>
  1128.    <updated>2019-03-12T15:00:00.000Z</updated>
  1129.    
  1130.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>不得不说,时间真的很快,转眼间,2018年马上就要结束了,感觉也是时候,该记录一下这一年了<span id="more"></span>,小的时候,总感觉时间过的很慢,期望长大,而现在,却又感觉时间飞快,希望时间可以慢一点,时间推着我们不断地向前走,这一年间,我认识了很多人,也与很多人擦肩而过,结识了很多朋友,也和很多的朋友为了各自美好的明天,为了以后更好的相遇,不得不分别。</p><p>今天是2018年12月31号,今天结束后,意味着00后也已经成年,我也即将要结束我的大学生活了…</p><p>本来是写了一篇的,结果看来各位大佬写的总结之后,感觉自己的太水了,就按照大佬们的形式重新写了一下~ (捂脸つ﹏⊂</p>    <div id="aplayer-jqxqLxin" class="aplayer aplayer-tag-marker meting-tag-marker"         data-id="22682066" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86"    ></div><h1 id="过往">过往</h1><p>2018 年上半年,基本一直都忙于学习和打工,另外上半年也终于考过了 TOPIK 考试。</p><p>大概今年最难忘的时间还是要从7月份开始,6月份结束了打工的工作之后,收到 Inter 的邮件,得知我中了 i7-8086K 的奖,当然拿到奖品艰辛复杂,这又是另一个故事了。(这个邮件任谁第一眼看到也会以为是SPAM的把???)</p><p><img src="https://i.yecdn.com/images/2019/01/05/6f715dedc6fc0bb006995d979d09c873.png" alt=""></p><p>7月初,参加了学校为期一个月的菲律宾语言交流项目。在那里结交了好多的新朋友,Aki, Evan, Macho, Kerry,Frog,Crystal,光阳,小白…在菲律宾的一个月,真的给我留下了很多珍贵的记忆。8月初,先是土豪大佬的陪伴下(舔啊舔啊舔<sub>),游了一圈杭州和台州。然后面基了Bily。在回韩国前,又故地重游了一番大连,本想和Aki再一起面基一下,奈何国内开学早啊</sub> 面基失败</p><p>9月份开学之后的某一天,偶然看到<a href="https://blog.skk.moe/">苏卡卡大佬</a>的主题 Suka ,再加上当时博客文章混杂,所以萌生了修改的想法,把博客从 WordPress 换到了现在的 Hexo 。</p><p>12月份,放假后,和朋友去老挝玩了一圈,又顺利通过了 TBS 的面试。</p><h1 id="网站">网站</h1><ul><li>博客从 Wordpress 换成 Hexo</li><li>年初,主题从 <a href="https://github.com/Vtrois/Kratos">Vtrois</a> 维护的 Kratos 更换到 <a href="https://milkice.me/">奶子冰</a> 维护的版本</li><li>主题更换成现在苏卡卡大佬的 Suka 主题</li><li>开放 <a href="http://UV.UY">UV.UY</a> 短域名网站的注册</li><li>网站转为 Serverless ,然后又改了回去 (开倒车???</li><li>12月初,ICP 备案被莫名撤销</li></ul><h1 id="friends">Friends</h1><p>年初,加到了大佬<a href="https://www.iwch.me/">小浩</a> 创建的TG群,认识了群里的一群大佬,有<a href="https://www.iwch.me/">大佬小浩</a>,<a href="https://milkice.me/">大佬奶子冰</a>,大佬小黄蜂,<a href="https://see.wtf/gay">大佬 Eleplover</a>,<a href="https://blog.lwl12.com/">大佬LWL</a>,<a href="https://blog.skk.moe/">大佬苏卡卡</a>,<a href="https://dcc.cat/">大佬呼呼呼</a>,<a href="https://flyhigher.top/">大佬 Axton</a>,<a href="https://liyin.date">大佬立音</a>,<a href="https://i-meto.com/">大佬 Meto</a>,<a href="https://blog.indexyz.me/">大佬 Indexyz</a>,<a href="https://kn007.net/">大佬kn007</a>,<a href="https://never.pet/">大佬NB</a>,等等等等。。。。大佬们总是假装自己很菜,在此真心感谢群里的各位大佬们~</p><p>另外,今年结束就已经和江南,川,叶子,点点,江南,共情,周周,Alo,麦咂…他们认识五年多了,时间真的很快,转眼我们已经认识了这么长的时间,愿大家2019年,一切顺心,一切安好。</p><h1 id="最后">最后</h1><p>首先,谢谢各位能看我的流水账看到现在,最近感觉自己的中文水平真的是有在下降,祝大家新年快乐,2019年心想事成,万事如意,即将高考的各位,考上理想的大学,即将毕业的各位,能学有所成。</p>]]></content>
  1131.    
  1132.    <summary type="html">
  1133.    
  1134.      &lt;p&gt;不得不说,时间真的很快,转眼间,2018年马上就要结束了,感觉也是时候,该记录一下这一年了
  1135.    
  1136.    </summary>
  1137.    
  1138.    
  1139.      <category term="Other" scheme="https://www.wevg.org/categories/Other/"/>
  1140.    
  1141.    
  1142.  </entry>
  1143.  
  1144.  <entry>
  1145.    <title>导入网易云音乐歌单到 Apple Music</title>
  1146.    <link href="https://www.wevg.org/archives/netease-to-apple-music/"/>
  1147.    <id>https://www.wevg.org/archives/netease-to-apple-music/</id>
  1148.    <published>2018-12-25T10:55:53.000Z</published>
  1149.    <updated>2020-04-25T12:35:19.000Z</updated>
  1150.    
  1151.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>虽然我换到Apple Music 已经快一年多了,不过一直有一些歌单没导过来,前一阵因为之前使用的代理方式失效,自己也突然感觉是时候该把网易云上面的歌单转过来了,便搜集到了一些方法,也算是成功的把歌单给导出来了。<span id="more"></span></p><p>我现在在使用的美区的 Apple Music 直接有使用国大概一年多的国区 Apple Music 但是因为曲库不在一个数量级,前不久转到了美区,据之前的官方数据,美区是5000万,国区是300万,现在页面改版后,没有歌曲数量的介绍了,所以记忆可能有所偏差(报道出现偏差将来要负责的! )</p><p>总之,就是在使用的时候总是感觉想听的歌没有,再加上国区归云上贵州了,就在前一阵转到美区了</p><blockquote><p>2019-11-16 更新使用 TuneMyMusic 导入方式</p></blockquote><p>下面是我使用过的三种方法:</p><h1 id="使用-workflow-同步">使用 Workflow 同步</h1><p>这个是我最早使用的方法,这个办法因为年久失修,匹配精度低或者匹配不到、无法增量同步、无法双向同步。<strong>但是</strong>,不可否认的是这个方法<strong>操作简单</strong>,在某些场景下,还是有用的。</p><ul><li>上手难度 ★☆☆☆☆</li><li>同步速度 ★★★☆☆</li><li>匹配精度 ★★★☆☆</li></ul><p>先将 Workflow 链接放到这里: <a href="https://workflow.is/workflows/30843bb380f84db8be3c46f5ff00f407">网易云音乐➡️ Apple Music</a>。</p><ol><li>使用时在网易云音乐客户端里复制歌单分享链接,然后运行这个 Workflow。</li></ol><h1 id="使用-tunemymusic-导入-推荐">使用 TuneMyMusic 导入 (推荐)</h1><p>这个方法是一个大佬在我的博客上评论的,但因为当时操作失误,丢失了评论,最近找到了评论但是在想办法恢复之前的评论。相对于我之前<strong>使用油猴脚本迁移</strong>的方式,更加简洁</p><p>打开 <a href="https://yyrcd.com/2018/11/14/n2s-zh/">https://yyrcd.com/2018/11/14/n2s-zh/</a>, 填入 网易云歌单的 ID。假如歌单地址是 <code>https://music.163.com/#/playlist?id=2651036663</code> ,那么便填写 <code>2651036663</code></p><p>接下来点击 <kbd>Search</kbd> ,会显示歌单列表,然后复制生成的文字版歌单</p><p><img src="https://i.yecdn.com/images/2019/11/15/5b4201f23d6ea58f2d1acce9a493df1c.png" alt="5b4201f23d6ea58f2d1acce9a493df1c.png"></p><p>导出歌单后,打开 TuneMyMusic 网站 <a href="https://www.tunemymusic.com/zh-cn/">https://www.tunemymusic.com/zh-cn/</a></p><p>导入来源选择 <strong>从文本</strong> ,目的地选择 <strong>Apple Music</strong> 即可<img src="https://i.yecdn.com/images/2019/01/05/c2fef1211087f3d8c6f94f9a7eda2086.png" alt=""></p><p>接下来,按照网页的提示进行操作即可. 此方法支援的平台有 Spotify, Apple Music, Youtube, Youtube Music, Deezer, Tidal, SoundCloud, KKbox, napster 和 SoundMachine</p><blockquote><p><strong>请注意,每次最多可导入1000首歌曲</strong></p></blockquote><h2 id="利用油猴脚本迁移">利用油猴脚本迁移</h2><blockquote><p>使用前一种方式更为便捷(<a href="/archives/netease-to-apple-music/#%E4%BD%BF%E7%94%A8-tunemymusic-%E5%AF%BC%E5%85%A5">使用 TuneMyMusic 导入</a>)</p></blockquote><p>这个是我无意在B站上发现的文章,现在不知为何,此文章连接打开自动跳转error,这个方法和后面的方法相比提高导入速度,降低了上手难度,而且支持的平台很多,包括 Apple Music, Spotify, Youtube, Deezer, Tidal, Pandora, Napster,但是不可避免的仍然会有部分歌曲导入失败,或者说匹配精度不足。</p><ul><li>上手难度 ★★☆☆☆</li><li>同步速度 ★★★★☆</li><li>匹配精度 ★★★★☆</li></ul><p>需要的程序:</p><ul><li>浏览器(Chrome,Firefox,Edge,Safari等)</li><li>Tampermonkey 插件 (下文简称油猴)</li></ul><p>第一步,安装 油猴脚本 <a href="https://go.uv.uy/Eud9p">https://go.uv.uy/Eud9p</a></p><blockquote><p>进行此步骤前,请确保已安装 Tampermonkey 插件</p></blockquote><blockquote><p>请注意,现在该脚本已停止维护。</p></blockquote><p><img src="https://i.yecdn.com/images/2019/01/05/6851f96024b99a5cb6fbc819bb549f30.png" alt=""></p><p>在浏览器中打开歌单的分享链接,会看到一个 <strong>导出歌单</strong> 的按钮, 点击后便可以获得当前歌单的txt列表</p><p><img src="https://i.yecdn.com/images/2019/06/04/52d14da6add859ab755466bb33b7af78.png" alt=""></p><p>如果 <strong>导出歌单</strong> 的按钮没有显示,有可能有插件或脚本与之<strong>发生冲突</strong>,也可以尝试<strong>重启插件</strong></p><p>导出歌单后,打开 TuneMyMusic 网站 <a href="https://www.tunemymusic.com/zh-cn/">https://www.tunemymusic.com/zh-cn/</a></p><p>导入来源选择 <strong>从文本</strong> ,目的地选择 <strong>Apple Music</strong> 即可<img src="https://i.yecdn.com/images/2019/01/05/c2fef1211087f3d8c6f94f9a7eda2086.png" alt=""></p><p>接下来,按照网页的提示进行操作即可.</p><blockquote><p><strong>请注意,每次最多可导入1000首歌曲</strong></p></blockquote><h1 id="利用-itunes-来导入网易云音乐歌单到-apple-music">利用 iTunes 来导入网易云音乐歌单到 Apple Music</h1><p>这个是我使用过的第二个迁移方式,优点是这个方法<strong>不存在</strong>匹配精度低或者匹配不到的问题,并且算是提供了一种增量同步的方法。缺点是相对前两种方式,更为耗时且无法迁移仅会员可以下载的歌曲。</p><ul><li>上手难度 ★★★★☆</li><li>同步速度 ★★☆☆☆</li><li>匹配精度 ★★★★★</li></ul><p>因为此步骤比较复杂 (个人认为),所以直接把主要部分摘了过来</p><p>此部分的环境是 Windows 10 + iTunes 12.7 for PC + 网易云音乐 2.2.3 for PC。某些功能需要 Windows 环境,但有移植到其它平台的潜力,未测试其它版本的 iTunes 与网易云音乐客户端。</p><h2 id="itunes-导入导出播放列表">iTunes 导入导出播放列表</h2><p>这俩功能是 iTunes 自带的,选中某播放列表,点击 文件 - 资料库 就能看到这两个功能。</p><p><img src="https://i.yecdn.com/images/2019/01/05/f407d11b0ef4c83e35cf0b35d4c25563.png" alt="导入导出播放列表"></p><p>打开导出的 txt 文件,是一堆格式化的信息。txt 看起来会比较杂乱,你可以全选内容,复制,打开一个空的 Excel 表格,直接粘贴,这样方便查看格式化的内容。</p><p><img src="https://i.yecdn.com/images/2019/01/05/e4fcb3f65cf292ced003a46429c89b50.png" alt="导出的内容"></p><p>很明白了,第一行是表头,可见数据非常详细。下面就是播放列表中每首曲子的具体信息。用这些数据可以做不少文章,不过目前关注最后一项:「位置」,展示了本首曲子的音乐文件在磁盘上的路径(如果你有下载到本地的话)。</p><p>导入播放列表只是一个反过来的过程。首先你要有一个类似于上面 txt 的导出文档,然后在 文件-资料库 选择导入播放列表即可。这个 txt 是可以由我们自己制作的,所以我们可以看到很多可能性。</p><p>重点在这里:这个 txt 的构成需要类似于你导出的那些 txt,即第一行是表头;从第二行开始是每首曲子的信息。表头<strong>不能缺项</strong>,但是顺序不重要。不同的项之间用 tab 隔开。没有信息的项用 tab 留空即可。并不是所有的信息都是必要的,但是:如果你要添加的音乐来自本地磁盘,你需要在「位置」这一项指明文件路径;如果你要添加 Apple Music 里的音乐,那么位置这里可以保持空白,但你需要在「种类」这里指明是 <code>Apple Music AAC 音频文件</code>,并保证「名称」这一项正确。</p><h2 id="自动生成上文所述的-txt">自动生成上文所述的 txt</h2><p>假设你有一个文件夹,里面包含了你喜欢的一大堆音乐,这些音乐你想要把它们作为一个播放列表添加进 iTunes 里,应该怎么做?</p><p>(当然可以直接添加文件/文件夹到资料库,但这里说的是用 txt 文件来导入的方法,看到后面你会知道为什么要这样)</p><p>像上面说的,你只需要创建一个 txt,第一行是表头,然后在下面每一行填上歌曲信息,然后在 iTunes 里导入就完事了。一首两首问题倒是不大,歌曲多起来呢?</p><p>注意,我上面说了,并不是每个信息都是必要的,事实上,如果你要从本地磁盘导入音乐,<strong>只需要歌曲文件路径就够了</strong> 。OK,这种重复性的工作在 Windows 上一个批处理脚本就完事了,在 Mac 上我相信有更多的工具可以完成,比如 Automator 啥的。</p><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><code class="hljs bash"><span class="hljs-built_in">echo</span> 位置 名称  艺人  作曲  专辑  归类  作品  乐章编号    乐章  乐章名称    类型  大小  时间  光盘编号    光盘统计    音轨编号    音轨统计    年份  修改日期    添加日期    比特  采样速率    音量调整    种类  均衡  注释  播放次数    上次播放时间  跳过次数    上次跳过时间  我的评分  &gt; PlayList.txt<br><span class="hljs-keyword">for</span> %%s <span class="hljs-keyword">in</span> (*.mp3 *.aac) <span class="hljs-keyword">do</span> (<span class="hljs-built_in">echo</span> %<span class="hljs-built_in">cd</span>%\%%s&gt;&gt;PlayList.TXT)<br></code></pre></td></tr></table></figure><p>另存为 <code>GenPlayList.bat</code> 。把这个文件放在存储了音乐的文件夹里,双击运行,就会生成一个叫 <code>PlayList.txt</code> 的文件,把这个文件名改成 <code>你要的播放列表名.txt</code>,去 iTunes 里选择这个文件导入就好了。在导入的播放列表里全选右键就能全部上传到 iCloud 音乐资料库。</p><h2 id="网易云音乐这边的事">网易云音乐这边的事</h2><p>到此之前都没有说到网易云,但其实整个思路已经很明显了:我们只需要从网易云里面把对应的播放列表里的歌全部下载下来,然后做一个 txt 往 iTunes 里面一导入就完事了,再借助 iCloud 音乐资料库即可把音乐传到云端,那么在哪里都能听。</p><p>其实网易云只扮演了下载工具这个角色。但是我发现网易云音乐(我在用的版本)有一个比较好的点:当你下载了音乐之后,如果把音乐文件移动到了下载目录的子目录里,那么网易云音乐仍然能够找到下载文件的位置。这为我们手动管理音乐创造了条件。</p><h2 id="来看一个实际操作的例子">来看一个实际操作的例子</h2><p>设想这么一个场景:目前你的电脑上网易云音乐没有下载任何音乐(也就是目前你的网易云音乐下载目录空空如也),你突然对一个歌单(名字叫「简直是为我而建的歌单」)很感兴趣,决定把它导进 Apple Music,但是你发现你听的歌都很小众,Apple Music 完全不能理解,所以不能用我之前介绍的 Workflow 来做,该怎么办?我描述一下解决过程。</p><ol><li>首先在网易云音乐中播放列表页点击 下载全部,然后一首一首的歌就出现在了你的网易云音乐下载目录里。</li><li>把上文提到的那个 <code>GenPlayList.bat</code> 文件也放在下载目录里,双击运行。</li><li>把生成的 <code>PlayList.txt</code> 改名为 <code>简直是为我而建的歌单.txt</code> 。</li><li>在 iTunes 中选择导入播放列表,使用上面的 <code>简直是为我而建的歌单.txt</code> 。</li><li>iTunes 里出现了这个歌单!全选这个歌单里的歌曲,右键点击「添加到 iCloud 音乐资料库」。</li><li>然后去网易云音乐下载目录里创建一个文件夹,名字叫「 简直是为我而建的歌单」。</li><li>把你下载的音乐剪切-粘贴到第 6 步创建的文件夹里。</li><li>检查一下网易云音乐里这个歌单的下载情况,仍然显示的已下载。这时候你的网易云音乐下载目录里除了有一个名字叫「 简直是为我而建的歌单」的文件夹外别无他物,非常整洁。</li><li>Perfect!</li></ol><p><img src="https://i.yecdn.com/images/2018/12/29/1723eb3f470733283176c4a2f6156860.gif" alt="导入过程演示"></p><p>等等,如果后来网易云音乐歌单里又添加了一些歌曲进去呢?我要如何 <strong>增量地导入这些歌曲</strong>?</p><p>OK,其实与上面的步骤大同小异。</p><h2 id="增量导入">增量导入</h2><ol><li><p>在网易云音乐中点击全部下载。你会发现后来你添加的歌曲出现在了网易云音乐下载目录中。</p></li><li><p>执行上面的 1-5 步,你会发现 iTunes 里出现了一个重复的播放列表,其中一个里面包含了你新添加的歌曲。全选这些新添加的歌曲,右键添加到播放列表,OK,这些歌曲就出现在了你上次创建的播放列表里。这时候 iTunes 里的播放列表又与网易云里一样了,嗯嗯不错。</p></li><li><p>去把你网易云音乐下载目录里的音乐文件扔进上次创建的「 简直是为我而建的歌单」文件夹里。Done!</p></li></ol><p><img src="https://i.yecdn.com/images/2018/12/25/2fffb4237d8ac49196409b200bb2eff7.gif" alt="增量导入"></p><h1 id="参考文章">参考文章</h1><p><a href="https://sspai.com/post/36548">用 Workflow 从网易云音乐迁移数据至 Apple Music 或 Spotify | Matrix 精选</a></p><p><a href="https://sspai.com/post/44085">利用 iTunes 来导入网易云音乐歌单到 Apple Music</a></p><p><a href="https://www.bilibili.com/read/cv1424685/">【干货】如何将网易云歌单导入 Apple music</a></p><p>PS: 最后这个链接现在打开会直接跳转 error ,可以通过 Google Cache 或 <a href="https://archive.org/web/">Internet Archive</a> 来访问此链接</p>]]></content>
  1152.    
  1153.    <summary type="html">
  1154.    
  1155.      &lt;p&gt;虽然我换到Apple Music 已经快一年多了,不过一直有一些歌单没导过来,前一阵因为之前使用的代理方式失效,自己也突然感觉是时候该把网易云上面的歌单转过来了,便搜集到了一些方法,也算是成功的把歌单给导出来了。
  1156.    
  1157.    </summary>
  1158.    
  1159.    
  1160.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  1161.    
  1162.    
  1163.      <category term="Music" scheme="https://www.wevg.org/tags/Music/"/>
  1164.    
  1165.      <category term="Apple Music" scheme="https://www.wevg.org/tags/Apple-Music/"/>
  1166.    
  1167.      <category term="Netease Music" scheme="https://www.wevg.org/tags/Netease-Music/"/>
  1168.    
  1169.      <category term="Workflow" scheme="https://www.wevg.org/tags/Workflow/"/>
  1170.    
  1171.      <category term="Tampermonkey" scheme="https://www.wevg.org/tags/Tampermonkey/"/>
  1172.    
  1173.      <category term="Excel" scheme="https://www.wevg.org/tags/Excel/"/>
  1174.    
  1175.      <category term="Bat" scheme="https://www.wevg.org/tags/Bat/"/>
  1176.    
  1177.  </entry>
  1178.  
  1179.  <entry>
  1180.    <title>启用 Windows Sandbox</title>
  1181.    <link href="https://www.wevg.org/archives/enable-windows-sandbox/"/>
  1182.    <id>https://www.wevg.org/archives/enable-windows-sandbox/</id>
  1183.    <published>2018-12-25T09:18:25.000Z</published>
  1184.    <updated>2019-05-25T03:29:20.000Z</updated>
  1185.    
  1186.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>微软宣布将在明年的 Windows 10 19H1 更新中加入 Windows Sandbox 轻量化虚拟机功能,支持 Windows 10 专业版和企业版。Windows Sandbox 将为 Windows 管理员提供一个临时桌面环境,可以安全地测试不受信任的软件。<span id="more"></span></p><blockquote><p>Windows Sandbox 中安装的任何软件都只保留在沙箱中,不会影响您的主机。一旦 Windows Sandbox 关闭,所有具有文件和状态的软件将被永久删除。</p></blockquote><p><s><strong>2018-12-26</strong> emmm Windows Sandbox 似乎有点bug 突然打不开了(捂脸</s><br><strong>2019-05-25</strong> 经测试,该问题并不会出现在最新的19H1当中(因为只测试了最新的19H1)</p><h1 id="windows-sandbox-特性">Windows Sandbox 特性</h1><ul><li>原生:作为 Windows 的一部分,此功能所需的一切资源,都随 Windows 10 专业版 / 企业版一起提供,无需专门去下载 VHD 虚拟机;</li><li>初始:每次运行 Windows Sandbox 时,运行环境都像全新安装的 Windows 系统一样干净;</li><li>安全:基于硬件虚拟化和内核隔离,后者依靠微软虚拟机管理程序运行单独的内核,将 Windows Sandbox 与主机隔离开来;</li><li>高效:使用集成的内核调度程序,智能内存管理,以及虚拟 GPU;</li><li>一次性:设备上不会遗留任何东西,关闭应用程序后,一切都将被丢弃。</li></ul><h1 id="先决条件">先决条件</h1><ul><li>Windows 10 专业版 或 企业版 (版本号 18305) 及更新版本</li><li>支持 AMD64 架构</li><li>已经在 BIOS 中启用 虚拟化</li><li>至少 4GB 内存 (推荐 8GB)</li><li>至少 1GB 可用磁盘空间 (推荐使用SSD)</li><li>至少 2 个 CPU 核心 (推荐使用4核超线程核心)</li></ul><h1 id="开启方法">开启方法</h1><ol><li><p>安装 Windows 10 专业版 或 企业版 (版本号 18305) 或更新版本</p></li><li><p>启用虚拟化</p><p>如果您使用的是物理机,请确保在BIOS中启用了虚拟化功能。</p><p>如果您使用的是虚拟机,请使用此PowerShell cmdlet启用嵌套虚拟化:</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs powershell"><span class="hljs-built_in">Set-VMProcessor</span> <span class="hljs-literal">-VMName</span> &lt;VMName&gt; <span class="hljs-literal">-ExposeVirtualizationExtensions</span> <span class="hljs-variable">$</span> true*<br></code></pre></td></tr></table></figure></li><li><p>打开Windows功能,然后选择Windows Sandbox。选择 “<strong>确定</strong>” 以安装Windows Sandbox。系统可能会要求您<strong>重新启动计算机</strong>。</p><p><img src="https://i.yecdn.com/images/2019/01/05/b511182812e93d2fcef5b975af9d7995.png" alt=""></p></li><li><p>打开<strong>开始</strong>菜单,找到 <strong>Windows Sandbox</strong>,运行即可</p></li></ol><h1 id="参考文章">参考文章</h1><p><a href="https://techcommunity.microsoft.com/t5/Windows-Kernel-Internals/Windows-Sandbox/ba-p/301849">Windows Sandbox</a></p><p><a href="https://zhuanlan.zhihu.com/p/52751088">微软正式宣布轻量化桌面环境程序:Windows Sandbox</a></p><p><a href="https://zhuanlan.zhihu.com/p/52827592">安全清爽无残留!微软宣布轻量化虚拟机 Windows Sandbox</a></p>]]></content>
  1187.    
  1188.    <summary type="html">
  1189.    
  1190.      &lt;p&gt;微软宣布将在明年的 Windows 10 19H1 更新中加入 Windows Sandbox 轻量化虚拟机功能,支持 Windows 10 专业版和企业版。Windows Sandbox 将为 Windows 管理员提供一个临时桌面环境,可以安全地测试不受信任的软件。
  1191.    
  1192.    </summary>
  1193.    
  1194.    
  1195.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  1196.    
  1197.      <category term="Windows" scheme="https://www.wevg.org/categories/Tech/Windows/"/>
  1198.    
  1199.    
  1200.      <category term="Windows" scheme="https://www.wevg.org/tags/Windows/"/>
  1201.    
  1202.      <category term="设置" scheme="https://www.wevg.org/tags/%E8%AE%BE%E7%BD%AE/"/>
  1203.    
  1204.      <category term="Virtual" scheme="https://www.wevg.org/tags/Virtual/"/>
  1205.    
  1206.      <category term="Sandbox" scheme="https://www.wevg.org/tags/Sandbox/"/>
  1207.    
  1208.  </entry>
  1209.  
  1210.  <entry>
  1211.    <title>魔法咒语大全 (整合版)</title>
  1212.    <link href="https://www.wevg.org/archives/magic-word/"/>
  1213.    <id>https://www.wevg.org/archives/magic-word/</id>
  1214.    <published>2018-12-23T05:13:18.000Z</published>
  1215.    <updated>2019-04-01T10:17:22.000Z</updated>
  1216.    
  1217.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>偶尔让自己中二一下 (捂脸逃<span id="more"></span></p><p>其实这个是偶然在网上看到的,然后自己又整理了一下</p><h1 id="总网">总网</h1><p><em>此部分顺序感觉比较乱,有空我再整理一下</em></p><p>從銀嶺來,回到巴比倫去!</p><p>凍土啊,冰河啊,狂舞吧!</p><p>魔鬼的公爵,來履行使遠古的契約吧!</p><p>從蝙蝠的羽來,回夜魔的青爪去!</p><p>雷神來,掌握我生命的雷的精靈!</p><p>火炎招來,用不滅的火炎來服從我!</p><p>冰雪的精靈啊,化爲撕裂者,消滅我的敵人吧!</p><p>斯科勿,亦多侯坶,盛血的聖杯啊,請來不歸的靈魂吧!</p><p>在漆黑的黑暗中燃燒的地獄之火啊,化爲我的劍消滅敵人!</p><p>迪烏斯汀,大氣和大地的精靈,都按古老契約來履行義務吧!</p><p>對我忠實就回答我的命令,來吧,用邪惡的力量毀滅一切!</p><p>化成灰盡吧,冥界的賢者啊,用七把鑰匙打開地獄之門吧!</p><p>把守冥界的三頭犬啊,聽從我的召喚,從黑暗的深淵醒來吧!</p><p>餓鬼界的奴博希由啊,請用你那偉大的力量來溶化一切腐敗之物吧!</p><p>打開吧,天之聖櫃,我以主人的名義命令你,黑色的靈魂幫助我吧!</p><p>充斥于天地之間的精靈呦,根據古老的契約,展現你們的力量吧!</p><p>我的生命啊,化作白刃,直到燃成灰盡,去把我的敵人的咽喉割斷吧!</p><p>微微的清風,靜靜的流動吧,混沌之物,把所有的一切都化爲白色的武器吧!</p><p>統禦四界的黑暗之王,依循著您碎片之緣,藉由您所有的力量,賜與我更強的魔力吧!</p><p>腐屍啊,骸骨啊,全都出來吧,從地面長出來的東西都腐爛墜落,回歸大地!</p><p>水啊,充滿寒氣吧,我的敵人就是你的敵人啊,聽從我的吩咐,吞食我的敵人吧!</p><p>服從於我的念咒者啊,現在聽從我的咒語,消除你們的骨,與血,與肉,的痛吧!</p><p>跨越天空以及大地的力量啊,溫柔流動的潺潺河水啊,集中到我的手中來成爲我的力量吧!</p><p>遠古的精靈啊聽從我的召喚從遙遠的魔界降臨人間—出來吧!用你的力量將一切邪惡打入深淵!</p><p>布裏特,遵從布裏特,遵從血的盟約,到阿伯當的土地上來吧,柯伯那的火焰全力爆發吧!</p><p>從負界的混沌喚醒的禁斷的黑炎啊,聽從我的吩負,把阻擋在我面前的所有敵人都化爲灰盡吧!</p><p>以天地諸元爲名,召集四方之雷,十二界的諸電之力供我使喚,在藍色的火,白色的光中,雷電結合,掃盡一切之敵!</p><p>伴隨著黃昏到來的黑暗,伴隨著血流到來的戰鬥,隨著時間的流逝,以偉大南基之名,將他們導上毀滅之途!</p><p>黑暗的王子,邪惡的長子,如果你們還是王的話,就聽從我的召喚吧,惡魔的肉芽啊,將敵人全部吃盡吧!</p><p>世界上所有不幸的生靈,所有邪惡墮落的靈魂,請隨著淨化之光, 將世界與世界結合,回到你們原本所屬之處吧!</p><p>惡夢之王的一片啊,解放世界的戒令,冰凍的黑色虛無之刃,與我的力量 我的身體結合,一起邁向毀滅之程吧!</p><p>吼叫吧,雷的精靈啊,穿透吧,上天的閃電啊,充滿鬥志的人,憑著手中之劍,把我所有的憤怒都發泄出來吧!</p><p>冥王啊,將至高無上的強大力量注入我體內的死之冷風中去吧,讓我散發出冰雪的威力,拉開生的華麗的帷幕,展現死神的姿態!</p><p>熾天使,智天使,座天使,主天使,力天使,能天使,權天使,大天使,天使,三階九天使啊,天罰之時已經到來,請賜給我面前的敵人永久的毀滅吧!</p><p>召喚地的五芒,召喚水的五芒,召喚火的五芒,召喚風的五芒,偉大的王神啊,在我周圍照耀五芒星的光芒吧,從上天的五芒中賜予我力量吧!</p><p>偉大的力之三角啊,六星與五芒,光與暗,叩拜龍王的英靈,天理,地理,人理,力的圓錐,迪瑪奇奧的紋章,賜予我聖炎三頭黃金龍的力量吧!</p><p>搖蕩於久遠與無限之間所有心之根源啊,所有存在於此的蒼色火炎啊,請將沈睡於我靈魂深處的這個力量,從無限召喚到此助我一臂之力吧!</p><p>比黑暗還要漆黑者,比夜晚還要深沈者,在混沌的海裏您偉大的存在,金色的黑暗之王啊,我在這裏向您請願,我在這裏向您發誓,對於阻擋在我前方所有的愚蠢之物,集合你我之力,賜與他們平等的毀滅吧!</p><p>比鮮血更加鮮紅,比黑夜更加黑暗,偉大的神啊,賜予我力量,把我從無窮的黑暗中解放出來!破龍陣!</p><p>說明:咒語大全按冰、火、水、雷、風、土、黑暗(亡靈)、光明(神聖)、空間、其他(複合)、長篇分類,排名不分先後,如有誤或疏漏,請告知。(注:一般情況下,帶有姓名的咒語不收錄)</p><h1 id="冰">冰</h1><p>空間中的冰精靈呀,將你們的力量集合到我手中,讓大地凍結,讓山川成冰,將世間的一切籠罩在白色之中──天地凍結術!</p><p>冰雪之神啊,用你強有力的雙手,將一切凍結!──寒冰凍結波!</p><p>冰凝成形,凍刃化槍,賜予我極上之力,凍結虛空之冰槍!</p><p>沐浴在極光中的冰之精靈啊,請借給我那鬼斧神工的技巧,築出一道永恒不滅的水晶之牆吧!</p><p>冰之精靈,以你潔淨之手,編織出純白之網,將我像初生嬰孩般,溫柔的包裹住吧!──純淨之紗!</p><p>冰的精靈呀,請幫助我——凍結術!</p><p>冰的精靈呀!運用你們的神力,保護我方——冰護之術!”</p><p>冰的大精靈呀,請給予我力量,冰旋咒!</p><p>以我族守護神的名義,召喚大氣中的冰精靈們,將你們的力量賜借給我,消滅我的敵人——冰風怒吼!</p><p>吾與精靈的契約永世長存,依照契約的束縛,借與吾最強大的魔力,釋放全體精靈的力量,完成無敵的魔咒,摧毀吾之前的一切──天冰地晶!</p><p>潔白的雪花,晶瑩的冰霜,聚集到吾的身邊,感受吾的痛苦,借與吾強大的魔力,阻擋吾之前的一切——冰晶雪舞!</p><p>偉大的冰之精靈王啊,萬里冰原的主人,賜予我您的力量,純潔的神劍,消滅面前的邪惡!冰之劍</p><p>冰雪的精靈啊,化爲撕裂者,消滅我的敵人吧!</p><p>在遙遠極寒之處蟄伏的冰雪魔神,順從我的召喚前來。凍結一切的黑色暴風雪啊!將萬物化爲白雪吧!──冰結封滅陣!</p><h1 id="火">火</h1><p>深埋於黑暗地底的紅蓮之炎,以吾之名召喚前來!</p><p>地獄深處燃燒不息的妖火啊!以我之名,呼換你們前來!成爲我的魔劍,粉碎所有阻擋我的人!──火神爆炎!</p><p>熱情的火炎精靈呀!請借於我你的力量!火的元素呀!在精靈的命令下化爲無堅不摧的爆炎吧!</p><p>紅蓮的妖精啊、吐呐炎之氣息、焚毀衆敵之軀體!</p><p>凝結在我手中的炎之分子啊,隨著我揮舞的弧度,劃出一道完美的紅扇形吧!──舞扇之炎!</p><p>藏與地底萬丈深淵的熾烈之火,焚燒我的敵人吧!──烈焰地獄!<br>偉大的火焰主神,請借給我神力,點起撕開黑暗的火焰吧——燃火術!</p><p>以火神的名義,我命令火精靈出現——紅蓮燁火!</p><p>吾以契約者的名義召喚吾之守護主神——火焰神王!火焰的主神呀,給我無窮的力量,展現您的憤怒,借用你滅世的魔力摧毀吾之死敵,在此一刻,將你我的憤怒合而爲一,展現最強的神力——火神的憤怒!</p><p>偉大的火神啊,傾聽我的祈禱──火焰球!</p><p>黑暗之王啊,請將你憤怒之火化作沖天狂炎,潔淨世間一切的罪惡——淨世之火!</p><p>歡呼雀躍的火精靈呦,聚集到我的身邊,將你們強大的力量暫借於我,釋放你們的活力,燃燒大地,阻擋敵人的視線──紅蓮獄火!</p><p>偉大的火之神王,以契約者的名義向汝借取滅世魔力,將世間一切邪惡燃燒,讓光明的火焰燃邊大地──火龍咆哮!</p><p>地獄深處燃燒不息的烈火啊!以神之名,呼喚你們前來!焚燒我的敵人,骨頭燒成飛灰,血液也將沸騰……成爲微小的餘燼!</p><p>烈火中跳動的精靈啊,將你們的憤怒化爲火牆,把一切都隔開!──火焰護盾!</p><p>火焰中的魔神啊,將你們的憤怒,化成我無窮的力量吧!──炎神降臨!</p><p>火焰中的精靈,應我之召喚,化爲我血色的長刀,斬滅我眼前的一切生物──火焰烈風切!</p><h1 id="水">水</h1><p>水的精靈啊!傾聽我的呼喚,用你的磅礴,展示你傲人的力量——水神怒吼!</p><p>請求水的精靈圍困我的敵人——逆流術!</p><p>大氣中的水精靈呀,聽從吾的召喚,以你們的力量縛博吾之敵的身軀,停止吾之敵的步伐——水界縛博咒!</p><p>水神的力量降臨吾身,以契約之名,展現神的力量——水霧滅絕殺!</p><p>大氣中的水精靈呀,請聚集到吾的身邊,以水精靈王的意志以吾之名,命令汝等聽命與吾。召集強大的魔力,混合著光明的力量,對抗邪惡的意志,淨化污垢的心靈,讓光明重返大地,讓心靈得到洗滌,解救被黑暗圍困的生靈,粉碎黑暗的野心——水界淨心咒!</p><h2 id="雷">雷</h2><p>紛擾的遊塵,迷惑的旅人,大地的怒吼,衆星的呼喚。邪惡的意念,混亂的重生,狂野的黑暗!出現吧!吾以天雷之名召喚!──滅絕衆生之雷!</p><p>昊天之鹿,浮動之獅,聽我之命令,暴落!──天雷!</p><p>背逆了一切的定理,違反了亙古的常規,完全只以我的命令爲尊。如果天要懲罰我的狂傲,那就叛天吧!──叛天之逆雷!</p><p>龍者!無盡天雷,立於我之左手,我的血盟,雷靈!天者!自然之狂風,撕裂我的敵人,立於我的右手,血盟!融合!死亡爆雷!</p><p>在天空奔馳的雷電,狂劈我所指定的敵人吧!</p><p>集於天空中億數萬的雷元素──雷箭!</p><p>狂風啊!天雲啊!雷殛啊!吾等遵從古代的契約來到我的身邊!──天雷降臨!</p><p>無雲的晴空、遲與快的組合!遵從電與火之古老契約!去觸擊他!──電光雷亟!</p><p>力量無窮的雷精靈,根據契約,請幫助我!奔雷彈!</p><p>狂暴的雷精靈,以你們的力量摧毀一切吧,狂雷天降!</p><p>天空中的烏雲,大氣中的精靈,聽從吾的召喚,聚集在吾的身邊,展現你們的哀怨,破滅世間一切,迎接破壞神的到來——爆雷天降咒!</p><p>以天地諸元爲名,召集四方之雷,十二界的諸電之力供我使喚,在藍色的火,白色的光中,雷電結合,掃盡一切之敵!</p><h1 id="风">风</h1><p>疾風招來,成爲猛獸之牙切裂對方!</p><p>閃耀於夜空的星晨,請指引我到達彼方之路途,以黑夜之王,大氣之精靈下令,風啊!送我一程吧!</p><p>無所不能的風之精靈啊……以大氣爲弓,光輝爲箭,承受我意志的力量,劃破那遠天的虛空吧──風之力量!</p><p>虛幻的風啊,幻化成守護的龍吧!──風之幻龍!</p><p>風的偉大主神呀!借用你的力量,將我們帶到意願的所在地!──風神大瞬移!</p><p>飛翔之風呀!向世人展現高貴的您的暴怒吧!讓世人恐懼,讓世人驚怕──死亡風暴!</p><p>風戒之鎖,薄紗之練,終年吹佛大地的不息之風啊,化爲禁錮的枷鎖吧,將胎動的罪惡束縛!──風界縛鎖!</p><p>飛舞於大氣之中的風之精靈啊!賜予我透明的雙翼,自由的飛翔於穹蒼之中!──風之翔翼!</p><p>風聚爲形,激沖成刃,在十字光芒閃耀的一刻,風之神也會爲此而贊許!揮動吧,十字刃!──風曜x字斬!</p><p>風的精靈啊,化爲銳利的鋒刃,試探前方的道路吧。</p><p>神聖的力量啊賜予我聖潔的雙翼、任其遨翔於天際──飛翔術!</p><p>以契約之名,召喚風的精靈——旋風術!</p><p>展現天風神王的力量,風的精靈,以風神的名義保護我——天風之舞!</p><p>大氣的精靈啊,請予以那虛妄而不敬神明的妄言者以懲罰——靜默之術!</p><p>風神啊~用您無盡的力量,撕開空間的裂痕,永恒的時間定格於瞬間──空氣結界!</p><p>神聖的風之精靈──漂浮!</p><h1 id="土">土</h1><p>無盡的大地,挺起你無邊的胸膛,將世界切斷!──土之城邦!</p><h1 id="黑暗-亡灵">黑暗、亡灵</h1><p>統禦四界的黑暗之王,依循著您碎片之緣,藉由您所有的力量,賜與我更強的魔力吧!</p><p>墮落的生靈啊,應黑暗中的使者之邀,張開你的胸懷,盡情地吃吧,將一切蝕盡吧!──惡靈降世!</p><p>黑暗的盟主啊,以我的血爲契約,用您強大的意志控制力,控制結界內任何地生物──黑暗束縛!</p><p>奉邪神之禦用,衛吾已盡之殘軀——暗黑炎壁!</p><p>比黑暗還要黑的東西,比深夜還要深的東西,在混沌的海上漂浮,金色的黑暗之王啊,我在這裏向您請願,我在這裏向您發誓,對於阻擋在我前方,所有的愚蠢之物,集合你我之力,賜予他們平等的毀滅——重破斬!</p><p>惡夢之王的碎片,解放世界的戒令,冰凍的黑色虛無之刃,與我的力量、我的身體結合,一起邁向毀滅之程,連衆神的魂魄都被擊潰——神滅斬!</p><p>由無盡深淵誕生的最強大的力量,籍由我血的聯繫將你呼喚到此,萬事萬物都腐朽墮落,歸於塵土!我于此傳承永恒的契約以我個人之名,將眼前生靈的魂與血奉上,以此爲祭品,再次詛咒──恒暝之紗!</p><p>地獄最深層的邪魔啊,請您張開您沈睡了億萬年的紫眸,傾聽您于無數世代後子孫的禱告!您的子孫於這裏獻上擁有強大力量祭品,讓他成爲您身體的一部分,並在這裏宣告無視這個世界的秩序,以您的意志主宰祭品存在的形式————魔化紅蓮</p><p>(注:暗黑類禁咒,不借助元素精靈和神詆的力量,直接利用存在於地獄最深處的泰坦超出一切神靈和秩序的力量,將有意識的力量體轉化成地獄的紅蓮之火,50%成功率)</p><p>惡靈將至,地獄之門將再度開啓,屈服於我的惡靈們啊,我命令你們使我回歸於空,迎接我吧,在我面前的空間將失去意義──魔界之門!</p><p>來自地獄的無盡黑暗呀……掩沒光明吧……以吾之血對汝發誓……以吾之怨恨給予敵人同等的創傷吧!</p><p>九天九地之氣,形成我的屏障,遠古的魔神緊記盟約,吾乃惡之最惡,邪之最邪,是無上之尊者,消散於無盡的黑暗之中吧──冥魔六道炮!</p><p>比大海更深沈的憂傷,比天空更青藍的悠遠。自九幽地淵之底複現,我以自身鮮血爲誓,傳承彼幽暗之力,賜予所能觸及的一切,彼之判決———深藍判決!</p><p>讓一切都爲無盡的黑暗,炸裂吧!</p><p>在各個空間中四處游離無所爲家的流魂啊,以僕役的方式現身,盡一點你們的微薄之力,賜給我無盡的黑暗,主子將會以光之超渡終結那無數痛苦的流亡業障--怨靈的哀號!</p><p>飄流於世間的靈魂、遊走於人界的亡者,皆依循自然之理回歸至死者之地。迷惘及困惑,憎惡與悲傷,將在光的道路上消失無形──死靈歸界!</p><p>深沈的黑暗啊,化爲破滅箭矢,貫穿戰士之盾吧──漆黑之箭!</p><p>被衆神詛咒的暗黑大魔神啊,我用我的心,我的血,我的生命向您借取滅世的魔力,讓所有的詛咒降臨到我的身上,讓我的血來洗清神的詛咒──異次元空間!</p><p>死亡的靈魂啊,依據契約成爲我的力量吧──地獄死魂炮!</p><p>沈睡在異次空間的魔神,在黑暗的引導下穿越時間的阻礙,停留在心靈最黑暗的空間中,掌握吾之敵的意志,破滅吾之敵的靈魂──攝魂魔咒!</p><p>亡者的力量,靈魂的意志,在黑色大地上徘徊,在血色天空中遊蕩,在此我以暗之賢者的身份號令,聚集在我手中,化爲我的利矛,將一切生靈回歸冥神的腳下──職掌者之矛·飛翼!</p><p>來自遠古的魔神,以吾之名義召喚你的出現,讓天空落下火雨,讓大海變爲血池,衆神將爲之恐懼,一切將歸爲虛無──末日之判決!</p><p>地獄深處不死的亡靈啊!以魔界至尊之名,呼喚你們前來!成爲我的力量,粉碎所有阻擋的敵人,骨頭砍成飛屑,一切化作微塵──暗黑力量!</p><p>黑暗之神呀,你從虛無中走來,帶著深深的悲傷,將絕望帶給我的敵人,以我的鮮血誓——地獄悲嚎!</p><p>地獄中跳動著的紅色幽靈啊,將你們的憤怒化爲利劍消滅敵人吧──爆靈地獄!</p><p>黑暗中的死神啊!聽我的召喚,我命令汝等成爲我的奴僕。醒來吧!沈睡中的死神──────死神降世!</p><p>沈睡於大地深處的亡靈,我用我心頭的鮮血取消你的封印,聽我號令毀滅我的敵人──亡靈六道殺!</p><p>全能的邪神啊,請賜予我們不受外力侵害的力量,在至強的黑暗之光面前,所有傷害都將遠離-─黑暗護盾!</p><p>黑暗之龍蘭達呀,我以黑暗之名召喚你。</p><h1 id="光明-神圣">光明、神圣</h1><p>光之利刃啊,化成無敵的長劍,斬破黑暗的時空吧!──光劍斬!</p><h1 id="空间">空间</h1><p>幽遊於一切存有的偉大旅者,請駐足垂憐。吾將以未來無限可能爲禮,求前進現世異界渺茫之路,將惶惶於您前的迷途羔羊,牽引至永無終點的無盡旅途———星辰之門</p><p>自由漂流在空間中的風精靈呀,請將你們的力量暫借給吾,讓吾擺脫時間的束縛,讓吾超越空間的界限,將吾的身體,將吾的意識傳送到吾所指定的地點,──空間轉移 !平行的世界呀,諸神的領域呀,喚醒未知的通道,釋放莫名的魔法源泉吧──時空風暴!</p><p>庇護于時間於空間夾縫中的靈魂,我不讚美你的偉大,我不讚美你的力量,但我用我血的代價換取你的信任,成爲你無盡時間與空間守護者的盟誓!請你將你偉大的力量賜予我,我將把我靈魂中的虛無獻於您的面前,以爲您無處無時不在的永恒的見證!——時空操縱(注:混沌之神的專利)</p><p>風在水中飄揚呀,特羅司達的聖火,瑟費大海的浪滔,藉海神之名──位移之咒!</p><p>時光與空間的交集,巨輪和鎖鑰的緊合,時空橫豎之窗,飄渺無定之門,虛無而現實的世界,爲召喚之人開啓吧!──超空間扭轉!</p><p>偉大的空間主神呀,以你強大的力量,無比的神力,將這個空間毀滅吧!——空間粉碎 !</p><h1 id="其他-复合">其他、复合</h1><p>大地之神,萬物之主,天臨雷電,地起沈明,火焰精靈請聽我的呼喚,降臨在此世界萬物皆有其之本源,朝我刀刃相向的物質,請示明你的來意,不然,就聽我卑微的建議,原封不動的奉送回去吧!──反沖的真理!</p><h1 id="终极类">终极类</h1><h2 id="究極白魔法">究極白魔法:</h2><p>在暗夜中潛伏的身影<br>在冥月下哭泣的精靈<br>請回應我內心的憤怒<br>請您化作永恒的牢籠<br>使我面前愚癡的人類<br>關入無盡的黑暗</p><p>無盡的魔力將化爲無盡的希望<br>風之精靈請圍繞在我身旁<br>構成風的屏障<br>水的精靈請化爲柔順的波動<br>凝爲圓潤之鏡<br>地之精靈請放棄仇視<br>解除心靈之束縛<br>平息你的憤怒</p><h2 id="合成魔法-鏡冥封音">合成魔法“鏡冥封音”:</h2><p>漫延在大氣中的火焰精靈<br>請回應我的請求<br>發出無盡的憤怒<br>將弱小化爲強大<br>讓無限的波動共鳴<br>創造出永恒的力量<br>爆風鳴音!</p><p>用不滅的地火焚盡歎息之壁<br>讓流動的冰嵐解開封印之鎖<br>從虛無的開始到混沌的終結<br>請遵循自古以來傳承的諾言<br>違背從未改變過的命運星辰<br>斬斷虛無縹緲的因果律之索<br>爲我打開真與幻交界的門扉<br>穿梭過去與未來<br>交錯刹那與永恒</p><h2 id="頂級黑魔法">頂級黑魔法:</h2><p>溫柔輕拂的微風</p><p>蔚藍澄澈的大海</p><p>灼烈燃燒的火焰</p><p>平靜沈穩的大地</p><p>藉由四大元素的共鳴</p><p>打開對神訴求的通道</p><p>四神世界中至高無上的偉大神祀</p><p>破壞神呀</p><p>請您聆聽我的祈願</p><p>運用您神聖的偉大力量</p><p>給予悲傷痛哭的哀淒人們</p><p>最後的慈悲</p><p>冥界中至高無上的暗黑之神呀</p><p>我在此向您祈求</p><p>我在此向您請願</p><p>以周遭的生靈作爲獻祭</p><p>換取您對我的憐憫</p><p>藉由您的偉大之力</p><p>重新賦予我摯愛的人新的生命</p><h2 id="火系終極法術-末日的黃昏:">火系終極法術-末日的黃昏:</h2><p>火爲點、炎爲線,<br>三界之焱構成無盡的面<br>恐懼的烈焰穿梭永恒的空間<br>不滅的紅蓮劃破時光的界線<br>存在於虛無空間的偉大皇者<br>我以我之名請求你實踐傳說的誓言<br>創造出破碎的最初<br>回歸於混沌的終結</p><h2 id="風系終極法術-溫柔的傷悲:">風系終極法術—溫柔的傷悲:</h2><p>從清晨樹梢上的輕響<br>到深夜幻月下的悲鳴<br>從溫柔輕拂的微風<br>到狂暴肆掠的龍卷<br>跨越夢幻的界線<br>打開真實的門扉<br>畫出悲傷的開始<br>直到最後的終結<br>虛幻的末日主宰<br>請借與我無上之力<br>崩碎希望的混沌</p><h2 id="雷系終極魔法-虛無的誓言:">雷系終極魔法—虛無的誓言:</h2><p>象徵毀滅的無序之雷<br>審判終結的恐懼之電<br>化成制裁之光<br>形成憤怒之劍<br>解開環鎖的命運<br>破碎封閉的永恒<br>創造與毀滅之主<br>請聆聽我的誓言<br>將一切歸於最終的虛無</p><p>比大海更深藍的憂鬱,比天空更青藍天的悠遠,<br>自九幽地淵之底複現,傳承彼之幽暗之力,<br>賜予所觸及的一切,在此與吾訂立契約——深藍審判。<br>違逆了一切自然的法規,破壞了一切自然的定律,<br>違逆了所有次元的平衡,破壞了所有次元的秩序,<br>在違逆中,吾尋覓新的法規與平衡,<br>在破壞中,吾尋求新的定律與秩序,<br>吾逆天而行,尋找真理,在虛幻與真實之間徘徊,<br>超越永恒的時間,超越無限的空間——次元波動</p><p>吾在此開啓時空之門扉,呼喚隱覓于明之後諸神,<br>解開破滅之符印,冥王招來,飛天懸舞…<br>吾之右手所立乃掌握精神之神摩西,<br>吾之左手所立乃施管物質之神卡斯,<br>以汝殘軀爲誓,獻上千人之祭品<br>換來灰色的祝福。盡立三神血盟於此<br>餛飩之最初,破滅之序曲…<br>聖光之終焉,創造之末源…<br>五芒解封,幻神舞曲…<br>魔王鳴奏曲之序曲</p><h2 id="輝煌咒文──禁界牙煌霸炎陣──現世:">輝煌咒文──禁界牙煌霸炎陣──現世:</h2><p>至高的神炎之王,三角之陣的司掌者,請聆聽我的祈禱<br>尊貴的魔炎之王,四角之陣的統禦者,請回應我的請求<br>偉大的冥炎之王,五芒之陣的支配者,請承諾我的心願<br>榮耀的龍炎之王,六芒之陣的掌管者,請實現我的希望<br>我乃操縱人間緋紅焰火之使者,在此要求履行太古禁斷之契約<br>以血與魔力爲鎖鑰,開啓四界之門,<br>淨化罪惡之炎聽我呼喚<br>焚盡萬物之炎聽我召來<br>滅絕靈魂之炎聽我所命<br>永熾不息之炎聽我指令<br>四界之炎降臨我身<br>五界之炎迎襲我敵<br>天地歸於混沌……</p><p><strong>注:將對手與某物融合,或是與自己融合,由精神力強的一方奪得控制權,但卻保留弱的那方的肉體。</strong></p><h2 id="八屬性終極複合封印咒文──最美的光輝:">八屬性終極複合封印咒文──最美的光輝:</h2><p>無盡的魔力將化爲無盡的希望<br>風之精靈請圍繞在我身旁<br>構成混沌屏障<br>水的精靈請化爲柔順的波動<br>凝爲歲月之鏡<br>地之精靈請放棄彼此的仇視<br>解除心靈之束縛<br>火之精靈請凝成紅蓮之索<br>織爲空間之網<br>四大元素請借與我心之力<br>締結永恒的莫名<br>從虛無的開始到混沌的終結<br>請停止一切的波動<br>封印吧!最美的光輝!</p><h2 id="封印技第二彈-沈睡的永恒:">封印技第二彈-沈睡的永恒:</h2><p>在漠然的無盡孤寂中<br>停留的創造之主<br>在空虛的永恒傷悲中<br>穿梭的末日之靈<br>掌控真實與虛幻的至高存在<br>請聆聽我的述求<br>交錯光明與黑暗<br>劃破最終的界線<br>讓封印的深淵 重現!</p><h2 id="逆屬性終極魔法-交錯之幻想:">逆屬性終極魔法-交錯之幻想:</h2><p>在混沌中封閉的永恒</p><p>在虛無中破碎的平衡</p><p>停留在宇宙的至深之淵</p><p>被呼喚而來的偉大神明</p><p>請回應我的祈求</p><p>重疊幻想與現實</p><p>交錯弱小與強大</p><p>改變彼此的面貌</p><p>將痛苦與悲傷</p><p>降臨彼身</p><h2 id="風刃:">風刃:</h2><p>萬能的風之王者,<br>通曉大氣流動之理的,<br>偉大的君王,<br>群青的伊露克啊!<br>我偉大的盟友,<br>遵循血的神聖契約,<br>自我族血脈之始爲始,<br>以我族血脈之終爲終,<br>回應我的召喚,<br>化做我的力量!</p><h2 id="冰彈-:">冰彈 :</h2><p>純潔的水之少女,<br>通曉波濤翻湧之理的,<br>美麗的女皇,<br>蒼藍的伊娃啊!<br>我偉大的盟友,<br>遵循血的神聖契約,<br>自我族血脈之始爲始,<br>以我族血脈之終爲終,<br>回應我的召喚,<br>凍結我面前的所有敵人。</p><h2 id="地裂:">地裂:</h2><p>沈默的大地君王,<br>通曉山脈變化之理的,<br>勇敢的戰士,<br>堅毅的貝西莫斯啊!<br>我偉大的盟友,<br>遵循血的神聖契約,<br>自我族血脈之始爲始,<br>以我族血脈之終爲終,<br>回應我的召喚,<br>埋葬我的敵人!</p><h2 id="火焰巨人:">火焰巨人:</h2><p>狂暴的火焰巨人,<br>掌管破壞與再生的,<br>勇猛的暴君,<br>赤紅色的艾夫利德啊!<br>我偉大的盟友,<br>遵循血的神聖契約,<br>自我族血脈之始爲始,<br>以我族血脈之終爲終,<br>回應我的召喚,<br>聚集你的力量,<br>化爲神聖的武器,<br>消滅所有的敵人。</p><h2 id="光之槍">光之槍:</h2><p>光輝的神的女兒,<br>指引戰士邁向神聖殿堂的,<br>輝煌的公主,<br>無法正視的王爾古雷!<br>我偉大的盟友,<br>遵循血的神聖契約,<br>自我族血脈之始爲始,<br>以我族血脈之終爲終,<br>回應我的召喚,<br>將光芒化爲利刃。<br>撕破黑暗!</p><p>連天界的諸神也害怕<br>連地獄的魔王也恐懼<br>掌管一切創造與毀滅的存在<br>你卑微的僕人在此向您祈求<br>用你那可使世間萬物死亡之力<br>給予我面前愚昧無知的卑賤生物<br>最後的審判</p><h1 id="最長的咒文-七曜的甦醒:">最長的咒文 七曜的甦醒:</h1><p>交錯吧!<br>太陽的光迹與月亮的引領<br>在漆黑的路途上<br>照耀出燦爛的黃金之道</p><p>流動不息的泉水啊!<br>那綿延不止的白絹<br>請回應我的呼喚<br>匯聚成夢想的河流<br>歷經死寂的山脈</p><p>傾進真實的大海</p><p>讓那希望的種子在應許之地紮根吧!<br>長成恒綠的世界之樹<br>結出鵝黃的果實<br>散落潔白的羽翼<br>翺翔於殘破的大地</p><p>且點燃那永恒的不滅之炎<br>幻化無盡的紅蓮<br>編織彼此的心願<br>將燃燒的誓言灑落<br>以喚醒沈睡的大地</p><p>結合吧!<br>從太古傳承至今的七曜之力<br>輝煌之日與溫柔之月<br>靛藍之金與深紫之水<br>橙黃之木與緋紅之火<br>速速降落於此<br>在黑暗的大地上共鳴<br>打破那封閉以久的命運之輪<br>敲碎那失落自我的幻想時空</p><h1 id="参考文章">参考文章</h1><p><a href="https://blog.xuite.net/shijayi/red/14620565-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E7%B8%BD%E7%B6%B1">魔法咒語大全-總綱</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620592-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E7%81%AB">魔法咒語大全-火</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620602-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E6%B0%B4">魔法咒語大全-水</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620610-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E9%9B%B7">魔法咒語大全-雷</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620619-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E9%A2%A8">魔法咒語大全-風</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620643-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E7%A9%BA%E9%96%93">魔法咒語大全-空間</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620624-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E5%9C%9F%EF%BC%86%E9%BB%91%E6%9A%97%EF%BC%86%E4%BA%A1%E9%9D%88">魔法咒語大全-土&黑暗&亡靈</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620637-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E5%85%89%E6%98%8E%E3%80%81%E7%A5%9E%E8%81%96">魔法咒語大全-光明、神聖</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620649-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E5%85%B6%E4%BB%96%EF%BC%88%E8%A4%87%E5%90%88%EF%BC%89">魔法咒語大全-其他(複合)</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620711-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E7%B5%82%E6%A5%B5%E9%A1%9E%EF%BC%91">魔法咒語大全-終極類1</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620746-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E7%B5%82%E6%A5%B5%E9%A1%9E%EF%BC%92">魔法咒語大全-終極類2</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620681-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E9%95%B7%E7%AF%87%281%29">魔法咒語大全-長篇1</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620699-%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%E5%A4%A7%E5%85%A8%EF%BC%8D%E9%95%B7%E7%AF%87%EF%BC%88%EF%BC%92%EF%BC%89">魔法咒語大全-長篇2</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620664-%E6%9C%80%E9%95%B7%E7%9A%84%E9%AD%94%E6%B3%95%E5%92%92%E8%AA%9E%EF%BC%8D%E4%B8%83%E6%9B%9C%E7%9A%84%E7%94%A6%E9%86%92">最長的魔法咒語-七曜的甦醒</a></p><p><a href="https://blog.xuite.net/shijayi/red/14620586">魔法咒語大全-冰</a></p>]]></content>
  1218.    
  1219.    <summary type="html">
  1220.    
  1221.      &lt;p&gt;偶尔让自己中二一下 (捂脸逃
  1222.    
  1223.    </summary>
  1224.    
  1225.    
  1226.      <category term="Other" scheme="https://www.wevg.org/categories/Other/"/>
  1227.    
  1228.    
  1229.      <category term="magic" scheme="https://www.wevg.org/tags/magic/"/>
  1230.    
  1231.  </entry>
  1232.  
  1233.  <entry>
  1234.    <title>使用 Nginx 多平台同步直播</title>
  1235.    <link href="https://www.wevg.org/archives/nginx-mutli-rtmp/"/>
  1236.    <id>https://www.wevg.org/archives/nginx-mutli-rtmp/</id>
  1237.    <published>2018-12-23T03:42:44.000Z</published>
  1238.    <updated>2019-06-02T15:04:13.000Z</updated>
  1239.    
  1240.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>前一阵,在一位大佬的博客上曾看到过一篇类似的文章,最近突然有朋友想要多平台直播,又找不到之前的,便在网上搜集了一番,整理了一下。这样做的好处是,节省本地带宽,分发给多平台的步骤交给远端的服务器进行处理。<span id="more"></span></p><h1 id="准备工作">准备工作</h1><p><em>如果您已经安装好 Nginx 和 nginx-rtmp-module 可以跳过此部分</em></p><h1 id="使用包管理安装的-nginx">使用包管理安装的 Nginx</h1><p>因为我已经安装过 Nginx,使用的是<strong>使用包管理安装的 Nginx</strong>,您也可以选择<strong>编译安装</strong>的方式进行,因为本人太菜,每次进行编译都会出错,所以此处不在阐述。Nginx 官方有打包好的 Nginx 可以直接通过 <code>apt-get install nginx -y</code> 完成安装,但是这样做的后果是你安装的是一个可能非常老旧和充满隐患的 Nginx (此部分摘自 <a href="https://dcc.cat">DCC大佬</a> 的博客)</p><h2 id="ondřej-surý-的-ppa">Ondřej Surý 的 PPA</h2><p>更新非常快速,而且做的质量也非常好。</p><h3 id="对于-ubuntu-系列:"><strong>对于 Ubuntu 系列:</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">add-apt-repository ppa:ondrej/nginx-mainline -y<br></code></pre></td></tr></table></figure><h3 id="对于-debian-系列:"><strong>对于 Debian 系列:</strong></h3><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><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">wget -O /etc/apt/trusted.gpg.d/nginx-mainline.gpg https://packages.sury.xyz/nginx-mainline/apt.gpg<br><br>cat &gt;&gt; /etc/apt/sources.list.d/nginx.list &lt;&lt; <span class="hljs-string">EOF</span><br><span class="hljs-string">deb https://packages.sury.xyz/nginx-mainline/ $(lsb_release -sc) main</span><br><span class="hljs-string">EOF</span><br></code></pre></td></tr></table></figure><p>然后我们更新系统、安装必要组件和 Nginx 本身:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">apt update &amp;&amp; apt install nginx-extras -y<br></code></pre></td></tr></table></figure><p>查看 Nginx 版本和参数和安装目录</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><code class="hljs bash">nginx -V<br>whereis nginx<br></code></pre></td></tr></table></figure><h2 id="烧饼博客大佬打包的-nginx">烧饼博客大佬打包的 Nginx</h2><p>使用最新 OpenSSL 编译,支持 TLS 1.3, GeoIP2, brotli 压缩等</p><h3 id="使用方法">使用方法</h3><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><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">curl https://mirror.xtom.com/sb/nginx/public.key | apt-key add -<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;deb http://mirror.xtom.com/sb/nginx stretch main&quot;</span> &gt; /etc/apt/sources.list.d/sb-nginx.list<br>apt update<br>apt install nginx-extras<br></code></pre></td></tr></table></figure><p>安装成功后使用 <code>nginx -V</code> 查看信息</p><p>完成 Nginx 的安装后,接下来安装 rtmp 模块</p><h1 id="安装-rtmp-模块">安装 rtmp 模块</h1><p>debian 9 用户可以直接使用 apt 安装,需<strong>启用 stretch-backports 源</strong>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">apt install libnginx-mod-rtmp libnginx-mod-http-lua -t stretch-backports<br></code></pre></td></tr></table></figure><p>安装完成后,准备阶段就结束了,下面开始配置 Nginx。</p><h1 id="配置-nginx">配置 Nginx</h1><p>打开 nginx.conf 在文件中添加以下部分</p><figure class="highlight plaintext"><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><code class="hljs conf">rtmp &#123;#RTMP服务<br>    server&#123;<br>        listen 1935;#服务端口<br>        chunk_size 10240;#数据传输块的大小<br><br>        application live &#123;#直播<br>            live on;<br>            record off;<br>            on_publish http://YOUR_SERVERNAME:2080/auth;<br>            push rtmp://live.twitch.tv/app/YOUR_LIVE_API;#RTMP直播地址1<br>            push rtmp://a.rtmp.youtube.com/YOUR_LIVE_API;#RTMP直播地址2<br>         <br>        &#125;<br>    &#125;<br>&#125;  <br></code></pre></td></tr></table></figure><p>替换上方的 RTMP直播地址需要自己进行替换,现在我们完成了服务器上的分流部分</p><p>接下来,我们配置一个 http 服务器,此部分与平时配置网站 conf 的过程比较类似</p><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><code class="hljs conf">server &#123;<br>        listen 2080; #此处可自定义<br>        <br>        server_name YOUR_SERVERNAME;<br>        location /auth &#123;<br>            rewrite_by_lua &#x27;<br>                ngx.req.read_body()<br>                local name = ngx.req.get_post_args().name<br>                if (name == &quot;xxxYOUR_UUID&quot;) then<br>                    ngx.status = 200<br>                    ngx.say(&quot;OK&quot;)<br>                    ngx.exit(200)<br>                else<br>                    ngx.status = 403<br>                    ngx.say(&quot;Forbidden&quot;)<br>                    ngx.exit(403)<br>                end<br>            &#x27;;<br>        &#125;<br>    &#125;<br></code></pre></td></tr></table></figure><p>此处的 <code>xxxYOUR_UUID</code> 是我们使用 OBS 推流时候的&quot;流名称&quot;,可以使用 <a href="https://www.uuidgenerator.net/">UUID Generator</a> 进行生成。</p><p><strong>经测试不能加 TLS</strong></p><h1 id="测试-rtmp-服务器配置">测试 RTMP 服务器配置</h1><p>启动 Nginx 服务后,在服务器上执行下面的命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">curl -0 http://127.0.0.1:2080/auth -d <span class="hljs-string">&quot;name=xxxYOUR_UUID&quot;</span><br></code></pre></td></tr></table></figure><p><code>xxxYOUR_UUID</code> 替换成前面生成的 UUID,应该输出 OK,再把 <code>xxxYOUR_UUID</code> 换成一个错误的,应该输出 Forbidden。</p><h1 id="配置-obs-推流">配置 OBS 推流</h1><p>如果身份验证没有问题,我们就可以使用 OBS 来推流了。</p><p>在 OBS 设置中选择“<strong>自定义流媒体服务器</strong>”,URL 填入 <code>rtmp://YOUR_SERVERNAME/live</code> (<code>YOUR_SERVERNAME</code> 是推流服务器的 IP或域名), 流名称填入我们前面生成的 UUID。</p><p>设置好后单击 OBS上的“<strong>开始推流</strong>”,不出意外的话就可以同时向我们设置的平台推流了。</p><h2 id="参考文章">参考文章</h2><p><a href="https://dcc.cat/lemp/">Debian / Ubuntu 环境下 LEMP 建站解析</a></p><p><a href="https://github.com/arut/nginx-rtmp-module">arut/nginx-rtmp-module</a></p><p><a href="https://github.com/illuspas/nginx-rtmp-win32">illuspas/nginx-rtmp-win32</a></p><p><a href="https://blog.nanpuyue.com/2018/047.html">借助 Nginx 搭建带简单认证的直播推流服务器,实现多平台同步直播</a></p><p><a href="https://blog.52itstyle.com/archives/2254/">Nginx学习之配置RTMP模块搭建推流服务</a></p><p><a href="https://www.jianshu.com/p/3224341a205f">直播推流nginx-rtmp-module集成</a></p>]]></content>
  1241.    
  1242.    <summary type="html">
  1243.    
  1244.      &lt;p&gt;前一阵,在一位大佬的博客上曾看到过一篇类似的文章,最近突然有朋友想要多平台直播,又找不到之前的,便在网上搜集了一番,整理了一下。这样做的好处是,节省本地带宽,分发给多平台的步骤交给远端的服务器进行处理。
  1245.    
  1246.    </summary>
  1247.    
  1248.    
  1249.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  1250.    
  1251.      <category term="Linux" scheme="https://www.wevg.org/categories/Tech/Linux/"/>
  1252.    
  1253.    
  1254.      <category term="Nginx" scheme="https://www.wevg.org/tags/Nginx/"/>
  1255.    
  1256.      <category term="Debian" scheme="https://www.wevg.org/tags/Debian/"/>
  1257.    
  1258.      <category term="rtmp" scheme="https://www.wevg.org/tags/rtmp/"/>
  1259.    
  1260.      <category term="Live" scheme="https://www.wevg.org/tags/Live/"/>
  1261.    
  1262.  </entry>
  1263.  
  1264.  <entry>
  1265.    <title>为 SSH 连接添加两步认证</title>
  1266.    <link href="https://www.wevg.org/archives/ssh-add-mfa/"/>
  1267.    <id>https://www.wevg.org/archives/ssh-add-mfa/</id>
  1268.    <published>2018-12-05T07:16:39.000Z</published>
  1269.    <updated>2019-03-12T15:00:00.000Z</updated>
  1270.    
  1271.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>Google 两步认证,是 Google 公司提供的,一种增强账户安全性的方式。 它使用 TOTP 算法(基于时间的一次性密码算法)。<span id="more"></span>本文尤其感谢</p><h1 id="安装-google-pam">安装 Google PAM</h1><p>PAM(<em>Pluggable Authentication Module</em>) 是 Linux 系统上用于对用户进行身份验证的身份验证基础结构。由于 Google 制作了一个OATH-TOTP应用程序,他们还制作了一个生成 TOTP 的 PAM,并且与任何 OATH-TOTP应用程序(如 Google Authenticator 或 <a href="https://www.authy.com/">Authy</a> )完全兼容。<br>首先,更新 Debian 仓库缓存</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">apt update<br></code></pre></td></tr></table></figure><p>并安装 PAM</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">apt install libpam-google-authenticator<br></code></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><code class="hljs bash">google-authenticator<br></code></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">Do you want authentication tokens to be time-based (y/n) y<br></code></pre></td></tr></table></figure><p>您希望身份验证令牌是基于时间的吗? 回复 <code>y</code></p><p>⚠️<strong>此处将会显示二维码,请保证 Shell 窗口足够大,否则会显示错误</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">Your new secret key is: ABCDEFG<br></code></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><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash">Your verification code is 123456<br>Your emergency scratch codes are:<br>  12345678<br>  12345678<br>  12345678<br>  12345678<br>  12345678<br></code></pre></td></tr></table></figure><p>请保存好此处提供的5组应急恢复密钥,您可以在必要时使用</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">Do you want me to update your <span class="hljs-string">&quot;/root/.google_authenticator&quot;</span> file (y/n) y<br></code></pre></td></tr></table></figure><p>是否更新验证文件? 回复 <code>y</code></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><code class="hljs bash">Do you want to disallow multiple uses of the same authentication<br>token? This restricts you to one login about every 30s, but it increases<br>your chances to notice or even prevent man-in-the-middle attacks (y/n) y<br></code></pre></td></tr></table></figure><p>禁止同一时间使用同一个验证码登陆服务器,回复 <code>y</code></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><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash">By default, tokens are good <span class="hljs-keyword">for</span> 30 seconds. In order to compensate <span class="hljs-keyword">for</span><br>possible time-skew between the client and the server, we allow an extra<br>token before and after the current time. If you experience problems with<br>poor time synchronization, you can increase the window from its default<br>size of +-1min (window size of 3) to about +-4min (window size of<br>17 acceptable tokens).<br>Do you want to <span class="hljs-keyword">do</span> so? (y/n) n<br></code></pre></td></tr></table></figure><p>默认情况下,验证码有效期为30秒。因为时间可能不同步,可以将时间延长至4分钟 建议选择 <code>n</code> (默认30秒)</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><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">If the computer that you are logging into isn<span class="hljs-string">&#x27;t hardened against brute-force</span><br><span class="hljs-string">login attempts, you can enable rate-limiting for the authentication module.</span><br><span class="hljs-string">By default, this limits attackers to no more than 3 login attempts every 30s.</span><br><span class="hljs-string">Do you want to enable rate-limiting (y/n)</span><br></code></pre></td></tr></table></figure><p>限制尝试次数,每30秒最大可尝试3次,回复 <code>y</code> 启用</p><h1 id="配置-openssh">配置 OpenSSH</h1><p>编辑 sshd 文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">nano /etc/pam.d/sshd<br></code></pre></td></tr></table></figure><p>在文件底部添加以下内容</p><figure class="highlight plaintext"><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><code class="hljs conf"># Standard Un*x password updating.<br>@include common-password<br>auth required pam_google_authenticator.so nullok<br></code></pre></td></tr></table></figure><p><code>nullok</code> 最后一行末尾的单词告诉 PAM 这种身份验证方法是可选的。这允许没有 OATH-TOTP 令牌的用户仍然使用他们的 SSH 密钥登录。一旦所有用户都拥有 OATH-TOTP 令牌,您就可以 <code>nullok</code> 从此行中删除以强制使用MFA。</p><p>保存并关闭文件</p><p>接下来,配置 SSH 来支持两步认证。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">nano /etc/ssh/sshd_config<br></code></pre></td></tr></table></figure><p>找到 <code>ChallengeResponseAuthentication</code> 并设置为 <code>yes</code>。</p><figure class="highlight plaintext"><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><code class="hljs conf"># Change to yes to enable challenge-response passwords (beware issues with<br># some PAM modules and threads)<br>ChallengeResponseAuthentication yes<br></code></pre></td></tr></table></figure><p>保存并关闭文件,重新启动 SSH 来重新加载配置文件,<strong>不要关闭当前的连接,否则如果配置出现错误,您将无法连接到服务器</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">systemctl restart sshd.service<br></code></pre></td></tr></table></figure><p>此时新建一个 SSH 连接, 如果您之前已创建 SSH 密钥并正在使用它,则会注意到您无需输入用户密码或MFA验证码。这是因为默认情况下 SSH 密钥会覆盖所有其他身份验证选项。否则,您应该已经获得密码和验证码提示。</p><h1 id="配置两步认证">配置两步认证</h1><p>重新打开 <code>sshd</code> 配置文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">nano /etc/ssh/sshd_config<br></code></pre></td></tr></table></figure><p>在配置文件最下方添加如下内容,添加后连接服务器时需要有SSH key + 密码 或 SSH key + 验证码 (或者同时输入三项)</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs conf">UsePAM yes<br>AuthenticationMethods publickey,password publickey,keyboard-interactive<br></code></pre></td></tr></table></figure><p>保存并关闭文件,再次打开 PAM <code>sshd</code> 配置文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">nano /etc/pam.d/sshd<br></code></pre></td></tr></table></figure><p>找到 <code>@include common-auth</code> 在句首添加 # ,此举告诉服务器不要提示输入密码</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs conf"># Standard Un*x authentication.<br>#@include common-auth<br></code></pre></td></tr></table></figure><p>保存并关闭文件,重新启动 SSH 来重新加载配置文件,<strong>不要关闭当前的连接,否则如果配置出现错误,您将无法连接到服务器</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">systemctl restart sshd.service<br></code></pre></td></tr></table></figure><p>此时再次新建一个SSH连接, 与上次不同,SSH会要求您输入验证码。输入后,您将成功连接到服务器。即使您没有看到任何使用SSH密钥的迹象,您的登录尝试也会使用两个认证方式。如果要验证,可以在SSH命令后添加<code>-v</code> (for verbose)</p><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><code class="hljs conf"># Example SSH output\. . .<br>debug1: Authentications that can continue: publickey<br>debug1: Next authentication method: publickey<br>debug1: Offering RSA public key: /Users/sammy/.ssh/id_rsa<br>debug1: Server accepts key: pkalg rsa-sha2-512 blen 279<br>Authenticated with partial success.<br>debug1: Authentications that can continue: password,keyboard-interactive<br>debug1: Next authentication method: keyboard-interactive<br>Verification code:<br></code></pre></td></tr></table></figure><h1 id="添加三次认证-可选">添加三次认证 (可选)</h1><p>现在我们已经成功在 sshd_config 文件中添加并允许了以下认证方式:</p><ul><li>SSH key</li><li>密码</li><li>MFA 两步认证</li></ul><p>尽管我们允许了这三项,但是现在只能通过 SSH key 和 MFA 两步认证来连接到服务器,如果您希望同时启用上面的三种认证方式,修改 PAM 目录下的 <code>sshd</code> 配置文件,将我们之前在<code>@include common-auth</code> 前面添加的 <code>#</code> 删掉,并保存再重新加载 SSH 配置文件即可</p><p>到此,本文已经讲述了如何使用 SSH 密钥并同时启用基于时间的 MFA 一次性密码。下面会讲述如何恢复访问权限等内容</p><h1 id="恢复访问权限">恢复访问权限</h1><h2 id="同时丢失-ssh-key-和-mfa-认证">同时丢失 SSH key 和 MFA 认证</h2><p><strong>此情况下恢复访问权限,基于您能使用 VNC 或某些厂商提供的恢复模式的情况下</strong>,否则请直接去重装系统吧,或者回想一下是否有其他 sudo 账户</p><p>上文提到过的密钥和应急恢复代码保存在 <code>~/.google-authenticator</code> 文件中,第一行即为密钥,重新添加至 OTP 应用程序中即可,您也可以删除此文件(不再使用现有密钥),此时您可以使用单一认证方式登录,登陆后重新运行 <code>google-authenticator</code> 生成新的密钥</p><h2 id="仅丢失-otp">仅丢失 OTP</h2><p>您可以使用初次创建时,系统自动生成的应急恢复代码登录至服务器,每一个恢复代码仅可使用一次</p><h1 id="参考文章">参考文章</h1><p><a href="http://sam.xnet.tk/2014/09/ubuntu-2-factor-login-public-key-google-authenticator/">Ubuntu Two-Factor Login (public key + Google Authenticator)</a><br><a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-multi-factor-authentication-for-ssh-on-ubuntu-16-04">How To Set Up Multi-Factor Authentication for SSH on Ubuntu 16.04</a><br><a href="https://iluoy.com/articles/263">使用Google身份验证进行ssh二次验证</a><br><a href="http://blog.51cto.com/liumissyou/1716727">Google Authenticator安全配置ssh二次验证登录</a></p>]]></content>
  1272.    
  1273.    <summary type="html">
  1274.    
  1275.      &lt;p&gt;Google 两步认证,是 Google 公司提供的,一种增强账户安全性的方式。 它使用 TOTP 算法(基于时间的一次性密码算法)。
  1276.    
  1277.    </summary>
  1278.    
  1279.    
  1280.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  1281.    
  1282.      <category term="Linux" scheme="https://www.wevg.org/categories/Tech/Linux/"/>
  1283.    
  1284.    
  1285.      <category term="Secure" scheme="https://www.wevg.org/tags/Secure/"/>
  1286.    
  1287.      <category term="Google" scheme="https://www.wevg.org/tags/Google/"/>
  1288.    
  1289.      <category term="Linux" scheme="https://www.wevg.org/tags/Linux/"/>
  1290.    
  1291.      <category term="Debian" scheme="https://www.wevg.org/tags/Debian/"/>
  1292.    
  1293.      <category term="SSH" scheme="https://www.wevg.org/tags/SSH/"/>
  1294.    
  1295.      <category term="MFA" scheme="https://www.wevg.org/tags/MFA/"/>
  1296.    
  1297.  </entry>
  1298.  
  1299.  <entry>
  1300.    <title>CSGO FPS 终极优化指南</title>
  1301.    <link href="https://www.wevg.org/archives/csgo-fps-optimized/"/>
  1302.    <id>https://www.wevg.org/archives/csgo-fps-optimized/</id>
  1303.    <published>2018-12-04T07:16:39.000Z</published>
  1304.    <updated>2020-06-07T01:34:17.000Z</updated>
  1305.    
  1306.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>本教程将会通过修改和优化等等方式提升游戏帧数,进而提升游戏体验,且不仅限于 CS:GO ,亦可用于优化其他游戏。<span id="more"></span></p><blockquote><p>​前言: 此教程只针对于目前还使用 Source 2012引擎且优化并不算特别好的正式版 CSGO 游戏本体,日后游戏更新可能会发生一定变化。目录均采用超链接,可直接跳转。<br>如果希望掌握更多有关CSGO的调试知识可以参考另一篇<a href="https://www.wevg.org/archives/csgo-config-guide/">CSGO CFG 修改指南</a>对游戏进行更个人化的修改。<br>本文原作者为 SLA1NE 并由 POBJ 进行整理总结</p></blockquote><h1 id="win10-xbox-dvr-的关闭及系统设置">WIN10 XBOX DVR 的关闭及系统设置</h1><h2 id="关闭-xbox-dvr">关闭 XBOX DVR</h2><p>首先我们知道,在 Win10 更新了版本后,出现了 Xbox DVR 这个功能且默认开启。本意是为了方便记录游戏时的精彩瞬间,相当于录制截图工具的存在,但是对于 CSGO、DOTA2 这一类游戏却会导致帧数被锁定,而 CSGO 对FPS的要求极为严苛,个人认为没有 300 FPS 无法顺畅游戏。</p><p>那么因为 Win10 默认开启此功能,我们要如何关闭呢?</p><p>第一种就是就是登陆微软账户并打开 XBOX 软件<strong>关闭 DVR 滑钮</strong>,这里不做教程。</p><p>第二种就是使用我们提供好的一键关闭XBOX DVR脚本,运行并重启电脑后生效。</p><p><strong>2018-10-18</strong> 提供一键关闭 DVR 脚本 <a href="https://cloud.wevg.org/Blog/CS-GO/disableDVR.reg"><strong>点此下载</strong></a></p><figure class="highlight ini"><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></pre></td><td class="code"><pre><code class="hljs ini">Windows Registry Editor Version 5.00<br><span class="hljs-section">[HKEY_CURRENT_USER\System\GameConfigStore]</span><br><span class="hljs-attr">&quot;GameDVR_Enabled&quot;</span>=dword:<span class="hljs-number">0</span><br><span class="hljs-section">[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\GameDVR]</span><br><span class="hljs-attr">&quot;AllowGameDVR&quot;</span>=dword:<span class="hljs-number">0</span><br><span class="hljs-section">[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\ApplicationManagement\AllowGameDVR]</span><br><span class="hljs-attr">&quot;value&quot;</span>=dword:<span class="hljs-number">0</span><br></code></pre></td></tr></table></figure><p>至此,有关 Xbox 的关闭与卸载结束,我们接着说 Windows 系统的一些设置。</p><h2 id="电源设置">电源设置</h2><p>首先是电源设置,我们右键左下角 Windows 菜单,点击<strong>电源选项</strong>。</p><p><img src="https://i.yecdn.com/images/2019/01/05/aab765e1536a6ae2809ef254e728cc69.png" alt="电源选项"></p><p>然后会出现如此界面,这时我们点击<strong>其他电源设置</strong>,会出现电源选项的窗口,如图。</p><p><img src="https://i.yecdn.com/images/2019/01/05/268c520649c26249f5fc0b7dae1d7d29.png" alt="其他电源设置"></p><p><img src="https://i.yecdn.com/images/2019/01/05/5049715d308e274e868c2ea3b3181f93.png" alt="高性能"></p><p>我们直接切换到<strong>高性能</strong>即可,如果没有发现高性能,通常在下方的隐藏附加计划内。</p><p>​值得一提的是,使用一些国产软件的朋友可能会发现默认在使用X大师节能计划,这是很毒瘤很垃圾很差劲的东西,<strong>请务必不要使用!<strong>此类电源计划表面标称能在节能的同时保留完整的性能,但当我们打开编辑选项查看时,发现它直接</strong>将 CPU 限制到75%的状态</strong>,此时就会造成游戏卡顿,帧数低的状况。</p><h2 id="系统优化设置">系统优化设置:</h2><h3 id="关闭占用系统资源的服务">关闭占用系统资源的服务</h3><p>关闭服务的方法是,<kbd>Win</kbd> 和 <kbd>R</kbd> 调出运行对话框,输入 “<code>services.msc</code>” 启动服务面板,接下来输入要禁用的服务首字母,最后双击“<strong>禁用</strong>”即可。</p><ul><li>Connected User Experiences and Telemetry: 用于收集错误信息,对于硬盘消耗较大,是很多低配电脑卡顿的元凶。</li><li>Diagnostic Execution Service: 诊断执行服务,用以执行故障诊断支持的诊断操作,效果类似 Connected User Experiences and Telemetry 。</li><li>SysMain: 即以前的<br>SuperFetch,对于机械硬盘有一定作用,但固态硬盘作用不大,而且常常是导致 CPU 占用飙升 100% 的元凶。如果您使用的硬盘是且仅为 SSD 的话,且物理内存较大,可以考虑关闭。</li><li>Windows Search: Windows<br>搜索服务,作用是实现文件的快速搜索。不过这是一项经常在系统后台”查水表”的服务,很多时候电脑待机时硬盘灯长亮就是它的“功劳”。此外 Win10 新版中的“活动历史记录”也依赖于该服务。如果安装的是 SSD ,且对“ 活动历史记录 ”无感可以考虑关闭,尤其对于低配电脑,性能提升非常明显。</li></ul><h3 id="关闭界面特效">关闭界面特效</h3><p>Windows 10 中加入了很多特效,这使得一些低端机在运行这款操作系统时非常卡顿。其实很多特效并不需要完全加载,尤其是一些淡入淡出效果,在实际使用中视觉感差异不大,反而相当消耗资源。关闭它们,可以在保持系统外观基本不变的情况下,大幅提升流畅度。</p><p>关闭方法: 此电脑-属性-高级系统设置-高级-性能-设置</p><h3 id="关闭系统设置中的后台应用">关闭系统设置中的后台应用</h3><p>打开 Windows 设置 - 隐私 - 后台应用<br>在这里关闭绝大多数的后台应用,这里我稳妥起见留下了NVIDIA control panel, Realtek Audio Console 等。此处具体的开关因人而异。</p><p><img src="https://static.hit.moe/blog/images/uploads/ApplicationFrameHost.png" alt="后台应用设置"></p><p>禁止关闭 Google Chrome 后继续运行后台应用<br><img src="https://static.hit.moe/blog/images/uploads/chrome.png" alt="后台应用设置"></p><h3 id="更新驱动">更新驱动</h3><p>从官方网站下载你最新的主板芯片组驱动,虽然 Windows 10 会装一部分驱动,能保证系统的基本运行,但是为了更好的性能,还是建议自行去官方网站下载最新的驱动。</p><blockquote><p>绝对绝对不要使用驱动精灵等程序安装驱动,可能导致您的系统不稳定</p></blockquote><p>在 Intel 官方网站下载最新的 Intel Management Engine Driver,这将会给你的 CPU 带来更多的稳定性与性能,我经常忘记装 ME,这也就导致了 CSGO 的卡顿。</p><blockquote><p>仅适用于 Intel 的处理器</p></blockquote><h3 id="在-bios-中禁用-hpet-高精度事件计时器">在 BIOS 中禁用 HPET(高精度事件计时器)</h3><p>​HPET 是现代 Windows 版本中的硬件计时器。这是一项在 Bios 中的选项,具体的作用可以自行查询,这里推荐是在 Windows 7 下禁用 HPET,在 Windows 10 下启用 HPET。(默认即为启用)</p><h3 id="在-discord-中禁用硬件加速">在 Discord 中禁用硬件加速</h3><p>如果使用 <strong>Discord overlay</strong> ,请单击齿轮 turn(应用程序设置)&gt; 外观 &gt; 硬件加速关闭硬件加速</p><h1 id="nvidia-显卡驱动内优化">NVIDIA 显卡驱动内优化</h1><p>​Nvidia显卡驱动内的调试相对比较简单,部分选项可能会因为显卡高低端型号,而有差别,但大致一样。</p><p>​首先我们打开 <strong>NVIDIA 控制面板</strong>选择<strong>管理 3D 设置</strong>,然后切换到<strong>程序设置</strong>,这样是为了<strong>只修改 CSGO 的设置而不影响其他程序</strong>。</p><p>​这里直接放出笔者修改过后的图,然后再逐一讲解。</p><p><img src="https://i.yecdn.com/images/2019/01/05/10e56f793e3ca8fd6a6e3bb729965cde.png" alt="NVIDIA 控制面板"></p><p><img src="https://i.yecdn.com/images/2019/01/05/0efa242d369b9c763d095d3f6e392777.png" alt="NVIDIA 控制面板"></p><p>​那么现在来逐一讲解。</p><ol><li>”CUDA-GPUs” 是使用CUDA流处理器的选择,一般大家都是单显卡,所以默认是<strong>全部</strong>,如果是多卡交火,全部选上就可以了。</li><li>“三重缓冲” : <strong>关闭</strong>。</li><li>“各项异性过滤” : <strong>关闭</strong>。</li><li>“垂直同步” : <strong>关闭</strong>。</li><li>“多帧采样AA(MFAA)” : <strong>关闭</strong>。</li><li>“平滑处理-模式” : 我们选择<strong>应用程序控制</strong>的,这样在游戏里的一些抗锯齿设置就会生效。</li><li>“平滑处理-灰度纠正” : <strong>关闭</strong>。</li><li>“平滑处理-透明度” : <strong>关闭</strong>。</li><li>“低延迟模式/最大预渲染帧数(旧版本驱动)”: 在较新的驱动中 NVIDIA 将最大预渲染帧数改为了低延迟模式, 以前的预渲染帧数选项 <code>1</code> 变为了现在的低延迟模式 <code>开</code> ,新加入的极致选项为预渲染帧数 <code>0</code> ,这并不稳定所以推荐大家改为 <strong>开</strong> 。</li><li>“环境光吸收” : <strong>关闭</strong>。</li><li>“电源管理模式” : <strong>最高性能优先</strong></li><li>“着色缓存器” : 开/关<strong>视情况而定</strong>,显卡默认的着色缓存是位于我们的系统盘也就是C盘的。所以如果你的系统盘是固态硬盘(即SSD)打开这个选项将会提升FPS,如果你的系统盘是普通机械硬盘那么建议关闭此选项。(有争议,可以选择自行调试)</li><li>“纹理过滤-三线性优化” : <strong>开启</strong>。</li><li>“纹理过滤-各向异性采样优化” : <strong>开启</strong>。</li><li>“纹理过滤-负LOD偏移” : 此项开启关闭<strong>对游戏无影响</strong>,默认为关闭。</li><li>“纹理过滤-质量” : <strong>高性能</strong>。</li><li>“线程优化” : <strong>开</strong>,现在主流的游戏电脑都已经使用i5、i7的CPU,基本上都是4线程或线程CPU,而CSGO的FPS主要取决于CPU。所以开启此项利用CPU所有线程将提高FPS。</li><li>“虚拟现实预渲染帧数” : <strong>建议调为1</strong>,很显然CSGO不是VR游戏,所以没有开高的必要。</li><li>“首选刷新率” : <strong>最高可用/由应用控制的</strong>”</li></ol><p>CSGO 是一款12年发行的采用 DirectX9 的游戏,现如今主流的中高端显卡的性能玩 CSGO 完全够用甚至饱和。所以显卡不愿意工作,会出现在游戏时显卡始终处于低负载导致的FPS低下。</p><p>解决问题的方法就是将<strong>电源管理模式</strong>调为<strong>最高性能优先</strong>,这样在游戏时就能强制显卡工作,达到相应的性能,提升FPS明显。</p><p>现在很多玩家的显示器都是 144hz 甚至 240hz 的电竞显示器,但是当你的输出FPS达不到显示器的需要 FPS(60HZ-150FPS,120HZ-280FPS,144HZ-300FPS,240HZ-300+FPS 为需求)的情况下可以考虑降低显示器的刷新率以达到更稳定的输入延迟与体验,在此种情况下会在启动项中加入 <code>-freq</code> 为开头的指令,使用由应用控制的这个选项的话更为适合。</p><p>至此,关于显卡设置的章节结束。</p><h1 id="csgo-启动项以及游戏内设置">CSGO 启动项以及游戏内设置</h1><h2 id="csgo-启动项推荐设置">CSGO 启动项推荐设置</h2><p>​目前的启动项基本上已经没有几条是有有效的,有效的参数只有下面这些</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs conf">-freq 144 -tickrate 128 -novid -nojoy  -language english<br></code></pre></td></tr></table></figure><p>​老的三条/四条去加速指令在 CSGO 初期其实就已经无效了,在近几年的职业选手中也会发现,越来越少的人会使用这几条参数了</p><blockquote><p>-novid : <strong>禁用开场动画</strong>: 能够节省你生命中宝贵的几秒钟</p><p>-no-browser : <strong>禁用游戏内浏览器</strong></p><p>-freq : <strong>锁定</strong>你的<strong>刷新率</strong></p><p>-nojoy : 禁用摇杆,没什么用,能够使<strong>小幅度释放内存</strong></p><p>+fps_max XXX (1-999) : <strong>修改</strong>你的 <strong>FPS 上限</strong>,999 是最高,比0在某些时候更高一些,也有一些职业选手会锁定为300或500</p><p>-tickrate 128 : 在你单机开图或者是5E对战的时候<strong>变成 128 tick</strong></p><p>-console : 当你在打开游戏试<strong>自动打开控制台</strong></p><p>-high / -highpriority : 可以<strong>提升</strong>你 <strong>CSGO</strong> 的处理<strong>优先等级</strong>,和在任务管理器中把优先级调高,有时候会导致系统错乱(我没遇到过)但是的确可以提高游戏稳定性</p><p>-language english : 将游戏的<strong>语言改为英文</strong>,CSGO 对于其他语言的兼容性有一定问题,在换了英文输入法之后感觉游戏的流畅度有一定提升,排版也更加正常了。</p></blockquote><h2 id="游戏内设置">游戏内设置</h2><p><img src="https://i.yecdn.com/images/2019/01/05/b5d9dcd587ebd9302ed803d6db777492.jpg" alt="游戏内设置"></p><h3 id="视频设置">视频设置</h3><p>​先来说视频设置。</p><p>​首先,纵横比和分辨率主要看个人喜好。但是对低配的玩家来说,还是建议 4:3 的分辨率之下选择自己看着舒服的分辨率。</p><p>​因为分辨率低了可以减少要渲染的画面点数,会提升 FPS 。</p><p>​接着,我们说说显示模式,想达到最高的FPS肯定是以<strong>全屏模式</strong>运行最好,如果使用窗口化(包括全屏窗口)会自动强制打开三重缓冲和8X的过滤,会大幅度增加输入延迟,想要好好玩游戏必须关闭</p><p>​笔记本<strong>节能模式</strong>,是必须<strong>关掉</strong>的,想必也不会有人开。</p><p>​接着来说下面的高级视频效果。</p><ol><li>“全局阴影效果” : <strong>非常低</strong>,这个开啥都没区别。</li><li>“模型/贴图细节” : 这个可以开高,基本<strong>不影响FPS</strong>,强迫症也可以关闭。</li><li>“效果细节” : 建议<strong>最低</strong>,这个主要是玻璃木板碎掉的一些特效,开低玩根本感觉不出什么。</li><li>“光影细节” : [针对全景UI更新]建议开最低以降低游戏时的掉帧感,针对老旧配置尤其有效。</li><li>“多核渲染” : 一定要<strong>开启</strong>, CSGO 这个游戏比较依赖CPU,所以一定要全利用上。</li><li>“多重采样抗锯齿模式” : 这里可以选择<strong>关到最低</strong>以提高FPS,因为笔者配置比较高且很受不了狗牙效应所以开了8X MSAA。值得一提的是,刚才显卡设置内的“平滑处理-模式”选择<strong>应用程序控制</strong>的就会体现在这。</li><li>“贴图过滤模式” : 推荐设为最低,也就是<strong>双线性</strong>,这也是为什么在显卡设置中关闭三线性的原因。</li><li>“快速近似抗锯齿” : 建议<strong>禁用</strong>,虽然在现在电脑配置都不低的情况下这个选开启并不会降低很多FPS,但是可能会引起游戏卡顿,故关闭。</li><li>“等待垂直同步” : 必须<strong>关闭</strong>(增加输入延迟)。</li><li>“动态模糊” : 建议<strong>禁用</strong>,看着头晕并且确实会让你玩不好这个游戏。</li></ol><h3 id="音频设置">音频设置</h3><p>​接下来说音频设置里需要注意的一个地方。</p><p><img src="https://i.yecdn.com/images/2019/01/05/356f1e8fd6ab853c9e87a8d70825345d.jpg" alt="音频设置"></p><p>​想获得最大 FPS , <strong>请不要将音频输出配置的 HRTF 音效开启。</strong></p><p>​这种新技术占用的系统资源还比较多,虽然确实可以改善在上下结的声音辨识度吗,但是立体声耳机听声辩位能力也很好。但如果电脑配置很好的话也可以开启。</p><p>​至此,CSGO 启动项以及游戏内设置章节结束。</p><h1 id="关于游戏更新后-fps-变低或-fps-不低但有卡顿感的解决办法">关于游戏更新后 FPS 变低或 FPS 不低但有卡顿感的解决办法</h1><p>​很多时候,我们经常遇见 CSGO 更新后FPS突然变低,但下一次更新或一段时间过后又变回去的情况。</p><p>​虽然这种情况大多是因为更新了新内容过后游戏开发人员没有去做一下优化(又称修复了 FPS 过高的 BUG XD),但我们依然有一些或多或少能缓解的办法。</p><p>​首先,我们还是将键盘上的 <kbd>Win</kbd> 和 <kbd>R</kbd> 键一起按下,呼出运行对话框。只不过这次我们输入的是<code>steam://flushconfig</code></p><p><img src="https://i.yecdn.com/images/2019/01/05/23392f1a61816b5cd4384e52c7ec63aa.png" alt="steam://flushconfig"></p><p>​如图。在我们单击确定后, Steam 会自动重启并询问是否要清除下载缓存。我们只要单击并重新登陆 Steam 即可,游戏内可以发现,画面流畅感明显(也可能不明显)比操作之前提升了。</p><p>​</p><p>​至此,关于游戏更新后FPS变低或FPS不低但有卡顿感的解决办法教程结束。</p><h1 id="最后是一些小技巧">最后是一些小技巧</h1><h2 id="关闭鼠标加速度">关闭鼠标加速度</h2><p>​关于去掉鼠标加速的问题,即使在开启鼠标原始输入的情况下,CSGO 还是会受到很多 Windows 设置的影响,所以说我们尽量要减小系统等因素对游戏准星移动的影响来达到更好的发挥</p><p>​在 Win10 中在搜索里输入控制面板,打开之后打开<strong>鼠标</strong></p><p><img src="https://i.yecdn.com/images/2019/02/26/8bd6b031819a495ab3012dda0cafb73f.png" alt="鼠标"></p><p>​像我这样设置,桌面鼠标速度会影响你游戏内的轨迹,速度要在默认档位 6/11,高了会带有加速度,向更低的档位移动没有问题,<strong>提高精准度关闭</strong>。<br>另外的部分在我们的另一篇<a href="https://www.wevg.org/archives/csgo-config-guide/">CSGO CFG 修改指南</a>中有说明。</p><p>​在<strong>轻松访问中心</strong>里将设置确认为这样</p><p><img src="https://i.yecdn.com/images/2019/01/05/2a79e12187d4e7dddb38596d1a72cbd8.png" alt="轻松访问中心"></p><p>​注:以上所有情况均由笔者反复调试,摸索得出,可能不会100%符合每个人的情况,但90%的情况下有一定作用。</p><p>​部分方法与图片来源于互联网,在这里表示感谢。</p>]]></content>
  1307.    
  1308.    <summary type="html">
  1309.    
  1310.      &lt;p&gt;本教程将会通过修改和优化等等方式提升游戏帧数,进而提升游戏体验,且不仅限于 CS:GO ,亦可用于优化其他游戏。
  1311.    
  1312.    </summary>
  1313.    
  1314.    
  1315.      <category term="Gaming" scheme="https://www.wevg.org/categories/Gaming/"/>
  1316.    
  1317.      <category term="CS:GO" scheme="https://www.wevg.org/categories/Gaming/CS-GO/"/>
  1318.    
  1319.    
  1320.      <category term="优化" scheme="https://www.wevg.org/tags/%E4%BC%98%E5%8C%96/"/>
  1321.    
  1322.      <category term="设置" scheme="https://www.wevg.org/tags/%E8%AE%BE%E7%BD%AE/"/>
  1323.    
  1324.      <category term="fps" scheme="https://www.wevg.org/tags/fps/"/>
  1325.    
  1326.      <category term="Xbox DVR" scheme="https://www.wevg.org/tags/Xbox-DVR/"/>
  1327.    
  1328.      <category term="Nvidia" scheme="https://www.wevg.org/tags/Nvidia/"/>
  1329.    
  1330.      <category term="启动项" scheme="https://www.wevg.org/tags/%E5%90%AF%E5%8A%A8%E9%A1%B9/"/>
  1331.    
  1332.      <category term="Steam" scheme="https://www.wevg.org/tags/Steam/"/>
  1333.    
  1334.  </entry>
  1335.  
  1336.  <entry>
  1337.    <title>为 Telegram Desktop 替换字体</title>
  1338.    <link href="https://www.wevg.org/archives/change-telegram-fonts/"/>
  1339.    <id>https://www.wevg.org/archives/change-telegram-fonts/</id>
  1340.    <published>2017-12-20T06:46:10.000Z</published>
  1341.    <updated>2019-03-12T15:00:00.000Z</updated>
  1342.    
  1343.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>无需 MacType,替换 Telegram 字体。本文旨在指导诸位通过 TGFont 来提升 <strong>Telegram</strong> 的使用体验。<span id="more"></span></p><blockquote><p><strong>⚠️⚠️请转步至 2.0 版本 <a href="https://www.wevg.org/archives/change-fonts-with-fontmod/">替换 Telegram 字体 (新玩具)</a></strong></p></blockquote><p>Telegram 的客户端一直有一个问题——就是字体,它默认使用的字体是 Simsun(宋体),看起来非常的不舒服,先来对比一下修改前后的效果<br><strong>修改前:</strong><br><img src="https://i.yecdn.com/images/2019/01/05/6b7e79d1aa44a3ffbdab13ff01e4fbfc.png" alt="修改前"><br><strong>修改后:</strong><br><img src="https://i.yecdn.com/images/2019/01/05/460427592ae21174bb470f9255207cfd.png" alt=""></p><p>下面是<strong>修改方法</strong>:</p><ol><li><p>下载 <a href="https://github.com/ysc3839/FontMod/releases/tag/1.7">TGFont.dll</a> (下载地址 <a href="https://github.com/ysc3839/FontMod/releases/tag/1.7">https://github.com/ysc3839/FontMod/releases/tag/1.7</a>), 改名为 <code>winmm.dll</code> 并放入 Telegram Desktop 的根目录(可_直接在资源管理器地址栏输入_ <code>%AppData%\Telegram Desktop</code> )。</p></li><li><p><strong>重启 Telegram</strong>,这时 Telegram Desktop 目录中会出现 json 文件,默认只会把宋体替换成微软雅黑,当然也可以修改 <code>TGFont.json</code> 来更换其他字体,下面的配置可以替换 TG 界面上用到的所有字体。此处推荐使用 NotePad++(下载地址 <a href="https://notepad-plus-plus.org/download/">https://notepad-plus-plus.org/download/</a> ),使用记事本的话,所有的代码都挤在了一起つ﹏⊂</p></li></ol><figure class="highlight json"><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></pre></td><td class="code"><pre><code class="hljs json"> &#123; <span class="hljs-attr">&quot;fonts&quot;</span>: <br>    &#123; <span class="hljs-attr">&quot;SimSun&quot;</span>: <br>        &#123; <span class="hljs-attr">&quot;replace&quot;</span>: <br>            <span class="hljs-string">&quot;Microsoft YaHei UI&quot;</span>, <br>            <span class="hljs-attr">&quot;#size&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#width&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#weight&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#italic&quot;</span>: <span class="hljs-literal">false</span>, <br>            <span class="hljs-attr">&quot;#underLine&quot;</span>: <span class="hljs-literal">false</span>, <br>            <span class="hljs-attr">&quot;#strikeOut&quot;</span>: <span class="hljs-literal">false</span> <br>        &#125;, <br><br>        <span class="hljs-attr">&quot;Open Sans&quot;</span>: &#123; <br>            <span class="hljs-attr">&quot;replace&quot;</span>: <span class="hljs-string">&quot;Microsoft YaHei UI&quot;</span>, <br>            <span class="hljs-attr">&quot;#size&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#width&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#weight&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#italic&quot;</span>: <span class="hljs-literal">false</span>, <br>            <span class="hljs-attr">&quot;#underLine&quot;</span>: <span class="hljs-literal">false</span>, <br>            <span class="hljs-attr">&quot;#strikeOut&quot;</span>: <span class="hljs-literal">false</span> <br>        &#125;, <br>        <span class="hljs-attr">&quot;Open Sans Semibold&quot;</span>: &#123; <br>            <span class="hljs-attr">&quot;replace&quot;</span>: <span class="hljs-string">&quot;Microsoft YaHei UI&quot;</span>, <br>            <span class="hljs-attr">&quot;#size&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#width&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#weight&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#italic&quot;</span>: <span class="hljs-literal">false</span>, <br>            <span class="hljs-attr">&quot;#underLine&quot;</span>: <span class="hljs-literal">false</span>, <br>            <span class="hljs-attr">&quot;#strikeOut&quot;</span>: <span class="hljs-literal">false</span> <br>        &#125;, <br>        <span class="hljs-attr">&quot;Arial&quot;</span>: &#123; <br>            <span class="hljs-attr">&quot;replace&quot;</span>: <span class="hljs-string">&quot;Microsoft YaHei UI&quot;</span>, <br>            <span class="hljs-attr">&quot;#size&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#width&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#weight&quot;</span>: <span class="hljs-number">0</span>, <br>            <span class="hljs-attr">&quot;#italic&quot;</span>: <span class="hljs-literal">false</span>, <br>            <span class="hljs-attr">&quot;#underLine&quot;</span>: <span class="hljs-literal">false</span>, <br>            <span class="hljs-attr">&quot;#strikeOut&quot;</span>: <span class="hljs-literal">false</span> <br>        &#125; <br>            &#125;, <br>            <span class="hljs-attr">&quot;debug&quot;</span>: <span class="hljs-literal">false</span> <br>&#125;<br></code></pre></td></tr></table></figure><blockquote><p>** 参数说明 **<br><strong>replace</strong>: 要替换的字体<br><strong>debug</strong>: Debug 模式 (将会创建 TGFont.log)<br><strong>以下为可选参数</strong><br><strong>size</strong>: 控制字体大小<br><strong>width</strong>: 控制字体宽度<br><strong>weight</strong> : 控制字体字重<br><strong>italic</strong> :是否开启斜体<br><strong>underLine</strong> :是否加入下划线<br><strong>strikeOut</strong> :是否加入删除线</p></blockquote><p>至此,字体替换完成</p>]]></content>
  1344.    
  1345.    <summary type="html">
  1346.    
  1347.      &lt;p&gt;无需 MacType,替换 Telegram 字体。本文旨在指导诸位通过 TGFont 来提升 &lt;strong&gt;Telegram&lt;/strong&gt; 的使用体验。
  1348.    
  1349.    </summary>
  1350.    
  1351.    
  1352.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  1353.    
  1354.    
  1355.      <category term="字体" scheme="https://www.wevg.org/tags/%E5%AD%97%E4%BD%93/"/>
  1356.    
  1357.      <category term="Font" scheme="https://www.wevg.org/tags/Font/"/>
  1358.    
  1359.      <category term="Github" scheme="https://www.wevg.org/tags/Github/"/>
  1360.    
  1361.  </entry>
  1362.  
  1363.  <entry>
  1364.    <title>TeamSpeak 服务器搭建方法</title>
  1365.    <link href="https://www.wevg.org/archives/teamspeak-server-build/"/>
  1366.    <id>https://www.wevg.org/archives/teamspeak-server-build/</id>
  1367.    <published>2017-08-28T14:08:46.000Z</published>
  1368.    <updated>2021-03-06T10:31:17.000Z</updated>
  1369.    
  1370.    <content type="html"><![CDATA[<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><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>本文介绍 TeamSpeak 服务器端搭建方法 ,TeamSpeak (简称TS) 是一套专有的VoIP软件<span id="more"></span>,使用者可以用耳机和麦克风,通过客户端软件连线到指定的服务器,与在服务器内频道的其他使用者进行通话。是一种很像电话会议的方式。 通常 TeamSpeak 的使用者大多为多人连线游戏的玩家,与同队伍的玩家进行通讯。在游戏的对战方面,语音对话通讯具有竞争优势。</p><blockquote><p>如果您想找一个最快最简单的搭建方法,请参考 <a href="/archives/teamspeak-server-via-docker/">使用 Docker 搭建 TeamSpeak 服务器</a>。除此之外的更多情况下,我更推荐按照本文来进行搭建。</p></blockquote><p><strong>请务必从官网下载最新版本服务端,否则可能会出现无法连接至服务器的情况</strong><br>TeamSpeak 官网 <a href="https://www.teamspeak.com">teamspeak.com</a></p><h1 id="准备阶段">准备阶段</h1><p>本部分以装有 Debian 10 x64 系统为例,其他系统搭建方法类似。</p><blockquote><p><span style="color:#DB4D6D;"><strong>为了保证系统的安全,不要使用 root 账户安装并配置TS服务器</strong></span></p></blockquote><p>执行一下系统更新操作:</p><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm">apt update &amp;&amp; apt full-upgrade -y<br>apt <span class="hljs-keyword">install </span>curl vim wget git sudo unzip apt-transport-https <span class="hljs-keyword">screen </span>ca-certificates <span class="hljs-keyword">dialog </span>softw<br></code></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><code class="hljs bash">useradd teamspeak<br></code></pre></td></tr></table></figure><p>切换至 /opt录下</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> /opt<br></code></pre></td></tr></table></figure><p>复制并解压TS服务器端文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">wget https://files.teamspeak-services.com/releases/server/3.12.0/teamspeak3-server_linux_amd64-3.12.0.tar.bz2 &amp;&amp; tar -xjvf teamspeak3-server_linux_amd64-3.12.0.tar.bz2 &amp;&amp; rm teamspeak3-server_linux_amd64-3.12.0.tar.bz2<br></code></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><code class="hljs bash">chown -R teamspeak:teamspeak teamspeak3-server_linux_amd64 &amp;&amp; <span class="hljs-built_in">cd</span> /opt/teamspeak3-server_linux_amd64 &amp;&amp; su teamspeak<br></code></pre></td></tr></table></figure><h2 id="同意许可条款">同意许可条款</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">touch .ts3server_license_accepted<br></code></pre></td></tr></table></figure><blockquote><p>您可以选择以下任意一种搭建方式进行搭建,若您不理解这些方式的区别,请直接使用第一种搭建方式,即使用 SQLite 搭建</p></blockquote><h2 id="数据库配置">数据库配置</h2><h3 id="方式一-使用-sqlite-搭建">方式一: 使用 SQLite 搭建</h3><p>因 TeamSpeak 默认使用 SQLite, 所以直接执行以下操作即可自动配置,并启动服务器</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">./ts3server_startscript.sh start<br></code></pre></td></tr></table></figure><blockquote><p>注意保存密钥及 ServerQuery 管理员账户和密码</p></blockquote><p><img src="https://i.yecdn.com/images/2019/01/05/470060848e9bcfcf7e49aa9deed1008f.png" alt=""></p><h3 id="方法二:使用-mysql-mariadb-数据库搭建">方法二:使用 MySQL/MariaDB 数据库搭建</h3><ol><li>首先使用 root 登录 MySQL/MariaDB</li></ol><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql">mysql <span class="hljs-operator">-</span>u root <span class="hljs-operator">-</span>p <br></code></pre></td></tr></table></figure><ol start="2"><li>会提示输入密码,输入密码登陆后,创建一个名为 teamspeak 的数据库</li></ol><blockquote><p>数据库名,用户名和密码请自行修改,此处以数据库名 <code>teamspeak_database</code>,用户名 <code>teamspeak_user</code> 及密码 <code>teamspeak_password</code> 为例</p></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> DATABASE teamspeak_database <span class="hljs-keyword">DEFAULT</span> <span class="hljs-type">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8mb4 <span class="hljs-keyword">COLLATE</span> utf8mb4_general_ci; <br></code></pre></td></tr></table></figure><ol start="3"><li>创建一个叫做 <code>teamspeak_user</code> 的用户,使用强大的密码并且赋予 <code>teamspeak_database</code> 数据库权限</li></ol><p>由于手机端的流行,我们已经不再使用 <code>utf-8</code> 编码,而改用 <code>utf8mb4</code> 这样我们就可以在 MySQL 数据库里储存 emoji 表情了。你甚至可以尝试使用 emoji 作为用户名或者密码。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">GRANT</span> <span class="hljs-keyword">ALL</span> <span class="hljs-keyword">ON</span> teamspeak_database.<span class="hljs-operator">*</span> <span class="hljs-keyword">TO</span> <span class="hljs-string">&#x27;teamspeak_user&#x27;</span>@<span class="hljs-string">&#x27;localhost&#x27;</span> IDENTIFIED <span class="hljs-keyword">BY</span> <span class="hljs-string">&#x27;teamspeak_password&#x27;</span>; <br></code></pre></td></tr></table></figure><blockquote><p>这里请将密码 <code>teamspeak_password</code> 改成你要设置的强大的没人能猜出来的随机的密码</p></blockquote><p>终端会提示类似 Query OK, 0 rows affected, 1 warning 不用去管它</p><ol start="4"><li>刷新权限,没问题就可以退出结束安装了</li></ol><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql">FLUSH PRIVILEGES;<br>EXIT;<br></code></pre></td></tr></table></figure><blockquote><p>进行后续步骤前,首先确保您已经安装 MySQL/MariaDB, 且已经创建好数据库</p></blockquote><ol start="5"><li>创建 <code>ts3server.ini</code> 文件,以启用数据库插件</li></ol><blockquote><p>若您已经使用的是 MySQL 数据库, 请将 <code>dbpluginparameter=ts3db_mariadb.ini</code> 部分修改为<br><code>dbpluginparameter=ts3db_mysql.ini</code></p></blockquote><figure class="highlight ini"><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></pre></td><td class="code"><pre><code class="hljs ini">cat &gt; ts3server.ini &lt;&lt; EOF<br><span class="hljs-attr">dbplugin</span>=ts3db_mariadb <br><span class="hljs-attr">dbpluginparameter</span>=ts3db_mariadb.ini <br><span class="hljs-attr">dbsqlpath</span>=sql/ <br><span class="hljs-attr">dbsqlcreatepath</span>=create_mariadb/ <br><span class="hljs-attr">dbconnections</span>=<span class="hljs-number">10</span><br></code></pre></td></tr></table></figure><ol start="6"><li>新建 <code>ts3db_mariadb.ini</code> 文件并输入如下内容</li></ol><blockquote><p>若您已经使用的是 MySQL 数据库, 请创建<code>ts3db_mysql.ini</code> , 不要创建 <code>ts3db_mariadb.ini</code> 文件</p></blockquote><figure class="highlight ini"><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></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-section">[config]</span> <br><span class="hljs-attr">server</span>=<span class="hljs-string">&#x27;localhost&#x27;</span> <br><span class="hljs-attr">port</span>=<span class="hljs-string">&#x27;3306&#x27;</span><br><span class="hljs-attr">username</span>=<span class="hljs-string">&#x27;teamspeak_user&#x27;</span> <br><span class="hljs-attr">password</span>=<span class="hljs-string">&#x27;teamspeak_password&#x27;</span> <br><span class="hljs-attr">database</span>=<span class="hljs-string">&#x27;teamspeak_database&#x27;</span><br></code></pre></td></tr></table></figure><blockquote><p>将 数据库名 <code>teamspeak_database</code>,用户名 <code>teamspeak_user</code> 及密码 <code>teamspeak_password</code> 部分修改为您自己数据库的信息</p></blockquote><ol start="7"><li>将 redist 目录下的 <code>libmariadb.so.2</code> 文件拷贝至当前目录下</li></ol><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">cp redist<span class="hljs-regexp">/libmariadb.so.2 ./</span><br></code></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><code class="hljs bash">./ts3server_startscript.sh start inifile=ts3server.ini<br></code></pre></td></tr></table></figure><blockquote><p>注意保存密钥及 ServerQuery 管理员账户和密码</p></blockquote><h2 id="设置自启动">设置自启动</h2><p>创建并编辑文件 <code>/lib/systemd/system/teamspeak.service</code></p><blockquote><p><strong>此步骤需要root权限</strong></p></blockquote><figure class="highlight ini"><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></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-section">[Unit]</span><br><span class="hljs-attr">Description</span>=Teamspeak, The most superior <span class="hljs-literal">on</span>line voice communication solution.<br><span class="hljs-attr">Wants</span>=network-<span class="hljs-literal">on</span>line.target<br><span class="hljs-attr">After</span>=syslog.target network.target network-<span class="hljs-literal">on</span>line.target<br><br><span class="hljs-section">[Service]</span><br><span class="hljs-attr">User</span>=teamspeak<br><span class="hljs-attr">Group</span>=teamspeak<br><span class="hljs-attr">WorkingDirectory</span>=/opt/teamspeak3-server_linux_amd64/<br><span class="hljs-attr">ExecStart</span>=/opt/teamspeak3-server_linux_amd64/ts3server_startscript.sh start<br><span class="hljs-attr">ExecStop</span>=/opt/teamspeak3-server_linux_amd64/ts3server_startscript.sh stop<br><span class="hljs-attr">PIDFile</span>=/opt/teamspeak3-server_linux_amd64/ts3server.pid<br><span class="hljs-attr">Type</span>=forking<br><br><span class="hljs-section">[Install]</span><br><span class="hljs-attr">WantedBy</span>=multi-user.target<br></code></pre></td></tr></table></figure><blockquote><p>若您是使用 MySQL 或 MariaDB 数据库方式搭建的话,请将</p></blockquote><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">ExecStart</span>=/opt/teamspeak<span class="hljs-number">3</span>-server_linux_amd<span class="hljs-number">64</span>/ts<span class="hljs-number">3</span>server_startscript.sh start<br></code></pre></td></tr></table></figure><p>修改为</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">ExecStart</span>=/opt/teamspeak<span class="hljs-number">3</span>-server_linux_amd<span class="hljs-number">64</span>/ts<span class="hljs-number">3</span>server_startscript.sh start inifile=ts<span class="hljs-number">3</span>server.ini<br></code></pre></td></tr></table></figure><p>重新加载 systemd : <code>systemctl daemon-reload</code><br>开启自启动(可选): <code>systemctl enable teamspeak.service</code><br>启动 TeamSpeak : <code>systemctl start teamspeak.service</code><br>停止 TeamSpeak : <code>systemctl stop teamspeak.service</code><br>重启 TeamSpeak : <code>systemctl restart teamspeak.service</code></p><h1 id="tsdns设置方法-可选">TSDNS设置方法 (可选)</h1><p>进入tsdns文件夹中,并创建的 <code>tsdns_settings.ini</code> 文件,</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">nano</span> tsdns_settings.ini<br></code></pre></td></tr></table></figure><p>配置的格式为 <code>DOMAIN=IP:PORT</code>,比如:</p><ul><li><code>example.com=1.1.1.1:9987</code> 即代表将 <code>example.com</code> 和其他任何以 <code>example.com</code> 为后缀的域名,解析到地址为 <code>1.1.1.1:9987</code> 的ts服务器</li><li>包括 <a href="http://example.com">example.com</a>, <a href="http://abc.example.com">abc.example.com</a>, <a href="http://abc.def.ghi.example.com">abc.def.ghi.example.com</a> …</li><li><code>*.example.com=2.2.2.2:9987</code> 即代表将任何以符合 <code>*.example.com</code> 格式的域名,解析到地址为 <code>1.1.1.1:9987</code> 的ts服务器<ul><li>包括 <a href="http://abc.example.com">abc.example.com</a>, <a href="http://abc.example.com">abc.example.com</a>, <a href="http://123.example.com">123.example.com</a> …</li></ul></li><li>PORT 也可以调用变量, 如<ul><li><code>abc.example.com=1.2.3.4:$PORT</code></li></ul></li><li><code>*=1.2.3.4:10000</code> 在这种情况下,它充当向后兼容机制, 可以对没有使用新 TSDNS 名称进行连接的人,连接至当前服务器.<ul><li>比如一名用户连接至 <code>test.example.com:20000</code> ,则该用户会被自动转至 <code>1.2.3.4:10000</code> 的服务器地址</li></ul></li><li>IPv6 格式为 <code>example.com=[2001:0db8::1]:9987</code><ul><li><code>example.com=[2001:0db8::1]:9987 1.1.1.1:9987</code></li></ul></li></ul><h2 id="域名-srv-记录添加格式">域名 SRV 记录添加格式</h2><p>此处以给 <code>example.com</code> 域名配置 TSDNS 为例, 假如 tsdns 的</p><table><thead><tr><th style="text-align:center">类别</th><th style="text-align:center">记录值</th></tr></thead><tbody><tr><td style="text-align:center">名称</td><td style="text-align:center">_tsdns._tcp.example.com</td></tr><tr><td style="text-align:center">Priority</td><td style="text-align:center">1</td></tr><tr><td style="text-align:center">Weight</td><td style="text-align:center">0</td></tr><tr><td style="text-align:center">Port</td><td style="text-align:center">41144</td></tr><tr><td style="text-align:center">Address</td><td style="text-align:center"><a href="http://tsdns.example.com">tsdns.example.com</a></td></tr></tbody></table><blockquote><p>此处以 TSDNS 所在服务器地址为 <a href="http://tsdns.example.com">tsdns.example.com</a> 为例, <code>Address</code> 部分请务必填写为域名格式。</p></blockquote><table><thead><tr><th style="text-align:center">类别</th><th style="text-align:center">记录值</th></tr></thead><tbody><tr><td style="text-align:center">名称</td><td style="text-align:center">_ts3._udp.example.com</td></tr><tr><td style="text-align:center">Priority</td><td style="text-align:center">1</td></tr><tr><td style="text-align:center">Weight</td><td style="text-align:center">0</td></tr><tr><td style="text-align:center">Port</td><td style="text-align:center">9987</td></tr><tr><td style="text-align:center">Address</td><td style="text-align:center"><a href="http://teamspeak.example.com">teamspeak.example.com</a></td></tr></tbody></table><blockquote><p><code>Port</code> 为 TeamSpeak 服务器地址端口, <code>Address</code> 为 TeamSpeak 服务器地址</p></blockquote><p>接下载, 运行tsdnsserver程序即可,现在连接到TS服务器,可以看到已经显示成功</p><p><img src="https://i.yecdn.com/images/2019/01/05/e3b3003d5f109c0c67c71432bc0155c9.png" alt=""></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><code class="hljs bash">screen -AmdS tsdns ./tsdnsserver<br></code></pre></td></tr></table></figure><h3 id="添加至开机自启动-可选">添加至开机自启动 (可选)</h3><p>通过 crontab 来实现开机启动</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">crontab -e</span><br></code></pre></td></tr></table></figure><p>在文件中添加</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">@reboot <span class="hljs-regexp">/opt/</span>teamspeak3-server_linux_amd64<span class="hljs-regexp">/tsdns/</span>tsdnsserver<br></code></pre></td></tr></table></figure><p>关闭编辑器并保存。</p><p>接下来,你可以通过 <code>crontab -l</code> 来确认是否添加成功即可。</p><h1 id="许可证介绍">许可证介绍</h1><p><img src="https://i.yecdn.com/images/2019/01/05/5dab956bb57536ab3ec97158fd71681f.jpg" alt=""></p><p><strong>2018-09-11</strong> Non-Profit License (NPL) 现在申请接口已经关闭,许可证相关信息也发生了改变</p><p><strong>2019-03-23</strong> 许可证信息前不久又发生了改变,当前许可证状态<br><img src="https://i.yecdn.com/images/2019/04/15/89ff411ff26c02dc24fdec127742faf3.png" alt=""></p><p><strong>2019-10-06</strong>  官方于 <code>2019-05-13</code><sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> 上线了 Sponsorship License,可供游戏俱乐部,教育机构,视频创作者使用,详细说明可在此处查看 <a href="https://teamspeak.com/sponsorship/">https://teamspeak.com/sponsorship/</a> (Thanks to <a href="https://github.com/xcgjack">@xcgjack</a>)</p><h1 id="teamspeak-端口">TeamSpeak 端口</h1><p>TeamSpeak 默认情况下, 服务器端需要下表中的端口<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup></p><table><thead><tr><th style="text-align:center">端口</th><th style="text-align:center">协议</th><th style="text-align:center">说明</th></tr></thead><tbody><tr><td style="text-align:center">9987</td><td style="text-align:center">UDP</td><td style="text-align:center">默认语音服务器端口</td></tr><tr><td style="text-align:center">10011</td><td style="text-align:center">TCP</td><td style="text-align:center">ServerQuery raw 端口</td></tr><tr><td style="text-align:center">10022</td><td style="text-align:center">TCP</td><td style="text-align:center">ServerQuery SSH 端口(需要 3.3.0 以上版本服务端)</td></tr><tr><td style="text-align:center">10080</td><td style="text-align:center">TCP</td><td style="text-align:center">ServerQuery HTTP 端口(需要 3.12.0 以上版本服务端)</td></tr><tr><td style="text-align:center">10443</td><td style="text-align:center">TCP</td><td style="text-align:center">ServerQuery HTTPS 端口(需要 3.12.0 以上版本服务端)</td></tr><tr><td style="text-align:center">30033</td><td style="text-align:center">TCP</td><td style="text-align:center">文件传输端口</td></tr><tr><td style="text-align:center">41144</td><td style="text-align:center">TCP</td><td style="text-align:center">TSDNS</td></tr></tbody></table><p>服务端的所有端口都可自由更改</p><p>TeamSpeak 3 服务器还会与下方的地址进行连接<sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup></p><table><thead><tr><th style="text-align:center">域名</th><th style="text-align:center">协议</th><th style="text-align:center">本地端口(服务器)</th><th style="text-align:center">远程端口</th><th style="text-align:center">说明</th></tr></thead><tbody><tr><td style="text-align:center"><a href="http://accounting.teamspeak.com">accounting.teamspeak.com</a></td><td style="text-align:center">TCP</td><td style="text-align:center">1024-65535</td><td style="text-align:center">2008</td><td style="text-align:center">3.0.x 服务端版本</td></tr><tr><td style="text-align:center"><a href="http://accounting2.teamspeak.com">accounting2.teamspeak.com</a></td><td style="text-align:center">TCP</td><td style="text-align:center">1024-65535</td><td style="text-align:center">443</td><td style="text-align:center">3.1.x 服务端版本</td></tr><tr><td style="text-align:center"><a href="http://ts3services.teamspeak.com">ts3services.teamspeak.com</a></td><td style="text-align:center">TCP</td><td style="text-align:center">1024-65535</td><td style="text-align:center">443</td><td style="text-align:center">3.1.x 服务端版本</td></tr><tr><td style="text-align:center"><a href="http://weblist.teamspeak.com">weblist.teamspeak.com</a></td><td style="text-align:center">UDP</td><td style="text-align:center">2011-2110</td><td style="text-align:center">2010</td><td style="text-align:center">全部服务端版本</td></tr></tbody></table><p>至此 TeamSpeak 服务器端的搭建方法到此结束。</p><p>我们的 TeamSpeak 服务器列表 <a href="https://ts.wevg.org">服务器列表</a></p><h1 id="serverquery-相关部分">ServerQuery 相关部分</h1><p>其实我对于 ServerQuery 的使用也是比较少,这次更新了通过 API 调用 ServerQuery 的方法之后,感觉之后可能我会拿他做一些比较好玩的事情吧,目前对于 HTTP/HTTPS 方式调用的官方说明还是比较少啦,但是官方有表示会写一个完整的 web-query 文档<sup class="footnote-ref"><a href="#fn3" id="fnref3:1">[3]</a></sup>,但是以 TeamSpeak 的工作效率来看,怕是要又要咕蛮久的了。</p><p>首先,如何启用 http 或者 https query 呢,在之前的版本中 SSH RAW 的方式都是默认启用的,但是这次以我目前的测试来看,默认是关闭的</p><h2 id="启用-http-https-serverquery">启用 HTTP / HTTPS ServerQuery</h2><p>在 ts3server.ini 文件中添加以下内容</p><h3 id="启用-http-连接">启用 HTTP 连接</h3><blockquote><p>默认端口为 10080,且默认情况下监听全部端口,可在此处自行修改</p></blockquote><figure class="highlight ini"><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><code class="hljs ini"><span class="hljs-attr">query_protocols</span>=raw,ssh,http<br><span class="hljs-attr">query_http_ip</span>=<span class="hljs-number">0.0</span>.<span class="hljs-number">0.0</span>,::<br><span class="hljs-attr">query_http_port</span>=<span class="hljs-number">10080</span><br></code></pre></td></tr></table></figure><blockquote><p>如上所示填写后,会同时启用 raw,ssh,http</p></blockquote><h3 id="启用-https-连接">启用 HTTPS 连接</h3><blockquote><p>默认端口为 10443,且默认情况下监听全部端口,可在此处自行修改</p></blockquote><figure class="highlight ini"><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><code class="hljs ini"><span class="hljs-attr">query_protocols</span>=https<br><span class="hljs-attr">query_https_ip</span>=<span class="hljs-number">0.0</span>.<span class="hljs-number">0.0</span>,::<br><span class="hljs-attr">query_https_port</span>=<span class="hljs-number">10443</span><br><span class="hljs-attr">query_https_certificate_file</span>=your_cert.pem<br><span class="hljs-attr">query_https_private_key_file</span>=your_key.pem<br></code></pre></td></tr></table></figure><blockquote><p>此处为仅启用 HTTPS</p></blockquote><p>对于 ts3server.ini 的完整说明我会在日后进行详细说明</p><h3 id="web-query-调用-示例">Web-Query 调用 示例</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">curl -H <span class="hljs-string">&#x27;x-api-key: BAByFoiEXZfnSJyE6dbXFiW_nn_SdwkclpKNz9j&#x27;</span> <span class="hljs-string">&#x27;http://127.0.0.1:10080/gm?msg=Hello+World&#x27;</span><br></code></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs json">&#123;<span class="hljs-attr">&quot;status&quot;</span>:&#123;<span class="hljs-attr">&quot;code&quot;</span>:<span class="hljs-number">0</span>,<span class="hljs-attr">&quot;message&quot;</span>:<span class="hljs-string">&quot;ok&quot;</span>&#125;&#125;<br></code></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">curl -H <span class="hljs-string">&#x27;x-api-key: BAByFoiEXZfnSJyE6dbXFiW_nn_SdwkclpKNz9j&#x27;</span> <span class="hljs-string">&#x27;http://127.0.0.1:10080/1/channellist?-topic&amp;-icon&#x27;</span><br></code></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs json">&#123;<span class="hljs-attr">&quot;body&quot;</span>:[&#123;<span class="hljs-attr">&quot;channel_icon_id&quot;</span>:<span class="hljs-string">&quot;0&quot;</span>,<span class="hljs-attr">&quot;channel_name&quot;</span>:<span class="hljs-string">&quot;Default Channel&quot;</span>,<span class="hljs-attr">&quot;channel_needed_subscribe_power&quot;</span>:<span class="hljs-string">&quot;0&quot;</span>,<span class="hljs-attr">&quot;channel_order&quot;</span>:<span class="hljs-string">&quot;0&quot;</span>,<span class="hljs-attr">&quot;channel_topic&quot;</span>:<span class="hljs-string">&quot;Default Channel has no topic&quot;</span>,<span class="hljs-attr">&quot;cid&quot;</span>:<span class="hljs-string">&quot;1&quot;</span>,<span class="hljs-attr">&quot;pid&quot;</span>:<span class="hljs-string">&quot;0&quot;</span>,<span class="hljs-attr">&quot;total_clients&quot;</span>:<span class="hljs-string">&quot;1&quot;</span>&#125;],<span class="hljs-attr">&quot;status&quot;</span>:&#123;<span class="hljs-attr">&quot;code&quot;</span>:<span class="hljs-number">0</span>,<span class="hljs-attr">&quot;message&quot;</span>:<span class="hljs-string">&quot;ok&quot;</span>&#125;&#125;<br></code></pre></td></tr></table></figure><h4 id="参数和可与这些参数一起使用的命令">参数和可与这些参数一起使用的命令</h4><figure class="highlight elm"><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><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br></pre></td><td class="code"><pre><code class="hljs elm">&#123; <span class="hljs-string">&quot;apikeyadd&quot;</span>,                   &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;apikeydel&quot;</span>,                   &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;apikeylist&quot;</span>,                  &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;banadd&quot;</span>,                      &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;banclient&quot;</span>,                   &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;bandel&quot;</span>,                      &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;bandelall&quot;</span>,                   &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;banlist&quot;</span>,                     &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;bindinglist&quot;</span>,                 &#123; manage_scope, read_scope &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channeladdperm&quot;</span>,              &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelclientaddperm&quot;</span>,        &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelclientdelperm&quot;</span>,        &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelclientpermlist&quot;</span>,       &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelcreate&quot;</span>,               &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channeldelete&quot;</span>,               &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channeldelperm&quot;</span>,              &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channeledit&quot;</span>,                 &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelfind&quot;</span>,                 &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelgroupadd&quot;</span>,             &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelgroupaddperm&quot;</span>,         &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelgroupclientlist&quot;</span>,      &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelgroupcopy&quot;</span>,            &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelgroupdel&quot;</span>,             &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelgroupdelperm&quot;</span>,         &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelgrouplist&quot;</span>,            &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelgrouppermlist&quot;</span>,        &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelgrouprename&quot;</span>,          &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelinfo&quot;</span>,                 &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channellist&quot;</span>,                 &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelmove&quot;</span>,                 &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;channelpermlist&quot;</span>,             &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientaddperm&quot;</span>,               &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientdbdelete&quot;</span>,              &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientdbedit&quot;</span>,                &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientdbfind&quot;</span>,                &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientdbinfo&quot;</span>,                &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientdblist&quot;</span>,                &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientdelperm&quot;</span>,               &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientedit&quot;</span>,                  &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientfind&quot;</span>,                  &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientgetdbidfromuid&quot;</span>,        &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientgetids&quot;</span>,                &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientgetnamefromdbid&quot;</span>,       &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientgetnamefromuid&quot;</span>,        &#123; manage_scope, write_scope, read_scope,&#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientgetuidfromclid&quot;</span>,        &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientinfo&quot;</span>,                  &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientkick&quot;</span>,                  &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientlist&quot;</span>,                  &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientmove&quot;</span>,                  &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientpermlist&quot;</span>,              &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientpoke&quot;</span>,                  &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientsetserverquerylogin&quot;</span>,   &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;clientupdate&quot;</span>,                &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;complainadd&quot;</span>,                 &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;complaindel&quot;</span>,                 &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;complaindelall&quot;</span>,              &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;complainlist&quot;</span>,                &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;custominfo&quot;</span>,                  &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;customsearch&quot;</span>,                &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;customset&quot;</span>,                   &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;customdelete&quot;</span>,                &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;ftcreatedir&quot;</span>,                 not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;ftdeletefile&quot;</span>,                not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;ftgetfileinfo&quot;</span>,               not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;ftgetfilelist&quot;</span>,               not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;ftinitdownload&quot;</span>,              not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;ftinitupload&quot;</span>,                not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;ftlist&quot;</span>,                      not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;ftrenamefile&quot;</span>,                not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;ftstop&quot;</span>,                      not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;gm&quot;</span>,                          &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;help&quot;</span>,                        &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;hostinfo&quot;</span>,                    &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;instanceedit&quot;</span>,                &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;instanceinfo&quot;</span>,                &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;logadd&quot;</span>,                      &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;login&quot;</span>,                       not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;logout&quot;</span>,                      not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;logview&quot;</span>,                     &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;messageadd&quot;</span>,                  &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;messagedel&quot;</span>,                  &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;messageget&quot;</span>,                  &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;messagelist&quot;</span>,                 &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;messageupdateflag&quot;</span>,           &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;permfind&quot;</span>,                    &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;permget&quot;</span>,                     &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;permidgetbyname&quot;</span>,             &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;permissionlist&quot;</span>,              &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;permoverview&quot;</span>,                &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;permreset&quot;</span>,                   &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;privilegekeyadd&quot;</span>,             &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;privilegekeydelete&quot;</span>,          &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;privilegekeylist&quot;</span>,            &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;privilegekeyuse&quot;</span>,             &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;queryloginadd&quot;</span>,               &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;querylogindel&quot;</span>,               &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;queryloginlist&quot;</span>,              &#123; manage_scope, write_scope, read_scope &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;quit&quot;</span>,                        not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;sendtextmessage&quot;</span>,             &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servercreate&quot;</span>,                &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;serverdelete&quot;</span>,                &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;serveredit&quot;</span>,                  &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupadd&quot;</span>,              &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupaddclient&quot;</span>,        &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupaddperm&quot;</span>,          &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupautoaddperm&quot;</span>,      &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupautodelperm&quot;</span>,      &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupclientlist&quot;</span>,       &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupcopy&quot;</span>,             &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupdel&quot;</span>,              &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupdelclient&quot;</span>,        &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupdelperm&quot;</span>,          &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergrouplist&quot;</span>,             &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergrouppermlist&quot;</span>,         &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergrouprename&quot;</span>,           &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servergroupsbyclientid&quot;</span>,      &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;serveridgetbyport&quot;</span>,           &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;serverinfo&quot;</span>,                  &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;serverlist&quot;</span>,                  &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servernotifyregister&quot;</span>,        not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;servernotifyunregister&quot;</span>,      not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;serverprocessstop&quot;</span>,           &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;serverrequestconnectioninfo&quot;</span>, &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;serversnapshotcreate&quot;</span>,        &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;serversnapshotdeploy&quot;</span>,        &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;serverstart&quot;</span>,                 &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;serverstop&quot;</span>,                  &#123; manage_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servertemppasswordadd&quot;</span>,       &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servertemppassworddel&quot;</span>,       &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;servertemppasswordlist&quot;</span>,      &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;setclientchannelgroup&quot;</span>,       &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;tokenadd&quot;</span>,                    &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;tokendelete&quot;</span>,                 &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;tokenlist&quot;</span>,                   &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;tokenuse&quot;</span>,                    &#123; manage_scope, write_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;use&quot;</span>,                         not_supported &#125;,<br>  &#123; <span class="hljs-string">&quot;version&quot;</span>,                     &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br>  &#123; <span class="hljs-string">&quot;whoami&quot;</span>,                      &#123; manage_scope, write_scope, read_scope, &#125; &#125;,<br></code></pre></td></tr></table></figure><h1 id="faq">FAQ</h1><h2 id="使用-teamviewer-时-teamspeak-声音变小的问题">使用 TeamViewer 时 TeamSpeak 声音变小的问题</h2><p>此部分请移步至 <a href="https://www.wevg.org/archives/how-to-use-teamspeak3/">TeamSpeak3 食用方法 (新手向)</a></p><h2 id="让-teamspeak-服务端使用-maxmind-geoip-数据库">让 TeamSpeak 服务端使用 MaxMind GeoIP 数据库</h2><p>此部分请移步至 <a href="https://www.wevg.org/archives/geoip-with-teamspeak/">在 TeamSpeak 服务器上使用 GeoIP 数据库</a></p><h1 id="参考链接">参考链接</h1><p><a href="https://forum.teamspeak.com/threads/46486-Teamspeak-3-Server-Ports">Teamspeak 3 Server Ports</a></p><p><a href="https://forum.teamspeak.com/threads/102772-Teamspeak-3-server-TSDNS-setup">Teamspeak 3 server TSDNS setup</a></p><p><a href="https://support.teamspeakusa.com/index.php?/Knowledgebase/Article/View/332/15/server-address-resolution-and-tsdns-changes-with-client-31x">Server address resolution and TSDNS changes with Client 3.1.x</a></p><p><a href="https://support.teamspeakusa.com/index.php?/Knowledgebase/Article/View/293/12/does-teamspeak-3-support-dns-srv-records">Does TeamSpeak 3 support DNS SRV records?</a></p><p><a href="https://community.teamspeak.com/t/teamspeak-server-3-12-0/">TeamSpeak Server 3.12.0</a></p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1"  class="footnote-item"><p><a href="https://twitter.com/teamspeak/status/1127939577501687808">TeamSpeak Official Twitter</a> <a href="#fnref1" class="footnote-backref">↩</a></p></li><li id="fn2"  class="footnote-item"><p><a href="https://forum.teamspeak.com/threads/135502-What-ports-TeamSpeak-3-server-use">What ports TeamSpeak 3 server use?</a> <a href="#fnref2" class="footnote-backref">↩</a></p></li><li id="fn3"  class="footnote-item"><p><a href="https://community.teamspeak.com/t/teamspeak-server-3-12-0/3916/6">TeamSpeak Server 3.12.0</a> <a href="#fnref3" class="footnote-backref">↩</a> <a href="#fnref3:1" class="footnote-backref">↩</a></p></li></ol></section>]]></content>
  1371.    
  1372.    <summary type="html">
  1373.    
  1374.      &lt;p&gt;本文介绍 TeamSpeak 服务器端搭建方法 ,TeamSpeak (简称TS) 是一套专有的VoIP软件
  1375.    
  1376.    </summary>
  1377.    
  1378.    
  1379.      <category term="Tech" scheme="https://www.wevg.org/categories/Tech/"/>
  1380.    
  1381.    
  1382.      <category term="Linux" scheme="https://www.wevg.org/tags/Linux/"/>
  1383.    
  1384.      <category term="搭建" scheme="https://www.wevg.org/tags/%E6%90%AD%E5%BB%BA/"/>
  1385.    
  1386.      <category term="服务器" scheme="https://www.wevg.org/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
  1387.    
  1388.      <category term="VoIP" scheme="https://www.wevg.org/tags/VoIP/"/>
  1389.    
  1390.      <category term="语音" scheme="https://www.wevg.org/tags/%E8%AF%AD%E9%9F%B3/"/>
  1391.    
  1392.  </entry>
  1393.  
  1394. </feed>
  1395.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid Atom 1.0" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//wevg.org/atom.xml

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda