Archive for 十二月, 2009

120年《国家地理》浓缩为一块160GB硬盘

by baiheinet on 十二月 31st, 2009

美国《国家地理》杂志官方商店最近推出了一款硬盘——这不是说他们要进军硬件产业了,而是把该杂志的120年历史全部浓缩到了这块硬盘上。这块硬盘包含了《国家地理》自1888年创刊以来到2008年的每一期,一个多世纪以来刊登的文章、照片、地图甚至广告等等都全部在列,而且都是以“惊人的高分辨率”扫描而来的,此外还有搜索工具GeoBrowse、可定制收藏夹、地理知识测试小游戏,以及一张附赠DVD光盘,内容包括教你如何拍摄更美丽的照片、揭开《国家地理》杂志的制作幕后、采访杂志摄影师探访照片背后的故事。

Published by  Published by xFruits

Original source : http://www.cnbeta.com/articles/101116.htm...

搜索引擎优化(SEO)工具包

by baiheinet on 十二月 31st, 2009

【原文地址】Search Engine Optimization (SEO) Toolkit
【原文发表日期】 Tuesday, December 15, 2009 12:24 AM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

在过去几个星期里,我一直在询问开发人员,看有多少人在使用新的搜索引擎优化(SEO)工具包来增加他们网站的流量。让我吃惊的是,有很多人要么从来没有听说过这个工具,要么还没有机会针对自己网站运行该工具。本博客将就为什么任何做web开发的人都应该看一下这个工具提供一个简单的摘要。

为什么要使用一个免费的S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包?

简而言之,这个免费的S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包分析器(SEO Toolkit Analyzer)帮助你增加你的网站的流量和访客,从而能够增加你通过网站直接或间接获取的收益。

这个S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包分析器通过帮你评估和改进你的网站在象Google, Bing, 和 Yahoo这样的搜索引擎中的搜索相关性排行,来增加你网站的流量。随着你的搜索相关性排行的改进,以及你的网站对搜索引擎而言愈加优化,你会发现你的网站从搜索引擎查询中会得到越来越多的用户流量。

不需5分钟即可下载和运行SEO分析器

只需花费少于5分钟的时间即可下载S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包分析器,并对你的网站运行该工具来进行分析。只要将工具指向你网站的顶层URL,然后它就会象搜索引擎一样自动地爬行你的网站 -- 跟随每个链接,分析每个网页的HTML,然后生成一个友好的报告,内含它在你的网站上发现的所有SEO或内容违例,以及如何修补每个违例的建议:

seo9 

可用于任何web服务器

该S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包可用于任何web服务器,它可用于IIS5, IIS6, IIS7 和 IIS7.5,它甚至可用于运行于Linux上的Apache web服务器。基本上来说,你可以将SEO分析器指向任何一个远程的HTTP服务器,它就会爬行该网站,并且生成一个SEO报告。你需在远程服务器上安装任何软件,该工具会象搜索引擎一样远程爬行和分析一个网站。这意味着,你甚至可以针对你朋友(或潜在客户)的网站运行该工具,为他们生成报告。

S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包到是要求你在本地开发/客户机器上安装IIS7管理工具,以宿主SEO分析管理UI工具。IIS7管理工具是Windows Vista, Windows 7, 和 Windows Server 2008的内置特性,IIS7管理界面只需在本地开发机器上安装即可,你需要将IIS7安装在服务器上。在其中运行的S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具,针对IIS5, IIS6 和其他web服务器都可以正常工作。

如何下载和安装S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包

你可以使用微软Web平台安装器来轻松得安装S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包。

要在你的开发机器上自动安装S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包,使用IIS S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包下载网页上的绿色“Install Now(现在就下载)”按钮,点击该按钮也会自动下载和安装Web平台安装器,如果你还没有安装它的话。

如何了解详情

夏天时,我曾写过一篇关于如何使用S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包的教程(其中一些对话框的界面有些变动,但功能是一样的)。

你还可以观看这个IIS SEO 工具包录像 (5分钟长),或者这个长一点的IIS SEO 工具包录像 (15 分钟长),看S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具的实战例子。

你可以在www.iis.net上的S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包论坛上提问求助。

结语

如果你还没有下载S凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北E刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水O工具包,用它来分析你的网站的话,那么我高度推荐你马上花上10分钟时间,尝试一下。你会发现它提供了一个非常简易和自动化的方式,很快地找到和鉴别你网站上的SEO问题,以及提供如何修补它们的建议。修补好这些问题就会增加你网站的流量和访客数。

希望本文对你有所帮助,

Scott


博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

开源的命令行OCR软件──tesseract

by baiheinet on 十二月 30th, 2009

tesseract-ocr是一个跨平台开源的OCR软件(Optical Character Recognition,光学字符识别),它历史悠久,早期是HP实验室的项目,现托管于google code。
大部分常用的linux发行版,应该都在源里包含了此软件,所以ubuntu下只需要 sudo apt-get install tesseract-ocr tesseract-ocr-eng 就可以安装了,注意必须安装 tesseract-ocr-eng 这个是识别英文字符所必须的数据文件。而在gentoo下,也只需要 emerge app-text/tesseract 就可以了,但是也必须给这个包添加 linguas_en 这个use,才会安装所需要的数据文件。
关于数据文件,还得交代一下,其实tesseract在2.0版以后,已经有了学习能力了,如果你想提高某个字体的识别率,或者识别不在默认语言包里的UTF-8字符(比如中文)的话,可以安装这个方法来训练出自己的数据文件。
这个OCR软件能干嘛呢?典型地应用就是识别验证码,哈哈。所以以这个为例,来介绍一下使用方法,先来看看这几个验证码(可“图片另存为”,然后自行测试):

这几个都是用默认的数据文件能正确识别的例子,由于tesseract只识别tiff格式的图片文件,所以识别之前,需要将图片先转成tif格式,具体如下:

$ convert cnblogs.com.jpe ppm:- | ppm2tiff yzm.tif
$ tesseract yzm.tif out
Tesseract Open Source OCR Engine
$ cat out.txt
1750

同时,也有些比较难的验证码,是程序不能正确识别的,如下几个就是例子:

虽然识别的正确性不是非常高,但是已经很不错了,哈哈。
PS: 有没有人训练个识别google验证码专用的数据文件?

Published by  Published by xFruits

Original source : http://li2z.cn/2009/12/29/tesseract-ocr/...

海量小文件存储

by baiheinet on 十二月 30th, 2009

Web2.0网站,数据内容以几何级数增长,尤其是那些小文件,几K~几百K不等,数量巨多,传统的文件系统处理起来很是吃力,很多网站在scaling的过程中都遇到了这样的问题:磁盘IO过高;备份困难;单点问题,容量和读写无法水平扩展,还存在故障的可能。

YouTube也碰到这样的问题,每一个视频有4个缩微图,这样的话缩微图数量是视频数量的四倍,想象一下YouTube有多少视频,看一下他们遇到的问题:

  • 大量的磁盘寻址,在操作系统层面出现inodes cache和page cache的问题
  • 单个目录文件数限制,尤其是Ext3文件系统,采用目录分级的做法,最新的Linux Kernel 2.6优化了Ext3文件系统,单目录能存储的文件数提高了100倍,但是把所有的文件存一个目录不是一个好的方法
  • 高RPS(requests per second每秒请求数),因为一个页面可能要显示60个缩微图
  • 高负载下Apache性能差
  • Apache前面加一层Squid,能抗一会,但负载上来之后,性能下降厉害,由300RPS降到20RPS
  • 尝试lighttpd,但是lighttpd是单线程,多线程的话也有问题,线程之间缓存不能共享
  • 加一台服务器的话需要24小时,因为文件数太多了
  • 存在“冷却”的问题,重启服务器后需要6~10个小时才能缓存好

YouTube的解决方案是Google的BigTable,一般人没戏。(原文参见:http://www.hfadeel.com/Blog/?p=127

Facebook也遇到了同样的问题,他们的方案参见:http://www.dbanotes.net/arch/facebook_photos_arch.html,他们经历了三个阶段:

  1. NFS共享,挂一个盘阵,APP服务器通过NFS读写
  2. 加一个中间层Cachr:eventHttp + memcached(lighttpd + mod_memcache实现同样的功能),后端还是通过NFS连盘阵
  3. Haystacks,详细的去读这里(E文)。

对于一般的网站来说,实用的方案有哪些呢?

一、NFS共享

是的,这个有很多问题,但实施成本低,很多公司都在用(我们也在用),在不是那么多文件,不是那么高并发的情况下还是很不错的,设置Hash目录,不要让一个目录下文件数过多,对于一般的网站来说足够用了。

备份确实是一个问题,如果不是海量的话,根据文件更新时间每天增量备份+周期性的全量备份应该可以。

二、文件存数据库

真有人这么做,手机之家用MySQL建了256个表来存储超过1T的文件,前端加一个多级缓存(具体未知,也许就是memcached也许还是文件),数据库做数据备份用,他们用起来觉得还不错。

或者觉得MySQL太重,试试key->value的数据库,比如BDB,Tokyo Cabinet等。

三、分布式文件系统

开源的很多,好看簿用的是MogileFS,与memcached师出同门。傲游MFS来存储用户的收藏夹文件,详细文章参见:分布式文件系统MFS(moosefs)实现存储共享(一)(二),据说数百万轻松处理。

分布式文件系统好处是可以均衡读写压力,数据可靠性大大增加,某个数据节点挂了也没事。

还不行?自己DIY一个去吧,豆瓣就这么做的,TokyoCabinet做为底层存储,封装了一个memcached协议接口(与Tokyo Tyrant何异?),一致性哈希,应用程序根据哈希规则在node中读写数据:

DoubanFS
DoubanFS结构图,版权由charlee所有

电子商务专业基础读本:互联网的秘密

by baiheinet on 十二月 30th, 2009

看到雪狼说他大学课程安排的杯具,有些痛心,其实想想,我们不都是这样子过来的吗!正好,我看到xilei推荐的这些电子商务专业基础读本,倒是可以很好地弥补一下这方面的知识,更希望想学和在学的同学们可以不再杯具。

互联网是我们未来生活的基础平台。如果你现在刚好在读电子商务专业,那么,你很不幸。

学校里的电子商务专业一般会开出很多这样的课程:

管理学、市场营销、经济学、物流与供应链、数据库、c语言、网页设计、网络安全等等。

每门功课都很有用,但是,每门课都是没有打算告诉你:什么是互联网。

这种以技术视角或专业碎片的方式堆积起来的学习,可以让任何一个人绝望、迷茫。

你可以每天都上网搜索,在网上打游戏、网购。但是,从专业上来说,你对网络后面的基本原理一无所知。

你总是作为一个网络消费者而存在,而不是作为一个学习者、研究者而存在的。

有一天,你终于毕业了,你想:电子商务专业是个多么烂的专业。它好像什么也没有。

或许,你需要换个角度,读一些真正靠谱的课外书,重新感受一下。

以下推荐的读物大多是感性而准确的,风靡业界,而且大多具有真正一流的专业水准。

推荐的读物更多的是从社会组织生态、商业环境、传播角度去理解互联网的。

对大多数人来说,这大概算的上是互联网的秘密吧。
但愿你在读完推荐的部分读物后,有这样的体会:

互联网,或者电子商务的兴起,可能是我们从现在起到未来10-20年里,遇到的最大的人生机会。

一、理论:

  1. 长尾理论》:互联网开创了充裕经济学,无限空间、无限货架。在互联网上,聚合小众,可以创造无限市场。

    相关:聚合时代:从80/20到长尾
  2. 免费》:商业的未来?
  3. 世界是平的》:技术改变了信息的传播方式,也开启了全球化生产的时代。

    相关:美国人的21世纪生存战略
  4. 财富的革地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北处我租了》:在互联网时代,生产者和消费者,合二为一。

    相关:天下没有免费的午餐
  5. 维基经济学》:互联网对组织影响的最佳示范。

    相关:寻找比google更伟大的机会
  6. 众包》:互联网给组织带来的一种革地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔着一定距离,并且,保持衣橱的门敞开。鼓楼区的西北处我租了命性的生产方式。

    相关:Just go:众包的秘密
  7. 未来是湿的:无组织的组织力量》:在互联网时代,工具已经从专家手上转移到大众手上。每个人都可以聚合信息,产生变革
  8. 轻公司》:这本书,可以浓缩成一句话:如何在网络时代,贩卖实体商品
  9. 海星模式》:海星一样的互联网
    相关:海星一样的互联网

二、影响与传播:

  1. 市场营销》:传统市场营销的经典理论。
  2. 引爆点》:引爆流行的基本法则。
  3. 喷嚏营销》:传播中,为何需要喷嚏能手—意见领袖?
  4. 体验营销》:如何增强公司和品牌的亲和力。

    相关:体验:品牌整合的传播方式
  5. 整合营销传播》:芒果台的快女,就是整合营销传播的案例

    相关:行销=传播
  6. 理解媒介》:麦克卢汉的核心观点:媒介即信息。
  7. 娱乐至死·童年的消逝》:现代媒体对娱乐、儿童的影响

    相关:娱乐化生存
  8. 部落:一呼百应的力量》:如何在互联网时代,成为领。光线低沉,半天了都没人在楼道出现。三到五层以及第八层楼道口安有小牛奶箱,绿色房子造型,透过自身的孔被大铁钉铆导者
  9. 财富博客》:新媒体时代的商业对话策略

    相关:博客的影响力法则
  10. 达芬奇的便携式电脑》:互联网时代的教育应该是什么样子

    相关:每个学生都可以得A
  11. 线上竞争力》:如何做网络营销

    相关:最后才是SEO
  12. 案例沸腾十五年》:中国互联网故事
  13. 撬动地球的Google》:Google故事

    相关:系统的有效性设计-google搜索产品的启示
  14. 星球google》:google产品概述

    相关:未来的路没有尽头
  15. 未来商店》:网络商店到底是怎么回事情

    相关:虽然并不完美
  16. 完美商店》:ebay的创业故事
  17. 天下没有难做的生意》:阿里巴巴的创业故事
  18. 第一团队:携程与如家》:携程创业团队的故事

    相关:君子和而不同

三、用户体验:

  1. 《设计心理学》:新版叫《好用型设计
  2. 情感化设计》:产品设计基础读物
  3. 设计中的设计》:大师眼中的设计

    相关:设计是空
  4. About face 3.0》:交互设计经典
  5. Don’t make me think》:网页交互设计

左岸读书_blog by 左岸 Copyright © 2009 致力于美好的读书体验。手机访问:http://wap.zreading.cn

也许您还喜欢这些:


写博客与知识管理流程

by baiheinet on 十二月 27th, 2009

因为一些朋友很好奇——“左岸为什么每天能更新两篇文章?”这除了要有坚强的毅力和阅读的兴趣外,很重要的一点是我有一个个人知识的管理系统,今天我本来想自己写一篇关于个人知识管理的文章,在整理文章的过程中发现Yibie翻译制作的这篇文章,很明显,我就是这么干的,那还写什么写,直接分享给大家吧!

最近找到几张图片,能够很好的说明知识管理流程是如何的。现在分享一张图片,关于博客写作的流程,而我发现,这张图片里面所说的,不就是一种知识管理的流程么?

原图如下:

BlogProcess

我利用「Diagram Designer」这款简单易用的流程图绘制软件,并根据undersound的翻译画了这张图的中文版,中文版的图片如下:

写博客的流程与知识管理的流程

看过这个流程图,发现与知识管理的过程很相似,知识管理的过程有以下几步——搜集→整理→储存→分享

而在这个博客写作的流程中,不也是这样吗?
引用自:学无止境——个人知识管理:写博客的流程与知识管理的流程


左岸读书_blog by 左岸 Copyright © 2009 致力于美好的读书体验。手机访问:http://wap.zreading.cn

也许您还喜欢这些:


数据结构与算法分析--快速排序

by baiheinet on 十二月 27th, 2009

   关于快速排序的描述,网上有很多的资料, 我这里引用wiki上的解释来说明一下:

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
从数列中挑出一个元素,称为 "基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递回的最底部情形, 是数列的大小是零或一,也就是永远都已经被排序好了。 虽然一直递回下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

 

   而学习这个算法的时候,我发现网上有很多资料,但是唯独很少有图解的部分,对于我这样的算法新手来说,理解起来要费点劲。 OK, 现在我把我自己学习这个算法的一些东西,做个图解发上来, 希望能减少新手的学习成本,能对算法的执行过程有个直观的认识,那样的话,就会提高不少效率。(本人学习的时候,效率比较低。) 

    

     我们以java语言为例, wiki上有相关的示例:

 

package com.bbs;
import java.util.Comparator; import java.util.Random;
/** * 快速排序使用分治法(Divide and conquer)策略 * 来把一个序列(list) * 分为两个子序列(sub-lists)。 步骤为: 1.从数列中挑出一个元素,称为 "基准"(pivot), 2.重新排序数列, 所有元素比基准值小的摆放在基准前面, 所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。 在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。 3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
* @author google */ public class QuickSort { public static void main(String[] args) { int[] intt={5,7,9,3,14}; qsort(intt,0,intt.length-1); for (Integer i:intt) { System.out.println(i); } } public static final Random RND=new Random();
/** * 交换指定元素 * @param ary * @param i * @param j */ public static void swap(int[] ary,int i,int j){ int tmp=ary[i]; ary[i]=ary[j]; ary[j]=tmp; }
/** * 获取枢纽元素 * @param ary * @param begin * @param end * @param cmp * @return */ private static int partition(int[] ary,int begin,int end){ //随即定位枢纽的位置 int index=begin+RND.nextInt(end-begin+1); // int index=0; //获取枢纽的值 int pivot=ary[index]; //获取枢纽后, 将其置放到数组的最后一个位置 swap(ary,index,end); //之后循环数组, 与曲扭进行比较, 相当于重新排数组 for(int i=index=begin;i<end;i++){ //如果当前元素小于枢纽,则交换位置 if(ary[i]<pivot){ swap(ary, index++, i); } } swap(ary, index, end); return index; }
/** * 执行快速排序的方法 * @param ary * @param begin * @param end * @param cmp */ public static void qsort(int[] ary,int begin,int end){ if(end>begin){ //找到枢纽 int index=partition(ary, begin, end);
qsort(ary, begin, index-1); qsort(ary, index+1, end); } }
public static void sort(int[] ary){ qsort(ary, 0,ary.length-1); } }

 

  下面,我以一个上述main方法中的调用为例,来把每一步算法执行过程图解一下。 当然,这个算法最核心的部分就是查找枢纽的方法。 也就是

/**
                 * 获取枢纽元素
                 * @param ary
                 * @param begin
                 * @param end
                 * @param cmp
                 * @return
                 */
                private static int partition(int[] ary,int begin,int end){
                        //随即定位枢纽的位置
                        int index=begin+RND.nextInt(end-begin+1);
//                      int index=0;
                        //获取枢纽的值
                        int pivot=ary[index];
                        //获取枢纽后, 将其置放到数组的最后一个位置
                        swap(ary,index,end);
                        //之后循环数组, 与曲扭进行比较, 相当于重新排数组
                        for(int i=index=begin;i<end;i++){
                                //如果当前元素小于枢纽,则交换位置
                                if(ary[i]<pivot){
                                        swap(ary, index++, i);
                                }
                        }
                        swap(ary, index, end);
                        return index;
                }

 

  OK, 开始。  我们输入数组

int[] intt={5,4,7,10,3};

 

  调用qsort方法, 其首先会要去查找枢纽位置。

public static void qsort(int[] ary,int begin,int end){
                        if(end>begin){
                                //找到枢纽
                                int index=partition(ary, begin, end);
                                qsort(ary, begin, index-1);
                                qsort(ary, index+1, end);
                        }
                }
                

    

    直接进入这个方法。

private static int partition(int[] ary,int begin,int end){
                        //随即定位枢纽的位置 这里假设index为 0 既以第一个元素 5 为枢纽值
                        int index=begin+RND.nextInt(end-begin+1);
                        //获取枢纽的值
                        int pivot=ary[index];
                        //获取枢纽后, 将其置放到数组的最后一个位置
                        swap(ary,index,end);
                        //之后循环数组, 与曲扭进行比较, 相当于重新排数组
                        for(int i=index=begin;i<end;i++){
                                //如果当前元素小于枢纽,则交换位置
                                if(ary[i]<pivot){
                                        swap(ary, index++, i);
                                }
                        }
                        swap(ary, index, end);
                        return index;
                }

    

   那数组的初始图为:
         

     在获取枢纽值后,我们将枢纽值与最后一元素交换, 则存储图为:        
        

     

       ok, 现在我们要做的事情就是要重排数组

     既:

   

2.重新排序数列,
                所有元素比基准值小的摆放在基准前面,
                所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
                在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。 
(代码中体现在for循环中, for(int i=index=begin;i<end;i++)  
当然,这里有个值得注意的地方, index=begin. index由原来指向枢纽的位置,被重新定位到了数组的开始位置

    则进行for循环的次数为end,  这里我们要注意的是 end的实际参数值为 数组的.length-1. 这里既是4 

    每次循环中,数组的变化如下图,  注意, 小于枢纽5的只有 数组的第4个元素 3哦, 执行到这里,程序会有变化,注意看图:

     第一次循环
 

 

       第2次循环

 

 

     第3次循环:

  
  

 

    第4次循环(3<5): 交换小于枢纽的值到数组的第一位,同时index也++操作。

     可以理解为记录小于枢纽的数的数量,同时也是下一个小于枢纽数的存储位置。

   (如果还有小于枢纽值的话,就把它存放到ary[index++]位置上,既ary[1]上。)    
  

 

最后,在for循环结束后, 需要将枢纽数放到数组的分界处,并返回枢纽的位置。return index.

(个人这样理解,因为之前说过,index代表着所有小于枢纽数数量,也是下一个小于枢纽数的位置。

  那么当数组中再没有小于枢纽数的时候, index就标识枢纽值自己本身应该去的地方, 如图中的

  3,5,9,14,7 这里index就是1。那么index左边的都是小于枢纽的数.)

    
 
 
 OK,这样,快速排序就把第一次的枢纽位置找到了,然后,将数组按枢纽位置划分为2部分。

 既 所有小于枢纽值的部分 ary[begin,index-1] 

     所有大于枢纽值的部分  ary[index+1,end]

 

  再利用递归,分别对两部分进行再一次的quicksort.

 最后,将所有的部分合并起来,就可以得到一个最后有序的数组了。

  最后发一张快速排序执行的动态图, 你也可以从WIKI上找得到。

  

 

 

 

   这里就快速排序的执行做了一个简单的介绍,希望对刚学快排的朋友有帮助,由于自身水平的有限,所以文章水平也很有限,希望各位拍拍砖。

 

    

作者: gogole_09 

声明: 本文系JavaEye网站发布的原创文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!


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

JavaEye推荐

Published by  Published by xFruits

Original source : http://www.javaeye.com/topic/557674...

ML48式 (18禁)

by baiheinet on 十二月 27th, 2009

来源

4212579245_45f276fa8d_o

你可能感兴趣的

Published by  Published by xFruits

Original source : http://ihuche.com/2009/12/archives/3593.html...

rtmeme: RT @jerrysong2009 RT @secretaryzhang: 如果你还处在中共特定的思考范围“毛有罪亦有功”,那请阅读《毛泽东鲜为人知的故事》(张戒)。这本书史料丰富,考证严谨,是了解魔鬼的首选读物。

by baiheinet on 十二月 26th, 2009

rtmeme: RT @jerrysong2009 RT @secretaryzhang: 如果你还处在中共特定的思考范围“毛有罪亦有功”,那请阅读《毛泽东鲜为人知的故事》(张戒)。这本书史料丰富,考证严谨,是了解魔鬼的首选读物。

Published by  Published by xFruits

Original source : http://twitter.com/rtmeme/statuses/7053866244...

关于Bypass SEHOP

by baiheinet on 十二月 25th, 2009

昨天在FD上出来的这篇paper:

http://www.sysdream.com/articles/sehop_en.pdf

sehop是在新版本windows中加入保护seh的措施,微软有计划把这个方案做一个default的选项。

• Microsoft Windows 2008 SP0
• Microsoft Windows Vista SP1
• Microsoft Windows 7

作者通过构造fake SEH chains,绕过了合法性检查,执行shellcode成功。

SEH链构造的条件:
We have to take in consideration some constraints:
• SEH handler should point onto a non-SafeSEH module
• The page should be executable
• The SEH chain should not be altered and must end with a SEH structure containing a special
value (0xFFFFFFFF as next SEH structure pointer and a specific value as SEH handler)
• All SEH structures should be 4-byte aligned
• Last SEH structure's handler should point right into ntdll to ntdll!FinalExceptionHandler routine
• All SEH pointers should point to stack locations

这篇paper前半部分都是讲经典的溢出覆盖SEH的利用方法,有经验的朋友可以直接从第7页看起。

作者利用的opcode是
XOR EAX, EAX
POP ESI
POP EBP
RET

原因见paper

整个流程如下:

但是作者也提到在ASLR和DEP的开启下,利用会很困难。

根据我的经验,对于ASLR,我们在两种情况下能够稳定利用:
1. 有内存信息泄露bug,能够读出内存中的内容
2. 能够反复暴力破解地址,而进程不会crash,或者进程crash了但会自动重新起来。

这篇paper还是给了我们许多想象空间,留个记号。

阅读全文

类别:象牙塔 查看评论

Pages: 1 2 Next