Monday, December 22, 2008

Baby Smallka Happy Birthday

昨天又生日了,谢谢小鱼的蛋糕,还陪我去吃寿司~~

顺便做个总结吧。

7月进公司,培训想走马灯一样,大多都没记住。要说印象深的就是拓展训练最后那个爬墙还有番禺水上乐园。

9月加入蚂蚁工作室,发现除了小xinxin和我,大家都很能吃辣。程序员这边大家的共同点挺多的,比如宅啦。聊聊技术也比较有意思,和他们相比,感觉我学的太浅了。老大很喜欢看书,China-pub,蓝泉都是大把大把的买,有时还每人送几本。

11月份开始慢慢参与了一些项目相关的工作,按老大的话说就是看书读代码的好日子快过完了,等着被他压榨吧~~

上周算是顺利转正了,感谢从找工以来到现在给过我关心和帮助的所有朋友!

不管是TC还是现在的公司,大多数时候写代码都是很枯燥的体力活,细心和耐心都是不可少的(不知道Google是什么样的,Savior记得告诉我哦)。而剩下那一小部分又往往是你想破头皮也写不出来的。因此总结两点:健康是本钱,有体力才能干活(去健身房不到5次的人);业余多充电,活到老学到老。

Tuesday, October 14, 2008

Diff UNIX Windows, Part 2

平台的差异不仅表现在网络方面:

1)UNIX下create函数创建新文件通常用644作mode。而Windows没有group和other的概念,因此得用600。

2)中的isalpha、isprint、isprint等函数。
以isalpha为例,该函数可以判断给定的字符是否属于alphabet character。如果传给isalpha函数小于-1的char类型实参,程序执行时将出错。这是由isalpha函数中的Assert语句引发的:_ASSERTE((unsigned)(c + 1) <= 256); 该语句的作为用是保证参数的取值范围是0~255。

When used with a debug CRT library, isalpha will display a CRT assert if passed a parameter that is not EOF or in the range of 0 through 0xFF. When used with a release CRT library, isalpha will use the parameter as an index into an array, with undefined results if the parameter is not EOF or in the range of 0 through 0xFF.

------ MSDN


分析可知,出错的原因与两次类型转换有关:

isalpha函数的形参类型是int,而实参是char类型,因此c将首先被向上转型为int,即integral promotion。不同编译器对转型的实现可能不同,即有的将char看作有符号数,有的则看作无符号数。VC编译器属于前者,因此当传入的char类 型实参小于-1时,相应c+1的值小于0。

在Assert语句中,c+1被强制转换为无符号数,由于c+1是负数,因此转型后的值必大于256(负数的符号位为1)。

解决办法是在调用isalpha函数前先将char强制转型为unsigned char。推荐阅读《C Traps and Pitfalls》相关章节。

3)snprintf函数中对NULL结束符的处理。
int _snprintf( char *buffer, size_t count, const char *format [, argument] ... );

If len = count, then len characters are stored in buffer, no null-terminator is appended, and len is returned.If len > count, then count characters are stored in buffer, no null-terminator is appended, and a negative value is returned.

------ MSDN


int snprintf ( char *str, size_t n, const char *format, ... );

It is similar to sprintf(3), except that n specifies the maximum number of characters to produce. The trailing null character i counted towards this limit, so you should allocate at least n characters for the string str.

------ man snprintf

Friday, September 26, 2008

Diff UNIX Windows, Part 1

前几天尝试着移植CTorrent-dnh到Windows上,主要是想了解一下平台的差异性以及BT的基本原理。后来发现改动量比预计的大,就放弃了。其中还是有不少收获,以后有机会一定要多读代码。

CTorrent
是C++实现的bt客户端,可以在各种UNIX系统上跑。2004年就停止更新了。而CTorrent-dnh作为加强版,修正了一些BUG并且增加了功能。原版结构比较简单,比较适合结合BT协议来阅读。

Windows 的API经常换,光是网络这块就已经有好几套了。而UNIX下最早的select/poll模式却一直用到了现在。虽然epoll,kqueue这些有更 好的性能,但是对于简单的BT客户端,select就够用了,至少CTorrent是这样的。Windows下也支持select模式,但是不遵守规则似 乎也是MS的惯例。下面收集了一些例证:

1)UNIX下SOCKET类型定义为int,而Windows下则是UINT_PTR。这样下面这段UNIX上正常的代码就不起作用了:

SOCKET maxfd = -1;
for (i=0; i maxfd) maxfd = sk[i];

因为UINT_PTR是无符号的,因此-1实际上是最大值。

2)其实不用为上面的情况担心,因为Windows直接忽视select函数的第一个参数:)

3)跨平台移植代码最怕的不是缺了什么函数,而是函数相同却功能却不同。以select函数为例。

Berkeley-derived implementations (and POSIX) have the following two rules regarding select and nonblocking connects:

  1. When the connection completes successfully, the descriptor becomes writable (p. 531 of TCPv2).

  2. When the connection establishment encounters an error, the descriptor becomes both readable and writable (p. 530 of TCPv2).

------ UNIX Networking Programming Volume 1

If a socket is processing a connect call (nonblocking), failure of the connect attempt is indicated in exceptfds (application must then call getsockopt SO_ERROR to determine the error value to describe why the failure occurred).
------ MSDN

应该说Windows的这种改变并非不合理,因为在UNIX下exception fdset名不符实,用处太少,以至于经常被设为NULL而忽略。但这种既不是修BUG又不提高性能的改变却是以牺牲兼容性为代价的。

4)UNIX 下descriptor是通用概念,不仅仅是socket,因此select可以同时管理不同类型的descriptors。而Windows的 select只能接受SOCKET类型。这也是CTorrent-dnh难以移植的原因之一,它的select还管理标准输入输出。

5)UNIX的errno不是线程安全的,因此Windows使用WSAGetLastError函数代替。注意errno仍然存在,但是意义已不同了。

6)getsockopt函数的optval参数在UNIX下是int*类型,WINDOW下则是char*类型。这个比较想不通。

7)Windows下在使用网络API前后必须分别调用WSAStartup和WSACleanup函数。

Thursday, July 10, 2008

Huangshan

杭州是我们的第一站,因此我也有幸在同一个月游了两个西湖。作为最为人所熟知的西湖,杭州西湖的确不辱其名。相比之下,惠州西湖则显得秀气,名气上也不可 及。但这也许反倒是件幸事:虽然少了旅游带来的收益,但是环境得到了更好的保护,而这样的西湖也许才能造福更广泛的更底层的平民百姓。扯远了,由于南方普 降大雨的原因,杭州的天总是阴霾的,因此照片的效果欠佳。

因为天气的原因,我们推迟了登黄山的时间,改去九龙瀑和翡翠谷。九龙瀑名字听起来很大气,实际的瀑布却很小。翡翠谷还算不错,有点世外桃源的感觉。

次日,我们乘缆车从后山上山。天公不作美,在黄山上我们始终与风雨相伴,也因此错过了日出和云海,留着下次吧。

最后一站是宏村,粉墙青瓦、鳞次栉比的皖南名居配上村内外不小的池塘,让人感到轻松悠闲,一洗登山的疲惫。

Monday, June 23, 2008

Wednesday, June 11, 2008

Huizhou

惠州又称鹅城,自古以来就有“岭南名郡”、“粤东门户”之美称。北宋大文豪苏东坡曾寓居惠州三年,留下”日啖荔枝三百颗,不妨长作岭南人“的名句。借着端午节之名,我也有幸在惠州小住了三天。
惠州给我印象最深的就是西湖。宋朝诗人杨万里曾有诗曰:“三处西湖一色秋,钱塘颖水与罗浮”,指的就是杭州西湖,颖州西湖和惠州西湖。半城山色半城湖,惠州不仅有湖还有许多山。天公作美,虽然我们上山的路上暴雨如注,下了车立刻雨过天晴。
在惠州还有幸吃到mm妈妈做的东江盐焗鸡、东江酿豆腐。东江虽不如西湖好看,东江鱼倒是很好吃。有这样的好老师,我对mm的厨艺更加期待了。对了,炖汤也很美味。

Saturday, January 19, 2008