<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>wongyouth (Ryan)</title>
    <link>https://ruby-china.org/wongyouth</link>
    <description>Do things the stupid way.</description>
    <language>en-us</language>
    <item>
      <title>详解 Ruby 里用到的比较函数 (equal?, eql?, ==, ===)</title>
      <description>&lt;p&gt;Ruby 里面有 4 种比较方法，&lt;code&gt;equal?&lt;/code&gt;, &lt;code&gt;eql?&lt;/code&gt;, &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;===&lt;/code&gt;，而且在不同的类里面表现的很不一样。在使用的时候也特别容易搞糊涂。
这篇博文将演示一些代码来讲解各个方法。&lt;/p&gt;
&lt;h3 id="== - 类意义上的 相等，需要每个类自己定义实现"&gt;
&lt;code&gt;==&lt;/code&gt; - 类意义上的 &lt;code&gt;相等&lt;/code&gt;，需要每个类自己定义实现&lt;/h3&gt;
&lt;p&gt;在特定类中觉得两个对象是否相同，需要看业务上的逻辑表象，所有由程序员覆盖该方法的定义，决定两个对象是否相同。&lt;/p&gt;

&lt;p&gt;比如 &lt;code&gt;String&lt;/code&gt; 类，他是来计较实际的文字串是否相同，而不在意是否来自同一个内存区域。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"abc"&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; "abc"&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; "abc"&lt;/span&gt;

&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; true&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; 70255156346640&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; 70255156340640&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="=== - 用在 case 语句里时会调用的方法"&gt;
&lt;code&gt;===&lt;/code&gt; - 用在 &lt;code&gt;case&lt;/code&gt; 语句里时会调用的方法&lt;/h3&gt;
&lt;p&gt;通常用在 &lt;code&gt;case&lt;/code&gt; 比较调用该方法，比如&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;some_object&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="sr"&gt;/a regex/&lt;/span&gt;
  &lt;span class="c1"&gt;# The regex matches&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;
  &lt;span class="c1"&gt;# some_object is in the range 2..4&lt;/span&gt;
&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&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;some_crazy_custom_predicate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;# the lambda returned true&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="k"&gt;if&lt;/span&gt; &lt;span class="sr"&gt;/a regex/&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;some_object&lt;/span&gt;
  &lt;span class="c1"&gt;# The regex matches&lt;/span&gt;
&lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;some_object&lt;/span&gt;
  &lt;span class="c1"&gt;# some_object is in the range 2..4&lt;/span&gt;
&lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&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;some_crazy_custom_predicate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;some_object&lt;/span&gt;
  &lt;span class="c1"&gt;# the lambda returned true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="eql? - 通常意义上的 相等"&gt;
&lt;code&gt;eql?&lt;/code&gt; - 通常意义上的 &lt;code&gt;相等&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;如果两个对象的值相同将返回 true，如果重新定义了子类的 &lt;code&gt;==&lt;/code&gt; 方法，一般需要 alias 到 &lt;code&gt;eql?&lt;/code&gt; 方法。
当然也有例外，整数与小数的比较两个方法的返回值就不同。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt; true&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql?&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;eql?&lt;/code&gt; 用在 Hash 里面用来做成员值比较&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;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&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="c1"&gt;#=&amp;gt; {}&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="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hash&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="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"a"&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; "a"&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="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"b"&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; "b"&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="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hash&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="c1"&gt;#=&amp;gt; "a"&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; "b"&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2.00&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"c"&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; "c"&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; "c"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以什么时候应该覆盖这个方法就看你想让他在 Hash 比较时如何表现。&lt;/p&gt;
&lt;h3 id="equal? - 内存地址相同的对象"&gt;
&lt;code&gt;equal?&lt;/code&gt; - 内存地址相同的对象&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;该方法不应该被子类覆盖&lt;/li&gt;
&lt;li&gt;比较的是两个对象在内存中是否相同，是否有同一个&lt;code&gt;object_id&lt;/code&gt;值&lt;/li&gt;
&lt;li&gt;Rails 中及时相同的对象&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;q&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;first&lt;/span&gt;
  &lt;span class="no"&gt;User&lt;/span&gt; &lt;span class="no"&gt;Load&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;40.4&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="no"&gt;SELECT&lt;/span&gt;  &lt;span class="s2"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;*&lt;/span&gt; &lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="s2"&gt;"users"&lt;/span&gt;   &lt;span class="no"&gt;ORDER&lt;/span&gt; &lt;span class="no"&gt;BY&lt;/span&gt; &lt;span class="s2"&gt;"users"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="no"&gt;ASC&lt;/span&gt; &lt;span class="no"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; #&amp;lt;User id: 1, email: "ryan@wongyouth.com"&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;q2&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;first&lt;/span&gt;
  &lt;span class="no"&gt;User&lt;/span&gt; &lt;span class="no"&gt;Load&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="no"&gt;SELECT&lt;/span&gt;  &lt;span class="s2"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;*&lt;/span&gt; &lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="s2"&gt;"users"&lt;/span&gt;   &lt;span class="no"&gt;ORDER&lt;/span&gt; &lt;span class="no"&gt;BY&lt;/span&gt; &lt;span class="s2"&gt;"users"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="no"&gt;ASC&lt;/span&gt; &lt;span class="no"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; #&amp;lt;User id: 1, email: "ryan@wongyouth.com"&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal?&lt;/span&gt; &lt;span class="n"&gt;q2&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="记忆方法"&gt;记忆方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;==&lt;/code&gt;
按业务需求覆盖该方法&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;===&lt;/code&gt;
覆盖 &lt;code&gt;case&lt;/code&gt; 语句时的表现&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;eql?&lt;/code&gt;
别名到 &lt;code&gt;==&lt;/code&gt; 方法，需要时覆盖方法改变 &lt;code&gt;Hash&lt;/code&gt; 比较时的表现&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;equal?&lt;/code&gt;
不改动&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="延伸阅读"&gt;延伸阅读&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/7156955/whats-the-difference-between-equal-eql-and" rel="nofollow" target="_blank"&gt;http://stackoverflow.com/questions/7156955/whats-the-difference-between-equal-eql-and&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;首发在这里 &lt;a href="http://wongyouth.com/blog/2014/07/05/variations-of-equal-method-in-ruby/" rel="nofollow" target="_blank"&gt;http://wongyouth.com/blog/2014/07/05/variations-of-equal-method-in-ruby/&lt;/a&gt;&lt;/p&gt;</description>
      <author>wongyouth</author>
      <pubDate>Sat, 05 Jul 2014 20:41:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/20334</link>
      <guid>https://ruby-china.org/topics/20334</guid>
    </item>
    <item>
      <title>最近项目里需要用到城市数据，遂写了个 Gem 用来取得最新数据。</title>
      <description>&lt;p&gt;最近项目里需要用到中国城市数据，看了几个 Gem，发现数据都不是最新的，遂写了个 Gem &lt;a href="http://github.com/wongyouth/chinacity" rel="nofollow" target="_blank" title=""&gt;chinacity&lt;/a&gt; 用来从国家统计局取最新数据。&lt;/p&gt;

&lt;p&gt;因为考虑到城市类基础数据一旦开始使用，id 与别的数据关联后就比较难再更新数据了，所以就做成只取数据生成文件的简单小工具。&lt;/p&gt;
&lt;h2 id="功能"&gt;功能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;从国家统计局官网取最新数据。&lt;/li&gt;
&lt;li&gt;支持导出 JSON，CSV 格式&lt;/li&gt;
&lt;li&gt;JSON 数据 兼容 &lt;a href="https://github.com/saberma/china_city" rel="nofollow" target="_blank" title=""&gt;china_city&lt;/a&gt; Gem 的数据格式&lt;/li&gt;
&lt;li&gt;支持同时导出拼音缩写&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="用法"&gt;用法&lt;/h2&gt;&lt;h3 id="导出JSON格式"&gt;导出 JSON 格式&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ chinacity &amp;gt; areas.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result looks like&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "province": [
    {
      "id": "110000",
      "text": "北京市"
    },
    {
      "id": "120000",
      "text": "天津市"
    },
    ...
  ],

  "city": [
    {
      "id": "110100",
      "text": "市辖区"
    },
    {
      "id": "110200",
      "text": "县"
    },
    ...
  ],
  "district": [
    {
      "id": "110101",
      "text": "东城区"
    },
    {
      "id": "110102",
      "text": "西城区"
    },
    ...
  ]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="导出JSON格式，同时输出拼音缩写."&gt;导出 JSON 格式，同时输出拼音缩写。&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ chinacity -s &amp;gt; areas.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The Result json looks like&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "province": [
    {
      "id": "110000",
      "text": "北京市",
      "short": "BJS"
    },
    {
      "id": "120000",
      "text": "天津市",
      "short": "TJS"
    },
    {
      "id": "130000",
      "text": "河北省",
      "short": "HBS"
    },
    ...
  ],
  "city": [...],
  "district": [...]
}

&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="导出 CSV 格式."&gt;导出 CSV 格式。&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ chinacity -sc &amp;gt; areas.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result looks like&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id, 名称, 缩写, 层级
110000, 北京市, BJS, 1
110100, 市辖区, SXQ, 2
110101, 东城区, DCQ, 3
110102, 西城区, XCQ, 3
110105, 朝阳区, ZYQ, 3
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;chinacity 主页链接 &lt;a href="http://github.com/wongyouth/chinacity" rel="nofollow" target="_blank"&gt;http://github.com/wongyouth/chinacity&lt;/a&gt;&lt;/p&gt;</description>
      <author>wongyouth</author>
      <pubDate>Mon, 30 Jun 2014 20:03:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/20244</link>
      <guid>https://ruby-china.org/topics/20244</guid>
    </item>
    <item>
      <title>奇怪的环境变量，是不是 ruby 的 bug 啊？</title>
      <description>&lt;p&gt;请看下面的例子，在你的终端试下看，想了一个晚上都没有想通理由。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby -e "puts ENV['USERNAME']"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果是没有输出
因为我的环境变量里面没有设置 USERNAME，所以返回空是正常的。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;USERNAME=a ruby -e "puts ENV['USERNAME']" 
#=&amp;gt; 登陆用户名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果输出了我的用户名，而不是这里设置的环境变量&lt;code&gt;a&lt;/code&gt;，很是诡异，因为没有哪个地方设置这个值。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;USER=a ruby -e "puts ENV['USER']"
#=&amp;gt; a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;换一个变量用 USER 反而正常了。
我的环境变量里面 USER 自动被设置为登录名。
说明虽然环境变量有值，但是命令行中设置的值可以重置它。&lt;/p&gt;

&lt;p&gt;在系统自带 /usr/bin/ruby, 与 rbenv 都试过，问题同样！
用 mac，linux 都试了，没有不同！
在 ruby1.8, 1.9, 2.0 都试了没有变化！&lt;/p&gt;

&lt;p&gt;这是 ruby 的 bug 吗，哪位能解释一下？&lt;/p&gt;</description>
      <author>wongyouth</author>
      <pubDate>Thu, 01 Aug 2013 23:16:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/12991</link>
      <guid>https://ruby-china.org/topics/12991</guid>
    </item>
    <item>
      <title>一个简单的 spider 可用来下载网站文档</title>
      <description>&lt;p&gt;没找到一个下载网站的好用的蜘蛛，顺手写了一个简单小巧的，胜在速度很快，可以用来下技术文档站，不要乱用哦，会拖死网站滴！&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wongyouth/speed_spider" rel="nofollow" target="_blank"&gt;https://github.com/wongyouth/speed_spider&lt;/a&gt; &lt;/p&gt;
&lt;h2 id="Installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;install it with rubygem:&lt;/p&gt;

&lt;p&gt;gem install 'speed_spider'&lt;/p&gt;
&lt;h2 id="Usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;Usage: spider [options] start_url&lt;/p&gt;

&lt;p&gt;options:
        -S, --slient                     slient output
        -D, --dir String                 directory for download files to save to. "download" by default
        -b, --base_url String            any url not starts with base_url will not be saved
        -t, --threads Integer            threads to run for fetching pages, 4 by default
        -u, --user_agent String          words for request header USER_AGENT
        -d, --delay Integer              delay between requests
        -o, --obey_robots_text           obey robots exclustion protocol
        -l, --depth_limit                limit the depth of the crawl
        -r, --redirect_limit Integer     number of times HTTP redirects will be followed
        -a, --accept_cookies             accept cookies from the server and send them back?
        -s, --skip_query_strings         skip any link with a query string? e.g. &lt;a href="http://foo.com/?u=user" rel="nofollow" target="_blank"&gt;http://foo.com/?u=user&lt;/a&gt;
        -H, --proxy_host String          proxy server hostname
        -P, --proxy_port Integer         proxy server port number
        -T, --read_timeout Integer       HTTP read timeout in seconds
        -V, --version                    Show version&lt;/p&gt;
&lt;h2 id="Example"&gt;Example&lt;/h2&gt;
&lt;p&gt;spider &lt;a href="http://twitter.github.io/bootstrap/" rel="nofollow" target="_blank"&gt;http://twitter.github.io/bootstrap/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will download all files within the same domain  as &lt;code&gt;twitter.github.io&lt;/code&gt;, and save to &lt;code&gt;download/twitter.github.io/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;spider -b &lt;a href="http://ruby-doc.org/core-2.0/" rel="nofollow" target="_blank"&gt;http://ruby-doc.org/core-2.0/&lt;/a&gt; &lt;a href="http://ruby-doc.org/core-2.0/" rel="nofollow" target="_blank"&gt;http://ruby-doc.org/core-2.0/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will only download urls start with &lt;code&gt;http://ruby-doc.org/core-2.0/&lt;/code&gt;, notice &lt;code&gt;assets&lt;/code&gt; files like image, css, js, font will not obey &lt;code&gt;base_url&lt;/code&gt; rule.&lt;/p&gt;</description>
      <author>wongyouth</author>
      <pubDate>Sat, 01 Jun 2013 21:34:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/11408</link>
      <guid>https://ruby-china.org/topics/11408</guid>
    </item>
    <item>
      <title>最好能显示帖子的发布日期，回复日期</title>
      <description>&lt;p&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;/p&gt;</description>
      <author>wongyouth</author>
      <pubDate>Wed, 11 Jul 2012 23:00:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/4257</link>
      <guid>https://ruby-china.org/topics/4257</guid>
    </item>
    <item>
      <title>Rails 开发特配 vimfiles 文件</title>
      <description>&lt;p&gt;看到很多朋友在烦编辑器的事，就像自己刚开始的时候一样。我还是选择了 vim, 就是喜欢他可以配置到自己喜欢的样子，不知道你喜欢不喜欢我的配置，但是如果你着急上手，试试我的。&lt;/p&gt;

&lt;p&gt;虽然只在 ubuntu 测试过，但是应该在别的系统下也可以用&lt;/p&gt;
&lt;h2 id="特点"&gt;特点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;单条命令完成安装，免除配置痛苦&lt;/li&gt;
&lt;li&gt;vim 插件不包含在 repo 里，支持一个命令更新所有 vimplugins，免除更新插件之苦&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="包含插件"&gt;包含插件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;vundle, vim 插件管理器， &lt;code&gt;:BundleInstall!&lt;/code&gt; 更新所有插件&lt;/li&gt;
&lt;li&gt;rails 必须的&lt;/li&gt;
&lt;li&gt;NERDTree 树形文件管理器 &lt;code&gt;F7&lt;/code&gt; / &lt;code&gt;F6&lt;/code&gt; 当前文件文件夹&lt;/li&gt;
&lt;li&gt;NERDCommenter 注释用&lt;code&gt;\cc&lt;/code&gt;  / &lt;code&gt;\c&amp;lt;space&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;delimitMate 自动补全右括号&lt;/li&gt;
&lt;li&gt;zencoding HTML 垒码利器 &lt;code&gt;&amp;lt;c-y&amp;gt;,&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tabular 代码美化。按 &lt;code&gt;=&lt;/code&gt; 等对齐 &lt;code&gt;\a=&lt;/code&gt;，按 &lt;code&gt;=&amp;gt;&lt;/code&gt; 对齐 &lt;code&gt;\a&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tagbar 标签列表 &lt;code&gt;F8&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ctrlp 文件查找 &lt;code&gt;&amp;lt;c-p&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;bufExplorer 缓冲列表 &lt;code&gt;&amp;lt;c-b&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;preview markdown 文件编译结果查看 &lt;code&gt;\P&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;fugitive 超强大 GIT 代码仓库查询工具

&lt;ul&gt;
&lt;li&gt;查状态 &lt;code&gt;:Gstatus&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;查异同 &lt;code&gt;:Gdiff&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;搜 pattern &lt;code&gt;:Ggrep&lt;/code&gt;, 替代 ack&lt;/li&gt;
&lt;li&gt;查 log &lt;code&gt;:Glog&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;打开 Github 上该文件 &lt;code&gt;:Gbrowse&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;说不完...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;snippets，好好看看&lt;a href="https://github.com/honza/snipmate-snippets/blob/master/snippets/ruby.snippets" rel="nofollow" target="_blank" title=""&gt;ruby.snippets&lt;/a&gt; &lt;a href="https://github.com/honza/snipmate-snippets/blob/master/snippets/eruby.snippets" rel="nofollow" target="_blank" title=""&gt;eruby.snippets&lt;/a&gt;一定可以加快码字速度&lt;/li&gt;
&lt;li&gt;语法支持

&lt;ul&gt;
&lt;li&gt;less&lt;/li&gt;
&lt;li&gt;markdown &lt;/li&gt;
&lt;li&gt;sass, scss&lt;/li&gt;
&lt;li&gt;coffee-script&lt;/li&gt;
&lt;li&gt;css 文件中颜色 color, background-color 自动显示为背景色（需 gvim）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;配色方案

&lt;ul&gt;
&lt;li&gt;solarized&lt;/li&gt;
&lt;li&gt;vim-github-colorscheme&lt;/li&gt;
&lt;li&gt;backboard&lt;/li&gt;
&lt;li&gt;monokai&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vimrc DIY"&gt;vimrc DIY&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;当前行，列高亮&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F3&lt;/code&gt; 搜索， &lt;code&gt;alt-F3&lt;/code&gt; 替换 文件中所有当前光标下文字&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F4&lt;/code&gt; 插入模式时 切换粘帖模式，普通模式时 切换 行号&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你觉得还少了什么？&lt;/p&gt;

&lt;p&gt;最后 vim 英文帮助看着吃力的话你可以下载 VIM 的中文说明，那就完美了
&lt;a href="http://vimcdoc.sourceforge.net/" rel="nofollow" target="_blank" title=""&gt;vim 中文帮助&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Screenshots"&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://pic.yupoo.com/sinaweibo1332356097/C5k2LdP9/medish.jpg" title="" alt="vim-gui"&gt;&lt;/p&gt;

&lt;p&gt;repo 在这里-&amp;gt; &lt;a href="https://github.com/wongyouth/vimfiles" rel="nofollow" target="_blank"&gt;https://github.com/wongyouth/vimfiles&lt;/a&gt;&lt;/p&gt;</description>
      <author>wongyouth</author>
      <pubDate>Wed, 04 Jul 2012 22:04:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/4125</link>
      <guid>https://ruby-china.org/topics/4125</guid>
    </item>
    <item>
      <title>请教 Rails Guides 里面使用的关系图编辑工具</title>
      <description>&lt;p&gt;请教能制作出以下章节中的表关系图效果的开源工具。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://guides.rubyonrails.org/association_basics.html#the-belongs_to-association" rel="nofollow" target="_blank"&gt;http://guides.rubyonrails.org/association_basics.html#the-belongs_to-association&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;最好是能够支持中文哦，跨平台或者能在 Ubuntu 下用的  &lt;/p&gt;</description>
      <author>wongyouth</author>
      <pubDate>Fri, 20 Apr 2012 20:14:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/2779</link>
      <guid>https://ruby-china.org/topics/2779</guid>
    </item>
    <item>
      <title>Rails 中文 IRC 频道 #rails-cn on freenode.net</title>
      <description>&lt;p&gt;虽然中文用户很少用 IRC，大多在用 QQ Group，但是 QQ Group 有很多限制，一个是 QQ 对 Linux 支持不够，还有就是 QQ Group 有人数限制，导致成员很分散。&lt;/p&gt;

&lt;p&gt;我在 freenode 里面建立了一个#rails-cn 频道，喜欢交流的朋友可以过来哦。
在 freenode 里面有很多 Open Source 的官方频道，像 #ubuntu-cn，不过大家最熟悉的应该就是 Ruby on Rails 了吧。&lt;/p&gt;

&lt;p&gt;我使用 X-chat 这款工具，支持 UTF8，也支持中文，日文等。&lt;/p&gt;

&lt;p&gt;服务器 irc.freenode.net
频道 #rails-cn  &lt;/p&gt;</description>
      <author>wongyouth</author>
      <pubDate>Fri, 20 Apr 2012 11:27:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/2754</link>
      <guid>https://ruby-china.org/topics/2754</guid>
    </item>
  </channel>
</rss>
