作者归档:miandui

中国的数学——几件数学新闻和对于中国数学的一些看法

陈省身
(庆祝自然科学基金制设立15周年和国家自然科学基金委员会成立10周年的讲演)

    张存浩先生要我讲点数学,这么短的时间,而数学这么大,只好举几个要点谈谈。

    数学是什么?数学是根据某些假设,用逻辑的推理得到结论,因为用这么简单的方法,所以数学是一门坚固的科学,它得到的结论是很有效的。这样的结论自然对学问的各方面都很有应用,不过有一点很奇怪的,就是这种应用的范围非常大。

    最初你用几个数或画几个图就得到的一些结论,而由此引起的发展却常常令人难以想象。在这个发展过程中,我认为不仅在数学上最重要,而且在人类文化史上也非常突出的就是Euclid在《几何原本》。这是第一本系统性的书,主要的目的是研究空间的性质。这些性质都可以从很简单的公理用逻辑的推理得到。这是一本关于整个数学的书,不仅仅限于几何学。例如,Euclid书上首先证明素数的个数是无穷的,这便是一个算术的结论。随着推理的复杂化,便有许多“深刻”的定理,需要很长的证明。例如 ,有些解析数论定理的证明,便需几十条引理。

    最初,用简单的方法证明几个结果,大家很欣赏,也很重要。后来方法发展了,便产生很复杂的推理,有些定理需要几十页才能证明。现在有的结果的证明甚至上百页,上千页。看到这么复杂的证明,我们固然惊叹某些数学家高超的技巧和深厚的功力,但心中难免产生一些疑问,甚或有些无所适从的感觉。所以我想,日后数学的重要进展,在于引进观念,使问题简化。
先讲讲有限单群的问题。

1.有限单群

    我们知道,数学的发展中有一个基本观念——群。群也是数学之中各方面的最基本的观念。怎样研究群的结构呢?最简单的方法是讨论它的子群,再由小的群的结构慢慢构造大一些的群。群中最重要的一种群是有限群,而有限群是一个难极了的题目,需要有特别的方法,特别的观念去研究。

    命G为群,g∈G为一子群,如对任何g∈G-1g H g ∈H,则称H为正规的(nomal). 正规子群存在,可使G的研究变为子群H及商群G/H的研究。这样就有一个很自然的问题,有哪些有限的单群(*** group).单群除了它自己和单位元(identity)之外,没有其他的非平凡的正规子群(normalsubgroup). 数学上称其为简单群,其实一点也不简单。

    有限群论的一个深刻的定理是Fei-Thompson定理:非交换单群的阶(数)(即群中元素的个数)是偶数。更不寻常的是除了某些大类(素数阶循环群Zp,交错群An(n>=5), Lie型单群)外,后来发现了26个零零碎碎的有限单群(散在单群,离散单群), 现在知道,最大的散在单群的阶是241×320×59×76×112×133×17×19×23×29×31×41×47×59×71 =808,017…=1054

    这是很大的单群,由B。Fisher 和 R。L.Griess两位数学家所发现,数学家称它为魔群(怪物,Monster).

    单群的权威数学家D.Gorenstein相信有限单群都在这里了,这当然是数学上一个很好的结果。把单群都确定了,就像化学家把元素都确定了,物理学家把核子的结构都确定了一样。可这里有个缺点,Gorenstein并未将证明定出来。他讲若将证明写出来至少有1000页,而1000页的证明无论如何很容易有错误。可是Gorenstein又说,不要紧,若有错误,这个错误一定可以补救。你相信不相信?数学界有些人怀疑这样的证明是否必要。现在计算机的出现,许多问题可以验证到很大的数,是否还需要严格的证明,已变成数学上一个有争论的问题。这个争论看来一时无法解决。段学复先生是我的老朋友,是有限群论的专家,也许我们可以问一下他的意见。我个人觉得这个问题很难回答。不过数学家有个自由,当你不能做或不喜欢做一个问题时,你完全不必投入,你只需做一些你能做或喜欢做的问题。

2.四色问题

     把地图着色,使得邻国有不同的颜色,需要几种颜色?经验告诉我们,四色够了。但是严格的证明极难。这就是有各的四色问题。

    地图不一定在球面上,也可在亏格高的的曲面上(一个亏格高为g的曲面在拓扑上讲是球面加g个把手;亏格为1的曲面可设想为环面)。可惊奇的是,这个着色问题,对于g>=1的曲面完全解决了。可以证明:有整数χ(g),满足条件:在亏格为g的曲面上任何地图都可用χ(g)种颜色着色,使邻国有不同颜色,且有地图至少需要χ(g) 种颜色。这个数在g>=1时可以完全确定。我们知道χ(1)=7,即环面上的地图可用七色着色,四色不够。

    令人费解的是,证明地球上四色定理,困难多了。现有的证明,需要计算机的帮助,与传统的证明不同。而我们觉得最简单的情况,即我们住的地球球面上的着色问题反而特别复杂。把扩充的问题解决了,得到了很有意思的结论。但是回到基本问题,反而更难。

    这种现象不止这一个,还有很多,一个例子是所谓的低维拓扑,即推广的问题更简单,而本身核心的问题反而不易克服,这确是数学神秘性的一面。

3.椭圆曲线

    最近的数学进展,最受人注意的结果就是Fermat大定理的证明。Fermat大定理说:方程式xn + yn=zn ,n>2没有非平凡的整数解(即xyz<>0). 这个传说了300年的结果的证明,最近由Princeton大学的教授Andrew J.Wiles(英国数学家)给出。但证明中缺一段,是由他的学生Richard Tarlor补充的。因此,Fermat 定理现在已经有了一个完全的证明。整个文章发表在最近一期的“Annals of Mathematics”(Prinston大学杂志,1996,第一期)整个一期登的是Wiles与Taylor的论文,证明Fermat定理(Wiles为此同Robert Langlands 获得了1996年的Wolf奖与National Academy Science Award in Mathematics).

    有意思的是,证明这个定理的关键是椭圆曲线。这是代数数论的一个分支。有以下一则故事。英国的大数学家G.H.Hardy(1877-1947)有一天去医院探望他的朋友,印度天才数学家S.A.Ramanujan(1887-1920).Hardy 的汽车号是1729。他向Ramanujan说,这个数目没有意思。Ramanujan说,不然,这是可以用两种不同方法写为2个立方之和的最小的数,如1729=13+123=93+103这结果可用椭圆曲线论来证明。

    我们知道,要找一个一般方程的解不容易的,而要找一个系数为整数的多项式方程P(x,y) = 0(传统上叫Diophantine方程)的整数解更困难。因为普通的解不会是整数,这是数论中的一个主要问题。

    需要说明的,在Wiles 完成这个证明之前,我有一位在Berkley的朋友Kenneth A.Ribet ,他有重要的贡献。他证明了一日本数学家Yutaka Taniyama的某一个关于椭圆曲线的假设包含Fermat定理。于是可将Fermat 定理变为一个关于椭圆曲线的定理
。Wiles根据Ribet的结果又继续经过了许多步骤,以至达到最后的证明。即在复平面内得到曲线。由复变函数论知道,复平面内的曲线就成为一个Riemann曲面。Riemann曲面为定向曲面,它可以是球,也可以是球加上好多把手。其中有一个最简单的情形,就是一个球加上一个把手,即一个环面。环面是个群,且为可交换群。

    所谓椭圆曲线,就是把这个曲线看成复平面内亏格(genus)等于1的复曲线。亏格等于1的曲线有一个非常深刻而巧妙的性质。即它上面的点有一个可交换群的构造。两个点可以加起来,且有群的性质。这是很重要的性质。椭圆曲线与椭圆无关。原因是,若所有曲线的亏格大于1,相当于Riemann曲面有一个Poincare度量,它的曲率等于1,所有曲面若其曲率等于—1,则叫做双曲的。亏格等于1的叫椭圆。亏格等于0的叫抛物线。椭圆曲线的研究是数论中非常重要,非常有意思的方面。最近一期的科学杂志(Science),有位先生写了一篇关于椭圆曲线的文章。椭圆曲线在电报的密码上有应用。而中国也有很多人在做代数几何与代数数论方面的工作。最近在黄山有一个国际性的,题为“代数几何与代数数论”的会议,由冯克勤先生主持。

    从这个定理我们应认识到:高深的数学是必要的。Fermat定理的结论虽然简单,但它蕴藏着许多数学的关系,远远超出结论中的数学观念。这些关系日新月异,十分神妙,学问之奥,令人拜赏。

    我相信,Fermat定理不能用初等方法证明,这种努力是徒劳的。数学是一个整体,一定要吸取几千年所有的进步。

4.拓扑与量子场论

    1995年初的一天晚上,我在家看晚间电视新闻。突然,我听到自己的名字,大吃一惊。原来加利福尼亚发一种彩票,头彩300万美元,若无人中彩的话,可以积累到下一次抽彩。我从前的一个学生,名Robert Uomini, 中了头彩美金2200万元。他曾选过我的本科课,当时还对微分几何很有兴趣。他很念旧,以100万美元捐赠加州大学,设立“陈省身讲座”。学校决定,以此讲座邀请名学者为访问教授。第一位应邀的为英国数学家Sir Michael Atiyah. 他到中国不止一次。他是英国影响最大的数学家,剑桥大学三一学院的院长,则卸任的英国皇家协会会长。Atiyah很会讲学,也很博学,他的报告有很大的吸引力。他作了八讲,讲题是“拓扑与量子场论”。

    这是当前一个热门的课题,把高深的数学和物理联系起来了,导出了深刻的结果。现在拓扑在物理上有非常重要的应用,这跟杨振宁的Yang-Mills场方程有很密切的关系。

    杨先生喜欢说,你们数学家写的东西,我们学物理的人看不懂,等于另外一种文字。我想我们搞数学的人有责任把我们的结果,写成不是本行的人也至少知道你讲的是怎么一回事。

    物理学,量子力学,尤其是量子场论与数学的关系其实并不复杂。说到数学的应用,讲一下矢量空间,Euclid空间就是一个矢量空间。再进一步,多个矢量空间构成一个拓扑空间,这就是所谓的矢量丛,即一束这样的空间。这样的空间有一些简单的性质。比如说,局部来讲,这种矢量空间是一个chart,是一个集,可用坐标来表示。结果发现矢量丛这种空间在物理上很有用。物理学的一个基本观念是“场”。最简单的场是电磁场,尤为近代生活的一部分。电磁场的“势”适合Maxwell方程。Hermann Weyl第一个看出这个势不是一个确定的函数。它可以变化。这在物理上叫做规范(gauge, 不完全确定的,可以变化的),这就是物理上规范场论的第一个情形。

    物理上有4种场:电磁场,引力场,强作用场和弱作用场。现在知道,这些场都是规范场。即数学系上是一束矢量空间,用一个线性群来缝住的。电磁场的重要推广,是Yang-Mills的规范场论。杨先生的伟大贡献就是在SU(2)(special unitary group in two variables)情形下得到物理意义明确的规范场,即同位旋(isospin)规范场,这种将数学现象给以物理的解释,是件了不起的工作,因为以往的Maxwell场论是一个可交换的群。现在变为在SU(2),群是不能交换的。而实际上,物理中找到了这样的场,这是科学上一个伟大的发展。数学家可以自豪的是,物理学家所需的几何观念和工具,在数学上已经发展了。

    杨先生之所以有这么大的成就,其中一个很重要的,很了不起的原因是除了物理的感觉以外,他有很坚实的数学基础。他能够在这大堆复杂的方程中看出某些规律,它们具有某种基本的数学性质。Yang-Mills方程的数学基础是纤维丛。这种观念Dirac就曾有过。Dirac的一篇基本论文中就讲到这种数学。但Dirac没有数学的工具。所以他在讲这种观念时,不但数学家不懂,就连物理学家也不懂。不过,其中有一个到现在还未解决的物理含义,即有否磁单极(magnetic monople)。可能会有。就是说,有否这样的场,它的曲率不等于0(曲率是度量场的复杂性的)?物理上要是发现了这种场,会是件不得了的事实。这些观念的数学不简单。

    Yang-Mills方程反过来影响到拓扑。现在的基础数学中,所谓低维拓扑(二维,三维,四维)非常受人注意。因为物理空间是四维空间。而四维空间有许多奇妙的性质。我们知道代数几何,曲线论,复变函数论等许多基础数学理论是二维拓扑。而现在必到四维,四维有spinor理论,有quantum结构。四维与物理更接近。它的结构是Lorentz结构,而不是Riemann结构。这方面有很多工作可做。根据Yang-Mills方程,对于四维拓扑,Atiyah的学生英国数学家Simon Donaldson有很重要的贡献。其中有一个结果就是利用Yang-Mills方程证明四维Euclid空间R4有无数微分结构与其标准结构不同。这一结果最近又由Seiberg-Witten的新方程大大的简化了。这是最近拓扑在微分几何,理论物理应用方面最引人注意的进展。

    二维流形的发展有一段光荣的历史,牵涉到许多深刻的数学,可以断言,三维,四维流形将更为丰富和神妙。

5.球装问题(Sphere Packing)

    如何把一定的空间装得最紧,显然是一个实际而重要的问题。项武义教授最近在这方面做了很重要的工作。这里先介绍一个有关的问题:围着一个球,可以放几个同样大小的球?我们不妨假定球的半径为一,即单位球。在平面情形,绕一单位圆我们显然可以放6个单位圆。而在三维空间的情况则更为复杂。如果把单位球绕单位球相切,不难证明,12个球是放得进的。这时虽然还剩下许多空间,但不可能放进第13个球。要证明这一结论并不容易。当年Newton与Gregory有个讨论。Newton 说第13个球装不进,Gregory说也许可以。这个争论长期悬而未决。一直到1953年,K.Schutte和B.L.van der Waerden才给了一个证明。这个证明是很复杂的。

    一个更自然的问题是怎样把一个立方体空间用大小相同的球装得最紧。衡量装得是否紧凑的尺度是密度(density),即所装的球的总的体积和立方体空间的体积的比例。

    Kepler于1611年提出了一个猜想:他认为立方体的球装的密度不会大于π/(181/2).
r />    项武义说他证明了这个猜想。可是有人(Gabor Fejes Toth)认为他的证明不完全,甚至有人(Thomas L.Hales)说是错误的。”Mathematical Intelligencer”这个杂志上(1995年),有关于这一问题的讨论,项武义有个答复。Toth 是匈牙利数学家,三代人搞同一个课题。匈牙利数学很发达,在首都布达佩斯有个200多人的几何研究所。我不知道几何中是否有这么多重要的问题需要这么多人去做。最年轻的Toth在“Mathematics Reviews”中有篇关于项的文章的评论。他说项的文章有些定理没有详细的证明。天下的事情就是这样。做重要工作有争议的时候,便产生一些有趣的现象。不过他觉得项的意思是对的。不但项的意思是对的,甚至表示这个意思他从前也有。最近项武义抒他认为没有的证明都有写出来了。

    最主要的,我要跟大家说的是立体几何在数学中是很重要而因难的部分。即使平面几何也可能很难。到了立体时,则更为复杂。近年来对碳60(C60)的研究显示了几何在化学中的应用。多面体图形的几何性质对固态物理也有重大的作用。。球装不过是立体几何的一个问题。立体几何是大有前途的。

6.Finsler几何

    最近经我鼓励,Finsler几何有重大发展,作简要报告如下:

    在(x,y)平面上设积分s = ∫ab F(x,y,dy/dx)dx其中y是x的未知函数。求这个积分的极小值,就是第一个变分学的问题。称积分s为弧长,把观念几何化,即得Finsler几何。

    Gauss看出,在特别情形:

    F2 =E(x,y) + 2F(x,y) y’ +G(x,y)y’2 ,y’=dy/dx其中E,F,G为x,y的函数,几何性质特别简单。1854年,Riemann的讲演讨论了整个情形,创立了Riemann-Finsler几何。百余年来,Riemann几何在物理中有重要的应用,而整体Riemann几何的发展更是近代数学的核心部分。

    Riemann的几何基础包含Finsler几何。我们最近几年的工作,把Riemann几何的发展,局部的和整体的,完全推广到Finsler几何,而且很简单。因此,我觉得以后的微分几何课或Riemann几何课都应该讲一般情形.最近有几个拓扑问题.最主要的一个是Riemann流形的一个重要性质,即英国数学家Hodge的调和积分。现在有2个年轻人,一个是David Bao, 另一个是他的美国学生,抒这个Hodge的调和积分推广到了Finsler情形。这将是微分几何的一块新园地,预料前景无限。1995年夏在美国西雅图有一Finsler几何的国际会议。其论文集已于今年由美国数学会出版.

    Finsler 几何在1900年有名的Hilbert演讲中是第23个问题。

7.中国的数学

    数学研究的最高标准是创造性:要达到前人未到的境界,要找着最深刻的关键。从另一点看,数学的范围,是无垠的。我愿借此机会介绍一下科学出版社从俄文翻译的《数学百科全书》,全书5大卷,每卷约千页。中国能出版这样的巨著,即是翻译,也是一项可喜的在就。这是一部十分完备的百科全书,值得赞扬的。

    对着如此的学问大海,入门必须领导,便需要权威性的学校和研究所。数学是活的,不断有杰出的贡献,令人赞赏佩服。但一个国家,比较可以集中某些方面,不必完全赶时髦。当年芬兰的复变函数论,波兰的纯粹数学,都是专精一门而有成就的例子。

    中国应该发展实力较强的方面。但由百科全书的例子,可看出中国的数学是全面的。这是一个可喜的现象。

    中国的财富在“人民”。中国的数学政策,除了鼓励尖端的研究以外,应该用来提高一般的数学水平。我有两个建议:(1)设立数学讲座,待遇从优,其资格可能是对数学发展有重大贡献的人;(2)设立新的数学中心,似乎成都,西安,广州都是可能的地点。中心应有相当的经费,部分可由地方负担,或私人筹措。近年因为国家开放,年轻人都想经商赚钱,当然国家社会需要这样的人。但是做科学的乐趣是一般不能理解的。在科学上做了基本的贡献,有历史的意义。我想对于许多人,这是一项了不得的成就。在岗位上专心学问,提携后进,“得天下之英才而教育之“,应该是十分愉快的事情。

    一个实际的问题,是个人应否读数学。Hardy 说,一个条件是看你是否比老师强。这也许太强一些。我想学习应不觉困难,读名著能很快与作者联系,都是测验。数学是小科学,可以关起门来做。在一个多面竞争的社会中,是一项有优点的职业,即使你有若干能力。

    中国的数学有相当水平。年来政治多变,达此情况,足风中华民族的勤劳本质。从前一个数学家的最高标准,是从国外名大学获得博士学位。我们国家现在所包需做的,是充实各大学的研究院,充实博士学位,人才由自己训练。

在PHP里利用魔术方法实现准AOP

在传统的OOP(面向对象编程:Object-Oriented Programming)思想里,一般把应用程序分解成若干个的对象,强调高内聚,弱耦合,从而提高应用程序的模块化程度,但是在处理某些问题的时 候,OOP会显得不够灵活,比如说,应用程序里很多业务逻辑都要在操作之初进行“权限检查”,在操作之后进行“日志记录”,如果直接把处理这些操作的代码 加入到每个模块中,那么无疑破坏了OOP的“单一职责”原则,模块的可重用性会大大降低,这时候传统的OOP设计往往采取的策略是加入相应的代理 (Proxy)层来完成系统的功能要求,但这样的处理明显使系统整体增加了一个层次的划分,复杂性也随之增加,从而给人过于厚重的感觉。正是为了处理这样 的问题,AOP(面向方面编程:Aspect-Oriented Programming)思想应运而生了,假设把应用程序想成一个立体结构的话,OOP的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块,文 章模块等等),而AOP的利刃是横向切入系统,提取各个模块可能都要重复操作的部分(如:权限检查,日志记录等等)。由此可见,AOP是OOP的一个有效 补充。

就目前的PHP来说,还没有一个完整的AOP内置实现,虽然出现了RunKit, 但一直都以BETA的状态呆在PECL项目里,估计很长时间内不太可能成为PHP的缺省设置。那是不是AOP在PHP里就破灭了呢?当然不是,因为我们有 __get(),__set(),__call()等魔术方法,合理使用这些方法可以为我们实现某种程度的“准AOP”能力,之所以说是准AOP,是因为 单单从实现上来看,称其为AOP有些牵强,但是从效果上来看,又部分实现了AOP的作用,虽然其实现方式并不完美,但对于一般的使用已经足够了。特别是从 PHP4.3.0开始,这些魔术方法已经成为了PHP的缺省内置实现,扫除了PHP4/5兼容的顾虑,那么就更加没有理由不使用它们。这里要说明的是 PHP4/5对这些魔术方法的实现有些许的不同,下面将分别举例说明:

先来看看PHP4的相应代码(下面代码只能运行在PHP4环境下):

<?php
//应用程序中某个业务逻辑类
class
BIZ
{
function
foobar
()
{
echo
‘业务逻辑<br />’
;
}
}

//业务逻辑类的包装类
class
AOP
{
var
$instance
;

function AOP($instance)
{
$this->instance = $instance
;
}

function __call($method, $argument, $return)
{
if(!
method_exists($this->instance, $method
))
{
return
false
;
}

echo ‘权限检查<br />’;

$callBack = array($this->instance, $method);

$return = call_user_func_array($callBack, $argument);

echo ‘日志记录<br />’;

return true;
}
}

//工厂方法
class
Factory
{
function
getBizInstance
()
{
//PHP4必须这样声明一下才可以使用overload相关方法
overload(‘AOP’
);

return new AOP(new BIZ());
}
}

//客户端调用演示
header(“Content-Type: text/html; charset=gbk”
);

$obj = Factory::getBizInstance();

$obj->foobar();
?>

屏幕显示:

权限检查
业务逻辑
日志记录

再来看看PHP5的相应代码(下面代码只能运行在PHP5的环境下):

<?php
//应用程序中某个业务逻辑类
class BIZ
{
public function
foobar()
{
echo
‘业务逻辑<br />’;
}
}

//业务逻辑类的包装类
class AOP
{
private
$instance;

public function __construct($instance)
{
$this->instance = $instance;
}

public function __call($method, $argument)
{
if(!
method_exists($this->instance, $method))
{
throw new
Exception(‘未定义的方法:’ . $method);
}

echo ‘权限检查<br />’;

$callBack = array($this->instance, $method);

$return = call_user_func_array($callBack, $argument);

echo ‘日志记录<br />’;

return $return;
}
}

//工厂方法
class Factory
{
public function
getBizInstance()
{
return new
AOP(new BIZ());
}
}

//客户端调用演示
header(“Content-Type: text/html; charset=gbk”);

try
{
$obj = Factory::getBizInstance();

$obj->foobar();
}
catch(
Exception $e)
{
echo
‘Caught exception: ’, $e->getMessage();
}
?>

屏幕显示:

权限检查
业务逻辑
日志记录

总结:

代 码中的粗体部分是表示PHP4/5有差异的地方,具体解释可以参考手册。整个的实现思路其实很简单,关键就是客户端请求的对象不能直接实例化出来,而是利 用工厂方法返回一个请求对象的包装对象,在包装对象内利用魔术方法来处理权限处理,日志记录等公共操作。这既是巧妙的地方,也是最有可能出问题的地方,因 为客户端使用对象并不是它想象中的对象,而是一个包装后的对象,比如说,客户端通过getBizInstance()方法以为得到的对象是BIZ,但实际 上它得到的是一个BIZ的包装对象AOP,这样的话,如果客户端进行一些诸如get_class()之类和对象类型相关的操作就会出错,当然,大多数情况 下,客户端似乎不太会做类似的操作,末了,再唠叨几句,为了脚本在PHP4/5都能运行,可以分别用两个脚本实现AOP类,然后用 version_compare()方法来决定加载哪一个。

Zend Framework V1.5 中的新特性[转]

2008 年 5 月 26 日

流行的开源软件 Zend Framework 刚刚实现了一些出色的增强。本文介绍 V1.5 中的新特性以及如何升级对 GData Web 服务的增强支持,包括 Zend_FormZend_Layout Zend_View,并且,改进的 Ajax 支持可以帮助 PHP 开发人员轻松地构建先进的 Web 应用程序。

软件框架指一组代码库集合,旨在以一种标准化方式处理应用程序中的所有基本需求,以便使开发人员集中精力进行开发,而不是进行重复劳动。目前有多个开源的 PHP 开发框架可供选择,在所有这些框架中,Zend Framework 也许是最受欢迎的。

Zend 收到欢迎的原因是它非常重视最佳实践,这一特性对于那些重视可持续性的开发人员来说十分有吸引力。Zend 以一种高度模块化的方式构造框架:大多数 Zend Framework 组件可以完全分离并单独使用,这一点非常吸引只需要用到可用库的其中一部分的开发人员。Zend 的灵活性以及重视最佳实践而产生的良好标准化,使它成为具有广泛用途的实用框架。

已经很强大的 Zend Framework 在 V1.5 中又增加了几个全新的组件和组件增强。这些升级使开发复杂的 PHP 应用程序更加简单、更加可维护,这是因为对诸如表单验证例程甚至是前端布局创建等内容实现了标准化。让我们首先看一下Zend_Form 组件以及它提供的全部功能。

Zend_Form

Zend Framework 的一个令人兴奋的新增特性就是 Zend_Form 组件。Web 应用程序如果不能接收输入数据并对其进行处理,那么就会变得毫无意义,获得用户数据的最简单方式就是使用表单。当然,在开发与维护一个 Web 应用程序时,表单是最单调乏味的工作:您必须验证收到的全部内容,确保它是您需要的内容,并需要对每个到来的数据片段进行单独处理。所有上述操作都假设您 不会生成错误消息并重复所有工作,当然,您肯定会遇到这些问题 — 如果不能重用代码,手工执行这些工作实在是非常让人畏惧的任务。

新的表单组件提供的功能不仅仅是允许您用编程的方法创建一个表单和表单元素。Zend_Form 能够完成复杂的验证并在表单验证失败时在表单中显示错误信息。

Zend_Form 的使用方法简单明了。首先,将 form 对象实例化,然后设置它的动作和方法。最后,将表单元素添加到 form 对象中,并且对单个表单元素应用表单元素验证器和过滤器。在应用程序中呈现和使用完整的 form 对象,对结果进行验证和过滤。查看清单 1 中的简单表单示例。
清单 1. 一个简单的表单

    require_once 'Zend/Form.php';
    $form = new Zend_Form(array(
        'method'   => 'post',
        'elements' => array(
            'name' => array('text', array(
                'required' => true,
                'label' => 'Name',
          'validators' => array('alpha')
            )),
            'age' => array('text', array(
                'required' => true,
                'label' => 'Age',
          'validators' => array('digits')
            )),

            'submit' => array('submit', array(
                'label' => 'Send'
            ))
        ),
    ));

清单 1 的结果如图 1 所示。
图 1. 表单
The form
Zend_Form 附带了下列元素:按钮、复选框、隐藏(hiden)、图片、多选框,多重选择、密码、单选、重置、选择、提交、文本、文本区。Zend_Form 不仅仅限制于附带的元素:内置的 Zend_Form_Element 类允许您创建自己的元素。

您可以手动对表单元素进行实例化并把它们连接到表单,或者让表单对象创建并实例化一个新表单元素,使它符合您要求的类型。在将单个元素附加到 form 对象之前或之后,每个元素都可根据需要进行单独配置,并且在呈现完成的表单之前,可以随时将单独的验证器和过滤器集合附加到它们的表单元素中。

可 以对您的表单元素使用 19 种标准验证类型。这些验证器可以检查您通常需要采集的所有数据类型 — 从简单的数据类型检验到正则表达式是否匹配电子邮件地址的验证(可配置为确保存在顶级域并有一个 MX 记录)。默认情况下,如果一个验证器返回 false,则剩余的验证检查都将取消,但这个参数也可以对单个验证器进行配置。

在清单 1 中,一个 alpha 验证器应用到名字字段中,数字验证器应用到年龄字段中。当您输入的数据未通过这些验证测试时,图 2 中显示了默认情况下发生的情况。
图 2 未通过验证测试的表单
未通过验证测试的表单
准 备好验证器之后,下一步将应用过滤器。如果说验证器的作用相当于俱乐部里的保镖,过滤器的作用更象一个造型师:过滤器取出表单元素中的数据,过滤掉您不希 望看到的内容并传递剩下的内容。有 12 种标准的内置过滤器,可用于去掉空格、从数值中去掉字母、把文本转换为大写、把特定字符转换为 HTML 项以及删除禁止的标记。如果您知道所需的数据位于字段中,但是这些数据需要进行大量删减和处理,这种情况下应使用过滤器。

为了在简单的表单中演示过滤器的作用,将对 elements 数组做一些修改。
清单 2. 把过滤器应用到 elements 数组

        'elements' => array(
            'name' => array('text', array(
                'required' => true,
                'label' => 'Name',
          'validators' => array('alpha'),
          'filters' => array('StringToUpper')

            )),
            'age' => array('text', array(
                'required' => true,
                'label' => 'Age',
          'validators' => array('digits'),
          'filters' => array('digits')
            )),

            'submit' => array('submit', array(
                'label' => 'Send'
            ))
        ),

正如您所见,我们增加了一个过滤器把名字字段全部改为大写,并使用另一个过滤器把年龄字段中的非数字内容全部去掉。现在,当我们提交这些值后,我们会看到如下的结果。
图 3. 应用过滤器后的表单
应用过滤器后的表单
当我们单击 Send 后,下列值将通过验证和过滤器,得到如下所示的结果。
图 4. 应用验证和过滤器后的表单
应用验证和过滤器后的表单
当 且仅当存在一个数字并且数字中没有插入错误内容,那么在传递到服务器时,年龄输入、过滤器和验证器以及该组合所需的属性才可以真正确保某个值会通过验证。 需要注意的是,名字字段通过验证的惟一方式是名字字段必须以 alpha-字符开头,原因是在这种情况下,过滤器不会帮助这个值通过验证器。

可以使用几种方式呈现完成的表单。表单有一种可以直接使用或回显的呈现方法。可是,大多数表单使用 Zend_View helper 进行呈现。


回页首

Zend_LayoutZend_View

Zend Framework V1.5 中新的 Zend_Layout 和增强的 Zend_View 组件经常一起提到,这是有原因的。这两个组件协同工作可以成功地在 PHP 应用程序中将表示从控制器中分离出来,并以一种支持快速开发和维护的方式对表示进行标准化。

所有这些意味着什么?

这意味着只要您坚持一些原则并保持代码模块化,那么就可以获得一种标准的、更轻松的方式维护一致的前端。

Zend_Layout 并不需要与 Model-View-Controller (MVC) 一同使用。与 Zend Framework 中的大部分组件一样,Zend_Layout 可以被取出并独立使用,可是,当它与 MVC 一同使用时,它就变成了在 Zend_View 和控制器之间的一个方便的适配器,可以有效地把表示划分为一个两步骤(two-step)视图并使站点布局更具普遍性。

无论您是否正使用 MVC 或把Zend_Layout 取出作为独立的组件,必须至少创建一个布局脚本。在其他的实现中有时也称作模板,布局脚本定义了一个 Web 页面的基本前端结构,它们把变量(而不是静态数据)放置在页面上,各个页面显示的数据不尽相同(或者更准确地说,不同的动作所显示的数据是不同的)。布局 脚本中占位符变量的填充方式是把布局脚本所需的值分配给布局,告诉布局您希望使用那个特定布局脚本并最终将它呈现为一个页面。

实际的呈现过程由 Zend_View 完成。因此就 Zend_Layout 而言,您可以免费获得 Zend_View 的全部功能。布局脚本应通过视图 helper 进行筛选,否则几乎肯定要做错。视图 helper 是集便利性与标准性于一体的重要组件。

当完成您的布局脚本后,您可以在您的引导程序中创建一个 Zend_Layout 实例并设置您的布局配置选项。在它以这种方式实例化后,您可以从动作中通过动作 helper 访问并重新配置 Zend_Layout 对象。在动作内部,您可以通过编程方式修改您希望 Zend_Layout 实例使用哪个布局脚本,并重新填充每个布局脚本需要的当前变量。从控制器的角度看,最后发送给用户的所有数据被放入一个适配器中,适配器把这些数据用于完全不同的范围。


回页首

OpenID 和 InfoCard (Web 2.0)

OpenID 是一个分散式身份识别协议,可跨多个网站使用。它不需要正确的用户名和密码组合,而是提示给用户一个从现有的 OpenID 提供者处得到的 URL 或 XRL。由提供者完成身份验证过程。提供者执行身份验证过程的一种方式是请求一个 InfoCard。当提供者成功地与请求站点完成身份验证通信后,用户就会认为是处于登录状态,并且可以从他的个人 URL 处获得额外的信息。

Zend Framework V1.5 不仅支持将 OpenID 和 InfoCard 作为一个客户机站点,还支持将它们作为 OpenID 提供者。这些组件完全分离,互相之间没有依赖性。这看起来很奇怪,通过 Zend Framework V1.5,您可以开发一个不支持 OpenID 的 OpenID 提供者,反之亦然(这更有意义)。框架中还有一个内置的 InfoCard 组件,它为与 OpenID 协同使用的 InfoCards 提供了依赖方(或支持 OpenID)支持。


回页首

Lucene 高级搜索

Lucene 是一个开源的信息检索搜索引擎,以它的全文本索引能力和搜索互联网能力而著名。Zend_Search_Lucene 组件为把 Zend Framework V1.5 交付了内置的全文本高级搜索引擎功能。需要注意的是,虽然 Lucene 是一个搜索引擎,但它没有爬行能力。您必须手动把全部相关内容添加到 Zend_Search_Lucene 的索引中(参见 参考资料 中关于 Lucene 的 developerWorks 文章)。

Zend_Search_Lucene 组件并非首先出现在 Zend Framework V1.5 中。这个搜索引擎的早期版本早已实现。可是,Zend Framework V1.5 的发布标志着它从 V1.9 到 V2.2 这一重要升级。通过这一升级, Lucene 组件获得了三种强大的高级搜索选项。

现在它已经支持一个或多个通配符,用于范围搜索或模糊搜索。范围搜索在一个指定上下界的范围内查找指定字段的值,而模糊搜索查找与用户提供的术语相似的单词。例如,对 “Mike” 的模糊搜索可能会返回 “bike” 和 “mire”。

虽然 Lucene 组件进行了升级,原有的功能仍然存在,并且所有以前存在的索引在增强的 Zend_Search_Lucene 组件第一次用到它们时会自动升级。


回页首

LDAP 授权

轻 量级目录访问协议(LDAP)在 Zend Framework 中刚刚得到支持。这对于很多开发人员来说是个好消息,比如那些需要创建使用一组现有的正式企业凭证的企业内部网应用程序的开发人员。在 Zend Framework 的文档中需要注意到,当前的支持仅仅是一个最基本的实现,仅仅交付了完成 Zend_Auth_Adapter_LDAP 工作所需的最少功能。

您的 config.ini 文件中指定了有关 LDAP 服务器的信息。当用户需要身份验证时,需要提供用户名和密码组合,这些内容和一些附加的 Zend_LDAP 选项将被发送到 .ini 文件指定的 LDAP 服务器上进行身份验证。就像所有其他的授权适配器一样,只要 Zend_Auth_Adapter_Ldap 从服务器中用下列方法得到一个授权后,它就立即返回一个 Zend_Auth_ResultgetCode() 将返回发生事件的代码(通过或失败); getIdentity() 将返回进行身份验证尝试的身份;getMessages() 将只包含失败了的身份验证消息;而如果成功通过身份验证则 isValid() 将返回真。


回页首

Nirvanix、Technorati 和 SlideShare Web 服务

三种新的 Web 服务组件也成功加入到 Zend Framework V1.5 中:Nirvanix、Technocrati 和 SlideShare。

Nirvanix 是一个基于互联网的文件存储系统,它允许注册用户通过自己的 API 存储、操作和访问文件。Nirvanix 的设计目的是处理大型的媒体文件(例如视频),并且在能够通过互联网身份验证的任何位置进行访问。

Technorati 是一个博客(blog)搜索引擎,它的 Web 服务允许您对其数据库进行多种不同的查询,包括常规关键字搜索、标记搜索、top 标记搜索、给定关键字的每日博客总数以及 “cosmos” 搜索(可返回包含特定 URL 链接的结果)。使用 Technorati,您可以快速了解到当天最热门的网络话题并随时保持关注。

Slideshare.net 是一个为注册用户托管幻灯片的网站。通过 Slideshare 组件,您可以在您的 PHP 应用程序中嵌入由 Slideshare 托管的幻灯片,观看可以共享的幻灯片,还可以为您的 Slideshare 帐户上传新的幻灯片。

这 三个组件加入到 Zend Framework 目前支持的 Web 服务列表中。不断增加的 Web 服务组件库使您可以快速、轻松地把来自多个流行网站的内容集成到一个 PHP 应用程序中。这些 Web 服务组件可以单独安装,无需安装其他的 Zend Framework 组件,这种特性非常受欢迎,适合于 PHP 开发新手以及经验丰富、喜欢使用不同框架工作的 PHP 开发人员。

接下来,我们将查看一些特性增强,这种增强是对现有特性和组件的重大更新,现有组件和特性需要进行修改,从而满足不断变化的互联网领域的需求。


回页首

Google GData

Zend_GData 组件本质上是面向支持 GData API 的各种 Google 服务的大型适配器。可被 Zend_GData 组件访问的更新后的 GData 服务列表包括:

  • Google Base
  • Google Blogger
  • Google Calendar
  • Google Codesearch
  • Google Documents List
  • Google Notebook
  • Google Provisioning
  • Google Spreadsheets
  • Picasa Web Albums
  • YouTube

也许在 Zend Framework V1.5 中人们最期待的新的 Web 服务支持是对 YouTube API 的支持。现在,通过使用 Zend_GData,您可以使用很多匹配条件搜索并访问 YouTube 视频、访问视频提要和订阅、查看用户个人信息,查看一个特定用户的全部视频和最受欢迎的视频并获取评论。通过现有的功能,可以找到适当的 YouTube 内容并把它们无缝集成到您的 PHP 应用程序中。

目前,Zend Framework 的 YouTube API 支持是只读的。

Adobe PDF 中的 UTF-8 字符支持
Zend Framework V1.5 的另一项改进功能是将 UTF-8 字符集添加到 Zend Framework 早期版本中已有的原生 PDF 支持。这一改进极大地增加了有效字符的数目,并扩展了 PDF 组件支持的语言的数量。另外,现在可以从装载的 PDF 文件中提取字体并更轻松地实现增量更新。

回页首

对 Ajax 支持的改进: ContextSwitch helper 和 REST

Asynchronous JavaScript + XML (Ajax) 对将信息传送到客户机的浏览器会话的方式产生了深远影响。非常简单:使用 Ajax 客户端 JavaScript 可以请求并接收来自外部信息源的信息,无需离开主窗口位置导航或重新装载。Ajax 大量应用于 Web 应用程序中,如 Gmail,后者在更新信息时保持基础窗口不变,且无需重新装载整个窗口。

Zend Framework V1.5 已经通过 ContextSwitch helper 和 Zend_REST 组件改进了原生 Ajax 支持。

ContextSwitch helper 是 Zend_Controller 的一部分,用于以不同的格式或上下文传送现有内容。例如,假设您已经创建了一个用于创建页面的控制器,它列出您在过去三周内吃过的全部早餐的详细信息。通 常,这将通过含有布局和视图(与浏览器友好的网站的其余内容保持一致)的页面显示。现在假设某个人问您是否能以 XML 的形式提供同样的列表。使用 ContextSwitch,您不需要再创建单独的控制器。只需告诉 helper 它可以显示 XML 并且创建 XML 视图脚本,而不是普通的上下文视图脚本。它将确保文档扩展和标题恰当且形式良好,并且以 Ajax 友好的 XML 形式显示您的全部早餐。

现在,事情甚至更加简单了:在 Zend Framework V1.5 中有一个 AjaxContext helper,它专门用来将上下文切换到 XML,从而构建 Ajax 响应。

对 Ajax 的支持继续扩展到 Zend_REST 组件,它包含 REST 客户机和全部的 REST 服务器功能。Zend_REST 可用于生成您自己的 Web 服务或访问和解析 Web 服务。当然,您发布的 XML Web 服务可通过 Ajax 轻松地进行访问。


回页首

结束语

我们已经了解到,Zend Framework V1.5 实现了很多令人兴奋的进展。某些更新可以简化一些日常任务的正确设置,而其他更新则使选项更容易访问。全部这些更新都为您提供了更加强大的功能,这永远不会是坏事。
参考资料

学习

获得产品和技术

讨论

关于作者

据 Katie Horn 的妈妈介绍,她在她 28 岁的生命中花费了太多时间在计算机上。她拥有 Chapman University 大学的计算机科学学士学位。她非常喜欢头衔中包含 “系统” 和 “工程师” 等字眼的工作。尽管在该领域非常精通,她宁愿永远不再被叫做 “网络管理员”。

linux环境下shell编程之时区转换

今天和同事一起讨论了一下时区转换的问题.
执行下面的语句:
TZ=’America/Los_Angeles’ date +”%Y-%m-%d %H” –date=”`TZ=’Asia/Shanghai’ date –date=”2008-10-10 15:00:00″`”

结果:2008-10-10 14
显然是错误的.

直接看一下后面的语句:TZ=’Asia/Shanghai’ date –date=”2008-10-10 15:00:00″
结果:Fri Oct 10 15:00:00 CST 2008

为什么呢?搜了一下,CST代表了很多时区:
CST Central Standard Time (USA) UT-6:00
CST Central Standard Time (Australia) UT+9:30
CST China Standard Time UT+8:00
CST Cuba Standard Time UT-4:00

原来很多系统里面CST都变成了GMT-6,也就是美国中部时间.

然后分别试了一下香港和台湾的时区,也都会被自动转为CST.

最后试了一下新加坡的时区:SGT(Asia/Singapore)

TZ=’America/Los_Angeles’ date +”%Y-%m-%d %H” –date=”`TZ=’Asia/Singapore’ date –date=”2008-10-10 15:00:00″`”

一切OK,

附录:各洲时区列表:http://us.php.net/manual/en/timezones.php

windows下一些启动服务的命令

1. gpedit.msc—–组策略
2. sndrec32——-录音机
3. Nslookup——-IP地址侦测器
4. explorer——-打开资源管理器
5. logoff———注销命令
6. tsshutdn——-60秒倒计时关机命令
7. lusrmgr.msc—-本机用户和组
8. services.msc—本地服务设置
9. oobe/msoobe /a—-检查XP是否激活
10. notepad——–打开记事本
11. cleanmgr——-垃圾整理
12. net start messenger—-开始信使服务
13. compmgmt.msc—计算机管理
14. net stop messenger—–停止信使服务
15. conf———–启动netmeeting
16. dvdplay——–DVD播放器
17. charmap——–启动字符映射表
18. diskmgmt.msc—磁盘管理实用程序
19. calc———–启动计算器
20. dfrg.msc——-磁盘碎片整理程序
21. chkdsk.exe—–Chkdsk磁盘检查
22. devmgmt.msc— 设备管理器
23. regsvr32 /u *.dll—-停止dll文件运行
24. drwtsn32—— 系统医生
25. rononce -p —-15秒关机
26. dxdiag———检查DirectX信息
27. regedt32——-注册表编辑器
28. Msconfig.exe—系统配置实用程序
29. rsop.msc——-组策略结果集
30. mem.exe——–显示内存使用情况
31. regedit.exe—-注册表
32. winchat——–XP自带局域网聊天
33. progman——–程序管理器
34. winmsd———系统信息
35. perfmon.msc—-计算机性能监测程序
36. winver———检查Windows版本
37. sfc /scannow—–扫描错误并复原
38. taskmgr—–任务管理器(2000/xp/2003

40. wmimgmt.msc—-打开windows管理体系结构(WMI)
41. wupdmgr——–windows更新程序
42. wscript——–windows脚本宿主设置
43. write———-写字板
44. winmsd———系统信息
45. wiaacmgr——-扫描仪和照相机向导
46.
47. mem.exe——–显示内存使用情况
48. Msconfig.exe—系统配置实用程序
49. mplayer2——-简易widnows media player
50. mspaint——–画图板
51. mstsc———-远程桌面连接
52. mplayer2——-媒体播放机
53. magnify——–放大镜实用程序
54. mmc————打开控制台
55. mobsync——–同步命令
56. dxdiag———检查DirectX信息
57. drwtsn32—— 系统医生
58. devmgmt.msc— 设备管理器
59. dfrg.msc——-磁盘碎片整理程序
60. diskmgmt.msc—磁盘管理实用程序
61. dcomcnfg——-打开系统组件服务
62. ddeshare——-打开DDE共享设置
63. dvdplay——–DVD播放器
64. net stop messenger—–停止信使服务
65. net start messenger—-开始信使服务
66. notepad——–打开记事本
67. nslookup——-网络管理的工具向导
68. ntbackup——-系统备份和还原
69. narrator——-屏幕“讲述人”
70. ntmsmgr.msc—-移动存储管理器
71. ntmsoprq.msc—移动存储管理员操作请求
72. netstat -an—-(TC)命令检查接口
73. syncapp——–创建一个公文包
74. sysedit——–系统配置编辑器
75. sigverif——-文件签名验证程序
76. sndrec32——-录音机
77. shrpubw——–创建共享文件夹
78. secpol.msc—–本地安全策略
79. syskey———系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
80. services.msc—本地服务设置
81. Sndvol32——-音量控制程序
82. sfc.exe——–系统文件检查器
83. sfc /scannow—windows文件保护
84. tsshutdn——-60秒倒计时关机命令
85. tourstart——xp简介(安装完成后出现的漫游xp程序)
86. taskmgr——–任务管理器
87. eventvwr——-事件查看器
88. eudcedit——-造字程序
89. explorer——-打开资源管理器
90. packager——-对象包装程序
91. perfmon.msc—-计算机性能监测程序
92. progman——–程序管理器
93. regedit.exe—-注册表
94. rsop.msc——-组策略结果集
95. regedt32——-注册表编辑器
96. rononce -p —-15秒关机
97. regsvr32 /u *.dll—-停止dll文件运行
98. regsvr32 /u zipfldr.dll——取消ZIP支持
99. cmd.exe——–CMD命令提示符
100. chkdsk.exe—–Chkdsk磁盘检查
101. certmgr.msc—-证书管理实用程序
102. calc———–启动计算器
103. charmap——–启动字符映射表
104. cliconfg——-SQL SERVER 客户端网络实用程序
105. Clipbrd——–剪贴板查看器
106. conf———–启动netmeeting
107. compmgmt.msc—计算机管理
108. cleanmgr——-垃圾整理
109. ciadv.msc——索引服务程序
110. osk————打开屏幕键盘
111. odbcad32——-ODBC数据源管理器
112. oobe/msoobe /a—-检查XP是否激活
113. lusrmgr.msc—-本机用户和组
114. logoff———注销命令
115. iexpress——-木马捆绑工具,系统自带
116. Nslookup——-IP地址侦测器
117. fsmgmt.msc—–共享文件夹管理器
118. utilman——–辅助工具管理器
119. gpedit.msc—–组策略

vsftpd启动方式配置心得

今天服务器当机,重启后发现ftp无法使用.
[root@localhost ~]# ps -ef|grep ftp
test1     3112  3111  0 16:32 ?        00:00:00 /usr/libexec/openssh/sftp-server
user1      3358  3357  0 16:39 ?        00:00:00 /usr/libexec/openssh/sftp-server
果然ftp服务没有启动.

[root@localhost ~]# netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:6010              0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:6011              0.0.0.0:*                   LISTEN
tcp        0      0 :::80                       :::*                        LISTEN
tcp        0      0 :::22                       :::*                        LISTEN
tcp        0      0 ::1:6010                    :::*                        LISTEN
tcp        0      0 ::1:6011                    :::*                        LISTEN

21端口也没有使用.

因为安装时没有记笔记,也几乎忘记了怎样启动,依稀记得当时是以xinetd的方式启动的,为此也查了很多资料.

试着执行下面的命令:
[root@localhost ~]# /usr/local/sbin/vsftpd start

出现下面的错误:
500 OOPS: vsftpd: cannot open config file:start

指定配置文件:
[root@localhost ~]# /usr/local/sbin/vsftpd /etc/vsftpd.conf

接着出现下面的提示:
500 OOPS: tcp_wrappers is set to YES but no tcp wrapper support compiled in

这时以为是防火墙没有启动,于是手动启了一下静态防火墙:
[root@localhost ~]#  service iptables start
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

重新执行上面的命令后依然出现上面的错误.于是查了一下tcp_wrappers到底有没有用,有篇文章介绍http://freebsd.lab.mlc.edu.tw/tcp_wrappers/

仔细想想可能还需要重新编译vsftp,只是安全方面的设置,暂时先注释掉试试...

没想到又出现了下面的问题:
500 OOPS: vsftpd: not configured for standalone, must be started from inetd

后面加上&号后,还是出现上面的错误.突然想起以前好像有人说过最好不要用xinetd启动,于是就查一下如何以standalone方式启.

步骤如下:
1).vi /etc/xinetd.d/vsftpd
将disable=no 改为 disable=yes

2).vi /etc/vsftpd.conf
将listen=no 改为 listen=YES

3).service xinetd stop, 停掉xinetd服务.

4)./usr/local/sbin/vsftpd /etc/vsftpd.conf &

启动成功!

再试一下一直搞不明白的被动模式,也可以用了!我想可能和standalone启动方式有关,也可能和tcp_wrappers有关,有待进一步研究.

爬虫工作原理及关键技术概述

网络爬虫是一个自动提取网页的程序,它为搜索引擎从Internet网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获 得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根 据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网 页URL,并重复上述过程,直到达到系统的某一条件时停止,另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查 询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。

相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题:
(1) 对抓取目标的描述或定义;
(2) 对网页或数据的分析与过滤;
(3) 对URL的搜索策略。
抓取目标的描述和定义是决定网页分析算法与URL搜索策略如何制订的基础。而网页分析算法和候选URL排序算法是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在。这两个部分的算法又是紧密相关的。

2 抓取目标描述
现有聚焦爬虫对抓取目标的描述可分为基于目标网页特征、基于目标数据模式和基于领域概念3种。
基于目标网页特征的爬虫所抓取、存储并索引的对象一般为网站或网页。根据种子样本获取方式可分为:
(1) 预先给定的初始抓取种子样本;
(2) 预先给定的网页分类目录和与分类目录对应的种子样本,如Yahoo!分类结构等;
(3) 通过用户行为确定的抓取目标样例,分为:

  • 用户浏览过程中显示标注的抓取样本;
  • 通过用户日志挖掘得到访问模式及相关样本。

其中,网页特征可以是网页的内容特征,也可以是网页的链接结构特征,等等。
现有的聚焦爬虫对抓取目标的描述或定义可以分为基于目标网页特征,基于目标数据模式和基于领域概念三种。
基 于目标网页特征的爬虫所抓取、存储并索引的对象一般为网站或网页。具体的方法根据种子样本的获取方式可以分为:(1)预先给定的初始抓取种子样本;(2) 预先给定的网页分类目录和与分类目录对应的种子样本,如Yahoo!分类结构等;(3)通过用户行为确定的抓取目标样例。其中,网页特征可以是网页的内容 特征,也可以是网页的链接结构特征,等等。

基于目标数据模式的爬虫针对的是网页上的数据,所抓取的数据一般要符合一定的模式,或者可以转化或映射为目标数据模式。

另一种描述方式是建立目标领域的本体或词典,用于从语义角度分析不同特征在某一主题中的重要程度。

3 网页搜索策略
网页的抓取策略可以分为深度优先、广度优先和最佳优先三种。深度优先在很多情况下会导致爬虫的陷入(trapped)问题,目前常见的是广度优先和最佳优先方法。
3.1 广度优先搜索策略
广 度优先搜索策略是指在抓取过程中,在完成当前层次的搜索后,才进行下一层次的搜索。该算法的设计和实现相对简单。在目前为覆盖尽可能多的网页,一般使用广 度优先搜索方法。也有很多研究将广度优先搜索策略应用于聚焦爬虫中。其基本思想是认为与初始URL在一定链接距离内的网页具有主题相关性的概率很大。另外 一种方法是将广度优先搜索与网页过滤技术结合使用,先用广度优先策略抓取网页,再将其中无关的网页过滤掉。这些方法的缺点在于,随着抓取网页的增多,大量 的无关网页将被下载并过滤,算法的效率将变低。

3.2 最佳优先搜索策略
最佳优先搜索策略按照一定的网页分 析算法,预测候选URL与目标网页的相似度,或与主题的相关性,并选取评价最好的一个或几个URL进行抓取。它只访问经过网页分析算法预测为“有用”的网 页。存在的一个问题是,在爬虫抓取路径上的很多相关网页可能被忽略,因为最佳优先策略是一种局部最优搜索算法。因此需要将最佳优先结合具体的应用进行改 进,以跳出局部最优点。将在第4节中结合网页分析算法作具体的讨论。研究表明,这样的闭环调整可以将无关网页数量降低30%~90%。

4 网页分析算法

网页分析算法可以归纳为基于网络拓扑、基于网页内容和基于用户访问行为三种类型。
4.1 基于网络拓扑的分析算法
基于网页之间的链接,通过已知的网页或数据,来对与其有直接或间接链接关系的对象(可以是网页或网站等)作出评价的算法。又分为网页粒度、网站粒度和网页块粒度这三种。
4.1.1 网页(Webpage)粒度的分析算法
PageRank 和HITS算法是最常见的链接分析算法,两者都是通过对网页间链接度的递归和规范化计算,得到每个网页的重要度评价。PageRank算法虽然考虑了用户 访问行为的随机性和Sink网页的存在,但忽略了绝大多数用户访问时带有目的性,即网页和链接与查询主题的相关性。针对这个问题,HITS算法提出了两个 关键的概念:权威型网页(authority)和中心型网页(hub)。

基于链接的抓取的问题是相关页面主题团之间的隧道现象,即很 多在抓取路径上偏离主题的网页也指向目标网页,局部评价策略中断了在当前路径上的抓取行为。文献[21]提出了一种基于反向链接(BackLink)的分 层式上下文模型(Context Model),用于描述指向目标网页一定物理跳数半径内的网页拓扑图的中心Layer0为目标网页,将网页依据指向目标网页的物理跳数进行层次划分,从外 层网页指向内层网页的链接称为反向链接。

4.1.2 网站粒度的分析算法
网站粒度的资源发现和管理策略也比网页粒度的更 简单有效。网站粒度的爬虫抓取的关键之处在于站点的划分和站点等级(SiteRank)的计算。SiteRank的计算方法与PageRank类似,但是 需要对网站之间的链接作一定程度抽象,并在一定的模型下计算链接的权重。
网站划分情况分为按域名划分和按IP地址划分两种。文献[18]讨 论了在分布式情况下,通过对同一个域名下不同主机、服务器的IP地址进行站点划分,构造站点图,利用类似PageRank的方法评价SiteRank。同 时,根据不同文件在各个站点上的分布情况,构造文档图,结合SiteRank分布式计算得到DocRank。文献[18]证明,利用分布式的 SiteRank计算,不仅大大降低了单机站点的算法代价,而且克服了单独站点对整个网络覆盖率有限的缺点。附带的一个优点是,常见PageRank 造假难以对SiteRank进行欺骗。
4.1.3 网页块粒度的分析算法
在一个页面中,往往含有多个指向其他页面的链接,这些 链接中只有一部分是指向主题相关网页的,或根据网页的链接锚文本表明其具有较高重要性。但是,在PageRank和HITS算法中,没有对这些链接作区 分,因此常常给网页分析带来广告等噪声链接的干扰。在网页块级别(Blocklevel)进行链接分析的算法的基本思想是通过VIPS网页分割算法将网 页分为不同的网页块(page block),然后对这些网页块建立pagetoblock和blocktopage的链接矩阵,分别记为Z和X。于是,在 pagetopage图上的网页块级别的PageRank为Wp=X×Z;在blocktoblock图上的BlockRank为 Wb=Z×X。已经有人实现了块级别的PageRank和HITS算法,并通过实验证明,效率和准确率都比传统的对应算法要好。
4.2 基于网页内容的网页分析算法
基 于网页内容的分析算法指的是利用网页内容(文本、数据等资源)特征进行的网页评价。网页的内容从原来的以超文本为主,发展到后来动态页面(或称为 Hidden Web)数据为主,后者的数据量约为直接可见页面数据(PIW,Publicly Indexable Web)的400~500倍。另一方面,多媒体数据、Web Service等各种网络资源形式也日益丰富。因此,基于网页内容的分析算法也从原来的较为单纯的文本检索方法,发展为涵盖网页数据抽取、机器学习、数据 挖掘、语义理解等多种方法的综合应用。本节根据网页数据形式的不同,将基于网页内容的分析算法,归纳以下三类:第一种针对以文本和超链接为主的无结构或结 构很简单的网页;第二种针对从结构化的数据源(如RDBMS)动态生成的页面,其数据不能直接批量访问;第三种针对的数据界于第一和第二类数据之间,具有 较好的结构,显示遵循一定模式或风格,且可以直接访问。

法国人眼中的中国

这两天陪一个法国女孩在上海逛街,用蹩脚的英文加上富有幽默感的汉语亲身体验了一把与老外的面对面的交流,感触颇深。

1.她对中国了解其实非常少,对于除了几个国际巨星(包括毛泽东,但也只知道他是中国人民最崇拜的人)之外的中国名人(包括科学家,数学家,企业家。。。)几乎一概不知,对中国为什么落后也更是一知半解。

2.来到中国,似乎有很多事情想不通,不明白上海怎么有这么多的高楼(人多不要紧,不用扎一堆);不明白为什么背包不能背在身后面(你们谁是贼?站出来给俺老乡看看);不明白为什么见到路边无缘无故提供唱歌服务并向你伸手要钱的人就要逃开或者只给一个铜板(虽然没有大牌名星那么动听,也没人鼓掌,但至少还算付出劳动了吧--只有几个人知道唱的是“小草”);为什么那么多人都觉得外滩很美(明明水很脏);为什么放假了大家都往一个地方跑(明明知道人会那么多,挤都挤s了,哪还有心情玩。但中国那么大,别的地方都不好玩了吗?);为什么大家在公共场所吃饭的时候嗓门都那么大(跟吵架似的);为什么中国人用餐都n多人share同一份菜,我的解释是中国人都是有福同享、有难同当的(万一有一个人有个啥病,其他人也都会很自然地跟着受罪,并一直在猜想:认命吧,这是遗传);为什么中国人很多喜欢吃辣椒(难道没了它就没了胃口?);为什么中国人觉得英语很难学,明明语法和中文很像啊,看看英文电影,交个英美朋友就完全搞定了(法语语法才叫个难呢,而且是越学越难,不过用的人少,不用刻意去学);为什么路边有那么多卖盗版光盘的摊子(中国人真幸福!捡了个大便宜);

3.感叹中国人口真是众多,光上海就有1500万(北京1600万,整个法国也不过就9000多万)。

4.在他们的印象中,中国人的奴化思想比较严重,大部分没有多少主见(准确地说是没有优生优育吧,没有能力让孩子享福也要滥生无辜)。

5.在他们的印象中,中国人很穷很落后,连竞争电影广告费的钱都出不起,害得她们想看中国电影都不知道到哪家影院(在我的启发之下,同时也承认中国近些年发展很快,很多欧洲人都想来中国发展,学汉语的人也在增多,慢慢回想起还看过《卧虎藏龙》,但不承认是中国人拍的,而香港人拍的,汗!)。

6.在他们与台湾人香港人的接触过程中已经有了一个印象:台湾和香港的一部分人都不愿意说自己是中国人(觉得中国人没本事,在香港处于殖民地的期间不愿意收复,待到发达了才收回来,我也解释了半天:打仗也是要会出代价的,只要大陆的经济及各方面都超过了美国,就不信他们还不想当中国人)。

7.在她的眼里好像我这年龄(快奔三了!!!)也差不多该应该有车了(可以开着car而不是by bus,其实我是可以买车了,不过解决住房问题似乎优先级更高一些)。

用sed命令批量替换文件内容[原]

今天测试一个替换一个目录下所有.htm文件的脚本。

replace.sh

#!/bin/bash
DIR=/home/tom/test/data
for f in $(ls $DIR/*.htm); do
TMP_FILE=$f.tmp
sed -e ‘s/<table width=”100%” border=”0″ cellpadding=”0″
cellspacing=”0″>/<!–#include virtual=”\/test.html”
–>\n<table width=”100%” border=”0″ cellpadding=”0″
cellspacing=”0″>/g’ $f >> $TMP_FILE
mv $TMP_FILE $f
done

对于初学shell编程的同学来说有以下几点需要注意:

1. #!/bin/bash不能忘记写;

2.赋值号前后不能有空格;

3.变量$f取到的文件名是有可能会带路径的;

4.sed命令好像在替换以后不能自动保存到文件,所以需要重定向到临时文件,然后mv一下;

5.当中的/要转义,\n可以代表回车;

6.如果想递归遍历,不能用‘ls -R $DIR’直接来处理,目前想到的方法是用‘find $DIR | grep -F ‘.htm’’命令来代替。