Shell's Home

May 2, 2008 - 3 minute read - Comments

C++继承,虚,转换规则探究

以下讨论的东西都是在VS2005下跑出来的,如果想知道别的编译器规则,请照跑一遍。以下是类定义,函数内容为打印出当前函数名称,所以就不再贴了。 class Base { public: Base(); Base(const Base & o); virtual ~Base(); virtual Base & operator = (const Base & o); void function1(); virtual void function2(); void function3(); virtual void function4(); //virtual void function5(); virtual void function6(); }; class Derive : public Base { public: Derive(); Derive(const Derive & o); virtual ~Derive(); virtual Derive & operator = (const Derive & o); void function1(); virtual void function2(); virtual void function3(); void function4(); //compiler error //int function5(); protected: virtual void function6(); public: }; 首先我们讨论继承下的构造/析构顺序。

Apr 25, 2008 - 1 minute read - Comments

无条件的爱国和无聊的自尊

实话说,这个文章不好写,标题更不好起,尤其是在这种爱国情绪异常高涨的敏感时期。不过我还是得说说,关于某些中国人无聊的自尊和奇怪的爱国主义观点。 大家知道,我是个程序员,因为工作的关系,经常得和人讨论一些计算机上的问题。几年前我就和一个人讨论过关于中国是否需要自己的芯片,自己的系统,等等等等的问题。我的意见是,中国不需要自己的芯片产品和系统产品,但是必须拥有自己的芯片技术储备和系统产品储备。因为掌握一个技术系统是一回事情,而投资研发生产就是另外一回了,后者是需要成本的,亏了你负责还是我负责?而对方的观点是,我们必须拥有自己的芯片产品,拥有自己的系统产品,因为我们是中国。关于这个我就很奇怪,英法德意奥这些八国联军,除了美国,也没有多少芯片产品阿(其实是有的,不过多数是专用芯片)。如果说系统,世界上的商用级别系统基本就三个,Windows,MacOSX,Unix,全是美国的。至于要说其他国家开发的系统有没有,一个必须是商用级别的,像我当年自己写的哪种“操作系统”就请免谈,还有一个要和Unix没有派生关系,否则还不是老美的根?按照这两个条件来说,可以说世界上的系统只有美国一家。即使是按照经营公司(注意不是基金会)来算,也是美国大头。至少我只知道一个Novell的SuSE不是美国的,其他商用系统,Microsoft的Windows,Apple的MaxOSX,Redhat,Sun的Solaris,HPUX,IBM的AIX,全是美国的。如果说我们担心技术受制于人,担心后门担心漏洞,而在保密领域采用自主操作系统,并且将这个过程作为国家的操作系统技术储备的过程的话,我是完全理解和支持的。可是自己开发一套芯片产品和系统产品,而且原因仅仅是“我们是中国”。我没有感觉到说话掷地有声的自豪感,反而清晰的感觉到了某些人头上的两个大字“傻X”。 仅仅因为我们是中国,就开发一套自己的系统,因为作为一个大国,不能没有系统。我不知道是不是这个逻辑。这个逻辑看上去到也没错,不过开发以后呢?没人用呢?再号召大家爱国一回,每个人都使用这个国产系统?不说别的,那位兄台当时还在请教我关于Windows安装的某些问题,不知道他会不会因为爱国去弄套银河(据说也是Unix内核),然后装上去写文档。如果我们陷入无条件的爱国中,那就会发生无数傻事,产生无数傻瓜,例如这种号召做操作系统的,还有下面要说的血狮,佳乐福等等。 至于血狮,经历过那个事情的都会觉得,那就是个爱国主义的大笑话。当年血狮打着爱国主义的大旗做了N多宣传,结果呢?一塌糊涂。此后我就一直对所谓的“爱国主义”抱有一定的戒心,因为这个东西实在太容易被人利用了,谁能定义清楚什么是爱国呢?买外国的产品爱不爱国?如果买外国产品就是不爱国,那么东莞为全世界每人生产了一双皮鞋,号称世界工厂的值得我们骄傲的事实,就会变成东莞诱使全世界每人叛国一次了。可能又有人要和我争辩情况不同,可是,不知道大家看没看过公平论。只有当你抛开你是谁的时候,才可能公平。我们暂时抛开中国人的身份,单论买外国货是否就算背叛,那么无论如何是得不到这个结论的。我的观点是,当质量,性价比相近,或者说有的比较的时候,我会选择国货,因为让国内厂商赚钱就是让中国人赚钱,让中国人赚钱就是让我赚钱。但是当国货是个垃圾,或者我很讨厌。我并不介意外国产品,尤其是日本产品。不得不说,虽然我挺讨厌日本的一些东西,然而却不得不佩服日本的另外一些东西。 说到这里,我还准备说一下所谓的“公平论”。我是不知道在哪里看到的简介的,没有拜读过原文,不过我觉得他讲的很有意思。很多时候,我们睁眼说瞎话,就是因为我们是“既得利益者”。只有在你根本不知道你会是谁的时候,你才能真正的说公平。例如一个老板和一个员工,老板希望少发钱多干事,员工希望多发钱少干事。支持谁呢?只有你不知道你会成为谁,你才能公平对待。如果你讲支持老板,可将来做了员工,不要懊悔到心痛么?如果你讲支持员工,偏偏做了老板,不要伤心到白发么?很多事情我们只有抽离开我们是谁,抛弃固有的立场,才能公平对待和评价,当然,前提是你打算做出公平的评价。在这点上,我到是喜欢真小人胜过伪君子。事实是对我有利,我就说,虽然不公平,可世界何尝公平,我就是要这么做,因为对我有利。而不是摆出一堆的道理,站在看似公平的立场上说着冠冕堂皇的东西。北京高考分数线低,要不要改?问我,我说不改,为啥,因为我在北京。 OK,有了上面的一堆爱国和公平,我们现在看看我们今天的重头,佳乐福。这超市也算倒霉,就因为生来带有法国基因,又因为法国政府无聊的支持了下藏独,就被一群群的中国人鄙视。实话说,我觉得实在有不够理智和不够解决问题。首先我们就说说法国政府的言论吧。我一直有一个观点(但是很难做到阿),即使你说的是对的,也应当允许别人说错的,尤其在政治,思想等等这种无法立刻明辩是非的领域。认为自己是正确的,而禁止别人说错误的,我感觉仿佛回到了文化大革命时代。当然,你可以尽力宣传自己的观点,尽力说服对方。但是如果我们坚持我们是对的,而禁止别人说错的,那么就会陷入随大流的怪圈中,你不敢,或者无法说出正确的东西。而我们知道,真理往往掌握在少数人手中。当然,我们会努力表达我们的意见,上层也会(好吧,是至少大多时候会)按照大部分人的意见行为。然而禁止其他人的言论,绝对不是一个好的行为。也许,我的话会被某些人解读为支持藏独,我相信这些人的逻辑一定是零蛋。我说即使我们说的对的,也应当允许别人说错的,那么推论下来的潜台词就是藏独是错的,不过世界上就有些逻辑零蛋的傻瓜。 其次,有人说西藏问题是中国的内政,谢绝国外的讨论和干预。诚然,我支持西藏问题是中国的内政,支持谢绝国外干预。不过评论?我看说这话的人没少对美国指手画脚,至少,他们说西藏问题是西方世界的阴谋。这算不算个悖论?你要说西藏问题谢绝国外评论,就不能说西藏问题是西方世界的阴谋。你要说西藏问题是西方世界遏制中国的阴谋,就不能说谢绝国外评论。否则,你又有什么资格对美国的做法指手画脚大加评论?当然,可能有人会说一个是内政,一个是国际事务。不过,我们就真的没有评论过人家的内政么?如果非洲某个军权国家大肆屠杀贫民,你会闭口不言呢?还是跳出来说话?如果闭口不言,你缺乏人类基本的同情心,如果跳出来说话,凭什么?这不是评论内政么?对于西方的评论,我们只能认为其中有利益集团为了利益而歪曲报道(当然,其中还有中国媒体控制的“功劳”)。然而拒绝国外评论内政,拒绝所有得罪过自己的国家的所有企业……这是否有点小家子气呢? 而后,法国政府支持藏独,关佳乐福什么事情?抛开所谓双赢的理论,抛开所谓是非,如果仅仅因为法国政府支持藏独,佳乐福就要倒霉。那么中国政府干点啥不地道的,是否每个人都要跟着倒霉呢?不要说我们是正义的,伟大的什么狗屁理论,我相信我们是伟大的,然而谁都不能排除政府里有败类(前两天刚审的不就一个,虽然那未必是因败类受审),如果这些人做了什么事情,你是否情愿接受你的倒霉命运? 最后,我们看这次的佳乐福事件,是否觉得有种阴谋的味道?包括将佳乐福设定为反法的典型,包括说佳乐福5.1降价打算让中国人自食其果(原谅我没有使用原文)。佛祖在上(似乎也有点崇洋,要不要改老君?),有多少商家5.1节没有规划降价促销的?这个关于降价的说法一出来,就逼得佳乐福很难做。如果不降价促销,恢复人气,那么可能佳乐福在中国就要受到重创。更不用说竞争对手们一定会趁机降价,甚至打出爱国的招牌。可降价的话,会让大家觉得这个事情真有其事。最可笑的是我收到的一个版本里面,说法国政府斥资让佳乐福降价一成。拜托,以佳乐福现在的状态,降价一成基本只是和当前持平而已(要考虑到不降价的库存成本),最多加上小亏,再加上考虑到将来的人气因素等等,应当是佳乐福主动去做才对。哪里有政府捧钱上门要求降价的说法,何况这笔钱怎么出?法国可不像中国,如果发现有这种钱出来,那基本就是某人或者某些人辞职的结局。我固然不喜欢成为“可能的”法国政府对付中国人民的棋子,但是也讨厌成为某些人对付竞争对手的棋子。 我觉得,我们很多人都陷入了谵妄的爱国主义情绪中。凡是反对中国的,就是反对我的。凡是反对我的,就要被打倒。这种理论反过来用的可以说是疯子也可以说是天才,然而如果正着用只能说是傻瓜。个人不代表国家,国家也只能部分代表个人,其代表的程度和国家的民主程度呈正比。诚然我反对分裂西藏分裂台湾,不过理由说起来可能不怎么冠冕堂皇,因为我有利,其次才是国家有利,西藏人民有利。而且我欢迎别人评论,无论你说好也好,说势利也好,说卖国也好,总之你说你的吧。大国之所以能成为大国,就是要有这么种气度和耐性。如果自尊过剩,别人刚一评论便跳起来让人闭嘴,甚至出口谩骂以致动手(不论谩骂的理由是什么),那最多也就是街头小混混的等级。这种情况下,更像是因为自卑,所以自傲。

Apr 15, 2008 - 1 minute read - Comments

语言造就人

学汇编的是硬件,学C的是指针,学C++的是模版,学Matlab的是矩阵,学Lisp的是图灵机,学Java的是模型,学Awk的是字符串,学SQL的是数据集。

Apr 14, 2008 - 1 minute read - Comments

关于上飞机的问题

在blog前,贝壳先问大家一个问题,一个人坐飞机要提前多少时间到机场? 相信我们很多人都坐过飞机,但是很少有人关心过准确的手续时间问题。根据国家的标准,乘客应当在飞机起飞前90分钟到达机场。登机牌是在飞机起飞前90分钟开始办理,直到起飞前30分钟停止办理。机票的停止发票时间也差不多,如果临时到机场,可以在航空公司柜台(票务柜台,不是登机柜台)办理机票,而后在对面的登机柜台直接更换登机牌上飞机,不过这种情况下多数就是全票了。在柜台停止办理登机手续后,紧急柜台(特殊柜台)会开放特殊票(贝壳的特殊折扣票就是这种)。同时,候机室会开放登机口,旅客开始登机。在飞机起飞前5分钟,登机口关闭,辅助系统撤离,等待塔台指令起飞。当然,以上是理想流程。 不过我们中的多数人都不会把上面的时间当回事情,一般情况下,我们会提前一个小时到机场。然后直接拿票,5分钟搞定问题。再直接过安检,10分钟就差不多了。等个5分钟上下,登机口就开放了。上飞机后20分钟,飞机起飞。一切都很不错。但是今早,贝壳遇到了一个诡异的事情,和上次在首都机场跑两次安检,在虹桥机场连等12小时差不多经典。 贝壳今天要乘坐东航的MU5545次航班去烟台(没错,就是那架起飞后机舱内有汽油味返航的,大家可以GG),飞机7:50在虹桥机场起飞,贝壳以前坐过一次。按照前次经验,从家出租过去是18分钟,所以贝壳这次6:20起床,6:30上出租,7:00到,7:50起飞。当然,是这么预计的拉。 实际是,贝壳6:20起床,6:30上的出租,出租到离机场差1公里的时候是6:55,但是这1公里足足走了20分钟。最后贝壳实在等不及,直接下来坐摩托到了候机楼(还花了20大洋)。7:15分到候机楼一看,里外三层的人。贝壳赶紧找保安,”我是急客”。保安说OK,这里外三层全是急客。贝壳没办法,安生排队吧,排到一半,保安说不用排了,肯定关柜台了。贝壳冲到票务柜台,要求改签,结果只有晚上八点的飞机,然后发现两个同事也没办上。这次去6个,只走成一半,有一个7点到的还没排上呢。话说一半,发现对面柜台空了,全冲到东航柜台前面来改签了。据赶上的说,他们是8点上的飞机,安检过的特别慢,上去后空了一堆的位子(完全可以想像)。 如果说过错的话,到说不出东航什么过错,毕竟他们是按照国家规定的时间表走的。可这次早上大规模的滞留,总不会是我们突然都不会坐飞机了吧。也不知道是哪里出了错,这种情况,真的能应对奥运么?

Apr 8, 2008 - 1 minute read - Comments

python的非经典错误

def comp_tuple_file(tuple_file1, tuple_file2): for i in tuple_file1: if i in tuple_file2: tuple_file1.remove(i) tuple_file2.remove(i) if __name__ == "__main__": t1 = [(1, "1"), (2, "2"), (3, "3")] t2 = [(1, "1"), (3, "3"), (2, "2"), (4, "2")] comp_tuple_file(t1, t2) print(t1) print(t2) 错在哪里? 头一次循环,i=(1,“1”)被正确移除了。但是接下来,i=(3,“3”)? 这个叠代器的行为很有意思哦,貌似叠代器内存储的是集合的索引。 def comp_tuple_file(tuple_file1, tuple_file2): collection = tuple_file1[:] for i in collection: if i in tuple_file2: tuple_file1.remove(i) tuple_file2.remove(i) if __name__ == "__main__": t1 = [(1, "1"), (2, "2"), (3, "3")] t2 = [(1, "1"), (3, "3"), (2, "2"), (4, "2")] comp_tuple_file(t1, t2) print(t1) print(t2) 这才是正确的代码。

Apr 7, 2008 - 1 minute read - Comments

链接上的问题

贝壳最近在用库上吃了不少苦头,先是crypto++5.52。编译后怎么也链接不上。后来发现需要用/MT参数编译为多线程。后来又在STLport上又吃一次苦头,可见VC2003的默认单线程模式确实不得人心。 下面说一下STL的编译手记。下载STLport,解压。运行vcvars32.bat设置环境变量,去build/lib下面,运行 configuare -c msvc71(如果你是2003,否则按configuare –help察看你的编译器类型)。然后运行nmake -f msvc.mak install。可以看到有两个目录被建立了,bin和lib。把bin的复制到windows/system32下面,把lib的复制到系统目录下面。 安装就OK了。 上述和boost都差不多,然而和boost不一样的是,编写程序的时候,需要手工指定stlport的头文件路径。boost的可以以<>来引入,因此boost的头可以复制到系统里面去。然而stlport的必须以手工方式指定,否则就要覆盖默认的stl 了。

Apr 1, 2008 - 1 minute read - Comments

显示自身的代码

void main(){char* a=“void main(){char* a=%c%s%c;printf (a,34,a,34);}“;printf(a,34,a,34);} 核心是使用printf(a,a)来代换显示,并且用34来规避转换。当然,完整的要带include,稍微有点区别。

Mar 27, 2008 - 1 minute read - Comments

None

说要换blog,但是隔了几个月还是没动,因为贝壳了解到一个悲惨的事实。google提供的blog,是要穿墙的。 这样说的话,我估计这篇blog是没有几个国内用户了。不过华语使用者众,多条路也不错。

Mar 10, 2008 - 1 minute read - Comments

一些使用firefox的技巧

在linux下和windows下共享同样配置/插件。这个很简单,上面的blog中有篇文章说到thnunderbird在双系统下共享同样邮件的问题,firefox也一样解决。能用linux的人不会查不出配置目录位置吧。 节约内存技巧。 firefox虽然号称小巧,然而很多时候我们发现他的内存消耗也非常惊人。在贝壳的机器上,有的时候会高达150M,基本等于普通编辑器/播放器的10倍。事实上,不是firefox浪费内存,而是默认的内存配置是针对”机器上只开firefox”设计的。如果你机器内存小,或者需要同时开其他程序,最好自己配置一下firefox。 首先就是fasterfox,关闭其中的”增强预读”,这东西很消耗内存。然后是内存缓存,调整到32M吧。一般一个网页上所有文件差不多1M-2M,32M够把20个网页的所有内容缓存起来,再多就不大正常了。根据贝壳自己的猜测,渲染动作应当是动态进行的,否则内存根本顶不住长文本的渲染。这样在浏览的时候,从后台抓取内容,动态渲染的速度就非常重要,因此强烈推荐不要小于8M。否则连5个页面的内容都不在内存中命中,还玩个P阿~ 还有渲染中的”启用快速返回”,将内存中的保留页面数调整小,贝壳用的是3。当然,这个只适用于firefox1.5。 其次是session manager,将”撤销关闭”尽量减小。反正贝壳减小到了1个窗口3个页面。这些页面在关闭后还是继续消耗系统的内存,因此越小越好。当然,小到多少是要看你的具体需要了。 最后,少用插件,少启用插件,除非你真的需要。长期不需要的就禁用,或者干脆卸载。 内存回收技巧。 很简单,觉得不够了,关了再开。反正有session manager,正在浏览的网页根本不会有影响。 同时打开大批网页技巧。 最好使用Tree Style Tab,这样方便。另外,如果需要打开一个页面的所有连接,可以这样做。先察看页面信息,选择”链接”->“全部选择”->“复制”,然后开一个文本文件,把内容粘贴进去。可以看到内容其实是一堆的页面链接。当然,如果页面内有js做的链接指向,可以试试用Convert javascript or onclick to normal links这个greasemonkey脚本转换成目标链接。然后,把这个文本文件改名成htm,打开。通常情况下应该是一堆无法点击的文字,不过你可以用Linkify ting来把文字转换成一堆链接。然后……一个个点过去吧。 上面是使用greasemonkey解决的方法,当然,也有更简单的方法。你可以安装flashgot,然后新增一个下载管理器,名字叫做firefox。路径就指向firefox的执行文件路径,参数不用动。平时用你喜欢的管理器,需要打开全部链接的时候,更改为firefox,然后”使用flashgot下载全部链接”。当然,缺点是对付不了js脚本,除非你加载Convert javascript or onclick to normal。 不过鉴于内存状态考虑,建议不要同时打开大量页面。维持在10-20个上下最好。

Mar 6, 2008 - 1 minute read - Comments

大灌篮的广告

昨天看大灌篮,多好看是没看出来,不过广告让我印象深刻。 周杰伦一接手机,HelloMoto。 打开一看,移动飞信。 …………