Ruby 语言 思想驱动生活

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

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

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/

acts_as_taggable

这个世界到处都是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的时候,可以顺便更新这些属性:
# We can do some interesting things with it now
  person = Person.new
  person.tag "wine beer alcohol", :attributes => { :created_by_id => 1 }
  Person.find_tagged_with(:any => ‘wine’, :condition => "tags_people.created_by_id = 1 AND tags_people.position = 1")
3.统计功能
tags_count可以统计每个tag被用了多少次
# Gets the top 10 tags for all photos
  Photo.tags_count :limit => 10 # => { ‘beer’ => 68, ‘wine’ => 37, […]

Rails中使用ESI实现页面cache

什么是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,日文)
cd /home/my/rails/app/path
—-index.html—–
<h1>Welcome ESI!!</h1>
<p><esi:include src="/welcome/now" max-age="45"/></p>
esi标记里的就是ESI的内容了,应该比较好理解,max-age的意思就是页面缓存保留的时间,这里的话每45秒缓存就会被更新一次。
再来看看控制器里的代码:
./script/generate controller welcome now
—-welcome_controller.rb—-
def now
  render :text => "#{Time.now}"
end
启动Mongrel_esi:
mongrel_esi start
  ** Starting Mongrel listening at 0.0.0.0:2000
然后就可以去浏览器里看看了,是不是45秒那个显示的时间才更新一次。
上面的例子是标准的ESI写法,当然Rails中这样写就有点累了,这个时候就需要fragmentFu这个Rails的plugin了。
在ERB里,写法是这样的:
./script/plugin install http://mongrel-esi.googlecode.com/svn/trunk/plugin/fragment_fu
—-/app/view/welcome/index.html.erb—-
<h1>Welcome ESI!!</h1>
<p><%= render :esi => {:action => "now"}, :ttl => 45.seconds %> </p>
ttl这个名字比较亲切。
当然,ESI里面也能使用Cookie或者Http的request数据:
#query string
<p><%= render :esi => "/users/name/$(QUERY_STRING{my_name})" %> </p>
#Cookie
<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

<esi:try>
  <esi:attempt>
    <esi:include src="/latest" max-age="5" timeout="1"/>
  </esi:attempt>
  <esi:except>
    <esi:include src="http://static.foo.com/latest" max-age="5" […]

这段话有问题吗?

在看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的东西。

REST有什么好的

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的

DRECOM Award on Rails 2007

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

听Dave Thomas演讲

在台上是没穿鞋子演讲的,比想像的胖一点,尤其是肚子,呵呵。:-)
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 2007 第一天(前半)

日本名字叫日本Ruby会议,总感觉这个名字有点怪。
地点秋叶原旁边,新御茶的水,人数400以上,女性10人以上。据说今年的RailsConf的1400人中没有女的参加(?真的)。
其中使用Rails工作的大概1/3。
使用MacBook的有近一半。
早上提前20分钟就到了,9:30进场,10点开始。开始的时候matz还没到。
每个座位上都放了一个手提袋,里面有一些赞助公司的小礼物,宣传小册子等。Sun的是一块糖。
第一个是sasada,yarv的作者,现在还是东大的大学院生(中国的研究生)
比较简单介绍了一下,技术细节没讲太多,涉及到的有concurrency,fiber等。
另外澄清了一个谣言,就是去年有人说他要去的公司是sun。
第二个安定版ruby的现状和将来。演讲者的名字Googlepinyin还打不出来
主要说了1.8.5和1.8.6的现状,主要是bug修正等
估计到了1.8.7和1.8.8之后就不会再继续开发了。
第三个出场的是青木郎峰,写了不少书,包括RHG,Haskell 编程
主要是manual刷新计划。
第一第二阶段已经完了,
本来预计今年8.31第三阶段完成的,但是目前这个最后阶段进度只有2%,照这个速度,要到2050年才能完成。
第四个
今天见到Charles Nutter 和 Thomas Enebo了。他么确认了jruby1.0 release了 。现场一片掌声。
他们两个还演示了一下2个例子
1.jruby
jirb,jruby的irb,具备了自动完成功能,就是linux下的输入一部分命令然后按tab键的自动完成。
演示了在ruby中使用swing的frame,button和awt的actionlistener
还有演示了java的thread的例子。
2.jruby on rails
一个使用jdbc的web例子。
而且能打包成war文件,放在j2ee服务器上(这点比较强)。
上午结束。
下午1点开始是matz的主题演讲,当时真想上去握握手。
主题是2007年的Ruby和将来
Ruby开始,1993,2。
1.9.1 2007的圣诞节。
2.0,不好说,估计真的要
然后是企业对Ruby支持,包括sun(JRuby),ms(IronRuby),Thoughworks(24小时技术支持,雇佣xruby的中国人开发者)
据说twitter的负荷达到11000 req/sec
剩下的有时间再写。

在DreamHost上部署Rails程序

子域名labs.nanshapo.com,用ssh登录到系统。

[rollo]$ pwd
/home/liubin/labs.nanshapo.com
[rollo]$ rails front
/usr/bin/rails:17:Warning: require_gem is obsolete. Use gem instead.
create
create app/controllers
create app/helpers
…………………
create log/server.log
create log/production.log
[…]

Ruby on Rails on your Nokia N800

不知道这个N800在国内有没有卖的,看样子应该是linux os的手机,因为看到了个roo用户。
原文见:http://www.digitalknk.com/2007/05/27/howto-ruby-on-rails-on-your-nokia-n800/

« Previous Entries  

Locations of visitors to this page