<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ecnelises (Qiu Chaofan)</title>
    <link>https://ruby-china.org/ecnelises</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>一直不明白为什么安装 Sinatra 要这么久</title>
      <description>&lt;p&gt;这么些年来，每次都会卡在 &lt;code&gt;Installing ri documentation for sinatra-2.1.0&lt;/code&gt; 这个位置数分钟甚至十多分钟，不管是 macOS 还是 Linux. 仿佛 Sinatra 的文档有某种魔法。&lt;/p&gt;</description>
      <author>ecnelises</author>
      <pubDate>Thu, 09 Sep 2021 22:36:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/41671</link>
      <guid>https://ruby-china.org/topics/41671</guid>
    </item>
    <item>
      <title>这年头有多少个 XXEnv？</title>
      <description>&lt;p&gt;见过了 pyenv、goenv、perlenv，甚至 node 都有三个：nodenv、nodeenv 和 ndenv（前端圈真乱）。里面好多甚至是直接从 rbenv fork 过来的。Ruby 社区真是被默默地「偷」了不少东西。&lt;/p&gt;</description>
      <author>ecnelises</author>
      <pubDate>Wed, 25 Dec 2019 14:39:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/39370</link>
      <guid>https://ruby-china.org/topics/39370</guid>
    </item>
    <item>
      <title>Homeland 可以加入夜间模式吗？</title>
      <description>&lt;p&gt;可以适应操作系统设置的那种（一个 CSS 媒体查询）&lt;/p&gt;</description>
      <author>ecnelises</author>
      <pubDate>Fri, 29 Nov 2019 00:59:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/39287</link>
      <guid>https://ruby-china.org/topics/39287</guid>
    </item>
    <item>
      <title>是不是之前 Ruby JIT 的努力都失败了？或者说为什么没有流行起来？</title>
      <description>&lt;p&gt;从 Rubinius 到 JRuby、IronRuby……&lt;/p&gt;</description>
      <author>ecnelises</author>
      <pubDate>Sun, 13 Jan 2019 15:37:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/37992</link>
      <guid>https://ruby-china.org/topics/37992</guid>
    </item>
    <item>
      <title>Ruby 2.6 发布后，你可以在 gem 中使用两步验证了。</title>
      <description>&lt;p&gt;因为 Ruby 2.6 合并了 RubyGems 3.0.1（实际上他们不是一拨人在维护，如果再加上 Rubygems.org 这个网站，那就是三拨人…），所以你可以在 RubyGems 3.0+ 版本中使用两步验证功能了。这个两步验证是和 Google Authenticator 兼容的。&lt;/p&gt;
&lt;h2 id="如何使用？"&gt;如何使用？&lt;/h2&gt;
&lt;p&gt;参考 RubyGems 的这两篇 Guide：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://guides.rubygems.org/setting-up-multifactor-authentication/" rel="nofollow" target="_blank" title=""&gt;Setting up multi-factor authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://guides.rubygems.org/using-mfa-in-command-line/" rel="nofollow" target="_blank" title=""&gt;Using multi-factor authentication in command line&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;简单来说，你可以选择仅在登录 RubyGems.org 账号的时候启用两步验证，或者要求在 RubyGems 命令行执行一些操作（比如 push、owner）的时候要求输入额外的 6 位数字码。这样可以提高你账号的安全性。&lt;/p&gt;
&lt;h2 id="有什么已知问题？"&gt;有什么已知问题？&lt;/h2&gt;
&lt;p&gt;因为每次执行 &lt;code&gt;gem push&lt;/code&gt; 的时候，RubyGems 会自动调一个 API 来获取最新的 RubyGems 版本，而在国内这个 API 的访问速度可能非常慢。由于两步验证的安全码是 30 秒生成一次，这个过程可能会超时。&lt;/p&gt;
&lt;h2 id="我可以做些什么？"&gt;我可以做些什么？&lt;/h2&gt;
&lt;p&gt;可以去给 &lt;a href="https://github.com/rubygems/rubygems.org" rel="nofollow" target="_blank" title=""&gt;RubyGems.org&lt;/a&gt; 贡献网站的中文翻译！（这是个 Rails 应用）如果你有余力的话，也可以看看 &lt;a href="https://github.com/rubygems/rubygems" rel="nofollow" target="_blank" title=""&gt;RubyGems&lt;/a&gt; 里的一堆 Issue，可能也和你的日常使用息息相关。这两个项目里面就是普通的 Ruby 代码，上手门槛应该比 Ruby Core 小很多。&lt;/p&gt;
&lt;h2 id="怎么实现的？"&gt;怎么实现的？&lt;/h2&gt;
&lt;p&gt;这个功能实际上是我实现的，作为 GSoC 2018 的一个项目。RubyGems.org 使用的是 Clearance，所以很多基于 devise 的方案就没法用了。（GitLab 用的也是 devise）如果你也想在你的项目中引入两步验证的话，首要的其实是去了解下两步验证的协议（最常见和兼容的就是 TOTP 和 HOTP 两种，前者更常用），用最通俗的话描述原理就是：把密钥和一个一次性的值（对于 TOTP 就是当前的时间，对于 HOTP 就是当前是第几次验证）合在一起做散列然后模 1000000 得到一个 6 位数的值。&lt;/p&gt;

&lt;p&gt;当然我们不用自己去实现这些东西，因为有 &lt;a href="https://github.com/mdp/rotp" rel="nofollow" target="_blank" title=""&gt;rotp&lt;/a&gt; 这个库。然后你可以在模型中利用这个库写一些验证的方法，用二维码相关的库来在用户启用两步验证时生成供 Authenticator 扫描的二维码等…当然你得起码在 &lt;code&gt;User&lt;/code&gt; 模型中引入前面提到的两步验证的密钥，叫 seed 也好 secret 也好。然后很多网站给用户提供了 recovery token，就是当用户手机丢了或者其他没法生成验证码的时候临时使用的若干验证码（一次性的）。如果你用 PG 作为数据库的话，这个字段就可以直接用 Array 了。其他的一些要求可以参考 rotp 的文档。我在想要不要把这些做成一个 gem，但是不够抽象好像也没必要。&lt;/p&gt;

&lt;p&gt;最后，希望大家多给 Rails、RubyGems 和 Ruby 提 Issue、修 bug，因为咱们社区的人真的不多。Andre Arko（Bundler 的作者）三天两头说自己看到隔壁 JS 社区挺嫉妒的，因为 NPM 还能开个公司拿风投…&lt;/p&gt;

&lt;p&gt;顺便，最近一直强调网络安全，但是国内就没几家的产品兼容两步验证的，就算要实名，手机号这玩意用来保护账号，也不安全啊。&lt;/p&gt;</description>
      <author>ecnelises</author>
      <pubDate>Wed, 26 Dec 2018 21:32:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/37949</link>
      <guid>https://ruby-china.org/topics/37949</guid>
    </item>
    <item>
      <title>看到隔壁 Python 在讨论新的社区治理模式，有感而发</title>
      <description>&lt;p&gt;Python 之父于今年 7 月宣布不再担任所谓社区「仁慈的独裁者」角色。因此整个社区在讨论他淡出之后应该怎么办。有个 &lt;a href="https://www.python.org/dev/peps/pep-8000/" rel="nofollow" target="_blank" title=""&gt;PEP-8000&lt;/a&gt;，其中有几个方案：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.python.org/dev/peps/pep-8010/" rel="nofollow" target="_blank" title=""&gt;技术领导人治理模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.python.org/dev/peps/pep-8011/" rel="nofollow" target="_blank" title=""&gt;三巨头治理模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.python.org/dev/peps/pep-8012/" rel="nofollow" target="_blank" title=""&gt;社区治理模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.python.org/dev/peps/pep-8013/" rel="nofollow" target="_blank" title=""&gt;外部治理模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.python.org/dev/peps/pep-8014/" rel="nofollow" target="_blank" title=""&gt;大众治理模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.python.org/dev/peps/pep-8015/" rel="nofollow" target="_blank" title=""&gt;Python 社区的组织模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.python.org/dev/peps/pep-8016/" rel="nofollow" target="_blank" title=""&gt;指导委员会模式&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;列举了 7 个 Governance Model，也就是 7 篇 Proposal，我寻思也是厉害…&lt;/p&gt;

&lt;p&gt;说起来，要是有天 Matz 不干了，Ruby 社区会有啥反应呢？&lt;/p&gt;</description>
      <author>ecnelises</author>
      <pubDate>Mon, 03 Dec 2018 01:02:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/37848</link>
      <guid>https://ruby-china.org/topics/37848</guid>
    </item>
  </channel>
</rss>
