博文

目前显示的是 十一月, 2007的博文

CORBA/TAO学习笔记

对象:一个CORBA编程实体,由一个标识符、一个接口和一个实现组成。对象也被称作仆人(Servant)。
对象引用:一个强类型的不透明句柄,用于标示一个对象的位置。
客户:对对象实现的接口进行调用的程序实体。
通过一个对象引用对其发送请求。
对象请求中介(ORB):提供一种机制实现客户和对象之间的请求的透明传递。对于分布式程序而言,它使得客户像调用本地函数一样调用远程函数。
ORB接口:一个ORB是一个可以被多种方式实现的逻辑实体。为了把应用的从实现细节中分离出来,CORBA规格对每个ORB定义了一个抽象接口。这个接口提供了一些有用的工具函数,例如把一个对象的引用转换成字符串。
说具体一点,一个CORBA接口就像一个纯虚的C++类。它没有任何数据成员,没有任何protected或private成员,所有的函数都是public且纯虚的。
CORBA IDL stubs and skeletons:它们像胶一样把客户端和服务应用程序分别和ORB粘起来。这些通常是由CORBA IDL编译器完成的。
动态调用接口(DII):这个接口允许客户端直接访问由ORB提供的底层请求机制。
动态Skeleton接口:这个就相当于服务器端的(DII)。
对象适配器:它帮助ORB把请求传递给对象,并且激活该对象。更重要的是,对象适配器将对象的实现和ORB联系起来。
OMG接口上的每一个操作必须具有:
1、一个名字
2、一个返回类型,可以为void
3、0个或多个参数
同时它还可以可选的含有:
1、一个raises语句,标明这个操作可能会引发哪些异常。
2、一个oneway修饰符,标明调用者不期望得到任何结果 (一般不要使用)
3、一个context语句。(这个是过时的且不可移植的,不该再被使用)
另外,操作不支持重载。
IDL到C++的映射规则:
1、每个module(模块)被映射到一个namespace或者class
2、每个interface被映射到一个class
3、每个操作被映射到c++中的一个方法
4、每个属性被映射成一对 get/set 方法
CORBA的基本设计原则:
1、将接口与实现相分离
2、位置透明。服务的使用和服务的位置是不相关的。
3、访问透明。直接通过对象执行调用。
4、类型化的接口。
5、接口支持多继承。
CORBA/C++中的参数传递:
1、内置的传入类型参数,例如,char,long,按值传
2、用户定义的传…

[转载]莫斯科大学数学力学系数学分析教学大纲

数学分析
第一学期
1。集合,集合的Cartesian积,函数与映射,集合的等价,有理数集的不可数性。
2。集合及其子集蔟的不等价性的Cantor定理。连续统的不可数性。
3。自然数,自然数的公理与运算,数学归纳原理。
3。实数的小数表示,Archimedes公理,有界数集的确界存在性。
4。集合的可分理性引理,数集的分割引理。
5。实数域的唯一性原理,实数域的完备性。
6。数列,无穷大与无穷小数列及其性质,Bernoullis不等式与Newton二项式。
7。收敛数列与他们的算术性质,Stolz定理。
8。求代数方程根的迭代方法。
9。复合收敛数列的Toeplitz变换,Toeplitz定理,数列极限的Cauchy定理,数列的Cau
chy和,Abel定理。
10。极限的定义,单调数列,Weierstrass定理。
11,无理数与有理数。
12。子列的极限,Bolzano-Weierstrass定理。
13。数列收敛的Cauchy准则。
14。函数极限的Cauchy定义,无穷小函数,函数极限的有限性,单调函数极限的性质,
连续函数的算术运算。
15。函数极限存在的Cauchy准则。
16。函数极限的Cauchy与Heine定义的等价性。
17。复合函数的极限。
18。函数在某一点上的连续,连续函数的算术运算,三角函数与指数函数的连续性。
19。一些重要的极限。
20。单调函数的间断,单调函数的不连续性。
21。反函数的连续性,初等函数的连续性,Kepler方程解的连续性。
22。区间上连续函数介值的Cauchy定理。
23。区间上连续函数一致连续性的Cantor定理。
24。Khinchin归纳原理,数直线上的连通集,连续函数的连通性,。
25。函数可微性的概念及其导数,函数连续性与可微性的联系,反函数与复合函数的导
数,Kepler方程解的可微性。
26。导数的和、差、积、商,Leibnitz公式。
27。增函数的Darboux定理,Rollet定理,导数的中值定理。
28。Cauchy定理与Lagrange定理。
29。常数、单调与严格单调函数的判断准则。
30。l'Hopital第一公式,具有Pean余项的Taylor公式。
31。l'Hopital第二公式。
32。具有Lagrange余项的Taylor公式,初等函数按Taylor公式展开。
33。函数极值的判断与必要条件。
34。函数的的凸性,奇点,渐进线,Jen…

检测一个进程是否还在运行(safe_xxx)

mysqld给我们提供了一种模式,就是:
不直接启动daemon(mysqld),而是通过一个脚本来启动这个daemon(safe_mysqld),并定时检查这个daemon是否还存在。
如何给我们自己写的daemon也做到如此效果呢?freebsd下提供了一个叫做daemon的命令(man 8 daemon)
假设我们有一个叫做taskd的进程
那么我们可以这样启动它
daemon -f -p /var/run/taskd.pid /usr/local/bin/taskd
然后把这个命令加入到crontab中,让其每分钟执行一次。那么系统就会自动每分钟检查taskschd这个程序是否还在,不在则自动重起。

自己写个类似于BDB的数据库?

其实本来我只是需要一个队列系统,所需要的数据存储和并发控制、同步功能在BDB中都有,一切都很完美。但是,最初遇见的是环境的问题,因一个进程异常退出而导致要重新启动所有使用该环境的进程。这个问题刚解决,又遇到了死锁的问题。BDB我只懂皮毛,不知道死锁如何产生的,只知道在shell下运行db_deadlock就可以让陷入死锁的程序继续运行下去。神啊!
BDB的同步还存在一个问题,就是多个进程/线程在等待同一个queue类型的数据库的数据的时候,当一个数据被塞进去后,是所有在等待的进程都被唤醒。怎么办?
最基本的思想,就是通过mmap把一个文件映射到内存中来,然后这个文件分为两部分,head和data。head中是一些meta data,诸如counter of items、mutex等,后面是一系列的data。
每次打开前,需要获取一个跨进程的锁,然后检查meta data部分的有效性,如果出错,那么尝试恢复或者退出。
对于queue这样的等待事件,最好是用 posix semaphores 来通知/唤醒。
。。。。
一些零碎的想法,嗯。

在TAO中用线程池创建CORBA服务

1、创建ORB、poa、poa_manager对象
CORBA::ORB_var orb = init_orb_with_naming_service(argc,argv); CORBA::Object_var poa_object =
orb->resolve_initial_references ("RootPOA");
PortableServer::POA_var poa =
PortableServer::POA::_narrow (poa_object.in ());
PortableServer::POAManager_var poa_manager =
poa->the_POAManager ();
poa_manager->activate ();
TAO_ORB_Manager orb_manager(orb.in(),poa.in(),poa_manager.in());
如果一切都采用默认的话,可以直接用TAO_ORB_Manager这个类协助创建。
2、创建对象并注册服务
CORBA::Object_var naming_context_object =
orb->resolve_initial_references ("NameService");
CosNaming::NamingContext_var naming_context =
CosNaming::NamingContext::_narrow (naming_context_object.in ());
CosNaming::Name name (1);
///创建对象
slib_ChannelFactory_i channelFactory_i(poa.in(),poa_manager.in());
///用默认poa激活
::slib::ChannelFactory_var channelFactory=channelFactory_i._this();
name.length (1);
name[0].id = CORBA::string_dup ("my…

gcc的又一个BUG:优化abs出错?

测试代码: #include <stdlib.h> #include <stdio.h> intmain(){ int i=2; if( (-2*abs (i-1)) == (2*abs(i-1)) ) printf ("OMG,-10==10 !!\n"); elseprintf ("nothing special here\n"); } 测试环境:
Freebsd 6.2, gcc 3.4和gcc 4.2
输出都是"OMG,-10==10 !!"。
为什么呢?
freebsd的libc的abs的实现在/usr/src/lib/libc/stdlib/abs.c,但是我在gdb中对这个函数下断点发现并没有进入这个函数。然后用gcc -S编译,查看源代码发现它并没有调用libc库的abs函数,而是被gcc优化掉了,尽管我是用gcc -O0编译。
核实了下,的确,gcc在其内部实现了abs函数,如果这样编译
gcc42 -o test1 test1.c -ggdb -fno-builtin
则就调用libc的abs函数,就没有问题了。

真是想不到什么办法对一个typedef进行forward declaration

我要在一个类的头文件中使用 DB* db_handle;这样一个变量。DB这个类型是在BDB的头文件中定义的,但是我又不希望在我的头文件中包含BDB的这个头文件。于是我就尝试用
struct DB;
这样的方式在我的头文件中进行forward declaration。但是不幸的是,DB是一个typedef而不是一个struct/class;
struct __db;
typedef struct __db DB;
唉~~
我真是想不到什么办法对一个typedef进行forward declaration,只是被迫的先声明成void*然后在使用的时候强行的转成DB*。

TAO中序列化一个对象

每种RPC方式都必须提供一种序列化机制,以把参数列表中的参数转化成字节流通过传输层发送给对方。如sun rpc使用的是xdr,web service使用soap格式的xml。而对于CORBA,标准中并没有对之做细致的规定,只是在iiop中做了一些简略的规范。
下面一段示例代码序列化一个Any对象。(这里所说的序列化与POA中的持久化还是有些区别的。) TAO_OutputCDR cdr; cdr << data; CORBA::ULong size(ACE_Utils::truncate_cast<CORBA::ULong> (cdr.total_length ())); CORBA::OctetSeq seq(size); seq.length (size); char* buffer = reinterpret_cast<char*> (seq.get_buffer ()); { char* buf = buffer; for (ACE_Message_Block const* mb = cdr.begin (); mb != 0; mb = mb->cont ()) { ACE_OS::memcpy (buf, mb->rd_ptr (), mb->length ()); buf += mb->length (); } } 之后就可以以这样的方式把这个对象发送给对方 socket_.send (buffer, size);

一个想法,用CORBA封装BDB

BDB是一个非常棒的东西,但是有很多局限性。例如
1、它仅限于同主机内访问,数据库和应用程序必须放在同一台主机上。尽管提供了sun rpc接口,但是用起来很不方便
2、使用同一个环境的所有进程中,只要有一个死掉(在关闭环境之前意外退出),其它的就得概率性的统统重新打开环境。
如果,我提供一个类似于mysqld的东西,恩,就叫bdbd(有些绕口)。它以corba的方式对外提供OO接口。恰好,bdb的C api都是OO风格的。嗯,那么就解决了这两个问题。
需要额外要做的,是几个认证接口。还好前几天我刚分析了mysql的协议,我准备借用它的一些函数来完成这件事情。

可恶的TAO/COS Event Service

我希望借COS Event Service实现队列,于是就采用了PushSupplier和PullConsumer。 但是问题百出。event怎么着都无法从supplier传递到consumer中去。
我先启动consumer,结果supplier无法启动,挂起在这里
CosEventChannelAdmin::ConsumerAdmin_var comsumer_admin = ec->for_consumers();
我先启动supplier,ok,一切都好,数据发送成功。但是consumer却一直停留在CosEventChannelAdmin::ProxyPushConsumer_var->push(data);这里。死活都一直接收不到数据。最可恨的是,然后我无论试图再启动一个consumer或者supplier,都无法启动,依然是停留在ec->for_consumers这里,不知道为什么。
OMG~ 谁指点下我?为什么会这样?
为什么会停留在ec->for_consumers?为什么接收不到数据?数据去哪里了?

corba的效率啊……

本来以为corba的效率会很高,结果比较出乎我的意外。我用的是tao,它的设计和实现是侧重于嵌入式系统和实时应用的,效率应该是比较不错的。但是……执行一个非常简单的corba调用,需要4s或者更久。我加了些调试语句,发现主要是慢在第一次执行调用的时候。此时要建立网络链接等等,需要花很久时间。之后几次调用就非常快。
唉。。。。

终于在treo 650上装好QQ了

在tompda上找到一个, firstfan做的。
感觉……这个QQ比较简陋。聊天的时候输入一段话后,如果点完成而不是发送,再次进来的时候,刚才输入的话居然不见了。
另外,没有群的功能?
唉……palm越来越没落了

Freebsd 6.2下编译ACE 5.6.x

遇到两个错误:
1、In file included from ../../ace/OS_NS_signal.h:149, from ../../ace/Signal.h:29, from ../../ace/Dev_Poll_Reactor.cpp:5: ../../ace/OS_NS_signal.inl: In function 'int ACE_OS::pthread_sigmask(int, const sigset_t*, sigset_t*)': ../../ace/OS_NS_signal.inl:31: error: '::pthread_sigmask' has not been declared gmake[3]: *** [libACE_la-Dev_Poll_Reactor.lo] 错误 1 gmake[3]: Leaving directory `/data0/install/ACE_wrappers/objdir/ace' gmake[2]: *** [all-recursive] 错误 1 gmake[2]: Leaving directory `/data0/install/ACE_wrappers/objdir/ace' gmake[1]: *** [all] 错误 2 gmake[1]: Leaving directory `/data0/install/ACE_wrappers/objdir/ace' gmake: *** [all-recursive] 错误 1 解决办法:
打开ace/OS_NS_signal.inl,在头部添加#include <pthread.h>#include <signal.h>2、In file included from ../../ace/OS_NS_netdb.h:142, from ../../ace/ICMP_Socket.cpp:9: ../../ace/OS_NS_netdb.inl: In function 'hostent* ACE_OS::gethostbyaddr_r(constchar*…