Sunday, December 10, 2006

Software Measurement Links



1. Software measurement index
http://yunus.hacettepe.edu.tr/~sencer/research.html

Software measurement enable us to
.estimate cost and effort devoted to project
.determine quality of software
.predict maintainability of software
.validate the best practices of software development

The metrics of software size:
.Simple metrics: LOC(line of code) and FP(Funciton points).
.Complex metrics: Halstead and McCabe
.Object-Oriented Metric

2. History of software measurement
http://irb.cs.tu-berlin.de/~zuse/metrics/3-hist.html

3.

Thursday, November 23, 2006

/proc file system


* [1] 有关Linux proc 文件系统的文档位于: /usr/src/linux/Documentation/filesystems/proc.txt
* [2] RedHat Guide: The /proc File System: http://www.redhat.com/docs/manuals/linux/RHL-7.3-Manual/ref-guide/ch-proc.html

Sunday, November 12, 2006

elf:From The Programmer's Perspective

http://linux4u.jinr.ru/usoft/WWW/www_debian.org/Documentation/elf/elf.html

Chinese version:
http://zhanjun.net/?q=node/17

Understanding ELF using readelf and objdump
http://www.linuxforums.org/misc/understanding_elf_using_readelf_and_objdump.html

Biew: Alternative tool to inspect ELF structure

http://biew.sourceforge.net/

download the source code of the GUI tool.

releated tools: file, objdump, size, readelf

1. Elf file types: executable, relocatable(.o), shared object(.so)
$file file_name

2. sections of ELF
.init
be called before calling main().
.fini
be called after main() return.
<>
.ctors
constructor pointer array. __CTOR_LIST__
.dtors
desctructor pointer array. __DTOR_LISt__
$objdump -s -j .ctors ./crtbegin.o
.text
__do_global_dtors_aux() travel over __DTOR_LIST__
.

Thursday, November 09, 2006

qt links

1. C.plus.plus.GUI.Programming.with.Qt.4.Jun.2006
http://www.hpdown.com/bookcn/15/2213.html
or search it in www.verycd.com

Saturday, September 09, 2006

Performance tune

1. dead link(maybe)
http://www.intel.com/software/products/college/vtune/getstart/tutorial/index.htm

2. Reference in book
代码优化:有效使用内存 第1章 1.6

3. A Simple Tour
http://hpcjl.ustc.edu.cn/doc/34.ppt

4.vtune 8.1 system requirement
http://www.intel.com/cd/software/products/asmo-na/eng/vtune/vlin/239147.htm

5. Improving Program Performance
http://docs.sun.com/source/819-3690/Perf.html

6.

How I Got 15x Improvement Without Really Trying: A Case Study in Program Optimization

http://developers.sun.com/sunstudio/articles/Feo/feo_content.html

Tuesday, September 05, 2006

Cases of unit test

Case 1:
1. Subject: Design a method 'filterStringList' to erase those strings whose length is not less than 4 out from a list. The prototype of the method is declared like this:
typedef list StringList;
typedef unsigned int StringLength;
void filterStringList(StringList &list, const StringLength maxLength);
2. Unit test design:
void test_filterStringList()
{
StringList strList;
strList.push_back("1");
strList.push_back("22");
strList.push_back("333");
strList.push_back("4444");
strList.push_back("55555");
strList.push_back("666666");

filterString(strList, 4);
CPPUNIT_ASSERT(3 == strList.count());
CPPUNIT_ASSERT("1" == strList.[0]);
CPPUNIT_ASSERT("22" == strList.[1]);
CPPUNIT_ASSERT("33" == strList.[2]);
}

3. My first impletement (fail to run unit test)
void filterStringList(StringList &list, const StringLength maxLength)
{
StringList::iterator it = list.begin();
for(; it != list.end(); ++i)
{
if((*it).length() >= maxLength)
it = list.erase(it);
}
}

It can't passed the test.

4. The final impletement

void filterStringList(StringList &list, const StringLength maxLength)
{
StringList::iterator it = list.begin();
while(it != list.end())
{
if((*it).length() >= maxLength)
it = list.erase(it);
else
++it;
}
}

Sunday, July 09, 2006

调查回答

要打印调查回答副本,请单击屏幕左上角的“文件”选项,然后在下拉菜单中单击“打印”选项。或者,如果工具条中有“打印”图标,直接单击该图标即可。

打印后,单击此屏幕右上角的 X,以关闭此页面。或者,也可单击屏幕左上角的“文件”选项,然后在下拉菜单中选择“关闭”选项。这将让您返回调查问卷,并允许您提交调查提供商尚未收到的您的回答。

您的调查回答是:


评分尺度:
1 - 强烈不同意
2 - 不同意
3 - 中立
4 - 同意
5 - 强烈同意

1. 我认为高级管理团(包括詹德和他的直接下属)充分体现了有效的领导力。 - 3

2. 我所工作的事业部/职能部门管理有效,并且运转良好。 - 2

3. 我所在的事业部/职能部门的管理层认可、鼓励并身体力行的领导变革。 - 4

4. 公司的高级领导层已经向我沟通过公司未来的鼓舞人心的愿景。 - 4

5. 我所在的事业部/职能部门正在进行必要的变革,以期在未来的业务中更具有竞争性。 - 4

6. 我清楚地了解我所在的事业部/职能部门在向完成业务目标的进展情况。 - 4

7. 我清楚地看到我所在的事业部/职能部门目标与我个人工作之间有明确的联系。 - 5

8. 我的工作业绩对于我所在的事业部/职能部门至关重要。 - 4

9. 我从自己的工作中获得个人成就感。 - 4

10. 我的直接主管帮助我了解公司对我的期望。 - 3

11. 我的直接主管及时提供有益的反馈。 - 4

12. 我清楚地了解M绩效管理流程,以及与之相关的、并能给员工提供帮助的工具。 - 3

13. 我的直接领导能够有效的管理那些绩效不佳的员工。 - 3

14. 公司要求员工为实践自己的承诺承担责任。 - 3

15. 在我所在的部门,我们的团队合作很融洽。 - 4

16. 人们总是围了M的一致利益而合作,而不仅仅指关注自己的事业部或职能部门。 - 3

17. 我能够得到那些能够帮助我胜任现有工作的培训经验(例如职位机会、课程等)。 - 3

18. 我能够得到那些能够帮助我拓展职业生涯的培训经验(例如职位机会、课程等)。 - 3

19. 我对M内部的发展空间感到满意。 - 4

20. 在我发现有可以改进之处的时候,我的直接主管鼓励我主动求变。 - 4

21. 在我工作的地方,决策是由能获得最充分、最准确信息的层面作出。 - 3

22. 为了鼓励创新,我的经理鼓励我们采取一些冒险的行为。 - 4

23. 高级领导者已经建立了对优秀绩效认可和奖励的文化。 - 3

24. 我的工作表现对我的经济收入有直接影响。 - 3

25. M业绩越好,那么M员工能得到的奖励越多。 - 4

26. M致力于营造一种兼容并包的氛围鼓励许多像我一样的员工。 - 4

27. M已经建立了一种文化,使那些拥有不同背景的人们都能成功。 - 4

28. 灵活工作制允许我能够调整自己的工作日程和工作地点以满足工作的需求。 - 4

29. 在我所在的工作组中,我们都以全球化的思维来指导工作,并且敏感应对人们的需求。 - 3

30. 总的来说,我对在M工作感到满意。 - 4

31. 我很乐意推荐我的朋友或者家人到M来工作。 - 4

32. 作为一名M员工,我感到非常自豪。 - 4

33. 我很少想到其它公司找份新工作。 - 4

34. 我的直接主管善于倾听别人的意见。 - 4

35. 我的直接主管是一个有效的经理。 - 4

36. 我知道并理解M的五点价值观。 - 4

37. 我理解M的价值观应该指导我的日常行为。 - 4

38. 我所在的事业部/职能部门的领导者以实际行动兑现他们对公司价值观的承诺。 - 3

39. 我所在的部门设立与客户的期望和业界标准相符合的高质量标准和目标。 - 3

40. 我有能够迅速有效解决客户问题的必要工具(如,六西格码,问题诊断、文档等)。 - 3

41. 在我所在的部门中,质量从来不能因为其他目标(例如预算或者计划)而降低。 - 3

42. 我的部门认可那些致力于提升工作质量的员工和经理。 - 4

43. 在我的部门中,经理经常向我们沟通质量的重要性。 - 4

44. 我的时间大部分都花在对内部或外部客户有直接影响的事情上。 - 3

45. 如果我知道了任何一个与公司政策,或者与商业行为准则相违背的行为,我知道应该如何汇报。 - 4

46. 我的经理依据M准则,支持我做正确的事情。 - 4

47. 无论该员工绩效如何,只要他/她不能坚持商业行为准则,他/她在M都不会得到奖励。 - 3

48. 在过去的12个月中,我从未被迫违反商业行为准则。 - 4

开放式问题:

49. 在这次调查中,有哪些问题我们应该问但是没有问? -
日常工作培训与会议的效率方面的问题。


您的性别? - 1 (男)

您目前的工作地点是在原住国之外吗? - 2 (否)

您的年龄? - 2 (25 – 29岁)

Friday, June 30, 2006

plug-ins development reference

1.Notes on the Eclipse plug-in architecture
http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html

2. Plug-in architecture
http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFPlugIns/Concepts/architecture.html

3. A plug-in architecture for .NET
http://weblogs.asp.net/ahoffman/archive/2004/04/30/123572.aspx

4. Plug-in architecture framework for beginners
http://www.codeguru.com/Cpp/misc/misc/plug-insadd-ins/article.php/c3879/

5. example and guide
http://dev.yesky.com/456/2485956.shtml

1) basic architecture
application ------------------> plugi-in abstraction
/ | / | plugin1 plugin2
| | |
common_function_lib

2) examples:
Desktop, eclipse, simulator and GIMP(in <>).

6. The art of UNIX programming

Sunday, May 21, 2006

都是钞票惹的祸

自从有了货币,
有的人便琢磨着有什么东西可以卖了换钱,
有的人在琢磨着拿钱可以卖到什么,
慢慢的,就都什么都可以卖,什么都可以买了...
http://cq.focus.cn/news/2006-05-22/207246.html
如果明买明卖不行,
扯块遮羞布盖着,
找个时机偶露峥嵘也收入不菲,
记得巴西某女足队员在夺冠第一时刻剥掉自己的球衣,
鼓鼓囊囊的胸脯自然为某内衣厂商打广告,
于是我暗自想,
有朝一日,
如果有卫生由厂商出资购买球裤内的广告牌位,
会不会有人卖。

我想一定会有这么一天的,
当中国的房市不再好蒙了,
卫生巾行业却依然步步坚挺,
任志弱之流的一定会转战期间,
届时央视诸名嘴也许摇身一变为世界冠军球员,
绿茵场上完全会出现这么一幕。
倘若这帮人仍在某传媒中混着,
你可能会注意到某段时期里,
她们又在力挺巾市上涨的消息,
还人模狗样的拿出同比数据,有板有眼的。

本文遵守GPL协议,任何人可在不修改内容的前提下任意复制、传播。

Saturday, May 20, 2006

KDE-对象模型与组件架构

大英计算机协会
面向对象编程与系统
http://www.blackie.dk/~dfaure/conf/oops/html/slide_1.html

KDE是什么
http://www.blackie.dk/~dfaure/conf/oops/html/slide_2.html

KDE库结构
http://www.blackie.dk/~dfaure/conf/oops/html/slide_3.html

Qt对象模型
http://www.blackie.dk/~dfaure/conf/oops/html/slide_4.html

通过很多方式增强了C++对象的概念

元信息(比rtti更强大)
信号和槽(比回调函数更安全)
改进内存管理

-->C++的超集

Qt对象
http://www.blackie.dk/~dfaure/conf/oops/html/slide_5.html

所有窗体,文件,定时器,...
和应用程序一级的对象都是Qt的对象
Qt还定义了容器:字符串,Map...(QTL)

每个Qt对象都可(用char*来)命名

其它特征:
父对象
超类(父类)
信号,槽
事件
共享

父对象
http://www.blackie.dk/~dfaure/conf/oops/html/slide_6.html

每个对象都可赋一个父对象
QFrame * frame = ...
QPushButton * okButton = new QPushButton(frame, "OKButton");

Coupled生存期(删除)
delete frame;

父对象持有子对象列表
QObjectList * childObjects = frame->children();

元信息
http://www.blackie.dk/~dfaure/conf/oops/html/slide_7.html

类名
QTimer *t = new QTimer; //QTimer由QObject继承
t->isA("QTimer"); // 返回TRUE
t->isA("QObject"); //返回FALSE
t->className(); //返回"QTimer"

超类(父类)
QTimer *t = new QTimer; //QTimer由QObject继承
t->inherits("QTimer"); // 返回TRUE
t->inherits("QObject"); //返回TRUE
t->inherits("QButton"); //返回FALSE

这就允许在类型转换前进行检查。

信号和槽
http://www.blackie.dk/~dfaure/conf/oops/html/slide_8.html

对象间通信
大多数GUI包的触发动作,通过回调函数。
信号/槽比回调函数要安全,这利益于它是类型安全的。
可以多对多连接

允许进行对象封装(发送者不需要知晓接收者)
强大的组件编程机制

高效:在奔腾133上只需10微秒

事件
http://www.blackie.dk/~dfaure/conf/oops/html/slide_9.html

常用工具包事件
在对象类中支持而不是窗体类。
例如:定时器事件

Qt的事件主循环:
-从事件队列中取回本地窗口系统事件
-把它们译成QEvent
-把翻译后的事件发送到QObjects.

窗体(或其它对象)再实现事件过滤。

受控指针
http://www.blackie.dk/~dfaure/conf/oops/html/slide_10.html

一个受控指针和普通的C++指针行为一致,
除了在它引用的对象销毁时自动置为null。

这种情形下,普通的C++指针变成了“幽灵指针”

主要应用
保存指向QObject对象的指针,该指针为其它对象持有并且会在你还引用它的时候销毁了。

共享对象
http://www.blackie.dk/~dfaure/conf/oops/html/slide_11.html

Qt中的很多类都优化了数据共享机制。
好处:数据拷贝和内存使用最小化

深度拷贝:copy()
浅拷贝:赋值(operator=)

显式共享:detach() - 直接访问数据时
隐式共享:修改时detached.

实例:QString

共享指针
http://www.blackie.dk/~dfaure/conf/oops/html/slide_12.html

一个共享指针:

控制对象的生存时间
当没人需要该对象时,删除它

实例:从2进制缓存中抽取的文件类型信息

组件技术
http://www.blackie.dk/~dfaure/conf/oops/html/slide_13.html

十月以前:KOM/OpenParts
-基于CORBA

现在:KOfficer的KParts + DCOP
-共享库

KDE-1.89以后:KDE的KParts + DCOP

KOM/OpenParts
http://www.blackie.dk/~dfaure/conf/oops/html/slide_14.html

KOM:基于CORBA的对象模型
管理Qt对象模型(信号,槽)

OpenPartsUI:Qt窗体的抽象层
OpenParts:高层框架
(文档,视图,Part,窗口,应用程序)

提供到别的进程的嵌入
(包含菜单和工具栏的合成)

KParts
http://www.blackie.dk/~dfaure/conf/oops/html/slide_15.html

高层框架
(Part,视图,窗口,Shell)

基于Qt,本地窗体工具包

每个part(组件)都 是一个共享库
动态打开

比照
http://www.blackie.dk/~dfaure/conf/oops/html/slide_16.html

KOM/OpenParts VS KParts
在各个特定的包中开发 VS 在本地工具包中开发
(常位于Qt后,要学习) (已知的,应用可独立使用)

每个方法都调一堆参数 直接调用
(性能很差) (要快得多)

进程间通信 全部在一个进程中
(不稳定,服务器总运行) (不会出现通信失败)

-->桌面分布系统上 -->更适用于组件嵌入
所有的不足
但是,进程间通信怎么办?

进程间通信
http://www.blackie.dk/~dfaure/conf/oops/html/slide_17.html

下一代KParts
http://www.blackie.dk/~dfaure/conf/oops/html/slide_18.html

KOffice
http://www.blackie.dk/~dfaure/conf/oops/html/slide_19.html

链接
http://www.blackie.dk/~dfaure/conf/oops/html/slide_20.html

Tuesday, May 16, 2006

通过ssh访问远程linux主机

1. 在window通过cygwin
1)创建RSA key
In $(CYGWINDIR)\usr\bin, execute ssh-keygen.exe, this will ask you for inputting some key password, just press enter for a null password and accept other default settings.
ssh-keygen.exe will generate a pair of keys in the $(CURRENT_USER_PROFILE)\.ssh\ directory, id_rsa and id_rsa.pub which are the private RSA key and the public RSA key, respectively. $(CURRENT_USER_PROFILE) are normally d:\profiles\$(YOUR_EMAILID).
Since the private key id_rsa are stored in the windows machine which is itself password-pretected, null password for the key during the creation procedure by ssh-keygen.exe will not make your system LESS secure.
2) 拷贝公钥到远程linux
保存在$(HOME)/.ssh/authorized_keys文件中
3) 通过ssh登录远程主机。

2.在远程主机运行图形界面到windows的cygwin
在windows命令行界面运行ipconfig查看本地IP。
运行cygwin并startx启动X server
运行xhost +命令允许远程使用本地X服务
登录远程linux主机设置远程linux主机的环境变量DISPLAY=windows_host_ip:0.0
运行图形界面程序。

Tuesday, May 09, 2006

豆豉排骨

1. 备料
排骨适量
葱姜蒜(大块),酱油,料酒,盐3勺,味精少许,糖适量,干豆豉几两。

2. 制作
排骨加酱油,料酒,盐,味精,糖腌上20分钟,加入豆豉和葱姜蒜,拌匀。
在高压锅中放水适量,垫上支脚,把腌好的排骨连盘放入锅中。
盖上盖,加火烧到吱吱冒气,盖上高压锅的阀,继续蒸上40分钟,出锅开吃。

Saturday, April 22, 2006

Free Tool Box on Windows

1. SlickRun
http://www.bayden.com/SlickRun/
SlickRun is a free floating command line utility for Windows. SlickRun gives you almost instant access to any program or website. SlickRun allows you to create command aliases (known as MagicWords), so C:\Program Files\Outlook Express\msimn.exe becomes MAIL.

Enter a web URL into SlickRun and it will launch your browser and navigate to the specified address. Run multiple programs in a few keystrokes, jot a note, look up a definition... SlickRun is the most natural way to interact with your computer.

2. Vim + Cscope
http://www.vim.org/
http://cscope.sourceforge.net/

There are a lot of useful plugin for vim too.

3. Monad
http://www.pcpchina.com/download/msh_x86_beta1.zip

and here is the .NET framwork
www.microsoft.com/downloads/details.aspx?FamilyID=7ABD8C8F-287E-4C7E-9A4A-A4ECFF40FC8E&&displaylang=en

Next generation command line tool for windows, instead 'cmd'

4. startdict
http://stardict.sourceforge.net
A useful free dictionary.

Tuesday, January 10, 2006

程序员的自我解剖

习惯是长期养成的,
每一种职业都给从业者或多或少带上些许惯性:
从言谈举止到心理思维。
由此可知,程序员自然也免不了。

1. 控制欲比常人会强些
越是优秀的程序员,往往会控制着程序,从上层到下层。
常此以往,便会慢慢把这种惯势移植到生活的各个方面。
谈恋爱时,试图全方位控制对方,容易遭到抗拒。
在公司,试图控制并修改诸多不如意之处,到处发飚,易沦为空谈空想。

2.与人协调能力的退化
长期与机器打交道,
渐渐习惯了与键盘鼠标的交流方式,
到了具有能动性的人面前,
就很不适应起来。

3.充满敌意与对抗
程序员常常与自己的敌人bug相伴相生,
而又无时无刻不是努力地人一个bug走向另一个bug,
因此他们的潜意识里就是敌意为先,凡事对抗是主流。
而且越是差的开发氛围的程序员,情况直严重。