归档 2011年1月

最后更新于 .

最近有一个server在重启的时候总要花费5分钟左右来加载配置文件,导致外网服务不可用,今天和几个同事一起研究了一下,总算找到了问题所在.
抽象出代码如下:


#include
#include
#include
#include
#include

#if 0
#include
#else
#include
#define hash_map std::tr1::unordered_map
#endif

using namespace std;

class CTimer
{
public:
CTimer()
{
memset(&tpStart, 0, sizeof(tpStart));
memset(&tpEnd, 0, sizeof(tpEnd));
}
void Begin()
{
gettimeofday(&tpStart, NULL);
}
float GetElapseTime()
{

gettimeofday(&tpEnd, NULL);

float timecost = 0.0f;
timecost = tpEnd.tv_sec - tpStart.tv_sec + (float)(tpEnd.tv_usec-tpStart.tv_usec)/1000000;

return ...

最后更新于 .

之前公司的同事写了一个基于epoll的网络服务器,其中涉及到socket状态的转化(如等待接收,接收中,接收完成等),以及socket之间的转化(如验证完ip权限之后,验证完登录态),可见是一个多层次的状态机。
但是在原来的实现中却并没有使用状态模式,导致整个逻辑非常复杂,状态之间的跳转也很难把握。本系列的文章将会通过状态模式来重构整套代码。

状态机模式本身这里就不做详细介绍了,读者可以google一下,笔者在仔细对比过《设计模式之禅》,《研磨设计模式》以及游戏中NPC状态机的实现之后,抽象了如下的一套接口.


/*=============================================================================
# Author: dantezhu - http://www.vimer.cn
# Email: zny2008@gmail.com
# FileName: interfaces.h
# Description: 公共接口
# Version: 1.0
# LastChange: 2011-01-19 23:24:33
# History:
=============================================================================*/
#ifndef _INTERFACES_H_
#define _INTERFACES_H_
#include
#include
using namespace std;

class IFsm ...

最后更新于 .

前天在www.vim.org上闲逛,偶尔发现了auto.vim这款插件,发现短短一个星期下载量就达到了327,评价也是145/51。

script karma    Rating 145/51, Downloaded by 327

遂很好奇效果如何,于是下载下来试了一下,我这里演示一下我比较喜欢的几个特性.

1

其实主要是两个部分,1个是对于<=、>=、<<之类这种符号自动在两边补上空格,其对一定的实现代码如下:

ino <= <=
ino *= *=
ino /= /=
ino >> >>
ino << <<
ino >= >=
ino == ==
ino += +=
ino && &&
ino != !=

这样的确能帮助我们把代码变得更加美观,但是随之而来的缺点也比较明显,即拿<=为例,但你输入了<之后,vim会认为你还需要输入一个键,所以会等在那里 ...

最后更新于 .

最近遇到了几个C++问题,在这里总结一下,希望可以避免其他朋友犯同样的错误。
一.隐式转换引发的血案
我们直接来看一段代码:


#include
#include
#include
#include
#include
using namespace std;

void a(bool input)
{
cout<<"I amd first"< cout<}

void a(const string &input)
{
cout<<"I amd second"< cout<}

int main(int argc,char **argv)
{
a("str"); // 是调用第二个a函数吗?
a(string("str"));
return 0;
}


运行结果会是啥呢?好吧,可能让你失望了,结果如下:

I amd first
1
I amd second
str

char*类型的 ...

最后更新于 .

最近花了大力气在做openapi的优化,使其尽量柔性可用,借此也有些想法想和大家分享一下。
柔性服务,google一下,在网上并没有这样一个标准的概念,所以应该是公司自己取的一个名字。但是这种概念,相信大家都应该很容易能明白,即:


最大程度的保证关键服务的可用性

通俗点来说,一个人不能走路了,他起码可以说话,不能说话了,起码可以点头,头都不能点了,起码得能活着,即心脏还在跳动。这就是柔性。
对应互联网服务来说就是要实现两点:

1.要尽可能成功返回关键数据
2.要尽可能正常接收请求,不能堵死

笔者总结了一下,只要CGI满足其中一个或几个特点,就可以考虑使用柔性服务:


1.在整个CGI的执行过程中,存在关键路径和非关键路径
2.CGI中存在循环调用接口,导致执行时间不确定

我们分上面两种特点来看:
对于第一种,我们举一个简单的例子,比如有一个CGI,做了两件事情分别是:


1.验证登录态
2.获取用户信息

很明显可以看出,验证登录态这个接口是关键路径,而获取用户信息这个接口是非关键的。所以按照柔性服务的定义,当获取用户信息接口失败时,起码还应该返回登录成功。
但是这个时候毕竟还是要区分出完全成功和部分成功的,所以我们可以定义返回码如下(目前腾讯社区开放平台的openapi就是如下定义):

ret==0 ...

最后更新于 .

本博之前有写过一篇vim+php.exe检查php语法的文章-在vim中检查php语法格式,这种方式的优点是只依赖php环境本身,但缺点也很明显:检查并不严格,很多错误检查不出来。 所以我们考虑使用另一个语法检查工具-ZendCodeAnalyzer. 博友梧桐之前在博客中咨询该怎么写ZendCodeAnalyzer的errorformat,所以这里放出代码如下:

map  :call CheckPHPSyntax()
function CheckPHPSyntax()
    let php_check_syntax_cmd='ZendCodeAnalyzer  --disable var-arg-unused'

    let exeFile = expand("%:t")
    let &makeprg = php_check_syntax_cmd
    set errorformat=%f(line\ %l):\ %m
    silent make %
    if len(getqflist())>2
        call setqflist(remove(getqflist(),2,-1))
        copen
    else
        cclose
        normal :
        echohl WarningMsg | echo "Check ...

最后更新于 .

今天在工作上遇到一个问题,觉得很有代表性,特抽象如下:
通过设计模式的角度来说,就是模板方法,已经有一个基类,需要定义很多子类来实现其方法。
但是类名都只有一部分不同,且构造函数的入参也只有一部分不同。
如代码:


#include
#include
#include
#include
#include
using namespace std;
class EMA
{
public:
EMA(string a,string b,string c,string d,string e)
{
cout < }
};
class EMA4CGI_1ST:public EMA{
public:
EMA4CGI_1ST():EMA(
"app_mng.1ST_EMA_AVG",
"app_mng.1ST_EMA_HWM",
"app_mng.1ST_EMA_TMO",
"app_mng.1ST_EMA_N",
"app_mng.1ST_EMA_RATIO"
){}
~EMA4CGI_1ST() {}
};
class EMA4CGI_2ND:public EMA ...

最后更新于 .

2010年过去了,非常感谢在这一年里关注着vimer.cn的博友们,也希望新的一年里大家能够更多更好的分享和交流!~

借此机会,笔者在这里简单总结一下自博客创建以来的一些事件和文章,对新读者可以有一个清晰的索引,老读者也可以简单做一下回顾~

2009年10月
vimer.cn博客正式开通,这段时间主要以vim的入门介绍为主,并且由于工作关系,也会有一些C/C++相关的探讨.
推荐文章:


2009年11月
这段时间主要是一些vim正则查找替换之类的技巧。
推荐文章:

2009年12月
这段时间开始有较多的C/C++语言及linux下编程的一些经验分享 ...

每日归档

上个月

2010年12月

下个月

2011年2月

归档