Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
1238 lines (1033 sloc) 284 KB
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>务虚笔记</title>
<subtitle>Li Xiaowei&#39;s blog</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://www.wuxubj.cn/"/>
<updated>2017-05-03T02:55:37.171Z</updated>
<id>http://www.wuxubj.cn/</id>
<author>
<name>wuxubj</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>C++中的const</title>
<link href="http://www.wuxubj.cn/2016/12/const-in-cpp/"/>
<id>http://www.wuxubj.cn/2016/12/const-in-cpp/</id>
<published>2016-12-20T11:37:26.000Z</published>
<updated>2017-05-03T02:55:37.171Z</updated>
<content type="html"><![CDATA[<h2 id="1-基本概念"><a href="#1-基本概念" class="headerlink" title="1.基本概念"></a>1.基本概念</h2><p><code>const</code>限定符用于定义值不能被改变的变量。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">const int bufSize = 512;</div></pre></td></tr></table></figure></p>
<p>把<code>bufSize</code>定义成为一个常量,定义之后不允许重新对<code>bufSize</code>赋值。<br>const 对象一旦创建之后其值就不能再改变,所以 const 对象必须初始化。初始值可以是任意复杂的表达式:</p>
<a id="more"></a>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">const int i = get_size();//正确:运行时初始化</div><div class="line">const int j = 42; //正确:编译时初始化</div><div class="line">const int k; //错误:未初始化</div></pre></td></tr></table></figure>
<p>在 const 类型的对象上,只能执行不改变其内容的操作,可以用一个非 const 对象去初始化一个 const 对象:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">int i = 42;</div><div class="line">const int ci = i; //正确:i的值拷贝给了ci</div><div class="line">int j = ci; //正确:ci的值拷贝给了j</div></pre></td></tr></table></figure></p>
<p>拷贝一个对象的值并不会改变它,一旦拷贝完成,新的对象和原来的对象就没什么关系了。</p>
<h2 id="2-const-的引用(常量引用)"><a href="#2-const-的引用(常量引用)" class="headerlink" title="2 const 的引用(常量引用)"></a>2 const 的引用(常量引用)</h2><p>把引用绑定到 const 对象上,称之为对常量的引用。常量只能绑定到 const 引用,而不能绑定到非 const 引用。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">const int ci = 42;</div><div class="line">const int &amp;r1 = ci;</div></pre></td></tr></table></figure></p>
<p>允许为一个常量引用绑定到非常量的对象:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">int i = 42;</div><div class="line">const int &amp;r1 = i*2;</div><div class="line">const int &amp;r2 = 42;</div></pre></td></tr></table></figure></p>
<p>常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未做限定。<br>以上声明中<code>i</code>的值可变,只是不允许通过<code>r1</code>修改<code>i</code>的值。</p>
<h2 id="3-指针和-const"><a href="#3-指针和-const" class="headerlink" title="3 指针和 const"></a>3 指针和 const</h2><p>与引用一样,可以令指针指向常量或非常量。</p>
<h3 id="3-1-指向常量的指针"><a href="#3-1-指向常量的指针" class="headerlink" title="3.1 指向常量的指针"></a>3.1 指向常量的指针</h3><p>指向常量的指针,不能用于改变其所指对象的值,要想存放常量对象的地址,只能使用指向常量的指针。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">const double pi = 3.14;</div><div class="line">double *ptr = &amp;pi; //错误:ptr是一个普通指针</div><div class="line">const double *cptr = &amp;pi; //正确:cptr是一个指向常量的指针</div><div class="line">*cptr = 42; //错误:不能用指向常量的指针改变其所指对象的值</div></pre></td></tr></table></figure></p>
<p>允许一个指向常量的指针指向一个非常量对象:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">double dval = 3.14;</div><div class="line">cptr = &amp;dval;//正确</div></pre></td></tr></table></figure></p>
<p><code>dval</code>的值可以改变,只是不能通过<code>cptr</code>改变<code>dval</code>的值。<br>另外,指向常量的指针中,指针的值可以改变,即可以令指向常量的指针指向另外一个对象,如上例中<code>cptr</code>。</p>
<h3 id="3-2-const-指针"><a href="#3-2-const-指针" class="headerlink" title="3.2 const 指针"></a>3.2 const 指针</h3><p>指针是对象,而引用不是,因此允许把指针定为常量,即常量指针(const指针)。<br>常量指针必须初始化,而且一旦初始化完成,其值(存放在指针中的那个地址)就不能改变。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">int errNumb = 0;</div><div class="line">int *const curErr = &amp;errNumb; //正确:curErr将一直指向errNumb</div><div class="line">*curErr = 3; //正确:可以通过常量指针修改其所指对象的值</div></pre></td></tr></table></figure></p>
<p>可以通过常量指针修改其所指(非常量)对象的值。</p>
<h3 id="3-3-顶层-const和底层const"><a href="#3-3-顶层-const和底层const" class="headerlink" title="3.3 顶层 const和底层const"></a>3.3 顶层 const和底层const</h3><p>顶层 const 表示指针本身是一个常量,底层 const 表示指针所指对象是一个常量。<br>更一般的,顶层 const 可以表示任意的对象是常量,底层 const 则与指针和引用等复合类型的基本类型部分有关。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">int i = 0;</div><div class="line">int *const p1 = &amp;i; //顶层const,不能改变p1的值</div><div class="line">const int ci = 42; //顶层const,不能改变ci的值</div><div class="line">const int *p2 = &amp;ci; //底层const,允许改变p2的值</div><div class="line">const int &amp;r = ci; //用于声明引用的const都是底层const</div></pre></td></tr></table></figure></p>
<h2 id="4-const在函数中的应用"><a href="#4-const在函数中的应用" class="headerlink" title="4 const在函数中的应用"></a>4 const在函数中的应用</h2><h3 id="4-1-顶层const与拷贝形参"><a href="#4-1-顶层const与拷贝形参" class="headerlink" title="4.1 顶层const与拷贝形参"></a>4.1 顶层const与拷贝形参</h3><p>当用实参初始化形参时会忽略形参的顶层 const,当形参有顶层 const 时,传给它常量对象或非常量对象都是可以的。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">void fcn(const int i)&#123;/* fcn能够读取i,但不能改变i的值 */&#125;</div></pre></td></tr></table></figure></p>
<p>调用<code>fcn</code>时,既可以传入<code>const int</code>也可以传入<code>int</code>。忽略形参顶层 const 可能带来意想不到的错误:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">void fcn(const int i)&#123;/* fcn能够读取i,但不能改变i的值 */&#125;</div><div class="line">void fcn(int i) &#123;/**/&#125; //错误:重复定义了fcn(int)</div></pre></td></tr></table></figure></p>
<p>同时定义2个函数时,会出现函数重复定义。<br>同理,同时定义以下2个函数也会产生重复定义:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">void fcn(int *i)&#123;&#125;;</div><div class="line">void fcn(int *const ci)&#123;&#125;; //重复定义了fcn(int *)</div></pre></td></tr></table></figure></p>
<p>示例:以下函数嵌套调用并不会出错,因为顶层 const 形参被忽略:</p>
<p><div class="codecopy codecopy1"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">double</span> <span class="title">multi</span><span class="params">(<span class="keyword">double</span> a,<span class="keyword">double</span> b)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">return</span> a*b;</div><div class="line">&#125;</div><div class="line"><span class="function"><span class="keyword">double</span> <span class="title">getValue</span><span class="params">(<span class="keyword">const</span> <span class="keyword">double</span> a,<span class="keyword">const</span> <span class="keyword">double</span> b)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">return</span> multi(a,b);</div><div class="line">&#125;</div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">double</span> x = <span class="number">1.2</span>, y = <span class="number">2.3</span>;</div><div class="line"> <span class="built_in">cout</span>&lt;&lt;getValue(x,y)&lt;&lt;<span class="built_in">endl</span>;</div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p></p>
<h3 id="4-2-底层const与指针和引用形参"><a href="#4-2-底层const与指针和引用形参" class="headerlink" title="4.2 底层const与指针和引用形参"></a>4.2 底层const与指针和引用形参</h3><p>如果形参是某种类型的指针或引用,则通过区分其指向的是常量对象还是非常量对象,可以实现函数重载。<br>此时的 const 是底层的:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">void fcn(int &amp;i);</div><div class="line">void fcn(const int &amp;i);</div><div class="line">void fcn(int *ptr);</div><div class="line">void fnc(const int *ptr);</div></pre></td></tr></table></figure></p>
<p>以上为4个独立的重载函数。</p>
<p>const 对象只能传递给 const 形参,非 const 对象虽然能够转换成 const,但是编译器会优先选择非常量版本的函数。</p>
<h3 id="4-3-返回const"><a href="#4-3-返回const" class="headerlink" title="4.3 返回const"></a>4.3 返回const</h3><p>函数可以返回 const 对象:</p>
<p><div class="codecopy codecopy2"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy2 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">const</span> <span class="built_in">string</span> &amp;<span class="title">shorterString</span><span class="params">(<span class="keyword">const</span> <span class="built_in">string</span> &amp;s1,<span class="keyword">const</span> <span class="built_in">string</span> &amp;s2)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">return</span> s1.size() &lt;= s2.size() ? s1 : s2;</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p>主要用于形参是 const,同时又要返回形参的情况。</p>
<h2 id="5-const在类中的应用"><a href="#5-const在类中的应用" class="headerlink" title="5 const在类中的应用"></a>5 const在类中的应用</h2><h3 id="5-1-const成员函数"><a href="#5-1-const成员函数" class="headerlink" title="5.1 const成员函数"></a>5.1 const成员函数</h3><p>在对象中,因为<code>this</code>总是指向这个对象,所以<code>this</code>是一个常量指针,我们不允许改变<code>this</code>中保存的地址。</p>
<p>默认情况下,<code>this</code>的类型是指向类类型非常量版本的常量指针,例如<code>Sales_data</code>成员函数中,<code>this</code>的类型是<code>Sales_data *const</code>,<code>this</code>中保存的地址不能变,但是可以通过<code>this</code>改变对象的值。因此默认情况下,我们不能把<code>this</code>绑定到一个常量对象上,这就使得我们不能在一个常量对象上调用普通的成员函数。</p>
<p>为了把<code>this</code>声明为指向常量的指针,需要把 const 关键字放在成员函数参数列表之后,像这样使用 const 的成员函数称为<strong>常量成员函数</strong>。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">string Sales_data::isbn() const &#123;return bookNo;&#125;</div></pre></td></tr></table></figure></p>
<p>等价于:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">string Sales_data::isbn(const Sales_data *const this) &#123;return bookNo;&#125;</div></pre></td></tr></table></figure></p>
<p><code>isbn()</code>可以读取调用它的对象的数据成员,但是不能改变其数据成员的值。<br>常量对象以及常量对象的引用或指针只能调用常量成员函数。</p>
<blockquote>
<p>const 成员函数主要应用于: </p>
<ul>
<li>调用该成员函数的对象是常量对象,则其只能调用常量成员函数;</li>
<li>不希望改变调用该成员函数的对象的值,也需要将其设为常量成员函数。</li>
</ul>
</blockquote>
<p>可以根据是否是 const 成员函数,对成员函数进行重载:</p>
<p><div class="codecopy codecopy3"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy3 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="class"><span class="keyword">class</span> <span class="title">Screen</span>&#123;</span></div><div class="line"><span class="keyword">public</span>:</div><div class="line"> <span class="function">Screen &amp;<span class="title">display</span><span class="params">(ostream &amp;os)</span></span></div><div class="line"> &#123;do_display(os);<span class="keyword">return</span> *<span class="keyword">this</span>;&#125;</div><div class="line"> <span class="function"><span class="keyword">const</span> Screen &amp;<span class="title">display</span><span class="params">(ostream &amp;os)</span> <span class="keyword">const</span></span></div><div class="line"> &#123;do_display(os);<span class="keyword">return</span> *<span class="keyword">this</span>;&#125;</div><div class="line"></div><div class="line"><span class="keyword">private</span>:</div><div class="line"> <span class="function"><span class="keyword">void</span> <span class="title">do_display</span><span class="params">(ostream &amp;os)</span> <span class="keyword">const</span> </span>&#123;os&lt;&lt;contents;&#125;</div><div class="line"> <span class="built_in">string</span> contents;</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p>在非常量版本的 display 成员函数中,<code>this</code>指向一个非常量对象,返回一个非常量的引用,而在常量版本的 display 成员函数中,<code>this</code>指向一个常量对象,返回一个常量引用。</p>
<p>虽然非常量对象也可以调用常量成员函数,但在存在非常量成员函数的情况下,编译器还是会优先选择非常量版本的成员函数。</p>
<h3 id="5-2-const成员函数嵌套调用"><a href="#5-2-const成员函数嵌套调用" class="headerlink" title="5.2 const成员函数嵌套调用"></a>5.2 const成员函数嵌套调用</h3><p>const 成员函数若要调用类内其他成员函数,则被调用的其他成员函数也必须为常量成员函数。例如,以下代码编译时会报错:</p>
<p><div class="codecopy codecopy4"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy4 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="class"><span class="keyword">class</span> <span class="title">Screen</span>&#123;</span></div><div class="line"><span class="keyword">public</span>:</div><div class="line"> <span class="function"><span class="keyword">void</span> <span class="title">display</span><span class="params">(ostream &amp;os)</span> <span class="keyword">const</span></span></div><div class="line"> &#123;do_display(os);&#125;</div><div class="line"></div><div class="line"><span class="keyword">private</span>:</div><div class="line"> <span class="function"><span class="keyword">void</span> <span class="title">do_display</span><span class="params">(ostream &amp;os)</span> </span>&#123;os&lt;&lt;contents;&#125;</div><div class="line"> <span class="built_in">string</span> contents;</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p>编译时报错:<code>cannot convert &#39;this&#39; pointer from &#39;const Screen&#39; to &#39;Screen &amp;&#39;.</code> 因为 const 成员函数的 const 为底层 const ,其 const 对象无法转换为非 const 对象。</p>
<hr>
]]></content>
<summary type="html">
&lt;h2 id=&quot;1-基本概念&quot;&gt;&lt;a href=&quot;#1-基本概念&quot; class=&quot;headerlink&quot; title=&quot;1.基本概念&quot;&gt;&lt;/a&gt;1.基本概念&lt;/h2&gt;&lt;p&gt;&lt;code&gt;const&lt;/code&gt;限定符用于定义值不能被改变的变量。&lt;br&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;div class=&quot;line&quot;&gt;1&lt;/div&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;div class=&quot;line&quot;&gt;const int bufSize = 512;&lt;/div&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bufSize&lt;/code&gt;定义成为一个常量,定义之后不允许重新对&lt;code&gt;bufSize&lt;/code&gt;赋值。&lt;br&gt;const 对象一旦创建之后其值就不能再改变,所以 const 对象必须初始化。初始值可以是任意复杂的表达式:&lt;/p&gt;
</summary>
<category term="编程语言语法" scheme="http://www.wuxubj.cn/categories/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E8%AF%AD%E6%B3%95/"/>
<category term="C++" scheme="http://www.wuxubj.cn/tags/C/"/>
<category term="const" scheme="http://www.wuxubj.cn/tags/const/"/>
</entry>
<entry>
<title>[转]http协议详解</title>
<link href="http://www.wuxubj.cn/2016/09/http-protocol-details/"/>
<id>http://www.wuxubj.cn/2016/09/http-protocol-details/</id>
<published>2016-09-25T11:35:49.000Z</published>
<updated>2017-05-03T02:55:37.176Z</updated>
<content type="html"><![CDATA[<p>比较全面的HTTP协议及其相关内容介绍。<br>转载自:<a href="http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html" target="_blank" rel="external">http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html</a><br><a id="more"></a></p>
<h2 id="一、概念"><a href="#一、概念" class="headerlink" title="一、概念"></a>一、概念</h2><p>协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。</p>
<p>HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。</p>
<p>HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。</p>
<p>HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。<font color="#f00">HTTP是一个无状态的协议</font>。</p>
<p>在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:</p>
<p><img src="http://images.wuxubj.cn/201609/2501.png" alt="http协议"><br>HTTP默认的端口号为80,HTTPS的端口号为443。</p>
<p>浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。</p>
<h2 id="二、简史"><a href="#二、简史" class="headerlink" title="二、简史"></a>二、简史</h2><p>它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。</p>
<h2 id="三、特点"><a href="#三、特点" class="headerlink" title="三、特点"></a>三、特点</h2><p>HTTP协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。</p>
<blockquote>
<p><strong>HTTP协议的主要特点可概括如下:</strong></p>
</blockquote>
<ol>
<li>支持客户/服务器模式。支持基本认证和安全认证。</li>
<li>简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。</li>
<li>灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。</li>
<li>HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。</li>
<li>无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。</li>
</ol>
<blockquote>
<p><strong>无状态协议:</strong></p>
</blockquote>
<p>协议的状态是指下一次传输可以“记住”这次传输信息的能力。http是不会为了下一次连接而维护这次连接所传输的信息,为了保证服务器内存。比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。</p>
<p>由于Web服务器要面对很多浏览器的并发访问,为了提高Web服务器对并发访问的处理能力,在设计HTTP协议时规定Web服务器发送HTTP应答报文和文档时,不保存发出请求的Web浏览器进程的任何状态信息。这有可能出现一个浏览器在短短几秒之内两次访问同一对象时,服务器进程不会因为已经给它发过应答报文而不接受第二期服务请求。由于Web服务器不保存发送请求的Web浏览器进程的任何信息,因此HTTP协议属于无状态协议(Stateless Protocol)。</p>
<blockquote>
<p><strong>HTTP协议是无状态的和Connection: keep-alive的区别:</strong></p>
</blockquote>
<ul>
<li>无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。</li>
<li>HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。</li>
<li>从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。</li>
<li>Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。</li>
</ul>
<h2 id="四、工作流程"><a href="#四、工作流程" class="headerlink" title="四、工作流程"></a>四、工作流程</h2><p>一次HTTP操作称为一个事务,其工作过程可分为四步:</p>
<ol>
<li>首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。</li>
<li>建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。</li>
<li>服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。</li>
<li>客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。</li>
</ol>
<p>如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。</p>
<p><img src="http://images.wuxubj.cn/201609/2502.png" alt="c/s"><br>HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接,而TCP连接的过程需要所谓的“三次握手”。下图所示TCP连接的三次握手。</p>
<p>在TCP三次握手之后,建立了TCP连接,此时HTTP就可以进行传输了。一个重要的概念是面向连接,既HTTP在传输完成之间并不断开TCP连接。在HTTP1.1中(通过Connection头设置)这是默认行为。</p>
<p><img src="http://images.wuxubj.cn/201609/2503.png" alt="tcp"></p>
<h2 id="五、使用Wireshark抓TCP、http包"><a href="#五、使用Wireshark抓TCP、http包" class="headerlink" title="五、使用Wireshark抓TCP、http包"></a>五、使用Wireshark抓TCP、http包</h2><p>打开Wireshark,选择工具栏上的”Capture”-&gt;”Options”</p>
<p><img src="http://images.wuxubj.cn/201609/2504.png" alt="Wireshark"><br><img src="http://images.wuxubj.cn/201609/2505.png" alt="Wireshark"><br>点击”Capture Filter”,此处选择的是”HTTP TCP port(80)”,选择后点击上图的”Start”开始抓包。<br>然后在浏览器中打开 <a href="http://image.baidu.com/" target="_blank" rel="external">http://image.baidu.com/</a> ,抓包结果如下图所示:</p>
<p><img src="http://images.wuxubj.cn/201609/2506.png" alt="Wireshark"><br>在上图中,可清晰的看到客户端浏览器(ip为192.168.1.6)与服务器(115.239.210.36)的交互过程:</p>
<ol>
<li>No1:浏览器(192.168.1.6)向服务器(115.239.210.36)发出连接请求。此为TCP三次握手第一步,此时从图中可以看出,为SYN,seq:X (x=0);</li>
<li>No2:服务器(115.239.210.36)回应了浏览器(192.168.1.6)的请求,并要求确认,此时为:SYN,ACK,此时seq:y(y为0),ACK:x+1(为1)。此为三次握手的第二步;</li>
<li>No3:浏览器(192.168.1.6)回应了服务器(115.239.210.36)的确认,连接成功。为:ACK,此时seq:x+1(为1),ACK:y+1(为1)。此为三次握手的第三步;</li>
<li>No4:浏览器(192.168.1.6)发出一个页面HTTP请求;</li>
<li>No5:服务器(115.239.210.36)确认;</li>
<li>No6:服务器(115.239.210.36)发送数据;</li>
<li>No8:客户端浏览器(192.168.1.6)确认;</li>
<li>No81:客户端(192.168.1.6)发出一个图片HTTP请求;</li>
<li>No202:服务器(115.239.210.36)发送状态响应码200 OK。</li>
</ol>
<p><img src="http://images.wuxubj.cn/201609/2507.png" alt="Wireshark"></p>
<h2 id="六、头域"><a href="#六、头域" class="headerlink" title="六、头域"></a>六、头域</h2><p>每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。</p>
<h3 id="6-1、请求信息:"><a href="#6-1、请求信息:" class="headerlink" title="6.1、请求信息:"></a>6.1、请求信息:</h3><p>发出的请求信息格式如下:</p>
<ul>
<li>请求行,例如GET /images/logo.gif HTTP/1.1,表示从/images目录下请求logo.gif这个文件。</li>
<li>(请求)头,例如Accept-Language: en</li>
<li>空行</li>
<li>可选的消息体 请求行和标题必须以<cr><lf>作为结尾(也就是,回车然后换行)。空行内必须只有<cr><lf>而无其他空格。在HTTP/1.1协议中,所有的请求头,除post外,都是可选的。</lf></cr></lf></cr></li>
</ul>
<p><img src="http://images.wuxubj.cn/201609/2508.png" alt="2508"><br>三个部分分别是:请求行、消息报头、请求正文。</p>
<h3 id="6-2、请求方法"><a href="#6-2、请求方法" class="headerlink" title="6.2、请求方法"></a>6.2、请求方法</h3><p>HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:<br><strong>OPTIONS</strong> - 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送<code>*</code>的请求来测试服务器的功能性。<br><strong>HEAD</strong> - 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。<br><strong>GET</strong> - 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在web app.中。其中一个原因是GET可能会被网络蜘蛛等随意访问。<br><strong>POST</strong> - 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。<br><strong>PUT</strong> - 向指定资源位置上传其最新内容。<br><strong>DELETE</strong> - 请求服务器删除Request-URI所标识的资源。<br><strong>TRACE</strong> - 回显服务器收到的请求,主要用于测试或诊断。<br><strong>CONNECT</strong> - HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。<br><strong>PATCH</strong> - 用来将局部修改应用于某一资源,添加于规范RFC5789。</p>
<p>方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。</p>
<p>HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。</p>
<blockquote>
<p><strong>GET和POST的区别:</strong></p>
</blockquote>
<ol>
<li>GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&amp;相连,如EditPosts.aspx?name=test1&amp;id=123456. POST方法是把提交的数据放在HTTP包的Body中。</li>
<li>GET提交的数据大小有限制,最多只能有1024字节(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。</li>
<li>GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。</li>
<li>GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。</li>
</ol>
<h3 id="6-3、响应消息"><a href="#6-3、响应消息" class="headerlink" title="6.3、响应消息"></a>6.3、响应消息</h3><p>客户端向服务器发送一个请求,服务器以一个状态行作为响应,响应的内容包括:消息协议的版本、成功或者错误编码、服务器信息、实体元信息以及必要的实体内容。根据响应类别的类别,服务器响应里可以含实体内容,但不是所有的响应都有实体内容。</p>
<p>响应头第一行也称为状态行,格式如下(下图中红线标出的那行):<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">HTTP-Version 空格 Status-Code 空格 Reason-Phrase CRLF</div></pre></td></tr></table></figure></p>
<p><strong>HTTP- Version</strong> 表示HTTP版本,例如为HTTP/1.1。<br><strong>Status- Code</strong> 是结果代码,用三个数字表示。<br><strong>Reason-Phrase</strong> 是个简单的文本描述,解释Status-Code的具体原因。</p>
<p>Status-Code用于机器自动识别,Reason-Phrase用于人工理解。Status-Code的第一个数字代表响应类别,可能取5个不同的值。后两个数字没有分类作用。Status-Code的第一个数字代表响应的类别,后续两位描述在该类响应下发生的具体状况,具体请参见:<a href="#十四、http的状态响应码">HTTP状态码</a> 。</p>
<p><img src="http://images.wuxubj.cn/201609/2509.png" alt="2509"><br>响应消息的结构:</p>
<p><img src="http://images.wuxubj.cn/201609/2510.png" alt="2510"><br><img src="http://images.wuxubj.cn/201609/2511.png" alt="2511"><br>三个部分分别是:状态行、消息报头、响应正文。</p>
<p>无论你何时浏览一个网页,你的电脑都会通过一个使用HTTP协议的服务器来获取所请求的数据。在你请求的网页显示在浏览器之前,支配网页的网站服务器会返回一个包含有状态码的HTTP头文件。这个状态码提供了有关所请求网页的相关条件信息。如果一切正常,一个标准网页会收到一条诸如200的状态码。当然我们的目的不是去研究200响应码,而是去探讨那些代表出现错误信息的服务器头文件响应码,例如表示“未找到指定网页”的404码。</p>
<h3 id="6-4、响应头域"><a href="#6-4、响应头域" class="headerlink" title="6.4、响应头域"></a>6.4、响应头域</h3><p>服务器需要传递许多附加信息,这些信息不能全放在状态行里。因此,需要另行定义响应头域,用来描述这些附加信息。响应头域主要描述服务器的信息和Request-URI的信息。</p>
<p><img src="http://images.wuxubj.cn/201609/2512.png" alt="2512"></p>
<h3 id="6-5、HTTP常见的请求头"><a href="#6-5、HTTP常见的请求头" class="headerlink" title="6.5、HTTP常见的请求头"></a>6.5、HTTP常见的请求头</h3><p>在HTTP/1.1 协议中,所有的请求头,除 Host 外,都是可选的。</p>
<p><strong>If-Modified-Since</strong>:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。<br>例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT</p>
<p><img src="http://images.wuxubj.cn/201609/2513.png" alt="2513"><br><strong>If-None-Match</strong>:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能。例如: If-None-Match: “03f2b33c0bfcc1:0”。</p>
<p><img src="http://images.wuxubj.cn/201609/2514.png" alt="2514"><br><strong>Pragma</strong>:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样。Pargma只有一个用法, 例如: Pragma: no-cache<br>注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control</p>
<p><strong>Cache-Control</strong>:指定请求和响应遵循的缓存机制。缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程)。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。</p>
<ul>
<li>Cache-Control:Public 可以被任何缓存所缓存</li>
<li>Cache-Control:Private 内容只缓存到私有缓存中</li>
<li>Cache-Control:no-cache 所有内容都不会被缓存</li>
<li>Cache-Control:no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。</li>
<li>Cache-Control:max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。</li>
<li>Cache-Control:min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。</li>
<li>Cache-Control:max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。</li>
</ul>
<p><strong>Accept</strong>:浏览器端可以接受的MIME类型。例如:Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。通配符 <em> 代表任意类型,例如 Accept: </em>/* 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。</p>
<p><strong>Accept-Encoding</strong>:浏览器申明自己可接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate);Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。例如: Accept-Encoding: gzip, deflate。如果请求消息中没有设置这个域,服务器假定客户端对各种内容编码都可以接受。</p>
<p><strong>Accept-Language</strong>:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;例如:Accept-Language: en-us。如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。</p>
<p><strong>Accept-Charset</strong>:浏览器可接受的字符集。如果在请求消息中没有设置这个域,缺省表示任何字符集都可以接受。</p>
<p><strong>User-Agent</strong>:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。<br>例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)。</p>
<p><strong>Content-Type</strong>:例如:Content-Type: application/x-www-form-urlencoded。</p>
<p><strong>Referer</strong>:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。<br>例如: Referer:<a href="http://translate.google.cn/?hl=zh-cn&amp;tab=wT" target="_blank" rel="external">http://translate.google.cn/?hl=zh-cn&amp;tab=wT</a></p>
<p><strong>Connection</strong>:连接方式,持续连接和非持续连接<br>例如:Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。HTTP 1.1默认进行持久连接。利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。</p>
<p><strong>Connection</strong>: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。</p>
<p><strong>Host</strong>:(发送请求时,该头域是必需的)主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。<br>例如: 我们在浏览器中输入:<a href="http://www.guet.edu.cn/index.html" target="_blank" rel="external">http://www.guet.edu.cn/index.html</a> ,浏览器发送的请求消息中,就会包含Host请求头域:Host:<a href="http://www.guet.edu.cn" target="_blank" rel="external">http://www.guet.edu.cn</a> ,此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号。</p>
<p><strong>Cookie</strong>:最重要的请求头之一, 将cookie的值发送给HTTP服务器。</p>
<p><strong>Content-Length</strong>:表示请求消息正文的长度。例如:Content-Length: 38。</p>
<p><strong>Authorization</strong>:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。</p>
<p><strong>UA-Pixels,UA-Color,UA-OS,UA-CPU</strong>:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。</p>
<p><strong>From</strong>:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。</p>
<p><strong>Range</strong>:可以请求实体的一个或者多个子范围。例如,</p>
<ul>
<li>表示头500个字节:bytes=0-499</li>
<li>表示第二个500字节:bytes=500-999</li>
<li>表示最后500个字节:bytes=-500</li>
<li>表示500字节以后的范围:bytes=500-</li>
<li>第一个和最后一个字节:bytes=0-0,-1</li>
<li>同时指定几个范围:bytes=500-600,601-999</li>
</ul>
<p>但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。</p>
<h3 id="6-6、HTTP常见的响应头"><a href="#6-6、HTTP常见的响应头" class="headerlink" title="6.6、HTTP常见的响应头"></a>6.6、HTTP常见的响应头</h3><p><strong>Allow</strong>:服务器支持哪些请求方法(如GET、POST等)。</p>
<p><strong>Date</strong>:表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦</p>
<p><strong>Expires</strong>:指明应该在什么时候认为文档已经过期,从而不再缓存它,重新从服务器获取,会更新缓存。过期之前使用本地缓存。HTTP1.1的客户端和缓存会将非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以将Expires实体报头域,设置为0。<br>例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT</p>
<p><strong>P3P</strong>:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题<br>例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR</p>
<p><strong>Set-Cookie</strong>:非常重要的header, 用于把cookie发送到客户端浏览器,每一个写入cookie都会生成一个Set-Cookie。<br>例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com</p>
<p><strong>ETag</strong>:和If-None-Match 配合使用。</p>
<p><strong>Last-Modified</strong>:用于指示资源的最后修改日期和时间。Last-Modified也可用setDateHeader方法来设置。</p>
<p><strong>Content-Type</strong>:WEB服务器告诉浏览器自己响应的对象的类型和字符集。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。可在web.xml文件中配置扩展名和MIME类型的对应关系。<br>例如:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">Content-Type: text/html;charset=utf-8</div><div class="line">Content-Type:text/html;charset=GB2312</div><div class="line">Content-Type: image/jpeg</div></pre></td></tr></table></figure></p>
<p>媒体类型的格式为:大类/小类,比如text/html。<br>IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)定义了8个大类的媒体类型,分别是:</p>
<ul>
<li>application (比如: application/vnd.ms-excel.)</li>
<li>audio (比如: audio/mpeg.)</li>
<li>image (比如: image/png.)</li>
<li>message (比如,:message/http.)</li>
<li>model(比如:model/vrml.)</li>
<li>multipart (比如:multipart/form-data.)</li>
<li>text(比如:text/html.)</li>
<li>video(比如:video/quicktime.)</li>
</ul>
<p><strong>Content-Range</strong>:用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-length。<br>例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234如果一个http消息包含此节(例如,对范围请求的响 应或对一系列范围的重叠请求),Content-Range表示传送的范围。</p>
<p><strong>Content-Length</strong>:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。<br>例如: Content-Length: 19847</p>
<p><strong>Content-Encoding</strong>:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader(“Accept-Encoding”))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。<br>例如:Content-Encoding:gzip</p>
<p><strong>Content-Language</strong>:WEB服务器告诉浏览器自己响应的对象所用的自然语言。例如: Content-Language:da。没有设置该域则认为实体内容将提供给所有的语言阅读。</p>
<p><strong>Server</strong>:指明HTTP服务器用来处理请求的软件信息。例如:Server: Microsoft-IIS/7.5、Server:Apache-Coyote/1.1。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。</p>
<p><strong>X-AspNet-Version</strong>:如果网站是用ASP.NET开发的,这个header用来表示ASP.NET的版本。<br>例如: X-AspNet-Version: 4.0.30319</p>
<p><strong>X-Powered-By</strong>:表示网站是用什么技术开发的。<br>例如: X-Powered-By: ASP.NET</p>
<p><strong>Connection</strong>:<br>例如:Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。<br>Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。</p>
<p><strong>Location</strong>:用于重定向一个新的位置,包含新的URL地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。Location响应报头域常用在更换域名的时候。</p>
<p><strong>Refresh</strong>:表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过<code>setHeader(&quot;Refresh&quot;, &quot;5; URL=http://host/path&quot;)</code>让浏览器读取指定的页面。注意这种功能通常是通过设置HTML页面HEAD区的<code>&lt;META HTTP-EQUIV=&quot;Refresh&quot; CONTENT=&quot;5;URL=http://host/path&quot;&gt;</code>实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<meta http-equiv="Refresh" ...="">。注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。</p>
<p><strong>WWW-Authenticate</strong>:该响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。例如:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">WWW-Authenticate:Basic realm=&quot;Basic Auth Test!&quot; </div><div class="line">//可以看出服务器对请求资源采用的是基本验证机制。</div></pre></td></tr></table></figure></p>
<h2 id="七、解决HTTP无状态的问题"><a href="#七、解决HTTP无状态的问题" class="headerlink" title="七、解决HTTP无状态的问题"></a>七、解决HTTP无状态的问题</h2><h3 id="7-1、通过Cookies保存状态信息"><a href="#7-1、通过Cookies保存状态信息" class="headerlink" title="7.1、通过Cookies保存状态信息"></a>7.1、通过Cookies保存状态信息</h3><p>通过Cookies,服务器就可以清楚的知道请求2和请求1来自同一个客户端。</p>
<p><img src="http://images.wuxubj.cn/201609/2515.png" alt="2515"></p>
<h3 id="7-2、通过Session保存状态信息"><a href="#7-2、通过Session保存状态信息" class="headerlink" title="7.2、通过Session保存状态信息"></a>7.2、通过Session保存状态信息</h3><p>Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。<br>当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。</p>
<blockquote>
<p>Session的实现方式:</p>
</blockquote>
<p>1、使用Cookie来实现<br>服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。<br>当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。</p>
<p><img src="http://images.wuxubj.cn/201609/2516.png" alt="2516"><br>2、使用URL回写来实现<br>URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带会服务器。如果直接在浏览器输入服务端资源的url来请求该资源,那么Session是匹配不到的。<br>Tomcat对Session的实现,是一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用response.encodeURL() 。</p>
<blockquote>
<p>Cookie和Session有以下明显的不同点:</p>
</blockquote>
<p>1)Cookie将状态保存在客户端,Session将状态保存在服务器端;<br>2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。Cookie最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;<br>3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;<br>4)就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些。因为它不会任意读取客户存储的信息。</p>
<h3 id="7-3、通过表单变量保持状态"><a href="#7-3、通过表单变量保持状态" class="headerlink" title="7.3、通过表单变量保持状态"></a>7.3、通过表单变量保持状态</h3><p>除了Cookies之外,还可以使用表单变量来保持状态,比如Asp.net就通过一个叫ViewState的Input=“hidden”的框来保持状态,比如:</p>
<p><input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMjA0OTM4MTAwNGRkXUfhlDv1Cs7/qhBlyZROCzlvf5U="><br>这个原理和Cookies大同小异,只是每次请求和响应所附带的信息变成了表单变量。</p>
<h3 id="7-4、通过QueryString保持状态"><a href="#7-4、通过QueryString保持状态" class="headerlink" title="7.4、通过QueryString保持状态"></a>7.4、通过QueryString保持状态</h3><p>QueryString通过将信息保存在所请求地址的末尾来向服务器传送信息,通常和表单结合使用,一个典型的QueryString比如:www.xxx.com/xxx.aspx?var1=value&amp;var2=value2</p>
<h2 id="八、使用telnet进行http测试"><a href="#八、使用telnet进行http测试" class="headerlink" title="八、使用telnet进行http测试"></a>八、使用telnet进行http测试</h2><p>在Windows下,可使用命令窗口进行http简单测试。输入cmd进入命令窗口,在命令行键入如下命令后按回车:<br>telnet www.baidu.com 80<br>而后在窗口中按下”Ctrl+]”后按回车可让返回结果回显。<br>接着开始发请求消息,例如发送如下请求消息请求baidu的首页消息,使用的HTTP协议为HTTP/1.1:<br>GET /index.html HTTP/1.1<br>注意:copy如上的消息到命令窗口后需要按两个回车换行才能得到响应的消息,第一个回车换行是在命令后键入回车换行,是HTTP协议要求的。第二个是确认输入,发送请求。</p>
<p><img src="http://images.wuxubj.cn/201609/2517.png" alt="2517"><br>可看到,当采用HTTP/1.1时,连接不是在请求结束后就断开的。若采用HTTP1.0,在命令窗口键入:<br>GET /index.html HTTP/1.0<br>此时可以看到请求结束之后马上断开。<br>读者还可以尝试在使用GET或POST等时,带上头域信息,例如键入如下信息:<br>GET /index.html HTTP/1.1<br>connection: close<br>Host: www.baidu.com</p>
<h2 id="九、URL详解"><a href="#九、URL详解" class="headerlink" title="九、URL详解"></a>九、URL详解</h2><p>URL(Uniform Resource Locator) 地址用于描述一个网络上的资源, 基本格式如下<br>schema://host[:port#]/path/…/[;url-params][?query-string][#anchor]<br>  scheme 指定低层使用的协议(例如:http, https, ftp)<br>  host HTTP服务器的IP地址或者域名<br>  port# HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如 <a href="http://www.cnblogs.com:8080/" target="_blank" rel="external">http://www.cnblogs.com:8080/</a><br>  path 访问资源的路径<br>  url-params<br>  query-string 发送给http服务器的数据<br>  anchor- 锚</p>
<p>URL 的一个例子:<br><a href="http://www.mywebsite.com/sj/test;id=8079?name=sviergn&amp;x=true#stuff" target="_blank" rel="external">http://www.mywebsite.com/sj/test;id=8079?name=sviergn&amp;x=true#stuff</a><br>Schema: http<br>host: www.mywebsite.com<br>path: /sj/test<br>URL params: id=8079<br>Query String: name=sviergn&amp;x=true<br>Anchor: stuff</p>
<h2 id="十、缓存的实现原理"><a href="#十、缓存的实现原理" class="headerlink" title="十、缓存的实现原理"></a>十、缓存的实现原理</h2><p>WEB缓存(cache)位于Web服务器和客户端之间。<br>缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。<br>HTTP协议定义了相关的消息头来使WEB缓存尽可能好的工作。</p>
<h3 id="10-1、缓存的优点"><a href="#10-1、缓存的优点" class="headerlink" title="10.1、缓存的优点"></a>10.1、缓存的优点</h3><p>减少相应延迟:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让web服务器看上去相应更快。<br>减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。</p>
<h3 id="10-2、客户端缓存生效的常见流程"><a href="#10-2、客户端缓存生效的常见流程" class="headerlink" title="10.2、客户端缓存生效的常见流程"></a>10.2、客户端缓存生效的常见流程</h3><p>服务器收到请求时,会在200OK中回送该资源的Last-Modified和ETag头,客户端将该资源保存在cache中,并记录这两个属性。当客户端需要发送相同的请求时,会在请求中携带If-Modified-Since和If-None-Match两个头。两个头的值分别是响应中Last-Modified和ETag头的值。服务器通过这两个头判断本地资源未发生变化,客户端不需要重新下载,返回304响应。</p>
<h3 id="10-3、Web缓存机制"><a href="#10-3、Web缓存机制" class="headerlink" title="10.3、Web缓存机制"></a>10.3、Web缓存机制</h3><p>HTTP/1.1中缓存的目的是为了在很多情况下减少发送请求,同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量;HTTP利用一个“过期(expiration)”机制来为此目的。后者减少了网络应用的带宽;HTTP用“验证(validation)”机制来为此目的。<br>HTTP定义了3种缓存机制:<br>1)Freshness:允许一个回应消息可以在源服务器不被重新检查,并且可以由服务器和客户端来控制。例如,Expires回应头给了一个文档不可用的时间。Cache-Control中的max-age标识指明了缓存的最长时间;<br>2)Validation:用来检查以一个缓存的回应是否仍然可用。例如,如果一个回应有一个Last-Modified回应头,缓存能够使用If-Modified-Since来判断是否已改变,以便判断根据情况发送请求;<br>3)Invalidation:在另一个请求通过缓存的时候,常常有一个副作用。例如,如果一个URL关联到一个缓存回应,但是其后跟着POST、PUT和DELETE的请求的话,缓存就会过期。</p>
<h2 id="十一、HTTP应用"><a href="#十一、HTTP应用" class="headerlink" title="十一、HTTP应用"></a>十一、HTTP应用</h2><h3 id="11-1、断点续传的实现原理"><a href="#11-1、断点续传的实现原理" class="headerlink" title="11.1、断点续传的实现原理"></a>11.1、断点续传的实现原理</h3><p>HTTP协议的GET方法,支持只请求某个资源的某一部分;<br>206 Partial Content 部分内容响应;<br>Range 请求的资源范围;<br>Content-Range 响应的资源范围;<br>在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。<br>分块请求资源实例:<br>Eg1:Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分;<br>Eg2:Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节;<br>客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目的。目前流行的FlashGet和迅雷基本都是这个原理。</p>
<h3 id="11-2、多线程下载的原理"><a href="#11-2、多线程下载的原理" class="headerlink" title="11.2、多线程下载的原理"></a>11.2、多线程下载的原理</h3><p>下载工具开启多个发出HTTP请求的线程;<br>每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000;<br>合并每个线程下载的文件。</p>
<h3 id="11-3、http代理"><a href="#11-3、http代理" class="headerlink" title="11.3、http代理"></a>11.3、http代理</h3><p>http代理服务器</p>
<p>代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。<br>代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。<br>而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。更重要的是:Proxy Server(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。</p>
<p>http代理服务器的主要功能:</p>
<p>1)突破自身IP访问限制,访问国外站点。如:教育网、169网等网络用户可以通过代理访问国外网站;<br>2)访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育 网开放的各类FTP下载上传,以及各类资料查询共享等服务;<br>3)突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国外的代理服务器试试;<br>4)提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度;<br>5)隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。</p>
<p>对于客户端浏览器而言,http代理服务器相当于服务器。<br>而对于Web服务器而言,http代理服务器又担当了客户端的角色。</p>
<h3 id="11-4、虚拟主机"><a href="#11-4、虚拟主机" class="headerlink" title="11.4、虚拟主机"></a>11.4、虚拟主机</h3><p>虚拟主机:是在网络服务器上划分出一定的磁盘空间供用户放置站点、应用组件等,提供必要的站点功能与数据存放、传输功能。<br>所谓虚拟主机,也叫“网站空间”就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每一个虚拟主机都具有独立的域名和完整的Internet服务器(支持WWW、FTP、E-mail等)功能。一台服务器上的不同虚拟主机是各自独立的,并由用户自行管理。但一台服务器主机只能够支持一定数量的虚拟主机,当超过这个数量时,用户将会感到性能急剧下降。</p>
<p>虚拟主机的实现原理</p>
<p>虚拟主机是用同一个WEB服务器,为不同域名网站提供服务的技术。Apache、Tomcat等均可通过配置实现这个功能。<br>相关的HTTP消息头:Host。<br>例如:Host: www.baidu.com<br>客户端发送HTTP请求的时候,会携带Host头,Host头记录的是客户端输入的域名。这样服务器可以根据Host头确认客户要访问的是哪一个域名。</p>
<h2 id="十三、HTTPS传输协议原理"><a href="#十三、HTTPS传输协议原理" class="headerlink" title="十三、HTTPS传输协议原理"></a>十三、HTTPS传输协议原理</h2><p>HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容请看SSL。</p>
<h3 id="13-1、两种基本的加解密算法类型"><a href="#13-1、两种基本的加解密算法类型" class="headerlink" title="13.1、两种基本的加解密算法类型"></a>13.1、两种基本的加解密算法类型</h3><p>对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等。<br>非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。</p>
<h3 id="13-2、HTTPS通信过程"><a href="#13-2、HTTPS通信过程" class="headerlink" title="13.2、HTTPS通信过程"></a>13.2、HTTPS通信过程</h3><p><img src="http://images.wuxubj.cn/201609/2518.png" alt="2518"></p>
<h3 id="13-3、HTTPS通信的优点"><a href="#13-3、HTTPS通信的优点" class="headerlink" title="13.3、HTTPS通信的优点"></a>13.3、HTTPS通信的优点</h3><p>客户端产生的密钥只有客户端和服务器端能得到;<br>加密的数据只有客户端和服务器端才能得到明文;<br>客户端到服务端的通信是安全的。</p>
<h2 id="十四、http的状态响应码"><a href="#十四、http的状态响应码" class="headerlink" title="十四、http的状态响应码"></a>十四、http的状态响应码</h2><div class="post_block">1<strong>(信息类):表示接收到请求并且继续处理<br>100——客户必须继续发出请求<br>101——客户要求服务器根据请求转换HTTP协议版本<br><br>2</strong>(响应成功):表示动作被成功接收、理解和接受<br>200——表明该请求被成功地完成,所请求的资源发送回客户端<br>201——提示知道新文件的URL<br>202——接受和处理、但处理未完成<br>203——返回信息不确定或不完整<br>204——请求收到,但返回信息为空<br>205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件<br>206——服务器已经完成了部分用户的GET请求<br><br>3<strong>(重定向类):为了完成指定的动作,必须接受进一步处理<br>300——请求的资源可在多处得到<br>301——本网页被永久性转移到另一个URL<br>302——请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。<br>303——建议客户访问其他URL或访问方式<br>304——自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用<br>305——请求的资源必须从服务器指定的地址得到<br>306——前一版本HTTP中使用的代码,现行版本中不再使用<br>307——申明请求的资源临时性删除<br><br>4</strong>(客户端错误类):请求包含错误语法或不能正确执行<br>400——客户端请求有语法错误,不能被服务器所理解<br>401——请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用<br>HTTP 401.1 - 未授权:登录失败<br>  HTTP 401.2 - 未授权:服务器配置问题导致登录失败<br>  HTTP 401.3 - ACL 禁止访问资源<br>  HTTP 401.4 - 未授权:授权被筛选器拒绝<br>HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败<br>402——保留有效ChargeTo头响应<br>403——禁止访问,服务器收到请求,但是拒绝提供服务<br>HTTP 403.1 禁止访问:禁止可执行访问<br>  HTTP 403.2 - 禁止访问:禁止读访问<br>  HTTP 403.3 - 禁止访问:禁止写访问<br>  HTTP 403.4 - 禁止访问:要求 SSL<br>  HTTP 403.5 - 禁止访问:要求 SSL 128<br>  HTTP 403.6 - 禁止访问:IP 地址被拒绝<br>  HTTP 403.7 - 禁止访问:要求客户证书<br>  HTTP 403.8 - 禁止访问:禁止站点访问<br>  HTTP 403.9 - 禁止访问:连接的用户过多<br>  HTTP 403.10 - 禁止访问:配置无效<br>  HTTP 403.11 - 禁止访问:密码更改<br>  HTTP 403.12 - 禁止访问:映射器拒绝访问<br>  HTTP 403.13 - 禁止访问:客户证书已被吊销<br>  HTTP 403.15 - 禁止访问:客户访问许可过多<br>  HTTP 403.16 - 禁止访问:客户证书不可信或者无效<br>HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效<br>404——一个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的URL<br>405——用户在Request-Line字段定义的方法不允许<br>406——根据用户发送的Accept拖,请求资源不可访问<br>407——类似401,用户必须首先在代理服务器上得到授权<br>408——客户端没有在用户指定的饿时间内完成请求<br>409——对当前资源状态,请求不能完成<br>410——服务器上不再有此资源且无进一步的参考地址<br>411——服务器拒绝用户定义的Content-Length属性请求<br>412——一个或多个请求头字段在当前请求中错误<br>413——请求的资源大于服务器允许的大小<br>414——请求的资源URL长于服务器允许的长度<br>415——请求资源不支持请求项目格式<br>416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段<br>417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。<br><br>5**(服务端错误类):服务器不能正确执行一个正确的请求<br>HTTP 500 - 服务器遇到错误,无法完成请求<br>  HTTP 500.100 - 内部服务器错误 - ASP 错误<br>  HTTP 500-11 服务器关闭<br>  HTTP 500-12 应用程序重新启动<br>  HTTP 500-13 - 服务器太忙<br>  HTTP 500-14 - 应用程序无效<br>  HTTP 500-15 - 不允许请求 global.asa<br>  Error 501 - 未实现<br>HTTP 502 - 网关错误<br>HTTP 503:由于超载或停机维护,服务器目前无法使用,一段时间后可能恢复正常<br></div>]]></content>
<summary type="html">
&lt;p&gt;比较全面的HTTP协议及其相关内容介绍。&lt;br&gt;转载自:&lt;a href=&quot;http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html&lt;/a&gt;&lt;br&gt;
</summary>
<category term="计算机网络" scheme="http://www.wuxubj.cn/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
<category term="网络协议" scheme="http://www.wuxubj.cn/tags/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/"/>
<category term="http" scheme="http://www.wuxubj.cn/tags/http/"/>
</entry>
<entry>
<title>Apache服务器搭建经验</title>
<link href="http://www.wuxubj.cn/2016/09/apache-operating-guide/"/>
<id>http://www.wuxubj.cn/2016/09/apache-operating-guide/</id>
<published>2016-09-16T02:47:37.000Z</published>
<updated>2017-05-03T02:55:37.175Z</updated>
<content type="html"><![CDATA[<blockquote>
<p>Apache/2.4.7 (Ubuntu)下的一些操作经验。</p>
</blockquote>
<a id="more"></a>
<h2 id="1-设置301跳转"><a href="#1-设置301跳转" class="headerlink" title="1. 设置301跳转"></a>1. 设置301跳转</h2><blockquote>
<p><strong>开启Rewrite模块</strong></p>
</blockquote>
<p>在终端依次执行:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"># sudo a2enmod rewrite</div><div class="line"># service apache2 restart</div></pre></td></tr></table></figure></p>
<p>停用使用<code>a2dismod</code>命令。</p>
<blockquote>
<p><strong>修改配置文件</strong></p>
</blockquote>
<p>在配置文件<code>apache2.conf</code>中,将所有的<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">AllowOverride None</div></pre></td></tr></table></figure></p>
<p>修改为:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">AllowOverride All</div></pre></td></tr></table></figure></p>
<p>然后核对配置文件中是否包含如下内容:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">AccessFileName .htaccess</div></pre></td></tr></table></figure></p>
<p>重启Apache2。</p>
<blockquote>
<p><strong>网站目录下面新建.htaccess文件</strong></p>
</blockquote>
<p>新建.htaccess文件,添加如下内容:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">Options +FollowSymLinks </div><div class="line">RewriteEngine On </div><div class="line">RewriteCond %&#123;HTTP_HOST&#125; ^wuxubj.cn [NC] </div><div class="line">RewriteRule (.*) http://www.wuxubj.cn%&#123;REQUEST_URI&#125; [L,R=301]</div></pre></td></tr></table></figure></p>
<p>完成之后便将<a href="http://wuxubj.cn/" target="_blank" rel="external">wuxubj.cn</a>设置为301跳转到<a href="http://www.wuxubj.cn/">www.wuxubj.cn</a>。</p>
<h2 id="2-设置目录禁止访问"><a href="#2-设置目录禁止访问" class="headerlink" title="2. 设置目录禁止访问"></a>2. 设置目录禁止访问</h2><p>当目录下没有 index.html 文件时,禁止显示目录。<br>在配置文件<code>apache2.conf</code>中,将<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Options Indexes FollowSymLinks</div></pre></td></tr></table></figure></p>
<p>修改为:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Options FollowSymLinks</div></pre></td></tr></table></figure></p>
<p>其实就是将<code>Indexes</code>去掉,<code>Indexes</code>表示若当前目录没有 index.html 就会显示目录结构。<br>相反,如果需要显示目录结构,则加上<code>Indexes</code>即可。</p>
<h2 id="3-一个IP绑定多个域名"><a href="#3-一个IP绑定多个域名" class="headerlink" title="3. 一个IP绑定多个域名"></a>3. 一个IP绑定多个域名</h2><p>通过虚拟主机实现一个IP绑定多个域名。找到在Apache安装路径下找到<code>apache2/sites-enabled/000-default.conf</code>文件,添加多个<code>&lt;VirtualHost *:80&gt;...&lt;VirtualHost&gt;</code>对:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div></pre></td><td class="code"><pre><div class="line"># /etc/apache2/sites-enabled/000-default.conf</div><div class="line">&lt;VirtualHost *:80&gt;</div><div class="line"> ServerAdmin 742745426@qq.com</div><div class="line"> #指定网站根目录</div><div class="line"> DocumentRoot /var/www/public/</div><div class="line"> #设置可用index文件</div><div class="line"> DirectoryIndex index.html index.htm index.php</div><div class="line"> # 指定域名</div><div class="line"> ServerName www.wuxubj.cn</div><div class="line"> ServerName wuxubj.cn</div><div class="line"> &lt;Directory /&gt;</div><div class="line"> Options FollowSymLinks</div><div class="line"> AllowOverride None</div><div class="line"> &lt;/Directory&gt;</div><div class="line"> #设置权限目录</div><div class="line"> &lt;Directory /var/www/public/&gt;</div><div class="line"> Options FollowSymLinks</div><div class="line"> AllowOverride All</div><div class="line"> Require all granted</div><div class="line"> &lt;/Directory&gt;</div><div class="line">&lt;VirtualHost&gt;</div><div class="line"></div><div class="line">&lt;VirtualHost *:80&gt;</div><div class="line"> ServerAdmin 742745426@qq.com</div><div class="line"> #指定网站根目录</div><div class="line"> DocumentRoot /var/www/public2/</div><div class="line"> #设置可用index文件</div><div class="line"> DirectoryIndex index.html index.htm index.php</div><div class="line"> # 指定域名</div><div class="line"> ServerName test.wuxubj.cn</div><div class="line"> &lt;Directory /&gt;</div><div class="line"> Options FollowSymLinks</div><div class="line"> AllowOverride None</div><div class="line"> &lt;/Directory&gt;</div><div class="line"> #设置权限目录</div><div class="line"> &lt;Directory /var/www/public2/&gt;</div><div class="line"> Options FollowSymLinks</div><div class="line"> AllowOverride All</div><div class="line"> Require all granted </div><div class="line"> &lt;/Directory&gt;</div><div class="line">&lt;VirtualHost&gt;</div></pre></td></tr></table></figure></p>
<p>如果要设置301跳转,则将<code>AllowOverride None</code>修改为<code>AllowOverride All</code>。<br>注意只需要开启一个端口即80端口,如果是https,则将以上80端口修改为443端口。端口监听配置如下:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"># /etc/apache2/ports.conf</div><div class="line">Listen 80</div><div class="line">&lt;IfModule ssl_module&gt;</div><div class="line"> Listen 443</div><div class="line">&lt;/IfModule&gt;</div><div class="line">&lt;IfModule mod_gnutls.c&gt;</div><div class="line"> Listen 443</div><div class="line">&lt;/IfModule&gt;</div></pre></td></tr></table></figure></p>
<p><br></p>
<blockquote>
<p><strong>参考文献</strong></p>
</blockquote>
<p><a href="http://www.111cn.net/phper/apache/54086.htm" target="_blank" rel="external">Apache如何开启Rewrite模块</a><br><a href="http://www.imooc.com/learn/170" target="_blank" rel="external">慕课网·在Ubuntu Server下搭建LAMP环境</a></p>
]]></content>
<summary type="html">
&lt;blockquote&gt;
&lt;p&gt;Apache/2.4.7 (Ubuntu)下的一些操作经验。&lt;/p&gt;
&lt;/blockquote&gt;
</summary>
<category term="Linux" scheme="http://www.wuxubj.cn/categories/Linux/"/>
<category term="Apache2" scheme="http://www.wuxubj.cn/tags/Apache2/"/>
<category term="服务器" scheme="http://www.wuxubj.cn/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
</entry>
<entry>
<title>Ubuntu Server上为Apache 2安装SSL证书</title>
<link href="http://www.wuxubj.cn/2016/09/install-ssl-apache2-ubuntu/"/>
<id>http://www.wuxubj.cn/2016/09/install-ssl-apache2-ubuntu/</id>
<published>2016-09-10T11:38:56.000Z</published>
<updated>2017-05-03T02:55:37.176Z</updated>
<content type="html"><![CDATA[<blockquote>
<p>Ubuntu Server 14.04.1 LTS 32位环境下,为Apache 2安装SSL证书,使网站支持https访问,并将http网址重定向到https。</p>
</blockquote>
<a id="more"></a>
<h2 id="1-安装SSL证书"><a href="#1-安装SSL证书" class="headerlink" title="1. 安装SSL证书"></a>1. 安装SSL证书</h2><blockquote>
<p><strong>获取SSL证书</strong></p>
</blockquote>
<p>我是在域名注册商腾讯云上申请的SSL证书,下载到 Windows 本地,再上传到 Linux 上的。参考:<a href="https://www.qcloud.com/doc/product/400/4142" target="_blank" rel="external">腾讯云:SSL证书管理</a><br>网上教程很多,此处不再赘述。</p>
<blockquote>
<p><strong>加载SSL模块到Apache2</strong></p>
</blockquote>
<p>执行以下命令确保 SSL模块已经加载进 Apache2 中:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># a2enmod ssl</span></div></pre></td></tr></table></figure></p>
<p>如果出现“Module ssl already enabled”这样的信息就说明 SSL 模块已经加载到 Apache2 中,如果出现“Enabling module ssl”,那么还需要手动重启 Apache2:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># service apache2 restart</span></div></pre></td></tr></table></figure></p>
<blockquote>
<p><strong>修改Apache2配置文件</strong></p>
</blockquote>
<p>编辑<code>/etc/apache2/sites-available/000-default.conf</code>文件,添加如下内容:</p>
<p><div class="codecopy codecopy1"> <figure class="highlight bash"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">&lt;VirtualHost *:443&gt;</div><div class="line"> ServerAdmin webmaster@localhost</div><div class="line"> DocumentRoot /var/www/public/</div><div class="line"> ServerName www.wuxubj.cn</div><div class="line"> SSLEngine on</div><div class="line"> SSLCertificateFile /var/ssl/wuxubj.crt</div><div class="line"> SSLCertificateKeyFile /var/ssl/2_www.wuxubj.cn.key</div><div class="line"> SSLCertificateChainFile /var/ssl/ca.crt</div><div class="line">&lt;/VirtualHost&gt;</div></pre></td></tr></table></figure></div></p>
<p>注意把网站根目录和各证书文件路径更换为你自己相应的文件存储路径。https 默认 443 端口,所以注意把 VirtualHost 端口该为 443 。<br>配置完成之后重启 Apache2 就可以用<code>https://yourdomain/</code>访问网站了。此时<code>http://yourdomain</code>无法访问,网站所有内容都必须指向 https。</p>
<h2 id="2-重定向http请求到https"><a href="#2-重定向http请求到https" class="headerlink" title="2. 重定向http请求到https"></a>2. 重定向http请求到https</h2><p>编辑<code>/etc/apache2/apache2.conf</code>文件,添加如下内容:</p>
<p><div class="codecopy codecopy2"> <figure class="highlight bash"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy2 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#Load rewrite_module</span></div><div class="line">LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so</div><div class="line"></div><div class="line">RewriteEngine On</div><div class="line">RewriteCond %&#123;HTTPS&#125; off</div><div class="line">RewriteRule (.*) https://%&#123;HTTP_HOST&#125;%&#123;REQUEST_URI&#125;</div></pre></td></tr></table></figure></div></p>
<p>再将 apache2.conf 中所有的<code>AllowOverride:None</code>修改为<code>AllowOverride:All</code>。<br>修改之后重启Apache2,http请求都将重定向到https。</p>
<h2 id="3-一些坑"><a href="#3-一些坑" class="headerlink" title="3. 一些坑"></a>3. 一些坑</h2><p>按照网上绝大多数教程配置之后,显示错误信息:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">Invalid command &apos;RewriteEngine&apos;, perhaps misspelled or defined by a module </div><div class="line">not included in the server configuration</div><div class="line">Action &apos;configtest&apos; failed.</div></pre></td></tr></table></figure></p>
<p>折腾半天,终于发现,apache2有许多modules存储在<code>/usr/lib/apache2/modules</code>目录下,开启重定向需要手动加载<code>mod_rewrite.so</code>,即在<code>/etc/apache2/apache2.conf</code>文件中添加:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so</div></pre></td></tr></table></figure></p>
<p>也可直接在终端依次执行:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"># sudo a2enmod rewrite</div><div class="line"># service apache2 restart</div></pre></td></tr></table></figure></p>
<p>开启Rewrite模块。</p>
<blockquote>
<p><strong>参考资料:</strong></p>
</blockquote>
<p><a href="https://www.qcloud.com/doc/product/400/证书安装指引#2.-apache-2.x.E8.AF.81.E4.B9.A6.E9.83.A8.E7.BD.B2" target="_blank" rel="external">腾讯云:SSL证书安装指引</a><br><a href="https://linux.cn/article-4901-1.html" target="_blank" rel="external">如何在Ubuntu 14.04 上为Apache 2.4 安装SSL支持</a><br><a href="http://unix.stackexchange.com/questions/31378/apache2-invalid-command-sslengine" target="_blank" rel="external">apache2 Invalid command ‘SSLEngine’</a></p>
]]></content>
<summary type="html">
&lt;blockquote&gt;
&lt;p&gt;Ubuntu Server 14.04.1 LTS 32位环境下,为Apache 2安装SSL证书,使网站支持https访问,并将http网址重定向到https。&lt;/p&gt;
&lt;/blockquote&gt;
</summary>
<category term="Linux" scheme="http://www.wuxubj.cn/categories/Linux/"/>
<category term="Apache2" scheme="http://www.wuxubj.cn/tags/Apache2/"/>
<category term="https" scheme="http://www.wuxubj.cn/tags/https/"/>
<category term="SSL" scheme="http://www.wuxubj.cn/tags/SSL/"/>
</entry>
<entry>
<title>栈的应用:表达式求值</title>
<link href="http://www.wuxubj.cn/2016/08/expression-evaluation/"/>
<id>http://www.wuxubj.cn/2016/08/expression-evaluation/</id>
<published>2016-08-21T12:52:26.000Z</published>
<updated>2017-05-03T02:55:37.180Z</updated>
<content type="html"><![CDATA[<div id="topc" class="topc-article"><strong class="topc-title">Contents</strong><ol class="topc"><li class="topc-item topc-level-1"><a class="topc-link" href="#0-例题"><span class="topc-text">0. 例题</span></a></li><li class="topc-item topc-level-1"><a class="topc-link" href="#1-分析"><span class="topc-text">1. 分析</span></a></li><li class="topc-item topc-level-1"><a class="topc-link" href="#2-中缀表达式转换为后缀表达式"><span class="topc-text">2. 中缀表达式转换为后缀表达式</span></a></li><li class="topc-item topc-level-1"><a class="topc-link" href="#3-根据后缀表达式求值"><span class="topc-text">3. 根据后缀表达式求值</span></a></li><li class="topc-item topc-level-1"><a class="topc-link" href="#4-测试主函数"><span class="topc-text">4. 测试主函数</span></a></li></ol></div>
<h2 id="0-例题"><a href="#0-例题" class="headerlink" title="0. 例题"></a>0. 例题</h2><p>编写一个程序可以完成基本的带括号的四则运算。其中除法(/)是整除,并且在负数除法时向0取整。(C/C++/Java默认的除法就是向0取整,python默认的是向负无穷取整)。<br>例如计算 <code>100 * ( 2 + 12 ) - (20 / 3) * 2</code>, 结果是<code>1388</code>。<br><strong>样例输入:</strong><br><code>100*(2+12)-(20/3)*2</code><br><strong>样例输出:</strong><br><code>1388</code></p>
<a id="more"></a>
<h2 id="1-分析"><a href="#1-分析" class="headerlink" title="1. 分析"></a>1. 分析</h2><p>中缀表达式将二元运算符放在两个操作数之间,而后缀表达式的每个运算符都出现在相应操作数之后。后缀表达式去掉了括号,因此在计算机中,用后缀表达式求值更为简单。<br><code>100*(2+12)-(20/3)*2</code>为中缀表达式,其对应的后缀表达式(逆波兰式)为<code>100&amp;2&amp;12+*20&amp;3/2*-</code>。<br>用用后缀表达式求值是栈的典型应用,其步骤分为两步:</p>
<blockquote>
<p><strong>将中缀表达式转换为后缀表达式</strong></p>
</blockquote>
<p><strong>数字:</strong>直接添加到后缀表达式中,<font color="#f00">数值之间需要添加分隔符</font>。<br><strong>左括号:</strong>直接压入到符号栈。<br><strong>右括号:</strong>右括号总是不入栈,遇到右括号,则之前入栈的运算符逐一出栈,并添加到后缀表达式中,直到碰到左括号。<font color="#f00">遇到左括号直接将其弹出即可</font>。<br><strong>运算符:</strong>运算符入栈之前,与符号栈栈顶的运算符比较优先级,如果优先级<font color="#f00">小于或等于</font>栈顶运算符优先级,则栈顶运算符弹出,并添加到后缀表达式中,最后将待入栈的运算符入栈<font color="#f00">(优先级比较时,左括号当作低优先级运算符处理)</font>。<br>中缀表达式循环一遍之后,最后将符号栈中的运算符逐一弹出,添加到后缀表达式中。</p>
<blockquote>
<p><strong>利用后缀表达式求值</strong></p>
</blockquote>
<p><strong>数字:</strong>根据分隔符取出完整数值,压入到数值栈。<font color="#f00">数字处理注意如何将数字组合成完整的数值</font>。<br><strong>运算符:</strong>弹出数值栈的栈顶前两个数值,与运算符一起进行四则运算,再将运算结果压入到数值栈,当到达后缀表达式末端时,数值栈中应该只有一个数值,该值即为整个表达式的运算结果。<font color="#f00">运算符处理时,注意除法中操作数的顺序</font>。</p>
<h2 id="2-中缀表达式转换为后缀表达式"><a href="#2-中缀表达式转换为后缀表达式" class="headerlink" title="2. 中缀表达式转换为后缀表达式"></a>2. 中缀表达式转换为后缀表达式</h2><div class="codecopy codecopy1"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//获取运算符优先级</span></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">getRink</span><span class="params">(<span class="keyword">char</span> opt)</span></span>&#123; </div><div class="line"> <span class="keyword">if</span> (opt == <span class="string">'+'</span> || opt == <span class="string">'-'</span>) <span class="keyword">return</span> <span class="number">10</span>;</div><div class="line"> <span class="keyword">if</span> (opt == <span class="string">'*'</span> || opt == <span class="string">'/'</span>) <span class="keyword">return</span> <span class="number">20</span>;</div><div class="line"> <span class="keyword">if</span> (opt == <span class="string">'('</span>) <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line"> <span class="keyword">else</span> <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line">&#125;</div><div class="line"><span class="comment">//中缀表达式转为后缀表达式</span></div><div class="line"><span class="comment">//str_mid:中缀表达式</span></div><div class="line"><span class="comment">//str_post:后缀表达式</span></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">postfix</span><span class="params">(<span class="built_in">string</span> &amp;str_post, <span class="built_in">string</span> &amp;str_mid)</span></span>&#123; </div><div class="line"> <span class="built_in">stack</span>&lt;<span class="keyword">char</span>&gt; opt; <span class="comment">//定义运算符栈</span></div><div class="line"> <span class="keyword">bool</span> flag = <span class="literal">false</span>; <span class="comment">//标记上一个输出是否为数字</span></div><div class="line"> <span class="keyword">while</span> (!opt.empty()) opt.pop();<span class="comment">//运算符栈清空</span></div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; str_mid[i] != <span class="string">'\0'</span>; i++)&#123;</div><div class="line"> <span class="comment">// 数字处理</span></div><div class="line"> <span class="keyword">if</span> (str_mid[i] &gt;= <span class="string">'0'</span> &amp;&amp; str_mid[i] &lt;= <span class="string">'9'</span>)&#123;</div><div class="line"> <span class="keyword">if</span> (flag) str_post += <span class="string">'&amp;'</span>; <span class="comment">//上一个输出为数字则中间用&amp;分隔</span></div><div class="line"> <span class="keyword">else</span> flag = <span class="literal">true</span>;</div><div class="line"> <span class="comment">//获取一个数值中的连续多个数字</span></div><div class="line"> <span class="keyword">while</span> (<span class="string">'0'</span> &lt;= str_mid[i] &amp;&amp; <span class="string">'9'</span> &gt;= str_mid[i])&#123;</div><div class="line"> str_post += str_mid[i];</div><div class="line"> i++;</div><div class="line"> &#125;</div><div class="line"> i--;</div><div class="line"> &#125;</div><div class="line"> <span class="comment">//左括号处理</span></div><div class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (str_mid[i] == <span class="string">'('</span>)&#123;</div><div class="line"> opt.push(str_mid[i]);</div><div class="line"></div><div class="line"> &#125;</div><div class="line"> <span class="comment">//右括号处理</span></div><div class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (str_mid[i] == <span class="string">')'</span>)&#123;</div><div class="line"> <span class="keyword">while</span> (opt.top() != <span class="string">'('</span> &amp;&amp; !opt.empty())&#123;</div><div class="line"> str_post += opt.top();</div><div class="line"> opt.pop();</div><div class="line"> flag = <span class="literal">false</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (opt.empty()) <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line"> <span class="keyword">if</span> (opt.top() == <span class="string">'('</span>)&#123;</div><div class="line"> opt.pop();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> &#125;</div><div class="line"> <span class="comment">//运算符处理</span></div><div class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (str_mid[i] == <span class="string">'+'</span> || str_mid[i] == <span class="string">'-'</span> || str_mid[i] == <span class="string">'*'</span> || str_mid[i] == <span class="string">'/'</span>)&#123;</div><div class="line"> <span class="keyword">int</span> a1 = getRink(str_mid[i]);</div><div class="line"> <span class="keyword">if</span> (a1&lt;<span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line"> <span class="keyword">int</span> a2;</div><div class="line"> <span class="keyword">while</span> (!opt.empty())&#123;</div><div class="line"> a2 = getRink(opt.top());</div><div class="line"> <span class="keyword">if</span> (a2&lt;<span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line"> <span class="keyword">if</span> (a1 &lt;= a2)&#123; <span class="comment">//等于的时候也要弹出</span></div><div class="line"> str_post += opt.top();</div><div class="line"> opt.pop();</div><div class="line"> flag = <span class="literal">false</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">else</span> <span class="keyword">break</span>;</div><div class="line"> &#125;</div><div class="line"> opt.push(str_mid[i]);</div><div class="line"></div><div class="line"> &#125;</div><div class="line"> <span class="keyword">else</span> <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="comment">// 运算符出栈</span></div><div class="line"> <span class="keyword">while</span> (!opt.empty())&#123;</div><div class="line"> <span class="keyword">if</span> (opt.top() == <span class="string">'('</span>) <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line"> str_post += opt.top();</div><div class="line"> opt.pop();</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>
<h2 id="3-根据后缀表达式求值"><a href="#3-根据后缀表达式求值" class="headerlink" title="3. 根据后缀表达式求值"></a>3. 根据后缀表达式求值</h2><div class="codecopy codecopy2"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy2 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//加减乘除结果计算</span></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">getResult</span><span class="params">(<span class="keyword">int</span> a, <span class="keyword">int</span> b, <span class="keyword">char</span> opp)</span></span>&#123;</div><div class="line"> <span class="keyword">if</span> (opp == <span class="string">'+'</span>) <span class="keyword">return</span> a + b;</div><div class="line"> <span class="keyword">if</span> (opp == <span class="string">'-'</span>) <span class="keyword">return</span> a - b;</div><div class="line"> <span class="keyword">if</span> (opp == <span class="string">'*'</span>) <span class="keyword">return</span> a*b;</div><div class="line"> <span class="keyword">if</span> (opp == <span class="string">'/'</span>) <span class="keyword">return</span> a / b;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">compute</span><span class="params">(<span class="built_in">string</span> str)</span></span>&#123;</div><div class="line"> <span class="built_in">stack</span>&lt;<span class="keyword">int</span>&gt; data;</div><div class="line"> <span class="keyword">int</span> temp, op1, op2;</div><div class="line"> <span class="keyword">while</span> (!data.empty()) data.pop();</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; str[i] != <span class="string">'\0'</span>; i++)&#123;</div><div class="line"> <span class="comment">//数值分隔符直接跳过</span></div><div class="line"> <span class="keyword">if</span> (<span class="string">'&amp;'</span> == str[i]) <span class="keyword">continue</span>;</div><div class="line"> <span class="comment">//数值处理</span></div><div class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (<span class="string">'0'</span> &lt;= str[i] &amp;&amp; <span class="string">'9'</span> &gt;= str[i]) &#123;</div><div class="line"> temp = <span class="number">0</span>;</div><div class="line"> <span class="keyword">while</span> (<span class="string">'0'</span> &lt;= str[i] &amp;&amp; <span class="string">'9'</span> &gt;= str[i])&#123;</div><div class="line"> temp = temp * <span class="number">10</span> + str[i] - <span class="string">'0'</span>;</div><div class="line"> i++;</div><div class="line"> &#125;</div><div class="line"> i--;</div><div class="line"> data.push(temp);</div><div class="line"> &#125;</div><div class="line"> <span class="comment">//运算符处理</span></div><div class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (str[i] == <span class="string">'+'</span> || str[i] == <span class="string">'-'</span> || str[i] == <span class="string">'*'</span> || str[i] == <span class="string">'/'</span>)&#123;</div><div class="line"> <span class="keyword">if</span> (data.size()&lt;<span class="number">2</span>)&#123; <span class="keyword">return</span> <span class="number">-1</span>; &#125;</div><div class="line"> op1 = data.top(); data.pop();</div><div class="line"> op2 = data.top(); data.pop();</div><div class="line"> temp = getResult(op2, op1, str[i]); <span class="comment">//除法的时候注意数值顺序</span></div><div class="line"> data.push(temp);</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">else</span> <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (data.size() != <span class="number">1</span>)&#123;</div><div class="line"> <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">return</span> data.top();</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>
<h2 id="4-测试主函数"><a href="#4-测试主函数" class="headerlink" title="4. 测试主函数"></a>4. 测试主函数</h2><div class="codecopy codecopy3"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy3 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</div><div class="line"> <span class="built_in">string</span> str_post, str_mid;</div><div class="line"> <span class="built_in">cin</span> &gt;&gt; str_mid;</div><div class="line"> <span class="keyword">if</span>(!postfix(str_post, str_mid))&#123;</div><div class="line"> <span class="built_in">cout</span> &lt;&lt; str_post &lt;&lt; <span class="built_in">endl</span>;</div><div class="line"> <span class="built_in">cout</span> &lt;&lt; compute(str_post) &lt;&lt; <span class="built_in">endl</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>
]]></content>
<summary type="html">
&lt;div id=&quot;topc&quot; class=&quot;topc-article&quot;&gt;&lt;strong class=&quot;topc-title&quot;&gt;Contents&lt;/strong&gt;&lt;ol class=&quot;topc&quot;&gt;&lt;li class=&quot;topc-item topc-level-1&quot;&gt;&lt;a class=&quot;topc-link&quot; href=&quot;#0-例题&quot;&gt;&lt;span class=&quot;topc-text&quot;&gt;0. 例题&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;topc-item topc-level-1&quot;&gt;&lt;a class=&quot;topc-link&quot; href=&quot;#1-分析&quot;&gt;&lt;span class=&quot;topc-text&quot;&gt;1. 分析&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;topc-item topc-level-1&quot;&gt;&lt;a class=&quot;topc-link&quot; href=&quot;#2-中缀表达式转换为后缀表达式&quot;&gt;&lt;span class=&quot;topc-text&quot;&gt;2. 中缀表达式转换为后缀表达式&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;topc-item topc-level-1&quot;&gt;&lt;a class=&quot;topc-link&quot; href=&quot;#3-根据后缀表达式求值&quot;&gt;&lt;span class=&quot;topc-text&quot;&gt;3. 根据后缀表达式求值&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;topc-item topc-level-1&quot;&gt;&lt;a class=&quot;topc-link&quot; href=&quot;#4-测试主函数&quot;&gt;&lt;span class=&quot;topc-text&quot;&gt;4. 测试主函数&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;h2 id=&quot;0-例题&quot;&gt;&lt;a href=&quot;#0-例题&quot; class=&quot;headerlink&quot; title=&quot;0. 例题&quot;&gt;&lt;/a&gt;0. 例题&lt;/h2&gt;&lt;p&gt;编写一个程序可以完成基本的带括号的四则运算。其中除法(/)是整除,并且在负数除法时向0取整。(C/C++/Java默认的除法就是向0取整,python默认的是向负无穷取整)。&lt;br&gt;例如计算 &lt;code&gt;100 * ( 2 + 12 ) - (20 / 3) * 2&lt;/code&gt;, 结果是&lt;code&gt;1388&lt;/code&gt;&lt;br&gt;&lt;strong&gt;样例输入:&lt;/strong&gt;&lt;br&gt;&lt;code&gt;100*(2+12)-(20/3)*2&lt;/code&gt;&lt;br&gt;&lt;strong&gt;样例输出:&lt;/strong&gt;&lt;br&gt;&lt;code&gt;1388&lt;/code&gt;&lt;/p&gt;
</summary>
<category term="算法与数据结构" scheme="http://www.wuxubj.cn/categories/%E7%AE%97%E6%B3%95%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="表达式求值" scheme="http://www.wuxubj.cn/tags/%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC/"/>
<category term="" scheme="http://www.wuxubj.cn/tags/%E6%A0%88/"/>
</entry>
<entry>
<title>Hexo+nexT主题搭建个人博客</title>
<link href="http://www.wuxubj.cn/2016/08/Hexo-nexT-build-personal-blog/"/>
<id>http://www.wuxubj.cn/2016/08/Hexo-nexT-build-personal-blog/</id>
<published>2016-08-13T02:19:14.000Z</published>
<updated>2017-05-03T02:55:37.171Z</updated>
<content type="html"><![CDATA[<p><img src="http://images.wuxubj.cn/201608/001.jpg" alt="Hexo"></p>
<h2 id="1-Hexo简介"><a href="#1-Hexo简介" class="headerlink" title="1. Hexo简介"></a>1. Hexo简介</h2><p>Hexo 是一款基于 Node.js 的静态博客框架。Hexo 使用 Markdown 解析文章,用户在本地安装Hexo并进行写作,通过一条命令,Hexo即可利用靓丽的主题自动生成静态网页。<br>参考:<a href="https://github.com/hexojs/hexo" target="_blank" rel="external">Hexo Github地址</a> &nbsp;&nbsp;&nbsp;&nbsp;<a href="https://hexo.io/zh-cn/docs/" target="_blank" rel="external">Hexo帮助文档</a><a id="more"></a></p>
<h2 id="2-博客环境搭建"><a href="#2-博客环境搭建" class="headerlink" title="2. 博客环境搭建"></a>2. 博客环境搭建</h2><h3 id="2-1-安装Git"><a href="#2-1-安装Git" class="headerlink" title="2.1 安装Git"></a>2.1 安装Git</h3><blockquote>
<p><strong>Windows平台:以 Win7 64位机为例</strong></p>
</blockquote>
<p>到<a href="https://git-scm.com/download" target="_blank" rel="external">官网</a>下载 Git,一路默认选项安装。本文使用的是<code>Git-2.8.1-64-bit</code>,需要的用户可以<a href="http://obtvnlw7v.bkt.clouddn.com/Git-2.8.1-64-bit.exe" target="_blank" rel="external">点此下载</a> 。</p>
<blockquote>
<p><strong>Linux平台</strong></p>
</blockquote>
<h3 id="2-2-安装Node-js"><a href="#2-2-安装Node-js" class="headerlink" title="2.2 安装Node.js"></a>2.2 安装Node.js</h3><blockquote>
<p><strong>Windows平台:以 Win7 64位机为例</strong></p>
</blockquote>
<p>到<a href="http://nodejs.cn/download/" target="_blank" rel="external">官网</a>下载 Node.js,一路默认选项安装。本文使用的是<code>node-v4.4.2-x64</code>,需要的用户可以<a href="http://obtvnlw7v.bkt.clouddn.com/node-v4.4.2-x64.msi" target="_blank" rel="external">点此下载</a> 。</p>
<blockquote>
<p><strong>Linux平台</strong></p>
</blockquote>
<h3 id="2-3-安装Hexo"><a href="#2-3-安装Hexo" class="headerlink" title="2.3 安装Hexo"></a>2.3 安装Hexo</h3><p>Git 和 Node.js 都安装好后,首先创建一个用于存放博客文件的文件夹,如 blog,然后进入 blog 文件夹,下面开始安装并使用 Hexo。</p>
<blockquote>
<p><strong>安装并初始化Hexo</strong></p>
</blockquote>
<p>右键选择<code>Git Bash Here</code>,弹出<code>Git Bash</code>窗口;执行命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$ npm install -g hexo-cli</div><div class="line">$ hexo init</div></pre></td></tr></table></figure></p>
<p>安装完成后,指定文件夹的目录如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">├── _config.yml</div><div class="line">├── package.json</div><div class="line">├── scaffolds</div><div class="line">├── <span class="built_in">source</span></div><div class="line">| ├── _drafts</div><div class="line">| └── _posts</div><div class="line">└── themes</div></pre></td></tr></table></figure></p>
<p>其中<code>_config.yml</code>文件用于存放网站的配置信息,你可以在此配置大部分的参数;<code>scaffolds</code>是存放模板的文件夹,当新建文章时,Hexo 会根据<code>scaffold</code>来建立文件;<code>source</code>是资源文件夹,用于存放用户资源,<code>themes</code>是主题文件夹,存放博客主题,Hexo 会根据主题来生成静态页面。</p>
<blockquote>
<p><strong>生成静态博客文件</strong></p>
</blockquote>
<p>在<code>Git Bash</code>终端执行命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$ hexo g</div><div class="line">$ hexo s</div></pre></td></tr></table></figure></p>
<p>Hexo将<code>source</code>文件夹中的Markdown 和 HTML 文件会被解析并放到<code>public</code>文件夹中,<code>public</code>文件夹用于存放静态博客文件,相当于网站根目录。<br>至此博客雏形基本完成,在浏览器中访问<code>http://localhost:4000/</code>,如图所示:</p>
<p><img src="http://images.wuxubj.cn/201608/002.jpg" alt="002"></p>
<h3 id="2-4-使用nexT主题"><a href="#2-4-使用nexT主题" class="headerlink" title="2.4 使用nexT主题"></a>2.4 使用nexT主题</h3><blockquote>
<p><strong>下载nexT主题</strong></p>
</blockquote>
<p>在<code>Git Bash</code>终端执行以下命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ git <span class="built_in">clone</span> https://github.com/iissnan/hexo-theme-next themes/next</div></pre></td></tr></table></figure></p>
<p>解压所下载的压缩包至站点的 themes 目录下, 并将解压后的文件夹名称更改为 next 。本文使用<code>hexo-theme-next-5.0.1</code>,需要的用户可以<a href="https://github.com/iissnan/hexo-theme-next/archive/v5.0.1.zip" target="_blank" rel="external">点此下载</a> 。</p>
<blockquote>
<p><strong>启用nexT主题</strong></p>
</blockquote>
<p>打开<font color="#f00">站点配置文件</font> <code>_config.yml</code>,找到 theme 字段,并将其值更改为 next。<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="attr">theme:</span> <span class="string">next</span></div></pre></td></tr></table></figure></p>
<p>在<code>Git Bash</code>终端执行命令<code>hexo s</code>,在浏览器中访问<code>http://localhost:4000/</code>,当你看到站点的外观与下图所示类似时即说明你已成功安装 NexT 主题。这是 NexT 默认的 Scheme —— Muse。</p>
<p><img src="http://images.wuxubj.cn/201608/003.jpg" alt="003"><br>本博客使用的是<code>NexT.Pisces</code>主题,修改<font color="#f00">主题配置文件</font> <code>_config.yml</code>的 Schemes 字段的值为:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="attr">scheme:</span> <span class="string">Pisces</span></div></pre></td></tr></table></figure></p>
<p>博客预览如图:</p>
<p><img src="http://images.wuxubj.cn/201608/004.jpg" alt="004"></p>
<h2 id="3-NexT主题配置"><a href="#3-NexT主题配置" class="headerlink" title="3. NexT主题配置"></a>3. NexT主题配置</h2><h3 id="3-1-主题基本设定"><a href="#3-1-主题基本设定" class="headerlink" title="3.1 主题基本设定"></a>3.1 主题基本设定</h3><p>参照<a href="http://theme-next.iissnan.com/getting-started.html#theme-settings" target="_blank" rel="external">NexT使用文档</a>,设置界面语言、菜单、侧栏、头像、作者昵称和站点描述。由于该使用文档描述非常详细,本文不再赘述。此处需要注意,<font color="#f00">添加新的菜单项时,需要手动创建该页面才能正常访问</font>,下面以分类页面为例讲述创建新页面的方法:</p>
<blockquote>
<p><strong>创建分类页面</strong></p>
</blockquote>
<p>在<code>Git Bash</code>终端执行命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo new page categories</div></pre></td></tr></table></figure></p>
<blockquote>
<p><strong>编辑分类页面</strong></p>
</blockquote>
<p>添加页面类型字段,将其值设置为 <code>&quot;categories&quot;</code>,主题将自动为这个页面显示所有分类,如果有启用多说 或者 Disqus 评论,默认页面也会带有评论。需要关闭的话,请添加字段 <code>comments</code> 并将值设置为 <code>false</code>。<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="attr">title:</span> <span class="string">分类</span></div><div class="line"><span class="attr">date:</span> <span class="number">2014</span><span class="bullet">-12</span><span class="bullet">-22</span> <span class="number">12</span><span class="string">:39:04</span></div><div class="line"><span class="attr">type:</span> <span class="string">"categories"</span></div><div class="line"><span class="attr">comments:</span> <span class="literal">false</span></div><div class="line"><span class="meta">---</span></div></pre></td></tr></table></figure></p>
<p>创建标签页的方法同上,只需要将<code>type</code>字段设置为<code>&quot;tags&quot;</code>即可。</p>
<h3 id="3-2-添加侧栏社交链接和友链"><a href="#3-2-添加侧栏社交链接和友链" class="headerlink" title="3.2 添加侧栏社交链接和友链"></a>3.2 添加侧栏社交链接和友链</h3><blockquote>
<p><strong>添加侧栏社交链接</strong></p>
</blockquote>
<p>在<font color="#f00">主题配置文件</font> <code>_config.yml</code>中<code>Sidebar Settings</code>部分添加字段:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># Social Links</span></div><div class="line"><span class="attr">social:</span></div><div class="line"><span class="attr"> GitHub:</span> <span class="attr">https://github.com/wuxubj</span></div><div class="line"><span class="attr"> Weibo:</span> <span class="attr">http://weibo.com/wuxubj</span></div></pre></td></tr></table></figure></p>
<p>本博客将侧栏社交链接设置居中显示,修改<code>themes\next\source\css\_common\components\sidebar\sidebar-author-links.styl</code>文件,添加如下样式:</p>
<p><div class="codecopy codecopy0"> <figure class="highlight css"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy0 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="selector-class">.links-of-author-item</span> &#123;</div><div class="line"> <span class="attribute">text-align</span>: center;</div><div class="line"> &#125;</div></pre></td></tr></table></figure></div></p>
<p></p>
<blockquote>
<p><strong>添加侧栏友情链接</strong></p>
</blockquote>
<p>在<font color="#f00">主题配置文件</font> <code>_config.yml</code>中<code>Sidebar Settings</code>部分添加字段:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># Blogrolls</span></div><div class="line"><span class="attr">links_title:</span> <span class="string">友情链接</span></div><div class="line"><span class="attr">links_layout:</span> <span class="string">inline</span></div><div class="line"><span class="attr">links_icon:</span> <span class="string">link</span> <span class="comment"># 设置图标</span></div><div class="line"><span class="attr">links:</span></div><div class="line"> <span class="string">务虚笔记:</span> <span class="attr">http://www.wuxubj.cn</span></div></pre></td></tr></table></figure></p>
<p>本博客侧栏友情链接使用了与侧栏社交链接相同的css样式,但文本左对齐。实现方法为:<br>修改<code>themes\next\layout\_macro\sidebar.swig</code>,将如下内容</p>
<p><div class="codecopy codecopy1"> <figure class="highlight html"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="tag">&lt;<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"links-of-blogroll-list"</span>&gt;</span></div><div class="line"> &#123;% for name, link in theme.links %&#125;</div><div class="line"> <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">"links-of-blogroll-item"</span>&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">"&#123;&#123; link &#125;&#125;"</span> <span class="attr">title</span>=<span class="string">"&#123;&#123; name &#125;&#125;"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>&gt;</span></div><div class="line"> &#123;&#123; name &#125;&#125;</div><div class="line"> <span class="tag">&lt;/<span class="name">a</span>&gt;</span></div><div class="line"> <span class="tag">&lt;/<span class="name">li</span>&gt;</span></div><div class="line"> &#123;% endfor %&#125;</div><div class="line"><span class="tag">&lt;/<span class="name">ul</span>&gt;</span></div></pre></td></tr></table></figure></div></p>
<p>修改为:</p>
<p><div class="codecopy codecopy2"> <figure class="highlight"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy2 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">&#123;% for name, link in theme.links %&#125;</div><div class="line"> &lt;span class="links-of-author-item" style="text-align:left"&gt;</div><div class="line"> &lt;a href="&#123;&#123; link &#125;&#125;" title="&#123;&#123; name &#125;&#125;" target="_blank"&gt;</div><div class="line"> &#123;&#123; name &#125;&#125;</div><div class="line"> &lt;/a&gt;</div><div class="line"> &lt;/span&gt;</div><div class="line">&#123;% endfor %&#125;</div></pre></td></tr></table></figure></div></p>
<p></p>
<h3 id="3-3-添加并美化本地搜索"><a href="#3-3-添加并美化本地搜索" class="headerlink" title="3.3 添加并美化本地搜索"></a>3.3 添加并美化本地搜索</h3><p>很多 NexT 主题的博主都使用 Swiftype 搜索,但是 Swiftype 文章同步更新缓慢,且只有15天的试用期,用户体验很是不好。NexT 主题内置了本地站内搜索,但是其显示界面太过粗糙,本文对其进行了一些美化。下面是添加并美化本地搜索的具体方法。</p>
<blockquote>
<p><strong>安装并使用 hexo-generator-search</strong></p>
</blockquote>
<p><code>hexo-generator-search</code>插件用于生成博客索引数据,在站点的根目录下执行以下命令进行安装:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ npm install hexo-generator-search --save</div></pre></td></tr></table></figure></p>
<p>编辑 <font color="#f00">站点配置文件</font> <code>_config.yml</code>,新增以下内容到任意位置:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="attr">search:</span></div><div class="line"><span class="attr"> path:</span> <span class="string">search.xml</span></div><div class="line"><span class="attr"> field:</span> <span class="string">post</span></div></pre></td></tr></table></figure></p>
<p>更多配置说明可到插件页面查看:<a href="https://github.com/PaicHyperionDev/hexo-generator-search" target="_blank" rel="external">hexo-generator-search</a><br>至此,本地搜索功能已经完成,如图:</p>
<p><img src="http://images.wuxubj.cn/201608/005.jpg" alt="localsearch"><br>可以看到,搜索弹窗界面比较粗糙,下面进行简单美化。</p>
<blockquote>
<p><strong>弹窗界面美化</strong></p>
</blockquote>
<p>本地搜索的样式文件路径为<code>themes\next\source\css\_common\components\third-party\localsearch.styl</code>。本地搜索弹窗界面美化主要包括搜索输入显示、搜索结果关键字显示和搜索结果段落排版的美化,相关css样式为:</p>
<p><div class="codecopy codecopy3"> <figure class="highlight css"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy3 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line"><span class="selector-id">#local-search-input</span> &#123;</div><div class="line"> <span class="attribute">margin-bottom</span>: <span class="number">10px</span>;</div><div class="line"> <span class="attribute">padding</span>: <span class="number">10px</span>;</div><div class="line"> <span class="attribute">width</span>: <span class="number">97%</span>;</div><div class="line"> <span class="attribute">font-size</span>: <span class="number">18px</span></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="selector-class">.popup</span> <span class="selector-class">.fa-search</span>&#123;<span class="attribute">padding</span>:<span class="number">8px</span> <span class="number">0</span>;&#125;</div><div class="line"></div><div class="line"><span class="selector-class">.search-keyword</span> &#123;</div><div class="line"> <span class="attribute">border-bottom</span>: <span class="number">1px</span> dashed <span class="number">#f00</span>;</div><div class="line"> <span class="attribute">font-size</span>: <span class="number">14px</span>;</div><div class="line"> <span class="attribute">font-weight</span>: bold;</div><div class="line"> <span class="attribute">color</span>: <span class="number">#f00</span>;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="selector-tag">p</span><span class="selector-class">.search-result</span> &#123;</div><div class="line"> <span class="attribute">border-bottom</span>: <span class="number">1px</span> dashed <span class="number">#ccc</span>;</div><div class="line"> <span class="attribute">padding</span>: <span class="number">5px</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">0</span>;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="selector-id">#local-search-result</span> &#123;</div><div class="line"> <span class="attribute">height</span>: <span class="number">88%</span>;</div><div class="line"> <span class="attribute">overflow</span>: auto;</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p>如果觉得输入框search图标太小,可以将其放大。修改<code>themes\next\layout\_partials\search\localsearch.swig</code>文件,将第二行的<code>&lt;span class=&quot;search-icon fa fa-search&quot;&gt;&lt;/span&gt;</code>修改为:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">"search-icon fa fa-search fa-lg"</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span></div></pre></td></tr></table></figure></p>
<p><a href="https://github.com/wuxubj/wuxubj.github.io/blob/hexo/themes/next/source/css/_common/components/third-party/localsearch.styl" target="_blank" rel="external">点此查看</a>我的<code>localsearch.styl</code>文件。<br><a href="https://github.com/wuxubj/wuxubj.github.io/blob/hexo/themes/next/layout/_partials/search/localsearch.swig" target="_blank" rel="external">点此查看</a>我的<code>localsearch.swig</code>文件。</p>
<p>最终效果如图:</p>
<p><img src="http://images.wuxubj.cn/201608/006.jpg" alt="localsearch"></p>
<h3 id="3-4-使用多说"><a href="#3-4-使用多说" class="headerlink" title="3.4 使用多说"></a>3.4 使用多说</h3><p>使用多说需要先到其<a href="http://duoshuo.com/" target="_blank" rel="external">官网</a>注册账户,并创建一个站点,获取你的<code>duoshuo_shortname</code>,如图:</p>
<p><img src="http://images.wuxubj.cn/201608/007.png" alt="duoshuo_shortname"></p>
<blockquote>
<p><strong>添加多说评论</strong></p>
</blockquote>
<p>在<font color="#f00">站点配置文件</font> <code>_config.yml</code>中新增 <code>duoshuo_shortname</code> 字段,值设置成你的 duoshuo_shortname。</p>
<blockquote>
<p><strong>添加多说分享</strong></p>
</blockquote>
<p>在<font color="#f00">站点配置文件</font> <code>_config.yml</code>中添加字段 <code>duoshuo_share</code>, 值为 <code>true</code>。<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># 多说</span></div><div class="line"><span class="attr">duoshuo_shortname:</span> <span class="string">wuxubj</span></div><div class="line"><span class="attr">duoshuo_share:</span> <span class="literal">true</span></div></pre></td></tr></table></figure></p>
<p>多说分享有个小bug,当点击“分享到”会出现“缺少service参数”提示,而且下拉分享按钮有些是undefined,这个bug可以通过在 duoshuo.swig 中引用多说开发版js :embed.unstable.js来修复。修改后的<a href="https://github.com/wuxubj/hexo-theme-next/commit/96c2d5d9938fb233d9a64292e0f729b446c1af0f" target="_blank" rel="external">duoshuo.swig</a>。当然也可以通过删除部分代码,取消更多分享的功能来修复这个bug(我就是这么干的)。<br>最终效果如图:</p>
<p><img src="http://images.wuxubj.cn/201608/008.jpg" alt="多说分享和多说评论"></p>
<blockquote>
<p><strong>添加多说最近访客</strong></p>
</blockquote>
<p>在需要添加最近访客的网页对应的 markdown 文件中添加如下代码:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">&gt;最近访客</div><div class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"ds-recent-visitors"</span> <span class="attr">data-num-items</span>=<span class="string">"28"</span> <span class="attr">data-avatar-size</span>=<span class="string">"42"</span> <span class="attr">id</span>=<span class="string">"ds-recent-visitors"</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></div></pre></td></tr></table></figure></p>
<p>然后到多说后台管理-&gt;设置-&gt;基本设置-&gt;自定义css中添加如下css样式:</p>
<p><div class="codecopy codecopy4"> <figure class="highlight"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy4 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div></pre></td><td class="code"><pre><div class="line">#ds-reset .ds-avatar img,</div><div class="line">#ds-recent-visitors .ds-avatar img &#123;</div><div class="line">width: 54px;</div><div class="line">height: 54px; /*设置图像的长和宽,这里要根据自己的评论框情况更改*/</div><div class="line">border-radius: 27px; /*设置图像圆角效果,在这里我直接设置了超过width/2的像素,即为圆形了*/</div><div class="line">-webkit-border-radius: 27px; /*圆角效果:兼容webkit浏览器*/</div><div class="line">-moz-border-radius: 27px;</div><div class="line">box-shadow: inset 0 -1px 0 #3333sf; /*设置图像阴影效果*/</div><div class="line">-webkit-box-shadow: inset 0 -1px 0 #3333sf;</div><div class="line">-webkit-transition: 0.4s;</div><div class="line">-webkit-transition: -webkit-transform 0.4s ease-out;</div><div class="line">transition: transform 0.4s ease-out; /*变化时间设置为0.4秒(变化动作即为下面的图像旋转360读)*/</div><div class="line">-moz-transition: -moz-transform 0.4s ease-out;</div><div class="line">&#125;</div><div class="line"></div><div class="line">#ds-reset .ds-avatar img:hover,</div><div class="line">#ds-recent-visitors .ds-avatar img:hover &#123;</div><div class="line"></div><div class="line">/*设置鼠标悬浮在头像时的CSS样式*/ box-shadow: 0 0 10px #fff;</div><div class="line">rgba(255, 255, 255, .6), inset 0 0 20px rgba(255, 255, 255, 1);</div><div class="line">-webkit-box-shadow: 0 0 10px #fff;</div><div class="line">rgba(255, 255, 255, .6), inset 0 0 20px rgba(255, 255, 255, 1);</div><div class="line">transform: rotateZ(360deg); /*图像旋转360度*/</div><div class="line">-webkit-transform: rotateZ(360deg);</div><div class="line">-moz-transform: rotateZ(360deg);</div><div class="line">&#125;</div><div class="line">/*</div><div class="line">#ds-thread #ds-reset .ds-textarea-wrapper textarea &#123;</div><div class="line">background: url(http://www.wuxubj.cn/images/duoshuo_bkground.jpg) right no-repeat;</div><div class="line">&#125;</div><div class="line">*/</div><div class="line">#ds-recent-visitors .ds-avatar &#123;</div><div class="line">float: left</div><div class="line">&#125;</div><div class="line">/*隐藏多说底部版权*/</div><div class="line">#ds-thread #ds-reset .ds-powered-by &#123;</div><div class="line">display: none;</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p>效果如图:</p>
<p><img src="http://images.wuxubj.cn/201608/009.jpg" alt="多说最近访客"></p>
<h3 id="3-5-添加cnzz站长统计"><a href="#3-5-添加cnzz站长统计" class="headerlink" title="3.5 添加cnzz站长统计"></a>3.5 添加cnzz站长统计</h3><blockquote>
<p><strong>添加站长统计</strong></p>
</blockquote>
<p>到<a href="https://i.umeng.com/signup?spm=0.0.0.0.ma5nae" target="_blank" rel="external">友盟+</a>注册账户,并添加自己的网站域名,获取到一个站点ID,这个ID可以在地址栏里,或者自动生成的脚本里面找到。<br>在<font color="#f00">主题配置文件</font> <code>_config.yml</code>中添加如下字段:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># CNZZ count</span></div><div class="line"><span class="attr">cnzz_siteid:</span> <span class="number">1259784696</span></div></pre></td></tr></table></figure></p>
<p>注意把字段<code>cnzz_siteid</code>的值修改为你自己的站点ID。<br>修改<code>themes\next\layout\_layout.swig</code>文件,添加如下内容,用于生成cnzz统计代码:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="string">&#123;%</span> <span class="string">include</span> <span class="string">'_scripts/third-party/analytics/cnzz-analytics.swig'</span> <span class="string">%&#125;</span></div></pre></td></tr></table></figure></p>
<p>至此cnzz站长统计功能已经添加。<font color="#f00">由于默认默认不显示“站长统计”字样,所以从页面外观看不到任何变化。</font></p>
<blockquote>
<p><strong>页脚添加“站长统计”链接</strong></p>
</blockquote>
<p>修改<code>\themes\next\layout\_partials\footer.swig</code>文件,在<code>&lt;span class=&quot;author&quot; itemprop=&quot;copyrightHolder&quot;&gt;{{ config.author }}&lt;/span&gt;</code>后面添加如下代码:</p>
<p><div class="codecopy codecopy5"> <figure class="highlight html"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy5 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">&#123;% if theme.cnzz_siteid %&#125;</div><div class="line"> <span class="tag">&lt;<span class="name">span</span> <span class="attr">style</span>=<span class="string">"margin-left:8px;"</span>&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"http://s6.cnzz.com/stat.php?id=&#123;&#123; theme.cnzz_siteid &#125;&#125;&amp;web_id=&#123;&#123; theme.cnzz_siteid &#125;&#125;"</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></div><div class="line"> <span class="tag">&lt;/<span class="name">span</span>&gt;</span></div><div class="line">&#123;% endif %&#125;</div></pre></td></tr></table></figure></div></p>
<p>最终效果如图:</p>
<p><img src="http://images.wuxubj.cn/201608/010.jpg" alt="cnzz"></p>
<h3 id="3-6-设置404页面"><a href="#3-6-设置404页面" class="headerlink" title="3.6 设置404页面"></a>3.6 设置404页面</h3><p>刚开始使用腾讯404公益页面,但是移动端适配不好,遂弃之。我现在的<a href="/404.html">404页面</a>对应的markdown文件内容为:</p>
<p><div class="codecopy codecopy6"> <figure class="highlight markdown"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy6 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">---</div><div class="line">title: 404-找不到页面</div><div class="line">date: 2016-05-21 18:53:59</div><div class="line">comments: false</div><div class="line"><span class="section">permalink: /404</span></div><div class="line">---</div><div class="line"></div><div class="line"></div><div class="line"><span class="section">&lt;center&gt;404 Not Found&lt;center&gt;</span></div><div class="line">-------</div><div class="line"><span class="xml"><span class="tag">&lt;<span class="name">center</span>&gt;</span></span><span class="strong">**对不起,您所访问的页面不存在或者已删除**</span></div><div class="line">你可以<span class="strong">**[点击此处](http://www.wuxubj.cn)**</span>返回首页。</div><div class="line">你也可以<span class="xml"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">"#"</span> <span class="attr">class</span>=<span class="string">"popup-trigger"</span>&gt;</span></span><span class="strong">**点击此处**</span><span class="xml"><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span>重新搜索结果。<span class="xml"><span class="tag">&lt;/<span class="name">center</span>&gt;</span></span></div><div class="line">![<span class="string">网站二维码</span>](<span class="link">/images/wuxubj_mini.png</span>)<span class="xml"><span class="tag">&lt;<span class="name">center</span>&gt;</span></span>扫一扫,用手机访问本站<span class="xml"><span class="tag">&lt;<span class="name">center</span>&gt;</span></span></div></pre></td></tr></table></figure></div></p>
<p>效果如下图所示:</p>
<p><img src="http://images.wuxubj.cn/201608/011.jpg" alt="404页面"></p>
<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><p>学生党推荐参加腾讯云<a href="https://www.qcloud.com/act/campus" target="_blank" rel="external">云+校园</a>优惠活动,云主机+CN域名只需1元/月。<br>工作党建议花钱购买云主机,个人博客选择最便宜的就行,一年几百元人民币。</p>
<h3 id="4-2-Git托管的Pages服务"><a href="#4-2-Git托管的Pages服务" class="headerlink" title="4.2 Git托管的Pages服务"></a>4.2 Git托管的Pages服务</h3><p>常用的有<a href="https://pages.github.com/" target="_blank" rel="external">GitHub pages</a>和<a href="https://coding.net/" target="_blank" rel="external">Coding Pages</a>。<br>GitHub pages 的使用教程参见:<a href="http://crazymilk.github.io/2015/12/28/GitHub-Pages-Hexo搭建博客/" target="_blank" rel="external">GitHub Pages + Hexo搭建博客</a> <a href="http://lovenight.github.io/2015/11/10/Hexo-3-1-1-静态博客搭建指南/" target="_blank" rel="external">Hexo 3.1.1 静态博客搭建指南</a><br>Coding Pages 的使用教程参见:<a href="http://www.jianshu.com/p/7ad9d3cd4d6e" target="_blank" rel="external">将hexo博客同时托管到github和coding</a></p>
<p>我刚开始建站的时候使用的是<code>GitHub pages</code>,后来也部署到了<code>Coding</code>,但访问速度都不咋令人满意。最后我选择了腾讯云主机,顿时感觉访问速度飞快。</p>
<h2 id="5-NexT主题美化"><a href="#5-NexT主题美化" class="headerlink" title="5. NexT主题美化"></a>5. NexT主题美化</h2><h3 id="5-1-修改导航栏图标"><a href="#5-1-修改导航栏图标" class="headerlink" title="5.1 修改导航栏图标"></a>5.1 修改导航栏图标</h3><p>NexT 使用的是 <a href="http://fontawesome.io/" target="_blank" rel="external">Font Awesome</a> 提供的图标, Font Awesome 提供了 600+ 的图标,可以满足绝大的多数的场景,同时无须担心在 Retina 屏幕下 图标模糊的问题。对应的文件在<code>themes\next\source\vendors\font-awesome</code>中。<br>在<a href="http://fontawesome.dashgame.com/" target="_blank" rel="external">http://fontawesome.dashgame.com/</a>中有图标与其名称的对应,用户可根据需要修改图标。我的<code>menu_icons</code>配置为:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="attr">menu_icons:</span></div><div class="line"><span class="attr"> enable:</span> <span class="literal">true</span></div><div class="line"> <span class="comment">#KeyMapsToMenuItemKey: NameOfTheIconFromFontAwesome</span></div><div class="line"><span class="attr"> home:</span> <span class="string">home</span></div><div class="line"><span class="attr"> about:</span> <span class="string">user</span></div><div class="line"><span class="attr"> categories:</span> <span class="string">th</span></div><div class="line"><span class="attr"> tags:</span> <span class="string">tags</span></div><div class="line"><span class="attr"> archives:</span> <span class="string">calendar-check-o</span></div><div class="line"><span class="attr"> commonweal:</span> <span class="string">heartbeat</span></div><div class="line"><span class="attr"> guestbook:</span> <span class="string">envelope</span></div><div class="line"><span class="attr"> mylove:</span> <span class="string">heart</span></div></pre></td></tr></table></figure></p>
<h3 id="5-2-修改文章内链接文本样式"><a href="#5-2-修改文章内链接文本样式" class="headerlink" title="5.2 修改文章内链接文本样式"></a>5.2 修改文章内链接文本样式</h3><p>将链接文本设置为蓝色,鼠标划过时文字颜色加深,并显示下划线。<br>修改文件<code>themes\next\source\css\_common\components\post\post.styl</code>,添加如下css样式,:</p>
<p><div class="codecopy codecopy7"> <figure class="highlight html"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy7 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">.post-body p a&#123;</div><div class="line"> color: #0593d3;</div><div class="line"> border-bottom: none;</div><div class="line"></div><div class="line"> &amp;:hover &#123;</div><div class="line"> color: #0477ab;</div><div class="line"> text-decoration: underline;</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p>选择<code>.post-body</code>是为了不影响标题,选择<code>p</code>是为了不影响首页“阅读全文”的显示样式。</p>
<h3 id="5-3-文章末尾添加“本文结束”标记"><a href="#5-3-文章末尾添加“本文结束”标记" class="headerlink" title="5.3 文章末尾添加“本文结束”标记"></a>5.3 文章末尾添加“本文结束”标记</h3><p><img src="http://images.wuxubj.cn/201608/012.jpg" alt="本文结束标记"></p>
<blockquote>
<p><strong>新建 passage-end-tag.swig 文件</strong></p>
</blockquote>
<p>在路径<code>\themes\next\layout\_macro</code>中添加<code>passage-end-tag.swig</code>文件,其内容为:</p>
<p><div class="codecopy codecopy8"> <figure class="highlight html"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy8 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">&#123;% if theme.passage_end_tag.enabled %&#125;</div><div class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">"text-align:center;color: #ccc;font-size:14px;"</span>&gt;</span></div><div class="line">------ 本文结束 ------<span class="tag">&lt;/<span class="name">div</span>&gt;</span></div><div class="line">&#123;% endif %&#125;</div></pre></td></tr></table></figure></div></p>
<p></p>
<blockquote>
<p><strong>修改 post.swig 文件</strong></p>
</blockquote>
<p>在<code>\themes\next\layout\_macro\post.swig</code>中,<code>post-body</code>之后,<code>post-footer</code>之前添加如下代码:</p>
<p><div class="codecopy codecopy9"> <figure class="highlight yml"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy9 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="string">&lt;div&gt;</span></div><div class="line"> <span class="string">&#123;%</span> <span class="string">if</span> <span class="string">not</span> <span class="string">is_index</span> <span class="string">%&#125;</span></div><div class="line"> <span class="string">&#123;%</span> <span class="string">include</span> <span class="string">'passage-end-tag.swig'</span> <span class="string">%&#125;</span></div><div class="line"> <span class="string">&#123;%</span> <span class="string">endif</span> <span class="string">%&#125;</span></div><div class="line"><span class="string">&lt;/div&gt;</span></div></pre></td></tr></table></figure></div></p>
<p></p>
<blockquote>
<p><strong>在主题配置文件中添加字段</strong></p>
</blockquote>
<p>在<font color="#f00">主题配置文件</font> <code>_config.yml</code>中添加以下字段开启此功能:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># 文章末尾添加“本文结束”标记</span></div><div class="line"><span class="attr">passage_end_tag:</span></div><div class="line"><span class="attr"> enabled:</span> <span class="literal">true</span></div></pre></td></tr></table></figure></p>
<p>完成以上设置之后,在每篇文章之后都会添加“本文结束”标记。<br>该功能简易添加方法参见:<a href="https://github.com/iissnan/hexo-theme-next/issues/1039" target="_blank" rel="external">Issues of hexo-theme-next</a></p>
<h3 id="5-4-文章末尾添加网站二维码"><a href="#5-4-文章末尾添加网站二维码" class="headerlink" title="5.4 文章末尾添加网站二维码"></a>5.4 文章末尾添加网站二维码</h3><p>利用 NexT 主题自带的<code>wechat_subscriber</code>功能在文章末尾添加网站二维码。<br>首先生成你网站的二维码,放到网站根目录下的<code>images</code>文件夹中,然后修改<font color="#f00">主题配置文件</font> <code>_config.yml</code>,添加如下内容:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># Wechat Subscriber</span></div><div class="line"><span class="attr">wechat_subscriber:</span></div><div class="line"><span class="attr"> enabled:</span> <span class="literal">true</span></div><div class="line"><span class="attr"> qcode:</span> <span class="string">/images/wuxubj.png</span></div><div class="line"><span class="attr"> description:</span> <span class="string">扫一扫,用手机访问本站</span></div></pre></td></tr></table></figure></p>
<p>完成以上设置之后,在每篇文章之后都会添加网站二维码。</p>
<h3 id="5-5-手机端site-subtitle显示优化"><a href="#5-5-手机端site-subtitle显示优化" class="headerlink" title="5.5 手机端site-subtitle显示优化"></a>5.5 手机端site-subtitle显示优化</h3><p>手机端默认显示副标题,个人觉得不太美观,现修改为:默认不显示副标题,显示导航栏的同时显示副标题。效果如图:<br><img src="http://images.wuxubj.cn/201608/013.gif" alt="site-subtitle"><br>原理:编写JavaScript函数,根据导航栏的<code>display</code>属性来决定是否显示副标题,实现方法如下:</p>
<blockquote>
<p><strong>给导航栏添加id并隐藏site-subtitle</strong></p>
</blockquote>
<p>在<code>themes\next\layout\_partials\header.swig</code>中找到<code>&lt;nav class=&quot;site-nav&quot;&gt;</code>,为其添加id。大概在第29行,将其修改为:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="tag">&lt;<span class="name">nav</span> <span class="attr">class</span>=<span class="string">"site-nav"</span> <span class="attr">id</span>=<span class="string">"site-nav"</span>&gt;</span></div></pre></td></tr></table></figure></p>
<p>设置手机端默认不显示网站副标题。在<code>themes\next\source\css\_common\components\header\site-meta.styl</code>中添加如下样式:</p>
<p><div class="codecopy codecopy11"> <figure class="highlight html"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy11 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">.site-subtitle&#123;</div><div class="line">+mobile() &#123;</div><div class="line"> display: none;</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p></p>
<blockquote>
<p><strong>编写JavaScript函数</strong></p>
</blockquote>
<p><div class="codecopy codecopy10"> <figure class="highlight html"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy10 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></div><div class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/JavaScript"</span>&gt;</span><span class="undefined"></span></div><div class="line">function showSubtitle()</div><div class="line">&#123;</div><div class="line"> var siteNav=document.getElementById("site-nav");</div><div class="line"> if(siteNav.style.display=="block")</div><div class="line"> &#123;</div><div class="line"> var subTitle=document.getElementById("site-subtitle");</div><div class="line"> subTitle.style.display="none";</div><div class="line"> &#125;else</div><div class="line"> &#123;</div><div class="line"> var subTitle=document.getElementById("site-subtitle");</div><div class="line"> subTitle.style.display="block";</div><div class="line"> &#125;</div><div class="line"></div><div class="line">&#125;</div><div class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></div></pre></td></tr></table></figure></div></p>
<p>将其放到任意一个<code>*.swig</code>文件中,在<code>_layout.swig</code>中引入即可。我的处理方法是,在<code>themes\next\layout\_scripts\</code>文件夹中新建<code>myscript</code>文件夹,专门用于存放自己添加的JavaScript代码。在里面创建一个<code>myscript.swig</code>文件,将上述代码copy到里面,再在<code>themes\next\layout\_layout.swig</code>中添加如下代码引入:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="string">&#123;%</span> <span class="string">include</span> <span class="string">'_scripts/myscript/myscript.swig'</span> <span class="string">%&#125;</span></div></pre></td></tr></table></figure></p>
<p><a href="https://github.com/wuxubj/wuxubj.github.io/blob/hexo/themes/next/layout/_layout.swig" target="_blank" rel="external">点击</a>查看我的<code>_layout.swig</code>文件。</p>
<blockquote>
<p><strong>点击网站标题旁边的按钮时触发JavaScript函数</strong></p>
</blockquote>
<p>在<code>themes\next\layout\_partials\header.swig</code>中给<code>&lt;button&gt;&lt;/button&gt;</code>添加 onclick 事件:</p>
<p><div class="codecopy codecopy12"> <figure class="highlight html"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy12 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">"showSubtitle()"</span>&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">"btn-bar"</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">"btn-bar"</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">"btn-bar"</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">button</span>&gt;</span></div></pre></td></tr></table></figure></div></p>
<p><a href="https://github.com/wuxubj/wuxubj.github.io/blob/hexo/themes/next/layout/_partials/header.swig" target="_blank" rel="external">点击</a>查看我的<code>header.swig</code>文件。</p>
<h3 id="5-6-其他美化"><a href="#5-6-其他美化" class="headerlink" title="5.6 其他美化"></a>5.6 其他美化</h3><p>1.标签云页面鼠标划过字体加粗<br>2.文章末尾标签鼠标划过变蓝色<br>3.调换文章末尾上一篇和下一篇链接显示位置(左右互换)<br>4.优化文章末尾上一篇和下一篇链接显示效果</p>
<h2 id="6-SEO推广"><a href="#6-SEO推广" class="headerlink" title="6. SEO推广"></a>6. SEO推广</h2><h3 id="6-1-生成sitemap"><a href="#6-1-生成sitemap" class="headerlink" title="6.1 生成sitemap"></a>6.1 生成sitemap</h3><p>Sitemap用于通知搜索引擎网站上有哪些可供抓取的网页,以便搜索引擎可以更加智能地抓取网站。<br>执行以下命令,安装插件<code>hexo-generator-sitemap</code>,用于生成<code>sitemap</code>:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ npm install hexo-generator-sitemap --save</div></pre></td></tr></table></figure></p>
<p>在<font color="#f00">站点配置文件</font> <code>_config.yml</code>中添加如下字段:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="attr">sitemap:</span></div><div class="line"><span class="attr">path:</span> <span class="string">sitemap.xml</span></div></pre></td></tr></table></figure></p>
<p>执行<code>hexo g</code>,就会在网站根目录生成 sitemap.xml 。</p>
<h3 id="6-2-添加-robots-txt"><a href="#6-2-添加-robots-txt" class="headerlink" title="6.2 添加 robots.txt"></a>6.2 添加 robots.txt</h3><p>网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。robots.txt 通常存放于网站根目录。我的 robots.txt 内容为:</p>
<p><div class="codecopy codecopy13"> <figure class="highlight plain"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy13 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">User-agent: *</div><div class="line">Allow: /</div><div class="line">Allow: /archives/</div><div class="line">Allow: /categories/</div><div class="line">Allow: /tags/</div><div class="line">Allow: /guestbook/</div><div class="line">Allow: /mylove/</div><div class="line">Allow: /weblog/</div><div class="line">Allow: /page/</div><div class="line">Allow: /2016/</div><div class="line"></div><div class="line">Disallow: /vendors/</div><div class="line">Disallow: /js/</div><div class="line">Disallow: /css/</div><div class="line">Disallow: /fonts/</div><div class="line">Disallow: /vendors/</div><div class="line">Disallow: /fancybox/</div><div class="line"></div><div class="line">Sitemap: http://wuxubj.cn/sitemap.xml</div></pre></td></tr></table></figure></div></p>
<p></p>
<h3 id="6-3-开启百度自动推送"><a href="#6-3-开启百度自动推送" class="headerlink" title="6.3 开启百度自动推送"></a>6.3 开启百度自动推送</h3><p>在<font color="#f00">主题配置文件</font> <code>_config.yml</code>中添加如下字段:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="attr">baidu_push:</span> <span class="literal">true</span></div></pre></td></tr></table></figure></p>
<h3 id="6-4-使用各大搜索引擎站长工具"><a href="#6-4-使用各大搜索引擎站长工具" class="headerlink" title="6.4 使用各大搜索引擎站长工具"></a>6.4 使用各大搜索引擎站长工具</h3><p>在搜索引擎搜索框输入<code>site:your.domain</code>可以查看域名是否被该搜索引擎收录,用户可以使用各大搜索引擎站长工具提交个人博客网址。</p>
<h2 id="7-博客维护"><a href="#7-博客维护" class="headerlink" title="7. 博客维护"></a>7. 博客维护</h2><p>后期更新</p>
<h2 id="8-相关资源"><a href="#8-相关资源" class="headerlink" title="8. 相关资源"></a>8. 相关资源</h2><p><a href="https://github.com/wuxubj/wuxubj.github.io" target="_blank" rel="external">我的站点文件备份</a><br><a href="https://github.com/wuxubj/hexo-theme-next-wuxubj/releases" target="_blank" rel="external">优化之后的NexT主题下载</a><br><a href="http://obtvnlw7v.bkt.clouddn.com/hexo-theme-next-5.0.1.zip" target="_blank" rel="external">hexo-theme-next-5.0.1</a><br><a href="http://obtvnlw7v.bkt.clouddn.com/markdownpad2-setup.exe" target="_blank" rel="external">markdownpad2</a><br><a href="http://sw.bos.baidu.com/sw-search-sp/software/22de65944e9/npp_6.9.2_Installer.exe" target="_blank" rel="external">Notepad++ v6.9.2</a><br><a href="http://obtvnlw7v.bkt.clouddn.com/Git-2.8.1-64-bit.exe" target="_blank" rel="external">Git-2.8.1-64-bit</a><br><a href="http://obtvnlw7v.bkt.clouddn.com/node-v4.4.2-x64.msi" target="_blank" rel="external">node-v4.4.2-x64</a></p>
<h2 id="9-参考文献"><a href="#9-参考文献" class="headerlink" title="9. 参考文献"></a>9. 参考文献</h2><p><a href="http://theme-next.iissnan.com/theme-settings.html" target="_blank" rel="external">NexT官方文档</a><br><a href="https://github.com/iissnan/hexo-theme-next/issues" target="_blank" rel="external">Issues of hexo-theme-next</a><br><a href="https://hexo.io/zh-cn/docs/index.html" target="_blank" rel="external">Hexo官方文档</a><br><a href="http://www.w3school.com.cn/" target="_blank" rel="external">w3school</a></p>
]]></content>
<summary type="html">
&lt;p&gt;&lt;img src=&quot;http://images.wuxubj.cn/201608/001.jpg&quot; alt=&quot;Hexo&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;1-Hexo简介&quot;&gt;&lt;a href=&quot;#1-Hexo简介&quot; class=&quot;headerlink&quot; title=&quot;1. Hexo简介&quot;&gt;&lt;/a&gt;1. Hexo简介&lt;/h2&gt;&lt;p&gt;Hexo 是一款基于 Node.js 的静态博客框架。Hexo 使用 Markdown 解析文章,用户在本地安装Hexo并进行写作,通过一条命令,Hexo即可利用靓丽的主题自动生成静态网页。&lt;br&gt;参考:&lt;a href=&quot;https://github.com/hexojs/hexo&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;Hexo Github地址&lt;/a&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://hexo.io/zh-cn/docs/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;Hexo帮助文档&lt;/a&gt;
</summary>
<category term="博客搭建" scheme="http://www.wuxubj.cn/categories/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
<category term="Hexo" scheme="http://www.wuxubj.cn/tags/Hexo/"/>
<category term="NexT" scheme="http://www.wuxubj.cn/tags/NexT/"/>
</entry>
<entry>
<title>《MySQL必知必会》学习笔记</title>
<link href="http://www.wuxubj.cn/2016/07/mysql-learning-notes/"/>
<id>http://www.wuxubj.cn/2016/07/mysql-learning-notes/</id>
<published>2016-07-19T12:56:50.000Z</published>
<updated>2017-05-03T02:55:37.174Z</updated>
<content type="html"><![CDATA[<p><img src="http://images.wuxubj.cn/201607/mysql_title.jpg" alt="mysql"><br><a href="https://book.douban.com/subject/3354490/" target="_blank" rel="external">《MySQL必知必会》</a>是MySQL入门书籍,本文是阅读该书的一些学习笔记,主要记录相关知识要点。<br><a id="more"></a></p>
<h3 id="第三章-使用MySQL"><a href="#第三章-使用MySQL" class="headerlink" title="第三章 使用MySQL"></a>第三章 使用MySQL</h3><div class="codecopy codecopy1"> <figure class="highlight sql"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">msql -u username -p -h myserver -P port //连接数据库</div><div class="line"><span class="keyword">USE</span> database_name //打开数据库</div><div class="line"><span class="keyword">SHOW</span> <span class="keyword">DATABASES</span> //显示可用数据库列表</div><div class="line"><span class="keyword">SHOW</span> <span class="keyword">TABLES</span> //返回数据库中数据表的列表</div><div class="line"><span class="keyword">SHOW</span> <span class="keyword">COLUMNS</span> <span class="keyword">FROM</span> table_name //显示表中字段信息</div><div class="line">自动增量的定义</div></pre></td></tr></table></figure><br><br></div>
<h3 id="第四章-检索数据"><a href="#第四章-检索数据" class="headerlink" title="第四章 检索数据"></a>第四章 检索数据</h3><div class="codecopy codecopy2"> <figure class="highlight sql"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy2 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">SELECT</span> field_name <span class="keyword">FROM</span> table_name;</div><div class="line">//从表中检索选定的列</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> field_name1,field_name2 <span class="keyword">FROM</span> table_name;</div><div class="line">//从表中检索多列</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> * <span class="keyword">FROM</span> table_name;</div><div class="line">//检索表中所有列</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> field_name <span class="keyword">FROM</span> table_name;</div><div class="line">//从表中检索选定的列(消除重复行)</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> field_name <span class="keyword">FROM</span> table_name <span class="keyword">LIMIT</span> <span class="keyword">lines</span>;</div><div class="line">//返回检索结果的前几行</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> field_name <span class="keyword">FROM</span> table_name <span class="keyword">LIMIT</span> strat_pos,<span class="keyword">lines</span>;</div><div class="line">//返回检索结果中,从第strat_pos行开始的lines行</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> products.prod_name <span class="keyword">FROM</span> crashcourse.products;</div><div class="line">//使用完全限定的表名(功能与第一个用法相同)</div></pre></td></tr></table></figure><br><br></div>
<h3 id="第五章-排序检索数据"><a href="#第五章-排序检索数据" class="headerlink" title="第五章 排序检索数据"></a>第五章 排序检索数据</h3><p><div class="codecopy codecopy3"> <figure class="highlight sql"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy3 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">SELECT</span> prod_name <span class="keyword">FROM</span> products </div><div class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> prod_id;</div><div class="line">//对prod_name列,以prod_id的字母顺序排列数据</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> prod_id,prod_price,prod_name</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> prod_prices,prod_name;</div><div class="line">//通过多列数据对结果排序(首先依据prod_prices排序,</div><div class="line">//prod_prices相同时,再依据prod_name排序)</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> prod_id,prod_price,prod_name</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> prod_prices <span class="keyword">DESC</span>,prod_name;</div><div class="line">//以prod_prices降序,prod_name升序排列数据,mysql默认升序排列,</div><div class="line">//如果想同时以prod_name降序排列,需要在prod_name后也加上DESC,</div><div class="line">//因为DESC关键字只应用到直接位于其前面的列名上。</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> prod_price</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> prod_prices <span class="keyword">DESC</span></div><div class="line"><span class="keyword">LIMIT</span> <span class="number">1</span>;</div><div class="line">//找出一个列中最高的值</div></pre></td></tr></table></figure></div></p>
<p><strong>Tips:</strong><br>1.mysql默认升序排列数据<br>2.DESC关键字只应用到直接位于其前面的列名上,根据多列降序,则每列都要加上DESC关键字<br>3.ORDER BY子句必须是SELECT语句中的最后一条子句(一个子句通常由一个<strong>关键字</strong>和所提供的<strong>数据</strong>组成,FROM products是子句,ORDER BY prod_prices也是子句,但DESC和LIMIT&nbsp;1不是子句)。</p>
<h3 id="第六章-过滤数据"><a href="#第六章-过滤数据" class="headerlink" title="第六章 过滤数据"></a>第六章 过滤数据</h3><p><div class="codecopy codecopy4"> <figure class="highlight sql"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy4 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">SELECT</span> prod_name,prod_price</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">WHERE</span> prod_name=<span class="string">'fuses'</span>;</div><div class="line">//返回prod_name的值为Fuses的一行。</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> prod_name,prod_price</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">WHERE</span> prod_price&lt;=<span class="number">10</span>;</div><div class="line">//列出价格小于或等于10美元的所有产品</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> prod_name,prod_price</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">WHERE</span> prod_price <span class="keyword">BETWEEN</span> <span class="number">5</span> <span class="keyword">AND</span> <span class="number">10</span>;</div><div class="line">//检索价格在5美元和10美元之间的所有产品(包括5和10)</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> cust_id</div><div class="line"><span class="keyword">FROM</span> customers</div><div class="line"><span class="keyword">WHERE</span> cust_email <span class="keyword">IS</span> <span class="literal">NULL</span>;</div><div class="line">//返回没有email的顾客id</div></pre></td></tr></table></figure></div></p>
<p><strong>Tips:</strong><br>1.mysql的where子句支持的操作符有=,!=,&lt;,&lt;=,&gt;,&gt;=,BETWEEN<br>2.未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时都不返回它们。</p>
<h3 id="第七章-数据过滤"><a href="#第七章-数据过滤" class="headerlink" title="第七章 数据过滤"></a>第七章 数据过滤</h3><p><div class="codecopy codecopy5"> <figure class="highlight sql"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy5 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">SELECT</span> prod_id,prod_price,prod_name</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">WHERE</span> vend_id=<span class="number">1003</span> <span class="keyword">AND</span> prod_price &lt;=<span class="number">10</span>;</div><div class="line">//检索由供应商1003制造且价格小于等于10美元的所有产品</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> prod_name,prod_price</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">WHERE</span> vend_id=<span class="number">1002</span> <span class="keyword">OR</span> vend_id=<span class="number">1003</span>;</div><div class="line">//检索供应商1002和1003制造的所有产品</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> prod_name,prod_price</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">WHERE</span> (vend_id=<span class="number">1002</span> <span class="keyword">OR</span> vend_id=<span class="number">1003</span>) <span class="keyword">AND</span> prod_price&gt;=<span class="number">10</span>;</div><div class="line">//检索价格为10美元(含)以上且由1002或1003制造的所有产品</div><div class="line">//SQL在处理OR操作符前,优先处理AND操作符,所以上面的括号不能少,</div><div class="line">//否则将得不到想要的结果</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> prod_name,prod_price,vend_id</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">WHERE</span> vend_id <span class="keyword">IN</span>(<span class="number">1002</span>,<span class="number">1003</span>)</div><div class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> prod_name;</div><div class="line">//检索供应商1002和1003制造的所有产品</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> prod_name,prod_price</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">WHERE</span> vend_id <span class="keyword">NOT</span> <span class="keyword">IN</span>(<span class="number">1002</span>,<span class="number">1003</span>)</div><div class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> prod_name;</div><div class="line">//检索1002和1003之外供应商制造的所有产品</div></pre></td></tr></table></figure></div></p>
<p><strong>Tips:</strong><br>1.SQL在处理OR操作符前,优先处理AND操作符,使用()控制优先级<br>2.IN操作符完成与OR相同的功能,但IN操作执行更快,而且IN中还可以包含其他SELECT语句,使得能够更动态地建立WHERE子句<br>3.WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件<br>4.MySQL仅支持使用NOT对IN、BETWEEN和EXISTS子句取反。</p>
<h3 id="第八章-用通配符进行过滤"><a href="#第八章-用通配符进行过滤" class="headerlink" title="第八章 用通配符进行过滤"></a>第八章 用通配符进行过滤</h3><p><div class="codecopy codecopy6"> <figure class="highlight sql"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy6 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">SELECT</span> prod_id,prod_name</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">WHERE</span> prod_name <span class="keyword">LIKE</span> <span class="string">'%anvil%'</span>;</div><div class="line">//匹配任何包含文本anvil的值</div><div class="line"></div><div class="line"><span class="keyword">SELECT</span> prod_id,prod_name</div><div class="line"><span class="keyword">FROM</span> products</div><div class="line"><span class="keyword">WHERE</span> prod_name <span class="keyword">LIKE</span> <span class="string">'_ ton anvil'</span>;</div><div class="line">//_只能匹配一个字符</div></pre></td></tr></table></figure></div></p>
<p><strong>Tips:</strong><br>1.为在搜索子句中使用通配符,必须使用LIKE操作符;<br>2.通配符<code>%</code>可以匹配0个、1个或多个字符,但不能匹配NULL;<br>3.通配符<code>_</code>总是匹配一个字符,不能多也不能少;<br>4.不要过度使用通配符,通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长;<br>5.把通配符置于搜索模式的开始处,搜索起来是最慢的。</p>
<h3 id="第九章-用正则表达式进行搜索"><a href="#第九章-用正则表达式进行搜索" class="headerlink" title="第九章 用正则表达式进行搜索"></a>第九章 用正则表达式进行搜索</h3><p><div class="codecopy codecopy7"> <figure class="highlight"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy7 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div></pre></td><td class="code"><pre><div class="line">SELECT prod_name</div><div class="line">FROM products</div><div class="line">WHERE prod_name LIKE '1000'</div><div class="line">ORDER BY prod_name;</div><div class="line">//匹配完整串1000</div><div class="line"></div><div class="line">SELECT prod_name</div><div class="line">FROM products</div><div class="line">WHERE prod_name REGEXP '1000'</div><div class="line">ORDER BY prod_name;</div><div class="line">//匹配子串1000</div><div class="line"></div><div class="line">SELECT prod_name</div><div class="line">FROM products</div><div class="line">WHERE prod_name REGEXP '.000'</div><div class="line">ORDER BY prod_name;</div><div class="line">//.匹配任意一个字符</div><div class="line"></div><div class="line">SELECT prod_name</div><div class="line">FROM products</div><div class="line">WHERE prod_name REGEXP '1000|2000'</div><div class="line">ORDER BY prod_name;</div><div class="line">// |为正则表达式的OR操作符,它表示匹配其中之一,</div><div class="line">// 因此1000和2000都匹配并返回</div><div class="line"></div><div class="line">SELECT prod_name</div><div class="line">FROM products</div><div class="line">WHERE prod_name REGEXP '[123] Ton';</div><div class="line">//匹配几个字符之一</div><div class="line"></div><div class="line">SELECT prod_name</div><div class="line">FROM products</div><div class="line">WHERE prod_name REGEXP '[^123] Ton';</div><div class="line">//匹配123以外的几个字符之一</div><div class="line"></div><div class="line">SELECT prod_name</div><div class="line">FROM products</div><div class="line">WHERE prod_name REGEXP '[1-5] Ton';</div><div class="line">//匹配范围,常见范围:[1-9],[a-z],[a-zA-Z0-9]</div><div class="line"></div><div class="line">SELECT prod_name</div><div class="line">FROM products</div><div class="line">WHERE prod_name REGEXP '\\([0-9] sticks?\\)';</div><div class="line">// 双斜杠\\为转义字符,sticks?匹配stick和sticks</div><div class="line"></div><div class="line">SELECT prod_name</div><div class="line">FROM products</div><div class="line">WHERE prod_name REGEXP '[[:digit:]]&#123;4&#125;';</div><div class="line">// 匹配连在一起的任意4位数字</div><div class="line">// [:digit:]代表数字集合,&#123;4&#125;要求它前面的字符出现4次</div><div class="line"></div><div class="line">SELECT prod_name</div><div class="line">FROM products</div><div class="line">WHERE prod_name REGEXP '^[0-9\\.]';</div><div class="line">//找出以数字或小数点开始的所有prod_name</div><div class="line">//</div></pre></td></tr></table></figure></div></p>
<p><strong>Tips:</strong><br>1.LIKE和REGEXP的不同在于,LIKE匹配整个串而REGEXP匹配子串;<br>2.MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大小写,可使用BINARY关键字,如<code>WHERE prod_name REGEXP BINARY &#39;JetPack .000&#39;</code>;<br>3.<code>^</code>有两种用法。在集合中(用[和]定义),用它来否定该集合,否则,用来指串的开始处。</p>
<h3 id="第十章-创建计算字段"><a href="#第十章-创建计算字段" class="headerlink" title="第十章 创建计算字段"></a>第十章 创建计算字段</h3><p><div class="codecopy codecopy8"> <figure class="highlight"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy8 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div></pre></td><td class="code"><pre><div class="line">mysql&gt; SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')')</div><div class="line"> -&gt; AS vend_title</div><div class="line"> -&gt; From vendors</div><div class="line"> -&gt; ORDER BY vend_name;</div><div class="line">+------------------------+</div><div class="line">| vend_title |</div><div class="line">+------------------------+</div><div class="line">| ACME(USA) |</div><div class="line">| Anvils R Us(USA) |</div><div class="line">| Furball Inc.(USA) |</div><div class="line">| Jet Set(England) |</div><div class="line">| Jouets Et Ours(France) |</div><div class="line">| LT Supplies(USA) |</div><div class="line">+------------------------+</div><div class="line">//拼接字段并使用别名</div><div class="line"></div><div class="line">mysql&gt; SELECT prod_id,quantity,item_price,</div><div class="line"> -&gt; quantity*item_price AS expanded_price</div><div class="line"> -&gt; FROM orderitems</div><div class="line"> -&gt; Where order_num = 20005;</div><div class="line">+---------+----------+------------+----------------+</div><div class="line">| prod_id | quantity | item_price | expanded_price |</div><div class="line">+---------+----------+------------+----------------+</div><div class="line">| ANV01 | 10 | 5.99 | 59.90 |</div><div class="line">| ANV02 | 3 | 9.99 | 29.97 |</div><div class="line">| TNT2 | 5 | 10.00 | 50.00 |</div><div class="line">| FB | 1 | 10.00 | 10.00 |</div><div class="line">+---------+----------+------------+----------------+</div><div class="line">//执行计算字段</div></pre></td></tr></table></figure></div></p>
<p><strong>Tips:</strong><br>1.Concat()函数用于拼接多个字段;<br>2.RTrim()函数去掉串右边的空格,LTrim()函数去掉串左边的空格,Trim()函数去掉串左右两边的空格;<br>3.AS(alias)关键字,为字段赋予别名。</p>
<h3 id="第十一章-使用数据处理函数"><a href="#第十一章-使用数据处理函数" class="headerlink" title="第十一章 使用数据处理函数"></a>第十一章 使用数据处理函数</h3><p><div class="codecopy codecopy9"> <figure class="highlight"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy9 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div></pre></td><td class="code"><pre><div class="line">mysql&gt; SELECT vend_name,Upper(vend_name) AS vend_name_upcase</div><div class="line"> -&gt; FROM vendors</div><div class="line"> -&gt; ORDER BY vend_name;</div><div class="line">+----------------+------------------+</div><div class="line">| vend_name | vend_name_upcase |</div><div class="line">+----------------+------------------+</div><div class="line">| ACME | ACME |</div><div class="line">| Anvils R Us | ANVILS R US |</div><div class="line">| Furball Inc. | FURBALL INC. |</div><div class="line">| Jet Set | JET SET |</div><div class="line">| Jouets Et Ours | JOUETS ET OURS |</div><div class="line">| LT Supplies | LT SUPPLIES |</div><div class="line">+----------------+------------------+</div><div class="line">//文本处理函数</div><div class="line"></div><div class="line">SELECT cust_id,order_num</div><div class="line">FROM orders</div><div class="line">WHERE Date(order_date)='2005-09-01';</div><div class="line">//日期和事件处理函数</div><div class="line">//检索order_date为2005-09-01的订单记录</div><div class="line"></div><div class="line">SELECT cust_id,order_num</div><div class="line">FROM orders</div><div class="line">WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';</div><div class="line">// 日期和事件处理函数</div><div class="line">// 检索2005年9月下的所有订单</div><div class="line"></div><div class="line">SELECT cust_id,order_num</div><div class="line">FROM orders</div><div class="line">WHERE Year(order_date)=2005 AND Month(order_date)=9;</div><div class="line">// 日期和事件处理函数</div><div class="line">// 检索2005年9月下的所有订单</div></pre></td></tr></table></figure></div></p>
<p><strong>Tips:</strong><br>1.三种数据处理函数:文本处理、日期和时间处理、数值处理。</p>
]]></content>
<summary type="html">
&lt;p&gt;&lt;img src=&quot;http://images.wuxubj.cn/201607/mysql_title.jpg&quot; alt=&quot;mysql&quot;&gt;&lt;br&gt;&lt;a href=&quot;https://book.douban.com/subject/3354490/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;《MySQL必知必会》&lt;/a&gt;是MySQL入门书籍,本文是阅读该书的一些学习笔记,主要记录相关知识要点。&lt;br&gt;
</summary>
<category term="数据库" scheme="http://www.wuxubj.cn/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
<category term="mysql" scheme="http://www.wuxubj.cn/tags/mysql/"/>
</entry>
<entry>
<title>网络资源收藏</title>
<link href="http://www.wuxubj.cn/2016/07/my-favorites/"/>
<id>http://www.wuxubj.cn/2016/07/my-favorites/</id>
<published>2016-07-10T10:58:45.000Z</published>
<updated>2017-05-03T02:55:37.180Z</updated>
<content type="html"><![CDATA[<p>编程资源收藏<br><a id="more"></a></p>
<h3 id="Python爬虫教程"><a href="#Python爬虫教程" class="headerlink" title="Python爬虫教程"></a>Python爬虫教程</h3><p>1.<a href="http://cuiqingcai.com/1052.html" target="_blank" rel="external">Python爬虫学习系列教程</a><br>2.<a href="https://github.com/hhzzer/python/blob/master/qiubai1.0.py" target="_blank" rel="external">奇趣百科爬取代码</a><br>2.<a href="http://www.zhihu.com/question/20899988" target="_blank" rel="external">知乎问答</a><br>4.<a href="http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000" target="_blank" rel="external">廖雪峰Python2.7教程</a></p>
<h3 id="web学习"><a href="#web学习" class="headerlink" title="web学习"></a>web学习</h3><p>1.前端:ajax,jQuery<br>2.后台:php,mysql,LAMP框架<br>3.http通信流程</p>
]]></content>
<summary type="html">
&lt;p&gt;编程资源收藏&lt;br&gt;
</summary>
<category term="收藏夹" scheme="http://www.wuxubj.cn/categories/%E6%94%B6%E8%97%8F%E5%A4%B9/"/>
<category term="收藏夹" scheme="http://www.wuxubj.cn/tags/%E6%94%B6%E8%97%8F%E5%A4%B9/"/>
</entry>
<entry>
<title>查找论文是否被SCI,EI检索及其检索号</title>
<link href="http://www.wuxubj.cn/2016/07/find-sci-or-ei-index/"/>
<id>http://www.wuxubj.cn/2016/07/find-sci-or-ei-index/</id>
<published>2016-07-07T13:11:20.000Z</published>
<updated>2017-05-03T02:55:37.179Z</updated>
<content type="html"><![CDATA[<p>如果查文章是不是被SCI检索:进入<a href="http://apps.webofknowledge.com/WOS_GeneralSearch_input.do?product=WOS&amp;SID=1CMUelst9VWhjRHfzIS&amp;search_mode=GeneralSearch" target="_blank" rel="external">ISI Web of Knowledge</a>,选择<code>Web of Science</code> 数据库,进行查询;<br>如果查文章是不是被EI检索:进入<a href="https://www.engineeringvillage.com/search/quick.url" target="_blank" rel="external">EI Village</a>, 选择<code>Compendex</code> 数据库,进行查询。<br><a id="more"></a></p>
<h2 id="1-查找论文是否被SCI-EI检索"><a href="#1-查找论文是否被SCI-EI检索" class="headerlink" title="1. 查找论文是否被SCI,EI检索"></a>1. 查找论文是否被SCI,EI检索</h2><p><code>SCI(Science Citation Index)</code>是美国科学信息研究所(ISI)建立的科技期刊文献检索系统,被SCI收录的期刊分为核心与外围两个范围。核心部分包括期刊3000多种,涵盖了全世界范围内各学科领域内的最优秀的科技期刊;外围部分包括核心部分在内,有期刊5000多种。外围部分的期刊虽然也是非常优秀的科技期刊,但与核心部分相比,学术水平相对低一些。</p>
<p><code>《SCI光盘版》</code>即SCI核心部分收录的期刊论文,<code>《SCI网络版》</code>即SCI外围部分收录的期刊论文”。SCI 检索我觉得有两种办法,一是直接去Thomson Reuters的网页看它的<a href="http://science.thomsonreuters.com/mjl/" target="_blank" rel="external">期刊列表</a>。直接在search terms下输入想要查询的内容。另外,在网页的下端有收录期刊列表选项注意有<code>Science Citation Index</code> 和 <code>Science Citation Index Expanded</code>(国内习惯称之为核心和扩展)可以更详细的查出关心的期刊是核心还是扩展。 另一种办法是直接查文章是不是被SCI收录。这时是去<a href="http://apps.webofknowledge.com/WOS_GeneralSearch_input.do?product=WOS&amp;SID=1CMUelst9VWhjRHfzIS&amp;search_mode=GeneralSearch" target="_blank" rel="external">ISI Web of Knowledge</a>(是Thomson Reuters的产品之一,国内大学图书馆一般都有入口)这时要注意选择网页上面的Web of Science,而不是All Datebases, 这样搜出来的才是表示被SCI收录的文章。</p>
<p><code>EI检索</code>一般在<a href="https://www.engineeringvillage.com/search/quick.url" target="_blank" rel="external">Engineering Village</a> 上进行查询。一般国内高校都会有图书馆的入口。这里要注意的是一般不选数据库直接进行搜索。在Datebase选项后可能有两个数据库:Compendex(即EI网络版)和Inspec(英国科学文摘)。当你的数据库显示是compendex时,恭喜你,你的文章被EI收录。当你的数据库显示是Inspec时,表示未被EI收录,但是,未被EI收录可能被SCI收录!即Inspec数据库收录的文章虽然可能不是EI检索,但可能是SCI检索!有时候一篇文章会既被inspec,也被compendex收录。</p>
<p>查询的时候,注意在EI数据库里一般是将姓名写全(Qiaokang Liang),而在SCI里姓写全而名只用了第一个字母(Liang QK)。</p>
<p>总结一下:<br>1,如果查文章是不是被SCI检索:进入<a href="http://apps.webofknowledge.com/WOS_GeneralSearch_input.do?product=WOS&amp;SID=1CMUelst9VWhjRHfzIS&amp;search_mode=GeneralSearch" target="_blank" rel="external">ISI Web of Knowledge</a>,选择<code>Web of Science</code> 数据库,进行查询;<br>2,如果查文章是不是被EI检索:进入<a href="https://www.engineeringvillage.com/search/quick.url" target="_blank" rel="external">EI Village</a>, 选择<code>Compendex</code> 数据库,进行查询。</p>
<h2 id="2-查找论文检索号"><a href="#2-查找论文检索号" class="headerlink" title="2. 查找论文检索号"></a>2. 查找论文检索号</h2><p>SCI收录有个<code>IDS号</code>,在文章详情的“其他信息”模块,如图:<br><img src="http://images.wuxubj.cn/images/201607/03.jpg" alt="SCI IDS号"><br>EI收录号查询:在“Search Results”里点击“Detailed”,“Accession number”就是文章收录号,如图:<br><img src="http://images.wuxubj.cn/images/201607/04.jpg" alt="EI Accession number"></p>
<p><strong>参考文献</strong><br><a href="http://blog.sciencenet.cn/blog-722391-608704.html" target="_blank" rel="external">如何查找论文是否被SCI,EI检索</a></p>
]]></content>
<summary type="html">
&lt;p&gt;如果查文章是不是被SCI检索:进入&lt;a href=&quot;http://apps.webofknowledge.com/WOS_GeneralSearch_input.do?product=WOS&amp;amp;SID=1CMUelst9VWhjRHfzIS&amp;amp;search_mode=GeneralSearch&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;ISI Web of Knowledge&lt;/a&gt;,选择&lt;code&gt;Web of Science&lt;/code&gt; 数据库,进行查询;&lt;br&gt;如果查文章是不是被EI检索:进入&lt;a href=&quot;https://www.engineeringvillage.com/search/quick.url&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;EI Village&lt;/a&gt;, 选择&lt;code&gt;Compendex&lt;/code&gt; 数据库,进行查询。&lt;br&gt;
</summary>
<category term="学术论文相关" scheme="http://www.wuxubj.cn/categories/%E5%AD%A6%E6%9C%AF%E8%AE%BA%E6%96%87%E7%9B%B8%E5%85%B3/"/>
<category term="SCI" scheme="http://www.wuxubj.cn/tags/SCI/"/>
<category term="EI" scheme="http://www.wuxubj.cn/tags/EI/"/>
</entry>
<entry>
<title>Hexo+nexT页脚美化</title>
<link href="http://www.wuxubj.cn/2016/07/footer-beautify-of-nexT/"/>
<id>http://www.wuxubj.cn/2016/07/footer-beautify-of-nexT/</id>
<published>2016-07-06T03:27:10.000Z</published>
<updated>2017-05-03T02:55:37.172Z</updated>
<content type="html"><![CDATA[<p><font color="#f00">本文为建站初期小结,查看完整建站教程:</font><a href="/2016/08/Hexo-nexT-build-personal-blog/">Hexo+nexT主题搭建个人博客</a></p>
<blockquote>
<p><code>Next</code>的<code>Mist</code>主题页脚默认<code>左对齐</code>,本文目标:<br>1.实现页脚元素<code>居中对齐</code>;<br>2.页脚添加cnzz站长统计并简单美化</p>
</blockquote>
<a id="more"></a>
<h2 id="1-页脚元素居中"><a href="#1-页脚元素居中" class="headerlink" title="1. 页脚元素居中"></a>1. 页脚元素居中</h2><p>修改<code>your blog\themes\next\source\css\_schemes\Mist\index.styl</code>文件,将<code>.footer-inner</code>中的<code>text-align: left;</code>修改为<code>text-align: center;</code>即可。</p>
<h2 id="2-页脚添加cnzz站长统计"><a href="#2-页脚添加cnzz站长统计" class="headerlink" title="2. 页脚添加cnzz站长统计"></a>2. 页脚添加cnzz站长统计</h2><blockquote>
<p>站点添加cnzz站长统计</p>
</blockquote>
<p>参考:<a href="https://github.com/iissnan/hexo-theme-next/pull/712" target="_blank" rel="external">添加CNZZ数据统计功能的支持(隐藏“站长统计”文字)</a></p>
<blockquote>
<p>修改<code>站长统计</code>显示位置</p>
</blockquote>
<p>修改<code>your blog\themes\next\layout\_partials\footer.swig</code>文件,在<code>&lt;div class=&quot;copyright&quot; &gt;</code>…<code>&lt;/div&gt;</code>中添加如下代码:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">&#123;% if theme.cnzz_siteid %&#125;</div><div class="line"> <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">"site-pv"</span>&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"http://s6.cnzz.com/stat.php?id=&#123;&#123; theme.cnzz_siteid &#125;&#125;&amp;web_id=&#123;&#123; theme.cnzz_siteid &#125;&#125;"</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">span</span>&gt;</span></div><div class="line"> &#123;% endif %&#125;</div></pre></td></tr></table></figure></p>
<p>如图:<br><img src="http://images.wuxubj.cn/images/201607/01.jpg" alt="添加代码"></p>
<h2 id="3-最终效果"><a href="#3-最终效果" class="headerlink" title="3. 最终效果"></a>3. 最终效果</h2><p><img src="http://images.wuxubj.cn/images/201607/02.jpg" alt="最终效果"></p>
]]></content>
<summary type="html">
&lt;p&gt;&lt;font color=&quot;#f00&quot;&gt;本文为建站初期小结,查看完整建站教程:&lt;/font&gt;&lt;a href=&quot;/2016/08/Hexo-nexT-build-personal-blog/&quot;&gt;Hexo+nexT主题搭建个人博客&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Next&lt;/code&gt;&lt;code&gt;Mist&lt;/code&gt;主题页脚默认&lt;code&gt;左对齐&lt;/code&gt;,本文目标:&lt;br&gt;1.实现页脚元素&lt;code&gt;居中对齐&lt;/code&gt;;&lt;br&gt;2.页脚添加cnzz站长统计并简单美化&lt;/p&gt;
&lt;/blockquote&gt;
</summary>
<category term="博客搭建" scheme="http://www.wuxubj.cn/categories/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
<category term="Hexo" scheme="http://www.wuxubj.cn/tags/Hexo/"/>
<category term="NexT" scheme="http://www.wuxubj.cn/tags/NexT/"/>
<category term="页脚美化" scheme="http://www.wuxubj.cn/tags/%E9%A1%B5%E8%84%9A%E7%BE%8E%E5%8C%96/"/>
</entry>
<entry>
<title>非诚勿扰20160702</title>
<link href="http://www.wuxubj.cn/2016/07/feichengwurao-20160702/"/>
<id>http://www.wuxubj.cn/2016/07/feichengwurao-20160702/</id>
<published>2016-07-03T15:20:18.000Z</published>
<updated>2017-05-03T02:55:37.181Z</updated>
<content type="html"><![CDATA[<p>非诚勿扰20160702<br><a id="more"></a></p>
<embed src="http://player.youku.com/player.php/sid/XMTYyOTM1NzY3Ng==/v.swf" allowfullscreen="true" quality="high" width="480" height="400" align="middle" allowscriptaccess="always" type="application/x-shockwave-flash">]]></content>
<summary type="html">
&lt;p&gt;非诚勿扰20160702&lt;br&gt;
</summary>
<category term="生活" scheme="http://www.wuxubj.cn/categories/%E7%94%9F%E6%B4%BB/"/>
<category term="非诚勿扰" scheme="http://www.wuxubj.cn/tags/%E9%9D%9E%E8%AF%9A%E5%8B%BF%E6%89%B0/"/>
</entry>
<entry>
<title>魔方构造问题</title>
<link href="http://www.wuxubj.cn/2016/06/magic-square-generate/"/>
<id>http://www.wuxubj.cn/2016/06/magic-square-generate/</id>
<published>2016-06-30T04:57:05.000Z</published>
<updated>2017-05-03T02:55:37.182Z</updated>
<content type="html"><![CDATA[<p><a href="https://book.douban.com/subject/1886174/" target="_blank" rel="external">《数据结构(C语言版)》</a>学习笔记:<a href="http://wuxubj.cn/2016/06/30/magic-square-generate/" target="_blank" rel="external">魔方构造算法</a>(p23)<br><a id="more"></a></p>
<h2 id="1-魔方产生法则"><a href="#1-魔方产生法则" class="headerlink" title="1. 魔方产生法则"></a>1. 魔方产生法则</h2><p>把1放入第一行最中间的方格中,向左上方移动,并按照数字的递增顺序,把数字填入空方格。如果移出了魔方(即越过了魔方边界),则进入魔方对边的对应方格,继续填写方格。如果一个方格已被填入数字,则向下继续填入方格。</p>
<h2 id="2-魔方构造算法C语言实现"><a href="#2-魔方构造算法C语言实现" class="headerlink" title="2. 魔方构造算法C语言实现"></a>2. 魔方构造算法C语言实现</h2><div class="codecopy codecopy1"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">magic_square</span><span class="params">(<span class="keyword">int</span> square[][MAX_SIZE], <span class="keyword">int</span> size)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">int</span> row, col;</div><div class="line"> <span class="keyword">int</span> i, j, count;</div><div class="line"> <span class="keyword">if</span> (size&lt;<span class="number">1</span> || size&gt;MAX_SIZE)</div><div class="line"> <span class="keyword">return</span> <span class="number">1</span>;</div><div class="line"> <span class="keyword">if</span> (size % <span class="number">2</span> == <span class="number">0</span>)</div><div class="line"> <span class="keyword">return</span> <span class="number">2</span>;</div><div class="line"></div><div class="line"> <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; size; i++) <span class="comment">//魔方每个元素初始化为0</span></div><div class="line"> <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; size; j++)</div><div class="line"> square[i][j] = <span class="number">0</span>;</div><div class="line"> i = <span class="number">0</span>; j = (size - <span class="number">1</span>) / <span class="number">2</span>;</div><div class="line"> square[i][j] = <span class="number">1</span>;<span class="comment">//将1放入第一行最中间的方格中</span></div><div class="line"> <span class="keyword">for</span> (count = <span class="number">2</span>; count &lt;= size*size; count++)<span class="comment">//依次放入2,3,...,size*size</span></div><div class="line"> &#123;</div><div class="line"> row = (i - <span class="number">1</span> &gt;= <span class="number">0</span>) ? (i - <span class="number">1</span>) : (size - <span class="number">1</span>);<span class="comment">//寻找下一个位置</span></div><div class="line"> col = (j - <span class="number">1</span> &gt;= <span class="number">0</span>) ? (j - <span class="number">1</span>) : (size - <span class="number">1</span>);</div><div class="line"> <span class="keyword">if</span> (square[row][col])<span class="comment">//下一个位置已被填入数字</span></div><div class="line"> i = (++i) % size;<span class="comment">//数字填写到下一个位置之前一个位置的正下方</span></div><div class="line"> <span class="keyword">else</span> <span class="comment">//下一个位置没有被填入数字</span></div><div class="line"> &#123;</div><div class="line"> i = row; <span class="comment">//数字填写到下一个位置</span></div><div class="line"> j = col;</div><div class="line"> &#125;</div><div class="line"> square[i][j] = count;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>
<h2 id="3-i,j与row,col的作用分析"><a href="#3-i,j与row,col的作用分析" class="headerlink" title="3. i,j与row,col的作用分析"></a>3. <code>i,j</code>与<code>row,col</code>的作用分析</h2><h2 id="4-测试主函数"><a href="#4-测试主函数" class="headerlink" title="4. 测试主函数"></a>4. 测试主函数</h2><div class="codecopy codecopy2"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy2 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdio.h&gt;</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdlib.h&gt;</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_SIZE 15</span></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">magic_square</span><span class="params">(<span class="keyword">int</span> square[][MAX_SIZE], <span class="keyword">int</span> size)</span></span>;</div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">print_square</span><span class="params">(<span class="keyword">int</span> square[][MAX_SIZE], <span class="keyword">int</span> size)</span></span>;</div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">int</span> square[MAX_SIZE][MAX_SIZE];</div><div class="line"> <span class="keyword">int</span> size;</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"Enter the size of the square:"</span>);</div><div class="line"> scanf_s(<span class="string">"%d"</span>, &amp;size);</div><div class="line"> <span class="keyword">int</span> flag=magic_square(square, size);</div><div class="line"> <span class="keyword">if</span> (flag == <span class="number">1</span>)</div><div class="line"> <span class="built_in">fprintf</span>(<span class="built_in">stderr</span>, <span class="string">"Error! Size is out of range.\n"</span>);</div><div class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (flag==<span class="number">2</span>)</div><div class="line"> <span class="built_in">fprintf</span>(<span class="built_in">stderr</span>, <span class="string">"Error! Size is even.\n"</span>);</div><div class="line"> <span class="keyword">else</span>&#123;</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"Magic Square of size %d :\n\n"</span>, size);</div><div class="line"> print_square(square, size);</div><div class="line"> &#125;</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"\n"</span>);</div><div class="line"> system(<span class="string">"pause"</span>);</div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">print_square</span><span class="params">(<span class="keyword">int</span> square[][MAX_SIZE], <span class="keyword">int</span> size)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; size; i++)</div><div class="line"> &#123;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; size; j++)</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"%5d"</span>, square[i][j]);</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"\n"</span>);</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>]]></content>
<summary type="html">
&lt;p&gt;&lt;a href=&quot;https://book.douban.com/subject/1886174/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;《数据结构(C语言版)》&lt;/a&gt;学习笔记:&lt;a href=&quot;http://wuxubj.cn/2016/06/30/magic-square-generate/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;魔方构造算法&lt;/a&gt;(p23)&lt;br&gt;
</summary>
<category term="算法与数据结构" scheme="http://www.wuxubj.cn/categories/%E7%AE%97%E6%B3%95%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="算法" scheme="http://www.wuxubj.cn/tags/%E7%AE%97%E6%B3%95/"/>
<category term="魔方构造" scheme="http://www.wuxubj.cn/tags/%E9%AD%94%E6%96%B9%E6%9E%84%E9%80%A0/"/>
</entry>
<entry>
<title>递归产生全排列</title>
<link href="http://www.wuxubj.cn/2016/06/recursive-permutations/"/>
<id>http://www.wuxubj.cn/2016/06/recursive-permutations/</id>
<published>2016-06-29T03:19:29.000Z</published>
<updated>2017-05-03T02:55:37.181Z</updated>
<content type="html"><![CDATA[<p><a href="https://book.douban.com/subject/1886174/" target="_blank" rel="external">《数据结构(C语言版)》</a>学习笔记:<a href="http://wuxubj.cn/2016/06/29/recursive-permutations/" target="_blank" rel="external">递归的全排列产生算法</a>(p8)<br><a id="more"></a></p>
<h2 id="1-算法C语言实现"><a href="#1-算法C语言实现" class="headerlink" title="1. 算法C语言实现"></a>1. 算法C语言实现</h2><div class="codecopy codecopy1"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">perm</span><span class="params">(<span class="keyword">char</span> *<span class="built_in">list</span>, <span class="keyword">int</span> begin, <span class="keyword">int</span> end)</span></span></div><div class="line"><span class="comment">/* 功能:实现字符全排列</span></div><div class="line">/* 参数:</div><div class="line">/* list--字符数组,存放需要全排列的元素</div><div class="line">/* begin --查找一个排列的开始位置</div><div class="line">/* end --查找一个排列的结束位置,当begin=end时,表明完成一个排列</div><div class="line">*/</div><div class="line">&#123;</div><div class="line"> <span class="keyword">if</span> (begin == end)<span class="comment">//递归到只有一个数,成功找到一个排列</span></div><div class="line"> &#123;</div><div class="line"> print(<span class="built_in">list</span>, end);<span class="comment">//输出一个全排列</span></div><div class="line"> <span class="built_in">printf</span>(<span class="string">"\t"</span>);</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">else</span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = begin; i &lt;= end; i++)<span class="comment">//从begin到end依次选取排列首元素</span></div><div class="line"> &#123;</div><div class="line"> swap(<span class="built_in">list</span>+i, <span class="built_in">list</span>+begin);<span class="comment">//将list[i]与list[begin]交换,即设置为排列首元素</span></div><div class="line"> perm(<span class="built_in">list</span>, begin + <span class="number">1</span>, end);<span class="comment">//递归查找第一个元素之后所有元素的全排列</span></div><div class="line"> swap(<span class="built_in">list</span> + i, <span class="built_in">list</span> + begin);<span class="comment">//完成一次循环之后恢复现场,以保证循环依次遍历不同元素</span></div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">print</span><span class="params">(<span class="keyword">char</span> *<span class="built_in">list</span>, <span class="keyword">int</span> n)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt;= n; i++)</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"%c"</span>, <span class="built_in">list</span>[i]);</div><div class="line">&#125;</div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(<span class="keyword">char</span> *a, <span class="keyword">char</span> *b)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">int</span> temp;</div><div class="line"> temp = *a;</div><div class="line"> *a = *b;</div><div class="line"> *b = temp;</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>
<h2 id="2-为什么会有2次交换数据"><a href="#2-为什么会有2次交换数据" class="headerlink" title="2. 为什么会有2次交换数据"></a>2. 为什么会有2次交换数据</h2><p>第一次交换是为了将<code>list[i]</code>设置为排列首元素,第二次交换是为了恢复第一次交换之前的状态,以保证循环依次遍历不同元素。<br>以序列<code>{a, b, c, d}</code>为例,循环并交换<code>list[i]</code>与<code>list[begin]</code>,使<code>a,b,c,d</code>依次为首元素;<br>以<code>a</code>为首元素,<code>list[0]</code>与<code>list[0]</code>交换,顺序不变;<br>以<code>b</code>为首元素,<code>list[1]</code>与<code>list[0]</code>交换,顺序变为<code>{b,a,c,d}</code>,第一个元素选定之后,对<code>{a,c,d}</code>递归执行全排列,执行完成之后,下一次循环之前,需要将<code>list[1]</code>与<code>list[0]</code>再次交换,以恢复到<code>{a, b, c, d}</code>的顺序,这样,下次循环,再交换<code>list[2]</code>与<code>list[0]</code>,才能使得字符<code>c</code>为首元素;<br>同理可以分析以<code>c</code>和<code>d</code>为首元素的情况。</p>
<h2 id="3-测试主函数"><a href="#3-测试主函数" class="headerlink" title="3. 测试主函数"></a>3. 测试主函数</h2><div class="codecopy codecopy2"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy2 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdio.h&gt;</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdlib.h&gt;</span></span></div><div class="line"></div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">perm</span><span class="params">(<span class="keyword">char</span> *<span class="built_in">list</span>, <span class="keyword">int</span> begin, <span class="keyword">int</span> end)</span></span>;</div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">print</span><span class="params">(<span class="keyword">char</span> *<span class="built_in">list</span>, <span class="keyword">int</span> n)</span></span>;</div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(<span class="keyword">char</span> *a, <span class="keyword">char</span> *b)</span></span>;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">char</span> <span class="built_in">list</span>[<span class="number">4</span>] = &#123; <span class="string">'a'</span>, <span class="string">'b'</span>, <span class="string">'c'</span>, <span class="string">'d'</span> &#125;;</div><div class="line"> perm(<span class="built_in">list</span>, <span class="number">0</span>, <span class="number">3</span>);</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"\n"</span>);</div><div class="line"> system(<span class="string">"pause"</span>);</div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>]]></content>
<summary type="html">
&lt;p&gt;&lt;a href=&quot;https://book.douban.com/subject/1886174/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;《数据结构(C语言版)》&lt;/a&gt;学习笔记:&lt;a href=&quot;http://wuxubj.cn/2016/06/29/recursive-permutations/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;递归的全排列产生算法&lt;/a&gt;(p8)&lt;br&gt;
</summary>
<category term="算法与数据结构" scheme="http://www.wuxubj.cn/categories/%E7%AE%97%E6%B3%95%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="算法" scheme="http://www.wuxubj.cn/tags/%E7%AE%97%E6%B3%95/"/>
<category term="递归" scheme="http://www.wuxubj.cn/tags/%E9%80%92%E5%BD%92/"/>
<category term="全排列" scheme="http://www.wuxubj.cn/tags/%E5%85%A8%E6%8E%92%E5%88%97/"/>
</entry>
<entry>
<title>折半查找</title>
<link href="http://www.wuxubj.cn/2016/06/binary-search/"/>
<id>http://www.wuxubj.cn/2016/06/binary-search/</id>
<published>2016-06-28T13:57:52.000Z</published>
<updated>2017-05-03T02:55:37.179Z</updated>
<content type="html"><![CDATA[<p><a href="https://book.douban.com/subject/1886174/" target="_blank" rel="external">《数据结构(C语言版)》</a>学习笔记:<a href="http://wuxubj.cn/2016/06/28/binary-search/" target="_blank" rel="external">折半查找算法</a>(p5)<br><a id="more"></a></p>
<h2 id="1-折半查找算法C语言实现"><a href="#1-折半查找算法C语言实现" class="headerlink" title="1. 折半查找算法C语言实现"></a>1. 折半查找算法C语言实现</h2><div class="codecopy codecopy1"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//折半查找算法</span></div><div class="line"><span class="comment">//特别注意switch中的break不能漏掉</span></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">binsearch</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[], <span class="keyword">int</span> searchnum, <span class="keyword">int</span> left, <span class="keyword">int</span> right)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">int</span> midnum;</div><div class="line"> <span class="keyword">while</span> (left &lt;= right)</div><div class="line"> &#123;</div><div class="line"> midnum = (left + right) / <span class="number">2</span>;</div><div class="line"> <span class="keyword">switch</span> (compare(<span class="built_in">list</span>[midnum], searchnum))</div><div class="line"> &#123;</div><div class="line"> <span class="keyword">case</span> <span class="number">-1</span>:left = midnum + <span class="number">1</span>;</div><div class="line"> <span class="keyword">break</span>;<span class="comment">//注意:break不能掉</span></div><div class="line"> <span class="keyword">case</span> <span class="number">0</span>:<span class="keyword">return</span> midnum;</div><div class="line"> <span class="keyword">case</span> <span class="number">1</span>:right = midnum - <span class="number">1</span>;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">compare</span><span class="params">(<span class="keyword">int</span> a, <span class="keyword">int</span> b)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">if</span> (a&gt;b) <span class="keyword">return</span> <span class="number">1</span>;</div><div class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (a == b) <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line"> <span class="keyword">else</span> <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>
<h2 id="2-测试主函数"><a href="#2-测试主函数" class="headerlink" title="2. 测试主函数"></a>2. 测试主函数</h2><div class="codecopy codecopy2"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy2 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//测试主函数</span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdio.h&gt;</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdlib.h&gt;</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;math.h&gt;</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_SIZE 1000</span></div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">select_swap</span><span class="params">(<span class="keyword">int</span> *a, <span class="keyword">int</span> *b)</span></span>;<span class="comment">//实现代码见上一篇:选择排序算法</span></div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">sort</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[], <span class="keyword">int</span> n)</span></span>;<span class="comment">//实现代码见上一篇:选择排序算法</span></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">compare</span><span class="params">(<span class="keyword">int</span> a, <span class="keyword">int</span> b)</span></span>;</div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">binsearch</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[], <span class="keyword">int</span> searchnum, <span class="keyword">int</span> left, <span class="keyword">int</span> right)</span></span>;</div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></div><div class="line">&#123; </div><div class="line"> <span class="keyword">int</span> num;</div><div class="line"> <span class="keyword">int</span> <span class="built_in">list</span>[MAX_SIZE];</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"Enter the number of numbers to generate:"</span>);</div><div class="line"> scanf_s(<span class="string">"%d"</span>, &amp;num);</div><div class="line"> <span class="keyword">if</span> (num&lt;<span class="number">1</span> || num&gt;MAX_SIZE)</div><div class="line"> &#123;</div><div class="line"> <span class="built_in">fprintf</span>(<span class="built_in">stderr</span>, <span class="string">"Improper value of n.\n"</span>);</div><div class="line"> <span class="built_in">exit</span>(<span class="number">1</span>);</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; num; i++)</div><div class="line"> &#123;</div><div class="line"> <span class="built_in">list</span>[i] = rand() % <span class="number">1000</span>;</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"%d "</span>, <span class="built_in">list</span>[i]);</div><div class="line"> &#125;</div><div class="line"> sort(<span class="built_in">list</span>, num);</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"\nsorted array:\n"</span>);</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; num; i++)</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"%d "</span>, <span class="built_in">list</span>[i]);</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"\ninput searchnum:"</span>);</div><div class="line"> <span class="keyword">int</span> searchnum;</div><div class="line"> scanf_s(<span class="string">"%d"</span>, &amp;searchnum);</div><div class="line"> <span class="keyword">int</span> indice = binsearch(<span class="built_in">list</span>, searchnum, <span class="number">0</span>, num<span class="number">-1</span>);</div><div class="line"> indice&gt;<span class="number">-1</span> ? <span class="built_in">printf</span>(<span class="string">"%d is in the sorted list:list[%d]=%d\n"</span>, searchnum,indice, searchnum) : <span class="built_in">printf</span>(<span class="string">"%d is not in the sorted list.\n"</span>, searchnum);</div><div class="line"> system(<span class="string">"pause"</span>);</div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>]]></content>
<summary type="html">
&lt;p&gt;&lt;a href=&quot;https://book.douban.com/subject/1886174/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;《数据结构(C语言版)》&lt;/a&gt;学习笔记:&lt;a href=&quot;http://wuxubj.cn/2016/06/28/binary-search/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;折半查找算法&lt;/a&gt;(p5)&lt;br&gt;
</summary>
<category term="算法与数据结构" scheme="http://www.wuxubj.cn/categories/%E7%AE%97%E6%B3%95%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="算法" scheme="http://www.wuxubj.cn/tags/%E7%AE%97%E6%B3%95/"/>
<category term="折半查找" scheme="http://www.wuxubj.cn/tags/%E6%8A%98%E5%8D%8A%E6%9F%A5%E6%89%BE/"/>
</entry>
<entry>
<title>选择排序算法</title>
<link href="http://www.wuxubj.cn/2016/06/select-sort-algorithm/"/>
<id>http://www.wuxubj.cn/2016/06/select-sort-algorithm/</id>
<published>2016-06-28T12:35:56.000Z</published>
<updated>2017-05-03T02:55:37.181Z</updated>
<content type="html"><![CDATA[<p><a href="https://book.douban.com/subject/1886174/" target="_blank" rel="external">《数据结构(C语言版)》</a>学习笔记:<a href="http://wuxubj.cn/2016/06/28/select-sort-algorithm/" target="_blank" rel="external">选择排序算法</a>(p4)<br><a id="more"></a></p>
<h2 id="1-选择排序算法C语言实现"><a href="#1-选择排序算法C语言实现" class="headerlink" title="1. 选择排序算法C语言实现"></a>1. 选择排序算法C语言实现</h2><div class="codecopy codecopy1"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//选择排序算法</span></div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">sort</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[], <span class="keyword">int</span> n)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n - <span class="number">1</span>; i++)</div><div class="line"> &#123;</div><div class="line"> <span class="comment">// int min = i;</span></div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = i + <span class="number">1</span>; j &lt; n;j++)</div><div class="line"> <span class="keyword">if</span> (<span class="built_in">list</span>[j] &lt; <span class="built_in">list</span>[i])</div><div class="line"> <span class="comment">// min = j;</span></div><div class="line"> select_swap(<span class="built_in">list</span>+j, <span class="built_in">list</span>+i);</div><div class="line"> &#125;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">select_swap</span><span class="params">(<span class="keyword">int</span> *a, <span class="keyword">int</span> *b)</span></span></div><div class="line">&#123;</div><div class="line"> <span class="keyword">int</span> temp;</div><div class="line"> temp = *a;</div><div class="line"> *a = *b;</div><div class="line"> *b = temp;</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>
<h2 id="2-测试主函数"><a href="#2-测试主函数" class="headerlink" title="2. 测试主函数"></a>2. 测试主函数</h2><div class="codecopy codecopy2"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy2 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//测试主函数</span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdio.h&gt;</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdlib.h&gt;</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;math.h&gt;</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_SIZE 100</span></div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">select_swap</span><span class="params">(<span class="keyword">int</span> *a, <span class="keyword">int</span> *b)</span></span>;</div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">sort</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[], <span class="keyword">int</span> n)</span></span>;</div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></div><div class="line">&#123; </div><div class="line"> <span class="keyword">int</span> num;</div><div class="line"> <span class="keyword">int</span> <span class="built_in">list</span>[MAX_SIZE];</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"Enter the number of numbers to generate:"</span>);</div><div class="line"> scanf_s(<span class="string">"%d"</span>, &amp;num);</div><div class="line"> <span class="keyword">if</span> (num&lt;<span class="number">1</span> || num&gt;MAX_SIZE)</div><div class="line"> &#123;</div><div class="line"> <span class="built_in">fprintf</span>(<span class="built_in">stderr</span>, <span class="string">"Improper value of n.\n"</span>);</div><div class="line"> <span class="built_in">exit</span>(<span class="number">1</span>);</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; num; i++)</div><div class="line"> &#123;</div><div class="line"> <span class="built_in">list</span>[i] = rand() % <span class="number">1000</span>;</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"%d "</span>, <span class="built_in">list</span>[i]);</div><div class="line"> &#125;</div><div class="line"> sort(<span class="built_in">list</span>, num);</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"\nsorted array:\n"</span>);</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; num; i++)</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"%d "</span>, <span class="built_in">list</span>[i]);</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"\n"</span>);</div><div class="line"> system(<span class="string">"pause"</span>);</div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure><br><br></div>]]></content>
<summary type="html">
&lt;p&gt;&lt;a href=&quot;https://book.douban.com/subject/1886174/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;《数据结构(C语言版)》&lt;/a&gt;学习笔记:&lt;a href=&quot;http://wuxubj.cn/2016/06/28/select-sort-algorithm/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;选择排序算法&lt;/a&gt;(p4)&lt;br&gt;
</summary>
<category term="算法与数据结构" scheme="http://www.wuxubj.cn/categories/%E7%AE%97%E6%B3%95%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="算法" scheme="http://www.wuxubj.cn/tags/%E7%AE%97%E6%B3%95/"/>
<category term="排序" scheme="http://www.wuxubj.cn/tags/%E6%8E%92%E5%BA%8F/"/>
</entry>
<entry>
<title>Matlab线型标记颜色</title>
<link href="http://www.wuxubj.cn/2016/06/matlab-linestyle-marker-color/"/>
<id>http://www.wuxubj.cn/2016/06/matlab-linestyle-marker-color/</id>
<published>2016-06-15T16:00:00.000Z</published>
<updated>2017-05-03T02:55:37.177Z</updated>
<content type="html"><![CDATA[<p>Matlab画图时,线型、标记和颜色的设置。<br><a id="more"></a></p>
<table>
<thead>
<tr>
<th style="text-align:center">线型</th>
<th style="text-align:center">说明</th>
<th style="text-align:center">标记符</th>
<th style="text-align:center">说明</th>
<th style="text-align:center">颜色</th>
<th style="text-align:center">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">线型</td>
<td style="text-align:center">说明</td>
<td style="text-align:center">标记符</td>
<td style="text-align:center">说明</td>
<td style="text-align:center">颜色</td>
<td style="text-align:center">说明</td>
</tr>
<tr>
<td style="text-align:center">-</td>
<td style="text-align:center">实线(默认)</td>
<td style="text-align:center">+</td>
<td style="text-align:center">加号符</td>
<td style="text-align:center">r</td>
<td style="text-align:center">红色</td>
</tr>
<tr>
<td style="text-align:center">- -</td>
<td style="text-align:center">双划线</td>
<td style="text-align:center">o</td>
<td style="text-align:center">空心圆</td>
<td style="text-align:center">g</td>
<td style="text-align:center">绿色</td>
</tr>
<tr>
<td style="text-align:center">:</td>
<td style="text-align:center">虚线</td>
<td style="text-align:center">*</td>
<td style="text-align:center">星号</td>
<td style="text-align:center">b</td>
<td style="text-align:center">蓝色</td>
</tr>
<tr>
<td style="text-align:center">:.</td>
<td style="text-align:center">点划线</td>
<td style="text-align:center">.</td>
<td style="text-align:center">实心圆</td>
<td style="text-align:center">c</td>
<td style="text-align:center">青绿色</td>
</tr>
<tr>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center">x</td>
<td style="text-align:center">叉号符</td>
<td style="text-align:center">m</td>
<td style="text-align:center">洋红色</td>
</tr>
<tr>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center">s</td>
<td style="text-align:center">正方形</td>
<td style="text-align:center">y</td>
<td style="text-align:center">黄色</td>
</tr>
<tr>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center">d</td>
<td style="text-align:center">菱形</td>
<td style="text-align:center">k</td>
<td style="text-align:center">黑色</td>
</tr>
<tr>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center">^</td>
<td style="text-align:center">上三角形</td>
<td style="text-align:center">w</td>
<td style="text-align:center">白色</td>
</tr>
<tr>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center">v</td>
<td style="text-align:center">下三角形</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center">&gt;</td>
<td style="text-align:center">右三角形</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center">&lt;</td>
<td style="text-align:center">左三角形</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center">p</td>
<td style="text-align:center">五角星</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center">h</td>
<td style="text-align:center">六边形</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
</tbody>
</table>
<p>参考:<a href="http://xiangyan0212.blog.163.com/blog/static/2070372542013956220103/" target="_blank" rel="external">matlab 画图plot 标记符大小调整和填充 </a></p>
]]></content>
<summary type="html">
&lt;p&gt;Matlab画图时,线型、标记和颜色的设置。&lt;br&gt;
</summary>
<category term="数据处理基础" scheme="http://www.wuxubj.cn/categories/%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E5%9F%BA%E7%A1%80/"/>
<category term="matlab" scheme="http://www.wuxubj.cn/tags/matlab/"/>
</entry>
<entry>
<title>matlab添加噪声和计算信号信噪比</title>
<link href="http://www.wuxubj.cn/2016/05/matlab-add-noise-calculating-signal-to-noise-ratio/"/>
<id>http://www.wuxubj.cn/2016/05/matlab-add-noise-calculating-signal-to-noise-ratio/</id>
<published>2016-05-26T12:49:23.000Z</published>
<updated>2017-05-03T02:55:37.177Z</updated>
<content type="html"><![CDATA[<p>本文讲述Matlab中计算信号信噪比以及在信号中添加高斯白噪声的方法。<br><a id="more"></a></p>
<h2 id="1-计算信噪比-SNR"><a href="#1-计算信噪比-SNR" class="headerlink" title="1. 计算信噪比(SNR)"></a>1. 计算信噪比(SNR)</h2><blockquote>
<p><strong>计算信号功率</strong></p>
</blockquote>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sigPower = sum(<span class="built_in">abs</span>(sig(:)).^<span class="number">2</span>)/<span class="built_in">length</span>(sig(:))</div></pre></td></tr></table></figure>
<blockquote>
<p><strong>计算信噪比(SNR)</strong></p>
</blockquote>
<figure class="highlight matlab"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">SNR(dB)=<span class="number">10</span>*<span class="built_in">log10</span>(Ps/Pn)</div></pre></td></tr></table></figure>
<blockquote>
<p><strong>相关单位</strong></p>
</blockquote>
<p><strong>分贝(decibel, dB):</strong>分贝(dB)是表示相对功率或幅度电平的标准单位,换句话说,就是我们用来表示两个能量之间的差别的一种表示单位,它不是一个绝对单位。例如,电子系统中将电压、电流、功率等物理量的强弱通称为电平,电平的单位通常就以分贝表示,即事先取一个电压或电流作为参考值(0dB),用待表示的量与参考值之比取对数,再乘以20作为电平的分贝数(功率的电平值改乘10)。<br><strong>分贝瓦(dBW, dB Watt):</strong>指以1W的输出功率为基准时,用分贝来测量的功率放大器的功率值。<br><strong>dBm (dB-milliWatt):</strong>即与1milliWatt(毫瓦)作比较得出的数字。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">0 dBm = 1 mW</div><div class="line">10 dBm = 10 mW</div><div class="line">20 dBm = 100 mW</div></pre></td></tr></table></figure></p>
<h2 id="2-AWGN:在某一信号中加入高斯白噪声"><a href="#2-AWGN:在某一信号中加入高斯白噪声" class="headerlink" title="2. AWGN:在某一信号中加入高斯白噪声"></a>2. AWGN:在某一信号中加入高斯白噪声</h2><p><code>y = awgn(x,SNR)</code> 在信号x中加入高斯白噪声。信噪比SNR以dB为单位。x的强度假定为0dBW。如果x是复数,就加入复噪声。<br><code>y = awgn(x,SNR,SIGPOWER)</code> 如果SIGPOWER是数值,则其代表以dBW为单位的信号强度;如果SIGPOWER为’measured’,则函数将在加入噪声之前测定信号强度。<br><code>y = awgn(x,SNR,SIGPOWER,STATE)</code> 重置RANDN的状态。<br><code>y = awgn(…,POWERTYPE)</code> 指定SNR和SIGPOWER的单位。POWERTYPE可以是’dB’或’linear’。如果POWERTYPE是’dB’,那么SNR以dB为单位,而SIGPOWER以dBW为单位。如果POWERTYPE是’linear’,那么SNR作为比值来度量,而SIGPOWER以瓦特为单位。<br>示例:</p>
<p><div class="codecopy codecopy1"> <figure class="highlight matlab"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div></pre></td><td class="code"><pre><div class="line">close all;clear all;clc</div><div class="line">f=<span class="number">100</span>;</div><div class="line">fs=<span class="number">1000</span>;</div><div class="line">snr=<span class="number">5</span>;</div><div class="line">t=<span class="number">0</span>:<span class="number">1</span>/fs:<span class="number">1</span><span class="number">-1</span>/fs;</div><div class="line">x=<span class="built_in">sin</span>(<span class="number">2</span>*<span class="built_in">pi</span>*f.*t);</div><div class="line">Ps=sum(<span class="built_in">abs</span>(x(:)).^<span class="number">2</span>)/<span class="built_in">length</span>(x(:));<span class="comment">%计算信号功率</span></div><div class="line"></div><div class="line">y1=awgn(x,snr,<span class="string">'measured'</span>,<span class="string">'dB'</span>);<span class="comment">%以分布为单位,此时snr=10*log10(Ps/Pn)</span></div><div class="line">noise=y1-x;</div><div class="line">Pn=sum(<span class="built_in">abs</span>(noise(:)).^<span class="number">2</span>)/<span class="built_in">length</span>(noise(:));</div><div class="line">snr_out1=<span class="number">10</span>*<span class="built_in">log10</span>(Ps/Pn);</div><div class="line"></div><div class="line">y2=awgn(x,snr,<span class="string">'measured'</span>,<span class="string">'linear'</span>);<span class="comment">%用比值度量,此时snr=Ps/Pn</span></div><div class="line">noise=y2-x;</div><div class="line">Pn=sum(<span class="built_in">abs</span>(noise(:)).^<span class="number">2</span>)/<span class="built_in">length</span>(noise(:));</div><div class="line">snr_out2=Ps/Pn;</div><div class="line"></div><div class="line">figure</div><div class="line">subplot(<span class="number">211</span>)</div><div class="line">plot(t,x);</div><div class="line">xlabel(<span class="string">'t'</span>);</div><div class="line">title(<span class="string">'标准正弦信号x'</span>);</div><div class="line">subplot(<span class="number">212</span>);</div><div class="line">plot(t,y1);</div><div class="line">xlabel(<span class="string">'t'</span>);</div><div class="line">title(<span class="string">'加入高斯白噪声后的信号(SNR=5)'</span>);</div></pre></td></tr></table></figure></div></p>
<p>加入的高斯白噪声是随机的,所以<code>snr_out1</code>和<code>snr_out2</code>在<code>snr=5</code>上下波动。波形如图:<br><img src="http://images.wuxubj.cn/images/201605/31.jpg" alt="fig31"><br><strong>参考文献:</strong><br>[1] <a href="http://blog.sina.com.cn/s/blog_758ebadc0100qchy.html" target="_blank" rel="external">matlab中的信噪比</a><br>[2] <a href="http://www.ilovematlab.cn/thread-54155-1-1.html" target="_blank" rel="external">Matlab信号上叠加噪声和信噪比的计算</a></p>
]]></content>
<summary type="html">
&lt;p&gt;本文讲述Matlab中计算信号信噪比以及在信号中添加高斯白噪声的方法。&lt;br&gt;
</summary>
<category term="数据处理基础" scheme="http://www.wuxubj.cn/categories/%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E5%9F%BA%E7%A1%80/"/>
<category term="matlab" scheme="http://www.wuxubj.cn/tags/matlab/"/>
<category term="数据处理" scheme="http://www.wuxubj.cn/tags/%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86/"/>
</entry>
<entry>
<title>Hexo搭建个人博客(进阶篇)</title>
<link href="http://www.wuxubj.cn/2016/05/Hexo-build-personal-blog-advance/"/>
<id>http://www.wuxubj.cn/2016/05/Hexo-build-personal-blog-advance/</id>
<published>2016-05-21T08:01:28.000Z</published>
<updated>2017-05-03T02:55:37.174Z</updated>
<content type="html"><![CDATA[<p><font color="#f00">本文为建站初期小结,查看完整建站教程:</font><a href="/2016/08/Hexo-nexT-build-personal-blog/">Hexo+nexT主题搭建个人博客</a></p>
<p>记录了nexT主题的美化,包括添加分类和标签页、添加swiftype搜索、导航栏美化、添加留言页面及最近访客以及添加404公益页面。<br><a id="more"></a></p>
<h3 id="添加分类和标签页"><a href="#添加分类和标签页" class="headerlink" title="添加分类和标签页"></a>添加分类和标签页</h3><p>1.新建一个页面,命名为<code>categories</code> ,命令如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo new page categories</div></pre></td></tr></table></figure></p>
<p>2.编辑刚新建的页面,将页面的类型设置为<code>categories</code>,主题将自动为这个页面显示所有分类。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">title: 分类</div><div class="line">date: 2014-12-22 12:39:04</div><div class="line"><span class="built_in">type</span>: <span class="string">"categories"</span></div><div class="line">comments: <span class="literal">false</span></div><div class="line">---</div></pre></td></tr></table></figure></p>
<p>3.在菜单中添加链接。编辑主题的 <code>_config.yml</code> ,将<code>menu</code> 中的 <code>categories: /categories</code> 注释去掉,如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">menu:</div><div class="line"> home: /</div><div class="line"> categories: /categories</div><div class="line"> archives: /archives</div><div class="line"> tags: /tags</div></pre></td></tr></table></figure></p>
<p>如果按照以上步骤,分类页面无法正常显示各分类项,请检查相应<code>index.md</code>文件中是否添加了<code>type</code>字段,如果已添加<code>type</code>字段分类仍然无法显示,请检查文章是否存在分类。<br>搬运于<a href="https://github.com/iissnan/hexo-theme-next/wiki/创建分类页面" target="_blank" rel="external">创建分类页面</a><br>同理可以<a href="https://github.com/iissnan/hexo-theme-next/wiki/创建标签云页面" target="_blank" rel="external">添加标签页面</a>。</p>
<h3 id="添加swiftype搜索并自定义搜索框"><a href="#添加swiftype搜索并自定义搜索框" class="headerlink" title="添加swiftype搜索并自定义搜索框"></a>添加swiftype搜索并自定义搜索框</h3><p>1.参考:<a href="http://theme-next.iissnan.com/third-party-services.html#swiftype" target="_blank" rel="external">Swiftype 站内搜索</a> 在导航栏添加搜索按钮。如图:</p>
<p><img src="http://images.wuxubj.cn/images/201605/21.jpg" alt="fig21"></p>
<p>2.添加搜索框。我们希望搜索界面是这样的:</p>
<p><img src="http://images.wuxubj.cn/images/201605/22.jpg" alt="fig22"></p>
<p>具体操作如下:<br>编辑路径<code>\themes\next\source\css\_schemes\Mist</code>下的<code>_search.styl</code>文件,添加如下样式:</p>
<p><div class="codecopy codecopy1"> <figure class="highlight html"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy1 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div></pre></td><td class="code"><pre><div class="line">.site-search &#123;</div><div class="line"> display: block;</div><div class="line"> float: right;</div><div class="line"> margin-top: 8px;</div><div class="line">&#125;</div><div class="line"></div><div class="line">.site-search form &#123;</div><div class="line"> display: block;</div><div class="line"> margin-top: 0em;</div><div class="line">&#125;</div><div class="line"></div><div class="line">.site-search input &#123;</div><div class="line"> padding: 3px;</div><div class="line"> border: none;</div><div class="line"> padding-left: 18px;</div><div class="line"> border-radius: 0;</div><div class="line"> width: 140px;</div><div class="line"> background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iMTZweCIgaWQ9IkxheWVyXzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE2IDE2OyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTYgMTYiIHdpZHRoPSIxNnB4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cGF0aCBkPSJNMTUuNywxNC4zbC0zLjEwNS0zLjEwNUMxMy40NzMsMTAuMDI0LDE0LDguNTc2LDE0LDdjMC0zLjg2Ni0zLjEzNC03LTctN1MwLDMuMTM0LDAsN3MzLjEzNCw3LDcsNyAgYzEuNTc2LDAsMy4wMjQtMC41MjcsNC4xOTQtMS40MDVMMTQuMywxNS43YzAuMTg0LDAuMTg0LDAuMzgsMC4zLDAuNywwLjNjMC41NTMsMCwxLTAuNDQ3LDEtMUMxNiwxNC43ODEsMTUuOTQ2LDE0LjU0NiwxNS43LDE0LjN6ICAgTTIsN2MwLTIuNzYyLDIuMjM4LTUsNS01czUsMi4yMzgsNSw1cy0yLjIzOCw1LTUsNVMyLDkuNzYyLDIsN3oiLz48L3N2Zz4=") no-repeat 0 50%;</div><div class="line"> background-size: 12px 12px;</div><div class="line"> outline: none;</div><div class="line"> border-bottom: 1px solid #999;</div><div class="line"> opacity: 0.5;</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p>编辑路径<code>\themes\next\source\css\_schemes\Mist</code>下的<code>_menu.styl</code>文件,添加如下样式:</p>
<p><div class="codecopy codecopy2"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy2 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">.menu &#123;</div><div class="line"> <span class="keyword">float</span>: left;</div><div class="line"> margin: <span class="number">8</span>px <span class="number">0</span> <span class="number">0</span> <span class="number">20</span>px;</div><div class="line"> padding: <span class="number">0</span> <span class="number">20</span>px;</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p>效果如下图所示:</p>
<p><img src="http://images.wuxubj.cn/images/201605/23.jpg" alt="fig23"></p>
<p>3.去掉导航栏搜索按钮<br>编辑路径<code>\themes\next\layout\_partials</code>下的<code>header.swig</code>文件,去掉红色框内的代码,如图:</p>
<p><img src="http://images.wuxubj.cn/images/201605/24.jpg" alt="fig24"></p>
<p>最终效果为:</p>
<p><img src="http://images.wuxubj.cn/images/201605/25.jpg" alt="fig25"></p>
<h3 id="增大导航栏高度"><a href="#增大导航栏高度" class="headerlink" title="增大导航栏高度"></a>增大导航栏高度</h3><p>编辑路径<code>\themes\next\source\css\_schemes\Mist</code>下的<code>_header.styl</code>文件,修改样式:</p>
<p><div class="codecopy codecopy3"> <figure class="highlight cpp"><figcaption><span><i class="fa fa-clipboard" data-clipboard-target=".codecopy3 .code pre" aria-label="复制成功!" title="点击复制代码"></i></span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">.header-inner &#123;</div><div class="line"> padding: <span class="number">40</span>px <span class="number">0</span>;</div><div class="line"> margin-bottom: <span class="number">80</span>px;</div><div class="line"> clearfix();</div><div class="line">&#125;</div></pre></td></tr></table></figure></div></p>
<p>效果如图:</p>
<p><img src="http://images.wuxubj.cn/images/201605/26.jpg" alt="fig26"></p>
<h3 id="添加留言页面及最近访客"><a href="#添加留言页面及最近访客" class="headerlink" title="添加留言页面及最近访客"></a>添加留言页面及最近访客</h3><p>1.参考:<a href="http://theme-next.iissnan.com/getting-started.html#comment-system-duoshuo" target="_blank" rel="external">多说评论</a>完成基本配置实现多说评论。<br>2.新建留言页面guestbook: <code>hexo new page guestbook</code> ,在主题配置文件<code>_config.yml</code>的<code>menu</code>项中添加<code>guestbook: /guestbook</code>,即:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">menu:</div><div class="line"> home: /</div><div class="line"> categories: /categories</div><div class="line"> #about: /about</div><div class="line"> archives: /archives</div><div class="line"> tags: /tags</div><div class="line"> guestbook: /guestbook</div><div class="line"> #commonweal: /404.html</div></pre></td></tr></table></figure></p>
<p>3.在<code>\themes\next\languages\zh-Hans.yml</code>中<code>menu</code>项中添加<code>guestbook: 留言</code>字段,即:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">menu:</div><div class="line"> home: 首页</div><div class="line"> archives: 归档</div><div class="line"> categories: 分类</div><div class="line"> tags: 标签</div><div class="line"> about: 关于</div><div class="line"> search: 搜索</div><div class="line"> guestbook: 留言</div><div class="line"> commonweal: 公益404</div></pre></td></tr></table></figure></p>
<p>4.编辑<code>yourblog\source\guestbook\index.md</code>文件,添加如下内容:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">&lt;blockquote class=&quot;blockquote-center&quot;&gt;自定义你的签名&lt;/blockquote&gt;</div><div class="line">&lt;br/&gt;</div><div class="line">&gt;最近访客</div><div class="line">&lt;div class=&quot;ds-recent-visitors&quot; data-num-items=&quot;28&quot; data-avatar-size=&quot;42&quot; id=&quot;ds-recent-visitors&quot;&gt;&lt;/div&gt;</div></pre></td></tr></table></figure></p>
<h3 id="添加404公益页面"><a href="#添加404公益页面" class="headerlink" title="添加404公益页面"></a>添加404公益页面</h3><p>1.新建404页面: <code>hexo new page 404</code>。<br>2.打开对应的md文件,添加如下代码:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">&lt;body&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://qzonestyle.gtimg.cn/qzone_v6/lostchild/search_children.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;&lt;/body&gt;</div></pre></td></tr></table></figure></p>
<p>效果如图:<br><img src="http://images.wuxubj.cn/images/201605/27.jpg" alt="fig27"></p>
]]></content>
<summary type="html">
&lt;p&gt;&lt;font color=&quot;#f00&quot;&gt;本文为建站初期小结,查看完整建站教程:&lt;/font&gt;&lt;a href=&quot;/2016/08/Hexo-nexT-build-personal-blog/&quot;&gt;Hexo+nexT主题搭建个人博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;记录了nexT主题的美化,包括添加分类和标签页、添加swiftype搜索、导航栏美化、添加留言页面及最近访客以及添加404公益页面。&lt;br&gt;
</summary>
<category term="博客搭建" scheme="http://www.wuxubj.cn/categories/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
<category term="Hexo" scheme="http://www.wuxubj.cn/tags/Hexo/"/>
<category term="NexT" scheme="http://www.wuxubj.cn/tags/NexT/"/>
</entry>
<entry>
<title>Hexo搭建个人博客(基础篇)</title>
<link href="http://www.wuxubj.cn/2016/05/Hexo-build-personal-blog-basics/"/>
<id>http://www.wuxubj.cn/2016/05/Hexo-build-personal-blog-basics/</id>
<published>2016-05-21T07:20:28.000Z</published>
<updated>2017-05-03T02:55:37.173Z</updated>
<content type="html"><![CDATA[<p><font color="#f00">本文为建站初期小结,查看完整建站教程:</font><a href="/2016/08/Hexo-nexT-build-personal-blog/">Hexo+nexT主题搭建个人博客</a></p>
<p>讲述Hexo的安装,nexT主题的下载及其简单配置。<br><a id="more"></a></p>
<h3 id="安装HEXO"><a href="#安装HEXO" class="headerlink" title="安装HEXO"></a>安装HEXO</h3><p>切换到博客所在目录,运行<code>Git Bash</code>,依次执行以下命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">$ npm install -g hexo-cli</div><div class="line">$ hexo init</div><div class="line">$ npm install</div></pre></td></tr></table></figure></p>
<p>指定博客文件夹的目录如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">├── _config.yml</div><div class="line">├── package.json</div><div class="line">├── scaffolds</div><div class="line">├── <span class="built_in">source</span></div><div class="line">| ├── _drafts</div><div class="line">| └── _posts</div><div class="line">└── themes</div></pre></td></tr></table></figure></p>
<p>运行:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$ hexo g</div><div class="line">$ hexo s</div></pre></td></tr></table></figure></p>
<p>在浏览器中输入:<a href="http://localhost:4000/" target="_blank" rel="external">http://localhost:4000/</a>即可访问本地博客,如下图所示:</p>
<p><img src="http://images.wuxubj.cn/images/201605/11.jpg" alt="fig11"></p>
<p>参考: <a href="https://hexo.io/zh-cn/docs/" target="_blank" rel="external">HEXO官方帮助文档</a></p>
<h3 id="下载NexT主题"><a href="#下载NexT主题" class="headerlink" title="下载NexT主题"></a>下载NexT主题</h3><p>切换到博客所在目录,运行Git Bash,执行以下命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ git <span class="built_in">clone</span> https://github.com/iissnan/hexo-theme-next themes/next</div></pre></td></tr></table></figure></p>
<p>打开站点配置文件<code>_config.yml</code>,将其中的<code>theme: landscape</code>改为<code>theme: next</code>,保存修改,执行<code>hexo g</code>,<code>hexo s</code>,在浏览器中查看本地博客如图:</p>
<p><img src="http://images.wuxubj.cn/images/201605/12.jpg" alt="fig12"></p>
<h3 id="NexT主题简单配置"><a href="#NexT主题简单配置" class="headerlink" title="NexT主题简单配置"></a>NexT主题简单配置</h3><p>根据<a href="http://theme-next.iissnan.com/getting-started.html" target="_blank" rel="external">NexT官方帮助文档</a>,选择scheme为Mist,界面语言为zh-Hans,选择侧栏位置为right,侧栏显示时机为post,添加站点图像,作者昵称,站点描述等基本信息,效果如图:</p>
<p><img src="http://images.wuxubj.cn/images/201605/13.jpg" alt="fig13"></p>
<p>至此,个人博客雏形基本显现,下一步进行优化。</p>
]]></content>
<summary type="html">
&lt;p&gt;&lt;font color=&quot;#f00&quot;&gt;本文为建站初期小结,查看完整建站教程:&lt;/font&gt;&lt;a href=&quot;/2016/08/Hexo-nexT-build-personal-blog/&quot;&gt;Hexo+nexT主题搭建个人博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;讲述Hexo的安装,nexT主题的下载及其简单配置。&lt;br&gt;
</summary>
<category term="博客搭建" scheme="http://www.wuxubj.cn/categories/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
<category term="Hexo" scheme="http://www.wuxubj.cn/tags/Hexo/"/>
<category term="NexT" scheme="http://www.wuxubj.cn/tags/NexT/"/>
</entry>
</feed>