十二 07
2008年十二月7日,星期天,上午 2:02 | 分类:
tech |
给我留言 |
这是个很简单的Rails2.1.2的 find 的应用,来自Rdoc ActiveRecord::Base 一、find :first 和find :all 使用 Model.find_by_user_name ,来简写 Model.find(:first, :conditions=>["user_name=?",user_name]) 使用 Model.find_all_by_user_name ,来简写 Model.find(:all, :conditions=>["user_name=?",user_name]) 这里也可以使用and,比如典型的用户名和密码查询:Person.find_by_user_name_and_password(user_name, password) find也支持带参数的查询,比如Payment.find_all_by_amount(50, rder => “created_on”) 二、find_or_create_by_和find_or_initialize_ find_or_create_by_:当查询的内容不存在时,创建并保存该记录 find_or_initialize_:更上面的相似,只是创建不保存该记录,需要自己再次save 这里也支持参数和代码块,如 User.find_or_create_by_name(‘Bob’, :age => 40) { |u| u.admin = true } 三、find_by_的时候,支持多属性,如 Tag.find_or_create_by_name(:name => “rails”, :creator => current_user) 以上文字来自Rails2.1.2的Rdoc文档ActiveRecord::Base
(阅读更多精彩内容...)
十一 17
2008年十一月17日,星期一,上午 7:07 | 分类:
tech |
给我留言 |
class, module, def 标志着切换到新的 self, main 是默认的 self 对象用来引用自己的专门术语。self 作为消息默认的接受者,如果消息接受者是 self ,可以省略接受者和圆点。 如果存在同名的方法名和变量,而且你使用裸词标识符,那么变量具有优先权。要强制 Ruby 将标识符当作方法名,你必须使用 self.talk 或者用参数列表为空的 talk() 来调用方法。 有一个场合,即使是发送消息给当前的 self,也必须使用完整的“对象 圆点 消息”记法,那就是在调用写方法的时候。因为 Ruby 总之将序列“裸词=值”解释为对局部变量的赋值。为了调用当前对象的 venue= 方法,必须显示的给出 self。 private 和 protected 的区别 私有方法意味着该方法不能使用显式的接收者来调用。Ruby 认为你想要发送消息给当前对象 self。所以仅当 self 是一个可以响应消息的对象时,该消息才有对象接收。那啥时候 self 才会是类的实例呢?当执行类的任何一个实例方法时。所以看如下代码 class Baker def bake_cake @batter = [] pour_flour add_egg return Cake.new end def pour_flour @batter.push(Flour.new) end [...]
(阅读更多精彩内容...)
十一 16
2008年十一月16日,星期天,上午 9:09 | 分类:
tech |
给我留言 |
模块没有实例,模块被混含在类中。这样类的实例可以调用定义在模块中的实例方法。混含操作由 include 语句实现。require 或 load 时,加载的内容放在引号里。但是使用 include 时,不使用引号。 module Stacklike attr_reader :stack def initialize @stack = Array.new end def add_to_stack(obj) @stack.push(obj) end def take_from_stack @stack.pop end end require “stacklike” class CargoHold include Stacklike def load_and_report(obj) pust obj.object_id add_to_stack(obj) end def unload take_from_stack end end 使用名称作为类名,使用形容词作为模块的名。上面的例子演示了如何进一步发挥模块的作用。 当给对象发送它不理解的消息的时候,会触发内建方法 method_missing 调用。 class Bicycle attr_reader :gears, :wheels, :seats def [...]
(阅读更多精彩内容...)
十一 16
2008年十一月16日,星期天,上午 5:05 | 分类:
tech |
给我留言 |
实例变量使得单个对象可以记忆状态。实例变量的名字以@开头。实例变量仅仅对于它所属的对象来说是可见的。在一个特定类的某一方法中初始化的实例变量,与同一个类的其他方法定义中引用的同名实例变量是同一个。 class c def inst_var_init(value) puts “Setting an instance variable…” @ivar = value end def inst_var_report puts “Inspection the value of the instance variable…” puts @ivar end end 初始化对象状态 class c def initialize(venue, date) @venue = venue @date = date end def venue @venue end def date @date end end =号方法和语法糖衣,Ruby允许定义以等号结束的方法。另外当解释器看到一个裸词后面有等号的时候。它会自动忽略等号前面的空格。从而得到一条单独的消息,例如 price= 。 class Ticket [...]
(阅读更多精彩内容...)
十一 10
2008年十一月10日,星期一,上午 7:07 | 分类:
tech |
给我留言 |
def all @order = params[:order] || “number” sort_proc = case @order when “author” then lambda {|r| [r.user.name.downcase, r.number]} when “status”, “title”, then lambda {|r| [r.send(@order).downcase, r.number]} when “number” then lambda {|r| -r.number} end @rcrs = Rcr.find(:all).sort_by &sort_proc end 下面是一个 respond_to? 和 send 方法的例子 request = gets.chomp if ticket.respond_to?(request) puts ticket.send(request) else puts “No such information [...]
(阅读更多精彩内容...)
十 27
2008年十月27日,星期一,上午 8:08 | 分类:
default |
给我留言 |
生成式编程(Generative Programming)——即用代码来编写代码,是一个包含了若干种技术的一种强大的技术。这种技术可以以最简单的方式实现,例如编写一段用于自动完成编程中一些单调乏味的操作的shell脚本。举个例子,假设你想为每个用户生成一个示例项目的测试fixture: brad_project: id: 1 owner_id: 1 billing_status_id: 12 john_project: id: 2 owner_id: 2 billing_status_id: 4 … 如果这种语言不支持可脚本化(可编程)的测试fixture,你恐怕不得不手工编写了。当数据持续增加时这将会变得混乱,而且当这些测试fixture和源数据层有着奇怪的依赖关系的时候手工编写几乎变得不可能。 朴素的生成式编程能够让你编写脚本来从源数据生成这些测试fixture。虽然还不够理想,但是比起全部手工编写已经算是个巨大的进步了。但其维护仍然让人头痛,因为你不得不将那个脚本放在编译过程中,而且需要保证源数据发生了变化时测试fixture被重新生成了。 令人欣慰的是在Ruby或Rails中,这种烦恼几乎是不需要的。几乎每个方面的Rails应用的配置都是可脚本化的,这主要归因于使用了内部的特定领域语言(DSL)。在一个内部的DSL中,你能够支配使用Ruby语言的所有特性,而不仅仅是库文件作者决定要提供给你的那些特定接口。 再返回去看前面的例子,ERb将这个过程变得异常简单。我们可以通过使用ERb的<% %>和<%= %>标签在上面用到的YAML文件中插入任意的Ruby代码,包括我们需要的任何逻辑: _project: id: owner_id: billing_status_id: ActiveReacord中对这个功能的实现几乎不能再简单了: yaml = YAML::load(erb_render(yaml_string)) 使用了helper方法erb_render: def erb_render(fixture_content) ERB.new(fixture_content).result end
(阅读更多精彩内容...)
十 27
2008年十月27日,星期一,上午 8:08 | 分类:
default |
给我留言 |
当前的Ruby实现有一点不足:Blocks代码块不总是Procs过程,Procs过程也不总是Blocks代码块。普通的代码块(定义在do…end 或者{}中)必须依附在一个方法调用上,而不能自动成为对象。例如,你不能把代码写成code_block = {puts “abc”}。这就是Kernel#lambda 和Proce.new 的用途:将代码块转换为过程。 block_1 = lambda { puts “abc” } # => #<Proc:0×00024914@-:20> block_2 = Proc.new { puts “abc” } # => #<Proc:0x000246a8@-:21> Kernal#lambda与Proc.new之间仅存在着些许区别。由Kernel#lambda 创建的Proc被调用时返回给调用方法的值是在Proc中给定的值;而由Proc.new 创建的Proc被调用的时候,Proc将试图从当前的函数方法中返回,但是,如果不能从方法调用中返回那么它就抛出LocalJumpError错误。下面是一个具体的例子: def block_test lambda_proc = lambda { return 3 } proc_new_proc = Proc.new { return 4 } lambda_proc.call # => 3 proc_new_proc.call # => puts “Never [...]
(阅读更多精彩内容...)
十 24
2008年十月24日,星期五,下午 2:02 | 分类:
default |
给我留言 |
解决了前几篇所有的疑惑后,理解method_missing就变得非常简单。其准则是:如果整个方法查找过程中,直到到达了Object都以失败而告终,那么将再次执行方法查找,但这次查找的是method_missing方法而不是原来调用的方法。如果method_missing方法被找到,它将被传入原方法的调用参数并调用,原调用的代码块也会被传入method_missing方法。 Object中的缺省method_missing(rb_method_missing)函数将抛出一个异常。
(阅读更多精彩内容...)
三 20
2008年三月20日,星期四,下午 11:11 | 分类:
default |
给我留言 |
写在前面: 那天同事GT我说Rails出了新书,中文版,《Ruby on Rails电子商务实战》 ,并且把英文版迅速发给了我,说:书很好,讲TDD了,你快看,我已经买了。 一、《Beginning Ruby On Rails E-Commerce》 这本书的英文版是在06年的时候出版的,在书中标注的开发环境,对于现在来说,有一些老。不过对于主流的Rails1.2.6以下版本开发的项目来说,不会产生太大的问题。 书中(英文)的开发环境 不过,随着Rails2.0.2的发布,新的项目自然会用新版本开发。并且一些功能已经改进。比如第七章说到的“Tagging Support”,就会带来版本的困扰,这个我在开发笔记:rails分页和acts_as_taggable插件的应用中已经做了个笔记。 这本书是Rails2.0下的牺牲品吗?绝不 ,这本书的价值,在于里面讲到的TDD下的Rails开发。这是这本书的精华,也使它不同于Rails普及书会面临的淘汰问题。 二、一定要重视TDD开发 在本书英文版的前言部分,作者提到了本书的目的: 本书的阅读群,是使用Rails制作过一个以上项目,并且期望在以后的开发中,通过使用TDD开发来改进代码质量的程序员的。 这正适合我这样的程序员。最近的经历告诉我,如果想和外国的团队开发项目,或者加入到成熟的项目开发中 ,掌握TDD或者BDD是一项必须技能。这重要的不在乎技巧,而是观念。 记得当初在Django下开发deyeb的第二个版本时,就被迫的拿着测试驱动开发去理解。那个时候根本不明白这是什么意思,而两年后的现在,却十分想认真的再去理解一下书中的精髓。而这本书正好是按照先测试,后开发的“规矩” ,完成一个项目的。这也使得这本书不局限在Rails的具体版本,而教人知识的层次了。 三、 《Ruby on Rails电子商务实战》 中文版我还没读到,所以抓来GT(GT就是google talk的意思,好玩)我的那个人,写了一下感想,毕竟他已经认真读完前三章了。 买了Ruby on Rails电子商务实战。刚入手就迫不及待的翻看起来。这本书和其他的Rails都是一个流派,本着实用为目的,没有多余的废话,上来就直接做应用,而且介绍的技术都是现实中大家肯定会用到的,一些相关的知识点也都给了详细介绍的URL。从第二章开始作者就有意的给读者介绍一些优秀的编码思路,也就是本书的核心TDD测试驱动开发。说实话,这本书的代码,因为是基于Rails1.2之下的,尤其现在已经是Rails2了。所以好多代码已经被废弃了,例如书中常用到的 assert_tag 在rails中已经废弃了。如果你完全按照书上的例子打,肯定过不去,好在译者已经给大家写了注释和修改的方法。所以,虽然本书不是基于rails2来写,但是有了译者的补充和完善,代码仍然不过时。书中介绍的一些技巧和方法,在实战中也肯定让读者少走不少弯路,比如如何给Rails应用增加Textile功能,如何试用Rails的上传插件FileColumn。虽然Rails进过不断的进步,在安全,多语言支持应用程序部署和性能优化上都有了更好的标准和方法。但是本书后在这方面的章节仍然值得一读。 总体来说,读过《敏捷开发2》,和《Ruby for Rails》再来看这本书,会对Rails开发者在实战中有莫大的帮助。 这是中文译者的博客:activescaffold.com.cn 写在后面: 最近又在给人做网站。又看了很多电影,并且在没什么新片看的时候,下载吴宇森的经典片《夺面双雄》 (英文:face/off)看。昨天还温习了一边《虎胆龙威4》,感觉那些程序员死得很窝囊,难道50年才出一个NEO吗? 镐头书要出新版了,《Pro Active Record: Databases with Ruby and Rails》上架了,唉,时间不等人啊。最近觉得资料分享的网站很有意思,比如http://www.scribd.com/这个站点,大家有什么想法吗?
(阅读更多精彩内容...)
二 12
2008年二月12日,星期二,下午 2:02 | 分类:
default |
给我留言 |
写在前面:奥斯卡要公布最终结果了,上一篇帖子写了自己的想法,不过有一点还没大写特写,而这又是我最喜欢的,就是电影原著小说。现在好莱坞非常重视原著小说的改编,而且也经常取得成绩,比如《国王班底》,《丑闻笔记》,《穿普拉达的女巫》,当然还有史蒂芬 金的小说。不过好莱坞的电影也经常给我带来不可能靠自己去发现的优秀小说,比如下面提到的Cormac McCarthy(中译:科马克 麦卡锡)的小说。而这些,都来自奥斯卡大热《老无所依》。 Cormac McCarthy的《Border Trilogy》 这里提到的是麦卡锡的《边境三部曲》 。 先看一下《老无所依》的介绍 现代的美国西部,许多地处边境的小镇都成了毒品犯子活跃的交易市场,那里几乎已经成为天天会发生枪械火并的三不管地带,虽然这是一个属于我们的时代,但是来到这里,就等于把生命交在了他人手中。故事总是开始于这样的意外、那样的巧合,一座小镇中的兽医卢埃林·摩斯在一片荒凉的地界,无意中发现了一辆装载用的卡车,车的周围躺着几具押送人员打扮的死尸……卢埃林惊讶地意识到,自己竟然来到了一个毒品交易的现场,只是不知道什么原因,买卖双方产生了冲突,结果统统阵亡,只留下了一大包毒品和两千万现金。 卢埃林决定将现金神不知鬼不觉地藏起来–他确实有这么做的理由,然而若要人不知,除非己莫为,一念之差,卢埃林将自己推向了一个没办法回头的绝境。他遭遇了一连串地跟踪与暗杀,引发了大规模地暴力事件,好人当他是瘟神,坏人又对他手中的毒品和钱心怀不轨,卢埃林悲哀地发现,也许自己只有死亡一条路可走了,因为在这一系列灾难性的事件后,卢埃林知道,没有任何相应的法律能够帮助他,直到他遇到了贝尔……一个没有任何理由就执意要保护他的治安长官。他帮助卢埃林躲过了几次致命的追击,可是他们最终还是要面对的,那个在背后秘密策划着一切的神秘人,一个只手遮天、用一枚硬币就能决定别人的生死的杀人凶手,卢埃林最终会了解,他正在经历的一切,远比他看过的所有惊悚小说和报纸的头版头条都更加恐怖、更加血腥。当真相被拆穿、神秘的面纱被揭开时,一切都避无可避,了结的时候也就到了。 导 演 伊桑·科恩 Ethan Coen 乔尔·科恩 Joel Coen 主 演 伍迪·哈里森 Woody Harrelson …..Wells 汤米·李·琼斯 Tommy Lee Jones …..Bell 乔什·布洛林 Josh Brolin …..Moss 凯莉·麦克唐纳 Kelly Macdonald …..Carla Jean 【关于原著】 这部由科恩兄弟执导、有如被施了催眠术的惊悚影片,改编自曾获得普利策奖的美国文学大师科马克·麦卡锡(Cormac McCarthy)的那部受到极大赞誉的同名小说。当小说版的《老无所依》于2003年印刷发行时,被尊为现代传奇和文学先锋的麦卡锡,因为他的作品对焦在了火速变化着的美国西部非凡的故事背景上,已经积累了无人能及的人气和声望。至于这本《老无所依》,则是麦卡锡所创作的最深奥的当代故事之一,就连成功都来得如此刻不容缓。作为一位文风强劲有力、用悬疑和幽默洞穿你的脑细胞的惊悚大师,麦卡锡将笔尖对准在了一个本来诚实正直的男人身上,开始于这个男人偶然在德克萨斯州的边界地带,拣到了一个有2千万美元现金的袋子,因为过于轻率的处理,而引起了一系列有目的性的追杀……这部小说算得上是一个非常有挑衅意味的深思,对象是已经成长为容纳了更多暴力事件和无视法律的行为的现代美国西部,而不再是往日那个神秘的边缘地带。 《老无所依》的中心内容蕴含着一些科马克·麦卡锡一直所关注的最具煽动性的话题,而他已经在自己之前的10部小说中一一罗列出来了,如今已然成为经典:美国西部生活的全部方式以及那种以快节奏逼近的结局;在一个堕落的世界中,最后的荣耀和正义;正在进行的人性与邪恶的对抗;黑色喜剧与现代暴力;诱惑、生存和牺牲之间的相互作用;不段升级的混乱;对黑暗时期残存的爱和一线希望的感动……除此之外,麦卡锡还喜欢有复杂性格的人物和具象征意义的故事主题–这些都会在《老无所依》中得到延续,而且条理清晰足够给电影人一定的发挥空间,或扩充或丰富或扭曲他们的电影技能,以一种能够产生共鸣的讲故事方式,将文字方面的力量转移到惹人注目的画面和铿锵有力的语言上。如此一来,很难想象还有比科恩兄弟更合适的导演人选,也只有他们能够忠诚地将麦卡锡那种忧郁的智慧和赤裸的人性完全通过影像传达出来。科恩兄弟已经用一系列实际行动不断在美国电影工业中证明着自己,包括极具影响力的黑色经典喜剧《血迷宫》,以及随后而至的一系列具有创造力的电影传奇,有《抚养亚历桑纳》、《黑帮龙虎斗》、《巴顿·芬克》、《缺席的人》和《逃狱三王》,当然还有那部帮助哥俩获得奥斯卡奖的《冰血暴》。至于这部影片,科恩兄弟打算将麦卡锡那复杂、微妙、有层次以及大多时候都很滑稽的文字结合进他们自己独创的想象力中,他们坚信由此拍摄出来的作品不但引人注目,同时还会包含成打的动作场面。 科恩兄弟之所以会关注科马克·麦卡锡的小说,主要还得归功于制片人斯科特·鲁丁力荐的结果,伊桑· 科恩回忆道:“鲁丁把小说拿给我们,想看看我们感不感兴趣。结果我们都很喜欢这个故事,于是开始思考将它拍成电影的可能性。”乔尔·科恩补充说:“我们想把它制作得尽可能靠近动作电影,总的来说,这是一部有关追杀的故事,黑帮头子安东·齐格追杀卢埃林,然后是治安长官随后而至,为了达成一个目的,这里有许多身体方面的剧烈行为,对于同类型的电影来说,这种效果是非常有趣的。但故事真正吸引我们的,还是因为它推翻了这种类型作品所能带来的一切预期影响。” 【关于改编】 科恩兄弟决定亲自做编剧,将整个故事浓缩成一个紧张简洁、拥有戏剧结构、着重描述黑色幽默和互相交织在一起的人性秘密的剧本,主角卢埃林·摩斯在错误的时间出现在错误的地点,从一次失败的毒品交易现场发现了几千万美金,然后又出现了两个关系完全对立的男人跟踪他:一个是让人不寒而栗的变态杀手安东;另一个则是小镇中深奥难懂的治安长官贝尔……确实,科恩兄弟有理由相信,这部影片很可能把他们带到一个全新的电影领域中,乔尔·科恩说:“原著中有着大量的幽默成分–虽然还不足够多到让你将它称为是滑稽小说,故事本身当然是非常黑暗的,这是我们一直以来所遵循的特色之一,而且还很暴力、很血腥,所以这可能是我们制作过的最暴力的一部作品了,在这方面,我们都希望影片能够真实地反馈出原著小说的特色。” 整个剧本都对科马克·麦卡锡那独特的美国观念进行了一次全新的认识,它那急速的步调以及过于纯粹的黑色喜剧风格,都决定科恩兄弟必须要寻找电影工业中最一流的演员来完成这部作品。汤米·李· 琼斯就成为了治安长官贝尔这个角色的最佳人选,而且他还是个科马克·麦卡锡迷,小说一发行,他就在第一时间读过了,自然对里面讲述的那个故事痴迷不已,当他听到是科恩兄弟要将小说搬上大银幕时,更加难以抵制自己的兴奋之情了:“在当今美国,麦卡锡被评论界评为最有散文风格的流派学者,他的作品总是会对那些制作电影的人产生某种说不清道不明的吸引力。”另一位主演乔什·布洛林也是一个麦卡锡的忠实粉丝,和琼斯一样,他也是看剧本之前就读过小说了,布洛林表示:“那是我所读过的最让人惊奇、最暴力、也是最有本土气息的故事之一,即使它的线索是单一的直线性,但贵在结构处理上的推陈出新。我非常喜欢卢埃林、安东和贝尔之间组成那种平衡的三点关系,那种感觉就好像是看着同一个人的三种不同人格。”谈到剧本时,布洛林接着说:“科恩兄弟带给我们一个非常有感情、非常原始的故事,讲述的全部是人类有关对与错、诱惑与荣誉的权利和规则。” 乔什·布洛林饰演的是卢埃林·摩斯,一位兽医,当他决定拿走一笔用来买卖毒品的现金时,发现自己陷入了一个进退不能的窘境中,但是,他拿钱并不是因为贪婪,而是因为爱,布洛林说:“从卢埃林的观点出发,我认为这些事情之所以会发生,是因为他和妻子卡拉·吉恩之间的关系。卢埃林深爱着卡拉,所以希望利用这笔钱能带给她更好的生活,让她快乐、幸福–这是他的最终目标。” 在电影界声望颇高的西班牙演员贾维尔·巴尔登则成了扮演安东的不二人选,一个生活在边境的毒品世界、用心最为险恶的杀人凶手。巴尔登是三个人当中惟一一个在读剧本前从没看过小说的人,但是他演员的天性却嗅出了这个故事的出色之处,巴尔登说:“我认为,这是一个非常有力度的作品,满篇都是在说暴力或如何控制暴力或如何阻止暴力所形成的巨大漩涡,然后以一种正确的方式在这个世界存活。” 凯莉·麦克唐纳德 (Kelly Macdonald)饰演的是卢埃林年轻的妻子卡拉,而她本人也对剧本的优秀产生了巨大的反应,不仅仅是因为故事中的那些与人性有关的部分,还包括里面蕴含的幽默,她说:“我只是想说,剧本真的太有趣味性了,这些角色就这么活生生地从小说中走出来,都是那么地充满智慧,我实在没办法对这样一个角色说不。” 关于作者的书,很遗憾,在当当上并没有找到中文版有货。全部在缺货中。而对于更新的原著中文版,我想还要等等等吧。 点这里去Amazon看看作者的书目 我的英语读这样的小说会是相当费劲的,不过读读计算机的书还是可以的。所以下面介绍两本新的Rails书籍。 两本Rails新书 [...]
(阅读更多精彩内容...)