存档

‘运维知识集锦’ 分类的存档

HTTP返回码中30X对SEO的影响

2017年3月30日 评论已被关闭

HTTP返回码中30X对SEO的影响
http://www.blogjava.net/hankchen/archive/2012/09/23/388379.html
在网站中由于某种原因经常会用到页面跳转。这种跳转从底层原理来看,都是利用了HTTP协议的30X返回码来实现的。

常用的30X返回码有下面几种:
301 永久性跳转
302 暂时性跳转
304 Not Modified 文档未修改
305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取,属于HTTP 1.1新增内容
其中,对SEO产生影响的是前两个,即301和302。我就先详细的介绍这两个状态码的区别。

一、302
对用户而已,301,302是没有区别的。他们看到效果只是一个跳转,浏览器中旧的URL变成了新的URL。页面跳到了这个新URL指向的地方。
但是对于搜索引擎,302转向可能会有URL规范化及网址劫持的问题。可能被搜索引擎判为是作弊。网址规范化的内容可以参考这篇文章:http://www.chinamyhosting.com/seoblog/2006/04/10/url-canonicalization/
那么,网址劫持是怎么回事呢?
302重定向和网址劫持有什么关系呢?这要从搜索引擎如何处理302转向说起。从定义来说,从网址A做一个302重定向到网址B时,主机服务器的隐含意思是网址A随时有可能改主意,重新显示本身的内容或转向其他的地方。大部分的搜索引擎在大部分情况下,当收到302重定向时,一般只要去抓取目标网址就可以了,也就是说网址B。实际上如果搜索引擎在遇到302转向时,百分之百的都抓取目标网址B的话,就不用担心网址URL劫持了。

问题就在于,有的时候搜索引擎,尤其是Google,并不能总是抓取目标网址。为什么呢?比如说,有的时候A网址很短,但是它做了一个302重定向到B网址,而B网址是一个很长的乱七八糟的URL网址,甚至还有可能包含一些问号之类的参数。很自然的,A网址更加用户友好,而B网址既难看,又不用户友好。这时Google很有可能会仍然显示网址A。
由于搜索引擎排名算法只是程序而不是人,在遇到302重定向的时候,并不能像人一样的去准确判定哪一个网址更适当,这就造成了网址URL劫持的可能性。也就是说,一个不道德的人在他自己的网址A做一个302重定向到你的网址B,出于某种原因, Google搜索结果所显示的仍然是网址A,但是所用的网页内容却是你的网址B上的内容,这种情况就叫做网址URL劫持。你辛辛苦苦所写的内容就这样被别人偷走了。

二、301
当网页A用301重定向转到网页B时,搜索引擎可以肯定网页A永久的改变位置,或者说实际上不存在了,搜索引擎就会把网页B当作唯一有效目标。301的好处是:
(1)没有网址规范化问题。
(2)网页A的PR网页级别会传到网页B,这对SEO非常重要!

在实际操作过程中,我和同事对一个站点(www.woshuone.com)做了实验。结果发现不管是使用301还是302,很容易被Google “K掉”,取消跳转之后过一周左右的时间就又恢复了。看来搜索引擎蜘蛛现在对页面跳转还是比较反感,认为作弊的可能性大,宁可错杀一百也不放过一人!

分类: 互联网知识库 标签:

订阅基础:RSS、ATOM、FEED、聚合、供稿、合烧与订阅

2017年3月27日 评论已被关闭

订阅基础:RSS、ATOM、FEED、聚合、供稿、合烧与订阅

http://www.metsky.com/archives/361.html

很多网友对这类名词概念非常陌生,如果没用过FEED订阅,肯定还会对诸多网站显示的FEED聚合、订阅、ATOM等等非常郁闷,虽然这几个名字间的很多并非并列关系,天缘只是有意把它们放到一起,方便对比参考,因为天缘每次看到这些东西,都要楞一下才能反应过来,越发感觉中文演绎词的虚假和忽悠,其实不过是把人家网站的XML格式文件打个包、分个类然后输出,仅此而已,反而如果只说聚合会越看越糊涂。

一、RSS是什么

RSS(全称RDF Site Summary,网景的最初定义),RSS也是一种“类网页”描述语言(或叫文档格式),最初由网景公司(Netscape)定义,RSS只是有个相对统一的规范(注意只是规范),前途未卜(RSS 2.0的版权问题)。RSS作为网站内容分享的一种便利接口,创立随早,但只是从博客(BLOG)风行才开始广为流传。

关于RSS的更多介绍请参考维基百科:http://en.wikipedia.org/wiki/RSS(英文),http://zh.wikipedia.org/zh-cn/RSS(中文)

二、ATOM是什么

由于RSS前途未卜,而且RSS标准发展存在诸多问题或不足,于是ATOM横空出世,可以先简单的理解为RSS的替代品。ATOM是IETF的建议标准,Atom Syndication Format是基于XML格式(RFC 4287),Atom Publishing Protocol则是基于HTTP协议格式(RFC 5023)。

RSS与ATOM比较,请参考:ATOM

三、FEED是什么

FEED(中文发音“肥的”、“废了”都可以)只是一个中间过程,所以全世界没人能给FEED下一个准确的定义,所以还是按照天缘的观点理解,大家不用关心FEED的定义,其实FEED什么都不是。如果非得给个说法,最好还是放到英文环境下理解似乎更加合理,FEED其实就是RSS(或ATOM)和订阅用户之间的“中间商”,起到帮忙批发传递信息的作用。所以,FEED的常见格式就是RSS和ATOM,网络上说的FEED订阅,更确切的说法应该仍然是RSS或ATOM订阅。

FEED更多介绍:http://en.wikipedia.org/wiki/Feed

四、什么是订阅

订阅跟普通大家订阅报刊类似,不过几乎所有网站的RSS/ATOM订阅都是免费的,也有一些“非主流”一族要收费订阅的,当然FEED订阅只是网络上的信息传递,一般不涉及实体资料传递,所以大家遇到喜欢的网站,并且也喜欢使用在线或离线阅读,尽可订阅,而且可以随时退订,实际订阅一般有如下几种方式:

在线订阅:

一般有浏览器、网页、邮件等方式,在线的最多,比如Google Reader、鲜果、抓虾、Netvibes、雅虎、有道等等,如果是订阅到邮箱,只需要输入个人邮箱就可以了,然后自会有FEED“中间商”把最新的订阅内容发到您的邮箱。另外,比如FIREFOX等浏览器也有订阅功能,比如访问天缘博客,地址栏回有订阅图标提示,只需要点击即可订阅。

离线订阅:

一般都是安装到本机的订阅软件,也称RSS阅读器、Feed阅读器或新闻阅读器等等,比如POTU、新闻蚂蚁、易搜比等等,反正就是个下载并解析RSS/ATOM的软件,然后把文件中的内容提取并展示出来。

五、其它被搞复杂的一些概念

FEED聚合是什么——聚合就是FEED

FEED供稿是什么——还是FEED,但按照上文介绍FEED只是一个中间过程,所以聚合和供稿一样理解。

FEED合烧是什么——如果你有多个网站,一般会对应多个RSS,然后让FEED“中间商”帮忙合做成一个,这样用户只需要订阅一个就可以。

六、最常用的FEED管理服务商

对于站长,肯定对以下几个网址都很熟悉,普通用户就不用关心,但是作为站长还是需要考虑找个好点的FEED“中间商”,当然如果你的网站或博客没有RSS或ATOM输出也不用考虑:

http://www.feedburner.com/,该网站经常撞墙,2007年被GOOGLE 1亿美金收购。

http://www.feedsky.com,国产FEED管理服务商,还不错,虽然也是三天两头有点小问题。

注:

1、文中部分概念解释纯粹是为了化繁为简,方便理解而提炼,如有不当,欢迎留言指出修正。

2、本文图片来源GOOGLE图片搜索。

分类: 技术周边大全 标签:

TCP,IP,HTTP,SOCKET区别和联系

2017年2月15日 评论已被关闭

TCP,IP,HTTP,SOCKET区别和联系

网络由下往上分为:        对应

物理层–

数据链路层–

网络层–IP协议

传输层–TCP协议

会话层–

表示层和应用层–HTTP协议

 

socket则是对TCP/IP协议的封装和应用(程序员层面上)。也可以说,TPC/IP协议是传输层协议,主要解决数据 如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:

“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如 果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也 可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”

我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现 只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、 listen、connect、accept、send、read和write等等。网络有一段关于socket和TCP/IP协议关系的说法比较容易理 解:

“TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。”

总结一些基于基于TCP/IP协议的应用和编程接口的知识,也就是刚才说了很多的 HTTP和Socket。

CSDN上有个比较形象的描述:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。

下面是一些经常在笔试或者面试中碰到的重要的概念,特在此做摘抄和总结。

一、什么是TCP连接的三次握手

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭 连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客 户端交互,最终确定断开)

二、利用Socket建立网络连接的步骤

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3。连接确认:当服 务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端 确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

三、HTTP链接的特点

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

四、TCP和UDP的区别

1。TCP是面向链 接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的 可靠性;而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重 发,所以说UDP是无连接的、不可靠的一种数据传输协议。

2。也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。

知道了TCP和 UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP 的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了TCP所无法达到的传输效率。

PowerPC架构与X86架构

2017年2月14日 评论已被关闭

PowerPC架构与X86架构
http://blog.sina.com.cn/s/blog_6c9670bb0101slkh.html
PowerPC架构
PowerPC是一种精简指令集(RISC)架构的中央处理器(CPU),其基本的设计源自IBM(国际商用机器公司)的POWER(Performance Optimized With Enhanced RISC;《IBM Connect电子报》2007年8月号译为“增强RISC性能优化”)架构。POWER是1991年,Apple(苹果电脑)、IBM、Motorola(摩托罗拉)组成的AIM联盟所发展出的微处理器架构。PowerPC是整个AIM联盟平台的一部分,并且是到目前为止唯一的一部分。但苹果电脑自2005年起,将旗下电脑产品转用Intel CPU。

PowerPC的历史可以追溯到早在1990年随RISC System/6000一起被介绍的IBM POWER架构。该设计是从早期的RISC架构(比如IBM 801)与MIPS架构的处理器得到灵感的。

1990年代,IBM、Apple和Motorola开发PowerPC芯片成功,并制造出基于PowerPC的多处理器计算机。PowerPC架构的特点是可伸缩性好、方便灵活。第一代PowerPC采用0.6微米的生产工艺,晶体管的集成度达到单芯片300万个。1998年,铜芯片问世,开创了一个新的历史纪元。2000年,IBM开始大批推出采用铜芯片的产品,如RS/6000的X80系列产品。铜技术取代了已经沿用了30年的铝技术,使硅芯片多CPU的生产工艺达到了0.20微米的水平,单芯片集成2亿个晶体管,大大提高了运算性能;而1.8V的低电压操作(原为2.5V)大大降低了芯片的功耗,容易散热,从而大大提高了系统的稳定性。
X86架构
30年多前的1978年6月8日,Intel发布了新款16位微处理器“8086”,也同时开创了一个新时代:x86架构诞生了。 x86指的是特定微处理器执行的一些计算机语言指令集,定义了芯片的基本使用规则,一如今天的x64、IA64等。

事实上,8086处理器发布之初并没有获得太多关注,开始也没有被大范围采用,但它在PC业界的地位怎么形容都不为过,这就是因为它带来了x86。它不仅成就了Intel如日中天的地位,也成为了一种业界标准,即使是在当今强大的多核心处理器上也能看到x86的身影。在30年的发展史中,x86家族不断壮大,从桌面转战笔记本、服务器、超级计算机、编写设备,期间还挫败或者限制了很多竞争对手的发展,让不少处理器厂商及其架构技术成为历史名字,即使有些封闭发展的也难以为继,比如苹果就已经放弃PowerPC了。

当然,我们不能忘了x86-64和EM64T的斗争。2003年,AMD推出了业界首款64位处理器Athlon 64,也带来了x86-64,即x86指令集的64位扩展超集,具备向下兼容的特点。当时Intel也在推行64位技术,但其IA64架构并不兼容x86,只是用在服务器处理器Itanium上。为了和AMD展开竞争,Intel也在2004年推出了自己的64位版x86,也就是EM64T。对此,AMD和Intel互相指责对方,但无论如何至少推广了64位技术的发展和普及,也让x86技术得以继续发扬光大。加州大学伯克利分校计算机科学教授、RISC发明人之一David Patterson表示:“这证明,x86指令集的弹性完全可以拿来对付Intel,所以即使Intel统治了整个市场,其他公司依然可以改变x86的发展方向。”

x86是一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合,X与处理器没有任何关系,它是一个对所有*86系统的简单的通配符定义,例如:i386, 586,奔腾(pentium)。由于早期intel的CPU编号都是如8086,80286来编号,由于这整个系列的CPU都是指令兼容的,所以都用X86来标识所使用的指令集合如今的奔腾,P2,P4,赛扬系列都是支持X86指令系统的,所以都属于X86家族 。X86指令集是美国Intel公司为其第一块16位CPU(i8086)专门开发的,美国IBM公司1981年推出的世界第一台PC机中的CPU–i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器则另外使用X87指令,以后就将X86指令集和X87指令集统称为X86指令集。虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486直到今天的Pentium 4(以下简为P4)系列,但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。

另外除Intel公司之外,AMD和Cyrix等厂家也相继生产出能使用X86指令集的CPU,由于这些CPU能运行所有的为Intel CPU所开发的各种软件,所以电脑业内人士就将这些CPU列为Intel的CPU兼容产品。由于Intel X86系列及其兼容CPU都使用X86指令集,所以就形成了今天庞大的X86系列及兼容CPU阵容。当然在目前的台式(便携式)电脑中并不都是使用X86系列CPU,部分服务器和苹果(Macintosh)机中还使用美国DIGITAL(数字)公司的Alpha 61164和PowerPC 604e系列CPU。

Intel从8086开始,286、386、486、586、P1、P2、P3、P4都用的同一种CPU架构,统称X86。英特尔推出X86架构已满30年了,同486相比,Pentium向前迈进了一大步, 而PⅡ的前进步伐则没有这么大了,X86 CPU的发展似乎已到了尽头。 英特尔非常清楚,是X86指令集限制了CPU性能的进一步提高,因此,他们正同惠普共同努力开发下一代指令集架构(Instruction Set Architecture ,ISA): EPIC(Explicitly Parallel Instruction Computing,显性并行指令计算)。对英特尔而言, IA-64(英特尔的64位架构)是下一个10到15年的架构。新的ISA将使英特尔摆脱X86架构的限制,从而设计出超越所有现有RISC CPU和X86 CPU的新型处理器。那么EPIC的先进之处在什么地方呢?为什么英特尔会放弃使它成为芯片巨人的X86架构呢? 一、IA-32的问题 我们知道,工程师可以通过提高每个时钟的指令执行数来提高性能,英特尔新的指令集的首要目的在于,让指令更容易解码,更容易并行执行。这样就可以不受限制地开发新型处理器。 但是,对工程师而言,兼容8086的X86指令集一直是必须完成的任务。毕竟,兼容前代产品是使英特尔成长壮大起来的关键因素,而且还可以保护用户原先的投资和使用数以百万计应用软件。

既然如此,为什么又要放弃整个X86指令集重新开始呢?X86的不足在什么地方?
(1)可变的指令长度 X86指令的长度是不定的,而且有几种不同的格式,结果造成X86 CPU的解码工作非常复杂,为了提高CPU的工作频率,不得不延长CPU中的流水线,而过长的流水线在分支预测出错的情况下,又会带来CPU工作停滞时间较长的弊端。
(2)寄存器的贫乏 X86指令集架构只有8个通用寄存器,而且实际只能使用6个。这种情况同现代的超标量CPU极不适应,虽然工程师们采用寄存器重命名的技术来弥补这个缺陷,但造成了CPU过于复杂,流水线过长的局面。
(3)内存访问 X86指令可访问内存地址,而现代RISC CPU则使用LOAD/STORE模式,只有LOAD和STORE指令才能从内存中读取数据到寄存器,所有其他指令只对寄存器中的操作数计算。在目前CPU的速度是内存速度的5倍或5倍以上的情况下,后一种工作模式才是正途。
(4)浮点堆栈 X87 FPU是目前最慢的FPU,主要的原因之一就在于X87指令使用一个操作数堆栈。如果没有足够多的寄存器进行计算,你就不得不使用堆栈来存放数据,这会浪费大量的时间来使用FXCH指令(即把正确的数据放到堆栈的顶部)。
(5)4GB限制 这似乎不是问题,但是,在6年前,主流PC只有4MB内存,而目前的绝大部分PC装备了64MB以上的内存,是以前的16倍,所以,在下一个十年,PC内存突破1GB绝对不会令人惊讶,而且目前的大型服务器已经使用了1GB以上的内存,突破4GB内存的情况很快就会出现。
(6)芯片变大 所有用于提高X86 CPU性能的方法,如寄存器重命名、巨大的缓冲器、乱序执行、分支预测、X86指令转化等等,都使CPU的芯片面积变得更大,也限制了工作频率的进一步提高,而额外集成的这些晶体管都只是为了解决X86指令的问题。

为何Linux比Windows更安全linux

2017年1月22日 评论已被关闭

为何Linux比Windows更安全linux

http://xukaizijian.blog.163.com/blog/static/1704331192011021112815453/
很多人都知道Linux系统的安全性比微软Windows系统更高。但是,为什么会是这样?这种说法到底有没有道理?却很少有人能回答得出来。
为了搞清楚这个问题,首先,我们必须要明确“安全性”的定义。其实,绝大多数人都犯了同样一个错误,那就是孤立地认为某个产品比较安全。比如,Linux系统要比微软Windows系统更加安全;或是,开放源代码的Firefox网络浏览器要比微软IE浏览器更加安全。不、不、不,你们都错了,安全性并不是针对某个产品本身而言的。它是一整套以用户为核心的体系。安全性指的是在用户和软件之间,通过适当的交互方式,所达成的一种活跃状态。漏洞补丁管理仅仅是这套系统的一个重要方面。而其它可能更为重要的方面还包括:用于补丁管理的恰当工具、健壮的默认设置,达成安全的多层次运作体系,以及时刻将用户看作是安全性的第一道、也是最后一道防线的设计理念。
当你有了这种思想之后,我就可以向你解释,为什么在一般情况下,一位有经验的用户在使用Linux系统要比使用Windows系统要更加安全:浏览器是最薄弱的一个环节,我完全可以删除掉它,用其它网络浏览器来替代,比如说Opera.而在Windows系统当中,即便是再不满意,我也无法替换微软的Internet Explorer网络浏览器。

1. 更加卓越的补丁管理工具:
在微软的Windows系统中,自动更新程序只会升级那些由微软公司官方所提供的组件。而第三方的应用程序却不会得到修补。从而,第三方的应用程序可能会给你的系统带来大量的安全隐患。你在使用Real player播放器吗?你需要单独升级它。在使用Flash?你还是需要单独进行升级。依此类推,对于电脑上所有的应用程序,你都需要定期地对每一款软件单独进行更新升级。这种方法非常的繁琐,并且让人心烦,而绝大多数用户很快就将这项工作忘到九霄云外去了。
而在Linux系统中,当你在自动更新系统的时候,它将同时升级系统中所有的软件。在Ubuntu系统中,你所下载的任何软件产品,都会出现在系统的程序仓库当中,要升级它,你只需要用鼠标轻轻一点。而在其它Linux发行版本中,如果下载的软件并没有出现在系统的程序仓库中,要添加它也是非常的简便。这样的设计,极大地提高了用户实时更新系统的积极性。
2. 更加健壮的默认设置:
Linux系统天生就被设计成一个多用户的操作系统.因此,即便是某个用户想要进行恶意破坏,底层系统文件依然会受到保护.假如,在非常不幸的情况下,有任何远程的恶意代码在系统中被执行了,它所带来的危害也将被局限在一个小小的局部之中。
与之形成鲜明对照的是微软的Windows XP系统。在这里,用户会默认以系统管理员的身份登录,而在系统中所发生的任何损害,都会迅速蔓延到整个系统之中。微软最新的Windows Vista系统让用户在默认设置下以受限用户的身份登录,因此它要比自己的前任更加安全一点。
3. 模块化设计:
Linux系统采用的是模块化设计。这表示,如果不需要的话,你可以将任何一个系统组件给删除掉。由此而带来的一个好处是,如果用户感觉Linux系统的某个部分不太安全,他就可以移除掉这个组件。这对于Windows系统来说,简直是不可思议的。比如说,如果我感觉对于自己的Linux系统来说,Firefox网络浏览器是最薄弱的一个环节,我完全可以删除掉它,用其它网络浏览器来替代,比如说Opera.而在Windows系统当中,即便是再不满意,我也无法替换微软的Internet Explorer网络浏览器。
4. 更棒的“零日攻击(zero-day attacks)”防御工具:
即便你能确保自己的系统实时更新,这也并不代表着万无一失!零日攻击(zero-day attacks,指的是在软件生产厂商发布针对漏洞的更新补丁之前,就抢先利用该漏洞发动网络攻击的攻击方式)正在变得日益猖獗。此外,一项调查研究也显示:对于攻击者来说,他们只需要6天时间就能够开发出针对漏洞的恶意攻击代码,而软件生产厂商们却需要花费长得多的时间才能够推出相应的更新补丁。因此,一套睿智的安全策略在防御零日攻击方面至关重要。微软的Windows XP系统并没有提供这样的一套防御机制。而新的Vista系统,在保护模式状态之下,虽然有一定效果,但是也只能对针对Internet Explorer网络浏览器的攻击提供一点有限的保护。
与之相对应的是,无论是何种类型的远程遥控代码攻击,AppArmor或SELinux,都能够为系统提供细致而周全的保护。有越来越多的主流Linux发行版本,在系统中都默认整合了Apparmor(例如,SuSE、Ubuntu Gutsy)或者SELinux(Fedora、Debian Etch、Yellow Dog)。即便是对于其它发行版本来说,用户也可以非常方便地从网络上下载并安装这两套软件。
5. 开放源代码构架:
在Linux系统中,当谈论到系统安全性的时候,用“你所看到的,就是你所得到的”这句话来形容,是再合适也不过了。开放源代码意味着,任何可能的软件漏洞都将被“无数双眼睛”所看到,并且得到尽可能快的修复。而更重要的是,这同时也意味着,在这里没有任何被隐藏的修复措施。作为用户,只要你有心,就可以找出自己系统所存在的安全问题,并采取相应的防范措施以应对潜在的安全威胁,即便是在此时该漏洞还没有被修补。
而在Windows世界当中,有很多安全问题都是被掩盖起来的。微软公司内部所发现的软件漏洞,是不会让外界所知晓的,而他们所想的只是在下一个更新升级包中对它进行默默地修补就可以了。虽然这样做可以让被公开的软件漏洞数目更少,并让某些漏洞不会被大规模地利用,但这种做法同时也蒙蔽了用户的双眼。由此所导致的结果是,用户很可能不会积极地对系统进行升级,因为他不了解自己的系统存在着什么样的漏洞,以及这些漏洞的危害大小,结果反而会成为恶意攻击的牺牲品。
6. 多样化的系统环境:
Windows的系统环境可以说是千篇一律。这种巨大的一致性让攻击者们在编写恶意代码、病毒或其它诸如此类的一些东西时显得得心应手。反过来,看一看Linux系统世界。在这里,应用程序可以是。deb、。rpm,或源代码,以及其它诸如此类的等等。这种差异性让攻击者们很难在Linux系统身上获得像Windows系统那样的广泛影响。
最后,但却是最重要的,你必须时刻牢记,系统的安全性最终还是掌握在用户手中的。一位有经验的用户可以安全地使用Windows 98 操作系统,而一位无知的用户则可以让基于OpenBSD的系统都变得千疮百孔。因此,归根结蒂,人才是系统安全的核心,人才是一切的根本。要牢记这一点!

分类: 技术周边大全 标签:

对snat, dnat, 回环的一点认识

2017年1月19日 评论已被关闭

对snat, dnat, 回环的一点认识

其实所谓的snat, dnat就是对数据包的源地址和目的地址进行修改,并且保存修改前后的映射关系,并且根据需要进行还原操作。

snat: 出去的时候改变源地址(snat),回来的时候改变目的地址(un_snat)

dnat: 进来的时候改变目的地址(dnat),出去的时候改变源地址(un_dnat)

而所谓的回环,其实是同时用到了snat和dnat,例如:

src 192.168.1.2 (client), dnat 10.14.11.177 (firewall), dst 192.168.2.2 (HTTP Server)

添加回环规则后,从src对10.14.11.177进行请求,然后转到dst,随后进行相反操作,最后src客户端收到源为10.14.11.177,目的包为自身的数据包,因此会正确接收。过程如下:

  1. 首先pre,进行目的地址的转换,开始192.168.1.2->10.14.11.177,转换后:192.168.1.2->192.168.2.2 (pre)
  2. 然后post,进行源地址的转换,到达真正的http server;post:192.168.1.2->192.168.2.2,转换后10.14.11.177 (post)->192.168.2.2
  3. dst进行请求回复,进行pre的反操作,进行源地址的转换:192.168.2.2->10.14.11.177,转换后:10.14.11.177(un_pre)->10.14.11.177
  4. 进行post的反操作,进行目的地址的转换:进入un_post:10.14.11.177 ->10.14.11.177 ,转换后:10.14.11.177 ->192.168.1.2 (un_post)
分类: 网络工程师 标签: ,

电脑出现NSIS Error错误提示的解决方法

2017年1月18日 评论已被关闭

电脑出现NSIS Error错误提示的解决方法
http://www.3lian.com/edu/2012/04-28/26495.html
大家在安装或打开一些程序的时候,会出现NSIS Error错误提示,这种情况很容易让人误会是系统出现了错误,或仅仅是该程序安装文件损坏的原因。
中文意思是:运行一个用Nullsoft Scriptable Install System (NSIS)建立的程序常会发生这种错误,起因可能是下载来的文件不完整,或存放该程序的磁盘区坏了,也可能因病毒。无论何种原因,建议你联系程序的作者,重新下载,再安装。或命令行中附加参数 /NCRC 试试安装(不推荐此法)。
电脑出现NSIS Error错误提示的解决方法 三联教程
NSIS错误
你正使用的安装程序已经被破坏或不完整。这可能是由于损坏的磁盘,或是下载失败,或是病毒导致的结果。你可以联系本安装程序的程序员来获取新的软件拷贝。
解决思路:
1.尝试清空浏览器缓存,在IE选项中,清空IE临时文件。或使用清理专家百宝箱,清除系统垃圾文件,实现这个功能。
2.尝试禁用任何下载加速器或下载工具,尝试使用IE另存为进行重新下载。
3.更新杀毒软件,并进行杀毒。出现NSIS错误,被感染型病毒破坏的可能性较大。推荐重启到带命令行的安全模式杀毒。
4.尝试关闭杀毒软件和网络防火墙。
5.使用磁盘扫描程序或chkdsk扫描并修复磁盘错误。
6.从另一台正常计算机重新下载安装包,再复制到曾出故障的电脑上。
7.还有一种极端的方法:单击开始,运行,输入CMD,进入命令行。浏览到NSIS安装文件路径,执行程序名.exe /ncrc,安装程序将不作自身校验,强制进行安装。
8.另外,也有网友说NSIS错误,与内存条故障有关。建议使用硬件检测程序检查内存条的性能。可以尝试拔下内存条,重插一次。
9.也有朋友是在中文系统安装英文软件遇到这个故障,将系统缺省语言修改为英文后,安装成功。另外,建议不要把安装源保存在中文路径,安装目标,也最好不使用中文。

分类: 桌面支持工程师 标签:

墙壁网线插座接法详细图解

2017年1月18日 评论已被关闭

墙壁网线插座接法详细图解

http://www.jb51.net/network/73343.html

EIA/TIA的布线标准中规定了两种双绞线的线序568A与568B

T568A的接法是:绿白、绿、橙白、蓝、蓝白、橙、棕白、棕
T568B的接法是:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕
A和B的不同之处其实就是1和3、2和6号线的位置互换一下。

100BASE-T4 RJ-45对双绞线的规定如下:

1、2用于发送,3、6用于接收,4、5,7、8是双向线。
1、2线必须是双绞,3、6双绞,4、5双绞,7、8双绞。

 

A    橙白        蓝白                                                    B   绿白           蓝白
橙            蓝                                                            绿              蓝
综白         绿白                                                         综白           橙白
综            绿                                                            综               橙

插座里虽然有两边都有有颜色,有不少人甚至连一些电工也不会看,,有分A跟B,,看得糊里糊涂得,因为有些楼房还没有接光纤,所以暂时都还没有用到墙壁网线插座,下面我们来给大家讲一下墙壁网线插座接法:

请看下面这个示意图~

 

答案: 按B类做,根据上面提示的颜色,把网线相对应颜色的线用打线钳卡下去。

这样就可以了,然后有电脑测试一下,基本上就可以了

网线模块制作 几种网线的水晶头接法图解

我按了这普通 “正常的”网线模块,像以下的这种的顺序来按,也是不通,显示没插入网线..测了好几次,后来我同事昨天去看一下,也搞了很久,2个小时左右回来了,我问 他怎么搞的,他说要相反就通了…没什么注明的。。单单一个模块的(空白的,生产商也太简便了一点吧)。。。我晕了,大家以后要买网线模块就买以下介绍 的这种哈(这种是比较正规的)。哈哈

网线模块制作开始:
先来认识一下网线模块,这个就是装在家里网线插座后面的模块 ,左右两面,上面A、B表示的是两种不同的打线方式,任选一种即可。

再来认识一下打线的工具:

下面开始打线了,首先还是先把网线的外皮剥掉,这次可以剥得长点儿,便于后面打线。露出了四组双绞线:

将线分成左右两组,按照A或者B的方式把相应颜色的线卡在模块相应的位置:

在打线之前我们再来认识一下这个打线的工具:这是打线工具的头,金属的一边(下图右边)是一个类似剪刀的头,可以剪掉多余的先头。

下面开始打线,用工具压住模块和线,用力压下去,将线卡在模块里面,并把多余的先头剪掉。

将其他的线都按照一样的方式打好

所有的线都打好后就可以将模块装到86盒面板上了

1)一一对应接法。即双绞线的两端芯线要一一对应,即如果一端的第1脚为绿色,另一端的第1脚也必须为绿色的芯线,这样做出来的双绞线通常称之为“直连线”。但要注意的是4个芯线对通常不分开,即芯线对的两条芯线通常为相邻排列,这个,由于太简单且随意,图上未标出。

这种网线一般是用在集线器或交换机与计算机之间的连接。

(2)1-3、2-6交叉接法。虽然双绞线有4对8条芯线,但实际上在网络中只用到了其中的4条,即水晶头的第1、第2和第3、第6 脚,它们分别起着收、发信号的作用。这种交叉网线的芯线排列规则是:网线一端的第1脚连另一端的第3脚,网线一端的第2脚连另一头的第6脚,其他脚一一对 应即可。这种排列做出来的通常称之为“交叉线.

例如,当线的一端从左到右的芯线顺序依次为:
白绿、绿、白橙、蓝、白蓝、橙、白棕、棕,
另一端从左到右的芯线顺序则应当依次为:
白橙、橙、白绿、蓝、白蓝、绿、白棕、棕。

这种网线一般用在集线器(交换机)的级连、服务器与集线器(交换机)的连接、对等网计算机的直接连接等情况下。

经常用于两台电脑直接互连传送数据!

(3)100M接法。这是一种最常用的网线制作规则。所谓100M接法,是指它能满足100M带宽的通讯速率。它的接法虽然也是一一对应,但每一脚的颜色是固定的,

具体是:第1脚——橙白、第2脚——橙色、第3脚——绿白、第4脚——蓝色、第5脚——蓝白、第6脚——绿色、第7脚——棕白、第8脚——棕色,

从中可以看出,网线的4对芯线并不全都是相邻排列,第3脚、第4脚、第5脚和第6脚包括2对芯线,但是顺序已错乱。

这种接线方法也是应用于集线器(交换机)与工作站计算机之间的连接,也就是“直连线”所应用的范围。

EIA/TIA的布线标准中规定了两种双绞线的线序568A与568B

T568A的接法是:绿白、绿、橙白、蓝、蓝白、橙、棕白、棕
T568B的接法是:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕
A和B的不同之处其实就是1和3、2和6号线的位置互换一下。

100BASE-T4 RJ-45对双绞线的规定如下:

1、2用于发送,3、6用于接收,4、5,7、8是双向线。
1、2线必须是双绞,3、6双绞,4、5双绞,7、8双绞。

分类: 技术周边大全 标签:

Win10系统中的backgroundTaskHost总是容易占用大量cpu怎么办?

2016年12月10日 评论已被关闭

Win10系统中的backgroundTaskHost总是容易占用大量cpu怎么办?

http://www.udangjia.com/article/1852.html
  其实咱们的电脑用着很卡的原因是很多的,比如说电脑中开启了太多的程序,开启了太多的浏览器窗口,或者说咱们电脑的内存不够了等等,这些都容易造成咱们电脑运行起来的不流畅。但是最近有一位使用win10系统的用户也发现了电脑不流畅的情况,经检查,是因为电脑的CPU全部被一个名为backgroundTaskHost的进程占据了,那么这个进程是干嘛用的?咱们可以直接结束掉这个进程吗?下面,小编就来详细的介绍一下吧!

相关推荐:U盘装win10系统教程
1.首先,咱们需要介绍一下,这个backgroundTaskHost进程属于照片应用的进程,所以咱们在解决问题的时候,也需要进入到win10系统中的照片应用中。第一步,咱们需要按下win10电脑键盘上的windows键,然后从打开的开始菜单中进入到照片应用中。
2.在打开的照片应用中,咱们点击左下角的设置按钮,之后就可以打开如下图中所示的窗口了。

3.咱们可以看到,其中自动增强我的照片下的两个功能都是开启的,咱们需要将这两个功能的状态都调成关闭的状态,完成之后,咱们直接退出窗口就可以了。

centos6.5 iptables实现端口转发

2016年11月12日 评论已被关闭

centos6.5 iptables实现端口转发

http://www.cnblogs.com/apexchu/p/4255551.html

将本地接口IP 61.144.a.b 的3389端口 转发到 116.6.c.d的3389      (主要访问到61.144.a.b的3389端口,就会跳转到116.6.c.d的3389)

【步骤】
1、 首先应该做的是/etc/sysctl.conf配置文件的 net.ipv4.ip_forward = 1 默认是0    这样允许iptalbes FORWARD。
2、 service iptables stop  关闭防火墙
3、 重新配置规则

iptables -t nat -A PREROUTING –dst 61.144.a.b -p tcp –dport 3389 -j DNAT –to-destination 116.
6.c.d:3389

iptables -t nat -A POSTROUTING –dst 116.6.c.d -p tcp –dport 3389 -j SNAT –to-source 61.144.a.b

service iptables save

将当前规则保存到 /etc/sysconfig/iptables
若你对这个文件很熟悉直接修改这里的内容也等于命令行方式输入规则。
5、 启动iptables 服务, service iptables start

可以写进脚本,设备启动自动运行;

# vi /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

sh /root/myshipin.log
———————————————————————
vi myshipin.log
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.

iptables -F -t nat
iptables -t nat -A PREROUTING –dst 61.144.a.b -p tcp –dport 3389 -j DNAT –to-destination 116.6.c.d:3389
iptables -t nat -A POSTROUTING –dst 116.6.a.b -p tcp –dport 3389 -j SNAT –to-source 61.144.c.d
~
—————————————————————-
TCP

iptables -t nat -A PREROUTING –dst 61.144.a.b -p tcp –dport 9304 -j DNAT –to-destination 10.94.a.b:9304
iptables -t nat -A POSTROUTING –dst 10.94.a.b -p tcp –dport 9304 -j SNAT –to-source 61.144.a.b

UDP
iptables -t nat -A PREROUTING –dst 61.144.a.b -p udp –dport 9305 -j DNAT –to-destination 10.94.a.b:9305
iptables -t nat -A POSTROUTING –dst 10.94.a.b -p udp –dport 9305 -j SNAT –to-source 61.144.a.b

另:

iptables配置文件的位置:/etc/sysconfig/iptables 外网地址发变化在配置文件里修改就可以了。

解决:操作无法完成(错误0x00000709)。再次检查打印机名称,并确保打印机已连接到…

2016年11月11日 评论已被关闭

解决:操作无法完成(错误0x00000709)。再次检查打印机名称,并确保打印机已连接到…

http://blog.csdn.net/lotusyangjun/article/details/6851610/

使用打印机电脑的计算机名即可发现。

 

上午同时说,网络打印机打印不了,于是首先看一下打印服务器IP是不是给换了,结果没换。

接着尝试重新添加一下网络打印机,结果问题来了,连不上,提示:

操作无法完成(错误0x00000709)。再次检查打印机名称,并确保打印机已连接到网络。(xp系统本人机器提示)

操作无法完成.键入的打印机名不正确,或者指定的打印机没有连接到服务器上.有关详细信息,请单帮助

然后网上查了查资料,说法倒有N多,说什么看看打印机有没有共享,修改共享名,重新安装打印机驱动,开始 Guest帐号,关闭防火墙。。。

然而发现,如果不通过IP来访问网络打印机,而是通过机器名来访问,到可以连上,但是通过机器名并不是那么容易访问的,我的机器上可以访问到,但到 同事的机器上又访问不了(可以通过“ping 机器名”来测试是否可以访问),至于原因,这个就比较复杂,谁都说不明白,所有没再钻下去。

网上还有一种解决办法就是不要直接通过IP或机器名来访问,而是通过“浏览打印机”来访问,这个在我的机器上成功了一次,但后来就行不通了,浏览不到打印机。

整了一个上午,终于发现最终解决办法了:

就是重启一下服务器端的Print Spooler服务就行了,这么简单!

[控制面板 –  服务 –  Print Spooler]

分类: 技术周边大全 标签:

一万小时定律

2016年6月20日 评论已被关闭

一万小时定律
http://www.cnblogs.com/shined/p/4410303.html
人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。“
”他将此称为“一万小时定律”。要成为某个领域的专家,需要10000小时,按比例计算就是:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。这就是一万小时定律。
“一万小时法则”的关键在于,一万小时是最底限,而且没有例外之人。没有人仅用3000小时就能达到世界级水准;7500小时也不行;一定要10000小时——10年,每天3小时——无论你是谁。这等于是在告诉大家,一万小时的练习,是走向成功的必经之路。
音乐神童莫扎特,在6岁生日之前,他音乐家的父亲已经指导他练习了3500个小时。到他21岁写出最脍炙人口的第九号协奏曲时,可想而知他已经练习了多少小时。象棋神童鲍比·菲舍尔,17岁就奇迹般奠定了大师地位,但在这之前他也投入了10年时间的艰苦训练。
在大量的调查研究中,科学家发现,无论是在对作曲家、篮球运动员、小说家、钢琴家还是象棋选手的研究中,这个数字——一万,反复出现。
这是“一万小时法则”被提出的事实论据。
其实对于成功者来说,不管练习的过程枯燥与否,有趣与否,他们都必将付出远远超出常人的代价。心甘情愿花上一万个小时来打通任督二脉的人,大都不是寻常之辈。
从心理学上分析,用上千上万小时来做一件事并不是一件理性的事。常常会产生困扰,还会被人家认为是死心眼。但这种极端的感受却正是才能的组成成分,因为这里包括我们不能完全控制的力量;我们的情感、我们的个性、我们的激情。这是维持与激发激情的钥匙。

路在脚下

分类: 技术周边大全 标签:

让测试团队慢慢死去!

2016年6月16日 评论已被关闭

让测试团队慢慢死去!
http://blog.csdn.net/namesliu/article/details/8589522
让我们先由2个问题引出今天的话题,第一,为什么选择做测试?第二,做测试的发展又如何?
第一个问题,你为什么要选择做测试,我敢说十个人有九个不会说实话,什么测试能够让我开阔视野啦,测试同样也需要很好的技术啦,,,全是虚伪的借口。真正地答案只有一个,测试的收入高,要求低!(注意是相对你的能力比来说收入算高,因为你要是选择做开发,肯定不如现在的收入)不管你愿不愿意承认你都得承认,这是绝大部分测试入这一行的原因。
第一个问题的答案决定了一个事实,测试团队的发展永远不可能像开发团队一样,随着公司的发展而发展,为什么呢?成本! 世界上没有傻逼的公司,你的公司之所以能够存在,是因为它善于控制成本。站在管理层来看,测试团队是一个”显著”消耗成本而又不”显著”创造价值的团队。
第二个问题,测试的发展如何?既然我们的收入又不低,那么干的就得比人家多,你说是不。人家一天接一个客人,咱就得接三个。作为测试的你,是不是有同感?
那么,第二个问题的答案是什么呢?答案就是这篇文章的title,测试团队将慢慢死去!就像《黑天鹅》的作者塔勒布所讲的,这个世界是由一系列不可能发生的事件组成的。测试团队死去这件事情随时可能发生,你要做的,是要提前做好准备!
我喜欢描述这样一个场景,一线测试工程师对着电脑在干活儿,左边的高层管理着指着他的鼻子说”别再跟我要head count,我要控制成本!”,右边的中层管理着指着他的鼻子说”去给我拓展业务,我要创造业绩!”,中间的你,那一脸苦逼的表情,还用我描述吗?
我认为,测试团队的发展大概要经过这样三个阶段。
第一阶段,公司快速扩张,不计研发成本,当然测试也不例外,每天都在非常happy的招人中。。。。
第二阶段,经过第一阶段的快速扩张,你的测试团队积累了大量的高级测试工程师,成本已经开始进入高层的考虑范围,技术部开始考虑适度控制成本,而此时,控制最厉害的,肯定是测试团队,当然裁员首先也会从测试团队开始。如果你幸运的没有被裁掉,不要盲目乐观,还有第三阶段。
第三阶段,(我认为我所在的公司正处于这个阶段)严格控制测试成本,老大们开始考虑将测试工作向上游转移。此时大量的词汇开始进入我们的KPI,什么推动单元测试,推动开发自测,控制提交测试质量,等等,等等。
讲到这里,今天的关键就出现了,如何将测试的工作向上游转移呢?答案就是第四阶段,让测试团队慢慢死去。。。。
节省测试成本的最好方式就是把自己干掉!没错!下面我说说方法。
测试团队当中,首先应该干掉的是纯手工测试工程师,因为他们的性价比是最低的(有些公司这个时候会选择测试外包)。然后,开发测试工程师当中出色的那部分,会加入开发团队当中,不出色的将被淘汰。他们有一项艰巨的任务,那就是,以开发自测为基础,为开发团队建立起一套完整的基于风险的质量控制体系。开发做测试不是能力问题,而是思想,思想却是最难以改变的。这也是好多人天天说要推动开发自测却没有进展的原因,没有认识到改变别人思想的工作有多难!我提的办法呢一石二鸟。开发测试工程师转入开发团队,既能节省测试成本,又可以帮助开发转变思想,以一带二,以一带三,逐步完成开发团队,全民皆测试的目标!
那么最后,测试团队中还剩什么呢?只会剩测试工具组。他们为全公司提供测试工具,平台和流程方面的支持。极少量的团队会保留纯手工测试工程师。但是,你绝对不应该看到”开发测试工程师”这个title,因为他们已经成为了开发团队中的一员,一起开发,一起测试。。。
插一段说明,我觉得不必说,但有些人会这么想的。有人会说测试团队应该保留一些测试职位,负责集成测试,系统测试和性能测试。这样说的人很多,但绝对没有过实践经验。为什么呢? 没有与开发天天在一起讨论问题,功能测试这个阶段,怎么能做好集成,系统测试呢? 不要妄想了,这些工作也会由开发团队完成。你可能会觉得开发工程师怎么会做呢? 他们为什么不会做呢?别忘了那些转入开发团队的开发测试工程师有一项艰巨的任务,”以开发自测为基础,为开发团队建立起一套完整的基于风险的质量控制体系”,其中就包括测试分工这些在测试团队习以为常的工作。我相信,开发暴发出来的测试能力是你想象不到的。
接下来可能要转换一下角度,站在开发角度来看,他们愿意接受这样一个变化吗?答案是不一定,但只有开发负责人愿意就没问题。我不刻意想学习google,facebook那种模式,但我想说,开发懂测试是一个必然趋势,如果你不想像测试一样被淘汰的话,还是接受吧。
测试是一个矛盾体,我们过去,现在,将来一直会做的事情就是让自己死掉(提升开发测试比,开发自测,等等,这些工作我们不是一直在做吗?)。
作为测试的你,能做什么呢?如果你不懂开发,要赶紧去学开发,学设计。如果你懂开发,那就还是要学开发,学设计,技术没有止境。有人跟我说”你过于强调技术,其实测试思想才是最重要的”,我认可这种看法,但不完全同意。因为技术能力会束缚你的测试思想,同样也会拓宽你的测试思想。试想都不懂tcp/http协议,怎么测试web server呢?
空谈误国,实干兴邦,牢牢把握技术才是王道!

上面这篇文章是前阶段淘宝前辈邓悟写的,感觉有一定道理,就拿过来跟大家分享下(已得到前辈同意);关于测试团队的前三个阶段发展的论述比较赞同,感觉现在好多大公司的确也有这种趋势;对于第四个阶段不发表评论,感觉测试职位只是一种合理分工的产物,如果这种分工方式对于公司来说成本相对较低,公司当然会保留;对于前辈说的这种可能对于国内大多数公司感觉暂时不太可能(未来就不做猜测了),当然像淘宝这样的公司要另说;对于前辈说的“技术”,我的看法也是多多益善,但是人的精力毕竟有限,要结合实际工作做取舍。
原文链接:http://blog.sina.com.cn/s/blog_71ad0d3f0101bytk.html

百度、腾讯和阿里内部的级别和薪资待遇是什么样的?

2016年6月7日 评论已被关闭

百度、腾讯和阿里内部的级别和薪资待遇是什么样的?

http://www.ttlsa.com/news/ali-tencent-baidu-level/

级别和薪资待遇,除非身居其位,否则你不会知道;但是等你到那个位置知道了,却又不能说,至少不能在公开场合谈论。这是一个群众喜闻乐见却又讳莫如深的话题。

别问我是怎么知道答案的,我不是互联网猎头,我正在做的事就是要用互联网产品替代猎头,因为猎头不透明、不全面,还死贵。各个公司头衔名字都不一样,级别的数目也不一样;有些扁平,有些很多level慢慢升;有些薪水范围严格跟级别挂钩,有些薪水跟级别没绝对的关系。最近刚好整理了一份「互联网公司薪酬体系架构」内部资料,年底了,上年货,哦不,上部分干货。

(P.S. 样本有限,有误请轻拍,欢迎评论交流 O(∩_∩)O~~)

最近对阿里羡慕嫉妒恨的同学可不少,知乎上也开起了对阿里的批斗会–2014 年放弃阿里巴巴 offer 的人是否格外多?–个么,就重点先说说阿里吧!

1. 举个栗子。校招不论,单说社招。想知道阿里内部级别和薪资待遇的题主,或许正面临offer选择,就像这位纠结阿里系offer的同学W:

最近刚通过面试,但基本薪酬也是不升反小降。 级别只有P6+,连P7都没有,非常郁闷,打算拒绝算了。小本工作9年了,这算不算loser ?

奇了怪了,阿里系的P6和P7的范围到底是多少?

不过反过来说,阿里系面试还真是有点深度的,通过不易,但拿到这个级别总感觉是否自已混的太一般了。

郁闷。

这样的纠结实在太常见了,都是工作好几年的老程序员了,好不容易动心跳个槽,猎头开始保证得好好的,怎么拿到offer的薪酬却不尽如人意?是自己能力不够,还是被HR/猎头忽悠?

专心做技术的大都是心思单纯之人,却最容易吃亏。知己知彼方可百战不殆,看看对方的级别和待遇,谋定而后动,才能跳得更远,走得更稳。

2. 先看阿里的级别定义:

P序列=技术岗 M序列=管理岗

百度、腾讯和阿里内部的级别和薪资待遇是什么样的? 好文分享 第1张
阿里的非管理岗分为10级

其中P6、P7、P8需求量最大,也是阿里占比最大的级别

前面栗子中郁闷的W同学拿到了P6+的offer,正处于最庞大但又最尴尬的级别中段,至于为什么差一点儿没拿到P7,难道是HR在省招聘费?

哦,江湖传言@Fenng是P7,@鬼脚七是P9,改日向我司隔壁的P9求证。

3. 再看阿里的级别对应薪资:

百度、腾讯和阿里内部的级别和薪资待遇是什么样的? 好文分享 第2张
?阿里薪资结构:一般是12+1+3=16薪

?年底的奖金为0-6个月薪资,90%人可拿到3个月

?股票是工作满2年才能拿,第一次拿50%,4年能全部拿完

说到股票,真是要普及下常识,别被忽悠了。股票是公司用来奖励员工忠诚度的,所以阿里分年限行权,想要离职套现真的是难。更不要高额的税收了,首先,归属要收高达45%的个税,然后得到的还是限制性股票,还不能马上卖呢。好不容易可以出售的时候,还得交20%股票增值部分的个人所得税哦!

更重要的是,你必须先缴税,才能归属,缴税还必须用现金,不能sell to cover!So,拿的越多,先拿出的cash就越多,这里面的流动性风险你自己权衡吧。

  • 再说说级别分层和阿里类似的百度

1. 百度的技术级别:

百度有4万人,每年招聘应届生技术产品人员1000人左右,技术岗位级别和阿里类似,分为T序列12级,不赘述了,大概阿里的级别减1或2,就是百度的级别。

?主要集中在T5/T6,升T7很困难,T7升T8更困难;T7以上一般就不做coding了

?一般来说,在百度待3年能给到T5,很多人都等不到三年,原因下面说,社招过来的,一般是外面公司的技术骨干了

?T10是技术总监,十个左右;T11是首席科学家;T12基本没见过。

2. 再看百度薪资的大概范围:

百度、腾讯和阿里内部的级别和薪资待遇是什么样的? 好文分享 第3张
?百度薪资结构:月薪*14.6(12+0.6+2),其他岗位月薪*14

?T5以上为关键岗位,另外有股票、期权

?T5、T6占比最大的级别,T8、T9占比最小

?级别越高,每档之间的宽幅越大

百度是一家业务定性,内部稳定,金字塔形的成熟公司。也就是说,大部分事情都是按部就班、驾轻就熟,所有人都比较轻松、稳定、舒服,尤其是对老员工而言。但是对于新员工来说,这意味着成长空间的极度压缩,机会少,上升慢。

百度工资高,福利好,但是这么多年期权已经基本发光了,只有总监以上才有,几十股几百股就算多了。问题就来了,百度新老员工的期权数量太悬殊,据说到百度楼下停车场一看,开卡宴的都是老员工,开捷达的都是新员工,其实很多新员工的贡献比老员工大得多,但是收入反而倒挂,于是很多新人等不到3年就跳了。

  • 谈谈最南边的腾讯

1. 腾讯的技术级别:

腾讯的分级和阿里/百度都不一样,分为T1/T2/T3/T4共4级,其中又细分为3级。

?员工仍然集中在中段,尤其是 T2.3 和 T3.1

?想从T2跨到T3,即从2.3升3.1是非常困难的

2. 了解薪酬和级别的关系:

百度、腾讯和阿里内部的级别和薪资待遇是什么样的? 好文分享 第4张
? 腾讯标准薪资是14薪,但是通常能拿到16-20薪

? T3.1以上开始另外有股票

值得一提的是,腾讯是有淘汰制考核的。一般一年两次考核(6月、12月),实行末尾淘汰制,0-10%优秀,必须有5%的人转组(转组也可能出现没人接收的情况)或者被开除,这点比较狠。

升级也跟考核结果很有关系,要升一个小等级,必须最近两次考核得过一次A类考核结果。升 T3.1是内部晋升的第一道槛,要求架构在领域内优秀,被追问攻击时能无漏洞应答出来–据说只有30%的通过率。同时,腾讯好的一点在于,底层普通员工如果技术真的不错,照样升级,和是不是leader关系不大。leader的带队价值在T3.3时才显现出来。

? 最后,来张BAT级别对照表

百度、腾讯和阿里内部的级别和薪资待遇是什么样的? 好文分享 第5张
总算是大致梳理了BAT的级别和薪资福利。无论你是向往BAT还是身居其中,把握每年的评级机会/跳槽机会,建立一条上升的职业曲线更为重要,因为,没有变化是一件很可怕的事情。

win10系统怎么重置电脑?win10重置的两种方法(删除/不删除个人数据)

2016年6月1日 评论已被关闭

win10系统怎么重置电脑?win10重置的两种方法(删除/不删除个人数据)

http://www.jb51.net/os/win10/367676.html

win10系统怎么重置电脑?win10运行太慢,原系统的程序很多,和win10不兼容,想重置健脑,该怎么办呢?win10重置电脑的方法很简单,下面分享两种方法,需要的朋友可以参考下

win10系统怎么重置电脑?win10运行太慢,原系统的程序很多,和win10不兼容,想重置健脑,该怎么办呢?请看下文详细介绍。

1、点击说明左下角开始菜单,然后选择设置

2、在设置界面选择”更新和安全”

3、在更新和安全中选择”恢复”,然后选择”删除所有内容”,选中

4、下面的选项中可以选择

仅删除我的文件(相当于快速格式化整个硬盘)

删除文件并清理驱动器(相当于低格硬盘,数据无法恢复)

方法二:win10不删除个人数据而重置

1、点击说明左下角开始菜单,然后选择设置

2、在设置界面选择”更新和安全

3、恢复界面选择”重置此电脑”然后点击”开始”

4、出现的界面中选择保留我的文件重置.

分类: 技术周边大全 标签:

HTTP/1.1与HTTP/1.0的区别

2016年5月29日 评论已被关闭

HTTP/1.1与HTTP/1.0的区别
下面主要从几个不同的方面介绍HTTP/1.0与HTTP/1.1之间的差别,当然,更多的内容是放在解释这种差异背后的机制上。

1 可扩展性

可扩展性的一个重要原则:如果HTTP的某个实现接收到了自身未定义的头域,将自动忽略它。

Ø  在消息中增加版本号,用于兼容性判断。注意,版本号只能用来判断逐段(hop-by-hop)的兼容性,而无法判断端到端(end-to-end)的兼容性。
例如,一台HTTP/1.1的源服务器从使用HTTP/1.1的Proxy那儿接收到一条转发的消息,实际上源服务器并不知道终端客户使用的是HTTP/1.0还是HTTP/1.1。因此,HTTP/1.1定义Via头域,用来记录消息转发的路径,它记录了整个路径上所有发送方使用的版本号。

Ø  HTTP/1.1增加了OPTIONS方法,它允许客户端获取一个服务器支持的方法列表。

Ø  为了与未来的协议规范兼容,HTTP/1.1在请求消息中包含了Upgrade头域,通过该头域,客户端可以让服务器知道它能够支持的其它备用通信协议,服务器可以据此进行协议切换,使用备用协议与客户端进行通信。

2 缓存

在HTTP/1.0中,使用Expire头域来判断资源的fresh或stale,并使用条件请求(conditional request)来判断资源是否仍有效。例如,cache服务器通过If-Modified-Since头域向服务器验证资源的Last-Modefied头域是否有更新,源服务器可能返回304(Not Modified),则表明该对象仍有效;也可能返回200(OK)替换请求的Cache对象。

此外,HTTP/1.0中还定义了Pragma:no-cache头域,客户端使用该头域说明请求资源不能从cache中获取,而必须回源获取。

HTTP/1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)。

HTTP/1.0中,If-Modified-Since头域使用的是绝对时间戳,精确到秒,但使用绝对时间会带来不同机器上的时钟同步问题。而HTTP/1.1中引入了一个ETag头域用于重激活机制,它的值entity tag可以用来唯一的描述一个资源。请求消息中可以使用If-None-Match头域来匹配资源的entitytag是否有变化。

为了使caching机制更加灵活,HTTP/1.1增加了Cache-Control头域(请求消息和响应消息都可使用),它支持一个可扩展的指令子集:例如max-age指令支持相对时间戳;private和no-store指令禁止对象被缓存;no-transform阻止Proxy进行任何改变响应的行为。

Cache使用关键字索引在磁盘中缓存的对象,在HTTP/1.0中使用资源的URL作为关键字。但可能存在不同的资源基于同一个URL的情况,要区别它们还需要客户端提供更多的信息,如Accept-Language和Accept-Charset头域。为了支持这种内容协商机制(content negotiation mechanism),HTTP/1.1在响应消息中引入了Vary头域,该头域列出了请求消息中需要包含哪些头域用于内容协商。

3 带宽优化

HTTP/1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了。例如,客户端只需要显示一个文档的部分内容,又比如下载大文件时需要支持断点续传功能,而不是在发生断连后不得不重新下载完整的包。

HTTP/1.1中在请求消息中引入了range头域,它允许只请求资源的某个部分。在响应消息中Content-Range头域声明了返回的这部分对象的偏移值和长度。如果服务器相应地返回了对象所请求范围的内容,则响应码为206(Partial Content),它可以防止Cache将响应误以为是完整的一个对象。

另外一种情况是请求消息中如果包含比较大的实体内容,但不确定服务器是否能够接收该请求(如是否有权限),此时若贸然发出带实体的请求,如果被拒绝也会浪费带宽。

HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401(Unauthorized);如果服务器接收此请求就回送响应码100,客户端就可以继续发送带实体的完整请求了。注意,HTTP/1.0的客户端不支持100响应码。但可以让客户端在请求消息中加入Expect头域,并将它的值设置为100-continue。

节省带宽资源的一个非常有效的做法就是压缩要传送的数据。Content-Encoding是对消息进行端到端(end-to-end)的编码,它可能是资源在服务器上保存的固有格式(如jpeg图片格式);在请求消息中加入Accept-Encoding头域,它可以告诉服务器客户端能够解码的编码方式。

而Transfer-Encoding是逐段式(hop-by-hop)的编码,如Chunked编码。在请求消息中加入TE头域用来告诉服务器能够接收的transfer-coding方式,

4 长连接

HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。此外,由于大多数网页的流量都比较小,一次TCP连接很少能通过slow-start区,不利于提高带宽利用率。

HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。例如:一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。

HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。

在HTTP/1.0中,要建立长连接,可以在请求消息中包含Connection: Keep-Alive头域,如果服务器愿意维持这条连接,在响应消息中也会包含一个Connection: Keep-Alive的头域。同时,可以加入一些指令描述该长连接的属性,如max,timeout等。

事实上,Connection头域可以携带三种不同类型的符号:

1、一个包含若干个头域名的列表,声明仅限于一次hop连接的头域信息;

2、任意值,本次连接的非标准选项,如Keep-Alive等;

3、close值,表示消息传送完成之后关闭长连接;
客户端和源服务器之间的消息传递可能要经过很多中间节点的转发,这是一种逐跳传递(hop-by-hop)。HTTP/1.1相应地引入了hop-by-hop头域,这种头域仅作用于一次hop,而非整个传递路径。每一个中间节点(如Proxy,Gateway)接收到的消息中如果包含Connection头域,会查找Connection头域中的一个头域名列表,并在将消息转发给下一个节点之前先删除消息中这些头域。

通常,HTTP/1.0的Proxy不支持Connection头域,为了不让它们转发可能误导接收者的头域,协议规定所有出现在Connection头域中的头域名都将被忽略。

5 消息传递

HTTP消息中可以包含任意长度的实体,通常它们使用Content-Length来给出消息结束标志。但是,对于很多动态产生的响应,只能通过缓冲完整的消息来判断消息的大小,但这样做会加大延迟。如果不使用长连接,还可以通过连接关闭的信号来判定一个消息的结束。

HTTP/1.1中引入了Chunkedtransfer-coding来解决上面这个问题,发送方将消息分割成若干个任意大小的数据块,每个数据块在发送时都会附上块的长度,最后用一个零长度的块作为消息结束的标志。这种方法允许发送方只缓冲消息的一个片段,避免缓冲整个消息带来的过载。

在HTTP/1.0中,有一个Content-MD5的头域,要计算这个头域需要发送方缓冲完整个消息后才能进行。而HTTP/1.1中,采用chunked分块传递的消息在最后一个块(零长度)结束之后会再传递一个拖尾(trailer),它包含一个或多个头域,这些头域是发送方在传递完所有块之后再计算出值的。发送方会在消息中包含一个Trailer头域告诉接收方这个拖尾的存在。

6 Host头域

在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。

HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。

7 错误提示

HTTP/1.0中只定义了16个状态响应码,对错误或警告的提示不够具体。HTTP/1.1引入了一个Warning头域,增加对错误或警告信息的描述。

此外,在HTTP/1.1中新增了24个状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

8 内容协商

为了满足互联网使用不同母语和字符集的用户,一些网络资源有不同的语言版本(如中文版、英文版)。HTTP/1.0定义了内容协商(contentnegotiation)的概念,也就是说客户端可以告诉服务器自己可以接收以何种语言(或字符集)表示的资源。例如如果服务器不能明确客户端需要何种类型的资源,会返回300(Multiple Choices),并包含一个列表,用来声明该资源的不同可用版本,然后客户端在请求消息中包含Accept-Language和Accept-Charset头域指定需要的版本。

就像有些人会说几门外语,但每种外语的流利程度并不相同。类似地,网络资源也可以有不同的表达形式,比如有母语版和各种翻译版本。HTTP引入了一个品质因子(quality values)的概念来表示不同版本的可用性,它的取值从0.0到1.0。例如一个母语是英语的人也能讲法语、甚至还学了点丹麦语,那么他的浏览器可用作如下配置:Accept-Language: en, fr;q=0.5, da;q=0.1。这时,服务器会优先选取品质因子高的值对应的资源版本作为响应。
参考资料

[1] Brian Totty, “HTTP: The DefinitiveGuide”, O’REILLY & ASSOC INC, 27, Sep., 2002.

[2] B. Krishnamurthy, J. C. Mogul, and D.M. Kristol, “Key Differences between HTTP/1.0 and HTTP/1.1”,http://www2.research.att.com/~bala/papers/h0vh1.html.

分类: Linux运维技术集锦 标签:

面试中的海量数据处理问题

2016年5月27日 评论已被关闭

面试中的海量数据处理问题

http://itindex.net/detail/21691-面试-量数-理问

终于找到了一份比较完整的,分享一下。

———

海量数据处理:十道面试题与十个海量数据处理方法总结
作者:July、youwang、yanxionglu。
时间:二零一一年三月二十六日
说明:本文分为俩部分,第一部分为10道海量数据处理的面试题,第二部分为10个海量数据处理的方法总结。有任何问题,欢迎交流、指正。
出处:http://blog.csdn.net/v_JULY_v
——————————————

 

第一部分、十道海量数据处理面试题

1、海量日志数据,提取出某日访问百度次数最多的那个IP。

首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法, 比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大 的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。

或者如下阐述(雪域之鹰):
算法思想:分而治之+Hash
1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;
2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;
3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;
4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;

2、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。
    假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。

典型的Top K算法,还是在这篇文章里头有所阐述,详情请参见:十一、从头到尾彻底解析Hash表算法。

文中,给出的最终算法是:
第一步、先对这批海量数据预处理,在O(N)的时间内用Hash表完成统计(之前写成了排序,特此订正。July、2011.04.27);
第二步、借助堆这个数据结构,找出Top K,时间复杂度为N‘logK。
即,借助堆结构,我们可以在log量级的时间内查找和调整/移动。因此,维护一个K(该题目中是10)大小的小根堆,然后遍历300万的Query,分别 和根元素进行对比所以,我们最终的时间复杂度是:O(N) + N’*O(logK),(N为1000万,N’为300万)。ok,更多,详情,请参考原文。

或者:采用trie树,关键字域存该查询串出现的次数,没有出现为0。最后用10个元素的最小推来对出现频率进行排序。
3、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。

方案:顺序读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件(记为x0,x1,…x4999)中。这样每个文件大概是200k左右。

如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过1M。
对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个结 点的最小堆),并把100个词及相应的频率存入文件,这样又得到了5000个文件。下一步就是把这5000个文件进行归并(类似与归并排序)的过程了。
4、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。

还是典型的TOP K算法,解决方案如下:
方案1:
顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。

找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的 query_cout输出到文件中。这样得到了10个排好序的文件(记为)。

对这10个文件进行归并排序(内排序与外排序相结合)。

方案2:
一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。

方案3:
与方案1类似,但在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。
5、 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

方案1:可以估计每个文件安的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。

遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,…,a999)中。这样每个小文件的大约为300M。

遍历文件b,采取和a相同的方式将url分别存储到1000小文件(记为b0,b1,…,b999)。这样处理后,所有可能相同的url都在对应的小 文件(a0vsb0,a1vsb1,…,a999vsb999)中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的 url即可。

求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。

方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。

Bloom filter日后会在本BLOG内详细阐述。
6、在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。

方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看 bitmap,把对应位是01的整数输出即可。

方案2:也可采用与第1题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。
7、腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

与上第6题类似,我的第一反应时快速排序+二分查找。以下是其它更好的方法:
方案1:oo,申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。

dizengrong:
方案2:这个问题在《编程珠玑》里有很好的描述,大家可以参考下面的思路,探讨一下:
又因为2^32为40亿多,所以给定一个数可能在,也可能不在其中;
这里我们把40亿个数中的每一个用32位的二进制来表示
假设这40亿个数开始放在一个文件中。

然后将这40亿个数分成两类:
1.最高位为0
2.最高位为1
并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿,而另一个>=20亿(这相当于折半了);
与要查找的数的最高位比较并接着进入相应的文件再查找

再然后把这个文件为又分成两类:
1.次最高位为0
2.次最高位为1

并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10亿,而另一个>=10亿(这相当于折半了);
与要查找的数的次最高位比较并接着进入相应的文件再查找。
…….
以此类推,就可以找到了,而且时间复杂度为O(logn),方案2完。

附:这里,再简单介绍下,位图方法:
使用位图法判断整形数组是否存在重复
判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可取了。

位图法比较适合于这种情况,它的做法是按照集合中最大元素max创建一个长度为max+1的新数组,然后再次扫描原数组,遇到几就给新数组的第几位置上 1,如遇到5就给新数组的第六个元素置1,这样下次再遇到5想置位时发现新数组的第六个元素已经是1了,这说明这次的数据肯定和以前的数据存在着重复。这 种给新数组初始化时置零其后置一的做法类似于位图的处理方法故称位图法。它的运算次数最坏的情况为2N。如果已知数组的最大值即能事先给新数组定长的话效 率还能提高一倍。

欢迎,有更好的思路,或方法,共同交流。
8、怎么在海量数据中找出重复次数最多的一个?

方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)。
9、上千万或上亿数据(有重复),统计其中出现次数最多的钱N个数据。

方案1:上千万或上亿的数据,现在的机器的内存应该能存下。所以考虑采用hash_map/搜索二叉树/红黑树等来进行统计次数。然后就是取出前N个出现次数最多的数据了,可以用第2题提到的堆机制完成。
10、一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。

方案1:这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平准长度)。然后是找出出现最频繁的前10 个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(n*lg10)。所以总的时间复杂度,是O(n*le)与O(n*lg10)中较大的哪一 个。
附、100w个数中找出最大的100个数。

方案1:在前面的题中,我们已经提到了,用一个含100个元素的最小堆完成。复杂度为O(100w*lg100)。

方案2:采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比100多的时候,采用传统排序算法排序,取前100个。复杂度为O(100w*100)。

方案3:采用局部淘汰法。选取前100个元素,并排序,记为序列L。然后一次扫描剩余的元素x,与排好序的100个元素中最小的元素比,如果比这个最小的 要大,那么把这个最小的元素删除,并把x利用插入排序的思想,插入到序列L中。依次循环,知道扫描了所有的元素。复杂度为O(100w*100)。

致谢:http://www.cnblogs.com/youwang/

 

第二部分、十个海量数据处理方法大总结

ok,看了上面这么多的面试题,是否有点头晕。是的,需要一个总结。接下来,本文将简单总结下一些处理海量数据问题的常见方法,而日后,本BLOG内会具体阐述这些方法。

下面的方法全部来自http://hi.baidu.com/yanxionglu/blog/博客,对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎讨论。

一、Bloom filter

适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集

基本原理及要点:
对于原理来说很简单,位数组+k个独立hash函数。将 hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是100%正确的。同时也不 支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。

还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小及hash函数 个数。当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集 合。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。

举个例子我们假设错误率为0.01,则此时m应大概是n的13倍。这样k大概是8个。

注意这里m与n的单位不同,m是bit为单位,而n则是以元素个数为单位(准确的说是不同元素的个数)。通常单个元素的长度都是有很多bit的。所以使用bloom filter内存上通常都是节省的。

扩展:
Bloom filter将集合中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个集合中。Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral Bloom Filter(SBF)将其与集合元素的出现次数关联。SBF采用counter中的最小值来近似表示元素的出现频率。

问题实例:给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?

根据这个问题我们来计算下内存的占用,4G=2^32大概是40亿*8大概是340 亿,n=50亿,如果按出错率0.01算需要的大概是650亿个bit。现在可用的是340亿,相差并不多,这样可能会使出错率上升些。另外如果这些 urlip是一一对应的,就可以转换成ip,则大大简单了。
二、Hashing

适用范围:快速查找,删除的基本数据结构,通常需要总数据量可以放入内存

基本原理及要点:
hash函数选择,针对字符串,整数,排列,具体相应的hash方法。
碰撞处理,一种是open hashing,也称为拉链法;另一种就是closed hashing,也称开地址法,opened addressing。

扩展:
d-left hashing中的d是多个的意思,我们先简化这个问题,看一看2-left hashing。2-left hashing指的是将一个哈希表分成长度相等的两半,分别叫做T1和T2,给T1和T2分别配备一个哈希函数,h1和h2。在存储一个新的key时,同 时用两个哈希函数进行计算,得出两个地址h1[key]和h2[key]。这时需要检查T1中的h1[key]位置和T2中的h2[key]位置,哪一个 位置已经存储的(有碰撞的)key比较多,然后将新key存储在负载少的位置。如果两边一样多,比如两个位置都为空或者都存储了一个key,就把新key 存储在左边的T1子表中,2-left也由此而来。在查找一个key时,必须进行两次hash,同时查找两个位置。

问题实例:
1).海量日志数据,提取出某日访问百度次数最多的那个IP。
IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。
三、bit-map

适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下

基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位电话号码

扩展:bloom filter可以看做是对bit-map的扩展

问题实例:
1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。
2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map。
四、堆

适用范围:海量数据前n大,并且n比较小,堆可以放入内存

基本原理及要点:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前 元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元素。这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较 小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。

扩展:双堆,一个最大堆与一个最小堆结合,可以用来维护中位数。

问题实例:
1)100w个数中找最大的前100个数。
用一个100个元素大小的最小堆即可。

 

五、双层桶划分—-其实本质上就是【分而治之】的思想,重在“分”的技巧上!

适用范围:第k大,中位数,不重复或重复的数字
基本原理及要点:因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行。可以通过多次缩小,双层只是一个例子。

扩展:
问题实例:
1).2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
有点像鸽巢原理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不同的区域,然后不同的区域在利用bitmap就可以直接解决了。也就是说只要有足够的磁盘空间,就可以很方便的解决。

2).5亿个int找它们的中位数。
这个例子比上面那个更明显。首先我们 将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第 几大数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。

实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受 的程度。即可以先将int64分成2^24个区域,然后确定区域的第几大数,在将该区域分成2^20个子区域,然后确定是子区域的第几大数,然后子区域里 的数的个数只有2^20,就可以直接利用direct addr table进行统计了。
六、数据库索引

适用范围:大数据量的增删改查

基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。
七、倒排索引(Inverted index)

适用范围:搜索引擎,关键字查询

基本原理及要点:为何叫倒排索引?一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。

以英文为例,下面是要被索引的文本:
T0 = “it is what it is”
T1 = “what is it”
T2 = “it is a banana”

我们就能得到下面的反向文件索引:

“a”:      {2}
“banana”: {2}
“is”:     {0, 1, 2}
“it”:     {0, 1, 2}
“what”:   {0, 1}

检索的条件”what”,”is”和”it”将对应集合的交集。

正向索引开发出来用来存储每个文档的单词的列表。正向索引的查询往往满足每个文档有序 频繁的全文查询和每个单词在校验文档中的验证这样的查询。在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。也就是说文档 指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很容易看到这个反向的关系。

扩展:
问题实例:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索。
八、外排序

适用范围:大数据的排序,去重

基本原理及要点:外排序的归并方法,置换选择败者树原理,最优归并树

扩展:

问题实例:
1).有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。

这个数据具有很明显的特点,词的大小为16个字节,但是内存只有1m做hash有些不够,所以可以用来排序。内存可以当输入缓冲区使用。
九、trie树

适用范围:数据量大,重复多,但是数据种类小可以放入内存

基本原理及要点:实现方式,节点孩子的表示方式

扩展:压缩实现。

问题实例:
1).有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序。
2).1000万字符串,其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现?
3).寻找热门查询:查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个,每个不超过255字节。
十、分布式处理 mapreduce

适用范围:数据量大,但是数据种类小可以放入内存

基本原理及要点:将数据交给不同的机器去处理,数据划分,结果归约。

扩展:
问题实例:
1).The canonical example application of MapReduce is a process to count the appearances of
each different word in a set of documents:
2).海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
3).一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数的中数(median)?
经典问题分析
上千万or亿数据(有重复),统计其中出现次数最多的前N个数据,分两种情况:可一次读入内存,不可一次读入。

可用思路:trie树+堆,数据库索引,划分子集分别统计,hash,分布式计算,近似统计,外排序

所谓的是否能一次读入内存,实际上应该指去除重复后的数据量。如果去重后数据可以放入 内存,我们可以为数据建立字典,比如通过 map,hashmap,trie,然后直接进行统计即可。当然在更新每条数据的出现次数的时候,我们可以利用一个堆来维护出现次数最多的前N个数据,当 然这样导致维护次数增加,不如完全统计后在求前N大效率高。

如果数据无法放入内存。一方面我们可以考虑上面的字典方法能否被改进以适应这种情形,可以做的改变就是将字典存放到硬盘上,而不是内存,这可以参考数据库的存储方法。

当然还有更好的方法,就是可以采用分布式计算,基本上就是map-reduce过程, 首先可以根据数据值或者把数据hash(md5)后的值,将数据按照范围划分到不同的机子,最好可以让数据划分后可以一次读入内存,这样不同的机子负责处 理各种的数值范围,实际上就是map。得到结果后,各个机子只需拿出各自的出现次数最多的前N个数据,然后汇总,选出所有的数据中出现次数最多的前N个数 据,这实际上就是reduce过程。

实际上可能想直接将数据均分到不同的机子上进行处理,这样是无法得到正确的解的。因为 一个数据可能被均分到不同的机子上,而另一个则可能完全聚集到一个机子上,同时还可能存在具有相同数目的数据。比如我们要找出现次数最多的前100个,我 们将1000万的数据分布到10台机器上,找到每台出现次数最多的前 100个,归并之后这样不能保证找到真正的第100个,因为比如出现次数最多的第100个可能有1万个,但是它被分到了10台机子,这样在每台上只有1千 个,假设这些机子排名在1000个之前的那些都是单独分布在一台机子上的,比如有1001个,这样本来具有1万个的这个就会被淘汰,即使我们让每台机子选 出出现次数最多的1000个再归并,仍然会出错,因为可能存在大量个数为1001个的发生聚集。因此不能将数据随便均分到不同机子上,而是要根据hash 后的值将它们映射到不同的机子上处理,让不同的机器处理一个数值范围。

而外排序的方法会消耗大量的IO,效率不会很高。而上面的分布式方法,也可以用于单机版本,也就是将总的数据根据值的范围,划分成多个不同的子文件,然后逐个处理。处理完毕之后再对这些单词的及其出现频率进行一个归并。实际上就可以利用一个外排序的归并过程。

另外还可以考虑近似计算,也就是我们可以通过结合自然语言属性,只将那些真正实际中出现最多的那些词作为一个字典,使得这个规模可以放入内存。

ok,以上有任何问题,欢迎指正。谢谢大家。本文完。

海量数据处理常见面试题

2016年5月27日 评论已被关闭

海量数据处理常见面试题

http://itindex.net/detail/55626-量数-面试

1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 

方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 

s 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。这样每个小文件的大约为300M。 

s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为)。这样处理后,所有可能相同的url都在对应的小文件()中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 

s 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。 

方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。

2. 有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。 

方案1: 

s 顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。 

s 找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件中。这样得到了10个排好序的文件(记为)。 

s 对这10个文件进行归并排序(内排序与外排序相结合)。 

方案2: 

一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。 

方案3: 

与方案1类似,但在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。 

3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。 

方案1:顺序读文件中,对于每个词x,取,然后按照该值存到5000个小文件(记为)中。这样每个文件大概是200k左右。如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,知道分解得到的小文件的大小都不超过1M。对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个结点的最小堆),并把100词及相应的频率存入文件,这样又得到了5000个文件。下一步就是把这5000个文件进行归并(类似与归并排序)的过程了。 

4. 海量日志数据,提取出某日访问百度次数最多的那个IP。 

方案1:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。 


5. 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。
 

方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。 

方案2:也可采用上题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。 


6. 海量数据分布在100台电脑中,想个办法高校统计出这批数据的TOP10。
 

方案1: 

s 在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是TOP10大。 

s 求出每台电脑上的TOP10后,然后把这100台电脑上的TOP10组合起来,共1000个数据,再利用上面类似的方法求出TOP10就可以了。 


7. 怎么在海量数据中找出重复次数最多的一个?
 

方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)。 

8. 上千万或上亿数据(有重复),统计其中出现次数最多的钱N个数据。 

方案1:上千万或上亿的数据,现在的机器的内存应该能存下。所以考虑采用hash_map/搜索二叉树/红黑树等来进行统计次数。然后就是取出前N个出现次数最多的数据了,可以用第6题提到的堆机制完成。 


9. 1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?
 

方案1:这题用trie树比较合适,hash_map也应该能行。 


10. 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
 

方案1:这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平准长度)。然后是找出出现最频繁的前10个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(n*lg10)。所以总的时间复杂度,是O(n*le)与O(n*lg10)中较大的哪一个。 

11. 一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,问最优解。 

方案1:首先根据用hash并求模,将文件分解为多个小文件,对于单个文件利用上题的方法求出每个文件件中10个最常出现的词。然后再进行归并处理,找出最终的10个最常出现的词。 

12. 100w个数中找出最大的100个数。 

方案1:在前面的题中,我们已经提到了,用一个含100个元素的最小堆完成。复杂度为O(100w*lg100)。 

方案2:采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比100多的时候,采用传统排序算法排序,取前100个。复杂度为O(100w*100)。 

方案3:采用局部淘汰法。选取前100个元素,并排序,记为序列L。然后一次扫描剩余的元素x,与排好序的100个元素中最小的元素比,如果比这个最小的要大,那么把这个最小的元素删除,并把x利用插入排序的思想,插入到序列L中。依次循环,知道扫描了所有的元素。复杂度为O(100w*100)。 

13. 寻找热门查询: 

搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复读比较高,虽然总数是1千万,但是如果去除重复和,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。 

(1) 请描述你解决这个问题的思路; 

(2) 请给出主要的处理流程,算法,以及算法的复杂度。 

方案1:采用trie树,关键字域存该查询串出现的次数,没有出现为0。最后用10个元素的最小推来对出现频率进行排序。 

14. 一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到个数中的中数? 

方案1:先大体估计一下这些数的范围,比如这里假设这些数都是32位无符号整数(共有个)。我们把0到的整数划分为N个范围段,每个段包含个整数。比如,第一个段位0到,第二段为到,…,第N个段为到。然后,扫描每个机器上的N个数,把属于第一个区段的数放到第一个机器上,属于第二个区段的数放到第二个机器上,…,属于第N个区段的数放到第N个机器上。注意这个过程每个机器上存储的数应该是O(N)的。下面我们依次统计每个机器上数的个数,一次累加,直到找到第k个机器,在该机器上累加的数大于或等于,而在第k-1个机器上的累加数小于,并把这个数记为x。那么我们要找的中位数在第k个机器中,排在第位。然后我们对第k个机器的数排序,并找出第个数,即为所求的中位数。复杂度是的。 

方案2:先对每台机器上的数进行排序。排好序后,我们采用归并排序的思想,将这N个机器上的数归并起来得到最终的排序。找到第个便是所求。复杂度是的。 

15. 最大间隙问题 

给定n个实数,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法。 

方案1:最先想到的方法就是先对这n个数据进行排序,然后一遍扫描即可确定相邻的最大间隙。但该方法不能满足线性时间的要求。故采取如下方法: 

s 找到n个数据中最大和最小数据max和min。 

s 用n-2个点等分区间[min, max],即将[min, max]等分为n-1个区间(前闭后开区间),将这些区间看作桶,编号为,且桶的上界和桶i+1的下届相同,即每个桶的大小相同。每个桶的大小为:。实际上,这些桶的边界构成了一个等差数列(首项为min,公差为),且认为将min放入第一个桶,将max放入第n-1个桶。 

s 将n个数放入n-1个桶中:将每个元素分配到某个桶(编号为index),其中,并求出分到每个桶的最大最小数据。 

s 最大间隙:除最大最小数据max和min以外的n-2个数据放入n-1个桶中,由抽屉原理可知至少有一个桶是空的,又因为每个桶的大小相同,所以最大间隙不会在同一桶中出现,一定是某个桶的上界和气候某个桶的下界之间隙,且该量筒之间的桶(即便好在该连个便好之间的桶)一定是空桶。也就是说,最大间隙在桶i的上界和桶j的下界之间产生。一遍扫描即可完成。 

16. 将多个集合合并成没有交集的集合:给定一个字符串的集合,格式如:。要求将其中交集不为空的集合合并,要求合并完成的集合之间无交集,例如上例应输出。 

(1) 请描述你解决这个问题的思路; 

(2) 给出主要的处理流程,算法,以及算法的复杂度; 

(3) 请描述可能的改进。 

方案1:采用并查集。首先所有的字符串都在单独的并查集中。然后依扫描每个集合,顺序合并将两个相邻元素合并。例如,对于,首先查看aaa和bbb是否在同一个并查集中,如果不在,那么把它们所在的并查集合并,然后再看bbb和ccc是否在同一个并查集中,如果不在,那么也把它们所在的并查集合并。接下来再扫描其他的集合,当所有的集合都扫描完了,并查集代表的集合便是所求。复杂度应该是O(NlgN)的。改进的话,首先可以记录每个节点的根结点,改进查询。合并的时候,可以把大的和小的进行合,这样也减少复杂度。 

17. 最大子序列与最大子矩阵问题 

数组的最大子序列问题:给定一个数组,其中元素有正,也有负,找出其中一个连续子序列,使和最大。 

方案1:这个问题可以动态规划的思想解决。设表示以第i个元素结尾的最大子序列,那么显然。基于这一点可以很快用代码实现。 

最大子矩阵问题:给定一个矩阵(二维数组),其中数据有大有小,请找一个子矩阵,使得子矩阵的和最大,并输出这个和。 

方案1:可以采用与最大子序列类似的思想来解决。如果我们确定了选择第i列和第j列之间的元素,那么在这个范围内,其实就是一个最大子序列问题。如何确定第i列和第j列可以词用暴搜的方法进行。

执行中的专注

2016年5月25日 评论已被关闭

 执行中的专注

  http://www.cnblogs.com/peida/archive/2012/10/30/2747049.html

个人批注:

时间管理的最终目的是高效的把事情做成并且要做好。有目标,有计划,按照计划去执行。执行的过程会遇到就会遇到拖延,我们就需要在执行过程中专注,只要专注后执行力和效率才能提高。

对于个人管理而言:

1.要有阶段型目标,并且要制订一个执行计划

2.有执行计划后,就开始强迫自己按计划执行

3.在执行的过程中,可以利用番茄实践工作法,一段时间内专注于一件事情上

4.通过一段时间的训练就会让自己养成良好的习惯,变成自己的独门功夫

 

 原文内容:

 

顾名思义,执行中的专注,涉及到两个关键词:执行专注

  一、执行

  时间管理的最终目的是把事情做成、做好。要实现这最终目的的第一步是抬起脚迈出第一步,也就是开始行动——执行。

日程规划只有去执行,才有意义,不然就是纸上文章一篇。执行当中,面临的最大的问题之一是拖延:拖延执行日程规划;在执行任务时,拖延完成的时间等等。

拖延是一个大课题,不是一篇小文章可以说清楚或者找出应对方案的。推荐一本关于拖延的书《拖延心理学》,里面详细了分析了拖延的原因,给出了很多克服拖延的方法和建议;再推荐一本《意志力》,因为拖延很多时候,是因为自己意志力不够,不能坚持去做行动、不能按时把事情完成。

不管多么中肯的建议,怎样好的方法,必须要行动中运用这些方法才能有效果。然后,这里会有一个怪圈:你因为拖延,而不愿行动;而你又要通过行动,来克服拖延。那该怎么办?

既然是一个怪圈,没办法从内部走出来,我的方法则是从外部强行打破这个死循环。日程规划一旦制定,就不去多想什么,Push(强迫)自己严格执行,没有任何的道理,也不考虑是否合理,简简单单的就是执行而已。人很多时候的失败,是不能坚定的执行既定的策略,而那改变其实本身未必有什么道理。

Push(强迫),总不是一件让人感觉舒服的事情。这是对的,只有走出自己的舒适圈,自己才能有所改变。当那些不舒适开始变得舒适了,说明自己成长了。

  二、专注

  时间管理的核心是保证做事的过程中要专注。很多时候,专注是一种习惯。开始一件事情,专注于其中,不在乎时间的流逝,不考虑事前事后。专注的是一种过程,而不是一个结果。

任何事情的成就,都需要专注力去浇灌,用时间去酝酿。现在的社会,节奏快,吸引力多,让我们的专注力无法集中,能酝酿出来的完美事物少之又少。于是,专注力缺乏成为我们常谈的一个话题。

那么,该如何去做到执行中的专注?以下是我自己的一些尝试:

1、要简化自己的生活,控制自己的欲望,让自己有限的注意力集中于少数几个真正的需求,专注其中。

2、客观上,一个时间段内,只有一件事情做,例如做日程规划,就是保证某个时间段内只有一件事情要做。

3、主观上,只想做一件事情,在某个时间段内,只考虑做这一件事情,无其他任何外在的因素影响只做一件事情的心态。

4、学一些时间管理的理念和技巧,例如GTD、番茄工作法,我认为这些时间管理的技巧的核心,都是为了保证做事过程中的专注。

5、尝试去冥想,锻炼自己掌控自己思绪的能力,这是对专注的一种锻炼。这种锻炼越多,专注的肌肉越发达,做事时越容易控制自己的思绪,不让自己思维跳跃到其他地方,带来注意力的分散。

6、尝试慢生活,事情“慢慢”去做。我这里说的“慢”,指的是“思想”上要慢,专注当下,不着急切入下一件事情,但行动上要快,尽可能高效的完成工作,也就是战略上藐视,战术上重视。

7、尽量屏蔽可能的分散专注力的因素,例如互联网、电视、游戏等,做事情的时候,把所有不相关的因素全部屏蔽,专注于事情当中。

   三、功夫在诗外

无论是战胜拖延即可行动去执行,还是做到在执行中百分之百的专注,都不是一蹴而就,也不是仅仅为了执行而锻炼执行,或者为专注而锻炼专注。

人的各种品性都不是独立的,而是相互关联、纠结在一起的,想要改变某一种品性,不管是好的,还是坏的,都无法单纯从这一个品性入手,而是要同时从相关的一些品性入手。例如要提高专注力,你需要有好的意志力,需要良好的自律能力等。

所以,陆放翁在告诫他儿子时候说:汝果欲学诗,功夫在诗外。个人的提升,乃至各种事情想要做到一种境界,都会是功夫在诗外。

分类: 技术周边大全 标签:

面对移动网页设计 Adobe Spark套装发布

2016年5月23日 评论已被关闭

面对移动网页设计 Adobe Spark套装发布

http://qsy.fengniao.com/533/5335496.html

几年以前,Adobe开始发布一系列针对iPad设计的应用,让视觉内容的构建在iPad上也可以很容易。如针对动画视频和展示的Adobe Voice,还有更偏向于文字的Adobe Slate和针对社交图片的Adobe Post。现如今,Adobe又推出了三款类似的App,只不过名字变了,而且还带来了这些软件的web网页版。

面对移动网页设计 Adobe Spark套装发布
Adobe Spark网页端

这次的Adobe Spark套装,包括三个部分,分别是Adobe Spark Video(先前的Voice),Adobe Spark Page(先前的Slate)和Adobe Spark Post(先前的Post)。实际上,这些软件的理念跟先前是一样的,让用户制作社交图片、网页故事、动画视频,不需要专业的编辑软件。不过除此之外,还有基于浏览器的网页版应用(http://spark.adobe.com),项目制作会更方便,在移动端开始的项目也可以在桌面的web端继续进行。

面对移动网页设计 Adobe Spark套装发布
Adobe Spark网页版

不过这次的应用还是有一些局限的,比如说某些工程不能导出用于你自己的站点(虽然可以嵌入到Adobe的项目中),而且没有Android版应用。这些应用是免费发布的,Adobe表示未来会推收费版——收费版将提供更多的功能。

和Adobe的CC套装不同,Adobe将Spark定位于非专业内容作者,至少现在是如此。Adobe新一代产品负责人Aubrey Cattell表示,Spark是“新一代Photoshop”,将“孤立的应用”融于一个更大的平台。按照Cattell所说,许多小型企业用户,还有活跃的社交媒体用户都会取使用这样的软件,而非那些专业的视频编辑用户。不过有一件事情是很确定的,现如今已经来到了后Flash时代,Adobe显然不希望在web内容构建新时代落后。

分类: 技术周边大全 标签: