<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>crazyjin (felix)</title>
    <link>https://ruby-china.org/crazyjin</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>好像发现了一个 bug</title>
      <description>&lt;p&gt;&lt;code&gt;好像发现了一个bug[]().&lt;/code&gt;&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Mon, 11 Mar 2019 22:34:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/38218</link>
      <guid>https://ruby-china.org/topics/38218</guid>
    </item>
    <item>
      <title>为什么每次调用 Shell 命令的时候，method_missing 都会被调用到？</title>
      <description>&lt;p&gt;我重写了 method_missing，如题。&lt;/p&gt;

&lt;p&gt;代码：&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;method_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&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;"method_missing called: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;super&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="sb"&gt;`ls`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;method missing called! to_ary
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>crazyjin</author>
      <pubDate>Sun, 01 Apr 2018 19:17:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/35378</link>
      <guid>https://ruby-china.org/topics/35378</guid>
    </item>
    <item>
      <title>OS X 很漂亮，很不顺心［已解决］</title>
      <description>&lt;p&gt;之前发帖问是否等今年的新款 macbook pro，结论是等到3月发布会结束后。但是后来又在网上看了一圈，各种小道消息说3月不有 macbook 发布，急着用电脑，就买了。也许是辞职在家闲的蛋疼。还有一个原因是，前公司有个同事头天下午说要搞个 Air, 第二天就到货了。完全不考虑一下我这种纠结人的感受。那种超脱于逼格的实干精神给我映像很深。于是我就买了，管它的新款旧款。关系很大么？不都能用个几年么？&lt;/p&gt;

&lt;p&gt;外观很漂亮，很能说明逼格。系统界面很漂亮，很能说明逼格。性能还行，编译的时候偶尔 cpu 会 100%, 逼格勉强保住。键盘键程太短，大爱 thinkpad T 系键盘的我，不适应；快捷键不适应；搞个 poker3，逼格又提升了一点。&lt;/p&gt;

&lt;p&gt;然后问题就来了，装个 mysql server，折腾好久没起来，装好了居然没有默认的配置文件。开机启动后台服务还得用臃肿 xml 配置一下，:(    Oh, homebrew, 所有东西都堆在那里   :（习惯了 linux 的文件系统目录结果，再瞅瞅 osx 的目录结构，:(  各种不顺眼，:(&lt;/p&gt;

&lt;p&gt;折腾过七八年 ubuntu, 两年左右的 centos，真心不适应。想格了装个 ubuntu。或者把我原来的 SSD 做成移动硬盘用里边的 Ubuntu 14.04LTS。&lt;/p&gt;

&lt;p&gt;大家怎么看？&lt;/p&gt;

&lt;p&gt;已经找到自己的解决方了，和 vergrant 类似：&lt;/p&gt;

&lt;p&gt;1.安装 Virtualbox+Ubuntu Server 14.04.LTS
2.UbuntuServer 安装 Virtualbox 文件共享并设置好文件共享自动加载
3.配置好 SSH，设置登陆 alias&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ssh107&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ssh felix@192.168.0.107'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4.使用无界面后台运行的方式运行 Virtualbox 的 Ubuntu，并设置好 alias:&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;startvm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'VBoxManage startvm Ubuntu14.04.LTS --type headless'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;stopvm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'VBoxManage controlvm Ubuntu14.04.LTS poweroff'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;5.OS X 系统安装和设置 macvim&lt;/p&gt;

&lt;p&gt;搭建完成后使用非常方便：启动 shell 后进入项目根目录（自动被虚拟机挂载），startvm 启动 Ubuntu Server 无界面后台运行，打开 Gvim，然后 ssh107 登录虚拟机，进入项目根目录。然后就可以码代码了。项目运行环境完全在我熟悉的 Ubuntu 上，Mysql, Nginx...一件安装，连自启动都已经设置好了。完美结合 OSX 的美观、多应用和 Linux 的高效开发。
缺点还是有一些，比如要两次进入项目更目录。另外不同的文件系统之间貌似不能建立软链接。目前还没遇到不可解决的问题。&lt;/p&gt;

&lt;p&gt;所以我目前的观点就是：能不折腾就不折腾  :)&lt;/p&gt;

&lt;p&gt;感谢大家推荐的工具，已收藏备用。&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Mon, 07 Mar 2016 16:55:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/29234</link>
      <guid>https://ruby-china.org/topics/29234</guid>
    </item>
    <item>
      <title>现在入手 Macbook Pro 还是等今年新款？</title>
      <description>&lt;p&gt;也不知道苹果今年 3 月的春季发布会会不会有新款的 macbook pro 发布，发布以后多久可以买到。&lt;/p&gt;

&lt;p&gt;结贴：&lt;/p&gt;

&lt;p&gt;看了国内外各种小道消息，决定起码等到苹果春季发布会结束。如果春季发布会没有更新，就立马入手；更新了就再等等。&lt;/p&gt;

&lt;p&gt;不纠结，已买。&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Mon, 22 Feb 2016 17:15:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/29052</link>
      <guid>https://ruby-china.org/topics/29052</guid>
    </item>
    <item>
      <title>好吧， 我是一个技术实用主义者</title>
      <description>&lt;p&gt;以前我也经常问 what？why？how？工作几年变成了技术实用主义者。没遇到问题之前很少再问那些问题。
今天被问道 map 和 map! 的性能哪个好。囧。。。
以前学校里的时候我也为技术而技术，现在为了解决问题而技术。
我并不想辩解哪个更好，只想说，进入到 ruby 这个领域就没有遇到过什么太多太深的问题：是给自己找点问题的时候了。&lt;/p&gt;

&lt;p&gt;做过小调查：研究过 map 和 map! 哪个性能好的同学举手；实际遇到过这个问题（原因相关联就行）的同学请举手！&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Thu, 19 Nov 2015 23:01:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/28117</link>
      <guid>https://ruby-china.org/topics/28117</guid>
    </item>
    <item>
      <title>今年大家学习新语言的热情明显降低了</title>
      <description>&lt;p&gt;今年经济明显不景气，做银行贷款的朋友说：没见过几个老板今年是赚钱的！！
 经济不景气的另外一个现象：成都的 ruby 职位少了太多--创业公司少了。
看来经济不景气也极大影响了大家学习新技术的热情啊。各大新语言板块帖子数寥寥无几，几个月都没有新帖。。。叹气。。。&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Wed, 04 Nov 2015 11:54:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/27944</link>
      <guid>https://ruby-china.org/topics/27944</guid>
    </item>
    <item>
      <title>建议把 Erlang 和 Elixir 两个节点合并成 Erlang/Elixir 一个节点</title>
      <description>&lt;p&gt;如题。&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Tue, 15 Sep 2015 18:42:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/27345</link>
      <guid>https://ruby-china.org/topics/27345</guid>
    </item>
    <item>
      <title>国外学校使用 rust 来上操作系统课程</title>
      <description>&lt;p&gt;原帖地址：&lt;a href="http://rust-class.org/0/pages/using-rust-for-an-undergraduate-os-course.html" rel="nofollow" target="_blank" title=""&gt;Using Rust for an Undergraduate OS Course&lt;/a&gt;
里边详细描述 rust 的优缺点，以及与其它语言的对比。&lt;/p&gt;

&lt;p&gt;课程结束后的总结：&lt;/p&gt;

&lt;p&gt;In summary, I really enjoyed using Rust and think it is a very promising language with a lot of potential for teaching, as well as for industrial systems programming.&lt;/p&gt;

&lt;p&gt;It is irresponsible for universities to continue to teach students to write C code riddled with security vulnerabilities, memory leaks, and race conditions. There are good alternatives available, and Rust appears to be the most promising to me, but I hope others will explore both ways to teach students to write safe C code as well as different languages for teaching systems programming that don't suffer from the legacy flaws of C.&lt;/p&gt;

&lt;p&gt;翻译：
    总的来说，我很享受 rust, 它是一门非常有前途的语言。它在教学方面很有潜力，在商业程序设计上也一样。&lt;/p&gt;

&lt;p&gt;在大学里继续教学生写充满了安全问题/内存泄漏/竞争状态的 c 代码是不负责任的。有很多编程语言可以替代 c,  而 rust 在我看来是最有前途的。但是我希望其他认在教学生去写安全的代码的同时也用其它语言去教学生操作系统编程而不必忍受 c 的缺陷。&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Wed, 08 Jul 2015 14:53:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/26388</link>
      <guid>https://ruby-china.org/topics/26388</guid>
    </item>
    <item>
      <title>写了一个只有 100 行的 mini 版的 Rails</title>
      <description>&lt;p&gt;只有一百行代码。rack based. 模板引擎是 slim. 这里有个&lt;a href="https://github.com/crazyjin/myrails" rel="nofollow" target="_blank" title=""&gt;demo&lt;/a&gt;. 仅供一乐，欢迎吐槽。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#encoding utf-8&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rubygems'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'bundler/setup'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'slim'&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;MyRails&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Router&lt;/span&gt;
    &lt;span class="vc"&gt;@@routes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;
      &lt;span class="c1"&gt;#RSTfull route helpers, simply map path to controllers and actions&lt;/span&gt;
      &lt;span class="c1"&gt;#get "/blogs", "blogs_controller#index"&lt;/span&gt;
      &lt;span class="c1"&gt;#post "/blogs", "blogs_controller#create"&lt;/span&gt;
      &lt;span class="sx"&gt;%i{get post put delete}&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;m&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;define_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&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;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; 
          &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'#'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="n"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="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;:capitalize&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;
          &lt;span class="n"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;const_get&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt;

          &lt;span class="vc"&gt;@@routes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vc"&gt;@@routes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;nil?&lt;/span&gt;
          &lt;span class="vc"&gt;@@routes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_sym&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;

      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;draw_routes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;

      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_controller_action&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;
        &lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;downcase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_sym&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"REQUEST_PATH"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"QUERY_STRING"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"content-type"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"text/html"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"404, you got it!!"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vc"&gt;@@routes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;nil?&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="vc"&gt;@@routes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;nil?&lt;/span&gt;

        &lt;span class="n"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vc"&gt;@@routes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;path&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="nf"&gt;new&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;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vc"&gt;@@routes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;path&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="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;

        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;http_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;http_headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;http_body&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
      &lt;span class="k"&gt;rescue&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"content-type"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"text/html"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
    &lt;span class="nb"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:http_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:http_headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:http_body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:params&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ViewContext&lt;/span&gt; 
      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_accessable_instance_variable&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;
        &lt;span class="n"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_eval&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;attr_accessor&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt; &lt;span class="n"&gt;query_string&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
      &lt;span class="n"&gt;key_value_strs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;query_string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'&amp;amp;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;key_value_strs&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;str&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;key_value_pair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt; &lt;span class="s1"&gt;'='&lt;/span&gt;
        &lt;span class="vi"&gt;@params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key_value_pair&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key_value_pair&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="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;key_value_pair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;

      &lt;span class="vi"&gt;@http_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
      &lt;span class="vi"&gt;@http_headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"content-type"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"text/html"&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;render&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;
      &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"./application.html.slim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rb"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;
      &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&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;template&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.html.slim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rb"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;

      &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Slim&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Template&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;layout&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;variables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;instance_variables&lt;/span&gt;
      &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ViewContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
      &lt;span class="n"&gt;variables&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;v&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_accessable_instance_variable&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;env&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="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;="&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;instance_variable_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&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;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Slim&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Template&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;content&lt;/span&gt; &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="vi"&gt;@http_body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;
      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;draw_routes&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
        &lt;span class="no"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;draw_routes&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;

      &lt;span class="c1"&gt;#rack server need this&lt;/span&gt;
      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="no"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_controller_action&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;
      &lt;span class="k"&gt;rescue&lt;/span&gt;
        &lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;backtrace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;</description>
      <author>crazyjin</author>
      <pubDate>Tue, 26 May 2015 18:40:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/25756</link>
      <guid>https://ruby-china.org/topics/25756</guid>
    </item>
    <item>
      <title>如何深入学习 Rails</title>
      <description>&lt;p&gt;学习 Ruby on Rails 有一两年了。现在也一直在做 rails 相关的开发工作。但是总感觉自己 rails 的各方面都接触了一点，但是对 rails 没有深入的理解.
以前看过&amp;lt;&amp;lt;深入理解计算机系统&amp;gt;&amp;gt;, 看到代码优化和 cpu 那两章的时候感觉太爽了。看完 csapp 感觉自己对计算机的理解清晰多了.
现在搞 rails, 虽然会用，但是 rails 给我的感觉还是一团迷雾。  &lt;/p&gt;

&lt;p&gt;那么问题来了，如何深入理解 rails, 就像读 csapp 那么爽？&lt;/p&gt;

&lt;p&gt;刚拉了 rails 的代码统计了一下：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;f&lt;span class="k"&gt;**&lt;/span&gt;x@ubuntu:~/tmp/rails&lt;span class="nv"&gt;$ &lt;/span&gt;find ./ &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.rb"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'^\s*#.*'&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
229790
f&lt;span class="k"&gt;**&lt;/span&gt;x@ubuntu:~/tmp/rails&lt;span class="nv"&gt;$ &lt;/span&gt;find ./ &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.rb"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'^\s*#.*'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
38679
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码 229790 行，注释 38679 行。完全阅读分析 rails 代码注定是不行的。。&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Tue, 21 Apr 2015 19:14:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/25237</link>
      <guid>https://ruby-china.org/topics/25237</guid>
    </item>
    <item>
      <title>MySQL 双机互为主从备份</title>
      <description>&lt;p&gt;已有两只 mysql 服务，一个主，一个备。备上面还建了新的数据库.
现在想把这两只 msyql 服务配置成互为主从关系。当然，一切都要以现有数据安全为基础，mysql 服务可以容忍短时间暂停。&lt;/p&gt;

&lt;p&gt;大家也许没有明白我的需求，再解释一下:
 在现在主从同步的框架上，主 msyql 服务有数据库 A, 备数据库上不紧有 A 的备份，还有 B,C,D 等数据库.
我现在希望主 mysql 能够备份备 msyql 服务上的 B,C,D 等数据库。&lt;/p&gt;

&lt;p&gt;求方案。&lt;/p&gt;

&lt;p&gt;已解决，参考：&lt;a href="http://xinnian.iteye.com/blog/930214" rel="nofollow" target="_blank"&gt;http://xinnian.iteye.com/blog/930214&lt;/a&gt;&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Tue, 27 Jan 2015 15:16:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/23966</link>
      <guid>https://ruby-china.org/topics/23966</guid>
    </item>
    <item>
      <title>nginx 作 json api 反向代理，如何返回 json 形式的错误代码？</title>
      <description>&lt;p&gt;如题：我后端有一个 json api 服务器，前端用 nginx 做代理，当后端 json api 挂掉的时候，访问这个 nginx 代理势必会返回一段包含错误信息的 html 代码，能不能设置成返回 json 字符串呢？如何设置？ &lt;/p&gt;

&lt;p&gt;运维 very freshman 先谢谢大家了。&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Mon, 20 Oct 2014 15:37:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/22137</link>
      <guid>https://ruby-china.org/topics/22137</guid>
    </item>
    <item>
      <title>factory girl 的疑问</title>
      <description>&lt;p&gt;&lt;a href="https://github.com/thoughtbot/factory_girl/issues/683" rel="nofollow" target="_blank"&gt;https://github.com/thoughtbot/factory_girl/issues/683&lt;/a&gt;&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Fri, 22 Aug 2014 18:34:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/21183</link>
      <guid>https://ruby-china.org/topics/21183</guid>
    </item>
    <item>
      <title>mobile 特性测试方案</title>
      <description>&lt;p&gt;现有的测试框架：rspec + capybara
现在项目有两种 format 一种是 html.erb 和 mobile.erb，针对 pc 和 mobile 有两套界面。
大家都是怎么做 mobile 端特性测试的？！
有没有通用的最佳解决方？！&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Mon, 11 Aug 2014 12:33:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/20953</link>
      <guid>https://ruby-china.org/topics/20953</guid>
    </item>
    <item>
      <title>在线支付平台求推荐</title>
      <description>&lt;p&gt;网站暂定是用 Ruby on Rails 做。现在在考虑做支付。因为面向的对象主要是公司性质的，所以主观地 pass 掉了支付宝和财富通。
网上搜了一通，发现了一些直接和银行接入的平台，网银在线，银联。。不知道哪个申请办理、接入实现起来更容易。。哪个收费更低。&lt;/p&gt;

&lt;p&gt;大伙给推荐一个呗。&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Thu, 27 Feb 2014 19:51:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/17541</link>
      <guid>https://ruby-china.org/topics/17541</guid>
    </item>
    <item>
      <title>Model 中自定义 setter 中的错误处理</title>
      <description>&lt;p&gt;页面上有一个 jquery datepicker 通过表单向后台提交一个 1/3/2014 格式的字符串，我的 monoid 对应的 field 是&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ss"&gt;:date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="ss"&gt;:DateTime&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;def&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/\d{1,2}\/\d{1,2}\/\d{4}/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="c1"&gt;#根据d生成一个DateTime 然后super&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
     &lt;span class="c1"&gt;#错误处理&lt;/span&gt;
     &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"不正确的日期"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为什么 save 失败过后我在这里添加过的错误信息就消失了？&lt;/p&gt;

&lt;p&gt;正解：
rails 在执行 validation 之前会把 errors 里的错误信息全部清空。setter 中遇到的错误信息可以暂时放在全部变量中，validate 时再放到 errors 中去。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ss"&gt;:date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="ss"&gt;:DateTime&lt;/span&gt;
&lt;span class="n"&gt;validate&lt;/span&gt; &lt;span class="ss"&gt;:get_setter_errors&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/\d{1,2}\/\d{1,2}\/\d{4}/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="c1"&gt;#根据d生成一个DateTime 然后super&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
     &lt;span class="n"&gt;setter_errors_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"错误的日期格式！"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&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;get_setter_errors&lt;/span&gt;
   &lt;span class="vi"&gt;@setter_errors.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;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setter_errors_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@setter_errors&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="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@setter_errors.nil&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;
   &lt;span class="vi"&gt;@setter_errors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>crazyjin</author>
      <pubDate>Fri, 10 Jan 2014 13:42:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/16718</link>
      <guid>https://ruby-china.org/topics/16718</guid>
    </item>
    <item>
      <title>mongoid 排序问题</title>
      <description>&lt;p&gt;有一个 document
Person {
  include Mongoid:Document
  has_many :books
}
查询 person 的时候能否根据 book_ids 的数组长度来排序？&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Thu, 02 Jan 2014 12:12:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/16564</link>
      <guid>https://ruby-china.org/topics/16564</guid>
    </item>
    <item>
      <title>Go's Reflect</title>
      <description>&lt;p&gt;我匿名组合了一个指针&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="no"&gt;Type1&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="no"&gt;Type2&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="no"&gt;Type1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="no"&gt;Type3&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="no"&gt;Type1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在有很多类型 Type2,Type3……都匿名组合了一个*Type1
我用一个 var i interface{}  来装这些类型（Type2 Type3……）的实例，我现在怎样才能为 i 的*Type1 赋值？&lt;/p&gt;

&lt;p&gt;我的代码是这样的写的：&lt;/p&gt;

&lt;p&gt;v := reflect.ValueOf(i)
f := v.FieldByName("Type1")
v.SetPointer(unsafe(&amp;amp;Type1{})&lt;/p&gt;

&lt;p&gt;得到错误：
reflect: call of reflect.Value.SetPointer on zero Value&lt;/p&gt;

&lt;p&gt;谢谢各位的回帖，我的问题最终是这样的：&lt;/p&gt;

&lt;p&gt;package p1
type Type1 struct{
}
/&lt;em&gt;package p1 end&lt;/em&gt;/&lt;/p&gt;

&lt;p&gt;pckage p2
import "p1"
type Type2 struct{
 *p1.Type1
}&lt;/p&gt;

&lt;p&gt;我在用 FieldByName 查找 Type2 的匿名组合的指针时用的名字是"p1.Type1"，实际上不应该包含包名而直接用“Type1”查找就 OK 了。&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Fri, 06 Dec 2013 17:38:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/16043</link>
      <guid>https://ruby-china.org/topics/16043</guid>
    </item>
    <item>
      <title>用 open-uri 抓取网页</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#! /usr/local/bin/ruby&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'nokogiri'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'open-uri'&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;

&lt;span class="k"&gt;begin&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; 
    &lt;span class="c1"&gt;#Nokogiri::HTML(open("wwww.example.com/"))&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://www.example.com"&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="no"&gt;OpenURI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTPError&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
  &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;平均就 60 秒 100 多一点和浏览器比起来，简直就是龟速啊。有的站点，还会遇到 403 Forbidden。&lt;/p&gt;

&lt;p&gt;用 em-http-request 写了一个测试用例，感觉比 open-uri 还慢样&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#! /usr/local/bin/ruby&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'eventmachine'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'em-http'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'nokogiri'&lt;/span&gt;

&lt;span class="vi"&gt;@count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="vi"&gt;@topic_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sx"&gt;%w{14854 11168 14769 14875}&lt;/span&gt; 
&lt;span class="vi"&gt;@conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;EventMachine&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HttpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://www.ruby-china.org'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="no"&gt;EventMachine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="vi"&gt;@topic_ids.each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="ss"&gt;:redirects&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;:keepalive&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;:path&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="ss"&gt;:head&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;'accept'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'accept-encoding'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'gzip,deflate,sdch'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'accept-language'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'cache-control'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'max-age=0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'user-agent'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:path&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/topics/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;req1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@conn.get&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;
    &lt;span class="n"&gt;req1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;errback&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; 
      &lt;span class="vi"&gt;@count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="no"&gt;EventMachine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@topic_ids.length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="vi"&gt;@count&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;req1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;#doc = Nokogiri::HTML(req1.response)&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;req1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;response&lt;/span&gt;
      &lt;span class="vi"&gt;@count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="no"&gt;EventMachine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@topic_ids.length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="vi"&gt;@count&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>crazyjin</author>
      <pubDate>Sat, 19 Oct 2013 05:08:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/14854</link>
      <guid>https://ruby-china.org/topics/14854</guid>
    </item>
    <item>
      <title>哪一个 ajax 文件上传框架跨平台能力最好？</title>
      <description>&lt;p&gt;我正在做一个跨平台 web 应用。我希望它能适应从智能手机到平板到 pc。我用了 jquery、bootstrap。然后，我需要一个 ajax 文件功能，后台用 carrierwave，前端框架正在找。有没有满足跨平台需要的 ajax 文件上传框架呢？哪一个？求推荐。谢谢。。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第一个推荐：jQuery File Upload&lt;/strong&gt;
&lt;a href="https://github.com/blueimp/jQuery-File-Upload" rel="nofollow" target="_blank"&gt;https://github.com/blueimp/jQuery-File-Upload&lt;/a&gt;
对 pc 和 android 的支持都很好，ios 的支持欠缺了一点。Iphone4s 用的都还是 safari5.0。&lt;/p&gt;

&lt;p&gt;Desktop browsers&lt;/p&gt;

&lt;p&gt;The File Upload plugin is regularly tested with the latest browser versions and supports the following minimal versions:
Google Chrome
Apple Safari 4.0+
Mozilla Firefox 3.0+
Opera 11.0+
Microsoft Internet Explorer 6.0+
Mobile browsers&lt;/p&gt;

&lt;p&gt;The File Upload plugin has been tested with and supports the following mobile browsers:
Apple Safari on iOS 6.0+
Google Chrome on iOS 6.0+
Google Chrome on Android 4.0+
Default Browser on Android 2.3+
Opera Mobile 12.0+&lt;/p&gt;

&lt;p&gt;FEATUERS
Multiple file upload:
Drag &amp;amp; Drop support:
Upload progress bar:
Cancelable uploads:
Resumable uploads:
Chunked uploads:
Client-side image resizing:
Preview images, audio and video:
No browser plugins (e.g. Adobe Flash) required:
Graceful fallback for legacy browsers:
HTML file upload form fallback:
Cross-site file uploads:
Multiple plugin instances:
Customizable and extensible:
Multipart and file contents stream uploads:
Compatible with any server-side application platform:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第二个强大的存在：Fine Uploader&lt;/strong&gt;
&lt;a href="https://github.com/Widen/fine-uploader" rel="nofollow" target="_blank"&gt;https://github.com/Widen/fine-uploader&lt;/a&gt;
搞不懂为啥用的是 GPLv3，下载又要买 License。&lt;/p&gt;

&lt;p&gt;BROWSER SUPPORT
Does NOT require Flash, jQuery, or any external libraries.&lt;/p&gt;

&lt;p&gt;IE7+ (including IE10)
Firefox
Safari (OS X)
Chrome
IOS6
Android&lt;/p&gt;

&lt;p&gt;FEATURES
Multiple file select, progress bar
Drag-and-drop to upload
Cancel uploads
Auto and manual upload
Customizable failure messages
Auto/manual retry
Multiple built-in validation rules
Custom validation rules
Over a dozen possible callbacks
Send parameters with each file
Upload directories via drag &amp;amp; drop
Submit files via the API
File chunking/partitioning
Resume previously failed/interrupted files
Delete uploaded files
CORS (cross-origin) support
Paste to upload
Upload from mobile camera
Edit file names
Upload directly to Amazon S3&lt;/p&gt;</description>
      <author>crazyjin</author>
      <pubDate>Mon, 09 Sep 2013 16:05:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/13985</link>
      <guid>https://ruby-china.org/topics/13985</guid>
    </item>
  </channel>
</rss>
