2009年07月03日

翻译 (Python编程)Pickle对象

Programming Python, 3rd Edition 翻译最新版本见:http://wiki.woodpecker.org.cn/moin/PP3eD19.4. Pickled Objects 19.4. Pickle对象 Probablythe biggest limitation of DBM keyed files is in what they can store:data stored under a key must be a simple text string. If you want tostore Python objects in a DBM file, you can sometimes manually convertthem to and from strings on writes and reads (e.g., with str and evalcalls), but this takes you only so f阅读全文>

发表于 @ 2009年07月03日 16:24:00|评论(loading...)|举报|收藏

2009年06月18日

原创 SVN中邪恶的replace


SVN中邪恶的replace

(转载请注明来源于金庆的专栏)

用TSVN客户端删除一个文件, 然后再新建一个同名文件,
可以看到该文件上的图标被打上了TSVN的小红叉.
然后Add, Commit, 就会出现一条replace记录.
replace的操作会有个提示, 就是Add(as replacement)...命令项与普通的Add不同.

意思应该是该文件被替换了.

邪恶之处是以前的更改日志显示不出来了.
用revision graph可以看到所有历史, 只是在replace处是断裂的.
也就是说替换的效果是重新开启一个文件的更改记录, 隐藏之前的记录.
我想不出什么情况下需要这种功能.

更邪恶的是, revert changes from this revision会失败(TSVN 1.4.3).
错误原因是该文件的上个版本不存在.
好像所的Add操作都是无法revert, 应该算阅读全文>

发表于 @ 2009年06月18日 14:49:00|评论(loading...)|举报|收藏

2009年05月22日

原创 当心虚函数重载(overloaded-virtual)


当心虚函数重载(overloaded-virtual)

(转载请注明来源于金庆的专栏)

为网游万王之王3(KOK3)服务器添加新功能的时候,
发现某个类成员函数应该是const函数, 因为我的const函数要调用该函数,
顺手就加上了const.

再顺便看到该类有好多个明显是getter函数, 所以都加上了const.
编译没错就提交了.

结果没多久测试就发现了新版本的一个错误, 表现在其他功能上,
但由同事纠错后发现是我添加const的后果.

原来添加const的成员函数中, 有一个是virtual函数, 加了const后与子类的函数原型就不符了.
子类的函数成为父类虚函数的一个重载, 使virtual失效, 多态性无法表现出来.
解决方法就是子类的相应虚函数中也添加const.

教训: 更改虚函数原型时, 必须同时更改父类和子类.

gcc中有个-Wove阅读全文>

发表于 @ 2009年05月22日 14:00:00|评论(loading...)|举报|收藏

2009年05月18日

转载 测试替身(Test Double)的定义

  测试替身(Test Double)的定义测试替身型别描述Dummy最简单、最原始的测试替身型别。Dummy 没有实作,最常用于需要参数值但不使用它的情况。Null 可视为是 Dummy,但真的 Dummy 是接口或基类的衍生,且完全不包含实作。StubDummy 的上一级,Stub 是接口或基类的最低限度实作。会传回 Void 的方法通常完全不包含实作,而会传回值的方法通常会传回硬式编码的值。Spy测试 Spy 类似 Stub,但除了提供客户端可叫用成员的实例,Spy 还会记录叫用了哪些成员,好让单元测试验证所叫用的成员是否符合预期。FakeFake 包含更复杂的实作,通常涉及所继承型别之不同成员之间的互动。虽然不是完整的生产实作,但 Fake 与生产实作很相似,尽管它会采取一些快捷方式。MockMock 是由 Mock 链接库动态建立 (其他通常是由测试开发人员使用程序代码来产生)。测试开发人员永远看不到实作接口阅读全文>

发表于 @ 2009年05月18日 18:50:00|评论(loading...)|举报|收藏

2009年05月07日

原创 Boost求数组的大小


求数组的大小的惯用法示例如下:

int a[] = {1,2,3};
cout

感觉boost库中应该有这个功能, 找了好长时间, 终于找到了.
原来是boost::extent, 属于boost::type_traits.

示例:
extent::value == 4

参考:
http://hi.baidu.com/redcastle/blog/item/934b232d22a24534349bf7f8.html


不过extent应该是需要一个类作为模板参数, 而我只有这个实例名a.
该怎么办呢? boost中应该有辅助函数之类的能接受一个实例再应用extent?

上述参考文章中有个现成的方法:

template
unsigned int 阅读全文>

发表于 @ 2009年05月07日 13:26:00|评论(loading...)|举报|收藏

2009年04月15日

原创 9C失去Wow代理权将促进中国Mangos的繁荣

9C失去Wow代理权将促进中国Mangos的繁荣九城发布告全体员工书 确认续约魔兽无望,详见: http://www.cnbeta.com/articles/81930.htm但是9C掌握了Wow的内幕技术, 这一优势如果投入到Mangos的开发中去, 那将是振奋人心的事情.阅读全文>

发表于 @ 2009年04月15日 18:37:00|评论(loading...)|举报|收藏

原创 Mangos的指令处理函数

WorldSession中总共有300多个指令包处理函数, 以Handle开头, 无返回值, 参数为WorldPacket&. 例如: void HandleCharEnumOpcode(WorldPacket& recvPacket); 处理函数按功能分散在多个XXXHandler.cpp中实现. 例如: ArenaTeamHandler.cpp, AuctionHouseHandler.cpp.阅读全文>

发表于 @ 2009年04月15日 17:57:00|评论(loading...)|举报|收藏

2009年04月10日

原创 Wow, Mangos登录时的SRP6认证


Wow, Mangos登录时的SRP6认证

以Mangos代码为参考, 解析SRP6的原理和实现.
(转载请注明来源于金庆的专栏)

SRP全称Secure Remote Password(安全远程密码),是一个开源认证协议。

SRP简化后的原理是:
1. 服务器不保存密码或密码的散列值, 防止字典攻击.
   而只是保存验证因子(verifier).
2. 客户端和服务器可以各自计算出一个会话秘钥(session key), 其值相同. 防止窃听.

参考:
Wow 服务器解析 ( http://www.cppblog.com/Jedimaster/archive/2006/10/14/13674.aspx )
SRP Protocol Design ( http://srp.stanford.edu/design.html )
魔兽世界服务器端编写参考资料 ( http://www.asstudio.de/wow/w阅读全文>

发表于 @ 2009年04月10日 12:56:00|评论(loading...)|举报|收藏

2009年04月03日

原创 Mingw下bjam编译Luabind


环境:
lua-5.1.4
luabind-0.8
Windows + Mingw gcc

luabind-0.8只提供了bjam编译方式.
按手册上的要求,设置好BOOST_ROOT和LUA_PATH后, 运行bjam, 报错:

D:\luabind-0.8>bjam --toolset=gcc
error: Unable to find file or target named
error:     'lua'
error: referred from project at
error:     '.'

解决方案一, 不用bjam, 直接gcc:
http://missdeer.blogspot.com/2009/01/luabind.html

方案二, 把Jamroot改改对.
因为bjam配置的那一套看了半天还是不太懂, 所以虽然能产生结果, 但不保证是最正确的方法.
阅读全文>

发表于 @ 2009年04月03日 09:39:00|评论(loading...)|举报|收藏

2009年03月27日

原创 用boost::spirit实现的表达式求值


用boost::spirit实现一个表达式求值看上去比较简单。我这个还有点问题,有空格时会解析失败,请大家看看是什么原因?

123*34+2323/324
parsing succeeded
result = 4189
2 + 3
parsing failed

#include
#include
#include

#include
// #define BOOST_SPIRIT_DEBUG
#include

using namespace std;
stack evaluationStack;

struct Push
{
    void operator()(int d) const
阅读全文>

发表于 @ 2009年03月27日 16:18:00|评论(loading...)|举报|收藏

2009年03月17日

原创 内部推荐的职位



本次接受内部推荐的职位如下:
请将简历发送至邮箱jinq0123AT163.com。并在主题中标明:“内部推荐”以及所职位名称。

一、   产品专员(活动策划) 招聘人数:1人
职位要求:
1、两年以上网络游戏运营活动策划工作经验
2、熟悉网络游戏产品及市场发展,热爱游戏事业,理解用户需求
3、出色的中文书面表达能力,要有一定的计划能力
4、具备激情、敏锐的观察力、分析能力和创意能力,思维严谨
5、出色的工作责任心、团队沟通能力和吃苦耐劳精神,能够适应加班
职位描述:
1、游戏线上、线下活动策划及方案拟定
2、与各相关部门有效的沟通,组织、协调和监督活动的执行情况
3、竞争对手相关活动收集与分析
4、配合市场人员完成的各种促销活动企划
5、竞争对手产品内容收集与分析


二 产品专员(新闻写作方向)    招聘人数:1人
职位要求:
1、出众的文字功底、丰富阅读全文>

发表于 @ 2009年03月17日 14:00:00|评论(loading...)|举报|收藏

2009年02月28日

原创 内部推荐的职位

请将简历发送至邮箱。并在主题中标明:“内部推荐”以及所职位名称。阅读全文>

发表于 @ 2009年02月28日 13:25:00|评论(loading...)|举报|收藏

2009年02月17日

原创 C调用lua脚本的效率测试

以下代码以C语言为基准,测试了C调用Lua循环和循环调用Lua的效率。结论是不要频繁地穿越C/Lua边界.阅读全文>

发表于 @ 2009年02月17日 09:21:00|评论(loading...)|举报|收藏

2009年02月16日

原创 log4cxx调试日志选择性输出的配置方法

默认所有日志等级为WARN, 不会输出DEBUG日志,只需显式设定某一类日志的级别, 就可以选择性地输出该类日志.如调试A类时, 取消配置文件中的注释就行了.阅读全文>

发表于 @ 2009年02月16日 14:42:00|评论(loading...)|举报|收藏

2009年02月14日

原创 解决TSVN的diff显示中文件不全的问题


解决TSVN的diff显示中文件不全的问题

TortoiseSVN的diff显示中文有些问题, 多数不能完整显示出来.
好像是整个TortoiseSVN对中文字符都有问题, 如blame会崩溃,
但是选中"Use test viewer..."用Notepad显示就会正常.

所以想到应该可以用一个外部的diff工具替换TSVN的默认的比较工具.

打开TortoiseSVN Setting, 选择Diff View设置页,
将默认的TortoiseMerge改为External, 并选择一个外部diff工具,
例如Beyond Compare.
当然前提是已经安装了第三方的diff工具.

我试了Beyond Compare, 还有VC带的WinDiff, 都可以.

(转载请注明来源于金庆的专栏)阅读全文>

发表于 @ 2009年02月14日 13:29:00|评论(loading...)|举报|收藏

用户操作
[即时聊天] [发私信] [加为好友]
金庆
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
金庆的公告
XSTL封面 Locations of visitors to this page Codeguru Contributor
订阅 上海程序员
文章分类
收藏
    热门文章
    1 评“程序员怎么样才能保证自己的程序没有BUG”
    2 C语言HTML解析器ekhtml的VC编译
    3 log4cpp应用速成手册
    4 一个hash_map使用错误
    5 udp广播与直接广播
    6 评“加班文化”对软件企业的危害
    作者推荐
    1 设计死了吗?
    2 葵花宝典:软件开发高手是这样炼成的!
    3 TCP截包分段重组的设计
    4 Firefox的HTTP内容解压代码阅读
    5 不可思议:using namespace无效!
    6 作业调度问题深度搜索定界算法
    7 智能机器人编程游戏robocode的运行代码简析
    存档
    Csdn Blog version 3.1a
    Copyright © 金庆