Archive for April, 2009
April 16, 2009 at 6:03 pm · Filed under Program
好吧, 以前也写过类似的libsvm的笔记, 不过那都是svm-train, svm-scale,
而不是真正的把libsvm编译进自己的程序.
实际上libsvm还是很简单的, 我没有用到最后的predict的部分,
因为我只是用来对已知训练集做一个Cross Validation.
struct svm_parameter设置了svm的各种参数, 我照着svm_train.c照搬了,
反正对各种参数一片茫然.
struct svm_problem 是svm的核心所在, 用于描述求解问题的参数.
svm_problem.l 描述了集合的大小, svm_problem.y 用于描述label, 即具体的分类, 而svm_problem.x 是一个二重指针, 指向 svm_node*, 用于描述每个参数的index和value.
不过需要注意的是, 在分配prob.x时, 需要分配的svm_node*的空间是 参数个数 + 1.
我在这个问题上挣扎了N久, 最后仔细看了svm_train.c的read_problem()函数,
以及svm.cpp里有关svm-train的函数, 才发现这个问题.
最后一个svm_node的index必须是 -1, 表示一个样本参数的结束.
另外就是对于参数的scale, 我先以为svm-scale是一个全局的缩放, 即y-scale,
后来仔细对比了我自己实现的y-scale和svm-scale出的样本的iteration, 有比较大的差异.
才很囧的发现其实svm-scale默认用的是x-scale.
我自己另外实现了一个对不同参数特征内部的scale, 不知道效果是不是会好点.
改天把这个笔记补全.
·· Tags: libsvm
April 13, 2009 at 8:44 pm · Filed under Gossip, Program
花了几个小时才把209上的FreeRadius + PopTop + PPPD VPN用户验证做好.
因为MySQL是编译安装的缘故, 所以相关lib和include一直没有链接上, rlm_sql_mysql根本就没有编译.
调试了半天发现验证无法进入sql{}, 最后仔细检查了configure的输出才发现. -____-#
装pptpd的时候把原来apt-get的整套pppd, pptpd都卸载了, 结果pptpd的logwtmp.so不支持2.4.4的pppd;
最后又发现不知道什么时候往radgroupreply里加了条Account-Type := Local的值, 导致验证最后会出错.
这是其一.
其二是继续在FreeRadius的rlm_sql模块上, 自己写了一个做VPN流量控制的功能.
可以通过username和其所属的group做特定限制的流量认证, 超过流量则返回Reject响应.
好久不写C代码了, 在指针上出了一堆莫名其妙的错误, 最后终于是当复习了一次C语言, 汗 -____-#
其实代码很短, 也就几十行, 我也居然就花了几个小时来调试该死的各种指针的错误…
太菜了. 不过最后的效果还不错.
其三是基于Sonic大神的VPN管理前台修改了下, 自己又加了些查看VPN使用记录和流量的功能,
提供了一个相对功能完善的用户前台.
虽然觉得自己很囧, 写个C代码写成这个破样儿, 不过真正弄完还是觉得不错 -____-#.
未来的考虑是:
1. 修改pppd的代码, 让其可以在线判断流量限制, 从而实现超过限制则断网. (好狠毒 -__-#)
2. 考虑从sql模块中剥离出流量限制的代码, 做一个新的模块.
3. 改天把笔记补上来.
·· Tags: freeradius·Linux·pppd·pptpd·vpn
April 8, 2009 at 6:59 pm · Filed under Vision
下午5:30, 润新, 成都.

好吧, 其实P过了, 调了曲线和色阶.
所以建筑物都呈现出剪影效果, 其实原图不是的.
还是有点不习惯GIMP.
April 8, 2009 at 10:57 am · Filed under Gossip
- 需要断点续传吗?
断点续传需要HTTP服务器的支持, 之前是est大神实现的s1完成的对PUT协议的支持.
client可以通过Google Gears, 不过服务器端还有很多可以考虑的地方.
首先, 如何识别一个需要resume的upload request呢?
我想用cookie应该是比较好的方法, 每次用户提出一个上传请求, 就建立一个cookie, 上传完成后删除此cookie.
这样避免了在最初的demo中, 使用随机的nonce带来的关闭浏览器就无法继续的bug.
- 如何实现?
我想把判断abortive的上传的部分交给前台和cookie去做, 而不是在nginx内部实现.
否则不仅仅会使得开发效率降低, 而且还得额外引入SQLite的代码, 有些古怪.
nginx的module应该是只负责处理PUT请求就可以了, 如果发现一个不存在的续传请求,
简单的抛出 400 Bad Request就ok.
- 目标?
tuna的目标是实现一个类似rapidshare这种下载站, 每个文件有一个默认的expiration,
下载可以推迟这个deadline.
下载被理解为一个dormforce id所发起的一个成功的GET行为.
一个dormforce id在不同IP产生的多次request均计算为一次.
- 架构?
准备采用nginx + php-fpm + php + mysql 实现, 因为是服务器上已经有的生产环境.
从209的那块新的SCSI硬盘上再单独划出一个逻辑卷做repository,
这样管理起来灵活方便些.
nginx 挂上 upload module 和 accesskey module, 用作大文件上传的hash, 和防盗链的控制.
下载的时候用php通过X-SendFile提供访问控制和请求转发.
因为upload module把文件的文件名都命名为了数字格式, 没有extension,
所以需要php提供Content-Type和Content-Disposition头.
防盗链这块, 用referer做第一级的过滤.
第二级用accesskey, 使用在GET参数里的nonce值, 请求文件, IP做一个MD5的accesskey保证这个地址在一个时间戳上, 对应一个文件和一个IP是唯一的.
第三级在php这里, 判断这个做nonce值的timestamp是否已经过期(比如300s), 如果okay则放行.
整体上应该大体就是这样.
唯一需要更改的地方就是让nginx的upload module支持PUT协议和续传.
中间需要改的地方还需要仔细看下.
·· Tags: Linux·nginx·php
April 7, 2009 at 10:36 pm · Filed under Gossip
今天准备装上nginx的upload module做些测试的, 结果发现自己的nginx 0.7.44下,
upload module没法通过编译, 问题出错在ngx_http_upload_module.c的1152行左右.
ngx_conf_merge_path_value(conf->store_path,
prev->store_path,
NGX_HTTP_PROXY_TEMP_PATH, 1, 2, 0,
ngx_garbage_collector_temp_handler, cf);
查看 ngx_conf_merge_path_value()的定义发现新的nginx中这个函数的变化很大,
改为了: char *ngx_conf_merge_path_value(ngx_conf_t *cf, ngx_path_t **path, ngx_path_t *prev, ngx_path_init_t *init);
所以修改为了下代码:
static ngx_path_init_t ngx_init_temp_path = {
ngx_string(NGX_HTTP_PROXY_TEMP_PATH), { 1, 2, 0 }
};
// for nginx 0.7.x, hack by killkeeper
ngx_path_t *_path = ( ngx_path_t *) malloc( strlen(NGX_HTTP_PROXY_TEMP_PATH) );
memcpy ( _path, &NGX_HTTP_PROXY_TEMP_PATH, strlen(NGX_HTTP_PROXY_TEMP_PATH) );
ngx_conf_merge_path_value( cf, &_path, prev->store_path, &ngx_init_temp_path);
本来想加一个预编译头的, 不过发现nginx没有定义NGX_VERSION类似的的这种宏,
就算了.
恩, 目前编译是通过了, 明天具体测试下工作正常不.
·· Tags: C++·Linux·nginx
April 7, 2009 at 4:19 pm · Filed under Gossip
终究它是你们的, 不是我的.
所以旧世界从时间的断层中恢复回来了.
虽然并不是经过我的双手.
终结它, 是因为我不想再挣扎于未来的选择.
是因为我想抛开旧世界, 重新开始.
是因为无非我不想在web这颗光鲜的大树上, 吊死而已.
我羡慕过冰岩作坊的团队,
尽管我有那么点不服气.
我也期盼过从web中找到真正的乐趣,
但是我没有.
我不想把一切兴趣最后都沦丧到obligation.
所以我只是选择把它们都终结.
选择退出, 无非是给自己不再回头的理由.
把自己的在那个时间的ID屏蔽掉,
就此忘了这个存在了一年多, 亲手创造的一切.
它不会是原点, 也不会是终点.
其实这个世界充满了羁绊,
我只是想做我最喜欢的事情.
显然, web现在不是了,
甚至很早以前, 就已经不是了.
既然做什么都不能让自己开心,
还不如就从这一刻开始放手.
一年半前, 它成为了应景的原点,
一年半后, 它也可以成为毁灭的奇点.
———————-
桌前的几本大部头,
终于可以慢慢的看了.
其实我本来不需要解释的,
为什么一定要一个解释?
再见, 旧世界.
April 7, 2009 at 3:51 pm · Filed under Gossip
我好像很喜欢一个人走路, 但很多时候我不愿意走.
其实大抵是害怕孤单和沉默.
昨天晚上买了个汉堡走了一小段路,
但是本来我是不饿的.
夜晚的时候, 灯光飘渺闪烁,
打在行走的背影上.
昨天下午的阳光很好,
阳光在玻璃外看着没这么妖冶, 只是淡淡的蒙上一层灰,
透不进来.
房间里很安静, 没有风,
我却害怕失去它.
这里写满了匆匆.
它留不住衰老.
April 3, 2009 at 10:08 pm · Filed under Program, Tech
wpmu使用php处理静态文件的模式一直让我很不舒服,
结果今天研究了N久如何绕开php来做静态文件的处理.
先选取了自己以为最简单的实现方法, 用squid做反向代理.
装上了squid 3.1, 发现网上的config教程都是2.6的, 完全不适用,
研究了manual后, 配好了反向代理,
接着, 尴尬的事情就发生了, 因为是本地做反向代理,
无疑通过nginx来进行proxy_pass的结果就是死循环…
nginx –[proxy_pass]–> squid –[http request]–> nginx –[proxy_pass]–> squid…
太糟糕了, 要解决这个问题只有通过实现两个virtual server, 并且重写host来实现反向代理.
庞大的工程. 遂放弃.
后来转向nginx的X-SendFile功能,
原理是捕捉到特定的X-Accel-Redirect头后,
通过实现一个内部的location, 来完成一个重定向.
不过事情没有这么简单, 现有栋力博客的重写规则是:
rewrite ^.*/files/(.*) /wp-content/blogs.php?file=$1;
而静态路径里也含有 /files/ , 所以会被同时重写, 最后返回一个500 Internal Error,
并且这个error是没法通过FireBug或者日志来trace的.
研究了下nginx的判断逻辑, 加了一条URL判断后终于搞定.
详细的步骤如下:
Read the rest of this entry »
·· Tags: Linux·nginx·php·squid·wpmu
April 2, 2009 at 8:24 pm · Filed under Gossip, Program
我说怎么nginx里搞了半天的防盗链没用呢,
最后发现伟大的wpmu使用了php来处理静态文件,
牛X大了.
// If we made it this far, just serve the file
readfile( $file );
寻思着把这么个php绕过, 发现更囧的事情,
静态文件的存放目录对应的是user_id,
而不是blog_path或者username, 估计是因为考虑到用户可能有多个博客,
用数字id可以统一存放.
这下好了, 想用rewrite绕过这SB设计都不行了,
因为nginx没法知道blog_path对应的那个user_id.
要么, 自己折腾个nginx module出来干这个dirty job,
要么就干脆用python写个fastcgi服务器, 用dictionary把username -> user_id存起来,
收到了请求把URL重写了丢给下一层nginx来处理静态文件,
要么就搞个squid来干缓存这事儿.
总之, 这是自从我看到wpmu是多表结构以来,
感到最崩溃的事情.
wpmu, 太牛X了!!!!!!!