标签归档:linux

RSS feed of linux

最后更新于 .

接着上一篇文章: 有限状态机的C++实现(1)-epoll状态机,我们今天来介绍更复杂和深入的部分。 为什么会在标题中提到bayonet这个开源项目呢?笔者本人一直想要写一套架构优美、功能完善的异步server框架,也看过很多朋友、同事实现的版本,虽然功能上基本能满足需求,但是架构上我却始终觉得是有瑕疵的,直到后来和同事讨论,发现可以让一个客户端请求的到来作为一个session,而之后的每一次与其他server的交互都可以看作是一次状态转化,才感觉架构比较合理了。 简单来说即,一个session从开始到介绍会经历两种状态机的变化:

  • 1.业务逻辑层面的状态变化,例如先验证登录态,再验证权限,再获取用户资料
  • 2.每一个与其他server交互的socket自身的状态变化,如recv、send、等,而socket的状态变化会触发逻辑层的状态变化。

按照这种思路,目前的代码开发已经完成了70%,即可以正常的进行一个session的开始和结束,主要还缺一些细节的代码,比如超时的检测及超时之后的处理,健全的统计之类。好了,我们来用vs看一下代码的整体类图(图压缩比较严重,请单击后查看):

1

每个类的用处已经在途中简单说明了,这里就不再赘述,我们重点来看一下用这个框架来实现一个逻辑server时需要做哪些事情。 svr2目录下的main.cpp即实现了一个最简单的server,我们按部分来看其实现:

1.逻辑层状态的定义

class CAppFsmLogic1 : public CAppFsmBase ...

最后更新于 .

最近有很多时间相关的一些技术积累,主要分为三块,

  • 1.gettimeofday时间差不准的bug
  • 2.时间的字符串形式和时间戳形式的转化(C语言)
  • 3.提供时间日期选择的控件

一.gettimeofday时间不准的bug 先从第一个说起吧,前几天在fuload项目通过如下代码统计调用消耗的时间:

struct timeval stBegin;
struct timeval stEnd;
gettimeofday(&stBegin, NULL);
ret = process(swi);
gettimeofday(&stEnd, NULL);
time_ms = ((stEnd.tv_sec-stBegin.tv_sec)*1000000+(stEnd.tv_usec-stBegin.tv_usec))/1000;

按理说是很平常的写法,但是在实际的曲线图中,却发现每隔20分钟就会出现一个很大的波动,在网上苦询答案未果,最后突然想起来,既然是规律性的出现问题,是不是crontab中有每隔20分钟的调用导致的问题呢?最终在crontab中发现了这个:

*/20 * * * * /usr/sbin/ntpdate 172.23.32.142 ...

最后更新于 .

前一段时间在博客中和fuadam讨论过python中调用print的时候,是否可以直接打印decode之后的字符的问题。(原文:python-django的中文编码总结)
一开始我的结论是,print只能打印encode的字符,不能进行decode,但是后来在直接执行python test.py(在vim中是!python %)后,发现确实能够正常打印,那我之前究竟是怎么看到错误的结果的呢?

首先,我们需要在vimrc中做如下配置来实现python的一键执行:

function CheckPythonSyntax()
    let mp = &makeprg
    let ef = &errorformat
    let exeFile = expand("%:t")
    setlocal makeprg=python\ -u
    set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
    silent make %
    copen
    let &makeprg     = mp
    let &errorformat = ef
endfunction

打开一个python文件,代码如下 ...

最后更新于 .

首先庆祝一下QQ餐厅正式不删档公测,本以为终于可以不用那么晚发版本了,结果昨晚入口CGI出现问题,折腾到凌成4点多,杯具……

先截个餐厅的图给大家看一下:

canting

先来介绍下背景,公司是使用自己写的webserver,然后用fastcgi的方式运行CGI,结果前端返回502错误。和运维的同学确认后,了解到当CGI在执行完却没有返回给webserver任何数据,就会报502错误。
检查了一下代码,任何出错都会有错误返回。
于是strace了一下进程,发现在出现一次如下的错误之后,以后的请求就全部都会出错。

修改

其实这个CGI和平常的CGI没有什么区别,只是由于用到了模板类,所以使用cout来进行输出而不是printf,结果问题就出在了cout上。

与printf不同,cout在出错之后,会保存出错的状态,而由于fastcgi是一直在内存里的,所以在cout第一次出错之后,后面的就全部都会出错。
解决的方法是:
在每次开始cout数据之前,调用一下cout.clear()

之后,问题得到解决,在出现上图中的错误之后,以后的数据也一样可以正常输出。

但是这样毕竟不是办法,因为当访问量非常高的时候,用户遇到错误的概率也是非常高的。

以为是cout的数据不全,于是尝试在CGI输出的最后,我加了一行:cout<<flush;,结果发现出错的概率反而变高了许多,于是就去掉了。

目前猜测的问题还是底层库可能有头文件和.a不一致的问题,之前碰到一个应为这个问题写越界的,还有一个也是这个原因结果编译成可执行时,cout会core,看来底层库的统一也是件大事啊

参考文章:
endl cout 缓冲区执行时立即刷新

最后更新于 .

今天尝试了一下搭建python+apache的环境,记录在这里,希望对大家有用. 一.安装apache(apache2.2.15) 到 http://httpd.apache.org 下载最新的apache源码,解压后进入目录: 我想把apache安装到/home/dantezhu/apache下,所以执行如下命令 执行:

./configure --prefix=/home/dantezhu/apache --enable-track-vars --enable-cgi --with-config-file-path=/opt/apache/conf --enable-modules=all --enable-mods-shared=all --enable-file-cache --enable-disk-cache --enable-cache --enable-mem-cache --enable-dumpio --enable-logio --enable-mime-magic --enable-headers --enable-usertrack --enable-version --enable-ssl --enable-http --enable-rewrite --enable-proxy --enable-proxy-connect --enable-proxy-http --enable-proxy-ftp --enable-proxy-ajp ...

最后更新于 .

公司开发机Linux上的Vim一直不支持多字节支持(:set fenc ,用这个命令就可以知道是否支持),导致在终端下的vim对中文的显示总是有问题(而且对于汉字,要按两次键才能移动过一个汉字)。 所以从新编译了一下,简单把编译的过程写在这里: 从www.vim.org上下载vim-7.2.tar.bz2 执行

tar zxvf vim-7.2.tar.bz2

注:后发现有误,tar zxvf  无法直接解压bz2,不过可以现在windows下用winrar或者7z解压。 进入vim72目录,执行(特别注意:所有的命令的操作用户,请保证是root权限,以免出现目录创建不了的错误

./configure --prefix=/usr/vim --enable-multibyte --with-features=huge
make && make install

对参数简单说明一下:

--enable-multibyte选项使vim可以支持使用多字节编码字符集的文件。
--with-features=huge 最大特性支持

这样vim就安装上啦,如果公司上有多个vim ...

最后更新于 .

本篇主要是一些使用示例,由于部分代码是来源网上,原作者已经无法考证,所以如有原作者看到,可以告诉我,我给注明~

上一篇链接--libcurl的使用总结(一)

另:文末附有所有代码的打包下载,均在suse 10下编译运行通过

1.下载文件到本地

/*==============================================
#  Author:          DanteZhu - http://www.vimer.cn
#  Email:           dantezhu@vip.qq.com
#  FileName:        test_download.cpp
#  Version:         1.0
#  LastChange:      2010-03-09 14:20:44
#  Description:     
#  History:         
============================================*/
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include "curl/curl.h"
using namespace std;
static char ...

最后更新于 .

最近的项目中由于要在C++代码中调用PHP的URL,所以不得不借助libcurl这个库,由于第一次用,所以很多地方很是纠结,特此写在这里,方便给同样刚入门的朋友指引。
分两篇介绍,第一篇是理论知识,第二篇是实例。快速链接--libcurl的使用总结(一)

一.下载安装
    1.到http://curl.haxx.se/download.html上下载最新版本,由于公司的机器安装rpm有依赖关系,所以直接下载了source
    2.编译。解压后进入curl的目录,直接执行 make all 就行。
    3.等待编译结束后,可以查看目录结构。
        curl/include/curl : 头文件目录 (一般只要包含curl.h即可)
        curl/lib/.lib/      : lib文件目录(有libcurl.a和libcurl.so,注意 ...

最后更新于 .

各位在终端下用vim的朋友们~~我想我绝对给大家带来了一个福音~~哈哈 想必每个人都受不了终端下vim那阴暗、简陋的配色吧,而且就算用 :color xxx 来选择那些支持终端配色的配色方案也不能改变什么,是不是很郁闷?! 先给大家上个图,哈哈,感觉怎么样? zhongduan

(注:请尽量在XShell或者putty下使用,secureCRT由于自身颜色显示问题不是很完美,但也是可以用滴!~) 嗯嗯,其实很简单啦,只需要在vimrc中配置上这样一句话,来指定配色方案是256色就可以啦

set t_Co=256

这个配色方案的名字叫 darkburn.vim ,他的配色在windows下gvim的表现并不怎样,但是在终端下的表现反而非常出色,大家可以去试试哦 版权所有,转载请注明出处.http://www.vimer.cn

最后更新于 .

呵呵,废话不多说,先看看到底是啥好玩的语言特性~~
1.

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
int main(int argc,char* argv[])
{
    char a[20]=“world”;
    printf(“%c\n”,a[2]);
    printf(“%c\n”,2[a]);
    return 0;
}

对于这段代码,你觉得是否会编译通过,并且正确运行呢?

2.

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
class Foo {
  public ...