Archive for February, 2008

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 中肯定也是差不多的。 ;)

Concurrency vs Parallelism

Wednesday, February 20th, 2008

dining_philosophers.png一直对 Concurrency 的理解不是很清楚,很多相关的概念也就搞不清楚了。依稀地记得在哪里看到“并发(Concurrency)”和“并行(Parallelism)”并不是同一个概念,今天搜索了一下,发现果然是这样的。

如果对多个进程来讲,并行就是指他们真正意义上地同时执行,这只有在多核的机器上或者是在分布式的环境下才能实现。而并发则更宽泛一些,并发的进程可能是并行的,也可能不是。简单地说,如果有两个进程 P1 和 P2 是并发的,那么会有如下的一些可能的情况:

  • P1 先于 P2 执行。
  • P2 先于 P1 执行。
  • P1 和 P2 同时执行(Parallelism)。
  • P1 和 P2 交替地执行。
  • ……

例如,在现代操作系统中的多任务,我们同时打开浏览器、邮件阅读器、文件管理器、编辑器和音乐播放器之类的程序,他们看起来好像是在同时执行,但是如果只是在单核的 PC 机上,某一个时间段内其实只有一个程序在运行,只是操作系统在各个程序之间进行快速地切换,造成了“并行”的错觉。

Read the rest of this page »

混乱过的 C 语言 Hello World 程序

Wednesday, February 20th, 2008

相信不少人都听说过国际 C 语言混乱大赛吧?里面有不少看起来千奇百怪的代码,但却都是完整的 C 程序并且不少是非常有用并且高效的程序。今天我在这里又看到几个混乱过的 Hello World 程序,例如:

#define _________ }
#define ________ putchar
#define _______ main
#define _(a) ________(a);
#define ______ _______(){
#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
#define _____ __ ___ ____ _________
#include<stdio .h>
_____
</stdio>

如果我不说,你能看出来它是一个打印 Hello World 的程序吗?还有这个(据说只能用 C++ 编译器编译)看起来是不是有点 Brainfuck 语言的味道?

Read the rest of this page »

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 »

Screencast: RMMSeg/Ferret Demo

Thursday, February 7th, 2008

这个 Demo 通过经典的用 Rails 建立 blog 的例子演示了如何使用 act_as_ferret 快速构建一个全文索引,并演示了 RMMSeg 中文分词的效果。

  • Ferret 是一个 Ruby 的高性能的全文搜索引擎库,可以说是 Ruby 的 Lucene
  • RMMSegMMSEG 中文分词算法的 Ruby 实现。RMMSeg 的实现包括了整合 Ferret 的 RMMSeg::Ferret::Analyzer ,可以为 Ferret 提供中文分词的功能,实现中文的全文索引。
  • acts_as_ferret 是一个 Ruby on Rails 的插件,可以让 Rails 程序很方便地和 Ferret 集成起来。

rmmseg.jpg

由于最近一直感冒比较严重,而且我也没有麦克风,所以就没有录音,用自己喜欢的一些音乐替代了。做 Screencast 是在 newsmth 的 Ruby 版贴了 RMMSeg 发布的消息以后,lateboy 提的主意,自己也觉得挺好玩,就做了一个。 :) 猛击上面的截图即可下载。

下面是 RMMSeg 相关的链接: