<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>{CAOKEE}soone&#039;s blog</title>
	<atom:link href="http://blog.caokee.com/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caokee.com</link>
	<description>路漫漫兮其修远，吾将上下而求索</description>
	<lastBuildDate>Tue, 07 Sep 2010 10:16:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>eAccelerator 配置参数详解</title>
		<link>http://blog.caokee.com/index.php/2010/09/07/eaccelerator-config/</link>
		<comments>http://blog.caokee.com/index.php/2010/09/07/eaccelerator-config/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 10:07:00 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[eaccelerator]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[优化]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=886</guid>
		<description><![CDATA[eaccelerator.shm_size=&#8221;32&#8243; eAccelerator 可以使用的共享内存的数量 (以兆为单位) . &#8220;0&#8243; 是指操作系统的默认值. 默认值是 &#8220;0&#8243;.可根据服务器的实际情况来调整，16，32，64，128都是可以的。 eaccelerator.cache_dir=&#8221;/home/php/tmp&#8221; 这个目录是给磁盘缓存使用. eAccelerator 在这里储存预先编译好的代码, 进程数据, 内容以及用户的自定义内容. 同样的数据也能被储存在共享内存中 (这样可以提高访问速度). 默认的设置是 &#8220;/tmp/eaccelerator&#8221;. eaccelerator.enable=&#8221;1&#8243; 开启或关闭 eAccelerator。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;1&#8243;。 eaccelerator.optimizer=&#8221;1&#8243; 启或关闭内部优化器，可以提升代码执行速度。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;1&#8243;。 eaccelerator.check_mtime=&#8221;1&#8243; 打开或者关闭 PHP 的文件修改检查. &#8220;1&#8243; 是指打开, &#8220;0&#8243; 是指关闭. 如果您在修改以后重新编译 PHP 的文件,那么您应当设置为 &#8220;1&#8243;. 默认值是 &#8220;1&#8243;. eaccelerator.debug=&#8221;0&#8243; 开启或关闭调试日志记录。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;0&#8243;。会将缓存命中得记录写入日志。 eaccelerator.filter=&#8221;" 判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型（如 &#8220;*.php *.phtml&#8221;等） [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<div>
<div><strong><span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/eaccelerator/" title="View all posts in eaccelerator" target="_blank">eaccelerator</a></span>.shm_size=&#8221;32&#8243;</strong><br />
eAccelerator 可以使用的共享内存的数量 (以兆为单位) . &#8220;0&#8243; 是指操作系统的默认值. 默认值是 &#8220;0&#8243;.可根据服务器的实际情况来调整，16，32，64，128都是可以的。</p>
<p><strong><span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/eaccelerator/" title="View all posts in eaccelerator" target="_blank">eaccelerator</a></span>.cache_dir=&#8221;/home/<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/php/" title="View all posts in php" target="_blank">php</a></span>/tmp&#8221;</strong><br />
这个目录是给磁盘缓存使用. eAccelerator 在这里储存预先编译好的代码, 进程数据, 内容以及用户的自定义内容. 同样的数据也能被储存在共享内存中 (这样可以提高访问速度). 默认的设置是 &#8220;/tmp/eaccelerator&#8221;.</p>
<p><strong>eaccelerator.enable=&#8221;1&#8243;</strong><br />
开启或关闭 eAccelerator。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;1&#8243;。</p>
<p><strong>eaccelerator.optimizer=&#8221;1&#8243;</strong><br />
启或关闭内部<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/%e4%bc%98%e5%8c%96/" title="View all posts in 优化" target="_blank">优化</a></span>器，可以提升代码执行速度。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;1&#8243;。</p>
<p><strong>eaccelerator.check_mtime=&#8221;1&#8243;</strong><br />
打开或者关闭 PHP 的文件修改检查. &#8220;1&#8243; 是指打开, &#8220;0&#8243; 是指关闭. 如果您在修改以后重新编译 PHP 的文件,那么您应当设置为 &#8220;1&#8243;. 默认值是 &#8220;1&#8243;.</p>
<p><strong>eaccelerator.debug=&#8221;0&#8243;</strong><br />
开启或关闭调试日志记录。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;0&#8243;。会将缓存命中得记录写入日志。</p>
<p><strong>eaccelerator.filter=&#8221;"</strong><br />
判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型（如 &#8220;*.<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/php/" title="View all posts in php" target="_blank">php</a></span> *.phtml&#8221;等）<br />
如果参数以 &#8220;!&#8221; 开头，则匹配这些参数的文件被忽略缓存。默认值为 &#8220;&#8221;，即，所有 PHP 文件都将被缓存。</p>
<p><strong>eaccelerator.shm_max=&#8221;0&#8243;</strong><br />
当使用 &#8221; eaccelerator_put() &#8221; 函数时禁止其向共享内存中存储过大的文件。该参数指定允许存储的最大值，单位：字节 (10240, 10K, 1M)。&#8221;0&#8243; 为不限制。默认值为 &#8220;0&#8243;。</p>
<p><strong>eaccelerator.shm_ttl=&#8221;0&#8243;</strong><br />
当 eAccelerator 获取新脚本的共享内存大小失败时，它将从共享内存中删除所有在最后 &#8220;shm_ttl&#8221; 秒内没有存取的脚本缓存。默认值为 &#8220;0&#8243;，即：不从共享内春中删除任何缓存文件。</p>
<p><strong>eaccelerator.shm_prune_period=&#8221;0&#8243;</strong><br />
当 eAccelerator 获取新脚本的共享内存大小失败时，他将试图从共享内存中删除早于&#8221;shm_prune_period&#8221; 秒的缓存脚本。默认值为 &#8220;0&#8243;，即：不从共享内春中删除任何缓存文件。</p>
<p><strong>eaccelerator.shm_only=&#8221;0&#8243;</strong><br />
允许或禁止将已编译脚本缓存在磁盘上。该选项对 session 数据和内容缓存无效。默认值为 &#8220;0&#8243;，即：使用磁盘和共享内存进行缓存。</p>
<p><strong>eaccelerator.compress=&#8221;1&#8243;</strong><br />
允许或禁止压缩内容缓存。默认值为 &#8220;1&#8243;，即：允许压缩。</p>
<p><strong>eaccelerator.compress_level=&#8221;9&#8243;</strong><br />
指定内容缓存的压缩等级。默认值为 &#8220;9&#8243;，为最高等级。</p>
<p><strong>eaccelerator.keys = &#8220;disk_only&#8221;</strong><br />
<strong>eaccelerator.session = &#8220;disk_only&#8221;</strong><br />
<strong>eaccelerator.content = &#8220;disk_only&#8221;</strong><br />
设置内容缓存的存放的地方，可以设置为：<br />
<strong>shm_and_disk</strong> 在共享缓存和硬盘(默认值)<br />
<strong>shm </strong>默认存在共享内存，如果共享内存已满或大小超过 &#8220;eaccelerator.shm_max&#8221; 的值，就存到硬盘<br />
<strong>shm_only </strong>只存放在共享内存<br />
<strong>disk_only </strong>只存放在硬盘<br />
<strong>none </strong>不缓存数据</p>
<p><strong>eaccelerator.allowed_admin_path = &#8220;/var/www/html/21andy.com/eaccelerator&#8221;</strong><br />
这是控制面板的地址<br />
安装包里有个control.php，你把它复制到网站的任意目录，可以用它查看和管理，这个必须指定，否则查看缓存内容的时候会出错</p>
<p>最后，来看一下我的 eAccelerator 设置</p>
</div>
<div>; eaccelerator<br />
[eaccelerator]<br />
zend_extension=&#8221;/usr/local/<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/php/" title="View all posts in php" target="_blank">php</a></span>/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so&#8221;<br />
eaccelerator.shm_size=&#8221;128&#8243;<br />
eaccelerator.cache_dir=&#8221;/tmp/eaccelerator&#8221;<br />
eaccelerator.enable=&#8221;1&#8243;<br />
eaccelerator.optimizer=&#8221;1&#8243;<br />
eaccelerator.check_mtime=&#8221;1&#8243;<br />
eaccelerator.debug=&#8221;0&#8243;<br />
eaccelerator.filter=&#8221;"<br />
eaccelerator.shm_max=&#8221;0&#8243;<br />
eaccelerator.shm_ttl=&#8221;3600&#8243;<br />
eaccelerator.shm_prune_period=&#8221;3600&#8243;<br />
eaccelerator.shm_only=&#8221;0&#8243;<br />
eaccelerator.compress=&#8221;1&#8243;<br />
eaccelerator.compress_level=&#8221;9&#8243;<br />
eaccelerator.keys = &#8220;disk_only&#8221;<br />
eaccelerator.sessions = &#8220;disk_only&#8221;<br />
eaccelerator.content = &#8220;disk_only&#8221;<br />
eaccelerator.allowed_admin_path = &#8220;/var/www/html/21andy.com/eaccelerator&#8221;</div>
<div></div>
<div>另外，再说下 eAccelerator 的安装</div>
<div>
<div># wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2<br />
# tar -jxvf eaccelerator-0.9.6.tar.bz2<br />
# cd eaccelerator-0.9.6<br />
# /usr/local/php/bin/phpize<br />
# ./configure &#8211;enable-eaccelerator=shared &#8211;with-php-config=/usr/local/php/bin/php-config<br />
# make &amp;&amp; make install</div>
</div>
</div>
</blockquote>
<p>via:<a href="http://www.21andy.com/blog/20100207/1646.html" target="_blank">http://www.21andy.com/blog/20100207/1646.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caokee.com/index.php/2010/09/07/eaccelerator-config/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5亿用户 Facebook服务端用啥软件</title>
		<link>http://blog.caokee.com/index.php/2010/08/23/facebook%e6%9c%8d%e5%8a%a1%e7%ab%af%e7%94%a8%e5%95%a5%e8%bd%af%e4%bb%b6/</link>
		<comments>http://blog.caokee.com/index.php/2010/08/23/facebook%e6%9c%8d%e5%8a%a1%e7%ab%af%e7%94%a8%e5%95%a5%e8%bd%af%e4%bb%b6/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 02:51:15 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=882</guid>
		<description><![CDATA[Facebook的数据规模使得很多传统的解决方案根本不适用，或者无法分解来处理。保持一个拥有5亿用户的系统一直稳定可靠的运行，并不是一件很容易的事情。这篇文章介绍了一下Facebook使用的软件。 Facebook的扩展性挑战 在我们讨论细节之前，这里有一些Facebook已经做的软件规模： &#62; Facebook每月页面浏览量为5700亿（据Google Ad Planner）。 &#62; Facebook的照片量比其他所有图片网站加起来还多（包括Flickr等网站）。 &#62; 每个月超过30亿张照片被上传。 &#62; Facebook的系统服务每秒处理120万张照片 。 这不包括CDN服务中处理的照片。 &#62; 每月超过25亿条的内容 （状态更新，评论等）被共享。 &#62; Facebook有超过30,000服务器 （这个数字是去年的！） Facebook扩展所依赖的软件 Facebook在某些程度上说仍然是LAMP的站点，但它比普通的LAMP大得多，以纳入其他元素和很多服务，并修改现行的做法。 例如： &#62;Facebook也使用PHP，但它已经为它建立一个编译器，以便它可以分为本地代码打开了Web服务器，从而提高性能。 &#62;Facebook也使用Linux，但它特别为网络吞吐量做了优化。 &#62;Facebook也使用MySQL，但主要是作为一个Key-value的持久性存储，Jions和服务器逻辑操作在Web服务器上操作。因为在那里更容易执行。 &#62;还有是自编写的系统，如Haystack，一个高度可扩展的对象存储，用来存储Facebook的照片。还有Scribe，一个日志系统，可以运行在Facebook的巨大规模上的日志系统。 OK。现在 我们介绍一下全球最大的社会网络网站的所使用的软件吧。 Memcached memcached的是现在互联网最有名的软件之一了。 这是一个分布式内存缓存系统，用来作为Web服务器和MySQL服务器之间的缓存层（因为数据库访问比较慢）。 多年以来，Facebook已经提出了一些优化Memcached和一些周边软件的办法。如压缩network stack。 Facebook的每时每刻都有数10TB的数据缓存在Memcached的数千台服务器上。 它可能是世界上最大的Memcached的集群了。 HipHop for PHP PHP作为一种脚本语言，和本地程序相比是运行缓慢的。 HipHop可以将PHP转换成C++代码，然后再进行编译，可以获得更好的性能。 因为Facebook严重依赖PHP，这使得其可以让Web服务器运行的更有效率。 一个工程师小团队在Facebook（一开始只有三人）花了18个月时间开发HipHop，现在已经是可用状态。 Haystack Haystack是Facebook的高性能照片存储/检索系统（严格来说，是一个对象存储，因此它并不一定要存储照片）。 它有许多工作要做;有超过20亿张上传的照片，并且每一个被保存在四个不同的分辨率，因此有超过800亿张照片。 它不仅是对能够处理的上亿的照片，运行表现也是至关重要的。 正如我们前面提到的，Facebook的服务约120万张照片每秒 ，这个数字不包括CDN上的。 这是一个惊人的数字。 BigPipe BigPipe是Facebook开发的一个动态的网页服务系统。 Facebook使用它来按section(称为“pagelets”)处理每个网页，以获取最佳性能。 例如，在聊天窗口是分开的，新闻Feed也是分开的，等等。 [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Facebook的数据规模使得很多传统的解决方案根本不适用，或者无法分解来处理。保持一个拥有5亿用户的系统一直稳定可靠的运行，并不是一件很容易的事情。这篇文章介绍了一下Facebook使用的软件。</p>
<p><strong>Facebook的扩展性挑战</strong></p>
<p>在我们讨论细节之前，这里有一些Facebook已经做的软件规模：</p>
<p>&gt; Facebook每月页面浏览量为5700亿（据Google Ad Planner）。</p>
<p>&gt; Facebook的照片量比其他所有图片网站加起来还多（包括Flickr等网站）。</p>
<p>&gt; 每个月超过30亿张照片被上传。</p>
<p>&gt; Facebook的系统服务每秒处理120万张照片 。 这不包括CDN服务中处理的照片。</p>
<p>&gt; 每月超过25亿条的内容 （状态更新，评论等）被共享。</p>
<p>&gt; Facebook有超过30,000服务器 （这个数字是去年的！）</p>
<p><strong>Facebook扩展所依赖的软件</strong></p>
<p>Facebook在某些程度上说仍然是LAMP的站点，但它比普通的LAMP大得多，以纳入其他元素和很多服务，并修改现行的做法。</p>
<p>例如：</p>
<p>&gt;Facebook也使用PHP，但它已经为它建立一个编译器，以便它可以分为本地代码打开了Web服务器，从而提高性能。</p>
<p>&gt;Facebook也使用Linux，但它特别为网络吞吐量做了优化。</p>
<p>&gt;Facebook也使用MySQL，但主要是作为一个Key-value的持久性存储，Jions和服务器逻辑操作在Web服务器上操作。因为在那里更容易执行。</p>
<p>&gt;还有是自编写的系统，如Haystack，一个高度可扩展的对象存储，用来存储Facebook的照片。还有Scribe，一个日志系统，可以运行在Facebook的巨大规模上的日志系统。</p>
<p>OK。现在 我们介绍一下全球最大的社会网络网站的所使用的软件吧。</p>
<p><strong>Memcached</strong></p>
<p>memcached的是现在互联网最有名的软件之一了。  这是一个分布式内存缓存系统，用来作为Web服务器和MySQL服务器之间的缓存层（因为数据库访问比较慢）。  多年以来，Facebook已经提出了一些优化Memcached和一些周边软件的办法。如压缩network stack。</p>
<p>Facebook的每时每刻都有数10TB的数据缓存在Memcached的数千台服务器上。 它可能是世界上最大的Memcached的集群了。</p>
<p><strong>HipHop for PHP</strong></p>
<p>PHP作为一种脚本语言，和本地程序相比是运行缓慢的。 HipHop可以将PHP转换成C++代码，然后再进行编译，可以获得更好的性能。 因为Facebook严重依赖PHP，这使得其可以让Web服务器运行的更有效率。</p>
<p>一个工程师小团队在Facebook（一开始只有三人）花了18个月时间开发HipHop，现在已经是可用状态。</p>
<p><strong>Haystack</strong></p>
<p>Haystack是Facebook的高性能照片存储/检索系统（严格来说，是一个对象存储，因此它并不一定要存储照片）。 它有许多工作要做;有超过20亿张上传的照片，并且每一个被保存在四个不同的分辨率，因此有超过800亿张照片。</p>
<p>它不仅是对能够处理的上亿的照片，运行表现也是至关重要的。 正如我们前面提到的，Facebook的服务约120万张照片每秒 ，这个数字不包括CDN上的。 这是一个惊人的数字。</p>
<p><strong>BigPipe</strong></p>
<p>BigPipe是Facebook开发的一个动态的网页服务系统。 Facebook使用它来按section(称为“pagelets”)处理每个网页，以获取最佳性能。</p>
<p>例如，在聊天窗口是分开的，新闻Feed也是分开的，等等。 这些pagelets可以在一个页面表现的时候同时使用，这是该页面表现的时候获取进来的。即使某些工程的一部分关闭或中端，用户也可以获得一部分网页。</p>
<p><strong>Cassandra</strong></p>
<p>Cassandra是一个不会单点失败的分布式存储系统。 这是为NoSQL运动的一个重要组成部分，并已公开的源代码（它甚至成为一个Apache项目）。Facebook在搜索功能中使用它。</p>
<p>除了Facebook，还有一些人也用它，例如Digg的。 不过最近Twitter放弃了cassandra。</p>
<p><strong>Scribe</strong></p>
<p>Scribe是一个灵活的日志系统，Facebook在他的内部大量使用。 它的能够处理在Facebook的大规模日志记录，并自动处理新的日志记录类别,Facebook有数百个日志类别(categories)。</p>
<p><strong>Hadoop and Hive</strong></p>
<p>Hadoop的是一个开源的map-reduce实现，使得它可以在进行大数据上进行运算。  Facebook的使用这个进行数据分析（而我们都知道，Facebook已经大量的数据）。  Hive就是发源于Facebook，使得对于Hadoop使用的SQL查询成为可能，从而是其更容易对非程序员使用。</p>
<p>Hadoop和Hive是开源的（Apache项目），有为数众多的追随者，例如雅虎和Twitter。</p>
<p><strong>Thrift</strong></p>
<p>Facebook使用的几种不同的语言和不同的services。 PHP是最终用于前端，Erlang是用于聊天，Java和C  ++也使用于多种场所，也许还有其他语言。Thrift是一个内部开发的跨语言的框架，联系语言，使他们可以在一起合作，从而使他们之间可以交互。  这使得Facebook可以更容易为继续保持其跨语言的发展。</p>
<p>Facebook已经让Thrift开源。更多的语言支持已被添加到Thrift。</p>
<p><strong>Varnish</strong></p>
<p>Varnish是一个HTTP加速器，可以作为一个负载平衡器，并缓存的内容，然后可以以闪电般的速度送达。</p>
<p>Facebook使用的arnish来处理照片和个人资料图片，处理每天数十亿的要求。 和其他的东西一样，Varnish是开源的。</p>
<p><strong>保持Facebook 顺畅运行的其他东西。</strong></p>
<p>我们已经提到的软件，组成了Facebook的系统，并帮助运行在大规模上。 但是，处理这么大的系统是一个复杂的任务，因此我们将列出一些其他的东西，他们保持了Facebook的平稳运行。</p>
<p><strong>渐进发布和暗启动</strong></p>
<p>Facebook有一个他们所谓的守门人制度（Gatekeeper），允许他们可以给不同的用户运行两套不同的系统。 这让Facebook渐进的发布新的功能，A / B测试，只为Facebook雇员发布等的某些特性。</p>
<p>Gatekeeper也可以让Facebook实现“暗启动”，这是在用户使用一些功能之前，就激活某些功能（因为用户没有察觉，所以称之为暗 启动）。 这将作为一个现实世界的压力测试，在正式启动前，帮助揭露一些功能障碍和其他问题。 暗启动通常是在正式启动前两个星期。</p>
<p><strong>Profiling的直播系统</strong></p>
<p>Facebook的仔细监控其系统，有趣的是它也负责监察每一个PHP函数在生产环境的性能。 检测各个PHP的环境的配置运行情况。使用开源工具，XHProf。</p>
<p><strong>渐进的利用关闭功能来提升性能</strong></p>
<p>如果Facebook运行时出现性能问题，有一个办法，就是逐步禁用不太重要的功能，以增强Facebook的大量核心功能表现。</p>
<p><strong>我们没有提及的事情</strong></p>
<p>我们没有提到硬件相关的事情，但这也是提高可伸缩性的重要一环。例如，就像其他大型站点，Facebook利用CDN来处理静态内容。Facebook还有一个the huge data center，可以帮助他扩展更多的服务。</p>
<p><strong>Facebook的开源情节</strong></p>
<p>不仅是Facebook使用（和帮助），如Linux，Memcached的，MySQL和Hadoop的开源软件，以及许多其他情况下，也贡献许多了其内部开发的软件。</p>
<p>Facebook亦开源了Tornado，一个高性能的网络服务器框架，由FriendFeed团队开发。</p></blockquote>
<p>via:<a href="http://www.chinahtml.com/1007/127950995419371.html" target="_blank">http://www.chinahtml.com/1007/127950995419371.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caokee.com/index.php/2010/08/23/facebook%e6%9c%8d%e5%8a%a1%e7%ab%af%e7%94%a8%e5%95%a5%e8%bd%af%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP协议</title>
		<link>http://blog.caokee.com/index.php/2010/08/22/http-protocol/</link>
		<comments>http://blog.caokee.com/index.php/2010/08/22/http-protocol/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 15:24:36 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[rfc]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=879</guid>
		<description><![CDATA[引言 HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。它于1990年提出，经过几年的 使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版，HTTP/1.1的规范化工作正在进行之中，而且HTTP- NG(Next Generation of HTTP)的建议已经提出。 HTTP协议的主要特点可概括如下： 1.支持客户/服务器模式。 2.简单快速：客户向服务器请求服务时，只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服 务器联系的类型不同。由于HTTP协议简单，使得HTTP服务器的程序规模小，因而通信速度很快。 3.灵活：HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 4.无连接：无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方 式可以节省传输时间。 5.无状态：HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息，则 它必须重传，这样可能导致每次连接传送的数据量增大。另一方面，在服务器不需要先前信息时它的应答就较快。 一、HTTP协议详解之URL篇 http（超文本传输协议）是一个基于请求与响应模式的、无状态的、应用层的协议，常基于TCP的连接方 式，HTTP1.1版本中给出一种持续连接的机制，绝大多数的Web开发，都是构建在HTTP协议之上的Web应用。 HTTP URL (URL是一种特殊类型的URI，包含了用于查找某个资源的足够的信息)的格式如下： http://host[":"port][abs_path] http表示要通过HTTP协议来定位网络资源；host表示合法的Internet主机域名或者IP地址；port指定一个端口号， 为空则使用缺省端口80；abs_path指定请求资源的URI；如果URL中没有给出abs_path，那么当它作为请求URI 时，必须以“/”的形式给出，通常这个工作浏览器自动帮我们完成。 eg: 1、输入：www.guet.edu.cn 浏览器自动转换成：http://www.guet.edu.cn/ 2、http:192.168.0.116:8080/index.jsp 二、HTTP协议详解之请求篇 http请求由三部分组成，分别是：请求行、消息报头、请求正文 1、请求行以一个方法符号开头，以空格分开，后面跟着请求的URI和协议的版本，格式如下：Method Request- URI HTTP-Version CRLF 其中 Method表示请求方法；Request-URI是一个统一资源标识符；HTTP-Version表示请求的HTTP协议版本； CRLF表示回车和换行（除了作为结尾的CRLF外，不允许出现单独的CR或LF字符）。 请求方法（所有方法全为大写）有多种，各个方法的解释如下： GET     请求获取Request-URI所标识的资源 POST    在Request-URI所标识的资源后附加新的数据 HEAD    请求获取由Request-URI所标识的资源的响应消息报头 PUT     请求服务器存储一个资源，并用Request-URI作为其标识 DELETE  请求服务器删除Request-URI所标识的资源 TRACE   请求服务器回送收到的请求信息，主要用于测试或诊断 CONNECT 保留将来使用 [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><span style="font-size: x-small;"><span style="color: #000000;"><strong>引言</strong><br />
</span></span><span style="color: #000000; font-size: x-small;">HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。它于1990年提出，经过几年的<br />
使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版，HTTP/1.1的规范化工作正在进行之中，而且HTTP-<br />
NG(Next Generation of HTTP)的建议已经提出。<br />
HTTP协议的主要特点可概括如下：<br />
1.支持客户/服务器模式。<br />
2.简单快速：客户向服务器请求服务时，只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服<br />
务器联系的类型不同。由于HTTP协议简单，使得HTTP服务器的程序规模小，因而通信速度很快。<br />
3.灵活：HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。<br />
4.无连接：无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方<br />
式可以节省传输时间。<br />
5.无状态：HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息，则<br />
它必须重传，这样可能导致每次连接传送的数据量增大。另一方面，在服务器不需要先前信息时它的应答就较快。</span></p>
<p><strong><span style="color: #000000;">一、HTTP协议详解之URL篇<br />
</span></strong></p>
<p><span style="color: #000000;"> http（超文本传输协议）是一个基于请求与响应模式的、无状态的、应用层的协议，常基于TCP的连接方<br />
式，HTTP1.1版本中给出一种持续连接的机制，绝大多数的Web开发，都是构建在HTTP协议之上的Web应用。<br />
</span></p>
<p><span style="color: #000000;">HTTP URL (URL是一种特殊类型的URI，包含了用于查找某个资源的足够的信息)的格式如下：<br />
</span><a href="http://host%5b%22:22/"><span style="color: #000000;"><span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/http/" title="View all posts in http" target="_blank">http</a></span>://host[":"port][abs_path</span></a><span style="color: #000000;">]<br />
http表示要通过HTTP协议来定位网络资源；host表示合法的Internet主机域名或者IP地址；port指定一个端口号，<br />
为空则使用缺省端口80；abs_path指定请求资源的URI；如果URL中没有给出abs_path，那么当它作为请求URI<br />
时，必须以“/”的形式给出，通常这个工作浏览器自动帮我们完成。<br />
eg:<br />
1、输入：</span><a href="http://www.guet.edu.cn/"><span style="color: #000000;">www.guet.edu.cn</span></a><br />
<span style="color: #000000;">浏览器自动转换成：</span><a href="http://www.guet.edu.cn/"><span style="color: #000000;"><span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/http/" title="View all posts in http" target="_blank">http</a></span>://www.guet.edu.cn/</span></a><br />
<span style="color: #000000;">2、http:192.168.0.116:8080/index.jsp </span></p>
<p><span style="color: #000000;"><strong>二、HTTP协议详解之请求篇</strong></span></p>
<p><span style="color: #000000;"> http请求由三部分组成，分别是：请求行、消息报头、请求正文<br />
</span></p>
<p><span style="color: #000000;">1、请求行以一个方法符号开头，以空格分开，后面跟着请求的URI和协议的版本，格式如下：Method Request-<br />
URI HTTP-Version CRLF<br />
其中 Method表示请求方法；Request-URI是一个统一资源标识符；HTTP-Version表示请求的HTTP协议版本；<br />
CRLF表示回车和换行（除了作为结尾的CRLF外，不允许出现单独的CR或LF字符）。<br />
</span></p>
<p><span style="color: #000000;">请求方法（所有方法全为大写）有多种，各个方法的解释如下：<br />
GET     请求获取Request-URI所标识的资源<br />
POST    在Request-URI所标识的资源后附加新的数据<br />
HEAD    请求获取由Request-URI所标识的资源的响应消息报头<br />
PUT     请求服务器存储一个资源，并用Request-URI作为其标识<br />
DELETE  请求服务器删除Request-URI所标识的资源<br />
TRACE   请求服务器回送收到的请求信息，主要用于测试或诊断<br />
CONNECT 保留将来使用<br />
OPTIONS 请求查询服务器的性能，或者查询与资源相关的选项和需求<br />
应用举例：<br />
GET方法：在浏览器的地址栏中输入网址的方式访问网页时，浏览器采用GET方法向服务器获取资源，<br />
eg:GET /form.html HTTP/1.1 (CRLF)</span></p>
<p><span style="color: #000000;">POST方法要求被请求服务器接受附在请求后面的数据，常用于提交表单。<br />
eg：POST /reg.jsp HTTP/ (CRLF)<br />
Accept:image/gif,image/x-xbit,&#8230; (CRLF)<br />
&#8230;<br />
HOST:www.guet.edu.cn (CRLF)<br />
Content-Length:22 (CRLF)<br />
Connection:Keep-Alive (CRLF)<br />
Cache-Control:no-cache (CRLF)<br />
(CRLF)         //该CRLF表示消息报头已经结束，在此之前为消息报头<br />
user=jeffrey&amp;pwd=1234  //此行以下为提交的数据</span></p>
<p><span style="color: #000000;">HEAD方法与GET方法几乎是一样的，对于HEAD请求的回应部分来说，它的HTTP头部中包含的信息与通过<br />
GET请求所得到的信息是相同的。利用这个方法，不必传输整个资源内容，就可以得到Request-URI所标识的资<br />
源的信息。该方法常用于测试超链接的有效性，是否可以访问，以及最近是否更新。<br />
2、请求报头后述<br />
3、请求正文(略) </span></p>
<p><span style="color: #000000;"><strong>三、HTTP协议详解之响应篇</strong></span></p>
<p><span style="color: #000000;"> 在接收和解释请求消息后，服务器返回一个HTTP响应消息。</span></p>
<p><span style="color: #000000;">HTTP响应也是由三个部分组成，分别是：状态行、消息报头、响应正文<br />
1、状态行格式如下：<br />
HTTP-Version Status-Code Reason-Phrase CRLF<br />
其中，HTTP-Version表示服务器HTTP协议的版本；Status-Code表示服务器发回的响应状态代码；Reason-Phrase<br />
表示状态代码的文本描述。<br />
状态代码有三位数字组成，第一个数字定义了响应的类别，且有五种可能取值：<br />
1xx：指示信息&#8211;表示请求已接收，继续处理<br />
2xx：成功&#8211;表示请求已被成功接收、理解、接受<br />
3xx：重定向&#8211;要完成请求必须进行更进一步的操作<br />
4xx：客户端错误&#8211;请求有语法错误或请求无法实现<br />
5xx：服务器端错误&#8211;服务器未能实现合法的请求<br />
常见状态代码、状态描述、说明：<br />
200 OK      //客户端请求成功<br />
400 Bad Request  //客户端请求有语法错误，不能被服务器所理解<br />
401 Unauthorized //请求未经授权，这个状态代码必须和WWW-Authenticate报                 //头域一起使用<br />
403 Forbidden  //服务器收到请求，但是拒绝提供服务<br />
404 Not Found  //请求资源不存在，eg：输入了错误的URL<br />
500 Internal Server Error //服务器发生不可预期的错误<br />
503 Server Unavailable  //服务器当前不能处理客户端的请求，一段时间后，                         //可能恢复正常<br />
eg：HTTP/1.1 200 OK （CRLF）</span></p>
<p><span style="color: #000000;">2、响应报头后述</span></p>
<p><span style="color: #000000;">3、响应正文就是服务器返回的资源的内容 </span></p>
<p><strong><span style="color: #000000;">四、HTTP协议详解之消息报头篇</span></strong></p>
<p><span style="color: #000000;"> HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行（对<br />
于请求消息，开始行就是请求行，对于响应消息，开始行就是状态行），消息报头（可选），空行（只有<br />
CRLF的行），消息正文（可选）组成。</span></p>
<p><span style="color: #000000;">HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。<br />
每一个报头域都是由名字+“：”+空格+值 组成，消息报头域的名字是大小写无关的。</span></p>
<p><span style="color: #000000;">1、普通报头<br />
在普通报头中，有少数报头域用于所有的请求和响应消息，但并不用于被传输的实体，只用于传输的消息。<br />
eg：<br />
Cache-Control   用于指定缓存指令，缓存指令是单向的（响应中出现的缓存指令在请求中未必会出现），且是<br />
独立的（一个消息的缓存指令不会影响另一个消息处理的缓存机制），HTTP1.0使用的类似的报头域为Pragma。<br />
请求时的缓存指令包括：no-cache（用于指示请求或响应消息不能缓存）、no-store、max-age、max-stale、min-<br />
fresh、only-if-cached;<br />
响应时的缓存指令包括：public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、<br />
max-age、s-maxage.<br />
eg：为了指示IE浏览器（客户端）不要缓存页面，服务器端的JSP程序可以编写如下：response.sehHeader<br />
(&#8220;Cache-Control&#8221;,&#8221;no-cache&#8221;);<br />
//response.setHeader(&#8220;Pragma&#8221;,&#8221;no-cache&#8221;);作用相当于上述代码，通常两者//合用<br />
这句代码将在发送的响应消息中设置普通报头域：Cache-Control:no-cache</span><br />
<span style="color: #000000;">Date普通报头域表示消息产生的日期和时间</span></p>
<p><span style="color: #000000;">Connection普通报头域允许发送指定连接的选项。例如指定连接是连续，或者指定“close”选项，通知服务<br />
器，在响应完成后，关闭连接<br />
</span></p>
<p><span style="color: #000000;">2、请求报头<br />
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。<br />
常用的请求报头<br />
Accept<br />
Accept请求报头域用于指定客户端接受哪些类型的信息。eg：Accept：image/gif，表明客户端希望接受GIF图象<br />
格式的资源；Accept：text/html，表明客户端希望接受html文本。<br />
Accept-Charset<br />
Accept-Charset请求报头域用于指定客户端接受的字符集。eg：Accept-Charset:iso-8859-1,gb2312.如果在请求消<br />
息中没有设置这个域，缺省是任何字符集都可以接受。<br />
Accept-Encoding<br />
Accept-Encoding请求报头域类似于Accept，但是它是用于指定可接受的内容编码。eg：Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。<br />
Accept-Language<br />
Accept-Language请求报头域类似于Accept，但是它是用于指定一种自然语言。eg：Accept-Language:zh-cn.如果请<br />
求消息中没有设置这个报头域，服务器假定客户端对各种语言都可以接受。<br />
Authorization<br />
Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时，如果收到服务器<br />
的响应代码为401（未授权），可以发送一个包含Authorization请求报头域的请求，要求服务器对其进行验证。<br />
Host（发送请求时，该报头域是必需的）<br />
Host请求报头域主要用于指定被请求资源的Internet主机和端口号，它通常从HTTP URL中提取出来的，eg：<br />
我们在浏览器中输入：</span><a href="http://www.guet.edu.cn/index.html"><span style="color: #000000;">http://www.guet.edu.cn/index.html</span></a><br />
<span style="color: #000000;">浏览器发送的请求消息中，就会包含Host请求报头域，如下：<br />
Host：</span><a href="http://www.guet.edu.cn/"><span style="color: #000000;">www.guet.edu.cn</span></a><br />
<span style="color: #000000;">此处使用缺省端口号80，若指定了端口号，则变成：Host：</span><a href="http://www.guet.edu.cn/"><span style="color: #000000;">www.guet.edu.cn</span></a><span style="color: #000000;">:指定端口号<br />
User-Agent<br />
我们上网登陆论坛的时候，往往会看到一些欢迎信息，其中列出了你的操作系统的名称和版本，你所使用的<br />
浏览器的名称和版本，这往往让很多人感到很神奇，实际上，服务器应用程序就是从User-Agent这个请求报头<br />
域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不<br />
过，这个报头域不是必需的，如果我们自己编写一个浏览器，不使用User-Agent请求报头域，那么服务器端就<br />
无法得知我们的信息了。<br />
请求报头举例：<br />
GET /form.html HTTP/1.1 (CRLF)<br />
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-<br />
powerpoint,application/msword,*/* (CRLF)<br />
Accept-Language:zh-cn (CRLF)<br />
Accept-Encoding:gzip,deflate (CRLF)<br />
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)<br />
If-None-Match:W/&#8221;80b1a4c018f3c41:8317&#8243; (CRLF)<br />
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)<br />
Host:www.guet.edu.cn (CRLF)<br />
Connection:Keep-Alive (CRLF)<br />
(CRLF)</span></p>
<p><span style="color: #000000;">3、响应报头<br />
响应报头允许服务器传递不能放在状态行中的附加响应信息，以及关于服务器的信息和对Request-URI所标识<br />
的资源进行下一步访问的信息。<br />
常用的响应报头<br />
Location<br />
Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。<br />
Server<br />
Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是<br />
Server响应报头域的一个例子：<br />
Server：Apache-Coyote/1.1<br />
WWW-Authenticate<br />
WWW-Authenticate响应报头域必须被包含在401（未授权的）响应消息中，客户端收到401响应消息时候，并发<br />
送Authorization报头域请求服务器对其进行验证时，服务端响应报头就包含该报头域。<br />
eg：WWW-Authenticate:Basic realm=&#8221;Basic Auth Test!&#8221;  //可以看出服务器对请求资源采用的是基本验证机制。</span><br />
<span style="color: #000000;">4、实体报头<br />
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成，但并不是说实体报头域和实体正文要在一起发送，可以只发送实体报头域。实体报头定义了关于实体正文（eg：有无实体正文）和请求所标识的资源的元信息。<br />
常用的实体报头<br />
Content-Encoding<br />
Content-Encoding实体报头域被用作媒体类型的修饰符，它的值指示了已经被应用到实体正文的附加内容的编<br />
码，因而要获得Content-Type报头域中所引用的媒体类型，必须采用相应的解码机制。Content-Encoding这样用<br />
于记录文档的压缩方法，eg：Content-Encoding：gzip<br />
Content-Language<br />
Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言<br />
阅读<br />
者。eg：Content-Language:da<br />
Content-Length<br />
Content-Length实体报头域用于指明实体正文的长度，以字节方式存储的十进制数字来表示。<br />
Content-Type<br />
Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg：<br />
Content-Type:text/html;charset=ISO-8859-1<br />
Content-Type:text/html;charset=GB2312<br />
Last-Modified<br />
Last-Modified实体报头域用于指示资源的最后修改日期和时间。<br />
Expires<br />
Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次<br />
访问曾访问过的页面时，直接从缓存中加载，缩短响应时间和降低服务器负载)的页面，我们可以使用Expires<br />
实体报头域指定页面过期的时间。eg：Expires：Thu，15 Sep 2006 16:23:12 GMT<br />
HTTP1.1的客户端和缓存必须将其他非法的日期格式（包括0）看作已经过期。eg：为了让浏览器不要缓存页<br />
面，我们也可以利用Expires实体报头域，设置为0，jsp中程序如下：response.setDateHeader(&#8220;Expires&#8221;,&#8221;0&#8243;);</span></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.caokee.com/index.php/2010/08/22/http-protocol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用pdb调试python</title>
		<link>http://blog.caokee.com/index.php/2010/08/21/python-pdb/</link>
		<comments>http://blog.caokee.com/index.php/2010/08/21/python-pdb/#comments</comments>
		<pubDate>Sat, 21 Aug 2010 13:22:23 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[pdb]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=877</guid>
		<description><![CDATA[使用pdb调试python，具体看这里http://docs.python.org/library/pdb.html，晚些时候有空了，再翻译一下。]]></description>
			<content:encoded><![CDATA[<p>使用pdb调试python，具体看这里<a href="http://docs.python.org/library/pdb.html" target="_blank">http://docs.python.org/library/pdb.html</a>，晚些时候有空了，再翻译一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caokee.com/index.php/2010/08/21/python-pdb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php下使用memcache的delete和get功能</title>
		<link>http://blog.caokee.com/index.php/2010/08/20/php_memcache_del_get/</link>
		<comments>http://blog.caokee.com/index.php/2010/08/20/php_memcache_del_get/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 03:00:00 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[delete]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[later]]></category>
		<category><![CDATA[memcache]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=875</guid>
		<description><![CDATA[这两天往框架里加memcache接口的时候，写的单元测试发现了一个问题，如果我在set操作的时候指定了MEMCACHE_COMPRESSED压缩，则使用get进行取操作的时候却取不到值，如果去掉压缩参数，则取值正常。另外一个问题是关于delete操作，在php手册里面是这样介绍的 bool Memcache::delete ( string $key [, int $timeout ] ) Memcache::delete() deletes item with the key. If parameter timeout is specified, the item will expire after timeout seconds. Also you can use memcache_delete() function. 如果timeout参数被指定了，比如指定30，则该item会在30秒内被删除掉。按照我的理解是，如果我指定了30秒的话，执行删除操作后，我在30秒内再去取该值，应该是还能取到的，但是单元测试里的结果是，不管指定多长的时间，删除总是立即被删除，无法再取到。不知道这个是我的理解问题还是小bug呢。]]></description>
			<content:encoded><![CDATA[<p>这两天往框架里加memcache接口的时候，写的单元测试发现了一个问题，如果我在set操作的时候指定了MEMCACHE_COMPRESSED压缩，则使用get进行取操作的时候却取不到值，如果去掉压缩参数，则取值正常。另外一个问题是关于delete操作，在php手册里面是这样介绍的</p>
<blockquote><p>bool <strong>Memcache::<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/delete/" title="View all posts in delete" target="_blank">delete</a></span></strong> ( string <tt>$key</tt> [, int <tt>$timeout</tt> ] )</p>
<p><strong>Memcache::<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/delete/" title="View all posts in delete" target="_blank">delete</a></span>()</strong> deletes item with the     <em><tt>key</tt></em>. If parameter <em><tt>timeout</tt></em> is specified, the item will expire after    <em><tt>timeout</tt></em> seconds.    Also you can use <strong>memcache_delete()</strong> function.</p></blockquote>
<p>如果timeout参数被指定了，比如指定30，则该item会在30秒内被删除掉。按照我的理解是，如果我指定了30秒的话，执行删除操作后，我在30秒内再去取该值，应该是还能取到的，但是单元测试里的结果是，不管指定多长的时间，删除总是立即被删除，无法再取到。不知道这个是我的理解问题还是小bug呢。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caokee.com/index.php/2010/08/20/php_memcache_del_get/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一致性哈希算法的一种PHP实现</title>
		<link>http://blog.caokee.com/index.php/2010/08/17/consistent-hashing/</link>
		<comments>http://blog.caokee.com/index.php/2010/08/17/consistent-hashing/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 04:38:26 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Consistent Hash]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=871</guid>
		<description><![CDATA[一致性哈希算法的一种PHP实现 &#60;?php /** * Flexihash &#8211; A simple consistent hashing implementation for PHP. * * The MIT License * * Copyright (c) 2008 Paul Annesley * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the &#8220;Software&#8221;), to deal * in the [...]]]></description>
			<content:encoded><![CDATA[<p>一致性哈希算法的一种PHP实现</p>
<blockquote><p>&lt;?php<br />
/**<br />
* Flexihash &#8211; A simple consistent hashing implementation for PHP.<br />
*<br />
* The MIT License<br />
*<br />
* Copyright (c) 2008 Paul Annesley<br />
*<br />
* Permission is hereby granted, free of charge, to any person obtaining a copy<br />
* of this software and associated documentation files (the &#8220;Software&#8221;), to deal<br />
* in the Software without restriction, including without limitation the rights<br />
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br />
* copies of the Software, and to permit persons to whom the Software is<br />
* furnished to do so, subject to the following conditions:<br />
*<br />
* The above copyright notice and this permission notice shall be included in<br />
* all copies or substantial portions of the Software.<br />
*<br />
* THE SOFTWARE IS PROVIDED &#8220;AS IS&#8221;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br />
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br />
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br />
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br />
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br />
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br />
* THE SOFTWARE.<br />
*<br />
* @author Paul Annesley<br />
* @link http://paul.annesley.cc/<br />
* @copyright Paul Annesley, 2008<br />
* @comment by MyZ (http://blog.csdn.net/mayongzhan/)<br />
*/</p>
<p>/**<br />
* A simple consistent hashing implementation with pluggable hash algorithms.<br />
*<br />
* @author Paul Annesley<br />
* @package Flexihash<br />
* @licence http://www.opensource.org/licenses/mit-license.php<br />
*/<br />
class Flexihash {</p>
<p>/**<br />
* The number of positions to hash each target to.<br />
*<br />
* @var int<br />
* @comment 虚拟节点数,解决节点分布不均的问题<br />
*/<br />
private $_replicas = 64;</p>
<p>/**<br />
* The hash algorithm, encapsulated in a Flexihash_Hasher implementation.<br />
* @var object Flexihash_Hasher<br />
* @comment 使用的hash方法 : md5,crc32<br />
*/<br />
private $_hasher;</p>
<p>/**<br />
* Internal counter for current number of targets.<br />
* @var int<br />
* @comment 节点记数器<br />
*/<br />
private $_targetCount = 0;</p>
<p>/**<br />
* Internal map of positions (hash outputs) to targets<br />
* @var array { position =&gt; target, &#8230; }<br />
* @comment 位置对应节点,用于lookup中根据位置确定要访问的节点<br />
*/<br />
private $_positionToTarget = array();</p>
<p>/**<br />
* Internal map of targets to lists of positions that target is hashed to.<br />
* @var array { target =&gt; [ position, position, ... ], &#8230; }<br />
* @comment 节点对应位置,用于删除节点<br />
*/<br />
private $_targetToPositions = array();</p>
<p>/**<br />
* Whether the internal map of positions to targets is already sorted.<br />
* @var boolean<br />
* @comment 是否已排序<br />
*/<br />
private $_positionToTargetSorted = false;</p>
<p>/**<br />
* Constructor<br />
* @param object $hasher Flexihash_Hasher<br />
* @param int $replicas Amount of positions to hash each target to.<br />
* @comment 构造函数,确定要使用的hash方法和需拟节点数,虚拟节点数越多,分布越均匀,但程序的分布式运算越慢<br />
*/<br />
public function __construct(Flexihash_Hasher $hasher = null, $replicas = null) {<br />
$this-&gt;_hasher = $hasher ? $hasher : new Flexihash_Crc32Hasher();<br />
if (!emptyempty($replicas)) {<br />
$this-&gt;_replicas = $replicas;<br />
}<br />
}</p>
<p>/**<br />
* Add a target.<br />
* @param string $target<br />
* @chainable<br />
* @comment 添加节点,根据虚拟节点数,将节点分布到多个虚拟位置上<br />
*/<br />
public function addTarget($target) {<br />
if (isset($this-&gt;_targetToPositions[$target])) {<br />
throw new Flexihash_Exception(&#8220;Target &#8216;$target&#8217; already exists.&#8221;);<br />
}</p>
<p>$this-&gt;_targetToPositions[$target] = array();</p>
<p>// hash the target into multiple positions<br />
for ($i = 0; $i &lt; $this-&gt;_replicas; $i++) {<br />
$position = $this-&gt;_hasher-&gt;hash($target . $i);<br />
$this-&gt;_positionToTarget[$position] = $target; // lookup<br />
$this-&gt;_targetToPositions[$target] []= $position; // target removal<br />
}</p>
<p>$this-&gt;_positionToTargetSorted = false;<br />
$this-&gt;_targetCount++;</p>
<p>return $this;<br />
}</p>
<p>/**<br />
* Add a list of targets.<br />
* @param array $targets<br />
* @chainable<br />
*/<br />
public function addTargets($targets) {<br />
foreach ($targets as $target) {<br />
$this-&gt;addTarget($target);<br />
}</p>
<p>return $this;<br />
}</p>
<p>/**<br />
* Remove a target.<br />
* @param string $target<br />
* @chainable<br />
*/<br />
public function removeTarget($target) {<br />
if (!isset($this-&gt;_targetToPositions[$target])) {<br />
throw new Flexihash_Exception(&#8220;Target &#8216;$target&#8217; does not exist.&#8221;);<br />
}</p>
<p>foreach ($this-&gt;_targetToPositions[$target] as $position) {<br />
unset($this-&gt;_positionToTarget[$position]);<br />
}</p>
<p>unset($this-&gt;_targetToPositions[$target]);</p>
<p>$this-&gt;_targetCount&#8211;;</p>
<p>return $this;<br />
}</p>
<p>/**<br />
* A list of all potential targets<br />
* @return array<br />
*/<br />
public function getAllTargets() {<br />
return array_keys($this-&gt;_targetToPositions);<br />
}</p>
<p>/**<br />
* Looks up the target for the given resource.<br />
* @param string $resource<br />
* @return string<br />
*/<br />
public function lookup($resource) {<br />
$targets = $this-&gt;lookupList($resource, 1);<br />
if (emptyempty($targets)) {<br />
throw new Flexihash_Exception(&#8216;No targets exist&#8217;);<br />
}<br />
return $targets[0];<br />
}</p>
<p>/**<br />
* Get a list of targets for the resource, in order of precedence.<br />
* Up to $requestedCount targets are returned, less if there are fewer in total.<br />
*<br />
* @param string $resource<br />
* @param int $requestedCount The length of the list to return<br />
* @return array List of targets<br />
* @comment 查找当前的资源对应的节点,<br />
*          节点为空则返回空,节点只有一个则返回该节点,<br />
*          对当前资源进行hash,对所有的位置进行排序,在有序的位置列上寻找当前资源的位置<br />
*          当全部没有找到的时候,将资源的位置确定为有序位置的第一个(形成一个环)<br />
*          返回所找到的节点<br />
*/<br />
public function lookupList($resource, $requestedCount) {<br />
if (!$requestedCount) {<br />
throw new Flexihash_Exception(&#8216;Invalid count requested&#8217;);<br />
}</p>
<p>// handle no targets<br />
if (emptyempty($this-&gt;_positionToTarget)) {<br />
return array();<br />
}</p>
<p>// optimize single target<br />
if ($this-&gt;_targetCount == 1) {<br />
return array_unique(array_values($this-&gt;_positionToTarget));<br />
}</p>
<p>// hash resource to a position<br />
$resourcePosition = $this-&gt;_hasher-&gt;hash($resource);</p>
<p>$results = array();<br />
$collect = false;</p>
<p>$this-&gt;_sortPositionTargets();</p>
<p>// search values above the resourcePosition<br />
foreach ($this-&gt;_positionToTarget as $key =&gt; $value) {<br />
// start collecting targets after passing resource position<br />
if (!$collect &amp;&amp; $key &gt; $resourcePosition) {<br />
$collect = true;<br />
}</p>
<p>// only collect the first instance of any target<br />
if ($collect &amp;&amp; !in_array($value, $results)) {<br />
$results []= $value;<br />
}</p>
<p>// return when enough results, or list exhausted<br />
if (count($results) == $requestedCount || count($results) == $this-&gt;_targetCount) {<br />
return $results;<br />
}<br />
}</p>
<p>// loop to start &#8211; search values below the resourcePosition<br />
foreach ($this-&gt;_positionToTarget as $key =&gt; $value) {<br />
if (!in_array($value, $results)) {<br />
$results []= $value;<br />
}</p>
<p>// return when enough results, or list exhausted<br />
if (count($results) == $requestedCount || count($results) == $this-&gt;_targetCount) {<br />
return $results;<br />
}<br />
}</p>
<p>// return results after iterating through both &#8220;parts&#8221;<br />
return $results;<br />
}</p>
<p>public function __toString() {<br />
return sprintf(<br />
&#8216;%s{targets:[%s]}&#8217;,<br />
get_class($this),<br />
implode(&#8216;,&#8217;, $this-&gt;getAllTargets())<br />
);<br />
}</p>
<p>// &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
// private methods</p>
<p>/**<br />
* Sorts the internal mapping (positions to targets) by position<br />
*/<br />
private function _sortPositionTargets() {<br />
// sort by key (position) if not already<br />
if (!$this-&gt;_positionToTargetSorted) {<br />
ksort($this-&gt;_positionToTarget, SORT_REGULAR);<br />
$this-&gt;_positionToTargetSorted = true;<br />
}<br />
}</p>
<p>}</p>
<p>/**<br />
* Hashes given values into a sortable fixed size address space.<br />
*<br />
* @author Paul Annesley<br />
* @package Flexihash<br />
* @licence http://www.opensource.org/licenses/mit-license.php<br />
*/<br />
interface Flexihash_Hasher {</p>
<p>/**<br />
* Hashes the given string into a 32bit address space.<br />
*<br />
* Note that the output may be more than 32bits of raw data, for example<br />
* hexidecimal characters representing a 32bit value.<br />
*<br />
* The data must have 0xFFFFFFFF possible values, and be sortable by<br />
* PHP sort functions using SORT_REGULAR.<br />
*<br />
* @param string<br />
* @return mixed A sortable format with 0xFFFFFFFF possible values<br />
*/<br />
public function hash($string);</p>
<p>}</p>
<p>/**<br />
* Uses CRC32 to hash a value into a signed 32bit int address space.<br />
* Under 32bit PHP this (safely) overflows into negatives ints.<br />
*<br />
* @author Paul Annesley<br />
* @package Flexihash<br />
* @licence http://www.opensource.org/licenses/mit-license.php<br />
*/<br />
class Flexihash_Crc32Hasher<br />
implements Flexihash_Hasher {</p>
<p>/* (non-phpdoc)<br />
* @see Flexihash_Hasher::hash()<br />
*/<br />
public function hash($string) {<br />
return crc32($string);<br />
}</p>
<p>}</p>
<p>/**<br />
* Uses CRC32 to hash a value into a 32bit binary string data address space.<br />
*<br />
* @author Paul Annesley<br />
* @package Flexihash<br />
* @licence http://www.opensource.org/licenses/mit-license.php<br />
*/<br />
class Flexihash_Md5Hasher<br />
implements Flexihash_Hasher {</p>
<p>/* (non-phpdoc)<br />
* @see Flexihash_Hasher::hash()<br />
*/<br />
public function hash($string) {<br />
return substr(md5($string), 0, 8); // 8 hexits = 32bit</p>
<p>// 4 bytes of binary md5 data could also be used, but<br />
// performance seems to be the same.<br />
}</p>
<p>}</p>
<p>/**<br />
* An exception thrown by Flexihash.<br />
*<br />
* @author Paul Annesley<br />
* @package Flexihash<br />
* @licence http://www.opensource.org/licenses/mit-license.php<br />
*/<br />
class Flexihash_Exception extends Exception {<br />
}</p></blockquote>
<p>via:<a href="http://paul.annesley.cc/" target="_blank">http://paul.annesley.cc/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caokee.com/index.php/2010/08/17/consistent-hashing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于JsonP</title>
		<link>http://blog.caokee.com/index.php/2010/08/07/jsonp/</link>
		<comments>http://blog.caokee.com/index.php/2010/08/07/jsonp/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 07:33:50 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[jsonp]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=867</guid>
		<description><![CDATA[1. 什么是JSONP：JSONP（JSON with Padding）是一个非官方的协议，它允许在服务器端集成Script tags返回至客户端，通过javascript callback的形式实现跨域访问（这仅仅是JSONP简单的实现形式）。 2.为什么使用JSONP：由于 JSON 只是一种含有简单括号结构的纯文本，因此许多通道都可以交换 JSON 消息。因为同源策略的限制，我们不能在与外部服务器进行通信的时候使用 XMLHttpRequest。而JSONP是一种可以绕过同源策略的方法，即通过使用 JSON 与 &#60; script&#62; 标记相结合的方法，从服务端直接返回可执行的JavaScript函数调用或者JavaScript对象。 Jsonp原理： 首先在客户端注册一个callback, 然后把callback的名字传给服务器。 此时，服务器先生成 json 数据。 然后以 javascript 语法的方式，生成一个function , function 名字就是传递上来的参数 jsonp. 最后将 json 数据直接以入参的方式，放置到 function 中，这样就生成了一段 js 语法的文档，返回给客户端。 客户端浏览器，解析script标签，并执行返回的 javascript 文档，此时数据作为参数，传入到了客户端预先定义好的 callback 函数里.（动态执行回调函数） 大家参考这里可以得到很好的解释]]></description>
			<content:encoded><![CDATA[<p>1. 什么是JSONP：JSONP（JSON with Padding）是一个非官方的协议，它允许在服务器端集成Script tags返回至客户端，通过javascript callback的形式实现跨域访问（这仅仅是JSONP简单的实现形式）。<br />
2.为什么使用JSONP：由于 JSON 只是一种含有简单括号结构的纯文本，因此许多通道都可以交换 JSON 消息。因为<a href="http://wiki.matrix.org.cn/Wiki.jsp?page=Sameoriginpolicy" target="_new">同源策略</a>的限制，我们不能在与外部服务器进行通信的时候使用 XMLHttpRequest。而JSONP是一种可以绕过同源策略的方法，即通过使用 JSON 与 &lt; script&gt;  标记相结合的方法，从服务端直接返回可执行的JavaScript函数调用或者JavaScript对象。</p>
<p><strong>Jsonp原理：</strong></p>
<p>首先在客户端注册一个callback, 然后把callback的名字传给服务器。</p>
<p>此时，服务器先生成 <span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/json/" title="View all posts in json" target="_blank">json</a></span> 数据。</p>
<p>然后以 javascript 语法的方式，生成一个function , function 名字就是传递上来的参数 <span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/jsonp/" title="View all posts in jsonp" target="_blank">jsonp</a></span>.</p>
<p>最后将 <span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/json/" title="View all posts in json" target="_blank">json</a></span> 数据直接以入参的方式，放置到 function 中，这样就生成了一段 js 语法的文档，返回给客户端。</p>
<p>客户端浏览器，解析script标签，并执行返回的 javascript 文档，此时数据作为参数，传入到了客户端预先定义好的 callback 函数里.（动态执行回调函数）</p>
<p>大家参考<a href="http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/" target="_blank">这里</a>可以得到很好的解释</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caokee.com/index.php/2010/08/07/jsonp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>团队命脉:目标 结构 信息流 过程</title>
		<link>http://blog.caokee.com/index.php/2010/08/07/team-lifeline/</link>
		<comments>http://blog.caokee.com/index.php/2010/08/07/team-lifeline/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 02:48:37 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[杂谈]]></category>
		<category><![CDATA[协作]]></category>
		<category><![CDATA[团队]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=864</guid>
		<description><![CDATA[这篇文章写的非常好，推荐一下 目标 孔子曰:&#8221;目标很重要&#8221;,孟子曰:&#8221;老师说得对&#8243;. 一个团队最重要的是什么?目标!时刻提醒自己是为什么而出发,《TSP：领导开发团队》书中一再强调团队目标的重要性。有了目标才能分清什么是必须要做的，什么是可以不做的，哪些是要先做的，哪些是可以推后的。 目标确立意味着从一开始你就知道自己的目的地在哪里，朝着自己的目标前进，至少可以肯定，你迈出的每一步都是方向正确的，这样就可以过程中的迷茫和恐惧。以终为始是一种积极理性的思维、行动方式。 要时刻铭记目标是什么 有时候我们走的太快了，以致于忘记了为什么而出发。行进过程中，我们需要时刻提醒自己目标是什么，这一点谁做的最好？唐僧！唐僧自我介绍总是这样:&#8221;贫僧自东土大唐而来,前往西天求取真经&#8221;,话语间包含了自己旅行的终极目标,于是在一路打怪升级之后,唐僧西行团队取得了真经.我们有谁会在递上名片的同时说:&#8221;我是XX公司的,我们要做到XX领域的第一&#8221;. 目标与团队凝聚力 在团队内对目标达成共识是极其重要的,这种共识可以产生凝聚力.梁山好汉初聚义之时,团队目标就是寻求一份&#8221;天大的富贵&#8221;,就为了这样一个共同的目标,来自五湖四海的亡命之徒走到了一起.这个目标让梁山英雄团队产生巨大的凝聚力,替天行道人将至，仗义疏财汉便来,&#8221;今天谁与我共浴血,他就是我的兄弟&#8221;,在无数次大型策划中,英雄们总是高喊:&#8221;梁山好汉全伙在此!&#8221; 招安,是对梁山团队的致命打击.团队目标的分歧最终导致梁山团队的分崩离析. 共识源于目标一致而非其它 共识,源于目标一致而不是其它,而人们总是企图使用权力威胁和物质诱惑,结果就是换来不可靠地共识. 七星聚义智取生辰纲,金钱收买来的好兄弟白胜在入狱初体验之后便交代了其余兄弟的简历. 林冲落草,王伦用权逼林冲交&#8221;投名状&#8221;,却惹得梁山泊水寨大伙并,结果了王伦卿卿性命. 结构 静谧的星空下,飒飒凉风中,聚义厅中一个中年男人在苦苦思索着梁山未来的命运:&#8221;管理三五个人是一种方法,管理一百零八人呢?况且个个都不是省油的灯&#8221;,他就是宋江.在晁盖死后,宋江为梁山的团队组织结构大费脑筋,如何能把这帮人管好,用好呢??最终的结论就是等级制度加军事化管理,于是便有了&#8221;忠义堂石碣受天文&#8221;的做秀和&#8221;梁山泊英雄排座次&#8221;. 一个团队20几个人,已经能变化出N种组织结构,哪一种才是最佳的组合方式,这需要一个磨合,验证,调整的过程.理想的组织方式中的人能够各司其职,各尽其责,各尽其用. 信息流 我们一直在强调沟通,沟通的本质就是理顺团队内的信息流传播.什么是有效的沟通?就是指信息的传播过程中不丢失,不产生误解. 《天龙八部》中乔峰与段正淳沟通过程信息丢失严重,导致乔峰误认段即是杀父仇人,结果造成阿朱香消玉殒,只留塞上牛羊空许约. 这些儿女情长还算是小事,信息流控制甚至结束了一个王朝的命运. 明朝没有设立宰相,而皇帝又分身乏术,于是只有依靠内阁大学士们在奏章上写好分析和建议(票拟)来决策.信息流被大学士阶层掌握,大权也相应滑落到其手中.但是后来皇帝深居后宫不愿出面,&#8221;票拟&#8221;的传递需要经过宦官,票拟能否到达皇帝全由宦官决定,宦官取得了信息流的控制权,相应的政府大权相应从大学士转移到宦官手中.从此,明政府像一个断头的巨人,在悬崖绝壁上,蠕蠕而行. 过程 蒙古的铁骑所踏过的土地,东起朝鲜半岛，西抵波兰、匈牙利,北至西伯利亚,南达爪洼中南半岛.疯狂的扩张长达八十八年,而持续扩张所需要的物质支持变成了繁重赋税施加到人民,于是排山倒海的民变中元朝退出历史舞台. 元朝的灭亡给我的启示是:1.这是一个政府项目 2.使用瀑布模型 3.开发力量的强大的保证不了项目的成功. 那么谁对过程控制的好呢?康熙 康熙首先擒鳌拜，消除了朝廷内部的隐忧，这就获得了进行其他项目的先决条件.随 即集中削藩，经过八年苦战，平定了吴三桂等三藩叛乱，趁着告捷余威，统一台湾。之后是平定葛尔丹，而这个项目更是经历了三次迭代，康熙皇帝于康熙二十九年 （公元1690年）第一次亲征葛尔丹，葛尔丹大败，带着残兵逃到漠北去了。康熙三十五年（公元1696年）康熙皇帝第二次亲征葛尔丹，葛尔丹再次失败。康 熙三十六年(公元1697年)康熙皇帝第三次亲征葛尔丹，葛尔丹走投无路，只好服毒自尽。 以上文字,纯属一家之言,历史故事更是管中窥豹,笑言之. via:http://www.cnblogs.com/me-sa/archive/2009/05/16/KeysOfTeam.html]]></description>
			<content:encoded><![CDATA[<p>这篇文章写的非常好，推荐一下</p>
<blockquote>
<h1>目标</h1>
<p>孔子曰:&#8221;目标很重要&#8221;,孟子曰:&#8221;老师说得对&#8243;.</p>
<p>一个<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/%e5%9b%a2%e9%98%9f/" title="View all posts in 团队" target="_blank">团队</a></span>最重要的是什么?目标!时刻提醒自己是为什么而出发,《TSP：领导开发<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/%e5%9b%a2%e9%98%9f/" title="View all posts in 团队" target="_blank">团队</a></span>》书中一再强调团队目标的重要性。有了目标才能分清什么是必须要做的，什么是可以不做的，哪些是要先做的，哪些是可以推后的。</p>
<p>目标确立意味着从一开始你就知道自己的目的地在哪里，朝着自己的目标前进，至少可以肯定，你迈出的每一步都是方向正确的，这样就可以过程中的迷茫和恐惧。以终为始是一种积极理性的思维、行动方式。</p>
<p>要时刻铭记目标是什么</p>
<p>有时候我们走的太快了，以致于忘记了为什么而出发。行进过程中，我们需要时刻提醒自己目标是什么，这一点谁做的最好？唐僧！唐僧自我介绍总是这样:&#8221;贫僧自东土大唐而来,前往西天求取真经&#8221;,话语间包含了自己旅行的终极目标,于是在一路打怪升级之后,唐僧西行团队取得了真经.我们有谁会在递上名片的同时说:&#8221;我是XX公司的,我们要做到XX领域的第一&#8221;.</p>
<p>目标与团队凝聚力</p>
<p>在团队内对目标达成共识是极其重要的,这种共识可以产生凝聚力.梁山好汉初聚义之时,团队目标就是寻求一份&#8221;天大的富贵&#8221;,就为了这样一个共同的目标,来自五湖四海的亡命之徒走到了一起.这个目标让梁山英雄团队产生巨大的凝聚力,替天行道人将至，仗义疏财汉便来,&#8221;今天谁与我共浴血,他就是我的兄弟&#8221;,在无数次大型策划中,英雄们总是高喊:&#8221;梁山好汉全伙在此!&#8221;</p>
<p>招安,是对梁山团队的致命打击.团队目标的分歧最终导致梁山团队的分崩离析.</p>
<p>共识源于目标一致而非其它</p>
<p>共识,源于目标一致而不是其它,而人们总是企图使用权力威胁和物质诱惑,结果就是换来不可靠地共识.</p>
<p>七星聚义智取生辰纲,金钱收买来的好兄弟白胜在入狱初体验之后便交代了其余兄弟的简历.</p>
<p>林冲落草,王伦用权逼林冲交&#8221;投名状&#8221;,却惹得梁山泊水寨大伙并,结果了王伦卿卿性命.</p>
<p lang="en-US">
<h1>结构</h1>
<p>静谧的星空下,飒飒凉风中,聚义厅中一个中年男人在苦苦思索着梁山未来的命运:&#8221;管理三五个人是一种方法,管理一百零八人呢?况且个个都不是省油的灯&#8221;,他就是宋江.在晁盖死后,宋江为梁山的团队组织结构大费脑筋,如何能把这帮人管好,用好呢??最终的结论就是等级制度加军事化管理,于是便有了&#8221;忠义堂石碣受天文&#8221;的做秀和&#8221;梁山泊英雄排座次&#8221;.</p>
<p>一个团队20几个人,已经能变化出N种组织结构,哪一种才是最佳的组合方式,这需要一个磨合,验证,调整的过程.理想的组织方式中的人能够各司其职,各尽其责,各尽其用.</p>
<h1>信息流</h1>
<p>我们一直在强调沟通,沟通的本质就是理顺团队内的信息流传播.什么是有效的沟通?就是指信息的传播过程中不丢失,不产生误解.</p>
<p>《天龙八部》中乔峰与段正淳沟通过程信息丢失严重,导致乔峰误认段即是杀父仇人,结果造成阿朱香消玉殒,只留塞上牛羊空许约.</p>
<p>这些儿女情长还算是小事,信息流控制甚至结束了一个王朝的命运.</p>
<p>明朝没有设立宰相,而皇帝又分身乏术,于是只有依靠内阁大学士们在奏章上写好分析和建议(票拟)来决策.信息流被大学士阶层掌握,大权也相应滑落到其手中.但是后来皇帝深居后宫不愿出面,&#8221;票拟&#8221;的传递需要经过宦官,票拟能否到达皇帝全由宦官决定,宦官取得了信息流的控制权,相应的政府大权相应从大学士转移到宦官手中.从此,明政府像一个断头的巨人,在悬崖绝壁上,蠕蠕而行.</p>
<p lang="en-US">
<h1>过程</h1>
<p>蒙古的铁骑所踏过的土地,东起朝鲜半岛，西抵波兰、匈牙利,北至西伯利亚,南达爪洼中南半岛.疯狂的扩张长达八十八年,而持续扩张所需要的物质支持变成了繁重赋税施加到人民,于是排山倒海的民变中元朝退出历史舞台.</p>
<p>元朝的灭亡给我的启示是:1.这是一个政府项目 2.使用瀑布模型 3.开发力量的强大的保证不了项目的成功.</p>
<p>那么谁对过程控制的好呢?康熙</p>
<p>康熙首先擒鳌拜，消除了朝廷内部的隐忧，这就获得了进行其他项目的先决条件.随 即集中削藩，经过八年苦战，平定了吴三桂等三藩叛乱，趁着告捷余威，统一台湾。之后是平定葛尔丹，而这个项目更是经历了三次迭代，康熙皇帝于康熙二十九年 （公元1690年）第一次亲征葛尔丹，葛尔丹大败，带着残兵逃到漠北去了。康熙三十五年（公元1696年）康熙皇帝第二次亲征葛尔丹，葛尔丹再次失败。康 熙三十六年(公元1697年)康熙皇帝第三次亲征葛尔丹，葛尔丹走投无路，只好服毒自尽。</p>
<p>以上文字,纯属一家之言,历史故事更是管中窥豹,笑言之.</p></blockquote>
<p>via:<a href="http://www.cnblogs.com/me-sa/archive/2009/05/16/KeysOfTeam.html" target="_blank">http://www.cnblogs.com/me-sa/archive/2009/05/16/KeysOfTeam.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caokee.com/index.php/2010/08/07/team-lifeline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>距离有多远？欧几里德距离&amp;皮尔逊相关度系数</title>
		<link>http://blog.caokee.com/index.php/2010/08/07/piexun/</link>
		<comments>http://blog.caokee.com/index.php/2010/08/07/piexun/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 02:22:05 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[皮尔逊相关度]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=861</guid>
		<description><![CDATA[我们对同样的一些电影，书，音乐进行评分，从这些评分中能看到我们彼此之间的相似度么？说到这里你可能会想到豆瓣，我们有没有方法来模仿豆瓣计算这种相似度呢？本文是《集体智慧编程》介绍相似度算法：欧几里德距离和皮尔逊相关度系数的一次演练。 本文将介绍． 距离是在传统统计学和数据挖掘中衡量接近程度的关键度量。我们如何衡量接近程度或距离呢？在详细介绍不同距离度量方式前，让我们先描述一个便于讨论的问题场景。 故事是这样的:一些人对同样的一些电影做出了评价，我们将在这个基础上进行分析．我们按照IMDB的评分规则,10分为电影的最高评分.首先我们将能够描述这一事实的数据构造出来放入数据库中．我们需要下列的表： o    Moive表 电影信息表 o    UserInfo表 用户表(这些人将对电影给出评分) o    Moive_Level表 使用下面的SQL语句就可以完成上面数据表的建表工作. ﻿if exists (select * from dbo.sysobjects where id = object_id(N&#8217;[dbo].[Moive]&#8216;) and OBJECTPROPERTY(id, N&#8217;IsUserTable&#8217;) = 1) drop table [dbo].[Moive] GO if exists (select * from dbo.sysobjects where id = object_id(N&#8217;[dbo].[Moive_Level]&#8216;) and OBJECTPROPERTY(id, N&#8217;IsUserTable&#8217;) = 1) drop table [dbo].[Moive_Level] GO if exists (select * from dbo.sysobjects where id = object_id(N&#8217;[dbo].[UserInfo]&#8216;) and OBJECTPROPERTY(id, N&#8217;IsUserTable&#8217;) = 1) drop table [dbo].[UserInfo] GO CREATE TABLE [dbo].[Moive] ( [Name] [char] (30) COLLATE Chinese_PRC_CI_AS NOT NULL , [Director] [char] (30) COLLATE Chinese_PRC_CI_AS NULL , [Actor] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL , [Year] [int] NULL , [Region] [char] (10) COLLATE Chinese_PRC_CI_AS NULL , [id] [bigint] IDENTITY (1, 1) NOT NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[Moive_Level] ( [UserID] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL , [MoiveID] [char] (30) COLLATE Chinese_PRC_CI_AS NOT NULL , [Level] [float] NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[UserInfo] ( [UserID] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Age] [int] NULL , [ID] [bigint] IDENTITY (1, 1) NOT NULL ) ON [PRIMARY] GO 首先是Moive电影表，我从一些电影网站中抽取了1330条电影信息,覆盖了爱情电影,动作电影,科幻电影等各种类型的电影.实际上我们坐算法演示的时候只用到其中的10条数据.如下图,这10条数据是比较有代表性的,从类型和发行时间上都有特点.. 下列用户将对上面的十部电影进行评价: 用户对电影的评价是如下结构(下图试数据片段): 一个简单常用的距离度量是欧几里德距离。它以人们都评价过的电影为坐标轴,然后将参与评价的人绘制在图上,并考察它们的距离远近,换句话说这幅图就是描述了处于偏好空间中的人们.第一种算法考察方法是: 欧几里德距离 欧几里得度量定义欧几里得空间中点 x = (x1,&#8230;,xn) 和 y = [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>我们对同样的一些电影，书，音乐进行评分，从这些评分中能看到我们彼此之间的相似度么？说到这里你可能会想到豆瓣，我们有没有方法来模仿豆瓣计算这种相似度呢？本文是《集体智慧编程》介绍相似度<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/%e7%ae%97%e6%b3%95/" title="View all posts in 算法" target="_blank">算法</a></span>：欧几里德距离和<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/%e7%9a%ae%e5%b0%94%e9%80%8a%e7%9b%b8%e5%85%b3%e5%ba%a6/" title="View all posts in 皮尔逊相关度" target="_blank">皮尔逊相关度</a></span>系数的一次演练。</p>
<p>本文将介绍．</p>
<p>距离是在传统统计学和数据挖掘中衡量接近程度的关键度量。我们如何衡量接近程度或距离呢？在详细介绍不同距离度量方式前，让我们先描述一个便于讨论的问题场景。</p>
<p>故事是这样的:一些人对同样的一些电影做出了评价，我们将在这个基础上进行分析．我们按照IMDB的评分规则,10分为电影的最高评分.首先我们将能够描述这一事实的数据构造出来放入数据库中．我们需要下列的表：</p>
<p>o    Moive表 电影信息表</p>
<p>o    UserInfo表 用户表(这些人将对电影给出评分)</p>
<p>o    Moive_Level表</p></blockquote>
<blockquote><p>使用下面的SQL语句就可以完成上面数据表的建表工作.</p></blockquote>
<blockquote><p>﻿<span style="font-family: 宋体;">if exists (select * from dbo.sysobjects where id = object_id(N&#8217;[dbo].[Moive]&#8216;) and OBJECTPROPERTY(id, N&#8217;IsUserTable&#8217;) = 1)<br />
drop table [dbo].[Moive]<br />
GO</span></p>
<p>if exists (select * from dbo.sysobjects where id = object_id(N&#8217;[dbo].[Moive_Level]&#8216;) and OBJECTPROPERTY(id, N&#8217;IsUserTable&#8217;) = 1)<br />
drop table [dbo].[Moive_Level]<br />
GO</p>
<p>if exists (select * from dbo.sysobjects where id = object_id(N&#8217;[dbo].[UserInfo]&#8216;) and OBJECTPROPERTY(id, N&#8217;IsUserTable&#8217;) = 1)<br />
drop table [dbo].[UserInfo]<br />
GO</p>
<p>CREATE TABLE [dbo].[Moive] (<br />
[Name] [char] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,<br />
[Director] [char] (30) COLLATE Chinese_PRC_CI_AS NULL ,<br />
[Actor] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,<br />
[Year] [int] NULL ,<br />
[Region] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,<br />
[id] [bigint] IDENTITY (1, 1) NOT NULL<br />
) ON [PRIMARY]<br />
GO</p>
<p>CREATE TABLE [dbo].[Moive_Level] (<br />
[UserID] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,<br />
[MoiveID] [char] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,<br />
[Level] [float] NULL<br />
) ON [PRIMARY]<br />
GO</p>
<p>CREATE TABLE [dbo].[UserInfo] (<br />
[UserID] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,<br />
[Age] [int] NULL ,<br />
[ID] [bigint] IDENTITY (1, 1) NOT NULL<br />
) ON [PRIMARY]<br />
GO</p></blockquote>
<blockquote><p><span style="font-family: 宋体;"> 首先是</span>Moive<span style="font-family: 宋体;">电影表，我从一些电影网站中抽取了</span>1330<span style="font-family: 宋体;">条电影信息</span>,<span style="font-family: 宋体;">覆盖了爱情电影</span>,<span style="font-family: 宋体;">动作电影</span>,<span style="font-family: 宋体;">科幻电影等各种类型的电影</span>.<span style="font-family: 宋体;">实际上我们坐<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/%e7%ae%97%e6%b3%95/" title="View all posts in 算法" target="_blank">算法</a></span>演示的时候只用到其中的</span>10<span style="font-family: 宋体;">条数据</span>.<span style="font-family: 宋体;">如下图</span>,<span style="font-family: 宋体;">这</span>10<span style="font-family: 宋体;">条数据是比较有代表性的</span>,<span style="font-family: 宋体;">从类型和发行时间上都有特点</span>..</p>
<p><span style="font-family: 宋体;"><br />
<a rel="WLPP" href="https://ah5mmw.bay.livefilestore.com/y1mpLGPR72rTjZ4YfrhJb2Wv8I1mvTt5qnCB1ImTgehUNHvrhN6Vbne88KJ74Q0lxupW4zp4y0Wo2k4nyygVaEmaYojmwQhSUj54wUaUte-krwPNKrgJP1Cs2g6bkOkF0p99nA7SwhKwpU/clip_image005%5B3%5D.png"><img title="clip_image005" src="https://ah5mmw.bay.livefilestore.com/y1mw7QcB8zdmWL6RVTjQo3atsKrcH782IiJI8iouj0PVSZVzT24xmf9ktM4zAXLITTAFJL8FgifB-FQbGy4sl-d0fExRZ1dUcriI0PpLiOnMlL0y_NR9H1WDI29TXPeeNcX2P_hsFta1zA/clip_image005_thumb.png" border="0" alt="clip_image005" width="244" height="148" /></a><br />
下列用户将对上面的十部电影进行评价:<br />
</span></p>
<p><span style="font-family: 宋体;"><br />
<a rel="WLPP" href="https://ah5mmw.bay.livefilestore.com/y1mvI-104NpqwFU_P_Eh8CHZ1Wc2FlTT6sKrfipDzd2g2qwJ8CruSjGodYSfyOE1mC6PdX8I5qpZXkxpZwol4-rzHQl2EQb3on88OWryuyf6lRVkk45gNOkwWa-u6VwLH6fmXYfpYX9UXQ/clip_image006%5B3%5D.png"><img title="clip_image006" src="https://ah5mmw.bay.livefilestore.com/y1m8SWuDJLdGIsGu1hXqGFAIMDSox-d50wEj_IvLDsKkuimWqYKMhHxbkEUKMlqb9vB_s2lAR9GJeQjzhsml5zvA8NaEKTgWa-PzJTRwoOfZyeM12aVZJlZaNBmAPNh8AeVa31yV_mPumY/clip_image006_thumb.png" border="0" alt="clip_image006" width="179" height="111" /></a><br />
用户对电影的评价是如下结构(下图试数据片段):</span></p>
<p><span style="font-family: 宋体;"> <a rel="WLPP" href="https://ah5mmw.bay.livefilestore.com/y1mPME8Ft1PmwhnwuruAuoDJOpZqseAoSyG0W7pKUBTqRTIuCORgXFn731mZkUpN7mgfgCR4FQ5vKZczcMjk164TlxQHrmPxcPUQwxhQ1rufW5uF53Up9HCks0oRrK-wV3BNjfo9FBT64k/clip_image007%5B3%5D.png"><img title="clip_image007" src="https://ah5mmw.bay.livefilestore.com/y1m3fFPmY19DuJAu2AhVBVw2zq3F646vFXvvALhWAtZGuYKp9fompK_X8rkL0Gx_PWsIHiZHdbmSifBRCshNkRrLukH5ungaTCTt47BkCFfEmepsHVj9Pt-yvJ8OJcWlNTG6OpjlmmTMuY/clip_image007_thumb.png" border="0" alt="clip_image007" width="244" height="143" /></a></span></p></blockquote>
<blockquote><p><span style="font-family: 宋体;"> 一个简单常用的距离度量是欧几里德距离。它以人们都评价过的电影为坐标轴,然后将参与评价的人绘制在图上,并考察它们的距离远近,换句话说这幅图就是描述了处于偏好空间中的人们.第一种<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/%e7%ae%97%e6%b3%95/" title="View all posts in 算法" target="_blank">算法</a></span>考察方法是:</span></p></blockquote>
<blockquote><p><span style="font-family: 宋体;"> </span></p>
<h1>欧几里德距离</h1>
</blockquote>
<blockquote><p><a href="http://zh.wikipedia.org/w/index.php?title=%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97&amp;variant=zh-cn"><span style="font-family: 宋体;">欧几里得</span></a><span style="font-family: 宋体;">度量定义<a href="http://zh.wikipedia.org/w/index.php?title=%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%A9%BA%E9%97%B4&amp;variant=zh-cn">欧几里得空间</a>中点 <em>x</em> = (<em>x</em>1,&#8230;,<em>xn</em>) 和 <em>y</em> = (<em>y</em>1,&#8230;,<em>yn</em>) 之间的距离为<br />
<a rel="WLPP" href="https://ah5mmw.bay.livefilestore.com/y1mu6jS_owcpVpawrdYwXhUspMeXn6O-JXBY66kAWPZeSnemAXtXdtjsvJJUJ7a0nWAXeYJy9ISUVSfzjM4cCQB2nu4-k0FA221zOWYhz4LvweZl0NMifzoc4wfRjsmJp9j7ZLSr4bSbBI/clip_image001%5B5%5D.png"><img title="clip_image001" src="https://ah5mmw.bay.livefilestore.com/y1mjuOd6N_oaq6otqsEQqAdfcCkLl8bU8RNOZjzBvOcwo1waMZg4sgfdUCK5dQQV7yO37ZItkszyidlUtXtmBTOLly9rXbu6f88BAioKe6VEVKu1RRBD7xvgnpDWiSrv4YZk6WOccJLqt8/clip_image001_thumb%5B2%5D.png" border="0" alt="clip_image001" width="607" height="67" /></a></span></p></blockquote>
<blockquote><p><span style="font-family: 宋体;">为了方便将这个算法应用到数据库上</span><span style="font-family: 宋体;">,</span><span style="font-family: 宋体;">我们创建一个存储过程EuclideanDistance</span><span style="font-family: 宋体;">:</span></p></blockquote>
<blockquote><p><span style="font-family: 宋体;">SET QUOTED_IDENTIFIER OFF<br />
GO<br />
SET ANSI_NULLS OFF<br />
GO</span></p>
<p>CREATE    PROCEDURE [dbo].[EuclideanDistance]<br />
@UserIDA int,<br />
@UserIDB int<br />
AS<br />
select @UserIDA UserA,@UserIDB UserB,sqrt(sum(result)) Distance<br />
From<br />
(<br />
select m1.*,power(m1.level-m2.level,2) result From moive_level m1,moive_level m2<br />
where m1.userid=@UserIDA and m2.userid=@UserIDB and m1.moiveid=m2.moiveid<br />
)T</p>
<p>GO<br />
SET QUOTED_IDENTIFIER OFF<br />
GO<br />
SET ANSI_NULLS ON<br />
GO</p></blockquote>
<blockquote><p><span style="font-family: 宋体;">下面我们计算一下用户Zen和Lily的距离,执行存储过程代码如下:<br />
DECLARE @RC int<br />
DECLARE @UserIDA int<br />
DECLARE @UserIDB int<br />
&#8211; Set parameter values<br />
EXEC @RC = [U-M].[dbo].[EuclideanDistance] 1, 2</span></p>
<p>我们多看几组距离:<br />
DECLARE @RC int<br />
DECLARE @UserIDA int<br />
DECLARE @UserIDB int<br />
&#8211; Set parameter values<br />
EXEC @RC = [U-M].[dbo].[EuclideanDistance] 1, 2<br />
EXEC @RC = [U-M].[dbo].[EuclideanDistance] 1, 3<br />
EXEC @RC = [U-M].[dbo].[EuclideanDistance] 1, 4<br />
EXEC @RC = [U-M].[dbo].[EuclideanDistance] 1, 5<br />
EXEC @RC = [U-M].[dbo].[EuclideanDistance] 2, 5<br />
执行结果截图如下:</p></blockquote>
<blockquote><p><span style="font-family: 宋体;"><a rel="WLPP" href="https://ah5mmw.bay.livefilestore.com/y1m065f6PI1XXmLn0GSTVZXcEGa3-GPPd8aOIiLKeNtRxHxBMee4hgnV93xS2Bn3HjpgAvQ1o_usCxJHYMq7xsXLfj9Ay7rWDmc7PSHUXBSjfEwobhooMtizaqtV8Vvywe_lUCIwON7DEM/clip_image002%5B3%5D.png"><img title="clip_image002" src="https://ah5mmw.bay.livefilestore.com/y1mzCv3bhBnM-mKNw35h5sy1hcZ2sCuqTHLK7z6FhFcc7iEQGlPDdpeuWSrmtNGEpL3OnACh4ut9zVNrl2om_oYXppxGTyWeuVC75M1AXTV9OsIbSkxocCyGXFK-R9vuai5OivD-KiBiLI/clip_image002_thumb.png" border="0" alt="clip_image002" width="219" height="244" /></a><br />
</span></p></blockquote>
<blockquote><p><span style="font-family: 宋体;"><span style="font-family: 宋体;">但是当评价结果中</span></span><span style="font-family: 宋体;">,</span><span style="font-family: 宋体;"><span style="font-family: 宋体;">评价者的评价相对于平均水平偏离很大的时候欧几里德距离不能很好的揭示出真实的相似度</span></span><span style="font-family: 宋体;">.</span><span style="font-family: 宋体;"><span style="font-family: 宋体;">还有一种评价方法就是使用皮尔逊相关系数</span></span><span style="font-family: 宋体;">,</span><span style="font-family: 宋体;"><span style="font-family: 宋体;">它可以完成</span></span><span style="font-family: 宋体;">&#8220;</span><span style="font-family: 宋体;"><span style="font-family: 宋体;">夸大值纠偏</span></span><span style="font-family: 宋体;">&#8220;:</span></p></blockquote>
<blockquote><p><strong> </strong></p>
<h1><strong><span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/%e7%9a%ae%e5%b0%94%e9%80%8a%e7%9b%b8%e5%85%b3%e5%ba%a6/" title="View all posts in 皮尔逊相关度" target="_blank">皮尔逊相关度</a></span>系数</strong></h1>
<p><strong> </strong></p>
<p>两个变量之间的相关系数越高，从一个变量去预测另一个变量的精确度就越高，这是因为相关系数越高，就意味着这两个变量的共变部分越多，所以从其中一个变量的变化就可越多地获知另一个变量的变化。如果两个变量之间的相关系数为1或-1，那么你完全可由变量X去获知变量Y的值。</p>
<ul>
<li>当相关系数为0时，X和Y两变量无关系。</li>
<li>当X的值增大，Y也增大，正相关关系，相关系数在0.00与1.00之间</li>
<li>当X的值减小，Y也减小，正相关关系，相关系数在0.00与1.00之间</li>
<li>当X的值增大，Y减小，负相关关系，相关系数在-1.00与0.00之间</li>
</ul>
<p>当X的值减小，Y增大，负相关关系，相关系数在-1.00与0.00之间</p>
<p>相关系数的绝对值越大，相关性越强，相关系数越接近于1和-1，相关度越强，相关系数越接近于0，相关度越弱。</p>
<p><span style="font-family: 宋体;"><a rel="WLPP" href="https://ah5mmw.bay.livefilestore.com/y1mKjo4Jf2_k8ZkEZKDa6pKhuk0CNXEQKPOVi6bT7qvq5JmIhXApS_nrI_BsxYhQXm6fM3ZezL5EPEXEbzsUjMbYnRj9PO2dqAqE0NyN49WsQ6qp7WbrgkO4Y8JF5VJvijzmhdejMLDjPE/clip_image003%5B3%5D.png"><img title="clip_image003" src="https://ah5mmw.bay.livefilestore.com/y1mZCzBn7Ci21c1178JYk_kdS4ueAChqGH4MZmI0-hJ4HN27quWnFzhHQ5FNWRA5M0NLEDH0Eq9tTzz3TVj8pt-hs1YW8KGXnggNFc5buwgmFgdO2CXDA5e5K1Q4CaJuvp7AaCKcYI5Tt8/clip_image003_thumb.png" border="0" alt="clip_image003" width="244" height="74" /></a></span></p>
<p><span style="font-family: 宋体;">下面就是把这个算法用在我们的数据上了,我们创建一个存储过程PerasonRxy:<br />
SET QUOTED_IDENTIFIER OFF<br />
GO<br />
SET ANSI_NULLS OFF<br />
GO</span></p>
<p>CREATE  PROCEDURE [dbo].[PerasonRxy]<br />
@userida int,@useridb int<br />
AS<br />
select sum(L1) SumA,sum(L2) SumB,sum(power(L1,2)) SumA2,<br />
sum(power(L2,2)) SumB2,sum(result) Sum_Sqrt,<br />
sum([Cross]) Sum_Corss ,(sum([Cross])-sum(L1)*sum(L2)/10) ,<br />
sqrt((sum(power(L1,2))-power(sum(L1),2)/10)*(sum(power(L2,2))-power(sum(L2),2)/10)),<br />
sum([Cross]) Sum_Corss ,(sum([Cross])-sum(L1)*sum(L2)/10) /sqrt((sum(power(L1,2))-power(sum(L1),2)/10)*(sum(power(L2,2))-power(sum(L2),2)/10))<br />
From<br />
(</p>
<p>select m1.level L1,m2.level L2,power(m1.level-m2.level,2) result,m1.level*m2.level [Cross] From moive_level m1,moive_level m2<br />
where m1.userid=@userida and m2.userid=@useridb and m1.moiveid=m2.moiveid<br />
)T</p>
<p>GO<br />
SET QUOTED_IDENTIFIER OFF<br />
GO<br />
SET ANSI_NULLS ON<br />
GO</p>
<p><span style="font-family: 宋体;"><a rel="WLPP" href="https://ah5mmw.bay.livefilestore.com/y1mrA4MD7jhxYQuilV20_KACZ36Fu95ored4s8Ac03SESmRew8u_m0RtMyQER38PwYN60bwNVLOx2F7LKlsBsC6vCcGzaMEAACEJx2eaBW81gNkVRcv2awp76T2oFZ_7mlv2pbUUSZAmZc/clip_image004%5B3%5D.png"><img title="clip_image004" src="https://ah5mmw.bay.livefilestore.com/y1mC2g419PJGHYFN5toXYtTMgYJF-RiKi4Caucy-nH__6KbBLYhEp1aYLMLYTo6pLTXgcGNx6OwdUAleJjISWCcKF1l7pr57-lxWOvGy2oAPxUKwl3xkE1-firV8ts2Wvklu_8krawN7tY/clip_image004_thumb.png" border="0" alt="clip_image004" width="143" height="244" /></a></span></p>
<p><span style="font-family: 宋体;">通常情况下：</span></p>
<p><span style="font-family: 宋体;">相关系数0.8-1.0为极强相关</span></p>
<p><span style="font-family: 宋体;"> 0.6-0.8为强相关</span></p>
<p><span style="font-family: 宋体;"> 0.4-0.6为中等程度相关</span></p>
<p><span style="font-family: 宋体;"> 0.2-0.4为弱相关</span></p>
<p><span style="font-family: 宋体;"> 0.0-0.2为极弱相关或无相关<br />
我们可以看出哪些用户之间的距离比较接近了&#8230; &#8230;</span></p>
<p><a rel="WLPP" href="https://ah5mmw.bay.livefilestore.com/y1mKjo4Jf2_k8ZkEZKDa6pKhuk0CNXEQKPOVi6bT7qvq5JmIhXApS_nrI_BsxYhQXm6fM3ZezL5EPEXEbzsUjMbYnRj9PO2dqAqE0NyN49WsQ6qp7WbrgkO4Y8JF5VJvijzmhdejMLDjPE/clip_image003%5B3%5D.png"></a></p></blockquote>
<p>via:<a href="http://www.cnblogs.com/me-sa/archive/2009/02/17/distance.html" target="_blank">http://www.cnblogs.com/me-sa/archive/2009/02/17/distance.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caokee.com/index.php/2010/08/07/piexun/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web可用性设计的247条指导方针</title>
		<link>http://blog.caokee.com/index.php/2010/08/06/web-247-rule/</link>
		<comments>http://blog.caokee.com/index.php/2010/08/06/web-247-rule/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 02:16:26 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[rule]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=858</guid>
		<description><![CDATA[首页可用性设计 首页元素要清晰的关注用户的关键任务（避免“增加功能倾向（featuritis）”） 如果网站比较大，那么首页应包含搜索输入框 首页要十分清楚的提供产品（内容）分类 在首页或首页内一次点击展示有用的内容 信息展示时应当是简单的、自然的、符合逻辑顺序的 在首页展示真实网站内容的优秀示例 首页上的链接以最重要的关键词作为起始（例如：“Sun holidays”而不是“Holidays in the sun”） 在首页提供一个最近的特色项列表，并提供存档内容的链接 首页导航不要过度格式化（修饰），确保用户不会把它误认为广告 在首页清晰的声明价值取向（例如一个标志性的口号或欢迎语） 在首页包含有意义的图案设计，而非无关的剪贴画或绘画作品 导航选项按逻辑性或用户导向方式排序（把次要的公司信息放在底部） 首页标题（title）可以为诸如google等搜索引擎提供良好可见度 所有公司相关信息安排在一个显著区域（例如：“关于我们（About Us）”） 用户可以了解到价值取向 一看到首页，第一次访问的人就知道从何处开始 在首页展示出所有主要的操作选项 首页拥有一个易记的URL 首页需经过专业设计，以给用户良好的第一印象 首页的设计要能激发用户探索站点的兴趣 首页就要像一个首页，不能让用户把它与二级页面混淆 任务导向 网站应避免出现不相干的、多余的或让用户分心的信息 避免过多的使用脚本、小应用程序（applets）、视频音频文件、图案和图片 网站应避免不必要的登记 关键人物路径必须是清晰的，无干扰的（例如：购买、捐献） 信息以简单的、自然的（natural）、符合逻辑顺序的方式展示 应尽量缩减每个任务需要的屏幕数量 应减量减少页面滚动（scrolling）和点击 网站应正确的预期和提示用户下一步可能的动作 展示图表时，确保用户可以看到真实数据（例如在柱状图上标明数字注解） 当分配给用户任务时，应充分利用计算机的优势（例如搜索输入的自动完成功能） 用户可以快速完成普通任务 当必要时，应为当前任务提供数据对比功能（例如：商品比较） 任务顺序应当与用户日常工作顺序一致 网站可以保证用户的工作比不使用它时更轻松快捷 最重要的或经常使用的主题、特征或功能应放在页面中央附近的位置，而不是特别靠左边或右边 确保用户不会重复输入相同的信息 重要的、频繁使用的主题或任务应接近网站的“表面” 保持最少的录入（例如购买过程中），并为用户提供加速器 任何给定任务路径应当有一个合理的步骤长度（2-5次点击） 当一个任务有多步时，网站要告诉用户完成任务需要的所有步骤，并为用户当前步骤所在的位置提供反馈 在每个产品后面紧跟它的价格 可以非常容易的找到网站的隐私策略，尤其是在那些要求填写个人信息的页面。隐私策略应当是简单的、清晰的 网站用户不需要记住从一个地方到另一个地方的信息 隐喻的使用可以被典型用户轻松理解 数据格式应当遵循文化常规 软件的内部工作细节不要暴露给用户 应当迎合用户那些之前已经养成的那些小的互联网习惯 [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>首页可用性设计</strong></p>
<ol>
<li>首页元素要清晰的关注用户的关键任务（避免“增加功能倾向（featuritis）”）</li>
<li>如果网站比较大，那么首页应包含搜索输入框</li>
<li>首页要十分清楚的提供产品（内容）分类</li>
<li>在首页或首页内一次点击展示有用的内容</li>
<li>信息展示时应当是简单的、自然的、符合逻辑顺序的</li>
<li>在首页展示真实网站内容的优秀示例</li>
<li>首页上的链接以最重要的关键词作为起始（例如：“Sun holidays”而不是“Holidays in the sun”）</li>
<li>在首页提供一个最近的特色项列表，并提供存档内容的链接</li>
<li>首页导航不要过度格式化（修饰），确保用户不会把它误认为广告</li>
<li>在首页清晰的声明价值取向（例如一个标志性的口号或欢迎语）</li>
<li>在首页包含有意义的图案设计，而非无关的剪贴画或绘画作品</li>
<li>导航选项按逻辑性或用户导向方式排序（把次要的公司信息放在底部）</li>
<li>首页标题（title）可以为诸如google等搜索引擎提供良好可见度</li>
<li>所有公司相关信息安排在一个显著区域（例如：“关于我们（About Us）”）</li>
<li>用户可以了解到价值取向</li>
<li>一看到首页，第一次访问的人就知道从何处开始</li>
<li>在首页展示出所有主要的操作选项</li>
<li>首页拥有一个易记的URL</li>
<li>首页需经过专业设计，以给用户良好的第一印象</li>
<li>首页的设计要能激发用户探索站点的兴趣</li>
<li>首页就要像一个首页，不能让用户把它与二级页面混淆</li>
</ol>
<p><a name="task"></a><br />
<strong>任务导向</strong></p>
<ol>
<li>网站应避免出现不相干的、多余的或让用户分心的信息</li>
<li>避免过多的使用脚本、小应用程序（applets）、视频音频文件、图案和图片</li>
<li>网站应避免不必要的登记</li>
<li>关键人物路径必须是清晰的，无干扰的（例如：购买、捐献）</li>
<li>信息以简单的、自然的（natural）、符合逻辑顺序的方式展示</li>
<li>应尽量缩减每个任务需要的屏幕数量</li>
<li>应减量减少页面滚动（scrolling）和点击</li>
<li>网站应正确的预期和提示用户下一步可能的动作</li>
<li>展示图表时，确保用户可以看到真实数据（例如在柱状图上标明数字注解）</li>
<li>当分配给用户任务时，应充分利用计算机的优势（例如搜索输入的自动完成功能）</li>
<li>用户可以快速完成普通任务</li>
<li>当必要时，应为当前任务提供数据对比功能（例如：商品比较）</li>
<li>任务顺序应当与用户日常工作顺序一致</li>
<li>网站可以保证用户的工作比不使用它时更轻松快捷</li>
<li>最重要的或经常使用的主题、特征或功能应放在页面中央附近的位置，而不是特别靠左边或右边</li>
<li>确保用户不会重复输入相同的信息</li>
<li>重要的、频繁使用的主题或任务应接近网站的“表面”</li>
<li>保持最少的录入（例如购买过程中），并为用户提供加速器</li>
<li>任何给定任务路径应当有一个合理的步骤长度（2-5次点击）</li>
<li>当一个任务有多步时，网站要告诉用户完成任务需要的所有步骤，并为用户当前步骤所在的位置提供反馈</li>
<li>在每个产品后面紧跟它的价格</li>
<li>可以非常容易的找到网站的隐私策略，尤其是在那些要求填写个人信息的页面。隐私策略应当是简单的、清晰的</li>
<li>网站用户不需要记住从一个地方到另一个地方的信息</li>
<li>隐喻的使用可以被典型用户轻松理解</li>
<li>数据格式应当遵循文化常规</li>
<li>软件的内部工作细节不要暴露给用户</li>
<li>应当迎合用户那些之前已经养成的那些小的互联网习惯</li>
<li>网站应当易于用户浏览，在执行前可以自己尝试其它的功能操作</li>
<li>第一次到访的典型用户应当可以在不需帮助的情况下完成最常用的功能</li>
<li>当用户回到网站时，用户可以记得如何执行主要任务</li>
<li>那些新颖设备（novel device controls）的功能应当是显而易见的</li>
<li>在购物车页面，在页面的顶部或底部应当清晰的展示”处理结账”按钮</li>
<li>重要的操作入口（例如“添加到购物车”）应当非常清晰可见</li>
<li>操作按钮（例如“提交”）应当由用户触发，而非在完成所有选项时系统自动触发</li>
<li>命令或操作项英以按钮的形式的展示（而非例如链接）</li>
<li>如果用户在事务处理中中途退出，用户在稍后返回站点时可以继续他退出之前的工作</li>
<li>当页面展示大量信息时，用户可以排序和过滤信息</li>
<li>按钮或图标上的图像应当与内容相关</li>
<li>当用户被系统自动注销时应当提示用户，并且自动注销的时间间隔要恰当</li>
<li>不必要的功能（例如flash动画）可以被关闭或跳过(skip)</li>
<li>网站应当是健壮的，并且所有关键功能可正常工作（例如不应有javascript页面异常、CGI报错或死链接）</li>
<li>网站通过不同程度的说明来支持新手用户和专家用户（例如帮助信息、错误信息）</li>
<li>网站允许用户重新填写一些信息项（例如更改发货地址、更改账户信息）</li>
<li>网站允许用户自定义操作时间参数（例如自动退出的时间）</li>
</ol>
<p><a name="navigation"></a><br />
<strong>导航和信息架构</strong></p>
<ol>
<li>关联页面或区域间的跳转移动应当是方便的、显而易见的，并且可以容易的回到首页</li>
<li>在绝大部分页面都可以轻松的导航至用户最可能需要的信息</li>
<li>导航选项按照最常用逻辑或任务导向方式排序</li>
<li>导航系统应当是内容宽泛并层级较浅的，而非有比较深的层级</li>
<li>站点结构是简单的，有一个清晰的概念模型，没有不必要的层次</li>
<li>在所有页面都可以到达网站主要部分（持久导航persistent navigation），导航过程不会中断</li>
<li>导航标签放在页面顶端，而且要设计成看上去可以点击的样子</li>
<li>要有一个站点地图用来提供整个站点内容的概况</li>
<li>在任何页面都可以链接到站点地图</li>
<li>站点地图提供一个简洁的网站概貌，而非主要导航的重复或各主题的简单罗列</li>
<li>提供良好的导航反馈（例如显示当前位置）</li>
<li>分类标签应当能准确描述该分类的信息</li>
<li>链接或导航标签包含用户要达到目标所寻找的“触发字眼（trigger words）”</li>
<li>术语和常规（例如链接颜色）应当（近似地）与互联网习惯用法保持一致</li>
<li>在网站各个组成部分中的链接样子应当一致</li>
<li>产品页面应当包含与当前产品相似或互补产品的链接，以实现交叉营销</li>
<li>导航项和链接中的用词应当是无歧义的，并且使用术语</li>
<li>用户可以排序和过滤目录页面（例如按价格排序或最热门排序）</li>
<li>当鼠标放在某个可点击的元素上时，元素应当有明显变化（包括光标的变化）</li>
<li>重要内容可以通过不止一个链接访问到（不同的用户有可能需要不同的链接标签）</li>
<li>仅用于导航的页面（例如首页）可以再不滚动的情况下浏览</li>
<li>触发事件的超链接应当与链接到其它页面的超链接（例如：下载）在外观上有明显区分</li>
<li>网站允许用户控制交互速度和顺序</li>
<li>在网站每个页面清晰标注退出入口，允许用户从当前任务中推出，而不必通过一个额外的对话框</li>
<li>网站不可禁用浏览器的“后退”按钮，“后退”按钮应当在每个页面的浏览器工具栏上都有显示</li>
<li>用户点击浏览器后退按钮时，总能回到他之前所在页面</li>
<li>购物车（basket）和结账（checkout）链接应当在每个页面中都可以看的十分清楚</li>
<li>如果网站有打开新窗口，那么这个动作不应使用户困惑（例如：新窗口应该是一个设定大小的对话框或并可以轻松关闭）</li>
<li>菜单的使用说明、提示、相关信息应当在每个屏幕的同一位置显示</li>
</ol>
<p><a name="form"></a><br />
<strong>表单和数据输入</strong></p>
<ol>
<li>数据输入框在适当的时候应当包含默认值，显示要填的数据格式和输入框允许输入的长度</li>
<li>如果任务设计源文件（例如纸张形式），那么界面应当与源文件的规格一致</li>
<li>网站能自动完成格式化数据的输入（例如货币符号等），用户不需要输入类似£ 或 %的符号</li>
<li>表单域的标签应当清楚的说明该输入框希望输入什么</li>
<li>表单中的文本框应该为预期答案设定合理长度</li>
<li>表单中的必填项和选填项应当有明显的区分</li>
<li>登陆和注册应当用相同的表单（就像Amazon一样）</li>
<li>如果完成表单需要外部信息的话应当提前告知用户，例如护照编号</li>
<li>表单中的问题项（输入框）应当按逻辑分组，并且每组都有一个标题</li>
<li>表单域应包含提示、示例或样例答案，告知用户输入框期望输入什么</li>
<li>如果输入框的标签以表单问题的方式提出，那么这些问题应当是陈述清晰、简单的</li>
<li>在表单中，相对于文本输入框，应当优先使用下拉菜单、单选按钮、复选框（文本输入框不应当使用过度）</li>
<li>在数据输入页面，光标应当被放置在需要输入的地方</li>
<li>数据输入（例如日期）和输出（例如数值单位）的格式应当被清晰标明</li>
<li>用户可以在进输入一些基本必要信息就可以完成简单的任务（系统可以默认补充一些不重要的信息）</li>
<li>表单允许用户尽可能久的保持一种简单的交互方式（例如，用户不必在键盘鼠标间不停的切换）</li>
<li>用户可以更改表单域的默认值</li>
<li>文本输入框需指出要输入数据的数量和格式</li>
<li>表单在提交前执行数据验证</li>
<li>在数据输入界面，在适当的时间执行表单域级别验证和表单级别验证</li>
<li>网站应可以轻松地更正输入错误（例如，当验证表单未完成，应当将光标放置在需要输入的位置）</li>
<li>数据输入和数据显示应当保持一致性</li>
<li>表单域标签应当靠近输入域（例如：标签右对齐）</li>
</ol>
<p><a name="trust"></a><br />
<strong>可信度</strong></p>
<ol>
<li>内容应当是最新的、权威的、可信赖的</li>
<li>网站有第三方（例如引用、第三方使用见证）来说明信息的准确性</li>
<li>应当清晰标明网站的幕后有真实的组织（例如：提供一个真实地址或办公室照片）</li>
<li>公司有一些认证专家（可以使用一些凭证）</li>
<li>网站应避免广告，尤其是弹出式广告</li>
<li>在结账的最一开始就突出提示运送费用</li>
<li>网站应当避免空洞的营销辞令（marketing waffle）</li>
<li>每个页面都应当清晰显示站点标识，保证用户确认他仍然在同一个网站上</li>
<li>通过网站可以轻松联系到某人以获取帮助，并可尽快得到回复</li>
<li>内容是新鲜的，网站应经常更新，总包含最近的内容</li>
<li>网站应当避免版式错误和拼写错误</li>
<li>用可视化设计来补充商品和线下营销信息</li>
<li>网站组织应当有一些真实的人，他们是诚实的、可信赖的</li>
</ol>
<p><a name="content"></a><br />
<strong>写作和内容质量</strong></p>
<ol>
<li>网站有能引起别人兴趣的、独一无二的内容</li>
<li>正文是简明的，没有不必要的说明和欢迎辞令</li>
<li>每个内容页应以内容结论或内容意义启示作为开端，正文以倒金字塔方式书写</li>
<li>相对于叙述式的文本，网页应当优先使用无序列表和有序列表</li>
<li>列表应当以简短的说明作为开始，帮助用户意识到该列表是如何与其它关联起来的</li>
<li>那些最重要的列表项应当放在列表的前面</li>
<li>信息应当分层次组织，从一般的到具体的，组织结构应当是清晰的、符合逻辑的</li>
<li>内容应当专门为互联网（Web）创建（<span class='wp_keywordlink_affiliate'><a href="http://blog.caokee.com/index.php/tag/web/" title="View all posts in web" target="_blank">web</a></span> pages do not comprise repurposed material from print publications such as brochures）</li>
<li>产品展示页面应当包含购买须了解的信息，用户可缩放产品图片</li>
<li>使用超文本适当地组织内容</li>
<li>以主动语态书写语句</li>
<li>网页应当易于快速浏览，充分使用标题、副标题和较短的段落</li>
<li>相对于文本式的语言，优先使用地图、图表、图形、流程图和其它视觉元素</li>
<li>每个网页都应有描述信息，以及有用的标题，用以支持书签</li>
<li>链接及链接描述（title）应当具有描述性或推测性，不应当出现“点击我（Click here）”这样的链接</li>
<li>标题不应当故作风雅、故作聪明或含义隐晦</li>
<li>链接文本应当与目标页面的标题(title)相符，这样用户就可以在到达目标页面时心里有数</li>
<li>按钮文本及链接文本以动词开头</li>
<li>标题和副标题应当是简短的、直截了当的、具有描述性的</li>
<li>遣词造句及用到的概念应当为典型用户所熟悉</li>
<li>有序列表从1开始，而不是0</li>
<li>第一次使用的缩写词汇应当加以说明</li>
<li>文本链接应当足够长以便于理解、又应当足够短以保证最少换行（尤其被用作导航列表时）</li>
</ol>
<p><a name="layout"></a><br />
<strong>页面布局和可视设计</strong></p>
<ol>
<li>网线数应当适于目标用户和他们的任务</li>
<li>布局可以帮助用户把注意力集中在下一步要做的东西上</li>
<li>在所有页面，最重要的信息（例如经常用的主题、特色和功能）放在屏幕的第一个满屏</li>
<li>网站在不水平滚动的情况下就可以使用</li>
<li>可点击的元素（例如按钮），应当设计成明显可点击的样子</li>
<li>不能点击的元素</li>
<li>按钮或控件的功能从他们的标签或设计上就可以明显看出来</li>
<li>可点击图片包含多余文本标签（Clickable images include redundant text labels (i.e. there is no ‘mystery meat’ navigation)）</li>
<li>超文本链接可以轻松被辨认（例如下划线），而不需要大面积扫视。</li>
<li>网站字体使用应当具有一致性</li>
<li>控件和它所具备的操作之间的关系是显而易见的</li>
<li>图标和图形是标准的和（或）直观的（具体的和为人熟悉的）</li>
<li>在每一个页面上都应有一个清晰的视觉“起点”</li>
<li>网站的每个页面共享一致的布局</li>
<li>网页为打印格式化，或者有一个为打印准备的版本</li>
<li>按钮或链接能显示出他们被点击过了</li>
<li>图形用户界面（GUI）组件（例如单选按钮和复选框）应当被适当地使用</li>
<li>所用字体应当是可阅读的</li>
<li>网站应当避免使用斜体字，并只为超文本添加下划线</li>
<li>信息密度和留白应当有一个良好的平衡</li>
<li>网站看上去应是让人愉悦的</li>
<li>网页应避免出现“滚动障碍物（scroll stoppers）”（标题或其它页面元素给用户造成在页面顶部或底部的错觉）</li>
<li>网站应当避免大量使用大写文本</li>
<li>网站应当有一致性的、清晰可识别的外观和感觉，以吸引用户</li>
<li>深蓝色避免使用在细节地方（Saturated blue is avoided for fine detail）（例如文本、细线和符号）</li>
<li>借助颜色组织和分组页面元素</li>
<li>网站图形不应当与banner广告混杂不清</li>
<li>对于重要的主题分类加重显示（em）</li>
<li>在标准宽度的浏览器窗口中，内容页面一行不要太短（小于50字）也不要太长（大于100字）</li>
<li>页面依据栅格设计，所有页面元素和部件水平对齐、垂直对齐</li>
<li>有意义的文本标签，令人印象深刻的背景配色，边框和留白的恰当使用，这些一起来帮助用户把网页元素分别出不相关联的功能区域</li>
<li>网页配色合理搭配，避免过于复杂的背景设计/li&gt;</li>
<li>较为独立的网页应当避免杂乱不相干的信息</li>
<li>标准页面元素（例如页面标题、站点导航、页面导航、隐私策略等）可轻松找到</li>
<li>组织logo放置在每个页面的相同位置，点击logo后返回最合情理的页面（比如首页）</li>
<li>吸引人注意力的特色元素（例如动画、醒目的色调、明显的字体大小差异）应当保守的使用，并只在恰当的地方使用</li>
<li>图标（icons）要在视觉上和概念上有所区分，但又要与页面和谐。</li>
<li>相关信息和功能集中放置，每一组可以在一个视野浏览到（大约直径为4.4厘米的屏幕区域）</li>
</ol>
<p><a name="search"></a><br />
<strong>搜索可用性</strong></p>
<ol>
<li>默认搜索应当是可以直观地配置（没有布尔操作符no Boolean operators）</li>
<li>在搜索结果页面向用户展示搜索到的内容，并且在该页可以编辑检索词并重新提交搜索</li>
<li>检索结果应是清晰地、有用的、并依据相关度分级</li>
<li>检索结果页面应清晰告诉用户检索到多少条记录，每一页显示的记录数可以由用户配置</li>
<li>如果没有返回结果，系统依据用户输入的检索词存在的可辨认问题提供建议和可选输入项</li>
<li>搜索引擎可以优雅地处理空检索串的情况</li>
<li>最常用的检索串可以获得有用的结果</li>
<li>搜索引擎应当提供模板、示例或提示来帮助用户高效使用它</li>
<li>网站应当包含一个功能更强大的搜索页面，帮助用户更加完善他们的检索（可以把它叫做“修改检索 revise search”或“精确检索 refine search”，而非“高级检索 advanced search”）</li>
<li>检索结果页面不显示重复结果（无论是能感知到的重复还是实际的重复）</li>
<li>检索输入框应当足够长，可以应对常用检索词的长度</li>
<li>检索应当覆盖整个站点，而不是站点的一部分</li>
<li>如果网站允许用户创建复合检索，那么这些检索应当是可保存，定期被执行的（这样用户就可以跟踪动态信息的最新动态）</li>
<li>检索界面应当放置在用户期望的地方（一般是页面的右上区域）</li>
<li>检索框及他的控件应清晰列出（多检索框可能会难以理解）</li>
<li>站点既可以满足那些想随便浏览的用户，也可满足想搜索的用户</li>
<li>在检索结果页面应当明确当前检索的范围，并且用户可以约束这个范围（如果该任务需要的话）</li>
<li>结果页面显示有用的元信息（meta-information），例如文档的大小、创建的日期、文件类型（word、pdf等）</li>
<li>搜索引擎提供自动的拼写检查，并提供复数词和同义词查找</li>
<li>索索引擎提供相似检索选项（例如 “更多相似” 链接）</li>
</ol>
<p><a name="help"></a><br />
<strong>帮助、反馈和容错</strong></p>
<ol>
<li>常见问题解答或在线帮助提供循序渐进地指导，帮助用户完成最重要的任务</li>
<li>在恰当的地方和恰当的时间可以轻松获取帮助</li>
<li>提示应当是简洁的、表达清楚的</li>
<li>用户不需要求助于用户手册或其它外部信息来使用站点</li>
<li>网站有一个定制的404页面，该页面包含如何找到要找页面的提示，并包含主页和和检索页面的链接</li>
<li>网站在必要时（例如校验时）提供良好的反馈信息（例如进度提示或一些信息）</li>
<li>用户在选择商品时可获取到帮助</li>
<li>用户在执行由潜在“危险”操作（例如删除什么）之前提供用户确认</li>
<li>用户确认页面是清晰地</li>
<li>错误信息包含先一步该做什么的清晰指示</li>
<li>在提交购买的前一个时刻，网站向用户清晰地展示概览页面，这个页面应当与购买确认页面区分开来</li>
<li>当用户需要在不同的选项（例如在一个对话框）前抉择时，这些选项应当是明确的</li>
<li>在网站响应时间时产生的不可避免的延迟应当告知用户（例如授权信用卡交易时）</li>
<li>错误信息以非嘲弄的语气书写，并且不要责怪用户的错误</li>
<li>页面可以快速加载（5秒或更短）</li>
<li>网站提供对用户输入或其他操作的及时反馈</li>
<li>在加载比较慢的大页面应当提示用户（例如：“正在加载……”），最重要的信息应当首先显示</li>
<li>当使用工具提示条（tool tips）时，应当提示对用户有用的额外帮助，而不是简单的重复图标、链接或字段域标签中的文本</li>
<li>当给用户一些帮助提示时，告诉他们要做什么，而不是避免做什么</li>
<li>网站在适当的地方向用户展示如何做常见任务（例如：提供网站的功能示例）</li>
<li>网站通过提供反馈信息（例如“您知道吗？”），帮助用户了解怎样使用网站</li>
<li>网站提供上下文敏感帮助</li>
<li>帮助应当是直截了当的，用直白简单的方式表达，避免使用行话和流行语</li>
<li>当一个任务成功完成后，网站提供清晰地反馈信息</li>
<li>必要时重要提示信息应当在屏幕上保留，使用户有足够时间记录下这些信息</li>
<li>遵循“菲茨法则”（控件之间的距离和控件的大小应当是适宜的，大小与距离成比例）</li>
<li>目标对象间有足够空间，防止用户点击了多个目标或错误的目标</li>
<li>可点击元素之间至少有两个像素的距离</li>
<li>当网站发生错误时，应当是显而易见的（例如，当表单未完成，高亮未完成的表单域）</li>
<li>网站提供适当的选择方式（例如下拉列表）来代替用户输入</li>
<li>网站应努力把防止用户出错的工作做好</li>
<li>网站在纠正用户错误输入前提示用户（例如，google的“您是不是要查找…”）</li>
<li>网站应当确保任务不是令人困惑的</li>
<li>错误信息应当用直白的语言描述，并给与问题足够的解释</li>
<li>用户在一个任务中可以推迟解决错误至一个较晚的时间</li>
<li>如果有必要的话，网站提供错误信息更多的细节</li>
<li>可以非常容易撤销（或取消）、重做（Redo）操作</li>
</ol>
</blockquote>
<p>via:<a href="http://css9.net/247-web-usability-guidelines/" target="_blank">http://css9.net/247-web-usability-guidelines/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caokee.com/index.php/2010/08/06/web-247-rule/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
