按照计划,今天去电脑城换个鼠标。那套Rapoo(雷柏)1800无线键鼠套装的鼠标坏了,放什么电池进去都只能用几分钟(去年就是因为贪便宜才买的,真的是一份价钱一分货)。

到了电脑城,那售货员立马就给我换个鼠标了,说拿去维修要等好久的,所以给我换一个。事情出奇的顺利,而且时间尚早,于是在附近逛逛。

新华书城。很久没逛书城了,突然怀念起高中经常看书的日子。跟那时一样,那些青春文学依旧放在门口最显眼的地方。韩寒、郭敬明,还没有停下来的意思,除了旧书再版,新书也不断;安妮宝贝那几本代表作仍然没机会看;几米的漫画还是那么有味道;那些中外名著除了换了包装之外,还是老样子呆在角落……突然间有种冲动,想买几本小说回去看,但一想到还有几本“砖头“等着我去看,就没有购买欲了。顿时深深感受到,有些事情现在不做,以后就没机会去做了。

二手电脑城。每次过来这边,一定要去那二手电脑城看看,总希望能够淘到好货。这次逛了一圈,发现了Thinkpad的外置USB接口DVD刻录光驱只要280!这东西的行货版要1000左右的,而这里只要280!虽然心动,但身上没那么多现金,只好忍痛作罢。后来到淘宝上查查,原来这东西很普遍,而且280这个价格已经有点贵了。再研究了一下,其实这东西也只是笔记本光驱,外面套个盒子。其质量完全取决于内置的笔记本光驱,就是说,如果那光驱是从二手笔记本拿过来,或者是以次充好的,那买来也玩不了多久。不过这样的价格,还能怎样?我那Benq w1800还勉强可以用,还是省点钱吧。

后来回去后,发现那鼠标还是不行。唉,看来今天白走了。

一听到反町隆史的《Poison》就会想起《GTO麻辣教师》。可惜TV版没看完,但是前段时间看了电影版。

电影版讲叙的是鬼冢英吉去了北海道的某中学当代课老师,教育的也是个问题班(由问题学生组成的班级)。这是由小说版改编的,遗憾的是对该小说进行了大量的裁剪,只留下很小一部分的主要剧情。其主要表达的意思还是跟TV版一样:从学生的角度去理解学生的教育,才是教育。

电影版的亮点是有藤原纪香和田中丽奈的参与。不过藤原纪香显得有点胖,而田中丽奈的演技没有什么感觉。

PS. 1、以前曾买了个GTO动画版DVD光盘来看,可是只有第1集可以看,于是错过了动画版。TV版在香港ATV播放时,我正上初中,寄宿于学校,于是错过了TV版。幸好有一次在一个小书店发现小说版,于是只有完整地看了小说版。

2、查了资料才知道,原来反町隆史的老婆是松岛菜菜子(TV版中冬月老师的扮演者),很意外!

3、反町隆史给我印象比较深的还有与刘德华一起合演的《全职杀手》。

台风“巨爵”离去后,今晚又恢复如常的看书计划。《高质量程序设计艺术》来到第6章了,本章主要探讨程序的可移植性问题。

可移植性主要面对的几个难题是:操作系统、处理器体系结构、编译器与语言特性、图形界面环境、区域(如:显示多语言)、硬件设备与平台等方面的差异。提高程序的可移植性,主要就是解决以上几个难题。

解决可移植性的常用方法是使用一个代码层来对功能进行抽象,这实际上将差异性用一部分代码隔离了。例如:JavaScript的话,可以编写通用方法来获取屏幕大小,而该方法是通过判断不同浏览来调用不同的方法来实现。又例如:C/C++可以使用预处理。

 本章用了较大的篇幅探讨了图形界面的问题。值得注意的有以下几点:

1)字符编码应该采用更通用、兼容性更高的UTF-8,而不是特定于某个区域的编码。虽然GB1080已经提高了其兼容性,但面向国际的话,还是很勉强。

2)程序/软件中的消息,应该与代码分离,作为独立的、容易替换的资源来处理,以简化其本地化的工作。

3)可移植GUI(图形用户界面)除了可以考虑建立可移植层(如建立统一的API,分别在Windows和X上封装实现该API,程序便可该API)、采用仿真层(好象就是WINE的做法)、基于可移植层的平台(如Java的Swing、SWT等)以外,还可以考虑使用HTTP/HTML或AJAX层来提供用户界面。

记得第一次听到《Time is Changing》这首歌,是大学的时候,从张晨那些《游戏·人》杂志附送的CD上听到的。当时的第一个感觉就是好听!

今晚翻起硬盘的MP3时,又找到这首歌来听,感觉依旧是很好~~但是看看其比特率(bit rate)才128kps,于是想找个320kps的。找到两个版本,但都跟我的那个不同(唱功与配乐都有明显的区别)。找了几个小时,才找到一个满意的答复,说网上流传着4个版本,其中《Dark Chronicle 2 OST》中有3个版本(应该有一个是纯音乐的),而第4个版本估计是有人从PS2的游戏DVD上抓取过来的(就是我最喜欢的那个版本)。

一切解决后,今晚便过去了。

PS.  1、近来买了个Sennheiser(森海塞尔) MX360耳机,据说是MX500的直接继承者。但是发现硬盘里的MP3都很烂,感觉对不起这耳机,而是找MP3都尽量找320kps的。还有,这耳机最好的地方,正如别人所说的那样,是富有弹性的低音。

2、由于某项目的实施人员晚了提交该项目的需求,导致我们整个项目组明天要加班甘进度。唉,一星期最期待的星期天就被强奸了。这样,星期天的爬山计划也泡汤了。

首先,今天是个很特别的日子,因为很多情侣特意选择今天结婚(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;