<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>howiehu (胡皓)</title>
    <link>https://ruby-china.org/howiehu</link>
    <description>From soldier to programmer...</description>
    <language>en-us</language>
    <item>
      <title>自从尝试 SOHO 然后放弃到现在已经两年多了，直到今天我才敢说说我做了啥：先定个小目标，比如 6 周培养 100 个人</title>
      <description>&lt;p&gt;两年多以前，写过几篇文章发在 RubyChina，标题甚是吸引人，即《从士兵到程序员再到 SOHO 程序员》，令我没想到的是，影响了很多人投身 Remote 工作的“浪潮”之中。&lt;/p&gt;

&lt;p&gt;但是，因为种种原因，我却没有坚持下去，后来我加入了 ThoughtWorks。&lt;/p&gt;

&lt;p&gt;但是，这为我开启了一项前所未有，也与众不同的大门：&lt;strong&gt;利用我们的技术和经验去促进 IT 教育变革与教育公平&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;经过了两年多的艰辛实践，我们今年终于产出了令我能够站出来尝试描述我们所做的事情的成果。&lt;/p&gt;

&lt;p&gt;恰逢最近大家在讨论有关“全栈培训”的事情，我也赶个潮流，提供点不为赚钱而为心的例子。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;是的，这两年多来，我们的培训都是免费的，并且我们也希望持续免费下去。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;另外，我们也是全栈，但是比全栈多得多，也没用 Ruby 和 Rails（然而我依然深爱她）。&lt;/p&gt;

&lt;p&gt;由于文章比较长，所以详细请见：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MjM5MjY3OTgwMA==&amp;amp;mid=2652454698&amp;amp;idx=1&amp;amp;sn=356ac0ccf1215f644ab905503def847b&amp;amp;scene=1&amp;amp;srcid=0910aeAPKAx9KLJkAO32gWta#rd" rel="nofollow" target="_blank" title=""&gt;2016 年 ThoughtWorks 暑期特训营回顾&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;我会在后面不断发文写一写我们所做的事情，也希望有更多胸怀天下，与我们志同道合的人加入我们的事业。&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Mon, 12 Sep 2016 09:18:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/31039</link>
      <guid>https://ruby-china.org/topics/31039</guid>
    </item>
    <item>
      <title>今天晚上 (2014-05-09) 11 点 30，Martin Fowler、Kent Beck、DHH 论战《Is TDD Dead?》</title>
      <description>&lt;p&gt;这消息应该很多人都知道了吧？先前 DHH 的几篇雄文看来影响不小。&lt;/p&gt;

&lt;p&gt;有人今晚观战不？哈哈！&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plus.google.com/events/ci2g23mk0lh9too9bgbp3rbut0k" rel="nofollow" target="_blank"&gt;https://plus.google.com/events/ci2g23mk0lh9too9bgbp3rbut0k&lt;/a&gt;&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Fri, 09 May 2014 20:14:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/19136</link>
      <guid>https://ruby-china.org/topics/19136</guid>
    </item>
    <item>
      <title>《Metaprogramming Ruby (2nd edition)》(Ruby 元编程第二版) 发布了！</title>
      <description>&lt;p&gt;这书不需要介绍了吧……在 N 年后与时俱进的第二版（支持到 Ruby 2.1）终于发布了，虽然现在还是 Beta 的，但是可以持续关注，感兴趣的可以尝鲜。&lt;/p&gt;

&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2014/67a5334581b8c814c0d365f45499ef8d.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://pragprog.com/book/ppmetr2/metaprogramming-ruby" rel="nofollow" target="_blank" title=""&gt;Metaprogramming Ruby (2nd edition)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;March 12, 2014
Today is an auspicious day! Coca-Cola was first bottled and sold on this day in 1894, making later advances in programming possible.&lt;/p&gt;

&lt;p&gt;While in your caffeine-induced flurry of productivity, grab a copy of Metaprogramming Ruby, Second Edition (pragprog.com/book/ppmetr2) and imbibe the secrets of wizard-level Ruby, brought down to earth for mere mortals to enjoy and profit.&lt;/p&gt;

&lt;p&gt;An auspicious day, indeed.&lt;/p&gt;

&lt;p&gt;Metaprogramming Ruby, Second Edition&lt;/p&gt;

&lt;p&gt;Dig under the surface and explore Ruby's most advanced feature: a collection of techniques and tricks known as metaprogramming. In this book, you'll learn metaprogramming as an essential component of Ruby and discover the deep, non-obvious details of the language. Once you understand the tenets of Ruby, including the object model, scopes, and singleton classes, you're on your way to applying metaprogramming both in your daily work assignments and in your fun, after-hours projects.&lt;/p&gt;

&lt;p&gt;Metaprogramming Ruby, Second Edition makes mastering the language enjoyable. The book is packed with:&lt;/p&gt;

&lt;p&gt;Pragmatic examples of metaprogramming in action, many of which come straight from real-life gems such as Rails.
Programming challenges that let you experiment and play with some of the most out-there metaprogramming concepts.
Metaprogramming "spells"—33 practical recipes and idioms that you can study and apply right now, to write code that is sure to impress.
This completely revised new edition covers the new features in Ruby 2.0 and 2.1, and contains code from the latest Ruby libraries, including Rails 4. Most examples are new, "from the wild," with more recent libraries. And the book reflects current ideas of when and how much metaprogramming you should use.&lt;/p&gt;

&lt;p&gt;Whether you're a Ruby apprentice on the path to mastering the language or a Ruby wiz in search of new tips, this book is for you.&lt;/p&gt;

&lt;p&gt;If you own the first edition: you'll find an upgrade coupon for 35% in your account. Enjoy!&lt;/p&gt;

&lt;p&gt;Now in beta at pragprog.com/book/ppmetr2.&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Wed, 12 Mar 2014 22:47:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/17840</link>
      <guid>https://ruby-china.org/topics/17840</guid>
    </item>
    <item>
      <title>从士兵到程序员再到 SOHO 程序员 (三) - 游击战与阻力</title>
      <description>&lt;h2 id="从士兵到程序员再到 SOHO 程序员 (三) - 游击战与阻力"&gt;从士兵到程序员再到 SOHO 程序员 (三) - 游击战与阻力&lt;/h2&gt;
&lt;p&gt;原文地址：
&lt;a href="http://blog.huhao.name/blog/2014/03/01/become-a-freelancer-3/" rel="nofollow" target="_blank"&gt;http://blog.huhao.name/blog/2014/03/01/become-a-freelancer-3/&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;作者：胡皓&lt;/p&gt;

&lt;p&gt;Blog：&lt;a href="http://blog.huhao.name" rel="nofollow" target="_blank" title=""&gt;From Soldier to Programmer - 胡皓的博客&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub：&lt;a href="https://github.com/howiehu" rel="nofollow" target="_blank" title=""&gt;https://github.com/howiehu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twitter：&lt;a href="https://twitter.com/howiehu" rel="nofollow" target="_blank" title=""&gt;howiehu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;新浪微博：&lt;a href="http://www.weibo.com/howiehu" rel="nofollow" target="_blank" title=""&gt;Howie-Hu&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;前作：
&lt;a href="http://ruby-china.org/topics/14189" title=""&gt;《从士兵到程序员再到 SOHO 程序员 (一) - 起航》&lt;/a&gt;
&lt;a href="http://ruby-china.org/topics/16192" title=""&gt;《从士兵到程序员再到 SOHO 程序员 (二) - 求职》&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;自从上一篇文章（&lt;a href="/blog/2013/12/13/become-a-freelancer-2/" title=""&gt;《从士兵到程序员再到 SOHO 程序员 (二) - 求职》&lt;/a&gt;）到现在又过去了差不多 3 个月的时间，也是时候来总结一下这三个月来的经历和经验教训了。&lt;/p&gt;

&lt;p&gt;很多朋友告诉我，前两篇文章带给大家了许多“正能量”和“激情”，但是这一次，我要用我的实际经历来给大家泼泼凉水。 &lt;strong&gt;所有的努力和奋斗在初始阶段都不会是一帆风顺的&lt;/strong&gt; ，这个道理你知我知，我也提前有心理准备，但是后来所遇到的很多问题却超出了自己的预想。&lt;/p&gt;

&lt;p&gt;到了现在自己回过头想一想，其实人生的旅途也需要敏捷，所有的变化都是合理的，如果变化过大，说明先前总有哪个地方没做好，埋下了隐患。最后，既然发生了变化，就要勇于去处理解决以及适应变化。&lt;/p&gt;

&lt;p&gt;接下来我会先总结一下这 3 个月来的工作和成长经历，然后说一说除了工作以外更加重要的现实阻力。&lt;/p&gt;
&lt;h2 id="游击战：必经阶段"&gt;游击战：必经阶段&lt;/h2&gt;
&lt;p&gt;这三个月有了两次工作机会，都是创业公司，创业团队，但是都在相互试用之后没能继续下去。为了保护公司隐私，以下不会说太多的工作细节。&lt;/p&gt;

&lt;p&gt;第一家公司的人都充满激情，也非常的诚恳和靠谱。他们的产品已经上线，但是因为公司人事变动，没有全职的开发人员，更没有 CTO 或者 PM 这样富有技术经验的人来沟通和规划工作，所以我等于是在半救火的情况下加入的。由于我是刚刚转型到 Ruby on Rails 不久，面对一个缺乏整体设计和必要测试代码的已经上线的现有项目，压力非常大。这些压力或者说是不适合来自于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;都说实际项目的维护和开发能学到更多的东西，但是这在对技术还不够熟练，且没有人能够及时沟通或者完全没人能帮助你的情况下来说是相当困难的。&lt;/li&gt;
&lt;li&gt;我是唯一的全职开发人员，另一个曾经的技术核心出国留学，沟通时差 + 其他公司人员对技术都缺乏足够的了解，这种情况下可以说是孤立无援。&lt;/li&gt;
&lt;li&gt;项目本身缺乏测试代码，或者可以说是测试根本跑不起来，项目代码耦合度很高，而且已经上线，所以所有的功能性修改对我的技术状况来说都有眼前一黑的感觉。&lt;/li&gt;
&lt;li&gt;开发人员过少，日常维护性工作很多，这对注意力和精力都是一种挑战。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;所以，在相互尝试了一个多月以后，我建议公司寻找足够的，技术能力更强的人来继续开发工作，这份工作机会就这样结束了。&lt;/p&gt;

&lt;p&gt;第二个工作机会是好朋友所在的公司，产品也已上线，正在争取关键性的投资，所以项目进度很紧张。但是由于我这个好朋友的缘故，项目的技术基础非常优秀，TDD 做的非常好，换句话说他已经到了“没有测试就不会写代码”的程度。他对技术的要求和工作流程的要求都非常的严格和正规，可以说是相当靠谱的人和项目，能遇到这么规范的项目的机会真的不多。其实我知道自己与实际要求的差距，项目进度压力也很大，所以我一开始是抱着尝试，学习，实践和帮忙的态度去兼职工作的。但是最终则是自己的问题导致了这份工作的结束。&lt;/p&gt;

&lt;p&gt;原因很简单，正当一切都逐渐步入正轨，自己的技术状态也渐入佳境的时候，家里出了一些非常令人烦恼的状况，导致我不能将精力集中在工作上，而这时候我一边扛着家庭烦恼一边工作，最终将自己搞得内伤，也让项目在关键阶段的一个非常重要的功能延误了。&lt;/p&gt;

&lt;p&gt;虽然好朋友和老板知道情况后都表示理解，但是这样一个严重的失误让我实在是不好意思再继续干下去，也需要时间调整下自己的状态，所以这份工作也在两周前结束了。&lt;/p&gt;

&lt;p&gt;通过这件事，也暴露出来在家办公的一个最大弊端： &lt;strong&gt;工作和生活非常容易混在一起，而且家庭琐事和自己的心情非常容易对工作状态造成极大的影响，因为在家里没办法像在单位那样能够利用环境分散注意力&lt;/strong&gt; 。&lt;/p&gt;

&lt;p&gt;以上的两次工作经历让我对我自己的技术水平和状态产生了许许多多疑惑，这个时候，恰逢貔貅团队到西安一游，得到了与 RubyChina 管理员 / RubyConfChina 的组织者 &lt;strong&gt;吕国宁&lt;/strong&gt; 进行面对面交流的机会。我将我的疑惑告诉了他，他首先肯定了我选择远程工作的努力，并且对我说了一句话：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;这个阶段很多现在远程工作的朋友都经历过，就是要去不断的游击，寻找最适合自己的项目，当你坚持过几个月之后，就会发现自己的技术水平也提升了，这时你再去面试，能够展现出相当于 1 到 2 年 Ruby on Rails 工作经验的技术水平的话，还愁找不到合适的远程工作吗？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这句话对我来说受益匪浅，说明我所经历的这些阶段都是正常的，方向是正确的。&lt;/p&gt;
&lt;h2 id="进步：必然产物"&gt;进步：必然产物&lt;/h2&gt;
&lt;p&gt;虽然短短 3 个月的工作经历，都没能长期做下去，但是这 3 个月中，还是有不少的进步。&lt;/p&gt;
&lt;h3 id="1. 技术进步显著"&gt;1. 技术进步显著&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;先前所学的所有理论知识都得到了实践，清楚认识到了所存在的不足，也对所学知识有了巩固；&lt;/li&gt;
&lt;li&gt;对所学技术有了更系统和深入的了解，当回过头再去看书的时候，能够有更多眼前一亮或者茅塞顿开的感觉；&lt;/li&gt;
&lt;li&gt;接触到了实际的好的代码与不好的代码，这对于转型到 Ruby on Rails 是非常重要的经验；&lt;/li&gt;
&lt;li&gt;尤其是在好朋友那里工作的经历，让我对规范化的项目有了深刻的认识。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2. 理论知识进一步丰富"&gt;2. 理论知识进一步丰富&lt;/h3&gt;
&lt;p&gt;这段时间通过边工作变查找相关资料，学习和收集了很多工作中会用到的有用资源，同时还在调整自己状态的过程中看完了以下几本书：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;《Remote》&lt;/li&gt;
&lt;li&gt;《The Rails 4 Way》&lt;/li&gt;
&lt;li&gt;《高效程序员的 45 个习惯：敏捷开发修炼之道》&lt;/li&gt;
&lt;li&gt;《程序员的思维修炼：开发认知潜能的 9 堂课》&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这每一本书读完后都会有一种 Level Up 的感觉，也强烈推荐给大家！&lt;/p&gt;
&lt;h2 id="阻力：资金与家庭"&gt;阻力：资金与家庭&lt;/h2&gt;
&lt;p&gt;以上说了工作的经历和收获，接下来就要说一说在这三个月中深刻感受到的最大的阻力。&lt;/p&gt;
&lt;h3 id="1. 资金压力"&gt;1. 资金压力&lt;/h3&gt;
&lt;p&gt;资金压力是最关键的问题之一，这取决于你能撑多久，更严重点还会影响到家庭和睦夫妻关系。&lt;/p&gt;

&lt;p&gt;如果你没有任何诸如房租、房贷、车贷、养娃这样的大额固定开支压力的话，那么恭喜你，你的存款将会长久的支持你不断的无忧无虑学习和实践下去，直到你羽翼丰满。&lt;/p&gt;

&lt;p&gt;但是只要你有上述内容的任何一项，那么你就要认真思索一下像我这样去走向 SOHO 理想是否对你来说适合了：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;你的存款不会支持你太久；&lt;/li&gt;
&lt;li&gt;不要相信父母、老婆、亲戚能够 100% 的理解和支持你，当遇到由资金压力所产生的你意想不到的问题时，他们会给你更意想不到的压力，星星之火真的可以燎原；&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;如果你有超过一项的上述资金压力时，那么请你千万别像我这样走 SOHO 这条路，珍爱生命，三思而后行。&lt;/p&gt;
&lt;h3 id="2. 家庭 == 后盾"&gt;2. 家庭 == 后盾&lt;/h3&gt;
&lt;p&gt;资金压力说完了，现在要重点说说家庭，俗话说家庭是你的港湾，也是你坚强的后盾，但是这一切是需要建立在真正的理解和支持你之上的。&lt;/p&gt;
&lt;h4 id="长辈"&gt;长辈&lt;/h4&gt;
&lt;p&gt;这是我遇到的非常现实的一个问题，家里的长辈们在你下决定的时候鼓励你支持你，同时也会告诫你。但是当你遇到困难或者不顺的时候，才会发现在他们心中，你所做的一切都是： &lt;strong&gt;“没有稳定工作”&lt;/strong&gt; 。&lt;/p&gt;

&lt;p&gt;接下来的一切话你都不会喜欢听，诸如“三十而立，要真正的立起来”，“追逐梦想没错，但是不能给父母和家庭带来压力”等等……&lt;/p&gt;

&lt;p&gt;其实这里面包含了太多的代沟，也包含了太多的长辈对咱们这个行业的不理解，同时更不会理解你所追求的工作和生活方式。&lt;/p&gt;

&lt;p&gt;我想过让他们去看看《Remote》，但是你们觉得他们会去看吗？所以，笑笑就好，当然也要考虑清楚前面所说的资金压力，你还能撑多久，如果算好即将撑不下去的时候，那么赶紧采取措施吧，有技术不愁找不到好工作。&lt;/p&gt;
&lt;h4 id="夫妻"&gt;夫妻&lt;/h4&gt;
&lt;p&gt;其实长辈的影响并不是最主要的，夫妻关系才是根本，所谓家庭是你避风的港湾，家庭是你坚强的后盾，归根到底绝大多数都是说夫妻关系，这方面不多说了，有老婆的自然明白，没老婆的嘛……好好孝敬和哄好父母吧……&lt;/p&gt;
&lt;h2 id="根本原因：自己"&gt;根本原因：自己&lt;/h2&gt;
&lt;p&gt;其实总结了那么多，说白了最终还是原因在于自己，这里面不光包含了技术方面，更多的是生活经验，技术问题总是能招到解决的办法，但是生活中出现的问题可就不是那么好解决了。我们往往将很多的注意力放在了自己的理想和技术追求上，但是放在生活上到底有多少呢？&lt;/p&gt;

&lt;p&gt;换句话说，在决定踏上 SOHO 这条道路之前，你的技术准备和生活准备， &lt;strong&gt;真的准备好了吗&lt;/strong&gt; ？&lt;/p&gt;
&lt;h2 id="接下来"&gt;接下来&lt;/h2&gt;
&lt;p&gt;那么接下来我怎么走？其实没有什么可以避讳的，很简单：&lt;/p&gt;

&lt;p&gt;在资金压力达到红线之前，调整好自己的状态，继续不断提高自己的技术水平，努力去寻找真正适合自己的远程工作机会。&lt;/p&gt;

&lt;p&gt;如果成功了，大家会看到续作去总结工作经验。&lt;/p&gt;

&lt;p&gt;如果失败了，大家会看到一个血淋淋的失败案例，算是给大家做一个参考了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;May the force be with me!&lt;/strong&gt;&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Sat, 01 Mar 2014 23:15:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/17597</link>
      <guid>https://ruby-china.org/topics/17597</guid>
    </item>
    <item>
      <title>大家有没有比较好的 PostgreSQL 学习资料或者书籍可以推荐下？</title>
      <description>&lt;p&gt;随着对 Rails 开发的不断深入，发现 PostgreSQL 是逐渐流行的趋势，我想找一些从 Rails Developer 角度来说比较好的，能够和 Rails Tutorial 这样易学程度差不多的资料或者书来学习下，不知大家有没有什么推荐的吗？&lt;/p&gt;

&lt;p&gt;能够日常部署维护即可，我不追求当 DBA……&lt;/p&gt;

&lt;p&gt;谢谢啦！&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Fri, 28 Feb 2014 21:37:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/17577</link>
      <guid>https://ruby-china.org/topics/17577</guid>
    </item>
    <item>
      <title>在 Rails 3 的 ActionMailer 视图中如何生成 image 的 full url？</title>
      <description>&lt;p&gt;求助，卡在这里半天了，image_path 只能生成相对路径的 url，image_url 是 Rails 4 中的方法，请问在 Rails 3 中如何生成 image 的 full url？&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Fri, 14 Feb 2014 22:40:54 +0800</pubDate>
      <link>https://ruby-china.org/topics/17270</link>
      <guid>https://ruby-china.org/topics/17270</guid>
    </item>
    <item>
      <title>从士兵到程序员再到 SOHO 程序员 (二) - 求职</title>
      <description>&lt;h2 id="从士兵到程序员再到SOHO程序员 (二)"&gt;从士兵到程序员再到 SOHO 程序员 (二)&lt;/h2&gt;
&lt;p&gt;原文地址：
&lt;a href="http://blog.huhao.name/blog/2013/12/13/become-a-freelancer-2/" rel="nofollow" target="_blank"&gt;http://blog.huhao.name/blog/2013/12/13/become-a-freelancer-2/&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;作者：胡皓&lt;/p&gt;

&lt;p&gt;Blog：&lt;a href="http://blog.huhao.name" rel="nofollow" target="_blank" title=""&gt;From Soldier to Programmer - 胡皓的博客&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub：&lt;a href="https://github.com/howiehu" rel="nofollow" target="_blank" title=""&gt;https://github.com/howiehu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twitter：&lt;a href="https://twitter.com/howiehu" rel="nofollow" target="_blank" title=""&gt;howiehu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;新浪微博：&lt;a href="http://www.weibo.com/howiehu" rel="nofollow" target="_blank" title=""&gt;Howie-Hu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CodeSchool：&lt;a href="https://www.codeschool.com/users/260506" rel="nofollow" target="_blank" title=""&gt;My Report Card&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;当我开始写这篇文章的时候，我猛然发现，此时此刻距离我辞职（2013 年 9 月 13 日）至今刚好整整 3 个月时间，看来写这样一篇文章是冥冥之中必须干的事儿。&lt;/p&gt;

&lt;p&gt;那么就让我接着上一篇文章继续写下去吧（上一篇文章请见&lt;a href="http://blog.huhao.name/blog/2013/09/14/become-a-freelancer/" rel="nofollow" target="_blank" title="从士兵到程序员再到SOHO程序员"&gt;《从士兵到程序员再到 SOHO 程序员》&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id="三个月的收获"&gt;三个月的收获&lt;/h2&gt;
&lt;p&gt;三个月之前，我制定过一个学习计划：&lt;a href="http://blog.huhao.name/blog/2013/08/26/a-plan-for-soho/" rel="nofollow" target="_blank" title="《三个月家里蹲转型 Ruby on Rails + SOHO 计划"&gt;《三个月家里蹲转型 Ruby on Rails + SOHO 计划》&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;但是，俗话说得好，计划赶不上变化，在这三个月里我有将近一半的时间在忙于新房装修，跑灵活就业人员社保手续，以及其他杂事上面。&lt;/p&gt;

&lt;p&gt;所以，真正用于学习的时间也就是一个半月左右，回过头来梳理了一下，发现收获的东西倒还是不少的（按照时间先后顺序排列）：&lt;/p&gt;
&lt;h3 id="1. 学会并爱上Vim，最终欲罢不能"&gt;1. 学会并爱上 Vim，最终欲罢不能&lt;/h3&gt;
&lt;p&gt;我是一个工具控，尤其是在写代码这件事情上更是如此。由于先前一直是在搞.NET 开发，使用的最多的 IDE 便是微软的 Visual Studio，所以深受这种高度智能的 IDE 工具的“照顾”和“坑害”。在我的概念中，只有像电影里那样熟练且飞快的使用纯文本编辑器或者命令行工具的家伙们才是真正的在写代码。接触 Ruby on Rails 以后，我一直使用的是 Sublime Text 2，这也是现在比较流行的编辑器。但是，当我在西安 Rubyist 社区活动时，亲眼目睹 &lt;strong&gt;&lt;em&gt;魏伦（Allen Wei）&lt;/em&gt;&lt;/strong&gt; 同学娴熟飞快的使用 Vim 进行开发，在被那种行云流水般的操作震撼的五体投地之后，我下定了决心： &lt;strong&gt;欲善其工，必先利其器，在开始后面一系列计划之前，先把 Vim 学会了再说！&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;于是，我利用一周时间，通过以下两个 Vim 在线学习网站学会了 Vim 的使用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://vim-adventures.com" rel="nofollow" target="_blank" title="VimAdventures"&gt;VimAdventures&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimgenius.com" rel="nofollow" target="_blank" title="VimGenius"&gt;VimGenius&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;随后，我在学习和写代码的过程中，强制要求自己尽可能的使用 Vim。到现在为止，我已经能够熟练的使用 Vim，并且在自己寻找的一堆 Vim 插件的帮助下，高效的进行 Ruby on Rails 开发了，这里秀一下我现在写代码时的屏幕：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i683.photobucket.com/albums/vv200/howiehucn/MyBlogImages/5C4F5E555FEB71672013-12-134E0B534890029.jpg" title="My Vim Editor" alt="My Vim Editor"&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;总结一下使用 Vim 的好处：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在 OS X 下配合 Dash 这个工具可以做到双手不离键盘，注意力可以集中，开发效率很高。&lt;/li&gt;
&lt;li&gt;随时随地，不管是 Windows、OS X 还是 Linux，不管是本地还是远程服务器，都可以立刻开始工作。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;以下是我在学习过程中整理的一些资料：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/howiehu/vim_tutorials" rel="nofollow" target="_blank" title="My Favorite Vim Tutorials And Tools"&gt;《My Favorite Vim Tutorials And Tools》&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/howiehu/mini-vimtutor" rel="nofollow" target="_blank" title="Vim官方教程“精编版”"&gt;《Vim 官方教程“精编版”》&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2. 在西安Rubyist社区活动中做了一次技术分享"&gt;2. 在西安 Rubyist 社区活动中做了一次技术分享&lt;/h3&gt;
&lt;p&gt;在辞职之后，紧接着我就在西安 Rubyist 社区活动中进行了一次有关 REST 的技术分享，这也是我有史以来在众人面前做的第二次技术分享（第一次是在先前公司内部做的 ASP.NET MVC 4 技术分享），这次活动是在 ThoughtWorks 西安公司会议室进行的，人也不少，所以当时挺紧张，不过感觉真的很棒！&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;这是分享时制作并使用的 PPT，保存在 SkyDrive 上，可以直接查看和播放：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sdrv.ms/1jWxObp" rel="nofollow" target="_blank" title="About REST and RESTful Web API"&gt;《About REST and RESTful Web API》&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3. 回顾和复习先前所学的内容"&gt;3. 回顾和复习先前所学的内容&lt;/h3&gt;
&lt;p&gt;由于先前所说的原因，&lt;a href="http://blog.huhao.name/blog/2013/08/26/a-plan-for-soho/" rel="nofollow" target="_blank" title="《三个月家里蹲转型 Ruby on Rails + SOHO 计划"&gt;《三个月家里蹲转型 Ruby on Rails + SOHO 计划》&lt;/a&gt;这个里面的内容我只完成了如下两个：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;重读一遍&lt;a href="http://railstutorial-china.org" rel="nofollow" target="_blank" title=""&gt;《Ruby on Rails Tutorial 3rd Edition》&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;完整阅读&lt;a href="https://leanpub.com/everydayrailsrspec" rel="nofollow" target="_blank" title=""&gt;《Everyday Rails Testing with RSpec》&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;现在回过头来一想，多读书在我目前这个阶段确实不是很重要，以上这两本已经足够用了，看完以后赶快多练手才行，所以也推荐给其他想学 Ruby on Rails 的朋友这两本书，而且这两本书都有 &lt;strong&gt;&lt;em&gt;Andor Chen&lt;/em&gt;&lt;/strong&gt; 同学辛勤翻译的中文版哦！&lt;/p&gt;
&lt;h3 id="4. 短时间参与了一个项目"&gt;4. 短时间参与了一个项目&lt;/h3&gt;
&lt;p&gt;这个项目先前在 Ruby China 论坛发布过招聘贴，帖子写的非常诚恳，当然其中的人也确实非常诚恳，我一直在关注。&lt;/p&gt;

&lt;p&gt;但是后来加入到项目中后（真正干活的话总共是 3 天时间），发现困难比想象中要高，主要原因是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;项目 MVP 阶段及后续阶段的准备资金不足。&lt;/li&gt;
&lt;li&gt;创业团队没有技术领头人，这在资金不足的情况下使得情况更加紧迫。&lt;/li&gt;
&lt;li&gt;我无法认同项目本身的定位和目标。&lt;/li&gt;
&lt;li&gt;个人准备还是不够充分，所以工作起来有些吃力。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;所以，在我认真思考之后，我认为项目本身的客观实际加上我当时的技术状况使得我的加入有可能加速这个项目的失败，所以我还是退出了。&lt;/p&gt;

&lt;p&gt;通过这个短时间的尝试，让我还是有一些收获的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;远程工作没有想象中那样简单。&lt;/li&gt;
&lt;li&gt;亲身体验了远程工作，初步总结了一些经验。&lt;/li&gt;
&lt;li&gt;对自己的技术水平有了更加深刻的认识，所以后来花了更多的时间去学习和练习。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5. 参加了RubyConf China 2013"&gt;5. 参加了 RubyConf China 2013&lt;/h3&gt;
&lt;p&gt;RubyConf China 2013 是中国 Rubyist 在 2013 年的一次最重要的聚会，我很高兴参加了这次会议。&lt;/p&gt;

&lt;p&gt;在这次会议上，我见到了许多先前只在网络上知道的国际国内 Ruby 社区的精英，同时也震撼于很多工作时间不长的朋友都敢于上台演讲。&lt;/p&gt;

&lt;p&gt;通过参加这次会议，让我收获到：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;对国内 Ruby 社区的认识更加清晰。&lt;/li&gt;
&lt;li&gt;很多比我还年轻的朋友的出色演讲让我更加坚定了利用 Ruby on Rails 实现我远程工作的决心。&lt;/li&gt;
&lt;li&gt;认识到自己在这个圈子内的水平处于什么位置。&lt;/li&gt;
&lt;li&gt;英语很重要，作为一个忠实的“听众”，当看到周边朋友们抓住机会就冲上去和大牛们用英语交流的场面我是那个汗颜啊……（不过后来在从北京回西安的高铁上，我和身边的一个澳大利亚哥们儿用英语聊了一路，这才发现原来说英语也没那么困难，而且周围刚工作的小姑娘们对我这英语水平还是报以很崇拜的眼神，好吧这个扯的有点远了……）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;在 RubyConf China 2013 的签售活动上比较幸运的排在第一位与 Dave Thomas 合影留念：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i683.photobucket.com/albums/vv200/howiehucn/MyBlogImages/DSC_0811.jpg" title="2013年10月27日 RubyConfChina 2013 与 Dave Thomas 签售合影" alt="2013年10月27日 RubyConfChina 2013 与 Dave Thomas 签售合影"&gt;&lt;/p&gt;
&lt;h3 id="6. 深入学习Ruby on Rails"&gt;6. 深入学习 Ruby on Rails&lt;/h3&gt;
&lt;p&gt;有了先前这些经历，我认识到我的学习上还有很多不足和欠缺，所以我在练手的同时更加深入的去学习了 Ruby on Rails 的相关知识。&lt;/p&gt;

&lt;p&gt;到目前为止，我已经能够比较完整和系统的建立起了对 Ruby on Rails 的认识，并且结合多年 Web 开发经验，对利用 Ruby on Rails 进行 Web 开发也不再犯怵了，基本上遇到问题都能够有解决的思路和信心。&lt;/p&gt;

&lt;p&gt;和先前短期参与那个项目时的状态相比，可以说现在我已经是一只翅膀硬了，敢于并期待飞翔的“菜鸟”了！&lt;/p&gt;
&lt;h3 id="7. 初步学会iOS开发"&gt;7. 初步学会 iOS 开发&lt;/h3&gt;
&lt;p&gt;对于 iOS 的学习完全是出于我的兴趣加上对这个行业的认识所决定的。&lt;/p&gt;

&lt;p&gt;现在这个时代是一个移动设备崛起的时代，或者说是一场革命，对于我们 Web Developer 来说，单单的掌握从前到后的 Web 开发技术已经不够了，我认为还必须加上移动设备开发才算完整，所以结合我个人对于 Apple 的喜爱，我选择了 iOS 开发而不是 Android，从我个人来说，如果有一天就算要做 Android 的东西，我也可能会去选择 Xamarin 这样自己比较方便过渡的技术。&lt;/p&gt;

&lt;p&gt;目前，我已经在这段时间学习了 iOS 开发的基本知识，并正在征服 CodeSchool 的 iOS 开发课程中，根据当前的进度，应该半个月后就能自己做点小东西玩了。&lt;/p&gt;
&lt;h3 id="8. 通过开发西安Rubyist社区网站来实践所学知识"&gt;8. 通过开发西安 Rubyist 社区网站来实践所学知识&lt;/h3&gt;
&lt;p&gt;项目 GitHub：&lt;a href="https://github.com/xian-rubyists/xian-rubyists-site" rel="nofollow" target="_blank" title=""&gt;xian-rubyists-site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这是我实践我先前所学 Ruby on Rails 知识和 BDD 思想的一个重要途径，由于先前事情太多，所以都是断断续续在做，现在终于有时间做下去了，所以感兴趣的朋友们可以关注下，也算是对我学习成果的一次检验吧。&lt;/p&gt;
&lt;h2 id="寻求一份远程工作"&gt;寻求一份远程工作&lt;/h2&gt;
&lt;p&gt;OK，以上说了说我这三个月以来的收获，现在转入下一个重要的话题：找工作！&lt;/p&gt;

&lt;p&gt;之前一哥们儿在 Ruby China 上得求职贴令我有了写文章求职的动力：&lt;a href="http://ruby-china.org/topics/15217" title=""&gt;《介绍我的项目 ＋ 找一份工作》&lt;/a&gt;， &lt;strong&gt;别看错了，不是我写的啊！:)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;如果您对我感兴趣，并且愿意给我一次实现 SOHO 程序员理想的机会，那么我希望您能够看完我的三篇文章，这样能够让您对我有更加全面的了解：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.huhao.name/blog/2013/08/26/a-plan-for-soho/" rel="nofollow" target="_blank" title="《三个月家里蹲转型 Ruby on Rails + SOHO 计划"&gt;《三个月家里蹲转型 Ruby on Rails + SOHO 计划》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.huhao.name/blog/2013/09/14/become-a-freelancer/" rel="nofollow" target="_blank" title="从士兵到程序员再到SOHO程序员"&gt;《从士兵到程序员再到 SOHO 程序员 (一)》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;不用找了，就是这篇文章了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="我的简要介绍："&gt;我的简要介绍：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;自动步枪的使用、单兵战术技能、军用车辆驾驶……这样的东西你们应该用不着，就不说了，如果需要用到的话我会很感兴趣……&lt;/li&gt;
&lt;li&gt;从零开始自学成才，有很强的学习能力，所以下面不会列出哪些短时间就能学会的东西&lt;/li&gt;
&lt;li&gt;能够阅读英文技术书籍和进行文字交流，能够进行英语对话（敢说，但是还需要不断提高）&lt;/li&gt;
&lt;li&gt;5 年基于 ASP.NET 的 Web 开发经验（其中 2 年 ASP.NET MVC）&lt;/li&gt;
&lt;li&gt;2 年敏捷团队经验&lt;/li&gt;
&lt;li&gt;2 年欧美外包项目经验&lt;/li&gt;
&lt;li&gt;熟练掌握 Windows / OS X / Linux&lt;/li&gt;
&lt;li&gt;TDD / BDD&lt;/li&gt;
&lt;li&gt;HTML5&lt;/li&gt;
&lt;li&gt;CSS3&lt;/li&gt;
&lt;li&gt;Javascript&lt;/li&gt;
&lt;li&gt;JQuery&lt;/li&gt;
&lt;li&gt;CoffeeScript&lt;/li&gt;
&lt;li&gt;Sass&lt;/li&gt;
&lt;li&gt;Ruby on Rails&lt;/li&gt;
&lt;li&gt;iOS&lt;/li&gt;
&lt;li&gt;Git / SVN&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="对于工作的希望"&gt;对于工作的希望&lt;/h3&gt;
&lt;ul&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;li&gt;&lt;strong&gt;热爱技术，热爱技术，热爱技术……&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最重要的：认同远程工作，并且充满活力。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;希望项目能是 Rails 4 的，因为实在不想再返回去学 Rails 3.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="如果您对我感兴趣"&gt;如果您对我感兴趣&lt;/h3&gt;
&lt;p&gt;可以通过以下方式与我联系，或者留下您的联系方式：&lt;/p&gt;

&lt;p&gt;Email: huhao 艾特 outlook.com&lt;/p&gt;

&lt;p&gt;Skype: howiehu（几乎随时都在）&lt;/p&gt;

&lt;p&gt;QQ: 54252159（一般工作、学习、写代码的时候都不会开）&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;我期待着尽早拥有一份能够实现我的个人理想，也能证明我自己能力的工作！&lt;/strong&gt;&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Fri, 13 Dec 2013 23:19:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/16192</link>
      <guid>https://ruby-china.org/topics/16192</guid>
    </item>
    <item>
      <title>《The Rails 4 Way》终于在 Leanpub 上完成 Final release ！开始苦读……</title>
      <description>&lt;p&gt;刚刚收到邮件，期待已久的《The Rails 4 Way》一书终于在 Leanpub 上 Final release！剩下的事情就是纸质书的发布和写前言这些东西。&lt;/p&gt;

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

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/titlepages.leanpub.com/tr4w/large?1386742308" title="The Rails 4 Way" alt="The Rails 4 Way"&gt;&lt;/p&gt;

&lt;p&gt;以下是发布说明：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is the 11th and final release of The Rails 4 Way on Leanpub.com. The manuscript will now be shipped off to &amp;gt; Addison Wesley, where it will be packaged up and published in print within a few months. In this release we have cleaned up all remaining placeholder content with the exception of the foreword, which Steve Klabnik has promised to write for our upcoming print edition.&lt;/p&gt;

&lt;p&gt;Note that in this release, significant revisions have been made to the Ajax, Haml, Rspec, Caching and Security chapters. Cleanup, copyediting and technical review has been done for the entire book. We're not claiming that it's perfect, in fact we still have a few months of the AW post-production process to tie up any further loose-ends that turn up, but it's pretty damn close.&lt;/p&gt;

&lt;p&gt;Kevin and I would like to thank everyone who generously donated their time to technical review and contributed changes and suggestions. (We also thank you for making The Rails 4 Way one of the top-grossing books on Leanpub!)&lt;/p&gt;

&lt;p&gt;Cheers,
Obie Fernandez
December 10, 2013&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>howiehu</author>
      <pubDate>Wed, 11 Dec 2013 14:32:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/16138</link>
      <guid>https://ruby-china.org/topics/16138</guid>
    </item>
    <item>
      <title>凌晨 1 点 50 分跑测试代码，发现 Date.tomorrow 返回了错误的日期，于是乎思路有点混乱，求帮助。</title>
      <description>&lt;p&gt;现在是北京时间 2013 年 11 月 22 日凌晨 1 点 50 分，我在跑测试的时候发现 Date.tomorrow 返回的时间居然也是 2013 年 11 月 22 日……&lt;/p&gt;

&lt;p&gt;这个测试的目的是测试用户输入的生日不能晚于今天，测试代码和实现代码如下：&lt;/p&gt;

&lt;p&gt;实现：&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;birthday_cannot_be_later_than_today&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;birthday&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;birthday&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;
    &lt;span class="n"&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="ss"&gt;:birthday&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'不能晚于今天'&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;测试：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'should not later than today'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="vi"&gt;@user.birthday&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tomorrow&lt;/span&gt;
  &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@user&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;not_to&lt;/span&gt; &lt;span class="n"&gt;be_valid&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以下是 console 的输出信息。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails console --sandbox
Loading development environment in sandbox (Rails 4.0.1)
Any modifications you make will be rolled back on exit

Frame number: 0/3
[1] pry(main)&amp;gt; Date.current
=&amp;gt; Thu, 21 Nov 2013
[2] pry(main)&amp;gt; Date.today
=&amp;gt; Fri, 22 Nov 2013
[3] pry(main)&amp;gt; Date.tomorrow
=&amp;gt; Fri, 22 Nov 2013
from (pry):4:in `&amp;lt;main&amp;gt;'
[4] pry(main)&amp;gt; Time.now
=&amp;gt; 2013-11-22 01:50:33 +0800
[5] pry(main)&amp;gt; Time.current
=&amp;gt; Thu, 21 Nov 2013 17:50:45 UTC +00:00
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这有点奇怪，于是我查看了 rails 的源码：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;...&lt;/span&gt;

    &lt;span class="c1"&gt;# Returns a new Date representing the date 1 day ago (i.e. yesterday's date).&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;yesterday&lt;/span&gt;
      &lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;yesterday&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="c1"&gt;# Returns a new Date representing the date 1 day after today (i.e. tomorrow's date).&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tomorrow&lt;/span&gt;
      &lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tomorrow&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="c1"&gt;# Returns Time.zone.today when &amp;lt;tt&amp;gt;Time.zone&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;config.time_zone&amp;lt;/tt&amp;gt; are set, otherwise just returns Date.today.&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;current&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;zone&lt;/span&gt; &lt;span class="p"&gt;?&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;zone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;发现 tomorrow 和 yesterday 是调用的 Date.current，这就有意思了，Date.current 是有时区概念的，所以我个人分析应该是和我没在 application 中设置 timezone 有关的。(参考了这篇文章 - &lt;a href="http://ruby-china.org/topics/5940" rel="nofollow" target="_blank"&gt;http://ruby-china.org/topics/5940&lt;/a&gt;）&lt;/p&gt;

&lt;p&gt;所以，我在将 config.time_zone 设置成 Beijing 之后这个测试跑通了。&lt;/p&gt;

&lt;p&gt;但是，这又引发了一个问题：&lt;/p&gt;

&lt;p&gt;我在判断生日是否合法的时候，是在后端写的&lt;code&gt;birthday &amp;gt; Date.tomorrow&lt;/code&gt;这种方式，那也就是说，不同时区的人在输入生日的时候会出现：虽然输入的是 Date.today，但是服务器还是认为会出错的情况（好吧，我知道一般没人狗血到写今天作为生日，但是为了严谨……）&lt;/p&gt;

&lt;p&gt;那么有什么办法能够解决这个问题呢？求帮助！&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Fri, 22 Nov 2013 02:34:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/15718</link>
      <guid>https://ruby-china.org/topics/15718</guid>
    </item>
    <item>
      <title>从士兵到程序员再到 SOHO 程序员</title>
      <description>&lt;p&gt;2013 年 9 月 13 日，我从就职了一年半的 S 公司正式离职，并开始了我梦寐以求的“SOHO 程序员”之路。&lt;/p&gt;

&lt;p&gt;这对于我来说，是一次人生道路上的重要选择，在这里，我想分享一下我是如何选择了这条道路的，同时也是对我到目前为止的程序员生涯做一个回顾。&lt;/p&gt;
&lt;h2 id="爱好使然"&gt;爱好使然&lt;/h2&gt;
&lt;p&gt;爱好是驱使我走上程序员道路的源动力，很小的时候家里就有那种用磁带作为数据存储介质的古老电脑，可以说我基本上完整的经历了从 80 年代后期到如今这段时间内个人电脑的发展历程，而电脑也成为了我生活中必不可缺的重要组成部分，所以从事一个能够与自己爱好相符合的工作是一件非常快乐的事情，而如何能够 &lt;strong&gt;让爱好与工作快乐的结合起来&lt;/strong&gt; 则是我一直所追求的目标。&lt;/p&gt;
&lt;h2 id="士兵生涯"&gt;士兵生涯&lt;/h2&gt;
&lt;p&gt;我的第一份工作是军人，高中毕业，北京，汽车兵，2 年义务兵 +3 年一级士官。这是一个与绝大多数科班程序员所不同的人生道路，甚至很多人根本无法将这两个职业联系到一起去，所以这不同的经历也塑造了我与绝大多数程序员不同的性格、思想和处事方法。&lt;/p&gt;

&lt;p&gt;在 5 年的军旅生涯中，部队的特殊环境塑造了我受用至今——并且我坚信会受用终身的几个重要品质： &lt;strong&gt;坚韧&lt;/strong&gt; 、 &lt;strong&gt;果断&lt;/strong&gt; 、 &lt;strong&gt;不服输&lt;/strong&gt; 、 &lt;strong&gt;敢吃苦&lt;/strong&gt; 。另外，还有两个经历给了我特别重要的两件东西：&lt;/p&gt;

&lt;ul&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;/p&gt;

&lt;p&gt;走上这条路，完全是机缘巧合。2007 年初，在我一级士官即将服役期满的时候，我父亲的好友（也是对我影响最大的人之一）给我了一个到他的公司当程序员的机会，同时也告诉我了一句相当重要的话： &lt;strong&gt;如果你不把自己最喜爱的爱好当专业来干，那么就是在浪费时间。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;所以，我开始学编程也就是从那时开始的。&lt;/p&gt;

&lt;p&gt;我的编程入门语言是在部队服役后期突击学习的 Delphi，只可惜 2007 年的 Delphi 已经进入晚年，除了很多老软件公司还在使用它来维护已有产品以外，国内的软件行业已经是 Java 和.NET 的天下，但是不管怎样，Delphi 让我第一次了解了编程是怎样的。&lt;/p&gt;

&lt;p&gt;2008年，退伍后的我加入了父亲好友的E公司，由于公司发展和业务需要，我从刚刚入门还远未熟练的Delphi转型到.NET平台，开始使用C#进行WinForm开发。&lt;/p&gt;

&lt;p&gt;但是这一年的我，对编程并没有产生真正的兴趣，学习也并不主动，可以说浪费了很多的时间。另外，因为先前所说过的部队经历让我的人际交往能力比公司其他同事更强，所以我做的更多的实际上是项目调研、需求分析、产品维护这样的工作。但是现在想一想，其实这些工作对现在的我来说十分的重要，因为通过这些工作，我 &lt;strong&gt;走遍了半个中国的省会城市&lt;/strong&gt; ，让我在 5 年的部队封闭生活之后 &lt;strong&gt;开拓了眼界，接触了各种人和事&lt;/strong&gt; ，同时还积累了大量 &lt;strong&gt;客户需求与分析工作的经验&lt;/strong&gt; 。&lt;/p&gt;

&lt;p&gt;2010 年，由于国内软件行业的客观环境，以及公司所属某集团公司的内部政策变化，公司的经营遇到了困难。我跟随父亲的好友空降到了 H 公司——一个隶属于某大型电力建设集团旗下，拥有央企背景的软件公司。&lt;/p&gt;

&lt;p&gt;为了能够顺利的进入这个公司，并符合公司业务需要，在这一年的上半年，我开始学习 ASP.NET 以及 WebForm 框架，正式走向 Web 应用程序的开发道路。但是这个时候的我，依然没有对编程产生真正的兴趣，直到加入 H 公司之前，我的 ASP.NET 学习水平仍然非常的基础，仅仅能够达到做简单应用的水平，所以那时候的我对于进入一个“拥有央企背景”的“大软件公司”是相当忐忑不安的。不在父亲好友的建议下，认真学习了那个时候很多.NET 程序员都不认真学习的 Javascript，所以相对于其他入门级别的 ASP.NET 程序员来说，我能够做出一些看上去比较“专业”的 Web 前端效果，这在我进入 H 公司初期起到了一定的“隐藏真实实力”的效果。&lt;/p&gt;
&lt;h2 id="成长、回家"&gt;成长、回家&lt;/h2&gt;
&lt;p&gt;加入 H 公司之后的两个月时间，我在进一步熟悉了解公司情况和业务的同时开始发奋深入学习 ASP.NET。可能是因为从小就对电脑特别熟悉的缘故，所以当我真正专心下来学东西的时候，进度变的相当之快，短短两个月时间，已经让我对 ASP.NET 的了解有了突飞猛进的变化，也让我的信心逐渐增强，在我眼中，我已经与其他同事没有明显的技术差距了。&lt;/p&gt;

&lt;p&gt;但是就在技术实力逐渐丰满的同时，我发现 H 公司存在有特别严重的问题：公司一把手对技术一窍不通、毫无核心开发能力、技术水平低下、项目管理及其混乱、公司内部勾心斗角……等等。也正是因为这些问题，让我阴差阳错的获得到了一个特别重要的“战略缓冲期”：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;一方面，因为我先前积累的相比公司其他人员更强的社交能力和项目经验，我逐渐走上了项目管理岗位；&lt;/li&gt;
&lt;li&gt;另一方面，坚持不断的学习，让我感觉在技术上，我与身边的人逐渐拉开了距离（我学会 JQuery 是在广州返回北京的列车上完成的，当时的学习激情和效率相当之高），而这种进步的感觉让我开始对编程逐渐产生兴趣，一发不可收拾。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2011 年，我凭借自己对技术发展的判断，在国内相关资料还很匮乏的情况下，开始购买国外的正版英文 PDF 教材自学 ASP.NET MVC 2，以及很快便推出的 ASP.NET MVC 3。通过这样的学习，让我获得了特别重要的几项进步：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;再也不怕看英文教材，这样我能够比他人更早更快更准确的获取并学习新的技术；&lt;/li&gt;
&lt;li&gt;通过对 ASP.NET MVC 的学习，让我完全从 ASP.NET WebForm 的传统开发思想上解放了出来，对 Web 应用程序开发有了更加深入和整体的认识，同时也对流行技术和 TDD 等思想有了更加全面的了解和学习；&lt;/li&gt;
&lt;li&gt;在学习过程中，了解并学习了敏捷软件开发这个相当重要的东西，并且直接影响到我对软件行业的看法和对未来发展方向的认识。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2012 年初，我已经是项目管理部副主任，正当我努力改变公司项目管理混乱的情况并尝试推行敏捷思想的时候，一场突如其来的由高层勾心斗角引发的栽赃嫁祸砸到了我的头上。此时的我，已对北京的生活压力和个人能力无法完全发挥感到心力交瘁，所以我毅然决然在春节前辞职，凭借之前不断学习积累的技术经验和自学的 ASP.NET MVC 技术加入了提倡敏捷与个人发展的 S 公司西安第一分公司，从北京回到了我阔别 9 年的西安家中。&lt;/p&gt;
&lt;h2 id="煎熬"&gt;煎熬&lt;/h2&gt;
&lt;p&gt;2012 年 3 月，S 公司，一直到现在我都认为非常不错的公司，践行敏捷，注重个人成长。&lt;/p&gt;

&lt;p&gt;在 S 公司，我第一次接触了欧美离岸外包项目，以及敏捷实践，在这里让我对敏捷软件开发有了深刻认识和体验，技术水平也有了进一步的提高。可以说，在加入 S 公司之后的相当长一段时间内，我都是快乐的。&lt;/p&gt;

&lt;p&gt;但是，随着时间的推移，我所在的团队和项目中的一些我无法改变的客观问题逐渐暴露出来：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;由于我所在的项目是西安分公司的第一个大项目，团队组建的比较仓促，招人时要求不够高，技术水平与项目要求存在差距；&lt;/li&gt;
&lt;li&gt;团队成员不愿主动学习技术，尤其是去主动学习流行技术，导致类似 JQuery 这种东西在一年后依然用的磕磕巴巴，另外很多有益的东西无法推行下去，比如 TDD；&lt;/li&gt;
&lt;li&gt;团队成员并不爱好编程，在我看来依旧是把编程当做混饭吃的工具，没有什么技术追求；&lt;/li&gt;
&lt;li&gt;团队成员一些根深蒂固的观念难以扭转，敏捷依然停留在表面形式上，没有扎根到心里，甚至到一年以后，很多敏捷开发中的重要内容，比如 CodeReview 和回顾都无法坚持做下去；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这时，通过和公司经理的几次技术交流中，我对 Ruby on Rails 有了初步的了解（先前只是听说过但没有研究过），在进一步了解的过程中，我逐渐发现 Ruby 语言和 Ruby 社区对我的吸引力越来越大，也让我对开源软件和开源文化有了越来越多的认识，以至于最终让我的思想有了彻底的改变： &lt;strong&gt;原来程序员的世界可以这样的快乐和活跃&lt;/strong&gt; 。&lt;/p&gt;

&lt;p&gt;随着对 Ruby 及 Rails 如痴如醉般的不断学习，我感到工作变得越来越不快乐，工作效率也越来越低，这种感觉甚至可以说是是一种煎熬。&lt;/p&gt;

&lt;p&gt;在我看来，这些不快乐是由于以下因素造成的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET 程序员受国内环境以及微软技术的影响，社区活跃度不高，普遍技术水平偏低，对流行技术和思想的接受速度太慢，难以在技术上找到共同语言或者同道中人。&lt;/li&gt;
&lt;li&gt;个人经历所塑造的性格与周围的同事差异太大，虽然尝试不断改变自己，但是这种过程相当艰难，并且很不舒服；&lt;/li&gt;
&lt;li&gt;个人技术进步与团队成员形成的落差（世界上最遥远的距离不是我努力学习，你不努力学习，而是我在努力学习你却认为我是在装逼）。&lt;/li&gt;
&lt;li&gt;因为团队的能力不足，造成项目在交付阶段问题重重，而我个人又无力改变这一切。&lt;/li&gt;
&lt;li&gt;长期拴在一个项目之上，让我无法将业余时间所学的东西用在实际当中。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="自我改变"&gt;自我改变&lt;/h2&gt;
&lt;p&gt;既然无法改变环境，那么只能改变自己，我开始寻找能够让自己快乐起来的办法——参加技术社区活动，去寻找志同道合的伙伴。&lt;/p&gt;

&lt;p&gt;2013 年，我在 ruby-china 上结识了 &lt;a href="/yorzi" class="user-mention" title="@yorzi"&gt;&lt;i&gt;@&lt;/i&gt;yorzi&lt;/a&gt; 和 &lt;a href="/allenwei" class="user-mention" title="@allenwei"&gt;&lt;i&gt;@&lt;/i&gt;allenwei&lt;/a&gt; 等西安地区的 Rubyist，后来大家一拍即合的组织起了 Xi'an Rubyist 的线下技术交流活动。&lt;/p&gt;

&lt;p&gt;由于 &lt;a href="/yorzi" class="user-mention" title="@yorzi"&gt;&lt;i&gt;@&lt;/i&gt;yorzi&lt;/a&gt; 和 &lt;a href="/allenwei" class="user-mention" title="@allenwei"&gt;&lt;i&gt;@&lt;/i&gt;allenwei&lt;/a&gt; 均是 SOHO 多年的资深 Freelancer，在与他们的接触交流过程中，我突然意识到我所学的 Ruby 和 Rails 等技术与其他技术不太一样，在社区更加活跃、自由、新潮的同时，还有一项特别实惠的优势： &lt;strong&gt;在家办公的可能性更大&lt;/strong&gt; 。&lt;/p&gt;

&lt;p&gt;在他们二人的鼓励和支持之下和研究了他们的 SOHO 经验之后，Ruby on Rails + SOHO 这对组合似乎可以成为解决我的煎熬状态的首选解决方案：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;我可以用一个我喜爱的技术来工作，而不是用为工作而选择的技术；&lt;/li&gt;
&lt;li&gt;我可以拥抱一个崇尚技术的社区，找到志同道合的人，选择自己喜爱的团队；&lt;/li&gt;
&lt;li&gt;我可以享受 SOHO 带来的一系列提升生活质量的好处（至于都有什么好处，ruby-china 上已经有很多经典帖子来说明了，在此不再重复）；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;换句话说，是时候走出我的舒适区了，我需要再一次改变， &lt;strong&gt;技术在身，无可畏惧&lt;/strong&gt; 。&lt;/p&gt;

&lt;p&gt;所以，在持续了五个月的疯狂学习之后，我选择了辞职，走上了 SOHO 程序员之路。&lt;/p&gt;
&lt;h2 id="在路上"&gt;在路上&lt;/h2&gt;
&lt;p&gt;现在，我在家中，心情舒畅，没有了天天堵车上班的痛苦，也没有了先前的烦恼。&lt;/p&gt;

&lt;p&gt;写下这篇文章，作为&lt;a href="http://ruby-china.org/topics/13637" title=""&gt;SOHO 程序员之路的开始&lt;/a&gt;，我知道后面的道路会有以前不曾有过的各种困难和挑战，但是我很喜欢 &lt;a href="/poshboytl" class="user-mention" title="@poshboytl"&gt;&lt;i&gt;@&lt;/i&gt;poshboytl&lt;/a&gt; 同学分享给我的一句话：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“当你决定出发，最大的困难已不复存在！”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我信，我行！&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Tue, 17 Sep 2013 21:59:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/14189</link>
      <guid>https://ruby-china.org/topics/14189</guid>
    </item>
    <item>
      <title>随手摘 - Vim 官方教程 “精编版”</title>
      <description>&lt;p&gt;&lt;a href="http://blog.huhao.name/blog/2013/09/08/mini-vimtutor/" rel="nofollow" target="_blank"&gt;http://blog.huhao.name/blog/2013/09/08/mini-vimtutor/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Vim官方教程“精编版”"&gt;Vim 官方教程“精编版”&lt;/h2&gt;
&lt;p&gt;这是我在学习 Vim 官方自带的 vimtutor 教程时，顺手将每个小结节选下来的 Vim 官方教程“精编版”，顺便用 Markdown 重新排版了一下，发现其实这也是个不错的参考资料，给广大 Vim 同好参考用吧。&lt;/p&gt;

&lt;p&gt;另外，针对搞 Rails 的开发环境和学习途径：&lt;/p&gt;

&lt;p&gt;初学者建议直接用&lt;a href="https://github.com/carlhuda/janus" rel="nofollow" target="_blank" title=""&gt;Janus&lt;/a&gt;，所有但凡你能用到的都包括在里面了，比如 rails.vim 和 vim-coffee-script，等你觉得不够用了的时候，也就基本上可以上到更高一级台阶了。&lt;/p&gt;

&lt;p&gt;学习基本操作和 rails.vim 建议看&lt;a href="http://vimgenius.com/" rel="nofollow" target="_blank" title=""&gt;VimGenius&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;另外奉上 &lt;a href="https://github.com/howiehu/vim_tutorials" rel="nofollow" target="_blank" title=""&gt;本人收集的学习资料和工具&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="第一讲小结"&gt;第一讲小结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;光标在屏幕文本中的移动既可以用箭头键，也可以使用 hjkl 字母键。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;h&lt;/code&gt; (左移)   &lt;code&gt;j&lt;/code&gt; (下行) &lt;code&gt;k&lt;/code&gt; (上行) &lt;code&gt;l&lt;/code&gt; (右移)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;欲进入 Vim 编辑器 (从命令行提示符)，请输入：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vim 文件名 &amp;lt;回车&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;欲退出 Vim 编辑器，请输入 &lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;ESC&amp;gt; :q! &amp;lt;回车&amp;gt;&lt;/code&gt; 放弃所有改动。&lt;/p&gt;

&lt;p&gt;或者输入 &lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;ESC&amp;gt; :wq &amp;lt;回车&amp;gt;&lt;/code&gt; 保存改动。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在正常模式下删除光标所在位置的字符，请按：&lt;code&gt;x&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;欲插入或添加文本，请输入：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;i 输入欲插入文本 &amp;lt;ESC&amp;gt;&lt;/code&gt; 在光标前插入文本&lt;/p&gt;

&lt;p&gt;&lt;code&gt;A 输入欲添加文本 &amp;lt;ESC&amp;gt;&lt;/code&gt; 在一行后添加文本&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;特别提示：按下 &lt;code&gt;&amp;lt;ESC&amp;gt;&lt;/code&gt; 键会带您回到正常模式或者撤消一个不想输入或部分完整
的命令。&lt;/p&gt;
&lt;h2 id="第二讲小结"&gt;第二讲小结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;欲从当前光标删除至下一个单词，请输入：&lt;code&gt;dw&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;欲从当前光标删除至当前行末尾，请输入：&lt;code&gt;d$&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;欲删除整行，请输入：&lt;code&gt;dd&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;欲重复一个动作，请在它前面加上一个数字：&lt;code&gt;2w&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在正常模式下修改命令的格式是：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;operator [number] motion&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;其中：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;operator&lt;/code&gt; - 操作符，代表要做的事情，比如 d 代表删除&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[number]&lt;/code&gt; - 可以附加的数字，代表动作重复的次数&lt;/p&gt;

&lt;p&gt;&lt;code&gt;motion&lt;/code&gt;   - 动作，代表在所操作的文本上的移动，例如 &lt;code&gt;w&lt;/code&gt; 代表单词 (word)，&lt;code&gt;$&lt;/code&gt; 代表行末等等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;欲移动光标到行首，请按数字 0 键：&lt;code&gt;0&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;欲撤消以前的操作，请输入：&lt;code&gt;u&lt;/code&gt; (小写的 u)&lt;/p&gt;

&lt;p&gt;欲撤消在一行中所做的改动，请输入：&lt;code&gt;U&lt;/code&gt; (大写的 U)&lt;/p&gt;

&lt;p&gt;欲撤消以前的撤消命令，恢复以前的操作结果，请输入：&lt;code&gt;CTRL-R&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="第三讲小结"&gt;第三讲小结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;要重新置入已经删除的文本内容，请按小写字母 &lt;code&gt;p&lt;/code&gt; 键。该操作可以将已删除的文本内容置于光标之后。如果最后一次删除的是一个整行，那么该行将置
 于当前光标所在行的下一行。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;要替换光标所在位置的字符，请输入小写的 &lt;code&gt;r&lt;/code&gt; 和要替换掉原位置字符的新字
 符即可。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;更改类命令允许您改变从当前光标所在位置直到动作指示的位置中间的文本。&lt;/p&gt;

&lt;p&gt;比如输入 &lt;code&gt;ce&lt;/code&gt; 可以替换当前光标到单词的末尾的内容；&lt;/p&gt;

&lt;p&gt;输入 &lt;code&gt;c$&lt;/code&gt; 可以替换当前光标到行末的内容。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;更改类命令的格式是：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;c [number] motion&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="第四讲小结"&gt;第四讲小结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CTRL-G&lt;/code&gt; 用于显示当前光标所在位置和文件状态信息。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;G&lt;/code&gt; 用于将光标跳转至文件最后一行。&lt;/p&gt;

&lt;p&gt;先敲入一个行号然后输入大写 &lt;code&gt;G&lt;/code&gt; 则是将光标移动至该行号代表的行。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gg&lt;/code&gt; 用于将光标跳转至文件第一行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入 &lt;code&gt;/&lt;/code&gt; 然后紧随一个字符串是在当前所编辑的文档中正向查找该字符串。&lt;/p&gt;

&lt;p&gt;输入 &lt;code&gt;?&lt;/code&gt; 然后紧随一个字符串则是在当前所编辑的文档中反向查找该字符串。&lt;/p&gt;

&lt;p&gt;完成一次查找之后按 &lt;code&gt;n&lt;/code&gt; 键是重复上一次的命令，可在同一方向上查找下一个匹配字符串所在；&lt;/p&gt;

&lt;p&gt;或者按大写 &lt;code&gt;N&lt;/code&gt; 向相反方向查找下一匹配字符串所在。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CTRL-O&lt;/code&gt; 带您跳转回较旧的位置，&lt;code&gt;CTRL-I&lt;/code&gt; 则带您到较新的位置。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;如果光标当前位置是括号 (、)、[、]、{、}，按 &lt;code&gt;%&lt;/code&gt; 会将光标移动到配对的括号上。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在一行内替换头一个字符串 old 为新的字符串 new，请输入 &lt;code&gt;:s/old/new&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;在一行内替换所有的字符串 old 为新的字符串 new，请输入 &lt;code&gt;:s/old/new/g&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;在两行内替换所有的字符串 old 为新的字符串 new，请输入 &lt;code&gt;:#,#s/old/new/g&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;在文件内替换所有的字符串 old 为新的字符串 new，请输入 &lt;code&gt;:%s/old/new/g&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;进行全文替换时询问用户确认每个替换需添加 c 标志 &lt;code&gt;:%s/old/new/gc&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="第五讲小结"&gt;第五讲小结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;:!command&lt;/code&gt; 用于执行一个外部命令 command。&lt;/p&gt;

&lt;p&gt;请看一些实际例子：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;:!dir&lt;/code&gt; (MS-DOS) &lt;code&gt;:!ls&lt;/code&gt; (Unix) - 用于显示当前目录的内容。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;:!del FILENAME&lt;/code&gt; (MS-DOS) &lt;code&gt;:!rm FILENAME&lt;/code&gt; (Unix) - 用于删除名为 FILENAME 的文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;:w FILENAME&lt;/code&gt; 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
 件中。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;v motion :w FILENAME&lt;/code&gt; 可将当前编辑文件中可视模式下选中的内容保存到文件
 FILENAME 中。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;:r FILENAME&lt;/code&gt; 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
 后面。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;:r !dir&lt;/code&gt; 可以读取 dir 命令的输出并将其放置到当前文件的光标位置后面。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="第六讲小结"&gt;第六讲小结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;输入小写的 &lt;code&gt;o&lt;/code&gt; 可以在光标下方打开新的一行并进入插入模式。&lt;/p&gt;

&lt;p&gt;输入大写的 &lt;code&gt;O&lt;/code&gt; 可以在光标上方打开新的一行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入小写的 &lt;code&gt;a&lt;/code&gt; 可以在光标所在位置之后插入文本。&lt;/p&gt;

&lt;p&gt;输入大写的 &lt;code&gt;A&lt;/code&gt; 可以在光标所在行的行末之后插入文本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;e&lt;/code&gt; 命令可以使光标移动到单词末尾。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;操作符 &lt;code&gt;y&lt;/code&gt; 复制文本，&lt;code&gt;p&lt;/code&gt; 粘贴先前复制的文本。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;输入大写的 &lt;code&gt;R&lt;/code&gt; 将进入替换模式，直至按 &lt;code&gt;&amp;lt;ESC&amp;gt;&lt;/code&gt; 键回到正常模式。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入 &lt;code&gt;:set xxx&lt;/code&gt; 可以设置 xxx 选项。一些有用的选项如下：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ic&lt;/code&gt; &lt;code&gt;ignorecase&lt;/code&gt;  查找时忽略字母大小写&lt;/p&gt;

&lt;p&gt;&lt;code&gt;is&lt;/code&gt; &lt;code&gt;incsearch&lt;/code&gt; 查找短语时显示部分匹配&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hls&lt;/code&gt; &lt;code&gt;hlsearch&lt;/code&gt; 高亮显示所有的匹配短语&lt;/p&gt;

&lt;p&gt;选项名可以用完整版本，也可以用缩略版本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在选项前加上 &lt;code&gt;no&lt;/code&gt; 可以关闭选项：&lt;code&gt;:set noic&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="第七讲小结"&gt;第七讲小结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;输入 &lt;code&gt;:help&lt;/code&gt; 或者按 &lt;code&gt;&amp;lt;F1&amp;gt;&lt;/code&gt; 键或 &lt;code&gt;&amp;lt;Help&amp;gt;&lt;/code&gt; 键可以打开帮助窗口。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;输入 &lt;code&gt;:help cmd&lt;/code&gt; 可以找到关于 cmd 命令的帮助。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;输入 &lt;code&gt;CTRL-W CTRL-W&lt;/code&gt;  可以使您在窗口之间跳转。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;输入 &lt;code&gt;:q&lt;/code&gt; 以关闭帮助窗口&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;您可以创建一个 vimrc 启动脚本文件用来保存您偏好的设置。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;当输入 &lt;code&gt;:&lt;/code&gt; 命令时，按 &lt;code&gt;CTRL-D&lt;/code&gt; 可以查看可能的补全结果。
 按 &lt;code&gt;&amp;lt;TAB&amp;gt;&lt;/code&gt; 可以使用一个补全。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>howiehu</author>
      <pubDate>Sun, 08 Sep 2013 20:30:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/13968</link>
      <guid>https://ruby-china.org/topics/13968</guid>
    </item>
    <item>
      <title>求助，为毛我的 Vim 的 Airline 显示这么山寨？(已解决)</title>
      <description>&lt;p&gt;我是使用的 Janus，装了个 airline，是直接 git clone 到.janus 下的，但是为毛我的显示这么山寨呢？完全没有官方截图中那样高端洋气上档次！我的 Theme 用的是 RailsCasts，这是咋回事儿啊？&lt;/p&gt;

&lt;p&gt;我的：
&lt;img src="http://i683.photobucket.com/albums/vv200/howiehucn/Temp/Snip20130906_1.png" title="" alt="My airline"&gt;&lt;/p&gt;

&lt;p&gt;官方的：
&lt;img src="https://f.cloud.github.com/assets/306502/1060831/05c08aac-11bc-11e3-8470-a506a3037f45.png" title="" alt="Official airline"&gt;&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Fri, 06 Sep 2013 23:50:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/13938</link>
      <guid>https://ruby-china.org/topics/13938</guid>
    </item>
    <item>
      <title>下个月正式离职，然后利用三个月时间转型 Ruby on Rails + SOHO，写了个计划，望各路有经验的大牛多提提意见。</title>
      <description>&lt;p&gt;本人目前就职于北京盛安德科技发展有限公司西安第一分公司，由于趁自己还年轻（29 了算不算年轻啊………………），一直希望能够利用自己所喜爱的技术实现在家办公的愿望，所以我于 8 月 7 日向经理提出了辞职的想法，8 月 19 日提交的辞职申请，目前正处于一个月的工作交接期内，也就是说，从下个月（9 月份）开始，我就可以正式离职并利用三个月时间转型 Ruby on Rails + SOHO 工作了。&lt;/p&gt;

&lt;p&gt;在这里罗列一下本人的技术状况和这三个月的计划，希望各路有经验的大牛能够根据经验多多提供宝贵意见。&lt;/p&gt;

&lt;p&gt;PS：我之前在北京待了 9 年，去年初回到西安，家就在西安，所以生活上没有太多顾虑才敢考虑辞职 SOHO 的。&lt;/p&gt;
&lt;h2 id="本人技术背景"&gt;本人技术背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;没上过大学，当了五年兵，所有技术全靠自己从小的兴趣爱好 + 自学完成&lt;/li&gt;
&lt;li&gt;英语书籍阅读 + 书写（老外能看明白的水平）&lt;/li&gt;
&lt;li&gt;Windows/Linux/Mac OS X 三大操作系统通吃，目前有一台顶配 Mac Mini 用于接下来的工作和学习=.=&lt;/li&gt;
&lt;li&gt;3 年国内传统软件公司工作经验（深恶痛绝……）&lt;/li&gt;
&lt;li&gt;2 年敏捷团队 + 欧美离岸外包项目工作经验&lt;/li&gt;
&lt;li&gt;3 年 ASP.NET WebForm 开发经验&lt;/li&gt;
&lt;li&gt;2 年 ASP.NET MVC 开发经验&lt;/li&gt;
&lt;li&gt;HTML5/CSS3/JQuery神马的常见基础性的东东就不细说了&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Ruby on Rails 学习经验"&gt;Ruby on Rails 学习经验&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;已经自己利用业余时间断断续续学习了近 4 个月的 Ruby on Rails 及相关技术&lt;/li&gt;
&lt;li&gt;镐头书、RailsTutorial 等书都看过一遍&lt;/li&gt;
&lt;li&gt;RailsCasts 订阅用户&lt;/li&gt;
&lt;li&gt;CodeSchool 的学习成果 - &lt;a href="http://www.codeschool.com/users/howiehu" rel="nofollow" target="_blank"&gt;http://www.codeschool.com/users/howiehu&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="接下来三个月家里蹲的计划"&gt;接下来三个月家里蹲的计划&lt;/h2&gt;
&lt;p&gt;第一个月用来复习和充电，准备读一遍下面的书籍，原则是能有中文的就尽可能读中文的节省学习时间：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://pragprog.com/book/ruby4/programming-ruby-1-9-2-0" rel="nofollow" target="_blank" title=""&gt;Programming Ruby 2.0&lt;/a&gt; （重读一遍）&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://railstutorial-china.org/" rel="nofollow" target="_blank" title=""&gt;Ruby on Rails Tutorial 3rd Edition&lt;/a&gt; （重读一遍）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leanpub.com/everydayrailsrspec" rel="nofollow" target="_blank" title=""&gt;Everyday Rails Testing with RSpec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;快速重新过一遍 CodeSchool 的 Rails/CoffeScript/Sass 相关课程&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;辅助阅读（三个月时间读完即可）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.cn/gp/product/B005KGBTQ8/ref=oh_details_o01_s00_i00?ie=UTF8&amp;amp;psc=1" rel="nofollow" target="_blank" title=""&gt;松本行弘的程序世界&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.cn/gp/product/B00D1HUYVE/ref=oh_details_o01_s00_i01?ie=UTF8&amp;amp;psc=1" rel="nofollow" target="_blank" title=""&gt;代码的未来&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.cn/gp/product/B003KRPG04/ref=oh_details_o00_s00_i00?ie=UTF8&amp;amp;psc=1" rel="nofollow" target="_blank" title=""&gt;重构 (Ruby 版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.cn/gp/product/B0073APSCK/ref=oh_details_o01_s00_i02?ie=UTF8&amp;amp;psc=1" rel="nofollow" target="_blank" title=""&gt;Ruby 元编程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;第一个月剩下的时间和之后的两个月首先来制作 &lt;strong&gt;西安 Rubyist&lt;/strong&gt; 的网站，用于练手，然后在此过程中接触些实际项目实习一下，之后尽可能的将实习转为全职正式工作。&lt;/p&gt;

&lt;p&gt;对于以上计划，尤其是前 1-2 个月的学习计划，大牛们是否还有更好的意见？希望能够多多提出，谢谢！&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Mon, 26 Aug 2013 17:29:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/13637</link>
      <guid>https://ruby-china.org/topics/13637</guid>
    </item>
    <item>
      <title>Sublime Text 3 Beta 向非注册用户开放了！</title>
      <description>&lt;p&gt;Sublime Text 3 Beta 向非注册用户开放了！大家去试一试吧哈哈！&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.sublimetext.com/3" rel="nofollow" target="_blank"&gt;http://www.sublimetext.com/3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;欢迎写评测。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build 3047
Release Date: 27 June 2013
Beta is now open to non-registered users
...&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>howiehu</author>
      <pubDate>Thu, 04 Jul 2013 09:24:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/12232</link>
      <guid>https://ruby-china.org/topics/12232</guid>
    </item>
    <item>
      <title>请问大家有没有使用 Devise+Omniauth 并自定义 “注册 / 绑定” 中间页面的例子？</title>
      <description>&lt;p&gt;如题，我现在需要实现 Devise+Omniauth 注册功能，但是默认的 Devise+Omniauth 在注册时，在 OAuth 认证后是跳转到注册页面的。&lt;/p&gt;

&lt;p&gt;现在我想需要他跳转到一个“注册或绑定”的中间页面来进行操作，大家是否有做过这方面的例子可供参考？&lt;/p&gt;

&lt;p&gt;菜鸟在此谢过！&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Wed, 03 Jul 2013 14:32:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/12209</link>
      <guid>https://ruby-china.org/topics/12209</guid>
    </item>
    <item>
      <title>这个 if a = b &amp;&amp; c ... end 语法代表什么意思呢？</title>
      <description>&lt;p&gt;如这段代码：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&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;new_with_session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tap&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;user&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'devise.googleapps_data'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'devise.googleapps_data'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'user_info'&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="nf"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'email'&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中的：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'devise.googleapps_data'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'devise.googleapps_data'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'user_info'&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="nf"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'email'&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;这个 &lt;code&gt;if a = b &amp;amp;&amp;amp; c ... end&lt;/code&gt; 语法是什么意思呢？&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Fri, 28 Jun 2013 18:12:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/12076</link>
      <guid>https://ruby-china.org/topics/12076</guid>
    </item>
    <item>
      <title>求用过 Devise + Omniauth 的同志们来看看，一定要把取回来的 OAuth 信息放到 session 里面然后导致 cookie 撑爆么？</title>
      <description>&lt;p&gt;如代码所示：&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;Users::OmniauthCallbacksController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Devise&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;OmniauthCallbacksController&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;github&lt;/span&gt;

    &lt;span class="vi"&gt;@user&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;find_for_github_oauth&lt;/span&gt;&lt;span class="p"&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;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"omniauth.auth"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@user.persisted&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;
      &lt;span class="n"&gt;flash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:notice&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt; &lt;span class="s2"&gt;"devise.omniauth_callbacks.success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"GitHub"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_navigational_format?&lt;/span&gt;
      &lt;span class="n"&gt;sign_in_and_redirect&lt;/span&gt; &lt;span class="vi"&gt;@user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:authentication&lt;/span&gt; &lt;span class="c1"&gt;#this will throw if @user is not activated&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"devise.github_data"&lt;/span&gt;&lt;span class="p"&gt;]&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;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"omniauth.auth"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;flash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:notice&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt; &lt;span class="s2"&gt;"devise.omniauth_callbacks.success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:kind&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"GitHub"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_navigational_format?&lt;/span&gt;
      &lt;span class="n"&gt;redirect_to&lt;/span&gt; &lt;span class="n"&gt;new_user_registration_url&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;这一行：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"devise.github_data"&lt;/span&gt;&lt;span class="p"&gt;]&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;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"omniauth.auth"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会把一个巨大无比的 github oauth 信息放到 session 中，这个直接会让 cookie overflow。&lt;/p&gt;

&lt;p&gt;由于不想把 session 存到内存里面，请问这个有必要这样写吗？有什么解决方案没有？&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Thu, 27 Jun 2013 17:39:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/12045</link>
      <guid>https://ruby-china.org/topics/12045</guid>
    </item>
    <item>
      <title>突然有了一种为全世界人民学习 Rails 做了贡献的感觉啊……嘿嘿！</title>
      <description>&lt;p&gt;前几天发了一个做小玩意的时候总结出来的关于 Guard 的使用心得：
&lt;a href="http://ruby-china.org/topics/11508" rel="nofollow" target="_blank"&gt;http://ruby-china.org/topics/11508&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;然后顺手就给 RailsTutorial 的作者 &lt;strong&gt;Michael Hartl&lt;/strong&gt; 写了封邮件告诉他可以按照我的建议改进下书里的代码。&lt;/p&gt;

&lt;p&gt;结果今天收到回信了，让我这个拥抱开源没多久的货突然感到了社区的温暖啊哈哈哈！&lt;/p&gt;

&lt;p&gt;我这算是给全世界人民学习 Rails 做贡献了吧……&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i683.photobucket.com/albums/vv200/howiehucn/MyBlogImages/RailsTutorialEmail.png" title="" alt="Michael Hartl的回信"&gt;&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Sat, 08 Jun 2013 09:53:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/11582</link>
      <guid>https://ruby-china.org/topics/11582</guid>
    </item>
    <item>
      <title>分享下较新的把 Guard 加入 Gemfile 的正确做法</title>
      <description>&lt;p&gt;最近写 Rails 程序练手的时候，由于在家用 Mac OS X，单位电脑上用 Ubuntu，所以在对 Guard 配置的过程中尤其注重了保证体验一致的办法，其中最主要的就是如何调用系统通知中心这一方面。&lt;/p&gt;

&lt;p&gt;先前很多教程或者网上资料中（比如 RailsTutorial 和 RailsCast 等）对 Guard 的 Gemfile 写法都存在过期或冗余，所以自己查找资料更新了相关办法。&lt;/p&gt;

&lt;p&gt;详细内容请看：&lt;a href="http://blog.huhao.name/blog/2013/06/05/use-guard-in-rails-project/" rel="nofollow" target="_blank"&gt;http://blog.huhao.name/blog/2013/06/05/use-guard-in-rails-project/&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ss"&gt;:development&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="c1"&gt;# If you need to use rspec, please replace this by 'guard-repec'.&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'guard'&lt;/span&gt;
  &lt;span class="c1"&gt;# Use for notify on Mac OS X, you must install growl and growlnotify before.&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'growl'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>howiehu</author>
      <pubDate>Wed, 05 Jun 2013 14:53:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/11508</link>
      <guid>https://ruby-china.org/topics/11508</guid>
    </item>
    <item>
      <title>Linode 官方解释此次 “信用卡信息被泄露” 问题，貌似不用换信用卡了？</title>
      <description>&lt;p&gt;&lt;a href="http://blog.linode.com/2013/04/16/security-incident-update/" rel="nofollow" target="_blank"&gt;http://blog.linode.com/2013/04/16/security-incident-update/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Credit card numbers in our database are stored in encrypted format, using public and private key encryption. The private key is itself encrypted with passphrase encryption and the passphrase is not stored electronically. Along with the encrypted credit card, the last four digits are stored in clear text to assist in lookups and for display on things like your Account tab and payment receipt emails. We have no evidence decrypted credit card numbers were obtained.&lt;/p&gt;

&lt;p&gt;不用换卡的话，各种已挂失的弟兄们赶紧取消挂失吧，60 块钱啊……&lt;/p&gt;</description>
      <author>howiehu</author>
      <pubDate>Tue, 16 Apr 2013 16:39:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/10248</link>
      <guid>https://ruby-china.org/topics/10248</guid>
    </item>
  </channel>
</rss>
