显示具有 Ruby 标签的文章。 显示所有文章
显示具有 Ruby 标签的文章。 显示所有文章

2008-04-02

netbeans IDE 6 For Ruby


1、自动补齐+文档提示(Ctrl + Space或Ctrl + \);
2、方法间跳转-按Ctrl同时点击方法名会自动跳转到定义该方法的源文件处(在所有GEM中跳转);
3、格式化。

还不能工作或者很好工作的功能有:
1、Debug
2、Rails工程中的lib目录竟然没有包括到自动分析目录中
3、运行工程有问题。

安装方法:
1、到http://www.netbeans.info/downloads/dev.php选择Q-Build,下载安装NetBeans
2、安装完毕后,进菜单Tools -> Update Center
3、点Next,等所有可升级模块出来后,找到Ruby文件夹,点选到需要更新的模块中(一共会有九个文件被选择)
4、按指令完成更新,重启NetBeans。

设置方法:
1、进菜单Tools -> Options,点左边miscellaneous,点右边Ruby Installation
2、将所有Ruby工具指向你的ruby安装目录中的相应工具,注意除ruby选ruby.exe外,其余的rake, rails, rdoc 均选择没有任何后缀的文件,不要选*.bat, *.cmd文件。

建项目文件:
1、File -> New Project
2、Ruby -> Ruby on Rails Application,这时将自动生成rails缺省目录树
3、将已有的rails项目目录树全部覆盖拷贝到NetBeans建的这个项目目录中。

第一次建Ruby项目时,NetBeans会扫Ruby安装目录,生成参考视图,这可能需要一些时间。

备注:
1、如果你用的是Windows中文版,不喜欢NetBeans界面中的英文字体,可以在NetBeans安装目录的etc/netbeans.conf文件中改为:
netbeans_default_options="-J-Xms32m -J-Xmx128m -J-XX:PermSize=32m -J-XX:MaxPermSize=160m -J-Dnetbeans.logger.console=true -J-ea -J-Dapple.laf.useScreenMenuBar=true -J-Duser.language=en -J-Duser.country=US --fontsize 11"
2、默认的编辑字体是monospace,你可以到Tools -> Options 中选Font && Color,将其改掉,改default font项即可。一般用Lucida Sans TypeWriter效果最好。


2008-04-01

Ruby采集抓取网页源代码(可包含图片)


From http://www.ruby-lang.org.cn/forums/thread-2126-1-1.html xukong

想在工作生活中多用RUBY,平时喜欢看小说,发觉古今书屋的书更新比较快,就写了个RUBY小程序来抓古今书屋小说的相关网页,网页中可包含图片,这里发布的只是自己随便用的小程序,肯定有很多不足,有不满意的请自己修改,这里发布只是为了和大家交流下写RUBY的代码,因为我发觉网上发布的实用点的RUBY源代码太少了

调用的批处理文件内容比如 sbzl.bat 内容如下
ruby getbookimage.rb 随波逐流之神龙传奇 http://www.gjsww.com/Html/Book/17/621/List.html
就可以在执行getbookimg.rb的当前目录下建立文件夹并下载相关网页了

文件名为getbookimg.rb


require 'uri'
require 'iconv'
require 'hpricot'
require 'net/http'
require "open-uri"
require 'fileutils'
##require 'extensions/string'

def get(loc, encoding=nil)
uri = URI.parse(loc)
msg = Net::HTTP.get(uri)

#if (!encoding)
return msg
#end

#return Iconv.conv('gbk', encoding, msg)
end

localdirname = "小说中文名"
base = "包含小说总目录的网页地址"

localdirname = ARGV[0]
base = ARGV[1]

dir_expand_path = File.expand_path(".")

dir_book_path = dir_expand_path + "/" + localdirname
dir_book_path_2 = dir_book_path + "/"

fnmax = 0
Dir[dir_book_path_2 + "*.htm*"].sort.each { |x|

rl2 = x.rindex('.')

iv2 = x[dir_book_path_2.length..rl2-1]

if ((iv2.to_i > 0) and (iv2.to_i > fnmax))
fnmax = iv2.to_i
end
}

book_content_path = ""
book_image_path = ""

doc = ""
html = ""

host = ""

webbookpath = ""
webbookcontentimagepath = ""

uselocalfiletodebug = false
if (uselocalfiletodebug)
base = "list.html"
doc = Hpricot.parse(File.read(base))
else
html = get("#{base}", 'gbk')
##puts html
doc = Hpricot.parse(html)
end

m = %r<http://([^/]+)>.match(base) or raise ArgumentError, "cannot parse URI: #{url_str}"
host = "http://" + m[1].strip
path = m.post_match
path = '/' if path.empty?

puts "主机名 #{host}"
puts "书籍所在网页路径 #{path}"

rl = path.rindex('/')
path = path[0..rl-1]
puts "分析出下载书籍网页的本地路径 path #{path}"

rl = base.rindex('/')
webbookpath = base[0..rl-1]
puts "发现下载书籍所在网页路径 webbookpath #{webbookpath}"

(doc/"a").each do |link|
shref = link.attributes['href']
if (shref == nil)
next
end
sind = shref.index('.html')
if (sind == nil)
next
end
#puts "发现书籍章节相对链结数据 #{link}"

#link = "993170.html"
link_v = link.attributes['href']
rl = link_v.rindex('.')

iv = link_v[0..rl-1]

#puts iv

if ((iv.to_i < fnmax) and (iv.to_i != 0))
#puts "书籍章节相对链结数据 #{link} 已经被下载,跳过..."
next
end

sind = (link.attributes['href']).index('/')
if ((sind == nil) || (sind > 0))
webbookcontentimagepath = webbookpath + "/" + link.attributes['href']
book_content_path = dir_book_path + "/" + link.attributes['href']
else
webbookcontentimagepath = webbookpath + link.attributes['href']
book_content_path = dir_book_path + link.attributes['href']
end

puts "发现书籍章节相对链结数据 #{link}"
#puts "分析后书籍章节内容下载路径 #{webbookcontentimagepath}"
#puts "分析后书籍章节内容本地保存路径 #{book_content_path}"
#puts "分析后书籍章节内容本地保存目录 #{File.dirname(book_content_path)}"
FileUtils.makedirs(File.dirname(book_content_path))

#############3
if (uselocalfiletodebug)
base2 = "993170.html"
doc2 = Hpricot.parse(File.read(base))
else
base2 = webbookcontentimagepath
html2 = get("#{base2}", 'gbk')
##puts html2
doc2 = Hpricot.parse(html2)
end

(doc2/"img").each do |imagelink|
imagehtmlpath = imagelink.attributes['src']
#imagelink.attributes['src'] = "." + imagehtmlpath
if (imagehtmlpath == nil)
next
end
sind2 = imagehtmlpath.index('.gif')
if (sind2 == nil)
next
end

#puts "在书籍章节内容中 发现图像链结数据 imagelink #{imagelink}"

sind2 = (imagelink.attributes['src']).index('/')
if ((sind2 == nil) || (sind2 > 0))
webbookcontentimagepath = host + "/" + imagelink.attributes['src']
book_image_path = dir_book_path + "/" + imagelink.attributes['src']
else
webbookcontentimagepath = host + imagelink.attributes['src']
book_image_path = dir_book_path + imagelink.attributes['src']
end#if sind2 == nill end

puts "分析后图像最终下载链接 webbookcontentimagepath #{webbookcontentimagepath}"
#puts "分析后图像最终本地保存路径 book_image_path #{book_image_path}"
#puts "分析后图像最终本地保存目录 #{File.dirname(book_image_path)}"
FileUtils.makedirs(File.dirname(book_image_path))

needrewritedata = false
data=open(webbookcontentimagepath.strip){|f|
if ((""+f.base_uri.to_s).eql?(webbookcontentimagepath))#如果返回的URL地址与传入的地址相等,说明文件存在可以准备下载
#puts "如果返回的URL地址与传入的地址相等,说明文件在网上有可以准备下载"
#puts f.content_type
if (File.exist?(book_image_path))#如果本地文件存在
#puts "如果本地文件存在1#{File.size?(book_image_path)}"
#puts "如果本地文件存在2#{f.meta['content-length']}"

if ((File.size?(book_image_path)).to_i != (f.meta['content-length']).to_i) #但是2者不相等,就需要重新下载了
puts "文件网上被更新,2者不相等,需要重新下载"
#f.read
needrewritedata = true
else
puts "图像文件下载后网上没有被更新,不用重新下载"
end
else#如果本地文件不存在,那么直接下载
#puts "如果本地文件不存在,那么直接下载"
#f.read
needrewritedata = true
end
end
}
if (needrewritedata)
data=open(webbookcontentimagepath){|f|
f.read }
open(book_image_path,"wb"){|f|f.write(data)}
end #needrewritedate end

end#do img end

(doc2/"img").each do |imagelink|
imagehtmlpath = imagelink.attributes['src']
imagelink.attributes['src'] = "." + imagehtmlpath
end

begin
outputfile = book_content_path

f = open(outputfile, 'wb')

htmlbook = ""#get("#{webbookcontentimagepath}", 'gbk')

f.puts doc2
ensure
f.close # ... and this always happens.
end

end




2007-11-12

Ruby on Rails 安装


安装Ruby:
http://www.ruby-lang.org/en/ 下载 ruby182-15.exe,安装Ruby。
添加环境变量 ruby-1.8.2\bin 到 path

运行 ruby -v 显示版本号,表示安装成功。

安装Rails:
(1) 远程安装:
运行 gem install rails --include-dependencies,安装Rails(需要连接网络)。

(2) 本地安装:
http://www.rubyonrails.org/ 下载 rails-1.1.0.gem,安装Rails。
运行 gem install rails-1.1.0.gem

Rails 需要依赖下面几个库,而且版本依赖很严格,从
http://rubyforge.org/ 搜索下载。
rake-0.7.0.gem
activesupport-1.3.0.gem
activerecord-1.14.0.gem
actionpack-1.12.0.gem
actionmailer-1.2.0.gem
actionwebservice-1.1.0.gem

运行 如下命令,安装。
gem install rake-0.7.0.gem
gem install activesupport-1.3.0.gem
gem install activerecord-1.14.0.gem
gem install actionpack-1.12.0.gem
gem install actionmailer-1.2.0.gem
gem install actionwebservice-1.1.0.gem

运行 rails -v 显示版本号,表示安装成功。

使用:
运行 rails path/to/your/new/application 创建一个新的项目。
运行 ruby path/to/your/new/application/script/server 启动服务。

手工安装非常麻烦,可以从
http://instantrails.rubyforge.org/ 下载InstantRails,全部搞定。

2007-10-21

学习Ruby的10条理由


最近Ruby On Rails开发相当的火热。这是一种崭新的Web程序开发方式。利用其先进的建构能为用户快速搭建Web平台提供帮助。
但很多开发者还不是很清楚为何自己需要转换到Ruby上去。h3raLd为大家列出了10条为何要学习Ruby的理由。

1.你可以使用所有语言的强大功能
首先是错误处理功能,要知道这可是任何一个做高级开发的人员必须掌握的功能。而在PHP里面,你只能将出错的内容打印在屏幕上,然后慢慢猜测是哪出了问题。而Ruby采用的是类似C++的try/catch模块法。
其次Ruby的名字空间也十分易用。再加上内建强大的正则表达式处理器和各种重载操作符,一切你能在其他语言中想到的实用技术,在这里都能找到。

2.你会爱上Ruby在细节方面的可爱之处

3.你不用再打什么分号了
在Ruby中,就和在Python中一样。不过这样你也会失去将所有程序写在同一行的机会,有的人可是很喜欢这样做的,希望你不是这样。

4.每个东西都是一个对象,就和现实一样
当我开始学习Java时,他们告诉我每个东西都是一个对象,于是我问:
"那么14和374346.678也是对象了?"
"傻瓜,他们只是数字!"
但是在Ruby中,所有数字、字符串、布尔量都是对象!这意味着你可以这样写:
"YOU SHOULDN'T ALWAYS USE CAPITALS".lowcase
到时屏幕上就会显示:you shouldn't always use capitals
而在PHP中,你得这样写:strtolower("YOU SHOULDN'T ALWAYS USE CAPITALS")
看看吧,你节省了时间,节省了括号,最重要的是,这样的程序更具可读性。将每个东西都当作一个对象后,显然对扩展你的思维极具帮助。

5.每个东西都有一个值
你将不再会使用return来返回一个值了。所有的Ruby语句都会返回一个值,这意味即使你在末尾没返回值,Ruby也会自动返回一个值。

6.你能随意在不同开发环境中自由切换
当你使用系统提供的类或者他人的类进行开发后一段时间,突然觉得某些函数或方法写得不好,应该自己来写一个。如果你在传统开发中,你有以下选择:

a.你修改原来那个类的源代码。但是一般都不推荐这样做。
b.你从那个类继承出一个新类,然后你自己慢慢添加代码。但是这会影响到你之前写就的代码。
c.你放弃,然后自己另外创建一个新类。这或许很好,但是却很费时费力。

在Ruby中,你只需简单的把新方法加入到原来的类中就OK。这其中不涉及任何修改源代码的行为。比如你想自动转换从米到英寸,你可以为Numeric这个数字类添加一个新方法:
class Numeric
def feet
self*3.2808399
end
end
从现在开始,你就为所有数字都添加了一个feet方法了。
5.feet #=> Returns 16.4041995

7.Ruby不支持多重继承

8.你不再需要XML了
对,我得承认XML的应用极其广泛。但是说实话,XML给人的第一印象的确很糟,结构不清晰,标记复杂,很难读懂。而且对程序来说,也很难描述和分析。因 此Ruby最爱的标记语言是YAML。这并不是说Ruby不支持解析XML,Ruby还是支持XML的,只是很多开发者认识到YAML的优异性能而从 XML转移到了YAML

9. Lambda is much more than a Greek letter

10.你能在Rails上使用它
你会发现Ruby on Rails是最好的开发模式。Rails是集成于Ruby其中的,因为Ruby提供了其他任何语言无法提供的优异性能。