善意提醒

如果您打开本站很慢,布局排版混乱,并且看不到图片,那么可能是因为您还没有掌握用科学的方法上网的本领。

2007-04-30

过节前的最后一个工作日,心情不错

工作基本上做一个结了,压力开始小了起来。从昨天一直下雨下到今天上午的天空,在中午时分也终于放了晴。上午股市表现也还不错。于是,带着愉快的心情,把自己的工作环境好好整理了一下。

那台刚开始老是死机的电脑,在我把硬盘的所有接口好好地重插了一遍之后,变得比较听话了。不过网络还是时不时断掉,另外鼠标线总是不够长。今天索性把机箱放到了桌面上,然后把那根网线换成了自己从重庆带来的「嫡系」,故障一扫而光。看着换下来的烂货网线,我才知道自己做的网线是多么的优质。终于不用再害怕脚踢到机箱会死机,也可以自由地挥动着鼠标,感觉真爽。一不做二不休,再打开机箱把 HDD LED 不亮的问题也修好了。

希望也能够给自己后面的日子带来一份好的心情和运气。

2007-04-26

兴奋的母亲

晚上老母打电话来,难以抑制的兴奋。

原来,她几年前买的股票,买了 5 手,股价大约是 10 元。PT 之后,就没有去管它了。今天去一查,这几年下来,竟然配送了四千多股,股价也涨到了 40 元。当初纯属玩票性质,本金却只有 5000 元。这样算下来,单是这支股票居然赚到约 20 万。难怪她要高兴坏了。

我想,不是每个买股票的人都会遇到这样的事的。这个收益率也大大超过了正常值。我让她减仓 2/3,用作别的投资,冲抵一下风险。不可能期望再一次有这样的好运,就当作一个小故事记录一下吧。

2007-04-25

日记2007.04.24

Chapter One

貌似买不到车票,于是出差也就濒临取消了。对生活来说,也许会感觉更好些,但是工作上一点也不会轻松。远程调试和技术支持比起现场实施来说还是有更高的难度的。

Chapter Two

晚上下班之后,去淮海中路上转了转。本意是想去找一下陕西南路和常熟路中间的那个 BenchBody 专卖店,顺便去补一下周末没有逛的街。

在常熟路就下了地铁,却几乎走到了陕西南路的地铁站才找到 BenchBody 的店。货品似乎没有浦东的正大广场店的种类多,店面也要小上一些。看到有两款内裤有挂金属链子,有一款还是 T-Back 或 G-String 的丁字裤,现在很流行挂链子吗?不过今天只是踩点,没有买的打算,再多看看了。

Chapter Three

附近不远处看见了 Parkson,还有「巴黎春天」。原来在上海也有这些店。拐进 Parkson 看了一下,规模不是很大,价格还算正常,起码跟重庆和乌鲁木齐的比起来是如此。相比之下,乌鲁木齐那个 Parkson 倒是规模最大的。

正装部分就略过不逛了,休闲装的品牌倒是不少。又看见了 Bossini、Baleno、Giodano 这些熟悉的品牌,亲切不少。Lee 还是比较贵,AppleShow 的价格比厦门要稍低一些。内衣部分,基本都是国外品牌的高档货,三枪没有见到。看见了 Calvin Klein 的内衣,没有什么感觉,说明它目前还不属于我这个世界了。

顺便也看了一下手机,没有发现我感兴趣的 N 记 E50,怀疑可能已经下市了。五一节再去徐家汇转转,去年 10 月的产品,就算已经停产了,但下市也太快了点吧?N70~N73 倒是不少,不过价格比我预期的要高,暂时不考虑。

没有发现我想找的 777 指甲剪。上一个我就是在乌鲁木齐的 Parkson 里面淘到的。不过我也没有仔细去逛它,毕竟时间不早了。

Chapter Four

在 Parkson 楼下的麦当劳吃饭。

来来往往的美女很多,老外也很多。有两个就坐在我旁边,快速地交谈着。他们说的好像不是英语,可能是德语或拉丁文,要不就是他们说得太快,反正我基本上没有听到熟悉的单词。还有一个年纪稍大的,点了餐之后独自坐在角落。服务员送过去一盘整整十个汉堡,我眼睛都瞪大了。不过原来是点餐的服务员听错了,人家只要的一个。我旁边的两个老外也在跟他打招呼,这次说的是英语,我听懂了,什么肚子没那么大之类。出这种差错也实在有点不应该,再是老外也不至于点一杯可乐一包薯条却要吃十个汉堡吧?再说那个老外的身材也只是一般水准而已。

2007-04-21

2007.04.21 浙江桐庐游(二)

昨天晚上睡得很不好。房间隔音效果不佳,窗外的汽车、拖拉机声非常响。后来我才知道几乎所有临街一边的同事都没有睡好。好在早饭还算丰盛,每个人应该都吃饱了。

第二天的项目不多,主要是溶洞探险。每个人都领了头灯和头盔出发,一队人走在山路上,活象去煤矿上班的矿工。
上到几乎是山顶的地方,洞口出现在地面。原来是一个向下的溶洞,我还以为是水平方向的。沿着铁梯、木梯一路向下,有的地方还要拉着绳子。我的动作还算不错,起码我的力量/体重比算是比较高的,而且我的身材在过一些地方的时候比较有优势。在上次的素质拓展活动中,我可是当时我所在的队伍中仅有的完成了攀岩项目的两个人的其中之一。
一进一出,花了近两个小时的时间。上来之后,每个人几乎都跟花猫似的。洞里面到处有青苔,一混水,粘粘地像稀泥一样。还好我穿的是牛仔裤,不太怕脏。

最后一个项目是毕业墙,这个我也早就预料到了。不过这次的墙感觉好像比我上次的要高,于是第一个人上去也比较吃力一点。上了一个人之后就比较容易了,后面的人掌握住了要领,抓住手之后把腿一横摆,上面的人要不揽腿要不抓皮带,很容易就 OK 了。最后两个人比较困难一点,不过因为上面的人已经很多了,人多力量大,一咬牙还是都拎上去了。
毕业仪式上,开了一瓶香槟。摇了很久才摇开,塞子「砰」地一声直射天空,看不见了。每个人都倒了一小杯。当时已经十二点过,做了一个总结之后,就往回赶路了。

午餐和昨天几乎一致。我跑去和队长坐同一桌。他是跟酒店打过招呼了,要特地做素菜照顾,我也就可以沾沾光。不过他其实是吃斋的,我想还是有很多人不明白吃斋和吃素的区别,以至于有些素菜里面放了葱,让他很郁闷。中午之后,也有不少人知道我也吃素了,这样以后聚餐可以少些麻烦。
回去的车程感觉要长一些,太阳依然很大。不知道什么原因,总之快到上海的时候我开始有点晕车的感觉了。头开始疼,眼球也发胀,一转就痛。好歹总算是捱到了目的地,脚踏实地,总算是长出了一口气!

2007-04-20

2007.04.20 浙江桐庐游(一)

今明两天公司组织出游,浙江桐庐,半春游半素质拓展的性质。
说好 07:30 集合,结果 08:00 才到齐出发,早知道就多睡一会儿了。
在车上准备睡上一觉的,无奈「培训师」要玩「小游戏」,于是就没法睡了。好在刚上路,倒也不觉得一定要睡,主要是怕后面会晕车。
几个「小游戏」中,还是一个叫「数羊」的比较有意思,不过原理都差不多,都是利用手段转移注意力,将人的思维引入误区。我观察了几次就知道秘密了。有的人就比较惨,一直到下车都还被蒙在鼓里。


下榻的地方,是一个不咋样的「大酒店」,恐怕两星的标准都不到。草草整理了一下,开始吃饭。饭菜还算不错,起码比较合我的口味。吃过饭之后,外面太阳变得非常的大,我们就在这种情况下开拨去了训练基地。

在所谓的基地,有许多人在热火朝天地「受训」。一来我们先分了队,本队的队长是个信佛的同事,可能也比较喜欢玩网游,起队名的时候居然接受了我关于「亡灵」的提案。我都快晕倒了,他还真把我当「军师」了。
不过,因为我以前曾经经历过类似的素质拓展活动,所以对有些项目的确能够提供一些有用的经验,于是我也就没有客什么气。


晚饭就在基地吃,是烧烤。对于这个,我和队长都是比较落寞的人。还好因为有不限量供应的蛋炒饭,所以肚子还是填饱了。
同事们给我烤了两串豆干。不过因为进不了味,所以味道其实并不好。烧烤果然还是不太适合素菜。
吃过晚饭,又做「游戏」。其中一个是什么「蛤蟆几条腿」,有一次「腿」不够,我急中生智把板凳拉过来坐上,这样就多了四条「腿」出来。自从我发明这个办法后,大家就都用上了。

回去的时候,每两个人发一个头灯。明天不知道要干啥?探险?
酒店果然很烂,开了半天都不见热水,我擦了个身子就去睡了。据说后来有热水了,郁闷,反正也懒得再去洗了。

2007-04-17

牺牲的代价

很吃惊地得知还有押钞员把储户爆头这样的事件,看来的确是落伍于时代了。近来似乎这样的「不公」事件连接出现,充分凸现了社会矛盾。近者如上次提到的「重庆钉子户」事件,远者有多如牛毛的上访案件。这不是还在打造「和谐社会」么?怎么我们的社会还这么不堪,这么万恶么?

媒体的力量,在此得到了彰显。同时彰显的,还有它的特点。媒体就是一个放大镜。小的问题,媒体一报道一扩散,就是大问题。不为人知的事件,一经宣传,也就天底下莫不沸沸扬扬了。虽然我们周围的社会还有诸多不如意,不过倒也不似听起来那么恐怖,否则可真是要出乱世了。

重庆的「钉子户」事件,我不幸猜中了结果。——当局不会让他继续「钉」下去的。最可能的结果,是让这个「钉子户」得到一些实惠,而作为交换,他们要表现出向「公众利益」的妥协和让步,也就是说房子还是得拆。
政府的思路很明确也很实际:无论如何,稳定第一。我有什么对不住群众的地方,我以后慢慢改,但眼下不能让矛盾激化。双方都要顺利下得来台,必要时也可以牺牲一点既得利益「安抚」一下当事人。
我的表述有些露骨,不过对于现任政府的执政能力,我还是略微有些褒意的。不管怎样,能够有这样富有弹性的处理事情的手腕,虽然脱不了一些本国传统烙印,但终究是值得夸奖的进步。

但是,房子拆了可以巨款补助,人死却不能复生。这次的事件,比「钉子户」事件更不好处理。从政府角度考虑,弄出人命肯定是下下策,领导们恐怕恨死那个乱开枪的白痴了。
当然,不管这件事最后处理成什么样的结果,有一个结果是一定可以预见的。以后关于押钞员、枪械弹药的管理一定会更加严格,银行、金融中心、运钞车等的规定一定会更细致更落到实处。储户也许不会被再爆头。就如同钉子户事件之后政府一定会对拆迁补偿安置更加注意一样。

原因很简单,现在社会既没有革命理想支撑,又没有阶级斗争可以进行,改革开放也这么久了,与国际上也没有了太多的信息门槛,要想维持和平稳定和发展,就一定要靠柔韧的执政能力才行。不客气地说,现在的中国,虽然还是农业、工业、信息化社会三代一体,但是主要掌握话语权的人群已经现代化、国际化了。要治理这样的国家,不能再像以前那样关起门来瞎折腾,连「摸着石头过河」都快不被大家接受了。社会是一个复杂的有机体,由数不清的制衡关系维持着动态平衡,虽然烦心,但必须小心地去仔细管理。已经了解到这一点的现任政府,还能再腆着脸去走回头路吗?

这,或许就是牺牲的代价。如果说还有可喜之处,那就是:相比五十年前,牺牲终于能够换回来一点能够积累的进步了。
可悲之处则是,我们的改进为什么就不能走在牺牲前面呢?难道在荆棘之中开辟的道路,就一定要用鲜血和尸体铺就而成?

工资到帐,写博留念

中午休息的时候掏出 USBKey 查了一下活期账户余额,发现工资已经到帐了,特此写博留念。

既然异地卡到帐速度也不错,也许就没有必要办上海本地卡了。等我下了班问下 95555 的 MM 关于异地存款的手续费问题再说。

2007-04-16

OTL建立连接时可能会遇到的一个bug

最近因为工作原因,从 OCICPP 改为用 OTL 做 Oracle 开发。初时挺诧异的,怎么只有 .h 没有 .cpp?看过才知道原来一个头文件就全做完了。它是对 OCI 的一个封装,可以用 stream 的方式去操作数据库。用起来还是比较简便,但是感觉封装得多了点。虽然 OCI 那些函数也挺复杂的,但至少觉得一切都在自己掌握之中。OTL 这么一封装了之后,有一些实现细节就不得而知了,这就导致了今天发现的一个 bug。

根据 OTL 关于 otl_connect 的说明,其构造函数之一是可以直接用来连接数据库的。虽然正儿八经做这个事情的是 rlogon(db_string),但是对构造函数 otl_connect(connect_str, ...) 的说明是其等于 otl_connect(void) 再加上一个 rlogon(connect_str)。所以,一般就这样写了:

otl_connect* pdb = new otl_connect("...");

然后把 pdb 存在自己的数据库连接池中。如果连接失败,那么会抛出一个 otl_exception 异常。

可是,今天却遇到意外。连接字符串中,tnsname 写对了,但用户名 / 密码没对。于是测试的时候发现,多次连接之后,数据库那边内存爆掉了,ORACLE.EXE 的线程数也多到疯掉。别的客户端全连接不上了,报 ORA-00020 错误。
process 数量多,这倒也在情理之中。可是看了看 session,发现会话其实很少。猜测是什么东西没有释放掉,不是 connect 就是 cursor。查了一下代码,发现没有什么大问题,connect 都是连接池管理,不会无限多下去的。otl_stream 也都是在栈中声明,花括号之后就自动析构了,cursor 也不应该是问题。郁闷中,发现正常的连接反而不会有泄漏发生,会泄漏的都是连接错误的时候。但是连 tnsname 都不对反而就不会了,估计是因为 OCI 那边根本就无法建立一个连接,也就耗不了资源。这下定位到了,就是这个创建连接的代码上有问题。

这段创建连接的代码是这样写的。注意其中捕捉异常的部分:

otl_connect* pdb = NULL;
try
{
  pdb = new otl_connect("...");
}
catch(otl_exception& e)
{
  ……
  if (NULL != pdb)
    delete pdb;
  pdb = NULL;
}

可以看到,如果连接不成功时没有生成对象,那么应该返回空指针,这样 delete 指令也不会发生。如果有对象生成,那么在异常处理代码中应该已经把这个对象给销毁了,而对象占用的资源应该也已经释放了。但事实就是不同,由于 OTL 在这个构造函数中封装了实现细节,而显然这个实现并不完美,于是有了泄漏。

采用如下的代码,便不存在这个问题了:

otl_connect* pdb = NULL;
try
{
  pdb = new otl_connect();
  pdb->rlogon("...");
}
catch(otl_exception& e)
{
  ……
  if (NULL != pdb)
    delete pdb;
  pdb = NULL;
}

根据 OTL 的说明,这两种建立连接的方法应该没有区别。但事实上 OTL 提供的范例代码中都是采用后一种方法。

追进 OTL 的头文件中去看,应该可以弄明白原委。不过为了完成任务,没有那么多时间了,这个任务只好留到下次再说。大致估计了一下,应该是因为在 new otl_connect(connect_str) 的时候就抛了异常,于是代码跳转到了 catch 处,pdb 根本没得到对象指针的赋值,这样新生成的对象就丢了。建议用 OTL 的各位,在栈中是无所谓啦,但如果要在堆中初始化一个连接,千万不要图省事想用构造函数直接一步到位哦!

后记:
其实,如果构造函数中抛了异常,而对象中存在着自己管理的资源,那么很可能会发生资源泄漏,这对于 C++ 程序员而言几乎可以作为一条准则了。在我后来看到《Effective C++》之后,就知道本文属于其中案例之一。我认为,OTL 就不应该支持在构造函数中进行连接这种方式。你给程序员两条路可走,那每条路都肯定会有人走。如果其中一条有坑,那这条路就没必要对外开放了。

看到工资的影子了

15 日发工资,果然今日就拿来了工资单让签收。刚拿到手,发现总额上小数点点错了。看着那五位数的金额,有些发晕……。原来我还担心这工资是 15 日结算上个月月底前的工资,那样的话我这次没几个钱的,要还信用卡势必得赎回基金了。不过看到工资单上写着工时有 15 个工作日,于是放心了。如果这笔钱能够及时到帐,加上现有的活期存款,下个月应该差不多也能撑过去了。上海反正能刷卡的地方多,五一节花差尽量用信用卡了。期望大概第四个月可以把赤字填起来。

当时面试的时候,直接问我想拿到手多少钱。今天看到工资单才明白,上面的计算基数就一个实得金额。也就是说,什么费、税都先扣掉了,不在这个里面。这样也挺好,省事,反正我个人年收入还不到 12 万,不需要自己去申报个税。

2007-04-14

三天居然写了上万行代码

昨天忙完工作之后,大出了一口气。CheckIn 的时候数了数 project 下面的文件个数,92 个,一半 .h 一半 .cpp,除去某些系统生成的文件,也就是说,我自己写了 40 个对象。

感觉写了不少代码,但不知道到底写了多少。拿源码统计器算了一下,居然有一万一千多行,感觉比较吓人。十万行代码的系统已经可以算得上中型系统了,我三天就码了这么多。当然,不靠 Ctrl-C/V 肯定是完不成的。
一度有些怀疑这么多代码是不是设计有些糟糕。不过再想想,确实各个对象之间的代码已经很难再复用了。40 个对象有一半以上都是继承出来的多态对象,这还省了不少事,否则代码量还要再翻一番。虽然已经抽象了许多共性出来,但不同的信息还是有一些不同的数据结构,再加上对关联依赖的处理,光 SQL 都够写好久。

有些好奇,去网上查了一下别人的编码速度。结果有人说一天 1000 行都被人骂吹牛。心里感觉挺复杂,能做到别人很少做到的事情,固然有些得意,然而编码这种事情也并不是那么值得吹嘘的。好在设计也是我做的,还不至于沦落到 IT 基层民工的地步。

直到今天做完了测试,才开始有点得意。这样的代码量,Bug 却只有这么点,起码说明我编码能力并没有退化。测试结果与需求的对应也让我很满意,这说明设计上也做得不错,至少是起到了应有的效果。这个苦力当得也不是没有价值。