<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>zealinux (zealinux)</title>
    <link>https://ruby-china.org/zealinux</link>
    <description>不走捷径</description>
    <language>en-us</language>
    <item>
      <title>数据库列名与 Rails 方法名冲突怎么解决？</title>
      <description>&lt;p&gt;数据库表字段名有：attribute，save，或者 type 等其他保留名（Rails/Ruby 里的方法名），&lt;/p&gt;

&lt;p&gt;最简单的&lt;code&gt;ActiveModel.first&lt;/code&gt; 就会出错，提示：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ActiveRecord::DangerousAttributeError
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在数据库不能变动，Rails 里该怎么解决？&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Fri, 05 Mar 2021 18:16:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/40999</link>
      <guid>https://ruby-china.org/topics/40999</guid>
    </item>
    <item>
      <title>Rake Task 如何做到断点重试？</title>
      <description>&lt;p&gt;Rake Task 一个很大的列表对元素进行相应处理，
（查数据库，http 请求，组装数据等，更新数据库等）&lt;/p&gt;

&lt;p&gt;现在有个问题，如果这个任务断了，怎么下次执行的时候从断点进行执行？
有没有好的方法？或者相应的插件/库？&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;暂时想到的方法是：&lt;/p&gt;

&lt;p&gt;先把这个列表写进一个文件 F，
然后执行完一个，就从顶部删除该元素行。&lt;/p&gt;

&lt;p&gt;下次执行的时候先检查这个文件。
如果有就从这个文件读取列表。&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Tue, 27 Aug 2019 16:23:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/38983</link>
      <guid>https://ruby-china.org/topics/38983</guid>
    </item>
    <item>
      <title>由于在数据库表中有`model_name`，导致 ActiveRecord::Relation 以及方法全都不可用</title>
      <description>&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ActiveRecord::DangerousAttributeError 
  (model_name is defined by Active Record. 
    Check to make sure that you don't have an attribute or method with the same name.)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数据库表中有 &lt;code&gt;model_name&lt;/code&gt;
(不是 Rails 建的，是原有的表)&lt;/p&gt;

&lt;p&gt;但是想用 Rails 写了项目（主要是用来迁移数据）&lt;/p&gt;

&lt;p&gt;但是遇到这个问题有点头疼。暂时没有找到方法解决。&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Mon, 24 Jun 2019 15:23:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/38729</link>
      <guid>https://ruby-china.org/topics/38729</guid>
    </item>
    <item>
      <title>现在 Rails 大家一般用是来生成接口 spec (比如 swagger-ui)?</title>
      <description>&lt;p&gt;如题，&lt;/p&gt;

&lt;p&gt;找了一圈，没发现有什么好工具（+低代码量）生成 swagger-ui 页面。&lt;/p&gt;

&lt;p&gt;感觉这方面社区不受重视还是什么其他原因？&lt;/p&gt;

&lt;p&gt;大家的 API 文档是用 swagger 吗？还是有更好的 API spec？&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Thu, 20 Jun 2019 10:02:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/38698</link>
      <guid>https://ruby-china.org/topics/38698</guid>
    </item>
    <item>
      <title>想在 Rails 服务器启动后 load 进一部分的数据库数据</title>
      <description>&lt;p&gt;问题是这样的：&lt;/p&gt;

&lt;p&gt;有一大块数据是需要在服务启动的时候就 load 进来的，
这样在之后的地方就能够直接使用起来。&lt;/p&gt;

&lt;p&gt;======&lt;/p&gt;

&lt;p&gt;想象中的代码：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;optional: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;

  &lt;span class="vc"&gt;@@preload_data&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
   &lt;span class="no"&gt;B&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_a&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preload_data&lt;/span&gt;
    &lt;span class="vc"&gt;@@preload_data&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preload_data&lt;/span&gt;  &lt;span class="c1"&gt;# 服务起来后，这句还是会去查数据库&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zealinux</author>
      <pubDate>Mon, 09 Apr 2018 17:30:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/35410</link>
      <guid>https://ruby-china.org/topics/35410</guid>
    </item>
    <item>
      <title>对于 Rails 的 QPS 疑问</title>
      <description>&lt;p&gt;假设单台机器 16core, 单次请求 1s，
是不是代表着服务器的最大 QPS 是 16？&lt;/p&gt;

&lt;p&gt;（puma + MRI）&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Fri, 29 Dec 2017 09:34:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/34790</link>
      <guid>https://ruby-china.org/topics/34790</guid>
    </item>
    <item>
      <title>Rails 服务器端代码怎么封装给客户用？</title>
      <description>&lt;p&gt;服务器端代码（Rails）部署到客户的机器（局域网）上去&lt;/p&gt;

&lt;p&gt;如何才能实现：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;客户不能直接看到源代码，或不能容易反编译&lt;/li&gt;
&lt;li&gt;客户不能将服务进行二次转卖&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;另外除了&lt;code&gt;Rails&lt;/code&gt;还有其他服务（Python/Flask，Java/Spring）也需要封装&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Mon, 11 Dec 2017 14:51:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/34689</link>
      <guid>https://ruby-china.org/topics/34689</guid>
    </item>
    <item>
      <title>Rails 并发发送请求问题请教</title>
      <description>&lt;p&gt;场景是这样的：&lt;/p&gt;

&lt;p&gt;action 里需要发送两个请求外部的服务，然后把两次结果组装起来返回。&lt;/p&gt;

&lt;p&gt;现在是顺序进行访问的，
其实这两个服务其实是可以并行访问，&lt;/p&gt;

&lt;p&gt;这样 action 请求时间会节省到 其中一个最长的那次请求响应时间。&lt;/p&gt;

&lt;p&gt;现在应该怎么处理？&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;server：puma
http client: faraday&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Wed, 29 Nov 2017 11:14:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/34650</link>
      <guid>https://ruby-china.org/topics/34650</guid>
    </item>
    <item>
      <title>Redmine 源代码中的 application.js 找不到</title>
      <description>&lt;p&gt;看了最新的 Redmine layout 里有用到，&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;javascript_include_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'jquery-1.11.1-ui-1.11.0-ujs-3.1.4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'application'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'responsive'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是通篇都没有找到 &lt;code&gt;application.js&lt;/code&gt; 文件，
(除了没有 application.js, 也没有其他任何 js 文件，有点怪)&lt;/p&gt;

&lt;p&gt;各位研究过 redmine 代码的同学，帮忙解惑&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Wed, 13 Apr 2016 10:29:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/29688</link>
      <guid>https://ruby-china.org/topics/29688</guid>
    </item>
    <item>
      <title>感谢一个人，同时有几点收获</title>
      <description>&lt;p&gt;事情是这样子的：&lt;/p&gt;

&lt;p&gt;上次回家，南京转车，我在南京面了一次试。
邮箱发简历过去，立刻就回了，说缺人。我说晚上办完事情有机会碰过面。
那天下午去了南京，有事之后，就已经晚上七点钟了。
然后乘地铁过去花了半个小时，也许由于之前没有沟通好，&lt;strong&gt;他可能在公司一直等着我。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;确实时间太赶，也不知道最后一班城铁什么时候，估计见不了面了。
电话沟通后，他说&lt;strong&gt;他赶过来和我在火车站见面&lt;/strong&gt;。这点让我十分感动。&lt;/p&gt;

&lt;p&gt;后来，在面试地点在安静的麦当劳。他吃着汉堡（那时他等我&lt;strong&gt;还没吃晚饭&lt;/strong&gt;），
手拿着草稿本，就问了我几个问题，我答得不是太好。
九点毕，if delay &amp;gt; 60s，就真赶不上那最后一班的火车了。&lt;/p&gt;

&lt;p&gt;不过我感觉和他还挺投缘的；
得知很多东西，他师傅带出来的。&lt;/p&gt;

&lt;p&gt;之后得到的收获如下：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruby China 的人都很友善。（十分感谢俺们论坛的缔造者。）&lt;/li&gt;
&lt;li&gt;找个好师傅对技术提升比纯粹自学要有效果得多。&lt;/li&gt;
&lt;li&gt;Ruby 语法必须要烂熟于胸，这个看书不如读代码。&lt;/li&gt;
&lt;li&gt;一些技术东西，要追求“知其然知其所以然”，纯粹拿来用主义会害了自己。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;收获之后的做法（对于我）：
1 多参加活动，2 拜师傅，3 读代码，4 多自问，深思考&lt;/p&gt;

&lt;p&gt;对了，他是 &lt;a href="/iamzhangdabei" class="user-mention" title="@iamzhangdabei"&gt;&lt;i&gt;@&lt;/i&gt;iamzhangdabei&lt;/a&gt;，感谢。
如果以后有幸能在南京落地，我应该能在技术聚会上再次遇到他吧。&lt;/p&gt;

&lt;p&gt;-- 就不穿马甲了&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Sat, 10 May 2014 23:02:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/19157</link>
      <guid>https://ruby-china.org/topics/19157</guid>
    </item>
    <item>
      <title>[友情提醒] 近期已经开始地铁和火车站安检变严，任何小刀都通不过</title>
      <description>&lt;p&gt;杭州地铁安检，现在特别严厉。
我的“多功能刀”都不让过。
看了一下被没收的有：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;瑞士军刀，
美工刀，
水果刀，
小学生用的小剪刀，
还有套在手自卫的钢圈
...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;听地铁安检的说，就算放你过去，火车站安检也通不过。
（如果有管制刀具，那就直接拘留了。）
小伙伴们，请注意安全了，防止踩雷。&lt;/p&gt;

&lt;p&gt;其他城市不知道怎么样了~&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Mon, 10 Mar 2014 00:07:47 +0800</pubDate>
      <link>https://ruby-china.org/topics/17769</link>
      <guid>https://ruby-china.org/topics/17769</guid>
    </item>
    <item>
      <title>看到一个视频，关于土地，房产经济。</title>
      <description>&lt;p&gt;&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.youku.com/embed/XNjgxNzIxNjgw_ev_4" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;
明恩乌托邦：谁让我们成了无产阶级&lt;/p&gt;

&lt;p&gt;看后陷入深深地思考~&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Sat, 08 Mar 2014 14:11:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/17740</link>
      <guid>https://ruby-china.org/topics/17740</guid>
    </item>
    <item>
      <title>转载王垠的一篇博客 - 我和权威的故事</title>
      <description>&lt;p&gt;来源 &lt;a href="http://www.yinwang.org/blog-cn/2014/01/04/authority/" rel="nofollow" target="_blank"&gt;http://www.yinwang.org/blog-cn/2014/01/04/authority/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="我和权威的故事"&gt;我和权威的故事&lt;/h2&gt;
&lt;p&gt;每个人小时候心里都是没有权威的，就像每个人小时候也都不相信广告一样。可是权威就像广告，你听一遍不信，听两遍不信，……，直到一千遍的时候，它忽然开始起作用了，而且这作用越来越强。&lt;/p&gt;

&lt;p&gt;消灭广告所造成的幻觉，最好的办法就是去尝试，去实地的考察它。有些虚幻的东西只要你第一次尝试就会像肥皂泡一样破灭掉。可是如果你不主动去接触它，它就会一直在你脑海里造成一种美好神圣的假象。很神奇的一个现象就是，权威对人思想的作用其实也跟广告一样。&lt;/p&gt;

&lt;p&gt;上大学以前的人因为没有专业，所以还不怎么崇拜权威，大不了追追歌星，影星，球星啥的。而进入大学之后，就会开始对本领域的权威耳濡目染。一遍，两遍，一千遍的听到同学们仰慕某“牛人”或者“大师”的名字，虽然从来没亲身见过，不知不觉就对这人产生了崇拜心理。Donald Knuth, Dennis Ritchie, Ken Thompson, Rob Pike, ... 就是通过这些途径成为了很多计算机学生的权威。以至于几十年以后，他们的一些历史遗留下来的糟糕设计和错误思想还被很多人奉为神圣。&lt;/p&gt;
&lt;h2 id="Donald Knuth"&gt;Donald Knuth&lt;/h2&gt;
&lt;p&gt;很多人（包括我）都曾经对 Knuth 和他的 The Art of Computer Programming (TAOCP) 极度崇拜。在我大学和研究生的时候，有些同学花了不少钱买回精装的 TAOCP 全三卷，说是大概不会看，但要放在书架上做摆设，镇场子。当时我本着“书非借不能读也”的原则，再加上搬家的时候书是最费力气的东西，所以坚决不买书。我就从图书馆把 TAOCP 借了来。说实话我哪里看的下去啊？那里面的程序都是用一个叫 MIX 的处理器的汇编语言写的。一个字节只有 6 位，每位里面可以放一个十进制数（不是二进制）！还没开始写程序呢，就开始讲数学，然后就是几十页的公式推导，证明…… 接着我就睡着了。但我总是听说有人真的看完过 TAOCP，然后就成为了大师。比尔盖茨也宣称：“要是谁看完了 TAOCP，请把简历投给我！”在这一系列的号召和鼓吹之下，我好几次的把 TAOCP 借回来，心想这次一定决心看完这旷世奇书。每次都是雄心勃勃的开始，可从来就没看完过开头那段 MIX 机器语言和数学公式。&lt;/p&gt;

&lt;p&gt;看不懂 TAOCP 总是感觉很失败，因为看不懂 TAOCP 就成不了“大师”，可我仍然认为 Knuth 就是计算机科学的神，总能从他那学点什么吧。所以又开始折腾他的其他作品。这就是为什么我开始用 TeX，并且成为中国 TeX 界的主要“传教士”之一。为了 TeX，我把 Knuth 的 TeXbook 借回来，从头到尾看了两遍，做完所有的习题，包括最难的那种“double bend”习题。接着又开始看 MetaFont。开头还挺有成就感，可是不多久就发现学会的那些 TeX 技巧到了临场的时候就不知道该怎么用，然后就全都忘记了。这就是为什么我把 TeXbook 看了两遍，可是看完第二遍之后不久还是忘记得一干二净。&lt;/p&gt;

&lt;p&gt;师兄师姐看到我用 TeX，说怎么折腾这么过时的玩意儿。我很气愤他们以及国内学术界居然都用 Word 排版论文，然后我就开始针锋相对，写出一系列煽动文章鼓吹 TeX 的种种好处，打击“所见即所得排版”这种低智商玩意儿。这还不够，又开始折腾 Knuth 设计的 MMIX 处理器，并且认为 MMIX 的寄存器环就是世界上最先进的设计。有几次发现一些无关紧要的小错，就给 Knuth 发 email，居然拿到两张传说中的“Knuth 支票”，并且一度引以为豪。当然像所有拿到 Knuth 支票的人一样，你是不会去兑现它的，甚至有人把它们放在相框里作为摆设。我还没那么疯狂，那两张支票一直在它们原来的信封里。多年以后我到美国想兑现那支票的时候，发现它们已经过期了。&lt;/p&gt;

&lt;p&gt;当你心里有了这样的权威，其他人的话你是不可能听得进去的，就算他们其实比你心目中的权威更具智慧也一样。在清华的时候我很喜欢一门叫做“计算几何”的课，就经常跟那门课的老师交流思想。有一次我在 email 里面提到 Donald Knuth 是我的偶像，那位老师很委婉的回复道：“有偶像很好啊，Knuth 也曾经是我的偶像。”我对“曾经”这两个字感到惊讶：难道这意味着 Knuth 现在不是他的偶像了？在我执意的询问之下他才委婉的告诉我，世界上还有很多很聪明的人，Knuth 并不是计算机科学的一切。你应该多看看其他人的作品，特别是一些数学家的。然后他给了我几个他觉得不错的人的名字。&lt;/p&gt;

&lt;p&gt;现在回想起来，这些话对我是有深远作用的。那位老师虽然在系里的“牛人”们眼里是个“研究能力（也就是发 paper 能力）不强”的人，但是他却对我的人生转折有着强有力的作用。他引导了我去追寻自己真正的兴趣，而不是去追寻虚无的名气。我发现很多人都在为着名气而进行一些自己其实不感兴趣的事情，去做一些别人觉得“牛气”的事情。我真希望他们遇到跟我一样的好老师。&lt;/p&gt;

&lt;p&gt;在现在看来，Knuth 的 TAOCP 真的是所谓的“神圣的白象”（white elephant）。很少有人真的看过，却要显得好像看过一样，并且很喜欢。这就让试图看懂它的人更加自卑和着急，甚至觉得自己智商有问题。别人都看过了，我怎么就看不懂呢？其实 TAOCP 里面的大部分算法都不是 Knuth 自己设计的，而且他对别人算法的解释经常把简单的问题搞得很复杂。再加上他执意要用汇编语言，又让程序的理解难度加倍。有一句名言说：“跟真正的大师学习，而不是跟他们的徒弟。”如果你真的要学一个算法，就应该直接去读那算法的发明者的论文，而不是转述过来的“二手知识”。二手的知识往往把发明者原来的动机和思路都给去掉了，只留下苍白无味的“最后结果”。&lt;/p&gt;

&lt;p&gt;TeX 其实也是异常糟糕的设计。它过度的复杂，很少有人搞得懂怎么配置。经常为了一个简单的效果折腾很久，然后不久就忘了当时怎么做的，回头来又得重新折腾。原因就是因为 TeX 的设计没有“一致性”，不可以“compose”，所以你需要学太多东西，而不是学习几个简单的东西，然后把它们组合起来。在程序语言设计者看来，TeX 的语言是世界上最恶劣的设计之一。Knuth 的作品里面有他的贡献和价值，TeX 的排版算法（而不是语言）仍然是不错的东西。可是如果因为这些好东西爱屋及乌，而把他所推崇的那些乱七八糟的设计当成神圣的话，那你自己的设计就逃脱不出同样的思维模式，给用户造成很大的麻烦。仍然对 TeX 顶礼膜拜的人应该看一下 TeXmacs，看看它的作者是如何默默无闻的，彻彻底底的超越了 TeX 和 Knuth。&lt;/p&gt;
&lt;h2 id="Cornell"&gt;Cornell&lt;/h2&gt;
&lt;p&gt;可是权威和名气的威力还是很大的。虽然 Knuth 在我心目中的位置不再处于“垄断地位”，世界上可以占据我心里那个位置的人和事物还很多。在离开清华之后我申请了美国的大学。也许是天意也许是巧合，只有两所大学给了我 offer：Cornell 和 Indiana，而我竟然先后到了这两所大学就读。&lt;/p&gt;

&lt;p&gt;说实话，Indiana 给了我比 Cornell 更好的 offer。Cornell 给我的是一个 TA 的半工读职位，而 Indiana 给我的是一个不需要工作白拿钱的 fellowship。说实话我从来没有搞明白 Cornell 这样的“牛校”怎么会给我这样的人 offer，GPA 一般，paper 很菜，而 Indiana 却是真正在乎我的。Indiana 的 fellowship 来自 GEB 的作者 Doug Hofstadter。他从 email 了解到我的处境和我渴求真知的愿望之后，毅然决定给我，一个素不相识的人写推荐信。后来我才发现，我的 fellowship 的资金也是他提供的。&lt;/p&gt;

&lt;p&gt;可是 Indiana 和 Hofstadter 的名气哪里能跟 Cornell 的号称“CS 前五”相比啊？Indiana 的 offer 晚来了几天。当收到 Indiana 的 offer 时，我已经接受了 Cornell。Hofstadter 很惊讶也很失望，因为他以为我一定会做他的学生，可是听说我接受了 Cornell 的 offer，他也不知道该怎么办。我只隐约的记得他告诉我，学校的排名并不是最重要的东西……&lt;/p&gt;

&lt;p&gt;名气和权威的力量是如此之大，它让我不去选择真正欣赏我并且能给我真知的人。有时候回想起来，我当时真的是在寻找真知吗？我明白什么叫做真知吗？&lt;/p&gt;

&lt;p&gt;Cornell 给了我什么呢？到现在想起来，它给我的东西恐怕只有教训，很多的教训。我在一篇老的博文里面提到过，Cornell 的学生一上课就抄笔记，一天到晚都在赶作业。可其实 Cornell 不只是爱抄笔记的学生的天堂，而且是崇拜权威者的天堂。即使你不是那么的崇拜权威，你不可避免的会被一群像朝圣者一样的人围在中间，在你耳边说某某人多么多么的牛。不管你向同学打听哪一个教授，得到的回答总是：“哇，他很牛的！”然后你就去上了他的几节课，觉得不咋的嘛，可是人家就说那是因为你不理解他的价值。这种气氛我好像在另一个地方感觉到过呢？啊对了，那是在 Google。这样的气氛也许并不是偶然，Cornell 的大部分 PhD 同学当时的最大愿望，就是毕业后能去 Google 工作。当然，后来 Facebook 上升成为了他们的首选。&lt;/p&gt;

&lt;p&gt;Cornell 的研究可以用“与时俱进”来形容，什么热门搞什么。当时 Facebook 和社交网络正在崛起，所以系里最热门的一个教授就是研究社交网络的。我去听过他几堂课，他用最容易的一些图论算法分析一些社交网络数据，然后得出一些“理论”。其中好些结论实在太显然了，我觉得根本不需要数据分析就能猜到，真是不觉得有什么特别的。可是 Facebook 名气之大，跟着这位教授必然有出路啦，再加上有人在耳边煽风点火，所以有好多的学生为做他的 PhD 挤破了头皮，被刷下来的就只好另投门路了。每次新来一个教授都会被吹捧上天，说是多么多么的聪明，甚至称为天才。然后就有一群的人去上他的课，试图做他的学生。结果人家每节课都是背对学生面朝黑板，写下一堆堆的公式和证明，一堂课总共就没回过几次头。还不如干脆打印出来让大家自己回家看。下面的人当然就是狂抄笔记，有的人甚至带着录音笔，生怕漏掉一句话。人多了竞争也就难免了。上课的同学们就开始勾心斗角，三国演义的战术都拿出来了。作业做不出来就来找你讨论，等你想讨论了就说自己也没做出来。没听懂偏要故作点头状，显得听懂了，让你觉得有压力。自己越是喜欢的教授就越是说他不咋的，扯淡，然后就自己去跟他。自己不喜欢的教授就告诉你他真是厉害啊，只可惜人家不要我。怎么感觉就跟皇帝的后宫差不多呢 ;-) 直到两年后我离开 Cornell 之前，还有好些同学因为没找到教授而焦头烂额。因为两年内没有找到导师的 PhD 学生，基本上等于必须退学。&lt;/p&gt;

&lt;p&gt;当我离开 Cornell 之后，有一位国内的学生给我发 email 套磁（从系里主页上找到我的地址），问我 Cornell 情况如何。我告诉他我都已经走人了，并且告诉了他我的感觉，一天到晚抄笔记赶作业之类的。然后又问我一个刚毕业的 PhD 的情况，我说他水平不咋的，博士论文我看过了，很扯淡，解决一个根本不存在的问题。他对我说的话有点惊讶，但还是将信将疑。为了确保万无一失，他在 visiting day 的时候专程去 Cornell 考察了一下。回去又给我 email，说见到好多牛人啊，大开眼界，哪里像你说的那么不堪。还说跟那位 PhD 的导师谈过话，真是世界级的牛人那，他的博士论文也是世界一流的。我就无话可说了，仁者见仁，智者见智，随他去吧，哎。&lt;/p&gt;

&lt;p&gt;结果两年之后，我又收到这位同学的 email，说他在 Cornell 还没找到导师，走投无路了，问我有没有办法转学。&lt;/p&gt;
&lt;h2 id="图灵奖"&gt;图灵奖&lt;/h2&gt;
&lt;p&gt;说到这里应该有人会问这个问题，我是不是也属于那种没找到导师走投无路的人。答案是，对的，我确实没有在 Cornell 找到合适的导师。然后我就猜到有人会说，就知道王垠水平不行嘛，没搞定导师，被迫退学，哈哈！可是事情其实没他们想象的那么简单。作为一个 PhD 学生，不仅必须精通学术，而且要懂得政治和行情。可是由于学生之间的勾心斗角，他们之间的信息互通程度，是没法和教授之间的信息互通程度相比的。这就造成了“学生阶级”在这场信息战上的劣势。&lt;/p&gt;

&lt;p&gt;进入 Cornell 之后我上了一门程序语言的课，就开始对这些东西入迷。可是由于“与时俱进”，Cornell 的研究方向并不是那么平衡的发展的，程序语言领域的专家们早已因为受到忽视而转移阵地，剩下一群用纸和笔做扯淡理论的。说实话，在历史上程序语言方向曾经是 Cornell 的强项，出现了一些很厉害的成果。可是当我在 Cornell 的时候，只剩下两个名不见经传的教员，一个助理教授，一个副教授。其实 Robert Constable 也在那里，可惜的是他做了 dean 之后已经没空理学生了，以至于我两年之后都不知道这个人的存在。我当时也不知道 Cornell 有过这段历史，看不到它的研究重心的移动趋势。我不喜欢那个副教授搞的项目，全是在 Java 上面加上一些函数式语言早就有的功能。可是人家做的热门语言，所以拉得到资金，备受系里亲睐，他的学生们也比较趾高气昂。有一次我跟他的一个学生说了我的一个想法，他说：“你那也能叫研究吗？待会儿我给你看看什么是真正的研究！”其实那只是我的一个微不足道的想法，我也没说那是真正的研究啊，只是随便聊一下而已。我是不可能跟那样的人合作的，所以我就跟那个助理教授做了一点静态分析的项目。当然我们分析的也不是什么好东西，是用 Fortran 写的 MPI 程序。说实话，那个助理教授其实挺有点真知灼见，他有几句话现在仍然在指引我，防止我误入歧途。他也是很谦虚很好的人，可是好人不一定有好报的。后来他没有拿到 tenure 职位，不得不离开 Cornell 加入了工业界，而我就失去了最后一个有可能在程序语言方向做我的导师的人。&lt;/p&gt;

&lt;p&gt;没办法，我就开始探索其它相关领域的教授，比如做数据库的，做系统的，看他们对相关的语言设计是否感兴趣。可惜他们都不感兴趣，而且告诉我程序语言领域太狭窄了。我当时还将信将疑，甚至附和他们的说法，可是现在我断定他们都是一知半解胡说八道。如果他们虚心向程序语言专家请教，现在数据库和操作系统的设计也不会那么垃圾，关系式，SQL，NoSQL，…… 一个比一个扯淡。没有办法，我就开始探索其他的方向，我开始了解图形学和数值分析等东西，进展很不错。可是终究我还是发现，我不喜欢图形学和数值分析所用的语言。我想制造出更好的程序语言来解决这些问题。而教授们也能感觉到你不是真的感兴趣，而且他们貌似不喜欢有不同想法的学生，从而会优先考虑对他的东西更加欣赏的学生。&lt;/p&gt;

&lt;p&gt;这就让我走到了跟那位向我打听 Cornell 情况的同学差不多的局面，真是心里有无限的苦却没有人可以理解。这时候我想到了系里的一些德高望重的教授，比如得过图灵奖的人，也许这些顶级的大牛会给我指出方向。于是我就联系到一位图灵奖得主，说想找他聊聊。我说我感兴趣的东西 Cornell 貌似并不重视和发展。Cornell 的校训是“any person, any study”，而我却找不到我想 study 的东西。最后我谈了一下我对 Cornell 的总体感受。我说我觉得大家上课都是死记硬背，不是很 intellectual，我不是很确定学术界是否还保留有它原来的智慧和对真知的向往。&lt;/p&gt;

&lt;p&gt;我真的是很诚恳的告诉了他这些，只是希望得到一些建议。结果他立马开始用质问的语气问我，你成绩怎么样？考试都通过了没有？哎，说白了就是想搞清楚你是不是成绩不好没人要。怎么就跟高中教导主任一样。于是乎那次谈话就这样不了了之。可是没有想到，这次谈话就造成了我最后的离别。在学生们互相之间勾心斗角，不通信息的同时，系里的教授们其实背后都是“通气”的。他们根本不懂得如何教学，就知道拿作业和考试往学生头上砸，幸存下来的就各自挑去做徒弟，挨不住的就打发掉。这算盘打得真是妙啊。我也不知道他们是什么机制，每个学生对哪些教授感兴趣，他们貌似都了如指掌。然后系里的教授们不知道怎么的，仿佛就都知道有这样一个不知趣的学生，居然敢说学术界的坏话！&lt;/p&gt;

&lt;p&gt;大地震前夕的天空总是异常的美。我竟然在过道里看到那位图灵奖教授对我点头致意并且微笑，以前做 TA 时把我呼来唤去还横竖不满意的教授也对我笑脸相迎。我仿佛觉得，我推心置腹的一席话打动了那位德高望重的教授，再加上在图形学和数值计算的扎实进展，给我的学术生涯带来了转机。可是，我那一次真正的领悟了什么叫做所谓的“笑里藏刀”。&lt;/p&gt;

&lt;p&gt;由于那个学期上的图形学还有矩阵计算的课成绩都不错，我心想应该能找这两个教授其中一个做导师吧。再加上那些貌似友好的笑容…… 所以没想很多，居然过了一个非常快乐的寒假。没有任何前兆，没有任何直接的通知（email，电话），一封纸信不知道是什么时候默默地进到了我在系里的，基本上从来不看的信夹子里，直到下一个学期开始的时候（2 月份）我才发现。信是系主任写的，大概就是说，由于你的表现，我们觉得 Cornell 不是适合你的地方……&lt;/p&gt;

&lt;p&gt;我本来就有想走的意思，可就是喜欢呆在一个地方懒得动。如果你们早一点告诉我这个，我还可以申请转学到其它学校。可是都 2 月份了才收到这样的东西，Cornell 啊 Cornell，你让我现在怎么办？我想我可以说你不仁不义吧？&lt;/p&gt;

&lt;p&gt;在这个走投无路的时候，我想起了曾经关心过我却又很失望的 Hofstadter 教授。我厚着脸皮告诉他我在 Cornell 很不开心，我很后悔没有认真地考虑过 Indiana。我很想研究程序语言，可是 Cornell 不在乎这个领域。他回信说，没有关系，你能找到自己喜欢的东西就应该去追寻它，这次不要再冲着名气做决定好吗。Indiana 的 Dan Friedman 就是做程序语言的，你可以联系他，就说是我介绍你去的。&lt;/p&gt;

&lt;p&gt;于是给 Friedman 发了 email，很快得到了回信说：“王垠，两年前我们都看过你的材料。我们觉得你是一个非常出众的学生。可惜你最后没有选择我们。你要明白，人生最重要的事情不是名利，而是找到你愿意合作的人。你的材料都还在我们这里。现在招生已经快结束了，但是我会把你的材料提交给招生委员会，让他们破例再次考虑你的申请。”我和 Dan Friedman 的故事就从这里开始了。&lt;/p&gt;

&lt;p&gt;##常青藤联盟和“世界一流大学”&lt;/p&gt;

&lt;p&gt;我在 Cornell 的经历应该不是偶然，不是因为我比较特殊。跟我同时进入 Cornell 的博士生有好几个几年后没有拿学位就离开了。其中有一个是非常聪明的少年班，18 岁就读 PhD 了，我根本听不懂的理论课他还能拿 A。可是四年后退学去了 Facebook。有些本科生也告诉我类似的经历，说被系里某些教授“整了”。Cornell 的自杀率居美国大学前列。我走了以后有一次一周之类有三个学生从瀑布旁边的那座桥跳下去。我觉得自己在 Cornell 所感受到的压力确实超乎想象，是有可能把人逼上绝路的。现在回想起来真是可笑，因为对权威和名气的下意识的崇拜，我给了一群根本没有资格来教育我的人向我施加无端压力的权力。&lt;/p&gt;

&lt;p&gt;我应该指出，这种现象应该不是 Cornell 所特有的。我对清华，还有 Princeton，Harvard，MIT，Stanford，Berkeley，CMU 等学校的学生都有了解。这些所谓的“世界一流大学”或者“世界一流大学 wannabee”差不多都是类似的气氛。你冲着它们的名气和“关系网”挤破了头皮进去，然后就每天有人在你耳边对其它某些人感叹：哇，他好牛啊！发了好多 paper，还得了 XX 奖。跟参加传销大会似的，让你感觉个人的价值被完全的忽视。然后就是填鸭式的教育，无止境的作业和考试，让你感觉他们不是在“教育”你，而是在“筛选”你。这种筛选总是筛掉最差的，但也筛掉最好的，因为最好的学生能意识到你在干什么，他们不给你筛选他们的机会。所以剩下来的就是最一般的，循规蹈矩听话的。在这样的环境里，你感觉不到真正的智慧和真知的存在。GRE 考试所鼓吹的什么“批判性思维”（critical thinking）在美国大学里其实是相当缺乏的。学生们只不过是在被培训成为某些其他人的工具，他们具有固定的思维定势，像是一个模子倒出来的。他们不是真正的创造者和开拓者。&lt;/p&gt;

&lt;p&gt;人们在这些大学里的时候都是差不多感受的，可是一旦他们出来了，就会对此绝口不提。自己身上挂着这些学校的镀金牌子，怎么能砸了自己的品牌，长别人的威风？所以每当我批判 Cornell 就有些以前的同学一脸的着急相，好像自己没有吃过那苦头一样。&lt;/p&gt;
&lt;h2 id="再见了，权威们"&gt;再见了，权威们&lt;/h2&gt;
&lt;p&gt;亲爱的同胞们，如果你们觉得有了可以在背后说王垠“被 Cornell 退学”的机会，那么你们就错了。我之所以可以告诉你们这些貌似不可告人的故事，是因为你们可能也会经历这些事情。对权威和名校的崇拜，让你们成为了被“教授阶级”摆布的傀儡和他们在学术战场上的牺牲品。我很幸运的遇到了像 Hofstadter 和 Friedman 这样的好人，而你们也许就没有这么幸运。&lt;/p&gt;

&lt;p&gt;几经颠簸的求学生涯，让我获得了异常强大的力量。我的力量不仅来自于 Friedman，Dybvig 等教授的教诲，而且在于我自己不懈的追求。机会只亲睐有准备的头脑，并不是每个 Friedman 的学生都可以像我一样在一个星期之内解决十多年才完成的研究，完全独立的进行思考。我可以说，这个领域在过去一个世纪的研究很少有逃脱过我的洞察力和直觉的。我看到一个东西一般很快就会知道它到底会不会管用，我经常发现一些被认为很牛的设计其实是在解决根本不存在的问题，而真正的问题却没有得到有效的解决。这些问题很大程度上是历史上权威的阴影造成的，它让人们不敢否认这些大牛作品的价值，不敢抛弃它们，所以他们很多的时间花在了解决历史遗留问题，而不是真正的问题。这就是为什么我的英文 blog 标题叫做“Surely I Am Joking”，因为它记录了我为什么认为一些问题是根本不存在的，或者是人为造成的。&lt;/p&gt;

&lt;p&gt;曾经 Knuth 是我心中唯一的权威。后来我又屈服于 Cornell 和常青藤联盟的权威和名气。我因为图灵的威名而误以为图灵奖得主都是德高望重的前辈。应该说，在 Indiana 的日子里，权威主义的影子也是经常出现的。Indiana 学生们的权威比较特殊一点，不然就是 Dan Friedman，不然就是 Kent Dybvig，不然就是 Tony Hoare 之类的。所以你有时据理力争的时候就会听到人这样跟你辩论：“Kent 说……”不管你说什么，他们都想抬出一个明星来压倒你。我很尊敬 Friedman 和 Dybvig，但我也看到他们的一些思维方式并不是那么的正确，我从来不引用他们的话作为理论依据。我也不喜欢 Indiana 同学这种抬出权威来镇压异议的行为。应该指出的是，权威们自己有时候对这种行为的产生是不知情的。谁能防止你引用我的话去压倒跟你辩论的人呢？所以这很多时候不能归咎于权威自己，而应该归咎于那些盲目崇拜他们的人。对权威的崇拜其实现实了一个人的弱小。如果你有自己的想法和判断就应该可以据理力争，又何必抬出个名人来压制别人呢？&lt;/p&gt;

&lt;p&gt;在一而再再而三的上当受骗之后，我终于把所有的权威们从我的脑子里轰了下去。这些权威包括所有大学的所有教授，所有的图灵奖得主，Unix 和类似操作系统的设计者，所有的程序语言设计者，图灵，他的导师邱奇，他的师兄 Kleene，被程序语言研究者奉为权威的逻辑学家们比如 Per Martin Lof，各大 IT 界“牛公司”，美国国防部，美国宇航局，…… 我现在的实力其实超越了 Cornell 和其他任何“牛校”的教授。我的学识不再接受学术界和任何人的评价。我们完全处于平起平坐的低位。如果你觉得你心目中的超级偶像在我之上的话，请先问问我对他们的博士论文或者图灵奖作品有何评价 :-)&lt;/p&gt;

&lt;p&gt;不再是我心目中的权威并不等于我鄙视他们或者不尊敬他们。他们在我的脑子里失去的只是他们在很多其他人脑子里的那种被膜拜的地位，那种你可以用“XX 人说过……”来压倒理性分析的地位。现在他们在我心目中是一群普通的，有血有肉，有好心肠或者坏心眼的，高傲，谦虚或者虚伪的人。他们设计的东西，好的地方我可以借鉴，但是没有任何人的东西我是不加批判全盘接受的。我深深地知道接受错误的想法的危害性，所以我也希望大家都具有批判的思维，不要盲目的接受我说的话。我不喜欢“大神”或者“牛人”这种称呼。&lt;/p&gt;

&lt;p&gt;最后我希望国内的同学们，不要盲目的崇拜国外的所谓“大师”，“牛校”或者“牛公司”。祝你们早日消灭掉心里的各种权威以及对他们的畏惧心理，认识到自己和自己国家的价值和力量。&lt;/p&gt;

&lt;p&gt;新年快乐！&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Mon, 06 Jan 2014 11:16:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/16649</link>
      <guid>https://ruby-china.org/topics/16649</guid>
    </item>
    <item>
      <title>如何才能测试 Capybara 写的程序</title>
      <description>&lt;p&gt;通常写的程序，用 RSpec+Capybara 来模拟用户输入来验收测试。
那如果程序主要就是用 Capybara 写的呢？&lt;/p&gt;

&lt;p&gt;假如，程序就是个微博登录机器人。
那怎样用 BDD 的思想写个验收测试？&lt;/p&gt;

&lt;p&gt;而主程序是用 Ruby+Capybara 写。&lt;/p&gt;

&lt;p&gt;测试小白，敬请不吝赐教。&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Fri, 20 Dec 2013 12:39:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/16332</link>
      <guid>https://ruby-china.org/topics/16332</guid>
    </item>
    <item>
      <title>如果自己自动登录邮箱或者微博，代码怎么写？</title>
      <description>&lt;p&gt;1 用 Ruby 是否容易些？用什么 gem
思路是怎么样的？&lt;/p&gt;

&lt;p&gt;是用 capybara 吗？&lt;/p&gt;

&lt;p&gt;2 有没有集成到 chrome 等浏览器内的。
3 如果遇到验证码是怎么操作的？&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Thu, 12 Dec 2013 16:03:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/16162</link>
      <guid>https://ruby-china.org/topics/16162</guid>
    </item>
    <item>
      <title>看了个好玩的 500 页面</title>
      <description>&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2013/129c58d301965734647dd67c69039634.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Thu, 12 Dec 2013 12:40:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/16159</link>
      <guid>https://ruby-china.org/topics/16159</guid>
    </item>
    <item>
      <title>Mac 上用什么好的工具可以读取 SQL Server 的 MDF 数据库文件</title>
      <description>&lt;p&gt;如题，
Mac 上没有 SQL Server，
用了 Sequel Pro 不行。&lt;/p&gt;

&lt;p&gt;不知道用什么工具可以读，主要简单的查找就可以。&lt;/p&gt;

&lt;p&gt;另一个问题，SQL Server 数据库是否可以简单方便得转化为 MySQL 数据库中？&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Mon, 25 Nov 2013 16:11:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/15781</link>
      <guid>https://ruby-china.org/topics/15781</guid>
    </item>
    <item>
      <title>怎么测试网站在多个 IE 版本的兼容性？</title>
      <description>&lt;p&gt;当前的做法是在 Mac 上安装 N 个 Windows 虚拟机（xp, 两个 windows7,...）
然后每个系统内或安装，或使用自带的 IE 进行测试。&lt;/p&gt;

&lt;p&gt;感觉应该有更好的方式，大家怎么做的？&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Mon, 04 Nov 2013 23:05:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/15300</link>
      <guid>https://ruby-china.org/topics/15300</guid>
    </item>
    <item>
      <title>[转载] 一个 Bug 导致每秒钟亏 172,222 美元，持续了 45 分钟</title>
      <description>&lt;p&gt;转载地址：&lt;a href="http://blog.jobbole.com/50392/" rel="nofollow" target="_blank"&gt;http://blog.jobbole.com/50392/&lt;/a&gt;
原文地址：&lt;a href="http://pythonsweetness.tumblr.com/post/64740079543/how-to-lose-172-222-a-second-for-45-minutes" rel="nofollow" target="_blank"&gt;http://pythonsweetness.tumblr.com/post/64740079543/how-to-lose-172-222-a-second-for-45-minutes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这大概是我读过的最惨痛的一份 bug 报告。它描述了一个去年下半年爆发的软件 bug 是怎样一步步使得骑士资本（Knight Capital）在交易中损失了 4.65 亿美金，并且直接导致了公司的破产。&lt;/p&gt;

&lt;p&gt;这个故事，有着一个大型、无维护、腐烂（代码本身长达 8 年没用过了）代码库的技术债务的所有特点，真是一个极为低劣且无职业素养的 Devops 故事。&lt;/p&gt;

&lt;p&gt;重点摘要：&lt;/p&gt;

&lt;p&gt;为了允许客户参与纽约股票交易所的“零售流动性计划”（RLP），骑士资本对它的指令处理流程相关的系统和软件代码进行了几次修改，其中有 5 个被安排在从 2012 年 8 月 1 号开始。这些修改包括在 SMARS 上开发和部署新的软件代码。SMARS 是一个自动化高速算法路由器，可以把指令发送到市场上执行。SMARS 的一个核心功能是用于接受从骑士交易系统的其他组件发送过来的指令（“父”指令），然后根据可用流动性的需求，向外部市场发送一个或多个代表指令（或者“子”指令）以便执行。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;在部署时，SMARS 上的新 RLP 代码本来是用于取代指令路由器上与之相关但并未使用的代码。那些未被使用的代码之前被用于一个叫做“Power Peg”的功能，但是骑士多年前就已经不再使用了。虽然很久不用了，但是在部署 RLP 代码时，Power Peg 功能仍然存在而且可以被调用。并且，新的 RLP 代码重用了一个原本用于激活 Power Peg 的标记。骑士原本预计删除 Power Peg 代码，这样当标记设置为“是”的时候，参与工作的将会是新的 RLP 代码，而不是 Power Peg 代码。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;之前骑士使用 Power Peg 代码时，当子指令被执行时，有一个累积数量功能会计算父指令中被执行的股票数。这个功能会指明让代码在父指令已经全部被执行后不再发送子指令。2003 年，骑士停止使用 Power Peg 功能。2005 年，骑士把 Power Peg 代码中这段追踪累积股票数的功能挪到了 SMARS 代码顺序中更前面一点的地方。挪完之后，骑士并没有重新测试 Power Peg 代码，已确定在被调用时 Power Peg 是否仍然能够正确运作。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;从 2012 年 7 月 27 号开始，骑士分批将新的 RLP 代码部署到 SMARS 上，连续几天把它放置到数目有限的 SMARS 服务器上。然而，在部署新代码的过程中，骑士的某个技术人员并没有把新的代码复制到八台 SMARS 服务器的其中一台上。骑士没有让第二位技术人员复查这次部署，也没有人意识到第八台服务器其实并没有删除 Power Peg 代码，也没有安装新的 RLP 代码。骑士没有任何书面流程要求这样的复查。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;8 月 1 号，骑士从经纪自营商那里收到了有权参与 RLP 的客户的指令。那七台安装了新代码的服务器正确处理了那些指令。但是，使用了重用标记的指令发送到第八台服务器，触发了那台服务器上残留的有缺陷的 Power Peg 代码。因此，那台服务器开始向特定交易中心发送子指令以便执行。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;8 月 1 号，骑士同样收到了有权参与 RLP 并且特别指定在开市前交易的指令。有 6 台 SMARS 处理了那些指令，从东部时间大概早上 8:01 开始，骑士的一个内部系统根据 SMARS 自动发出邮件信息（叫做”BNET 指令拒绝”），发现了一个叫做“Power Peg 已被禁止”的错误。骑士系统在上午 9:30 开市之前向骑士的某组员工发送了 97 封这样的邮件。骑士没有把这类信息设计为系统报警，骑士员工在收到时也基本上不会检查。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;更惨的是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;8 月 1 号，骑士并没有关于事故反应的监控流程。说得更具体一点，骑士没有监控流程在重大问题发生时可以指导它的相关员工。在 8 月 1 号，骑士基本上依赖于它的技术团队在实时交易的环境下，试着发现和解决 SMARS 问题。当骑士的员工在试图查找问题源头的同时，它的系统仍然在持续发出上百万条子指令。在一次试图解决问题时，骑士把新的 RLP 代码从正确安装的七台服务器上卸载了。这加剧了这个问题，因为它导致额外新进来的父指令激活了那些服务器上残留的 Power Peg 代码，就像第八台服务器上已经发生的一样。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这篇文档的其他部分绝对值得一读，但是重要的是推荐了新的为避免类似灾难的人为过程。导致这个 bug 的运营错误没有什么是和人为因素有关的，反而更象是因为很烂的部署脚本和很不幸的产品监控。什么样业余的系统才会连确保服务器集群运行统一软件发布的监控都没有！？更不用说可以检查返回值的部署脚本……&lt;/p&gt;

&lt;p&gt;我们只能希望那些未使用代码的“书面测试过程”指的是有系统的测试，就象参照一个十年前的 wiki 页面所说的那样。&lt;/p&gt;

&lt;p&gt;最好的部分是关于罚金：1200 万美金，虽然最终审计也披露系统有条理地发送了无担保卖空指令。&lt;/p&gt;

&lt;p&gt;［修正：似乎这篇发布的有点太快了：最终亏损是 4.6 亿美金，而且那段代码几乎 9 年没被用过了，而不是 8 年］&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Mon, 28 Oct 2013 10:32:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/15081</link>
      <guid>https://ruby-china.org/topics/15081</guid>
    </item>
    <item>
      <title>今天是个球迷的大日子，一晚上有多场重量级的比赛</title>
      <description>&lt;p&gt;亚冠：恒大 VS 首尔
英超：水晶宫 VS 阿森纳，曼联 VS 斯托克城
西甲：巴萨 VS 皇马&lt;/p&gt;</description>
      <author>zealinux</author>
      <pubDate>Sat, 26 Oct 2013 17:52:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/15051</link>
      <guid>https://ruby-china.org/topics/15051</guid>
    </item>
  </channel>
</rss>
