29 September 2014

缘起


现代社会,是一个信息爆炸的时代。何为爆炸,那就是每天,每时,每刻,都可能有海量的信息向你潮涌而来,将你淹没,个人如同一叶扁舟般,在波涛汹涌的海面上,随波逐流,不知所措。

其实,我表达的是,软件技术的Demo总是简单的,而现实世界的应用程序确是庞大复杂的。比如,Rails的应用程序,小小的应用程序居然用到了各种各样的Gem包,搞的我不知从哪个开始下手。为此,一个一个来,一步一个脚印,慢慢的总结。

Gem包按类型分两种: 功能类gem包和资源类gem包。备注: 资源类的gem包存在的意义是,可以通过bundle对js/css这样的资源进行管理,如同javascript中bower提供的功能那样。

模型的GEM包


模型同数据库关系密切,数据库简单则模型简单,数据库复杂,模型也简单不到哪里去。这个世界上的数据库管理软件实在太多,太多的选择导致复杂的数据库环境,从而提升了软件的复杂度,最直观的表现就是依赖很多GEM包:

数据库相关

  • mysql2: mysql 到ruby的驱动
  • mongoid, Mongoid是一个MongoDB的Ruby ODM(Object-Document-Mapper,对象文档包装器)封装,Mongoid的设计目的是为那些使用了Ruby的ActiveRecord 或 Data Mapper 的开发者提供方便的MongoDB操作接口,即提供与ActiveRecord类似的数据库访问接口。
  • mongoid_time_field, mongodb的时间类型驱动
  • carrierwave-mongoid, carrierwave的mongodb的支持,与mongodb的GridFS(存储大文件的数据类型)系统工作,具体是为应用程序提供上传文件的功能。
  • mongoid_slug, 对基于mongodb的模型,生成插入的或永久链接的URL。
  • mongo_followable, 为Mongoid和Mongo_Mapper添加follow特性,具体的,可能是为了网站中的用户建立follow关系。
  • mongoid-tree, 使用物化路径模式的Mongoid的文档的树形结构。
  • tenacity: 管理由不同的数据库支持的模型之间的管理,比如项目中涉及了很多不同的数据库(mysql、mongodb之类)时
  • public_activity, 简单的模型追踪
  • recommendable, 为Ruby/Redis应用程序使用喜欢/或这不喜欢的推荐机制,有点类似推荐系统的味道
  • acts_as_tree, Rails的modal的插件
  • rest-client, Simple HTTP and REST client for Ruby, inspired by microframework syntax for specifying actions.

Sunspot相关(与搜索相关的):

目前,我要弄明白其实现机制,然后,将其删除掉。

  • sunspot_rails
  • sunspot_solr
  • sunspot_mongoid, 对接mongodb的sunspot驱动包

Solr是一种利用Java实现的通用搜索引擎,基于Apache Lucene的全文搜索服务器。此外,要在应用程序中使用Solr,需要提供特定的配置文件。此外,Solr依赖java开发环境。

权限相关

  • devise, 灵活的基于warden(通用的基于Rack的权限框架)的授权解决方案。

特点:

  1. Is Rack based;
  2. Is a complete MVC solution based on Rails engines;
  3. Allows you to have multiple models signed in at the same time;
  4. Is based on a modularity concept: use just what you really need.
  • devise-async, # 相应的同步解决方法。
  • omniauth, omniauth是一个使用Rack中间层的灵活的授权系统。
  • omniauth-weibo-oauth2, 微博授权
  • omniauth-qq-connect, qq授全
  • omniauth-linkedin-oauth2, linkin授权

auth授权是国际认可的授权解决方案,对外提供的商业api都需要使用该授权。具体而言,看到了网易有道云笔记使用了该授权。

图像处理相关

  • mini_magick, 和ImageMagick类似,是其的轻量级对手,主要是图像处理相关的。

文档处理相关:

  • roo, 1.10.1 Roo provides an interface to Open Office, Excel, and Google Spreadsheets。解决一些需要将Excel文档导入数据库的需求。
  • pdf-reader, pdf阅读器
  • pdftoimage, pdf转化为image的gem包, 用作PDF预览
  • chinese_pinyin, 拼音

任务处理相关:

  • resque, 很重要的,简介为:用于创建后台任务的基于Redis的Ruby库,其将任务放置到多个队列中,并用于随后的处理。
  • capistrano-resque, 部署任务相关
  • resque-scheduler, 任务安排相关。
  • rufus-scheduler, ruby的任务安排
  • resque_mailer, 邮件任务
  • resque-loner, 支持在resque中的特殊任务

Resque存在对应替代者,Sidekiq(简单的,有效的后台处理Gem包,号称1个进程干了20 Resque进程的活)。 Sidekiq项目地址: https://github.com/mperham/sidekiq , 项目地址: http://mperham.github.io/sidekiq/

通用配置

  • configatron, 配置,强大的,简单的,特性丰富的配置系统。
  • settingslogic, 直观的简洁的方式,将erb嵌入到yaml中。
  • sanitize, 基于白名单的HTML和css的 ruby 洗手液。RubyWhitelist-based Ruby HTML and CSS sanitizer.
  • ckeditor, 编辑器
  • nokogiri, Nokogiri (鋸) is an HTML, XML, SAX, and Reader parser with XPath and CSS selector support
  • xmpp4r, 0.5 A XMPP/Jabber library for ruby,两种IM通信协议的ruby包,可用来实现聊天功能
  • rubyzip, ruby的压缩软件包

网站的GEM包


通用配置

  • rails, rails gem包,可指定的Rails的版本,是RoR应用程序中最重要的Gem包
  • rails-i18n, rails国际化相关的工作,主要就是一些文件之类的。地址: https://github.com/svenfuchs/rails-i18n
  • mysql2, mysql的ruby驱动

技巧: 在Gemfile中,通过group :name do …. end为不同环境设置不同的Gem包下开发

assets分组

  • sass-rails, Ruby on Rails stylesheet engine for Sass(Sass stylesheet language),配置文件为config.sass。网站:https://github.com/rails/sass-rails
  • coffee-rails, CoffeeScript adapter for the Rails asset pipeline。网站:https://github.com/rails/coffee-rails
  • turbo-sprockets-rails3, 通过只编译修改的文件来加速你的Rails 3的assets的预编译,并且,编译一次生成所有的asset。网站:https://github.com/ndbroadbent/turbo-sprockets-rails3
  • uglifier, >= # Ruby wrapper for UglifyJS JavaScript compressor(压缩器),用来解析,美化,压缩JavaScript代码(NodeJS),网站:https://github.com/mishoo/UglifyJS
  • therubyracer # 将V8 JavaScript引擎嵌入到Ruby。网站地址: https://github.com/cowboyd/therubyracer
  • less-rails #The dynamic stylesheet language for the Rails asset pipeline, 由于项目中引入了Bootstrap,所以需要使用该Gem包。网站:https://github.com/metaskills/less-rails
  • hogan_assets #使用hogan.js在sprockets以及Rails asset pipeline 上编译mustache模板(templates语言), hogan.js就是Mustache的模板编译语言。
  • closure-compiler # A Ruby Wrapper for the Google Closure Compiler,这也是一个javaScript相关的gem包, 用来编译压缩JavaScript。closure-compiler本身是用java写的。官方地址:https://github.com/documentcloud/closure-compiler

备注: Rails asset pipeline和sprockets相关。在使用Rails生成的项目中,这样的的几个Gem包是默认的存在的:sass-rails、coffee-rails、uglifier。

思考: 最近想要在Rails中大量的应用Ajax效果,买了几本书《Rails之道》和《Ajax on Rails》,发现其上都在介绍如何使用RJS。昨天,克隆下GitLab的代码, 浏览了一下其中的路径和文件名, js相关的文件名: js.erb, js.coffee, js.haml,其中模板大多以html.haml为主。程序是写给人看的,所以,语法的简介很重要。

rack相关

staging部署

  • rvm-capistrano, RVM和cap集成的包,地址:https://github.com/wayneeseguin/rvm-capistrano

development分组

  • quiet_assets, 改变assets pipeline记录消息。地址:https://github.com/evrone/quiet_assets
  • debugger, 在github上只看到了Ruby-debug以及pry-debugger, 其中pry-debugger的描述中有提到debugger这个包,感觉不是很有用。
  • annotate, 用来给ActiveRecord中的模型添加注释的gem包,地址: https://github.com/ctran/annotate_models
  • better_errors, 为Rack应用程序提供更好的错误页,用来代替Rails提供的错误页面,使用过的效果确实相当的不错。地址:https://github.com/charliesome/better_errors
  • binding_of_caller, C编写的,用来在MRI虚拟机中检索方法的调用序列。地址:https://github.com/banister/binding_of_caller
  • meta_request # 从Rails Panel(Rails开发的Chrome扩展)中提出的gem包,不知有何用处
  • newrelic_rpm, 一个Rails的性能监视工具,主要可以获取服务器的数据库访问的性能
  • newrelic_moped, 插桩工具,检测代码覆率,地址:https://github.com/stevebartholomew/newrelic_moped

test分组

  • rspec-rails, rspec-rails是一个单元测试框架,专为Rails3和Rails4设计,功能类似Test::Unit,属于行为测试框架。地址:https://github.com/rspec/rspec-rails
  • factory_girl_rails, 这是一个fixture replacement,主攻测试部分的。
  • database_cleaner, 在Ruby中清除数据库的策略,用来创建干净的测试环境,对一部分测试很有用。网站地址: https://github.com/DatabaseCleaner/database_cleaner

备注: 可以通过path和git选项了设置gem包, 以Ruby语法的角度来看,gem其实就是个方法调用。

assets pipeline相关(特别是jQuery)

  • jquery-rails, 在Rails 3中自动使用JQuery的gem包,地址:https://github.com/rails/jquery-rails
  • jquery-ui-rails, jQuery UI for the Rails 3.1+ asset pipeline,地址: https://github.com/joliss/jquery-ui-rails
  • twitter-bootstrap-rails, Twitter Bootstrap for Rails 3.x - 4 Asset Pipeline,网站: https://github.com/seyhunak/twitter-bootstrap-rails
  • bootstrap-kaminari-views, 和上面介绍的那个工具有关,网站:https://github.com/matenia/bootstrap-kaminari-views
  • kaminari, A Scope & Engine based, clean, powerful, customizable and sophisticated paginator for modern web app frameworks and ORMs,为web应用框架和orm提供分页工具,地址:https://github.com/amatsuda/kaminari
  • select2-rails, 在Rails asset pipeline中集成Select2的JavaScript的库。网站: https://github.com/argerim/select2-rails
  • simple_form, 使用一个简单的DSL从而使得表单的生成更加容易(不需要选项和标记)。地址: https://github.com/plataformatec/simple_form
  • jquery-atwho-rails, at.js的Ruby gem包。地址:https://github.com/ichord/jquery-atwho-rails
  • client_side_validations, 客户端验证gem包,使得Rails 3.1 以上的程序更容易的验证,项目不再维护,地址: https://github.com/bcardarella/client_side_validations
  • client_side_validations-mongoid, 客户端验证的mongoid插件,项目不再维护,地址:https://github.com/dockyard/client_side_validations-mongoid
  • client_side_validations-simple_form, simple_form的客户端验证插件,项目不再维护,地址:https://github.com/dockyard/client_side_validations-simple_form
  • ui_datepicker-rails3, jQuery UI datepicker(日记选择器) integration for Formtastic, Simple Form and Active Admin,https://github.com/kristianmandrup/ui_datepicker-rails3
  • best_in_place, A RESTful unobtrusive jQuery Inplace-Editor and a helper as a Rails Gem,用作后台编辑, 利用jQuery和Ajax,依赖jQuery。地址:https://github.com/bernat/best_in_place
  • remotipart, # Remotipart is a Ruby on Rails geim enabling remote multipart forms (AJAX style file uploads) with jQuery,用作Ajax文件上传。地址: https://github.com/leppert/remotipart
  • tagmanager-rails, Tag Manager for Rails asset pipeline。地址: https://github.com/tmaier/tagmanager-rails

思: 一直很好奇,jquery-rails这样的Gem包究竟是个啥。特地去Github上看了一下jquery-rails的介绍,简单来说,Gem包会在app/assets/javascripts/application.js中添加//= require jquery,然后,就可以在应用程序中直接使用jQuery,这其实就是资源类的Gem包的特征。

其他配置

  • memcache-client, # 缓存客户端,这里在github上看到很多的不同的memcache的客户端,其中有个ruby相关的是高性能的工具。具体的地址为:https://github.com/search?q=memcache-client&type=Repositories&ref=searchresults 这里到底用的是哪个gem包,不是清楚
  • rest-client, # Simple HTTP and REST client for Ruby, inspired by microframework syntax for specifying actions。官方地址:https://github.com/rest-client/rest-client。
  • progress_bar, #小工具,Ruby的终端的进度条,用于在终端上运行长时间的任务,这里的长时间任务大概是下面的搜索。
  • ransack, 基于对象的搜索,由Heroku(Ruby的云计算平台)公司开发,是对MetaSearch (灵活的简单的创建搜索框)的重写,
  • inherited_resources, 加速开发并且使得控制器的继承所有的Restful动作,对于标准的Restful的动作,只需要include该Gem即可。不过该gem包已经被弃用了(https://github.com/josevalim/inherited_resources),原作者Rails 3以上的建议使用responders代替
  • gmail, A Rubyesque interface to Gmail, with all the tools youll need。简单来说,就是Ruby的Gmail接口。地址: https://github.com/nu7hatch/gmail
  • whenever, Cron jobs in Ruby,感觉就像Ruby语法的corn任务,提供更清晰的语法来编写和部署corn任务。地址:https://github.com/javan/whenever
  • daemons, 将脚本转换为控制的守护进程-生成服务器器时非常的有用,rubyforge已经关停了,该项目也是7年前的事情。地址:https://github.com/ghazel/daemons
  • exception_notification, Rails的异常通知插件,地址:https://github.com/smartinez87/exception_notification
  • nas-yahoo_stock, 雅虎股票数据的接口,用来抓取雅虎的股表。地址:https://github.com/nas/yahoo_stock
  • sitemap_generator, 使用了google的站图信息 地址:https://github.com/adamsalter/sitemap_generator
  • lazy_high_charts, 提供简单扩展的方法使用HighCharts,地址:https://github.com/michelson/lazy_high_charts
  • tophold_rack, 用于统计的Rack的中间件,地址: https://github.com/tteng/tophold_rack
  • faye, Simple pub/sub messaging for the web,项目地址: https://github.com/faye/faye ,项目主页: http://faye.jcoglan.com/
  • timeliness, Fast date/time parsing for the control freak. 地址: https://github.com/adzap/timeliness
  • cancan, RoR的权限Gem包。 地址:https://github.com/ryanb/cancan
  • wicked, 将控制器装换为向导,地址:https://github.com/schneems/wicked

服务器相关

关于web服务器,实在有太多的可以选择了。Ruby自带的web服务器: webrick,高速的Mongrel以及Mongrel cluster, Unicron,thin,REE和Passenger。

  • thin, 快速的简单的Ruby的web服务器。地址:https://github.com/macournoyer/thin
  • REE , 特地去看了一下,感觉没什么,地址为: http://www.rubyenterpriseedition.com/ 。获得了一个认识,Ruby的解释器的实现的相当的多。

性能和服务器的选择存在一定的关系,网站的响应慢也不仅仅简单的归结为服务器的原因,存在很多使得网站变慢的原因,所以,第一要素是,搜集数据,找到变慢的根本原因。搜集数据的第一要素是: 性能监视工具。

实践

better_errors

更好的错误提示的gem包,搭配binding_of_caller使用,可以在页面中对局部变量进行查询和访问(即所谓的REPL环境)。

在自己的测试项目中,将better_errors引入和剔除时,对同一错误的控制台输出和web界面的输出对比了一下:

  • 使用了better_errors的输出:

      NameError - undefined local variable or method `base_path' for #<#<Class:0x00000004b67688>:0x00000004b1f9a0>:
        app/views/static_pages/home.html.erb:11:in `_app_views_static_pages_home_html_erb__3215013181751152336_32833860'
        actionpack (3.2.13) lib/action_view/template.rb:145:in `block in render'
        ... # 以下省略调用栈追踪的错误, 调用栈的信息可在控制台或web界面中查看,控制台信息更紧凑
      Started POST "/__better_errors/22226880/variables" for 127.0.0.1 at 2014-12-11 09:14:58 +0800 # 服务器端接受post请求的值查询操作  
    
  • Rails原生的错误输出:

      ActionView::Template::Error (undefined local variable or method `base_path' for #<#<Class:0x00000003bf66e0>:0x000000034311d0>):
        8:   </h2>
        9:   <%= link_to "Sign up now" , signup_path ,class: "btn btn-large btn-primary" %>
        10:   <p>This view template is render by  <%= "controller: #{controller_name} and action: #{action_name}"   %></p>
        11:   <%= base_path %>
        12: </div>
        13: <%= link_to image_tag("rails.png", alt: "Rails"), 'http://rubyonrails.org/' %>
      app/views/static_pages/home.html.erb:11:in `_app_views_static_pages_home_html_erb__3217260100283971556_32923440'
    
      Rendered /home/xiajian/.rvm/gems/ruby-1.9.3-p547@tophold/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.0ms)
      Rendered /home/xiajian/.rvm/gems/ruby-1.9.3-p547@tophold/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.9ms)
      Rendered /home/xiajian/.rvm/gems/ruby-1.9.3-p547@tophold/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (6.0ms)
    

web界面的信息显示上,better_error显示的信息更加的完善且完整。

thin

和thin类似的web服务器有: webrick, puma, mongrel, unicorn等。thin的使用意外的简单,在gemfile中添加后,rack会优先选择除了webrick以外的handler。

后记


因为选择太多而导致选择困难,所以,唯一的受限的选择,可以免去浪费在选择上的时间。所以,Ruby社区在web开发框架上,rails一枝独秀并不见得是件坏事。由于社区相对较小,需要集中力量。




傲娇的使用Disqus