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

北京快乐八软件 www.gcpng.com 在bundle install 和 gem install mysql2的时候,都出现mysql2包不能安装的错误

[email protected]:/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="//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=//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=//ruby.taobao.org/mirrors/ruby/2.0/ruby-2.0.0-p247.tar.gz# rbenv install 2.0.0-p247

[email protected]:~/.rbenv/versions$ env RUBY_BUILD_MIRROR_URL=//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...
-> //ruby.taobao.org/mirrors/ruby/2.0/ruby-2.0.0-p247.tar.gz#/c351450a0bed670e0f5ca07da3458a5b
...

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

wget -q //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

//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 也同样有效?!?a >Railscasts?也有相应的介绍。

god

Ruby 进程监控工具

ruby on rails 学习流水账

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

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

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

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

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

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

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

下载地址:
//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 '//ruby.taobao.org/
bundle install

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

使用mysql作为数据库,生成一个CURD的功能
//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概念不熟悉的新手,学习起来超级困难

一本不错的入门书及视频
//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