[ANN] RMMSeg 0.1.4 Released

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

Fixnum Overflow in Ruby’s Hash Implementation

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 [...]

A Better method_missing

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

内存泄漏分析工具的尴尬

Ruby 内置了 ObjectSpace 可以用来分析当前生存的对象,但是这样的方法有时候并不好用,而且使用 ObjectSpace 会影响到它自己。Evan Weaver 做的 BleakHouse 工具则用 C 直接分析 Heap (以前的版本也是使用 ObjectSpace),可以得到更精确的结果,可以用于内存泄漏的检测。 不过它的文档比较简略, Rails 好像可以直接用,而非 Rails 程序则只要“构建一个 BleakHouse::Logger 对象,并在合适的时候调用其 snapshot 方法”。我不是很清楚什么是“合适的时候”,我尝试在每一轮调用主要执行代码的时候调用一次 [...]

Ruby Hacking Guide 中文版

Ruby Hacking Guide (简称 RHG)是青木峰郎创作的一本剖析ruby实现的书。对于 Rubyer 来说是非常不错的资料,可惜是用日文写成的。在 RubyForge 上有一个项目致力于将它翻译为英文,在 Google Code 上也有 dreamhead 他们发起的一个中文翻译项目。 目前中文版的翻译进度比英文版要快,但是仍然需要大家的参与和支持,这里引用他们的一段话: 如你所见,RHG 中文版目前还没有全部完成。所以,欢迎有兴趣的朋友加入到 RHG 中文版的制作过程中来。 如果你懂日语,你可以加入翻译团队,协助完成剩余部分的翻译,或是校验已完成部分的正确性。 [...]

Memory leak profiling with Ruby: ObjectSpace

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

We read Knuth so you don’t have to

来自 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

一直对 Concurrency 的理解不是很清楚,很多相关的概念也就搞不清楚了。依稀地记得在哪里看到“并发(Concurrency)”和“并行(Parallelism)”并不是同一个概念,今天搜索了一下,发现果然是这样的。 如果对多个进程来讲,并行就是指他们真正意义上地同时执行,这只有在多核的机器上或者是在分布式的环境下才能实现。而并发则更宽泛一些,并发的进程可能是并行的,也可能不是。简单地说,如果有两个进程 P1 和 P2 是并发的,那么会有如下的一些可能的情况: P1 先于 P2 执行。 P2 先于 P1 执行。 P1 和 P2 同时执行(Parallelism)。 P1 和 P2 [...]

混乱过的 C 语言 Hello World 程序

相信不少人都听说过国际 C 语言混乱大赛吧?里面有不少看起来千奇百怪的代码,但却都是完整的 C 程序并且不少是非常有用并且高效的程序。今天我在这里又看到几个混乱过的 Hello World 程序,例如: #define _________ } #define ________ putchar #define _______ main #define _(a) ________(a); #define ______ _______(){ #define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C) #define ___ [...]

Coroutines and Semi-Coroutines

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 [...]

Screencast: RMMSeg/Ferret Demo

这个 Demo 通过经典的用 Rails 建立 blog 的例子演示了如何使用 act_as_ferret 快速构建一个全文索引,并演示了 RMMSeg 中文分词的效果。 Ferret 是一个 Ruby 的高性能的全文搜索引擎库,可以说是 Ruby 的 Lucene 。 RMMSeg 是 MMSEG 中文分词算法的 Ruby 实现。RMMSeg 的实现包括了整合 Ferret 的 RMMSeg::Ferret::Analyzer ,可以为 Ferret 提供中文分词的功能,实现中文的全文索引。 acts_as_ferret 是一个 Ruby on Rails 的插件,可以让 Rails [...]

Emacs 23 prebuild deb package

Emacs 的 unicode branch 前日 merge 到 trunk 中了,brep 编译了一个 for Windows 的版本供下载。Emfox 做了 amd-64 的预编译 deb 包,我用它那里的源码和元信息编译了 i386 平台的 deb 包,放在这里。Enjoy! :)

A 3rd-order Quine: Haskell -> Python -> Ruby

我曾经在我的 Wiki 笔记 中介绍过 Quine ,就是能打印自身的程序。今天在这里看到一个很厉害的 Quine : q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')'] main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print [...]

Rubinius 的首页改版了

好久没有去看过,居然改头换面了,从前 Rubinius 的首页里面的信息量并不比 lifegoo team 的首页多多少。 :p 不过现在换了个风格,而且 Documentation 一页似乎多了不少东西! :D Rubinius 是一个类似于 SmallTalk-80 架构的 Ruby 虚拟机,大部分代码用 Ruby 本身来写成:例如 byte-code 的编译器,这样字节码甚至可以直接在其他 Ruby 实现(比如 JRuby 或者 MRI)上加载。虽然说现在 Rubinius 还不太成熟,在各种测试中似乎都是在各个 Ruby [...]