在 Ubuntu 中禁止自动隐藏程序菜单
找了很多地方,最终的解决方案: 继续阅读
找了很多地方,最终的解决方案: 继续阅读
《一生紧随毛:回忆我的父亲…陈士榘》里记载,“李德刚刚来到部队,提出…希望有个中国女战士陪他睡觉。”
康…说:“当时女同志都不愿意嫁给一个不会说中国话的外国人,所以一直找不到合适的对象。”后来找到个“大个子,长得不错的前童养媳。”萧月华1910年8月出生于广东大埔县一个农民家庭。
继续阅读
在学校里,我学到的第一门编程语言,是 Mathematica,严格讲 Mathematica 也许不算是一门编程语言,但它的确很有趣。那个时候(1998年),Mathematica 还只是 1.2 (或者1.4,具体记不清了)了。学校机房的电脑也很慢,但是从那开始,我开始可以将自己的一些想象变成视觉,莫比乌斯带的方程式就是这样想象出来的: 继续阅读
Windows 7,打开“下载”文件夹,里面也就几十个文件……
它非常“友好”地在地址栏部分显示一个进度条,等到进度条100%,右边文件夹内容部分变成非空白——文件显示出来,我可以去拉泡屎,再回来也不迟,我没有拉肚子,我便秘! 继续阅读
错误,我们暂且仅对软件开发而言。
错误的类别,暂且仅考虑接口错误和实现错误。
比如在一段公路入口有巨大的标识牌,上面写着:前方道路,靠左行,红灯行,绿灯停。这个大家可能觉得很荒谬,然而类似的事情在软件开发里面却层出不穷,生产方认为自己已经在文档中清楚地说明了用法和用途,然而他却没有意识到这与使用方的常识和惯例背道而驰。举个简单的例子,C 标准库里面的两个函数:
1 2 3 4 |
#include <stdio.h> size_t fwrite(const void * ptr, size_t size, size_t count, FILE * stream); #include <stdlib.h> void qsort(void * base, size_t num, size_t size, int (* comparator)(const void *, const void *) ); |
我不知道有多少人用过这两个函数,但是,大体上,应该是用 fwrite 的人多,而用 qsort 的人少。而用 fwrite 的人,大多数情况下,传递的 size 都等于 1,并且,一般情况下,size 和 count 搞反了也不会有啥大问题,除非判断了返回值。然而,一旦用多了 fwrite,并且吧 ObjectSize, ObjectCount 这个顺序当成了一个常识,再使用 qsort 的时候,就悲剧了!
还有一个例子:stl 的 range,一般表示为前闭后开的 [begin, end) 区间,如果你要搞一个前开后闭的 (begin, end] 区间,大家都会疯掉不可。我确实曾经被这样的 (begin, end] 疯掉过。
一般情况下,发生在版本兼容问题上。我仅举一个简单例子:在Bash3.x中,[[]] 中的正则表达式会按Bash的quoting removal 规则进行处理,也就是说对于一般的正则表达式,加单引号,双引号,和不加引号,都没有区别,然而到了Bash4.x,如果加了引号,就悲剧了!Bash4.x会把引号当成正则表达式的一部分!
最近我在挤地铁时发现了另一类错误,看上去似乎不属于这两种:人很挤的时候,在地铁楼梯上,经常发现,人们走的是左边,而不是右边,稍微用心一下,就会发现这是什么原因——人们总是按贪心算法走最短路径,刚下地铁的人,会走挨地铁(车厢)的楼梯一侧,而这一侧正好是左边,上面往下走的人,却是走右边。在人流量不大的时候,这不是什么问题,然而,当人流汹涌时,造成的拥堵让大家都很郁闷。
怎么解决这个问题呢?——那就是在设计地铁站时,让贪心算法的最短路径是右边,而不是左边。再General一点,就是:设计要遵守人们的思维习惯。
在程序设计上,如果我们设计的接口符合人的思维习惯,可以大大减少错误的发生。在 C 里面,至少有两处设计违反人的直觉,不过还好,这两处早被 deprecate 了:
一般情况下,就是指我们程序的逻辑错误