<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>cuterxy (小Y)</title>
    <link>https://ruby-china.org/cuterxy</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Google Code 今日起将逐步关停服务</title>
      <description>&lt;p&gt;&lt;a href="https://ogx.io/topics/55025f46692d69573df10000" rel="nofollow" target="_blank"&gt;https://ogx.io/topics/55025f46692d69573df10000&lt;/a&gt;&lt;/p&gt;</description>
      <author>cuterxy</author>
      <pubDate>Fri, 13 Mar 2015 12:01:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/24629</link>
      <guid>https://ruby-china.org/topics/24629</guid>
    </item>
    <item>
      <title>慎用 mongoid_auto_increment_id 这个 Gem</title>
      <description>&lt;p&gt;刚开始用 MongoDB 做项目的时候，发觉思维还是维持在以前用 MySQL 的惯性，觉得每条记录需要一个自增长 id，于是找到了 &lt;a href="https://github.com/huacnlee/mongoid_auto_increment_id" rel="nofollow" target="_blank" title=""&gt;mongoid_auto_increment_id&lt;/a&gt; 这个 Gem。而这个 Gem 也同时被本站使用，感觉应该还是靠谱的，所以用之前就没有仔细的考虑。后来随着对 MongoDB 了解的加深和对现有项目的反思，发觉 MongoDB 原生的 ObjectId 方式才应该是常态的 id。有关 ObjectId 的研究可以看 &lt;a href="http://www.cnblogs.com/xjk15082/archive/2011/09/18/2180792.html" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;首先，自增 id 在分布式环境下是需要依赖一个中心节点来去生成的，而这个过程对于增长速度很快的对象来说，代价是很高的，而且还存在着单点故障的危险。如果项目的对象采用自增长 id，那么相当于埋了一个定时炸弹，日后如果数据量指数级上升，切换到分布式数据库之后，依赖一个中心节点的自增 id 将会不能再使用，否则整体性能就会上不去。&lt;/p&gt;

&lt;p&gt;其次，绝大部分的项目，其实真正用到对象需要自增长的 id 的情况是非常少的，如果需要用到，一般也并非一个非常关键的特性。比如说，记录某个用户是网站的第几个注册用户。这类特性，其实用一个单独的字段保存就可以了，哪怕失效了，也可以重新生成，不像是主键那样牵一发动全身。&lt;/p&gt;

&lt;p&gt;再次，一旦使用了 mongoid_auto_increment_id 这个 Gem，所有的 model 就缺省使用了自增长 id。而 MongoDB 在 3.0 版本之前所有写操作会有一个全局锁，也就是说，每生成一个自增长 id 都需要占用全局锁资源一次，会大大影响系统的吞吐量。MongoDB 在 3.0 版本之后将写操作的全局锁优化成了表级锁（针对不同的 Collection 加锁）， &lt;strong&gt;但是问题是 mongoid_auto_increment_id 在实现的时候将所有 Collection 的自增长 id 都记录在同一个 Collection 下了，这就导致每增加一条记录，还是存在着一个人为的全局锁。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;见 mongoid_auto_increment_id 的代码：&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;Identity&lt;/span&gt;
  &lt;span class="c1"&gt;# Generate auto increment id&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;generate_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;database_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Sessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:current_database&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;
    &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
    &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Sessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_primary&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;node&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;database_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"findAndModify"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"mongoid.auto_increment_ids"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# 此处将整个db的所有collection的自增id都依赖同一个collection生成，为了充分发挥 MongoDB 3.0 的性能（库级所改进为表级锁），我觉得应该把 collection_name 加上去，即应该把 "mongoid.auto_increment_ids" 改为 "mongoid.auto_increment_ids.#{ document.collection_name }"&lt;/span&gt;
              &lt;span class="ss"&gt;:query&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;:_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collection_name&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
              &lt;span class="ss"&gt;:update&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"$inc"&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;:c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
              &lt;span class="ss"&gt;:upsert&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="ss"&gt;:new&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&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;o&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;to_i&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;因此，除非你确认你的项目数据量不会很大，否则还是尽量不要使用自增长 id。另外，为了充分发挥 MongoDB 3.0 的性能，mongoid_auto_increment_id 需要升级一下实现的代码了，应该将不同的 Collection 的自增长 id 保存到不同的 Collection 里去（&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;最后，求把自增长 id 换成 MongoDB 原生 ObjectId 的方案。&lt;/p&gt;</description>
      <author>cuterxy</author>
      <pubDate>Tue, 10 Mar 2015 01:20:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/24555</link>
      <guid>https://ruby-china.org/topics/24555</guid>
    </item>
    <item>
      <title>如何解决测试代码重复的问题？</title>
      <description>&lt;p&gt;最近在写测试代码，发现很多都是重复的逻辑，但是又有一点点不同，比如是某个 user 或者某个测试的对象的不同。大家有什么好的办法能把测试代码写得 dry 一些吗？&lt;/p&gt;</description>
      <author>cuterxy</author>
      <pubDate>Wed, 04 Mar 2015 00:02:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/24443</link>
      <guid>https://ruby-china.org/topics/24443</guid>
    </item>
    <item>
      <title>OGX 社区 开发计划 2015-2</title>
      <description>&lt;p&gt;OGX 社区（&lt;a href="https://ogx.io" rel="nofollow" target="_blank"&gt;https://ogx.io&lt;/a&gt;）上线两个月了，陆陆续续添加和完善了不少功能，但基本上都是想到什么做什么。上线之后做了一个开发计划，但是感觉不太好管理，很多想法没有在计划文案上及时的体现出来。&lt;/p&gt;

&lt;p&gt;于是从现在开始，开发计划定为每月做一次。大家可以在主题下讨论，提出新想法或者修改意见都可以，计划也不会一成不变，会在执行的过程中不断修正和添加。计划文案的存在也方便有心贡献代码的朋友有的放矢。&lt;/p&gt;

&lt;p&gt;2015 年 2 月的开发计划：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;板块分类&lt;/li&gt;
&lt;li&gt;站内短信&lt;/li&gt;
&lt;li&gt;发帖界面改进，添加快速回复、emoji 表情选择等功能&lt;/li&gt;
&lt;li&gt;实时消息推送&lt;/li&gt;
&lt;li&gt;补上 RSpec 测试代码&lt;/li&gt;
&lt;li&gt;帮助等相关文档完善&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;目前暂时想到这么多。有新的想法随后会继续补充。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;欢迎大家在闲来无事之际前来本站参观指导、发文灌水或者贡献代码！&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;项目的 github 地址：&lt;a href="https://github.com/ogx-io/ogx-io-web" rel="nofollow" target="_blank"&gt;https://github.com/ogx-io/ogx-io-web&lt;/a&gt;
贡献代码指南：&lt;a href="https://ogx.io/t/z" rel="nofollow" target="_blank" title=""&gt;How to contribute your code&lt;/a&gt;&lt;/p&gt;</description>
      <author>cuterxy</author>
      <pubDate>Sat, 31 Jan 2015 22:02:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/24051</link>
      <guid>https://ruby-china.org/topics/24051</guid>
    </item>
    <item>
      <title>Amazon S3 的东京节点在国内的访问速度怎样？</title>
      <description>&lt;p&gt;有谁用过吗？&lt;/p&gt;</description>
      <author>cuterxy</author>
      <pubDate>Sun, 11 Jan 2015 15:14:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/23672</link>
      <guid>https://ruby-china.org/topics/23672</guid>
    </item>
    <item>
      <title>诚邀有心人士参与 OGX 社区的开发！</title>
      <description>&lt;h2 id="什么是OGX社区？"&gt;什么是 OGX 社区？&lt;/h2&gt;
&lt;p&gt;OGX 社区（&lt;a href="https://ogx.io" rel="nofollow" target="_blank" title=""&gt;https://ogx.io&lt;/a&gt;）是一个致力于给各种“极客”们提供互相交流和学习的场所的社区。OGX 就是“Open Geeks”的意思。网站的代码完全开放，一来可以给大家学习和借鉴，二来也欢迎大家贡献代码，给网站添砖加瓦或者优化现有的功能和实现。欢迎进一步阅读&lt;a href="https://ogx.io/t/b" rel="nofollow" target="_blank" title=""&gt;《写在最前面——OGX 社区诞生记》&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="网站目前采用的技术栈"&gt;网站目前采用的技术栈&lt;/h2&gt;
&lt;p&gt;前端：Jquery + Bootstrap + Coffeescript + SCSS&lt;br&gt;
后端：Ruby on Rails 4.2 + Mongoid&lt;br&gt;
数据库：Mongodb  &lt;/p&gt;

&lt;p&gt;github 上源码托管地址：&lt;a href="https://github.com/ogx-io/ogx-io-web" rel="nofollow" target="_blank"&gt;https://github.com/ogx-io/ogx-io-web&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;欢迎大家带来更多更新更好用的技术！&lt;/p&gt;
&lt;h2 id="当前状况"&gt;当前状况&lt;/h2&gt;
&lt;p&gt;网站已经实现了基本的功能，但还有很多基础的需求需要进一步的实现。网站暂时只有我一个人在维护。但我会持续开发和完善所有必要的功能和创新的功能。&lt;/p&gt;
&lt;h2 id="如何做贡献？"&gt;如何做贡献？&lt;/h2&gt;
&lt;p&gt;欢迎大家给 OGX 社区作出任何形式的贡献，提交代码、网站界面设计、产品设计、运营推广等等，各个方面都欢迎大家进来一起讨论和实现。详情请进入 &lt;a href="https://ogx.io/base" rel="nofollow" target="_blank" title=""&gt;OGX 社区大本营&lt;/a&gt; 版查看和讨论。&lt;/p&gt;
&lt;h2 id="贡献者将会获得什么？"&gt;贡献者将会获得什么？&lt;/h2&gt;
&lt;p&gt;目前网站的贡献者无法获得金钱上的报酬。不过，站长会将所有贡献者所作出的具体贡献记录下来，并在网站公布，以证明贡献者的功劳和能力。同时，站长认为，给网站做贡献，也是一个很好的锻炼和实践的机会，能够让你的“作品”得到大家的检验，从而获得宝贵的实践经验。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;最后，十分期待大家的到来！&lt;/strong&gt;&lt;/p&gt;</description>
      <author>cuterxy</author>
      <pubDate>Mon, 05 Jan 2015 22:35:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/23562</link>
      <guid>https://ruby-china.org/topics/23562</guid>
    </item>
  </channel>
</rss>
