用Ruby替换魔兽世界toc文件版本号

玩魔兽世界的同学都知道,当WoW升级后,插件也需要升级。但是有些插件其实没有影响,只是需要把toc文件里面的版本号改成新的就好。这几天刚好国服从3.2.2升级到了3.3.5,这样toc里面的版本号就需要从30200改成30300 (虽然有些改了也用不了)

然后我就想到用ruby实现这个应该不难,早上起来就开始写了。其实很简单,只是自己对ruby的应用还不纯熟。。。现在终于完工了

代码如下:

# toc_ver.rb
# change version number of toc to what you wanted
if ARGV.length != 2 || ARGV.last !~ /[0-9]{5}/ || !File.directory?(ARGV.first)
 puts "Error: two arguments should be used. If your path contains spaces, using quotes" if ARGV.length !=2
 puts "Error: specified directory not found" if File.directory?(ARGV.first)
 puts "Error: version number should be 5 digits" if ARGV.last !~ /[0-9]{5}/
 puts usage=<<USAGE
Usage: toc_ver.rb path_of_Addons version_number
Example: toc_ver.rb "E:\\World of Warcaft\\Interface\\Addons" 30300
USAGE
exit
end

Dir.chdir(ARGV.first)
tocfiles= File.join("**","*.toc")
Dir.glob(tocfiles) do |filename|
#save the file lines in an array; substitution; overwrite the original file
file_array=File.readlines(filename).each {|line| line.gsub!(/## Interface: [0-9]{5}/, "## Interface: #{ARGV.last}") }
 File.open(filename,'w') do |file|
 file_array.each {|line| file.puts(line)}
 end
end

把上面代码保存为toc_ver.rb使用方法: toc_ver.rb [Addons的路径] [要修改的版本号]。
如 toc_ver.rb “E:\World of Warcaft\Interface\Addons” 30300
注意,如果路径有空格的话需要加引号。

浪费的时间主要是想:打开一个文件,然后读入每行。找到要修改的行,替换。
这种想法是不行的,不能对一个文件同时读+修改。所以我还是先把每行读到一股数组,修改完之后再把数组写入。可以参见Stackedoverflow的讨论。那个正确答案是错的,File.read返回的是File对象而不是String

杯具的面试及其它

应该说是去年了,去adobe二面。居然是技术面,之前完全没想到,然后就杯具了。
主要面试java,好久没用了,然后各种回答不上来。。最后那个面试官无奈了,看1小时的面试居然还差几十分钟,就给我出了个计算字符串中每个字母的个数的题。
然后我说不会用java写,用ruby行不?同意了,写了两种方法,基于String#scan和String#each_byte。最后他也没看懂。更无语的是我还把正则表达式的[Aa]写成了Aa,估计到时候拿我代码也运行不出来,唉。。

于是今天不甘心,重新写了个。比较满意


#char_count.rb
if ARGV.length != 1
    puts "argument error: usage: ruby char_count.rb string"
    exit
end

string = ARGV.shift
count = Hash.new (0)
('a'..'z').each do |char|
    count[char]=string.count(char)
end
('A'..'Z').each do |char|
    count[char.downcase]+=string.count(char)
end

#sort the out put in alphabetical order

count.sort.each do |element|
    if element[1]!= 0
        puts "Count of \"#{element[0]}/#{element[0].upcase}\" is #{element[1]} "
    end
end

P.S. 由于WP的博客被墙,翻墙不是每次都方便,于是想找个国内的。然后准备用Blogbus,而且它可以方便的搬家。搬完家之后发现我好几篇都“被审核”了!!马上对其印象差了很多!准备坚守这里了。。。

P.S.S 原来WordPress原生支持代码高亮的,一直不知道呀。。。 参见Posting Source code

Windows CMD命令之强大的for命令

因为工作需要,需要把一个目录下每个子文件夹里面的所有的MIDlet文件提取到其根目录下,就是目录遍历的问题。之前都是手动机械的重复劳动,就觉着机械劳动肯定可以用代码解决。for命令最适合干这个了。一直觉得Windows的命令应该就能搞定,但是里面的for命令以前接触过,没怎么用过,觉得很复杂。

今天上班又要这样重复劳动,就打算正式开始着手写个解决方案。下面包括了自己的思维走向:

Continue reading “Windows CMD命令之强大的for命令”