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为例,该函数可以判断给定的字符是否属于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
分析可知,出错的原因与两次类型转换有关:
在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是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
因为UINT_PTR是无符号的,因此-1实际上是最大值。
2)其实不用为上面的情况担心,因为Windows直接忽视select函数的第一个参数:)
3)跨平台移植代码最怕的不是缺了什么函数,而是函数相同却功能却不同。以select函数为例。
Berkeley-derived implementations (and POSIX) have the following two rules regarding select and nonblocking connects:
-
When the connection completes successfully, the descriptor becomes writable (p. 531 of TCPv2).
-
When the connection establishment encounters an error, the descriptor becomes both readable and writable (p. 530 of TCPv2).
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的厨艺更加期待了。对了,炖汤也很美味。
