<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>geekontheway</title>
    <link>https://ruby-china.org/geekontheway</link>
    <description>漫长的蜕变</description>
    <language>en-us</language>
    <item>
      <title>[西安] Web 后端开发工程师 13-26K 年终 bonus  五险一金</title>
      <description>&lt;p&gt;工作地点：西安雁塔区新长安广场&lt;/p&gt;

&lt;p&gt;投递简历：eGlhb2xpYW5nLnpoYW9AeWhsc29mdC5jb20=&lt;/p&gt;

&lt;p&gt;薪酬待遇：
 13-26K
 年终 bonus
 五险一金&lt;/p&gt;

&lt;p&gt;公司简介：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;西安垚海红树科技有限公司成立于 2012 年，是一家从事金融服务软件及应用开发的专业公司。&lt;/li&gt;
&lt;li&gt;公司总部位于美国芝加哥，在中国深圳、西安设有产品研发中心。&lt;/li&gt;
&lt;li&gt;公司主要产品 Advyzon 为独立财务顾问和注册投资顾问 (RIA) 提供全面、直观、基于云的财富管理技术，目前服务于 1,500 多家咨询公司&lt;/li&gt;
&lt;li&gt;Advyzon 集成平台包括可定制的绩效报告、灵活的计费、客户关系管理 (CRM)、可配置的客户 Web 门户、文档存储和商业智能。&lt;/li&gt;
&lt;li&gt;通过提供公司运营业务所需的所有关键功能，Advyzon 帮助顾问简化运营，使他们能够专注于发展业务。&lt;/li&gt;
&lt;li&gt;我们认为技术应该易于使用、创新并以卓越的客户服务为后盾，这是 Advyzon 成立的核心原则。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;岗位职责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;负责公司产品服务器端开发。&lt;/li&gt;
&lt;li&gt;持续对系统架构进行改造和优化；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;任职要求：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;本科以上学历，计算机相关专业；&lt;/li&gt;
&lt;li&gt;2 年以上 Ruby/C++/Java/.Net/Go 实际工作经验；&lt;/li&gt;
&lt;li&gt;熟悉 PostgreSQL, MySQL 数据库的开发、设计；&lt;/li&gt;
&lt;li&gt;持续代码重构和代码评审，有良好的代码书写和编程习惯及团队合作精神；&lt;/li&gt;
&lt;li&gt;有较强的责任心和学习能力，能承受一定的工作压力；&lt;/li&gt;
&lt;li&gt;独立工作能力强，能够高质量快速交付产品。&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>geekontheway</author>
      <pubDate>Mon, 18 Nov 2024 14:46:47 +0800</pubDate>
      <link>https://ruby-china.org/topics/43952</link>
      <guid>https://ruby-china.org/topics/43952</guid>
    </item>
    <item>
      <title>2024 年了，你还在使用其他高性能 Ruby 框架吗？</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/geekontheway/dd447efc-4af2-4ba4-b648-defac9ac20ae.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sinatra&lt;/li&gt;
&lt;li&gt;Roda&lt;/li&gt;
&lt;li&gt;Hanami-api&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果是做一些微服务，也不需要访问数据库，在不切换语言的前提下，是否这些框架也是更好的选择呢&lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Fri, 15 Mar 2024 20:14:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/43628</link>
      <guid>https://ruby-china.org/topics/43628</guid>
    </item>
    <item>
      <title>金数据表单嵌入方式，如何提交扩展属性？</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/5dcbe5483a46600d85824b4795636ff4.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;如图所示是金数据的扩展属性，我以 Script 的方式嵌入金数据表单到网页，配置如下：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://jinshuju.net/f/xxxxx/embedded.js?x_field_1=ARANDOMNUMBER&amp;amp;banner=show&amp;amp;background=white&amp;amp;height=1002&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而后提交的数据中，并未包含 x_field_1 值&lt;/p&gt;

&lt;p&gt;已提交工单但迟迟没有反馈，帮助中心中也没有相关问题&lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Thu, 04 Feb 2016 14:13:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/28950</link>
      <guid>https://ruby-china.org/topics/28950</guid>
    </item>
    <item>
      <title>grape 多个 version 抽取相同接口有没有 Best Practice?</title>
      <description>&lt;p&gt;如题，提供给 app 的接口，V1 和 V2 只是账号逻辑稍有修改，不需要写两处重复的代码吧？
我目前想到的是在 V1,V2 中单独进行账号逻辑的处理，具体接口 mount 进来。&lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Tue, 28 Jul 2015 16:13:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/26677</link>
      <guid>https://ruby-china.org/topics/26677</guid>
    </item>
    <item>
      <title>Rails 如何正确读取银联私钥证书 PFX?</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/f4cbf32cfcab6510eca8833f338dd50d.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;如上图，下载得到的证书是一个.pfx 文件，通过命令可以转为 pem 文件：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openssl pkcs12 -in union_pay.pfx -out union_pay_cert.pem -nodes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;读取这个 pem 文件中的 PRIVATE KEY 部分，保存到 PRIVATEKEY 常量中。&lt;/p&gt;

&lt;p&gt;在 Rails 中&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sign = Base64.encode64(OpenSSL::PKey::RSA.new(PRIVATEKEY).sign('sha1', data.force_encoding("utf-8"))).gsub("\n", "")
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将此签名，连同其他参数，一起返回给银联，返回错误信息如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[9100004]Signature verification failed

&lt;/code&gt;&lt;/pre&gt;</description>
      <author>geekontheway</author>
      <pubDate>Thu, 16 Apr 2015 14:28:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/25168</link>
      <guid>https://ruby-china.org/topics/25168</guid>
    </item>
    <item>
      <title>者也已经关闭了吗？</title>
      <description>&lt;p&gt;目测 zheye 代码一年没有更新了，zheye.org 也无法访问&lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Sat, 12 Jan 2013 13:54:47 +0800</pubDate>
      <link>https://ruby-china.org/topics/8016</link>
      <guid>https://ruby-china.org/topics/8016</guid>
    </item>
    <item>
      <title>[oauth2] 淘宝卖家应用如何正确刷新 refresh_token?</title>
      <description>&lt;p&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TaobaoAppToken&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;attr_accessible&lt;/span&gt; &lt;span class="ss"&gt;:access_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:refresh_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:last_refresh_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:refresh_token_last_refresh_at&lt;/span&gt; 

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_or_refresh!&lt;/span&gt;
      &lt;span class="n"&gt;refresh_token_refresh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt; &lt;span class="o"&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;refresh_token_last_refresh_at&lt;/span&gt; 
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;refresh_token_refresh&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="c1"&gt;#1 hours&lt;/span&gt;
      &lt;span class="n"&gt;base_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://oauth.taobao.com/token?"&lt;/span&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="ss"&gt;client_id: &lt;/span&gt;&lt;span class="no"&gt;Setting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;taobao_app_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="ss"&gt;client_secret: &lt;/span&gt;&lt;span class="no"&gt;Setting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;taobao_app_secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                  &lt;span class="ss"&gt;grant_type: &lt;/span&gt;&lt;span class="s1"&gt;'refresh_token'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="ss"&gt;refresh_token: &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;refresh_token&lt;/span&gt;             
                  &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;to_params&lt;/span&gt;       

      &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;HTTParty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;parsed_response&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'access_token'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;present?&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;update_attributes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;access_token: &lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'access_token'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="ss"&gt;last_refresh_at: &lt;/span&gt;&lt;span class="no"&gt;Time&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="ss"&gt;refresh_token: &lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'refresh_token'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="ss"&gt;refresh_token_last_refresh_at: &lt;/span&gt;&lt;span class="no"&gt;Time&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="k"&gt;else&lt;/span&gt; 
        &lt;span class="no"&gt;Notifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;app_token_errors&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="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;deliver&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;     
      &lt;span class="k"&gt;end&lt;/span&gt;   
    &lt;span class="k"&gt;end&lt;/span&gt; 
&lt;span class="k"&gt;end&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每天会请求 12 次刷新，每次刷新都能获取到新的 acess_token 和 refresh_token, 但是认证一天后还是会提示 refresh_token 过期&lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Sun, 14 Oct 2012 22:07:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/6057</link>
      <guid>https://ruby-china.org/topics/6057</guid>
    </item>
    <item>
      <title>关于 Assets Pipeline 的使用场景和技巧</title>
      <description>&lt;ol&gt;
&lt;li&gt;现在有一个项目是部署在 windows2008 的 (客户指定这个服务器)，所以每次修改了 assets 都是在本地执行 rake assets:precompile 做一个 commit，push 到部署分支之后在服务器上 git pull 下来，每次编译 assets 都得不少时间，不知道大家有没有更好的方法？&lt;/li&gt;
&lt;li&gt;如果服务是是 linux 环境，大家是本地编译呢，还是使用 capistrano 部署的时候编译？Ryanb 在 RailsCasts 中也介绍了本地编译之后 Rsync 到服务器，哪种更有优势？&lt;/li&gt;
&lt;li&gt;之前有一个项目是 REE+Rails 2.3 的，没有 assets，静态文件是放在 public 下的。除了 ruby 和 rails 的版本原因之外，有不使用 assets 的场景或者更好的静态文件处理方法吗？&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>geekontheway</author>
      <pubDate>Thu, 19 Apr 2012 11:55:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/2717</link>
      <guid>https://ruby-china.org/topics/2717</guid>
    </item>
    <item>
      <title>部署 rails 使用 Passenger Standalone 如何重启</title>
      <description>&lt;p&gt;我的状况是 Passenger Standalone + Apache2[proxy,proxy-http]&lt;/p&gt;

&lt;p&gt;所以&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$cd&lt;/span&gt;  /var/rails/appname/current 
&lt;span class="nv"&gt;$passenger&lt;/span&gt; start &lt;span class="nt"&gt;-a&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;-p&lt;/span&gt; 3001 &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; production

&lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;out] &lt;span class="o"&gt;===============&lt;/span&gt; Phusion Passenger Standalone web server started &lt;span class="o"&gt;===============&lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;out] PID file: /var/rails/appname/releases/20120224113430/tmp/pids/passenger.3001.pid
&lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;out] Log file: /var/rails/appname/releases/20120224113430/log/passenger.3001.log
&lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;out] Environment: production
&lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;out] Accessible via: http://127.0.0.1:3001/
&lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;out] Serving &lt;span class="k"&gt;in &lt;/span&gt;the background as a daemon.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 deploy.rb 中&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;
 &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:roles&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:app&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"touch &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/restart.txt"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"Restart Application"&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:restart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:roles&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:app&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"touch &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/restart.txt"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每次部署后会发现线上的页面不是最新的 (passenger 没有成功重启)，要上服务器手动重启，所以修改部署脚本：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"Restart Application"&lt;/span&gt;
&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:restart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:roles&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:app&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

  &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"cd &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;previous_release&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"appname_pid=$(cat tmp/pids/passenger.3001.pid)"&lt;/span&gt;
  &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"kill $appname_pid"&lt;/span&gt;

  &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"cd &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"passenger start -a 127.0.0.1 -p 3001 -d -e production"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会提示找不到文件&lt;code&gt;passenger.3001.pid&lt;/code&gt;,指定一个 PID 文件位置 start/stop/restart 应该就可以了，还没尝试。不知道大家有没有更好的方法。&lt;/p&gt;

&lt;p&gt;Anyway，过段时间可能要换 unicorn，应该会用 god 去监视 Passenger/unicorn&lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Sat, 25 Feb 2012 00:17:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/1410</link>
      <guid>https://ruby-china.org/topics/1410</guid>
    </item>
    <item>
      <title>[closed] 怎么修改 inherited_resources 的 collection 默认排序</title>
      <description>&lt;p&gt;In my DownloadsController, i wrote:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="kp"&gt;protected&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;collection&lt;/span&gt;
&lt;span class="vi"&gt;@downloads&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="n"&gt;end_of_association_chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;order_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:published_at&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But it seems not work.&lt;/p&gt;

&lt;p&gt;Any one could help me?Very thanks!  &lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Mon, 20 Feb 2012 19:06:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/1308</link>
      <guid>https://ruby-china.org/topics/1308</guid>
    </item>
    <item>
      <title>rails-settings-cached 相关问题</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;,最近在项目制作一个 gem，要用到 rails-settings-cached，所以在 gemspec 中
&lt;code&gt;s.add_dependency "rails-settings-cached"&lt;/code&gt;
以及在 lib/engine.rb 中添加&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"rails-settings"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后引用我们这个 gem 制作新项目的时候，会提示：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;no such file to load &lt;span class="nt"&gt;--&lt;/span&gt; rails-settings
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果改为在 lib/engine.rb 中&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"rails-settings-cached"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;又会报错&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;no such file to load &lt;span class="nt"&gt;--&lt;/span&gt; rails-settings-cached
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后来反应过来是需要在我的 Gem 项目中 bundle install，果然 OK 了&lt;/p&gt;

&lt;p&gt;所以问题是：require "rails-settings"和 require "rails-settings-cached"都可以，但是修改了 gemspec 和 engine.rb 之后必须 bundle install?&lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Thu, 16 Feb 2012 20:41:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/1244</link>
      <guid>https://ruby-china.org/topics/1244</guid>
    </item>
    <item>
      <title>devise 可以使用用户名和邮箱登陆出错 ，各位看看是什么原因</title>
      <description>&lt;p&gt;错误信息&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Started POST &lt;span class="s2"&gt;"/admins/sign_in"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;127.0.0.1 at 2012-02-08 10:56:11 +0800
Processing by Devise::SessionsController#create as HTML
Parameters: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"utf8"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"✓"&lt;/span&gt;, &lt;span class="s2"&gt;"authenticity_token"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2EGtbBAvYheW53Bxx6VEK3vqyE6FjlF7obbhKGhLNJE="&lt;/span&gt;, &lt;span class="s2"&gt;"login"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"magic@host.com"&lt;/span&gt;, &lt;span class="s2"&gt;"admin"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"[FILTERED]"&lt;/span&gt;&lt;span class="o"&gt;}}&lt;/span&gt;
Completed 401 Unauthorized &lt;span class="k"&gt;in &lt;/span&gt;6ms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;admin.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;attr_accessible&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:password_confirmation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:remember_me&lt;/span&gt;
&lt;span class="nb"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:login&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_for_database_authentication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;warden_conditions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conditions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;warden_conditions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dup&lt;/span&gt;
    &lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:login&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;"lower(username) = :value OR lower(email) = :value"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:value&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&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;first&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="kp"&gt;protected&lt;/span&gt;

  &lt;span class="c1"&gt;# Attempt to find a user by it's email. If a record is found, send new&lt;/span&gt;
  &lt;span class="c1"&gt;# password instructions to it. If not user is found, returns a new user&lt;/span&gt;
  &lt;span class="c1"&gt;# with an email not found error.&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_reset_password_instructions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="n"&gt;recoverable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find_recoverable_or_initialize_with_errors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reset_password_keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:not_found&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;recoverable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_reset_password_instructions&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;recoverable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;persisted?&lt;/span&gt;
    &lt;span class="n"&gt;recoverable&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_recoverable_or_initialize_with_errors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;required_attributes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ss"&gt;:invalid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;case_insensitive_keys&lt;/span&gt; &lt;span class="o"&gt;||&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;k&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;attributes&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="nf"&gt;try&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:downcase!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;attributes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;required_attributes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete_if&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&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;required_attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has_key?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:login&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:login&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&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;unless&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;
      &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;

      &lt;span class="n"&gt;required_attributes&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;key&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;record&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;key&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="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ss"&gt;:blank&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;record&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;"username = :value OR email = :value"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:value&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;}]).&lt;/span&gt;&lt;span class="nf"&gt;first&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;View&lt;/p&gt;
&lt;pre class="highlight erb"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"admin_login"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"login"&lt;/span&gt; &lt;span class="na"&gt;size=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"validate[required]"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"admin_password"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"admin[password]"&lt;/span&gt; &lt;span class="na"&gt;size=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"validate[required]"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;devise.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;authentication_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="ss"&gt;:login&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>geekontheway</author>
      <pubDate>Wed, 08 Feb 2012 11:32:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/1080</link>
      <guid>https://ruby-china.org/topics/1080</guid>
    </item>
    <item>
      <title>使用 foreman 启动 ruby-china </title>
      <description>&lt;p&gt;fork 了 ruby-china 的源码后，要使用的话，得启动 mongod/redis-server/thin，借助 foreman 可以简化这个配置，并且还有更多强大的功能，比如 export 到 init 或者 bluepill,upstart.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Procfile&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;redis:  redis-server&lt;/code&gt;
&lt;code&gt;worker: bundle exec rake environment resque:work QUEUE=*&lt;/code&gt;
&lt;code&gt;db:     mongod&lt;/code&gt;
&lt;code&gt;web:    bundle exec thin start -p $PORT&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;在我电脑上的运行效果&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;~/fisheye/ruby-china:master$ foreman start&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;19:43:48 redis.1   | started with pid 25261&lt;/code&gt;
&lt;code&gt;19:43:48 worker.1  | started with pid 25262&lt;/code&gt;
&lt;code&gt;19:43:48 db.1      | started with pid 25263&lt;/code&gt;
&lt;code&gt;19:43:48 web.1     | started with pid 25264&lt;/code&gt;
&lt;code&gt;........&lt;/code&gt;  &lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Mon, 16 Jan 2012 20:00:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/875</link>
      <guid>https://ruby-china.org/topics/875</guid>
    </item>
    <item>
      <title>部署 Rails 应用时出错,大家来看看出错原因，谢谢！</title>
      <description>&lt;p&gt;#cap deploy：cold 的时候报错&lt;/p&gt;

&lt;p&gt;mysql2::Error: Invalid default value for 'country': CREATE TABLE &lt;code&gt;ship_addresses&lt;/code&gt; (&lt;code&gt;id&lt;/code&gt; int(11) DEFAULT NULL auto_increment PRIMARY KEY, &lt;code&gt;user_id&lt;/code&gt; int(11), &lt;code&gt;country&lt;/code&gt; varchar(255) DEFAULT '中国', &lt;code&gt;state&lt;/code&gt; varchar(255), &lt;code&gt;city&lt;/code&gt; varchar(255), &lt;code&gt;district&lt;/code&gt; varchar(255), &lt;code&gt;address&lt;/code&gt; varchar(255), &lt;code&gt;contact_name&lt;/code&gt; varchar(255), &lt;code&gt;mobile&lt;/code&gt; varchar(255), &lt;code&gt;telephone&lt;/code&gt; varchar(255), &lt;code&gt;memo&lt;/code&gt; varchar(255), &lt;code&gt;created_at&lt;/code&gt; datetime, &lt;code&gt;updated_at&lt;/code&gt; datetime) ENGINE=InnoDB&lt;/p&gt;

&lt;p&gt;服务器环境是 ubuntu10.04
服务器上/etc/default/locale 中的编码设置是 LANG="en_US.UTF-8"
/etc/mysql/my/cnf中已经设置了utf8编码
·［client］
default-character-set=utf8
·［mysqld］
default-character-set=utf8&lt;/p&gt;

&lt;p&gt;mysql&amp;gt; show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
#
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+&lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Tue, 13 Dec 2011 15:36:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/464</link>
      <guid>https://ruby-china.org/topics/464</guid>
    </item>
    <item>
      <title>关于 Linode 上 RVM 的奇怪问题，每次 ssh 登陆服务器后，发现 rvm 并未选择 ruby 版本，即使上次登陆的时候`rvm --default use ree`</title>
      <description>&lt;p&gt;如题。不过另一台 linode 上的 rvm 工作正常。&lt;/p&gt;

&lt;p&gt;&lt;a href="/update" class="user-mention" title="@update"&gt;&lt;i&gt;@&lt;/i&gt;update&lt;/a&gt; at 10:56 &lt;/p&gt;

&lt;p&gt;另外一台 linode 也是这样&lt;/p&gt;

&lt;p&gt;.......&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root@li389-178:~# rvm list

rvm rubies

   ree-1.8.7-2011.03 [ i686 ]

root@li389-178:~# ruby --version
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2011.03


root@li380-16:~# rvm list

rvm rubies

   ruby-1.9.2-p290 [ i386 ]
   ree-1.8.7-2011.03 [ i386 ]

root@li380-16:~# which rvm
/usr/local/rvm/bin/rvm
root@li380-16:~# which ruby
/usr/local/rvm/bin/ruby
root@li380-16:~# ruby --version
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2011.03
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>geekontheway</author>
      <pubDate>Wed, 07 Dec 2011 08:59:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/386</link>
      <guid>https://ruby-china.org/topics/386</guid>
    </item>
    <item>
      <title>有用 graylog2 做日志系统的吗?分享一下经验</title>
      <description>&lt;p&gt;如果我在用 graylog2 做日志服务器，部署在其他服务器上的 rails 项目以及在其他计算机上开发/测试中的 rails 项目怎么发送 gelf 日志到 graylog2？设置 graylog2 服务器的 iptables，还是 tcpd，或者是采用其他协议，比如 AMQP?  &lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Sun, 04 Dec 2011 23:10:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/352</link>
      <guid>https://ruby-china.org/topics/352</guid>
    </item>
    <item>
      <title>用 jekyll 和 Octopress 做博客的都进了分享一下哈</title>
      <description>&lt;p&gt;我刚开始用的是 jekyll 做 github pages，后来发现 Octopress 更方便，不过配置稍微复杂一点，不过貌似没有 jekyll 有更高的自由度，大家觉得呢？&lt;/p&gt;

&lt;p&gt;我的博客：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekontheway.github.io" rel="nofollow" target="_blank" title=""&gt;geekontheway&lt;/a&gt;&lt;/p&gt;</description>
      <author>geekontheway</author>
      <pubDate>Sun, 04 Dec 2011 23:01:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/351</link>
      <guid>https://ruby-china.org/topics/351</guid>
    </item>
  </channel>
</rss>
