<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>BadTudou (DuXiaoDou)</title>
    <link>https://ruby-china.org/BadTudou</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>TcpSocket 如果获取 Http 请求的整个内容</title>
      <description>&lt;p&gt;app.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;'socket'&lt;/span&gt;

&lt;span class="nb"&gt;require_relative&lt;/span&gt; &lt;span class="s1"&gt;'HttpRequest.rb'&lt;/span&gt;

&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;TCPServer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accept&lt;/span&gt;
   &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;
   &lt;span class="k"&gt;end&lt;/span&gt; 
   &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;
&lt;span class="k"&gt;end&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="no"&gt;POST&lt;/span&gt;  &lt;span class="no"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;
&lt;span class="no"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;
&lt;span class="no"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;urlencoded&lt;/span&gt;
&lt;span class="no"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;Control&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;
&lt;span class="no"&gt;Postman&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9955&lt;/span&gt;&lt;span class="n"&gt;d109&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;476e-9&lt;/span&gt;&lt;span class="n"&gt;bc5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2612&lt;/span&gt;&lt;span class="n"&gt;c0ef5f5c&lt;/span&gt;

&lt;span class="n"&gt;sss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sss&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;%&lt;/span&gt;&lt;span class="no"&gt;E6&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;AF&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;E6&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;AF&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;E6&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;AF&lt;/span&gt;&lt;span class="o"&gt;=%&lt;/span&gt;&lt;span class="no"&gt;E6&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;AF&lt;/span&gt;&lt;span class="o"&gt;+%&lt;/span&gt;&lt;span class="no"&gt;E6&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;E7&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;B4&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;A2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样是无法获取&lt;em&gt;sss=sss&amp;amp;%E6%98%AF%E6%98%AF%E6%98%AF=%E6%98%AF+%E6%90%9C%E7%B4%A2&lt;/em&gt;，
请问有什么办法能够获取整个 Http request 的内容么？&lt;/p&gt;</description>
      <author>BadTudou</author>
      <pubDate>Sat, 14 Jul 2018 15:38:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/37156</link>
      <guid>https://ruby-china.org/topics/37156</guid>
    </item>
    <item>
      <title>如何用 Ruby 实现单例模式？</title>
      <description>&lt;p&gt;Singleton.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Singleton&lt;/span&gt;
  &lt;span class="vc"&gt;@@uniqueInstance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&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="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;instance&lt;/span&gt;
    &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="vc"&gt;@@uniqueInstance&lt;/span&gt;
      &lt;span class="vc"&gt;@@uniqueInstance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="vc"&gt;@@uniqueInstance&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;plus&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="k"&gt;end&lt;/span&gt;

  &lt;span class="nb"&gt;private_class_method&lt;/span&gt; &lt;span class="ss"&gt;:new&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;test/Counter.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;'../Singleton.rb'&lt;/span&gt;

&lt;span class="n"&gt;singleton_one&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Singleton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;singleton_one&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt;

&lt;span class="n"&gt;singleton_two&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Singleton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;singleton_two&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt;

&lt;span class="n"&gt;singleton_three&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Singleton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;singleton_three&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt;

&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;singleton_one&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plus&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;singleton_two&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plus&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;singleton_three&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plus&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行结果：
&lt;strong&gt;Singleton.rb:13:in &lt;code&gt;plus': undefined method&lt;/code&gt;+' for nil:NilClass (NoMethodError)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我的想法是：单例模式保证&lt;code&gt;Singleton.instance&lt;/code&gt;获取到的是同一个实例，而&lt;code&gt;count&lt;/code&gt;是实例变量，每次执行&lt;code&gt;xxx.plus&lt;/code&gt;，都会让实例变量&lt;code&gt;count&lt;/code&gt;的值加 1。&lt;/p&gt;

&lt;p&gt;可以把&lt;code&gt;@count&lt;/code&gt;改为&lt;code&gt;@@count&lt;/code&gt;，即将实例变量改为类变量，我感觉这样修改并不太好 (只是感觉，也不知道具体是哪里不好)。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;问这个问题的本质是想不用内置的 Singleton 来实现单例模式&lt;/strong&gt;&lt;/p&gt;</description>
      <author>BadTudou</author>
      <pubDate>Mon, 21 May 2018 17:35:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/36812</link>
      <guid>https://ruby-china.org/topics/36812</guid>
    </item>
    <item>
      <title>KindleNote 已开源</title>
      <description>&lt;h2 id="KindleNote"&gt;KindleNote&lt;/h2&gt;&lt;h2 id="写在前面"&gt;写在前面&lt;/h2&gt;
&lt;p&gt;这是一个不算太长的故事。&lt;/p&gt;

&lt;p&gt;故事源于我有一个&lt;strong&gt;Kindle&lt;/strong&gt;，时常用它来看看书，顺手标记一下或者做做笔记。&lt;/p&gt;

&lt;p&gt;某天当我想要把其中的标记或笔记导出来的时候，发现市场上并无较好的软件能满足我的需求，于是本着自己动手丰衣足食的想法，开发了这款 KindleNote。&lt;/p&gt;

&lt;p&gt;它最初是用原生 PHP 构建的，后来又用 Laravel 进行了重构，然后又经过 Rails 进行了重构，最终，它还是不能让我满意......&lt;/p&gt;

&lt;p&gt;这是一个半成品，由于数据库设计不甚合理，无完整的权限控制，前后端未实现完全分离，以及其他的种种原因，它注定要被遗弃。&lt;/p&gt;

&lt;p&gt;所以我如今把它公布出来，若能对你有所帮助，也算是废物的再回收利用，也可称作是为环保尽了一份力。&lt;/p&gt;

&lt;p&gt;全新的 KindleNote 正在开发之中，目前已经做了些许设计工作，新的作品将会吸收它的不足，借鉴保留其优点 (如何有的话)。&lt;/p&gt;

&lt;p&gt;希望发布下一个 KindleNote 的时候，我可以稍候有那么一点自信。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;本项目质量较差，与诸菜共勉之&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://github.com/BadTudou/KindleNote-Rails/raw/develop/screenshots/release/index.png" title="首页" alt="KindelNote"&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/BadTudou/KindleNote-Rails" rel="nofollow" target="_blank"&gt;https://github.com/BadTudou/KindleNote-Rails&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KindleNote&lt;/strong&gt;可以导出您&lt;strong&gt;Kindle&lt;/strong&gt;中的&lt;strong&gt;标注&lt;/strong&gt;与&lt;strong&gt;笔记&lt;/strong&gt;，并支持将它们转换为&lt;strong&gt;MarkDown&lt;/strong&gt;文件。&lt;/p&gt;

&lt;p&gt;您可以选择将导出的&lt;strong&gt;标记&lt;/strong&gt;与&lt;strong&gt;笔记&lt;/strong&gt;存储于&lt;strong&gt;Evernote&lt;/strong&gt;、&lt;strong&gt;有道云笔记&lt;/strong&gt;等云笔记平台，或者&lt;strong&gt;KindleNote&lt;/strong&gt;的服务器中。&lt;/p&gt;
&lt;h2 id="功能"&gt;功能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] &lt;strong&gt;笔记导出为 Markdown&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;笔记保存到 Evernote&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;批量导出为 Markdown / 导出到第三方云笔记 / 删除&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;通过豆瓣图书自动获取笔记对应的图书信息&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;重复笔记自动合并&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;第三方登录：QQ&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;第三方登录：Evernote&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;分享到 QQ 空间、微博等社交网站&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;笔记保存到有道云笔记&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;搜索笔记&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="演示"&gt;演示&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;全部笔记&lt;/strong&gt;
&lt;img src="https://github.com/BadTudou/KindleNote-Rails/raw/develop/screenshots/release/notes_index.png" title="全部笔记" alt="KindelNote"&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;查看笔记&lt;/strong&gt;
&lt;img src="https://github.com/BadTudou/KindleNote-Rails/raw/develop/screenshots/release/notes_show.png" title="查看笔记" alt="KindelNote"&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;个人中心&lt;/strong&gt;
&lt;img src="https://l.ruby-china.com/photo/2018/dc99a27d-ffa5-4628-bf13-58dacfa39de3.png!large" title="" alt="应用授权"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/0c970ad3-4963-49e6-9c4c-0139f1eaa0ee.png!large" title="" alt="个人资料"&gt;&lt;/p&gt;
&lt;h2 id="系统架构"&gt;系统架构&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;KindleNote&lt;/strong&gt;基于&lt;strong&gt;Ruby&lt;/strong&gt;的&lt;strong&gt;Ruby on Rails&lt;/strong&gt;框架。&lt;/p&gt;

&lt;p&gt;系统设计遵循&lt;strong&gt;MVC&lt;/strong&gt;与&lt;strong&gt;Restfull&lt;/strong&gt;架构。&lt;/p&gt;
&lt;h2 id="安装"&gt;安装&lt;/h2&gt;&lt;h3 id="服务器要求"&gt;服务器要求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ruby&lt;/strong&gt; &amp;gt;= 2.4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rails&lt;/strong&gt; &amp;gt;= 5.1.4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nodejs&lt;/strong&gt; &amp;gt;= 8.6.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yarn&lt;/strong&gt; &amp;gt;= 1.3.2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sqlite3&lt;/strong&gt;(默认数据库)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt;(自动化部署时需要)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="配置"&gt;配置&lt;/h2&gt;
&lt;p&gt;所有配置文件均位于&lt;code&gt;config&lt;/code&gt;目录&lt;/p&gt;
&lt;h3 id="配置Evernote授权"&gt;配置 Evernote 授权&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Evernote 授权&lt;/strong&gt;用于将用户的笔记导出到&lt;strong&gt;Evernote&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evernote&lt;/strong&gt;的配置文件为&lt;code&gt;evernote.yml&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;development:
  consumer_key: key
  consumer_secret: secret
  sandbox: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上是&lt;em&gt;development&lt;/em&gt;运行环境下的&lt;strong&gt;Evernote&lt;/strong&gt;配置信息，你可以在该配置文件中添加其他运行环境下的&lt;strong&gt;Evernote&lt;/strong&gt;配置信息。&lt;/p&gt;

&lt;p&gt;具体的配置信息可参考&lt;a href="https://github.com/evernote/evernote-oauth-ruby/" rel="nofollow" target="_blank" title="Evernote OAuth"&gt;evernote-oauth-ruby&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="配置QQ授权"&gt;配置 QQ 授权&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;QQ 授权&lt;/strong&gt;便于用户使用 QQ 进行快速登录。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;QQ&lt;/strong&gt;的配置文件为&lt;code&gt;qq_secrets.yal&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_ID: 'xxx'
APP_KEY: 'xxxxxxxx'
RED_URL: 'http://www.kindlenote.org/qq/callback'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入&lt;a href="https://connect.qq.com/manage.html" rel="nofollow" target="_blank" title="QQ互联"&gt;QQ 互联&lt;/a&gt;，在成功创建应用后，你将得到 QQ 授权的配置信息。&lt;/p&gt;
&lt;h2 id="部署"&gt;部署&lt;/h2&gt;
&lt;p&gt;使用&lt;a href="http://capistranorb.com/" rel="nofollow" target="_blank" title="Capistrano"&gt;Capistrano&lt;/a&gt;实现自动化部署，默认会自动从&lt;a href="https://github.com/BadTudou/KindleNote-Rails" rel="nofollow" target="_blank"&gt;https://github.com/BadTudou/KindleNote-Rails&lt;/a&gt;拉取最新的代码。&lt;/p&gt;

&lt;p&gt;你可参照&lt;a href="https://hieunguyentrung.com/2017/06/29/deploying-a-rails-app-on-centos-7-with-capistrano-nginx-and-puma/" rel="nofollow" target="_blank" title="Deploying a Rails App on CentOS 7 with Capistrano, Nginx, and Puma"&gt;Deploying a Rails App on CentOS 7 with Capistrano, Nginx, and Puma&lt;/a&gt;这篇文章完成其在服务器的部署。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;注意：自动化部署时，你需要链接以下配置文件&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;database.yml &lt;/li&gt;
&lt;li&gt;application.yml &lt;/li&gt;
&lt;li&gt;evernote.yml &lt;/li&gt;
&lt;li&gt;qq_secrets.yml&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;以下代码是以远程服务器&lt;strong&gt;develop&lt;/strong&gt;用户的身份执行自动化部署。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bundle exec cap development deploy PRODUCTION_BRANCH='develop' PRODUCTION_SERVER_IP='xxx.xxx.xxx.xxx' PRODUCTION_DEPLOY_USER='develop'
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>BadTudou</author>
      <pubDate>Wed, 03 Jan 2018 17:09:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/34814</link>
      <guid>https://ruby-china.org/topics/34814</guid>
    </item>
    <item>
      <title>能否通过元编程在加载 Module 之前更改 Module 中变量的值？</title>
      <description>&lt;p&gt;之所以有这个问题，是因为我在开发的个人项目 (&lt;a href="https://github.com/BadTudou/KindleNote-Rails" rel="nofollow" target="_blank" title="KindleNote"&gt;KindleNote，解析管理你的 Kindle 标记与笔记&lt;/a&gt;) 中用到了一个 QQ 互联 - 账户登录的&lt;a href="https://github.com/046569/qq" rel="nofollow" target="_blank" title="qq_conn"&gt;gem&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;该 gem 会&lt;code&gt;require 'const.rb'&lt;/code&gt;，而&lt;strong&gt;const.rb&lt;/strong&gt;会默认读取&lt;strong&gt;qq_secrets.yml&lt;/strong&gt;文件。&lt;/p&gt;

&lt;p&gt;由于指定的文件是&lt;strong&gt;qq_secrets.yml&lt;/strong&gt;，因此它默认读取的是&lt;strong&gt;项目根目录&lt;/strong&gt;下的&lt;strong&gt;qq_secrets.yml&lt;/strong&gt;文件。&lt;/p&gt;

&lt;p&gt;我想完成的是：使这个 gem 读取&lt;strong&gt;config/qq_secrets.yml&lt;/strong&gt;，而非&lt;strong&gt;qq_secrets.yml&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;我的想法是：监测&lt;strong&gt;require&lt;/strong&gt;事件，当发现它要加载的是&lt;strong&gt;const.rb&lt;/strong&gt;时，设置 Module*&lt;em&gt;QQ&lt;/em&gt;&lt;em&gt;里的变量&lt;/em&gt;&lt;em&gt;f&lt;/em&gt;&lt;em&gt;为&lt;/em&gt;&lt;em&gt;config/qq_secrets.yml&lt;/em&gt;*，并使其不可更改。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;所以，能否能通过元编程来完成这个需求？或者，这是不切实际的幻想.....&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;以下是 gem 的部分代码：&lt;/p&gt;

&lt;p&gt;const.rb 的代码&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module QQ
  f = 'qq_secrets.yml'
  return raise 'qq_secrets.yml not found!' unless File.exist?(f)
  s = YAML.load_file(f)
 .......
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;qq.rb 的代码&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Qq
  require 'const.rb'
end
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>BadTudou</author>
      <pubDate>Mon, 13 Nov 2017 21:10:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/34569</link>
      <guid>https://ruby-china.org/topics/34569</guid>
    </item>
    <item>
      <title>Ruby 用户指南 (简体中文)-初版发布</title>
      <description>&lt;p&gt;翻译了 Ruby User’s Guide。&lt;/p&gt;

&lt;p&gt;基于 Mark Slagell 的英文版本翻译而来。&lt;/p&gt;

&lt;p&gt;当前翻译版本是初版，请不要吐槽我的翻译水平，fork 并完善它才是更为有意义的事情。&lt;/p&gt;

&lt;p&gt;Ruby 用户指南地址：&lt;a href="https://github.com/BadTudou/RubyUsersGuide-zh" rel="nofollow" target="_blank"&gt;https://github.com/BadTudou/RubyUsersGuide-zh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(尽管是 GNU Free Documentation License，但我还是给英文版的作者发去授权申请，作者回复：You can make your own translation; the only requirement is that if you publish your translation, you must specify the same GNU license or a compatible derivative of it.)&lt;/p&gt;

&lt;p&gt;本指南遵循 GNU Free Documentation License。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/46128820-fd13-4ddd-a475-e4e7e767f8f2.png!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2017/10b4c11e-9e65-4c8b-b65a-952d567787e9.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>BadTudou</author>
      <pubDate>Fri, 08 Sep 2017 12:18:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/34066</link>
      <guid>https://ruby-china.org/topics/34066</guid>
    </item>
  </channel>
</rss>
