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

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

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

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

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

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

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

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

       软件之道到底是什么呢?

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

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

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

 

 

作者:xabcdjon 发表于2011/9/10 20:56:51 原文链接
阅读:26056 评论: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 原文链接
阅读:2774 评论: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 原文链接
阅读:3028 评论: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 原文链接
阅读:2961 评论: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 原文链接
阅读:5070 评论: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 原文链接
阅读:5143 评论: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 原文链接
阅读:4413 评论: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 原文链接
阅读:3112 评论: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 原文链接
阅读:8913 评论: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 原文链接
阅读:2784 评论:0 查看评论

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

$
0
0

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

 

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

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

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

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

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

 

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

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

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

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

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

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

$
0
0

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

 

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

 

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

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

 

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

 

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

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

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

$
0
0

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

 

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

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

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

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

 

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

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

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

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

 

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

  ③ 缺乏团队与坚持

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

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

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

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

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

 

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

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

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

  ①了解你的受众

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

   ②定义你内容的主旋律

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

   ③制定有规律的更新频率

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

   ④制定一个内容更新计划

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

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

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

   ⑥做一些专访

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

   ⑦让内容形式多样化

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

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

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

   ⑨关注用户的评论和反馈

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

   ⑩学会倾听

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

作者:jianghuiquan 发表于2011/9/13 20:05:06 原文链接
阅读:2991 评论: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 原文链接
阅读:3218 评论: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 原文链接
阅读:21919 评论:17 查看评论

MyBatis学习笔记(4)—— XML映射文件の结果集(Result Maps)高级结果映射中的集合(collection)

$
0
0

集合


<collection property="posts" ofType="domain.blog.Post">
  <id property="id" column="post_id"/>
  <result property="subject" column="post_subject"/>
  <result property="body" column="post_body"/>
</collection>

我们来继续上面的示例,一个博客只有一个作者。但是博客有很多文章。在博客类中, 这可以由下面这样的写法来表示:

private List<Post> posts;

要映射嵌套结果集合到 List 中,我们使用集合元素。就像关联元素一样,我们可以从 连接中使用嵌套查询,或者嵌套结果。


集合的嵌套查询


首先,让我们看看使用嵌套查询来为博客加载文章。

<resultMap id="blogResult" type="Blog">
  <collection property="posts" javaType="ArrayList" column="id" ofType="Post" select="selectPostsForBlog"/>
</resultMap>

<select id="selectBlog" resultMap="blogResult">
  SELECT * FROM BLOG WHERE ID = #{id}
</select>

<select id="selectPostsForBlog" resultType="Post">
  SELECT * FROM POST WHERE BLOG_ID = #{id}
</select>

这里你应该注意很多东西,但大部分代码和上面的关联元素是非常相似的。首先,你应 该注意我们使用的是集合元素。然后要注意那个新的“ofType”属性。这个属性用来区分 JavaBean(或字段)属性类型和集合包含的类型来说是很重要的。所以你可以读出下面这个 映射:

<collection property="posts" javaType="ArrayList" column="id" ofType="Post" select="selectPostsForBlog"/>

读作: “在 Post 类型的 ArrayList 中的 posts 的集合。”

javaType 属性是不需要的,因为 MyBatis 在很多情况下会为你算出来。所以你可以缩短 写法:

<collection property="posts" column="id" ofType="Post" select="selectPostsForBlog"/>

集合的嵌套结果


至此,你可以猜测集合的嵌套结果是如何来工作的,因为它和关联完全相同,除了它应 用了一个“ofType”属性

First, let’s look at the SQL:

<select id="selectBlog" resultMap="blogResult">
  select
  B.id as blog_id,
  B.title as blog_title,
  B.author_id as blog_author_id,
  P.id as post_id,
  P.subject as post_subject,
  P.body as post_body,
  from Blog B
  left outer join Post P on B.id = P.blog_id
  where B.id = #{id}
</select>

我们又一次联合了博客表和文章表,而且关注于保证特性,结果列标签的简单映射。现 在用文章映射集合映射博客,可以简单写为:

<resultMap id="blogResult" type="Blog">
  <id property="id" column="blog_id" />
  <result property="title" column="blog_title"/>
  <collection property="posts" ofType="Post">
    <id property="id" column="post_id"/>
    <result property="subject" column="post_subject"/>
    <result property="body" column="post_body"/>
  </collection>
</resultMap>

同样,要记得 id 元素的重要性,如果你不记得了,请阅读上面的关联部分。

同样, 如果你引用更长的形式允许你的结果映射的更多重用, 你可以使用下面这个替代 的映射:

<resultMap id="blogResult" type="Blog">
  <id property="id" column="blog_id" />
  <result property="title" column="blog_title"/>
  <collection property="posts" ofType="Post" resultMap="blogPostResult" columnPrefix="post_"/>
</resultMap>

<resultMap id="blogPostResult" type="Post">
  <id property="id" column="id"/>
  <result property="subject" column="subject"/>
  <result property="body" column="body"/>
</resultMap>
作者:HeatDeath 发表于2017/11/8 10:57:06 原文链接
阅读:49 评论:0 查看评论

LeetCode-670:Maximum Swap (交换数字得最大整数) -- medium

$
0
0

Question

Given a non-negative integer, you could swap two digits at most once to get the maximum valued number. Return the maximum valued number you could get.

Example 1:

Input: 2736
Output: 7236
Explanation: Swap the number 2 and the number 7.

Example 2:

Input: 9973
Output: 9973
Explanation: No swap.

Note:
* The given number is in the range [0, 108].

问题解析:

给定非空非负整数,最多交换其中的两个数字,得到最大的整数,返回最大整数。

Answer

Solution 1:

个人解决方案:

  • 首先以例子分析要交换的特性,我们会发现,当整数中的所有数字均按照非递增的顺序排序,那么这个整数就是最大整数,不需要进行交换;
  • 所以根据上面的分析,我们需要寻找整数中数字出现不符合非递增规则的分裂点,记录违规的分裂点;
  • 在分裂点的后半部分寻找最大的数字,并且位置越靠后的数字相对前面与其相等的前面的数字交换的意义更大,也就是我们要求寻找digits[j] >= max,注意这里是>=
  • 在分裂点的前半部分从后向前寻找小于上一步找到的max的最大值;
  • 将找到的两个位置数字进行交换,即可得到交换最大整数。
  • 注意,为了进行操作,需先将整数转化为char数组,并在交换后转换回整数。
class Solution {
    public int maximumSwap(int num) {
        char[] digits = Integer.toString(num).toCharArray();

        if(digits.length == 1) return num;

        // 寻找不符合非递增顺序的分界线
        int split = 0;
        for (int i = 0; i < digits.length-1; i++){
            if (digits[i] < digits[i+1]){
                split = i+1;
                break;
            }
        }

        // 在分界线后面的部分寻找最大的值max
        char max = digits[split];
        int index1 = split;
        for (int j = split+1; j < digits.length; j++){
            if (digits[j] >= max){
                max = digits[j];
                index1 = j;
            }
        }

        // 在分界线前面的部分向前寻找小于max的最大值
        int index2 = split;
        for (int i = split-1; i >= 0; i--){
            if (digits[i] >= max){
                break;
            }
            index2--;
        }

        //交换两位找到的char
        char temp = digits[index1];
        digits[index1] = digits[index2];
        digits[index2] = temp;

        return Integer.valueOf(new String(digits));
    }
}
  • 时间复杂度:O(n),空间复杂度:O(n)

Solution 2:

利用桶的思想。

  • 利用indices桶数组记录数字0〜9的最后位置。
  • 遍历整个整数变为char的数组,从左到右提取每一个数字;
  • 对提取到的每一个数字检查是否存在比它更大的数字存在,故与桶的位置数字做比较(从9开始到当前数字);
  • 如果,存在比提取的数字更大的桶,我们还需要确保这个较大数字的位置落后于桶数字所在的位置;
  • 如果找到,则交换两个位置,转换数组并返回。
  • 这种解法更加巧妙。
class Solution {
    public int maximumSwap(int num) {
        char[] digits = Integer.toString(num).toCharArray();
        int[] indices = new int[10];
        int result = num;
        for(int i = 0; i < digits.length; i++) {
            indices[digits[i] - '0'] = i;
        }
        for(int i = 0; i < digits.length-1; i++) {
            int digit = digits[i] - '0';
            for(int j = 9; j > digit; j--) {
                if(indices[j] > i) {
                    char temp = digits[i];
                    digits[i] = digits[indices[j]];
                    digits[indices[j]] = temp;
                    result = Integer.parseInt(new String(digits));
                    return result;
                }
            }
        }
        return result;
    }
}
  • 时间复杂度:O(n),空间复杂度:O(n)
作者:Koala_Tree 发表于2017/11/8 11:03:22 原文链接
阅读:27 评论:0 查看评论

hadoop2.8.2 YARN 架构

$
0
0

YARN的核心思想是把资源管理和任务调度/监控分离到不同的进程中。这个思想的实现依赖于全局的ResourceManager(RM)和每个应用的ApplicationMaster(AM)。
一个应用就是一个单独的作业或者DAG。

ResourceManager和NodeManager形成了数据计算框架,
ResourceManager是系统中所有应用的资源仲裁者。
NodeManager是个代理,它负责容器,监控资源使用(cpu,内存,硬盘,网络)随时通知给ResourceManager/Scheduler.
ApplicationMaster负责从ResourceManager取得资源以及和NodeManager一起工作用来执行和监控任务。

架构图如下:

这里写图片描述

ResourceManager有两个重要的组件:Scheduler(调度器)和ApplicationsManager(应用管理器)
Scheduler分配资源到不同的应用,Scheduler仅仅就是一个调度器,他不负责监控,跟踪应用的状态。
另外,他不保证重新执行失败的任务,不论是应用失败还是硬件失败。Scheduler根据应用的需求以及Container来执行调度工作。Container包含了内存,cpu,硬盘,网络等。

Scheduler拥有插入策略,这使得它可以在不同队列和应用之间分配集群资源。当前的调度器比如:CapacityScheduler和FairScheduler就是可插入的实例。

ApplicationsManager负责接口作业的提交和创建容器来执行应用的ApplicationMaster。并且会提供一个失败重启的服务。每个应用的ApplicationMaster都有从Scheduler获得容器资源的功能,并且跟踪状态监控过程。

hadoop-2.x的MapReduce保留和之前版本的API兼容性。这就是说所有MapReduce作业都运行在YARN之上。

YARN也提供资源预定的概念,通过ReservationSystem,这个组件用户可以指定一个配置文件,可配置资源超时时间和临时约束,以及预定资源保证重要作业的执行。ReservationSystem 跟踪资源超时,执行允许控制,动态指导调度器保证预定工作可行。

作者:maosijunzi 发表于2017/11/8 11:05:33 原文链接
阅读:51 评论:0 查看评论

LeetCode-153:Find Minimum in Rotated Sorted Array (可能旋转的排序数组中的最小值) -- medium

$
0
0

Question

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

note:

  • You may assume no duplicate exists in the array.

问题解析:

给定一个原本按照升序排序的数字,但在输入之前在某个结点上进行了数组的旋转,找到数组的最小值。

Answer

Solution 1:

二分法。

  • 因为给定的数组是按照升序排序好的,所以num[0]就是数组的最小值。但是在输入之前可能会在某个结点进行旋转,旋转之后最低位一定是大于最高位的;
  • 下面以旋转后进行分析:以二分法进行判断,如果中间位置大于高位,那么说明最小值处于midhigh之间;否则,说明最小值处于lowmid之间。
  • 一旦low位置的值小于high位置的值,也就是已经找到升序排序的子数组,那么low位置的值就是整个数组的最小值。
class Solution {
    public int findMin(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        if (nums.length == 1) return nums[0];

        int low = 0, high = nums.length - 1;
        while (nums[low] > nums[high]){
            int mid = (low + high) / 2;
            if (nums[mid] > nums[high]) low = mid + 1;
            else high = mid;
        }

        return nums[low];
    }
}
  • 时间复杂度:O(lgn),空间复杂度:O(1)
作者:Koala_Tree 发表于2017/11/8 12:38:31 原文链接
阅读:34 评论:0 查看评论

2013ACM/ICPC亚洲区南京站现场赛——题目重现 (HDU 4810) 二进制思想

$
0
0

Wall Painting

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3563    Accepted Submission(s): 1172


Problem Description
Ms.Fang loves painting very much. She paints GFW(Great Funny Wall) every day. Every day before painting, she produces a wonderful color of pigments by mixing water and some bags of pigments. On the K-th day, she will select K specific bags of pigments and mix them to get a color of pigments which she will use that day. When she mixes a bag of pigments with color A and a bag of pigments with color B, she will get pigments with color A xor B.
When she mixes two bags of pigments with the same color, she will get color zero for some strange reasons. Now, her husband Mr.Fang has no idea about which K bags of pigments Ms.Fang will select on the K-th day. He wonders the sum of the colors Ms.Fang will get with different plans.

For example, assume n = 3, K = 2 and three bags of pigments with color 2, 1, 2. She can get color 3, 3, 0 with 3 different plans. In this instance, the answer Mr.Fang wants to get on the second day is 3 + 3 + 0 = 6.
Mr.Fang is so busy that he doesn’t want to spend too much time on it. Can you help him?
You should tell Mr.Fang the answer from the first day to the n-th day.
 

Input
There are several test cases, please process till EOF.
For each test case, the first line contains a single integer N(1 <= N <= 103).The second line contains N integers. The i-th integer represents the color of the pigments in the i-th bag.
 

Output
For each test case, output N integers in a line representing the answers(mod 106 +3) from the first day to the n-th day.
 

Sample Input
4 1 2 10 1
 

Sample Output
14 36 30 8
 


【理解】

第k天 取 k 个数 亦或,  结果 加起来 作为第 k 的 答案,

立即想到 组合数,  杨辉三角;

单纯模拟的话, 不好模拟,  k 越大  取得数越多, 不知道 取哪一个;

想了下,  亦或性质,  遇到亦或的 题 总能跟二进制扯上关系,   亦或 1 0  才取 1   1 的个数 只有在 奇数 才会有贡献;

1     0001

2     0010

      10     1010

         1    0001                   1 0 2 2     用 组合数理解为,   转换成十进制,  k=1:   C(3,3) * C (1 .1)* 2^3  +   C(2,1)*(2,0) *2 ^1  +  C(2,1)*C(2,0)* 2^1  ==14




【代码】

注意 运算乘法 会爆 int  用long long int

//#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <math.h>
#include <cstring>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <stdlib.h>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <vector>
#define mem(a,b) memset(a,b,sizeof(a))
#define findx(x) lower_bound(b+1,b+1+bn,x)-b
#define FIN      freopen("input.txt","r",stdin)
#define FOUT     freopen("output.txt","w",stdout)
#define S1(n)    scanf("%d",&n)
#define SL1(n)   scanf("%I64d",&n)
#define S2(n,m)  scanf("%d%d",&n,&m)
#define SL2(n,m)  scanf("%I64d%I64d",&n,&m)
#define Pr(n)     printf("%d\n",n)
#define lson rt << 1, l, mid
#define rson rt << 1|1, mid + 1, r

using namespace std;
typedef long long ll;
const double PI=acos(-1);
const int INF=0x3f3f3f3f;
const double esp=1e-6;
const int maxn=1e6+5;
const int MAXN=50005;
const int MOD=1e6+3;
const int mod=1e6+3;
int dir[5][2]={0,1,0,-1,1,0,-1,0};

ll inv[maxn*2];
inline void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){ x=1; y=0; d=a; }else{ ex_gcd(b,a%b,d,y,x); y-=x*(a/b);};}
inline ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}
inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll ans=exgcd(b,a%b,x,y);ll temp=x;x=y;y=temp-a/b*y;return ans;}
inline ll lcm(ll a,ll b){ return b/gcd(a,b)*a;}
inline ll qpow(ll x,ll n){ll res=1;for(;n;n>>=1){if(n&1)res=(res*x)%MOD;x=(x*x)%MOD;}return res;}
inline ll inv_exgcd(ll a,ll n){ll d,x,y;ex_gcd(a,n,d,x,y);return d==1?(x+n)%n:-1;}
inline ll inv1(ll b){return b==1?1:(MOD-MOD/b)*inv1(MOD%b)%MOD;}
inline ll inv2(ll b){return qpow(b,MOD-2);}

int c[3010][3010];
void init()
{
    c[0][0]=1;
    for(int i=1;i<=1000;i++)
        for(int j=0;j<=i;j++)
        {
            c[i][j]= ((j==0)? 1: (c[i-1][j]+c[i-1][j-1])%mod);
        }

}
int ans[MAXN];
int num[64];
int main()
{
    int N;
    init();
    while(~scanf("%d",&N))
    {
        mem(ans,0);
        mem(num,0);
        int x;
        for(int i=1;i<=N;i++)
        {
             scanf("%d",&x);
             for(int i=0;i<=30;i++)
                //if( (1<<(i-1))&x )// 统计1 的个数
                  if( (x>>i)&1)
                    num[i]++;
        }
        for(int i=1;i<=N;i++)
        {
            for(int j=0;j<=30;j++)
                for(int k=1;k<=num[j]&&k<=i;k+=2)// 奇数贡献
                {
                    //printf("%d  %d  %d \n",c[num[j]][k],c[N-num[j]][i-k],1<<j);
                    ans[i]= (ans[i] + (ll) (((1<<j)%mod)*(ll)c[num[j]][k]%mod )*(ll)c[N-num[j]][i-k]%mod)%mod;
                }

        }
        printf("%d",ans[1]%mod);
        for(int i=2;i<=N;i++)
            printf(" %d",ans[i]%mod);
        printf("\n");
    }

    return 0;
}


123

作者:sizaif 发表于2017/11/8 13:00:47 原文链接
阅读:28 评论:0 查看评论
Viewing all 35570 articles
Browse latest View live


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