Ruby 语言 思想驱动生活

Ruby,Rails,编程是一种乐趣。

Tag List for:

LuRuJu 将jude的模型当成Rails的model类使用

Posted by liubin on Thursday March 27 @ 11:15
Taged with: tagged , and

LuRuJu是Lube between Ruby and JUDE的缩写,它的目的就是无缝链接ror程序和jude的模型
特点包括:
1.配置简单,只需要把jude文件放到RAILS_ROOT/app/model下即可。Jude模型会作为mvc的m来被使用。目前实现了类之间的1对1,1对n关联。也支持类之间的继承关系。
2.不需要再维护migrate文件,只需运行
lor:db:create就可以了。表的定义使用jude文件中的定义。
3.可以往model里追加Ruby代码来扩种业务逻辑等
4.和config.cache_classes联动,不需要重启rails就可以修改jude文件并使之有效。
5.即可以用jruby,也可以用cruby

这个软件的作者是野村周平,文档 多是日文,不过看代码应该能看的差不多。
主页是 http://luruju.com/


用Ruby抓取网页通过ActiveRecord存到数据库

Posted by liubin on Friday March 7 @ 9:45
Taged with: tagged , , , and

用Ruby抓取网页通过ActiveRecord存到数据库

工作内容:抓取指定网页的规则的连接地址的内容,并取得其网页中指定部分的内容存到数据库。

技术点1:抓取并分析网页
采用hpricot,其主页可见(http://code.whytheluckystiff.net/hpricot/)。Hpricot is a very flexible HTML parser。
doc = Hpricot(open(url))
这个就是去的url的内容,返回一个doc,这个是Element类的实例对象。也可以认为是一个DOM。
可以对这个对象进行查找,修改等操作,具体见hpricot主页的文档。
技术点2:编码转换
网页可能为gbk编码,也可能为gb2312编码。
数据库为mysql,UTF-8编码,以防万一,在建立数据库连接之后,执行下列语句:
ActiveRecord::Base.connection.execute ‘SET NAMES UTF8′
把mysql客户端的编码也设为UTF8,以防出现乱码。
然后用Iconv转换抓取的数据:

ar_object.some_text = Iconv.new(”UTF-8//IGNORE”,”gb2312″).iconv(gb2312_data )
这个就是把gb2312的数据转换为utf-8了。
另外,不知道不进行上面转换,而直接实用gb2312编码的数据,在建立数据库客户端连接之后,执行
ActiveRecord::Base.connection.execute ‘SET NAMES GB2312′
是不是也可以呢,没试过。


acts_as_taggable

Posted by liubin on Friday September 14 @ 19:19
Taged with: tagged and

这个世界到处都是tag
而且这个世界上好像有两个acts_as_taggable,一个是dhh的plugin版的,一个是gem版的。
比较了半天,发现还是gem版的比较好(http://rubyforge.org/projects/taggable/)。
具体来说
1.gem对于不同的要tag的对象,可以用TagsTable1s格式的表来存tag和对象的关系,比如photo的tag用photos_tags表。
plugin版的则只用一个表taggings,用taggable_type这个字段来表示tag的对象类型。
2.可以为tag关系增加属性。
plugin版的tag关系表只有3个字段(不包括id),要想给这个tag关系加其它属性则比较困难。
gem则容易多了。
gem的tag和被tag对象之间的连接表除了tagid和被tag对象id,还可以有别的属性。
在给对象加tag的时候,可以顺便更新这些属性:

  1. # We can do some interesting things with it now
  2.   person = Person.new
  3.   person.tag "wine beer alcohol", :attributes => { :created_by_id => 1 }
  4.   Person.find_tagged_with(:any => 'wine', :condition => "tags_people.created_by_id = 1 AND tags_people.position = 1")

3.统计功能
tags_count可以统计每个tag被用了多少次

  1. # Gets the top 10 tags for all photos
  2.   Photo.tags_count :limit => 10 # => { 'beer' => 68, 'wine' => 37, 'vodka' => '22', ... }

4.性能可能gem的好一点
plugin版的好像是在给一个对象加tag的时候,会吧这个对象的tag先删掉,再全部加上,性能上有点浪费。

5.容易修改
gem版的写的比较简单,很容以自己进行扩展。
6.gem版的自带一个cloud,可以根据tag的不同显示不同大小的文字。


Rails中使用ESI实现页面cache

Posted by liubin on Monday September 3 @ 17:56
Taged with: tagged and

什么是ESI
ESI的全称是Edge Side Includes,是一个基于XML的标记语言,目的是在HTTP中组装各种资源。是由Oracle和Akamai等公司提议的,在W3C的网站也可以找到相关规格说明,最新的是2001年的了,也不是什么新东西。传统的cache技能基本都已页面为单位进行缓存,问题就是页面部分的动态内容可能比较多,而且是每个客户端的内容都不一样(比如个人的登录信息,欢迎xxx等。),缓存比较困难。ESI为了能把页面的一部分进行缓存,使用基于XML的标记语言,来描述对page内个内容的缓存情况。这样,服务器(缓存部分)就可以只缓存共同部分了。
ESI有点类似SSI,但是它比SSI功能更丰富。
目前支持/实现ESI的开源服务器包括Squid,Mongrel-ESI等,商用的有Oracle和Akamai的服务器。

要在Rails里支持ESI需要安装两个插件,一个是Mongrel用的插件Mongrel-ESI,一个是Rails用来处理ESI标记(tag)的fragmentFu。两个软件都可以在http://mongrel-esi.googlecode.com找到。
如何安装一下Mongrel-ESI我就不说了,因为我也没有装过,下面的代码我都没有试验过。
下面来看一下ESI的代码,下面是一个测试的例子(转自http://blog.tkmr.org/tatsuya/show/368-rails-10-esi,日文

  1. cd /home/my/rails/app/path
  2. ----index.html-----
  3. <h1>Welcome ESI!!</h1>
  4. <p><esi:include src="/welcome/now" max-age="45"/></p>

esi标记里的就是ESI的内容了,应该比较好理解,max-age的意思就是页面缓存保留的时间,这里的话每45秒缓存就会被更新一次。

再来看看控制器里的代码:

  1. ./script/generate controller welcome now
  2. ----welcome_controller.rb----
  3. def now
  4.   render :text => "#{Time.now}"
  5. end

启动Mongrel_esi:

  1. mongrel_esi start
  2.   ** Starting Mongrel listening at 0.0.0.0:2000

然后就可以去浏览器里看看了,是不是45秒那个显示的时间才更新一次。

上面的例子是标准的ESI写法,当然Rails中这样写就有点累了,这个时候就需要fragmentFu这个Rails的plugin了。

在ERB里,写法是这样的:

  1. ./script/plugin install http://mongrel-esi.googlecode.com/svn/trunk/plugin/fragment_fu
  2. ----/app/view/welcome/index.html.erb----
  3. <h1>Welcome ESI!!</h1>
  4. <p><%= render :esi => {:action => "now"}, :ttl => 45.seconds %> </p>

ttl这个名字比较亲切。

当然,ESI里面也能使用Cookie或者Http的request数据:

  1. #query string
  2. <p><%= render :esi => "/users/name/$(QUERY_STRING{my_name})" %> </p>
  3. #Cookie
  4. <p><%= render :esi => "/users/home/$(HTTP_COOKIE{UserID})" %> </p>

除此之外,ESI还有异常处理机能。因为ESI指令的include可以指向别的地址,所以,取得cache内容也可能失败。

比如下面的代码(来自http://revolutiononrails.blogspot.com/2007/08/advanced-rails-caching-on-edge.html

  1. <esi:try>
  2.   <esi:attempt>
  3.     <esi:include src="/latest" max-age="5" timeout="1"/>
  4.   </esi:attempt>
  5.   <esi:except>
  6.     <esi:include src="http://static.foo.com/latest" max-age="5" timeout="1"/>
  7.   </esi:except>
  8. </esi:try>

这个也应该比较好理解,如果尝试1秒内取得不到/latest的话,cache服务器就会放弃,而去取静态页面的内容。

另一不错的功能就是Invalidation,就是使已有的cache的内容失效,因为它cache的内容已经被更新过了。在Rails自带的cache功能里需要在action调用失效方法的,或者用sweeper回调。ESI则有invalidate指令:

  1. <esi:invalidate>
  2.   <?xml version="1.0"?>
  3.   <!DOCTYPE INVALIDATION SYSTEM "internal:///WCSinvalidation.dtd">
  4.   <INVALIDATION VERSION="WCS-1.1">
  5.     <OBJECT>
  6.       <BASICSELECTOR URI="/foo/bar/baz"/>
  7.       <ACTION REMOVALTTL="0"/>
  8.     </OBJECT>
  9.   </INVALIDATION>
  10. </esi:invalidate>

参考链接:

http://revolutiononrails.blogspot.com/2007/08/fragmentfu-fun-with-fragments.html
http://revolutiononrails.blogspot.com/2007/08/advanced-rails-caching-on-edge.html
http://www.w3.org/TR/esi-lang
http://blog.tkmr.org/tatsuya/show/368-rails-10-esi


这段话有问题吗?

Posted by liubin on Friday August 24 @ 15:39
Taged with: tagged and

在看Ralf Wirdemann 和Thomas Baustert的《RESTful Rails Development》,1.2节的why REST的时候说道:
Clean URLs. REST URLs represent resources and not actions. URLs always have the
same format: first comes the controller and then the id of the referenced esource.
The requested manipulation is independent of the URL and is expressed with the help of HTTP verbs.

说REST有着清楚简洁的URL风格,URL里不表示(带)action,是controller/:id这样形式的,至于对这个资源进行何种操作,是通过http header里的动词来指定的。
我是对这句话很有疑问,http header 里就4中操作,如果处理CRUD以外的action的话,怎么办?
Map.resources 的时候可以指定collection或者member的action,就是说url里还是会出现action的,比如users;top10,可以列出排名前十的用户,这个top10就是collection指定的users控制器的一个action。
这句话说的即使不错,也是不严谨的。对于刚接触REST这个词的人来说,很容易误解,误入歧途。

我觉得,不是说/projects/1就比/projects/show/1更RESTful了。
本来,URL就是RESTful的东西。

TAG:

REST有什么好的

Posted by liubin on Saturday August 11 @ 8:00
Taged with: tagged and

REST(Representational State Transfer )在Rails里已经被支持了,但是始终搞不清它到底好在哪里。以下均为个人理解,如果不对的地方请指正。
REST以资源为中心,在典型的oltp系统里这个资源就是一个数据库记录,分析层上是一个业务对象。
rest把资源放到URL里,而对资源的CRUD操作则放在http的header里。(因为现在的浏览器还只支持get和post,而delete和put则需要格外处理,rails里是用了input hidden控件)
对于对象的操作,不像以往那样表现在URL上,比如/blog/delete/1表示删除id为1的blog项目,在rest里,只需要/blog/1至于是删除,还是更新,在URL里是看不出来的(这样会不会有问题?比如用户从URL看以为当前是show,F5刷新了一下,结果实际上是delete)。
REST真的把URL变得简单了?如果只是长度小了的话可以算是。也许REST的好处就是使得URL的数量变小。

当然,以上看法只是对使用浏览器来操作web应用的场合,至于web service的话,不需要用户了解多少url等内容,也许会确实变得简单。
这里有一个简单的介绍教程,REST的

TAG:

Japan RubyKaigi2007的一些图片

Posted by liubin on Wednesday June 13 @ 22:00
Taged with: tagged , and

I download some of this picture from http://www.flickr.com
because for some reason china user can not access flickr for some days
发的书包

539392850_e7b2f65c53.jpg

女主持人,不知道从哪里借来的。


542469227_3cda84b7f2.jpg

Charles Nutter / Thomas Enebo 在讲JRuby。


537848044_5405ee8eb2.jpg
(more…)


DRECOM Award on Rails 2007

Posted by liubin on Wednesday June 13 @ 20:52
Taged with: tagged

Drecom 公司为了在软件工程师中推广Rails,从2006年就举行了DRECOM Award on Rails。
今年是第二年了,最高奖100万日元,合8300美元左右,合人民币6万多,如果人民币再升值,就快不到6万了。
报名时间为6月2号到9月25号。
国内的团队不知道有没有想要试试看的。
具体信息可见http://rails.drecom.jp/english_top

TAG:

听Dave Thomas演讲

Posted by liubin on Sunday June 10 @ 21:08
Taged with: tagged , and

在台上是没穿鞋子演讲的,比想像的胖一点,尤其是肚子,呵呵。:-)

Dave像爱自己的孩子一样爱着Ruby。
而且和他的孩子一样,Ruby也被说为进入了思春期(青春期)。
交友关系也变了,而且还开始和别人约会,包括:
IronRuby,JRuby,Rubinius,Gaden’s Point 等。

另外还讲了些关于Ruby的危机:
1.对社区的破坏。
2.大公司的分割。(Ruby不是sun的Ruby,也不是微软的Ruby)
3.不同的意见的冲突(好的,坏的,如何区分)
4.爆发性的增长。(预计近2,3年之内)

最重要的QA
Q.很早就使用Ruby的人抱怨Rails太复杂了。Dave怎么看?
A.这是个很好的问题,因为自己在Rails社区里的感受不太好,3个星期之前已经脱离Rails社区了,以后主要集中于Pure Ruby。
Ruby社区还没有变划(变质?)。Rails成长的太快,real busy ,没时间让它变得nice,3周前还说[we want rails to be nice],2天后180度的变了。
不过,还想给Rails一个机会。
(上面可能说的有点不完整)

关于Dave是否脱离Rails,我也不敢肯定,但是那天确实说了感到Unhappy,想集中于Pure Ruby。
再说他们公司还要搞Rails培训和出书呢。

可以看这里,记得比较详细,英文不少。
http://jp.rubyist.net/RubyKaigi2007/Log0610-S5.html


Japan Ruby Conf 总结(非正式)

Posted by liubin on Sunday June 10 @ 20:56
Taged with: tagged , and

1.主要话题
YARV, JRuby, Rails, 企业开发
未来会很好,druby很重要(不少项目用到了,估计到企业级别的应用更是),Jruby会很火
2.关键字:[A-Z]DD
MDD不是模型驱动开发,这里的M是mascot(吉祥物)的意思。
很多演讲者或者项目都添加了一些卡通的吉祥物。
  演讲的时候主席台上是有两个投影仪,一个是显示幻灯,一个是显示IRC,带了电脑的可以登录到IRC在线交流,大会中的爆笑话题多数是从IRC里出来的。 日本人喜欢漫画,还有游戏,从这次大会就可以看出来。很多话题都是和游戏有关的,PS3,wii,FamilyCon等。还有一些演讲就是用wii的遥控器来控制的。

3.NoRuby,NoLife
发的书包上是这么写的。 总觉得有点夸张,如果说with Ruby,more Lift比较合适。
bag
JRuby的开发者穿的T恤后面则是include java,不过不是他们演讲那天穿的。Sun发的是一块戒指形状的糖。

4.Mac 电脑
很多人都是用的Mac的电脑,不愧是资本主意国家啊(笑)。
非常炫的效果,害得我也想买一个,不过没钱。
5.From Java To Ruby
这本书在很多人的演讲中出现了。
6.演讲(presentation )手法很强
ppt只是最基本的,还有很多用rabbit的,当然还有人专门发表了一小段关于如何presentation 的,幻灯片能左右上下有选择等的移动,贴近人的思维,使听者更容易理解。也有拿wii的遥控器的。
还有一个干脆自己一句话都没说,在幻灯片上画了两个人物来对话,听众都变观众了。
最酷的还是RubyCocoa这个项目的介绍,也许是Mac酷吧。平锅健儿的也非常有意思,是通过自己在桌子上摆放卡片,描画等,直接通过摄像机将自己的动作投影到屏幕上的。具体的内容可以见稍后的文章,关于平锅的。
.更多,后面补充。
7.爱驱动
matz和dave都提到了爱,或者love。你呢。

更多信息可以参考(部分英文)
http://jp.rubyist.net/RubyKaigi2007/
http://jp.rubyist.net/RubyKaigi2007/Program-EN.html



Locations of visitors to this page


Recent Comments