Wanana's Blog

边走边唱|wanana| 技术&生活&牢骚 各种博

Tag Archives: ruby

用ruby脚本比较文件夹

我行文比较罗嗦,看了题目想找重点的使劲往后翻 ———————————————————————————————– 上周末,部门的帅哥得到了一个艰巨的力气活:整合代码。 场景如下: 产品发版后,半个开发团队出差支持项目(项目代号为YX),时间跨度长达几个月,客户提出大量问题和新需求。剩余的半个团队留守,做发版后的补丁盘(给它个代号叫CC),改一些不大不小的问题。 双方改动都比较大。补丁盘修改的问题,YX那边也有,或许只是客户还没有碰到。客户的心思,没发现就不着急让你打补丁,省得引出新的问题。于是YX成为一个孤立的分支版本。 结果原定出差一个月,现在两个月过去了,YX方迟迟没有全面上线,每天都有和风细雨的问题出现,出差人员仍未归来。CC和YX间的差异越来越大,早晚要合并,越晚越痛。 需求分解如下: 1. 以CC为基准新建项目 2. 找到YX修改过而CC未改的,直接复制到新项目中 3. 找到两边都修改过的代码,手工合并 总java文件数约2000+,CC修改文件数约200+,YX修改文件数为400+,存在大量文件名相同单包不同的文件。由于两边的版本控制软件不同(ClearCase、cvs),导致所有文件夹的修改时间均很新。 难点: 如何找到只有一边修改过的代码?如何找到都修改过的代码?如何直接抽出需要覆盖的代码并覆盖? 尝试1: 使用Beyond Compare。由于cvs文件的干扰,放眼望去两个项目间所有文件夹都不同,必须要用鼠标遍历两个项目中所有文件。 ps: 或许可以用命令行删除文件夹下所有跟cvs有关的文件,用正则表达式匹配,不过在win下不会 尝试2: 用windows搜索得到2009-10-31后修改的所有文件。 这个方法可以得到想要的文件,但是大量重名,要费点事才能看到全路径,而且如果直接从搜索结果中复制,路径就丢掉了。鉴于java的包物理路径是与包路径强制一致的,这样复制无效。还是需要右键——属性——得到全路径——手工复制。 想法3: 用java写程序,遍历比较两个文件夹,根据文件大小简单判断文件是否一致,打出文件列表。 ……待尝试,听上去就不像特别简单的程序 使用Ruby脚本实现,实现步骤如下: 1. 脚本list_changed.rb找到某日后修改的所有文件 使用此脚本分别对YX和CC做列表,输出到文件,得到YX.txt和CC.txt. 2. 写脚本diff.rb,对得到的两个txt文件做字符串比较,yx-cc 得到yx修改而cc未改的,cc-yx相反,yx-(yx-cc)就是两边都修改的 3. 写脚本cp_file.rb, 根据文件夹列表把yx-cc的结果直接复制到目标文件夹 4. 对于最后剩下的两边都改了的50个文件 用人眼比较 步骤1代码 找到’2009-10-31′后修改的所有文件,输出为列表文件 命令行cd到要比较的文件夹 ls_changed > yx.txt ls_changed > cc.txt 得到两个文件 步骤2: 比较文件夹,得到有差异的文件 原理:根据上一步得到的两个列表文件,通过对文件中的文件全路径字符串进行比较,得到两个分支中都修改了的、和只有一方修改过的文件。 命令行输入 [...]

让人又爱又恨的ruby

断断续续的接触了一段时间的ruby 真是爱恨交加 都说ruby易学、易用, 在我的角度上来看不见得。 至少对于一个Java程序员来说, ruby远比不上Python那么容易接受——太不像JAVA了!但是人就是贱——容易到手的就不愿意珍惜——一个让人摸不透的女人会时时带给你惊喜。 说说我的感触,不涉及具体语法的比较。 首先说几句抱怨,其中有些几乎导致我不再想玩ruby——当然后来还是抵抗不了诱惑: 1. 我的机子运行不了最简单的tk helloworld图形界面。运行后毫无反应,也不结束。报的错是windows的,至今无法解决,只好改用别的图形库。 2. 想要在终端打印出一个中文字符串,方法比较别扭。即使是用utf-8也别扭。升级到ruby1.9了也别扭。(小插曲 ruby官网上windows平台的ruby1.9连接是无效的…) 3. 网上搜索个问题,只有寥寥几页是相关的,还大部分是只有题没有答案的无头尸。 4. 发展了这么多年,没有活跃的中文社区么?找来找去倒是javaEye资源丰富些。网上大量的初学者日记,到底国内有多少人真正在用ruby呢。 5. end没有{}优雅(别争论,我就是这么认为的) 6. 语法奇特,一时难以接受。一开始,对于代码块,||、symbol这些概念,很是理解了一阵。甚至调用方法时参数列表不需要写在括号里这点都一度让我认为那是变量声明…结果其实ruby里不需要声明变量。 7.没有了编译时的检查 很多时候变量名都会写错…. ————————————————————————— 接下来说说优点: 1. 做同样的事情,写出来的代码就是比Java短,而且一般至少是1/4长度,非常拉风,同事会用星星眼看着我发出崇拜之声。 2. 脚本语言带来的新的思路。 脚本是命令行的良好伴侣,特别是在没有好的IDE的情况下,会不知不觉的去使用命令行和脚本语言结合完成任务。把文件名作为命令行参数传入可比做个文件选择框容易,用起来还要少点很多次鼠标。 另外,不知道算不算个例,用ruby会让你不知不觉的把一个目标分成几个脚本来写,每个脚本都能完成单独的任务,也可以连在一起使用,中间配合简单的命令行操作并输出几个中间文件,可以节省大量代码,组合起来还可以做多种用途。 3. ruby特殊语法带来的… ruby的语法,实在是非常有趣。随便说两个感触颇深的 方法加代码块,读起来就像连续的一句话。”对a里的每个东西做XX事情”,而不是”对a循环,对第i个东西做XX事情”。更甭提还有select、reject、collect方法这种东西, 比如array.each.collect{|item| boring?(item)},就是”收集array里那些讨人厌的东西!”,多有意思~~ 方法名加上问号,读起来就有了语气。def boring? (a)就是”a烦人吗”?如果用java写,会是 boolean isBoring(Object a), 读起来是:”这是不是烦人的东西”。感觉无趣多了。 4. 提供大量的库函数,有些可以说是相当有趣,有些简直是匪夷所思。对于日常的java开发提供了思路,”这些东西可以提成工具类?”,”原来还可以这样!”。 5. rails是一种思想,舍弃一部分灵活性而选择制定大量的规矩,或者说严格的”约定”,大家都必须这样做,代码统一、易读、写起来也方便。 6. 不用编译! 改了之后直接执行,少写一句话。 未完待续

ruby初学笔记1——看ruby代码必备的基本语法

最近学ror。写篇小备忘,记录一个java程序员看ruby代码的时候最晕的部分。覆盖肯定不够全,也太过简单,需要些时间来慢慢补完。 1.方法的调用 ruby调用方法时,参数列表可以不用括号包裹(我一开始见到这种形式认为是变量定义…)。ruby是动态语言,定义变量的时候不需要(也不能)指定类型。 方法名 (空格) 参数1,参数2… 2.代码块(Blocks)、 do…end、yield、|x| 代码块(Blocks)是指一块代码,用大括号({})或者do…end来标明起始和结束,代码块只能跟在方法调用后边。 yield语句:在方法内部使用yield语句来占位,当方法执行到yield时,实际执行的是调用方法时跟在后边的的代码块。 |x|:变量用一对’|’包裹,在代码块中使用,用于接受yield传递的参数。yield后跟的参数会传递给代码块中用| |标志的变量。 常用法Iterator 。当初Blocks就是为了迭代而设置的 调用方法: 方法定义: 3. 严格的命名规范 ruby中由多个单词组成的符号,单词间用下划线分割(c风格)。方法名和变量名都是小写开头。变量的开头字符很多时候直接决定了变量类型。 局部变量以小写字母或下划线开始。 @开头:实例变量。$开头:全局变量。全局变量可以在程序的任何地方加以引用。全局变量无需变量声明。引用尚未初始化的全局变量时,其值为nil。 ‘@@’开头:类变量。例如‘@@number’。和全局变量,实例变量不同,类变量在使用前必须初始化。 常量以大写字母开始。 4. unless if的相反形式。相当于原if条件的else部分。 unless a>1 相当于 if a1 5. hash、方法的hash参数 创建hash表的语法 在方法中使用hash参数,可以不按照参数列表的顺序进行参数传递。可以通过传递key=>value形式的参数来同时指定参数名和参数值。 调用方式: 此方法中,第一个参数表示要搜索的名字,第二个参数是一个hash,存放所有要传的参数。但是这样的写法太”clunky”(沉闷?)了,在ruby中,可以把包裹hash参数的大括号去掉。参数列表中所有hash形式的参数,会被收集成为一个hash参数进行传递。 6. symbol(冒号开头变量) 参考文章:理解 Ruby Symbol Symbol 表示“名字”,比如字符串的名字,标识符的名字。用’:’(冒号)开头。在ruby中,每个 String对象都是不同的,即便他们包含了相同的字符串内容;而对于 Symbol 对象,一个名字(字符串内容)唯一确定一个 Symbol 对象。 字符串 “abc” symbol :abc symbol简单来说就是一个唯一的字符串,只要冒号后面的字符相同,就是同一个symbol。 每个symbol都有个字符串的名字(可以使用to_s方法得到)。而每个String可以请求它的相应symbol(通过to_sym方法)。String和Symbol是紧密相联的,但它们不是同一个东西,他们分别是String类和Symbol类的对象。 [...]

加关注

Get every new post delivered to your Inbox.