<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>RainFlying</title>
    <link>https://ruby-china.org/RainFlying</link>
    <description>rainflying</description>
    <language>en-us</language>
    <item>
      <title>[已解决] gem 提示 ENOLOCK</title>
      <description>&lt;p&gt;刚装的 rbenv + ruby 2.1.3
gem search -r compass 的日志&lt;/p&gt;

&lt;p&gt;&lt;a href="https://clbin.com/nplXg" rel="nofollow" target="_blank"&gt;https://clbin.com/nplXg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;gem sources -a '&lt;a href="https://ruby.taobao.org" rel="nofollow" target="_blank"&gt;https://ruby.taobao.org&lt;/a&gt;' 的日志：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://clbin.com/lzZWX" rel="nofollow" target="_blank"&gt;https://clbin.com/lzZWX&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;系统是 SLES 11.3
ulimit 的输出&lt;/p&gt;

&lt;p&gt;$ ulimit -a
core file size          (blocks, -c) 1
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 385978
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) 42004192
open files                      (-n) 131070
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 385978
virtual memory          (kbytes, -v) 41211120
file locks                      (-x) unlimited&lt;/p&gt;

&lt;p&gt;问题会是在哪里？&lt;/p&gt;

&lt;p&gt;_rubygems._tcp.ruby.taobao.org  这是我用了好几个 DNS Server 都解析不出来，
后来在 DNS Cache 里人肉做了绑定，一样的结果。
$ dig _rubygems._tcp.ruby.taobao.org +short
223.6.253.37&lt;/p&gt;

&lt;p&gt;更新：
后来想起 home 目录是从另外一台服务器上挂载过来的
登录到 NFS Server 检查系统日志，发现有  lockd: cannot monitor **** 的日志。
检查 /var/lib/nfs/stated/sm 和 /var/lib/nfs/stated/sm.bak 都是空，不存在结构损坏的问题。
在重启 rpcbind 和 nfslock 服务之后问题依旧，
后重启 nfs 服务，问题解决。
应该是 gem 安装的时候需要 lock 一些文件，因为是 NFS 挂载过来的，
所以 lock 请求发送到 NFS 服务器，但是因为 lockd 响应不正常，
所以 gem 一直等待着加锁完成直到超时。&lt;/p&gt;</description>
      <author>RainFlying</author>
      <pubDate>Tue, 23 Dec 2014 14:03:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/23357</link>
      <guid>https://ruby-china.org/topics/23357</guid>
    </item>
    <item>
      <title>圡人终于进城了</title>
      <description>&lt;p&gt;背上 20 公斤，左手 12+ 公斤，
右手提着一个 Dell UltraSharp U2311H,
直接杀到贵大魔都了。&lt;/p&gt;</description>
      <author>RainFlying</author>
      <pubDate>Sun, 13 Oct 2013 18:40:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/14716</link>
      <guid>https://ruby-china.org/topics/14716</guid>
    </item>
    <item>
      <title>今天才知道 @yedingding 是谁</title>
      <description>&lt;p&gt;原来就是 88 上的 sishen&lt;/p&gt;</description>
      <author>RainFlying</author>
      <pubDate>Fri, 11 Oct 2013 13:50:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/14670</link>
      <guid>https://ruby-china.org/topics/14670</guid>
    </item>
    <item>
      <title>使用 Capybara 跟直接使用浏览器有什么区别？</title>
      <description>&lt;p&gt;使用 Capybara 提供的一些方法进行登录，比如&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;fill_in&lt;/span&gt; &lt;span class="s2"&gt;"Email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;with: &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;
&lt;span class="n"&gt;fill_in&lt;/span&gt; &lt;span class="s2"&gt;"Password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;with: &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;password&lt;/span&gt;
&lt;span class="n"&gt;click_button&lt;/span&gt; &lt;span class="s2"&gt;"Sign in"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个跟在浏览器里手动填表然后点击“Sign in”有什么区别？&lt;/p&gt;

&lt;p&gt;更新一下问题。
问题来自于 Rails Tutorial 里的 Sample App。
&lt;a href="http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#sec-requiring_signed_in_users" rel="nofollow" target="_blank"&gt;http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#sec-requiring_signed_in_users&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;spec/requests/authentication_pages_spec.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="s1"&gt;'spec_helper'&lt;/span&gt;

&lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Authentication"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;
  &lt;span class="nf"&gt;.&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;
  &lt;span class="nf"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"authorization"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="nf"&gt;.&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="nf"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"as wrong user"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:wrong_user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;email: &lt;/span&gt;&lt;span class="s2"&gt;"wrong@example.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;sign_in&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;no_capybara: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"visiting Users#edit page"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;visit&lt;/span&gt; &lt;span class="n"&gt;edit_user_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wrong_user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;should_not&lt;/span&gt; &lt;span class="n"&gt;have_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Edit user'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;

      &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"submitting a PATCH request to the Users#update action"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;patch&lt;/span&gt; &lt;span class="n"&gt;user_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wrong_user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;specify&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;expect&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;to&lt;/span&gt; &lt;span class="n"&gt;redirect_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="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;spec/support/utilities.rb&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;sign_in&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&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="k"&gt;if&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;:no_capybara&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="c1"&gt;# Sign in when not using Capybara&lt;/span&gt;
    &lt;span class="n"&gt;remember_token&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;new_remember_token&lt;/span&gt;
    &lt;span class="n"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:remember_token&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;remember_token&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:remember_token&lt;/span&gt;&lt;span class="p"&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;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;remember_token&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;visit&lt;/span&gt; &lt;span class="n"&gt;signin_path&lt;/span&gt;
    &lt;span class="n"&gt;fill_in&lt;/span&gt; &lt;span class="s2"&gt;"Email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;with: &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;
    &lt;span class="n"&gt;fill_in&lt;/span&gt; &lt;span class="s2"&gt;"Password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;with: &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;password&lt;/span&gt;
    &lt;span class="n"&gt;click_button&lt;/span&gt; &lt;span class="s2"&gt;"Sign in"&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;暂时先无视原文里 FactoryGirl 的错误，这个不是问题的所在。
把 &lt;code&gt;before { sign_in user, no_capybara: true }&lt;/code&gt; 换成 &lt;code&gt;before { sign_in user }&lt;/code&gt;,
浏览器里跳转是正常的，会跳到 root_url,
但是 rspec 里会有这样的错误&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Failures:&lt;/p&gt;

&lt;p&gt;1) AuthenticationPages authorization as wrong user submitting a PATCH request to the Users#update action
    Failure/Error: specify { expect(response).to redirect_to(root_url) }
      Expected response to be a redirect to &lt;a href="http://www.example.com/" rel="nofollow" target="_blank"&gt;http://www.example.com/&lt;/a&gt; but was a redirect to &lt;a href="http://www.example.com/signin" rel="nofollow" target="_blank"&gt;http://www.example.com/signin&lt;/a&gt;.
      Expected "&lt;a href="http://www.example.com/" rel="nofollow" target="_blank"&gt;http://www.example.com/&lt;/a&gt;" to be === "&lt;a href="http://www.example.com/signin" rel="nofollow" target="_blank"&gt;http://www.example.com/signin&lt;/a&gt;".
    # ./spec/requests/authentication_pages_spec.rb:85:in `block (5 levels) in '&lt;/p&gt;

&lt;p&gt;Finished in 5.81 seconds
76 examples, 1 failure, 3 pending&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>RainFlying</author>
      <pubDate>Thu, 05 Sep 2013 23:27:03 +0800</pubDate>
      <link>https://ruby-china.org/topics/13913</link>
      <guid>https://ruby-china.org/topics/13913</guid>
    </item>
    <item>
      <title>从 RVM 到 rbenv 失败</title>
      <description>&lt;p&gt;Debian 上早用 rbenv 了的，
昨天尝试把 OS X 上的 RVM 也换成 rbenv 
结果编译 ruby 2.0.0-p195 失败了，
ruby 2.0.0-p0 是没问题的…&lt;/p&gt;</description>
      <author>RainFlying</author>
      <pubDate>Sat, 25 May 2013 16:36:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/11229</link>
      <guid>https://ruby-china.org/topics/11229</guid>
    </item>
  </channel>
</rss>
