CURLOPT_POSTFIELDSIZE Post

最近用libcurl向某商web服务器作登录校验踩了一坑。 事情的表象是这样的,在windows上没有问题,linux上投递过去的数据乱码。但是如果将curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data)中的data写死,即写成字符串常量,也是没有问题的。 开始以为一些参数和环境的问题,查了半天问题依旧,才怀疑到变量生存周期的问题,将data生命期拉长,就好了。

水坑装水问题

题目在这里: 原文:http://qandwhat.apps.runkite.com/i-failed-a-twitter-interview/ 译文:http://blog.jobbole.com/50705 起初也是想到先求Max,这需要一次遍历;然后从左边到Max,同时右边到Max,这次遍历一共包含两个子遍历。因此一共是两次遍历。 历史总是惊人的相似,一次遍历的方法我也是早上躺在床上完成的:比较左指针和右指针指向的值,选取大的做为Max, 同时不停的移动指针,如果碰到更大的Max,调整基准即可。 这道题目没有什么高深的算法,但思维的过程还是挺有趣的。

2D渲染引擎中的脏矩形技术

2D游戏技术其实都已经很古老了,主要包括像素运算,Blt,脏矩形等一些技术。 所谓脏矩形技术,就是哪里脏了,就(仅仅)把脏了的那块区域重绘。而不是每次直接性的重绘。 其基本条件是:脏矩形的计算和绘制的代价小于直接性重绘。换句话说,如果一个屏幕每一帧变化的东西太多的话,就不值得用这个古老的算法了。 脏矩形要解决的两个问题是: (1) 什么叫脏,即什么情况下会弄脏 当我们的游戏中的元素(通常是RenderObject)发生位置,大小,方向,动画,添加,删除等操作时,那么该元素原来对应的区域会弄脏,同时,新对应的区域也同样被弄脏。 (2) 弄脏的区域该怎么办 把场景分成一个一个的格子(比如128*64或者64*32,矩形格或菱形格); 每个格子,有一个是否脏的标记,以及其上的RenderObject列表; 每个RenderObject,可以保存一个对应的格子列表(当然,也可以计算,并且,实际上有两个格子列表,变化之前和变化之后分别对应一个格子列表,对于变化前的,对应的格子列表中的每个格子应当删除该物体,对于变化后的,对应的格子列表中的每个格子应当添加该物体) 每次绘制时,按照某种顺序,绘制脏了的格子; 每个脏了的格子,按照某种顺序,将其上的RenderObject裁剪绘制到格子的区域上; 关于脏矩形技术的必要性,cloud在《我的编程感悟》一书中已经有了详细的论证。此外,书中提到的关于Blt的汇编优化,逆向画家算法,图像压缩,精灵优化,滚屏优化,以及限制内存大小的思想,都是2D游戏值得借鉴的。  

type 与 RTTI

时常,我们在程序中经常出现这样的switch或者if-else分支: if (pobj->IsKindOf(Circle)) else if (pobj->IsKindOf(Rectangle)) 等。其中上面的IsKindOf也可能是我们自定义的GetType(),或者是C++标准中的dynamic_cast。 不管怎么样,这是十分不好的设计/风格。 原因很简单,要添加一个新的类型,所有这些条件判断的地方都需要做更改;反之,使用多态只需要添加一个SubClass(当然,也可以在类层次上作一些调整)。 因此,MFC的CObject::IsKindOf() 明确的指出Do not use this function extensively because it defeats the C++ polymorphism feature. Use virtual functions instead. 如何应对这个问题呢, MartinFlower在《重构》中明确的指出了几条细则,包括: Replace Type Code with Class; Replace Type Code with State/Strategy; Replace Type Code with Subclasses; Replace Conditional with Polymorphism 既然如此,为什么还需要IsKindOf,dynamic_cast这些玩意呢。 在BS的《C++语言的设计与演化》中的《强制》一章“为什么提供一种危险‘特征’”一节中,我们可以找到讲RTTI作为标准的一些理由。这里就不一一罗列。 (“危险”两个词用的好,o(∩_∩)o) 每一个有用的特征都可以被误用。。。

异或运算XOR的一些相关技巧

异或运算(XOR)特点: X xor X = 0 X xor 0 = X X xor Y = Y xor X (X xor Y) xor Z = X xor (Y xor Z) 利用异或可以巧妙地实现一些玩意,例如: 不用中间临时变量交换两个整数; XOR linked list:只用一个指针实现双向链表