<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>saiga (saiga)</title>
    <link>https://ruby-china.org/saiga</link>
    <description>请认准唯一指定邮箱：aiasfina#hotmail.com</description>
    <language>en-us</language>
    <item>
      <title>一个个人任务管理工具</title>
      <description>&lt;p&gt;最近在重新养成使用【番茄工作法】的习惯，想着顺便用 rails 新出的 webpacker 做点什么，结果就花了几天参照使用着的 &lt;a href="https://www.pomotodo.com" rel="nofollow" target="_blank" title=""&gt;番茄土豆&lt;/a&gt; 做了一个更适合个人口味的任务管理工具。&lt;/p&gt;
&lt;h3 id="技术栈"&gt;技术栈&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Rails 5.0&lt;/li&gt;
&lt;li&gt;webpacker&lt;/li&gt;
&lt;li&gt;Mithril.js&lt;/li&gt;
&lt;li&gt;mithril-stream (类似 rxjs 或 xstream)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="demo &amp;amp; github"&gt;demo &amp;amp; github&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://198.71.84.27:3000" rel="nofollow" target="_blank" title=""&gt;demo&lt;/a&gt; 账号密码：test@sample.com 123456&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;由于 yarn 的关系导致 heroku 部署 demo 有点曲折，就从箱底找出一个垃圾 vps 顶着用，很慢，请见谅。&lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/aiasfina/tomato" rel="nofollow" target="_blank" title=""&gt;github&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="吐槽时间"&gt;吐槽时间&lt;/h3&gt;
&lt;p&gt;虽然使用 &lt;code&gt;webpacker&lt;/code&gt;，但还是需要使用 assets pipline，也就是要在之前的基础上再加上一句来打包。我还畅想能把 assets pipline 摘掉，结果还是想多了。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./bin/webpack
rails assets:precompile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外要说的一点是，rails-webpacker 用的是 &lt;code&gt;yaml&lt;/code&gt; + &lt;code&gt;js&lt;/code&gt; 来配置 wepcak.config。但就个人体验来说，除了啰嗦还是啰嗦，而且还特绕。如果是新手不熟悉 webpack，搜索出的文档你都不知道咋改。&lt;/p&gt;
&lt;h3 id="预览图"&gt;预览图&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/0f376a7e-7be0-4f4d-b399-0def071ff990.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Tue, 25 Apr 2017 23:05:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/32867</link>
      <guid>https://ruby-china.org/topics/32867</guid>
    </item>
    <item>
      <title>跟风安利，用 Mithril.js 实现的 Homeland Demo</title>
      <description>&lt;p&gt;最近出现很多使用 vue, react 山寨 ruby-china 的帖子，比如&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://ruby-china.org/topics/32268" title=""&gt;https://ruby-china.org/topics/32268&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ruby-china.org/topics/32214" title=""&gt;https://ruby-china.org/topics/32214&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ruby-china.org/topics/31287" title=""&gt;https://ruby-china.org/topics/31287&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;直到上星期看到 &lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt; 做了一个 homeland 的 react demo &lt;a href="https://ruby-china.org/topics/32303" title=""&gt;https://ruby-china.org/topics/32303&lt;/a&gt;，才决定基于 react demo 的 html 和 css，用 Mithril.js 重写了前端的逻辑，强势跟风来安利一波。&lt;/p&gt;

&lt;p&gt;DEMO: &lt;a href="http://mithril-ruby-china.herokuapp.com/" rel="nofollow" target="_blank" title=""&gt;http://mithril-ruby-china.herokuapp.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GITHUB: &lt;a href="https://github.com/aiasfina/mithril-ruby_china" rel="nofollow" target="_blank" title=""&gt;https://github.com/aiasfina/mithril-ruby_china&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="什么是 Mithril.js"&gt;什么是 Mithril.js&lt;/h2&gt;
&lt;p&gt;Mithril 是一个超轻量（总共 1200 行代码，gzip 之后只有几 kb），无依赖的前端框架，比 React, Vue 出现都要晚。所以早期 &lt;code&gt;0.x&lt;/code&gt; 的时候略有模仿 React 的迹象，而到了最近 &lt;code&gt;1.x&lt;/code&gt; 之后就完全有了自己的风格。&lt;/p&gt;

&lt;p&gt;在这上千行的代码里，Mithril 提供了几个功能：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;基于 HyperScript 构建 Virtual DOM&lt;/li&gt;
&lt;li&gt;DOM diff&lt;/li&gt;
&lt;li&gt;双向绑定&lt;/li&gt;
&lt;li&gt;AJAX&lt;/li&gt;
&lt;li&gt;路由&lt;/li&gt;
&lt;li&gt;兼容 JSX&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;这里是 Mithril 的 API 文档 &lt;a href="http://mithril.js.org/api.html" rel="nofollow" target="_blank" title=""&gt;http://mithril.js.org/api.html&lt;/a&gt;，滚轮滑两下就到底了，学习起来完全没有压力。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="Mithril 表现如何"&gt;Mithril 表现如何&lt;/h2&gt;
&lt;p&gt;由于相比 react 版本缺了点东西，所以可能数据有点不准。再加上 Mithril 版本的首页字体缺失导致 painting 时间延长，所以可能各自测试的结果略有差别。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;其实如果由 turbolinks 版本对比就更好了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="下面分别是 首页，列表切换，列表到主题 的数据"&gt;下面分别是 &lt;code&gt;首页&lt;/code&gt;，&lt;code&gt;列表切换&lt;/code&gt;，&lt;code&gt;列表到主题&lt;/code&gt; 的数据&lt;/h3&gt;&lt;h4 id="React"&gt;React&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/cb71a84848ec43d946b1250648e5a13d.jpg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2017/8ce22356bb0be94ca74041cfb8527931.jpg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2017/4fef2b1bba80b74466dc734e1a4cda6c.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h4 id="Mithril"&gt;Mithril&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/d30d0be874ddf5964b0b3c2ef9326760.jpg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2017/b00ac31837187dda58eb35fd5561469e.jpg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2017/161c18a3715bcdf64e191315e72d2f95.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;事实上，Mithril 的渲染速度比 react 要慢一点。但得益于本体的大小，所以脚本执行速度略胜一筹。
PS: 由于 React 版本在切换列表时会用一个 loading 的 dom 替换，没有发挥 dom diff 的优势，所以数据差别才会那么大。下面是切换列表时 dom 的变化情况。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="React"&gt;React&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/d8aacd0d9c8b417484d88e412c3077b5.gif!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h4 id="Mithrl"&gt;Mithrl&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/1780f35674f466640f37cdee45fb847e.gif!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="为什么可以考虑 Mithril"&gt;为什么可以考虑 Mithril&lt;/h2&gt;
&lt;p&gt;Mithril 本体目前还非常活跃，但周围生态极其贫乏，与 Vue、React 相比处于劣势。如果需要构建重量级 &lt;code&gt;SPA&lt;/code&gt; 可能力有不逮。但由于本体非常小，学习成本低，可以接入到任何网页实现部分组件化，所以还是非常值得推荐的。而且也有了生产环境使用案例，像 vimeo，nike，Flarum 都在产品中使用了。&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Mon, 20 Feb 2017 19:04:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/32344</link>
      <guid>https://ruby-china.org/topics/32344</guid>
    </item>
    <item>
      <title>今天要回深圳了，不知道现在还有公司在招人吗？</title>
      <description>&lt;p&gt;今天要回去一趟看看，蹲个一两个星期，不知道现在还有在招人的吗？&lt;/p&gt;

&lt;p&gt;自我介绍：
1 年全职 ruby on rails 经验，linux 日常使用 4 年，前端 javascript 和 css 也还可以
离职一段时间里专攻了一下 js 和 设计，能玩一点 ai 和 ae。&lt;/p&gt;

&lt;p&gt;博客：&lt;a href="http://catlog.info/" rel="nofollow" target="_blank"&gt;http://catlog.info/&lt;/a&gt;
邮箱：aiasfina#hotmail.com
正在运行的作品： &lt;a href="http://web-colle.herokuapp.com/" rel="nofollow" target="_blank"&gt;http://web-colle.herokuapp.com/&lt;/a&gt;&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Wed, 17 Dec 2014 13:25:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/23247</link>
      <guid>https://ruby-china.org/topics/23247</guid>
    </item>
    <item>
      <title>新写了一个网站，收集各种好看的网页</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2014/5e3bc822443bb73fdb2cf97dab730b58.png" title="" alt=""&gt;
&lt;a href="http://web-colle.herokuapp.com/" rel="nofollow" target="_blank"&gt;http://web-colle.herokuapp.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这个网站主要是接受前台提交的网址，后台使用 PhantomJS 截图并且分析颜色构成。用户可以根据标签和颜色进行浏览（就是想仿 dribbble）&lt;/p&gt;

&lt;p&gt;但是，我发这个贴的目的其实是想讨论一下颜色搜索这个功能...&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;目前颜色搜索（点击详情页右边的色条）是对颜色参数加权平均进行的范围查询，然后通过 color rank 排序。但如你所见，很多时候效果都非常差，虽然目前有个备选方案，但是实现起来有点麻烦。&lt;/p&gt;

&lt;p&gt;不知道大伙有啥想法？&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Fri, 12 Dec 2014 18:00:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/23165</link>
      <guid>https://ruby-china.org/topics/23165</guid>
    </item>
    <item>
      <title>大家怎么看待 trailblazer 这个 gem？</title>
      <description>&lt;p&gt;&lt;a href="https://github.com/apotonick/trailblazer" rel="nofollow" target="_blank"&gt;https://github.com/apotonick/trailblazer&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Trailblazer is a thin layer on top of Rails. It gently enforces encapsulation, an intuitive code structure and gives you an object-oriented architecture.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;目前我看到的功能：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;将 model 改成贫血模型&lt;/li&gt;
&lt;li&gt;将持久化操作从 controller 抽取出来，放到内部类中&lt;/li&gt;
&lt;li&gt;解决全局 helper 问题，action 和 helper 都放到 cell 里面了（类似 volt 的 controller）&lt;/li&gt;
&lt;li&gt;校验放到 form object 里面（与 reform 和 cell 同一个作者）&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;我的理解就是集成了 reform 和 cell，然后自己实现了一套 service 层。&lt;/p&gt;

&lt;p&gt;btw，关于 service 层和 rails model 过分充血好像之前也有争论，不知道大伙对这个 gem 有什么看法？&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Sat, 29 Nov 2014 23:33:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/22935</link>
      <guid>https://ruby-china.org/topics/22935</guid>
    </item>
    <item>
      <title>AngularJS 2.0 正在路上..</title>
      <description>&lt;p&gt;AngularJS 作为最前沿的 JavaScript 框架之一，版本号的改变肯定不是简单的 1 + 1，所以 2.0 不负众望地带来了非常大的改变：&lt;/p&gt;

&lt;p&gt;从模板到代码都有改动，完全不向下兼容 1.x...&lt;/p&gt;

&lt;p&gt;变成一个叫 angularjs2 的新框架...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;是的，你在 1.x 所学的大部分知识都要过时了。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="模板语法改变"&gt;模板语法改变&lt;/h2&gt;
&lt;p&gt;新的模板语法将更严格区分 property 和 attribute，不再采用指令统一语法，而使用 &lt;code&gt;[]&lt;/code&gt; 和 &lt;code&gt;()&lt;/code&gt; 来区分数据和事件行为：&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;[value]=&lt;/span&gt;&lt;span class="s"&gt;"newTodoTitle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"addTodo()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;+&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;ng-repeat&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;todo]=&lt;/span&gt;&lt;span class="s"&gt;"todosof('goods')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{todo.title}}&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从代码可以看到，ng-model 将被中括号替代，ng-click 则变成小括号。&lt;/p&gt;
&lt;h2 id="controllers 和 $scope 没了"&gt;controllers 和 $scope 没了&lt;/h2&gt;
&lt;p&gt;新版本更强调组件化，不再使用 controllers 控制 view，而是使用 component directvie 声明组件，在组件内管理状态，这有点类似 reactjs 的写法：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ComponentDirective&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodoApp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;newTodoTitle&lt;/span&gt; &lt;span class="o"&gt;=&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="nl"&gt;addTodo&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="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nl"&gt;todosof&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;filter&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="Directive 还在，但概念上更复杂，而 DDO (Directive Defined Object) 则被取消了"&gt;Directive 还在，但概念上更复杂，而 DDO (Directive Defined Object) 则被取消了&lt;/h2&gt;
&lt;p&gt;2.0 中 Directive 还在，但在视频中我们可以看到 Directive 暂时被分为了三种：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Component Directive&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Template Directive&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decorator Directive&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="代码示例："&gt;代码示例：&lt;/h3&gt;&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;ComponentDirective&lt;/span&gt;&lt;span class="p"&gt;({...})&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Todo&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;TemplateDirective&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="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;NgRepeat&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="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;DecoratorDirective&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="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;NgClass&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;contollers&lt;/code&gt;，而关注 dom 变化的被归类为模板指令，装饰指令则对应样式变化和动画。&lt;/p&gt;

&lt;p&gt;参考以上的代码你可以看到，由于采用了面向对象的写法，以前写的 directive 将不能在 2.0 中使用...&lt;/p&gt;
&lt;h2 id="去掉 jqLite"&gt;去掉 jqLite&lt;/h2&gt;
&lt;p&gt;2.0 追求更现代的浏览器和 ECMAScript6 规范，鼓励直接使用原生 api 操作，也就没有必要使用 jQuery 来兼容各浏览器差异。&lt;/p&gt;

&lt;p&gt;至于 IE 能兼容到什么版本，我个人猜测 IE10 应该是没问题的。&lt;/p&gt;
&lt;h2 id="框架本身采用了 AtScript 开发"&gt;框架本身采用了 AtScript 开发&lt;/h2&gt;
&lt;p&gt;AtScript 是 TypeScript 的超集，除了拥有类型之外，她还在 TypeScript 的基础上加入了注解。&lt;/p&gt;

&lt;p&gt;虽然框架并不一定需要搭配 AtScript 进行开发，但 AtScript 并不像 CoffeeScript，而且目前还没看到使用原生 JavaScript 的示例。&lt;/p&gt;
&lt;h2 id="不再采用 angular.module"&gt;不再采用 angular.module&lt;/h2&gt;
&lt;p&gt;或许是因为 AtScript 提供了更好的模块管理功能，2.0 将不再支持 angular.module 方式管理模块，而是采用类似 python 的方式：&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;TodoService&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="s"&gt;'./todo_service'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="1.3 是否还会维护"&gt;1.3 是否还会维护&lt;/h2&gt;
&lt;p&gt;根据 Brad Green 的回答，距离 2.0 发布大约还需要一年半到两年的时间，在这段时间内还会为 1.3 提供补丁....&lt;/p&gt;
&lt;h2 id="最后"&gt;最后&lt;/h2&gt;
&lt;p&gt;目前 2.0 还在快速迭代中，很多东西并没有最终定下来。不过我认为后面会为平滑升级做文章应该不太可能了，因为 2.0 弱化了 MVVM 而强调了组件化的概念，这个概念在 polymer 和 react 中已经得到了证明： &lt;strong&gt;前端组件化是趋势&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;相关文章：&lt;a href="http://www.infoq.com/cn/news/2014/11/angular-2-atscript?utm_source=infoq&amp;amp;utm_medium=popular_links_homepage" rel="nofollow" target="_blank" title=""&gt;AngularJS 2.0 细节披露&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;相关视频：&lt;a href="https://www.youtube.com/watch?v=gNmWybAyBHI&amp;amp;spfreload=10" rel="nofollow" target="_blank" title=""&gt;油管&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>saiga</author>
      <pubDate>Sun, 09 Nov 2014 04:02:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/22564</link>
      <guid>https://ruby-china.org/topics/22564</guid>
    </item>
    <item>
      <title>入坑 Elixir， 想做一个关于 Elixir 的论坛有人感兴趣吗？</title>
      <description>&lt;p&gt;这两天开始看 Elixir，顺便想用 &lt;a href="/rei" class="user-mention" title="@rei"&gt;&lt;i&gt;@&lt;/i&gt;rei&lt;/a&gt; 的 campo 改一个 Elixir 的论坛，图都已经画好了，不知道有没有人感兴趣？
虽然感觉直接在 ruby china 上讨论应该也可以...&lt;/p&gt;

&lt;p&gt;图.....&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2014/74da0538321ad839a139a99854f7ed2b.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2014/b864f50308608a9f07330ea4e9e9a334.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Wed, 17 Sep 2014 22:20:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/21578</link>
      <guid>https://ruby-china.org/topics/21578</guid>
    </item>
    <item>
      <title>Ruby 2.2 的 可回收 symbol</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;Q: 请描述一下 Symbol 可能引起的内存泄露？&lt;/p&gt;

&lt;p&gt;A: Symbol 不会被 GC 回收，如果频繁调用 &lt;code&gt;#to_sym&lt;/code&gt; 方法将字符串转换成 Symbol 的话，会耗费大量内存。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;这个是我比较喜欢的一道面试题，不过你已经不用记这个问题了，因为它将在 Ruby 2.2 得到解决。&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="进入正题"&gt;进入正题&lt;/h3&gt;
&lt;p&gt;六个月前，Narihiro Nakamura 放出了一个 &lt;a href="https://bugs.ruby-lang.org/issues/9634" rel="nofollow" target="_blank" title=""&gt;补丁&lt;/a&gt; ，这个补丁可以让 Ruby GC 对 Symbol 进行回收，而这个特性将会与 Ruby 2.2 一同发布。&lt;/p&gt;

&lt;p&gt;Ruby 语言规定了 Symbol 是不可回收的单例对象，为什么会在这个时候才成为 GC 的目标呢？&lt;/p&gt;

&lt;p&gt;这是因为 Ruby 在定义 Symbol 时过于粗暴了，让所有 symbol 都不可回收，而在日常开发中大部分的 Symbol 都是可以回收的。&lt;/p&gt;
&lt;h3 id="动态 symbol"&gt;动态 symbol&lt;/h3&gt;
&lt;p&gt;在 Ruby 2.2 中，Narihiro Nakamura 并没有过多地改动原有的 symbol，而是定义了一个新的类型 &lt;code&gt;dynamic symbol&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;这个类型在 C 里面是一个 &lt;code&gt;RSymbol&lt;/code&gt;，与 &lt;code&gt;RString&lt;/code&gt;, &lt;code&gt;RArray&lt;/code&gt; 等一样是 &lt;code&gt;RVALUE&lt;/code&gt;，这样 GC 就可以针对该 structs 进行回收。&lt;/p&gt;

&lt;p&gt;于是乎 Symbol 就被分为 静态 和 动态 两种：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;静态 symbol&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;由 rb_intern() 生成的&lt;/li&gt;
&lt;li&gt;跟原来一样有一个全局唯一的编号&lt;/li&gt;
&lt;li&gt;不可回收&lt;/li&gt;
&lt;li&gt;LSB = 1 (最低有效位等于 1)&lt;/li&gt;
&lt;li&gt;保留 ID 在 147 以下的例外&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动态 symbol&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;在 Ruby 中调用 &lt;code&gt;#to_sym&lt;/code&gt;, &lt;code&gt;#intern&lt;/code&gt; 生成的&lt;/li&gt;
&lt;li&gt;在 C 中是一个 &lt;code&gt;RVALUE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;可以回收&lt;/li&gt;
&lt;li&gt;LSB = 0&lt;/li&gt;
&lt;li&gt;当它通过 &lt;code&gt;SYM2ID&lt;/code&gt; 或 &lt;code&gt;rb_intern&lt;/code&gt; 转换成一个 ID 时会变成受限状态&lt;/li&gt;
&lt;li&gt;受限状态的 symbol 不会被回收&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;### Ruby 的改动&lt;/p&gt;

&lt;p&gt;无论 symbol 是动态还是静态，对于 Ruby 都是透明的。这里是实现清单：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;parse.y: support Symbol GC. [ruby-trunk Feature #9634]
See this ticket about Symbol GC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;include/ruby/ruby.h:
Declare few functions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rb_sym2id: almost same as old SYM2ID but support dynamic symbols.&lt;/li&gt;
&lt;li&gt;rb_id2sym: almost same as old ID2SYM but support dynamic symbols.&lt;/li&gt;
&lt;li&gt;rb_sym2str: almost same as rb_id2str(SYM2ID(sym)) but not pin down a dynamic symbol. Declare a new struct.&lt;/li&gt;
&lt;li&gt;struct RSymbol: represents a dynamic symbol as object in Ruby's heaps. Add few macros.&lt;/li&gt;
&lt;li&gt;STATIC_SYM_P: check a static symbol.&lt;/li&gt;
&lt;li&gt;DYNAMIC_SYM_P: check a dynamic symbol.&lt;/li&gt;
&lt;li&gt;RSYMBOL: cast to RSymbol&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;gc.c: declare RSymbol. support T_SYMBOL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;internal.h: Declare few functions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rb_gc_free_dsymbol: free up a dynamic symbol. GC call this function at a sweep phase.&lt;/li&gt;
&lt;li&gt;rb_str_dynamic_intern: convert a string to a dynamic symbol.&lt;/li&gt;
&lt;li&gt;rb_check_id_without_pindown: not pinning function.&lt;/li&gt;
&lt;li&gt;rb_sym2id_without_pindown: ditto.&lt;/li&gt;
&lt;li&gt;rb_check_id_cstr_without_pindown: ditto.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;string.c (Init_String): String#intern and String#to_sym use rb_str_dynamic_intern.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;template/id.h.tmpl: use LSB of ID as a flag for determining a static symbol, so we shift left other ruby_id_types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;string.c: use rb_sym2str instead rb_id2str(SYM2ID(sym)) to avoid pinning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;load.c: use xx_without_pindown function at creating temporary ID to avoid pinning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;object.c: ditto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sprintf.c: ditto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;struct.c: ditto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;thread.c: ditto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;variable.c: ditto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vm_method.c: ditto.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;可以看出，很多改动都是针对新的 &lt;code&gt;RSymbol&lt;/code&gt;，而 &lt;code&gt;string.c&lt;/code&gt; 中改为调用 &lt;code&gt;rb_str_dynamic_intern&lt;/code&gt; 使得我们可以通过 &lt;code&gt;String#intern&lt;/code&gt; 和 &lt;code&gt;String#to_sym&lt;/code&gt; 获得动态 symbol。&lt;/p&gt;
&lt;h3 id="Benchmark"&gt;Benchmark&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# /tmp/a.rb&lt;/span&gt;
&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="mi"&gt;100_000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;times&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond_to?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"sym&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_sym&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;GC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt;&lt;span class="s2"&gt;"symbol : &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all_symbols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% time RBENV_VERSION=ruby-r45059 ruby -v /tmp/a.rb
ruby 2.2.0dev (2014-02-20 trunk 45059) [x86_64-linux]
symbol : 102416
0.24s user 0.01s system 91% cpu 0.272 total

% time RBENV_VERSION=symgc ruby -v /tmp/a.rb
ruby 2.2.0dev (2014-02-20 trunk 45059) [x86_64-linux]
symbol : 2833
0.21s user 0.01s system 90% cpu 0.247 total
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;symgc 的 symbols 对象的数量大量减少了&lt;/li&gt;
&lt;li&gt;由于 Full GC 减少，使得 symgc 总耗时更少&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这里有一份更详尽的性能测试清单，可以看出性能并没有明显下降 &lt;a href="https://gist.github.com/authorNari/9359704" rel="nofollow" target="_blank"&gt;https://gist.github.com/authorNari/9359704&lt;/a&gt;&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Fri, 12 Sep 2014 10:53:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/21498</link>
      <guid>https://ruby-china.org/topics/21498</guid>
    </item>
    <item>
      <title>【传教向】LiveScript，不仅仅是 JavaScript</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近在充实一下贫瘠的博客好在面试时加点分，刚好撸完这篇顺道传教来了...
另外&lt;a href="http://catlog.info/p/livescript-not-only-javascript" rel="nofollow" target="_blank" title=""&gt;博客&lt;/a&gt;里面还有好几篇关于 LiveScript 的:)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;如果你还不知道 LiveScript，可以看看这里： &lt;a href="http://catlog.info/p/ten-reasons-to-switch-from-coffeescript" rel="nofollow" target="_blank" title=""&gt;从 CoffeeScript 转到 LiveScript 的 10 个理由&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="脱离 &lt;- 回调嵌套"&gt;脱离 &amp;lt;- 回调嵌套&lt;/h3&gt;
&lt;p&gt;&amp;lt;-  这是直接引诱我从 CoffeeScript 转到 LiveScript 的符号，他可以扁平化嵌套回调&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# CoffeeScript&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;$&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="na"&gt;on&lt;/span&gt; &lt;span class="s"&gt;'click'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'#btn'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt; &lt;span class="s"&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;resp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# LiveScript&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;-!&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;
&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;on&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="c1"&gt;#btn&lt;/span&gt;
&lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;
&lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面这两段代码是等价的，但是 LiveScript 明显少了很多缩进&lt;/p&gt;

&lt;p&gt;不过，如果中间夹杂着顺序逻辑，这或许会给你造成困扰...&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# CoffeeScript&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;$&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="na"&gt;on&lt;/span&gt; &lt;span class="s"&gt;'click'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'#btn1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;$&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="na"&gt;on&lt;/span&gt; &lt;span class="s"&gt;'click'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'#btn2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时候可以使用 do 来摆脱嵌套&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;-!&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;on&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="c1"&gt;#btn1&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;on&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="c1"&gt;#btn2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="多才多能的 do"&gt;多才多能的 do&lt;/h3&gt;
&lt;p&gt;在 CoffeeScript 中，do 可以立即调用函数。而在 LiveScript...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;调用函数&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="c1"&gt;# CoffeeScript 也有&lt;/span&gt;
&lt;span class="nx"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="c1"&gt;# LiveScript推荐的无参调用&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;参数包装&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# CoffeeScript&lt;/span&gt;
&lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;bar&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;LiveScript 并不支持换行 + 缩进调用，但可以使用 do 关键字来实现真正的多行参数，这在用表达式作为参数时非常有用&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;bar&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;代码块，相当于 (...)&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nx"&gt;doAsync&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt; 
  &lt;span class="nx"&gt;fn&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="nx"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
      &lt;span class="nx"&gt;bar&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
    &lt;span class="mi"&gt;123&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="双向管道"&gt;双向管道&lt;/h3&gt;
&lt;p&gt;管道是 LiveScript 非常炫的语法，管道前的结果将会作为管道后函数的参数被调用&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 12&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也支持反向，但只是代码反转，结果是一样的&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;|&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;|&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有了正反向管道，就出现了双向管道了。LiveScript 在处理双向管道时会先计算右管道，再计算左管道&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;|&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上三段代码代码转译结果等价&lt;/p&gt;
&lt;h3 id="占位符"&gt;占位符&lt;/h3&gt;
&lt;p&gt;LiveScript 的占位符提供了 部分应用函数 的特性&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;plus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;
&lt;span class="nx"&gt;plus5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;plus&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;
&lt;span class="nx"&gt;plus5&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以应用到管道上，与上面不同的是，下面的代码不会生成 partialize$ 函数&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;plus&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你熟悉 Scala，或许会像我一样写过这样的代码&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="c1"&gt;# 错误！&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是因为 LiveScript 的占位符只能用在参数位置，管道并不会推导成调用者本身&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="c1"&gt;# 正解&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="使用 let 改变上下文"&gt;使用 let 改变上下文&lt;/h3&gt;
&lt;p&gt;立即执行函数 (Immediate Functions) 在 JavaScript 到处可见，这是因为 JavaScript 搞笑的变量声明，如果在全局环境下声明会默认成为全局变量&lt;/p&gt;

&lt;p&gt;在 CoffeeScript 和 LiveScript 会把每个 script 文件内的代码都编译在立即执行函数中，所以并不常见。但有时侯我们会想改变上下文&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;let&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请注意 this 赋值一定要在最前面&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;let&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jQuery&lt;/span&gt;
  &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;do&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;something&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="神奇的括号"&gt;神奇的括号&lt;/h3&gt;
&lt;p&gt;LiveScript 的括号很神奇，不同的位置有着不同的效果&lt;/p&gt;

&lt;p&gt;当括号里是变量时，会转译成函数调用&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#== lisp 方式的函数调用&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bar&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cf&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="c1"&gt;#== 同上&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当括号里是 点 + 变量，转译成函数定义&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt; &lt;span class="s"&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;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;plus1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;plus&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="绑定流"&gt;绑定流&lt;/h3&gt;
&lt;p&gt;LiveScript 支持多层级流式调用，跟 jQuery 搭配时可以忘掉 ends() 了&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
  &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sidebar&lt;/span&gt;
    &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt; &lt;span class="nx"&gt;newContent&lt;/span&gt;
    &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;addClass&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;highlight&lt;/span&gt;
  &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;toggleClass&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;dark&lt;/span&gt;
  &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;prepend&lt;/span&gt; &lt;span class="nx"&gt;newHeader&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;x$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;x$&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;y$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;x$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.sidebar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;y$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;y$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;highlight&lt;/span&gt;&lt;span class="dl"&gt;'&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="nf"&gt;toggleClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&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="nf"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newHeader&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 coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
  &lt;span class="nx"&gt;sidebar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sidebar&lt;/span&gt;
    &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt; &lt;span class="nx"&gt;newContent&lt;/span&gt;
    &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;addClass&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;highlight&lt;/span&gt;
  &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;toggleClass&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;dark&lt;/span&gt;
  &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;prepend&lt;/span&gt; &lt;span class="nx"&gt;newHeader&lt;/span&gt;

&lt;span class="nx"&gt;sidebar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="函数复合"&gt;函数复合&lt;/h3&gt;
&lt;p&gt;函数复合可以将几个操作合并在一起，调用顺序与箭头方向一致&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;plus1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;div2&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;div2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;plus1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;plus1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;div2&lt;/span&gt;
&lt;span class="nx"&gt;plus1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;div2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;plus1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;div2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要注意的是函数复合不能用在方法上！因此局限很大&lt;/p&gt;
&lt;h3 id="多样的箭头"&gt;多样的箭头&lt;/h3&gt;
&lt;p&gt;-&amp;gt;  定义函数&lt;/p&gt;

&lt;p&gt;&amp;lt;-  定义回调函数&lt;/p&gt;

&lt;p&gt;!-&amp;gt; 无返回值函数&lt;/p&gt;

&lt;p&gt;&amp;lt;-! 无返回值回调函数&lt;/p&gt;

&lt;p&gt;~&amp;gt; 绑定上下文的函数，等同于 CoffeeScript 的 fat arrow&lt;/p&gt;

&lt;p&gt;--&amp;gt; 柯里化函数&lt;/p&gt;

&lt;p&gt;~~&amp;gt; 绑定上下文的柯里化函数&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;除了箭头，LiveScript 也支持 function 关键字的函数声明&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;总结：&lt;/p&gt;

&lt;p&gt;LiveScript 的语法糖非常非常的多，在 CoffeeScript 的语法基础上进一步向 FP 靠拢，并提供了 prelude.ls 标准库。&lt;/p&gt;

&lt;p&gt;入门相比 CoffeeScript 要困难，不过如果你是 FP 的爱好者，不妨一试 :)&lt;/p&gt;

&lt;p&gt;ps: 这里是我用 liveScript 写的 express4 的 demo: (&lt;a href="https://github.com/aiasfina/express4-livescript-sample" rel="nofollow" target="_blank"&gt;https://github.com/aiasfina/express4-livescript-sample&lt;/a&gt;)&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Thu, 21 Aug 2014 20:11:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/21166</link>
      <guid>https://ruby-china.org/topics/21166</guid>
    </item>
    <item>
      <title>类似花瓣那种采集插件如何获得图片来源地址</title>
      <description>&lt;p&gt;目前在写一个日式漫画绘画素材收集的网站，图片采用浏览器插件和用户上传两种。&lt;/p&gt;

&lt;p&gt;插件通过用户在图片上右键点击，程序发送图片地址和当前标签地址。&lt;/p&gt;

&lt;p&gt;插件在百度，pixiv，dribbble，花瓣 这些网站上下载成功，部分出现 403。&lt;/p&gt;

&lt;p&gt;但是即使采集到图片，记录的来源地址依旧不可用。
举个例子：
&lt;code&gt;用户进入 pixiv 小图页面 -&amp;gt; 大图页面 -&amp;gt; 采集 -&amp;gt; 程序记录来源地址（大图地址），如下图&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2014/2674098ea132c4c98709f568706d4b98.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;红框地址是大图地址，也就是抓图的标签地址，但直接访问会 403，因为少了 referer。&lt;/p&gt;

&lt;p&gt;神奇的是花瓣会去到小图的地址，这个可以直接访问，比如这张： &lt;a href="http://huaban.com/pins/192691958/" rel="nofollow" target="_blank"&gt;http://huaban.com/pins/192691958/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;我想知道他是怎么做到的...或者说有什么比较靠谱的思路？&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Wed, 23 Jul 2014 00:39:47 +0800</pubDate>
      <link>https://ruby-china.org/topics/20631</link>
      <guid>https://ruby-china.org/topics/20631</guid>
    </item>
    <item>
      <title>Rails 死活连不上 Postgresql</title>
      <description>&lt;p&gt;环境：cubieboard，cubian，postgresql9.3.3&lt;/p&gt;

&lt;p&gt;SSH 上去可以用 psql，PC 可以用 pgadmin 远程连接。&lt;/p&gt;

&lt;p&gt;但是 cb 里面的 rails 会报错：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;could not connect to server: Connection timed out
        Is the server running on host "localhost" (127.0.0.1) and accepting
        TCP/IP connections on port 5432?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;postgresql 只改了这俩地方：&lt;/p&gt;

&lt;p&gt;postgresql.conf&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;listen_address = "*"  //CB上这里不设置成*，pg会启动不了
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;pg_hba.conf&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;host    all             all             127.0.0.1/32            trust
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改为&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;host    all             all             0.0.0.0/0            md5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rails 的 database.yml&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default: &amp;amp;default
  adapter: postgresql
  host: localhost
  port: 5432
  encoding: utf-8
  pool: 5
  username: ***
  password: ***
  timeout: 5000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 host 也试过 127.0.0.1 和 10.0.0.5，后者可以在 pgadmin 上登录。&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Thu, 06 Mar 2014 20:21:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/17701</link>
      <guid>https://ruby-china.org/topics/17701</guid>
    </item>
    <item>
      <title>模仿 Rails 的 Erlang Web 框架 --- Chicago Boss</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;跟风一下..&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="Chicago Boss"&gt;Chicago Boss&lt;/h2&gt;
&lt;p&gt;一个模仿 Rails 的 Erlang Web 框架。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.chicagoboss.org/" rel="nofollow" target="_blank" title=""&gt;官网&lt;/a&gt;上的介绍：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100% 异步 IO&lt;/li&gt;
&lt;li&gt;默认支持 WebSocket 和 长连接&lt;/li&gt;
&lt;li&gt;支持 Elixir&lt;/li&gt;
&lt;li&gt;支持缓存 (only memcache)&lt;/li&gt;
&lt;li&gt;NoSQL &amp;amp;&amp;amp; SQL&lt;/li&gt;
&lt;li&gt;内置 email 服务&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PS: 基于 Erlang 带来的优点，坛里搜搜就有，这里就不一一说了。&lt;/p&gt;
&lt;h2 id="内建模块"&gt;内建模块&lt;/h2&gt;
&lt;p&gt;Chicago Boss 主要由以下七个部分组成：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;BossDb&lt;/code&gt;：对数据库操作，模仿 AR &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Models&lt;/code&gt;:  定义数据模型&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ModelNew&lt;/code&gt;: 模型事件监听&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WebController&lt;/code&gt;: 控制器&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BossMq&lt;/code&gt;: 内建的消息队列&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;模型&lt;/strong&gt;
在 CB 里定义模型是非常简单的，创建 &lt;code&gt;src/model/article.erl&lt;/code&gt;：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%% src/model/article.erl
-module(article, [Id, Title]).
-compile(export_all).
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行 &lt;code&gt;./init-dev.sh&lt;/code&gt;，Chicago Boss 会启动服务，并送你一个 console，免费的&lt;/p&gt;

&lt;p&gt;在命令行里键入：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Article = article:new('id', "This is a title").
{ok, SavedArticle} = Article:save().

SavedArticle:title().
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ok.到此结束&lt;/p&gt;

&lt;p&gt;PS: Chicago Boss 会对 src/model/*.erl 进行特殊处理，所以不是操作数据库的模型不能放到里面。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;服务器別关了，下面轮到控制器...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;控制器&lt;/strong&gt;
创建 &lt;code&gt;src/controller/example_hello_controller.erl&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-module(example_hello_controller, [Req]).
-compile([export_all]).

index('GET', []) -&amp;gt;
    {output, "Hello, world."}.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开 &lt;a href="http://0.0.0.08003/hello/index" rel="nofollow" target="_blank"&gt;http://0.0.0.08003/hello/index&lt;/a&gt;：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;我要输出 html!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;将 &lt;code&gt;output&lt;/code&gt; 改成 &lt;code&gt;ok&lt;/code&gt;，创建 &lt;code&gt;/src/view/hello/index.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ok.到此结束&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Template&lt;/strong&gt;
{ignore, "不说也罢"}.&lt;/p&gt;
&lt;h2 id="是拙劣的模仿者吗？"&gt;是拙劣的模仿者吗？&lt;/h2&gt;
&lt;p&gt;模仿 Rails 注定干不过 Rails，CB 明白了这一点。所以他也在尽全力放大 Erlang 的优点。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;long-poll&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;首先请让我吼一句： “实现得 TM 太完美了”&lt;/p&gt;

&lt;p&gt;实际上，CB 并没有刻意对 long-poll 做额外的工作，而是 &lt;code&gt;BossMq&lt;/code&gt; 带来的彩蛋。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BossMq&lt;/code&gt; 主要有两个方法 &lt;code&gt;push/pull&lt;/code&gt; 。一个异步一个同步，也就是说 &lt;code&gt;pull&lt;/code&gt; 会堵塞进程。性质跟 long-pull 非常类似，所以写起来非常简单&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%% controller action
receive_chat('GET', []) -&amp;gt;
  {ok, Timestamp, Messages} = boss_mq:pull("my-channel", now)
  {output, Messages}.
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%% Send Message
boss_mq:push("my-channel", &amp;lt;&amp;lt;"Secret Message"&amp;gt;&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;客户端只要请求 &lt;code&gt;/receive_chat&lt;/code&gt;，&lt;code&gt;boss_mq:pull&lt;/code&gt; 就会堵塞直到 &lt;code&gt;boss_mq:push&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BossNews&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;一个可插拔的模型事件监听模块，结合 model hook 和 mq 的产物。&lt;/p&gt;

&lt;p&gt;场景：一个耗时的操作，比如在用户注册后发一封邮件。&lt;/p&gt;

&lt;p&gt;通常做法是在 save hook 里面推到 MQ 来发送，但是在 CB 我们可以利用 BossNews 来完成这一需要。&lt;/p&gt;

&lt;p&gt;来，骚年，打开你的 terminal&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{ok, WatchId} = boss_news:watch("articles", fun(_, _) -&amp;gt;
  error_logger:info_msg("Did you see that??~n") end).
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建一个新的 Article，控制台打印 "Did ...."&lt;/p&gt;

&lt;p&gt;BN 支持 create/update/delete 事件，支持单个记录的某个字段监听，也支持动态取消监听。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;boss_news:cancel_watch(WatchId).
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="结语"&gt;结语&lt;/h2&gt;
&lt;p&gt;Chicago Boss 是能吸引我动手写东西的 Erlang web framework，功能比不过大而全的 Rails，Erlang 是他最大的亮点，模板是他最大的硬伤，个人认为适合做小型站点、web app 或者 web server。
虽然用的人不多但是文档齐全，github 上目前还很活跃。而且官方说已经可以进入生产阶段。&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Sat, 28 Dec 2013 18:29:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/16477</link>
      <guid>https://ruby-china.org/topics/16477</guid>
    </item>
    <item>
      <title>ajax post 出现 InvalidAuthenticityToken</title>
      <description>&lt;p&gt;用的是 &lt;code&gt;$.post&lt;/code&gt;，已经引入 &lt;code&gt;jquery_ujs&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;prom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt; &lt;span class="s"&gt;'/capvalid'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'#captcha_key'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;val&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;prom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;done&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pass&lt;/span&gt;
    &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;cCaptcha.addClass&lt;/span&gt; &lt;span class="s"&gt;'has-success'&lt;/span&gt;
    &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;cCaptcha.addClass&lt;/span&gt; &lt;span class="s"&gt;'has-error'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正常进入页面是正常的。&lt;/p&gt;

&lt;p&gt;但是，关掉 chrome 再用还原标签页那个功能，post 带的那个 token 对不上。&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Fri, 08 Nov 2013 16:35:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/15397</link>
      <guid>https://ruby-china.org/topics/15397</guid>
    </item>
    <item>
      <title>send_file 时，Unicorn 出现 "X-Accel-Mapping header missing" 错误</title>
      <description>&lt;p&gt;环境：Rails4，Unicorn，Nginx，Ubuntu 12.04&lt;/p&gt;

&lt;p&gt;目的：通过 nginx 实现下载&lt;/p&gt;

&lt;p&gt;参考了 &lt;a href="http://www.cse.unsw.edu.au/~stulocal/lib/ruby/gems/1.8/doc/rack-1.1.1/rdoc/classes/Rack/Sendfile.html" rel="nofollow" target="_blank" title=""&gt;Rack doc&lt;/a&gt; 和 &lt;a href="http://blog.sina.com.cn/s/blog_54254a840101bpkc.html" rel="nofollow" target="_blank" title=""&gt;Rails 在 nginx 和 passenger 环境下的 X-Accel-Redirect 配置和使用&lt;/a&gt;，应该是 &lt;code&gt;nginx.conf&lt;/code&gt; 缺少了 &lt;code&gt;X-Accel-Mapping&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;但是，根据前面两篇文章设置&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proxy_set_header   X-Sendfile-Type     X-Accel-Redirect
proxy_set_header   X-Accel-Mapping     /download/=/railsroot/tmp/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nginx access.log 直接报 404 了。&lt;/p&gt;

&lt;p&gt;另外，如果没有 &lt;code&gt;X-Accel-Mapping&lt;/code&gt; ，程序正常，但文件是不是就由 Unicorn 来发了？&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Fri, 25 Oct 2013 18:41:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/15034</link>
      <guid>https://ruby-china.org/topics/15034</guid>
    </item>
    <item>
      <title>自己写了个东西，终于找到地方部署了。</title>
      <description>&lt;p&gt;大概是 12 年 12 月前就已经完成的这一版，一直没时间也没地方放上来。基于 Rails 和 MongodDB。&lt;/p&gt;

&lt;p&gt;由于 OpenShift 是目前为止对 Rails 和 MongoDB 支持比较不错的免费云服务，只能挂在上面了，服务器在 AWS，&lt;strong&gt;需要翻墙&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;简单介绍一下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docatapp 是个人使用的在线 Markdown 编辑，管理，分享应用，基于 Rails3.2.11 和 AngularJS 1.02，支持即时预览，分组管理，文档分享，文档内嵌。（大概 =_ =||）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;地址：&lt;a href="http://docatapp-aias.rhcloud.com" rel="nofollow" target="_blank"&gt;http://docatapp-aias.rhcloud.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;测试帐号:test@gmail.com 
密码：123456&lt;/p&gt;

&lt;p&gt;吐槽：编辑器实在不好用，BUG 也多，locatstorage 基本用不了，大概下一版会换了的。另，文档列表那个大黑块绝对会改的，如果觉得很怪异那灰常正常，因为只有 1366X768 分辨率才比较正常。总之，前端什么的下一版会重写，嗯，大概....&lt;/p&gt;

&lt;p&gt;PS:请使用 Firefox 和 Chrome，Opera 也可以。个人奉行无色无图无兼容，所以也不打算做其他兼容的了。&lt;/p&gt;

&lt;p&gt;最后，这是第一个网站，个人的下一个网站已经基本可以上线，只是找不到好用的 VPS，高富帅的用不起，求推荐便宜点的。数据库是 postgresql，基础数据 1.2G，10G 图片.，爬虫站。&lt;/p&gt;

&lt;p&gt;再最后，求份 rails 工作，地点不限，资薪不作要求。如果觉得我还可以的话，请联系一下。如果觉得可以塑造的话，其他语言也可以，会 Scala，不过 Java 语法忘了，可以实习。&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Sat, 23 Feb 2013 17:50:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/8876</link>
      <guid>https://ruby-china.org/topics/8876</guid>
    </item>
    <item>
      <title>[已解决] 生产环境下 cache fragment 如何响应多格式请求？</title>
      <description>&lt;p&gt;譬如 views 下有 &lt;code&gt;_part.html.erb&lt;/code&gt;  、&lt;code&gt;show.js.coffee&lt;/code&gt; 和 &lt;code&gt;show.html.erb&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;show.js.coffee&lt;/code&gt;：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;%= render :partial =&amp;gt; 'part' %&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;show.html.erb&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= render :partial =&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'part'&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;_part.html.erb&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;% cache &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;
...
&amp;lt;% end %&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在开发环境（已开缓存）下能够正确返回，但生产环境下 &lt;code&gt;js&lt;/code&gt; 渲染的还是 &lt;code&gt;show.html.erb&lt;/code&gt;，而且只返回 &lt;code&gt;part&lt;/code&gt;的内容。&lt;/p&gt;

&lt;p&gt;一开始以为是 cache key 的原因，后来加上 &lt;code&gt;cache @format do&lt;/code&gt; 还是一样的结果。求助！&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Fri, 14 Dec 2012 21:48:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/7582</link>
      <guid>https://ruby-china.org/topics/7582</guid>
    </item>
    <item>
      <title>关于 markdown 转换效能问题.</title>
      <description>&lt;p&gt;自己写了一个在线 markdown 编写分享的网站，在 markdown 处理上是沿用 ruby-china 的方法，每次更新 content 的时候生成 content_html。
但是现在有个问题：&lt;code&gt;redcarpet&lt;/code&gt; 在对稍微长点的文章处理要花费 2s 甚至更多的时间。论坛还好说，但是对于在线写作这类保存频率较高的网站有点不能接受。
我记得社区里面好像有好几人做过这类应用，能不能给点建议或意见？谢谢。&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Sat, 10 Nov 2012 19:11:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/6668</link>
      <guid>https://ruby-china.org/topics/6668</guid>
    </item>
    <item>
      <title>asset pipline 怎么关闭混淆器？</title>
      <description>&lt;p&gt;asset pipline 混淆器把函数参数全改成短名了，有没有什么方法可以只压缩不混淆？&lt;/p&gt;</description>
      <author>saiga</author>
      <pubDate>Mon, 05 Nov 2012 18:44:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/6549</link>
      <guid>https://ruby-china.org/topics/6549</guid>
    </item>
  </channel>
</rss>
