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

  <title><![CDATA[elephant]]></title>
  <link href="http://me.angry-arthas.com/atom.xml" rel="self"/>
  <link href="http://me.angry-arthas.com/"/>
  <updated>2015-10-26T01:05:40+08:00</updated>
  <id>http://me.angry-arthas.com/</id>
  <author>
    <name><![CDATA[secondrocker]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[谈谈我对“游客参与不合理低价游也将被处理”的看法]]></title>
    <link href="http://me.angry-arthas.com/blog/2015/10/26/de-kan-fa/"/>
    <updated>2015-10-26T00:20:14+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2015/10/26/de-kan-fa</id>
    <content type="html"><![CDATA[<blockquote><p>本文内容纯属意淫，如违反法律法规请告知删除；本着意淫无罪的方针，作者不对本文承担任何责任。</p></blockquote>

<p>近日内地游客在港遇袭身亡的事在网上炒的沸沸扬扬，各种看法纷沓而出；国家旅游局却另辟蹊径，捧出了“游客参与不合理低价游也将被处理”的决策；此决策一出，除个别“天赋异禀”人事，大家的评价出奇一致：脑残。
我实在难以理解这个决策，这到底是要保护被宰游客的合法权利，还是要对不甘心被宰的游客进行打击报复？</p>

<p>首先这个不合理低价游怎么判断，游客不是专业人士，怎么能区分定价是否合理？莫非国家旅游局会对各类旅游分门别类地给出“合理价位”？恐怕办不到吧。那么这决策就无异于“到使用地沟油餐厅吃饭将受到处分”一样了。游客无法区分“不合理低价游”，上当受骗就是难免的了；而旅游局的“也将受到处分（一旦被查获，不仅不能获得赔偿，还将受到处理）”将导致游客被宰后不敢举报，打碎牙齿和血吞,导致旅游市场更加混乱。</p>

<p>那么只能有另一个办法了：旅游局只给大型旅行社发牌照，而不在大型旅行社办理的旅游都属于“不合理低价游”。而这只能导致行业垄断或者大部分旅游进入黑市交易，穷人根本无力出游，这是国家旅游局的初衷吗？</p>

<p>其实解决的方法用脚趾头就能想出：规范旅游市场，根据游客反馈对旅行社进行分级、公示，对存在宰客现象的旅行社采取限期整改、吊销执照等处理，提醒游客到正规旅行社办理出游；即使存在零星宰客现象也无伤大雅。而国家旅游局人员智商肯定比我等屁民高，为什么会出台如此脑残政策？看看下一步决策，再看看受益的会是哪些群体，就一目了然了。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Requirejs]]></title>
    <link href="http://me.angry-arthas.com/blog/2015/09/14/requirejs/"/>
    <updated>2015-09-14T00:26:42+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2015/09/14/requirejs</id>
    <content type="html"><![CDATA[<p>js通过script标签的默认加载方式是同步的，即第一个script标签内的js加载完成后，才开始加载第二个，以此类推，直至js文件全部加载完毕。且js的依赖关系必须通过script的顺序才能确保；而在js加载期间，浏览器将停止响应，这大大影响了用户体验，基于此，很多解决js以来和加载的方案出现,require js就是其中之一。</p>

<p>requirejs加载的模块，一般为符合AMD标准的模块，即用define定义，用ruturn返回暴露方法、变量的模块；requirejs也可以加载飞AMD标准的模块，但比较麻烦，这次不涉及。</p>

<p>require加载js主涉及以下方面:</p>

<ul>
<li>script 标签data-main属性声明requirejs加载的入口模块，async=&ldquo;true&rdquo;(非ie) 和defer(ie)标签表明异步加载。</li>
<li>require.config配置模块对应的路径</li>
<li>require声明依赖关系</li>
</ul>


<p>html demo</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='html'><span class='line'>  <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;js/require.js&quot;</span> <span class="na">defer</span> <span class="na">async=</span><span class="s">&quot;true&quot;</span> <span class="na">data-main=</span><span class="s">&quot;js/main&quot;</span> <span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="c">&lt;!--给出requirejs路径，声明为异步加载，指定入口模块为main.js（可省略.js）--&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>main.js</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="nx">require</span><span class="p">.</span><span class="nx">config</span><span class="p">({</span>
</span><span class='line'>      <span class="c1">//声明模块的位置</span>
</span><span class='line'>      <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="s2">&quot;jquery&quot;</span><span class="o">:</span><span class="s2">&quot;libs/jquery&quot;</span>
</span><span class='line'>          <span class="s2">&quot;login&quot;</span> <span class="o">:</span> <span class="s2">&quot;libs/login&quot;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="c1">//或使用baseUrl指定所有模块的路径</span>
</span><span class='line'>      <span class="nx">baseUrl</span><span class="o">:</span> <span class="s2">&quot;js/libs&quot;</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="c1">//使用require加载模块，第一个参数为数组，即要加载的模块，将按数组顺序加载；第二个为回调函数，在全部加载完成后执行。</span>
</span><span class='line'>  <span class="nx">require</span><span class="p">([</span><span class="s1">&#39;jquery&#39;</span><span class="p">,</span><span class="s1">&#39;login&#39;</span><span class="p">],</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">,</span><span class="nx">Login</span><span class="p">){</span>
</span><span class='line'>      <span class="nx">alert</span><span class="p">(</span><span class="s2">&quot;jquery and login module load success!&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">Login</span><span class="p">.</span><span class="nx">do_login</span><span class="p">();</span>
</span><span class='line'>      <span class="c1">//some else</span>
</span><span class='line'> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>符合amd的login module定义</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='js'><span class='line'>  <span class="c1">//依赖jquery的定义</span>
</span><span class='line'>  <span class="nx">define</span><span class="p">([</span><span class="s1">&#39;jquery&#39;</span><span class="p">],</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">){</span>
</span><span class='line'>     <span class="c1">// some definations</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">do_login</span><span class="p">(){</span>
</span><span class='line'>        <span class="nx">$</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">&#39;/sessions/create&#39;</span><span class="p">,{</span><span class="nx">uname</span><span class="o">:</span><span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#uname&quot;</span><span class="p">).</span><span class="nx">val</span><span class="p">(),</span>
</span><span class='line'>                  <span class="nx">password</span><span class="o">:</span><span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#password&quot;</span><span class="p">).</span><span class="nx">val</span><span class="p">()},</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">){</span>
</span><span class='line'>          <span class="c1">//some </span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>     <span class="k">return</span> <span class="p">{</span><span class="nx">do_login</span><span class="o">:</span><span class="nx">do_login</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="c1">//不依赖其他模块的定义</span>
</span><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>  <span class="c1">//some definations</span>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span><span class="nx">xx</span><span class="o">:</span><span class="nx">xx</span><span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>rails没有应用js加载器，一方面是新版本的rails的asset pipe会将所有的js文件打包为一个js文件，没有多个js加载的状态，另一方面turbolink使用褒贬参半的所谓pjax技术，默认链接改为ajax方式，只获取html的bod部分,head部分不变动，使js的加载只在第一次打开网站时进行。</p>

<p>转载请注明出处:<a href="http://me.angry-arthas.com/blog/2015/09/14/requirejs/">http://me.angry-arthas.com/blog/2015/09/14/requirejs/</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Angularjs浅尝1]]></title>
    <link href="http://me.angry-arthas.com/blog/2015/09/06/angularjsqian-chang-1/"/>
    <updated>2015-09-06T00:39:14+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2015/09/06/angularjsqian-chang-1</id>
    <content type="html"><![CDATA[<p>AngularJS是为了克服HTML在构建应用上的不足而设计的。通常，我们是通过以下技术来解决静态网页技术在构建动态应用上的不足：</p>

<ul>
<li>类库 - 类库是一些函数的集合，它能帮助你写WEB应用。起主导作用的是你的代码，由你来决定何时使用类库。类库有：jQuery等</li>
<li>框架 - 框架是一种特殊的、已经实现了的WEB应用，你只需要对它填充具体的业务逻辑。这里框架是起主导作用的，由它来根据具体的应用逻辑来调用你的代码。框架有：knockout、sproutcore等。</li>
</ul>


<p> AngularJS使用了不同的方法，它尝试去补足HTML本身在构建应用方面的缺陷。AngularJS通过使用我们称为标识符(directives)的结构，让浏览器能够识别新的语法。例如：</p>

<ul>
<li>使用双大括号语法进行数据绑定；</li>
<li>使用DOM控制结构来实现迭代或者隐藏DOM片段；</li>
<li>支持表单和表单的验证；</li>
<li>能将逻辑代码关联到相关的DOM元素上；</li>
<li>能将HTML分组成可重用的组件。</li>
</ul>


<p>Demo</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>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!doctype html&gt;</span>
</span><span class='line'><span class="nt">&lt;html</span> <span class="na">ng-app=</span><span class="s">&quot;index&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>angularjs test<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src =</span><span class="err"> </span><span class="s">&quot;/javascripts/angular-1.0.1.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src =</span><span class="err"> </span><span class="s">&quot;/javascripts/controller.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body</span> <span class="na">ng-controller=</span><span class="s">&quot;IndexCtrl&quot;</span> <span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;ul&gt;</span>
</span><span class='line'>      <span class="nt">&lt;li</span> <span class="na">ng-repeat=</span><span class="s">&quot;contact in contacts&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        name:,age:,hometown:,
</span><span class='line'>      <span class="nt">&lt;/li&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>    name:<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;new_contact.name&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    age:<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model =</span><span class="s">&quot;new_contact.age&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    hometown:<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model =</span><span class="err"> </span><span class="s">&quot;new_contact.hometown&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;button</span> <span class="na">ng-click=</span><span class="s">&quot;add_contact()&quot;</span><span class="nt">&gt;</span>新增<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s1">&#39;index&#39;</span><span class="p">,[]).</span><span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;IndexCtrl&#39;</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">$scope</span><span class="p">.</span><span class="nx">contacts</span> <span class="o">=</span> <span class="p">[{</span>
</span><span class='line'>      <span class="nx">name</span><span class="o">:</span><span class="s1">&#39;陈冠希,</span>
</span><span class='line'><span class="s1">      age:20,</span>
</span><span class='line'><span class="s1">      hometown:&#39;</span><span class="nx">hk</span>
</span><span class='line'>    <span class="p">},{</span>
</span><span class='line'>      <span class="nx">name</span><span class="o">:</span><span class="s1">&#39;张柏芝,</span>
</span><span class='line'><span class="s1">      age:22,</span>
</span><span class='line'><span class="s1">      hometown:&#39;</span><span class="nx">hk</span><span class="s1">&#39;}];</span>
</span><span class='line'><span class="s1">  $scope.reset_contact = function(){</span>
</span><span class='line'><span class="s1">    $scope.new_contact = {</span>
</span><span class='line'><span class="s1">      name:&#39;&#39;,</span>
</span><span class='line'><span class="s1">      age:&#39;&#39;,</span>
</span><span class='line'><span class="s1">      hometown:&#39;</span><span class="err">&#39;</span>
</span><span class='line'>    <span class="p">};};</span>
</span><span class='line'>  <span class="nx">$scope</span><span class="p">.</span><span class="nx">add_contact</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">contacts</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">$scope</span><span class="p">.</span><span class="nx">new_contact</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">reset_contact</span><span class="p">();</span>
</span><span class='line'>  <span class="p">};});</span>
</span></code></pre></td></tr></table></div></figure>


<p>ng-app表明angularjs将对其标签声明内的dom进行处理,index名字是作用域名，表明属于index作用域。angular.module(&lsquo;index&rsquo;,[]).controller表明在index作用域内定义controller，同理ng-controller表明其内的变量属于IndexCtrl。
ng-model声明此标检绑定在new_contact变量，angularjs控制其值随变量而改变。ng-click声明由add_contact处理点击。在li标签里面的ng-repeat=&ldquo;contact in contacts"语句是一个AngularJS迭代器。这个迭代器告诉AngularJS用第一个li标签作为模板为列表中的每一个联系人创建一个li元素。由此当点击新增按钮时将输入框内所代表的model添加到contacts内，并将add_contact变量置空，而页面的显示由angularjs自动完成。
angularjs只对ng-app内的dom起作用，因此可以在任何页面使用angularjs而不破坏ng-app外的所有dom，js。
angularjs与restful后端交互非常方便，使用ngResource组件，声明好CRUD的路径、http veb，就可方便调用save,update与后端交互。
Demo</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='coffeescript'><span class='line'><span class="nx">app</span><span class="o">=</span><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&quot;index&quot;</span><span class="p">,[</span><span class="s">&quot;ngResource&quot;</span><span class="p">])</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">factory</span> <span class="s">&quot;Contact&quot;</span><span class="p">,</span><span class="nf">($resource) -&gt;</span>
</span><span class='line'><span class="nx">$resource</span><span class="p">(</span><span class="s">&quot;/contacts/:id.json&quot;</span><span class="p">,{</span><span class="nx">id</span><span class="o">:</span><span class="s">&quot;@id&quot;</span><span class="p">},{</span><span class="nx">update</span><span class="o">:</span><span class="p">{</span><span class="nx">method</span><span class="o">:</span><span class="s">&quot;put&quot;</span><span class="p">}})</span>
</span><span class='line'><span class="nv">$scope.contacts = </span><span class="nx">Contact</span><span class="p">.</span><span class="nx">query</span> <span class="c1"># /contacts</span>
</span><span class='line'><span class="nx">Contact</span><span class="p">.</span><span class="nx">save</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">new_contact</span> <span class="c1">#create</span>
</span><span class='line'><span class="nx">contact</span><span class="p">.</span><span class="nx">$update</span> <span class="c1">#更新</span>
</span></code></pre></td></tr></table></div></figure>


<p>转载请注明出处:<a href="http://me.angry-arthas.com/blog/2015/09/06/angularjsqian-chang-1/">me.angry-arthas.com/blog/2015/09/06/angularjsqian-chang-1/</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rake学习2]]></title>
    <link href="http://me.angry-arthas.com/blog/2015/09/06/rakexue-xi-2/"/>
    <updated>2015-09-06T00:37:25+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2015/09/06/rakexue-xi-2</id>
    <content type="html"><![CDATA[<p>启动一个rack程序有两种方式</p>

<ul>
<li>直接使用ruby运行.rb文件,默认在8080启动服务，无日志文件</li>
<li>使用rackup，默认在9292 启动服务，有日志文件，rackup可使用 -o 指定ip, －p 指定端口号</li>
</ul>


<figure class='code'><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=''><span class='line'>require 'rack'
</span><span class='line'>app = lambda{|env| [200,{},["hello world"]] }
</span><span class='line'>Rack::Server.new.server.run app</span></code></pre></td></tr></table></div></figure>


<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'>ruby  xxx.rb
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://upload-images.jianshu.io/upload_images/19532-fe374674bf1d9442.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="无log输出" /></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='ruby'><span class='line'><span class="c1">#test.ru</span>
</span><span class='line'><span class="n">run</span> <span class="nb">lambda</span><span class="p">{</span><span class="o">|</span><span class="n">env</span><span class="o">|</span> <span class="o">[</span> <span class="mi">200</span><span class="p">,{},</span><span class="o">[</span><span class="s2">&quot;rackup start&quot;</span><span class="o">]</span> <span class="o">]</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<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'>rackup test.ru
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://upload-images.jianshu.io/upload_images/19532-adb4372d3fafaae5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="有log输出" /></p>

<p>rack会在启动时默认加载一些中间件:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'> <span class="k">def</span> <span class="nf">logging_middleware</span>
</span><span class='line'>        <span class="nb">lambda</span> <span class="p">{</span> <span class="o">|</span><span class="n">server</span><span class="o">|</span>
</span><span class='line'>          <span class="n">server</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">name</span> <span class="o">=~</span> <span class="sr">/CGI/</span> <span class="o">||</span> <span class="n">server</span><span class="o">.</span><span class="n">options</span><span class="o">[</span><span class="ss">:quiet</span><span class="o">]</span> <span class="p">?</span> <span class="kp">nil</span> <span class="p">:</span> <span class="o">[</span><span class="no">Rack</span><span class="o">::</span><span class="no">CommonLogger</span><span class="p">,</span> <span class="vg">$stderr</span><span class="o">]</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">m</span> <span class="o">=</span> <span class="no">Hash</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span><span class="o">|</span><span class="n">h</span><span class="p">,</span><span class="n">k</span><span class="o">|</span> <span class="n">h</span><span class="o">[</span><span class="n">k</span><span class="o">]</span> <span class="o">=</span> <span class="o">[]</span><span class="p">}</span>
</span><span class='line'>        <span class="n">m</span><span class="o">[</span><span class="s2">&quot;deployment&quot;</span><span class="o">]</span> <span class="o">=</span> <span class="o">[</span>
</span><span class='line'>          <span class="o">[</span><span class="no">Rack</span><span class="o">::</span><span class="no">ContentLength</span><span class="o">]</span><span class="p">,</span>
</span><span class='line'>          <span class="o">[</span><span class="no">Rack</span><span class="o">::</span><span class="no">Chunked</span><span class="o">]</span><span class="p">,</span>
</span><span class='line'>          <span class="n">logging_middleware</span><span class="p">,</span>
</span><span class='line'>          <span class="o">[</span><span class="no">Rack</span><span class="o">::</span><span class="no">TempfileReaper</span><span class="o">]</span>
</span><span class='line'>        <span class="o">]</span>
</span><span class='line'>        <span class="n">m</span><span class="o">[</span><span class="s2">&quot;development&quot;</span><span class="o">]</span> <span class="o">=</span> <span class="o">[</span>
</span><span class='line'>          <span class="o">[</span><span class="no">Rack</span><span class="o">::</span><span class="no">ContentLength</span><span class="o">]</span><span class="p">,</span>
</span><span class='line'>          <span class="o">[</span><span class="no">Rack</span><span class="o">::</span><span class="no">Chunked</span><span class="o">]</span><span class="p">,</span>
</span><span class='line'>          <span class="n">logging_middleware</span><span class="p">,</span>
</span><span class='line'>          <span class="o">[</span><span class="no">Rack</span><span class="o">::</span><span class="no">ShowExceptions</span><span class="o">]</span><span class="p">,</span>
</span><span class='line'>          <span class="o">[</span><span class="no">Rack</span><span class="o">::</span><span class="no">Lint</span><span class="o">]</span><span class="p">,</span>
</span><span class='line'>          <span class="o">[</span><span class="no">Rack</span><span class="o">::</span><span class="no">TempfileReaper</span><span class="o">]</span>
</span><span class='line'>        <span class="o">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">m</span>
</span><span class='line'>      <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>包括body长度错误提示访问记录等。</p>

<p>rack有一个Directory的中间件，可以为目录文件生成一个web服务，今天主要研究这个。
使用很简单一句话</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='ruby'><span class='line'><span class="c1">#test.ru</span>
</span><span class='line'><span class="n">run</span>  <span class="no">Rack</span><span class="o">::</span><span class="no">Directory</span><span class="o">.</span><span class="n">new</span> <span class="s2">&quot;~/&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<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'>rackup test.ru
</span></code></pre></td></tr></table></div></figure>


<p>这样就会把home目录下的所有文件、文件夹在浏览器中显示
<img src="http://upload-images.jianshu.io/upload_images/19532-144fd52fb50a8428.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="文件页面" /></p>

<p>rails应用中使用rake middleware即可显示所有的middleware(中间件)</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>** **rake middleware
</span><span class='line'>use Rack::Sendfile
</span><span class='line'>use ActionDispatch::Static
</span><span class='line'>use Rack::Lock
</span><span class='line'>use <span class="c">#&lt;ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007feef1563b90&gt;</span>
</span><span class='line'>use Rack::Runtime
</span><span class='line'>use Rack::MethodOverride
</span><span class='line'>use ActionDispatch::RequestId
</span><span class='line'>use Rails::Rack::Logger
</span><span class='line'>use ActionDispatch::ShowExceptions
</span><span class='line'>use WebConsole::Middleware
</span><span class='line'>use ActionDispatch::DebugExceptions
</span><span class='line'>use ActionDispatch::RemoteIp
</span><span class='line'>use ActionDispatch::Reloader
</span><span class='line'>use ActionDispatch::Callbacks
</span><span class='line'>use ActiveRecord::Migration::CheckPending
</span><span class='line'>use ActiveRecord::ConnectionAdapters::ConnectionManagement
</span><span class='line'>use ActiveRecord::QueryCache
</span><span class='line'>use ActionDispatch::Cookies
</span><span class='line'>use ActionDispatch::Session::CookieStore
</span><span class='line'>use ActionDispatch::Flash
</span><span class='line'>use ActionDispatch::ParamsParser
</span><span class='line'>use Rack::Head
</span><span class='line'>use Rack::ConditionalGet
</span><span class='line'>use Rack::ETag
</span><span class='line'>run Fool::Application.routes
</span></code></pre></td></tr></table></div></figure>


<p>rails使用了rack定义的一些中间件，自定义了一些中间件，其中自定义的routes为rack程序，routes 把rails controller的action变为lambda并作为rack程序运行，在rails console里输入</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'>2.2.1 :001 &gt; QuestionsController.action<span class="o">(</span>:new<span class="o">)</span>
</span><span class='line'> <span class="o">=</span>&gt; <span class="c">#&lt;Proc:0x007fbe482ee0b0@/Users/killman/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.1/lib/action_controller/metal.rb:237 (lambda)&gt; </span>
</span></code></pre></td></tr></table></div></figure>


<p>在config/application.rb可添加、删除、修改中间件</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='ruby'><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">middleware</span><span class="o">.</span><span class="n">use</span><span class="p">(</span><span class="n">new_middleware</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span><span class="err">＃：把新中间件添加到列表末尾；</span>
</span><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">middleware</span><span class="o">.</span><span class="n">insert_before</span><span class="p">(</span><span class="n">existing_middleware</span><span class="p">,</span>
</span><span class='line'> <span class="n">new_middleware</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span><span class="c1">#：在 existing_middleware</span>
</span><span class='line'><span class="err"> 之前添加新中间件；</span>
</span><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">middleware</span><span class="o">.</span><span class="n">insert_after</span><span class="p">(</span><span class="n">existing_middleware</span><span class="p">,</span>
</span><span class='line'> <span class="n">new_middleware</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span><span class="c1">#：在 existing_middleware</span>
</span><span class='line'><span class="err"> 之后添加新中间件；</span>
</span><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">middleware</span><span class="o">.</span><span class="n">swap</span> <span class="no">ActionDispatch</span><span class="o">::</span><span class="no">ShowExceptions</span><span class="p">,</span> <span class="no">Lifo</span><span class="o">::</span><span class="no">ShowExceptions</span> <span class="c1">#替换中间件</span>
</span><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">middleware</span><span class="o">.</span><span class="n">delete</span> <span class="s2">&quot;Rack::Lock&quot;</span><span class="c1">#删除中间件</span>
</span></code></pre></td></tr></table></div></figure>


<h3>中间件的作用：</h3>

<p><strong>Rack::Sendfile
</strong>：设置服务器上的 X-Sendfile 报头。通过 config.action_dispatch.x_sendfile_header
 选项设置。
<strong>ActionDispatch::Static
</strong>：用来服务静态资源文件。如果选项 config.serve_static_assets
 为 false
，则禁用这个中间件。
<strong>Rack::Lock
</strong>：把 env[&ldquo;rack.multithread&rdquo;]
 旗标设为 false
，程序放入互斥锁中。
<strong>ActiveSupport::Cache::Strategy::LocalCache::Middleware
</strong>：在内存中保存缓存，非线程安全。
<strong>Rack::Runtime
</strong>：设置 X-Runtime 报头，即执行请求的时长，单位为秒。
<strong>Rack::MethodOverride
</strong>：如果指定了 params[:_method]
 参数，会覆盖所用的请求方法。这个中间件实现了 PUT 和 DELETE 方法。
<strong>ActionDispatch::RequestId
</strong>：在响应中设置一个唯一的 X-Request-Id 报头，并启用 ActionDispatch::Request#uuid
 方法。
<strong>Rails::Rack::Logger
</strong>：请求开始时提醒日志，请求完成后写入日志。
<strong>ActionDispatch::ShowExceptions
</strong>：补救程序抛出的所有异常，调用处理异常的程序，使用特定的格式显示给用户。
<strong>ActionDispatch::DebugExceptions
</strong>：如果在本地开发，把异常写入日志，并显示一个调试页面。
<strong>ActionDispatch::RemoteIp
</strong>：检查欺骗攻击的 IP。
<strong>ActionDispatch::Reloader
</strong>：提供“准备”和“清理”回调，协助开发环境中的代码重新加载功能。
<strong>ActionDispatch::Callbacks
</strong>：在处理请求之前调用“准备”回调。
<strong>ActiveRecord::Migration::CheckPending
</strong>：检查是否有待运行的迁移，如果有就抛出 ActiveRecord::PendingMigrationError
 异常。
<strong>ActiveRecord::ConnectionAdapters::ConnectionManagement
</strong>：请求处理完成后，清理活跃的连接，除非在发起请求的环境中把 rack.test
 设为 true
。
<strong>ActiveRecord::QueryCache
</strong>：启用 Active Record 查询缓存。
<strong>ActionDispatch::Cookies
</strong>：设置请求的 cookies。
<strong>ActionDispatch::Session::CookieStore
</strong>：负责把会话存储在 cookies 中。
<strong>ActionDispatch::Flash
</strong>：设置 Flash 消息的键。只有设定了 config.action_controller.session_store
 选项时才可用。
<strong>ActionDispatch::ParamsParser
</strong>：把请求中的参数出入 params
。
<strong>ActionDispatch::Head
</strong>：把 HEAD 请求转换成 GET 请求，并处理。
<strong>Rack::ConditionalGet
</strong>：添加对“条件 GET”的支持，如果页面未修改，就不响应。
<strong>Rack::ETag
</strong>：为所有字符串类型的主体添加 ETags 报头。ETags 用来验证缓存。</p>

<p>转载请注明出处:<a href="http://me.angry-arthas.com/blog/2015/09/06/rakexue-xi-2/">me.angry-arthas.com/blog/2015/09/06/rakexue-xi-2/</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rake学习1]]></title>
    <link href="http://me.angry-arthas.com/blog/2015/09/06/rakexue-xi-1/"/>
    <updated>2015-09-06T00:24:51+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2015/09/06/rakexue-xi-1</id>
    <content type="html"><![CDATA[<blockquote><p>rack是ruby服务器和rack应用程序之间的一个框架，rails,sinatra都是基
于rack构建的，都属于rack应用程序。</p>

<p>rack提供了一个标准的接口，用于与服务器进行交互。标准的rack程序
是一个可以响应call的对象，可以是对象、Proc、lambda甚至是method，
它接收env参数（环境对象），返回一个数组，数组包括：</p></blockquote>

<ul>
<li>状态(status)，http响应状态码</li>
<li>可以是hash，为http的header信息</li>
<li>拥有each方法的对象，each返回字符串</li>
</ul>


<blockquote><p>rack通过中间件来进行扩展，即对原始的rack程序进行装饰，
在原有返回数组的基础上进一步处理，并返回rack对象</p>

<p>简单的rack程序</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;rack&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">app</span> <span class="o">=</span> <span class="nb">lambda</span><span class="p">{</span><span class="o">|</span><span class="n">env</span><span class="o">|[</span><span class="mi">200</span><span class="p">,{},</span><span class="o">[</span><span class="s2">&quot;hello from rack&quot;</span><span class="o">]]</span><span class="p">}</span>
</span><span class='line'><span class="no">Rack</span><span class="o">::</span><span class="no">Handler</span><span class="o">::</span><span class="no">WEBrick</span><span class="o">.</span><span class="n">run</span> <span class="n">app</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>使用中间件的rack程序</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>
<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='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;rack&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Decorator</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@app</span> <span class="o">=</span> <span class="n">app</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'>    <span class="n">status</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="vi">@app</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'>    <span class="n">new_body</span> <span class="o">=</span> <span class="s2">&quot;from middleware input &lt;br/&gt;&quot;</span>
</span><span class='line'>    <span class="n">body</span><span class="o">.</span><span class="n">each</span><span class="p">{</span><span class="o">|</span><span class="n">str</span><span class="o">|</span> <span class="n">new_body</span> <span class="o">&lt;&lt;</span> <span class="n">str</span><span class="p">}</span>
</span><span class='line'>    <span class="n">headers</span><span class="o">[</span><span class="s1">&#39;Content-Length&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="n">new_body</span><span class="o">.</span><span class="n">bytesize</span><span class="o">.</span><span class="n">to_s</span>
</span><span class='line'>    <span class="o">[</span><span class="n">status</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="o">[</span><span class="n">new_body</span><span class="o">]]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">app</span> <span class="o">=</span> <span class="nb">lambda</span><span class="p">{</span><span class="o">|</span><span class="n">env</span><span class="o">|[</span><span class="mi">200</span><span class="p">,{},</span><span class="o">[</span><span class="s2">&quot;hello from rack&quot;</span><span class="o">]]</span><span class="p">}</span>
</span><span class='line'><span class="no">Rack</span><span class="o">::</span><span class="no">Handler</span><span class="o">::</span><span class="no">WEBrick</span><span class="o">.</span><span class="n">run</span> <span class="no">Decorator</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>上面使用中间件的方法在使用多个时容易混乱，rack有一个Builder类可以有效管理
使用如下</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>
<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='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;rack&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;decorator&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">app</span> <span class="o">=</span> <span class="no">Rack</span><span class="o">::</span><span class="no">Builder</span><span class="o">.</span><span class="n">new</span><span class="p">{</span>
</span><span class='line'>  <span class="n">use</span> <span class="no">Rack</span><span class="o">::</span><span class="no">ContentLength</span>
</span><span class='line'>  <span class="n">use</span> <span class="no">Decorator</span>
</span><span class='line'>  <span class="n">run</span> <span class="nb">lambda</span> <span class="p">{</span><span class="o">|</span><span class="n">env</span><span class="o">|</span> <span class="o">[</span><span class="mi">200</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;Content-Type&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;text/html&quot;</span><span class="p">},</span> <span class="o">[</span><span class="s2">&quot;hello world&quot;</span><span class="o">]]</span><span class="p">}</span>
</span><span class='line'><span class="p">}</span><span class="o">.</span><span class="n">to_app</span>
</span><span class='line'><span class="no">Rack</span><span class="o">::</span><span class="no">Handler</span><span class="o">::</span><span class="no">WEBrick</span><span class="o">.</span><span class="n">run</span> <span class="n">app</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>使用Rack::Builder的map方法，可以创建有路由的rack程序</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>
<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='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;rack&#39;</span>
</span><span class='line'><span class="n">app</span> <span class="o">=</span> <span class="no">Rack</span><span class="o">::</span><span class="no">Builder</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">map</span> <span class="s1">&#39;/hello&#39;</span> <span class="k">do</span>
</span><span class='line'><span class="n">run</span> <span class="nb">lambda</span> <span class="p">{</span><span class="o">|</span><span class="n">env</span><span class="o">|</span> <span class="o">[</span><span class="mi">200</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;Content-Type&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;text/html&quot;</span><span class="p">},</span> <span class="o">[</span><span class="s2">&quot;hello&quot;</span><span class="o">]]</span> <span class="p">}</span> <span class="k">end</span>
</span><span class='line'><span class="n">map</span> <span class="s1">&#39;/world&#39;</span> <span class="k">do</span>
</span><span class='line'><span class="n">run</span> <span class="nb">lambda</span> <span class="p">{</span><span class="o">|</span><span class="n">env</span><span class="o">|</span> <span class="o">[</span><span class="mi">200</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;Content-Type&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;text/html&quot;</span><span class="p">},</span> <span class="o">[</span><span class="s2">&quot;world&quot;</span><span class="o">]]</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">map</span> <span class="s1">&#39;/&#39;</span> <span class="k">do</span>
</span><span class='line'><span class="n">run</span> <span class="nb">lambda</span> <span class="p">{</span><span class="o">|</span><span class="n">env</span><span class="o">|</span> <span class="o">[</span><span class="mi">200</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;Content-Type&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;text/html&quot;</span><span class="p">},</span> <span class="o">[</span><span class="s2">&quot;all&quot;</span><span class="o">]]</span> <span class="p">}</span> <span class="k">end</span>
</span><span class='line'><span class="p">}</span><span class="o">.</span><span class="n">to_app</span>
</span><span class='line'><span class="no">Rack</span><span class="o">::</span><span class="no">Handler</span><span class="o">::</span><span class="no">WEBrick</span><span class="o">.</span><span class="n">run</span> <span class="n">app</span><span class="p">,</span> <span class="ss">:Port</span> <span class="o">=&gt;</span> <span class="mi">3000</span>
</span></code></pre></td></tr></table></div></figure>


<p>由于rails的全栈性，rack中间件很多，在一些高并发但业务简单的网站或api使用时
响应时间过长，在这种情况下可以考虑使用rack或者sinatra。</p>

<p>转载请注明出处:<a href="http://me.angry-arthas.com/blog/2015/09/06/rakexue-xi-1/">me.angry-arthas.com/blog/2015/09/06/rakexue-xi-1/</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Instance_eval,instance_exec,class_eval,class_exec 区别]]></title>
    <link href="http://me.angry-arthas.com/blog/2015/06/07/instance-ev-instance-exec-class-eval-class-exec-qu-bie/"/>
    <updated>2015-06-07T23:52:08+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2015/06/07/instance-ev-instance-exec-class-eval-class-exec-qu-bie</id>
    <content type="html"><![CDATA[<p>对于instance_eval和class_eval，在看ruby元编程时以为搞清楚了，但最近发现一种情况，却又让我迷糊了：</p>

<p>class_eval</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="k">class</span> <span class="nc">A</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">A</span><span class="o">.</span><span class="n">class_eval</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">a</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s1">&#39;a&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">define_method</span> <span class="ss">:b</span> <span class="k">do</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s1">&#39;b&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">A</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">a</span> <span class="c1"># &#39;a&#39;</span>
</span><span class='line'><span class="n">A</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">b</span> <span class="c1"># &#39;b&#39;</span>
</span><span class='line'><span class="c1">#a和b都是A的实例方法</span>
</span></code></pre></td></tr></table></div></figure>


<p>instance_eval</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="k">class</span> <span class="nc">A</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">A</span><span class="o">.</span><span class="n">instance_eval</span> <span class="k">do</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">a</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s1">&#39;a&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">define_method</span> <span class="ss">:b</span> <span class="k">do</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s1">&#39;b&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">A</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">b</span> <span class="c1"># &#39;b&#39; b为实例方法</span>
</span><span class='line'><span class="n">A</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">a</span> <span class="c1">#  no method error!!!</span>
</span><span class='line'><span class="n">A</span><span class="o">.</span><span class="n">a</span> <span class="c1"># ‘a’</span>
</span></code></pre></td></tr></table></div></figure>


<p>为什么在instance_eval中 def 和define_method定义的一个为类方法(类的单件方法) 一个为实例方法呢？</p>

<p>要解释这个问题，首先要有以下概念:
ruby在执行时，会一直追踪当前对象（receiver）即self，但也会追踪当前类(current class)。instance_eval和class_eval都会修改self和current class:</p>

<ul>
<li>klass.class_eval 修改self为klass，修改current class为klass</li>
<li>obj.instance_eval 修改self为obj,修改current class为obj的eigen_class（singleton_class)。</li>
</ul>


<p>了解了以上知识，我们知道define_method的接受者为self,class_eval和instance_eval都改变self为调用者本身，所以定义的为实例方法；而对def起作用的是当前类（current class），class_eval修改当前类为调用者本身，所以定义的是类方法，而instance_eval修改当前类为调用者的eigen_class(singleton_class)，所以定义的是类方法(类的单件方法)。</p>

<p>另外，class_eval仅类可调用，instance_eval则类和对象都可调用。</p>

<p>class(instance)_exec与eval基本相似，但有以下不同：</p>

<ul>
<li>_evals既可传递字符串，也可传递块，如123.instance_eval &lsquo;to_s&rsquo;</li>
<li><em>exec只能传递块、不能传字符串，但</em>exec可以为block传递参数如  Class.instance_exec(&lsquo;Self&rsquo;){|x|p &ldquo;#{x}:self&rdquo;}</li>
</ul>


<p>至此，class_eval，instance_eval,instance_exec,instance_eval概念基本都透彻了。
对于current class有些未说清的（未研究透彻,初步判断current class 对关键字起作用，self对方法调用起作用~），回头研究完单写一篇。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Rails Way 翻译 第一章]]></title>
    <link href="http://me.angry-arthas.com/blog/2015/05/24/the-rails-way-fan-yi/"/>
    <updated>2015-05-24T19:18:10+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2015/05/24/the-rails-way-fan-yi</id>
    <content type="html"><![CDATA[<h1>1 Rails 环境与配置</h1>

<blockquote><p>Rails之所以获得很多关注和参与，是因为我不去取悦那些不愿意分享问题的人。生产环境和开发环境的区别对我来说是个大问题，所以我用我所知的最佳方式解决这个问题</p>

<p>&ndash;dhh</p>

<p>Rails预制了3种标准运行模式:developments,test以及production。这些基本的模式拥有一些标准的配置比如：连接那个数据库、是否对每个请求重新加载类。如果有必要，创建你自己的运行模式也很简单。</p>

<p>当前的环境由环境变量RAILS_ENV指定，RAILS_ENV对应定义的运行方式并决定加载config/enviroments下定义的配置文件，你可以设置环境变量决定运行方式，或者使用默认的production模式。因为环境配置项决定Rails最重要的表现例如类文件的加载，为了真正了解Rails的运行方式，你应该理解这些环境配置。</p>

<p>在本章，我们以Bundler开始,Bundler是一个管理ruby程序gem依赖的工具。Bundle有一个gem清单，他可以安装清单中的gems，以及这些gems所依赖的gems。之后我们通过研究boot.rb和application.rb以及三个标准模式的配置，理解Rails的启动和请求处理过程。我们也会讲到自定义运行环境的基础知识以及为什么自定义运行环境。</p>

<p>本书不是以最新的Rails进行书写，为了理解本书你最少必须知道如何启动Rails程序以及理解MVC的意义。如果不符合，我建议你先看看Michael Hartl书写的Ruby on Rails Tutorial website一书。</p>

<h2>1.1 Bundler</h2>

<p>Bundler不是专为Rails设计的技术，但他是管理应用程序gem依赖的优先方式。Rails4依赖并默认会使用Bundler，你不必单独安装bundler这个gem</p>

<p>因为我们觉得你应该使用Bundler，如何不使用Bundler只是作为练习以及为不循常规的人准备。</p>

<p>Bundler最重要的是一次解决配置中所有的gem依赖。这不同于Rubygems和之前Rails使用的一次解决一个(one-at-a-time)的依赖解决方案，我们通过下面的难以修正的问题来说明。</p>

<p>假设你的系统安装了下列版本的rubygem</p>

<ul>
<li>activesupport 4.0.2</li>
<li>activesupport 3.2.11</li>
<li>activemerchant 1.29.3</li>
<li>rails 3.2.11</li>
</ul>


<p>因为activemerchant 1.29.3依赖 activesupport >= 2.3.14,所以当你用下面的gem 命令加载时</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='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;activemerchant&#39;</span><span class="p">,</span> <span class="s1">&#39;1.29.3&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>这会加载activemerchant，同时加载了最新版本的依赖gem，activesupport 4.0.2 gem,因为他比2.3.14版本高，之后当加载rails时:</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='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;rails&#39;</span><span class="p">,</span> <span class="s1">&#39;3.2.11&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>运行时出现了如下错误</p>

<blockquote><p>can&rsquo;t activate activementsupport(=3.2.11,runtime)
for[&ldquo;rails-3.2.11&rdquo;],already activated
activesupport-4.0.2 for
[&ldquo;activemerchant-1.29.3&rdquo;]</p></blockquote>

<p>因为activemerchant对activesupport有广泛(broader)依赖，而旧版本的Rails却依赖较窄[narrow]的依赖。Bundler依靠一次评价并获取正确的gem版本来解决这个问题</p>

<p>想了解有关Bundler构思出来的有趣设想请阅读 Yehuda&rsquo;s <a href="http://yehudakatz.com/2010/04/21/named-gem-environments-and-bundler/">blog post on the subject</a></p>

<h3>1.1.1 Gemfile</h3>

<p>定位到Rails项目的根目录下，有一个gem的清单文件-Gemfile，该文件基于ruby。Gemfile列出了Rails项目的所有依赖，包括正在使用的Rails版本。Gemfile的语法超级简单:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;kaminari&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;nokogiri&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>把依赖写到指定一个或多个环境名作为符号的块中，就只在指定的运行环境下才加载这些依赖:</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>
<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="n">group</span> <span class="ss">:development</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">gem</span> <span class="s1">&#39;pry-rails&#39;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">group</span> <span class="ss">:test</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">gem</span> <span class="s1">&#39;capybara&#39;</span>
</span><span class='line'>    <span class="n">gem</span> <span class="s1">&#39;database_cleaner&#39;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">group</span>  <span class="ss">:development</span><span class="p">,</span> <span class="ss">:test</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">gem</span> <span class="s1">&#39;rspec-rails&#39;</span>
</span><span class='line'>    <span class="n">gem</span> <span class="s1">&#39;factory_girl_rails&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><blockquote><p>如果你从Rails3升级，记住Rails4不再为asset pipeline依赖的包使用assets分组，你需要把移除assets group分组</p></blockquote>

<p>gem指令第二个参数为可选的，他指定了需要gem的特定版本，忽略该参数会自动获取最新稳定版本的gem，可能不是可用的最新版本，你需要指定确切的版本才能加载特定版本或者预览版。</p>

<p>版本参数的格式你可能已经熟悉</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;nokogiri&#39;</span><span class="p">,</span> <span class="s1">&#39;1.5.6&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;pry-rails&#39;</span><span class="p">,</span> <span class="s1">&#39;&gt; 0.2.2&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;decent_exposure&#39;</span><span class="p">,</span> <span class="s1">&#39;~&gt; 2.0.1&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;draper&#39;</span><span class="p">,</span> <span class="s1">&#39;1.0.0.beta6&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>你可以在<a href="http://docs.rubygems.org/read/chapter/16">RubyGems documentation</a>  找到版本字符参数的完整说明</p>

<p>有时候gem有特定的需求才能使用，不同于gem repo中的声明，这此种情况下，require选项很容易地解决</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='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;webmock&#39;</span><span class="p">,</span><span class="nb">require</span><span class="ss">:&#39;webmock/rspec&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>1.1.1.1 从git库加载gems</h4>

<blockquote><p>到现在为止我们已经学会了从<a href="http://rubygems.org">http://rubygems.org</a> 加载gem。我们也可以从源代码库加载特定的gem，只要他的根目录下有.gemspec文件。只需在调用gem时添加:git选项。</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='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;carrierwave&#39;</span><span class="p">,</span> <span class="ss">git</span><span class="p">:</span> <span class="s1">&#39;git@github.com:carriverwaveuploader/carrierwave.git&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>如果gem的源代码库是在Github上托管并未public，你可以使用:github这个简便选项</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='ruby'><span class='line'><span class="n">gem</span>  <span class="s1">&#39;carriverwave&#39;</span><span class="p">,</span> <span class="ss">github</span><span class="p">:</span> <span class="s1">&#39;carriverwaveuploader/carrierwave&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>也支持二进制或者c扩展的gemspec</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='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;nokogiri&#39;</span><span class="p">,</span> <span class="ss">git</span><span class="p">:</span> <span class="s1">&#39;git://github.com/tenderlove/nokugiri.git&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>如果gem的源代码库根目录下没有.gemspec文件，你必须指定确定的版本</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='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;deep_merge&#39;</span> <span class="p">,</span><span class="s1">&#39;1.0&#39;</span><span class="p">,</span> <span class="ss">git</span><span class="p">:</span> <span class="s1">&#39;git://github.com/peritor/deep_merge.git&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>如果gem源代码库有多个.gemrspec文件，你可以指定使用特定的ref,branch,或者tag：</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;rails&#39;</span><span class="p">,</span> <span class="n">git</span> <span class="s1">&#39;git://github.com/rails/rails.git&#39;</span><span class="p">,</span> <span class="ss">ref</span><span class="p">:</span> <span class="s1">&#39;4aded&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;rails&#39;</span><span class="p">,</span> <span class="n">git</span> <span class="s1">&#39;git://github.com/rails/rails.git&#39;</span><span class="p">,</span> <span class="ss">branch</span><span class="p">:</span> <span class="s1">&#39;3-2-stable&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;rails&#39;</span><span class="p">,</span> <span class="n">git</span> <span class="s1">&#39;git://github.com/rails/rails.git&#39;</span><span class="p">,</span> <span class="ss">tag</span><span class="p">:</span> <span class="s1">&#39;v3.2.11&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>1.1.1.2 从文件系统中加载gems</h4>

<blockquote><p>使用 :path选项，你可以使用本地开发中的gem</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='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;nokogiri&#39;</span><span class="p">,</span> <span class="ss">path</span><span class="p">:</span> <span class="s1">&#39;~/code/nokogiri&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>1.1.2 安装gems</h3>

<blockquote><p>每次修改Gemfile,或者更具体地说，如果引入了未安装的依赖，运行bundle来确保Gemfile的所有依赖都可用。</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>bundle install
</span><span class='line'><span class="c">#some information</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>安装指令会在不导致冲突的情况下安装Gemfile下的所有gems至最新版本
你可以使用 &ndash;without 选项来不安装指定运行模式下的gems</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>bundle install --without development <span class="nb">test</span>
</span><span class='line'><span class="nv">$ </span>bundle install --without <span class="nb">test</span>
</span></code></pre></td></tr></table></div></figure>


<h3>1.1.3 gem锁</h3>

<blockquote><p>每次运行 bundle install 或者 bundle update,Bundler计算所有的依赖关系并将结果存在一个名为Gemfile.lock的文件中。从这点看来，Bundler只会加载Gemfile锁定时所指定版本，你知道可以正确运行的gems。</p>

<blockquote><p>Note
Gemfile.lcok文件应该加入版本控制中，以确保每个电脑运行该程序时使用指定的相同版本的gems</p>

<p>为了说明这点的重要性，想象一下在发布时Gemfile.lock丢失。因为依赖关系不存在了，Bundler只能在发布的机器上重新指定Gemfile中的gem版本，这会导致安装你未测试的新版本的gem，导致无法预料的问题。</p></blockquote></blockquote>

<h3>1.1.4 打包gems</h3>

<blockquote><p>你可以在你的rails应用程序中把vendor/cache下所有的gem打包</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='bash'><span class='line'><span class="nv">$ </span>bundle package
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>在拥有打包的gems的应用中运行 bundle install &ndash;local会安装包内的gems，而不会连接rubygems.org或其他gems源。你可以在发布时使用这点来避免外部的依赖、或者你依赖在public代码库不可用的私有gems。</p>

<blockquote><p>确保gem依赖在非rails脚本中可用</p>

<p>非Rails脚本必须运行过Bundle exec来获得正确的初始运行环境。
<code>$ bundle exec guard</code>
Rails 4在生成新项目时会为rails执行环境在bin目录中生成binstubs，binstub是包含了bundle运行上下文执行环境的脚本。这意味着你不用每次执行都要加上bundle exec。binstubs是rails 4的一等公民，应该加入版本控制代码中。
默认情况下，下边的stub在每个rails新项目中都可用:
* bin/bundle
* bin/rails
* bin/rake
* bin/spring</p>

<p>从rails 3升级
如果你从rails3升级且在以前使用Bundler生成过binstubs,你必须运行下列命令以升级binstubs</p></blockquote></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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">bundle</span> <span class="n">config</span> <span class="o">--</span><span class="n">delete</span> <span class="n">bin</span><span class="c1">#关闭Bundlers的stub生成器</span>
</span><span class='line'><span class="n">rake</span> <span class="ss">rails</span><span class="p">:</span><span class="ss">update</span><span class="p">:</span><span class="n">bin</span> <span class="c1">#使用rails4的新的指令</span>
</span><span class='line'><span class="n">git</span> <span class="n">add</span> <span class="n">bin</span> <span class="c1">#把bin文件加到版本控制中</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>使用bundle binstubs some-gem-name可以为bundler加入可执行的binstub，示例如下:</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='bash'><span class='line'><span class="nv">$ </span>bundle binstubs guard
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>可在bin目录下创建guard bistub:</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>
<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>
</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">#</span>
</span><span class='line'><span class="c1"># This file was generated by Bundle.</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1"># The application &#39;guard&#39; is installed as part of a gem,and this file is here to facilitate(正式) running it</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;pathname&#39;</span>
</span><span class='line'><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;BUNDLE_GEMFILE&#39;</span><span class="o">]</span>  <span class="o">||=</span>
</span><span class='line'><span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="s2">&quot;../../Gemfile&quot;</span><span class="p">,</span> <span class="no">Pathname</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">_FILE_</span><span class="p">)</span><span class="o">.</span><span class="n">realpath</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;rubygems&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;bundler/setup&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="nb">load</span> <span class="no">Gem</span><span class="o">.</span><span class="n">bin_path</span><span class="p">(</span><span class="s1">&#39;guard&#39;</span><span class="p">,</span><span class="s1">&#39;guard&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>使用binstubs,bin目录下的脚本可以直接运行</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='bash'><span class='line'><span class="nv">$ </span>bin/guard
</span></code></pre></td></tr></table></div></figure>


<h2>1.2 rails启动以及应用配置</h2>

<blockquote><p>当你使用rails启动进程(比如运行rails server)以处理请求时，首先执行的是 config/boot.rb的加载,在rails栈的启动中，将会涉及三个文件:
* boot.rb Bunlder和加载路径的建立
* application.rb 加载rails的gems,特定运行环境下的gems，配置应用程序
* enviroment.rb 执行所有的安装</p></blockquote>

<h3>1.2.1 application.rb</h3>

<blockquote><p>config/application.rb是rails程序配置的所在，他是在config/enviroment.rb之前唯一被加载的。
让我们一步一步看看创建rails程序的默认配置。顺便说下，改变这些配置文件需要重启程序才能起作用。</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[对hash进行递归操作]]></title>
    <link href="http://me.angry-arthas.com/blog/2015/05/11/dui-hashjin-xing-di-gui-cao-zuo/"/>
    <updated>2015-05-11T20:49:11+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2015/05/11/dui-hashjin-xing-di-gui-cao-zuo</id>
    <content type="html"><![CDATA[<blockquote><p>将hash {a:1,b:{c1:2,c2:3,c3:{d1:4,d2:5},e:6}}转化为下面字符串
a = 1 , b_c1 = 2 , b_c2 = 3 , b_c3_d1 = 4 , b_c3_d2 = 5 , b_e = 6</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>
<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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">hash</span> <span class="o">=</span> <span class="p">{</span><span class="ss">a</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span><span class="ss">b</span><span class="p">:{</span><span class="ss">c1</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span><span class="ss">c2</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span><span class="ss">c3</span><span class="p">:{</span><span class="ss">d1</span><span class="p">:</span><span class="mi">4</span><span class="p">,</span><span class="ss">d2</span><span class="p">:</span><span class="mi">5</span><span class="p">},</span><span class="ss">e</span><span class="p">:</span><span class="mi">6</span><span class="p">}}</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">unfold</span><span class="p">(</span><span class="nb">hash</span><span class="p">,</span><span class="nb">p</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">arr</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>  <span class="nb">hash</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span><span class="o">|</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="o">|</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">instance_of?</span> <span class="no">Hash</span>
</span><span class='line'>      <span class="n">arr</span> <span class="o">+=</span> <span class="n">unfold</span><span class="p">(</span><span class="n">v</span><span class="p">,</span><span class="nb">p</span><span class="o">+</span><span class="n">k</span><span class="o">.</span><span class="n">to_s</span><span class="o">+</span><span class="s2">&quot;_&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="n">arr</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="nb">p</span><span class="si">}#{</span><span class="n">k</span><span class="o">.</span><span class="n">to_s</span><span class="si">}</span><span class="s2"> = </span><span class="si">#{</span><span class="n">v</span><span class="o">.</span><span class="n">to_s</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">arr</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="nb">puts</span> <span class="n">unfold</span><span class="p">(</span><span class="nb">hash</span><span class="p">)</span><span class="o">.</span><span class="n">join</span> <span class="s2">&quot; , &quot;</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>递归操作一般用于将问题复杂度降低，但感觉ruby的栈使递归无法发挥，稍微大点的递归就会导致栈溢出，之前写的递归版本的插入排序，同样的思路在java/java/c#都很好用，但在ruby中就是不行，要么调整栈的大小，但运行缓慢，很多时候总是得换为循环，感觉应该不是算法的问题,不知道什么时候ruby才能解决这个问题</p>

<hr />

<p>之前写的插入排序</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>
<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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">insertSort</span><span class="p">(</span><span class="n">left</span><span class="o">=[]</span><span class="p">,</span><span class="n">arr</span><span class="p">)</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">left</span> <span class="k">unless</span> <span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">arr</span><span class="o">.</span><span class="n">pop</span><span class="p">)</span>
</span><span class='line'>    <span class="n">left</span><span class="o">.</span><span class="n">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">l</span><span class="p">,</span><span class="n">i</span><span class="o">|</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">l</span><span class="o">&gt;</span><span class="n">x</span>
</span><span class='line'>            <span class="n">left</span><span class="o">.</span><span class="n">insert</span> <span class="n">i</span><span class="p">,</span><span class="n">x</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">insertSort</span> <span class="n">left</span><span class="p">,</span><span class="n">arr</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="n">left</span><span class="o">.</span><span class="n">push</span> <span class="n">x</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">insertSort</span> <span class="n">left</span><span class="p">,</span><span class="n">arr</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">arr</span><span class="o">=[]</span>
</span><span class='line'><span class="n">arrE</span><span class="o">=</span><span class="p">(</span><span class="mi">1</span><span class="o">.</span><span class="n">.</span><span class="mi">10000</span><span class="p">)</span><span class="o">.</span><span class="n">to_a</span>
</span><span class='line'><span class="mi">10000</span><span class="o">.</span><span class="n">times</span> <span class="k">do</span> <span class="o">|</span><span class="n">t</span><span class="o">|</span>
</span><span class='line'>    <span class="n">tmp</span><span class="o">=</span><span class="nb">rand</span><span class="p">(</span><span class="n">arrE</span><span class="o">.</span><span class="n">count</span><span class="p">)</span>
</span><span class='line'>    <span class="n">arr</span><span class="o">.</span><span class="n">push</span> <span class="p">(</span><span class="n">arrE</span><span class="o">.</span><span class="n">delete_at</span> <span class="n">tmp</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="nb">puts</span> <span class="p">(</span><span class="n">insertSort</span> <span class="n">arr</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Constructor &amp;&amp; Prototype]]></title>
    <link href="http://me.angry-arthas.com/blog/2015/03/18/constructor-and-and-prototype/"/>
    <updated>2015-03-18T16:42:25+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2015/03/18/constructor-and-and-prototype</id>
    <content type="html"><![CDATA[<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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">A</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){};</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="nx">A</span><span class="p">.</span><span class="nx">prototype</span> <span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">c</span> <span class="o">=</span> <span class="nx">p</span><span class="p">.</span><span class="nx">constructor</span><span class="p">;</span>
</span><span class='line'><span class="nx">A</span><span class="o">==</span><span class="nx">c</span>
</span></code></pre></td></tr></table></div></figure>


<p>函数的对象的constructor就是该函数（未修改prototype）</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">A</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">A</span><span class="p">();</span>
</span><span class='line'><span class="nx">a</span><span class="p">.</span><span class="nx">constructor</span> <span class="o">==</span> <span class="nx">A</span>
</span></code></pre></td></tr></table></div></figure>


<p>修改函数的prototype后其对象的constructor为新的prototype的constructor</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='js'><span class='line'><span class="kd">function</span> <span class="nx">A</span><span class="p">(){};</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">B</span><span class="p">(){};</span>
</span><span class='line'><span class="nx">A</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">B</span><span class="p">();</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">((</span><span class="k">new</span> <span class="nx">A</span><span class="p">()).</span><span class="nx">constructor</span><span class="p">);</span> <span class="c1">//为function B(){}</span>
</span><span class='line'><span class="nx">A</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">constructor</span> <span class="o">=</span> <span class="nx">A</span><span class="p">;</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">((</span><span class="k">new</span> <span class="nx">A</span><span class="p">()).</span><span class="nx">constructor</span><span class="p">);</span><span class="c1">//为function A(){}</span>
</span></code></pre></td></tr></table></div></figure>


<p>{}(对象直接量)对象是function Object(){}的对象</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Super_method]]></title>
    <link href="http://me.angry-arthas.com/blog/2015/03/18/super-method/"/>
    <updated>2015-03-18T16:33:21+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2015/03/18/super-method</id>
    <content type="html"><![CDATA[<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='ruby'><span class='line'><span class="k">class</span> <span class="nc">A</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">show</span>
</span><span class='line'>    <span class="s2">&quot;a method&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">B</span><span class="o">&lt;</span><span class="n">A</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">show</span>
</span><span class='line'>    <span class="s2">&quot;b method&quot;</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>怎样用类B的对象调用A的show方法?</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">B</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">method</span><span class="p">(</span><span class="ss">:show</span><span class="p">)</span><span class="o">.</span><span class="n">super_memthod</span><span class="o">.</span><span class="n">call</span>  <span class="c1">#ruby 2.2可用</span>
</span></code></pre></td></tr></table></div></figure>


<p>2.2之前</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="k">class</span> <span class="nc">A</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">show</span>
</span><span class='line'>    <span class="s2">&quot;a method&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">B</span><span class="o">&lt;</span><span class="n">A</span>
</span><span class='line'>  <span class="n">alias_method</span> <span class="ss">:super_show</span> <span class="p">,</span><span class="ss">:show</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">show</span>
</span><span class='line'>    <span class="s2">&quot;b method&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">B</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">super_show</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Git命令]]></title>
    <link href="http://me.angry-arthas.com/blog/2014/09/18/gitming-ling/"/>
    <updated>2014-09-18T01:15:24+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2014/09/18/gitming-ling</id>
    <content type="html"><![CDATA[<ul>
<li>查看每次git 提交历史  git log</li>
<li>恢复到某个版本 git reset &ndash;hard [此版本号编号]</li>
<li>恢复到上次提交 git reset &ndash;hard HEAD^   上上次为 HEAD^^ 多次为 HEAD~num</li>
<li>恢复到之前版本后git log 不再显示恢复到的版本之后的提交情况  可使用 git reflog 查看全部更新历史

<h3>打标签</h3></li>
<li>git tag [tag-name]在当前分支最后一次提交打标签打标签</li>
<li>git tag [tag-name] [commit-id] 在某次提交da'biao'qian</li>
<li>创建带有说明的标签 git tag -a [tag-name] -m [message] [commit-id]</li>
<li>推送到远程 git push [origin] [tag-name]</li>
<li>删除本地标签 git tag -d [tag-name]</li>
<li>推送所有未推送标签 git push [origin] &ndash; tags</li>
<li>删除远程标签 git tag -d [tag-name] git push origin :refs/tags/v0.9</li>
<li>git命令起别名 git config &ndash;global alias.co checkout缩短输入长度</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Coffeescript的=>]]></title>
    <link href="http://me.angry-arthas.com/blog/2014/08/27/coffeescriptde-equals-%3E/"/>
    <updated>2014-08-27T16:05:54+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2014/08/27/coffeescriptde-equals-></id>
    <content type="html"><![CDATA[<p>瘦箭头 ->用于 function创建</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='coffeescript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s">&quot;#login&quot;</span><span class="p">).</span><span class="nx">click</span> <span class="nf">-&gt;</span>
</span><span class='line'>  <span class="nx">alert</span><span class="p">(</span><span class="s">&quot;ca&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>胖箭头=>把 this作为参数代入function
在function中使用this 为外部定义function的this，起到作用域转移的作用</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='coffeescript'><span class='line'><span class="nx">user_id</span><span class="o">=</span><span class="s">&quot;nidaye&quot;</span>
</span><span class='line'><span class="nx">ele</span><span class="p">.</span><span class="nx">addEventListener</span> <span class="s">&quot;click&quot;</span><span class="p">,</span><span class="nf">(e)=&gt;</span>
</span><span class='line'>  <span class="nx">alert</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">user_id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby元编程1]]></title>
    <link href="http://me.angry-arthas.com/blog/2014/08/08/rubyyuan-bian-cheng-1/"/>
    <updated>2014-08-08T10:59:50+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2014/08/08/rubyyuan-bian-cheng-1</id>
    <content type="html"><![CDATA[<h1>ruby元编程之eigenclass</h1>

<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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">BasicObject</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">eigenclass</span>
</span><span class='line'>    <span class="k">class</span> <span class="o">&lt;&lt;</span> <span class="nb">self</span>
</span><span class='line'>      <span class="nb">self</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">eigenclass</span>
</span><span class='line'>    <span class="k">class</span> <span class="o">&lt;&lt;</span> <span class="nb">self</span>
</span><span class='line'>      <span class="nb">self</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">A</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">haha</span>
</span><span class='line'>    <span class="s2">&quot;ah&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">B</span> <span class="o">&lt;</span> <span class="n">A</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#对象eigenclass的superclass就是对象的类</span>
</span><span class='line'><span class="n">b</span><span class="o">=</span><span class="n">B</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="nb">p</span> <span class="n">b</span><span class="o">.</span><span class="n">eigenclass</span><span class="o">.</span><span class="n">superclass</span> <span class="o">==</span> <span class="n">B</span>
</span><span class='line'><span class="c1">#类的eigenclass的superclass是类超类的eigenclass</span>
</span><span class='line'><span class="nb">p</span> <span class="n">B</span><span class="o">.</span><span class="n">eigenclass</span><span class="o">.</span><span class="n">superclass</span> <span class="o">==</span> <span class="n">B</span><span class="o">.</span><span class="n">superclass</span><span class="o">.</span><span class="n">eigenclass</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Js闭包]]></title>
    <link href="http://me.angry-arthas.com/blog/2014/08/08/jsbi-bao/"/>
    <updated>2014-08-08T10:58:57+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2014/08/08/jsbi-bao</id>
    <content type="html"><![CDATA[<p>创建一个对象时如果该对象用到某个内部作用域的变量，那么对这个内部作用域创建一个闭包</p>

<p>eg</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='javascript'><span class='line'><span class="kd">function</span> <span class="nx">a</span><span class="p">(){</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">n</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">addN</span><span class="o">=</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">n</span><span class="o">+=</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">n</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">addN</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">x</span><span class="o">=</span><span class="nx">a</span><span class="p">();</span>     <span class="c1">//创建一个闭包</span>
</span><span class='line'><span class="nx">x</span><span class="p">();</span>       <span class="c1">//输出1</span>
</span><span class='line'><span class="nx">x</span><span class="p">();</span>       <span class="c1">//输出2</span>
</span><span class='line'><span class="nx">y</span><span class="o">=</span><span class="nx">a</span><span class="p">();</span>     <span class="c1">//创建另一个闭包</span>
</span><span class='line'><span class="nx">y</span><span class="p">();</span>       <span class="c1">//输出1</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[RSPEC学习1]]></title>
    <link href="http://me.angry-arthas.com/blog/2014/08/08/rspecxue-xi-1/"/>
    <updated>2014-08-08T09:48:01+08:00</updated>
    <id>http://me.angry-arthas.com/blog/2014/08/08/rspecxue-xi-1</id>
    <content type="html"><![CDATA[<p>rails 安装 rspec
- gem &lsquo;rspec-rails&rsquo;</p>

<p>创建rspec配置文件
- rails g rspec:install</p>

<p>should与should_not
- 对象如有valid?之类的方法，test可这么写model.should be_valid或model.should_not be_valid
- model.should == xx  <strong>等同</strong> model.should eq xx</p>

<p>expect
- expect(model).to eq  some_thing</p>

<p>let与before
- let与before(:each)的一个区别是before可以初始化变量,let不能before可以这样</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='ruby'><span class='line'><span class="n">before</span><span class="p">(</span><span class="ss">:each</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">king</span><span class="o">=</span><span class="s2">&quot;亚历山大&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>before(:each) 每个测试相互独立，分别调用这个</li>
<li>before(:all)只调用这个一次</li>
<li>let可用于定义变量，如下，在测试用例中可使用 king_of_zombie变量</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>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:king_of_zombie</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>    <span class="s2">&quot;邓肯&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Load RSpec 2.x support by adding the following line (typically to your spec_helper.rb file):
require &lsquo;capybara/rspec&rsquo;
If you are using Rails, put your Capybara specs in spec/features.
If you are not using Rails, tag all the example groups in which you want to use Capybara with :type => :feature.
You can now write your specs like so:
describe &ldquo;the signin process&rdquo;, :type => :feature do
  before :each do
    User.make(:email => &lsquo;<a href="&#x6d;&#x61;&#105;&#x6c;&#x74;&#x6f;&#x3a;&#x75;&#115;&#x65;&#114;&#64;&#101;&#120;&#97;&#x6d;&#112;&#108;&#101;&#x2e;&#x63;&#111;&#x6d;">&#x75;&#115;&#101;&#x72;&#x40;&#101;&#x78;&#97;&#109;&#112;&#108;&#x65;&#46;&#99;&#111;&#x6d;</a>&rsquo;, :password => &lsquo;caplin&rsquo;)
  end</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='ruby'><span class='line'>  <span class="n">it</span> <span class="s2">&quot;signs me in&quot;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">visit</span> <span class="s1">&#39;/sessions/new&#39;</span>
</span><span class='line'>    <span class="n">within</span><span class="p">(</span><span class="s2">&quot;#session&quot;</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Login&#39;</span><span class="p">,</span> <span class="ss">:with</span> <span class="o">=&gt;</span> <span class="s1">&#39;user@example.com&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="ss">:with</span> <span class="o">=&gt;</span> <span class="s1">&#39;password&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="n">click_link</span> <span class="s1">&#39;Sign in&#39;</span>
</span><span class='line'>    <span class="n">expect</span><span class="p">(</span><span class="n">page</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">have_content</span> <span class="s1">&#39;Success&#39;</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><a href="http://rubydoc.info/gems/rspec-rails/file/Capybara.md">http://rubydoc.info/gems/rspec-rails/file/Capybara.md</a>
<a href="https://github.com/rspec/rspec-rails">https://github.com/rspec/rspec-rails</a></p>

<p>Many users have been confused by the co-existence of the the Capybara::DSL (visit/page) alongside the rack-test DSL (get|post|put|delete|head/response.body) in examples in spec/requests and spec/controllers. As of rspec-rails-2.11.1 and capybara-2.0.0.beta2, these are separated as follows:</p>

<p>Capybara::DSL is included
- spec/features</p>

<p>rack-test DSL is included in
- spec/requests and spec/controllers</p>

<p>Capybara::RSpecMatchers is added to examples in:
- spec/features
- spec/controllers
- spec/views
- spec/helpers
- spec/mailers</p>

<p>2012年6月,Rspec开发团队宣布,在v2.11中使用了新句法
来替代传统的should式句法,如</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='ruby'><span class='line'><span class="n">it</span> <span class="s2">&quot;is true when true&quot;</span> <span class="k">do</span>
</span><span class='line'> <span class="kp">true</span><span class="o">.</span><span class="n">should</span> <span class="n">be_true</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>新句法会把要测试的值传递给 expect() 方法,然后和匹配器比较:</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='ruby'><span class='line'><span class="n">it</span> <span class="s2">&quot;is true when true&quot;</span> <span class="k">do</span>
</span><span class='line'> <span class="n">expect</span><span class="p">(</span><span class="kp">true</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">be_true</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>当有多个it &ldquo;xxxx&rdquo; do end 而测试的主题一致时，
可用</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='ruby'><span class='line'><span class="n">subject</span><span class="p">{</span><span class="vi">@object</span><span class="p">}</span>
</span><span class='line'><span class="n">it</span> <span class="p">{</span> <span class="n">should</span> <span class="n">eq</span> <span class="n">xx</span><span class="p">}</span>
</span><span class='line'><span class="n">it</span> <span class="p">{</span> <span class="n">should</span> <span class="n">have_content</span><span class="p">(</span><span class="s2">&quot;cccc&quot;</span><span class="p">)}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
</feed>
