博文

目前显示的是 八月, 2012的博文

2012-08-27

首先抱怨一下,google code越来越不好用了,被某防火墙封锁的厉害,老连不上。我想把东西往github上迁移,但是,git我还一直用不习惯,比如没有像TortoiseSVN这么方便的图形化的diff工具。虽然有个TortoiseGit项目,但是貌似不怎么stable。最近我被调去做搜索了,所以之前做的关于flash p2p的事情就暂且放一放。一下子又进入到了一个新领域,有很多可以学习的。我比较后悔为什么没有一毕业的时候就来做搜索,因为它的技术门槛很高,并且充满了挑战,无论是算法还是OS层面的优化。我刚才在想,假如,我重新回到完美去做网游。除了之前我想的那些关于基础框架(如IO库、xdb)的改善外,还有很多新的产品可以做。比如分布式日志搜集以及实时分析,比如对角色信息做实时索引。打开一个页面,就像在淘宝搜商品一样,搜“北京的”、“18-23岁”、“性别女”、“水瓶座”、“单身”、“10级以上”等等,然后找到合适的就去搭讪。对于运营人员来说,这个也可以作为很实用的运维工具,比如搜索不正常的玩家。然后上周末看了看如何使用javascript做访问统计。主要是看google analytics。可惜它的代码是处理过的,函数名什么的都已经不见了。好在ga.js代码不长。昨天顺便在我们自己的某页面上发现了一个XSS漏洞。哎,对用户的每个输入都得小心啊。土豆已正式退市。部门合并正在如火如荼的进行着。我不知道出于何种理由让Gary选择了youku而不是其它一家业务重合度不那么大的公司。现如今土豆已经退市,我也很想问老古,youku从这次合并中究竟得到了什么?总之在我看来,现在是对两个公司的中层管理人员最大挑战的时候,是否能把合适的人放在合适的位置上让他们依然去做自己擅长或者喜欢的东西?

准备山寨一个Google Analytics

不用Google Analytics的原因很简单:我需要把数据存在自己的服务器上,然后按我的需求做统计。所以我需要重新山寨一套Google Analytics,大体上来讲,基本流程是:页面加track codetrack code搜集完信息后,向后台的http服务器发请求通过http服务器的access log来分析关于页面的track code如何工作,在GA的网站上有一些介绍,其中关于如何搜集浏览器事件我还不大清楚,得去看看GA的代码,反正都是open source的,多花点时间,总能搞清楚。http server这里我准备这样:给nginx写一个module,首先在内存中维护一个local log buffer,大约200条。然后nginx连kafka。kafka可以视为是一个Java Message Service,但是它的生产者是push模型,而消费者是pull模型。当local log buffer满了就往kafka提交一次。kafka此时可以视为是一个临时文件存储,它存储最近7天的日志。kafka的另外一端是hadoop(虽然我的大领导很不喜欢它),把kafka作为一种特殊的数据源,为它实现一个input format,然后运行map reduce将日志从kafka中拽到HDFS中。下一步就是在HDFS中对日志做分析了。我现在比较犹豫的是到底是给nginx写module,还是自己写一个http server处理请求。因为我对nginx不熟悉,贸然下手给它写代码也许会死的很难看。反正我的请求量也不高,每秒也就几千,用libevent 单线程就能搞定,实在不行多开几个进程/机器。用nginx的好处是我的那些静态文件(如ga.js)能够一并放给nginx处理。你说呢?

Windows下用stat函数得到的文件size可能不准

下面这段测试代码用于在TEMP目录下创建一个文件,然后随便写入一点数据char* tempdir=getenv("TEMP"); std::ostringstream oss; oss<<tempdir<<"\\1.txt"; std::string filename=oss.str(); FILE* f=fopen(filename.c_str(),"wb"); char buf[]="abcdfdfdf"; fwrite(buf,1,sizeof(buf),f); fflush(f); Sleep(10000000); fclose(f); 如果你有VC,可以编译试一下。运行这段代码,然后开一个命令行窗口,用dir命令获取这个文件的大小。D:\Users\cm>dir %TEMP%\1.txt在我机器上(Windows 7 64bit),每次的测试结果都是发现这个文件的大小是0。如果你自己写一个程序,用_stat(或FindFirstFileEx)函数去拿文件大小,发现也是0。但是,如果,此时对这个文件做一点读操作,比如用more命令查看下这个文件,然后再获取文件大小,那么就一切正常了。发现这个问题是因为,我在用leveldb的时候,发现虽然我通过fwrite函数写了log文件,然后flush了,但是接着用_stat函数去拿文件大小的时候,文件大小是0。而碰巧,跑TESTS的目录恰好在%TEMP%目录下,否则也不会这么糟了。解决办法:用GetFileSizeEx获取文件大小,而不是_stat。

程序中如何启用openssl的AES-NI ?

昨天我贴了一个测试报告,openssl在启用了AES-NI后,做AES加解密的时候,效率有8-9倍的提升。但是当我自己写了一个程序去测试的时候,结果却并非如此。 首先,openssl有两套接口,一套EVP的(与具体算法无关),一套较低level的,针对特定算法的。 EVP的例子如下:EVP_CIPHER_CTX ctx; EVP_CIPHER_CTX_init(&ctx); ENGINE_load_builtin_engines(); ENGINE* engine=ENGINE_by_id("aesni"); if(engine==NULL){ printf("aesni not found\n"); } EVP_EncryptInit_ex(&ctx,EVP_aes_128_cbc(),engine,test_key_128,test_init_vector); int out; EVP_CipherUpdate(&ctx,output,&out, test_plain_text, inputlen); 需要特别说明的是:在openssl 1.0.0中,新添了一个叫做aesni的engine,只有当你指定了使用这个engine的时候,才会使用CPU的AES指令。但是到了openssl 1.0.1之后,这个engine被去除掉了,变成运行期自动监测是否使用AESNI。1.0.1版本中EVP_aes_128_cbc()这个函数的实现如下:
extern unsigned int OPENSSL_ia32cap_P[2];
#define AESNI_CAPABLE (OPENSSL_ia32cap_P[1]&(1\<\<(57-32))) const EVP_CIPHER *EVP_aes_128_cbc(void) { return AESNI_CAPABLE?&aesni_128_cbc:&aes_128_cbc; }
除了EVP,还有一套低级接口如下:intAES_set_encrypt_key(constunsignedchar *userKey, constint bits, AES_KEY…