Cflow 分析

三月 9th, 2011

cflow

cflow是个比较古老的程序(好像比我老一岁),主要是用来打印C程序的函数调用关系,通过函数调用关系能大概看一下程序的流程。最近看了一下这个程序的代码,主要分为两个小程序组成。首先是prcc.c这个程序,作用是读源文件,提取出函数名称,然后生成一个函数列表。第一列是调用函数,第二列是被调用的函数名称(如果是函数声明则这两列相同)。第二个程序prcg.c是读取函数关系,里面建起一个有向无环图。根据这个图加上缩进打印出函数调用轮廓,这里有一个例子。最后是一个脚本cflow.sh,其核心代码就是。

prcc demo.c | prcg

这是典型的通过管道把小程序组起来的例子。

life is short , use Python

闲着的时候在这个程序上做了些小工作。既然有了第一个程序,那也可以用python来快速写个程序继续做些工作。首先想到的是写个程序把函数名打印出来,在有调用关系的函数之间用直线连起来。python就是容易实现。这里有一个问题,就是怎么排列函数名的位置,使得连线不怎么相交,因为相交起来就不容易看到函数之间的关系了。不好解决,还是用了以前《集体智慧编程》里面的优化函数,也就是优化问题。通用思路就是试着移动各个函数的位置,朝着相交点最少的部分移动(这里给一个解,相交点的个数为评估函数)。效果不是很好,当函数比较多的时候哪种算法都比较慢,而且交点看起来不可避免。这是一个结果。运行方法是:

prcc demo.c | python drawfuncs.py 或者
find  *.c | xargs prcc| python drawfuncs.py 来处理多个程序。

然后又想着可以做一个标签一样的东西,把调用深度比较潜的放大,调用深度深的缩小。不连线,位置随机画。这样一眼能看出来这个程序的主要函数是哪些。结果成这样了。

位置随便画还是不好,可以分层。然后再相邻层之间的函数有调用关系的再用直线连起来,就变成这样了。清晰一点。既然有函数关系,其实是可以做到更好的,就像上面那个prcg.c程序,不过代码要复杂些了。

C要的是运行速度,Python实现速度快!

给老婆介绍OOD

三月 3rd, 2011

我的妻子Farhana想重新她软件开发师的职业生涯(她以前也是个软件开发师,但是因为第一个孩子的出生而没有继续下去)。所以,这段时间我在帮助她学习一些OOD方面的东西,我是一个比较有开发经验的程序员。

从我早期的职业生涯中,我发现不管是多么复杂的技术问题,如果从普通交谈中以平常生活常见的角度去解释往往变得更容易理解。因为之前我和她有不少富有成果的交谈,我想可以和大家一起分享一下这种学习OOD的有趣方式。

下面是我们学习OOD的对话:


OOD介绍

  • Shubho : 好,让我们开始学习OOD,你已经知道了面向对象三大特性,对吗?
  • Farhana: 你是指封装、继承、多态吗?是的,这些我知道。
  • Shubho : 好,希望你已经知道了使用对象和类,让我们今天开始学习OOD。
  • Farhana: 等等,知道面向对象特性还不够面向对象程序设计吗?我的意思是,我能定义类,封装成员变量和函数,我也能根据类之间的关系定义继承类。那还有什么需要学的么?
  • Shubho : 好问题,OOP和OOD是两码事。让我给个例子给你。当你还是小孩的时候你学会了字母表,对吧?
  • Farhana: 嗯
  • Shubho : 好,你也学会了如何用字母形成一个个有意义的单词,同时,你也学会了一些语法来造句子。比如,你要维持时态,使用介词、连接词、和其他语法来造出正确的句子。比如说一个句子像下面这样。”I” (pronoun) “want” (Verb) “to” (Preposition) “learn” (Verb) “OOD” (Noun) 你看,你要让这些单词安特定的顺序组成,你也 要选取正确的词来使得这个句子有意义。
  • Farhana: 呃,这是什么意思?
  • Shubho : 这和OOP是类似的。OOP是面向对象程序设计的基本原则和核心思想。这里,OOP对应于英语语法,这些基本语法告诉你如何用单词去构造一句有意义的话,
    OOP告诉你使用类,封装成员变量和方法,也告诉你在代码中使用继承关系。
  • Farhana: 嗯,有点懂了。那么OOD对应于什么呢?
  • Shubho : 你马上就知道。好,现在比如说你想要就一个论题写一些文章。你也想就一些你比较精通的方面写一些书。知道如何遣词造句还不够写一篇好文章或者好书出来,对吧?你还需要学习很多,你需要知道如何用一种好的方式去解释一个东西,这样读者才能了解你到底在说什么。
  • Farhana: 有点趣,继续。
  • Shubho : 好,现在比如说你想就OOD方面写一个本书,你需要知道如何把这个主题分为小题目。然后在这些小议题上面逐章地写,你还要写前言、简介、解释、例子,还有许多其他段落。你需要知道如何从整体上把握这本书的构造,甚至需要一些写作技巧。这才能让你的书通俗易懂。在软件设计领域,OOD同样是个更上层的角度。你需要好好的设计,使得你的类和代码可以更好地模块化、复用、灵活。使用这些设计原则可以是你少重复发明轮子。懂了吗?
  • Farhana: Hmm,我明白了一些,但是请继续。
  • Shubho : 别急,一会你就知道了。我们只管讨论就是了。
  • Read the rest of this entry »

在显示器前干什么了

二月 22nd, 2011

时间啊时间

写论文头大,翻资料找到一个以前写的小东西。有段时间在实验室,一坐就是一整天,经常在网上找找资料,找着找着就从一个链接点到另一链接,从豆瓣到Hoop,再弹出个QQ,一整个上午就过去了。天天对这显示器,于是就想我整天呆在这大部分时间在干什么了,要是有个记录就好了。就想写这么一个小程序,来记录我一天在电脑前花的时间分布。

方法

怎么实现呢。要知道现在在干什么,就应该要知道我现在在活动程序,编辑或者鼠标点击的。如何知道现在活动的程序名,如果能获得当前活动的程序的可执行文件的路径就比较好办了。于是在网上找了找,在Windows下可以这样实现。

CString getProcPath(int PID)//返回pid进程的可执行程序名称
{
        HANDLE hModule;
        MODULEENTRY32* minfo=new MODULEENTRY32;
        minfo->dwSize=sizeof(MODULEENTRY32);
        hModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);//对系统进程进行拍照

        Module32First(hModule, minfo);//返回与进程相关的第一个模块信息

        CString str;
        str=CString(minfo->szExePath);
        CloseHandle(hModule);
        if(minfo) delete minfo;

        return str;
}

Read the rest of this entry »

春节杂记

二月 16th, 2011

在家待了三周,一直是豆瓣和围脖,以前觉得为什么这么那么多人玩围脖、twitter,这东西真的挺无聊的,但无聊起来这真是个好东西咯,哈哈。

年前的同学聚会必然少不了,只是也确实觉得没特别大的意思。很多年没见的同学,之前真的很想见,可是见后又有那么点失望,除了变成熟一点什么都没 变。为什么我会期望看到变化呢,我想时间过了这么久总该给眼前的人留下点痕迹,好让我们彼此见面时能借口好好感叹一番:真的过了六年了。一些男同学很忧愁 似的刁起了烟,看起来比我这种闻了烟味就眯眼的成熟不少。一些女同学会巧妙的化妆了,郑班长的皮肤就变好不少。很碰巧的是我走在街上一边寻思着能不能偶遇 个高中同学一边看美女,结果她就从对面走过来了,我一拍肩膀把她吓了一跳:)。同学聚会吃饭、唱歌,ktv什么的不太喜欢,除了自己五音不全外,房间里面 太大的烟味。同学之间聊天话题也比较少,哪里上学、工作、对象、房子,也就这些了,不少同学在家乡已经买了房子,对象也有了准备结婚了,我们这些还在学校 混的就有点难为情了。其实真的在哪里都是过日子啊,在家乡一个月三千能买一平米半房子了,小日子过得滋润。

Read the rest of this entry »

C 单元测试

一月 8th, 2011

看到一篇关于C下单元测试的文章。以前使用过CppUnit做过一些测试,在C下还没用过,以后可以试试。单元测试在面向对象编程领域非常流向,像JUnit(Java)、SUnit(Smalltalk)和CppUnit(C++)都提供了便于单元测试的功能。但是在资源受限的环境下(比如用C写的嵌入式系统),这样的单元测试框架会显得笨拙。单元测试的重点在于 对代码进行测试,而不是框架。MinUnit是一个非常简单的单元测试框架,没有内存申请部分,所以能在任何环境下进行,即使是ROMable的代码。

代码

 /* file: minunit.h */
 #define mu_assert(message, test) do { if (!(test)) return message; } while (0)

 #define mu_run_test(test) do { char *message = test(); tests_run++; \
                                if (message) return message; } while (0)
 extern int tests_run;

没看错,只有四行。一个测试用例就是一个函数,如果测试成功返回0(null),如果失败返回一些提示信息表示测试失败。mu_assert是一个简单的宏,如果test失败,则返回传入的message。mu_runtest调用另一个test函数,如果失败返回相应信息。
Read the rest of this entry »

走过十年

十二月 30th, 2010

过两天就是2011年,一到年底总会让人有些抚今追夕,免不了唏嘘感叹一番。总结一年太短了,我来好好想想这十年我记忆中还存有的一些事,断断续续的。

2000年 ,以及之前三年,那年我十四岁,初三,读了两年寄宿后已经变得弱不禁风。刚好那年也是奥运年,没电视看,只有一块小黑板摆在楼下,我不知道悉尼在哪,印象更深的是旁边的菠萝块,五毛钱一块,相当爽口。那物质贫乏的年代一个礼拜的火食费大概在八块五左右,初一到处三基本维持这水平。有一次看同学的篮球杂志,一个黑人(后来才知道是carter)举着个球把人给飞过去了,印象深刻,从此起后就经常看篮球了,并长期偏爱看这个黑人的球赛。初二时当过一年的劳动委员,当时正值学校大搞建设,我们就被叫到山上去挖草皮铺在学校广场上。这好歹也算个官,还挺霸道的,就是分配任务然后坐在那里记录没人挖了多少土和草,也许除了这次我再也没有主宰别人劳动的权利了。进那传说中的重点初中是要考试的,爸妈说我是成绩本来没上的,用关系把我送进来。现在也不知道是不是这回事,反正那时估计是心里有所愧疚,或者是因为读寄宿没动画片看了,我学习那可是相当努力,摸着良心说真是勤奋检朴、纯正无邪、天天向上的好孩子。那时多幼稚,就把排名在自己前面的同学的名字写在书上,有位我要超的同学五点半就起来了,我也要跟着起。不知道什么应试教育,什么素质教育,只知道前面有人排我前面很不爽,回想起来也挺好玩的。学习之外有个乐趣是看人打架,那时流行古惑仔什么的,总是有些同学看起来特牛逼,没人敢惹。有次据说有大规模群架,月黑风高爬到学校的小山坡上等着,结果两群人罗嗦了半天没动手,很另人失望。我虽看起来老实,也确欺负过比我更老实的同学们,就在现在还是心里有所愧疚,对不起了。到现在能记下来的初中同学的名字就那么几个了,大部分人毕业后再也没联系过。快毕业那年第一次对一位姑娘有了脸红心跳的感受,其实什么也没做,只是我向她借教室的钥匙。依然记得午后教室走廊上的风和阳光的味道,我跑得很快。

2001年 ,9月进了高中,17岁的少年很单纯、无虑,有一群人可以和你打球、彻夜瞎谈。不会想着未来会怎么样,但会觉得未来很美好很美好。高三那年经常一个人,开始觉得有压力,进而有时失眠,那个暑假我还搬到一个自己的租的小房子里住,不过没到一个月就觉得不适了,矛盾的就是想独处而又耐不住独处,然后又搬回宿舍。回忆起来三年一闪而过,现在我也会觉得高中是段最快乐的时光,有时会在梦里回到那段年少光阴。高中毕业后大概有一半多点同学上了大学,但能联系的比较少。后来和一些在高中都没说过几句话的同学聊天,有人说我是个狂人,看起来很嚣张、不怎么理人的那种。我只是对没太熟悉的人没什么话说,看起来很冷淡可有些时候还会私下来那么一下,用后来的词说是闷骚。这种性格我是知道怎么形成的,已经不好改了。其实高中能记下来的事很多,在此不一一写下。大家都天各一方,有的人和事也许永远不会忘记,但也就仅此而已。
Read the rest of this entry »

Pages: Prev 1 2 3 4 5 6 7 8 9 Next