2009年

首先,今天是个很特别的日子,因为很多情侣特意选择今天结婚(09年09月09日,有长长久久之意)。

废话说完。《高质量程序设计艺术》终于完成第5章了。第4章时间性能和第5章空间性能,其实可以合起来,就是程序优化的问题。首先,程序的时间性能跟空间性能,可以说是矛盾的,因为很多时候都是空间换时间,或者时间换空间。其次,程序优化,就有可能导致可移植性降低。所以,很多专家都认为,程序优化的首要准则是:不要优化(出自Michael A. Jackson)。当然,前提是该程序已经一个良好的程序(不懂怎么表达,反正就是好程序最好不要优化)。

优化的另一个指导思想是帕雷托法则(Pareto Principle)。本来是用在经济学问上的,而用在程序执行上表明,20%的代码通常占用了80%的执行时间。那么,只要找出这20%的代码,就可以对程序进行优化了。

优化的方法嘛,不外乎那几种:空间换时间、减少I/O操作、降低算法复杂度等等。

对于空间性能方面,由于涉及到硬件方面,所以主要是C/C++方面的问题。对于Java程序员来说,底层硬件都是不可见的,所以研究的意义不大。有个问题值得注意的,代码的长度,准确来说是编译后的文件(目标文件)大小,有时候跟执行效率有关。目标文件越小,占用内存空间就越小。

还有一个收获,认识了“内存对齐”。例如:在32位计算机中,一个char变量(占1个字节,即1 byte,也就是8位,8 bit)和一个long变量(占4个字节,即4 byte,也就是32位,32 bit)储存在一起。如果不进行内存对齐,要读取该long变量时,就要读取两个32位字的内容,再进行复杂的操作。但如果对齐后,读取该long变量就只要读取一个32位字的内容,没有复杂的操作,但这样就意味char变量后面紧跟着3个字节来实现对齐,就是有3个字节的内存空间浪费了。这是明显的空间换时间。同时这就知道了为什么内存容量总是32的倍数(因为32位的计算机每次处理32位数据或指令)。我估计下一代的计算机是64位(32的两倍),而不是40位、48位之类,是为了向下兼容。

PS. 可能近来睡眠不足,导致看书时精力不足(总是打瞌睡)。

睡觉前总结一下今天看书的收获。

《高质量程序设计艺术(Code Quality: The Open Source Perspective)》已经看到第3章了。本章的内容仍然很精彩!

正如书中所说,软件安全性是一个复杂又独特的难题。

1、缓冲区溢出,一个恒久的入侵课题。以前看很多黑客文章(应该是黑客故事),一开场就说溢出,但就是不知道接着做什么。书中介绍的例子是首先使得程序溢出,使得程序的指针指向要执行的恶意代码所在的内存地址,然后恶意代码便可以执行了。虽然不太懂具体的做法,但是只要想到指针能被替换,就已经很唬人了。

PS. 就算是Java/.NET,声称对缓冲区溢出漏洞是免疫的(因为它们提供了数组边界检查机制),但使用对象数组实现的环形缓冲区也有可能出现缓冲区溢出。

2、文件替换。有些软件是在root权限下运行的,并且带有更改文件权限或删除文件操作。如果把这些软件运行时所操作的文件指向一些重要的系统文件,那后果是非常严重的。

3、不可信输入。这个最简单最有名的例子是SQL注入。很多时候,特别是登陆系统时,输入的用户名都没有过滤特殊字符,或者只是在页面上用JavaScript来过滤,到了服务器就直接组装成SQL语句来查询。这时候,如果用户名后加个“;”(分号),再加个恶意的SQL语句,本来一个语句就会当作两个语句来执行(一般的数据库系统都可以识别分号为一个SQL语句的结束符),后果就不说了。

4、木马。又是恒久的主题。书中提及的不是怎么上传木马程序并运行,而是说某些开源软件的代码如果在服务器上被修改过,那用户下载来编译运行后会带来灾难。即使绝大部分的开源代码都会提供验证码(如MD5、PGP签名等)来检验是否被修改过,但绝大部分的用户都不会去检验一下。

看完本章后,突然想起以前想买的那本《入侵的艺术》,于是去“卓越”看看(http://www.amazon.cn/mn/detailApp/ref=sr_1_1?_encoding=UTF8&s=books&qid=1252254843&asin=B0011CU4RU&sr=8-1)。看过试读后,感觉这本说在写小说似的,剧情很跟《越狱(第四季)》有点像。其实最难防的是,那人直接到你机房去。

对了,还有两个细微的地方要记一下:

1)Windows 的某文件夹下,有两个可执行文件aa.com和aa.exe。如果在命令状态执行aa,那默认会先找到aa.com并执行,而找不到aa.com才会找aa.exe来执行。

2)Windows有个环境变量叫“ComSpec”,用来设置命令行解释器。

TVB电视剧《绝代商骄》终于在昨晚结束了。黄子华的独有幽默式表演风格确实带来挺多趣味的,佘诗曼的演技也配合得不错,整个电视剧还是不错的。可惜结局那场大战让人觉得是草草收场一样,一大败笔啊!整个电视剧,留下来的还是那些商业理论值得回味:

1)合理化烟幕。就像卖爆米花,大的跟小的相差两块钱,但是大的比小的多一倍,让顾客感觉买大的更便宜。其实杂费、租金是一样的,大的比小的只是多一下爆米花而已,就是说成本上基本没分别,但是卖大的利润多两块,而顾客感觉大的更加实惠。这样就达到一个双赢的结果。

2)财经人的股票指南。他们说大手买入,就是买一点;说买一点,就是不要买;说不要买,就是要沽;当他说沽的时候,就是沽也无谓。其实财经人也是人,他们做了这么多研究,肯定是自己吃完了才轮到你们吃。

3)CEO的重要性。一个成功的公司,最重要是要有一位CEO,面对问题时就需要这个人来做抉择。当然,这涉及到企业管理方面的东西。(记得当年看《管理学(第7版)》感觉很有收获,但现在都没什么留下来了。)顺带一提:CFO,首席财政官或财务总监;COO,首席运营官或运营总监。(偶最感兴趣的是CTO,即首席技术官、技术长,或CIO,即首席信息官)

4)葡萄藤行销法。美国一家连锁炸圈饼店,一个炸圈只卖美金1元,但是3年内发展到全美国都有分店,总共赚了三千万美金。这间店铺是靠经销权、葡萄藤行销法,总的来说是靠口碑,口碑比广告更有效而成功的。

5)无商不奸。

6)便宜劳工。第一,工资报酬可以用非现金代替,避开法律规管;第二,合理利用廉价劳动力,例如流浪汉。近来看到一个网站再搞类似的东西,把资料电子化后(就是打字)用“飞信”发回就可以领工资。这样有效利用社会闲置的劳动力。

7)鲶鱼效应。以前的挪威人捉沙丁鱼,很多时候捉了它们运到岸上已经全部死光了。但是新鲜的沙丁鱼一定比死的畅销。后来他们想到一个好方法,就是把一条鲶鱼放在沙丁鱼当中,让鲶鱼去捕捉沙丁鱼,同时沙丁鱼就会提高警戒,所以沙丁鱼就会一直游泳,不会死掉。这在管理学上叫“鲶鱼效应”。(当年看《管理学(第7版)》好象没看到这个,不知道是不是忘掉了)就是说找个竞争者来提供员工的危机意识,让员工好好工作。

8)老人院与幼儿院的案例。把相邻的老人院和幼儿院合并,让老人家觉得有很多孙仔孙女那样,同时让幼儿园的小朋友学到尊老等东西,达到一个双赢互利的局面。

9)办公室生存之道的四大法宝。
    一、敷衍做法。例如:头七尾七,就是说一份报告书的前七页与后七页是实在的,中间那部分全是乱塞资料充数。又如:回答问题时,答对重点就可以了。
    二、假创作。就是说并非不创作,而是懒得创作。(就是说废话)
    三、虚应。不是不回应,而是一点点的回应。(差不多是重复人家刚才的话)
    四、陪笑。老板笑,就跟着笑。
    PS. 所谓的“扮公室”是说,假扮(假装)一下就可以拿到薪水。

10)轮流减价。两个卖花的店铺,左边低价,右边高价,顾客自然光顾左边的;然后轮到左边高价,右边低价,顾客就光顾右边的。如此轮流,知道两个店铺都卖完。这样又达到一个双赢的局面。

11)红海战略与蓝海战略。红海代表着当前已存在的所有行业或业务,这是一个已知的市场空间。蓝海代表着当前尚不存在的行业或业务,属未知的市场空间。红海战略就是在已知的市场空间里拼杀,争利润,但蓝海战略就是开拓新的市场,独享利润。

12)Accumulator。即累计股票期权,是一种结构性的衍生工具。你和银行签定合约,在一个期限里,定一个价钱买某个股票,到期如果市价高于定价,你就可以赚到差价。如果股票泡沫兴旺的话,你就有点眼光,Accumulator的确可以赚到快钱。但是如果你买的股票遇到跌市的话,你就要用差价的双倍价钱来接货,股市升不上去,你就要一直接下去,就像无底深潭一样。Accumulator就变成I kill you later。

13)二八定律。就是说八成的利润来自两成的产品。

14)长尾理论。长尾理论的基本原理是:只要存储和流通的渠道足够大,需求不旺或销量不佳的产品所共同占据的市场份额可以和那些少数热销产品所占据的市场份额相匹敌甚至更大。即众多小市场汇聚成可与主流大市场相匹敌的市场能量。
(出处:http://news.xinhuanet.com/newmedia/2006-06/21/content_4727372.htm
    http://wiki.mbalib.com/wiki/%E9%95%BF%E5%B0%BE%E7%90%86%E8%AE%BA

早上醒来,不愿起床,打开手机,把昨晚没看完的《爱情呼叫转移II》看完。

相对于第一部来说,这一部绝对是个垃圾作品。即使邀请了林嘉欣来做主角也挽救不了整部电影。主要是各个小故事的衔接太失败了,那结尾更是“雷”人(居然剪辑了北京奥运会的烟花来用)。算了,烂就一个字。

类似风格的电影还有《命运呼叫转移》、《爱情呼叫转移》、《桃花运》等(估计是同一个公司的作品)。个人感觉这几部当中还是《桃花运》拍得最好,几个女人的爱情故事穿插着的生活,还是值得一看的。

PS. 算起来已经3天没看书了,看来今天要努力了。

时间很快来到9月。回顾8月,唉,太浪费时间了。整个8月都不知道忙了啥,就连工作也是超无聊(每星期都有好几天没具体工作任务)。于是,希望9月来个突破!

今晚赶紧吃完饭后,独自到中大自习。本来想看《系统架构设计师教程》(想到11月去考一下),但精神不佳,于是拿出《高质量程序设计艺术(Code Quality: The Open Source Perspective)》来看。

首先第1章翻了几翻便过去了。到了第2章看到几个挺好的话题:

1)一个8位的硬件计数器是否能用来对一个256字节缓冲区的成员进行计数?
    该问题有点不明白,“硬件计数器”是什么?“一个256字节缓冲区的成员”又是什么?我觉得该提问者想说,8位的处理能力最大是255字节。纯猜测,跳过……

2)多路处理的问题
    处理多个分支的代码(如switch语句)时,作者提出以下几个处理方法:
(1)在每个分支或步骤添加注释,即具体说明;
(2)代码与复合数据成员(结构体与类)之间的关系;
(3)switch中,case的值要覆盖所有可能的情况,或者用defualt来处理可能遗漏的情况;
(4)或者根本不用多路处理,把数据与代码直接联系在一起,可以通过为原本是一个case成员的处理创建一个子类,或者是将各个实现特定接口的函数与每个数据成员相关联来实现。

3)软件发布版中的隐藏功能
    由于软件发布版中的隐藏功能,如调试功能,会带来潜在的危险与额外的资源消耗,所以应该避免。著名的反面教材是“莫里斯蠕虫”病毒,利用Unix的邮件传送代理sendmail中的调试代码,来执行命令,达到自我复制、传播的目的。

4)溢出的问题
    一个简单的表达式子:
int a = b * 100 / 255;
    当b接近int的最大值时就可能溢出,但改为这样就可以避免问题发生:
int a = b  / 255 * 100;

昨晚重温了我最喜欢的爱情电影——《两小无猜》!那感觉仍然是很正~!

一个荒唐、夸张、愚蠢的爱情故事,源自一个“敢不敢“的游戏,一只旋转木马的铁罐,一场人生赌博……最后只有两个字,浪漫!拍摄手法,故事叙述,场景衔接等都充满特色。众多的爱情电影,其浪漫手法不外乎具体的故事、音乐、场景、特效,一切浮于表面,而缺乏幻想与虚无,即内在的感情,因而也比不上此影片。加上那首主题曲《玫瑰色的生活》以不同的风格、不同的演绎方式一直回荡着,让人回味无穷。

记得上次看,也是第一次看,已经是3年前的事情了。那观后感仍然是那么强烈。

PS. 昨晚严重失眠,正确来说是无眠!中途起来把原来的Blog搬到这边(foxail.openwebster.com),也洗了两次澡,看了两个电影……到了6点多,想看日出,却由于多云而什么都看不到。到了7点多,到处给别人打电话嘈着要起床。然后将近8点,上班去。在公司整天迷迷糊糊的,总算把一天熬过去了。经过这次,我发现,原来人是可以不睡觉的。不过估计到了第三天就会挂了。

昨晚可能是太热了,居然睡不着,于是又打开手机看电影。幸好下了个新电影——《天堂之门》。

故事讲述一个无所事是的中年男子青山将人(长濑智也),因患末期脑癌而在医院遇到患心脏病和癌症的14岁少女晴美(福田麻由子)。将人得知这女孩因长期住院,连大海都没见过,于是决定帮她实现死前的愿望。两个面临死亡的人,带着什么也无所谓的信念,直奔大海。医院里的龙舌兰酒、偷高级跑车、持枪抢劫、挥霍来历不明的巨款、逃避警察的通缉、与黑帮的较量……终于实现了晴美的7个愿望后,将人来到海边,坐在沙滩上,靠在晴美的身边,离开了这个世界。

很多时候都会想,假如明天将要死去,那还有什么要做?其实每天的生活,我们都在不断地寻找活着的意义。片中那句“与其跪着活,不如跑着死”,告诉我们人生就算到了最后一刻,也要继续追寻着梦想!

说说演员吧。

长濑智也,对他的印象只停留在《巨星夫婿》的那个傻瓜形象当中。本片的颓废形象带给我很大的冲击,原来他也可以这么有实力的。

福田麻由子,从《下妻物语》到《我和狗狗的十个约定》,都一直在演女主角的童年形象。本片终于当了女一号,但其角色定位还是停留在那种天真无邪的小孩子角色,没太大的突破。其笑容也算甜美,但不是我喜欢的类型。

据说这次日食是500一次,我国的长江流域地区可以看到日全食,我这边的南部沿海就只能看到日偏食了。在这边最佳观看时间——9:24,看到的太阳就跟一轮弯月(新月)一样,没办法,日偏食就这样子了。

虽然各大媒体早已争相报道了,但公司里还是没一个准备好眼镜的。于是在9:24前,众人慌忙寻找替代品。也因为没有准备好专用设备,同事们想出各种观看方式:

1、x光的底片。我们部门的一同事刚好今天拿到体检的x光底片,被逼献出来。众人就争先举起那排骨照来看太阳。

2、鼠标垫。那茶色的玻璃鼠标垫成了个小屏幕。就在那100来平方厘米的小板下,挤了一堆人。

3、小孔成像。这方法是上网看到的,其实以前看电视新闻,上地理课、物理课等都学过。这方法既方便(找张纸弄个小孔就可以了)又省力(不用抬头看),但效果是最差的。我拍了张小孔成像的照片发给朋友看,被戏称是“UFO照片”,晕~~

4、网上直播。最舒服的方法了,但这星期开始,公司内加强禁网的力度,所以能上网的都是有点地位的人。这样,一个电脑屏幕前又挤了一堆人。

5、最慌张的同事,拿纸巾、白纸、装了墨水的杯子等来看,结果是看不到。

6、肉眼直接看。由于今天有点薄云,当云档住太阳时,便能过滤强光,效果还是可以,起码看得到。但云飘过后,眼睛就受罪了。

最后不得不说的是,由于我的座位在窗口旁,是一个非常好的观看点,于是引来无数同事。一同事说:“你今天就不用工作了!”使我无奈得满头是汗……

PS. 记得上一次经历日食是小学的事情了。那时被逼坐在教室里,错过了。

早上醒来,睡不着,于是那着手机看《博物馆之夜2(Night at the Museum 2: Battle of the Smithsonian)》。

剧情很简单。原来的博物馆面临改造,原有的展览品将被运到史密森尼博物院的地下仓库封存,包括那可以使所有展品在晚上活过来的牌匾。于是主角展开奇妙的拯救之夜。

 这次故事场景搬到世界最大的博物馆——史密森尼博物院(Smithsonian Institution),带来更多的历史人物(可惜都是西方的历史人物)!时间跨度从第一部的几个夜晚浓缩到一个夜晚,剧情更加紧凑。但是第一部带来的新鲜感已不复存在了,导演再恶搞,也只能在历史人物上下手。风格也变得很像FOX公司的那些恶搞片(《Super Hero》、《这不是斯巴达(Meet the Spartan)》、《史诗大电影》、《约会电影》等等)。结局嘛,还是那样——主角又泡了个妞。

这样的电影,无聊的时候还是值得看看的。