Archive for the ‘Develop’ Category

Google Summer of Code 2008: First Chapter

Wednesday, April 23rd, 2008

Google Summer of Code 2008Finally, I was accepted by Thousand Parsec and will work on Schemepy with Timothy Robert Ansell this summer. I hope this would be an enjoyable summer. :)

It’s been a fairly long time since the announcement of Google Summer of Code 2008. I’ll try to write something about that period. I learned a lot from this and it’s really (some what) by coincidence that I ended up working with Schemepy. :p

Announcement

It was roughly summer of 2007 when Jack told me about Google Summer of Code. But applying period for GSoC2007 has ended that time. Then when I read the announcement of GSoC2008 this year in the Google Reader in late February, I was excited. I checked the website of GSoC and some projects accepted in year 2007, 2006 and 2005.

Read the rest of this page »

“软件工程”课告一段落

Sunday, April 20th, 2008

“软件工程”也是计算机专业的必修课之一。我一向对诸如敏捷开发、极限编程之类的东西比较感兴趣,“拥抱变化”给我的印象非常深刻,所以我意识里也有些抵制传统的软件工程。我觉得,对于小的项目来说,花那么多的时间在繁琐的软件工程流程上简直就是浪费;而对于大的项目来说,不管你花多少时间来做计划都是徒劳,因为需求总是会变化,我们要做的只能是“拥抱变化”而不是永远停滞在设计阶段。

但是我想既然这个课是由 CYJJ 来上,应该至少不会无聊到哪里去吧。二十多章的内容被压缩在了 8 周的短学期中,上课又是一百多号人的班级,唯一能吸引人的就是课件里穿插的各种故事(或者说叫做 IT 八卦)了。到最后一周的时候才幡然醒悟:上课似乎没有听进去过几个字。厚厚的一本书,考前看了一遍,也没有记住什么实质性的东西,DFD、ACD、SCD……一堆一堆的概念。当然为了避免这个课变成那种背概念的文科课,配套有几个 project :

  • Software Requirements Specification
  • System Design
  • Test Specification
  • Subsystem Version 1.0
  • Subsystem Version 2.0
  • Web Design
  • Final Integration of System

Read the rest of this page »

Use git-svn to fork a project and keep tracking of it

Tuesday, April 15th, 2008

gitThe case is that sometimes you want to add some cool feature to an open source project. But you don’t have commit rights to that project. So you checked out a copy of the code and do some local hacking. The problem is that you’ll have to track the updates of the original code and merge the changes to your local copy constantly.

One example is the multi-tty support of GNU Emacs (now officially available in Emacs). While the Emacs code base is rapidly evolving, the author of multi-tty branch should track the changes and merge them to his local copy. Another example is YARV when it is still not part of the official Ruby implementation.

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 »

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 »

[ANN]RMMSeg 0.0.1 Released

Friday, February 1st, 2008

RMMSeg 是 MMSEG 中文分词算法的 Ruby 实现。可以作为独立的程序运行,也可以方便地和 Ferret 进行集成。

今天凌晨在完成了与 Ferret 的集成工作以后,我发布了 0.0.1 版,可以从 RubyForge 进行下载,也可以直接使用 RubyGems 进行安装:

$ sudo gem install rmmseg

下面是引用 RubyForge 上的 Announcement

Read the rest of this page »

RMMSeg: Ruby 实现中文分词

Thursday, January 31st, 2008

我在前面曾经提到过,中文分词比较困难,不像英文那样,直接在空格和标点符号的地方断开就可以了。 Jack评论中提到即使是英文,在进行短语层次的分“词”时也会有类似的困难。还有在进行手写识别时,空格有时候不能很精确地识别出来,也会要用到中文分词中的一些技术。

RMMSeg 我近日做的一个 Ruby 的中文分词实现,下一步是和 Ferret 进行集成。不过,在介绍 RMMSeg 之前让我先来简要介绍一下中文分词。

如何分词?

那么中文分词究竟要如何做呢?想想你自己看到一个句子的时候,如何进行分词?似乎是及其复杂的吧?好像感觉到现在的电脑还达不到这个层次,至少一台普通 PC 机不可能拥有一个人的大脑那么多的后备知识可用。但是若是只要求百分之八九十的准确率的话,要实现一个分词算法也并不困难。

这里又要说 80/20 原则了,要实现一个在 80% 的情况下能工作的算法通常不会太难,但是要保证另外 20% 也能正常工作的话,通常难度相差不止 N 个数量级。何况这个问题并不是 100% 可解的,一些固有歧义的情况及时是人也无法选择一个更好的分词方法来。

Read the rest of this page »

Ruby: 提升性能的几点尝试

Tuesday, January 29th, 2008

近日做一个 Ruby 的程序需要用到一个大约 2 MB 大小的词典,我把它构造在一个 Ruby 的 Hash 里,然而程序启动需要花上大约 4 秒多的时间,主要都是花在加载词典上了。虽然这个程序许多情况下可以在初始化之后处理许多数据,因此可以把启动时间忽略掉,但是在测试的时候还是让人相当不爽。于是就想看看是否可以改进。

首先我测试了只读入一个大约 2 M 的文件的操作,速度非常快,在我这里大约在 0.16 秒左右,然后尝试在读入每行的时候把数据加入到一个 Hash 中去,速度降低到了越 0.43 秒左右:

h = Hash.new
File.open("words.dic", "r") do |f|
  f.each_line { |l|
    h[l] = l
  }
end

虽然速度下降了,但是显然不是我前面的 4 秒多。问题在于:我的辞典并不是简单的每行一个单词。不过需要明确一点,如果要在 Hash 中构建一个辞典,上面是最基本的代码,因此上面这段代码的性能应该是性能极限。

Read the rest of this page »

Handling UTF-8 in Ruby

Monday, January 28th, 2008

Ruby 1.9.0 已经发布了,1.9 的一个重大改进就是对 Unicode 的支持,这里有一篇介绍 Ruby 1.9 中 Unicode 的文章,可惜是日文的,不过配合代码和部分汉字应该能理解大概意思。

在 Ruby 1.9 中,将如下代码保存为 UTF-8 编码,可以轻松运行通过:

# -*- coding: utf-8 -*-
 
require 'test/unit'
 
class TestUnicode < Test::Unit::TestCase
  def setup
    @str = '这是中文'
  end
 
  def test_size
    assert_equal 4, @str.size
  end
 
  def test_at
    assert_equal '这', @str[0]
  end
 
  def test_reverse
    assert_equal '文中是这', @str.reverse
  end
end

注意第一行的注释中的 coding: utf-8 是必须的(当然也可以通过其他各种方式来指定,不过我很喜欢这种方式,因为这样 Emacs 也可以认出这个文件的编码来)。在 Ruby 1.8 中就没有这么方便的事情了,不过由于 Ruby 1.9 刚刚发布,Ruby 1.9.0 又是“不稳定版本”,许多库还只能工作在 1.8 之下,所以还得有相当长一段时间内需要 Ruby 1.8 的相关 workaround 来处理 Unicode 以及国际化等相关的工作。

在 Ruby 1.8 中,可以使用全局变量 $KCODEjcode 来实现一些常用函数。例如,要使用 UTF-8 编码,首先把 $KCODE 设置为 'u' ,设置之前是这样:

Read the rest of this page »