Archive for the ‘Ruby’ Category

Ruby on Crack: yet another web framework

Wednesday, April 2nd, 2008

:D 愚人节里各个社区里的气氛都活跃了许多,在 Ruby-talk 的邮件列表里发现了 N 个 Ruby fork 要发布了,还有用 PHP 写的 Ruby 。其他社区也很活跃,Java 似乎是今年的一个主角:各种各样的项目都要迁移到 Java 了。 :D

不过令我敬佩的是虽然只是愚人节的玩笑,许多人都很细心地去做,比如前面的这个叫做 Brobinius 的 Ruby fork 还专门做了一个网站。还有 Antonio Cangiano 的 Ruby on Crack ,他最后一段描述的不同的人对 Ruby on Crack 的反馈:

“Those who use Crack can really appreciate the beauty of Ruby.” — Matz

“Fuck You” — DHH

“Incredible framework. I plan to publish a book about it ASAP, and I’m sure that it’ll be the first in a long series of books that I’ll write while using Crack.” — Dave Thomas

“Crack is what we really needed at Engine Yard.” — Ezra Zygmuntowicz

“Wow, what an eye opener. Crack made web programming fun again.” — Obie Fernandez

“You ass#$!@ m0#@#!@&%$” — Zed Shaw

“Once you have tried Crack for the first time, you realize how addictive it is. I simply can’t go back to Rails anymore.” — April Pesce

“Web 3.0 will belong to those on Crack.” — Tim O’Reilly

“If there is something that the Ruby community got right it’s Crack. I wish Python programmers were on Crack too!” — Guido van Rossum

“This is truly innovative and a godsend for startups. Give us about 6 years and we’ll have Arc on Crack too.”- Paul Graham

也是写得相当生动啊! :D

[ANN] RMMSeg 0.1.4 Released

Sunday, March 2nd, 2008

我今天发布了 RMMSeg 0.1.4 版。性能有少许提升,现在使用 ComplexAlgorithm 大约有 20KB/s 的速度,而 SimpleAlgorithm 差不多是 60KB/s 。我在一个 branch 里用 C 来实现了一部分代码,减少了许多 String 的构造,可是效果并不明显,让我非常失望,而且由于我在前一篇 Blog 里提到的 Ruby 关于 Hash 的 Bug ,需要打过 patch 的 Ruby 才能正常运行,所以并没有把带 C 扩展的版本包含在这个 Release 中。

下面是 RubyForge 上的 Release announcement:

Read the rest of this page »

Fixnum Overflow in Ruby’s Hash Implementation

Sunday, March 2nd, 2008

Ruby’s build-in Hash is the first-choice if you want to do searching. Using your own customized object as hash key is simple: define the following two method for your object:

  • hash: to get the hash code of the object.
  • eql?: to compare whether two object are equal.

When working to improve the performance of RMMSeg, I tried to implement a Substring class which can hold a reference to a big chunk of text instead of doing an expensive copy. Then I implemented the hash and eql? method. The hash value calculated is identical to the related String, and eql? is properly implemented. But the whole thing seemed not working quite well.

Read the rest of this page »

A Better method_missing

Thursday, February 28th, 2008

method_missing 是 Ruby 用于实现其动态性的一个重要成员。简而言之就是在调用一个对象的某个方法的时候发现这个方法不存在,于是会触发 method_missing ,进而做一些事情,比如转发这个方法,甚至根据需要定义那个方法让下次调用的时候不会产生 method_missing ,另外这也是制作 DSL 的一个重要工具。

下面是一个简单的 DSL 的例子:

Read the rest of this page »

内存泄漏分析工具的尴尬

Thursday, February 28th, 2008

Ruby 内置了 ObjectSpace 可以用来分析当前生存的对象,但是这样的方法有时候并不好用,而且使用 ObjectSpace 会影响到它自己。Evan Weaver 做的 BleakHouse 工具则用 C 直接分析 Heap (以前的版本也是使用 ObjectSpace),可以得到更精确的结果,可以用于内存泄漏的检测。

不过它的文档比较简略, Rails 好像可以直接用,而非 Rails 程序则只要“构建一个 BleakHouse::Logger 对象,并在合适的时候调用其 snapshot 方法”。我不是很清楚什么是“合适的时候”,我尝试在每一轮调用主要执行代码的时候调用一次 snapshot ,结果 dump 出来一个 300+MB 的数据文件。

Read the rest of this page »

[ANN] RMMSeg 0.1.2 Released

Monday, February 25th, 2008

RMMSeg 发布了 0.1.2 版,主要是对性能进行了一些改进,以下是引用 RubyForge 上的通告:

Read the rest of this page »

Ruby Hacking Guide 中文版

Monday, February 25th, 2008

rubyRuby Hacking Guide (简称 RHG)是青木峰郎创作的一本剖析ruby实现的书。对于 Rubyer 来说是非常不错的资料,可惜是用日文写成的。在 RubyForge 上有一个项目致力于将它翻译为英文,在 Google Code 上也有 dreamhead 他们发起的一个中文翻译项目

目前中文版的翻译进度比英文版要快,但是仍然需要大家的参与和支持,这里引用他们的一段话:

如你所见,RHG 中文版目前还没有全部完成。所以,欢迎有兴趣的朋友加入到 RHG 中文版的制作过程中来。

如果你懂日语,你可以加入翻译团队,协助完成剩余部分的翻译,或是校验已完成部分的正确性。

如果你擅长做图,你可以帮助我们制作后续章节的图片,也可以调整已经完成的图片使其看上去更加完美。

如果你了解 Ruby 的实现,你可以从技术的角度,对已经完成的部分校验,让译稿在技术上更加准确。

如果你对 Ruby 的实现感兴趣,欢迎阅读已经完成的部分。阅读过程中发现的任何问题,都可以报告给我们,以便我们今后的发布中进行修改,让译稿更加完美。

Read the rest of this page »

Memory leak profiling with Ruby: ObjectSpace

Sunday, February 24th, 2008

ruby内存泄漏?!不是有 Garbage Collector 吗?为什么在带 GC 的语言里还会有内存泄漏?GC 难道不是来帮助我们摆脱万恶的内存分配问题的吗?确实如此,但是 GC 也不是万能的。垃圾收集器并不知道你需要用到哪些对象,所以它假定能被你(通过某个变量直接或间接)引用到的对象是你会用到的,而其他的则是垃圾——这是相当保守的做法,但是至少是正确的。但是这样带来的一个问题就是:如果你(有意或者无意地)持有了一些(你以后根本不会用到的)对象的引用(例如,通过一个全局变量),就造成了内存泄漏。

看起来在带 GC 的语言里的内存泄漏比普通的 C 语言类的程序里的内存泄漏问题更难处理。在 Ruby 里也有同样的问题, _why 也有一篇文章讲了 Ruby 的内存泄漏问题。

RMMSeg 目前的版本(0.1.1)里也有严重的内存泄漏问题。事实上,robbin 在试用了 RMMSeg 之后对性能非常失望,还提出了内存泄漏的问题。确实是我在做了 RMMSeg 之后并没有用大量的数据进行过测试,一句话就是:玩具和产品还是有相当大的差别的。

不过我也希望对 RMMSeg 进行改进让他可以真正用在实际项目中。首先要解决的就是内存泄漏的问题。事实上,我对于 GC 语言里面的内存泄漏也是一片茫然,我知道引用用不到的对象会造成内存泄漏,可是有什么办法能找出在哪里泄漏了呢?如果找不到,就没办法改进了。好在 Ruby 也是一个非常灵活的语言,直接深入 ObjectSpace 做一些统计和分析也是很简单的事情。

Read the rest of this page »

We read Knuth so you don’t have to

Wednesday, February 20th, 2008

来自 Python Cookbook (第 5 章:Searching and Sorting)的 Quote :

We read Knuth so you don’t have to.

所以在 Python 中,如果要排序,尽量使用内置的 sort 方法;如果要做搜索,尽量使用内置的 dictionary 工具,因为它们集中了 Knuth 先生的经典砖头里面的近 800 页的关于排序和搜索的详细讨论。当然,在 Ruby 中肯定也是差不多的。 ;)

Coroutines and Semi-Coroutines

Tuesday, February 19th, 2008

Ruby 1.9 中引入了 Fiber 用于支持 Coroutine 。事实上 Fiber 并不是一个 Coroutine ,而是 Semi-Coroutine ,或者叫做 Asymmetric Coroutine 。因为它只能将执行权返回给调用者,而完整的 Coroutine 可以自由转移运行权。 Ruby 1.9 也提供了 Fiber::Core 用于支持“正宗”的 Coroutine 。关于 Semi-Coroutine 和 Coroutine 的等价性似乎有些争论。下面是一个 Fiber 的例子:

fib = Fiber.new do
  x, y = 0, 1
  loop do
    Fiber.yield y
    x,y = y,x+y
  end
end
20.times { puts fib.resume }

Read the rest of this page »