休息的日子

周一、周二休息了两天,彻底的放松,没有接触一秒钟的电脑。难得乐乐的配合,居然没有提出看加菲猫和麦兜的要求。

心情很愉悦(虽然乐乐有时很烦人:-(),小区也与往日不同,路边少了很多的汽车,发觉小区也漂亮了许多。空气似乎也清新些。天气也不错,尤其是周二的太阳,真让人觉得暖洋洋和懒洋洋。

每天都很充实,可以说没有空闲的时候,当然重心都是乐乐。早上和下午都要陪她出去溜达,一逛就是2小时,所以说时间真的过得很快。

中午的时候都休息一下,睡睡午觉,翻着《我们仨》,再想想我们仨,觉得平淡的日子也很舒服。书中的些许味道也许做了父母更能体会。LP经常会和我说到死的时候希望她能比我先,并不觉得,但看杨绛先生说着“我一个人思念我们仨”,心里觉得有些微微地酸。不过更多的时候还是觉得温馨的乐趣,看着钱老先生和女儿的玩耍,也会想想我们的乐乐,想着她快乐的长大。

最近工作中的几个问题

整理一下最近在工作中碰到的几个问题。

1. 在JRULES中设计Decision Table,并保存到Oracle数据库中,超出了字段大小(4K)的限制。雷雷发现的。

JRules将决策表的内容保存在BLOB字段中,绝对不止4000字节的。咨询了ILOG hotline,答复是:

There is a limitation with the ORACLE thin driver that prevents the insertion of a LOB, with a size greater than 4K, into the database. The limitation is well known by ORACLE and exists in Oracle8i, Oracle 9i, and Oracle10g.

A work around is to use an OCI driver or another implementation of the thin driver that does not insist on this strict size limit.
原来如此,将Oracle Driver的连接方式从thin更改为OCI的方式即可。


2. 这是Tony最近做的Oracle的分析,shared_pool过大会对数据库性能造成不利影响。分析了SQL语句之后,发现有些SQL的HARD_PARSE比例很高,而HARD_PARSE需要大量的shared pool 和CPU时间。Hard parse的造成和SQL的写法以及分区表的索引相关。

对于书写SQL来说,尤其在循环时,有几种方式:

1)

for ( int i = 0; i < MAXNUM; i++) {
strSql = "select from bigtable where id=" + string(i);
otl_stream os( 1, strSql.c_str(), dbConnect);
}

这种方式书写最简单,但问题最大。对于数据库来说,每次的sql都不同,虽然差别的只是一个i变量的值,也是hard parse的罪魁祸首。

2)
for ( int i = 0; i < MAXNUM; i++) {
strSql = "select from bigtable where id=:f1<int>"
otl_stream os( 1, strSql.c_str(), dbConnect);
os << i;
}

在sql中使用了伪变量来替换,相同的sql语句,数据库在它的buffer中会保存其执行计划,保证再次利用,但这还要取决于buffer和运行的上下文情况。

3)
strSql = "select * from bigtable where id=:f1<int>"
otl_stream os( 1, strSql.c_str(), dbConnect);
for ( int i = 0; i < MAXNUM; i++) {
os << i;
}

将数据库的parse提到循环外,保证只parse一次,效率是最高的。

对于使用OTL来说,在第二种方式的时候还可以加上编译选项OTL_STREAM_POOLING_ON,由OTL提供pooling的技术手段,测试的情况看效率和第三种方式接近。

我想无论什么数据库或变成语言都应该一样的,你可以对sql先做prepare,之后再execute。


3. 另一个项目组遇到的问题:3DES加密从HPUX到redhat上的移植,一摸一样的代码从HP拿到redhat上重新编译之后,居然发现生成的密文不再相同了。

问题的解决倒很简单,原先的代码已经考虑了平台的移植,只要加编译选项即可。我看了一下代码,里面有个结构是这样的:

#ifdef _Windows
struct des_byte
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
};
#else
struct des_byte
{
unsigned char bit7:1;
unsigned char bit6:1;
unsigned char bit5:1;
unsigned char bit4:1;
unsigned char bit3:1;
unsigned char bit2:1;
unsigned char bit1:1;
unsigned char bit0:1;
};
#endif // _Windows

写了段代码测试了一下,在PC平台上1个字节的高位到低位按正常顺序,而在HP的平台上1个字节的高位到地位的排列刚好相反。测试代码如下:

#include <stdio.h>

struct des_byte
{
unsigned char bit7:1;
unsigned char bit6:1;
unsigned char bit5:1;
unsigned char bit4:1;
unsigned char bit3:1;
unsigned char bit2:1;
unsigned char bit1:1;
unsigned char bit0:1;
};

union hbyte
{
struct des_byte ibyte;
unsigned char abyte;
};

int main()
{
union hbyte h;

h.abyte = ‘a’;
printf("%2xn",h.abyte);
unsigned char a[8] = {’0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’};
if ( h.ibyte.bit0 | 0)
a[0] = ‘1’;
if ( h.ibyte.bit1 | 0)
a[1] = ‘1’;
if ( h.ibyte.bit2 | 0)
a[2] = ‘1’;
if ( h.ibyte.bit3 | 0)
a[3] = ‘1’;
if ( h.ibyte.bit4 | 0)
a[4] = ‘1’;
if ( h.ibyte.bit5 | 0)
a[5] = ‘1’;
if ( h.ibyte.bit6 | 0)
a[6] = ‘1’;
if ( h.ibyte.bit7 | 0)
a[7] = ‘1’;
int i;
for ( i = 0; i < 8; i++)
printf("%c", a[i]);
printf("n");

for ( i = 0; i < 8; i++)
{
if ( h.abyte & (1LL << i))
printf("%c", ‘1’);
else
printf("%c", ‘0’);
}
printf("n");

return 0;
}

HP上输出的结果:

%testunion
61
10000110
10000110

SCO上输出的结果:

# ./testunion
61
01100001
10000110

从结果来看,实际上正常的位运算在不同平台上也是一致的。只是这段代码那个结构使用了点小技巧。


P.S. 我自己项目中的3DES算法问题在java上的移植还没搞定呢。

OCW v0.1

In recenty days I wrote a initial version of OCW. It can work now, although it’s raw.

How to start?

1. Install ruby

2. Get an account from openomy

3. Get the source of OCW and openomy-ruby

4. run OCW.rb and login, you have 3 methods to login

  • write your own ocw.yml file, which include:

appkey: 090f9b3d822a3b53e7a71bd2da87c161
privkey: 65692928

#unconfirmedtoken:

if u provied unconfirmedtoken in yml, it will login automatically without any prompts while login.

  • login -u. You can type your unconfirmedtoken after the prompt, which can let u change account easily.

  • login. If no unconfirmedtoken is specifed, you will get a url, and then copy it to a explorer to authorize it. A truely non-web app .

After logined, u can ls, tag, mktag, rmtag, get, put and so on, treat openomy as a local file system.

A known bug: while tag a file with OCW, u’ll get “Openomy API Error: 2 - Permissions not valid.” I’d mail to Maurice and Ian. I think it will be resolved soon.

Source code can be gotten here. Yes, it’s also stored in openomy (I have no other spaces ), and fetched by rss.

It’s my first ruby program. All suggestions are welcome.

Updated:

The bug is known. It’s caused by Tags::AddFileToTag, ‘“fileID” => fileId’ is neglected which passing the parameters into get_request.

睡觉的故事

1. 以前就说过要“解放外婆”,也有一个多月了。坚持的还不错。

晚上7点过乐乐就上床,看“红果果和绿泡泡”,到看完“动漫世界”,这时候她的注意力有些分散,外婆有机会逃离她的视线。

乐乐会问:“外婆?外婆?”

答:“外婆去紫林公寓了。”

“喔,外婆去紫林公寓了,去姨娘那里了。明天早上再来看囡囡了。”乐乐嘟嘟哝哝的,她会乖乖地,但一副可怜的样子。

白天的时候,她就对外婆说,“外婆,我想你了。外婆去紫林公寓,去姨娘那里,我想外婆了。”

欺骗真的让人很心痛。

而且现在乐乐一点点长大,也越来越懂了。有时晚上外婆一不在,她就时刻叫不停,“外婆,外婆。”一刻也不让外婆在眼前消失。

谁有更好的方法吗?


2. 看完动漫世界,都是八点半了,这时候乐乐会下命令:

“电视关掉。”

“睡觉了。”

好,关掉电视,躺下来。可千万别以为她这就睡了,这只不过是序曲。到真正的睡觉时间还不定呢?

先要玩一阵,也许是讲故事,看动物大本营,也许是去动物园,看海狮表演

等到快进入状态的时候,然后和她商量:“睡大床还是小床?”

“大床”“小床”,这就要看她的高兴了。确定了目标后,接下来就正式进入睡眠的准备了。


3. 当然这时候我们需要换盏灯,柔和一点的。对了,别忘了最关键的。知道是什么吗?

“尿布”

哈哈,并不是乐乐晚上还要包着尿布睡。是她要拿着尿布,那可是她的小宝贝,就和狗仔、娃娃一样。

很小就养成的习惯了,没有尿布乐乐就不安分,转来转去,嘴巴还要嘀咕“尿布,尿布”

这时得赶紧把尿布递给她,还得是方方正正叠好的。乐乐的眼睛已经闭上了,小手接过来。一只手抓住边,一只手用掌心轻轻地摸娑着叠好的角。

乐乐安心的睡了。


4. 当然晚上的节目还是很丰富,小家伙睡的就很不老实。自己一个人睡着,很少肯盖被子。你给她盖好了,她一会儿“腾”的就给你踢掉了。或者小孩子的脚非常之柔软,会轻松地从被窝里经过脖子绕出到外面。象练体操的。所以得经常看看她的被子盖的怎样了。

尿布是很早就不用了(好像我们一直都用的很少),白条她自己会说的,晚上呢?就要注意了。如果老是睡着不安稳,时间长了很可能是有小便了,就记得要给她把把尿了。


5. 人世间最痛苦的事情知道是什么吗?就是睡意正浓的时候,在大冬天从暖暖的被窝里爬出来了。而且还不是一回。

乐乐一直不太肯吃东西,吃的少,包括奶粉。现在忽然晚上开始要吃奶粉了,睡前吃一回,半夜吃一回,2、3点再吃一回,6点再吃一回,有一回居然难得的一晚上吃了800的奶粉,可是从未有过的记录。当然更多的时候,她都是要吃奶粉,但也不肯吃多,一回120就足已。


P.S.

乐乐现有又有新的叫法了,爸爸是老爸,妈妈是老妈,外婆呢?老外婆。


我的乖女儿,什么时候才放了你老爸、老妈还有老外婆啊?

疯狂shopping



疯狂shopping,不是说我。

昨天听到最多的字眼就是“银泰”、“满400送300”、“你去了吗”。银泰7周年,杭城各大商场纷纷挥起“送”、“减”的大旗啊!把人民群众的心都弄的痒痒的。

我倒是也想去,不过想想那人那山,就吓怕了。

看看语录吧:

“不是堵在银泰,就是堵在去银泰的路上”

“恐怖!疯狂!”

看看照片吧!准备尚如此,其他就自己想象了。






今天凌晨1时30分,银泰商场内已是一片忙碌景象。胡元勇 摄


有同事去了,无所获,原因,货已清。人多无法试。等,开票等,付钱等。有同事电话连线,远程指挥,狂杀。
LP说,明年我们也要早做准备,先探好路,开好票,只等付钱,拿货。不过估计连提前开票也不行了。
在此先挖个坑,记得明年的银泰店庆日,哈哈。