<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[Looking forward to change]]></title>
  
  <link href="http://lgn21st.github.com/" />
  <updated>2011-12-11T15:58:10+08:00</updated>
  <id>http://lgn21st.github.com/</id>
  <author>
    <name><![CDATA[Daniel Lv]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/lvguoning" /><feedburner:info uri="lvguoning" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title type="html"><![CDATA[用OptionParser构建Command Line工具]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/t0ffLslo_Kg/" />
    <updated>2011-12-11T10:48:00+08:00</updated>
    <id>http://lgn21st.github.com/blog/2011/12/11/building-a-command-line-tool-with-optionparser</id>
    <content type="html">&lt;h3&gt;Ruby除了rails还能做什么？&lt;/h3&gt;

&lt;p&gt;这两天&lt;a href="http://ruby-china.org"&gt;Ruby-China&lt;/a&gt;上有个一个讨论，关于&lt;a href="http://ruby-china.org/topics/437"&gt;Ruby除了rails还能做什么&lt;/a&gt;，其实除了Rails之外，Ruby能做的太多太多了，不过就我来说，除了用于Rails开发之外，Ruby我用的最多的就是写各种Command Line工具来解决各种小问题，Command Line工具又称为命令行工具。&lt;/p&gt;

&lt;p&gt;提到用Ruby写命令行工具，就绕不过一个问题，如何解析命令行参数？&lt;/p&gt;

&lt;h3&gt;Unix下的命令行工具&lt;/h3&gt;

&lt;p&gt;先啰嗦一下Unix下的命令行工具，Unix的命令行工具历史悠久，这里面故事非常非常多（以后再讲，或者参见&lt;a href="http://book.douban.com/subject/1467587/"&gt;Unix编程艺术&lt;/a&gt;）。随着时间的推移，对于如何正确构建优良的命令行工具，Unix社区慢慢形成了一整套完整的Convertion以及惯用法，如果你的命令行工具遵从这些Convertion，那么用户将会非常容易的去使用你的命令行工具，甚至通过简洁的方式，将你的命令行工具和各种其他工具组合起来，用来完成各种复杂的操作。&lt;/p&gt;

&lt;p&gt;正确的处理命令行参数对于写出高质量的命令行工具非常重要，那么如何正确的处理命令行参数呢？如果有C语言编程经验，或者用C语言写过命令行工具的人可能很熟悉&lt;a href="http://en.wikipedia.org/wiki/Getopt"&gt;getopt&lt;/a&gt;(GNU getopt_long())，getopt是C Library中一个专门用于解析命令行参数的工具，通常用C去写命令行工具的时候，getop是一个很自然选择。&lt;/p&gt;

&lt;h3&gt;用Ruby写命令行工具&lt;/h3&gt;

&lt;p&gt;当使用Ruby写命令行工具的时候，我们在不借助任何内置/外置的命令行参数解析工具的情况下，可以直接从&lt;code&gt;ARGV&lt;/code&gt;取到传入命令行的参数，然后手工判断，验证并执行后续操作。不过从遵循Unix的命令行工具的Convertion角度来讲，我不建议你直接从ARGV取数值，而是利用现有的库来作这件事情。Ruby的标准库内置提供了一个getopt的Ruby实现&lt;a href="http://ruby-doc.org/stdlib-1.9.2/libdoc/getoptlong/rdoc/GetoptLong.html"&gt;GetoptLong&lt;/a&gt;，&lt;a href="http://ruby-doc.org/stdlib-1.9.2/libdoc/getoptlong/rdoc/GetoptLong.html"&gt;GetoptLong&lt;/a&gt;基本上模拟了C语言版本的全部借口/功能，不过Ruby开发社区不推荐你使用&lt;a href="http://ruby-doc.org/stdlib-1.9.2/libdoc/getoptlong/rdoc/GetoptLong.html"&gt;GetoptLong&lt;/a&gt;，而是建议使用另外一个也是内置的且更加强大的解析库:&lt;a href="http://ruby-doc.org/stdlib-1.9.2/libdoc/optparse/rdoc/OptionParser.html"&gt;OptionParser&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;这个世界上总是有人不断的重新发明轮子，除了Ruby已经内置的OptionParser，还有下面这些第三方实现的轮子:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rubygems.org/gems/thor"&gt;Thor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubygems.org/gems/trollop"&gt;Trollop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/davetron5000/gli"&gt;Gli&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubygems.org/gems/choice"&gt;Choice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubygems.org/gems/optiflag"&gt;Optiflag&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Thor是Rails 3以后内建的命令行工具，严格意义上说，Thor不仅仅用于解析命令行参数，而是用于替代rake作为新的task标准工具，Thor的命令行参数的Parser是自己实现的，我个人建议在写Rails的task的时候，把Thor作为首选，但是作一般用途的命令行工具，Thor有点overkill了。&lt;/p&gt;

&lt;p&gt;Gli是一个用于建立“Git-Like Interface Command Line Parser”的工具，这里我简单给出一个什么是“Git-Like”的解释。通常Unix下的命令行工具都符合一个哲学，即“作一件事并且把它做好”，但是有些功能强大复杂的工具，如git，可以通过指定不同的&lt;code&gt;Action&lt;/code&gt;执行不同的操作，比如&lt;code&gt;git&lt;/code&gt;的&lt;code&gt;push&lt;/code&gt;和&lt;code&gt;pull&lt;/code&gt;操作:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git push
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git pull
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;就是两个完全不同的操作，但是他们的&lt;code&gt;command&lt;/code&gt;部分都是&lt;code&gt;git&lt;/code&gt;，只是&lt;code&gt;action&lt;/code&gt;部分不同。我们也可以把这样的通过不同的&lt;code&gt;action&lt;/code&gt;来实现不同的操作的命令行工具叫做Command-Suit工具，即从功能上看，它不是一个命令，而是一个命令的&lt;code&gt;suit&lt;/code&gt;集合。Gli就是帮助你快速实现这种&lt;code&gt;Command-Suit&lt;/code&gt;的框架，如果你需要编写复杂的命令行工具，Gli是一个不错的选择。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Trollop&lt;/code&gt;，&lt;code&gt;Choice&lt;/code&gt;和&lt;code&gt;Optiflag&lt;/code&gt;都是命令行参数的Ruby Parser，他们的目的一致，而且他们解析过程都遵循Unix的约定，只是实现各有不同，用法也不同，不过对我来说，他们都是一回事。就Unix命令行来说，参数只有Options，Arguments，以及Actions而已，所以具体用哪个，看你的个人喜好，简单对比下来我认为&lt;code&gt;Choice&lt;/code&gt;的DSL语法最易读，简洁，优雅，如果你需要这些第三方Command Line parser的时候，不妨考虑一下Choice。不过我奉行另外一个原则，如果系统内置了的，我就不考虑第三方gem，而且Ruby内置的OptionParser足够强大，能满足我对解析Unix的命令行参数的一切需求，所以我优选使用OptionParser。这里我简单猜测一下为什么还有这么多第三方的轮子，第一是不知道Ruby已经内置了这个，第二个可能就是不爽Ruby内置的这个parser的文档或用法，虽然OptionParser足够强大灵活，但是不代表它好用，容易上手，相反，它的文档就相当坑爹！&lt;/p&gt;

&lt;h3&gt;用OptionParser创建命令行工具&lt;/h3&gt;

&lt;p&gt;下面这张图就是Ruby给出的OptionParser的文档，除了这张图片之外就是一个官方范例，然后就没了… 说实话我第一眼看了这张图和官方范例后感觉看不懂，需要反复通过Google各种文章和范例，才了解到了OptionParser的基本用法。&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;+--------------+
&lt;/span&gt;&lt;span class='line'&gt;| OptionParser |&amp;lt;&amp;gt;-----+
&lt;/span&gt;&lt;span class='line'&gt;+--------------+       |                      +--------+
&lt;/span&gt;&lt;span class='line'&gt;                       |                    ,-| Switch |
&lt;/span&gt;&lt;span class='line'&gt;     on_head --------&amp;gt;+---------------+    /  +--------+
&lt;/span&gt;&lt;span class='line'&gt;     accept/reject --&amp;gt;| List          |&amp;lt;|&amp;gt;-
&lt;/span&gt;&lt;span class='line'&gt;                      |               |&amp;lt;|&amp;gt;-  +----------+
&lt;/span&gt;&lt;span class='line'&gt;     on -------------&amp;gt;+---------------+    &lt;span class="sb"&gt;`&lt;/span&gt;-| argument |
&lt;/span&gt;&lt;span class='line'&gt;                        :           :        |  class   |
&lt;/span&gt;&lt;span class='line'&gt;                      +---------------+      |&lt;span class="o"&gt;==========&lt;/span&gt;|
&lt;/span&gt;&lt;span class='line'&gt;     on_tail --------&amp;gt;|               |      |pattern   |
&lt;/span&gt;&lt;span class='line'&gt;                      +---------------+      |----------|
&lt;/span&gt;&lt;span class='line'&gt;OptionParser.accept -&amp;gt;| DefaultList   |      |converter |
&lt;/span&gt;&lt;span class='line'&gt;             reject   |&lt;span class="o"&gt;(&lt;/span&gt;shared between|      +----------+
&lt;/span&gt;&lt;span class='line'&gt;                      | all instances&lt;span class="o"&gt;)&lt;/span&gt;|
&lt;/span&gt;&lt;span class='line'&gt;                      +---------------+
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;通常的Unix命令行参数包含下面这些形式：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Option - Option主要功能是用于调整命令行工具的行为，Option的表现通常有两种形式，&lt;code&gt;short option&lt;/code&gt;或者&lt;code&gt;long option&lt;/code&gt;。Option的类型有两种，&lt;code&gt;switch&lt;/code&gt;或&lt;code&gt;flag&lt;/code&gt;，&lt;code&gt;switch&lt;/code&gt;不带argument，而&lt;code&gt;flag&lt;/code&gt;带有argument。&lt;/li&gt;
&lt;li&gt;Argument - Argument通常表示命令行工具要操作的对象，通常是路径，URL或者名称等等。&lt;/li&gt;
&lt;li&gt;Action - 表示命令行工具的行为，比如&lt;code&gt;git&lt;/code&gt;命令的&lt;code&gt;push&lt;/code&gt;或者&lt;code&gt;pull&lt;/code&gt;等等。&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;举个例子&lt;code&gt;git log --max-count=10&lt;/code&gt;：&lt;code&gt;git&lt;/code&gt;是command。&lt;code&gt;log&lt;/code&gt;是action，表示查看git的提交历史。&lt;code&gt;--max-count&lt;/code&gt;就是option，表示最多显示N条commit记录。而最后的&lt;code&gt;=10&lt;/code&gt;就是argument，表示option的数值，即查看最后10条历史提交记录。所有的Unix命令行工具都遵循这样的一个约定，这里需要主意一下，Argument前面的&lt;code&gt;=&lt;/code&gt;在很多命令行工具中是可以省略的。&lt;/p&gt;

&lt;p&gt;用&lt;code&gt;OptionParser&lt;/code&gt;创建一个简单的命令行工具，通常我们只需要创建一个&lt;code&gt;OptionParser&lt;/code&gt;的实例instance，然后给这个instance传入一个block，在这个block内部我们就可以使用OptionParser提供的方法来解析命令行参数，特别是用&lt;code&gt;on&lt;/code&gt;方法来根据定义捕捉各种参数，并将参数解析成可被使用的Ruby数据，如String，Boolean，Array以及Hash等。而&lt;code&gt;on&lt;/code&gt;方法最让人困惑的地方就是它异常灵活参数处理，比如&lt;code&gt;on&lt;/code&gt;方法的第一个参数，如果是一个&lt;code&gt;-&lt;/code&gt;加一个非空格字符，则把这个参数当作switch来处理，例如&lt;code&gt;on('-n')&lt;/code&gt;，如果是一个&lt;code&gt;-&lt;/code&gt;开头的字符，后面跟着一个空格外加另外一个字符，那么就把这个参数当作flag处理，例如&lt;code&gt;on('-n NAME')&lt;/code&gt;。如果&lt;code&gt;on&lt;/code&gt;方法的参数超过两个，并且两个都是String，那么则视这两个参数表示一个意思，例如&lt;code&gt;on('-n NAME', '--name NAME')&lt;/code&gt;。如此这般的例子还有很多，如果有更高需求的朋友，我建议你还是直接去啃源代码吧。&lt;/p&gt;

&lt;p&gt;下面我创建一个名为&lt;code&gt;my_awesome_command.rb&lt;/code&gt;的命令行工具，这个工具直接输出我的命令行参数解析的结果，我用中文注释来说明OptionParser视怎么用的:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;#!/usr/bin/env ruby&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;optparse&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;option_parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;OptionParser&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;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# 这里是这个命令行工具的帮助信息&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;banner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;here is help messages of the command line tool.&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# Option 作为switch，不带argument，用于将switch设置成true或false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:switch&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-s&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--switch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Set options as switch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:switch&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# Option 作为flag，带argument，用于将argument作为数值解析，比如&amp;quot;name&amp;quot;信息&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-n NAME&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--name Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Pass-in single name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&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;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# Option 作为flag，带一组用逗号分割的arguments，用于将arguments作为数组解析&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-a A,B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--array A,B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;List of arguments&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&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;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:array&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse!&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;执行结果&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;ruby&lt;/span&gt; &lt;span class="n"&gt;my_awesome_command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rb&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;here&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;switch&lt;/span&gt;                     &lt;span class="no"&gt;Set&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt; &lt;span class="no"&gt;Name&lt;/span&gt;                  &lt;span class="no"&gt;Pass&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;single&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;                  &lt;span class="no"&gt;List&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;ruby&lt;/span&gt; &lt;span class="n"&gt;my_awesome_command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rb&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:switch&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;ruby&lt;/span&gt; &lt;span class="n"&gt;my_awesome_command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rb&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="no"&gt;Daniel&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:switch&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Daniel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;ruby&lt;/span&gt; &lt;span class="n"&gt;my_awesome_command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rb&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="no"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;Bar&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:switch&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:array&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Bar&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;hr /&gt;

&lt;p&gt;希望以上内容能够帮助你掌握写出能解析符合Unix标准的命令行参数的工具，如果要写出易用，对用户友好，跟其他命令行工具互动良好，可测试，可维护，可格式化输出内容的真正&lt;code&gt;awesome&lt;/code&gt;的命令行工具，您仍然需要继续努力，加油吧!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sR9s9jeeVN5l48KrtuQcxs7Tv18/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sR9s9jeeVN5l48KrtuQcxs7Tv18/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sR9s9jeeVN5l48KrtuQcxs7Tv18/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sR9s9jeeVN5l48KrtuQcxs7Tv18/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blog/2011/12/11/building-a-command-line-tool-with-optionparser/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[ActionMail中的enable_starttls_auto]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/3oKZ3qs4INw/" />
    <updated>2011-12-08T23:49:00+08:00</updated>
    <id>http://lgn21st.github.com/blog/2011/12/08/enable-starttls-auto</id>
    <content type="html">&lt;p&gt;某个手上的项目是一路从&lt;code&gt;Rails 2.x.x&lt;/code&gt;升级到了&lt;code&gt;Rails 3.1.1&lt;/code&gt;。在老版本的Rails中，如果需要通过Gmail的SMTP来发送邮件，需要给Ruby的&lt;code&gt;Net::SMTP&lt;/code&gt;打个smtp-tls的补丁，或者通过类似的插件如&lt;a href="https://github.com/ambethia/smtp-tls/blob/master/lib/smtp-tls.rb"&gt;smtp-tls&lt;/a&gt;来解决问题。&lt;/p&gt;

&lt;p&gt;通过bundle升级过程中发现gem无法找到smtp-tls插件，因为这个插件并没有host在 &lt;a href="http://rubygems.org"&gt;http://rubygems.org&lt;/a&gt;上，而是host在 &lt;a href="http://gems.github.com"&gt;http://gems.github.com&lt;/a&gt;。在这个插件的homepage上说如果Rails &gt;= 2.2 并且Ruby的版本在v1.8.7以上，只需要在你的&lt;code&gt;ActionMailer&lt;/code&gt;的config中配置&lt;code&gt;enable_starttls_auto&lt;/code&gt;即可。&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="no"&gt;ActionMailer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;smtp_settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:enable_starttls_auto&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:address&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;smtp.gmail.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:port&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;587&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:domain&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;example.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:authentication&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:plain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:user_name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:password&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;但是读&lt;code&gt;ActionMailer&lt;/code&gt;源码发现，Rails的默认已经打开了&lt;code&gt;enable_starttls_auto&lt;/code&gt;，&lt;a href="https://github.com/rails/rails/commit/732c724df61bc8b780dc42817625b25a321908e4"&gt;这里&lt;/a&gt;有一些相关的讨论。所以如果你用上了&lt;code&gt;Rails 3.1.1&lt;/code&gt;或者以上版本，你无需作任何特别的设置即可工作。&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;rails&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="no"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;development&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;ActionMailer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;DeliveryMethods&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Object&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;smtp_settings&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:address&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:port&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:domain&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;localhost.localdomain&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:user_name&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:password&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:authentication&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:enable_starttls_auto&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;smtp_settings&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:enable_starttls_auto&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ssXSlpezZwBEjqtEZi8U22w5o2s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ssXSlpezZwBEjqtEZi8U22w5o2s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ssXSlpezZwBEjqtEZi8U22w5o2s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ssXSlpezZwBEjqtEZi8U22w5o2s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blog/2011/12/08/enable-starttls-auto/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[如何在Mac下快速部署 Nginx + Passenger + Rails]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/nLz6qQkI-6c/" />
    <updated>2011-11-27T17:15:00+08:00</updated>
    <id>http://lgn21st.github.com/blog/2011/11/27/mac-nginx-passenger-rails</id>
    <content type="html">&lt;p&gt;针对于新入门的开发者，如何在 Mac 下用 Nginx + Passenger 部署 Rails 的运行环境。&lt;/p&gt;

&lt;h3&gt;系统需求&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mac OSX Lion&lt;/li&gt;
&lt;li&gt;梯子&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;步骤0 安装环境依赖&lt;/h3&gt;

&lt;p&gt;安装Xcode 4.1，Xcode4.2以及更高的版本在 Lion 仍然存在一些兼容性问题，强烈建议使用XCode 4.1，下载地址：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;https://developer.apple.com/downloads/download.action?path=Developer_Tools/xcode_4.1_for_lion/xcode_4.1_for_lion.dmg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;安装RVM&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ bash &amp;lt; &amp;lt;(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;配置RVM自动加载，将下面这一行代码添加到&lt;code&gt;~/.bash_profile&lt;/code&gt;中，然后退出iTerm并重新启动&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[[ -s "/Users/Daniel/.rvm/scripts/rvm" ]] &amp;amp;&amp;amp; source "/Users/Daniel/.rvm/scripts/rvm"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;安装 ruby-1.9.2-p290&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rvm install 1.9.2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;设置系统默认使用 ruby-1.9.2&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rvm use 1.9.2 --default
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;步骤1 安装 Rails&lt;/h3&gt;

&lt;p&gt;安装Rails&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem install rails
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Rails安装完成后，创建一个rails项目，假定你的项目叫做：awesome project&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rails new awesome_project
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;启动Rails，并访问 http://localhost:3000&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd awesome_project
$ rails server
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;步骤2 安装 Passenger 和 Nginx&lt;/h3&gt;

&lt;p&gt;首先通过gem安装passenger&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem install passenger
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;因为Nginx不支持动态module载入，所以需要通过Passenger来自动下载，编译，安装由Passenger修改版的Nginx:&lt;/p&gt;

&lt;p&gt;安装Passenger + Nginx&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ passenger-install-nginx-module
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Yes: download, compile and install Nginx for me. (recommended)
The easiest way to get started. A stock Nginx 1.0.10 with Passenger
support, but with no other additional third party modules, will be
installed for you to a directory of your choice.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No: I want to customize my Nginx installation. (for advanced users)
Choose this if you want to compile Nginx with more third party modules
besides Passenger, or if you need to pass additional options to Nginx&amp;#8217;s
&amp;#8216;configure&amp;#8217; script. This installer will  1) ask you for the location of
the Nginx source code,  2) run the &amp;#8216;configure&amp;#8217; script according to your
instructions, and  3) run &amp;#8216;make install&amp;#8217;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Whichever you choose, if you already have an existing Nginx configuration file,
then it will be preserved.&lt;/p&gt;

&lt;p&gt;Enter your choice (1 or 2) or press Ctrl-C to abort: 这里建议选择1&lt;/p&gt;

&lt;p&gt;Please specify a prefix directory [/opt/nginx]:  /usr/local/nginx&lt;br/&gt;
当询问nginx的安装路径的时候，个人建议安装到&lt;code&gt;/usr/local/nginx&lt;/code&gt;下&lt;/p&gt;

&lt;p&gt;当安装完成后，会在console中提示如何配置Nginx&lt;br/&gt;
Passenger会自动帮你将下面两行添加到Nginx的配置文件中&lt;code&gt;/usr/local/nginx/conf/nginx.conf&lt;/code&gt;（很人性化）&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http {
  ...
  passenger_root /Users/Daniel/.rvm/gems/ruby-1.9.2-p290/gems/passenger-3.0.10;
  passenger_ruby /Users/Daniel/.rvm/wrappers/ruby-1.9.2-p290/ruby;
  ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;pre&gt;&lt;code&gt;server {
  listen 80;
  server_name www.yourhost.com;
  root /somewhere/public;   # &amp;lt;--- be sure to point to 'public'!
  passenger_enabled on;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;请不要忘记将&lt;code&gt;nginx&lt;/code&gt;命令行程序连接到&lt;code&gt;/usr/local/sbin&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;步骤3 配置Nginx + Passenger + Rails&lt;/h3&gt;

&lt;p&gt;关于Nginx的配置，请参考Nginx的官方网站以及Passenger的官方网站&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wiki.nginx.org/Configuration"&gt;http://wiki.nginx.org/Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.modrails.com/documentation/Users%20guide%20Nginx.html"&gt;http://www.modrails.com/documentation/Users%20guide%20Nginx.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;修改&lt;code&gt;hosts&lt;/code&gt;文件，给你的项目一个本地域名, 比如&lt;code&gt;awesome_project.local&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo vim /etc/hosts
127.0.0.1 awesome_project.local
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;测试hosts&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ping awesome_project.local
PING awesome_project.local (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.054 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;继续配置Nginx, 这里我给出一个最小可运行的Nginx配置文件&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vim /usr/local/nginx/conf/nginx.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;nginx.conf&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;worker_processes  1;

events {
  worker_connections  1024;
}

http {
  passenger_root /Users/Daniel/.rvm/gems/ruby-1.9.2-p290/gems/passenger-3.0.10;
  passenger_ruby /Users/Daniel/.rvm/wrappers/ruby-1.9.2-p290/ruby;

  include       mime.types;
  default_type  application/octet-stream;
  sendfile      on;
  keepalive_timeout  65;

  server {
    listen 80;
    server_name awesome_project.local;
    root /Users/Daniel/awesome_project/public;
    passenger_enabled on;
    rails_env development;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;测试Nginx的配置文件语法是否正确&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;启动Nginx&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如何在修改Nginx的配置文件后，让Nginx载入新配置&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo nginx -s reload
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如何停止Nginx&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo nginx -s stop
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如何在不停Nginx的情况下，重新启动Passenger&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd path/to/your/awesome/project
$ touch tmp/restart.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;好了，这个时候你可以打开浏览器，访问你的&lt;code&gt;awesome_project&lt;/code&gt;网站了&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://awesome_project.local
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;h4&gt;最后，希望你能够在Rails的开发中找到快乐！&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IXriEq06SxFzEMFGLRxBWerImpQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IXriEq06SxFzEMFGLRxBWerImpQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IXriEq06SxFzEMFGLRxBWerImpQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IXriEq06SxFzEMFGLRxBWerImpQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blog/2011/11/27/mac-nginx-passenger-rails/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[WordPress to Octopress migration]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/9WWgcCgvSbk/" />
    <updated>2011-11-25T04:46:00+08:00</updated>
    <id>http://lgn21st.github.com/blog/2011/11/25/wordpress-to-octopress-migration</id>
    <content type="html">&lt;p&gt;差不多有有一年多没有写Blog了，最近又动了心思想要继续写下去，为什么就不解释了。&lt;/p&gt;

&lt;p&gt;原来的Blog用&lt;a href="http://wordpress.org"&gt;WordPress&lt;/a&gt;搭建，曾经数次打算想要好好认真研究一下WordPress本身，最终都无疾而终，对WordPress始终爱不起来。看了台湾的&lt;a href="http://blog.xdite.net/"&gt;xdite&lt;/a&gt;的两篇关于&lt;a href="http://octopress.org/"&gt;Octopress&lt;/a&gt;的介绍，就忍不住动手试了下。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://octopress.org/images/logo.png" title="Octopress" alt="alt Octopress" /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.xdite.net/posts/2011/10/07/what-is-octopress/"&gt;Why Octopress?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.xdite.net/posts/2011/10/09/how-to-migrate-blog-from-wordpress-to-octopress/"&gt;如何從 Wordpress Migrate 到 Octopress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;迁移过程出奇的顺利，现在这个Blog直接使用&lt;a href="http://github.com"&gt;Github&lt;/a&gt;的&lt;a href="http://pages.github.com"&gt;Pages&lt;/a&gt;，免费，原来WordPress里面的文章全部都迁移过来了，评论部分我按照Xdite的说法试着通过DISQUS迁移，不过没有成功，不过问题不大，原来的评论就算了不要了。&lt;/p&gt;

&lt;p&gt;作为程序员，对&lt;code&gt;Markdown&lt;/code&gt;格式都比较有爱，Octspress不使用数据库，两条命令直接deploy到&lt;a href="http://github.com"&gt;Github&lt;/a&gt;上，非常流畅。其他关于Octopress的好处和如何迁移等内容，xdite已经写的非常详细了，我这就在一一叙述了。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZGIGfjP0Y18Ebz7C8HwW4iLk4_Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZGIGfjP0Y18Ebz7C8HwW4iLk4_Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZGIGfjP0Y18Ebz7C8HwW4iLk4_Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZGIGfjP0Y18Ebz7C8HwW4iLk4_Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blog/2011/11/25/wordpress-to-octopress-migration/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[shanghaionrails 第八次线下活动]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/CQRY0a9mh0k/890" />
    <updated>2010-10-19T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/890</id>
    <content type="html">&lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4087/5094147431_90eedd96c7.jpg" alt="" width="284" height="104" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groups.google.com/group/shanghaionrails?hl=en"&gt;&lt;strong&gt;Shanghaionrails&lt;/strong&gt;&lt;/a&gt; 线下活动每个季度举办一次，今年3月份第七次线下活动成功举办后，我们和JavaEye合作成功筹办了第二届&lt;a href="http://rubyconfchina.org/"&gt;RubyConfChina&lt;/a&gt;活动，10月31的活动是shanghaionrails第八次线下活动，同时shanghaionrails也迎来了自己的三岁生日！我们就是这样的组织，我们定期聚会碰头，我们喜欢交流心得&amp;#8230; 各位铁杆Rubyist们，我们不见不散！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[时间]&lt;br /&gt;
&lt;/strong&gt;2010年10月31日下午 1:00 PM&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[地点]&lt;br /&gt;
&lt;/strong&gt;上海市 徐汇区 宜山路889号齐来工业城1号楼5楼(&lt;a href="http://www.liba.com/"&gt;篱笆网&lt;/a&gt;)&lt;br /&gt;
本次活动由篱笆网赞助，感谢篱笆网提供场地支持。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[交通]&lt;br /&gt;
&lt;/strong&gt;交通很方便，9号线地铁到漕河泾站1号口出站公交205,120,252,809,131,804,152。自驾车可以停在下图的免费停车区域，齐来工业城也有停车场，地面5元/小时。&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4112/5094747932_f855a332f7.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[报名方式]&lt;br /&gt;
&lt;/strong&gt;在线报名地址 &lt;a href="http://shanghaionrails.51qiangzuo.com"&gt;http://shanghaionrails.51qiangzuo.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[活动安排]&lt;br /&gt;
&lt;/strong&gt;我们安排了四个主题演讲，以及一个头脑风暴环节，现在每个演讲嘉宾已经确定，各项组织筹备，推广活动已经开始，请大家奔走相告，请告诉身边用Rails得人，对Rails有兴趣得人。主题演讲环节如下：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;《你不需要知道的 Ruby》&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;莫枢，吕戈&lt;br /&gt;
&lt;/strong&gt;&lt;strong&gt;嘉宾介绍：&lt;/strong&gt;Haskell 爱好者和 Sinatra 爱好者，目前在淘宝写点 Java 的 Annotation Processor 和页面。什么都懂 …… 一点儿。&lt;br /&gt;
&lt;strong&gt;主题介绍：&lt;/strong&gt;主题为 Ruby 1.9.2 的新特性和渊源，还有未来的 Ruby VM 展望之类的 …… 会稍微牵涉一点实现但不会深。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;《如何从小树成长为大树 &amp;#8212; 薄荷网基于Ruby on Rails网站开发运营实践》&lt;br /&gt;
&lt;/strong&gt;&lt;strong&gt;谢文威 Vincent 薄荷网 架构师&lt;br /&gt;
&lt;/strong&gt;&lt;strong&gt;嘉宾介绍：&lt;/strong&gt;Vincent是中国最大的减肥网站&lt;a href="http://boohee.com"&gt;薄荷网&lt;/a&gt;（boohee.com）的主要创始人之一，在薄荷网负责产品技术架构工作。他在2007初开始接触Ruby on Rails，深为ROR的高效和优雅所震撼，毅然把整个网站系统迁移到ROR上，成为中国最早一批尝试ROR螃蟹的人之一。除了ROR，Vincent在SEO，数据挖掘和人工智能也有丰富经验和浓厚的兴趣。&lt;br /&gt;
&lt;strong&gt;主题介绍：&lt;/strong&gt;薄荷网是国内基于ROR开发运营的规模较大的几个网站之一， 网站由小到大的过程，就好比一棵小树成长为一棵大树，中间需要付出辛勤的劳动，Vincent将与大家分享他们的酸甜苦辣， 将涉及到部署方式选择，异步处理，性能优化，系统扩展和应用划分等等经验和挑战。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;《RailsRumble 2010》&lt;br /&gt;
&lt;/strong&gt;&lt;strong&gt;叶玎玎&lt;br /&gt;
&lt;/strong&gt;&lt;strong&gt;嘉宾介绍：&lt;/strong&gt;就职于&lt;a href="http://Intridea.com"&gt;Intridea.com&lt;/a&gt;，Ruby/Rails程序员。&lt;br /&gt;
&lt;strong&gt;主题介绍：&lt;/strong&gt;在刚刚结束得RailsRumble2010上，叶玎玎带领着&lt;a href="http://www.intridea.com"&gt;Intridea&lt;/a&gt;得&lt;a href="http://www.presently.com"&gt;Presently Team&lt;/a&gt;成功的在48小时内完成并release了&lt;a href="http://imgateway.r10.railsrumble.com"&gt;ImGateway&lt;/a&gt;。本次&lt;a href="http://www.railsrumble.com"&gt;RailsRumble&lt;/a&gt;上，Intridea的工程师们自发组织了四个团队参加比赛，而Presently Team的叶玎玎，吕国宁，太檑均是第一次参加。玎玎讲在本次活动上给大家介绍RailsRumble，参赛的经验心得，以及ImGateway，ImGateway背后的故事等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;《Understanding Mongoid》&lt;br /&gt;
&lt;/strong&gt;&lt;strong&gt;黄志敏&lt;br /&gt;
&lt;/strong&gt;&lt;strong&gt;嘉宾介绍：&lt;/strong&gt;就职于Ekohe，Ruby/Rails程序员，开源社区的参与者，rails-bestpractices.com的创建者。&lt;br /&gt;
&lt;strong&gt;主题介绍：&lt;/strong&gt;Mongoid是Ruby/Mongodb的ORM，这次演讲我会简要地介绍Mongoid的使用，主要介绍Mongoid的实现，希望大家能够对ORM的实现有所了解。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;《头脑风暴 － Rails程序员的职业发展规划》&lt;br /&gt;
&lt;/strong&gt;&lt;strong&gt;介绍：&lt;/strong&gt;这次活动中，我们安排了一个特别的头脑风暴环节，邀请了几位资深的程序员，行业专家，跟大家一起来一次程序员的职业发展规划的头脑风暴，我们已经邀请了有dlee，Sting，Shuanghai Linux user group的Thomas，篱笆网的CTO吴立峰，还有Primes Plus的Mick Cai等人，相信活动一定会精彩，我们不见不散。&lt;br /&gt;
&lt;p style="text-align: right;"&gt;——Shanghaionrails活动组委会&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D08cYnPEeFkr_perSt7Aeki4tLs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D08cYnPEeFkr_perSt7Aeki4tLs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/D08cYnPEeFkr_perSt7Aeki4tLs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D08cYnPEeFkr_perSt7Aeki4tLs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/890</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[[转] 我的丈夫是个程序员]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/1DfdfdfgmVg/884" />
    <updated>2010-08-26T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/884</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;缘起：&lt;/strong&gt;&lt;a href="http://intridea.com/about/people/renae"&gt;Renae&lt;/a&gt;和她得老公都是我得同事，&lt;a href="http://intridea.com/about/people/renae"&gt;Renae&lt;/a&gt;负责&lt;a href="http://www.intridea.com"&gt;Intridea&lt;/a&gt;的PR工作，她的老公&lt;a href="http://intridea.com/about/people/adam"&gt;Adam&lt;/a&gt;是公司的Director of Development。前几天Renae在自己的Blog写了一篇文章，叫《&lt;a href="http://www.renaebair.com/2010/08/11/my-husband-is-a-programmer-i-have-no-idea-what-that-means/"&gt;My husband is a programmer; I have no idea what that means.&lt;/a&gt;》，被国内一个&lt;a href="http://www.aqee.net/"&gt;IT评论&lt;/a&gt;网站全文翻译，译名叫做《&lt;a href="http://www.aqee.net/2010/08/23/my-husband-is-a-programmer/"&gt;我的丈夫是个程序员&lt;/a&gt;》。其实我一开始并不知道这篇文章，是热心网友在Twitter上推荐，又被图灵的刘老师人肉搜索发现这篇文章作者跟我在一家公司，RT给我后才得知的。将全文转载于此 :)&lt;/p&gt;
&lt;p&gt;== 转载分割线 ==&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;我的丈夫是个程序员&lt;br /&gt;
我在11年前认识了的我丈夫。当时是南缅因州大学新生入校的日子，我带着吉他去宿舍。他饶有兴趣的盯着我的吉他。之后他敲响了我的房门，自我介绍道：“嗨，我叫Adam，我就住在走廊的对面。我是个计算机程序员！”&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;他做了一很勇敢的决定。 10年前当程序员并不像今天这么“火”，这个行业并不被社会重视，他似乎也根本不在意这些。不管怎样，我们相爱了。我当时并不懂编程，但却被他那义无反顾的精神和毫不在意被人当作怪人的态度打动。是发现了他也弹吉他使我们走到了一起。如果仅是他住在走廊我的对面，命运也不会做出这样的安排。&lt;/p&gt;
&lt;p&gt;在随后的一周周，一月月，一年年，他慢慢的吸引了我的注意力，他会对着他的游戏机的硬件清单大发雷霆，他能在虚拟世界里的游戏竞赛中为我独尊，他在ColdFusion平台上制作了他的毕业论文项目，他会用长篇大论来解释他的编程理论。我会安静的坐着，惊奇的看他把一台PC机拆成零碎。我听他讲编程上的问题，看他开发网站。与此同时，我还只是朦胧的感觉到我未来的职业应该是跟科技和英语有关，但我着实对Adam的生活发生了兴趣。&lt;/p&gt;
&lt;p&gt;几年以后，我很自然的就知道了，“Ruby”并不是指的七月的生日石，而“Ruby on Rails”也不是邻区的新潮人在火车轨道上举行的敬拜珍贵宝石的奇怪活动。几年时间里，我事实上也培养出了他的同样的兴趣。2005年末他深深的喜欢上了Ruby，我全力支持他，而且也知道Ruby的不可思议之处。几年后，当我决定了开始学习Ruby，我在博客上写了一篇关于Ruby社区的文章。很多人都很奇怪为什么一个像我这样的Ruby新手会对Ruby社区有如此的了解。答案是，我在决定学习Ruby编程之前已经关注这个社区很久了。在我曾经打开TextMate编辑器、保存第一个.rb文件之前，我就知道了这个社区里有那些大人物，Ruby的发展趋势，和历史事件。&lt;/p&gt;
&lt;p&gt;当你的伴侣开始跟你讲编程的问题时，或讲最新的测试框架时，你的眼神里是否显露出一种呆滞和恍惚？事情并不是你想象的单调乏味。问他问题，尝试着去理解！如今当我遇到女人们时，我并不回避给她们谈我的工作，谈我喜欢的电脑游戏，谈我着迷于 D&amp;amp;D 游戏以及其它这样的荒诞事情。通常我得到的回复是这样的几句：“编程？我想我丈夫做的好像也是这方面的。”对于此，我总是问道：“哦，真的吗？他用的是什么编程语言？”她们的回答每次都一样：“语言？哼，我可不知道。不止一种吗？我并不真正知道他在干什么。我对这些东西没兴趣。”&lt;/p&gt;
&lt;p&gt;这每次都让我感慨万分。你嫁给了一个人，可是你对这个人花去将近40-50%的时间去做的事情一无所知——除了工作名称。我们是否可以把今天的高离婚率和他们对配偶的生活缺乏兴趣之间画一条危险的关联线呢？当两个人第一次相遇时，一个人很容易根据自己的”看法“而坠入爱河。但我认为如果配偶不能够对对方的爱好和生活工作有真正的了解，那么这两个人将很难经受的住生命的各种起起伏伏，艰难和考验，要知道，生活中每天都有挑战。如果你对配偶的每周40小时的工作内容没有一个基本的理解，你们就不能成为一体。&lt;/p&gt;
&lt;p&gt;我并不是在建议当你遇到钟情的对象时要放弃自己个性和个人兴趣。而是要你睁大眼睛，用你的伴侣的视野去体验这个世界。我承认，有时Adam会在某天晚上对元数据编程谩骂个没完没了，此时我也就跟他的思想走不到一起了。但通常情况下我会投入到他的兴趣当中。而且为什么不呢？我爱他，这就要求我去了解他。而了解一个人就是要你们去相互讨论和理解对方的兴趣。 Adam会花数百小时艰难的听Ani Difranco, Dar Williams, 和 Iron &amp;amp; Wine 唱片，我会在一旁神经质的给他解释所有的歌词。在我的鼓励下他学会了打网球，尽管现在不得不忍受每次被他打败的结果。在大学里他看过我的芭蕾舞表演，他甚至都知道了不少其中的姿势的叫法了。下面的照片是我和Adam在徒步翻越缅因州Tumbledown山时拍的。它见证了Adam自愿从计算机旁走开，参加到我喜欢的户外运动中的事情。他很顽强。&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://farm3.static.flickr.com/2584/3751216922_e84ddc0699.jpg"&gt;&lt;img title="Tumbledown" src="http://farm3.static.flickr.com/2584/3751216922_e84ddc0699.jpg" alt="hiking up Tumbledown Mountain in Maine" width="450" height="296" /&gt;&lt;/a&gt;&lt;br /&gt;
徒步旅行 hiking up Tumbledown Mountain in Maine&lt;/p&gt;&lt;br /&gt;
参与到你的伴侣的兴趣中并不是一件难事。如果你觉得很难，那你也许要思考一下自己是不是太自我了。即使朋友之间，我也努力的聆听和理解他们的兴趣和爱好。我经常会听到一些新奇的东西，经常我会为自己找到了一些新爱好。&lt;/p&gt;
&lt;p&gt;就我来说，如果当Adam在奇怪的跟计算机大喊大叫时，我只是发呆，那我就不会有今天的生活。那是无数的小时的一起玩视频游戏，一起深夜编写手册，一起为新应用做头脑风暴式的讨论，一起野营旅行，一起听乡村音乐才铸就了我们之间的关系。即使你跟你的伴侣在事业上并不是相似的道路，通过对他工作和喜好的了解，你也可以使他为你打开他的心扉。这能扩大你的视野，帮助你减少生活中的不愉快。你们应成为一起工作的一体。我并不是像Adam那样做职业编程的；我也没有向那方面发展。我懂编程，但不幸的是，自小就没人给我积木做训练，在学校和家里也从来没人鼓励我学数学。工程学和解决问题的才能从来就没有培养出来。所以，当我想对编程感兴趣时，这对我的难度看起来比其他人大。但我的强项是写作，编程方面和技术方面的题材对我是个巨大的兴趣 – 所以，能得到Intridea社区管理员的工作让我的世界真正的兴奋起来。我关注着我喜爱的世界，我能感受到它的脉搏，我所做的一直给我带来回报，给我快乐。&lt;/p&gt;
&lt;p&gt;所以，如果你和新朋友们在一起，想办法培养自己对他们爱说的事情的兴趣。如果你和老朋友在一起，通过询问他们的工作、倾听他们的回复来再次发掘你的生活爱好。不要假装爱好。不要做那种连她丈夫使用什么编程语言都不知的女孩子。你要做那种让你的丈夫的朋友吃惊于你还知道Java时什么的酷妻子，不做那种在讨论Ruby社区里的自由派时说出“亲爱的，我不知道你原来还是个珠宝商哪！”的妻子。&lt;/p&gt;
&lt;p&gt;[英文出处]：&lt;a href="http://www.renaebair.com/2010/08/11/my-husband-is-a-programmer-i-have-no-idea-what-that-means/"&gt;My husband is a programmer; I have no idea what that means.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2TtXPJwoQfeT0UuvkodfJGsVEIQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2TtXPJwoQfeT0UuvkodfJGsVEIQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2TtXPJwoQfeT0UuvkodfJGsVEIQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2TtXPJwoQfeT0UuvkodfJGsVEIQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/884</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[[补] 桃花岛杀人事件及后续]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/avalYt48B_g/875" />
    <updated>2010-08-16T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/875</id>
    <content type="html">&lt;p style="text-align:center;"&gt;&lt;object width="500" height="375"&gt;&lt;br /&gt;
  &lt;param name="flashvars" value="offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fphotos%2F35439352%40N04%2Fsets%2F72157624729291626%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2F35439352%40N04%2Fsets%2F72157624729291626%2F&amp;amp;set_id=72157624729291626&amp;amp;jump_to=" /&gt;&lt;br /&gt;
  &lt;param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=71649" /&gt;&lt;br /&gt;
  &lt;param name="allowFullScreen" value="true" /&gt;&lt;br /&gt;
  &lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=71649" allowfullscreen="true" flashvars="offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fphotos%2F35439352%40N04%2Fsets%2F72157624729291626%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2F35439352%40N04%2Fsets%2F72157624729291626%2F&amp;amp;set_id=72157624729291626&amp;amp;jump_to=" width="500" height="375" /&gt;&lt;br /&gt;
&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;缘起：一篇补遗的游记，再不写出来就全部忘干净了。今年的端午节，参加了人民广场Toastmasters俱乐部（PS俱乐部）组织了一个OUTING活动：PS &lt;span class="caps"&gt;TMC&lt;/span&gt; 2010夏季风行 —— 2天1夜桃花岛浪漫之旅&lt;/p&gt;
&lt;p&gt;桃花岛：&lt;a href="http://www.taohuadao.com.cn/"&gt;桃花岛风景名胜区&lt;/a&gt;位于我国最大的群岛——舟山群岛东南部，是金庸笔下东邪黄药师的居住地。桃花岛地处东海环抱之中，气候宜人，峰峦起伏，山海云雾，风景独特，是理想的度假、休闲胜地。&lt;/p&gt;
&lt;p&gt;这次桃花岛之旅太有趣了，令人难忘。印象最深刻的并不是桃花岛优美的风景，而是跟一群特别有趣的人在一起的这一段有趣得时光，以及在这段时光中生的那些有趣得事情。&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;PS得Jessica好强大，她特别擅长资源组合，联系景点，包车，安排行程，还特别便宜，鞍前马后一般把这么多人照顾得好好的，吃的好，住的好，玩的也好。太佩服她了！&lt;/li&gt;
  &lt;li&gt;一大早乘地铁赶到人民广场，上地铁得时候，看到了一群威武得世博会保安哥哥。&lt;/li&gt;
  &lt;li&gt;这次活动虽然是 PS俱乐部组织得，但是参加得人其实来自很多不同得俱乐部，比如IDEAL，NO.1，徐家汇俱乐部等等&lt;/li&gt;
  &lt;li&gt;通知说6点半在人民广场博物馆正门前集合，去了才发现集合点就是个杯具，people mountain people sea&amp;#8230;&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;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;酒店门口有好多水箱，里面养着各种海鲜，我发现了一种很诡异的生物，造型让我想到了电影《异性2》。&lt;/li&gt;
  &lt;li&gt;TMC俱乐部人才济济，大家都很会搞活动，晚上搞了一个现场版的非诚勿扰，真让我心惊胆战了一会~~~现场搜集到6个未婚无女友的男生（包括我），大家把我们狠狠涮了一回！男生旁边小黑屋排队，现场没有结婚的女生集体起立，等男生出来一个折腾一个&amp;#8230;&amp;#8230;&lt;/li&gt;
  &lt;li&gt;其中有两个男生，看到第一个男生出去后要面对的那个阵势，着实被吓坏了，然后跳窗逃出去了&amp;#8230;BS他们，名字我就不提了。&lt;/li&gt;
  &lt;li&gt;桃花岛上的饭，海鲜特别多～&lt;/li&gt;
  &lt;li&gt;忘记提到一个人，孙小小，来的路上就坐她的边上一起玩三国杀时认识的， 关于孙小小的故事在TMC圈子可是一段传奇呢。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很多细节不需要我写，因为小小已经写了三篇非常棒的游记：&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://xiaoxiaosun2010.blog.sohu.com/154383628.html"&gt;桃花岛之旅（1） 好事多磨&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://xiaoxiaosun2010.blog.sohu.com/154513021.html"&gt;桃花岛之旅（2） 山寨非诚勿扰&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://xiaoxiaosun2010.blog.sohu.com/154577742.html"&gt;桃花岛之旅（3） 沙滩飞盘&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只有一件事情必须得提，就是杀人游戏。要说杀人游戏哪一点吸引人，可能不同人会有不同的答案，不过最基本的应该是做杀手隐蔽藏匿表演时候的刺激和做好人方成员时找出杀手时候的成就感了。因为是Toastmasters，大家的语言能力，逻辑思维能力，表达能力，公众演讲能力，心理素质，表演能力等都锻炼得很好了，所以当一群TMC高手坐在一起玩游戏的时候，没有什么比杀人更适合的了。&lt;/p&gt;
&lt;p&gt;从到达桃花岛得下午开始，就没停杀过，吃饭得时候也在杀，甚至回去得路上，汽车转轮船得间隙也在杀，回去得大巴上继续杀，最后都回到上海了，车已经到了人民广场了，人没有杀完大家不下车&amp;#8230;&amp;#8230;我们玩杀人得一群人中，女孩子比男孩子多，于是杀人现场经常就是两三个男生跟8～9个女生一起玩杀人，呵呵。&lt;/p&gt;
&lt;p&gt;杀手游戏讲究技巧，特别是逻辑分析和心里分析，不过因为女孩子多得原因，我挖掘出另外一个技巧，就是眼神交流（我承认我从lie to me上学到几招）。女孩子不象男孩子，通常她们嘴上说自己不是杀手，可是她们得眼神会说话，而且说得都是真话，当说得和自己心里想得不一致得时候，她得眼神会闪烁，会飘忽，会避开你不敢跟你直视。但是当她们是平民或者警察得时候，眼神中又会自然流露出一种搜寻和质疑，特别是其中一个女孩子，她得眼神清澈见底，当我带着疑问得眼神看她时，她得眼神回应从未说过假话，正确率100%，呵呵，这种能力是一种感觉，是必须通过锻炼才能把握得哦，呵呵。&lt;/p&gt;
&lt;p&gt;因为来桃花岛的头天我工作到深夜，几乎没有睡觉，晚上饭后大家集结在房间里继续杀得时候，我有一阵子特别困，几乎坚持不住快睡着了，结果给出了一些不符合逻辑得分析和线索，把整个状况给搅浑了，案情扑朔迷离，直到最后弄明白真相之际大家才恍然大悟，原来是被我错误的引导&amp;#8230;&amp;#8230;后来第二天回去得路上有一局，我分析出Emily是杀手，以及她在保护另外一个杀手时，Emily惊讶于逻辑清晰严密，完全没有辩白得机会，当时Emily问我，你得逻辑思维能力怎么一下子突然这么厉害了？跟昨天晚上完全两个人，我回答说，因为我昨天晚上睡得很好呀，呵呵。&lt;/p&gt;
&lt;p&gt;最杯具得人物是宏志，整个杀人游戏过程中，无论什么时候听宏志说话或者问宏志问题，大家都觉得不管宏志怎么说，都不是真话，于是集体把宏志票投死再说。其实宏志很冤得，因为大多数时候，他就是一个平民。所以教训就是——说话得时候该严肃时必须严肃，说话要厚道，不能让人感觉你不老实，呵呵。跳警最成功得是Divid，他很能别出心裁，作杀手得时候还玩过一次自裁，有且仅有得唯一一次成功的假跳警就是他，我承认，当时他骗过了所有人，结局就是，之后每次他说“其实我是个警察”得时候，再也没有人相信他了。&lt;/p&gt;
&lt;p&gt;杀人游戏得整个进展貌似是一个不断高潮，而且越来越高得过程，游戏场面越来越精彩，争论越来越多，情绪也越来越高，后来大家意识到杀人这个游戏太有潜力了，必须在以后把杀人游戏继续下去，而且要搞成长期活动，于是所有参与杀人游戏得人都给我留下了联系方式，于是就有了桃花岛杀人游戏后续活动。从桃花岛回来后，我们已经搞了三次后续杀人活动，我参加了第一次，组织了第三次，据说第二次也相当成功，在一个酒店总统套房里面，20多人看球杀人high到极点，不过哪个时候我人在桂林，错过了 :(&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
－－－－－－－－－－第一次杀手活动总结－－－－－－－－－－&lt;/p&gt;
&lt;p&gt;杀手们：&lt;/p&gt;
&lt;p&gt;在Lorriaine和Mira两位同学在上周末成功组织了杀人俱乐部线下第一次聚会，取得了圆满得成功。再此对两位同学表示感谢。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;遗憾&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;著名演技派高手Luna同学居然周六不查邮件，不看手机，错过了这次杀人活动得时间。当天下午当我们接通Luna同学得电话后，Luna同学表现得相当得不淡定，深感内疚于自己居然错过了这次活动。&lt;/li&gt;
  &lt;li&gt;另外一位演技派大师兼首席大法官Emily同学，居然自己得email地址不在杀手群邮件列表当中，导致她对此次活动毫不之情，在这个冷酷得事实面前，Emily同学哭爹喊娘般得立志要立即赶来加入组织，所幸及时被我方劝止。&lt;/li&gt;
  &lt;li&gt;Maggie同学因为外出无法参加这次活动，表现出了极大得遗憾&lt;/li&gt;
  &lt;li&gt;Emma同学和她得杀手老公均因为工作原因不能到场，他们二人衷心祝愿我们得杀人活动取得成功。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;疑惑&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span style="white-space: normal;"&gt;在现场两位美女相继电话邀请John同学来参与组织活动，均被John冷面拒绝，我很纳闷，遂问之，末了John同学短消息回复到：“下次一定来，让你见见什么叫演技派”，对此我只好笑而不语。&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span style="white-space: normal;"&gt;此次到场共7人，其中不乏演技派高手Mira，David，Lv以及Jack (不过Jack得演技&amp;#8230; 我个人觉得他是个偶像派)，整场杀人游戏仍然展现出了应有得风采，各大高手巅峰对决，可能是因为大家实力都太强大，我们发现不管怎么调整规则，两轮之后，警察杀手身份立现，杀手始终陷入困境难以突围，甚至不准跳警，死人不能留遗言，也无法扭转杀手悲哀得命运，大惑不解&amp;#8230;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;收获&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;在这次得杀人游戏中，大家彼此畅谈人生感悟，好不快活&lt;/li&gt;
  &lt;li&gt;除了杀人游戏，Jack教会大家玩一种叫做“德克萨斯扑克”得游戏，非常过瘾，如果有人看过周润发演得赌神，那么就请回忆一下赌神中他们在赌桌上玩得游戏&lt;/li&gt;
  &lt;li&gt;德克萨斯扑克是一种集勇气，智慧，谋略，胆识，运气于一身得游戏，对参与得玩家要求比之杀人游戏更有挑战，Jack在游戏中展现了超强得实力，用他强大得风险控制，危机管理，以及适时止损和关键时刻装腔作势得能力取得了很大得优势，但仍然被我采用逐步蚕食得策略将其赌资悉数归入囊中&amp;#8230;&lt;/li&gt;
  &lt;li&gt;在桌游吧玩到尽兴后，我们转战酒吧，欣赏了半场精彩得世界杯 德国大战英格兰&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;展望&lt;/b&gt;&lt;/p&gt;
&lt;ul&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;第三次活动赶上了TMC得官员培训，一些人必须要参加培训，而另外一些则必须要去负责培训他们，所以都不能及时赶来，这个世界上得事情有的时候就是这么拧巴&amp;#8230;&amp;#8230;不过铁杆杀手们不辞辛劳，培训结束7点后都要赶过来杀个几盘，这种精神真令人感动，这就是杀手精神，呵呵。而且因为大家水平都太高，甚至在第一个回合就直接把全部杀手给投票出来了，巅峰对决往往是一瞬间。&lt;/p&gt;
&lt;p&gt;其他精彩得部分无法用文字表达，精华得部分不能用文字表达，所以没有来参加活动得人请自行YY，参加活动得人大家意会一下就好啦 ;-)&lt;/p&gt;
&lt;p&gt;晚上几个朋友去Windows泡吧，后来又去MUSE看黑眼豆豆的表演，好开心！不过去得有点晚，只听到几首歌，但是现场气氛也是最high的时候，赞～&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AG0yy-Nt4iT-4Svv0FLMeu6aT0U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AG0yy-Nt4iT-4Svv0FLMeu6aT0U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AG0yy-Nt4iT-4Svv0FLMeu6aT0U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AG0yy-Nt4iT-4Svv0FLMeu6aT0U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/875</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[无题]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/_qtryTvHGlw/868" />
    <updated>2010-08-09T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/868</id>
    <content type="html">&lt;p&gt;了却了一桩心事，去作了一件带有仪式性的事情，这事搁在心里有半年，&lt;br /&gt;
各种思想准备，被理解，被谅解，亦或者被误解，带着坚定决心，&lt;br /&gt;
过程看似云淡风轻，蛮拧得内心还是需要点时间来抚平，&lt;br /&gt;
去跑个15公里，精疲力竭之后会应该很容易进入梦乡吧？&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;对待自己要忠实，犹如先有白昼，才有黑夜&lt;br /&gt;
  要这样，才能对人也忠实&lt;/p&gt;
  &lt;p style="text-align: center;"&gt;－哈姆雷特&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;del&gt;-&lt;/del&gt;&amp;#8212;&amp;#8212;&amp;#8212;- 语无伦次得分割线 &lt;del&gt;-&lt;/del&gt;&amp;#8212;&amp;#8212;&amp;#8212;-&lt;/p&gt;
&lt;p&gt;曾经是一个超级大胖子，从五月份开始天天跑步锻炼，明显又瘦了一点&lt;br /&gt;
有张照片是在最胖得时候拍得， 存照留念于此&amp;#8230;&amp;#8230;&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4872068119/" title="DSCN0073 by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4120/4872068119_39a6a34661.jpg" width="500" height="375" alt="DSCN0073" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/53iP-fJuXW2JFNBKhYAfxlxhMdg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/53iP-fJuXW2JFNBKhYAfxlxhMdg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/53iP-fJuXW2JFNBKhYAfxlxhMdg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/53iP-fJuXW2JFNBKhYAfxlxhMdg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/868</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[ThinkInLamp活动归来]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/tqpU_4vRGDk/859" />
    <updated>2010-08-08T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/859</id>
    <content type="html">&lt;p style="text-align: center"&gt;&lt;object width="500" height="375"&gt;&lt;br /&gt;
  &lt;param name="flashvars" value="offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fphotos%2F35439352%40N04%2Fsets%2F72157624549755545%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2F35439352%40N04%2Fsets%2F72157624549755545%2F&amp;amp;set_id=72157624549755545&amp;amp;jump_to=" /&gt;&lt;br /&gt;
  &lt;param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=71649" /&gt;&lt;br /&gt;
  &lt;param name="allowFullScreen" value="true" /&gt;&lt;br /&gt;
  &lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=71649" allowfullscreen="true" flashvars="offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fphotos%2F35439352%40N04%2Fsets%2F72157624549755545%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2F35439352%40N04%2Fsets%2F72157624549755545%2F&amp;amp;set_id=72157624549755545&amp;amp;jump_to=" width="500" height="375" /&gt;&lt;br /&gt;
&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;最后还是&lt;a href="http://www.lvguoning.com/blog/2010/08/04/%E8%BF%99%E4%B8%AA%E5%91%A8%E6%9C%AB%E7%9A%84%E6%B4%BB%E5%8A%A8%E5%BE%88%E4%B8%B0%E5%AF%8C/"&gt;选择&lt;/a&gt;了去参加&lt;a href="http://www.thinkinlamp.com/"&gt;ThinkInLamp&lt;/a&gt;的活动，平稳顺利的完成了Sam交待给我的任务，主持了整场会议，没有出现什么大得纰漏，过关，呵呵 :D&lt;/p&gt;
&lt;p&gt;今天得收获，以及会议中引发得思考很多，感悟也不少，首先是&lt;a href="http://www.anjuke.com/"&gt;安居客&lt;/a&gt;的公司好强大，会议室也很强大，不愧是沪上最大最牛的房地产行业网站。而且今天的听众，有三分之一都是安居客的软件工程师。另外就是原来锅巴哥哥是我的老乡啊，他是阿克苏长大的，也是知青的下一代。其他相关内容，列个表在这里：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.mbaobao.com/"&gt;麦包包&lt;/a&gt;的RongRong友情赞助了很多小礼品，还有现场宣传小册子，发现它们的包包很不错，价格还不贵，只不过我好像不是他们得目标消费人群。&lt;/li&gt;
  &lt;li&gt;这次活动得所有主题是之前在网上6选4票选出来得，结果很洗具，2个技术话题被淘汰，4个非技术话题入选，这也反应了IT技术人员得普遍诉求，每天都在玩技术得人，其实对非技术领域得一些东西，往往更加有兴趣，呵呵。&lt;/li&gt;
  &lt;li&gt;第一个分享嘉宾Sting是一个非常睿智得人，很善于独立思考，而且总结能力很强。我在不同得场合听过他讲过不同得东西，有web2.0创新，创业公司发展，技术人员自我提升，以及产品研发，项目管理等等。我理解Sting得核心思想始终围绕以人为本，这次讲技术团队得发展路径和陷阱也是如此。一个团队从组建到成熟到成功，是一个漫长得过程，会经过几个典型得阶段，不过在QA环节，大家最感兴趣得，仍然是第一个环节，如何招聘以及面试，呵呵。&lt;/li&gt;
  &lt;li&gt;第二个分享嘉宾板子，25岁，工作三年，给大家讲得主要是职场感悟。我发现板子同学非常有潜力，PPT做的可圈可点，内容丰富，而且风格诙谐幽默，演讲过程中得发挥也很出彩，属于那种非常有潜力得类型，如果板子也加入我所在得TMC组织的话，只需很短得时日，他得演讲水平，功力一定会在我之上。&lt;/li&gt;
  &lt;li&gt;锅巴哥哥太神了，这位哥哥在Oracle/MySQL两种数据库领域颇有建树，他走得是底层路线，拨开数据库引擎盖，直接解剖底层实现，研究数据库内核得结构和算法，并以此为基础进行针对性得调优，强啊。另外锅巴哥哥准备在ThinkInLamp得活动基础上开辟一个MySQL分支，专场讲解MySQL方面得内容，预计会在9月底10月得时候举办，我打算在自己得shanghaionrails社区推广下，因为这个太靠谱了。&lt;/li&gt;
  &lt;li&gt;演讲嘉宾张博超和腾振宇两人来自同一家公司，而且讲得内容都跟敏捷开发有关，一个是理论，一个是实战，于是他们两个人合计了一下，就把两个演讲二合一了。于是乎这场演讲就变成了大家群体玩一个叫做《&lt;a href="http://www.cnblogs.com/tengzy/archive/2010/08/04/1791645.html"&gt;Innovation Game&lt;/a&gt;》得游戏，而且这个集体游戏让大家玩得很high，之后大家一起进行分析，总结。我很欣赏这种演讲教学方式，获益匪浅。&lt;/li&gt;
  &lt;li&gt;腾振宇不愧是国内第一个注册敏捷教练，站在讲台上很有范，语言抑扬顿挫，停顿，肢体语言等演讲技巧运用得炉火纯青，牢牢抓住了大家得注意力。敏捷开发相关得理论以及方法学，涉及范围很广，而且偏理论，偏抽象。腾振宇非常善于利用生活中一些实例来隐喻敏捷理论，浅显易懂，赞！&lt;/li&gt;
  &lt;li&gt;最大得收获是通过游戏，深刻理解了Queue理论，特别是在团队中，如何切分/拆分任务到一个合理得粒度，才能得到最优工作效率，如何优化才能帮助客户创造最大价值等等，敏捷是一门讲究实惠得艺术啊～&lt;/li&gt;
  &lt;li&gt;当然了，会后得饭醉活动是另外一个亮点 ;-)&lt;/li&gt;
  &lt;li&gt;Sam一直跟我讨论创业话题，看来他是义无反顾要走上这条路了，身边得朋友一个一个都去创业，或者正在准备去创业了&amp;#8230;&lt;/li&gt;
&lt;p&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/drbeDKaigOpUo0wrdfVqu3S-HSs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/drbeDKaigOpUo0wrdfVqu3S-HSs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/drbeDKaigOpUo0wrdfVqu3S-HSs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/drbeDKaigOpUo0wrdfVqu3S-HSs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/859</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[首次RubyTuesday活动成功举行]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/YzhakEgZMXM/853" />
    <updated>2010-08-07T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/853</id>
    <content type="html">&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4867000282/" title="Ruby-Tuesday by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4137/4867000282_847e83e18f.jpg" width="500" height="375" alt="Ruby-Tuesday" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;缘起：&lt;/b&gt;&lt;a href="http://www.rubytuesday.com/"&gt;Ruby Tuesday&lt;/a&gt;是一家著名得美食餐厅，&lt;a href="http://en.wikipedia.org/wiki/Ruby_Tuesday"&gt;Ruby Tuesday&lt;/a&gt;是&lt;a href="http://en.wikipedia.org/wiki/The_Rolling_Stones"&gt;The Rolling Stones&lt;/a&gt;得一首歌曲，&lt;a href="http://ihower.tw/blog/?s=Ruby+Tuesday"&gt;Ruby Tuesday&lt;/a&gt;是台湾得 &lt;a href="http://twitter.com/ihower"&gt;&lt;code&gt;ihower&amp;lt;/a&amp;gt; 举办得一个技术活动，是一个非常不错得活动，而且&amp;lt;a href="http://twitter.com/ihower"&amp;gt;&lt;/code&gt;ihower&lt;/a&gt;从2007年就开始一直坚持把这个活动办到今天。上次RubyConf上，跟&lt;a href="http://twitter.com/ihower"&gt;@ihower&lt;/a&gt;聊起这个，当下就决定要在上海也把这个活动搞起来，结果这事穷喊了一个多月，直到今天 :D&lt;/p&gt;
&lt;p&gt;事情还有另外一个起因，吴江同学（网上id &lt;a href="http://twitter.com/masterwujiang"&gt;@masterwujiang&lt;/a&gt;，又名花花）将出席8月底在日本举行的&lt;a href="http://rubykaigi.org/2010/en"&gt;Ruby kaigi&lt;/a&gt;大会（全世界最大的Ruby大会），并作一个三十分钟的主题演讲，题目是《&lt;a href="http://rubykaigi.org/2010/en/events/51"&gt;Rails to Sinatra&lt;/a&gt;》。本次活动是吴江的一次Preview，吴江将为大家作一个预讲，并现场收集大家的意见，并继续改进。&lt;/p&gt;
&lt;p&gt;这次得活动名为RubyTuesday，但却是在周四举行，时间是晚上7点到9点，地点是我熟悉得一家咖啡厅，&lt;a href="http://www.dianping.com/shop/2490340"&gt;布那咖啡&lt;/a&gt;，地点在上海图书馆对面。&lt;/p&gt;
&lt;p&gt;因为是第一次筹办这次活动，没有指望有太多人出席，结果铁杆朋友都到了，甚慰。这次出席会议得人有：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;吴江（&lt;a href="http://twitter.com/masterwujiang"&gt;@masterwujiang&lt;/a&gt;）本次得主题分享嘉宾，三年的Rails程序员，当第一次遇见&lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt;之后就深深爱上了&lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt;，并提出了Off Rails得概念，至于到底Off Rails灵不灵，拭目以待。&lt;/li&gt;
  &lt;li&gt;黄智敏（&lt;a href="http://twitter.com/flyerhzm"&gt;@flyerhzm&lt;/a&gt; Richard Huang）资深Rails程序员，现在就职于易空海，关于Richard本人都不需要介绍了，在上海得Rails圈子已经是无人不知，无人不晓，而且Richard最近作了一个叫做&lt;a href="http://rails-bestpractices.com/"&gt;Rails Best Practices&lt;/a&gt;网站，非常赞。&lt;/li&gt;
  &lt;li&gt;李飞雄（feixiongli@gmail.com）跟Richard是同事，一年陈得Rails程序员 :D&lt;/li&gt;
  &lt;li&gt;罗小能（&lt;a href="http://twitter.com/lxneng"&gt;@lxneng&lt;/a&gt;）前在合家网程序员，专攻Python。现在开始作Rails开发，并把很多&lt;a href="http://rails-bestpractices.com/"&gt;Rails Best Practices&lt;/a&gt;翻译成中文。&lt;/li&gt;
  &lt;li&gt;郑伟（&lt;a href="http://twitter.com/miclle"&gt;@miclle&lt;/a&gt;）罗小能得同事，工作三年，专攻前端开发，帮助Richard得&lt;a href="http://rails-bestpractices.com/"&gt;Rails Best Practices&lt;/a&gt;项目开发了前台。&lt;/li&gt;
  &lt;li&gt;黄孜扬（ngty77@gmail.com）来自新加坡，因为女友在中国，所以到中国来工作，主要作一些ruby和rails远程工作，Linux大牛，也是老大哥级得人物（大我5岁），帮助Richard得&lt;a href="http://rails-bestpractices.com/"&gt;Rails Best Practices&lt;/a&gt;项目提交了很多测试&lt;/li&gt;
  &lt;li&gt;蕲春人（&lt;a href="http://twitter.com/qichunren"&gt;@qichunren&lt;/a&gt;）来自&lt;a href="http://www.zhaoonline.com/"&gt;赵勇在线&lt;/a&gt;得Rails程序员。&lt;/li&gt;
  &lt;li&gt;梁文科（&lt;a href="http://twitter.com/liangwenke"&gt;@liangwenke&lt;/a&gt;）来自&lt;a href="http://www.zhaoonline.com/"&gt;赵勇在线&lt;/a&gt;得Rails程序员。&lt;/li&gt;
  &lt;li&gt;郑炳南（femtowin@gmail.com）原来供职于淘宝，现在创业作ruby/java培训。&lt;/li&gt;
  &lt;li&gt;还有我&amp;#8230;..&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;收获最大得应该是吴江。其实本次活动得宗旨就是拍吴江，越是板砖横飞，把吴江拍的越狼狈，对他越有好处，不过好像除了我，其他人提出意见时都非常照顾吴江得面子，特别委婉，呵呵。来自新加坡得黄孜杨，非常善于拿捏把握吴江演讲中不足得地方，提出得意见非常有价值，而且还特别善于运用隐喻。我呢，因为长期混迹于TMC，所以小小显摆了一下，特别针对演讲技巧层面提出一些建议，希望吴江能从中有所收获，到时候代表中国Ruby程序员，更代表他自己作一个出色得演讲。&lt;/p&gt;
&lt;p&gt;这次活动不仅仅只有吴江一个人获益，大家通过这次活动结交朋友，联络感情，并商讨互相感兴趣得话题，每个人都献计献策，讨论出一套继续举办RubyTuesday得方针策略，呵呵，毫无疑问这个活动就必须继续坚持下去，而且一定会更好。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5g-SYX-VHZkFWQHQGPC9HEeyjDM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5g-SYX-VHZkFWQHQGPC9HEeyjDM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5g-SYX-VHZkFWQHQGPC9HEeyjDM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5g-SYX-VHZkFWQHQGPC9HEeyjDM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/853</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[In Memory of Zigzag Chen]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/1CEDNMrEsLQ/835" />
    <updated>2010-05-23T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/835</id>
    <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4629267701/" title="original by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4036/4629267701_d41d6363f6_o.png" width="200" height="174" alt="original" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#25764;&amp;#19979;&amp;#20102;&amp;#19978;&amp;#19968;&amp;#31687;&amp;#23547;&amp;#25214;&amp;#38472;&amp;#26234;&amp;#26480;&amp;#30340;&amp;#21338;&amp;#23458;&amp;#65292;&amp;#22240;&amp;#20026;&amp;#25105;&amp;#20204;&amp;#24050;&amp;#32463;&amp;#25214;&amp;#21040;&amp;#20102;&amp;#20320;&amp;#65292;&amp;#35841;&amp;#37117;&amp;#19981;&amp;#25954;&amp;#30456;&amp;#20449;&amp;#36825;&amp;#20010;&amp;#20107;&amp;#23454;&amp;#65292;&amp;#36319;&amp;#20320;&amp;#24050;&amp;#26159;&amp;#22825;&amp;#20154;&amp;#20004;&amp;#38548;&amp;#12290;&lt;/p&gt;
&lt;p&gt;&amp;#26234;&amp;#26480;&amp;#65292;&amp;#36319;&amp;#20320;&amp;#22312;&amp;#21516;&amp;#19968;&amp;#23478;&amp;#20844;&amp;#21496;&amp;#24037;&amp;#20316;&amp;#65292;&amp;#20294;&amp;#26159;&amp;#20174;&amp;#26410;&amp;#35851;&amp;#38754;&amp;#12290;&amp;#19981;&amp;#36807;&amp;#22312;&amp;#32593;&amp;#19978;&amp;#25105;&amp;#20204;&amp;#32842;&amp;#30340;&amp;#19981;&amp;#23569;&amp;#65292;&amp;#20320;&amp;#36319;&amp;#25105;&amp;#32842;&amp;#36215;&amp;#26469;&amp;#24863;&amp;#35273;&amp;#29305;&amp;#21035;&amp;#25237;&amp;#32536;&amp;#65292;&amp;#35753;&amp;#25105;&amp;#22362;&amp;#20449;&amp;#20320;&amp;#26159;&amp;#19968;&amp;#20010;&amp;#20540;&amp;#24471;&amp;#20449;&amp;#36182;&amp;#65292;&amp;#26377;&amp;#36131;&amp;#20219;&amp;#24863;&amp;#65292;&amp;#20540;&amp;#24471;&amp;#25176;&amp;#20184;&amp;#30340;&amp;#20154;&amp;#12290;&amp;#21407;&amp;#26412;&amp;#35745;&amp;#21010;&amp;#22312;RubyConfChina 2010&amp;#26399;&amp;#38388;&amp;#65292;&amp;#20844;&amp;#21496;&amp;#30340;&amp;#20840;&amp;#37096;&amp;#20013;&amp;#22269;&amp;#21516;&amp;#20107;&amp;#21487;&amp;#20197;&amp;#40784;&amp;#32858;&amp;#19978;&amp;#28023;&amp;#65292;&amp;#25105;&amp;#23601;&amp;#33021;&amp;#36319;&amp;#20320;&amp;#35265;&amp;#19978;&amp;#19968;&amp;#38754;&amp;#65292;&amp;#25105;&amp;#24050;&amp;#32463;&amp;#24320;&amp;#22987;&amp;#35774;&amp;#24819;&amp;#25105;&amp;#20204;&amp;#20004;&amp;#20250;&amp;#19968;&amp;#35265;&amp;#22914;&amp;#25925;&amp;#65292;&amp;#29978;&amp;#33267;&amp;#37117;&amp;#24320;&amp;#22987;&amp;#35745;&amp;#21010;&amp;#19978;&amp;#28023;&amp;#32858;&amp;#20250;&amp;#20043;&amp;#21518;&amp;#25105;&amp;#21487;&amp;#20197;&amp;#21435;&amp;#29664;&amp;#28023;&amp;#65292;&amp;#21435;&amp;#36319;&amp;#20320;&amp;#28040;&amp;#30952;&amp;#19978;&amp;#19968;&amp;#27573;&amp;#22909;&amp;#26102;&amp;#20809;&amp;#65292;&amp;#37027;&amp;#19968;&amp;#23450;&amp;#20250;&amp;#38750;&amp;#24120;&amp;#24320;&amp;#24515;&amp;#8230;&amp;#25105;&amp;#22312;&amp;#20063;&amp;#27809;&amp;#26377;&amp;#36825;&amp;#20010;&amp;#26426;&amp;#20250;&amp;#12290;&lt;/p&gt;
&lt;p&gt;&amp;#26234;&amp;#26480;&amp;#65292;&amp;#20174;&amp;#37027;&amp;#22825;&amp;#20043;&amp;#21518;&amp;#65292;&amp;#27599;&amp;#22825;&amp;#26089;&amp;#26202;&amp;#37117;&amp;#32473;&amp;#20320;&amp;#30340;&amp;#23478;&amp;#20154;&amp;#30005;&amp;#35805;&amp;#65292;&amp;#33258;&amp;#24049;&amp;#34429;&amp;#28982;&amp;#24515;&amp;#24613;&amp;#65292;&amp;#20294;&amp;#22312;&amp;#30005;&amp;#35805;&amp;#20013;&amp;#19968;&amp;#30452;&amp;#23433;&amp;#24944;&amp;#20320;&amp;#30340;&amp;#23478;&amp;#20154;&amp;#65292;&amp;#27809;&amp;#26377;&amp;#20320;&amp;#30340;&amp;#28040;&amp;#24687;&amp;#23601;&amp;#26159;&amp;#22909;&amp;#28040;&amp;#24687;&amp;#65292;&amp;#25105;&amp;#19968;&amp;#30452;&amp;#22362;&amp;#20449;&amp;#36825;&amp;#19981;&amp;#21487;&amp;#33021;&amp;#65292;&amp;#32477;&amp;#19981;&amp;#21487;&amp;#33021;&amp;#8230;&amp;#26234;&amp;#26480;&amp;#65292;&amp;#20320;&amp;#26377;&amp;#28857;&amp;#33258;&amp;#31169;&amp;#65292;&amp;#20320;&amp;#19981;&amp;#30693;&amp;#36947;&amp;#20320;&amp;#30340;&amp;#29238;&amp;#27597;&amp;#65292;&amp;#20320;&amp;#30340;&amp;#22969;&amp;#22969;&amp;#26159;&amp;#22810;&amp;#20040;&amp;#30340;&amp;#29233;&amp;#20320;&amp;#65292;&amp;#22810;&amp;#23569;&amp;#27425;&amp;#22312;&amp;#30005;&amp;#35805;&amp;#37027;&amp;#22836;&amp;#65292;&amp;#20320;&amp;#30340;&amp;#29238;&amp;#20146;&amp;#21741;&amp;#21040;&amp;#19981;&amp;#25104;&amp;#20154;&amp;#22768;&amp;#65292;&amp;#20320;&amp;#30693;&amp;#36947;&amp;#20320;&amp;#30340;&amp;#29238;&amp;#27597;&amp;#29983;&amp;#20859;&amp;#20320;&amp;#21040;&amp;#20170;&amp;#22825;&amp;#26377;&amp;#22810;&amp;#20040;&amp;#30340;&amp;#19981;&amp;#23481;&amp;#26131;&amp;#65292;&amp;#25226;&amp;#20320;&amp;#22521;&amp;#20859;&amp;#25104;&amp;#22914;&amp;#27492;&amp;#20248;&amp;#31168;&amp;#65292;&amp;#22914;&amp;#27492;&amp;#20986;&amp;#31867;&amp;#25300;&amp;#33795;&amp;#26377;&amp;#22810;&amp;#38590;&amp;#65311;&amp;#22823;&amp;#23478;&amp;#37117;&amp;#24456;&amp;#29233;&amp;#20320;&amp;#65292;&amp;#37117;&amp;#20026;&amp;#22833;&amp;#21435;&amp;#20320;&amp;#24863;&amp;#21040;&amp;#38590;&amp;#36807;&amp;#65292;&amp;#20294;&amp;#26159;&amp;#35841;&amp;#21448;&amp;#33021;&amp;#27604;&amp;#20320;&amp;#30340;&amp;#23478;&amp;#20154;&amp;#26356;&amp;#38590;&amp;#36807;&amp;#65292;&amp;#26356;&amp;#30171;&amp;#24515;&amp;#65311;&lt;/p&gt;
&lt;p&gt;&amp;#26234;&amp;#26480;&amp;#65292;&amp;#20320;&amp;#30693;&amp;#36947;&amp;#24403;&amp;#22823;&amp;#23478;&amp;#24471;&amp;#30693;&amp;#20320;&amp;#30340;&amp;#20107;&amp;#24773;&amp;#21518;&amp;#26377;&amp;#22810;&amp;#20040;&amp;#30340;&amp;#28966;&amp;#24613;&amp;#65311;&amp;#21516;&amp;#20107;&amp;#20204;&amp;#22312;&amp;#32842;&amp;#22825;&amp;#23460;&amp;#37324;&amp;#19968;&amp;#30452;&amp;#22312;&amp;#35752;&amp;#35770;&amp;#22914;&amp;#20309;&amp;#25214;&amp;#21040;&amp;#20320;&amp;#65292;&amp;#24110;&amp;#21161;&amp;#20320;&amp;#65292;&amp;#25105;&amp;#20204;&amp;#21160;&amp;#29992;&amp;#25152;&amp;#26377;&amp;#32593;&amp;#32476;&amp;#19978;&amp;#33021;&amp;#21160;&amp;#29992;&amp;#30340;&amp;#36164;&amp;#28304;&amp;#65292;facebook&amp;#19978;&amp;#65292;twitter&amp;#19978;&amp;#65292;&amp;#22269;&amp;#20869;&amp;#21508;&amp;#20010;&amp;#31038;&amp;#20132;&amp;#32593;&amp;#32476;&amp;#65292;&amp;#19968;&amp;#36718;&amp;#21448;&amp;#19968;&amp;#36718;&amp;#30340;&amp;#28040;&amp;#24687;&amp;#37117;&amp;#20026;&amp;#20102;&amp;#23547;&amp;#25214;&amp;#20320;&amp;#65292;&amp;#22823;&amp;#23478;&amp;#37117;&amp;#22312;&amp;#23581;&amp;#35797;&amp;#21508;&amp;#31181;&amp;#26041;&amp;#24335;&amp;#25628;&amp;#25937;&amp;#20320;&amp;#65292;&amp;#24403;&amp;#21548;&amp;#35828;&amp;#24403;&amp;#22320;&amp;#35686;&amp;#21147;&amp;#27809;&amp;#26377;&amp;#23613;&amp;#20840;&amp;#21147;&amp;#26102;&amp;#65292;&amp;#25105;&amp;#20204;&amp;#29978;&amp;#33267;&amp;#23581;&amp;#35797;&amp;#20174;&amp;#22806;&amp;#20132;&amp;#36884;&amp;#24452;&amp;#19978;&amp;#32473;&amp;#20104;&amp;#21387;&amp;#21147;&amp;#12290;&amp;#37027;&amp;#20960;&amp;#22825;&amp;#65292;&amp;#22823;&amp;#23478;&amp;#30340;&amp;#24515;&amp;#20840;&amp;#37096;&amp;#31995;&amp;#22312;&amp;#20320;&amp;#36523;&amp;#19978;&amp;#65292;&amp;#25105;&amp;#24819;&amp;#35753;&amp;#20320;&amp;#30693;&amp;#36947;&amp;#65292;&amp;#25105;&amp;#20204;&amp;#27704;&amp;#36828;&amp;#37117;&amp;#19981;&amp;#20250;&amp;#24536;&amp;#35760;&amp;#20320;&amp;#12290;&lt;/p&gt;
&lt;p&gt;&amp;#26234;&amp;#26480;&amp;#65292;&amp;#20320;&amp;#27604;&amp;#25105;&amp;#22823;&amp;#19968;&amp;#23681;&amp;#65292;&amp;#25105;&amp;#21487;&amp;#20197;&amp;#21898;&amp;#20320;&amp;#22823;&amp;#21733;&amp;#12290;&amp;#20320;&amp;#36824;&amp;#37027;&amp;#20040;&amp;#24180;&amp;#36731;&amp;#65292;&amp;#20320;&amp;#29978;&amp;#33267;&amp;#36824;&amp;#26410;&amp;#36208;&amp;#21040;&amp;#29983;&amp;#21629;&amp;#20013;&amp;#37027;&amp;#26368;&amp;#20809;&amp;#36745;&amp;#28799;&amp;#28866;&amp;#30340;&amp;#26102;&amp;#20505;&amp;#65292;&amp;#20320;&amp;#21069;&amp;#38754;&amp;#30340;&amp;#36947;&amp;#36335;&amp;#19968;&amp;#29255;&amp;#20809;&amp;#26126;&amp;#65292;&amp;#37027;&amp;#26159;&amp;#19968;&amp;#26465;&amp;#29992;&amp;#20116;&amp;#24425;&amp;#26001;&amp;#26003;&amp;#30340;&amp;#24425;&amp;#34425;&amp;#38138;&amp;#23601;&amp;#32780;&amp;#25104;&amp;#65292;&amp;#36335;&amp;#19978;&amp;#26377;&amp;#25105;&amp;#20204;&amp;#19968;&amp;#24178;&amp;#20804;&amp;#24351;&amp;#38506;&amp;#20276;&amp;#65292;&amp;#25105;&amp;#20204;&amp;#20849;&amp;#21516;&amp;#21162;&amp;#21147;&amp;#65292;&amp;#19968;&amp;#36215;&amp;#20570;&amp;#25105;&amp;#20204;&amp;#20849;&amp;#21516;&amp;#28909;&amp;#29233;&amp;#30340;&amp;#20107;&amp;#24773;&amp;#65292;&amp;#25105;&amp;#20204;&amp;#32467;&amp;#20276;&amp;#20849;&amp;#21516;&amp;#36208;&amp;#21521;&amp;#37027;&amp;#24425;&amp;#34425;&amp;#20043;&amp;#39030;&amp;#65292;&amp;#37027;&amp;#20250;&amp;#26159;&amp;#19968;&amp;#27573;&amp;#22810;&amp;#20040;&amp;#32654;&amp;#22937;&amp;#30340;&amp;#26053;&amp;#31243;&amp;#65292;&amp;#21487;&amp;#20320;&amp;#23601;&amp;#36825;&amp;#26679;&amp;#31163;&amp;#24320;&amp;#65292;&amp;#20320;&amp;#20110;&amp;#24515;&amp;#20309;&amp;#24525;?&lt;/p&gt;
&lt;p&gt;&amp;#26234;&amp;#26480;&amp;#65292;&amp;#25152;&amp;#26377;&amp;#21516;&amp;#20107;&amp;#20250;&amp;#20026;&amp;#20320;&amp;#30340;&amp;#23478;&amp;#20154;&amp;#36865;&amp;#19978;&amp;#19968;&amp;#26463;&amp;#30333;&amp;#33394;&amp;#30340;&amp;#29611;&amp;#29808;&amp;#65292;&amp;#20195;&amp;#34920;&amp;#25105;&amp;#20204;&amp;#23545;&amp;#20320;&amp;#30340;&amp;#23478;&amp;#20154;&amp;#30340;&amp;#24944;&amp;#38382;&amp;#12290;&amp;#22914;&amp;#20309;&amp;#33021;&amp;#24110;&amp;#21161;&amp;#20320;&amp;#30340;&amp;#23478;&amp;#20154;&amp;#24230;&amp;#36807;&amp;#36825;&amp;#27573;&amp;#33392;&amp;#38590;&amp;#30340;&amp;#26102;&amp;#20809;&amp;#65311;&amp;#25105;&amp;#20204;&amp;#24863;&amp;#21040;&amp;#29305;&amp;#21035;&amp;#26080;&amp;#21147;&amp;#65292;&amp;#25105;&amp;#20204;&amp;#20250;&amp;#21457;&amp;#36215;&amp;#19968;&amp;#20010;&amp;#21215;&amp;#25424;&amp;#27963;&amp;#21160;&amp;#65292;&amp;#20165;&amp;#20165;&amp;#24076;&amp;#26395;&amp;#33021;&amp;#23613;&amp;#19968;&amp;#28857;&amp;#32501;&amp;#34180;&amp;#20043;&amp;#21147;&amp;#12290;&amp;#25105;&amp;#20204;&amp;#30693;&amp;#36947;&amp;#20320;&amp;#28909;&amp;#29233;&amp;#24320;&amp;#28304;&amp;#36719;&amp;#20214;&amp;#20107;&amp;#19994;&amp;#65292;&amp;#20026;&amp;#36719;&amp;#20214;&amp;#31038;&amp;#21306;&amp;#20316;&amp;#20986;&amp;#37027;&amp;#20040;&amp;#22810;&amp;#36129;&amp;#29486;&amp;#65292;&amp;#25105;&amp;#20204;&amp;#25171;&amp;#31639;&amp;#20197;&amp;#20320;&amp;#30340;&amp;#21517;&amp;#20041;&amp;#21512;&amp;#20316;&amp;#19968;&amp;#20010;&amp;#24320;&amp;#28304;&amp;#39033;&amp;#30446;&amp;#26469;&amp;#32426;&amp;#24565;&amp;#20320;&amp;#12290;&lt;/p&gt;
&lt;p&gt;&amp;#26234;&amp;#26480;&amp;#65292;&amp;#22312;&amp;#20844;&amp;#21496;&amp;#30340;blog&amp;#19978;&amp;#26377;&amp;#19968;&amp;#31687;&amp;#24764;&amp;#25991;&amp;#26469;&amp;#32426;&amp;#24565;&amp;#20320;&amp;#65288;&lt;a href="http://intridea.com/2010/5/20/in-memory-of-zigzag-chen"&gt;http://intridea.com/2010/5/20/in-memory-of-zigzag-chen&lt;/a&gt;&amp;#65289;&amp;#65292;&amp;#25105;&amp;#26367;&amp;#20320;&amp;#24779;&amp;#24796;&amp;#65292;&amp;#20026;&amp;#20320;&amp;#30171;&amp;#24515;&amp;#30340;&amp;#35805;&amp;#19981;&amp;#24895;&amp;#20877;&amp;#22810;&amp;#35828;&amp;#65292;&amp;#19981;&amp;#24819;&amp;#35753;&amp;#20320;&amp;#20197;&amp;#20026;&amp;#25105;&amp;#22826;&amp;#30699;&amp;#24773;&amp;#65292;&amp;#24076;&amp;#26395;&amp;#20320;&amp;#23433;&amp;#24687;&amp;#12290;&amp;#36825;&amp;#31687;&amp;#25991;&amp;#23383;&amp;#20889;&amp;#36215;&amp;#26469;&amp;#24515;&amp;#24773;&amp;#24456;&amp;#31967;&amp;#65292;&amp;#27492;&amp;#26102;&amp;#33830;&amp;#32469;&amp;#22312;&amp;#25105;&amp;#24515;&amp;#37324;&amp;#30340;&amp;#26159;&amp;#38518;&amp;#28170;&amp;#26126;&amp;#12298;&amp;#25405;&amp;#27468;&amp;#12299;&amp;#20013;&amp;#30340;&amp;#37027;&amp;#22235;&amp;#21477;&amp;#65292;&amp;#25105;&amp;#25226;&amp;#23427;&amp;#36865;&amp;#32473;&amp;#20320;&amp;#65306;&lt;/p&gt;
&lt;blockquote&gt;
&amp;#20146;&amp;#25114;&amp;#25110;&amp;#20313;&amp;#24754; &amp;#20182;&amp;#20154;&amp;#20134;&amp;#24050;&amp;#27468;&lt;br /&gt;
&amp;#27515;&amp;#21435;&amp;#20309;&amp;#25152;&amp;#36947; &amp;#25176;&amp;#20307;&amp;#21516;&amp;#23665;&amp;#38463;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NS5tbkMJDQ8sBt6GtZhr6pixlJE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NS5tbkMJDQ8sBt6GtZhr6pixlJE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NS5tbkMJDQ8sBt6GtZhr6pixlJE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NS5tbkMJDQ8sBt6GtZhr6pixlJE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/835</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[你喜欢厉曼婷写的词么？]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/CpZJcrc0U5A/832" />
    <updated>2010-04-26T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/832</id>
    <content type="html">&lt;p&gt;之前一篇&lt;a href="http://www.lvguoning.com/blog/2010/04/17/806/"&gt;博客&lt;/a&gt;中，我写道自己很喜欢万曼婷写的那首《俩俩相忘》，却找不到词作者的任何资料。后来有网友指出，原来词作者的名字叫做&lt;a href="http://baike.baidu.com/view/866078.htm"&gt;厉曼婷&lt;/a&gt;，我是被虾米上的词曲资料给误导了。&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4553857284/" title="Screen shot 2010-04-26 at 1.19.09 PM by lgn21st, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3011/4553857284_6228059130_o.png" width="400" height="130" alt="Screen shot 2010-04-26 at 1.19.09 PM" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;百度百科上的解释非常简短，仅仅用了一句话来概括她的词风：&lt;/p&gt;
&lt;blockquote&gt;
像她散发着古典温婉的名字一样，厉曼婷的词向来透着女性的婉约之美，她的个人风格也许不够鲜明，但她的填词与简约精致的曲相配搭总有古典飘逸的独特美感，适合传唱又不落俗套。
&lt;/blockquote&gt;
&lt;p&gt;现在听歌，喜欢鉴赏歌词，越来越关注词作者了。回看她写过的词，我发现十之八九我都曾经非常喜欢，勾起阵阵美好的回忆。除了之前的《俩俩相忘》，我在豆瓣上找到&lt;a href="http://www.douban.com/group/topic/1468430/"&gt;这个&lt;/a&gt;，你喜欢厉曼婷写的词么？&lt;/p&gt;
&lt;p&gt;陈淑桦《笑红尘》&lt;/p&gt;
&lt;blockquote&gt;
红尘多可笑 痴情最无聊&lt;br /&gt;
目空一切也好&lt;br /&gt;
此生未了 心却已无所扰&lt;br /&gt;
只想换得半世逍遥
&lt;/blockquote&gt;
&lt;p&gt;林志炫的《离人》&lt;/p&gt;
&lt;blockquote&gt;
银色小船摇摇晃晃弯弯&lt;br /&gt;
悬在绒绒的天上&lt;br /&gt;
你的心事三三俩俩蓝蓝&lt;br /&gt;
停在我幽幽心上
&lt;/blockquote&gt;
&lt;p&gt;周华健《花心》&lt;/p&gt;
&lt;blockquote&gt;
花的心 藏在蕊中&lt;br /&gt;
空把花期都錯過&lt;br /&gt;
妳的心 忘了季節 從不輕易讓人懂&lt;br /&gt;
為何不牽我的手 共听日月唱首歌&lt;br /&gt;
黑夜又白晝 黑夜又白晝&lt;br /&gt;
人生為歡有幾何
&lt;/blockquote&gt;
&lt;p&gt;张信哲《太想爱你》&lt;/p&gt;
&lt;blockquote&gt;
太想爱你 是我压抑不了的念头&lt;br /&gt;
想要全面占领你的喜怒哀愁&lt;br /&gt;
你已征服了我 却还不属于我&lt;br /&gt;
叫我如何不去猜测你在想什么
&lt;/blockquote&gt;
&lt;p&gt;张信哲《有一点心动》&lt;/p&gt;
&lt;blockquote&gt;
我对你有一点动心&lt;br /&gt;
却如此害怕看你的眼睛&lt;br /&gt;
有那么一点点动心　一点点迟疑&lt;br /&gt;
不敢相信我的情不自禁
&lt;/blockquote&gt;
&lt;p&gt;金海心《那么骄傲》&lt;/p&gt;
&lt;blockquote&gt;
别那么骄傲　我随时可能走掉&lt;br /&gt;
我的手你还没有牵到&lt;br /&gt;
夜太长　月光一定会冷掉　怎么办才好&lt;br /&gt;
你欠我一个拥抱　而我却一再对你微笑&lt;br /&gt;
抱着我的苦恼睡着了觉
&lt;/blockquote&gt;
&lt;p&gt;刘德华《相思成灾》&lt;/p&gt;
&lt;blockquote&gt;
纵然心无碍 情如海&lt;br /&gt;
未了情缘在心中独白&lt;br /&gt;
只盼也无猜 也不怪&lt;br /&gt;
不再让相思成灾
&lt;/blockquote&gt;
&lt;p&gt;成龙《醉拳》&lt;/p&gt;
&lt;blockquote&gt;
我颠颠又倒倒好比浪涛&lt;br /&gt;
有万种的委屈我付之一笑&lt;br /&gt;
我一下低我一下高&lt;br /&gt;
摇摇晃晃不肯倒&lt;br /&gt;
酒里乾坤我最知道
&lt;/blockquote&gt;
&lt;p&gt;除了成龙的《醉拳》，剩下的都是苦情歌，这个也跟词作者是女性的身份有关吧。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Bm3as1V_W2nifZfTzAofMxyKU58/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bm3as1V_W2nifZfTzAofMxyKU58/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Bm3as1V_W2nifZfTzAofMxyKU58/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bm3as1V_W2nifZfTzAofMxyKU58/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/832</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[今年的大日子被我错过了]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/VHb_9XMLrLg/820" />
    <updated>2010-04-26T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/820</id>
    <content type="html">&lt;p&gt;&lt;b&gt;忙&lt;/b&gt;，已经是一个高频字了，学生有学生的忙，工作的人有工作的忙，每个人都在忙于各自的事情&amp;#8230;&lt;/p&gt;
&lt;p&gt;其实忙是常态，古人造字总是包含着大哲学，大智慧。前段时间，观摩一个Toastmaster的Area级别的比赛，一个参赛选手在台上即席演讲，主题就是把这个字拆解给大家。忙，就是“心”＋“亡”。“心”无需解释，“亡”确有两重含义，第一是心死，第二是亡命，就是取亡命天涯的意思，是逃命，也是逃避。&lt;/p&gt;
&lt;p&gt;问自己一句，我的心在亡命天涯么？我的心命在旦夕么？我突然意识到，因为忙，我把自己的大日子给错过了。三年前得尝所愿开始作软件开发。以一个菜鸟的身份，每天如履薄冰一般的前行，从入职第一天算起，每年4月20日，我都会写篇博客，记录过去的一年，总结得失，发点感悟，但是今年的4月20日被我错过了！&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;2007年4月20日：&lt;a href="http://lgn21st.javaeye.com/blog/73197"&gt;今天是我的大日子（1）&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2008年4月20日：&lt;a href="http://lgn21st.javaeye.com/blog/184540"&gt;今天是我的大日子（2）&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2009年4月20日：&lt;a href="http://www.lvguoning.com/blog/2009/04/21/%E4%BB%8A%E5%A4%A9%E6%98%AF%E6%88%91%E7%9A%84%E5%A4%A7%E6%97%A5%E5%AD%903/"&gt;今天是我的大日子（3）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;真幸运自己曾经留下了这些文字，记录了当时的点点滴滴。回过头来看，尽管青涩，稚嫩，但这就是自己走向成熟的凭证。第一年，我在感叹自己很清楚自己真正喜欢什么，很幸福。第二年，感慨自己是那么的幸运，通过技术社区，通过演讲俱乐部，通过入职的每一家公司的那些朋友们，汲取到了那么多的快乐。并开始质疑两年的经验，提醒自己认识“经验的局限性”，让自己保持警惕。今年是第三年，我有了一些新的感悟，其实这个独立Blog架起来到现在刚好一年多。晚上从第一篇开始一篇一篇看过来，感慨特别多，但是找不到一个准确的形容词来表达此刻的心情。不过以后可以很自信得向别人介绍自己，&lt;b&gt;我作Rails开发三年了～～～&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;我一度相信兴趣就是最大的驱动力，曾经常以自己作样板，&lt;b&gt;教育&lt;/b&gt;过不少的人&amp;#8230; 虽然现在我仍然相信。但是不得不说，我动摇过，在去年的夏天，我一度被工作压力和健康状况打败，心理状况非常不理想，对软件开发开始变得心意阑珊，那时候甚至不愿多写哪怕一行代码，就好像自己变得空空，一无所有。我选择了放手，辞职，休息，用锻炼改善身体素质，开始尝试作一些平时没有机会作的事情，长途骑行，回家陪父母三个月，搞技术大会&amp;#8230; 从离职到再就业，中间我停滞了5个月，我以为我重新调整好了自己，完成了self reboot。&lt;/p&gt;
&lt;p&gt;其实当时并未真正解决自己的问题，我发现自己仍然心存焦虑，犹豫，视野依然不够清楚。长期混迹在程序员社区，演讲俱乐部，有机会接触到更多的人，值得信赖的朋友也多。最神奇的事就是，当自己纠结在乱麻中无法自拔时，周围的朋友给于的帮助，提点，是那么的实际，那么的有效。元一刺激了我，因为他清楚的知道自己该作什么，想作什么。Forrest影响了我，他指出了我思维模式中的短板。帮助我的朋友还有很多，一次参加完活动后跟吴克杰一起回家的路上，一席话点醒了我的症结，原来我仍然在原地打转，在兜圈子，答案就在圆心，我确看不到。而我绕着的那个圈子，其圆心就是我的中心目标，我的问题是缺乏中心目标。我太需要一个能为之付出努力的目标了。&lt;/p&gt;
&lt;p&gt;事情有的时候，就是这么的洗具，一筹莫展的时候，会寄希望于什么人能有一种神奇的方式帮你药到病除，比如想升迁的人希望多学一点办公室哲学，政治（《杜拉拉升职记》是如此的热销啊）希望有经验的人给划出一条道，还要最短最优。希望&amp;#8230; 其实，你正真缺乏的，很可能是不明白，不理解自己的问题，甚至从不曾考虑过自己有没有自己的问题，或者在刻意回避自己的问题。找问题其实比找答案更难，不过弄明白了真正的问题后，答案很可能显而易见。&lt;/p&gt;
&lt;p&gt;想明白之后，该干嘛干嘛。结束了一份三个月的实习工作，玎玎在这个时候出现了，跟他深入交流之后，我入职现在的公司，而且有了明确的目标，有了目标，工作有了另外一重含义，变得更有价值，而且过程很开心。我比较幸运，要谢谢所有帮助过我的人。有时真希望自己能有个魔法水晶球，看看自己三年后是什么样子，不过现在没有心存任何疑虑，继续走。&lt;/p&gt;
&lt;p&gt;＝＝＝＝＝＝ 生活碎碎念，记录与此，就不用另外写博了 ＝＝＝＝＝&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;忙，写Blog成了奢侈的事，开始为下一次RubyConf China活动积极努力，巨大的挑战。&lt;/li&gt;
  &lt;li&gt;11号去参加Think In LAMP的线下活动，作了一个主题演讲，视频已经拿到了，发现久不做演讲，自己好啰嗦，缺乏锻炼了。&lt;/li&gt;
  &lt;li&gt;18号去参加了人本设计沙龙，终于看见了西乔同学真人，好吧我承认我动机不纯。&lt;/li&gt;
  &lt;li&gt;跟盛大的唐一丁约好了去盛大作一个介绍rails社区的演讲，定好了这周三下午，有点压力。&lt;/li&gt;
  &lt;li&gt;答应了海贵，这周三作个C9演讲，但是没有时间准备，把下午盛大的演讲晚上在重作一遍不知道行不行。&lt;/li&gt;
  &lt;li&gt;其实两周前就定好了IDEAL的C1英文演讲，冲突了，而且没有时间去准备，这个让我很焦虑。&lt;/li&gt;
  &lt;li&gt;每周都去上外上课，而且还有第二外语日语，没有时间预习复习，时间精力要管理好。&lt;/li&gt;
  &lt;li&gt;今天老同学聚会，毕业6年了，大家变化都特别大，席间一直唏嘘不已&amp;#8230;&lt;/li&gt;
  &lt;li&gt;5月9号的朋友聚会，计划玩“现金流游戏”，怕是去不成了，今天上外通知，9号全天上课。&lt;/li&gt;
  &lt;li&gt;iPad我已经拿到了，这个东西太强大了，我以后不会睡前在床上抱着电脑了，但是抱着iPad的话，根本无法入睡嘛。&lt;/li&gt;
  &lt;li&gt;朋友们都要求我上iPad的开箱照，网上那么多，为什么不饶了我呢?你们要理解我，不是我不想照，而是家里太乱，找不到一处整齐的地方作为拍照的背景啊，好吧，我去阳台上照一张 :-)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4551384285/" title="DSCN1318 by lgn21st, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3625/4551384285_1ae7e36d97.jpg" width="500" height="375" alt="DSCN1318" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Idpmn7HyvzV4O642wDSLEXutt7o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Idpmn7HyvzV4O642wDSLEXutt7o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Idpmn7HyvzV4O642wDSLEXutt7o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Idpmn7HyvzV4O642wDSLEXutt7o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/820</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[双调·乔牌儿]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/ZFLKphaHNcA/806" />
    <updated>2010-04-17T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/806</id>
    <content type="html">&lt;blockquote&gt;
世情推物理，人生贵适意，想人间造物搬兴废。&lt;br /&gt;
吉藏凶，凶藏吉，富贵那能长富贵？&lt;br /&gt;
日盈昃，月满亏蚀。&lt;br /&gt;
地下东南，天高西北，天地尚无完体。&lt;br /&gt;
展放愁眉，休争闲气。&lt;br /&gt;
今日容颜，老于昨日。&lt;br /&gt;
古往今来，尽须如此。&lt;br /&gt;
管他贤的愚的，贫的和富的。&lt;br /&gt;
到头这一身，难逃那一日。&lt;br /&gt;
受用了一朝，一朝便宜。&lt;br /&gt;
百岁光阴，七十者稀。&lt;br /&gt;
急急流年，滔滔逝水。
&lt;/blockquote&gt;
&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;这首词是关汉卿的《双调·乔牌儿》，经过一番搜索，发现就是原版，非删节修改过。这首词道出了许多人生哲理，意境深邃，不管读多少遍，总能触动一些思绪，但又感觉有些似懂和懵懂&amp;#8230;&lt;/p&gt;
&lt;p&gt;这首词曾经出现在金庸笔下《倚天屠龙记》中，当张无忌和小昭被困光明顶地道中，走投无路，直面死亡得困境时，小昭为张无忌吟唱的那一曲，就是这首词。记忆中最喜欢得《倚天屠龙记》是马景涛的TV版，但是小昭唱的绝不是这段词。现在知道了，原来是TV版中这一曲，就是当年风靡一时的辛晓琪的《&lt;a href="http://xiami.com/song/383795"&gt;俩俩相忘&lt;/a&gt;》，并收录在《&lt;a href="http://xiami.com/album/12376"&gt;领悟&lt;/a&gt;》这张专辑中。&lt;/p&gt;
&lt;blockquote&gt;
拈朵微笑的花 想一番人世变换 到头来 输赢有何妨&lt;br /&gt;
日与月互消长 富与贵难久长 今早的容颜老于昨晚&lt;br /&gt;
眉间放一字宽 看一段人世风光 谁不是 把悲喜在尝&lt;br /&gt;
海连天走不完 恩怨难计算 昨日非今日该忘&lt;br /&gt;
浪滔滔 人渺渺 青春鸟 飞去了 纵然是千古风流浪里摇&lt;br /&gt;
风潇潇 人渺渺 快意刀 山中草 爱恨的百般滋味随风摇
&lt;/blockquote&gt;
&lt;p&gt;改版真的很巧妙，将人生恩怨，侠骨柔肠，爱恨情仇全都交织在这首词中。原版改版我都很喜欢。但是却引出了我的两个疑惑，第一是这首词的作者，是怎么样写出这么细腻传神的词。第二是这首词的名字，为什么叫做《俩俩相忘》。&lt;/p&gt;
&lt;p&gt;词作者&lt;b&gt;万曼婷&lt;/b&gt;我找不到她的任何资料，能找到的，仅仅是她的一些其他作品。万曼婷于我而言重要么？也许并不重要，但是至少我记住了她，记住了她这首凄美的词。&lt;/p&gt;
&lt;p&gt;“俩俩相忘”应该出自庄子的名句，被后人美名的“&lt;a href="http://baike.baidu.com/view/27772.html"&gt;相濡以沫&lt;/a&gt;”。“相濡以沫”用于赞美厮守一生的忠贞爱情，即使在泉水干涸后，两条鱼依然紧紧依偎，互相用嘴里仅剩的一点点水来互相润湿对方的身体&amp;#8230;但其实这是后入谬解了庄子本意，其实应该是“与其相濡以沫，不如相忘于江湖”，选择旦夕之间的相互依存，还是选择相互忘却，各自在各自的江湖寻找各自的幸福呢？&lt;/p&gt;
&lt;p&gt;旦夕间，相濡以沫也许容易，但朝夕相处却很难。如果爱太难，不如放手，让彼此重获自由，去追寻各自的幸福吧。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EGjCH8zUYHTKbEtRa2-fN0n9-UA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EGjCH8zUYHTKbEtRa2-fN0n9-UA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EGjCH8zUYHTKbEtRa2-fN0n9-UA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EGjCH8zUYHTKbEtRa2-fN0n9-UA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/806</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[去听笑来老师的讲坛]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/Y91-X3d7sMU/798" />
    <updated>2010-04-11T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/798</id>
    <content type="html">&lt;p&gt;盛大全球互动娱乐专家讲坛本月的演讲嘉宾是&lt;a href="http://www.lixiaolai.com/"&gt;李笑来&lt;/a&gt;老师，今天特意跑去听了笑来老师的演讲。&lt;br /&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4507468017/" title="lixiaolai by lgn21st, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2733/4507468017_ecbbbabdf0.jpg" width="500" height="354" alt="lixiaolai" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;/p&gt;
&lt;p&gt;归来，整理一下思路。笑来老师在程序员群体中已经享有很高的声望，他的《&lt;a href="http://www.lixiaolai.com/index.php/archives/464.html"&gt;把时间当朋友&lt;/a&gt;》这本书我去年就读过，还做过读书&lt;a href="http://www.lvguoning.com/blog/2009/09/09/%E6%8A%8A%E6%97%B6%E9%97%B4%E4%BD%9C%E6%9C%8B%E5%8F%8B-%E8%BF%90%E7%94%A8%E5%BF%83%E6%99%BA%EF%BC%8C%E8%8E%B7%E5%BE%97%E8%A7%A3%E6%94%BE/"&gt;笔记&lt;/a&gt;。很佩服笑来老师，演讲非常出色。洋洋洒洒两个小时，虽然主题号称是围绕这本书，但是整场讲的都是书中没有的东西，而且所有的故事，案例，均出自笑来自己真实的故事。仍然保持着他一贯的很IN的观点，一针见血指出事物背后朴素的真理，论证严密，富有说服力。&lt;/p&gt;
&lt;p&gt;我一直订阅笑来老师的Blog，甚至可以说他的博客文字对我的影响很深。当然，也有不少观点，第一次接触时时，我就产生质疑，今天听罢，自己的观点我依然保留。剩下的除了赞同的那些之外，还有一些观点，道理，我还不能领会，也许涉世仍然尚浅吧。&lt;/p&gt;
&lt;p&gt;笑来老师说，在新东方，他其实是一个最好的销售，好的销售不在于你是不是很会忽悠，关键在于你的产品一定要靠谱（笑来老师用Jobs和他的iPhone发布会来举例）。这一点跟我的感知有所不同，虽然我不是销售，但认识一些做销售的人，而且没有被那些销售领域的成人童话洗脑过，所以我坚信一个好的销售，不一定手上的产品是市面上最好的。因为第一永远只有一个，其他二三流产品多了去了，做二三流产品的销售才是大多数，主力军，也不见得这些销售就混不下去。如果信息流动达到一定的程度，那么一切忽悠的手段就不起作用了，这点我同意。即使这样，成为优秀销售的关键，我想还是能把自己成功的推销出去，能站在客户的角度替客户着想，解决客户的问题，提供更好的方案，进而取得客户的信任等等，把一手烂牌打好的例子绝不在少数。&lt;/p&gt;
&lt;p&gt;在会议结束的QA环节，很幸运能现场向笑来老师提问，开篇我这么说，笑来老师，我绝对不会花钱买你的书！&amp;#8230;&amp;#8230;因为我可以通过你的网站全文浏览，而且我觉得更加环保 :-) 我的第一个问题是：笑来老师你能将成功学的那些著作批判的如此惨烈，一定是花了很多心思研究过成功学吧？我读这本书时，这个部分给我留下非常深刻的印象，我猜测你一定在成功学领域做过精深的研究。&lt;/p&gt;
&lt;p&gt;之所以我会问这个，是因为我第一次阅读时做过这样的笔记：&lt;/p&gt;
&lt;blockquote&gt;
前几日，在总结读《时间》笔记时，心中就有一个疑惑，《时间》这本书中倡导的仍然是态度，耐心，坚持，努力这些放之四海而皆准，千年不变且被人说烂了的东西。我有个研究东西的喜好，喜欢类比研究，拿《时间》和其他那些励志类的书做比较。结论是，他们宣扬的东西，其本质没有什么太大区别，细微不同之处在于笑来老师的论据更加客观，而那些励志类的书籍更会讲故事。
&lt;/blockquote&gt;
&lt;p&gt;笑来老师的回答直接了当，谁没有年轻过？而且为了写好这个章节，我又特意研究过。我对心理学的研究成果表示肯定，但是不靠谱的成功学往往将心理学的研究成功误用，所以我对待成功学，有一种复杂的心态。&lt;/p&gt;
&lt;p&gt;我的第二个问题是：我认为笑来老师在书中提到的一套追踪，管理时间的方法学，可操作性不强。&lt;/p&gt;
&lt;p&gt;之所问这个问题，在工作中一直有关于如何平衡时间，精力，压力，生活等方面的问题。自己是个长期GTD实践者，在实践的不同阶段对GTD思想的理解也不同，从试用各种GTD工具，到慢慢不依赖具体工具，从观察高效人士的工作习惯，到研究天才们是如何思考的等等，这个过程让我慢慢演进和形成一套可靠的，适合自己的GTD方法学。我本意想指出笑来老师的这套方法学可能偏小众，有点走极端，虽然精神靠谱，但是不必拘泥在具体形态上给予过分指导。不过这个问题，笑来老师的答复很简单，他认为我GTD做的太少了，呵呵，这一点我保留意见。&lt;/p&gt;
&lt;p&gt;总的来说很有收获，收获最大的就是亲眼见到笑来老师本人，听笑来老师讲故事，呵呵。同意笑来老师总结，越早醒悟越好，既然想明白了，该干嘛干嘛去。&lt;/p&gt;
&lt;p&gt;====&lt;br /&gt;
后记，在会场遇到一些来自Toastmaster的朋友们，聊天很开心，他们是慕名来听笑来老师的讲坛，居然这些非IT圈子的人对IT圈子里面的一些事情都知根知底呢，都知道和菜头，比特海，槽边往事，居然甚至还知道“每日北风定推”&amp;#8230;世界真小！&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nVEJi21r5CAAy6t0h178XK86E6Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nVEJi21r5CAAy6t0h178XK86E6Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nVEJi21r5CAAy6t0h178XK86E6Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nVEJi21r5CAAy6t0h178XK86E6Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/798</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[TED活动归来]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/QsvsQgxLhfw/787" />
    <updated>2010-04-06T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/787</id>
    <content type="html">&lt;p&gt;今天我想写的东西是关于活动，早就想写一篇关于活动以及活动筹备的文字，腹稿很乱且杂。我记得我开blog第一篇就这么说：写作就像锻炼肌肉，越练就越强。现在事情刚刚好反过来，疏于锻炼，这块肌肉就变的很差。千丝万缕毫无头绪，到底从什么地方开始下笔呢？&lt;/p&gt;
&lt;p&gt;周六参加了&lt;a href="http://www.ted.com"&gt;&lt;span class="caps"&gt;TED&lt;/span&gt;&lt;/a&gt;的活动，这个活动着实人气十足，弄得主办方不得不早早关闭了报名注册通道，却依然挡不住TED粉丝的热情，当天现场，一个小小咖啡厅容纳了超过50个人，水泄不通呢。&lt;br /&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4489839256/" title="20100403_salon_header by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4020/4489839256_2231f5b789.jpg" width="500" height="165" alt="20100403_salon_header" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;TED的这次活动质量非常的高。参与活动的人都对TED非常熟悉的人，演讲嘉宾也很专业，总体来说非常成功。三个主题演讲人都是女性，全部是纯英语演讲，首位演讲者冰冰通过有趣的故事让大家了解上海和伦敦的文化差异，独立策展人比利安娜中英穿插，妙语连珠，第三位演讲人介绍她的中国经历，从食物到日用品，从环保概念到可持续发展概念，从国外的理念到中国的实践等等话题。活动归来我感觉收获满满。&lt;/p&gt;
&lt;p&gt;上帝在创世之初，为了惩罚人类，让不同种族之间的语言不能互通，这就是&lt;a href="http://baike.baidu.com/view/242064.htm"&gt;巴别塔&lt;/a&gt;的由来。感谢上帝，因为语言文字的不通，也造就了不同的文化。当不同文化产生交流，碰撞的时候，总能给我带来这么多有趣，丰富多彩的话题，只要是涉及到这里，我总是表现得乐此不疲呢。最近报名了上外的英语专业的学历教育，每个周日都去学英语，有朋友听闻我选择英语专业，都感觉非常诧异，其实原因很简单，那些其他专业对我来说，都比较务虚，对我的实际帮助不大。另外我一直在外资公司工作，跟国外同事接触多了，仅限于技术层面的交流沟通根本不够，开始在文化层面，思想层面的沟通交流有了更高的诉求，这促使我下决心学好英语，呵呵。想起能跟老外海阔天空交流文化，并能流畅得表达自己的想法，想想口水都会流出来~&lt;/p&gt;
&lt;p&gt;参加活动还有最重要的一点是可以跟更多各种层面的人接触，交流，沟通。这次活动我第一次见到了未来的同事钱友才，虽然仅仅简单聊了几句，他就因为有事先走了，但是对方给自己留下的印象极好，有种迫不及待能跟他一起共事的感觉！大家可能不熟悉钱友才，他可是那本《&lt;a href="http://liwei.china-pub.com/195770"&gt;苹果开发之Cocoa编程（第三版）&lt;/a&gt;》的译者之一呢，就私心来说，转做Cocoa/iPhone开发可是我的一大愿望，今年这个愿望可以踏实落地了。&lt;/p&gt;
&lt;p&gt;另外一个收获是结识了来自&lt;a href="http://www.tencent.com"&gt;Tencent&lt;/a&gt;的&lt;a href="http://twitter.com/samon127"&gt;Sam&lt;/a&gt;，或者叫他三马，哈哈。Sam组织了一个开源的基于LAMP的技术社区，搭建了一个叫做&lt;a href="http://www.thinkinlamp.com/"&gt;ThinkinLAMP&lt;/a&gt;的网站，每月举办一次的小型线下交流活动。我经报名了，在4月11日的活动上做一个主题分享，因为是第一次参加他们的活动，我就打算把自己的Rails社区介绍给他们，呵呵。最有趣的是，原本毫不相干的两个人，机缘巧合聊起来，就慢慢会被某些人，某些事件，某些东西给联系起来，于是越聊两个人的关系越近，越聊越有共同话题，开始满心期待周日的活动。&lt;/p&gt;
&lt;p&gt;说起参加活动，我自己平时除了参加&lt;a href="http://www.toastmasters.org"&gt;Toastmaster&lt;/a&gt;的活动，参加开源社区活动，自己组织&lt;a href="http://groups.google.com/group/shanghaionrails?hl=en"&gt;Shanghaionrails&lt;/a&gt;活动，也算有些经验了，于是我开始习惯于从一个活动组织者的视角来观察TED的这次活动，只要是活动，就一定存在有改进的空间，我简单想想就能想到不少可以改进的地方。不过，既然这次的活动已经成功结束了，我是应该去找会议主办人，提出自己的意见，期待他们改进呢？还是索取联系方式，积极争取参与到下一次活动的组织筹备工作中，亲手提升会议质量？那个更重要呢？呵呵~~~&lt;/p&gt;
&lt;p&gt;组织一次活动聚会绝不是一件轻松的事情，上个月我成功组织了一次&lt;a href="http://www.lvguoning.com/blog/2010/03/13/shanghai-on-rails-320%E5%8F%B7%E6%B4%BB%E5%8A%A8%E9%80%9A%E5%91%8A/"&gt;shanghaionrails线下活动&lt;/a&gt;，除了自己写了一篇&lt;a href="http://www.lvguoning.com/blog/2010/03/27/shanghaionrails-%E7%AC%AC%E4%B8%83%E6%AC%A1%E7%BA%BF%E4%B8%8B%E6%B4%BB%E5%8A%A8%E5%90%8E%E8%AE%B0/"&gt;会后报道&lt;/a&gt;，还一直想把活动筹备中的点点滴滴写出来，把那些好玩的，有趣的，值得记忆的东西写成文字，发布到网上，可是因为自己懒惰，因为种种原因拖了这么久，结果现在自己的记忆模糊了，赶紧把大脑dump出来，能想起多少算多少。&lt;/p&gt;
&lt;p&gt;组织活动需要多大的投入？其实组织一次shanghaionrails线下活动的组织，投入精力还好，不算太大。主要是投入时间，我前前后后大概用掉两周的业余时间来忙这个，不停的跟相关的人电话沟通。早在一个月之前，我就跟每一个演讲嘉宾定好了演讲主题，提前两周，我大概发起了三轮关于演讲主题细节的电话沟通，因为自己一直参与一个专业的演讲俱乐部，对如何做好演讲有了一点心得，好为人师的冲动就体现出来了，于是我跟每个演讲嘉宾都探讨了一遍他们的讲稿，主题，结构等等。后来事实证明，效果很好，不过我起到的作用其实相当有限，微乎其微，因为演讲不是有技巧就能做好的，需要大量练习，还要演讲人本身实力，当天的演讲都这么精彩，只能说明是这些演讲嘉宾实力比较强悍，呵呵。&lt;/p&gt;
&lt;p&gt;这次活动最大的一个亮点是场地，大概在年前我就去过这个场地，当时是朋友聚会。聊到要做这么一个活动，要解决场地的问题，dlee就提议把活动安排在他们公司，5173对这种类型的活动非常支持，后来我联系下来，发现dlee所言非虚，5173对这次活动给予的支持，远远超出我的想象，他们派出两名专员专门负责这个事情，帮助我策划活动细节，甚至帮助我们制作了精美的活动海报，并彩色打印成宣传单，现场派发。这次活动筹备的如此成功，5173占功劳簿的头名，也谢谢dlee帮助联络。&lt;/p&gt;
&lt;p&gt;技术型的程序员，软件工程师，其实最需要的就是走出去，多参加一些活动，接触一些其他层面的人，打开自己的眼界，打开自己的心扉&amp;#8230; 这是很老套了的表达方式了，我举个实际的例子吧。5173一楼咖啡厅的大堂经理叫段萌，我称呼他段先生。这次会场具体的布置细节我主要跟他联系，段先生给人一种非常干脆利落，雷历风行的感觉（请原谅我不擅长描写刻画人的外观面貌），第一次见到他，是在会议倒数第二天的中午，我们开了一个碰头会，商量好了种种会场布置细节，并约定会议前一天布置会场。整个会场布置下来，段先生始终对所有细节拿捏把握得当，会场布置在他的指挥安排下，我和两个朋友（元一，Terry），四个人一小时不到就全部搞定。之后他请我们几个人喝饮料，我顺便跟他聊了聊。&lt;/p&gt;
&lt;p&gt;段先生从事餐饮服务业超过15年，他跟我说他做过酒店，咖啡厅，茶餐厅，酒吧，基本都做全了。对这一行理解非常深刻。我问他他对自己所做的职业，最大的感触是什么，他告诉我，其实服务业想要做好，说难并不难，甚至可以说是简单，就是：“你能够站在对方的角度理解，思考问题”。秘诀就这么一句，但是想要做到却不是容易的事情，你服务的客人，每个人都不一样，每个人都有自己的想法，特点，如果你是当班经理，当有事件发生后，处理问题核心就是看你是否能最快稳定客人的情绪，能有效的跟客人沟通，并取得对方的认可，甚至信任，而且限时最多两分钟，不会有更多的时间，你会怎么做？他的15年从业经验，让我我完全从他身上真切感受到了这种能力，成熟，稳重，自信，说话非常有亲和力，且对事态把握非常准确，把握到位。那真的是一种长期修炼后才能拥有的气质。段先生给予的帮助有：安排会场，会议前的签到准备，以及引路牌，具体时间安排，（段先生本人非常守时）会议结束后怎么散场，中场休息如何组织参观，以及最后一干朋友们怎么叫车，在什么地方定餐，价格，菜式细节等等&amp;#8230;. 给我建议事无巨细，而且从他这里的到的这些建议，最终汇总成为这次活动的整体解决方案。我要做的，就是完全遵照他的建议实施下来，效果棒极了。&lt;/p&gt;
&lt;p&gt;我们讨论到做餐饮服务业，和从事计算机软件开发工作的异同时，他跟我提到一点特别有趣，他说，有一次他们也是组织了一次活动，也有技术人员参与。活动上有个摆火柴的小游戏，很明显的，如果是技术人员玩这个游戏，思路上就很封闭，始终跳不出那个模式。的确，设计模式，开发模式，各种模式的洗礼，都是程序员必经的路障，思维方式是经由模式化训练过的。乃至于我后来自己都开始不断反思，如何才能跳出自己的模式，跳出自己的圈子。闲谈中间我表达了我的一些隐忧，因为我自己独立筹备这次活动，太想把活动搞好，除了自己可控的事情，我一一努力做到位，很多不可控的事情，让我无法放心。段先生跟我说的话我印象非常深刻，人能取得成就感，感觉开心，感觉满足，有一个秘诀，就是不能将期望值设定的太高，在组织中能够高效顺畅的与人交往，沟通，合作的人，务必是一个对自己严格要求，却又是一个对他人非常宽松的人。所以，只要那些演讲嘉宾能来，来了能上去说，你就应该开开心心，心满意足了，如果他们讲的好，那就更完美了，这就是严以律己，宽以待人呀。所以，遵照段先生的建议，我将注意力放在自己可控的事情上，做能做到的，尽量做好，结果当天演讲嘉宾各个表现出彩，让这次活动棒极了，给人留下深刻的印象，也证明了我先前的担忧完全是没有必要的。&lt;/p&gt;
&lt;p&gt;我其实特别想写自己搞活动的意义，这个写起来太多了，足够我将来找合适的时间，单独写一篇关于活动之于我，之于身边的人，之于大家都有些什么样深层含义，今天就到这里吧。如果精简总结的话，一次活动最有意义的地方，就是用一种特别有趣的方式，将你，你身边，你的朋友们关联起来，没有联系的建立联系，有联系的加深联系，这些关联关系在活动中开始交织，汇聚，并产生一些意想不到的体验，并带来一些意想不到的结果，而且这些今天的结果，立即变成了种子，开始在明天发芽，成长。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IRFjxx74nbVNBzbYsYgMdjfKW3M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IRFjxx74nbVNBzbYsYgMdjfKW3M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IRFjxx74nbVNBzbYsYgMdjfKW3M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IRFjxx74nbVNBzbYsYgMdjfKW3M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/787</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[[转] 想作你的code]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/gCEU97wuuM8/780" />
    <updated>2010-03-27T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/780</id>
    <content type="html">&lt;p&gt;虽然我很少转帖，但是看完这段视频，直觉非转不可！&lt;/p&gt;
&lt;p&gt;听闻这是Microsoft的公关广告，一向对M$无爱的我，也不得不说，这段视频会让单身的程序员看着心痒，比如我～～～&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;embed src="http://player.youku.com/player.php/sid/XMTYwMjk0ODA0/v.swf" quality="high" width="480" height="400" align="middle" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YNRntyFuOlzA0G0_EGSvZfXfvVk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YNRntyFuOlzA0G0_EGSvZfXfvVk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YNRntyFuOlzA0G0_EGSvZfXfvVk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YNRntyFuOlzA0G0_EGSvZfXfvVk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/780</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Shanghaionrails 第七次线下活动后记]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/8uy1g5JLdhY/774" />
    <updated>2010-03-27T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/774</id>
    <content type="html">&lt;p&gt;Shanghaionrails第七次线下活动于3月20日，也就是上周六如期成功举行。&lt;/p&gt;
&lt;p&gt;这周二才拿到会议照片（感谢Terry拍照），加上本周工作非常繁忙，一直到现在才有空闲记录一下活动后记，因为想要记录下来的东西很多，所以我打算写两篇，第一篇主要记录一下整场活动，下一篇我会着重介绍一下活动的筹备过程，花絮，特别剪辑以及导演评论音轨等&amp;#8230;&lt;/p&gt;
&lt;p&gt;这次活动跟往期活动不同，这次活动我们没有去租用昂贵的专业会议室，而是把活动场地安排在了&lt;a href="http://www.5173.com"&gt;5173&lt;/a&gt;公司的一楼咖啡厅，这里我想特别感谢为我联系活动场地的dlee，以及&lt;a href="http://www.5173.com"&gt;5173&lt;/a&gt;方的负责人尚贤琨和段萌，还有&lt;a href="http://www.5173.com"&gt;5173&lt;/a&gt;对这次活动的大力支持。&lt;/p&gt;
&lt;p&gt;Shanghaionrails技术社区风风雨雨已经走过了两年半，自己也是从社区一步一步成长起来的，这次活动对我来说也有特别的意义。因为另外两个社区创世人元一和Stephen忙于自己的事业，这次活动的筹划落到我一个人身上，所以我最大的心愿就是一切都能顺利，能带给大家一次记忆深刻的活动。后来活动结束后，我收到了来自很多朋友的好评，感谢，鼓励的消息，非常欣慰。为什么大家认为这次活动很成功，我认为有下面几点：&lt;/p&gt;

		&lt;ol&gt;
			&lt;li&gt;场地好&lt;br /&gt;
&lt;p&gt;这次活动的场地非常赞，筹备阶段5173的段萌就不停问我，还有什么不满意的地方，以及需要改进的地方，你跟我说，我帮你想办法，我回复到没有什么不满意的地方，其实心里却在想，这可是shanghaionrails线下会议有史以来场地最棒的第一次！&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4456958043/" title="IMG_1637 by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4055/4456958043_123936cd41.jpg" width="500" height="333" alt="IMG_1637" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
			&lt;li&gt;参与人数多&lt;br /&gt;
&lt;p&gt;我统计了一下，这次活动有超过70人参加，超过了我开始的预计，40～50人规模。远的有来自杭州，无锡，南京的朋友，更有来自成都专程坐飞机过来的Terry，不过最远的要数来自美国的Vinnie，呵呵。中间大概三分之一的人以前参与过我们的线下活动，其他的都是新朋友，这意味着社区的规模在不断发展，不断壮大，欣喜。&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4456956311/" title="IMG_1622 by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4069/4456956311_7e1dd84af5.jpg" width="500" height="333" alt="IMG_1622" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;来自USA，Factual的Vinnie&lt;/p&gt;&lt;/li&gt;
			&lt;li&gt;主题演讲好：&lt;br /&gt;
&lt;p&gt;这次演讲的主题是经过精心安排，质量很高，四个演讲全部来自一线Rails公司，特约演讲嘉宾全部是项目一线的资深程序员，因为身处项目中，自然有东西讲出来，含金量自然非常足啦。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;第一个演讲来自&lt;a href="http://www.factual.com"&gt;Factual&lt;/a&gt;，主题是JS2以及JSAPI。Factual是我的前雇主，所以我敢说自己对Factual的技术有一定的理解。Factual是一家成立于美国硅谷的技术创新公司，致力于开发下一代互联网底层数据服务平台，在技术上，Factual有自己非常独到之处，而且有非常宏大的前景。演讲分为上下两个部分，分别由我的好友加前同事Leon和吴江带给大家。Leon的演讲从JS2对JavaScript的语法特性扩展开始，深入解释了JS2的运行机制，这里的JS2，是Factual为了解决JavaScript在繁复的前端开发时效率低下，自行开发出的一套语言，编程框架，JS2是集Ruby，Perl，JQuery，Haml等等流行语言，框架的优点于一身，帮助程序员快速高效的编写JavaScript应用，具体细节可以看这里&lt;a href="http://code.google.com/p/js2lang/"&gt;http://code.google.com/p/js2lang/&lt;/a&gt;，Leon的演讲引出了下半场Wujiang的主题：JSAPI，吴江解释了Factual的核心数据服务理念，并向大家演示了基于Factual的JSAPI如何能简单，快速的创建可高度定制的在线widget，以及如何跟强大的后台数据服务层交互，同时也展示了Factual基于JS2开发的一系列非常Cool，非常炫的东西。Leon和WuJiang的演讲引起了大家对JS2和Factual的极大兴趣。（这里我很想插一句，这次Factual仅仅介绍了JS2对JS的扩展，他们没有介绍的，还有一整套基于MVC的前端开发框架，以及完整的开发方法学，还有Factual后端的核心并极具野心的数据服务，不过没有关系，期待他们下次给大家带来更精彩的演讲）&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;演讲PPT连接：&lt;a href="http://www.slideshare.net/jiang.wu/js2"&gt;http://www.slideshare.net/jiang.wu/js2&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4456958801/" title="IMG_1644 by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4060/4456958801_d24f382008.jpg" width="500" height="333" alt="IMG_1644" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;来自Factual的Leon&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4456958973/" title="IMG_1647 by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4032/4456958973_e4796b6c5e.jpg" width="333" height="500" alt="IMG_1647" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;来自Factual的WuJiang&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;第二个演讲来自南京赛威，主题是&amp;quot;When &lt;span class="caps"&gt;ERP&lt;/span&gt; fell in love with rails&amp;quot;，演讲者是Jason。Jason的演讲风格非常幽默风趣，他们是最早，也是一直坚持作Ruby&amp;amp;Rails培训的一家公司，这次演讲源自他们马上就要上线的一个ERP开发项目，Jason的演讲不是那种一开始就深入技术底层细节，而是就Rails的ERP和企业开发的宏观层面，大局观着眼。最先上来就给我们揭示了成功项目开发的真谛，就是如何跟客户“调情”。这里的调情其实就是指如何跟客户沟通，掌握一定的沟通技巧是项目成功的关键，Rails开发过程最适合引入敏捷开发方法学，而敏捷开发中最最关键的其实就是沟通。之后，Jason给大家介绍了基于Rails的开发中如何划分项目工时，如何将任务目标细分，比如按照日，甚至到细分小时，如果解决时间安排中的各种冲突问题，如何培养和凝聚团队士气，并捎带介绍了一下他们在ERP开发中运用的工作流管理技术，大家一致认为Jason的演讲最好玩，并富有创意。&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4456959485/" title="IMG_1653 by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4052/4456959485_5de8d60be2.jpg" width="500" height="333" alt="IMG_1653" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;来自南京赛威的Jason&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;第三个演讲是来自&lt;a href="http://www.intridea.com"&gt;Intridea&lt;/a&gt;的叶玎玎，带给大家的是“NoSQL: Re-think about the world”，玎玎来自杭州，是intridea的资深程序员，我最近加入了intridea公司，也是基于这个缘由，我特意争取到了玎玎来作这次演讲。NoSQL是最近技术社区的热点，玎玎在这个领域有研究非常深入，但是这次玎玎给大家介绍的，并不是“不SQL”，而是Not Only SQL。玎玎给大家揭示了传统SQL在面对大规模应用时的一些问题，缺点，引出了NoSQL的解决方案，并详细介绍了现在开源Schemaless的数据库的分类，流派，发展趋势和在具体场景下，我们应该怎么选择开源的SchemaLess数据库，并介绍了数据库选型策略，即CAP原理。最后玎玎用Twitter作为真实的例子来给大家解释说明。玎玎的演讲，让大家对NoSQL产生了极大的兴趣，NoSQL也成了会议之后QA环节上被问及最多的主题。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;演讲PPT连接：&lt;a href="http://www.slideshare.net/sishen/no-sql-introduction"&gt;http://www.slideshare.net/sishen/no-sql-introduction&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4456961251/" title="IMG_1687 by lgn21st, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2699/4456961251_3517f7050c.jpg" width="333" height="500" alt="IMG_1687" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;来自Intridea的叶玎玎&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;最后一个演讲是来自Ekohe的Richard，主题是“Static code analysis for ruby”。在介绍Richard时，我就提到，听演讲有三种态度，第一种是听了跟没有听一样，第二种是听了以后感觉这些自己都知道，所以感觉无所谓，嗯，至少你算是听了。第三种是听完后认真思考，并有所行动。第三种我最推崇，也最为佩服。Richard就是第三种人，他的演讲主题基于自己开发的一个ruby插件“rails_best_practices”，而这个插件的灵感，正是来自于去年10月份在首届kungfurails大会上，台湾的张文钿给大家带来的同名演讲。Richard的演讲前半部分把Ruby的静态语法分析原理解释的浅显易懂，并用非常直观的方式为大家演示了基于抽象语法树的静态语法分析技术。演讲后半段则是就具体rails最佳实践跟大家互动，Richard在介绍每个最佳实践前，会先行问大家，如果是你，你会怎么作？然后Richard在给大家揭示答案，每一轮下来，总能引起在场很多人的会心一笑，并博得阵阵掌声。Richard的演讲给我的收获最多。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;演讲PPT连接：&lt;a href="http://www.slideshare.net/flyerhzm/static-code-analysis-for-ruby"&gt;http://www.slideshare.net/flyerhzm/static-code-analysis-for-ruby&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4456961525/" title="IMG_1696 by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4068/4456961525_50c962e095.jpg" width="500" height="333" alt="IMG_1696" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;来自Ekohe的Richard&lt;/p&gt;&lt;/li&gt;
			&lt;li&gt;互动环节好：&lt;br /&gt;
&lt;p&gt;两场演讲之后有个特别环节，就是给每个人一个机会，介绍一下自己，介绍一下自己所从事的工作。这个环节我最喜欢，也特别有意义，因为这个环节之后就是自由活动休息时间，如果你先行介绍了你自己，那么休息间隙，很可能就会有人主动来找你聊天，你也可以去找你感兴趣的人打招呼。这是一个双赢的环节，而且在这个环节中，我认识到了很多原来从来不认识，却一直奋斗在Rails开发一线的朋友。在休息的间隙，5173的朋友特意安排带领大家参观了5173的办公室。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;在四个演讲结束后，开始头脑风暴，我作为主持人，提出很多比较有趣的话题，也让在场所有的朋友提出自己的问题，并且将解答问题的机会也留给了现场的朋友，话题从对之前的四个演讲的QA答疑开始，慢慢引向了Rails的发展新动向，Rails3等话题，现场讨论非常热烈。其中我印象最深的是如何吸引学生朋友投入Rails阵营，如何招聘，招聘大学毕业生的利弊，还有对Ruby语言的质疑，以及对社区发展的建议等等，我也顺便提出了自己对社区发展的愿景。在今年10月份，我们将迎来shanghaionrails的三周年庆典，届时我们一定要作的比现在更好，所以我需要社区的每个人的支持！原计划最晚不超过5点就结束的活动，因为讨论积极热烈，直到5点半才结束，之后大家集体合影留念。&lt;/p&gt;&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4456962639/" title="IMG_1713 by lgn21st, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2794/4456962639_cf6bf3b028.jpg" width="500" height="333" alt="IMG_1713" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
			&lt;li&gt;意义深远&lt;br /&gt;
&lt;p&gt;这次活动无疑非常成功，我不敢说我们的shanghaionrails社区组织已经跻身于一流的技术社区，相反，我们还差的很远很远。但是我们摆脱了相比Java，.Net等成熟社区，Rails社区总是徘徊在二流社区的形象，我们近乎成为上海的开源社区活动的马达，把开源社区的爱好者的心联系到了一起。关于这次活动的前前后后还有一些值得书写记录的东西，我留待下篇继续 :-P&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;更多活动照片，请访问这里：&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/35439352@N04/sets/72157623554042647/"&gt;http://www.flickr.com/photos/35439352@N04/sets/72157623554042647/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
		&lt;/ol&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1wPccXTBxPDMWR6bmtYhkZZwKvc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1wPccXTBxPDMWR6bmtYhkZZwKvc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1wPccXTBxPDMWR6bmtYhkZZwKvc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1wPccXTBxPDMWR6bmtYhkZZwKvc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/774</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Shanghai on Rails 3/20号活动通告]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/Y-hvqAS_kd4/769" />
    <updated>2010-03-13T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/769</id>
    <content type="html">&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4429290538/" title="20100311-np5hbac2ec5t3dadeu7kk3xm7b by lgn21st, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4011/4429290538_052720c71b.jpg" width="500" height="173" alt="20100311-np5hbac2ec5t3dadeu7kk3xm7b" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;【时间】: 3月20号 下午1:00&lt;/p&gt;
&lt;p&gt;【地点】: 普陀区云岭东路599弄汇银铭尊20号一楼咖啡厅（光复西路与丹巴路路口）&lt;/p&gt;
&lt;p&gt;【交通】&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;地铁：2号线威宁路站下，4号口出，沿威宁路步行通过泸定路桥，到光复西路。&lt;/li&gt;
  &lt;li&gt;公交：推荐使用谷歌地图搜寻乘车路线。（&lt;a href="http://ditu.google.com"&gt;ditu.google.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/35439352@N04/4429290694/" title="20100311-cj5kpkj628k37r184htwhx9gbc by lgn21st, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2803/4429290694_6108508985.jpg" width="500" height="416" alt="20100311-cj5kpkj628k37r184htwhx9gbc" /&gt;&lt;/a&gt;&lt;/p&gt;

		&lt;ol&gt;
			&lt;li&gt;活动演讲者及主题&lt;strong&gt;Jeff Su&lt;br /&gt;&lt;/strong&gt;&lt;span class="caps"&gt;CTO&lt;/span&gt; Factual.com&lt;br /&gt;
演讲主题: JS2应用&lt;/li&gt;
		&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Jason Chen&lt;/strong&gt;&lt;br /&gt;
架构师 南京赛威&lt;br /&gt;
演讲主题：When &lt;span class="caps"&gt;ERP&lt;/span&gt; fell in love with rails&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;叶玎玎&lt;/strong&gt;&lt;br /&gt;
架构师 Intridea.com&lt;br /&gt;
演讲主题: NoSQL: Re-think about the world&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Richard Huang&lt;/strong&gt;&lt;br /&gt;
架构师 Ekohe.com&lt;br /&gt;
演讲主题: Static code analysis for ruby&lt;/p&gt;

		&lt;ol&gt;
			&lt;li&gt;报名方式&lt;br /&gt;
&lt;p&gt;不设报名环节，到时候您人过来就可以了，free style!&lt;br /&gt;
&lt;b&gt;注意&lt;/b&gt;: 40人场地，座位先到先坐，迟了就没了，不设贵宾席！！！&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
P.S.&lt;br /&gt;
另外，会议还增设一个自由讨论环节，将由主持人（就是我 :-P）来引领大家来一次2009年Rails发展点评，2010年Rails得展望以及Rails3前瞻，Rails社区得发展等方面得自由讨论/头脑风暴环节。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;现在每个演讲嘉宾已经确定，各项组织筹备，推广活动已经开始，请大家奔走相告，说给身边作Rails得人，对Rails有兴趣得人，我们3月20日不见不散！&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://groups.google.com/group/shanghaionrails?hl=en"&gt;Shanghaionrails&lt;/a&gt; 线下活动每个季度举办一次，去年成功举办了一次线下活动以及两次大型活动（首届RubyChina conf以及首届KungfuRails China），杭州两次线下活动。&lt;a href="http://groups.google.com/group/shanghaionrails?hl=en"&gt;Shanghaionrails&lt;/a&gt;是个小圈子，我们就是这样一种活动组织，定期聚会碰头，交流心得&amp;#8230; 我已经等不及了，你还等什么？&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;-&lt;span class="caps"&gt;EOF&lt;/span&gt;-&lt;/p&gt;&lt;/li&gt;
		&lt;/ol&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0JQM_sXZZqdgDckL1rCgYhIzGKw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0JQM_sXZZqdgDckL1rCgYhIzGKw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0JQM_sXZZqdgDckL1rCgYhIzGKw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0JQM_sXZZqdgDckL1rCgYhIzGKw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/769</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[情人节的第二天]]></title>
    <link href="http://feedproxy.google.com/~r/lvguoning/~3/oiSp5R90zB4/761" />
    <updated>2010-02-16T00:00:00+08:00</updated>
    <id>http://lgn21st.github.com/blogs/761</id>
    <content type="html">&lt;p&gt;这个标题是一次“标题党”行为，而且不是第一次了，我在去年的今天发过&lt;a href="http://www.lvguoning.com/blog/2009/02/15/%E6%83%85%E4%BA%BA%E8%8A%82%E7%9A%84%E7%AC%AC%E4%BA%8C%E5%A4%A9/"&gt;一篇同名博文&lt;/a&gt;，因为这一天就是我的&lt;b&gt;生日&lt;/b&gt;呀，每年只有一次，所以标题党一次又如何?&lt;/p&gt;
&lt;p&gt;跟去年有所不同，今年的春节跟情人节＋生日扎堆赶在一起了，所以是跟家人在一起过的。在家就是幸福啊，有父母照顾起居饮食，早上吃长寿面，中午吃蛋糕海鲜，晚上继续大餐，一整天都赖在家里哪也不想去。以前在上海，每每一到节日就感觉到寂落，其实心若是没有栖息的地方，到哪里都是在流浪。&lt;/p&gt;
&lt;p&gt;去年生日那天，自己送给自己一个iTouch，信誓旦旦得要开始作iPhone/Cocoa开发，结果不到一个月得iTouch给&lt;a href="http://www.lvguoning.com/blog/2009/04/13/%E7%BC%85%E6%80%80%E6%88%91%E7%9A%84itouch/"&gt;弄丢了&lt;/a&gt;。后来自己又买了个更好得iTouch，但确没有成为iPhone/Cocoa开发人员，这个愿望留待今年完成。至于礼物，我希望是&lt;a href="http://www.apple.com/ipad/"&gt;iPad&lt;/a&gt;，iPad还有个把月才能上市，不过我已经把他从我的Wish list中拿了出来并丢进Todo List中了，就必须在第一时间去抢购一个。&lt;/p&gt;
&lt;p&gt;iPad并不完美，但是于我却已足够。原本打算写点iPad发布后的感受，顺便总结一下最近看过得各方观点，不过我发现聪明人这么多，大家都总结的很好了，已经勿需我在多言。不就是&lt;a href="http://www.apple.com"&gt;Apple&lt;/a&gt;又一个野心勃勃，势必取得极大成功的电子消费品嘛，在成为开发者之前，我现在YY的是如何做一个iPad的优秀消费者，比如养成这样的习惯：每天抽出两个小时，把自己喜欢但是没有时间看得文章，同步到iPad上，然后出门去散散步，找个寂静得角落，细细品读，伴着一杯香茗或一杯拿铁在手～～～&lt;/p&gt;
&lt;p&gt;去年还在感叹没有情人的苦恼，这个话题现在都懒得提了，我看我就是无可救药了，也就这幅德性了，就顺其自然吧。&lt;/p&gt;
&lt;p&gt;这个节日略带一点点遗憾，这个节日来得不算轻松。今年回家得旅程绝对是挑战，飞机票非常不划算，火车票从来就很难搞，于是我选择了坐汽车。原本9个小时就可以从上海到青岛，却足足跑了22个小时，这个冬天很冷，苏北到山东高速公路全部被冰封。汽车在如皋地界直接被堵8个多小时，疏通后也只能缓慢前行，苦不堪言，所幸还是安全到家了，以后能不坐汽车就再也不坐汽车了。&lt;/p&gt;
&lt;p&gt;在踏上归程那天得一整个下午，我有幸结识了两位来自&lt;a href="http://www.lanoo.cc/"&gt;蓝弩&lt;/a&gt;得朋友，翟鹏霄和马维达。蓝弩是一家专注心理学，哲学和经济为主的高端小众阅读主题的微博网站。两位正是是蓝弩得创始人，翟鹏霄在文学，哲学，心理学方面知识非常丰富，而维达除了极高得文学素养之外，更是一个资深得C++/Python专家。也许你不知道，那本Pragmatic有名的《程序员修炼之道——从小工到专家》的译者，正是马维达先生。跟他们畅谈阅读，文学，哲学，电影，文化等等主题，获益匪浅，而且认识新朋友总是开心的事情。得知他们定期在上海季风书店徐汇店举办各种文化主题活动，心痒，一定会去参加。&lt;/p&gt;
&lt;p&gt;在归程前一天，我结束了&lt;a href="http://www.factual.com/"&gt;Factual.com&lt;/a&gt;得试用期，并正式离开了这家公司。在Factual得三个月，我经历了太多，收获也太多，做出离开这个决定，对我来说是一个非常非常艰难得选择。Factual拥有非常（远超我想象）得前景，而且进Factual之前，我跟两个在Factual供职得员工私交甚厚，等我离开时，每一个人都成了我得好友。关于去留的得失，就留待以后去评价吧，这里我只想说一点感悟。跟同事们相处非常愉快，这种愉快不仅仅体现在工作中，还包括一起吃饭的时候，一起玩桌游《三国杀》的时候，总之一切都是那么开心。一提到《三国杀》我的话题就收不住了，三国杀在公司已经成为一个无人不玩，无人不为之疯狂的游戏了。而且在我离开的最后一天，破例中午连玩两盘，第二盘时Henry因为私事上午请假，在中午时分特地赶过来陪我玩。下午下班，在跟每个人握手，拥抱，表达离职感言之前，大家仍然是以一盘精彩得三国杀为我送行。&lt;/p&gt;
&lt;p&gt;一直以为，大家一起喝一顿酒，就能够彼此看出对方得真性情。但是我发现，一起玩三国杀也可以达到同样得效果，而且更健康。三国杀中得我，表现出什么样得性情呢？我自己说了不算，大家说了才算。通常三国杀最开始几轮，大家彼此相互试探，谁是忠臣，谁是奸臣，谁是内奸，奸臣距离主公有多远等等&amp;#8230; 最近几周下来玩下来，大家一致形成了这么一个观念，就是先攻击我，因为如果早早把我干掉，那么剩下得局势将会相当得明朗&amp;#8230; 555&amp;#8230; 游戏中我隐藏得极深，不到最后被干掉，很可能你永远猜不到我到底扮演什么角色。而且我相当不安分，从来不按照牌理出牌，这可给大家造成了很多困惑，所以大家才会有这样得想法，哈哈哈。其实自己得心境，在游戏中已经可见一斑，哪是一颗不安分得心。用郑伊健的《友情岁月》中得一段歌词来诠释我的离别吧：“来忘掉错对，来怀念过去，曾共赴患难日子总有乐趣&amp;#8230; 风吹过以静下，将心意在还谁？”&lt;/p&gt;
&lt;p&gt;谢谢Vinnie，Forrest，Zoey，WuJiang，Henry，HongHao，Leon，Richard，Maverick，还有阿姨（排名不分先后），谢谢你们。&lt;/p&gt;
&lt;p&gt;每次工作变迁，都是又一次将自己置于职业发展的一个低谷，不过我总能够直面面对，总能一步一步走出来，并慢慢走高。职业发展起起落落，并非总是一无所获，至少我能够从各种角度观察自己得生活。一路走下来，自己得事业线过山车一般，起落之间带给我那么多回味，乐趣，早已不会再因为低谷而使自己心情低落，因为那是下一个高峰得起点。此时此刻，重要得不是我是否应该向前迈出一步，而是迈出这一步后，用什么样得态度继续往前走。重要得不是避免进入下一个低谷，而是在这个起起落落得过程中，学会了什么，总结到了什么，以及在经历过这么多，是否看自己更加清楚，是否有了自己的眼光，并对未来充满期待。我相信自己已经知道什么对自己才是重要，继续作自己能作的，我相信事业线向后是继续走高。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/45jbbOCOxdEYdLhEBTk8vJZabsA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/45jbbOCOxdEYdLhEBTk8vJZabsA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/45jbbOCOxdEYdLhEBTk8vJZabsA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/45jbbOCOxdEYdLhEBTk8vJZabsA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content>
  <feedburner:origLink>http://lgn21st.github.com/blogs/761</feedburner:origLink></entry>
  
</feed>

