<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Win Notes</title>
  
  <subtitle>闻道录</subtitle>
  <link href="http://winotes.net/atom.xml" rel="self"/>
  
  <link href="http://winotes.net/"/>
  <updated>2022-04-19T16:09:29.730Z</updated>
  <id>http://winotes.net/</id>
  
  <author>
    <name>Randy Zhong</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>更新了下博客的 Hexo 到最新版并修复几个依赖包的问题</title>
    <link href="http://winotes.net/upgrade-hexo-to-latest-and-fix-dependency-issues/"/>
    <id>http://winotes.net/upgrade-hexo-to-latest-and-fix-dependency-issues/</id>
    <published>2022-04-03T15:28:23.000Z</published>
    <updated>2022-04-19T16:09:29.730Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h3 id="更新-Hexo"><a href="#更新-Hexo" class="headerlink" title="更新 Hexo"></a>更新 Hexo</h3><p>鉴于这个搭建于多年前的博客系统长久未更新， Hexo 还停留在 3.x 版本，趁着假期有空，随手更新到了目前最新的 Hexo 6.1 版本，期间也不出所料的遇到了几个坑。</p><h3 id="踩坑"><a href="#踩坑" class="headerlink" title="踩坑"></a>踩坑</h3><p>升级到 Hexo 6.1 之后，有几个坑需要填：</p><ol><li><strong>_config.yml</strong> 里面有些不再支持的配置，需要修改，比如 external_link；</li><li>主题使用的 hexo-asset-image 插件和 Hexo 6 不兼容，我替换成了 hexo-assets-image-new；</li><li>hexo-renderer-sass 已经停更多年，替换为 “hexo-renderer-sass”: “github:robincafolla/hexo-renderer-sass” 来解决版本兼容性问题，参见<a href="https://github.com/knksmith57/hexo-renderer-sass/pull/46">这个帖子</a>。</li></ol><h3 id="Valine-评论"><a href="#Valine-评论" class="headerlink" title="Valine 评论"></a>Valine 评论</h3><p>之前使用的 leancloud 国内版因为未备案原因已经被停用， 数据也无法导出，重新部署到 leancloud 国际版。</p><h3 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h3><p>同步更新了 tufu9441 的 <a href="https://github.com/tufu9441/maupassant-hexo">maupassant 主题</a>。</p><h3 id="托管"><a href="#托管" class="headerlink" title="托管"></a>托管</h3><p>又从 Coding 迁移回了 GitHub Pages，还是 Pages 用着更舒适些。</p></body></html>]]></content>
    
    
    <summary type="html">假期闲来无事，更新了下博客的 Hexo 到最新版并修复几个依赖包的问题。</summary>
    
    
    
    <category term="网站相关" scheme="http://winotes.net/categories/%E7%BD%91%E7%AB%99%E7%9B%B8%E5%85%B3/"/>
    
    
    <category term="GitHub" scheme="http://winotes.net/tags/GitHub/"/>
    
    <category term="Hexo" scheme="http://winotes.net/tags/Hexo/"/>
    
    <category term="NPM" scheme="http://winotes.net/tags/NPM/"/>
    
    <category term="Valine" scheme="http://winotes.net/tags/Valine/"/>
    
  </entry>
  
  <entry>
    <title>Intel NUC8i7BEH 读卡器魔改完美安装黑苹果</title>
    <link href="http://winotes.net/intel-nuc8i7beh-mod-hackintosh/"/>
    <id>http://winotes.net/intel-nuc8i7beh-mod-hackintosh/</id>
    <published>2020-01-06T08:48:35.000Z</published>
    <updated>2022-04-19T16:08:53.950Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h2 id="GitHub"><a href="#GitHub" class="headerlink" title="GitHub"></a>GitHub</h2><p>本文引用自我的 GitHub:<br><a href="https://github.com/randyzhong/OS-X-NUC8i7BEH-Clover">OS-X-NUC8i7BEH-Clover</a></p><h2 id="OS-X-NUC8i7BEH-Clover"><a href="#OS-X-NUC8i7BEH-Clover" class="headerlink" title="OS-X-NUC8i7BEH-Clover"></a>OS-X-NUC8i7BEH-Clover</h2><p>This repository contains the files and scripts to install macOS on a <strong>modded</strong> Intel NUC8i7BEH (Bean Canyon).</p><p><img src="https://i.loli.net/2020/01/05/cpzUulMALTbi21F.jpg" alt="Catalina-10.15.2.jpg"></p><h2 id="Hardware"><a href="#Hardware" class="headerlink" title="Hardware"></a>Hardware</h2><h3 id="Specs"><a href="#Specs" class="headerlink" title="Specs:"></a>Specs:</h3><ul><li>CPU: Intel i7-8559U, 4c/8t, base 2.7Ghz, turbo 4.5Ghz, 28w TDP.</li><li>Graphic: intel Iris plus 655 with 128 eDRAM.</li><li>RAM: Two sockets 260-pin 1.2 V DDR4 SDRAM SO-DIMM (up to 32Gb, and 2400Mhz)</li><li>LAN: Intel I219V Gigabit Ethernet Controller (10/100/1000 Mbps)</li><li>Wi-Fi/BT: Intel Dual Band Wireless-AC 9560 (soldered)</li><li>1 * Thunderbolt 3 Four lanes 40Gbps, support DisplayPort 1.2 (17Gbps, up to 4096x2304@60Hz), support USB data (10Gbps)</li><li>1 * HDMI 2.0a (MegaChips MCDP2800 LSPCon DisplayPort1.2-to-HDMI 2.0 up to 4096x2160@60Hz)</li><li>1 * SATA 6 Gbps, 2.5” (540 Mbps)</li><li>1 * M.2 connector (key type M and B+M) for 2242 and 2280 modules. Four lanes (4 Gbps)</li><li>4 * USB-A 3.1 (gen2 10Gbps). One port can deliver 1.5A</li><li>1 * Micro SDXC Card Reader</li><li>1 * Jack 3.5mm Realtek HD Audio</li></ul><h3 id="My-specification"><a href="#My-specification" class="headerlink" title="My specification"></a>My specification</h3><ul><li>2 * Hynix HMA81GS6AFR8N-UH 8GB DDR4-2400 SODIMM</li><li>WD Black SN750 NVMe 512G</li><li><strong>BCM94360CS2</strong> Wi-Fi/Bluetooth with adapter (will explain how)</li></ul><h2 id="Mod"><a href="#Mod" class="headerlink" title="Mod"></a>Mod</h2><p>NUC8i7BEH uses RTS5227S (use pcie x1) chipset for SD card which can be desoldered/replaced with a BCM94360CS2(or BCM942602CS) to get native AirDrop/Handoff support.</p><p>Two possible Mods:</p><ul><li><p><a href="https://www.chiphell.com/thread-2004976-1-1.html">https://www.chiphell.com/thread-2004976-1-1.html</a> (Chinese) - My NUC8 Mod<br><img src="https://www.tonymacx86.com/attachments/193557c1jhu2heyxjjl8w8-jpg.422678/" alt="1"><br><img src="https://www.tonymacx86.com/attachments/200739bhrnx7stnmnxej9z-jpg.422679/" alt="2"><br><img src="https://www.tonymacx86.com/attachments/204632xl75bq1uwbil2i8g-jpg.422686/" alt="3"></p></li><li><p><a href="https://www.mydigit.cn/forum.php?mod=viewthread&amp;tid=34830&amp;extra=&amp;page=1">https://www.mydigit.cn/forum.php?mod=viewthread&amp;tid=34830&amp;extra=&amp;page=1</a> (Chinese) - also looks great!</p></li></ul><h2 id="Configure-BIOS-Settings"><a href="#Configure-BIOS-Settings" class="headerlink" title="Configure BIOS Settings"></a>Configure BIOS Settings</h2><p>On my NUC8i7BEH, BIOS version updated to <strong>0071</strong>.</p><p>The boot menu and BIOS setup can be accessed by mashing the F2 key during BIOS startup. After the main screen comes up choose “Advanced”. That gets you to the main BIOS setup screens.</p><p>To start, choose “Load Defaults” (choose from the menu or press F9 in the BIOS setup).</p><p>Then change:</p><ul><li>Boot-&gt;Boot Configuration, disable “Network Boot”</li><li>Power-&gt;Secondary Power Settings, “Wake on LAN from S4/S5”, set to “Stay Off”</li></ul><p>These settings are important but are already set as needed by “Load Defaults”</p><ul><li>Devices-&gt;Video, “IGD Minimum Memory” set to 64mb or 128mb</li><li>Devices-&gt;Video, “IGD Aperture Size” set to 256mb</li><li>Boot-&gt;Secure Boot, “Secure Boot” is disabled</li><li>Boot-&gt;Boot Priority-&gt;Legacy Boot Priority, enable “Legacy Boot” (continue to boot UEFI, but enable legacy for CSM)<br>(you will have KP/reboot without it).</li></ul><p>The following settings are important for <strong>Mod</strong> users</p><ul><li>Devices-&gt;Onboard Devices, disable <strong>WLAN</strong> and <strong>Bluetooth</strong></li><li>Devices-&gt;Onboard Devices, enable <strong>SD Card</strong> to Read/Write as we desoldered/replaced with a BCM94360CS2(or BCM942602CS).</li></ul><p>Press <strong>F10</strong> to save changes.</p><h2 id="Power-Management"><a href="#Power-Management" class="headerlink" title="Power Management"></a>Power Management</h2><p>Everything required for CPU/IGPU power management is already installed with the steps above.<br>There is no longer any need to use the ssdtPRgen.sh script.</p><p>Be aware that hibernation (suspend to disk or S4 sleep) is not well supported on hackintosh.</p><p>You should disable it:</p><figure class="highlight awk"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo pmset -a hibernatemode <span class="number">0</span></span><br><span class="line">sudo rm <span class="regexp">/var/</span>vm/sleepimage</span><br><span class="line">sudo mkdir <span class="regexp">/var/</span>vm/sleepimage</span><br></pre></td></tr></tbody></table></figure><p>Always check your hibernatemode after updates and disable it. System updates tend to re-enable it, although the trick above (making sleepimage a directory) tends to help.</p><h2 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h2><ul><li>To be updated</li></ul><h3 id="Tested-OS"><a href="#Tested-OS" class="headerlink" title="Tested OS"></a>Tested OS</h3><ul><li>macOS Mojave 10.14.6</li><li>macOS Catalina 10.15.2</li></ul><h3 id="Clover"><a href="#Clover" class="headerlink" title="Clover"></a>Clover</h3><ul><li>Clover r5102</li></ul><h3 id="Kexts"><a href="#Kexts" class="headerlink" title="Kexts"></a>Kexts</h3><ul><li>CPUFriend.kext (1.1.9)</li><li>VirtualSMC.kext (1.0.9)<ul><li>SMCProcessor.kext (1.0.9)</li><li>SMCSuperIO.kext (1.0.9)</li></ul></li><li>IntelMausi.kext (1.0.2)</li><li>USBPorts.kext (1.0)</li><li>SATA-unsupported (0.9.2)</li><li>Lilu.kext (1.4.0)</li><li>AppleALC (1.4.4)</li><li>WhateverGreen.kext (1.3.5)</li></ul><h2 id="Works"><a href="#Works" class="headerlink" title="Works"></a>Works</h2><ul><li>UEFI booting via Clover</li><li><strong>AirDrop, Handoff</strong> </li><li>DP/HDMI video/audio</li><li>AirPlay mirroring to AppleTV</li><li>Native USB3/USB2</li><li>Native audio with AppleHDA</li><li>Native power management</li><li>GPU Hardware Acceleration</li><li>Wired Ethernet</li><li>Mac App Store working</li><li>Sleep (hibernation disabled, not tested)</li><li><strong>Dual Displays</strong> (1 HDMI, 1 USB-C to DP)</li></ul><h2 id="Other"><a href="#Other" class="headerlink" title="Other"></a>Other</h2><ul><li>Remove USB Port:HS10 (Built-in Bluetooth)</li></ul></body></html>]]></content>
    
    
    <summary type="html">Intel 的性能小钢炮 NUC8i7BEH 硬件上几乎和 Macbook Pro 15.2也就是2018款的13寸 MBP 顶配一样，除了板载的无线网卡和蓝牙，理论可以安装黑苹果，而且在数码之家网友 laice 的努力下，实现了读卡器魔改加装苹果原装无线网卡，完美解决无线和蓝牙的问题。</summary>
    
    
    
    <category term="Hackintosh" scheme="http://winotes.net/categories/Hackintosh/"/>
    
    
    <category term="Hackintosh" scheme="http://winotes.net/tags/Hackintosh/"/>
    
    <category term="黑苹果" scheme="http://winotes.net/tags/%E9%BB%91%E8%8B%B9%E6%9E%9C/"/>
    
    <category term="Intel" scheme="http://winotes.net/tags/Intel/"/>
    
    <category term="NUC" scheme="http://winotes.net/tags/NUC/"/>
    
    <category term="Bean Canyon" scheme="http://winotes.net/tags/Bean-Canyon/"/>
    
    <category term="读卡器" scheme="http://winotes.net/tags/%E8%AF%BB%E5%8D%A1%E5%99%A8/"/>
    
    <category term="魔改" scheme="http://winotes.net/tags/%E9%AD%94%E6%94%B9/"/>
    
  </entry>
  
  <entry>
    <title>How to Fix “Mojave application is damaged, and can’t be used to install macOS” Errors</title>
    <link href="http://winotes.net/how-to-fix-mojave-application-is-damaged-and-cant-be-used-to-install-macOS-errors/"/>
    <id>http://winotes.net/how-to-fix-mojave-application-is-damaged-and-cant-be-used-to-install-macOS-errors/</id>
    <published>2019-11-28T07:28:23.000Z</published>
    <updated>2022-04-19T16:09:57.154Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h3 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h3><p>如果你还保留旧的 macOS 安装镜像， 那么很遗憾的告诉你这些镜像会在 2019-10-25 之后停止工作。这主要是由于大多数安装镜像中的证书会过期，从而导致这些镜像无法使用。<br>错误提示如下：<br><img src="/how-to-fix-mojave-application-is-damaged-and-cant-be-used-to-install-macOS-errors/damaged-copy.png" alt="damaged-copy"></p><p>通过检查 Mojave 的安装镜像，你会发现里面包含的证书已经过期;<br><img src="/how-to-fix-mojave-application-is-damaged-and-cant-be-used-to-install-macOS-errors/expired-cert.png" alt="expired-cert"></p><h3 id="Fix："><a href="#Fix：" class="headerlink" title="Fix："></a>Fix：</h3><p>两个解决方法，任选其一：</p><p>第一种，重新从苹果官方下载更新过的 Mojave 安装镜像，里面的证书已经更新：<br><img src="/how-to-fix-mojave-application-is-damaged-and-cant-be-used-to-install-macOS-errors/valid-cert.png" alt="validcert"></p><p>第二种，修改当前系统的时间去到 <strong>2019-10-24</strong> 日之前，使安装镜像的证书还在有效期内：</p><ul><li>断开网络。</li><li>打开 <strong>Terminal</strong> 终端工具，输入 <code>sudo date -u 0924150019</code>，修改时间为 2019年9月24日15时，再进行安装即可。</li></ul></body></html>]]></content>
    
    
    <summary type="html">如果你还保留旧的 macOS 安装镜像， 那么很遗憾的告诉你这些镜像会在 2019-10-25 之后停止工作。这主要是由于大多数安装镜像中的证书会过期，从而导致这些镜像无法使用。</summary>
    
    
    
    <category term="Hackintosh" scheme="http://winotes.net/categories/Hackintosh/"/>
    
    
    <category term="Hackintosh" scheme="http://winotes.net/tags/Hackintosh/"/>
    
    <category term="macOS" scheme="http://winotes.net/tags/macOS/"/>
    
    <category term="Mojave" scheme="http://winotes.net/tags/Mojave/"/>
    
  </entry>
  
  <entry>
    <title>CentOS 6 虚拟机扩容 LVM 根分区</title>
    <link href="http://winotes.net/extending-lvm-root-partition-on-centos6-vm/"/>
    <id>http://winotes.net/extending-lvm-root-partition-on-centos6-vm/</id>
    <published>2019-02-28T09:48:35.000Z</published>
    <updated>2022-04-19T16:14:22.901Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><p>环境介绍：</p><ul><li>VMware 5.5</li><li>CentOS 6.3 64-bit</li><li>/ 根分区为 LVM</li><li>原磁盘大小 40GB</li><li>扩容后磁盘大小： 50GB</li></ul><p>查看原来的磁盘文件系统空间状态， 根分区已经 100% 爆了！</p><figure class="highlight shell"><table><tbody><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><span class="line">[root@localhost ~]# df -h</span><br><span class="line">Filesystem            Size  Used Avail Use% Mounted on</span><br><span class="line">/dev/mapper/VolGroup-lv_root</span><br><span class="line">                       38G   38G     0 100% /</span><br><span class="line">tmpfs                 246M     0  246M   0% /dev/shm</span><br><span class="line">/dev/sda1             485M   32M  428M   7% /boot</span><br></pre></td></tr></tbody></table></figure><p>在 VMware 中对原磁盘扩容到 50GB, 查看磁盘 sda 已经扩展到 50GB<br><strong>安全起见，在扩容前，建议对数据进行备份。</strong></p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# fdisk /dev/sda -l</span><br><span class="line"></span><br><span class="line">Disk /dev/sda: 53.7 GB, 53687091200 bytes</span><br><span class="line">255 heads, 63 sectors/track, 6527 cylinders</span><br><span class="line">Units = cylinders of 16065 * 512 = 8225280 bytes</span><br><span class="line">Sector size (logical/physical): 512 bytes / 512 bytes</span><br><span class="line">I/O size (minimum/optimal): 512 bytes / 512 bytes</span><br><span class="line">Disk identifier: 0x00026a39</span><br><span class="line"></span><br><span class="line">   Device Boot      Start         End      Blocks   Id  System</span><br><span class="line">/dev/sda1   *           1          64      512000   83  Linux</span><br><span class="line">Partition 1 does not end on cylinder boundary.</span><br><span class="line">/dev/sda2              64        5222    41430016   8e  Linux LVM</span><br></pre></td></tr></tbody></table></figure><p>在本文的例子中，磁盘 /dev/sda 已经扩展至 53.7 GB 而且当前只有两个主分区，所以我们后面就直接创建主分区 sda3 来帮助扩容。</p><p>查看 PV, VG, LV 状态，大小还没有变化</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# pvs</span><br><span class="line">  PV         VG       Fmt  Attr PSize  PFree</span><br><span class="line">  /dev/sda2  VolGroup lvm2 a--  39.51g    0</span><br><span class="line">[root@localhost ~]# vgs</span><br><span class="line">  /etc/lvm/archive/.lvm_localhost.localdomain_18508_1413645104: write error failed: No space left on device</span><br><span class="line">  Volume group "VolGroup" metadata archive failed.</span><br><span class="line">  /etc/lvm/backup/VolGroup.tmp: write error failed: No space left on device</span><br><span class="line">  Backup of volume group VolGroup metadata failed.</span><br><span class="line">  VG       #PV #LV #SN Attr   VSize  VFree</span><br><span class="line">  VolGroup   1   2   0 wz--n- 39.51g    0</span><br><span class="line">[root@localhost ~]# lvs</span><br><span class="line">  LV      VG       Attr     LSize   Pool Origin Data%  Move Log Copy%  Convert</span><br><span class="line">  lv_root VolGroup -wi-ao--  38.54g</span><br><span class="line">  lv_swap VolGroup -wi-ao-- 992.00m</span><br></pre></td></tr></tbody></table></figure><p>接下来我们需要将扩展出未曾使用的 10GB 空间创建一个新的主分区 <strong>sda3</strong> 来给逻辑卷扩容用。</p><figure class="highlight shell"><table><tbody><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></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# fdisk /dev/sda</span><br><span class="line"></span><br><span class="line">WARNING: DOS-compatible mode is deprecated. It's strongly recommended to</span><br><span class="line">         switch off the mode (command 'c') and change display units to</span><br><span class="line">         sectors (command 'u').</span><br><span class="line"></span><br><span class="line">Command (m for help): m</span><br><span class="line">Command action</span><br><span class="line">   a   toggle a bootable flag</span><br><span class="line">   b   edit bsd disklabel</span><br><span class="line">   c   toggle the dos compatibility flag</span><br><span class="line">   d   delete a partition</span><br><span class="line">   l   list known partition types</span><br><span class="line">   m   print this menu</span><br><span class="line">   n   add a new partition</span><br><span class="line">   o   create a new empty DOS partition table</span><br><span class="line">   p   print the partition table</span><br><span class="line">   q   quit without saving changes</span><br><span class="line">   s   create a new empty Sun disklabel</span><br><span class="line">   t   change a partition's system id</span><br><span class="line">   u   change display/entry units</span><br><span class="line">   v   verify the partition table</span><br><span class="line">   w   write table to disk and exit</span><br><span class="line">   x   extra functionality (experts only)</span><br><span class="line"></span><br><span class="line">Command (m for help): n</span><br><span class="line">Command action</span><br><span class="line">   e   extended</span><br><span class="line">   p   primary partition (1-4)</span><br><span class="line">p</span><br><span class="line">Partition number (1-4): 3</span><br><span class="line">First cylinder (5222-6527, default 5222):</span><br><span class="line">Using default value 5222</span><br><span class="line">Last cylinder, +cylinders or +size{K,M,G} (5222-6527, default 6527):</span><br><span class="line">Using default value 6527</span><br></pre></td></tr></tbody></table></figure><p>然后修改分区类型为 8e 并写入分区表保存</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">Command (m for help): t</span><br><span class="line">Partition number (1-4): 3</span><br><span class="line">Hex code (type L to list codes): 8e</span><br><span class="line">Changed system type of partition 3 to 8e (Linux LVM)</span><br><span class="line"></span><br><span class="line">Command (m for help): w</span><br><span class="line">The partition table has been altered!</span><br><span class="line"></span><br><span class="line">Calling ioctl() to re-read partition table.</span><br><span class="line"></span><br><span class="line">WARNING: Re-reading the partition table failed with error 16: Device or resource busy.</span><br><span class="line">The kernel still uses the old table. The new table will be used at</span><br><span class="line">the next reboot or after you run partprobe(8) or kpartx(8)</span><br><span class="line">Syncing disks.</span><br></pre></td></tr></tbody></table></figure><p>重新扫描磁盘检查分区情况</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# partx -v -a /dev/sda</span><br><span class="line">device /dev/sda: start 0 size 104857600</span><br><span class="line">gpt: 0 slices</span><br><span class="line">dos: 4 slices</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1:      2048-  1026047 (  1024000 sectors,    524 MB)</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2:   1026048- 83886079 ( 82860032 sectors,  42424 MB)</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3:  83886080-104856254 ( 20970175 sectors,  10736 MB)</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">4:         0-       -1 (        0 sectors,      0 MB)</span></span><br><span class="line">BLKPG: Device or resource busy</span><br><span class="line">error adding partition 1</span><br><span class="line">BLKPG: Device or resource busy</span><br><span class="line">error adding partition 2</span><br><span class="line">added partition 3</span><br></pre></td></tr></tbody></table></figure><p>分区 1/2 的报错可以忽略，我们需要看到的是分区 3 已经添加成功，如果看不到分区 3 或者添加失败需要重启使之生效。</p><p>创建新的 PV</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# pvcreate /dev/sda3</span><br><span class="line">  Writing physical volume data to disk "/dev/sda3"</span><br><span class="line">  Physical volume "/dev/sda3" successfully created</span><br></pre></td></tr></tbody></table></figure><p>找到当前系统所使用的卷组名</p><figure class="highlight shell"><table><tbody><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><span class="line">[root@localhost ~]# vgdisplay</span><br><span class="line">  --- Volume group ---</span><br><span class="line">  VG Name               VolGroup</span><br><span class="line">  System ID</span><br><span class="line">  Format                lvm2</span><br><span class="line">  Metadata Areas        1</span><br><span class="line">  Metadata Sequence No  3</span><br><span class="line">  VG Access             read/write</span><br><span class="line">  VG Status             resizable</span><br><span class="line">  MAX LV                0</span><br><span class="line">  Cur LV                2</span><br><span class="line">  Open LV               2</span><br><span class="line">  Max PV                0</span><br><span class="line">  Cur PV                1</span><br><span class="line">  Act PV                1</span><br><span class="line">  VG Size               39.51 GiB</span><br><span class="line">  PE Size               4.00 MiB</span><br><span class="line">  Total PE              10114</span><br><span class="line">  Alloc PE / Size       10114 / 39.51 GiB</span><br><span class="line">  Free  PE / Size       0 / 0</span><br><span class="line">  VG UUID               2JrSeG-4Is7-ocIQ-zVrN-eha1-gYJQ-L1UnPn</span><br><span class="line"></span><br><span class="line">  /etc/lvm/archive/.lvm_localhost.localdomain_15862_675165963: write error failed: No space left on device</span><br><span class="line">  Volume group "VolGroup" metadata archive failed.</span><br><span class="line">  /etc/lvm/backup/VolGroup.tmp: write error failed: No space left on device</span><br><span class="line">  Backup of volume group VolGroup metadata failed.</span><br></pre></td></tr></tbody></table></figure><p><strong>VolGroup</strong> 就是它了！</p><p>接下来 <strong>vgextend</strong> 扩容VG：</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# vgextend VolGroup /dev/sda3</span><br><span class="line">  /etc/lvm/archive/.lvm_localhost.localdomain_17322_173527374: write error failed: No space left on device</span><br><span class="line">  Volume group "VolGroup" metadata archive failed.</span><br><span class="line">  Internal error: Attempt to unlock unlocked VG #orphans.</span><br></pre></td></tr></tbody></table></figure><p>结果因为剩余空间为零扩容失败，囧， 删除掉一些文件再试。</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# vgextend VolGroup /dev/sda3</span><br><span class="line">  Volume group "VolGroup" successfully extended</span><br></pre></td></tr></tbody></table></figure><p>用 <strong>pvscan</strong> 来查看 PV 空间使用情况来决定谁给谁加以及加多少空间。</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# pvscan</span><br><span class="line">  PV /dev/sda2   VG VolGroup   lvm2 [39.51 GiB / 0    free]</span><br><span class="line">  PV /dev/sda3   VG VolGroup   lvm2 [10.00 GiB / 10.00 GiB free]</span><br><span class="line">  Total: 2 [49.50 GiB] / in use: 2 [49.50 GiB] / in no VG: 0 [0   ]</span><br></pre></td></tr></tbody></table></figure><p>在本文例子中我们需要增加 / 根分区的空间，用 <strong>df</strong> 命令来查看根分区所挂载的逻辑卷。</p><figure class="highlight shell"><table><tbody><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><span class="line">[root@localhost ~]# df -h</span><br><span class="line">Filesystem            Size  Used Avail Use% Mounted on</span><br><span class="line">/dev/mapper/VolGroup-lv_root</span><br><span class="line">                       38G  8.3G   28G  23% /</span><br><span class="line">tmpfs                 246M     0  246M   0% /dev/shm</span><br><span class="line">/dev/sda1             485M   32M  428M   7% /boot</span><br></pre></td></tr></tbody></table></figure><p>所以我们可以看到 / 根分区是挂载在 <strong>VolGroup-lv_root</strong> 卷组下面的 <strong>root</strong> 逻辑卷</p><p>扩容 root 逻辑卷</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# lvextend -L+10G /dev/mapper/VolGroup-lv_root  /dev/sda3</span><br><span class="line">  Extending logical volume lv_root to 48.54 GiB</span><br><span class="line">  Insufficient free space: 2560 extents needed, but only 2559 available</span><br><span class="line"></span><br><span class="line">[root@localhost ~]# lvextend -L+9.99G /dev/mapper/VolGroup-lv_root  /dev/sda3</span><br><span class="line">  Rounding size to boundary between physical extents: 9.99 GiB</span><br><span class="line">  Extending logical volume lv_root to 48.53 GiB</span><br><span class="line">  Logical volume lv_root successfully resized</span><br></pre></td></tr></tbody></table></figure><p>文件系统扩容:</p><figure class="highlight shell"><table><tbody><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><span class="line">[root@localhost ~]# resize2fs /dev/mapper/VolGroup-lv_root</span><br><span class="line">resize2fs 1.41.12 (17-May-2010)</span><br><span class="line">Filesystem at /dev/mapper/VolGroup-lv_root is mounted on /; on-line resizing required</span><br><span class="line">old desc_blocks = 3, new_desc_blocks = 4</span><br><span class="line">Performing an on-line resize of /dev/mapper/VolGroup-lv_root to 12722176 (4k) blocks.</span><br><span class="line">The filesystem on /dev/mapper/VolGroup-lv_root is now 12722176 blocks long.</span><br></pre></td></tr></tbody></table></figure><p>扩容完毕！</p><figure class="highlight shell"><table><tbody><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><span class="line">[root@localhost ~]# df -h</span><br><span class="line">Filesystem            Size  Used Avail Use% Mounted on</span><br><span class="line">/dev/mapper/VolGroup-lv_root</span><br><span class="line">                       48G  8.4G   37G  19% /</span><br><span class="line">tmpfs                 246M     0  246M   0% /dev/shm</span><br><span class="line">/dev/sda1             485M   32M  428M   7% /boot</span><br></pre></td></tr></tbody></table></figure></body></html>]]></content>
    
    
    <summary type="html">单位有一台基于 CentOS 6.3 搭建的 Cacti 监控系统，使用了很长一段时间了，最后发现 / 根分区空间已经满了，无法再提供服务，于是有了扩容的需求，以下是扩容过程：</summary>
    
    
    
    <category term="*Nix" scheme="http://winotes.net/categories/Nix/"/>
    
    
    <category term="CentOS" scheme="http://winotes.net/tags/CentOS/"/>
    
    <category term="LVM" scheme="http://winotes.net/tags/LVM/"/>
    
    <category term="扩容" scheme="http://winotes.net/tags/%E6%89%A9%E5%AE%B9/"/>
    
    <category term="根分区" scheme="http://winotes.net/tags/%E6%A0%B9%E5%88%86%E5%8C%BA/"/>
    
  </entry>
  
  <entry>
    <title>HP EliteDesk 800 G3 DM 安装黑苹果</title>
    <link href="http://winotes.net/hp-elitedesk-800-g3-dm-hackintosh/"/>
    <id>http://winotes.net/hp-elitedesk-800-g3-dm-hackintosh/</id>
    <published>2018-12-31T08:48:35.000Z</published>
    <updated>2022-04-19T16:16:21.205Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h2 id="GitHub"><a href="#GitHub" class="headerlink" title="GitHub"></a>GitHub</h2><p>本文引用自我的 GitHub:<br><a href="https://github.com/randyzhong/OS-X-HP-EliteDesk-800-G3-DM-Clover">OS-X-HP-EliteDesk-800-G3-DM-Clover</a></p><h2 id="适用机型"><a href="#适用机型" class="headerlink" title="适用机型"></a>适用机型</h2><p>This repository contains the files and scripts to install macOS on the HP EliteDesk 800 G3 Desktop Mini Business PC (35 W/65 W).</p><p><img src="https://support.hp.com/doc-images/700/c05373338.jpg" alt="HP EliteDesk 800 G3 Desktop Mini Business PC"></p><h2 id="Hardware-Specs"><a href="#Hardware-Specs" class="headerlink" title="Hardware Specs"></a>Hardware Specs</h2><h3 id="Basic-info"><a href="#Basic-info" class="headerlink" title="Basic info"></a>Basic info</h3><p>Here is my EliteDesk 800 G3 DM specs:</p><ul><li>Product Number: Y3A18AV</li><li>Product Name: HP EliteDesk 800 G3 DM 65W</li><li>BIOS: P21 Ver.02.22 07/17/2018</li></ul><h3 id="Specs"><a href="#Specs" class="headerlink" title="Specs:"></a>Specs:</h3><ul><li>CPU: Intel® Core i7-7700 @ 3.60 GHz processor (65 W model only)</li><li>GPU: Integrated Intel® HD Graphics 630 (3 DisplayPorts)</li><li>Memory: 2 x 4GB Samsung DDR4-2400</li><li>Storage: Intel® 256 GB SSD, PCI-E Gen3 x 4, Turbo Drive G2 TLC SSD</li><li>LAN: Intel® I219LM Gigabit Network Connection LOM</li><li>WLAN: Intel® 8265 802.11ac 2x2 Wi-Fi with Bluetooth M.2 Combo Card Vpro (802.11ac Wave 2 supported)</li><li>Audio: Conexant CX20632 Audio Codec (all ports are stereo, 1 internal speaker, 1 front headphone, 1 front CITA port)</li></ul><p>Full specs you can get from <a href="https://support.hp.com/us-en/document/c05371240?jumpid=reg_r1002_cnzh_c-001_title_r0002">HP Website</a>.</p><h2 id="Configure-BIOS-Settings"><a href="#Configure-BIOS-Settings" class="headerlink" title="Configure BIOS Settings"></a>Configure BIOS Settings</h2><p>To start, set BIOS to defaults.<br>Then insure:</p><ul><li><p>Advanced -&gt; Boot Options</p><ul><li>Disable <strong>Fast Boot</strong></li><li>Disable <strong>CD-ROM Boot</strong></li><li>Enable <strong>USB Storage Boot</strong></li><li>Disable <strong>Network (PXE) Boot</strong></li></ul></li><li><p>Advanced -&gt; Secure Boot Configuration</p><ul><li>Select <strong>Legacy Support Enable and Secure Boot Disable</strong>, press <strong>F10</strong> to save changes, system will reboot and lead you to Secure Boot and ask you to input a 4 digits security code for authorization, type in the code shows on the screen and enter to reboot and then press <strong>F10</strong> again to enter BIOS configuration</li><li>Uncheck <strong>Enable MS UEFI CA key</strong> if you don’t use Windows</li></ul></li><li><p>Advanced -&gt; System Options</p><ul><li>Disable <strong>Virtualization Technology (VTx)</strong></li><li>Disable <strong>Virtualization Technology for Directed I/O (VTd)</strong></li><li>Enable <strong>M.2 SSD</strong> if you’re using a NVME SSD</li><li>Uncheck <strong>M.2 WLAN/BT</strong> if you’re using a Intel 8265NGW or other unsupported card</li><li>Check <strong>Allow PCIe/PCI SERR# Interrupt</strong> (Uncheck it if have interruption issues)</li></ul></li></ul><h4 id="Advanced-gt-Built-in-Device-Options"><a href="#Advanced-gt-Built-in-Device-Options" class="headerlink" title="Advanced -> Built-in Device Options"></a>Advanced -&gt; Built-in Device Options</h4><ul><li>Disable <strong>Wake on LAN</strong></li><li>Set Video memory size to <strong>64MB</strong> or larger</li><li>Disable <strong>LAN/WLAN Auto Switching</strong></li><li>Disable <strong>Wake on WLAN</strong></li></ul><h4 id="Advanced-gt-Port-Options"><a href="#Advanced-gt-Port-Options" class="headerlink" title="Advanced -> Port Options"></a>Advanced -&gt; Port Options</h4><ul><li>Enable <strong>all</strong> if no specific reasons.</li></ul><h4 id="Advanced-gt-Power-Management-Options"><a href="#Advanced-gt-Power-Management-Options" class="headerlink" title="Advanced -> Power Management Options"></a>Advanced -&gt; Power Management Options</h4><ul><li>Disable <strong>Extended Idle Power States</strong></li></ul><p>Press <strong>F10</strong> to save changes.</p><h2 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h2><ul><li>To be updated</li></ul><h3 id="Tested-OS"><a href="#Tested-OS" class="headerlink" title="Tested OS"></a>Tested OS</h3><ul><li>macOS High Sierra 10.13.6 </li><li>macOS Mojave 10.14.1</li></ul><h3 id="Clover"><a href="#Clover" class="headerlink" title="Clover"></a>Clover</h3><ul><li>Clover r4701.RM (Build by RehabMan)</li></ul><h3 id="Kexts"><a href="#Kexts" class="headerlink" title="Kexts"></a>Kexts</h3><ul><li>EFICheckDisabler.kext (0.5)</li><li>FakePCIID_XHCIMux.kext (1.3.15) </li><li>FakeSMC.kext (6.26-357-gceb835ea.1800)<ul><li>ACPISensors.kext (6.26-357-gceb835ea.1800)</li><li>CPUSensors.kext (6.26-357-gceb835ea.1800)</li><li>GPUSensors.kext (6.26-357-gceb835ea.1800)</li><li>LPCSensors.kext (6.26-357-gceb835ea.1800)</li></ul></li><li>IntelMausiEthernet.kext (2.4.1d1)</li><li>Lilu.kext (1.2.8)<ul><li>Added Resources/Headers and Resources/Library folders which are required to build with AppleALC in Xcode</li></ul></li><li>VoodooHDA.kext (2.9.1)</li><li>WhateverGreen.kext (1.2.4)</li><li>XHCI-unsupported.kext (0.9.2)</li></ul><h2 id="Known-Issues"><a href="#Known-Issues" class="headerlink" title="Known Issues:"></a>Known Issues:</h2><ul><li>Audio codec CX20632 is not supported yet, using VoodooHDA instead</li><li>Sleep is not working (Reboot or blackscreen when trying to wake it)</li></ul></body></html>]]></content>
    
    
    <summary type="html">HP 出品的 1 升迷你机箱，麻雀虽小五脏俱全，我的这台配置为 CPU i7-7700，核显HD630, 8GB内存，256GB Intel SSD， Intel 8265NGW 双频无线网卡，CX20632 声卡，主要部件都支持黑苹果，主要存在的两个问题：一是台式机 U 带的核显 HD630 现在还无法正常睡眠，二是声卡 CX20632 还没有现成的仿冒文件可以用，暂时用 Voodoo HDA 来驱动，以下是我的安装分享。</summary>
    
    
    
    <category term="Hackintosh" scheme="http://winotes.net/categories/Hackintosh/"/>
    
    
    <category term="Hackintosh" scheme="http://winotes.net/tags/Hackintosh/"/>
    
    <category term="HP" scheme="http://winotes.net/tags/HP/"/>
    
    <category term="EliteDesk" scheme="http://winotes.net/tags/EliteDesk/"/>
    
    <category term="黑苹果" scheme="http://winotes.net/tags/%E9%BB%91%E8%8B%B9%E6%9E%9C/"/>
    
  </entry>
  
  <entry>
    <title>CentOS 7 安装 LEMP - PHP5.6 + NGINX + MariaDB/MySQL</title>
    <link href="http://winotes.net/install-php56-nginx-mariadb-mysql-lemp-stack-on-centos7-with-fastcgi/"/>
    <id>http://winotes.net/install-php56-nginx-mariadb-mysql-lemp-stack-on-centos7-with-fastcgi/</id>
    <published>2018-12-29T03:40:11.000Z</published>
    <updated>2019-01-02T10:04:02.679Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h2 id="什么是-LEMP"><a href="#什么是-LEMP" class="headerlink" title="什么是 LEMP"></a>什么是 LEMP</h2><p><img src="/install-php56-nginx-mariadb-mysql-lemp-stack-on-centos7-with-fastcgi/lemp-stack.jpg" alt="LEMP"><br>以前我们常常听说的 LAMP (Linux, Apache, MySQL, and PHP) 是最经典的建站环境之一，迄今仍旧够到很多中小站长的欢迎。但 Apache 的缺点是有些臃肿，资源开销比较大，对硬件的要求相较于其它一些轻量的 Web 服务器要高，， 而 MySQL 的母公司 SUN 在被 Oracle 收购之后，社区担心 MySQL 的开源许可可能会存在闭源风险，于是 MySQL 之父 Michael Widenius (often called Monty) 以他女儿 Maria 的名字创建了MySQL的另外一个衍生版本：MariaDB。在用 NGINX 替代 Apache 和 MariaDB 替代 MySQL 之后，LEMP 就诞生了，尤其适用于服务器资源吃紧，内存少又想压榨出高并发高流量性能的场景。</p><span id="more"></span><h2 id="测试环境"><a href="#测试环境" class="headerlink" title="测试环境"></a>测试环境</h2><p>本文所述的环境基于腾讯云 CentOS 7.5 64-bit 公共镜像搭建，安装完成后的各组件版本如下：</p><ul><li>CentOS 7.5 64-bit</li><li>NGINX 1.14.2</li><li>MariaDB 5.5.60</li><li>PHP 5.6.39*<blockquote><p>*CentOS 官方默认带的 PHP 为 5.4.16，而我们某些程序需要 5.6+ 才能正常运行，本文的目的就是记录下如何安装 PHP5.6 的 LEMP环境</p></blockquote></li></ul><h2 id="开始前的准备工作"><a href="#开始前的准备工作" class="headerlink" title="开始前的准备工作"></a>开始前的准备工作</h2><h3 id="时间设置"><a href="#时间设置" class="headerlink" title="时间设置"></a>时间设置</h3><p><strong>列出当前时间相关设置</strong><br><code>timedatectl status</code></p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">      Local time: Fri 2018-12-28 13:20:01 CST</span><br><span class="line">  Universal time: Fri 2018-12-28 05:20:01 UTC</span><br><span class="line">        RTC time: Fri 2018-12-28 05:19:59</span><br><span class="line">       Time zone: Asia/Shanghai (CST, +0800)</span><br><span class="line">     NTP enabled: no</span><br><span class="line">NTP synchronized: yes</span><br><span class="line"> RTC in local TZ: no</span><br><span class="line">      DST active: n/a</span><br></pre></td></tr></tbody></table></figure><p><strong>1.设置时区</strong><br><code>sudo timedatectl set-timezone Asia/Shanghai</code> （这一步腾讯云的 CentOS 公共镜像已经设置好，可跳过）<br><strong>2.安装 NTP</strong><br><code>sudo yum install ntp</code><br><strong>3.设置为与 NTP 服务器同步</strong><br><code>sudo timedatectl set-ntp true</code><br><strong>4.同步时间</strong><br><code>sudo ntpdate pool.ntp.org</code><br><strong>5.再检查时间设置</strong><br><code>timedatectl status</code> </p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"> Local time: Fri 2018-12-28 14:05:53 CST</span><br><span class="line">  Universal time: Fri 2018-12-28 06:05:53 UTC</span><br><span class="line">        RTC time: Fri 2018-12-28 06:05:51</span><br><span class="line">       Time zone: Asia/Shanghai (CST, +0800)</span><br><span class="line">     NTP enabled: yes</span><br><span class="line">NTP synchronized: yes</span><br><span class="line"> RTC in local TZ: no</span><br><span class="line">      DST active: n/a</span><br></pre></td></tr></tbody></table></figure><h3 id="安装-yum-utils-软件包便于管理维护"><a href="#安装-yum-utils-软件包便于管理维护" class="headerlink" title="安装 yum-utils 软件包便于管理维护"></a>安装 yum-utils 软件包便于管理维护</h3><p><code>sudo yum install yum-utils</code></p><h3 id="获取系统最新更新"><a href="#获取系统最新更新" class="headerlink" title="获取系统最新更新"></a>获取系统最新更新</h3><p><code>sudo yum update</code> #生产环境慎用，这条命令会更新所有软件包，可能会破环依赖关系<br>或者用下面 <code>sudo yum -y update --security</code> 这条命令只更新安全补丁，胆子小的可以用 <code>sudo yum update-minimal --security -y</code></p><blockquote><p>不管更新啥，在测试环境测好再部署到生产环境是必要的</p></blockquote><h3 id="添加含有各种-PHP-版本的-Remi-仓库-本文用的清华大学镜像站点"><a href="#添加含有各种-PHP-版本的-Remi-仓库-本文用的清华大学镜像站点" class="headerlink" title="添加含有各种 PHP 版本的 Remi 仓库 (本文用的清华大学镜像站点)"></a>添加含有各种 PHP 版本的 Remi 仓库 (本文用的清华大学镜像站点)</h3><p><code>sudo yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm</code></p><h3 id="启用-Remi-仓库中-PHP-5-6-的源"><a href="#启用-Remi-仓库中-PHP-5-6-的源" class="headerlink" title="启用 Remi 仓库中 PHP 5.6 的源"></a>启用 Remi 仓库中 PHP 5.6 的源</h3><p><code>sudo yum-config-manager --enable remi-php56</code></p><h2 id="NGINX"><a href="#NGINX" class="headerlink" title="NGINX"></a>NGINX</h2><p>本文推荐从 NGINX 的官方源来安装<br><strong>1.创建 <code>/etc/yum.repos.d/nginx.repo</code> 文件，内容如下</strong></p><figure class="highlight plaintext"><table><tbody><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><span class="line">[nginx]</span><br><span class="line">name=nginx repo</span><br><span class="line"># Choose mainline or stable release</span><br><span class="line">baseurl=http://nginx.org/packages/centos/$releasever/$basearch/</span><br><span class="line"># baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/</span><br><span class="line">gpgcheck=0</span><br><span class="line">enabled=1</span><br></pre></td></tr></tbody></table></figure><p><strong>2.更新源信息</strong><br><code>sudo yum check-update</code></p><p><strong>3.安装 NGINX</strong><br><code>sudo yum install nginx</code></p><p><strong>4.启动 NGINX</strong><br><code>sudo systemctl start nginx</code></p><p><strong>5.将 NGINX 添加到开机自启动</strong><br><code>sudo systemctl enable nginx</code></p><p><strong>6.测试 NGINX</strong><br><img src="/install-php56-nginx-mariadb-mysql-lemp-stack-on-centos7-with-fastcgi/nginx-welcome.jpg" alt="NGINX"></p><h2 id="MariaDB"><a href="#MariaDB" class="headerlink" title="MariaDB"></a>MariaDB</h2><p><strong>1.安装 MariaDB 和 MySQL/MariaDB-PHP 支持包</strong><br><code>sudo yum install mariadb-server php-mysql</code></p><p><strong>2.启动 MariaDB</strong><br><code>sudo systemctl start mariadb</code></p><p><strong>3.将 MariaDB 添加到开机自启动</strong><br><code>sudo systemctl enable mariadb</code></p><p><strong>4.安全设置</strong><br><code>sudo mysql_secure_installation</code></p><p>因为是新安装的 MariaDB，还没有为 root 用户设置密码，直接按回车键<br>Enter current password for root (enter for none):</p><p>接下来按 <strong>Y</strong> 设置 root 密码<br>Set root password? [Y/n] Y<br>New password:<br>Re-enter new password:<br>Password updated successfully!<br>Reloading privilege tables..<br> … Success!</p><p>按 <strong>Y</strong> 或者直接回车键接受以下四个默认安全设置</p><ul><li>Remove anonymous users?</li><li>Disallow root login remotely?</li><li>Remove test database and access to it?</li><li>Reload privilege tables now?</li></ul><p>最后看到如下字样即表示安全设置完成</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">All done!  If you've completed all of the above steps, your MariaDB</span><br><span class="line">installation should now be secure.</span><br><span class="line"></span><br><span class="line">Thanks for using MariaDB!</span><br></pre></td></tr></tbody></table></figure><h2 id="PHP-5-6"><a href="#PHP-5-6" class="headerlink" title="PHP 5.6"></a>PHP 5.6</h2><p><strong>1.安装 PHP FastCGI Processing Manager</strong><br><code>sudo yum install php-fpm</code></p><p><strong>2.已知漏洞修复</strong><br>编辑 <strong>/etc/php.ini</strong> 文件，关闭 NGINX + PHP-FPM 中关于 fix_pathinfo 的一个漏洞，详情参见<a href="http://www.laruence.com/2010/05/20/1495.html">这篇文章</a><br><code>sudo sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php.ini</code></p><p>**3.修改 <strong>/etc/php-fpm.d/<a href="http://www.conf/">www.conf</a></strong><br>PHP 默认是以 Apache 来作为 Web 服务器的，所以其运行的默认用户为 <code>apache</code>，我们需要修改为 <code>nginx</code></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo sed -i <span class="string">'s/user = apache/user = nginx/g'</span> /etc/php-fpm.d/www.conf</span><br><span class="line">sudo sed -i <span class="string">'s/group = apache/group = nginx/g'</span> /etc/php-fpm.d/www.conf</span><br></pre></td></tr></tbody></table></figure><p><strong>4.启动 PHP-FPM</strong><br><code>sudo systemctl start php-fpm</code></p><p><strong>5.将 MariaDB 添加到开机自启动</strong><br><code>sudo systemctl enable php-fpm</code></p><h2 id="配置-NGINX-使其解析-PHP-文件"><a href="#配置-NGINX-使其解析-PHP-文件" class="headerlink" title="配置 NGINX 使其解析 PHP 文件"></a>配置 NGINX 使其解析 PHP 文件</h2><p><strong>1.创建你网站程序的目录</strong><br><code>sudo mkdir -p /var/www/example.com/</code></p><p><strong>2.禁用 NGINX 默认的站点配置文件</strong><br><code>sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled</code></p><p><strong>3.创建 example.com 的站点配置文件</strong><br><code>sudo vi /etc/nginx/conf.d/example.com.conf</code></p><figure class="highlight nginx"><table><tbody><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><span class="line"><span class="section">server</span> {</span><br><span class="line">    <span class="comment"># Ipv4</span></span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># IPv6</span></span><br><span class="line">    <span class="comment"># listen [::]:80;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># SSL Ipv4 &amp; v6</span></span><br><span class="line">    <span class="comment"># listen 443 ssl;</span></span><br><span class="line">    <span class="comment"># listen [::]:443 ssl;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># [REQUIRED EDIT] Your domain name goes here</span></span><br><span class="line">    <span class="attribute">server_name</span> example.com www.example.com;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># [REQUIRED EDIT] Absolute path to your website root on the filesystem</span></span><br><span class="line">    <span class="attribute">root</span> /var/www/example.com;</span><br><span class="line">        </span><br><span class="line">    <span class="attribute">index</span> index.php index.html index.htm;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># PHP FPM part</span></span><br><span class="line">        <span class="section">location</span> <span class="regexp">~ [^/]\.php(/|$)</span> {</span><br><span class="line">                <span class="attribute">fastcgi_split_path_info</span><span class="regexp"> ^(.+?\.php)(/.*)$</span>;</span><br><span class="line">                <span class="attribute">if</span> (!-f <span class="variable">$document_root</span><span class="variable">$fastcgi_script_name</span>) {</span><br><span class="line">                        <span class="attribute">return</span> <span class="number">404</span>;</span><br><span class="line">                }</span><br><span class="line"></span><br><span class="line">        <span class="comment"># Mitigate https://httpoxy.org/ vulnerabilities</span></span><br><span class="line">        <span class="attribute">fastcgi_param</span> HTTP_PROXY <span class="string">""</span>;</span><br><span class="line"></span><br><span class="line">         <span class="attribute">fastcgi_pass</span> <span class="number">127.0.0.1:9000</span>;</span><br><span class="line">         <span class="attribute">fastcgi_index</span> index.php;</span><br><span class="line"></span><br><span class="line">        <span class="comment"># include the fastcgi_param setting</span></span><br><span class="line">        <span class="attribute">include</span> fastcgi_params;</span><br><span class="line"></span><br><span class="line">        <span class="comment"># SCRIPT_FILENAME parameter is used for PHP FPM determining</span></span><br><span class="line">        <span class="comment">#  the script name. If it is not set in fastcgi_params file,</span></span><br><span class="line">        <span class="comment"># i.e. /etc/nginx/fastcgi_params or in the parent contexts,</span></span><br><span class="line">        <span class="comment"># please comment off following line:</span></span><br><span class="line">        <span class="attribute">fastcgi_param</span>  SCRIPT_FILENAME   <span class="variable">$document_root</span><span class="variable">$fastcgi_script_name</span>;    </span><br><span class="line">        }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p><strong>4.测试 PHP 解析</strong><br><code>sudo vi /var/www/example.com/info.php</code></p><p>编辑该文件内容如下：</p><figure class="highlight php"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span> <span class="title function_ invoke__">phpinfo</span>(); <span class="meta">?&gt;</span></span><br></pre></td></tr></tbody></table></figure><p>然后访问 <a href="http://example.com/info.php">http://example.com/info.php</a> ，正常的话你应该能看到 PHP 信息页面了。</p><p><strong>5.404 not found/403 Forbidden</strong><br>如果你确认以上操作都已经正常进行，NGINX 和 PHP-FPM 的配置文件都已经改好，但是在访问 PHP 页面的时候出现 404 not found/403 Forbidden 或者 FastCGI sent in stderr: Unable to open primary script 错误，那么有可能是 SELinux 的问题。你可以通过查看 SELinux 的审计日志 <strong>/var/log/audit/audit.log</strong> 来确认，一般会出现 avc: denied { read } for pid=1213 comm=”nginx” name=“info.php”… 之类的错误。<br>问题确认后，我们用 <code>setstatus</code> 来查看当前的 SELinux 设置</p><figure class="highlight bash"><table><tbody><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><span class="line"><span class="comment"># sestatus</span></span><br><span class="line">SELinux status:                 enabled</span><br><span class="line">SELinuxfs mount:                /sys/fs/selinux</span><br><span class="line">SELinux root directory:         /etc/selinux</span><br><span class="line">Loaded policy name:             targeted</span><br><span class="line">Current mode:                   enforcing</span><br><span class="line">Mode from config file:          enforcing</span><br><span class="line">Policy MLS status:              enabled</span><br><span class="line">Policy deny_unknown status:     allowed</span><br><span class="line">Max kernel policy version:      31</span><br></pre></td></tr></tbody></table></figure><p> 或者 <code>cat /etc/selinux/config</code> </p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># cat /etc/selinux/config </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># This file controls the state of SELinux on the system.</span></span><br><span class="line"><span class="comment"># SELINUX= can take one of these three values:</span></span><br><span class="line"><span class="comment">#     enforcing - SELinux security policy is enforced.</span></span><br><span class="line"><span class="comment">#     permissive - SELinux prints warnings instead of enforcing.</span></span><br><span class="line"><span class="comment">#     disabled - No SELinux policy is loaded.</span></span><br><span class="line">SELINUX=enforcing</span><br><span class="line"><span class="comment"># SELINUXTYPE= can take one of three two values:</span></span><br><span class="line"><span class="comment">#     targeted - Targeted processes are protected,</span></span><br><span class="line"><span class="comment">#     minimum - Modification of targeted policy. Only selected processes are protected. </span></span><br><span class="line"><span class="comment">#     mls - Multi Level Security protection.</span></span><br><span class="line">SELINUXTYPE=targeted</span><br></pre></td></tr></tbody></table></figure><p>如果当前状态是 <strong>enforcing</strong>，说明 SELinux 已经启用，那么你可以试着用 <code>setenforce 0</code> 禁用 SELinux（只显示告警）再尝试访问 PHP 文件，如果可以成功访问那你也有两个选择，一是禁用 SELinux （可能没那么安全），二是使用 <strong>restorecon</strong> 来恢复网站目录的 SELinux 安全配置上下文信息：<br><code>restorecon -R -v /var/www/example.com</code></p><p>若是之后部署有些网站程序还是没法访问，确定是 SELinux 的锅但是你又想留着它的话，可参考以下几篇文章：</p><ul><li><a href="https://www.nginx.com/blog/using-nginx-plus-with-selinux/">Using NGINX and NGINX Plus with SELinux</a></li><li><a href="https://wiki.centos.org/HowTos/SELinux">SELinux - CentOS Wiki</a></li><li><a href="https://www.serverlab.ca/tutorials/linux/web-servers-linux/configuring-selinux-policies-for-apache-web-servers/">Configuring SELinux Policies for Apache Web Servers</a> - 这篇讲 Apache 的，但还是可以作为参考</li></ul></body></html>]]></content>
    
    
    <summary type="html">以前我们常常听说的 LAMP (Linux, Apache, MySQL, and PHP) 是最经典的建站环境之一，迄今仍旧够到很多中小站长的欢迎。但 Apache 的缺点是有些臃肿，资源开销比较大，对硬件的要求相较于其它一些轻量的 Web 服务器要高，， 而 MySQL 的母公司 SUN 在被 Oracle 收购之后，社区担心 MySQL 的开源许可可能会存在闭源风险，于是 MySQL 之父 Michael Widenius (often called Monty) 以他女儿 Maria 的名字创建了MySQL的另外一个衍生版本：MariaDB。在用 NGINX 替代 Apache 和 MariaDB 替代 MySQL 之后，LEMP 就诞生了，尤其适用于服务器资源吃紧，内存少又想压榨出高并发高流量性能的场景。本文就是记录在 CentOS 7.5 64-bit 系统下面安装 LEMP (PHP5.6 + NGINX + MariaDB/MySQL) 的步骤。</summary>
    
    
    
    <category term="*Nix" scheme="http://winotes.net/categories/Nix/"/>
    
    
    <category term="CentOS" scheme="http://winotes.net/tags/CentOS/"/>
    
    <category term="PHP" scheme="http://winotes.net/tags/PHP/"/>
    
    <category term="LEMP" scheme="http://winotes.net/tags/LEMP/"/>
    
    <category term="Nginx" scheme="http://winotes.net/tags/Nginx/"/>
    
    <category term="MariaDB" scheme="http://winotes.net/tags/MariaDB/"/>
    
    <category term="MySQL" scheme="http://winotes.net/tags/MySQL/"/>
    
  </entry>
  
  <entry>
    <title>Cisco 路由器作为 DHCP 服务器在 Skyepe for Business (Lync) 部署中的注意事项</title>
    <link href="http://winotes.net/using-cisco-router-as-dhcp-with-long-option43-in-skype-lync-deployment/"/>
    <id>http://winotes.net/using-cisco-router-as-dhcp-with-long-option43-in-skype-lync-deployment/</id>
    <published>2018-11-05T07:40:11.000Z</published>
    <updated>2019-01-02T01:40:18.122Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>这个问题是以前遇到过的，最近又有人问起，索性在此记录一下：</p><p>在部署 Skype/Lync 过程中，我们需要用到 DHCP Option 120 和 43，通常来说，我们会使用 Windows 服务器来做 DHCP，但有的时候，我们在分支机构可能会使用本地的路由器来当 DHCP 服务器，Option 120 通常没有问题，而坑出现在 Option 43, 因为 Skype 走的是 TCP，而且是 SIP over TLS，所以 Option 43 里面是不可以用 IP 地址的，必须要用 FQDN，而且大多数设备需要输入16进制而不是 ASCII 码，那这个时候，你有可能会遇到以下两种情况：</p><span id="more"></span><ol><li>你的 SIP 服务器的 FQDN 名字长度很短，没有超过23个字符，那么使用 DHCPUtil.exe 生成的 Option 43 的 Hex 值长度会在180个字符以内，这种情况使用思科路由器作 DHCP 没有问题:<figure class="highlight plaintext"><table><tbody><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><span class="line">C:\Program Files\Common Files\Skype for Business Server 2015&gt;DHCPUtil.exe -sipserver server.fqdn.company.com</span><br><span class="line">SIP Server FQDN : server.fqdn.company.com</span><br><span class="line">Certificate Provisioning Service URL : https://server.fqdn.company.com:443/CertProv/CertProvisioningService.svc</span><br><span class="line"></span><br><span class="line">Option 120:</span><br><span class="line">0006736572766572046671646E07636F6D70616E7903636F6D00</span><br><span class="line"></span><br><span class="line">Vendor Class Identifier: MS-UC-Client</span><br><span class="line">Option 43 (for vendor=MS-UC-Client):</span><br><span class="line">        Full Option 43 value (Length: 180) : </span><br><span class="line">        010C4D532D55432D436C69656E740205687474707303177365727665722E6671646E2E636F6</span><br><span class="line">        D70616E792E636F6D040334343305252F4365727450726F762F4365727450726F766973696F6E696E67536572766963652E737663</span><br><span class="line">        sub-option 1 &lt;UC Identifier&gt;: 4D532D55432D436C69656E74</span><br><span class="line">        sub-option 2 &lt;URL Scheme&gt;: 6874747073</span><br><span class="line">        sub-option 3 &lt;Web Server FQDN&gt;: 7365727665722E6671646E2E636F6D70616E792E636F6D</span><br><span class="line">        sub-option 4 &lt;Port&gt;: 343433</span><br><span class="line">        sub-option 5 &lt;Relative Path for Cert Prov&gt;: 2F4365727450726F762F4365727450726F766973696F6E696E67536572766963652E737663</span><br><span class="line"></span><br><span class="line">To configure DHCP Server with appropriate values, you can do one of the following things:</span><br><span class="line">        1. Run DHCPUtil on the DHCP Server: use '-RunConfigScript' switch</span><br><span class="line">        2. Run the following command on the DHCP Server (modify the path of DHCPConfigScript.bat appropriately):</span><br><span class="line">"C:\Program Files\Common Files\Skype for Business Server 2015\DHCPConfigScript.bat" Configure MS-UC-Client 0006736572766572046671646E07636F6D70616E7903636F6D00 4D532D55432D436C69656E74 6874747073 </span><br><span class="line">7365727665722E6671646E2E636F6D70616E792E636F6D 343433 2F4365727450726F762F4365727450726F766973696F6E696E67536572766963652E737663</span><br></pre></td></tr></tbody></table></figure><h3 id="踩坑"><a href="#踩坑" class="headerlink" title="踩坑"></a>踩坑</h3></li><li>一旦你的 SIP 服务器的 FQDN 名字长度超过23个字符，DHCPUtil.exe 生成的 Option 43 的 Hex 值长度会超过180个字符：<figure class="highlight plaintext"><table><tbody><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></pre></td><td class="code"><pre><span class="line">C:\Program Files\Common Files\Skype for Business Server 2015&gt;DHCPUtil.exe -sipserver sipserver.fqdn.company.com</span><br><span class="line">SIP Server FQDN : sipserver.fqdn.company.com</span><br><span class="line">Certificate Provisioning Service URL : https://sipserver.fqdn.company.com:443/CertProv/CertProvisioningService.svc</span><br><span class="line"></span><br><span class="line">Option 120:</span><br><span class="line">0009736970736572766572046671646E07636F6D70616E7903636F6D00</span><br><span class="line"></span><br><span class="line">Vendor Class Identifier: MS-UC-Client</span><br><span class="line">Option 43 (for vendor=MS-UC-Client):</span><br><span class="line">        Full Option 43 value (Length: 186) : </span><br><span class="line">        010C4D532D55432D436C69656E7402056874747073031A7369707365727665722E6671646E2</span><br><span class="line">        E636F6D70616E792E636F6D040334343305252F4365727450726F762F4365727450726F766973696F6E696E67536572766963652E737663</span><br><span class="line">        sub-option 1 &lt;UC Identifier&gt;: 4D532D55432D436C69656E74</span><br><span class="line">        sub-option 2 &lt;URL Scheme&gt;: 6874747073</span><br><span class="line">        sub-option 3 &lt;Web Server FQDN&gt;: 7369707365727665722E6671646E2E636F6D70616E792E636F6D</span><br><span class="line">        sub-option 4 &lt;Port&gt;: 343433</span><br><span class="line">        sub-option 5 &lt;Relative Path for Cert Prov&gt;: 2F4365727450726F762F4365727450726F766973696F6E696E67536572766963652E737663</span><br><span class="line"></span><br><span class="line">To configure DHCP Server with appropriate values, you can do one of the following things:</span><br><span class="line">        1. Run DHCPUtil on the DHCP Server: use '-RunConfigScript' switch</span><br><span class="line">        2. Run the following command on the DHCP Server (modify the path of DHCPConfigScript.bat appropriately):</span><br><span class="line">"C:\Program Files\Common Files\Skype for Business Server 2015\DHCPConfigScript.bat" Configure MS-UC-Client 0009736970736572766572046671646E07636F6D70616E7903636F6D00 4D532D55432D436C69656E74 6874747073 7369707365727665722E6671646E2E636F6D70616E792E636F6D 343433 2F4365727450726F762F4365727450726F766973696F6E696E67536572766963652E737663</span><br></pre></td></tr></tbody></table></figure></li></ol><p>这个时候，坑就来了，当你复制 Option 43 这一段去到思科路由器上的时候，路由器并不会报错，但是会将你输入的值截短至<strong>180</strong>个字符</p><p>而且没有任何提示，如果是在部署 Skype 电话的时候，你会发现 PIN 认证始终没法出现，你要不仔细检查的话是发现不了问题。</p><p>输入的命令</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">ip dhcp pool POOL1</span><br><span class="line"> network 192.168.10.0 255.255.255.0</span><br><span class="line"> domain-name corp.company.local</span><br><span class="line"> dns-server 119.29.29.29 8.8.8.8</span><br><span class="line"> default-router 192.168.10.1</span><br><span class="line"> option 43 hex 010C4D532D55432D436C69656E7402056874747073031A7369707365727665722E6671646E2E636F6D70616E792E636F6D040334343305252F4365727450726F762F4365727450726F766973696F6E696E67536572766963652E737663</span><br><span class="line"> option 120 hex 0009736970736572766572046671646E07636F6D70616E7903636F6D00</span><br><span class="line"> lease 1</span><br></pre></td></tr></tbody></table></figure><p>路由器接受的：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">ip dhcp pool POOL1</span><br><span class="line"> network 192.168.10.0 255.255.255.0</span><br><span class="line"> domain-name corp.company.local</span><br><span class="line"> dns-server 119.29.29.29 8.8.8.8</span><br><span class="line"> default-router 192.168.10.1</span><br><span class="line"> option 43 hex 010c.4d53.2d55.432d.436c.6965.6e74.0205.6874.7470.7303.1a73.6970.7365.7276.6572.2e66.7164.6e2e.636f.6d70.616e.792e.636f.6d04.0334.3433.0525.2f43.6572.7450.726f.762f.4365.7274.5072.6f76.6973.696f.6e69.6e67.5365.7276.6963.652e</span><br><span class="line"> option 120 hex 0009.7369.7073.6572.7665.7204.6671.646e.0763.6f6d.7061.6e79.0363.6f6d.00</span><br><span class="line"> lease 1</span><br></pre></td></tr></tbody></table></figure><p>可以看到，Option 43 最后的6个字符 <strong>737663</strong> 被吃了！</p><p>思科对此的解释如下，自 IOS 15.1(3)S 以后，Option 后面跟的 hex 部分做了长度限制，超过 180 字符的部分将被截短。</p><table><thead><tr><th>Release</th><th>Modification</th></tr></thead><tbody><tr><td>12.0(1)T</td><td>This command was introduced.</td></tr><tr><td>12.2(33)SRA</td><td>This command was integrated into Cisco IOS Release 12.2(33)SRA.</td></tr><tr><td>12.2SX</td><td>This command was supported in the Cisco IOS Release 12.2SX train. Support in a specific 12.2SX release of this train depends on your feature set, platform, and platform hardware.</td></tr><tr><td>12.4(24)T</td><td>This command was modified. The none keyword was added.</td></tr><tr><td>15.1(3)S</td><td>This command was modified. A maximum limit of 180 characters was set for the dotted hexadecimal data and 255 characters for the ASCII data.</td></tr></tbody></table><blockquote><p>The hexadecimal value is truncated to 180 characters entered. Each byte in hexadecimal character strings is two hexadecimal digits. Each byte can be separated by a period, colon, or white space.</p></blockquote><h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><p>那么有什么解决方案吗？</p><ol><li>缩短你的 SIP 服务器 FQDN 名称小于等于23个字符</li><li>换用其它设备或者服务器系统作为 DHCP，比如把 DHCP 从思科路由器上移到思科交换机（思科交换机不存在这个问题）上或者干脆用 Windows Server</li><li>降级路由器的 IOS 版本至 15.1(3)S 以下</li><li>升级 IOS 版本，在 Cisco IOS XE Release 3.2.1S 之后引入了一个 option ext 的命令，这个扩展命令可以支持 255 个字节的 hex 值。</li></ol><blockquote><p>思科官方介绍：<br>Using the option ext command you can specify an ASCII string upto 255 characters or 255 bytes of hexadecimal data.</p></blockquote><p>所以你的命令看起来应该是这样的：</p><figure class="highlight plaintext"><table><tbody><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><span class="line">ip dhcp pool POOL1</span><br><span class="line"> network 192.168.10.0 255.255.255.0</span><br><span class="line"> domain-name corp.company.local</span><br><span class="line"> dns-server 119.29.29.29 8.8.8.8</span><br><span class="line"> default-router 192.168.10.1</span><br><span class="line"> option ext 43 hex Your full Option 43 hex value here - part1</span><br><span class="line"> option ext 43 hex Your full Option 43 hex value here - part2</span><br><span class="line"> option 120 hex Your Option 120 hex value here</span><br><span class="line"> lease 1</span><br></pre></td></tr></tbody></table></figure><p>如果这些方案你都没办法实施，那么在部署某些设备比如 Polycom VVX 系列的 Skype Phone 的时候，你还可以用 DHCP Override 去指定 SIP 服务的 URI：<br><img src="/using-cisco-router-as-dhcp-with-long-option43-in-skype-lync-deployment/polycom_dhcp_option43_override.jpg" alt="Polycom VVX DHCP Override"></p><h3 id="附件"><a href="#附件" class="headerlink" title="附件"></a>附件</h3><p>最后，再附上 <a href="/using-cisco-router-as-dhcp-with-long-option43-in-skype-lync-deployment/dhcputil.zip" title="DHCPUtil.exe">DHCPUtil.exe</a> 和相关的 <a href="/using-cisco-router-as-dhcp-with-long-option43-in-skype-lync-deployment/msvcr110.zip" title="DLL文件">DLL文件</a> 下载，希望以上能帮到被此困扰的朋友。</p></body></html>]]></content>
    
    
    <summary type="html">Cisco 路由器作为 DHCP 服务器在 Skyepe for Business (Lync) 部署中的注意事项</summary>
    
    
    
    <category term="沟通协作" scheme="http://winotes.net/categories/%E6%B2%9F%E9%80%9A%E5%8D%8F%E4%BD%9C/"/>
    
    
    <category term="Lync" scheme="http://winotes.net/tags/Lync/"/>
    
    <category term="Skype for Business" scheme="http://winotes.net/tags/Skype-for-Business/"/>
    
    <category term="DHCP" scheme="http://winotes.net/tags/DHCP/"/>
    
    <category term="Cisco" scheme="http://winotes.net/tags/Cisco/"/>
    
  </entry>
  
  <entry>
    <title>如何从命令行获取电脑的序列号</title>
    <link href="http://winotes.net/how-to-retrieve-computer-serial-number-from-command-line/"/>
    <id>http://winotes.net/how-to-retrieve-computer-serial-number-from-command-line/</id>
    <published>2018-09-20T07:10:11.000Z</published>
    <updated>2018-09-29T08:07:22.212Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><p>序列号获取的方式有很多种，最直接的当然是直接在电脑的外观标签上查找，也可以在 BIOS 中查询，或者利用品牌机官方的工具来查询。不过，在某些特殊的场景下，也许你也想使用命令行来获得机器的序列号信息。</p><p>那么，以下这些也许可以帮到你：</p><h4 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h4><p><code>wmic bios get serialnumber</code></p><h4 id="Mac-OS-X"><a href="#Mac-OS-X" class="headerlink" title="Mac OS X"></a>Mac OS X</h4><p><code>ioreg -l | grep IOPlatformSerialNumber</code></p><h4 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h4><p><code>sudo dmidecode -t system | grep Serial</code></p><h5 id="补充说明"><a href="#补充说明" class="headerlink" title="补充说明"></a>补充说明</h5><p>这条命令可以查到电脑的型号：<br><code>wmic csproduct get name</code></p><p>或者你也可以这样来查询电脑型号以及序列号<br><code>wmic csproduct get identifyingnumber,name</code></p><p>以上命令并不适用于所有的电脑，有时你也可见到这样的返回值：</p><ul><li><p>SerialNumber<br>To Be Filled By O.E.M.</p></li><li><p>SerialNumber<br>0</p></li></ul><p>这些都是因为制造商没有将信息录入正确造成的。</p><h5 id="一些有用的-WMIC-查询"><a href="#一些有用的-WMIC-查询" class="headerlink" title="一些有用的 WMIC 查询"></a>一些有用的 WMIC 查询</h5><table><thead><tr><th>Name</th><th>Queries</th></tr></thead><tbody><tr><td>baseboard</td><td>get Manufacturer, Model, Name, PartNumber, slotlayout, serialnumber, poweredon</td></tr><tr><td>bios</td><td>get name, version, serialnumber</td></tr><tr><td>bootconfig</td><td>get BootDirectory, Caption, TempDirectory, Lastdrive</td></tr><tr><td>cdrom</td><td>get Name, Drive, Volumename</td></tr><tr><td>computersystem</td><td>get Name, domain, Manufacturer, Model, NumberofProcessors, PrimaryOwnerName,Username, Roles, totalphysicalmemory /format:list</td></tr><tr><td>cpu</td><td>get Name, Caption, MaxClockSpeed, DeviceID, Status</td></tr><tr><td>datafile</td><td>where name=’c:\boot.ini’ get Archive, FileSize, FileType, InstallDate, Readable, Writeable, System, Version</td></tr><tr><td>dcomapp</td><td>get Name, AppID /format:list</td></tr><tr><td>desktop</td><td>get Name, ScreenSaverExecutable, ScreenSaverActive, Wallpaper /format:list</td></tr><tr><td>desktopmonitor</td><td>get screenheight, screenwidth</td></tr><tr><td>diskdrive</td><td>get Name, Manufacturer, Model, InterfaceType, MediaLoaded, MediaType</td></tr><tr><td>diskquota</td><td>get User, Warninglimit, DiskSpaceUsed, QuotaVolume</td></tr><tr><td>environment</td><td>get Description, VariableValue</td></tr><tr><td>fsdir</td><td>where name=’c:\windows’ get Archive, CreationDate, LastModified, Readable, Writeable, System, Hidden, Status</td></tr><tr><td>group</td><td>get Caption, InstallDate, LocalAccount, Domain, SID, Status</td></tr><tr><td>idecontroller</td><td>get Name, Manufacturer, DeviceID, Status</td></tr><tr><td>irq</td><td>get Name, Status</td></tr><tr><td>job</td><td>get Name, Owner, DaysOfMonth, DaysOfWeek, ElapsedTime, JobStatus, StartTime, Status</td></tr><tr><td>loadorder</td><td>get Name, DriverEnabled, GroupOrder, Status</td></tr><tr><td>logicaldisk</td><td>get Name, Compressed, Description, DriveType, FileSystem, FreeSpace, SupportsDiskQuotas, VolumeDirty, VolumeName</td></tr><tr><td>memcache</td><td>get Name, BlockSize, Purpose, MaxCacheSize, Status</td></tr><tr><td>memlogical</td><td>get AvailableVirtualMemory, TotalPageFileSpace, TotalPhysicalMemory, TotalVirtualMemory</td></tr><tr><td>memphysical</td><td>get Manufacturer, Model, SerialNumber, MaxCapacity, MemoryDevices</td></tr><tr><td>netclient</td><td>get Caption, Name, Manufacturer, Status</td></tr><tr><td>netlogin</td><td>get Name, Fullname, ScriptPath, Profile, UserID, NumberOfLogons, PasswordAge, LogonServer, HomeDirectory, PrimaryGroupID</td></tr><tr><td>netprotocol</td><td>get Caption, Description, GuaranteesSequencing, SupportsBroadcasting, SupportsEncryption, Status</td></tr><tr><td>netuse</td><td>get Caption, DisplayType, LocalName, Name, ProviderName, Status</td></tr><tr><td>nic</td><td>get AdapterType, AutoSense, Name, Installed, MACAddress, PNPDeviceID,PowerManagementSupported, Speed, StatusInfo</td></tr><tr><td>nicconfig</td><td>get MACAddress, DefaultIPGateway, IPAddress, IPSubnet, DNSHostName, DNSDomain</td></tr><tr><td>nicconfig</td><td>get MACAddress, IPAddress, DHCPEnabled, DHCPLeaseExpires, DHCPLeaseObtained, DHCPServer</td></tr><tr><td>nicconfig</td><td>get MACAddress, IPAddress, DNSHostName, DNSDomain, DNSDomainSuffixSearchOrder, DNSEnabledForWINSResolution, DNSServerSearchOrder</td></tr><tr><td>nicconfig</td><td>get MACAddress, IPAddress, WINSPrimaryServer, WINSSecondaryServer, WINSEnableLMHostsLookup, WINSHostLookupFile</td></tr><tr><td>ntdomain</td><td>get Caption, ClientSiteName, DomainControllerAddress, DomainControllerName, Roles, Status</td></tr><tr><td>ntevent</td><td>where (LogFile=’system’ and SourceName=’W32Time’) get Message, TimeGenerated</td></tr><tr><td>ntevent</td><td>where (LogFile=’system’ and SourceName=’W32Time’ and Message like ‘%timesource%’) get Message, TimeGenerated</td></tr><tr><td>ntevent</td><td>where (LogFile=’system’ and SourceName=’W32Time’ and EventCode!=’29’) get TimeGenerated, EventCode, Message</td></tr><tr><td>onboarddevice</td><td>get Description, DeviceType, Enabled, Status</td></tr><tr><td>os</td><td>get Version, Caption, CountryCode, CSName, Description, InstallDate, SerialNumber, ServicePackMajorVersion, WindowsDirectory /format:list</td></tr><tr><td>os</td><td>get CurrentTimeZone, FreePhysicalMemory, FreeVirtualMemory, LastBootUpTime, NumberofProcesses, NumberofUsers, Organization, RegisteredUser, Status</td></tr><tr><td>pagefile</td><td>get Caption, CurrentUsage, Status, TempPageFile</td></tr><tr><td>pagefileset</td><td>get Name, InitialSize, MaximumSize</td></tr><tr><td>partition</td><td>get Caption, Size, PrimaryPartition, Status, Type</td></tr><tr><td>printer</td><td>get DeviceID, DriverName, Hidden, Name, PortName, PowerManagementSupported, PrintJobDataType, VerticalResolution, Horizontalresolution</td></tr><tr><td>printjob</td><td>get Description, Document, ElapsedTime, HostPrintQueue, JobID, JobStatus, Name, Notify, Owner, TimeSubmitted, TotalPages</td></tr><tr><td>process</td><td>get Caption, CommandLine, Handle, HandleCount, PageFaults, PageFileUsage, PArentProcessId, ProcessId, ThreadCount</td></tr><tr><td>product</td><td>get Description, InstallDate, Name, Vendor, Version</td></tr><tr><td>qfe</td><td>get description, FixComments, HotFixID, InstalledBy, InstalledOn, ServicePackInEffect</td></tr><tr><td>quotasetting</td><td>get Caption, DefaultLimit, Description, DefaultWarningLimit, SettingID, State</td></tr><tr><td>recoveros</td><td>get AutoReboot, DebugFilePath, WriteDebugInfo, WriteToSystemLog</td></tr><tr><td>Registry</td><td>get CurrentSize, MaximumSize, ProposedSize, Status</td></tr><tr><td>scsicontroller</td><td>get Caption, DeviceID, Manufacturer, PNPDeviceID</td></tr><tr><td>server</td><td>get ErrorsAccessPermissions, ErrorsGrantedAccess, ErrorsLogon, ErrorsSystem, FilesOpen, FileDirectorySearches</td></tr><tr><td>service</td><td>get Name, Caption, State, ServiceType, StartMode, pathname</td></tr><tr><td>share</td><td>get name, path, Status</td></tr><tr><td>sounddev</td><td>get Caption, DeviceID, PNPDeviceID, Manufacturer, Status</td></tr><tr><td>startup</td><td>get Caption, Location, Command</td></tr><tr><td>sysaccount</td><td>get Caption, Domain, Name, SID, SIDType, Status</td></tr><tr><td>sysdriver</td><td>get Caption, Name, PathName, ServiceType, State, Status</td></tr><tr><td>systemenclosure</td><td>get Caption, Height, Depth, Manufacturer, Model, SMBIOSAssetTag, AudibleAlarm, SecurityStatus, SecurityBreach, PoweredOn, NumberOfPowerCords</td></tr><tr><td>systemslot</td><td>get Number, SlotDesignation, Status, SupportsHotPlug, Version, CurrentUsage, ConnectorPinout</td></tr><tr><td>tapedrive</td><td>get Name, Capabilities, Compression, Description, MediaType, NeedsCleaning, Status, StatusInfo</td></tr><tr><td>timezone</td><td>get Caption, Bias, DaylightBias, DaylightName, StandardName</td></tr><tr><td>useraccount</td><td>get AccountType, Description, Domain, Disabled, LocalAccount, Lockout, PasswordChangeable, PasswordExpires, PasswordRequired, SID</td></tr><tr><td>memorychip</td><td>get BankLabel, Capacity, Caption, CreationClassName, DataWidth, Description, Devicelocator, FormFactor, HotSwappable, InstallDate, InterleaveDataDepth, InterleavePosition, Manufacturer, MemoryType, Model, Name, OtherIdentifyingInfo, PartNumber, PositionInRow, PoweredOn, Removable, Replaceable, SerialNumber, SKU, Speed, Status, Tag, TotalWidth, TypeDetail, Version</td></tr></tbody></table></body></html>]]></content>
    
    
    <summary type="html">序列号获取的方式有很多种，最直接的当然是直接在电脑的外观标签上查找，也可以在 BIOS 中查询，或者利用品牌机官方的工具来查询。不过，在某些特殊的场景下，也许你也想使用命令行来获得机器的序列号信息。</summary>
    
    
    
    <category term="Microsoft" scheme="http://winotes.net/categories/Microsoft/"/>
    
    <category term="Windows" scheme="http://winotes.net/categories/Microsoft/Windows/"/>
    
    
    <category term="Windows" scheme="http://winotes.net/tags/Windows/"/>
    
    <category term="WMIC" scheme="http://winotes.net/tags/WMIC/"/>
    
  </entry>
  
  <entry>
    <title>如何在 Exchange 2010 中给密码即将过期用户发送提醒邮件</title>
    <link href="http://winotes.net/how-to-send-password-expiry-email-with-exchange-2010/"/>
    <id>http://winotes.net/how-to-send-password-expiry-email-with-exchange-2010/</id>
    <published>2018-08-20T07:40:11.000Z</published>
    <updated>2018-08-21T07:47:10.676Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><p>一般来说，在部署了微软活动目录的企业域环境中，为了安全起见，不会将用户的密码设置为永不过期，通常设置为60天到90天更改一次，相对比较安全。在密码快要过期的时候，用户登录 Windows 时会有提醒修改密码。不过，也会有很多员工根本不去看这个提示甚至忽略掉，一旦员工域帐号的密码过期时间是在公众假期甚至是外地出差期间，那么结果就是包含邮件在内的相关应用系统无法登陆。随之给域管理员的工作带来压力。有各种各样的方法可以减少此种事件发生，一些第三方工具甚至可以开放给员工自助的密码忘记/重设服务，我们这里不做探讨。</p><span id="more"></span><p>今天要给大家分享的两个脚本，一个通过 VBscript 找出密码快要过期的用户，另外一个使用 PowerShell 给这些用户发送密码过期提醒邮件，通过设置计划任务部署脚本后已经在某企业稳定运行七年时间，经统计可以减少域管理员密码重设次数60%以上，不失为一种简单高效的方案。</p><h3 id="PasswordCheck-vbs"><a href="#PasswordCheck-vbs" class="headerlink" title="PasswordCheck.vbs"></a>PasswordCheck.vbs</h3><figure class="highlight vbs"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="comment">'############################  PasswordCheck.vbs  ################################</span></span><br><span class="line"><span class="comment">' Author:Randy Zhong</span></span><br><span class="line"><span class="comment">' Source:https://github.com/randyzhong/</span></span><br><span class="line"><span class="comment">'Description: This script use VBScript to check user's password expiration date.</span></span><br><span class="line"><span class="comment">' If Lastdate equals 7,5,3,2,1, DisplayName,Email,LastDate,Runtime </span></span><br><span class="line"><span class="comment">' will be recorded to OutFile in CSV format.</span></span><br><span class="line"><span class="comment">'Version:1.0.0</span></span><br><span class="line"><span class="comment">'#################################################################################</span></span><br><span class="line"></span><br><span class="line"><span class="comment">'Changelog:   </span></span><br><span class="line"><span class="comment">'2011.05.11 v1.0.0 - initial release</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">'Const VARIABLES - DON'T EDIT</span></span><br><span class="line"><span class="keyword">On</span> <span class="keyword">Error</span> <span class="keyword">Resume</span> <span class="keyword">Next</span></span><br><span class="line"><span class="keyword">Const</span> ADS_SCOPE_SUBTREE = <span class="number">2</span></span><br><span class="line"><span class="keyword">Const</span> SEC_IN_DAY = <span class="number">86400</span></span><br><span class="line"><span class="keyword">Const</span> ADS_UF_DONT_EXPIRE_PASSWD = &amp;h10000</span><br><span class="line"><span class="keyword">Const</span> ForWriting = <span class="number">2</span></span><br><span class="line"><span class="keyword">Const</span> E_ADS_Property_Not_Found = &amp;h8000500D</span><br><span class="line"><span class="keyword">Const</span> E_Table_Not_Found = &amp;h80040E37</span><br><span class="line"><span class="keyword">Const</span> NanoSEC_IN_DAY = <span class="number">864E9</span></span><br><span class="line"><span class="keyword">Const</span> TristateTrue = <span class="number">-1</span></span><br><span class="line"></span><br><span class="line"><span class="comment">'IMPORTANT VARIABLES TO EDIT</span></span><br><span class="line">LDAPDomain = <span class="string">"LDAP://OU=FABRIKAM Users,DC=Fabrikam,DC=com"</span></span><br><span class="line">BiosDomain = <span class="string">"FABRIKAM"</span></span><br><span class="line">OutFile = <span class="string">"C:\PwdCheck\passexpired.csv"</span> </span><br><span class="line"><span class="comment">'END OF IMPOTANT VARIABLES TO EDIT</span></span><br><span class="line"></span><br><span class="line"><span class="comment">'BEGIN OF CODE - DON'T EDIT</span></span><br><span class="line"><span class="keyword">Set</span> objDomainNT = <span class="built_in">GetObject</span>(<span class="string">"WinNT://"</span> &amp; BiosDomain)</span><br><span class="line">  intMaxPwdAge = objDomainNT.<span class="keyword">Get</span>(<span class="string">"MaxPasswordAge"</span>)</span><br><span class="line"><span class="keyword">If</span> intMaxPwdAge &lt; <span class="number">0</span> <span class="keyword">Then</span></span><br><span class="line">WScript.Echo(<span class="string">"Password never expired!"</span>)</span><br><span class="line">WScript.Quit    </span><br><span class="line"><span class="keyword">Else</span></span><br><span class="line">intMaxPwdAge = (intMaxPwdAge/SEC_IN_DAY)</span><br><span class="line"><span class="keyword">End</span> <span class="keyword">If</span> </span><br><span class="line"></span><br><span class="line"><span class="keyword">Set</span> fso = <span class="built_in">CreateObject</span>(<span class="string">"Scripting.FileSystemObject"</span>)</span><br><span class="line">    </span><br><span class="line"><span class="keyword">Set</span> objConnection = <span class="built_in">CreateObject</span>(<span class="string">"ADODB.Connection"</span>)</span><br><span class="line"><span class="keyword">Set</span> objCommand =   <span class="built_in">CreateObject</span>(<span class="string">"ADODB.Command"</span>)</span><br><span class="line"></span><br><span class="line">objConnection.Provider = <span class="string">"ADsDSOObject"</span></span><br><span class="line">objConnection.Open <span class="string">"Active Directory Provider"</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">Set</span> objCommand.ActiveConnection = objConnection</span><br><span class="line">objCommand.CommandText = _</span><br><span class="line">    <span class="string">"Select DisplayName,Mail,userAccountControl,pwdLastSet from '"</span> &amp; LDAPDomain &amp; _</span><br><span class="line">        <span class="string">"' where objectClass = 'user' and objectClass &lt;&gt; 'computer'"</span> </span><br><span class="line"></span><br><span class="line">    objCommand.Properties(<span class="string">"Page Size"</span>) = <span class="number">100000</span></span><br><span class="line">objCommand.Properties(<span class="string">"Searchscope"</span>) = ADS_SCOPE_SUBTREE </span><br><span class="line"><span class="keyword">Set</span> objRecordSet = objCommand.<span class="keyword">Execute</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">IF</span> err.number = E_Table_Not_Found <span class="keyword">Then</span></span><br><span class="line">WScript.Echo(<span class="string">"Error Domain!"</span>)</span><br><span class="line">WScript.Quit </span><br><span class="line"><span class="keyword">End</span> <span class="keyword">If</span></span><br><span class="line"></span><br><span class="line">objRecordSet.MoveFirst</span><br><span class="line"></span><br><span class="line"><span class="keyword">Set</span> txtStreamOut = fso.OpenTextFile(OutFile,ForWriting,<span class="literal">true</span>,TristateTrue)</span><br><span class="line"></span><br><span class="line">txtStreamOut.WriteLine <span class="string">"DisplayName,Email,LastDate,Runtime"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">Do</span> Until objRecordSet.EOF    </span><br><span class="line">  </span><br><span class="line"></span><br><span class="line">AccountName = objRecordSet(<span class="string">"DisplayName"</span>)</span><br><span class="line">EmailAddress = objRecordSet(<span class="string">"Mail"</span>)</span><br><span class="line">AccountControl = objRecordSet(<span class="string">"userAccountControl"</span>)</span><br><span class="line">pwdLastSet = objRecordSet(<span class="string">"pwdLastSet"</span>)</span><br><span class="line">pwdLastSet = #<span class="number">1</span>/<span class="number">1</span>/<span class="number">1601</span># + (pwdLastSet.highpart * <span class="number">2</span>^<span class="number">32</span> + pwdLastSet.lowpart) / NanoSEC_IN_DAY + <span class="number">480</span> / <span class="number">1440</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">If</span> (AccountControl <span class="keyword">And</span> ADS_UF_DONT_EXPIRE_PASSWD)=<span class="number">0</span> <span class="keyword">Then</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (AccountControl <span class="keyword">and</span> <span class="number">3</span>) &lt;&gt; <span class="number">2</span> <span class="keyword">and</span> err.number &lt;&gt; E_ADS_Property_Not_Found <span class="keyword">Then</span></span><br><span class="line"></span><br><span class="line">Lastdate = <span class="built_in">int</span>(intMaxPwdAge-(now-pwdLastSet))</span><br><span class="line"><span class="keyword">if</span> Lastdate = <span class="number">7</span> <span class="keyword">or</span> Lastdate = <span class="number">5</span> <span class="keyword">or</span> (Lastdate &lt; <span class="number">4</span> <span class="keyword">and</span> Lastdate &gt; <span class="number">0</span>) <span class="keyword">then</span></span><br><span class="line">txtStreamOut.WriteLine AccountName &amp; <span class="string">","</span> &amp; EmailAddress &amp; <span class="string">","</span> &amp; Lastdate &amp; <span class="string">","</span> &amp; Now</span><br><span class="line"><span class="keyword">End</span> <span class="keyword">If</span></span><br><span class="line"><span class="keyword">End</span> <span class="keyword">If</span></span><br><span class="line"><span class="keyword">End</span> <span class="keyword">If</span> </span><br><span class="line"></span><br><span class="line">Err.number = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">objRecordSet.MoveNext</span><br><span class="line"><span class="keyword">Loop</span></span><br><span class="line"><span class="comment">'WScript.Echo("Finished")</span></span><br><span class="line"><span class="comment">'End OF CODE</span></span><br></pre></td></tr></tbody></table></figure><h3 id="Sendmail-PassExpired-ps1"><a href="#Sendmail-PassExpired-ps1" class="headerlink" title="Sendmail-PassExpired.ps1"></a>Sendmail-PassExpired.ps1</h3><figure class="highlight powershell"><table><tbody><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><span class="line"><span class="comment">########################  Sendmail-PassExpired.ps1  #############################</span></span><br><span class="line"><span class="comment">#   Author:Randy Zhong</span></span><br><span class="line"><span class="comment">#   Source:https://github.com/randyzhong/</span></span><br><span class="line"><span class="comment">#   Description: This script uses Send-MailMessage cmdlet to send HTML format </span></span><br><span class="line"><span class="comment">#                 message with high priority.</span></span><br><span class="line"><span class="comment">#  Version:1.0.0</span></span><br><span class="line"><span class="comment">#################################################################################</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#   Changelog:   </span></span><br><span class="line"><span class="comment">#  2011.05.11 v1.0.0 - initial release</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#   Define VARIABLES</span></span><br><span class="line"><span class="variable">$csvfile</span> = <span class="string">"C:\PwdCheck\passexpired.csv"</span></span><br><span class="line"></span><br><span class="line"><span class="variable">$smtp</span> = <span class="string">"mail.fabrikam.com"</span> </span><br><span class="line">  </span><br><span class="line"><span class="variable">$from</span> = <span class="string">"Support@fabrikam.com"</span> </span><br><span class="line"> </span><br><span class="line"><span class="variable">$subject</span> = <span class="string">"Warning: Your password is about to expire!"</span>  </span><br><span class="line"> </span><br><span class="line"><span class="comment">#   Read user email address from CSV file and send warning message with high priority</span></span><br><span class="line"><span class="built_in">Import-Csv</span> <span class="variable">$csvfile</span> | <span class="built_in">ForEach-Object</span> {<span class="built_in">Send-MailMessage</span> <span class="literal">-To</span> <span class="variable">$_</span>.Email <span class="literal">-Subject</span> <span class="variable">$subject</span> <span class="literal">-From</span> <span class="variable">$from</span> <span class="literal">-BodyAsHtm</span> <span class="literal">-Body</span> (<span class="string">"&lt;font color='#1F497D'; font-family='Calibri, Tahoma, Arial'&gt;"</span>+<span class="string">"Dear&amp;nbsp;"</span> + <span class="variable">$_</span>.DisplayName +<span class="string">":"</span> + <span class="string">"&lt;br /&gt;"</span> +<span class="string">"&lt;p&gt;&lt;font size='4'&gt;Your password will be expired in &lt;font color='red' size='+2'&gt;&lt;strong&gt;"</span>+ <span class="variable">$_</span>.LastDate + <span class="string">"&lt;/strong&gt;&lt;/font&gt; day(s), please change it soon.&lt;/font&gt;&lt;/p&gt;"</span>) <span class="literal">-SmtpServer</span> <span class="variable">$smtp</span> <span class="literal">-Encoding</span> ([<span class="type">System.Text.Encoding</span>]::UTF8) <span class="literal">-Priority</span> high}</span><br></pre></td></tr></tbody></table></figure><h3 id="计划任务设置"><a href="#计划任务设置" class="headerlink" title="计划任务设置"></a>计划任务设置</h3><ul><li>新建个计划任务，设置为每天运行一次</li><li>第一步运行 PasswordCheck.vbs 生成用户列表，Program/Script 输入 CScript, 参数输入 “C:\Pathname\PasswordCheck.vbs”</li><li>第二步运行 Sendmail-PassExpired.ps1 发送邮件，Program/Script 输入 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe， 附加参数 -command “. ‘C:\PwdCheck\Sendmail-PassExpired.ps1’”</li></ul><h3 id="Exchange-服务器设置"><a href="#Exchange-服务器设置" class="headerlink" title="Exchange 服务器设置"></a>Exchange 服务器设置</h3><p>HUB 角色上面把配置了计划任务的服务器 IP 加入允许匿名转发的连接器 IP 地址池</p></body></html>]]></content>
    
    
    <summary type="html">如何在 Exchange 2010 中给密码即将过期用户发送提醒邮件</summary>
    
    
    
    <category term="Microsoft" scheme="http://winotes.net/categories/Microsoft/"/>
    
    <category term="Exchange" scheme="http://winotes.net/categories/Microsoft/Exchange/"/>
    
    
    <category term="Exchange" scheme="http://winotes.net/tags/Exchange/"/>
    
    <category term="VBScript" scheme="http://winotes.net/tags/VBScript/"/>
    
    <category term="PowerShell" scheme="http://winotes.net/tags/PowerShell/"/>
    
  </entry>
  
  <entry>
    <title>腾讯公益404页面现已支持 https</title>
    <link href="http://winotes.net/tencent-404-support-https-now/"/>
    <id>http://winotes.net/tencent-404-support-https-now/</id>
    <published>2018-03-16T08:48:35.000Z</published>
    <updated>2022-04-19T16:18:09.743Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h3 id="公益-404-页面介绍"><a href="#公益-404-页面介绍" class="headerlink" title="公益 404 页面介绍"></a>公益 404 页面介绍</h3><p><a href="http://www.qq.com/404/">公益404页面</a>是由腾讯公司员工志愿者自主发起的互联网公益活动。</p><p>网站只需要在自己的404页面中嵌入一段简单的代码，就能通过互联网来迅速传播失踪儿童信息，从而提高找回失踪儿童的概率。失踪儿童信息来自宝贝回家寻子网。</p><p>之前不支持 https，这两天因为打算将本站的国内镜像站点挂到 Coding.net，然后启用全站 https，这才发现不知道啥时候腾讯公益404页面现已支持 https。</p><h3 id="公益-404-页面接入方法"><a href="#公益-404-页面接入方法" class="headerlink" title="公益 404 页面接入方法"></a>公益 404 页面接入方法</h3><blockquote><p>注意事项<br>如果一个 404 页面的内容小于 512B，IE 会认为该 404 页面不够友好，在 IE 下将不会成功返回该 404 错误页面</p></blockquote><p>复制以下 js 代码，嵌入到您的 404 页面，可以自适应移动设备。</p><p>旧版本的嵌入代码：</p><figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"http://www.qq.com/404/search_children.js"</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><p>新版本的嵌入代码：</p><figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js"</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><h3 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h3><p>可以看到，新的 js 引用源并没有写死是 http 还是 https 协议，这样写的好处就是它会根据你自己网站的情况来自动匹配。<br>本站已启用全站 https，所以最终的引用地址就会是<br><a href="https://qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js"><strong>https</strong>://qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js</a><br>不管怎样，还是要给鹅厂一个赞。</p></body></html>]]></content>
    
    
    <summary type="html">公益404页面是由腾讯公司员工志愿者自主发起的互联网公益活动。但之前都不支持 https，这两天因为打算将本站的国内镜像站点挂到 Coding.net，然后启用全站 https，这才发现不知道啥时候腾讯公益404页面现已支持 https。</summary>
    
    
    
    <category term="网站相关" scheme="http://winotes.net/categories/%E7%BD%91%E7%AB%99%E7%9B%B8%E5%85%B3/"/>
    
    
    <category term="Web" scheme="http://winotes.net/tags/Web/"/>
    
    <category term="404" scheme="http://winotes.net/tags/404/"/>
    
    <category term="https" scheme="http://winotes.net/tags/https/"/>
    
    <category term="腾讯" scheme="http://winotes.net/tags/%E8%85%BE%E8%AE%AF/"/>
    
  </entry>
  
  <entry>
    <title>使用 Windows 内置的 CertUtil 程序计算文件的哈希校验值</title>
    <link href="http://winotes.net/computing-cryptographic-hash-values-with-certutil/"/>
    <id>http://winotes.net/computing-cryptographic-hash-values-with-certutil/</id>
    <published>2018-03-08T03:51:23.000Z</published>
    <updated>2020-01-05T09:00:53.942Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><p>在 Windows 中，通常我们需要计算一个文件的 MD5 或者 SHA1 值的时候，需要下载一些第三方的工具，哪怕是微软的，也有 File Checksum Integrity Verifier (<a href="https://support.microsoft.com/en-us/help/841290/availability-and-description-of-the-file-checksum-integrity-verifier-u">FCIV</a>) 或者 Sysinternals 的 <a href="https://docs.microsoft.com/en-us/sysinternals/downloads/sigcheck">Sigcheck</a> 小工具来做，不过可能很少有人知道，Windows 内置的 <strong>CertUtil</strong> 程序也可以干这个事。</p><p>CertUtil 是个强大的证书相关的管理工具，涉及到证书的加解密，所以相关的 MD5/SHA1 之类的加密算法都是支持的，在 CertUtil 中有个参数 -hashfile 可以帮助我们计算任意文件的哈希校验值，不过如果你在命令行中输入<br><code>CertUtil -hashfile -?</code> 来试图获取帮助的时候，给出来的帮助信息很简单：</p><figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">CertUtil <span class="selector-attr">[Options]</span> -hashfile InFile <span class="selector-attr">[HashAlgorithm]</span></span><br><span class="line">  Generate and <span class="attribute">display</span> cryptographic hash over <span class="selector-tag">a</span> file</span><br></pre></td></tr></tbody></table></figure><p>其实，完全的信息应该是这样的：</p><figure class="highlight livecodeserver"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">Usage:</span><br><span class="line">  CertUtil [Options] -hashfile InFile [HashAlgorithm]</span><br><span class="line">  Generate <span class="keyword">and</span> display cryptographic hash over <span class="keyword">a</span> <span class="built_in">file</span></span><br><span class="line"></span><br><span class="line">Options:</span><br><span class="line">  -gmt              <span class="comment">-- Display times as GMT</span></span><br><span class="line">  -<span class="built_in">seconds</span>          <span class="comment">-- Display times with seconds and milliseconds</span></span><br><span class="line">  -v                <span class="comment">-- Verbose operation</span></span><br><span class="line">  -privatekey       <span class="comment">-- Display password and private key data</span></span><br><span class="line"></span><br><span class="line">HashAlgorithm:    MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512 </span><br><span class="line"></span><br><span class="line">CertUtil -?              <span class="comment">-- Display a verb list (command list)</span></span><br><span class="line">CertUtil -hashfile -?    <span class="comment">-- Display help text for the "hashfile" verb</span></span><br><span class="line">CertUtil -v -?           <span class="comment">-- Display all help text for all verbs</span></span><br></pre></td></tr></tbody></table></figure><p>CertUtil 所支持的加密算法有 <strong>MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512</strong></p><h3 id="例子"><a href="#例子" class="headerlink" title="例子"></a>例子</h3><p>比如我们要得到计算器程序的 MD5 值<br><code>CertUtil -hashfile c:\Windows\System32\calc.exe MD5</code> 注意，这里的 MD5 一定要大写</p><figure class="highlight apache"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">MD5</span> hash of file c:\Windows\System32\calc.exe:</span><br><span class="line"><span class="attribute">10</span> e4 a1 d2 <span class="number">13</span> <span class="number">2</span>c cb <span class="number">5</span>c <span class="number">67</span> <span class="number">59</span> f0 <span class="number">38</span> cd b6 f3 c9</span><br><span class="line"><span class="attribute">CertUtil</span>: -hashfile command completed successfully.</span><br></pre></td></tr></tbody></table></figure><p>如果 MD5 没有大写，这样运行命令的话：<br><code>CertUtil -hashfile c:\Windows\System32\calc.exe md5</code></p><p>程序会报错</p><figure class="highlight apache"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">CertUtil</span>: -hashfile command FAILED: <span class="number">0</span>xd00000bb (-<span class="number">805306181</span>)</span><br><span class="line"><span class="attribute">CertUtil</span>: WsResetMetadata</span><br></pre></td></tr></tbody></table></figure></body></html>]]></content>
    
    
    <summary type="html">使用 Windows 内置的 CertUtil 程序计算文件的哈希校验值</summary>
    
    
    
    <category term="Windows" scheme="http://winotes.net/categories/Windows/"/>
    
    
    <category term="Windows" scheme="http://winotes.net/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>无需插件查看浏览器中已保存的星号密码</title>
    <link href="http://winotes.net/easily-reveal-hidden-passwords-in-any-browser/"/>
    <id>http://winotes.net/easily-reveal-hidden-passwords-in-any-browser/</id>
    <published>2018-02-28T02:28:23.000Z</published>
    <updated>2020-01-05T09:00:53.943Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h3 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h3><p>最近帮人重新配置路由器，不过他忘记了 PPPOE 的拨号密码是多少，还好原来的路由器 WAN 配置界面上还能看到，不过全是星号，要怎么才能看到里面的密码明文内容呢？这里教大家一个简单易用的方法，不需要安装什么星号密码查看器的软件，也不用啥浏览器的插件，使用浏览器自带的“审查元素”功能即可简单几步查看星号密码内容。</p><h3 id="步骤："><a href="#步骤：" class="headerlink" title="步骤："></a>步骤：</h3><ol><li><p>在 Chrome 浏览器中，鼠标悬停在网页保存的密码字段，点击右键，选择 <strong>Inspect</strong>;<br><img src="/easily-reveal-hidden-passwords-in-any-browser/inspect-password-field-1.jpg" alt="Inspect"></p></li><li><p>在开发者工具的页面中，找到密码字段对应的 HTML 源码，然后将 &lt;input type=”password” 改成 &lt;input type=”text” （如下图）<br><img src="/easily-reveal-hidden-passwords-in-any-browser/inspect-password-field-2.jpg" alt="Change input type to text"></p></li></ol><p>这时在前端网页上面，密码已经明文显示出来了。<br><img src="/easily-reveal-hidden-passwords-in-any-browser/inspect-password-field-3.jpg" alt="Reveal password"></p><blockquote><p>注：以上示例是使用 Google Chrome 浏览器，Internet Explorer 和 Firefox 也是类似的方法。</p></blockquote></body></html>]]></content>
    
    
    <summary type="html">最近帮人重新配置路由器，不过他忘记了 PPPOE 的拨号密码是多少，还好原来的路由器 WAN 配置界面上还能看到，不过全是星号，要怎么才能看到里面的密码明文内容呢？这里教大家一个简单易用的方法，不需要安装什么星号密码查看器的软件，也不用啥浏览器的插件，使用浏览器自带的“审查元素”功能即可简单几步查看星号密码内容。</summary>
    
    
    
    <category term="Windows" scheme="http://winotes.net/categories/Windows/"/>
    
    
    <category term="Windows" scheme="http://winotes.net/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>解决 Windows 下文件名或者路径太长无法复制的问题</title>
    <link href="http://winotes.net/how-to-fix-file-path-too-long-on-windows-when-copying/"/>
    <id>http://winotes.net/how-to-fix-file-path-too-long-on-windows-when-copying/</id>
    <published>2017-11-29T03:44:23.000Z</published>
    <updated>2020-01-05T09:00:53.971Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>众所周知，微软的文件系统经历了 FAT-&gt;FAT32-&gt;NTFS 的技术变革。且不论安全和文件组织方式上的革新，单就文件名而言，已经从古老的 DOS 8.3 文件格式（仅支持最长 8 个字符的文件名和 3 个字符的扩展名）转变为可以支持长达 255 个字符的文件名。而对于路径长度，NTFS 也已经支持长达 32768 个字符的路径名。</p><p>然而，Windows 操作系统并没有完全放开路径名长度的限制，在 windef.h 中，可以找到如下的宏：</p><p>#define MAX_PATH 260</p><p>更多信息可以参考微软的知识库：<br><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx">Naming Files, Paths, and Namespaces</a></p><p>事实上，所有的 Windows API (ANSI) 都遵循这个限制。因此，每当我们试图更改某一文件的文件名时，当输入的文件名长度 ( 全路径 ) 到达一定限度时，<br>虽然文件名本身还未达到 255 个字符的限制，但是任何输入将不再被接受，这其实正是由于操作系统不允许 260 个字符（byte）的文件全路径。</p><h3 id="实测"><a href="#实测" class="headerlink" title="实测"></a>实测</h3><p>实际测试中，当你一层一层创建文件夹或者创建文件名的时候，资源管理器是有感知的，当到达 MAX_PATH 的限制的时候，其实已经无法再创建超过限制的文件或者文件名，当你在最深一层打算创建一个文件或者文件夹并因此超过限制的时候，你会收到如下警告：<br><img src="/how-to-fix-file-path-too-long-on-windows-when-copying/create_folder_warning.jpg" alt="Create Folder Warning"></p><p>重命名也是有报错<br><img src="/how-to-fix-file-path-too-long-on-windows-when-copying/rename_warning.jpg" alt="Rename Warning"></p><p>但如果你往上返回一层，重命名上层目录，这个时候你可以创建出一个总长度超过 MAX_PATH 的长文件名。不过问题也随之来了，当你想要复制包含这个长文件名的整个文件夹的时候，你会发现复制失败，提示文件或者路径太长。</p><p>那么使用 xcopy 命令行不行呢？很遗憾，xcopy 是个使用标准 Win32 ANSI API 的程序，没法支持。<br><img src="/how-to-fix-file-path-too-long-on-windows-when-copying/xcopy_failed.jpg" alt="xcopy failed"></p><h3 id="解决"><a href="#解决" class="headerlink" title="解决"></a>解决</h3><p>解决方案有很多种，比如将长文件夹/文件名字改短，将长路径映射为一个逻辑磁盘用来缩短路径的长度等等，我们这里使用 robocopy 这个自带的命令和第三<br>方工具 fastcopy 来解决这个问题。</p><h4 id="Robocopy"><a href="#Robocopy" class="headerlink" title="Robocopy"></a>Robocopy</h4><p>Robocopy 全名是 Robust File Copy，是个 Unicode 的程序，所以可以支持超过 MAX_PATH 的限制，最长可以到 32767，Windows 7 以及之后的操作系统内的是 XP027, 而 Windows Server 2003 Resource Kit Tools 里面的是 XP010，另外，微软为命令行苦手发布了一个 <a href="https://technet.microsoft.com/en-us/library/2006.11.utilityspotlight.aspx">Robocopy GUI</a> 的图形界面版 robocopy，里面集成的是 XP026，具体的区别可以查看这个<a href="https://ss64.com/nt/robocopy.html">网页</a>。<br><img src="/how-to-fix-file-path-too-long-on-windows-when-copying/robocopy.jpg" alt="robocopy"></p><blockquote><p>注意：微软还发布了一个 <a href="https://technet.microsoft.com/en-us/library/2009.04.utilityspotlight.aspx">RichCopy</a>，实测这个并不能支持长路径名。</p></blockquote><h4 id="FastCopy"><a href="#FastCopy" class="headerlink" title="FastCopy"></a>FastCopy</h4><p><a href="https://ipmsg.org/tools/fastcopy.html">FastCopy</a>是由  SHIROUZU Hiroaki 开发的免费工具，非常好用。官方的介绍里面也提到了支持 Unicode 和突破 MAX_PATH 260 字符的限制。<br><img src="/how-to-fix-file-path-too-long-on-windows-when-copying/fastcopy_about.jpg" alt="fastcopy about"></p><p>实测结果也验证了这一点。<br><img src="/how-to-fix-file-path-too-long-on-windows-when-copying/fastcopy.jpg" alt="fastcopy"></p><h4 id="Win10"><a href="#Win10" class="headerlink" title="Win10"></a>Win10</h4><p>从 Windows 10 1607起，你可以解除 MAX_PATH 的限制，具体可以参考这个<a href="https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/">文章</a>。</p></body></html>]]></content>
    
    
    <summary type="html">众所周知，微软的文件系统经历了 FAT-&gt;FAT32-&gt;NTFS 的技术变革。且不论安全和文件组织方式上的革新，单就文件名而言，已经从古老的 DOS 8.3 文件格式（仅支持最长 8 个字符的文件名和 3 个字符的扩展名）转变为可以支持长达 255 个字符的文件名。而对于路径长度，NTFS 也已经支持长达 32768 个字符的路径名。</summary>
    
    
    
    <category term="Windows" scheme="http://winotes.net/categories/Windows/"/>
    
    
    <category term="Windows" scheme="http://winotes.net/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>在 Ubuntu 16.04 中安装 Docker CE</title>
    <link href="http://winotes.net/install-docker-ce-on-ubuntu-16/"/>
    <id>http://winotes.net/install-docker-ce-on-ubuntu-16/</id>
    <published>2017-11-20T07:14:23.000Z</published>
    <updated>2020-01-05T09:00:53.999Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><p>安装 Docker 有很多种方式，常用的有三种：</p><ol><li>大部分人使用官方提供的 Docker 仓库，安装简单，也易于升级，推荐使用这种方法</li><li>你也可以下载 DEB 包来手动安装和手动升级。通常这种方法适用于在没有互联网连接的与外界物理隔离的机器上安装 Docker</li><li>在开发和测试环境，也可以选择使用脚本来自动安装 Docker</li></ol><p>Docker 一开始是没有区分 EE 和 CE 版本的，随着 Docker 的流行，自17.03版本以后分为 CE (Community Edition - 社区版) 和 EE(Enterprise Edition - 企业版)，社区版并非阉割版，可以免费使用，企业版则提供了一些收费的高级特性，我们这里选择从官方仓库来安装 CE 社区版。</p><span id="more"></span><h4 id="更新-APT"><a href="#更新-APT" class="headerlink" title="更新 APT"></a>更新 APT</h4><ol><li>更新 apt 软件包列表</li></ol><p><code>$ sudo apt-get update</code></p><p><img src="/install-docker-ce-on-ubuntu-16/apt-update.jpg" alt="更新 apt 软件包"></p><ol start="2"><li>安装如下包使 apt 可以通过 HTTPS 来从仓库安装软件<figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install \</span><br><span class="line">    apt-transport-https \</span><br><span class="line">    ca-certificates \</span><br><span class="line">    curl \</span><br><span class="line">    software-properties-common</span><br></pre></td></tr></tbody></table></figure></li><li>添加 Docker 官方的 GPG Key</li></ol><p><code>$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -</code></p><ol start="4"><li>校验 GPG Key 的指纹，最后8位应该是 0EBFCD88</li></ol><p><code>$ sudo apt-key fingerprint 0EBFCD88</code></p><p><img src="/install-docker-ce-on-ubuntu-16/docker-gpg-key.jpg" alt="添加/校验 Docker 官方的 GPG Key"></p><ol start="5"><li>安装 stable 的 Docker 仓库，一般使用 stable 这个稳定版本。<figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo add-apt-repository \</span><br><span class="line">   <span class="string">"deb [arch=amd64] https://download.docker.com/linux/ubuntu \</span></span><br><span class="line"><span class="string">   <span class="subst">$(lsb_release -cs)</span> \</span></span><br><span class="line"><span class="string">   stable"</span></span><br></pre></td></tr></tbody></table></figure></li></ol><h4 id="安装-Docker-CE"><a href="#安装-Docker-CE" class="headerlink" title="安装 Docker CE"></a>安装 Docker CE</h4><h5 id="更新-apt-软件包列表"><a href="#更新-apt-软件包列表" class="headerlink" title="更新 apt 软件包列表"></a>更新 apt 软件包列表</h5><p><code>$ sudo apt-get update</code><br><img src="/install-docker-ce-on-ubuntu-16/apt-update-docker.jpg" alt="再次更新 apt 软件包"><br>这个时候你可以看到 docker 的源了</p><h5 id="安装最新的社区版"><a href="#安装最新的社区版" class="headerlink" title="安装最新的社区版"></a>安装最新的社区版</h5><p><code>$ sudo apt-get install docker-ce</code></p><p>然而，如果你在国内，你可能会遇到如下错误：<br><img src="/install-docker-ce-on-ubuntu-16/apt-install-docker-err.jpg" alt="安装报错"></p><p>这是因为 Docker 的安装资源文件存放在 Amazon S3，有可能会被伟大的功夫网拦在外面，另外一个可能的原因是 S3 在国内连接太慢，会间歇性连接失败。<br>还好国内的 <a href="https://get.daocloud.io/#install-docker">DaoCloud</a> 公司提供了下面的快速安装方法（实际上就是用第三种的脚本安装）：</p><p><code>$ curl -sSL https://get.daocloud.io/docker | sh</code></p><p>这个方法适用于 Ubuntu，Debian,Centos 等大部分 Linux，DaoCloud 会每3小时同步一次 Docker 官方源。</p><p><img src="/install-docker-ce-on-ubuntu-16/docker-install-from-daocloud.jpg" alt="从 DaoCloud 安装"></p><h4 id="检查-Docker-版本"><a href="#检查-Docker-版本" class="headerlink" title="检查 Docker 版本"></a>检查 Docker 版本</h4><p><code>$ docker version</code><br><img src="/install-docker-ce-on-ubuntu-16/docker-permission.jpg" alt="permission denied"></p><p>这里需要多一条命令来添加当前用户到 docker 组，这样不用 root 权限也可以使用 Docker<br><code>$ sudo usermod -aG docker username</code>  #这里的 username 就是你的非 root 用户名</p><blockquote><p>运行之后需要注销重新登录才能生效</p></blockquote><figure class="highlight bash"><table><tbody><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></pre></td><td class="code"><pre><span class="line">$ docker version</span><br><span class="line"></span><br><span class="line">Client:</span><br><span class="line"> Version:      17.10.0-ce</span><br><span class="line"> API version:  1.33</span><br><span class="line"> Go version:   go1.8.3</span><br><span class="line"> Git commit:   f4ffd25</span><br><span class="line"> Built:        Tue Oct 17 19:04:16 2017</span><br><span class="line"> OS/Arch:      linux/amd64</span><br><span class="line"></span><br><span class="line">Server:</span><br><span class="line"> Version:      17.10.0-ce</span><br><span class="line"> API version:  1.33 (minimum version 1.12)</span><br><span class="line"> Go version:   go1.8.3</span><br><span class="line"> Git commit:   f4ffd25</span><br><span class="line"> Built:        Tue Oct 17 19:02:56 2017</span><br><span class="line"> OS/Arch:      linux/amd64</span><br><span class="line"> Experimental: <span class="literal">false</span></span><br></pre></td></tr></tbody></table></figure><h4 id="卸载-Docker-CE"><a href="#卸载-Docker-CE" class="headerlink" title="卸载 Docker CE"></a>卸载 Docker CE</h4><p><code>$ sudo apt-get purge docker-ce</code></p><p><img src="/install-docker-ce-on-ubuntu-16/uninstall-docker-ce.jpg" alt="卸载 Docker CE"><br>卸载 Docker 后, /var/lib/docker/目录下会保留原 Docker 的镜像，存储卷，自定义配置等文件。 如果需要全新安装 Docker，需要删除/var/lib/docker/目录。</p><p><code>$ sudo rm -rf /var/lib/docker</code></p></body></html>]]></content>
    
    
    <summary type="html">安装 Docker 有很多种方式，常用的有三种：大部分人使用官方提供的 Docker 仓库，安装简单，也易于升级，推荐使用这种方法</summary>
    
    
    
    <category term="Docker" scheme="http://winotes.net/categories/Docker/"/>
    
    
    <category term="Ubuntu" scheme="http://winotes.net/tags/Ubuntu/"/>
    
    <category term="Docker" scheme="http://winotes.net/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu 的 Vi 编辑器方向键变 ABCD 以及退格键无法使用的解决办法</title>
    <link href="http://winotes.net/how-to-fix-arrow-key-that-display-abcd-in-vi-on-ubuntu/"/>
    <id>http://winotes.net/how-to-fix-arrow-key-that-display-abcd-in-vi-on-ubuntu/</id>
    <published>2017-11-14T07:14:23.000Z</published>
    <updated>2020-01-05T09:00:53.968Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h3 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h3><p>Ubuntu 中的 Vi 编辑器在编辑模式下，使用上下左右方向键会变成 A B C D 字符并换行，而且退格键也无法删除前面的字符，非常不方便。<br>这个问题时不时都有人会提，困扰人类十几年了（笑），我好多年前也碰到过，这里再重新记录下。<br>解决方案有很多种，这里介绍两种常用的：</p><h4 id="1-安装-vim"><a href="#1-安装-vim" class="headerlink" title="1. 安装 vim"></a>1. 安装 vim</h4><p><code>$ sudo apt-get install vim</code></p><h4 id="2-编辑-Vi-配置文件-x2F-etc-x2F-vim-x2F-vimrc-tiny"><a href="#2-编辑-Vi-配置文件-x2F-etc-x2F-vim-x2F-vimrc-tiny" class="headerlink" title="2. 编辑 Vi 配置文件 /etc/vim/vimrc.tiny"></a>2. 编辑 Vi 配置文件 /etc/vim/vimrc.tiny</h4><p>由于这个文件的所有者是 root 用户，所以要在 root 的权限下对这个文件进行修改：</p><p><code>$ sudo vi /etc/vim/vimrc.tiny</code></p><p><img src="/how-to-fix-arrow-key-that-display-abcd-in-vi-on-ubuntu/vim_conf.jpg" alt="vimrc.tiny"></p><p>找到 set compatible，将 “compatible” 改成 “nocompatible” 非兼容模式就可以解决方向键变 ABCD 以及退格键的问题了。<br>这个修改适用于所有用户，如果只想对当前用户生效，需要在用户 Home 目录下面新建 .vimrc 文件，然后加入 set nocompatible 一行再保存修改即可。</p><p>在某些系统下面，可能会出现退格键还是无法使用的现象，那这个时候得在 set nocompatible 后面再加一行：</p><p><code>set backspace=2</code> 或者<br><code>set backspace=indent,eol,start</code></p><p>以上两行二选一，效果一样。</p><h3 id="结论"><a href="#结论" class="headerlink" title="结论:"></a>结论:</h3><h4 id="方向键："><a href="#方向键：" class="headerlink" title="方向键："></a>方向键：</h4><p>产生这个问题的原因是由于 Ubuntu 预安装的是 <strong>vim-tiny</strong> 版本，缺省设置是 vim.tiny 以兼容 Vi 模式运行，意味着更接近纯 Vi，不能使用小键盘和方向键，在编辑模式下，只能使用 h j k l 来移动光标。所以要么安装 vim 完整版，要么禁用兼容模式。在终端窗口输入 vi 回车，如果 vim 跑在兼容模式，你可以看到如下图所示</p><p><img src="/how-to-fix-arrow-key-that-display-abcd-in-vi-on-ubuntu/vim_help.jpg" alt="Vim Help"></p><h4 id="退格键："><a href="#退格键：" class="headerlink" title="退格键："></a>退格键：</h4><p>退格键在编辑模式无法使用其实是 Vi 的一个保护性行为，防止误删除或者一次性删除大量内容，并不是 bug，设置 backspace (bs) 可以让退格键重新“工作”起来，默认设置为空 set backspace=””，意即使用 Vi 兼容的退格方式，也就是向左移动一个字符 (等同于 h)</p><table><thead><tr><th>值</th><th>效果</th></tr></thead><tbody><tr><td>indent</td><td>允许在自动缩进上退格</td></tr><tr><td>eol</td><td>允许在换行符上退格 (连接行)</td></tr><tr><td>start</td><td>允许在插入开始的位置上退格；CTRL-W 和 CTRL-U 到达插入开始的位置时停留一次。</td></tr></tbody></table><p>所以在配置文件里面加上 <strong>set backspace=2</strong> 或者 <strong>set backspace=indent,eol,start</strong> 就可以啦。</p><h3 id="引申"><a href="#引申" class="headerlink" title="引申:"></a>引申:</h3><p>那么为什么 Vi 默认不使用方向键来移动光标？</p><ol><li>可以装 X；</li><li>兼容性问题；<br>一般键的 ascii 码直接发就行，而方向键之类的特殊键就要转义成 ESC 序列 (<a href="https://en.wikipedia.org/wiki/Escape_sequence">escape sequence</a>) 发送，比如上键会被转义成 ESC [ A 编码，某些终端类型不支持，再有就是早期的终端连接速度都很慢，如果在终端接收到 ESC 和 A 之间的时间太长，你可能会听到警告声或者导致指令无法送达，而普通的 hjkl 键就没有这个问题；</li><li>键盘没有方向键（图片来自网络）；<br><img src="/how-to-fix-arrow-key-that-display-abcd-in-vi-on-ubuntu/adm-3a.jpg" alt="ADM-3a Keyboard"></li><li>习惯问题。</li></ol><p>你如果很习惯用 Vi 了，你完全可以弃用方向键的，不过 Vi 的学习曲线还是挺陡的，所以，挑个你习惯的编辑器就好，不必要强求用 Vi。</p><p>最后附上一张 Vi/Vim 的键盘快捷方式图镇楼吧。<br><img src="/how-to-fix-arrow-key-that-display-abcd-in-vi-on-ubuntu/vi-vim-cheat-sheet.gif" alt="Vi/Vim Cheat Sheet"></p></body></html>]]></content>
    
    
    <summary type="html">Ubuntu 中的 Vi 编辑器在编辑模式下，使用上下左右方向键会变成 A B C D 字符并换行，而且退格键也无法删除前面的字符，非常不方便。</summary>
    
    
    
    <category term="Ubuntu" scheme="http://winotes.net/categories/Ubuntu/"/>
    
    
    <category term="Ubuntu" scheme="http://winotes.net/tags/Ubuntu/"/>
    
    <category term="Linux" scheme="http://winotes.net/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>解除 Win10 LTSB 简体中文版 IE11 首页保护锁定方法</title>
    <link href="http://winotes.net/how-to-remove-official-ie11-baidu-homepage-locking-on-simplified-chinese-win10-ltsb/"/>
    <id>http://winotes.net/how-to-remove-official-ie11-baidu-homepage-locking-on-simplified-chinese-win10-ltsb/</id>
    <published>2017-09-11T03:14:23.000Z</published>
    <updated>2020-01-05T09:00:53.986Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><blockquote><p>北京时间2015年9月24日，美国华盛顿州雷德蒙德，百度与微软正式宣布战略合作，百度将成为中国市场上Windows 10 Microsoft Edge浏览器的默认主页和搜索引擎，带给用户更加便捷的搜索服务。同时，百度也将通过“Windows 10直通车”提供Windows 10下载升级服务。</p></blockquote><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>以上是来自微软官方消息，不过最近有部分使用 IE11 的用户发现，启动浏览器会发现默认主页被重定向到了百度带尾巴的首页 <a href="https://www.baidu.com/?tn=80035161_1_dg">https://www.baidu.com/?tn=80035161_1_dg，</a> 而默认的搜索引擎也被改成了百度，而且更过分的是，你还无法修改默认主页，一旦修改就会出现“由于主页设置已损坏， Internet Explorer 重置了你的主页。你是否要将主页改为……”，每次打开 IE 都会出现这样的提示，甚至重装系统依然如此。</p><p><img src="/how-to-remove-official-ie11-baidu-homepage-locking-on-simplified-chinese-win10-ltsb/ie-change-notice.jpg" alt="主页设置已损坏"></p><p>这既不是 DNS 劫持，也不是啥恶意软件，这个微软官方推行的浏览器保护机制，只不过落地在国内，默认主页和搜索引擎提供者变成了百度，谁让 Bing 不争气啊。</p><span id="more"></span><h4 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h4><p>这些受影响的 IE11 在启动的时候，会通过 ieonline.microsoft.com 上的 webservice 更新部分设置，如下图：<br><img src="/how-to-remove-official-ie11-baidu-homepage-locking-on-simplified-chinese-win10-ltsb/fidder-ie-startup.jpg" alt="Fiddler抓包-IE启动"></p><p>在更改默认主页的时候，也同样有去访问 ieonline.microsoft.com<br><img src="/how-to-remove-official-ie11-baidu-homepage-locking-on-simplified-chinese-win10-ltsb/fidder-ie-set-homepage.jpg" alt="Fiddler抓包-更改IE主页"></p><h4 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h4><p>通过 Fiddler 抓包和 ProcMon 分析，找到以下解决方法：</p><ol><li>首先编辑本机hosts文件，在其中添加<strong>127.0.0.1 ieonline.microsoft.com</strong></li><li>打开注册表编辑器，找到 <strong>[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer]<strong>，删除</strong>EUPP</strong>项</li><li>打开注册表编辑器，找到 <strong>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl]<strong>，在下面新建项</strong>FEATURE_EUPP_GLOBAL_FORCE_DISABLE</strong>，然后在这个项下面新建一个 <strong>DWORD32</strong> 值，键值名称为 <strong>iexplorer.exe</strong> ，键值改成1<br>注册表文件如下：<figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Windows Registry Editor Version 5.00</span><br><span class="line"></span><br><span class="line">[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_EUPP_GLOBAL_FORCE_DISABLE]</span><br><span class="line">"iexplorer.exe"=dword:00000001</span><br></pre></td></tr></tbody></table></figure></li><li>之后再去修改 IE 默认主页就可以了</li><li>这样修改之后，实际上在注册表中 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer 下面还是会创建 EUPP 项，不过会少了一些东西，只剩下一个 叫 RId 的字符串值，暂时不知道有没有别的啥影响，强迫症患者可以用这个注册表文件还原成原始值<figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Windows Registry Editor Version 5.00</span><br><span class="line"></span><br><span class="line">[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\EUPP]</span><br><span class="line">"RId"="{0E742E0E-7B2B-4372-84A0-507D6539A665}"</span><br><span class="line">"ChangeNotice"=dword:00000002</span><br><span class="line"></span><br><span class="line">[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\EUPP\DSP]</span><br><span class="line">"ChangeNotice"=dword:00000002</span><br></pre></td></tr></tbody></table></figure><h4 id="结论"><a href="#结论" class="headerlink" title="结论:"></a>结论:</h4>产生这个问题的原因是 IE 启动的时候，会通过 ieonline.microsoft.com 上的 webservice 更新 EUPP 键值内容，其中最关键的是 BackupHomePage 和子项 DSP 下面的 BackupDefaultSearchScope 的这两个二进制值锁定主页和搜索提供程序的 URL，新安装的系统里面，BackupHomePage和 BackupDefaultSearchScope 键值还没有被创建。之后一旦可以联网，IE 会更新注册表，从而锁定主页和搜索提供程序，而且这些二进制值是加密的，有兴趣的可以参考这篇文章：<a href="http://bbs.pediy.com/thread-196517.htm">http://bbs.pediy.com/thread-196517.htm</a></li></ol><p>所以和 Windows 10 的版本或者 IE 补丁程序无关，此方法在 Win10 LTSB 中文 64 位 1607 版本上测试通过。</p><h4 id="2017年9月14日更新："><a href="#2017年9月14日更新：" class="headerlink" title="2017年9月14日更新："></a>2017年9月14日更新：</h4><p><strong>貌似这两天微软已经把 EUPP 的 webservice 做了更新，不再强制修改成百度了，所以即使你不应用上面的注册表和 hosts 文件修改，也可以像以前一样任意修改默认主页了。</strong><br>另1：如果是单单通过 hosts 文件屏蔽 ieonline.microsoft.com 的，要取消这个屏蔽，否则你的IE默认主页会锁定在屏蔽ieonline.microsoft.com之前的设定，无法修改成新的。<br><img src="/how-to-remove-official-ie11-baidu-homepage-locking-on-simplified-chinese-win10-ltsb/ie-unable-to-set-homepage.jpg" alt="修改hosts文件后更改IE主页"><br>另2：从 ieonline.microsoft.com 拿到的 ChangeNotice 的值在9月14日之后也有了变化，以前会被重置成2，现在是0,从名字猜测来看应该是提示主页设置被更改的旗标 (flag) 设置。</p><p>最后放上各个阶段的注册表 EUPP 项导出文件供参考 <a href="/how-to-remove-official-ie11-baidu-homepage-locking-on-simplified-chinese-win10-ltsb/ie11-eupp-registry.zip" title="IE11 EUPP Registry Settings Export">IE11 EUPP Registry Settings Export</a></p></body></html>]]></content>
    
    
    <summary type="html">不过最近有部分使用 IE11 的用户发现，启动浏览器会发现默认主页被重定向到了百度带尾巴的首页 https://www.baidu.com/?tn=80035161_1_dg，而默认的搜索引擎也被改成了百度，而且更过分的是，你还无法修改默认主页，一旦修改就会出现“由于主页设置已损坏， Internet Explorer 重置了你的主页。你是否要将主页改为……”</summary>
    
    
    
    <category term="Microsoft" scheme="http://winotes.net/categories/Microsoft/"/>
    
    
    <category term="Microsoft" scheme="http://winotes.net/tags/Microsoft/"/>
    
    <category term="Internet Explorer" scheme="http://winotes.net/tags/Internet-Explorer/"/>
    
    <category term="Fiddler" scheme="http://winotes.net/tags/Fiddler/"/>
    
  </entry>
  
  <entry>
    <title>packtpub.com 提供每日一本免费电子书</title>
    <link href="http://winotes.net/packtpub-offer-free-learning/"/>
    <id>http://winotes.net/packtpub-offer-free-learning/</id>
    <published>2017-09-01T08:10:23.000Z</published>
    <updated>2020-01-05T09:00:54.020Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><p><a href="https://www.packtpub.com/">Packt</a>是一家创立于2004年，总部位于英国伯明翰的技术书籍出版商，对电子书支持非常友好，除了主流的 PDF 格式以外，还支持 ePub, Mobi格式，还有源码提供，甚至可以直接将电子书发送至你的 Kindle 设备。</p><p><img src="/packtpub-offer-free-learning/packtpub-eBook-2.jpg" alt="eBook Formats"></p><p>目前每天都提供一本免费的电子书，需要注册登录，然后到下面这个链接领取：</p><p><strong><a href="https://www.packtpub.com/packt/offers/free-learning">https://www.packtpub.com/packt/offers/free-learning</a></strong></p><p>比如今天送的是这本 TypeScript Design Patterns</p><p><img src="/packtpub-offer-free-learning/packtpub-eBook-1.jpg" alt="Free Offer"></p><blockquote><p>注意：由于 PacktPub 网站已经启用了 Google 的 reCAPTCHA 验证码，所以你需要科学上网才能领取。</p></blockquote></body></html>]]></content>
    
    
    <summary type="html">Packt是一家创立于2004年，总部位于英国伯明翰的技术书籍出版商，对电子书支持非常友好，除了主流的 PDF 格式以外，还支持 ePub, Mobi格式，还有源码提供，甚至可以直接将电子书发送至你的 Kindle 设备。目前每天都提供一本免费的电子书</summary>
    
    
    
    <category term="eBook" scheme="http://winotes.net/categories/eBook/"/>
    
    
    <category term="Packt" scheme="http://winotes.net/tags/Packt/"/>
    
    <category term="eBook" scheme="http://winotes.net/tags/eBook/"/>
    
  </entry>
  
  <entry>
    <title>Python练手小程序-中科大网络课堂视频下载</title>
    <link href="http://winotes.net/python-practice-1-ustc-online-course-downloader/"/>
    <id>http://winotes.net/python-practice-1-ustc-online-course-downloader/</id>
    <published>2017-08-28T03:46:31.000Z</published>
    <updated>2020-01-05T09:00:54.021Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h4 id="所谓人生苦短，我用-Python"><a href="#所谓人生苦短，我用-Python" class="headerlink" title="所谓人生苦短，我用 Python"></a>所谓人生苦短，我用 Python</h4><p>作为一个编程小白，我也开始了学习 Python 的过程。之前在知乎上爬贴，看到个有意思的回答，<a href="https://www.zhihu.com/question/20799742/answer/99491808#">大家都用 Python 来做什么啊？ - Tsing 的回答</a>，答主用了一小段代码拿到了学校研究生网络课堂在线视频的真实地址，答案里面的代码段关键部分被处理过，我看到评论里面好多人在求，我就想自己试试看能不能摸索出来，折腾了几天，终于从白板写出了第一个 Python 小程序。</p><span id="more"></span><p>以下是<a href="https://github.com/randyzhong/my-python-learning/blob/master/ustc-wlkt-downloader/ustc-wlkt-downloader.py">源代码</a>:</p><figure class="highlight python"><table><tbody><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><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="comment"># http://wlkt.ustc.edu.cn/ (USTC CERNET IP Only)</span></span><br><span class="line"><span class="comment"># Public course only</span></span><br><span class="line"><span class="comment"># If online course is set to private or restricted for Xiaonei only, you have to run this downloader from USTC CERNET IP, or you'll not get the real video source URL.</span></span><br><span class="line"><span class="comment"># Reference: https://www.zhihu.com/question/20799742/answer/99491808</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> urllib</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"></span><br><span class="line">s = requests.Session() </span><br><span class="line">link = <span class="string">"http://wlkt.ustc.edu.cn/video/detail_3752_0.htm"</span> <span class="comment"># This is a public video</span></span><br><span class="line">req = s.get(link)</span><br><span class="line">html = req.content</span><br><span class="line">soup = BeautifulSoup(html, <span class="string">"html.parser"</span>)</span><br><span class="line">videourl1 = soup.find(<span class="built_in">id</span>=<span class="string">"videourl1"</span>)[<span class="string">'value'</span>]</span><br><span class="line">htopicid = soup.find(<span class="built_in">id</span>=<span class="string">"htopicid"</span>)[<span class="string">'value'</span>]</span><br><span class="line">header = {<span class="string">'User-Agent'</span>: <span class="string">'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'</span>,</span><br><span class="line">           <span class="string">'Content-Type'</span>: <span class="string">'application/x-www-form-urlencoded;charset=UTF-8'</span>,</span><br><span class="line">           <span class="string">'X-Requested-With'</span>: <span class="string">'XMLHttpRequest'</span>,</span><br><span class="line">           <span class="string">'Host'</span>: <span class="string">'wlkt.ustc.edu.cn'</span>,</span><br><span class="line">           <span class="string">'Origin'</span>: <span class="string">'http://wlkt.ustc.edu.cn'</span>,</span><br><span class="line">           <span class="string">'Referer'</span>: <span class="string">'http://wlkt.ustc.edu.cn/video/detail_3752_0.htm'</span>}</span><br><span class="line">payload = urllib.urlencode({<span class="string">'videourl1'</span>: videourl1,<span class="string">'hid_topicid'</span>: htopicid})</span><br><span class="line">url = requests.post(<span class="string">"http://wlkt.ustc.edu.cn/ajaxprocess.php?menu=getvideourl"</span>,data=payload, headers=header)</span><br><span class="line"><span class="built_in">print</span> (<span class="string">"The real video URL is： http://wlkt.ustc.edu.cn/mp4.php?file="</span> + url.content[<span class="number">14</span>:])</span><br></pre></td></tr></tbody></table></figure><p>这里面最大的坑其实还是校内外IP限制的问题，在中科大的网络课堂视频里面，只有一小部分可以在外网访问，大部分都限制只允许校内教育网IP访问, 如果你在校外，因为后台服务器限制，返回来的只有 xiaowai 几个字，除非你有中科大校内代理，否则这个没法破。我找的这个例子是对公网开放的，权当拿来自己练手。</p></body></html>]]></content>
    
    
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;h4 id=&quot;所谓人生苦短，我用-Python&quot;&gt;&lt;a href=&quot;#所谓人生苦短，我用-Python&quot; class=&quot;headerlink&quot; title=&quot;所谓人生苦短，我用 Python&quot;&gt;&lt;/a&gt;所谓人生苦短，我用 Python&lt;/h4&gt;&lt;p&gt;作为一个编程小白，我也开始了学习 Python 的过程。之前在知乎上爬贴，看到个有意思的回答，&lt;a href=&quot;https://www.zhihu.com/question/20799742/answer/99491808#&quot;&gt;大家都用 Python 来做什么啊？ - Tsing 的回答&lt;/a&gt;，答主用了一小段代码拿到了学校研究生网络课堂在线视频的真实地址，答案里面的代码段关键部分被处理过，我看到评论里面好多人在求，我就想自己试试看能不能摸索出来，折腾了几天，终于从白板写出了第一个 Python 小程序。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</summary>
    
    
    
    <category term="Python" scheme="http://winotes.net/categories/Python/"/>
    
    
    <category term="Python" scheme="http://winotes.net/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>在 GitHub Pages 上面搭建 Hexo 静态博客</title>
    <link href="http://winotes.net/deploying-hexo-on-github/"/>
    <id>http://winotes.net/deploying-hexo-on-github/</id>
    <published>2017-07-08T03:46:31.000Z</published>
    <updated>2020-01-05T09:00:53.942Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>本站迁移至 GitHub Pages 已经月余，毕竟是静态页面，访问速度令人满意，不过其搭建和发布还是不同于传统的博客程序，在此记录下搭建过程。</p><h3 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h3><p>GitHub Pages 本用于介绍托管在 GitHub 的项目，也可以用来搭建博客，有1GB 的免费空间。官方推荐使用 <a href="http://jekyllrb.com/">Jekyll</a> 来搭建，不过我看上了 Hexo 的主题，所以选了它。</p><p>Hexo 是一个基于 Node.js 的快速、简洁且高效的博客框架，使用 Markdown（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页并托管在 Github Pages 和 Heroku 等平台上。Hexo 作者是来自台湾的 <a href="https://github.com/tommy351">tommy351</a>。</p><span id="more"></span><h3 id="GitHub-Pages-设置"><a href="#GitHub-Pages-设置" class="headerlink" title="GitHub Pages 设置"></a>GitHub Pages 设置</h3><ol><li>首先你需要注册一个 GitHub 帐号；</li><li>新建一个与你用户名对应的仓库，仓库名必须为 <strong>username.github.io</strong>；</li><li>在仓库中新建一个分支，比如 hexo；</li><li>将该分支设置成缺省分支；</li></ol><blockquote><p>上面最后两个操作的用意是将 hexo 分支用作 Hexo 博客源码的备份分支，将原来的默认缺省分支 master 作为发布静态内容的目标分支，这样你可以很方便的切换你的写作环境到另外一台电脑。</p></blockquote><h3 id="Hexo-安装"><a href="#Hexo-安装" class="headerlink" title="Hexo 安装"></a>Hexo 安装</h3><p>因为 GitHub Pages 是纯静态托管平台，不能像传统博客程序那样，找个浏览器就可以写，所以需要搭建能发布静态内容的环境，我们这里用 Hexo 来生成静态内容并发布到 GitHub Pages。</p><h4 id="安装-Git"><a href="#安装-Git" class="headerlink" title="安装 Git"></a>安装 Git</h4><p>我使用的发行版是 Ubuntu 16.04 LTS （Xenial Xerus），所以安装 Git 的命令就很简单 <code>$ sudo apt-get install git-core</code></p><h4 id="安装-Node-js"><a href="#安装-Node-js" class="headerlink" title="安装 Node.js"></a>安装 Node.js</h4><p>最好的方法是使用 <a href="https://github.com/creationix/nvm"> Node Version Manager</a>。</p><h5 id="cURL"><a href="#cURL" class="headerlink" title="cURL:"></a>cURL:</h5><p><code>$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash</code></p><h5 id="Wget"><a href="#Wget" class="headerlink" title="Wget:"></a>Wget:</h5><p><code>$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash</code></p><p>当 nvm 装好以后，关掉 terminal 终端窗口再重新打开，运行以下命令安装 Node.js：</p><p><code>$ nvm install stable</code></p><h4 id="安装-Hexo"><a href="#安装-Hexo" class="headerlink" title="安装 Hexo"></a>安装 Hexo</h4><p><code>$ npm install -g hexo-cli</code></p><p>如果你的网络访问 npm 源比较慢，你可以使用淘宝的 NPM 镜像（每10分钟与官方源同步一次）来安装：</p><p><code>npm install -g hexo-cli --registry=https://registry.npm.taobao.org</code></p><h4 id="Hexo-初始化"><a href="#Hexo-初始化" class="headerlink" title="Hexo 初始化"></a>Hexo 初始化</h4><p>当 Hexo 安装好以后，运行 hexo init <code>&lt;folder&gt;</code> 来初始化。</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ hexo init &lt;folder&gt;</span><br><span class="line">$ <span class="built_in">cd</span> &lt;folder&gt;</span><br><span class="line">$ npm install</span><br></pre></td></tr></tbody></table></figure><p>初始化之后，目录结构看起来应该像下面的样子:</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── _config.yml</span><br><span class="line">├── package.json</span><br><span class="line">├── scaffolds</span><br><span class="line">├── source</span><br><span class="line">|   ├── _drafts</span><br><span class="line">|   └── _posts</span><br><span class="line">└── themes</span><br></pre></td></tr></tbody></table></figure><h5 id="config-yml"><a href="#config-yml" class="headerlink" title="_config.yml"></a>_config.yml</h5><p>网站的<strong>配置</strong>信息，您可以在此配置大部分的参数。</p><h5 id="package-json"><a href="#package-json" class="headerlink" title="package.json"></a>package.json</h5><p>应用程序的信息。<a href="http://embeddedjs.com/">EJS</a>, <a href="http://learnboost.github.io/stylus/">Stylus</a> 和 <a href="http://daringfireball.net/projects/markdown/">Markdown</a> renderer 已默认安装，您可以自由移除。</p><figure class="highlight json"><table><tbody><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><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"hexo-site"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"version"</span><span class="punctuation">:</span> <span class="string">"0.0.0"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"private"</span><span class="punctuation">:</span> <span class="keyword">true</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"hexo"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"version"</span><span class="punctuation">:</span> <span class="string">""</span></span><br><span class="line">  <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"dependencies"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"hexo"</span><span class="punctuation">:</span> <span class="string">"^3.0.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-generator-archive"</span><span class="punctuation">:</span> <span class="string">"^0.1.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-generator-category"</span><span class="punctuation">:</span> <span class="string">"^0.1.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-generator-index"</span><span class="punctuation">:</span> <span class="string">"^0.1.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-generator-tag"</span><span class="punctuation">:</span> <span class="string">"^0.1.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-renderer-ejs"</span><span class="punctuation">:</span> <span class="string">"^0.1.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-renderer-stylus"</span><span class="punctuation">:</span> <span class="string">"^0.2.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-renderer-marked"</span><span class="punctuation">:</span> <span class="string">"^0.2.4"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-server"</span><span class="punctuation">:</span> <span class="string">"^0.1.2"</span></span><br><span class="line">  <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><h5 id="scaffolds"><a href="#scaffolds" class="headerlink" title="scaffolds"></a>scaffolds</h5><p><strong>模版</strong>文件夹。当您新建文章时，Hexo 会根据 scaffold 来建立文件。</p><p>Hexo的模板是指在新建的markdown文件中默认填充的内容。例如，如果您修改scaffold/post.md中的Front-matter内容，那么每次新建一篇文章时都会包含这个修改。</p><h5 id="source"><a href="#source" class="headerlink" title="source"></a>source</h5><p>资源文件夹是存放用户资源的地方。除 <code>_posts</code> 文件夹之外，开头命名为 <code>_</code> (下划线)的文件 / 文件夹和隐藏的文件将会被忽略。Markdown 和 HTML 文件会被解析并放到 <code>public</code> 文件夹，而其他文件会被拷贝过去。</p><h5 id="themes"><a href="#themes" class="headerlink" title="themes"></a>themes</h5><p><strong>主题</strong>文件夹。Hexo 会根据主题来生成静态页面。</p><p>更多关于 Hexo 建站和配置的详细信息，可以参考<a href="https://hexo.io/zh-cn/docs/setup.html">官方文档</a></p><h4 id="发布-amp-部署"><a href="#发布-amp-部署" class="headerlink" title="发布 &amp; 部署"></a>发布 &amp; 部署</h4><h5 id="新建文章"><a href="#新建文章" class="headerlink" title="新建文章"></a>新建文章</h5><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new [layout] &lt;title&gt;</span><br></pre></td></tr></tbody></table></figure><p>新建一篇文章。如果没有设置 <code>layout</code> 的话，默认使用 <a href="configuration.html">_config.yml</a> 中的 <code>default_layout</code> 参数代替。如果标题包含空格的话，请使用引号括起来。</p><h5 id="生成静态内容"><a href="#生成静态内容" class="headerlink" title="生成静态内容"></a>生成静态内容</h5><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></tbody></table></figure><p>生成静态文件。</p><table><thead><tr><th>选项</th><th>描述</th></tr></thead><tbody><tr><td><code>-d</code>, <code>--deploy</code></td><td>文件生成后立即部署网站</td></tr><tr><td><code>-w</code>, <code>--watch</code></td><td>监视文件变动</td></tr></tbody></table><p>该命令可以简写为</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo g</span><br></pre></td></tr></tbody></table></figure><h5 id="本地调试"><a href="#本地调试" class="headerlink" title="本地调试"></a>本地调试</h5><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></tbody></table></figure><p>启动服务器。默认情况下，访问网址为： <code>http://localhost:4000/</code>。</p><table><thead><tr><th>选项</th><th>描述</th></tr></thead><tbody><tr><td><code>-p</code>, <code>--port</code></td><td>重设端口</td></tr><tr><td><code>-s</code>, <code>--static</code></td><td>只使用静态文件</td></tr><tr><td><code>-l</code>, <code>--log</code></td><td>启动日记记录，使用覆盖记录格式</td></tr></tbody></table><h5 id="部署"><a href="#部署" class="headerlink" title="部署"></a>部署</h5><p>部署到 Github 前需要配置 <strong>_config.yml</strong> 文件，首先找到下面的内容</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"># Deployment</span><br><span class="line">## Docs: http://hexo.io/docs/deployment.html</span><br><span class="line">deploy:</span><br><span class="line">  type:</span><br></pre></td></tr></tbody></table></figure><p>然后将它们修改为</p><figure class="highlight plaintext"><table><tbody><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><span class="line"># Deployment</span><br><span class="line">## Docs: http://hexo.io/docs/deployment.html</span><br><span class="line">deploy:</span><br><span class="line">  type: git</span><br><span class="line">  repo:https://github.com/randyzhong/randyzhong.github.io.git</span><br><span class="line">  branch: master</span><br></pre></td></tr></tbody></table></figure><p>另外，还需要安装 git 部署插件：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-deployer-git --save</span><br></pre></td></tr></tbody></table></figure><p><strong>部署网站：</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></tbody></table></figure><table><thead><tr><th>参数</th><th>描述</th></tr></thead><tbody><tr><td><code>-g</code>, <code>--generate</code></td><td>部署之前预先生成静态文件</td></tr></tbody></table><p>生成静态文件并发布的命令可以简写为：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo -d g</span><br></pre></td></tr></tbody></table></figure><h3 id="附加配置"><a href="#附加配置" class="headerlink" title="附加配置"></a>附加配置</h3><p>本站使用了 maupassant 主题，并且安装了几个插件，所以 package.json 文件内容相比默认的有变化</p><figure class="highlight json"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"hexo-site"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"version"</span><span class="punctuation">:</span> <span class="string">"0.0.0"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"private"</span><span class="punctuation">:</span> <span class="keyword">true</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"hexo"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"version"</span><span class="punctuation">:</span> <span class="string">"3.3.8"</span></span><br><span class="line">  <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"dependencies"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"hexo"</span><span class="punctuation">:</span> <span class="string">"^3.2.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-asset-image"</span><span class="punctuation">:</span> <span class="string">"0.0.3"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-deployer-git"</span><span class="punctuation">:</span> <span class="string">"^0.3.1"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-generator-archive"</span><span class="punctuation">:</span> <span class="string">"^0.1.4"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-generator-category"</span><span class="punctuation">:</span> <span class="string">"^0.1.3"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-generator-feed"</span><span class="punctuation">:</span> <span class="string">"^1.2.2"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-generator-index"</span><span class="punctuation">:</span> <span class="string">"^0.2.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-generator-sitemap"</span><span class="punctuation">:</span> <span class="string">"^1.2.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-generator-tag"</span><span class="punctuation">:</span> <span class="string">"^0.2.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-helper-qrcode"</span><span class="punctuation">:</span> <span class="string">"^1.0.2"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-renderer-ejs"</span><span class="punctuation">:</span> <span class="string">"^0.3.1"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-renderer-jade"</span><span class="punctuation">:</span> <span class="string">"^0.3.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-renderer-marked"</span><span class="punctuation">:</span> <span class="string">"^0.3.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-renderer-sass"</span><span class="punctuation">:</span> <span class="string">"^0.3.2"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-renderer-stylus"</span><span class="punctuation">:</span> <span class="string">"^0.3.1"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-server"</span><span class="punctuation">:</span> <span class="string">"^0.2.0"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"hexo-wordcount"</span><span class="punctuation">:</span> <span class="string">"^3.0.2"</span></span><br><span class="line">  <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p>所以在安装了 Hexo 之后，可以运行如下命令添加这些插件：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-asset-image --registry=https://registry.npm.taobao.org --save</span><br><span class="line">$ npm install hexo-deployer-git --registry=https://registry.npm.taobao.org --save</span><br><span class="line">$ npm install hexo-generator-feed --registry=https://registry.npm.taobao.org --save</span><br><span class="line">$ npm install hexo-generator-sitemap --registry=https://registry.npm.taobao.org --save</span><br><span class="line">$ npm install hexo-renderer-jade --registry=https://registry.npm.taobao.org --save</span><br><span class="line">$ npm install hexo-renderer-stylus --registry=https://registry.npm.taobao.org --save</span><br><span class="line">$ npm install hexo-wordcount --registry=https://registry.npm.taobao.org --save</span><br><span class="line">$ npm install hexo-helper-qrcode --registry=https://registry.npm.taobao.org --save</span><br></pre></td></tr></tbody></table></figure><h4 id="CNAME-设置"><a href="#CNAME-设置" class="headerlink" title="CNAME 设置"></a>CNAME 设置</h4><p>在发布完成以后，就可以使用 <a href="https://yourname.github.io/">https://yourname.github.io</a> 来访问你的主页了。<br>如果你不想用 github.io 的二级域名，你可以使用自己的域名。</p><ol><li>在Hexo 的 source 目录下创建 CNAME 文件。</li><li>填写自己的域名如 winotes.net 或者 <a href="http://www.winotes.net,保存退出./">www.winotes.net，保存退出。</a></li><li>登录你的域名解析商，比如 DNSPod，先添加域名，然后添加记录，设置如下：</li></ol><p>主机记录 | 记录类型 | 线路类型 | 记录值 | MX优先级 | TTL<br>— | —<br>@ | CNAME | 默认 | yourname.github.io. | - | 10<br>www | CNAME | 默认 | yourname.github.io. | - | 10</p><p>当然，你也可以通过创建DNS A 记录直接指定 GitHub Pages 的 IP 来解析：</p><ul><li>192.30.252.153</li><li>192.30.252.154</li></ul><h3 id="博客源码备份"><a href="#博客源码备份" class="headerlink" title="博客源码备份"></a>博客源码备份</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git add .</span><br><span class="line">$ git commit -m <span class="string">"comments"</span></span><br><span class="line">$ git push original hexo</span><br></pre></td></tr></tbody></table></figure><p>以下目录不用上传，所以在 .gitignore 里面排除掉即可：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">.git/</span><br><span class="line">public/</span><br><span class="line">.deploy_git/</span><br></pre></td></tr></tbody></table></figure></body></html>]]></content>
    
    
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;本站迁移至 GitHub Pages 已经月余，毕竟是静态页面，访问速度令人满意，不过其搭建和发布还是不同于传统的博客程序，在此记录下搭建过程。&lt;/p&gt;
&lt;h3 id=&quot;介绍&quot;&gt;&lt;a href=&quot;#介绍&quot; class=&quot;headerlink&quot; title=&quot;介绍&quot;&gt;&lt;/a&gt;介绍&lt;/h3&gt;&lt;p&gt;GitHub Pages 本用于介绍托管在 GitHub 的项目，也可以用来搭建博客，有1GB 的免费空间。官方推荐使用 &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; 来搭建，不过我看上了 Hexo 的主题，所以选了它。&lt;/p&gt;
&lt;p&gt;Hexo 是一个基于 Node.js 的快速、简洁且高效的博客框架，使用 Markdown（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页并托管在 Github Pages 和 Heroku 等平台上。Hexo 作者是来自台湾的 &lt;a href=&quot;https://github.com/tommy351&quot;&gt;tommy351&lt;/a&gt;。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</summary>
    
    
    
    <category term="网站相关" scheme="http://winotes.net/categories/%E7%BD%91%E7%AB%99%E7%9B%B8%E5%85%B3/"/>
    
    
    <category term="GitHub" scheme="http://winotes.net/tags/GitHub/"/>
    
    <category term="Hexo" scheme="http://winotes.net/tags/Hexo/"/>
    
  </entry>
  
  <entry>
    <title>本站博客迁移至 Hexo</title>
    <link href="http://winotes.net/move-to-hexo/"/>
    <id>http://winotes.net/move-to-hexo/</id>
    <published>2017-06-10T06:40:11.000Z</published>
    <updated>2020-01-05T09:00:54.008Z</updated>
    
    <content type="html"><![CDATA[<html><head></head><body><p>在 BlueHost 的服务到期之后，由于其夸张的续费价格，我并没有继续将其托管在 BlueHost，在折腾折腾来去之后，发现可以利用 GitHub Pages 来做静态博客，于是乎捣鼓了三天，将本博客从 WordPress 迁移到了 Hexo，目前是发布在了 <strong>GitHub Pages</strong>，继续使用 <a href="http://winotes.net/">http://winotes.net</a> 来提供服务。</p><p>由于 CloudFlare 在大陆的访问速度较慢，所以暂时没有启用 HTTPS，待出现更好的解决方案之前，先用 HTTP 来访问。</p><p>WordPress 的迁移是用插件来做的，不过导出来的 md 文件并不干净，需要手工修正，顺便清理了下原来的分类目录和标签，现在至少看起来清爽了不少。</p></body></html>]]></content>
    
    
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;</summary>
    
    
    
    <category term="网站相关" scheme="http://winotes.net/categories/%E7%BD%91%E7%AB%99%E7%9B%B8%E5%85%B3/"/>
    
    
    <category term="GitHub" scheme="http://winotes.net/tags/GitHub/"/>
    
    <category term="Hexo" scheme="http://winotes.net/tags/Hexo/"/>
    
    <category term="WordPress" scheme="http://winotes.net/tags/WordPress/"/>
    
  </entry>
  
</feed>
