Shell's Home

Mar 6, 2007 - 1 minute read - Comments

烟台出差3

今天去上工,看到昨天的狂风卷雪,居然卷倒不少广告牌。其中最近一块就在我们昨天走过的位置,要是凑巧的话,贝壳和同事们说不定已经集体住院了。虽然雪还在下,但是却能看到天了。 今天第三天了,风稍稍的小了,阴云渐渐散去。虽然还有风雪,但是大海开始显露出瑰丽的颜色来。我们住的地方就在海边,但是住的低,被房子遮挡住了,看不到海。工作的地方虽然有海,但是刚到时天黑了,后面又见大风雪。在风雪稍住的今天,总算能从高处远远的眺望海了。 海的颜色并看不真切,毕竟离了很远,中间风夹雪还吹不停歇。但是海的壮阔确真实的让我感受到了,具体情况就看我的照片吧。隔了很久,总算能用IE把照片传输上来了。家里的配置太过严格,传输起来着实不容易。

Mar 5, 2007 - 1 minute read - Comments

烟台出差2

到了烟台才发现这里标准一个小地方,不是说鄙视啥的。我出门和司机说去哪里,司机问我上海冷不冷。我奇怪他怎么知道我上海来的啊,跑这我用的就是一口标准的普通话,加上感冒,要听口音听出来的打死我也不信。最后司机跟我说了,这里机场每天多点下哪里的飞机都算的出来的。贝壳当场无语。 到了宾馆,贝壳发现一个让我差点昏倒的情况。宾馆居然每天打电话来问,先生需要按摩吗?我……然后宾馆里面套套精油一应俱全,我粉怀疑这到底是什么旅馆。 第三天,更汗的事情出现了。贝壳下午跑到对方公司加班,然后出去吃晚饭。发现面外居然在飘东西,马上趴窗口看看。好消息是,没有下雨。坏消息是,下雪了。 这里的雪很恐怖的,倒不是说我没有见过大雪。北京住这么多年大雪还少么?不过这里随着雪下来的是7级大风。出门就是瓷砖,当时站都不能站的。站着就滑,身上大衣兜风,一吹就倒。实在没辙,所有人手拉手冲过瓷砖区。然后到了路上一放手,就硬生生给风吹跑了。不是说风太大,主要是站不稳,一吹就跟着跑了。乱糟糟的跑回宾馆,贝壳在考虑,还要不要去看海呢?

Mar 4, 2007 - 1 minute read - Comments

烟台出差1

妈的,我现在还在出差中呢。 周五的时候,贝壳正在美滋滋的盘算周末要干点啥.估计要见两个人,其余就可以好好休养下.最近贝壳感冒了,咳嗽的惨不忍睹.突然经理跑过来说,那个谁啊,说马上要你过去.我给你订了下午一点的飞机,没问题吧?于是贝壳的生命骤然坠入了兵荒马乱和惨不忍睹中. 先是要调集笔记本电脑,公司的全调出去了.刚刚好出去的人回来了还在休假,中午回来.于是经理赶快打电话去威胁中午一定要来公司,就算人不到,电脑一定要到.然后贝壳紧急冲回家拿东西.上午10点多知道的情况,11点到家拿东西,11半带了一堆的衣服就冲出去了,12点多点就到了公司.先快速的解决午饭,12点半多,电脑来不及重装就拿着又冲了出去.紧急打车冲向虹桥机场,大约在半小时后,1点多,到了虹桥. 说起来也算幸运,虹桥机场我可熟悉阿,当年在这里被困了12个小时呢.而且还是国航的班机,嘿嘿嘿嘿嘿嘿嘿嘿,熟悉贝壳的人估计也在跟着嘿嘿了.快速冲过去办理手续通关,到Gate的时候已经1点20了,过了5分钟开始登机,刚刚好…… 后面的事情更加验证了祸不单行的说法,贝壳的老妹突然电我(长途阿……),问我周末有空吗?准备买新电脑.然后贝壳的老师也电我(长途……),说下周要讨论一些问题.于是继贝壳失去春节后的第一个周末后,第二个周末也报废了,还不知道安排不安排的开.更严重的是,贝壳素病号,感冒还没好.

Feb 12, 2007 - 1 minute read - Comments

广州出差记

这次被公司派去广州出差了,又去了次广州。没啥好说的,挑几个有意思的事情写写吧。 公司给订了一个旅馆,我住进去,当然不花我的钱咯。然后累了,换上拖鞋,也是免费的。(拖鞋篮里面有张纸,免费擦鞋——)然后看旁边有烧水的,下面居然还有小冰箱,可乐啤酒一应俱全。哇——不愧是专业的。拿了罐可乐刚刚想开,发现旁边有张纸。《如果您用了小吧台中的饮料,请填写本单,费用会结算到您的房费中。》后面赫然是,可乐10块。 不知道是公司付费还是我付费,干脆放回去了。 后来刘凯知道这事情,说随便喝好了。一个人住宿是300的额度,我们三个才676,平均一人226。没问题,喝。后面又跟了句,回头让李胜昊从外面带一罐回来补上就得了。 我靠—— 不过后来发现可乐包装挺特殊,怕补不上。我当时也不渴了,没试试看。 回上海的时候,从对方公司出来,立刻叫车,然后往白云山机场跑。我坐前排右边,车窗开着的。我看风大就没拿相机出来照相。过一个立交桥的时候,发现桥那里有个雕像。两腿叉开,双手插腰,挺有气势的。我心说这年头了这里还有这种雕像,不容易。车开近点看看,好像是个活人哎,而且还是裸的——OGM——绝对是传说中的裸奔—— 啊,相机啊相机——来不及了—— 过去了—— 你看到了吗? 打电话给南方,又有新闻了。 别傻了,人家说不定已经看习惯了,还笑话我们没见过市面。 那怎么办? 你不想学的话就当不存在了。 嗯,都是幻觉,吓不倒我的。

Feb 7, 2007 - 2 minute read - Comments

内存泄露检测简说

我们首先从一段代码说起。 #define _CRTDBG_MAP_ALLOC #include #include class test { public: test () { lpBuffer = new char[0x1000]; }; \~test () { delete lpBuffer; }; void *operator new (size_t s) { return malloc (s); }; void operator delete (void *pvMem) { if (pvMem != NULL) free (pvMem); }; void *operator new[] (size_t s) { return malloc (s); }; void operator delete[] (void *pvMem) { if (pvMem != NULL) free (pvMem); }; char *lpBuffer; }; test & tt () { static test t; return t; } //test t; void process () { test tf; // _CrtDumpMemoryLeaks (); } int _tmain (int argc, _TCHAR * argv[]) { // test tf; test* tp=new test(); _CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE); _CrtSetReportFile (_CRT_WARN, _CRTDBG_FILE_STDERR); _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); process (); // printf("hello, world.

Feb 5, 2007 - 1 minute read - Comments

CPUID

近两天研究了下CPUID指令。虽然原本是准备作为加密技术的储备的,不过后来发现作为加密技术实在不可行,倒是平台识别有很大用途。 CPUID指令可以看做一个汇编中的函数,预先设定一个EAX的编号,就可以返回EAX,EBX,ECX,EDX四个数据。根据不同EAX,返回不同的数据。问题在于,对于EAX和返回的约定上,AMD和Intel是完全不同的。其中AMD根本不支持CPU编号特性。 我先给出我所用的函数: void getCpuID (PDWORD pData, DWORD ID) { __asm { push ebx push ecx push edx push esi mov eax, ID cpuid mov esi, pData mov [esi], eax mov [esi+4], ebx mov [esi+8], ecx mov [esi+12], edx pop esi pop ecx pop ebx pop edx } } 其中pData是一个足够大的数组,ID是入口编号。根据Intel和AMD的约定,0,1,80000001-80000003是共同的。0在EBX,EDX,ECX中返回了厂商标识,例如目前机器上就是AuthenticAMD。(注意,不是顺序存放的,按照我刚刚写的顺序)80000001-80000003在返回中顺序存放了CPU的标识,例如目前机器上是AMD Sempron™ Processor 2500+。1在EAX中返回了CPU的系列编号,EDX中返回了特性编号。以上都是标准的返回,可以看出在识别平台的时候很方便。 Intel的CPU在2中存放了配置参数,3中存放了序列编号。而AMD在这两者上都是0。由此大家就知道为什么无法用来作为加密技术了,难道这个程序只能在Intel芯片上跑吗?

Feb 2, 2007 - 1 minute read - Comments

继承类静态对象虚拟化

其实这个标题不准确,准确的说,应该是继承类拥有自己的基类静态对象。 我们知道,类中的静态对象本质上是全局变量,不过名字在类命名空间里面。如果类B有静态对象S,D继承了B(先按照public继承讨论,其他其实也一样)。那么在D里面访问S的时候,其实是访问的B命名空间里面的静态对象S。验证代码如下: class B { protected: static int S; }; int B::S = 0; class D:public B { public: void print () { printf ("%dn", S); }; }; class E:public B { public: static void rewrite () { S = 1; }; }; int _tmain (int argc, _TCHAR * argv[]){ D d; d.print (); E::rewrite (); d.print (); return 0; } 上例中可以看到,两个继承类,其实都是将父类的命名空间导入而已。假定我们要使得每类专有一个静态成员,例如我们要计算每个类的生成对象个数,怎么办呢? 如果不用继承,我们可以在每个类里面加一个静态成员。然后在构造函数中加1,析构中减1。但是如果我们想把这个功能放到基类中,事情就麻烦了。因为所有类从同一个基类派生,我们算出来的其实是所有从基类继承的类的总对象生成个数。 当然,我们可以用实现的方法来做。把所需要的功能抽离出来,放到一个单独的计数类中。然后构造的时候调用加1,析构的时候减1。听起来很蠢,那是因为例子容易的关系。比较复杂的时候,这样抽象相对简单的。计数类可以用于多个类,实现了代码重用。但是仍旧没有解决关键问题,怎么让继承类特化基类的静态对象?(虚拟化和特化的意思差不多,就是针对具体对象使用具体方法) 答案最后被我在More Effective C++中找到了,正确的方法不是寻找一个特化的方法,而是继承不同的基类,使用同一套代码。既然是不同基类,怎么具备同一套代码呢?想到了吧,模版。 template<T> class B { protected: static int S; }; class D:public B<D> { public: void print () { printf ("%dn", S); }; }; int B<D>::S = 0; class E:public B<E> { public: static void rewrite () { S = 1; }; }; int B<E>::S = 0; int _tmain (int argc, _TCHAR * argv[]) { D d; d.

Jan 30, 2007 - 1 minute read - Comments

轻轨意外延迟的处理过程

昨天坐轻轨的时候,在海伦路延迟了10分钟,宝山路延迟了4-5分钟,还啥广播都没有。一怒之下干脆打114查询号码,然后打到地铁投诉热线投诉去。当时没说清楚,只说三号线上好像有人跳车,然后答应尽快给出回访结果。 当天下午回访就过来了,仔细的问了延迟的车站和时间(幸好我平时早上的车为了赶点,时间都算过的,而且算的很准)。然后再三道歉,说是车门故障,下次会记得广播。 既然人家都诚心诚意的道歉了,而且单位也知道情况,不算迟到,那么这个事情就这样了吧。

Jan 29, 2007 - 1 minute read - Comments

惊魂记

大家知道贝壳的财务是通过自己写的程序进行跟踪合计的。以前是excel表单上面加VBA宏,后来移动到了Mysql数据库。因为数据存储量大,运行稳定,使用方便,所以贝壳一直很得意。 昨天贝壳发现自己的财务怎么也算不对,因为单位的工资发到了浦发的卡上,而程序里面是没有浦发的账户的。本质上是由于程序中使用硬编码导致程序对数据库存在非合理依赖(有点专业,听不懂就算了)。所以从理论上说,我需要修改表结构。 于是贝壳就先备份了表结构(悲惨啊,大家后来就知道了),然后修改了账户的表结构。然后贝壳发现财务表里面没有使用UNIQ限定,于是又对财务表修改了结构。但是无法通过,原因是因为现有数据中有的不符合UNIQ限定。于是贝壳又合并数据,做了半个小时多的操作,好算添加了UNIQ限定。这时候,贝壳送了口气。处于不可告人的怪癖,贝壳运行了自己写的核算程序,上面赫然写着,当前现金,-1034。 不用说,一定是合并数据的时候出现了错误,问题是错误在哪里呢?不知道,贝壳只有删除了UNIQ限定,然后恢复数据——shit,没备份。 开始的时候,贝壳只需要修改表结构,于是就只备份了表结构,数据还是上个月的备份。OMG,怎么办?怎么办?怎么办? 于是贝壳就开始了悲惨的修复经历。 首先我确定合并的数据都是在上个月备份以内的。就是说,这个月新添加的数据都是没有经过合并操作的。于是贝壳导出当前错误的数据,并且从中截取出这个月新的数据,这部分数据一定是正确的。然后和上个月的备份合并到一起,放到新的文件里面导入数据库。运行财务核算程序,OK,当前现金380.89。 贝壳又一次低估了上帝的决心,高高兴兴的删除了临时文件。然后导出新数据,准备关闭程序睡觉去。然而运气的是,贝壳在关闭前看了眼数据。啥?注释是乱码? 财务软件并不使用注释字段,那个是被贝壳用的,所以财务软件不会报错。可是注释乱糟糟,等于一半的功能被砍掉了。贝壳赶快想怎么解决。当前数据和备份都是错误的,上个月的备份还在,可是少一个月数据。就是说贝壳丢失了一个月的数据! 没办法,贝壳紧急安装修复软件。但是超级RP的是,贝壳上次Uninstall了一个东东还没reset(这是贝壳的一个坏习惯,Uninstall了以后不reset,等系统自然需要reset)。FinalData的Installer在Uninstall事件没有完成前不能运行。我靠~~~贝壳顿时怒了——上网找了半天,找到一个免安装绿色修复软件,Recover4all。运行,找到了上次导出的数据。 吃一堑长一智,贝壳先完美的备份了这个文件(包括扔到了U盘上一份)。然后将这个和上月的备份重新合并,切换编码,重新导入——蓝了—— 靠——上帝的决心是无止境的——比客户的变态还无止境——当导入超长的时候,居然诱发了XP64的溢出。由用户输入诱发溢出,我还真是伟大。 贝壳重启,重新合并,然后切分成两次,切换编码,分次导入。总算数据正常了。然后运行财务核算程序,也正常。去手工看表,也正常。不过贝壳的几个新修改和半小时的合并工作就作废了。 忙碌两个小时快,总算让数据库恢复到了以前的状态。还真是—— 不说啥了——