Quantcast
Channel: CSDN博客推荐文章
Viewing all 35570 articles
Browse latest View live

系统架构师-基础到企业应用架构-系统建模[上篇]

$
0
0

一、摘要

       本文主要从系统架构中的建模开始讲解,本文讲述的内容主要是我在工作和学习过程中的总结和经验,不足之处还请大家多多批评指出,有更好的建议也可以留言

说明。本意主旨是为不熟悉系统架构建模过程和不知道如何使用建模工具,或者不熟悉如何根据需求去建立模型的角度出发,简单的阐述了在系统架构的过程中我们应

该从什么样的角度出发去分析需求并且建立抽象模型。这应该说是架构师必备的技能。

       本文由浅入深,本篇将简单的介绍如何使用使用UML建模中的各个结构图与行为图,去完成抽象模型的建立。

二、本章内容

       1、摘要。

       2、本章内容。

       3、建模工具介绍及使用。

       4、建模中的抽象模型图。

       5、本质总结。

       6、系列进度。

       7、下篇预告。

三、建模工具介绍

      介绍建模工具之前,我们先来简单介绍下建模语言的定义。建模语言就是基于一系列规则、符号、图表、关键字的图形化或文本语言。建模语言的主要作用是对模

型的结构与行为进行描述。并且能够将知识和信息通过模型传递给熟悉该描述语言的人。

      当今的建模语言其实并不少,其中比较有规模的如下图:

      image

     不过最流行、最常用的当属UML建模语言(Unified Modeling Language) 统一建模语言。经过不断的发展,目前UML已成为业界公认的标准的建模语言。

     我们先来了解下UML建模语言的起源:

     回顾20世纪晚期--准确地说是1997年,OMG组织(Object Management Group对象管理组织)发布了统一建模语言(Unified Modeling Language,

UML)。UML的目标之一就是为开发团队提供标准通用的设计语言来开发和构建计算机应用。UML提出了一套IT专业人员期待多年的统一的标准建模符号。通过使用

UML,这些人员能够阅读和交流系统架构和设计规划--就像建筑工人多年来所使用的建筑设计图一样。

     到了21世纪--准确地说是2003年,UML已经获得了业界的认同。在我所见过的专业人员的简历中,75%都声称具备UML的知识。然而,在同绝大多数求职人员面

谈之后,可以明显地看出他们并不真正了解UML。通常地,他们将UML用作一个术语,或对UML一知半解。大家对UML缺乏理解的这种状况,促进我撰写这篇关于UML

建模。当阅读完本文时,您还不具备足够的知识可以在简历上声称自己掌握了UML,但是您已具有了进一步钻研该语言的良好起点。

四、建模中的抽象模型

     既然UML语言如此流行,本系列中也只用UML语言来进行建模,本系列中的后续章节也将基于UML建模图来完成相应的设计。

     学习过UML语言的开发人员都知道UML分为以下几类模型图:

     image

     通过上图我们知道UML的分类,分为结构型与行为型建模图形。下面的内容将详细的讲述每种建模图形的使用场景及如何使用。

    行为型:

     我们先从行为型的建模图形来开始讲起:

    1、用例图:

     我想用例图大家都应该基本上有所了解,只要使用过UML建模的除了基本的流程图基本上大家都会的使用外,用例图用过是最常见的一种建模图形。

     用例图中主要包含的元素:系统、参与者、用例、关系。

     用例图主要的应用场景:一般用例图用来描述需求中的系统应具有的功能,系统参与者(使用者,维护者、外部系统或者用户等)与系统如何交互进行一个模

型话的描述。

     用例图的目的:帮助开发团队以一种可视化的方式理解系统的功能需求。

     一般使用如下方式来进行操作:

     image 用来标识系统的参与者,任何与系统交互的对象,都可以叫参与者。

     image

     是用来描述系统中的某个模块与参与者的一次交互过程。

     系统参与者与用例之间的具体关系通过如下连线标示:

     image

     这几类不同的连线来标识不同的用例之间或者用例与参与者或者2个参与者直接直接的关系。

     UML定义了3类标准的关系:

     第一种:包含,通过一条直线链接2个用例,因此是用例之间的关系链接,表述了箭头的开始一端包含箭头指向的一端的用例。

     例如:image

     第二种:扩展,通过一个反向的直线来标识某个用例扩展了另外一个用例的行为,一般情况下箭头指向的用例即是被扩展的用例。

     例如: image

     第三种:泛化,用来标识具有同质关系的参与者与参与者或者用例与用例之间的关系,泛化类似继承关系。箭头指向的为父元素。

     例如:image

     除了以上的3中关系还有一种未列在规范关系的我们把它叫做关联关系。这种关系是用来描述用例与参与者直接的关系的。是通过一条直线来完成链接的,泛化关系

描述了链接的2个部分存在某种程度的交付。一般情况下,我们可以系统的功能情况分析出系统中的主动发和被动方。

     如何使用用例图:

     第一步:先把系统按照功能进行划分,比如一个简单的内容管理系统。先把他细化,细化成多个模块功能。每个模块的功能相对独立,但是可能又与另外一个有交

互。

     第二步:把功能需求抽象,达到高内聚,低耦合的标准,然后分析出该模块功能的参与者是什么,例如用户是谁?或者细分成角色,与该模块交互还可能是数据库?

等,把所有交互的对象分析出。

     第三步:把系统模块中的每个功能模块看是否能再按照子功能进行细分,细分后形成具体的用例。

     第四步:分析用例与参与者之间的关系,分析同质对象(参与者与参与者、用例与用例)之间的关系。

     第五步:根据以上四步完成建模。在建模的过程如果发现某块功能不清晰或者参与者不清晰,可重复前4步。

    2、类图:

     类图也是UML建模中最常用的一种结构图,类图用来标示系统的静态结构。静态结构是由类型及关系构成。

     类图表示不同的实体(人、事物和数据)如何彼此相关;换句话说,它显示了系统的静态结构。类图可用于表示逻辑类,逻辑类通常就是业务人员所谈及的事物种

类--摇滚乐队、CD、广播剧;或者贷款、住房抵押、汽车信贷以及利率。类图还可用于表示实现类,实现类就是程序员处理的实体。实现类图或许会与逻辑类图显示一

些相同的类。然而,实现类图不会使用相同的属性来描述,因为它很可能具有对诸如Vector和HashMap这种事物的引用。

     类图其实就是一个长方形,内部分成3个区域。每个区域的含义不同。

     image

      类图中也有命名空间的概念,是通过包来实现的如果想定义该类在某个命名空间中,则在定义类名时按照如下类似格式标示

      命名空间 :: 类名 [必须按照这样的形式才可以]。

      类图中的有3类修饰符,每种修饰符标示的含义不同。

      image

      具体用法如下:

      image

      理解成具体的类代码的格式如下:

      public class Product

      {

          Public string ProductName;

          public void GetProductLists(string sWhere)

          {

             //TODO….

          }

      }

      如果在类图中的属性定义与函数成员的定义是斜体表示的话,则表名该成员是虚成员。

      image 虚成员

      如果在类图中的属性定义与函数成员的定义是带下划线的话,则表名该成员是静态成员。

      image 静态成员

      当然这是最基本的类图,还有一种特殊的,类图支持参数化类型即是.NET中的特殊类型[泛型格式]标示。

      image 参数化类图

      具体的表示形式如:该符号在类的右上角有个长方形其中可输入类型如上图。

      类图中属性包含的元素:

      访问修饰符:Public、Protected、Private

      特性/属性名称:特性/属性名称

      类型:可以是自定义类型或者是系统类型。

      默认值:即特性/属性的默认值,如果有的话。

      重复性:可以用来定义多个对象的集合,特性值中包含的对象个数。

     类图中操作包含的元素:

      访问修饰符:Public、Protected、Private

      操作名称:函数名称

      操作列表:函数的参数列表。

      返回值:函数的返回值,如果有的话。

      函数参数列表中的参数方向:

      image

     类图之间的关联关系

      首先我们知道,我们在设计类的时候就是把独立的功能放在一个类中,不同的类之间进行交互,那么我们在类图中如何去表述这样的类之间的关系呢?

      类图直接的关系:

      1、关联关系:关联标识2个类直接存在关系。是通过一条线来表示,关联关系中包含了2种特殊的关系:聚合和组合

       聚合代表的2个类直接是has-a的关系,即部分与整体的关系,具体的图标通过一条虚线带有菱形箭头,箭头指向的方向即是整体的部分,代表该类包含另一部分。

      聚合例如:image 代表产品中具有ProductName这个成员。

      组合举例:组合关系的标示与聚合比较类似,唯一区别实心的菱形。

      组合例如:image

      组合与聚合的区别:

      在聚合关系中被包含对象可能不完全依赖容器对象,也就是说ProductName不完全依赖Product。如果Product对象销毁,但是可能ProductName对象没有被销

毁。可以这么想想产品的分类不会因为产品销毁而不存在。

       组合关系中则是比聚合的关联程度更高,Product完全包含ProductName。如果销毁Product时,那么ProductName也一定被销毁。产品从数据库被删除了,那

么与产品相关的的数据列属性也被删除了,这里只是举例子,可能不太合适。     

      类图之间的泛化关系

       泛化关系:存在2个类之间。一个类是另外一个类的子类,表示一个类是另外一个类的特例。

       表示方法:通过一个带有空的三角形箭头的线段标识,箭头指向父类型。

       image 表示火车和汽车是交通工具的子类型。

      类图之间的依赖关系

        依赖关系描述为:一个类型必须依靠另外一个类才能实现相应的功能。最简单的理解方式:依赖注入中的构造函数注入。

        具体的表示方法:一个带有箭头的虚线段。箭头方向标示被依赖的类型。

        例如:image

五、本章总结。

       本章主要是对UML有个简单的介绍及详细介绍了如何构建UML图形中的用例图与类图。这是我们在建模时常用的2类图形。也是必须掌握的建模图形。

同时通过本质我们应该大脑中对UML有个新的认识,UML建模可以让我多个角度的去分析问题,然后不断的改进设计,同时能很清晰的表达功能需求功能的分离和组合

关系。本文只是简单的抛砖引玉,不足之处,在所难免,请大家批评指出。

六、系列进度。

       1、系统架构师-基础到企业应用架构系列之--开卷有益

       2、系统架构师-基础到企业应用架构-系统建模[上篇]

       3、系统架构师-基础到企业应用架构-系统建模[中篇](上)

       4、系统架构师-基础到企业应用架构-系统建模[中篇](下)

       5、系统架构师-基础到企业应用架构-系统建模[下篇]

       不断更新中(请持续关注…)

七、下篇预告。

      下一篇中将介绍UML建模过程中其他的比较常用的UML建模图形:顺序图、组件图、状态图等。

作者:hegezhou 发表于2011/9/10 12:23:01 原文链接
阅读:1419 评论:2 查看评论

系统架构师-基础到企业应用架构-系统建模[中篇](上)

$
0
0

一、上章回顾

       上篇文章主要简单的介绍了建模中使用的标准建模语言UML的相关内容,包括用例图与类图的使用方法及如何建模。相信大家对UML建模语言已经有了初步的认

识,还请大家谨记UML不同的建模图形的用处。比如,用例图主要用来描述系统的功能需求。类图主要用来描述实体间的关系。谨记这些就可以帮助我们在系统架构的

过程中深入的分析。

       首先向大家道歉,上篇中有部分描述错误的地方,可能对大家造成一定的错误引导。

       image 这是上篇给出的图,我描述的是组合关系。

       特别更正为:

       image 这是正确的结果。箭头指向聚合类。描述的信息并无任何错误。希望能对大家指正。

二、摘要

       本文主要从系统架构中的建模开始讲解,本文讲述的内容主要是我在工作和学习过程中的总结和经验,不足之处还请大家多多批评指出,有更好的建议也可以留言

说明。本意主旨是为不熟悉系统架构建模过程和不知道如何使用建模工具,或者不熟悉如何根据需求去建立模型的角度出发,简单的阐述了在系统架构的过程中我们应

该从什么样的角度出发去分析需求并且建立抽象模型。这应该说是架构师必备的技能。

       本文由浅入深,本篇将简单的介绍如何使用使用UML建模中的各个结构图与行为图,去完成抽象模型的建立。

       本文主要讲解以下几个建模图形:顺序图、组件图、状态图、活动图、部署图。当然本文也只是讲述了基本理论介绍及如何设计使用,系统架构师-基础到企业应

用架构-系统建模[下篇] 将会详细的讲解通过具体实例讲解如何使用这些已经介绍的抽象模型图形去描述。

三、本章内容

       1、上章回顾。

       2、摘要。

       3、本章内容。

       4、建模中的抽象模型图。

       5、本章总结。

       6、系列进度。

       7、参考文献。

       8、下篇预告。

四、建模中的抽象模型图。

1、顺序图。

介绍

       顺序图也称序列图,主要用来系统中的某个流程的详细步骤。顺序图能够给出流程中一系列对象的交互顺序。通过顺序图可以让我们更好的了解如何实现某个用例

的方法。我们知道用例图用来描述系统的功能需求。而顺序图清晰的描述了某个用例也就是系统功能的的实现方法。

详解

       在顺序图中包含的元素:

       image

       对象:用来标识流程中的详细步骤中的对象。

       活动条:用来标识当前对象是活动的,如果想表示某个对象是活动的,那么必须使用一个虚线+活动图的形式来构建。

       例如我们现在要标示一个简单的做公交车的刷卡流程:

       image IC卡刷卡操作。

       相关解释说明:

       公交卡,首先放在刷卡终端上,终端读取卡中的余额信息,然后刷卡终端与终端中的扣款程序对象交互,扣款程序根据读取的余额信息,与刷卡终端中的固定刷卡

金额对比,如果当前IC卡的余额大雨刷卡终端的固定金额则,扣除金额,并且返回一个消息,提示刷卡成功的操作。

       途中的实线表示调用被调用对象的方法,虚线表示当被调用对象执行成功后,返回的虚线上表示返回值的逻辑名称,这样可以提高了可读性。

       在公交卡与活动条之间,应有一个虚线链接。

       在上图中我们使用了活动条,活动条作为生命线的一部分。我们并没有定义对象的创建和销毁,因此我们来看UML建模语言提供的描述对象的创建与销毁实例。

image

       上图中的X符号的图标代表的时候对象的销毁。创建对象通过new来创建,上图中,我用中文描述“创建对象”来完成对象的创建,那么在生命线下的的X符号代

表销毁对象,从内存中移除对象。当然这个对象的销毁对不同的开发语言有这不同的处理方式。C++中的销毁对象,必须调用析构函数来销毁对象。C#与JAVA语言中

则只是说明当前需要销毁的对象没有被其他的对象引用,那么这类语言编译器提供垃圾回收器来完成回收。

       注意:当某个对象引用了另外一个对象,该对象有责任销毁被引用对象并且必须显示销毁该被引用对象时,那么必须要显示的发送被引用对象销毁的通知消息。白

话文来说就是显示的调用被引用对象的销毁方法。

       顺序途中的同步与异步。

       顺序图中的同步与异步与我们平时书写代码中的同步与异步的解释意思差不多。这里不过多解释,通过图例说明:

       image 客户去餐厅吃饭,首先要点餐,必须等待点餐完了才能上菜。意思就是可以这样简单描述。A简单调用B方

法,必须等待,等到B方法执行完毕后,继续执行。

      image 函数A调用函数B,如果B需要的时间特别长,那么此时A可以去继续执行做其他的事情比如做和函

数C交互,等B函数执行完了,只需要回调通知A,B函数执行完了即可。在函数调用中的术语就是回调。

      UML建模语言中同步与异步消息的标识格式:

      image

      UML提供了一些顺序图的高级功能:例如可以通过顺序图实现流程的控制。具体的实现工具是通过UML提出的交互框来实现流程条件的控制。

      交互框其实就是定义了流程控制图中的控制逻辑,基于交互框定义流程执行的条件。如果满足这个条件,那么则执行交互框中已定义好的顺序步骤。否则不做任何

操作。交互框中除了定义流程控制的条件外,还有一些自己特殊的操作符,具体的操作符及其作用,如下列表:

      image

    每个关键字代表的含义都有相应的描述。大家应该都可以看明白,上述的所有含义都是针对交互框来说的。

   总结

    如果在系统功能中有特殊需求,那么顺序图中的交互框是可以支持嵌套的。嵌套交互框的话,会提高顺序图的复杂度,降低可读性。因此我们设计时的原则尽量把复

杂的流程拆分成几个简单的,分别绘制顺序图来完成相应步骤。

  2、组件图。

简介

    众所周知,组件图是用来描述系统中的各组件之间的关系。首先我们必须知道组件的定义是什么,然后组件之间有哪些关系。理清楚这些,我们在以后的设计中才能

派上用场。UML语言对组件的定义已发生了巨大变化。在之前的版本里面,UML如下定义组件的:

   UML1.1语言中对组件的描述:把某个文件或者可以运行的程序称之为组件。但是我们知道,UML出现组件图以前,组件一般用来描述COM组件或者其他的组件,因此造成冲突,所以随着后续UML语言的发布,修改了原有的含义。

   UML2.x语言中对组件的的描述:组件是独立的,是运行在一个系统中的封装单位,提供了一系列的服务。

   通过上述UML语言中的变迁,目前的理解是:一个系统,可以随意更换系统中的某个组建。而不会影响系统的运行。这可以理解为类似,大家熟悉IOC容器的都应该

知道,运行在IOC容器中的对象,可以看作组件,那么替换其中的提供某一服务的组件,只要满足该组件服务的相关契约就能自动完成替换。而不会影响系统的运行。

每个组件都封装了一些特殊的行为,实现了特定的服务。

   组件之间的关系有哪些呢?我们通过下图来看看,组件直接可能存在的关系:

   image  组件直接的关系基本上来说就这2种。下面会举例区别2中关系。

   组件图提供的服务:组件图为系统架构师提供了解决方案的自然形式。组件图允许架构师验证系统的必需功能是由组件来完成的。组件是可以复用的。

详解

   组件图中包含的元素:

   image

   下面我们分别讲解:

   (1)、组件:我们知道组件是组件图中最基本的组成元素,组件上面已经讲述了组件的定义。这里就不在多介绍,组件图组成的基本单位即组件。

   (2)、容器:可以为多个组件提供服务的管理容器,容器中的组件相互交互。

   (3)、包:可以看作一个子系统,其实也可以看作是特殊的组件。

   (4)、约束:用于定义接口规范。

   (5)、给组件图中的相应元素添加相应注释信息。

    image 组件上可以定义自己的接口。例如上图,人这个组件提供了2个接口。Thinking与Sleep接口。

   组件关系的建模:

   我们来看看组件之间的关系的表示,根据上面讲解的组件的关系有依赖和泛化,参考类图中的依赖和泛化。

   image 依赖关系,标识一个组件依赖另外一个组件,如果被依赖组件无法正常运行,那么该组件也无法运行。

  image 泛化关系。标识一个组件与其他多个组件的关系为继承关系。

总结:

   通过上面的学习我们知道:组件图主要是为系统架构师对整个系统的解决方案的自然形成,可以通过组件图的形式把系统的大体功能进行区分和设计。通过组件图把

系统功能进行抽象和分离。然后通过顺序图把功能流程细分成多个步骤,然后通过类图去构建每个流程步骤中的每个类应具有的个方法。最后形成一个完整的设计文

档。

  3、状态图。

简介

  状态图其实是针对一个对象(实体、组件其他元素等)来说的。主要是描述了,对象的行为如何改变状态的反映。我们研究UML状态图的目的就是为了搞清楚,对

象状态的变化与行为的关系。建模对象的实时行为。创建状态图的条件:当对象行为的改变与状态有关的时候才创建状态图。状态图反映了对象如何改变状态相应行为

的变化和展示对象的生命周期的创建和删除的全过程。

详细

  状态图可建模的对象:

  image

  用例:可以描述用例图中的某个用例状态的变化。

  类:可以描述某个类的状态的变化。

  子系统:可以描述某个子系统中状态的变化。

  整个系统:类似(WF)工作流中的流程,每个节点其实就相当于一个状态。

image

  上面简单的绘制了一个去餐厅吃饭的状态变化,每个状态变化的行为都有描述,当然我这里只是简单的举例说明状态图的变化,并没有详细分析的所有可能状态都画出来。

具体的状态还请大家自己练习画出来,此处只是简单的举例说明。

  状态图中的元素:

  状态标记:

  image

  状态图中可以标识一个或多个初始状态,也可以包含一个或多个结束状态。

  状态图中不同状态之间的关系:

  image 转移关系,用来描述对象的状态从一个状态转移到另外一个状态的处理流,箭头指向转移后的状态。

   状态图中提供了类似流程图中的判定的功能元素:决策点。

   通过元素决策点来完成:

   image 决策点,用来决策跳向不同的状态。

   具体用例如下:

   image 就是起到了一个决策的作用。这里不在复述。

   状态图中的同步:

   状态图中的同步主要是为了说明并发工作流的分岔和联合。下图描述了状态图中的同步条:

image

    初始状态进入到同步条中分岔同步执行操作A与B,分别进入A状态、B状态,然后分别执行A1,B1联合进入到结束状态。

    一个对象可以通过同步操作同事拥有多个状态。有时候一个对象还可以拥有不同层次的多个状态。当单个状态拥有独立的附加子状态时就可以在状态图中使用层次结

构的状态。

   组合状态就是这样的比较复杂的状态结构图,有时候我们需要把一个复杂的状态细化成多个子状态的合成,那么这个复杂的状态就可以叫组合状态。

   下面举例说明:

image

  组合状态B,也即复合状态B,内部可能有比较复杂的状态(C-D状态)。这种只是组合状态B中存在单个状态变化流程的情况,还可能组合状态B中包含更多的状态流。

  那么我们就要用如下的状态图完成:

image

   上图中1代表的是下单的流程,2代表付款流程。

总结

   通过上面的学习我想大家对状态图有了一定的了解,那么我们来总结下,如何建模状态图。

   第一步:我们知道建模状态图,首先需要抽象出来要建模的对象。

   第二步:我们基于这个对象分析出该对象具有的所有状态及发生状态改变的行为。

   第三步:标识每个对象状态的起始状态与结束状态。

   第四步:开始创建对象的状态图,分析是否有必要创建复杂的组合状态。

   系统架构设计的过程中,我们首先要分析出哪些对象需要使用状态图来描述。如果某个对象具有复杂的行为,那么可以使用活动图来建模比使用状态图更适合。每个

状态图必须至少有一个起始状态和结束状态。并且详细的分析对象发生状态改变的行为。从某个状态转移到另外一个状态的行为是什么。在某些情况下,如果对象的某

个状态无法清晰的表达时,可以通过创建组合状态来进一步细化该状态,这样能更清晰的表达对象的状态变化。

五、本章总结。

  本章主要讲述了UML建模图形中的顺序图、状态图、组件图。并且分析了什么情况下使用各种UML建模图进行建模。并且通过简单实例说明如何使用。等UML所有的

建模图形介绍完毕后,我将针对如何我目前遇到一些问题进行分析讲解,如何遇到功能需求进行功能的分离及建模。希望大家多多提出宝贵意见。

六、系列进度。

       1、系统架构师-基础到企业应用架构系列之--开卷有益

       2、系统架构师-基础到企业应用架构-系统建模[上篇]

       3、系统架构师-基础到企业应用架构-系统建模[中篇](上)

       4、系统架构师-基础到企业应用架构-系统建模[中篇](下)

       5、系统架构师-基础到企业应用架构-系统建模[下篇]

       不断更新中(请持续关注…)

七、参考文献。

八、下篇预告。

     下一篇将把本章没有讲述完毕的活动图与部署图讲解完毕,其他的不常用的建模图形可能只是简单的讲解,不会像这几篇文章那样具有说明的讲解。由于本人才疏

学浅,可能对UML建模的认识不够深入,还请各位多多支出宝贵意见,我将在后续的文章中不断的改进和学习,将自己掌握的内容写出来,一方面是帮助不熟悉UML的

朋友尽快的上手,另外也可以让自己加深印象。

作者:hegezhou 发表于2011/9/10 12:24:19 原文链接
阅读:1137 评论:0 查看评论

系统架构师-基础到企业应用架构-系统建模[中篇](下)

$
0
0

一、上章回顾

        首先、我们先来回顾下,上篇讲解的内容,加深下印象。上篇我们主要讲解了3个建模图形分别是:顺序图(序列图)、组件图、状态图。

        具体功能描述如下图:这里不详细解释,如果不清楚请看:系统架构师-基础到企业应用架构-系统建模[中篇](上)

        image

         由于全部放在一篇中篇幅太长了,所以分开讲解。

二、摘要

       本文主要讲解:UML建模图中的活动图、部署图等

       image

       上图中就是本章要讲解的内容,本质将仔细的剖析,部署图与组件图的关系与区别,活动图与状态图的关系与区别。

三、本章内容

       1、上章回顾。

       2、摘要。

       3、本章内容。

       4、建模中的抽象模型图之部署图、活动图。

       5、本章总结。

       6、系列进度。

       7、下篇预告。

四、抽象模型图之部署图、活动图

部署图

      首先,我们先来讲解部署图。部署图主要是用来描述一系列组件部署到节点运行的结构。部署图显示了系统运行时的结构。一般情况下部署图帮助我们来理解分布

式应用系统。同时部署图还传达了构建应用系统的软件与硬件元素的配置及部署方式。

      部署图中的基本元素:

      1、节点:这里就是指组件运行的环境。可以是软件(操作系统、其他等)或硬件资源(计算机,其他硬件)。

      UML建模语言中的通用图形化表示为:

      image

       2、节点实例:节点实例与节点的区别就是有下划线和冒号,节点实例必须紧跟冒号,当然这个节点实例名称可以为空,节点必须要有。

      image 

      3、组件容器:一个节点可以包含其他节点,可以是组件,也可以是节点。

      image

      4、节点之间的关系

        (1)、单向依赖:

          image

         上图表示 查询统计组件,通过.net提供的ADO.NET访问SQLServer2005数据库。

         (2)、双向依赖:

          image

          上图表示:产品管理模块会把数据写入到数据库中,同时产品管理中的信息会从数据库中读取,双向依赖。

         (3)、通信:

          image

          上图表示:应用软件系统与数据库通过.NET提供的方式相互通信,个人理解任务就是双向通信(双向依赖)[错误之处,还请高人指出]。

        5、实例讲解:

        下面我们已一个简单的系统B2C来进行讲解:

        我们先来看看B2C系统中的相应节点:

        image

        客户端通过浏览器访问B2C站点,首先进入会员管理,如果注册,则进入到注册系统。会员管理中完成对采购的管理、支付、发布等。

        节点描述:

        浏览器:通过键入网站地址访问B2C站点。这是与B2C系统交互的唯一入口。

        注册系统:完成用户的注册与数据库通信。图上并未画出,所有的节点除了浏览器不需要直接与数据库交互外,其他的模块都需要与数据库通信。

        会员管理:完成会员中心的管理。会员的个人信息,开店的店铺信息,收货地址等等信息的管理,我的采购,我发布的产品等等。

        采购系统:系统中的子功能,用于完成买家的产品采购。

        发布系统:主要为卖家提供服务,发布产品信息等。与数据库通信

        支付系统:完成支付交易的操作。与个人账户进行通信。

        当然这里只是举个简单的例子,其他的内容,比如前台的展示等等,这些目前都没有考虑其中,也没有仔细分析,这里只是达到介绍的目的。

        6、总结

       通过上面的讲解相信大家对部署图已经有了基本的认识,部署图主要是用来完成将组件部署到节点上运行的结构。从整体上描述了,系统运行时的结构。部署图是

必须要掌握的建模图。

活动图

        活动图主要是用来描述系统的动态行为,从一个活动到另一活动的控制流。活动图的本质是流程图,但是与流程图又有所不同。在本小节中将会详细的讲解活动

图与流程图的本质的区别及活动图与状态图的区别。

        按照惯例,我们先来看看活动图的元素:

        1、动作状态:

        image

        通过用圆形边的长方形来表示一个动作状态。动作状态有几个特点:原子性(要么执行,要么不执行)、不可中断的操作,并且此次动作完成后一定转向到另外一种

状态。 动作状态是构造活动图的最小单位。

        状态图区别:

        a、活动图中动作状态可以有入转换与出转换,意思就是说可以从当前状态转向到另外一个状态,也可以从另外一个状态转换到当前状态。图形化的表示如下:

        image B动作状态,可以有入转换A,出转换C。

         动作状态必须至少有一个出转换,转换都是以内部的完成为起点,与外部事件无关。

         实心圆:代表起始状态。

         环形内的实心圆:代表结束状态。

         b、动作状态与状态图不同的是,动作状态不能有入口动作与出口动作。更不能有内部转移。

        2、活动状态:

        image

        通过二个半圆与一个长方形组合起来来标识活动状态。

        活动状态首先可以被分解成多个子活动或者多个子动作状态。活动状态他不像动作状态是原子性的。活动状态是非原子性。活动图内部的活动,可以用另外一个

活动图来表示。活动状态可以看作多个动作状态和多个子活动的组合。

        活动状态与动作状态不同,动作状态是活动状态的一个特例,当某个活动状态只有一个动作状态时,这个活动状态就是一个动作状态。活动状态可以有入口动作

和出口动作。还可以有内部转移。因为活动图是多个子活动和多个动作状态的组合,所以本来动作状态直接的转向就可以看作是内部转移了,所以就很好理解了。

        image

        上图已经基本表示出来了活动状态中的动态状态的转移等。我相信大家都能理解。

        3、动作节点之间的关系

        a、控制流:image 与状态图中的转向相同,活动图也使用一个带箭头的线段,箭头指向要转入的状态。

        b、分支:image   活动状态从A分支出来活动状态B、C,

        c、合并:image 活动状态B从活动状态A与C合并后得到。

        d、泳道:泳道将活动图中的多个活动划分成多个组。并且把每一组活动都由对象来负责组织业务,泳道区分了负责活动的对象。并且泳道明确的表

示了哪些活动是由哪些对象进行的。泳道通过垂直线来区分。而2个垂直线分割的区域即是一个泳道。上面的解释可能有点绕,说白了泳道即是上面说的对象,对象就是

泳道。把不同的泳道就叫一个对象。每个活动状态在有泳道的活动图中,只能属于一个泳道。

        下面来看有泳道的图例:

        image 上面有2个泳道,分别是我是泳道1,我是泳道,并且我是泳道1中的D与我

是泳道中的活动状态A有转向关系。

       e、对象流。

        对象流是对象与动作状态或者活动状态直间的依赖关系。表示动作使用对象或者动作对对象的影响。一般我们在使用中,我们可以把对象通过依赖关系与动作状态或者活动状态进行链接。

        对象流的几个特点:

        (1)、一般一个对象可以由多个活动状态或动作状态操作。

        (2)、一个活动状态或动作状态的输出对象可以作为另一个活动状态或动作状态的输入。

        (3)、一个对象可以在一个活动图中多次出现,但是有点需要注意,这个对象多次出现时表名该对象处于生命周期的不同时期。

        包含对象流的活动图:

        image

        泳道M1中出现了对象。并且该对象与活动状态B有依赖关系。

   总结

        本节中讲解了,活动图的基本知识,下面我们以我们平时比较熟悉的B2C业务,电子商城为例说明下,会员的产品管理流程。通过状态图的形式来表达。以巩固

下我们学习的成果。

        例如B2C中的产品管理。首先必须是会员才能登入系统中,然后必须是我是卖家,然后才能进行发布产品的操作。

        image 会员先要开启店铺,设置权限后才能进行产品管理

        image

五、本章总结

        本章主要讲述了部署图与活动图。现在我们回顾下本章要点。

        部署图:主要用来描述一系列组件部署在节点上运行的结构,是系统运行是的结构的描述。主要用于软件系统的

        活动图:主要用来描述系统的动态行为,从一个活动转换到另外一个活动状态。通过一系列的操作将业务流程通过工作流的形式来描述。一系列操作就是一系列

的活动状态。

六、系列进度。

前篇

       1、系统架构师-基础到企业应用架构系列之--开卷有益

       2、系统架构师-基础到企业应用架构-系统建模[上篇]

       3、系统架构师-基础到企业应用架构-系统建模[中篇](上)

       4、系统架构师-基础到企业应用架构-系统建模[中篇](下)

       5、系统架构师-基础到企业应用架构-系统建模[下篇]

      6、系统架构师-基础到企业应用架构-系统设计规范与原则[上篇]

      7、系统架构师-基础到企业应用架构-系统设计规范与原则[下篇]

      8、系统架构师-基础到企业应用架构-设计模式[上篇]

      9、系统架构师-基础到企业应用架构-设计模式[中篇]

      10、系统架构师-基础到企业应用架构-设计模式[下篇]

中篇

      11、系统架构师-基础到企业应用架构-企业应用架构

      12、系统架构师-基础到企业应用架构-分层[上篇]

      13、系统架构师-基础到企业应用架构-分层[中篇]

      14、系统架构师-基础到企业应用架构-分层[下篇]

      15、系统架构师-基础到企业应用架构-表现层

      16、系统架构师-基础到企业应用架构-服务层

      17、系统架构师-基础到企业应用架构-业务逻辑层

      18、系统架构师-基础到企业应用架构-数据访问层

      19、系统架构师-基础到企业应用架构-组件服务

      20、系统架构师-基础到企业应用架构-安全机制

后篇

      21、单机应用、客户端/服务器、多服务、企业数据总线全解析

      22、系统架构师-基础到企业应用架构-单机应用(实例及demo)

      23、系统架构师-基础到企业应用架构-客户端/服务器(实例及demo)

      24、系统架构师-基础到企业应用架构-多服务(实例及demo)

      25、系统架构师-基础到企业应用架构-企业数据总线(实例及demo)

      26、系统架构师-基础到企业应用架构-性能优化(架构瓶颈)

      27、系统架构师-基础到企业应用架构-完整的架构方案实例[上篇]

      28、系统架构师-基础到企业应用架构-完整的架构方案实例[中篇]

      29、系统架构师-基础到企业应用架构-完整的架构方案实例[下篇]

      30、系统架构师-基础到企业应用架构-总结及后续

七、下篇预告。

         下一篇中我们将会讲述:简单讲述其他的UML建模图,并且结合B2C实例,详细分析B2C系统应该具有的功能模块。及每个模块通过不同的建模图形的表示方

法,及如何在功能分析时使用恰当的建模图。

后语

      希望看完本章的朋友可以从本篇中学到相应的UML建模知识,懂的人可以巩固下UML知识,本篇希望能够抛砖引玉,希望大家能够多提出宝贵意见。由于是本人

平时工作中的理解与总结,不足之处再所难免,还请大家批评指出!如果您有什么意见或建议,请多多提出!大家的支持就是我的最大动力!

作者:hegezhou 发表于2011/9/10 12:25:27 原文链接
阅读:1095 评论:0 查看评论

系统架构师-基础到企业应用架构-系统建模[下篇]

$
0
0

一、上章回顾

       上一篇:系统架构师-基础到企业应用架构-系统建模[中篇](下) 中我们主要讲解了部署图、活动图,我们在这里也是参考上篇的形式,这里不再详细介绍。上篇主

要讲解了下面2类建模图:

        image

二、摘要

       本文将讲解其他的几个类型的建模图当然只是简单的讲解,并且将结合B2C电子商城系统进行分析通过使用我们已经讲解的建模图为例。分析系统可划分的子功能

模块,每个功能模块内部的运行步骤等等。

       image image

       上面的2个不同类型的进行划分的建模图,本章将对上述6个建模图进行分别举例讲解。

三、本章内容

       1、上章回顾。

       2、摘要。

       3、本章内容。

       4、结构图。

       5、行为图。

       6、本章总结。

       7、系列进度。

       8、下篇预告。

四、结构图

      1、对象图

        首先、我们闲来讲解对象图。对象图用来描述系统的各个对象在某一时刻的状态。对象和类图一样他们是静态结构图。他们是从实际的或者原型化的场景去表达

的。对象图显示了某一时刻对象与对象的关系。一个对象图可以看作类图的特殊用例,类图中的关系同样适用在对象图中。可以这样理解,对象图就是类图的实例。对

象图是有生命周期的,因此对象图只在某个时间段内存在。

        对象图中的元素在类图中都可以找到,只是把类图中的类元素换成对象即可。而类图中类元素之间的关系,在对象图中同样适用。这里不在复述。如果对类图不

是特别的熟悉,请看这篇文章中的讲解:系统架构师-基础到企业应用架构-系统建模[上篇]

        下面讲解对象图的举例:

        image 这里的对象是指某个类的实例。

        image 这样的格式表示了某个类的实例的格式,冒号“:”后面跟着类名,也就是这里的“父类”。另外还必须加上下划

线。

        对象首先是一个确定,所以一般情况下,对象属性一般把值直接列出来。如下形式:

        image

        对象图中的所有的对象名可以为空,但是为了更好的标识对象图中的对象,不建议这么做,并且如果未指定对象名那么必须指定该对象所属的类格式如下:

        image 没有对象名的对象实例。

        下面以B2C中的订单系统中的新订单的状态为例,讲述下各对象的状态。

        image 这里的关系表示的是组合关系

        上图中的订单信息的状态:订单(新订单)-物流信息(未发货)-支付信息(未支付)-产品状态(产品信息)。

      2、包图

        包图就是由包与包之间的关系组成的。

        包图也是一种静态结构,包可以拥有的元素:

        image

        我想上面的元素大家都是有所了解的,我这里就不一样举例说明了,下面通过一个例子来显示如何使用包图。

        包的访问限制:与我们平时了解的3个访问权限设置关键字用法相同。

        image

       包与包之间的关系:

       a、引入与访问依赖:首先这个关系与平时我们说的类的继承关系是不同的.包括包的访问域不能继承。

       image 用于在一个包中引入另一个包输出的元素,因此A依赖B,包A引入包B中的B方法。B这里的访问权限是公共的。A中的方法是保护的。

       b、泛化关系:       

       image 泛化关系描述了一种继承关系。即基类与特殊类之间的关

系,途中描述的意思是只要是包A出现的位置都可以用包B替换。

      3、组合结构图

        组合结构图:以结构化的方式给出类型的内部结构。组合结构图是一种静态结构,它显示了一个类型内部的成员及成员之间的关系。组合结构图可以这样理解,

就是描述类的内部结构及成员之间的调用关系的建模图。组合结构图用于扑捉类的内部细节,描述了对象如何在某个类中协同工作。

       组合图中其实就是描述类的内部的结果,基本上的元素有:类、对象,其他等,具体的关系请参考类图中的关系。

       组合图实例:

       image 上图显示了产品与产品品牌与产品分类的组合关系。产品品牌与产品分类是关联关系(关联关系可

以是1:N),通过一条直线来链接。如果有不清楚的地方请看类图的相关介绍:系统架构师-基础到企业应用架构-系统建模[上篇]

五、行为图

      1、通信图

        在UML建模中除了顺序图(序列图)可以表示对象之间的交互外,通信图也可以完成通用的描述。一般情况下,二类图可以进行互转。

        首先、我们先来分析下2类图的不同。

       image

        我们还是先来看下通信图中的元素:

       image

        上图中的主要组成元素是对象。对象之间的关系,通过链接来完成。然后通过一个带有实体三角形的线段指向要发送消息的对象。

        下面来解释下对象之间的关系。

        image

        image 还有就是消息给自己发送的特殊消息。

        返回消息的类型:

        image

        下面我们来简单举例如何说明:

        image 上图中简单描述了发送邮件的过程。我们可以看出通信图相比顺序图更注重对象之间的

链接关系。我们通过通信图能够知道一个系统中的某个流程中各对象直接的链接关系及传递的完整信息传递过程。

        首先、我们闲来讲解对象图。对象图用来描述系统的各个对象在某一时刻的状态。

      2、时间图

        时间图:主要用来描述一段时间内对象的行为(状态的变化,执行的动作等等)。主要用来模拟即时系统模型。与对象图类似,不同的是时间图描述的一个时间段,而

对象图描述的一个时间点。对象图关心对象的状态,而时间图关心的是对象的行为。

        image 这里设置了定时器之后,对象的状态将会从A,在定时器时间到达后自动的跳转

到状态B。这里表示的是定时器来控制状态的迁移。

       时间图中支持异步信息,时间图采用垂直图的方式来描述系统的执行顺序。

       时序图等于是在序列图(顺序图上)加上时间的限制就构成了时间图。

       image 从垂直的角度来看,就是说A调用B先于B返回值给A,从时间图上就可以清晰的看出来对象的行

为。 一般情况下我们可以通过序列图来完成相应的描述。除非需要定义一个时间段的对象时才会用到时间图。包括某个对象到某个对象的调用都可以通过时间限制来进

行行为的控制等。

六、本章总结。

        本章中主要简单的讲述了几类UML2.0语言相比UML1.0新增的几类建模图,虽然我们平时可能用的比较少,但是某些特定的领域范围,通过这些图可能更能清晰的

表达抽象模型。

         1、对象图:描述系统在某一时刻的状态。

         2、包图:描述系统中的某个模块的内部组成结构,是由元素及元素之间的关系构成的。

         3、组合结构图:以结构化的方式描述了系统中的某个类型的内部结构。

         4、通信图:描述了对象之间的交互与顺序图不同的是,交互图更关注对象之间的链接及通信。

         5、时间图:描述了在一个时间段内的对象的行为。

        当然具体的建模图如何使用及在实际的项目中如何去应用分析,这才是最主要的目的,当然这就需要理论结合实际来达到学以致用的效果。下一篇,我讲专门的讲

解针对B2C电子商城为例,详细的剖析UML建模的具体应用。

七、系列进度。

     前篇

      1、系统架构师-基础到企业应用架构系列之--开卷有益

      2、系统架构师-基础到企业应用架构-系统建模[上篇]

      3、系统架构师-基础到企业应用架构-系统建模[中篇](上)

      4、系统架构师-基础到企业应用架构-系统建模[中篇](下)

      5、系统架构师-基础到企业应用架构-系统建模[下篇]

      6、系统架构师-基础到企业应用架构-系统设计规范与原则[上篇]

      7、系统架构师-基础到企业应用架构-系统设计规范与原则[下篇]

      8、系统架构师-基础到企业应用架构-设计模式[上篇]

      9、系统架构师-基础到企业应用架构-设计模式[中篇]

      10、系统架构师-基础到企业应用架构-设计模式[下篇]

     中篇

      11、系统架构师-基础到企业应用架构-企业应用架构

      12、系统架构师-基础到企业应用架构-分层[上篇]

      13、系统架构师-基础到企业应用架构-分层[中篇]

      14、系统架构师-基础到企业应用架构-分层[下篇]

      15、系统架构师-基础到企业应用架构-表现层

      16、系统架构师-基础到企业应用架构-服务层

      17、系统架构师-基础到企业应用架构-业务逻辑层

      18、系统架构师-基础到企业应用架构-数据访问层

      19、系统架构师-基础到企业应用架构-组件服务

      20、系统架构师-基础到企业应用架构-安全机制

     后篇

      21、单机应用、客户端/服务器、多服务、企业数据总线全解析

      22、系统架构师-基础到企业应用架构-单机应用(实例及demo)

      23、系统架构师-基础到企业应用架构-客户端/服务器(实例及demo)

      24、系统架构师-基础到企业应用架构-多服务(实例及demo)

      25、系统架构师-基础到企业应用架构-企业数据总线(实例及demo)

      26、系统架构师-基础到企业应用架构-性能优化(架构瓶颈)

      27、系统架构师-基础到企业应用架构-完整的架构方案实例[上篇]

      28、系统架构师-基础到企业应用架构-完整的架构方案实例[中篇]

      29、系统架构师-基础到企业应用架构-完整的架构方案实例[下篇]

      30、系统架构师-基础到企业应用架构-总结及后续

八、下篇预告。

       下一篇将会已我比较熟悉的B2C电子商城来深入的剖析,如何使用UML建模工具去分析一个系统及如何分析一个模块的流程,包括部署等等。通过我们已经讲过的

UML建模图形来结合实例来讲解。如果大家有好的意见和建议可以及时反馈,谢谢您的宝贵意见。

后语

       希望看完本章的朋友可以从本篇中学到相应的UML建模知识,懂的人可以巩固下UML知识,本篇希望能够抛砖引玉,希望大家能够多提出宝贵意见。由于是本人

平时工作中的理解与总结,不足之处再所难免,还请大家批评指出!如果您有什么意见或建议,请多多提出!大家的支持就是我的最大动力!

作者:hegezhou 发表于2011/9/10 12:26:08 原文链接
阅读:1481 评论:0 查看评论

老子的软件之道 - 道篇 24 设计师守则

$
0
0
摘要:老子哲学 道德经 软件哲学、软件之道               参阅:  消灭人狼  软件的十大命题 编程规则  

      圣人曰:企者不立;跨者不行。自见者不明;自是者不彰。自伐者无功;自矜者不长。其在道也曰∶馀食赘形。物或恶之,故有道者不处。

      “踮起脚跟,想高人一头,但你很难站稳、很难持久。将两腿使劲跨开想超有别人,但反而无法行走。”圣人用这样简单的例子告诉我们一个深刻的道理:实事求是,按自然规律办事!一切形式的主观的、激进的行为都是背道而驰的。只有遵循客观规律,脚踏实地,循序渐进,具有诚心和恒心,才能达到目的。

      还记得3.4大师风范中圣人关于“自见、自是、自伐、自矜”的论述吗?本节作为守则,要求设计师摒弃如下不良行为:

      固执己见,容易导致不能接受正确观点,因此对事物的认识会出现偏门,不利于综合多方观点搞清事物本质;

      自以为是,认为自己的观点和做法总是正确,从不听取他人的意见和建议;过分主观、不虚心。这必然会导致一叶障目,事物的本源就难以彰显,更得不到多数人的配合和支持。

      自我夸耀,是名利之心的膨胀和表现,这样会受到大家的鄙视,因此无法获得成功;

      自高自大,是骄傲自满的表现,这样的人就无法进步了,也就不可能取得新的成就。

      以上行为都是多余的、无用的,更是有害的和令人厌恶的,遵循软件之道的设计师是绝不会有类似行为的。

 

      作为软件设计师你必须遵守上面的总则,此外你还要遵守如下具体规则,这样你才能逐步成长为卓越的设计师。

       1)追本求源;深入研究涉及的业务领域,把握它稳定、本质的逻辑和流程,这是良好设计的基础;不要被表面现象蒙蔽,面向功能的设计必然是平庸的设计!不能完成具体功能要求的设计,则是失败的设计!就如国画大师白石老人所云:“太似则媚俗,不似则欺世”,大道相通啊!

       2)抽象;必须对该领域内的概念、数据、功能等进行反复认真的综合分析,并抽象出应用领域稳定的业务模型,对业务领域的本质抽象是卓越设计的关键。

       3)追求完美、精益求精;少于三个方案的设计就不是设计!低于五次修改的设计一定不是一个优秀的设计

       4)不断学习实践,勇于批判和质疑;学习、实践、体会、思考、批判、总结、再实践,“批评性实践”是设计师的可贵精神。

       5)热爱设计,追求卓越;建立高远的信念;设计给你带来快乐,设计使你的生命更丰富,设计可以改变世界。

作者:xabcdjon 发表于2011/9/10 19:07:13 原文链接
阅读:22764 评论:4 查看评论

老子的软件之道 - 道篇 25 道为何物

$
0
0
 摘要:老子哲学 道德经 软件哲学、软件之道               参阅:  消灭人狼  软件的十大命题 编程规则 

      圣人曰:有物混成先天地生。寂兮寥兮独立不改,周行而不殆,可以为天下母。吾不知其名,强字之曰道。强为之名曰大。大曰逝,逝曰远,远曰反。故道大、天大、地大、王亦大。域中有四大,而王居其一焉。人法地,地法天,天法道,道法自然。 

       这是“道德经”的第25篇,到此为止“道”到底为何物?我们仍然不清楚,这也是“道”难于表述的原因,老子在全书中有三篇具体描述“道”的文章,但也很难对它进行全面的表述,“道可道,非常道”啊。需要反复通读全文才能有些体会。

       本篇阐述的关键有两点,首先老子认为“道”在天地万物生成之前就存在了,我们应感谢东方的先哲,他们没有创造神和宗教,而是建立的以无神论为基础的博大文化体系,使我们能长久地屹立与世界民族之林,而且按当代几位大思想家的说法,拯救目前世界上各种危机的唯一办法就是东方智慧,这句话同样适用于软件领域啊

       其次提出“道法自然”,注意这里自然的意思并非是我们目前自然科学的自然,那时还没大自然的概念;自然就是简单的字面意思,即自己的样子,这句话翻译过来就是:“道就是遵循它自己的样子”,你可能觉得气愤,但我认为这句话非常深刻,事实上一切真理、一切规律都客观地存在着,它就在那里等待我们去认识、感知和掌握;能够认识到这一点是多么重要啊!

       道德经这段文字到底是什么意思?

       软件之道到底是什么呢?

       我会阐述我的观点,也希望听到你的想法…… 

       首先我们来看看老子描述的高度抽象的“道”吧:有一个东西在天地万物之前就已经存在了,它寂静无声,空旷无际;它独立存在,本性如一;它周而复始,循环运转。它是形成世间万物的母体。这是老子的宇宙观,他不知道这东西是什么,勉强称之为“道”,它数量巨大,无穷无尽,逐渐向周围散去,扩撒到无穷远处,远到极限后开始返回。这是老子对道在"有"(物质)这个层面上的描述。实际上目前的物理学研究成果,已接近证明老子宇宙观的正确性—宇宙之初没有任何物质,只有无穷的能量集中在一点,它扩散开去,两秒后氢元素诞生了,然后是氦元素……,经过几十亿万年的演变,宇宙就呈现出目前我们看到的样子,整个宇宙目前仍在向远方扩撒,当扩散到极点,“熵”达到零,此后有两种可能,一是保持永恒的寂寞;二是开始返回。伟大的老子预测是第二种情况,宇宙会“周行而不殆”。参阅:什么是哲学

       世间万物道与天地相比,道大,天与地比,天大,地与人类社会比,地大,人间王法与人的个体比,王法大。因此人要遵循、效法地的规律,地要遵循、效法天的规律,天要遵循、效法道的规律,道则遵循效法它自己。这是从“无”(精神、信息、规律层面)的层面上描述“道”,道代表事物的本质的跟本规律,每种事物都有它的道,我们研究软件之道主要是在这个层面进行研究啊。

 

 

作者:xabcdjon 发表于2011/9/10 20:56:51 原文链接
阅读:25111 评论:4 查看评论

赤手空拳如何成就百万富翁?——网络营销之五(第二招:SEO)

$
0
0

17、什么是次导航?次导航有什么作用?

拉拉:有一个术语叫次导航?感觉看的稀里糊涂的?能不能给我说个明白?

 蒋老师:顾名思义,次导航是相对主导航而言,主导航我们都知道,但有时我们并不能把我们想要关键词出现在主导航,我们常常在首页底部加上次导航。显然,对于主导航位置没有办法设置关键字时,对于我们来说是非常郁闷的事,这个时候次导航给我们起到了很好的替代作用。

拉拉:是不是优化网站时,我们尽可能考虑次导航呢?

蒋老师:也不尽然,如果我们的关键词密度、主导航已经起到了良好的设置,次导航不要也可以,因为次导航让用户体验有时并不友好,有时又想让别人搜到,只能平衡下孰轻孰重。

18、如何确定目标关键词?

拉拉:目标关键词这个不是很简单吗?譬如我的目标关键词就是“婚纱摄影”、“婚纱摄影工作室”,最不济加上“郑州”。

蒋老师:听着是这个理,听听我说之后,你再考虑你确定的是不是最佳的,目标关键词选择是否正确,可是在相当大的程度上决定着你网站的流量,不可掉以轻心。

注意关键词的确定一定要明确你的客户群体,再考虑网络上的用户的需求,然后再来根据搜索引擎搜索的频度来衡量的。绝不能凭想当然坐在那儿拍脑袋确定关键词。以下几点你参考一下:

(1)确定关键词的秘诀是:把你当成网络的搜索者或消费者,而不是网站的管理者。

(2)如果竞争对手做推广比较成功,那么竞争对手选择的关键词也是你可以参考的。

(3)确定的关键词一定是和你的站点高度相关的。太热门的关键词小站或许做不来,但如果是没有流量的关键词,则排第一也是没有意义。

(4)初步确定关键词之后,查看一下这些关键词的频度。最后敲定最终的“目标关键词”。

拉拉:上面说的关键词的频度是不是指这个关键词的搜索量?初选的关键词如何查看频度?

蒋老师:是的,频度就是指的搜索量,也叫百度指数。我们可以通过网址:http://index.baidu.com来查看某一个关键词的频度。

19、如何选择长尾关键词?

拉拉:长尾关键词我已经完全明白了?但是如何选择合适的长尾关键词,还比较迷茫,有没有工具?

蒋老师:拉拉呀,你是干什么都想走捷径啊!

拉拉:那是,牛顿还是站在巨人的肩膀上呢?

蒋老师:这个可没有工具?我就把我的经验告诉你吧,你还要不断地拓展才对。

(1)长尾关键词应该满足的要求:首先,长尾关键词应该与我们的网站内容相关;其次,长尾关键词必须是用户可能的词;第三,用户通过查询来到你的网站,你应该能满足用户的需求,千万不要只做标题党。

(2)选择长尾关键词的方法:首先,可以通过构思与网站内容或者服务相关的关键词;其次,通过分析竞争对手的长尾关键词;第三,进一步,把你想到的关键词,通过百度搜索,在底部都会显示相关搜索,这里往往有很多你可以利用的长尾关键词,而且有一定的搜索量才会形成相关搜索。

 20、如何在网站添加流量统计?

拉拉:师傅领进门,修行在个人,SEO骨子里面的东西是不是就这么多了?

蒋老师:我暂时能够想到的就这么多,总感言犹未尽,等我想起来再补充吧。

拉拉:优化做完了,我怎么才能知道我网站的流量或者关键词的效果呢?

蒋老师:流量统计工具很多,主要功能大同小异,我给你介绍一个CNZZ的“免费网站流量统计”工具吧,网址为:http://www.cnzz.com/

第一步、注册CNZZ;

第二步、登录CNZZ;

第三步、添加站点。

第四步、复制代码

第五步、查看流量

 

21、如何作一名优秀的Seoer?

拉拉:SEO知识点感觉也不是太难?如何才能做一名优秀的Seoer?

蒋老师:呵呵,Seoer这个单词不知道老外认识不认识?不过很符合中国人英语的逻辑。成为优秀的Seoer,感觉还真的不简单!

拉拉:好了好了,蒋老师,知道你很谦虚,但是太谦虚了,会让弟子感觉你是保守呢。

蒋老师:最重要的你把自己当成Boss,无论你是打工仔还是经营决策者,这是至关重要的。以下内容仅供参考!

首先站在网络营运的角度看SEO。在以前我们做SEO,特别侧重于链接,关键词排名,但是近两年来做法完全不一样了,我们面临挑战越来越大,外界各种因素越来越复杂。

现在要把一个网站做好的话,以下三点需进行关注。业务目标,市场需求和竞争态势。业务目标是我们必须关注的,一般来说做SEO会有阶段性的指标,除了考虑基本态势以外,我们还需要了解市场的需求,因为不同的需求有不同的操作方法,也会给我们带来不同的机会,也可以给我们产生一些差异化竞争的方法。从三个维度考虑,我们对SEO的态势形势心里会比较清楚,这个基础之上,我们再进行操作就会比较方便。

搜索引擎营销的三角格局,这个比较简单,网站,访问者,搜索引擎,它们三个之间的关系,网站,访问者和搜索引擎,当我们了解了搜索引擎的三角格局以后,就要了解搜索引擎它有什么样的规则和方法。在了解了它的规则以后,才避免犯错误,特别是对于一个大型的网站来说,首先我们要预防的是风险,而不是目标,因为搜索引擎这个行业,特别是SEO这个行业,我们不可以从头再来,我们首先预防风险。搜索引擎的收录,排序和惩罚,熟悉游戏规则,合理规避风险。

在了解搜索引擎的规则以后,我们接下来需要了解一下访问者他在搜索,检索结果的时候有一些什么样的行为,当访问者通过搜索引擎检索出结果的时候,他的注意力33%在看标题,40%的注意力在看摘要,21%的精力在路径,大家可以思考一下其他5%他们在看什么。在研究了搜索引擎的规则,也研究了访问者的心理行为的变化,我们根据这两者推测出一种合理的模型,为我们的**导航网站,为我们的企业创造收入。

访问者,搜索引擎,对于搜索SEO而言,我们从关键词,外链,内容,代码去考虑,这四个维度。我们了解了SEO的知识体系以后还不够,我们还需要有正确的理念来支撑,我们才能有一种比较合理的操作方式,所以正确理念是第一条,理念是心态。价值观的直接因为我们的操作。

再来谈谈SEO执行力,大家可以看一下,我们了解规则以后,了解我们的支撑体系,也了解访问者的心理,有了这些,我们网站的效益能不能出来,还不一定,包括我们有最优秀的SEO的策略,也不见得,必须要有比较强的执行力。影响力,判断力,驱动力、无授权领导力。影响力是施加自己的影响,说服他人和自己合作,我们讨论合作,如果你不能影响他人,别人不能跟你合作,你再好的策略都是没有用的。我们有了判断力,影响力以后,接下来我们需要达成目标,这就是驱动力。驱动力的特征就是我们需要有结果,导向,不满足于现状。无授权领导力,在很多大型网站里面,有很多事情是没有授权的,没有人家授权的时候,怎么办,我们需要作为一个成功的SEO人,即使没有明确的授权,我们也应该通过影响力,判断力,驱动力,以及沟通能力,达成我们的目标。

接下来回到我们的日常工作,每一天我们应该怎么办,做为一个SEO人,每天思考从哪些出发点,从哪个角度。首先是思考,我们要制订合理的计划,网站空间购买有效的计划,计划制订出来以后,我们需要分配任务,当然在分配任务的时候也包括资源的分配,包括一些对风险的控制。把任务分布下去以后,接下来需要辅导我们的同事和团队,一起来达成目标。在辅导的过程中,我们有些阶段性的目标和文件需要签署,目标达成了没有,然后确定,签署文件。做一个SEO人应该从这五个维度考虑,首先最重要的还是思考。

我们制订计划和任务也有了,这个项目能不能做好,我们还需要去寻求最佳平衡,因为有些风险是不可预知的,我们需要在发起一个项目的时候,我们的SEO工作,是一个一个项目发起的,不像比较小的网站那么容易操作,所以我们发起取得一个项目的时候,首先要建立它的范围,多长时间完成,需要多少成本,花多少人力,人员配置,资金支持,包括资源购买等等。还有达成什么样的质量,这些都有的时候我们还要识别风险,风险的识别的控制,转化。

做为一名优秀SEO人,要想成功,以上几点我们需要理解并运用到实际中,首先通过改变我们的内在因素来影响外在,首先是见识,包括我们的行业知识,我们的专业知识,这个行业整个的变化等等,这是我们的见识水平需要不停的提高。第二,我们的策略,我们需要好的策略,必须基于现有的资源基础去考虑。第三个就是性格,在一个团队里面有不同的人,性格都不一样,我们要考虑互补。当我们见识、策略、性格都比较完善的时候,我们要不停的增加积累我们的资源,我们有了资源,机会来了我们就能够抓住。  

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

拉拉:SEO是不是到此结束了。

蒋老师:没有,对于你来说,不是结束反而是刚刚起航!最重要的是,你眼里什么时候没有了SEO你才成为真正的SEO高手!

作者:jianghuiquan 发表于2011/9/11 20:26:14 原文链接
阅读:1876 评论:0 查看评论

赤手空拳如何成就百万富翁?——网络营销之六(第三招:博客营销)

$
0
0

三个月后,拉拉打电话告诉我网站开单了……

三个月又半月,拉拉再次打电话告诉我她这半个月网站开了10单……

六个月后,拉拉再次约我到了迪欧咖啡馆,告诉了我一个所谓她的“天大的好消息:网上的业务订单全面超过了线下的业务!”。

拉拉:都不知道怎么谢你了,蒋老师,能不能正式聘请你作为我们的商业顾问!

蒋老师:那就是顾上就问问了。

拉拉:不,这是我和孙总达成的协议,你仍然负责我们网络营销的战略指导工作,我们具体实施,您时间自由,和以前一样!对于以前呢?送您这台苹果笔记本以示心意,以后呢?按我们纯利润的10%作为您的酬劳。

蒋老师:容我想想,我经常当免费顾问,这样无拘无束!

拉拉:就别推辞了。

 

1、有没有博客营销成功的例子?

拉拉:到目前为止,我对博客的感觉除了SEO用于和企业网站做外链之外,实在不知道如何与网络营销紧密联系在一起。有没有成功的例子?

蒋老师:博客营销成功的例子太多了,你可百度一下“健康24小时加油站”,请输入网址或者从搜索结果中单击“24小时健康加油站_新浪博客”。

浏览网址:http://blog.sina.com.cn/jiankangjiayouzhan

 

 

以上我们看到搜索结果是一个系列,我们看看这个博客的博主合作伙伴,凭借你商业敏锐的眼光,你一定能够猜出来博客的商业价值。博主整个博客就是围绕“健康”这个大主题,做的非常成功。

拉拉:想不到博客也可以做的如此成功!

蒋老师:只有想不到的,没有做不到的!

拉拉:哎,我这自诩营销人怎么如此不开窍呢?!

 

2、博客有新浪、网易、百度空间、QQ空间等等,是每个都建还是只建1个?

拉拉:蒋老师,不说国外,即使国内也有众多博客提供商供我们选择,譬如新浪、网易、百度空间和QQ空间等等,他们之间有什么区别?是我申请一堆呢还是只做一个呢?

蒋老师:实际上博客只是一个工具而已,用这几个哪个都可以!如果非要有所选择的话:新浪偏重于投资与IT、QQ空间则具有较大的大学生基础、百度空间则由于是百度的产品,可能搜索具有天生的优越性。

我认为最好先扎根于一个平台进行精耕细作,尤其是前期不建议在多个平台做,这是因为真正的去熟悉一些群体,形成稳定关系,

是需要时间去进行有效的交流和互动的。当然如果从SEO角度打算通过博客优化主站,则可能多建几个也有好处,但有维护成本。

 

3、博客对企业的营销价值有哪些?

拉拉:那么,博客对企业的营销价值如何呢?

蒋老师:我们知道美国打仗,都是海陆空三军,博客你可以认为三军中的一支劲旅,配合主场很容易打赢一场阻击战。主要有以下几个方面:

(1)可以直接带来潜在用户:无论我们是使用新浪还是网易,这些网站往往拥有大量的用户群体,有价值的博客内容会吸引大量潜在用户浏览,从而达到向潜在用户传递营销信息的目的。

(2)通过软文巧妙导入企业产品信息:在博客中介绍产品相关知识,不经意中可以导入企业网站的产品或者在线活动,达到网站推广的目的。

(3)博客比企业网站更容易获得搜索引擎青睐:一般来说,访问量较大的博客网站比企业网站的搜索引擎友好性要好,用户通过搜索引擎发现博客内容比企业网站内容更容易。

(4)博客文章增加企业网站的外链:提高企业的外链数量,使企业网站获得更好的排名打下基础。

 

4、建立博客应该持什么样的心态?应该注意哪些事项?

拉拉:蒋老师,建立博客容易,坚持维护难,总会为自己找理由懈怠管理,如何克服?

蒋老师:说得很好,我认为要沉下心来,耐得住寂寞,需精心耕耘,细心打理。十年磨一剑,冰冻三尺非一日之寒。与我们爬山一样,拾阶而上,想象一下成功的喜悦和一览众山小会督促你不断地前进!

拉拉:有什么要注意的吗?

蒋老师:博客营销作为企业营销航母的一个重要组成部分,不可像土匪一样没有章法,随性情而为。注意以下两点:

(1)需要有战略规划:需要有一个明确的核心主题和战略规划,并围绕这个核心主题去写作和这个主题有关的真实故事,努力改进自己的博客技巧,让自己变得更有影响力。

(2)避免流于形式,没有实效内容:如果你的博客没有太多内容,或东拼西凑,这样的博客不会有太大的价值,不太会吸引访问者,甚至会严重影响企业品牌和形象,有不如无!正确的做法应该是进行精心的编辑,将优秀的内容、行业新闻信息、行业发展动态、行业最新研究动向、企业研究课题成果等同行关心的内容进行分类和组合,使企业博客成为一个优秀的信息平台。这样就会不断吸引同行或想了解相关信息的人来访问,并不断扩大影响力,从而达到传播的效果。

(3)避免商业味太浓:尽管在自己的博客上发布广告,不会被别人删除,但是客户如果惹不起你,还是躲得起的,故而不要生硬的发布广告,要结合博文,让你的粉丝发现不经意间你为他们提供了一份无私的帮助。

(4)全员参与禁忌:博客的成本低廉,全民动员,全民战斗,虽然能够快速形成一定的规模效应,企业就会迅速提高知名度。但是如果没有系统指导,对产品理解不够深刻或者偏差较大时,反而会形成相反的宣传效果,所以全员参与的前提是大家对产品的认识已经统一,否则博客就是双刃剑!

(5)坚持是最重要的:需要有长期坚持的毅力,这是最重要的,因为博客不是短期内就可以马上为你带来效益的,而且也是一项很艰辛的工作,需要做整体的博客规划,要坚持更新文章,还要学会传播、互动,让自己的品牌和影响力传播的更远。最终目的,需要的是一群忠诚的读者(也是未来潜在的客户),一群规模庞大,有影响力,并且愿意听你讲故事的群体。

作者:jianghuiquan 发表于2011/9/11 20:28:54 原文链接
阅读:2138 评论:0 查看评论

赤手空拳如何成就百万富翁?——网络营销之七(第四招:百度文库+QQ群)

$
0
0

  百度文库(wenku.baidu.com)是供网友在线分享文档的开放平台,于2009年11月12日上线。在这里,用户可以在线阅读和下载涉及课件,习题,考试题库,论文报告,专业资料,各类公文模板。

 

  豆丁网(www.docin.com)是一个专业的社会化阅读分享平台及文档内容营销平台。自2007年创立以来,经过四年的运营,豆丁网已经成功跻身互联网全球500强,成为文档分享领域的知名平台之一。目前,豆丁网拥有世界最大的中文文档库,现有文档超过1亿份,覆盖商业、办公、教育、财经、实用信息等各领域。

 

  QQ群是腾讯公司推出的多人聊天交流服务,群主在创建群以后,可以邀请朋友或者有共同兴趣爱好的人到一个群里面聊天。在群内除了聊天,腾讯还提供了群空间服务,在群空间中,用户可以使用群BBS、相册、共享文件等多种方式进行交流。QQ群的理念是群聚精彩,共享盛世。

 

1、百度文库(豆丁)的文档会不会影响主站的长尾流量?

  拉拉:百度文库和豆丁我都用过,有时查资料不经意间都会发现来自文库和豆丁,用这个做网络营销,是不是可以把长尾关键词形成一篇软文,让浏览者从知识中“润物细 无声”的做了一个软广告。

  蒋老师:是的,文库和豆丁收录非常快,排名也非常好。这是百度文库和豆丁的优势,缺点是百度文库文档如果和主站长尾关键词相同,会影响主站长尾的流量,但我们目的是为了产生销售,如果文库和豆丁能带来销售,损失一些流量还是很值得的。对于新站,即使做了100%的原创内容,长尾关键词排名也不是很好,这样的站点做百度文库更加有优势,但对于权重较高的老站而言,可能需要根据自身的实际情况,斟酌利弊,考虑下应当怎么操作。

 

2、为什么采用QQ群的方式

  很多网站都有在线的客服系统,本来是方便潜在客户方便交流,但是相当多的网站都想强行让你去“被沟通”,自然用户体验非常糟糕,让人生厌;反过来,对于经营者,哪个都希望让自己有机会发言,至少把自认为的“好产品”介绍给客户,如果连介绍都没有机会,如何可能产生购买呢?这有点像销售新手。

  人与人之间什么时候愿意交流?一是有共同的兴趣与话题;二是求助解决问题,有人乐意回答。

  而潜在的用户在文库(或豆丁)可能会很认同你文档的内容,但不会浏览你的网站,这时候你的在线客服系统,就不可能起到作用;即使浏览了你的网站,会不会让他们像躲避“保险公司业务员”那样躲避你的在线客服系统也是问题。

  所以在文档中加入QQ群,这样就提供了一个交流的平台,可能会更方便用户进行相关的问题沟通,尤其是技术问题,很多人都喜欢到群里和大家一起讨论,而不是选择客服系统,因为客服系统可能比较有针对性,如果别人到你的网站,可能不方便咨询其他品牌的问题,但qq群拥有更好的开放性。

 

【案例三】跟我学编程网站的无意推广

  有一段时间,我一天接到几十个加群的请求,我感到甚是奇怪,因为我没有在什么地方刻意做过软文和广告,后来问的时候他们是看了一篇“如何学编程”文章,原来如斯。这只是一篇在普通不过的文章,也仅仅是放在了我的QQ空间而已。

  后来我查询了一下百度“如何学编程”,发现了原因,是被大量转载,而在那一时段产生了峰涌。这是我的无意之作,如果你是有意而为之,是不是很可观。

  以下为部分搜索结果截图,这一篇文章搜索有几页之多。

 

3、百度文库(豆丁)有没有时限性?

  拉拉:是不是一篇文章在百库文库(豆丁)一放就一劳永逸了呢?

  蒋老师:显然不是,譬如上面这篇“如何学编程”有一段时间一直排在第一位,后来搜索很靠后,加入群的人数明显减少了;后来又多了,我查了一下,文库又有了,但是发布者已经不是原来的那位了。我发现这两位贡献者都要“分”,即使如此,还是有不少的下载量。

  这就意味着,如果你是网站的经营者:第一、那么最好不要“分”,这样影响文章的有效传播;第二、可以定期在文库重新提交。(这一条,真的不好,会形成文库垃圾,但对于推广则有利)。

 

4、如何准备?

  拉拉:如何准备呢?

  蒋老师:准备工作主要包括,获取长尾关键词、建立word水印模板以及宣传图片、建立QQ群、以及百度文库文档简介的制作。

  (1)获取长尾关键词:这个不用说了,SEO部分已经讲的很清楚了;

  (2)如何去百度文库中插入一些外链和广告

  ① 整理出一批跟本行业相关的文档,如果此文档在百度文库中已经存在,你可以考虑换个标题。

  ② 把标题弄出来以后,到百度指数里面查询一下指数,最好是关键词有指数。这样还会有一些其他的展示机会。

  ③ 调整文档的相关格式,条理清楚。

  ④ 给文档加上相关的外链,可以是图片广告或者是页眉的了解等都可以。

  ⑤ 多拥有几个账号,有一两个高级点的账号即可,其他账号都维持在3级左右。

 

5、有没有注意事项?

  ①文档简介:要特别注重百度文档的简介填写,其实这是你的文章被搜索的时候出现在百度结果中的重要内容。这就跟我们网站的摘要是一样的。

  ② 文档标题: 文档的标题最好能多用陈诉语句或者反问句,比如如何,怎么等。标题要客观,可读性强一点,这样浏览者才会从众多的文档中选中你的文档。

  ③ 文档字数:文档尽量字数多一些,以5-10页最好,太短的文档百度会和核定为文档质量不高或者可读性差,从而不给通过。

  ④ 文档字号:如果你的文档里面放了一些动态或者静态的图片广告,在文库不下载的时候不能浏览。这样你就需要把你的文档的字体变小一点。比如9号字,同时不要给文档设置财富值,这样读者大都会选择把文档下载下来,你的展示目的也就达到了。

  ⑤ 文档格式:通常通过的概率从大到小依次为:PDF格式—>WORD格式—>PPT格式—>TXT格式。

  ⑥ 文档分类:如果是一篇非推广的文档,我觉得你不放对分类也有可能通过,但是如果是推广类的文档,为了提高通过率,还是需要按相关分类放好。否则通过率低,直接影响你的账号。

 

6、能做外链吗?

  拉拉:博客我们可以做外链,文库(豆丁)可以吗?有什么技巧?

  蒋老师:也可以的,技巧如下:

  ① 页眉或者页脚处写上链接,能得到直接展示的机会;

  ② 在文章里面做内部链接,就是选中锚文本,给锚文本加链接;

  ③ 文章内容中直接带出链接,比如:详情可以访问www.genwoxue.com获得。

 

7、能插入广告吗?

  拉拉:我可不可以直接插入广告?

  蒋老师:最好不好,不过艺术一点的广告也未尝不可。

 

作者:jianghuiquan 发表于2011/9/11 20:36:11 原文链接
阅读:2070 评论:0 查看评论

RMAN简明教程之四——RMAN备份详解

$
0
0

       RMAN可以用来备份主备用数据库,如表空间、数据文件、归档日志、控制文件、服务器文件与备份集,下面我们分情况进行试验。

一、文件拷贝
      原始文件的拷贝,有点类似于OS热备份,可以拷贝整个数据文件到另外一个地点,但是结果仅仅只能写入到硬盘,而且单独的文件是分开的。
数据文件拷贝实例:
run {
allocate channel d1 type disk;
allocate channel d2 type disk;
allocate channel d3 type disk;
copy # first
datafile 1 to '$HOME/prd1.dbf',
datafile 2 to '$HOME/prd2.dbf';
copy # second
datafile 3 to '$HOME/prd3.dbf';
sql 'alter system archive log current';
}
二、备份与备份集 
       RMAN 的常规备份是产生只有 RMAN 才能识别的备份集,所以,除了 copy 命令之外的其他备份,都是RMAN 产生的备份集以及对应的备份片。
如下是备份数据库的实例,它开启两个通道,将数据库备份到磁带:
run {
allocate channel t1 type 'SBT_TAPE';
allocate channel t2 type 'SBT_TAPE';
backup
filesperset 2
format 'df_%t_%s_%p'
database;
}
      RMAN 也可以实现多个镜相的备份:
Run{
allocate channel d1 type disk;
allocate channel d2 type disk;
allocate channel d3 type disk;
SET BACKUP COPIES 3;
BACKUP DATAFILE 7 FORMAT '/tmp/%U','?/oradata/%U','?/%U';
};
      以下是常见的备份归档的例子:

RMAN>sql ‘alter system archive log current’;
RMAN>backup archivelog all delete input;
RMAN> backup archivelog from time '01-jan-00' until time '30-jun-00';
RMAN> backup archivelog like 'oracle/arc/dest/log%';   10
RMAN> backup archivelog all;
RMAN> backup archivelog from logseq 20 until logseq 50 thread 1;
RMAN> backup archivelog from scn 1 until scn 9999;
       在RAC环境中,因为数据库是共享的,所以可以连接到一个实例就可以备份整个数据库,但是,因为归档日志可以备份在本地,所以 RAC归档日志的备份就变的复杂一些,我们可以通过连接到两个实例的通道来备份两个实例的归档日志。
run{
ALLOCATE CHANNEL node_c1 DEVICE TYPE DISK CONNECT
'sys/pass@dbin1';
ALLOCATE CHANNEL node_c2 DEVICE TYPE DISK CONNECT
'sys/pass@dbin2';
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
backup archivelog all delete input format '/u01/dbbak/%U_%s.bak' filesperset = 5;
}
三、常见备份参数
1、Keep参数可以长期的保持特殊的备份或者拷贝,让它们不受默认备份保持策略的影响,如
RMAN> BACKUP DATABASE KEEP UNTIL TIME
2> "to_date('31-MAR-2002','DD_MM_YYYY)" nologs;
RMAN> BACKUP TABLESPACE SAMPLE KEEP FOREVER NOLOGS;
其中 NOLOGS 表示可以不保留该备份以来的归档日志,默认是 LOGS,表示保留该备份以来的参数,如果想让该备份永久有效,可以使用 FOREVER参数。
2、Tag参数指明了备份集的标志,可以达到 30 个字符长度,如
RMAN> BACKUP DEVICE TYPE DISK DATAFILE 1 TAG
2> "wkly_bkup";
在 Oracle  92 版本以后,RMAN 自动提供一个 TAG,格式为 TAGYYYYMMDDTHHMMSS如TAG20020208T133437,通过备份标志 TAG,也可以很方便的从备份集进行恢复,如Restore database from tag=’tag name’
四、增量备份
       在说明增量备份之前, 首先要理解差异增量与累计增量备份,以及增量备份的备份与恢复原理。差异增量,是默认的增量备份方式。 
差异增量是备份上级或同级备份以来变化的块,累计增量是备份上级备份以来变化的块。累计增量增加了备份的时间,但是因为恢复的时候,需要从更少的备份集中恢复数据,所以,为了减少恢复的时候,累计增量备份将比差异增量备份更有效。 
       不管怎么样增量备份,在 Oracle 版本 9 中,还是需要比较数据库中全部的数据块,这个过程其实也是一个漫长的过程,而且由于增量备份形成多个不同的备份集,使得恢复变的更加不可靠而且速度慢,所以增量备份在版本 9 中仍然是鸡肋,除非是很大型的数据仓库系统,没有必要选择增量备份。
       Oracle 版本10在增量备份上做了很大的改进,可以使增量备份变成真正意义的增量,因为通过特有的增量日志,使得 RMAN 没有必要去比较数据库的每一个数据块,当然,代价就是日志的IO 与磁盘空间付出,完全还是不适合OLTP系统。另外,版本10 通过备份的合并,使增量备份的结果可以合并在一起,而完全的减少了恢复时间。
增量备份都需要一个基础,比如0 级备份就是所有增量的基础备份,0级备份与全备份的不同就是0级备份可以作为其它增量备份的基础备份而全备份是不可以的, 是否选择增量备份作为你的备份策略,最终,需要你自己有一个清醒的认识。
以下是零级备份的例子
backup incremental level 0 database;
一级差异增量例子
backup incremental level 1 database;
一级累计增量例子
backup incremental level 1 cumulative database;   12
五、备份检查
      我们可以通过Validate命令来检查是否能备份,如数据文件是否存在,是否存在坏块不能被备份,如:
BACKUP VALIDATE DATABASE;
BACKUP VALIDATE DATABASE ARCHIVELOG ALL;
六、重新启动备份
       对于异常结束了的备份,很多人可能不想再重新开始备份了吧,特别是备份到 90%以上,因为异常原因终止了该备份,那怎么办呢?RMAN 提供一个重新开始备份的方法,通过简单的命令,你就可以只备份那不到10%的数据了。
RMAN> BACKUP NOT BACKED UP SINCE TIME 'SYSDATE-14'
2> DATABASE PLUS ARCHIVELOG;
七、RMAN 动态性能视图
以下是与 RMAN 备份有关系的一些动态性能视图,信息是从控制文件中获取的。
V$ARCHIVED_LOG
V$BACKUP_CORRUPTION
V$COPY_CORRUPTION
V$BACKUP_DATAFILE
V$BACKUP_REDOLOG
V$BACKUP_SET
V$BACKUP_PIECE
V$BACKUP_DEVICE
V$CONTROLFILE_RECORD_SECTION
这里还有一个视图,可以大致的监控到 RMAN备份进行的程度。如通过如下的 SQL脚本,
将获得备份的进度。
SQL> SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,
2 ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE"
3 FROM V$SESSION_LONGOPS
4 WHERE OPNAME LIKE 'RMAN%'
5 AND OPNAME NOT LIKE '%aggregate%'
6 AND TOTALWORK != 0
7 AND SOFAR <> TOTALWORK;
SID SERIAL# CONTEXT SOFAR    TOTAL   WORK %_COMPLETE
---    -------      -------        -------     ---------    ----------
13   75          1           9470      15360    61.65
12   81          1           15871    28160    56.36 
 Oracle社区PDM中文网:http://www.pdmcn.com/bbs

 Oracle 专家QQ群:60632593、60618621

 Oracle技术资料:《Oracle 9i RMAN参考使用手册》、《ORACLE10G备份与恢复》、《Oracle Database 10gRMAN备份与恢复

 

作者:newhappy2008 发表于2011/9/12 7:48:00 原文链接
阅读:4095 评论:0 查看评论

RMAN简明教程之五——RMAN还原和恢复

$
0
0

 一、常规还原与恢复
      RMAN 的整个恢复过程可以分为还原(restore)与恢复(recover) ,他们在含义上是有很大差别的,一个是指物理意义的文件的还原与拷贝,一个是指数据库一致性的恢复,所以,正确的理解这两个概念,有助于正确的恢复数据库。
对于RMAN 的备份,还原操作只能是在用 RMAN 或 RMAN 包来做了,对于恢复操作则是很灵活的了,除了 RMAN,也可以在 SQLPLUS 中完成。还原与恢复一个数据库,可以用如下两个简单的命令完成
RMAN>restore database;
RMAN>recover database;
恢复一个表空间,或者恢复一个数据文件,相对比较恢复数据库可能花费更少的时间。
RMAN> SQL "ALTER TABLESPACE tools OFFLINE IMMEDIATE";
RMAN> RESTORE TABLESPACE tools;
RMAN> RECOVER TABLESPACE tools;
RMAN> SQL "ALTER TABLESPACE tools ONLINE";
对于数据库与数据文件,可以从指定的tag恢复
RMAN>RESTORE DATAFILE 1 FROM TAG=’tag name’
对于时间点恢复等不完全恢复,可能只有完全的还原数据库了。
RMAN> RUN {
2> ALLOCATE CHANNEL c1 TYPE DISK;
3> ALLOCATE CHANNEL c2 TYPE DISK;
4> SET UNTIL TIME = '2002-12-09:11:44:00';
5> RESTORE DATABASE;
6> RECOVER DATABASE;
7> ALTER DATABASE OPEN RESETLOGS; }
不完全恢复在 RMAN 中还可以用基于日志的恢复
RMAN> RUN {
2> SET UNTIL SEQUENCE 120 THREAD 1;
3> ALTER DATABASE MOUNT;
4> RESTORE DATABASE;
5> RECOVER DATABASE; # recovers through log 119
6> ALTER DATABASE OPEN RESESTLOGS;
7> }
如果有可能,也可以恢复数据文件到一个新的位置
SET NEWNAME FOR datafile
'/u01/oradata/tools01.dbf' TO '/tmp/tools01.dbf';
RESTORE datafile '/u01/oradata/tools01.dbf';
SWITCH DATAFILE ALL;
除了恢复数据库与数据文件,我们也可以恢复控制文件,需要启动到 nomount 下,用如下
的命令即可   14
Restore controlfile from ‘file name’
Restore controlfile from autobackup
Restore controlfile from tag=‘……’
在正常情况下,不用恢复归档日志,恢复进程会自动寻找所需要的归档日志,当然我们也可以指定恢复到哪里。
SET ARCHIVELOG DESTINATION TO '/u02/tmp_restore';
RESTORE ARCHIVELOG ALL;
如果使用的服务器参数文件(spfile) ,RMAN 可以备份该参数文件,如果发生文件损坏,可以用 RMAN 恢复 spfile 参数文件,在没有参数文件的情况下,用 Rman 的临时参数文件启动数据库到Nomount下,执行如下命令即可
Restore controlfile from autobackup 
Restore controlfile from ‘file name’
二、特殊情况下的恢复
在假定丢失了恢复目录与控制文件,只剩下备份集与备份片,这个时候,可能只能从文件中恢复了。以下是调用dbms_backup_restore包,从文件中恢复的例子。
declare
devtype varchar2(100);
done boolean;
recid number;
stamp number;
fullname varchar2(80);
begin
devtype :=
dbms_backup_restore.deviceallocate('sbt_tape',params=>'ENV=
(NSR_SERVER=backup_server)');
dbms_backup_restore.restoresetdata file;
dbms_backup_restore.restorecontrolfileto(
'first_control_file');
dbms_backup_restore.restorebackuppiece('backup_piece', done);
dbms_backup_restore.copycontrolfile ('first_control_file',
'second_control_file', recid, stamp,fullname);
-- repeat the above copycontrolfile for each control file
end; /
三、还原检查与恢复测试
与备份检查一样,还原操作也可以检查是否能正常restore或者是否该备份集是否有效。如: 
RMAN> RESTORE DATABASE VALIDATE;
RMAN> VALIDATE BACKUPSET 218;
Recover 还可以进行测试,检测恢复的错误,错误信息记载在alert文件中,通过测试,我们可以知道该恢复操作是否能正常完成。   15
SQL>RECOVER TABLESPACE sales TEST;
SQL>RECOVER DATABASE UNTIL CANCEL TEST
四、块级别的恢复
块恢复Block Media Recovery (BMR), 块是恢复的最小单元, 通过块可以减少恢复时间,而且数据文件可以在线。恢复块的时候,必须指定具体的块号,如:
BLOCKRECOVER datafile 6 BLOCK 3;
要恢复的坏块信息可以从报警与跟踪文件,表与索引的分析,DBV 工具或第三方媒体管理工具以及具体的查询语句中获得。产生块损坏的原因一般是间断或随机的 IO 错误或者是内存的块错误。
块的错误信息保存在 V$DATABASE_BLOCK_CORRUPTION,用如下命令恢复该视图中列出的坏块
RMAN> BLOCKRECOVER CORRUPTION LIST
2> RESTORE UNTIL TIME 'sysdate – 10';
备份的坏块信息保存在
V$BACKUP_CORRUPTION
V$COPY_CORRUPTION
可以用如下的命令来恢复坏块。
BLOCKRECOVER datafile 2 BLOCK 12, 13 datafile 7 BLOCK 5, 98, 99 datafile 9 BLOCK 19;
BLOCKRECOVER  TABLESPACE  SYSTEM  DBA  4194404,  4194405  FROM  TAG
"weekly_backup";
BLOCKRECOVER TABLESPACE SYSTEM DBA 4194404, 4194405 RESTORE UNTIL TIME
'SYSDATE-2';
五、数据库复制
可以用RMAN 来进行数据库的复制与克隆,RMAN提供一个专门的命令来完成这个操作。如
CONNECT TARGET
CONNECT AUXILIARY
SYS/aux_pwd@newdb
DUPLICATE TARGET DATABASE TO ndbnewh 
   LOGFILE 
     '?/dbs/log_1.f' SIZE 100M,
     '?/dbs/log_2.f' SIZE 100M 
   SKIP READONLY 
   NOFILENAMECHECK;
在以上的命令执行之前,注意如下几点
1、备份主库上的所有数据文件,控制文件以及备份时与备份后产生的归档日志,并把该备份拷贝到需要复制的机器同样的目录下(如果不是同样的目录,在linux/unix 环境下可以考虑建立一个链接来完成) 。
2、拷贝主数据库的初始化参数文件到复制的机器上,并做相应的修改,如修改数据库名称与实例名称

3、在要复制的机器上创建新的密码文件,并启动复制的数据库到 nomount下。
4、配置主数据库到复制数据库的网络连接或者复制数据库到主数据库的连接。
5、在主数据库或者复制的数据库上运行RMAN,分别连接主数据库与复制数据库实例。
6、运行复制命令,命令将还原所有数据文件,重新创建控制文件,并利用新的参数文件启动恢复数据库到一致状态,最后用resetlog方式打开数据库,创建指定的redolog。
复制命令也可以从磁带上的备份进行复制,并改变数据库名称,也可以改变数据库文件的新的路径以及恢复到以前的时间点, 跳过不需要复制的表空间等, 如一个比较复杂的复制命令: 
RUN
{  
   ALLOCATE AUXILIARY CHANNEL newdb1 DEVICE TYPE sbt; 
   DUPLICATE TARGET DATABASE TO newdb
   DB_FILE_NAME_CONVERT=('/h1/oracle/dbs/trgt/','/h2/oracle/oradata/newdb/')
   UNTIL TIME 'SYSDATE-1'   # specifies incomplete recovery
   SKIP TABLESPACE cmwlite, drsys, example    # skip desired tablespaces
   PFILE = ?/dbs/initNEWDB.ora
   lOGFILE
       GROUP 1 ('?/oradata/newdb/redo01_1.f', 
                  '?/oradata/newdb/redo01_2.f') SIZE 200K, 
       GROUP 2 ('?/oradata/newdb/redo02_1.f', 
                  '?/oradata/newdb/redo02_2.f') SIZE 200K 
       GROUP 3 ('?/oradata/newdb/redo03_1.f',
                  '?/oradata/newdb/redo03_2.f') SIZE 200K REUSE;
}
六、利用 RMAN创建备用数据库
利用 RMAN 创建备用数据库可以用两种办法,一种是常规的 Restore 命令,利用从主数据库拷贝过去的备用控制文件,把备用数据库启动到备用 mount 下,这个时候的备用数据库是没有数据文件的。 然后在备用端, 启动 RMAN命令, 连接该数据库 (与主数据库 DBID一样) ,把从主数据库拷贝过来的RMAN 备份还原出来。最后就与其它方法一样了,进入备用的管理恢复模式。
另外一个办法就是复制命令了,如
DUPLICATE TARGET DATABASE FOR STANDBY NOFILENAMECHECK;
以下详细的介绍了这一个过程。
1、创建备用参数文件与密码文件,启动备用数据库到 nomount下
2、备份主数据库与备用控制文件以及所有归档
RMAN> Backup Database;
RMAN> Backup current controlfile for standby;
RMAN> sql "Alter System Archive Log Current"; 
RMAN> Backup filesperset 10 ArchiveLog all delete input;
3、拷贝所有的备份到备用数据库相同路径下
4、配置主数据库到备用数据库的连接
5、启动RMAN
rman target / auxiliary
sys/change_on_install@STANDBY    17
6,开始创建备用数据库
RMAN> duplicate target database for standby dorecover nofilenamecheck;
整个过程包括了备用控制文件的创建,启动到 Mount 下,参数文件中指定的路径转换与数据文件的还原,归档日志的还原等。
7、最后恢复日志并启动到管理恢复模式下。
SQL> recover standby database; 
SQL> alter database recover managed standby database disconnect;

 Oracle社区PDM中文网:http://www.pdmcn.com/bbs

 Oracle 专家QQ群:60632593、60618621

 Oracle技术资料:《Oracle 9i RMAN参考使用手册》、《ORACLE10G备份与恢复》、《Oracle Database 10gRMAN备份与恢复

 

作者:newhappy2008 发表于2011/9/12 15:52:27 原文链接
阅读:4157 评论:0 查看评论

RMAN简明教程之六——RMAN的管理

$
0
0

 一、Report命令
Report 命令可以检测那些文件需要备份,那些备份能被删除以及那些文件能不能获得的信息,如
报告数据库的所有能备份数据文件对象
Report schema
或者
RMAN> REPORT SCHEMA AT TIME 'SYSDATE-14';
RMAN> REPORT SCHEMA AT SCN 1000;
RMAN> REPORT SCHEMA AT SEQUENCE 100 THREAD 1;
报告需要备份的数据文件
Report need backup [ redundancy | days | incremental n];
报告过期了的数据文件或者不可用的备份与拷贝
Report obsolete [orphan]
报告不能获得或者不能到达的数据文件信息
Report unrecoverable [database]
二、List命令
List命令一般用来查看备份与拷贝信息,如
查看备份信息
List backup
查看备份汇总信息
List backup summary
查看文件拷贝的信息
List copy
查看具体的备份信息
List backup of datafile ‘file name’
list incarnation of database;   18
三、Crosscheck命令
检查磁盘或磁带上的备份或拷贝是否正确,并更新备份或者拷贝的状态。如果不正确,将标记为expired(过期)
Crosscheck backup;
Crosscheck archivelog all;
Delete [noprompt] expired backup命令删除过期备份
也可以用 List来查看相应的报告
LIST EXPIRED BACKUP;
LIST EXPIRED BACKUP SUMMARY; 
四、 Delete 命令
Delete命令可以用来删除指定的备份或者用来删除废弃或者是过期的备份集如删除指定的备份集与备份片
RMAN> DELETE BACKUPPIECE 101;
RMAN> DELETE CONTROLFILECOPY '/tmp/control01.ctl';
RMAN> DELETE BACKUP OF TABLESPACE users DEVICE TYPE sbt;
删除过期或者废弃了的备份
RMAN> DELETE EXPIRED BACKUP;
RMAN> DELETE NOPROMPT OBSOLETE;
RMAN> DELETE OBSOLETE REDUNDANCY = 3;
RMAN> DELETE OBSOLETE RECOVERY WINDOW OF 7 DAYS;
删除指定的备份归档
RMAN> DELETE NOPROMPT ARCHIVELOG UNTIL SEQUENCE = 300;

PDM中文网Oracle社区http://www.pdmcn.com/bbs

 Oracle 专家QQ群:60632593、60618621

 Oracle技术资料:《Oracle 9i RMAN参考使用手册》、《ORACLE10G备份与恢复》、《Oracle Database 10gRMAN备份与恢复

 

作者:newhappy2008 发表于2011/9/12 15:55:55 原文链接
阅读:4000 评论:1 查看评论

RMAN简明教程之七——恢复目录与恢复目录的使用

$
0
0

       Oracle版本9因为控制文件的自动备份,可以很大程度成不需要使用恢复目录,但是使用恢复目录的也有如下好处
·有些命令只被恢复目录支持(对于9i来说,也就是专门操作恢复目录的语句而已)
·能保留更多的历史备份信息
·一个恢复目录能管理与备份多个目标数据库
·如果在9i以前,丢失控制文件而没有恢复目录将是难以恢复的
·如果没有恢复目录,而且发生了结构上的改变,时间点的恢复需要小心操作
·能存储备份与恢复的脚本
      可以看到,主要是可以保留更多的备份信息与方便的管理多个目标数据库,这个在众多目标数据库的情况下,是可以考虑的。  

一、创建恢复目录
      注意,恢复目录不要与目标数据库在同一台机器上,而且大小要求比较小。
SQL> create user RMAN identified by RMAN
2 temporary tablespace TEMP
3 default tablespace RCVCAT
4 quota unlimited on RCVCAT;
SQL> grant recovery_catalog_owner to RMAN;
RMAN> create catalog
RMAN> register database;
恢复目录可以采用如下命令升级与删除
RMAN> UPGRADE CATALOG;
RMAN> DROP CATALOG;
二、恢复目录管理
恢复目录支持如下的命令
{CREATE|UPGRADE|DROP} CATALOG
{CREATE|DELETE|REPLACE|PRINT} SCRIPT
LIST INCARNATION
REGISTER DATABASE
REPORT SCHEMA AT TIME
RESET DATABASE
RESYNC CATALOG
1、Resync命令
Resync可以同步数据库与恢复目录之间的信息,在实际情况下,rman一般可以自动同步。
在如下情况下需要同步
·数据库物理结构的改变
·数据文件增加或者是改变大小
·表空间删除
·回滚段的创建与删除
·每产生10个归档日志
2、Reset  命令
目标数据库resetlogs之后,需要重新设置恢复目录。Reset命令就用来重新设置恢复目录。
三、恢复目录视图
恢复目录本身有一组视图,用于存放目标数据库与备份信息,如恢复目录的相关视图
RC_DATABASE
RC_DATAFILE
RC_STORED_SCRIPT   20
RC_STORED_SCRIPT_LINE
RC_TABLESPACE
可以通过如下命令来查看相关信息
select * from rc_database;
四、存储脚本
存储脚本

RMAN> creata script level0backp{
       backup
       incremental level 0
       format '/u01/db01/backup/%U'
       filesperset 5
       database plus archivelog delete input;
       sql 'alter database archive log current';
       }
执行脚本
RMAN> run {execute script Level0backup;}
更新脚本
RMAN> replace script level0backup{
      ……
       }
删除脚本
RMAN> delete script Level0backup;
查看脚本
RMAN> print script level0backup; 
 
一个实用脚本,包括备份RAC数据库与归档日志的 shell脚本
[oracle@db worksh]$ more rmanback.sh 
#!/bin/sh
#set env
export ORACLE_HOME=/opt/oracle/product/9.2
export ORACLE_SID=db2in1
export NLS_LANG="AMERICAN_AMERICA.zhs16gbk"
export PATH=$PATH:$ORACLE_HOME/bin:/sbin:/usr/sbin
 
echo "-----------------------------start-----------------------------";date
#backup start
$ORACLE_HOME/bin/rman <<EOF
connect target
delete noprompt obsolete;
backup database include current controlfile format '/rmanback/db2/%U_%s.bak' filesperset = 2;
 
run{
ALLOCATE CHANNEL node_c1 DEVICE TYPE DISK CONNECT
'sys/pass@db1in1';
ALLOCATE CHANNEL node_c2 DEVICE TYPE DISK CONNECT
'sys/pass@db2in2';
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
backup archivelog all delete input format '/ rmanback/db2/%U_%s.bak' filesperset = 5;
}
 
list backup;
exit;
EOF
echo "------------------------------end------------------------------";date

 

 

Oracle社区PDM中文网http://www.pdmcn.com/bbs

 Oracle 专家QQ群:60632593、60618621

 Oracle技术资料:《Oracle 9i RMAN参考使用手册》、《ORACLE10G备份与恢复》、《Oracle Database 10gRMAN备份与恢复

作者:newhappy2008 发表于2011/9/12 16:03:23 原文链接
阅读:2162 评论:0 查看评论

webkit在win32下的编译规则(九)

$
0
0

webkit在win32下的编译规则(七)中,曾经说到要专门介绍js binding这部分的,但后面逐渐忘记了,最近有网友提起,特加入js binding这部分的介绍。

首先来说是js engine,js engine是一个解释器。解释器比较直观的就是命令行(cmd.exe),在命令行中,我们输入一行脚本,然后cmd.exe就是解析这段脚本然后执行。同样我们也可以将命令写在bat文件中,然后让cmd.exe执行。js engine与此类似,不同的是它执行js脚本。在命令行输入脚本,相当于js engine里面的执行标签中内嵌的脚本,例如onClick=”javascript:window.alert(1);” ;执行bat脚本,相当于js engine里面的解释运行一个js文件。

为了便于介绍,下面都已JavascriptCore这里面的js engine(SquirrelFish or SquirrelFish Extreme)为准,V8等引擎原理与此类似,只不过具体实现不一样。

在JavascriptCore中,处于主线的函数是:

JSValue JSC::evaluate(ExecState* exec, ScopeChainNode* scopeChain, const SourceCode& source, JSValue thisValue, JSValue* returnedException)

这个函数完成javascript具体的解析和执行,如果不调用这个函数,js engine将什么事也不会做。在webkit中,调用这个函数是webcore的JSMainThreadExecState::evaluate函数。当webkit下载完一个js文件,或者标签中内嵌的js脚本被触发时,JSMainThreadExecState::evaluate就会被调用,从而导致JSC::evaluate被调用。js engine是单线程的,一个页面(或一个window对象)一般配一个js engine,如果一个页面有多个frame,则会有多个js engine,这些js engine在不同的线程中运行。下面是对html进行parse时遇到js脚本后调用JSC::evaluate的堆栈:

     

WebKit_debug.dll!WebCore::JSMainThreadExecState::evaluate(JSC::ExecState * exec, JSC::ScopeChainNode * chain, const JSC::SourceCode & source, JSC::JSValue thisValue, JSC::JSValue * exception)  行 57    C++
>    WebKit_debug.dll!WebCore::ScriptController::evaluateInWorld(const WebCore::ScriptSourceCode & sourceCode, WebCore::DOMWrapperWorld * world)  行 144 + 0x33 字节    C++
     WebKit_debug.dll!WebCore::ScriptController::evaluate(const WebCore::ScriptSourceCode & sourceCode)  行 161 + 0x16 字节    C++
     WebKit_debug.dll!WebCore::ScriptElement::executeScript(const WebCore::ScriptSourceCode & sourceCode)  行 292 + 0x17 字节    C++
     WebKit_debug.dll!WebCore::HTMLScriptRunner::executePendingScriptAndDispatchEvent(WebCore::PendingScript & pendingScript)  行 140    C++
     WebKit_debug.dll!WebCore::HTMLScriptRunner::executeParsingBlockingScript()  行 119    C++
     WebKit_debug.dll!WebCore::HTMLScriptRunner::executeParsingBlockingScripts()  行 196    C++
     WebKit_debug.dll!WebCore::HTMLScriptRunner::executeScriptsWaitingForLoad(WebCore::CachedResource * cachedScript)  行 207    C++
     WebKit_debug.dll!WebCore::HTMLDocumentParser::notifyFinished(WebCore::CachedResource * cachedResource)  行 517 + 0x19 字节    C++
     WebKit_debug.dll!WebCore::CachedResource::checkNotify()  行 151 + 0x13 字节    C++
     WebKit_debug.dll!WebCore::CachedScript::data(WTF::PassRefPtr<WebCore::SharedBuffer> data, bool allDataReceived)  行 105    C++
     WebKit_debug.dll!WebCore::CachedResourceRequest::didFinishLoading(WebCore::SubresourceLoader * loader, double __formal)  行 170    C++
     WebKit_debug.dll!WebCore::SubresourceLoader::didFinishLoading(double finishTime)  行 196 + 0x28 字节    C++
     WebKit_debug.dll!WebCore::ResourceLoader::didFinishLoading(WebCore::ResourceHandle * __formal, double finishTime)  行 472 + 0x18 字节    C++
     WebKit_debug.dll!WebCore::ResourceHandleManager::downloadTimerCallback(WebCore::Timer<WebCore::ResourceHandleManager> * timer)  行 400 + 0x35 字节    C++
     WebKit_debug.dll!WebCore::Timer<WebCore::ResourceHandleManager>::fired()  行 100 + 0x23 字节    C++
     WebKit_debug.dll!WebCore::ThreadTimers::sharedTimerFiredInternal()  行 115 + 0xf 字节    C++
     WebKit_debug.dll!WebCore::ThreadTimers::sharedTimerFired()  行 94    C++
     WebKit_debug.dll!WebCore::TimerWindowWndProc(HWND__ * hWnd, unsigned int message, unsigned int wParam, long lParam)  行 103 + 0x8 字节    C++

JSC::evaluate有5个参数:ExecState* exec表示js engine的运行整体环境,例如全局变量的值;ScopeChainNode* scopeChain表示当前运行Scope Chain,这个和js的闭包(Closure)有关;const SourceCode& source表示js脚本的内容;JSValue thisValue表示这段脚本的this对象;JSValue* returnedException表示脚本执行后的异常信息。

我们可以看一下ScriptController::evaluateInWorld的代码:

ScriptValue ScriptController::evaluateInWorld(const ScriptSourceCode& sourceCode, DOMWrapperWorld* world)
{
    const SourceCode& jsSourceCode = sourceCode.jsSourceCode();
    String sourceURL = ustringToString(jsSourceCode.provider()->url());
    // evaluate code. Returns the JS return value or 0
    // if there was none, an error occurred or the type couldn't be converted.
    // inlineCode is true for <a href="javascript:doSomething()">
    // and false for <script>doSomething()</script>. Check if it has the
    // expected value in all cases.
    // See smart window.open policy for where this is used.
    JSDOMWindowShell* shell = windowShell(world);
    ExecState* exec = shell->window()->globalExec();
    const String* savedSourceURL = m_sourceURL;
    m_sourceURL = &sourceURL;
    JSLock lock(SilenceAssertionsOnly);
    RefPtr<Frame> protect = m_frame;
    InspectorInstrumentationCookie cookie = InspectorInstrumentation::willEvaluateScript(m_frame, sourceURL, sourceCode.startLine());
    JSValue evaluationException;
    exec->globalData().timeoutChecker.start();
    JSValue returnValue = JSMainThreadExecState::evaluate(exec, exec->dynamicGlobalObject()->globalScopeChain(), jsSourceCode, shell, &evaluationException);
    exec->globalData().timeoutChecker.stop();
    InspectorInstrumentation::didEvaluateScript(cookie);
    if (evaluationException) {
        reportException(exec, evaluationException);
        m_sourceURL = savedSourceURL;
        return ScriptValue();
    }
    m_sourceURL = savedSourceURL;
    return ScriptValue(exec->globalData(), returnValue);
}


从中我们可以看到,JSMainThreadExecState::evaluate的exec,scopeChain,thisValue都和JSDOMWindowShell这个对象有关。从JSDOMWindowShell这个名字可以看出,webkit是将js脚本的执行比喻成在shell中输入命令。thisValue为JSDOMWindowShell则表明js脚本最顶层的this为window对象,这也于DOM模型的window对象处于顶端一致了。


在上面的JSDOMWindowShell* shell = windowShell(world);执行过程中,会调用JSDOMWindowShell::setWindow,调用堆栈如下:

     WebKit_debug.dll!WebCore::JSDOMWindowShell::setWindow(WTF::PassRefPtr<WebCore::DOMWindow> domWindow)  行 75    C++
     WebKit_debug.dll!WebCore::JSDOMWindowShell::finishCreation(JSC::JSGlobalData & globalData, WTF::PassRefPtr<WebCore::DOMWindow> window)  行 57    C++
     WebKit_debug.dll!WebCore::JSDOMWindowShell::create(WTF::PassRefPtr<WebCore::DOMWindow> window, JSC::Structure * structure, WebCore::DOMWrapperWorld * world)  行 62    C++
     WebKit_debug.dll!WebCore::ScriptController::createWindowShell(WebCore::DOMWrapperWorld * world)  行 111 + 0x21 字节    C++
     WebKit_debug.dll!WebCore::ScriptController::initScript(WebCore::DOMWrapperWorld * world)  行 213 + 0xc 字节    C++
     WebKit_debug.dll!WebCore::ScriptController::windowShell(WebCore::DOMWrapperWorld * world)  行 79 + 0x43 字节    C++
>    WebKit_debug.dll!WebCore::ScriptController::evaluateInWorld(const WebCore::ScriptSourceCode & sourceCode, WebCore::DOMWrapperWorld * world)  行 130 + 0xc 字节    C++


JSDOMWindowShell::setWindow会调用JSDOMWindow::create创建真正的window对象:

JSDOMWindow* jsDOMWindow = JSDOMWindow::create(*JSDOMWindow::commonJSGlobalData(), structure, domWindow, this);


而后会调用两个参数的setWindow将jsDOMWindow赋值给JSDOMWindowShell的成员变量m_window。

void setWindow(JSC::JSGlobalData& globalData, JSDOMWindow* window)
        {
            ASSERT_ARG(window, window);
            m_window.set(globalData, this, window);
            setPrototype(globalData, window->prototype());
        }


接下面我们看JSDOMWindowShell的定义,如下:

class JSDOMWindowShell : public JSC::JSNonFinalObject

JSDOMWindowShell继承于JSC::JSNonFinalObject,JSC::JSNonFinalObject继承于JSObject,总之JSDOMWindowShell是一个JSObject。JSObject有如下函数是可以被重载的(多态):

        virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&);
        virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertyDescriptor&);
        virtual void put(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSValue, JSC::PutPropertySlot&);
        virtual void putWithAttributes(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSValue, unsigned attributes);
        virtual bool deleteProperty(JSC::ExecState*, const JSC::Identifier& propertyName);
        virtual void getPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&, JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
        virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&, JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
        virtual void defineGetter(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSObject* getterFunction, unsigned attributes);
        virtual void defineSetter(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSObject* setterFunction, unsigned attributes);
        virtual bool defineOwnProperty(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertyDescriptor&, bool shouldThrow);
        virtual JSC::JSValue lookupGetter(JSC::ExecState*, const JSC::Identifier& propertyName);
        virtual JSC::JSValue lookupSetter(JSC::ExecState*, const JSC::Identifier& propertyName);


JSDOMWindowShell重载了这些函数,所以当执行js的相关函数时就会调用这些函数,例如执行

window.onload= function() {}

js engine就会调用JSDOMWindowShell::put函数,JSDOMWindowShell::put接着会调用JSDOMWindow::put

void JSDOMWindowShell::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
{
    m_window->put(exec, propertyName, value, slot);
}


JSDOMWindow::put会lookupPut在s_info查找onload对应的函数并执行:

void JSDOMWindow::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
{
    if (!impl()->frame())
        return;
    // Optimization: access JavaScript global variables directly before involving the DOM.
    if (JSGlobalObject::hasOwnPropertyForWrite(exec, propertyName)) {
        if (allowsAccessFrom(exec))
            JSGlobalObject::put(exec, propertyName, value, slot);
        return;
    }
    if (lookupPut<JSDOMWindow>(exec, propertyName, value, s_info.propHashTable(exec), this))
        return;
    if (allowsAccessFrom(exec))
        Base::put(exec, propertyName, value, slot);
}


我们看一下JSDOMWindow::s_info定义:

const ClassInfo JSDOMWindow::s_info = { "DOMWindow", &JSDOMWindowBase::s_info, &JSDOMWindowTable, 0 };


其中s_info的parentClass为JSDOMWindowBase::s_info,staticPropHashTable为JSDOMWindowTable。JSDOMWindowTable的定义在D:\project\WebKit\WebKitBuild\Debug_Cairo_CFLite\obj\WebCore\DerivedSources\JSDOMWindow.cpp,JSDOMWindow.cpp是由DOMWindow.idl通过generate-bindings.pl生成的,这个在webkit在win32下的编译规则(七)中已经解释过了:

static JSC_CONST_HASHTABLE HashTable JSDOMWindowTable = { 1125, 1023, JSDOMWindowTableValues, 0 };


它是一个HashTable,其值在JSDOMWindowTableValues中。下面截取了JSDOMWindowTableValues的一部分:

static const HashTableValue JSDOMWindowTableValues[] =
{
    { "screen", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowScreen), (intptr_t)setJSDOMWindowScreen THUNK_GENERATOR(0) },
    { "history", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowHistory), (intptr_t)setJSDOMWindowHistory THUNK_GENERATOR(0) },
    { "locationbar", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowLocationbar), (intptr_t)setJSDOMWindowLocationbar THUNK_GENERATOR(0) },
    { "menubar", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowMenubar), (intptr_t)setJSDOMWindowMenubar THUNK_GENERATOR(0) },
    { "personalbar", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowPersonalbar), (intptr_t)setJSDOMWindowPersonalbar THUNK_GENERATOR(0) },
    { "scrollbars", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowScrollbars), (intptr_t)setJSDOMWindowScrollbars THUNK_GENERATOR(0) },
    { "statusbar", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowStatusbar), (intptr_t)setJSDOMWindowStatusbar THUNK_GENERATOR(0) },
    { "toolbar", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowToolbar), (intptr_t)setJSDOMWindowToolbar THUNK_GENERATOR(0) },
    { "navigator", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowNavigator), (intptr_t)setJSDOMWindowNavigator THUNK_GENERATOR(0) },
    { "clientInformation", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowClientInformation), (intptr_t)setJSDOMWindowClientInformation THUNK_GENERATOR(0) },
…………… 
    { "document", DontDelete | ReadOnly, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowDocument), (intptr_t)0 THUNK_GENERATOR(0) },
   …………… 
    { "console", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowConsole), (intptr_t)setJSDOMWindowConsole THUNK_GENERATOR(0) },
    { "onabort", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOnabort), (intptr_t)setJSDOMWindowOnabort THUNK_GENERATOR(0) },
    { "onbeforeunload", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOnbeforeunload), (intptr_t)setJSDOMWindowOnbeforeunload THUNK_GENERATOR(0) },
    { "onblur", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOnblur), (intptr_t)setJSDOMWindowOnblur THUNK_GENERATOR(0) },
    { "oncanplay", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOncanplay), (intptr_t)setJSDOMWindowOncanplay THUNK_GENERATOR(0) },
    { "oncanplaythrough", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOncanplaythrough), (intptr_t)setJSDOMWindowOncanplaythrough THUNK_GENERATOR(0) },
    { "onchange", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOnchange), (intptr_t)setJSDOMWindowOnchange THUNK_GENERATOR(0) },
    { "onclick", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOnclick), (intptr_t)setJSDOMWindowOnclick THUNK_GENERATOR(0) },
    { "oncontextmenu", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOncontextmenu), (intptr_t)setJSDOMWindowOncontextmenu THUNK_GENERATOR(0) },
    { "ondblclick", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOndblclick), (intptr_t)setJSDOMWindowOndblclick THUNK_GENERATOR(0) },
   …………… 
    { "onkeypress", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOnkeypress), (intptr_t)setJSDOMWindowOnkeypress THUNK_GENERATOR(0) },
    { "onkeyup", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOnkeyup), (intptr_t)setJSDOMWindowOnkeyup THUNK_GENERATOR(0) },
    { "onload", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowOnload), (intptr_t)setJSDOMWindowOnload THUNK_GENERATOR(0) },
………
}


从JSDOMWindowTableValues我们看到了我们所熟悉的history,document,navigator等属性,也看到了onload,onclick等event。

每一个JSDOMWindowTableValues的项由5部分组成:"document"->属性的名称;DontDelete | ReadOnly->属性的相关flag; (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsDOMWindowDocument)->getter函数;(intptr_t)0->setter函数; THUNK_GENERATOR(0) 用于 jit。执行window.document.xxx就会触发getter函数;执行window.document = 123;就会触发setter函数,由于document 的setter函数为null,所以这句js脚本会抛出异常。

具体的setter和getter的实现与具体功能相关,这里就不专门解释了。例如window.navigator最终调用:

JSValue jsDOMWindowNavigator(ExecState* exec, JSValue slotBase, const Identifier&)
{
    JSDOMWindow* castedThis = static_cast<JSDOMWindow*>(asObject(slotBase));
    if (!castedThis->allowsAccessFrom(exec))
        return jsUndefined();
    UNUSED_PARAM(exec);
    DOMWindow* imp = static_cast<DOMWindow*>(castedThis->impl());
    JSValue result = toJS(exec, castedThis->globalObject(), WTF::getPtr(imp->navigator()));
    return result;
}


而其中的imp->navigator()则是调用D:\project\WebKit\Source\WebCore\page\DOMWindow.cpp中的:

Navigator* DOMWindow::navigator() const
{
    if (!m_navigator)
        m_navigator = Navigator::create(m_frame);
    return m_navigator.get();
}


另外,很多人有一个疑问是:调用相关方法或获取相关属性时,为什么写不写window都可以,例如下面脚本是可以正常执行的:

<html>
<head>
<title>test1234</title>
<script>
onload = function() {
    alert(1234);
}
</script>
</head>
<body>
dsfdsf
</body>
</html>


答案是上面的脚本其实是最直接的方式,因为js脚本执行时的thisValue就为JSDOMWindowShell,也即window对象,而JSDOMWindow有一个属性叫window,它返回的就是当前的JSDOMWindowShell,所以js脚本中的window.onload其实是thisValue.window.onload.


在DOMWindow.idl中,有一些注释是// DOM Level 0,// DOM Level 2 AbstractView Interface等,相关的解释可以参考wiki(http://en.wikipedia.org/wiki/Document_Object_Model#Levels_of_DOM):

After the release of ECMAScript, W3C began work on a standardized DOM. The initial DOM standard, known as "DOM Level 1," was recommended by W3C in late 1998. About the same time, Internet Explorer 5.0 shipped with limited support for DOM Level 1. DOM Level 1 provided a complete model for an entire HTML or XML document, including means to change any portion of the document. Non-conformant browsers such as Internet Explorer 4.x and Netscape 4.x were still widely used as late as 2000.

DOM Level 2 was published in late 2000. It introduced the "getElementById" function as well as an event model and support for XML namespaces and CSS. DOM Level 3, the current release of the DOM specification, published in April 2004, added support for XPath and keyboard event handling, as well as an interface for serializing documents as XML.


作者:chief1985 发表于2011/9/12 23:30:51 原文链接
阅读:7889 评论:3 查看评论

赤手空拳如何成就百万富翁?——网络营销之八(第五招:百度知道(腾讯问问))

$
0
0

   “百度知道”(腾讯问问)实在是个好东东,无论你在百度上搜索什么类型的关键词,“百度知道”的排名永远都是最好的,尤其是一些包含“什么”、“怎么办”、“如何”、“为什么”的长尾词,你可以试一试找任何一个关键词,然后在这个词的前面加上“为什么”或“怎么办”看看排在第一的是不是“百度知道”。

 

1、百度知道和百度文库有什么区别?

  拉拉:百度知道和百度文库有什么区别呢?

  蒋老师:实际上百度知道就是一个问答,而百度文库则是一个知识库。前者侧重于有人提问你来回答,而后者则是你自己设计的知识库。

 

2、为什么要进行百度知道营销?

  拉拉:有必要进行百度知道营销吗?

  蒋老师:从网络营销的角度,百度知道是一个非常不错的东东,不仅你可以通过回答网友的问题,而且你可以多设置几个帐号自问自答。这是因为:

  ①通过百度知道带来一定的流量

  ②通过百度知道做品牌推广

  ③通过百度知道增加反向链接:这个是有技巧的,否则你的回答是不会成功的。

 

3、百度知道有没有什么技巧?

  拉拉:百度知道有什么技巧吗?

  蒋老师:总喜欢找技巧,没有技巧就是最大的技巧,请参考:

  ① 技巧之一,申请10个百度账号

  百度知道是一个很好企业网络营销平台,对于知道提问与回答及采纳要求也很严格。做知道营销,账号肯定是必不可少,发多了就会被禁止甚至是封号,申请10个百度知道账号,一方面可以防止百度知道工作人员认为在作弊,一方面可以方便自己灵活使用知道进行操作,另外还需要下载四个浏览器,目前最常用的浏览器:火狐、sogou、ie、360浏览器、google浏览器等。主要作用是方便自己进行操作,四个浏览器可以登陆4个账号,有助于提升工作效律。

  ② 技巧二,使用表格记录好

  必须记录好每天知道工作日记,主要记录提问的账号、问答、地址、状态、是否采纳答案、顶知道、发布时间等,把这些统统计在表格上,方便自己管理知道营销效果。另外还需要记录问题关键词,通过关键词长尾词长尾词分析工具分析出的词。

  ③ 技巧之三,提交百度知道问题

  譬如,问答为:“黄金定投与基金定投有什么区别?”,使用账号为:hello_gold, 然后把该问题的链接与账号使用一个表格进行记录,一方面防止提问问题不知道提问账号,一方面防止提问问题找不到。

  ④ 技巧之四,群里找人回答问题

  知道营销最大的难题就是,IP限制,账号限制,可以提问的问题整理好,然后把问题的链接及已经编写好的问题答案分别发给群里的10位好友,或者企业好友、朋友、亲人等,让他们帮忙提交,这样做保证了账号及ip的不重复,降低百度平台对于作弊现象怀疑度。

  ⑤ 技巧之五,采纳答案

  一旦问题提交答案后,切不可立即采纳,据经验发现,整个过程如时间太短,容易被百度察觉,别急等三天以后再回来采纳答案。

  ⑥ 技巧之六,多种类型问题轮换提交

  切记不要使用同一个账号,提问的问题太过于相似,也很容易出事,所使用的账号不能只提问关于企业行业的问题,也可以去回答或者提问其它行业的问题或者回答,一方面可以升级获取经验增长值,一方面可以降低百度知道平台工作人员对作弊或者利用知道进行企业品牌营销打击度。  

  建议做法是周一提交问答,周四提交,周日采纳最佳答案,

  ⑦ 技巧之七,顶贴也要讲求方法

  进行顶帖子的时间,可以一天顶几个或者隔几天顶几次,切记不要一天给知道进行顶几十个,这样很容易引起百度反感。可以通过qq好友、企业好友、亲戚朋友、分别把链接发给他们,让他们帮助自己帖子知道。

  ⑧ 技巧之八,知道团队

  把最常用几个知道的账号,尽量把等级升高一点,加入知道团队,一方面可以了解百度知道最新动态或者一些操作规则与内情。

  ⑨ 技巧之九,总结

  每隔一个星期或者一个月要对自己的知道企业网络营销进行一汇总的报告,哪些知道做得比较好,哪些知道做得不好,哪些知道可以挖掘大量企业长尾关键词,都必须进行一个汇总报告,找出做知道营销不足之处进行改进,只要不断总结与学习,才能更好做好知道企业网络营销。

 

4、百度知道需注意的几个问题。

  拉拉:有什么需要注意的吗?

  蒋老师:最需要注意的问题就是你放外链千万要小心行事,否则可能会被封号。

  ① 百度知道问题中必须要有关键词。

  ② 回答者的等级越高,百度审核通过率就越高。

  ③ 好评数量越大,知道排名越高。这一点最重要。

  ④ 百度知道问题解决时间对排名影响较小。

  ⑤“相关内容”数量越多越好,相关问题越多说明这个页面的通用性更高,能够解决更多人的问题。

  ⑥ 标题里包含关键词即可,不要刻意增加关键词密度

  ⑦ 通过百度知道内链建设,增加我们问题在百度知道里“相关问题”里面的出现次数,出现的次数越多越好。

  ⑧ 在百度知道里面做外链效果不如百度内链接好。

作者:jianghuiquan 发表于2011/9/13 19:57:01 原文链接
阅读:1881 评论:0 查看评论

赤手空拳如何成就百万富翁?——网络营销之九(第六招:论坛营销)

$
0
0

  论坛营销就是“企业利用论坛这种网络交流的平台,通过文字、图片、视频等方式发布企业的产品和服务的信息,从而让目标客户更加深刻地了解企业的产品和服务。最终达到企业宣传企业的品牌、加深市场认知度的网络营销活动”,就是论坛营销。

 

1、网络营销招数繁多,有必要都学习吗?

  拉拉:经过师傅的指引,这段时间我也看了不少网络营销方面的书籍、网站,感觉东西太多了,有必要都学习吗?

  蒋老师:我的观点是十八般武器,不一定要样样精通,但是知道这十八般武器都是干什么的,还是很有必要的。然后可以根据自己特长选择适合自己的几种武器。

  拉拉:明白了,那就请老师继续说说其他的招式吧,最后我再选择我希望的招式。

  蒋老师:好的,我们继续……

 

2、论坛(贴吧)营销之道

  论坛是互联网诞生之初就存在的形式,历经多年洗礼,论坛作为一种网络平台,不仅没有消失,反而越来越焕发出它巨大的活力。其实人们早就开始利用论坛进行各种各样的企业营销活动,当时论坛成为新鲜媒体的论坛出现时,就有企业在论坛里发布企业产品的一些信息了,其实这也是论坛营销的一种简单的方法。

  论坛营销可以成为支持整个网站推广的主要渠道,尤其是在网站刚开始的时候,是个很好的推广方法。利用论坛的超高人气,可以有效为企业提供营销传播服务。而由于论坛话题的开放性,几乎企业所有的营销诉求都可以通过论坛传播得到有效的实现。论坛营销是以论坛为媒介,参与论坛讨论,建立自己的知名度和权威度,并顺带着推广一下自己的产品或服务。运用的好的话,论坛营销可以是非常有效果的网络营销手段。

  论坛营销的主旨,无疑是讨论营销之道,论坛营销应在多样化的基础上,逐渐培养和形成自己的主流文化或文风。比如,设一些专栏,聘请或培养自己的专栏作家和专栏评论家,就网友广泛关心的话题发言。不是为了说服别人或强行灌输什么,而是引导论坛逐渐形成自己的主流风格。海纳百川,有容乃大。营销论坛,包容多样化的观点,多样化的文风,是营销人强烈自信心的表现。

作者:jianghuiquan 发表于2011/9/13 19:58:38 原文链接
阅读:1671 评论:0 查看评论

赤手空拳如何成就百万富翁?——网络营销之十(第七招:视频营销)

$
0
0

  网络营销的特性是什么?视频营销能给企业的新品推广带来什么惊喜?曾几何时,广告模式不清晰、用户体验差、无版权且质量低劣,内容与产品不匹配等等疑问一直成为品牌客户选择视频网站的绊脚石。

 

  然而2010年是视频行业实现跨越式发展的一年,以土豆网“内容为王”为代表的中国网络视频行业彻底颠覆了单纯的视频分享网站角色,土豆网以用户分享为基础,集热播影视剧的版权内容和自制内容三合一的内容策略,构架起了全方位媒体公司的定位。 

 

  拉拉:视频营销这个我不陌生,咱看的电视剧中经常插播广告或者字幕广告都是,网络视频有没有特别之处?

  蒋老师:的确如此,我们经常接触电视,所以对于常规的视频广告再熟悉不过了,而网络视频营销更是在此基础之上加上了N多创意,具体你可以看一下前些日子推出的一系列视频营销的经典案例中领略一下其独特魅力! 

 

  正是由于有着丰富的娱乐内容和强势的整合创意能力,土豆网推出了一大批诸如:“诺基亚中国创造、美之源一笑赢千金、百威自制剧植入、大众汽车蓝创未来”等品牌经典案例。当营销的娱乐化为时代的风向标时,不由得让人们想起美国著名管理学者斯科特·麦克凯恩曾经说过的一句话—“一切行业都是娱乐业。”娱乐化营销已成为这个时代商业运营的一个标志性特征,而如何对娱乐化精神进行有效开发、利用、发挥则成为品牌广告主面临的新挑战。

 

  在短短两个月的时间内,“趣喝美汁源、一笑赢千金”取得了惊人的成绩,丝毫不输当热门电视真人秀栏目。第三方数据公司艾瑞的研究报告显示,“趣喝美汁源、一笑赢千金”在网民中的知名度达到31.9%,与同期的电视真人秀节目相比,仅次于通过多渠道宣传,在湖南卫视和青海卫视套播的《快乐男声》和《花儿朵朵》,领先于同期播出的其他电视真人秀节目。

 “趣喝美汁源、一笑赢千金”取胜的秘诀在哪里?土豆网首席营销官王祥芸揭开了谜底:“网络整合营销有4I原则,即:Interesting趣味原则、Interests利益原则、Interaction互动原则、Individuality个性原则。这次“趣喝美汁源、一笑赢千金”的成功很好地诠释了土豆网对于网络整合营销的把控能力”。
作者:jianghuiquan 发表于2011/9/13 20:00:19 原文链接
阅读:1749 评论:0 查看评论

赤手空拳如何成就百万富翁?——网络营销之十一(第八招:微博营销)

$
0
0

  微博营销以微博作为营销平台,每一个听众(粉丝)都是潜在营销对象,每个企业利用更新自己的微型博客向网友传播企业、产品的信息,树立良好的企业形象和产品形象。每天的更新的内容就可以跟大家交流,或者有大家所感兴趣的话题,这样就可以达到营销的目的,这样的方式就是新兴推出的微博营销。

 

1、我怎么感觉微博上的发言都是乱七八糟?

  拉拉:蒋老师,受您的熏陶,为了让自己多接触高科技,也在新浪网上注册了一个“围脖”,怎么感觉都是乱七八糟的?

  蒋老师:恭喜你前进了一大步,愿意与新兴的东东接触了。的确,这就像你参加了一个宴会,如果没有主题,你会感觉乱轰轰的,但是一旦你融入一个圈子,你会发现这个圈子讲的股票,那边几个美女讲的美容,是不是听出一些门道,微博就是这样,大家都有发言权,所以如果你讲的好,这时候大家就听你的多,如果别人讲的好,大家都听别人的。在微博上发言新浪叫“发布”,你可以想象一个新闻发布会;在腾讯上叫“广播”。而你的听众新浪叫“粉丝”;腾讯叫“听众”。

  我引用互联网上的一段话:“你的粉丝超过一百,你就好像是本内刊;超过一千,你就是个布告栏;超过一万,你就好像是本杂志;超过十万,你就是一份都市报;超过一百万,你就是一份全国性报纸;超过一千万,你就是电视台,超过一亿,你就是CCTV了。”,这段话的原创没有考证,但是却道出了微博的真谛。

 

2、微博如何与营销联系在一起呢?

  拉拉:这又怎么能和网络营销联系在一起呢?

  蒋老师:微博营销以微博作为营销平台,每一个听众(粉丝)都是潜在营销对象,每个企业利用更新自己的微型博客向网友传播企业、产品的信息,树立良好的企业形象和产品形象。每天的更新的内容就可以跟大家交流,或者有大家所感兴趣的话题,这样就可以达到营销的目的,这样的方式就是新兴推出的微博营销。

  在现实中,我们常常把线上活动和线下活动结合在一起,更容易取得成功。

 

3、微博营销与博客营销有什么区别?

  拉拉:蒋老师,微博与博客的区别仅仅是发布的文字多少不一样吗?

  蒋老师:二者的区别发布的文字多少不一样的确是区别之一(微波每次只能发布   140字以内),但重点体现如下:

  (1)时效性的不同:微博的时效性非常重要,听众更关心今天或者现在发生了什么事情,而对三天前的信息则少有人去关注,有点像即时新闻;而博客对时效性则要求不强,读者只要发现对其有用,多久都可能阅读。

  (2)门槛不同:微博侧重于哪儿、什么时间发生了什么有趣(有价值)的事情,行文可以短小精悍,降低了发布者的文字功底的门槛;而博客则是对某一领域或产品的认知程度,这取决于博主的专业知识与文笔。

  (3)获取方式不同:微博可以随时、随地用电脑、手机很方便的获取微博信息;而博客由于都是文章,相对使用手机则阅读较为不便。

 

4、微博营销有哪些误区呢?

  拉拉:我明白了,要尽可能多的发展自己的粉丝,然后行之有效地进行营销,那么有没有什么误区可以借鉴呢?

  蒋老师:你不妨从以下几方面加以注意:

  ① 一味追求听众(粉丝)数量

  表现:每天都在拼命地发展自己的粉丝,不管是互粉还是有奖活动或者花钱购买僵尸粉……总之,像炒股票一样,涨则忧,跌则悲。

  对策:僵尸粉再多都是都是枉然,旨在寻找那些潜在的目标用户才是根本目的。这就需要:首先要对企业和产品进行定位;其次,聆听与企业相关(包括竞争对手)的信息,听听他们是如何评价企业的产品,是批评的声音还是赞的声音;第三,筛选目标用户,进行关注,尝试为赞的声音表示感谢,批评的声音帮助他们解决问题;第四,竞争对手情况的了解,取长补短;第五,要量更要质。

  ② 我的地盘我作主,不愿互动

  表现:众多微博主把自己的微博当成自己的电台、广告页,再也不用担心以前在别人的群中发广告被踢的后果,真正体会了自己当家作主的优越感,浑然忘记了为人民服务的根本宗旨。面对粉丝的疑问、求助和质疑无动于衷。众多粉丝也只能选择一个“关注自己”的民主博主,远离你的独裁统治。

  对策:发赤裸裸的广告从来都是低级营销策略,做顾问式营销,帮助用户解决问题;用心聆听粉丝在讨论什么,是抱怨还是表扬你的产品或服务,加入他们的对话;

  ③ 缺乏团队与坚持

  表现:为数不少的企业刚开始也是信心百倍,但由于没有专人负责,最终沦落为只是赶了一个时髦而已,导致最终企业微博的荒废,粉丝有需求也无人管、无人问的状态。

  对策:如果不可能组建一支团队,至少要有一个人对微博营销富有激情、愿意和对话的人来做这件事,做到问有答,询有果;长期坚持,不能三天打渔、两天晒网。

  ④ 发布内容与产品(服务)脱节

  表现:看看“冷笑话”做的很成功,而对企业产品或服务感兴趣的粉丝数量甚少,于是开始发布一些不着边际的内容,企图通过哗众取宠来吸引粉丝。

  对策:企业制定社会化媒体营销的内容策略十分重要,不可因为听众一时数量较少而采取不靠谱的方法去增加粉丝。

 

5、如何制定社会化媒体——微博内容策略?

  拉拉:我们前面都说了“内容为王”这个我懂,那如何制定内容,是不是有好的策略呢?

  蒋老师:微博只是你和用户交流的工具,不要工具本身当成是社会化媒体营销,通过这些社会化媒体工具建立起自己的品牌社区才是问题本身。既然社会化媒体网站是交流的工具,那么一定要“言之有物”,那么社会化媒体营销的内容策略就显得尤为重要,以下建议仅供参考:

  ①了解你的受众

  你的企业博客内容又要给谁看?弄清楚自己的内容是写给谁看的,他们有什么特性这个问题之后,接下去的社会化媒体营销才不会迷失方向。

   ②定义你内容的主旋律

   了解了你的受众之后,你就要设法和他们交流,不要只是例行公事的发布一些自己产品的信息,你应该试着解决一些用户的真正需求,给他们提供一些自己力所能及的帮助,比如你是一家咖啡馆,你可以给用户提供一些关于咖啡的知识,让用户觉得你的内容不仅仅是一些促销广告,而是一个知识源泉。

   ③制定有规律的更新频率

   你不必每天更新内容,但必须要制定一个更新计划,多久更新一次,每次更新多少内容。更新频率过少,用户说不定就把你忘记了,而更新频率过高,用户也许就会感到烦,特别是在微博上,要严格遵循一个合理的更新频率。

   ④制定一个内容更新计划

   我发现有很多微博上面的内容都是很随意发的,对于企业来说,如果像韩寒只发布一个“喂”字的微博就有点不妥了,企业应该制定出自己的内容更新计划,什么时候该发布什么样的内容?这一点应该像报纸学习,报纸上每天的内容都是有规划的,每个周末还有一个休闲副刊什么的。

   ⑤让内容有“连载”的味道

   有很多优秀的博客,每周都会有一篇总结性的文章,比如,本周10大twitter趋势等内容,让用户在每一周的某个时候都想回来看看,这一点像听单田芳评书“欲知后事如何,且听下回分解”的味道。

   ⑥做一些专访

   你可以访问你的用户,也可以请一些业内人士来和你的受众分享一些东西,而对于专访也需要一个清晰的计划,早早的制定一个采访名单。

   ⑦让内容形式多样化

   不要一成不变的只是文字,可以更多一点照片,视频,音乐,之前我看到一个企业博客他的一篇介绍自己产品的博文就是一个漫画,非常的吸引眼球,用户对于这种内容还乐于和朋友分享,何乐而不为呢?

   ⑧定期发布一些行业的白皮书(调查报告)

   如果有能力的话,就自己所在的行业发布一些调查报告,或者是一些行业白皮书,让自己在这个行业树立更权威的地位。

   ⑨关注用户的评论和反馈

   有很多企业博客,垃圾评论没有人去删除,一些用户的求助或者建议也没人去搭理,这就没有起到和用户交流的目的。一些企业的新浪微博也是,只是当成一个信息发布工具,对于其中用户的评论或者建议都没有及时去关注,这一点在社会化媒体营销中尤为重要。

   ⑩学会倾听

   最后一点,也是最重要的一点,如果你觉得自己不知道说什么的时候,先听听你的用户是怎么说的,你的竞争对手是怎么说的,你所在行业的业内人士又是怎么说的。社会化媒体营销从倾听开始。

作者:jianghuiquan 发表于2011/9/13 20:05:06 原文链接
阅读:2034 评论:0 查看评论

赤手空拳如何成就百万富翁?——网络营销之十二(第九招:移动互联网)

$
0
0

  移动互联网的蓬勃发展和宏伟的发展蓝图为企业描绘了一个崭新的未来世界,面对如此庞大的用户群体,在移动互联网上面存在什么样的营销机会和模式?如何利用移动互联网进行营销,自然成为企业值得去思考的问题。

 

1、为什么说,前十年是互联网的时代,后十年同开启了移动互联时代?

  拉拉:听说“前十年是互联网的时代,后十年同开启了移动互联时代”如何理解呢?

  蒋老师:以网易1997年创建伊始(新浪创建于1998年),已经发展了十多个年头,从蹒跚起步到上市,几大门户网站甚是风光了多年,但随着移动互联时代的开启,传统的门户网站遭受到了严重的考验与发展瓶颈。

 

  有很多数据在显示移动互联网市场的巨大机会:截止到2010年,全世界有50亿部手机,占总人口73%,而全球的电脑数量则只有12亿台;在全球40亿部正在使用的手机中,有10.8亿部为智能手机,占比达27%;每天手机中第三方应用程序下载量是3000万次,每秒达347次;截至2011年4月,中国9亿移动通信用户,3G用户达6757万,手机上网用户达3.03亿。很多机构预测显示,5年后手机将可能成为接入互联网的首选方式。

 

  随着iPhone、iPad、Android等移动终端的火热,伴随着用户的构成和行为习惯的改变以及新应用程序的大量涌现,移动互联网开始成为新的营销信息传播的载体。

 

   移动互联网消除了时空维度对信息传播的限制,实现了传播的随时性、随地性。手机和平板电脑等移动终端,伴随于人们在各个空间移动中的碎片化时间,可以实现信息的实时性传播,与需要在客厅、卧室、办公室或者汽车等固定地点接收信息的其他媒体相比,其信息发布与信息接收之间的时间之差更小,基本做到即时发布、即时接收,不仅可以实时获得信息,同时也可以实时向别人传递信息。

 

   同样在中国,新浪微博数据显示,2010年底 38%新浪微博来自移动终端,而至今这一数字已超过50%。这自然就在移动互联网上产生了实时化的营销传播机会,任何时间、任何地点、任何对象、任何信息、任何方式将成为信息传播的新观念。

 

   所以我们有理由说:前十年是互联网的时代,后十年同开启了移动互联时代!

 

2、移动互联的优势?

  拉拉:移动互联有哪些优势呢?

  蒋老师:移动互联网消除了不同媒介之间的隔断,实现了媒介大融合,使信息传播走向全媒介化。手机和平板电脑等数字化多媒体终端,既接收音频、视频,又接收图文、数据,这赋予了移动终端强大的媒介融合能力,人们可以借助文字、图片、图像、声音的任何一种或者几种的组合来开展信息传播活动,移动媒体、移动广播,移动电视、移动网站、移动SNS、移动电子商务等不同的形态实现新的跨界组合,让移动互联网成为一个具有全媒介元素的传播平台。

 

3、移动营销有什么策略?

  拉拉:针对移动营销有什么新策略吗?

  蒋老师:除掉纯粹的广告,移动互联网上,存在营销创意的无限想象空间。

利用手机应用、位置服务、手机支付、虚拟购物等形式,都可以帮助企业打开一扇新的营销之窗。

   譬如在IPHONE(IPAD)之苹果商店的APP应用、移动联通手机定制应用等、小米手机等都是具体的体现与应用。

  当然腾讯的钱包也是非常不错的一个应用!

 

【结束语】

  其实网络营销没有什么捷径,人家告诉你这个东西很简单,很容易。其实八成都需要很高的执行力,至于如何去修炼执行力,我想只有两个字“坚持”。只要你深谙一种方法,坚持执行下去,肯定会得到你想要的结果。正巧你的目的非常明确的话,那你的坚持将更加有目的性,过程中的些许成功能刺激你的满足感,你也就欣然的一路走下去了。

 

  当然,网络营销的招式不止这些,还有更多,在此仅列举部分常见招式,以起到抛砖引玉的作用。

 

   在此也非常感谢CSDN,让我这个非纯技术的文章在此得以展示,给我们技术人另外一种视角看世界!

 

  最后祝大家在网络营销的道路上一路顺利,获得你想要的结果,成为真正意义上的百万富翁!

 

  做一位懂管理、懂营销、懂技术、懂生活、懂理财的五懂新人而奋斗!

作者:jianghuiquan 发表于2011/9/13 20:10:49 原文链接
阅读:2276 评论:0 查看评论

【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;

$
0
0

 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/472.html

        一直以来Himi特别想在游戏中使用粒子系统,但是之前做J2me与Android中发现使用粒子做的效果都会造成游戏运行内存的一个负担,所以一直很遗憾,那么在iOS游戏开发中,可以说必须要使用粒子啦,还是苹果硬件给力;看过我一开始刚写cocos2d博文的时候我就说过因为cocos2d的粒子编辑器很给力,所以也是我选用cocos2d引擎的一部分原因;            

粒子编辑器名称:ParticleDesigner,界面截图如下:

   

       前两天粒子编辑器购买成功(很便宜,不到10美金,比图片打包工具TP便宜多了),耍了两天后有些后悔,因为这个粒子编辑器虽然看界面像是开发编辑器的作者提供了很多的特效一样,其实都是cocos2d中例子罢了,但是反过来想,人家给做成可视编辑省去的时间远远超值于编辑器的钱了!咳咳,又扯远了,回到正题;

      至于编辑器或者在cocos2d中添加粒子特效的方法,网上N多资料和教程,这里就不多说了,下面简单说今天重点的问题;

      为了让大家更清楚的知道问题所在,我新建一个cocos2d的项目:

      1. 首先在屏幕中绘制字符串(将一个CCLabelTTF对象添加到当前Layer中);

		CCLabelTTF *label = [CCLabelTTF labelWithString:@"Welcome--Himi" fontName:@"Marker Felt" fontSize:64];
		CGSize size = [[CCDirector sharedDirector] winSize];
		label.position =  ccp( size.width /2 , size.height/2 );
		[self addChild: label];

      2.然后我将使用粒子编辑器生成的一个类似陨石导出一个名为“himi.plist”粒子文件(其中包含粒子的所有属性),将此文件导入项目中并添加到当前layer中;

        //添加一个粒子特效
        CCParticleSystem *tempSystem = [ARCH_OPTIMAL_PARTICLE_SYSTEM particleWithFile:@"himi.plist"];
        //tempSystem.positionType=kCCPositionTypeRelative;//备注1
        tempSystem.positionType=kCCPositionTypeFree;
        tempSystem.position=ccp(100,100);  
        [self addChild:tempSystem];

这里的备注1,大家留意下,后面会详细说,这里先无视;到此,整个layer中添加了一个字符串和一个粒子特效!运行项目 截图如下:



这里大概说下,粒子我设定的是一直循环播放的,是通过编辑器修改的参数,OK,下面开始到重点了:

    现在我使用一个选择器 [self scheduleUpdate]; ,让当前的layer的X坐标不断+3,代码如下:

-(void)update:(ccTime)time{
    self.position=ccp(self.position.x+3,self.position.y);
}

这里多嘴一句,在cocos2d坐标的修改尽可能的使用整体赋值,比如更改坐标,虽然这里只是更改x轴,但是我仍然对整个position进行的修改;

然后大家都应该知道,当前的layer上的粒子特效和CCLabelTTF都会跟着移动,但是对不起,这里出现问题,运行截图如下:



    这里大家肯定很奇怪,粒子效果应该是垂直的,但是实际却不是,其实这个问题真的很细节,因为一般粒子特效都是用于很短的时间进行播放-消失;

这里大概说下,其实特效的的发射器也就是粒子的起始座标其实确实一直跟着layer移动了,但是创建出来后的粒子却一直显示在创建时候的座标进行自身运动,并没有按照我们想象的移动方式进行整体移动;

    讲了这么多其实这个问题一句代码就解决了,那就是最上面创建粒子特效的代码的备注1,

 //tempSystem.positionType=kCCPositionTypeRelative;//备注1

这个positionType其实就是设置当前粒子特效中所有粒子的位置类型,默认情况下是自由模式,代码如下:

kCCPositionTypeFree

那么备注1的,kCCPositionTypeRelative  是相对模式,所以只要这里对粒子进行设置位置类型为相对模式即可,问题解决;


           OK,童鞋们该说了,这么容易描述清楚的问题与解决方案直接说不就好了 =。  =我也这么想的,但是这里我需要说两点:

   1.如果博文上来就针对问题,巴拉巴拉的说一堆,那么对于还没接触粒子这一块的童鞋而言,一点用没有,完全是丈二的和尚,xxxx你懂的~

   2.讲的这么多,还是我老说的一句话:细节决定成败;其实细节也如同基础,基础不牢,何谈提高?!

    好啦,这一篇就到这里,继续忙了;现在时刻:凌成1.24,哎、最近的博文都是夜里发,第二天谁也看不到,=。  =



作者:xiaominghimi 发表于2011/9/14 1:30:15 原文链接
阅读:20734 评论:17 查看评论
Viewing all 35570 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>