Colin Work Shop (C)
Name: Colin Xu
Age: 25
Location: Shanghai, PRC
Ycul Blog    Colin Work Shop    Edit My Blog
   Profile
Name:    Colin Xu
Age:    25
Location:    Shanghai
   Time & Date
   Categories
   · All
   · Mess
   · My work
   · Feelings
   · Temp
   · Unclassified
   Recent Comments
   · 06/26 老鼠,老虎,傻...
   Friends' Blogs
   · Live Space, 好朋友才能看...
   Trackers' Blogs
   Google Search
Google
  Crack & Keygen Search
www.astalavista.ms
订阅 RSS
歪酷博客
Recommended Browser:
IE 6.0/Firefox 1.5 or Higher
Recommended Resolution:
1024*768 or Higher
      Colin Work Shop
                        some little works
   Blog
SuperColin @ 2010-01-01 00:00

虽然尚未达到历史高点
都是谁 @.@ 劳驾来的人留个记号吧...


 
SuperColin @ 2008-07-05 21:39

变了不少
能来这么多人不容易
希望今后还能大规模聚会


 
SuperColin @ 2008-06-27 01:22

和师兄一起去拍照,看着来来往往的毕业生,本科生,硕士生,博士生,不禁再次感慨时光之飞逝。

感情是复杂的。

看着光华楼前人头攒动争拍毕业照的情景,想起了两年前自己毕业的时候。同层的兄弟,大家穿着学士服留下自己属于本科最后的影像,在曾经住过的楼前合影,在送走离开的兄弟时流着属于男人的眼泪。分别不会是美好的,可是只有分别,才让大家更珍惜曾经在一起的日子。

而另一方面,毕业的感情似乎也在淡化,似乎很难在一个大的环境下营造一个共同的毕业气氛,同系的也好,同实验室的也好。不知道该怎么去形容这样一种变化,只是觉得这种变化随着时间的推移变得越来越普遍。

真的很怀念两年前的那段时光。



 
SuperColin @ 2008-05-19 20:54

最近MATLAB作实验,需要对高维矩阵的每个元素进行操作,MATLAB矩阵运算的优势无法发挥出来,只能用若干循环来实现,效率很低。想到了mex中实现C接口来使用C完成部分工作,可以极大提高效率,于是尝试利用mex接口来完成这部分工作。找了若干参考书,但发现写的并不好,不适合没有mex经验的人使用,可是会mex的人只需依靠MATLAB帮助即可完成工作,对他们来说更没有什么用处。于是写点自己在windows平台下适用MATLAB的mex接口的体会。

mex的适用情况:需要大量循环或者遍历,不想改写已有的C模块,这些情况下适用mex接口比较合适。

mex的环境要求:已安装MATLAB,已安装合适的C编译器。

mex使用:
首先在MATLAB中使用mex -setup设置工作环境和相应的配置文件。mex其他参数详见帮助。
对于需要使用mex接口的程序,文件的扩展名需要为c/cpp,然后用mex filename进行编译。编译完成后会生成dll文件(7.1之前)或者mexw32文件(7.1之后)。
编译完成后,即可像m文件一样适用mex。

mex接口的结构:

//////////////////////////////////////////////

#include "mex.h"

///////////////////////////
// Computational Routine //
///////////////////////////

// interface & function declaration

return_type myFunc1(parameter1, parameter2, ...);
return_type myFunc2(parameter1, parameter2, ...);
...

// interface & function defination, implementation

void myMex(parameter1, parameter2, ...){
    statements
}

return_type myFunc1(parameter1, parameter2, ...){
    statements
}

return_type myFunc2(parameter1, parameter2, ...){
    statements
}

...

/////////////////////
// Gateway Routine //
/////////////////////
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){

    ...

    myMex(parameter list);
}

//////////////////////////////////////////////

调用mex时,MATLAB将输入的数据通过入口子程序赋给输入参数指针,同时创建由输出参数指针指向的输出矩阵,然后将这些指针作为计算子程序的参数传递到计算子程序进行计算。

mexFunction在调用C函数时,直接使用指针传递参数是比较方便的,一方面需要计算的结果往往是一个矩阵而不是一个数,另一方面以值传递值返回的方式,同样需要赋值给mex接口的指针。

在mexFunction的参数中:
nlhs表示输出参数的个数
nrhs表示输入参数的个数
类型为mxArray的指针数组,用于指向输出的每个参数
类型为mxArray的指针数组,用于指向输入的每个参数

为了mex的正确执行,也是良好编程习惯的要求,需要对输入参数和输出参数进行个数和类型的检查:
mxGetClassID //获得指针所指变量类型
mxIsNumeric, mxIsCell等,检查指针所指变量是否为符合某种要求的变量类型。更多可查阅帮助。
参数检查过程中可使用mexErrMsgTxt输出错误信息。

mxGetM, mxGetN,获得矩阵的行数和列数
mxGetDimensions,获得矩阵维数
mxGetPr,mxGetPi,获得矩阵实数部分、虚数部分的指针
mxGetString, 获得字符串内容
mxGetElementSize, 获得存储矩阵元素所需要的字节数

mxCalloc,内存分配。用mxCalloc不用calloc和malloc,因为mxCalloc会自动释放内存,不需要手动free了。

mxCreateString, 创建1*N的字符串矩阵
mxCreateDoubleMatrix, 创建2维双精度浮点矩阵,可以是实数(mxREAL)或者复数(mxCOMPLEX)
mxCreateStructArray, 创建N维结构体矩阵
mxCreateCellMatrix, 创建二维单元矩阵
mxCreateNumericArray,创建n维数值矩阵

mexPrintf, 重新封装的printf

mxSetFiled, 设置结构体矩阵的域
mxSetCell, 设置单元矩阵的单元值
mxSetPr, 设置矩阵实数值
mxSetPi, 设置矩阵虚数值

mxCallMATLAB, 调用MATLAB中其他内建函数、自定义M文件、mex文件。

具体使用方法可查阅MATLAB帮助。

使用mex时的注意事项:
1.MATLAB调用mex接口时,将参数个数及参数指针传入接口子程序,由接口子程序完成指针和调用变量的赋值、输出数据的内存空间分配,接口子程序再将参数指针或经过赋值的变量作为参数传递给C的计算子程序,完成调用过程。调用时应注意指针所指对象的正确性,为处理正确最好做相应的强制类型转换。
2.mex并不便于调试,因此应在C的IDE中用测试集调试后再放入mex文件中。
3.MATLAB中指向二维及高维数组的指针递增方式是按行递增的,而C中是按列递增的,因此计算index时要注意位置。


下面给个我的例子:
/////////////////////////////
#include "mex.h"

int LSB(int pixel);
int tier_score(int s_1,int s_2,int x_1,int x_2);
int add_sub_select(int pixel_1,int pixel_2);
void cost_matrix_gen_c(double *output,double *x,double *len_x,double *y,double *len_y){
    int i,j;
    int s_1,s_2,x_1,x_2;
    for (j=0;j<*len_y;j++){
        x_1 = (int)*(y+j*2);
        x_2 = (int)*(y+j*2+1);
        for (i=0;i<*len_x;i++){
            s_1 = (int)*(x+i*2);
            s_2 = (int)*(x+i*2+1);
            *(output++)=tier_score(s_1,s_2,x_1,x_2);
        }
    }
}

int tier_score(int s_1,int s_2,int x_1,int x_2){
    int score;
    if (s_1==LSB(x_1)){
        if (s_2==add_sub_select(x_1,x_2)){
            score = 20;
        }
        else{
            score = 0;
        }
    }
    else{
        score = 0;
    }
    return score;
}

int LSB(int pixel){
    return pixel%2;
}

int add_sub_select(int pixel_1,int pixel_2){
    return LSB((int)pixel_1/2 + pixel_2);
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
    double *y,*x,*output,*len_x,*len_y;
    int n_row,n_column;
   
    if (nrhs != 4 || nlhs != 1){
        mexErrMsgTxt("invalid number of input/output arguments!");
    }
    //参数个数检查

    n_row = mxGetM(prhs[0])>mxGetN(prhs[0]) ? mxGetM(prhs[0]) : mxGetN(prhs[0]);
    //获得输入向量元素个数

    n_column = mxGetM(prhs[2])>mxGetN(prhs[2]) ? mxGetM(prhs[2]) : mxGetN(prhs[2]);
    //获得输入向量元素个数

    n_row = n_row/2;
    n_column = n_column/2;
   
    plhs[0] = mxCreateDoubleMatrix(n_row,n_column,mxREAL);
    //建立n_row*n_column大小的输出矩阵

    output = mxGetPr(plhs[0]);   
    x=mxGetPr(prhs[0]);
    len_x=mxGetPr(prhs[1]);
    y=mxGetPr(prhs[2]);
    len_y=mxGetPr(prhs[3]);
    //获得输入、输出指针   

    cost_matrix_gen_c(output,x,len_x,y,len_y);
    //调用计算函数
}




 
SuperColin @ 2008-05-19 14:37

悼念地震中罹难的人们
感谢震后无私救援的同胞


 
SuperColin @ 2008-05-08 14:29

前天,一个好友发我一条短信:
你知道两只眼睛的关系吗?它们一起眨,一起动,一起哭,一起笑,一起看,一起睡~谁也离不开谁...尽管它们很难见面...其实友谊就应该是这样。生活中没有朋友是悲哀的,这周是世界好友周,如果你愿意,把这条信息发给你所有的好朋友,也包括我。看看有多少人会回发给你。另外借用你的手帮我摸摸你的头,小声的对自己说:一定要照顾好自己,善待自己,与人为善,记得健康快乐比任何东西都要重要。

我没有回复给他,也没有再转发给其他人。既然友谊不受地域阻隔,又怎么会因为少发个短信就断绝了联系呢?是吧

其实这类相互转发的短信我是从来不会转发的,因为对这些形式的东西并不在乎。但每次看到短信,总免不了思考一番,毕竟形式的背后还是有些内涵的。

友谊是需要维系的,但并不是说如果一个曾经和你分享各种心情的朋友现在不再这么做就意味着你们不是朋友。曾经和别人交流过这个问题。我们需要信任需要交心,同时我们也需要空间。有句话是这么说的:一份忧愁两个人分担,就只剩下一半;一份快乐多个人分享,就变成了n份快乐。而事实是,有的时候我们不愿意自己的朋友为自己担心,或是不希望自己的快乐称为他人的痛处,所以选择了沉默。只有关系异常亲密的人,才真正有可能做到99%的毫无保留,最后1%往往仍然只是善意的谎言。摩羯座的人似乎更是如此。
所以说呢,真正维系友谊的不是各种形式,而是无形的情感,是友谊本身。也许相隔多年都不曾联系,但再次相遇时仍能拾起当年的那份感觉。不过君子之交淡如水的境界,真的是很难达到的。



 
SuperColin @ 2008-04-15 12:11

硬盘大了,显示器好了,HD-movie几乎是必然的追求。

自己载的第一部HD是1440*816的the day after tomorrow,占掉9个G的空间。自此一发不可收拾,全面更新自己的经典电影收藏为HD版本。得承认,效果确实有相当大的提高,虽然代价也是不菲的。

硬盘还是赶不上光学存储介质的发展,当blu-ray战胜了HD DVD,一部片子就要去掉25G甚至50G的时候,即使1T硬盘仍在疯狂降价,一块硬盘也存不下几部电影。比较理想的还是1080p液晶,蓝光播放器,外加数字7.1环绕,构造真正的影院级效果,不过,钱啊T.T再忍忍吧,先凑合看着-,-


 
SuperColin @ 2008-04-13 18:13

RAM:
4GB, including 1G DDR-II 800 *2 (dual-channel), 2G DDR-II 667, of which 512M is allocated as virtual hard drive

Hard Disk:
>1TB, 250GB SATA-II *2, 250G PATA *2,  80G PATA
softwares, games, hd-movies, musics, audio-books, ebooks, et al.

CPU:
Intel Pentium Dual-Core E2140(M0 stepping), overclocked to 3GHz



 
SuperColin @ 2008-03-27 21:00

VC6下OpenCV很容易搞定,但VS2005的编译检查更加严格,所以折腾了很久才弄好。

1.安装Windows Server 2003 SP1 SDK

2.安装DirectX SDK 9.0c(包含DirectShow。新的SDK把这部分去掉了,更名为Directx SDK extras)
编译DXSDK的基本类BaseClasses,几个文件需要修正一下以通过VS2005的检查

ctlutil.h
operator=(LONG);
改为
COARefTime& operator=(LONG);

wxdebug.cpp
static g_dwLastRefresh = 0;
改为
static DWORD g_dwLastRefresh = 0;

winutil.cpp
使用
for (Count = 0;Count < Result;Count++)

声明并初始化Count
UINT Count=0;

outputq.cpp
使用
for (iDone = 0

声明并初始化iDone
long iDone=0;

然后生成Debug版和Release版的BaseClasses

3.Platform SDK的include和lib目录分别加入VC++的include和library目录

4.DXSDK的
include
Samples\C++\Common\Include
Samples\C++\DirectShow\BaseClasses
加入VC++的include目录

DXSDK的
Lib
Samples\C++\DirectShow\BaseClasses\Debug
Samples\C++\DirectShow\BaseClasses\Release
加入VC++的library目录
也可以把前面编译DXSDK生成的strmbasd.lib和STRMBASE.lib复制到DXSDK的lib目录中从而不要添加这两个目录

最好将Platform SDK的include和lib放在VC自带SDK的前面。

4.编译OpenCV的opencv和opencv_directshow
一般只要编译32位平台的debug和release即可
如果上面编译正确这里不会出问题,要注意
cvaux\include\cvaux.h第1137行有一个因保存编码问题导致的乱码,使得后面的CvSeq无法定义。修改注释后重新编译。

5.OpenCV目录设置
cv, cvaux, cxcore, ml, otherlibs\_graphics, otherlibs\cvcam, otherlibs\highgui
这几个库的include和lib分别加入VC++的include和library目录
lib加入到VC++的library目录

6.测试
新建项目,添加依赖的库,如果是debug版则添加
cxcored.lib cvd.lib highguid.lib cvauxd.lib cvcamd.lib
release版则添加
cxcore.lib cv.lib highgui.lib cvaux.lib cvcam.lib
用自带的sample试试,如果提示缺少stdafx.h则把#include "stdafx.h"添加到源文件中。




 
SuperColin @ 2008-03-27 20:58

tnnd浏览某ajax技术页面居然遇到这个。。。
kaspersky干掉无法启动无法安装
载一堆木马下来并且注入系统进程
写入explorer进程便于远程操作
等等

说说查杀过程。我这里遇到的情况是kaspersky能发现但无法彻底清除,若重启则
kaspersky无法启动,即使卸载重装也如此。

命令行安全模式(不要启动explorer)

sreng扫描一下,查看自启动文件,配合 taskmanager=>browse 对照相应文件的生成时
间,一般会发现windows目录下的若干exe文件(一看就知道假的)以及挂在
ShellExecuteHooks上的1到2个。查看加载驱动部分可以发现从
Documents and Settings\<user name>\Local Settings\Temp
中加载的几个tmp驱动,以及windows\system32\drivers下的一个当天生成的驱动
BHO可能会有一个
Program Files\Internet Explorer\PLUGINS\NewSys55.sys之类的一个

删掉这些文件,主要有:
windows下,时间排序,最新时间生成的几个exe和dll
windows\system32下,时间排序,msosiocp.dll等最新生成的几个dll和cfg。注意不要
误删wpa.dbl否则无法启动还要再copy一份,另外还可能有你用的杀毒软件或者防火墙产
品实时监视的几个文件不要干掉。
windows\system32\drivers下,最新生成的sys驱动
windows\system32\setup\en_1072.bin
Program Files\Internet Explorer\PLUGINS\NewSys55.sys或类似
删除操作在task manager下进行,不要开explorer。如果干不掉,记下名字dos下或者
windows修复模式下干掉。

注:具体什么文件要基于经验判断,如果你不能判断是否病毒,另找机器上网搜之或
上log咨询他人。

open regedit
干掉这些:

HKCR\CLSID\{50632D5C-B71B-4ba0-B012-3DC6F15C011B}
SOFTWARE\Classes\CLSID\{50632D5C-B71B-4ba0-B012-3DC6F15C011B}
(这两个指向msosiocp.dll)

HKCR\CLSID\{AE27505C-C46F-4eb2-9A17-5D1E1F46BC09}
SOFTWARE\Classes\CLSID\{AE27505C-C46F-4eb2-9A17-5D1E1F46BC09}
(这两个指向en_1072.bin)


HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks
下的
{50632D5C-B71B-4ba0-B012-3DC6F15C011B}
{AE27505C-C46F-4eb2-9A17-5D1E1F46BC09}
及其他可能挂在explorer上的调用.不确定的可以去HKCR\CLSID找对应的变量,确定其指
向的文件。windows\system32\shell32.dll和office 2007的groove是安全的。

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RUN
下,前面分析的可疑任务

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
下,AppInit_DLLS中除杀毒软件外的可疑加载

HKCR\AllFilesystemObjects\shellex\ContextMenuHandlers\winsync32

完成操作后启动kaspersky,如果无法启动重新安装,如果仍然无法启动用
ComboFix修复一下