egmkang

       "新的代数语言每5年就走红和过时,而我想要强调的是永恒的概念." ------By Knuth

2012年1月18日 #

[C++]怎么样实现一个较快的Hash Table

摘要: 我们服务器一直在用boost/sgl stl的hash table,但是从来没有考虑过其中的效率问题,虽然hash_map/unordered_map跑的可能真的比map快一些,可能应该不是你理解的那么快.其实他可以更快一些!!! 当我自己尝试着实现了一个hash table之后,我发现确实如此.这篇文章也是来说说,如何实现较快的一个. 通常的hash table都是用开链法,开放地址法来解决冲突.开链法是总容易实现的一个,而且因为效率稳定,被加入了C++11,取名unordered_map.不过效率实在不咋地. 开放地址法的hash table,我是从google-sparseha...阅读全文

posted @ 2012-01-18 14:40 egmkang 阅读(3263) 评论(2) 编辑

[OT]回顾2011,写在2012初

摘要: 2011年都干了些啥....读书:1. 聪明的投资者2. 超级数字天才3. 西游记4. 程序开发心理学5. Unix网络编程6. Unix环境高级编程...或者还有其他的,暂时不记得了技术???....好像没干啥,就天天写代码....搞搞C++,Valgrind,Lua,宕机等等2012年,希望自己可以认真的去写写网络程序,虽然号称是写服务器的,但是从来没写过网络程序;希望可以认真的去看看几个开源的代码,研究一下;over阅读全文

posted @ 2012-01-18 13:43 egmkang 阅读(47) 评论(0) 编辑

2011年12月27日 #

[投资]写在11年末

摘要: 大学还没毕业,买了一些建行,一些交行..... 虽然现在还认为那些股票不错,不过终究发生过换股,全换成浦发,古井贡酒,还有鲁泰,出现了一些亏损,记录如下: 其中塔牌,华兰生物是做短线亏损,其他几个本来打算做长线,后来发现收益较好的品种,换股.... 股票名称 交易亏损(RMB) 农业银行 165.95 交通银行 1675.99 建设银行 288.00 三一重工 290.66 苏宁电器 677.41 塔牌集团 281.30 华兰生物 65.72 一共亏损:3445.82. 谨记.阅读全文

posted @ 2011-12-27 13:27 egmkang 阅读(83) 评论(2) 编辑

2011年10月25日 #

[C++]运行时,如何确保一个对象是只读的

摘要: 相信很多人碰到过一个问题,就是代码太多了,不知道在哪里把这个对象给修改掉了.这个其实有两种办法的.1. 在调试的时候,可以下数据断点. gdb有watch断点.比如gdb>watch *(int*)0x12433,要记住,如果想要一只监视这个数据,就要用地址,否则过了这个scope,数据断点就无效了,还有就是,监视的值如果用内置数据类型可以表达的话,是有硬件断点的,否则效率茫茫低.....2. 运行的时候,本文主要讲这个. 先来回顾一下,我们都知道一个exec,都有好几个段,比如代码段,数据段等.这些段是有读写属性的,例如代码段只可以读,栈段是可以读写~~.那么我们就想把一个对象塞到一个阅读全文

posted @ 2011-10-25 22:55 egmkang 阅读(1207) 评论(8) 编辑

[C++]怎样将C++对象分配在堆/栈上

摘要: 相信一些朋友也碰见过这样的面试题目,本文尝试着给出解答.1. 分配对象在堆上 那么,必然要禁止对象在栈上面分配.一个很简单的办法,就是构造函数私有化(提供额外的接口生成对象),那么在栈上面就不可以分配.可是我们还需要这个对象要被析构,那么可以提供一个接口,显式的释放掉这个接口,也就是说delete也得给他禁掉~~~ 考虑另外一个问题,C++有placement new,我自己new一块内存,然后在你这上面构造.问题就变得很恶心,看来我们只有把new,delete都给他禁掉... 好了,我们现在知道该怎么做:createInstance()接口产生对象dispose()接口销毁对象new/...阅读全文

posted @ 2011-10-25 22:40 egmkang 阅读(167) 评论(0) 编辑

2011年9月27日 #

[Lua]用__index/__newindex来限制访问

摘要: 网友问了一个问题,说对象A在内部可以修改HP.外部对象只能访问对象A的HP,不能修改.这东西其实可以用__index和__newindex来实现.__index指向对象A,这样就可以访问;__newindex重写,修改hp的话,就禁止.就可以完成他的需求.下面给出简单的代码:function cannotModifyHp(object) local proxy = {} local mt = { __index = object, __newindex = function(t,k,v) if k ~= "hp" then object[k] = v en...阅读全文

posted @ 2011-09-27 14:16 egmkang 阅读(95) 评论(0) 编辑

2011年9月26日 #

[C++]野指针的产生以及应对办法

摘要: 很大程度上,野指针都是因为编码不善,习惯不好所产生的.要解决野指针,就要养成好习惯,不要动不动就public数据成员,所有的数据访问都抽象成接口,最好只在一个地方delete数据.前段时间游戏技术测试,down机无限,搞的很头疼.后来用valgrind的memcheck工具,找到很多野指针.valgrind很好用,除了有一点慢:-)valgrind --tool=memcheck --leak-check=full --log-file=./log_file.log --showpossibly-lost=no --malloc-fill=0xff --free-fill=0x11 ./exe阅读全文

posted @ 2011-09-26 22:51 egmkang 阅读(1832) 评论(3) 编辑

2011年8月13日 #

[投资]浦发银行的价值投资

摘要: CPI那么高,为了抗通胀,我买了股票,号称是价值投资:-),可是一直没有算过具体能有多少收益....今天算了一下浦发银行的收益,不算不知道,一算吓一跳啊.去年年报每股净资产8.57RMB,今年由于分割了股票,所以每股净资产大约是(8.99+0.42)/1.3 = 7.2RMB,作为起始每股净资产然后假设每年的净资产收益率为15%,去年是15.59%,据以往历史,15%的净资产收益率还是比较容易达到的.算算5年,10年后,浦发的净资产有多少:7.2(1+0.15)^5 = 14.487.2*(1+0.15)^10 = 29.12银行牛市时,PB会比较高一点,3倍算是比较高的,那么大约可以估算出1阅读全文

posted @ 2011-08-13 19:22 egmkang 阅读(130) 评论(0) 编辑

2011年7月16日 #

[vim]我的vim配置

摘要: set nocompatibleset backspace=indent,eol,startset nobackupset history=50set rulerset showcmdset showmatchset hlsearchset incsearchset ignorecasesyntax onfiletype plugin indent onautocmd FileType text setlocalset autoindentset cindentset numberset expandtabset tabstop=4set shiftwidth=4set nowrapset l阅读全文

posted @ 2011-07-16 11:16 egmkang 阅读(214) 评论(1) 编辑

2011年6月19日 #

[转载]一些鲜为人知的编程真相

摘要: 1. 一个程序员用在写程序上的时间大概占他的工作时间的10-20%,大部分的程序员每天大约能写出10-12行的能进入最终的产品的代码 — —不管他的技术水平有多高。 好的程序员花去90%的时间在思考、研究和实验,来找出最优方案。差的程序员花去90%的时间在调试问题程序、盲目的修改程序,期望某种写法能可行。“一个卓越的车床工可以要求比一个一般的车床工多拿数倍高的工资,但一个卓越的软件写手的价值会10000倍于一个普通的写手。”——比尔 盖茨 2. 一个优秀的程序员的效率会是一个普通的程序员的十倍之上。一个伟大的程序员的效率会是一个普通程序员的20-100倍。这不是夸张 — — 1960年以来的.阅读全文

posted @ 2011-06-19 14:50 egmkang 阅读(316) 评论(3) 编辑

2011年6月11日 #

[C++]给C++封装一个多播委托

摘要: 一来闲的蛋疼,二来我们代码里面有一些fastdelegate的代码,在clang下面实在编译不过去,所以打算重造一个轮子,至少标准一点(换个编译器能编译过去...)....废话不说,上代码:// C++版的多播委托,使用boost::function// 为了在各个编译器下面都能编译// author:egmkang#ifndef __ZEVENT_T_H__#define __ZEVENT_T_H__#include <boost/function.hpp>#include <list>template<typename T>class zEventBas阅读全文

posted @ 2011-06-11 10:10 egmkang 阅读(1060) 评论(5) 编辑

2011年5月14日 #

[thrift]thrift中的对象序列化

摘要: 本文炒冷饭.说实话,一直挺看好Thrift,支持的语言又多,代码写的有很清晰,效率又不低,为啥研究Protocol Buffer的人那么多.不管那么多了....Thrift中的对象序列化是我很看好的东西,他用compiler+类库,让你高效的完成任务,而且可以少犯错误.试想,有谁可以保证自己设计的对象,不会再改变呢?数据库的schema改了,你可以改改查询语句,但是如果你对象改了,之前序列化好的东西,有时候就很难搞回来了.(哎.....)废话不说,看Thrift里面怎么搞的.1. Thrift支持的数据类型Thrift支持的数据类型定义在TProtocol.h这个头文件中,有一个TType的枚阅读全文

posted @ 2011-05-14 16:02 egmkang 阅读(1466) 评论(4) 编辑

[boost]用BOOST_FOREACH简化遍历操作

摘要: 成天写迭代器,写的手指都疼,BOOST_FOREACH可以方便的遍历STL容器.只需要头文件:#include <boost/foreach.hpp>然后遍历容器vector/list/set/deque/stack/queue都是类似的:vector<int32_t> _v;BOOST_FOREACH(int32_t value,_v){//这里就可以访问value}同时元素还支持引用,const,比如上面代码还可以写成:vector<int32_t> _v;BOOST_FOREACH(int32_t& value,_v){//这里就可以修改/访问阅读全文

posted @ 2011-05-14 13:46 egmkang 阅读(315) 评论(0) 编辑

2011年5月12日 #

[读书]至理名言--摘自你的灯还亮着吗

摘要: 每每看一遍都有新的收获阅读全文

posted @ 2011-05-12 18:48 egmkang 阅读(161) 评论(1) 编辑

2011年5月2日 #

[Lua]Lua里面的函数

摘要: lua里面函数是first-class function,这样就显得lua的函数跟C/C++里面不太一样.local function print()--code hereend--其实就是local print = function () --匿名函数--code hereend因为函数是first-class function,所以你可以拿一个变量去索引那个函数,而且此时函数的上下文信息还有,在函数体内可以访问外部的信息.(扯远了,这是闭包,有兴趣的去看看wiki)经常看到这样的代码:tb = {}function tb.print()end其实有了上面的知识,我们也能知道,刚才那段代码也阅读全文

posted @ 2011-05-02 15:30 egmkang 阅读(188) 评论(3) 编辑

2011年3月19日 #

[gdb]函数堆栈乱掉的解决办法

摘要: 程序core掉,要去debug,但是函数堆栈乱掉了,很恶心.....经过Google/wiki一番,找到两种解决办法.1. 手动还原backtrace 手动还原其实就是看栈里面的数据,自己还原函数栈,听起来很复杂其实也比较简单.手头上没有比较好的例子,所以大家就去看 http://devpit.org/wiki/x86ManualBacktrace 上面的例子.那个例子很好,是x86下面的,amd64下面也是类似. amd64下面,无非就是寄存器变成rbp,字长增加了一倍.当然这边选择了手动寻找函数返回地址,然后info symbol打印出函数名,其实还可以通过gdb格式化来直接打印函数名: 阅读全文

posted @ 2011-03-19 14:06 egmkang 阅读(379) 评论(0) 编辑

2011年3月5日 #

[随机数]网游垫装备及其思考

摘要: 学而无术者比不学无术者更加愚蠢 ----富兰克林 玩游戏的,总归会有很多心得,网上略微搜一下,就会发现很多垫装备的言论,很多人相信垫装备有用.这是问题!! OK,让我们来把问题简化一下,因为装备打造合成概率实在是繁复,所以存在必要的简化.问: 连续的抛一枚硬币,失败N次之后,第N+1次失败的概率是多少?会不会比50%高(!!!这是我们真正要搞定出的问题). 抛硬币,是随机事件.理论上讲,成功失败的概率各50%(头像朝上与否),而且任何两次随即之间完全无关.否则他就不叫随机事件了.当年概率论学的不好,但是头脑里面还有一点意识,我不相信连续的失败可以明显提高成功的概率! 但是理论学的太差,我不能.阅读全文

posted @ 2011-03-05 14:14 egmkang 阅读(1177) 评论(8) 编辑

2011年2月25日 #

[OT]讲一个笑话

摘要: 今天看到某位仁兄写了一篇文章,里面用了5000个线程,让我想到了一个笑话.说,系统越跑越慢,让程序员去查,程序员说貌似是mysql卡死了,mysql不行啊.仔细一看,貌似有几百个connection.我问了一下,你连接池设多大?2000!阅读全文

posted @ 2011-02-25 20:52 egmkang 阅读(438) 评论(3) 编辑

2011年2月20日 #

[vim]clang带来的clang complete代码补全插件

摘要: 用vim写C++代码,基本上没多少补全插件可以选.我用的是omnicppcomplete,这个插件靠tags来实现补全,效果差强人意.  前一段时间发现了clang complete,发现效果很好(广告一下:D).所以推荐一下.clang complete是llvm/clang带来的额外功能.clang complete是靠编译C++文件,应该是获得抽象语法树,进而进行补全的.所以,补全效果非常好,非常准确.但是,也有可能会比较慢.  OK,有兴趣的多去Google一下llvm/clang,关注一下llvm/clang这些个项目.顺便关注一下clang_complete,这些项目更新的都很快.阅读全文

posted @ 2011-02-20 14:15 egmkang 阅读(2699) 评论(10) 编辑

2010年12月28日 #

[OT]我的2010(加班无极限)

摘要: 在今年的最后几天,做一下总结.1. 今年跳了两次槽(~!@#$%^&*())  前面俩公司还都做WM开发(这不之前写了不少WM文章),不过最后这个公司,做mmo服务器,所以目前一直在做Linux上面的写代码.  成功从C#转型到C++.2. C#->C++的转换,是在第二个公司完成的,他们不用C#写WM程序.  第一个月是非常痛苦的.记得其中有两次严重的野指针,分别查了一天才找到.  总结一个经验,如果用malloc,那么一直用malloc,不要一会儿用malloc,一会儿用new......我那两次数组越界都是平时用new,突然用malloc造成的......3. 现在一直在写C++和lua阅读全文

posted @ 2010-12-28 23:54 egmkang 阅读(358) 评论(5) 编辑