Shell's Home

关于地震的问题

May 15, 2008 - 1 minute read - Comments

大家知道贝壳不是穷人(至少算起来,在社会上不算穷人),这次地震了,公司组织捐款。老实说,公司里面要是普遍捐1000的,贝壳最多也就挠挠脑袋,说句”半个手机又没了”,就扔出去了。或者要是有说法,说你要带头怎么怎么的,贝壳最多也就是想想,捐了也就捐了。不过这次情况比较特殊,贝壳在出差,所以就出了点不愉快的事情。 因为贝壳在出差,所以无法直接捐款。公司组织了垫付捐款,让每个人讲个捐款额度,然后公司垫付捐款,回来再给。结果公司的一帮同事自己捐100,哄(发阴平声,一声)贝壳捐500。贝壳不想当这个出头鸟,所以就准备捐200。结果完后一统计,贝壳觉得不大对,怎么这多阿。赶紧问统计的同事,结果他回一句,你不是捐500么? 贝壳马上找负责捐钱的人联系这个问题,到不是说不想捐,而是要捐不要捐完全是我的自由,不经过我的同意怎么能随便说我要捐多少呢?大家可能觉得献爱心么,怎么还计较这个。实话说,要是哪个捐了自己一年工资,我随便你说这话,否则闭嘴。我高兴怎么捐是我自由,捐钱是捐钱,财务问题是财务问题。不经过本人同意就捐款,说起来回来让我认还是不认呢?认了就破财当出头鸟,不认回头还指不定别人怎么戳脊梁骨呢。这种随便让人一统计就捐钱的做法是否有点太不严谨了呢? 说到这里,贝壳还想起昨天看的一个笑话。一个照片,上面写,”XX慈善基金会请您捐款XXXX…“。说实话,昨天我是当笑话看的,今天我就有点笑不出来了。诚然,地震了,大家都很难过,我们想为灾区的人民做点什么,可做什么呢?怎么做呢?我的一个朋友在MSN签名上写,每次地震就捐款,捐款了就盖楼,盖楼了就回扣,回扣了就豆腐渣,豆腐渣了一震就倒,倒了继续轰轰烈烈的捐款。所以她的结论是,一分不捐。 我还是得强调一点自己的观点,每个人有捐的自由,也有不捐的自由,所以我觉得这个朋友的做法并没有什么错误。不过我们可以想想地震灾情最严重的是什么?学校。谁有听说政府机构有什么问题么?没有。要说缺钱,说地方贫穷,说着急上教育,说我们没办法。为什么死的都是孩子,而不是公务员?难道政府比学校更有钱?难道政府应该比学校更有钱?另外贝壳曾在哪里看过一个报道(请恕贝壳找不到原文),说这次受灾的聚源中学,被称为“危房”的旧校舍没事,新校舍反到倒了。对比对比各地的白宫式衙门,不觉得讽刺和悲哀么? http://bbs.yaolan.com/thread_50222085.aspx http://www.my1510.cn/article.php?e5d36d79e4f603f0 还有就是贝壳看到的一个资料,凤凰的节目,江河水走西南的记者写的blog。[http://www.my1510.cn/article.php?f734ba3f59d26040]其中就谈到了,过度的开发水利资源有导致地震的可能。关于这个问题,贝壳以前从未得知(当然,贝壳也不学水利地质,所以也不知道这个问题的具体情况),以前一直认为水坝这种东西,修越多越好。那么现在我们是否应当关注这些问题,关注水坝的负面效应。如果这是真的,即使因为实际需要而修建水坝,也至少不要为毁坏我们家园而感到骄傲。 最后就是这次中国政府的态度,我得说,主旋律是好的。反应迅速,信息公开。和三十年前的唐山,今年二月的雪灾比,相信大家心里都有数。但是我还是得说,还是不足够。很多国家的救援队不得进入灾区,新闻报道也主要以新华社为主,报道以主旋律为主。虽然说我可以理解这些行为的理由,但是我觉得,我们可以更公开。让我们看到失去生命的人群,失去生命的城市不会让我们感恐慌,一直说没事才会让我们恐慌。让我们看到有发国难财的人,有明哲保身的人,自私的人,也不会让我们止步不前,而是会让我们更明白自己在这种时候怎么做。

python的几个改进

May 11, 2008 - 1 minute read - Comments

首先需要增加的就是kill掉线程的方法,目前我们统统是调用系统函数。有没有搞错阿,需要针对系统写代码不说,还不安全。在线程关闭的过程中没有辗转开解和安全捕获。从最安全的角度上说,要关闭线程最方便的就是给其他线程抛异常。python并非不可以给其他线程抛异常,可非常麻烦不说,具体执行的时候发现,其实根本不是抛异常,而是在执行过程中检查异常。这样当程序在调用外部代码的时候死循环,想kill线程的时候根本不可行。所以安全的关闭线程的异常和直接kill掉线程的方法都要有。 其次,这东西没有什么可以快速辅助处理集合的工具类,例如STL中的set_union等等。虽说每个都不难,可是统一的实现和各自的实现毕竟是有差别的。很多时候,我们只需要抽象的计算两个集合,一个和一个的交集,就OK了。

反射的几个类型

May 6, 2008 - 1 minute read - Comments

所谓反射,其实就是在运行时可以获得代码数据的技术,算是面对对象编程语言的专利。从这个意义上说,反射可以分为三个类型。 头一类是RTTI,其实这根本不算反射,本质上只能说多态。RTTI是一种鉴别某个对象是否为某个类的派生实例的技术,在C++中就有实现。简单的方法就是实现一个特定的虚函数,将当前对象所属的类虚函数表和所属父类的虚函数表一一返回。这样对比某个类的虚函数表,就可以知道是否为派生实例了。支持RTTI,程序才算真正支持了面对对象,而反射则是更高一层的技术。 第二类就是在C#和Java中盛行的反射技术,这种技术的核心在于可以通过名称寻找到对象。例如,我们可以寻找到一个叫做abc的对象,枚举其中的成员和方法,并且执行调用,这才是反射最大的意义。当我们遇到不同的数据输入时,我们可以调用不同的方法来处理这个数据,并且这个过程是动态配置的。而在C++中,我们无法通过编译器支持这个能力,必须手工的建立一个名称和一个对象的关联关系表,在合适的时候通过这个表,获得某个名称的函数入口指针。其实C#和Java中实现的方法和VM息息相关,他们的代码在目标文件中还保持着命名空间-类-对象的结构,Java还进一步的保留了源码(只是被翻译为了更快的P代码),而C#只保留了IL代码。这样VM在执行的时候自然可以很轻松的找到对应的函数,并且获得函数签名。而C类语言的特征是汇编时代的”符号链接”方式,编译的时候保有符号,完成链接就没了。 中间插一句,其实我们完全可以写一个只支持高阶语言的系统。这样的系统未必高效,可一定方便阿。 最后一种则是python中的系统,当用户调用一个类中的函数的时候,使用一个专门的函数来决定调用哪个。因此当对付SOAP这种东西的时候,python可以直接上。而C#,Java,C++都要通过工具生成代理方法。再用代理方法去调用公共函数库,实现调用。因为python直接将调用定向到了一个统一的函数上,所以压根不需要这步。不过这步的代价是严重的性能问题,因为每次函数调用都要去检查调用目标。python是纯脚本语言,占了这点便宜,所以才能这么干。

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

May 2, 2008 - 3 minute read - Comments

以下讨论的东西都是在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

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

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点上的飞机,安检过的特别慢,上去后空了一堆的位子(完全可以想像)。 如果说过错的话,到说不出东航什么过错,毕竟他们是按照国家规定的时间表走的。可这次早上大规模的滞留,总不会是我们突然都不会坐飞机了吧。也不知道是哪里出了错,这种情况,真的能应对奥运么?

python的非经典错误

Apr 8, 2008 - 1 minute read - Comments

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")]

链接上的问题

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 了。