Ruby&Rails

十个不可或缺的ruby gems

在我编程的时候有些东西是必须的。 于是我总结了这个 10 个最重要的 ruby gems 列表, 它们将使你的生活变得更轻松, 即使你只是花少量的时间用 ruby 编程。
  Gems 有很多, 不过这些都是精华!
  capistrano
  Capistrano 是 Rails 应用程序开发更加从容。 它还是一个用来和远程服务器交互的聪明的 framework 。 事实上我已经备份了用 Capistrano 写的代码, 作为 Rake/Net::SSH 或者 shell 代码之外的另一个选择。
  chronic
  rubyforge.org/”>Chronic 是一个自然语言分析器, 它的名字是个俏皮的双关。
  >> Chronic.parse(’3rd wednesday in november’)=> Wed Nov 19 12:00:00 0000 2008ferret
  Ferret 会让你的老板、客户爱死你。 它提供了快速文本查询的工具, 你甚至可以可以给 PDF 文件和 Office 文档加索引。 我已经在很多网站上使用 Ferret 了, 我的客户们都说:“ 哇, 这看起来像 Google!”
  hpricot
  hpricot 是一个快速、容易上手的 HTML [...]


Rails性能优化之 ruby解析器的优化

来自己javaeye的原文:http://robbin.javaeye.com/blog/157731
ruby的解析器性能是很糟糕的,ruby早期的主要用途是取代perl写批量处理的脚本的,并不是为服务器应用编写的,因此在内存分配策略上非常不适合服务器应用。Stefans Kaes编写了一个ruby GC的补丁文件,在railsbench下载包里面提供了。虽然当前Railsbench提供的GC补丁只有针对ruby 1.8.4和1.8.5版本的,但是在ruby 18,6上面使用1.8.5的GC补丁也完全没有问题。GC补丁的作用主要是针对Rails应用开大了ruby的内存堆,可以有效提高内存堆的利用率,降低GC的频率。根据Stefans Kaes提供的测试数据,打补丁并且调整参数以后,GC的频率下降到只有原来的1/10还不到。降低GC频率尽管并不能够提高单个请求的执行速度,但是可以增加整体应用的负载能力。
JavaEye的服务器上也使用了GC补丁,并且根据推荐参数进行了调整。在使用GC补丁之后,Web服务器的CPU负载下降了大概15%左右,效果非常显著。当然开大内存堆的代价就是ruby进程会多消耗内存,在我们的服务器上,ruby打补丁之后多消耗了50%左右的物理内存。


Rails常用命令整理

——
GEM:
gem install rails –include-dependencies
gem install rails -v=2.0.2
自动安装rails
——
1.1 创建Rails应用程序
$ rails [_VERSION_] app_name
可选项:
VERSION: 指定rails的版本(如果安装了多个rails版本),VERSION前后各加一下划线, 如”_1.2.6_”
-d, database=xxx 指定安装一个数据库(mysql oracle postgresql sqlite2 sqlite3 ), 默认情况下是数据库
-r, ruby-path= 指定Ruby的安装路径,如果没有指定,scripts使用env去找Ruby
-f, freeze (冻结)freezes Rails在vendor/rails目录
1.2 API Documentation
$ gem_server
启动一个WEBrick服务器。这时候你可以通过Http://localhost:8808/ 打开浏览器去查看rails API文档
1.3 Rake
rake db:fixtures:load
# 载入fixtures到当前环境的数据库
# 载入指定的fixtures使用FIXTURES=x,y
rake db:migrate
# 迁移数据库通过在db/migrate目录下的脚本.可以指定版本号通过VERSION=x
——-
* db:charset 检索当前环境下数据库的字符设置
* db:collation 检索当前环境下数据库的校对
* db:create 用config\database.yml中的定义创建当前 [...]


Ruby on rails中Rake的经典教程

最近在用rake结合svn来写一个Daily build报告。
我们平台的后台job大部份都是用rake来实现的,总结一下,用rake写后台job有以下一些好处:
1.  rake可以与ruby on rails紧密结合,很方便就可以调用rails框架的一些功能。如:调用model进行数据处理。
2. rake支持调用shell脚本,可以与shell结合使用。
3. ruby大量类库支持。
以下是关于rake的一个经典的教程
原文:Ruby on Rails Rake Tutorial (aka. How rake turned me into an alcoholic)
引言:作为一个rails的开发者,你可能很熟悉使用rake进行你的测试,或者使用rake db:migrate运行你的migrations,但是你真的知道Rake的背后故事吗?你意识到可以自己写一个Rake任务或者一个有用的lib吗?
下面是我们使用Rake任务的例子:
1、给列表中的用户发送邮件
2、每晚数据的计算和报告
3、过期或重新生成缓存
4、备份数据和svn版本(how’s this : subversion repository)
5、运行数据处理脚本(sort of,how much is called this )
6、Pouring drinks to get a good buzz on(一句玩笑,是这两位仁兄的风格)

这篇文章中,我们将讨论为什么要创建Rake,和他怎么样帮助我们的rails应用。最好你可以写自己的Rake。
一、历史回顾:make
为了了解Rake的来历,我们先了解一下Rake的爷爷:Make。
让我们回到那个代码块需要编译,解释性语言和iphone还没出现在地球上的时代。

回到那时,我们下载的大型程序,还是一堆源代码和一个shell脚本。这个shell脚本包含了所有需要用来compile/link/build的代码。你需要运行“install_me.sh”这个脚本,每一行代码将被运行(编译每一行源文件),然后生成一个你能够运行的文件。
对于大多数人这样是不错的,但是对于程序开发人员却是一个不幸。每次你对源代码进行一个小的改动,并进行测试的时候,你需要回到shell脚本,并重新编译所有的源代码,显然对于大的程序“那是相当的”耗时的。
1977年(作者出生那年,我78年),贝尔实验室的Stuart Feldman创造了“make”。解决了编译时间过长的问题。Make用来编译程序,取得两方面的进步:

Stuart Feldman
(1)Make可以发现哪个文件在上一次编译后改动过,根据这点,再次运行Make时,仅编译改动过的文件。这个很大程序上减少了重新编译大型程序的时间。
(2)Make可以进行从属跟踪。你可以告诉编译器,源文件A的编译需要源文件B,源文件B的编译需要源文件C,所以Make在编译A时发现B没有编译,将会先编译B。
可以这样定义:Make是一个可执行程序。像ls或dir一样。让Make理解如何让编译一个项目,需要创建一个makefile文件,描述所有的源文件和依赖关系。makefiles有自己的语法,你不用去了解。
这些年Make出现了其他的变体,并且被其他的语言使用。事实上,ruby用户在rake出现前也在使用它。
“但是,ruby并不需要编译,我们用它来干嘛?”
是啊。ruby是一个解释性语言,我们不需要编译它的源代码,所以ruby程序员为什么使用它呢?
两个重要的原因:
(1)创建任务
在大型的应用中,你经常编写脚本,在命令行下运行一些任务。比如清除缓存,维护任务,或者迁移数据库。你可以写一个MakeFile来组织你的任务,而不是写十个不相干的脚本(或者一个复杂的)。这样你可以简单的运行:“make stupid”。
(2)从属任务跟踪
当你开始写一些维护任务的时候,可能发现有些任务的使用可能有重复。比如,“migrate”任务和“schema:dump”都需要链接数据库,这样我可以创建一个任务”connect_to_database”,使“migrate”和“schema:dump”都依赖于”connect_to_database”,这样下次运行“migrate”时,”connect_to_database”会先于“migrate”运行
二、如何得到Rake
几年前,Jim Weirich在一个java项目上使用了Make,他发现如果在他的Makefile中写一小段ruby代码将会带来非常大的方便。所以他创建了Rake。

左:Jim Weirich,中:Jason Seifer,右:Gregg Pollack
(后面两位为本文作者)
Jim 为Rake创建了任务功能,附属关系跟踪,甚至创建了时间段判断(timestamp recognition),(在上一次编译的基础上仅编译改动的部分),当然,对于ruby,我们并不需要编译。
我很想知道Jim在代码里做了什么,你也想知道吧。Jim可能从来没想给这个代码写个文档,可能现在他也是被烦透了,写了一个。呵呵
三、Rake如何工作
开始我想给这个部分起名为”How to get wasted with Rake”。
那么我想喝点酒,该怎么做呢?
1、去买酒
2、喝酒
3、喝醉

如果我要使用Rake完成这个任务,我会创建一个“Rakefile”文件:
task :purchaseAlcohol do
[...]


如何解决Ruby on Rails – Mysql::Error: Lost connection to MySQL server during query:

Ruby on Rails – Mysql::Error: Lost connection to MySQL server during query:
前段时间,我们的CE平台不断出现上述错误。原因是:mysql server 的链接断开后,Rails的Active Record没有检测到,断续执行数据库查询。
Mysql链接保持时间默认为3600秒,在/etc/my.cnf 里可以修改名为wait_time参数的值以改变链接保持的时间。
Rails中Active Record的并不会自动检测与数据库的链接是否是活动的,断开后也不会自动重新链接;如果mysql链接超时,自动断开后,Active Record并不知道,再执行时,就会抛出Mysql::Error: Lost connection to MySQL server during query:的错误。
解决方法时:修改Active Record检证时间。
     修改config/environment.rb配置文件,将config.active_record.verification_timeout = XXX 这句加入到Rails::Initializer.run do |config|  ….  end中, 值设为小于或等于mysql wait time的值 。
    
例如,mysql server 的wait_time=120,那我们rails的设置应该如下:
Rails::Initializer.run do |config| 
     config.active_record.verification_timeout = 118   #注,理论上小于等于120都没问题的
    ………
end


MC Inside