- 博客(97)
- 资源 (2)
- 收藏
- 关注
原创 关于编译的非常重要的问题
<br />碰到了一个比较棘手的问题:<br />类A有两个文件A.h和A.cpp如下<br />//A.hclass A{public: A() {a = 0;} void print(); int a;};<br />//A.cpp#include <stdio.h>void A::print(){ printf("a=%d/n", a);} <br />然后编译,得到一个可执行文件a.out和另外一个文件A.o<br /> <br />接下来修
2011-02-16 11:33:00
494
原创 (二)目录
<br />PHP版本为5.2.17<br /> <br />源代码目录组织方式:<br />-ext扩展库<br />+standard PHP内建库,比如文件IO和字符串处理<br />...<br />+build: 构建二进制文件相关<br />+main: 一些C基础库<br />+netware: netware平台相关<br />+regex: 提供正则表达式功能<br />-sapi: 和各种web服务器接口代码<br />+apache<br />...<br />+scripts: 一些
2011-02-01 11:52:00
524
原创 (一)Makefile
<br />PHP版本为5.2.17<br /><br /><br />1、windows平台上,PHP使用了一个configure.js的脚本来生成Makefile文件,在生成Makefile文件之后,调用nmake生成代码即可。<br /> <br />2、Makfile中比较值得学习的地方是定义GLOBAL_OBJ,也就是说这是共享的OBJ文件,比如每个模块可能都需要vsprintf.o这个文件,那么就将它列入共享obj文件中
2011-02-01 10:56:00
479
原创 论游戏服务器-开篇(为什么要有游戏服务器)
注意:我们先对将要讨论的问题加以界定,“论游戏服务器”涉及到的范围只限服务器实现技术和实现过程中需要注意的事项。为什么要有游戏服务器?回答这个问题的方法是反证手法,假设没有游戏服务器会怎么样?一般人都回答说游戏者之间不能互动。当然只要懂点技术的人会说没有服务器我们可以用P2P呀,比如什么PSP不是都用ad hoc技术吗?没看见我们俩“玩怪物猎人”正high着吗?OK,你说的没有错。那么我提出一个问题,如果对方作弊了怎么办?比如修改数据。好的,P2P的支持者肯定会说我们每个机器上都需要有个反作弊系统,那么反作
2011-01-15 20:06:00
682
原创 自旋锁(1)
<br />自旋锁的初衷就是:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。
2010-12-28 14:46:00
313
原创 要使问题进入可讨论的状态,就必须对所要讨论的问题尽可能加以明确的界定。
<br />要使问题进入可讨论的状态,就必须对所要讨论的问题尽可能加以明确的界定。
2010-12-01 12:49:00
343
原创 gcc链接
<br /><br />gcc在连接目标代码时需要保证库的依赖关系,被依赖的库要放在使用的库之后,比如A使用了B,那么-lB应该在-lA之后。
2010-10-13 10:25:00
450
原创 html排版原理-float
<br />当只有float:left的时候<br />以前我经常认为设置了float属性的块节点将会成为内联节点,其实实际上不是这样,设置了float属性的节点就是会变得“透明”,比如块A、B、C,D;A是float:left,B是float:left,C没有设置float属性,D也没有设置float属性,那么排版出来的效果是<br />ABC<br />D<br />C并不会在独立的一行出现,但是依然要求后续节点D在所在行的下一行,这说明C忽视了AB的存在并认为第一行是空的。<br />再比如A、B、C
2010-09-22 09:36:00
2351
原创 如何模拟Mysql超时
<br />在开发过程中我们需要模拟出读写Mysql超时的情况,有一种廉价的方法可以帮助我们解决这个问题:<br /> <br />登陆Mysql然后锁表:<br />lock tables role_info write;<br /> <br />--这个时候表role_info就被锁住了,之后的读写操作都会超时<br /> <br />unlock tables;<br /> <br />需要注意:不要忘记解锁!
2010-08-06 13:56:00
2249
原创 Python:三句搞定快排
<br />def qsort(L): if len(L) <= 1: return L return qsort([lt for lt in L[1:] if lt < L[0]]) + [L[0]] + qsort([ge for ge in L[1:] if ge >= L[0]]) <br />摘自《Python Cookbook》
2010-08-06 09:37:00
6132
原创 服务器开发(三)
服务器开发的指标优先级(高到低):功能完成->稳定->可维护->?->高效‘?’主要是为了说明高效的优先级其实很低。一个不妥的程序跑地再快都没用
2010-08-05 11:59:00
447
原创 网络编程(八)非阻塞套接字的连接和select
在处理非阻塞套接字的连接的时候,我们往往会使用select来判断套接字在发起连接之后发生的变化,但是这个过程中linux和windows有些差别,本文将详细分析这两个平台此时的差异性。目标主机端口可达: 当套接字连接目标地址成功之后,select可以检测到这个套接字上的变化:“可写”。这种情况对于linux和windows都是一样的。目标主机不可达: 这种情况下,套接字并没有发生变化,所以select会一直等待直到超时,这种情况对于linux和windows都是一致的。目标端口不可达: 在
2010-07-25 04:17:00
874
原创 网络编程(七) 正确的设置非阻塞套接字
<br />我之前都是用以下方法来将套接字设置为非阻塞状态:<br />fcntl(fd, F_SETFL, O_NONBLOCK);<br />其实上面这种做法只对了一半,因为这操作可能就将fd绑定的其他标志位清除,最理想的做法是:<br />int flags = fcntl(fd, F_GETFL);<br />fcntl(fd, F_SETFL, O_NONBLOCK | flags);
2010-07-20 17:22:00
463
原创 Python单件模式
<br />class A: @classmethod def instance(cls): if not hasattr(cls, '_instance'): cls._instance = cls() return cls._instancea = A.instance()
2010-07-20 16:48:00
1249
原创 安全编码(十一)
<br />char* content = (用户输入)<br />fprintf(fp, content);<br />以上的做法异常危险,当用户的输入包含"%s"的时候造成崩溃的概率很大,将一个字符串作为一个format传入fprintf是非常危险的。<br />应该改为:<br />fprintf(fp, "%s", content);
2010-07-17 00:55:00
367
原创 网络编程(六)
开发网络应用请不要少了让你感激地内牛满面的工具:tcpdumpsniffer常用命令:tcpdump -Xnns 2000 ... ... (具体请看man)
2010-07-14 02:26:00
1229
原创 安全编码(十)
<br />如果你需要实现一个函数void foo(const char* in, char* out),处理的结果需要放到out中,请问你有足够的自信保证不会造成out的<br />溢出吗?如果没有,请写成:void foo(const char* in, char* out, unsigned int out_size),并在实现的时候处处留意。
2010-07-14 02:20:00
721
原创 安全编码(九)
A* a = GetA();if (NULL == a) { a = GenA();}a->doSomething(); 上面的代码有个很大的问题是第一个"A* a"中a和第二个"A* a"的a是不一样的,假设GenA返回的是NULL,那个"a->doSomething()"会造成崩溃现象。
2010-07-10 15:39:00
295
原创 安全编码(八)
printf("%s", ...) sprintf("%s", ...) 等在变参为整数、空指针、无得时候总是很危险,最好是写个工具来检查代码中的类似代码。
2010-05-26 13:56:00
345
原创 服务器开发(五)
服务器开发过程中总会碰到异步编程,从而不得不为一次处理过程分配上下文,但不包含异步过程的处理是不需要上下文的;为了保证服务器开发过程中思路的统一和简单性,不管是否包含异步过程,一个处理过程的执行之前都一律申请上下文,不包含异步过程的处理过程在结束之后就立马回收上下文即可。
2010-05-22 12:41:00
320
原创 服务器开发(四)
如果数据库设计的时候使用了分库分表的方案,那么在开发的时候最好也实现一个“修复数据库间数据不同步”的工具,因为没人能够保证自己写的程序不会造成库间不同步的现象。
2010-05-19 11:05:00
411
原创 linux api笔记(10):删除文件
#include int remove(const char *pathname); 使用remove函数可以删除文件。返回值为0表示成功,-1表示失败,具体失败原因需要查看errno。
2010-05-12 15:55:00
2767
原创 linux api笔记(9):保证内存页不被淘汰
linux由于使用了虚拟内存技术,那么在一般的情况每个内存页都有可能被刷出物理内存,出于某种目的比如性能和安全性方面考虑,有时候需要保证内存页不会被淘汰,我们可以使用下面函数: #include int mlock(const void *addr, size_t len);int munlock(const void *addr, size_t len); 当我们需要保证
2010-05-10 15:29:00
564
原创 服务器开发(三)
服务器挂了却没有core文件,是因为系统对core文件的大小限制出问题了,可以将ulimit -c unlimited写在/etc/profile文件的尾部并重新登录,这样子系统将不对core文件的大小做限制。
2010-05-10 11:28:00
417
原创 服务器开发(二)
后台服务器由于各种原因经常需要协作以解决问题,而如果让每台服务器都实现网络层显然无谓的工作很多,我们可以模拟inetd实现一个后台进程专门用于衔接各个服务器,这样子各个服务器就不再需要编写网络层。
2010-05-10 11:01:00
434
原创 lua算术表达式优先级笔记
从低到高:and or== ~= > = ..+ -* /- not^ (右连接) 最左推导的文法上的设计应该(高优先级的表达式总是作为低优先级表达式的最小不可分割因子)是:E -> E and ANDORT | E or ANDORT | ANDORTANDORT -> ANDORT == LOGICT | ANDORT ~= LO
2010-05-08 10:23:00
604
原创 网络编程(五) 阻塞套接字如何非阻塞接收数据
“ 阻塞套接字如何非阻塞接收数据?”,虽然这样做比较无聊,而且似乎从来不需要这么用,但是recv函数确实可以做到这一点:recv(fd, buf, size, MSG_DONTWAIT);
2010-05-05 11:25:00
469
原创 网络编程(四) EPOLL
epoll的优点在于可以支持大量的文件描述符 epoll相关的系统调用: int epoll_create(int size); 参数size的含义我至今没搞懂,如果大家有谁准确的知道的话请一定要留言! int epoll_wait(int epfd, struct epoll_event * events, int maxevent
2010-05-05 10:31:00
509
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人