<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>justjavac (迷渡)</title>
    <link>https://ruby-china.org/justjavac</link>
    <description>迷津欲有问</description>
    <language>en-us</language>
    <item>
      <title>[译] 如何百倍加速 Lo-Dash？引入惰性计算</title>
      <description>&lt;p&gt;原文：&lt;a href="http://filimanjaro.com/blog/2014/introducing-lazy-evaluation/" rel="nofollow" target="_blank" title=""&gt;How to Speed Up Lo-Dash ×100? Introducing Lazy Evaluation.&lt;/a&gt;&lt;br&gt;
作者：&lt;a href="http://twitter.com/filip_zawada" rel="nofollow" target="_blank" title=""&gt;Filip Zawada&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;译文：&lt;a href="http://justjavac.com/javascript/2015/12/15/introducing-lazy-evaluation.html" rel="nofollow" target="_blank" title=""&gt;如何百倍加速 Lo-Dash？引入惰性计算&lt;/a&gt;&lt;br&gt;
译者：&lt;a href="http://justjavac.com" rel="nofollow" target="_blank" title=""&gt;justjavac&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;我一直以为像 Lo-Dash 这样的库已经不能再快了，毕竟它们已经足够快了。
Lo-Dash 几乎完全混合了各种 &lt;a href="https://www.youtube.com/watch?v=NthmeLEhDDM" rel="nofollow" target="_blank" title=""&gt;JavaScript 奇技淫巧&lt;/a&gt;（YouTube）来压榨出最好的性能。&lt;/p&gt;
&lt;h2 id="惰性计算"&gt;惰性计算&lt;/h2&gt;
&lt;p&gt;但似乎我错了 - 其实 Lo-Dash 可以运行的更快。
你需要做的是，停止思考那些细微的优化，并开始找出更加适用的算法。
例如，在一个典型的循环中，我们往往倾向于去优化单次迭代的时间：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getLength&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- 10毫秒 - 如何优化到9毫秒?!&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码说明：取得数组的长度，然后重复执行 N 遍 &lt;code&gt;operation()&lt;/code&gt; 函数。译注 by &lt;a href="/justjavac" class="user-mention" title="@justjavac"&gt;&lt;i&gt;@&lt;/i&gt;justjavac&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;但是，这（优化 &lt;code&gt;operation()&lt;/code&gt; 执行时间）往往很难，而且对性能提升也非常有限。
相反，在某些情况下，我们可以优化 &lt;code&gt;getLength()&lt;/code&gt; 函数。
它返回的数字越小，则每个 10 毫秒循环的执行次数就越少。&lt;/p&gt;

&lt;p&gt;这就是 Lo-Dash 使用惰性计算的思想。
这是减少周期数，而不是减少每个周期的执行时间。
让我们看看下面的例子：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;priceLt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;gems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sunstone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Amethyst&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Prehnite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sugilite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;  &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Diopside&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="p"&gt;},&lt;/span&gt; 
   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Feldspar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dioptase&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="p"&gt;},&lt;/span&gt; 
   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sapphire&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;chosen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gems&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;priceLt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码说明：&lt;code&gt;gems&lt;/code&gt; 保存了 8 个对象，名字和价格。&lt;code&gt;priceLt(x)&lt;/code&gt; 函数返回价格低于 &lt;code&gt;x&lt;/code&gt; 的所有元素。译注 by &lt;a href="/justjavac" class="user-mention" title="@justjavac"&gt;&lt;i&gt;@&lt;/i&gt;justjavac&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;我们把价格低于 10 美元的前 3 个 &lt;code&gt;gems&lt;/code&gt; 找出来。
常规 Lo-Dash 方法（严格计算）是过滤所有 8 个 &lt;code&gt;gems&lt;/code&gt;，然后返回过滤结果的前 3 个。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://justjavac.com/assets/images/lodash-naive.gif" title="" alt="Lodash naïve approach"&gt;&lt;/p&gt;

&lt;p&gt;不难看出来，这种算法是不明智的。
它处理了所有的 8 个元素，而实际上我们只需要读取其中的 5 个元素就能得到我们想要的结果。
与此相反，使用惰性计算算法，只需要处理能得到结果的最少数量就可以了。
如图所示：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://justjavac.com/assets/images/grafika.gif" title="" alt="Lo-Dash regular approach"&gt;&lt;/p&gt;

&lt;p&gt;我们轻而易举就获得了 37.5％ 的性能提升。
但是这还不是全部，其实很容易找到能获得 1000 倍以上性能提升的例子。
让我们一起来看看：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 99,999 张照片&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;phoneNumbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5554445555&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1424445656&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5554443333&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;…&lt;/span&gt; &lt;span class="err"&gt;×&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;999&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// 返回包含 "55" 的照片&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;contains55&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;55&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// 取 100 张包含 "55" 的照片&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;phoneNumbers&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contains55&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个例子中，&lt;code&gt;map&lt;/code&gt; 和 &lt;code&gt;filter&lt;/code&gt; 用来处理 &lt;code&gt;99,999&lt;/code&gt; 个元素。
不过我们只需要它的一个子集就可以得到想要的结果了，例如 &lt;code&gt;10,000&lt;/code&gt; 个，
性能提升也是非常大的（&lt;a href="http://jsperf.com/lazy-demo" rel="nofollow" target="_blank" title=""&gt;基准测试&lt;/a&gt;）：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://justjavac.com/assets/images/benchmark.jpg" title="" alt="benchmark"&gt;&lt;/p&gt;
&lt;h2 id="Pipelining"&gt;Pipelining&lt;/h2&gt;
&lt;p&gt;惰性计算带来了另一个好处，我称之为 "Pipelining"。
它可以避免链式方法执行期间创建中间数组。
取而代之，我们在单个元素上执行所有操作。
所以，下面的代码：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;func2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;func3&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将大致翻译为如下的常规 Lo-Dash（严格计算）&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nx"&gt;temp1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nx"&gt;temp2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nx"&gt;temp3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nx"&gt;temp1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nx"&gt;temp2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;temp1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nx"&gt;temp3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;temp2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;temp3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果我们使用惰性计算，它会像下面这样执行：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;func2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不使用临时数组可以给我们带来非常显著的性能提升，特别是当源数组非常大时，内存访问是昂贵的资源。&lt;/p&gt;
&lt;h2 id="延迟执行"&gt;延迟执行&lt;/h2&gt;
&lt;p&gt;和惰性计算一起使用的是延迟执行。
当你创建一个链，我们并不立即计算它的值，直到 &lt;code&gt;.value()&lt;/code&gt; 被显式或者隐式地调用。
这种方法有助于先准备一个查询，随后我们使用最新的数据来执行它。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;assets&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ownedBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;me&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/new/assets&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;assets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;assets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 更新我的资金&lt;/span&gt;
    &lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 返回我钱包的最新的总额&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在某些情况下，这样做也可以加速执行时间。我们可以在前期创建复杂的查询，然后当时机成熟时再执行它。&lt;/p&gt;
&lt;h2 id="Wrap up"&gt;Wrap up&lt;/h2&gt;
&lt;p&gt;懒惰计算并不是行业里的新理念。它已经包含在了许多库里面，例如 &lt;a href="http://en.wikipedia.org/wiki/Language_Integrated_Query" rel="nofollow" target="_blank" title=""&gt;LINQ&lt;/a&gt;、&lt;a href="http://danieltao.com/lazy.js/" rel="nofollow" target="_blank" title=""&gt;Lazy.js&lt;/a&gt; 等等。我相信 Lo-Dash 和这些库最主要的区别是，你可以在一个更新的、更强大的引擎里面使用原有的 Underscore API。不需要学习新的库，不需要修改代码，只是简单升级。&lt;/p&gt;

&lt;p&gt;但是，即使你不打算使用 Lo-Dash，我希望这篇文章启发了你。
现在，当你发现你的应用程序存在性能瓶颈，不要仅仅是去 jsperf.com 以 try/fail 风格优化它。
而是去喝杯咖啡，并开始考虑算法。
最重要的是创意，但良好的数学背景会让你如鱼得水（&lt;a href="http://mitpress.mit.edu/books/introduction-algorithms" rel="nofollow" target="_blank" title=""&gt;book&lt;/a&gt;）。祝你好运！&lt;/p&gt;</description>
      <author>justjavac</author>
      <pubDate>Wed, 16 Dec 2015 09:36:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/28401</link>
      <guid>https://ruby-china.org/topics/28401</guid>
    </item>
    <item>
      <title>是时候使用 Mithril.js 了</title>
      <description>&lt;p&gt;Mithril.js 是一个客户端的 JavaScript MVC 框架。&lt;/p&gt;

&lt;p&gt;随着 [Flarum][1] 也使用了 Mithril，这个小框架在 github 上的 star 数量也已经突破了 4K。&lt;/p&gt;
&lt;h2 id="Mithril 是什么？"&gt;Mithril 是什么？&lt;/h2&gt;
&lt;p&gt;Mithril 是一个客户端 javascript MVC 框架，即它是一个工具，使应用程序代码分为数据层 (Model)，UI 层 (View)，黏合层 (Controller)。&lt;/p&gt;

&lt;p&gt;Mithril 通过 gzip 压缩后，仅有 12kb 左右，这要归功于 small, focused, API。它提供了一个模板引擎与一个虚拟 DOM diff 实现高性能渲染，还提供了其它高级工具，以及支持路由和组件化。&lt;/p&gt;

&lt;p&gt;框架的目标是使应用程序代码更容易组织，可读和可维护，帮助你成为一个更好的开发者。&lt;/p&gt;

&lt;p&gt;不像某些框架，Mithril 努力避免将您锁定到某个 web 框架上：您可以尽量少地使用您所需要的框架。&lt;/p&gt;

&lt;p&gt;然而，使用其整个工具库可以带来很多好处：学习使用函数式编程和巩固良好的编码实践，OOP 和 MVC 只是其中的一些。&lt;/p&gt;
&lt;h2 id="特点"&gt;特点&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;轻量级&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gzip 压缩后仅仅 12kb，无依赖&lt;/li&gt;
&lt;li&gt;非常少的 API，非常容易的学习曲线&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;鲁棒性&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;默认安全的模板&lt;/li&gt;
&lt;li&gt;层次化的 MVC 组件（hierarchical）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;快速&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;虚拟 DOM 和编译模板&lt;/li&gt;
&lt;li&gt;智能的重绘系统（redrawing）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="入门示例代码"&gt;入门示例代码&lt;/h2&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//model 模型&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pages.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Demo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//controller 控制器&lt;/span&gt;
    &lt;span class="na"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c1"&gt;//view 视图&lt;/span&gt;
    &lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;m&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;m&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}),&lt;/span&gt;
            &lt;span class="nf"&gt;m&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;onclick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rotate links&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="c1"&gt;//initialize 初始化&lt;/span&gt;
&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;example&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;Demo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="性能"&gt;性能&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://upload-images.jianshu.io/upload_images/6640-dcc4bfc71f85f299.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" title="" alt="mithrils.js 性能"&gt;&lt;/p&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[Mithrils.js 中文文档][3]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[1]: &lt;a href="http://discuss.flarum.org.cn/" rel="nofollow" target="_blank"&gt;http://discuss.flarum.org.cn/&lt;/a&gt;
  [3]: &lt;a href="https://justjavac.gitbooks.io/mithriljs/content/content/getting-started.html" rel="nofollow" target="_blank"&gt;https://justjavac.gitbooks.io/mithriljs/content/content/getting-started.html&lt;/a&gt;&lt;/p&gt;</description>
      <author>justjavac</author>
      <pubDate>Sat, 26 Sep 2015 10:37:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/27486</link>
      <guid>https://ruby-china.org/topics/27486</guid>
    </item>
    <item>
      <title>当 XXX 时，到底发生了什么...</title>
      <description>&lt;h2 id="当 XXX 时，到底发生了什么..."&gt;当 XXX 时，到底发生了什么...&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.linuxsir.org/bbs/thread205849.html" rel="nofollow" target="_blank" title=""&gt;当你开启电脑时，它发生了什么&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wenanry/archive/2010/02/25/1673368.html" rel="nofollow" target="_blank" title=""&gt;当你输入一个网址的时候，实际会发生什么&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.xyduan.net/what-happened-when-you-visit-taobao/" rel="nofollow" target="_blank" title=""&gt;当你访问淘宝的时候，发生了什么&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.shellsec.com/tech/57648.html" rel="nofollow" target="_blank" title=""&gt;for 循环中到底发生了什么—— Python 提高班&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://blog.csdn.net/chenyu105/article/details/7738388" rel="nofollow" target="_blank" title=""&gt;linux 终端下敲 Ctrl+C 时，到底发生了什么&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.itnose.net/detail/6109533.html" rel="nofollow" target="_blank" title=""&gt;gcc -static hello.c 背后究竟发生了什么&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://blog.csdn.net/norains/article/details/6052029" rel="nofollow" target="_blank" title=""&gt;main 函数之前究竟发生了什么&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://bbs.tianya.cn/post-itinfo-52476-1.shtml" rel="nofollow" target="_blank" title=""&gt;在 CPU 执行一条 C 语句的时候，硬件到底发生了什么变化&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luyingxue/archive/2011/11/12/2246890.html" rel="nofollow" target="_blank" title=""&gt;C# 参数传递时到底发生了什么（一般传递方式）&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luyingxue/archive/2011/11/13/2247056.html" rel="nofollow" target="_blank" title=""&gt;C# 参数传递时到底发生了什么（ref）&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.tuicool.com/articles/URzeIb" rel="nofollow" target="_blank" title=""&gt;当 i=i++ 时，究竟发生了什么&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;本文在 github 不定期更新，欢迎投稿。repo 地址：&lt;a href="https://github.com/justjavac/what-happens-when-zh_CN" rel="nofollow" target="_blank"&gt;https://github.com/justjavac/what-happens-when-zh_CN&lt;/a&gt;&lt;/p&gt;</description>
      <author>justjavac</author>
      <pubDate>Tue, 21 Jul 2015 10:53:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/26585</link>
      <guid>https://ruby-china.org/topics/26585</guid>
    </item>
    <item>
      <title>Web 框架层出不穷，然而 RoR 早已看透了一切</title>
      <description>&lt;p&gt;几天前我在 github 上创建了一个项目：&lt;a href="https://github.com/justjavac/PHPonPails" rel="nofollow" target="_blank" title=""&gt;PHP on Pails&lt;/a&gt; &lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt;&lt;/p&gt;
&lt;h2 id="缘起"&gt;缘起&lt;/h2&gt;
&lt;p&gt;本项目缘起于一条微博 &lt;a href="http://weibo.com/3468511964/Cm1opcEg0" rel="nofollow" target="_blank"&gt;http://weibo.com/3468511964/Cm1opcEg0&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Swift 开源了，于是，这货就出来了 &lt;a href="https://github.com/SwiftOnSails" rel="nofollow" target="_blank" title=""&gt;SwiftOnSails&lt;/a&gt;，虽然我是第一次看这个名字，但是总有一种很熟悉的感觉。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;于是我创建了&lt;a href="https://github.com/justjavac/PHPonPails" rel="nofollow" target="_blank" title=""&gt;PHP on Pails&lt;/a&gt; 项目。而后我又在 github 上简单搜索了一下，居然各种语言都有 XoX 的框架。&lt;/p&gt;

&lt;p&gt;果然，在几年前 RoR 就已经开始引领潮流了。&lt;/p&gt;
&lt;h2 id="汇总"&gt;汇总&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/brilliantfantastic/nails" rel="nofollow" target="_blank" title=""&gt;ASP.NET on Nails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grails/grails-core" rel="nofollow" target="_blank" title=""&gt;Groovy on Grails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/scslab/hails" rel="nofollow" target="_blank" title=""&gt;Hashkell on Hails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/richdyang/jails" rel="nofollow" target="_blank" title=""&gt;Java on Jails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/melkior/jails.old" rel="nofollow" target="_blank" title=""&gt;Javascript on Jails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ratdaddy/nails" rel="nofollow" target="_blank" title=""&gt;Node.js on Nails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/far-rel/Pails" rel="nofollow" target="_blank" title=""&gt;Python on Pails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/justjavac/PHPonPails" rel="nofollow" target="_blank" title=""&gt;PHP on Pails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SwiftOnSails" rel="nofollow" target="_blank" title=""&gt;Swift on Sails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="License"&gt;License&lt;/h2&gt;
&lt;p&gt;PoP(PHP on Pails) is licensed under the GPL license. See &lt;a href="https://github.com/justjavac/PHPonPails/blob/master/LICENSE" rel="nofollow" target="_blank" title=""&gt;LICENSE&lt;/a&gt; for more information.&lt;/p&gt;

&lt;p&gt;如果你发现了什么逗比项目，可以去 github 提交，或者直接回复，地址&lt;a href="https://github.com/justjavac/PHPonPails" rel="nofollow" target="_blank"&gt;https://github.com/justjavac/PHPonPails&lt;/a&gt;&lt;/p&gt;</description>
      <author>justjavac</author>
      <pubDate>Tue, 16 Jun 2015 13:39:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/26047</link>
      <guid>https://ruby-china.org/topics/26047</guid>
    </item>
    <item>
      <title>发福利，整理了一份关于 “资源汇总” 的汇总</title>
      <description>&lt;p&gt;觉得有用的话，可以去 github 关注：&lt;a href="https://github.com/justjavac/awesome-awesomeness-zh_CN" rel="nofollow" target="_blank"&gt;https://github.com/justjavac/awesome-awesomeness-zh_CN&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;一份关于“资料汇总”的汇总。&lt;/p&gt;
&lt;h2 id="通用"&gt;通用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/justjavac/free-programming-books-zh_CN" rel="nofollow" target="_blank" title=""&gt;free-programming-books-zh_CN&lt;/a&gt; 免费的计算机编程类中文书籍&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/hacke2/hacke2.github.io/issues/2" rel="nofollow" target="_blank" title=""&gt;精彩博客集合&lt;/a&gt; hacke2/hacke2.github.io#2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/geekcompany/ResumeSample" rel="nofollow" target="_blank" title=""&gt;ResumeSample&lt;/a&gt; 程序员简历模板列表&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/greatghoul/remote-working" rel="nofollow" target="_blank" title=""&gt;remote-working&lt;/a&gt; 收集整理远程工作相关的资料&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="编程语言"&gt;编程语言&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Android&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://stormzhang.github.io/android/2014/07/07/learn-android-from-rookie/" rel="nofollow" target="_blank" title=""&gt;Android 学习之路&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Trinea/android-open-project" rel="nofollow" target="_blank" title=""&gt;android-open-project&lt;/a&gt; Android 开源项目分类汇总&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;C/C++&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/sib9/cpp1x-study-resource" rel="nofollow" target="_blank" title=""&gt;cpp1x-study-resource&lt;/a&gt; C++11 的学习资源&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/GameDevelopmentCollege/Game-Programming-Patterns-CN" rel="nofollow" target="_blank" title=""&gt;Game-Programming-Patterns-CN&lt;/a&gt; 游戏编程模式中文&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;iOS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/tangqiaoboy/iOSBlogCN" rel="nofollow" target="_blank" title=""&gt;iOSBlogCN&lt;/a&gt; 中文 iOS/Mac 开发博客列表&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/hzlzh/Best-App" rel="nofollow" target="_blank" title=""&gt;Best-App&lt;/a&gt; 收集&amp;amp;推荐优秀的 Apps/硬件/技巧/周边等&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Lax/iOS-Swift-Demos" rel="nofollow" target="_blank" title=""&gt;iOS-Swift-Demos&lt;/a&gt; Swift 学习资源&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nixzhu/dev-blog" rel="nofollow" target="_blank" title=""&gt;dev-blog&lt;/a&gt; 一些 iOS/Web 开发相关的翻译或原创博客文章&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ipader/SwiftGuide" rel="nofollow" target="_blank" title=""&gt;SwiftGuide&lt;/a&gt; Swift 语言指南&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;javascript&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/justjavac/awesome-firebase" rel="nofollow" target="_blank" title=""&gt;awesome-firebase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/justjavac/AngularJS-Learning-zh_CN" rel="nofollow" target="_blank" title=""&gt;AngularJS-Learning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sergtitov/NodeJS-Learning/blob/master/cn_resource.md" rel="nofollow" target="_blank" title=""&gt;NodeJS-Learning&lt;/a&gt; Nodejs 中文资料导航&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/youyudehexie/node123" rel="nofollow" target="_blank" title=""&gt;node123&lt;/a&gt; node.js 中文资料导航&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://segmentfault.com/blog/tmdphp/1190000000749890" rel="nofollow" target="_blank" title=""&gt;国内开源 html5 游戏引擎全收录&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHP&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pic1.zhimg.com/0af096f07b5d5bb18a0bb4bdbf9ac5a6_r.jpg" rel="nofollow" target="_blank" title=""&gt;PHP 知识结构思维导图&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Python&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Yixiaohan/" rel="nofollow" target="_blank" title=""&gt;codeparkshare&lt;/a&gt; Python 初学者书籍、视频、资料、社区推荐&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/wklken/stackoverflow-py-top-qa" rel="nofollow" target="_blank" title=""&gt;stackoverflow-py-top-qa&lt;/a&gt; stackoverflow 上 Python 相关回答整理翻译&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ruby&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ruby-china.org/wiki" title=""&gt;Ruby 资料&lt;/a&gt; by Ruby China&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="WEB前端"&gt;WEB 前端&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://caifujianghu.com/article/yige-hege-de-qianduan-gongchengshi-bikan-de-shuji.html" rel="nofollow" target="_blank" title=""&gt;一个合格的前端工程师必看的书籍&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://knowledge.ecomfe.com/" rel="nofollow" target="_blank" title=""&gt;前端知识体系&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/JacksonTian/fks" rel="nofollow" target="_blank" title=""&gt;fks&lt;/a&gt; 前端技能汇总&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/lisposter/frontend-books" rel="nofollow" target="_blank" title=""&gt;frontend-books&lt;/a&gt; 收集前端方面的书籍&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/foru17/front-end-collect" rel="nofollow" target="_blank" title=""&gt;front-end-collect&lt;/a&gt; 分享自己长期关注的前端开发相关的优秀网站、博客、以及活跃开发者&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/AlloyTeam/Mars" rel="nofollow" target="_blank" title=""&gt;Mars&lt;/a&gt; 腾讯移动 Web 前端知识库&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/hoosin/mobile-web-favorites" rel="nofollow" target="_blank" title=""&gt;mobile-web-favorites&lt;/a&gt; 移动前端开发收藏夹&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>justjavac</author>
      <pubDate>Thu, 13 Nov 2014 13:24:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/22647</link>
      <guid>https://ruby-china.org/topics/22647</guid>
    </item>
    <item>
      <title>ReplaceGoogleCDN：将 Google CDN 替换为国内的</title>
      <description>&lt;p&gt;Chrome Web Store 安装地址：&lt;br&gt;
&lt;a href="https://chrome.google.com/webstore/detail/replace-google-cdn/kpampjmfiopfpkkepbllemkibefkiice" rel="nofollow" target="_blank"&gt;https://chrome.google.com/webstore/detail/replace-google-cdn/kpampjmfiopfpkkepbllemkibefkiice&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;由于众所周知的原因，只需替换一个域名就可以继续使用 Google 提供的前端公共库了。
同样，通过 script 标记引用这些资源，让网站访问速度瞬间提速吧骚年！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;很多网站，尤其是国外网站，为了加快网站的速度，都是用了 Google 的 CDN。
但是在天朝，由于某些原因，导致全球最快的 CDN 变成了全球最慢的。&lt;/p&gt;

&lt;p&gt;于是，我写了这个插件，将 Google 的 CDN 替换成国内的。&lt;/p&gt;

&lt;p&gt;本来使用的 360 的，经网友提醒 360 的不支持 https，于是改成中科大的。&lt;/p&gt;

&lt;p&gt;此插件包括两部分。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;ajax.googleapis.com&lt;/code&gt; - 前端公共库&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fonts.googleapis.com&lt;/code&gt; - 免费字体库&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>justjavac</author>
      <pubDate>Tue, 04 Nov 2014 08:08:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/22451</link>
      <guid>https://ruby-china.org/topics/22451</guid>
    </item>
    <item>
      <title>免费的编程中文书籍索引</title>
      <description>&lt;p&gt;项目地址：&lt;a href="https://github.com/justjavac/free-programming-books-zh_CN" rel="nofollow" target="_blank"&gt;https://github.com/justjavac/free-programming-books-zh_CN&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="目录"&gt;目录&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;语言无关类

&lt;ul&gt;
&lt;li&gt;操作系统&lt;/li&gt;
&lt;li&gt;WEB 服务器&lt;/li&gt;
&lt;li&gt;版本控制&lt;/li&gt;
&lt;li&gt;NoSQL&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;项目相关&lt;/li&gt;
&lt;li&gt;Web&lt;/li&gt;
&lt;li&gt;大数据&lt;/li&gt;
&lt;li&gt;编程艺术&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;语言相关类

&lt;ul&gt;
&lt;li&gt;AWK&lt;/li&gt;
&lt;li&gt;C/C++&lt;/li&gt;
&lt;li&gt;CSS/HTML&lt;/li&gt;
&lt;li&gt;Dart&lt;/li&gt;
&lt;li&gt;Fortran&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;iOS&lt;/li&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Prolog&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Shell&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Groovy&lt;/li&gt;
&lt;li&gt;LaTeX&lt;/li&gt;
&lt;li&gt;LISP&lt;/li&gt;
&lt;li&gt;Lua&lt;/li&gt;
&lt;li&gt;Haskell&lt;/li&gt;
&lt;li&gt;R&lt;/li&gt;
&lt;li&gt;Scala&lt;/li&gt;
&lt;li&gt;Swift&lt;/li&gt;
&lt;li&gt;Vimscript&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;读书笔记及其它&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;项目地址：&lt;a href="https://github.com/justjavac/free-programming-books-zh_CN" rel="nofollow" target="_blank"&gt;https://github.com/justjavac/free-programming-books-zh_CN&lt;/a&gt;&lt;/p&gt;</description>
      <author>justjavac</author>
      <pubDate>Mon, 03 Nov 2014 21:54:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/22445</link>
      <guid>https://ruby-china.org/topics/22445</guid>
    </item>
    <item>
      <title>开发者必备的 Chrome 扩展</title>
      <description>&lt;p&gt;Firebug：不用多介绍了吧
&lt;a href="https://chrome.google.com/webstore/detail/bmagokdooijbeehmkpknfglimnifench" rel="nofollow" target="_blank"&gt;https://chrome.google.com/webstore/detail/bmagokdooijbeehmkpknfglimnifench&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ChromeSnifferPlus：Chrome 探测器，可以探测正在使用的开源软件或者 js 类库
&lt;a href="https://chrome.google.com/webstore/detail/chrome-sniffer-plus/fhhdlnnepfjhlhilgmeepgkhjmhhhjkh" rel="nofollow" target="_blank"&gt;https://chrome.google.com/webstore/detail/chrome-sniffer-plus/fhhdlnnepfjhlhilgmeepgkhjmhhhjkh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;EyeDroper：浏览器窗口内取色，看到喜欢的配色可以查一下颜色代码留存以后用
&lt;a href="https://chrome.google.com/webstore/detail/aonjhmdcgbgikgjapjckfkefpphjpgma" rel="nofollow" target="_blank"&gt;https://chrome.google.com/webstore/detail/aonjhmdcgbgikgjapjckfkefpphjpgma&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MeasureIt：浏览器窗口内测距，用于测量元素的大小
&lt;a href="https://chrome.google.com/webstore/detail/hmdcmlfkchdmnmnmheododdhjedfccka" rel="nofollow" target="_blank"&gt;https://chrome.google.com/webstore/detail/hmdcmlfkchdmnmnmheododdhjedfccka&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Window Resizer：可以快速调整浏览器窗口的尺寸，用于观察网站页面宽度
&lt;a href="https://chrome.google.com/webstore/detail/kkelicaakdanhinjdeammmilcgefonfh" rel="nofollow" target="_blank"&gt;https://chrome.google.com/webstore/detail/kkelicaakdanhinjdeammmilcgefonfh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Awesome Screenshot：个人感觉最好用的截图工具
&lt;a href="https://chrome.google.com/webstore/detail/alelhddbbhepgpmgidjdcjakblofbmce" rel="nofollow" target="_blank"&gt;https://chrome.google.com/webstore/detail/alelhddbbhepgpmgidjdcjakblofbmce&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ultimate Chrome Flag：在地址栏显示网站所在地区的国旗，还可以显示 RP 值和 alexa 排名
&lt;a href="https://chrome.google.com/webstore/detail/dbpojpfdiliekbbiplijcphappgcgjfn" rel="nofollow" target="_blank"&gt;https://chrome.google.com/webstore/detail/dbpojpfdiliekbbiplijcphappgcgjfn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PageMonitor：页面监控，如果内容有更新就通知你，我就是用这个插件在苹果官方商店上抢到了 iphone4，可用的地方很多，比容用来监控竞争对手的改版……
&lt;a href="https://chrome.google.com/webstore/detail/pemhgklkefakciniebenbfclihhmmfcd" rel="nofollow" target="_blank"&gt;https://chrome.google.com/webstore/detail/pemhgklkefakciniebenbfclihhmmfcd&lt;/a&gt;&lt;/p&gt;</description>
      <author>justjavac</author>
      <pubDate>Sun, 02 Nov 2014 20:35:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/22414</link>
      <guid>https://ruby-china.org/topics/22414</guid>
    </item>
    <item>
      <title>开发者福利！ChromeSnifferPlus 插件正式登陆 Chrome Web Store</title>
      <description>&lt;p&gt;今天（2014-10-30）下午，ChromeSnifferPlus 插件正式登陆 Chrome Web Store。&lt;/p&gt;

&lt;p&gt;在线安装地址： &lt;a href="https://chrome.google.com/webstore/detail/chrome-sniffer-plus/fhhdlnnepfjhlhilgmeepgkhjmhhhjkh" rel="nofollow" target="_blank"&gt;https://chrome.google.com/webstore/detail/chrome-sniffer-plus/fhhdlnnepfjhlhilgmeepgkhjmhhhjkh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome 探测器，可以探测正在使用的开源软件或者 js 类库，开发者必备。&lt;/p&gt;

&lt;p&gt;通过本插件，您可以探测：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;javascript 库：jQuery、ExtJS、Angular 等。&lt;/li&gt;
&lt;li&gt;常用的 web 服务：百度统计、cnzz、Google Analytics 等。&lt;/li&gt;
&lt;li&gt;Web 框架：WordPress、phpBB、Drupal、MediaWiki 等。&lt;/li&gt;
&lt;li&gt;服务器环境：PHP、Apache、nginx 等。&lt;/li&gt;
&lt;li&gt;当你安装此插件去浏览网页时，还可以发现更多你未知的框架和库。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你发现了还不能探测的类库，可以&lt;a href="https://github.com/justjavac/ChromeSnifferPlus/issues" rel="nofollow" target="_blank" title=""&gt;创建 issues&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;本次更新包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;重构了部分代码，提升了插件的性能。&lt;/li&gt;
&lt;li&gt;新增加了多种库的检测：Highcharts、YUI 3、Zepto.js、Tengine ……&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;查看：&lt;a href="https://github.com/justjavac/ChromeSnifferPlus/blob/master/changelog.md" rel="nofollow" target="_blank" title=""&gt;更新日志&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;插件源代码托管在 github 平台： &lt;a href="https://github.com/justjavac/ChromeSnifferPlus" rel="nofollow" target="_blank"&gt;https://github.com/justjavac/ChromeSnifferPlus&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="截图"&gt;截图&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://github.com/justjavac/ChromeSnifferPlus/raw/master/screenshot/shot1.png" title="" alt="ChromeSnifferPlus效果截图"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img src="https://github.com/justjavac/ChromeSnifferPlus/raw/master/screenshot/shot2.png" title="" alt="ChromeSnifferPlus效果截图"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img src="https://github.com/justjavac/ChromeSnifferPlus/raw/master/screenshot/shot3.png" title="" alt="ChromeSnifferPlus效果截图"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img src="https://github.com/justjavac/ChromeSnifferPlus/raw/master/screenshot/shot4.png" title="" alt="ChromeSnifferPlus效果截图"&gt; &lt;/p&gt;</description>
      <author>justjavac</author>
      <pubDate>Thu, 30 Oct 2014 21:21:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/22366</link>
      <guid>https://ruby-china.org/topics/22366</guid>
    </item>
    <item>
      <title>Firebase 相关文章索引</title>
      <description>&lt;p&gt;最近谷歌收购 Firebase 的新闻又将 Firebase 拉入了人们的视野，于是我在 github 做了一个项目，地址：&lt;a href="https://github.com/justjavac/awesome-firebase" rel="nofollow" target="_blank"&gt;https://github.com/justjavac/awesome-firebase&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;a href="https://www.firebase.com" rel="nofollow" target="_blank" title=""&gt;Firebase&lt;/a&gt; 是一个数据同步的云服务，不同于 Dropbox 的「文件」，Firebase 同步的是「数据」，服务对象是网站开发者，帮助他们开发具有「实时」（Real-Time）特性的应用。&lt;/p&gt;

&lt;p&gt;开发者只需引用一个 API 库文件就可以使用标准 REST API 的各种接口对数据进行读写操作，只需编写 HTML＋CSS＋JavaScrip 前端代码，不需要服务器端代码（如需整合，也及其简单），省下的时间可以让开发者专注于开发应用功能，完善设计和体验，解决用户的实际问题。&lt;/p&gt;

&lt;p&gt;听着是不是很熟悉，对，就是 noBackend（无后端编程）。只需要关注前端代码，需要增删改查数据的时候，发送 REST 请求即可，后端的工作由 Firebase 来搞定。&lt;/p&gt;

&lt;p&gt;或许我翻译的另一个项目你也敢兴趣：&lt;a href="https://github.com/justjavac/json-api-zh_CN" rel="nofollow" target="_blank" title=""&gt;用 JSON 构建 API 的标准指南&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="文章"&gt;文章&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.html-js.com/article/Using-Angular-to-develop-web-application-with-AngularJS-and-Firebase-to-produce-a-real-time-polling-application" rel="nofollow" target="_blank" title=""&gt;用 AngularJS 和 Firebase 制作一个实时投票应用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://segmentfault.com/blog/fxp/1190000000723045" rel="nofollow" target="_blank" title=""&gt;(30 hackdays day 1) Firebase – Rethink database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cnodejs.org/topic/51f0edf7f4963ade0e082c19" rel="nofollow" target="_blank" title=""&gt;Firebase 很酷，来部署一个自己的吧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.csdn.net/justfrozen/article/details/12716669" rel="nofollow" target="_blank" title=""&gt;实时 Javascript 开发框架 Clouda、Meteor、Firebase 对比&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="视频"&gt;视频&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://player.vimeo.com/video/62208736" rel="nofollow" target="_blank" title=""&gt;在 Xcode 中使用 Firebase&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="资讯"&gt;资讯&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.36kr.com/p/102056.html" rel="nofollow" target="_blank" title=""&gt;创业公司 Firebase 提供实时数据后端，让你使用 JavaScript 就能创建高品质数据驱动的动态网站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wired.tw/2012/05/23/firebase/index.html" rel="nofollow" target="_blank" title=""&gt;有了 Firebase，打造應用程式好簡單&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://news.pedaily.cn/201306/20130621350228.shtml" rel="nofollow" target="_blank" title=""&gt;Firebase 获 560 万美元 A 轮融资 投资方为 USV 和 Flybridge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.oschina.net/news/56342/google-buy-firebase" rel="nofollow" target="_blank" title=""&gt;谷歌收购 Firebase，更看重程序员市场&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="工具"&gt;工具&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.firepad.io/" rel="nofollow" target="_blank" title=""&gt;Firepad&lt;/a&gt; 一个基于 Firebase 数据库平台构建的编辑器，可以实时多人协作编辑&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/firebase/firebase-tools" rel="nofollow" target="_blank" title=""&gt;firebase-tools&lt;/a&gt; Firebase 命令行工具&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/assemble/grunt-firebase" rel="nofollow" target="_blank" title=""&gt;grunt-firebase&lt;/a&gt; 用来更新 firebase 数据的 Grunt 任务&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="库"&gt;库&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/firebase/angularfire" rel="nofollow" target="_blank" title=""&gt;angularfire&lt;/a&gt; AngularJS bindings for Firebase&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/oscardelben/firebase-ruby" rel="nofollow" target="_blank" title=""&gt;firebase-ruby&lt;/a&gt; Ruby wrapper for Firebase&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ozgur/python-firebase" rel="nofollow" target="_blank" title=""&gt;python-firebase&lt;/a&gt; Python 实现的 Firebase REST API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="项目"&gt;项目&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/firebase/firechat" rel="nofollow" target="_blank" title=""&gt;firechat&lt;/a&gt; 基于 Firebase 的实时聊天系统&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/firebase/emberfire" rel="nofollow" target="_blank" title=""&gt;emberfire&lt;/a&gt; Official Ember Data adapter for Firebase&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/firebase/firereader" rel="nofollow" target="_blank" title=""&gt;firereader&lt;/a&gt; 基于 Firebase 和 AngularJS 的 RSS 阅读器&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/firebase/reactfire" rel="nofollow" target="_blank" title=""&gt;reactfire&lt;/a&gt; ReactJS mixin for easy Firebase integration&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dstaley/realtime-hacker-news" rel="nofollow" target="_blank" title=""&gt;realtime-hacker-news&lt;/a&gt; 基于 Firebase 实现的实时 Hacker News&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>justjavac</author>
      <pubDate>Wed, 22 Oct 2014 16:35:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/22195</link>
      <guid>https://ruby-china.org/topics/22195</guid>
    </item>
    <item>
      <title>用 JSON 构建 API 的标准指南中文版</title>
      <description>&lt;p&gt;github 地址：&lt;a href="https://github.com/justjavac/json-api-zh_CN" rel="nofollow" target="_blank"&gt;https://github.com/justjavac/json-api-zh_CN&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如果你和你的团队曾经争论过使用什么方式构建合理 JSON 响应格式，
那么 JSON API 就是你的 anti-bikeshedding 武器。&lt;/p&gt;

&lt;p&gt;通过遵循共同的约定，可以提高开发效率，利用更普遍的工具，可以是你更加专注于开发重点：你的程序。&lt;/p&gt;

&lt;p&gt;基于 JSON API 的客户端还能够充分利用缓存，以提升性能，有时甚至可以完全不需要网络请求。&lt;/p&gt;

&lt;p&gt;下面是一个使用 JSON API 发送响应（response）的示例：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;links&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;posts.author&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;href&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://example.com/people/{posts.author}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;people&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;posts.comments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;href&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://example.com/comments/{posts.comments}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;comments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;posts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rails is Omakase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;links&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;author&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;9&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;comments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;12&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;17&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;20&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顶级的 &lt;code&gt;"links"&lt;/code&gt; 部分是可选的。
除去 &lt;code&gt;"links"&lt;/code&gt; 部分，此响应看起来非常接近使用已经存在的 API 构建的响应。&lt;/p&gt;

&lt;p&gt;JSON API 不仅可以用来构建响应，还包括创建和更新资源。&lt;/p&gt;
&lt;h2 id="现状"&gt;现状&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;本文档是一个正在进展的工作&lt;/strong&gt;，在具体实现过程中将会有所改变。详细信息请查看&lt;a href="http://jsonapi.org.cn/status" rel="nofollow" target="_blank" title=""&gt;现状&lt;/a&gt;页面。&lt;/p&gt;
&lt;h2 id="MIME 类型"&gt;MIME 类型&lt;/h2&gt;
&lt;p&gt;JSON API 已经在  IANA 机构完成注册。
它的 MIME 类型是 &lt;a href="http://www.iana.org/assignments/media-types/application/vnd.api+json" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;application/vnd.api+json&lt;/code&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="格式"&gt;格式&lt;/h2&gt;
&lt;p&gt;在开始使用 JSON API 前，先查看一下&lt;a href="http://jsonapi.org.cn/format" rel="nofollow" target="_blank" title=""&gt;JSON API 格式文档&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="更新历史"&gt;更新历史&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2013-05-03：最初版本的草案。&lt;/li&gt;
&lt;li&gt;2013-07-22：媒体类型在 IANA 注册完成。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你可以使用 RSS 阅读器在&lt;a href="https://github.com/json-api/json-api/commits.atom" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;订阅本提要的变更。&lt;/p&gt;</description>
      <author>justjavac</author>
      <pubDate>Mon, 20 Oct 2014 15:51:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/22138</link>
      <guid>https://ruby-china.org/topics/22138</guid>
    </item>
  </channel>
</rss>
