<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>sefier (唐明星)</title>
    <link>https://ruby-china.org/sefier</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Rails 没落了吗？为什么我们的社区如此冷清？</title>
      <description>&lt;p&gt;7 年前，我从一个饱受 PHP 奇葩语言特性折磨的程序员，接触到了 Rails，让我脱离苦海。写的代码从此不再 ugly，最佳实践更是让我觉得是网站开发的至尊法宝。&lt;/p&gt;

&lt;p&gt;7 年之间，虽然 Rails 只能用来做网站，核心业务都是 Java 开发。但我给公司内部做的上万并发的在线平台都是 Rails 做的。&lt;/p&gt;

&lt;p&gt;7 年前刚开始接触 Ruby 就是在这个社区，感觉欣欣向荣。最近我回到社区，再看看，发现几乎没人说话了，更严重的是，大家都在扯淡，技术型的文章几乎没有。再看看社区用户数，几无增长，而之前熟悉的面孔也越来越少。&lt;/p&gt;

&lt;p&gt;发生了什么？是 Rails 没落了，还是中国的社区没落了，还是 Rails 的使用者人过中年，已经垂垂老矣，不愿活跃在社区。&lt;/p&gt;</description>
      <author>sefier</author>
      <pubDate>Tue, 30 Jun 2020 15:29:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/40083</link>
      <guid>https://ruby-china.org/topics/40083</guid>
    </item>
    <item>
      <title>使用 Capistrano 部署，时间超长，原因是什么？</title>
      <description>&lt;p&gt;最近一年没用 rails，最近一个小项目，上了 rails，把环境搭建了一遍，采用 Rails 6.0 + Mysql 8.0 + Ruby 2.6.3，部署上线。发现 Capistrano 部署极慢，哪怕没做任何资源文件的修改，也要很长时间。卡在了 deploy:assets:precompile 上面，这是什么原因，如何避免？&lt;/p&gt;

&lt;p&gt;比如下面这个，居然耗时接近 500S&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/02f4f3b6-be5a-466b-bcd7-406904d82810.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>sefier</author>
      <pubDate>Sun, 28 Jun 2020 20:49:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/40039</link>
      <guid>https://ruby-china.org/topics/40039</guid>
    </item>
    <item>
      <title>用 Rails 写 API 服务，性能感觉不足，怎么办？</title>
      <description>&lt;p&gt;我有一个 Rails 5 的 Web 项目，同时有三个 API 接口，我就直接写到 rails controller 里面，返回 json 结果了。这个方案最简单，但是随着 api 调用达到 2 万的 rps 之后，性能急剧下降。&lt;/p&gt;

&lt;p&gt;我没做仔细评估，考虑到数据库压力，所以首先是改写了接口的实现，全部数据都采取读写 redis 的方式，然后异步更新到数据库中。这个方案实现后，性能确实很大提升，但是速度依然难以接受。我查看 new relic，发现非数据库非 redis 的底层占用时间巨大，是服务器性能不足吗？服务器集群已经加到 150 台了，有点不理智了。&lt;/p&gt;

&lt;p&gt;这种情况该怎么办？有没有剥离 api 的好办法？因为毕竟跟 rails web 的基础项目有一定的关联，是不是要换个框架专门写 api，还是换一种语言来做？&lt;/p&gt;

&lt;p&gt;谢谢。&lt;/p&gt;</description>
      <author>sefier</author>
      <pubDate>Tue, 25 Jul 2017 13:31:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/33620</link>
      <guid>https://ruby-china.org/topics/33620</guid>
    </item>
    <item>
      <title>论坛打赌，请众位大神来评判</title>
      <description>&lt;p&gt;因为这个问题论述开来就仁者见仁智者见智了，所以我们做以下约定，仅从双方的字面意思来看，你支持左边还是右边？&lt;/p&gt;

&lt;p&gt;规则：
请言明是支持左边还是右边，且在这个赌结束之前不得展开论述，以免干扰其他人判断&lt;/p&gt;

&lt;p&gt;截止时间点：2015 年 11 月 1 日中午 12 点（即在这个时间点之前回的帖子，明确表明了自己的态度支持左边还是右边的）&lt;/p&gt;

&lt;p&gt;最终结果以双方支持的数量多寡为标准&lt;/p&gt;

&lt;p&gt;双方的论断如下：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/70f29d4048eb386dfb2594bc13aef3ad.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/ea6ca79c5962c329d1c1266483243dbe.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>sefier</author>
      <pubDate>Sat, 31 Oct 2015 00:51:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/27901</link>
      <guid>https://ruby-china.org/topics/27901</guid>
    </item>
    <item>
      <title>在三线城市，如何选择开发语言？</title>
      <description>&lt;p&gt;因为自己是安徽人，回到合肥，所在公司准备组建一个网站开发团队，但是发现本地 ruby 工程师太少，在此提出两个问题：&lt;/p&gt;

&lt;p&gt;1）希望有合肥的 ruby 工程师跟我联系，小圈子抱团取暖吧，然后看看有没有机会合作（不知道我是不是合肥唯一一个全职的 ruby 工程师）&lt;/p&gt;

&lt;p&gt;2）如果 ruby 团队找人困难，该怎样选择开发语言？Java 的 Play! 还是 PHP（不得不说 PHP 的坑太多了）&lt;/p&gt;

&lt;p&gt;困顿至极，希望大家多多指教。&lt;/p&gt;</description>
      <author>sefier</author>
      <pubDate>Fri, 09 Oct 2015 18:11:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/27604</link>
      <guid>https://ruby-china.org/topics/27604</guid>
    </item>
    <item>
      <title>～三年 web 经验，～9 个月 Ruby 经验，求远程兼职或外包</title>
      <description>&lt;p&gt;目前工资不高，为了增加收入，希望能够接一些外包或者兼职做，长期短期均可。如果有经验的兄弟，请帮帮忙，谢谢，我的情况如下：&lt;/p&gt;

&lt;p&gt;简历：
2011 年 5 月毕业（211+985 高校，软件工程）
2011 年 5 月 -2013 年 5 月 PHP 工程师
2013 年 5 月 -2013 年 11 月 辞职，专心自学 Ruby 和 Rails
2013 年 11 月 -2014 年 2 月 Ruby on Rails 工程师&lt;/p&gt;

&lt;p&gt;技能：
一、Ruby on Rails
二、Mysql 和 Postgresql
三、基本掌握 HTML/CSS+Jquery+Bootstrap
四、较为熟练的简单运维能力&lt;/p&gt;

&lt;p&gt;个人能力：
一、英文能力较优，不封闭（Stackoverflow 和 Github 都经常逛）
二、有尚可的自学能力&lt;/p&gt;

&lt;p&gt;时间：
远程兼职或外包，每周晚上 8 点 -12 点，周六周日全天（公司偶尔有加班，目前不是很多），每周能保证 40 个工时。&lt;/p&gt;</description>
      <author>sefier</author>
      <pubDate>Fri, 07 Feb 2014 20:57:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/17105</link>
      <guid>https://ruby-china.org/topics/17105</guid>
    </item>
    <item>
      <title>Zeus：将 rails s,rails c 和 rspec 的速度提高 40 倍，Spork 可以弃用了</title>
      <description>&lt;p&gt;在使用 Spork 进行测试的过程中，因为我们的 api 放在 lib 目录下，而 spork 不会重新加载 lib 目录，在 Stackoverflow 上一番搜索，决定吧测试环境的 cache_class=false，问题解决，但这个配置显然大幅降低速度。&lt;/p&gt;

&lt;p&gt;而这个 Stackoverflow 的回答者，今年 8 月份更新了答案，提出新方案为使用 Zeus+GC-patch 1.9.3，这是啥玩意？不用不知道，一用吓一跳，我之前启动 Rails c 和 Rails s 要 22 秒，用了这个方案之后，大幅降低为 0.5 秒！测试就更不用说了，不仅速度快，而且不像 spork 那样写到 Gemfile，也不需要更改 spec_helper.rb，直接安装在本地使用！&lt;/p&gt;

&lt;p&gt;具体的可以参考文档：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://zaiste.net/2012/08/rails_dev_speed_up_from_spork_to_zeus/" rel="nofollow" target="_blank"&gt;http://zaiste.net/2012/08/rails_dev_speed_up_from_spork_to_zeus/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这个 GC-Patch 已经集成到 2.0 了，所以只适合 1.9.3 的用户，2.0 的可以不用安装。如果在安装的时候遇到运行错误：Patch 'falcon' not found，说明你的版本太高了，参考：&lt;a href="http://astrails.com/blog/2012/11/13/rvm-install-patched-ruby-for-faster-rails-startup" rel="nofollow" target="_blank"&gt;http://astrails.com/blog/2012/11/13/rvm-install-patched-ruby-for-faster-rails-startup&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;是否存在 bug 等，还没测试。&lt;/p&gt;

&lt;p&gt;最后弱弱地问一句：我 out 了吗？&lt;/p&gt;</description>
      <author>sefier</author>
      <pubDate>Wed, 25 Dec 2013 18:02:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/16422</link>
      <guid>https://ruby-china.org/topics/16422</guid>
    </item>
    <item>
      <title>分析 Ruby 代码的执行环境</title>
      <description>&lt;p&gt;最近阅读《Ruby 元编程》收益良多，对 Ruby 代码的执行，在理论上得到了更深的认识，这里，粗略地总结一下 Ruby 代码的执行环境。&lt;/p&gt;

&lt;p&gt;这个总结只是初步的一些结论，许多特殊情况或者例外，可能被我忽略了，而造成了结论其实不正确，如果您发现了，不妨指出；另外，一些术语是我自己总结的，不一定符合惯例。&lt;/p&gt;

&lt;p&gt;以下是正文。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;什么是 Ruby 代码的执行环境？Ruby 是一种比较严格的单步解释型语言，每一行代码的执行，在不同的环境下结果显然不同，例如&lt;code&gt;puts a&lt;/code&gt;，这个 a 存在么？是什么？导致的结果显然不一样，一般把这种环境称之为 binding。我认为，完整的执行环境，包括两大类五个方面：&lt;/p&gt;

&lt;p&gt;第一类：scope，它包括
1）当前对象，也就是 self 所指代的对象，决定了在不指明 receiver 的情况下，默认的接受者，也决定了实例变量（就是@打头的变量）存在于那个对象之中
2）局部变量池（我自己发明的），就是已经存在的局部变量及其值&lt;/p&gt;

&lt;p&gt;第二类：level，它包括
1）当前类，也就是用 def 定义方法时，这个方法作为哪个类的实例方法？
2）常量所属的目录（要把常量理解为目录和文件一样的东西，类和模块是目录同时也是文件，其他普通常量就是文件）
3）类变量（也就是@@打头的变量）所属的类，也就是使用类变量时，理解为哪个类？&lt;/p&gt;

&lt;p&gt;下面的问题是，如何分析一段代码的上述 5 个方面？这个需要分为两个步骤：一个是初始状态，另外一个是这种状态如何改变。&lt;/p&gt;

&lt;p&gt;初始状态，也就是 Ruby 代码最开始执行时，没有切换 scope 和 level 时，5 个方面的初始状况，分别是：
1）当前对象是一个名为“main”的 Object 实例对象，这个 main 只是一个普通的名称而已，其实就是实例化 Object 之后，覆盖了 to_s 方法返回“main”
2）局部变量池为空
3）当前类是 Object
4）当前常量目录是::
5）当前类变量所属的类是 Object&lt;/p&gt;

&lt;p&gt;了解了初始状态后，我们就知道，在初始状态执行代码的环境了。那么，scope 和 level 是如何变化的呢？
1.在使用 module,class,def 关键字定义模块，类，方法时（以及用 end 退出时），切换 scope，具体的规则是：
在 module/clsss 定义处，切换 scope，当前对象是定义的模块或类本身，当前变量池为空
在 def 定义处，切换 scope，调用该方法的 receiver 为当前对象，当前变量池为空&lt;/p&gt;

&lt;p&gt;当遇到 end 时，对应的切换结束，切换回切换之前的 scope。&lt;/p&gt;

&lt;p&gt;2.在使用 module,class 关键字定义模块和类时，切换 level，规则很简单，目录是递进式切换，从根目录进入 A 的 module，目录就是::A，再进入里面的类 B，则目录是::A::B，当前类以及当前类变量所属的类，均是定义的类。&lt;/p&gt;

&lt;p&gt;了解了初始状态，也了解了状态的变化，那么我们就可以完整地分析代码的执行环境了。但是，我们为什么要分为 5 个方面呢？比如 scope 的两个方面，切换时都切换了，作为一个方面分析不是更简单吗？这是因为，ruby 提供了一些手段，使得我们只切换 scope 中的一些内容（比如只更改 self，也有人称之为 flat scope，认为没有切换 scope）。也就是说，有一些特殊手法，可以按照需要，只切换其中一些方面，而保留另外一些方面，这就比我们上面所说的切换方法灵活多了。具体来说：&lt;/p&gt;

&lt;p&gt;一、任何对象均可以调用一个名为 instance_eval 的方法，提供一个 block，有两方面发生变化：
1）这个 block 里面的当前对象，也就是 self 所指的对象，临时地脱离当前 scope 所指的对象，而变为调用此方法的对象
2）这个 block 里面定义的方法，临时脱离当前类，而是这个对象的 eigenclass&lt;/p&gt;

&lt;p&gt;二、任何模块对象（也就是 Module 及其子类（主要是 Class）的实例）均可以调用一个一个名为 class_eval 的方法，提供一个 block，有以下变化：
1）这个 block 里面的当前对象为该模块
2）当前类也是该模块。（但是并不影响其他内容，尤其是，在这个 block 定义的类变量不属于该类，定义的常量，也不会置于这个类代表的目录之下，这就说明了要把 level 分为 3 个方面分析的重要性）
值得注意的是：通过 Class.new 执行的 block，其实在内部是使用了 class_eval 来执行，所以，规则同 class_eval 相同。&lt;/p&gt;

&lt;p&gt;三、class &amp;lt;&amp;lt; object 定义，会有以下变化：
1）切换 scope，当前对象为 eigenclass，当前作用域为新作用域
2）当前类为 eigenclass（但是当前目录和当前类对象均维持不变）&lt;/p&gt;

&lt;p&gt;除此之外，block 并非 gate（既不是 scope gate，也不是 level gate），所以不会切换任何 scope 和 level，维持原先的 5 个方面状态不变。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;最后出一个小小的谜题，便于你理解 ruby 执行代码的方式：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述代码是合法的吗？如果合法，结果是什么？（反之，错误在哪？）&lt;/p&gt;</description>
      <author>sefier</author>
      <pubDate>Wed, 25 Sep 2013 16:32:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/14384</link>
      <guid>https://ruby-china.org/topics/14384</guid>
    </item>
    <item>
      <title>如何在启动时选择 unicorn 并且读取 config/unicorn.rb 作为配置文件</title>
      <description>&lt;p&gt;一开始，我是这样运行的：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails server unicorn &lt;span class="nt"&gt;-e&lt;/span&gt; production
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行这个之后，出现找不到文件的错误，按照网上的提示，在 Gemfile 当中加入了&lt;code&gt;unicorn_rails&lt;/code&gt;，结果发现没有出现 socket 文件，我估计是不是没有读取 config/unicorn.rb 配置文件呢？网上搜了下，只看到下面这个命令可以指定配置文件：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uncorn_rails &lt;span class="nt"&gt;-c&lt;/span&gt; config/unicorn.rb &lt;span class="nt"&gt;-E&lt;/span&gt; production &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可是直接启动不了 unicorn 了，看日志，说是"text file busy"错误。郁闷死了。&lt;/p&gt;

&lt;p&gt;最终问题是：怎么启动 production 模式，保证使用 unicorn 服务器，同时读取的是 config/unicorn.rb 配置文件？&lt;/p&gt;</description>
      <author>sefier</author>
      <pubDate>Tue, 02 Jul 2013 00:57:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/12158</link>
      <guid>https://ruby-china.org/topics/12158</guid>
    </item>
    <item>
      <title>安装 ruby-china 时，运行在 production 模式下，无法访问静态资源</title>
      <description>&lt;p&gt;简单地安装完 ruby-china，用 development 模式访问，一切正常，使用 production 模式，发现无法加载静态资源，如 CSS/JS 等，查看源代码，发现使用了 CDN，于是修改了 upload_url 为本地的连接，发现访问的 CSS/JS 文件的结果是一个空 content 的 200。&lt;/p&gt;

&lt;p&gt;尝试在 public 目录下建立一个 test.html，访问&lt;a href="http://localhost:3000/test.html0%E7%9A%84200" rel="nofollow" target="_blank"&gt;http://localhost:3000/test.html0的200&lt;/a&gt;，返回的结果也是长度为 reponse.&lt;/p&gt;

&lt;p&gt;请问这是怎么回事呢？（测试 unicorn/thin 均是这个结果）&lt;/p&gt;</description>
      <author>sefier</author>
      <pubDate>Mon, 01 Jul 2013 13:46:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/12138</link>
      <guid>https://ruby-china.org/topics/12138</guid>
    </item>
  </channel>
</rss>
