<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ailen (任凯)</title>
    <link>https://ruby-china.org/ailen</link>
    <description>no excusion always solution</description>
    <language>en-us</language>
    <item>
      <title>当前页码数字没有展示</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/ailen/67bee1ff-f998-4ef8-82f6-2b7d356ff3e7.png!large" title="" alt=""&gt;
感觉论坛活跃度越来越低了，还偶然发现了一个 bug &lt;img title=":dizzy_face:" alt="😵" src="https://twemoji.ruby-china.com/2/svg/1f635.svg" class="twemoji"&gt;
&lt;a href="/Rei" class="user-mention" title="@Rei"&gt;&lt;i&gt;@&lt;/i&gt;Rei&lt;/a&gt; &lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Tue, 16 Jul 2024 17:16:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/43811</link>
      <guid>https://ruby-china.org/topics/43811</guid>
    </item>
    <item>
      <title>求助 Rails 运行一段时间很卡的问题</title>
      <description>&lt;p&gt;最近部署一个项目到 EC2 遇到了一个很奇怪的问题：&lt;br&gt;
采用 Rails+Nginx+Puma，EC2 服务器配置为 8CPU 和 16G 内存，当同时部署了三个项目时候运行一段时间就会很卡，通过 newrelic 的监控看到 ruby 的占用时间相当长，cpu 和内存几乎没有占用，图片如下：
&lt;img src="https://l.ruby-china.com/photo/2019/49bd8fab-410e-47ba-aeff-bf5eb2fad00f.png!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2019/bbc09446-a699-4386-a2c9-3146dc982f04.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;三个服务器的 puma 的配置都为：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;threads&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;
&lt;span class="n"&gt;workers&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;帮忙看一下问题出在哪里，是否是 puma 引起的资源锁的问题？&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Tue, 11 Jun 2019 11:41:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/38624</link>
      <guid>https://ruby-china.org/topics/38624</guid>
    </item>
    <item>
      <title>求助二维数组去重</title>
      <description>&lt;p&gt;输入数组：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要求写一个算法，找出 a 数组中长度最长的非子集数组，因为&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分别是&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的子集，所以经过去重后应该得到输出&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目前用遍历方法实现了一个算法，请教大家有没有更高效的算法。&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Sun, 28 Oct 2018 23:01:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/37691</link>
      <guid>https://ruby-china.org/topics/37691</guid>
    </item>
    <item>
      <title>[成都] 初级服务器端开发, 招收实习生</title>
      <description>&lt;p&gt;&lt;strong&gt;岗位职责&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;开发产品产品功能模块，如聊天，工会，排行榜等。&lt;/li&gt;
&lt;li&gt;开发产品后台统计和运维系统。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;必须条件&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用 Python / Ruby / PHP 中的一种开发过 Web 应用，了解 Web 开发框架。&lt;/li&gt;
&lt;li&gt;良好的学习能力和意愿，意愿学习使用 Ruby On Rails.&lt;/li&gt;
&lt;li&gt;良好的英文阅读能力 (至少四级水平).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;加分条件&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;熟悉 Git / Github. &lt;/li&gt;
&lt;li&gt;对算法，OO 设计，Refactoring, TDD, CI/CD有了解.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;团队介绍&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;成立于 2013 年夏，专注手机游戏开发和运营。&lt;/li&gt;
&lt;li&gt;产品"大福大喜 Slots", 在新马泰等 8 个国家和地区进入畅销 TOP100.&lt;/li&gt;
&lt;li&gt;倡导工匠精神，追求工艺领先。真的会日常通过 github PR 来做 code review; 真的会定期做先进技术学习和分享。&lt;/li&gt;
&lt;li&gt;技术团队和谐稳定，近三年无人离职。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;待遇福利&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;基本月薪 6k ~ 10K.&lt;/li&gt;
&lt;li&gt;MBP + 宜家 MARKUS 转椅&lt;/li&gt;
&lt;li&gt;每天供应水果和酸奶。&lt;/li&gt;
&lt;li&gt;真的是 8x5, 而不是 996. 真的是弹性上下班时间，而不是弹性加班。&lt;/li&gt;
&lt;li&gt;真的有确定的项目完成奖金，而不是不确定的项目分红。真的有期权计划，而不是没有前途的打工。&lt;/li&gt;
&lt;li&gt;新办公室有上百平米露台正对千亩大公园，每天享有清新空气和远方。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;应聘流程&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;提交简历到 tony@bigbang.games, 附带写过的代码段落。&lt;/li&gt;
&lt;li&gt;电话面试，会指定 Leetcode 题目 (OO 设计/算法), 要求规定时间内提交。&lt;/li&gt;
&lt;li&gt;到场面试，当场做项目相关的结对编程测试。&lt;/li&gt;
&lt;li&gt;聊想法，谈待遇，拿 Offer.&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>ailen</author>
      <pubDate>Wed, 22 Aug 2018 17:16:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/37363</link>
      <guid>https://ruby-china.org/topics/37363</guid>
    </item>
    <item>
      <title>[成都] 创业小团队招聘 Ruby On Rails 开发 + 区块链技术调研 (月薪 10K~30K)</title>
      <description>&lt;p&gt;&lt;strong&gt;岗位职责&lt;/strong&gt;&lt;/p&gt;

&lt;ul&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;strong&gt;必须条件&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;英文阅读能力和快速学习能力。&lt;/li&gt;
&lt;li&gt;编程能力，对算法，OO 设计，Refactoring, TDD, CI/CD的理解.&lt;/li&gt;
&lt;li&gt;熟悉 Git / Github. &lt;/li&gt;
&lt;li&gt;习惯 Code Review, 能评价别人的代码，能接受对自己代码的评价。&lt;/li&gt;
&lt;li&gt;一年以上 Ruby On Rails 实际项目经验。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;加分条件&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;熟悉区块链技术。&lt;/li&gt;
&lt;li&gt;熟悉云服务器/数据库的维护和调优。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;团队介绍&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;由 tap4fun 投资成立于 2013 年夏，专注手机游戏开发和运营。&lt;/li&gt;
&lt;li&gt;产品"大福大喜 Slots", 在新马泰等 8 个国家和地区进入畅销 TOP100.&lt;/li&gt;
&lt;li&gt;倡导工匠精神，追求工艺领先。真的会日常通过 github PR 来做 code review; 真的会定期做先进技术学习和分享。&lt;/li&gt;
&lt;li&gt;技术团队和谐稳定，近三年无人离职。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;待遇福利&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;基本月薪 10k ~ 30K.&lt;/li&gt;
&lt;li&gt;[MBP 15 + LG 34 曲面 | iMac 27 5K] + 宜家 MARKUS 转椅。&lt;/li&gt;
&lt;li&gt;每天供应水果和酸奶。&lt;/li&gt;
&lt;li&gt;真的是 8x5, 而不是 996. 真的是弹性上下班时间，而不是弹性加班。&lt;/li&gt;
&lt;li&gt;真的有确定的项目完成奖金，而不是不确定的项目分红。真的有期权计划，而不是没有前途的打工。&lt;/li&gt;
&lt;li&gt;新办公室有上百平米露台正对千亩大公园，每天享有清新空气和远方。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;应聘流程&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;提交简历到 tony@bigbang.games, 附带 github 地址，或自己写过的代码段落。&lt;/li&gt;
&lt;li&gt;电话面试，会指定 Leetcode 题目 (OO 设计/算法), 要求规定时间内提交。&lt;/li&gt;
&lt;li&gt;到场面试，当场做项目相关的结对编程测试。&lt;/li&gt;
&lt;li&gt;聊想法，谈待遇，拿 Offer.&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>ailen</author>
      <pubDate>Sat, 04 Aug 2018 08:52:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/37279</link>
      <guid>https://ruby-china.org/topics/37279</guid>
    </item>
    <item>
      <title>GreenVPN 因為上級部門要求關閉，你們怎麼看？</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/b125fc11-46f0-4d7e-bfd6-e741143b5804.jpeg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Fri, 23 Jun 2017 08:47:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/33289</link>
      <guid>https://ruby-china.org/topics/33289</guid>
    </item>
    <item>
      <title>[VPS] 求推荐</title>
      <description>&lt;p&gt;公司是做手游，目前面向的客户主要有欧美和东南亚客户，但是游戏是全球同服，为了更好地体验打算做两个负载均衡，一个放在 US，一个打算放 HK，目前遇到的问题是关于 HK 的主机的选取问题。&lt;/p&gt;

&lt;p&gt;国内主机一般是阿里云为首选，但是看了&lt;a href="http://www.v2ex.com/t/119670" rel="nofollow" target="_blank"&gt;http://www.v2ex.com/t/119670&lt;/a&gt;  这个帖子瞬间把购买阿里云念头打消了，大家有类似需求的或者有在用 HK 节点的可否推荐个靠谱的？&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Wed, 06 Apr 2016 10:01:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/29555</link>
      <guid>https://ruby-china.org/topics/29555</guid>
    </item>
    <item>
      <title>寻求好的解决方案</title>
      <description>&lt;p&gt;大家好，现在遇到了这样一个问题：
有两个 model: &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;User&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&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="n"&gt;has_many&lt;/span&gt;    &lt;span class="ss"&gt;:transfers&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;Transfer&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&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="n"&gt;belongs_to&lt;/span&gt;  &lt;span class="ss"&gt;:user&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后 Transfer 里面有一个字段叫做&lt;code&gt;coins&lt;/code&gt;是 integer 类型，现在需求是：按照 coins 从大到小排序并且 user_id 是唯一的的前 100 个 Transfer，有没有比较好的 query 方案？&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Mon, 07 Sep 2015 23:07:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/27228</link>
      <guid>https://ruby-china.org/topics/27228</guid>
    </item>
    <item>
      <title>Nginx 用作负载均衡配置问题</title>
      <description>&lt;p&gt;现有三台机器：
A：load balancer【只安装 nginx】
B: app server [rails + passenger]
C:  app server [rails + passenger]&lt;/p&gt;

&lt;p&gt;按照 nginx 官方的配置教程：&lt;a href="http://nginx.org/en/docs/http/load_balancing.html" rel="nofollow" target="_blank"&gt;http://nginx.org/en/docs/http/load_balancing.html&lt;/a&gt;, load-balancer 的配置文件如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;ip_of_a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;proxy_pass&lt;/span&gt;  &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;access_log&lt;/span&gt; &lt;span class="sr"&gt;/var/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;#include /etc/nginx/proxy_params;&lt;/span&gt;
    &lt;span class="n"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="no"&gt;Connection&lt;/span&gt; &lt;span class="s2"&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="n"&gt;upstream&lt;/span&gt; &lt;span class="n"&gt;backend&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;least_conn&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;ip_of_b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;ip_of_c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;keepalive&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在问题是一直没法正确代理到 b 和 c，大家如果有这方面的经验请帮忙！谢谢&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Tue, 28 Apr 2015 10:00:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/25348</link>
      <guid>https://ruby-china.org/topics/25348</guid>
    </item>
    <item>
      <title>How To Add swap on Ubuntu</title>
      <description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;最近公司几款游戏的 staging server 是用的是 DO 的$5的套餐，配置是 512M 的内存，装了很多软件，在用 cap 做部署的时候经常报出了内存不足的错误，选择使用 swap(交换分区) 的方法来一定程度上缓解这个问题。    &lt;/p&gt;
&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;swap(交换分区) 是当计算机物理内存不足时用来暂时存储数据的地方，占用的是硬盘空间，当内存不足时候会将内存中不活跃的页转移到 swap。swap 在一定程度上可以缓解内存不足
的情况，但是由于存在 IO 交互，效率存在问题。总的来说，当你的内存不足时候为了继续运行，使用 swap 是一个不错的方案。下面来介绍一下如何在 Ubuntu14.04 中来增加 swap(PS:我
在 DO 的 vps 默认是没有 swap 的)  &lt;/p&gt;
&lt;h2 id="1.查看操作系统的swap的信息"&gt;1.查看操作系统的 swap 的信息&lt;/h2&gt;
&lt;p&gt;我们可以通过输入以下命令查新系统的 swap 信息： &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;swapon &lt;span class="nt"&gt;-s&lt;/span&gt; 
Filename                Type        Size    Used    Priority    
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时候看到系统中没有交换空间，另外可以通过 free 查看当前系统的内存和交换空间的使用情况：  &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt;
             total       used       free     shared    buffers     cached
Mem:          3953        154       3799          0          8         83
-/+ buffers/cache:         62       3890
swap:            0          0          0
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="2.查看磁盘当前可用空间"&gt;2.查看磁盘当前可用空间&lt;/h2&gt;
&lt;p&gt;在创建 swap 之前首先要查看当前磁盘的可用空间，可以通过 df 命令来查看：  &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        30G  9.9G   19G  36% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            487M  4.0K  487M   1% /dev
tmpfs           100M  324K  100M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            498M     0  498M   0% /run/shm
none            100M     0  100M   0% /run/user
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到磁盘还有接近 20G 的空间，可以腾出 1G 来做 swap，默认情况下认为 swap 为 RAM 的 2 倍比较合适，不过这个看个人的需求，我的 RAM 为 1G，因此加上 2G swap 就够了，不过
还是创建了 4G 的空间。&lt;/p&gt;
&lt;h2 id="3.创建swap文件"&gt;3.创建 swap 文件&lt;/h2&gt;
&lt;p&gt;要创建 swap，首先在文件系统创建一个文件，我们在 root(/) 下创建一个叫&lt;code&gt;swapfile&lt;/code&gt;的文件，这个文件必须有足够的大小来做 swap，有两种方式可以来创建 swap 文件：  &lt;/p&gt;
&lt;h2 id="3.1传统的慢的方法："&gt;3.1 传统的慢的方法：&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo dd &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/swapfile &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1G &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; /swapfile

&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 root root 4.0G Jan 26 01:43 /swapfile
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="3.2快速方法："&gt;3.2 快速方法：&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;fallocate &lt;span class="nt"&gt;-l&lt;/span&gt; 4G /swapfile

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; /swapfile

&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 root root 4.0G Jan 26 01:50 /swapfile
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="4.格式化swap文件"&gt;4.格式化 swap 文件&lt;/h2&gt;
&lt;p&gt;当创建好了 swap 文件之后 OS 并不知道这个文件的用途，因此我们需要告诉操作系统创建好的文件用作 swap。在格式化之前我们必须保证交换空间仅能为 root 只读，因此需要输入：  &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 /swapfile

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; /swapfile

&lt;span class="nt"&gt;-rw-------&lt;/span&gt; 1 root root 4.0G Jan 26 01:43 /swapfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到/swapfile 文件为 root 只读。接下来通过 mkswap 来格式化 swap 文件：  &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mkswap /swapfile

Setting up swapspace version 1, size &lt;span class="o"&gt;=&lt;/span&gt; 4194300 KiB
no label, &lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;e2f1e9cf-c0a9-4ed4-b8ab-714b8a7d6944
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文件已经为操作系统识别的 swap，通过 swapon 来加载当前到操作系统：  &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;swapon /swapfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过以下命令可以验证是否创建成功：  &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;swapon &lt;span class="nt"&gt;-s&lt;/span&gt;

Filename                Type        Size    Used    Priority
/swapfile                               file        4194300 43220   &lt;span class="nt"&gt;-1&lt;/span&gt;

free &lt;span class="nt"&gt;-m&lt;/span&gt;

             total       used       free     shared    buffers     cached
Mem:           994        862        131          0         24        118
-/+ buffers/cache:        718        275
Swap:         4095         42       4053
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="5.持久化swap"&gt;5.持久化 swap&lt;/h2&gt;
&lt;p&gt;通过上面创建的交换空间当机器重启的系统不会自动挂载交换空间，我们需要更改 fstab 文件来自动挂载：  &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/fstab
在文件最后一行输入：
/swapfile   none    swap    sw    0   0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存文件即可。  &lt;/p&gt;
&lt;h2 id="6.调节swap设置"&gt;6.调节 swap 设置&lt;/h2&gt;
&lt;p&gt;注意：在设置交换空间的时候有一些参数影响到系统的性能，需要我们手动来调节。&lt;br&gt;
&lt;code&gt;swappiness&lt;/code&gt;参数代表着系统使用交换空间的频率，位于 0-100 之间，0 代表着内核尽可能减少向磁盘交换数据，除非 RAM 完全被耗光。100 代表这尽可能使用交换空间，给 RAM 腾空间
我们可以看到： &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/vm/swappiness
60
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 PC 机器，60 应该是不错的配置，但是对于 VPS 来说，最好是接近于 0，减少 swap 交互，除非 RAM 真正被耗光。因此通过增加下面几行来调整&lt;code&gt;swappiness&lt;/code&gt;到 10。  &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl vm.swappiness&lt;span class="o"&gt;=&lt;/span&gt;10
vm.swappiness &lt;span class="o"&gt;=&lt;/span&gt; 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个值在重启之后会自动恢复为默认，因此我们需要设置为开机自动设置：  &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/sysctl.conf
在末尾加上:
vm.swappiness&lt;span class="o"&gt;=&lt;/span&gt;10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存文件退出。&lt;br&gt;
另一个比较重要的配置是&lt;code&gt;vfs_cache_pressure&lt;/code&gt;,该文件表示内核回收用于 directory 和 inode cache 内存的倾向；缺省值 100 表示内核将根据 pagecache 和 swapcache，
把 directory 和 inode cache 保持在一个合理的百分比；降低该值低于 100，将导致内核倾向于保留 directory 和 inode cache；增加该值超过 100，将导致内核倾向于
回收 directory 和 inode cache。  &lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/vm/vfs_cache_pressure
100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;默认为 100 的值时候系统移除 inode 的频率过高，我们可以通过设置为 50 来调整频率：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl vm.vfs_cache_pressure&lt;span class="o"&gt;=&lt;/span&gt;50
vm.vfs_cache_pressure &lt;span class="o"&gt;=&lt;/span&gt; 50
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同上，重启过后会自动恢复为默认值，因此需要设置为开机自动设置：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/sysctl.conf
vm.vfs_cache_pressure &lt;span class="o"&gt;=&lt;/span&gt; 50
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存文件即可  &lt;/p&gt;
&lt;h2 id="7.总结"&gt;7.总结&lt;/h2&gt;
&lt;p&gt;swap 在我们遇到内存不足的时候是一个不错的选择，尤其像 DO 的$5套餐的机器，配置好 swap 可以灵活的帮助我们对机器的使用。&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Fri, 30 Jan 2015 22:38:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/24034</link>
      <guid>https://ruby-china.org/topics/24034</guid>
    </item>
    <item>
      <title>PostgreSQL 接近 6 亿条记录，加了索引，查询效率优化问题？</title>
      <description>&lt;p&gt;问题：目前项目中使用 pg9.3，在一个单独的 DB server 上面，有一个表用来统计用户行为，目前接近 6 亿条数据，虽然加了索引，但是查询速度还是非常慢，目前正在调研如何解决性能瓶颈问。&lt;/p&gt;

&lt;p&gt;参考解决方案：看了社区里面的帖子，能够想到的解决方案就是对数据做分表操作。&lt;/p&gt;

&lt;p&gt;请问大家有没有好的解决方案，给点建议？XD&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Thu, 22 Jan 2015 15:23:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/23884</link>
      <guid>https://ruby-china.org/topics/23884</guid>
    </item>
    <item>
      <title>[译] Five Ruby Methods You Should Be Using</title>
      <description>&lt;h2 id="1.Object#tap"&gt;1.Object#tap&lt;/h2&gt;
&lt;p&gt;是否有过当你调用某个对象的方法时候，返回值并不是你想要的？这时候你就需要重新获取对象，并对对象做操作。比如：你想要给存储一系列参数的 hash 加一个任意值，你通过 hash.[] 来更新 hash，因此你必须明确地返回才能得到更新后的结果，代码如下： &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_params&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="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:foo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'bar'&lt;/span&gt;
  &lt;span class="n"&gt;params&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码最后一行的 params 看上去似乎是多余的。&lt;/p&gt;

&lt;p&gt;因此可以通过&lt;a href="http://www.ruby-doc.org/core-2.1.5/Object.html#method-i-tap" rel="nofollow" target="_blank" title=""&gt;Object#tap&lt;/a&gt; 来简化代码。对象只要调用 tap 方法，传递一个你需要执行的代码块，对象调用代码块的后返回自己。改进的 update_params 代码如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_params&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="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:foo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'bar'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Object#tap在很多地方都很有用.有一个简单法则：对象的方法本身不必要返回自己，当你需要时候即可以用Object#tap来替换。  &lt;/p&gt;
&lt;h2 id="2.Array#bsearch"&gt;2.Array#bsearch&lt;/h2&gt;
&lt;p&gt;不知道你们在工作中是否会遇到遍历数组？Ruby 的枚举提供了很多寻找方法比如：select,reject 和 find，这些是我日常工作中经常使用的，但是当数据集很大的时候，我开始担心遍历这些数组需要耗费很多的时间。  &lt;/p&gt;

&lt;p&gt;如果你使用过 ActiveRecord 来做 SQL 查询，在 ActiveRecord 背后封装了很多魔法，因此你必须要把搜索复杂的降到最低。但是很多时候你必须要把所有数据先查询出来然后才能做进一步工作。比如：当数据库中的数据做了加密的时候，你不能直接通过 SQL 来做操作。  &lt;/p&gt;

&lt;p&gt;在这个时候，我通常思考如何使用算法复杂度最低 (大 O) 的算法来做数据筛选，如果你不知道大 O 可以参考 Justin Abrahms's 的&lt;a href="https://justin.abrah.ms/computer-science/big-o-notation-explained.html" rel="nofollow" target="_blank" title=""&gt;Big-O Notation Explained By A Self-Taught Programmer&lt;/a&gt;或者&lt;a href="http://bigocheatsheet.com/" rel="nofollow" target="_blank" title=""&gt;Big-O Complexity Cheat Sheet&lt;/a&gt;。  &lt;/p&gt;

&lt;p&gt;基本的原则就是算法的复杂度决定着算法的运行时间的长短，复杂度从小打到依次排序为：O(1), O(log n), O(n), O(n log(n)), O(n^2), O(2^n), O(n!)，因此我们倾向于使用复杂度低的算法。  &lt;/p&gt;

&lt;p&gt;在 Ruby 中，当对数组做查询的时候，第一反应是使用 Enumerable#find，也可以是 detect。但是这个方法会遍历整个数组，直到条件匹配。如果最终结果在前面那么还好，如果结果在数组最后面，那么最终搜索的复杂度为 O(n)。  &lt;/p&gt;

&lt;p&gt;在 Ruby 中有一个更快的方法&lt;a href="http://www.ruby-doc.org/core-2.1.5/Array.html#method-i-bsearch" rel="nofollow" target="_blank" title=""&gt;Array#bsearch&lt;/a&gt;, 搜索的复杂度为 O(log n)，如果想要查看 Binary Search 的工作原理，可以查看&lt;a href="http://fluxusfrequency.github.io/blog/2014/01/31/building-a-binary-search/" rel="nofollow" target="_blank" title=""&gt;Building A Binary Search&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;下面是从 50,000,000 数字中搜索特定值的运行时间对比：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'benchmark'&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;50_000_000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="no"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bm&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;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:find&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;data&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="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;40_000_000&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:bsearch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bsearch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;40_000_000&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

         &lt;span class="n"&gt;user&lt;/span&gt;       &lt;span class="nb"&gt;system&lt;/span&gt;     &lt;span class="n"&gt;total&lt;/span&gt;       &lt;span class="n"&gt;real&lt;/span&gt;
&lt;span class="n"&gt;find&lt;/span&gt;     &lt;span class="mf"&gt;3.020000&lt;/span&gt;   &lt;span class="mf"&gt;0.010000&lt;/span&gt;   &lt;span class="mf"&gt;3.030000&lt;/span&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.028417&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bsearch&lt;/span&gt;  &lt;span class="mf"&gt;0.000000&lt;/span&gt;   &lt;span class="mf"&gt;0.000000&lt;/span&gt;   &lt;span class="mf"&gt;0.000000&lt;/span&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.000006&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正如你看到的，bsearch 速度非常快。但是使用 bsearch 的大前提就是：数组必须是排序好的。这在很多时候限制了 bsearch 的用途，但是仍然在很多时候会用到，比如：当你在按照 created_at 排序好的数据库记录中按时间查询某个记录。&lt;/p&gt;
&lt;h2 id="3.Enumerable#flat_map"&gt;3.Enumerable#flat_map&lt;/h2&gt;
&lt;p&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;CommentFinder&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;find_for_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;user_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&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;post&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;comment&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;comment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;username&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;你最终有可能得到如下结果：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[[[&lt;/span&gt;&lt;span class="s1"&gt;'Ben'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Sam'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'David'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Keith'&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="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s1"&gt;'Chris'&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;但是真正的需求是我想得到的是作者，而不是 [] 或者 nil，因此你可以通过 flatten 来合并：&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;CommentFinder&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;find_for_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;user_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;posts&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="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;comments&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="n"&gt;comment&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;comment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;username&lt;/span&gt;
      &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;flatten&lt;/span&gt;
    &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;flatten&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="sb"&gt;```ruby

Ruby中还有一种更好的方法就是使用flat_map：

```&lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;CommentFinder&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;find_for_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;user_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flat_map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flat_map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;comment&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;comment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;username&lt;/span&gt;
      &lt;span class="p"&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;后面两种并没有太大区别，但是使用 flat_map 没必要多次调用 flatten。&lt;/p&gt;
&lt;h2 id="4.Array.new with a Block"&gt;4.Array.new with a Block&lt;/h2&gt;
&lt;p&gt;曾经在我集训的时候，我们导师 Jeff Casimir &lt;a href="http://turing.io/" rel="nofollow" target="_blank" title=""&gt;founder of (Turing School)&lt;/a&gt;让我们在一小时时间内去开发一个 Battleship，这是一次很好的面向对象的编程练习，我们需要 Rules, Players, Games, and Boards。创建 Board 的表现形式是一个很有趣的练习，在多次迭代之后，我发现了最简单的方式去构建一个 8x8 的格子：&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;Board&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;board&lt;/span&gt;
    &lt;span class="vi"&gt;@board&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="no"&gt;Array&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="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Array&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="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt; &lt;span class="p"&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么到底发生了什么呢？当你调用&lt;a href="http://www.ruby-doc.org/core-2.1.5/Array.html#method-c-new" rel="nofollow" target="_blank" title=""&gt;Array.new(n)&lt;/a&gt;,就会创建一个长度为 n 的数组：  &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Array&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="mi"&gt;8&lt;/span&gt;&lt;span class="p"&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="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&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 ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Array&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="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'O'&lt;/span&gt; &lt;span class="p"&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="s1"&gt;'O'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'O'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'O'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'O'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'O'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'O'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'O'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'O'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因此如果你在代码块中传第一个包含 8 个'0'的数组，那么你就会得到一个 8x8 的所有元素为'0'的数组。使用 Array.new 加上代码块，你可以构建出任何大小，任何嵌套的数组。&lt;/p&gt;
&lt;h2 id="5.&lt;=&gt;"&gt;5.&amp;lt;=&amp;gt;&lt;/h2&gt;
&lt;p&gt;这个如"宇宙飞船"的符号是我在 Ruby 中最喜欢的结构之一，它在广泛使用于 Ruby 的内置类中，同时在枚举中也广泛使用。&lt;/p&gt;

&lt;p&gt;下面通过整形数值调用&amp;lt;=&amp;gt;来看一下用法，当你运行 5&amp;lt;=&amp;gt;5 时候，返回值 0，当你运行 4&amp;lt;=&amp;gt;5 返回 -1，当你运行 5&amp;lt;=&amp;gt;4，返回 1.因此，如果两个数字一样，返回 0，前者小于后者，返回 -1，如果前者大于后者返回 1.  &lt;/p&gt;

&lt;p&gt;你可以使用&amp;lt;=&amp;gt;来重新定义自己的逻辑，使其只返回 0，1，-1. &lt;/p&gt;

&lt;p&gt;下面是&amp;lt;=&amp;gt;的一个非常 cool 的使用场景，来自 Exercism，有一个练习叫做 Clock，你必须使用自定义的 + 和 - 来调整时钟的小时分钟。当时间超过 60 分钟的时候就会变得非常复杂，因为超过 60 分钟是不合法的数据，因此你必须要加一个小时，同时减去 60 分钟。  &lt;/p&gt;

&lt;p&gt;一个叫 dalexj 的聪明小伙子的解决方案如下：  &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fix_minutes&lt;/span&gt;
    &lt;span class="k"&gt;until&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;member?&lt;/span&gt; &lt;span class="n"&gt;minutes&lt;/span&gt;
      &lt;span class="vi"&gt;@hours&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;minutes&lt;/span&gt;
      &lt;span class="vi"&gt;@minutes&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;minutes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="vi"&gt;@hours&lt;/span&gt; &lt;span class="o"&gt;%=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;=&amp;gt;符号非常适用于定义你自己对对象的排序，同时可以用于某些数学运算，因为它仅仅返回三个固定的数字。&lt;/p&gt;

&lt;p&gt;原文链接为：&lt;a href="https://blog.engineyard.com/2015/five-ruby-methods-you-should-be-using" rel="nofollow" target="_blank"&gt;https://blog.engineyard.com/2015/five-ruby-methods-you-should-be-using&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;处女翻译贴献给了 ruby-china，如果哪里有错误的请大家及时指正。&lt;img title=":smile:" alt="😄" src="https://twemoji.ruby-china.com/2/svg/1f604.svg" class="twemoji"&gt;&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Fri, 16 Jan 2015 23:33:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/23784</link>
      <guid>https://ruby-china.org/topics/23784</guid>
    </item>
    <item>
      <title>Effective Ruby:A New Book with 48 Specific Ruby Tactics</title>
      <description>&lt;p&gt;分享一本好书具体看连接：&lt;a href="http://www.effectiveruby.com/" rel="nofollow" target="_blank"&gt;http://www.effectiveruby.com/&lt;/a&gt;&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Thu, 23 Oct 2014 19:42:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/22225</link>
      <guid>https://ruby-china.org/topics/22225</guid>
    </item>
    <item>
      <title>即时通讯服务端有没有好的建议？</title>
      <description>&lt;p&gt;想做一个即时通讯软件，目前想已有的协议 XMPP、IMPP 等，大家有没有做过的？给个好的建议！谢谢！&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Wed, 22 Oct 2014 15:36:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/22193</link>
      <guid>https://ruby-china.org/topics/22193</guid>
    </item>
    <item>
      <title>升级 Mac OS X 10.10 Yosemite 之后 PostgreSQL 不能启动</title>
      <description>&lt;p&gt;升级了 Yosemite 之后发现 PostgreSQL 不能启动了，运行&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;postgres &lt;span class="nt"&gt;-D&lt;/span&gt; /usr/local/var/postgres得到下面这个
FATAL:  could not open directory &lt;span class="s2"&gt;"pg_tblspc"&lt;/span&gt;: No such file or directory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原来 Yosemite 删除了一些 PostgreSQL 的目录，可以手动创建：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; /usr/local/var/postgres/pg_tblspc
&lt;span class="nb"&gt;mkdir&lt;/span&gt; /usr/local/var/postgres/pg_twophase
&lt;span class="nb"&gt;mkdir&lt;/span&gt; /usr/local/var/postgres/pg_stat_tmp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ok , it works!&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Mon, 20 Oct 2014 10:28:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/22128</link>
      <guid>https://ruby-china.org/topics/22128</guid>
    </item>
    <item>
      <title>Rails 4.2 Introduction</title>
      <description>&lt;p&gt;A quick look at the new features of Rails 4.2 in the first beta that was recently released.&lt;a href="https://gorails.com/episodes/rails-4-2-introduction" rel="nofollow" target="_blank"&gt;https://gorails.com/episodes/rails-4-2-introduction&lt;/a&gt;&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Thu, 28 Aug 2014 09:02:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/21264</link>
      <guid>https://ruby-china.org/topics/21264</guid>
    </item>
    <item>
      <title>Awesome Ruby: A Curated Collection of Awesome Ruby Libraries, Tools,etc</title>
      <description>&lt;p&gt;分析一个不错的资源，迄今为止看到过最全面的资料，&lt;a href="https://github.com/markets/awesome-ruby" rel="nofollow" target="_blank"&gt;https://github.com/markets/awesome-ruby&lt;/a&gt;&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Fri, 11 Jul 2014 09:30:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/20432</link>
      <guid>https://ruby-china.org/topics/20432</guid>
    </item>
    <item>
      <title>HipChat is now free for unlimited users.</title>
      <description>&lt;p&gt;如题，用 skype 令人最不爽的就是无法贴图，but 如题.....&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Thu, 29 May 2014 09:56:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/19617</link>
      <guid>https://ruby-china.org/topics/19617</guid>
    </item>
    <item>
      <title>号外，XX 开房记录查询</title>
      <description>&lt;p&gt;&lt;a href="http://q.r90.us/" rel="nofollow" target="_blank"&gt;http://q.r90.us/&lt;/a&gt;  号外，大家去查查看开房记录里面是否有你&lt;img title=":smile:" alt="😄" src="https://twemoji.ruby-china.com/2/svg/1f604.svg" class="twemoji"&gt;&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Tue, 15 Oct 2013 23:19:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/14779</link>
      <guid>https://ruby-china.org/topics/14779</guid>
    </item>
    <item>
      <title>Nginx 中设置 Leverage browser caching 时候 assets 一直报 404？</title>
      <description>&lt;p&gt;&lt;a href="http://www.dashenbangbang.com/Leverage" rel="nofollow" target="_blank"&gt;http://www.dashenbangbang.com/Leverage&lt;/a&gt;，因为首页图片很多访问很卡，向下滑动感觉很慢。通过建议想设置 browser caching 参照&lt;a href="http://guides.rubyonrails.org/asset_pipeline.html#server-configuration" rel="nofollow" target="_blank"&gt;http://guides.rubyonrails.org/asset_pipeline.html#server-configuration&lt;/a&gt;
没法加载 assets 里面的文件，报 404 文件错误。大家遇到过没有呢&lt;/p&gt;</description>
      <author>ailen</author>
      <pubDate>Tue, 17 Sep 2013 21:09:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/14188</link>
      <guid>https://ruby-china.org/topics/14188</guid>
    </item>
  </channel>
</rss>
