Posted by rainx on June 6, 2008
scws是 http://hightman.cn 推出的中文分词系统,简单,开源,很实用.. 目前只在我的 centos 上试了试, 还ok ,但不知道redhat上怎样,其实主要是为了自己用, 刚好加上前端时间和chaoswang同学学了制作rpm包,就打了一下… 下面是主要的几个包: * 简易中文分词系统 http://rainx1982.googlepages.com/scws-1.0.0-1.i386.rpm *简易中文分词系统的字典文件 http://solor.googlecode.com/files/scws_dict-1.0.0-1.i386.rpm *C版简易中文分词 http://rainx1982.googlepages.com/cscwsd-0.0.3-1.i386.rpm 其中 ,几个包都是按照默认的编译参数编译的, 安装在 /usr/local/ 下, 字典文件包比较大,含四个文件,分别是 [rainx@RainX ~]$ rpm -ql scws_dict /usr/local/etc/dict_chs_gbk.xdb /usr/local/etc/dict_chs_utf-8.xdb /usr/local/etc/dict_cht_gbk.xdb /usr/local/etc/dict_cht_utf-8.xdb 感兴趣大家可以安装试试..
Posted by rainx on February 20, 2008
哈哈,一个项目可能会用到,记录一下下吧,我对插值算法了解不多,下了一个最简单的线性插值算法实现:http://www.codecogs.com/cog-79 然后由于是仅对X轴的伸展,所以再在结果上除去一个因子就可以了 代码照它给的例子改的 #include "./linear.h" #include <cmath> #include <iostream> #include <iomanip> using namespace std; #define N 12 int main() { // Declare and initialize two arrays to hold the coordinates of the initial data points double x[N], y[N]; // Generate the points for (int i = [...]
Posted by rainx on March 31, 2007
因为这段时间一直要和印度工程师打交道,无奈之下只好强迫自己多看写美剧提高一下英文听力,虽然之前不是很喜欢,但还是看了一下Friends,觉得不错,所以就开始一边BT下载一边看,可是BT下载起来太麻烦了,虽然一直用家里的Debian的Azureus下不会影响我工作时用的电脑,和隔壁的MM说起之后,她说刚好有一份自己下载刻录的DVD,然后就借给我了,呵呵, 但是拿到之后才发现,他的是mkv版本,我用我的Ubuntu Dapper 最新版的 mplayer (MPlayer 2:0.99+1.0pre7try2+cvs20060117-0ubuntu8 ) 配上完整的decoder,可以播放,但是没有声音,看了看错误提示: Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders Unknown Cook version, report sample! Could not open codec. ADecoder init failed :( ADecoder init failed :( Opening audio decoder: [realaud] RealAudio decoder opening shared obj ‘/usr/lib/win32/cook.so’ Decoder init failed, error code: 0×80040005 ADecoder preinit failed :( ADecoder init [...]
Posted by rainx on March 7, 2007
前段时间做了一个项目,项目是封装我们公司现有的一个用c++实现的一个消息中间件,使其可以让perl程序员使用,这个消息中间件是一个用TCP和共享内存实现实现的一个异步消息传输的中间件,分为两个部分,其中客户端可以调用某函数发送消息,服务器端会自动监听并且调用一个callback函数来处理这个请求, 其中客户端的封装美国部门已经用 perlxs实现了, 服务器端的程序是我来写的, 这里用到了perlembed的技术,因为服务器端程序和客户端不同,不是perl去调用c/c++的函数,二十c++去调用perl,所以我们需要将c++中嵌入perl的解释器。关于那个项目具体的情况我就不说了,这里我主要写一下c/c++中嵌入perl解释器和调用perl函数的方法…(给自己做一个备忘) 其实,大部分的内容可以从相关的perldoc中找到.. perldoc perlembed 首先是编译的参数,在这里,如果需要嵌入perl,我们可以通过perl的ExtUtils::Embed模块来生成连接的参数 编译参数 perl -MExtUtils::Embed -e ccopts 连接参数 perl -MExtUtils::Embed -e ldopts ok..下面介绍一嵌入perl的解释器 很简单,看看perlembed提供的例子 #include <extern.h> /* from the Perl distribution */ #include <perl.h> /* from the Perl distribution [...]
Posted by rainx on October 14, 2006
其实之前做Solor的时候有用过这个,但是不是PHP版本的..而是直接调用MrBrownstone的C语言版本,后来还做成了PHP extension ,但后来由于服务器到期的原因,换了服务器,新的服务器我没有root或sudo的权限,不能直接在服务器上放置应用程序,安装自己的PHP extension了,所以也导致solor关闭了,当然了,solor暂时关闭也与当时公司实在比较忙有关系,昨天晚上睡觉前突然想到要重新整理一下以前的代码,突然想到这里,就想自己用PHP实现一个Script Decoder .所以就按照之前MrBrownstone的C语言版本重新编写了一个PHP的版本,呵呵,没想到改写起来还真是挺容易的,毕竟语法比较相似,我保留了之前版本的变量和函数命名。 这个是函数页面的连接 : http://rainx1982.googlepages.com/decoderformicrosoftscriptencoder%28phpversion%29 也可以直接下载代码: jsdecoder.php 当然了,如果你有特殊的需要,希望得到PHP extension的版本的代码(运行速度上会快些),也可以和我联系(不是free的,哈哈)….
Posted by rainx on October 13, 2006
继上一次准备了PHPunit的培训之后,这两天有研究了xunit系列里的其他几个 ,如cppunit ,和 junit,发现虽然这些xunit都是声称port自junit,但各有各的特点, 相对来说phpunit和junit比较像,都有相应的命令行工具来执行, 但是cppunit就比较麻烦..还要自己写main程序,并编译执行,而且assertXxxx系列的函数在cppunit里变成了一大堆的宏,感觉怪怪的,并且cppunit里的TestSuite和其他两个同行的范围貌似也有些区别,好像一个TestSuite更像是phpunit里的一个TestCase,然后一个Runner可以同时可以执行多个TestSuite……. 除了xunit,之后还看了一些相关语言的profiling 工具, 包括php的apd,perl的 Dprof,c 的gprof,呵呵,发现相比之下php的profiling还是比其他的语言麻烦的,需要手工的修改程序加上 apd_set_pprof_trace(); ,而其他的profiling工具只是在编译或者运行是加一个参数就可以了..不知道以后php会不会出现更加方便的profiling工具。
Posted by rainx on October 10, 2006
随意的写些今天的收获… 今天和青炎同学讨论了一下一些异步IO,多工的一些问题 ,了解了一些以前比较关心却又一直不是很清楚的问题(虽然现在也不是太清楚),比如linux的系统调用 poll(select) 和 epoll的区别… ,青炎举了这样一个例子,类似数字电路的状态,有高电位和低电位两种, 而poll(select) 只能在电位转换之后,比如高电位转为第电位来获知状态的改变,而epoll是可以关注状态转换的事件,而不必时刻检查它的状态..so 所以这就不难理解epoll为什么在很多情况下效率很高的原因了,我想freebsd的kqueue应该也是和epoll类似的情况吧.. 顺便今天有找了一些关于epoll的链接 http://hi.baidu.com/xiexin/blog/item/5c6f55fb696a47166d22ebf0.html 然后不小心搜到云风大哥的blog上的文章 http://blog.codingnow.com/2006/04/iocp_kqueue_epoll.html 大概意思是用一些机制减少event的数量从而可以少使用epoll之类的东东.. 呵呵,btw之前都不知道云风有blog呵呵,收藏之了,我很早就看过云风的主页了(那个时候他还没有blog),里面很多有用的文章哦 相关地,让我联想到使用select ,poll作为底层实现的libevent …… 很不错的样子
Posted by rainx on October 8, 2006
呵呵,今天要写一个性能测试的程序,由于之前用过boost的thread,所以就采用了boost的thread库 程序大概是根据指定的参数来生成多个线程来进行一个操作…本来满简单的..但是之前时候不知道boost有进程组的支持…所以只能自己动态的建立一大堆 thread ..放到一个容器中..然后在遍历join下,然后再在结束前delete他们,很麻烦..不过最后还是实现了。不过就在完成之后,同事晓哲给我看了一下他的程序..用到了boost的thread_group ,这才发现原来boost也有进程组的支持阿…晕….刚才试着写了一个简单的程序…呵呵,根据指定参数生成指定个数的子程序… 很简单阿..再也不用遍历一遍每一个join一下了..join_all就搞定了.. 下面是代码,呵呵,很简单吧 #include <boost/thread/thread.hpp> #include <boost/bind.hpp> #include <iostream> using namespace boost; using namespace std; void runChild(const int n) { cout << "我是第" << n << "个子线程" << endl; sleep(1); cout << "进程" << n << "退出" << endl; } int main(int argc, char** argv) [...]
Posted by rainx on September 3, 2006
对Bt感兴趣好一阵子了, 不过一直都没有好好分析一下bt所应用的协议, 今天 上了一下bt的官方网站, 研究了一下 bt 的协议 (http://www.bittorrent.org/protocol.html) , 费尽千辛万苦才读了大约2/3的内容,发现英文的读起来不爽(虽然比较简单),所以搜了搜中文的网站,发现早就有人翻译过这篇协议说明了, 在这里: http://callof.net/Site/pView.Asp?id=614 还有比较好的一篇就是姚同学的 Ctorrent 程序源码分析 http://yaoxuchen.googlepages.com/ctorrent 虽然已经有了精彩的文章,我还是把我分析时所画的图扔上来吧,呵呵 A 我自己分析的Bt客户端下载的流程 B 分析tracker信息时用ethereal的截图
Posted by rainx on August 17, 2006
呵呵, 很久没有更新blog了的说 因为我突然想到之前我做得一个项目时积累的一些心得,呵呵,怕自己忘记了,所以写在Blog里好了, N个月前我接触了一个移植美国的一个C++系统的项目,项目的目标是要将所有基于不同数据源的数据统一为单独的接口,这样用户访问底层数据源信息就不用同时调用N多不同的接口进行访问,而且ACL等信息管理也可以统一到一组前端服务器上来控制,这样更加便于管理。 项目涉及到的数据源有各种各样不同的类型,有数据库,文件系统,还有各式各样自己开发的数据管理系统。所以美国方面就采用了一种类似设计模式中的Adaptor模式的技术来处理与后端数据源交互的部分。其中比较灵活的是针对每个数据源的Adaptor都放在一个单独的.so文件中…这样如果有新的数据源加入的话,并且添加新的adaptor之后可以由一个配置文件来管理和维护,这样大大的提高了程序的通用性,例如这次中国移植这个程序的时候,虽然中国和美国的数据源不同,但是我们移植的时候并没有修改主体程序的部分,只是写了新的Adaptor,并且修改了配置文件就可以了。 N个月之前的某天我按照他的思想写了一些类似的代码,就是可以根据指定的路径来动态载入(dlopen) 需要的类并且实例话之(当然了,程序经过简单的修改就可以变成可配置的),我这里简化的很多,当然了,由于主体程序是可以在开发adaptor之前开发的,所以adaptor需要实现相同的接口才行(在这里,构造函数和主要处理函数都是虚函数),每个Adaptor需要遵循。对了,不要将它和设计模式里的Adaptor模式挂钩,虽然名字很像,但是这个例子不是Adaptor模式的例子(更像是Factory,呵呵) [代码下载] 这个代码在握自己的ubuntu linux 的机器上编译通过, 下载后 tar xvf adaptor.tar cd step1 ; make 即可,但是需要修改test.c 里面的ADDSOPATH ,和DECSOPATH 到你的path哦,另外程序为了解决map中动态添加的adaptor对象的释放问题,是用了boost的智能指针shared_ptr,如果编译的话也要安装boost的库哦。 不太多说明了,附上部分代码: loadAdaptor函数 typedef boost::shared_ptr<adaptor> adaptor_p; int loadAdaptor(map<string, adaptor_p>& adaptorMap, const char* path) { void* handle = NULL; create_t* create_adaptor; handle = dlopen(path, RTLD_LAZY); if(handle [...]