-
让测试变的更快些--Spork!
日期:2011-05-03 | 分类:ruby/rails |
在Rails项目中,测试代码花费的时间主要包括两个方面:加载Rails项目环境的时间和真正执行测试用例的时间。当一个项目中包含越来越多的model和controller时,加载Rails环境也变得越来越耗时,Spork的出现就是解决这个问题的,它不仅仅可以帮助我们节省成百上千次测试*每次1~5秒的加载时间,更是让我们在痛苦而无意义的等待中解脱出来。
使用spork也非常的简单,只需按如下步骤配置即可
1 2 3 4 5 6 7 8 9 10
gem install spork # 这个操作会修改rspec_helper.rb文件 spork --bootstrap 添加--drb到指定文件中 # 如果是Rails2.x spec/spec.opts # 如果是Rails3 .rspec spork rspec # 或 bundle exec spork
保留当前的进程,新开窗口执行测试代码,你会发现系统已经不会再花时间去加载Rails环境了,Spork已经预加载了。
相关链接
- http://upstre.am/blog/2009/07/kickstart-rspec-with-spork/ 介绍如何使用
- http://blog.carbonfive.com/2010/12/10/speedy-test-iterations-for-rails-3-with-spork-and-guard/ 喜欢autotest?请看这里
-
Colour Your Code
日期:2011-04-12 | 分类:ruby/rails |
CodeRay是一个为代码高亮的Ruby gem,它支持Ruby, Python, JS, Java等大多数主流语言。如果你需要在web上展示带有颜色高亮的代码(比如说下面),CodeRay是一个不错的选择。
1 2 3
def say puts "hello world!" end
去年的七月份,我用Rails2.3写了一个web app,用户可以访问这个地址,粘贴代码后得到目标代码,这样简化了操作流程,也可以脱离本地环境的依赖。前两天突然在自己电脑里翻出了这个app的源代码,一方面感觉这么简单的功能就使用了一个Rails的工程,有点杀鸡用牛刀的感觉,另外一方面想把这个功能再丰富一下。于是我想起了Sinatra,这是一个更为轻量级的框架,它仅仅提供了controller和view的支持,正好我的需求也没有数据存储,于是就选定了它开始重写并在几天后成型,地址在这 http://colourcode.heroku.com。它支持class和style两种CSS着色方式,支持一键复制目标代码。
因为我会持续用到这个功能,所以会持续更新它。如果读者有任何好的建议,欢迎留言。

-
什么是Node.js
简单来讲,通过Node.js,我们可以像使用Ruby, Python一样编写Server端的程序。安装
brew install node # mac
或者可以在 http://nodejs.org/#download 下载源代码进行安装安装npm
curl http://npmjs.org/install.sh | sudo sh
不是很精确的说,npm相对于Node.js就像gem相对于Ruby一样,使用它可以安装很多的插件,这里有一个站点可以搜索 http://search.npmjs.org/Hello World
1 2 3 4 5 6
var http = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'Content-type': 'text/plain'}); res.end('Hello world!\n'); }).listen(8124, '127.0.0.1');
将上面代码写入到文件hello.js中,通过如下命令启动服务
node hello.js
用浏览器打开 http://127.0.0.1:8124 即可看到输出的 Hello World!
其他资源
下面分别是两个博客里的文章系列,写的不错,值得参考一下。
-
Vi技巧:在不重启Vi的情况下重新加载snippet脚本
日期:2011-02-24 | 分类:工具 |
我想每个Vi的使用者都一定在使用着类似SnipMate 的插件,通过这个插件,我们可以轻松的通过一个Tab生成一大段常用的代码。
最初使用SnipMate的时候,我在网上找了一些别人现成的snippet脚本来用,开始还不错,但后来觉得有一些脚本写的不符合自己的习惯,便去修改它。这样会带来一个问题:当我修改snippet脚本后,我得重启Vi后才能生效,假设现在我已经打开了3个标签页,关掉后再重启将会是多么浪费感情的事啊。于是,我便找了以下代码解决该问题
1 2 3 4 5 6 7 8 9 10 11 12
" 当修改snippet脚本后,执行,rr可重新加载脚本,无需重启Vim function! ReloadSnippets( snippets_dir, ft ) if strlen( a:ft ) == 0 let filetype = "_" else let filetype = a:ft endif call ResetSnippets() call GetSnippets( a:snippets_dir, filetype ) endfunction nmap ,rr :call ReloadSnippets(snippets_dir, &filetype)
现在,你只需要在重新加载脚本的时候按下,rr 即可。在脚本的最后一行,你可以修改nmap 后面的字符来自定义快捷键的映射。
-
使用Resque运行后台任务
日期:2011-02-20 | 分类:ruby/rails |
什么是后台任务?
默认情况下,程序是按照代码从上到下依次执行的,在前面的任务完成之前,下一个任务是不会开始的。基于这个原理,当用户提交了一个比较耗时的请求时,他只能等待任务完成后才能进行下一步工作。在这个过程中,用户花了时间去做等待的事,这无疑不是好的用户体验,所以我们可以把程序优化成这样:用户仍然是提交一个比较耗时的任务,但我们的程序可以立刻响应,同时告诉用户:“您给我的任务我正在做呢,您先干点其他的吧,等我做好了再告诉您”。这样一来用户的体验明显提升,而Resque就是一个做类似工作的插件。
什么是Resque?
Resque是一个基于Redis的后台任务处理插件,而Redis是一个key-value的数据存储引擎,因为我们在处理后台任务时可能同时会有很多任务要做,而这些任务就存储在Redis中进行“排队”,决定下一个该进行哪个任务了。所以在使用Resque时,要启动Redis服务才会生效。
安装/启动Redis
下载Redis源代码(https://github.com/defunkt/resque )后进行编译,然后有个make test的命令可以进行测试,我在自己的电脑上没有测试成功,但仍然不影响使用,所以暂时就没有深究。现在你有两个方法可以启动Redis的server,因为它本身就是一个二进制文件,所以进入src目录下直接./redis-server即可,或者make install装入系统后执行redis-server启动服务。这里(https://github.com/ezmobius/redis-rb)的README有一些关于redis简单的使用方法。
使用Resque
我们需要把执行后台任务的代码放到一个名叫perform的方法中,同时为该方法所在的class或module定义一个实例变量,示例如下
1 2 3 4 5 6 7
class User @queue = :food def self.perform(name) puts "your name is #{name}" end end
这里需要注意@queue这个实例变量,它是必不可少并且名字固定。现在我们执行以下命令监听后台任务
rake resque:work QUEUE=food
这里的QUEUE的值和User的@queue的值相同。
启动console,然后开始调用这个方法
Resque.enqueue(User, 'ilstar')
这时你会发现在执行rake的终端输出了内容。到此为止,我们的小实验已经完成。这个方法的调用其实是异步执行的,读者可以自己添加一些耗时方法以加强效果。
一些问题
* 这个过程中,你可能会发现你的rake -T中没有包含resque的相关任务,方法如下
1 2 3 4
# in lib/tasks/resque.rake require 'resque/tasks' task "resque:setup" => :environment
* 在执行rake的时候你会被告知需要SystemTimer这个gem,添加进去即可。
* perform方法是类方法(这个叫法不准确,因为这个方法可以放在class或module中,记得在方法前面加上self.就行了)
* 这里为啥有个redis-rb?因为Redis是用C语言编写的库,而我们使用的语言是Ruby,所以它的存在就是为了让我们更容易的使用Redis.
* Resque生效的必要条件:启动redis-server,执行rake resque:work或resque:workers监听。
相关链接
http://rubylearning.com/blog/2010/11/08/do-you-know-resque/
https://github.com/blog/542-introducing-resque
http://blog.redistogo.com/2010/07/26/resque-with-redis-to-go/
最后
以上就是我初次探索Resque的一点经验,因为是初次使用,所以涉及的很浅。在刚接触它的时候感觉它的官方文档的例子不是很易懂,所以就额外在这写了一些,希望对读者有一点帮助。







