2007-04-21

2007.04.21 浙江桐庐游(二)

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

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

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

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

2007-04-20

2007.04.20 浙江桐庐游(一)

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

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

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

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

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

2007-04-17

牺牲的代价

  很吃惊地得知还有押钞员把储户爆头这样的事件,看来的确是落伍于时代了。近来似乎这样的“不公”事件连接出现,充分凸现了社会矛盾。近者如上次提到的“重庆钉子户”事件,远者有多如牛毛的上访案件。这不是还在打造“和谐社会”么?怎么我们的社会还这么不堪,这么万恶么?
  媒体的力量,在此得到了彰显。同时彰显的,还有它的特点。媒体就是一个放大镜。小的问题,媒体一报道一扩散,就是大问题。不为人知的事件,一经宣传,也就天底下莫不沸沸扬扬了。虽然我们周围的社会还有诸多不如意,不过倒也不似听起来那么恐怖,否则可真是要出乱世了。
  重庆钉子户的事件,我不幸猜中了结果。——当局不会让钉子户继续“钉”下去,最可能的结果是该人家得到一些实惠,作为交换,他们要表现出向“公众利益”的妥协和让步,房子还是得拆。政府的思路很明确也很实际:无论如何,稳定第一,我有什么对不住群众的地方,我后面再改,但不能让矛盾激化,双方都要顺利下台,必要时可以牺牲一点既得利益“安抚”一下当事人。我的表述有些露骨,不过对于现任政府的执政能力,我还是有些褒意的。不管怎样,能够有这样富有弹性的处理事情的手腕,虽然脱不了本国传统的一些烙印,但终究是相当不错的进步。
  但是,房子拆了可以巨款补助,人死却不能复生。这次的事件,比钉子户更不好处理。从这个角度考虑,弄出人命就是下下下策,领导们恐怕恨死那个乱开枪的白痴了。当然,不管这件事最后处理成什么样的结果,有一个结果是一定可以预见的。以后关于押钞员、枪械弹药的管理一定会更加严格,银行、金融中心、运钞车等的规定一定会更细致更落到实处,储户也应该不会被再爆头。就如同钉子户事件之后政府一定会对拆迁补偿安置更加注意一样。
  原因很简单,现在社会既没有革命理想支撑,又没有阶级斗争可以进行,改革开放也这么久了,与国际上也没有了太多的信息门槛,要想维持和平稳定和发展,就一定要靠柔韧的执政能力才行。不客气地说,现在的中国,虽然还是农业、工业、信息化社会三代一体,但是主要掌握话语权的人群已经现代化、国际化了。治理这样的国家,不能再像以前那样关起门来瞎折腾,连“摸着石头过河”都不允许了。社会是一个复杂的有机体,由数不清的制衡关系维持着动态平衡,必须小心且烦心地仔细去管理。已经了解到这一点的现任政府,是不会再去走回头路的,他们也回不去了。
  这,就是牺牲的代价。可喜之处,是相比五十年前,牺牲终于能够换回来一点能够积累的进步了。可悲之处则是,我们的改进为什么就不能走在牺牲前面呢?难道在荆棘之中开辟的道路,就一定要用尸体铺成?

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个对象有一半以上都是继承出来的多态对象,这还省了不少事,否则代码量还要再翻一番。其实相当于一个小型的MIS系统的服务端了,虽然已经抽象了许多共性出来,但不同的信息还是有一些不同的数据结构,再加上对关联依赖的处理,光SQL都够写好久。
  有些好奇,去网上查了一下别人的编码速度。结果有人说一天1000行都被人骂吹牛。心里感觉挺复杂,能做到别人很少做到的事情,固然有些得意,然而编码这种事情也并不是那么值得吹嘘的。好在设计也是我做的,还不至于沦落到IT基层民工的地步。
  直到今天做完了测试,才开始有点得意。这样的代码量,bug却只有这么点,起码说明我编码能力并没有退化。测试结果与需求的对应也让我很满意,这说明设计上也做得不错,至少是起到了应有的效果。这个苦力当得也不是没有价值。

2007-04-02

骗术杂感

  周末下雨呆在家里,阵雨过去的时间,听得有人在敲邻居家的门。敲两声,我的房东出来了,开始盘问对方。听起来是两个年纪不大的女性声音,说是做什么“市场调查”。我的房东一顿训斥:“现在治安这么不好,还做什么市场调查。”
  是啊,现在这年头有点不安生,的确是要各自注意一点。今天就说说骗术吧。

  一开始,骗子骗人是利用人的贪欲。人们都缺钱,很多人也爱贪小便宜。君子也爱财嘛,至于取之是否有道,在很多人看来,占点便宜并不算无道之举。就这样,许多骗局诞生了,许多骗子得逞了。由此得出结论,要想不被骗,第一是不要起贪念!
  后来,人们被骗得多了,慢慢地有了警惕。骗子们的花招就不得不翻新了。一是利用高科技或新事物骗见识不多的人,二则是攻心。利用人们黑白对立,好坏二分的习惯性思维,针对群众的警惕心理进行瓦解,得逞之后就立即扩大战果,简直和诺曼底登陆一样经典。对于这种骗子,只好在意识上多多加强了。
  再后来,世风日下,人人自危,都知道了要保护自己。本来这是好事,然而,这个也被骗子利用了。过于在意保护自己,行为便有了模式,容易预测,于是就给了骗子发挥的空间。道高一尺,魔高一丈。不得不说,现在的骗子越来越聪明了。我们在想方设法赚钱、供房、养家、糊口的时候,他们就在绞尽脑汁地发明新的骗术,想着怎么骗钱骗色。任何一个行当,只要足够投入,假以时日,都会做得相当专业。如此一来,不得不有些胆寒。

  这些天,我至少遇到两起在路上拦住我找我要路费或餐费的事件了。在这方面,我倒是练就了一个本领。只要是我一个人的时候,无论谁跟我说什么话,只要不是天灾人祸之类,我的第一反应是无反应。头也不扭一下,或者很茫然地看对方一眼,但脚下总是自顾自地走路。大概起码要三秒之后,脑袋中有了合适的应对方案之后,身体才会作出反应,经常搞得骗子很郁闷。建议经常单身走路的朋友,也练练这一招。
  银行卡密码,信用卡号码特别是验证码,这些个东西在我看来是应该绝对保密的。至于地址、身份证号码、姓名、出生年月,乃至银行卡帐号,这些恐怕不那么容易保密,我以为即使透露给别人应该麻烦也不大,但应该有这些信息被不良人士利用时的心理准备和应对方案。比如我随时保留两个手机备联系,就是防止有人利用骚扰我手机然后伪装医院去骗我家人的骗局发生。身份证不管丢过没有,先在网上报个失,这样以后就算号码被人盗用,也比较容易应付。不要把所有的钱都放在一张银行卡上,也不要把所有的银行卡都带在身上,等等。无论如何,事先有所准备的话,至少风险会降低。
  手机不要借给别人打,如果不得不打,让对方报号码,我来拨我来讲话。停下来听陌生人说话,要在人多的地方,至少要在人来往比较多的地方。如果陌生人向我求助,那么我会想他为什么找我。如果是因为四周没有别的人可以求助了,那我会把他带去联防或治安亭,让应该管这些事的人去负责他。我想如果对方是真的需要帮助,应该不会拒绝我这样子的处理的。如果对方拒绝,或表现出不满,那么就是有问题。而如果四周都是人,我只是匆匆行人中的一个,他不去找街道的大妈,不去找警察叔叔,甚至不去找路边百货店的人求助,却偏偏来找我,除非是问路、问时间一类的口头可以处理的小事情,其他一律是可疑的举动。
  一个原则就是,站在对方的立场上考虑一下。无论是要帮助人还是保护自己,都应该换位思考。如果对方是一个真正需要帮助的人,那么他首先要做的就是取得对方的信任,在现在这个社会中,就意味着要首先摆脱骗子的嫌疑。所以一些会让人生疑的事情他是绝对不会做的,为了获得帮助,他会非常小心,甚至牺牲一部分自己的利益以换取对方的信任。当然,有的骗子也会这么做。但不同的是,真正的求助者这种态度会从一而终,而骗子不会,他们达到瓦解你警惕心的目的之后,就会现出原形。有的骗局,如果受害者站在骗子的角度想一下,便会发现他的做法实在是荒唐得可笑。不要一味地从自己的立场出发看问题,要知道,骗子想方设法要做到的,就是迷惑你,让你以为自己看到的听到的是可信的。但,如果从另一个角度,对方或者旁观者的角度来看,也许就很容易看出问题所在,这也是“当局者迷,旁观者清”的含义。

  真不想当什么“当局者”。

2007-04-01

邹寿飞其人

  邹寿飞,何许人也?

  在Google上搜这个人名,出来的链接大多指向一个特定的内容,一篇名为《我曾是一名丑陋的中国人》的文章。作者就是“广东中山邹寿飞”。这是一篇篇幅不小的“主旋律”的文章,“深刻反省”中国人的种种劣行。不过,关于这篇文章并不是我在这里要着重关心的,这种文章扫一下标题就知道大意了。我感兴趣的,是Google出来的一个来自www.miibeian.gov.cn的页面。
  呵呵,www.miibeian.gov.cn是什么网站,我想用过虚拟主机的朋友到现在应该都不会陌生了,看域名也能看出点端倪。我做了链接,还不知道的朋友可以点进去看。百度搜不出来这个页面,而我认为至少这个页面不属于应该被封禁之列,所以百度比Google要差,这应该是不争的事实!
  好了,言归正传,Google的搜索结果中,有这样的字样:“……邹寿飞. 74977.com. 粤ICP备05127128号……”。一看这个域名,就知道不是什么好东东。访问一看,原来是一个一夜情俱乐部的网站。具体地说就是皮条客网站,和色情网站差不多的性质。但是因为网页上没有违禁内容,所以政府的扫描器也抓它不到。而会员注册方法的页面中,则明明白白地写明了“邹寿飞”的汇款地址等等信息,明白无误是同一个人。亏这个“邹寿飞”在文章中表现得良知满满,原来实际上只是一个皮条客,甚至可能只是个“志愿”皮条客。

  奇妙的Internet,奇妙的Google。以后我还会找点别的有意思的情况来谈谈。