<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[末日前几天]]></title>
  <link href="http://leolovenet.com/atom.xml" rel="self"/>
  <link href="http://leolovenet.com/"/>
  <updated>2015-09-05T15:31:52+08:00</updated>
  <id>http://leolovenet.com/</id>
  <author>
    <name><![CDATA[leolovenet]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[How to Use Xdebug and LLDT to Debug Your PHP Code With Vagrant and PHPStrom]]></title>
    <link href="http://leolovenet.com/blog/2015/01/22/how-to-use-xdebug-and-lldt-to-debug-your-php-code-with-vagrant-and-phpstorm/"/>
    <updated>2015-01-22T17:53:58+08:00</updated>
    <id>http://leolovenet.com/blog/2015/01/22/how-to-use-xdebug-and-lldt-to-debug-your-php-code-with-vagrant-and-phpstorm</id>
    <content type="html"><![CDATA[<h2>主要用到的软件</h2>

<ul>
<li><a href="https://www.jetbrains.com/phpstorm/">PhpStorm</a> PHP 开发 IDE</li>
<li><a href="http://xdebug.org/">Xdebug</a> PHP debug 插件</li>
<li><a href="https://github.com/phacility/xhprof">Xhprof</a> Facebook 出品的 PHP 性能测量插件</li>
<li><a href="https://github.com/leolovenet/LLDT-chrome-plugin">LLDT-chrome-plugin</a> 自己写的一个 Chrome 浏览器插件，集成了<a href="https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc?hl=en">xdebugHelper</a>，并添加了更多的选项。</li>
<li><a href="https://www.vagrantup.com/">Vagrant</a> 一款可以管理 VirtualBox 虚拟机的软件。</li>
<li><a href="https://www.virtualbox.org/">VirtualBox</a> 一款夸平台的虚拟机软件。</li>
<li><a href="http://nginx.org/">Nginx</a> web 服务器软件(运行在虚拟机中)</li>
<li><a href="http://php.net/">PHP-FPM</a> php 运行管理(运行在虚拟机中)</li>
</ul>


<!--more-->


<h2>Vbox &amp; Vagrant 虚拟环境介绍</h2>

<h3>下载地址</h3>

<ul>
<li>Vbox最新版本下载地址 <a href="https://www.virtualbox.org/wiki/Downloads">https://www.virtualbox.org/wiki/Downloads</a></li>
<li>Vagrant最新版本下载地址 <a href="http://downloads.vagrantup.com/">http://downloads.vagrantup.com/</a></li>
</ul>


<p>直接运行安装包进行安装。
安装包里同时包含了卸载脚本，如果想卸载的话，直接运行就可以了。</p>

<h3>相关目录</h3>

<p>在 Mac 平台下：<code>Vbox</code>的虚拟机默认保存路径为<code>~/VirtualBox VMs</code>，<code>Vagrant</code>用户的数据文件保存在<code>~/.vagrant.d</code>目录下面，删除这个目录将删除<code>vagrant</code>的所有<code>box</code>与<code>plugins</code>。</p>

<h3>什么是Box？</h3>

<p>box 就相当于是一个环境，它一般是一个 Vbox 虚拟机的镜像，官方提供了一个基于 Ubuntu 的box。
给vagrant添加一个 Box 的命令, 打开 <code>Terminal</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>vagrant box add Ubuntu12.04 http://files.vagrantup.com/precise32.box
</span><span class='line'>
</span><span class='line'><span class="c"># Ubuntu12.04 的含义是虚拟机的名字.</span>
</span><span class='line'><span class="c"># 上面的命令会下载 http://files.vagrantup.com/precise32.box ,并添加到 ~/.vagrant.d/boxes/Ubuntu12.04 下</span>
</span><span class='line'><span class="c"># 也可以直接将box下载下来，然后添加，需要执行：</span>
</span><span class='line'>vagrant box add Ubuntu12.04 /the/path/for/your/precise32.box
</span><span class='line'>
</span><span class='line'><span class="c">#查看本机安装的 box 列表</span>
</span><span class='line'>vagrant box list
</span></code></pre></td></tr></table></div></figure>


<h3>怎样使用 Vagrant 管理 Vbox 虚拟机</h3>

<ul>
<li><strong>初始化 Vagrant 环境</strong>，下面这个命令会在当前目录下面创建一个 Vagrant 使用的配置文件 Vagrantfile ，里面包含了 Vagrant 启动需要的配置。</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>vagrant init YOUR_BOX_NAME
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><strong>开启 VirtualBox 虚拟机</strong>，下面这个命令，会创建一个新的 VirtualBox 的虚拟机。</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>vagrant up
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><strong>关闭 VirtualBox 虚拟机</strong></li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>vagrant halt
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><strong>挂起 VirtualBox 虚拟机</strong>，下次开机时间很短，非常快，但是占用更多的内存和硬盘空间。</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>vagrant <span class="nb">suspend</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><strong>恢复 VirtualBox 虚拟机</strong>， 将虚拟机恢复到初始状态.</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>vagrant destroy
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><strong>登陆 VirtualBox 虚拟机</strong></li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>vagrant ssh
</span></code></pre></td></tr></table></div></figure>


<p>自己从官网下载一个 box，安装上后，我们开始讲正题。</p>

<h3>启动软件环境</h3>

<p>进入到你 Web 项目的根目录，手工创建<code>Vagrantfile</code>配置文件，或者也可以使用<code>vagrant ini</code>创建后再手工修改，添加了一个用来跟虚拟机通信的独立的 IP。</p>

<p>下面是 Vagrantfile 的内容：</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># -*- mode: ruby -*-</span>
</span><span class='line'><span class="c1"># vi: set ft=ruby :</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Vagrantfile API/syntax version. Don&#39;t touch unless you know what you&#39;re doing!</span>
</span><span class='line'><span class="no">VAGRANTFILE_API_VERSION</span> <span class="o">=</span> <span class="s2">&quot;2&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="no">Vagrant</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="no">VAGRANTFILE_API_VERSION</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
</span><span class='line'>    <span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">box</span> <span class="o">=</span> <span class="s2">&quot;edengdev-CentOS6.4x86_64&quot;</span>
</span><span class='line'>    <span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">network</span> <span class="s2">&quot;private_network&quot;</span><span class="p">,</span> <span class="ss">ip</span><span class="p">:</span> <span class="s2">&quot;192.168.168.168&quot;</span>
</span><span class='line'>    <span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">provider</span> <span class="s2">&quot;virtualbox&quot;</span> <span class="k">do</span> <span class="o">|</span><span class="n">vb</span><span class="o">|</span>
</span><span class='line'>        <span class="n">vb</span><span class="o">.</span><span class="n">customize</span> <span class="o">[</span><span class="s2">&quot;modifyvm&quot;</span><span class="p">,</span> <span class="ss">:id</span><span class="p">,</span> <span class="s2">&quot;--memory&quot;</span><span class="p">,</span> <span class="s2">&quot;1024&quot;</span><span class="o">]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>然后运行下面的命令，开启，并登陆进虚拟机里</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>vagrant up
</span><span class='line'>vagrant ssh
</span><span class='line'>
</span><span class='line'><span class="c">#创建待会需要用的目录</span>
</span><span class='line'>mkdir -p /var/log/php/xdebug/trace_output
</span><span class='line'>mkdir -p /var/log/php/xdebug/profiler_output
</span><span class='line'>mkdir -p /var/log/php/xhprof/xhprof_data
</span><span class='line'>mkdir -p /etc/php/include
</span><span class='line'>
</span><span class='line'><span class="c">#修噶 hosts 文件，这样可以直接访问网址 「http://me.dev」来进行本机开发了。</span>
</span><span class='line'>sudo  <span class="nb">echo</span> <span class="s2">&quot;me.dev 192.168.168.168&quot;</span>  &gt;&gt; /etc/hosts
</span></code></pre></td></tr></table></div></figure>


<p>在虚拟机中安装好<code>Nginx</code>，<code>PHP-FPM</code>，<code>Xdebug</code>，<code>Xhprof</code>，这个过程就不过多的介绍了。</p>

<p>下面是我的 Xdebug 配置文件样例：</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
</pre></td><td class='code'><pre><code class='ini'><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">; xdebug             ;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="k">[xdebug]</span>
</span><span class='line'><span class="c1">; 这里要求必须是绝对路径，不能是相对路径 see:</span>
</span><span class='line'><span class="c1">; http://stackoverflow.com/questions/1758014/whats-the-difference-between-extension-and-zend-extension-in-php-ini</span>
</span><span class='line'><span class="na">zend_extension</span><span class="o">=</span><span class="s">&quot;/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so&quot;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;;;     All API Docs At http://xdebug.org/docs/all_settings     ;;;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'>
</span><span class='line'><span class="na">xdebug.overload_var_dump</span><span class="o">=</span><span class="s">On</span>
</span><span class='line'><span class="c1">; 强制指定显示错误，不管php.ini的设置</span>
</span><span class='line'><span class="na">xdebug.force_display_errors</span><span class="o">=</span><span class="s">On</span>
</span><span class='line'><span class="na">xdebug.force_error_reporting</span><span class="o">=</span><span class="s">On</span>
</span><span class='line'>
</span><span class='line'><span class="c1">; If this setting is 1, then stacktraces will be shown by default on an error event.</span>
</span><span class='line'><span class="c1">; You can disable showing stacktraces from your code with xdebug_disable().</span>
</span><span class='line'><span class="c1">; As this is one of the basic functions of Xdebug, it is advisable to leave this setting set to 1.</span>
</span><span class='line'><span class="na">xdebug.default_enable</span><span class="o">=</span><span class="s">1</span>
</span><span class='line'>
</span><span class='line'><span class="c1">; don&#39;t use coverage function</span>
</span><span class='line'><span class="na">xdebug.coverage_enable</span><span class="o">=</span><span class="s">Off</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;                 Stack Traces                       ;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;       http://xdebug.org/docs/stack_trace           ;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="na">xdebug.collect_params</span><span class="o">=</span><span class="s">3</span>
</span><span class='line'><span class="na">xdebug.collect_return</span><span class="o">=</span><span class="s">Off</span>
</span><span class='line'><span class="c1">; xdebug.collect_vars=On</span>
</span><span class='line'><span class="c1">; xdebug.dump_globals=On</span>
</span><span class='line'><span class="c1">; xdebug.dump.SERVER=&quot;REQUEST_URI&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;            Function Trace                          ;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;     http://xdebug.org/docs/execution_trace         ;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="na">xdebug.auto_trace</span><span class="o">=</span><span class="s">Off</span>
</span><span class='line'><span class="na">xdebug.collect_includes</span><span class="o">=</span><span class="s">On</span>
</span><span class='line'><span class="c1">;显示内存信息,在trace的时候</span>
</span><span class='line'><span class="na">xdebug.show_mem_delta</span><span class="o">=</span><span class="s">On</span>
</span><span class='line'><span class="na">xdebug.trace_enable_trigger</span><span class="o">=</span><span class="s">On</span>
</span><span class='line'><span class="na">xdebug.trace_output_dir</span><span class="o">=</span><span class="s">&quot;/var/log/php/xdebug/trace_output&quot;</span>
</span><span class='line'><span class="c1">;指定trace输出文件的格式, 0 是文本文件，1 计算机可读格式， 2 html格式</span>
</span><span class='line'><span class="na">xdebug.trace_format</span><span class="o">=</span><span class="s">0</span>
</span><span class='line'><span class="c1">;When set to &#39;1&#39; the trace files will be appended to, instead of being overwritten in subsequent requests.</span>
</span><span class='line'><span class="na">xdebug.trace_options</span><span class="o">=</span><span class="s">0</span>
</span><span class='line'><span class="c1">;指定trace输出文件名的格式, %R Meaning $_SERVER[&#39;REQUEST_URI&#39;]</span>
</span><span class='line'><span class="na">xdebug.trace_output_name</span><span class="o">=</span><span class="s">trace.%R</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;            Profiling Script                        ;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;        http://xdebug.org/docs/profiler             ;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="na">xdebug.profiler_enable</span><span class="o">=</span><span class="s">Off</span>
</span><span class='line'><span class="na">xdebug.profiler_output_dir</span><span class="o">=</span><span class="s">&quot;/var/log/php/xdebug/profiler_output&quot;</span>
</span><span class='line'><span class="na">xdebug.profiler_enable_trigger</span><span class="o">=</span><span class="s">On</span>
</span><span class='line'><span class="c1">;profiler文件是追加，还是重写</span>
</span><span class='line'><span class="na">xdebug.profiler_append</span><span class="o">=</span><span class="s">Off</span>
</span><span class='line'><span class="na">xdebug.profiler_output_name</span><span class="o">=</span><span class="s">%R.cachegrind</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;              Remote Debugging                      ;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;;        http://xdebug.org/docs/remote               ;;</span>
</span><span class='line'><span class="c1">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="na">xdebug.remote_handler</span><span class="o">=</span><span class="s">dbgp</span>
</span><span class='line'><span class="na">xdebug.remote_autostart</span><span class="o">=</span><span class="s">Off</span>
</span><span class='line'><span class="na">xdebug.remote_enable</span><span class="o">=</span><span class="s">1</span>
</span><span class='line'><span class="na">xdebug.remote_host</span><span class="o">=</span><span class="s">192.168.192.1</span>
</span><span class='line'><span class="na">xdebug.remote_port</span><span class="o">=</span><span class="s">9000</span>
</span><span class='line'><span class="na">xdebug.remote_mode</span><span class="o">=</span><span class="s">req</span>
</span><span class='line'><span class="c1">;xdebug.remote_log=&quot;&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>下面是我的 Xhprof 的配置样例：</p>

<p>首先，将 <code>Xhprof</code> 自带的 <code>xhprof_html</code>, <code>xhprof_lib</code> 目录放入到 <code>/var/log/php/xhprof/</code> 下。</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ini'><span class='line'><span class="c1">;;;;;;;;;;; add the following configuration to php.ini ;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="na">auto_prepend_file</span> <span class="o">=</span> <span class="s">&quot;/etc/php/include/auto_prepend.php&quot;</span>
</span><span class='line'><span class="na">auto_append_file</span>  <span class="o">=</span> <span class="s">&quot;/etc/php/include/auto_append.php&quot;</span>
</span><span class='line'><span class="c1">; Xhprof Module</span>
</span><span class='line'><span class="k">[xhprof]</span>
</span><span class='line'><span class="na">xhprof.output_dir</span> <span class="o">=</span> <span class="s">/var/log/php/xhprof/xhprof_data</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;;;;;;;;;;; add the following configuration to php-fpm.conf ;;;;;;;;;;;;;;;;;;;;;</span>
</span><span class='line'><span class="c1">;#### for xhprof</span>
</span><span class='line'><span class="na">php_admin_value[extension]</span> <span class="o">=</span> <span class="s">xhprof.so</span>
</span><span class='line'><span class="na">env[XHPROF_ROOT_PATH]</span> <span class="o">=</span> <span class="s">/var/log/php/xhprof</span>
</span><span class='line'><span class="c1"># 采样百分比，多少次访问后性能采样一次</span>
</span><span class='line'><span class="na">env[XHPROF_SAMPLING_PERCENTAGE]</span> <span class="o">=</span> <span class="s">3000</span>
</span></code></pre></td></tr></table></div></figure>


<p>下面是 <code>/etc/php/include/auto_prepend.php</code> 的内容：</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">if</span><span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">&#39;XHPROF_ROOT_PATH&#39;</span><span class="p">])){</span>
</span><span class='line'>    <span class="c1">// start profiling</span>
</span><span class='line'>    <span class="c1">// options: xhprof_enable(  XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY + XHPROF_FLAGS_NO_BUILTINS );</span>
</span><span class='line'>    <span class="nv">$xhprof_on</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>    <span class="c1">//if ($_SERVER[&#39;REQUEST_METHOD&#39;] == &#39;POST&#39;){</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="nb">function_exists</span><span class="p">(</span><span class="s1">&#39;xhprof_enable&#39;</span><span class="p">)</span>  <span class="o">&amp;&amp;</span> <span class="p">(</span> <span class="p">(</span> <span class="nx">mt_rand</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">&#39;XHPROF_SAMPLING_PERCENTAGE&#39;</span><span class="p">])</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">)</span> <span class="o">||</span> <span class="nb">isset</span><span class="p">(</span> <span class="nv">$_REQUEST</span><span class="p">[</span><span class="s1">&#39;XHPROF_PROFILE&#39;</span><span class="p">]</span> <span class="p">)</span> <span class="p">)</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">xhprof_enable</span><span class="p">(</span><span class="nx">XHPROF_FLAGS_NO_BUILTINS</span> <span class="o">+</span> <span class="nx">XHPROF_FLAGS_MEMORY</span><span class="p">);</span>
</span><span class='line'>            <span class="nv">$xhprof_on</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="c1">//}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>下面是 <code>/etc/php/include/auto_append.php</code> 的内容：</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nv">$xhprof_on</span><span class="p">){</span>
</span><span class='line'>    <span class="nv">$xhprof_data</span> <span class="o">=</span> <span class="nx">xhprof_disable</span><span class="p">();</span>
</span><span class='line'>    <span class="k">include_once</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">&#39;XHPROF_ROOT_PATH&#39;</span><span class="p">]</span> <span class="o">.</span> <span class="s2">&quot;/xhprof_lib/utils/xhprof_lib.php&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">include_once</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">&#39;XHPROF_ROOT_PATH&#39;</span><span class="p">]</span> <span class="o">.</span> <span class="s2">&quot;/xhprof_lib/utils/xhprof_runs.php&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nv">$xhprof_runs</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">XHProfRuns_Default</span><span class="p">();</span>
</span><span class='line'>    <span class="nv">$xhporf_script_name</span><span class="o">=</span> <span class="nb">str_replace</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">,</span><span class="s1">&#39;^&#39;</span><span class="p">,</span> <span class="nx">substr</span><span class="p">(</span><span class="nb">str_replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">&#39;SCRIPT_FILENAME&#39;</span><span class="p">]),</span><span class="mi">1</span><span class="p">)</span> <span class="p">);</span>
</span><span class='line'>    <span class="nv">$run_id</span> <span class="o">=</span> <span class="nv">$xhprof_runs</span><span class="o">-&gt;</span><span class="na">save_run</span><span class="p">(</span> <span class="nv">$xhprof_data</span><span class="p">,</span> <span class="nv">$xhporf_script_name</span> <span class="p">,</span> <span class="nb">date</span><span class="p">(</span><span class="s1">&#39;YmdHis&#39;</span><span class="p">)</span><span class="o">.</span><span class="nx">substr</span><span class="p">((</span><span class="nx">string</span><span class="p">)</span><span class="nb">microtime</span><span class="p">(),</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>设置 PhpStorm</h3>

<p>我使用的 IDE 软件为  <a href="https://www.jetbrains.com/phpstorm/">PhpStorm</a>，要配合使用 Vagrant 的话，还需要特殊配置一下。</p>

<h4>1.Create New Project</h4>

<p><img src="http://leolovenet.com/downloads/images/phpstorm-1.jpg" alt="phpstorm-1" /></p>

<h4>2. Edit Configrations&hellip;</h4>

<p>Run > Edit Configrations&hellip; > Defaults > PHP Remote Debug > Servers
<img src="http://leolovenet.com/downloads/images/phpstorm-4.jpg" alt="phpstorm-4" /></p>

<p>因为使用 Vagrant 的缘故，所以调试 PHP 代码的时候，需要配置目录映射。</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="c1"># your/sites/path            --&gt;  /vagrant</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://leolovenet.com/downloads/images/phpstorm-5.jpg" alt="phpstorm-5" /></p>

<h4>3.Debug</h4>

<p>勾选， Run > &ldquo;Break at first line in PHP scripts&rdquo; 后，点击 “Debug &lsquo;xxxxx&rsquo;
<img src="http://leolovenet.com/downloads/images/phpstorm-6.jpg" alt="phpstorm-6" />
<img src="http://leolovenet.com/downloads/images/phpstorm-7.jpg" alt="phpstorm-7" /></p>

<h3>Chrome 浏览器的插件 LLDT</h3>

<p>chrome 安装 LLDT 后，打开你开发的网址<a href="http://me.dev,">http://me.dev,</a> 刷新一下。会看到地址栏的LLDT图标，点击一下，或者按快捷键<code>Ctrl+Shift+X</code>，mac用户为<code>command+Shift+x</code>，调出菜单弹窗。
<img src="http://leolovenet.com/downloads/images/phpstorm-8.png" alt="phpstorm-8" /></p>

<h3>Enable Xdebug debug</h3>

<p>点击<code>Enable Xdebug debug</code>，或者按快捷键 <code>D</code>, 刷新网页。 返回PhpStorm程序，应该已经开启debug了。
<img src="http://leolovenet.com/downloads/images/phpstorm-9.jpg" alt="phpstorm-9" /></p>

<h3>Enable Xdebug Profile</h3>

<p>Xdebug Profile 功能可以对HTTP请求页面对应的脚本性能进行分析，并将分析数据保存到文件中。</p>

<ul>
<li>Mac 用户可以安装 qcachegrind ,来观看Profilling保存的数据文件，<code>brew install qcachegrind</code>。</li>
<li>Windows 用户可以安装 WinCacheGrind, 或者 KCacheGrind, 来观看。</li>
</ul>


<p>找到Chrome浏览器地址栏的LLDT图标，点击一下，或者按快捷键<code>Ctrl+Shift+X</code>，mac用户为<code>command+Shift+x</code>，调出菜单弹窗，点击<code>Enable Xdebug Profile</code>，或者按快捷键 <code>P</code>, 刷新网页就可以了。</p>

<p>Profile 的数据文件存储在了，<code>/var/log/php/xdebug/profiler_output</code> 目录中。
mac下查看分析结果，安装完qcachegrind，将数据文件 copy 出来，打开 <code>Terminal</code>，运行<code>qcachegrind xxxx.cachegrind</code>  命令，查看相应地xxxx数据文件。</p>

<p>例如：
<img src="http://leolovenet.com/downloads/images/phpstorm-10.jpg" alt="phpstorm-10" /></p>

<h3>Enable Xdebug Trace</h3>

<p>Xdebug Trace 功能可以对HTTP请求页面对应的脚本执行过程的函数调用进行记录，并将记录结果保存到文件中。</p>

<p>找到 Chrome 浏览器地址栏的 LLDT 图标，点击一下，或者按快捷键<code>Ctrl+Shift+X</code>，mac用户为<code>command+Shift+x</code>，调出菜单弹窗，点击<code>Enable Xdebug Trace</code>，或者按快捷键 <code>T</code>, 刷新网页就可以了。</p>

<p>保存的数据文件存储在了，<code>/var/log/php/xdebug/trace_output</code> 目录中。
直接可以用你自己喜欢的文本编辑器查看分析结果。</p>

<h3>Enable Xhprof</h3>

<p>Xhprof 为 Facebook 出品的分层PHP性能分析工具。 可以对 PHP脚本的执行进行性能分析。并将记录结果保存到文件中。</p>

<p>找到 Chrome 浏览器地址栏的 LLDT 图标，点击一下，或者按快捷键<code>Ctrl+Shift+X</code>，mac用户为<code>command+Shift+x</code>，调出菜单弹窗，点击<code>Enable Xhprof</code>，或者按快捷键 <code>X</code>, 刷新网页就可以了。</p>

<p>保存的数据文件存储在了，<code>/var/log/php/xhprof/xhprof_data</code> 目录中。
xhprof 的分析结果怎么查看, 自己查看官网的介绍吧。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[配置git使用proxy]]></title>
    <link href="http://leolovenet.com/blog/2014/05/28/git-and-proxy/"/>
    <updated>2014-05-28T09:50:17+08:00</updated>
    <id>http://leolovenet.com/blog/2014/05/28/git-and-proxy</id>
    <content type="html"><![CDATA[<p>Git 目前支持的三种协议  <code>git://</code> <code>ssh://</code>  <code>http://</code> 和 <code>https://</code></p>

<p>其代理配置各不相同.<br/>
  (1) core.gitproxy 用于 <code>git://</code> 协议<br/>
  (2) http.proxy 用于 <code>http://</code> 协议<br/>
  (3) <code>ssh://</code> 协议的代理需要配置 ssh 的 ProxyCommand 参数</p>

<h2>(一) 针对GIT 协议(git://)配置代理</h2>

<p>git 协议配置代理可以有两种方式,但是都是需要安装软件:  <code>socat</code><br/>
(1) Debian/Ubuntu just <code>sudo apt-get install socat</code><br/>
(2) CentOS use yum install  epel source  <code>yum -y install socat</code><br/>
(3) Mac OS: <code>brew install socat</code></p>

<h3>1. Git Through A HTTP Proxy</h3>

<p>让 git 走 HTTP 代理需要创建 <code>gitproxy.sh</code> 脚本,然后赋予可执行权限: 参考的<a href="http://www.emilsit.net/blog/archives/how-to-use-the-git-protocol-through-a-http-connect-proxy/">这个文章</a></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/sh</span>
</span><span class='line'><span class="c"># Use socat to proxy git through an HTTP CONNECT firewall.</span>
</span><span class='line'><span class="c"># Useful if you are trying to clone git:// from inside a company.</span>
</span><span class='line'><span class="c"># Requires that the proxy allows CONNECT to port 9418.</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Save this file as gitproxy somewhere in your path (e.g., ~/bin) and then run</span>
</span><span class='line'><span class="c"># chmod +x gitproxy</span>
</span><span class='line'><span class="c"># git config --global core.gitproxy gitproxy</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># More details at http://tinyurl.com/8xvpny</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Configuration. Common proxy ports are 3128, 8123, 8000.</span>
</span><span class='line'><span class="nv">_proxy</span><span class="o">=</span>proxy.yourcompany.com
</span><span class='line'><span class="nv">_proxyport</span><span class="o">=</span>3128
</span><span class='line'><span class="nv">_proxyauth</span><span class="o">=</span>username:password
</span><span class='line'>
</span><span class='line'><span class="nb">exec </span>socat STDIO PROXY:<span class="k">${</span><span class="nv">_proxy</span><span class="k">}</span>:<span class="nv">$1</span>:<span class="nv">$2</span>,proxyport<span class="o">=</span><span class="k">${</span><span class="nv">_proxyport</span><span class="k">}</span>,proxyauth<span class="o">=</span><span class="k">${</span><span class="nv">_proxyauth</span><span class="k">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>然后配置 git 使用这个代理, 在 <code>~/.gitconfig</code> 文件里写入:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="o">[</span>core<span class="o">]</span>
</span><span class='line'>    <span class="nv">gitproxy</span><span class="o">=</span>gitproxy.sh <span class="k">for </span>github.com
</span><span class='line'>    <span class="c">#man git-config 查看 core.gitproxy 部分,关于 for * 的说明</span>
</span></code></pre></td></tr></table></div></figure>


<h3>2. Git Through A SOCKS Proxy (or SSH Tunnel)</h3>

<p><a href="http://www.aireadfun.com/blog/2013/08/27/using-git-through-a-socks-proxy-or-ssh-tunnel/">参考的这篇文章</a></p>

<p>第一步: 使用 ssh开启一个socks 代理.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>ssh -nNT -D 8119 remote.host
</span><span class='line'><span class="c">#This command starts a SOCKS v4 proxy listening on localhost, port 8119.</span>
</span></code></pre></td></tr></table></div></figure>


<p>第二步: 创建一个新的 <code>gitproxysocks.sh</code> 脚本,并赋予可执行权限.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/sh</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Use socat to proxy git through a SOCKS proxy.</span>
</span><span class='line'><span class="c"># Useful if you are trying to clone git:// from inside a company.</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># See http://tinyurl.com/8xvpny for Emil Sit&#39;s original HTTP proxy script.</span>
</span><span class='line'><span class="c"># See http://tinyurl.com/45atuth for updated SOCKS version.## Configuration.</span>
</span><span class='line'><span class="nv">_proxy</span><span class="o">=</span><span class="nv">localhost_proxyport</span><span class="o">=</span>8119
</span><span class='line'>execsocat STDIO SOCKS4:<span class="nv">$_proxy</span>:<span class="nv">$1</span>:<span class="nv">$2</span>,socksport<span class="o">=</span><span class="nv">$_proxyport</span>
</span></code></pre></td></tr></table></div></figure>


<p>第三步: 配置 git 使用这个脚本,可以像上面那样写入到配置文件 <code>~/.gitconfig</code> 中,也可以配置 <code>GIT_PROXY_COMMAND</code> 环境变量, git 获取数据时会检查这个环境变量.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">GIT_PROXY_COMMAND</span><span class="o">=</span>gitproxysocks.sh
</span></code></pre></td></tr></table></div></figure>


<h2>(二) 针对HTTP 协议(<a href="http://">http://</a>)配置代理</h2>

<p>配置 git 对 <code>http://</code> 协议开头的仓库使用 http 代理,可以直接编辑 <code>~/.gitconfig</code> 文件.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="o">[</span>http<span class="o">]</span>
</span><span class='line'>    <span class="nv">proxy</span> <span class="o">=</span> http://proxy.yourcompany.com:8080
</span></code></pre></td></tr></table></div></figure>


<p>或者,可以通过下面的脚本直接设置 <code>http_proxy</code>， <code>https_proxy</code> 与 <code>all_proxy</code> 环境变量。
把下面的脚本保存为 <code>http_proxy.sh</code> ，并在  <code>~/.bashrc</code> 或者 <code>~/.zshrc</code> 里加入 <code>source /path/to/http_proxy.sh</code>， 这样在想使用 proxy 时，运行 <code>http_proxy_enable</code> 命令就可以了，取消时运行 <code>http_proxy_disable</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/sh</span>
</span><span class='line'>http_proxy_enable<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nv">IP</span><span class="o">=</span><span class="s2">&quot;http://username:password@proxy.yourcompany.com:8080&quot;</span>
</span><span class='line'>    <span class="nb">export </span><span class="nv">http_proxy</span><span class="o">=</span><span class="nv">$IP</span>
</span><span class='line'>    <span class="nb">export </span><span class="nv">https_proxy</span><span class="o">=</span><span class="nv">$IP</span>
</span><span class='line'>    <span class="nb">export </span><span class="nv">all_proxy</span><span class="o">=</span><span class="nv">$IP</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>http_proxy_disable<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">unset </span>http_proxy
</span><span class='line'>    <span class="nb">unset </span>https_proxy
</span><span class='line'>    <span class="nb">unset </span>all_proxy
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>(三) 针对SSH 协议(ssh://)配置代理</h2>

<p>使用 ssh 的好处就是在 clone 数据,或者提交数据到 github.com 时,不用在输入 github 的帐号密码.<br/>
下面是 ssh 的设置,打开 <code>~/.ssh/config</code>
输入 :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>Host github*
</span><span class='line'>    User git
</span><span class='line'>    Hostname github.com
</span><span class='line'>    Port 22
</span><span class='line'>    Proxycommand ssh root@proxy.yourcompany.com nc %h %p
</span><span class='line'>    IdentityFile  ~/.ssh/id_rsa
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[检测 Linux 服务器硬件资源的 Bash 脚本]]></title>
    <link href="http://leolovenet.com/blog/2014/03/28/a-linux-server-hardware-detection-resource-script/"/>
    <updated>2014-03-28T13:21:53+08:00</updated>
    <id>http://leolovenet.com/blog/2014/03/28/a-linux-server-hardware-detection-resource-script</id>
    <content type="html"><![CDATA[<p>最近公司要做机房的机器整理,把空闲的机器撤下来.</p>

<p>这样就需要列一个机器硬件配置的列表,就写了一个 bash 脚本来做检查,先for 循环自动 scp 到目标机器, 然后 for 循环自动 ssh 登录进所有的机器运行这个脚本.</p>

<p>输出的格式位 markdown, 可以很容易转换成 html 的 table .或者改一下脚本的输出格式为cvs, 到<a href="http://www.tablesgenerator.com/html_tables">这个网站</a>生成表格.</p>

<p>目前可以检查的资源有: 包含服务器的型号, U 数, Dell 序列号, 内存数, 最大内存数, 可以插的内存条数, 已经用的内存条数, 内存类型, 硬盘大小, CPU 信息.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'>
</span><span class='line'><span class="nv">ISINSTALLED_D</span><span class="o">=</span><span class="k">$(</span>rpm -qa |grep dmidecode<span class="k">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> -z <span class="nv">$ISINSTALLED_D</span> <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">  </span>yum -y install dmidecode
</span><span class='line'><span class="k">fi</span>
</span><span class='line'>
</span><span class='line'><span class="nb">export </span><span class="nv">PATH</span><span class="o">=</span><span class="nv">$HOME</span>/bin:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin
</span><span class='line'><span class="nv">NUM</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'><span class="nv">NUM</span><span class="o">=</span><span class="k">${</span><span class="nv">NUM</span><span class="p">:=0</span><span class="k">}</span>
</span><span class='line'><span class="nv">ISSHOW_DES</span><span class="o">=</span><span class="nv">$2</span>
</span><span class='line'><span class="nv">ISSHOW_DES</span><span class="o">=</span><span class="k">${</span><span class="nv">ISSHOW_DES</span><span class="p">:=0</span><span class="k">}</span>
</span><span class='line'>
</span><span class='line'><span class="nv">U_NUM</span><span class="o">=</span><span class="k">$(</span>dmidecode -t chassis |grep Height:|cut -d : -f 2<span class="k">)</span>
</span><span class='line'><span class="nv">U_NUM</span><span class="o">=</span><span class="k">${</span><span class="nv">U_NUM</span><span class="p">// /</span><span class="k">}</span>
</span><span class='line'><span class="nv">PRODUCT</span><span class="o">=</span><span class="k">$(</span>dmidecode -t system|grep Product|cut -d : -f 2|  sed -e <span class="s1">&#39;s/^[ \t]*//&#39;</span><span class="k">)</span>
</span><span class='line'><span class="nv">SERIAL</span><span class="o">=</span><span class="k">$(</span>dmidecode -t system|grep Serial|cut -d : -f 2|  sed -e <span class="s1">&#39;s/^[ \t]*//&#39;</span><span class="k">)</span>
</span><span class='line'><span class="nv">HOSTNAME</span><span class="o">=</span><span class="k">$(</span>hostname | cut -d . -f 1<span class="k">)</span>
</span><span class='line'><span class="nv">MEM</span><span class="o">=</span><span class="k">$(</span>free -o|cut -c 1-20|grep -vi <span class="s2">&quot;swap&quot;</span>|grep Mem|cut -d : -f 2|sed -e <span class="s1">&#39;s/^[ \t]*//&#39;</span><span class="k">)</span>
</span><span class='line'><span class="nv">MEM</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">&quot;$MEM 1000000&quot;</span> | awk <span class="s1">&#39;{printf &quot;%.1fGB&quot;, $1/$2}&#39;</span><span class="k">)</span>
</span><span class='line'><span class="nv">MEM_MAX_CAPACITY</span><span class="o">=</span><span class="k">$(</span>dmidecode -t memory|grep <span class="s2">&quot;Maximum Capacity&quot;</span>|cut -d : -f 2<span class="k">)</span>
</span><span class='line'><span class="nv">MEM_MAX_CAPACITY</span><span class="o">=</span><span class="k">${</span><span class="nv">MEM_MAX_CAPACITY</span><span class="p">// /</span><span class="k">}</span>
</span><span class='line'><span class="nv">MEM_NUM_OF_DEV</span><span class="o">=</span><span class="k">$(</span>dmidecode -t memory|grep <span class="s2">&quot;Number Of Devices&quot;</span>|cut -d : -f 2<span class="k">)</span>
</span><span class='line'><span class="nv">MEM_NUM_OF_DEV</span><span class="o">=</span><span class="k">${</span><span class="nv">MEM_NUM_OF_DEV</span><span class="p">// /</span><span class="k">}</span>
</span><span class='line'><span class="nv">MEM_NUM_OF_DEV_USED</span><span class="o">=</span><span class="k">$(</span>dmidecode -t memory|grep <span class="s2">&quot;Speed: Unknown&quot;</span>|wc -l<span class="k">)</span>
</span><span class='line'><span class="nv">MEM_NUM_OF_DEV_USED</span><span class="o">=</span><span class="k">$((</span><span class="nv">$MEM_NUM_OF_DEV</span> <span class="o">-</span> <span class="nv">$MEM_NUM_OF_DEV_USED</span><span class="k">))</span>
</span><span class='line'><span class="nv">MEM_TYPE</span><span class="o">=</span><span class="k">$(</span>dmidecode -t memory|grep <span class="s2">&quot;Type: &quot;</span>|tail -1|cut -d : -f 2<span class="k">)</span>
</span><span class='line'><span class="nv">MEM_TYPE</span><span class="o">=</span><span class="k">${</span><span class="nv">MEM_TYPE</span><span class="p">// /</span><span class="k">}</span>
</span><span class='line'><span class="nv">DISK_SIZE</span><span class="o">=</span><span class="k">$(</span>fdisk  -l  2&gt;/dev/null | grep GB |cut -d , -f 1|cut -d : -f 2|sed -e <span class="s1">&#39;s/ //g&#39;</span><span class="k">)</span>
</span><span class='line'><span class="nv">DISK_SIZE</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$DISK_SIZE</span>|tr <span class="s1">&#39; &#39;</span> <span class="s1">&#39;+&#39;</span><span class="k">)</span>
</span><span class='line'><span class="nv">CPU</span><span class="o">=</span><span class="k">$(</span>cat /proc/cpuinfo |grep CPU|head -1|cut -d : -f 2 | sed -e <span class="s1">&#39;s/^[ \t]*//&#39;</span><span class="k">)</span>
</span><span class='line'><span class="nv">CPU</span><span class="o">=</span><span class="k">${</span><span class="nv">CPU</span><span class="p">// /</span><span class="k">}</span>
</span><span class='line'><span class="nv">CPU</span><span class="o">=</span><span class="k">${</span><span class="nv">CPU</span><span class="p">//@/ </span><span class="k">}</span>
</span><span class='line'><span class="nv">CPU_NUM</span><span class="o">=</span><span class="k">$(</span>cat /proc/cpuinfo |grep CPU|wc -l<span class="k">)</span>
</span><span class='line'><span class="nv">CPU_INFO</span><span class="o">=</span><span class="s2">&quot;$CPU * $CPU_NUM&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> <span class="s2">&quot;${ISSHOW_DES}0&quot;</span> !<span class="o">=</span> <span class="s2">&quot;00&quot;</span> <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">  </span><span class="nb">echo</span> <span class="s2">&quot;|ID|服务器名|服务器型号|U数|DELL序列号|内存数|最大内存|总内存槽数|已经内存槽数|内存类型|硬盘大小信息|CPU 信息汇总|&quot;</span>
</span><span class='line'>  <span class="nb">echo</span> <span class="s2">&quot;|--|------|--------|---|---------|-----|------|---------|----------|------|----------|----------|&quot;</span>
</span><span class='line'><span class="k">fi</span>
</span><span class='line'><span class="nb">echo</span> <span class="s2">&quot;|$NUM|$HOSTNAME|$PRODUCT|$U_NUM|$SERIAL|$MEM|$MEM_MAX_CAPACITY|$MEM_NUM_OF_DEV|$MEM_NUM_OF_DEV_USED|$MEM_TYPE|$DISK_SIZE|$CPU_INFO|&quot;</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Hi Octopress]]></title>
    <link href="http://leolovenet.com/blog/2014/02/13/hi-octopress/"/>
    <updated>2014-02-13T17:16:08+08:00</updated>
    <id>http://leolovenet.com/blog/2014/02/13/hi-octopress</id>
    <content type="html"><![CDATA[<p>完成了 Blog 由 Wordpress 转向 Octopress 的迁移
我的 Blog 的迁移轨迹是 <a href="http://blog.csdn.net/apoxlo">CSDN</a> &ndash;> <a href="http://blog.bbkanba.com">Wordpress</a> &ndash;> Octepress
由于 CSDN 上面没有什么有用的文章我就没有迁移过来， Wordpress 的代码共享功能没有 Octepress 好用， 所以最终选择了 Octepress。</p>

<p>Github Pages 对用户使用 master 分支作为 <code>http://username.github.io</code> 网站的公共目录。因此，你需要在 source 分支上对你的 blog 源代码编辑，然后 commit 生成的内容到 master 分支上。</p>

<!--more-->


<h2>创建并部署一篇新博文的完整过程：</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake new_post<span class="o">[</span><span class="s2">&quot;New Post”]</span>
</span><span class='line'><span class="s2">rake generate</span>
</span><span class='line'><span class="s2">git add .</span>
</span><span class='line'><span class="s2">git commit -am &quot;</span>Some comment here.”
</span><span class='line'>git push origin <span class="nb">source</span>
</span><span class='line'>rake deploy
</span></code></pre></td></tr></table></div></figure>


<h2>How to Update Octopress</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git pull octopress master     <span class="c"># Get the latest Octopress</span>
</span><span class='line'>bundle install                <span class="c"># Keep gems updated</span>
</span><span class='line'>rake update_source            <span class="c"># update the template&#39;s source</span>
</span><span class='line'>rake update_style             <span class="c"># update the template&#39;s style</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[用Ruby增强ping命令]]></title>
    <link href="http://leolovenet.com/blog/2013/10/11/enhanced-ping-command-function-with-ruby/"/>
    <updated>2013-10-11T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/10/11/enhanced-ping-command-function-with-ruby</id>
    <content type="html"><![CDATA[<p>故事的起因是，我在mac下一直用chrome，但是chrome有一个很不爽的地方，是在地址栏copy的域名，每次都自动的加上<code>http://</code>的字符串，这样就没有办法直接粘贴到 Terminal， 用ping命令查看ping值。 这个事情真的弄的我很头疼。</p>

<p>所以就想办法关掉这个chrome的特性，google了半天也也没有找到，就放弃了。如果有人知道告诉我，十分感谢 :)</p>

<p>转而想可不可以增加 ping 的功能呢? 让ping可以支持有<code>http://</code>的域名。</p>

<p>正好，最近再看 ruby 的一些东西，感觉蛮方便的。就写了一个ruby脚本，可以自动的去掉http之类的协议头，然后传给ping命令执行。不就ok了嘛。</p>

<p>写出来之后，又不爽不能及时的知道 ip 的地理位置，所以呢，就又增加了调用纯真的 ip 数据库，顺便把ip的地理位置信息现实出来。</p>

<p>第一步，安装所需要的依赖库，qqwry.dat 自己下载，然后改脚本里的路径信息。</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">gem</span> <span class="n">install</span> <span class="n">escape</span> <span class="n">qqwry</span>
</span></code></pre></td></tr></table></div></figure>


<p>下面的代码我是另存为一个叫 p 的文件，放到了 <code>$home/bin/</code> 下面。</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#!/usr/bin/env ruby</span>
</span><span class='line'><span class="c1"># encoding : utf-8</span>
</span><span class='line'><span class="nb">require</span> <span class="s2">&quot;escape&quot;</span>
</span><span class='line'><span class="nb">require</span> <span class="s2">&quot;uri&quot;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;qqwry&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;resolv&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">unless</span> <span class="no">ARGV</span><span class="o">.</span><span class="n">length</span> <span class="o">==</span> <span class="mi">1</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;Usage: p &lt;domain&gt;</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="nb">exit</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">domain</span><span class="o">=</span><span class="no">ARGV</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">dup</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="n">domain</span><span class="o">[</span><span class="mi">0</span><span class="o">.</span><span class="n">.</span><span class="mi">3</span><span class="o">]</span> <span class="o">!=</span> <span class="s2">&quot;http&quot;</span>
</span><span class='line'>   <span class="n">domain</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="s1">&#39;http://&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">host</span><span class="o">=</span><span class="no">URI</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">domain</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">host</span>
</span><span class='line'><span class="n">ip</span><span class="o">=</span><span class="no">Resolv</span><span class="o">.</span><span class="n">getaddress</span> <span class="n">host</span>
</span><span class='line'>
</span><span class='line'><span class="n">db</span> <span class="o">=</span> <span class="ss">QQWry</span><span class="p">:</span><span class="ss">:Database</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s1">&#39;/Users/yourname/Documents/vbox/ip/qqwry.dat&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">r</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">ip</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">host</span><span class="si">}</span><span class="se">\t</span><span class="s2">===&gt;</span><span class="se">\t</span><span class="si">#{</span><span class="n">ip</span><span class="si">}</span><span class="se">\t</span><span class="s2">===&gt;</span><span class="se">\t</span><span class="si">#{</span><span class="n">r</span><span class="o">.</span><span class="n">country</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">r</span><span class="o">.</span><span class="n">area</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nb">exec</span> <span class="s2">&quot;ping </span><span class="si">#{</span><span class="n">host</span><span class="si">}</span><span class="s2">&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>使用方法:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>p http://www.google.com
</span></code></pre></td></tr></table></div></figure>


<p>脚本虽然很简单，但是用起来感觉很好。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[我的Evernote笔记]]></title>
    <link href="http://leolovenet.com/blog/2013/10/07/my-sharing-notes/"/>
    <updated>2013-10-07T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/10/07/my-sharing-notes</id>
    <content type="html"><![CDATA[<p>最近发生了很多事情,刚刚从未来的丈母娘那里回来.</p>

<p>没有什么主要的技术文章,就发一些自己平时积累的Evernote的笔记.</p>

<blockquote><p>★★★ <a href="https://www.evernote.com/shard/s170/sh/d59d27d3-2341-4982-a78f-fe3d61b2d081/628d18b1f6c66b14a33cb89dc39266b2">虚拟机开发环境的搭建利器vagrant</a>
vagrant是一个创建和分发虚拟化开发环境的工具，使用ruby编写，基于Oracle的VirtualBox，它提供了一个可配置的、轻量级的、可重用的、便携的虚拟化开发环境.</p>

<p>★★★ <a href="https://www.evernote.com/shard/s170/sh/5ee87faa-0c73-46a6-9cd1-7117ee8971ea/4bbf353bae719e4ef65e2b57530732a1">Git的学习笔记</a></p>

<p>★★ <a href="https://www.evernote.com/shard/s170/sh/c6fa9447-727c-474a-b75d-4492b5764f08/cd5ee8ca706b35bbc969e5205964bbd3">Pow 相关笔记</a>
Pow是一个Rack Server for Mac OS X.</p>

<p>★★★ <a href="https://www.evernote.com/shard/s170/sh/d408e6c7-c997-4fc1-b4ae-97f20445e491/424b9f322830d7debaeb976ed870ff7d">读Postfix权威指南笔记</a></p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[简单的机器资产管理,machineBill]]></title>
    <link href="http://leolovenet.com/blog/2013/07/11/machinebill/"/>
    <updated>2013-07-11T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/07/11/machinebill</id>
    <content type="html"><![CDATA[<p>原来的公司因为有多台机器资产管理的需求，特意写了一个台账系统，用的是jQuery EasyUI + PHP + Mysql，制作的极其简单，主要是用jQuery EasyUI的练手之作。</p>

<p>现在看来是没有用了。公布出来方便以后自己用的着的时候查询。</p>

<p>已经发到了 <a href="https://github.com/leolovenet/machineBill">github</a> 上。</p>

<p>并安装到了BBkanba上了一个Demo。<br/>
<a href="http://bill.bbkanba.com" target="_blank"><a href="http://bill.bbkanba.com">http://bill.bbkanba.com</a></a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[翻译]TED的一个四轴飞行器字幕]]></title>
    <link href="http://leolovenet.com/blog/2013/06/24/made-a-TED-video-subtitle/"/>
    <updated>2013-06-24T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/06/24/made-a-TED-video-subtitle</id>
    <content type="html"><![CDATA[<p><a href="http://v.youku.com/v_show/id_XNTc0MTk0MzI4.html">YouKu 视频</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[关于开发Squid的ecap动态库插件的指导]]></title>
    <link href="http://leolovenet.com/blog/2013/04/10/about-the-development-squid-ecap-dynamic-libraries-plug-guidance/"/>
    <updated>2013-04-10T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/04/10/about-the-development-squid-ecap-dynamic-libraries-plug-guidance</id>
    <content type="html"><![CDATA[<blockquote><p>&ldquo;Squid cache"（简称为Squid）是一个流行的自由软件（GNU通用公共许可证）的代理服务器和Web缓存服务器。 Squid 有广泛的用途，从作为网页服务器的前置 cache 服务器缓存相关请求来提高Web服务器的速度，到为一组人共享网络资源而缓存万维网，域名系统和其他网络搜索，到通过过滤流量帮助网络安全，到局域网通过代理上网。Squid主要设计用于在 Unix 一类系统运行。</p></blockquote>

<p>上面是摘自开源中国(oscine.net)对squid的中文介绍。squid的功能的确很强大，有些需要深入挖掘一下，今天这篇文章主要讲述一下这几天研究成果。squid 做透明代理或者网关的情况下，过滤用户请求内容，或者过滤用户请求的回应内容的技术。可以把 squid 当做一个理论上的“防火墙”来使用，避免用户浏览非法网站或下载带有病毒的文件(结合开源杀毒软件功能)，甚至替换掉那些烦人的广告。当然，它还可以在服务器的返回结果中植入自己的广告代码，或者统计代码，最灵活的是可以控制操作用户请求的 HTTP 头内容，过滤不必要的 HTTP 头信息，或者添加自定义HTTP头信息。</p>

<p>总之，<strong>我们可以利用 squid 分析，捕捉，拦截，替换，或者修改请求回应信息。</strong></p>

<p>Squid 拥有强大的<a target="_blank" href="http://www.squid-cache.org/Doc/config/acl/">ACL(访问控制)</a>配置指令，可以实现一些通用的访问控制，但是如果想要更加灵活的控制，应该怎么办? 在官网wiki中(<a target="_blank" href="http://wiki.squid-cache.org/SquidFaq/ContentAdaptation">Content Adaptation</a>)给出了答案.</p>

<!--more-->


<p>wiki给出了<a href="http://wiki.squid-cache.org/SquidFaq/ContentAdaptation#Summary">5种技术方案</a></p>

<div class="squid">
<style>
.squid table
{
    margin: 0.5em 0;
    border-collapse: collapse;
}

.squid table td
{
    padding: 0.25em;
    border: 1px solid #ADB9CC;
}

.squid td p {
    margin: 0;
    padding: 0;
}
</style>
<table><tbody><tr>  <td colspan="1" rowspan="2" style="text-align: center"><p class="line862"> <strong>Mechanism</strong> </p></td>
  <td colspan="2" style="text-align: center"><p class="line891"><strong>Request</strong> </p></td>
  <td colspan="2" style="text-align: center"><p class="line891"><strong>Response</strong> </p></td>
</tr>
<tr>  <td style="text-align: center"><span class="anchor" id="line-101"></span><p class="line891"><strong>Header</strong> </p></td>
  <td style="text-align: center"><p class="line862"> <strong>Body</strong> </p></td>
  <td style="text-align: center"><p class="line862"> <strong>Header</strong> </p></td>
  <td style="text-align: center"><p class="line862"> <strong>Body</strong> </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-102"></span><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secICAP">ICAP</a> </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-103"></span><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secClientStreams">Client Streams</a> </p></td>
  <td><p class="line862">  </p></td>
  <td><p class="line862">  </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-104"></span><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#seceCAP">eCAP</a> </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-105"></span><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secACLs">ACLs</a> </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td><p class="line862">  </p></td>
  <td style="text-align: center"><p class="line862">del </p></td>
  <td><p class="line862">  </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-106"></span><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secCodeHacks">code hacks</a> </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
  <td style="text-align: center"><p class="line862">yes </p></td>
</tr>
</tbody></table></div>


<p>而这几种方案又各有优缺点，最好的排序方式是:</p>

<div class="squid"><table><tbody><tr>  <td><p class="line862"> <strong>Evaluation Criteria</strong> </p></td>
  <td><p class="line862"> <strong>Mechanisms in rough order from "best" to "worst"</strong> </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-111"></span><p class="line862"> Squid independence </p></td>
  <td><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secICAP">ICAP</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#seceCAP">eCAP</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secACLs">ACLs</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secClientStreams">Client Streams</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secCodeHacks">code hacks</a> </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-112"></span><p class="line862"> Processing speed </p></td>
  <td><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#seceCAP">eCAP</a> or <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secClientStreams">Client Streams</a> or <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secACLs">ACLs</a> or <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secCodeHacks">code hacks</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secICAP">ICAP</a> </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-113"></span><p class="line862"> Development effort (header adaptation)</p></td>
  <td><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secACLs">ACLs</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secCodeHacks">code hacks</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secClientStreams">Client Streams</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#seceCAP">eCAP</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secICAP">ICAP</a> </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-114"></span><p class="line862"> Development effort (content adaptation)</p></td>
  <td><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#seceCAP">eCAP</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secICAP">ICAP</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secClientStreams">Client Streams</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secCodeHacks">code hacks</a> </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-115"></span><p class="line862"> Versatility </p></td>
  <td><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secCodeHacks">code hacks</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#seceCAP">eCAP</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secICAP">ICAP</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secClientStreams">Client Streams</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secACLs">ACLs</a> </p></td>
</tr>
<tr>  <td><span class="anchor" id="line-116"></span><p class="line862"> Maintenance overheads </p></td>
  <td><p class="line862"> <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secACLs">ACLs</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#seceCAP">eCAP</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secICAP">ICAP</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secClientStreams">Client Streams</a>, <a href="http://leolovenet.com/SquidFaq/ContentAdaptation#secCodeHacks">code hacks</a> </p></td>
</tr>
</tbody></table></div>


<p>我先简单介绍一下ICAP(<a href="http://tools.ietf.org/html/rfc3507">Internet Content Adaptation Protocol</a>)协议， ICAP是工作在web缓存代理服务器和真正的服务器之间的一个服务，通常来讲用户的HTTP请求送到代理缓存服务器之后，由代理缓存服务器判断是否可以命中缓存，或者把用户的请求转向真正的web服务，代理用户请求，并响应用户，记录缓存，待用户下次请求时，直接响应用户请求，省去向真正服务器的请求过程，加快响应速度，节约带宽成本.<br/>
而加入了ICAP的代理缓存服务器的工作逻辑是:</p>

<pre>
1.用户的HTTP请求送到代理缓存服务器.
2.代理缓存服务器将用户的请求消息发往ICAP服务器.
3.ICAP服务器接受到用户请求消息进行处理(可以分析，捕捉，拦截，替换，或者修改)，回应代理缓存服务器.
4.代理缓存服务器使用处理过的请求头，进行余下的处理流程，或者直接返回用户，或者查看是否命中缓存，或者转发给真正的内容提供服务器.
5.真正的内容提供服务器接受到请求以后回应代理缓存服务器相应的内容.
6.代理缓存服务器将接受到的回应内容发往ICAP服务器.
7.ICAP服务器接受到真正的服务器回应消息进行处理(可以分析，捕捉，拦截，替换，或者修改)，回应代理缓存服务器.
8.代理缓存服务器将内容回应给用户.
</pre>


<p>从上面的处理过程可以看出icap协议的强大之处.<br/>
上面的icap服务器类似http的web服务器一样，监听一个端口，等待代理缓存服务器的请求，并响应请求.而ecap可以看做是一个嵌入式的icap服务. ecap不必提供监听端口，而是以动态库的形式加载到了squid程序里面，通过api实现icap的逻辑处理，相当于squid的一个插件一样的工作.</p>

<p>经过尝试，我感觉目前最方便稳定的方式是开发squid的共享动态库ecap插件，实现自己的目的.<br/>
当然你可以修改squid的源代码，但是那样做需要首先研究透彻squid的工作机理，而且需要谨慎的修改，原作者也不建议这样，因为可能会导致squid不稳定.<br/>
当然还可以搭建icap服务，但是经过一轮的尝试和摸索一下，发现icap服务软件并没有像apache、nginx、和lighttpd这些成熟稳定的代码可以用，所以放弃，但是不乏一些小巧灵活的python架构的软件，可以使用，进行业务测试倒是可以，真正用于生产环境还是有点不足.<br/>
比如：<br/>
pyicap(<a target="_blank" href="https://github.com/netom/pyicap">A lightweight python framework for writing ICAP services</a>)，简单方便，生产环境不太适合.<br/>
bitz-server(<a target="_blank" href="https://github.com/uditha-atukorala/bitz-server">An ICAP server implementation in C++ and Python</a>)，不太稳定.</p>

<p>关于ICAP服务器的部署说明，请自行参考上面的wiki说明.<br/>
今天主要讲一下ecap的开发，部署，服务器环境为CentOS release 6.4 (Final) x86_64.<br/>
到<a href="http://www.e-cap.org/Downloads">http://www.e-cap.org/Downloads</a>下载安装最新版本的ecap库，编译安装.并同时下载最新版本的开发例子包<a href="http://www.measurement-factory.com/tmp/ecap/ecap_adapter_sample-0.2.0.tar.gz">ecap_adapter_sample-0.2.0.tar.gz</a></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>yum -y install automake autoconf libtool
</span><span class='line'>mkdir -p /opt/packages
</span><span class='line'><span class="nb">cd</span> /opt/packages
</span><span class='line'>wget http://www.measurement-factory.com/tmp/ecap/ecap_adapter_sample-0.2.0.tar.gz
</span><span class='line'>wget http://www.measurement-factory.com/tmp/ecap/libecap-0.2.0.tar.gz
</span><span class='line'>tar -zxf libecap-0.2.0.tar.gz
</span><span class='line'><span class="nb">cd </span>libecap-0.2.0
</span><span class='line'>./configure
</span><span class='line'>make
</span><span class='line'>make install
</span></code></pre></td></tr></table></div></figure>


<p>编译安装squid，并在configure要加入<code>–enable-ecap</code>，开启ecap支持，如果你还想squid同时支持icap的话，还需要加入<code>–enable-icap-client</code>开关，然后配置，编译安装.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>wget http://www.squid-cache.org/Versions/v3/3.3/squid-3.3.3.tar.bz2
</span><span class='line'>tar -xf squid-3.3.3.tar.bz2
</span><span class='line'><span class="nb">cd </span>squid-3.3.3
</span><span class='line'>./configure --enable-http-violations --enable-ltdl-convenience --enable-icap-client --enable-ecap --prefix<span class="o">=</span>/usr/local/squid <span class="nv">PKG_CONFIG_PATH</span><span class="o">=</span>/usr/local/lib/pkgconfig
</span><span class='line'>make
</span><span class='line'>make install
</span></code></pre></td></tr></table></div></figure>


<p>下面讲一下ecap的具体开发步骤，举个案例，现在我们想实现用户第一次访问网络时跳转到一个用户认证页面，认证通过以后才可以继续浏览网络.<br/>
实现原理大概是:</p>

<pre>
1.用户的请求送到squid，squid把用户请求http头交给ecap插件处理.
2.squid判断用户请求的url是否为我们的认证登陆页面.是，则放行不处理，否，则进行下面的逻辑.
2.ecap插件获取用户的ip地址，然后利用一个api接口去查询这个ip是否是否已经验证过，是，则放行通过，不处理，否，则进行下面的逻辑.
3.如果查询结果是这个ip还没有进行用户密码验证或者用户密码验证已经过期，则修改用户的http请求头，跳转到一个新的url地址，即我们的认证登陆页面，附带上用户的原始请求url.
4.用户在认证登陆页面输入账号密码登陆成功以后，数据库更新信息，然后跳转到用户原来的请求地址，继续浏览网络.
</pre>


<p>上面的功能有点类似radius，这里我们拿squid实现，还有就是用户每个请求都需要验证，所以上面的解决办法效率可能会有点低，但是这里只是举例讲解一下ecap这个插件的功能应用.上面的功能实现最好不要在生产环境下部属.</p>

<p>下面让我们，解压开发例子包ecap_adapter_sample-0.2.0.tar.gz.</p>

<pre>
.
├── acinclude.m4    //m4宏文件不需要手工修改
├── aclocal.m4         //m4宏文件不需要手工修改
├── bootstrap.sh     //脚本文件，自动运行autotool工具命令，不需要手工修改
├── cfgaux           //此目录下的所有文件都不需要手动修改
│   ├── ax_cxx_check_lib.m4
│   ├── config.guess
│   ├── config.sub
│   ├── depcomp
│   ├── install-sh
│   ├── ltmain.sh
│   ├── missing
│   ├── xstd_common.ac
│   └── xstd_cpp_checks.ac
├── change.log
├── configure       //生成的 configure 脚本
├── configure.in    //configure 脚本的生成源文件，需要手工编辑一下.
├── CREDITS       
├── LICENSE
├── Makefile.am     //Makefile.in脚本的生成源文件，此项目不需要手工修改.
├── Makefile.in       //生成的 Makefile.in脚本
├── NOTICE
├── README
└── src
    ├── adapter_minimal.cc     //c++源文件，例子程序一
    ├── adapter_modifying.cc   //c++源文件，例子程序二
    ├── adapter_passthru.cc    //c++源文件，例子程序三
    ├── autoconf.h            //不需要修改，运行./configure之后，由autoconf.h.in生成的文件
    ├── autoconf.h.in         //不需要修改
    ├── Makefile.am  //Makefile.in脚本的生成源文件，需要手工编辑一下.
    ├── Makefile.in  //生成的 Makefile.in脚本
    └── sample.h    //例子的头文件
</pre>


<p>如果你之前没有使用autotool工具的经验，这里有<a href="http://leolovenet.com/downloads/files/autotools.pdf">一篇短文介绍</a>，很快速的了解一下autotool工具. (autotool通常来说是autoconf， automake， autolib， 但是还有很多辅助的工具，包括 autoheader， aclocal， autoscan，运行这些命令之后，你就可以 <code>./configure &amp;&amp; make &amp;&amp; make install</code> ).<br/>
写ecap插件很简单，例子包给出了3个例子插件.基本上一个插件只有一个源文件就可以搞定.所以写和部署起来还是蛮方便的.<br/>
这里我们在原有的例子程序框架下修改一下. 然后写出我们自己的插件来.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>tar -zxf ecap_adapter_sample-0.2.0.tar.gz
</span><span class='line'>mv ecap_adapter_sample-0.2.0 ecap_adapter_bbkanba
</span><span class='line'><span class="nb">cd </span>ecap_adapter_bbkanba/src
</span><span class='line'>cp adapter_modifying.cc adapter_bbkanba.cc
</span><span class='line'>sed -i -e <span class="s1">&#39;s/sample.h/bbkanba.h/&#39;</span> adapter_bbkanba.cc
</span><span class='line'>sed -i -e <span class="s1">&#39;/.*\/config.h.*/d&#39;</span> adapter_bbkanba.cc
</span><span class='line'>sed -i -e <span class="s1">&#39;s/.*ecap:\/\/.*/return &quot;ecap:\/\/bbkanba.com\/bbkanba&quot;;/&#39;</span> adapter_bbkanba.cc
</span><span class='line'>cat &gt; Makefile.am <span class="s">&lt;&lt;ALLEND</span>
</span><span class='line'><span class="s">EXTRA_DIST = \</span>
</span><span class='line'><span class="s">    adapter_bbkanba.cc   </span>
</span><span class='line'><span class="s">     </span>
</span><span class='line'><span class="s">lib_LTLIBRARIES = \</span>
</span><span class='line'><span class="s">    ecap_adapter_bbkanba.la</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">noinst_HEADERS = \</span>
</span><span class='line'><span class="s">    bbkanba.h \</span>
</span><span class='line'><span class="s">    Debugger.h \</span>
</span><span class='line'><span class="s">    \</span>
</span><span class='line'><span class="s">    autoconf.h </span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">ecap_adapter_bbkanba_la_SOURCES = adapter_bbkanba.cc \</span>
</span><span class='line'><span class="s">                                 Debugger.cc </span>
</span><span class='line'><span class="s">             </span>
</span><span class='line'><span class="s">ecap_adapter_bbkanba_la_CPPFLAGS = \$(LIBECAP_CFLAGS) </span>
</span><span class='line'><span class="s">ecap_adapter_bbkanba_la_LDFLAGS = -module -avoid-version \$(libecap_LIBS)</span>
</span><span class='line'><span class="s">ecap_adapter_bbkanba_la_LIBADD= \$(LIBECAP_LIBS)  -lboost_system -lcppnetlib-uri</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">DISTCLEANFILES = \</span>
</span><span class='line'><span class="s">        autoconf.h</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">AM_CPPFLAGS = -I\$(top_srcdir)/src</span>
</span><span class='line'><span class="s">ALLEND</span>
</span><span class='line'>mv sample.h  bbkanba.h
</span><span class='line'>cat &gt; Debugger.h <span class="s">&lt;&lt;ALLEND</span>
</span><span class='line'><span class="s">/* eCAP ClamAV Adapter  http://www.e-cap.org/</span>
</span><span class='line'><span class="s"> * Copyright (C) 2011 The Measurement Factory.</span>
</span><span class='line'><span class="s"> * Distributed under GPL v2 without any warranty.  */</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">#ifndef ECAP_MBAIDU_ADAPTER_DEBUGGER_H</span>
</span><span class='line'><span class="s">#define ECAP_MBAIDU_ADAPTER_DEBUGGER_H</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">#include &lt;libecap/common/log.h&gt;</span>
</span><span class='line'><span class="s">#include &lt;iosfwd&gt;</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">using libecap::ilNormal;</span>
</span><span class='line'><span class="s">using libecap::ilCritical;</span>
</span><span class='line'><span class="s">using libecap::flXaction;</span>
</span><span class='line'><span class="s">using libecap::flApplication;</span>
</span><span class='line'><span class="s">using libecap::mslLarge;</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">// TODO: rename to Log</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">// libecap::host::openDebug/closeDebug calls wrapper for safety and convenience</span>
</span><span class='line'><span class="s">class Debugger {</span>
</span><span class='line'><span class="s">    public:</span>
</span><span class='line'><span class="s">        explicit Debugger(const libecap::LogVerbosity lv); // opens</span>
</span><span class='line'><span class="s">        ~Debugger(); // closes</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">        // logs a message if host enabled debugging at the specified level</span>
</span><span class='line'><span class="s">        template &lt;class T&gt;</span>
</span><span class='line'><span class="s">        const Debugger &amp;operator &lt;&lt;(const T &amp;msg) const {</span>
</span><span class='line'><span class="s">            if (debug)</span>
</span><span class='line'><span class="s">                *debug &lt;&lt; msg;</span>
</span><span class='line'><span class="s">            return *this;</span>
</span><span class='line'><span class="s">        }</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">    private:</span>
</span><span class='line'><span class="s">        /* prohibited and not implemented */</span>
</span><span class='line'><span class="s">        Debugger(const Debugger&amp;);</span>
</span><span class='line'><span class="s">        Debugger &amp;operator=(const Debugger&amp;);</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">        std::ostream *debug; // host-provided debug ostream or nil</span>
</span><span class='line'><span class="s">};</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">#endif</span>
</span><span class='line'><span class="s">ALLEND</span>
</span><span class='line'>cat &gt; Debugger.cc <span class="s">&lt;&lt;ALLEND</span>
</span><span class='line'><span class="s">/* eCAP ClamAV Adapter   http://www.e-cap.org/</span>
</span><span class='line'><span class="s"> * Copyright (C) 2011 The Measurement Factory.</span>
</span><span class='line'><span class="s"> * Distributed under GPL v2 without any warranty.  */</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">#include &quot;bbkanba.h&quot;</span>
</span><span class='line'><span class="s">#include &quot;Debugger.h&quot;</span>
</span><span class='line'><span class="s">#include &lt;libecap/common/registry.h&gt;</span>
</span><span class='line'><span class="s">#include &lt;libecap/host/host.h&gt;</span>
</span><span class='line'><span class="s">#include &lt;iostream&gt;</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">// TODO: support automated prefixing of log messages</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">Debugger::Debugger(const libecap::LogVerbosity lv):</span>
</span><span class='line'><span class="s">    debug(libecap::MyHost().openDebug(lv)) {</span>
</span><span class='line'><span class="s">}</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">Debugger::~Debugger() {</span>
</span><span class='line'><span class="s">    if (debug)</span>
</span><span class='line'><span class="s">        libecap::MyHost().closeDebug(debug);</span>
</span><span class='line'><span class="s">}</span>
</span><span class='line'><span class="s">ALLEND</span>
</span><span class='line'><span class="nb">cd</span> ..
</span><span class='line'>sed -i -e <span class="s1">&#39;s/AC_INIT.*/AC_INIT(eCAP bbkanba Adapter, 0.0.1, leolovenet@gmail.com, eCAP_bbkanba_Adapter)/&#39;</span> configure.in
</span><span class='line'>sed -i -e <span class="s1">&#39;s/AC_CONFIG_SRCDIR.*/AC_CONFIG_SRCDIR([src\/bbkanba.h])/&#39;</span> configure.in
</span><span class='line'>touch  ./NEWS
</span><span class='line'>touch  ./AUTHORS
</span><span class='line'>touch  ./ChangeLog
</span><span class='line'>touch ./COPYING
</span><span class='line'>autoreconf -ivf
</span><span class='line'>./configure <span class="nv">PKG_CONFIG_PATH</span><span class="o">=</span>/usr/local/lib/pkgconfig
</span><span class='line'>make
</span><span class='line'>make install
</span></code></pre></td></tr></table></div></figure>


<p>如果上面运行<code>make</code>命令没有报错的话，说明你的编译环境，例子程序的框架修改没有问题. 下面我们就可以具体的编写插件代码了.<br/>
上面引入两个debug的文件(源自eCAP ClamAV Adapter插件)，便于查看插件程序的执行过程，Debug信息会输出到squid的日志文件. 现在写自己的ecap插件，只需要编辑<code>adapter_bbkanba.cc</code>文件，之后运行<code>./configure &amp;&amp; make &amp;&amp; make install</code>. 默认情况下的安装路径为<code>/usr/local/lib</code>.<br/>
写完插件，编译成功，并安装到相应目录下后，要让squid加载我们的插件，还需要修改squid的配置文件<code>squid.conf</code>，添加下面的内容:</p>

<pre>
ecap_enable on
adaptation_send_client_ip on
loadable_modules /usr/local/lib/ecap_adapter_bbkanba.so
ecap_service bbkanbam reqmod_precache 0  ecap://bbkanba.com/bbkanba
adaptation_service_set reqFilter bbkanbam
adaptation_access reqFilter allow all
</pre>


<p>每个配置选项squid的官网都有详细的解释，这里我就不多说了.大概意思就是让squid开启ecap插件，然后加载插件.并开启用户ip的功能，这样squid就会把用户的请求包与用户的ip送到ecaq插件来处理.<br/>
注意，要想使上面的配置生效，需要在编译安装squid的时候，开启<code>--enable-ecap</code>选项.</p>

<p>现在运行<code>squid -NCXd 2</code>命令，调试squid是否加载了我们的插件.在经过一大串的输出后，应该会看到</p>

<pre>LoadableModules.cc(14) LoadModule: Loaded Squid module from '/usr/local/lib/ecap_adapter_bbkanba.so'</pre>


<p>说明我们的模块加载成功了，但是紧跟着的是错误信息:</p>

<pre>ERROR: failed to start essential eCAP service: ecap://bbkanba.com/bbkanba:
Modifying Adapter: configuration error: victim value is not set
</pre>


<p>导致squid启动不起来，为什么呢?让我们先来看看<code>adapter_bbkanba.cc</code>源文件.</p>

<p>ecap插件的源文件命名空间采用的是<code>namespace Adapter</code>. 主要有两个类<code>class Service: public libecap::adapter::Service</code>与<code>class Xaction: public libecap::adapter::Xaction</code>，即 Service 类与 Xaction 类.<br/>
Service类代表的是一个ecap插件服务，上面我们在squid.conf配置文件里用ecap_service指令加载到squid程序里的，就是一个ecap服务.所以，继承自<code>libecap::adapter::Service</code>的Service类的主要功能可以看做是squid与ecap插件链接的一个沟通桥梁，把我们的插件与squid紧密结合在了一起.可以在ecap_service指令后，加入我们想要传送给插件的配置选项参数.<br/>
默认的例子程序adapter_modifying.cc，就需要采用victim和replacement参数，才可以加载成功.因为我们的程序源文件来源于adapter_modifying.cc，因此在默认的情况下，要想让<code>ecap_adapter_bbkanba.so</code> 工作需要修改上面的ecap_service指令的值为下面才可以.</p>

<pre>ecap_service bbkanbam reqmod_precache 0  ecap://bbkanba.com/bbkanba victim="test" replacement="bbkanba.com"</pre>


<p>现在再次运行<code>squid -NCXd 2</code>命令，可以看到，squid不会再报错了.<br/>
在我们假设的案例中，不需要在配置文件中向ecap插件传入配置选项，因为待会我们会修改源文件去掉检查是否有victim选项的代码.</p>

<p>在我们开始真正的编写插件代码之前，我们先引入一些需要的头文件，运行下面的命令.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sed -i -e <span class="s1">&#39;/.*bbkanba.h.*/ a\#include &quot;Debugger.h&quot;\n#include &lt;algorithm&gt;&#39;</span> adapter_bbkanba.cc
</span></code></pre></td></tr></table></div></figure>


<p>自己手工处理一下Service类，使我们的开发框架变的干净整洁:<br/>
删除<code>void setVictim(const std::string &amp;value);</code><br/>
删除<code>void Adapter::Service::configure(const libecap::Options &amp;cfg)</code>方法内的所有代码，使其变为空函数.<br/>
删除<code>void Adapter::Service::reconfigure(const libecap::Options &amp;cfg)</code>方法内的所有代码，使其变为空函数.<br/>
删除<code>void setOne(const libecap::Name &amp;name, const libecap::Area &amp;valArea);</code>方法;<br/>
删除<code>Cfgtor</code>类;</p>

<p>上面解释了Server类，现在解释一下Xaction类.Xaction类为真正干活的地方，所有插件的业务逻辑全部需要在这个类里完成.<br/>
squid为每一个请求创建一个Server类对象，每一个Server类对象负责创建一个Xaction对象，Xaction对象负责处理业务逻辑.<br/>
在Xaction类的<code>virtual void start();</code> 方法里开始业务逻辑的处理.</p>

<p>为了便于处理url的信息以及利用http请求查询api获取用户ip是否验证通过的结果，这里我利用<a target="_blank" href="http://www.boost.org/">boost</a>库和<a target="_blank" href="http://cpp-netlib.org/">cpp-netlib</a>库.首先让我们安装这两个库的最新版本.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">###install boost####</span>
</span><span class='line'>yum -y install icu libicu libicu-devel python python-devel
</span><span class='line'>wget http://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.gz/download
</span><span class='line'>tar -zxf boost_1_53_0.tar.gz
</span><span class='line'><span class="nb">cd  </span>boost_1_53_0
</span><span class='line'>./bootstrap.sh --prefix<span class="o">=</span>/usr/local/boost_1_53_0
</span><span class='line'>./b2 install
</span><span class='line'>ln -s /usr/local/boost_1_53_0/lib/libboost_* /usr/local/lib/
</span><span class='line'>ln -s /usr/local/boost_1_53_0/include/boost /usr/local/include/boost
</span><span class='line'><span class="nb">echo</span> <span class="s2">&quot;/usr/local/lib&quot;</span> &gt; /etc/ld.so.conf.d/usrlocallib.conf
</span><span class='line'>ldconfig
</span><span class='line'><span class="c">###install cpp-netlib-0.9.4####</span>
</span><span class='line'>wget http://dl.atrpms.net/el6-x86_64/atrpms/stable/atrpms-repo-6-6.el6.x86_64.rpm
</span><span class='line'>rpm -Uvh atrpms-repo*rpm
</span><span class='line'>yum -y --enablerepo<span class="o">=</span>atrpms-testing install cmake
</span><span class='line'>wget https://github.com/downloads/cpp-netlib/cpp-netlib/cpp-netlib-0.9.4.zip
</span><span class='line'>unzip cpp-netlib-0.9.4.zip
</span><span class='line'><span class="nb">cd </span>cpp-netlib-0.9.4
</span><span class='line'>sed -i -e <span class="s1">&#39;/if (Boost_FOUND)/ a\set (CMAKE_CXX_FLAGS &quot;-lrt -fPIC&quot;)&#39;</span> CMakeLists.txt
</span><span class='line'>mkdir cpp-netlib-build
</span><span class='line'><span class="nb">cd </span>cpp-netlib-build
</span><span class='line'>cmake -DCMAKE_C_COMPILER<span class="o">=</span>gcc -DCMAKE_CXX_COMPILER<span class="o">=</span>g++ ..
</span><span class='line'>make -j4
</span><span class='line'>
</span><span class='line'>cp libs/network/src/*.a /usr/local/lib/
</span><span class='line'><span class="nb">cd</span> ..
</span><span class='line'>cp -r boost/* /usr/local/include/boost/
</span><span class='line'>ldconfig
</span></code></pre></td></tr></table></div></figure>


<p><strong>吐槽题外话，不想看的跳过.</strong><br/>
这篇文章写到这里，已经写了有几天了.虽然中途因为工作，生活，还有懒惰心一度中断，但是这些原因都不是原因，最根本的原因是，我还得吐槽一下这个库，我当初在找http方面的库时候看到了cpp-netlib，觉得它很好用，可就是太臃肿了，为了用它我还的不得已引入boost，一路摸索的在公司高配服务器上安装编译调试，不是很费劲最后成了.感觉也没有那么复杂.但是但是，为了写这篇文章，我又的重新的在我的aliyun的低配置服务器上重新编译，编译问题到还是可以慢慢解决.但是我受不了的是cpp-netlib的编译速度之慢之慢之慢之慢之慢之慢之慢之慢之慢&#8230;..，我编译它用了超过8个小时，对，超过8个小时，超过8个小时，超过8个小时（重要的事情要说 3 遍），虽然这充分地表明我的机器配置有多低，但是我还要吐槽，这么个简单的库为啥要编译这么费劲，个老子里&#8230;，好，发泄完毕，继续之前贴出我机器的配置，以供瞻仰:</p>

<pre>
#其实也没有那么糟糕了.还能用.
Intel(R) Xeon(R) CPU   E5645  @ 2.40GHz
Memory: 512M
Disk: 40G
</pre>


<p>以下为在我的机器上编译cpp-netlib遇到的问题:</p>

<pre>
问题一:g++: Internal error: Killed (program cc1plus)
解决: 经过多方查证，此错误的原因是，悲崔的内存不够导致的.怎么解决，只能通过增加swap分区办法了.
具体操作看这里.<a target="_blank" href="http://www.thegeekstuff.com/2010/08/how-to-add-swap-space/">how-to-add-swap-space</a>
</pre>




<pre>
问题二，编译插件成功，但是运行squid -NCXd 2命令后报错如下:
FATAL: dying from an unhandled exception: file not found
terminate called after throwing an instance of 'TextException'
  what():  file not found
Aborted
解决: 插件在编译连接的问题，重新安装boost库解决.
</pre>


<p><strong>吐槽完毕，继续正文</strong></p>

<p>讲一下ecap插件开发的大概逻辑，然后贴出上面举出的案例的代码，这篇文章就这么落幕吧.<br/>
squid的通过继承自<code>libecap::adapter::Service</code>类的子类，实现与ecap的通信，每过来一个请求就实例化一个Server类对象，然后Server对象通过自己的<code>virtual libecap::adapter::Xaction *makeXaction(libecap::host::Xaction *hostx);</code>方法，实例话一个继承自<code>libecap::adapter::Xaction</code>类的对象，利用该对象实现业务逻辑，具体的话，可以查看ecap的样板例子代码.<br/>
说一下ecap插件开发中用到的数据结构类型.主要用到的以下几种:<br/>
1. <code>libecap::Area</code> 类型，为灵活调整大小的空间，可以用来保存http请求头中的值.<br/>
2. <code>libecap::Name</code> 类型，为全局唯一ID以及对应的字符串，可以用来保存http请求头中的头字符串.<br/>
3. <code>libecap::Message</code> 类型，为squid转发过来的每个用户http请求的封装，其中包含用户请求的url，http头，和可能附带的其他数据(请求的话，post可能带有的数据，回应的话，就是回应的body信息了).<br/>
4. <code>libecap::host::Xaction</code> 类型，每个用户请求的封装，包含<code>libecap::Message</code>.<br/>
ok，主要用到的就这么多.要到达我们上面列出的案例要求，其实很简单，这里只在<code>void Adapter::Xaction::start()</code>里实现就可以了.<br/>
这里我们假设，用户的认证登陆页面在本机的9090端口，任何未经过认证的，或者认证超时的用户，全部默认跳转到<a href="http://127.0.0.1:9090;">http://127.0.0.1:9090;</a><br/>
查询用户是否可以访问网络的api接口是，<a href="http://127.0.0.1:9090/check.php?uip=x.x.x.x.">http://127.0.0.1:9090/check.php?uip=x.x.x.x.</a><br/>
查询结果如果为0，则表示用户没有经过认证，为1表示已经过期，为2表示正常放行.</p>

<p>下面为全部的代码，没有经过测试，不保证正确哦.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
<span class='line-number'>162</span>
<span class='line-number'>163</span>
<span class='line-number'>164</span>
<span class='line-number'>165</span>
<span class='line-number'>166</span>
<span class='line-number'>167</span>
<span class='line-number'>168</span>
<span class='line-number'>169</span>
<span class='line-number'>170</span>
<span class='line-number'>171</span>
<span class='line-number'>172</span>
<span class='line-number'>173</span>
<span class='line-number'>174</span>
<span class='line-number'>175</span>
<span class='line-number'>176</span>
<span class='line-number'>177</span>
<span class='line-number'>178</span>
<span class='line-number'>179</span>
<span class='line-number'>180</span>
<span class='line-number'>181</span>
<span class='line-number'>182</span>
<span class='line-number'>183</span>
<span class='line-number'>184</span>
<span class='line-number'>185</span>
<span class='line-number'>186</span>
<span class='line-number'>187</span>
<span class='line-number'>188</span>
<span class='line-number'>189</span>
<span class='line-number'>190</span>
<span class='line-number'>191</span>
<span class='line-number'>192</span>
<span class='line-number'>193</span>
<span class='line-number'>194</span>
<span class='line-number'>195</span>
<span class='line-number'>196</span>
<span class='line-number'>197</span>
<span class='line-number'>198</span>
<span class='line-number'>199</span>
<span class='line-number'>200</span>
<span class='line-number'>201</span>
<span class='line-number'>202</span>
<span class='line-number'>203</span>
<span class='line-number'>204</span>
<span class='line-number'>205</span>
<span class='line-number'>206</span>
<span class='line-number'>207</span>
<span class='line-number'>208</span>
<span class='line-number'>209</span>
<span class='line-number'>210</span>
<span class='line-number'>211</span>
<span class='line-number'>212</span>
<span class='line-number'>213</span>
<span class='line-number'>214</span>
<span class='line-number'>215</span>
<span class='line-number'>216</span>
<span class='line-number'>217</span>
<span class='line-number'>218</span>
<span class='line-number'>219</span>
<span class='line-number'>220</span>
<span class='line-number'>221</span>
<span class='line-number'>222</span>
<span class='line-number'>223</span>
<span class='line-number'>224</span>
<span class='line-number'>225</span>
<span class='line-number'>226</span>
<span class='line-number'>227</span>
<span class='line-number'>228</span>
<span class='line-number'>229</span>
<span class='line-number'>230</span>
<span class='line-number'>231</span>
<span class='line-number'>232</span>
<span class='line-number'>233</span>
<span class='line-number'>234</span>
<span class='line-number'>235</span>
<span class='line-number'>236</span>
<span class='line-number'>237</span>
<span class='line-number'>238</span>
<span class='line-number'>239</span>
<span class='line-number'>240</span>
<span class='line-number'>241</span>
<span class='line-number'>242</span>
<span class='line-number'>243</span>
<span class='line-number'>244</span>
<span class='line-number'>245</span>
<span class='line-number'>246</span>
<span class='line-number'>247</span>
<span class='line-number'>248</span>
<span class='line-number'>249</span>
<span class='line-number'>250</span>
<span class='line-number'>251</span>
<span class='line-number'>252</span>
<span class='line-number'>253</span>
<span class='line-number'>254</span>
<span class='line-number'>255</span>
<span class='line-number'>256</span>
<span class='line-number'>257</span>
<span class='line-number'>258</span>
<span class='line-number'>259</span>
<span class='line-number'>260</span>
<span class='line-number'>261</span>
<span class='line-number'>262</span>
<span class='line-number'>263</span>
<span class='line-number'>264</span>
<span class='line-number'>265</span>
<span class='line-number'>266</span>
<span class='line-number'>267</span>
<span class='line-number'>268</span>
<span class='line-number'>269</span>
<span class='line-number'>270</span>
<span class='line-number'>271</span>
<span class='line-number'>272</span>
<span class='line-number'>273</span>
<span class='line-number'>274</span>
<span class='line-number'>275</span>
<span class='line-number'>276</span>
<span class='line-number'>277</span>
<span class='line-number'>278</span>
<span class='line-number'>279</span>
<span class='line-number'>280</span>
<span class='line-number'>281</span>
<span class='line-number'>282</span>
<span class='line-number'>283</span>
<span class='line-number'>284</span>
<span class='line-number'>285</span>
<span class='line-number'>286</span>
<span class='line-number'>287</span>
<span class='line-number'>288</span>
<span class='line-number'>289</span>
<span class='line-number'>290</span>
<span class='line-number'>291</span>
<span class='line-number'>292</span>
<span class='line-number'>293</span>
<span class='line-number'>294</span>
<span class='line-number'>295</span>
<span class='line-number'>296</span>
<span class='line-number'>297</span>
<span class='line-number'>298</span>
<span class='line-number'>299</span>
<span class='line-number'>300</span>
<span class='line-number'>301</span>
<span class='line-number'>302</span>
<span class='line-number'>303</span>
<span class='line-number'>304</span>
<span class='line-number'>305</span>
<span class='line-number'>306</span>
<span class='line-number'>307</span>
<span class='line-number'>308</span>
<span class='line-number'>309</span>
<span class='line-number'>310</span>
<span class='line-number'>311</span>
<span class='line-number'>312</span>
<span class='line-number'>313</span>
<span class='line-number'>314</span>
<span class='line-number'>315</span>
<span class='line-number'>316</span>
<span class='line-number'>317</span>
<span class='line-number'>318</span>
<span class='line-number'>319</span>
<span class='line-number'>320</span>
<span class='line-number'>321</span>
<span class='line-number'>322</span>
<span class='line-number'>323</span>
<span class='line-number'>324</span>
<span class='line-number'>325</span>
<span class='line-number'>326</span>
<span class='line-number'>327</span>
<span class='line-number'>328</span>
<span class='line-number'>329</span>
<span class='line-number'>330</span>
<span class='line-number'>331</span>
<span class='line-number'>332</span>
<span class='line-number'>333</span>
<span class='line-number'>334</span>
<span class='line-number'>335</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &quot;bbkanba.h&quot;</span>
</span><span class='line'><span class="cp">#include &quot;Debugger.h&quot;</span>
</span><span class='line'><span class="cp">#include &lt;iostream&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libecap/common/registry.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libecap/common/errors.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libecap/common/message.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libecap/common/header.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libecap/common/names.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libecap/common/named_values.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libecap/host/host.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libecap/adapter/service.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libecap/adapter/xaction.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libecap/host/xaction.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;boost/network/uri.hpp&gt;</span>
</span><span class='line'><span class="cp">#include &lt;boost/network/uri/uri_io.hpp&gt;</span>
</span><span class='line'><span class="cp">#include &lt;boost/network/protocol/http/client.hpp&gt;</span>
</span><span class='line'><span class="k">using</span> <span class="k">namespace</span> <span class="n">boost</span><span class="o">::</span><span class="n">network</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">namespace</span> <span class="n">Adapter</span> <span class="p">{</span> <span class="c1">// not required, but adds clarity</span>
</span><span class='line'><span class="k">using</span>   <span class="n">libecap</span><span class="o">::</span><span class="n">size_type</span><span class="p">;</span>
</span><span class='line'><span class="k">typedef</span> <span class="n">libecap</span><span class="o">::</span><span class="n">RequestLine</span> <span class="o">*</span><span class="n">CLRLP</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Service</span><span class="o">:</span> <span class="k">public</span> <span class="n">libecap</span><span class="o">::</span><span class="n">adapter</span><span class="o">::</span><span class="n">Service</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">public</span><span class="o">:</span>
</span><span class='line'>        <span class="c1">// About</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">uri</span><span class="p">()</span> <span class="k">const</span><span class="p">;</span> <span class="c1">// unique across all vendors</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">tag</span><span class="p">()</span> <span class="k">const</span><span class="p">;</span> <span class="c1">// changes with version and config</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">describe</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">os</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span> <span class="c1">// free-format info</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Configuration</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">configure</span><span class="p">(</span><span class="k">const</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Options</span> <span class="o">&amp;</span><span class="n">cfg</span><span class="p">);</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">reconfigure</span><span class="p">(</span><span class="k">const</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Options</span> <span class="o">&amp;</span><span class="n">cfg</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Lifecycle</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">start</span><span class="p">();</span> <span class="c1">// expect makeXaction() calls</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">stop</span><span class="p">();</span> <span class="c1">// no more makeXaction() calls until start()</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">retire</span><span class="p">();</span> <span class="c1">// no more makeXaction() calls</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Scope (XXX: this may be changed to look at the whole header)</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">bool</span> <span class="n">wantsUrl</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">url</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Work</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="n">libecap</span><span class="o">::</span><span class="n">adapter</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">makeXaction</span><span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">host</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">hostx</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Xaction</span><span class="o">:</span> <span class="k">public</span> <span class="n">libecap</span><span class="o">::</span><span class="n">adapter</span><span class="o">::</span><span class="n">Xaction</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">public</span><span class="o">:</span>
</span><span class='line'>        <span class="n">Xaction</span><span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">Service</span><span class="o">&gt;</span> <span class="n">s</span><span class="p">,</span> <span class="n">libecap</span><span class="o">::</span><span class="n">host</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">x</span><span class="p">);</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="o">~</span><span class="n">Xaction</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// meta-information for the host transaction</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="k">const</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Area</span> <span class="n">option</span><span class="p">(</span><span class="k">const</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Name</span> <span class="o">&amp;</span><span class="n">name</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">visitEachOption</span><span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">NamedValueVisitor</span> <span class="o">&amp;</span><span class="n">visitor</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// lifecycle</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">start</span><span class="p">();</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">stop</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// adapted body transmission control</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">abDiscard</span><span class="p">();</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">abMake</span><span class="p">();</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">abMakeMore</span><span class="p">();</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">abStopMaking</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// adapted body content extraction and consumption</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Area</span> <span class="n">abContent</span><span class="p">(</span><span class="n">size_type</span> <span class="n">offset</span><span class="p">,</span> <span class="n">size_type</span> <span class="n">size</span><span class="p">);</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">abContentShift</span><span class="p">(</span><span class="n">size_type</span> <span class="n">size</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// virgin body state notification</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">noteVbContentDone</span><span class="p">(</span><span class="kt">bool</span> <span class="n">atEnd</span><span class="p">);</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">void</span> <span class="n">noteVbContentAvailable</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// libecap::Callable API, via libecap::host::Xaction</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="kt">bool</span> <span class="n">callable</span><span class="p">()</span> <span class="k">const</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">protected</span><span class="o">:</span>
</span><span class='line'>        <span class="kt">void</span> <span class="n">stopVb</span><span class="p">();</span> <span class="c1">// stops receiving vb (if we are receiving it)</span>
</span><span class='line'>
</span><span class='line'>        <span class="kt">void</span> <span class="n">getUri</span><span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">libecap</span><span class="o">::</span><span class="n">Message</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="p">);</span>
</span><span class='line'>        <span class="kt">void</span> <span class="n">goToUrl</span><span class="p">(</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">orgUrl</span><span class="p">,</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">host</span><span class="p">,</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">state</span><span class="p">);</span>
</span><span class='line'>        <span class="kt">void</span> <span class="n">debugAction</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="o">&amp;</span><span class="n">action</span><span class="p">,</span><span class="k">const</span> <span class="kt">bool</span> <span class="o">&amp;</span><span class="n">showOrgUrl</span><span class="o">=</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'>        <span class="n">libecap</span><span class="o">::</span><span class="n">host</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">lastHostCall</span><span class="p">();</span> <span class="c1">// clears hostx</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">private</span><span class="o">:</span>
</span><span class='line'>        <span class="n">CLRLP</span> <span class="n">requestLine</span><span class="p">;</span>
</span><span class='line'>        <span class="n">libecap</span><span class="o">::</span><span class="n">Area</span> <span class="n">uri</span><span class="p">;</span> <span class="c1">// Request-URI from headers, for logging</span>
</span><span class='line'>        <span class="n">libecap</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="k">const</span> <span class="n">Service</span><span class="o">&gt;</span> <span class="n">service</span><span class="p">;</span> <span class="c1">// configuration access</span>
</span><span class='line'>        <span class="n">libecap</span><span class="o">::</span><span class="n">host</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">hostx</span><span class="p">;</span> <span class="c1">// Host transaction rep</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">typedef</span> <span class="k">enum</span> <span class="p">{</span> <span class="n">opUndecided</span><span class="p">,</span> <span class="n">opOn</span><span class="p">,</span> <span class="n">opComplete</span><span class="p">,</span> <span class="n">opNever</span> <span class="p">}</span> <span class="n">OperationState</span><span class="p">;</span>
</span><span class='line'>        <span class="k">typedef</span> <span class="k">enum</span> <span class="p">{</span> <span class="n">localWebServer</span><span class="p">,</span> <span class="n">normal</span> <span class="p">}</span> <span class="n">OprationAdaptedState</span><span class="p">;</span>
</span><span class='line'>        <span class="n">OperationState</span> <span class="n">receivingVb</span><span class="p">;</span>
</span><span class='line'>        <span class="n">OperationState</span> <span class="n">sendingAb</span><span class="p">;</span>
</span><span class='line'>        <span class="n">OprationAdaptedState</span> <span class="n">adaptedGotoAction</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">static</span> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">CfgErrorPrefix</span> <span class="o">=</span>
</span><span class='line'>    <span class="s">&quot;eBBkanba Adapter: configuration error: &quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span> <span class="c1">// namespace Adapter</span>
</span><span class='line'>
</span><span class='line'><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">uri</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;ecap://bbkanba.com/bbkanba&quot;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">tag</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">PACKAGE_VERSION</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">describe</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">os</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">os</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;A eBBkanba adapter from &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">PACKAGE_NAME</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; v&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">PACKAGE_VERSION</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">configure</span><span class="p">(</span><span class="k">const</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Options</span> <span class="o">&amp;</span><span class="n">cfg</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">reconfigure</span><span class="p">(</span><span class="k">const</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Options</span> <span class="o">&amp;</span><span class="n">cfg</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">start</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">libecap</span><span class="o">::</span><span class="n">adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">start</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">stop</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">libecap</span><span class="o">::</span><span class="n">adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">stop</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">retire</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">libecap</span><span class="o">::</span><span class="n">adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">stop</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">bool</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">wantsUrl</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">url</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="kc">true</span><span class="p">;</span> <span class="c1">// no-op is applied to all messages</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">libecap</span><span class="o">::</span><span class="n">adapter</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="o">::</span><span class="n">makeXaction</span><span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">host</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">hostx</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">new</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">tr1</span><span class="o">::</span><span class="n">static_pointer_cast</span><span class="o">&lt;</span><span class="n">Service</span><span class="o">&gt;</span><span class="p">(</span><span class="n">self</span><span class="p">),</span><span class="n">hostx</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">Xaction</span><span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">Service</span><span class="o">&gt;</span> <span class="n">aService</span><span class="p">,</span><span class="n">libecap</span><span class="o">::</span><span class="n">host</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">x</span><span class="p">)</span><span class="o">:</span>
</span><span class='line'>    <span class="n">service</span><span class="p">(</span><span class="n">aService</span><span class="p">),</span>
</span><span class='line'>    <span class="n">hostx</span><span class="p">(</span><span class="n">x</span><span class="p">),</span>
</span><span class='line'>    <span class="n">receivingVb</span><span class="p">(</span><span class="n">opUndecided</span><span class="p">),</span>
</span><span class='line'>    <span class="n">sendingAb</span><span class="p">(</span><span class="n">opUndecided</span><span class="p">),</span>
</span><span class='line'>    <span class="n">adaptedGotoAction</span><span class="p">(</span><span class="n">normal</span><span class="p">){</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::~</span><span class="n">Xaction</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">host</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">x</span> <span class="o">=</span> <span class="n">hostx</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">hostx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>        <span class="n">requestLine</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>        <span class="n">x</span><span class="o">-&gt;</span><span class="n">adaptationAborted</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Area</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">option</span><span class="p">(</span><span class="k">const</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Name</span> <span class="o">&amp;</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Area</span><span class="p">();</span> <span class="c1">// this transaction has no meta-information</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">visitEachOption</span><span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">NamedValueVisitor</span> <span class="o">&amp;</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// this transaction has no meta-information to pass to the visitor</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">start</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">hostx</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//static int scannerCount = 0;</span>
</span><span class='line'>    <span class="c1">//++scannerCount;</span>
</span><span class='line'>    <span class="c1">//Debugger(ilNormal|flApplication) &lt;&lt; &quot;eBBkanba: &quot; &lt;&lt; &quot;Initializing eBBkanba engine #&quot; &lt;&lt; scannerCount &lt;&lt; &quot;.&quot;;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//查看请求是否包含http头以外的数据</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">hostx</span><span class="o">-&gt;</span><span class="n">virgin</span><span class="p">().</span><span class="n">body</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">receivingVb</span> <span class="o">=</span> <span class="n">opOn</span><span class="p">;</span>
</span><span class='line'>        <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">vbMake</span><span class="p">();</span> <span class="c1">// ask host to supply virgin body</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// we are not interested in vb if there is not one</span>
</span><span class='line'>        <span class="n">receivingVb</span> <span class="o">=</span> <span class="n">opNever</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//获取用户ip</span>
</span><span class='line'>    <span class="n">libecap</span><span class="o">::</span><span class="n">Header</span><span class="o">::</span><span class="n">Value</span> <span class="n">clientIP</span> <span class="o">=</span> <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">option</span><span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">metaClientIp</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/* adapt message header ,copy一份http请求的纯原始副本,然后下面可能会修改内容*/</span>
</span><span class='line'>    <span class="n">libecap</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">libecap</span><span class="o">::</span><span class="n">Message</span><span class="o">&gt;</span> <span class="n">adapted</span> <span class="o">=</span> <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">virgin</span><span class="p">().</span><span class="n">clone</span><span class="p">();</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">adapted</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'>    <span class="c1">// delete ContentLength header because we may change the length</span>
</span><span class='line'>    <span class="c1">// unknown length may have performance implications for the host</span>
</span><span class='line'>    <span class="c1">//获取用户请求的url</span>
</span><span class='line'>    <span class="n">getUri</span><span class="p">(</span><span class="n">adapted</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">uri</span><span class="p">.</span><span class="n">size</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">//adapted-&gt;header().removeAny(libecap::headerContentLength);</span>
</span><span class='line'>        <span class="n">uri</span><span class="o">::</span><span class="n">uri</span> <span class="n">url_path</span><span class="p">(</span><span class="n">uri</span><span class="p">.</span><span class="n">toString</span><span class="p">());</span>
</span><span class='line'>        <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">url_path_tolower</span> <span class="o">=</span> <span class="n">url_path</span><span class="p">.</span><span class="n">host</span><span class="p">();</span>
</span><span class='line'>        <span class="n">std</span><span class="o">::</span><span class="n">transform</span><span class="p">(</span><span class="n">url_path_tolower</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">url_path_tolower</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span><span class="n">url_path_tolower</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="o">::</span><span class="n">tolower</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">url_path_tolower</span> <span class="o">!=</span> <span class="s">&quot;127.0.0.1&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">http</span><span class="o">::</span><span class="n">client</span><span class="o">::</span><span class="n">response</span> <span class="n">response</span> <span class="o">=</span> <span class="n">http</span><span class="o">::</span><span class="n">client</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="n">http</span><span class="o">::</span><span class="n">request</span><span class="p">(</span><span class="s">&quot;http://127.0.0.1:9090/check.php?uip=&quot;</span><span class="o">+</span><span class="n">clientIP</span><span class="p">.</span><span class="n">toString</span><span class="p">()));</span>
</span><span class='line'>            <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">check</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="p">(</span><span class="n">body</span><span class="p">(</span><span class="n">response</span><span class="p">));</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span> <span class="n">check</span> <span class="o">==</span> <span class="s">&quot;0&quot;</span> <span class="p">){</span>
</span><span class='line'>                <span class="c1">//则表示用户没有经过认证</span>
</span><span class='line'>                <span class="n">goToUrl</span><span class="p">(</span><span class="n">uri</span><span class="p">.</span><span class="n">toString</span><span class="p">(),</span><span class="s">&quot;http://127.0.0.1:9090&quot;</span><span class="p">,</span><span class="s">&quot;0&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">if</span><span class="p">(</span> <span class="n">check</span> <span class="o">==</span> <span class="s">&quot;1&quot;</span> <span class="p">){</span>
</span><span class='line'>                <span class="c1">//表示已经过期</span>
</span><span class='line'>                <span class="n">goToUrl</span><span class="p">(</span><span class="n">uri</span><span class="p">.</span><span class="n">toString</span><span class="p">(),</span><span class="s">&quot;http://127.0.0.1:9090&quot;</span><span class="p">,</span><span class="s">&quot;1&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 最后返回我们修改过的用户请求</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">adapted</span><span class="o">-&gt;</span><span class="n">body</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">sendingAb</span> <span class="o">=</span> <span class="n">opNever</span><span class="p">;</span> <span class="c1">// there is nothing to send</span>
</span><span class='line'>        <span class="n">lastHostCall</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">useAdapted</span><span class="p">(</span><span class="n">adapted</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">useAdapted</span><span class="p">(</span><span class="n">adapted</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">stop</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">hostx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="n">requestLine</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">abDiscard</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">sendingAb</span> <span class="o">==</span> <span class="n">opUndecided</span><span class="p">);</span> <span class="c1">// have not started yet</span>
</span><span class='line'>    <span class="n">sendingAb</span> <span class="o">=</span> <span class="n">opNever</span><span class="p">;</span>
</span><span class='line'>    <span class="c1">// we do not need more vb if the host is not interested in ab</span>
</span><span class='line'>    <span class="n">stopVb</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">abMake</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">sendingAb</span> <span class="o">==</span> <span class="n">opUndecided</span><span class="p">);</span> <span class="c1">// have not yet started or decided not to send</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">hostx</span><span class="o">-&gt;</span><span class="n">virgin</span><span class="p">().</span><span class="n">body</span><span class="p">());</span> <span class="c1">// that is our only source of ab content</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// we are or were receiving vb</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">receivingVb</span> <span class="o">==</span> <span class="n">opOn</span> <span class="o">||</span> <span class="n">receivingVb</span> <span class="o">==</span> <span class="n">opComplete</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">sendingAb</span> <span class="o">=</span> <span class="n">opOn</span><span class="p">;</span>
</span><span class='line'>    <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">noteAbContentAvailable</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">abMakeMore</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">receivingVb</span> <span class="o">==</span> <span class="n">opOn</span><span class="p">);</span> <span class="c1">// a precondition for receiving more vb</span>
</span><span class='line'>    <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">vbMakeMore</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">abStopMaking</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">sendingAb</span> <span class="o">=</span> <span class="n">opComplete</span><span class="p">;</span>
</span><span class='line'>    <span class="c1">// we do not need more vb if the host is not interested in more ab</span>
</span><span class='line'>    <span class="n">stopVb</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">libecap</span><span class="o">::</span><span class="n">Area</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">abContent</span><span class="p">(</span><span class="n">size_type</span> <span class="n">offset</span><span class="p">,</span> <span class="n">size_type</span> <span class="n">size</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">sendingAb</span> <span class="o">==</span> <span class="n">opOn</span> <span class="o">||</span> <span class="n">sendingAb</span> <span class="o">==</span> <span class="n">opComplete</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">vbContent</span><span class="p">(</span><span class="n">offset</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">abContentShift</span><span class="p">(</span><span class="n">size_type</span> <span class="n">size</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">sendingAb</span> <span class="o">==</span> <span class="n">opOn</span> <span class="o">||</span> <span class="n">sendingAb</span> <span class="o">==</span> <span class="n">opComplete</span><span class="p">);</span>
</span><span class='line'>    <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">vbContentShift</span><span class="p">(</span><span class="n">size</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">noteVbContentDone</span><span class="p">(</span><span class="kt">bool</span> <span class="n">atEnd</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">receivingVb</span> <span class="o">==</span> <span class="n">opOn</span><span class="p">);</span>
</span><span class='line'>    <span class="n">receivingVb</span> <span class="o">=</span> <span class="n">opComplete</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">sendingAb</span> <span class="o">==</span> <span class="n">opOn</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">noteAbContentDone</span><span class="p">(</span><span class="n">atEnd</span><span class="p">);</span>
</span><span class='line'>        <span class="n">sendingAb</span> <span class="o">=</span> <span class="n">opComplete</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">noteVbContentAvailable</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">receivingVb</span> <span class="o">==</span> <span class="n">opOn</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">sendingAb</span> <span class="o">==</span> <span class="n">opOn</span><span class="p">)</span>
</span><span class='line'>        <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">noteAbContentAvailable</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">bool</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">callable</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">hostx</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// no point to call us if we are done</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// tells the host that we are not interested in [more] vb</span>
</span><span class='line'><span class="c1">// if the host does not know that already</span>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">stopVb</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">receivingVb</span> <span class="o">==</span> <span class="n">opOn</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">hostx</span><span class="o">-&gt;</span><span class="n">vbStopMaking</span><span class="p">();</span>
</span><span class='line'>        <span class="n">receivingVb</span> <span class="o">=</span> <span class="n">opComplete</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// we already got the entire body or refused it earlier</span>
</span><span class='line'>        <span class="n">Must</span><span class="p">(</span><span class="n">receivingVb</span> <span class="o">!=</span> <span class="n">opUndecided</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">//重新定位请求地址,到用户认证页面,并把用户请求url作为参数传入</span>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">goToUrl</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">orgUrl</span><span class="p">,</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">new_host</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">state</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">new_url_path</span> <span class="o">=</span> <span class="n">new_host</span> <span class="o">+</span> <span class="s">&quot;/?state=&quot;</span> <span class="o">+</span> <span class="n">state</span> <span class="o">+</span> <span class="s">&quot;&amp;orgUrl=&quot;</span> <span class="o">+</span> <span class="n">orgUrl</span><span class="p">;</span>
</span><span class='line'>    <span class="k">const</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Header</span><span class="o">::</span><span class="n">Value</span> <span class="n">new_url_path_r</span> <span class="o">=</span> <span class="n">libecap</span><span class="o">::</span><span class="n">Area</span><span class="o">::</span><span class="n">FromTempString</span><span class="p">(</span><span class="n">new_url_path</span><span class="p">);</span>
</span><span class='line'>    <span class="n">debugAction</span><span class="p">(</span><span class="s">&quot;new URL: &quot;</span> <span class="o">+</span> <span class="n">new_url_path</span><span class="p">);</span>
</span><span class='line'>    <span class="n">requestLine</span><span class="o">-&gt;</span><span class="n">uri</span><span class="p">(</span><span class="n">new_url_path_r</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">getUri</span><span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">libecap</span><span class="o">::</span><span class="n">Message</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">adapted</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">hostx</span><span class="p">)</span>
</span><span class='line'>        <span class="k">return</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="n">requestLine</span> <span class="o">=</span> <span class="k">dynamic_cast</span><span class="o">&lt;</span><span class="n">CLRLP</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">adapted</span><span class="o">-&gt;</span><span class="n">firstLine</span><span class="p">()))</span> <span class="p">)</span>
</span><span class='line'>        <span class="n">uri</span> <span class="o">=</span> <span class="n">requestLine</span><span class="o">-&gt;</span><span class="n">uri</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">debugAction</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="o">&amp;</span><span class="n">actDescript</span><span class="p">,</span><span class="k">const</span> <span class="kt">bool</span> <span class="o">&amp;</span><span class="n">showOrgUrl</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">descipt</span> <span class="p">(</span><span class="n">actDescript</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="n">showOrgUrl</span><span class="p">)</span>
</span><span class='line'>        <span class="n">descipt</span> <span class="o">+=</span> <span class="s">&quot; ( org URL: &quot;</span> <span class="o">+</span> <span class="n">uri</span><span class="p">.</span><span class="n">toString</span><span class="p">()</span> <span class="o">+</span> <span class="s">&quot; )&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="n">Debugger</span><span class="p">(</span><span class="n">ilNormal</span><span class="o">|</span><span class="n">flApplication</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;eBBkanba: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">descipt</span> <span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// this method is used to make the last call to hostx transaction</span>
</span><span class='line'><span class="c1">// last call may delete adapter transaction if the host no longer needs it</span>
</span><span class='line'><span class="c1">// TODO: replace with hostx-independent &quot;done&quot; method</span>
</span><span class='line'><span class="n">libecap</span><span class="o">::</span><span class="n">host</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">Adapter</span><span class="o">::</span><span class="n">Xaction</span><span class="o">::</span><span class="n">lastHostCall</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">libecap</span><span class="o">::</span><span class="n">host</span><span class="o">::</span><span class="n">Xaction</span> <span class="o">*</span><span class="n">x</span> <span class="o">=</span> <span class="n">hostx</span><span class="p">;</span>
</span><span class='line'>    <span class="n">Must</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
</span><span class='line'>    <span class="n">hostx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="n">requestLine</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">x</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// create the adapter and register with libecap to reach the host application</span>
</span><span class='line'><span class="k">static</span> <span class="k">const</span> <span class="kt">bool</span> <span class="n">Registered</span> <span class="o">=</span> <span class="p">(</span><span class="n">libecap</span><span class="o">::</span><span class="n">RegisterService</span><span class="p">(</span><span class="k">new</span> <span class="n">Adapter</span><span class="o">::</span><span class="n">Service</span><span class="p">),</span> <span class="kc">true</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>可以下载我写的上面的例子文件<a href="http://leolovenet.com/downloads/files/eCAP_bbkanba_Adapter-0.0.1.tar.gz">eCAP_bbkanba_Adapter-0.0.1.tar.gz</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Xcode编译的app程序打包为ipa文件]]></title>
    <link href="http://leolovenet.com/blog/2013/02/22/xcode-package-application-to-ipa/"/>
    <updated>2013-02-22T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/02/22/xcode-package-application-to-ipa</id>
    <content type="html"><![CDATA[<p>正确的方法是利用Xcode,The right way is –>&ldquo;Xcode menu&rdquo; –> Project –> Archive –> &ldquo;Xcode menu Window&rdquo; –> &ldquo;Organizer&rdquo; –> &ldquo;Organizer – Archives&rdquo; –> Distribute –> &ldquo;Save for Enterpirs of Ad-Hoc Deployment&rdquo; –> next –> ***.ipa –> done.</p>

<!-- more -->


<p><del datetime="2013-03-09T14:05:58+00:00">新年回来以后的第一篇文章。</del></p>

<p><del datetime="2013-03-09T14:14:19+00:00">项目需要将测试版本的app发到外地客户的iphone上测试效果,这时就需要客户手机的UDID，将他的手机UDID添加到开发团队里，创建新的签名，使用新的签名编译程序导出ipa文件，将ipa文件传输给远在外地的客户,让客户通过itunes安装上。</del></p>

<p><del datetime="2013-03-09T14:14:19+00:00">这样相比开发,测试,上传到app store里,等待apple审核通过,客户在安装测试,要省不知多少时间（当然客户的手机如果越狱了那就没有必要这么麻烦了）. 下面我就具体说一下上面的操作过程,主要是将xcode编译的app变为ipa文件的过程.</del></p>

<p><del datetime="2013-03-09T14:14:19+00:00">1、登陆<a href="https://developer.apple.com/ios/manage/overview/index.action" target="_blank">iOS Provisioning Portal</a>，登入新的手机UDID,创建新的签名文件.</del></p>

<p><del datetime="2013-03-09T14:14:19+00:00">2、xcode打开Organizer(⌘+shift+2), Devices标签下,左边Provisioning Profiles标签下，点击下面的Refresh,将新创建的签名下载下来。</del></p>

<p><del datetime="2013-03-09T14:14:19+00:00">3、在项目的targets下指定用新的签名.</del></p>

<p><del datetime="2013-03-09T14:14:19+00:00">4、编译好的app，右击在Finder下显示.(如果显示不了,打开Finder,⌘+shift+G,输入~/Library/Developer/Xcode/DerivedData,找到XXX-<strong><em>**/Build/Products/</em></strong>/XXX.app).</del></p>

<p><del datetime="2013-03-09T14:14:19+00:00">5、打开iTunes,切换置App标签，将XXX.app鼠标拖放置iTunes的App标签内.</del></p>

<p><del datetime="2013-03-09T14:14:19+00:00">6、在iTunes的XXX.app上,右击,选择&#8221;Show in finder&#8221;。现在你就有了你的ipa文件了。</del></p>

<p><del datetime="2013-03-09T14:14:19+00:00">因为这个ipa已经是用最新的签名编译好了的，所以，它可以直接在客户的机器上安装。</del></p>

<p><del datetime="2013-03-09T14:14:19+00:00">传输给客户后，让客户双击ipa文件，默认自动导入到客户的iTunes的app标签下，让客户使用数据线链接自己的iphone，然后在itunes里选中iphone，切换到iphone的app标签下，找到XXX,此时在右边会有一个安装的按钮，点击，然后点击下面的应用，之后点击同步就可以了。</del></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Xcode 快捷键收集整理]]></title>
    <link href="http://leolovenet.com/blog/2013/01/28/xcode-keyboard-shortcuts/"/>
    <updated>2013-01-28T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/01/28/xcode-keyboard-shortcuts</id>
    <content type="html"><![CDATA[<p>最近工作比较忙,没有什么时间学习ios,用xcode的时间就更少了,所以以前记得那些快捷键现在都有些生疏,今天又学习了几个,想到整理一下,以后遇到更多的再慢慢添加,慢慢完善.<br/>
以下是感觉经常用到的很有用的一些:</p>

<pre>
鼠标三击     选中当前行
⌘+/  当前行添加注视符//
⌘+shift+1  打开welecome to Xcode窗口
⌘+shift+2  打开Organizer窗口
选中方法后按control+option+⌘+/  迅速在Organizer-Documentation中查看帮助信息
⌘+~ 再主窗口与Documentation之间切换我经常用到的
option+鼠标左击 迅速查看简短帮助信息
⌘+鼠标左击 定位到方法或属性声明的位置
⌘+0  隐藏、显示Utilities区域
⌘+option+0 现实、隐藏Navigator区域

⌘+]  代码向右缩进
⌘+[  代码向左缩进
option+⌘+[ 向上移动行
option+⌘+] 向下移动行

⌃+⌘+E Edit all in scope
⌃I Re-indent code

Ctrl+a 去行首
Ctrl+k 删除到行尾
Ctrl+a+k+k  删除当前行

鼠标双指再触摸板来回滑动可以来回切换编辑的文件或者
Ctrl+⌘+Left/Right  在文件编辑器中前进或者后退 
Ctrl+⌘+Up/Down  在.h与.m文件之间切换
⌘+\  添加、删除断点

⌘+R 编译运行
</pre>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[squid-3.2.5 CentOS X86_64 Configure: Error: C Compiler Cannot Create Executables]]></title>
    <link href="http://leolovenet.com/blog/2013/01/28/squid-3-2-5-centos-x86_64-configure-error-c-compiler-cannot-create-executables/"/>
    <updated>2013-01-28T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/01/28/squid-3-2-5-centos-x86_64-configure-error-c-compiler-cannot-create-executables</id>
    <content type="html"><![CDATA[<p>squid-3.2.5 在CentOS X86_64位的环境下默认配置编译会遇到错误，如下:</p>

<pre>
checking whether the C compiler works... no
configure: error: in `/opt/packages/goodlePackages/squid/squid_src/squid-3.2.5':
configure: error: C compiler cannot create executables
</pre>


<p>x86_64解决办法如下:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>./configure <span class="nv">CXXFLAGS</span><span class="o">=</span><span class="s2">&quot;-g -O2&quot;</span>  <span class="nv">CFLAGS</span><span class="o">=</span><span class="s2">&quot;-O2 -march=x86-64&quot;</span> --prefix<span class="o">=</span>/usr/local/squid
</span><span class='line'>make
</span><span class='line'>make install
</span></code></pre></td></tr></table></div></figure>


<p>i686</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>./configure -disable-64bit <span class="nv">CFLAGS</span><span class="o">=</span><span class="s2">&quot;-O3 -march=i686&quot;</span> --prefix<span class="o">=</span>/usr/local/squid
</span><span class='line'>make
</span><span class='line'>make install
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mac 下的 Open命令]]></title>
    <link href="http://leolovenet.com/blog/2013/01/25/the-open-command/"/>
    <updated>2013-01-25T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/01/25/the-open-command</id>
    <content type="html"><![CDATA[<p>mac下的应用程序是一个有结构的目录(想在Finder下查看程序目录内容,可以在程序目录上右击选择 &ldquo;Show Package Contents&rdquo; 像下图一样).</p>

<p><img src="http://leolovenet.com/downloads/images/open-command.png" title="open command example" alt="open-command.png" /></p>

<p>安装程序也是简单的把这个目录copy到你想要的地方就可以，大部分是 ~/Application 或者 /Application 下.</p>

<p>但想要在命令行下运行程序怎么办？你总不能在命令行下运行一个目录吧！</p>

<p>这个时候发现了<code>/usr/bin/open</code>命令,就是干这个的.</p>

<p>比如,我想在命令行下运行Firefox,运行下面的命令即可</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>open -a /Applications/Firefox.app
</span></code></pre></td></tr></table></div></figure>


<p>想在命令行下,用 Finder 打开此时的路径的话,运行下面的命令</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>open ./
</span></code></pre></td></tr></table></div></figure>


<p>想要用系统默认程序打开响应的文件,运行下面的命令</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>open Readme.md
</span></code></pre></td></tr></table></div></figure>


<p>open命令的其他参数:</p>

<pre>
/usr/bin/open --help
open: unrecognized option `--help'
Usage: open [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-b &lt;bundle identifier>] [-a &lt;application>] [filenames] [--args arguments]
Help: Open opens files from a shell.
      By default, opens each file using the default application for that file.  
      If the file is in the form of a URL, the file will be opened as a URL.
Options: 
      -a                Opens with the specified application.
      -b                Opens with the specified application bundle identifier.
      -e                Opens with TextEdit.
      -t                Opens with default text editor.
      -f                Reads input from standard input and opens with TextEdit.
      -F  --fresh       Launches the app fresh, that is, without restoring windows. Saved persistent state is lost, excluding Untitled documents.
      -R, --reveal      Selects in the Finder instead of opening.
      -W, --wait-apps   Blocks until the used applications are closed (even if they were already running).
          --args        All remaining arguments are passed in argv to the application's main() function instead of opened.
      -n, --new         Open a new instance of the application even if one is already running.
      -j, --hide        Launches the app hidden.
      -g, --background  Does not bring the application to the foreground.
      -h, --header      Searches header file locations for headers matching the given filenames, and opens them.
</pre>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Windows Office Excel Vba Script 一例]]></title>
    <link href="http://leolovenet.com/blog/2013/01/21/my-windows-office-excel-vba-script/"/>
    <updated>2013-01-21T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/01/21/my-windows-office-excel-vba-script</id>
    <content type="html"><![CDATA[<p>上周学习vba的总结.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
</pre></td><td class='code'><pre><code class='vbnet'><span class='line'><span class="k">Sub</span> <span class="nf">getData</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">&#39;单引号开始的是注视行</span>
</span><span class='line'>    <span class="c">&#39;声明变量</span>
</span><span class='line'>    <span class="k">Dim</span> <span class="n">RowNumMax</span> <span class="ow">As</span> <span class="kt">Integer</span><span class="p">,</span> <span class="n">RowNumMax2</span> <span class="ow">As</span> <span class="kt">Integer</span>
</span><span class='line'>    <span class="k">Dim</span> <span class="n">ASht</span> <span class="ow">As</span> <span class="n">Worksheet</span><span class="p">,</span> <span class="n">BSht</span> <span class="ow">As</span> <span class="n">Worksheet</span>
</span><span class='line'>    <span class="k">Dim</span> <span class="n">Site</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">&#39;根据表格名字获得表格,并赋值个变量</span>
</span><span class='line'>    <span class="k">Set</span> <span class="n">ASht</span> <span class="o">=</span> <span class="n">Sheets</span><span class="p">(</span><span class="s">&quot;Sheet1&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">Set</span> <span class="n">BSht</span> <span class="o">=</span> <span class="n">Sheets</span><span class="p">(</span><span class="s">&quot;Sheet2&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="c">&#39;锁定屏幕更新</span>
</span><span class='line'>    <span class="n">Application</span><span class="p">.</span><span class="n">ScreenUpdating</span> <span class="o">=</span> <span class="k">False</span>
</span><span class='line'>    <span class="k">On</span> <span class="k">Error</span> <span class="k">Resume</span> <span class="k">Next</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">&#39;检查表格数据</span>
</span><span class='line'>    <span class="c">&#39;定位数据的函数有两个Range 或者 Cells</span>
</span><span class='line'>    <span class="c">&#39;Range是表示法是Range(&quot;E2&quot;)</span>
</span><span class='line'>    <span class="c">&#39;Cells的表示法是坐标类似Cells(1,1)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">If</span> <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;E2&quot;</span><span class="p">)</span> <span class="o">=</span> <span class="s">&quot;&quot;</span> <span class="k">Then</span>
</span><span class='line'>    <span class="n">MsgBox</span> <span class="s">&quot;E2列中没有网站数据&quot;</span>
</span><span class='line'>    <span class="n">ASht</span><span class="p">.</span><span class="n">Activate</span>
</span><span class='line'>    <span class="n">ASht</span><span class="p">.</span><span class="n">Cells</span><span class="p">.</span><span class="n">Select</span>
</span><span class='line'>    <span class="k">End</span>
</span><span class='line'>    <span class="k">End</span> <span class="k">If</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">ASht</span><span class="p">.</span><span class="n">Select</span>
</span><span class='line'>    <span class="n">RowNumMax</span> <span class="o">=</span> <span class="n">ASht</span><span class="p">.</span><span class="err">[</span><span class="n">E65536</span><span class="err">]</span><span class="p">.</span><span class="n">End</span><span class="p">(</span><span class="n">xlUp</span><span class="p">).</span><span class="n">Row</span>   <span class="c">&#39;E列最下面一行的行数，中间有空格也行</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">BSht</span><span class="p">.</span><span class="n">Select</span>
</span><span class='line'>    <span class="n">RowNumMax2</span> <span class="o">=</span> <span class="n">BSht</span><span class="p">.</span><span class="err">[</span><span class="n">A65536</span><span class="err">]</span><span class="p">.</span><span class="n">End</span><span class="p">(</span><span class="n">xlUp</span><span class="p">).</span><span class="n">Row</span>
</span><span class='line'>    <span class="n">BSht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;A2:A&quot;</span> <span class="o">&amp;</span> <span class="n">RowNumMax2</span><span class="p">).</span><span class="n">ClearFormats</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">&#39;清除格式</span>
</span><span class='line'>    <span class="n">ASht</span><span class="p">.</span><span class="n">Select</span>
</span><span class='line'>    <span class="n">ASht</span><span class="p">.</span><span class="n">Cells</span><span class="p">.</span><span class="n">Select</span>
</span><span class='line'>    <span class="n">Selection</span><span class="p">.</span><span class="n">ClearFormats</span>
</span><span class='line'>    <span class="c">&#39;快捷设置选中单元格de属性</span>
</span><span class='line'>    <span class="k">With</span> <span class="n">Selection</span><span class="p">.</span><span class="n">Interior</span>
</span><span class='line'>        <span class="p">.</span><span class="n">Pattern</span> <span class="o">=</span> <span class="n">xlNone</span>
</span><span class='line'>        <span class="p">.</span><span class="n">TintAndShade</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>        <span class="p">.</span><span class="n">PatternTintAndShade</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>    <span class="k">End</span> <span class="k">With</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">&#39;for循环</span>
</span><span class='line'>    <span class="k">For</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">To</span> <span class="n">RowNumMax</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>        <span class="n">Site</span> <span class="o">=</span> <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;E&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span>
</span><span class='line'>        <span class="c">&#39;不等于操作符 &amp;lt;&amp;gt;</span>
</span><span class='line'>        <span class="k">If</span> <span class="n">Site</span> <span class="o">&amp;</span><span class="n">lt</span><span class="err">;</span><span class="o">&amp;</span><span class="n">gt</span><span class="err">;</span> <span class="s">&quot;&quot;</span> <span class="k">Then</span>
</span><span class='line'>         <span class="c">&#39;MsgBox Site</span>
</span><span class='line'>          <span class="c">&#39;Unique</span>
</span><span class='line'>           <span class="k">For</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">To</span> <span class="n">RowNumMax</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>               <span class="k">If</span> <span class="n">a</span> <span class="o">&amp;</span><span class="n">lt</span><span class="err">;</span><span class="o">&amp;</span><span class="n">gt</span><span class="err">;</span> <span class="n">x</span> <span class="k">Then</span>
</span><span class='line'>                    <span class="k">If</span> <span class="n">Site</span> <span class="o">=</span> <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;E&quot;</span> <span class="o">&amp;</span> <span class="n">a</span><span class="p">)</span> <span class="k">Then</span>
</span><span class='line'>                        <span class="n">MsgBox</span> <span class="s">&quot;E&quot;</span> <span class="o">&amp;</span> <span class="n">a</span> <span class="o">&amp;</span> <span class="s">&quot;跟E&quot;</span> <span class="o">&amp;</span> <span class="n">x</span> <span class="o">&amp;</span> <span class="s">&quot;重复，整理被迫中断&quot;</span>
</span><span class='line'>                    <span class="k">End</span>
</span><span class='line'>                <span class="k">End</span> <span class="k">If</span>
</span><span class='line'>               <span class="k">End</span> <span class="k">If</span>
</span><span class='line'>           <span class="k">Next</span> <span class="n">a</span>
</span><span class='line'>
</span><span class='line'>         <span class="k">For</span> <span class="n">xx</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">To</span> <span class="n">RowNumMax2</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>             <span class="c">&#39;MsgBox BSht.Range(&quot;A&quot; &amp; xx)</span>
</span><span class='line'>             <span class="c">&#39;If xx &amp;gt; 3 Then</span>
</span><span class='line'>             <span class="c">&#39;Exit For</span>
</span><span class='line'>             <span class="c">&#39;End If</span>
</span><span class='line'>             <span class="k">If</span> <span class="n">Trim</span><span class="p">(</span><span class="n">Site</span><span class="p">)</span> <span class="o">=</span> <span class="n">Trim</span><span class="p">(</span><span class="n">BSht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;A&quot;</span> <span class="o">&amp;</span> <span class="n">xx</span><span class="p">))</span> <span class="k">Then</span>
</span><span class='line'>               <span class="n">BSht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;A&quot;</span> <span class="o">&amp;</span> <span class="n">xx</span><span class="p">).</span><span class="n">Interior</span><span class="p">.</span><span class="n">ColorIndex</span> <span class="o">=</span> <span class="mi">15</span>
</span><span class='line'>              <span class="c">&#39;MsgBox &quot;A&quot; &amp; xx</span>
</span><span class='line'>              <span class="c">&#39;字符串处理函数Trim去除字符串开头结尾的空格符号,跟php的一样</span>
</span><span class='line'>              <span class="c">&#39;换行符常量,vbLf</span>
</span><span class='line'>              <span class="c">&#39;利用Replace函数删除换行符              </span>
</span><span class='line'>               <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;F&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="n">Replace</span><span class="p">(</span><span class="n">Trim</span><span class="p">(</span><span class="n">BSht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;H&quot;</span> <span class="o">&amp;</span> <span class="n">xx</span><span class="p">)),</span> <span class="n">vbLf</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>               <span class="c">&#39;ASht.Range(&quot;G&quot; &amp; x) = Trim(BSht.Range(&quot;K&quot; &amp; xx))</span>
</span><span class='line'>               <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;H&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="n">Replace</span><span class="p">(</span><span class="n">Trim</span><span class="p">(</span><span class="n">BSht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;C&quot;</span> <span class="o">&amp;</span> <span class="n">xx</span><span class="p">)),</span> <span class="n">vbLf</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>               <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;J&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="n">Replace</span><span class="p">(</span><span class="n">Trim</span><span class="p">(</span><span class="n">BSht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;B&quot;</span> <span class="o">&amp;</span> <span class="n">xx</span><span class="p">)),</span> <span class="n">vbLf</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>               <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;K&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="n">Replace</span><span class="p">(</span><span class="n">Trim</span><span class="p">(</span><span class="n">BSht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;F&quot;</span> <span class="o">&amp;</span> <span class="n">xx</span><span class="p">)),</span> <span class="n">vbLf</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>               <span class="c">&#39;MsgBox BSht.Range(&quot;F&quot; &amp; xx).Formula =</span>
</span><span class='line'>               <span class="c">&#39;BSht.Range(&quot;D&quot; &amp; xx).MergeArea.Cells(1, 1) 读取合并单元格的值</span>
</span><span class='line'>               <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;L&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="n">Replace</span><span class="p">(</span><span class="n">Trim</span><span class="p">(</span><span class="n">BSht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;D&quot;</span> <span class="o">&amp;</span> <span class="n">xx</span><span class="p">).</span><span class="n">MergeArea</span><span class="p">.</span><span class="n">Cells</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)),</span> <span class="n">vbLf</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>             <span class="k">End</span> <span class="k">If</span>
</span><span class='line'>
</span><span class='line'>         <span class="k">Next</span> <span class="n">xx</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">Else</span>
</span><span class='line'>
</span><span class='line'>         <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;F&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
</span><span class='line'>         <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;H&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
</span><span class='line'>         <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;J&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
</span><span class='line'>         <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;K&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
</span><span class='line'>         <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;L&quot;</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">End</span> <span class="k">If</span>
</span><span class='line'>        <span class="c">&#39;If x &amp;gt; 3 Then</span>
</span><span class='line'>        <span class="c">&#39;Exit For</span>
</span><span class='line'>        <span class="c">&#39;End If</span>
</span><span class='line'>    <span class="k">Next</span> <span class="n">x</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">ASht</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="s">&quot;F2:G53&quot;</span><span class="p">).</span><span class="n">ClearContents</span>
</span><span class='line'>    <span class="c">&#39;ASht.Range(&quot;G2:G5555&quot;).ClearContents</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Application</span><span class="p">.</span><span class="n">ScreenUpdating</span> <span class="o">=</span> <span class="k">True</span>
</span><span class='line'><span class="k">End</span> <span class="k">Sub</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Config Awstats on Window2003 or Linux With GeoIP/QQWry]]></title>
    <link href="http://leolovenet.com/blog/2013/01/19/awstats-window2003-iis-linux-nginx-lighttpd-geoip-qqwry/"/>
    <updated>2013-01-19T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/01/19/awstats-window2003-iis-linux-nginx-lighttpd-geoip-qqwry</id>
    <content type="html"><![CDATA[<p><img src="http://leolovenet.com/downloads/images/awstats.png" title="awstats example" alt="awstats.png" /></p>

<p>Awstats是一个日志分析工具(web log分析为强),很好很强大,不多解释,感兴趣的wiki一下。这是一个安装教程文章.</p>

<p>首先是awstas在windows 2003下与iis6的配置过程,然后是在Linux下和Nginx一起的配置，紧跟着Linux下与Lighttpd一起配置的过程,总之,这个可能是目前市面上最仔细全面安装awstas的教程了.</p>

<!--more-->


<p>Awstas官方网站de下载地址<a href="http://awstats.sourceforge.net/#DOWNLOAD">点击这里</a>.<br/>
目前为止最新版本是7.1 释放时间是 <strong>2012-12-20 18:32</strong></p>

<p>本文将会安装awstas的插件与启用的功能如下列表:</p>

<pre>
GeoIP       显示IP属于那个国家
GeoLiteCity 显示IP属于那个城市
hostinfo    可以查询IP的Whois信息
qqhostinfo  显示IP纯真版数据库de信息
decodeutfkeys   解决"用以搜索的关键词"乱码
timezone    解决windows平台下的日志时间差8小时问题
day-by-day  可以根据日期(以天为单位)查看日志的js
tooltips    显示一些详细的提示信息
AllowToUpdateStatsFromBrowser 允许通过浏览器执行更新,显示最新的日志分析结果
</pre>


<h2>1. Install Awstats with IIS6 under windowns 2003</h2>

<p>用Windows做服务器真心难用,所以安装配置起来最麻烦.<br/>
在windows平台下载Zip版本的<a href="http://prdownloads.sourceforge.net/awstats/awstats-7.1.zip">7.1稳定发行包</a></p>

<p>Awstas是用perl（一个夸平台脚本语言）写成的, 所以要在windows平台下工作的话,必须先安装搭建Perl语言环境. 在windows平台下, 我们需要安装ActivePerl的免费版本.<br/>
ActivePerl官方网站de下载地址<a href="http://www.activestate.com/activeperl">点击这里</a>,截止今天,最新版本是 <strong>5.16.2.1602</strong> ,在官方下载页面根据自己的操作系统选择下载64位还是32位的安装包.</p>

<p>安装过程直接点击下一步下一步就可以了.没有什么要特别要特别注意的,只是在选择安装路径的时候,如果不能默认的<code>c:\Perl</code>的话,就放到其他盘符里吧,类似<code>D:\Perl</code>,不要安装在乱七八糟的路径下,避免不必要的错误.验证安装是否完成的的办法,我认为最好的是注销一下当前用户,再登陆进来,然后点击<code>开始 &gt;&gt; 运行 &gt;&gt; cmd</code>,然后输入命令<code>perl -v</code>,看看反应,如果能正常打印perl的版本号的话,就说明安装的没有问题,反之,就不用再往下看了,因为必须解决这个问题才可以往下进行.</p>

<p>一般安装包会自动整合Perl的功能到IIS6中去,但如果你发现它没有做到的话,也不用着急,手动添加一下就好了,很容易,检查方法,打开 <code>"Internet 信息服务(IIS)管理器" – "Web服务扩展" – 查看右面"web 服务器扩展"</code> 列表里有没有Perl的字样.如果没有的话,就点击<code>添加一个新的web服务扩展</code>,如图1-1,填写扩展名(当然你也可以自己随便定义扩展名,只要你喜欢),然后点击添加按钮,然后根据你的Perl安装路径填写,比如,<code>c:\Perl\bin\perl.exe "%s" %s</code>,这里我的Perl安装路径是默认的<code>c:\Perl</code>, 如果你的不同,请做相应修改,点击确定完成. 这样你就可以通过浏览器查看perl在iis上的执行结果了,这是进行下面步骤的基础.</p>

<p>图1-1
<img src="http://leolovenet.com/downloads/images/awstats.1-1.png" alt="awstats.1-1.png" /></p>

<p>因为IIS6的默认日志格式很奇特,所以想要用awstas分析的话,需要修改一下默认的日志的格式.具体步骤,打开 &ldquo;Internet 信息服务(IIS)管理器&rdquo; ,在网站列表中找到你想要分析日志的网站,右击选择属性,在网站标签下,确保 &ldquo;启用日志记录&rdquo; 被勾选着,然后点击右边的属性按钮,确保日志计划是 &ldquo;每天&rdquo;, 勾选 &ldquo;文件命名和创建使用当地时间&rdquo;, 并记住 &ldquo;日志文件路径&rdquo; 待会我们会进到这个目录里(如图1-2).</p>

<p>图1-2<br/>
<img src="http://leolovenet.com/downloads/images/awstats.1-2.png" alt="awstats.1-2.png" /></p>

<p>然后点击高级标签(如图1-3).关键时刻来临了,兴奋起来吧!这里你真的不能出错,一定要再三检查你勾选的选项,不然很容易出错,还不容易发现.</p>

<p>图1-3
<img src="http://leolovenet.com/downloads/images/awstats.1-3.png" alt="awstats.1-3.png" /></p>

<p>请确保有且仅有以下几项是选中状态,不能多也不能少.</p>

<pre>
date
time
c-ip
cs-username
cs-method
cs-uri-stem
sc-status
sc-bytes
cs-version
cs(User-Agent)
cs(Referer)
</pre>


<p>然后点击确定,保存配置,再然后关掉网站,打开我的电脑,进入到上面说的 &ldquo;日志文件路径&rdquo; 中去,删除所有现有的日志,重新开始网站.</p>

<p>下面建立两个目录(当然你也可以建立在其他盘符,不过要记得修改以下所有步骤的路径):</p>

<pre>
#用于存放awstats的程序文件
C:\LogAnalyse\awstats
#用于存放awstats程序分析log之后的结果数据文件
C:\LogAnalyse\awstats_data_dir
</pre>


<p><span style="color: #d14;">右击awstats_data_dir目录选择属性,安全,添加Everyone的完全控制权限,不然无法从浏览器端更新.</span></p>

<p>将下载下来的zip包解压,并把<code>wwwroot</code>目录下的所有内容放到<code>C:\LogAnalyse\awstats</code>下.<br/>
进入到<code>C:\LogAnalyse\awstats\cgi-bin</code>目录下,新建一个叫<code>awstats.logWin.conf</code>的文件(必须叫这个名字,没得商量,待会要用的),然后输入下面的内容,注意修改<code>SiteDomain&lt;code&gt;与</code>LogFile</code>选项值.<br/>
如果你想知道具体每个选项的意思<a href="http://awstats.sourceforge.net/docs/awstats_config.html">点击这里查看官网说明</a></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
<span class='line-number'>162</span>
<span class='line-number'>163</span>
<span class='line-number'>164</span>
<span class='line-number'>165</span>
<span class='line-number'>166</span>
<span class='line-number'>167</span>
<span class='line-number'>168</span>
<span class='line-number'>169</span>
<span class='line-number'>170</span>
<span class='line-number'>171</span>
<span class='line-number'>172</span>
<span class='line-number'>173</span>
<span class='line-number'>174</span>
<span class='line-number'>175</span>
<span class='line-number'>176</span>
<span class='line-number'>177</span>
<span class='line-number'>178</span>
<span class='line-number'>179</span>
<span class='line-number'>180</span>
<span class='line-number'>181</span>
<span class='line-number'>182</span>
<span class='line-number'>183</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c"># AWSTATS CONFIGURE FILE</span>
</span><span class='line'><span class="c">#需要分析的日志路径,注意替成 C:/WINDOWS/system32/LogFiles/W3SVC952692957  为图1-2中你的网站日志路径</span>
</span><span class='line'><span class="nv">LogFile</span><span class="o">=</span><span class="s2">&quot;C:/WINDOWS/system32/LogFiles/W3SVC952692957/ex%YY-0%MM-0%DD-0.log&quot;</span>
</span><span class='line'><span class="nv">LogType</span><span class="o">=</span>W
</span><span class='line'><span class="c">#这个很重要,因为IIS6的日志不标准,木有办法啦</span>
</span><span class='line'><span class="nv">LogFormat</span><span class="o">=</span><span class="s2">&quot;date time cs-method cs-uri-stem cs-username c-ip cs-version cs(User-Agent) cs(Referer) sc-status sc-bytes&quot;</span>
</span><span class='line'><span class="nv">LogSeparator</span><span class="o">=</span><span class="s2">&quot; &quot;</span>
</span><span class='line'><span class="c">#就是说明一下你给那个站点做的分析,分析结果页面左上角显示</span>
</span><span class='line'><span class="nv">SiteDomain</span><span class="o">=</span><span class="s2">&quot;blog.bbkanba.com&quot;</span>
</span><span class='line'><span class="nv">HostAliases</span><span class="o">=</span><span class="s2">&quot;localhost 127.0.0.1&quot;</span>
</span><span class='line'><span class="nv">DNSLookup</span><span class="o">=</span>0
</span><span class='line'><span class="c">#看上面,不解释</span>
</span><span class='line'><span class="nv">DirData</span><span class="o">=</span><span class="s2">&quot;C:/LogAnalyse/awstats_data_dir/&quot;</span>
</span><span class='line'><span class="nv">DirCgi</span><span class="o">=</span><span class="s2">&quot;/cgi-bin&quot;</span>
</span><span class='line'><span class="nv">DirIcons</span><span class="o">=</span><span class="s2">&quot;/icon&quot;</span>
</span><span class='line'><span class="nv">AllowToUpdateStatsFromBrowser</span><span class="o">=</span>1
</span><span class='line'><span class="nv">AllowFullYearView</span><span class="o">=</span>2
</span><span class='line'><span class="c">#同一时间只能有一个update运行</span>
</span><span class='line'><span class="nv">EnableLockForUpdate</span><span class="o">=</span>1
</span><span class='line'><span class="nv">DNSStaticCacheFile</span><span class="o">=</span><span class="s2">&quot;dnscache.txt&quot;</span>
</span><span class='line'><span class="nv">DNSLastUpdateCacheFile</span><span class="o">=</span><span class="s2">&quot;dnscachelastupdate.txt&quot;</span>
</span><span class='line'><span class="nv">SkipDNSLookupFor</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">AllowAccessFromWebToAuthenticatedUsersOnly</span><span class="o">=</span>0
</span><span class='line'><span class="nv">AllowAccessFromWebToFollowingAuthenticatedUsers</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">AllowAccessFromWebToFollowingIPAddresses</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">CreateDirDataIfNotExists</span><span class="o">=</span>0
</span><span class='line'><span class="nv">BuildHistoryFormat</span><span class="o">=</span>text
</span><span class='line'><span class="nv">BuildReportFormat</span><span class="o">=</span>html
</span><span class='line'><span class="nv">SaveDatabaseFilesWithPermissionsForEveryone</span><span class="o">=</span>0
</span><span class='line'><span class="nv">PurgeLogFile</span><span class="o">=</span>0
</span><span class='line'><span class="nv">ArchiveLogRecords</span><span class="o">=</span>0
</span><span class='line'><span class="nv">KeepBackupOfHistoricFiles</span><span class="o">=</span>0
</span><span class='line'><span class="nv">DefaultFile</span><span class="o">=</span><span class="s2">&quot;index.php index.html&quot;</span>
</span><span class='line'><span class="c">#这里可以指定那些地址不纳入分析结果,比如私网地址的访客</span>
</span><span class='line'><span class="nv">SkipHosts</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">SkipUserAgents</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">SkipFiles</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">SkipReferrersBlackList</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">OnlyHosts</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">OnlyUserAgents</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">OnlyUsers</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">OnlyFiles</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">NotPageList</span><span class="o">=</span><span class="s2">&quot;css js class gif jpg jpeg png bmp ico rss xml swf&quot;</span>
</span><span class='line'><span class="nv">ValidHTTPCodes</span><span class="o">=</span><span class="s2">&quot;200 304&quot;</span>
</span><span class='line'><span class="nv">ValidSMTPCodes</span><span class="o">=</span><span class="s2">&quot;1 250&quot;</span>
</span><span class='line'><span class="nv">AuthenticatedUsersNotCaseSensitive</span><span class="o">=</span>0
</span><span class='line'><span class="nv">URLNotCaseSensitive</span><span class="o">=</span>0
</span><span class='line'><span class="nv">URLWithAnchor</span><span class="o">=</span>0
</span><span class='line'><span class="nv">URLQuerySeparators</span><span class="o">=</span><span class="s2">&quot;?;&quot;</span>
</span><span class='line'><span class="nv">URLWithQuery</span><span class="o">=</span>0
</span><span class='line'><span class="nv">URLWithQueryWithOnlyFollowingParameters</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">URLWithQueryWithoutFollowingParameters</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">URLReferrerWithQuery</span><span class="o">=</span>0
</span><span class='line'><span class="nv">WarningMessages</span><span class="o">=</span>1
</span><span class='line'><span class="nv">ErrorMessages</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">DebugMessages</span><span class="o">=</span>0
</span><span class='line'><span class="nv">NbOfLinesForCorruptedLog</span><span class="o">=</span>50
</span><span class='line'><span class="nv">WrapperScript</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">DecodeUA</span><span class="o">=</span>0
</span><span class='line'><span class="nv">MiscTrackerUrl</span><span class="o">=</span><span class="s2">&quot;/js/awstats_misc_tracker.js&quot;</span>
</span><span class='line'><span class="nv">LevelForBrowsersDetection</span><span class="o">=</span>2
</span><span class='line'><span class="nv">LevelForOSDetection</span><span class="o">=</span>2
</span><span class='line'><span class="nv">LevelForRefererAnalyze</span><span class="o">=</span>2
</span><span class='line'><span class="nv">LevelForRobotsDetection</span><span class="o">=</span>2
</span><span class='line'><span class="nv">LevelForSearchEnginesDetection</span><span class="o">=</span>2
</span><span class='line'><span class="nv">LevelForKeywordsDetection</span><span class="o">=</span>2
</span><span class='line'><span class="nv">LevelForFileTypesDetection</span><span class="o">=</span>2
</span><span class='line'><span class="nv">LevelForWormsDetection</span><span class="o">=</span>0
</span><span class='line'><span class="nv">UseFramesWhenCGI</span><span class="o">=</span>1
</span><span class='line'><span class="nv">DetailedReportsOnNewWindows</span><span class="o">=</span>1
</span><span class='line'><span class="c">#分析结果页面的缓存时间,默认不缓存,这样你就可以手工通过浏览器更新,时时查看最新数据了</span>
</span><span class='line'><span class="nv">Expires</span><span class="o">=</span>0
</span><span class='line'><span class="nv">MaxRowsInHTMLOutput</span><span class="o">=</span>1000
</span><span class='line'><span class="c">#Lang默认是auto,根据浏览器设置现实页面语言,这里强制为汉语了</span>
</span><span class='line'><span class="nv">Lang</span><span class="o">=</span><span class="s2">&quot;cn&quot;</span>
</span><span class='line'><span class="nv">DirLang</span><span class="o">=</span><span class="s2">&quot;./lang&quot;</span>
</span><span class='line'><span class="nv">ShowMenu</span><span class="o">=</span>1                 
</span><span class='line'><span class="nv">ShowSummary</span><span class="o">=</span>UVPHB
</span><span class='line'><span class="nv">ShowMonthStats</span><span class="o">=</span>UVPHB
</span><span class='line'><span class="nv">ShowDaysOfMonthStats</span><span class="o">=</span>VPHB
</span><span class='line'><span class="nv">ShowDaysOfWeekStats</span><span class="o">=</span>PHB
</span><span class='line'><span class="nv">ShowHoursStats</span><span class="o">=</span>PHB
</span><span class='line'><span class="nv">ShowDomainsStats</span><span class="o">=</span>PHB
</span><span class='line'><span class="nv">ShowHostsStats</span><span class="o">=</span>PHBL
</span><span class='line'><span class="nv">ShowAuthenticatedUsers</span><span class="o">=</span>0
</span><span class='line'><span class="nv">ShowRobotsStats</span><span class="o">=</span>HBL
</span><span class='line'><span class="nv">ShowWormsStats</span><span class="o">=</span>0
</span><span class='line'><span class="nv">ShowEMailSenders</span><span class="o">=</span>0
</span><span class='line'><span class="nv">ShowEMailReceivers</span><span class="o">=</span>0
</span><span class='line'><span class="nv">ShowSessionsStats</span><span class="o">=</span>1
</span><span class='line'><span class="nv">ShowPagesStats</span><span class="o">=</span>PBEX
</span><span class='line'><span class="nv">ShowFileTypesStats</span><span class="o">=</span>HB
</span><span class='line'><span class="nv">ShowFileSizesStats</span><span class="o">=</span>0   
</span><span class='line'><span class="nv">ShowDownloadsStats</span><span class="o">=</span>HB  
</span><span class='line'><span class="nv">ShowOSStats</span><span class="o">=</span>1
</span><span class='line'><span class="nv">ShowBrowsersStats</span><span class="o">=</span>1
</span><span class='line'><span class="nv">ShowScreenSizeStats</span><span class="o">=</span>0
</span><span class='line'><span class="nv">ShowOriginStats</span><span class="o">=</span>PH
</span><span class='line'><span class="nv">ShowKeyphrasesStats</span><span class="o">=</span>1
</span><span class='line'><span class="nv">ShowKeywordsStats</span><span class="o">=</span>1
</span><span class='line'><span class="nv">ShowMiscStats</span><span class="o">=</span>a
</span><span class='line'><span class="nv">ShowHTTPErrorsStats</span><span class="o">=</span>1
</span><span class='line'><span class="nv">ShowSMTPErrorsStats</span><span class="o">=</span>0
</span><span class='line'><span class="nv">ShowClusterStats</span><span class="o">=</span>0
</span><span class='line'><span class="nv">AddDataArrayMonthStats</span><span class="o">=</span>1
</span><span class='line'><span class="nv">AddDataArrayShowDaysOfMonthStats</span><span class="o">=</span>1
</span><span class='line'><span class="nv">AddDataArrayShowDaysOfWeekStats</span><span class="o">=</span>1
</span><span class='line'><span class="nv">AddDataArrayShowHoursStats</span><span class="o">=</span>1
</span><span class='line'><span class="nv">IncludeInternalLinksInOriginSection</span><span class="o">=</span>0
</span><span class='line'><span class="nv">MaxNbOfDomain</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitDomain</span>  <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfHostsShown</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitHost</span>    <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfLoginShown</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitLogin</span>   <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfRobotShown</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitRobot</span>   <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfDownloadsShown</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitDownloads</span> <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfPageShown</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitFile</span>    <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfOsShown</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitOs</span>      <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfBrowsersShown</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitBrowser</span> <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfScreenSizesShown</span> <span class="o">=</span> 5
</span><span class='line'><span class="nv">MinHitScreenSize</span> <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfWindowSizesShown</span> <span class="o">=</span> 5
</span><span class='line'><span class="nv">MinHitWindowSize</span> <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfRefererShown</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitRefer</span>   <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfKeyphrasesShown</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitKeyphrase</span> <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfKeywordsShown</span> <span class="o">=</span> 10
</span><span class='line'><span class="nv">MinHitKeyword</span> <span class="o">=</span> 1
</span><span class='line'><span class="nv">MaxNbOfEMailsShown</span> <span class="o">=</span> 20
</span><span class='line'><span class="nv">MinHitEMail</span>   <span class="o">=</span> 1
</span><span class='line'><span class="nv">FirstDayOfWeek</span><span class="o">=</span>1
</span><span class='line'><span class="nv">ShowFlagLinks</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">ShowLinksOnUrl</span><span class="o">=</span>1
</span><span class='line'><span class="nv">UseHTTPSLinkForUrl</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">MaxLengthOfShownURL</span><span class="o">=</span>64
</span><span class='line'><span class="nv">HTMLHeadSection</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">HTMLEndSection</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">MetaRobot</span><span class="o">=</span>0
</span><span class='line'><span class="nv">Logo</span><span class="o">=</span><span class="s2">&quot;awstats_logo6.png&quot;</span>
</span><span class='line'><span class="nv">LogoLink</span><span class="o">=</span><span class="s2">&quot;http://www.awstats.org&quot;</span>
</span><span class='line'><span class="nv">BarWidth</span>   <span class="o">=</span> 260
</span><span class='line'><span class="nv">BarHeight</span>  <span class="o">=</span> 90
</span><span class='line'><span class="nv">StyleSheet</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="nv">color_Background</span><span class="o">=</span><span class="s2">&quot;FFFFFF&quot;</span>    
</span><span class='line'><span class="nv">color_TableBGTitle</span><span class="o">=</span><span class="s2">&quot;CCCCDD&quot;</span>  
</span><span class='line'><span class="nv">color_TableTitle</span><span class="o">=</span><span class="s2">&quot;000000&quot;</span>    
</span><span class='line'><span class="nv">color_TableBG</span><span class="o">=</span><span class="s2">&quot;CCCCDD&quot;</span>       
</span><span class='line'><span class="nv">color_TableRowTitle</span><span class="o">=</span><span class="s2">&quot;FFFFFF&quot;</span> 
</span><span class='line'><span class="nv">color_TableBGRowTitle</span><span class="o">=</span><span class="s2">&quot;ECECEC&quot;</span>   
</span><span class='line'><span class="nv">color_TableBorder</span><span class="o">=</span><span class="s2">&quot;ECECEC&quot;</span>   
</span><span class='line'><span class="nv">color_text</span><span class="o">=</span><span class="s2">&quot;000000&quot;</span>      
</span><span class='line'><span class="nv">color_textpercent</span><span class="o">=</span><span class="s2">&quot;606060&quot;</span>   
</span><span class='line'><span class="nv">color_titletext</span><span class="o">=</span><span class="s2">&quot;000000&quot;</span>
</span><span class='line'><span class="nv">color_weekend</span><span class="o">=</span><span class="s2">&quot;EAEAEA&quot;</span>
</span><span class='line'><span class="nv">color_link</span><span class="o">=</span><span class="s2">&quot;0011BB&quot;</span>
</span><span class='line'><span class="nv">color_hover</span><span class="o">=</span><span class="s2">&quot;605040&quot;</span>
</span><span class='line'><span class="nv">color_u</span><span class="o">=</span><span class="s2">&quot;FFAA66&quot;</span>
</span><span class='line'><span class="nv">color_v</span><span class="o">=</span><span class="s2">&quot;F4F090&quot;</span>
</span><span class='line'><span class="nv">color_p</span><span class="o">=</span><span class="s2">&quot;4477DD&quot;</span>
</span><span class='line'><span class="nv">color_h</span><span class="o">=</span><span class="s2">&quot;66DDEE&quot;</span>
</span><span class='line'><span class="nv">color_k</span><span class="o">=</span><span class="s2">&quot;2EA495&quot;</span>
</span><span class='line'><span class="nv">color_s</span><span class="o">=</span><span class="s2">&quot;8888DD&quot;</span>
</span><span class='line'><span class="nv">color_e</span><span class="o">=</span><span class="s2">&quot;CEC2E8&quot;</span>
</span><span class='line'><span class="nv">color_x</span><span class="o">=</span><span class="s2">&quot;C1B2E2&quot;</span>
</span><span class='line'><span class="nv">ExtraTrackedRowsLimit</span><span class="o">=</span>500
</span><span class='line'>
</span><span class='line'><span class="c">#以下是启用的插件们</span>
</span><span class='line'><span class="nv">HTMLHeadSection</span><span class="o">=</span><span class="s2">&quot;&amp;lt;script language=javascript src=&#39;/js/day-by-day-head.js&#39;&amp;gt;&amp;lt;/script&amp;gt;&quot;</span>
</span><span class='line'><span class="nv">HTMLEndSection</span><span class="o">=</span><span class="s2">&quot;&amp;lt;script language=javascript src=&#39;/js/day-by-day-end.js&#39;&amp;gt;&amp;lt;/script&amp;gt;&quot;</span>
</span><span class='line'><span class="nv">LoadPlugin</span><span class="o">=</span><span class="s2">&quot;geoip GEOIP_STANDARD C:/LogAnalyse/awstats/cgi-bin/plugins/GeoIP.dat&quot;</span>
</span><span class='line'><span class="nv">LoadPlugin</span><span class="o">=</span><span class="s2">&quot;geoip_city_maxmind GEOIP_STANDARD C:/LogAnalyse/awstats/cgi-bin/plugins/GeoLiteCity.dat&quot;</span>
</span><span class='line'><span class="nv">LoadPlugin</span><span class="o">=</span><span class="s2">&quot;hostinfo&quot;</span>
</span><span class='line'><span class="nv">LoadPlugin</span><span class="o">=</span><span class="s2">&quot;qqhostinfo&quot;</span>
</span><span class='line'><span class="nv">LoadPlugin</span><span class="o">=</span><span class="s2">&quot;decodeutfkeys&quot;</span>
</span><span class='line'><span class="nv">LoadPlugin</span><span class="o">=</span><span class="s2">&quot;timezone +8&quot;</span>
</span><span class='line'><span class="nv">LoadPlugin</span><span class="o">=</span><span class="s2">&quot;tooltips&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>点击开始-运行-cmd,输入以下命令,安装所需要的软件包.</p>

<pre>
 ppm install Geo::IP::PurePerl
 ppm install Geography::Countries
 ppm install IP::Country 
 ppm install Geo-IPfree 
 ppm install Net-Xwhois
</pre>


<p>下载<a href="http://www.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz">GeoIP.dat</a>和<a href="http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz">GeoLiteCity.dat</a>,解压缩以后,放入<code>C:\LogAnalyse\awstats\cgi-bin\plugins</code>目录.
下载<a href="http://leolovenet.com/downloads/code/qqhostinfo.pm">qqhostinfo.pm</a>和<a href="http://leolovenet.com/downloads/code/qqwry.pl">qqwry.pl</a>和<a href="http://www.cz88.net/">QQWry.Dat</a>到<code>C:\LogAnalyse\awstats\cgi-bin\plugins</code>目录下.</p>

<p><span style="color: #d14;">然后选中这5个文件,右击选择属性,安全,添加Everyone的读取权限(如图1-4)</span></p>

<p>图1-4</p>

<p><img src="http://leolovenet.com/downloads/images/awstats.1-4.png" alt="awstats.1-4.png" /></p>

<p>下载<a href="http://leolovenet.com/downloads/code/day-by-day-head.js">day-by-day-head.js</a>和<a href="http://leolovenet.com/downloads/code/day-by-day-end.js">day-by-day-end.js</a>到<code>C:\LogAnalyse\awstats\js</code>目录下.</p>

<p>在C:\LogAnalyse\awstats_data_dir目录下新建一个<code>crontab.bat</code>文件.输入下面的内容</p>

<pre>
perl %cd%/../awstats/cgi-bin/awstats.pl -update -config=logWin  -lang=cn  -databasebreak=day
</pre>


<p>解释一下,这个bat文件是要设立计划任务时用的,比如每隔30分钟自动更新下分析数据.</p>

<ul>
<li>%cd%/../awstats/cgi-bin/awstats.pl文件是awstats执行分析的主程序perl脚本(%cd%当前目录)</li>
<li>-update 表示更新</li>
<li>-config=logWin 知道为什么上面的文件为什么必须叫awstats.logWin.conf了吧, awstats.pl会掐头去尾留中间的找配置文件,如果你上面的文件不叫awstats.logWin.conf,而是awstats.bbkanba.conf的话,这里也需要改成-config=bbkanba</li>
<li>-lang=cn 告诉awstats.pl生成中文页面,你喜欢其他语言可以去C:/LogAnalyse/awstats/cgi-bin/lang目录下瞅瞅,看看这个参数的值可以是什么.</li>
<li>-databasebreak=day 这个重要哦, awstas默认是以月为单位分析展示数据的,而这里的我们安装了day-by-day插件, 就要求它以天为单位展示.</li>
</ul>


<p>保存好以后,点击开始-运行-cmd,直接用鼠标将<code>crontab.bat</code>文件拖放到黑窗口里,然后回车,你会看到类似图1-5的效果,说明成功配置好了,反之,根据错误提示自己排查吧.原因无非权限呀,路径呀,依赖的perl库啊之类的.</p>

<p>图1-5</p>

<p><img src="http://leolovenet.com/downloads/images/awstats.1-5.png" alt="awstats.1-5.png" /></p>

<p>然后在控制面板,计划任务,添加计划任务,达到如图1-6的样子就可以了,不然就是你配错了.</p>

<p>图1-6<br/>
<img src="http://leolovenet.com/downloads/images/awstats.1-6.png" alt="awstats.1-6.png" /></p>

<p>到此,我们已经配置好了awstas的工作环境,下面新建立一个网站来展示数据吧.</p>

<p>打开 &ldquo;Internet 信息服务(IIS)管理器&rdquo; –> &ldquo;网站&rdquo; 右击 –> &ldquo;新建网站&rdquo; –> 新建网站向导,下一步 –> 描述 &ldquo;log.bbkanba.com&rdquo;,下一步 –> 全部未分配,80,主机头:log.bbkanba.com –> 主目录路径C:\LogAnalyse\awstats –> 最后一定要勾上 &ldquo;执行(如ISAPI 应用程序或 CGI)&rdquo; –> 下一步完成.</p>

<p>还需要一个perl脚本重定向,创建到C:\LogAnalyse\awstats\index.pl下面,这样每次打开<code>http://log.bbkanba.com</code>就可以看到最新的统计数据了(还的改一下网站的设置，添加index.pl到默认内容文档里,网站属性-文档-默认内容文档).</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='perl'><span class='line'><span class="c1">#!/usr/bin/perl</span>
</span><span class='line'><span class="k">use</span> <span class="n">POSIX</span> <span class="sx">qw(strftime)</span><span class="p">;</span>
</span><span class='line'><span class="k">print</span> <span class="n">strftime</span> <span class="s">&quot;Location: http://log.bbkanba.com/cgi-bin/awstats.pl?config=log&amp;databasebreak=day&amp;day=%d&amp;month=%m&amp;year=%Y\n\n&quot;</span> <span class="p">,</span><span class="nb">localtime</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>congratulation you are finished! celebrate吧.
windows的到这里打完,收工,我去煮个泡面,待会继续Linux下的.</p>

<h2>2. Install Awstats with Lighttpd under Linux(CentOS)</h2>

<p>到了，我最爱的Linux服务器环境安装就变的容易多了.<br/>
首先通过yum安装perl的依赖包,然后下载安装awstats的rpm安装包,然后安装所需要的插件,创建配置文件,创建计划任务,就ok了.全部命令如下.<br/>
配置文件同上面window2003下的基本一样，只是变更了一下路径.这里我们分析<code>/var/log/lighttpd/access.log</code>这个日志文件.配置文件的意思看上面.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
<span class='line-number'>162</span>
<span class='line-number'>163</span>
<span class='line-number'>164</span>
<span class='line-number'>165</span>
<span class='line-number'>166</span>
<span class='line-number'>167</span>
<span class='line-number'>168</span>
<span class='line-number'>169</span>
<span class='line-number'>170</span>
<span class='line-number'>171</span>
<span class='line-number'>172</span>
<span class='line-number'>173</span>
<span class='line-number'>174</span>
<span class='line-number'>175</span>
<span class='line-number'>176</span>
<span class='line-number'>177</span>
<span class='line-number'>178</span>
<span class='line-number'>179</span>
<span class='line-number'>180</span>
<span class='line-number'>181</span>
<span class='line-number'>182</span>
<span class='line-number'>183</span>
<span class='line-number'>184</span>
<span class='line-number'>185</span>
<span class='line-number'>186</span>
<span class='line-number'>187</span>
<span class='line-number'>188</span>
<span class='line-number'>189</span>
<span class='line-number'>190</span>
<span class='line-number'>191</span>
<span class='line-number'>192</span>
<span class='line-number'>193</span>
<span class='line-number'>194</span>
<span class='line-number'>195</span>
<span class='line-number'>196</span>
<span class='line-number'>197</span>
<span class='line-number'>198</span>
<span class='line-number'>199</span>
<span class='line-number'>200</span>
<span class='line-number'>201</span>
<span class='line-number'>202</span>
<span class='line-number'>203</span>
<span class='line-number'>204</span>
<span class='line-number'>205</span>
<span class='line-number'>206</span>
<span class='line-number'>207</span>
<span class='line-number'>208</span>
<span class='line-number'>209</span>
<span class='line-number'>210</span>
<span class='line-number'>211</span>
<span class='line-number'>212</span>
<span class='line-number'>213</span>
<span class='line-number'>214</span>
<span class='line-number'>215</span>
<span class='line-number'>216</span>
<span class='line-number'>217</span>
<span class='line-number'>218</span>
<span class='line-number'>219</span>
<span class='line-number'>220</span>
<span class='line-number'>221</span>
<span class='line-number'>222</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#需要从http://packages.sw.be/rpmforge-release/ 选择自己平台的rpm包安装,这里我的系统是CentOS6 x86_64,你要根据自己的平台选择,下面是wiki地址</span>
</span><span class='line'><span class="c">##http://wiki.centos.org/AdditionalResources/Repositories/RPMForge</span>
</span><span class='line'>
</span><span class='line'>wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
</span><span class='line'>rpm -Uvh rpmforge-release*rpm
</span><span class='line'>
</span><span class='line'>yum -y install perl  perl-CPAN perl-Compress-Raw-Zlib  perl-Compress-Zlib  perl-GSSAPI  perl-HTML-Parser  perl-HTML-Tagset  perl-IO-Compress-Base perl-IO-Compress-Zlib  perl-URI  perl-libwww-perl gzip perl-Geo-IP perl-Net-XWhois perl-FCGI perl-FCGI-ProcManager
</span><span class='line'>
</span><span class='line'>wget http://prdownloads.sourceforge.net/awstats/awstats-7.1-1.noarch.rpm
</span><span class='line'>rpm -ivh awstats-7.1-1.noarch.rpm
</span><span class='line'>rm -rf awstats-7.1-1.noarch.rpm
</span><span class='line'>
</span><span class='line'><span class="nb">cd</span>  /usr/local/awstats/wwwroot/cgi-bin/plugins/
</span><span class='line'>wget http://www.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
</span><span class='line'>wget http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
</span><span class='line'>gunzip GeoIP.dat.gz GeoLiteCity.dat.gz
</span><span class='line'>
</span><span class='line'>wget http://leolovenet.com/downloads/code/qqhostinfo.pm
</span><span class='line'>wget http://leolovenet.com/downloads/code/qqwry.pl
</span><span class='line'>wget http://leolovenet.com/downloads/code/QQWry.Dat
</span><span class='line'><span class="nb">cd</span> /usr/local/awstats/wwwroot/js/
</span><span class='line'>wget http://leolovenet.com/downloads/code/day-by-day-head.js
</span><span class='line'>wget http://leolovenet.com/downloads/code/day-by-day-end.js
</span><span class='line'>mkdir -p /usr/local/awstats/awstats_data_dir
</span><span class='line'>chmod -R 777 /usr/local/awstats/awstats_data_dir
</span><span class='line'>
</span><span class='line'>cat &gt; /etc/awstats/awstats.log.conf <span class="s">&lt;&lt;ALLENDEND</span>
</span><span class='line'><span class="s"># AWSTATS CONFIGURE FILE</span>
</span><span class='line'><span class="s">LogFile=&quot;/var/log/lighttpd/access.log&quot;</span>
</span><span class='line'><span class="s">LogType=W</span>
</span><span class='line'><span class="s">LogFormat=1</span>
</span><span class='line'><span class="s">LogSeparator=&quot; &quot;</span>
</span><span class='line'><span class="s">SiteDomain=&quot;blog.bbkanba.com&quot;</span>
</span><span class='line'><span class="s">HostAliases=&quot;localhost 127.0.0.1&quot;</span>
</span><span class='line'><span class="s">DNSLookup=0</span>
</span><span class='line'><span class="s">DirData=&quot;/usr/local/awstats/awstats_data_dir&quot;</span>
</span><span class='line'><span class="s">DirCgi=&quot;/cgi-bin&quot;</span>
</span><span class='line'><span class="s">DirIcons=&quot;/icon&quot;</span>
</span><span class='line'><span class="s">AllowToUpdateStatsFromBrowser=1</span>
</span><span class='line'><span class="s">AllowFullYearView=2</span>
</span><span class='line'><span class="s">EnableLockForUpdate=1</span>
</span><span class='line'><span class="s">DNSStaticCacheFile=&quot;dnscache.txt&quot;</span>
</span><span class='line'><span class="s">DNSLastUpdateCacheFile=&quot;dnscachelastupdate.txt&quot;</span>
</span><span class='line'><span class="s">SkipDNSLookupFor=&quot;&quot;</span>
</span><span class='line'><span class="s">AllowAccessFromWebToAuthenticatedUsersOnly=0</span>
</span><span class='line'><span class="s">AllowAccessFromWebToFollowingAuthenticatedUsers=&quot;&quot;</span>
</span><span class='line'><span class="s">AllowAccessFromWebToFollowingIPAddresses=&quot;&quot;</span>
</span><span class='line'><span class="s">CreateDirDataIfNotExists=0</span>
</span><span class='line'><span class="s">BuildHistoryFormat=text</span>
</span><span class='line'><span class="s">BuildReportFormat=html</span>
</span><span class='line'><span class="s">SaveDatabaseFilesWithPermissionsForEveryone=0</span>
</span><span class='line'><span class="s">PurgeLogFile=0</span>
</span><span class='line'><span class="s">ArchiveLogRecords=0</span>
</span><span class='line'><span class="s">KeepBackupOfHistoricFiles=0</span>
</span><span class='line'><span class="s">DefaultFile=&quot;index.php index.html&quot;</span>
</span><span class='line'><span class="s">SkipHosts=&quot;&quot;</span>
</span><span class='line'><span class="s">SkipUserAgents=&quot;&quot;</span>
</span><span class='line'><span class="s">SkipFiles=&quot;&quot;</span>
</span><span class='line'><span class="s">SkipReferrersBlackList=&quot;&quot;</span>
</span><span class='line'><span class="s">OnlyHosts=&quot;&quot;</span>
</span><span class='line'><span class="s">OnlyUserAgents=&quot;&quot;</span>
</span><span class='line'><span class="s">OnlyUsers=&quot;&quot;</span>
</span><span class='line'><span class="s">OnlyFiles=&quot;&quot;</span>
</span><span class='line'><span class="s">NotPageList=&quot;css js class gif jpg jpeg png bmp ico rss xml swf&quot;</span>
</span><span class='line'><span class="s">ValidHTTPCodes=&quot;200 304&quot;</span>
</span><span class='line'><span class="s">ValidSMTPCodes=&quot;1 250&quot;</span>
</span><span class='line'><span class="s">AuthenticatedUsersNotCaseSensitive=0</span>
</span><span class='line'><span class="s">URLNotCaseSensitive=0</span>
</span><span class='line'><span class="s">URLWithAnchor=0</span>
</span><span class='line'><span class="s">URLQuerySeparators=&quot;?;&quot;</span>
</span><span class='line'><span class="s">URLWithQuery=0</span>
</span><span class='line'><span class="s">URLWithQueryWithOnlyFollowingParameters=&quot;&quot;</span>
</span><span class='line'><span class="s">URLWithQueryWithoutFollowingParameters=&quot;&quot;</span>
</span><span class='line'><span class="s">URLReferrerWithQuery=0</span>
</span><span class='line'><span class="s">WarningMessages=1</span>
</span><span class='line'><span class="s">ErrorMessages=&quot;&quot;</span>
</span><span class='line'><span class="s">DebugMessages=0</span>
</span><span class='line'><span class="s">NbOfLinesForCorruptedLog=50</span>
</span><span class='line'><span class="s">WrapperScript=&quot;&quot;</span>
</span><span class='line'><span class="s">DecodeUA=0</span>
</span><span class='line'><span class="s">MiscTrackerUrl=&quot;/js/awstats_misc_tracker.js&quot;</span>
</span><span class='line'><span class="s">LevelForBrowsersDetection=2</span>
</span><span class='line'><span class="s">LevelForOSDetection=2</span>
</span><span class='line'><span class="s">LevelForRefererAnalyze=2</span>
</span><span class='line'><span class="s">LevelForRobotsDetection=2</span>
</span><span class='line'><span class="s">LevelForSearchEnginesDetection=2</span>
</span><span class='line'><span class="s">LevelForKeywordsDetection=2</span>
</span><span class='line'><span class="s">LevelForFileTypesDetection=2</span>
</span><span class='line'><span class="s">LevelForWormsDetection=0</span>
</span><span class='line'><span class="s">UseFramesWhenCGI=1</span>
</span><span class='line'><span class="s">DetailedReportsOnNewWindows=1</span>
</span><span class='line'><span class="s">Expires=0</span>
</span><span class='line'><span class="s">MaxRowsInHTMLOutput=1000</span>
</span><span class='line'><span class="s">Lang=&quot;cn&quot;</span>
</span><span class='line'><span class="s">DirLang=&quot;./lang&quot;</span>
</span><span class='line'><span class="s">ShowMenu=1                  </span>
</span><span class='line'><span class="s">ShowSummary=UVPHB</span>
</span><span class='line'><span class="s">ShowMonthStats=UVPHB</span>
</span><span class='line'><span class="s">ShowDaysOfMonthStats=VPHB</span>
</span><span class='line'><span class="s">ShowDaysOfWeekStats=PHB</span>
</span><span class='line'><span class="s">ShowHoursStats=PHB</span>
</span><span class='line'><span class="s">ShowDomainsStats=PHB</span>
</span><span class='line'><span class="s">ShowHostsStats=PHBL</span>
</span><span class='line'><span class="s">ShowAuthenticatedUsers=0</span>
</span><span class='line'><span class="s">ShowRobotsStats=HBL</span>
</span><span class='line'><span class="s">ShowWormsStats=0</span>
</span><span class='line'><span class="s">ShowEMailSenders=0</span>
</span><span class='line'><span class="s">ShowEMailReceivers=0</span>
</span><span class='line'><span class="s">ShowSessionsStats=1</span>
</span><span class='line'><span class="s">ShowPagesStats=PBEX</span>
</span><span class='line'><span class="s">ShowFileTypesStats=HB</span>
</span><span class='line'><span class="s">ShowFileSizesStats=0    </span>
</span><span class='line'><span class="s">ShowDownloadsStats=HB   </span>
</span><span class='line'><span class="s">ShowOSStats=1</span>
</span><span class='line'><span class="s">ShowBrowsersStats=1</span>
</span><span class='line'><span class="s">ShowScreenSizeStats=0</span>
</span><span class='line'><span class="s">ShowOriginStats=PH</span>
</span><span class='line'><span class="s">ShowKeyphrasesStats=1</span>
</span><span class='line'><span class="s">ShowKeywordsStats=1</span>
</span><span class='line'><span class="s">ShowMiscStats=a</span>
</span><span class='line'><span class="s">ShowHTTPErrorsStats=1</span>
</span><span class='line'><span class="s">ShowSMTPErrorsStats=0</span>
</span><span class='line'><span class="s">ShowClusterStats=0</span>
</span><span class='line'><span class="s">AddDataArrayMonthStats=1</span>
</span><span class='line'><span class="s">AddDataArrayShowDaysOfMonthStats=1</span>
</span><span class='line'><span class="s">AddDataArrayShowDaysOfWeekStats=1</span>
</span><span class='line'><span class="s">AddDataArrayShowHoursStats=1</span>
</span><span class='line'><span class="s">IncludeInternalLinksInOriginSection=0</span>
</span><span class='line'><span class="s">MaxNbOfDomain = 10</span>
</span><span class='line'><span class="s">MinHitDomain  = 1</span>
</span><span class='line'><span class="s">MaxNbOfHostsShown = 10</span>
</span><span class='line'><span class="s">MinHitHost    = 1</span>
</span><span class='line'><span class="s">MaxNbOfLoginShown = 10</span>
</span><span class='line'><span class="s">MinHitLogin   = 1</span>
</span><span class='line'><span class="s">MaxNbOfRobotShown = 10</span>
</span><span class='line'><span class="s">MinHitRobot   = 1</span>
</span><span class='line'><span class="s">MaxNbOfDownloadsShown = 10</span>
</span><span class='line'><span class="s">MinHitDownloads = 1</span>
</span><span class='line'><span class="s">MaxNbOfPageShown = 10</span>
</span><span class='line'><span class="s">MinHitFile    = 1</span>
</span><span class='line'><span class="s">MaxNbOfOsShown = 10</span>
</span><span class='line'><span class="s">MinHitOs      = 1</span>
</span><span class='line'><span class="s">MaxNbOfBrowsersShown = 10</span>
</span><span class='line'><span class="s">MinHitBrowser = 1</span>
</span><span class='line'><span class="s">MaxNbOfScreenSizesShown = 5</span>
</span><span class='line'><span class="s">MinHitScreenSize = 1</span>
</span><span class='line'><span class="s">MaxNbOfWindowSizesShown = 5</span>
</span><span class='line'><span class="s">MinHitWindowSize = 1</span>
</span><span class='line'><span class="s">MaxNbOfRefererShown = 10</span>
</span><span class='line'><span class="s">MinHitRefer   = 1</span>
</span><span class='line'><span class="s">MaxNbOfKeyphrasesShown = 10</span>
</span><span class='line'><span class="s">MinHitKeyphrase = 1</span>
</span><span class='line'><span class="s">MaxNbOfKeywordsShown = 10</span>
</span><span class='line'><span class="s">MinHitKeyword = 1</span>
</span><span class='line'><span class="s">MaxNbOfEMailsShown = 20</span>
</span><span class='line'><span class="s">MinHitEMail   = 1</span>
</span><span class='line'><span class="s">FirstDayOfWeek=1</span>
</span><span class='line'><span class="s">ShowFlagLinks=&quot;&quot;</span>
</span><span class='line'><span class="s">ShowLinksOnUrl=1</span>
</span><span class='line'><span class="s">UseHTTPSLinkForUrl=&quot;&quot;</span>
</span><span class='line'><span class="s">MaxLengthOfShownURL=64</span>
</span><span class='line'><span class="s">HTMLHeadSection=&quot;&quot;</span>
</span><span class='line'><span class="s">HTMLEndSection=&quot;&quot;</span>
</span><span class='line'><span class="s">MetaRobot=0</span>
</span><span class='line'><span class="s">Logo=&quot;awstats_logo6.png&quot;</span>
</span><span class='line'><span class="s">LogoLink=&quot;http://www.awstats.org&quot;</span>
</span><span class='line'><span class="s">BarWidth   = 260</span>
</span><span class='line'><span class="s">BarHeight  = 90</span>
</span><span class='line'><span class="s">StyleSheet=&quot;&quot;</span>
</span><span class='line'><span class="s">color_Background=&quot;FFFFFF&quot;</span>
</span><span class='line'><span class="s">color_TableBGTitle=&quot;CCCCDD&quot;</span>
</span><span class='line'><span class="s">color_TableTitle=&quot;000000&quot;</span>
</span><span class='line'><span class="s">color_TableBG=&quot;CCCCDD&quot;</span>
</span><span class='line'><span class="s">color_TableRowTitle=&quot;FFFFFF&quot;</span>
</span><span class='line'><span class="s">color_TableBGRowTitle=&quot;ECECEC&quot;</span>
</span><span class='line'><span class="s">color_TableBorder=&quot;ECECEC&quot;</span>
</span><span class='line'><span class="s">color_text=&quot;000000&quot;</span>
</span><span class='line'><span class="s">color_textpercent=&quot;606060&quot;</span>
</span><span class='line'><span class="s">color_titletext=&quot;000000&quot;</span>
</span><span class='line'><span class="s">color_weekend=&quot;EAEAEA&quot;</span>
</span><span class='line'><span class="s">color_link=&quot;0011BB&quot;</span>
</span><span class='line'><span class="s">color_hover=&quot;605040&quot;</span>
</span><span class='line'><span class="s">color_u=&quot;FFAA66&quot;</span>
</span><span class='line'><span class="s">color_v=&quot;F4F090&quot;</span>
</span><span class='line'><span class="s">color_p=&quot;4477DD&quot;</span>
</span><span class='line'><span class="s">color_h=&quot;66DDEE&quot;</span>
</span><span class='line'><span class="s">color_k=&quot;2EA495&quot;</span>
</span><span class='line'><span class="s">color_s=&quot;8888DD&quot;</span>
</span><span class='line'><span class="s">color_e=&quot;CEC2E8&quot;</span>
</span><span class='line'><span class="s">color_x=&quot;C1B2E2&quot;</span>
</span><span class='line'><span class="s">ExtraTrackedRowsLimit=500</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">HTMLHeadSection=&quot;&lt;script language=javascript src=&#39;/js/day-by-day-head.js&#39;&gt;&lt;/script&gt;&quot;</span>
</span><span class='line'><span class="s">HTMLEndSection=&quot;&lt;script language=javascript src=&#39;/js/day-by-day-end.js&#39;&gt;&lt;/script&gt;&quot;</span>
</span><span class='line'><span class="s">LoadPlugin=&quot;geoip GEOIP_STANDARD /usr/local/awstats/wwwroot/cgi-bin/plugins/GeoIP.dat&quot;</span>
</span><span class='line'><span class="s">LoadPlugin=&quot;geoip_city_maxmind GEOIP_STANDARD /usr/local/awstats/wwwroot/cgi-bin/plugins/GeoLiteCity.dat&quot;</span>
</span><span class='line'><span class="s">LoadPlugin=&quot;hostinfo&quot;</span>
</span><span class='line'><span class="s">LoadPlugin=&quot;qqhostinfo&quot;</span>
</span><span class='line'><span class="s">LoadPlugin=&quot;decodeutfkeys&quot;</span>
</span><span class='line'><span class="s">LoadPlugin=&quot;tooltips&quot;</span>
</span><span class='line'><span class="s">ALLENDEND</span>
</span><span class='line'>
</span><span class='line'>cat &gt; /usr/local/awstats/wwwroot/index.pl  <span class="s">&lt;&lt;ALLENDEND</span>
</span><span class='line'><span class="s">#!/usr/bin/perl</span>
</span><span class='line'><span class="s">use POSIX qw(strftime);</span>
</span><span class='line'><span class="s">print strftime &quot;Location: http://log.bbkanba.com/cgi-bin/awstats.pl?config=log&amp;databasebreak=day&amp;day=%d&amp;month=%m&amp;year=%Y\n\n&quot; ,localtime;</span>
</span><span class='line'><span class="s">ALLENDEND</span>
</span><span class='line'>
</span><span class='line'>cat &gt; /etc/cron.hourly/00awstats <span class="s">&lt;&lt;ALLENDEND</span>
</span><span class='line'><span class="s">#!/bin/bash</span>
</span><span class='line'><span class="s"># path to cgi-bin</span>
</span><span class='line'><span class="s">AWS=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl</span>
</span><span class='line'><span class="s"># append your domain</span>
</span><span class='line'><span class="s">DOMAINS=&quot;log&quot;</span>
</span><span class='line'><span class="s"># loop through all domains</span>
</span><span class='line'><span class="s">for d in \${DOMAINS}</span>
</span><span class='line'><span class="s">do</span>
</span><span class='line'><span class="s">   \${AWS} -update -config=\${d}  -lang=cn  -databasebreak=day</span>
</span><span class='line'><span class="s">done</span>
</span><span class='line'><span class="s">ALLENDEND</span>
</span><span class='line'>chmod +x /etc/cron.hourly/00awstats
</span><span class='line'>/etc/cron.hourly/00awstats
</span></code></pre></td></tr></table></div></figure>


<p>linux平台下的web日志时间一般没有问题，所以没有添加<code>LoadPlugin="timezone +8"</code></p>

<p>执行完上面的内容你应该可以看到与 图1-5 类似的结果,就说明安装awstats成功了。<br/>
下面添加一个虚拟站点给lighttpd,好让我们可以通过浏览器查看统计结果,全部命令如下</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sed -e <span class="s1">&#39;s/.*mod_ssi.*/&quot;mod_ssi&quot;,/&#39;</span> /etc/lighttpd/lighttpd.conf &gt; /tmp/lighttpd.conf
</span><span class='line'>mv /tmp/lighttpd.conf /etc/lighttpd/lighttpd.conf
</span><span class='line'>cat &gt;&gt; /etc/lighttpd/lighttpd.conf <span class="s">&lt;&lt;ALLALLEND</span>
</span><span class='line'><span class="s">\$HTTP[&quot;host&quot;] =~ &quot;log.bbkanba.com&quot; {</span>
</span><span class='line'><span class="s">index-file.names   = ( &quot;index.pl&quot;,&quot;index.php&quot;, &quot;index.html&quot;,&quot;index.htm&quot; )</span>
</span><span class='line'><span class="s">server.port = 80</span>
</span><span class='line'><span class="s">cgi.assign = (</span>
</span><span class='line'><span class="s">&quot;.pl&quot; =&gt; &quot;/usr/bin/perl&quot;,</span>
</span><span class='line'><span class="s">&quot;.cgi&quot; =&gt; &quot;/usr/bin/perl&quot;</span>
</span><span class='line'><span class="s">)</span>
</span><span class='line'><span class="s">server.document-root = &quot;/usr/local/awstats/wwwroot/&quot;</span>
</span><span class='line'><span class="s">accesslog.filename = &quot;/var/log/lighttpd/log.access.log&quot;</span>
</span><span class='line'><span class="s">}</span>
</span><span class='line'><span class="s">ALLALLEND</span>
</span><span class='line'>
</span><span class='line'>/etc/init.d/lighttpd restart
</span></code></pre></td></tr></table></div></figure>


<p>ok,到此结束.</p>

<h2>3. Install Awstats with Nginx under Linux(CentOS)</h2>

<p>awstats与Nginx合作还是有点复杂的,不像Lighttpd支持perl扩展那么容易,这里我们要让nginx支持perl扩展是通过一个perl脚本实现的。</p>

<p>不过,<strong>7.1</strong>版本的awstats的<a href="http://awstats.sourceforge.net/docs/awstats_changelog.txt">ChangLog</a>里说明了Add example of nginx setup.<br/>
我还没有试过官方的办法,好像是通过一个php的脚本,可以在最新发行版本包里的tools/nginx目录看看.</p>

<p>下面我讲的是通过 <a href="http://leolovenet.com/downloads/code/fastcgi-wrapper.pl">fastcgi-wrapper.pl</a> 实现的.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>wget http://leolovenet.com/downloads/code/fastcgi-wrapper.pl
</span><span class='line'>mv  fastcgi-wrapper.pl /usr/local/bin/
</span><span class='line'>chmod +x fastcgi-wrapper.pl
</span><span class='line'>mkdir -p /var/run/nginx/
</span><span class='line'>/usr/local/bin/fastcgi-wrapper.pl &amp;
</span><span class='line'>ps aux|grep  fcgi-wrapper.pl
</span></code></pre></td></tr></table></div></figure>


<p>awstats的安装与上面Lighttpd篇里的一样,添加一个虚拟站点给nginx,好让我们可以通过浏览器查看统计结果的命令如下,这里假设nginx安装在了<code>/usr/local/nginx</code>目录下,并且虚拟站点的配置文件在<code>/usr/local/nginx/conf/vhost</code>下.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>mkdir -p /var/run/nginx/
</span><span class='line'>mkdir -p /usr/local/nginx/conf/vhost
</span><span class='line'>
</span><span class='line'>cat &gt;  /usr/local/nginx/conf/vhost/awstats.conf<span class="s">&lt;&lt;ALLALLEND</span>
</span><span class='line'><span class="s">log_format  awstat  &#39;\$remote_addr - \$remote_user [\$time_local] \$request &#39;</span>
</span><span class='line'><span class="s">             &#39;\$status \$body_bytes_sent \$http_referer &#39;</span>
</span><span class='line'><span class="s">             &#39;\$http_user_agent \$http_x_forwarded_for&#39;;</span>
</span><span class='line'><span class="s">server</span>
</span><span class='line'><span class="s">     {</span>
</span><span class='line'><span class="s">          listen       80;</span>
</span><span class='line'><span class="s">          server_name log.bbkanba.com;</span>
</span><span class='line'><span class="s">          index index.pl index.html index.htm index.php default.html default.htm default.php;</span>
</span><span class='line'><span class="s">          root  /usr/local/awstats/wwwroot/;</span>
</span><span class='line'><span class="s"> </span>
</span><span class='line'><span class="s">      location ~ .*\.(pl|cgi)?\$</span>
</span><span class='line'><span class="s">         {</span>
</span><span class='line'><span class="s">                gzip off;</span>
</span><span class='line'><span class="s">                fastcgi_pass   unix:/var/run/nginx/perl_cgi-dispatch.sock;</span>
</span><span class='line'><span class="s">                root /usr/local/awstats/wwwroot;</span>
</span><span class='line'><span class="s">                fastcgi_index  index.cgi;</span>
</span><span class='line'><span class="s">                fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;</span>
</span><span class='line'><span class="s">                fastcgi_param  SERVER_SOFTWARE    nginx;</span>
</span><span class='line'><span class="s">                fastcgi_param  QUERY_STRING       \$query_string;</span>
</span><span class='line'><span class="s">                fastcgi_param  REQUEST_METHOD     \$request_method;</span>
</span><span class='line'><span class="s">                fastcgi_param  CONTENT_TYPE       \$content_type;</span>
</span><span class='line'><span class="s">                fastcgi_param  CONTENT_LENGTH     \$content_length;</span>
</span><span class='line'><span class="s">                fastcgi_param  SCRIPT_FILENAME    \$document_root\$fastcgi_script_name;</span>
</span><span class='line'><span class="s">                fastcgi_param  SCRIPT_NAME        \$fastcgi_script_name;</span>
</span><span class='line'><span class="s">                fastcgi_param  REQUEST_URI        \$request_uri;</span>
</span><span class='line'><span class="s">                fastcgi_param  DOCUMENT_URI       \$document_uri;</span>
</span><span class='line'><span class="s">                fastcgi_param  DOCUMENT_ROOT      \$document_root;</span>
</span><span class='line'><span class="s">                fastcgi_param  SERVER_PROTOCOL    \$server_protocol;</span>
</span><span class='line'><span class="s">                fastcgi_param  REMOTE_ADDR        \$remote_addr;</span>
</span><span class='line'><span class="s">                fastcgi_param  REMOTE_PORT        \$remote_port;</span>
</span><span class='line'><span class="s">                fastcgi_param  SERVER_ADDR        \$server_addr;</span>
</span><span class='line'><span class="s">                fastcgi_param  SERVER_PORT        \$server_port;</span>
</span><span class='line'><span class="s">                fastcgi_param  SERVER_NAME        \$server_name;</span>
</span><span class='line'><span class="s">                fastcgi_read_timeout   60;</span>
</span><span class='line'><span class="s">          }</span>
</span><span class='line'>
</span><span class='line'><span class="s">          location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)\$</span>
</span><span class='line'><span class="s">               {</span>
</span><span class='line'><span class="s">                    expires      30d;</span>
</span><span class='line'><span class="s">               }</span>
</span><span class='line'>
</span><span class='line'><span class="s">          location ~ .*\.(js|css)?\$</span>
</span><span class='line'><span class="s">               {</span>
</span><span class='line'><span class="s">                    expires      12h;</span>
</span><span class='line'><span class="s">               }</span>
</span><span class='line'>
</span><span class='line'><span class="s">          access_log  /var/log/awstat.log  awstat;</span>
</span><span class='line'><span class="s">}</span>
</span><span class='line'>
</span><span class='line'><span class="s">ALLALLEND</span>
</span><span class='line'>
</span><span class='line'>chmod +x /etc/cron.hourly/00awstats
</span><span class='line'>/etc/init.d/nginx reload
</span></code></pre></td></tr></table></div></figure>


<p>ok,到此结束.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[使终端(iTerm2/Terminal)色彩缤纷]]></title>
    <link href="http://leolovenet.com/blog/2013/01/12/colorful-the-Terminal/"/>
    <updated>2013-01-12T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/01/12/colorful-the-Terminal</id>
    <content type="html"><![CDATA[<p>因为经常使用终端 (iTerm|Terminal) ssh到服务器上去,所以整日盯着黑乎乎的屏幕很头痛,还不利于眼睛,所谓“工欲善其事,必先利其器”,所以今天就想让终端也色彩缤纷起来,让我们锻炼眼睛识别颜色的能力吧.</p>

<p><img src="http://leolovenet.com/downloads/images/terminal-colorful.png" title="terminal colorful example" alt="terminal-colorful.png" /></p>

<!--more-->


<p>在git上找到了<a href="http://ethanschoonover.com/solarized" target="_blank">SOLARIZED</a>这个项目,可以配置很多很多程序的颜色主体哦,哈哈,很是激动,下面具体讲讲配置过程.</p>

<p>我的机器主要用到iTerm2,而服务器因为是CentOS,那就要用到<a href="https://github.com/seebi/dircolors-solarized" target="_blank">dircolors-solarized</a>子项目.</p>

<p>首先讲一下, CentOS 下的ls配置  Solarized Color Theme for GNU ls (as setup by GNU dircolors).</p>

<p>Linux下的 <code>ls --color=auto</code> 命令,其实是根据两个文件来显示颜色的, <code>/etc/DIR_COLORS</code> 或者 <code>~/.dir_colors</code>, 一个是系统级别的配置文件,一个用户级别的配置文件.</p>

<p>Solarized Color Theme for GNU ls项目提供了配置好了的颜色配置文件,并且可以根据文件类型来展示不同的颜色,可以看看我上面的实例图片,色彩缤纷吧.</p>

<p>我就不讲Terminal的 16-色 和 256-色 的差别了,因为我也一知半解.不过这个项目的<a href="https://github.com/seebi/dircolors-solarized/raw/master/dircolors.ansi-universal" target="_blank">dircolors.ansi-universal</a>配置文件可以工作在两种形式的终端下,而<a href="https://github.com/seebi/dircolors-solarized/raw/master/dircolors.256dark" target="_blank">dircolors.256dark</a>只能工作在265色的终端下,所以除非你知道自己的终端是支持265色的,不然还是下载<a href="https://github.com/seebi/dircolors-solarized/raw/master/dircolors.ansi-universal" target="_blank">dircolors.ansi-universal</a>.</p>

<p>下面是具体命令</p>

<figure class='code'><figcaption><span>[execute below script in terminal]  (terminal_colorful.sh)</span> <a href='http://leolovenet.com/downloads/code/terminal_colorful.sh'>download</a></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'>
</span><span class='line'><span class="nb">cd</span> ~
</span><span class='line'><span class="nv">WGET_CMD</span><span class="o">=</span><span class="k">$(</span><span class="nb">type</span> -P wget<span class="k">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> <span class="nv">$WGET_CMD</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="o">]</span>;<span class="k">then</span>
</span><span class='line'><span class="k">     </span>yum -y install wget
</span><span class='line'><span class="k">fi</span>
</span><span class='line'>
</span><span class='line'>wget http://leolovenet.com/downloads/code/dircolors
</span><span class='line'><span class="c">#or</span>
</span><span class='line'><span class="c">#wget --no-check-certificate https://github.com/seebi/dircolors-solarized/raw/master/dircolors.ansi-universal</span>
</span><span class='line'>
</span><span class='line'>mv dircolors  ~/.dir_colors
</span><span class='line'><span class="nb">eval</span> <span class="sb">`</span>dircolors ~/.dir_colors<span class="sb">`</span>
</span><span class='line'>cat &gt;&gt;  ~/.bashrc <span class="s">&lt;&lt;END</span>
</span><span class='line'><span class="s">########bash color######################</span>
</span><span class='line'><span class="s">if [ -x /usr/bin/dircolors ]; then</span>
</span><span class='line'><span class="s">    alias ls=&#39;ls --color=auto&#39;</span>
</span><span class='line'><span class="s">    alias dir=&#39;dir --color=auto&#39;</span>
</span><span class='line'><span class="s">    alias vdir=&#39;vdir --color=auto&#39;</span>
</span><span class='line'><span class="s">    alias grep=&#39;grep --color=auto&#39;</span>
</span><span class='line'><span class="s">    alias fgrep=&#39;fgrep --color=auto&#39;</span>
</span><span class='line'><span class="s">    alias egrep=&#39;egrep --color=auto&#39;</span>
</span><span class='line'><span class="s">    alias tree=&#39;tree -C&#39;</span>
</span><span class='line'><span class="s">fi</span>
</span><span class='line'><span class="s">alias ..=&quot;cd ..&quot;</span>
</span><span class='line'><span class="s">alias ..2=&quot;cd ../..&quot;</span>
</span><span class='line'><span class="s">alias ..3=&quot;cd ../../..&quot;</span>
</span><span class='line'><span class="s">alias ..4=&quot;cd ../../../..&quot;</span>
</span><span class='line'><span class="s">alias ..5=&quot;cd ../../../../..&quot;</span>
</span><span class='line'><span class="s">alias  &quot;l&quot;=&quot;ls -ahl --full-time&quot;</span>
</span><span class='line'><span class="s">########################################</span>
</span><span class='line'><span class="s">END</span>
</span><span class='line'><span class="nb">source</span> ~/.bashrc
</span><span class='line'>ls /
</span></code></pre></td></tr></table></div></figure>


<p>该项目的<a href="https://github.com/seebi/dircolors-solarized/blob/master/README.md">ReadMe</a>文件还有很多信息,比如怎样配置265色的终端,感兴趣的可以仔细看看.</p>

<p><strong>iTerm2的配置</strong></p>

<p>iTerm2的配置配置更简单一点,进入到<a href="https://github.com/altercation/solarized/tree/master/iterm2-colors-solarized" target="_blank">iTerm2</a>的配置子项目下,下载配置文件<a href="https://github.com/altercation/solarized/raw/master/iterm2-colors-solarized/Solarized%20Dark.itermcolors" target="_blank">Solarized Dark.itermcolors</a>或者<a href="https://github.com/altercation/solarized/raw/master/iterm2-colors-solarized/Solarized%20Light.itermcolors" target="_blank">Solarized Light.itermcolors</a>,双击导入,然后更改首选项选择主题就可以.<br/>
具体可以查看<a href="https://github.com/altercation/solarized/blob/master/iterm2-colors-solarized/README.md" target="_blank">ReadMe</a>文件.</p>

<p>这里需要补充一点的是,mac 下的ls命令不是gun ls,所以即使iterm2安装了颜色主题,敲入ls命令以后,显示的文件颜色还是有问题的,这里有一个补救办法,运行下面这行,之后再看ls命令的颜色是不是变了</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">LSCOLORS</span><span class="o">=</span>gxfxbEaEBxxEhEhBaDaCaD
</span></code></pre></td></tr></table></div></figure>


<p>但是,这种补救办法也不完美,比如不能根据文件类型来显示颜色.</p>

<p>如果你想追求完美的话,还有另外一种办法,就是用 <code>brew install coreutils</code>, 安装 gun ls 命令到 mac 下,到时你还需要跟上面在linux下操作的一样,下载配置文件,放入到 ~/.dir_colors</p>

<p>具体就不说了,累了,睡觉了.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Xcode打包app命令-PackageApplication]]></title>
    <link href="http://leolovenet.com/blog/2013/01/10/xcode-packageapplication-command/"/>
    <updated>2013-01-10T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/01/10/xcode-packageapplication-command</id>
    <content type="html"><![CDATA[<p>xcode提供有这样一个perl脚本工具,可以打包一个app为ipa文件，为上传app store做准备. 路径是</p>

<pre>
`xcode-select -print-path`/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication
</pre>


<p>添加<code>-help</code>参数查看<strong>PackageApplication</strong>用法帮助，或者添加<code>-man</code>参数查看完整的帮助信息。</p>

<pre>
`xcode-select -print-path`/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication -help
Usage:
    PackageApplication [-s signature] application [-o output_directory]
    [-verbose] [-plugin plugin] || -man || -help

    Options:

        -s   certificate name to resign application before packaging
        -o              specify output filename
        -plugin         specify an optional plugin
        -help           brief help message
        -man            full documentation
        -v[erbose]      provide details during operation
</pre>


<p><a href="http://leolovenet.com/blog/2013/02/22/xcode-package-application-to-ipa/">More Useful</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[翻译]WRITE OBJECTIVE-C CODE — BLOCKS]]></title>
    <link href="http://leolovenet.com/blog/2013/01/10/write-objective-c-code-blocks/"/>
    <updated>2013-01-10T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/01/10/write-objective-c-code-blocks</id>
    <content type="html"><![CDATA[<p>一直对<strong>Blocks</strong>理解不是很深.特用白话翻译一小篇文章, 可能会使自己记得更清楚.</p>

<p>下文翻译自Apple Document <a href="https://developer.apple.com/library/mac/#referencelibrary/GettingStarted/RoadMapOSX/">Start Developing iOS Apps Today</a>中<a href="https://developer.apple.com/library/mac/#referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html" target="_blank">Write Objective-C Code</a>那篇<strong>Blocks</strong>.</p>

<!--more-->


<p><strong>Blocks</strong>,说白了就是可以在任何时候被多次执行封装好了的一段代码功能. 本质上是方便的匿名函数, 可以作为参数传递给一个方法或函数, 或者作为结果返回. <strong>Blocks</strong> 自己也可以有参数列表的定义和一个可以被检查出来的或者明确的返回类型声明.</p>

<p>我们能用Blocks干什么呢？ 它可以指派到一个变量上, 或者说把一个Blocks赋值给一个变量, 这样就可以把这个变量当成函数一样来用了.</p>

<blockquote><p>Blocks are objects that encapsulate a unit of work—that is, a segment of code—that can be executed at any time. They are essentially portable and anonymous functions that one can pass in as parameters of methods and functions or that can be returned from methods and functions. Blocks themselves have a typed parameter list and may have an inferred or a declared return type. You can also assign a block to a variable and then call it just as you would a function.</p></blockquote>

<p>那么Blocks怎么书写呢? <strong>Blocks</strong> 的语法标示符是（<strong>^</strong>）打头,下图具体格式展示了把一个 block 赋值个一个变量.</p>

<blockquote><p>A caret (^) is used as a syntactic marker for blocks. There are other, familiar syntactic conventions for parameters, return values, and body of the block (that is, the executed code). The following figure explicates the syntax, specifically when assigning a block to a variable.</p></blockquote>

<p><img src="http://leolovenet.com/downloads/images/blocks_2x-1024x377.png" title="object-c block syntax" alt="blocks_2x-1024x377.png" /></p>

<p>上面首先声明了一个变量<code>multiplier</code>,然后又实现了一个有一个<code>int</code>型参数和返回值是<code>int</code>型的 <strong>Block</strong>, 并把它赋值给了<code>myBlock</code>.<br/>
现在就可以把<code>myBlock</code>当做一个函数来调用了, 例如这样：</p>

<blockquote><p>You can then call the block variable as if it were a function:</p></blockquote>

<pre>
int result = myBlock(4); // 返回结果是 28
</pre>


<p>说完了格式, 该说作用域了. block跟调用它的主体共享作用域的. 也就是说, 如果你实现了一个方法, 并且在该方法里定义了一个 <strong>block</strong>, 那么在这个 <strong>block</strong> 内部就可以直接访问这个方法的局域变量和参数, 就像该函数访问全局变量一样. 但是, 这种访问的变量是只读的. 什么？我要在block里修改这个变量怎么办？那就需要这个变量在声明的时候以 <code>__block</code> 修饰符(<strong>双下划线</strong>)开头,这样这个变量就可以在block里被修改了. 还值得一说的是, 即使一个方法或者函数内的block被当做返回值返回, 然后此方法或者函数内的局部作用域被销毁, 此方法或者函数内部被block引用的本地变量仍然被当做block对象的一部分被保留, 直到block不再引用它们.</p>

<blockquote><p>A block shares data in the local lexical scope. This characteristic of blocks is useful because if you implement a method and that method defines a block, the block has access to the local variables and parameters of the method (including stack variables) as well as to functions and global variables, including instance variables. This access is read-only, but if a variable is declared with the __block modifier, its value can be changed within the block. Even after the method or function enclosing a block has returned and its local scope has been destroyed, the local variables persist as part of the block object as long as there is a reference to the block.</p></blockquote>

<p>跟<strong>blocks</strong>被作为一个方法或函数的参数使用一样, blocks也可以作为这个方法或函数的 &ldquo;回调函数&rdquo;, 当我们在调用这个方法或函数的时候, 它们执行自己的代码, 而为了请求额外的信息或为了特殊的目的, 在合适的时间调用 <strong>blocks</strong>, 从而实现 &ldquo;回调函数&rdquo; 的功能. 相对于其他函数调用规则,block和调用主体共享作用域.</p>

<blockquote><p>As method or function parameters, blocks can serve as a callback. When invoked, the method or function performs some work and, at the appropriate moments, calls back to the invoking code—via the block—to request additional information or to obtain program-specific behavior from it. Blocks enable the caller to provide the callback code at the point of invocation. Instead of packaging the required data in a “context” structure, blocks capture data from the same lexical scope as the host method or function. Because the block code does not have to be implemented in a separate method or function, your implementation code can be simpler and easier to understand.</p></blockquote>

<p>Objective-C 框架里有很多带 block 参数的方法.比如, Foundation框架里的<code>NSNotificationCenter</code>类就声明了下面的这样的一个带 block 参数的方法:</p>

<blockquote><p>Objective-C frameworks have many methods with block parameters. For example, the NSNotificationCenter class of the Foundation framework declares the following method, which has a block parameter:</p></blockquote>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">addObserverForName:</span><span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span> <span class="nf">object:</span><span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nv">obj</span> <span class="nf">queue:</span><span class="p">(</span><span class="n">NSOperationQueue</span> <span class="o">*</span><span class="p">)</span><span class="nv">queue</span> <span class="nf">usingBlock:</span><span class="p">(</span><span class="kt">void</span> <span class="p">(</span><span class="o">^</span><span class="p">)(</span><span class="n">NSNotification</span> <span class="o">*</span><span class="n">note</span><span class="p">))</span><span class="nv">block</span>
</span></code></pre></td></tr></table></div></figure>


<p>这个方法添加了一个监控器到通知中心.当一个符合指定名字的通知到达时, block 就负责处理. 像下面的代码一样:</p>

<blockquote><p>This method adds an observer to the notification center (notifications are discussed in Streamline Your App with Design Patterns). When a notification of the specified name is posted, the block is invoked to handle the notification.</p></blockquote>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="n">opQ</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSOperationQueue</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[[</span><span class="n">NSNotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span> <span class="nl">addObserverForName:</span><span class="s">@&quot;CustomOperationCompleted&quot;</span>
</span><span class='line'>             <span class="nl">object:</span><span class="nb">nil</span> <span class="nl">queue:</span><span class="n">opQ</span>
</span><span class='line'>        <span class="nl">usingBlock:</span><span class="o">^</span><span class="p">(</span><span class="n">NSNotification</span> <span class="o">*</span><span class="n">notif</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// 处理通知消息的代码放到这里</span>
</span><span class='line'>    <span class="p">}];</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[查看app里被Xcode优化了的png图片]]></title>
    <link href="http://leolovenet.com/blog/2013/01/10/Viewing-iOS-Optimized-PNGs/"/>
    <updated>2013-01-10T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2013/01/10/Viewing-iOS-Optimized-PNGs</id>
    <content type="html"><![CDATA[<p>问题:当我们构建自己的ios app时，Xcode会优化压缩我们的程序里的png图片，如果想再次查看正常图片的话，需要反压缩，怎么做呢？<br/>
答案：用Xcode自带的工具。</p>

<p><strong>Q: When I build my iOS application, Xcode optimizes the PNG files within my application’s bundle, meaning that Preview can’t display them. How can I view these optimized files?</strong></p>

<p>A: This optimization is done by the <strong>pngcrush</strong> tool, which you can find inside Xcode. The <strong>pngcrush</strong> tool supports a command line option, <code>-revert-iphone-optimizations</code>, that undoes the optimizations done during the Xcode build process. So, to view an optimized PNG file, you should first undo the optimization and then open it with Preview.</p>

<p>Listing 1 shows how you can use the <strong>pngcrush</strong> tool to convert an iOS-optimized PNG file (<code>Local.png</code>) to a standard PNG file (<code>Local-standard.png</code>).</p>

<p><strong>Listing 1:</strong> Undoing iOS PNG optimization</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>/Applications/Xcode.app/Contents/Developer<span class="se">\</span>
</span><span class='line'>/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush <span class="se">\</span>
</span><span class='line'>-revert-iphone-optimizations -q Local.png Local-standard.png
</span></code></pre></td></tr></table></div></figure>


<p>If you have Xcode installed in a non-standard place, you can locate the tool using <strong>xcode-select</strong>, as shown in Listing 2.</p>

<p><strong>Listing 2:</strong> Using <strong>xcode-select</strong> to locate pngcrush</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span><span class="s2">&quot;`xcode-select -print-path`&quot;</span><span class="se">\</span>
</span><span class='line'>/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush <span class="se">\</span>
</span><span class='line'>-revert-iphone-optimizations -q Local.png Local-standard.png
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[利用php+Bootstrap+QQwrt.dat展示你的IP和位置信息]]></title>
    <link href="http://leolovenet.com/blog/2012/12/22/ShowYourIP/"/>
    <updated>2012-12-22T00:00:00+08:00</updated>
    <id>http://leolovenet.com/blog/2012/12/22/ShowYourIP</id>
    <content type="html"><![CDATA[<p>ShowYourIP利用php+Bootstrap+QQwrt.dat展示用户IP和位置信息，并可以利用ajax查询任意ip地址的物理位置。 <a href="https://github.com/leolovenet/ShowYourIP">GitHub</a>.</p>

<p><img src="https://raw.github.com/leolovenet/ShowYourIP/master/showYourIP.png" title="showYourIP" alt="showYourIP.png" /></p>
]]></content>
  </entry>
  
</feed>
