• 让测试变的更快些--Spork!

    日期:2011-05-03 | 分类:ruby/rails | Tags:rails spork test

        在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已经预加载了。

    相关链接

     

  • Colour Your Code

    日期:2011-04-12 | 分类:ruby/rails | Tags:rails sinatra coderay

      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

    日期:2011-03-19 | 分类:js | Tags:js node.js

    什么是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的使用者都一定在使用着类似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 | Tags:ruby 后台任务 Resque Redis

    什么是后台任务?

      默认情况下,程序是按照代码从上到下依次执行的,在前面的任务完成之前,下一个任务是不会开始的。基于这个原理,当用户提交了一个比较耗时的请求时,他只能等待任务完成后才能进行下一步工作。在这个过程中,用户花了时间去做等待的事,这无疑不是好的用户体验,所以我们可以把程序优化成这样:用户仍然是提交一个比较耗时的任务,但我们的程序可以立刻响应,同时告诉用户:“您给我的任务我正在做呢,您先干点其他的吧,等我做好了再告诉您”。这样一来用户的体验明显提升,而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的一点经验,因为是初次使用,所以涉及的很浅。在刚接触它的时候感觉它的官方文档的例子不是很易懂,所以就额外在这写了一些,希望对读者有一点帮助。