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

  <title><![CDATA[蕲春人 - 软件开发]]></title>
  <link href="http://qichunren.github.com/atom.xml" rel="self"/>
  <link href="http://qichunren.github.com/"/>
  <updated>2012-02-11T17:31:33+08:00</updated>
  <id>http://qichunren.github.com/</id>
  <author>
    <name><![CDATA[qichunren]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Use Smarty template in CodeIgniter]]></title>
    <link href="http://qichunren.github.com/blog/2012/02/11/use-smarty-template-in-codeigniter/"/>
    <updated>2012-02-11T16:57:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2012/02/11/use-smarty-template-in-codeigniter</id>
    <content type="html"><![CDATA[<p><a href="http://codeigniter.com/">CodeIgniter</a>是一个不错的PHP开发框架，很合我的口味，我做的一些PHP项目就是用的它。</p>

<p><a href="http://www.smarty.net/">Smarty</a>是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容，提供了一种易于管理和使用的方法，用来将原本与HTML代码混杂在一起的PHP代码逻辑分离。</p>

<p>一般来说使用原生PHP作为视图会比使用模板引擎高效，一些简单的项目或者个人开发者可以直接使用PHP，如果是大一点的项目，再加上要和美工配合，使用模板引擎会是分工明确，合作高效一些。</p>

<p>在CodeIgniter使用Smarty模板引擎一点也不复杂，这是因为CodeIgniter提供了<a href="http://codeigniter.org.cn/user_guide/general/creating_libraries.html">创建类库</a>的方便方法。</p>

<p>我这里使用的CodeIgniter和Smarty都是最新版本,2.1.0和3.1.7</p>

<p>1: 将Smarty包下载后，解压后，放入CodeIgniter项目中的application/libraries目录.</p>

<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>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>caojinhua:company caojinhua$ ls application/libraries/
</span><span class='line'>Smarty.php    index.html  smarty/
</span><span class='line'>caojinhua:company caojinhua$ ls application/libraries/smarty/
</span><span class='line'>Smarty.class.php  SmartyBC.class.php  debug.tpl       plugins/        sysplugins/</span></code></pre></td></tr></table></div></figure>


<p>2: 在application/libraries目录中创建Smarty.php文件。</p>

<figure class='code'><figcaption><span>application/libraries/Smarty.php  </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>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span> <span class="k">if</span> <span class="p">(</span> <span class="o">!</span> <span class="nb">defined</span><span class="p">(</span><span class="s1">&#39;BASEPATH&#39;</span><span class="p">))</span> <span class="k">exit</span><span class="p">(</span><span class="s1">&#39;No direct script access allowed&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="k">require_once</span><span class="p">(</span><span class="s1">&#39;smarty/Smarty.class.php&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">CI_Smarty</span> <span class="k">extends</span> <span class="nx">Smarty</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">function</span> <span class="nf">__construct</span><span class="p">(){</span>
</span><span class='line'>          <span class="k">parent</span><span class="o">::</span><span class="na">__construct</span><span class="p">();</span>
</span><span class='line'>                <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">compile_dir</span> <span class="o">=</span> <span class="nx">FCPATH</span> <span class="o">.</span> <span class="s2">&quot;application/views/templates_c&quot;</span><span class="p">;</span>
</span><span class='line'>                <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">template_dir</span> <span class="o">=</span> <span class="nx">FCPATH</span> <span class="o">.</span> <span class="s2">&quot;application/views/templates&quot;</span><span class="p">;</span>
</span><span class='line'>                <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">cache_dir</span> <span class="o">=</span> <span class="nx">FCPATH</span> <span class="o">.</span> <span class="s2">&quot;application/views/cache&quot;</span><span class="p">;</span><span class="c1">//缓存目录</span>
</span><span class='line'>                <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">caching</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>                <span class="c1">//$this-&gt;cache_lifetime = 120; //缓存更新时间</span>
</span><span class='line'>                <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">debugging</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>                <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">compile_check</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span> <span class="c1">// 检查当前的模板是否自上次编译后被更改；如果被更改了，它将重新编译该模板。</span>
</span><span class='line'>                <span class="c1">//$this-&gt;force_compile = true; // 强制重新编译模板</span>
</span><span class='line'>                <span class="c1">//$this-&gt;allow_php_templates= true; // 开启PHP模板</span>
</span><span class='line'>                <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">left_delimiter</span> <span class="o">=</span> <span class="s2">&quot;{&quot;</span><span class="p">;</span> <span class="c1">//左定界符</span>
</span><span class='line'>                <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">right_delimiter</span> <span class="o">=</span> <span class="s2">&quot;}&quot;</span><span class="p">;</span> <span class="c1">//右定界符</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="cp">?&gt;</span><span class="x"></span>
</span></code></pre></td></tr></table></div></figure>


<p>根据代码中的smarty目录配置，需要在application/views中建立templates_c\templates\cache三个目录.
这就算创建好了。</p>

<p>3: 使用方法。
控制器中的代码:</p>

<figure class='code'><figcaption><span>application/controllers/debug.php  </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>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span> <span class="k">if</span> <span class="p">(</span> <span class="o">!</span> <span class="nb">defined</span><span class="p">(</span><span class="s1">&#39;BASEPATH&#39;</span><span class="p">))</span> <span class="k">exit</span><span class="p">(</span><span class="s1">&#39;No direct script access allowed&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Debug</span> <span class="k">extends</span> <span class="nx">MY_Controller</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">function</span> <span class="nf">__construct</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">parent</span><span class="o">::</span><span class="na">__construct</span><span class="p">();</span>
</span><span class='line'>    <span class="c1">// Write your own initialize code</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">function</span> <span class="nf">index</span><span class="p">(){</span>
</span><span class='line'>      <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">load</span><span class="o">-&gt;</span><span class="na">library</span><span class="p">(</span><span class="s1">&#39;smarty&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">smarty</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">(</span><span class="s2">&quot;title&quot;</span><span class="p">,</span><span class="s2">&quot;smarty template&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">smarty</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">(</span><span class="s2">&quot;body&quot;</span><span class="p">,</span><span class="s2">&quot;欢迎使用smarty模板引擎&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="nv">$arr</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="mi">1</span> <span class="o">=&gt;</span> <span class="s1">&#39;number 1&#39;</span><span class="p">,</span> <span class="mi">2</span> <span class="o">=&gt;</span> <span class="s1">&#39;number 2&#39;</span><span class="p">,</span> <span class="mi">3</span> <span class="o">=&gt;</span> <span class="s1">&#39;number 3&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">smarty</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">(</span><span class="s2">&quot;myarray&quot;</span><span class="p">,</span> <span class="nv">$arr</span><span class="p">);</span>
</span><span class='line'>      <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">smarty</span><span class="o">-&gt;</span><span class="na">display</span><span class="p">(</span><span class="s1">&#39;index.html&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>模板代码:</p>

<figure class='code'><figcaption><span>application/views/templates/index.html  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span>
</span><span class='line'><span class="nt">&lt;html</span> <span class="na">xmlns=</span><span class="s">&quot;http://www.w3.org/1999/xhtml&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;meta</span> <span class="na">http-equiv=</span><span class="s">&quot;Content-Type&quot;</span> <span class="na">content=</span><span class="s">&quot;text/html; charset=utf-8&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;title&gt;</span>smarty模板使用示例<span class="nt">&lt;/title&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'><span class="nt">&lt;body&gt;</span>
</span><span class='line'><span class="nt">&lt;h1&gt;</span>{$title}<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'><span class="nt">&lt;p&gt;</span>{$body}<span class="nt">&lt;/p&gt;</span>
</span><span class='line'><span class="nt">&lt;ul&gt;</span>
</span><span class='line'>        {foreach from=$myarray item=v}
</span><span class='line'>        <span class="nt">&lt;li&gt;</span>{$v}<span class="nt">&lt;/li&gt;</span>
</span><span class='line'>       {/foreach}
</span><span class='line'><span class="nt">&lt;/ul&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>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Customizing rails generator templates]]></title>
    <link href="http://qichunren.github.com/blog/2012/01/12/customizing-rails-generator-templates/"/>
    <updated>2012-01-12T13:49:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2012/01/12/customizing-rails-generator-templates</id>
    <content type="html"><![CDATA[<p>Rails framework and twitter bootstrap are good for your startup project, build-in generators generate source code by its way. It is  a good starting point.</p>

<p>But I often have to change default generted source code:</p>

<ul>
<li>Add <strong>encoding: utf-8</strong> into ruby file header, for Ruby 1.9.2 encoding.</li>
<li>Change scaffold view files to apply <a href="http://twitter.github.com/bootstrap/">bootstrap</a> css.</li>
<li>Other things you want to override default templates.</li>
</ul>


<p>Rails provides the mechanism to custom generator behavior.</p>

<p>I have already got it, and source code is on <a href="https://github.com/qichunren/rails_generator_override_templates">github</a>, follow README for usage.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to update a forked repository from original repository at github?]]></title>
    <link href="http://qichunren.github.com/blog/2012/01/09/update-forked-repository-from-original-repository-at-github/"/>
    <updated>2012-01-09T12:39:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2012/01/09/update-forked-repository-from-original-repository-at-github</id>
    <content type="html"><![CDATA[<p>If you use github, you can follow this.</p>

<p>I use <a href="https://github.com/huacnlee/ruby-china">huachlee/ruby-china</a> repository for example.</p>

<p>At huacnlee/ruby-china repository homepage, clicked &#8220;Fork&#8221; button, then after serval minutes, you will have you own forked repository copy.Then you clone to local.</p>

<figure class='code'><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=''><span class='line'>git clone git@github.com:qichunren/ruby-china.git</span></code></pre></td></tr></table></div></figure>


<p>Then you commit your changes, and push to it.When you found the original repository has some updated feature,you can do as follow:</p>

<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>
<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=''><span class='line'>cd ruby-china
</span><span class='line'>git remote add upstream git://github.com/huacnlee/ruby-china.git
</span><span class='line'>caojinhua:ruby-china caojinhua$ git fetch upstream
</span><span class='line'>remote: Counting objects: 345, done.
</span><span class='line'>remote: Compressing objects: 100% (164/164), done.
</span><span class='line'>remote: Total 266 (delta 196), reused 156 (delta 98)
</span><span class='line'>Receiving objects: 100% (266/266), 31.92 KiB | 25 KiB/s, done.
</span><span class='line'>Resolving deltas: 100% (196/196), completed with 67 local objects.
</span><span class='line'>From git://github.com/huacnlee/ruby-china
</span><span class='line'> * [new branch]      github_autocomplete -&gt; upstream/github_autocomplete
</span><span class='line'> * [new branch]      markdown   -&gt; upstream/markdown
</span><span class='line'> * [new branch]      master     -&gt; upstream/master
</span><span class='line'> * [new branch]      post       -&gt; upstream/post
</span><span class='line'>caojinhua:ruby-china caojinhua$ git merge upstream/master</span></code></pre></td></tr></table></div></figure>


<p>That is it.</p>

<h2>Resources:</h2>

<ul>
<li><a href="http://help.github.com/fork-a-repo/">Fork A Repo</a></li>
<li><a href="http://bradlyfeeley.com/2008/09/03/update-a-github-fork-from-the-original-repo/">Update a Github Fork from the Original Repo</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[在Rails3中使用ajax]]></title>
    <link href="http://qichunren.github.com/blog/2011/12/22/use-ajax-in-rails3-note/"/>
    <updated>2011-12-22T16:36:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/12/22/use-ajax-in-rails3-note</id>
    <content type="html"><![CDATA[<p>今天写代码的时候突然发现 我之前在Rails3中使用ajax的方式是不太正确的，我走了弯路。</p>

<p>我之前在Rails3项目中使用ajax是这样的：</p>

<p>如果是直接发送一个ajax请求，我就给标签加上:remote => true。如果我在此基础上还要做其它的操作，如ajax表单提交前要对表单字段验证，我之前以为那样UJS就不能搞定了，需要我自己写代码来处理。然后我就使用jquery中的相关ajax操作来处理。</p>

<p>今天我才了解到UJS的AJAX操作已经为我们提供了6个自定义事件方法：</p>

<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>
<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=''><span class='line'>ajax:before – right before ajax call
</span><span class='line'>ajax:loading – before ajax call, but after XmlHttpRequest object is created)
</span><span class='line'>ajax:success – successful ajax call
</span><span class='line'>ajax:failure – failed ajax call
</span><span class='line'>ajax:complete – completion of ajax call (after ajax:success and ajax:failure)
</span><span class='line'>ajax:after – after ajax call is sent (note: not after it returns)</span></code></pre></td></tr></table></div></figure>


<p>所以对于上面我说的那个事例，如果要对一个ajax表单在提交前作表单验证或者其它的一些检查，只需要写提交前的检查代码，然后通过事件绑定的方式，将余下的表单ajax提交让UJS来完成，这是多么地简单啊，我以前真是做了好多无用功。</p>

<figure class='code'><figcaption><span>sample code  </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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#new_post_comment&quot;</span><span class="p">).</span><span class="nx">bind</span><span class="p">(</span><span class="s2">&quot;ajax:before&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#post_comment_body&quot;</span><span class="p">).</span><span class="nx">val</span><span class="p">()</span><span class="o">==</span><span class="s2">&quot;&quot;</span><span class="p">){</span>
</span><span class='line'>      <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>参考资料</h3>

<p><a href="http://net.tutsplus.com/tutorials/javascript-ajax/using-unobtrusive-javascript-and-ajax-with-rails-3/">Using Unobtrusive JavaScript and AJAX with Rails 3</a>
<a href="http://www.alfajango.com/blog/rails-3-remote-links-and-forms-data-type-with-jquery/">Rails 3 Remote Links and Forms Part 2: Data-type (with jQuery)</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[mongodb的可视化客户端工具:MongoHub]]></title>
    <link href="http://qichunren.github.com/blog/2011/12/20/mongodb-ui-client-mongohub/"/>
    <updated>2011-12-20T17:31:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/12/20/mongodb-ui-client-mongohub</id>
    <content type="html"><![CDATA[<p>最近在使用mongodb,经常要调试，然后找到了MongoHub这款工具，感觉很好。</p>

<p><a href="mongohub.todayclose.com/download">MongoHub网站</a></p>

<p><img src="http://qichunren.github.com/assets/posts/2011-12-20-mongohub.png" title="will_paginate bar" alt="MongoHub" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[近期iOS学习点]]></title>
    <link href="http://qichunren.github.com/blog/2011/12/18/ios-learn-note/"/>
    <updated>2011-12-18T20:44:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/12/18/ios-learn-note</id>
    <content type="html"><![CDATA[<p>虽然我业余在学iOS，但是感觉进步缓慢。为了使我的iOS开发的学习效率高一点，我决定先列一个简要的提纲，明确当前一个阶段的学习计划。</p>

<ol>
<li><p>iOS体系，了解清楚UI组件的体系</p></li>
<li><p>Objective-C中的基本数据结构使用</p></li>
<li><p>iOS中的基本的网络编程，主要是iOS客户端方的,如json,http交互等。</p></li>
</ol>


<p>先就这么多，每天要进步一点.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Shell学习小记录]]></title>
    <link href="http://qichunren.github.com/blog/2011/10/18/learning-shell-tip-note/"/>
    <updated>2011-10-18T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/10/18/learning-shell-tip-note</id>
    <content type="html"><![CDATA[<p>最近为了一些自动化的任务，要写一些脚本。可以使用Ruby脚本、Ruby的rake\thor等等，我为了简洁和性能，我了解了一下Shell，发现用Shell来做这个事情更合适。性能，命令行，管道，丰富的现有工具，基于Linux本身，Shell真是一个好东西。以前认为用Ruby来做这个事情是一个不错的选择，现在知道了，那是因为相比起Shell来，更熟悉Ruby，程序员总是喜欢自己熟悉的领域，而排斥自己不熟悉的领域。其实多了解一下其它方面的，更利用自己工作的开展，提高工作效率。</p>

<p>我随便总结一下几个知识点</p>

<h4>字符串</h4>

<p>声明一个字符串变量后，使用的时候，在变量名前面加一个$符号才能将其值取出来</p>

<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>
</pre></td><td class='code'><pre><code class=''><span class='line'>DATA_FILE=data.tar.gz
</span><span class='line'>echo $DATA_FILE</span></code></pre></td></tr></table></div></figure>


<p>字符串拼接</p>

<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'>DATA_DIR=/Users/caojinhua/code/
</span><span class='line'>DATA_FILE=data.tar.gz
</span><span class='line'>DATA_PATH=$DATA_DIR""$DATA_FILE</span></code></pre></td></tr></table></div></figure>


<p>将命令执行的结果保存在变量中</p>

<figure class='code'><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=''><span class='line'>sha1=`ls -al`</span></code></pre></td></tr></table></div></figure>


<h4>if语句结构</h4>

<p>if语句条件测试命令：</p>

<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>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>[ -d DIR ]   如果DIR存在并且是一个目录则为真
</span><span class='line'>[ -f FILE ]   如果FILE存在且是一个普通文件则为真
</span><span class='line'>[ -z STRING ] 如果STRING的长度为零则为真
</span><span class='line'>[ -n STRING ] 如果STRING的长度非零则为真
</span><span class='line'>[ STRING1 = STRING2 ] 如果两个字符串相同则为真
</span><span class='line'>[ STRING1 != STRING2 ]    如果字符串不相同则为真
</span><span class='line'>[ ARG1 OP ARG2 ]</span></code></pre></td></tr></table></div></figure>


<p>ARG1和ARG2应该是整数或者取值为整数的变量，OP是-eq（等于）-ne（不等于）-lt（小于）-le（小于等于）-gt（大于）-ge（大于等于）之中的一个</p>

<p>之前弄错好几次，中括号前后的空格不能少。</p>

<p>if语句的结构</p>

<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>
<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=''><span class='line'>if [ xxx ]
</span><span class='line'>then
</span><span class='line'>fi
</span><span class='line'>
</span><span class='line'>if [ xxx ]; then
</span><span class='line'>
</span><span class='line'>else
</span><span class='line'>
</span><span class='line'>fi
</span><span class='line'>
</span><span class='line'>if [ xxx ]; then
</span><span class='line'>
</span><span class='line'>elif [ ! xxx ]; then
</span><span class='line'>
</span><span class='line'>fi</span></code></pre></td></tr></table></div></figure>


<h4>时间格式化</h4>

<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>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>date  +%Y%m%d
</span><span class='line'>
</span><span class='line'>a=`date +%Y%m%d`
</span><span class='line'>echo $a</span></code></pre></td></tr></table></div></figure>


<h4>参考资料</h4>

<p><a href="http://learn.akae.cn/media/ch31s05.html">Shell脚本语法</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fix problem annotate is broken with rails 3.1.1]]></title>
    <link href="http://qichunren.github.com/blog/2011/10/14/fix-annotate-gem-with-rails3-1-1/"/>
    <updated>2011-10-14T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/10/14/fix-annotate-gem-with-rails3-1-1</id>
    <content type="html"><![CDATA[<p>今天在做一个小工具，使用最新的Rails版本3.1.1, 在使用annotate(2.4.0)这个gem的时候出错了：</p>

<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>
<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>
</pre></td><td class='code'><pre><code class=''><span class='line'>caojinhua:tts_cacher caojinhua$ annotate
</span><span class='line'>/Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.1.1/lib/active_record/railties/databases.rake:3:in `&lt;top (required)&gt;': undefined method `namespace' for main:Object (NoMethodError)
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.1.1/lib/active_record/railtie.rb:26:in `load'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.1.1/lib/active_record/railtie.rb:26:in `block in &lt;class:Railtie&gt;'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.1/lib/rails/railtie.rb:183:in `call'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.1/lib/rails/railtie.rb:183:in `block in load_tasks'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.1/lib/rails/railtie.rb:183:in `each'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.1/lib/rails/railtie.rb:183:in `load_tasks'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.1/lib/rails/engine.rb:396:in `block in load_tasks'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.1/lib/rails/application/railties.rb:8:in `each'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.1/lib/rails/application/railties.rb:8:in `all'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.1/lib/rails/engine.rb:396:in `load_tasks'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.1/lib/rails/application.rb:103:in `load_tasks'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.1/lib/rails/railtie/configurable.rb:30:in `method_missing'
</span><span class='line'>  from Rakefile:7:in `&lt;top (required)&gt;'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/annotate-2.4.0/lib/annotate.rb:17:in `load'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/annotate-2.4.0/lib/annotate.rb:17:in `load_tasks'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/gems/annotate-2.4.0/bin/annotate:66:in `&lt;top (required)&gt;'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/bin/annotate:19:in `load'
</span><span class='line'>  from /Users/caojinhua/.rvm/gems/ruby-1.9.2-p180/bin/annotate:19:in `&lt;main&gt;'</span></code></pre></td></tr></table></div></figure>


<p>然后在stackoverflow上找到了解决方法，就是使用最新的annotate.</p>

<figure class='code'><figcaption><span>Gemfile</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;annotate&#39;</span><span class="p">,</span> <span class="ss">:git</span> <span class="o">=&gt;</span> <span class="s1">&#39;git://github.com/ctran/annotate_models.git&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Resources:</h3>

<p><a href="http://stackoverflow.com/questions/7295505/annotate-gem-and-rails-3-1">annotate-gem-and-rails-3-1</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[网页截屏的方法]]></title>
    <link href="http://qichunren.github.com/blog/2011/10/12/capture-webpage/"/>
    <updated>2011-10-12T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/10/12/capture-webpage</id>
    <content type="html"><![CDATA[<p>曾经很想有这样一个app, 它可以将微博上用户的微博用图片的形式自动保存起来，留此存照。前几个月的那段时间，微博上很
网页截屏的基本原理就是通过取得webkit渲染（render）的数据来生成图片的，我经过一段时间研究，找到了两个方法来解决这个问题。</p>

<p>一个工具叫<a href="http://www.phantomjs.org/">phantomjs</a>，另一个工具叫<a href="http://cutycapt.sourceforge.net/">cutycapt</a></p>

<p>两个工具都不错，个人比较喜欢使用cutycapt这个工具，它是直接提供一个命令行来生成网页截图的，而前者是通过javascript来调用底层webkit接品(page.render方法)来实现的，两者的侧重点不一样。
并且cutycapt是将整个网截下来，phantomjs是将浏览器当前视区的一屏截下来。</p>

<p>Cutycapt的用法如下</p>

<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>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>qichunren@qichunren-desktop:~/github/cutycapt/CutyCapt$ ./CutyCapt 
</span><span class='line'> -----------------------------------------------------------------------------
</span><span class='line'> Usage: CutyCapt --url=http://www.example.org/ --out=localfile.png            
</span><span class='line'> -----------------------------------------------------------------------------
</span><span class='line'>  --help                         Print this help page and exit                
</span><span class='line'>  --url=&lt;url&gt;                    The URL to capture (http:...|file:...|...)   
</span><span class='line'>  --out=&lt;path&gt;                   The target file (.png|pdf|ps|svg|jpeg|...)   
</span><span class='line'>  --out-format=&lt;f&gt;               Like extension in --out, overrides heuristic 
</span><span class='line'>  --min-width=&lt;int&gt;              Minimal width for the image (default: 800)   
</span><span class='line'>  --min-height=&lt;int&gt;             Minimal height for the image (default: 600)  
</span><span class='line'>  --max-wait=&lt;ms&gt;                Don't wait more than (default: 90000, inf: 0)
</span><span class='line'>  --delay=&lt;ms&gt;                   After successful load, wait (default: 0)     
</span><span class='line'>  --user-style-path=&lt;path&gt;       Location of user style sheet file, if any    
</span><span class='line'>  --user-style-string=&lt;css&gt;      User style rules specified as text           
</span><span class='line'>  --header=&lt;name&gt;:&lt;value&gt;        request header; repeatable; some can't be set
</span><span class='line'>  --method=&lt;get|post|put&gt;        Specifies the request method (default: get)  
</span><span class='line'>  --body-string=&lt;string&gt;         Unencoded request body (default: none)       
</span><span class='line'>  --body-base64=&lt;base64&gt;         Base64-encoded request body (default: none)  
</span><span class='line'>  --app-name=&lt;name&gt;              appName used in User-Agent; default is none  
</span><span class='line'>  --app-version=&lt;version&gt;        appVers used in User-Agent; default is none  
</span><span class='line'>  --user-agent=&lt;string&gt;          Override the User-Agent header Qt would set  
</span><span class='line'>  --javascript=&lt;on|off&gt;          JavaScript execution (default: on)           
</span><span class='line'>  --java=&lt;on|off&gt;                Java execution (default: unknown)            
</span><span class='line'>  --plugins=&lt;on|off&gt;             Plugin execution (default: unknown)          
</span><span class='line'>  --private-browsing=&lt;on|off&gt;    Private browsing (default: unknown)          
</span><span class='line'>  --auto-load-images=&lt;on|off&gt;    Automatic image loading (default: on)        
</span><span class='line'>  --js-can-open-windows=&lt;on|off&gt; Script can open windows? (default: unknown)  
</span><span class='line'>  --js-can-access-clipboard=&lt;on|off&gt; Script clipboard privs (default: unknown)
</span><span class='line'>  --print-backgrounds=&lt;on|off&gt;   Backgrounds in PDF/PS output (default: off)  
</span><span class='line'>  --zoom-factor=&lt;float&gt;          Page zoom factor (default: no zooming)       
</span><span class='line'>  --zoom-text-only=&lt;on|off&gt;      Whether to zoom only the text (default: off) 
</span><span class='line'>  --http-proxy=&lt;url&gt;             Address for HTTP proxy server (default: none)
</span><span class='line'> -----------------------------------------------------------------------------
</span><span class='line'>  &lt;f&gt; is svg,ps,pdf,itext,html,rtree,png,jpeg,mng,tiff,gif,bmp,ppm,xbm,xpm    
</span><span class='line'> -----------------------------------------------------------------------------
</span><span class='line'> http://cutycapt.sf.net - (c) 2003-2010 Bjoern Hoehrmann - bjoern@hoehrmann.de
</span><span class='line'>qichunren@qichunren-desktop:~/github/cutycapt/CutyCapt$</span></code></pre></td></tr></table></div></figure>


<p>phantomjs截屏的用法如下：</p>

<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>
<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=''><span class='line'>qichunren@qichunren-desktop:~/github$ cd phantomjs/
</span><span class='line'>qichunren@qichunren-desktop:~/github/phantomjs$ ls
</span><span class='line'>bin         ChangeLog  ff.png     iteye.png    Makefile       python     src
</span><span class='line'>capture.js  examples   hello.png  LICENSE.BSD  phantomjs.pro  README.md           
</span><span class='line'>qichunren@qichunren-desktop:~/github/phantomjs$ ./bin/phantomjs examples/rasterize.js 
</span><span class='line'>Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat]
</span><span class='line'>  paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"
</span><span class='line'>qichunren@qichunren-desktop:~/github/phantomjs$ ./bin/phantomjs examples/rasterize.js http://www.iteye.com iteye.png
</span><span class='line'>qichunren@qichunren-desktop:~/github/phantomjs$</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[使用Jruby来部署Rails应用]]></title>
    <link href="http://qichunren.github.com/blog/2011/08/26/deploy-rails-project-with-jruby/"/>
    <updated>2011-08-26T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/08/26/deploy-rails-project-with-jruby</id>
    <content type="html"><![CDATA[<p>为了保护最近做的产品的源代码，需要将项目中的源代码进行保护起来。我目前了解到的方案有以下两种：</p>

<ol>
<li><p>使用代码混淆工具</p></li>
<li><p>使用JRuby将Ruby代码编译成java字节码文件（.class）</p></li>
</ol>


<hr />

<p>第一种方案，有一个名为<a href="http://rubyencoder.com">ruby encoder</a>的产品，我试用了一下，发现太重量级了，我个人只是一个可以将代码混淆一下的小工具而已，而ruby encoder有自己的运行加载机制，源代码二次编码，基于域名可以设置产品过期失效时间等等一系列功能，我不需要这些功能，另外它不是免费的，所以我没有采用这个方案。</p>

<p>第二种方安装就是使用JRuby。整体思路就是将Ruby项目的代码编译成java字节码文件，然后运行于Java环境中。</p>

<hr />

<p>将项目中的ruby文件编译成java的class文件不是一件容易的事情，所幸有一个名为warbler的gem可以帮助我们搞定这一切，它可以将项目打包(.war)，同时可以将ruby代码编译成class文件。然后你将生成好的.war文件放进JAVA应用服务器的应用目录中，如Tomcat的webapps中就可以了。</p>

<p>warbler提供若干个任务可供使用：</p>

<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>
<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=''><span class='line'>qichunren@qichunren-desktop:~/code/ntdeck$ warble -T
</span><span class='line'>warble compiled    # Feature: precompile all Ruby files
</span><span class='line'>warble config      # Generate a configuration file to customize your archive
</span><span class='line'>warble executable  # Feature: make an executable archive
</span><span class='line'>warble gemjar      # Feature: package gem repository inside a jar
</span><span class='line'>warble pluginize   # Install Warbler tasks in your Rails application
</span><span class='line'>warble version     # Display version of Warbler
</span><span class='line'>warble war         # Create the project war file
</span><span class='line'>warble war:clean   # Remove the project war file
</span><span class='line'>warble war:debug   # Dump diagnostic information</span></code></pre></td></tr></table></div></figure>


<p>平时最常用的就是warble war命令了，需要关注的是warble的配置文件，它的配置文件是通过warble config来生成的，在这个文件中有一系列的配置项可以设置，以下是我的配置文件：</p>

<figure class='code'><figcaption><span>config/warble.rb  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Disable Rake-environment-task framework detection by uncommenting/setting to false</span>
</span><span class='line'><span class="c1"># Warbler.framework_detection = false</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Warbler web application assembly configuration file</span>
</span><span class='line'><span class="no">Warbler</span><span class="o">::</span><span class="no">Config</span><span class="o">.</span><span class="n">new</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
</span><span class='line'>  <span class="c1"># Features: additional options controlling how the jar is built.</span>
</span><span class='line'>  <span class="c1"># Currently the following features are supported:</span>
</span><span class='line'>  <span class="c1"># - gemjar: package the gem repository in a jar file in WEB-INF/lib</span>
</span><span class='line'>  <span class="c1"># - executable: embed a web server and make the war executable</span>
</span><span class='line'>  <span class="c1"># - compiled: compile .rb files to .class files</span>
</span><span class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">features</span> <span class="o">=</span> <span class="sx">%w(executable compiled)</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Application directories to be included in the webapp.</span>
</span><span class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">dirs</span> <span class="o">=</span> <span class="sx">%w(app config db lib log vendor tmp)</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Additional files/directories to include, above those in config.dirs</span>
</span><span class='line'>  <span class="c1"># config.includes = FileList[&quot;db&quot;]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Additional files/directories to exclude</span>
</span><span class='line'>  <span class="c1"># config.excludes = FileList[&quot;lib/tasks/*&quot;]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Additional Java .jar files to include.  Note that if .jar files are placed</span>
</span><span class='line'>  <span class="c1"># in lib (and not otherwise excluded) then they need not be mentioned here.</span>
</span><span class='line'>  <span class="c1"># JRuby and JRuby-Rack are pre-loaded in this list.  Be sure to include your</span>
</span><span class='line'>  <span class="c1"># own versions if you directly set the value</span>
</span><span class='line'>  <span class="c1"># config.java_libs += FileList[&quot;lib/java/*.jar&quot;]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Loose Java classes and miscellaneous files to be included.</span>
</span><span class='line'>  <span class="c1"># config.java_classes = FileList[&quot;target/classes/**.*&quot;]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># One or more pathmaps defining how the java classes should be copied into</span>
</span><span class='line'>  <span class="c1"># the archive. The example pathmap below accompanies the java_classes</span>
</span><span class='line'>  <span class="c1"># configuration above. See http://rake.rubyforge.org/classes/String.html#M000017</span>
</span><span class='line'>  <span class="c1"># for details of how to specify a pathmap.</span>
</span><span class='line'>  <span class="c1"># config.pathmaps.java_classes &lt;&lt; &quot;%{target/classes/,}p&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Bundler support is built-in. If Warbler finds a Gemfile in the</span>
</span><span class='line'>  <span class="c1"># project directory, it will be used to collect the gems to bundle</span>
</span><span class='line'>  <span class="c1"># in your application. If you wish to explicitly disable this</span>
</span><span class='line'>  <span class="c1"># functionality, uncomment here.</span>
</span><span class='line'>  <span class="c1"># config.bundler = false</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># An array of Bundler groups to avoid including in the war file.</span>
</span><span class='line'>  <span class="c1"># Defaults to [&quot;development&quot;, &quot;test&quot;].</span>
</span><span class='line'>  <span class="c1"># config.bundle_without = []</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Other gems to be included. If you don&#39;t use Bundler or a gemspec</span>
</span><span class='line'>  <span class="c1"># file, you need to tell Warbler which gems your application needs</span>
</span><span class='line'>  <span class="c1"># so that they can be packaged in the archive.</span>
</span><span class='line'>  <span class="c1"># For Rails applications, the Rails gems are included by default</span>
</span><span class='line'>  <span class="c1"># unless the vendor/rails directory is present.</span>
</span><span class='line'>  <span class="c1"># config.gems += [&quot;activerecord-jdbcmysql-adapter&quot;, &quot;jruby-openssl&quot;]</span>
</span><span class='line'>  <span class="c1"># config.gems &lt;&lt; &quot;tzinfo&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Uncomment this if you don&#39;t want to package rails gem.</span>
</span><span class='line'>  <span class="c1"># config.gems -= [&quot;rails&quot;]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># The most recent versions of gems are used.</span>
</span><span class='line'>  <span class="c1"># You can specify versions of gems by using a hash assignment:</span>
</span><span class='line'>  <span class="c1"># config.gems[&quot;rails&quot;] = &quot;2.3.10&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># You can also use regexps or Gem::Dependency objects for flexibility or</span>
</span><span class='line'>  <span class="c1"># finer-grained control.</span>
</span><span class='line'>  <span class="c1"># config.gems &lt;&lt; /^merb-/</span>
</span><span class='line'>  <span class="c1"># config.gems &lt;&lt; Gem::Dependency.new(&quot;merb-core&quot;, &quot;= 0.9.3&quot;)</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Include gem dependencies not mentioned specifically. Default is</span>
</span><span class='line'>  <span class="c1"># true, uncomment to turn off.</span>
</span><span class='line'>  <span class="c1"># config.gem_dependencies = false</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Array of regular expressions matching relative paths in gems to be</span>
</span><span class='line'>  <span class="c1"># excluded from the war. Defaults to empty, but you can set it like</span>
</span><span class='line'>  <span class="c1"># below, which excludes test files.</span>
</span><span class='line'>  <span class="c1"># config.gem_excludes = [/^(test|spec)\//]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Pathmaps for controlling how application files are copied into the archive</span>
</span><span class='line'>  <span class="c1"># config.pathmaps.application = [&quot;WEB-INF/%p&quot;]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Name of the archive (without the extension). Defaults to the basename</span>
</span><span class='line'>  <span class="c1"># of the project directory.</span>
</span><span class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">jar_name</span> <span class="o">=</span> <span class="s2">&quot;ntdeck&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Name of the MANIFEST.MF template for the war file. Defaults to a simple</span>
</span><span class='line'>  <span class="c1"># MANIFEST.MF that contains the version of Warbler used to create the war file.</span>
</span><span class='line'>  <span class="c1"># config.manifest_file = &quot;config/MANIFEST.MF&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># When using the &#39;compiled&#39; feature and specified, only these Ruby</span>
</span><span class='line'>  <span class="c1"># files will be compiled. Default is to compile all \.rb files in</span>
</span><span class='line'>  <span class="c1"># the application.</span>
</span><span class='line'>  <span class="c1"># config.compiled_ruby_files = FileList[&#39;app/**/*.rb&#39;]</span>
</span><span class='line'>  <span class="n">compile_me</span> <span class="o">=</span> <span class="no">FileList</span><span class="o">[*</span><span class="n">config</span><span class="o">.</span><span class="n">dirs</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">x</span><span class="si">}</span><span class="s2">/**/*.rb&quot;</span><span class="p">}</span><span class="o">].</span><span class="n">exclude</span><span class="p">(</span><span class="s2">&quot;config/compass.rb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">exclude</span><span class="p">(</span><span class="s2">&quot;lib/printer/*&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">compiled_ruby_files</span> <span class="o">=</span> <span class="n">compile_me</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># === War files only below here ===</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Path to the pre-bundled gem directory inside the war file. Default</span>
</span><span class='line'>  <span class="c1"># is &#39;WEB-INF/gems&#39;. Specify path if gems are already bundled</span>
</span><span class='line'>  <span class="c1"># before running Warbler. This also sets &#39;gem.path&#39; inside web.xml.</span>
</span><span class='line'>  <span class="c1"># config.gem_path = &quot;WEB-INF/vendor/bundler_gems&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Files for WEB-INF directory (next to web.xml). This contains</span>
</span><span class='line'>  <span class="c1"># web.xml by default. If there is an .erb-File it will be processed</span>
</span><span class='line'>  <span class="c1"># with webxml-config. You may want to exclude this file via</span>
</span><span class='line'>  <span class="c1"># config.excludes.</span>
</span><span class='line'>  <span class="c1"># config.webinf_files += FileList[&quot;jboss-web.xml&quot;]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Files to be included in the root of the webapp.  Note that files in public</span>
</span><span class='line'>  <span class="c1"># will have the leading &#39;public/&#39; part of the path stripped during staging.</span>
</span><span class='line'>  <span class="c1"># config.public_html = FileList[&quot;public/**/*&quot;, &quot;doc/**/*&quot;]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Pathmaps for controlling how public HTML files are copied into the .war</span>
</span><span class='line'>  <span class="c1"># config.pathmaps.public_html = [&quot;%{public/,}p&quot;]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Value of RAILS_ENV for the webapp -- default as shown below</span>
</span><span class='line'>  <span class="c1"># config.webxml.rails.env = ENV[&#39;RAILS_ENV&#39;] || &#39;production&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Application booter to use, one of :rack, :rails, or :merb (autodetected by default)</span>
</span><span class='line'>  <span class="c1"># config.webxml.booter = :rails</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Set JRuby to run in 1.9 mode.</span>
</span><span class='line'>  <span class="c1"># config.webxml.jruby.compat.version = &quot;1.9&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># When using the :rack booter, &quot;Rackup&quot; script to use.</span>
</span><span class='line'>  <span class="c1"># - For &#39;rackup.path&#39;, the value points to the location of the rackup</span>
</span><span class='line'>  <span class="c1"># script in the web archive file. You need to make sure this file</span>
</span><span class='line'>  <span class="c1"># gets included in the war, possibly by adding it to config.includes</span>
</span><span class='line'>  <span class="c1"># or config.webinf_files above.</span>
</span><span class='line'>  <span class="c1"># - For &#39;rackup&#39;, the rackup script you provide as an inline string</span>
</span><span class='line'>  <span class="c1">#   is simply embedded in web.xml.</span>
</span><span class='line'>  <span class="c1"># The script is evaluated in a Rack::Builder to load the application.</span>
</span><span class='line'>  <span class="c1"># Examples:</span>
</span><span class='line'>  <span class="c1"># config.webxml.rackup.path = &#39;WEB-INF/hello.ru&#39;</span>
</span><span class='line'>  <span class="c1"># config.webxml.rackup = %{require &#39;./lib/demo&#39;; run Rack::Adapter::Camping.new(Demo)}</span>
</span><span class='line'>  <span class="c1"># config.webxml.rackup = require &#39;cgi&#39; &amp;&amp; CGI::escapeHTML(File.read(&quot;config.ru&quot;))</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Control the pool of Rails runtimes. Leaving unspecified means</span>
</span><span class='line'>  <span class="c1"># the pool will grow as needed to service requests. It is recommended</span>
</span><span class='line'>  <span class="c1"># that you fix these values when running a production server!</span>
</span><span class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">webxml</span><span class="o">.</span><span class="n">jruby</span><span class="o">.</span><span class="n">min</span><span class="o">.</span><span class="n">runtimes</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">webxml</span><span class="o">.</span><span class="n">jruby</span><span class="o">.</span><span class="n">max</span><span class="o">.</span><span class="n">runtimes</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># JNDI data source name</span>
</span><span class='line'>  <span class="c1"># config.webxml.jndi = &#39;jdbc/rails&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>需要注意的是config.features = %w(executable compiled)配置中，其中的compiled就是可以将ruby代码编译成class代码的。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Set proxy in server side to get crossing domain ajax request]]></title>
    <link href="http://qichunren.github.com/blog/2011/08/17/proxy-in-server-side-for-ajax-crossing-domain/"/>
    <updated>2011-08-17T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/08/17/proxy-in-server-side-for-ajax-crossing-domain</id>
    <content type="html"><![CDATA[

<figure class='code'><figcaption><span>proxy_controller.rb  </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">ProxyController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># GET /proxy/:url</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">get_handle</span>
</span><span class='line'>    <span class="nb">require</span> <span class="s1">&#39;open-uri&#39;</span>
</span><span class='line'>    <span class="n">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:url</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">contents</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">read</span>
</span><span class='line'>    <span class="n">render</span> <span class="ss">:text</span> <span class="o">=&gt;</span> <span class="n">contents</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>in config/routes.rb  </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">get</span> <span class="s2">&quot;/proxy&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;proxy#get_handle&quot;</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>javascript useage  </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='js'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s2">&quot;/proxy?url=&quot;</span> <span class="o">+</span> <span class="nx">remote_url</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">){</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Install mongo on mac]]></title>
    <link href="http://qichunren.github.com/blog/2011/06/04/install-mongodb/"/>
    <updated>2011-06-04T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/06/04/install-mongodb</id>
    <content type="html"><![CDATA[<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>
<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>
</pre></td><td class='code'><pre><code class=''><span class='line'>caojinhuamatoMacBook-Pro:code caojinhua$ brew install mongodb
</span><span class='line'>==&gt; Downloading http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-1.8.1.tgz
</span><span class='line'>######################################################################## 100.0%
</span><span class='line'>==&gt; Caveats
</span><span class='line'>If this is your first install, automatically load on login with:
</span><span class='line'>    mkdir -p ~/Library/LaunchAgents
</span><span class='line'>    cp /usr/local/Cellar/mongodb/1.8.1-x86_64/org.mongodb.mongod.plist ~/Library/LaunchAgents/
</span><span class='line'>    launchctl load -w ~/Library/LaunchAgents/org.mongodb.mongod.plist
</span><span class='line'>
</span><span class='line'>If this is an upgrade and you already have the org.mongodb.mongod.plist loaded:
</span><span class='line'>    launchctl unload -w ~/Library/LaunchAgents/org.mongodb.mongod.plist
</span><span class='line'>    cp /usr/local/Cellar/mongodb/1.8.1-x86_64/org.mongodb.mongod.plist ~/Library/LaunchAgents/
</span><span class='line'>    launchctl load -w ~/Library/LaunchAgents/org.mongodb.mongod.plist
</span><span class='line'>
</span><span class='line'>Or start it manually:
</span><span class='line'>    mongod run --config /usr/local/Cellar/mongodb/1.8.1-x86_64/mongod.conf
</span><span class='line'>MongoDB 1.8+ includes a feature for Write Ahead Logging (Journaling), which has been enabled by default.
</span><span class='line'>This is not the default in production (Journaling is disabled); to disable journaling, use --nojournal.
</span><span class='line'>==&gt; Summary
</span><span class='line'>/usr/local/Cellar/mongodb/1.8.1-x86_64: 16 files, 93M, built in 2 seconds</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[去掉textmate源代码中的隐形空格]]></title>
    <link href="http://qichunren.github.com/blog/2011/05/16/remove-hidden-space-soure-code/"/>
    <updated>2011-05-16T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/05/16/remove-hidden-space-soure-code</id>
    <content type="html"><![CDATA[<p>有这个需要，主要是因为不想在git提交后的diff中无看到不有意思的diff显示。使用textmate的同学可以用<a href="https://github.com/glennr/uber-glory-tmbundle">这个工具</a>来解决这个小问题。</p>

<h3>安装方法</h3>

<figure class='code'><figcaption><span>install step  </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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd</span> ~/Library/Application<span class="se">\ </span>Support/TextMate/Bundles/
</span><span class='line'>git clone git://github.com/glennr/uber-glory-tmbundle.git Uber<span class="se">\ </span>Glory.tmbundle
</span><span class='line'><span class="nb">cd </span>Uber<span class="se">\ </span>Glory.tmbundle
</span><span class='line'>git submodule update --init
</span><span class='line'>osascript -e <span class="s1">&#39;tell app &quot;TextMate&quot; to reload bundles&#39;</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[学习和了解Redis]]></title>
    <link href="http://qichunren.github.com/blog/2011/05/13/learn-redis-db/"/>
    <updated>2011-05-13T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/05/13/learn-redis-db</id>
    <content type="html"><![CDATA[<p><a href="http://redis.io/">Redis</a>
<a href="https://github.com/ezmobius/redis-rb">redis-rb</a> gem install redis <br/>
<a href="https://github.com/nateware/redis-objects">redis-objects</a>是基于redis-rb的一个ruby对象与redis对象映射的gem</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[使用Unicorn]]></title>
    <link href="http://qichunren.github.com/blog/2011/05/12/use-unicorn-in-rails/"/>
    <updated>2011-05-12T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/05/12/use-unicorn-in-rails</id>
    <content type="html"><![CDATA[<h3>Install</h3>

<figure class='code'><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=''><span class='line'>gem install unicorn</span></code></pre></td></tr></table></div></figure>


<p>Then add gem &#8216;unicorn&#8217; to Gemfile.
bundle exec unicorn_rails to start rails app at 8080 port.</p>

<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>
<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>
</pre></td><td class='code'><pre><code class=''><span class='line'>caojinhua:qichunren.github.com caojinhua$ unicorn_rails --help
</span><span class='line'>Usage: unicorn_rails [ruby options] [unicorn_rails options] [rackup config file]
</span><span class='line'>Ruby options:
</span><span class='line'>  -e, --eval LINE          evaluate a LINE of code
</span><span class='line'>  -d, --debug              set debugging flags (set $DEBUG to true)
</span><span class='line'>  -w, --warn               turn warnings on for your script
</span><span class='line'>  -I, --include PATH       specify $LOAD_PATH (may be used more than once)
</span><span class='line'>  -r, --require LIBRARY    require the library, before executing your script
</span><span class='line'>unicorn_rails options:
</span><span class='line'>  -o, --host HOST          listen on HOST (default: 0.0.0.0)
</span><span class='line'>  -p, --port PORT          use PORT (default: 8080)
</span><span class='line'>  -E, --env RAILS_ENV      use RAILS_ENV for defaults (default: development)
</span><span class='line'>  -D, --daemonize          run daemonized in the background
</span><span class='line'>  -l {HOST:PORT|PATH},     listen on HOST:PORT or PATH
</span><span class='line'>      --listen             this may be specified multiple times
</span><span class='line'>                           (default: 0.0.0.0:8080)
</span><span class='line'>  -c, --config-file FILE   Unicorn-specific config file
</span><span class='line'>
</span><span class='line'>      --path PATH          Runs Rails app mounted at a specific path.
</span><span class='line'>                           (default: /)
</span><span class='line'>Common options:
</span><span class='line'>  -h, --help               Show this message
</span><span class='line'>  -v, --version            Show version</span></code></pre></td></tr></table></div></figure>


<p>This is a smaple unicorn config file:</p>

<figure class='code'><figcaption><span>config/unicorn.conf.rb  </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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">worker_processes</span> <span class="mi">2</span>
</span><span class='line'><span class="n">working_directory</span> <span class="s2">&quot;/www/temp/ntmenu2/current&quot;</span>
</span><span class='line'><span class="n">listen</span> <span class="mi">3000</span><span class="p">,</span> <span class="ss">:tcp_nopush</span> <span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class='line'><span class="n">timeout</span> <span class="mi">30</span>
</span><span class='line'><span class="n">pid</span> <span class="s2">&quot;/www/temp/ntmenu2/current/tmp/pids/unicorn.pid&quot;</span>
</span><span class='line'><span class="n">stderr_path</span> <span class="s2">&quot;/www/temp/unicorn.stderr.log&quot;</span>
</span><span class='line'><span class="n">stdout_path</span> <span class="s2">&quot;/www/temp/unicorn.stdout.log&quot;</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[使用Juggernaut]]></title>
    <link href="http://qichunren.github.com/blog/2011/05/12/use-juggernaut-for-realtime-app/"/>
    <updated>2011-05-12T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/05/12/use-juggernaut-for-realtime-app</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/maccman/juggernaut">Juggernaut</a>是基于<a href="http://nodejs.org/">Node.js</a>的一个实时(Realtime)Web的解决方案。使用起来很方便。</p>

<h3>安装方法</h3>

<ol>
<li>安装Node.js: brew install node</li>
<li>安装<a href="http://code.google.com/p/redis">Redis</a>: brew install redis</li>
<li>安装<a href="http://npmjs.org/">NPM</a>: curl http://npmjs.org/install.sh | sh</li>
<li>安装Juggernaut: 这个会把Juggernaut安装到当前目录，所以我应该先进行项目的/vendor/third目录，然后执行 npm install juggernaut</li>
</ol>


<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>
<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=''><span class='line'>usermatoMacBook-Pro:third qichunren$ npm install juggernaut
</span><span class='line'>redis@0.5.11 ./node_modules/juggernaut/node_modules/redis
</span><span class='line'>node-static-maccman@0.5.3 ./node_modules/juggernaut/node_modules/node-static-maccman
</span><span class='line'>socket.io@0.6.17 ./node_modules/juggernaut/node_modules/socket.io
</span><span class='line'>juggernaut@2.0.4 ./node_modules/juggernaut
</span><span class='line'>usermatoMacBook-Pro:third qichunren$  </span></code></pre></td></tr></table></div></figure>


<ol>
<li>安装Juggernaut gem:</li>
</ol>


<figure class='code'><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=''><span class='line'>gem install juggernaut</span></code></pre></td></tr></table></div></figure>


<h3>使用方法</h3>

<p>我们在自己的项目中只需要引入http://localhost:8080/application.js 这个js文件即可。
然后在页面中可以这样接收服务器端的消息：</p>

<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>
<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='html'><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">charset=</span><span class="s">&quot;utf-8&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">jug</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Juggernaut</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">jug</span><span class="p">.</span><span class="nx">subscribe</span><span class="p">(</span><span class="s2">&quot;channel1&quot;</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="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Got data: &quot;</span> <span class="o">+</span> <span class="nx">data</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>服务器端直接发消息：</p>

<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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s2">&quot;juggernaut&quot;</span>
</span><span class='line'><span class="no">Juggernaut</span><span class="o">.</span><span class="n">publish</span><span class="p">(</span><span class="s2">&quot;channel1&quot;</span><span class="p">,</span> <span class="s2">&quot;Some data&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>另外在启动了Juggernaut后，它默认在8080端口上有一个Helloword的应用，可以了解一下。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[在Mac上使用gitX]]></title>
    <link href="http://qichunren.github.com/blog/2011/05/11/use-gitX-on-mac/"/>
    <updated>2011-05-11T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/05/11/use-gitX-on-mac</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/pieter/gitx">gitX</a>是mac上一个git的可视化工具，可以与gravatar\gist集成在一起。我比较喜欢它的界面形式，感觉很舒服。</p>

<p>安装方法：</p>

<p>最简单的安装方法就是下载它的二进制包，直接运行。
在它的wiki页面找到二进制包的<a href="http://gitx.frim.nl/Downloads/GitXStable.app.zip">下载地址</a>,下载后，解压，直接运行，程序界面就出来了。</p>

<p>然后点菜单“GitX”中的&#8217;Enable Terminal Usage &#8230;&#8217;, 这样可以直接在命令行窗口中，在项目的根目录中直接运行gitx来启动gitX了。</p>

<p><img src="http://qichunren.github.com/images/posts/2011-05-11-gitX-on-mac.png" title="GitX on Mac" alt="My current project" /></p>

<p><em>更新</em></p>

<p><a href="https://github.com/pieter/gitx">gitX官方的这个版</a>本已经好久没有更新了，另外它也有一些缺点，如不能方便从文件中复制代码（很难选中代码的），我找到这个<a href="https://github.com/laullon/gitx/tree/">版本</a>，它从原官方的版本更流行。另外它真的很好用，比官方的版本提高了很多功能点。你自己慢慢体会吧。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[学习HTML5杂记]]></title>
    <link href="http://qichunren.github.com/blog/2011/05/09/learn-html5/"/>
    <updated>2011-05-09T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/05/09/learn-html5</id>
    <content type="html"><![CDATA[<h3>什么是 HTML5？</h3>

<p>HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。
HTML 的上一个版本诞生于 1999 年。自从那以后，Web 世界已经经历了巨变。
HTML5 仍处于完善之中。然而，大部分现代浏览器已经具备了某些 HTML5 支持。</p>

<h3>新特性</h3>

<p>HTML5 中的一些有趣的新特性：
+ 用于绘画的 canvas 元素
+ 用于媒介回放的 video 和 audio 元素
+ 对本地离线存储的更好的支持
+ 新的特殊内容元素，比如 article、footer、header、nav、section
+ 新的表单控件，比如 calendar、date、time、email、url、search</p>

<h4>Video标签</h4>

<p><a href="http://www.w3school.com.cn/html5/html_5_video.asp">参考资料</a></p>

<div>
  <pre>
    <code class='html'>&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
&lt;body&gt;

&lt;video width=&quot;320&quot; height=&quot;240&quot; controls=&quot;controls&quot;&gt;
  &lt;source src=&quot;movie.ogg&quot; type=&quot;video/ogg&quot;&gt;
  &lt;source src=&quot;movie.mp4&quot; type=&quot;video/mp4&quot;&gt;
Your browser does not support the video tag.
&lt;/video&gt;

&lt;/body&gt;
&lt;/html&gt;</code>
  </pre>
</div>


<h4>Audio标签</h4>

<p><a href="http://www.w3school.com.cn/html5/html_5_audio.asp">参考资料</a></p>

<div>
  <pre>
    <code class='html'>&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
&lt;body&gt;

&lt;audio controls=&quot;controls&quot;&gt;
  &lt;source src=&quot;song.ogg&quot; type=&quot;audio/ogg&quot;&gt;
  &lt;source src=&quot;song.mp3&quot; type=&quot;audio/mpeg&quot;&gt;
Your browser does not support the audio tag.
&lt;/audio&gt; 

&lt;/body&gt;
&lt;/html&gt;</code>
  </pre>
</div>


<h4>Canvas元素</h4>

<p><a href="http://www.w3school.com.cn/html5/html_5_canvas.asp">参考资料</a></p>

<h4>HTML5 Web存储</h4>

<p><a href="http://www.w3school.com.cn/html5/html_5_webstorage.asp">参考资料</a></p>

<h4>标签</h4>

<h4>属性</h4>

<h4>事件</h4>

<h3>Resources</h3>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[将Rspec的测试任务添加到Rakefile中]]></title>
    <link href="http://qichunren.github.com/blog/2011/05/07/add-rspec2-task-to-rakefile/"/>
    <updated>2011-05-07T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/05/07/add-rspec2-task-to-rakefile</id>
    <content type="html"><![CDATA[<p>写好Rspec测试好，一般是通过rspec spec/xxx_spec.rb这样来进行测试，这样不能批量进行多个spec文件的测试，解决方法是将rspec的测试任务添加了项目根目录中的Rakefile文件中去，以后直接执行rake或者rake spec就直接测试所有用例了。</p>

<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>
<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="nb">require</span> <span class="s2">&quot;rubygems&quot;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;rake&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;rspec/core/rake_task&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">task</span> <span class="ss">:default</span> <span class="o">=&gt;</span> <span class="ss">:spec</span>
</span><span class='line'>
</span><span class='line'><span class="no">RSpec</span><span class="o">::</span><span class="no">Core</span><span class="o">::</span><span class="no">RakeTask</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">:spec</span><span class="p">)</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">t</span><span class="o">.</span><span class="n">pattern</span> <span class="o">=</span> <span class="no">Dir</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">&#39;spec/**/*_spec.rb&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">t</span><span class="o">.</span><span class="n">rspec_opts</span> <span class="o">=</span> <span class="s1">&#39;--format progress -c&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Resources</h3>

<ul>
<li><a href="http://lukaszwrobel.pl/blog/rspec-rake-task">RSpec Rake Task</a> 已过期，它是Rspec 1</li>
<li><a href="https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/rake_task.rb">rspec/core/rake_task.rb</a></li>
<li><a href="https://github.com/rspec/rspec-rails/blob/master/lib/rspec/rails/tasks/rspec.rake">rake test in rails project</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[初试Rails 3.1 Beta]]></title>
    <link href="http://qichunren.github.com/blog/2011/05/05/try_rails_31_beta/"/>
    <updated>2011-05-05T00:00:00+08:00</updated>
    <id>http://qichunren.github.com/blog/2011/05/05/try_rails_31_beta</id>
    <content type="html"><![CDATA[<p>看到<a href="http://weblog.rubyonrails.org/2011/5/5/rails-3-1-beta-1-released">消息</a> 说Rails3.1 Beta出来了，我立刻就想试试，先从大体上了解一下看做了哪些改变。</p>

<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>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>usermatoMacBook-Pro:code qichunren$ rvm use 1.9.2
</span><span class='line'>Using /Users/qichunren/.rvm/gems/ruby-1.9.2-p0
</span><span class='line'>usermatoMacBook-Pro:jjsc_web_backend qichunren$ gem install rails --pre
</span><span class='line'>Successfully installed multi_json-1.0.1
</span><span class='line'>Successfully installed activesupport-3.1.0.beta1
</span><span class='line'>Successfully installed i18n-0.6.0beta1
</span><span class='line'>Successfully installed activemodel-3.1.0.beta1
</span><span class='line'>Successfully installed rack-1.3.0.beta
</span><span class='line'>Successfully installed rack-cache-1.0.1
</span><span class='line'>Successfully installed rack-test-0.6.0
</span><span class='line'>Successfully installed rack-mount-0.7.2
</span><span class='line'>Successfully installed hike-1.0.0
</span><span class='line'>Successfully installed sprockets-2.0.0.beta.2
</span><span class='line'>Successfully installed tzinfo-0.3.27
</span><span class='line'>Successfully installed erubis-2.7.0
</span><span class='line'>Successfully installed actionpack-3.1.0.beta1
</span><span class='line'>Successfully installed arel-2.1.0
</span><span class='line'>Successfully installed activerecord-3.1.0.beta1
</span><span class='line'>Successfully installed activeresource-3.1.0.beta1
</span><span class='line'>Successfully installed mail-2.3.0
</span><span class='line'>Successfully installed actionmailer-3.1.0.beta1
</span><span class='line'>Successfully installed rack-ssl-1.3.2
</span><span class='line'>Successfully installed railties-3.1.0.beta1
</span><span class='line'>Successfully installed rails-3.1.0.beta1
</span><span class='line'>21 gems installed
</span><span class='line'>Installing ri documentation for multi_json-1.0.1...
</span><span class='line'>Building YARD (yri) index for multi_json-1.0.1...
</span><span class='line'>Installing ri documentation for activesupport-3.1.0.beta1...
</span><span class='line'>Building YARD (yri) index for activesupport-3.1.0.beta1...
</span><span class='line'>Installing ri documentation for i18n-0.6.0beta1...
</span><span class='line'>Building YARD (yri) index for i18n-0.6.0beta1...
</span><span class='line'>Installing ri documentation for activemodel-3.1.0.beta1...
</span><span class='line'>Building YARD (yri) index for activemodel-3.1.0.beta1...
</span><span class='line'>Installing ri documentation for rack-1.3.0.beta...
</span><span class='line'>Building YARD (yri) index for rack-1.3.0.beta...
</span><span class='line'>Installing ri documentation for rack-cache-1.0.1...
</span><span class='line'>Building YARD (yri) index for rack-cache-1.0.1...
</span><span class='line'>Installing ri documentation for rack-test-0.6.0...
</span><span class='line'>Building YARD (yri) index for rack-test-0.6.0...
</span><span class='line'>Installing ri documentation for rack-mount-0.7.2...
</span><span class='line'>Building YARD (yri) index for rack-mount-0.7.2...
</span><span class='line'>Installing ri documentation for hike-1.0.0...
</span><span class='line'>Building YARD (yri) index for hike-1.0.0...
</span><span class='line'>Installing ri documentation for sprockets-2.0.0.beta.2...
</span><span class='line'>Building YARD (yri) index for sprockets-2.0.0.beta.2...
</span><span class='line'>Installing ri documentation for tzinfo-0.3.27...
</span><span class='line'>Building YARD (yri) index for tzinfo-0.3.27...
</span><span class='line'>Installing ri documentation for erubis-2.7.0...
</span><span class='line'>Building YARD (yri) index for erubis-2.7.0...
</span><span class='line'>Installing ri documentation for actionpack-3.1.0.beta1...
</span><span class='line'>Building YARD (yri) index for actionpack-3.1.0.beta1...
</span><span class='line'>Building YARD (yri) index for arel-2.1.0...
</span><span class='line'>Installing ri documentation for activerecord-3.1.0.beta1...
</span><span class='line'>Building YARD (yri) index for activerecord-3.1.0.beta1...
</span><span class='line'>Installing ri documentation for activeresource-3.1.0.beta1...
</span><span class='line'>Building YARD (yri) index for activeresource-3.1.0.beta1...
</span><span class='line'>Installing ri documentation for mail-2.3.0...
</span><span class='line'>Building YARD (yri) index for mail-2.3.0...
</span><span class='line'>Installing ri documentation for actionmailer-3.1.0.beta1...
</span><span class='line'>Building YARD (yri) index for actionmailer-3.1.0.beta1...
</span><span class='line'>Installing ri documentation for rack-ssl-1.3.2...
</span><span class='line'>Building YARD (yri) index for rack-ssl-1.3.2...
</span><span class='line'>Installing ri documentation for railties-3.1.0.beta1...
</span><span class='line'>Building YARD (yri) index for railties-3.1.0.beta1...
</span><span class='line'>Installing ri documentation for rails-3.1.0.beta1...
</span><span class='line'>file 'lib' not found
</span><span class='line'>Building YARD (yri) index for rails-3.1.0.beta1...
</span><span class='line'>Installing RDoc documentation for multi_json-1.0.1...
</span><span class='line'>Installing RDoc documentation for activesupport-3.1.0.beta1...
</span><span class='line'>Installing RDoc documentation for i18n-0.6.0beta1...
</span><span class='line'>Installing RDoc documentation for activemodel-3.1.0.beta1...
</span><span class='line'>Installing RDoc documentation for rack-1.3.0.beta...
</span><span class='line'>Installing RDoc documentation for rack-cache-1.0.1...
</span><span class='line'>Installing RDoc documentation for rack-test-0.6.0...
</span><span class='line'>Installing RDoc documentation for rack-mount-0.7.2...
</span><span class='line'>Installing RDoc documentation for hike-1.0.0...
</span><span class='line'>Installing RDoc documentation for sprockets-2.0.0.beta.2...
</span><span class='line'>Installing RDoc documentation for tzinfo-0.3.27...
</span><span class='line'>Installing RDoc documentation for erubis-2.7.0...
</span><span class='line'>Installing RDoc documentation for actionpack-3.1.0.beta1...
</span><span class='line'>Installing RDoc documentation for activerecord-3.1.0.beta1...
</span><span class='line'>Installing RDoc documentation for activeresource-3.1.0.beta1...
</span><span class='line'>Installing RDoc documentation for mail-2.3.0...
</span><span class='line'>Installing RDoc documentation for actionmailer-3.1.0.beta1...
</span><span class='line'>Installing RDoc documentation for rack-ssl-1.3.2...
</span><span class='line'>Installing RDoc documentation for railties-3.1.0.beta1...
</span><span class='line'>Installing RDoc documentation for rails-3.1.0.beta1...
</span><span class='line'>file 'lib' not found  
</span><span class='line'>usermatoMacBook-Pro:code qichunren$ rails -v
</span><span class='line'>Rails 3.1.0.beta1</span></code></pre></td></tr></table></div></figure>


<p>看看rails命令有没有一些改动：</p>

<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>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>usermatoMacBook-Pro:code qichunren$ rails --help
</span><span class='line'>Usage:
</span><span class='line'>  rails new APP_PATH [options]
</span><span class='line'>
</span><span class='line'>Options:
</span><span class='line'>  -r, [--ruby=PATH]              # Path to the Ruby binary of your choice
</span><span class='line'>                                 # Default: /Users/qichunren/.rvm/rubies/ruby-1.9.2-p0/bin/ruby
</span><span class='line'>  -b, [--builder=BUILDER]        # Path to a application builder (can be a filesystem path or URL)
</span><span class='line'>  -m, [--template=TEMPLATE]      # Path to an application template (can be a filesystem path or URL)
</span><span class='line'>      [--skip-gemfile]           # Don't create a Gemfile
</span><span class='line'>  -G, [--skip-git]               # Skip Git ignores and keeps
</span><span class='line'>  -O, [--skip-active-record]     # Skip Active Record files
</span><span class='line'>  -d, [--database=DATABASE]      # Preconfigure for selected database (options: mysql/oracle/postgresql/sqlite3/frontbase/ibm_db/jdbcmysql/jdbcsqlite3/jdbcpostgresql)
</span><span class='line'>                                 # Default: sqlite3
</span><span class='line'>  -j, [--javascript=JAVASCRIPT]  # Preconfigure for selected JavaScript library
</span><span class='line'>                                 # Default: jquery
</span><span class='line'>  -J, [--skip-javascript]        # Skip JavaScript files
</span><span class='line'>      [--dev]                    # Setup the application with Gemfile pointing to your Rails checkout
</span><span class='line'>      [--edge]                   # Setup the application with Gemfile pointing to Rails repository
</span><span class='line'>  -T, [--skip-test-unit]         # Skip Test::Unit files
</span><span class='line'>      [--old-style-hash]         # Force using old style hash (:foo =&gt; 'bar') on Ruby &gt;= 1.9
</span><span class='line'>
</span><span class='line'>Runtime options:
</span><span class='line'>  -f, [--force]    # Overwrite files that already exist
</span><span class='line'>  -p, [--pretend]  # Run but do not make any changes
</span><span class='line'>  -q, [--quiet]    # Supress status output
</span><span class='line'>  -s, [--skip]     # Skip files that already exist
</span><span class='line'>
</span><span class='line'>Rails options:
</span><span class='line'>  -h, [--help]     # Show this help message and quit
</span><span class='line'>  -v, [--version]  # Show Rails version number and quit
</span><span class='line'>
</span><span class='line'>Description:
</span><span class='line'>    The 'rails new' command creates a new Rails application with a default
</span><span class='line'>    directory structure and configuration at the path you specify.
</span><span class='line'>
</span><span class='line'>Example:
</span><span class='line'>    rails new ~/Code/Ruby/weblog
</span><span class='line'>
</span><span class='line'>    This generates a skeletal Rails installation in ~/Code/Ruby/weblog.
</span><span class='line'>    See the README in the newly created application to get going.
</span><span class='line'>usermatoMacBook-Pro:code qichunren$</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>继续建立一个新项目</p>

<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>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>usermatoMacBook-Pro:code qichunren$ rails new rails3
</span><span class='line'>      create  
</span><span class='line'>      create  README
</span><span class='line'>      create  Rakefile
</span><span class='line'>      create  config.ru
</span><span class='line'>      create  .gitignore
</span><span class='line'>      create  Gemfile
</span><span class='line'>      create  app
</span><span class='line'>      create  app/assets/images/rails.png
</span><span class='line'>      create  app/assets/javascripts/application.js
</span><span class='line'>      create  app/assets/stylesheets/application.css
</span><span class='line'>      create  app/controllers/application_controller.rb
</span><span class='line'>      create  app/helpers/application_helper.rb
</span><span class='line'>      create  app/mailers
</span><span class='line'>      create  app/models
</span><span class='line'>      create  app/views/layouts/application.html.erb
</span><span class='line'>      create  app/mailers/.gitkeep
</span><span class='line'>      create  app/models/.gitkeep
</span><span class='line'>      create  config
</span><span class='line'>      create  config/routes.rb
</span><span class='line'>      create  config/application.rb
</span><span class='line'>      create  config/environment.rb
</span><span class='line'>      create  config/environments
</span><span class='line'>      create  config/environments/development.rb
</span><span class='line'>      create  config/environments/production.rb
</span><span class='line'>      create  config/environments/test.rb
</span><span class='line'>      create  config/initializers
</span><span class='line'>      create  config/initializers/backtrace_silencers.rb
</span><span class='line'>      create  config/initializers/inflections.rb
</span><span class='line'>      create  config/initializers/mime_types.rb
</span><span class='line'>      create  config/initializers/secret_token.rb
</span><span class='line'>      create  config/initializers/session_store.rb
</span><span class='line'>      create  config/initializers/wrap_parameters.rb
</span><span class='line'>      create  config/locales
</span><span class='line'>      create  config/locales/en.yml
</span><span class='line'>      create  config/boot.rb
</span><span class='line'>      create  config/database.yml
</span><span class='line'>      create  db
</span><span class='line'>      create  db/seeds.rb
</span><span class='line'>      create  doc
</span><span class='line'>      create  doc/README_FOR_APP
</span><span class='line'>      create  lib
</span><span class='line'>      create  lib/tasks
</span><span class='line'>      create  lib/tasks/.gitkeep
</span><span class='line'>      create  log
</span><span class='line'>      create  log/.gitkeep
</span><span class='line'>      create  public
</span><span class='line'>      create  public/404.html
</span><span class='line'>      create  public/422.html
</span><span class='line'>      create  public/500.html
</span><span class='line'>      create  public/favicon.ico
</span><span class='line'>      create  public/index.html
</span><span class='line'>      create  public/robots.txt
</span><span class='line'>      create  script
</span><span class='line'>      create  script/rails
</span><span class='line'>      create  test/fixtures
</span><span class='line'>      create  test/fixtures/.gitkeep
</span><span class='line'>      create  test/functional
</span><span class='line'>      create  test/functional/.gitkeep
</span><span class='line'>      create  test/integration
</span><span class='line'>      create  test/integration/.gitkeep
</span><span class='line'>      create  test/unit
</span><span class='line'>      create  test/unit/.gitkeep
</span><span class='line'>      create  test/performance/browsing_test.rb
</span><span class='line'>      create  test/test_helper.rb
</span><span class='line'>      create  tmp/cache
</span><span class='line'>      create  tmp/cache/.gitkeep
</span><span class='line'>      create  vendor/assets/stylesheets
</span><span class='line'>      create  vendor/assets/stylesheets/.gitkeep
</span><span class='line'>      create  vendor/plugins
</span><span class='line'>      create  vendor/plugins/.gitkeep
</span><span class='line'>usermatoMacBook-Pro:code qichunren$ </span></code></pre></td></tr></table></div></figure>


<p></p>

<p>创建一个scaffold user后，发现在页面里/assets/application.js中包括了jQuery 1.6，还有rails.js for jquery这个。再也不需要之前的那个手工引入jQuery了，或者使用jquery-rails这个gem.
另外还生成有一个/assets/user.js.coffee文件，得要花时间学一下这个<a href="https://github.com/jashkenas/coffee-script">coffee-script</a>了。</p>

<p>还发现一个有趣的现象，rails团队似乎偏爱json,在scaffold生成的代码中没有了以前的xml format</p>

<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>
<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><span class='line'><span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>  <span class="vi">@users</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">all</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">respond_to</span> <span class="k">do</span> <span class="o">|</span><span class="nb">format</span><span class="o">|</span>
</span><span class='line'>    <span class="nb">format</span><span class="o">.</span><span class="n">html</span> <span class="c1"># index.html.erb</span>
</span><span class='line'>    <span class="nb">format</span><span class="o">.</span><span class="n">json</span> <span class="p">{</span> <span class="n">render</span> <span class="n">json</span><span class="p">:</span> <span class="vi">@users</span> <span class="p">}</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>另外多了一个assets的generator:</p>

<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>
<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=''><span class='line'>Example:
</span><span class='line'>    `rails generate assets posts`
</span><span class='line'>
</span><span class='line'>    Posts assets.
</span><span class='line'>        Javascript:     app/assets/javascripts/posts.js
</span><span class='line'>        Stylesheet:     app/assets/stylesheets/posts.css  </span></code></pre></td></tr></table></div></figure>


<p></p>

<p>总体上看，变化不大，将jQuery，coffee_script,scss加入默认了。一切都继续演进。</p>
]]></content>
  </entry>
  
</feed>

