<?xml version="1.0" encoding="utf-8"?>
<search>
  <entry>
    <title>优化第二步各种软件问题</title>
    <url>/2020/04/30/45.WindowsAPP/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong><br><strong>上一篇文章给大家讲述了<a href="https://www.8868866.xyz/2020/03/26/37.%E4%BC%98%E5%8C%96%E7%AC%AC%E4%B8%80%E6%AD%A5%E5%90%84%E7%A7%8D%E9%A9%B1%E5%8A%A8%E9%97%AE%E9%A2%98/">重装系统后的驱动问题</a>，那么接下来的内容是给大家推荐一些增快办公效率的软件。</strong></p>
<p><strong>在配置好显卡驱动后，可以说一个崭新的生产力就跃然眼前了，那么接下来我们需要做什么呢？</strong></p>
<h1 id="更新系统"><a href="#更新系统" class="headerlink" title="更新系统"></a>更新系统</h1><p>Tips:刚展开完毕的系统还在后台下载更新微软自己的软件，所以电脑会很卡顿，不妨看看微软软件商店的更新情况。待软件更新完毕后，再折腾以下步骤。</p>
<blockquote>
<p>①也许你下载的系统是旧版本，若你讨厌新版本的win10，那么就可以跳过前言直接<strong><a href="https://bigocean.lanzous.com/ic15yyb" target="_blank" rel="noopener">下载”禁更新”软件</a>提取码:<code>ocean</code></strong>（或自己手动关闭windows自动更新）<br>②如果你需要保持系统最新，但不希望以后windows背着你更新系统。那么请看下文</p>
</blockquote>
<p><strong>首先可以按照以下步骤将自己电脑更新至最新版本</strong></p>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/1.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="1"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/1.png" /></a>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/2.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="2"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/2.png" /></a>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/3.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="3"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/3.png" /></a>
<p><strong>更新完毕后，就可以下载“禁止自更新”软件了</strong><br><strong><a href="https://bigocean.lanzous.com/ic15yyb" target="_blank" rel="noopener">下载</a>提取码:<code>ocean</code></strong></p>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/4.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="软件预览"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/4.png" /></a>
<p><strong>使用方法：把软件解压到任意位置，右键“以管理员身份运行”，设置成功后重启电脑即可</strong><br><strong>信不过软件的大伙可以按照接下来的步骤手动禁更新（原理不同，不能像软件一样永久禁止。有效期大概7-14天？）</strong></p>
<blockquote>
<p>首先把“此电脑”图标调整出来：桌面鼠标右键→个性化→主题→相关的设置下的“桌面图标设置”→勾选“计算机（M）”→确定</p>
</blockquote>
<p><strong>首先右键此电脑→管理(G)→按照下边操作完成即可</strong></p>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/5.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="5"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/5.png" /></a>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/6.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="6"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/6.png" /></a>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/7.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="7"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/7.png" /></a>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/8.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="8"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/8.png" /></a>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/9.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="9"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/9.png" /></a>

<h1 id="我需要一款软件管家"><a href="#我需要一款软件管家" class="headerlink" title="我需要一款软件管家"></a>我需要一款软件管家</h1><p>如果你没有一直爱用的软件管家的话。那么就采取我的建议吧：<br><strong>腾讯的软件管家一直是我所钟爱的，安装包10兆，无广告无弹窗</strong></p>
<blockquote>
<p>也正是由于它的优点，所以被淘汰了：现在你去官方网站下载到的都是腾讯电脑管家的安装包，而非软件管理的安装包。</p>
</blockquote>
<center>简洁的界面，没有多余的花里胡哨的功能</center>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/10.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="软件界面"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/10.png" /></a>

<p><strong><a href="https://bigocean.lanzous.com/ic17y7g" target="_blank" rel="noopener">下载</a>提取码:<code>ocean</code></strong></p>
<h1 id="我需要一款输入法"><a href="#我需要一款输入法" class="headerlink" title="我需要一款输入法"></a>我需要一款输入法</h1><p>如果你没有一直爱用的输入法的话。那么就采取我的建议吧：<br>我只推荐<strong>一款：搜狗输入法</strong>(事实上我也只用过搜狗的输入法0_0)</p>
<blockquote>
<p>别着急不服，且听我说完它的全称：搜狗输入法v9.7.0.3676去广告绿化纯净版本<br>有什么特点或变化？：<br>新版变化<br>2020.04.08 9.7正式版发布<br>更新词库同步功能，与Mac版实现词库互通，输入习惯跨平台合并迁移，登录相同账号即可同步输入习惯<br>录音助手优化，支持了更多型号录音笔<br>优化了词库同步流程<br>优化了软键盘性能<br>修复了部分应用退出崩溃问题<br>此版特点by 大水牛, zdBryan<br>#免广告，专注精简优化，彻底免升级，屏蔽阻止自动更新。<br>#去广告（任务栏通知区域搜狐微门户弹窗、勋章推荐弹窗）<br>#无推广行为，默认无多余干扰提示，默认无多余进程驻留；<br>#可选：云计算候选、后台联网组件（词库更新、配置同步）<br>#删除：搜狐微门户新闻程序、勋章推荐程序、搜索候选模块；<br>#删除：核心服务程序、网络更新程序、辅助工具模块、崩溃反馈程序；<br>#删除：图片表情、人工语音、皮肤推荐、皮肤盒子/flash皮肤等，可在工具箱里安装；<br>#优化：取消搜索候选、皮肤推荐/flash皮肤模式、词条/升级/新勋章/活跃天数等提示；<br>#安装程序：支持Windows 10 Metro模式，支持ARM64位系统，支持检测覆盖安装。</p>
</blockquote>
<p><strong><a href="https://bigocean.lanzous.com/ic1aqxc" target="_blank" rel="noopener">下载</a>提取码:<code>ocean</code></strong></p>
<h1 id="我需要一款浏览器"><a href="#我需要一款浏览器" class="headerlink" title="我需要一款浏览器"></a>我需要一款浏览器</h1><p>如果你没有一直爱用的浏览器的话。那么就采取我的建议吧：</p>
<blockquote>
<p>排名不分先后<br><a href="https://browser.360.cn/ee/" target="_blank" rel="noopener">360极速浏览器（注意：是极速浏览器）</a><br><a href="https://centbrowser.cn/" target="_blank" rel="noopener">Cent Browser百分浏览器（增强版谷歌浏览器：适合国人使用习惯）</a><br><a href="https://www.firefox.com.cn/" target="_blank" rel="noopener">火狐浏览器</a></p>
</blockquote>
<h1 id="我需要一款卸载工具"><a href="#我需要一款卸载工具" class="headerlink" title="我需要一款卸载工具"></a>我需要一款卸载工具</h1><p>如果你没有一直爱用的卸载工具的话。那么就采取我的建议吧：</p>
<blockquote>
<p>结合我的个人使用经验我将暂时推荐一款卸载神器！<br><strong>它是</strong>：“Revo Uninstaller Pro”<br><strong>简介</strong>：软件强制卸载工具，一款国外优秀的软件卸载工具，具有猎人模式、安装跟踪监视改动、强制卸载扫描分析、启动项管理、使用痕迹清理、垃圾文件清理、浏览器垃圾清理等诸多功能。<br>#采用官方便携版集成永久授权文件，启动即为已激活专业版！<br>#无检测更新， 删除多国语言、预先设置启动默认为简体中文；</p>
</blockquote>
<p><strong><a href="https://bigocean.lanzous.com/b00zg6fjc" target="_blank" rel="noopener">下载页面</a>提取码:<code>ocean</code></strong><br>两个版本（下载页面自选）：<br>①：v4.3.0俄版（大小16.7Mb）：Revo Uninstaller Pro 4.30，此版本为俄罗斯大神重新打包版，下载压缩包–解压–双击exe文件进行安装。简体中文设置：点击右上角三横杆–点击选项（options）–在语言选项下选择简体中文。<br>②：v4.3.1专业便携版（大小9.8Mb）：Revo Uninstaller Pro v4.3.1 免激活绿色便携版。</p>
<p><strong>用法：正常启动（如果报错，就请以管理员身份运行）→选中要卸载的软件→鼠标右键卸载→这时会调用被卸载软件自身的卸载工具进行卸载（算是给它个面子、自行了断的意思）→完成后就开始RevoUninstallerPro工作了它会重新检测软件是否卸载干净（选中高级→扫描，等待扫描完成即可，一般都不可能卸载干净，会残留注册表、历史配置等等等）→“全选”被检测出来的残留项一个不留的全部删掉→全选→删除→完成</strong></p>
<h1 id="我需要一款解压缩工具"><a href="#我需要一款解压缩工具" class="headerlink" title="我需要一款解压缩工具"></a>我需要一款解压缩工具</h1><p>如果你没有一直爱用的解压缩工具的话。那么就采取我的建议吧：</p>
<blockquote>
<p>1.WinRAR（v5.90官方中文无广告版本）<br><a href="https://www.win-rar.com/fileadmin/winrar-versions/sc/sc20200409/wrr/wrar590sc.exe" target="_blank" rel="noopener">32位官方下载</a><br><a href="https://www.win-rar.com/fileadmin/winrar-versions/sc/sc20200409/wrr/winrar-x64-590sc.exe" target="_blank" rel="noopener">64位官方下载</a><br><a href="https://bigocean.lanzous.com/ic1cz8d" target="_blank" rel="noopener">激活秘钥的使用方法：将.key文件解压到WinRAR所在文件夹里</a>提取码:<code>ocean</code><br>2.<a href="https://dl.360safe.com/360zip_setup_4.0.0.1220.exe" target="_blank" rel="noopener">360压缩官方下载</a>这个压缩工具时我一直在用的。</p>
</blockquote>
<h1 id="我需要一款毫秒级搜索本地文件的工具"><a href="#我需要一款毫秒级搜索本地文件的工具" class="headerlink" title="我需要一款毫秒级搜索本地文件的工具"></a>我需要一款毫秒级搜索本地文件的工具</h1><p>如果你受不了windows的龟速搜索功能的话，那么就采取我的建议吧：</p>
<blockquote>
<p>众所周知它就是<br><strong>Everything（v1.4.1.969）</strong><br>【软件简介】<br>Everything是一款体积小巧，界面简洁易用的搜索工具，具有以下特点：<br>基于名称快速定位文件和文件夹<br>轻量安装文件<br>干净简洁的用户界面<br>快速文件索引<br>快速搜索<br>最小资源使用<br>便于文件分享<br>实时更新<br>相信我，它的表现绝对会让你直呼真香的！</p>
</blockquote>
<p><strong><center>↓请看↓</center></strong></p>
<a href="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/11.gif" target="_blank" rel="noopener" data-fancybox="images" data-caption="速度预览"><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/45/11.gif" /></a>
<center>毫无卡顿可言</center>
**[(64位/32位)下载](https://bigocean.lanzous.com/ic1dusj)提取码:`ocean`**


<h1 id="我需要一款办公三件套软件"><a href="#我需要一款办公三件套软件" class="headerlink" title="我需要一款办公三件套软件"></a>我需要一款办公三件套软件</h1><p>这个当然首推金山的WPS三件套啦其次是Micro office的：</p>
<blockquote>
<p>都知道WPS云同步在国内要比Microoffice+onedrive香<br>可是WPS各式各样的广告实在是让人防不胜防。所以我推荐的是：<br>1.WPS2019 专业增强版<br>  WPS Office 免费版和专业增强版有什么区别？<br>  从授权上看：个人版是只供个人使用，不能用于商业；专业版则可用于商业。<br>  从功能上看：个人版默认没有开发工具VBA环境、宏功能支持；专业版则有。<br>  从体验上看：WPS2016个人版/抢鲜版无条件推送广告；WPS2016专业版则没。<br>  WPS2019个人版，即免费基础版有广告，功能有限制；授权分商业版/高级商业版；<br>  具体特权对比图见WPS会员中心：<a href="https://vip.wps.cn/?from=wps.cn" target="_blank" rel="noopener">https://vip.wps.cn/?from=wps.cn</a><br><a href="https://wdl1.cache.wps.cn/wps/download/ep/WPS2019/WPSPro_11.8.2.8808.exe" target="_blank" rel="noopener">官方下载地址</a><br><a href="https://bigocean.lanzous.com/ic1fb6f" target="_blank" rel="noopener">激活工具、激活码赠上！不放心的可以用里边的激活码激活（激活码激活有时效）</a>提取码:<code>ocean</code><br>2.OFFICE2019增强版秘钥：<code>MY4BN-P2HGJ-WV37X-M96Y8-TQ9GG</code></p>
</blockquote>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<blockquote>
<p>免责声明<br>本站提供的一切软件、教程和内容信息仅限用于学习和研究目的；不得将上述内容用于商业或者非法用途，否则，一切后果请用户自负。本站信息来自网络，版权争议与本站无关。您必须在下载后的24个小时之内，从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序，请支持正版，购买注册，得到更好的正版服务。如有侵权请邮件与我们<strong><a href="https://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=E3F6dHxwdnJ9IlNlemM9YmI9cHx_" target="_blank" rel="noopener">联系</a></strong>。敬请谅解！</p>
</blockquote>
]]></content>
      <categories>
        <category>Win趣</category>
      </categories>
  </entry>
  <entry>
    <title>科学上网</title>
    <url>/2020/04/17/44.%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<blockquote>
<p>V2Ray客户端使用不很方便，因为没有自带 GUI 配置界面。V2RayN 则是 windows平台一个对新手比较友好的 V2Ray GUI 客户端。</p>
</blockquote>
<h1 id="下载v2ray-core"><a href="#下载v2ray-core" class="headerlink" title="下载v2ray core"></a>下载v2ray core</h1><p><strong><a href="https://github.com/v2ray/v2ray-core/releases/latest" target="_blank" rel="noopener">下载</a><br>选择 v2ray-windows-64.zip 下载，如果你的系统是 32 位的那就选择 v2ray-windows-32.zip。<br>下载完成，解压。</strong></p>
<h1 id="下载-v2RayN"><a href="#下载-v2RayN" class="headerlink" title="下载 v2RayN"></a>下载 v2RayN</h1><p><strong><a href="https://github.com/2dust/v2rayN/releases/latest" target="_blank" rel="noopener">下载</a><br>右键选择以管理员身份运行 V2RayN.exe</strong></p>
<h1 id="GFWList"><a href="#GFWList" class="headerlink" title="GFWList"></a>GFWList</h1><p><strong><a href="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt" target="_blank" rel="noopener">地址</a></strong></p>
<h1 id="点击主界面的服务器，添加VMess服务器，导入配置文件，并选择从剪贴板导入URL，所有的参数会自动填写完成。"><a href="#点击主界面的服务器，添加VMess服务器，导入配置文件，并选择从剪贴板导入URL，所有的参数会自动填写完成。" class="headerlink" title="点击主界面的服务器，添加VMess服务器，导入配置文件，并选择从剪贴板导入URL，所有的参数会自动填写完成。"></a>点击主界面的服务器，添加VMess服务器，导入配置文件，并选择从剪贴板导入URL，所有的参数会自动填写完成。</h1><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<blockquote>
<p>免责声明<br>本站提供的一切软件、教程和内容信息仅限用于学习和研究目的；不得将上述内容用于商业或者非法用途，否则，一切后果请用户自负。本站信息来自网络，版权争议与本站无关。您必须在下载后的24个小时之内，从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序，请支持正版，购买注册，得到更好的正版服务。如有侵权请邮件与我们<strong><a href="https://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=E3F6dHxwdnJ9IlNlemM9YmI9cHx_" target="_blank" rel="noopener">联系</a></strong>。敬请谅解！</p>
</blockquote>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>网络类</tag>
      </tags>
  </entry>
  <entry>
    <title>XML-解析失败原因初步分析</title>
    <url>/2020/04/13/43.XML-%E8%A7%A3%E6%9E%90%E5%A4%B1%E8%B4%A5/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h1 id="首先放出有问题的代码"><a href="#首先放出有问题的代码" class="headerlink" title="首先放出有问题的代码"></a>首先放出有问题的代码</h1><blockquote>
<p>之所以直入主题是因为肝完了事情，急需入睡。hiahia</p>
</blockquote>
<pre class=" language-html"><code class="language-html">hiboard:updateUrl="https://xxx.com/xxx/api/book/xxx?xx=negative&amp;p3=1704xxx3"</code></pre>
<h1 id="查阅资料的收获"><a href="#查阅资料的收获" class="headerlink" title="查阅资料的收获"></a>查阅资料的收获</h1><h2 id="amp-在XML里是要被转义的，不然会导致解析失败。"><a href="#amp-在XML里是要被转义的，不然会导致解析失败。" class="headerlink" title="&amp; 在XML里是要被转义的，不然会导致解析失败。"></a>&amp; 在XML里是要被转义的，不然会导致解析失败。</h2><pre><code>同理的还有：
&amp;lt; &lt; 小于号 
&amp;gt; &gt; 大于号 
&amp;amp; &amp; 和 
&amp;apos; &#39; 单引号 
&amp;quot; &quot; 双引号</code></pre><h1 id="修改后的代码"><a href="#修改后的代码" class="headerlink" title="修改后的代码"></a>修改后的代码</h1><pre class=" language-html"><code class="language-html">hiboard:updateUrl="https://xxx.com/xxx/api/book/xxx?xx=negative<span class="token entity" title="&amp;">&amp;amp;</span>p3=1704xxx3"</code></pre>
<p><strong>成功</strong>，吸取的经验就是：不要在WordPress /repo里改代码，一切还是在IDE里边修改好，有什么问题都能够给出提示。为了找问题出哪里真的是肝的一批。。。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
        <category>随想</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>蓝桥杯-最大子阵</title>
    <url>/2020/04/01/42.%E8%93%9D%E6%A1%A5%E6%9D%AF-%E6%9C%80%E5%A4%A7%E5%AD%90%E9%98%B5/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h1 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h1><p><strong>给定一个nxm的矩阵A，求A中的一个非空子矩阵，使这个子矩阵中的元素和最大。<br>其中，A的子矩阵指在A中行和列均连续的一块。<br>输入格式<br>输入的第一行包含两个整数n, m，分别表示矩阵A的行数和列数。<br>接下来n行，每行m个整数，表示矩阵A。<br>输出格式<br>输出一行，包含一个整数，表示A中最大的子矩阵中的元素和。</strong></p>
<h2 id="样例输入"><a href="#样例输入" class="headerlink" title="样例输入"></a>样例输入</h2><pre><code>3 3
-1 -4 3
3 4 -1
-5 -2 8</code></pre><h2 id="样例输出"><a href="#样例输出" class="headerlink" title="样例输出"></a>样例输出</h2><p><code>10</code></p>
<h2 id="样例说明"><a href="#样例说明" class="headerlink" title="样例说明"></a>样例说明</h2><p><strong>取最后一列，和为10。<br>数据规模和约定<br>对于50%的数据，1&lt;=n, m&lt;=50；<br>对于100%的数据，1&lt;=n, m&lt;=500，A中每个元素的绝对值不超过5000。</strong></p>
<hr>
<h1 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h1><p><strong>这题我是用动态规划求解，如下图，假设最大子矩阵的结果为从第r行到k行、从第i列到j列的子矩阵，如下所示(ari表示a[r][i],假设数组下标从1开始)：</strong></p>
<pre><code>| a11 …… a1i ……a1j ……a1n |
| a21 …… a2i ……a2j ……a2n |
|  ......................|
| ...................... |
| ar1 …… ari ……arj ……arn |
|  ......................|
| ...................... |
| ak1 …… aki ……akj ……akn |
|  ......................|
| an1 …… ani ……anj ……ann |</code></pre><p><strong>那么我们将从第r行到第k行的每一行中相同列的加起来，可以得到一个一维数组如下：<br><code>(ar1+……+ak1, ar2+……+ak2, ……,arn+……+akn)</code>，那么从中我们就可以把一个求子矩阵 的问题转换成一个求最大子段和 的问题，从中求出解。那么问题又来了，什么是最大子段和？怎么求最大子段和？<br>首先，我们看一个问题：</strong></p>
<p><code>给定n个整数（可能为负数）组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值</code><br><strong>比如当（a1,a2,a3,a4,a4,a6）=(-1,11,-1,13,-5,-2)时，最大子段和就为23。</strong></p>
<h2 id="用动态算法求解"><a href="#用动态算法求解" class="headerlink" title="用动态算法求解:"></a>用动态算法求解:</h2><p>**<code>b[j]=max{a[i]+a[j]},1&lt;=i&lt;=j</code>,且<code>1&lt;=j&lt;=n</code>,则所求的最大子段和为max b[j]，1&lt;=j&lt;=n。<br>由b[j]的定义可易知，当<code>b[j-1]&gt;0时b[j]=b[j-1]+a[j]</code>，否则<code>b[j]=a[j]</code>。故b[j]的动态规划递归式为:<br><code>b[j]=max(b[j-1]+a[j],a[j])，1&lt;=j&lt;=n</code>。</p>
<h2 id="最大子段和算法"><a href="#最大子段和算法" class="headerlink" title="最大子段和算法"></a>最大子段和算法</h2><pre class=" language-C"><code class="language-C">int getMaxArray(int a[],int n){//求最大子段和
    int max=a[0],temp=0;
    for (int i=0;i<n;i++) {
        if (temp>0) {
            temp+=a[i];
        }else {
            temp=a[i];
        }
        max=max>temp?max:temp;
    }
    return  max;
}</code></pre>
<hr>
<h1 id="实现代码"><a href="#实现代码" class="headerlink" title="实现代码"></a>实现代码</h1><pre class=" language-C"><code class="language-C">#include "stdio.h"
#include<string.h>
int dp[100];
int getMaxArray(int a[],int n){//求最大子段和
    int max=a[0],temp=0;
    for (int i=0;i<n;i++) {
        if (temp>0) {
            temp+=a[i];
        }else {
            temp=a[i];
        }
        max=max>temp?max:temp;
    }
    return  max;
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    int a[n][m];
    for(int i=0;i<n;i++){
        for (int j=0;j<m;j++) {
            scanf("%d",&a[i][j]);
        }
    }
    int res=a[0][0],tmp;
    for (int i=0;i<n;i++) {
        memset(dp, 0, sizeof(dp));//将dp数组置为0
        for (int j = i; j < n; ++j) {
            for (int k = 0; k < m; ++k) {
                dp[k] += a[j][k];
            }
            tmp = getMaxArray(dp, n);
            res = res > tmp ? res : tmp;
        }
    }
    printf("%d\n", res);
}</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>随想</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>蓝桥杯-四平方和问题</title>
    <url>/2020/04/01/41.%E8%93%9D%E6%A1%A5%E6%9D%AF-%E5%9B%9B%E5%B9%B3%E6%96%B9%E5%92%8C%E9%97%AE%E9%A2%98/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h1 id="问题："><a href="#问题：" class="headerlink" title="问题："></a>问题：</h1><p><strong>四平方和定理，又称为拉格朗日定理：<br>每个正整数都可以表示为至多4个正整数的平方和。<br>如果把0包括进去，就正好可以表示为4个数的平方和。</strong></p>
<p><strong>比如：<br>5 = 0^2 + 0^2 + 1^2 + 2^2<br>7 = 1^2 + 1^2 + 1^2 + 2^2 **<br>**<br>对于一个给定的正整数，可能存在多种平方和的表示法。<br>要求你对4个数排序：<br>0 &lt;= a &lt;= b &lt;= c &lt;= d<br>并对所有的可能表示法按 a,b,c,d 为联合主键升序排列，最后输出第一个表示法<br>程序输入为一个正整数N (N&lt;5000000)<br>要求输出4个非负整数，按从小到大排序，中间用空格分开<br>例如，输入：<br>5<br>则程序应该输出：<br>0 0 1 2<br>再例如，输入：<br>12<br>则程序应该输出：<br>0 2 2 2<br>再例如，输入：<br>773535<br>则程序应该输出：<br>1 1 267 838<br>资源约定：<br>峰值内存消耗 &lt; 256M<br>CPU消耗 &lt; 3000ms<br>请严格按要求输出，不要画蛇添足地打印类似：“请您输入…” 的多余内容。<br>所有代码放在同一个源文件中，调试通过后，拷贝提交该源码。<br>注意: main函数需要返回0<br>注意: 只使用ANSI C/ANSI C++ 标准，不要调用依赖于编译环境或操作系统的特殊函数。<br>注意: 所有依赖的函数必须明确地在源文件中 #include， 不能通过工程设置而省略常用头文件。<br>提交时，注意选择所期望的编译器类型。</strong></p>
<h1 id="思路："><a href="#思路：" class="headerlink" title="思路："></a>思路：</h1><p><strong>这题我是暴力输出的，用四个循环，我先前用四个循环是从小加到大，但是超时了。我发现，输入的数越大，输出的前两个数是比较小的，但是后面两个数比较大，于是我把后面两个循环变成从大减到小，于是accept了</strong></p>
<h1 id="实现代码-C"><a href="#实现代码-C" class="headerlink" title="实现代码(C)"></a>实现代码(C)</h1><pre class=" language-C"><code class="language-C">#include<stdio.h>
#include<math.h>
void solve(long n){
    int a[4];
    for (a[0]=0; a[0]<sqrt(n); a[0]++) {
        for (a[1]=a[0];a[1]<sqrt(n) ; a[1]++) {
            for (a[2]=sqrt(n-a[1]*a[1]-a[0]*a[0]); a[2]>=a[1]; a[2]--) {
                for (a[3]=sqrt(n-a[1]*a[1]-a[2]*a[2]-a[0]*a[0])+1; a[3]>=a[2]; a[3]--) {//其实这里加1不加1都一样
                    if (a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+a[3]*a[3]==n) {
                        printf("%d %d %d %d\n",a[0],a[1],a[2],a[3]);
                        return ;
                    }
                }
            }
        }
    }
}
int main(){
    long n;
    scanf("%ld",&n);
    solve(n);
    return 0;
}</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>随想</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>蓝桥杯-生日蜡烛</title>
    <url>/2020/04/01/40.%E8%93%9D%E6%A1%A5%E6%9D%AF-%E7%94%9F%E6%97%A5%E8%9C%A1%E7%83%9B/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h1 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h1><p><strong>生日蜡烛<br>SB.从某年开始每年都举办一次生日party，并且每次都要吹熄与年龄相同根数的蜡烛。<br>现在算起来，他一共吹熄了236根蜡烛。<br>请问，他从多少岁开始过生日party的？<br>请填写他开始过生日party的年龄数。<br>注意：你提交的应该是一个整数，不要填写任何多余的内容或说明性文字。</strong></p>
<h1 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h1><p><strong>这题比较容易，方法是用两个for循环实现，第一个循环从i=1开始，第二个循环可以从j=i开始，内存循环sum+=j;而如果sum不等于236的话，在外层循环中将sum置为0就可以了</strong></p>
<h1 id="实现代码-c"><a href="#实现代码-c" class="headerlink" title="实现代码(c)"></a>实现代码(c)</h1><pre class=" language-C"><code class="language-C">#include<stdio.h>
int main(){
    int i,sum = 0,j;
    for (i=1; i<=100;i++) {
        for(j=i;j<=100;j++){
            sum+=j;
            if (sum==236) {
                printf("%d",i);
            }
        }
        sum=0;
    }
}</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>随想</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>蓝桥杯-三羊献瑞</title>
    <url>/2020/04/01/39.%E8%93%9D%E6%A1%A5%E6%9D%AF-%E4%B8%89%E7%BE%8A%E7%8C%AE%E7%91%9E/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h1 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h1><p><strong>观察下面的加法算式：</strong></p>
<pre><code>      祥 瑞 生 辉
   +  三 羊 献 瑞
----------------
    三 羊 生 瑞 气</code></pre><p><strong>其中，相同的汉字代表相同的数字，不同的汉字代表不同的数字，‘三’和‘祥’不能为 0。请你计算出“三羊献瑞”所代表的 4 位数是什么。（答案唯一）<br>注意：你提交的应该是一个整数，不要填写任何多余的内容或说明性文字，行末不要换行。</strong></p>
<h1 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h1><p><strong>这题我是用暴力法求解的</strong></p>
<h1 id="实现代码"><a href="#实现代码" class="headerlink" title="实现代码"></a>实现代码</h1><pre class=" language-C"><code class="language-C">#include<stdio.h>
int main(){
    int x,r,s,h,san,yan,xian,qi,sum1,sum2,sum3;
    for (x=1; x<=9;x++) {
        for (r=0; r<=9; r++) {
            for (s=0; s<=9; s++) {
                for (h=0; h<=9; h++) {
                    for (san=1; san<=9; san++) {
                        for (yan=0; yan<=9; yan++) {
                            for (xian=0; xian<=9; xian++) {
                                for (qi=0; qi<=9; qi++) {
                                    sum1=x*1000+r*100+s*10+h;
                                    sum2=san*1000+yan*100+xian*10+r;
                                    sum3=san*10000+yan*1000+s*100+r*10+qi;
                                    if (sum1+sum2==sum3 && x!=r && x!=s && x!=h && x!=san && x!=yan && x!=xian && x!=qi && r!=s && r!=h && r!=san && r!=h && r!=san && r!=yan && r!=xian && r!=qi &&s!=h && s!=san && s!=yan && s!=xian && s!=qi &&h!=san &&h!=yan &&h!=xian && h!=qi &&san!=yan &&san!=qi&& yan!=xian && yan!=qi &&xian!=qi) {
                                                                        printf("%d+%d=%d\n",sum1,sum2,sum3);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>随想</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>蓝桥杯-李白喝酒</title>
    <url>/2020/04/01/38.%E8%93%9D%E6%A1%A5%E6%9D%AF-%E6%9D%8E%E7%99%BD%E5%96%9D%E9%85%92/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h1 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h1><p><strong>话说大诗人李白，一生好饮。幸好他从不开车。<br>一天，他提着酒壶，从家里出来，酒壶中有酒两斗。他边走边唱：<br>无事街上走，提壶去打酒。<br>逢店加一倍，遇花喝一斗。<br>这一路上，他一共遇到店 5 次，遇到花 10 次，已知最后一次遇到的是花，他正好把酒喝光了。请你计算李白遇到店和花的次序，有多少种可能的方案。</strong></p>
<h1 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h1><p><strong>我们已知遇店 5 次，遇花 10 次，并且最后一次遇到花，正好把酒喝光。那么我们可以把店作为二进制中的 1，把花作为二进制中的 0，因为已经确定最后一次遇到的是花，所以我们需要判断枚举的结果是否刚好有 5个 1 和 9个 0。那么我们就枚举出 14 位二进制的所有可能并加以判断即可，判断思路为判断二进制是否有 9 个 0，5个 1，并且最终酒刚好剩 1 斗</strong></p>
<h1 id="实现代码-C"><a href="#实现代码-C" class="headerlink" title="实现代码(C)"></a>实现代码(C)</h1><pre><code>#include&lt;stdio.h&gt;
int main()
{
    int ans=0;//方案数
    for (int i=0; i&lt;(1&lt;&lt;14); i++) 
    {
        int dian=0;//表示遇到店的次数
        int hua=0;//表示遇到话的次数
        int num=2;//初始酒壶有两斗
        for (int j=0;j&lt;14 ;j++) 
        {
            if (i&amp;(1&lt;&lt;j)) //这里判断二进制i从右数第j+1为是否为1
            {
                dian++;//遇到店，次数加1
                num*=2;//加一倍
            }
            else
            {
                hua++;//遇到花，次数加1
                num-=1;//喝一斗
            }
        }
        if (dian==5&amp;&amp;hua==9&amp;&amp;num==1) 
        {
            ++ans;//记录方法数
        }
    }
    printf(&quot;%d\n&quot;,ans);
}</code></pre><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>随想</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>优化第一步各种驱动问题</title>
    <url>/2020/03/26/37.%E4%BC%98%E5%8C%96%E7%AC%AC%E4%B8%80%E6%AD%A5%E5%90%84%E7%A7%8D%E9%A9%B1%E5%8A%A8%E9%97%AE%E9%A2%98/</url>
    <content><![CDATA[<p>上一篇文章我给大家讲述了如何更纯净更安全的<a href="https://www.8868866.xyz/2020/03/21/1.%E9%87%8D%E8%A3%85%E5%B9%B6%E6%BF%80%E6%B4%BB%E7%B3%BB%E7%BB%9F/">重装并激活系统</a>，那么接下来的系列文章将会教大家如何去优化你自己的电脑。首先我们从基本的驱动开始说起。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h3 id="首先说说什么是驱动？"><a href="#首先说说什么是驱动？" class="headerlink" title="首先说说什么是驱动？"></a>首先说说什么是驱动？</h3><p><strong>关于驱动你应该知道的：</strong></p>
<blockquote>
<p>定义：驱动程序即添加到操作系统中的一小块代码，其中包含有关硬件设备的信息。有了此信息，计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件，可以说没有驱动程序，计算机中的硬件就无法工作。<br> 顾名思义，驱动是驱使靶硬件工作的一种工具。简单举个栗子：假如没有神经细胞，就不会有大脑、脊髓。换来的结果就是人即便是有四肢，也无法主动运动。同样对电脑来说亦是如此，各式各样的驱动就如同一个个神经组织搭建着“用户外界输入–驱动–对应靶硬件–用户外界输入得到结果”的桥梁。</p>
</blockquote>
<h3 id="驱动异常的结果？"><a href="#驱动异常的结果？" class="headerlink" title="驱动异常的结果？"></a>驱动异常的结果？</h3><p><strong>驱动异常可能引起的问题：</strong></p>
<blockquote>
<p>1.黑屏（原因较多）<br>2.无声音（显然是声卡驱动问题）<br>3.外设失灵（USB输入设备驱动问题）<br>4.无法连接无线网(WiFi项消失)、无法连接宽带(红叉)。（显然，前者是无线网卡驱动问题、后者是网卡驱动问题）<br>等等等等</p>
</blockquote>
<h3 id="如何正确安装缺少、或异常的驱动？"><a href="#如何正确安装缺少、或异常的驱动？" class="headerlink" title="如何正确安装缺少、或异常的驱动？"></a>如何正确安装缺少、或异常的驱动？</h3><p><strong>驱动的安装渠道：</strong></p>
<blockquote>
<p>1.系统自带的”联网自动搜索驱动”功能：<br>①如果你是windows7用户:<br>第一步：<br><img src="https://i.loli.net/2020/03/26/jhM6fkR7y351gOu.png" alt="第一步"><br><img src="https://i.loli.net/2020/03/26/RGaOpC9EI2Lyvzq.png" alt="第二步"><br>第二步：设备列表中，找到你的主机。<br><img src="https://i.loli.net/2020/03/26/XcmWzNUlpYtujry.png" alt="第三步"><br>第三步：在你的主机上右键单击选择“设备安装设置”<br><img src="https://i.loli.net/2020/03/26/oeUTsdJ7Xu2n1IQ.png" alt="第四步"><br>第四步：按如下图所示步骤操作，最后保存好之后系统就会自动联网搜索安装你电脑所缺少且需要的驱动。<br><img src="https://i.loli.net/2020/03/26/1lQUytdTYDiX4Rx.png" alt="第五步"><br>②如果你是windows10用户：<br>其实win10和win7操作步骤是一样的，但是win10默认是系统安装好的那一刻就默认<strong>开始帮你安装</strong>合适你电脑硬件的驱动了，还是很省心的。<br>我只说一个问题，<strong>如何查看当前windows10的补丁、驱动等等等等的更新进度呢？</strong><br>第一步：打开开始菜单点击“设置”齿轮图标<br><img src="https://i.loli.net/2020/03/26/lFQsKfwtAdUBOZ2.png" alt="第一步"><br>第二步：点击“更新和安全”<br><img src="https://i.loli.net/2020/03/26/3wiJg1bHmNqynlS.png" alt="第二步"><br>第三步：你可以看到页面里系统下载更新的进度情况，以及日后主动获取系统更新的地方也就在这里了。<br><img src="https://i.loli.net/2020/03/26/1bNfEe27uxUaCOs.png" alt="第三步"><br>2.软件市场上的一些驱动软件，e.gs:驱动精灵、鲁大师、驱动人生、还有各大安全软件提供的驱动管家。但是我个人还是不建议用驱动软件去安装驱动。因为每个人驱动都是不同的，最好还是可以麻烦一点去对应的硬件官网下载，比如使用Intel的CPU，你就可以去Intel的技术支持官网下载对应的驱动。</p>
</blockquote>
<h3 id="我是游戏玩家，显卡驱动对我尤为重要！"><a href="#我是游戏玩家，显卡驱动对我尤为重要！" class="headerlink" title="我是游戏玩家，显卡驱动对我尤为重要！"></a>我是游戏玩家，显卡驱动对我尤为重要！</h3><p><strong>如果你有独立显卡，那么你一定需要看接下来的优化教程，它很有可能能够使你的游戏体验得到飞跃般提升！</strong></p>
<blockquote>
<p>如果你是笔记本用户，你首先需要各项设置：<br>1.电源选项改为“高性能”（如果没有显示“高性能”选项就自定义添加一个）<br>电源高性能模式开启方法：电源选项→界面左侧菜单栏找“创建电源计划”→选择“高性能”即可。<br><img src="https://imgsa.baidu.com/forum/w%3D580/sign=b00612ee63224f4a5799731b39f59044/d3eec9fcc3cec3fdfefec3bdd888d43f85942735.jpg" alt="1"><br><img src="https://imgsa.baidu.com/forum/w%3D580/sign=05aba3e7b0096b6381195e583c318733/7129ac6eddc451da8e266823b8fd5266d2163225.jpg" alt="2"><br><img src="https://imgsa.baidu.com/forum/w%3D580/sign=31196055c5ef76093c0b99971edfa301/d3fd4b90f603738d949a68eabd1bb051fa19ec26.jpg" alt="3"><br><strong>动手能力强的朋友可以开启“卓越性能模式”：以管理员身份运行Windows Powershell然后键入这段代码：<code>powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61</code>回车后即可在电源选项中看到卓越性能选项了</strong></p>
<div style="position: relative; width: 100%; height: 0; padding-bottom: 75%;"><iframe src="//player.bilibili.com/player.html?aid=243151368&page=" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></iframe></div>
<p>2.如果你的游戏本有一些类似控制中心的应用，打开它，并调整为“性能模式”(类似高性能的意思)<br><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/37/9.png" alt="4"><br><strong>台式机用户忽略上述两个步骤</strong><br>3.（如果是AMD的显卡请自行去官网下载。AMD yes！）NVIDIA显卡的用户可以在桌面鼠标右键看看有没有“Nvida控制面板”，有的话说明你的显卡驱动已经安装完毕（<strong>但并不确定是否需要更新哦</strong>），接下来：nvdia控制面板→管理3D设置→全局设置→首选图形处理器→高性能NVIDIA处理器→应用，回到NVIDIA控制面板再选择配置surround、physX→physx设置→GeForce gtx 1660ti（你的独立显卡名称，1660ti是例子）→应用<br><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/37/11.png" alt="1"><br><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/37/12.png" alt="2"><br>4.那么如果NVIDIA的显卡用户在桌面右键后发现没有NVIDIA的控制面板怎么办？<br>①去win10应用商店搜索NVIDIA control pannel 下载安装即可<br>②安装完，在桌面右键即可看到NVIDIA控制面板了</p>
</blockquote>
<h4 id="显卡驱动的下载-amp-安装"><a href="#显卡驱动的下载-amp-安装" class="headerlink" title="显卡驱动的下载&amp;安装"></a>显卡驱动的下载&amp;安装</h4><p><strong>听我的，官方下载显卡驱动</strong></p>
<blockquote>
<p><a href="https://www.geforce.cn/drivers" target="_blank" rel="noopener">nvidia显卡官方下载</a><br><a href="https://www.amd.com/zh-hans/support" target="_blank" rel="noopener">AMD显卡官方下载</a><br>还是以英伟达的显卡为例：<br>一张图说明一切：(amd显卡下载界面同理)<br><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/37/10.png" alt="1"><br>下载并安装好GeForce Experence后，微信扫码登录（可能会卡）。<br><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/37/13.png" alt="1"></p>
</blockquote>
<p>OK就能想到这些啦，如果有疏漏请留言板补充、提问，我会及时补充、回复。<br><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>Win趣</category>
      </categories>
  </entry>
  <entry>
    <title>科普经典</title>
    <url>/2020/03/23/%E6%82%A6%E8%AF%BB/%E7%A7%91%E6%99%AE%E7%BB%8F%E5%85%B8/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>30部必读的科普经典</p>
<pre><code>《几何原本》
《天体运行论》
《心血运动论》
《自然哲学之数学原理》
《自然史》
《物种起源》
《昆虫记》
《人类的故事》
《鸟与文学》
《所罗门王的指环》
《菌儿自传》
《趣味地球化学》
《寂静的春天》
《从一到无穷大》
《双螺旋》
《黑猩猩在召唤》
《物候学》
《细胞生命的礼赞》
《自私的基因》
《啊哈!灵机一动》
《阿西莫夫最新科学指南》
《古海荒漠》
《混沌：开创新科学》
《时间简史》
《皇帝新脑》
《西方科学的起源》
《魔鬼出没的世界&gt;
《万物简史》
《数字化生存》
《生命的未来》</code></pre><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>原文链接：<a href="https://blog.csdn.net/byxdaz/article/details/4222372" target="_blank" rel="noopener">https://blog.csdn.net/byxdaz/article/details/4222372</a></p>
]]></content>
      <tags>
        <tag>悦读</tag>
      </tags>
  </entry>
  <entry>
    <title>谋略经典</title>
    <url>/2020/03/23/%E6%82%A6%E8%AF%BB/%E8%B0%8B%E7%95%A5%E7%BB%8F%E5%85%B8/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>20部必读的谋略经典</p>
<pre><code>第1部 《道德经》
第2部 《鬼谷子》
第3部 《管子》
第4部 《论语》
第5部 《孙子兵法》
第6部 《荀子》
第7部 《韩非子》
第8部 《战国策》
第9部 《人物志》
第10部 《贞观政要》
第11部 《反经》
第12部 《资治通鉴》
第13部 《三国演义》
第14部 《菜根谭》
第15部 《智囊》
第16部 《三十六计》
第17部 《曾国藩家书》
第18部 《厚黑学》
第19部 《君主论》
第20部 《战争论》</code></pre><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>原文链接：<a href="https://blog.csdn.net/byxdaz/article/details/4222372" target="_blank" rel="noopener">https://blog.csdn.net/byxdaz/article/details/4222372</a></p>
]]></content>
      <tags>
        <tag>悦读</tag>
      </tags>
  </entry>
  <entry>
    <title>心理励志经典</title>
    <url>/2020/03/23/%E6%82%A6%E8%AF%BB/%E5%BF%83%E7%90%86%E5%8A%B1%E5%BF%97%E7%BB%8F%E5%85%B8/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>20部必读的心理励志经典</p>
<pre><code>第1部　《富兰克林》
第2部　《依靠自我》
第3部　《自己拯救自己》
第4部　《伟大的励志书》
第5部　《致加西亚的信》
第6部　《巴比伦富翁的秘密》
第7部　《思考致富》
第8部　《一生的计划》
第9部　《积极思考的力量》
第10部　《人人都能成功》
第11部　《世界上最伟大的推销员》
第12部　《与你在颠峰相会》
第13部　《人性的弱点》
第14部　《唤醒心中的巨人》
第15部　《攻心为上》
第16部　《谁动了我的奶酪》
第17部　《高效人生的12个关键点》
第18部　《平地而起》
第19部　《高效能人士的七个习惯》
第20部　《邮差弗雷德》</code></pre><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>原文链接：<a href="https://blog.csdn.net/byxdaz/article/details/4222372" target="_blank" rel="noopener">https://blog.csdn.net/byxdaz/article/details/4222372</a></p>
]]></content>
      <tags>
        <tag>悦读</tag>
      </tags>
  </entry>
  <entry>
    <title>名人传记经典</title>
    <url>/2020/03/23/%E6%82%A6%E8%AF%BB/%E5%90%8D%E4%BA%BA%E4%BC%A0%E8%AE%B0%E7%BB%8F%E5%85%B8/</url>
    <content><![CDATA[<p>个人很中意：鲁迅</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>30部必读的名人传记经典</p>
<pre><code>第1部 《忏悔录》
第2部 《贝多芬传》
第3部 《梵高传——对生活的渴求》
第4部 《巴尔扎克传》
第5部 《我生活的故事》
第6部 《约翰逊传》
第7部 《萨特传》
第8部 《我的爱，我的自由》
第9部 《居里夫人传》
第10部 《罗素自传》
第11部 《罗曼·罗兰传》
第12部 《我妹妹与我》
第13部 《甘地自传》
第14部 《真爱让我如此幸福》
第15部 《卡夫卡传》
第16部 《牛犊顶橡树》
第17部 《从文自传》
第18部 《拿破仑传》
第19部 《富兰克林自传》
第20部 《萨尔瓦多·达利的秘密生活》
第21部 《荣格的生活与工作》
第22部 《阿加莎·克里斯蒂自传》
第23部 《苏东坡传》
第24部 《杰克·韦尔奇自传》
第25部 《巴赫传》
第26部 《华盛顿全传》
第27部 《我毕生的故事》
第28部 《房龙传》
第29部 《无尽的探索》
第30部 《卓别林自传》</code></pre><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>原文链接：<a href="https://blog.csdn.net/byxdaz/article/details/4222372" target="_blank" rel="noopener">https://blog.csdn.net/byxdaz/article/details/4222372</a></p>
]]></content>
      <tags>
        <tag>悦读</tag>
      </tags>
  </entry>
  <entry>
    <title>修身处世经典</title>
    <url>/2020/03/23/%E6%82%A6%E8%AF%BB/%E4%BF%AE%E8%BA%AB%E5%A4%84%E4%B8%96%E7%BB%8F%E5%85%B8/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>20部必读的修身处世经典</p>
<pre><code>
第1部 《道德经》 老子 (中国·先秦生卒年不详)
第2部 《圣经》 基督教经典
第3部 《论语》 孔子 (中国·春秋公元前55l-前479)
第4部 《孟子》 孟子 (中国·战国约公元前372-前289)
第5部 《沉思录》 马可·奥勒留·安东尼(古罗马121-180)
第6部 《荀子》 荀子 (中国·战国约公元前330-前230)
第7部 《庄子》 庄子 (中国·战国约公元前369-前286)
第8部 《道德箴言录》 拉罗什福科(法国1613-1680)
第9部 《颜氏家训》 颜之推 (中国·南北朝531-591)
第10部 《人生论》 弗兰西斯·培根(英国1561-1626)
第11部 《家范》司马光 (中国 ·北宋1019-1086)
第12部 《智慧书》 巴尔塔沙·葛拉西安(西班牙1601-1658)
第13部 《世范》 袁采 (中国·南宋？-1195)
第14部 《富兰克林自传》 本杰明唁兰克林(美国1706-1790)
第15部 《小窗幽记》 陈继儒 (中国·明代1558-1639)
第16部 《蒙田随笔》 蒙田 (法国1533-1592)
第17部 《菜根谭》 洪应明 (中国·明代生卒年不详)
第18部 《曾国藩家书》 曾国藩 (中国清代1811-1872)
第19部 《人性的弱点》 戴尔·卡耐基(美国1888-1955)
第20部 《傅雷家书》傅雷 (中国1908-1966)</code></pre><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>原文链接：<a href="https://blog.csdn.net/byxdaz/article/details/4222372" target="_blank" rel="noopener">https://blog.csdn.net/byxdaz/article/details/4222372</a></p>
]]></content>
      <tags>
        <tag>悦读</tag>
      </tags>
  </entry>
  <entry>
    <title>管理学经典</title>
    <url>/2020/03/23/%E6%82%A6%E8%AF%BB/%E7%AE%A1%E7%90%86%E5%AD%A6%E7%BB%8F%E5%85%B8/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>30部必读的管理学经典</p>
<pre><code>第1部 《科学管理原理》 弗雷德里克·温斯洛·泰罗(美国1856—1915)
第2部 《社会组织和经济组织理论》 马克思·韦伯(德国1864—1920)
第3部 《经理人员的职能》 切斯特·巴纳德(美国1886—1961)
第4部 《工业管理和一般管理》 亨利·法约尔(法国1841-1925)
第5部 《工业文明的社会问题》 埃尔顿·梅奥(美国1880—1949)
第6部 《企业中人的方面》 道格拉斯·麦格雷戈(美国1906—1964)
第7部 《个性与组织》 克里斯·阿吉里斯(美国1923—)
第8部 《如何选样领导模式》 罗伯特·坦南鲍姆(美国1915—2003)
第9部 《管理决策新科学》 赫伯特·西蒙(美国1916—2001)
第10部 《伟大的组织者》 欧内斯特·戴尔(美国1914—)
第11部 《管理的新模式》 伦西斯·利克特(美国1903—1981)
第12部 《营销管理》 菲利普·科特勒(美国1931—)
第13部 《让工作适合管理者》 弗雷德·菲德勒(美国1922—)
第14部 《组织效能评价标准》 斯坦利·E·西肖尔(美国1915—1999)
第15部 《再论如何激励员工》 弗雷德里克·赫茨伯格(美国1923—2000)
第16部 《组织与管理：系统方法与权变方法》 弗里蒙特·卡斯特(美国1924—)
第17部 《经理工作的性质》 亨利·明茨伯格(加拿大1939—)
第18部 《管理：任务、责任、实践》 彼得·杜拉克(美国1909—)
第19部 《再论管理理论的丛林》 哈罗德·孔茨(美国1908—1984)
第20部 《杰克·韦尔奇自传》 杰克·韦尔奇(美国1935—)
第21部 《竞争战略》 迈克尔·波特(美国1947—)
第22部 《Z理论》 威廉·大内(美国1943—)
第23部 《转危为安》 爱德华兹·戴明(美国1900—1993)
第24部 《总经理》 约翰·科特(美国1947—)
第25部 《追求卓越》 托马斯·彼得斯(美国1942—)
第26部 《领导者：成功谋略》 沃伦·本尼斯(美国1925—)
第27部 《巨人学舞》 罗莎贝丝·摩丝·坎特(美国1943—)
第28部 《第五项修炼》 彼得·圣吉(美国1947—)
第29部 《企业再造》 迈克尔·汉默(美国1948—)
第30部 《基业长青》 詹姆斯·柯林斯(美国1958—)</code></pre><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>原文链接：<a href="https://blog.csdn.net/byxdaz/article/details/4222372" target="_blank" rel="noopener">https://blog.csdn.net/byxdaz/article/details/4222372</a></p>
]]></content>
      <tags>
        <tag>悦读</tag>
      </tags>
  </entry>
  <entry>
    <title>投资学经典</title>
    <url>/2020/03/23/%E6%82%A6%E8%AF%BB/%E6%8A%95%E8%B5%84%E5%AD%A6%E7%BB%8F%E5%85%B8/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>30部必读的投资学经典</p>
<pre><code>第1部 《聪明的投资者》 本杰明·格雷厄姆(美国1894—1976)
第2部 《金融炼金术》 乔治·索罗斯(美国1930—)
第3部 《漫步华尔街》 伯顿·马尔基尔(美国1933—)
第4部 《克罗淡投资策略》 斯坦利·克罗(美国1928—)
第5部 《艾略特波浪理论》 小罗伯特·R·普莱切特(美国1949—)
第6部 《怎样选择成长股》 菲利普·A·费雪(美国1908—2004)
第7部 《投资学精要》 兹维·博迪(美国1943—)
第8部 《金融学》 罗伯特·C·莫顿(美国1944—)
第9部 《投资艺术》 查尔斯·艾里斯(美国1941—)
第10部 《华尔街45年》 威廉·戴尔伯特·江恩(美国1878—1955)
第11部 《股市趋势技术分析》 约翰·迈占(美国1912—1987)
第12部 《笑傲股市》 威廉·欧奈尔(美国1933—)
第13部 《期货市场技术分析》 约翰·墨菲(美国1934—)
第14部 《资本市场的混沌与秩序》 埃德加·E·彼得斯(美国1952—)
第15部 《华尔街股市投资经典》 詹姆斯·P·奥肖内西(美国1931—)
第16部 《战胜华尔街》 彼得·林奇(美国1944—)
第17部 《专业投机原理》 维克多·斯波朗迪(美国1952—)
第18部 《巴菲特：从100元到160亿》 沃伦·巴菲特(美国1930—)
第19部 《交易冠军》 马丁·舒华兹(美国1945—)
第20部 《股票作手回忆录》 爱德温·李费佛(美国1877—1940)
第21部 《罗杰斯环球投资旅行》 吉姆·罗杰斯(美国1942—)
第22部 《世纪炒股赢家》 罗伊·纽伯格(美国1903—1999)
第23部 《一个投机者的告白》 安德烈·科斯托兰尼(德国1906—1999)
第24部 《逆向思考的艺术》 汉弗菜·B·尼尔(美国1904—1978)
第25部 《通向金融王国的自由之路》 范·K·撒普(美国1945—)
第26部 《泥鸽靶》 弗兰克·帕特诺伊(美国1967—)
第27部 《贼巢》 詹姆斯·B·斯图尔特(美国1951—)
第28部 《非理性繁荣》 罗伯特·希勒(美国1946—)
第29部 《伟大的博弈》 约翰·斯蒂尔·戈登(美国1944—)
第30部 《散户至上》 阿瑟·莱维特(美国1931—)</code></pre><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>原文链接：<a href="https://blog.csdn.net/byxdaz/article/details/4222372" target="_blank" rel="noopener">https://blog.csdn.net/byxdaz/article/details/4222372</a></p>
]]></content>
      <tags>
        <tag>悦读</tag>
      </tags>
  </entry>
  <entry>
    <title>经济学经典</title>
    <url>/2020/03/23/%E6%82%A6%E8%AF%BB/%E7%BB%8F%E6%B5%8E%E5%AD%A6%E7%BB%8F%E5%85%B8/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>30部必读的经济学经典</p>
<pre><code>第1部 《经济表》 弗朗斯瓦·魁奈(法国1694—1774)
第2部 《国富论》 亚当·斯密(英国1723—1790)
第3部 《人口原理》 托马斯·罗伯特·马尔萨斯(英国1766—1834)
第4部 《政治经济学概论》 让·巴蒂斯特·萨伊(法国1767—1832)
第5部 《政治经济学及赋税原理》 大卫·李嘉图(英国1772—1823)
第6部 《政治经济学新原理》 西蒙·德·西斯蒙第(法国1773—1842)
第7部 《政治经济学的国民体系》 弗里德利希·李斯特(德国1789—1846)
第8部 《政治经济学原理》 约翰·斯图亚特·穆勒(英国1806—1873)
第9部 《资本论》 卡尔·马克思(德国1818—1883)
第10部 《政治经济学理论》 威廉·斯坦利·杰文斯(英国1835—1882)
第11部 《国民经济学原理》 卡尔·门格尔(奥地利1840—1921)
第12部 《纯粹政治经济学纲要》 里昂·瓦尔拉斯(法国1834—1910)
第13部 《资本与利息》 欧根·冯·庞巴维克(奥地利185l一1914)
第14部 《经济学原理》 阿弗里德·马歇尔(英国1842—1924)
第15部 《利息与价格》 克努特·维克塞尔(瑞典1851—1926)
第16部 《财富的分配》 约翰·贝茨·克拉克(美国1847—1938)
第17部 《有闲阶级论》 托尔斯坦·本德·凡勃伦(美国1857—1929)
第18部 《经济发展理论》 约瑟夫·阿罗斯·熊彼特(奥地利1883—1950)
第19部 《福利经济学》 阿瑟·赛西尔·庇古(英国1877—1959)
第20部 《不完全竞争经济学》 琼·罗宾逊(英国1903—1983)
第21部 《就业、利息和货币通论》 约翰·梅纳德·凯恩斯(英国1883—1946)
第22部 《价值与资本》 约翰·理查德·希克斯(英国1904—1989)
第23部 《通往奴役之路》 哈耶克(奥地利1899—1992)
第24部 《经济学》 保罗·萨缪尔森(美国1915一)
第25部 《丰裕社会》 约翰·肯尼斯·加尔布雷斯(美国1908—)
第26部 《经济成长的阶段》 沃尔特·罗斯托(美国1916—)
第27部 《人力资本投资》 西奥多·威廉·舒尔茨(美国1902—1998)
第28部 《资本上义与自由》 米尔顿·弗里德曼(美国1912—)
第29部 《经济学》 约瑟夫·斯蒂格利茨(美国1943—)
第30部 《经济学原理》 格里高利·曼昆(美国1958—)</code></pre><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>原文链接：<a href="https://blog.csdn.net/byxdaz/article/details/4222372" target="_blank" rel="noopener">https://blog.csdn.net/byxdaz/article/details/4222372</a></p>
]]></content>
      <tags>
        <tag>悦读</tag>
      </tags>
  </entry>
  <entry>
    <title>编程类</title>
    <url>/2020/03/23/%E6%82%A6%E8%AF%BB/%E7%BC%96%E7%A8%8B%E7%B1%BB/</url>
    <content><![CDATA[<p>经典的书都有一个特点： 详尽得当，通俗又不失理论化，信息量非常大。</p>
<p> <strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<pre><code>  计算机专业推荐书籍：





  一、 思想类读物：

  1. 《通灵芯片:计算机运作的简单原理》(美国) 丹尼尔·希利斯著， 以通俗易懂的方式阐述计算机的构造与原理；

  2. 《逻辑的引擎》作者：（美）马丁·戴维斯著， 从十七世纪的莱布尼茨之梦起始，讲述计算机背后的逻辑原理及其主人公的故事，非常精彩！

  3. 《编程珠玑》作者：（美）本特利（Bentley，J.）著， 看似简单的东西，也能挖掘出珍珠般的光彩。

  4. 《Unix 编程艺术》 作者： Eric S. Raymond 。 阐述软件设计的原则与方法， 很有参考价值， 不过要读懂的话可能需要一定的功力。


  二、 基础课程类读物：

  0.  《计算机科学概论》(Computer Science An Overview 9th)（美）J.Glenn Brookshear 著， 关于计算机导引的上佳英文入门读物。

  1.  《The C Programming Language》（第2版） 作者： （美）Brian W.Kernighan, Dennis M.Ritchie 著， C编程必读，简洁扼要；我就是通过这本书开始消除对“字符串”处理的恐惧感的。

  2.  《操作系统：精髓与设计原理》(第五版)  作者：（美）William Stallings 著， 操作系统的推荐教程，阐述详尽得当。 

  3.  《数据结构基础》（C语言版） 作者： 霍罗维兹 (Ellis Horowitz) ， 萨尼 (Sartaj Sahni) , 安德尔森-费里德 (Susan Anderson-Freed)  ，数据结构的推荐读物，建议读英文版。

  4.  《算法分析与设计基础》作者  ：(美)莱维丁，算法入门的推荐读物，讲解清晰而不失深度。当需要轻松阅读理解其思想时读这本，当需要深入理解算法分析时，建议阅读《算法导论》，最好两本都有，相得益彰。   

  5.  《数据库系统概念》(第5版) ， 作者： Abraham Silberschatz, Henry F.Korth, S.Sudarshan 著， 杨冬青，马秀莉， 唐世渭译。全面深入，详尽得当，通俗与理论并重，是为经典。

  6.  《程序设计实践》（第2版） 作者： Brian W. Kernighan Rob Pike 著， 裘宗燕译。 或者读英文版（The practice of programming）更好。 教会初学者进行程序设计而不是简单编码的上佳读物，绝对推荐！

  7。 《TCP/IP 详解》（协议） ：  不必多说。 看完倾理论性的《计算机网络》教材， 有必要阅读此书来加强加深理解，真正打好网络编程基础。





  三、 技术类书籍

  1. 《深入理解计算机系统》作者：（美）布赖恩特 （Bryant,R.E.） 等著， 以程序员的角度和全局的视角来审视计算机系统，涵盖从数据表示到程序运行、系统交互的各个方面，非常值得深读！   

 2. 《Writing solid code》作者： （美） Steve Maguire 著，想要写出bug-free程序的上佳读物之一。相应读物的还有《高质量程序设计艺术》(code quality: from a open source perspective) ， 《代码整洁之道》(Writing clean code)

 3. 《Thinking in Java》 作者：（美）Bruce Eckel 著，Java 语言编程的推荐教材。 《Effective Java》(Joshua Bloch著) 作为进阶书籍。

 4. 《设计模式——可复用面向对象软件的基础》作者：（美）“四人帮”，设计模式的必读书籍（亦可用于参考）。

 5. 《实现模式》 作者： Kent Beck ， 非常有益的面向对象编程经验谈。

 6. 《重构： 改善既有代码的设计》 作者：作者: Martin Fowler ， 作为面向对象编程的收藏书籍，随时可参阅。

 7. 《Test Driven Development: By Example》 作者： Kent Beck ;  测试驱动开发的优秀入门书籍

 8. 《MYSQL必知必会》 作者：(英)Ben Forta. 人民邮电出版社。薄薄的一百页左右， 快速上手和使用 mysql 数据库。

 9. 《正则表达式必知必会》 作者：(英)Ben Forta. 译者: 杨涛 / 王建桥 / 杨晓.  人民邮电出版社。 薄薄的一百页左右， 清晰的阐述， 适合正则表达式的快速了解和上手。

 10. 《Java TCP/IP socket 编程》 作者: (美)Kenneth L.Calvert, M.J. Donaboo著， 周恒民译。 非常好的 Java tcp/ip socket 入门读物， 详细地讲解了相关的知识点，有相应的实例为佐， 并且对底层、性能等方面也作了一定的阐述。

 11.《Ubuntu Linux 指南：基础篇》 作者:  Mark G.Sobell.  Linux 系统入门读物。

 12.《Perl 语言入门》(第五版)  作者： Randal L.schwartz 等著， 盛春等译。 Perl 入门的推荐教程。通俗易懂、详尽得当。

 13.《Java 编程风格》 作者： Alan Vermeulan 等著。 曹铁鸥译。 关于Java 编程的推荐风格。

 14.《精通正则表达式》 作者： Jeffrey E.F.Friedl 。 关于正则表达式的深入学习读物。  

 15.《Java Concurrency in Practice》作者： Brian Goetz 等。  Java 并发编程读物。

 16.《单元测试之道Java版：使用JUnit 》 作者： Andrew Hunt,David Thomas.  单元测试的入门读物。



 四、 软件开发的可选读物：

 1. 《软件工艺》作者：Pete McBreen.  从工艺角度论述软件开发，强调个人开发能力的修炼。最好读英文版， 顺便学学英语。

 2. 《人月神话》作者： Frederick P. Brooks, Jr . 作为软件工程领域的经典作品， 无需多说。

 3. 《黑客与画家》 作者： Paul Graham.  互联网已经发生了巨大的变化， 但书中观点依然很有启发性， 建议读一读。

 4. 《Coders at work --- Reflections on the Craft of Programming》作者： Peter Seibel .   顶级大师的访谈录， 听听他们的声音和工作经历，肯定会受益匪浅。

 5.  《设计原本》作者： Frederick P. Brooks, Jr.  著，  InfoQ中文站 / 王海鹏 / 高博 （译）， 关于软件设计、管理方面的优秀读物。

 6.  《程序员修炼之道：从小工到专家》作者： Andrew Hunt / David Thomas 。 关于软件开发方法的实践经验谈。

 7.  《时间管理：给系统管理员》作者： Thomas A.Limoncelli 。 关于时间管理方面的有益参考，短小而精，适用于所有的软件开发人员。


 五、其它

 1.   《云计算解码：技术架构和产业运营》 作者：  雷葆华，饶少阳等。 关于云计算方面的入门读物。

 2.   《简约至上： 交互式设计四策略》：  理论、方法、细节兼具， 值得一读。</code></pre><p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <tags>
        <tag>悦读</tag>
      </tags>
  </entry>
  <entry>
    <title>ACM大数定理题</title>
    <url>/2020/03/23/36.ACM%E5%A4%A7%E6%95%B0%E5%AE%9A%E7%90%86%E9%A2%98/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>Problem Description:</p>
<p>I have a very simple problem for you. Given two integers A and B, your job is to calculate the sum of A + B. </p>
<p>Input:</p>
<p>The first line of the input contains an integer T(1&lt;=T&lt;=20) which means the number of test cases.<br>Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers<br>are very large, that means you should not process them by using 32-bit integer. You may assume<br>the length of each integer will not exceed 1000. </p>
<p>Output:</p>
<p>For each test case, you should output two lines. The first line is “Case #:”, # means the number of<br>the test case. The second line is the an equation “A + B = Sum”, Sum means the result of A + B.<br>Note there are some spaces int the equation. Output a blank line between two test cases. </p>
<p>Sample Input:</p>
<p>2<br>1 2<br>112233445566778899 998877665544332211 </p>
<p>Sample Output:</p>
<p>Case 1: </p>
<p>1 + 2 = 3 </p>
<p>Case 2: </p>
<p>112233445566778899 + 998877665544332211 = 1111111111111111110 </p>
<p>两种答法：<br>①:</p>
<pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string">&lt;iostream></span></span>
<span class="token macro property">#<span class="token directive keyword">include</span><span class="token string">&lt;stack></span></span>
<span class="token macro property">#<span class="token directive keyword">include</span><span class="token string">&lt;strstream></span></span>
<span class="token macro property">#<span class="token directive keyword">include</span><span class="token string">&lt;string></span></span>
usingnamespace std<span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">int</span> num<span class="token punctuation">;</span>
cin<span class="token operator">>></span>num<span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">&lt;</span>num<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">int</span> a<span class="token punctuation">,</span>psize<span class="token punctuation">,</span>qsize<span class="token punctuation">,</span>n<span class="token punctuation">,</span>m<span class="token punctuation">;</span>
stack<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">></span>zp<span class="token punctuation">;</span>
stack<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">></span>zq<span class="token punctuation">;</span>
stack<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">></span>z<span class="token punctuation">;</span>
string p<span class="token punctuation">,</span>q<span class="token punctuation">;</span>
cin<span class="token operator">>></span>p<span class="token operator">>></span>q<span class="token punctuation">;</span>
<span class="token keyword">char</span><span class="token operator">*</span>w<span class="token operator">=</span><span class="token operator">&amp;</span>p<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">char</span><span class="token operator">*</span>e<span class="token operator">=</span><span class="token operator">&amp;</span>q<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
psize<span class="token operator">=</span><span class="token function">strlen</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">;</span>
qsize<span class="token operator">=</span><span class="token function">strlen</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>k<span class="token operator">&lt;</span>psize<span class="token punctuation">;</span>k<span class="token operator">++</span><span class="token punctuation">)</span>
zp<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">(</span>p<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">48</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>k<span class="token operator">&lt;</span>qsize<span class="token punctuation">;</span>k<span class="token operator">++</span><span class="token punctuation">)</span>
zq<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">(</span>q<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">48</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span>n<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span><span class="token operator">!</span>zp<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">&amp;&amp;</span><span class="token operator">!</span>zq<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>zp<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>zq<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
m<span class="token operator">=</span>zp<span class="token punctuation">.</span><span class="token function">top</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span>zq<span class="token punctuation">.</span><span class="token function">top</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span>n<span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>m<span class="token operator">>=</span><span class="token number">10</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
z<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>m<span class="token number">-10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
n<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">else</span>
<span class="token punctuation">{</span>
z<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span>
n<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>zp<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">&amp;&amp;</span>zq<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">&amp;&amp;</span>n<span class="token operator">==</span><span class="token number">1</span><span class="token punctuation">)</span>
z<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">else</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>zp<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token punctuation">;</span><span class="token operator">!</span>zp<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>zp<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
m<span class="token operator">=</span>zp<span class="token punctuation">.</span><span class="token function">top</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span>n<span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>m<span class="token operator">>=</span><span class="token number">10</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
z<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>m<span class="token number">-10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
n<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">else</span>
<span class="token punctuation">{</span>
z<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span>
n<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>zq<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token punctuation">;</span><span class="token operator">!</span>zq<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>zq<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
m<span class="token operator">=</span>n<span class="token operator">+</span>zq<span class="token punctuation">.</span><span class="token function">top</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>m<span class="token operator">>=</span><span class="token number">10</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
z<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>m<span class="token number">-10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
n<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">else</span>
<span class="token punctuation">{</span>
z<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span>
n<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
cout<span class="token operator">&lt;&lt;</span><span class="token string">"Case "</span><span class="token operator">&lt;&lt;</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token operator">&lt;&lt;</span><span class="token string">":"</span> <span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>
cout<span class="token operator">&lt;&lt;</span>p<span class="token operator">&lt;&lt;</span><span class="token string">" + "</span><span class="token operator">&lt;&lt;</span>q<span class="token operator">&lt;&lt;</span><span class="token string">" = "</span> <span class="token punctuation">;</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token punctuation">;</span><span class="token operator">!</span>z<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>z<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
cout<span class="token operator">&lt;&lt;</span>z<span class="token punctuation">.</span><span class="token function">top</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
cout<span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>i<span class="token operator">!=</span>num<span class="token number">-1</span><span class="token punctuation">)</span>
cout<span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>②：</p>
<pre class=" language-java"><code class="language-java"><span class="token keyword">import</span> java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>*<span class="token punctuation">;</span>
<span class="token keyword">import</span> java<span class="token punctuation">.</span>math<span class="token punctuation">.</span>*<span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Main</span> 
<span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span>
     <span class="token punctuation">{</span>
        Scanner sc<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">Scanner</span> <span class="token punctuation">(</span>System<span class="token punctuation">.</span>in<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">int</span> t<span class="token operator">=</span>sc<span class="token punctuation">.</span><span class="token function">nextInt</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator">&lt;=</span>t<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">if</span><span class="token punctuation">(</span>i<span class="token operator">!=</span><span class="token number">1</span><span class="token punctuation">)</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            BigInteger a<span class="token punctuation">,</span>b<span class="token punctuation">;</span>
            a<span class="token operator">=</span>sc<span class="token punctuation">.</span><span class="token function">nextBigInteger</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            b<span class="token operator">=</span>sc<span class="token punctuation">.</span><span class="token function">nextBigInteger</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Case "</span><span class="token operator">+</span>i<span class="token operator">+</span><span class="token string">":"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>a<span class="token operator">+</span><span class="token string">" + "</span><span class="token operator">+</span>b<span class="token operator">+</span><span class="token string">" = "</span><span class="token operator">+</span>a<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>随想</category>
      </categories>
  </entry>
  <entry>
    <title>PHP编写解决主页被劫持的dos脚本</title>
    <url>/2020/03/23/35.%E8%A7%A3%E5%86%B3%E4%B8%BB%E9%A1%B5%E8%A2%AB%E5%8A%AB%E6%8C%81%E7%9A%84dos%E8%84%9A%E6%9C%AC/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p><strong>1、编写语言：PHP<br>2、使用范围：浏览器主页被其他主页劫持<br>3、使用方法：复制代码→新建文档、保存→右键重命名→更改后缀名为bat→右键以管理员身份运行</strong></p>
<pre class=" language-php"><code class="language-php"><span class="token keyword">echo</span> off


<span class="token punctuation">:</span>begin
cls
<span class="token keyword">Echo</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
<span class="token keyword">Echo</span> I   <span class="token number">1</span> 判断病毒文件和注册表      I
<span class="token keyword">Echo</span> I   <span class="token number">2</span> ie首页相关                I
<span class="token keyword">Echo</span> I   <span class="token number">3</span> 修复ie首页                I
<span class="token keyword">Echo</span> I   <span class="token number">4</span> 打开浏览器配置目录        I
<span class="token keyword">Echo</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
Set <span class="token operator">/</span>P <span class="token keyword">var</span><span class="token operator">=</span>
<span class="token keyword">If</span> not <span class="token string">"%var%"</span><span class="token operator">==</span><span class="token string">""</span> <span class="token punctuation">(</span>
  <span class="token keyword">If</span> <span class="token string">"%var%"</span><span class="token operator">==</span><span class="token string">"1"</span>  <span class="token keyword">goto</span> 判断
  <span class="token keyword">If</span> <span class="token string">"%var%"</span><span class="token operator">==</span><span class="token string">"2"</span>  <span class="token keyword">goto</span> ie首页
  <span class="token keyword">If</span> <span class="token string">"%var%"</span><span class="token operator">==</span><span class="token string">"3"</span>  <span class="token keyword">goto</span> 修复ie首页
  <span class="token keyword">If</span> <span class="token string">"%var%"</span><span class="token operator">==</span><span class="token string">"4"</span>  <span class="token keyword">goto</span> 打开浏览器配置目录
<span class="token punctuation">)</span>

<span class="token keyword">goto</span> <span class="token punctuation">:</span>begin

<span class="token punctuation">:</span>判断
<span class="token keyword">echo</span> 判断病毒文件和注册表等
<span class="token keyword">if</span> exist <span class="token string">"%ProgramFiles%\Common Files\System\safemonn64.dll"</span> <span class="token keyword">echo</span> safemonn64<span class="token punctuation">.</span>dll safemonn64<span class="token punctuation">.</span>dll  存在
<span class="token keyword">if</span> exist <span class="token operator">%</span>windir<span class="token operator">%</span>\<span class="token package">AppPatch<span class="token punctuation">\</span>MexLayout</span><span class="token punctuation">.</span>dll <span class="token keyword">echo</span> MexLayout<span class="token punctuation">.</span>dll  存在

<span class="token keyword">if</span> exist <span class="token operator">%</span>windir<span class="token operator">%</span>\<span class="token package">system32<span class="token punctuation">\</span>usb4399</span><span class="token punctuation">.</span>sys <span class="token keyword">echo</span> usb4399<span class="token punctuation">.</span>sys  存在
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usb4399"</span>
<span class="token keyword">if</span> exist <span class="token operator">%</span>windir<span class="token operator">%</span>\<span class="token package">system32<span class="token punctuation">\</span>DRIVERS<span class="token punctuation">\</span>usb4399</span><span class="token punctuation">.</span>sys <span class="token keyword">echo</span> usb4399<span class="token punctuation">.</span>sys  存在
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usb4399"</span>

<span class="token keyword">if</span> exist <span class="token operator">%</span>windir<span class="token operator">%</span>\<span class="token package">system32<span class="token punctuation">\</span>fhdisbfasu</span><span class="token punctuation">.</span>sys <span class="token keyword">echo</span> fhdisbfasu<span class="token punctuation">.</span>sys  存在
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fhdisbfasu"</span>
<span class="token keyword">if</span> exist <span class="token operator">%</span>windir<span class="token operator">%</span>\<span class="token package">system32<span class="token punctuation">\</span>FDSOIvdaosifid</span><span class="token punctuation">.</span>sys <span class="token keyword">echo</span> FDSOIvdaosifid<span class="token punctuation">.</span>sys  存在
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FDSOIvdaosifid"</span>
<span class="token keyword">if</span> exist <span class="token operator">%</span>windir<span class="token operator">%</span>\<span class="token package">system32<span class="token punctuation">\</span>DRIVERS<span class="token punctuation">\</span>PGFltMgr</span><span class="token punctuation">.</span>sys <span class="token keyword">echo</span> PGFltMgr<span class="token punctuation">.</span>sys  存在
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PGFltMgr"</span>
<span class="token keyword">if</span> exist <span class="token operator">%</span>windir<span class="token operator">%</span>\<span class="token package">system32<span class="token punctuation">\</span>DRIVERS<span class="token punctuation">\</span>mssafel</span><span class="token punctuation">.</span>sys <span class="token keyword">echo</span> mssafel<span class="token punctuation">.</span>sys  存在
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mssafel"</span>

<span class="token keyword">if</span> exist <span class="token operator">%</span>windir<span class="token operator">%</span>\<span class="token package">System32<span class="token punctuation">\</span>GroupPolicy<span class="token punctuation">\</span>Machine<span class="token punctuation">\</span>Registry</span><span class="token punctuation">.</span>pol <span class="token keyword">echo</span> Registry<span class="token punctuation">.</span>pol  存在
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome"</span> <span class="token operator">/</span>v DefaultSearchProviderSearchURL


dir  <span class="token operator">%</span>windir<span class="token operator">%</span>\<span class="token package">system32<span class="token punctuation">\</span>DRIVERS<span class="token punctuation">\</span>usb</span><span class="token operator">*</span><span class="token punctuation">.</span>sys

dir  <span class="token operator">%</span>windir<span class="token operator">%</span>\<span class="token package">system32<span class="token punctuation">\</span>DRIVERS<span class="token punctuation">\</span>hp</span><span class="token operator">*</span><span class="token punctuation">.</span>sys


<span class="token keyword">if</span> exist <span class="token operator">%</span>appdata<span class="token operator">%</span>\<span class="token package">pcmaster</span> <span class="token keyword">echo</span> 软媒魔方  存在
reg query <span class="token constant">HKEY_CURRENT_USER</span>\<span class="token package">Software<span class="token punctuation">\</span>RuanMei</span>
<span class="token keyword">echo</span> <span class="token constant">UC</span>浏览器推广id
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Wow6432Node\UCBrowserPID"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\UCBrowserPID"</span>
<span class="token keyword">echo</span> <span class="token constant">UC</span>浏览器配置文件
<span class="token keyword">if</span> exist <span class="token string">"C:\Program Files (x86)\UCBrowser\Application\Share\Custom.dat"</span> <span class="token keyword">echo</span> Custom<span class="token punctuation">.</span>dat  存在
<span class="token keyword">if</span> exist <span class="token string">"C:\Program Files (x86)\UCBrowser\Application\Share\Config.dat"</span> <span class="token keyword">echo</span> Config<span class="token punctuation">.</span>dat  存在
<span class="token keyword">goto</span> exit

<span class="token punctuation">:</span>ie首页
<span class="token keyword">echo</span> ie首页其他
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Start Page"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Search Bar"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Search Page"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Default_Page_URL"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Default_Search_URL"</span>

reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Start Page"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Search Bar"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Search Page"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Default_Page_URL"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Default_Search_URL"</span>

reg query <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span> <span class="token operator">/</span>v <span class="token string">"Start Page"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span> <span class="token operator">/</span>v <span class="token string">"Search Bar"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span> <span class="token operator">/</span>v <span class="token string">"Search Page"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span> <span class="token operator">/</span>v <span class="token string">"Default_Page_URL"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span> <span class="token operator">/</span>v <span class="token string">"Default_Search_URL"</span>

reg query <span class="token string">"HKEY_CLASSES_ROOT\CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}\shell\OpenHomePage\Command"</span>

<span class="token keyword">echo</span> Windows10 禁止修改首页<span class="token punctuation">(</span>如果内包含内容<span class="token punctuation">)</span>
reg query <span class="token string">"HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Internet Explorer\Main\SecondaryStartPages"</span>
<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token punctuation">[</span><span class="token constant">HKEY_CLASSES_ROOT</span>\<span class="token package">Local</span> Settings\<span class="token package">Software<span class="token punctuation">\</span>Microsoft<span class="token punctuation">\</span>Windows<span class="token punctuation">\</span>CurrentVersion<span class="token punctuation">\</span>AppContainer<span class="token punctuation">\</span>Storage<span class="token punctuation">\</span>microsoft</span><span class="token punctuation">.</span>microsoftedge_8wekyb3d8bbwe\<span class="token package">Children<span class="token punctuation">\</span>001<span class="token punctuation">\</span>Internet</span> Explorer<span class="token punctuation">]</span>

<span class="token keyword">echo</span> 禁用更改主页设置 正常值“HomePage”的<span class="token constant">DWORD</span>值，值为“<span class="token number">00000000</span>”
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel"</span> <span class="token operator">/</span>v <span class="token string">"HomePage"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Control Panel"</span> <span class="token operator">/</span>v <span class="token string">"HomePage"</span>

<span class="token keyword">echo</span> ie首页修改后无法保存
reg query <span class="token string">"HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Start Page"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"First Home Page"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Default_Page_URL"</span>

reg query <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Start Page"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"First Home Page"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>v <span class="token string">"Default_Page_URL"</span>

<span class="token keyword">echo</span> Windows10中查看到的现象
reg query "<span class="token constant">HKEY_CURRENT_USER</span>\<span class="token package">SOFTWARE<span class="token punctuation">\</span>Policies<span class="token punctuation">\</span>Microsoft<span class="token punctuation">\</span>Internet</span> Explorer\<span class="token package">Main</span>

<span class="token keyword">echo</span> 继续查看其他<span class="token constant">IE</span>配置路径
pause
<span class="token package">echo</span> 其他<span class="token constant">IE</span>配置路径
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Internet Explorer"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Main"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span>
reg query <span class="token string">"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Control Panel"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main"</span>
reg query <span class="token string">"HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel"</span>
<span class="token keyword">goto</span> exit

<span class="token punctuation">:</span>修复ie首页
<span class="token keyword">echo</span> 修复禁用更改主页设置
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"HomePage"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Control Panel"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"HomePage"</span>
<span class="token keyword">echo</span> 修复ie首页修改后无法保存
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Start Page"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Start Page"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"First Home Page"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Default_Page_URL"</span>

reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Start Page"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Search Bar"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Search Page"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Default_Page_URL"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Default_Search_URL"</span>

reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Start Page"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Search Bar"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Search Page"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Default_Page_URL"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Default_Search_URL"</span>

reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Start Page"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Search Bar"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Search Page"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Default_Page_URL"</span>
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN"</span> <span class="token operator">/</span>f <span class="token operator">/</span>v <span class="token string">"Default_Search_URL"</span>

<span class="token punctuation">:</span><span class="token punctuation">:</span>edge homepage
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\EUPP"</span> <span class="token operator">/</span>f
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\Protected - It is a violation of Windows Policy to modify. See aka.ms/browserpolicy"</span> <span class="token operator">/</span>f
reg <span class="token constant">DELETE</span> <span class="token string">"HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\Protected - It is a violation of Windows Policy to modify. See aka.ms/browserpolicy"</span> <span class="token operator">/</span>f


<span class="token keyword">goto</span> exit

<span class="token punctuation">:</span>打开浏览器配置目录
<span class="token keyword">echo</span> 打开浏览器配置目录
<span class="token keyword">if</span> exist <span class="token string">"%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles"</span> explorer <span class="token string">"%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles"</span>
    <span class="token punctuation">:</span><span class="token punctuation">:</span> 该目录删除后并不影响配置 <span class="token operator">></span> <span class="token operator">%</span><span class="token constant">USERPROFILE</span><span class="token operator">%</span>\<span class="token package">AppData<span class="token punctuation">\</span>Local<span class="token punctuation">\</span>Mozilla</span>
    <span class="token punctuation">:</span><span class="token punctuation">:</span>\<span class="token package">xxxxxxxx</span><span class="token punctuation">.</span><span class="token keyword">default</span>\<span class="token package">prefs</span><span class="token punctuation">.</span>js
    <span class="token punctuation">:</span><span class="token punctuation">:</span>\<span class="token package">xxxxxxxx</span><span class="token punctuation">.</span><span class="token keyword">default</span>\<span class="token package">user</span><span class="token punctuation">.</span>js
<span class="token keyword">if</span> exist <span class="token string">"%USERPROFILE%\AppData\Local\Google\Chrome"</span>              explorer <span class="token string">"%USERPROFILE%\AppData\Local\Google\Chrome"</span>
<span class="token keyword">if</span> exist <span class="token string">"%USERPROFILE%\AppData\Roaming\360se6"</span>                   explorer <span class="token string">"%USERPROFILE%\AppData\Roaming\360se6"</span>
<span class="token keyword">if</span> exist <span class="token string">"%USERPROFILE%\AppData\Local\360Chrome\Chrome"</span>           explorer <span class="token string">"%USERPROFILE%\AppData\Local\360Chrome\Chrome"</span>
<span class="token keyword">if</span> exist <span class="token string">"%USERPROFILE%\AppData\Roaming\SogouExplorer"</span>            explorer <span class="token string">"%USERPROFILE%\AppData\Roaming\SogouExplorer"</span>
<span class="token keyword">if</span> exist <span class="token string">"%USERPROFILE%\AppData\Local\2345Explorer"</span>               explorer <span class="token string">"%USERPROFILE%\AppData\Local\2345Explorer"</span>
<span class="token keyword">if</span> exist <span class="token string">"%USERPROFILE%\AppData\Local\Tencent\QQBrowser"</span>          explorer <span class="token string">"%USERPROFILE%\AppData\Local\Tencent\QQBrowser"</span>
<span class="token keyword">if</span> exist <span class="token string">"%USERPROFILE%\AppData\Local\UCBrowser"</span>                  explorer <span class="token string">"%USERPROFILE%\AppData\Local\UCBrowser"</span>
<span class="token keyword">if</span> exist <span class="token string">"%ProgramFiles%\Internet Explorer"</span>                       explorer <span class="token string">"%ProgramFiles%\Internet Explorer"</span>
<span class="token keyword">goto</span> exit

<span class="token punctuation">:</span>exit
pause
<span class="token package">goto</span> <span class="token punctuation">:</span>begin</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
        <category>随想</category>
        <category>微软</category>
      </categories>
      <tags>
        <tag>脚本类</tag>
      </tags>
  </entry>
  <entry>
    <title>C++详解Pow函数</title>
    <url>/2020/03/23/34.C-%E8%AF%A6%E8%A7%A3Pow%E5%87%BD%E6%95%B0/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p><strong>这是一道求水仙花数的变形体：<br>描述：水仙花一朵x元，问有n元最多能买多少符合水仙花数朵水仙花？<br>输入：两个整数n（100&lt;=n&lt;=999）,x（1&lt;=x&lt;=n）。<br>输出：输出符合要求的数，没有就输出-1。<br>说明：水仙花数：一个三位数其各位数字的立方和等于这个三位数。<br>例1：<br>输入：452 2<br>输出：153<br>例2：<br>输入：999 1<br>输出：407</strong></p>
<pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string">&lt;iostream></span></span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> n<span class="token punctuation">,</span>x<span class="token punctuation">;</span>
    <span class="token keyword">int</span> ans<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span>ams<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
    cin <span class="token operator">>></span> n <span class="token operator">>></span> x<span class="token punctuation">;</span>
    <span class="token keyword">int</span> m<span class="token punctuation">;</span>
    m<span class="token operator">=</span>n<span class="token operator">/</span>x<span class="token punctuation">;</span>
    <span class="token keyword">int</span> a<span class="token punctuation">,</span>b<span class="token punctuation">,</span>c<span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>m<span class="token operator">&lt;</span><span class="token number">100</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        cout <span class="token operator">&lt;&lt;</span> <span class="token operator">-</span><span class="token number">1</span><span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span>m<span class="token operator">&lt;</span><span class="token number">1000</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">100</span><span class="token punctuation">;</span> i<span class="token operator">&lt;=</span><span class="token number">999</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            a<span class="token operator">=</span>i<span class="token operator">/</span><span class="token number">100</span><span class="token punctuation">;</span>
            b<span class="token operator">=</span>i<span class="token operator">/</span><span class="token number">10</span><span class="token operator">%</span><span class="token number">10</span><span class="token punctuation">;</span>
            c<span class="token operator">=</span>i<span class="token operator">%</span><span class="token number">10</span><span class="token punctuation">;</span>
            <span class="token keyword">int</span> toal<span class="token operator">=</span>a<span class="token operator">*</span>a<span class="token operator">*</span>a<span class="token operator">+</span>b<span class="token operator">*</span>b<span class="token operator">*</span>b<span class="token operator">+</span>c<span class="token operator">*</span>c<span class="token operator">*</span>c<span class="token punctuation">;</span>
            <span class="token keyword">if</span><span class="token punctuation">(</span>toal<span class="token operator">==</span>i<span class="token punctuation">)</span>
            <span class="token punctuation">{</span>
                ans<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>
                ams<span class="token operator">=</span>i<span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">else</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">100</span><span class="token punctuation">;</span> i<span class="token operator">&lt;=</span>m<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            a<span class="token operator">=</span>i<span class="token operator">/</span><span class="token number">100</span><span class="token punctuation">;</span>
            b<span class="token operator">=</span>i<span class="token operator">/</span><span class="token number">10</span><span class="token operator">%</span><span class="token number">10</span><span class="token punctuation">;</span>
            c<span class="token operator">=</span>i<span class="token operator">%</span><span class="token number">10</span><span class="token punctuation">;</span>
            <span class="token keyword">int</span> toal<span class="token operator">=</span>a<span class="token operator">*</span>a<span class="token operator">*</span>a<span class="token operator">+</span>b<span class="token operator">*</span>b<span class="token operator">*</span>b<span class="token operator">+</span>c<span class="token operator">*</span>c<span class="token operator">*</span>c<span class="token punctuation">;</span>
            <span class="token keyword">if</span><span class="token punctuation">(</span>toal<span class="token operator">==</span>i<span class="token punctuation">)</span>
            <span class="token punctuation">{</span>
                ans<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>
                ams<span class="token operator">=</span>i<span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>ans<span class="token operator">==</span><span class="token number">1</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        cout <span class="token operator">&lt;&lt;</span> ams <span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">else</span>
    <span class="token punctuation">{</span>
        cout <span class="token operator">&lt;&lt;</span> <span class="token operator">-</span><span class="token number">1</span><span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p><del>··································分····················割···············线·································································</del><br><strong>这里是原型：<br>将所给两数范围内的所有水仙花数，从小到大依次输出。</strong></p>
<pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string">&lt;iostream></span></span>
<span class="token macro property">#<span class="token directive keyword">include</span><span class="token string">&lt;math.h></span></span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">SXH</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> B <span class="token operator">=</span> x <span class="token operator">/</span> <span class="token number">100</span><span class="token punctuation">,</span> S <span class="token operator">=</span> <span class="token punctuation">(</span>x <span class="token operator">-</span> B <span class="token operator">*</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">10</span><span class="token punctuation">,</span> G <span class="token operator">=</span> x <span class="token operator">%</span> <span class="token number">10</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>x<span class="token operator">==</span><span class="token function">pow</span><span class="token punctuation">(</span>G<span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token function">pow</span><span class="token punctuation">(</span>S<span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token function">pow</span><span class="token punctuation">(</span>B<span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token keyword">else</span> <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> m<span class="token punctuation">,</span> n<span class="token punctuation">;</span>
    <span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">while</span> <span class="token punctuation">(</span>cin <span class="token operator">>></span> m<span class="token punctuation">,</span>cin <span class="token operator">>></span> n<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">for</span> <span class="token punctuation">(</span>m<span class="token punctuation">;</span> m <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> m<span class="token operator">++</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SXH</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span>
            <span class="token punctuation">{</span>
                a<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> m<span class="token punctuation">;</span>
                i<span class="token operator">++</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
           <span class="token punctuation">}</span>
        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> i<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            cout <span class="token operator">&lt;&lt;</span> a<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span>
            <span class="token keyword">if</span> <span class="token punctuation">(</span>j <span class="token operator">&lt;</span> i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">' '</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span>i<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">)</span>cout <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            cout <span class="token operator">&lt;&lt;</span> <span class="token string">"no"</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>需要注意的是第二个原型题的代码中用到的pow函数：<br>头文件   ：#include &lt;math.h&gt;<br>作用      ：pow() 函数用来求 x 的 y 次幂（次方），x、y及函数值都是double型。<br>其原型为：double pow(double x, double y);<br>说明：<br>pow()用来计算以x 为底的 y 次方值，然后将结果返回。设返回值为 ret，则 ret = xy。</p>
<p>可能导致错误的情况：<br>如果底数 x 为负数并且指数 y 不是整数，将会导致 domain error 错误。<br>如果底数 x 和指数 y 都是 0，可能会导致 domain error 错误，这跟库函数实现有关。<br>如果底数 x 是 0，指数 y 是负数，可能会导致 domain error 或 pole error 错误，这也跟库函数实现有关。<br>如果返回值 ret 太大或者太小，将会导致 range error 错误。</p>
<p>错误代码：<br>如果发生 domain error 错误，那么全局变量 errno 将被设置为  EDOM；<br>如果发生 pole error 或 range error 错误，那么全局变量 errno 将被设置为 ERANGE。<br>Math.pow(底数,几次方)<br>如：<br>double a=2.0;<br>    double b=3.0;<br>double c=pow(a,b);<br>c最终为8.0；</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>随想</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>PICNIC-V.2.0.0_一款给天空加滤镜的APP</title>
    <url>/2020/03/23/2.PICNIC-V.2.0.0_%E4%B8%80%E6%AC%BE%E7%BB%99%E5%A4%A9%E7%A9%BA%E5%8A%A0%E6%BB%A4%E9%95%9C%E7%9A%84APP/</url>
    <content><![CDATA[<p>虽然我是一个不拍照片的直男，但当我第一次透过picnic看我头顶的天空时，我就决定把它留在我的手机里！（大概也有近两年时间了）</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<blockquote>
<h2 id="由于该博客最近搭建，所以只好将我其他平台的作品搬运过来，一些图片上有版权水印也请见谅哈"><a href="#由于该博客最近搭建，所以只好将我其他平台的作品搬运过来，一些图片上有版权水印也请见谅哈" class="headerlink" title="由于该博客最近搭建，所以只好将我其他平台的作品搬运过来，一些图片上有版权水印也请见谅哈"></a>由于该博客最近搭建，所以只好将我其他平台的作品搬运过来，一些图片上有版权水印也请见谅哈</h2></blockquote>
<h3 id="软件介绍："><a href="#软件介绍：" class="headerlink" title="软件介绍："></a><strong>软件介绍：</strong></h3><p><strong>PICNIC：是一款给天空加上各色滤镜的APP</strong><br><strong>优点：给天空加绝美的滤镜！无广告！打开即用！</strong><br><strong>版本号：v.2.0.0</strong><br><strong>测试机版本号：安卓8.0</strong><br><strong>效果：（不会拍照，这是随手一拍。。。不过按我技术随手和正经拍都一个样）</strong></p>
<p><img src="https://attach.52pojie.cn/forum/202003/01/233623t428df0qyb82dw22.png" alt="效果图1"></p>
<p><img src="https://attach.52pojie.cn/forum/202003/01/233626d74fqwcvnpiffonw.png" alt="效果图2"></p>
<p><strong><center>（左1为原图，另外三个仅仅做测试，不代表picnic的天空滤镜数量）</center>&gt;</strong></p>
<p><strong>软件运行图：</strong><br><strong>无广告加载界面，直接进入主界面。</strong><br><strong>无复杂功能碍眼，设置、相册、拍照已足矣。</strong></p>
<p><img src="https://attach.52pojie.cn/forum/202003/01/233628vix4vo8v2dioxdny.png" alt="效果图3"></p>
<p><strong>主功能很简单（效果真的很好！）就不一一介绍了，一键傻瓜式操作就能拍的漂漂亮亮的天空！</strong><br><strong>下面进入设置界面！</strong><br><strong>我们可以选择是否保留软件的水印、静音拍照、保留位置、取消软件消息通知（但我从来没印象收到过picnic的软件通知。。）</strong></p>
<p><img src="https://attach.52pojie.cn/forum/202003/01/233630v0pxlcx6cwcvmimx.png" alt="效果图4"></p>
<p><strong>总之，我是极力推这样的良心软件！</strong></p>
<p><strong>觉得有意思的朋友快快下载吧~</strong></p>
<p><strong>下载链接：</strong><br><strong>蓝奏云：</strong><a href="https://bigocean.lanzous.com/i9txiih" target="_blank" rel="noopener">https://bigocean.lanzous.com/i9txiih</a> <strong>提取码:<code>ocean</code></strong></p>
<p><strong>百毒云：</strong><br><strong>链接：</strong> <a href="https://pan.baidu.com/s/1u9saCy-0xq1Vv6xUAQMTTA" target="_blank" rel="noopener">https://pan.baidu.com/s/1u9saCy-0xq1Vv6xUAQMTTA</a> <strong>提取码：<code>kgly</code></strong><br><strong>蓝奏云二维码下载：</strong></p>
<p><img src="https://attach.52pojie.cn/forum/202003/01/233621x6jpr216i6mnpi0j.png" alt="二维码下载"></p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<blockquote>
<p>免责声明<br>本站提供的一切软件、教程和内容信息仅限用于学习和研究目的；不得将上述内容用于商业或者非法用途，否则，一切后果请用户自负。本站信息来自网络，版权争议与本站无关。您必须在下载后的24个小时之内，从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序，请支持正版，购买注册，得到更好的正版服务。如有侵权请邮件与我们<strong><a href="https://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=E3F6dHxwdnJ9IlNlemM9YmI9cHx_" target="_blank" rel="noopener">联系</a></strong>。敬请谅解！</p>
</blockquote>
]]></content>
      <categories>
        <category>安卓</category>
      </categories>
  </entry>
  <entry>
    <title>重装并激活系统</title>
    <url>/2020/03/21/1.%E9%87%8D%E8%A3%85%E5%B9%B6%E6%BF%80%E6%B4%BB%E7%B3%BB%E7%BB%9F/</url>
    <content><![CDATA[<p>对于刚刚DIY好一台电脑或者对于目前所用windows系统版本不太满意的人来说，下载一个官方、纯净的系统镜像是至关重要的！下面就来看看如何实现这些操作吧。（所有操作均以Win10为例）</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h3 id="首先说说为什么官方的系统受人推崇吧"><a href="#首先说说为什么官方的系统受人推崇吧" class="headerlink" title="首先说说为什么官方的系统受人推崇吧:"></a>首先说说为什么官方的系统受人推崇吧:</h3><p><strong>首先说说第三方系统镜像：</strong></p>
<blockquote>
<p>第一：由第三方人员在官方的系统的基础上修改而得，由于其中集成了大量工具和软件，较为简单易用，所以流传广泛。但是这<strong>并不能</strong>排除其中包含木马和病毒的可能。最重要的就是其中集成的软件九成都是流氓软件，例如臭名昭著的2345、各种页游等等等(得罪不起不一一点名)。为什么要把这些流氓软件集成到第三方系统去呢？当然是牟利哈，百度一下<strong>2345装机联盟</strong>即可知晓。</p>
<p>第二：在第三方系统制作人员打包封装系统的时候会把一些驱动或者激活信息封装进去，要知道驱动是和硬件相关联的，每个人的硬件不可能一模一样，即便是“万能驱动”在使用第三方系统的时候也免不了会有因<strong>驱动不匹配或激活信息故障导致蓝屏甚至装机失败。</strong></p>
</blockquote>
<p><strong>再来说说官方的系统镜像</strong></p>
<blockquote>
<p><strong>完全没毛病！</strong>各种更新版本和系统类别全部由用户自己选择，系统不会有任何第三方流氓软件。</p>
</blockquote>
<h3 id="那么该如何获取官方系统镜像呢？"><a href="#那么该如何获取官方系统镜像呢？" class="headerlink" title="那么该如何获取官方系统镜像呢？"></a>那么该如何获取官方系统镜像呢？</h3><p><strong>毫无疑问，微软官方下载就是渠道之一</strong></p>
<blockquote>
<p><a href="https://www.microsoft.com/zh-cn/software-download/" target="_blank" rel="noopener">微软官方下载</a></p>
<p>在微软官方下载会使用MeidaCreationTool下载工具（类似于N卡的GeForceExperience）可以本机升级系统，下载iso镜像到本地、或者下载iso镜像并写入U盘，缺点就是下载速度慢。</p>
</blockquote>
<p><strong>还有个下载官方系统的好去处</strong></p>
<blockquote>
<p><a href="https://msdn.itellyou.cn/" target="_blank" rel="noopener">MSDN,我告诉你</a></p>
<p>MSDN,我告诉你：全部采用ed2k开头的链接进行下载，包含SHA1校验信息。而且ed2k下载链接可以使用迅雷、百度网盘等工具进行下载，如果条件允许，下载速度较官方的MCT下载工具相比有显著提升。另外和微软官网的相比，这里的收录相对更全，也更方便查找下载不同的版本。</p>
</blockquote>
<center>冗长的系统选择页面</center>
<a href="https://i.loli.net/2020/03/21/DCZoOUcTlq6RQBX.gif" target="_blank" rel="noopener" data-fancybox="images" data-caption="冗长的系统选择页面"><img src="https://i.loli.net/2020/03/21/DCZoOUcTlq6RQBX.gif" /></a>

<p><strong>写给对系统安全格外重视的朋友</strong></p>
<blockquote>
<p>你们的担心不无道理，若是连镜像都是残缺或者携带捆绑甚至是病毒，那么装机过程再怎么完美也都是瞎费工夫。所以，大家可以下载一个Hash_MD5的校验工具，将下载的系统镜像拖拽进校验工具的工作窗口对比是否和网站提供的SHA1值一致，不一致则重新下载该镜像。</p>
<p><a href="https://bigocean.lanzous.com/iahx8gj" target="_blank" rel="noopener">Hash_MD5校验工具</a><strong>密码:</strong><code>ocean</code></p>
</blockquote>
<h3 id="下载好系统镜像之后呢？"><a href="#下载好系统镜像之后呢？" class="headerlink" title="下载好系统镜像之后呢？"></a>下载好系统镜像之后呢？</h3><p><strong>需要一个做好”格式化”准备的U盘</strong></p>
<blockquote>
<p>你需要准备一个≥16GB的U盘（8GB也可以，但这年头8GB的U盘实属罕见）</p>
</blockquote>
<p><strong>下载软碟通</strong></p>
<blockquote>
<p><a href="https://bigocean.lanzous.com/iahxp9e" target="_blank" rel="noopener">软碟通单文件免安装版本</a><strong>密码:</strong><code>ocean</code></p>
</blockquote>
<p><strong>用下载好的镜像通过软碟通制作一个U盘装机盘</strong></p>
<blockquote>
<p>1、右键”以管理员身份运行”软碟通</p>
<p>2、打开UltraISO的窗口后依次点击左上角的“文件”-“打开”-找到存放镜像文件的目录</p>
<p>3、选中该目标文件，点击“打开”按钮</p>
<p>4、插入准备好的U盘</p>
<p>5、再次回到UltraISO窗口，点击菜单栏中的“启动”选“写入硬盘镜像”</p>
<p>6、接下来在弹出的窗口直接点击“写入”按钮<strong>(注：将写入方法选择为“USB-HDD+”，如果不是这个模式，可能导致电脑无法通过U盘正常启动。)</strong></p>
<p>7、静候片刻，软碟通正在将系统的镜像文件数据写入到U盘里</p>
<p>8、下载<a href="https://bigocean.lanzous.com/iahz5vi" target="_blank" rel="noopener">HWID数字权利激活程序</a><strong>密码:</strong><code>ocean</code>将文件下载到你的U盘里(放在根目录就好，激活系统的时候会比较好找)</p>
<p>9、做好一切准备后就开始重装系统吧</p>
</blockquote>
<h3 id="开始重装系统-以Win10为例"><a href="#开始重装系统-以Win10为例" class="headerlink" title="开始重装系统(以Win10为例)"></a>开始重装系统(以Win10为例)</h3><p><strong>首先你需要知道你的电脑进入”选择启动项选择”页面的快捷键是什么,或者是进入BIOS系统的快捷键是什么</strong></p>
<center>其他品牌也可以试试比较大众的启动项选择快捷键</center>
<a href="https://i.loli.net/2020/03/21/IU4vSlsDKrhjBzy.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="各品牌台式机主板笔记本启动项"><img src="https://i.loli.net/2020/03/21/IU4vSlsDKrhjBzy.png" /></a>

<p><strong>插入U盘，在按下电源键的瞬间请用最快手速狂戳对应电脑/主板的快捷键，比如大众一点的按键<code>F12/Delete</code></strong></p>
<blockquote>
<p>按下后请选择你插入的U盘的名字，比如是金士顿的64GBU盘那么它的名字就类似Kingston-flashdisk-64GB</p>
<p>或者是其他检测不到品牌的U盘，你可以找FlashDisk、储存量等闪存的关键字样</p>
</blockquote>
<p><strong>因为我们是直接用软碟通将镜像写入了U盘，所以不同于一些进PE系统装机的教程</strong></p>
<blockquote>
<p>不同于PE装机，我们则会直接进入到经典的Windows系统安装界面：</p>
<p>1、选择语言后点击下一步-选择要安装的系统版本（如果你下载的是整合版、就是多个版本和在一起的镜像，那么就会出现这个页面供你选择），例如win10会有教育版、企业版、专业版三种供你选择，默认选专业版。</p>
<p>2、安装类型选择”自定义：仅安装Windows(高级)(C)”后自动进入”你想将windows安装在哪里？”页面</p>
<p>3、选中类型名为”主分区”的驱动器，你可以选择先将其格式化，再点击下一步。也可选中后直接下一步，效果应该是大差不差的</p>
<p>4、等待系统安装</p>
<p>5、成功进入系统，开始个性设置。</p>
</blockquote>
<h3 id="系统激活-以Win10为例"><a href="#系统激活-以Win10为例" class="headerlink" title="系统激活(以Win10为例)"></a>系统激活(以Win10为例)</h3><p><strong>开心的进入系统并开始进行个性设置时突然发现，这个系统还没有激活，该怎么办？</strong></p>
<blockquote>
<p>在此之前，我先介绍一下早在制作好U盘启动盘时让你们下载的<a href="https://bigocean.lanzous.com/iahz5vi" target="_blank" rel="noopener">HWID数字权利激活程序</a><strong>密码:</strong><code>ocean</code>吧</p>
<p><strong>以前：</strong>在还没有出现数字权利工具的时候，某知名网站（软慧网）上有大神写过一个Windows10专业版数字权利获取方法，即使现在教程用途不太大，不过有兴趣的可以去看一下。传送门：<a href="https://www.ruanhuicn.com/key/" target="_blank" rel="noopener">https://www.ruanhuicn.com/key/</a></p>
<p><strong>如今：</strong>到后来国外某知名论坛传出win10数字权利工具–HWIDGEN</p>
</blockquote>
<center>win10数字权利工具--HWIDGEN</center>
<a href="https://i.loli.net/2020/03/21/61ejxSHT9IMGvyF.png" target="_blank" rel="noopener" data-fancybox="images" data-caption="win10数字权利工具--HWIDGEN"><img src="https://i.loli.net/2020/03/21/61ejxSHT9IMGvyF.png" /></a>

<blockquote>
<p>在HWID出现之后，数字权利激活Windows10并不是难事了，只需要进行简单的点击操作就可以得到一个数字权利激活成功的Windows系统。<br><strong>科普：</strong>数字权利，是针对Windows10系统而言的一种激活方式。全称“使用数字许可证激活” 使用数字权利激活和普通激活方式有什么区别呢？十分重要的一点就是数字权利激活后支持重装，即在重装系统之后可以自动激活系统，保持正版！当然前提条件就是重装系统的时候需要保持和获取数字权利的系统版本保持一致并且需要确保没有更换硬件！<strong>可以简单的认为数字权利激活是永久激活！</strong>区别于kms激活，数字权利是永久的，无需90天循环和kms服务器，风险系数更小。<br><strong>HWID支持的版本：</strong>除Windows10 LTSC 2019 和Windows10 server系列系统外，换句话说：适用于大多数Windows10系统，例如win10家庭版、专业版、ltsb2016等等……</p>
</blockquote>
<p><strong>win10数字权利工具–HWIDGEN的使用方法</strong></p>
<blockquote>
<ul>
<li><strong>确保电脑能正常联网</strong>，网络正常稳定以确保能够成功连接微软服务器</li>
<li>尽量<strong>关闭360、电脑管家之类的杀毒软件</strong>，防止软件被吞无法使用</li>
<li>确保<strong>Windows update服务已开启(这一项无需关心，系统默认都是开启update服务的)未被禁用</strong>，禁用过的请开启后使用。激活成功后可关闭。</li>
<li>打开软件，在工作模式选择HWID，然后点击开始即可</li>
<li>只能用于Windows10系统，其他系统无效。</li>
<li>Windows10 LTSC 2019 和 Server版本可以在工作模式切换KMS38进行激活</li>
</ul>
</blockquote>
<p><strong>总结一下使用HWID激活的步骤：</strong>先把HWID从你的U盘里拉倒桌面，然后按照上述方法操作激活，成功后就可以把HWID删掉了。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<blockquote>
<p>免责声明<br>本站提供的一切软件、教程和内容信息仅限用于学习和研究目的；不得将上述内容用于商业或者非法用途，否则，一切后果请用户自负。本站信息来自网络，版权争议与本站无关。您必须在下载后的24个小时之内，从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序，请支持正版，购买注册，得到更好的正版服务。如有侵权请邮件与我们<strong><a href="https://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=E3F6dHxwdnJ9IlNlemM9YmI9cHx_" target="_blank" rel="noopener">联系</a></strong>。敬请谅解！</p>
</blockquote>
]]></content>
      <categories>
        <category>Win趣</category>
      </categories>
  </entry>
  <entry>
    <title>C语言编写贪吃蛇游戏</title>
    <url>/2020/03/21/7.C%E8%AF%AD%E8%A8%80%E7%BC%96%E5%86%99%E8%B4%AA%E5%90%83%E8%9B%87%E6%B8%B8%E6%88%8F/</url>
    <content><![CDATA[<p><strong>你问我为什么要用c写贪吃蛇游戏？一切都要从那次作业讲起。。。</strong></p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h3 id="背景："><a href="#背景：" class="headerlink" title="背景："></a>背景：</h3><blockquote>
<p>大一上半年，C程序设计老师布置了一个程序设计作业，于是诞生了这篇代码。</p>
</blockquote>
<h3 id="IDE："><a href="#IDE：" class="headerlink" title="IDE："></a>IDE：</h3><blockquote>
<p>VisualStudio2017社区版</p>
</blockquote>
<h3 id="字符集："><a href="#字符集：" class="headerlink" title="字符集："></a>字符集：</h3><blockquote>
<p>使用多字节字符集</p>
</blockquote>
<h3 id="辅助工具："><a href="#辅助工具：" class="headerlink" title="辅助工具："></a>辅助工具：</h3><blockquote>
<p>EasyX图形库2018春分版</p>
</blockquote>
<h3 id="PS："><a href="#PS：" class="headerlink" title="PS："></a>PS：</h3><p>   <strong>1、因为当时想得高分就以为搞点花里胡哨的就不错（哈哈最后混了个优，乐死我了），所以我编写了账号注册、登录系统、调用了多媒体接口以登录游戏时播放背景音乐、高分榜系统以及附带的升序降序排行函数：</strong></p>
<p>​            ①账号注册、登录系统、高分榜系统的数据全部分别保存在默认添加创建的Users.dat,scores.dat里，所以要借鉴的朋友需要手动在IDE里添加这两个文件（对应名称可以自己改，但一定要对应到代码里，否则会fp指针调用文件出错）；</p>
<p>​          ②关于背景音乐：我添加的背景音乐的资源就不放到帖子上了（名字叫silver city，好听，哈哈哈），所以要借鉴源码的朋友需要自己了解一下“如何添加MP3格式的音乐到代码”的问题，然后对代码第328行进行改写;</p>
<p>​    <strong>2、操作问题：因为我喜欢玩FPS游戏，所以定义的上下左右是wsad（小写，一定要把输入法切换为小写英文状态，否则蛇死亡），所以不习惯的朋友可以重新定义为键盘方向键（需要了解一下键盘虚拟键值，然后改对应的switch语句，代码量应该还是挺大的）。</strong></p>
<p>​    <strong>3、EasyX图形库：（这段是复制我设计报告的23333333）在我决定用EasyX库的图形函数来绘制地图之前，对于这个模块的编写有很多问题：譬如单用gotoxy()函数实现绘制地图的话，一片黑白，惨不忍睹；而且也会成几何倍的增加代码量：尤其是for循环语句和printf语句会多不胜数。从而就会导致不仅开发人员降低对于代码的可读性，而且从头至尾的黑白界面无疑会劝退很多玩家，降低可玩性。在我用EasyX来绘制地图后，测试的过程只能用两个字来形容：真香！EasyX的一个moveto()配合一个for循环代替了多不胜数的gotoxy()函数和for循环。这不仅大大缩减了代码量，而且图形编程的优点“多彩化”也得以体现。在调试过程中我对for循环进行了优化：一个进行边界的上下绘制，另一个负责左右的绘制，实现了不仅减少了代码量而且没有破坏不影响可读性的前提。</strong></p>
<p>​    <strong>4、应程序设计老师要求，基本上能达到每个功能、每个函数甚至每一句都有一条注释。。。（想想都要吐了）</strong></p>
<hr>
<p><strong>放代码吧：</strong></p>
<pre class=" language-c++"><code class="language-c++">#include <stdio.h>                        //C语言标准输入输出头文件
#include <graphics.h>                // easyx图形库头文件
#include <conio.h>                        //获取数据头文件（getch()和kbhit()）
#include <windows.h>                //使用其中的Sleep函数控制循环的时间，system("cls")函数来清屏
#include <stdlib.h>                        //调用了srand()随机函数
#include <time.h>                        //使用当前时钟做随机种子
#include <mmsystem.h>                //多媒体设备接口头文件
#pragma comment (lib,"winmm.lib")

//首先进行一堆宏定义

//定义地图大小
#define frame_height 30 
#define frame_width 30
//定义操作键，小写的wasd控制上左下右
#define UP 'w' 
#define DOWN 's'
#define LEFT 'a'
#define RIGHT 'd'
//控制台的点是单位点，不考虑大小，我们用的easyx绘制像素点为了将单位点在图形界面上放大为一个正方形，系数转换×16可以把一个单位点放大成正方形。16可以是任意数，相应的会放大或缩小所有的像素点。
#define SIZE 16

#define N 4

//声明fp是指针，用来指向FILE类型的对象。
FILE *fp;

int i, j, k, m, n, s[N];

char s1[4], s2[4];
//蛇的初始方向
char ch = UP;
//定义一个全局变量，来判断蛇是否成长，成长则速度加快。grow值也相应增加。
int grow = 0;



//食物的坐标
struct Food {
        int x;
        int y;
}food;

//蛇的信息：snake[0]是蛇头，len为蛇的长度，speed蛇的速度
struct Snake {
        int x[50];
        int y[50];
        int len;
        int speed;
}snake;

//用于储存用户账号密码
typedef struct The_users
{
        char id[11]; //账号
        char pwd[20];//密码
}users;
users a, b;//新建结构体成员变量,用来登陆与注册


//此处声明变量

void init_map(void);
void update_food(void);
void move_snake(void);
int is_alive(void);
void get_speed(void);
void gotoxy(int x, int y);
void redraw_map(void);
void menu();
void registers();
void Login();
//void Create_File();
void score();
int compInc(const void *a, const void *b);
int compDec(const void *a, const void *b);


//主函数位置
int main()
{
        initgraph(640, 480);        //创建绘图窗口，长640.
        menu();                                        //调用菜单函数
        score();                                //调用得分函数
        return 0;
}


//再次绘制地图（根据宏定义中的宽和高）
void redraw_map(void)
{
        for (j = 0; j < frame_width; j++)                        //该for循环用于绘制地图的上下边界，根据width宽来从左往右、先上后下依次绘制。
        {
                moveto(j*SIZE, 0);                                                //将画笔移动到(j*SIZE,0)的位置开始进行下面的绘图，另外(j*SIZE)是将单位点放大SIZE（16）倍
                setfillcolor(BLUE);                                                //定义上边界为蓝色
                fillrectangle(j*SIZE, 0, j*SIZE + SIZE, SIZE);        //绘制矩形
                moveto(j*SIZE, (frame_height - 1)*SIZE);//再次移动画笔
                setfillcolor(BLUE);                                                //定义下边界为蓝色
                fillrectangle(j*SIZE, (frame_height - 1)*SIZE, j*SIZE + SIZE, (frame_height - 1)*SIZE + SIZE);//绘制矩形
        }
        for (i = 1; i < frame_height - 1; i++)//次循环绘制地图左右剩余的28个矩形方块,先左后右，从上至下！
        {
                moveto(0, i*SIZE);                                //画笔移动到(0,i*SIZE)
                setfillcolor(BLUE);                                //定义左边界为蓝色
                fillrectangle(0, i*SIZE, 0 + SIZE, i*SIZE + SIZE);
                moveto((frame_width - 1)*SIZE, i*SIZE);//再次移动画笔
                setfillcolor(BLUE);                                        //定义右边界为蓝色
                fillrectangle((frame_width - 1)*SIZE, i*SIZE, (frame_width - 1)*SIZE + SIZE, i*SIZE + SIZE); //绘制矩形
        }
}

//然后初始化地图内容
void init_map(void)
{
        //初始化食物
        srand((unsigned int)time(NULL));//用srand函数集结合time.h头文件中的time来生成随机数
        food.x = rand() % (frame_height - 2) + 1;//在1~（frameheight-2）之间随机生成一个食物的横坐标
        food.y = rand() % (frame_width - 2) + 1;//在1~（framewidth -2）之间随机生成一个食物的纵坐标
        moveto(food.y*SIZE, food.x*SIZE);                //将画笔移动到该随机坐标
        setfillcolor(RED);                                                //定义食物为红色
        fillcircle(food.y *SIZE + SIZE / 2, food.x*SIZE + SIZE / 2, SIZE / 2);                //定义食物形状为以(food.y *SIZE + SIZE / 2, food.x*SIZE + SIZE / 2)为圆心，SIZE/2为半径的圆形

        //初始化蛇
        snake.x[0] = (frame_height) / 2;//初始化蛇头横坐标位置
        snake.y[0] = (frame_width) / 2;//初始化蛇头纵坐标位置
        moveto(snake.y[0] * SIZE, snake.x[0] * SIZE);//画笔移动到蛇头坐标
        setfillcolor(GREEN);                        //定义蛇的初始颜色为绿色
        fillcircle(snake.y[0] * SIZE + SIZE / 2, snake.x[0] * SIZE + SIZE / 2, SIZE / 2);//画蛇
        snake.len = 3;                                                //初始化蛇的节数为3节
        snake.speed = 200;                                        //初始化蛇的速度
        for (k = 1; k < snake.len; k++)                //用for循环画出蛇剩余的节数
        {
                snake.x[k] = snake.x[k - 1] + 1;
                snake.y[k] = snake.y[k - 1];
                moveto(snake.y[k] * SIZE, snake.x[k] * SIZE);
                setfillcolor(GREEN);
                fillcircle(snake.y[k] * SIZE + SIZE / 2, snake.x[k] * SIZE + SIZE / 2, SIZE / 2);
        }
}

//生成食物
void update_food()
{
        if (snake.x[0] == food.x&&snake.y[0] == food.y)//首先保证每次随机的食物不能刚好随机到蛇头所在坐标
        {
                food.x = rand() % (frame_height - 2) + 1;
                food.y = rand() % (frame_width - 2) + 1;
                for (k = 1; k < snake.len; k++)
                {
                        if (snake.x[k] == food.x&&snake.y[k] == food.y)//判断蛇头坐标等于随机食物的坐标 即：吃到食物
                        {
                                food.x = rand() % (frame_height - 2) + 1;//再次随机生成食物
                                food.y = rand() % (frame_width - 2) + 1;
                        }
                }
                moveto(food.y*SIZE, food.x*SIZE);//移动画笔到随机食物的坐标
                setfillcolor(RED);                                //定义食物颜色为红色
                fillcircle(food.y*SIZE + SIZE / 2, food.x*SIZE + SIZE / 2, SIZE / 2);                //定义食物为圆形
                snake.len++;                                        //蛇的长度加一
                grow = 1;                                                //给全局变量grow赋值1
        }
}

//蛇的移动
void move_snake()
{
        if (_kbhit())//kbhit判断键盘输入的虚拟键值
                ch = _getch();//将方向键值表现为对应的方向
        if (!grow)//此时grow值若为零则执行if语句，不为零则不执行
        {
                moveto(snake.y[snake.len - 1] * SIZE, snake.x[snake.len - 1] * SIZE);
                setfillcolor(BLACK);
                solidrectangle(snake.y[snake.len - 1] * SIZE, snake.x[snake.len - 1] * SIZE, snake.y[snake.len - 1] * SIZE + SIZE, snake.x[snake.len - 1] * SIZE + SIZE);
        }
        for (k = snake.len - 1; k > 0; k--)
        {
                snake.x[k] = snake.x[k - 1];
                snake.y[k] = snake.y[k - 1];
        }
        switch (ch)
        {
        case UP:  snake.x[0]--; break;
        case DOWN: snake.x[0]++; break;
        case LEFT:  snake.y[0]--; break;
        case RIGHT:  snake.y[0]++; break;
        default:  break;                                        //其他按键直接导致死亡
        }
        moveto(snake.y[0] * SIZE, snake.x[0] * SIZE);
        setfillcolor(GREEN);
        fillcircle(snake.y[0] * SIZE + SIZE / 2, snake.x[0] * SIZE + SIZE / 2, SIZE / 2);
        grow = 0;
}

//判断是否存活
int is_alive(void)
{
        if (snake.x[0] == 0 || snake.x[0] == frame_height - 1 || snake.y[0] == frame_width - 1 || snake.y[0] == 0)//判断是否撞墙
                return 0;                //死
        for (k = 1; k < snake.len; k++)
                if (snake.x[k] == snake.x[0] && snake.y[k] == snake.y[0])//判断蛇头是否撞到蛇的身体
                        return 0;        //死
        return 1;                        //活
}

//通过节数来提升速度
void get_speed(void)
{
        if (snake.len <= 6)
                snake.speed = 200;
        else if (snake.len <= 10)
                snake.speed = 100;
        else if (snake.len <= 20)
                snake.speed = 50;
        else if (snake.len <= 30)
                snake.speed = 30;
        else snake.speed = 20;
}

//移动光标
void gotoxy(int x, int y)
{
        HANDLE hout;
        COORD cor;
        hout = GetStdHandle(STD_OUTPUT_HANDLE);
        cor.X = y;
        cor.Y = x;
        SetConsoleCursorPosition(hout, cor);
}

//进入界面
void menu()
{
        InputBox(s1, 4, "输入数字以选择目的：\n1.开始游戏\n2.高分榜\n3.退出游戏\n游戏说明：wasd控制上左下右(小写)", "疯狂的蛇——海制作", NULL, 0, 0, false);
        int x, y[3];
        sscanf_s(s1, "%d", &x);//将用户输入转化为数字
        if (x == 1)
        {
                InputBox(s2, 4, "输入数字以选择目的：\n1.注册账号\n2.登陆游戏", "疯狂的蛇——海制作");
                sscanf_s(s2, "%d", &x);
                if (x == 1) {
                        registers();
                        Login();
                }
                else if (x == 2) {
                        Login();
                }
                init_map(); //初始化地图
                while (1)
                {
                        update_food();
                        get_speed();
                        move_snake();
                        redraw_map();
                        Sleep(snake.speed);
                        if (!(is_alive()))
                                break;
                }
                closegraph();                                                //关闭游戏窗口
                printf("哈哈小辣鸡，游戏结束!\n");
                printf("你的得分：%d", snake.len - 3);//得分=(蛇死亡前节数len)-(蛇的初始节数3)
                _getch();
        }
        else if (x == 2)
        {
                closegraph();                                                //关闭游戏窗口
                printf("                    排行榜\n");
                fopen_s(&fp, "scores.dat", "r");
                for (x = 0; x < N - 1; x++) {
                        fscanf_s(fp, "%d", &y[x]);
                        printf("%d\n", y[x]);
                }
                fclose(fp);
                _getch();

        }
        else//输入3或其他除了1、2任意键均退出游戏
        {
                closegraph();
        }
}

//注册系统
void registers()
{
        fopen_s(&fp, "Users.dat", "r");
        fscanf_s(fp, "%s%s", b.id, sizeof(b.id), b.pwd, sizeof(b.pwd));
        InputBox(a.id, 11, "请输入你的账号：", "疯狂的蛇——海制作");
        while (1)
        {
                if (strcmp(a.id, b.id) != 0)//如果两串字符串不相等
                {
                        if (!feof(fp))//如果未至文件末尾,它的工作原理是，站在光标所在位置，向后看看还有没有字符。如果有，返回0；如果没有，返回非0。它并不会读取相关信息，只是查看光标后是否还有内容。
                        {
                                fscanf_s(fp, "%s%s", b.id, sizeof(b.id), b.pwd, sizeof(b.pwd));
                        }
                        else break;
                }
                else
                {
                        outtextxy(220, 200, "此用户名已被注册");
                        fclose(fp);
                        _getch();
                        exit(0);
                }
        }
        fclose(fp);
        InputBox(a.pwd, 10, "请输入你的密码：", "疯狂的蛇——海制作");
        fopen_s(&fp, "Users.dat", "a");
        fprintf_s(fp, "%s %s\n", a.id, a.pwd);
        outtextxy(220, 200, "奥利给！恭喜你！账号注册成功！");
        fclose(fp);
}

//登陆账号密码，登录时播放bgm嘿嘿sao起来
void Login()
{
        mciSendString("open SC.mp3 alias BIGOcean", 0, 0, 0);
        mciSendString("play BIGOcean repeat", 0, 0, 0);
        fopen_s(&fp, "Users.dat", "r");
        fscanf_s(fp, "%s%s", b.id, sizeof(b.id), b.pwd, sizeof(b.pwd));
        InputBox(a.id, 11, "请输入账号", "疯狂的蛇——海制作");
        while (1)
        {
                if (strcmp(a.id, b.id) == 0) break;//如果找到了这个用户名
                else
                {
                        if (!feof(fp))//如果文件未读完
                                fscanf_s(fp, "%s%s", b.id, sizeof(b.id), b.pwd, sizeof(b.pwd));
                        else
                        {
                                outtextxy(220, 200, "此用户名不存在!");
                                fclose(fp);
                                _getch();
                                exit(0);
                        }
                }
        }
        InputBox(a.pwd, 20, "请输入密码", "疯狂的蛇——海制作");
        if (strcmp(a.pwd, b.pwd) == 0)//如果密码匹配
        {
                fclose(fp);
                outtextxy(250, 200, "登陆成功！奥利给！");
                initgraph(640, 480);
        }
        else
        {
                outtextxy(220, 200, "STFU!密码不正确");
                _getch();
                exit(0);
        }
}

//分数系统
void score()
{
        fopen_s(&fp, "scores.dat", "r");
        for (n = 0; n < N - 1; n++)
        {
                fscanf_s(fp, "%d", &m);
                s[n] = m;
        }
        s[N - 1] = snake.len - 3;
        qsort(s, N, sizeof(s[0]), compDec);
        fclose(fp);
        fopen_s(&fp, "scores.dat", "w");
        for (n = 0; n < N - 1; n++)
        {
                fprintf_s(fp, "%d\n", s[n]);
        }
        fclose(fp);
}

//分数的排序
//升序排序
int compInc(const void *a, const void *b)
{
        return *(int *)a - *(int *)b;
}
//降序排序
int compDec(const void *a, const void *b) {
        return *(int *)b - *(int *)a;
}</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>算法分析量--时间复杂度</title>
    <url>/2020/03/21/8.%E7%AE%97%E6%B3%95%E5%88%86%E6%9E%90%E9%87%8F-%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>文章创造背景：我们知道时间复杂度是学习算法的基石，但还是有很多朋友对这个概念不很理解，那么我们就来聊聊它如何“刻画”出一个算法的运行损耗的时间量。</p>
<blockquote>
<h3 id="文章叙述方式："><a href="#文章叙述方式：" class="headerlink" title="文章叙述方式："></a>文章叙述方式：</h3><p>我会用一种对话方式尽可能让对于时间复杂度还不懂的朋友清晰明了的对它建立概念。</p>
<h3 id="文章对话人物："><a href="#文章对话人物：" class="headerlink" title="文章对话人物："></a>文章对话人物：</h3><p>秦老师、大海同学。</p>
<h3 id="文章内容分配："><a href="#文章内容分配：" class="headerlink" title="文章内容分配："></a>文章内容分配：</h3><p>我将内容分为三个部分：<br>                                                         一：如何刻画一个算法消耗的时间量？<br>                                                         二：时间复杂度的概念怎么得出来的？<br>                                                         三：如何去计算一个算法的时间复杂度？</p>
</blockquote>
<hr>
<p><strong><center> 一：如何刻画一个算法消耗的时间量？ </center></strong></p>
<p><img src="https://i.loli.net/2020/03/20/ZjDApaJdohRSW7s.png" alt="对话1"><br><img src="https://i.loli.net/2020/03/21/bL4zArIgvcMV6WE.png" alt="对话2"></p>
<blockquote>
<center>为了方便朋友们看清楚，我把截图单独拉出来</center>
</blockquote>
<p><img src="https://i.loli.net/2020/03/21/SiL27DqdI8Mlkew.png" alt="插图1"><br><img src="https://i.loli.net/2020/03/21/wFdNMvce9ACgW1m.png" alt="对话3"><br><strong><center> 二：时间复杂度的概念怎么得出来的？ </center></strong><br><img src="https://i.loli.net/2020/03/21/ybt1zsgxEGTVYD5.png" alt="对话4"></p>
<blockquote>
<center>为了方便朋友们看清楚，我把截图单独拉出来</center>
</blockquote>
<p><img src="https://i.loli.net/2020/03/21/5sMtQi9VerGRU3S.png" alt="插图2"><br><img src="https://i.loli.net/2020/03/21/9T1OpMCjs3SRuVw.png" alt="对话5"><br><strong><center> 三：如何去计算一个算法的时间复杂度？ </center></strong><br><img src="https://i.loli.net/2020/03/21/1V6ZdEpfRncJx8t.png" alt="对话6"><br><img src="https://i.loli.net/2020/03/21/xdCXKkOosrH24b3.png" alt="对话7"></p>
<blockquote>
<center>为了方便朋友们看清楚，我把截图单独拉出来</center>
</blockquote>
<p><img src="https://i.loli.net/2020/03/21/Tb8zhHRcWgQ5e1n.png" alt="插图3"><br><img src="https://i.loli.net/2020/03/21/64o3aY5zK29OQTd.png" alt="对话8"><br><img src="https://i.loli.net/2020/03/21/vpNVqFJo9Un2DP1.png" alt="对话9"></p>
<hr>
<p><strong>至此呢，关于我对时间复杂度理解的文章已暂时完结！<br>感谢秦老师和大海同学助力！</strong></p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>算法类</tag>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>多线程如何获取结果</title>
    <url>/2020/03/18/29.%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E7%BB%93%E6%9E%9C/</url>
    <content><![CDATA[<p>多线程如何获取结果？</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="1-场景"><a href="#1-场景" class="headerlink" title="1.场景"></a>1.场景</h2><p>大家一般都会开启多线程去处理任务，如果需要获取线程处理结果怎么办？</p>
<p>有人会说『全局变量』，但是又会引出共享全局变量后资源竞争导致数据错误的问题。只能通过添加互斥锁进行解决，互斥锁又不能发挥多线程的优势，很是头大。</p>
<p>那么该如何解决呢？</p>
<h2 id="2-解决办法"><a href="#2-解决办法" class="headerlink" title="2.解决办法"></a>2.解决办法</h2><p>可以自定义一个类解决：</p>
<pre class=" language-python"><code class="language-python"><span class="token keyword">import</span> threading


<span class="token keyword">class</span> <span class="token class-name">MyThread</span><span class="token punctuation">(</span>threading<span class="token punctuation">.</span>Thread<span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> func<span class="token punctuation">,</span> args<span class="token punctuation">)</span><span class="token punctuation">:</span>
        super<span class="token punctuation">(</span>MyThread<span class="token punctuation">,</span> self<span class="token punctuation">)</span><span class="token punctuation">.</span>__init__<span class="token punctuation">(</span><span class="token punctuation">)</span>
        self<span class="token punctuation">.</span>func <span class="token operator">=</span> func
        self<span class="token punctuation">.</span>args <span class="token operator">=</span> args
        self<span class="token punctuation">.</span>result <span class="token operator">=</span> self<span class="token punctuation">.</span>func<span class="token punctuation">(</span><span class="token operator">*</span>self<span class="token punctuation">.</span>args<span class="token punctuation">)</span>

    <span class="token keyword">def</span> <span class="token function">get_result</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
        threading<span class="token punctuation">.</span>Thread<span class="token punctuation">.</span>join<span class="token punctuation">(</span>self<span class="token punctuation">)</span>
        <span class="token keyword">try</span><span class="token punctuation">:</span>
            <span class="token keyword">return</span> self<span class="token punctuation">.</span>result
        <span class="token keyword">except</span><span class="token punctuation">:</span>
            <span class="token keyword">return</span> None</code></pre>
<p><strong>使用方式</strong>：直接创建一个对象 <code>thread</code>，在使用方法 <code>thread.start()</code> 后，再调用 <code>get_result()</code> 方法即可获取。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>复用Django应用，使其可以通过pip安装</title>
    <url>/2020/03/13/31.%E5%A4%8D%E7%94%A8Django%E5%BA%94%E7%94%A8%EF%BC%8C%E4%BD%BF%E5%85%B6%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87pip%E5%AE%89%E8%A3%85/</url>
    <content><![CDATA[<p>想自己打包一个应用，可以像其他模块一样通过 <code>pip install</code> 安装吗？在 <code>Django</code> 项目中，一个应用如果通过此方式随用随安装是不是很帅气？快来看一下如何操作吧！</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h1 id="1-前提"><a href="#1-前提" class="headerlink" title="1.前提"></a>1.前提</h1><h2 id="1-1应用规范"><a href="#1-1应用规范" class="headerlink" title="1.1应用规范"></a>1.1应用规范</h2><p>为了方便打包，你的应用应该解耦合，并且所有文件都规范放置。其中需要注意：按照 <code>Django3.0</code> 官方文档描述，每个应用中的模板文件 <code>templates</code> 应与主项目中通用模板文件 <code>templates</code> 分离，最主要目的是为了创建可复用应用。</p>
<blockquote>
<p>官方文档原文：Just like the static files, we could have all our templates together, in one big templates directory, and it would work perfectly well. However, templates that belong to a particular application should be placed in that application’s template directory.</p>
</blockquote>
<p><strong>保证应用所需文件全部包含在应用目录中</strong>即可开始操作。</p>
<h2 id="1-2-环境"><a href="#1-2-环境" class="headerlink" title="1.2 环境"></a>1.2 环境</h2><p>安装模块：</p>
<pre class=" language-shell"><code class="language-shell"> pip install setuptools 
 pip install wheel</code></pre>
<h1 id="2-操作"><a href="#2-操作" class="headerlink" title="2.操作"></a>2.操作</h1><h2 id="2-1-准备文件"><a href="#2-1-准备文件" class="headerlink" title="2.1 准备文件"></a>2.1 准备文件</h2><p>比如我要打包应用 <code>polls</code> ：</p>
<pre class=" language-shell"><code class="language-shell">polls
├── __init__.py
├── __pycache__
│   ├── __init__.cpython-37.pyc
│   ├── admin.cpython-37.pyc
│   ├── apps.cpython-37.pyc
│   ├── models.cpython-37.pyc
│   ├── tests.cpython-37.pyc
│   ├── urls.cpython-37.pyc
│   ├── views.cpython-37.pyc
│   └── views_bak.cpython-37.pyc
├── admin.py
├── apps.py
├── migrations
│   ├── 0001_initial.py
│   ├── __init__.py
│   └── __pycache__
│       ├── 0001_initial.cpython-37.pyc
│       └── __init__.cpython-37.pyc
├── models.py
├── static
│   └── polls
│       ├── images
│       │   └── 1574779118421.jpg
│       └── style.css
├── templates
│   └── polls
│       ├── details.html
│       ├── index.html
│       └── results.html
├── tests.py
├── urls.py
├── views.py
└── views_bak.py # 视图备份文件</code></pre>
<h3 id="2-1-1-步骤"><a href="#2-1-1-步骤" class="headerlink" title="2.1.1 步骤"></a>2.1.1 步骤</h3><h4 id="2-1-1-1-创建总目录"><a href="#2-1-1-1-创建总目录" class="headerlink" title="2.1.1.1 创建总目录"></a>2.1.1.1 创建总目录</h4><p>1) 创建总目录，比如创建目录 <code>django-polls</code></p>
<p>2) 然后将应用 <code>polls</code> 移入上方总目录，此时它的目录结构应该是：</p>
<pre class=" language-shell"><code class="language-shell">django-polls/polls</code></pre>
<h4 id="2-1-1-2-创建说明文档"><a href="#2-1-1-2-创建说明文档" class="headerlink" title="2.1.1.2 创建说明文档"></a>2.1.1.2 创建说明文档</h4><p>创建说明文档 <code>django-polls/README.rst</code></p>
<pre class=" language-txt"><code class="language-txt">=====
Polls
=====

Polls is a Django app to conduct Web-based polls. For each question,
visitors can choose between a fixed number of answers.

Detailed documentation is in the "docs" directory.

Quick start
-----------

1. Add "polls" to your INSTALLED_APPS setting like this::

    INSTALLED_APPS = [
        ...
        'polls',
    ]

2. Include the polls URLconf in your project urls.py like this::

    path('polls/', include('polls.urls')),

3. Run ``python manage.py migrate`` to create the polls models.

4. Start the development server and visit http://127.0.0.1:8000/admin/
   to create a poll (you'll need the Admin app enabled).

5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.</code></pre>
<h4 id="2-1-1-3-创建授权协议文件"><a href="#2-1-1-3-创建授权协议文件" class="headerlink" title="2.1.1.3 创建授权协议文件"></a>2.1.1.3 创建授权协议文件</h4><p>创建一个 <code>django-polls/LICENSE</code> 文件</p>
<pre class=" language-txt"><code class="language-txt">Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.</code></pre>
<blockquote>
<p>协议文件自己可以从网上寻找生成方式</p>
</blockquote>
<h4 id="2-1-1-4-创建安装文件"><a href="#2-1-1-4-创建安装文件" class="headerlink" title="2.1.1.4 创建安装文件"></a>2.1.1.4 创建安装文件</h4><p>1) 创建文件 <code>django-polls/setup.cfg</code> （此文件为模块的配置信息，比如作者的姓名、联系方式等）</p>
<pre class=" language-txt"><code class="language-txt">[metadata]
name = django-polls
version = 0.1
description = A Django app to conduct Web-based polls.
long_description = file: README.rst
url = https://www.pythonnote.cn
author = Ethan Yan
author_email = yanyuliang6@163.com
license = MIT  # Example license
classifiers =
    Environment :: Web Environment
    Framework :: Django
    Framework :: Django :: X.Y  # Replace "X.Y" as appropriate
    Intended Audience :: Developers
    License :: OSI Approved :: BSD License
    Operating System :: OS Independent
    Programming Language :: Python
    Programming Language :: Python :: 3
    Programming Language :: Python :: 3 :: Only
    Programming Language :: Python :: 3.6
    Programming Language :: Python :: 3.7
    Programming Language :: Python :: 3.8
    Topic :: Internet :: WWW/HTTP
    Topic :: Internet :: WWW/HTTP :: Dynamic Content

[options]
include_package_data = true
packages = find:</code></pre>
<p>2) 创建文件 <code>django-polls/setup.py</code> （此文件是为了构建和安装应用）</p>
<pre class=" language-txt"><code class="language-txt">from setuptools import setup

setup()</code></pre>
<h4 id="2-1-1-5-创建引用文件"><a href="#2-1-1-5-创建引用文件" class="headerlink" title="2.1.1.5 创建引用文件"></a>2.1.1.5 创建引用文件</h4><p>默认包中只包含 <code>Python</code> 模块和包。为了包含额外文件，我们需要创建一个名为 <code>MANIFEST.in</code> 的文件。为了包含模板、<code>README.rst</code> 和我们的 <code>LICENSE</code> 文件，创建文件 <code>django-polls/MANIFEST.in</code> 包含以下内容：</p>
<pre class=" language-shell"><code class="language-shell">include LICENSE
include README.rst
recursive-include polls/static *
recursive-include polls/templates *
recursive-include docs *</code></pre>
<blockquote>
<p><code>docs</code> 目录为文档存放目录，可有可无，视情况而定。如果需要引入其他文件，按照格式在上述文件中补充即可。</p>
</blockquote>
<p>最终的目录结构如下：</p>
<pre class=" language-shell"><code class="language-shell">django-polls
├── LICENSE
├── MANIFEST.in
├── README.rst
├── doc
├── polls
├── setup.cfg
└── setup.py</code></pre>
<h2 id="2-2-打包"><a href="#2-2-打包" class="headerlink" title="2.2 打包"></a>2.2 打包</h2><p>接下来快看一下如何打包吧！</p>
<p>1) 进入总目录 <code>django-polls</code> 中</p>
<p>2) 执行如下命令：</p>
<pre class=" language-shell"><code class="language-shell">python setup.py sdist bdist_wheel</code></pre>
<p>3) 最终的模块在如下位置：</p>
<pre class=" language-shell"><code class="language-shell">dist
├── django-polls-0.1.tar.gz
└── django_polls-0.1-py3-none-any.whl</code></pre>
<p><code>django-polls-0.1.tar.gz</code> 即打包好的应用。</p>
<h2 id="2-3-安装使用"><a href="#2-3-安装使用" class="headerlink" title="2.3 安装使用"></a>2.3 安装使用</h2><p>在应用包所在目录执行如下命令即可安装：</p>
<pre class=" language-shell"><code class="language-shell">python -m pip install django-polls-0.1.tar.gz </code></pre>
<p>安装后如何在 <code>Django</code> 项目中使用呢？</p>
<p>1) 在 <code>settings</code> 文件中添加如下应用：</p>
<pre class=" language-shell"><code class="language-shell">INSTALLED_APPS = [
        ...
        'polls',
    ]</code></pre>
<p>2) 在 <code>urls</code> 文件中添加如下代码：</p>
<pre class=" language-shell"><code class="language-shell">path('polls/', include('polls.urls')),</code></pre>
<p>3) 迁移数据库文件，创建 <code>models</code>：</p>
<pre class=" language-shell"><code class="language-shell">python manage.py migrate</code></pre>
<p>然后即可使用。如果想要使用我打包好的应用体验一把，可以在微信公众号「全栈技术精选」后台回复关键字「polls应用包」获取模块。</p>
<h2 id="2-4-卸载"><a href="#2-4-卸载" class="headerlink" title="2.4 卸载"></a>2.4 卸载</h2><p>卸载：</p>
<pre class=" language-shell"><code class="language-shell">python -m pip uninstall django-polls</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
  </entry>
  <entry>
    <title>Django迁移数据库报错解决</title>
    <url>/2020/03/12/15.Django%E8%BF%81%E7%A7%BB%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8A%A5%E9%94%99%E8%A7%A3%E5%86%B3/</url>
    <content><![CDATA[<p><code>Django</code> 最新版本创建应用后，迁移数据库报错怎么办？</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="1-环境"><a href="#1-环境" class="headerlink" title="1.环境"></a>1.环境</h2><p><code>Django3.0.2</code>：</p>
<pre class=" language-shell"><code class="language-shell">(django_dev) > python -m django --version
3.0.2</code></pre>
<p><code>MySQl8.0.19</code>：</p>
<pre class=" language-shell"><code class="language-shell">Server version: 8.0.19 MySQL Community Server - GPL</code></pre>
<p><code>Python3.7.6</code>：</p>
<pre class=" language-shell"><code class="language-shell">(django_dev) > python --version
Python 3.7.6</code></pre>
<h2 id="2-报错"><a href="#2-报错" class="headerlink" title="2.报错"></a>2.报错</h2><p>执行命令：</p>
<pre class=" language-shell"><code class="language-shell">(django_dev) > python manage.py makemigrations polls</code></pre>
<p>报错信息如下：</p>
<pre class=" language-shell"><code class="language-shell">django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.</code></pre>
<p>根据提示，是数据库 <code>MySQL</code> 与 <code>Django</code> 版本不匹配，建议我们升级 <code>mysqlclient</code>。</p>
<p>首先要说明的是，数据库 <code>MySQL</code> 与 <code>Django</code> 都是最新版本，不存在需要升级的问题。那么问题就应该出现在连接数据库的模块  <code>PyMySQL</code> 上了，但它也是安装的最新版：</p>
<pre class=" language-shell"><code class="language-shell">(django_dev) > pip install --upgrade PyMySQL
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already up-to-date: PyMySQL in /Users/ethanyan/pyenv/django_dev/lib/python3.7/site-packages (0.9.3)</code></pre>
<blockquote>
<p>根据提示，该模块并无任何更新可用。</p>
</blockquote>
<h2 id="3-解决"><a href="#3-解决" class="headerlink" title="3.解决"></a>3.解决</h2><p>既然外部组件并无问题，接下来核查代码层面。可以根据报错提示，进入底层代码逐个文件查找原因，最终定位到如下文件：</p>
<pre class=" language-shell"><code class="language-shell">django_dev/lib/python3.7/site-packages/django/db/backends/mysql/base.py</code></pre>
<blockquote>
<p><code>django_dev</code> 为项目的虚拟环境。</p>
</blockquote>
<p>此文件从第 35 行开始，有如下代码在作怪：</p>
<pre class=" language-shell"><code class="language-shell">version = Database.version_info
if version < (1, 3, 13):
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)</code></pre>
<p>原来是底层有版本校验！查看其他文件，发现此校验并无关联内容，即可以注释掉，我们进行尝试：</p>
<pre class=" language-shell"><code class="language-shell"># version = Database.version_info
# if version < (1, 3, 13):
#     raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)</code></pre>
<p>然后再次执行命令：</p>
<pre class=" language-shell"><code class="language-shell">(django_dev) > python manage.py makemigrations polls
Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice</code></pre>
<p>执行成功。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
  </entry>
  <entry>
    <title>python的这些小知识你注意到了吗？</title>
    <url>/2020/03/10/25.python%E7%9A%84%E8%BF%99%E4%BA%9B%E5%B0%8F%E7%9F%A5%E8%AF%86%E4%BD%A0%E6%B3%A8%E6%84%8F%E5%88%B0%E4%BA%86%E5%90%97%EF%BC%9F/</url>
    <content><![CDATA[<p>本文将对一些小知识进行汇总，这些知识也许你用了 <code>python</code> 很久，但仍然没注意到。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="1-操作文件的-x-模式"><a href="#1-操作文件的-x-模式" class="headerlink" title="1.操作文件的 x 模式"></a>1.操作文件的 x 模式</h2><p>对文件进行操作的 <code>opend</code> 函数大家都很熟悉，但是你注意到它还有一种模式为 <code>x</code> 吗？</p>
<p>今天闲的无聊，翻了翻 <code>python</code> 的文档（电脑保存的 <code>python</code> 文档为3.8.2版本），然后发现：不光有 <code>a</code> 、<code>w</code>、<code>b</code> 、<code>r</code> 、<code>+</code> 模式，竟然还有一种模式为 <code>x</code>，下面讲一下吧。</p>
<p>官方文档称：在 3.3 版本中，增加了 <code>x</code> 模式，它表示创建一个文件，如果文件已经存在，会报错 <code>FileExistsError</code> 。还需要注意一点，在 3.3 版本以后，曾经的 <code>IOError</code> 被别名为 <code>OSError</code>。</p>
<h2 id="2-协程库-asyncio"><a href="#2-协程库-asyncio" class="headerlink" title="2.协程库 asyncio"></a>2.协程库 asyncio</h2><p>之前常用第三方库 <code>greentlet</code> 和 <code>gevent</code> 来创建协程，后来在 3.4 版本后，<code>python</code> 自身引入了一个协程库 <code>asyncio</code> 。它用来实现异步 <code>I/O</code>。下面看一下示例代码： </p>
<pre class=" language-python"><code class="language-python"><span class="token keyword">import</span> asyncio

<span class="token keyword">async</span> <span class="token keyword">def</span> <span class="token function">main_one</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'hello ...'</span><span class="token punctuation">)</span>
    <span class="token keyword">await</span> asyncio<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'... main_one!'</span><span class="token punctuation">)</span>

<span class="token keyword">async</span> <span class="token keyword">def</span> <span class="token function">main_two</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'hello ...'</span><span class="token punctuation">)</span>
    <span class="token keyword">await</span> asyncio<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'... main_two!'</span><span class="token punctuation">)</span>

<span class="token comment" spellcheck="true"># 创建 task 列表。ensure_future() 函数会返回 task 对象</span>
tasks <span class="token operator">=</span> <span class="token punctuation">[</span>asyncio<span class="token punctuation">.</span>ensure_future<span class="token punctuation">(</span>main_one<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>asyncio<span class="token punctuation">.</span>ensure_future<span class="token punctuation">(</span>main_two<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
<span class="token comment" spellcheck="true"># 使用 get_event_loop() 方法创建一个事件循环</span>
loop <span class="token operator">=</span> asyncio<span class="token punctuation">.</span>get_event_loop<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment" spellcheck="true"># 多个任务（即 task 列表）使用 wait() 方法执行</span>
<span class="token comment" spellcheck="true"># 然后再调用 run_until_complete() 函数将协程注册到事件循环中</span>
loop<span class="token punctuation">.</span>run_until_complete<span class="token punctuation">(</span>asyncio<span class="token punctuation">.</span>wait<span class="token punctuation">(</span>tasks<span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre>
<p>结果为：</p>
<pre class=" language-python"><code class="language-python">hello <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
hello <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> main_one!
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> main_two!</code></pre>
<h2 id="3-装饰器-wraps"><a href="#3-装饰器-wraps" class="headerlink" title="3.装饰器 wraps"></a>3.装饰器 wraps</h2><p>模块 <code>functools</code> 中的 <code>wraps</code> ，会让使用了装饰器的函数伪装的更像原函数，也就是将原函数的属性赋值给使用了装饰器后的原函数。这句话可能比较难理解，我们先来回顾一下什么是装饰器？<strong>装饰器就是在不改变现有函数基础上，为函数增加功能的一个函数，它使用闭包来实现。闭包的规则为在函数内部定义了一个函数，内部函数使用了外部函数的变量，外部函数返回了内部函数的引用。</strong>有一点需要注意：虽然被装饰器装饰的函数仍然可以使用原名称调用，但是其实质上指向了装饰器的内函数。通过以下示例进行说明：</p>
<p>1) 先来一个普通的装饰器使用示例</p>
<pre class=" language-python"><code class="language-python"><span class="token comment" spellcheck="true"># 定义一个装饰器</span>
<span class="token keyword">def</span> <span class="token function">eg_decorator</span><span class="token punctuation">(</span>func<span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token keyword">def</span> <span class="token function">wrapper</span><span class="token punctuation">(</span><span class="token operator">*</span>args<span class="token punctuation">,</span> <span class="token operator">**</span>kwds<span class="token punctuation">)</span><span class="token punctuation">:</span>
        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'我是装饰器啊...'</span><span class="token punctuation">)</span>
        <span class="token keyword">return</span> func<span class="token punctuation">(</span><span class="token operator">*</span>args<span class="token punctuation">,</span> <span class="token operator">**</span>kwds<span class="token punctuation">)</span>
    <span class="token keyword">return</span> wrapper

<span class="token comment" spellcheck="true"># 使用定义的装饰器装饰函数</span>
@eg_decorator
<span class="token keyword">def</span> <span class="token function">noname</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'我是示例函数噻...'</span><span class="token punctuation">)</span>

<span class="token comment" spellcheck="true"># 调用函数</span>
noname<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment" spellcheck="true"># 打印函数的 __name__ 属性</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>noname<span class="token punctuation">.</span>__name__<span class="token punctuation">)</span>

<span class="token triple-quoted-string string">"""
结果是：
我是装饰器啊...
我是示例函数噻...
wrapper
"""</span></code></pre>
<p>可以看到函数 <code>noname()</code> 的属性 <code>__name__</code> 的值为 <code>wrapper</code> ，即函数 <code>noname()</code> 指向的是装饰器的内函数。</p>
<p>2) 接下来请出今天的主角 <code>wraps</code>：</p>
<pre class=" language-python"><code class="language-python"><span class="token keyword">from</span> functools <span class="token keyword">import</span> wraps  <span class="token comment" spellcheck="true"># &lt;-- 导入模块</span>

<span class="token comment" spellcheck="true"># 定义一个装饰器</span>
<span class="token keyword">def</span> <span class="token function">eg_decorator</span><span class="token punctuation">(</span>func<span class="token punctuation">)</span><span class="token punctuation">:</span>
    @wraps<span class="token punctuation">(</span>func<span class="token punctuation">)</span>    <span class="token comment" spellcheck="true"># &lt;-- 使用装饰器</span>
    <span class="token keyword">def</span> <span class="token function">wrapper</span><span class="token punctuation">(</span><span class="token operator">*</span>args<span class="token punctuation">,</span> <span class="token operator">**</span>kwds<span class="token punctuation">)</span><span class="token punctuation">:</span>
        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'我是装饰器啊...'</span><span class="token punctuation">)</span>
        <span class="token keyword">return</span> func<span class="token punctuation">(</span><span class="token operator">*</span>args<span class="token punctuation">,</span> <span class="token operator">**</span>kwds<span class="token punctuation">)</span>
    <span class="token keyword">return</span> wrapper

<span class="token comment" spellcheck="true"># 使用定义的装饰器装饰函数</span>
@eg_decorator
<span class="token keyword">def</span> <span class="token function">noname</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'我是示例函数噻...'</span><span class="token punctuation">)</span>

<span class="token comment" spellcheck="true"># 调用函数</span>
noname<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment" spellcheck="true"># 打印函数的 __name__ 属性</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>noname<span class="token punctuation">.</span>__name__<span class="token punctuation">)</span>

<span class="token triple-quoted-string string">"""
结果是：
我是装饰器啊...
我是示例函数噻...
noname
"""</span></code></pre>
<p>可以看到 <code>__name__</code> 属性的值被修改为函数 <code>noname</code> 自己。</p>
<p>也许大家会问这有什么用？很久很久以前，在一个 <code>Flask</code> 项目中曾经出现过一个 <code>bug</code> ：给视图函数添加了自定义的装饰器之后（该装饰器会验证用户是否登录），再用 <code>@app.route(&quot;/index&quot;)</code> 绑定路径，会报错「你添加路径的视图函数已经绑定了其他路径」。这是因为路径会绑定自定义装饰器的内函数，之前其他视图绑定的其实并不是视图本身，而是自定义装饰器的内函数，这次实质上也去绑定内函数，所以会报错。通过查看底层代码是因为 <code>Flask</code> 的路由地址根据属性 <code>__name__</code> 绑定视图名称。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>docker容器网桥连接</title>
    <url>/2020/03/07/17.docker%E5%AE%B9%E5%99%A8%E7%BD%91%E6%A1%A5%E8%BF%9E%E6%8E%A5/</url>
    <content><![CDATA[<p>容器之间如何互相通讯？具体的命令有哪些？</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h1 id="网桥"><a href="#网桥" class="headerlink" title="网桥"></a>网桥</h1><p>网桥可以简单的理解为「局域网」，使加入网桥的容器之间可以互相通讯、暴露全部链接，同时与外界又保证了相对隔离的运行环境。</p>
<h2 id="1-创建网桥"><a href="#1-创建网桥" class="headerlink" title="1.创建网桥"></a>1.创建网桥</h2><p>命令：</p>
<pre class=" language-shell"><code class="language-shell">docker network create --driver bridge [网桥名称]</code></pre>
<blockquote>
<p>参数 <code>--driver bridge</code> 是默认配置，可写可不写</p>
</blockquote>
<h2 id="2-连接网桥"><a href="#2-连接网桥" class="headerlink" title="2.连接网桥"></a>2.连接网桥</h2><p>连接网桥分为两种方式，一种是在创建容器时链接网桥，一种是在容器运行时链接网桥。</p>
<p>1) 创建容器时：</p>
<pre class=" language-shell"><code class="language-shell">docker create --name [容器名称] --network [网桥名称] [镜像名称]</code></pre>
<p>2) 容器运行状态时：</p>
<pre class=" language-shell"><code class="language-shell">docker network connect [网桥名称] [容器名称]</code></pre>
<h2 id="3-查看所有网桥"><a href="#3-查看所有网桥" class="headerlink" title="3.查看所有网桥"></a>3.查看所有网桥</h2><p>命令：</p>
<pre class=" language-shell"><code class="language-shell">docker network ls</code></pre>
<h2 id="4-查看某网桥的配置信息"><a href="#4-查看某网桥的配置信息" class="headerlink" title="4.查看某网桥的配置信息"></a>4.查看某网桥的配置信息</h2><p>命令：</p>
<pre class=" language-shell"><code class="language-shell">docker network inspect [网桥id或者名称]</code></pre>
<h2 id="5-删除自定义网桥"><a href="#5-删除自定义网桥" class="headerlink" title="5.删除自定义网桥"></a>5.删除自定义网桥</h2><p>命令：</p>
<pre class=" language-shell"><code class="language-shell">docker network rm [网桥id或者名称]</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
  </entry>
  <entry>
    <title>docker容器数据持久化</title>
    <url>/2020/03/06/16.docker%E5%AE%B9%E5%99%A8%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/</url>
    <content><![CDATA[<p><code>docker</code> 容器内的数据是独立于镜像之外的，那么如何将其持久化到宿主机呢？答案便是利用「数据卷」，那什么又是「数据卷」呢？</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h1 id="数据卷"><a href="#数据卷" class="headerlink" title="数据卷"></a>数据卷</h1><p><strong>数据卷其实就是一个目录或者一个文件</strong>，该目录（或文件）可以存在于宿主机上。将此目录（或文件）映射到容器中，便可以持久化容器内的数据到宿主机。如果目录不存在于宿主机上，而是存在于一个容器内部，那么此容器便可以被称为「<strong>数据卷容器</strong>」</p>
<p>下面讲解一下具体的操作方式。</p>
<h2 id="1-持久化到目录"><a href="#1-持久化到目录" class="headerlink" title="1.持久化到目录"></a>1.持久化到目录</h2><p>数据卷如果是宿主机的一个目录，可以进行如下操作将容器内的数据持久化：</p>
<h3 id="1-1-命令介绍"><a href="#1-1-命令介绍" class="headerlink" title="1.1 命令介绍"></a>1.1 命令介绍</h3><pre class=" language-shell"><code class="language-shell">docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]</code></pre>
<p>该命令<strong>解读</strong>：通过一个镜像启动一个容器。利用 <code>--name</code> 指定容器的名称；利用 <code>-v</code> 指定宿主机的某目录作为数据卷挂载到容器中，使该容器与宿主机共享此目录 。</p>
<blockquote>
<p><strong>注意</strong>：1.如果本地路径不存在，<code>docker</code> 会贴心的自动创建。2.宿主机的目录请使用<strong>绝对路径</strong>。</p>
</blockquote>
<h3 id="1-2-操作"><a href="#1-2-操作" class="headerlink" title="1.2 操作"></a>1.2 操作</h3><p>1) 执行如下命令，将宿主机的 <code>/Users/ethanyan/dockerdata/</code> 目录映射到新创建的 <code>nginx</code> 容器中的 <code>/data</code> 目录：</p>
<pre class=" language-shell"><code class="language-shell">docker run -itd --name nginx -v /Users/ethanyan/dockerdata:/data nginx</code></pre>
<p>2) 接下来验证是否生效，先在本地共享目录下创建一个新目录 <code>NG</code>：</p>
<pre class=" language-shell"><code class="language-shell">cd /Users/ethanyan/dockerdata
mkdir NG</code></pre>
<p>3) 进入容器 <code>nginx</code> 中看是否存在 <code>NG</code> 目录：</p>
<pre class=" language-shell"><code class="language-shell">docker exec -it nginx /bin/bash

root@81bbc2c2bf5c:/# cd /data/
root@81bbc2c2bf5c:/data# ls
NG</code></pre>
<blockquote>
<p>可发现在本地创建目录后，容器内的确实也出现了新建的目录。</p>
</blockquote>
<p>4) 反向进行操作。在容器的 <code>/data/NG</code> 目录中创建一个文件 <code>testdata.txt</code> ，退出容器后发现本地也出现了该文件。从而得出<strong>使用此方法可以让容器和宿主机共享目录，并将容器内的数据持久化到本地</strong>。</p>
<h2 id="2-持久化到文件"><a href="#2-持久化到文件" class="headerlink" title="2.持久化到文件"></a>2.持久化到文件</h2><h3 id="2-1-命令介绍"><a href="#2-1-命令介绍" class="headerlink" title="2.1 命令介绍"></a>2.1 命令介绍</h3><pre class=" language-shell"><code class="language-shell">docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件] [镜像名称] [命令(可选)]</code></pre>
<blockquote>
<p><code>-d</code> 是创建容器后，使其在后台持续运行。</p>
</blockquote>
<h3 id="2-2-操作"><a href="#2-2-操作" class="headerlink" title="2.2 操作"></a>2.2 操作</h3><p>1) 执行如下命令，将本地的 <code>testdata.txt</code> 文件映射到容器的 <code>testdata.txt</code> 文件：</p>
<pre class=" language-shell"><code class="language-shell">docker run -itd --name nginx_test -v /Users/ethanyan/dockerdata/NG/testdata.txt:/data/testdata.txt nginx</code></pre>
<blockquote>
<p>同样是创建了一个容器，此容器基于镜像 <code>nginx</code> ，并命名为 <code>nginx_test</code> 。</p>
</blockquote>
<p><strong>注意：</strong>宿主机要映射的文件与容器内的文件名称可以不同，但是文件类型必须相同！</p>
<p>2) 接下来同样验证一下此操作。在本地的文件 <code>/Users/ethanyan/dockerdata/NG/testdata.txt</code> 中写入 <code>hello world</code></p>
<pre class=" language-shell"><code class="language-shell">cd /Users/ethanyan/dockerdata/NG/
echo 'hello world' > testdata.txt</code></pre>
<p>3) 进入容器内，执行下列操作：</p>
<pre class=" language-shell"><code class="language-shell">root@8694fd7cba10:/# cd /data
root@8694fd7cba10:/data# ls
testdata.txt
root@8694fd7cba10:/data# cat testdata.txt
hello world</code></pre>
<p>4) 验证了宿主机修改文件后容器内文件也被修改。接下来我们在容器内修改一下内容，看本地是否也被修改：</p>
<pre class=" language-shell"><code class="language-shell">docker exec -it nginx /bin/bash

root@8694fd7cba10:/# cd /data
root@8694fd7cba10:/data# ls
testdata.txt
root@8694fd7cba10:/data# echo 'xxx测试用' >> testdata.txt
root@8694fd7cba10:/data# cat testdata.txt
hello world
xxx测试用
root@8694fd7cba10:/data# exit
exit</code></pre>
<p>) 然后在本地查看发现内容也被更改。<strong>说明可以使用文件持久化数据</strong>。</p>
<h2 id="3-持久化到容器"><a href="#3-持久化到容器" class="headerlink" title="3.持久化到容器"></a>3.持久化到容器</h2><p>如果不想这些数据直接暴露在宿主机，可以使用数据卷容器的方式。将数据卷容器挂载到其他容器，就可以多个容器之间共享数据了，而且还可以持久化的保存数据（后面会讲解如何备份和恢复数据卷容器）</p>
<p><strong>注意：数据卷容器不启动</strong></p>
<h3 id="3-1-步骤"><a href="#3-1-步骤" class="headerlink" title="3.1 步骤"></a>3.1 步骤</h3><p>1) 创建数据卷容器</p>
<p>2) 将数据卷容器挂载到其他容器 </p>
<p><strong>注意：使用数据卷容器是容器之间共享数据，不涉及宿主机，因此数据没有在宿主机上。</strong></p>
<h3 id="3-2-示例"><a href="#3-2-示例" class="headerlink" title="3.2 示例"></a>3.2 示例</h3><p>1) 创建一个数据卷容器：</p>
<pre class=" language-shell"><code class="language-shell"># 命令
docker create -v [容器数据卷目录] --name [容器名字] [镜像名称] [命令(可选)]
# 示例
docker create -v /data/ --name data nginx</code></pre>
<blockquote>
<p>既然需要创建一个数据卷容器，那么就需要使用镜像，因为我电脑只有一个 <code>nginx</code> 镜像，那么使用它即可。一般大家都习惯使用 <code>centos</code> 或者 <code>Ubuntu</code> 作为基础镜像</p>
</blockquote>
<p>2) 创建两个容器（为了测试是否可以在容器间共享数据），并都挂载数据卷容器：</p>
<pre class=" language-shell"><code class="language-shell"># 创建容器并挂载数据卷命令
docker run --volumes-from [数据卷容器 id/name] -itd --name [容器名字] [镜像名称] [命令(可选)]
# 示例 
docker run  --volumes-from db847d3fc055 -itd --name nginx_test1 nginx /bin/bash
docker run  --volumes-from db847d3fc055 -itd --name nginx_test2 nginx /bin/bash
# 注意：db847d3fc055 为数据卷容器id</code></pre>
<p>3) <strong>验证操作</strong></p>
<p>先进入容器 <code>nginx_test1</code> 中进行操作，创建一个文件：</p>
<pre class=" language-shell"><code class="language-shell">docker exec -it nginx_test1 /bin/bash

root@72abfcc9e2e9:/# ls /data/
root@72abfcc9e2e9:/# touch /data/file.txt
root@72abfcc9e2e9:/# ls /data/
file.txt
root@72abfcc9e2e9:/# exit
exit</code></pre>
<p>进入容器 <code>nginx_test2</code> 验证，并修改文件内容进行反向验证：</p>
<pre class=" language-shell"><code class="language-shell">docker exec -it nginx_test2 /bin/bash

root@c5f2c2463640:/# ls /data/
file.txt
root@c5f2c2463640:/# echo 'hello world' > /data/file.txt
root@c5f2c2463640:/# exit
exit</code></pre>
<p>然后再进入容器 <code>nginx_test1</code> 验证：</p>
<pre class=" language-shell"><code class="language-shell">docker exec -it nginx_test1 /bin/bash

root@72abfcc9e2e9:/# ls /data/
file.txt
root@72abfcc9e2e9:/# cat /data/file.txt
hello world
root@72abfcc9e2e9:/# exit
exit</code></pre>
<h3 id="3-3-备份与恢复"><a href="#3-3-备份与恢复" class="headerlink" title="3.3 备份与恢复"></a>3.3 备份与恢复</h3><p><strong>数据卷容器</strong>的备份与恢复并不是<strong>容器</strong>的备份与恢复，实质上是<strong>数据</strong>的备份与恢复。</p>
<blockquote>
<p>这句话你品，你细品！</p>
</blockquote>
<h4 id="3-3-1-备份"><a href="#3-3-1-备份" class="headerlink" title="3.3.1 备份"></a>3.3.1 备份</h4><p>命令：</p>
<pre class=" language-shell"><code class="language-shell">docker run -it --volumes-from [数据卷容器id或者name] -v [宿主机存放备份文件的目录]:[容器内存放备份文件目录] [镜像] tar cvf [备份文件路径] [要备份的目录]</code></pre>
<p>我们执行示例命令：</p>
<pre class=" language-shell"><code class="language-shell">docker run -it --volumes-from data -v /Users/ethanyan/dockerdata/:/backup nginx tar cvf /backup/backup.tar /data
tar: Removing leading `/' from member names
/data/
/data/file.txt</code></pre>
<p>该命令是加载数据卷容器并将容器内的 <code>/data</code> 目录打包，然后把压缩包保存到 映射到容器内 的新数据卷，本地目录为 <code>/Users/ethanyan/dockerdata/</code> 。执行完后，会在本地该目录出现压缩包 <code>backup.tar</code>。</p>
<p><strong>注意：</strong></p>
<p>1) 备份的命令执行完后会创建出一个临时容器，删除即可。重要的是压缩包。</p>
<blockquote>
<p>之所以会出现一个临时容器，是因为备份的原理是：创建一个新的容器挂载数据卷容器，而且此容器还与宿主机共享了一个目录（新数据卷），执行打包命令将数据卷容器内的数据打包保存到共享目录中，所以本地会出现一个压缩包。</p>
</blockquote>
<h4 id="3-3-2-恢复"><a href="#3-3-2-恢复" class="headerlink" title="3.3.2 恢复"></a>3.3.2 恢复</h4><p>请保存好备份的压缩包文件，恢复时用得到。</p>
<p><strong>步骤：</strong></p>
<p>1) 创建一个新的数据卷容器 <code>data_new</code></p>
<pre class=" language-shell"><code class="language-shell">docker create -v /data/ --name data_new nginx</code></pre>
<p>2) 恢复之前的备份文件</p>
<pre class=" language-shell"><code class="language-shell"># 命令
docker run --volumes-from [新创建的数据卷容器id或者name] -v [宿主机存放备份文件的目录]:[容器内存放备份文件目录] [镜像] tar xvf [备份文件]

# 执行示例命令
docker run --volumes-from data_new -v /Users/ethanyan/dockerdata/:/backup nginx tar xvf /backup/backup.tar
data/
data/file.txt</code></pre>
<p>3) 为了验证是否恢复，我们可以新创建一个容器并挂载新的数据卷容器：</p>
<pre class=" language-shell"><code class="language-shell">docker run  --volumes-from data_new -itd --name nginx_test6 nginx /bin/bash

docker exec -it nginx_test6 /bin/bash

root@2b54f0bfefbe:/# ls /data
file.txt
root@2b54f0bfefbe:/# cat /data/file.txt
hello world</code></pre>
<p>可看到数据卷容器已经恢复。</p>
<h4 id="3-3-3-备份与恢复的原理"><a href="#3-3-3-备份与恢复的原理" class="headerlink" title="3.3.3 备份与恢复的原理"></a>3.3.3 备份与恢复的原理</h4><p>不管是备份还是恢复，我们都使用了一个中间介质，此介质便是一个容器。因为数据卷容器是不启动的，为了备份数据，我们就需要使用一个挂载了此数据卷容器的中间介质（容器）。此介质不光要能连接数据卷容器，还需要连接本地，因此我们又将本地的一个目录映射到了中间介质中。</p>
<p>备份就是中间介质将数据卷容器的目录打包后，再通过映射的目录共享给本地，所以本地会出现一个压缩包。容器列表多了一个新的容器，此容器便是中间介质。</p>
<p>恢复就是中间介质通过映射到容器的共享目录，读取到本地的备份文件（压缩包），然后在容器内部解压缩，数据就恢复到了挂载的数据卷容器中。</p>
<blockquote>
<p>当然，此中间介质也可以使用 <code>--name</code> 参数命名，便于删除。</p>
</blockquote>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
  </entry>
  <entry>
    <title>分享一份全国行政区划sql数据库表</title>
    <url>/2020/03/04/30.%E5%88%86%E4%BA%AB%E4%B8%80%E4%BB%BD%E5%85%A8%E5%9B%BD%E8%A1%8C%E6%94%BF%E5%8C%BA%E5%88%92sql%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8/</url>
    <content><![CDATA[<p>还在为寻找全国行政区划的数据而烦恼吗？还在因为一个 <code>Excel</code> 表格无法确定信息是否全面而惆怅吗？快来看看为你准备好的东西吧！</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h2><p>在软件开发的过程中，最基础最重要但是又最不容易寻找的一份数据便是「全国行政区划信息」。为了解决大家的烦恼，此处提供一份 <code>sql</code> 数据库文件，直接导入即可使用，省时省力，快来实践一下吧。</p>
<h2 id="1-环境"><a href="#1-环境" class="headerlink" title="1.环境"></a>1.环境</h2><p>关系数据库（本人使用的数据库为 <code>MySQL8.0.19</code>）</p>
<h2 id="2-文件"><a href="#2-文件" class="headerlink" title="2.文件"></a>2.文件</h2><p>数据库文件为 <code>AREAS.sql</code>，数据条数为 3487 ，十分全面的涵盖了全国的省市县等信息。</p>
<blockquote>
<p> 此文件包括建表以及准备的数据</p>
</blockquote>
<p><strong>获取方式：</strong>关注公众号「全栈技术精选」，后台回复关键字「全国行政区划信息」即可获取。</p>
<h2 id="3-使用"><a href="#3-使用" class="headerlink" title="3.使用"></a>3.使用</h2><p>1) 先将获取到的文件 <code>AREAS.sql</code> 放到任意目录下（比如目录 <code>sqlfile</code> ），然后进入此目录：</p>
<pre class=" language-shell"><code class="language-shell">cd sqlfile</code></pre>
<p>2) 先进入数据库（以 <code>mysql</code> 为例）：</p>
<pre class=" language-shell"><code class="language-shell">mysql -u root -p</code></pre>
<p>3) 创建数据库：</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">create</span> <span class="token keyword">database</span> area<span class="token punctuation">;</span></code></pre>
<p>4) 使用此数据库：</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">use</span> area<span class="token punctuation">;</span></code></pre>
<p>5) 导入行政区划数据表：</p>
<pre class=" language-sql"><code class="language-sql">source AREAS<span class="token punctuation">.</span>sql<span class="token punctuation">;</span></code></pre>
<h3 id="3-1-注意"><a href="#3-1-注意" class="headerlink" title="3.1 注意"></a>3.1 注意</h3><p>1) 获取到的数据库文件 <code>AREAS.sql</code> 为表结构以及表数据，因此需要先有一个数据库（此数据库可以新建或者使用已存在的数据库）</p>
<p>2) 导入数据库文件时，如果没有执行刚开始切换到 <code>AREAS.sql</code> 文件所在目录的步骤，可以通过写文件的绝对路径方式解决</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>随想</category>
      </categories>
  </entry>
  <entry>
    <title>一起来看看火爆的手机号码一键登录</title>
    <url>/2020/03/03/9.%E4%B8%80%E8%B5%B7%E6%9D%A5%E7%9C%8B%E7%9C%8B%E7%81%AB%E7%88%86%E7%9A%84%E6%89%8B%E6%9C%BA%E5%8F%B7%E7%A0%81%E4%B8%80%E9%94%AE%E7%99%BB%E5%BD%95/</url>
    <content><![CDATA[<p>不知你是否发现：大批手机 <code>app</code> 登录页面，突然之间变成了一键登录。之前大火的 <code>通过手机号码获取短信验证码</code> 登录模式正悄悄退去。这神奇的操作是如何实现的呢？</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="1-背景"><a href="#1-背景" class="headerlink" title="1.背景"></a>1.背景</h2><p>之前所有的登录页面千篇一律为「手机号」「验证码」（暂且忽略账号密码以及第三方登录模式），这是因为想要验证「你就是你」，在手机号实名认证的时代，通过向号主本人发送验证码来验证登录是较为稳妥的方式，事实证明也的确如此。但是受网络延迟以及操作繁琐等影响，对于用户留存以及用户新增有着不小的挑战。</p>
<p>也许你会想 <code>APP</code> 直接读取手机号验证号主身份不就好了嘛？对不起，如果哪家公司公开窃取手机号，离监狱就是负距离。这时三家通讯公司瞄准了这一市场，开放了相关能力，即通过调用运营商的接口，判断用户输入的手机号与本机号码是否一致。但细细一想，用户还是需要填写手机号，如果运营商直接把手机号返回给我们，那该多棒啊！这么一来「一键登录」就诞生了。</p>
<blockquote>
<p>运营商是具备通过 <code>sim</code> 卡数据查询到手机号码的权限以及能力的。</p>
</blockquote>
<p>刚才说到三家运营商开放了相关接口，但是他们毕竟是竞争关系，彼此之间互不兼容，而且提供的优惠以及方式也是不同的。好比移动出了一款4G套餐100分钟500M；联通出了同价位套餐200分钟10G；电信一看不行，出了不限流量。作为用户的我们肯定会根据自身情况选择最合适的，但是一般也是只选其一。不要说你办了三家的卡，而且为了同时使用甚至买了三个手机，如果你是如此土豪，请收下我的膝盖。因此，对于我们应用，集成三家通讯商的 <code>SDK</code> 是不是有点不那么方便以及划算呢？第三方平台便应运而生，比如某蓝（因为他们公司至少有3个推广添加了我的微信，所以我印象颇深）。</p>
<h2 id="2-原理"><a href="#2-原理" class="headerlink" title="2.原理"></a>2.原理</h2><p>作为技术人员，其实最关心的还是实现方式。结合网上各个平台的调用方式，绘制了此图：</p>
<p><img src="/images/%E6%89%8B%E6%9C%BA%E4%B8%80%E9%94%AE%E7%99%BB%E5%BD%95.png" alt="揭秘一键登录"></p>
<p>1) 用户打开 <code>app</code> 请求登录</p>
<p>2) 显示登录， <code>app</code> 通过内置的认证 <code>SDK</code> 向运营商获取手机号码</p>
<p>3) 获取成功时，为用户展示授权页面（就是是否一键登录）</p>
<p>4) 等待用户进行点击授权</p>
<p>5) 用户同意授权</p>
<p>6) <code>SKD</code> 得到授权之后，获取 <code>token</code> ，然后向 <code>app</code> 返回接口调用 <code>token</code></p>
<p>7) <code>app</code> 向 <code>app服务器</code> 传递获取到的 <code>token</code></p>
<p>8) <code>app服务器</code> 拿着客户端传过来的 <code>token</code> 请求 <code>认证服务器</code> 获取手机号码接口</p>
<p>9) <code>认证服务器</code> 返回手机号码给应用服务器</p>
<p>10) 登录成功</p>
<h2 id="3-后话"><a href="#3-后话" class="headerlink" title="3.后话"></a>3.后话</h2><p>虽然一键登录不仅比短信验证码收取的费用便宜相差不大，但是其节省的时间以及简化的操作无疑能增加新用户的注册体验。</p>
<p>对了，还有一点你需要知道，那就是这一操作必须建立在拥有顺畅的网络基础之上。</p>
<blockquote>
<p>三大运营商提供的接口操作对网络要求各不相同，但都<strong>&lt;不支持 <code>WiFi</code> 无线网络&gt;</strong>，最好是 <code>3G</code> +</p>
</blockquote>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>随想</category>
      </categories>
      <tags>
        <tag>网络类</tag>
      </tags>
  </entry>
  <entry>
    <title>关系数据库之存储过程</title>
    <url>/2020/02/25/32.%E5%85%B3%E7%B3%BB%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B9%8B%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B/</url>
    <content><![CDATA[<p>很多人在上学期间，也许并未学习过关系数据库中「存储过程」的相关内容，那今天就来学习一下吧。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>无论是 <code>MySQL</code> 还是 <code>SQL Server</code> 数据库，最新版本都已支持『存储过程』。但是为了通用性，本文章以 <code>MySQL</code> 为例。</p>
<blockquote>
<p>因为 <code>SQL Server</code> 数据库为商业软件，所以其使用率较开源的 <code>MySQL</code> 来说要低一些。对于大数据处理来说， <code>MySQL</code> 更有优势，这就更使得很多中型、大型网站都使用 <code>MySQL</code> 。二者语法上也有些许差别，考虑到学习之后的应用情况，特选 <code>MySQL</code>。</p>
</blockquote>
<h1 id="存储过程"><a href="#存储过程" class="headerlink" title="存储过程"></a>存储过程</h1><h2 id="1-简介"><a href="#1-简介" class="headerlink" title="1.简介"></a>1.简介</h2><p>存储过程『<code>Stored Procedure</code>』是一种在数据库中存储复杂程序，以便外部程序调用的一种数据库对象，即面向对象的思想。它通过编译后存储在数据库中，用户可以像调用函数一样通过特定的方式执行存储过程。</p>
<p>简单来讲，存储过程就是封装了一堆 <code>SQL</code> 语句，方便复用。如此直白，应该不会不理解了。</p>
<h3 id="1-1-优点"><a href="#1-1-优点" class="headerlink" title="1.1 优点"></a>1.1 优点</h3><p>1) 通过封装，隐藏执行的 <code>SQL</code> 语句，以及逻辑操作。</p>
<p>2) 可以像函数一样传递参数，并回传值。</p>
<h3 id="1-2-缺点"><a href="#1-2-缺点" class="headerlink" title="1.2 缺点"></a>1.2 缺点</h3><p>1) 存储过程根据数据库的不同而不同，<strong>移植性弱</strong>。比如切换不同厂商的数据库，由于编程语言的差别，需要重新编译。</p>
<p>2) 无法使用 <code>select</code> 指令来执行，它属于子程序，区别于用户定义的函数。</p>
<h2 id="2-创建和调用"><a href="#2-创建和调用" class="headerlink" title="2.创建和调用"></a>2.创建和调用</h2><p>1) 自定义结束符号。一般在 <code>mysql</code> 中，我们使用封号来结束语句，可以临时修改为其他符号：</p>
<pre class=" language-sql"><code class="language-sql"><span class="token comment" spellcheck="true">-- 将语句的结束符号从分号;临时改为两个$$或//(可以是自定义)</span>
<span class="token keyword">DELIMITER</span> $$
或
<span class="token keyword">DELIMITER</span> <span class="token comment" spellcheck="true">//</span></code></pre>
<p>2) 创建存储过程</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">CREATE</span> <span class="token keyword">PROCEDURE</span> 存储过程名称<span class="token punctuation">(</span>参数<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> </code></pre>
<p>3) 一个存储过程开始与结束符号</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">BEGIN</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">END</span> </code></pre>
<p>4) 创建存储函数</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">create</span> <span class="token keyword">function</span> 存储函数名称<span class="token punctuation">(</span>参数<span class="token punctuation">)</span></code></pre>
<p>5) 调用存储过程</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">call</span> 存储过程名称<span class="token punctuation">(</span>参数<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>6) 存储过程体以 <code>begin</code> 开始，以 <code>end</code> 结束，当然，这是可以嵌套的。</p>
<blockquote>
<p>注意：每个嵌套块以及其中的每条语句，都必须以封号结尾，最外层（表示过程体结束的 <code>begin-end</code> 块不需要写）</p>
</blockquote>
<p>7) 为每一个语句块打标签，可以增强可读性，并不易丢掉过多嵌套块中的某个结尾。</p>
<pre class=" language-sql"><code class="language-sql">label1: <span class="token keyword">BEGIN</span>
　　label2: <span class="token keyword">BEGIN</span>
　　　　label3: <span class="token keyword">BEGIN</span>
　　　　　　statements<span class="token punctuation">;</span> 
　　　　<span class="token keyword">END</span> label3 <span class="token punctuation">;</span>
　　<span class="token keyword">END</span> label2<span class="token punctuation">;</span>
<span class="token keyword">END</span> label1</code></pre>
<h3 id="2-1-示例"><a href="#2-1-示例" class="headerlink" title="2.1 示例"></a>2.1 示例</h3><pre class=" language-sql"><code class="language-sql">mysql<span class="token operator">></span> <span class="token keyword">delimiter</span> $$　　<span class="token comment" spellcheck="true">-- 将语句的结束符号从分号;临时改为两个$$(可以是自定义)</span>
mysql<span class="token operator">></span> <span class="token keyword">CREATE</span> <span class="token keyword">PROCEDURE</span> delete_matches<span class="token punctuation">(</span><span class="token operator">IN</span> p_playerno <span class="token keyword">INTEGER</span><span class="token punctuation">)</span>
    <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">BEGIN</span>
    <span class="token operator">-</span><span class="token operator">></span> 　　<span class="token keyword">DELETE</span> <span class="token keyword">FROM</span> MATCHES
    <span class="token operator">-</span><span class="token operator">></span>    <span class="token keyword">WHERE</span> playerno <span class="token operator">=</span> p_playerno<span class="token punctuation">;</span>
    <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">END</span>$$
Query OK<span class="token punctuation">,</span> <span class="token number">0</span> <span class="token keyword">rows</span> affected <span class="token punctuation">(</span><span class="token number">0.01</span> sec<span class="token punctuation">)</span>

mysql<span class="token operator">></span> <span class="token keyword">delimiter</span><span class="token punctuation">;</span>　　<span class="token comment" spellcheck="true">-- 将语句的结束符号恢复为分号</span></code></pre>
<p>上面的存储过程解读：存储过程名为「<code>delete_matches</code>」；存储过程需要传入的参数为 <code>INTEGER</code> 类型的 <code>p_playerno</code> （球员编号）；由 <code>BEGIN</code> 表示过程体开始，执行的语句为删除 <code>MATCHES</code> 表中字段 <code>playerno</code> 的值等于传入参数值的记录。以 <code>END</code> 表示过程体结束。</p>
<p>调用这一存储过程时：</p>
<pre class=" language-sql"><code class="language-sql">mysql<span class="token operator">></span> <span class="token keyword">call</span> delete_matches<span class="token punctuation">(</span><span class="token number">57</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Query OK<span class="token punctuation">,</span> <span class="token number">1</span> <span class="token keyword">row</span> affected <span class="token punctuation">(</span><span class="token number">0.03</span> sec<span class="token punctuation">)</span></code></pre>
<h2 id="3-参数"><a href="#3-参数" class="headerlink" title="3.参数"></a>3.参数</h2><p>从示例中我们可以看到传入参数表示为：</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">CREATE</span> <span class="token keyword">PROCEDURE</span> delete_matches<span class="token punctuation">(</span><span class="token operator">IN</span> p_playerno <span class="token keyword">INTEGER</span><span class="token punctuation">)</span></code></pre>
<p>已知参数名称与参数类型，那么括号中 <code>IN</code> 代表什么意思呢？</p>
<p>答： <code>IN</code> 代表传入参数，也就是调用存储过程时，向存储过程内传入值。</p>
<p>除此之外还有另外两个参数：<code>OUT</code> 和 <code>INOUT</code></p>
<p><code>OUT</code> ：传出参数，也就是存储过程向调用者传出值。类似于程序中的 <code>return</code></p>
<p><code>INOUT</code>：传入传出参数，比如传入一个值，存储过程中引用后再修改，向调用者传出新值。</p>
<p><strong>变量赋值：</strong></p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">SET</span> @变量<span class="token operator">=</span>值</code></pre>
<h3 id="3-1-in"><a href="#3-1-in" class="headerlink" title="3.1 in"></a>3.1 in</h3><pre class=" language-sql"><code class="language-sql">mysql<span class="token operator">></span> <span class="token keyword">delimiter</span> $$ <span class="token comment" spellcheck="true">-- 将语句的结束符号从分号;临时改为两个$$(可以是自定义)</span>
mysql<span class="token operator">></span> <span class="token keyword">create</span> <span class="token keyword">procedure</span> in_param<span class="token punctuation">(</span><span class="token operator">in</span> p_in <span class="token keyword">int</span><span class="token punctuation">)</span>
    <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">begin</span>
    <span class="token operator">-</span><span class="token operator">></span> 　　<span class="token keyword">select</span> p_in<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">-- 查询传入的变量</span>
    <span class="token operator">-</span><span class="token operator">></span> 　　<span class="token keyword">set</span> p_in<span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">-- 重新设置变量</span>
    <span class="token operator">-</span><span class="token operator">></span>    <span class="token keyword">select</span> P_in<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">-- 查询修改后的变量</span>
    <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">end</span>$$
mysql<span class="token operator">></span> <span class="token keyword">delimiter</span> <span class="token punctuation">;</span>

mysql<span class="token operator">></span> <span class="token keyword">set</span> <span class="token variable">@p_in</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">--设置全局变量</span>

mysql<span class="token operator">></span> <span class="token keyword">call</span> in_param<span class="token punctuation">(</span><span class="token variable">@p_in</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">-- 调用存储过程，传入设置的变量值</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">------+</span>
<span class="token operator">|</span> p_in <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">------+</span>
<span class="token operator">|</span>    <span class="token number">1</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">------+</span>

<span class="token operator">+</span><span class="token comment" spellcheck="true">------+</span>
<span class="token operator">|</span> P_in <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">------+</span>
<span class="token operator">|</span>    <span class="token number">2</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">------+</span>

mysql<span class="token operator">></span> <span class="token keyword">select</span> <span class="token variable">@p_in</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">-- 查询全局变量</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">-------+</span>
<span class="token operator">|</span> <span class="token variable">@p_in</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">-------+</span>
<span class="token operator">|</span>     <span class="token number">1</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">-------+</span></code></pre>
<blockquote>
<p>以上可以看出，<code>p_in</code> 在存储过程中被修改，但并不影响 <code>@p_in</code> 的值，因为前者为局部变量、后者为全局变量。</p>
</blockquote>
<h3 id="3-2-out"><a href="#3-2-out" class="headerlink" title="3.2 out"></a>3.2 out</h3><pre class=" language-sql"><code class="language-sql">mysql<span class="token operator">></span> <span class="token keyword">delimiter</span> <span class="token comment" spellcheck="true">//</span>
mysql<span class="token operator">></span> <span class="token keyword">create</span> <span class="token keyword">procedure</span> out_param<span class="token punctuation">(</span><span class="token keyword">out</span> p_out <span class="token keyword">int</span><span class="token punctuation">)</span>
    <span class="token operator">-</span><span class="token operator">></span>   <span class="token keyword">begin</span>
    <span class="token operator">-</span><span class="token operator">></span>     <span class="token keyword">select</span> p_out<span class="token punctuation">;</span>
    <span class="token operator">-</span><span class="token operator">></span>     <span class="token keyword">set</span> p_out<span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">;</span>
    <span class="token operator">-</span><span class="token operator">></span>     <span class="token keyword">select</span> p_out<span class="token punctuation">;</span>
    <span class="token operator">-</span><span class="token operator">></span>   <span class="token keyword">end</span>
    <span class="token operator">-</span><span class="token operator">></span> <span class="token comment" spellcheck="true">//</span>
mysql<span class="token operator">></span> <span class="token keyword">delimiter</span> <span class="token punctuation">;</span>

mysql<span class="token operator">></span> <span class="token keyword">set</span> <span class="token variable">@p_out</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>

mysql<span class="token operator">></span> <span class="token keyword">call</span> out_param<span class="token punctuation">(</span><span class="token variable">@p_out</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">-------+</span>
<span class="token operator">|</span> p_out <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">-------+</span>
<span class="token operator">|</span>  <span class="token boolean">NULL</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">-------+</span>
<span class="token comment" spellcheck="true">-- 因为out是向调用者输出参数，不接收输入的参数，所以存储过程里的p_out为null</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">-------+</span>
<span class="token operator">|</span> p_out <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">-------+</span>
<span class="token operator">|</span>     <span class="token number">2</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">-------+</span>

mysql<span class="token operator">></span> <span class="token keyword">select</span> <span class="token variable">@p_out</span><span class="token punctuation">;</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">--------+</span>
<span class="token operator">|</span> <span class="token variable">@p_out</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">--------+</span>
<span class="token operator">|</span>      <span class="token number">2</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">--------+</span>
<span class="token comment" spellcheck="true">-- 调用了out_param存储过程，输出参数，改变了p_out变量的值</span></code></pre>
<h3 id="3-3-inout"><a href="#3-3-inout" class="headerlink" title="3.3 inout"></a>3.3 inout</h3><pre class=" language-sql"><code class="language-sql">mysql<span class="token operator">></span> <span class="token keyword">delimiter</span> $$
mysql<span class="token operator">></span> <span class="token keyword">create</span> <span class="token keyword">procedure</span> inout_param<span class="token punctuation">(</span><span class="token keyword">inout</span> p_inout <span class="token keyword">int</span><span class="token punctuation">)</span>
    <span class="token operator">-</span><span class="token operator">></span>   <span class="token keyword">begin</span>
    <span class="token operator">-</span><span class="token operator">></span>     <span class="token keyword">select</span> p_inout<span class="token punctuation">;</span>
    <span class="token operator">-</span><span class="token operator">></span>     <span class="token keyword">set</span> p_inout<span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">;</span>
    <span class="token operator">-</span><span class="token operator">></span>     <span class="token keyword">select</span> p_inout<span class="token punctuation">;</span>
    <span class="token operator">-</span><span class="token operator">></span>   <span class="token keyword">end</span>
    <span class="token operator">-</span><span class="token operator">></span> $$
mysql<span class="token operator">></span> <span class="token keyword">delimiter</span> <span class="token punctuation">;</span>

mysql<span class="token operator">></span> <span class="token keyword">set</span> <span class="token variable">@p_inout</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>

mysql<span class="token operator">></span> <span class="token keyword">call</span> inout_param<span class="token punctuation">(</span><span class="token variable">@p_inout</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">---------+</span>
<span class="token operator">|</span> p_inout <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">---------+</span>
<span class="token operator">|</span>       <span class="token number">1</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">---------+</span>

<span class="token operator">+</span><span class="token comment" spellcheck="true">---------+</span>
<span class="token operator">|</span> p_inout <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">---------+</span>
<span class="token operator">|</span>       <span class="token number">2</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">---------+</span>

mysql<span class="token operator">></span> <span class="token keyword">select</span> <span class="token variable">@p_inout</span><span class="token punctuation">;</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">----------+</span>
<span class="token operator">|</span> <span class="token variable">@p_inout</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">----------+</span>
<span class="token operator">|</span>        <span class="token number">2</span> <span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment" spellcheck="true">----------+</span>
<span class="token comment" spellcheck="true">-- 调用了inout_param存储过程，接受了输入的参数，也输出参数，改变了变量</span></code></pre>
<h2 id="4-变量"><a href="#4-变量" class="headerlink" title="4.变量"></a>4.变量</h2><h3 id="4-1-变量声明"><a href="#4-1-变量声明" class="headerlink" title="4.1 变量声明"></a>4.1 变量声明</h3><pre class=" language-sql"><code class="language-sql"><span class="token keyword">DECLARE</span> variable_name <span class="token punctuation">[</span><span class="token punctuation">,</span>variable_name<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">]</span> datatype <span class="token punctuation">[</span><span class="token keyword">DEFAULT</span> <span class="token keyword">value</span><span class="token punctuation">]</span><span class="token punctuation">;</span></code></pre>
<blockquote>
<p>注意：局部变量声明一定要放置在存储过程体的开始。</p>
<p><code>datatype</code> 为 <code>MySQL</code> 的数据类型，如： <code>int</code>，<code>float</code>， <code>date</code>，<code>varchar(length)</code></p>
</blockquote>
<p><strong>示例：</strong></p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">DECLARE</span> l_int <span class="token keyword">int</span> unsigned <span class="token keyword">default</span> <span class="token number">4000000</span><span class="token punctuation">;</span>  
<span class="token keyword">DECLARE</span> l_numeric number<span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token keyword">DEFAULT</span> <span class="token number">9.95</span><span class="token punctuation">;</span>  
<span class="token keyword">DECLARE</span> l_date <span class="token keyword">date</span> <span class="token keyword">DEFAULT</span> <span class="token string">'1999-12-31'</span><span class="token punctuation">;</span>  
<span class="token keyword">DECLARE</span> l_datetime <span class="token keyword">datetime</span> <span class="token keyword">DEFAULT</span> <span class="token string">'1999-12-31 23:59:59'</span><span class="token punctuation">;</span>  
<span class="token keyword">DECLARE</span> l_varchar <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">DEFAULT</span> <span class="token string">'This will not be padded'</span><span class="token punctuation">;</span></code></pre>
<blockquote>
<p><code>unsigned</code> 就是将数字类型无符号化</p>
</blockquote>
<h3 id="4-2-变量赋值"><a href="#4-2-变量赋值" class="headerlink" title="4.2 变量赋值"></a>4.2 变量赋值</h3><pre class=" language-sql"><code class="language-sql"><span class="token keyword">SET</span> 变量名 <span class="token operator">=</span> 表达式值 <span class="token punctuation">[</span><span class="token punctuation">,</span>variable_name <span class="token operator">=</span> expression <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">]</span></code></pre>
<h3 id="4-3-用户变量"><a href="#4-3-用户变量" class="headerlink" title="4.3 用户变量"></a>4.3 用户变量</h3><p>大家一定会有些迷惑，为什么有些变量是直接为变量名赋值，而有些变量则需要在变量名前加 <code>@</code> 呢？那是因为添加后，变为了用户变量名。</p>
<pre class=" language-sql"><code class="language-sql">mysql <span class="token operator">></span> <span class="token keyword">SET</span> <span class="token variable">@name</span><span class="token operator">=</span><span class="token string">'Ethan Yan'</span><span class="token punctuation">;</span>  
mysql <span class="token operator">></span> <span class="token keyword">SELECT</span> <span class="token variable">@name</span><span class="token punctuation">;</span>  
<span class="token operator">+</span><span class="token comment" spellcheck="true">---------------------+  </span>
<span class="token operator">|</span>      <span class="token variable">@name</span>          <span class="token operator">|</span>  
<span class="token operator">+</span><span class="token comment" spellcheck="true">---------------------+  </span>
<span class="token operator">|</span>      Ethan Yan      <span class="token operator">|</span>  
<span class="token operator">+</span><span class="token comment" spellcheck="true">---------------------+  </span></code></pre>
<p>在存储过程中使用用户变量：</p>
<pre class=" language-sql"><code class="language-sql">mysql <span class="token operator">></span> <span class="token keyword">CREATE</span> <span class="token keyword">PROCEDURE</span> GreetWorld<span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">SELECT</span> CONCAT<span class="token punctuation">(</span><span class="token variable">@greeting</span><span class="token punctuation">,</span><span class="token string">' World'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
mysql <span class="token operator">></span> <span class="token keyword">SET</span> <span class="token variable">@greeting</span><span class="token operator">=</span><span class="token string">'Hello'</span><span class="token punctuation">;</span>  
mysql <span class="token operator">></span> <span class="token keyword">CALL</span> GreetWorld<span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>  
<span class="token operator">+</span><span class="token comment" spellcheck="true">----------------------------+  </span>
<span class="token operator">|</span> CONCAT<span class="token punctuation">(</span><span class="token variable">@greeting</span><span class="token punctuation">,</span><span class="token string">' World'</span><span class="token punctuation">)</span> <span class="token operator">|</span>  
<span class="token operator">+</span><span class="token comment" spellcheck="true">----------------------------+  </span>
<span class="token operator">|</span>  Hello World               <span class="token operator">|</span>  
<span class="token operator">+</span><span class="token comment" spellcheck="true">----------------------------+</span></code></pre>
<h2 id="5-注释"><a href="#5-注释" class="headerlink" title="5.注释"></a>5.注释</h2><p>单行注视：<code>--</code></p>
<p>多行注视：</p>
<pre class=" language-sql"><code class="language-sql"><span class="token comment" spellcheck="true">/* 
此处为多行注释
*/</span></code></pre>
<h2 id="6-常用操作"><a href="#6-常用操作" class="headerlink" title="6.常用操作"></a>6.常用操作</h2><h3 id="6-1-MySQL-存储过程的查询"><a href="#6-1-MySQL-存储过程的查询" class="headerlink" title="6.1 MySQL 存储过程的查询"></a>6.1 MySQL 存储过程的查询</h3><p>1) 查询数据库中的所有存储过程</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">select</span> name <span class="token keyword">from</span> mysql<span class="token punctuation">.</span><span class="token keyword">proc</span> <span class="token keyword">where</span> <span class="token number">db</span><span class="token operator">=</span><span class="token string">'数据库名'</span><span class="token punctuation">;</span>

或者

<span class="token keyword">select</span> routine_name <span class="token keyword">from</span> information_schema<span class="token punctuation">.</span>routines <span class="token keyword">where</span> routine_schema<span class="token operator">=</span><span class="token string">'数据库名'</span><span class="token punctuation">;</span>

或者

<span class="token keyword">show</span> <span class="token keyword">procedure</span> <span class="token keyword">status</span> <span class="token keyword">where</span> <span class="token number">db</span><span class="token operator">=</span><span class="token string">'数据库名'</span><span class="token punctuation">;</span></code></pre>
<p>2) 查询某个存储过程详细内容</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">SHOW</span> <span class="token keyword">CREATE</span> <span class="token keyword">PROCEDURE</span> 数据库<span class="token punctuation">.</span>存储过程名<span class="token punctuation">;</span></code></pre>
<h3 id="6-2-MySQL-存储过程的修改"><a href="#6-2-MySQL-存储过程的修改" class="headerlink" title="6.2 MySQL 存储过程的修改"></a>6.2 MySQL 存储过程的修改</h3><pre class=" language-sql"><code class="language-sql"><span class="token keyword">ALTER</span> <span class="token keyword">PROCEDURE</span></code></pre>
<h3 id="6-3-MySQL-存储过程的删除"><a href="#6-3-MySQL-存储过程的删除" class="headerlink" title="6.3 MySQL 存储过程的删除"></a>6.3 MySQL 存储过程的删除</h3><pre class=" language-sql"><code class="language-sql"><span class="token keyword">DROP</span> <span class="token keyword">PROCEDURE</span></code></pre>
<h3 id="6-4-MySQL-存储过程的控制语句"><a href="#6-4-MySQL-存储过程的控制语句" class="headerlink" title="6.4 MySQL 存储过程的控制语句"></a>6.4 MySQL 存储过程的控制语句</h3><p>1) <strong>变量作用域：</strong>局部变量在存储过程内优先级高，当执行到 <code>END</code> 时，局部变量消失。如果不想消失，可以通过参数 <code>OUT</code> 将其传出给调用者。</p>
<p>2) <strong>条件语句1：</strong> <code>if-then-else</code></p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">if</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">then</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">;</span>
<span class="token keyword">else</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">;</span>
<span class="token keyword">end</span> <span class="token keyword">if</span><span class="token punctuation">;</span></code></pre>
<p>3) <strong>条件语句2：</strong> <code>case</code> </p>
<pre class=" language-sql"><code class="language-sql">mysql <span class="token operator">></span> <span class="token keyword">DELIMITER</span> <span class="token comment" spellcheck="true">//  </span>
mysql <span class="token operator">></span> <span class="token keyword">CREATE</span> <span class="token keyword">PROCEDURE</span> proc3 <span class="token punctuation">(</span><span class="token operator">in</span> parameter <span class="token keyword">int</span><span class="token punctuation">)</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">begin</span> 
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">declare</span> var <span class="token keyword">int</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">set</span> var<span class="token operator">=</span>parameter<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">case</span> var  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">when</span> <span class="token number">0</span> <span class="token keyword">then</span>   
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">insert</span> <span class="token keyword">into</span> t <span class="token keyword">values</span><span class="token punctuation">(</span><span class="token number">17</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">when</span> <span class="token number">1</span> <span class="token keyword">then</span>   
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">insert</span> <span class="token keyword">into</span> t <span class="token keyword">values</span><span class="token punctuation">(</span><span class="token number">18</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">else</span>   
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">insert</span> <span class="token keyword">into</span> t <span class="token keyword">values</span><span class="token punctuation">(</span><span class="token number">19</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">end</span> <span class="token keyword">case</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">end</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token comment" spellcheck="true">//  </span>
mysql <span class="token operator">></span> <span class="token keyword">DELIMITER</span> <span class="token punctuation">;</span> 
<span class="token keyword">case</span>
    <span class="token keyword">when</span> var<span class="token operator">=</span><span class="token number">0</span> <span class="token keyword">then</span>
        <span class="token keyword">insert</span> <span class="token keyword">into</span> t <span class="token keyword">values</span><span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">when</span> var<span class="token operator">></span><span class="token number">0</span> <span class="token keyword">then</span>
    <span class="token keyword">when</span> var<span class="token operator">&lt;</span><span class="token number">0</span> <span class="token keyword">then</span>
    <span class="token keyword">else</span>
<span class="token keyword">end</span> <span class="token keyword">case</span></code></pre>
<p>4) 循环语句1 <code>while ···· end while</code></p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">while</span> 条件 <span class="token keyword">do</span>
    <span class="token comment" spellcheck="true">--循环体</span>
endwhile</code></pre>
<p>5) 循环语句2 <code>repeat···· end repea</code></p>
<pre class=" language-sql"><code class="language-sql">repeat
    <span class="token comment" spellcheck="true">--循环体</span>
until 循环条件  
<span class="token keyword">end</span> repeat<span class="token punctuation">;</span></code></pre>
<p>6) 循环语句3 <code>loop ·····endloop</code></p>
<p><code>loop</code> 循环不需要初始条件，这点和 <code>while</code> 循环相似，同时和 <code>repeat</code>循环一样不需要结束条件,<code>leave</code> 语句的意义是离开循环。</p>
<pre class=" language-sql"><code class="language-sql">mysql <span class="token operator">></span> <span class="token keyword">DELIMITER</span> <span class="token comment" spellcheck="true">//  </span>
mysql <span class="token operator">></span> <span class="token keyword">CREATE</span> <span class="token keyword">PROCEDURE</span> proc6 <span class="token punctuation">(</span><span class="token punctuation">)</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">begin</span> 
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">declare</span> v <span class="token keyword">int</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">set</span> v<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> LOOP_LABLE:loop  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">insert</span> <span class="token keyword">into</span> t <span class="token keyword">values</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">set</span> v<span class="token operator">=</span>v<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">if</span> v <span class="token operator">>=</span><span class="token number">5</span> <span class="token keyword">then</span> 
     <span class="token operator">-</span><span class="token operator">></span> leave LOOP_LABLE<span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">end</span> <span class="token keyword">if</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">end</span> loop<span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">end</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token comment" spellcheck="true">//  </span>
mysql <span class="token operator">></span> <span class="token keyword">DELIMITER</span> <span class="token punctuation">;</span></code></pre>
<blockquote>
<p><code>LABLES</code> 标号：标号可以用在<code>begin</code> <code>repeat</code> <code>while</code> 或者 <code>loop</code> 语句前，语句标号只能在合法的语句前面使用。可以跳出循环，使运行指令达到复合语句的最后一步。</p>
</blockquote>
<p>7) 迭代</p>
<p><code>ITERATE</code> 通过引用复合语句的标号，来从新开始复合语句：</p>
<pre class=" language-sql"><code class="language-sql">mysql <span class="token operator">></span> <span class="token keyword">DELIMITER</span> <span class="token comment" spellcheck="true">//  </span>
mysql <span class="token operator">></span> <span class="token keyword">CREATE</span> <span class="token keyword">PROCEDURE</span> proc10 <span class="token punctuation">(</span><span class="token punctuation">)</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">begin</span> 
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">declare</span> v <span class="token keyword">int</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">set</span> v<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> LOOP_LABLE:loop  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">if</span> v<span class="token operator">=</span><span class="token number">3</span> <span class="token keyword">then</span>   
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">set</span> v<span class="token operator">=</span>v<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> ITERATE LOOP_LABLE<span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">end</span> <span class="token keyword">if</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">insert</span> <span class="token keyword">into</span> t <span class="token keyword">values</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">set</span> v<span class="token operator">=</span>v<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">if</span> v<span class="token operator">>=</span><span class="token number">5</span> <span class="token keyword">then</span> 
     <span class="token operator">-</span><span class="token operator">></span> leave LOOP_LABLE<span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">end</span> <span class="token keyword">if</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">end</span> loop<span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">end</span><span class="token punctuation">;</span>  
     <span class="token operator">-</span><span class="token operator">></span> <span class="token comment" spellcheck="true">//  </span>
mysql <span class="token operator">></span> <span class="token keyword">DELIMITER</span> <span class="token punctuation">;</span></code></pre>
<blockquote>
<p>参考文章：</p>
<p><a href="https://www.cnblogs.com/geaozhang/p/6797357.html" target="_blank" rel="noopener">https://www.cnblogs.com/geaozhang/p/6797357.html</a></p>
<p><a href="http://blog.sina.com.cn/s/blog_86fe5b440100wdyt.html" target="_blank" rel="noopener">http://blog.sina.com.cn/s/blog_86fe5b440100wdyt.html</a></p>
</blockquote>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>数据结构与算法之排序</title>
    <url>/2020/02/15/6.%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E4%B9%8B%E6%8E%92%E5%BA%8F/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p><strong>排序的归纳以及时间复杂度表</strong><br><img src="https://i.loli.net/2020/03/23/7KQYAkbX4RwBgml.png" alt="排序时间复杂度"></p>
<h3 id="冒泡排序"><a href="#冒泡排序" class="headerlink" title="冒泡排序"></a>冒泡排序</h3><p><strong>冒泡排序是一个比较简单的排序，它是一次比较相邻两个元素的值，如何顺序错误就交换两个数的位置，一直到没有交换的数为止，排序结束。</strong></p>
<p><strong>若对n个数进行排序，我们需要n-1次比较，所以第k次比较需要进行n-k次比较。</strong>&gt;</p>
<blockquote>
<p>排序算法通过以数据对象的两两比较作为关键所以可以得出，冒泡排序需要进行的比较次数为：(n-1) + (n-2) + … + 1 = n<em>(n-1) / 2。<br>因此冒泡排序的  *</em>时间复杂度为O(n^2)**</p>
</blockquote>
<p><strong>算法</strong></p>
<ol>
<li>比较相邻的元素，前一个比后一个大（或者前一个比后一个小）调换位置</li>
<li>每一对相邻的元素进行重复的工作，从开始对一直到结尾对，这步完成后，结尾为做大或最小的数</li>
<li>针对除了最后一个元素重复进行上面的步骤。</li>
<li>重复1-3步骤直到完成排序</li>
</ol>
<p>动图演示：<br><img src="https://i.loli.net/2020/03/23/GZTE1u4xNa5sO3U.gif" alt="演示1"></p>
<pre class=" language-c"><code class="language-c"><span class="token comment" spellcheck="true">//冒泡排序 从小到大</span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span>

<span class="token keyword">void</span> <span class="token function">bubble_sort</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">*</span>arr<span class="token punctuation">,</span> <span class="token keyword">int</span> n<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> i<span class="token punctuation">,</span>j<span class="token punctuation">;</span>
     <span class="token keyword">for</span><span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> n<span class="token number">-1</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
     <span class="token punctuation">{</span>
          <span class="token keyword">for</span><span class="token punctuation">(</span>j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> n<span class="token operator">-</span>i<span class="token number">-1</span><span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span>
          <span class="token punctuation">{</span>
               <span class="token keyword">if</span><span class="token punctuation">(</span>arr<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">></span> arr<span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
               <span class="token punctuation">{</span>
                    <span class="token keyword">int</span> tmp <span class="token operator">=</span> arr<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span>
                    arr<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> arr<span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
                    arr<span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> tmp<span class="token punctuation">;</span>
               <span class="token punctuation">}</span> 
          <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> i<span class="token punctuation">;</span>
     <span class="token keyword">int</span> arr<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token number">8</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
     <span class="token keyword">int</span> n <span class="token operator">=</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token function">bubble_sort</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token keyword">for</span><span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
     <span class="token punctuation">{</span>
          <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d "</span><span class="token punctuation">,</span>arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token punctuation">}</span>
     <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p><strong>程序运行结果</strong><br><img src="https://i.loli.net/2020/03/23/kNrH89mGM3LPRXT.png" alt="冒泡排序"></p>
<h3 id="选择排序"><a href="#选择排序" class="headerlink" title="选择排序"></a>选择排序</h3><blockquote>
<p>选择排序共需要的比较次数为n*(n-1) / 2，因此选择排序算法的时间复杂度与冒泡排序一样，也为O(n^2)</p>
</blockquote>
<p><strong>算法简介：</strong></p>
<ol>
<li><p>初始状态：序列为无序状态。</p>
</li>
<li><p>第1次排序：从n个元素中找出最小(大)元素与第1个记录交换</p>
</li>
<li><p>第2次排序：从n-1个元素中找出最小(大)元素与第2个记录交换</p>
</li>
<li><p>第i次排序：从n-i+1个元素中找出最小(大)元素与第i个记录交换</p>
</li>
<li><p>以此类推直到排序完成</p>
<p>动图演示<br><img src="https://i.loli.net/2020/03/23/GZTE1u4xNa5sO3U.gif" alt="演示2"></p>
</li>
</ol>
<pre class=" language-c"><code class="language-c"><span class="token comment" spellcheck="true">//选择排序 从大到小</span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span>
<span class="token comment" spellcheck="true">//函数申明</span>
<span class="token keyword">void</span> <span class="token function">choice</span> <span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">*</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> n <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">void</span> <span class="token function">show</span> <span class="token punctuation">(</span> <span class="token keyword">int</span> <span class="token operator">*</span>a<span class="token punctuation">,</span> <span class="token keyword">int</span> n <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">int</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> arr<span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">,</span><span class="token number">8</span><span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token function">show</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">choice</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">show</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment" spellcheck="true">//选择排序</span>
<span class="token keyword">void</span> <span class="token function">choice</span> <span class="token punctuation">(</span> <span class="token keyword">int</span> <span class="token operator">*</span>a<span class="token punctuation">,</span> <span class="token keyword">int</span> n <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> i <span class="token punctuation">,</span> j <span class="token punctuation">,</span>tmp<span class="token punctuation">;</span>
    <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> n <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
       <span class="token keyword">for</span> <span class="token punctuation">(</span>j <span class="token operator">=</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> n<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span>
       <span class="token punctuation">{</span>
           <span class="token keyword">if</span> <span class="token punctuation">(</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">&lt;</span> a<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span>
           <span class="token punctuation">{</span>
             tmp <span class="token operator">=</span> a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>
             a<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> a<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span>
             a<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> tmp<span class="token punctuation">;</span>
           <span class="token punctuation">}</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token comment" spellcheck="true">//显示</span>
<span class="token keyword">void</span> <span class="token function">show</span> <span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">*</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> n<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token function">printf</span> <span class="token punctuation">(</span><span class="token string">"%d "</span><span class="token punctuation">,</span> a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>运行结果<br><img src="https://i.loli.net/2020/03/23/FcuD1isKLjmSqVT.png" alt="运行结果"> </p>
<h3 id="插入排序"><a href="#插入排序" class="headerlink" title="插入排序"></a>插入排序</h3><blockquote>
<p>插入排序是一个比较直观的算法，对于n个元素，一共需要进行n-1轮比较，而第k轮比较需要进行k次数组元素的两两比较，因此共需要进行的比较次数为：1 + 2 + … + (n-1)，所以插入排序的时间复杂度同冒泡排序一样，也为O(n^2)</p>
</blockquote>
<p><strong>算法简介：</strong></p>
<ol>
<li>从第一个元素开始，该元素可认为已排序。</li>
<li>取出下一个元素，在排序好的元素序列中从后往前扫描</li>
<li>如果元素(已排序)大于新元素，将该元素移到下一位置</li>
<li>重复3.直到找到已排序的元素小于或等于新元素的位置</li>
<li>将新元素插入该位置后</li>
<li>重复2-5直到排序完成</li>
</ol>
<p><strong>动图演示</strong><br> <img src="https://i.loli.net/2020/03/23/xJ8Z5zAPDG1yawm.gif" alt="演示3"></p>
<p><strong>代码部分</strong></p>
<pre class=" language-c"><code class="language-c"><span class="token comment" spellcheck="true">//插入排序(从小到大) </span>
<span class="token macro property">#<span class="token directive keyword">include</span><span class="token string">&lt;stdio.h></span></span>

<span class="token comment" spellcheck="true">//定义一个插入函数"insertion_sort" </span>
<span class="token keyword">void</span> <span class="token function">insertion_sort</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">*</span>number<span class="token punctuation">,</span><span class="token keyword">int</span> n<span class="token punctuation">)</span>    
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span>ii<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span>temp<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>  
     <span class="token comment" spellcheck="true">//循环遍历 </span>
    <span class="token keyword">for</span><span class="token punctuation">(</span>i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator">&lt;</span>n<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> 
    <span class="token punctuation">{</span>
        <span class="token comment" spellcheck="true">//将temp每一次赋值为number[i] </span>
        temp<span class="token operator">=</span>number<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>  
        ii<span class="token operator">=</span>i<span class="token number">-1</span><span class="token punctuation">;</span>  
        <span class="token comment" spellcheck="true">//这里改顺序 (temp后的)"&lt;"为小到大，">"为大到小 ！！！</span>
        <span class="token keyword">while</span><span class="token punctuation">(</span>ii<span class="token operator">>=</span><span class="token number">0</span><span class="token operator">&amp;&amp;</span>temp<span class="token operator">&lt;</span>number<span class="token punctuation">[</span>ii<span class="token punctuation">]</span><span class="token punctuation">)</span>   
        <span class="token punctuation">{</span>
            <span class="token comment" spellcheck="true">//将大的元素往前放 </span>
            number<span class="token punctuation">[</span>ii<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">=</span>number<span class="token punctuation">[</span>ii<span class="token punctuation">]</span><span class="token punctuation">;</span>   
            ii<span class="token operator">--</span><span class="token punctuation">;</span> 
        <span class="token punctuation">}</span>
        number<span class="token punctuation">[</span>ii<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">=</span>temp<span class="token punctuation">;</span>   <span class="token comment" spellcheck="true">//与"number[ii+1]=number[ii];"一起意为 </span>
    <span class="token punctuation">}</span>              <span class="token comment" spellcheck="true">//如果插入的数比之前的大,将number[ii]与number[ii+1]互换 </span>
<span class="token punctuation">}</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> 
<span class="token punctuation">{</span>
   <span class="token keyword">int</span> i<span class="token punctuation">;</span>
  <span class="token keyword">int</span> arr<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token number">8</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
  <span class="token keyword">int</span> n <span class="token operator">=</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">insertion_sort</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">for</span><span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
  <span class="token punctuation">{</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d "</span><span class="token punctuation">,</span>arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>运行结果<br><img src="https://i.loli.net/2020/03/23/Je2jSTp85luKMZt.png" alt="运行结果"></p>
<hr>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>算法类</tag>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>单片机开发板引脚图</title>
    <url>/2020/02/12/5.%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91%E6%9D%BF%E5%BC%95%E8%84%9A%E5%9B%BE/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="Arduino-开发板引脚图"><a href="#Arduino-开发板引脚图" class="headerlink" title="Arduino 开发板引脚图"></a>Arduino 开发板引脚图</h2><p><img src="https://i.loli.net/2020/03/23/RtHcZmr7dW5ljJ1.png" alt="1"><br><img src="https://i.loli.net/2020/03/23/YTt1iCPKv9AxVLr.png" alt="2"></p>
<p><img src="https://i.loli.net/2020/03/23/XnrG3CcTbEVhYPJ.png" alt="3"><br><img src="https://i.loli.net/2020/03/23/qjebOdw6RU9vaiL.png" alt="4"></p>
<h2 id="esp8266-引脚图"><a href="#esp8266-引脚图" class="headerlink" title="esp8266 引脚图"></a>esp8266 引脚图</h2><p><img src="https://i.loli.net/2020/03/23/HwY2Ao1W9UfmcQJ.png" alt="5"></p>
<p><img src="https://i.loli.net/2020/03/23/uqnUV62XZw13ghG.png" alt="6"></p>
<h2 id="STC89C51单片机引脚图"><a href="#STC89C51单片机引脚图" class="headerlink" title="STC89C51单片机引脚图"></a>STC89C51单片机引脚图</h2><p><img src="https://i.loli.net/2020/03/23/PQxlYmaVji6D4rF.png" alt="7"></p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>关系数据库之视图</title>
    <url>/2020/02/10/33.%E5%85%B3%E7%B3%BB%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B9%8B%E8%A7%86%E5%9B%BE/</url>
    <content><![CDATA[<p>请问视图是什么？视图相关语句有哪些？视图在什么场景下使用？夺命三连</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>对于关系数据库来说，绕不开的一个概念便是『视图』，带着篇首的几个问题，我们来认真学习一下。</p>
<h2 id="视图是什么"><a href="#视图是什么" class="headerlink" title="视图是什么"></a>视图是什么</h2><p>官方文档中如此描述视图：A view is a stored SELECT statement（视图是存储的 <code>SELECT</code> 语句）。我们需要注意，<strong>视图实质上是一组查询语句，是一张虚拟表（可视化的表）而非真正的表</strong>。它将单张表或者多张表中的某些字段或全部字段使用一些特定的查询组合成一张可见的表，如同一张真实的表一样。</p>
<h2 id="视图相关语法"><a href="#视图相关语法" class="headerlink" title="视图相关语法"></a>视图相关语法</h2><h3 id="1-创建视图"><a href="#1-创建视图" class="headerlink" title="1. 创建视图"></a>1. 创建视图</h3><p>执行以下语句创建一个非常简单的视图，该视图执行 <code>SELECT</code> 语句，并将产品的名称和价格返回给用户。</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">CREATE</span> <span class="token keyword">VIEW</span> vw_Names  
   <span class="token keyword">AS</span>  
   <span class="token keyword">SELECT</span> ProductName<span class="token punctuation">,</span> Price <span class="token keyword">FROM</span> Products<span class="token punctuation">;</span>  
GO</code></pre>
<h3 id="2-删除视图"><a href="#2-删除视图" class="headerlink" title="2. 删除视图"></a>2. 删除视图</h3><p>使用 <code>DROP</code> 语句删除视图 <code>vw_Names</code>：</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">DROP</span> <span class="token keyword">VIEW</span> vw_Names<span class="token punctuation">;</span>  
GO  </code></pre>
<h3 id="3-查询视图"><a href="#3-查询视图" class="headerlink" title="3. 查询视图"></a>3. 查询视图</h3><p>如同查询表一样，可以做一些查询操作，比如：</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> vw_Names</code></pre>
<p>当然也可以添加一些条件：</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> vw_Names <span class="token keyword">WHERE</span> ProductName<span class="token operator">=</span><span class="token string">'武汉热干面'</span></code></pre>
<h3 id="4-更新视图"><a href="#4-更新视图" class="headerlink" title="4.更新视图"></a>4.更新视图</h3><p>使用 <code>SQL CREATE OR REPLACE VIEW</code> 语法来进行更新。</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">CREATE</span> <span class="token operator">OR</span> REPLACE <span class="token keyword">VIEW</span> 视图名称 <span class="token keyword">AS</span>
<span class="token keyword">SELECT</span> 字段名称<span class="token punctuation">(</span>s<span class="token punctuation">)</span>
<span class="token keyword">FROM</span> 表名
<span class="token keyword">WHERE</span> 条件</code></pre>
<p><strong>注意：此处的更新实质上是更新视图的查询语句，看到的效果便是展示的数据发生了变化</strong></p>
<h4 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h4><p>比如我们要在视图 <code>vw_Names</code> 中添加一个字段 <code>Counts</code>：</p>
<pre class=" language-sql"><code class="language-sql"><span class="token keyword">CREATE</span> <span class="token keyword">VIEW</span> vw_Names  
   <span class="token keyword">AS</span>  
   <span class="token keyword">SELECT</span> ProductName<span class="token punctuation">,</span> Price<span class="token punctuation">,</span> Counts <span class="token keyword">FROM</span> Products<span class="token punctuation">;</span>  
GO</code></pre>
<h2 id="视图适用场景"><a href="#视图适用场景" class="headerlink" title="视图适用场景"></a>视图适用场景</h2><ol>
<li>因权限问题或者数据敏感，不能向外透露全部字段信息</li>
<li>查询逻辑复杂，再与其他表进行关联使得语句更复杂，使用视图后，可简单的将其理解为一个变量</li>
</ol>
<h2 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h2><p>我们在使用视图的时候，相当于执行了视图中的查询语句。更直白的讲<strong>视图是实时更新的</strong>。</p>
<blockquote>
<p>每当用户查询视图时，数据库引擎通过使用 SQL 语句来重建数据。</p>
</blockquote>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>C语言之字节序</title>
    <url>/2020/02/10/4.C%E8%AF%AD%E8%A8%80%E4%B9%8B%E5%AD%97%E8%8A%82%E5%BA%8F/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="字节序理解"><a href="#字节序理解" class="headerlink" title="字节序理解"></a>字节序理解</h2><p>字节序其实就是数据在内存中的存储方式，因为内存的地址用高低位之分，数据也有高低位，所以按照存放的顺序一般可分为大端字节序，和小段字节序。</p>
<p>生活中我们放东西的顺序也是不一样的，有的人习惯性的将自己的物品放在自己的左手边，有的人就习惯性的放在自己的右手边，那对于电脑来说，cpu的不同，内存存储多字节数据的存储方式也相应的不同。</p>
<h2 id="概念"><a href="#概念" class="headerlink" title="概念"></a>概念</h2><h2 id="主机字节序"><a href="#主机字节序" class="headerlink" title="主机字节序"></a>主机字节序</h2><p>不同类型CPU主机中，内存存储多字节整数的方法不同，称为主机字节序</p>
<p><strong>主机序列有两种</strong><br>小端序 ：数据的低字节存放在内存的低地址<br>大端序 ：数据的高字节存放在内存的低地址 </p>
<blockquote>
<p>一般 inter处理器的字节序为 小端序， 而 ARM 架构的处理器多为大端序</p>
</blockquote>
<h2 id="验证主机字节序"><a href="#验证主机字节序" class="headerlink" title="验证主机字节序"></a>验证主机字节序</h2><p>C语言<code>代码片</code></p>
<pre class=" language-c"><code class="language-c"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span>

<span class="token comment" spellcheck="true">//定义一个共用体</span>
<span class="token keyword">union</span> Data
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> a<span class="token punctuation">;</span>
    <span class="token keyword">char</span> b<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">union</span> Data data<span class="token punctuation">;</span>
    data<span class="token punctuation">.</span>a <span class="token operator">=</span> <span class="token number">0x12345678</span><span class="token punctuation">;</span>
    <span class="token comment" spellcheck="true">//小端序</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token number">0x78</span> <span class="token operator">==</span> data<span class="token punctuation">.</span>b<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"the little end sequence\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment" spellcheck="true">//大端序</span>
    <span class="token keyword">else</span>
    <span class="token punctuation">{</span>
        <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"the big end sequence\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 id="编程结果"><a href="#编程结果" class="headerlink" title="编程结果"></a>编程结果</h2><p><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/4/1.png" alt="inter处理器"></p>
<p><strong>运行代码的电脑是inter处理器的，验证为小端序存储</strong></p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>git仓库上传了个无法点开的空文件夹是什么鬼？</title>
    <url>/2020/02/09/21.git%E4%BB%93%E5%BA%93%E4%B8%8A%E4%BC%A0%E4%BA%86%E4%B8%AA%E6%97%A0%E6%B3%95%E7%82%B9%E5%BC%80%E7%9A%84%E7%A9%BA%E6%96%87%E4%BB%B6%E5%A4%B9%E6%98%AF%E4%BB%80%E4%B9%88%E9%AC%BC%EF%BC%9F/</url>
    <content><![CDATA[<p>怪事年年有，今年也忒多了，在仓库上传到 GitHub 后，偶然在 GitHub 中瞄了一眼，我的天？这个图标不像文件夹啊？这个怎么点不开？git 上传正常啊？本地工作区和暂存区都是干净的了啊？</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="一、问题描述"><a href="#一、问题描述" class="headerlink" title="一、问题描述"></a>一、问题描述</h2><p>本地仓库提交后，<code>GitHub</code> 中某文件夹无法正常点击，内容无法显示。</p>
<h2 id="二、原因分析"><a href="#二、原因分析" class="headerlink" title="二、原因分析"></a>二、原因分析</h2><p>经排查，定位到原因：之前仓库中包含了一个特殊的文件夹（此文件夹是另外一个 <code>git</code> 仓库），在执行下面语句时：</p>
<pre class=" language-shell"><code class="language-shell">git add .</code></pre>
<p>提示仓库中包含其他仓库，需要解决此问题：删除掉此文件夹中的 <code>.git</code> 配置目录，然后依次执行以下命令：</p>
<pre class=" language-shell"><code class="language-shell">git add .
git commit -m 'add the new file'
git push</code></pre>
<p>顺利推送仓库到远程，过程中并无报错。这个过程或许是导致问题的原因。</p>
<h2 id="三、解决办法"><a href="#三、解决办法" class="headerlink" title="三、解决办法"></a>三、解决办法</h2><p>现在问题是本地工作区与暂存区干净如新，远程仓库有问题。该如何解决？这时用到了一个命令：</p>
<pre class=" language-shell"><code class="language-shell">git rm --cached <dir_name></code></pre>
<p>我们先来看一下手册：</p>
<pre class=" language-shell"><code class="language-shell">usage: git rm [<options>] [--] <file>...

    -n, --dry-run         dry run
    -q, --quiet           do not list removed files
    --cached              only remove from the index
    -f, --force           override the up-to-date check
    -r                    allow recursive removal
    --ignore-unmatch      exit with a zero status even if nothing matched</code></pre>
<p>可以看到 <code>--cached</code> 的作用：将文件仅仅从索引中移除，翻译成人能看懂的话便是 「之前已经提交，现在将此目录释放掉，恢复到工作区，未被追踪的状态，即 <code>git add .</code> 命令之前的状态」</p>
<p>我们执行完此命令之后使用如下命令查看所有改变后的文件状态：</p>
<pre class=" language-shell"><code class="language-shell">git status</code></pre>
<p>发现出问题的目录已经变成了红色未被追踪的状态，此时将出问题的目录中所有包含 <code>git</code> 信息的文件和目录都删除，然后再依次执行命令：</p>
<pre class=" language-shell"><code class="language-shell">git add .
git commit -m 'add the new file'
git push</code></pre>
<p>去远程仓库中查看后发现问题解决。</p>
<h2 id="四、总结"><a href="#四、总结" class="headerlink" title="四、总结"></a>四、总结</h2><p>当出现未知问题致使远程仓库同预期结果不一致时，本地可以将问题目录恢复到未被追踪状态，核查完问题之后再次提交最新结果，操作步骤如下：</p>
<p>1.删除缓存，释放目录，恢复到未被追踪状态：</p>
<pre class=" language-shell"><code class="language-shell">git rm --cached <dir_name></code></pre>
<p>2.依次执行如下操作再次提交：</p>
<pre class=" language-shell"><code class="language-shell">git add .
git commit -m 'Information you need to submit'
git push</code></pre>
<p>3.完美解决问题。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>网络类</tag>
      </tags>
  </entry>
  <entry>
    <title>C语言之字符串处理</title>
    <url>/2020/02/09/3.c%E8%AF%AD%E8%A8%80%E4%B9%8B%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0%E7%9A%84%E5%AE%9E%E7%8E%B0/</url>
    <content><![CDATA[<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h1 id="字符串处理函数"><a href="#字符串处理函数" class="headerlink" title="字符串处理函数"></a>字符串处理函数</h1><h2 id="1-简介"><a href="#1-简介" class="headerlink" title="1.简介"></a>1.简介</h2><ul>
<li>在c语言的学习过程中，我们会学习很多字符串处理函数，入strlen，strcpy，strcmp等等,使用也特别简单，只需要调用库函数就行。</li>
<li>但是对于c语言初学者来说，作为一个面向过程的语言，了解其函数内的实现过程还非常用必要的。</li>
</ul>
<h2 id="2-字符串实现函数"><a href="#2-字符串实现函数" class="headerlink" title="2.字符串实现函数"></a>2.字符串实现函数</h2><h3 id="strcpy（字符串拷贝函数）"><a href="#strcpy（字符串拷贝函数）" class="headerlink" title="strcpy（字符串拷贝函数）"></a>strcpy（字符串拷贝函数）</h3><pre class=" language-c"><code class="language-c"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span>
<span class="token macro property">#<span class="token directive keyword">define</span> M 50</span>
<span class="token comment" spellcheck="true">//指针函数 返回值为指向字符串str1的指针</span>
<span class="token keyword">char</span> <span class="token operator">*</span><span class="token function">strcpy</span><span class="token punctuation">(</span><span class="token keyword">char</span> <span class="token operator">*</span> str1<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span> str2 <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment" spellcheck="true">//判断 是否为空指针</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>str1 <span class="token operator">==</span> <span class="token constant">NULL</span> <span class="token operator">||</span> str2 <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>p <span class="token operator">=</span> str1<span class="token punctuation">;</span>
    <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token operator">*</span> str1<span class="token operator">++</span> <span class="token operator">=</span> <span class="token operator">*</span> str2<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token string">'\0'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> p<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">char</span> str1<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token keyword">char</span> str2<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"please input str1\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">fgets</span><span class="token punctuation">(</span>str1<span class="token punctuation">,</span><span class="token number">50</span><span class="token punctuation">,</span><span class="token constant">stdin</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>p <span class="token operator">=</span> <span class="token function">strcpy</span><span class="token punctuation">(</span>str2<span class="token punctuation">,</span>str1<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">puts</span><span class="token punctuation">(</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span> 
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p><strong>运行结果</strong><br><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/3/1.png" alt="运行1"></p>
<blockquote>
<p>注意：fgets输入的时候会将缓存区里面的回车换行</p>
</blockquote>
<p><strong>作为笔试题考察点有四处</strong></p>
<ol>
<li>异常处理  str1，str2 是否为NULL</li>
<li>const 的修饰，str2不能被修改需要const来修饰</li>
<li>字符串会拷贝 ‘\0’ </li>
<li>返回值（指向str2的指针），可以方便调用者调用</li>
</ol>
<h3 id="strcmp（字符串比较大小）"><a href="#strcmp（字符串比较大小）" class="headerlink" title="strcmp（字符串比较大小）"></a>strcmp（字符串比较大小）</h3><pre class=" language-c"><code class="language-c"><span class="token operator">*</span><span class="token operator">*</span>#include <span class="token operator">&lt;</span>stdio<span class="token punctuation">.</span>h<span class="token operator">></span>
<span class="token macro property">#<span class="token directive keyword">define</span> M 50</span>
<span class="token macro property">#<span class="token directive keyword">define</span> N 50</span>
<span class="token keyword">int</span> <span class="token function">Strcmp</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>str1<span class="token punctuation">,</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment" spellcheck="true">//输入两个字符串</span>
    <span class="token keyword">char</span> str1<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token keyword">char</span> str2<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"please input str1\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span>str1<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"please input str2\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment" spellcheck="true">//比较两字符串的大小</span>
    <span class="token function">Strcmp</span><span class="token punctuation">(</span>str1<span class="token punctuation">,</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">int</span> <span class="token function">Strcmp</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>str1<span class="token punctuation">,</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>str2<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment" spellcheck="true">//判断 是否为空指针</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>str1 <span class="token operator">==</span> <span class="token constant">NULL</span> <span class="token operator">||</span> str2 <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span>
     <span class="token punctuation">{</span>
          <span class="token keyword">return</span><span class="token punctuation">;</span>
     <span class="token punctuation">}</span>
    <span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">(</span>str1<span class="token operator">+</span>i<span class="token punctuation">)</span><span class="token operator">==</span><span class="token operator">*</span><span class="token punctuation">(</span>str2<span class="token operator">+</span>i<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token operator">*</span><span class="token punctuation">(</span>str1<span class="token operator">+</span>i<span class="token punctuation">)</span><span class="token operator">!=</span><span class="token string">'\0'</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        i<span class="token operator">++</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token operator">*</span><span class="token punctuation">(</span>str1<span class="token operator">+</span>i<span class="token punctuation">)</span><span class="token operator">></span><span class="token operator">*</span><span class="token punctuation">(</span>str2<span class="token operator">+</span>i<span class="token punctuation">)</span> <span class="token punctuation">)</span> 
    <span class="token punctuation">{</span>
        <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"str1>str2\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token operator">*</span><span class="token punctuation">(</span>str1<span class="token operator">+</span>i<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token operator">*</span><span class="token punctuation">(</span>str2<span class="token operator">+</span>i<span class="token punctuation">)</span> <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"str1&lt;str2\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">else</span>
    <span class="token punctuation">{</span>
        <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"str1=str2\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<p><strong>运行结果</strong><br><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/3/2.png" alt="运行2"><br><strong>作为笔试题考点同上</strong></p>
<h3 id="strcat-（字符串拼接函数）"><a href="#strcat-（字符串拼接函数）" class="headerlink" title="strcat （字符串拼接函数）"></a>strcat （字符串拼接函数）</h3><pre class=" language-c"><code class="language-c"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;string.h></span></span>
<span class="token macro property">#<span class="token directive keyword">define</span> M 50</span>
<span class="token macro property">#<span class="token directive keyword">define</span> N 50</span>
<span class="token keyword">char</span> <span class="token operator">*</span><span class="token function">str_cat</span><span class="token punctuation">(</span><span class="token keyword">char</span><span class="token operator">*</span><span class="token punctuation">,</span><span class="token keyword">char</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">char</span> str1<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token keyword">char</span> str2<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token comment" spellcheck="true">//输入两个字符串</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"please input str1\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span>str1<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"please input str2\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>p<span class="token operator">=</span><span class="token function">str_cat</span><span class="token punctuation">(</span>str1<span class="token punctuation">,</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">puts</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment" spellcheck="true">//字符串拼接</span>
<span class="token keyword">char</span> <span class="token operator">*</span><span class="token function">str_cat</span><span class="token punctuation">(</span><span class="token keyword">char</span> <span class="token operator">*</span>str1<span class="token punctuation">,</span><span class="token keyword">char</span> <span class="token operator">*</span>str2<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment" spellcheck="true">//判断 是否为空指针</span>
     <span class="token keyword">if</span><span class="token punctuation">(</span>str1 <span class="token operator">==</span> <span class="token constant">NULL</span> <span class="token operator">||</span> str2 <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span>
      <span class="token punctuation">{</span>
            <span class="token keyword">return</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
      <span class="token comment" spellcheck="true">//字符串str1的长度</span>
     <span class="token keyword">int</span> j<span class="token operator">=</span><span class="token function">strlen</span><span class="token punctuation">(</span>str1<span class="token punctuation">)</span><span class="token punctuation">;</span>
     <span class="token comment" spellcheck="true">//字符串str2的长度</span>
     <span class="token keyword">int</span> k<span class="token operator">=</span><span class="token function">strlen</span><span class="token punctuation">(</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span> M <span class="token operator">&lt;</span> <span class="token punctuation">(</span>j<span class="token operator">+</span>k<span class="token punctuation">)</span> <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment" spellcheck="true">//定义两个指针</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>pp<span class="token operator">=</span>str1<span class="token punctuation">;</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>p<span class="token operator">=</span>str1<span class="token operator">+</span>j<span class="token punctuation">;</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>q<span class="token operator">=</span>str2<span class="token punctuation">;</span>
    <span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span><span class="token punctuation">(</span>i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">&lt;</span>k<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token operator">*</span><span class="token punctuation">(</span>p<span class="token operator">+</span>i<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span>q<span class="token operator">+</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> pp<span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p><strong>运行结果</strong><br><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/3/4.png" alt="运行3"></p>
<h3 id="strlen（求字符串的长度）"><a href="#strlen（求字符串的长度）" class="headerlink" title="strlen（求字符串的长度）"></a>strlen（求字符串的长度）</h3><pre class=" language-c"><code class="language-c"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span>
<span class="token keyword">int</span> <span class="token function">mystrlen</span><span class="token punctuation">(</span><span class="token keyword">char</span> <span class="token operator">*</span>pStr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">char</span> str<span class="token punctuation">[</span><span class="token number">100</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"please input str\r\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span>str<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment" spellcheck="true">//用变量a来接受函数的返回值</span>
    <span class="token keyword">int</span> a<span class="token operator">=</span><span class="token function">mystrlen</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d\r\n"</span><span class="token punctuation">,</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment" spellcheck="true">//求字符串的长度</span>
<span class="token keyword">int</span> <span class="token function">mystrlen</span><span class="token punctuation">(</span><span class="token keyword">char</span> <span class="token operator">*</span>pStr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token operator">==</span>pStr<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">while</span><span class="token punctuation">(</span>pStr<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">!=</span><span class="token string">'\0'</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        i<span class="token operator">++</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> i<span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/3/4.png" alt="运行4"></p>
<blockquote>
<p>注意：strlen 和 sizeof的区别</p>
</blockquote>
<ul>
<li>strlen 计算字符串的长度，不计算字符串的结束标识符 ‘\0’</li>
<li>sizeof 计算的是占空间的大小会计算进去</li>
</ul>
<h3 id="字符串的翻转"><a href="#字符串的翻转" class="headerlink" title="字符串的翻转"></a>字符串的翻转</h3><p>*<em>方法一 *</em></p>
<pre class=" language-c"><code class="language-c"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;string.h></span></span>
<span class="token macro property">#<span class="token directive keyword">define</span> n 50</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment" spellcheck="true">//输入字符</span>
    <span class="token keyword">char</span> arr<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span>arr<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>p<span class="token operator">=</span>arr<span class="token punctuation">;</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>q<span class="token operator">=</span><span class="token operator">&amp;</span>arr<span class="token punctuation">[</span><span class="token function">strlen</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token comment" spellcheck="true">//用指针p指向首地址，q指向字符的尾地址</span>
    <span class="token keyword">for</span><span class="token punctuation">(</span>i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">&lt;</span><span class="token function">strlen</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>    
        <span class="token keyword">char</span> tmp<span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span>p<span class="token operator">+</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token operator">*</span><span class="token punctuation">(</span>p<span class="token operator">+</span>i<span class="token punctuation">)</span><span class="token operator">=</span><span class="token operator">*</span><span class="token punctuation">(</span>q<span class="token operator">-</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token operator">*</span><span class="token punctuation">(</span>q<span class="token operator">-</span>i<span class="token punctuation">)</span><span class="token operator">=</span>tmp<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token function">puts</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/3/5.png" alt="运行5"><br><strong>方法二</strong></p>
<pre class=" language-c"><code class="language-c"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;string.h></span></span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">char</span> str<span class="token punctuation">[</span><span class="token number">100</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token function">gets</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>p<span class="token operator">=</span>str<span class="token punctuation">;</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>q<span class="token operator">=</span>str<span class="token operator">+</span><span class="token function">strlen</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>

    <span class="token keyword">while</span><span class="token punctuation">(</span>p<span class="token operator">&lt;</span>q<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">int</span> tmp<span class="token operator">=</span><span class="token operator">*</span>p<span class="token punctuation">;</span>
        <span class="token operator">*</span>p<span class="token operator">=</span><span class="token operator">*</span>q<span class="token punctuation">;</span>
        <span class="token operator">*</span>q<span class="token operator">=</span>tmp<span class="token punctuation">;</span>
        p<span class="token operator">++</span><span class="token punctuation">;</span>
        q<span class="token operator">--</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token function">puts</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h3 id="字符串的查找"><a href="#字符串的查找" class="headerlink" title="字符串的查找"></a>字符串的查找</h3><blockquote>
<p>编写一个字符串查找函数，函数原型为：<br>char *str_search(const char *str1, const char *str2)，<br>该函数实现在字符串str1中找出字符串str2第一次出现的位置。<br>如果str2出现在str1中，则返回str2在str1中出现的首地址，<br>如果在str1中没有与str2匹配的字符串则返回NULL</p>
</blockquote>
<pre class=" language-c"><code class="language-c"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;string.h></span></span>
<span class="token keyword">char</span> <span class="token operator">*</span><span class="token function">str_search</span><span class="token punctuation">(</span> <span class="token keyword">char</span> <span class="token operator">*</span>str1<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>str2 <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment" spellcheck="true">//定义两个字符串</span>
    <span class="token keyword">char</span> str1<span class="token punctuation">[</span><span class="token number">20</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token keyword">char</span> str2<span class="token punctuation">[</span><span class="token number">20</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token comment" spellcheck="true">//赋值</span>
    <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span>str1<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>q <span class="token operator">=</span> <span class="token function">str_search</span><span class="token punctuation">(</span>str1<span class="token punctuation">,</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%s\r\n"</span><span class="token punctuation">,</span>q<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">char</span> <span class="token operator">*</span><span class="token function">str_search</span><span class="token punctuation">(</span> <span class="token keyword">char</span> <span class="token operator">*</span>str1<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>str2 <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment" spellcheck="true">//定义一个指针指向 str1</span>
    <span class="token keyword">char</span> <span class="token operator">*</span>p <span class="token operator">=</span> str1<span class="token punctuation">;</span>
    <span class="token comment" spellcheck="true">//逐个移动比较</span>
    <span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span><span class="token punctuation">(</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token function">strlen</span><span class="token punctuation">(</span>str1<span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">char</span> tmp <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span> p<span class="token operator">+</span><span class="token function">strlen</span><span class="token punctuation">(</span>str2<span class="token punctuation">)</span><span class="token operator">+</span>i <span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token operator">*</span><span class="token punctuation">(</span> p<span class="token operator">+</span><span class="token function">strlen</span><span class="token punctuation">(</span>str2<span class="token punctuation">)</span><span class="token operator">+</span>i <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token string">'\0'</span><span class="token punctuation">;</span>
        <span class="token comment" spellcheck="true">//比较两个字符串</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token number">0</span> <span class="token operator">==</span> <span class="token function">strcmp</span><span class="token punctuation">(</span> str1<span class="token operator">+</span>i<span class="token punctuation">,</span> str2 <span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> p<span class="token operator">+</span>i<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>    
        <span class="token operator">*</span><span class="token punctuation">(</span> p<span class="token operator">+</span><span class="token function">strlen</span><span class="token punctuation">(</span>str2<span class="token punctuation">)</span><span class="token operator">+</span>i <span class="token punctuation">)</span> <span class="token operator">=</span> tmp<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>    </code></pre>
<p><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/3/6.png" alt="运行6"></p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>elasticsearch中join类型数据如何进行父子文档查询</title>
    <url>/2020/02/07/19.elasticsearch%E4%B8%ADjoin%E7%B1%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E7%88%B6%E5%AD%90%E6%96%87%E6%A1%A3%E6%9F%A5%E8%AF%A2/</url>
    <content><![CDATA[<p>ES 中 join 类型数据如何根据父文档查询全部子文档？又如何根据子文档查询其父文档呢？</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="1-join-简介"><a href="#1-join-简介" class="headerlink" title="1.join 简介"></a>1.join 简介</h2><p>在 <code>ES</code> 中有一种特殊的数据类型『<code>join</code>』，被形象地称为父子文档。它是一种可以在同一索引中存放两种有关系数据的数据类型，类似于关系数据库中让两张表发生关系的<strong>外键 <code>FOREIGN KEY</code></strong> 。</p>
<p>在官方文档中这样介绍：<code>join</code> 数据类型的字段是一个特殊字段，它可以在同一个索引的文档中创建 <code>父子关系</code> 。通过参数 <code>relations</code> 定义可能存在关系的一组文档，这个关系的参数由 <code>父名</code> 和 <code>子名</code> 构成。下方是原文档描述：</p>
<p>The <code>join</code> datatype is a special field that creates parent/child relation within documents of the same index. The <code>relations</code> section defines a set of possible relations within the documents, each relation being a parent name and a child name. </p>
<h2 id="2-定义"><a href="#2-定义" class="headerlink" title="2.定义"></a>2.定义</h2><p>我们需要在设置 <code>mapping</code> 时将其关系定义好，如下示例：</p>
<pre class=" language-http"><code class="language-http">PUT 索引名称
{
  "mappings": {
    "properties": {
      "join类型的字段名称": { 
        "type": "join",
        "relations": {
          "父文档标示字段名": "子文档标示字段名" 
        }
      }
    }
  }
}</code></pre>
<h3 id="2-1-父文档"><a href="#2-1-父文档" class="headerlink" title="2.1 父文档"></a>2.1 父文档</h3><p>构建父文档时可以通过如下方法：</p>
<pre class=" language-http"><code class="language-http">PUT 索引名称/类型/文档id?refresh
{
  "text": "EthanYan",
  ...        // 父文档中其他的字段与值
  "join类型的字段名称": {
    "name": "父文档标示字段名" 
  }
}</code></pre>
<p>这种方式是为了便于理解，与下方子文档中构建方式对应。当你运用熟练后，有一种简便的构建方法：</p>
<pre class=" language-http"><code class="language-http">PUT 索引名称/类型/文档id?refresh
{
  "text": "EthanYan",
  ...        // 父文档中其他的字段与值
  "join类型的字段名称": "父文档标示字段名" 
}</code></pre>
<h3 id="2-2-子文档"><a href="#2-2-子文档" class="headerlink" title="2.2 子文档"></a>2.2 子文档</h3><p>构建子文档时可以通过如下方法：</p>
<pre class=" language-http"><code class="language-http">PUT 索引名称/类型/文档id?routing=父文档id&amp;refresh 
{
  "text": "xiaoyan",
  ...        // 子文档中其他的字段与值
  "join类型的字段名称": {
    "name": "子文档标示字段名", 
    "parent": "父文档id" 
  }
}</code></pre>
<h4 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h4><p>构建子文档时与父文档有些许不同，以下几点需要特别注意：</p>
<p>1.<code>url</code> 中可以看到有一个参数 <code>routing</code> ，<strong>此参数必须设置</strong>，因为我们需要保证父文档与子文档在同一分片中。其原文描述为：The routing value is mandatory because parent and child documents must be indexed on the same shard.</p>
<p>2.我们可以看到子文档在 <code>join</code> 类型字段中除了参数 <code>name</code> 外，还多了一个参数 <code>parent</code> ，故名思义，此字段为了指明父文档的所在，其值填写为父文档的 <code>id</code></p>
<h2 id="3-查询"><a href="#3-查询" class="headerlink" title="3.查询"></a>3.查询</h2><p>此字段类型当然是为了查询而存在，要不然没有灵魂。下面举例进行说明。索引名为 <code>sales_org</code></p>
<p>有一个父文档为下方示例：</p>
<pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>
  <span class="token property">"node_name_cn"</span><span class="token operator">:</span> <span class="token string">"川渝"</span><span class="token punctuation">,</span>
  <span class="token property">"node_code"</span><span class="token operator">:</span> <span class="token string">"LP.IIB.RW.CTU"</span><span class="token punctuation">,</span>
  <span class="token property">"node_type"</span><span class="token operator">:</span> <span class="token string">"办事处"</span><span class="token punctuation">,</span>
  <span class="token property">"node_id_fqdn"</span><span class="token operator">:</span> <span class="token string">"SI/LP/LP.IIB.RW/LP.IIB.RW.CTU"</span><span class="token punctuation">,</span>
  <span class="token property">"node_name_fqdn"</span><span class="token operator">:</span> <span class="token string">"SI/LP//川渝"</span><span class="token punctuation">,</span>
  <span class="token property">"node_name_en"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span>
  <span class="token property">"mgmt_territory"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span>
  <span class="token property">"node_tree_level"</span><span class="token operator">:</span> <span class="token number">3</span><span class="token punctuation">,</span>
  <span class="token property">"node_name_short"</span><span class="token operator">:</span> <span class="token string">"LP.IIB.RW.CTU"</span><span class="token punctuation">,</span>
  <span class="token property">"node_info"</span><span class="token operator">:</span> <span class="token string">"node_parent"</span>
<span class="token punctuation">}</span></code></pre>
<p>一个子文档示例如下：</p>
<pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>    
  <span class="token property">"empl_id"</span><span class="token operator">:</span> <span class="token string">"*******"</span><span class="token punctuation">,</span>
  <span class="token property">"email_addr"</span><span class="token operator">:</span> <span class="token string">"*****@fafa.com"</span><span class="token punctuation">,</span>
  <span class="token property">"dept_id"</span><span class="token operator">:</span> <span class="token string">"LP.IIB.RW.CTU"</span><span class="token punctuation">,</span>
  <span class="token property">"name_cn"</span><span class="token operator">:</span> <span class="token string">"Nie Cong"</span><span class="token punctuation">,</span>
  <span class="token property">"node_info"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token property">"parent"</span><span class="token operator">:</span> <span class="token string">"LP.IIB.RW.CTU"</span><span class="token punctuation">,</span>
    <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"node_child"</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<p>可以看到 <code>join</code> 类型字段名为 <code>node_info</code> ，父文档标示字段名为 <code>node_parent</code> ，子文档标示字段名为 <code>node_child</code> 。</p>
<h3 id="3-1-基于父文档查询全部子文档"><a href="#3-1-基于父文档查询全部子文档" class="headerlink" title="3.1 基于父文档查询全部子文档"></a>3.1 基于父文档查询全部子文档</h3><pre class=" language-http"><code class="language-http">POST sales_org/_search
{
  "query": {
    "has_parent": {
      "parent_type": "node_parent",        // 填写父文档标示字段名
      "query": {        // 填写查询条件，注意填写的查询条件是查询父文档，该查询条件是为定位到要基于的父文档
        "match": {
          "_id": "LP.IIB.RW.CTU"
        }
      }
    }
  }
}</code></pre>
<h3 id="3-2-基于子文档查询其父文档"><a href="#3-2-基于子文档查询其父文档" class="headerlink" title="3.2 基于子文档查询其父文档"></a>3.2 基于子文档查询其父文档</h3><pre class=" language-http"><code class="language-http">{
  "query": {
    "has_child": {
      "type": "node_child",        // 填写子文档标示字段名
      "query": {        // 填写查询条件，注意填写的查询条件是查询子文档，该查询条件是为定位到要基于的子文档
        "match": {
          "dept_id": "LP.IIB.RW.CTU"
        }
      }
    }
  }
}</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
  </entry>
  <entry>
    <title>计算机网络知识点总结</title>
    <url>/2020/02/02/11.%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/</url>
    <content><![CDATA[<p><strong>《计算机网络》第五版 谢希仁</strong> 知识点大汇总</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="1-OSI、TCP-IP、五层协议的体系结构以及各层协议"><a href="#1-OSI、TCP-IP、五层协议的体系结构以及各层协议" class="headerlink" title="1.OSI、TCP/IP、五层协议的体系结构以及各层协议"></a>1.OSI、TCP/IP、五层协议的体系结构以及各层协议</h2><p><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/11/1.png" alt="1"></p>
<p><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/11/2.png" alt="2"></p>
<p><strong>OSI分层（7层）</strong>：物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。</p>
<p><strong>TCP/IP分层（4层）</strong>：网络接口层、网际层、运输层、应用层。</p>
<p><strong>五层协议（5层）</strong>：物理层、数据链路层、网络层、运输层、应用层。</p>
<p><strong><em>每一层的协议如下：</em></strong></p>
<p><strong>物理层：</strong><code>RJ45</code>、<code>CLOCK</code>、<code>IEEE802.3</code>   （中继器，集线器，网关）</p>
<p><strong>数据链路：</strong><code>PPP</code>、<code>FR</code>、<code>HDLC</code>、<code>VLAN</code>、<code>MAC</code>  （网桥，交换机）</p>
<p><strong>网络层：</strong><code>IP</code>、<code>ICMP</code>、<code>ARP</code>、<code>RARP</code>、<code>OSPF</code>、<code>IPX</code>、<code>RIP</code>、<code>IGRP</code> （路由器）</p>
<p><strong>传输层：</strong><code>TCP</code>、<code>UDP</code>、<code>SPX</code></p>
<p><strong>会话层：</strong><code>NFS</code>、<code>SQL</code>、<code>NETBIOS</code>、<code>RPC</code></p>
<p><strong>表示层：</strong><code>JPEG</code>、<code>MPEG</code>、<code>ASII</code></p>
<p><strong>应用层：</strong><code>FTP</code>、<code>DNS</code>、<code>Telnet</code>、<code>SMTP</code>、<code>HTTP</code>、<code>WWW</code>、<code>NFS</code></p>
<p><strong><em>每一层的作用如下：</em></strong></p>
<p><strong>物理层：</strong>通过媒介传输比特,确定机械及电气规范（比特 <code>Bit</code>）</p>
<p><strong>数据链路层</strong>：将比特组装成帧和点到点的传递（帧 <code>Frame</code>）</p>
<p><strong>网络层</strong>：负责数据包从源到宿的传递和网际互连（包 <code>PackeT</code>）</p>
<p><strong>传输层</strong>：提供端到端的可靠报文传递和错误恢复（段 <code>Segment</code>）</p>
<p><strong>会话层</strong>：建立、管理和终止会话（会话协议数据单元 <code>SPDU</code>）</p>
<p><strong>表示层</strong>：对数据进行翻译、加密和压缩（表示协议数据单元 <code>PPDU</code>）</p>
<p><strong>应用层</strong>：允许访问 <code>OSI</code> 环境的手段（应用协议数据单元 <code>APDU</code>）</p>
<h2 id="2-IP地址分类"><a href="#2-IP地址分类" class="headerlink" title="2.IP地址分类"></a>2.IP地址分类</h2><p>　　<code>IP</code> 地址是32位的二进制数值，用于在 <code>TCP/IP</code> 通讯协议中标记每台计算机的地址。通常我们使用点式十进制来表示，如192.168.0.5等等。</p>
<p>　　每个 <code>IP</code> 地址又可分为两部分。即网络号部分和主机号部分：网络号表示其所属的网络段编号，主机号则表示该网段中该主机的地址编号。按照网络规模的大小，<code>IP</code> 地址可以分为 <code>A</code>、<code>B</code>、<code>C</code>、<code>D</code>、<code>E</code> 五类。</p>
<p>A类地址：以0开头，第一个字节范围：0~127（1.0.0.0 - 126.255.255.255）；</p>
<p>B类地址：以10开头，第一个字节范围：128~191（128.0.0.0 - 191.255.255.255）；</p>
<p>C类地址：以110开头，第一个字节范围：192~223（192.0.0.0 - 223.255.255.255）；</p>
<pre><code>类别         网络号                  /占位数      主机号             /    占位数    用途

A（以0开头）  1～126                 /  8      0～255 0～255 1～254 /     24      国家级

B（以10开头） 128～191 0～255        /  16     0～255 1～254        /     16      跨过组织

C（以110开头）192～223 0～255 0～255 /  24     1～254               /     8       企业组织</code></pre><p><strong>注意：</strong></p>
<p>1）以下是留用的内部私有地址，<code>Internet</code> 上没使用的地址</p>
<p><code>A</code> 类 10.0.0.0–10.255.255.255</p>
<p><code>B</code> 类 172.16.0.0–172.31.255.255</p>
<p><code>C</code> 类 192.168.0.0–192.168.255.255</p>
<p>2）<code>IP</code> 地址与子网掩码相与得到网络号</p>
<p>3）主机号，全为0的是网络号（例如：192.168.2.0），主机号全为1的为广播地址（192.168.2.255）</p>
<h2 id="3-ARP是地址解析协议，简单语言解释一下工作原理"><a href="#3-ARP是地址解析协议，简单语言解释一下工作原理" class="headerlink" title="3.ARP是地址解析协议，简单语言解释一下工作原理"></a>3.ARP是地址解析协议，简单语言解释一下工作原理</h2><p>地址解析协议，即 <code>ARP</code>（<code>Address Resolution Protocol</code>），是根据 <code>IP</code> 地址获取物理地址的一个 <code>TCP/IP</code> 协议。</p>
<p>1.首先，每个主机都会在自己的 <code>ARP</code> 缓冲区中建立一个 <code>ARP</code> 列表，以表示 <code>IP</code> 地址和 <code>MAC</code> 地址之间的对应关系。</p>
<p>2.当源主机要发送数据时，首先检查ARP列表中是否有对应 <code>IP</code> 地址的目的主机的 <code>MAC</code> 地址，如果有，则直接发送数据，如果没有，就向本网段的所有主机发送 <code>ARP</code> 数据包，该数据包包括的内容有：源主机<code>IP</code>地址，源主机 <code>MAC</code> 地址，目的主机的 <code>IP</code> 地址</p>
<p>3.当本网络的所有主机收到该 <code>ARP</code> 数据包时，首先检查数据包中的 <code>IP</code> 地址是否是自己的 <code>IP</code> 地址，如果不是，则忽略该数据包，如果是，则首先从数据包中取出源主机的 <code>IP</code> 和 <code>MAC</code> 地址写入到 <code>ARP</code> 列表中，如果已经存在，则覆盖，然后将自己的 <code>MAC</code> 地址写入 <code>ARP</code> 响应包中，告诉源主机自己是它想要找的 <code>MAC</code> 地址。</p>
<p>4.源主机收到 <code>ARP</code> 响应包后。将目的主机的 <code>IP</code> 和 <code>MAC</code> 地址写入 <code>ARP</code> 列表，并利用此信息发送数据。如果源主机一直没有收到 <code>ARP</code> 响应数据包，表示 <code>ARP</code> 查询失败。</p>
<p><strong>注意：广播（255.255.255.255）发送 <code>ARP</code> 请求，单播发送 <code>ARP</code> 响应。</strong></p>
<h2 id="4-简单介绍几种协议"><a href="#4-简单介绍几种协议" class="headerlink" title="4.简单介绍几种协议"></a>4.简单介绍几种协议</h2><p><code>ICMP</code> 协议： 因特网控制报文协议。它是 <code>TCP/IP</code> 协议族的一个子协议，用于在 <code>IP</code> 主机、路由器之间传递控制消息</p>
<p><code>TFTP</code> 协议： 是 <code>TCP/IP</code> 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议，提供不复杂、开销不大的文件传输服务。</p>
<p><code>HTTP</code> 协议： 超文本传输协议，是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统</p>
<p><code>NAT</code> 协议：网络地址转换属接入广域网( <code>WAN</code> )技术，是一种将私有（保留）地址转化为合法 <code>IP</code> 地址的转换技术</p>
<p><code>DHCP</code> 协议：动态主机配置协议，是一种让系统得以连接到网络上，并获取所需要的配置参数手段，使用 <code>UDP</code> 协议工作。<strong>具体用途</strong>：给内部网络或网络服务供应商自动分配 <code>IP</code> 地址，给用户或者内部网络管理员作为对所有计算机作中央管理的手段。</p>
<h2 id="5-TCP三次握手四次挥手"><a href="#5-TCP三次握手四次挥手" class="headerlink" title="5.TCP三次握手四次挥手"></a>5.TCP三次握手四次挥手</h2><h3 id="三次握手"><a href="#三次握手" class="headerlink" title="三次握手"></a>三次握手</h3><p>第一次握手：客户端发送 <code>syn</code> 包( <code>seq=x</code> )到服务器，并进入 <code>SYN_SEND</code> (发送)状态，等待服务器确认；</p>
<p>第二次握手：服务器收到 <code>syn</code>包，必须确认客户的 <code>SYN</code>（<code>ack=x+1</code>），同时自己也发送一个 <code>SYN</code> 包（<code>seq=y</code> ），即 <code>SYN+ACK</code> 包，此时服务器进入 <code>SYN_RECV</code>（接收）状态；</p>
<p>第三次握手：客户端收到服务器的 <code>SYN＋ACK</code> 包，向服务器发送确认包 <code>ACK</code> ( <code>ack=y+1</code> )，此包发送完毕，客户端和服务器进入 <code>ESTABLISHED</code>（已建立）状态，完成三次握手。</p>
<p><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/11/3.png" alt="3"></p>
<p><strong>说明：</strong><br>1）<code>SYN</code> 和 <code>ACK</code> 是标志位（0/1）（<code>ACK=1</code>表明 <code>ack</code> 有效），<code>seq</code> 是序列号，<code>ack</code> 是确认号。</p>
<p>2）给对方的确认方式就是把对方传来的 <code>seq+1</code> 并赋给 <code>ack</code>。</p>
<h3 id="四次挥手"><a href="#四次挥手" class="headerlink" title="四次挥手"></a>四次挥手</h3><p>第一次挥手：主动关闭方发送一个 <code>FIN</code>，用来关闭主动方到被动关闭方的数据传送，也就是主动关闭方告诉被动关闭方：我已经不会再给你发数据了(当然，在 <code>fin</code> 包之前发送出去的数据，如果没有收到对应的 <code>ack</code> 确认报文，主动关闭方依然会重发这些数据)，但是，此时主动关闭方还可 以接受数据。</p>
<p>第二次挥手：被动关闭方收到 <code>FIN</code> 包后，发送一个 <code>ACK</code> 给对方，确认序号为收到序号 +1。</p>
<p>第三次挥手：被动关闭方发送一个 <code>FIN</code>，用来关闭被动关闭方到主动关闭方的数据传送，也就是告诉主动关闭方，我的数据也发送完了，不会再给你发数据了。</p>
<p>第四次挥手：主动关闭方收到 <code>FIN</code> 后，发送一个 <code>ACK</code> 给被动关闭方，确认序号为收到序号 +1，至此，完成四次挥手。</p>
<p><strong>说明：</strong></p>
<p>1）<strong>SYN攻击：用众多伪造ip地址向服务器发送SYN=1（请求连接）</strong>，让服务器处于<strong>SYN-RCVD状态</strong>，但都无法第三次握手（因为伪造 <code>ip</code> 不存在）</p>
<p>2）4次挥手中的 <code>FIN</code> 就相当于三次握手中的 <code>SYN</code>。</p>
<p>3）序号 <code>seq</code>，确认序号 <code>ack</code>，确认标志位 <code>ACK</code> 作用还是一样的，就是确认作用（把 <code>seq</code> 加上1赋给 <code>ack</code>，并把 <code>ACK</code> 置1）</p>
<p>4）为什么一个3次1个4次不一样？</p>
<p>因为两端的数据并不是同时发送完，所以两端谁发送完数据都需要自己告诉对方一次，并且对方确认一次。</p>
<p><img src="https://cdn.jsdelivr.net/gh/bigoceans/cdn/img/post/11/4.png" alt="4"></p>
<h2 id="6-在浏览器中输入www-baidu-com-后执行的全部过程"><a href="#6-在浏览器中输入www-baidu-com-后执行的全部过程" class="headerlink" title="6.在浏览器中输入www.baidu.com 后执行的全部过程"></a>6.在浏览器中输入<a href="http://www.baidu.com" target="_blank" rel="noopener">www.baidu.com</a> 后执行的全部过程</h2><p>1、客户端浏览器通过 <code>DNS</code> 解析到<a href="http://www.baidu.com的" target="_blank" rel="noopener">www.baidu.com的</a> <code>IP</code> 地址220.181.27.48，通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个 <code>HTTP</code> 会话到 220.161.27.48，然后通过 <code>TCP</code> 进行封装数据包，输入到网络层。</p>
<p> 2、在客户端的<strong>传输层(添加TCP头)</strong>，把 <code>HTTP</code> 会话请求分成报文段，添加源和目的端口，如服务器使用80端口监听客户端的请求，客户端由系统随机选择一个端口如5000，与服务器进行交换，服务器把相应的请求返回给客户端的 5000 端口。然后使用IP层的IP地址查找目的端。</p>
<p> 3、客户端的<strong>网络层（添加IP头）</strong>不用关系应用层或者传输层的东西，主要做的是通过查找路由表确定如何到达服务器，期间可能经过多个路由器，这些都是由路由器来完成的工作，我不作过多的描述，无非就是通过查找路由表决定通过那个路径到达服务器。</p>
<p> 4、客户端的<strong>链路层（添加MAC头）</strong>包通过链路层发送到路由器，通过邻居协议查找给定 <code>IP</code> 地址的 <code>MAC</code> 地址，然后发送 <code>ARP</code> 请求查找目的地址，如果得到回应后就可以使用 <code>ARP</code> 的请求应答交换的 <code>IP</code> 数据包现在就可以传输了，然后发送 <code>IP</code> 数据包到达服务器的地址。</p>
<h2 id="7-TCP和UDP的区别"><a href="#7-TCP和UDP的区别" class="headerlink" title="7.TCP和UDP的区别"></a>7.TCP和UDP的区别</h2><p><strong>这是传输层的两个协议，先说一下传输层的两大功能：</strong></p>
<ol>
<li><strong>复用：</strong>在发送端，多个应用进程公用一个传输层；</li>
<li><strong>分用：</strong>在接收端，传输层会根据端口号将数据分给不同的应用进程。 </li>
</ol>
<p><strong>传输层和网络层的区别：</strong></p>
<ol>
<li>网络层为不同的<strong>主机</strong>提供通信服务，传输层为不同应用<strong>进程</strong>提供通信服务。</li>
<li>网络层只对报文头部进行差错检测，而传输层对整个报文进行差错检测。</li>
</ol>
<p><strong>UDP（User Data Protocol）用户数据报协议</strong></p>
<ol>
<li>无连接</li>
<li>不可靠（不能保证都送达）</li>
<li>面向报文（<code>UDP</code> 数据传输单位是报文，不会对数据进行拆分和拼接操作，只是给上层传来的数据加个 <code>UDP</code> 头或者给下层来的数据去掉 <code>UDP</code> 头）</li>
<li>没有拥塞控制，始终以恒定速率发送数据</li>
<li>支持一对一、一对多、多对多、多对一</li>
<li>首部开销小，只有8字节</li>
</ol>
<p><strong>TCP（Transmission Control Protocol）传输控制协议</strong></p>
<ol>
<li>有连接</li>
<li>可靠的</li>
<li>面向字节流</li>
<li>全双工通信，<code>TCP</code> 两端既可以作为发送端也可以作为接收端</li>
<li>连接的两端只能是两个端点，即一对一，不能一对多</li>
<li>至少20个字节，比 <code>UDP</code> 大的多</li>
</ol>
<p><strong>什么是TCP连接</strong></p>
<p><code>TCP</code> 连接是一种抽象的概念，表示一条可以通信的链路。<br>每个 <code>TCP</code> 连接有且仅有两个端点，表示通信的双方，且双方在任意时刻都可以作为发送者和接受者。</p>
<p><strong>什么是套接字</strong></p>
<p>一条 <code>TCP</code> 连接的两端就是两个套接字。<br>套接字 = <code>IP</code> 地址:端口号<br>因此，<code>TCP</code> 连接 = （套接字1，套接字2）= （<code>IP1</code>：端口号1，<code>IP2</code>：端口号2）</p>
<h2 id="8-TCP对应的协议和UDP对应的协议"><a href="#8-TCP对应的协议和UDP对应的协议" class="headerlink" title="8.TCP对应的协议和UDP对应的协议"></a>8.TCP对应的协议和UDP对应的协议</h2><p><strong>TCP对应的协议：</strong></p>
<p>（1） <strong>FTP</strong>：定义了文件传输协议，使用<strong>21</strong>端口。</p>
<p>（2） <strong>Telnet</strong>：一种用于远程登陆的端口，使用<strong>23</strong>端口，用户可以以自己的身份远程连接到计算机上，可提供基于DOS模式下的通信服务。</p>
<p>（3） <strong>SMTP</strong>：邮件传送协议，用于发送邮件。服务器开放的是<strong>25</strong>号端口。</p>
<p>（4） <strong>POP3</strong>：它是和 <code>SMTP</code> 对应，<code>POP3</code> 用于接收邮件。<code>POP3</code> 协议所用的是<strong>110</strong>端口。</p>
<p>（5）<strong>HTTP</strong>：是从 <code>Web</code> 服务器传输超文本到本地浏览器的传送协议。</p>
<p><strong>UDP对应的协议：</strong></p>
<p>（1） <strong>DNS</strong>：用于域名解析服务，将域名地址转换为IP地址。DNS用的是<strong>53</strong>号端口。</p>
<p>（2） <strong>SNMP</strong>：简单网络管理协议，使用<strong>161</strong>号端口，是用来管理网络设备的。由于网络设备很多，无连接的服务就体现出其优势。</p>
<p>（3） <strong>TFTP</strong>(Trival File Transfer Protocal)，简单文件传输协议，该协议在熟知端口<strong>69</strong>上使用UDP服务。</p>
<h2 id="9-DNS域名系统，简单描述其工作原理。"><a href="#9-DNS域名系统，简单描述其工作原理。" class="headerlink" title="9.DNS域名系统，简单描述其工作原理。"></a>9.DNS域名系统，简单描述其工作原理。</h2><p>　　当 <code>DNS</code> 客户机需要在程序中使用名称时，它会查询 <code>DNS</code> 服务器来解析该名称。客户机发送的每条查询信息包括三条信息：包括：指定的 <code>DNS</code> 域名，指定的查询类型，<code>DNS</code> 域名的指定类别。基于 <code>UDP</code> 服务，端口53. 该应用一般不直接为用户使用，而是为其他应用服务，如 <code>HTTP</code>，<code>SMTP</code>等在其中需要完成主机名到IP地址的转换。</p>
<h2 id="10-面向连接和非面向连接的服务的特点是什么？"><a href="#10-面向连接和非面向连接的服务的特点是什么？" class="headerlink" title="10.面向连接和非面向连接的服务的特点是什么？"></a>10.面向连接和非面向连接的服务的特点是什么？</h2><ul>
<li><p>面向连接的服务，通信双方在进行通信之前，要先在双方建立起一个完整的可以彼此沟通的通道，在通信过程中，整个连接的情况一直可以被实时地监控和管理。</p>
</li>
<li><p>非面向连接的服务，不需要预先建立一个联络两个通信节点的连接，需要通信的时候，发送节点就可以往网络上发送信息，让信息自主地在网络上去传，一般在传输的过程中不再加以监控。</p>
</li>
</ul>
<h2 id="11-TCP的三次握手过程？为什么会采用三次握手，若采用二次握手可以吗？"><a href="#11-TCP的三次握手过程？为什么会采用三次握手，若采用二次握手可以吗？" class="headerlink" title="11.TCP的三次握手过程？为什么会采用三次握手，若采用二次握手可以吗？"></a>11.TCP的三次握手过程？为什么会采用三次握手，若采用二次握手可以吗？</h2><p>答：建立连接的过程是利用客户服务器模式，假设主机 <code>A</code> 为客户端，主机 <code>B</code> 为服务器端。</p>
<p>（1）<code>TCP</code> 的三次握手过程：主机 <code>A</code> 向 <code>B</code> 发送连接请求；主机 <code>B</code> 对收到的主机 <code>A</code> 的报文段进行确认；主机 <code>A</code> 再次对主机 <code>B</code> 的确认进行确认。</p>
<p>（2）采用三次握手是为了防止失效的连接请求报文段突然又传送到主机 <code>B</code>，因而产生错误。失效的连接请求报文段是指：<strong>主机 A 发出的连接请求没有收到主机 B 的确认，于是经过一段时间后，主机 A 又重新向主机 B 发送连接请求，且建立成功，顺序完成数据传输。</strong>考虑这样一种特殊情况，主机 <code>A</code> 第一次发送的连接请求并没有丢失，而是因为网络节点导致延迟达到主机 <code>B</code>，<strong>主机 B 以为是主机 A 又发起的新连接，于是主机 B 同意连接，并向主机 A 发回确认，但是此时主机 A 根本不会理会</strong>，主机 <code>B</code> 就一直在等待主机 <code>A</code> 发送数据，导致主机 <code>B</code> 的资源浪费。（这就是缺少第三次握手( <code>A</code> 再给 <code>B</code> 确认））</p>
<p>（3）采用两次握手不行，原因就是上面说的实效的连接请求的特殊情况。</p>
<h2 id="12-了解交换机、路由器、网关的概念，并知道各自的用途"><a href="#12-了解交换机、路由器、网关的概念，并知道各自的用途" class="headerlink" title="12.了解交换机、路由器、网关的概念，并知道各自的用途"></a>12.了解交换机、路由器、网关的概念，并知道各自的用途</h2><p><strong>1）交换机</strong></p>
<p>在计算机网络系统中，交换机是针对共享工作模式的弱点而推出的。交换机拥有一条高带宽的背部总线和内部交换矩阵。交换机的所有的端口都挂接在这条背部总线上，当控制电路收到数据包以后，<strong>处理端口会查找内存中的地址对照表以确定目的MAC（网卡的硬件地址）的NIC（网卡）挂接在哪个端口上</strong>，通过内部 交换矩阵迅速将数据包传送到目的端口。目的 <code>MAC</code> 若不存在，交换机才广播到所有的端口，接收端口回应后交换机会“学习”新的地址，并把它添加入内部地址表 中。</p>
<p><strong>交换机工作于OSI参考模型的第二层，即数据链路层</strong>。交换机内部的 <code>CPU</code> 会在每个端口成功连接时，通过 <code>ARP</code> 协议学习它的 <code>MAC</code> 地址，保存成一张 <code>ARP</code>表。在今后的通讯中，发往该 <code>MAC</code> 地址的数据包将仅送往其对应的端口，而不是所有的端口。因此，交换机可用于划分数据链路层广播，即冲突域；但它不 能划分网络层广播，即广播域。</p>
<p>交换机被广泛应用于二层网络交换，俗称“二层交换机”。</p>
<p>交换机的种类有：二层交换机、三层交换机、四层交换机、七层交换机分别工作在 <code>OSI</code> 七层模型中的第二层、第三层、第四层盒第七层，并因此而得名。</p>
<p><strong>2）路由器</strong></p>
<p><strong>路由器</strong>（<strong>Router</strong>）是一种计算机网络设备，提供了路由与转送两种重要机制，可以决定数据包从来源端到目的端所经过 的路由路径（ <code>host</code> 到 <code>host</code> 之间的传输路径），这个过程称为路由；将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行)，这称为转送。路由工作在<strong>OSI模型的第三层——即网络层</strong>，例如网际协议。</p>
<p><strong>路由器的一个作用是连通不同的网络，另一个作用是选择信息传送的线路。</strong> 路由器与交换器的差别，路由器是属于 <code>OSI</code> 第三层的产品，交换器是 <code>OSI</code> 第二层的产品(这里特指二层交换机)。</p>
<p><strong>3）网关</strong></p>
<p><strong>网关</strong>（<code>Gateway</code>），<strong>网关</strong>顾名思义就是连接两个网络的设备，区别于路由器（由于历史的原因，许多有关<code>TCP/IP</code> 的文献曾经把网络层使用的路由器（<code>Router</code>）称为网关，<strong>在今天很多局域网采用都是路由来接入网络，因此现在通常指的网关就是路由器的IP</strong>），经常在家庭中或者小型企业网络中使用，用于连接局域网和 <code>Internet</code>。 网关也经常指把一种协议转成另一种协议的设备，比如语音网关。</p>
<blockquote>
<p>文章来源于网络</p>
<p>原文链接：<a href="https://www.cnblogs.com/xdyixia/p/9275246.html" target="_blank" rel="noopener">https://www.cnblogs.com/xdyixia/p/9275246.html</a></p>
</blockquote>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>转载</category>
      </categories>
      <tags>
        <tag>网络类</tag>
      </tags>
  </entry>
  <entry>
    <title>图</title>
    <url>/2020/01/27/10.%E5%9B%BE/</url>
    <content><![CDATA[<p>此图非彼图，今天来学习一种十分重要，在生活中也经常使用的数据结构「图」</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="一、图"><a href="#一、图" class="headerlink" title="一、图"></a>一、图</h2><p>图就是由一些点与边组成，点之间是边，边两头有点，类似于我们所画的思维导图。根据点之间连接的边是否有具体指向区分为『有向图』和『无向图』。</p>
<p>那么，<br>图可以做什么呢？它可以解决最经典的问题『寻找最短路径』。类似于地图，如想知道从别墅到公司走哪条路最短，可以通过图来建立模型，将十字路口（三叉路口等连接几条路的路口）看作是点，每条路就是边，别墅是起点，公司是终点。</p>
<p>上面只完成了第一步，有了图之后，该如何寻找最短路径呢？下面就需要再介绍一种图算法『广度优先搜索』</p>
<h2 id="二、广度优先搜索算法"><a href="#二、广度优先搜索算法" class="headerlink" title="二、广度优先搜索算法"></a>二、广度优先搜索算法</h2><p><strong>广度优先搜索算法</strong>可以通过一个例子进行描述：小明想通过走动，帮助儿子进入县一中（当地最好的学校）。于是他开始回忆自己的朋友是否有县一中的领导或者认识其领导，思考之后发现并没有，然后让朋友询问朋友的朋友是否有关系。像这样，为了在社交网络中寻找到关系，先看自己（自己肯定不是，要不然直接安排了），然后将所有朋友加入到搜索名单中，看朋友中是否有关系，如果没有，再将朋友的朋友纳入范围继续寻找 …… 直到找到需要的人，这就是广度优先搜索算法。</p>
<blockquote>
<p>因为同朋友的亲密度比同朋友的朋友之间的亲密度要高，所以先从朋友之间寻找。如果将朋友比做是第一层关系，朋友的朋友为第二层，这样一层一层下去的就是广度优先搜索。如果找到一个朋友，就寻找他的朋友中是否有这样的人，如此以深度挖掘的方式搜索下去，就是深度优先搜索。</p>
</blockquote>
<p>它常用于寻找两地点或者两样物体之间的最短距离。总结为下面两种问题：</p>
<ul>
<li>从一点可以到另一点吗？</li>
<li>从一点到另一点哪条路径最短？</li>
</ul>
<p>现实生活中的例子有：</p>
<ul>
<li>各种智能机器，比如跳棋最少走几步可以获胜</li>
<li>到目的地的最短路线</li>
</ul>
<p>在搜索的过程中，大家可能注意到，先检查朋友，后检查朋友的朋友，是有顺序的，那么如何保持顺序呢？那就需要使用到另外一种数据结构『队列』</p>
<h2 id="三、队列"><a href="#三、队列" class="headerlink" title="三、队列"></a>三、队列</h2><p>队列很简单，和生活中的排队一样，比如购票，结账时，先排队的人先买到票或者结账完成。就是有顺序，先进先出（<code>First In First Out</code>）的一种数据结构，它只有两种行为，入队和出队。类比生活中排队，有素质的人不能出现插队吧？</p>
<blockquote>
<p>队列常常与栈进行对比，栈是一种先进后出的数据结构，或描述为后进先出（<code>Last In First Out</code>）</p>
<p>深度优先搜索就常使用栈。</p>
</blockquote>
<h2 id="四、实现图"><a href="#四、实现图" class="headerlink" title="四、实现图"></a>四、实现图</h2><p>代码如何实现图呢？首先图由多个节点构成，每个节点与邻近节点相连，要表示这种关系，可以联想到『散列表』，其映射关系可以将键映射到一个值或多个值。在 <code>Python</code> 中则使用字典表示：</p>
<pre class=" language-python"><code class="language-python">graph <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
graph<span class="token punctuation">[</span><span class="token string">"小明"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"小花"</span><span class="token punctuation">,</span> <span class="token string">"小玉"</span><span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">]</span>
graph<span class="token punctuation">[</span><span class="token string">"小玉"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"小帆"</span><span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">]</span></code></pre>
<blockquote>
<p>散列表是无序的</p>
</blockquote>
<h2 id="五、实现图算法"><a href="#五、实现图算法" class="headerlink" title="五、实现图算法"></a>五、实现图算法</h2><p>还是沿用小明为儿子学校找关系的示例，实现代码如下：</p>
<pre class=" language-python"><code class="language-python"><span class="token comment" spellcheck="true"># 该字典表示图，其中将小明与朋友，小明朋友与朋友的朋友之间的关系</span>
graph <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">}</span>

<span class="token keyword">def</span> <span class="token function">person_is_seller</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token comment" spellcheck="true"># 具体判断过程省略，该函数返回 true 或 false，即是或者不是</span>
    <span class="token keyword">pass</span>

<span class="token keyword">def</span> <span class="token function">search</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token comment" spellcheck="true"># 创建一个队列</span>
    search_queue <span class="token operator">=</span> deque<span class="token punctuation">(</span><span class="token punctuation">)</span> 
    <span class="token comment" spellcheck="true"># 为队列中不断添加朋友或者朋友的朋友，即要搜索的人</span>
    search_queue <span class="token operator">+=</span> graph<span class="token punctuation">[</span>name<span class="token punctuation">]</span> 
    <span class="token comment" spellcheck="true"># 这个列表用于记录检查过的人</span>
    searched <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
    <span class="token comment" spellcheck="true"># 只要队列不为空就一直搜索下去</span>
    <span class="token keyword">while</span> search_queue<span class="token punctuation">:</span>
        <span class="token comment" spellcheck="true"># 取出队列中左面第一个人</span>
        person <span class="token operator">=</span> search_queue<span class="token punctuation">.</span>popleft<span class="token punctuation">(</span><span class="token punctuation">)</span> 
        <span class="token comment" spellcheck="true"># 仅当这个人没检查过时才检查</span>
        <span class="token keyword">if</span> <span class="token operator">not</span> person <span class="token keyword">in</span> searched<span class="token punctuation">:</span>
            <span class="token comment" spellcheck="true"># 看这个人是否是小明需要找的关系</span>
            <span class="token keyword">if</span> person_is_seller<span class="token punctuation">(</span>person<span class="token punctuation">)</span><span class="token punctuation">:</span>
                  <span class="token comment" spellcheck="true"># 是的话输出是要找的关系</span>
                <span class="token keyword">print</span><span class="token punctuation">(</span>person <span class="token operator">+</span> <span class="token string">" is the one you are looking for!"</span><span class="token punctuation">)</span>
                <span class="token comment" spellcheck="true"># 结束循环</span>
                <span class="token keyword">return</span> <span class="token boolean">True</span>
            <span class="token keyword">else</span><span class="token punctuation">:</span>
                  <span class="token comment" spellcheck="true"># 把这个人的朋友添加到队列中</span>
                  search_queue <span class="token operator">+=</span> graph<span class="token punctuation">[</span>person<span class="token punctuation">]</span> 
                <span class="token comment" spellcheck="true"># 将这个人标记为检查过</span>
                searched<span class="token punctuation">.</span>append<span class="token punctuation">(</span>person<span class="token punctuation">)</span>
        <span class="token keyword">return</span> <span class="token boolean">False</span>

search<span class="token punctuation">(</span><span class="token string">"小明"</span><span class="token punctuation">)</span></code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <tags>
        <tag>算法类</tag>
      </tags>
  </entry>
  <entry>
    <title>CentOS这些情况你也遇到过</title>
    <url>/2019/12/22/13.CentOS%E8%BF%99%E4%BA%9B%E6%83%85%E5%86%B5%E4%BD%A0%E4%B9%9F%E9%81%87%E5%88%B0%E8%BF%87/</url>
    <content><![CDATA[<p>CentOS 虚拟机许久未用，忘记密码如何是好？删掉再来又岂能甘心？想安装某个命令，直接 yum install 就可以了吗？远程连接服务器报错该怎样操作？</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="1-CentOS-无法登陆情况下修改密码"><a href="#1-CentOS-无法登陆情况下修改密码" class="headerlink" title="1.CentOS 无法登陆情况下修改密码"></a>1.CentOS 无法登陆情况下修改密码</h2><p><strong>背景：</strong>虚拟机忘记 <code>root</code> 密码，不知如何登陆</p>
<p><strong>环境：</strong><code>CentOS</code>，<code>root</code> 账户</p>
<p><strong>操作：</strong></p>
<p>1.开启虚拟机，在进入系统前选择项页面，按 <code>e</code> 键进入系统配置文件</p>
<p>2.向下移动光标，找到 <code>Linux16</code> 开头，大概意思如下的一句话：</p>
<pre class=" language-shell"><code class="language-shell">Linux16 /vmlinuz-3.10.0xxxxxx.x86_64 root=UUID=xxxxxxxx ro  crashkernel=auto rhgb quiet LANG=zh_CN.UTF-8 </code></pre>
<p>3.在该行的最后加空格，输入 <code>init=/bin/sh</code></p>
<p>4.接下来按 <code>Ctrl + x</code> 组合键进入单用户模式</p>
<blockquote>
<p>等待一会，会发现已经进入系统，只不过，命令行前缀变为类似 <code>sh-4.2#</code> 的效果</p>
</blockquote>
<p>5.输入如下命令：</p>
<pre class=" language-shell"><code class="language-shell">mount -o remount,rw /</code></pre>
<p>6.之后输入如下命令：</p>
<pre class=" language-shell"><code class="language-shell">passwd</code></pre>
<p>7.接下来就是修改 <code>root</code> 账号密码了</p>
<blockquote>
<p>重复输入一个不少于8位的密码（密码在输入时是不显示的，只需要正确输入并回车即可）</p>
</blockquote>
<p>8.出现 <code>successfully</code> 字样表示修改成功，但要生效还需继续操作</p>
<p>9.输入如下命令：</p>
<pre class=" language-shell"><code class="language-shell">touch /.autorelabel</code></pre>
<p>10.操作完毕，还有一步：</p>
<pre class=" language-shell"><code class="language-shell">exec /sbin/init</code></pre>
<p>接下来就是等待系统重启（可能需要几分钟，需耐心等待，勿中途关机）</p>
<h2 id="2-安装命令小技巧"><a href="#2-安装命令小技巧" class="headerlink" title="2.安装命令小技巧"></a>2.安装命令小技巧</h2><p>安装命令，大家一定会想到：</p>
<pre class=" language-shell"><code class="language-shell">yum install xxx</code></pre>
<p>但并非所有命令都是如此。有些则处于某工具包中，需要下载其基础环境，那该如何操作？</p>
<p>只需执行：</p>
<pre class=" language-shell"><code class="language-shell">yum search xxx</code></pre>
<p>耐心等待几分钟，直到执行完毕。然后安装最后提示模块即可。</p>
<h4 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h4><pre class=" language-shell"><code class="language-shell">yum search killall</code></pre>
<p>提示：</p>
<pre class=" language-shell"><code class="language-shell">Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile

base: mirrors.163.com
extras: mirrors.aliyun.com
*> updates: mirrors.aliyun.com
-----------------------------------Matched:killall-----------------------------------/
psmisc.x86_64 : Utilities for managing processes on your system</code></pre>
<blockquote>
<p>可看到 <code>killall</code> 命令处于 <code>psmisc.x86_64</code> 中</p>
</blockquote>
<p>然后输入：</p>
<pre class=" language-shell"><code class="language-shell">yum install psmisc.x86_64</code></pre>
<h2 id="3-远程连接服务器"><a href="#3-远程连接服务器" class="headerlink" title="3.远程连接服务器"></a>3.远程连接服务器</h2><p><strong>背景：</strong>使用 <code>ssh</code> 连接服务器进行相关操作，报错</p>
<p><strong>环境：</strong>本地 <code>MacOS</code>，服务器 <code>CentOS</code></p>
<p><strong>操作：</strong></p>
<p>1.使用命令进行远程连接，然后报错如下：</p>
<pre class=" language-shell"><code class="language-shell">❱ ssh root@192.168.xx.xx
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:ZBm9L5432tibaN5+weK4h9NJzqrc76lvxOUkVvSLGac.
Please contact your system administrator.
Add correct host key in /Users/ethanyan/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/ethanyan/.ssh/known_hosts:6
ECDSA host key for 192.168.xx.xx has changed and you have requested strict checking.
Host key verification failed.</code></pre>
<p>2.使用如下命令进行解决：</p>
<pre class=" language-shell"><code class="language-shell">ssh-keygen -R 你要访问的IP地址</code></pre>
<p>3.最后再次使用命令进行连接发现连接成功：</p>
<pre class=" language-shell"><code class="language-shell">ssh 用户@你要访问的ip地址</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
  </entry>
  <entry>
    <title>crontab执行python脚本不成功解决方案？（续）</title>
    <url>/2019/11/17/27.%E6%89%A7%E8%A1%8Cpython%E8%84%9A%E6%9C%AC/</url>
    <content><![CDATA[<p>Linux 设置定时任务，crontab 执行 python 脚本不生效的问题：</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>尝试方法：</p>
<p>1.给 python 脚本第一行添加如下代码：</p>
<pre class=" language-python"><code class="language-python"><span class="token comment" spellcheck="true">#!/usr/bin/python</span></code></pre>
<blockquote>
<p>当然 python 解释器的路径要按照自己情况进行填写。</p>
</blockquote>
<p>2.如果 python 脚本报错，模块未找到等等，尝试如下方式：</p>
<pre class=" language-python"><code class="language-python"><span class="token keyword">import</span> sys
sys<span class="token punctuation">.</span>path<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token string">'xxx&lt;第三方模块的路径>'</span><span class="token punctuation">)</span></code></pre>
<blockquote>
<p>如果是虚拟环境，有可能此路径不同，可以通过下列命令查看：</p>
<pre class=" language-python"><code class="language-python"><span class="token keyword">import</span> elasticsearch
elasticsearch<span class="token punctuation">.</span>__file__</code></pre>
</blockquote>
<p>然后将路径复制到 <code>sys.path.append(&#39;&#39;)</code> 中的引号即可，如：</p>
<pre class=" language-python"><code class="language-python">D<span class="token punctuation">:</span>\\E\\python_virtual\\fbl5n\\lib\\site<span class="token operator">-</span>packages</code></pre>
<p>3.python 脚本中不涉及复杂的逻辑，简单的函数即函数调用即可，如果出现下列代码，请去掉：</p>
<pre class=" language-python"><code class="language-python"><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">'__main__'</span><span class="token punctuation">:</span></code></pre>
<p>它会将 crontab 在调用的时候搞晕。</p>
<p>4.可以写一个 shell 脚本去调用 python 脚本，如下：</p>
<pre class=" language-shell"><code class="language-shell">#!/usr/bin/bash
cd /opt
/usr/bin/python3 mail_reminder.py >> log.txt 2>&1</code></pre>
<blockquote>
<p>0 表示stdin标准输入<br>1 表示stdout标准输出<br>2 表示stderr标准错误<br>&amp; 表示等同于的意思<br>2&gt;&amp;1 表示2的输出重定向等同于1</p>
</blockquote>
<p>5.当报错编码问题时可以尝试使用如下方法：</p>
<pre class=" language-shell"><code class="language-shell">#!/usr/bin/bash 
cd /opt 
PYTHONIOENCODING=utf-8 /usr/bin/python3 mail_reminder.py >> log.txt 2>&1</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>bat脚本常用命令</title>
    <url>/2019/11/14/12.bat%E8%84%9A%E6%9C%AC%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</url>
    <content><![CDATA[<p>bat 脚本？如果不是从事微软开发相关工作的人员，是不是感觉很耳熟但是又好像不熟悉？还等什么，一睹为快</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>bat 脚本是 windows 上所用的脚本，我们经常使用的 cmd 一些命令就可以使用。也许你会说为什么不使用 powershell 脚本？因为古老的一些服务器上面没有安装 powershell 你信不信？比如 windows server 2003。</p>
<p>很荣幸，我遇到了，没有什么办法，只能查阅相关资料迎难而上了！脚本其实很简单，下面做一个记录，供大家有需要时获取：</p>
<h4 id="1-设置变量"><a href="#1-设置变量" class="headerlink" title="1.设置变量"></a>1.设置变量</h4><p>设置变量使用 <code>SET</code> 关键字，语法如下：</p>
<pre class=" language-powershell"><code class="language-powershell"><span class="token function">SET</span> 变量名=变量值</code></pre>
<blockquote>
<p>1.<strong>变量名与变量值一定要紧挨等于号！！！</strong>否则报错到怀疑人生。</p>
<p>2.变量值如果是个字符串，直接写内容，不需要加双引号。（是不是很方便）</p>
</blockquote>
<h4 id="2-使用变量"><a href="#2-使用变量" class="headerlink" title="2.使用变量"></a>2.使用变量</h4><p>使用变量时语法如下：</p>
<pre class=" language-powershell"><code class="language-powershell"><span class="token operator">%</span>变量名<span class="token operator">%</span></code></pre>
<h4 id="3-判断语句"><a href="#3-判断语句" class="headerlink" title="3.判断语句"></a>3.判断语句</h4><p>判断语句必不可少，if … else… 语法如下：</p>
<pre class=" language-powershell"><code class="language-powershell"><span class="token keyword">if</span> 条件 <span class="token punctuation">(</span>
    条件成立执行内容
<span class="token punctuation">)</span> <span class="token keyword">else</span> <span class="token punctuation">(</span>
    条件不成立执行内容
<span class="token punctuation">)</span></code></pre>
<h4 id="4-回显"><a href="#4-回显" class="headerlink" title="4.回显"></a>4.回显</h4><p>类似于 python 中的 print 函数，即将后方的内容打印输出：</p>
<pre class=" language-powershell"><code class="language-powershell"><span class="token function">echo</span> 我就是要回显的内容</code></pre>
<h4 id="5-创建文件夹"><a href="#5-创建文件夹" class="headerlink" title="5.创建文件夹"></a>5.创建文件夹</h4><p>创建目录你还在想 <code>mkdir</code> 的时候，windows 已经考虑简化了：</p>
<pre class=" language-powershell"><code class="language-powershell">md 文件夹路径</code></pre>
<blockquote>
<p>之所以写文件夹路径，是因为可以创建嵌套目录啊！不需要任何参数，简单不简单？</p>
</blockquote>
<h4 id="6-输出内容到文件"><a href="#6-输出内容到文件" class="headerlink" title="6.输出内容到文件"></a>6.输出内容到文件</h4><p>大家如果熟悉 Linux 系统，那么对于重定向命令一定很熟悉了，bat 脚本完全一样，如果是创建一个文件，或者已有文件覆盖内容的话，可以使用 <code>&gt;</code> 命令；如果是要往加过里面追加内容的话，直接使用 <code>&gt;&gt;</code> 即可。示例如下：</p>
<pre class=" language-shell"><code class="language-shell">echo test content > C:\test\test.txt</code></pre>
<h4 id="7-关闭系统信息回显"><a href="#7-关闭系统信息回显" class="headerlink" title="7.关闭系统信息回显"></a>7.关闭系统信息回显</h4><p>我们在执行脚本的时候，系统会执行 N 多步可知，不可知的步骤，因此会输出大量的信息，如果只想看自己回显的信息呢？可以使用如下命令：</p>
<pre class=" language-shell"><code class="language-shell">@echo off</code></pre>
<blockquote>
<p>需要再文件的开头书写</p>
</blockquote>
<h4 id="8-标题"><a href="#8-标题" class="headerlink" title="8.标题"></a>8.标题</h4><p>小黑窗口左上角的字该怎么改呢？看下方：</p>
<pre class=" language-powershell"><code class="language-powershell">@title monitoring_log by EthanYan</code></pre>
<h4 id="9-其他"><a href="#9-其他" class="headerlink" title="9.其他"></a>9.其他</h4><p>如果你看其他人写的脚本，也许会在文件开头看到这样一句：</p>
<pre class=" language-shell"><code class="language-shell">mode con lines=5 cols=40</code></pre>
<p>它是设置显示内容的小黑窗口大小的命令。lines 指的是高，cols 指宽度。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>微软</category>
      </categories>
      <tags>
        <tag>脚本类</tag>
      </tags>
  </entry>
  <entry>
    <title>python 字符串前面的那些特殊字符</title>
    <url>/2019/11/04/26.python%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%89%8D%E9%9D%A2%E7%9A%84%E9%82%A3%E4%BA%9B%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6/</url>
    <content><![CDATA[<p>对于 Python 的字符串大家并不陌生，引号引用即为字符串。那么字符串前面经常加的一些特殊字母就让初学者懵逼了，今天我们就来详细讲一下 ……</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="1-u"><a href="#1-u" class="headerlink" title="1.u"></a>1.u</h2><p>作为程序员，看到 <code>u</code> 字符，首先想到的便是 <code>Unicode</code> 这个单词。没错，它确实也代表此含义。目的是告知后面字符串采用 <code>Unicode</code> 编码格式，应用对象自然是容易出现问题的<strong>中文字符串</strong>。</p>
<p>有时我们存储完成后，再次取用发现格式不一致，或者显示乱码等问题，使用 <code>u</code> 便很好解决了。</p>
<h2 id="2-f"><a href="#2-f" class="headerlink" title="2.f"></a>2.f</h2><p>这个字符经常看到，不知你是否还注意到一个现象，那便是出现此字符的字符串，字符串中必定会有大括号。哈哈，忘记也没有关系，要不然我讲什么呢？</p>
<p>此字符代表的是在后面字符串中可以使用大括号（大括号中可以使用 <code>python</code> 表达式）。如：</p>
<pre class=" language-python"><code class="language-python">f<span class="token string">"testfile-{str(time.time()).replace('.','')}.txt"</span></code></pre>
<p>输出结果为：</p>
<pre class=" language-python"><code class="language-python">testfile<span class="token number">-15728489624240513.</span>txt</code></pre>
<blockquote>
<p>这样我们在字符串中就可以随心所欲的使用任何表达式，不再通过 <code>+</code> 拼接各种字符串了。</p>
</blockquote>
<h2 id="3-r"><a href="#3-r" class="headerlink" title="3.r"></a>3.r</h2><p><code>r</code> 这个字符是否更眼熟了？没错，在学习正则表达式时，大家都见过。此字符含义与其相同，代表将字符串中各种特殊符号进行转义，字符串中内容 <code>所见即所得</code> 。比如 ：</p>
<pre class=" language-python"><code class="language-python">r<span class="token string">'你好：\n您的快递'</span></code></pre>
<p>其中的 <code>\n</code> 不再表示换行符，而是反斜杠加字母 <code>\n</code></p>
<h2 id="4-b"><a href="#4-b" class="headerlink" title="4.b"></a>4.b</h2><p>这个字符就更常见了，它表示 <code>bytes</code> 类型。它可以与字符串类型相互转换，使用 <code>encode</code> 与 <code>decode</code>。</p>
<h3 id="bytes-gt-string"><a href="#bytes-gt-string" class="headerlink" title="bytes -&gt; string"></a>bytes -&gt; string</h3><pre class=" language-python"><code class="language-python">by <span class="token operator">=</span> b<span class="token string">'test'</span>
by<span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf8'</span><span class="token punctuation">)</span></code></pre>
<h3 id="string-gt-bytes"><a href="#string-gt-bytes" class="headerlink" title="string -&gt; bytes"></a>string -&gt; bytes</h3><pre class=" language-python"><code class="language-python">str <span class="token operator">=</span> <span class="token string">'test'</span>
str<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token string">'utf8'</span><span class="token punctuation">)</span></code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>crontab定时执行python脚本不成功解决方案</title>
    <url>/2019/10/31/14.crontab%E5%AE%9A%E6%97%B6%E6%89%A7%E8%A1%8Cpython%E8%84%9A%E6%9C%AC%E4%B8%8D%E6%88%90%E5%8A%9F%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</url>
    <content><![CDATA[<p>目前有一个需求是定时执行某个 python 脚本，但是在 Linux 上设置 crontab 后，不生效？手动执行生效？于是使用下面的方法执行即可：</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>大体思路为先写一个 <code>shell</code> 脚本，脚本中执行 <code>python</code> 文件，然后定时执行 <code>shell</code> 脚本即可。具体原因不明，正在探索中 …… 目前只提供一种解决方案。</p>
<p>1.使用如下命令创建脚本：</p>
<pre class=" language-shell"><code class="language-shell">vi start.sh</code></pre>
<p>2.然后在 <code>start.sh</code> 脚本中结合本身情况输入内容，示例：</p>
<pre class=" language-shell"><code class="language-shell">#!/usr/bin/bash
cd /opt
/usr/bin/python3 /opt/test_mail.py</code></pre>
<p>3.然后使用如下命令，编辑定时任务：</p>
<pre class=" language-shell"><code class="language-shell">crontab -e</code></pre>
<p>4.假如设定每天 8 点执行脚本，设置如下：</p>
<pre class=" language-shell"><code class="language-shell">0 8 * * * /opt/start.sh</code></pre>
<p>5.保存定时任务，几分钟后自动生效。</p>
<blockquote>
<p><strong>注意</strong>：所有的路径都使用<strong>绝对路径</strong>，否则仍然无效。</p>
</blockquote>
<p><a href="https://bigocean1.gitee.io/2019/11/17/27.%E6%89%A7%E8%A1%8Cpython%E8%84%9A%E6%9C%AC/" target="_blank" rel="noopener">crontab执行python脚本不成功解决方案？（续）</a></p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>python导入导出pip环境中所有模块</title>
    <url>/2019/10/28/24.python%E5%AF%BC%E5%85%A5%E5%AF%BC%E5%87%BApip%E7%8E%AF%E5%A2%83%E4%B8%AD%E6%89%80%E6%9C%89%E6%A8%A1%E5%9D%97/</url>
    <content><![CDATA[<p>python 环境如何搭建？项目依赖模块如何安装？备份环境时如何将所有 pip 安装的模块导出？请看下文</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>导出所有模块：</p>
<pre class=" language-shell"><code class="language-shell">pip freeze >requirements.txt</code></pre>
<p>导入所有模块：</p>
<pre class=" language-shell"><code class="language-shell">pip install -r requirements.txt</code></pre>
<blockquote>
<p><strong>注意</strong>：执行此命令时<strong>需要联网</strong>，其原理还是依次对文件中每一个模块进行 <code>pip install</code></p>
</blockquote>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>语言类</tag>
      </tags>
  </entry>
  <entry>
    <title>hexo命令速查小册</title>
    <url>/2019/10/27/23.hexo%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5%E5%B0%8F%E5%86%8C/</url>
    <content><![CDATA[<p>最近都在搭建自己的博客，不断的调整显示效果，以及添加一些初始功能，总算大体框架完成，细枝末节还有待商榷。我的博客地址为: <a href="http://www.8868866.xyz/">http://www.8868866.xyz/</a>  ，希望大家多多捧场 ~ 当然也希望大家多多关注公众号『大海的BLOG』</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>搭建博客的过程中使用到了框架 Node.js、HEXO 以及 GitHub 。</p>
<p>下面就经常使用到的 hexo 的命令做一个总结，方便在使用过程中快速查阅。</p>
<h4 id="创建新文章"><a href="#创建新文章" class="headerlink" title="创建新文章"></a>创建新文章</h4><pre class=" language-shell"><code class="language-shell">hexo n "article name"
或者
hexo new "article name"</code></pre>
<h4 id="快速部署"><a href="#快速部署" class="headerlink" title="快速部署"></a>快速部署</h4><pre class=" language-shell"><code class="language-shell">hexo clean && hexo g && hexo d</code></pre>
<p>其实上述为 3 个命令，为了节省时间，我经常联合使用。</p>
<blockquote>
<p>hexo clean 清除缓存</p>
<p>hexo g 生成静态页面（generate）</p>
<p>hexo d 部署（deploy）</p>
</blockquote>
<h4 id="本地效果预览"><a href="#本地效果预览" class="headerlink" title="本地效果预览"></a>本地效果预览</h4><pre class=" language-shell"><code class="language-shell">hexo s</code></pre>
<blockquote>
<p>s 为 server 的简写，因此你也可以写成 hexo server。hexo 的命令大多都是如此</p>
</blockquote>
<h4 id="文章摘要"><a href="#文章摘要" class="headerlink" title="文章摘要"></a>文章摘要</h4><p>首页会根据分页效果展示文章，如果不设置摘要，文章会拉长页面篇幅。</p>
<p>我们只需要在文章摘要后添加一行内容即可：</p>
<pre class=" language-shell"><code class="language-shell"><!--more--></code></pre>
<h4 id="添加标签"><a href="#添加标签" class="headerlink" title="添加标签"></a>添加标签</h4><p>先执行：</p>
<pre class=" language-shell"><code class="language-shell">hexo new page "tags"</code></pre>
<p>再在目录 <code>source/tags/index.md</code> 中添加：</p>
<pre class=" language-shell"><code class="language-shell">---
title: tags
date: 2019-05-27 13:47:40
type: "tags"
---</code></pre>
<p>最后只需要在写文章时添加 <code>tags</code> 属性即可。</p>
<p>如果只添加一个标签：</p>
<pre class=" language-shell"><code class="language-shell">tags: test</code></pre>
<p>多标签，文章开头添加：（yaml语法）</p>
<pre class=" language-shell"><code class="language-shell">tags:
- test1
- test2
- test3</code></pre>
<h4 id="添加文章分类目录"><a href="#添加文章分类目录" class="headerlink" title="添加文章分类目录"></a>添加文章分类目录</h4><p>添加分类如同标签一样，只需要将 <code>tags</code> 换成 <code>categories</code> 即可，如：</p>
<pre class=" language-shell"><code class="language-shell">hexo new page "categories"</code></pre>
<p><strong>注意：</strong>如下形式，同篇文章添加多个目录和标签：</p>
<pre class=" language-yml"><code class="language-yml">tags:
- 算法
- 数据结构
categories:
- 算法
- 数据结构</code></pre>
<p><strong>同篇文章添加多个目录和标签时，请将与其他文章共同的目录放置在前面，优先级高一些。</strong>比如，文章A归为目录算法和机器学习下，文章B归为目录算法和数据结构下。他们在划分目录时，需如下填写：</p>
<pre class=" language-yaml"><code class="language-yaml"><span class="token comment" spellcheck="true"># 文章A</span>
<span class="token key atrule">categories</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> 算法
<span class="token punctuation">-</span> 机器学习

<span class="token comment" spellcheck="true"># 文章B</span>
<span class="token key atrule">categories</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> 算法
<span class="token punctuation">-</span> 数据结构</code></pre>
<p>如果先写各自不同的目录，再写共同目录时，会在前端目录展示页面中出现重复目录。因为框架在创建目录时，会按如下形式创建表示目录的文件夹，以上述例子示范：</p>
<pre class=" language-yaml"><code class="language-yaml">算法
├── 机器学习
└── 数据结构
<span class="token comment" spellcheck="true"># 框架会先创建一个算法的文件夹，然后在算法文件夹下创建两个其他文件夹，这样避免目录重复</span></code></pre>
<p>如果在目录填写时按如下情况：</p>
<pre class=" language-yaml"><code class="language-yaml"><span class="token comment" spellcheck="true"># 文章A</span>
<span class="token key atrule">categories</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> 机器学习
<span class="token punctuation">-</span> 算法

<span class="token comment" spellcheck="true"># 文章B</span>
<span class="token key atrule">categories</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> 数据结构
<span class="token punctuation">-</span> 算法</code></pre>
<p>框架在生成目录时：</p>
<pre class=" language-yaml"><code class="language-yaml">机器学习
└── 算法

数据结构
└── 算法
<span class="token comment" spellcheck="true"># 框架会先生成每篇文章中各自不同的目录，然后在其下创建算法目录，造成重复</span></code></pre>
<p>框架在生成目录时，会优先创建写在首位的目录，再创建写在后面为止的目录，所以在展示所有的目录时，会出现重复的两个 <code>算法</code> 目录。</p>
<h4 id="文章中插入图片"><a href="#文章中插入图片" class="headerlink" title="文章中插入图片"></a>文章中插入图片</h4><p>如果在 Markdown 中直接插图，再转成静态页面时，路径会找不到，导致图片无法正常显示。解决办法有很多，我最喜欢的便是利用 GitHub 新建一个放置图片的仓库（当然很多人使用七牛云也很方便），然后在文章中使用插入连接的方式插入图片即可：</p>
<pre class=" language-shell"><code class="language-shell">![](https://github.com/XXXXX/XXX.图片格式)</code></pre>
<blockquote>
<p>连接地址利用以下步骤获取：打开GitHub图片仓库后，看到 Download 按钮，右键复制链接</p>
</blockquote>
<h4 id="绑定域名"><a href="#绑定域名" class="headerlink" title="绑定域名"></a>绑定域名</h4><p>大家首先需要去腾讯云或者阿里云购买一个域名，然后备案，再通过解析绑定个人博客地址。</p>
<p>命令暂且总结到此，预知后事如何，敬听下回分解 ~</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>随想</category>
      </categories>
  </entry>
  <entry>
    <title>Elasticsearch 中这些必备 API 你晓得嘛？</title>
    <url>/2019/10/25/18.Elasticsearch%20%E4%B8%AD%E8%BF%99%E4%BA%9B%E5%BF%85%E5%A4%87%20API%20%E4%BD%A0%E6%99%93%E5%BE%97%E5%98%9B%EF%BC%9F/</url>
    <content><![CDATA[<p>众所周知，ES 中的 mapping 只能在索引建立初期进行创建，且建立之后不可更改。mapping 对应的字段会映射成指定类型，未定义字段则自动映射，一般为 text 类型。那么想更改索引名或者更改某字段的 mapping 时，是否就束手无策了呢？当然不是！！！官方提供了一个接口，供索引备份迁移操作使用，那便是 <strong>reindex</strong>。当旧索引与新索引在同一节点时，效率相当高，万条数据瞬间完成（<code>大约只需0.4s</code>）。数百万数据也只需几分钟即可完成 操作，是不是很溜呢？快来学习一下吧。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<h2 id="1-索引备份迁移"><a href="#1-索引备份迁移" class="headerlink" title="1.索引备份迁移"></a>1.索引备份迁移</h2><p><strong>请求方式：POST</strong></p>
<p><strong>请求 API <code>_reindex</code></strong></p>
<pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>
  <span class="token property">"source"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token property">"index"</span><span class="token operator">:</span> <span class="token string">"要备份的索引名"</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token property">"dest"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token property">"index"</span><span class="token operator">:</span> <span class="token string">"新建的索引名"</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<blockquote>
<p>如果新索引中有数据，且 id 与旧索引中重复，那么会进行覆盖操作。</p>
</blockquote>
<p>但是当数据量实在太大，高达几十 G 的时候，速度就会变得很慢，那是因为它底层还是利用了 scroll 操作。该如何进行<strong>优化</strong>呢？可以提升批量操作的文档数大小，如下：</p>
<pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>
  <span class="token property">"source"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token property">"index"</span><span class="token operator">:</span> <span class="token string">"要备份的索引名"</span><span class="token punctuation">,</span>
    <span class="token property">"size"</span> <span class="token operator">:</span> <span class="token number">5000</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token property">"dest"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token property">"index"</span>  <span class="token operator">:</span> <span class="token string">"新建的索引名"</span><span class="token punctuation">,</span>
    <span class="token property">"routing"</span><span class="token operator">:</span> <span class="token string">"=cat"</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<p>批量操作大小是如何确定的呢？是根据文档数以及文档容量进行确定的。根据查阅资料得知，一个好的起点是<strong>每批处理数据 5-15 MB</strong>，这是个什么概念？</p>
<blockquote>
<p>1000 个 1kb 的文档大约 1MB；1000 个 100kb 的文档是 100MB。</p>
</blockquote>
<p>然后<strong>逐步增加每批处理数据容量</strong>，进行调优，直到最终性能无法再次提升。还有一个方法，那便是提升硬件，比如<strong>换固态</strong>，你懂得~</p>
<p>还有一种方法提升写入效率，这是终极操作，那便是 <code>sliced</code>。<code>reindex</code> 支持 Sliced Scroll 操作。它的原理可以简单的理解为将每次的 Scroll 请求分解，分解后并行化请求，从而提升效率。方式为：</p>
<pre class=" language-json"><code class="language-json">POST _reindex?slices=<span class="token number">5</span>&amp;refresh
<span class="token punctuation">{</span>
  <span class="token property">"source"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token property">"index"</span><span class="token operator">:</span> <span class="token string">"要备份的索引名"</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token property">"dest"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token property">"index"</span><span class="token operator">:</span> <span class="token string">"新建的索引名"</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<h2 id="2-删除索引中指定的数据"><a href="#2-删除索引中指定的数据" class="headerlink" title="2.删除索引中指定的数据"></a>2.删除索引中指定的数据</h2><p><strong>请求方式：POST</strong></p>
<p><strong>请求 API <code>_delete_by_query</code></strong></p>
<pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>
    <span class="token property">"query"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
        <span class="token property">"match"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
            <span class="token property">"字段名"</span><span class="token operator">:</span> <span class="token string">"字段值"</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<blockquote>
<p>方法便是先查出指定数据再删除。</p>
</blockquote>
<h2 id="3-设置副本数、分片、动态映射"><a href="#3-设置副本数、分片、动态映射" class="headerlink" title="3. 设置副本数、分片、动态映射"></a>3. 设置副本数、分片、动态映射</h2><p>设置这些指标项可在建立 mapping 时一同设置。</p>
<pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>
    <span class="token property">"settings"</span><span class="token operator">:</span><span class="token punctuation">{</span>
        <span class="token property">"index"</span><span class="token operator">:</span><span class="token punctuation">{</span>
            // 刷新间隔
            <span class="token property">"refresh_interval"</span><span class="token operator">:</span><span class="token string">"3s"</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span>
        // 副本数
        <span class="token property">"number_of_replicas"</span><span class="token operator">:</span><span class="token string">"0"</span><span class="token punctuation">,</span>
        // 切片（分布在每个节点上的切片）
        <span class="token property">"number_of_shards"</span><span class="token operator">:</span><span class="token string">"1"</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token property">"mappings"</span><span class="token operator">:</span><span class="token punctuation">{</span>
        <span class="token property">"_doc"</span><span class="token operator">:</span><span class="token punctuation">{</span>
            // 自动映射为 keyword 类型而不是默认的text类型
            <span class="token property">"dynamic_templates"</span><span class="token operator">:</span><span class="token punctuation">[</span>
                <span class="token punctuation">{</span>
                    <span class="token property">"string_fields"</span><span class="token operator">:</span><span class="token punctuation">{</span>
                        <span class="token property">"match"</span><span class="token operator">:</span><span class="token string">"*"</span><span class="token punctuation">,</span>
                        <span class="token property">"match_mapping_type"</span><span class="token operator">:</span><span class="token string">"string"</span><span class="token punctuation">,</span>
                        <span class="token property">"mapping"</span><span class="token operator">:</span><span class="token punctuation">{</span>
                            <span class="token property">"type"</span><span class="token operator">:</span><span class="token string">"keyword"</span><span class="token punctuation">,</span>
                            <span class="token property">"norms"</span><span class="token operator">:</span><span class="token boolean">false</span>
                        <span class="token punctuation">}</span>
                    <span class="token punctuation">}</span>
                <span class="token punctuation">}</span>
            <span class="token punctuation">]</span><span class="token punctuation">,</span>
            // 建立mapping
            <span class="token property">"properties"</span><span class="token operator">:</span><span class="token punctuation">{</span>
                <span class="token property">"mydate"</span><span class="token operator">:</span><span class="token punctuation">{</span>
                    <span class="token property">"type"</span><span class="token operator">:</span><span class="token string">"date"</span><span class="token punctuation">,</span>
                    <span class="token property">"format"</span><span class="token operator">:</span>"yyyy/MM/dd HH<span class="token operator">:</span>mm<span class="token operator">:</span>ss||date_time||strict_date_time"
                <span class="token punctuation">}</span><span class="token punctuation">,</span>
                <span class="token property">"字段名"</span><span class="token operator">:</span><span class="token punctuation">{</span>
                    <span class="token property">"type"</span><span class="token operator">:</span><span class="token string">"字段类型"</span>
                <span class="token punctuation">}</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
  </entry>
  <entry>
    <title>Git 上传大文件</title>
    <url>/2019/10/25/20.Git%20%E4%B8%8A%E4%BC%A0%E5%A4%A7%E6%96%87%E4%BB%B6/</url>
    <content><![CDATA[<p>我们知道 github 上面限制每次推送的文件不能超过 100M，否则报错失败，那么非要推送大文件呢？有没有什么解决办法呢？答案当然是肯定的。这就用到了 <code>Git LFS</code> 。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<p>因为只试验了 windows 平台，本文以此为例。其他系统可上网搜如何下载安装对应版本的 <code>git-lfs</code>。</p>
<h2 id="1-windows-平台安装-git-lfs"><a href="#1-windows-平台安装-git-lfs" class="headerlink" title="1.windows 平台安装 git-lfs"></a>1.windows 平台安装 git-lfs</h2><p>1.先打开网址：</p>
<pre class=" language-http"><code class="language-http"><span class="token header-name keyword">https:</span>//github.com/git-lfs/git-lfs/releases</code></pre>
<p>2.然后点击最新版本的版本号，将页面拉取到最底部，下载安装：</p>
<pre class=" language-shell"><code class="language-shell">Windows Installer</code></pre>
<p>3.运行下载的 exe 文件：</p>
<pre class=" language-shell"><code class="language-shell">windows installer</code></pre>
<h2 id="2-使用"><a href="#2-使用" class="headerlink" title="2.使用"></a>2.使用</h2><p>1.打开 <code>git bash</code>，首先输入下列命令开启 lfs 功能：</p>
<pre class=" language-shell"><code class="language-shell">git lfs install</code></pre>
<p>2.然后使用如下命令进行大文件追踪，然后会生成文件 <code>.gitattributes</code>：</p>
<pre class=" language-shell"><code class="language-shell">git lfs track '大文件名'
# 追踪大文件test.tar.gz
git lfs track 'test.tar.gz'</code></pre>
<p>3.添加文件 <code>.gittributes</code>：</p>
<pre class=" language-shell"><code class="language-shell">git add .gitattributes</code></pre>
<p>4.然后提交文件 <code>.gitattributes</code>：</p>
<pre class=" language-shell"><code class="language-shell">git commit -m 'submit .gitattributes file'</code></pre>
<p>5.将文件 <code>.gitattributes</code> 推送到远程仓库：</p>
<pre class=" language-shell"><code class="language-shell">git push -u origin master</code></pre>
<p>6.添加大文件：</p>
<pre class=" language-shell"><code class="language-shell">git add test.tar.gz</code></pre>
<p>7.提交大文件：</p>
<pre class=" language-shell"><code class="language-shell">git commit -m 'submit big file.'</code></pre>
<p>8.直接推送大文件到远程：</p>
<pre class=" language-shell"><code class="language-shell">git push</code></pre>
<p>然后你就会发现大文件推送到远程的 github 仓库了。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>网络类</tag>
      </tags>
  </entry>
  <entry>
    <title>常用 es 查询盘点</title>
    <url>/2019/10/25/28.%E5%B8%B8%E7%94%A8-es-%E6%9F%A5%E8%AF%A2%E7%9B%98%E7%82%B9/</url>
    <content><![CDATA[<p>熟悉了关系型数据库的结构概念以及查询，再去使用属于非关系型数据库的 Elasticsearch 时，简直是噩梦。第一道难关便是概念上的转换。索引？类型？文档？what？</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<blockquote>
<p>下面是概念上的对应，大家可以类比了解</p>
</blockquote>
<pre class=" language-shell"><code class="language-shell">Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields</code></pre>
<p>熟悉了各种概念后，下一道难关便是增删改查，而最最常用的是<strong>查询</strong>！如同 SQL 一样，它有一套自己的查询语句，称为 DSL。所以，下面为大家总结一下常用的查询，然后你就可以像翻字典一样，用时瞄两眼了 ~ 嘿嘿，真他娘的是个天才 … </p>
<h3 id="1-基础的不能再基础查询"><a href="#1-基础的不能再基础查询" class="headerlink" title="1.基础的不能再基础查询"></a>1.基础的不能再基础查询</h3><p><strong>查询所有的索引及容量：</strong></p>
<pre class=" language-http"><code class="language-http">GET _cat/indices</code></pre>
<blockquote>
<p><code>GET</code> 代表请求方式；<code>_cat/indices</code> 代表查询部分。访问的 <code>url</code> 写全为：</p>
<pre class=" language-http"><code class="language-http"><span class="token header-name keyword">localhost:</span>9200/_cat/indices</code></pre>
</blockquote>
<p><strong>查询某一索引的映射结构：</strong></p>
<pre class=" language-http"><code class="language-http">GET 索引名/_mapping</code></pre>
<p><strong>查询所有的相同前缀索引：（如以 yan 开头）</strong></p>
<pre class=" language-http"><code class="language-http">GET yan*/_search</code></pre>
<p><strong>查询所有索引模板：</strong></p>
<pre class=" language-http"><code class="language-http">GET _template</code></pre>
<p><strong>查询具体索引模板：</strong></p>
<pre class=" language-http"><code class="language-http">GET _template/模板名</code></pre>
<p><strong>查询集群健康状态：</strong></p>
<pre class=" language-http"><code class="language-http">GET _cluster/health</code></pre>
<p><strong>查询所有节点：</strong></p>
<pre class=" language-http"><code class="language-http">GET _cat/nodes</code></pre>
<p><strong>查询索引及分片的分布：</strong></p>
<pre class=" language-http"><code class="language-http">GET _cat/shards</code></pre>
<p><strong>查询所有插件:</strong></p>
<pre class=" language-http"><code class="language-http">GET _cat/plugins</code></pre>
<h3 id="2-有点难度的查询"><a href="#2-有点难度的查询" class="headerlink" title="2.有点难度的查询"></a>2.有点难度的查询</h3><p><strong>查询某个索引的全部数据：</strong></p>
<pre class=" language-http"><code class="language-http">GET /index/type/_search
{
  "query": {
    "match_all": {}
  }
}</code></pre>
<blockquote>
<p>当然你也可以直接写 URL 查询（默认返回 10 条文档）：</p>
<pre class=" language-http"><code class="language-http"><span class="token header-name keyword">localhost:</span>9200/索引名/_search?pretty</code></pre>
<p>pretty参数是为了浏览器显示的美观一些。</p>
</blockquote>
<p><strong>根据某一字段精确查询：</strong></p>
<pre class=" language-http"><code class="language-http">GET /index/type/_search
{
  "query": {
    "term": { "字段名" : "值" }
  }
}</code></pre>
<p><strong>根据某一字段模糊匹配：</strong></p>
<pre class=" language-http"><code class="language-http">GET /index/type/_search
{
  "query": {
    "match": { "字段名" : "值" }
  }
}</code></pre>
<p><strong>根据某一字段值进行范围查找：</strong></p>
<pre class=" language-http"><code class="language-http">GET /index/type/_search
{
  "query": {
    "range": {
        # 字段名: 条件
        "age":{ "gte" : 15 , "lte" : 25 }
    }
  }
}</code></pre>
<blockquote>
<p>gte 是大于等于；lte 是小于等于</p>
</blockquote>
<p><strong>根据条件进行过滤查询：</strong></p>
<pre class=" language-http"><code class="language-http">GET /index/type/_search
{
  "query": {
    "bool": {
      "filter": {
        "term":{"字段":"值"}
      }
    }
  }
}</code></pre>
<p><strong>多条件”或”关系：</strong></p>
<pre class=" language-http"><code class="language-http">GET /index/type/_search
{
    "query": {
        "bool": {
            "should": [{
                "term": {
                    "字段": "值"
                }
            }, {
                "match": {
                    "字段": "值"
                }
            }]
        }
    }
}</code></pre>
<p><strong>多条件”与”关系：</strong></p>
<pre class=" language-http"><code class="language-http">GET /index/type/_search
{
  "query": {
    "bool": {
      "must" : [{
        "match" : {
          "name" : "Ethanyan"
        }
      },{
        "range":{
        "age":{
          "from" : 18 , "to" : 26
        } 
        }
      }]
    }
  }
}</code></pre>
<p><strong>严格匹配：</strong></p>
<pre class=" language-http"><code class="language-http">GET /index/type/_search
{
  "query": {
    "bool": {
      "must" : {
        "range" : {
          "age" : { "from" : 18, "to" : 26 }
        }
      }
    }
  }
}</code></pre>
<p><strong>严格不匹配：</strong></p>
<pre class=" language-http"><code class="language-http">GET /index/type/_search
{
  "query": {
    "bool": {
      "must_not" : {
        "term" : {
          "name" : "Ethanyan"
        }
      }
    }
  }
}</code></pre>
<p><strong>复合查询：</strong></p>
<pre class=" language-http"><code class="language-http">GET /index/type/_search
{
    "query": {
        "bool": {
            "should": [{
                    "match": {
                        "age": 18
                    }
                },  
                {
                    "match": {
                        "age": 26
                    }
                }
            ],
            "filter": { 
                "match": {  
                    "name": "Ethanyan" 
                }
            }
        }
    }
}</code></pre>
<h3 id="3-注意事项"><a href="#3-注意事项" class="headerlink" title="3.注意事项"></a>3.注意事项</h3><p>1.索引名、模板名之类的名称不能出现字母大写</p>
<p>2.在查询时，需要写 DSL 语句，所以需要携带请求体，那么为什么还是 get 请求？</p>
<p>答：原则上 get 请求不能携带请求体，但凡事有例外，试验后确实可以，我也不晓得为什么。</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
  </entry>
  <entry>
    <title>Git 彻底删除某个commit的方法</title>
    <url>/2019/10/25/22.Git-%E5%BD%BB%E5%BA%95%E5%88%A0%E9%99%A4%E6%9F%90%E4%B8%AAcommit%E7%9A%84%E6%96%B9%E6%B3%95/</url>
    <content><![CDATA[<p>如果因为一些原因，需要删除某个错误的  commit ，而且需要干净的操作，彻底让其消失，不留痕迹，该如何操作？</p>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
<blockquote>
<p>我向仓库提交了一个大文件，大约 300M，push 失败（因为 git 最大能提交 100M 文件），删除本地文件不行，尝试过修改配置文件，解除 git 只能提交小于 100M 文件的限制，但是未起作用。只能通过删除包含提交此文件的 commit 解决。</p>
</blockquote>
<p>废话少说，直奔主题。</p>
<p>1.首先输入如下命令查看历史提交的 commit：</p>
<pre class=" language-shell"><code class="language-shell">git log</code></pre>
<blockquote>
<p>重要的是<strong>记下</strong>要删除的 commit 的<strong>上一条</strong> commit 的 <strong>commit号</strong>。如下图，如果要删除箭头所指的 commit，需要记录红框中的 commit号：</p>
</blockquote>
<p><img src="https://github.com/EthanYan6/pic/raw/master/Git-%E5%BD%BB%E5%BA%95%E5%88%A0%E9%99%A4%E6%9F%90%E4%B8%AAcommit%E7%9A%84%E6%96%B9%E6%B3%95/gitlog.png" alt="gitlog"></p>
<p>2.然后执行如下的命令：</p>
<pre class=" language-shell"><code class="language-shell">git rebase -i commit号</code></pre>
<p>会出现如下界面：</p>
<p><img src="https://github.com/EthanYan6/pic/raw/master/Git-%E5%BD%BB%E5%BA%95%E5%88%A0%E9%99%A4%E6%9F%90%E4%B8%AAcommit%E7%9A%84%E6%96%B9%E6%B3%95/gitrebase.png" alt="gitrebase"></p>
<p>3.然后将要删除的 commit号 的前缀 <code>pick</code> 改为 <code>drop</code>。</p>
<p>4.然后可以通过如下命令再次查看是否已经删除：</p>
<pre class=" language-shell"><code class="language-shell">git log</code></pre>
<p>5.最后通过如下命令将现在的状态推送到远程仓库即可：</p>
<pre class=" language-shell"><code class="language-shell">git push origin HEAD -force</code></pre>
<p><strong><em>更多精彩文章请关注公众号『大海的BLOG』</em></strong></p>
]]></content>
      <categories>
        <category>技术</category>
      </categories>
      <tags>
        <tag>网络类</tag>
      </tags>
  </entry>
  <entry>
    <title>about</title>
    <url>/about/index.html</url>
    <content><![CDATA[
<!-- 因为vue和botui更新导至bug,现将对话移至js下的botui中配置 -->
<div class="entry-content">
  <div class="moe-mashiro" style="text-align:center; font-size: 50px; margin-bottom: 20px;">[关于大海]</div>
  <div id="hello-mashiro" class="popcontainer" style="min-height: 300px; padding: 2px 6px 4px; background-color: rgba(242, 242, 242, 0.5); border-radius: 10px;">
    <center>
    <p>
    </p>
    <h4>
    与&nbsp;<ruby>
    大海&nbsp;<rp>
    （</rp>
    <rt>
    陌生人，你</rt>
    <rp>
    ）</rp>
    </ruby>
    对话中...</h4>
    <p>
    </p>
    </center>
    <bot-ui></botui>
  </div>
</div>
<script src="/js/botui.js"></script>
<script>
bot_ui_ini()
</script>
]]></content>
  </entry>
  <entry>
    <title>donate</title>
    <url>/donate/index.html</url>
    <content><![CDATA[]]></content>
  </entry>
  <entry>
    <title>bangumi</title>
    <url>/bangumi/index.html</url>
    <content><![CDATA[]]></content>
  </entry>
  <entry>
    <title>comment</title>
    <url>/comment/index.html</url>
    <content><![CDATA[
<div class="entry-content">
  <div class="poem-wrap">
    <div class="poem-border poem-left">
    </div>
    <div class="poem-border poem-right">
    </div>
    <h1>
    念两句诗</h1>
    <p id="poem">
    故人何不返，春华复应晚。</p>
    <p id="info">
    【南北朝】柳恽《江南曲》</p>
  </div>
</div>



]]></content>
  </entry>
  <entry>
    <title>links</title>
    <url>/links/index.html</url>
    <content><![CDATA[]]></content>
  </entry>
  <entry>
    <title>music</title>
    <url>/music/index.html</url>
    <content><![CDATA[<form action="https://www.baidu.com/baidu" method="get" target="_blank"> 
<input type="text" name="word" placeholder="有什么问题吗？"> 
<button>回答我</button> 
</form> 


<p><meting-js
  server="tencent"
  type="playlist"
  id="6970849799"
  mutex="true"
  theme="#f7acbc"
  fixed="false" 
  mini="false"
  autoplay="false"
  loop="all"
  order="list"
  preload="none"
  volume="0.7"><br></meting-js></p>
<h1 id="ㄟ-▔-▔-ㄏ"><a href="#ㄟ-▔-▔-ㄏ" class="headerlink" title="ㄟ( ▔, ▔ )ㄏ"></a><center>ㄟ( ▔, ▔ )ㄏ</center></h1><h1 id="部分歌曲由于版权原因无法在线播放还请见谅"><a href="#部分歌曲由于版权原因无法在线播放还请见谅" class="headerlink" title="部分歌曲由于版权原因无法在线播放还请见谅"></a><center>部分歌曲由于版权原因无法在线播放还请见谅</center></h1>]]></content>
  </entry>
  <entry>
    <title>tags</title>
    <url>/tags/index.html</url>
    <content><![CDATA[]]></content>
  </entry>
  <entry>
    <title>rss</title>
    <url>/rss/index.html</url>
    <content><![CDATA[]]></content>
  </entry>
</search>
