<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>5swords (5swords)</title>
    <link>https://ruby-china.org/5swords</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>kifi: connecting people with knowledge</title>
      <description>&lt;p&gt;&lt;a href="www.kifi.com" title=""&gt;kifi&lt;/a&gt;
觉得 delicious 广告太多不满意，在 chrome 扩展里找到这个。&lt;/p&gt;

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

&lt;p&gt;亮点如上图所示，和客户可以在同一页开个聊天，可以对页面指来指去。look here 链接点击后是 animation 最后指向 你在页面上引用的锚点。锚点只要你选中文字，选中右边就是按钮可以创建。&lt;/p&gt;

&lt;p&gt;其他功能不少，超出传统 bookmark 的想法，有点团队知识库的味道了，有 app。&lt;/p&gt;</description>
      <author>5swords</author>
      <pubDate>Sat, 19 Mar 2016 00:44:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/29391</link>
      <guid>https://ruby-china.org/topics/29391</guid>
    </item>
    <item>
      <title>刚刚 ruby-china 的 dns 解析出错，现在好了</title>
      <description>&lt;p&gt;我有个域名在德国的还是不行。&lt;/p&gt;

&lt;p&gt;想问大家碰到这种突发情况，怎么破比较好。&lt;/p&gt;</description>
      <author>5swords</author>
      <pubDate>Thu, 11 Dec 2014 15:23:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/23140</link>
      <guid>https://ruby-china.org/topics/23140</guid>
    </item>
    <item>
      <title>Rails 4.1 在生产环境下使用 resque_mailer 出现 hostname 无法解析的问题</title>
      <description>&lt;p&gt;错误：
&lt;code&gt;
E, [2014-11-20T15:45:57.661886 #19135] ERROR -- : Unable to deliver email [confirmation]: getaddrinfo: No address associated with hostname
E, [2014-11-20T15:45:57.661972 #19135] ERROR -- : /usr/lib/ruby/2.1.0/net/smtp.rb:541:in 'initialize'
        /usr/lib/ruby/2.1.0/net/smtp.rb:541:in 'open'
        /usr/lib/ruby/2.1.0/net/smtp.rb:541:in 'tcp_socket'
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;环境：
    同 campo&lt;/p&gt;

&lt;p&gt;问题说明：
    原来是可以发邮件的，域名为 a.org，后来改为 b.org 同时 a.org 域名停用。结果在配置文件 config.yml 里改好相应的域名后，总是出现上面的问题。&lt;/p&gt;

&lt;p&gt;坑 1：
    生产环境用 bundle install 安装 gem 时安装了 spring，所以读的配置是老的，也就是 a.org，当然会 hostname 无法解析。
    见 rails 组的讨论 &lt;a href="https://github.com/rails/spring/issues/318" rel="nofollow" target="_blank" title=""&gt;https://github.com/rails/spring/issues/318&lt;/a&gt;
    解决的方法是在生产环境下 bundle install --without development test
    查看是否有问题的话，用 gem list spring 看下，没有就对了&lt;/p&gt;

&lt;p&gt;坑 2:
    UserMailer 使用了 resque_mailer，如果邮件配置改动了，resque workers 必须重启。&lt;/p&gt;</description>
      <author>5swords</author>
      <pubDate>Fri, 21 Nov 2014 10:31:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/22789</link>
      <guid>https://ruby-china.org/topics/22789</guid>
    </item>
    <item>
      <title>不要看新闻</title>
      <description>&lt;p&gt;在译言上看到一篇文章 &lt;a href="http://article.yeeyan.org/view/504606/427639" rel="nofollow" target="_blank" title=""&gt;为什么我要停止读/听/看新闻？&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;再看到文章的推荐 &lt;a href="http://dobelli.com/wp-content/uploads/2010/08/Avoid_News_Part1_TEXT.pdf" rel="nofollow" target="_blank" title=""&gt;Avoid News, towards a healthy news diet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;摘记一下段落的小标题，至少第 8 点我是深有体会的。&lt;/p&gt;
&lt;h2 id="1. News misleads us systematically."&gt;1. News misleads us systematically.&lt;/h2&gt;&lt;h2 id="2. News is irrelevant."&gt;2. News is irrelevant.&lt;/h2&gt;&lt;h2 id="3. News limits understanding."&gt;3. News limits understanding.&lt;/h2&gt;&lt;h2 id="4. News is toxic to your body."&gt;4. News is toxic to your body.&lt;/h2&gt;&lt;h2 id="5. News massively increases cognitive errors."&gt;5. News massively increases cognitive errors.&lt;/h2&gt;&lt;h2 id="6. News inhibits thinking."&gt;6. News inhibits thinking.&lt;/h2&gt;&lt;h2 id="7. News changes the structure of your brain."&gt;7. News changes the structure of your brain.&lt;/h2&gt;&lt;h2 id="8. News is costly."&gt;8. News is costly.&lt;/h2&gt;&lt;h2 id="9. News sunders the relationship between reputation and achievement."&gt;9. News sunders the relationship between reputation and achievement.&lt;/h2&gt;&lt;h2 id="10. News is produced by journalists."&gt;10. News is produced by journalists.&lt;/h2&gt;&lt;h2 id="11. Reported facts are sometimes wrong, forecasts always."&gt;11. Reported facts are sometimes wrong, forecasts always.&lt;/h2&gt;&lt;h2 id="12. News is manipulative."&gt;12. News is manipulative.&lt;/h2&gt;&lt;h2 id="13. News makes us passive."&gt;13. News makes us passive.&lt;/h2&gt;&lt;h2 id="14. News gives us the illusion of caring."&gt;14. News gives us the illusion of caring.&lt;/h2&gt;&lt;h2 id="15. News kills creativity."&gt;15. News kills creativity.&lt;/h2&gt;</description>
      <author>5swords</author>
      <pubDate>Tue, 21 Oct 2014 15:16:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/22162</link>
      <guid>https://ruby-china.org/topics/22162</guid>
    </item>
    <item>
      <title>ransack 的 polymorphic 小坑</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Task&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;:taskable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;polymorphic: &lt;/span&gt;&lt;span class="kp"&gt;true&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;FirstTask&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Task&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;Contact&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="c1"&gt;# name&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;FirstTask 的对象是 contact，在用 ransack 时&lt;/p&gt;

&lt;p&gt;写法 1：使用 meta_search 的老写法&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"taskable_name_cont"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"22"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="no"&gt;FirstTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;
&lt;span class="no"&gt;NameError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uninitialized&lt;/span&gt; &lt;span class="n"&gt;constant&lt;/span&gt; &lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Taskable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查了好久
写法 2：网上查的&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"taskable_of_Contact_name_cont"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"22"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;问题一样&lt;/p&gt;

&lt;p&gt;写法 3：仔细看&lt;a href="https://github.com/activerecord-hackery/ransack/commit/c156fa4a7ac6e1a8d730791c49bf4403aa0f3af7" rel="nofollow" target="_blank" title=""&gt;作者写的测试&lt;/a&gt;，发现 Contact 的首字母不仅要大写，而且后面一定要加一个'_type'，有点坑啊。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"taskable_of_Contact_type_name_cont"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"22"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;和写法 1 比要自己加上'of_ClassName_type'。&lt;/p&gt;</description>
      <author>5swords</author>
      <pubDate>Tue, 26 Aug 2014 15:32:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/21229</link>
      <guid>https://ruby-china.org/topics/21229</guid>
    </item>
    <item>
      <title>关于集成测试的数据库等</title>
      <description>&lt;p&gt;没做过集成测试，不是很懂自动化测试的知识，碰到些问题，请各位指教。&lt;/p&gt;

&lt;p&gt;1、数据库的基础，大家在什么数据库的基础上开始？是空的库还是有一个基础数据的数据库？&lt;/p&gt;

&lt;p&gt;2、数据库的生成，在基础库上用什么方式导入数据？应该可以在测试脚本里调吧。
    A: rake db:seed
    B: rails r script/xx.rb
    C: factory girl
    D: 还是有专门的 gem？
    E: 还是自己写？&lt;/p&gt;

&lt;p&gt;3、数据库的复原，测试结束，回到基础库，为下一个测试作准备。用什么方式复原？用 transaction？或是除了几个特定的表外全删除。&lt;/p&gt;

&lt;p&gt;4、一份数据能否连续测试？
    A: 可以，数据来之不易，而且如果模拟用户的操作的话，数据也有一定的连续性。比如说 crud 里的创建、查询、变更、查询、删除、查询这样测试下来。
    B: 不可以，每个 case 不管是否有关系，必须从基础库开始，在给定的数据环境下测试并得出结果。&lt;/p&gt;

&lt;p&gt;－－－－－－－－－－－－－－－－－
有没有这方面比较好的资料，不一定是 rails 相关的。&lt;/p&gt;</description>
      <author>5swords</author>
      <pubDate>Thu, 17 Jul 2014 09:29:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/20531</link>
      <guid>https://ruby-china.org/topics/20531</guid>
    </item>
    <item>
      <title>Mac 下 QQPlatform 进程杀不掉</title>
      <description>&lt;p&gt;杀了就自动重启，象病毒。
今天无意间发现这个问题，感觉有点不对劲。搜了下，发现文章 &lt;a href="http://humanerrorprocessor.wordpress.com/2013/04/10/%E8%AD%A6%E6%83%95-mac-app-store-%E4%B8%8A%E7%9A%84-qq-for-mac-2-3-0-%E6%9B%B4%E6%96%B0/" rel="nofollow" target="_blank" title=""&gt;警惕 Mac App Store 上的 QQ for Mac 2.3.0 更新&lt;/a&gt; 、 &lt;a href="https://twitter.com/SakagamiJun/status/333077263610437632" rel="nofollow" target="_blank" title=""&gt;Twitter 的一推&lt;/a&gt; 和 &lt;a href="http://www.hcn.name/blog/technology/freedomatic-software-and-opensource/2014/%E8%BD%AC%E5%AE%89%E8%A3%85%E5%AE%8Cqq%E5%BF%85%E9%A1%BB%E8%A6%81%E5%88%A0%E9%99%A4%E6%8E%89%E7%9A%84%E5%87%A0%E4%B8%AA%E6%81%90%E6%80%96%E6%96%87%E4%BB%B6%EF%BC%88%E9%83%A8%E5%88%86%E5%8E%9F" rel="nofollow" target="_blank" title=""&gt;转安装完 qq 必须要删除掉的几个恐怖文件&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;原来在 360 和企鹅中还认为企鹅应该能好点，现在看来还是 too simple 啊。&lt;/p&gt;</description>
      <author>5swords</author>
      <pubDate>Fri, 13 Jun 2014 08:57:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/19915</link>
      <guid>https://ruby-china.org/topics/19915</guid>
    </item>
    <item>
      <title>招聘的贴子能不能关闭</title>
      <description>&lt;p&gt;招聘的 tag 的贴子，多一个“关闭“button，招聘结束的，由楼主主动关掉，tag 从招聘-&amp;gt;已招聘。&lt;/p&gt;

&lt;p&gt;这样对甲方和乙方都有好处。&lt;/p&gt;</description>
      <author>5swords</author>
      <pubDate>Fri, 30 May 2014 11:18:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/19642</link>
      <guid>https://ruby-china.org/topics/19642</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;records&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'01'&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="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'0101'&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="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'010101'&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="mi"&gt;3&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'010102'&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="mi"&gt;4&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'010103'&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="mi"&gt;5&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'02'&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="mi"&gt;6&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'0201'&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="mi"&gt;7&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'0202'&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="mi"&gt;8&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'020201'&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="mi"&gt;9&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'020202'&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="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'0203'&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="mi"&gt;11&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'03'&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="mi"&gt;12&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'04'&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="mi"&gt;13&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'0401'&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="mi"&gt;14&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'040101'&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="mi"&gt;15&lt;/span&gt;
&lt;span class="p"&gt;},{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'04010101'&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="mi"&gt;16&lt;/span&gt;
&lt;span class="p"&gt;}]&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TreeNode&lt;/span&gt;
  &lt;span class="nb"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:children&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="vi"&gt;@id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&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;def&lt;/span&gt; &lt;span class="nf"&gt;length&lt;/span&gt;
    &lt;span class="vi"&gt;@name.length&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;push_child&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@children&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="vi"&gt;@children.push&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;
  &lt;span class="k"&gt;end&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="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;id: &lt;/span&gt;&lt;span class="vi"&gt;@id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="vi"&gt;@children.nil&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;merge!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;children: &lt;/span&gt;&lt;span class="vi"&gt;@children.collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;to_hash&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="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;TreeNode&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="ss"&gt;:name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;})]&lt;/span&gt;
&lt;span class="n"&gt;is_debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;

&lt;span class="n"&gt;records&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;r&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="no"&gt;TreeNode&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="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&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;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&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;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_debug&lt;/span&gt;
  &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;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;length&lt;/span&gt;
  &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_child&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;
  &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:to_hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_debug&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;stack&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;children&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:to_hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;=&amp;gt; [{:name=&amp;gt;"01", :id=&amp;gt;1, :children=&amp;gt;[{:name=&amp;gt;"0101", :id=&amp;gt;2, :children=&amp;gt;[{:name=&amp;gt;"010101", :id=&amp;gt;3}, {:name=&amp;gt;"010102", :id=&amp;gt;4}, {:name=&amp;gt;"010103", :id=&amp;gt;5}]}]}, {:name=&amp;gt;"02", :id=&amp;gt;6, :children=&amp;gt;[{:name=&amp;gt;"0201", :id=&amp;gt;7}, {:name=&amp;gt;"0202", :id=&amp;gt;8, :children=&amp;gt;[{:name=&amp;gt;"020201", :id=&amp;gt;9}, {:name=&amp;gt;"020202", :id=&amp;gt;10}]}, {:name=&amp;gt;"0203", :id=&amp;gt;11}]}, {:name=&amp;gt;"03", :id=&amp;gt;12}, {:name=&amp;gt;"04", :id=&amp;gt;13, :children=&amp;gt;[{:name=&amp;gt;"0401", :id=&amp;gt;14, :children=&amp;gt;[{:name=&amp;gt;"040101", :id=&amp;gt;15, :children=&amp;gt;[{:name=&amp;gt;"04010101", :id=&amp;gt;16}]}]}]}]&lt;/p&gt;</description>
      <author>5swords</author>
      <pubDate>Wed, 16 Apr 2014 07:06:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/18629</link>
      <guid>https://ruby-china.org/topics/18629</guid>
    </item>
  </channel>
</rss>
