Profilo di ChaosConstLatest news from ChaosCo...BlogElenchi Strumenti Guida

Blog


31 marzo

袁行远要努力不放弃!


商业实用技术,不过我做的就要做得最好:3月30日,普加搜索自动提示上线。





平均响应时间

多音字

中文拼音混合输入

中文模糊匹配

拼音模糊匹配

英文字母大小混合显示

英文支持

避免首行建议重复

普加

30ms

鉴别

支持

支持

部分支持

支持

支持

支持

Google

50ms

鉴别

不支持

不支持

部分支持

不支持

支持

支持

百度

50ms

鉴别

部分支持

支持

不支持

不支持

支持

支持

优酷

100ms

不支持

支持

支持

不支持

不支持

支持

不支持

口碑

100ms

鉴别

不支持

不支持

不支持

不支持

不支持

不支持

豆瓣

50ms

兼容

不支持

不支持

部分支持

重复显示

支持

支持

爱帮

50ms

兼容

不支持

不支持

不支持

支持

支持

支持


以上统计自2009年3月30日。



14 marzo

Unicode(UTF8)中日韩统一汉字(U+4E00–U+9FBF)判断程序

还是工程应用的文章,utf8 3位汉字编码,至少在中日韩统一汉字中是这样,但怎么判断一个长度为3的string是不是汉字呢?
答案一:U+4E00–U+9FBF
答案二:访问www.unicode.org
答案三:参考这篇文章
答案四:下面这段代码
int is_utf8_zh_basic(const char * str)
{
    if (strlen(str)<3) return 0;

    /*basic check if str is 1110xxxx 10xxxxxx 10xxxxxx*/
    if ((str[0]+256)/16!=14) return 0;
    if ((str[1]+256)/64!=2) return 0;
    if ((str[2]+256)/64!=2) return 0;

    int code=(((str[0]+256)%16)*64*64+((str[1]+256)%64)*64+(str[2]+256)%64);
    if ((code>=0x4E00)&&(code<=0x9FbF))  return 1; else return 0;
}
统计扫描百兆以上级数据时常常遇到匪夷所思的字符,用这个过滤一下吧。



13 marzo

memcached简单的使用教程

这是工程应用性质的文章:memcached是数据快速存取的工具,wikipedia和facebook就用了它提高速度。具体情况可以wiki.

c/c++里面使用memcached本来是很简单的事情,但就是没有人说,非要我去读libmemcache的实例代码才行,manpage也没有说清楚(但还不得不看)。如果要使用memcached,步骤如下:

1 安装memcached
  你可以去官网上下载,也可以sudo apt-get install memcached
2 测试你刚才的安装,
  比如运行 memcached -d -m 64 -l 127.0.0.1 -p 12300
  -d表示后台, -m 64表示使用64MB内存,-l 127.0.0.1 -p 12300 表示监听127.0.0.1:12300端口
  没有任何消息就是运行成功
3 安装libmemcached
  这个就不要apt了,因为没有精确的libmemcached包,乖乖去官网下载吧。这个东西还需要libevent,这个没法apt,libevent安装的时候最好装到/usr/lib里面,不然libmemcached还不能运行。
4 测试libmemcached
  找一个文件比如test,然后运行memcp test --servers=127.0.0.1:12300
  这样就把test拷贝到memcached管理的内存里面了。
  memcat test --servers=127.0.0.1:12300
  看看是不是刚才的那个文件。

该装的全装了,我们可以改代码了。

(以下引自:wikipedia)

将纯粹使用数据库查询的程式码加上memcached支援是很简单的,假设这是原来的程式码:

function get_foo (int userid) {
result = db_select("SELECT * FROM users WHERE userid = ?", userid);
return result;
}

加上memcached的快取机制后:

function get_foo (int userid) {
result = memcached_fetch("userrow:" + userid);
if (!result) {
result = db_select("SELECT * FROM users WHERE userid = ?", userid);
memcached_add("userrow:" + userid, result);
}
return result;
}
(wikipedia 引述完毕)
但我们需要初始化,而且需要c/c++的表述形式:
首先修改makefile,在LIBS里面加上-lmemcached,比如原来 gcc test.c,现在 gcc test.c -lmemcached。这个库就是libmemcached提供的。
然后添加#include<libmemcached/memcached.h>,这个文件也是libmemcached提供的。
主函数里面需要添加:
    memcached_st *memc;
    uint32_t  flags;
    memcached_return rc;
    memcached_server_st *servers;
    memc= memcached_create(NULL);

    servers= memcached_servers_parse("127.0.0.1:12300");
    memcached_server_push(memc, servers);
    memcached_server_list_free(servers);
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0);
   
这就是初始化的全部代码,可以设置很多东西,不过我现在只要一个服务器,就看一句话:
    servers= memcached_servers_parse("127.0.0.1:12300");
这就是指明要连接到位于127.0.0.1监听12300端口的memcached程序. 其他都不管。

我最后用一段修改后的代码介绍两个函数,memcached_get和memcached_set,都可以man出来。

        char * result_str; /*这个就是查询的结果*/
        std::string query="要查询的数据名";

        result_str= memcached_get(memc, query.c_str(), strlen(query.c_str()),
                &result_str_length, &flags, &rc);

        if (rc == MEMCACHED_SUCCESS)
        {
            printf("%s",result_str);
            free(result_str); /*一定要free掉 memcached传回的数据*/

            continue;
        }
        else if (rc == MEMCACHED_NOTFOUND)
        {
            /*读取数据*/
            ...
            rc= memcached_set(memc, query.c_str(), strlen(query.c_str()),
                    str_result.c_str(), strlen(str_result.c_str()),
                    0, 0);
        }

这东西设计得还是很好用的,libmemcached好像是面向对象c语言风格的东西,好不好用就让我们拭目以待吧。