Posts Tagged ‘Ruby’

Heroku试用体会

// August 27th, 2009 // No Comments » // Ruby

上一篇的sinatra应用部署在了heroku上。经过几天的试用有几点体会

1. Heroku是架构在Amazon EC2上的,具有不错的扩展性,只要你有钱,拖拉一下鼠标就能实现scaling了。这一点着实很方便。当然代价是价格会比EC2高,毕竟人家提供了增值服务嘛。具体高多少很难比较,连heroku的老板都说对应关系很复杂。基本上要是网站做大了,用heroku就不合算了。

2. 不烧包的就用heroku的free配置,只有一个dyno的,5M存储空间,可以支持绑定自己的域名。

3. 近期遭遇了几次request time out,因此查了一下heroku doc,dyno基本上把它看成一个线程吧,换句话说,这个一个dyno的free版只能支持并发度为1的压力。因此并发连接多的化,你会经常看到time out的。计算容量也是比较寒酸,用ab -n 10 url测一下,10个请求4个fail掉了orz. 看来免费的午餐也不好用啊。大家用来做原型demo就好了,验证好了自己找地方去deploy也挺好。

update:不知道是这次测试当时受海底光缆受损的影响还是其他原因导致结果很差,后来新的测试比较正常,后面我贴了一个新的benchmarking的测试结果。free的计划还是可以承受一些负载压力的。特此给heroku正名

4. heroku提供了deploy代码的好方案,但在DB方面限于技术原因,还比较薄弱,mysql什么的还是用不起来。

5. google map API是跟域名相关的,如果没有自己的域名的话,部署到xxxx.heroku.com这种子域名下面是不能用的,想必早有人在heroku下面申请了key, 后来者都会遇到冲突。花钱买自己域名吧

6. Heroku的想法不错,这也难怪他们会积攒了数万用户,也得到了300万美元的投资。云计算,不再是一个概念了,已经有若干成熟的方案面向消费者了。这一点要向先行者amazon致敬

7,最后一点就是heroku的支持做的不怎么样,文档也很不完整。遇到问题还是要自己摸索解决。

add-on: AB benchmarking result:做了两个测试,一个是简单到极致的逻辑,另一个相反,是复杂到极致的逻辑,看看两个边界状况的对比和共性应该更能说明问题:case1表现不错(里面就两行code当然不错了,呵呵),case2太复杂了,failed了88个(一共100个请求,FT).

case1: light code:
localhost:sinatra tony$ ab -n 100 -c 10 http://ip2loc.dazhe.me/counter/
This is ApacheBench, Version 2.3 < $Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking ip2loc.dazhe.me (be patient)…..done

Server Software: nginx/0.6.38
Server Hostname: ip2loc.dazhe.me
Server Port: 80

Document Path: /counter/
Document Length: 15 bytes

Concurrency Level: 10
Time taken for tests: 7.828 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Non-2xx responses: 100
Total transferred: 26200 bytes
HTML transferred: 1500 bytes
Requests per second: 12.77 [#/sec] (mean)
Time per request: 782.820 [ms] (mean)
Time per request: 78.282 [ms] (mean, across all concurrent requests)
Transfer rate: 3.27 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 309 389 192.2 317 1233
Processing: 316 378 272.2 337 3050
Waiting: 314 377 272.3 335 3050
Total: 627 767 332.5 661 3370

Percentage of the requests served within a certain time (ms)
50% 661
66% 677
75% 705
80% 815
90% 1017
95% 1543
98% 1570
99% 3370
100% 3370 (longest request)

case2: heavy code:
localhost:sinatra tony$ ab -n 100 -c 10 http://ip2loc.dazhe.me/
This is ApacheBench, Version 2.3 < $Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking ip2loc.dazhe.me (be patient)…..done

Server Software: nginx/0.6.38
Server Hostname: ip2loc.dazhe.me
Server Port: 80

Document Path: /
Document Length: 696 bytes

Concurrency Level: 10
Time taken for tests: 24.932 seconds
Complete requests: 100
Failed requests: 88
(Connect: 0, Receive: 0, Length: 88, Exceptions: 0)
Write errors: 0
Non-2xx responses: 88
Total transferred: 36676 bytes
HTML transferred: 10992 bytes
Requests per second: 4.01 [#/sec] (mean)
Time per request: 2493.243 [ms] (mean)
Time per request: 249.324 [ms] (mean, across all concurrent requests)
Transfer rate: 1.44 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 310 328 28.1 316 410
Processing: 614 2067 790.9 1961 3904
Waiting: 613 2066 790.9 1960 3903
Total: 977 2395 788.1 2370 4214

Percentage of the requests served within a certain time (ms)
50% 2370
66% 2645
75% 2888
80% 3086
90% 3569
95% 4036
98% 4177
99% 4214
100% 4214 (longest request)

Sinatra,Heroku,Google AppEngine,Google Map的简单试用

// August 25th, 2009 // 3 Comments » // Ruby

写了个简单的google map应用,用的是简单清爽的Sinatra做DSL, Google Map API, 作用就是把访问者的ip地址解析到地理位置然后在google map上标出来。部署在Heroku上。整个程序只有62行ruby代码。地址在这里:ip2loc.dazhe.me

同样,这段代码可以不经修改的跑在Google AppEngine上,有时间的时候我再做这件事吧。下面是个抓图,有兴趣的朋友帮我验证一下效果。具体地址可能有些偏差,因为用的是国外的ip查询库,在国内的部分可能差别较大,比我我自己的ip就被标在了北海。
snap

用Ruby on Rails开发Facebook 应用(2)

// July 28th, 2008 // 1 Comment » // Ruby, 电脑网络, 编程开发

上一篇说了不少虚的,现在作点儿实在的:

Step.1 Facebook注册一个App.
作为facebook的用户,在也面最下方的developer连接可以进入开发者的portal. 这需要你加入developer app(这本身也是facebook的一个app).之后你就可以创建facebook app了。你需要指定的最基本的信息包括application name, callback url和canvas page url. 尤其是后者,可以看作是facebook给你分配的地址,不可重复。由于facebook已经有了超过26000个app,好名基本都有人用了,因此想要找一个长度合适有好记又有意义的canvas url药费一下脑筋了。

注册好的app也可以更改属性,并不是一成不变的。过程简单不贴图了。总之你的app有了自己的key和secret. 这两个是facebook识别app的重要依据。

Step.2 本地开发环境安装rfacebook和rfacebook plugin (前提是你有一个work的rails环境哦,别告诉我还没有。翻翻我之前的帖子)

sudo gem install rfacebook

rails yourappname
cd yourappname
script/plugin install svn://rubyforge.org/var/svn/rfacebook/trunk/rfacebook/plugins/rfacebook

Step.3 配置facebook app信息
生成facebook.yml文件:
rake facebook:setup
将facebook.yml按照facebook app的信息进行填写

注意facebook.yml每段都有tunnel:

tunnel:
username: yourLoginName
host: www.yourexternaldomain.com
port: 1234
local_port: 5678
这是用来提供你自己的电脑和虚拟主机服务器之间的链路的。要知道facebook把对你app的访问请求转到我们自己的虚拟主机上,要是开发的时候任何一点变化都要deploy到服务器上才能生效的话,怕是要累死了。所以tunnel提供了使用ssh来使得服务器到本地开发环境的链路。这样可以认为facebook把访问请求转到了local的机器上。

怎么用这个tunnel配置呢?看例子
tunnel:
username: foobar < ----- ssh user id
host: www.mysite.com < ----- server adderss
port: 8888
local_port: 3000

配只好之后就rake之:
rake facebook:tunnel:start

(待续)

Ruby on Rails开发Facebook 应用(1)

// July 28th, 2008 // 1 Comment » // Ruby, 编程开发

facebook为app提供了很庞大的用户群体和不错的API支持(至少对ruby on Rails来说是如此),对于想把Web2.0作为创业方向的同学来说,可以节省积累用户的时间。

要学习facebook app的基础知识的同学请参看这里,已经对facebook熟悉的同学请跳过:
[连接丢失,抱歉]

看完之后你至少应该知道Facebook App有三种和facebook耦合的方式(external,Iflame,FBML),这就ok了.

前面说过用Ruby开发facebook app有不错的支持,是因为这个东东: “rfacebook” 什么?这么大名鼎鼎的东西不知道?那你得看看这个

http://rfacebook.rubyforge.org/

不看也行,你知道rfacebook提供了facebook api的ruby接口就行了。新版的rfacebook还连同一个rails plugin一起release,大大方便了使用rails的同学

网上能找到不少有关RoR开发Facebook App的教程。比如一下这些,建议大家都看看:

http://www.liverail.net/articles/2007/6/29/tutorial-on-developing-a-facebook-platform-application-with-ruby-on-rails

http://giantrobots.thoughtbot.com/2007/6/14/fist-in-your-facebook

看过上面的教程相信大家有了更多认识;更相信大家有一个印象,就是这些教程太老了(没办法,谁让rails更新的这么快呢),通过这些教程理解要点还可以,跟着作是没什么希望的。反正我是看到rhtml的后缀就没法再忍受往下看了。网上爬了个遍也没看到有更新的教程。那就自己摸索这来吧。(待续)

A textmate-like gedit in Ubuntu for Ruby and Rails IDE

// April 17th, 2008 // 2 Comments » // Ruby, 编程开发

Pls follow the instructions from http://grigio.org/pimp_my_gedit_was_textmate_linux

Add-on by Deep Blue (Linux newbie may need this if you are using Ubuntu):

How to install liberation fonts on Ubuntu

commands:
——————————————————-
echo “deb http://ppa.launchpad.net/corenominal/ubuntu gutsy main” | sudo tee -a /etc/apt/sources.list
echo “deb-src http://ppa.launchpad.net/corenominal/ubuntu gutsy main” | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install ttf-liberation
——————————————————-

My customized Gedit screen snapshot:
A textmate-like Gedit as Ruby and rails IDE

x86 架构下Ruby/Rails开发环境比较及安装方法

// April 11th, 2008 // No Comments » // Blog, Ruby, 电脑网络, 编程开发

x86 架构下Ruby/Rails开发环境比较及安装方法
[Ruby/Rails Development Environment comparison and setup instructions on x86 platform]

Original posted on www.tzhang.com/blog/
Apr 11, 2008
Version 1.0

方案选择:
1. OSX + Textmate
2. Linux + Netbeans
3. Windows + e texteditor + cgywin

优缺点比较:

1. 缺点:
a) OSX在非Mac机器上安装对显卡的要求很高,兼容性并不好。多系统启动支持也不好,需要用户有较高的操作系统知识和排错技能以及很出众的耐心和时间:(
b) OSX安装在非Apple机器上理论上说是非法的;textmate也是收费软件且价格不菲

优点:想使用最优秀的ruby/rails 编辑器textmate的话,只能这么办哦

2. 缺点:
a) NetBeans IDE比不上textmate;只能将就着用

优点:
a) Linux下全部软件都是开源免费的,包括NetBeans
b) Linux下可以方便的安装使用众多Rails相关的开源软件及库

3. 缺点:
a) Windows环境在ruby/rails的世界里绝对算是少数派
b) e texteditor也是收费软件

优点:
a) Windows简单易用,方便没有Linux/UNIX经验的人使用,setup过程简单
b) e texteditor 使用起来十分接近textmate

安装方法:
——————————————————————————————————–
方案一
OSX
N/A yet
——————————————————————————————————-
方案二
Linux + NetBeans + ruby 1.8.6 + rubygem 1.0.1 + rails 2.0.2 + mysql 5
a) 安装Ubuntu Linux
b) 安装Ruby (初学者在Ubuntu下推荐用apt-get安装1.8.5版本)
sudo apt-get install ruby
c) 安装RubyGem
Download RubyGem code
url: http://rubyforge.org/frs/?group_id=126
Untar
tar –xzvf rubygems-1.1.0.tgz
Setup
Sudo ruby setup.rb
验证安装
gem –v
which gem
d) 安装rails
安装
sudo gem update –system
sudo gem install rails –y
验证安装
rails -v
e) 安装Netbeans
下载安装文件:
url: http://dlc.sun.com.edgesuite.net/netbeans/6.0/final/
安装
把下载的Bin文件拖入终端即可
运行
/$installDir/bin/netbeans
f) 安装MySQL
sudo apt-get install mysql-common mysql-clients
g) 安装完成,记得在NetBeans里面更改默认的Ruby解释器
———————————————————————————————-
方案三
Windows + e texteditor + cgywin + console2
a) 安装e texteditor
url: http://www.e-texteditor.com/download/e_beta_setup.exe
安装
注意安装途中可能报错,那是个别文件不符合windows命名规则的原因,不用管,ignore掉然后继续就好了,影响不大。
b) 安装cgywin
初次运行e texteditor就会提示安装cgywin,直接选automatic install就好了,e texteditor会自动下载cgywin
c) 安装console2
下载console2
url: http://sourceforge.net/projects/console/
解压即可
配置console和cgywin
选add tab, 在shell里面输入:
c:\cygwin\bin\bash –login –i
将该tab移到最上方,以后每次启动console2都会自动启动该shell
d) 安装RubyGem
Download RubyGem code
url: http://rubyforge.org/frs/?group_id=126
Untar
tar –xzvf rubygems-1.1.0.tgz
Setup
Sudo ruby setup.rb
验证安装
gem –v
which gem
如果出现错误,使用:
unset RUBYOPT

e) 安装rails
安装
sudo gem update –system
sudo gem install rails –include-dependencies
验证安装
rails -v

f) 测试安装
rails blog
cd blog
e .
你将会看到e texteditor 自动启动并将当前目录的项目打开。

====================================================================
updated 2008-04-16

Install sqlite3 and mongrel:

#before install Mongrel,
apt-get install build-essential #we need it to compile mongrel and Sqlite3

#intall Mongrel
gem install mongrel –include-dependencies

#install Sqlite3
apt-get install sqlite3 swig libsqlite3-ruby libsqlite3-dev
gem install sqlite3-ruby #compile this need libsqlite.h

#install Lighttpd
apt-get install lighttpd

===============================================
UPDATED 2008-05-27:
在Linux下有更好的IDE选择了,Gedit可以加几个插件和主题,就可以比较完美的模仿textmate了,具体请看这个帖子
http://www.tzhang.com/blog/2008/04/17/textmate-like-gedit

Ubuntu环境下Ruby, Rails, Waves的安装方法

// March 20th, 2008 // No Comments » // Ruby, 编程开发

Reference: http://www.javaeye.com/topic/43228

Ubuntu环境下Ruby, rails, waves的安装方法:

1 ) Ruby 1.8.6
ruby的源代码可以从Ruby官方网站下载:

http://www.ruby-lang.org/en/downloads/

./configure –prefix=/usr/local/ruby

make

sudo make install

export PATH=/usr/local/ruby/bin:$PATH

安装好以后,修改操作系统PATH路径,加入/usr/local/ruby/bin:
export PATH=/usr/local/ruby/bin:$PATH

在Linux上,一般将设置放在/etc/profile中,便于对全局生效
sudo gedit /etc/profile

add the following lines before umask 022

if [ -d /usr/local/ruby/bin ] ; then
PATH=/usr/local/ruby/bin:”${PATH}”
fi

——————————————————

2 ) Rubygems是ruby的在线包管理工具,可以从rubyforge下载rubygems:

http://rubyforge.org/projects/rubygems/

sudo /usr/local/ruby/bin/ruby setup.rb

验证安装:gem -v
which gem

3 ) Install Rails
sudo gem install rails -y

4 ) Install Waves
sudo install waves
注意在Ubuntu环境下虽然在/etc/profile里面有ruby的path, 但是sudo的话还是提示需要ruby 1.8.6以上环境。找乐很多地方都没有解决方法(好把我承认是linux菜鸟,可能大家都不屑于些出来把,最后启动的时候选recovery mode意外的发现可以以root id登入,一切ok啦)

Problem: sudo will not provide the ruby path.
solution: use ubuntu recovery mode and you will have a real root user.

5 ) Install mysql

sudo apt-get install mysql-common mysql-clients