More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  Shell's RoomPhotosProfileFriendsBlog Tools Explore the Spaces community

Blog

7/4/2008

沈阳记一兼我还活着

    同志们,我还活着。最近项目不断,贝壳来了走走了又来,先是烟台,回上海修养两天再回烟台,然后回上海救火两天,连公司都没回去报销又来烟台,刚刚搞的差不多又来沈阳。下面据说还有上海和烟台,貌似奥运前是没完了。
    而且烟台的网络状况急转直下。本来速度快的跟鬼一样,现在报社上网要用代理,每次打开个页面就要点一次密码确认,点记住密码也没用。这种情况下速度根本没意义,宾馆则是慢的跟鬼一样。然后……贝壳就光荣的断网了。
    祸不单行,贝壳在7月1日接到了移动的通知,说话费只有14元多,记得充值。贝壳想,哦,也能用上一些时间了。谁知道第二天就断网,这才想起来移动的话费是第二日过的。然后紧急找人充值,却被告知因为欠费无法充值。然后贝壳要和客户联系,要用飞信帮人测东西,要收的通知,移动上网看blog……全部没了。最要命的是,我马上要出差沈阳。
    贝壳到了沈阳,打车到位,一点不差,真的是运气。否则喊救命都不知道喊谁了。第二天,找个地方充值,总算把手机开开,谁想到刚开就用到了。我说要去故宫旁边的如家七斗星酒店,结果混蛋司机给我拉到了故宫旁边的如家酒店。下来才发现不是,回头找司机没影了。幸好这个时候,手机已经可以用了。于是我打开Moto A1200r,接入中国移动GPRS网络,使用Google Map手机版,很容易的找到了当前位置。(贝壳注,以上不是广告,当然和周XX的大XX里面那个MXXX和移XXX的XX更不一样……)。走走两分钟就到了,作为手机地图来说,这算是立了头功了。
6/14/2008

招行的一些数据

银行的平均窗口服务效率是每人4.5分钟。
普通窗口队列长度是62人(周五14:20记录),三个窗口,等待时间90分钟。
金卡窗口队列长度是10人(同一时间记录),一个窗口,等待时间45分钟。
普卡/金卡比为6.2:1,即存款在5W以上的人占总人数的13.89%。
存款结算时数据为存款利率86.14,但总资产计算时利率只算了86.13,出现一分误差。
以上。
5/22/2008

关于捐款的问题

    上次贝壳已经给捐款不痛快过一次了,这次还是得继续不痛快。
    首先是一条低调的新闻,网易终止与红十字会的合作,据说原因是"过程无法监控"。作为一个慈善机构,过程和结果无法监控,在发达国家(好吧,成熟国家,省得犯了某些人的讳)是不可想像的。网易为什么要提出监控,红十字为什么不给监控,这个就要说到善款的结算过程和意义,以及当前中国非政府组织的现状。
    已经上班的朋友可能知道,我国有两种税征收方式,连带征收和查账征收。查账征收中,国家会检查企业的出入账目,计算企业盈利,并从中抽取企业收入的一定比例,这个就是所谓的增值税。如果您不小心亏本了,或者打平,那么是无需纳税的,这个很合理。总不会说亏本继续纳税吧。企业怎么减小增值税呢?主要是购买各种东西,当然是生产过程所需的东西,这些东西会计入成本(因此出差报销需要发票,因为这些发票代表着出差这个东西的成本)。如果企业收集很多发票,做帐做到打平,不就可以节税了么?事实没这么简单的,每个企业都有所谓的总支出,而总支出是无法作假的。因为一般的发票(餐饮,手机等一般人能搞到的发票)在总支出中占的比例不得大于一定的值。换句话说,做300W的生意,如果花45W作为餐饮花费是合法的,如果花100W,那就只能按45W报账。而其他发票可不是一般途径可以搞的到的,毕竟上游厂商也要开增值税发票,从源头的1元成本增值到100元产品,增长的99元里面的税收,不是落入上游就是落入下游,大家商量着来吧。从此意义上说,捐款(尤其是企业捐款)开具发票和财务透明就尤其重要。我举个例子。
    例如,你是一个企业老板,做的是把一种东西买进,加工,然后卖出的生意。东西的成本是8元,加工的成本是2元,卖出去是15元,其中渠道和营销需要2元成本(原谅我用这种很白痴的例子),那么每个东西的净盈利就是3元。国家按照34%收税,简单点我们说税收就是1元(其实例子中还是有问题的,渠道成本超标了)。那么你每个东西纯利润就是2元。好,现在,你打算给灾区捐款,捐300(原谅我这种白痴比喻)。那么我们说,理论上你卖100个东西够么?不够!为什么?因为你要交税。你的纯盈利是3,可税交好就变2了,因此你要卖150个才够。
    哪里有这种事情,我做好事还要缴税?这不是强盗逻辑么?所以一般企业捐款都要求开具发票,证明这笔钱是捐掉的。这样国家会把这笔钱计算为成本,不会让你交这种税。可如果捐款不给发票,那事情就有趣了。我做好事,还要缴税,而且很重。而且谁能开具这样的捐款发票呢?如果人人能开,那么好,我当场开个NGO,说是慈善,然后把企业盈利全部捐掉。这样我的企业永远打平(甚至可以亏损,享受国家补贴),然后钱还在我自己口袋里面。因此可以接受捐款的慈善机构也不是说开就能让他开的,否则会成为大企业的避税所。一般情况下,一个NGO如果要开,必须要公开账目,而后获得国家认可。公开账目是获得国家认可的必要前提,如果账目不公开,国家不会认可的,否则就会产生偷税。而中国的现状是,即使开慈善组织,账目公开,也很难获得国家认可。大家只能把NGO注册成公司,给工商界开一般营业发票,然后上税。因此大家捐款只能捐给红十字会,而他的账目却是不公开的,因为你没别的选择。
    而且账目不公开会产生一个更混帐的后果。如果说前面一个只是不合理,那么这种可能就只能说是混帐加没人性。那就是贪污。我们捐100,NGO提取50%(或者更高)作为运作成本,然后剩下的发给灾民,对外宣称全发了。因为你根本不知道自己捐多少,自己拿的是多少。例如,你自己捐了100,你知道你的朋友捐了500,那么如果这个NGO说总数捐了1000,你怎么知道是不是真的只有1000呢?如果公开账目,你可以核对你的捐款是否在里面。很明显,如果不在,这是有问题的。如果在,而且每个捐款人的款项都在,最后的这个总数一定是正确的。发放也是同样的问题,如果公开发放账目,你可以看你拿到没有。如果有写没有拿,这是有问题的。如果每个上面写的人都确认收到了后面的款项,那总发放数也一定是对的。而后,我们通过总接收和总发放可以算出一个组织的组织运作成本。如果有大量的善款被消耗了,那么我们就可以说这个NGO是有问题的,我们会更换NGO捐款。而造成这种高消耗的最大可能就是贪污。同时,我们也可以计算出NGO的其他问题。例如,一个NGO的工作人员拿2W去买药品,他和药品供应商很熟悉(这个情况很普通吧)。所以让他们给1W的药品,开2W的发票。实际上就是给2W现金,开2W发票,给2W药品。1W给红十字会,1W实体药品自己拿回去分掉。公开账目后可以发现,这种情况下药品价格会比正常价格高一倍。如果说为地方增加产值后,自己贪掉一部分的贪污是某种程度上是可以接受的。如果说尸位素餐,人浮于事的贪污是让人痛恨的。那么拿灾民的带血的钱的贪污就是不可忍受的,伤阴德的。更粗俗的说,生儿子没屁眼。也许,我们的红十字会账目不公开有其他理由。也许,我们的红十字会大量提留是有其他原因。然而,你这个样子,让我怎么相信你?
    最后就是关于捐款的数目。有人骂姚明捐的不够多,好,我想最好的方法是这个人站出来。我们计算下姚明同志的总捐款额度和拉到的捐款额度,比上全年除税总收入,再计算下你的总捐款额度和拉到的捐款额度,比上全年除税总收入。如果你高过姚明,我们随便你骂。捐款这种东西,要骂可以,站出来。我不反对攀比,我反对的是说别人捐少了,自己却不多捐。不过估计这些人也有郁闷的理由,据说国家政府机关是摊派捐款,有个银行每人要1000多。这些人估计就是这么郁闷出来的。
5/17/2008

关于地震的预报

    贝壳这几天一直在关注地震的事情,其中经常能听到一个消息,其实地震前已经有了预测,只是因为奥运压了下来。而后贝壳在youtube上找到了一个视频"小动物曾经给予我们的警告!!(四川电视台新闻视频 )",是关于10号在四川电视台播出的新闻,其中就有大量出现蟾蜍的解释。这个事情让贝壳觉得很惊讶和伤心,莫非上万的人命不及政治任务?不过今天,贝壳在wikipedia上找到了这个事情的全面分析,可见wikipedia也不是全无是处么。
    2008年5月10日,四川绵竹市西南镇檀木村(距离震中不到100千米)日前出现了大规模的蟾蜍迁徙,有数十万只蟾蜍在一制药厂附近公路上行走,但当地林业部门解释称,这是蟾蜍正常的迁徙。地震发生后,有网民十分激动,并留言指责“专家还不如蟾蜍”,而有动物学家亦认为,“动物感受地壳变动的能力较人类敏感,因此它们能预知自然灾害也不足为奇。”。但是经过网民搜索,发现蟾蜍大规模迁徙现象曾在2006年4月于重庆、2007年5月于河北唐山、2007年9月于山东临沂、2005年7月于吉林长春、2008年5月于江苏泰州、2007年4月于四川成都等全国大范围地区多次发生并被报道,完全不于地震相关,应属一种自然现象。
    OK,上面我们可以看到,有这个报道是不假,可出现现象和发生地震间不正相相关。要是出现一次防震一次,的却非常麻烦。所以这次的事情,可谓事出有因。我们也可以想像一下国家的立场,如果确认有地震,跑不掉躲不开,那为何不报呢?一方面避免了人员财产损失,一方面展现了高科技,一方面还不会给奥运带来麻烦。所以我估计最严重是国家并不确认地震,因此为了奥运而不做可能性的防范。
    不过由此我到想到一个关于地震预报上的缺陷。大家知道,我们国家很多事情是领导负责制。好不好,看领导。事情做好了固然领导有很大好处,可出问题领导也会倒大霉,因此很多人不求有功但求无过。唐山地震的反思中就有消息说其实地震前已经有了现象,可是领导对于不确定的东西不敢报,怕负责。毕竟地震这东西谁都说不好,就算我们看到各种景象,可万一不地震怎么办?对于地震这种问题,领导负责制是非常荒谬的。但是如果没有一个制度去平衡,恐怕我们又会陷入另外一个极端。地震局一有情况就报,也是怕负责。那我们会陷入漫天地震预报,就是不见地震的情况下。
    对于这种情况,实话说贝壳也没有什么好的想法。不过如果让贝壳做选择的话,贝壳还宁可听到一堆未必发生,也不愿意听不到将要发生。大家可以想想,你是愿意多听几次下雨没碰到呢?还是愿意下雨前完全没预报呢?
5/15/2008

关于地震的问题

    大家知道贝壳不是穷人(至少算起来,在社会上不算穷人),这次地震了,公司组织捐款。老实说,公司里面要是普遍捐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]其中就谈到了,过度的开发水利资源有导致地震的可能。关于这个问题,贝壳以前从未得知(当然,贝壳也不学水利地质,所以也不知道这个问题的具体情况),以前一直认为水坝这种东西,修越多越好。那么现在我们是否应当关注这些问题,关注水坝的负面效应。如果这是真的,即使因为实际需要而修建水坝,也至少不要为毁坏我们家园而感到骄傲。
    最后就是这次中国政府的态度,我得说,主旋律是好的。反应迅速,信息公开。和三十年前的唐山,今年二月的雪灾比,相信大家心里都有数。但是我还是得说,还是不足够。很多国家的救援队不得进入灾区,新闻报道也主要以新华社为主,报道以主旋律为主。虽然说我可以理解这些行为的理由,但是我觉得,我们可以更公开。让我们看到失去生命的人群,失去生命的城市不会让我们感恐慌,一直说没事才会让我们恐慌。让我们看到有发国难财的人,有明哲保身的人,自私的人,也不会让我们止步不前,而是会让我们更明白自己在这种时候怎么做。
5/12/2008

上帝都反奥,我们怎么办

听说北京地震了,全国地震了,这奥运还办不办?
5/11/2008

python的几个改进

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

反射的几个类型

    所谓反射,其实就是在运行时可以获得代码数据的技术,算是面对对象编程语言的专利。从这个意义上说,反射可以分为三个类型。
    头一类是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是纯脚本语言,占了这点便宜,所以才能这么干。
5/2/2008

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:
};
    首先我们讨论继承下的构造/析构顺序。
pa = dynamic_cast<Base*>(new Derive ());
delete pa;
Base::Base
Derive::Derive
Derive::~Derive
Base::~Base
    关于这段代码多说两句,如果我们把class Derive : public Base中的public删除,就会出现C2243错误,看来默认是私有继承。
    先是基类构造,然后是继承类构造。先是继承类析够,然后是基类析够。然后我们将virtual ~Base();的virtual删除,结果就变成了。
Base::Base
Derive::Derive
Base::~Base
    注意继承类的析构没了。所以如果你打算让人继承你的类,记得将类的析构改成virtual,否则他怎么写析构都不会被调用的。
    然后是虚函数继承。
pa->function1 ();
pa->function2 ();
pa->function3 ();
pa->function4 ();
    结果是这样。
Base::function1
Derive::function2
Base::function3
Derive::function4
Derive::function6
    看来,虚特性出来不出来完全看基类。注意到上面的function5么?假设你继承了一个类,打算写一个函数,和基类里面的某个虚函数具有一样的名称和参数,但是返回不一样。嘟嘟~~抱歉,编译器错误。而且注意function6,即使在继承类中声明说这是保护函数,也可以通过公开的基类函数的虚特性进行调用。
    下面我们要说一下拷贝构造函数,这不可避免的要说到定义。
Derive::Derive(const Derive & o)
{
    printf ("Derive::Derive copy constructer\n");
}
    猜猜这个会出什么结果?
Base::Base
Derive::Derive copy constructer
    要是经常看我blog的人就不会意外,继承类的拷贝构造函数调用的是基类的普通构造函数。如果你打算让基类也拷贝构造,那这么做。
Derive::Derive(const Derive & o):Base (o)
{
    printf ("Derive::Derive copy constructer\n");
}
    然后是拷贝构造函数的使用时机。运行代码如下,我们逐步分析。
Base ta = *pa;
Base::Base copy constructer
Base::~Base
    当对象声明时,如果加一个=,则以=后的对象来构造当前对象,这是拷贝构造的第一个用法。
Derive tb = *static_cast<Derive*>(pa);
Base::Base copy constructer
Derive::Derive copy constructer
Derive::~Derive
Base::~Base
    当然,如果我们声明继承类的时候,一样拷贝构造。
//compiler error
//Derive tc = ta;
    当我们试图用基类构造继承类的时候,理所当然的,出错了。
void test1 (Base &)
{
    printf ("test1\n");
}
test1(*pa);
输出:test1
    如果我们以一个对象调用的时候,如果是引用,当然是不拷贝的。
void test2 (Base)
{
    printf ("test2\n");
}
test2(*pa);
Base::Base copy constructer
test2
Base::~Base
    如果是直接调用,首先是拷贝构造,然后调用,最后析构。
Base& test3 ()
{
    printf ("test3\n");
    return Base ();
}
pb = &test3();
test3
Base::Base
Base::~Base
    当返回对象引用的时候,只有很正常的构造和析构。
Base test4 ()
{
    printf ("test4\n");
    return Base ();
}
pb = &test4();
test4
Base::Base
Base::~Base
    返回对象本身的话,哎,怎么会这样?
    熟悉语言的应该看出来了,return Base ();的时候,先跑了一次构造,建立在栈里面,返回的时候要copy到堆中。拷贝构造呢?
    这就是传说中的返回构造优化拉,直接构造在堆上面,省掉一次copy,下面我们看看原始的状态。
Base& test5 ()
{
    Base b;
    printf ("test5\n");
    return b;
}
pb = &test5();
Base test6 ()
{
    Base b;
    printf ("test6\n");
    return b;
}
pb = &test6();
Base::Base
test5
Base::~Base
Base::Base
test6
Base::Base copy constructer
Base::~Base
Base::~Base
    大家看到了?5的时候先构造,再传回,和返回对象引用的时候行为一致。6的时候可没有返回构造优化,于是先构造,然后拷贝。删除的时候先删除原始对象,再删除拷贝对象,大家可以自行证实这点。
    我们再修改上面的调用为下面的。
Base td = test5();
Base::Base
test5
Base::~Base
Base::Base copy constructer
Base::~Base
    首先是5的构造,析构,然后才是td的拷贝构造,析构。这个顺序,熟悉语言的人应该感觉到奇怪了吧。按照推论,应当是先拷贝再析构的。如果你这么觉得,还是先看完下面的东西吧。
Base te = test6();
Base::Base
test6
Base::Base copy constructer
Base::~Base
Base::~Base
    这才是预计的顺序。注意,这里并没有调用两次拷贝构造。虽然贝壳并不了解机制,不过估计又是一种返回构造优化。
    5中例子觉得迷惑的人,不妨在拷贝构造里面打个断点,看看你copy的对象是什么,无效对象!!!!
    返回引用的情况下,一旦返回对象的生命周期结束了,返回的数据就无法保证有效。因此返回局部对象是非常危险的,唯一的里外就是3例子中在返回的时候构造一个新的对象而引发的返回构造优化。
    下面是拷贝构造和operator =的区别和调用时间。
Base ya = *pa;
Base yb;
yb = *pa;
Base::Base copy constructer
Base::Base
Base::operator =
Base::~Base
Base::~Base
    上面一个是拷贝构造,下面一个是普通构造加operator =。
    最后是全部的定义和源码,类的定义参考最上面的。
void test1 (Base &)
{
    printf ("test1\n");
}
void test2 (Base)
{
    printf ("test2\n");
}
Base& test3 ()
{
    printf ("test3\n");
    return Base ();
}
Base test4 ()
{
    printf ("test4\n");
    return Base ();
}
Base& test5 ()
{
    Base b;
    printf ("test5\n");
    return b;
}
Base test6 ()
{
    Base b;
    printf ("test6\n");
    return b;
}
int _tmain(int argc, _TCHAR* argv[])
{
    Base *pa, *pb;
   
    pa = dynamic_cast<Base*>(new Derive ());

    // test inherit function rule
    //pa->function1 ();
    //pa->function2 ();
    //pa->function3 ();
    //pa->function4 ();
    //pa->function6 ();

    //test copy constructer
    //pb = dynamic_cast<Base*>(new Derive (*static_cast<Derive*>(pa)));
    //delete pb;
    //Base ta = *pa;
    //Derive tb = *static_cast<Derive*>(pa);
    //compiler error
    //Derive tc = ta;
    //test1(*pa);
    //test2(*pa);
    //pb = &test3();
    //pb = &test4();
    //pb = &test5();
    //pb = &test6();
    //Base td = test5();
    //Base te = test6();

    //diffrence between copy cotr and operator =
    //Base ya = *pa;
    //Base yb;
    //yb = *pa;

    delete pa;
    return 0;
}
4/25/2008

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

    实话说,这个文章不好写,标题更不好起,尤其是在这种爱国情绪异常高涨的敏感时期。不过我还是得说说,关于某些中国人无聊的自尊和奇怪的爱国主义观点。
    大家知道,我是个程序员,因为工作的关系,经常得和人讨论一些计算机上的问题。几年前我就和一个人讨论过关于中国是否需要自己的芯片,自己的系统,等等等等的问题。我的意见是,中国不需要自己的芯片产品和系统产品,但是必须拥有自己的芯片技术储备和系统产品储备。因为掌握一个技术系统是一回事情,而投资研发生产就是另外一回了,后者是需要成本的,亏了你负责还是我负责?而对方的观点是,我们必须拥有自己的芯片产品,拥有自己的系统产品,因为我们是中国。关于这个我就很奇怪,英法德意奥这些八国联军,除了美国,也没有多少芯片产品阿(其实是有的,不过多数是专用芯片)。如果说系统,世界上的商用级别系统基本就三个,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节没有规划降价促销的?这个关于降价的说法一出来,就逼得佳乐福很难做。如果不降价促销,恢复人气,那么可能佳乐福在中国就要受到重创。更不用说竞争对手们一定会趁机降价,甚至打出爱国的招牌。可降价的话,会让大家觉得这个事情真有其事。最可笑的是我收到的一个版本里面,说法国政府斥资让佳乐福降价一成。拜托,以佳乐福现在的状态,降价一成基本只是和当前持平而已(要考虑到不降价的库存成本),最多加上小亏,再加上考虑到将来的人气因素等等,应当是佳乐福主动去做才对。哪里有政府捧钱上门要求降价的说法,何况这笔钱怎么出?法国可不像中国,如果发现有这种钱出来,那基本就是某人或者某些人辞职的结局。我固然不喜欢成为“可能的”法国政府对付中国人民的棋子,但是也讨厌成为某些人对付竞争对手的棋子。
    我觉得,我们很多人都陷入了谵妄的爱国主义情绪中。凡是反对中国的,就是反对我的。凡是反对我的,就要被打倒。这种理论反过来用的可以说是疯子也可以说是天才,然而如果正着用只能说是傻瓜。个人不代表国家,国家也只能部分代表个人,其代表的程度和国家的民主程度呈正比。诚然我反对分裂西藏分裂台湾,不过理由说起来可能不怎么冠冕堂皇,因为我有利,其次才是国家有利,西藏人民有利。而且我欢迎别人评论,无论你说好也好,说势利也好,说卖国也好,总之你说你的吧。大国之所以能成为大国,就是要有这么种气度和耐性。如果自尊过剩,别人刚一评论便跳起来让人闭嘴,甚至出口谩骂以致动手(不论谩骂的理由是什么),那最多也就是街头小混混的等级。这种情况下,更像是因为自卑,所以自傲。
4/15/2008

语言造就人

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

关于上飞机的问题

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

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;
    这才是正确的代码。
4/5/2008

链接上的问题

    贝壳最近在用库上吃了不少苦头,先是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/xxx.h>来引入,因此boost的头可以复制到系统里面去。然而stlport的必须以手工方式指定,否则就要覆盖默认的stl了。
4/1/2008

显示自身的代码

    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,稍微有点区别。
3/10/2008

一些使用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个上下最好。
3/6/2008

大灌篮的广告

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

晒一晒我的firefox

    firefox是很有名的浏览器,以其短小和安全而著称。相信很多朋友喜欢使用firefox,然而你真的会用么?
    首先纠正一点,最标准的浏览器虽然不是IE,但是也不是firefox。而是以下三个,Safari(WebKit) / Opera(Presto) / Konqueror(KHTML)。Safari是Mac上的浏览器,Konqueror是Linux上的,Opera则多数用于手机上。Firefox 2.0.0.3 (Gecko 1.8.1.3)稍微差点,Internet Explorer 7.0 (Trident)和Internet Explorer 6.0 (Trident)是最不标准的。具体请看Acid2测试(http://www.osxcn.com/css/the-second-acid-test.html)。当然,也有消息称Firefox和IE已经都通过了测试(http://www.appbeta.com/50226711/ie8afirefoxasafariaoperaecaeacid2ce_133101.php)。
    其次,当你用着号称国人精华的XX浏览器的时候。首先请注意一下他是否使用了ie内核。IE有一个非常大的框架,其内核是Trident。所谓的浏览器内核,就是负责将html转换为DOM,然后渲染的组件集。当然,还有一些执行js等等的组件。微软的IE内核一般在mshtml.dll上,如果你有procexp,可以看看所谓的XX浏览器是否用了这个dll。如果用了,没的说,肯定是Trident内核。如果没有么……将mshtml改名转移,直到IE无法正常浏览。然后看看您的XX浏览器怎么样。
    Firefox的内核是Gecko,据说将来要使用Cairo。这两种组件……嘿嘿,贝壳都用过。但是firefox最强大的是他的插件组,效果终身难忘,让人不忍舍弃。下面贝壳介绍一下firefox的部分插件,脚本。
    /find/,这是个很小巧的插件,可以使得firefox能够以正则表达式在全文进行搜索。普通用户就表想了,这东西可是专业人士的杀手工具。可以做出"搜索全文中的所有电话号码"或者"搜索全文中的所有email"等等强大功能。当然,如果你需要的话。
    CustomizeGoogle,GFan一定要用。这个插件可以定制Google,例如可以在其他搜索引擎搜索,剔除赞助商广告,修改搜索的语言(贝壳的firefox就老阿达到英文上去,用这个插件就一切OK)。适用于Google的多个产品,包括gmail,google reader等等。
    fasterfox,强力推荐,加速插件。不过通常我都是用来调整性能参数的。自定义设置,不启用增强预读,缓存32M。这个配置对于0.5-1G的本本很有用。
    firebug,这东西也就网站开发人员用。不过绝对是杀手阿,可以看到网页的css,javascript,在线调试,察看ajax的网络通讯。通过这个东西,很容易调试多数的网页。
    fireshot,推荐看小说的的人用。可以将当前的网页整个导出成png(贝壳注:这不就是Cairo的基础功能么?导出到虚拟interface)。想想你看小说,将当前页面打印到png。不用截屏拼接,嘿嘿。当然,更好的方法是用firebug,直接可以提取内容。不过……看你水准了。
    flashgot,强力推荐,用这个东西可以将firefox的下载转到flashget上。当然,也支持迅雷,netant和bitcomet。这个东西弥补了firefox不支持专用下载软件的尴尬。当然,也有人喜欢都在firefox里面做。这个就如人饮水拉。
    gladder,用于爬GFW看Wikipedia的东西。如果听不懂,我不再解释。
    gmark,推荐多个电脑的人用,可以在各个地方用google bookmark,就好像用自己的bookmark一样,方便统一bookmark。如果你不喜欢在线bookmark(我觉得没有必要,用浏览器必定在线,除非google故障离线bookmark才有用),那么可以用gmark的导出功能,导出到html。然后用firefox的导入,同步两个bookmark。其他插件要么是使用不习惯,要么就是不能和firefox自身的bookmark同步(都是单向的从firefox bookmark导出)。
    google reader notifier,推荐用google reader的挂线族。这个插件会提示你有多少东西你没有读,定时刷新。
    google笔记本,这个需要到google去下载,和gmark一样是让多个电脑同步的好东西。可以直接弹出一个google note让你记东西,并且在任何地方访问。同时也可以选中网页中的部分内容,点击加笔记,自动添加到笔记本中。
    greasemonkey,强力推荐,将用户脚本插入到页面中的组件,可以动态修改页面行为。下面会专门讲用这个组件挂脚本的技巧。
    IE tab,强力推荐,有的时候突然需要看IE,但是单独开一个IE非常麻烦。直接点右下的这个图标,当前页面就会自动切换成IE浏览。只是如果处于登陆中,恐怕会退出。
    keyconfig,可以自己配置firefox的快捷键。
    MinimizeToTray,最小化到托盘区的组件。配合上面一个,对付老板的利器阿。
    NoScript,强力推荐,拒绝恶意脚本,增加安全性。当然,弄不好就是拒绝正常脚本,增加麻烦。
    Session Manager,强力推荐,可以保存你当前在看的所有列表,下次恢复。也可以同时恢复登陆状态(例如你登陆了网站,下次上线就如同中间没有做任何动作一样,当然如果超时被踢就没办法了),恢复关闭窗口。对付firefox的重起,减少内存消耗(手动重起),看一堆页面看到一半有事……等等。非常有效。
    Tree Style Tab,另类的tab样式,把tab在左边做成树,可以折叠展开。如果你和我一样,经常喜欢大量的打开页面。此时,上面的tab往往缩的很小,看都看不到,但是还是长的要左右乱翻。这个时候这个插件