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,
因此他们的潜意识里就是敌意为先,凡事对抗是主流。
而且越是差的开发氛围的程序员,情况直严重。

Wednesday, November 30, 2005

嵌入式根文件系统常见种类

《Building Embedded Linux System》第8章第1节介绍了常见根文件系统,
CRAMFS, JFFS2, JFFS, Ext2 over NFTL, Ext3 over NFTL, Ext2 over RAM disk。
文件系统的主要特性有:
Write, Persistent, Powr down reliability, Compression, Lives in RAM。

可写性(Write)指是否可向文件系统写内容,除CRAMFS外都支持。
持久性(Persistent)指文件系统修改效果重启后是否还在,
CRAMFS和Ext2 over RAM disk外都有。
对文件修改时突然掉电时修改是否存在(Poer down reliability)
只有JFFS2,JFFS和Ext3 over NFTL具备。
压缩性(Compression)指文件系统的内容是压缩的,CRAMFS和JFFS2有。
文件系统挂载时其内容是否从存储介质一次性进驻内存(
Lives in RAM),
只有
Ext2 over RAM disk才这么干。

书中表8.1以二维表的形式列出文件系统与它们支持的特性,
并在其后章节中加入说明各种文件系统。

Friday, November 25, 2005

招聘的广告

如今,看国内的招聘广告几乎清一色的薪水面议,
我不知道是这些用人单位在炫耀自己有多么出色的评估能力,
还是什么别的原因,
比如,你在面试时越能蒙,我就给你高点,不然少点。

也许是这些雇主认为现在求职的人多了,
自己的买方市场,
总会有人来找这份工作的,
难怪企业都是短命的,
活过了十来年的也是浑身上下没一处还是完好的。

Thursday, November 24, 2005

嵌入式linux系统

嵌入式linux系统涉及颇多,
诚如《Building Embeded Linux System》一书概括的,
嵌入式意味着要从软件和硬件两方面进行开发、编程和调试,
Linux系统需要有Unix系统管理任务,如硬件配置,系统设置维护及用shell脚本自动化,
嵌入式Linux系统更多的还要知道开发调试各种Linux设备驱动,及内核操作,
大凡在Linux下开发不可避免地要有效使用GNU工具包括各种不同工具的诸多选项。

人云“不谋万事者,不足以谋一时”,
一旦想要涉足嵌入式Linux系统这个领域,
就应当就上述各方面进行布局,
并不断操练提高,才是长久之计。

《Building Embeded Linux System》是一本不错的总纲,
还提供了一个几乎可套用的worksheet,值得一阅。
《Linux Devices Driver》则是一本专门讲述Linux下设备驱动开发的书籍,
其它方面实在还没找到很经典的,gnu官方网站的文档值得关注。

Wednesday, November 23, 2005

STL容器的内存增长

在C语言中,如果我们分配了一个能容纳10个元素的数组arr,
如果arr中已经含有了10个元素,我们又想向其中加入一个元素,
这时就需要进行内存重分配了,
向C++标准STL容器添加元素同样会面临类似的内存增长问题。

完成上述所需任务,我们需要做以下几件事:
1.分配有足够空间的一块新内存;
2.把原数组所有元素复制到新内存;
3.销毁原数组的所有元素对象;
4.释放原数组所占内存空间。

由上可见,内存重新分配后元素通常都不再保存在原有的内存地址,
内存重新分配捎带进行的元素复制代价不菲(复制元素,销毁对象、释放内存)。
C++把内存管理的重任从程序员肩上挑了过去,
每当调用insert或者push_back/front等添加元素到STL容器中会自动判断是否进行上述4步。

可以想像出,如果在内存重分配前用一些指针变量保存了数组arr的元素地址,
在进行重分配后,这些指针通常都将指向无效的地址。
向C++的STL的容器中加入新元素时,
此前保存的迭代器变量遇到内存增长后也将是无效的。

避免内存重分配在程序运行效率、正确性方面都有重要意义,
如果在C++程序中确切知道某个容器需要容纳的元素总数,
可以直接用reserve成员预留出足够的空间,
使其后向其增加元素不会引起内存增长。

Tuesday, November 22, 2005

你是不是故意的呀?

记得韩国人李健熙刚从日本学成回国接掌父亲留下的三星集团,
向日本藉的员工发飚:
听说你们日本人做事向来都很认真负责,
做出来的产品都讲质量的,
可是为什么你们在三星做的却不是这样,
是不是你们只给日本做才可以做成那样?
底下的日本员工这样回答他:
不是这样的,老板,
我们也想认真负责,也想把产品做好,
可是决策层今天要我们做一台冰箱,明天又让我们搞个电视,
忙不过来呀,老板。
于是小李子说:好吧,从今天起你们就给我只做一台电视,
于是三星就把所有的精力砸在那台电视机上,
做出质量过硬的电视后,三星又把精力放到另一个数码产品上,
于是三星就从一个不怎么起眼的N流企业慢慢地挤到一流。

小时候课本上也讲起宴子出使齐国(或者是楚国,记不太清了)说过,
桔子到了北方结出来的果子就变成了枳子,
可是如今我们有时候还是不能好好理解其中的玄机,
有时候我们还会这样说:
那小子在学校时考试年年都披红挂绿,没想到如今竟然怎样怎样。
你小子原来在我的项目组做的东西狗屎不是,现在做得这样好,是不是故意呀?

我想这样的话说过一次是可以原谅的,因为无知嘛。
如果重复地又说了一次也可以原谅,因为不小心了。
如果说过或听过两次以后自己还要说,那就有点悲哀了,
倘若乐此不疲地逢人就说,那是无可救药了。

别人考试老不如你,那仅仅是过去,
可能是那时人家因为无知或者幼稚没怎么去好好学,
也可能是方法不当学得效率很低或者其它什么原因,
但是如今人家不是也不需要跟你比考试了,你干嘛还这么无知?

人家在你手下的时候项目是由你来支配的,
也许做出来的烂东西正是按照你想法来做的,
也许你没有发现并发挥人家所擅长的能力,
总之你应该羞愧自己而不是去追究别人。

Sunday, November 20, 2005

STL的删除算法

从STL容器中删除元素对不同容器有不同的考虑,
使用不当可能会降低代码的效率,甚至产生无法预期的后果。
因为关联容器的erase成员返回值为void与其它STL容器返回值不同,
《Effictive STL》的Item9就总结了各种情形下的用法:

删除容器中等于某个值的所有元素时,
对连续存储的线性容器用erase成员套remove算法,
list有自己的remove成员可直接使用,
关联容器的erase成员可直接完成。

删除容器中满足某个谓词的所有元素时,
线性容器用erase成员套remove_if算法,
list的remove_if成员可以搞定,
关联容器可以用效率低下的remove_copy_if后接swap算法,
或手工循环并在调用erase成员时对迭代器使用后缀的++自增运算。

倘若在每删除一个元素时还要做点其它工作,
对线性容器可用手工循环,每次要用erase返回的迭代器位置更新,
对关联容器,需要同删除满足谓词的容器元素相同地后缀++的erase。

STL的某个实现版本的remove算法先调用find找到某个迭代器位置,
如果是序列末则返回该迭代器位置,
否则返回对该位置后面的子序列调用remove_copy算法,
给定的目标起始位置为find返回的迭代器位置。

同版本的remove_copy实现用for循环遍历输入的序列,
遍历每一步测试如序列元素值不与输入的值相等则把该元素赋值到目标迭代器位置,
同时目标迭代器位置前移,
最后返回目标迭代器位置。

remove_if和remove_copy_if的实现类似,
只是测试的条件用输入的谓词代替了等于运算符。

Thursday, November 17, 2005

输入法

今天发现尉迟方兄的blog有不少跟输入法相关的链接:
http://www.cnblogs.com/realfun/archive/2005/03/28/127152.aspx
此人还发布了一个输入法源码:
http://realfun.cnblogs.com/archive/2005/06/26/181302.aspx

Yuking兄在linux的输入法项目fcitx是个C语言编写的
http://www.fcitx.org

Input Method Architecture for X Window/Open source Platform
see to http://wiki.debian.org.tw/ChineseInformationProcessing#.E8.BC.B8.E5.85.A5.E6.B3.95
1. Xim.
ftp://ftp.x.org/pub/R6.3/xc/doc/hardcopy/XIM/xim.ps.gz
http://www.mozilla.org/projects/intl/input-method-spec.html
2. GTK+/Qt IMModules
3. IIIMF Internet/Intranet Input Method Framework
4. SCIM Smart Common Input Method platform
http://www.scim-im.org
http://sourceforge.net/projects/scim

modules list:scim, skim, IMEngines, scim-qtimm
qt_immodle http://www.kde.gr.jp/~daisuke/immodule_for_qt/ImmoduleForQtDocs.html
5. Qtopia的输入法及plugin
Writing Qtopia2.20 plugins: http://doc.trolltech.com/qtopia2.2/html/writing-plugins.html

6. links about chinese ime
http://www.chineselanguage.net/guide/Learn_Chinese/Input_Method/index.php

Wednesday, November 16, 2005

STL的排列算法

《Effictive STL》的item3提及两个算法:
previous_permutation和next_permutation,
看了STL的实现源码后仍有些不解,
于是在网上搜索到一篇不错的文章。

http://www.dogma.net/markn/articles/Permutations/
是Mark Nelson发表在C/C++ Users Journal上的
"C++ Algorithms: next_permutation()"
很不错的。

该文从一道小学六年级的数学作业落笔,
给出了该题的解题程序,
然后解说数字排列,
进而剖析了STL的next_permutation算法的实现。

文章最后举一实例模拟算法的运行后,
详细阐述算法在序列中出现重复值时的行为。
这个网页的上级目录还有各类其它文章,
或许值得一读。