<?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>搜我收藏 &#187; Tech</title>
	<atom:link href="http://www.sou5.cn/archives/category/tech/feed" rel="self" type="application/rss+xml" />
	<link>http://www.sou5.cn</link>
	<description>Web 2.0 网站架构、优化 数据库架构</description>
	<lastBuildDate>Sun, 05 Feb 2012 16:21:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Facebook 如何发布代码 (How Facebook Ships Code 译文 ) 转</title>
		<link>http://www.sou5.cn/archives/966.html</link>
		<comments>http://www.sou5.cn/archives/966.html#comments</comments>
		<pubDate>Tue, 24 Jan 2012 16:27:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.sou5.cn/?p=966</guid>
		<description><![CDATA[我对 Facebook 的运作方式着迷。这是个非常独特的环境，很难被复制（这个方式并不适合所有的公司，即使有些公司尝试过这么做）。下面这些笔记来自我和Facebook的许多朋友的交谈，关于他们开发、运维与软件发布等方面。
好像很多人都对 Facebook 感兴趣&#8230; 这家公司的工程师驱动文化(Developer-driven culture)已经被公众大加研究，并且其它其它公司也在探求是否/如何实现工程师驱动文化。Facebook 的内部流程实在够神秘，当然，工程师团队也会发布一些关于新功能以及部分内部系统公开备忘，不过这些大多数是&#8221;说明&#8221;类的文章(What)，而非讲述&#8221;机制&#8221;(How)&#8230; 所以，外部人员很难明白 Facebook 的创新以及如何比其它公司做到更有效的对服务进行优化。我作为外部人员尝试深入理解 Facebook 的运作，汇集了几个月来的这些观察信息。出于对信息来源的隐私保护，我去掉了特定功能/产品的名字。我又等了6个月以后才发布这些记录，所以，有些信息肯定过时了。我希望发布这些信息会有助于了解 Facebook 的管理机制如何在组织中进行决策的推行而非逐步陷入混轮&#8230;很难说这与 Facebook 的成败或是 Facebook 的产品协作相关。我相信很多面向消费者的互联网公司会从 Facebook 这个案例受益。
*非常*感谢那些帮助我整理这篇文章的 Facebook 内部的朋友们。也要感谢项 epriest 和fryfrog 这样的朋友，他们协助我进行对本文进行校正、编辑。
记录：

截止到2010年6月，Facebook有将近2000名员工，10个月前只有大约1100人，一年之间差不多翻了一番!


工程部和运维部是两个最大的部门，每个大概都有 400-500人。这两个部门人数大约占了公司的一半。


产品经理(PM)与工程师的比例大约为1-7到1-10。


每个工程师入职时，都要接受 4 到 6 周的 &#8220;Boot Camp&#8221; 培训，通过修复Bug 和听更资深的工程师的课程来熟悉 Facebook 系统。每次 Boot Camp 大约有 10% 的人无法完成课程而被淘汰。


培训结束后，每个工程师都可以访问线上的数据库【标准课程&#8221;能力越大，责任越大&#8221; ( &#8220;with great power comes great responsibility&#8221;) 对此有阐释，另有一份明晰的&#8221;不可触犯的天条&#8221;，比如共享用户的隐私数据】。


[修改, 感谢 fryfrog] &#8220;Facebook 有非常牢靠的安全保障，以免有人（你可以想象内部有人有这个权限的）不小心/故意做了些糟糕的的事。如果你已经&#8221;成为&#8221;了需要别人支持的人，事由将被记录，并且有谨慎的审计。这里不允许钻空子。


任何工程师都可以修改Facebook的代码库，签入(Check-in)代码。
浓厚的工程师驱动文化。&#8221;产品经理基本可以被忽略&#8221;，这是Facebook一名员工的话。工程师可以修改流程的细节，重新安排工作任务，随时植入自己的想法。[评论] &#8220;本文的作者是一个产品经理，所以这个论断引起里我的注意。你看完整篇文章后会发现，很显然，Facebook 的文化实际上是拥抱产品经理的实践的，所以，不是产品经理的角色被忽略，而是，这家公司的文化看上去是想让&#8221;每个人&#8221;感受到对产品的责任&#8221;。


在每月的跨部门会议上，由工程师来汇报工作进度，市场部和产品经理会出席会议，也可以做些简短的发言，但如果长篇大论的话，将如实反馈给他们的主管，&#8221;产品人员在上次会议说的太多&#8221;。他们确实想让工程师来主导产品的开发，对自己的产品负责。


项目需要的资源都是自发征集的：



某个产品经理把工程师们召集起来，让他们对自己的想法产生兴趣。
工程师们决定开发那些让他们感兴趣的特性。
工程师跟他们的经理说：&#8221;我下周想开发这5个新特性&#8221;。
经理会让工程师独立开发，可能有时会让他优先完成一些特性。
工程师独立完成所有的特性 [...]]]></description>
		<wfw:commentRss>http://www.sou5.cn/archives/966.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mongoDB 副本集介绍(转)</title>
		<link>http://www.sou5.cn/archives/921.html</link>
		<comments>http://www.sou5.cn/archives/921.html#comments</comments>
		<pubDate>Fri, 07 Oct 2011 17:36:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.sou5.cn/?p=921</guid>
		<description><![CDATA[副本集介绍（Replica Sets Introduction）
副本集是一组，由N个mongo节点组成并协同工作的，提供自动的故障集群转移。
建立一个副本集需要步骤，1、需要启动每个节点，2、然后进行初始化设置。在这里，我们将配置一组（三个节点），这是标准设置。
一旦mongod节点启动，我们将发出一个命令，以正确地初始化设置。几秒钟后，将选举产生一个主节点，你就可以开始写和查询集。
启动节点 (Starting the nodes)
首先，创建每个节点的数据目录。


mkdir -p /data/r0
    mkdir -p /data/r1
    mkdir -p /data/r2


接下来，使用&#8221;


mongod.exe --replset


&#8221; 启动每个mongod进程，&#8221;&#8211;replset&#8221;参数需要你指定一个副本集逻辑名称.这里让我们使用“foo.”作为第一个节点的名称：
启动第一个节点，端口 27018.


 mongod.exe --replSet foo --port 27017 --dbpath /data/r0


启动第二个节点，端口 27018.


mongod.exe --replSet foo --port 27018 --dbpath /data/r1


最后,启动第三个节点，端口 27019.


mongod --replSet foo --port 27019 --dbpath /data/r2


现在你有三个接单在运行中，注意，每个节点都应显示如下警告：


Mon Aug  2 11:30:19 [startReplSets] replSet can't get local.system.replset config from [...]]]></description>
		<wfw:commentRss>http://www.sou5.cn/archives/921.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP, Python Consistent Hashing(一致性hash)</title>
		<link>http://www.sou5.cn/archives/910.html</link>
		<comments>http://www.sou5.cn/archives/910.html#comments</comments>
		<pubDate>Fri, 29 Apr 2011 09:08:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.sou5.cn/?p=910</guid>
		<description><![CDATA[import memcache
import binascii
m = memcache.Client(['192.168.28.7:11211', '192.168.28.8:11211
', '192.168.28.9:11211'])

def php_hash(key):
    return (binascii.crc32(key) &#62;&#62; 16) &#38; 0x7fff

for i in range(30):
       key = 'key' + str(i)
       a = m.get((php_hash(key), key))
       print i, a
]]></description>
		<wfw:commentRss>http://www.sou5.cn/archives/910.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>web项目中的虫洞</title>
		<link>http://www.sou5.cn/archives/900.html</link>
		<comments>http://www.sou5.cn/archives/900.html#comments</comments>
		<pubDate>Sat, 26 Mar 2011 17:22:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.sou5.cn/?p=900</guid>
		<description><![CDATA[

虫洞？看看爱因斯坦对虫洞的定义：“虫洞”就是连接宇宙遥远区域间的时空细管。暗物质维持着虫洞出口的敞开。虫洞可以把平行宇宙和婴儿宇宙连接起来，并提供时间旅行的可能性。
虫洞也可能是连接黑洞和白洞的时空隧道，所以也叫”灰道”。看起来虫洞就是连接两个距离很远的物体。在我们的WEB项目中会存在这种情况吗？
假设你有一个域名：domain.com。现在主站是www.domain.com。好了，还有一个博客的子域名：blog.domian.com。现在有个需求：要在主站上调用博客子站里面的数据，
而且是客户端（通俗的说是页面上）调用。你想到的有几种方式？这个是不是两个感觉很远的物体，好了，让我们来制造一个虫洞来连接这两个跨域的站点。
虫洞一：iframe
是的，iframe在不跨域子域的情况下完全可以互通。假如现在你要在http://www.domian.com/parent.html和http://blog.domain.com/child.html互通，
那么在parent.html里面嵌入一个iframe，id为child，src指向child.html。只要满足一个条件：在两个页面上都这样设置：
document.domain='domain.com'
。这样设置之后两个页面的JS对象完全可以互通。在parent.html里面获得child.html的window对象:
var obj=document.getElementById('child').contentWindow
。这样obj对象就是child.html里面的window对象了，有了这个对象可以操作child.html里面的任何东西。
在child.html里面操作parent.html更加方便：parent对象就是parent.html的window对象。
上面所说的iframe虫洞只能适用一些简单的需求，但是我接来下所说的一些却是以这个为基础的。
虫洞二：jsonp
陌生吗？其实很熟悉，也许你每天都在用到。打开百度首页，启动你的抓包工具，能抓普通的http包即可（推荐fiddler）。
在关键字的输入框里面随便输入一字符串。好了，看下你的抓包工具有没有收获。
我这抓到了一个包：http://suggestion.baidu.com/su?wd=d&#38;p=3&#38;cb=window.bdsug.sug&#38;t=1282228746640。这个url返回的内容：
window.bdsug.sug({q:"d",p:true,s:["dnf","dnf官网","dota","dj","dnf视频","dj舞曲","dell","dn","dj舞曲 超嗨2009 mp3","dnf连发程序下载"]});
好了，这些东西是什么呢？其实这就是一段JS代码，有没有看到抓包工具抓到的URL中有一个cb的参数，值为:window.bdsug.sug，
返回的内容就是window.bdsug.sug(object)。也许你已经想到这个怎么使用了，就是通过JS代码来载入一段JS代码。
在著名的JS框架Jquery中有一个API：$.getScript(url,callback)。可以告诉你而且这个url可以完全跨域！
虫洞三：AJAX虫洞
AJAX相信大家都非常非常熟悉，这个概念确实改变了很多产品的设计。非常好用，但是有个致命的缺陷，不能跨域，子域名都不能，
比如www.domain.com想通过ajax直接访问blog.domain.com是不可能的。注意我说的通过AJAX直接访问，那么有没有间接的方法呢？答案是肯定的。
看看我上面写的第一个虫洞iframe，有没有点启发？是的，虽然不能直接访问blog.domain.com，但是可以通过blog.domain.com来ajax。
而blog.domain.com又可以通过parent来访问www.domain.com。所以一切都通了。
好了 开始部署这个AJAX虫洞：
1 在blog.domain.com下部署一个proxy.html，里面就一个异步的对象和设置document.domain。这里假设这个异步对象为：pAjax(url,callback);
2 在www.domain.com通过iframe来加载这个proxy.html。
3 在www.domain.com使用proxy.html里面的异步对象呢?看如下代码：
　　　　　var obj=document.iframes['proxy'].contentWindow;
　　　　　var ajax=new obj.pAjax('http://blog.domain.com/query',function(response){
　　　　　　　　　//callback
　　　　　});
　　　　　ajax.get();
简单总结：
jsonp方式适用于完全跨域，比如a.com可以访问b.com，当然前提是b.com可以给你提供正确的服务。
别的都是要通过iframe来作为桥梁。没有这个桥梁也是不可能！这个桥梁还有许多别的用途，你可以挖掘，比方表单提交到iframe。

虫洞？看看爱因斯坦对虫洞的定义：“虫洞”就是连接宇宙遥远区域间的时空细管。暗物质维持着虫洞出口的敞开。虫洞可以把平行宇宙和婴儿宇宙连接起来，
并提供时间旅行的可能性。虫洞也可能是连接黑洞和白洞的时空隧道，所以也叫”灰道”。看起来虫洞就是连接两个距离很远的物体。在我们的WEB项目中会存在这种情况吗？
假设你有一个域名：domain.com。现在主站是www.domain.com。好了，还有一个博客的子域名：blog.domian.com。现在有个需求：要在主站上调用博客子站里面的数据，
而且是客户端（通俗的说是页面上）调用。你想到的有几种方式？这个是不是两个感觉很远的物体，好了，让我们来制造一个虫洞来连接这两个跨域的站点。
虫洞一：iframe
是的，iframe在不跨域子域的情况下完全可以互通。假如现在你要在http://www.domian.com/parent.html和http://blog.domain.com/child.html互通，
那么在parent.html里面嵌入一个iframe，id为child，src指向child.html。只要满足一个条件：在两个页面上都这样设置：
document.domain='domain.com'。这样设置之后两个页面的JS对象完全可以互通。在parent.html里面获得child.html的window对象:
var obj=document.getElementById('child').contentWindow。这样obj对象就是child.html里面的window对象了，有了这个对象可以操作child.html里面的任何东西。
在child.html里面操作parent.html更加方便：parent对象就是parent.html的window对象。
上面所说的iframe虫洞只能适用一些简单的需求，但是我接来下所说的一些却是以这个为基础的。
虫洞二：jsonp
陌生吗？其实很熟悉，也许你每天都在用到。打开百度首页，启动你的抓包工具，能抓普通的http包即可（推荐fiddler）。在关键字的输入框里面随便输入一字符串。
好了，看下你的抓包工具有没有收获。我这抓到了一个包：http://suggestion.baidu.com/su?wd=d&#38;p=3&#38;cb=window.bdsug.sug&#38;t=1282228746640。这个url返回的内容：
window.bdsug.sug({q:"d",p:true,s:["dnf","dnf官网","dota","dj","dnf视频","dj舞曲","dell","dn","dj舞曲 超嗨2009 mp3","dnf连发程序下载"]});好了，
这些东西是什么呢？其实这就是一段JS代码，有没有看到抓包工具抓到的URL中有一个cb的参数，值为:window.bdsug.sug，返回的内容就是window.bdsug.sug(object)。
也许你已经想到这个怎么使用了，就是通过JS代码来载入一段JS代码。在著名的JS框架Jquery中有一个API：$.getScript(url,callback)。可以告诉你而且这个url可以完全跨域！
虫洞三：AJAX虫洞
AJAX相信大家都非常非常熟悉，这个概念确实改变了很多产品的设计。非常好用，但是有个致命的缺陷，不能跨域，子域名都不能，
比如www.domain.com想通过ajax直接访问blog.domain.com是不可能的。注意我说的通过AJAX直接访问，那么有没有间接的方法呢？答案是肯定的。看看我上面写的第一个虫洞iframe，
有没有点启发？是的，虽然不能直接访问blog.domain.com，但是可以通过blog.domain.com来ajax。而blog.domain.com又可以通过parent来访问www.domain.com。所以一切都通了。
好了 开始部署这个AJAX虫洞：
1 在blog.domain.com下部署一个proxy.html，里面就一个异步的对象和设置document.domain。这里假设这个异步对象为：pAjax(url,callback);
2 在www.domain.com通过iframe来加载这个proxy.html。
3 在www.domain.com使用proxy.html里面的异步对象呢?看如下代码：
var obj=document.iframes['proxy'].contentWindow;var ajax=new obj.pAjax('http://blog.domain.com/query',function(response){//callback});ajax.get();
简单总结：jsonp方式适用于完全跨域，比如a.com可以访问b.com，当然前提是b.com可以给你提供正确的服务。别的都是要通过iframe来作为桥梁。没有这个桥梁也是不可能！
这个桥梁还有许多别的用途，你可以挖掘，比方表单提交到iframe。

]]></description>
		<wfw:commentRss>http://www.sou5.cn/archives/900.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网络广告术语缩写</title>
		<link>http://www.sou5.cn/archives/893.html</link>
		<comments>http://www.sou5.cn/archives/893.html#comments</comments>
		<pubDate>Mon, 14 Feb 2011 03:36:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.sou5.cn/?p=893</guid>
		<description><![CDATA[阿里妈妈开展了一个网络广告知识大赛，其中有一些网络广告术语缩写，还真让人犯迷糊，如果你也参赛了，不妨看看我的笔记。
雅虎统计中有个“UV”这个简写名称，一开始还真没弄明白什么意思，后来查了一下，原来就是独立访客数，比如局域网对外只有一个IP地址，但是如果其中有三台机子同时访问了你的机子，那么UV就记三次。但是IP还是只记一次，所以说用UV来衡量网站访问量更准确些。
雅虎统计有三个统计指标，也就是我们常见的网站参考指数了。
PV(访问量)：即Page View，即页面浏览量或点击量，用户每次刷新即被计算一次。
UV(独立访客)：即Unique Visitor，访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。
IP(独立IP)：指独立IP数。00:00-24:00内相同IP地址只被计算一次。
CPC （Cost-per-click），按被点击的次数收费，这种模式互联网上是最多的。
CPM （Cost Per Mille），每千次展示费用，在Google Adsense后台可以看到eCPM，多了一个e，意思有效的每千次展示费用&#8221; (Effective CPM) 。
延伸一下，还有限定用户群的CPTM （Cost per Targeted Thousand Impressions），不是所有访问用户都计数，而是限定的用户群，比如按地域划分的人群。
PPS （Pay-per-Sale），根据网络广告所产生的直接销售数量而付费的一种定价模式，也就是阿里妈妈着力发展的淘宝按成交计费。
CPA （Cost Per Action），每行动成本，计价方式是指按广告投放实际效果，即按回应的有效问卷或定单来计费，而不限广告投放量，比如以前的Google推介和BackLinks注册推介。
CTR（Click through rate），也就是所谓的点击率，他的计算方式是：广告被点击次数 / 广告显示次数。
CPL（Cost for Per Lead），意思是每次引导（通过特定链接,注册成功后付费）费用，如下面的阿里妈妈的悠视推广。
CPS（Cost Per Sales），以实际销售产品数量来换算广告刊登金额，概念太多了，和PPS差不多。
]]></description>
		<wfw:commentRss>http://www.sou5.cn/archives/893.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql查询中文like不准确的问题 (转)</title>
		<link>http://www.sou5.cn/archives/891.html</link>
		<comments>http://www.sou5.cn/archives/891.html#comments</comments>
		<pubDate>Sat, 29 Jan 2011 13:03:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.sou5.cn/?p=891</guid>
		<description><![CDATA[在做MySQL的Like查询是发现中文搜索总是不争取，从网上找到了几个解决方法，大家可以看看：
方法一:
解决方法是对于包含中文的字段加上&#8221;binary&#8221;属性，使之作为二进制比较，例如将&#8221;name char(10)&#8221;改成&#8221;name char(10)binary&#8221;。
方法二:
如果你使用源码编译MySQL，可以编译MySQL时使用&#8211;with&#8211;charset=gbk 参数，这样MySQL就会直接支持中文查找和排序了。
方法三:
可以使用 Mysql 的 locate 函数来判断。以上述问题为例,使用方法为:
SELECT * FROM table WHERE locate(field,&#8217;李&#8217;) &#62; 0;
方法四:
把您的Select语句改成这样,SELECT * FROM TABLE WHERE FIELDS LIKE BINARY &#8216;%FIND%&#8217;即可
问题出现的原因是:
在MySQL中，进行中文排序和查找的时候，对汉字的排序和查找结果是错误的。这种情况在MySQL的很多版本中都存在。如果这个问题不解决，那么MySQL将无法实际处理中文。
MySQL在查询字符串时是大小写不敏感的，在编绎MySQL时一般以ISO-8859字符集作为默认的字符集，因此在比较过程中中文编码字符大小写转换造成了这种现象
我用的第三个办法  select * from table where locate(`字段名`,&#8217;关键字&#8217;)&#62;0;
LOCATE(substr,str)
返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substr 在 str 中不存在，返回值为 0：
mysql&#62; SELECT LOCATE(’bar’, ‘foobarbar’);
-&#62; 4
转 : http://blog.csdn.net/sws9999/archive/2009/07/29/4391326.aspx
]]></description>
		<wfw:commentRss>http://www.sou5.cn/archives/891.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql 取消DNS的反向解析</title>
		<link>http://www.sou5.cn/archives/888.html</link>
		<comments>http://www.sou5.cn/archives/888.html#comments</comments>
		<pubDate>Fri, 21 Jan 2011 04:57:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.sou5.cn/?p=888</guid>
		<description><![CDATA[[mysqld]
skip-name-resolve
附录：( How MySQL uses DNS )
When a new thread connects to mysqld, mysqld will spawn a new thread to handle the request. This thread will first check if the hostname is in the hostname cache. If not the thread will call gethostbyaddr_r() and gethostbyname_r() to resolve the hostname.
If the operating system doesn&#8217;t support the above [...]]]></description>
		<wfw:commentRss>http://www.sou5.cn/archives/888.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firebug中的console tab使用总结 (转)</title>
		<link>http://www.sou5.cn/archives/884.html</link>
		<comments>http://www.sou5.cn/archives/884.html#comments</comments>
		<pubDate>Sun, 16 Jan 2011 10:50:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.sou5.cn/?p=884</guid>
		<description><![CDATA[Firebug对于Web开发人员来说，已经成为了不可或缺的工具，但是在我日常的工作中，常常感觉还没有能够深刻的挖掘出她的潜力，今天花了点时间仔细研究了Console和命令行的使用在提高工作效率方面的作用，
记下来和大家分享一下.
Firebug一共有Console,HTML,CSS,Script,DOM,NET六个Tab，今天着重说一下Console的用法。
其实我们对于Console应该非常熟悉，因为这里是Firebug给出各种信息的窗口，而这也正是Console的主要用途，日志记录(Logging)。
除此之外，Console还提供了通过命令行方式来调试Javascript的方法。下面就来学习一下Console的用法。
1、Firefox的日志记录(Logging in Firefox)。
通过Console的记录方法，我们可以不再使用烦人的alert或者document.write方法来进行调试。
Firebug提供了五种日志的类型：

console.log:记录一行信息，无任何图标提示；
console.debug:记录一行信息，带超链接，可以链接到语句调用的地方；
console.error():向控制台中写入错误信息，带错误图标显示和高亮代码链接；
console.info():向控制台中写入提示信息，带信息图标显示和高亮代码链接；
console.warn():向控制台中写入警告信息，带警告图标显示和高亮代码链接；

consle打印字符串支持字符串替换，使用起来就像c里面的printf(“%s&#8221;,a),支持的类型包括：

%s        string，字符串
%d,%i    整型
%f        浮点
%o        对象

如果使用%o的话，对象就会用绿色的超链接表示出来，单击后会将你带到DOM视图。
2、分组(Grouping)。
如果某一类的信息特别多时，分组就有利于逻辑的划分。
使用上很简单，参见代码。
function consoleGroup(){
var groupname = &#8220;Group 1&#8243;;
console.group(&#8220;Message group %s&#8221;, groupname);
console.log(&#8220;This is the 1 message in %s&#8221;, groupname);
console.log(&#8220;This is the 2 message in %s&#8221;, groupname);
console.log(&#8220;This is the 3 message in %s&#8221;, groupname);
console.groupEnd();
goupname = &#8220;Group 2&#8243;;
console.group(&#8220;Message group %s&#8221;, goupname);
console.log(&#8220;This is the 1 message in %s&#8221;, goupname);
var subgroupname = &#8220;Sub [...]]]></description>
		<wfw:commentRss>http://www.sou5.cn/archives/884.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google推出apache加速模块mod_pagespeed</title>
		<link>http://www.sou5.cn/archives/861.html</link>
		<comments>http://www.sou5.cn/archives/861.html#comments</comments>
		<pubDate>Fri, 05 Nov 2010 17:20:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[mod_pagespeed]]></category>

		<guid isPermaLink="false">http://www.sou5.cn/?p=861</guid>
		<description><![CDATA[大多人浏览网页如果超过3秒打不开就会离开,Google为此推出了一款apache加速模块，可以有效将网页加载速度提高50%.
网页提速的问题是一个复杂多样的问题，有很多解决方法,往往关系到网站系统程序，服务器硬件，网络传输速度等方面，而Google这款加速模块简单的解决了许多复情况的问题：
•如果你的网站采用apache构建服务器，不需要对网站CMS系统进行处理即可应用
•加速模块可以自行对网络传输的html字节优化及对图象,css进入压缩优化传输
•智能缓存是一大亮点，它可以自动智能缓存,加速下载
下面介绍一下所有特点功能
优化缓存
•缓存扩展
•压缩处理CSS
•优化javascript最大限度的减少重复请求
•自动缓存CSS
•JavaScript内嵌技术
有效载荷尺寸最小化
•压缩空白
•合并头信息
•附加属性
•内建核心Javascript
•优化图像下载
•跳地非法字符
•重写优化CSS
http://code.google.com/speed/page-speed/docs/module.html
]]></description>
		<wfw:commentRss>http://www.sou5.cn/archives/861.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP+Tidy－完美的XHTML纠错+过滤</title>
		<link>http://www.sou5.cn/archives/853.html</link>
		<comments>http://www.sou5.cn/archives/853.html#comments</comments>
		<pubDate>Fri, 29 Oct 2010 12:05:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tidy]]></category>

		<guid isPermaLink="false">http://www.sou5.cn/?p=853</guid>
		<description><![CDATA[
          function HtmlFix( $html ) {
		if (!function_exists('tidy_repair_string'))
			return $html;
			//repair
		$str = tidy_repair_string($html, array(
			'output-xhtml' =&#62; true
		), 'utf8');
		//parse
		$str = tidy_parse_string($str, array(
			'output-xhtml' =&#62; true
		), 'utf8');
		$s = '';
		$nodes = @tidy_get_body($str)-&#62;child;
		if (!is_array($nodes)) {
			$returnVal = 0;
			return $s;
		}
		foreach ($nodes as $n) {
			$s .= $n-&#62;value;
		}
		return $s;
	}

转载:http://hi.baidu.com/aohaiyixiao1/blog/item/c93ad9d3e364b6d5a8ec9a53.html
官方:http://tidy.sourceforge.net/
]]></description>
		<wfw:commentRss>http://www.sou5.cn/archives/853.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

