<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>42thcoder (子不语)</title>
    <link>https://ruby-china.org/42thcoder</link>
    <description>未来的不可知, 是前进的原动力</description>
    <language>en-us</language>
    <item>
      <title>[杭州] 美个朋友 Ruby 工程师多名</title>
      <description>&lt;h2 id="职位要求"&gt;职位要求&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt; 5 年以上开发经验，1 年以上 Rails 开发经验，熟练掌握使用 Rails 进行 Web 和 HTTP API 的开发&lt;/li&gt;
&lt;li&gt; 熟练使用 MySQL&lt;/li&gt;
&lt;li&gt;了解前端开发&lt;/li&gt;
&lt;li&gt; 对技术有热情&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="加分项"&gt;加分项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;精通 Rails, 系统学习过源码，经常关注 GitHub 上的 PR 和 issue&lt;/li&gt;
&lt;li&gt;有一种 MVC/MVVM 框架的使用经验，包括但不限于 Vue，React，Angular&lt;/li&gt;
&lt;li&gt;熟悉 Hotwire, 有丰富的使用经验，热爱面向 HTML 的前端开发&lt;/li&gt;
&lt;li&gt;计算机功底扎实，对 HTTP 非常熟悉&lt;/li&gt;
&lt;li&gt;有开发高并发，高可用系统的经验&lt;/li&gt;
&lt;li&gt; Github 独立维护项目者，活跃的博客&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="待遇&amp;amp;环境"&gt;待遇&amp;amp;环境&lt;/h2&gt;
&lt;p&gt;以下内容仅供参考，应该差别不大。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;公司规模化盈利：base 15 ~ 30K, 年底双薪; 表现优秀者有期权奖励&lt;/li&gt;
&lt;li&gt;位处 EFC 欧美金融城，生活和交通都很便利&lt;/li&gt;
&lt;li&gt;团建活动丰富，出国游/下午茶/生日会一个都不缺，入职还有伴手礼; 在这个寒冬里希望能给你一丝丝暖意&lt;/li&gt;
&lt;li&gt;小而美，一帮有技术热情的小伙伴，技术氛围 EFC 43 楼第一名&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="工作内容以及这边情况"&gt;工作内容以及这边情况&lt;/h2&gt;
&lt;p&gt;目前全栈工程师有 4 名，都是以 Rails 为主，另有多名 Java, 前端和原生客户端同学; 
此次招聘 1 ~ 2 名同学，主要负责：&lt;/p&gt;
&lt;h3 id="海外社交产品"&gt;海外社交产品&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;负责 PC / Mobile 站的开发和维护，重度使用了 Hotwire, 使用体验追求与 SPA 媲美&lt;/li&gt;
&lt;li&gt;开发和维护提供给 Android, iOS 和 vue 部分的 HTTP API&lt;/li&gt;
&lt;li&gt;后台管理系统的开发和维护&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="海外内容产品"&gt;海外内容产品&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;负责 PC 站的开发和维护&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="联系方式"&gt;联系方式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;邮件：zhangyunzheng # gmail.com&lt;/li&gt;
&lt;li&gt;微信：Digital-Refugee&lt;/li&gt;
&lt;li&gt;地址：杭州余杭区 EFC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最后放张图，新的办公室下周搬~&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/42thcoder/c6a51d36-1360-4cbc-9ab4-de83d84f0ca7.jpeg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Mon, 28 Nov 2022 00:13:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/42767</link>
      <guid>https://ruby-china.org/topics/42767</guid>
    </item>
    <item>
      <title>Get Started with TruffleRuby</title>
      <description>&lt;p&gt;TruffleRuby 最近发布了 &lt;code&gt;truffleruby-1.0.0-rc8&lt;/code&gt;, 离运行完整的 Rails 应用已经很近了，值得一玩。记录一下过程，给大家做个参考。&lt;/p&gt;
&lt;h2 id="安装 TruffleRuby"&gt;安装 TruffleRuby&lt;/h2&gt;
&lt;p&gt;目前已经支持 rbenv 和 rvm, 比之前手动构建方便了很多。我这边的系统是 macOS Mojave, 兼容性还不错。&lt;/p&gt;

&lt;p&gt;确保先安装 Java, 版本大于 8, 可以直接安装 11, 多版本并存的话推荐 &lt;code&gt;jenv&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;brew upgrade rbenv &amp;amp;&amp;amp; brew upgrade ruby-build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rbenv install truffleruby-1.0.0-rc7&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rbenv local truffleruby-1.0.0-rc7&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gem install bundler&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ruby -v&lt;/code&gt; =&amp;gt; truffleruby 1.0.0-rc7, like ruby 2.4.4, GraalVM CE Native [x86_64-darwin]`&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="尝试 Sinatra"&gt;尝试 Sinatra&lt;/h2&gt;
&lt;p&gt;先跑个简单的应用：&lt;a href="https://github.com/tnh/simple-sinatra-app" rel="nofollow" target="_blank" title=""&gt;Simple Sinatra App&lt;/a&gt; .&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gem install sinatra&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gem install puma&lt;/code&gt;, 用 puma 来跑，更符合实际情况&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bundle exec puma config.ru&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;打开浏览器，转到 &lt;code&gt;localhost:9292&lt;/code&gt; 就能看到了。&lt;/p&gt;
&lt;h3 id="性能"&gt;性能&lt;/h3&gt;
&lt;p&gt;用 wrk 简单测试了一下，&lt;code&gt;wrk -c 10 -t 5 -d 10 http://localhost:9292&lt;/code&gt;, 性能有点差。比 MRI 慢了一半，反馈给官方，官方的意思是目前专注于运行完整的 Rails 应用，性能问题后面再说。&lt;/p&gt;
&lt;h4 id="MRI"&gt;MRI&lt;/h4&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Running 10s test @ http://localhost:9293/
  5 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     8.29ms    9.80ms 145.37ms   96.30%
    Req/Sec   277.99     51.06   380.00     78.00%
  13866 requests in 10.03s, 2.45MB read
Requests/sec:   1383.02
Transfer/sec:    249.95KB
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="TruffleRuby"&gt;TruffleRuby&lt;/h5&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Running 1m test @ http://localhost:9292/
  5 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   144.61ms  321.44ms   1.87s    88.72%
    Req/Sec   134.63     80.87   410.00     63.68%
  30442 requests in 1.00m, 5.37MB read
Requests/sec:    506.60
Transfer/sec:     91.52KB
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="尝试 Rails"&gt;尝试 Rails&lt;/h2&gt;&lt;h3 id="gem"&gt;gem&lt;/h3&gt;
&lt;p&gt;完整运行 Rails 的最大挑战来源于在 JVM 中跑 C 扩展，而 Ruby 这么多年来也没有统一的 C 扩展 API, 太多 gem 都是基于 MRI 的内部机制来开发，只能一个个适配。目前最大的两个 gem: 一个是 &lt;code&gt;nokogiri&lt;/code&gt;, 一个是 &lt;code&gt;mysql2&lt;/code&gt;.  &lt;/p&gt;

&lt;p&gt;目前来说 &lt;code&gt;nokogiri&lt;/code&gt; 和 &lt;code&gt;sqlite&lt;/code&gt; 的组合是没有问题的，&lt;code&gt;mysql2&lt;/code&gt; 还在开发中。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gem install nokogiri -- --use-system-libraries&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rails new simple-rails-app&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果此处提示 &lt;code&gt;Gemfile not found&lt;/code&gt;, 可以尝试运行 &lt;code&gt;gem update&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="代码"&gt;代码&lt;/h3&gt;
&lt;p&gt;创建的项目，直接运行的会有问题，要做几个调整。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;config/boot.rb:4&lt;/code&gt; 把 &lt;code&gt;bootsnap&lt;/code&gt; 注释掉，暂时不支持。在 Gemfile 中增加两个 gem: &lt;code&gt;gem 'concurrent-ruby', '1.1.0.pre2',require:'concurrent'&lt;/code&gt; 和 &lt;code&gt;gem 'listen'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;之后就是常规操作了。&lt;code&gt;bundle exec rails g scaffold post title:string content:text&lt;/code&gt;; &lt;code&gt;bundle exec rails db:migrate&lt;/code&gt;; &lt;code&gt;bundle exec rails s&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;打开浏览器，转到 &lt;code&gt;localhost:3000/posts&lt;/code&gt; 就能把酷炫的博客系统跑起来了&lt;/p&gt;
&lt;h3 id="性能"&gt;性能&lt;/h3&gt;
&lt;p&gt;简单试了一下，性能也不乐观。期待正式版了。&lt;/p&gt;
&lt;h2 id="备注"&gt;备注&lt;/h2&gt;
&lt;p&gt;看完文章，可能会对 TruffleRuby 的性能不满，但实际上单看语言运行的话还不错的。大家可以跑跑 fib 试一下，跑热之后还是可以跟 nodejs 拼一下的。&lt;/p&gt;

&lt;p&gt;启动速度比 MRI 慢不少，但是基本上可以接受。&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Mon, 29 Oct 2018 15:54:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/37696</link>
      <guid>https://ruby-china.org/topics/37696</guid>
    </item>
    <item>
      <title>[杭州][C 轮] 时空电动汽车招聘 Ruby 工程师 2 名</title>
      <description>&lt;h2 id="职位要求"&gt;职位要求&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt; 1 年以上 Rails 开发经验，有相关工作经验者优先。如果优秀，可适当放宽。&lt;/li&gt;
&lt;li&gt; 熟悉数据库，目前在用 MySQL；&lt;/li&gt;
&lt;li&gt;能独立做事情，对技术有热情&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="加分项"&gt;加分项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;熟练掌握自动化测试&lt;/li&gt;
&lt;li&gt;有责任心&lt;/li&gt;
&lt;li&gt;Github 独立维护项目者&lt;/li&gt;
&lt;li&gt;活跃的博客&lt;/li&gt;
&lt;li&gt;关注新技术的动向，例如 react.js&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="待遇&amp;amp;环境"&gt;待遇&amp;amp;环境&lt;/h2&gt;
&lt;p&gt;以下内容仅供参考，应该差别不大。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8 - 15 K&lt;/li&gt;
&lt;li&gt;朝九晚五，工作压力小，极少加班，一个月一两次的样子&lt;/li&gt;
&lt;li&gt;团队鼓励大家学习新技术，在实践中成长&lt;/li&gt;
&lt;li&gt;CBD, 生活方便&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="工作内容以及这边情况"&gt;工作内容以及这边情况&lt;/h2&gt;
&lt;p&gt;部门是信息系统部，归属于时空本部，主要负责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;企业内部服务：为车辆租赁销售，换电站建设管理等兄弟部门提供信息化支持，开发并维护车辆管理系统，车辆运营系统，计费系统等等。&lt;/li&gt;
&lt;li&gt;面向 C 端司机的 App: 移动电网，目前已经上线&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;现在需要 2 名 Ruby 同学来做业务开发，主要负责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;维护和开发后台页面。使用传统的 Rails 架构，需要对前后端通吃。&lt;/li&gt;
&lt;li&gt;给客户端提供 JSON 接口，主要是基于  Rails 5, 打算在未来切到 Grape.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我们是谁"&gt;我们是谁&lt;/h2&gt;
&lt;p&gt;我们是时空电动汽车，是一家致力于发展推广绿色城市概念，拥有自主研发的电动汽车品牌及新能源全产业链布局的集团公司，目前已经实现盈利。旗下包括：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;集团本部&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;整车子公司&lt;/code&gt;:   拥有一支国内电动汽车设计、改装领域顶尖的技术团队。浙江国家电网的所有换电车型的改装全部由该团队负责，并且负责过其他国内大型车厂的电动汽车的改装设计，如：东风日产，海南马自达等。&lt;/li&gt;
&lt;li&gt; &lt;code&gt;电池子公司&lt;/code&gt;: 专注于动力电池成组技术研发、制造和销售的高科技企业。主要研发及销售大容量、高功率锂离子动力电池、储能电池、通用电池及个性化方案定制产品。&lt;/li&gt;
&lt;li&gt; &lt;code&gt;基础设施子公司&lt;/code&gt;: 针对新能源汽车提供配套转运、存储设施及相关产品开发、设计、制造、组装的综合型企业。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;运营子公司&lt;/code&gt;:  颠覆传统思维，在商务用车、物流用车、分时租赁等方向大胆尝试，运用互联网创新思维实现突破。将极大地解决市民的出行难、停车难，并缓解政府极为头痛的交通拥堵问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="联系方式"&gt;联系方式&lt;/h2&gt;
&lt;p&gt;邮件：zhangyunzheng # gmail.com&lt;/p&gt;

&lt;p&gt;微信：CodePoet&lt;/p&gt;

&lt;p&gt;地址：杭州下城区长天弄 46 号武林福地创业园&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Tue, 25 Apr 2017 14:58:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/32863</link>
      <guid>https://ruby-china.org/topics/32863</guid>
    </item>
    <item>
      <title>Vue / React on Rails without JSON API</title>
      <description>&lt;p&gt;RT.&lt;/p&gt;

&lt;p&gt;最近几年，前后端分离炒得很火。作为前端圈的吃瓜群众，我一直觉得这股潮流在技术上改进不大，甚至还拖慢了开发效率，更多地是技术政治，是 Conway’s Law 的一个体现。&lt;/p&gt;

&lt;p&gt;抛开个人喜好，层出不穷的前端&lt;strong&gt;框架&lt;/strong&gt;也带了好处：组件化终于在前端流行起来了。组件化的前端框架，在视图渲染这一层，真要比 jQuery/ Bootstrap 好用太多了。&lt;/p&gt;

&lt;p&gt;理想的情况下，我希望仍然保持 Rails 4 的经典 MVC 模式，最大限度地利用 Rails 带来的生产力; 同时也希望在 View 层使用前端的组件化框架。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最大可能地复用 Rails 生态圈的现有工具，Turbolink, Asset Pipeline, Capistrano etc.&lt;/li&gt;
&lt;li&gt;极少量 JSON API. 我不喜欢每个页面，都要在服务端写代码生成一遍 JSON, 然后在前端再写一遍解析 JSON 的代码，更不想在前端搞一个有着 association 的 Model; 多数页面在需求上，也不需要异步请求数据。&lt;/li&gt;
&lt;li&gt;前端不需要做太多 hack, 不想发明一个 Vue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;有同学在走类似的路么？&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Mon, 24 Oct 2016 00:50:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/31415</link>
      <guid>https://ruby-china.org/topics/31415</guid>
    </item>
    <item>
      <title>[搜车开源] 阿里云 ONS Ruby SDK </title>
      <description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;公司的微服务化越来越正规，需要用到消息队列的场景越来越多。之前尝试过自建消息队列，但是运维成本太高，还踩了几次坑，最终选择了阿里云的 ONS .&lt;/p&gt;

&lt;p&gt;关于 ONS, 有兴趣的可以看下官方的博文，技术上还是很靠谱的。&lt;a href="http://jm.taobao.org/2016/05/26/do-you-really-need-so-many-sync-call-in-your-distributed-application/" rel="nofollow" target="_blank"&gt;http://jm.taobao.org/2016/05/26/do-you-really-need-so-many-sync-call-in-your-distributed-application/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ONS 提供了多种接入方式，包括 TCP,  HTTP,  MQTT.&lt;/p&gt;
&lt;h3 id="TCP"&gt;TCP&lt;/h3&gt;
&lt;p&gt;这种接入方式功能最多，性能最好，但是协议繁复，接入成本很高。官方提供了 Java 和 C++ 的 SDK.&lt;/p&gt;

&lt;p&gt;技术层面上，Ruby 封装 C++ SDK , 开发量较小，开发难度也低，我们公司的 Node 团队已经吃了螃蟹。&lt;/p&gt;
&lt;h3 id="HTTP"&gt;HTTP&lt;/h3&gt;
&lt;p&gt;顾名思义，就是通过 HTTP 接口来做消息的管理，速度和稳定性没有保障。&lt;/p&gt;
&lt;h3 id="MQTT"&gt;MQTT&lt;/h3&gt;
&lt;p&gt;主要的应用场景是物联网中的嵌入式设备，受限与客户端性能，功能做了裁剪，同时有丢消息的风险。&lt;/p&gt;

&lt;p&gt;综上，我们选择了用 Ruby 用封装一层 C++ SDK, 解决方案是 &lt;a href="https://github.com/jasonroelofs/rice" rel="nofollow" target="_blank"&gt;https://github.com/jasonroelofs/rice&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="项目介绍"&gt;项目介绍&lt;/h2&gt;
&lt;p&gt;项目地址在 &lt;a href="https://github.com/souche/aliyun-ons-ruby-sdk" rel="nofollow" target="_blank"&gt;https://github.com/souche/aliyun-ons-ruby-sdk&lt;/a&gt;, 欢迎来 FXXK. 主程是我们的 &lt;a href="/0x005a" class="user-mention" title="@0x005a"&gt;&lt;i&gt;@&lt;/i&gt;0x005a&lt;/a&gt;  同学，大家快去围观大神。&lt;/p&gt;
&lt;h3 id="项目依赖"&gt;项目依赖&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Linux/Unix 系统&lt;/li&gt;
&lt;li&gt;Ruby 2.1.5 或以上版本&lt;/li&gt;
&lt;li&gt;Boost C++ 程序库&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="安装步骤"&gt;安装步骤&lt;/h3&gt;&lt;h4 id="安装 Ruby 程序"&gt;安装 Ruby 程序&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rvm &lt;span class="nb"&gt;install &lt;/span&gt;2.1.5
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="安装 Boost C++ 程序库"&gt;安装 Boost C++ 程序库&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;libboost-all-dev
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="安装 ons"&gt;安装 ons&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;ons
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="使用方式"&gt;使用方式&lt;/h3&gt;&lt;h4 id="环境准备"&gt;环境准备&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;安装 ons rubygems。&lt;/li&gt;
&lt;li&gt;代码里涉及到的 TOPIC、PRODUCER_ID、CONSUMER_ID，需要在 MQ 控制台上创建。Message Tag 可以完全由应用自定义，具体创建过程可参考 &lt;a href="https://help.aliyun.com/document_detail/29536.html" rel="nofollow" target="_blank" title=""&gt;申请 MQ 资源&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;使用 MQ 服务的应用程序需要部署在阿里云 ECS 上。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;部分资料来自 &lt;a href="https://help.aliyun.com/document_detail/29555.html" rel="nofollow" target="_blank" title=""&gt;消息队列 &amp;gt; TCP 接入 (专业) &amp;gt; C/C++ SDK 环境准备&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="生产者"&gt;生产者&lt;/h4&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;producer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Ons&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 资源准备&lt;/span&gt;
&lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;

&lt;span class="c1"&gt;# 在 topic  下发送消息&lt;/span&gt;
&lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'tag'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Hello, World!'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 必须在程序退出前调用 shutdown 方法释放相关资源，否则可能出现栈错误&lt;/span&gt;
&lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shutdown&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更多用法，请参考 {file:samples/producer.rb} 及 API 文档&lt;/p&gt;
&lt;h4 id="消费者"&gt;消费者&lt;/h4&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Ons&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 订阅 topic  下的所有消息&lt;/span&gt;
&lt;span class="c1"&gt;# 注意，当消息达到时，会调用下述函数，此函数会被调度到单独线程中执行&lt;/span&gt;
&lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 资源准备&lt;/span&gt;
&lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;

&lt;span class="c1"&gt;# 等待消息到达&lt;/span&gt;
&lt;span class="nb"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;

&lt;span class="c1"&gt;# 必须在程序退出前调用 shutdown 方法释放相关资源，否则可能出现栈错误&lt;/span&gt;
&lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shutdown&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="Roadmap"&gt;Roadmap&lt;/h2&gt;
&lt;p&gt;希望大家多多参与，能得到官方支持那是最好了。&lt;/p&gt;

&lt;p&gt;后续希望做这几件事：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[] 开发 &lt;code&gt;ons_on_rails&lt;/code&gt;, 在目前的 &lt;code&gt;ons&lt;/code&gt; 之上封装一次，方便 Rails App 使用。&lt;/li&gt;
&lt;li&gt;[] 支持更多的消息发送方式，目前仅支持单向发送。&lt;/li&gt;
&lt;li&gt;[] 开发基于 Engine 的 Admin 页面，管理消息和服务状态&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="多余的话"&gt;多余的话&lt;/h2&gt;
&lt;p&gt;这篇是搜车开源的第一篇，后续还会介绍些其他准备开源的项目，大家期待吧。&lt;/p&gt;

&lt;p&gt;最后，照例放一个硬广。D 轮公司招靠谱 Ruby, 这世界很需要你呢，少年！&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ruby-china.org/topics/30765" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/30765&lt;/a&gt;&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Mon, 15 Aug 2016 15:16:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/30821</link>
      <guid>https://ruby-china.org/topics/30821</guid>
    </item>
    <item>
      <title>[杭州][D 轮] 大搜车招聘 Ruby 工程师 1 名</title>
      <description>&lt;p&gt;业务有所扩展，所以继续招聘啦~   通过论坛，陆续招到三名同学，都很靠谱，期待更多简历。&lt;/p&gt;
&lt;h2 id="职位要求"&gt;职位要求&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt; 1 年以上 Rails 开发经验，有相关工作经验者优先&lt;/li&gt;
&lt;li&gt; 熟悉数据库，以 MySQL 为主，部分业务采用 PG；&lt;/li&gt;
&lt;li&gt; 对技术有热情&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="加分项"&gt;加分项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;熟练掌握自动化测试&lt;/li&gt;
&lt;li&gt;有开发高并发，高可用系统的经验&lt;/li&gt;
&lt;li&gt; Github 独立维护项目者&lt;/li&gt;
&lt;li&gt;活跃的博客&lt;/li&gt;
&lt;li&gt;关注新技术的动向，例如 react.js&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="待遇&amp;amp;环境"&gt;待遇&amp;amp;环境&lt;/h2&gt;
&lt;p&gt;以下内容仅供参考，应该差别不大。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;12 - 20 K&lt;/li&gt;
&lt;li&gt;期权：D 轮巨额融资已经到位，并且发过一轮期权了。期权不是画大饼，也不是镜花水月。&lt;/li&gt;
&lt;li&gt;工作电脑 MacBook Pro 新款，戴尔 24' 显示器 ( U2412M ) + 人体工程座椅&lt;/li&gt;
&lt;li&gt;上下班不打卡，可适当弹性，一般九点半左右到公司。&lt;/li&gt;
&lt;li&gt;健身房，游戏房，室内运动场等&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="工作内容以及这边情况"&gt;工作内容以及这边情况&lt;/h2&gt;
&lt;p&gt;Ruby 团队的大部门属于创新研发部，主要负责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;业务：车牛拍卖，地推绩效，B2B 业务等&lt;/li&gt;
&lt;li&gt;微服务：主要是订单系统，包括支付，结算和优惠券&lt;/li&gt;
&lt;li&gt;内部系统：API 健康监测工具，测试用例 &amp;amp;&amp;amp; 测试任务，接口的全链路自动化测试。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;目前需要两个方向的同学。&lt;/p&gt;
&lt;h3 id="运维工具开发"&gt;运维工具开发&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;负责公司运维工具，测试工具的开发&lt;/li&gt;
&lt;li&gt;与架构团队一起，推动团队的工程化与自动化&lt;/li&gt;
&lt;li&gt;工作内容 80% 以上可开源&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="业务开发"&gt;业务开发&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;维护和开发后台页面。使用传统的 Rails 架构，特别之处在于 View 层使用用 Ant Design( &lt;a href="http://ant.design" rel="nofollow" target="_blank"&gt;http://ant.design&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;给客户端提供 JSON 接口，主要是基于 Grape, 部分在试用 Rails 5.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我们是谁"&gt;我们是谁&lt;/h2&gt;
&lt;p&gt;我们是大搜车，坐落杭州城西。旗下包括&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;大风车&lt;/code&gt;:为 4S 店集团提供官网，ERP.金融，销售 APP, 评估师 APP 等整套解决方案。&lt;/li&gt;
&lt;li&gt; &lt;code&gt;车牛&lt;/code&gt;: 针对个人车商以及 4S 店提供批发，拍卖，金融等服务。&lt;/li&gt;
&lt;li&gt; &lt;code&gt;金融&lt;/code&gt;: 为车商，消费者提供质保，消费贷，金融贷等支持&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;大搜车&lt;/code&gt;: 官网，面向 C 端用户，以及内部公共服务 (车型库，数据平台等)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="联系方式"&gt;联系方式&lt;/h2&gt;
&lt;p&gt;邮件：zhangyunzheng # souche.com
微信：CodePoet
地址：杭州余杭区五常大道 175 号&lt;/p&gt;

&lt;p&gt;最后放几张我厂的图。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/30c462c4d8651c10771d4c92e4259a2f.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/5902ed4e84c86fd1acb979e9fd154b0e.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/87bb6c0f2081aca00f02c06469378c3d.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/b4b16e1e11ccbfad65c6aac6c25739f5.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;茶水间&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/63d13808c7e5d55a3c3fcc6340a7c21f.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;活动室 &amp;amp;&amp;amp; 瑜伽室 每周一次，各种妹子 ( 和汉子，(⊙﹏⊙) )&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/57896eb5196bc3f3ef8793c4e41ea4ec.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/693042fa9f884b87f23308b6bb2ded82.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/d8f95ddfc87341a6a269ff1e562b2c31.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Mon, 08 Aug 2016 14:15:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/30765</link>
      <guid>https://ruby-china.org/topics/30765</guid>
    </item>
    <item>
      <title>[杭州] 大搜车 Ruby 工程师多名</title>
      <description>&lt;p&gt;参考：&lt;a href="https://ruby-china.org/topics/30765" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/30765&lt;/a&gt;&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Wed, 08 Jun 2016 16:20:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/30237</link>
      <guid>https://ruby-china.org/topics/30237</guid>
    </item>
    <item>
      <title>[杭州] 大搜车 Ruby 工程师多名</title>
      <description>&lt;h2 id="职位要求"&gt;职位要求&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt; 1 年以上 Rails 开发经验，有相关工作经验者优先&lt;/li&gt;
&lt;li&gt; 熟悉数据库，以 MySQL 为主，部分业务采用 PG；&lt;/li&gt;
&lt;li&gt; 对技术有热情&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="加分项"&gt;加分项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;熟练掌握自动化测试&lt;/li&gt;
&lt;li&gt;有开发高并发，高可用系统的经验&lt;/li&gt;
&lt;li&gt; Github 独立维护项目者&lt;/li&gt;
&lt;li&gt;活跃的博客&lt;/li&gt;
&lt;li&gt;关注新技术的动向，例如 react.js&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="待遇&amp;amp;环境"&gt;待遇&amp;amp;环境&lt;/h2&gt;
&lt;p&gt;以下内容仅供参考，应该差别不大。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;12 - 20 K&lt;/li&gt;
&lt;li&gt;期权：公司已经到 C 轮，并且发过一轮期权了。期权不是画大饼，也不是镜花水月。&lt;/li&gt;
&lt;li&gt;工作电脑 MacBook Pro 新款，戴尔 24' 显示器 ( U2412M ) + 人体工程座椅&lt;/li&gt;
&lt;li&gt;上下班不打卡，可适当弹性，一般九点半左右到公司。&lt;/li&gt;
&lt;li&gt;健身房，游戏房，室内运动场等&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="工作内容以及这边情况"&gt;工作内容以及这边情况&lt;/h2&gt;
&lt;p&gt;Ruby 团队的大部门属于创新研发部，主要负责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;业务：车牛拍卖&lt;/li&gt;
&lt;li&gt;微服务：主要是订单系统，包括支付，结算和优惠券&lt;/li&gt;
&lt;li&gt;内部系统：API 健康监测工具，测试用例 &amp;amp;&amp;amp; 测试任务，接口的全链路自动化测试。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;目前需要两个方向的同学。&lt;/p&gt;
&lt;h3 id="运维工具开发"&gt;运维工具开发&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;负责公司运维工具，测试工具的开发&lt;/li&gt;
&lt;li&gt;与架构团队一起，推动团队的工程化与自动化&lt;/li&gt;
&lt;li&gt;工作内容 80% 以上可开源&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="业务开发"&gt;业务开发&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;维护和开发后台页面。使用传统的 Rails 架构，特别之处在于 View 层使用用 Ant Design( &lt;a href="http://ant.design" rel="nofollow" target="_blank"&gt;http://ant.design&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;给客户端提供 JSON 接口，主要是基于 Grape, 部分在试用 Rails 5.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我们是谁"&gt;我们是谁&lt;/h2&gt;
&lt;p&gt;我们是大搜车，坐落杭州城西。旗下包括&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;大风车&lt;/code&gt;:为 4S 店集团提供官网，ERP.金融，销售 APP, 评估师 APP 等整套解决方案。&lt;/li&gt;
&lt;li&gt; &lt;code&gt;车牛&lt;/code&gt;: 针对个人车商以及 4S 店提供批发，拍卖，金融等服务。&lt;/li&gt;
&lt;li&gt; &lt;code&gt;金融&lt;/code&gt;: 为车商，消费者提供质保，消费贷，金融贷等支持&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;大搜车&lt;/code&gt;: 官网，面向 C 端用户，以及内部公共服务 (车型库，数据平台等)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="联系方式"&gt;联系方式&lt;/h2&gt;
&lt;p&gt;邮件：zhangyunzheng # souche.com
微信：CodePoet
地址：杭州余杭区五常大道 175 号&lt;/p&gt;

&lt;p&gt;最后放几张我厂的图。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/30c462c4d8651c10771d4c92e4259a2f.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/5902ed4e84c86fd1acb979e9fd154b0e.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/87bb6c0f2081aca00f02c06469378c3d.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/b4b16e1e11ccbfad65c6aac6c25739f5.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;茶水间&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/63d13808c7e5d55a3c3fcc6340a7c21f.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;活动室 &amp;amp;&amp;amp; 瑜伽室 每周一次，各种妹子 ( 和汉子，(⊙﹏⊙) )&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/57896eb5196bc3f3ef8793c4e41ea4ec.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/693042fa9f884b87f23308b6bb2ded82.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/d8f95ddfc87341a6a269ff1e562b2c31.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Thu, 05 May 2016 18:13:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/29922</link>
      <guid>https://ruby-china.org/topics/29922</guid>
    </item>
    <item>
      <title>模仿 �ES6 的简洁属性表示法</title>
      <description>&lt;p&gt;es6 中有个很实用的语法糖：允许直接写入变量和函数，作为对象的属性和方法。&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;foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bar&lt;/span&gt;&lt;span class="dl"&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;baz&lt;/span&gt; &lt;span class="o"&gt;=&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;baz&lt;/span&gt; &lt;span class="c1"&gt;// {foo: "bar"}&lt;/span&gt;

&lt;span class="c1"&gt;// 等同于&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;baz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;foo&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;尝试用 Ruby 模拟了一下，语法不太漂亮，大家给点意见。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TwinHash&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt;

    &lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tap&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&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;ele&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ele&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;local_variable_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ele&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tap&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;each&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;ele&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ele&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;local_variable_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ele&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;



&lt;span class="n"&gt;a_long_key_i_do_not_want_to_type_twice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt;
&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'another one'&lt;/span&gt;


&lt;span class="c1"&gt;# 正常写法 &lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;a_long_key_i_do_not_want_to_type_twice: &lt;/span&gt;&lt;span class="n"&gt;a_long_key_i_do_not_want_to_type_twice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;key: &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 模拟 es6&lt;/span&gt;
&lt;span class="no"&gt;TwinHash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:a_long_key_i_do_not_want_to_type_twice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 更少单词&lt;/span&gt;
&lt;span class="sx"&gt;%i(a_long_key_i_do_not_want_to_type_twice key)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c1"&gt;# 输出结果&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:a_long_key_i_do_not_want_to_type_twice&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:key&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"another one"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>42thcoder</author>
      <pubDate>Wed, 23 Mar 2016 10:03:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/29419</link>
      <guid>https://ruby-china.org/topics/29419</guid>
    </item>
    <item>
      <title>游标分页的实现思路</title>
      <description>&lt;h2 id="问题"&gt;问题&lt;/h2&gt;
&lt;p&gt;通常来说，分页通过 &lt;code&gt;offset&lt;/code&gt; 和 &lt;code&gt;limit&lt;/code&gt; 来实现，借助第三方 gem 我们可以这样写：&lt;code&gt;collection.page(params[:page]).per_page(params[:per_page]).padding(params[:offset])&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;但是，当列表数据会频繁变动时 (eg, 论坛里热门话题的回复列表，正在进行的游戏列表 ), 传统分页就会出现前后两页数据重复的问题，基于游标的分页就上场啦。基于游标的分页，就是指明上一页最后一项的 &lt;code&gt;ID&lt;/code&gt;, 取该项之后的 &lt;code&gt;N&lt;/code&gt; 项。&lt;/p&gt;
&lt;h2 id="思路"&gt;思路&lt;/h2&gt;&lt;h3 id="简单场景"&gt;简单场景&lt;/h3&gt;
&lt;p&gt;所谓简单场景，就是列表没有复杂的排序，按&lt;code&gt;ID&lt;/code&gt; 或者 &lt;code&gt;created_at&lt;/code&gt; 来排序。这个问题可以这样来解决：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;collection.where('id &amp;gt; ?', params[:last_id]).limit(params[:limit])&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="现实场景"&gt;现实场景&lt;/h3&gt;
&lt;p&gt;真实项目中，大多数列表的排序都很复杂，例如正在进行的游戏列表，很可能要根据权重，开始时间和热门程度进行组合排序，这种情况下的解决方案就没那么美了。&lt;/p&gt;
&lt;h4 id="虚拟列"&gt;虚拟列&lt;/h4&gt;
&lt;p&gt;第一种思路是利用&lt;code&gt;MySQL&lt;/code&gt;的自增虚拟列，伪代码是这样的：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;distinct&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;games&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;games&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt;   &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&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="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;games&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;games&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;games&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popular&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ordered_columns&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;ordered_columns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;ordered_columns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; 
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;distinct&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;games&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;games&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt;   &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&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="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;games&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;games&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;games&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;games&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popular&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ordered_columns&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码中的 &lt;code&gt;@user2&lt;/code&gt; &lt;code&gt;@user5&lt;/code&gt; 都是 &lt;code&gt;@i&lt;/code&gt;, 搞不懂这是啥情况，呼唤 &lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这样的代码很明显太丑了，也很难跟&lt;code&gt;ArctiveRecord&lt;/code&gt; 配合使用，或许可以用 &lt;code&gt;Arel&lt;/code&gt; ? &lt;img title=":smile:" alt="😄" src="https://twemoji.ruby-china.com/2/svg/1f604.svg" class="twemoji"&gt;&lt;/p&gt;
&lt;h4 id="数组"&gt;数组&lt;/h4&gt;
&lt;p&gt;第二种思路适用于数据量较少的情景。我直接贴 (简化) 代码了：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;ids&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ids&lt;/span&gt;
&lt;span class="n"&gt;start_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:last_id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_ordered&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:limit&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;MySQL&lt;/code&gt; 有个小坑，&lt;code&gt;select * from games where id in (7, 1, 10)&lt;/code&gt; 查到的数据排序，跟你想的不太一样，你可以试一下。这里&lt;code&gt;monkey patch&lt;/code&gt; 了下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Extensions::ActiveRecord::FindByOrderedIds&lt;/span&gt;
  &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;ActiveSupport&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Concern&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;ClassMethods&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_ordered&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;sanitized_id_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ids&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="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)}.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;id: &lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"FIELD(id, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;sanitized_id_string&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="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Extensions&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;FindByOrderedIds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暂时只想到这两种思路，论坛里的各位大神，大家是如何解决类似问题的？&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Thu, 24 Sep 2015 09:47:47 +0800</pubDate>
      <link>https://ruby-china.org/topics/27458</link>
      <guid>https://ruby-china.org/topics/27458</guid>
    </item>
    <item>
      <title>介绍几本 Rails 进阶书</title>
      <description>&lt;h2 id="术"&gt;术&lt;/h2&gt;&lt;h2 id="Rails AntiPatterns: Best Practice Ruby on Rails Refactoring"&gt;Rails AntiPatterns: Best Practice Ruby on Rails Refactoring&lt;/h2&gt;
&lt;p&gt;必读，作者是 Thoughtbot 的 CEO。书里阐述了 Rails 开发中常见的反模式，并给出了解决方案。语言平实易读，示例详尽，唯一的缺点是版本太旧，部分语法已经有变动，但是思想还是一致的。&lt;/p&gt;
&lt;h2 id="Ruby Science"&gt;Ruby Science&lt;/h2&gt;
&lt;p&gt;Rails 版的重构，教你识别 Rails 项目中的坏味道，针对每种坏味道给出了切实可行的解法。Rails 版本 3.2&lt;/p&gt;
&lt;h2 id="Growing Rails Applications in Practice"&gt;Growing Rails Applications in Practice&lt;/h2&gt;
&lt;p&gt;14 年出版的的迷你书，只有几十页。风评不错，还没读。&lt;/p&gt;
&lt;h2 id="Rails 4 Application Development: Hotshot"&gt;Rails 4 Application Development: Hotshot&lt;/h2&gt;
&lt;p&gt;版本是 4.1.0&lt;/p&gt;
&lt;h3 id="内容"&gt;内容&lt;/h3&gt;
&lt;p&gt;一章一个项目，从简单的菜谱分享到复杂的电商平台。&lt;/p&gt;
&lt;h3 id="Who this book is for"&gt;Who this book is for&lt;/h3&gt;
&lt;p&gt;￼￼￼￼￼￼￼￼This book is aimed at developers who are already familiar with the basics of the Rails framework and have worked with Rails 3.2 or earlier versions. As the book follows a practical approach and uses terminology specific to Rails and web programming, it is assumed you have some prior experience with the development of applications. This book will help you upgrade your knowledge and improve its applicability.&lt;/p&gt;
&lt;h2 id="Crafting Rails 4 Applications"&gt;Crafting Rails 4 Applications&lt;/h2&gt;
&lt;p&gt;版本是 4.0.0&lt;/p&gt;
&lt;h3 id="内容"&gt;内容&lt;/h3&gt;
&lt;p&gt;This book guides you through these plug-in APIs with practical examples. In each chapter, we’ll use test-driven development to build a Rails plug-in or application that covers those APIs and how they fit in the Rails architecture. By the time you finish this book, you will understand Rails better and increase your productivity while writing more modular and faster Rails applications.&lt;/p&gt;
&lt;h3 id="Who Should Read This Book?"&gt;Who Should Read This Book?&lt;/h3&gt;
&lt;p&gt;If you’re an intermediate or advanced Rails developer looking to dig deeper and make the Rails framework work for you, this is your book. We’ll go beyond the basics of Rails; instead of showing how Rails lets you use its built-in
￼￼report erratum • discuss
features to render HTML or XML from a controller, I’ll show you how the render() method works so you can modify it to accept custom options, such as :pdf.&lt;/p&gt;
&lt;h2 id="道"&gt;道&lt;/h2&gt;&lt;h2 id="重构"&gt;重构&lt;/h2&gt;
&lt;p&gt;重构（ruby 版）&lt;/p&gt;
&lt;h2 id="OOP &amp;amp;&amp;amp; OOD"&gt;OOP &amp;amp;&amp;amp; OOD&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;冒号课堂&lt;/li&gt;
&lt;li&gt;Practical Object-Oriented Design in Ruby: An Agile Primer&lt;/li&gt;
&lt;li&gt;Head First OOD&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="设计模式"&gt;设计模式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Head First Design Pattern&lt;/li&gt;
&lt;li&gt;四人帮&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;也欢迎各路大牛推荐下~&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Fri, 27 Mar 2015 14:36:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/24865</link>
      <guid>https://ruby-china.org/topics/24865</guid>
    </item>
    <item>
      <title>Making a difference in the future of Ruby!</title>
      <description>&lt;p&gt;分享个链接~&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rubytogether.org/" rel="nofollow" target="_blank"&gt;https://rubytogether.org/&lt;/a&gt;&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Wed, 25 Mar 2015 09:58:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/24824</link>
      <guid>https://ruby-china.org/topics/24824</guid>
    </item>
    <item>
      <title>Redis MySQL 混用的最佳实践</title>
      <description>&lt;p&gt;以咱们论坛为例，聊一个常见的场景：使用 &lt;code&gt;Redis&lt;/code&gt;, 记录帖子的点击数和喜欢数; 其他信息 (例如创建时间) 存在 &lt;code&gt;MySQL&lt;/code&gt;中&lt;/p&gt;

&lt;p&gt;现在问题来了，苦逼的程序员拿到了这样的需求：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;根据节点过滤帖子&lt;/li&gt;
&lt;li&gt;选取喜欢数大于 20 的帖子&lt;/li&gt;
&lt;li&gt;分页&lt;/li&gt;
&lt;li&gt;选取今天新增的帖子&lt;/li&gt;
&lt;li&gt;查询结果按点击数排序&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;实现类似的需求的最佳实践是什么呢？或者问题更广泛一些，&lt;code&gt;Redis&lt;/code&gt; &lt;code&gt;关系数据库&lt;/code&gt; 如何混用？&lt;/p&gt;

&lt;p&gt;Tks in advance~&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Mon, 05 Jan 2015 17:07:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/23556</link>
      <guid>https://ruby-china.org/topics/23556</guid>
    </item>
    <item>
      <title>龟速的测试, 求解救</title>
      <description>&lt;p&gt;打开终端，此时 spring 没有在跑.
跑了下测试，大概花了一分钟。ps: 31 个 example 都是些很简单的 demo 测试，完全搞不懂为啥耗时这么久。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/work/demo ‹ruby-2.1.2›  ‹develop&lt;span class="k"&gt;*&lt;/span&gt;› &lt;span class="nv"&gt;$ &lt;/span&gt;spring status
Spring is not running.

~/work/demo ‹ruby-2.1.2›  ‹develop&lt;span class="k"&gt;*&lt;/span&gt;› &lt;span class="nv"&gt;$ &lt;/span&gt;spring rspec

......具体测试省略

Finished &lt;span class="k"&gt;in &lt;/span&gt;41.14 seconds &lt;span class="o"&gt;(&lt;/span&gt;files took 13.86 seconds to load&lt;span class="o"&gt;)&lt;/span&gt;
31 examples, 6 failures, 4 pending

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时候再查看下 spring 的状态，发现已经跑起来了。按文档写得，下一次测试应该&lt;strong&gt;秒刷&lt;/strong&gt;, 可耗时居然更久了。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/work/demo ‹ruby-2.1.2›  ‹develop&lt;span class="k"&gt;*&lt;/span&gt;› &lt;span class="nv"&gt;$ &lt;/span&gt;spring status
Spring is running:

28325 spring server | demo | started 1 min ago
28326 spring app    | demo | started 1 min ago | &lt;span class="nb"&gt;test &lt;/span&gt;mode


~/work/demo ‹ruby-2.1.2›  ‹develop&lt;span class="k"&gt;*&lt;/span&gt;› &lt;span class="nv"&gt;$ &lt;/span&gt;spring rspec

......具体测试省略

Finished &lt;span class="k"&gt;in &lt;/span&gt;34.89 seconds &lt;span class="o"&gt;(&lt;/span&gt;files took 1 minute 47.34 seconds to load&lt;span class="o"&gt;)&lt;/span&gt;
31 examples, 6 failures, 4 pending

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;求大神解救~&lt;/p&gt;</description>
      <author>42thcoder</author>
      <pubDate>Thu, 27 Nov 2014 11:29:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/22891</link>
      <guid>https://ruby-china.org/topics/22891</guid>
    </item>
    <item>
      <title>求 grape-entity 使用经验分享</title>
      <description>&lt;p&gt;目前做得项目重度使用了 grape-entity, 一边看 wiki, 一边翻源码，写得倒也顺利。但是始终有几个问题解决不好，还请论坛里的高手，分享下自己的经验，谢谢~&lt;/p&gt;

&lt;p&gt;主要的问题：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;多个 entity 放在同一个文件里，会出现 NameError&lt;/li&gt;
&lt;li&gt;代码中出现 bug, 服务器 ( thin ) 假死，只能 kill + 重启。&lt;/li&gt;
&lt;li&gt;不同版本的 API 如何共享 entity&lt;/li&gt;
&lt;li&gt;使用 Grape::Entity::DSL 直接在 model 中定义 entity. 这样做，好不好&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>42thcoder</author>
      <pubDate>Mon, 03 Nov 2014 13:36:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/22426</link>
      <guid>https://ruby-china.org/topics/22426</guid>
    </item>
  </channel>
</rss>
