归档 2010

最后更新于 .

可能不少读者知道,本博之前是有单独搭建过一个微博:http://t.vimer.cn,用来记录一些简短的思想,不过后来由于与主站的关联太少,所以就没有再使用了。
不过最近对于这种一句话思想的需求日渐多了起来,所以发愤图强,终于算是搞定啦~(如果还没注意到的朋友,请看右侧的"我的唠叨")。
如图:

1


对于http://t.vimer.cn的搭建比较简单,使用的是p2主题,大家自行安装即可,这里只贴出右侧widget的实现,代码如下:

<?php
$con = mysql_connect('localhost', 'dantezhu_wp', 'xxxxxxxx',true);
mysql_query("SET NAMES 'utf8'");
mysql_select_db('dantezhu_t',$con);
$result = mysql_query("select * from wp_posts where post_status='publish' order by ID desc limit 1 ...

最后更新于 .

今天在开例会的时候,提到其他小组要做一个通用任务系统,会涉及到C++调用其他语言脚本开发的逻辑。之前倒是听互娱那边的同事说过,他们都是嵌入lua来进行脚本编程,但自己从来没试过。
而作为一个严重中毒的vim+python爱好者,其实我每天都在用vim直接执行python命令(如出名的pyflakes插件),想知道vim是怎么实现的,所以就自己试了一下。
由于家里没有linux开发环境,所以就在windows下用 Mingw + makefile的方式开发了。
先写一个简单的py程序:helloworld.py

def hello():
       print"hello,world!"

然后来写我们的c++代码:

py.cpp

#include<Python.h>//前面所做的一切配置都是为了调用这个头文件和相关库
int main()
{
    Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
    PyObject * pModule = NULL;//声明变量
    PyObject * pFunc = NULL;// 声明变量
    pModule =PyImport_ImportModule ...

最后更新于 .

好吧,因为组织需要,最近又开始转战php了,业务逻辑都还好说,主要是老大要求在数据访问层上加上登录态验证。
其实这种要求也是合理的,互联网服务要求上层保护下层,但下层不能完全相信上层。但是问题也就来了,有如下两种方案:

1.写一个mysql proxy server,用来将调用方发来的请求拼装,然后返回给调用侧。这样做的主要难度在于:

  • a)SQL语句的拼装及序列化
  • b)数据集序列化,虽然有不少这方面的产品,但是终究还是太过复杂,而且没有时间折腾

果断放弃。
2.封装一层mysql的api,调用方直接在本地调用即可。这样的话,只需要考虑SQL语句的拼装即可。现在就有很多选择啦,

  • a)使用类似django里面Model的模型类
  • b)使用ci中的Active Record

虽然说Model的方式,对数据层的屏蔽较好,但是小组成员普遍认为这种方式过重,轻量的一点的话,最终还是选择了CodeIgniter中的AR。
OK,那么现在,考验ci模块拆分的好不好的时候到啦!
具体中间的种种辛苦就不说啦,直说我最终的实现把,拷贝system\database到一个单独的目录,x:/php/ 。
创建一个文件myconfig.php:

<?php
define ...

最后更新于 .

很久没有写vim相关的文章,愧对vimer.cn这个域名呀~~哈,不过我还是尽量保持经常给大家提供一些Vim相关的知识。
这次介绍的是 recover.vim (http://www.vim.org/scripts/script.php?script_id=3068)
先简单介绍一下背景,vim有自动生成swp文件的功能,能够在异常情况下(简单来说就是你的vim进程被强制终止)将你没有来得及保存的代码存储下来。
但这仍然有个问题,当你再次打开那个文件的时候,vim仅提示你是否要恢复,但是我们并不知道会被恢复成什么样子。。
recover.vim就是为了解决这个问题。
我们直接来做个演示可能会比较明确,以windows下的gvim7.3为例。
新建一个文件 1.cpp,写入如下数据但是不保存

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
int main(int argc, const char *argv[])
{
    
    return 0 ...

最后更新于 .

最近需要给一个现网server增加过载保护的功能,借此机会也思考了很多,简单谈谈我对这两个概念的理解和实现方法。
一.负载均衡
简单来说,就是按照目标server的参数进行合理分配,这个参数可以是失败率,也可以是响应时间,也可以是请求量,甚至是随机数。
我们来按照从简单到复杂逐个看一下几种实现。
1.轮询式
逻辑比较简单,直接看代码:

vector vecServer;
while(1)
{
    Server* server = vecServer[curIndex % vecServer.size()];
    curIndex ++;
}

如上代码就是一个简单的轮询式分配方法,这种方法优点实现简单,cpu计算少,缺点就是无法动态判断server的状态,当后端有一台server挂掉的时候,会至少1/vecServer.size()的请求。(最为严重的情况是由于单台后端server的超时导致前段全部挂死)。而且这种分配方法有一个bug,就是当每次请求结束后就释放内存,那么curIndex永远都只会为0,即每次都请求第一个server。
2.定死权重式
这种方式适用于那种需要实现就规定后端server的权重,比如A比Bserver的响应速度快,我们希望A接受的请求比B多。

//假设A,B, C server的权重分别为 10 5 2
typedef struct ...

最后更新于 .

在C/C++中,我们存储时间时,一般都会使用unix时间戳,使用也非常简单:

time_t t = time(NULL);

关于用C++实现string和time_t的转化,本博也专门写了一篇文章:
时间time_t和string(char*)格式互转
但是在python中怎么实现操作unix时间戳呢?
本博也特意写了代码如下:

# -*- coding: utf-8 -*-

import time
import datetime

def StringToTime(strtime):
    t_tuple = time.strptime(strtime,"%Y-%m-%d %H:%M:%S")
    return time.mktime(t_tuple)

def StringToTime2(strtime):
    dt = datetime.datetime.strptime(strtime,"%Y-%m-%d %H ...

最后更新于 .

python,c#,java里面都有类似于foreach的结构,stl里面虽然有for_each这个函数,但是感觉使用还是太繁琐了一些,所以就自己实现了一个。 先来看看stl里面的for_each函数,官方文档上的原型如下:

Function for_each (InputIterator first, InputIterator last, Function f);

示例代码如下:

// for_each example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void myfunction (int i) {
  cout << " " << i;
}

struct myclass {
  void operator() (int i) {cout << " " << i;}
} myobject;

int main () {
  vector<int> myvector;
  myvector.push_back(10);
  myvector ...

最后更新于 .

在python,c#等语言中,string都是默认提供split这个函数的,C++里面却没有默认实现,但又经常会用到,所以就简单实现了一个:

int SplitString(const string &srcStr,const string &splitStr,vector<string> &destVec)
{
    if(srcStr.size()==0)
    {   
        return 0;
    }   
    size_t oldPos,newPos;
    oldPos=0;
    newPos=0;
    string tempData;
    while(1)
    {   
        newPos=srcStr.find(splitStr,oldPos);
        if(newPos!=string::npos)
        {   
            tempData = srcStr.substr(oldPos,newPos-oldPos);
            destVec.push_back(tempData);
            oldPos=newPos+splitStr ...

最后更新于 .

之前用mysql的时候一直是在用短链接,调用mysql_store_result获取一次数据之后就直接调用:

mysql_free_result(m_result);
mysql_close(m_Database);

但是有两个问题:
1.当使用长连接时(即connect之后一直不close),如果最后会调用mysql_close,需不需要每次都调用mysql_free_result呢?
2.当mysql_close调用之后,m_result的数据是否还可以用。
先说一下结论: 1.必须每次调用。因为经过测试,每次mysql_store_result的指针都是不同的,可见并不是共享了同一块buf。
2.还是可以使用。经过valgrind扫描,只调用mysql_close的扫描结果是:

==9397== 16,468 (88 direct, 16,380 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 5
==9397==    at 0x40219B3: malloc (vg_replace_malloc.c:195)
==9397==    by ...

最后更新于 .

一般来说,函数指针的用法是比较简单的。 比如对于函数:

int innerFunc(int num);

可以使用:

int (*ptrFunc)(int);
ptrFunc = innerFunc;//或&innerFunc

或者为了复用:

typedef int (*FUNC)(int);
FUNC ptrFunc;
ptrFunc = innerFunc;//或&innerFunc

但是当你使用类成员函数指针的时候,会发现完全不是那么一回事!而我今天就杯具的遇上了。。
废话不多说,直接上代码吧

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;

class Foo
{
    public:
        string m_str;
        Foo()
        {
            m_str = "";
        }
        void test(char* str,int num)
        {
            m_str = str ...

每月存档

去年

2009

明年

2011