Category: Bug Archive

13 posts

‘\n’ at the end of each line

其实我记忆中已经不止一两次碰到这个问题了,在今天又被它折腾了几个小时之后,我决定一定要把它记录在 Bug Archive 中。这就是从文件中一行一行地读取文本并进行处理的时候,末尾的那个换行的问题。 在 C 语言里一般不会遇到这样的问题,因为 C 语言有 gets 和 fgets 两个函数,其中前者会去掉 '\n' ,而后者则会保留 '\n' ,而一般人都记不住这两者分别的行为,所以使用的时候都会小心翼翼。 而在 Python/Ruby/Perl 这样的语言中,从文件中按行读取简直太容易了,写一个处理文本行的程序就那么简单,可是却容易忘记了末尾的换行符。原本我想得到的是一个 "foobar" [...]

Another pitfall in Python: == and !=

Besides the False == 0 problem, I encountered another problem that surprised me. Consider the following Python code: class Foo(object): def __eq__(self, other): if isinstance(other, Foo): return True return False f1 = Foo() f2 = Foo() f1 == f2 # => True or False ? f1 != f2 # => True or False ? What [...]

False == 0 in Python!?

I came across a very strange error when tweaking the skime compiler. I decided to use the more specific push_0 and push_1 instruction instead of the general push_literal when the literal is 0 and 1 respectively. However, after added this code, several test cases was broken immediately. After [...]

Play with GC: mark your treasure

Garbage collecting is amazingly useful. It is a must-have of any modern language. You never need to concern about when to free the allocated memory again. Just allocate, those objects not used will be collected automatically at a some time. Yes, it's true. But, wait, it's not true! I still remember [...]

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

Ruby: Caution with sub/gsub

如果你不喜欢听我讲故事,那么请直接跳到末尾。其实故事很简单,最近几天的故事都是和 RMMSeg 有关。这次我是在做 RMMSeg 的主页,昨天晚上(或者说今天凌晨)我做完了和 Ferret 的集成,并发布了 0.0.1 版。可以看到,主页我也做好了。 其实主页早就做得差不多了,只是还缺一个和 Ferret 配合使用的例子。现在那里已经有一个例子了,用 Ferret 的 Highlight 输出为 HTML 格式: highlights = $index.highlight("content:#{key}", id, :field => :content, :pre_tag => "", [...]

修改参数造成的问题

这次也是做 Numerical Analysis 的作业出现的问题了。按照惯例,是学生提供一个函数,让 OJ 的 main 函数来调用,得到结果。这次是迭代取得矩阵最大特征值的题目,那个被调用的函数中传递进来一个二维数组 a 用来表示矩阵。

KDB2 开发小结

最近消失了好久,主要是考试吧,大三课程不多,但是都是学得累得很的那种。还有就是课程 Project ,最近这个就是很著名的 MiniSQL 了,经常都听学长们说,做一个 MiniSQL 下来确实会收获很多的。本来也是要认真做的,但是时间估计失误,在 6 号的时候才得知是 11 号截止,所以最后有些仓促了,不过最后还是做完了,已知的 Bug 都修正并且通过了压力测试,心里面也是很高兴的。这里写下一点总结吧,一是给大家分享一下,也是留给自己将来看的,我的 Blog 专门有一个分类就是 Bug Archive ,我主要就是想把自己平时实际开发中犯的错误和遇到的 Bug [...]

疯狂提交找错法

做 ACM 的那些人应该也都知道传说中的“疯狂提交找错法”吧。就是如果你题目没有过的话,提交的罚时是不会在最后的分数里面扣掉的。当然是希望在尽量少的次数内过掉,但是情急之下,疯狂提交也是一个办法,不管怎么算它都是有好处的: 如果最后题目 AC (Accept) 了,虽然罚时会让排名下降,但是不管罚时多少,多做出一道题的总比少做出一道题目的排名要靠前。 如果题目没有 AC ,也并没有什么损失。 但是疯狂提交也必须要能“找错”,否则就没有什么意义了。今天我也非常疯狂地爽了一把,并且最后成功找到问题,把题目 AC 了。

Do write portable code

最近遇到两个 bug ,都是因为代码写得不具有可移植性而造成的。Javascript 本身就由于浏览器的差异有许多需要注意的地方,写代码的时候一定要万分小心,多多测试。 数组常量值末尾多余的逗号 Javascript 里面用类似 [1,2,3] 的方法来初始化数组是众所周知的。但是有一个地方却比较容易犯错误。特别是对于熟悉 C 语言的人来说,C 语言里面明确说明,以下这种情况里面,多余的逗号是可以接受的: int array[] = {1,2,}; 然而作为一个弱类型的语言,语法相对会比较随意的 javascript [...]

Typical Chinese Programmer

FatMouse 在 Java 课上介绍了 Typical Chinese Programmer 的概念。我不知道这个名词从何而来,在 Google 上似乎也没有找到有用的信息。不过 FatMouse 说 Typical Chinese Programmer 是这样的一类人,他们想当然地写程序: 比如,他们做出来的界面上有一堆按钮,他们假定用户会先点击“按钮一”,再点击“按钮二”然后是“按钮三”。如果用户不按照这个顺序点击,那么程序就会莫名其妙地 Crash [...]

引用已经析构了的局部变量

在平常的编程里面,这样的代码算是再普通不过了: void func() { SomeType local_obj; another_func(local_obj); // ... } 然而最近我却遇到了问题。在使用 boost::asio 的时候,使用了这种常规的做法。结果遭遇段错误。后来才意识到是在进行异步调用。 another_func 拿着 local_obj (事实上,真正的代码是一个 local 的容器,我把它的 iterator 传递到了一个异步调用里面)却在 func 返回的时候就已经被析构了。不过,在异步调用里面也可以很容易地自动管理对象的生存期,很常用的方法就是使用 [...]