ERROR: Error installing mysql2:ERROR: Failed to build gem native extension.

在bundle install 和 gem install mysql2的时候,都出现mysql2包不能安装的错误

shuhai@shuhai-Aspire:/wwwroot/ror/blog$ gem install mysql2
Building native extensions.  This could take a while...
ERROR:  Error installing mysql2:
	ERROR: Failed to build gem native extension.

    /home/shuhai/.rbenv/versions/2.0.0-p247/bin/ruby extconf.rb
checking for rb_thread_blocking_region()... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lmygcc... no
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

在ubuntu下执行以下命令安装依赖

sudo aptitude install libmysqlclient-dev

整理一个全面的Ruby正则表达式笔记

string = Time.now.methods.to_s

#单个匹配
reg = /:(?<content>.*?),/is
match =  reg.match string
puts match
puts $1

#多个匹配
reg = /:(?<content>.*?),/is
match =  string.scan reg
puts match

有php基础再学 ruby 果然很简单,语法、变量、数组、循环、流程、时间、字符串、正则、网络、数据库基本上是相通的。比如正则就很好入门,只是有一些语法变了,比如全部匹配。

1、Ruby中正则表达式的写法
主要有三种

在//之间,要进行转义
在%r{}内,不用进行转义
Regexp.new()内,不用进行转义
/mm\/dd/,Regexp.new(“mm/dd”),%r{mm/dd}三者效果相同,实质都是新建了一个Regexp的类。

2、匹配的两种方法
=~肯定匹配, !~否定匹配。=~表达式返回匹配到的位置索引,失败返回nil,符号左右内容可交换

regexp#match(str),返回MatchData,一个数组,从0开始,还有match.pre_match返回匹配前内容,match.post_match返回匹配后内容
/cat/ =~ "dog and cat" #返回8
mt = /cat/.match("bigcatcomes")
"#{mt.pre_match}->#{mt[0]}< -#{mt.post_match}" #返回big->cat< -comes

3、替换
很多时候匹配是为了替换,Ruby中进行正则替换非常简单,两个方法即可搞定,sub()+gsub()。
sub只替换第一次匹配,gsub(g:global)会替换所有的匹配,没有匹配到返回原字符串的copy

str = "ABDADA"
new_str = str.sub(/A/, "*") #返回"*BDADA"
new_str2 = str.gsub(/A/, "*") #返回"*BD*D*"
如果想修改原始字符串用sub!()和gsub!(),没有匹配到返回nil。

方法后面还可以跟block,对匹配的字符串进行操作

a.gsub(/[aeiou]/) {|vowel| vowel.upcase } # => "qUIck brOwn fOx"

4、分组匹配
Ruby的分组匹配与其它语言差别不大,分组匹配表达式是对要进行分组的内容加()。
对于匹配到的结果,可以用系统变量#$1,#$2…索引,也可用matchData数组来索引

md = /(\d\d):(\d\d)(..)/.match("12:50am") # md为一个MatchData对象
puts "Hour is #$1, minute #$2"
puts "Hour is #{md[1]}, minute #{md[2]}"

5、匹配所有
regexp#match()只能匹配一次,如果想匹配所有要用regexp#scan()
用法示例:

"abcabcabz".scan(%r{abc}).each {|item| puts item} # 输出2行abc

6、贪婪匹配vs懒惰匹配
这两种匹配属于标准正则表达式内容,与Ruby没关,但新手如果不明白匹配时会发生莫名其妙的错误,所以特别总结一下。

贪婪匹配:尽可能多匹配,正则默认是贪婪匹配。例子:a.*b它将会匹配最长的以a开始,以b结束的字符串。对于aabab的匹配结果是aabab。
懒惰匹配:尽可能少匹配。例子:a.*?b对于aabab的匹配结果是aab和ab。
一般是在原来表达式结尾加?就由贪婪匹配变成了懒惰匹配。常用的懒惰限定符有:

?重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复

rbenv安装太慢的解决办法

rbenv + ruby-build 插件,可以直接使用命令 rbenv install 1.9.3-p448 安装对应的ruby版本,但,这样太慢,半小时过去,还在Downloading

不过,ruby-build提供了镜像链接,哈哈
RUBY_BUILD_MIRROR_URL="http://www.mirrorservice.org/sites/ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p448.tar.gz" rbenv install 1.9.3-p448

但,这样还是太慢,半小时过去,还在Downloading,再换个镜像
env RUBY_BUILD_MIRROR_URL=http://mirrors.ibiblio.org/ruby/2.0/ruby-2.0.0-p247.tar.gz rbenv install 2.0.0-p247

但,这样还是TMD太慢,半小时过去,根本就没动呀!!!!

看到国内有淘宝的镜像了,换个地址再试!因为检查md5sum,所以需要在url后面加个#,问号也可以的
env RUBY_BUILD_MIRROR_URL=http://ruby.taobao.org/mirrors/ruby/2.0/ruby-2.0.0-p247.tar.gz# rbenv install 2.0.0-p247

shuhai@Aspire:~/.rbenv/versions$ env RUBY_BUILD_MIRROR_URL=http://ruby.taobao.org/mirrors/ruby/2.0/ruby-2.0.0-p247.tar.gz# rbenv install 2.0.0-p247
Downloading ruby-2.0.0-p247.tar.gz...
-> http://ruby.taobao.org/mirrors/ruby/2.0/ruby-2.0.0-p247.tar.gz#/c351450a0bed670e0f5ca07da3458a5b
...

速度还是慢,我试了一下,用wget是可以很快下载完成的,那再换个办法

wget -q http://ruby.taobao.org/mirrors/ruby/2.0/ruby-2.0.0-p247.tar.gz -O /home/shuhai/.rbenv/versions/ruby-2.0.0-p247.tar.gz
env RUBY_BUILD_MIRROR_URL=file:///home/shuhai/.rbenv/versions/ruby-2.0.0-p247.tar.gz# ~/.rbenv/bin/rbenv install 2.0.0-p247

这个速度那是相当快呀!!!注意的是,文件URI后面要加个#或者?

Ruby On Rails 推荐 Gem 列表

PHP的包管理Composer还在刚刚兴起的阶段,Ruby社区已经有很多成熟的Gem了,Rails的思想和包,就是精髓所在。

本页用于介绍 Ruby 社区里面那些特别热门的 Gem ,以下 Gem 可以在 rubygems.org 找到。

实用的 RubyGems 排名站点 www.ruby-toolbox.com

twitter-bootstrap-rails

http://twitter.github.com/bootstrap/
https://rubygems.org/gems/twitter-bootstrap-rails
https://github.com/seyhunak/twitter-bootstrap-rails

来自 Twitter 的 Bootstrap,是一套完成的前台 CSS 框架。
以简洁,优雅著称于世。
被无数攻城狮所青睐,
又让无数程序猿审美疲劳。

twitter-bootstrap-rails Gem 封装了 Boostrap CSS 等代码

Devise

用于快速构建用户功能,如:注册,登陆,个人设置,找回密码...

OmniAuth

如果你需要在项目中实现三方平台(如: Twitter, Facebook, 新浪微博, 腾讯 QQ)账号登陆的支持,那你需要用上它。

RailsCast: Part1 Part2

will_paginate 和 Kaminari

分页控件,几乎所有 Rails App 都在用, 其中 will_paginate 比较老, 应用案例较多, kaminari 更新, 性能和兼容性更好

Paperclip 和 Carrierwave

这两个都是上传组件, Paperclip 是老牌产品了,也是几乎绝大多数项目都有在用它,它可以帮你处理上传图片,裁减,定义不同的图片尺寸,几乎很完美。而 Carrierwave 是后起之秀,功能和 Paperclip 差不多,但它还可以管理除图片之外的东西,而且灵活性更高( ruby-china 就是用它)。
对比: Paperclip 官方只支持 ActiveRecord 但相对稳定, 而 Carrierwave 比较灵活支持更多的 orm, 比如 mongoid

WiceGrid

表格控件,针对 ActiveRecord,超级强大,支持任意字段排序,过滤,具体看它的 Demo.

thinking-sphinx

基于 Sphinx 的全文搜索组件,要搞全文搜索功能就用它。

Settingslogic 和 RailsSettings

项目经常会有一些配置信息,Settinglogic 可以帮你将写在 YAML 里面的配置信息很方便的调用。而 RailsSettings 也是类似的功能,只不过它是将配置信息存放在数据库里面,以便可以随时在线上修改。同时也带来性能的问题,你可以用改进版 rails-settings-cached,他会将配置缓存下来。

CanCan

一些应用中会用到为不同用户设定不同功能的权限,你可以试试 Cancan 这个 gem 他可以帮你制定一套完善的方案,Railscasts 上面还有个使用介绍,可以看一下。

redis-objects

它是一个基于 Redis 存储的数据存储插件,用于帮助我们存放一些需要快速存储的数据,如 页面访问量,赞数量,或者一些列表数据,如 Followers,数据将会存入 Redis 中,而它用起来很简单,它可以和 Rails ActiveSupport (简单来说,也就是 Model 里面)结合,使这些数据存取像一个普通字段一般。

Nokogiri

采集数据是我们需要解析复杂的 HTML 结构,从中获得需要的数据,Nokogiri 可以帮助我们完美的处理不同网页上面不同的 HTML 结构,并且有很好的编码处理能力,用它你不用担心页面是 GB2312 还是 GBK 还是 UTF-8,它都很很好的处理,解析结构可以用类似 jQuery 的 CSS Selector 的方式查找,很是方便。曾经用过 Ruby 的好几个类似插件,最终发现 Nokogiri 才是最好的。

Formtastic 和 simple_form

Rails 为我们带来和一改传统的表单构件方式,但是经过实际的使用,我们渐渐发觉这样依然还是不够“敏捷”,我们需要更加简便并具有更细致规范的表单,所以有了 Formtastic ,它用起来比 Rails 默认的 form 更加简洁,但是却具有更多的功能,你可以为每个字段设定 help-text 放到文本框下面,并可以走 I18n 的方式设置语言,具体参见 Railscasts 上面对于 Formtastic 的介绍。而 simple_form 和 Formtastic 功能类似,但它的写法还要简单一些。

Whenever

Linux 里面有 Cron 可以帮助我们定期执行一些任务,但是 Cron 手动写起来很是麻烦,尤其是前面时间周期的定义, Whenever 可以帮助我们用更人性化的方式编写 Cron 任务,具体参见 Railscasts 上面关于 Whenever 的介绍。

Resque 和 Delayed_job

有时候一些任务的执行会很慢,而这些任务我们并不要求需要马上返回结果 (比如:发送邮件,生成图片缩略图),那我们可以选择将这些任务放到后台执行,以便于页面不会长时间等待执行。Resque 和 delayed_job 可以帮助我们很容易的搞定这件事情。两者区别在于 Resque 可以有不同的队列,而 Delayed_job 只有一个,但它可以设定优先级。此外 Delayed_job 除了支持 ActiveRecord,还支持其它 ORM(具体参见 这里)。Delayed_job 使用更加简单。如何选择,这个就要看使用场景了,Resque 上面对比介绍说,如果你需要有大量的任务需要放到队列里面执行,并且不要求优先级,那你就用大吧。DelayedJob 不适合处理大量的任务, 瓶颈是基于数据库的, 也不支持队列. 操作上比 Resque 要方便. 而 Resque 是基于 redis 的, 使得生成任务比较迅速, 性能上比 DelayedJob 要好. 唯一的缺点就是不支持定时任务、但是装个 resque-scheduler 可以弥补这一点. 而且 Resque 还有 web 管理界面, 方便查看任务和追踪错误.

rails-dev-boost

随着项目越来越大,文件越来越多,我们渐渐发现在开发环境下,项目执行慢得让人无法忍受。这个问题原因在于 Rails Development 环境没有缓存所有的类 (Model,Controller,Helper,Views...) 文件,每次刷新页面都将会重新载入,而载入过程实际上是缓慢的,这个源于 Ruby 的性能问题,所以 rails-dev-boost 搞了缓存的机制来解决这个问题,用它可以 10 倍提升大项目在开发环境的速度问题,不够某些项目可能不起效果,比如用了 ActiveAdmin。
用这个 Gem 在 rails3.1 下提速效果更为明显, 因为 rails3.1 开发环境默认状态下每次请求 assets 哪怕是一张图片也要重新加载所有的程序文件.

Cells

在设计 Views 的时候,我们会将一些很多页面都需要用到的局部功能抽象成 Partials 但是我们会发现这样动作比较麻烦,因为数据依然还需要在不同的 Controller 里面载入。而 Cells 可以帮助我们搞定这个问题,它可以将一个局部功能,从数据调用到 View 生成,全部做成一个独立的组件,使用的时候一行代码就搞定,无需其他的调用,同时还可以在 Cell 里面设定缓存,将缓存颗粒化。而且于 Partials 相比,它的效率好很多。

Smurf

Rails 3.1 为我们带来了 Asset Pipeline ,可以帮助我们处理 JS,CSS 压缩的功能,但是之前的版本如何实现 CSS,JS 压缩呢?Smurf 可以,用它非常简单,装上就可以了,不用修改代码。同时大家可以用另外个改进版本 smurf-huacnlee 它可以另外处理 CSS 里面 image 地址的问题,会在后面加上时间戳 (类似 image_tag 的效果),以解决图片更新后,用户浏览器缓存更新的问题。

daemon-spawn

将一些事情作为 daemon 来启动,可以类似 Debian 的 service foo start 比如 用来管理 Resque 的启动和重启,会变得很简单。

Grape

随着 Mobile App 的增多,很多时候我们在做用 Rails 做 API Base 项目时,rails 自带的 C 和 V 层显得过于繁杂,grape 可以帮助我们快速的构建和 Rails 完美融合的 API 接口。

ClientSideValidations

现在越来越多网站为了改善用户体验,使用 JavaScript 来进行客户端验证。对于程序员来说,也因此增加多一份工作。而往往客户端的验证逻辑跟服务端的验证逻辑几乎一样,如果要另外再写一次验证代码,实在不够 DRY,client_side_validations 正是为解决此问题要出现。client_side_validations 会读取服务端的验证逻辑并生成对应的客户端验证逻辑(依赖 jQuery),让你几乎不用增加任何前端代码就可实现客户验证。

by_star

这是一个辅助 ActiveRecord 的组件,让你可以简单的实现按某年,某月,某日,或者星期几,来查询数据,用起来非常简单,省下麻烦的条件组合,此外,它还可以查询上一篇,下一篇类似的功能。

rolify

Very simple Roles library without any authorization enforcement supporting scope on resource object.

gon

这个 gem 可以实现把服务端的数据传到 js 中. 用法很简单.

rest-client

简单强大的 HTTP/REST 客户端,跟 Grape 配合起来很完美

pry

简单强大的调试工具, 轻量级的工具. 直接在终端调试方便又直接

Seed Fu

强大的 seed

rails_best_practices

编写代码总有方圆,费心费力写文档,还不如用这个工具来控制代码质量。

lazy_high_charts

当前绘图 JS 库中 Highcharts 非常优秀,rubyist 使用这个 gem 来管理和编写需要的图。

Better Errors

它用一个更好的,更有用的错误页替换标准的 Rails 错误页面,对 Rack middleware 也同样有效。·Railscasts 也有相应的介绍。

god

Ruby 进程监控工具

ruby on rails 学习流水账

按照教程,把ror环境跑起来了,接起来两周会多花一些时间在学习上。

环境安装的流程还是需要备注一下

通读下文
http://huacnlee.com/blog/how-to-start-learning-ruby-on-rails/

安装过程参考
http://ruby-china.org/wiki/install_ruby_guide
http://about.ac/rails-tutorial-2nd-cn/chapter1.html
https://github.com/sstephenson/rbenv 目前用rbenv更顺手

安装时遇到一个js运行环境的问题,暂时没搞懂ror和js环境有啥子关系
http://ruby-china.org/topics/692

hello world
http://guides.ruby-china.org/getting_started.html

然后再给自己选了一个ide,ide对新手来说,还是很重要的,特别是代码提示
http://www.jetbrains.com/ruby/features/index.html

下载地址:
http://www.jetbrains.com/ruby/download/index.html
破解序列号:
name: rubymine
LICENSE:
70414-12042010
00002VG0BeoZbwmNAMNCx5E882rBEM
Ysn1P!e"s830EDlHcWg8gmqYVkvZMo
Injf4yqlO1yy"82NiwNzyYInoT7AiX

看了大家的测试安全部署平台,我也在appfog.com上注册了一个账号进行试用,简单来说,不会使用git的同学,压力会比较大了。
git除了在指定文件和目录方面的管理功能比较蛋疼以外,如更新和历史,其它地方都好过svn。现在用git的地方真是太多了,当然,学习的过程真是很混乱的。一开始使用git的时候,完全把git当成了svn用。

生成一个rails项目,后面的参数表示不安装bundle
rails new demo --skip-bundle --skip-test-unit -d mysql

修改gem源地址以提高bundel install速度
source 'http://ruby.taobao.org/
bundle install

提高rails new时bundle install运行速度
rails new demo --skip-bundle
cd demo
bundle install --local --without production

使用mysql作为数据库,生成一个CURD的功能
http://rubyer.me/blog/231/

体验一次ThinkPHP里的数据库模型,简单看一下高级方法和数据验证方法

class Micropost < ActiveRecord::Base
  attr_accessible :content, :user_id

  #自定义数据校验
  validates_presence_of :first_name, :last_name
  validates :content, :length => { :minimum => 2, :maximum => 20 }

  #数据校验器
  validate :no_blank_content

=begin
    :acceptance => Boolean
    :confirmation => Boolean
    :exclusion => { :in => Ennumerable }
    :inclusion => { :in => Ennumerable }
    :format => { :with => Regexp }
    :length => { :minimum => Fixnum, maximum => Fixnum, }
    :numericality => Boolean
    :presence => Boolean
    :uniqueness => Boolean
=end

  belongs_to :user
end

def no_blank_content
    if content.blank?
      errors.add( :content, "can not be null")
    end
    if user_id.blank?
      errors.add( :user_id, "can not be null")
    end
end

无比强大,又好玩的console
rails console

目前发现的问题
1,文件名都是小写的,加复数,类名变量名却是大写的,而且变量区分大小写
2,编程语法跟英语语法折腾到一堆了,比如默认加复数、很多关键词与c语言不一样,nil|empty,delete|destroy
3,ruby on rails,框架大集成,jQuery都是框架集成功能,对各种包,工具依赖强烈,入门学习成本高,感觉git不熟,命令不熟悉,mvc概念不熟悉的新手,学习起来超级困难

一本不错的入门书及视频
http://about.ac/rails-tutorial-2nd-cn/
ed2k://|file|%5BRuby.on.Rails.3.%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%5D.RubyOnRails3LiveLessons.iso|7941357568|cd5c6b189bcf9c481206d5c62427c2d3|h=douoii3zqelwejjlrpi4iodtozbvadxa|/

ucenter authcode加解密算法for ruby.authcode.rb

感谢ice同学提供源码(https://github.com/iceskysl)

#coding: utf-8
require 'digest/md5'
require 'base64'
require 'cgi'
class Authcode
  
  def authcode(auth_key, string, operation = '', expiry = 0)
    ckey_length = 4
    key = md5(auth_key)
    keya = md5(key[0, 16])
    keyb = md5(key[16, 16])
    keyc = ckey_length > 0 ? (operation == 'DECODE' ? string[0, ckey_length] : (md5(microtime()))[-ckey_length..-1]) : ''
    cryptkey = keya + md5(keya+keyc)
    key_length = cryptkey.size
    string = operation == 'DECODE' ? base64_url_decode(string[ckey_length..-1]) : sprintf('%010d', expiry>0 ? expiry + Time.now.to_i : 0)+ (md5(string+keyb))[0, 16] + string
    string_ords = ords(string)
    string_length = string_ords.size
    result = ''
    box = (0..255).to_a

    rndkey = []

    0.upto(255) do |i|
      rndkey[i] = (cryptkey[i % key_length]).ord
    end

    j = i = 0
    while i < 256 do
      j = (j + box[i] + rndkey[i]) % 256
      box[i], box[j] = box[j], box[i]
      i +=1
    end

    a = j = i = 0
    while i < string_length
      a = (a + 1) % 256
      j = (j + box[a]) % 256
      box[a], box[j] = box[j], box[a]
      result += (string_ords[i] ^ (box[(box[a] + box[j]) % 256])).chr
      i +=1
    end

    if operation == 'DECODE' then
      if ( result[0,10] == '0'*10 || (result[0, 10]).to_i - Time.now.to_i  >  0 ) and
         result[10, 16] == (md5(result[26..-1] + keyb))[0, 16] then
        return result[26..-1]
      else
        return ''
      end
    else
      keyc + (Base64.encode64(result)).gsub(/=/, '')
    end
  end
  
  
  def md5(s)
    Digest::MD5.hexdigest(s)
  end

  def base64_url_decode(str)
    str += '=' * (4 - str.length.modulo(4))
    Base64.decode64(str.tr('-_','+/'))
  end

  def microtime
    epoch_mirco = Time.now.to_f
    epoch_full = Time.now.to_i
    epoch_fraction = epoch_mirco - epoch_full
    epoch_fraction.to_s + ' ' + epoch_full.to_s
  end

  def ords(s)
    s.bytes.to_a
  end
  
end

# 测试代码,和discuz的调用方法并不完全相同,第一个参数是加密解密算子,第二个才是字符串值
 

# code = "b384r5HiERJ+kEbb25t9jbtDXULGnCnR++1EK9xlmG74OKkd3hfjC4+dUJePocsJHts2JeO4/Po"
# key = "Y426x6Basctda9f94e49h3B6OeofcdX0J8Ua2a37P1M9Jd00he28o3t5ocq707U5"
# y = (Authcode.new).authcode(key,code,'DECODE')
# puts " ----- #{y}"
# #action=synlogin&username=homey0&uid=713627&password=10c308db89f5cf6bd6d011de005c25d2&time=1344610064