Posts Tagged ‘ruby’

Freelancing 并不等于 Free

June 24, 2008 Tags: , ,

告别全职工作已有数月了,四月份正式开始 freelancing 至今也已经有两个月 。切身感受到 Freelancing 并不意味着完全 free,因为:

  • 不够牛,所以没有高回报的项目;
  • 什么活都有进度压力,有时(确切得说是大部分时间)会比全职上班更辛苦;
  • 活多了会忙不过来,项目青黄不接时会没有饭吃;

放弃上班却正是因为 freelance 的 free 这一点。不用看老板脸色,不用朝九晚五,可以去看周二半价电影,可以自己选择要做的东西,可以在工作时间看书看碟。当然,享受这一切的前提是,要有够用的奶粉钱可以赚。

计划对 ashchan.com 再进行一次修改,使用 haml 作为 view template engine,并把外观简单化。

本人主要接 Rails 和 Ruby 相关的活。如果你有项目需要 outsourcing ,或者你有项目要寻求技术合作并且希望合作地在杭州,可以与我联系

Mechanize的内存问题

June 5, 2008 Tags: ,

Mechanize来写爬虫是非常轻松的一件事。简单的事情不一定会完美,比方说:

agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 6'
10000.times do
    page = agent.get("http://some.site")
    puts (page/"div#title").text
end

暂且假设http://some.site不会封禁你的访问,同时每一次agent.get都返回了正确的页面(网络无问题)。这一万次页面访问有问题吗?

有!问题在于Mechanize实在很强大,它模拟自然的浏览器行为,所以默认它会去保留访问历史纪录,并且这个纪录貌似没有加以大小限制!运行这段ruby代码,很快内存使用会上升至 1G 以上。

把历史纪录的大小设为一个合理的值,在这种情况下设为1比较合适:

agent.max_history = 1

再运行这段代码,内存使用在20~30M间波动,非常稳定。

iPhone上跑Ruby

May 5, 2008 Tags: , , ,

Ruby可以在iPhone上跑吗?答案当然是肯定的。最多只要五分钟,就可以搞定(其实对于大部分破解的iPhone来说前三步应该已经操作过):

  • 安装Installer.app
  • 添加Community Sources
  • 安装BSD Subsystem (System 分类下)
  • 安装Term-vt100 (System 分类下)
  • 安装Ruby (Development 分类下)

安装完Ruby,接到提示:

Please add /opt/iphone/bin to your $PATH

那就乖乖听话,把它加进去吧。运行Terminal(即上面安装的Term-vt100),敲入:

cd ~
echo "PATH=$PATH:/opt/iphone/bin" >> .profile

为了使它生效,需要重启一下Ternimal:

killall Terminal

再运行Terminal,显示$PATH看加入了没有。如果有了,运行一个简单的命令测试一下:

echo $PATH
ruby -e "puts 'hello iphone'"

结果如下:

Ruby on Iphone

BTW,执行ruby -v看了一下,结果为:

ruby 1.8.6 (2007-03-13 patchlevel 0) [arm-darwin]

而我的Leopard 10.5.2下为:

ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]

好玩!

Rails中使用Stone

April 21, 2008 Tags: , , ,

Stone是一个数据持久化Ruby库。它把数据保持至文件中(ymal格式),特点是快速易用,因而特别适用于小规模的应用。

要在Rails中使用Stone是非常简单的。我们来创建一个简单的Todo应用:

首先安装Stone:

sudo gem install stone

创建Rails应用:

rails todo

在 config/initializers 中新建一个文件,命名为 stone.rb,文件内容如下:

require 'stone'
Stone.start(Dir.pwd, Dir.glob(File.join(Dir.pwd,"app/models/*")), :rails)

接下去,去掉 ActiveRecord 的使用。在 config/environment.rb 中加入:

config.frameworks -= [ :active_record ]

准备工作完成了。现在使用Stone的stone-gen命令来生成一个model:

stone-gen model Todo title:string

生成后,可以发现 app/models 目录下自动创建了一个 todo.rb 文件,其内容如下:

class Todo
    include Stone::Resource

    field :title, String
end

好了,model有了,我们偷偷懒,用scaffold来创建一个controller(因为我们已经有了model,所以加上–skip-migration参数):

script/generate scaffold Todo --skip-migration

自动生成的controller和view还跑不起来,因为Stone的model方法跟ActiveRecord有所区别,需要调整一下。我们先来改各个view:

在new.html.erb中的表单中,加入:

<p><label>Title:</label><%= f.text_field :title %></p>

在show.html.erb最上边,加入:

<%= h @todo.title %>

其他view先不管了。接下去修改todos_controller:

将index中的:

@todos = Todo.find(all)

修改为:

@todos = Todo.all()

将show中的:

@todo = Todo.find(params[:id])

修改为:

@todo = Todo[params[:id]]

好了,用script/server把应用跑起来,测试一下。访问http://localhost:3000/todos/new,创建一个新的todo:

Stone new

创建成功后,访问http://localhost:3000/todos/1,显示也正确:

Stone Show

不错,果然是非常易用。那么Stone把数据存到哪去了呢?答案是在app/datastore下。在这个目录下可以找到一个todo子目录,里边有刚创建的todo对象的数据文件1.yml,文件内容为:

--- !ruby/object:Todo 
errors: !ruby/object:Validatable::Errors 
  errors: {}

id: 1
title: "tada #1"

结论:Stone很好很强大,待这个库发展更成熟一些后,可以在规模较小又不计划使用MySql或其他数据库的应用上使用。

Thin: 比Mongrel更快的Web服务器

January 5, 2008 Tags: , , ,

Thin是一个尚处于实验阶段的ruby web服务器,号称比Mongrel更快。不过,它本身是基于Mongrel项目和另外两个ruby库之上的:

Rails Is A Ghetto

January 2, 2008 Tags: , ,

Mongrel的作者写了一篇文章Rails Is A Ghetto,例举了他亲历的Rails和Ruby社区的种种“不良现象”,引起轩然大波。这篇文章攻击性很强,长度不短,文字很个性。性情温和的rails开发者可以读读。

Safe Way to Try Ruby 1.9

December 28, 2007 Tags: ,

Ruby 1.9.0备受期待:性能的大幅提高、语言本身的演进等等。不过因为这是一个development release,不适合马上用于生产环境(很多现有的库不会被兼容)。那就用一种更安全的方式来使用1.9.0吧。

Continue reading»

RubyGems 1.0.0发布

December 21, 2007 Tags: , ,

RubyGems 1.0.0版本发布了(原最高版本为0.9.5)。用以下命令更新至1.0.0版本:

sudo gem update –system

要了解RubyGems 1.0.0与以前版本的差别,可以参考这里