CSK.Blog--个人原创Weblog

重新开始从事本行

自从今年年初发布我网站第二版后不久,变开始了长达近1年的被动局面。当然最终证明那是我的心理问题...

上周iBT考完后,这一切看似暂时的结束了,虽然不知道G/T的成绩如何,而且凭我这英语能力而言恐怕不会有什么好下场...

 

先不管这个了,总之要恢复以前的状态了。

所谓逆境催人奋发,我虽然还没到“奋发”的地步,但是在这段时间内也时刻的反省这以前的事情。至少这段时间让我明白了一件事情,人不可能面面俱到,甚至在一个领域内谋求所谓的全面也是绝对不可能的。为了追求更大的进步,或许代价就是完全抛弃其他的东西。

或许这句话就是专门用来讽刺我的,虽然混到如今,的确有那么几个能拿得出手的东西,但是真正的堪称深入的恐怕还是没有。当然我十分不苟同只懂一样,其他一窍不通这样的“专研”。不过目前对我来说的确只能专心挑一个领域深入了,其他的就让它们作为我的爱好吧(我现在终于知道了当从前的爱好成为career后的不同,前者是以获得快乐和满足为基础的,后者更多的是付出和辛勤)——对我来说,爱好的另外一个同意词就是:业余。

 

那么我该选择什么呢?恐怕我现在还不能回答,当至少有一点可以明确,我不会做美工和程序员。

 

上面其实都是离题的话,我其实想说说接下来要做的事。

由于长久没有coding, 导致我现在除了看C/C++还有母语的感觉外,对CS的东西基本已经是映像模糊了,当然耍嘴皮子的功底还不差...

学校真不通人情,这学期还有那么多coding project。不过既然前面忙完了,还是认真做好了。至少这可能是我在大学阶段最后的大作业了。

 

Computer Network:

Project: Sniffer

对,嗅探器。不过我决定自找麻烦在linux下开发,当然无论如何都是会用pcap。而且还比winpcap正统一点。不过当时和老师吹牛说要做GUI出来...所以工程量一下子翻倍。软件工程恶心的2/8原则,80%的时间我要花在界面上....

选择Linux的原因是不想和windows下的成熟应用冲突,我觉得Iris还是不错的东西,但linux下就不同了...所以大家有兴趣也可以期待,这可是我大学最后一个完整的作品了。(唉,都还没做已经吹牛了)

 

CG:

不是动画的CG....是图形学,虽然十分不苟同这个任课老师,而且这门课根本就没听过...但是我还是蛮佩服他比较务实的风格。大作业目前我还不确定做什么,虽然规定的几个题目,如产生3D曲面可以练练算法,但是感觉总有点傻。而且今后不太想往图形学方向深入(要深入也是搞美术设计,图形学算法就免了,比较无聊)。所以原本打算利用这门课作第一个3D demo! 呵呵,somnia如果在看得话可以先构思音乐了... 至少目前对demo的一些技术细节我还是比较了解的。不过目前看来很可能是和实验室的filestorm合作一个project....不过我觉得那很可能是CV而不是CG的project..不知道老师会不会同意...

 

EZ-UML plugin for Eclipse

去年暑假合作了EZ-UML,但是可惜的是没有继续下去。其实如果有充分的时间,这还是很有前途的项目。

这学期系里面不知道出了什么问题,安排了软件工程课的兄弟课——面向对象。原本打算做游戏,但后来鉴于大家的惰性,就继续EZ-UML吧,目前取名为Luna。应该是和Eclipse相呼应,不过我总觉得叫做lunatic比较有趣(玩笑而已,我怎么会贬低自己项目呢)。这次是要开发Eclipse的插件形式。不过这学期大家都忙,所以不知道这个项目的结局。不过应该会很顺利,deadline前一周完成一学期的projects是CS的传统了。

 

虽然今后我只能选一条道路,但是这些都是本科最后的项目了,还是好好对待好了。不过,下学期对我而言有个更大的挑战...

iBT前夜于宁波

大概是今天晚上21:00到宁波所在宾馆,然后用了1小时车程到宁波大学踩点。

虽然是深夜,不过宁波大学给我的映像还不错,里面很大,希望明天给我带来好运..

 

马上就要去睡觉了,明天的考试如何我现在已经不关心。最关键的是明天的考试将标志着这混乱的一年的结束,沉寂已久的心或许能重新复活。

 

God bless...

参与Folding@home

虽然明天就要考iBT了,但利用上午一点时间在家里服务器上装了Folding@home客户端。

 

特地写这个文章主要是希望更多的人能参与进这个项目,下面是关于这个项目的一点介绍:

Folding@home是一个研究研究蛋白质折叠,误折,聚合及由此引起的相关疾病的分布式计算工程。我们使用联网式的计算方式和大量的分布式计算能力来模拟蛋白质折叠的过程,并指引我们近期对由折叠引起的疾病的一系列研究。

 --来自Folding@home 的中文网站

该项目的主页以及中文版本分别是:

http://folding.stanford.edu/

http://www.equn.com/folding/

简单点说Folding@home 就是一个分布式计算的客户端程序,可以利用你电脑的闲散时间处理蛋白质折叠计算。

前不久在淘宝上花了400多块钱买了一台2手的HP e-PC当作服务器用,装了debian r4.0。主要用来做家庭数据库管理和下载服务器,同时也是作为将来制作智能家庭管理系统的核心服务器。不过目前看来这台机器平时基本还是闲置的,与其闲置,还不如为人类做点贡献吧...

目前Folding@home 已经包含windows\linux\BSD甚至PS3的客户端,对于windows版配置比较简单,下面我说说如何在Debian发行版以及其衍生版本中配置Folding实现自动启动。

文章主要参考http://ubuntuforums.org/archive/index.php/t-12071.html

首先是下载:

#wget http://www.stanford.edu/group/pandegroup/release/FAH502-Linux.exe
比较奇怪为什么linux版本还要加exe后缀,先不管这个,然后将他放在一个目录下。比如~/FAH,这样做一方面因为Folding

会在当前目录下放置计算过程数据,同时如果可能,可以在同一台机器上运行多个Folding,这就要求将不同的Folding进程对应程序存放在不同目录下。

然后在~/FAH中创建startfah.sh配置脚本

#vim ~/FAH/startfah.sh

写入下面代码:

#!/bin/sh
cd /home/csk/FAD
/home/csk/FAD/FAH502-Linux.exe -forceasm -advmethods >/dev/null 2>&1 &
exit 0

注意:将csk改为你的用户名

然后将他设为可执行:

#chmod +x startfah.sh

接着在/etc/init.d/中创建诸如fad的文件

#sudo vim /etc/init.d/fad

将下面代码写入文件:

#!/bin/sh
# /etc/init.d/fah for Ubuntu
# Start/stop/restart the F@H service.

fah_start() {
if [ -x /home/csk/FAH/startfah.sh ]; then
echo "Starting F@H: /home/csk/FAH/startfah.sh"
/home/csk/FAH/startfah.sh
fi
}

fah_stop() {
sudo killall FAH502-Linux.exe
}

fah_restart() {
fah_stop
sleep 2
fah_start
}

case "$1" in
'start')
fah_start
;;
'stop')
fah_stop
;;
'restart')
fah_restart
;;
*)
fah_start
esac

 注意上面的csk是我的用户名,你需要做相应修改

最终设置执行权限并在对应runlevel中加入symbol link:

#sudo chmod +x /etc/init.d/fah

#ln -s /etc/init.d/fah /etc/rc2.d/S99fah

 

接着先进入~/FAD中执行./FAH502-Linux.exe

这样做是因为第一次执行Folding时候需要作配置工作,比如设置用户名和执行优先级,可以用它的默认配置,然后再开始计算后终止进程。你可能会看到下面的画面:

[01:18:33] Preparing to commence simulation
[01:18:33] - Assembly optimizations manually forced on.
[01:18:33] - Not checking prior termination.
[01:18:34] - Expanded 291189 -> 1461493 (decompressed 501.9 percent)
[01:18:34]
[01:18:34] Project: 3040 (Run 24, Clone 261, Gen 30)
[01:18:34]
[01:18:34] Assembly optimizations on if available.
[01:18:34] Entering M.D.
[01:18:54] (Starting from checkpoint)
[01:18:54] Protein: p3040_supervillin-03
[01:18:54]
[01:18:54] Writing local files
[01:18:55] Extra SSE boost OK.
[01:18:55] Writing local files
[01:18:55] Completed 0 out of 5000000 steps  (0%)

接下来只需要重启系统即可。

稍微休息一下

时间越来越紧迫了,不过还是抽空调整放松下。

家里院子的山楂熟了,中午休息时候去采了些

 

继续奋斗了,愿上帝垂帘我这个无药可救的人

要坚定信念了

照目前的情况,看来已经算破釜成舟了。要坚定信念好好干一场了... 未来是怎样的呢? 我需要的是沉默和执著,而不是往常的随着兴趣

终于,D828被拆了

我自从小时候开始变有个习惯:拆东西。

当时基本到手的玩具在2天内基本就会被我拆解,可惜当时科学技术和经验点不够,拆解的东西无法重新组装。但通过拆东西的确让我增加了不少经验。那些电动玩具的内部构造小时候就一清二楚,虽然到了大学才学了数电模电,但是小学4年级我就会用LM386作音频放大电路。所以说拆东西这个习惯还是有好处的...

不过作为牺牲,很多东西被我拆了就无法再修复了,有时往往失大于得,其中的例子是我读一年级时把妈妈的一块瑞士手表拆开了,据说当时一些修表的都没法打开(可能是家长的夸张之辞),后来导致那块手表至今走时不准。

高中时候是一次是把联想的PDA拆了,而且把LCD也拆了,当时因为PDA不小心被我摔倒地上,是LCD驱动升压电路的电感磁心断裂而以,不过我当时没想到这个问题,直接去拆LCD。将内部的背光光栅也弄了出来。不过自然没法修复,无奈送修。后来奇迹的是LCD被我那样破坏在组装后仍旧工作正常,不过不是在无尘环境中,导致面板上有小的杂质..

最近的一次大家应该都知道,就是把我笔记本给拆了,导致排线断裂:http://www.csksoft.net/blog/post/171.html

虽然当时因为拆笔记本造成了不小损失,幸亏还是能享受保修。但等维修回来第二周开始至今我又拆了近5回。至今拆笔记本已经是家常便饭。

当谈还是有些东西我没法去拆,比如CRT显示器或者电视机,大家电(我没那么无聊)。不过也有我有能力但还没去拆的,如PSP和手机。就像某人曾对我说的“你迟早会去拆的”,这次就轮到了我的手机:

 

前盖背面

 

主键盘后的PCB,CPU、Nand和射频模块在此

 

全家福

 

事情经过是我无意打翻了玻璃杯,水全部浇在手机上,导致当场死机..等把水甩干已经无法开始了。这无疑是个拆机器的良好借口,而且本来有些按键已经将近失灵,所以打算修复。

因为这次网上已有现成的拆机照片公布,所以拆起来比较顺利,不过还是差点弄断排线。拆LCD时候又犯了同样错误,把灰尘带了进去。而且等装起来发现方向键失灵,又拆了一次。后来怀疑是耍机造成的,目前看来还能维持这样的假说,否则这又是本次拆机的代价?

电子产品对我而言,一旦拆了,就没有神秘感了,而且下次拆起来就更肆无忌惮。不过还是别拆了。PSP尽量不去拆...

 

 

gift:多彩Console输出函数

什么是多彩Console输出?就是上篇文章中benchmark的效果图

其实windows有专门的console API实现这样效果,.Net里面也有封装,但是VC要实现还真是麻烦。所以在写CiperLib时候我顺便写了个帮助库,提供下面几个函数,使用很方便。

BOOL clr_foregnd(WORD clr);//设置文字颜色
BOOL clr_bkgnd(WORD clr);//设置背景色

BOOL clr_underline(BOOL bUnderLine=TRUE);//文字有下划线
BOOL clr_highlight(BOOL bHighlight=TRUE, BOOL foregnd = TRUE);//是否高亮度显示
BOOL clr_reverse();//背景和前景交换色彩
VOID clr_restore();//恢复默认的显示格式
VOID con_cls();//清屏幕

 

要注意适用时需要using namespace consolehelper;

使用方法是,调用了格式设定函数后,在之后的输出都会采用设定的色彩或者格式。

比如

clr_foregnd(CON_CLR.RED);

printf("Red Text");

 

对于颜色,提供了结构:

struct CON_CLR
{
    static const WORD RED  =  FOREGROUND_RED;
    static const WORD GREEN = FOREGROUND_GREEN;
    static const WORD BLUE = FOREGROUND_BLUE;

};

 

还可以这样使用:clr_foregnd(CON_CLR.RED | CON_CLR.GREEN);那么就是显示黄颜色了。

 

clr_highlight严格的说是区分正常色彩和低亮度色彩。

如果将3中元色和亮度组合,那么可以显示16种色彩。

 

con_cls();等同于system("cls");但是速度快

 

如果下载过ciplib的代吗,那么本函数库以及包括了,否则可以单独下载:

 

教育网:

ftp://great_csk:public@public.sjtu.edu.cn/public-files/console_hlper.rar

http://www.csksoft.net/data/legacyftp/Products/code_and_lib/console_hlper.rar

我写的大整数以及素域运算库

这个库叫做CiperLib,是我暑假在密码学实验室作的作品。比较工程化的东西,不过比较实用,所以就公布了。

下面是他的简介,我直接从他的说明文档中复制了,如果你完全知道他的作用,那么直接去文章末尾的链接下载。

 

 

CipherLib是一个使用C++和汇编代码实现的用于多精度大整数运算和密码学领域素域基本运算的函数库。由陈士凯(CSK)开发。
这个函数库实现的操作有:

  1. 支持任意精度的大整数:精度可以通过代码设定,支持符号数
  2. 对大整数的四则运算和求模运算,以及2进制化的移位操作
  3. 使用类将大整数加以封装,支持直接用传统运算符进行大整数的运算代码编写
  4. 支持从文本串和系统内置整型数据中读取大整数,支持将大整数输出为2进制、8进制、10进制和16进制文本串
  5. 实现了Marsaglia & Zaman的长周期随机数(本机支持的整型格式)
  6. 支持模加、模乘、模幂计算
  7. 支持Rabin-Miller方法的素性验证
  8. 支持大素数产生

 简单的说可以利用这个库实现一些高精度计算和密码算法,比如RSA。


 

该函数库在设计上参考了mircal库,在核心的运算操作上使用了x86汇编语言和C语言2种版本代码编写。默认采用汇编语言执行。因而具有很高的运行效率(具体见Benchmark部分)
 
CipherLib的一些技术信息:
项目
说明
运行环境
32x86指令系统下的windows环境
开发环境
VC++ 2005版本
是否多线程安全
函数库形式
静态链接库或者直接嵌入代码
第三方库依赖
需要C运行库

 

Benchmark

 

下面是我写的对于CipherLib和mircal的一个运行效率比较(不过不是很科学,但是基本可以说明问题):

使用附带的程序CiperBench进行测试。
         测试程序在开发者电脑环境:Intel Pentium M 1.6G ,2G RAM,WinXP sp2环境中,对于静态库的本函数库和Mircal进行比较。
 
         由于采用了timeGetTime() API获取时间,因此精度可能会受偶尔系统调度的影响。
下面是对1000次的四则运算的执行时间对比,本函数库表现较优:

对于乘法的实测情况

对于加法的实测情况

对于减法的实测情况

对于除法的实测情况

对于求大素数的实测情况

 

 

 

 

对于素域运算,使用了产生一个大素数的运算作为衡量指标,因为其中需要进行素性验证和模乘和模幂运算。本函数库效率较低,原因是没有针对素性验证是的模幂运算单独进行优化。


我用于求模幂的算法是Koch提出的Sliding Window法。但是对于求素性验证来说不是最优的。

 


 使用范例

 

下面是用本函数库求解1000!的代码,从代码风格上可以看出他的易用性,具体代码和使用办法见文章末尾给出的文件中的操作手册。

#include "CiperLib.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    Integer::Init(409600);
    char output[20000];
    Integer Base(1000),Ans(1);
    while(!Base.isZero())
    {
        Ans *= Base;
        Base -= 1;
    }
    Ans.toString(output,20000);
    cout<<"Finished, Ans is:"<<endl<<output <<endl;
    system("pause");
}

 

下面很简单的说下实现的细节

大整数是采用2^32进制保存的,也就是用一个DWORD存储一个“位”。对于四则运算均使用汇编优化,其中算法参见Knuth的the Art of Computer Program 第二卷的多精度计算。

对于素域的计算,主要采用的就是窗口法求模幂,素性验证使用了Rabin-Miller法,并且进行了100次判断,可以确保相当高的正确概率。

注意的是,我不能保证潜在的bug,同时一些算法并不是最优的,所以使用时请自己注意。而且今后基本无法维护了。对于具体的实现,可以看代码注释以及我附在其中的实习报告

代码/Demo/文档的下载:

http://www.csksoft.net/data/legacyftp/Products/code_and_lib/CiperLib_release_by_csk.rar

教育网:ftp://great_csk:public@public.sjtu.edu.cn/public-files/CiperLib_release_by_csk.rar

暑假回顾

一个暑假都很忙,很久没有写blog了。虽然现在也已经是凌晨2点,不过我打算还是利用睡前的时间把这篇blog写完。

其实要更新的内容很多,而且一更新肯定不止1、2篇文章了。所以这篇就当时目录性质的吧...

一个假期很匆忙的就结束了,其实对我来说人生的假期恐怕已经没有了,所以也没有什么还留念的。围绕着整个假期主要发生了下面些事

写完后说的话:这篇文章很长,挑感兴趣的看吧

1.在张丽清老师的仿脑计算与机器智能研究中心实验室中实习

主要的工作是实现ColorConceptualization的网站,同时我自己提出了一个智能着色的东西。

这部分具体会在后面的帖子中详细的介绍。

对于智能着色我给出一个效果图片,应该就能理解:

图片:智能着色的效果图1

 

当然,利用Photoshop做出这样的效果也不难,不过要实现上面这个效果,利用智能着色只需要用鼠标点一下你想改变颜色的物体然后选种颜色即可。很容易操作。

图片:智能着色的效果图2

 

当然有机会去亲自体验下,假期中我实现了一个演示网站,网址是:http://bcmi.sjtu.edu.cn/clrconcept/

由于在教育网,公网用户速度可能比较慢,需要Flash9以上的播放器。

对于具体的算法,我不想在此多说了,目前缺陷是不能对灰度部分的物体,比如上图摩托车的黑色部分着色。测试的时候可以先下载我推荐的效果比较好的图片:

 

注意图片不要太大了(别超过2000x2000),我也不希望有恶意攻击的事件出现。

操作见下图:先选中自己想变换的色彩,然后点StartColoring,此时鼠标移到图上会高亮显示能够着色的物体,点击即可:

图片:智能着色网站显示1

 

虽然Flash AS3效率提升了不少,但是处理实时分割算法还是有点慢,如果大家觉得这个东西好玩,今后有空了可以考虑做单机版。

 

2.在被万恶的学校安排的密码学实验室中实习(见之前的文章)

虽然起初有点不情愿,但是后来发现还是蛮喜欢这方面东西的,当然不是说搞研究。

在密码学实验室的实习任务是实现在素域中大整数的模加、模乘和模幂运算。同时要实现素性验证。

对于模加、模乘和模幂,写出公式绝对是简单的不能再简单:

C = A + B (mod m)

C = A * B (mod m)

C = A^N (mod m)

不过问题在于,对于其中每个数,可能都是1024位的超长整数,比如一个1321421423124214325131413124124123412这样的数。对于目前计算机来说,一个DWORD最多也就能表示2^32-1个数。因此,需要针对任意长度大数的运算。这个的定义叫做“多精度整数”。Knuth的书有很明确的算法定义。但是要实现就是另外一码事。需要在关键运算处写汇编。

同时,对于素域的模幂和模乘运算,有个叫作Montgomery的老兄想到了一堆优化算法,因此实现起来更是恶心。

我后来参考了MIRCAL这个开源库写了自己的运算库。支持大整数四则运算,上述的模运算和素性检测以及大素数产生。由于是参照了MIRCAL库,同时对里面的汇编代码作了优化,所以很奇妙的我的库在四则运算上均快于MIRCAL。不过模运算就慢了,因为偷了懒,Montgomery老兄的算法有些没使用。

总的说来还是令我满意的,前后实现其实只用了3天,后来又花了几天写了素性检验和Benchmark程序。这个实习的好处是我马上要发新的文章公布这个库的代码和一些小东西了,呵呵,具体今后会写专门文章。

 

3.准备GRE作文

之前说过了,第一次觉得可能考不好,就cancel分数了,所以现在时间很紧了

 

上面就是这个假期大致做过的事情,上面介绍的东西我今后会写具体的文章。作为对blog和网站的填充吧。

 


 

下面就说说这段时间的一些想法:

可以说今年是我自信心不断受打击的一年,也是比较辛苦的一年,相比之前安逸的生活,今年应该能算作比较消沉的。有人说哲学家的人生都很悲惨,为什么呢,因为正是逆境促使他们思考自己的人生、他人的人生乃至这个世界。

虽然现在觉得我过得不如意,但是理性告诉我我那些困难简直算不上什么,不过同样我也思索了不少问题。当然其中不少至今还没有答案。

首先一个问题是为什么我今年突然会觉得不如意,可能一部分原因是今年是我必须面对现实的一年,相比之前可以对未来随意幻想,今年我必须决定今后要走的路了。而现实和我理想的差距就是造成落差的原因之一。

我是一个十分理想化的人,同时使一个很自卑的人。正是因为自卑,所以对外企图极力掩饰,具体的行动就是做事情尽可能追求完美,乃至任何事都希望能做好。当然我也受到这种状态的益处,但是终究我不是天才,那些做的不好的事就令我万分自卑。考GRE便是一个例子。

现在看来已经很了解自己的脾气了,我想目前能在计算机某些方面有一点小小的成就可能就是我追求完美的结果,虽然这些还far from prefect. 不过这样的性格另我活得很累,同时理想的落空造成的心理落差令我万分恐惧。虽然理性的思考让我觉得自己的行为十分无聊。

我学过弗洛伊德的理论,我完全知道这样是因为年幼的一些事情造成的,恐怕要改变也能困难,不过也只有去改变了。

最近在思索的另一问题是今后自己走的路。回想我以前做得事,可以说是比较“工程化”。但是如今我已决定将来要走学术的道路,所以之前做的事我该如何定位?完全的放弃?我还应该承认那是我的特长吗? 这个问题看来很可笑,不过一些具体问题上的确难以把握,比如这个blog今后的定位,是完全的学术化还是继续放一些技术方面的文章,当然我今后可能不研究了呢?我有个不好的习惯就是做事情比较杂。从Flash、平面设计、图像编程到软件逆向工程到硬件制作,都作出过一些小成就,但是后来都没有继续走下去。当然一方面原因是我觉得那些不适我今后该走的路,只是作为兴趣来研究罢了。但是的确要找一条路深入了,今后走学术道路可能可以让我在一个领域真正的“深入”吧。

现在得出的结论是今后就算完全从事理论化的研究,我曾经的爱好不会放弃。看不到自己的特长,完全从0开始进入新的领域已经给我不小自信打击。

现在是凌晨3点,想着今后还要走的路还很长,有时想想我也该知足了,其实做平庸的人是最幸福的。但目前与世无争我还是做不到,所以要拼搏。

 

明天早上醒来把一些技术上的文章补上

奇迹?神迹?

或许这世界上根本没有什么真正的奇迹或者神迹,有的只是被人类忘却的真相。 当真相被遗忘,一个奇迹便出现了……
分页:[«]9[10][11][12][13][14][15][16][17][18][19][20][21][22][23][»]

日历

<< 2015-6 >>

Sun

Mon

Tue

Wed

Thu

Fri

Sat

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)