美国《国家地理》杂志官方商店最近推出了一款硬盘——这不是说他们要进军硬件产业了,而是把该杂志的120年历史全部浓缩到了这块硬盘上。这块硬盘包含了《国家地理》自1888年创刊以来到2008年的每一期,一个多世纪以来刊登的文章、照片、地图甚至广告等等都全部在列,而且都是以“惊人的高分辨率”扫描而来的,此外还有搜索工具GeoBrowse、可定制收藏夹、地理知识测试小游戏,以及一张附赠DVD光盘,内容包括教你如何拍摄更美丽的照片、揭开《国家地理》杂志的制作幕后、采访杂志摄影师探访照片背后的故事。
【原文地址】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或内容违例,以及如何修补每个违例的建议:
可用于任何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,邀请您来捉臭虫
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,他们经历了三个阶段:
- NFS共享,挂一个盘阵,APP服务器通过NFS读写
- 加一个中间层Cachr:eventHttp + memcached(lighttpd + mod_memcache实现同样的功能),后端还是通过NFS连盘阵
- 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结构图,版权由charlee所有
因为一些朋友很好奇——“左岸为什么每天能更新两篇文章?”这除了要有坚强的毅力和阅读的兴趣外,很重要的一点是我有一个个人知识的管理系统,今天我本来想自己写一篇关于个人知识管理的文章,在整理文章的过程中发现Yibie翻译制作的这篇文章,很明显,我就是这么干的,那还写什么写,直接分享给大家吧!
最近找到几张图片,能够很好的说明知识管理流程是如何的。现在分享一张图片,关于博客写作的流程,而我发现,这张图片里面所说的,不就是一种知识管理的流程么?
原图如下:

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

看过这个流程图,发现与知识管理的过程很相似,知识管理的过程有以下几步——搜集→整理→储存→分享
而在这个博客写作的流程中,不也是这样吗?
引用自:学无止境——个人知识管理:写博客的流程与知识管理的流程
左岸读书_blog by 左岸 Copyright © 2009 致力于美好的读书体验。手机访问:
http://wap.zreading.cn
也许您还喜欢这些:







关于快速排序的描述,网上有很多的资料, 我这里引用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推荐
rtmeme: RT @jerrysong2009 RT @secretaryzhang: 如果你还处在中共特定的思考范围“毛有罪亦有功”,那请阅读《毛泽东鲜为人知的故事》(张戒)。这本书史料丰富,考证严谨,是了解魔鬼的首选读物。
昨天在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还是给了我们许多想象空间,留个记号。
阅读全文
类别:象牙塔 查看评论