Archive for December, 2007

RubyConf 2007 video 释出!

Wednesday, December 26th, 2007

rubyconf-logo2

RubyConf 2007 演讲的全部视频最近由 Confreaks 公司公布(Creative Commons Attribution-ShareAlike license)出来,可以在这里在线观看或者下载 AVI 格式(H.264)的视频。

这么多牛人的怎么多精彩的演讲,真是令人激动啊!我把他们下载下来了,这样离线的时候也可以看。我还把他们传到了 88 CompLang 版的 FTP 上,校内的朋友们可以直接去那里下载。 :)

我虽然还没有来得及看所有的演讲,但是随便看了几个都是非常有趣的(当然,也是非常精彩的),我这里随便介绍一两个,相信你一定也会喜欢的!

Hurting Code for Fun and Profit

Ryan Davis 带来的精彩演讲,他的 slides 很多都是手绘的,从下图可以看到:

hurt_code

演讲的开始他先讲了一个故事,这是一个关于 Legacy Code 的故事,一个程序员到了一家公司,开始处理一堆 Legacy Code ,找出他们的依赖关系,最后是一团糟,于是程序员生气了,干掉了创造这些 Legacy Code 的人(如上图),然后自己进了监狱。这个结局不好,另一个方法是什么呢?

Read the rest of this page »

Ruby 1.9.0 is released

Wednesday, December 26th, 2007

rubyRuby 1.9 在圣诞节如期发布啦!

Hi,

We are happy to announce of the release of the 1.9.0 the development
release. You can fetch it from:

ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.0-0.tar.bz2
407cc7d0032e19eb12216c0ebc7f17b3

ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.0-0.tar.gz
b20cce98b284f7f75939c09d5c8e846d

ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.0-0.zip
78b2a5f9a81c5f6775002c4fb24d2d75

We hope this helps you to enjoy hacking. Happy Holidays.

matz.

虽然没有通过所有的测试,不过也是 Hard Working ,始终是辛苦了,也算是给大家的一个圣诞大礼了!

Hi,

For your information, here’s the test result from the released Ruby
1.9.0:

sample/test.rb
858 tests 0 failed

bootstraptest/
821 tests 0 failed

test/ruby/test_*.rb
849 tests 1935064 assertions 1 failures 0 errors

test-all
3263 tests 2275950 assertions 8 failures 6 errors

We couldn’t make it error free, but it’s fairly good, we hope.

matz.

Teach yourself “自主知识产权” in 2 hours

Tuesday, December 25th, 2007

咱们中国人似乎一直很热衷并且很擅长于创造“自主知识产权”的东西,一直很纳闷,直到今天翻开这次的操作系统实验指导一看,才知道原来这玩意这么容易!我们不妨来亲自实践一下,内容就是这次的操作系统实验:为 Linux 内核添加一个新的文件系统(听上去是很浩大的工程啊!):

第一步:准备工作【30 min】

所谓“工欲善其事,必先利其器”,这次我们的工作环境是 Linux ,为了方便起见,我使用我熟悉的 Debian GNU/Linux 系统。

  1. 从校内的 FTP 下载 Debian Etch 安装光盘。【10 min】
  2. 安装基本子系统,连接网络源,安装必要工具(如 emacssudo 等),升级并安装内核开发包(如 kernel-packagefakeroot 等)。【15 min】
  3. 下载并解压最新内核源代码。【5 min】

Read the rest of this page »

告别一周没有手机的生活

Monday, December 24th, 2007

上周手机丢了,也一直都没有时间去买个新手机。一个周过来,并没有什么特别不适应的,只是看时间特别不方便了,于是做事情都没有一个时间概念了,特别是上课的时候期待着下课却又不知道还有多少时间才到下课铃响——非常郁闷,哈哈 :D

真是没发现原来我和外界联系这么少,如果我不说的话,这样随便消失一周也恐怕最多只有一两个人知道吧!这样看来,我虽然比以前开朗了许多,但是大致上还是那个样子啦,有时候却不得不感慨时间过得真快啊!这几天无意间在 Blogger 上翻到自己高二时候留在上面的一篇 Blog :

blog.png

没想到我那个时候就会写 Blog 了,而且还是用 gmail 账号注册的,哈哈,不过我倒是记得那个时候像 wikipedia 之类的站点也是可以直接访问的。

Continuation + Y Combinator

Friday, December 21st, 2007

我在介绍 Continuation 的文章中提到了一个 create_iterator 的实现,它接受一个函数名,内部去调用这个函数而实现 iterator 。最初我是想让它接受一个 block 的,但是后来却改成了函数名,正是在做二叉树的遍历时出了问题:二叉树遍历是一个经典的递归程序,而 block 没有名字,无法做递归,只好作罢。

不过在前一篇文章中我又介绍了 Y Combinator (其实我也是在一边学习的)正好可以用来做匿名递归,刚好可以把这两者结合在一起啦!

原来的 create_iterator 是这样的:

Read the rest of this page »

the Y Combinator

Thursday, December 20th, 2007

今天看到 A Use of the Y Combinator in Ruby 这篇文章,却被他的代码搞晕了,半天看不明白,于是只好另辟蹊径,不看他的代码,却自己来写一下,如果我写出来的代码和他一样,那自然就明白了,如果不一样,也好对比一番,相信也更容易理解了。

这里要解决的问题大致就是“匿名递归函数”的问题。递归函数大家都知道了,例如经典的阶乘函数:

1
2
3
4
5
6
7
def fact(n)
  if n == 0
    1
  else
    n*fact(n-1)
  end
end

匿名函数也没啥,在许多语言里,函数就和普通的值没有什么区别,不一定非要有一个名字,例如 lambda 就可以创建一个匿名函数:

func = lambda { puts "hello" }

那“匿名递归函数”又是什么呢?首先它是匿名的,哦,那么用 lambda 好了,其次它是递归的,这也好办,自己调用自己嘛。问题就出在这“自己”上!看那个阶乘函数代码的第五行 n*fact(n-1) ,原来函数有 fact 这个名字,可以直接调用,现在匿名了,如何调用这个“自己”呢? thisself ?可惜都不是!必须要有一个变量来引用到这个“自己”才行,如果没有一个全局(或在某个作用域里)的名字,那么至少要作为一个参数。用 Y combinator 正好可以解决这个问题,于是程序可以这样写了:

1
2
3
4
5
6
7
8
9
fact = y_comb do |me|
  lambda { |x|
    if x == 0
      1
    else
      x*me.call(x-1)
    end
  }
end

这里“自己”(也就是第二行的那个 lambda 产生的匿名函数)被作为参数 me 传递进来。这个 y_comb 究竟是如何做的呢?你可以自己尝试实现一下,如果实在迫不及待或者一时想不出来,就跟我一起来探索神奇的 Y combinator 吧!

Read the rest of this page »

mile stone 1: 手机被偷了

Monday, December 17th, 2007

今天晚上骑车出去,在一个红灯停下来,然后一位小哥过来说他刚才看到有人偷我东西,我才发现上衣口袋里的手机不见了。再找也找不回来了。真是奇怪,我骑车在路上还在想自己上次备份电话本的事情(一直都想备份一下的,因为我也一直都担心手机会丢或者会坏,可是手机不是很智能,不能连到电脑上,只能手工填,导了一小部分之后系统重装了,就中断了),结果手机就丢了。

Read the rest of this page »

反思:关于电脑的可用性

Monday, December 17th, 2007

vlc计算机的历史虽然不长,但是确实是飞速发展,到现在几乎是家家户户都有电脑,接上了宽带,说不定比固定电话的普及率还高,各行各业都可以见到电脑的身影,应用范围越来越广。我们应该为此自豪吗?电脑完美了吗?答案当然是否定的!电脑确实非常实用,能够帮助我们解决许多问题,可是,从某些方面来看,电脑几乎可以说是人类迄今为止最为失败的发明!

比如在可用性方面。 且不说通过 G 代码来编程的数控车床这类专门面向专业人员的设备,就看我们最常见的 PC 机好了。如果你在看这篇文章,我猜你一定用过电脑了,不知道你觉得自己的电脑是好用还是不要用呢?如果你要添加评论,肯定是要用键盘的了,抛开世界上最差的 10 款 PC 键盘不说,最初接触电脑的时候,你是否思考过为什么键盘上的字母排列这么奇怪呢?当被告知(我想这个事情现在应该大多数人都是早就知道的了)这样的设计完全是为了降低你的打字速度的时候,是不是感觉很莫名其妙?可是这么多年它还是那样的布局,虽然原来的问题(按键速度太快会让那个年代的打字机出毛病)早已不存在了——这也是计算机行业里最奇妙的问题:向后兼容。啊哈!计算机在高速发展,可是却又要最大限度地向后兼容!即使是 Bug 也要在新版本伪装出 Bug 的样子来!

Read the rest of this page »

我们该向国外的 CS 课程学习一下了

Sunday, December 16th, 2007

今天在刘未鹏的 Blog 上看到 Joel Spolsky 在耶鲁的演讲([1] , [2] , [3])的导读,便跟着链接过去看了一下。演讲真是非常诙谐有趣,而且看了以后也觉得蛮有收获的,所以也来推荐一下。

演讲中提到了几门 CS 课程,也是相当有趣。比如 MIT 的那门著名的计算机基础课,第一堂课就讲了“Computer Science isn’t about computers and it isn’t a science”。

cs

这门课确实相当有名,其实就是用 SICP (Structure and Interpretation of Computer Programs) 的那个课程,在 MIT 的网站上有教学视频可以下载。我也看过其中一部分,上图就是我从视频中截出来的 Hal Abelson 在第一堂课中解释“Computer Science”究竟是什么的时候的场景(我印象特别深刻,因为他上课是用左手写字的,而且全是大写字母,我还发现 MIT 的粉笔特别粗 :p )。

也许许多人并不关心 CS 究竟是什么,不过,联想起竺可桢老校长的那句话,有两个问题却还是很总要的:“诸位在校,有两个问题应该自己问问,第一,到 CS 来做什么?第二,将来毕业后做什么样的人?”其实 CS 基本上也可以分为两大类了,一类是读 PhD ,做研究(据说 PhD 是 Permanant Head Damage 的缩写?:p );一类是做程序员。然而,即使只有这两个选择,也是让许多人迷茫的了,就我自己到现在仍然是很不知所措的,可是看了 Joel 介绍的 Yale 的两门课程之后,我似乎对这个选择问题也大概有了些底,国外的课程果然是很人性化的:

Read the rest of this page »

Write a Scheme Interpreter in Ruby(2): THE Interpreter

Sunday, December 16th, 2007

leaf.gif上一篇文章中我们实现了对 scheme 代码的 parse 和 analyze 过程,并得到了一些可以直接 eval 的对象(String ,Symbol ,Number 和 Cons ),可是光凭这些并不足以让我们的解释器跑起来。这次我们要添加必要的代码,实现一个真正可运行的解释器。

在前面的代码中,我们已经实现了 scheme 中的几个基本对象的求值:作为 atom 的 String 、Symbol 和 Number 以及作为 list 的 Cons 都已具体实现了 eval 方法。事实上 atom 的求值已经不需要加什么其他代码了,但是 Cons 类却是耍了一个把戏,仔细看 Cons 类的 eval 方法:

    def eval(binding)
      func = @car.eval(binding)
      args = @cdr
      func.call(binding, args)
    end

其实把责任推脱给了 func 对象的 call 方法。那么 func 应该是一个什么对象呢?一个 scheme 解释器要能跑起来,至少需要一些内置的基本过程(primitive-procedures),并且要让用户能够自定义过程(compound-procedure)。要内置哪些基本过程?如何表示?它们的 call 方法如何工作?自定义过程的 call 方法又是如何表示和工作的?这些就是本文需要解决的问题了。

Read the rest of this page »