Lennakim

I am lennakim

0%

匆匆忙忙的一年又过去了, 万分感慨,时间过得好快。今天好好总结一下。

跨年晚上写在Evernote的总结:

每每感觉时间过得好快,尤其是今年,可能岁数越大越觉得时间过得快。
今年喜忧参半。

最难过的事:

姥爷在12月20日晚上突然去世,我们都没在身边,是满满的愧疚。
中秋节,专门回老家,去看了看他们,过程不算愉快吧,没想到竟是最后一面!

最开心的事:

找到了她,也许真的是上辈子的缘分,自然而然的在一起了,
我的忧伤与欢乐有她分享了。

最尴尬的事:

2013年4月底从公司辞职,其实早有准备,
与公司的文化、开发团队的理念合不来,捱过这半年很痛苦。
不过缓解了我的经济压力,买了mac mini 当开发机。

接下来的3个月找工作,先去了趟青岛,高高兴兴的玩了一阵,然后回到北京找工作。
在找工作的这段期间,暴露了很多问题: 算法是永远的痛,表达的思路不是很清楚 ……


今日总结:

针对算法的短板,我找到了 projecteuler
做了一些练习题,放到了我的github的project中
对我来说挑战不小,而且之后因为工作的原因,也做不下去了。
抽出时间继续做 projecteuler
对于难的问题,一周完成一个还不行么,这么低的要求,还完成不了么?

写blog要勤快, 写blog也是一种锻炼思维的方式。

发现一本涉及ruby底层的书 Ruby Under a Microscope,很赞,纯英文,还可以提高英语水平。
读完 Ruby Under a Microscope

积极锻炼身体,现在体重涨了,再不加强锻炼,以后咋面对媳妇!? 基本上没经验,
一定要现在起步,从长计议。

完成个人的一个小项目或者接一个小的外包 , 2013最缺什么,money!

对于表达交流上的问题,有意识的去控制语速,列出提纲,多参加一些交流活动。
前段时间参加了rails girls,当coach,是一种不错的锻炼。
有时间的话,一定要多参加活动,积累好人缘。

希望我和她幸福快乐

PS: GF生病发烧了,我不在身边,快点好起来吧!阿门

##为什幺要关注提交信息

  • 加快 Reviewing Code 的过程
  • 帮助我们写好 release note
  • 5年后帮你快速想起来某个分支,tag 或者 commit 增加了什么功能,改变了哪些代码
  • 让其他的开发者在运行 git blame 的时候想跪谢
  • 总之一个好的提交信息,会帮助你提高项目的整体质量

##基本要求

  • 第一行应该少于50个字。 随后是一个空行 第一行题目也可以写成:Fix issue #8976
  • 喜欢用 vim 的哥们把下面这行代码加入 .vimrc 文件中,来检查拼写和自动折行
1
autocmd Filetype gitcommit setlocal spell textwidth=72
  • 永远不在 git commit 上增加 -m <msg>--message=<msg> 参数,而单独写提交信息

一个不好的例子 git commit -m "Fix login bug"

一个推荐的 commit message 应该是这样:

1
2
3
4
5
6
7
8
9
10
Redirect user to the requested page after login

https://trello.com/path/to/relevant/card

Users were being redirected to the home page after login, which is less
useful than redirecting to the page they had originally requested before
being redirected to the login form.

* Store requested path in a session variable
* Redirect to the stored location after successfully logging in the user
  • 注释最好包含一个连接指向你们项目的 issue/story/card。一个完整的连接比一个 issue numbers 更好
  • 提交信息中包含一个简短的故事,能让别人更容易理解你的项目

##注释要回答如下信息

为什么这次修改是必要的?

要告诉 Reviewers,你的提交包含什么改变。让他们更容易审核代码和忽略无关的改变。

如何解决的问题?

这可不是说技术细节。看下面的两个例子:

Introduce a red/black tree to increase search speed

Remove <troublesome gem X>, which was causing <specific description of issue introduced by gem>

如果你的修改特别明显,就可以忽略这个。

这些变化可能影响哪些地方?

这是你最需要回答的问题。因为它会帮你你发现在某个 branch 或 commit 中的做了过多的改动。一个提交尽量只做1,2个变化。

你的团队应该有一个自己的行为规则,规定每个 commit 和 branch 最多能含有多少个功能修改。

##小提示

  • 使用 fix, add, change 而不是 fixed, added, changed
  • 永远别忘了第2行是空行
  • Line break 来分割提交信息,让它在某些软件里面更容易读

##例子

Fix bug where user can't signup.

[Bug #2873942]

Users were unable to register if they hadn't visited the plans
and pricing page because we expected that tracking
information to exist for the logs we create after a user
signs up.  I fixed this by adding a check to the logger
to ensure that if that information was not available
we weren't trying to write it.

Redirect user to the requested page after login

https://trello.com/path/to/relevant/card

Users were being redirected to the home page after login, which is less
useful than redirecting to the page they had originally requested before
being redirected to the login form.

* Store requested path in a session variable
* Redirect to the stored location after successfully logging in the user

##延伸阅读


出处

文章由 Victor 翻译,并发表在ruby-china上。
本人只是伸手党

准备

Resque 依赖 Redis
请先安装reids数据库。


安装Resque

gem "resque", "~> 1.25.1"

运行 resque-web 会打开 http://0.0.0.0:5678/overview

创建Rake

lib/tasks/resque.rake

1
2
3
4
5
6
7
8
9
require 'resque/tasks'

task "resque:setup" => :environment

# task "resque:setup" => :environment do
# ENV['QUEUE'] = "*"
# end
# 执行 rake resque:work 会启动所有队列

创建任务

app/workers/resque_job.rb

1
2
3
4
5
6
7
8
class ResqueJob
@queue = :resque_job #定义队列名称

def self.perform(u_name) #必须定义 执行方法体
puts "hello #{u_name}"
end
end

启动 queue

rake resque:work QUEUE=’*’ #启动所有队列

rake resque:work QUEUE=’resque_job’ #启动队列名称为resque_job的单个队列

调用 queue
1
Resque.enqueue(ResqueJob,"everyone") #调用队列

项目中查看resque任务

1
2
gem "resque", "~> 1.25.1", :require => "resque/server"
mount Resque::Server, :at => "/resque" # routes.rb

访问 http://0.0.0.0:3000/resque/overview

限制访问

1
2
3
4
# config/initializers/resque_auth.rb
Resque::Server.use(Rack::Auth::Basic) do |user, password|
password == "password"
end

Redis 命令行

1
2
3
4
5
6
7
8
redis-server #Redis服务器的daemon启动程序

redis-cli #Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作

redis-benchmark #Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能

redis-stat #Redis状态检测工具,可以检测Redis当前状态参数及延迟状况


定时队列

gem "resque-scheduler", "~> 2.0.1"  :require => "resque_scheduler"

whenever

安装 运行

1 gem “whenever”, “~> 0.8.4”

2 在命令行输入 wheneverize .

生成config/schedule.rb

3 编写 schedule.rb

1
2
3
env :PATH, ENV['PATH']
set :output, {:error => File.join(Whenever.path, "log", "cron_err.log"), :standard =>File.join(Whenever.path, "log", "cron_out.log")}
set :environment, 'development'

4 执行

whenever #根据schedule.rb 转换成cron语法, 不会写入crontab文件

whenever --update-crontab #写入crontab文件

whenever -s environment=development -w ~/minsheng/config/schedule.rb

whenever --help

linux crontab 命令

crontab -l # 列出某个用户cron服务的详细内容
crontab -e # 修改
crontab -r # 删除某个用户的cron服务

schedule.rb 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
every 3.hours do
runner "MyModel.some_process"
rake "my:rake:task"
command "/usr/bin/my_great_command"
end

every 1.day, :at => '4:30 am' do
runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end

every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
runner "SomeModel.ladeeda"
end

every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
runner "Task.do_something_great"
end

every '0 0 27-31 * *' do
command "echo 'you can use raw cron syntax too'"
end

# run this task only on servers with the :app role in Capistrano
# see Capistrano roles section below
every :day, :at => '12:20am', :roles => [:app] do
rake "app_server:task"
end

定义自己的工作类型

1
2
3
4
5
job_type :awesome, '/usr/local/bin/awesome :task :fun_level'

every 2.hours do
awesome "party", :fun_level => "extreme"
end

whenever 默认的工作类型与定义

1
2
3
4
job_type :command, ":task :output"
job_type :rake, "cd :path && :environment_variable=:environment bundle exec rake :task --silent :output"
job_type :runner, "cd :path && script/rails runner -e :environment ':task' :output"
job_type :script, "cd :path && :environment_variable=:environment bundle exec script/:task :output"

RVM 集成

Capistrano 集成

资料

What is Cron

Rake + cronjob 创建计划任务

164-cron-in-ruby

遇到了这么个小问题,需要把完成的railsApp打包到CentOS上,而且服务器不能联网,
ruby 环境也没有安装。一番捣鼓,步骤如下:

没有找到离线安装rvm的方法 而且 linux版本为CentOS 5.6

###下载源文件

ruby-1.9.3-p327

yaml-0.1.4.tar.gz

bundler-1.2.3

本地服务器

打包 rails app

1
2
3
4
5
$ bundle package
#若提示没有,安装bundler并重复以上步骤
$ gem install bundler
$ bundle package # 将项目所需要的gem复制到 vendor/cache
$ tar -czf railsApp.tar.gz railsApp #压缩打包

远程服务器

首先安装 yaml-0.1.4.tar.gz,再安装ruby

1
2
3
4
$ tar –xzvf  yaml-0.1.4.tar.gz
$ ./configure
$ make
$ make install

安装ruby

1
2
3
4
5
6
7
$ tar  -xzvf  ruby-1.9.3-p327.tar.gz
$ cd ruby-1.9.3-p327
$ ./configure
$ make
$ make install
$ ruby -v #提示即安装成功
$ gem -v #gem已经安装

本地安装bundler

1
2
$ gem install  bundler-1.2.3.gem
$ bundle -v #提示即安装成功

部署 rails app

1
2
3
$ tar  -xzvf  railsApp.tar.gz
$ cd railsApp
$ bundle install --local #本地安装gem

注意修改配置文件

$ rails s  #测试运行

分享在gist上

当我还在2011憧憬2012的时候,它走到了末尾,迎来了2013,时间走的好快。

~~说好的末日没有来,爱情也木来 ~~

换了新的工作,换了新的同事。

自从11年11月份接触ruby,至今也有1年多了。感觉进步不是很快,一直是一个人摸爬滚打,
没有真正的引路人。

To Do List

###Rails
Rails测试框架
基本定性在已 RSpec+factory_girl为基础的测试框架,以后逐步添加其他gem。
测试效率,覆盖率,自动程度,学习难度,这几个方面考虑。

Git

这么潮的版本控制工具,不用实在不是我性格。
等比对了Git跟svn的优缺点,我就要转型了。

论坛

计划推迟了很长时间

###提高英语水平
感觉我的水平就停留在了初中人教版,看这么多文档,费时费力,懂英语会走的更远。

###Python
python算是ruby的兄弟语言。虽没有ruby那么灵活,但运行速度快,跨平台性好。
GUI方面比ruby强了很多。java语法太琐碎了,概念性的东西一大堆。

###mac mini
虽然在ubuntu基本可以胜任,但在GUI方面还是mac支持的不错。
公司也不提供工作的电脑,整天扛着笔记本挤地铁,有些痛苦。
到时候可以研究下ios,当作副业,开发个app,弄点小钱也不错。

ruby on arduino

看见别人分享的ppt,感觉很新奇,很潮。
软件跟硬件打交道,这是最能直观体现软件价值功能的地方了。

arduino在tw很火。

中文wiki

arduino官网

多赚钱

money才是王道啊


补录: 这本是在13年1月1号发出来的,竟然拖到了13年12月21号。

我在13年12月20号整理了blog,当天晚上外祖父突然去世,愿您安息!

First Blood 来些血腥凶残暴力的!
这些经常在面试中被提问,内容很多。
从面试里单独拿出来,这东西相当于神器级别,必须谨慎对待。

yield是ruby中一个特殊的关键字,可以调用块方法(block),而block是ruby闭包的一种,
故将三者联系起来,yeild天生就是闭包的小跟班儿。感觉没必要单独讲,不然很割裂的赶脚。

** ruby 闭包** block,Proc,lambda

block 与 yield
block 是最常用到的,有两种形式,{}和do … end。
一般单行习惯用{},多行用do … end,当然这只是习惯。

demo.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def test_yield
yield
end

test_yield{ puts "this is first block." } # yield可以调用block 即{...}

test_yield do
puts "this is second block."
end

def test2_yield
yield("shooter")
end

test2_yield{ |var| puts "This args is #{var}." }
#传给yield的参数(此处为shooter)即对应了block中的参数(||中的部分)

还可以通过 Kernel#block_given? 方法询问当前的方法调用是否包含块。

1
2
3
4
5
6
7
def test
return yield if block_given?
puts 'no block'
end

test # => no block
test{ puts "Here's a block" } # => Here's a block

Proc对象

1
2
3
4
5
plus = Proc.new { |x| x + 1 }
puts plus.call(2) # =>3

subtract = proc { |x| x - 1 }
puts subtract.call(4) # =>3

这被称为延迟执行(Defferred Evaluation)。

通过**&操作符**,block 与 Proc对象可以相互转化。

1
2
3
4
5
6
7
8
9
10
def math_one(a, b, &oper)
puts yield(a,b)
end

def math_two(a, b, &oper)
puts oper.call(a,b)
end

math_one(2,3) { |x,y| x + y} # => 2 + 3 = 5
math_two(2,3) { |x,y| x * y} # => 2 * 3 = 6

那么这个&起了什么作用?

1
2
3
4
5
6
7
def my_method(&code)
code
end

p = my_method{ |name| "Hello,#{name}!"}
puts p.class # => Proc
puts p.call("shooter") # => Hello,shooter!

&操作符的真正含义:Proc对象和块之间的切换符号。&code是一个块,code是一个Proc对象。
简单的去掉&操作符,我们就能再次得到一个Proc对象。

1
2
3
4
5
6
7
def proc_to_block(greeting)
puts "#{greeting},#{yield}"
end

my_proc = Proc.new {"shooter!"}
puts my_proc.class
proc_to_block("Hello", &my_proc)

lambda函数
lambda跟Proc就像两个双胞胎

1
2
plus = lambda { |x| x + 1 }
puts plus.call(2) # =>3

lambda跟Proc有两个最明显的区别:

  1. lambda检查参数的个数,Proc不会。

     在Proc中,多余的参数被设为nil。但lambda中,Ruby会抛出一个ArgumentError错误。
  2. return不同。

     lambda的return是返回值给方法,方法会继续执行。Proc的return会终止方法并返回得到的值。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def proc_return
    Proc.new { return "Proc.new"}.call
    return "proc_return method finished"
    end

    def lambda_return
    lambda { return "lambda" }.call
    return "lambda_return method finished"
    end

    puts proc_return # => Proc.new
    puts lambda_return # => lambda_return method finished
    看了代码会一目了然。参考了不少资料,就是拼凑的起来的。

那些天我不是在面试,就是在面试的路上,搞得很懈怠,主要还是精神上的。
有的中规中矩;有的问题很琐碎;有的很BT,概念性的东西一股闹的全抛出来了……
我记性不太好,对概念不感冒,倒不是从小这样,记得当年还背过视力表,
可能三聚氰胺喝多了吧。

Symbol与String

在rails中经常看到Symbol,像 :name :email params[:user]
这种已:开头的变量就是Symbol对象。貌似我经常把两者混用,还有些不同的。

创建 symbol 对象

1
2
:foo
:"shooter"

在 Ruby 中每一个对象都有唯一的对象标识符(Object Identifier),可以通过 object_id 方法来得到一个对象的标识符。

1
2
3
4
5
6
7
8
9
10
1.9.3p194 :001 > 3.times{ puts :foo.object_id }
230808
230808
230808
=> 3
1.9.3p194 :002 > 3.times{ puts "foo".object_id }
85823400
85823380
85823350
=> 3

一个字符串每出现一次 Ruby 就会创建一个 String对象,即便他们包含了相同的字符串内容;
而对于 Symbol 对象,一个名字(字符串内容)唯一确定一个 Symbol 对象。
Symbol 对象一旦定义将一直存在,你不能对symbol赋值,
而且在运行环境中symbol的值也不会改变,直到程序执行退出。

相互转化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Symbol到String

1.9.3p194 :001 > :foo.id2name
=> "foo"
1.9.3p194 :002 > :foo.to_s
=> "foo"
1.9.3p194 :003 > :"I am a rubyist"
=> :"I am a rubyist"

# String到Symbol

1.9.3p194 :004 > "rubyist".to_sym
=> :rubyist
1.9.3p194 :005 > "rubyist".intern
=> :rubyist

从实用角度看,在一些场景下Symbol好过String只有两点:节省内存,表达简洁

通常来讲,当你面临 String 还是 Symbol 的选择时,可以参考以下标准:

  如果使用字符串的内容,这个内容可能会变化,使用 String

  如果使用固定的名字或者说是标识符,使用 Symbol。

这是第一篇,没想到一个内容就这么多,再写东西就有些多了,果断阉割了。

“Across the Great Wall we can reach every corner in the world.”

中国不愧为文明古国,早有先见之明,古有长城,今有×××,人们乐此不疲的到墙外透透气儿。
不知何时翻墙也晋升为程序猿的基本功——仅是个人观点。

在ubuntu用GAE翻墙,简单经济实惠。适合我这种不想买VPN又想看外面的人。
我翻墙更多是浏览网页,基本用不到全局代理,我的标配是chrome和它的一个插件Proxy SwitchySharp。

安装chrome

尽管有Firefox,大爱还是chrome,先下载最新的deb安装包,然后

1
2
3
4
5
$ sudo dpkg -i  google-chrome-stable_current_i386.deb
# 提示没有安装所需要的依赖包
$ sudo apt-get -f install
# 安装依赖包
$ sudo dpkg -i google-chrome-stable_current_i386.deb

让我感觉最恐怖的是,chrome 关联好账户后,那些配置和书签都在了。My privacy!

注册Google App Engine帐号

1.用Google账户登录Google App Engine后,
点击Create an Application创建一个应用程序。

2.输入手机号码,接受创建验证码,必须有此过程,否则无法注册成功。

3.输入验证码后就进入了创建应用程序的详细设置界面。
填写Application Identifier和Application Title以及勾选同意服务条款,点 Save 即完成创建。
在这里把Application Identifier称为app_id

** SDK &&fetchserver &&localproxy**

1.下载 Google App Engine SDK
这是python版的SDK,因为ubuntu自带了python,解压sdk到任意文件夹。

2.在这里
下载对应的localproxy和fetchserver的linux版本。
解压fetchserver文件夹至Google App Engine SDK目录

3.打开fetchserver文件夹内的app.yaml文件,修改第一行

1
application: your_application_name

your_application_name改为刚才输入的app_id,
再打开localproxy文件夹的proxy.conf文件,修改最后一行

1
#fetch_server = http://your-fetch-server.appspot.com/fetch.py

去掉#,your-fetch-serve改为刚才输入的app_id。

4.上传fetchserver:进入Google App Engine SDK目录,运行命令appcfg.py update fetchserver,会要求你输入Google 账户及密码,之后关闭结束上传。

5.运行proxy.py。

进入localproxy文件夹,然后

1
$ python proxy.py

安装Proxy SwitchySharp插件

从Chrome 网上应用店安装Proxy SwitchySharp,配置 HTTP Proxy 为 127.0.0.1 ,Port 为8000。
然后保存。被墙的时候,点击Proxy SwitchySharp,刷新页面即可。

快捷方式

若每次都要翻墙都要用到命令行,一定会吐血。我用到一个简单的方法,就是给文件添加链接到桌面

1
2
3
4
#文件添加执行权限
$ sudo chmod +x proxy.py
# 添加链接
$ ln ~/GFW/localproxy-2.0.0/proxy.py ~/Desktop/killer

只要在桌面双击killer即可。

今天是农历七月十五,有些想妈妈了,愿她一切都好。

上一篇坑挖了一半,今天一定要把坑挖好。

继续 passenger, nginx,
mongodb, redis,
Node.js 的安装。

安装Node.js

配置好ruby on rails 环境后,创建一个rails 项目

1
2
3
4
$ rails new demo
……
$ cd demo
$ rails s

一般会提示这样的错误,Could not find a JavaScript runtime ...
具体请移步 stackoverflow

在ubuntu环境下,安装node.js即可

1
$ sudo apt-get install nodejs

完成后再次运行项目

安装passenger和nginx

安装passenger

1
$ gem install passenger

安装passenger的nginx模块,nginx一并安装,需要root,我们可以用rvmsudo

1
2
3
4
5
6
7
8
rvmsudo passenger-install-nginx-module
# 提示哪种安装模式

1. Yes: download, compile and install Nginx for me. (recommended)
# 完全安装

2. No: I want to customize my Nginx installation. (for advanced users)
# 自定义安装

选择1,回车,进一步提示安装位置,直接回车,nginx 将安装在默认位置,即/opt/nginx。
添加nginx启动脚本,参考这里

1
2
3
4
5
6
7
8
9
10
11
12
$ sudo mv nginx /etc/init.d   # 脚本移动到 /etc/init.d
$ sudo chmod +x nginx # 添加执行权限

$ sudo /etc/init.d/nginx start
# * Starting Nginx Server... [ OK ]

$ sudo /etc/init.d/nginx restart
# * Stopping Nginx Server... [ OK ]
# * Starting Nginx Server... [ OK ]

$ sudo /etc/init.d/nginx stop
# * Stopping Nginx Server... [ OK ]

nginx的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sudo vim /opt/nginx/conf/nginx.conf              # 打开配置文件
......
http {
passenger_root ~/.rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.15;
passenger_ruby ~/.rvm/wrappers/ruby-1.9.3-p194/ruby;

include mime.types;
default_type application/octet-stream;
......
server {
listen 80; #端口
server_name localhost; #域名
root ~/www/demo/public; #项目public路径
passenger_enabled on;
}

这样就可以访问 http://localhost

安装 mongodb

1
$ sudo apt-get install mongodb

运行

1
2
3
$ mongo
MongoDB shell version: 2.0.4
connecting to: test

安装redis

下载并安装redis

1
2
3
4
5
wget http://redis.googlecode.com/files/redis-2.4.16.tar.gz
tar -zxf redis-2.4.16.tar.gz
cd redis-2.4.16
make
sudo make install

安装mysql

1
$ sudo apt-get install mysql-server mysql-client

全都大功告成 ^_^

PS 发现网页被墙了,ubuntu 也跑不了翻墙,Fuck GFW!

Ubuntu 12.04 出来有段时间了,一直没有更新,本想从11.10的系统
直接升级,结果脆生生挂掉了,好多东西拿不出来了。杯具,重装吧!

主要是 ruby on rails 和它相关联的在 ubuntu 上的安装配置。
包括 rvm , ruby on rails, Sublime Text,
passenger, nginx,
mongodb, redis 的安装,
顺便把 Node.js 也装上,当作汇总了。

安装Ubuntu 12-04

首先准备好12.04的 iso 镜像,需要先从官网下载,我是把iso文件写入U盘后安装的。
从10.10以后,用 UltraISO 制作出来的 Ubuntu 启动盘会出现无法启动的现象,有人说 ImageWriter 很靠谱,
先用了ImageWriter
不过我的本本提示没有写入权限,所以找到了另一个版本
顺利写入。然后插上U盘,重启,设置从U盘启动,基本一路 next,结果手欠,装成E文的系统了。

安装配置

中文输入

12.04 的中文输入是个大问题, 即使能输入中文,在低版本的 Sublime Text 中也不能输入中文,
好在 dev版本在其他输入法下 已经ok了。

安装 Ruby On Rails

先安装一些 ruby on rails 的依赖包,听前辈们的话不会错。

1
$ sudo apt-get install -y build-essential openssl curl libcurl3-dev libreadline6 libreadline6-dev git zlib1g zlib1g-dev libssl-dev libyaml-dev libxml2-dev libxslt-dev autoconf automake libtool imagemagick libmagickwand-dev libpcre3-dev libsqlite3-dev

No.1 安装 RVM

1
$ curl -L get.rvm.io | bash -s stable

给 ~/.bashrc (Ubuntu) 加上脚本引用

1
$ echo '[[ -s " HOME/.rvm/scripts/rvm" ]] && source " HOME/.rvm/scripts/rvm"' >> ~/.bashrc

然后,重新载入那个文件

1
$ source ~/.bashrc

测试一下

1
2
$ rvm -v
rvm 1.15.5 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

No.2 用 RVM 安装 Ruby 环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ rvm list known #显示可供选择的版本

[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-p370]
[ruby-]1.9.1[-p431]
[ruby-]1.9.2-p180
[ruby-]1.9.2-p290
[ruby-]1.9.2-p318
[ruby-]1.9.2[-p320]
[ruby-]1.9.2-head
[ruby-]1.9.3-preview1
[ruby-]1.9.3-rc1
[ruby-]1.9.3-p0
[ruby-]1.9.3-p125
[ruby-]1.9.3[-p194]
[ruby-]1.9.3-head
ruby-head
......

# 要安装1.9.3,直接
$ rvm install 1.9.3

……………… 漫长的的等待 ………………

Ruby 装好以后,通过 RVM 将指定版本的 Ruby 设置为系统默认版本

1
$ rvm  1.9.3 --default

测试一下

1
2
3
4
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]
$ gem -v
1.8.23

No.3 安装 Rails 环境

1
$ gem install bundler rails

测试一下

1
2
3
4
$ bundle -v
Bundler version 1.1.5
$ rails -v
Rails 3.2.8

ruby on rails 的安装齐活了。

安装 Sublime Text

由于输入汉字原因,安装 Sublime Text 的dev版本,就是比较新的。
先 google 一下 Sublime Text 的ppa源,好吧,ppa暂且是什么先不管。

1
2
3
$ sudo add-apt-repository ppa:webupd8team/sublime-text-2
$ sudo apt-get update # 更新软件源
$ sudo apt-get install sublime-text-dev

Sublime Text 2 是在俺剛學習Ruby時大大們極力推薦的,真的超贊。
Sublime Text是用python语言编写。如果熟悉python,你也可以编写插件實現自己想要的功能。目前插件集中在github上,需要在线安装。安装插件前需要 安装包控制(Package Control)

安装包控制(Package Control)

  • 打开Sublime Text 2,按下 Ctrl+` 调出 Console。
  • 将以下代码粘贴进命令行中并回车:
    1
    import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
  • 重启 Sublime Text 2,如果在 Preferences -> Package Settings中见到
    Package Control这一项,就说明安装成功了。

使用 Package Control 安装插件

  • 按下Ctrl+Shift+P,调出窗口

  • 在输入框中输入install,将智能模糊提示,光标选中 Package Control: Install Package,果断回车

  • 在新弹出的窗口中,(假设SublimeREPL),直接将插件名(如 SublimeREPL)复制到输入框中

  • 大功告成,有时特殊情况,需要在第二步前,先通过输入repository 添加插件的url,重复第二步,然后真正的ok。
    MarkdownEditing 是这样滴情况。

我的插件集

俗话就说嘛 好记性不如烂笔头 ^_^

  • Gist gist代码分享

  • SublimeREPL
    将 Ruby Shell (即 IRB)整合到 Sublime Text 中,而且集成了 node coffeescript lua 等,不过需要配置好环境,
    偶的只有irb,其他都是提示错误。

  • MarkdownEditing markdown编辑插件

  • Markdown Preview markdown预览插件

感觉每个插件都大有搞头的样子 ,以后再说吧。

PS: 第一次写东西,刚刚上手markdown,参考了网上n多资料,还要亲手尝试一遍,恨费工夫和精力,好在没有神马意外情况。