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
运行图形界面程序。