七月 2006 - 博客

RTCSample例子程序分析 (VI)

CRTCGroup

这个类用于实现网友组群的概念,它需要一个窗口。提供了RegisterClass用于注册窗口类,而WindowProc处理窗口过程。在这里处理以下Windows消息:WM_CREATEWM_DESTROYWM_CLOSEWM_SIZEWM_COMMANDWM_NOTIFYWM_POPULATE

 

OnCreate

创建界面元素,这里只有一个列表框。

 

OnDestroy

清理资源。

 

OnClose

关闭窗口(DestroyWindow)。

 

OnSize

重新调正各个控件的大小。

 

OnCommand

这里处理了菜单等各种命令。主要处理了ID_FILE_EXITID_ACTION_ADDGROUP,其中ID_ACTION_ADDGROUP是主要的,用于增加群组。

 

OnNotify

这里处理了列表框相关的一些操作,在列表框中列出了当前所有的群组。主要处理了右键快捷菜单。菜单中包含了删除群组,删除网友,增加网友等操作。

 

PopulateGroupList

这是一个自定义的消息(WM_POPULATE定义在CRTCWatcher中)。在这里会列出所有的群组。

 

其他

该类提供了一些辅助函数用于完成各种功能。

 

    // Update a group entry in the group list

    HRESULT UpdateGroupList(IRTCBuddyGroup * pGroup);

    // Clear the group list

    HRESULT ClearGroupList(IRTCBuddyGroup * pGroup);

    HRESULT ClearGroupList();

    // Add a group

    HRESULT DoAddGroup(BSTR bstrNamee);

    // Remove a group

    HRESULT DoRemoveGroup(IRTCBuddyGroup *pGroup);

    // Add a buddy to a group

    HRESULT DoAddBuddyToGroup(BSTR bstrBuddyURI, IRTCBuddyGroup *pGroup);

    // Remove a buddy from a group

    HRESULT DoRemoveBuddyFromGroup(BSTR bstrBuddyURI, IRTCBuddyGroup *pGroup);

    // Event handlers

    HRESULT DeliverGroup(IRTCBuddyGroup *, RTC_GROUP_EVENT_TYPE, LONG);

 

Posted 作者 zhaoyang0618 | with no comments

RTCSample例子程序分析 (V)

CRTCIMSession

这个继承自CRTCSession,实现了IM会话。这里需要一个窗口,因而提供了RegisterClassWindowProc等函数,该类还子类化了一个Edit控件,和窗口相关的是一个标准的Windows编程,RegisterClass用于注册窗口类,而WindowProc实现窗口过程。在WindowProc中处理了以下几个Windows消息:WM_CREATEWM_DESTROYWM_CLOSEWM_SIZEWM_COMMAND。至于子类化Edit控件部分,主要是希望用户按下Enter键的时候能够把消息发送出去。

 

OnCreate

这里响应了WM_CREATE消息的处理,主要是创建了3个控件,1Edit控件,1Button控件,还有1ListView控件。

 

OnDestroy

在这里清理资源,删除整个参与者列表。

 

OnSize

重新调正各个控件的大小。

 

OnClose

这里没有重新实现该函数,而是使用了基类的函数(这是一个虚函数)。

 

OnCommand

这里处理菜单,按钮等命令。值得注意的就是发送消息和增加参与者两个命令的处理。

 

其他

这里还有许多辅助函数,用于完成和通信会话相关的各个任务。

 

//更新参与者列表

HRESULT UpdateParticipantList(IRTCParticipant * pParticipant);

//清除参与者列表

HRESULT ClearParticipantList();

// 发送即时消息(IM)

HRESULT DoSendMessage();

//显示即时消息

HRESULT DoDisplayMessage(PWSTR szUser, PWSTR szMessage);

//发送状态信息

HRESULT DoSendTyping();

// 显示状态信息

HRESULT DoDisplayTyping(PWSTR szUser, BOOL fTyping);

//增加网友

HRESULT DoAddParticipant(BSTR bstrURI);

// 删除网友

HRESULT DoRemoveParticipant(IRTCParticipant * pParticipant);

//消息处理

virtual HRESULT DeliverSessionState(RTC_SESSION_STATE);

virtual HRESULT DeliverParticipantState(IRTCParticipant *, RTC_PARTICIPANT_STATE);

virtual HRESULT DeliverMessage(IRTCParticipant *, BSTR, BSTR);

virtual HRESULT DeliverUserStatus(IRTCParticipant *, RTC_MESSAGING_USER_STATUS);

 

 

CRTCAVSession

 这个类同样继承自CRTCSession。许多地方和CRTCIMSession类似,它也是需要一个窗口,于是应该提供注册窗口类(RegisterClass)和进行窗口过程处理(WindowProc)。在WindowsProc中处理了一下Windows消息:WM_CREATEWM_DESTROYWM_CLOSEWM_SIZEWM_COMMANDWM_HSCROLLWM_TIMER

 

OnCreate

创建界面元素。

 

OnDestroy

在这里清除资源。

 

 

OnClose

关闭窗口,主要是发出WM_DESTROY消息。

 

OnSize

重新调正各个控件的大小。

 

OnCommand

处理各种菜单或者按钮命令的处理。

 

ID_VIEW_VIDEODoVideo

 

ID_VIEW_APPSHARINGShowAppSharing

 

ID_VIEW_WHITEBOARDShowWhiteBoard

 

IDC_MIC_MUTEDoMute

 

IDC_SPK_MUTEDoMute

 

 

OnHscroll

控制声音的。

 

OnTimer

随时获取网络质量的数据,在状态栏显示。

 

其他

这里还有许多辅助函数,用于完成和通信会话相关的各个任务。

 

// 音频

HRESULT DoMute(RTC_AUDIO_DEVICE);

 

// 音频中音量

HRESULT DoVolume(RTC_AUDIO_DEVICE, long);

 

// View video

HRESULT DoVideo(BOOL);

 

// Start app sharing

HRESULT ShowAppSharing();

 

// Start white board

HRESULT ShowWhiteBoard();

 

// Update the audio controls display

HRESULT ShowAudio();

 

// Update the video controls display

HRESULT ShowVideo(RTC_VIDEO_DEVICE, BOOL);

 

// Event handlers

virtual HRESULT DeliverMedia(long, RTC_MEDIA_EVENT_TYPE, RTC_MEDIA_EVENT_REASON);

virtual HRESULT DeliverIntensity(RTC_AUDIO_DEVICE, long);

virtual HRESULT DeliverClient(RTC_CLIENT_EVENT_TYPE);

 

//Network Quality methods and members

void StartMeasuringQuality();

void StopMeasuringQuality();

Posted 作者 zhaoyang0618 | with no comments

二十世纪的数学 (转贴)

二十世纪的数学

Michael Atiyah

    谢谢邀请我来这里参加这个活动.当然,如果有人想谈论一个世纪的终结以及下一个世纪的开始,那么他有两个具有相当难度的选择:一个是回顾过去百年的数学;另一个是对未来百年数学发展的预测,我选择了前面这个比较困难的任务,任何人都可以预测未来而且我们并不能判定是对还是错.然而对过去的任何评述,每个人都可以提出异议.

    我在这里所讲的是我个人的观点.这个报告不可能包含所有内容,特别是,有一些重要的内容我不准备涉及,一部分是因为我不是那些方面的专家,一部分也是出于它们已经在其他地方被评述过了.例如,我不会去谈论那些发生在逻辑与计算领域内的著名事件,这些事件往往是与像Hilbert,Godel,Turing这些伟大的名字相关的,除了数学在基础物理中的应用之外,我也不会谈论太多数学的其他应用,这是因为数学的应用太广泛了,而且这需要专门的论述.每一个方面都需要一个专门的报告.也许大家在这次会议的其他报告中会听到很多关于这些内容的演讲.另外,试着罗列一些定理,甚至是列出在过去一百
年的著名数学家的名字也是毫无意义的,那简直是在做枯燥的练习.所以,代替它们的是,我试着选择一些我认为在很多方面都是很重要的主题来讨论并且强调围绕这些主题所发生的事情.

    首先我有一个一般性的说明.世纪是一个大约的数字概念.我们不会真地认为在过整整一百年的时候,有些事情会突然停下来,再重新开始,所以当我描述二十世纪的数学时,有些内容实际上可能是跨世纪的,如果某件事件发生在十九世纪九十年代,并持续到二十世纪初,我将不去计较这种时间方面的细节.我所做的就象一个天文学家,工作在一个近似的数字环境中.实际上,许多东西始于十九世纪,只不过在二十世纪才硕果累累.

    这个报告的难点之一是很难把我们自己放回到1900年时作为一位数学家的位置上,这是因为上个世纪的数学有非常多的内容已经被我们的文化和我们自己吸收掉了.难以想象人们不用我们的术语来思考的那个时代是什么样子的.实际上,如果现在有人在数学上有一个真正重要的发现,其后他也一定会与之一起被忽略掉了!他会完全地被融入到背景之中,于是为了能够回顾过去,我们必须努力去想象在不同时代,人们用不同方式思考问题时的情景.

                            从局部到整体

    作为开始,我准备列一些主题并且围绕它们来讨论.我谈论的第一个主题概括地讲,就是被大家称为从局部到整体的转变.在古典时期,人们大体上已经研究了在小范围内,使用局部坐标等等来研究事物.在这个世纪,重点已经转移到试图了解事物整体和大范围的性质.由于整体性质更加难以研究,所以大多只能有定性的结果,这时拓扑的思想就变得非常重要了.正是Poincaré,他不仅为拓扑学发展作出先驱性的贡献,而且也预言拓扑学将成为二十世纪数学的一个重要的组成部分,顺便让我提一下,给出一系列著名问题的Hilbert并没有意识到这一点.拓扑学很难在他的那些问题中找到具体体现.但是对Po
incaré而言,他相当清楚地看出拓扑学将成为一个重要的内容.

    让我试着列一些领域,然后大家就能知道我在想什么了.例如,考虑一下复分析(也被称为“函数论”),这在十九世纪是数学的中心,也是象Weierstrass这样伟大人物工作的中心.对于他们而言,一个函数就是一个复变量的函数;对于Weierstrass而言,一个函数就是一个幂级数.它们是一些可以用于写下来,并且可以明确描绘的东西或者是一些公式.函数是一些公式:它们是明确可以用显式写下来的.然而接下来Abe1,Riemann和其后许多人的工作使我们远离了这些,以至于函数变得可以不用明确的公式来定义,而更多地是通过它们的整体性质来定义:通过它们的奇异点的分布,通过它们的定义域位置,通过它们取值范围.这些整体性质正是一个特定函数与众不同的特性.局部展开只是看待它们的一种方式.

    一个类似的事情发生在微分方程中,最初,解一个微分方程,人们需要寻找一个明确的局部解!是一些可以写下来的东西.随着事物的发展,解不必是一个显函数,人们不一定必须用好的公式来描述它们.解的奇异性是真正决定其整体性质的东西.与发生在复分析中的一切相比,这种精神是多么的类似,只不过在细节上有些不同罢了.

    在微分几何中,Gauss和其他人的经典工作描述了小片的空间,小块的曲率以及用来描述局部几何的局部方程.只要人们想要了解曲面的整体图象以及伴随它们的拓扑时,从这些经典结果到大范围的转变就是很自然的了.当人们从小范围到大范围时,最有意义的性质就是拓扑的性质.

    数论也有一个类似的发展,尽管它并不是很明显地适用于这一框架.数论学家们是这样来区分他们称之为“局部理论”和“整体理论”的:前者是当他们讨论一个单个的素数,一次一个素数,以及有限个素数时;后者是当他们同时讨论全部素数时.这种素数和点之间,局部和整体之间的类似性在数论发展过程中起了很重要的作用,并且那些在拓扑学发展中产生的思想深深地影响了数论.

    当然这种情况也发生在物理学中,经典物理涉及局部理论,这时我们写下可以完全描述小范围性质的微分方程,接下来我们就必须研究一个物理系统的大范围性质.物理学涉及的全部内容就是当我们从小范围出发时,我们可以知道在大范围内正在发生什么,可以预计将要发生什么,并且沿着这些结论前进.

                              维数的增加

    我的第二个主题有些不同,我称之为维数的增加.我们再次从经典的复变函数理论开始:经典复变函数论主要是详细讨论一个复变量理论并加以精炼.推广到两个或者更多个变量基本上发生在本世纪,并且是发生在有新现象出现的领域内.不是所有的现象都与一个变量的情形相同,这里有完全新的特性出现,并且n个变量的理论的研究越来越占有统治地位,这也是本世纪主要成就之一.

    另一方面,过去的微分几何学家主要研究曲线和曲面,我们现在研究n维流形的几何,大家仔细想一想,就能意识到这是一个重要的转变.在早期,曲线和曲面是那些人们能真正在空间里看到的东西.而高维则有一点点虚构的成分,在其中人们可以通过数学思维来想象,但当时人们也许没有认真对待它们.认真对待它们并且用同样重视程度来研究它们的这种思想实际上是二十世纪的产物.同样地,也没有明显的证据表明我们十九世纪的先驱者们思考过函数个数的增加,研究不单单一个而是几个函数,或者是向量值函数(vector-valued function).所以我们看到这里有一个独立和非独立变量个数增加的问题.

    线性代数总是涉及多个变量,但它的维数的增加更具有戏剧性,它的增加是从有限维到无穷维,从线性空间到有无穷个变量的Hilbert空间.当然这就涉及到了分析,在多个变量的函数之后,我们就有函数的函数,即泛函.它们是函数空间上的函数.它们本质上有无穷多个变量,这就是我们称为变分学的理论.一个类似的事情发生在一般(非线性)函数理论的发展中.这是一个古老的课题,但真正取得卓越的成果是在二十世纪.这就是我谈的第二个主题.

                              从交换到非交换

    第三个主题是从交换到非交换的转变.这可能是二十世纪数学,特别是代数学的最主要的特征之一.代数的非交换方面已经极其重要,当然,它源自于十九世纪.它有几个不同的起源.Hamilton在四元数方面的工作可能是最令人惊叹的,并且有巨大的影响,实际上这是受处理物理问题时所采用的思想所启发.还有Grassmann在外代数方面的工作,这是另一个代数体系,现在已经被融入我们的微分形式理论中.当然,还有Cayley以线性代数为基础的矩阵方面的工作和Galois在群论方面的工作等.

    所有这些都是以不同的方式形成了把非交换乘法引入代数理论的基石,我形象地把它们说成是二十世纪代数机器赖以生存的“面包和黄油”.我们现在可以不去思考这些,但在十九世纪,以上所有例子都以各自不同的方式取得了重大的突破,当然,这些思想在不同的领域内得到了惊人的发展.矩阵和非交换乘法在物理中的应用产生了量子理论.Heisenberg对易关系是非交换代数在物理中的一个最重要的应用例子,以至后来被von Neumann推广到他的算子代数理论中.

    群论也是在二十世纪占重要位量的理论,我稍后再回来谈它.

                            从线性到非线性

    我的下一个主题是从线性到非线性的转变.古典数学的大部分或者基本上是线性的,或者即使不是很精确的线性,也是那种可以通过某些扰动展开来研究的近似线性,真正的非线性现象的处理是非常困难的,并且只是在本世纪,才在很大的范围内对其进行了真正的研究.

    我们从几何开始谈起:Euclid几何,平面的几何,空间的几何,直线的几何,所有这一切都是线性的.而从非欧几何的各个不同阶段到Riemann的更一般的几何,所讨论的基本上是非线性的.在微分方程中,真正关于非线性现象的研究已经处理了众多我们通过经典方法所看不到的新现象.在这里我只举两个例子,孤立子和混沌,这是微分方程理论两个非常不同的方面,在本世纪已经成为极度重要和非常著名的研究课题了.它们代表不同的极端.孤立子代表非线性微分方程的无法预料的有组织的行为,而混沌代表的是无法预料的无组织的行为(disorganized behavior).这两者出现在不同领域,都是非常有趣和重要的,但它们基本土都是非线性现象.我们同样可以将关于孤立子的某些工作的早期历史追溯到十九世纪下叶,但那只是很少的一部分.

    当然,在物理学,Maxwell方程(电磁学的基本方程)是线性偏微分方程.与之对应的是著名的Yang-Mills方程,它们是非线性方程并被假定用来调控与物质结构有关的力.这些方程之所以是非线性的,是因为Yang-Mills方程本质上是Maxwell方程的矩阵体现,并且由矩阵不可交换这一事实导致方程中出现非线性项.于是在这里我们看到了一个非线性性与非交换性之间的有趣的联系.非交换性产生一类特殊的非线性性,这的确是很有意思和很重要的.

                               几何与代数

    至此我谈的是一些一般性的主题,现在我想谈论一下数学中的一个二分叉现象,它来回摇摆却始终伴随着我们,这就给了我一个机会来做一些哲学上的思索和说明.我指的是几何和代数之间的二分法,几何和代数是数学的两个形式支柱,并且都有悠久的历史.几何学可以追溯到古希腊甚至更早的时期;代数学则源于古阿拉伯人和古印度人.所以,它们都已经成为数学的基础,但它们之间有一种令人感到不太自然的关系.

    让我首先由这个问题的历史开始.Euc1id几何是数学理论中最早的一个例子,直到Descartes在我们现在称为的笛卡儿平面中引入代数坐标之前,它一直是纯几何的.Descartes的做法是一种将几何思考化为代数运算的尝试.从代数学家们的角度来讲,这当然是对几何学的一个重大突破或者说一次重大的冲击,如果我们来比较Newton和Leibniz在分析方面的工作,我们会发现他们属于不同的传统,Newton基本上是一个几何学家而Le1bniz基本土是一个代数学家,这其中有着很深刻的道理.对于Newton而言,几何学,或者是由他发展起来的微积分学,都是用来描述自然规律的数学尝试.他关心的是在很广泛意义下的物理,以及几何世界中的物理.在他看来,如果有人想了解事物,他就得用物理世界的观点来思考它,用几何图象的观点来看待它.当他发展微积分的时候,他想要发展的是微积分的一种能尽可能贴近隐藏在其后的物理内蕴的表现形式.所以他用的是几何论证,因为这样可以与实际意义保持密切关系,另一方面,Leibniz有一个目标,一个雄心勃勃的目标,那就是形式化整个数学,将之变成一个庞大的代数机器.这与Newton的途径截然不同,并且二者有很多不同的记号.正如我们所知道的,在Newton和Leibniz之间的这场大争论中,Leibniz的记号最后得胜.我们现在还沿用他的记号来写偏导数.Newton的精神尚在,但被人们埋葬了很长时间.

    在十九世纪末期,也就是一百年前,Poincaré和Hilbert是两个主要人物.我在前面已经提到过他们了,并且可以粗略地讲,他们分别是Newton和Leibniz的传人.Poincaré的思想更多的是几何和拓扑的精神,他用这些思想作为他的基本洞察工具.Hilbert更多的是一个形式主义者,他要的是公理化,形式化,并且要给出严格的,形式的描述.虽然任何一个伟大的数学家都不能轻易地被归到哪一类中去,但是,很清楚地,他们属于不同的传统.

    当准备这个报告的时候,我想我应该写下我们目前这一代中能够继承这些传统的具有代表性的人的名字.谈论还健在的人是十分困难的——谁该放在这张名单上呢?接着我又暗自思忖:有谁会介意被放在这么一张著名的名单的哪一边呢?于是我选择了两个名字Arnold Bourbaki,前者是Poincaré-Newton传统的继承人,而后者,我认为,是Hilbert最著名的接班人.Arnold毫不含糊地认为:他的力学和物理的观点基本上是几何的,是源自于Newton的;以为存在处于二者之间的东西,除了象Riemann(他确实跟两者都有偏离)等少数人之外,都是一种误解.Bourbaki努力继续Hilbert的形式化的研究,将数学公理化和形式化推向了一个令人瞩目的范围并取得了一些成功.每一种观点都有它的优点,但是它们之间很难调和.

    让我来解释一下我自己是如何看待几何和代数之间的不同.几何学当然讲的是空间,这是毫无疑问的.如果我面对这间房间里的听众,我可以在一秒中内或者是一微秒内看到很多,接收到大量的信息,当然这不是一件偶然的事件.我们大脑的构造与视觉有着极其重要的关系.我从一些从事神经生理学的朋友那里了解到,视觉占用了大脑皮层的百分之八十或九十.在大脑中大约有十七个中枢,每一个中枢专门用来负责视觉活动的不同部分:有些部分涉及的是垂直方向的,有些部分与水平方向有关,有些部分是关于色彩和透视的,最后有些部分涉及的是所见事物的具体含义和解说.理解并感知我们所看到的这个世界是我们人类发展进化的一个非常重要的部分.因此空间直觉(spatial intuition)或者空间知觉(spatial perception)是一种非常强有力的工具,也是几何学在数学上占有如此重要位置的原因,它不仅仅对那些明显具有几何性质的事物可以使用,甚至对那些没有明显几何性质的事物也可以使用.我们努力将它们归结为几何形式,因为这样可以让我们使用我们的直觉.我们的直觉是我们最有力的武器.特别是在向学生或是同事讲解一种数学时可以看得很清楚.当你讲解一个很长而且很有难度的论证,最后使学生明白了.学生这时会说些什么呢?他会说“我看到了(我懂了)!”在这里看见与理解是同义词,而且我
们还可以用“知觉”这个词来同时形容它们,至少这在英语里是对的,把这个现象与其他语言作对比同样有趣.我认为有一点是很基本的:人类通过这种巨大的能力和视觉的瞬间活动获取大量的信息,从而得以发展,而教学参与其中并使之完善.

    在另一方面(也许有些人不这样认为),代数本质上涉及的是时间.无论现在做的是哪一类代数,都是一连串的运算被一个接着一个罗列出来,这里“一个接着一个”的意思是我们必须有时间的概念.在一个静态的宇宙中,我们无法想象代数,但几何的本质是静态的:我可以坐在这里观察,没有什么变化,但我仍可以继续观察.然而,代数与时间有关,这是因为我们有一连串的运算,这里当我谈到“代数”时,我并不单单指现代代数.任何算法,任何计算过程,都是一个接着一个地给出一连串步骤,现代计算机的发展使这一切看得很清楚.现代计算机用一系列0和1来反映其信息并由此给出问题的答案.

    代数涉及的是时间的操作,而几何涉及的是空间.它们是世界互相垂直的两个方面,并且它们代表数学中两种不同的观念.因此在过去数学家们之间关于代数和几何相对重要性的争论或者对话代表了某些非常非常基本的事情.

    当然只是为了论证是哪一边输了,哪一边胜利了,这并不值得.当我考虑这个问题时,有一个形象的类比:“你愿意成为一个代数学家还是一个几何学家?”这个问题就象问:“你愿意是聋子还是瞎子?”一样.如果人的眼睛盲了,就看不见空间;如果人的耳朵聋了,就无法听见,听觉是发生在时间之中的,总的来说,我们还是宁愿二者都要.

    在物理学,也有一个类似的、大致平行的关于物理概念和物理实验之间的划分.物理学有两个部分:理论——概念,想法,单词,定律——和实验仪器.我认为概念在某种广义的意义下是几何的,这是因为它们涉及的是发生在真实世界的事物.另一方面,实验更象一个代数计算.人们做事情总要花时间,测定一些数,将它们代入到公式中去.但是在实验背后的基本概念却是几何传统的一部分.

    将上述二分叉现象用更哲学或者更文学的语言来说,那就是对几何学家而言,代数就是所谓的“浮士德的奉献”.正如大家所知道的,在歌德的故事里,浮士德通过魔鬼可以得到他所想要的(就是一个漂亮女人的爱),其代价是出卖他的灵魂,代数就是由魔鬼提供给数学家的供品.魔鬼会说:“我将给你这个有力的机器,它可以回答你的任何问题.你需要做的就是把你的灵魂给我:放弃几何,你就会拥有这个威力无穷的机器”(现在可以把它想象成为一台计算机!).当然我们希望同时拥有它们,我们也许可以欺骗魔鬼,假装我们出卖灵魂,但不真地给它.不过对我们灵魂的威胁依然存在,这是因为当我们转入代数计算时,本质上我们会停止思考,停止用几何的观念来考虑问题,不再思考其含义.

    在这里我谈论代数学家的话重了一些,但是基本土,代数的目标总是想建立一个公式,把它放到一个机器中去,转动一下把手就可以得到答案.也就是拿来一个有意义的东西,把它化成一个公式,然后得到答案.在这样的一个过程中,人们不再需要思考代数的这些不同阶段对应的几何是什么.就这样,洞察力丢掉了,而这在那些不同的阶段都是非常重要的.我们绝不能放弃这些洞察力!最终我们还是要回到这上面来的,这就是我所谈到的浮士德的奉献.我肯定这种讲法尖锐了一点.

    几何和代数的这种选择导致能融合二者的一些交叉课题的产生,并且代数和几何之间的区别也不象我讲的那样直截了当和朴实无华.例如,代数学家们经常使用图式(diagram).而除了几何直觉,图式又能是什么呢?

                               通用的技术

    现在我不想再谈论太多就内容来划分的主题,而想谈谈那些依照已经使用的技术和常见方法所确定的主题,也就是我想描述一些已经广泛应用于众多领域的常见方法.第一个就是:

                                同调论

    历史上同调论是作为拓扑学的一个分支而发展起来的.它涉及到以下情形.现有一个复杂的拓扑空间,我们想从中得到它的一些简单信息如计算它的洞或者类似事物的个数, 得到某些与之联系的可加的线性不变量等.这是一种在非线性条件下关干线性不变量的构造.从几何的角度来看,闭链可加可减,这样就得到了所谓的一个空间的同调群.同调论,作为一种从拓扑空间获取某些信息的基本代数工具,是在本世纪上半叶发现的.这是一种从几何中获益匪浅的代数.

    同调概念也出现在其他一些方面.其另一个源头可以追溯到Hilbert及其关于多项式的研究中,多项式是非线性的函数,它们相乘可以得到更高次数的多项式.正是Hilbert那伟大的洞察力促使他来讨论“理想”,具有公共零点的多项式的线性组合.他要寻找这些理想的生成元.生成元可能有很多.他审视它们之间的关系以及关系之间的关系.于是他得到这些关系的一个分层谱系,这就是所谓的“Hilbert合系”.Hilbert的这个理论是一种非常复杂的方法,他试图将一个非线性的情形(多项式的研究)化为线性情形.本质上来讲,Hilbert构造了一个线性关系的复杂体系.能够把象多项式这样的非线性事物的某些信息纳入其中.

    这个代数理论实际上是与上述拓扑理论平行的,而且现在它们已融合在一起构成了所谓的“同调代数”.在代数几何学中,本世纪五十年代最伟大的成就之一是层的上同调理论的发展及在解析几何学中的扩展,这是由Leray,Cartan,Serre和Grothendieck等人组成的法国学派取得的.从中我们可以感受到一种既有Riemann-Poincaré的拓扑思想,又有Hilbert的代数思想,再加上某些分析手段的融合, 这表明同调论在代数的其它分支也有着广泛的应用.我们可以引入同调群的概念,它通常是与非线性事物相关的线性事物.我们可以将之应用于群论,例如,有限群,以及李代数:它们都有相应的同调群.在数论方面,同调群通过Galois群产生了非常重要的应用.因此在相当广泛的情形下同调论都是强有力的工具之一,它也是二十世纪数学的一个典型的特征.

                                    K-理论

    我要谈的另外一个技术就是所谓的“K-理论”.它在很多方面都与同调论相似,它的历史并不很长(直到二十世纪中叶才出现,尽管其起源的某些方面也许可以追溯到更早一些),但它却有着很广泛的应用,已经渗透进了数学的许多部分.K-理论实际上与表示理论紧密相联,有限群的表示理论,可以讲,起源于十九世纪.但是其现代形式——K-理论却只有一个相对较短的历史.K-理论可以用下面的方式来理解:它可以被想成是应用矩阵论的一种尝试.我们知道矩阵的乘法是不可交换的,于是我们想构造矩阵可换的或是线性的不变量.迹,维数和行列式都是矩阵论中可换的不变量,而K-理论即是试图处理它们的一种系统的方法,它有时也被称为“稳定线性代数”.其思想就是,如果我们有很多矩阵,那么把两个不可换的矩阵A和矩阵B放在不同块的正交位置上,它们就可换了,因为在一个大的空间里,我们可以随意移动物体.于是在某些近似情况下,这样做是很有好处的,足以让我们得到一些信息,这就是作为一个技术的K-理论的基石.这完全类似于同调论,二者都是从复杂的非线性情形获取线性的信息.

    在代数几何中,K-理论是由Grothendieck首先引入的,并且取得了巨大的成功,这些与我们刚刚谈到的层理论密切相关,而且也和他在Riemann-Roch定理方面的工作有紧密联系.

    在拓扑学方面,Hirzebruch和我照搬了这些思想并且将它们应用到一个纯粹的拓扑范畴内.从某种意义下来说,如果Grothendieck的工作与Hilbert在合系方面的工作有关,那么我们的工作更接近于Riemann-Poincaré在同调方面的工作,我们用的是连续函数,而他用的是多项式.K-理论也在椭圆算子的指标理论和线性分析的研究中起了重要作用.

    从另外一个不同的角度,Milnor,Quillen和其他人发展了K-理论的代数方面,这在数论的研究中有着潜力巨大的应用.沿着这个方向的发展导致了许多有趣问题的产生.

    在泛函分析方面,包括象Kasparov在内的许多人的工作将连续的K-理论推广到非交换的C*-代数情形.一个空间上的连续函数在函数乘积意义下形成一个交换代数.但是在其他情形下,自然地产生了类似的关于非交换情形的讨论,这时,泛函分析也就自然而然地成为了这些问题的温床.

    因此,K-理论是另外一个能够将相当广泛的数学的许多不同方面都能用这种比较简单的公式来处理的领域,尽管在每一个情形下,都有很多特定于该方面且能够连接其他部分的非常困难的,技巧性很强的问题.K-理论不是一个统一的工具,它更象是一个统一的框架,在不同部分之间具有类比和相似.

    这个工作的许多内容已经被Alain Connes推广到“非交换微分几何”.

    非常有趣的是,也就是在最近,Witten通过他在弦理论方面(基础物理学的最新思想)的工作发现许多很有趣的方法都与K-理论有关,并且K-理论看起来为那些所谓的“守恒量”提供了一个很自然的“家”.虽然在过去同调论被认为是这些理论的自然框架,但是现在看起来K一理论能提供更好的答案.

                                李群

    另一个不单单是一项技术、而且是具有统一性的概念是李群.现在说起李群,我们基本上就是指正交群,酉群,辛群以及一些例外群,它们在二十世纪数学历史中起了非常重要的作用.它们同样起源于十九世纪.SophusLie是一位十九世纪的挪威数学家.正如很多人所讲的那样,他和Fleix Klein,还有其他人一起推动了“连续群理论”的发展.对Klein而言,一开始,这是一种试图统一处理Euclid几何和非欧几何这两种不同类型几何的方法.虽然这个课题源于十九世纪,但真正起步却是在二十世纪,作为一种能够将许多不同问题归并于其中来研究的统一性框架,李群理论深深地影响了二十世纪.

    我现在来谈谈Klein思想在几何方面的重要性.对于Klein而言,几何就是齐性空间,在那里,物体可以随意移动而保持形状不变,因此,它们是由一个相关的对称群来控制的.Euclid群给出Euclid几何而双曲几何源于另一个李群.于是每一个齐性几何对应一个不同的李群.但是到了后来,随着对Riemann的几何学工作的进一步发展,人们更关心那些不是齐性的几何,此时曲率随着位置的变化而变化,并且空间不再有整体对称性,然而,李群仍然起着重要的作用,这是因为在切空间中我们有Euclid坐标,以至于李群可以出现在一种无穷小的层面上.于是在切空间中,从无穷小的角度来看,李群又出现了,只不过由于要区分不同位置的不同点,我们需要用某种可以处理不同李群的方式来移动物体.这个理论是被Eile Cartan真正发展起来的,成为现代微分几何的基石,该理论框架对于Einstein的相对论也起着基本的作用.当然Einstein的理论极大地推动了微分几何的全面发展.

    进入二十世纪,我前面提到的整体性质涉及到了在整体层面上的李群和微分几何.一个主要的发展是给出所谓的“示性类”的信息,这方面标志性的工作是由Borel和Hirzebruch给出的,示性类是拓扑不变量并且融合三个关键部分:李群,微分几何和拓扑,当然也包含与群本身有关的代数.

    在更带分析味的方向上,我们得到了现在被称为非交换调和分析的理论.这是Fourier理论的推广,对于后者,Fourier级数或者是Fourier积分本质上对应于圆周和直线的交换李群,当我们用更为复杂的李群代替它们时,我们就可以得到一个非常漂亮、非常精巧并且将李群表示理论和分析融为一体的理论.这本质上是Harish-Chandra一生的工作.

    在数论方面,整个“Lang1ands纲领”,现在许多人都这样称呼它,紧密联系于Harish-Chandra理论,产生于李群理论之中.对于每一个李群,我们都可以给出相应的数论和在某种程度实施Langlands纲领.在本世纪后半叶,代数数论的一大批工作深受其影响.模形式的研究就是其中一个很好的例证,这还包括Andrew Wiles在Fermat大定理方面的工作.

    也许有人认为李群只不过在几何范畴内特别重要而已,因为这是出于连续变量的需要.然而事实并非如此,有限域上的李群的类似讨论可以给出有限群,并且大多数有限群都是通过这种方式产生的.因此李群理论的一些技巧甚至可以被应用到有限域或者是局部域等一些离散情形中.这方面有许多纯代数的工作,例如与George Lusztig名字联系在一起的工作.在这些工作中,有限群的表示理论被加以讨论,并且我已经提到的许多技术在这里也可以找到它们的用武之地.

                               有限群

    上述讨论已把我们带到有限群的话题,这也提醒了我:有限单群的分类是我必须承认的一项工作.许多年以前,也就是在有限单群分类恰要完成之时,我接受了一次采访,并且我还被问道我对有限单群分类的看法,我当时很轻率地说我并不认为它有那么重要.我的理由是有限单群分类的结果告诉我们,大多数单群都是我们已知的,还有就是一张有关若干例外情形的表.在某种意义下,这只不过是结束了一个领域.而并没有开创什么新东西,当事物用结束代替开始时,我不会感到很兴奋.但是我的许多在这一领域工作的朋友听到我这么讲,理所当然地会感到非常非常不高兴,我从那时起就不得不穿起“防弹衣”
了.

    在这项研究中,有一个可以弥补缺点的优点.我在这里实际上指的是在所有的所谓“散在群”(sporadic groups)中,最大的被赋予了“魔群”名字的那一个.我认为魔群的发现这件事本身就是有限单群分类中最叫人兴奋的结果了.可以看出魔群是一个极其有意思的动物而且现在还处于被了解之中.它与数学的许多分支的很大一部分有着意想不到的联系,如与椭圆模函数的联系,甚至与理论物理和量子场论都有联系.这是分类工作的一个有趣的副产品.正如我所说的,有限单群分类本身关上了大门,但是魔群又开启了一扇大门.

                             物理的影响

    现在让我把话题转到一个不同的主题,即谈谈物理的影响.在整个历史中,物理与数学有着非常悠久的联系,并且大部分数学,例如微积分,就是为了解决物理中出现的问题而发展起来的.在二十世纪中叶,随着大多数纯数学在独立于物理学时仍取得了很好的发展,这种影响或联系也许变得不太明显.但是在本世纪最后四分之一的时间里,事情发生了戏剧性的变化,让我试着简单地评述一下物理学和数学,尤其是和几何的相互影响.

    在十九世纪,Hamilton发展了经典力学,引入了现在称为Hamilton量的形式化.经典力学导出现在所谓的“辛几何”.这是几何的一个分支,虽然很早已经有人研究了,但是实际上直到最近二十年,这个课题才得到真正的研究.这已经是几何学非常丰富的一部分.几何学,我在这里使用这个词的意思是指,它有三个分支:Riemann几何,复几何和辛几何,并且分别对应三个不同类型的李群.辛几何是它们之中最新发展起来的,并且在某种意义下也许是最有趣的,当然也是与物理有极其紧密联系的一个,这主要因为它的历史起源与Hamilton力学有关以及近些年来它与量子力学的联系.现在,我前面提到过的、作为电磁学基本线性方程的Maxwell方程,是Hodge在调和形式方面工作和在代数几何中应用方面工作的源动力.这是一个非常富有成果的理论,并且自从本世纪三十年代以来已经成为几何学中的许多工作的基础.

    我已经提到过广义相对论和Einstein的工作.量子力学当然更是提供了一个重要的实例.这不仅仅体现在对易关系上,而且更显著地体现在对Hilbert空间和谱理论的强调上.

    以一种更具体和明显的方式,结晶学的古典形式是与晶体结构的对称性有关的.第一个被研究的实例是发生在点周围的有限对称群,这是鉴于它们在结晶学中的应用.在本世纪中,群论更深刻的应用已经转向与物理的关系,被假设用来构成物质的基本粒子看起来在最小的层面上有隐藏的对称性,在这个层面上,有某些李群在此出没,对此我们看不见,但是当我们研究粒子的实际行为时,它们的对称性就显现无遗了.所以我们假定了一个模型,在这个模型当中,对称性是一个本质性的要素,而且目前那些很普遍的不同理论都有一些象SU(2)和SU(3)那样的基本李群融入其中并构成基础的对称群,因此这些李群看起来象是建设物质大厦的砖石.

    并不是只有紧李群才出现在物理中,一些非紧李群也出现在物理中,例如Lorentz群.正是由物理学家第一个开始研究非紧李群的表示理论的.它们是那些能够发生在Hilbert空间的表示,这是因为,对于紧群而言,所有不可约表示都是有限维的,而非紧群需要的是无穷维表示,这也是首先由物理学家意识到的.

    在二十世纪的最后25年里,正如我刚刚完成阐述的,有一种巨大的从物理学的新思想到数学的渗透,这也许是整个世纪最引人注目的事件之一,就这个问题本身,也许就需要一个完整的报告,但是,基本上来讲,量子场论和弦理论已经以引人注目的方式影响了数学的许多分支,得到了众多的新结果、新思想和新技术.这里,我的意思是指物理学家通过对物理理论的理解已经能够预言某些在数学上是对的事情了.当然,这不是一个精确的证明,但是确有非常强有力的直觉、一些特例和类比所支持.数学家们经常来检验这些由物理学家预言的结果,并且发现它们基本上是正确的,尽管给出证明是很困难的而且它们中的许多还没有被完全证明.

    所以说沿着这个方向,在过去的25年里取得了巨大的成果.这些结果是极其细致的.这并不象物理学家所讲的“这是一种应该是对的东西”.他们说:“这里有明确的公式,还有头十个实例(涉及超过12位的数字)”.他们会给出关于复杂问题的准确答案,这些决不是那种靠猜测就能得到的,而是需要用机器计算的东西,量子场论提供了一个重要的工具,虽然从数学上来理解很困难,但是站在应用的角度,它有意想不到的回报.这是最近25年中真正令人兴奋的事件.

    在这里我列一些重要的成果:SimonDona1dson在四维流形方面的工作;Vaughan-Jones在扭结不变量方面的工作;镜面对称,量子群;再加上我刚才提到的“魔群”

    这个主题到底讲的是什么呢?正如我在前面提到过的一样,二十世纪见证了维数的一种转换并且以转换为无穷维而告终,物理学家超越了这些,在量子场论方面,他们真正试图对广泛的无穷维空间进行细致的研究,他们处理的无穷维空间是各类典型的函数空间,它们非常复杂,不仅是因为它们是无穷维的,而且它们有复杂的代数、几何以及拓扑,还有围绕其中的很大的李群,即无穷维的李群,因此正如二十世纪数学的大部分涉及的是几何、拓扑、代数以及有限维李群和流形上分析的发展,这部分物理涉及了在无穷维情形下的类似处理.当然,这是一件非常不同的事情,但确有巨大的成功.

    让我更详尽地解释一下,量子场论存在于空间和时间中.空间的真正的意义是三维的,但是有简化的模型使我们将空间取成一维.在一维空间和一维时间里,物理学家遇到的典型事物,用数学语言来讲,就是由圆周的微分同胚构成的群或者是由从圆周到一个紧李群的微分映射构成的群.它们是出现在这些维数里的量子场论中的两个非常基本的无穷维李群的例子,它们也是理所当然的数学事物并且已经被数学家们研究了一段时间.

    在这样一个1+1维理论中,我们将时空取成一个Riemann曲面并且由此可以得到很多新的结果.例如,研究一个给定亏格数的Riemann曲面的模空间是个可以追溯到上个世纪的古典课题.而由量子场论已经得到了很多关于这些模空间的上同调的新结果.另一个非常类似的模空间是一个具有亏格数g的Riemann曲面上的平坦G-丛的模空间.这些空间都是非常有趣的并且量子场论给出关于它们的一些精确结果.特别地,可以得到一些关于体积的很漂亮的公式,这其中涉及到Zeta函数的取值.

    另一个应用与计数曲线(counting curve)有关.如果我们来看给定次数和类型的平面代数曲线,我们想要知道的是,例如,经过那么多点究竟有多少曲线,这样我们就要面临代数几何的计数问题,这些问题在上个世纪一直是很经典的.而且也是非常困难的.现在它们已经通过被称为“量子上同调”的现代技术解决了,这完全是从量子场论中得到的.或者我们也可以接触那些关于不在平面上而在弯曲族上的曲线的更加困难的问题,这样我们得到了另一个具有明确结果的被称为镜面对称的美妙理论,所有这些都产生于1+1维量子场论.

    如果我们升高一个维数,也就是2-维空间和1-维时间,就可以得到Vaughan-Jones的扭结不变量理论.这个理论已经用量子场论的术语给予了很美妙的解释和分析.

    量子场论另一个结果是所谓的“量子群”.现在关于量子群的最好的东西是它们的名字.明确地讲它们不是群!如果有人要问我一个量子群的定义,我也许需要用半个小时来解释,它们是复杂的事物,但毫无疑问它们与量子理论有着很深的联系它们源于物理,而且现在的应用者是那些脚踏实地的代数学家们,他们实际上用它们进行确定的计算.

    如果我们将维数升得更高一些,到一个全四维理论(三加一维),这就是Donaldson的四维流形理论,在这里量子场论产生了重大影响.特别地,这还导致Seiberg和Witten建立了他们相应的理论,该理论建立在物理直觉之上并且也给出许多非同寻常的数学结果.所有这些都是些突出的例子.其实还有更多的例子.

    接下来是弦理论并且这已经是过时的了!我们现在所谈论的是M一理论,这是一个内容丰富的理论,其中同样有大量的数学,从关于它的研究中得到的结果仍有待于进一步消化并且足可以让数学家们忙上相当长的时间.

                                历史的总结

    我现在作一个简短的总结.让我概括地谈谈历史:数学究竟发生了什么?我相当随意地把十八世纪和十九世纪放在了一起,把它们当做我们称为古典数学的时代,这个时代是与Euler和Gauss这样的人联系在一起的,所有伟大的古典数学结果也都是在这个时代被发现和发展的.有人也许认为那几乎就是数学的终结了,但是相反地,二十世纪实际上非常富有成果,这也是我一直在谈论的.

    二十世纪大致可以一分为二地分成两部分.我认为二十世纪前半叶是被我称为“专门化的时代”,这是一个Hilbert的处理办法大行其道的时代,即努力进行形式化,仔细地定义各种事物,并在每一个领域中贯彻始终.正如我说到过的,Bourbaki的名字是与这种趋势联系在一起的.在这种趋势下,人们把注意力都集中于在特定的时期从特定的代数系统或者其它系统能获得什么.二十世纪后半叶更多地被我称为“统一的时代”,在这个时代,各个领域的界限被打破了,各种技术可以从一个领域应用到另外一个领域,并且事物在很大程度上变得越来越有交叉性.我想这是一种过于简单的说法,但是我认为这简单总
结了我们所看到的二十世纪数学的一些方面.

    二十一世纪会是什么呢?我已经说过,二十一世纪是量子数学的时代,或者,如果大家喜欢,可称为是无穷维数学的时代.这意味着什么呢?量子数学的含义是指我们能够恰当地理解分析、几何、拓扑和各式各样的非线性函数空间的代数,在这里,“恰当地理解”,我是指能够以某种方式对那些物理学家们已经推断出来的美妙事物给出较精确的证明.

    有人要说,如果用天真幼稚的方式(naive way)来研究无穷维并问一些天真幼稚的问题,通常来讲,只能得到错误的答案或者答案是无意义的,物理的应用、洞察力和动机使得物理学家能够问一些关于无穷维的明智的问题,并且可以在有合乎情理的答案时作一些非常细致的工作,因此用这种方式分析无穷维决不是一件轻而易举的事情.我们必须沿着这条正确的道路走下去.我们已经得到了许多线索,地图已经摊开了:我们的目标已经有了,只不过还有很长的路要走.

    还有什么会发生在二十一世纪?我想强调一下Connes的非交换微分几何.Alain Connes拥有这个相当宏伟的统一理论.同样,它融合了一切.它融合了分析、代数、几何、拓扑、物理、数论,所有这一切都是它的一部分.这是一个框架性理论,它能够让我们在非交换分析的范畴里从事微分几何学家通常所做的工作,这当中包括与拓扑的关系.要求这样做是有很好的理由的,因为它在数论、几何、离散群等等以及在物理中都有(潜力巨大的或者特别的)应用.一个与物理有趣的联系也刚刚被发现.这个理论能够走多远,能够得到什么结果,还有待进一步观察.它理所当然地是我所期望的至少在下个世纪头十年能够得到显著发展的课题,而且找到它与尚不成熟的(精确)量子场论之间的联系是完全有可能的.

    我们转到另一个方面,也就是所谓的“算术几何”或者是Arakelov几何,其试图尽可能多地将代数几何和数论的部分内容统一起来.这是一个非常成功的理论.它已经有了一个美好的开端,但仍有很长的路要走.这又有谁知道呢?

    当然,所有这些都有一些共同点.我期待物理学能够将它的影响遍及所有地方,甚至是数论:Andrew Wiles不同意我这样说,只有时间会说明一切.

    这些是我所能看到的在下个十年里出现的几个方面,但也有一些难以捉摸的东西:返回至低维几何.与所有无穷维的富有想象的事物在一起,低维几何的处境有些尴尬.从很多方面来看,我们开始时讨论的维数,或我们祖先开始时的维数,仍留下某些未解之谜.维数为2,3和4的对象被我们称为“低”维的.例如Thurston在三维几何的工作,目标就是能够给出一个三维流形上的几何分类,这比二维理论要深刻得多.Thurston纲领还远远没有完成,完成这个纲领当然将是一个重要的挑战.

    在三维中另外一个引人注目的事件是Vaughan-Jones那些思想本质上来源于物理的工作.这给了我们更多的关于三维的信息,并且它们几乎完全不在Thurston纲领包含的信息之内.如何将这两个方面联系起来仍然是一个巨大的挑战,但是最近得到的结果暗示两者之间可能有一座桥,因此,整个低维的领域都与物理有关,但是其中实在有太多让人琢磨不透的东西.

    最后,我要提一下的是在物理学中出现的非常重要的“对偶”.这些对偶,泛泛地来讲,产生于一个量子理论被看成一个经典理论时有两种不同的实现.一个简单的例子是经典力学中的位置和动量的对偶.这样由对偶空间代替了原空间,并且在线性理论中,对偶就是Fourier变换.但是在非线性理论中,如何来代替Fourier变换是巨大的挑战之一.数学的大部分都与如何在非线性情形下推广对偶有关.物理学家看起来能够在他们的弦理论和M一理论中以一种非同寻常的方式做到了这一点.他们构造了一个又一个令人叹为观止的对偶实例,在某种广义的意义下,它们是Fourier变换的无穷维非线性体现,并且看起来它们能解决问题,然而理解这些非线性对偶性看起来也是下个世纪的巨大挑战之一.

    我想我就谈到这里.这里还有大量的工作,并且我觉得象我这样的一个老人可以和你们这么多的年轻人谈谈是一件非常好的事情;而且我也可以对你们说:在下个世纪,有大量的工作在等着你们去完成.

(原载《数学译林》2002/2,白承铭译,周性伟、冯惠涛校)

Posted 作者 zhaoyang0618 | with no comments
标签:

RTCSample例子程序分析 (IV)

CRTCSession

这个类封装了会话相关的过程。不过它更多的是一个会话的抽象接口。而更具体的实现在于类CRTCIMSessionCRTCAVSession。这里使用C++关键字friend,这个用法稍微注意一下即可。

class CRTCSession

{

public:

    CRTCSession();

    ~CRTCSession();

 

protected:

    friend class CRTCWin;

    HWND m_hWnd;

    HWND m_hStatusBar;

 

    IRTCSession * m_pSession;

    CRTCWin * m_pWin;

    RTC_SESSION_STATE m_enState;

 

    // Helpers

    void ShowMessageBox(PWSTR szText);

    void SetStatusText(PWSTR szText);

 

    // Window message handlers

    virtual LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam);

    virtual LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam);

    virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam);

    virtual LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam);

 

    // Event handlers

    virtual HRESULT DeliverSessionState(RTC_SESSION_STATE enState);

    virtual HRESULT DeliverParticipantState(IRTCParticipant *, RTC_PARTICIPANT_STATE);

    virtual HRESULT DeliverMessage(IRTCParticipant *, BSTR, BSTR);

    virtual HRESULT DeliverUserStatus(IRTCParticipant *, RTC_MESSAGING_USER_STATUS);

    virtual HRESULT DeliverMedia(long, RTC_MEDIA_EVENT_TYPE, RTC_MEDIA_EVENT_REASON);

    virtual HRESULT DeliverIntensity(RTC_AUDIO_DEVICE, long);

    virtual HRESULT DeliverClient(RTC_CLIENT_EVENT_TYPE);

};

 

Posted 作者 zhaoyang0618 | with no comments

七大数学世纪难题(转贴)

 20世纪是数学大发展的世纪。数学的许多重大难题得到完满解决, 如费尔玛大定理的证明,有限单群分类工作的完成等, 从而使数学的基本理论得到空前发展。

  计算机的出现是20世纪数学发展的重大成就,同时极大推动了数学理论的深化和数学在社会和生产力第一线的直接应用。回首20世纪数学的发展, 数学家们深切感谢20世纪最伟大的数学大师大卫. 希尔伯特。希尔伯特在1900年8月8日于巴黎召开的第二届世界数学家大会上的著名演讲中提出了23个数学难题。希尔伯特问题在过去百年中激发数学家的智慧,指引数学前进的方向, 其对数学发展的影响和推动是巨大的,无法估量的。

  效法希尔伯特, 许多当代世界著名的数学家在过去几年中整理和提出新的数学难题, 希冀为新世纪数学的发展指明方向。 这些数学家知名度是高的, 但他们的这项行动并没有引起世界数学界的共同关注。

  2000年初美国克雷数学研究所的科学顾问委员会选定了七个“千年大奖问题”, 克雷数学研究所的董事会决定建立七百万美元的大奖基金,每个“千年大奖问题”的解决都可获得百万美元的奖励。克雷数学所“千年大奖问题”的选定,其目的不是为了形成新世纪数学发展的新方向, 而是集中在对数学发展具有中心意义、数学家们梦寐以求而期待解决的重大难题。

  2000年5月24日, 千年数学会议在著名的法兰西学院举行。 会上,98年费尔兹奖获得者伽沃斯(Gowers)以“数学的重要性”为题作了演讲, 其后,塔特( Tate)和阿啼亚 (Atiyah) 公布和介绍了这七个“千年大奖问题”。 克雷数学研究所还邀请有关研究领域的专家对每一个问题进行了较详细的阐述。克雷数学研究所对“千年大奖问题”的解决与获奖作了严格规定。 每一个“千年大奖问题”获得解决并不能立即得奖。任何解决答案必须在具有世界声誉的数学杂志上发表两年后且得到数学界的认可,才有可能由克雷数学研究所的科学顾问委员会审查决定是否值得获得百万美元大奖。

  这七个“千年大奖问题”是: NP 完全问题, 郝治(Hodge) 猜想, 庞加莱(Poincare) 猜想, 黎曼(Rieman )假设,杨-米尔斯 (Yang-Mills) 理论, 纳卫尔-斯托可(Navier-Stokes)方程, BSD(Birch and Swinnerton-Dyer)猜想。

  “千年大奖问题”公布以来, 在世界数学界产生了强烈反响。这些问题都是关于数学基本理论的,但这些问题的解决将对数学理论的发展和应用的深化产生巨大推动。认识和研究“千年大奖问题”已成为世界数学界的热点。不少国家的数学家正在组织联合攻关。 可以预期, “千年大奖问题” 将会改变新世纪数学发展的历史进程。

北京大学数学学院院长 张继平

Posted 作者 zhaoyang0618 | with no comments
标签:

RTCSample例子程序分析 (III)

CRTCEvents

这个类实现了接口IRTCEventNotification,这个接口只有一个方法Event。该类就是实现了这个方法,同时包括COM组件的3个基本方法,还要加上两个辅助方法。

class CRTCEvents : public IRTCEventNotification

{

private:

    DWORD m_dwRefCount;

    DWORD m_dwCookie;

    HWND  m_hWnd;

 

public:

    CRTCEvents() : m_dwRefCount(0),

                   m_dwCookie(0),

                   m_hWnd(NULL)

    {}

         HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject);

         ULONG STDMETHODCALLTYPE AddRef();

         ULONG STDMETHODCALLTYPE Release();

    HRESULT Advise(IRTCClient * pClient, HWND hWnd);

    HRESULT Unadvise(IRTCClient * pClient);

         HRESULT STDMETHODCALLTYPE Event(

        RTC_EVENT enEvent,

        IDispatch * pDisp);

};

 

Event的实现基本上是把消息发送到主窗口。整个类比较简单,只需简单了解即可,最多注意一下COM中连接点(通常用于传递消息)的使用方法。

Posted 作者 zhaoyang0618 | with no comments

RTCSample例子程序分析 (II)

CRTCWin

这个类是主窗口所在,在这里按照我们的经验,首先应该提供注册窗口类的函数,然后应该定义窗口过程。而事实上也确实是这样的,这两个函数都是静态函数。

对于注册窗口类的函数,基本上是一个标准的过程,唯一需要注意的就是窗口过程是一个C++静态函数,对于C++来说,普通的成员函数是不能作为这样的函数指针的,这一点可以参考STANLEY B.LIPPMAN,JOSEE LAJOIE的《C++ Primer》一书。

RegisterClass函数

    WNDCLASS wc;

    ATOM atom;

    ZeroMemory(&wc, sizeof(WNDCLASS));

    wc.style         = CS_HREDRAW | CS_VREDRAW;

    wc.lpfnWndProc   = (WNDPROC)CRTCWin::WindowProc;

    wc.hInstance     = GetModuleHandle(NULL);

    wc.hIcon         = NULL;

    wc.hCursor       =        LoadCursor(NULL, IDC_ARROW);

    wc.hbrBackground =        GetSysColorBrush(COLOR_3DFACE);

    wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU_APP);

    wc.lpszClassName = APP_CLASS;

    atom = ::RegisterClass( &wc );

 

而对于窗口过程处理函数来说,也基本上是一个标准的过程,在这里只处理这样几个消息:WM_CREATEWM_DESTROYWM_CLOSEWM_SIZEWM_COMMANDWM_NOTIFYWM_RTC_EVENT。而WM_RTC_EVENT消息是自定义的消息,在这里处理各种RTC相关的消息。

 

WindowProc函数

    CRTCWin * me = NULL;

    LRESULT  lr = 0;

    if ( uMsg == WM_CREATE )

    {

        // Create an instance of the class

        me = new CRTCWin;

        if(!me)

        {

            // Failed to create the instance

            return -1;

        }

        me->m_hWnd = hWnd;

        // Store the class instance pointer in the

        // window's user data for later retrieval

        SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)me);      

        lr = me->OnCreate(uMsg, wParam, lParam);

    }

    else

    {

        // Retrieve the class instance pointer from the

        // window's user data

        me = (CRTCWin *)GetWindowLongPtr(hWnd, GWLP_USERDATA);

        switch( uMsg )

        {

        case WM_DESTROY:

            lr = me->OnDestroy(uMsg, wParam, lParam);

            // Delete the object instance

            delete me;

            // Quit the application

            PostQuitMessage(0);

            break;

        case WM_CLOSE:

            lr = me->OnClose(uMsg, wParam, lParam);

            break;

        case WM_SIZE:

            lr = me->OnSize(uMsg, wParam, lParam);

            break;

        case WM_COMMAND:

            lr = me->OnCommand(uMsg, wParam, lParam);

            break;

        case WM_NOTIFY:

            lr = me->OnNotify(uMsg, wParam, lParam);

            break;

        case WM_RTC_EVENT:

            lr = me->OnRTCEvent(uMsg, wParam, lParam);

            break;     

        default:

            lr = DefWindowProc( hWnd, uMsg, wParam, lParam );

        }

    }

    return lr;

 

在这里应该注意Windows SDK编程常用的一个技巧,就是把一些用户数据存储在窗口信息中,也就是SetWindowLongPtr()函数的使用。

 

OnCreate

这个函数负责窗口的创建过程中的初始化,在创建窗口的时候会调用这个函数。这个函数要完成各种初始化,它完成了下面一些工作:

(1)       创建窗口界面相关的元素。

创建状态条

m_hStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE,

        NULL,

        m_hWnd,

        IDC_STATUSBAR);

 

创建树形控件,同时进行初始化,创建了两个根一级的目录:onlineoffline。这两个目录的信息都被保存了下来(m_hOnlineParentm_hOfflineParent)。

m_hBuddyTree = CreateWindowExW(WS_EX_CLIENTEDGE,

        L"SysTreeView32",

        NULL,

        WS_CHILD | WS_VISIBLE |

                   TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS,

        0, 0,

        0, 0,

        m_hWnd,

        (HMENU)IDC_BUDDYTREE,

        GetModuleHandle(NULL),

        NULL);

         TV_ITEM tviNewItem;

         ZeroMemory(&tviNewItem, sizeof(TV_ITEM));

         tviNewItem.mask = TVIF_TEXT;

         tviNewItem.pszText = L"Online"; 

    TVINSERTSTRUCT tvis;

         ZeroMemory(&tvis, sizeof(TVINSERTSTRUCT));

         tvis.hParent = TVI_ROOT;

         tvis.hInsertAfter = TVI_ROOT;

         tvis.item = tviNewItem;

         HTREEITEM hti = TreeView_InsertItem(m_hBuddyTree, &tvis);

         ZeroMemory(&tviNewItem, sizeof(TV_ITEM));

         tviNewItem.mask = TVIF_TEXT;

         tviNewItem.pszText = L"Offline"; 

         ZeroMemory(&tvis, sizeof(TVINSERTSTRUCT));   

         tvis.hParent = TVI_ROOT;

         tvis.hInsertAfter = TVI_ROOT;

         tvis.item = tviNewItem;

         hti = TreeView_InsertItem(m_hBuddyTree, &tvis);

 

(2)       初始化RTC Client

在这里,需要创建RTC Client,设置网络协议,端口,然后设置回答-侦听的模式(PC-PCIMPC-PhonePhone-Phone等),还有一件必须要做的事情就是设置事件的过滤标记。

    //创建RTC Client

    HRESULT hr;

    hr = CoCreateInstance(__uuidof(RTCClient),

        NULL,

        CLSCTX_INPROC_SERVER,

        __uuidof(IRTCClient2),

        (LPVOID *)&m_pClient

        );

    //检查版本号

    long lVersion;

    hr = m_pClient->get_Version(&lVersion);

    if (lVersion < 0x00010002)

    {

        return -1;

    }

    // 初始化RTC client

    hr = m_pClient->Initialize();

    // 设置事件过滤标记,这一步是必须的

    long lFlags = RTCEF_REGISTRATION_STATE_CHANGE |

                  RTCEF_SESSION_STATE_CHANGE |

                  RTCEF_PARTICIPANT_STATE_CHANGE |

                  RTCEF_MESSAGING |

                  RTCEF_MEDIA |

                  RTCEF_INTENSITY |

                  RTCEF_CLIENT |

                  RTCEF_BUDDY |

                  RTCEF_BUDDY2 |

                  RTCEF_WATCHER |

                  RTCEF_WATCHER2 |

                  RTCEF_GROUP |

                  RTCEF_USERSEARCH |

                  RTCEF_ROAMING |

                  RTCEF_PROFILE |

                  RTCEF_PRESENCE_PROPERTY |

                  RTCEF_PRESENCE_DATA |

RTCE_MEDIA_REQUEST;

    hr = m_pClient->put_EventFilter(lFlags);

    // 设置RTC Client的侦听模式:设置端口

    // RTCLM_BOTH opens the standard SIP port 5060, as well as a dynamic port.

         hr = m_pClient->put_AllowedPorts(RTCTR_TCP, RTCLM_BOTH);

         hr = m_pClient->put_AllowedPorts(RTCTR_UDP, RTCLM_BOTH);

         // 回答模式

         hr = m_pClient->put_AnswerMode(RTCST_PC_TO_PC, RTCAM_OFFER_SESSION_EVENT);

         hr = m_pClient->put_AnswerMode(RTCST_IM, RTCAM_AUTOMATICALLY_ACCEPT);

         hr = m_pClient->put_AnswerMode(RTCST_MULTIPARTY_IM, RTCAM_AUTOMATICALLY_ACCEPT);

         hr = m_pClient->put_AnswerMode(RTCST_APPLICATION, RTCAM_OFFER_SESSION_EVENT);

         hr = m_pClient->put_AnswerMode(RTCST_PC_TO_PHONE, RTCAM_AUTOMATICALLY_REJECT);

         hr = m_pClient->put_AnswerMode(RTCST_PHONE_TO_PHONE, RTCAM_AUTOMATICALLY_REJECT);

    // 创建事件接收对象:这是一个COM组件

    m_pEvents = new CRTCEvents;

    hr = m_pEvents->Advise( m_pClient, m_hWnd );

    // 注册RTC Client

    BSTR bstr = ::SysAllocString(L"RTCSample_Test_Version");

    hr = m_pClient->put_ClientName( bstr);

    ::SysFreeString(bstr);

    WCHAR p[128];

    swprintf(p,L"Built:%S.%S", __DATE__,__TIME__);

    bstr = ::SysAllocString(p);

    hr = m_pClient->put_ClientCurVer( bstr);

    ::SysFreeString(bstr);

    // 初始化参与者信息:主要是填充前面创建的树形控件的数据,这个函数在后面分析

    DoSetPresence(RTCXS_PRESENCE_ONLINE);

 

(3)       程序启动

程序在启动的时候就会提示用户进行登录。

PostMessage(m_hWnd, WM_COMMAND, MAKEWPARAM(ID_FILE_LOGON, 0), 0);

 

OnDestroy

在这里完成资源的释放操作。

    // Release the RTC profile

    SAFE_RELEASE(m_pProfile);

    // Cleanup the buddy list

    ClearBuddyList();

    if (m_pClient)

    {

        if (m_pEvents)

        {

            // Unadvise for events from the RTC client

            m_pEvents->Unadvise(m_pClient);

            m_pEvents = NULL;

        }

        // Shutdown the RTC client

        m_pClient->Shutdown();

        // Release the RTC client

        SAFE_RELEASE(m_pClient);

    }

对于m_pClientm_pEvents来说和OnCreate存在对应关系,比较容易理解。而对于m_pProfileBuddy来说,其实是在其他地方创建的。

 

OnClose

关闭会话,准备关闭RTC Client

 

    HRESULT hr = S_OK;

    DEBUG_PRINT(("WINDOW CLOSED"));

    // Cleanup the existing session windows

    CleanupSessions();

    // Cleanup the user search windows

    CleanupUserSearches();

    // Cleanup the watcher windows

    CleanupWatchers();

 

////////////

//

// Begin RTC Functionality Code

//

// This code demonstrates how to prepare the client for shutdown.

// This should be called before the Shutdown method on the client.

//

////////////

    if (m_pClient)

    {

        // Prepare the RTC client object for shutdown

        hr = m_pClient->PrepareForShutdown();

    }

    if (!m_pClient || FAILED(hr))

    {

        // The RTC client object either doesn't exist, or

        // failed to prepare for shutdown. Destroy the

        // window now

        DestroyWindow(m_hWnd);

    }

    else

    {

        // The RTC client object is preparing to shutdown.

        // We should wait for the RTCCET_ASYNC_CLEANUP_DONE

        // event before we shutdown the RTC client. For now

        // just hide the window

        ShowWindow(m_hWnd, SW_HIDE);

}

 

 

OnSize

当整个窗口大小发生变化的时候,控件也应该跟着发生变化。这一点对于程序来说属于细枝末节,这里不需要详细讨论(无非获取窗口大小,重新计算)。

 

OnCommand

在这里处理菜单工具栏之类的消息。这里的具体实现同样是在其他函数中完成,所以这个地方不需要详细了解。

 

    HRESULT hr;

    switch(LOWORD(wParam))

    {

    case ID_FILE_LOGON:    //登录:需要获取相关的登录信息

        {

            BSTR bstrURI = NULL;

            BSTR bstrServer = NULL;

            BSTR bstrTransport = NULL;

            hr = ShowLogonDialog(m_hWnd, &bstrURI, &bstrServer, &bstrTransport);

            DoLogOn(bstrURI, bstrServer, bstrTransport);

            SAFE_FREE_STRING(bstrURI);

            SAFE_FREE_STRING(bstrServer);

            SAFE_FREE_STRING(bstrTransport);

        }

        break;

    case ID_FILE_LOGOFF:    //注销登录

        DoLogOff();

        break;

    case ID_FILE_EXIT:    //程序退出

        PostMessage(m_hWnd, WM_CLOSE, 0, 0);

        break;

    case ID_ACTION_ADDBUDDY:   //增加网友

        {

            BSTR bstrURI = NULL;

            BSTR bstrName = NULL;

            // Show the add buddy dialog

            hr = ShowAddressDialog(m_hWnd, L"Add Buddy", &bstrURI, &bstrName);

            // Add the buddy

            DoAddBuddy(bstrURI, bstrName);

            SAFE_FREE_STRING(bstrURI);

            SAFE_FREE_STRING(bstrName);

        }

        break;

    case ID_ACTION_CALL:    //呼叫

        {

            BSTR bstrURI = NULL;

            // Show the call dialog

            hr = ShowAddressDialog(m_hWnd, L"Call To", &bstrURI, NULL);

            // Call the user

            DoCall(RTCST_PC_TO_PC, bstrURI, NULL);

            SAFE_FREE_STRING(bstrURI);

        }

        break;

    case ID_ACTION_MESSAGE:    //消息

        {

            BSTR bstrURI = NULL;

            // Show the call dialog

            hr = ShowAddressDialog(m_hWnd, L"Message To", &bstrURI, NULL);

            // Send a message to the user

            DoCall(RTCST_MULTIPARTY_IM, bstrURI, NULL);

            SAFE_FREE_STRING(bstrURI);

        }

        break;

    case ID_TOOLS_TUNINGWIZARD:    //调音

        DoTuningWizard();

        break;

    case ID_TOOLS_USERSEARCH:    //用户搜索

        AddUserSearch();

        break;

    case ID_TOOLS_WATCHERS:    //监测

        AddWatchers();

        break;

    case ID_TOOLS_GROUPS:     //群组

        AddGroups();

        break;

         case ID_TOOLS_OPTIONS:    //选项,设置参数信息

                   DoOptions();

                   break;

         case ID_TOOLS_DTMFDIALPAD:    //

                   DoDTMFDialpad();

                   break;

    case ID_FILE_PRESENCESTATUS_OFFLINE:    //参与者状态之离线

        DoSetPresence(RTCXS_PRESENCE_OFFLINE);

        break;

    case ID_FILE_PRESENCESTATUS_ONLINE:    //参与者状态之在线

        DoSetPresence(RTCXS_PRESENCE_ONLINE);

        break;

    case ID_FILE_PRESENCESTATUS_AWAY:    //参与者状态之离去

        DoSetPresence(RTCXS_PRESENCE_AWAY);

        break;

    case ID_FILE_PRESENCESTATUS_IDLE:    //参与者状态之空闲

        DoSetPresence(RTCXS_PRESENCE_IDLE);

        break;

    case ID_FILE_PRESENCESTATUS_BUSY:    //参与者状态之忙碌

        DoSetPresence(RTCXS_PRESENCE_BUSY);

        break;

    case ID_FILE_PRESENCESTATUS_BERIGHTBACK:    //参与者状态之恢复正常

        DoSetPresence(RTCXS_PRESENCE_BE_RIGHT_BACK);

        break;

    case ID_FILE_PRESENCESTATUS_ONTHEPHONE:    //参与者状态之接听电话

        DoSetPresence(RTCXS_PRESENCE_ON_THE_PHONE);

        break;

    case ID_FILE_PRESENCESTATUS_OUTTOLUNCH:    //参与者状态之外出就餐

        DoSetPresence(RTCXS_PRESENCE_OUT_TO_LUNCH);

        break;

    }

 

 

OnNotify

这里处理了树形控件相关的一些消息。

 

    int idCtrl = (int)wParam;

    LPNMHDR pnmh = (LPNMHDR)lParam;

    HRESULT hr;

         if (pnmh->code == NM_RCLICK)

    {

                   if ( idCtrl == IDC_BUDDYTREE )    //树形控件

        {

            // The user clicked on the buddy list

                TVHITTESTINFO tvht;

                ZeroMemory(&tvht, sizeof(TVHITTESTINFO));

            POINT pt;

            GetCursorPos(&pt);

            tvht.pt = pt;

            MapWindowPoints(NULL, pnmh->hwndFrom, &tvht.pt, 1 );           

            HTREEITEM htriRes = TreeView_HitTest(pnmh->hwndFrom, &tvht);

            if (htriRes == NULL)

            {

                // TreeView_HitTest failed

                return 0;

            }

            if (tvht.flags & TVHT_ONITEM)

            {

                // The user clicked on a buddy

                TVITEMEX tvi;

                ZeroMemory(&tvi, sizeof(TVITEM));   

                tvi.mask = TVIF_PARAM;

                tvi.hItem = htriRes;

                // Get the buddy item

                if (!TreeView_GetItem(m_hBuddyTree, &tvi))

                {

                    // TreeView_GetItem failed;

                    return 0;

                }

                                     if (tvi.lParam == NULL)

                                     {

                                               // We're on a parent, not a buddy. Return.

                                               return 0;

                                     }               

                IRTCBuddy * pBuddy = (IRTCBuddy *)(tvi.lParam);               

                // Get the buddy URI

                BSTR bstrURI = NULL;

                hr = pBuddy->get_PresentityURI(&bstrURI);

                if (FAILED(hr))

                {

                    // get_UserURI failed

                    return 0;

                }

                // Get the buddy name

                BSTR bstrName = NULL;

                                     IRTCBuddy2 *pBuddy2;

                                     pBuddy->QueryInterface(__uuidof(IRTCBuddy2), (LPVOID *)&pBuddy2);

                hr = pBuddy2->get_PresenceProperty(RTCPP_DISPLAYNAME, &bstrName);

                                     SAFE_RELEASE(pBuddy2);

                if (FAILED(hr) && (hr != RTC_E_NOT_EXIST))

                {

                    // get_Name failed

                    SAFE_FREE_STRING(bstrURI);

                    return 0;

                }

                // Show the buddy menu

                HMENU hMenuRes = LoadMenu(

                    GetModuleHandle(NULL),

                    MAKEINTRESOURCE(IDR_MENU_BUDDY));

                HMENU hMenu = GetSubMenu(hMenuRes, 0);

                // Show the popup menu

                UINT uID = TrackPopupMenu(hMenu,

                    TPM_LEFTALIGN | TPM_RIGHTBUTTON |

                    TPM_NONOTIFY | TPM_RETURNCMD,

                    pt.x, pt.y, 0, m_hWnd, NULL);

                switch (uID)

                {

                case ID_BUDDY_CALL:

                    // Call the buddy

                    DoCall(RTCST_PC_TO_PC, bstrURI, bstrName);

                    break;

                case ID_BUDDY_MESSAGE:

                    // Send a message to the buddy

                    DoCall(RTCST_MULTIPARTY_IM, bstrURI, bstrName);

                    break;

                case ID_BUDDY_REFRESH:

                    // Refresh the buddy

                    DoRefreshBuddy(pBuddy);

                    break;

                case ID_BUDDY_REMOVE:

                    // Remove the buddy

                    if (SUCCEEDED(DoRemoveBuddy(pBuddy)))

                    {                   

                        // Release the buddy reference

                        SAFE_RELEASE(pBuddy);

                        // Delete the buddy from the tree

                                                        TreeView_DeleteItem(m_hBuddyTree, htriRes);

                    }

                    break;

                                     case ID_BUDDY_PROPERTIES:

                                               //Display Presence Property Dialog

                                               DoBuddyProperties(pBuddy);

                                               break;

                }

                SAFE_FREE_STRING(bstrURI);

            }

        }

    }

 

OnRTCEvent

在这里处理各种RTC相关的消息,应该给与关注。这里的处理方式几乎使用了相同的模式,都是适用QueryInterface获取事件相关的接口,然后调用相应的函数。

 

    IDispatch * pDisp = (IDispatch *)lParam;

    RTC_EVENT enEvent = (RTC_EVENT)wParam;

    HRESULT hr;

    switch ( enEvent )

    {

        case RTCE_REGISTRATION_STATE_CHANGE:    //状态变化

            {

                IRTCRegistrationStateChangeEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCRegistrationStateChangeEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCRegistrationStateChangeEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_SESSION_STATE_CHANGE:

            {

                IRTCSessionStateChangeEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCSessionStateChangeEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCSessionStateChangeEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_PARTICIPANT_STATE_CHANGE:

            {

                IRTCParticipantStateChangeEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCParticipantStateChangeEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCParticipantStateChangeEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_MESSAGING:

            {

                IRTCMessagingEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCMessagingEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCMessagingEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_MEDIA:

            {

                IRTCMediaEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCMediaEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCMediaEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

                   case RTCE_MEDIA_REQUEST:

                            {

                                     IRTCMediaRequestEvent *pEvent = NULL;

                                     hr = pDisp->QueryInterface( __uuidof(IRTCMediaRequestEvent), (void **) &pEvent);

                                     if (SUCCEEDED(hr))

                                     {

                                               OnRTCMediaRequestEvent(pEvent);

                                               SAFE_RELEASE(pEvent);

                                     }

                            }

                            break;

        case RTCE_INTENSITY:

            {

                IRTCIntensityEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCIntensityEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCIntensityEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_CLIENT:

            {

                IRTCClientEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCClientEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCClientEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_BUDDY:

            {

                IRTCBuddyEvent2 * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCBuddyEvent2),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCBuddyEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_WATCHER:

            {

                IRTCWatcherEvent2 * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCWatcherEvent2),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCWatcherEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_GROUP:

            {

                IRTCBuddyGroupEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCBuddyGroupEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCBuddyGroupEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_USERSEARCH:

            {

                IRTCUserSearchResultsEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCUserSearchResultsEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCUserSearchResultsEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_ROAMING:

            {

                IRTCRoamingEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCRoamingEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCRoamingEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_PROFILE:

            {

                IRTCProfileEvent2 * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCProfileEvent2),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCProfileEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_PRESENCE_PROPERTY:

            {

                IRTCPresencePropertyEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCPresencePropertyEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCPresencePropertyEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_PRESENCE_DATA:

            {

                IRTCPresenceDataEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCPresenceDataEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCPresenceDataEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

        case RTCE_PRESENCE_STATUS:

            {

                IRTCPresenceStatusEvent * pEvent = NULL;

                hr = pDisp->QueryInterface( __uuidof(IRTCPresenceStatusEvent),

                                            (void **)&pEvent );

                if (SUCCEEDED(hr))

                {

                    OnRTCPresenceStatusEvent(pEvent);

                    SAFE_RELEASE(pEvent);

                }

            }

            break;

    }

    // 释放

    SAFE_RELEASE(pDisp);

 

其他

在该类中还包含了一些辅助函数,用于操作树形控件。

TreeViewHelper_FindBuddyNode

用于查找树形控件中的节点,这个节点包含了IRTCBuddy的数据。

 

TreeViewHelper_InsertNode

插入节点,该节点包含数据IRTCBuddy

 

RemoveSession

删除会话CRTCSession

 

 

RemoveUserSearch

删除用户搜索信息

 

RemoveWatchers

删除监测信息

 

RemoveGroups

删除群组

 

GetUserURI

获取用户的URI信息

 

GetUserName

获取用户名

 

GetCookie

获取Cookie

 

DoAddBuddy

增加网友

 

DoCall

呼叫

 

Posted 作者 zhaoyang0618 | 1 comment(s)

RTCSample例子程序分析(I)

说实在虽然写了这么多年程序,也看过不少别人的程序,可是从来没有好好写过代码分析,更多的只是复制代码直接使用了。最近对IM感兴趣,于是在学习微软的RTC SDK,这是这个过程的一个注记。另外也希望借这个机会能够像这方面的专家请教学习 。

RTCSample

这个例子包含在RTC SDK中,很遗憾的是我在Windows 2000的机器上居然无法运行这个例子,好象缺少相关的动态库rtcdll.dll,可是按照SDK说明Windows 2000的SP4应该有这一个动态库的,而从Windows XP中复制过来也不能使用。

本文的目的是按照各个类给出原代码的一个简单分析。

 

Rtcsample.cpp

对于Windows程序来说,窗口是基本的程序运行平台,而程序的起点在于WinMain函数,在这个函数中一般会完成这样几个标准的Windows编程步骤:

(1)       注册窗口类

(2)       创建窗口

(3)       窗口消息循环

rtcsample.cpp文件中实现了WinMain函数,其中的实现基本上是Windows编程的标准步骤了。不过这里使用了C++的编程风格,这个部分的实现看上去更简单了。关于Windows编程,可以参考CHARLES PETZOLD的《Windows编程》一书。

在我们的例子中使用了COM以及一些额外的Windows控件,在程序中需要初始化COM库以及控件库。于是这里的WinMain有这样几部分组成:

(1)       初始化:
CoInitialize(NULL);   //初始化COM
InitCommonControls();  //
初始化Windows高级控件
hRichEdit = LoadLibrary(L"riched20.dll");  //
导入RichEdit控件

(2)       注册窗口类
CRTCWin::RegisterClass();   //主窗口所在
CRTCIMSession::RegisterClass();  //IM
CRTCAVSession::RegisterClass();  //
视频和音频
CRTCSearch::RegisterClass();   //
搜索
CRTCWatcher::RegisterClass();  //
监测
CRTCGroup::RegisterClass();  //
群组

(3)       创建窗口
hWnd = CreateWindowExW(
  0,
  APP_CLASS,
  APP_TITLE,
  WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
  CW_USEDEFAULT, CW_USEDEFAULT,
  APP_WIDTH, APP_HEIGHT,
  NULL,
  NULL,
  hInstance,
  NULL);
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );

(4)       消息循环
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

(5)         结束,释放资源
FreeLibrary(hRichEdit);
CoUninitialize();

 

如果对比Windows标准编程,我们发现这里缺少一个窗口过程的定义,不过不用担心,实际上这个过程已经被封装到了C++类之中了,这些就是前面注册窗口类时候用到的那些C++类的作用,他们分别为:CRTCWinCRTCIMSessionCRTCAVSessionCRTCSearchCRTCWatcherCRTCGroup。而后面的描述也将按着这个分类进行。
Posted 作者 zhaoyang0618 | with no comments

高考招生:由博士子女加20分想到的(转贴)

强烈赞同本文作者的观点,鄙视给出这个无耻政策的官员。

高考招生:由博士子女加20分想到的

文/张怆

近日黑龙江省高考加分政策上多了这么一条:“凡在我省工作的省级以上(含省级)优秀专家和获得博士学位人员的子女在我省参加高考,录取时在所报省内学校线下20分投档。”这些年我国的教育领域除了教育人不争气以外,在别的方面却颇为争气,以至于昏招花样不断层出不穷,实在荒唐可笑之极。可惜了,下面这条中国教育部的规定似乎就与以上矛盾,不知道那些作出决策的领导在酒足饭饱之后是否看过:

我国教育部《2006年普通高等学校招生工作规定》里对加分有非常明确的规定,能获得高考加分的考生有两种:一种是考生自己获得过奖励,另一种是针对特殊群体的照顾。后者具体规定的范围是:一,边疆、山区、牧区、少数民族聚居地区的少数民族考生;二,归侨、华侨子女和台湾省籍考生;三,烈士子女;四,自谋职业的退役士兵。

对此,那些专家和博士们的子女该属于哪类呢?或曰,降低投档分数线不是加分。可是笔者倒觉得这比直截了当的给专家博士子女加分更可恶。因为有些人总喜欢变着法的偷天换日,面对政策,不是积极应对怎么执行,而是千方百计的出对策,这种做法不仅虚伪,甚至近乎无耻。

或曰,这样有利于吸引和留住更多人才。试想,如果以破坏相对平等的高考制度来保障人才机制,那么,这种代价值得吗?再者,“老子们”是专家博士们,子女未必都是人才吧?更者,我们也不能保证在这种政策下,那些被挤掉的高考生未必不是人才吧?

分数面前人人平等,这条应试教育的核心定律本身就颇受非议。而今,某些地方政府为了保证一方利益,宁愿打破“一试同仁”的常规,破坏高考招生的公平性,公然标榜这种近乎“血统论”和“出身论”的条款,让人啼笑皆非,真是把“解放思想与时俱进”贯彻的灵活透了。当高考还没有举行的时候,专家博士们的子女就已经稳稳拿到20分了,在不平等的高考起跑线上,他们的优越性可想而知。面对这条变相的加分政策,所谓的高考面前人人平等,已经变得似是而非一文不值。

其实,在中国教育领域类似的事情很多,什么“湖南体育特长生加分丑闻”,什么“陕西独生子女加分怪闻”,更有甚者,某地竟然出现“见义勇为者为子女中高考加分”的荒唐之举,请看报纸:

“福建省南平市助理检察员任建平在2003年8月曾救起一名溺水女子。2005年3月,当他得知福建省规定见义勇为者子女可在中考或高考中享有加10分-20分的待遇后,便申请有关部门对其见义勇为行为给予确认。在多次申请未果后,他于日前将该市延平区公安分局告上法庭,要求法院判定自己的行为属于见义勇为。”

无论该案件的结果如何,无论原告的动机如何,都不会影响此案件本身的“精彩程度”,都会让许多人和笔者一起哭笑不得。无疑,他们是“聪明者”,他们在全世界物质文明和精神文明都高速发展的今天,用他们的“智慧”屏弃了曾经的“正义”、“道德”、“是非”甚至“理智”,杜撰着人类文明史上一系列叹为观止的“奇迹”:“见义勇为”是为了获奖?不获奖可以告到法院??“见义勇为”可以和“给子女加分”联系起来???这个权力是公安分局作出的????

如果有人还不理解,那么请记住,这是在中国。在这片伟大而神奇的土地上,凡是与人与制度与利益有关的领域,无论发生什么奇怪的事儿,都别惊讶。(此处删去500字)

一直以来,中国的各个领域都在发生变化,我们必须清楚的认识和研究这种变化。要知道,当今社会中的人群早已经从曾经的“红色理想”中走出来,在物欲横流的灯红酒绿中,那种凭借一句原始的“吆喝”和“动员”就能一涌而上靠道德的感召、靠精神的教化、靠集体的力量去完成某项工作的时代已经成为过去式了。当然,我们的某些部门和某些领导也是与时俱进的,他们也告别了老框架和老思想,于是,催生出来最流行最时尚也最合适的种种做法,但总结起来,无非有二:一是用权力去硬性征服,二是靠利益来温柔诱惑。

无需过多阐释和分析,当我们靠一种冰冷而僵硬的权力挺起胸膛时,当我们靠一些虚假且趋向泛滥的利益诱惑维持呼吸时,这将是一个怎样悲哀的时代和群体啊。

Posted 作者 zhaoyang0618 | with no comments

杭州书城

本人爱好收集图书,尤其希望能够收集到一些旧书,可是至今不知道哪里有旧书店,还望有知情的网友相告!另外杭州有什么书城可以买打折的书,类似北京的海淀图书城的?

Posted 作者 zhaoyang0618 | 5 comment(s)

黎曼 最伟大的数学家之一

今日去书店,购买了一本数学普及作品《黎曼博士的零点》,黎曼,十九世纪数学家,德国人,是数学史上最伟大的数学家之一。《黎曼博士的零点》一书介绍目前最著名的数学难题之一:黎曼猜想

下面的文章是一片转载文章。

最具独创精神的数学家——黎曼


少年数学天才


  1826年9月17日,在德国汉诺威的布列斯伦茨,黎曼(1826-1866)出生在一个乡下牧师之家,是6个孩子中的次子。

  黎曼从小酷爱数学。他6岁时开始学习算术,并显现出他的数学天才。他不仅能解决所有留给他的数学问题,而且还经常提一些问题来捉弄他的兄弟姐妹。10岁时他跟一位职业教师学习高级算数和几何,很快便超过了老师,常常对一些问题能做出更好的答案。

  黎曼14岁时到汉诺威市上中学。由于经济拮据,他总是靠步行奔波于汉诺威市与乡间小村庄之间。当然他更没钱去买参考书。幸运的是中学校长及时地发现了他的数学才能,考虑到他经济上的困难,校长特许黎曼可以从自己私人藏书室里借阅数学书籍。在校长的推荐下,黎曼借了一部数学家勒让德的《数论》,这是一部共859页的4大本的名著。黎曼十分珍惜这种读书机会,他如饥似渴地自学起来,6天之后,黎曼便学完并归还了这本书。校长问他:“你读了多少?”黎曼说:“这是一本了不起的书,我已经掌握了它。”几个月之后,校长就这本书的内容考他。黎曼对答如流,并且回答得很全面。利用校长的藏书,黎曼还抓紧时间很快地自学了大数学家欧拉的著作,由此掌握了微积分及其分支。黎曼不仅从欧拉的著作中学到了数学知识,还学到了欧拉研究数学的技巧。

大学生涯

  19岁时,黎曼进入格丁根大学学习,为了在经济上帮助家庭以尽快找到一个有报酬的工作,他先攻读哲学和神学,但是,除了这两门课程以外,他也去听数学、物理学课程。他听了斯特恩关于方程论和定积分、高斯关于最小二乘法以及戈尔德斯米特关于地磁学的数学讲座,对数学专业产生了难以割舍的兴趣。

  黎曼向父亲讲述了这一切,请求允许自己改学数学专业。父亲由衷地同意了他的请求。黎曼极为高兴,并深深地感激父亲。

  1847年,为了师从更多的大师,黎曼转学到柏林大学,就学于大数学家雅可比、狄利克雷、斯泰纳和艾森斯坦门下。他从雅可比那里学到高等力学和高等代数,从狄利克雷那里学到数论和分析学,从斯泰纳那里学到现代几何,从文森斯坦那里学到椭圆函数论。

  在此期间,他极为勤奋,甚至放假期间也不休息。1847年秋假,黎曼找到几份巴黎科学院《院刊》,上面载有数学家柯西新发表的关于单复变量解析函数的论文,他一眼便看出这是一种新数学理论,于是一连几个星期闭门不出,潜心研究柯西的论文,并酝酿出他在这个专题上的新见解,为4年后撰写博士论文“单复变量函数的一般理论的基础”奠定了基础。

  黎曼不仅认真研读大师的学术专著,而且虚心地向大师求教。有一次,狄利克雷来格丁根度假,黎曼趁此机会向他求教数学问题,并将自己未定稿论文交给他,请他提意见。狄利克雷被黎曼的谦虚、真诚和天才迷住了。他与黎曼长谈了两个小时,给黎曼的论文提了不少意见,给黎曼正在研究的课题作了许多指点。黎曼深感受益匪浅,他说没有狄利克雷的指点,他将不得不在图书馆里做好几天的吃力研究。

  生活虽然清贫,但学习极为勤勉,这使得黎曼在大学毕业时获得了丰硕的成果。1851年底,黎曼将其博士论文呈交给大数学家高斯审阅。高斯在看了论文之后兴奋不已,对黎曼的论文作出了高度评价,这对高斯来说是罕见的。高斯评语道:“黎曼先生交来的论文提供了令人信服的证据,说明作者对该文所论述的这一问题作了全面深入的研究,说明作者具有创造性的、活跃的、真正的数学头脑,具有灿烂丰富的创造力。”

贫困中奋进

  1852年初,黎曼凭借优异的学术表现取得了博士学位,并留在了格丁根大学。十九世纪中叶的德国,科学几乎与国家的经济全然无关。大学的设立仅在训练律师、医师、教师和传教士士,以及提供贵族子弟和富家子弟渡过引人侧目及受尊敬的岁月的场所。只有正教授才可以领政府的津贴,并且可教授正规标准课程,这些课程都是一些基础科目,上课的學生多,因此教授收到的学费也就多了,这就是为什么当时课程水准低落的原因,因为如果课程太难,就沒有办法收到许多学生,从而影响到教授们的收入,毕竟贵族子弟和富家子弟上大学的目的并非真心向学。讲师们则没有政府津贴並且轮不到教基本正规课程的机会,全然靠来听课的学生的学费维生,通常,听课的学生不会多,因此收入也就相当微薄,生活非常困苦。担任讲师是成为正教授的必经途径。但是却没有明文规定什么时候能將一位讲师升等为教授,为了照顾特別值得重视的学者而却沒有正教授的空缺時,政府可任命他为“客座教授”,使他具有教基本正规课程的資格,增多他的收入,但是这个任命附有条件,言明政府不付任何津貼。因此,在担任讲师期间,黎曼没有任何自主的生活费来源,生活依旧贫穷。

  但黎曼不顾生活上的贫困,仍然把全部精力投向数学。他认为只要能够勉强维持生活,能够让他研究数学,他就心满意足了。他从不因经济上的拈据而感到沮丧。他一方面积极准备“无薪讲师”的就职演讲论文,另一方面认真从事数学物理方面的研究工作。他的就职论文具有相当的难度。当初为了确定论文的选题,他向高斯提交了3个题目,以便让高斯在其中选定一个。其中第3个题目是涉及几何基础的,这个题目黎曼当时并没有多少案头准备工作,因此黎曼从心底里希望高斯不要选中它。可是,高斯对第3个题目却深有研究,他已思考这个问题达60年之久。出于想看看黎曼对这个深奥的问题会做些什么样的创造性工作,高斯指定第3个题目作为黎曼就职演讲论文的题目。

  事后,黎曼在向父亲谈起这件事时说,“所以我又处在绝境中了”、“我不得不做出这个题目”。

  对数学物理研究,黎曼也具有无限的热情,他当时曾对人说:“我对于把一切与物理规律结合起来的数学研究非常入迷。”“我通过对电、光、磁等之间联系的总研究,发现了对这个现象的解释。这件事对我很重要,因为这是我第一次能够把我的工作应用到未知的现象上。”这两项研究在当时都是高水平的,因而也是极困难的。黎曼不顾生活清贫、营养不良,超负荷地忘我工作,长时期过四度而紧张地思索,以致他常常体力衰竭,甚至病倒。一旦身体稍有复原,他又继续研究。功夫不负有心人。1854年6月10日,黎曼以“关于构成几何基础的假设”论文作了就职演讲,受到了与会数学家们的认可和好评。高斯听完之后大为惊异,感到这个年轻人处理这个难题非常之好,他赞不绝口。黎曼的这篇论文被人们认为是19世纪数学史上的杰作之一。

  1855年格丁根大学开始给黎曼发薪金,但相当的低。一年仅相当于200美元。这一年黎曼29岁,他家里遭到巨大的不幸,父亲和一个妹妹相继去世,原来依靠父亲生活的3个妹妹失去了生活来源。于是黎曼和他的哥哥两人挑起了照顾3个妹妹生活的担子。黎曼时时为一家人的生活感到焦虑。1857年黎曼一年的薪金被加到相当于300美元的水平。由于收入不多,又要照顾3个妹妹,生活担子重,黎曼连自己的婚姻大事都不敢考虑。然而就在这一年,不幸又从天而降,黎曼的哥哥又去世了。这对黎曼来说如同雪上加霜,照料3个妹妹生活的担子全部落在他一人的肩上。从1855年到1859年这5年中,经济拮据、生活清贫一直困绕着黎曼,有时一家甚至陷入对口粮都需要算计的地步。就是在这种情况下,黎曼仍不顾物质生活的贫乏,全身心地投入到数学研究工作之中,在科学的崎岖小道上艰苦奋斗,并获得了令人惊异的成就。他在数学上的许多重要成果都是在这个时期内完成的。他对阿贝尔积
分和阿贝尔函数的研究,开创了现代代数几何;他首创用复解析函数研究数论问题,开创了现代意义的解析数论;他对超几何级数的研究,推动了数学物理和微分方程理论的发展。随着研究成果的问世,黎曼在数学界的学术声望迅速提高。他受到许多世界著名数学家的赞扬,获得了一个科学家通常可能得到的最高荣誉。

大师之死

  1859年黎曼33岁时,高斯去世。他被任命为格丁根大学正教授,成为继狄利克雷之后高斯的第二个继任者。这时黎曼的生活才开始得到改善,才开始考虑个人的婚姻问题,并在36岁时与朋友的妹妹结了婚。一年后,他的女儿出生在比萨。

  但是,长时期清贫的生活、过度的操劳、发奋的研究,使得黎曼身体虚弱、精力衰竭。1862年黎曼患了胸膜炎,不久又患了肺病,一年后又患了黄疽病。在病魔缠身之际,只要有一些力气,黎曼仍坚持数学研究工作。虽然这个时期黎曼积极就医和疗养,但因病入膏盲终无疗效。1866年7月20日,黎曼那颗纯洁、高尚的心停止了跳动。他过早地离开了人世,也过早地离开了数学,终年仅40岁。

  黎曼是数学史上最具独创性精神的数学家之一,他在众多的数学领域里作出了许多奠基性和创造性的研究工作:他从几何方向开创了复变函数论;是现代意义的解析数论的奠基者;他亲手建立了黎曼几何,是组合拓扑学的开拓者。他对微积分的严格处理作出了重要贡献;在数学物理和微分方程等领域内也成果丰硕。1859年,黎曼被选为柏林科学院通讯院士,1866年他被选为法国巴黎科学院通讯院士和英国皇家学会国外会员。

  黎曼的英年早逝是德国数学界乃至全世界数学界的遗憾!但是他所留給数学界的,在他少量的已出版的论文集中,已有太多的丰富的概念,至今还未被后世数学家研究殆尽。

Posted 作者 zhaoyang0618 | 6 comment(s)
标签:

应届毕业生少走弯路的十条忠告(转贴)

刚刚走上社会的年轻人,充满了蓄势待发的豪情、青春的朝气、前卫的思想,梦想着丰富的待遇和轰轰烈烈的事业。可是,社会毕竟是一所包罗万象、喧嚣复杂的大学校,这里没有寒暑假,拒绝虚假和肤浅,更拒绝空想和庸碌,难以预告何时开课何时放学。

  如何在涉世之初少走弯路,有一个好的开端,开始一番成功的事业?以下是一些先行者积累的10条有益的涉世忠告。好好地遵循、把握这些忠告和建议吧,比起所学的课堂课程来,它毫不逊色!

  1、买个闹钟,以便按时叫醒你。贪睡和不守时,都将成为你工作和事业上的绊脚石,任何时候都一样。不仅要学会准时,更要学会提前。就如你坐车去 某地,沿途的风景很美,你忍不住下车看一看,后来虽然你还是赶到了某地,却不是准时到达。“闹钟”只是一种简单的标志和提示,真正灵活、实用的时间,掌握 在每个人的心中。

  2、如果你不喜欢现在的工作,要么辞职不干,要么就闭嘴不言。初出茅庐,往往眼高手低,心高气傲,大事做不了,小事不愿做。不要养成挑三拣四的习惯。不要雨天烦打伞,不带伞又怕淋雨,处处表现出不满的情绪。记住,不做则已,要做就要做好。

  3、每个人都有孤独的时候。要学会忍受孤独,这样才会成熟起来。年轻人嘻嘻哈哈、打打闹闹惯了,到了一个陌生的环境,面对形形色色的人和事,一 下子不知所措起来,有时连一个可以倾心说话的地方也没有。这时,千万别浮躁,学会静心,学会忍受孤独。在孤独中思考,在思考中成熟,在成熟中升华。不要因 为寂寞而乱了方寸,而去做无聊无益的事情,白白浪费了宝贵的时间。

  4、走运时要做好倒霉的准备。有一天,一只狐狸走到一个葡萄园外,看见里面水灵灵的葡萄垂涎欲滴。可是外面有栅栏挡着,无法进去。于是它一狠心 绝食三日,减肥之后,终于钻进葡萄园内饱餐一顿。当它心满意足地想离开葡萄园时,发觉自己吃得太饱,怎么也钻不出栅栏了。相信任何人都不愿做这样的狐狸。 退路同样重要。饱带干粮,晴带雨伞,点滴积累,水到渠成。有的东西今天似乎一文不值,但有朝一日也许就会身价百倍。

  5、不要像玻璃那样脆弱。有的人眼睛总盯着自己,所以长不高看不远;总是喜欢怨天尤人,也使别人无比厌烦。没有苦中苦,哪来甜中甜?不要像玻璃那样脆弱,而应像水晶一样透明,太阳一样辉煌,腊梅一样坚强。既然睁开眼睛享受风的清凉,就不要埋怨风中细小的沙粒。

  6、管住自己的嘴巴。不要谈论自己,更不要议论别人。谈论自己往往会自大虚伪,在名不副实中失去自己。议论别人往往陷入鸡毛蒜皮的是非口舌中纠 缠不清。每天下班后和你的那些同事朋友喝酒聊天可不是件好事,因为,这中间往往会把议论同事、朋友当做话题。背后议论人总是不好的,尤其是议论别人的短 处,这些会降低你的人格。

  7、机会从不会“失掉”,你失掉了,自有别人会得到。不要凡事在天,守株待兔,更不要寄希望于“机会”。机会只不过是相对于充分准备而又善于创 造机会的人而言的。也许,你正为失去一个机会而懊悔、埋怨的时候,机会正被你对面那个同样的“倒霉鬼”给抓住了。没有机会,就要创造机会,有了机会,就要 巧妙地抓住。

  8、若电话老是不响,你该打出去。很多时候,电话会给你带来意想不到的收获,它不是花瓶,仅仅成为一种摆设。交了新朋友,别忘了老朋友,朋友多了路好走。交际的一大诀窍就是主动。好的人缘好的口碑,往往助你的事业更上一个台阶。

  9、千万不要因为自己已经到了结婚年龄而草率结婚。想结婚,就要找一个能和你心心相印、相辅相携的伴侣。不要因为放纵和游戏而恋爱,不要因为恋爱而影响工作和事业,更不要因一桩草率而失败的婚姻而使人生受阻。感情用事往往会因小失大。

  10、写出你一生要做的事情,把单子放在皮夹里,经常拿出来看。人生要有目标,要有计划,要有提醒,要有紧迫感。一个又一个小目标串起来,就成了你一生的大目标。生活富足了,环境改善了,不要忘了皮夹里那张看似薄薄的单子。

Posted 作者 zhaoyang0618 | 1 comment(s)

高考 公平

2006年的高考已经过去很长时间了,成绩和录取分数线也陆续公布了,每年还是要讨论高考录取公平的问题。这个问题也不应该被回避。

今天浏览博客2006高考试题的时候,看了一下其中的数学试题,不分文理,也有18份试题,除去全国性的I和II,也有16个省或者市是采取独立命题的方式,这是为什么呢?

每年各地的录取分数线差别很大,一个比较引起争论的就是像上海北京的录取分数线相当的低。而每次收到质疑的时候,给出的理由总是这里的生源的素质比较高。

高,实在是高。是啊,乡村,山区出来的孩子哪里会弹钢琴,恐怕连见都没有见过。本来乡村,山区的教育水平就要差一些,而这些孩子通过自己的努力,考出了和其他孩子一样甚至更好的成绩的时候,我们却附加了一个不公平的比较。那么我们是否反过来说呢,这些孩子在恶劣环境下取得更好的成绩,难道不是更好素质的表现?

或许还有人会给出分数不能决定一切,什么高分低能的理由。天啊,既然这样又何必要高考呢。要找理由是很简单的,可是当我们在寻找种种理由的时候,公平已经远离了我们。

难道在中国,公平,哪怕仅仅是机会上的公平都这么困难吗?

Posted 作者 zhaoyang0618 | 1 comment(s)
更多内容