自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Rick's CodeLog

let's code for fun!

  • 博客(21)
  • 收藏
  • 关注

原创 vim配置和插件NERDTree

0.vim 7.2 或以上1.要有 git2.安装 Vundle git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim3.安装 NERDTree, nerdtree-git-plugin, vim-nerdtree-tabs 和 ctrlp等 Plugin ‘scrooloose/nerdtr

2016-12-06 01:20:13 1974

原创 一个lua版的zset数据结构实现

redis里的zset是一种有序集合,从逻辑上,可以理解为在集合的基础上,为每一个成员增加了分数字段,分数是一种浮点数值,并可以相同,它们按序排列起来。它能对分数在增,删,查找上都能提供对数时间复杂度的操作。redis里的zset是利用一个skiplist和一个dict实现的,其中关键数据结构就是skiplist,跳跃表。skiplist的原理和基本实现网上有很多,不再啰嗦。基于zset的需求,会有

2016-09-02 00:12:38 1956

原创 skynet学习笔记(一)理解Service

skynet是一个开源服务框架,运用她可以用lua编写服务器程序。一开始上手有个概念容易弄混,就是‘服务’,service,以前以为服务器无非是处理一些网络协议,抱着这个想法很难理解。原来skynet的服务是一个新概念。是什么框架内实现了一套消息处理过程,而这个处理者就是服务。那消息是什么?消息就是一些数据包,在业务上通常是表示一些请求或者回应。那消息是如何处理的,排队一个一个处理,就是存在消息队列

2016-08-23 00:23:12 2500

原创 协程和枚举器

协程(Coroutine)就是一段能自己中断和唤醒的程序片段,借助线程去理解,不同的是,它是由你来维护,看起来异步的逻辑,其实是同步顺序执行的,非常美妙。接触过一段Unity开发,了解到C#里也有协程,但和之前Lua里的不太一样。C#只提供了一个yield关键字,借助原本就存在的枚举器(IEnumerator)实现的。yield return 将对象返回到枚举器的上层调用,同时保存枚举器的函数内状态,直到上层调用枚举器的下一个取值。本质上C#是为了简化代码,更容易实现一种枚举器的写法,而协程是附加产物。

2014-11-11 00:00:29 691

原创 PHP关于mysql_real_escape_string的很奇怪的bug

<br />长话短说,mysql_query串的安全问题是众所周知的,对拼入sql串的数据字符串要做mysql_real_escape_string(或mysql_escape_string),这些没有问题,可是,但是,在大名鼎鼎的php上面,有这样一个‘bug’,有时候你发现你escape后的串,输入到了数据库,调了好久,一步步跟踪数据的变化,后来发现在$_POST[]中变量就已经被escape了,于是你再调mysql_real_escape_string,就会多作一次变换,而结果就是:数据串'xxx"'

2011-03-27 12:20:00 1271

原创 折腾了半天的编码问题

编码问题 url编码 utf-8 javascript php

2011-01-25 23:17:00 610

原创 Sajax源码研究(PHP版)

Sajax的源码可以在这里下载:http://www.modernmethod.com/sajax/它有很多脚本语言实现,包括php,python,ruby,lua等,本文只说Sajax.php的实现。以一个典型的更新部分web元素为例说明一下sajax是如何实现的。1,Ajax Requestbrowser首先发起ajax request,在sajax里是调用已注册的x_FUNC函数,它实际上是转调的sajax_do_call("FUNC", ...),里面是通过XMLHttpRequest对象发起的GE

2011-01-20 20:56:00 567

原创 IE的bug

将如果网页是非Ansi编码,则要将标签放在标签之前,否则IE会显示成空白页~

2011-01-14 00:05:00 320

原创 单身对象的安全构造

<br />单身对象可以泛指一些系统需要保存的中间状态,通常如果一个接口函数,如果里面保存有状态,则可以认为存在着一个单身对象。<br /> <br />单身对象在任何情况下,只能构造一次,构造的过程在什么时候做,是非常讲究的,你如果提供初始化函数,比如WinSocketAPI的初始化函数WSAInit,那你要自己控制好调用顺序,确保它先于其它API的调用之前被调用。<br /> <br />有一种简单做法,结果是这样的,在第一次调用应用接口的时候初始化,反初始化就不做了,不反初始化的原因是,它是单身,它的

2010-12-03 01:04:00 405

原创 VS2010编译报错 指向$(WindowsSdkDir)include/objidl.h C2061 __RPC__out_xcount_part未定义

<br />http://social.msdn.microsoft.com/Forums/en-US/windowssdk/thread/a47e4fe8-7b3f-45fc-83ee-6bd225213eb9<br /> <br />在VS2010中工具 选项配置里不能设全局路径设置了,打开项目属性,VC++目录,在$(DXSDK_DIR)..前面加上$(WindowsSdkDir)..对应设置,包括include,lib和bin,立即编译生效。

2010-10-25 14:15:00 2681

原创 VC下的预编译头文件设置

VC2005为例创建WIN32工程,选空项目,项目建立后甚至连stdafx.h都没有,添加stdafx.h和stdafx.cpp,随便写点啥,选择工程属性,C/C++,预处理头,创建/使用预处理头 项选择‘使用预处理头’,添加Main.cpp,写上一个简单的WinMain函数,再对stdafx.cpp点右键选属性,C/C++,预处理头,创建/使用预处理头 项选择‘创建预处理头’,记得上述设置对debug和release都做一下,完成后按F7完成。

2010-10-19 20:25:00 699

原创 经典的一种观察者模式实现

<br />为你的类class Target设计一个观察者基类class Observer,同时设计一个观察者容器:<br /> <br />typedef std::list<Observer*> OBSERVER_LIST;<br /> <br />再为Observer设计一系列的虚函数,表示事件处理函数,在某一事件发生时,对容器内的所有观察者调用一次该处理函数。<br /> <br />如果在Lua里就会更简单,lua的函数也是一种值,通常函数名其实就是该值的一个字符串key,类似观察者模式,可以用通

2010-10-07 01:40:00 457

原创 VC2005下查看预处理器宏展开结果

gcc -E选项可以查看预编译结果,同样在VC下,把C/C++-》预处理器-》生成预处理文件 勾上也可以,但是你rebuild时会发现报一个Link错误说找不到stdafx.obj文件,这很正常,不要惊慌,VC只做了预处理,所以自然没有.obj文件,只不过它的连接器不应该报这个错罢了,在.cpp的同目录下可以找到对应的.i文件。展开前,建议把系统头文件注掉,不然结果文件很大很大,你不知道你想看的部分展开在哪了。

2010-09-09 23:43:00 1172

原创 实现类和继承、多重继承和多态

lua的类也是一个table,它有自己的metatable,主要有__index元操作,有成员函数,有构造函数,设计这样一个函数,它构造出这样一个table。function Class(t) local class = {}; class.__member_data = t or {}; class.__index = class; function class:InheritMemberData(...)  local base = {self, ...};  local member_data = {

2010-09-02 23:30:00 531

原创 __index不能放在表内定义

发现一个很奇怪的现象,__index在表内定义无效,求解释~看测试代码:Test = {__index = Test;Foo = function(self) print(self.x, self.y);end;};--Test.__index = Test;function Test:New() local obj = {  x = 0;  y = 0; }; setmetatable(obj, self); return obj;endlocal t1 = Test:New();local t2 = T

2010-08-29 13:24:00 269

原创 对象序列化和rtti

以前以为序列化和rtti没什么关系,其实关系密切。先说序列化,序列化是将对象转化成字节流数据,以便进行数据传输和存储,最简单的直接的说法就是‘存盘’,玩个单机游戏,玩着玩着存个盘,游戏里的主角,npc,地图各种游戏元素,以某种方式存储到文件中,只不过单说序列化不讲介质,从对象变成二进制数据流,就是序列化。序列化的目的是为了,在将来某个时刻反序列化,从字节流数据转化成对象,继续之前的某个软件应用。rtti大致是说,在运行时识别动态类型信息,没有rtti,反序列化的过程大致像这样:拿到一段字节数据=>分析某个公

2010-08-20 00:39:00 655 1

原创 初始化顺序问题

有时候会写一个专门用于构造的类,它只有一个构造函数,然后在里面写点东西,做点事情,然而在里面会引用其它的全局变量,这时候会有初始化顺序问题,很有可能这时候目标还没有初始化出来,对于这样的全局单身变量封一层函数,然后做为静态变量传回。MyObj* GetObjInstance(){    static MyObj s_my_obj;    return &s_my_obj;}刚刚遇到一个类似问题,多亏vc报的错,在linux下直接启动,只会简单报一个‘段错误’,用gdb调试也看不出所以然。

2010-08-20 00:09:00 281

原创 [未分类]用时间状态打补丁

<br />在一个已经运营的系统上打补丁是很麻烦的事,尤其是要对旧数据做转换,我们要从一开始尽量避免这种事,然而人非圣贤,不可能没错误。不完全的分,bug分2种,1种导致系统崩溃,一般是系统编码错误,改掉就好了,1种是安静的运行,可是得到了错误的数据,和宕机比,这才是真正的噩梦。<br /> <br />对数据做版本转换,需要界定当前是属于什么状态,或者说什么版本,有经验的程序员会记得在存储数据里记一个版本号,然而有时候没有,旧数据没有办法知道自己是哪个版本,转换过还是没转换过。<br /> <br />增

2010-08-10 00:00:00 311

原创 设计一个通用的makefile

只说一下思路。先说说make吧。make这个工具只用来编译软件太可惜了,它最强大的地方其实是在模式推导,我觉得用它来编译软件只有一个理由,就是你希望做增量编译,而实际上仔细一想,它的增量编译只能做到比较文件修改时间上,这太粗糙了,想一下你有一个头文件,被100个.cpp包含,你只改其实一个类的实现,而只有一个实现的.cpp文件用到了它,那其它99个也会被增量编译出来,它没办法做到‘发现’更小的修改单元。而对于‘增量编译’的需求,往往是程序员自己写程序的过程中,实际软件发布构建的时候都是rebuild,所以m

2010-08-06 22:03:00 778

原创 从当前路径加载共享库

1、改环境变量LD_LIBRARY_PATH,加上./,/etc/profile或/root/.bash_profile如果进程不属于任何sid,那就不能这样做了2、改/etc/ld.so.conf文件,可惜这里不能用相对路径,但是你写./也是可以的,这样做它就只会登记你当前运行ldconfig时的当前目录里的.so文件,这里写的目录,他会在运行ldconfig的时候,生成ld.so.cache。如果你新加了.so库,也需要重新运行ldconfig。系统启动时也会运行一次。3、老实把库文件符号连接到/usr

2010-08-06 20:54:00 482

原创 让std::map::operator[]变聪明

std::map::operator[]是一个设计得很磋却很好用的接口,看下面的例子:#include #include using namespace std;int main(){  map iiMap;  iiMap[1] = 2; ---------------------------(1)  iiMap[2]; --------------------------------(2)  cout   return 0;}operator[]的语义是说:我先查一下这个key,如果没有就先插入一个pai

2010-07-31 03:48:00 1363 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除