铁道下的红宝石:点评Ruby畅销书三种
May 24th, 2007
对于Ruby这种语言,很多人都和我一样,是因为一个突然风靡全球的、号称能够极大提升web应用开发效率的、名叫Rails的web框架而顺带了解到的。在为Rails的神奇魔力所折服的同时,我们也常常心生疑惑:这种强大的力量究竟来自何方?如果换成Java、C#或是别的什么语言,一个web框架能否同样高效?除了这多少有些“虚”的思考之外,我们还常常在各大论坛上看到“应该如何学习Ruby”这样的问题——Rails尽管方便易用,但要真正穷其千里目,仍须在Ruby语言这里更上一层楼才行。
好在书中自有黄金屋。不论是要深入探索Ruby语言的奥妙之处,还是只想在工作中遇到问题时查找参考,都有好书可以提供帮助。在Amazon网站上,抛开专讲Rails框架的Agile Web Development with Rails之外,销量排名前三位的Ruby图书分别是Programming Ruby(第二版)、Ruby Cookbook和The Ruby Way(第二版)。
镐头书:Programming Ruby(第二版)
由于封面上赫然画着一柄丁字镐,这本Programming Ruby也被Ruby程序员们亲切地昵称为“镐头书”——和历史上大名鼎鼎的“龙书”、“紫皮书”一样,拥有一个独特的昵称本身就证明了这本书的地位。虽然Ruby语言的作者Matsumoto并没有参与撰写此书,但Dave Thomas和Andy Hunt这两位“用本主义程序员”的大名也足以撑起一部经典教材了。
所以这本书就是Ruby的经典教材。关于Ruby的基本语法和常用工具,书中第一部分和第二部分做了详细的介绍。第三部分“Ruby Crystallized”更加阐述了Ruby语言的一些细节和设计理念,其中第23章“Duck Typing”是刚从Java或者.NET平台走出来的读者不可错过的,因为对于类型与契约的理解、对于类与类型的理解,正是Ruby这种动态语言与Java/C#等静态语言最大的区别之一。随后的第四部分提供了Ruby基础类库的速查手册。
身为“用本主义程序员”的两位作者并非浪得虚名:这本Programming Ruby虽然不是一本称职的参考手册,却足够帮助一个初学者步入Ruby世界而不致误入歧途,并且能够在很少见的一些情况下——譬如说忘了yield的用法——给有经验的Ruby程序员提供帮助。在我看来,这也就足够奠定它作为经典教材的地位了。
不可读,不可不读:Ruby Cookbook
“写作这本书是为了帮你节约时间。人们常说‘时间就是金钱’,没错,不过别忘了,时间还是你的生命。我们有限的生命最好是用于创造有趣的新事物,而不是跟自己的错误较劲,或是试图解决那些早已有人解决过的问题。我们花了不少时间来写这本书,只希望它帮助所有读者节约的时间能够值回票价。”
这段话出自Lucas Carlson和Leonard Richardson两位作者为Ruby Cookbook所写的前言。说得没错。人们把太多的时间浪费在实现通用算法、做别人已经做过的事、调试错误和重复劳动上;在想要避免重复劳动时,他们又把太多的时间浪费在搜索、试用和学习别人提供的库上。就像两位作者所说,这本Ruby Cookbook的问世正是为了帮助人们节省这些时间。
而它也毫无疑问能够兑现自己的承诺。这本Cookbook涵盖的内容从字符串处理到数组与Hash的用法、从代码块到元编程、从文件读写到数据库持久化、从互联网服务到分布式Ruby程序设计……简而言之,Ruby程序设计中的各种常见问题在这里都有所提及。除了编程任务之外,这本书还包括了测试、调试、性能优化、打包发布、日常任务自动化等内容。说得夸张一点,也许Ruby程序员们遇到问题时第一个咨询的对象不应该是Google,而是这本Ruby Cookbook。
但——在我个人看来——它有一个致命的缺点:太过厚重。涵盖如此大量的内容,代价就是两位作者把这本书写到了近千页之厚。当然我们并不是没读过厚达千余页的大书,但Ruby毕竟不是C++,如何期望那些满怀激情的web 2.0创业者捧着一本鸿篇巨著正襟危坐孜孜苦学?所以,也许你应该把这本书放在案头,遇到问题时立即翻查,但你很可能不会有兴趣去细细读它。
解说Ruby之道:The Ruby Way
在Rails变得炙手可热之后,我不止一次地听到这样一种——不无醋意的——论调:只要学习Rails框架的设计思想,用别的语言(譬如Java)也能够做出同样优雅、同样高效的web框架。其实正如维特根斯坦曾说的,语言本身已经为思想划下了界限。选择一种语言远远不止是选择它的语法,还意味着选择其中的模式、惯用法、套路和思维方式。或者说得更玄一点,你不仅要接受它的“器”,更重要的是掌握它的“道”。
但“道”是很难形容的。“我能够感受到它,但未曾尝试过用语言来解释它。这太难了,即使是用我的母语日语。但Hal Fulton这样做了,且第一次就做得很不错。由于得到了Ruby社区许多人的帮助,他的第二次尝试更出色。”Ruby语言的创造者Matsumoto如是说。从篇章选材来说,Fulton所著的这本The Ruby Way与前面介绍的Ruby Cookbook大同小异:无非是各方面的常见问题及其解决方案。不同之处在于:它不仅讲解如何解决这些问题,还揭示出解决方案背后隐藏着的Ruby的思维方式——Ruby之道。这也让这本书——尽管其厚度并不逊于Ruby Cookbook——有了更多的可读性。
作者把“Ruby之道”分为两部分:Ruby设计的哲学,以及“如何使用Ruby”的哲学。Ruby语言具有某种“无名特质”,其中最大的特点就是“简单”:它让程序员们能够以更简单的方式解决问题。但Ruby并不是一种简单的语言——简直可以说它“相当复杂”。那么,这种复杂的语言是如何让使用者的生活反而变得简单的?了解其中的奥妙,不仅有益于快速掌握Ruby语言,对于读者今后的软件设计思路也不无裨益。带着这个问题来阅读这本The Ruby Way,相信读者能够更好地看出作者的良苦用心。
作为“Web 2.0时代”的产物,这本书的第二版相比第一版也加入了很多新鲜内容,例如测试驱动、开发工具、社区介绍等等。此外Rails的作者David Heinemeier Hansson也指出:本书在阐述元编程,很多Rail理念的灵感都来自本书的第一版,尤其是现为第11章的内容。不过如果你恰好是刚开始接触Ruby,我强烈建议你从第14章“脚本编程与系统管理”读起,因为学习一种编程语言的最佳途径就是从现在开始用它,每天都用。
* * *
诚如Martin Fowler所说,Ruby是一种神奇的语言。不论你是被这种神奇的语言本身所吸引,还是为了赶上Rails的热潮而学习Ruby语言,本文所介绍的三本书应该就能满足你的需要。其实除了Rails之外,Ruby的世界里还有众多的“红宝石”闪烁着迷人的光芒,但愿这几本书能帮你发现更多“铁道下的红宝石”。最后,就祝你阅读愉快、编程愉快吧。
[转载]RubyWorks入门指南
May 20th, 2007
(抄袭Giive Chen的RubyWorks 0.0.1 Release,感谢Giive的帮助_)
如果你覺得安裝所有的 Ruby on Rails 相關套件,並且將 Production Server系統設定好是一件很麻煩的事情嗎?或許你可以試試看RubyWorks。
RubyWorks 是一個在 Red Hat Enterprise 或是 CentOS 上面的套件組合,他會幫你把所有 Production 環境下面的相關的 Ruby on Rails 套件跟 Server 套件一次安裝完成,並且提供一個馬上可以跑的 defulat config file,也就是說各位公司的技術長們不需要花時間去看那麼多 Production 設定方式,你已經有一個很堪用的 Production Ruby on Rails Server了。
So,你還有理由不玩 Ruby on Rails嗎?
我們看看怎麼安裝 RubyWorks,因為我沒有 Red Hat Enterprise Server,所以我只 Test CentOS。
前置作業
RubyWorks 因為好像還沒進去 yum 資料庫,所以我們還是得必須告訴 yum 哪裡有 RubyWorks 的 Package,如果已經進去yum repo了,就好像不需要這個動作了。
如果你像我一樣,是個不求甚解,只求可以 Work 的人,就這樣打就好了。
wget http://rubyworks.rubyforge.org/public_key.txtsudo rpm—import public_key.txtwget http://rubyworks.rubyforge.org/RubyWorks.repocp RubyWorks.repo /etc/yum.repos.d/
直接用 gem 安裝
yum install rubyworks然後…..裝好了。
Rubyworks 安裝表
RubyWorks 一共會幫你安裝
- ruby
- ruby-devel
- rubygems
- haproxy
- monit
- mongrel
- rubyworks
Rubyworks 詳細位置表
詳細的安裝位置是在
/usr/bin/ruby/:Ruby 所在地/usr/lib/ruby/:Ruby libraries/usr/lib/ruby/1.8/:Ruby standard library/usr/lib/ruby/gems/1.8/gems/:所有安裝的 Ruby gems Package/usr/bin/monit:monit 執行檔/etc/init.d/monit:monit的啟動 script,所有的 server 都會在 monit 啟動的時候,也順便幫你啟動好了(Mongrel,Haproxy)/usr/bin/haproxy:HAProxy 執行檔/usr/bin/mongrel_rails:Mongrel/etc/rails/:configuration files/var/rails/:所有 Deamon 的 .pid files/usr/rails/:Rails app code 所在地。/var/log/monit.log:Monit 的 log/var/log/haproxy.log:HAProxy log/usr/rails/log/:Mongrels and Rails 的 log
不用说(或者随便怎么说)
May 19th, 2007
今天在敏捷西安做了关于RubyWorks的演讲。在准备讲稿的时候,随便乱看,就看到了孟岩以前的一个blog:动态语言,别再说不。
“国 外的大气候和国内的小气候都有共同特点,就是站在传统技术立场上的人对于RoR的火爆看不下去了,首先站出来发难,从而引发Ruby支持者们的回击,然后 双方厮杀在一起,连带旁边相干不相干的看热闹的、拉架的、含沙射影的、慷慨激昂的,瞬间就浩浩荡荡,横无际涯了。而争论来争论去,无非还是Ruby的性能 问题、可用性问题、前景问题,等等等等。”
孟岩的态度——如果我没理解错的话——是在劝解大家,不要随便怀疑新生事物,新生事物旺盛的生命力是能够克服一切困难的,要对新生事物抱有希望。而我(现在)的态度是,我不劝说谁。不是怀疑性能问题吗?我们做出唾手可得的高性能部署环境放在这儿。不是担心跟遗留系统不方便整合吗?我们把遗留数据库和消息系统的问题都解决掉。不是没有看到成熟案例吗?我们就来做成熟案例。
既然对它有信心,那就动手把所有的怀疑都打消掉。人们怀疑什么,我们就解决什么。
至于教育大众的事情么……我很相信,我们只要教育“小众”——多半是“大众”们的老板——就行了,“小众”会帮我们教育大众的。
所以孟岩希望大众“别再说不”,我的态度是,大众随便怎么说,我无所谓。
Rails部署:反向代理优于FastCGI
May 18th, 2007
RubyWorks采用了基于反向代理和Mongrel的部署方案:HAProxy把请求代理给不同的Mongrel实例。在InfoQ中文站的报道中写道:
“RubyWorks项目领导人Alexey Verkhovsky也认为,只有在对节约内存使用非常重视的情况下(例如虚拟共享主机),FastCGI才有其价值;而在普通的企业应用中,可靠性和可管理性重于节约内存,这也是RubyWorks选择基于反向代理和Mongrel的部署方案的原因。”
在《Agile Web Development with Rails》的第一版中所推荐的部署方案是基于FastCGI的,而第二版则改为推荐基于反向代理的部署方案。James Duncan Davidson在书中写道:
“ 简而言之,FastCGI确实是一枚火箭,但有时会因为各种奇怪的原因而爆炸在发射台上。使用代理让Rails应用直接与HTTP对话,这是整个社群的发展方向。”
即使在DreamHost这样的shared host上,FastCGI也给人们带来了种种困扰,这也是Mongrel(以及相应的,反向代理的部署方案)流行的原因。另一个Rails服务器Swiftiply号称比Mongrel更高性能,不过伸缩性方面都是线性的。
RubyWorks 0.0.1 Released
May 16th, 2007
RubyWorks production stack is a collection of open-source software required to host a RubyOnRails application on a RedHat Enterprise Linux 4 or CentOS 4 server.
Once you point your package manager (up2date or yum) to RubyWorks repository and install the package, you have all the necessary pieces preconfigured and ready to go. Moreover, there is a skeleton Rails application up and running on the server. It’s as close as we could get to one-click production deployment with Rails.
前一阵的冲锋有了成果。在即将开幕的RailsConf 2007上,所有人都将看到我们的RubyWorks。
正如我以前说过的,Ruby和Rails已经做好了准备走向企业。在众多怀疑的部署问题(性能、伸缩性、可靠性、可管理性……)上,一个经过实践检验的部署方案已经存在,事实证明它完全能够应付所谓“企业级”的要求——不论你如何定义“企业级”这个词,因为这个部署方案各方面的能力已经证明了它自己。
唯一的问题是,HAProxy、Monit、Mongrel的配置即令不是困难的,至少也不是易如反掌的。RubyWorks的出现正是为了解决这个问题。我们提供一个“高性能”“企业级”(如果你喜欢这些大词的话)Rails部署环境所需的所有软件,以及可以立刻投入使用的缺省配置,再加上一个示例应用。所有这些都以RPM的形式发布,用yum或者up2date就可以直接安装。如果你正在开发Rails应用并且你的部署环境是Redhat/Fedora/CentOS,那么恭喜你了,因为……
高性能的Rails部署应用服务器,现在只需一分钟就可以获得。
所谓“科学的根基”
May 15th, 2007
(以下文字摘录自波普尔《科学发现的逻辑》。)
科学理论是全称陈述。
自然科学的理论,特别是所谓自然定律,具有严格全称陈述的逻辑形式;因此它们可以被表达成严格存在陈述的否定形式,或者可以称作非存在陈述(或“无”陈 述)。例如,能量守恒定律可以表达为这样的形式“不存在永动机”,基本电荷的假说可以表达为这样的形式:“除了基本电荷的倍数以外,不存在任何电荷”。
自然定律可以和“排斥”或“禁止”相比拟。它们并不断言什么东西存在着或具有某种状态;而是否定它。它们坚持一定的事物或状态的不存在,可以说是排斥或禁止这些事物或状态:自然定律排除它们。正因如此,它们是可证伪的。
在一个理论系统或公理系统必须满足的各种要求中间,无矛盾性要求起着特殊的作用。它可被看作每一个理论系统,不论它是经验的还是非经验的,都要满足的第一个要求。在无矛盾性以外,经验系统必然满足进一步的条件:它必须是可证伪的,这两个条件在很大程度上是类似的。
如果我们要求用推理的论证在逻辑的意义上去证明[科学陈述],那么我们就得接受这样的看法:陈述只能为陈述所证明。因而,要求所有的陈述都要被合乎逻辑地证明(Fries称作“对证明的偏爱”)一定会导致无穷后退。
理论是或多或少可以严格地检验的;这就是说,或多或少可以容易地证伪的。它们的可检验性的程度对于理论的选择是有意义的。“它们禁止越多,它们说得越多”。
DSL不要太多
May 11th, 2007
ActiveForm据说是用来生成HTML表单的DSL。董斌还颇赞赏。
然则,这个代码真的比HTML更容易弄吗?
HTML原本就被认为是描述web界面的DSL,现在又弄出一套DSL来生成HTML。
用好现在的工具,会不会比不断发明新工具要好?
甘肃行|边塞怀古
May 9th, 2007
长久以来,我第一次发现,关中平原是一块苍翠肥沃的土地。
黄河远上白云间,一片孤城万仞山
一个小时前,深圳航空公司一位估计是刚从部队转业的机长把空客320当战斗机开上了天。克服心中的恐惧之后,透过舷窗我看到了王之涣眼中的边塞风景。黄河蜿蜒着直指天际,河谷两岸隐约点缀片片灰绿,兰州城倔强地对抗着四周的群山。
那山,与戈壁一般无二的澄黄,连绵起伏,沟壑纵横,无边无际。
尚未进入河套的黄河,温柔浑厚,如同慈母,在一片黄沙中滋润着兰州。而在身后,矗立着严父般的皋兰山,仿佛永远凝视着自己的子民,不怒而威。
那一日,整个大西北,万里无云。
羌笛何须怨杨柳
去往敦煌的火车,精确复现着丝绸之路的主道。进入河西走廊以后,身边就一直伴着积雪的祁连山。
失我祁连山,使我六畜不蕃息。 失我焉支山,使我妇女无颜色。
祁连山下,牛马成群。列车一站站前进,毫无感情的报站声,提醒着两千年前那场残酷的战争。
武威。彰显骠骑将军霍去病神武威名。 张掖。断匈奴之臂,张大汉之掖。 酒泉。霍去病洒酒入泉,犒军庆功。 敦煌。敦敦大汉,煌煌天朝。
草原民族则一步步退入万里黄沙,终于漠北无王庭。
相比之下,当权贵们贪恋汴梁繁华,英雄也只愿“踏破贺兰山缺”。一般的豪情壮志,气势却已然逊了几分。
春风不度玉门关
由敦煌向西北180公里,即是有“魔鬼城”之称的雅丹地貌公园,也是罗布泊的入口。怪石嶙峋,寸草不生。东侧30公里,便是玉门关。
犯我强汉者,虽远必征
汉武神鞭,跨越四千里,于此落下最后一击。关内有草,有水,有绿洲,有田地。一道关城,连春风也被锁住,只留下大漠。
匈人于是从历史上消失。直到三百年后,阿提拉朝着罗马帝国挥舞起上帝之鞭。
只不知,那时的他,可还依稀记得祖先如何在地狱般的黑石山上苟延残喘,望向祁连山下肥美水草地时的嫉恨眼神?
河仓城外,一片红柳环绕的沼泽;嘉峪关下,几处白杨护卫着村庄。戍边的兵士们,不畏如此的严寒酷暑狂风暴沙,是这关内美景在时刻鼓励着他们吧?
飞机渐渐近了咸阳。看这沃野千里,岂容他人染指。






