<?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/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>玄猫的窝-韩国峰的博客 &#187; hanguofeng</title>
	<atom:link href="http://www.hanguofeng.cn/archives/author/admin/feed" rel="self" type="application/rss+xml" />
	<link>http://www.hanguofeng.cn</link>
	<description>韩国峰的博客,关注Web技术与电子商务。</description>
	<lastBuildDate>Sat, 04 Sep 2010 14:39:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>走路穿过中关村</title>
		<link>http://www.hanguofeng.cn/archives/life/walk-across-zhongguancun?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=walk-across-zhongguancun</link>
		<comments>http://www.hanguofeng.cn/archives/life/walk-across-zhongguancun#comments</comments>
		<pubDate>Sat, 04 Sep 2010 14:37:54 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[中关村]]></category>
		<category><![CDATA[回忆]]></category>
		<category><![CDATA[百度]]></category>
		<category><![CDATA[记忆日]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/life/%e8%b5%b0%e8%b7%af%e7%a9%bf%e8%bf%87%e4%b8%ad%e5%85%b3%e6%9d%91</guid>
		<description><![CDATA[穿过中关村，也许已经有无数次了吧，公交、地铁、出租车，好像还真的只有这么一次，是走路穿过中关村的。 掐指算算，从那个大家都叫做千禧年的年份，到现在，做网站已经十年了。早年的FrongPage，到东方网页王，再到因为没装FrontPage，被迫学的DreamWeaver（4.0？），再到ASP，再到PHP，十年就这么过去了。 小的时候，听说，搞IT的，都在北京的中关村聚集，于是在那个时候就充满了向往。 我还清晰的记得第一次到中关村的场景，应该是05年吧，刚上大学，有幸被才燚选中，开始我的第一本书的写作生涯，毅然决然的打电话回家，找妈妈借钱，在石家庄买了那台戴尔本，坐火车回石家庄的路上，突然想起来，囧，忘记买鼠标了，给老潘发短信，他恰好在中关村一带，于是在五道口，找上他，直奔中关村。说来搞笑，我以为中关村，就是一座电子大厦，结果有好几座，我就费尽心机的想辨别，哪个是真的，哪个是山寨的。最后还是随便选了一座，进去了，现在想想，好像是鼎好吧。进去后，就碰到了很多很多拉客的。。。导购，是导购，恩，不是别的啥。问我，买笔记本么，我就把背着的本给他看，说，哥们有本，没想到导购很聪明，立即说，那加内存么……我就受挫的失败了。ok，买了鼠标，还顺手买了个漫步者的耳机，再顺口去吃了个饭，看看表，已经六点多了，当时我就有些慌了，天晓得回学校的车，能到几点。事实上，后来的事情，我已经记不太清了，那太久远了。 于是就是漫长的大学。 大学过去了四分之三的时候，开始工作，但很遗憾，前两份都不在村子里，后来终究在08年9月，到了记忆日，投奔中关村的怀抱。在《北京的冬天，有点冷》这篇文章里，我骄傲的宣布，哥们进村了。 记忆日在立方庭的那段日子，难以忘怀，先是和944结缘，继而和10号线的苏州街结缘。易餐的卤肉饭，旁边小路上的大盘鸡，然后就到了天天订东来顺、订满腹食堂、订多好鸭的日子。通宵，在地毯上睡囫囵觉，玩CS，玩战地，玩QUAKE，玩Dota。各位兄弟们，dra，Rocky，东爷，你们还好吗？ 那段时光，把我真正的变成了村民。虽然到现在，还难以从e世界轻松的走到立方庭，虽然到现在，还不知道那个家乐福到底从哪里可以直接进去，虽然…… 说起那段时光，不得不提时而和大湿、小麻在五道口的各个咖啡馆集结的日子，好像去的最多的是Bridge吧，每次在那里谈到校内、海内、饭否，我总是突然变得神秘，说，你们丫小点声，别让王兴听到，这哥们就在旁边楼里呢。我们三个人，最后一次聚，应该是在清华西门旁边的那个胡同里面的咖啡馆吧，这也很久远了。小麻同学，在女生宿舍楼墙上喷了个侏罗纪logo的小麻同学，已然离开了伟大首都北京，南下漂泊去了，最后一次和小麻同学相聚，仍然是在Bridge，大湿，你现在还好吗。 说起大湿，我终于可以扣题一下了，有一本叫做《跑步穿过中关村》的书，我在小的时候，也听过，但一直没有看过，直到大湿再次推荐，我才真的想起来，作为一个对中关村充满了向往的人，我的确是应该看看这本书的，但很遗憾，当时没有在网上找到能下的电子版，于是又搁置了。说来奇怪，每天我的阅读时间加起来至少有一到两个小时，却基本不看实体书，所以，没有电子版，我就认为，没有这本书。后来，终于有机会下到了，看了，却实实在在有些失望。 这本书，原来就讲的不是我们程序员的前辈，而是和我一样，在中关村混生活的人的故事，事情发生，也已经很久了，应该是在很久以前的中关村了。当时看了这本书，心里着实有些不舒服的，原来，我们都是中关村混生活的。 记忆日一路向东搬家，继而又换工作，到了百度，我终究还是离开了那里，离开了中关村。 难道，我要一直，跑步穿过中关村吗？想想，好像我真的没有在那里跑步过。 所以，把心态放平和，以前常去那里的时候，从来没有漫步穿过，如今，竟然有机会，在那里慢慢散步，考虑的不再是，这个需求如何满足，那个系统如何设计，今天堵车的话，是不是又要迟到，而是，我要走到哪里去。 相关内容北京的冬天，有点冷回忆当年在猫扑的故事]]></description>
			<content:encoded><![CDATA[<p>穿过中关村，也许已经有无数次了吧，公交、地铁、出租车，好像还真的只有这么一次，是走路穿过中关村的。</p>
<p>掐指算算，从那个大家都叫做千禧年的年份，到现在，做网站已经十年了。早年的FrongPage，到东方网页王，再到因为没装FrontPage，被迫学的DreamWeaver（4.0？），再到ASP，再到PHP，十年就这么过去了。</p>
<p>小的时候，听说，搞IT的，都在北京的中关村聚集，于是在那个时候就充满了向往。</p>
<p>我还清晰的记得第一次到中关村的场景，应该是05年吧，刚上大学，有幸被才燚选中，开始我的第一本书的写作生涯，毅然决然的打电话回家，找妈妈借钱，在石家庄买了那台戴尔本，坐火车回石家庄的路上，突然想起来，囧，忘记买鼠标了，给老潘发短信，他恰好在中关村一带，于是在五道口，找上他，直奔中关村。说来搞笑，我以为中关村，就是一座电子大厦，结果有好几座，我就费尽心机的想辨别，哪个是真的，哪个是山寨的。最后还是随便选了一座，进去了，现在想想，好像是鼎好吧。进去后，就碰到了很多很多拉客的。。。导购，是导购，恩，不是别的啥。问我，买笔记本么，我就把背着的本给他看，说，哥们有本，没想到导购很聪明，立即说，那加内存么……我就受挫的失败了。ok，买了鼠标，还顺手买了个漫步者的耳机，再顺口去吃了个饭，看看表，已经六点多了，当时我就有些慌了，天晓得回学校的车，能到几点。事实上，后来的事情，我已经记不太清了，那太久远了。</p>
<p>于是就是漫长的大学。</p>
<p>大学过去了四分之三的时候，开始工作，但很遗憾，前两份都不在村子里，后来终究在08年9月，到了<a href="http://www.jiyiri.com" target="_blank">记忆日</a>，投奔中关村的怀抱。在<a href="http://www.hanguofeng.cn/archives/life/cold-winter-in-beijing" target="_blank">《北京的冬天，有点冷》</a>这篇文章里，我骄傲的宣布，哥们进村了。</p>
<p>记忆日在立方庭的那段日子，难以忘怀，先是和944结缘，继而和10号线的苏州街结缘。易餐的卤肉饭，旁边小路上的大盘鸡，然后就到了天天订东来顺、订满腹食堂、订多好鸭的日子。通宵，在地毯上睡囫囵觉，玩CS，玩战地，玩QUAKE，玩Dota。各位兄弟们，dra，Rocky，东爷，你们还好吗？</p>
<p>那段时光，把我真正的变成了村民。虽然到现在，还难以从e世界轻松的走到立方庭，虽然到现在，还不知道那个家乐福到底从哪里可以直接进去，虽然……</p>
<p>说起那段时光，不得不提时而和大湿、小麻在五道口的各个咖啡馆集结的日子，好像去的最多的是Bridge吧，每次在那里谈到校内、海内、饭否，我总是突然变得神秘，说，你们丫小点声，别让王兴听到，这哥们就在旁边楼里呢。我们三个人，最后一次聚，应该是在清华西门旁边的那个胡同里面的咖啡馆吧，这也很久远了。小麻同学，在女生宿舍楼墙上喷了个侏罗纪logo的小麻同学，已然离开了伟大首都北京，南下漂泊去了，最后一次和小麻同学相聚，仍然是在Bridge，大湿，你现在还好吗。</p>
<p>说起大湿，我终于可以扣题一下了，有一本叫做<a href="http://book.douban.com/subject/3225885/" target="_blank">《跑步穿过中关村》</a>的书，我在小的时候，也听过，但一直没有看过，直到大湿再次推荐，我才真的想起来，作为一个对中关村充满了向往的人，我的确是应该看看这本书的，但很遗憾，当时没有在网上找到能下的电子版，于是又搁置了。说来奇怪，每天我的阅读时间加起来至少有一到两个小时，却基本不看实体书，所以，没有电子版，我就认为，没有这本书。后来，终于有机会下到了，看了，却实实在在有些失望。</p>
<p>这本书，原来就讲的不是我们程序员的前辈，而是和我一样，在中关村混生活的人的故事，事情发生，也已经很久了，应该是在很久以前的中关村了。当时看了这本书，心里着实有些不舒服的，原来，我们都是中关村混生活的。</p>
<p>记忆日一路向东搬家，继而又换工作，到了百度，我终究还是离开了那里，离开了中关村。</p>
<p>难道，我要一直，跑步穿过中关村吗？想想，好像我真的没有在那里跑步过。</p>
<p>所以，把心态放平和，以前常去那里的时候，从来没有漫步穿过，如今，竟然有机会，在那里慢慢散步，考虑的不再是，这个需求如何满足，那个系统如何设计，今天堵车的话，是不是又要迟到，而是，我要走到哪里去。</p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/cold-winter-in-beijing" title="北京的冬天，有点冷">北京的冬天，有点冷</a></li><li><a href="http://www.hanguofeng.cn/archives/life/mop-in-memory" title="回忆当年在猫扑的故事">回忆当年在猫扑的故事</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/walk-across-zhongguancun/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>立秋++++</title>
		<link>http://www.hanguofeng.cn/archives/life/autumn-plus-plus-plus-plus?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=autumn-plus-plus-plus-plus</link>
		<comments>http://www.hanguofeng.cn/archives/life/autumn-plus-plus-plus-plus#comments</comments>
		<pubDate>Mon, 09 Aug 2010 15:55:26 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=201</guid>
		<description><![CDATA[立秋前一天，六月廿七。 十点多从公司回家，到家发现忘记带钥匙，于是厚着脸皮，叫棍子跑来开车带我去公司取钥匙，事毕，棍子说，明天立秋了，吃点肥肉，贴秋膘。 这件事我颇不以为然，身上的膘，还可以撑过很多个秋天。 而这个秋天，就这样到来了。 出生和死亡，都是会让人哭泣的事情，我们为迎接一个生命而惊喜，又为送别一个生命，而悲伤。天地不仁，以万物为刍狗。 不知道已经持续了多少个日夜，每每早晨打开网站看新闻，总是悲剧占据了头条，时不时还有黑体、黑字的加强版悲剧。贼老天，能不能淡定点？ 每到秋天，总是会唤醒我记忆中这样的场景：军训中，在深山中秋天的傍晚，嗅着充满了树叶气息的空气，看蚊子的嘴穿透汗浸湿的衣服。感觉军训带给我们的，是恍如隔世的另一种宁静。恍如隔世没有什么不好，有的时候，真想给自己再创造一些恍如隔世的机会，总是跳出这个坑，才有机会看到坑里的自己。 今天，先到这里吧，我累了。 随机内容[译文]Google AJAX Language API开发者参考夏·恐惧·变化·解耦DreamWeaver CS4新特性之JavaScript]]></description>
			<content:encoded><![CDATA[<p>立秋前一天，六月廿七。</p>
<p>十点多从公司回家，到家发现忘记带钥匙，于是厚着脸皮，叫棍子跑来开车带我去公司取钥匙，事毕，棍子说，明天立秋了，吃点肥肉，贴秋膘。</p>
<p>这件事我颇不以为然，身上的膘，还可以撑过很多个秋天。</p>
<p>而这个秋天，就这样到来了。</p>
<p>出生和死亡，都是会让人哭泣的事情，我们为迎接一个生命而惊喜，又为送别一个生命，而悲伤。天地不仁，以万物为刍狗。</p>
<p>不知道已经持续了多少个日夜，每每早晨打开网站看新闻，总是悲剧占据了头条，时不时还有黑体、黑字的加强版悲剧。贼老天，能不能淡定点？</p>
<p>每到秋天，总是会唤醒我记忆中这样的场景：军训中，在深山中秋天的傍晚，嗅着充满了树叶气息的空气，看蚊子的嘴穿透汗浸湿的衣服。感觉军训带给我们的，是恍如隔世的另一种宁静。恍如隔世没有什么不好，有的时候，真想给自己再创造一些恍如隔世的机会，总是跳出这个坑，才有机会看到坑里的自己。</p>
<p>今天，先到这里吧，我累了。</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/birthday-of-22-years-old" title="生日快乐">生日快乐</a></li><li><a href="http://www.hanguofeng.cn/archives/uncategorized/2008-spring-festival" title="祝大家戊子年新春大吉，万事如意">祝大家戊子年新春大吉，万事如意</a></li><li><a href="http://www.hanguofeng.cn/archives/life/beihai-park" title="北海公园游记">北海公园游记</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/autumn-plus-plus-plus-plus/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>夏·恐惧·变化·解耦</title>
		<link>http://www.hanguofeng.cn/archives/uncategorized/summer-scare-change-decouple?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=summer-scare-change-decouple</link>
		<comments>http://www.hanguofeng.cn/archives/uncategorized/summer-scare-change-decouple#comments</comments>
		<pubDate>Mon, 26 Jul 2010 16:37:12 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[闲言碎语]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=197</guid>
		<description><![CDATA[今年的夏天我是怎么过的？ 埋头在代码里解决问题、重构。淹的喘不过气来。终究在这个湿热的夏天，闷病了。 去年的夏天我是怎么过的？ 奔波在学校和公司之间，和老师bargain论文，和dra bargain需求，和棍子bargain设计。 前年的夏天我是怎么过的？ 蜗居在六里桥，享受刚工作的快感。 再之前呢？也许……我已经忘却。 最近半年总是很多变化，从年初的记忆日搬家、到过完年回来的众多离别、到五月份的杭州之游，再到入职百度。 从写程序的角度来看，没有比写永远不会经历变化的代码更无聊的事情了。写代码的快感就在应对变化，从需求的变化，到负载的变化。 在程序上害怕变化的原因莫过于耦合。你认为B是一个A，于是你让B继承了A，但实际上明天出现了变化，B不再是A了，问题来了吧。人生何尝不是如此。《波若波罗密心经》有云：“心无挂碍， 无挂碍故，无有恐怖”，我们的恐惧总是来源于“挂碍”，挂碍难道不是依赖么。 我所习惯的应对变化的方法，则是解耦，如果B不和A耦合的那么强，也许事情会好办很多，你所挂碍的东西，不是那么具体，也会变得好很多。 现在的人，满足底层需求都是很容易的，所谓的忧愁，却偏偏是不厌其烦的要满足自己的高层需求，总是将“自我实现”继承了“钱”、“地位”，但实际上，你需要的是一个高层需求提供者，这个提供者就是更真实的你，有的时候，这个提供者提供的是钱，有的时候，是地位，还有的时候，是快乐，是幸福，是感动，是付出。别直接把高层需求假设为某个东西嘛。其实啊，钱、地位和开心、幸福在这个层次上都是平行的，实现同一个接口的东西，这个接口是自我实现。那么，这些东西，是否可以继承自一个基类，是一类东西的抽象呢？我现在还没有想明白，所以，不急，不急。慢工出细活，慢慢干。 淡定哥是我，我是淡定哥。 回想过去的几个月，有很多东西都被配给了需求提供者，提供者输出的东西，也在频繁变化，不想加那么多switch&#8230;case，太费脑子，让他自己感应环境，自己适配吧。 我好像得了很严重的职业病，之前发生过看到 season in the sun，念成session in the sun的故事，今天又在一篇普通的，没有作为“Code Life”的博客里面，用技术原理描述生活了，哎。 好了，淡定，也许你又要说，看不懂，好高深，淡定啦，以后，会懂的。 随机内容EMAIL到你的Web程序&#8211;有趣的Email2HTTP北京·冬·有雪走路穿过中关村]]></description>
			<content:encoded><![CDATA[<p>今年的夏天我是怎么过的？</p>
<p>埋头在代码里解决问题、重构。淹的喘不过气来。终究在这个湿热的夏天，闷病了。</p>
<p>去年的夏天我是怎么过的？</p>
<p>奔波在学校和公司之间，和老师bargain论文，和dra bargain需求，和棍子bargain设计。</p>
<p>前年的夏天我是怎么过的？</p>
<p>蜗居在六里桥，享受刚工作的快感。</p>
<p>再之前呢？也许……我已经忘却。</p>
<p>最近半年总是很多变化，从年初的记忆日搬家、到过完年回来的众多离别、到五月份的杭州之游，再到入职百度。</p>
<p>从写程序的角度来看，没有比写永远不会经历变化的代码更无聊的事情了。写代码的快感就在应对变化，从需求的变化，到负载的变化。</p>
<p>在程序上害怕变化的原因莫过于耦合。你认为B是一个A，于是你让B继承了A，但实际上明天出现了变化，B不再是A了，问题来了吧。人生何尝不是如此。《波若波罗密心经》有云：“心无挂碍， 无挂碍故，无有恐怖”，我们的恐惧总是来源于“挂碍”，挂碍难道不是依赖么。</p>
<p>我所习惯的应对变化的方法，则是解耦，如果B不和A耦合的那么强，也许事情会好办很多，你所挂碍的东西，不是那么具体，也会变得好很多。</p>
<p>现在的人，满足底层需求都是很容易的，所谓的忧愁，却偏偏是不厌其烦的要满足自己的高层需求，总是将“自我实现”继承了“钱”、“地位”，但实际上，你需要的是一个高层需求提供者，这个提供者就是更真实的你，有的时候，这个提供者提供的是钱，有的时候，是地位，还有的时候，是快乐，是幸福，是感动，是付出。别直接把高层需求假设为某个东西嘛。其实啊，钱、地位和开心、幸福在这个层次上都是平行的，实现同一个接口的东西，这个接口是自我实现。那么，这些东西，是否可以继承自一个基类，是一类东西的抽象呢？我现在还没有想明白，所以，不急，不急。慢工出细活，慢慢干。</p>
<p>淡定哥是我，我是淡定哥。</p>
<p>回想过去的几个月，有很多东西都被配给了需求提供者，提供者输出的东西，也在频繁变化，不想加那么多switch&#8230;case，太费脑子，让他自己感应环境，自己适配吧。</p>
<p>我好像得了很严重的职业病，之前发生过看到 season in the sun，念成session in the sun的故事，今天又在一篇普通的，没有作为“Code Life”的博客里面，用技术原理描述生活了，哎。</p>
<p>好了，淡定，也许你又要说，看不懂，好高深，淡定啦，以后，会懂的。</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/security/sql-injection-attack" title="SQL注入攻击-来自微软安全博客的建议">SQL注入攻击-来自微软安全博客的建议</a></li><li><a href="http://www.hanguofeng.cn/archives/life/birthday-of-22-years-old" title="生日快乐">生日快乐</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-1" title="听小韩聊PHP项目开发(1)&#8211;开题的话">听小韩聊PHP项目开发(1)&#8211;开题的话</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/uncategorized/summer-scare-change-decouple/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LazyLoad Girl On Marriage</title>
		<link>http://www.hanguofeng.cn/archives/code-life/lazyload-girl-on-marriage?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=lazyload-girl-on-marriage</link>
		<comments>http://www.hanguofeng.cn/archives/code-life/lazyload-girl-on-marriage#comments</comments>
		<pubDate>Tue, 13 Jul 2010 16:57:36 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Code Life]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=191</guid>
		<description><![CDATA[延迟加载，不是一种设计模式，而是一种思维。当一个对象的若干属性值位于数据库或其他远程存储中，且不会被立即访问时，没有必要一开始创建对象就从远程存储读取，而是在被调用的时候，才进行读取，读取后，可以考虑放入私有变量，作为一个缓存机制，但是需要考虑当后端数据存储更新时，类实例存在脏数据的问题。
延迟加载在某些场合，可以提高系统性能。]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"> <span style="color: #FF0000;">class</span> Boy
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> _name<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">private</span> Girl _girl<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">public</span> Boy<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> name,Girl girl<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>._name <span style="color: #008000;">=</span> name<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">this</span>._girl <span style="color: #008000;">=</span> girl<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Marriage<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">string</span> girl_name <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>._girl.<span style="color: #0000FF;">GetName</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">string</span> boy_name <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>._name<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">this</span>._marriage<span style="color: #000000;">&#40;</span>boy_name, girl_name<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> _marriage<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> boy_name, <span style="color: #FF0000;">string</span> girl_name<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span> 
            <span style="color: #008080; font-style: italic;">//other codes</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #FF0000;">class</span> Girl
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">int</span> _id<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> _name<span style="color: #008000;">=</span>null<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">public</span> Girl<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> id<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>._id <span style="color: #008000;">=</span> id<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> GetName<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span> 
            <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">null</span><span style="color: #008000;">==</span><span style="color: #0600FF;">this</span>._name<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">this</span>._name <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>._get_name_from_store<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>._id<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>._name<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> _get_name_from_store<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> id<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">string</span> rtn <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">//other codes</span>
            <span style="color: #0600FF;">return</span> rtn<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span></pre></div></div>

<p>
延迟加载，不是一种设计模式，而是一种思维。当一个对象的若干属性值位于数据库或其他远程存储中，且不会被立即访问时，没有必要一开始创建对象就从远程存储读取，而是在被调用的时候，才进行读取，读取后，可以考虑放入私有变量，作为一个缓存机制，但是需要考虑当后端数据存储更新时，类实例存在脏数据的问题。<br />
延迟加载在某些场合，可以提高系统性能。</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/summer-vacation-in-beijing" title="北京 仲夏夜之梦">北京 仲夏夜之梦</a></li><li><a href="http://www.hanguofeng.cn/archives/life/walk-across-zhongguancun" title="走路穿过中关村">走路穿过中关村</a></li><li><a href="http://www.hanguofeng.cn/archives/security/configure-fast-in-lamp-on-windows-with-xampp" title="Windows下AMP平台配置FastCGI方法（以xampp为基础）">Windows下AMP平台配置FastCGI方法（以xampp为基础）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/code-life/lazyload-girl-on-marriage/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>听小韩聊PHP项目开发(3)–切分你的系统</title>
		<link>http://www.hanguofeng.cn/archives/web-server/php-project-development-3?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-project-development-3</link>
		<comments>http://www.hanguofeng.cn/archives/web-server/php-project-development-3#comments</comments>
		<pubDate>Mon, 12 Jul 2010 12:04:09 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web服务器端技术]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[听小韩聊PHP项目开发]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=144</guid>
		<description><![CDATA[【写在前面的话：看看本文的时间，最后一次保存是去年的八月份，想想，还是先发表一下，然后待续，老规矩，在本文完成之前请不要转载。】 你是一个有控制欲的人么？你希望把控你的项目么？那么，切分他们吧。 1、为什么要切分你的项目 我们是邪恶的 -.-。我们希望把控我们的项目，所以，我们需要切分它。 想像一下，你有一个生日蛋糕，你想吃掉它，那么，按照惯例，作为寿星的你，应该先切分它，什么？你还要点蜡烛？OMG，你要在吹蜡烛时喷口水在蛋糕上吗？你的口味好重。 切分代码，大体上来说，在控制进度、应对变化、简化逻辑、代码复用、分工协作等方面，都有相当的好处。 1.1、控制进度 首先来说控制进度，当你开始开发一个大型站点时（当然，更多的时候是“你们”），作为项目经理的你来讲，你需要时不时的应对来自你的上级或者你的客户的询问&#8211;“小韩，做了多少了，还有多久能做完啊”。这个时候，你总不能说，“哦，我做了一些了，还有一段时间能做完。” 你的领导希望听到的是，系统一共有x个模块，我做完了x个，剩下x个模块，难度有些大，可能还需要x天的时间，等所有模块都完成了，再整体整合测试一下，就OK了。这样回答，我想你的表现会让你的领导觉得，你是一个思路清晰，能够把控的项目管理人员。这里再容我跑题一下，一般认为，管理职能分为“计划、组织、协调、控制”等。其中“计划”则首先依赖于对项目的切分，如果不能切分项目，则无从进行计划。 1.2、应对变化 我们都知道，项目，尤其是软件项目是多变的，这种变化可能来自于前期沟通的不完善，也可能来自于随着时间的发展，客户或软件使用者的需求随之发展而发生变化。如果项目中所有的部分都是互相缠绕的，那么则牵一发而动全身，你甚至无法对一个简单的变量名进行改变，而使得系统的其他部分不受到干扰。然而此时，如果对系统进行划分，将其分为若干层次、若干模块，层次与层次、模块与模块之间通过既定协议（如接口）进行通讯，则可以将原有的整体复杂系统切分为若干个子系统、子模块、子程序，各程序只要保持其输入、输出不变，则其内部的代码可以方便的更改而不怕会影响到外部。 我举个例子来讲，你可能用以下代码处理用户的登录以及其登录会话的持久化（Session）。 //登录代码 if&#40;$success_login&#41; //假设$success_login为上一步判断用户名密码正确与否的标记 &#123; $_SESSION&#91;'user_name'&#93; = $user_name; $_SESSION&#91;'password'&#93; = $password; &#125; 而使用如下代码判断是否登录 if&#40;isset&#40;$_SESSION&#91;'user_name'&#93;&#41;&#41; &#123; //do something &#125; 那么假设有一天，你想使用username作为保存用户名的Session变量名称，则你需要找出所有形如$_SESSION['user_name']的代码，并修改，一旦有遗漏，你的程序将会出现难以查找的bug。 这就是因为在代码中，把用户登录会话的部分耦合在了全部的系统当中。实际上，你应该专门有一个管理用户登录会话的模块，比如叫做SessionManager，你的代码则可能变为这样： /** * 设定登录会话 */ if&#40;$success_login&#41; //假设$success_login为上一步判断用户名密码正确与否的标记 &#123; SessionManager::SetLoginUser&#40;$user&#41;; &#125; &#160; /** * 判断登录状态 */ if&#40;SessionManager::IsLogined&#40;&#41;&#41; &#123; //do something &#125; 这样，你在系统中，无需过度关注用户会话保存的具体实现，只要去调用SessionManager这个管理器的相关方法就可以了，而一旦发生前面提到的变化，你可以在SessionManager的内部完成此修改，而不会将这个问题渲染到全部代码。 1.3、简化逻辑 也许大部分普通的Web站点并没有复杂的逻辑，但是，随着网络世界越来越精彩，Web站点也会逐渐面临处理复杂逻辑的任务。一旦你面临复杂的系统，其中可能难倒你的，大部分不会是技术问题，而是逻辑问题，我们应当承认我们人类中的大部分，思维的稳定性和思维长度，都是有限的，我举个例子来说，在下棋的时候，在头脑中演算下一步应该如何走，对手针对你的下一步如何走这样的逻辑，没有经过一定锻炼的人，是不可能演算很多步的。对于系统逻辑来说也是一样的，同时考虑过多的问题，以及这些问题之间的关系，会让你无法承受，然而此时将一个大的、复杂的问题切分为若干小问题，在同一时刻只关注一个小问题，则可以让自己轻松快乐的去进行程序的编写。再举个例子，比如我们要写一个MSN的客户端，那么实际上是有很多问题要考虑的，你的程序如何与服务器通讯，如何构造和发送数据，如何接受和处理数据，如何将数据显示在界面上……so many，这个时候你可以将你的系统切分为若干的模块，有的模块去处理网络通讯，有的去处理数据包的解析和构造，有的去处理界面显示，有的去处理各种事件的调度，等等等等，在各个模块中，你还可以进一步划分，直到单个类遵循单一职责原则，而一个模块间各个类都是聚合的……等等等等，这里有很多方法和技巧，我们稍后会详细讨论。 [...]]]></description>
			<content:encoded><![CDATA[<p>【写在前面的话：看看本文的时间，最后一次保存是去年的八月份，想想，还是先发表一下，然后待续，老规矩，在本文完成之前请不要转载。】</p>
<p>你是一个有控制欲的人么？你希望把控你的项目么？那么，切分他们吧。</p>
<h2>1、为什么要切分你的项目</h2>
<p>我们是邪恶的 -.-。我们希望把控我们的项目，所以，我们需要切分它。</p>
<p>想像一下，你有一个生日蛋糕，你想吃掉它，那么，按照惯例，作为寿星的你，应该先切分它，什么？你还要点蜡烛？OMG，你要在吹蜡烛时喷口水在蛋糕上吗？你的口味好重。</p>
<p>切分代码，大体上来说，在控制进度、应对变化、简化逻辑、代码复用、分工协作等方面，都有相当的好处。</p>
<h3>1.1、控制进度</h3>
<p>首先来说控制进度，当你开始开发一个大型站点时（当然，更多的时候是“你们”），作为项目经理的你来讲，你需要时不时的应对来自你的上级或者你的客户的询问&#8211;“小韩，做了多少了，还有多久能做完啊”。这个时候，你总不能说，“哦，我做了一些了，还有一段时间能做完。”</p>
<p>你的领导希望听到的是，系统一共有x个模块，我做完了x个，剩下x个模块，难度有些大，可能还需要x天的时间，等所有模块都完成了，再整体整合测试一下，就OK了。这样回答，我想你的表现会让你的领导觉得，你是一个思路清晰，能够把控的项目管理人员。这里再容我跑题一下，一般认为，管理职能分为“计划、组织、协调、控制”等。其中“计划”则首先依赖于对项目的切分，如果不能切分项目，则无从进行计划。</p>
<h3>1.2、应对变化</h3>
<p>我们都知道，项目，尤其是软件项目是多变的，这种变化可能来自于前期沟通的不完善，也可能来自于随着时间的发展，客户或软件使用者的需求随之发展而发生变化。如果项目中所有的部分都是互相缠绕的，那么则牵一发而动全身，你甚至无法对一个简单的变量名进行改变，而使得系统的其他部分不受到干扰。然而此时，如果对系统进行划分，将其分为若干层次、若干模块，层次与层次、模块与模块之间通过既定协议（如接口）进行通讯，则可以将原有的整体复杂系统切分为若干个子系统、子模块、子程序，各程序只要保持其输入、输出不变，则其内部的代码可以方便的更改而不怕会影响到外部。</p>
<p>我举个例子来讲，你可能用以下代码处理用户的登录以及其登录会话的持久化（Session）。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//登录代码</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$success_login</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//假设$success_login为上一步判断用户名密码正确与否的标记</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'user_name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$user_name</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$password</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>而使用如下代码判断是否登录</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'user_name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//do something</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>那么假设有一天，你想使用username作为保存用户名的Session变量名称，则你需要找出所有形如$_SESSION['user_name']的代码，并修改，一旦有遗漏，你的程序将会出现难以查找的bug。</p>
<p>这就是因为在代码中，把用户登录会话的部分耦合在了全部的系统当中。实际上，你应该专门有一个管理用户登录会话的模块，比如叫做SessionManager，你的代码则可能变为这样：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
* 设定登录会话
*/</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$success_login</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//假设$success_login为上一步判断用户名密码正确与否的标记</span>
<span style="color: #009900;">&#123;</span>
 SessionManager<span style="color: #339933;">::</span><span style="color: #004000;">SetLoginUser</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* 判断登录状态
*/</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>SessionManager<span style="color: #339933;">::</span><span style="color: #004000;">IsLogined</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
 <span style="color: #666666; font-style: italic;">//do something</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这样，你在系统中，无需过度关注用户会话保存的具体实现，只要去调用SessionManager这个管理器的相关方法就可以了，而一旦发生前面提到的变化，你可以在SessionManager的内部完成此修改，而不会将这个问题渲染到全部代码。</p>
<h3>1.3、简化逻辑</h3>
<p>也许大部分普通的Web站点并没有复杂的逻辑，但是，随着网络世界越来越精彩，Web站点也会逐渐面临处理复杂逻辑的任务。一旦你面临复杂的系统，其中可能难倒你的，大部分不会是技术问题，而是逻辑问题，我们应当承认我们人类中的大部分，思维的稳定性和思维长度，都是有限的，我举个例子来说，在下棋的时候，在头脑中演算下一步应该如何走，对手针对你的下一步如何走这样的逻辑，没有经过一定锻炼的人，是不可能演算很多步的。对于系统逻辑来说也是一样的，同时考虑过多的问题，以及这些问题之间的关系，会让你无法承受，然而此时将一个大的、复杂的问题切分为若干小问题，在同一时刻只关注一个小问题，则可以让自己轻松快乐的去进行程序的编写。再举个例子，比如我们要写一个MSN的客户端，那么实际上是有很多问题要考虑的，你的程序如何与服务器通讯，如何构造和发送数据，如何接受和处理数据，如何将数据显示在界面上……so many，这个时候你可以将你的系统切分为若干的模块，有的模块去处理网络通讯，有的去处理数据包的解析和构造，有的去处理界面显示，有的去处理各种事件的调度，等等等等，在各个模块中，你还可以进一步划分，直到单个类遵循单一职责原则，而一个模块间各个类都是聚合的……等等等等，这里有很多方法和技巧，我们稍后会详细讨论。</p>
<h3>1.4、代码复用</h3>
<p>代码复用的一个重要基础是分割变化与不变的部分，并分别进行编程。还以我们上面的MSN客户端的例子来说，其处理网络通讯的模块，在其他的程序中是不是也可以使用呢？答案是肯定的，但是……这要求你能够良好设计这个模块，权衡其边界，以使其具有普适性。这种基础类的实现，不应当关联具体项目的问题，比如说最简单的，你的方法名，不应当叫做send_msn_request，而只是send_request，这只是一个很简单的例子，但是却说明了，你要考虑你系统中的某些聚合功能，是不是可以在其他项目中使用的，如果是，请将其切分出来，并撰写并非是与当前项目紧密耦合的代码，你可以使用一个适配器将其配接到当前项目中，而不是将其直接为当前项目撰写。</p>
<p>关于代码复用的内容，您还可以查看<a href="http://www.ibm.com/developerworks/cn/java/reuse/">http://www.ibm.com/developerworks/cn/java/reuse/</a>获得更多信息。</p>
<h3>1.5、分工协作</h3>
<p>分工协作首先要求在“工”上有的可分，现代生产是要求详细分工，流水线方式作业的，试想，哪怕一个简单的MP3，有做芯片的机器，有开发嵌入式系统的工程师，还有利用模具生产的合作工厂，最后将各个部分拼接起来，成为你手中那个会发声、可以控制的小玩意。程序开发也是一样的。每一个系统，无论简单复杂，总是由若干个子系统组成的，这些子系统通常是功能内聚的，并通过某些特定方式与其他子系统进行协作。简单说，你所看到的这个WordPress的系统，有文章的子模块、有分类/Tag的子模块，那么我们是否可以让两个人分别去开发文章的子模块和分类/Tag的子模块呢，答案是肯定的，合作者首先坐在一起，定义各自的系统边界，开发分类/Tag子模块的工程师无需了解文章是由标题、内容，甚至图片组成的，他只了解，需要给特定的文章（通过文章的id来作为关键标记），进行分类，或者标记Tag，同理，开发文章子模块的工程师也无需了解Tag和分类的区别，只需要做他的文章模块的CURD就可以了，彼此之间不需要了解太多，是增强系统稳定性，在变化时可以敏捷修改而不担心影响其他部分的重要方式。这可以降低系统的开发和修改成本，工程师之间不必担心进行了重复的工作，因为子系统边界已经确定，每个人需要做什么是非常清晰的，同时，他们不必担心他们所完成的功能如何被调用，因为这些调用规则在切分系统时就明确了。他们也不必考虑其他子系统是否会影响他的系统，包括其他子系统的bug或者修改，因为各子系统是<a href="http://www.blogjava.net/realsmy/archive/2007/04/08/109245.html" target="_blank">高内聚、低耦合</a>的，子系统的具体实现方式不会过多影响其他系统。</p>
<h2>2、如何切分你的系统</h2>
<p>切分系统是一种艺术而不是一种技术。从不同的角度看某个物体，你会得到不同的投影，一个正方形的投影，那么其原物体一定是正方体吗，当然未必。从不同的角度看待系统，就会有不同的切分方式。而我们要做的就是，试图从各个角度来看待系统，避免盲人摸象，最终选择一种权衡的、折衷的，对于系统的发展方向最契合的方式来切分。不同的程序员有不同的切分习惯，而我们也无法武断的去说一定要按照某种方式切分。毕竟，我们不是为了切分系统而切分，而是要达成某种目的，这些目的我在上面笼统的谈过，比如说，针对分工协作，如果团队中程序员的水平有一定差距，那么可以将相对内核的复杂部分切出来，交由有经验的程序员来完成，即时它可能在其他方面并不能达到你的目的。</p>
<p>切分系统有几种角度，让我们由浅入深的聊一聊。</p>
<h3>2.1、横向切分</h3>
<p>对于系统的切分，横向切分是最常见的，例如<a title="MVC" href="http://zh.wikipedia.org/wiki/MVC" target="_blank">MVC</a>模式：<strong>MVC</strong>（Model-View-Controller，模型—视图—控制器模式）用于表示一种软件架构模式。它把软件系统分为三个基本部分：模型（Model），视图（View）和控制器（Controller）。</p>
<p>这种切分方式主要考虑了系统是由几个层次来完成的，各个层次之间的功能是内聚的，比如在MVC中，Model层负责数据交互，它永远不必理解数据在界面上是如何展示的，同理，View层也不必理解数据是从MySQL数据库还是SQL Server甚至是文件中的哪个取出的。</p>
<p>这种层次的划分，可以将系统功能划分为几个大部分，这几个大部分相对独立，然而又通过行为/数据被粘合在一起，从而使得其中某个部分发生变化时，其他部分不至于那么敏感，比如，网站的界面是会频繁改版的，然而你会发现，几乎大部分情况都是，界面上的元素摆放发生了变化，但是数据本身并没有任何变化，那么我们只需要改变View层就可以了，你的C和M层的代码一点都不用改动。</p>
<p>另一个名词叫做“三层架构”，实际上和MVC类似，也有人将MVC直接成为三层架构。其代表是微软的示例程序PetShop（<a title="PetShop的系统架构设计分析" href="http://www.cnblogs.com/wayfarer/archive/2006/04/14/375382.html" target="_self">架构详细分析看这里</a>）。其将系统大致分为DAL（Data Access Level，数据访问层）、BLL（Bussines Logic Level，业务逻辑层）以及界面表示层。</p>
<p>但是，我窃以为，仅有MVC是不够的。在MVC中，Model层的功能实际上是可以再分为数据逻辑和业务逻辑两个层次，即更倾向于三层架构。业务逻辑层可以复用多个数据逻辑层，这在仅有Model层的系统中是难以做到的，同时，业务逻辑是可能发生频繁变更的，此时简单的数据逻辑并没有发生任何变化，不需要花代价和承担风险进行修改。我举个例子来说，我们要设计一个用户系统，该系统有注册、登录、修改信息等功能，此时，我们可以根据需求制定出一个业务逻辑层，你可以将其叫做LogicOperation/UserOperation层（下文简称UserOper），在该层中切合需求进行功能的设计，即Login、Regist、ModifyInfo，那么，我们是否在这个层次中就开始撰写关于数据库操作的代码呢，答案是否定的，因为你会发现，在Login功能中，你需要去查询用户名是否存在这样的信息，在Regist中，你同样会查询该信息，此时，你应该继续抽象出一个功能相对原子化的数据操作层，即DataManager/UserManager，在UserManager中，实现标准的CURD（Create、Update、Read、Delete）功能，以及某些可能用到的其他功能，但是这些方法应该是原子化的，可以由UserOper组合调用，例如在Regist中，可能通过UserManager的IsAccountExist方法查询用户名是否存在，然后用CreateUser方法建立用户，而在Login中，首先通过IsAccountExist方法查询用户名是否存在，然后用ReadUserByAccount方法来获得用户信息，并继而比对密码，等等，你会发现，LogicOperation层是对DataManager层方法的组合调用，而其组合方式就是具体的业务逻辑。</p>
<h3>2.2、纵向切分</h3>
<h3>2.3、混合切分</h3>
<h3>2.4、切分粒度</h3>
<h2>3、切分案例</h2>
<h2>3.1、一个CMS系统的切分</h2>
<h3>3.2、一个博客系统的切分</h3>
<h3>3.3、一个校内网APP程序的切分</h3>
<h2>4、切分作业</h2>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-2" title="听小韩聊PHP项目开发(2)&#8211;观察你的项目">听小韩聊PHP项目开发(2)&#8211;观察你的项目</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-1" title="听小韩聊PHP项目开发(1)&#8211;开题的话">听小韩聊PHP项目开发(1)&#8211;开题的话</a></li><li><a href="http://www.hanguofeng.cn/archives/security/configure-fast-in-lamp-on-windows-with-xampp" title="Windows下AMP平台配置FastCGI方法（以xampp为基础）">Windows下AMP平台配置FastCGI方法（以xampp为基础）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-server/php-project-development-3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[听小韩聊PHP项目开发]]></series:name>
	</item>
		<item>
		<title>Singleton.Lover</title>
		<link>http://www.hanguofeng.cn/archives/code-life/singleton-lover?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=singleton-lover</link>
		<comments>http://www.hanguofeng.cn/archives/code-life/singleton-lover#comments</comments>
		<pubDate>Tue, 01 Dec 2009 13:17:21 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Code Life]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=174</guid>
		<description><![CDATA[class Lover &#123; private static Lover _instance; private static readonly object _locker = new object&#40;&#41;; public static Lover getInstance&#40;&#41; &#123; if &#40;null == Lover._instance&#41; &#123; lock &#40;Lover._locker&#41; &#123; if &#40;null == Lover._instance&#41; &#123; Lover._instance = new Lover&#40;&#41;; &#125; &#125; &#125; &#160; return Lover._instance; &#125; &#125; 单例模式（单件模式、Singleton）是一种为方便管理类的实例的数量的设计模式，属于建造型模式。当然，这个数量一般是1。单例模式可以使得在生存期内，所有使用类实例的场合，都使用相同的类实例，从而保证在某些应用场景下，所操作的数据是你需要操作的那一份，同时有一个副作用的方便就是不再需要记住所使用的是哪个类实例。 顺便发一个小笑话： 如何加一个条件让查询： SELECT * FROM 女人 WHERE will_love_me=true 不返回空记录集呢 [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">    <span style="color: #FF0000;">class</span> Lover
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> Lover _instance<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">readonly</span> <span style="color: #FF0000;">object</span> _locker <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> Lover getInstance<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">null</span> <span style="color: #008000;">==</span> Lover._instance<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">lock</span> <span style="color: #000000;">&#40;</span>Lover._locker<span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">null</span> <span style="color: #008000;">==</span> Lover._instance<span style="color: #000000;">&#41;</span>
                    <span style="color: #000000;">&#123;</span>
                        Lover._instance <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Lover<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                    <span style="color: #000000;">&#125;</span>
                <span style="color: #000000;">&#125;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> Lover._instance<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span></pre></div></div>

<p>单例模式（单件模式、Singleton）是一种为方便管理类的实例的数量的设计模式，属于建造型模式。当然，这个数量一般是1。单例模式可以使得在生存期内，所有使用类实例的场合，都使用相同的类实例，从而保证在某些应用场景下，所操作的数据是你需要操作的那一份，同时有一个副作用的方便就是不再需要记住所使用的是哪个类实例。</p>
<hr />顺便发一个小笑话：</p>
<p>如何加一个条件让查询：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> 女人 <span style="color: #993333; font-weight: bold;">WHERE</span> will_love_me<span style="color: #66cc66;">=</span>true</pre></div></div>

<p>不返回空记录集呢</p>
<p>答案是&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> 女人 <span style="color: #993333; font-weight: bold;">WHERE</span> will_love_me<span style="color: #66cc66;">=</span>true <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span></pre></div></div>

<p>好吧，这很冷。。。</p>
<p>QQREADER0EAE6F8FD43BDC7F</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/it-books-i-need" title="反思之我（们）需要什么样的IT书">反思之我（们）需要什么样的IT书</a></li><li><a href="http://www.hanguofeng.cn/archives/ecommerce/building-findable-websites-note" title="《Web标准和SEO应用实践》读书笔记">《Web标准和SEO应用实践》读书笔记</a></li><li><a href="http://www.hanguofeng.cn/archives/life/wander-about-graduate" title="慢慢走向毕业">慢慢走向毕业</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/code-life/singleton-lover/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>北京·冬·有雪</title>
		<link>http://www.hanguofeng.cn/archives/life/beijing-winter-snow?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=beijing-winter-snow</link>
		<comments>http://www.hanguofeng.cn/archives/life/beijing-winter-snow#comments</comments>
		<pubDate>Mon, 09 Nov 2009 16:29:11 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=171</guid>
		<description><![CDATA[今年的气候不太正常，11月刚露出半个脸庞，就蒙上了轻纱，天会突然变得阴暗，然后雪就降了下来。 今天晚上，又是这样的，只是，天蒙蒙有些橙色，树都被妆成了圣诞节的样子。 我希望今天是一场梦，我希望，这一年，是一场梦。 然而，不是的。 ade，dota战友，ade，加班总是没蓝的同事，ade，东来顺，ade，很多次被用记号笔画过的白板，ade，glass floor，ade，220，ade，2007。 and,never,forget,those days in dream. 随机内容听小韩聊PHP项目开发(1)&#8211;开题的话北京法源寺游记北海公园游记]]></description>
			<content:encoded><![CDATA[<p>今年的气候不太正常，11月刚露出半个脸庞，就蒙上了轻纱，天会突然变得阴暗，然后雪就降了下来。</p>
<p>今天晚上，又是这样的，只是，天蒙蒙有些橙色，树都被妆成了圣诞节的样子。</p>
<p>我希望今天是一场梦，我希望，这一年，是一场梦。</p>
<p>然而，不是的。</p>
<p>ade，dota战友，ade，加班总是没蓝的同事，ade，东来顺，ade，很多次被用记号笔画过的白板，ade，glass floor，ade，220，ade，2007。</p>
<p>and,never,forget,those days in dream.</p>
<p><img class="alignnone" title="never-forget-jiyiri" src="http://www.hanguofeng.cn/wp-content/uploads/2009/11/never-forget-jiyiri.png" alt="" width="600"/></p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide" title="[译文]Google AJAX Language API开发者参考">[译文]Google AJAX Language API开发者参考</a></li><li><a href="http://www.hanguofeng.cn/archives/security/preventing-csrf" title="[译文]防止CSRF攻击">[译文]防止CSRF攻击</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-1" title="听小韩聊PHP项目开发(1)&#8211;开题的话">听小韩聊PHP项目开发(1)&#8211;开题的话</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/beijing-winter-snow/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>parseInt bug in firefox 3.5.2</title>
		<link>http://www.hanguofeng.cn/archives/web-client/parseint-bug-in-firefox-3-5-2?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=parseint-bug-in-firefox-3-5-2</link>
		<comments>http://www.hanguofeng.cn/archives/web-client/parseint-bug-in-firefox-3-5-2#comments</comments>
		<pubDate>Sun, 06 Sep 2009 02:25:37 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web客户端技术]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=160</guid>
		<description><![CDATA[来，先让我们看下面的JS代码： for&#40;var i=0;i &#38;lt; 1000;i++&#41; &#123; var result = parseInt&#40;-15.02&#41;; document.write&#40; result &#41;; document.write&#40; '' &#41;; &#125; 你觉得他会输出什么？一串的-15？恩，也许在其他浏览器中是这样的，但是据我的测试，在Firefox 3.5.2里面，只有开始的几个是-15，其他都是-16，而且-15的个数不一定，有时是3个，有时又会出现4个。 那么，怎么解决呢，将其改为： parseInt&#40;-15.02,10&#41;; 即可 English version for foreign friends: Ok,let&#8217;s get to the codes below: for&#40;var i=0;i &#38;lt; 1000;i++&#41; &#123; var result = parseInt&#40;-15.02&#41;; document.write&#40; result &#41;; document.write&#40; '' &#41;; &#125; What do you think it will [...]]]></description>
			<content:encoded><![CDATA[<p><!--doubanclaim514a3bae359e95af--><br />
来，先让我们看下面的JS代码：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #CC0000;">1000</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> parseInt<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">15.02</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span> result <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">''</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>你觉得他会输出什么？一串的-15？恩，也许在其他浏览器中是这样的，但是据我的测试，在Firefox 3.5.2里面，只有开始的几个是-15，其他都是-16，而且-15的个数不一定，有时是3个，有时又会出现4个。</p>
<p>那么，怎么解决呢，将其改为：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">parseInt<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">15.02</span><span style="color: #339933;">,</span><span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>即可<br />
<span id="more-160"></span></p>
<p><strong><br />
English version for foreign friends:</strong></p>
<p>Ok,let&#8217;s get to the codes below:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #CC0000;">1000</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> parseInt<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">15.02</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span> result <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">''</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>What do you think it will output?Rows of -15?It might be in other browsers except Firefox 3.5.2 according to my test.In Firefox 3.5.2,only the begins are -15,others are -16,and the number of -15 is varying at different time,sometime 3 and sometimes maybe 4.</p>
<p>Then,codes following will works:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">parseInt<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">15.02</span><span style="color: #339933;">,</span><span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/beihai-park" title="北海公园游记">北海公园游记</a></li><li><a href="http://www.hanguofeng.cn/archives/uncategorized/blog-hosting-moved" title="博客又搬家了">博客又搬家了</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/wordpress-plugin-api" title="[译文]WordPress插件API手册">[译文]WordPress插件API手册</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-client/parseint-bug-in-firefox-3-5-2/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>听小韩聊PHP项目开发(2)&#8211;观察你的项目</title>
		<link>http://www.hanguofeng.cn/archives/web-server/php-project-development-2?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-project-development-2</link>
		<comments>http://www.hanguofeng.cn/archives/web-server/php-project-development-2#comments</comments>
		<pubDate>Sun, 28 Jun 2009 05:42:06 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web服务器端技术]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[听小韩聊PHP项目开发]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=125</guid>
		<description><![CDATA[Hello，时隔半年，我终于继续了 =.= 1、为什么要观察你的项目&#8211;需求的重要性。 俗话说，磨刀不误砍柴工，当开始一个项目时，我希望你就像在街上看到了美女，你要先好好打量打量，然后再思考，“啊，我怎么去问她的电话呢~” So,same as our projects. 当开始一个项目时，你应当首先审视的是项目的需求，要注意了，除非是你自己为自己闲着没事做的东西，其他的项目，都是为别人做的，怎么理解呢，我的意思是说，你项目的目的就是满足别人的需求。软件实际上是一种商品。所谓商品，就是商品是为交换而生产（或用于交换）的对他人或社会有用的劳动产品[百度百科]。请注意“对他人或社会有用”，这就是在讲，我们所编写的软件是为了满足需求而存在的，如果不能满足需求，哪怕你用了再高的技术，软件做的再漂亮，运行效率再高，都不能被称之为一款合格的软件。 为什么突然要扯这么远呢，是因为，我曾经和很多人一样，在做开发的时候，开始的时候无时不刻的都在想，这个东西有什么技术创新点，什么地方的效率会很低，应该解决，后来我听到了一句话，叫做“过早优化是万恶之源（premature optimization is the root of all evil&#8211;Donald Knuth）”，可能的确有那样一些项目，他们要求很高的效率，或者，该项目的需求者一直在询问你关于效率的问题，但是无论如何，在你什么都没有的时候，你就什么都不能做，就像你并没有一个女儿，你却时刻想着如何去打扮她一样毫无意义。 请记住，我们所编写的软件，它的第一要务是满足需求，当然，运行效率、界面美化可能是需求的一部分（非功能性需求，我们稍后会谈到），但是请将其作为需求考虑，而不是贯穿软件的全部。 关于需求，这里有一幅漫画，来源未知（提示：你可以点击图片放大）： 另外还有此图片的中文版：http://picasaweb.google.com/lh/photo/ZK59I5p5-jfsc7kl213htQ?feat=directlink 2、我要观察到什么&#8211;什么是需求 “需求是产品必须完成的事以及必须具备的品质。需求存在的原因要么是该类型的产品要求一定的功能和品质，要么是客户希望需求成为交付的产品的一部分。” &#8211;《掌握需求过程》ISBN:9787115159830 从上面的漫画中，可以很有趣的发现，由于沟通方式，对目标的理解差异和技术水平的不同，都会让需求在传递中发生变化，这种变化有时可能是致命的，我们人类在沟通时多采用语言，然而语言，尤其是口头语言，极易发生变化。因此，就需要大家对需求有一个统一的认识，什么是需求，需求应该包括哪些内容，不应该包括哪些内容，应该如何去分析需求。 本节引言中的话，严格来讲不是对需求的定义，让我们来看IEEE软件工程标准词汇表(1997年)中“需求”的定义： (1)用户解决问题或达到目标所需的条件或权能(Capability)。 (2)系统或系统部件要满足合同、标准、规范或其它正式规定文档所需具有的条件或权能。 (3)一种反映上面(1)或(2)所描述的条件或权能的文档说明 软件需求包括三个不同的层次—业务需求、用户需求和功能需求—也包括非功能需求。业务需求( business requirement)反映了组织机构或客户对系统、产品高层次的目标要求，它们在项目视图与范围文档中予以说明。用户需求(user requirement) 文档描述了用户使用产品必须要完成的任务，这在使用实例(use case)文档或方案脚本(scenario)说明中予以说明。功能需求(functional requirement)定义了开发人员必须实现的软件功能，使得用户能完成他们的任务，从而满足了业务需求。所谓特性(feature)是指逻辑上相关 的功能需求的集合，给用户提供处理能力并满足业务需求。 简单来说，需求就是说明你软件将要满足的用户需要，需求是你软件的功能列表，这里的功能可能包括看得见的功能和看不见的功能。同时需要注意实际用户（用户是重要的需求分析参与者，难以想象一个只有开发者而没有用户参与的需求分析，所得出的是什么）可能对需求的理解有误，有时他们甚至不了解活无法向你描述出他的需求，也有时，他会“啰啰嗦嗦”的向你讲一堆不是需求的东西。 同时，需求还包括非功能的部分，例如，“单次搜索查询必须在0.1秒内完成”、“用户传输文件的速度不应低于其网络最高可用带宽的50%”，这些内容并非软件的功能性要求，但是实际上是软件的使用者使用软件体验、感受的重要感受点甚至是其是否能完成功能性需求的制约。 3、我没有马王爷的第三只眼&#8211;那么我如何分析需求呢 哦，这很麻烦，是的，好吧，我们退一步，作为开发人员，你可以让你的产品经理去和客户打交道，但是你必须和你的产品经理打交道，同时，你还必须和你的代码打交道。 与产品经理打交道和与代码打交道是两码事，八杆子打不到一块，你不能和产品经理讲if(xxx)  {} ，也不能去问你的代码，这里是让用户操作的，还是你丫自动操作的。 在与产品人员打交道时，你有责任用他们的语言来描述问题，这并不是单纯为了对方能够听懂你说什么，更重要的是，这会大大减少你们在交流沟通中的误解。所以，熟知你所在的行业，熟悉他们的业务，如果你要开发财务系统，请去阅读财会相关书籍，如果你要开发ERP系统，请去和工人师傅、基层管理人员多聊聊，在拓展你领域的同时，也会让你对你的编程思想有新的看法。 在与代码打交道的时候，你需要是一个好的建筑师，你应当构建严谨、运行健壮、可扩展性强的代码，这要求你在充分理解需求的情况下，看到需求的发展方向以及需求中可能发生变动的情况，甚至你需要和产品经理、客户去沟通，提出你的想法，当你问道“我觉得这里这样做的话，系统可能存在不稳定的因素，如果怎么怎么样做，不仅系统稳定了，您的操作也会更方便”，客户恍然大悟，你又减轻了工作量，何乐不为呢。 在理解需求、分析系统时，我建议你首先这样做： 将系统中存在的活动者都列出来，然后依次列出他们的操作功能和反应。 比如，一个简单的文章系统，我们可能这样去描述它 普通用户：注册、登录、找回密码、修改个人信息、查看类别、查看文章、查看某个类别下的文章、输入关键字搜索文章、发表评论、当别人发表对自己评论的回复时收到邮件。 管理员：查看用户信息、CURD（Create-Update-Read-Delete）类别、CURD文章 在上面的需求描述中，涉及了两个活动者，分别是“普通用户”和“管理员”，同时两个活动者都有若干功能，其中“普通用户”的“当别人发表对自己评论的回复时收到邮件”实际上不是用户的主动操作，而是用户对某个操作的反应，需要注意的是，这样的信息也需要在需求分析中体现。 需求分析可以体现为UML用例图，其好处是更直观，同时由于是统一化的表达，更有助于沟通，其他程序员可以更方便的理解你的意思，而不容易出现理解误差。 关于UML用例图方面的内容，可以到http://hi.baidu.com/jyangstu/blog/item/5d2f89131ef270c6c3fd7833.html查看一份简介。 我的需求方法实际上是用例图的一个超级简版，这个方法不能体现活动者与活动者、用例与用例（就是活动者所做的那些事情）之间的关系，一般适用于小型项目或大中型项目的模块级需求分析，对大中型项目的整体需求分析，实际上是一个非常复杂、有机结合的多个过程的系统，以后有机会我们再探讨。 [...]]]></description>
			<content:encoded><![CDATA[<p>Hello，时隔半年，我终于继续了 =.=</p>
<h2>1、为什么要观察你的项目&#8211;需求的重要性。</h2>
<p>俗话说，磨刀不误砍柴工，当开始一个项目时，我希望你就像在街上看到了美女，你要先好好打量打量，然后再思考，“啊，我怎么去问她的电话呢~”</p>
<p>So,same as our projects.</p>
<p>当开始一个项目时，你应当首先审视的是项目的需求，要注意了，除非是你自己为自己闲着没事做的东西，其他的项目，都是为别人做的，怎么理解呢，我的意思是说，你项目的目的就是满足别人的需求。软件实际上是一种商品。所谓商品，就是商品是为交换而生产（或用于交换）的对他人或社会有用的劳动产品[<a href="http://baike.baidu.com/view/68843.htm" target="_blank">百度百科</a>]。请注意“对他人或社会有用”，这就是在讲，我们所编写的软件是为了满足需求而存在的，如果不能满足需求，哪怕你用了再高的技术，软件做的再漂亮，运行效率再高，都不能被称之为一款合格的软件。</p>
<p>为什么突然要扯这么远呢，是因为，我曾经和很多人一样，在做开发的时候，开始的时候无时不刻的都在想，这个东西有什么技术创新点，什么地方的效率会很低，应该解决，后来我听到了一句话，叫做“过早优化是万恶之源（premature optimization is the root of all evil&#8211;<a href="http://en.wikipedia.org/wiki/Donald_Knuth" target="_blank">Donald Knuth</a>）”，可能的确有那样一些项目，他们要求很高的效率，或者，该项目的需求者一直在询问你关于效率的问题，但是无论如何，在你什么都没有的时候，你就什么都不能做，就像你并没有一个女儿，你却时刻想着如何去打扮她一样毫无意义。</p>
<p>请记住，我们所编写的软件，它的第一要务是满足需求，当然，运行效率、界面美化可能是需求的一部分（非功能性需求，我们稍后会谈到），但是请将其作为需求考虑，而不是贯穿软件的全部。</p>
<p>关于需求，这里有一幅漫画，来源未知（提示：你可以点击图片放大）：<br />
<a href="http://picasaweb.google.com/lh/photo/TDuCZ-g51Jx6Bry-m9D6vQ?feat=embedwebsite"><img src="http://lh3.ggpht.com/_OkD473b7axo/Si08GNdByVI/AAAAAAAAAic/mqkDFXeLXsg/s400/8bdbce98-4d20-3784-891b-a3d4f0970df3.jpg" alt="" /></a></p>
<p>另外还有此图片的中文版：http://picasaweb.google.com/lh/photo/ZK59I5p5-jfsc7kl213htQ?feat=directlink</p>
<h2>2、我要观察到什么&#8211;什么是需求</h2>
<p><em>“需求是产品必须完成的事以及必须具备的品质。需求存在的原因要么是该类型的产品要求一定的功能和品质，要么是客户希望需求成为交付的产品的一部分。”</em></p>
<p style="text-align: right;"><em>&#8211;《掌握需求过程》ISBN:9787115159830</em></p>
<p style="text-align: left;">从上面的漫画中，可以很有趣的发现，由于沟通方式，对目标的理解差异和技术水平的不同，都会让需求在传递中发生变化，这种变化有时可能是致命的，我们人类在沟通时多采用语言，然而语言，尤其是口头语言，极易发生变化。因此，就需要大家对需求有一个统一的认识，什么是需求，需求应该包括哪些内容，不应该包括哪些内容，应该如何去分析需求。</p>
<p style="text-align: left;">本节引言中的话，严格来讲不是对需求的定义，让我们来看IEEE软件工程标准词汇表(1997年)中“需求”的定义：</p>
<p>(1)用户解决问题或达到目标所需的条件或权能(Capability)。</p>
<p>(2)系统或系统部件要满足合同、标准、规范或其它正式规定文档所需具有的条件或权能。</p>
<p>(3)一种反映上面(1)或(2)所描述的条件或权能的文档说明</p>
<p>软件需求包括三个不同的层次—业务需求、用户需求和功能需求—也包括非功能需求。业务需求( business requirement)反映了组织机构或客户对系统、产品高层次的目标要求，它们在项目视图与范围文档中予以说明。用户需求(user requirement) 文档描述了用户使用产品必须要完成的任务，这在使用实例(use case)文档或方案脚本(scenario)说明中予以说明。功能需求(functional requirement)定义了开发人员必须实现的软件功能，使得用户能完成他们的任务，从而满足了业务需求。所谓特性(feature)是指逻辑上相关 的功能需求的集合，给用户提供处理能力并满足业务需求。</p>
<p>简单来说，需求就是说明你软件将要满足的用户需要，需求是你软件的功能列表，这里的功能可能包括看得见的功能和看不见的功能。同时需要注意实际用户（用户是重要的需求分析参与者，难以想象一个只有开发者而没有用户参与的需求分析，所得出的是什么）可能对需求的理解有误，有时他们甚至不了解活无法向你描述出他的需求，也有时，他会“啰啰嗦嗦”的向你讲一堆不是需求的东西。</p>
<p>同时，需求还包括非功能的部分，例如，“单次搜索查询必须在0.1秒内完成”、“用户传输文件的速度不应低于其网络最高可用带宽的50%”，这些内容并非软件的功能性要求，但是实际上是软件的使用者使用软件体验、感受的重要感受点甚至是其是否能完成功能性需求的制约。</p>
<h2>3、我没有马王爷的第三只眼&#8211;那么我如何分析需求呢</h2>
<p>哦，这很麻烦，是的，好吧，我们退一步，作为开发人员，你可以让你的产品经理去和客户打交道，但是你必须和你的产品经理打交道，同时，你还必须和你的代码打交道。</p>
<p>与产品经理打交道和与代码打交道是两码事，八杆子打不到一块，你不能和产品经理讲if(xxx)  {} ，也不能去问你的代码，这里是让用户操作的，还是你丫自动操作的。</p>
<p>在与产品人员打交道时，你有责任用他们的语言来描述问题，这并不是单纯为了对方能够听懂你说什么，更重要的是，这会大大减少你们在交流沟通中的误解。所以，熟知你所在的行业，熟悉他们的业务，如果你要开发财务系统，请去阅读财会相关书籍，如果你要开发ERP系统，请去和工人师傅、基层管理人员多聊聊，在拓展你领域的同时，也会让你对你的编程思想有新的看法。</p>
<p>在与代码打交道的时候，你需要是一个好的建筑师，你应当构建严谨、运行健壮、可扩展性强的代码，这要求你在充分理解需求的情况下，看到需求的发展方向以及需求中可能发生变动的情况，甚至你需要和产品经理、客户去沟通，提出你的想法，当你问道“我觉得这里这样做的话，系统可能存在不稳定的因素，如果怎么怎么样做，不仅系统稳定了，您的操作也会更方便”，客户恍然大悟，你又减轻了工作量，何乐不为呢。</p>
<p>在理解需求、分析系统时，我建议你首先这样做：</p>
<p><strong>将系统中存在的活动者都列出来，然后依次列出他们的操作功能和反应。</strong></p>
<p>比如，一个简单的文章系统，我们可能这样去描述它</p>
<div style="background:#EEE">普通用户：注册、登录、找回密码、修改个人信息、查看类别、查看文章、查看某个类别下的文章、输入关键字搜索文章、发表评论、当别人发表对自己评论的回复时收到邮件。<br />
管理员：查看用户信息、CURD（Create-Update-Read-Delete）类别、CURD文章</div>
<p>在上面的需求描述中，涉及了两个活动者，分别是“普通用户”和“管理员”，同时两个活动者都有若干功能，其中“普通用户”的“当别人发表对自己评论的回复时收到邮件”实际上不是用户的主动操作，而是用户对某个操作的反应，需要注意的是，这样的信息也需要在需求分析中体现。</p>
<p>需求分析可以体现为UML用例图，其好处是更直观，同时由于是统一化的表达，更有助于沟通，其他程序员可以更方便的理解你的意思，而不容易出现理解误差。</p>
<p>关于UML用例图方面的内容，可以到http://hi.baidu.com/jyangstu/blog/item/5d2f89131ef270c6c3fd7833.html查看一份简介。</p>
<p>我的需求方法实际上是用例图的一个超级简版，这个方法不能体现活动者与活动者、用例与用例（就是活动者所做的那些事情）之间的关系，一般适用于小型项目或大中型项目的模块级需求分析，对大中型项目的整体需求分析，实际上是一个非常复杂、有机结合的多个过程的系统，以后有机会我们再探讨。</p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-3" title="听小韩聊PHP项目开发(3)–切分你的系统">听小韩聊PHP项目开发(3)–切分你的系统</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-1" title="听小韩聊PHP项目开发(1)&#8211;开题的话">听小韩聊PHP项目开发(1)&#8211;开题的话</a></li><li><a href="http://www.hanguofeng.cn/archives/security/configure-fast-in-lamp-on-windows-with-xampp" title="Windows下AMP平台配置FastCGI方法（以xampp为基础）">Windows下AMP平台配置FastCGI方法（以xampp为基础）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-server/php-project-development-2/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<series:name><![CDATA[听小韩聊PHP项目开发]]></series:name>
	</item>
		<item>
		<title>北海公园游记</title>
		<link>http://www.hanguofeng.cn/archives/life/beihai-park?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=beihai-park</link>
		<comments>http://www.hanguofeng.cn/archives/life/beihai-park#comments</comments>
		<pubDate>Mon, 02 Mar 2009 17:48:25 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[北京]]></category>
		<category><![CDATA[北海公园]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=116</guid>
		<description><![CDATA[周六晚上决定出去逛一下，毕竟的确有一段时间没有出去玩了，自己的、或者公司、学校的事总是一件接着一件，it&#8217;s OK。 周日起来，洗了衣服，再慢慢等它们变干的时候，已经是下午两点多了，匆忙查了路线，又步行一段距离，到了北土城坐奥运2，没有想到会在鼓楼附近堵了将近20分钟。到达北海公园的时候，已经是三点多了 -。-逛公园的貌似很少有这个时间的吧。 想去北海公园，主要是因为从小的时候就一直在听“海面倒映着美丽的白塔，四面环绕着绿树红墙”，可是来北京这么久，还一直没有去亲眼目睹下这美丽的白塔。 到了公园，买票进了大门，豁然开朗的是一片蓝蓝的。。。湖。很多人站在湖边，举起手机、相机狂派，于是我慢慢从很囧的“修水管”的工具包里面掏出相机，挂在脖子上，然后慢慢靠上河边的围栏，开拍。 蓝的逼人眼的湖面上，波光荡漾，倒映着一座白塔，水中的白塔和天上的白塔相映成趣，仿佛一个可以对折的世界。 然后随着人群，漫步过桥。 过桥后，俨然是另一番景象，一座亭子中，一些老人在欢乐的歌唱着，他们自己吹拉弹唱，吸引了很多游客，看着一曲结束后，他们脸上会心的笑容，我感受到，这才是平和的和谐社会。 一曲终了，依依不舍的再往前漫步，就到了永安寺，永安寺是一座黄庙。穿过永安寺的后门，便来到了一列台阶前。 拾阶而上，到了白塔，近看白塔，威仪壮观。 被白塔震撼后，慢慢下山，便来到了太液池旁，事实上，才看到了真正的北海全貌，夕阳下的白海，显得格外静逸，一抹夕阳洒在水面上，波光粼粼的阳光的碎片让人沉迷。 夕阳的水面上，归巢的水鸟自在游弋，如果看到这一幕，我想你的心境会不自主的平静下来，在这片喧嚣的都市，竟然有如此宁静的一片桃源。 想想最近的生活，很多忙碌，却有很多的进步，然而却总是缺少坐下来静静思考的时间，人，是需要经常思考的，不是吗。我的朋友们，不要为你们现在的忙碌而抱怨，不要为你们现在的迷惘而失落，生活本如此，既然未来是光明的，那么我们为什么还要低头沉浸在自己的影子中呢。 相关内容北京的冬天，有点冷慢慢走向毕业北京法源寺游记]]></description>
			<content:encoded><![CDATA[<p>周六晚上决定出去逛一下，毕竟的确有一段时间没有出去玩了，自己的、或者公司、学校的事总是一件接着一件，it&#8217;s OK。</p>
<p>周日起来，洗了衣服，再慢慢等它们变干的时候，已经是下午两点多了，匆忙查了路线，又步行一段距离，到了北土城坐奥运2，没有想到会在鼓楼附近堵了将近20分钟。到达北海公园的时候，已经是三点多了 -。-逛公园的貌似很少有这个时间的吧。</p>
<p><span id="more-116"></span>想去北海公园，主要是因为从小的时候就一直在听“<span>海面倒映着美丽的白塔，四面环绕着绿树红墙</span>”，可是来北京这么久，还一直没有去亲眼目睹下这美丽的白塔。</p>
<p>到了公园，买票进了大门，豁然开朗的是一片蓝蓝的。。。湖。很多人站在湖边，举起手机、相机狂派，于是我慢慢从很囧的“修水管”的工具包里面掏出相机，挂在脖子上，然后慢慢靠上河边的围栏，开拍。</p>
<p><a href="http://pic.yupoo.com/hanguofeng/3288570df4f0/medium.jpg" target="_blank"><img class="alignnone" src="http://pic.yupoo.com/hanguofeng/3288570df4f0/medium.jpg" alt="北海公园-白塔" width="400" height="300" /></a></p>
<p>蓝的逼人眼的湖面上，波光荡漾，倒映着一座白塔，水中的白塔和天上的白塔相映成趣，仿佛一个可以对折的世界。</p>
<p>然后随着人群，漫步过桥。</p>
<p>过桥后，俨然是另一番景象，一座亭子中，一些老人在欢乐的歌唱着，他们自己吹拉弹唱，吸引了很多游客，看着一曲结束后，他们脸上会心的笑容，我感受到，这才是平和的和谐社会。</p>
<p><a href="http://pic.yupoo.com/hanguofeng/8762570dfd7b/medium.jpg" target="_blank"><img class="alignnone" src="http://pic.yupoo.com/hanguofeng/8762570dfd7b/medium.jpg" alt="北海公园" width="400" height="300" /></a></p>
<p>一曲终了，依依不舍的再往前漫步，就到了永安寺，永安寺是一座黄庙。穿过永安寺的后门，便来到了一列台阶前。</p>
<p><img class="alignnone" src="http://pic.yupoo.com/hanguofeng/3620070df2cc/medium.jpg" alt="" width="300" height="400" /></p>
<p>拾阶而上，到了白塔，近看白塔，威仪壮观。</p>
<p><a href="http://pic.yupoo.com/hanguofeng/0616770df38c/medium.jpg" target="_blank"><img class="alignnone" src="http://pic.yupoo.com/hanguofeng/0616770df38c/medium.jpg" alt="" width="300" height="400" /></a></p>
<p>被白塔震撼后，慢慢下山，便来到了太液池旁，事实上，才看到了真正的北海全貌，夕阳下的白海，显得格外静逸，一抹夕阳洒在水面上，波光粼粼的阳光的碎片让人沉迷。</p>
<p><a href="http://pic.yupoo.com/hanguofeng/0189370dff00/medium.jpg" target="_blank"><img class="alignnone" src="http://pic.yupoo.com/hanguofeng/0189370dff00/medium.jpg" alt="北海" width="400" height="300" /></a></p>
<p>夕阳的水面上，归巢的水鸟自在游弋，如果看到这一幕，我想你的心境会不自主的平静下来，在这片喧嚣的都市，竟然有如此宁静的一片桃源。</p>
<p><img class="alignnone" src="http://pic.yupoo.com/hanguofeng/4678670dffd3/medium.jpg" alt="" width="400" height="300" /></p>
<p>想想最近的生活，很多忙碌，却有很多的进步，然而却总是缺少坐下来静静思考的时间，人，是需要经常思考的，不是吗。我的朋友们，不要为你们现在的忙碌而抱怨，不要为你们现在的迷惘而失落，生活本如此，既然未来是光明的，那么我们为什么还要低头沉浸在自己的影子中呢。</p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/cold-winter-in-beijing" title="北京的冬天，有点冷">北京的冬天，有点冷</a></li><li><a href="http://www.hanguofeng.cn/archives/life/wander-about-graduate" title="慢慢走向毕业">慢慢走向毕业</a></li><li><a href="http://www.hanguofeng.cn/archives/life/travelling-fayua-temple" title="北京法源寺游记">北京法源寺游记</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/beihai-park/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>反思之我（们）需要什么样的IT书</title>
		<link>http://www.hanguofeng.cn/archives/life/it-books-i-need?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=it-books-i-need</link>
		<comments>http://www.hanguofeng.cn/archives/life/it-books-i-need#comments</comments>
		<pubDate>Sun, 22 Feb 2009 15:02:09 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[书]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=113</guid>
		<description><![CDATA[他们没有关注的需求 发现现在除了JSP和.Net之外，例如php、ruby之类的，还有js，甚至css、html，都没有人讲过在企业化开发的时候，这些东西应该遵循什么样的模式，达到高可用性和对需求变动的敏捷性 。 PHP、ruby、JS可能还好一些，但是CSS和HTML这些的可重用性，和对需求变动的敏捷性，讲的太少啊了，单纯说可用性、语义性，都是针对单个来讲的，而没有谈到比如说淘宝、搜狐这样的大型网站，他的CSS和页面如何重用，这应该是一个不小的话题。 按照柱子哥的思路做东西，就发现我以前从来没有这么做过事情，也没有网上的教程或者书籍告诉过我，基本上都是在讲，一个人的时候怎么开发，也没有过多考虑需求变动导致的影响。 我相信随着当前互联网形式的进一步推动，人们会逐渐重视这些方面，同时这样一些东西可以把原来二把刀的程序员，培养成可以胜任企业开发的人员，给大型网站或者大型公司做开发，也解决了很多实际的问题 如何让读者理解 单纯告诉你去如何做，和没有告诉是一样的，因为每个人都希望固守自己之前的方式，除非你明确指出了它的缺点，并让他实际感受到他固有方式的不便和新方法给他带来的实惠。这恐怕真的得用例子来带来共鸣。 随机内容夏·恐惧·变化·解耦始于九月[译文]Google AJAX Language API开发者参考]]></description>
			<content:encoded><![CDATA[<p><strong>他们没有关注的需求</strong></p>
<p>发现现在除了JSP和.Net之外，例如php、ruby之类的，还有js，甚至css、html，都没有人讲过在企业化开发的时候，这些东西应该遵循什么样的模式，达到高可用性和对需求变动的敏捷性 。</p>
<p>PHP、ruby、JS可能还好一些，但是CSS和HTML这些的可重用性，和对需求变动的敏捷性，讲的太少啊了，单纯说可用性、语义性，都是针对单个来讲的，而没有谈到比如说淘宝、搜狐这样的大型网站，他的CSS和页面如何重用，这应该是一个不小的话题。</p>
<p>按照柱子哥的思路做东西，就发现我以前从来没有这么做过事情，也没有网上的教程或者书籍告诉过我，基本上都是在讲，一个人的时候怎么开发，也没有过多考虑需求变动导致的影响。<br />
我相信随着当前互联网形式的进一步推动，人们会逐渐重视这些方面，同时这样一些东西可以把原来二把刀的程序员，培养成可以胜任企业开发的人员，给大型网站或者大型公司做开发，也解决了很多实际的问题 </p>
<p><strong>如何让读者理解</strong></p>
<p>单纯告诉你去如何做，和没有告诉是一样的，因为每个人都希望固守自己之前的方式，除非你明确指出了它的缺点，并让他实际感受到他固有方式的不便和新方法给他带来的实惠。这恐怕真的得用例子来带来共鸣。</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/security/preventing-csrf" title="[译文]防止CSRF攻击">[译文]防止CSRF攻击</a></li><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide" title="[译文]Google AJAX Language API开发者参考">[译文]Google AJAX Language API开发者参考</a></li><li><a href="http://www.hanguofeng.cn/archives/life/autumn-plus-plus-plus-plus" title="立秋++++">立秋++++</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/it-books-i-need/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Windows下AMP平台配置FastCGI方法（以xampp为基础）</title>
		<link>http://www.hanguofeng.cn/archives/security/configure-fast-in-lamp-on-windows-with-xampp?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=configure-fast-in-lamp-on-windows-with-xampp</link>
		<comments>http://www.hanguofeng.cn/archives/security/configure-fast-in-lamp-on-windows-with-xampp#comments</comments>
		<pubDate>Fri, 13 Feb 2009 09:12:45 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web服务器端技术]]></category>
		<category><![CDATA[电子商务]]></category>
		<category><![CDATA[网络安全]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=95</guid>
		<description><![CDATA[一、配置Apache部分。 配置httpd.conf文件 在根配置节加入： LoadModule fcgid_module modules/mod_fcgid.so DefaultInitEnv PHPRC "D:/xampp/php/" DefaultInitEnv PATH "D:/xampp/php;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;" DefaultInitEnv SystemRoot "C:/Windows" DefaultInitEnv SystemDrive "C:" DefaultInitEnv TEMP "C:/WINDOWS/TEMP" DefaultInitEnv TMP "C:/WINDOWS/TEMP" DefaultInitEnv windir "C:/WINDOWS" AddHandler fcgid-script .php 其中“D:/xampp/php”为你的PHP所在目录。 在网站配置节中加入 FCGIWrapper "D:/xampp/php/php-cgi.exe" .php 二、配置PHP部分。 复制xampp/apache/bin/php.ini到xampp/php目录替换 三、配置应用程序部分。 以ThinkPHP框架为例 原.htaccess文件的： RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 改为 RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L] 四、常见错误处理 连接MYSQL时出现Can’t create TCP/IP socket (10106) [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-95"></span></p>
<h2>一、配置Apache部分。</h2>
<p>配置httpd.conf文件<br />
在根配置节加入：<br />
<code><br />
LoadModule fcgid_module modules/mod_fcgid.so<br />
DefaultInitEnv PHPRC "D:/xampp/php/"<br />
DefaultInitEnv PATH "D:/xampp/php;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"<br />
DefaultInitEnv SystemRoot "C:/Windows"<br />
DefaultInitEnv SystemDrive "C:"<br />
DefaultInitEnv TEMP "C:/WINDOWS/TEMP"<br />
DefaultInitEnv TMP "C:/WINDOWS/TEMP"<br />
DefaultInitEnv windir "C:/WINDOWS"<br />
AddHandler fcgid-script .php<br />
</code><br />
其中“<strong>D:/xampp/php</strong>”为你的PHP所在目录。</p>
<p>在网站配置节中加入<br />
<code><br />
FCGIWrapper "D:/xampp/php/php-cgi.exe" .php<br />
</code></p>
<h2>二、配置PHP部分。</h2>
<p>复制xampp/apache/bin/php.ini到xampp/php目录替换</p>
<h2>三、配置应用程序部分。</h2>
<p>以ThinkPHP框架为例<br />
原.htaccess文件的：<br />
<code><br />
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]<br />
</code><br />
改为<br />
<code><br />
RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]<br />
</code></p>
<h2>四、常见错误处理</h2>
<h3>连接MYSQL时出现Can’t create TCP/IP socket (10106)</h3>
<p>检查httpd.conf文件中<br />
<code><br />
DefaultInitEnv PHPRC "D:/xampp/php/"<br />
DefaultInitEnv PATH "D:/xampp/php;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"<br />
DefaultInitEnv SystemRoot "C:/Windows"<br />
DefaultInitEnv SystemDrive "C:"<br />
DefaultInitEnv TEMP "C:/WINDOWS/TEMP"<br />
DefaultInitEnv TMP "C:/WINDOWS/TEMP"<br />
DefaultInitEnv windir "C:/WINDOWS"<br />
</code><br />
保证里面的目录信息都是正确的就可以</p>
<h3>.htaccess 中Rewrite规则有问题</h3>
<p>Fastcgi模式下，不支持rewrite的目标网址的PATH_INFO的解析，例如<br />
<code><br />
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]<br />
</code><br />
转向的目标地址是index.php/Module/Action，则fastcgi会当作实际的目录查找而并非解析index.php文件，所以要根据程序支持将其修改为类似<br />
<code>RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]</code></p>
<hr />以下内容在2009-2-14 补充</p>
<hr />如果发现PhpMyAdmin访问不了，可以打开xampp/apache/conf/extra/httpd-xampp.conf文件，在<br />
<code><br />
&lt;Directory "D:/xampp/phpMyAdmin"&gt;<br />
</code><br />
一节中加入<br />
<code><br />
&lt;FilesMatch .php$&gt;<br />
SetHandler application/x-httpd-php<br />
&lt;/FilesMatch&gt;<br />
</code></p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-3" title="听小韩聊PHP项目开发(3)–切分你的系统">听小韩聊PHP项目开发(3)–切分你的系统</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-2" title="听小韩聊PHP项目开发(2)&#8211;观察你的项目">听小韩聊PHP项目开发(2)&#8211;观察你的项目</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-1" title="听小韩聊PHP项目开发(1)&#8211;开题的话">听小韩聊PHP项目开发(1)&#8211;开题的话</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/security/configure-fast-in-lamp-on-windows-with-xampp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>祝大家己丑年新春大吉，万事如意</title>
		<link>http://www.hanguofeng.cn/archives/uncategorized/2009-spring-festival?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=2009-spring-festival</link>
		<comments>http://www.hanguofeng.cn/archives/uncategorized/2009-spring-festival#comments</comments>
		<pubDate>Sun, 25 Jan 2009 12:22:10 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[闲言碎语]]></category>
		<category><![CDATA[春节]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=91</guid>
		<description><![CDATA[祝所有的亲朋好友在2009己丑年新春大吉，万事如意。 相关内容祝大家戊子年新春大吉，万事如意]]></description>
			<content:encoded><![CDATA[<p>祝所有的亲朋好友在2009己丑年新春大吉，万事如意。</p>
<p><a href="http://picasaweb.google.com/lh/photo/k4ODjR7g--y5wFy5oFEa_Q?authkey=LNLOWahSk4o&amp;feat=embedwebsite"><img src="http://lh6.ggpht.com/_OkD473b7axo/SXxQwcJwX3I/AAAAAAAAAes/pAyO_yT3jnE/s400/DSCF2299.JPG" alt="" /></a></p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/uncategorized/2008-spring-festival" title="祝大家戊子年新春大吉，万事如意">祝大家戊子年新春大吉，万事如意</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/uncategorized/2009-spring-festival/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>听小韩聊PHP项目开发(1)&#8211;开题的话</title>
		<link>http://www.hanguofeng.cn/archives/web-server/php-project-development-1?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-project-development-1</link>
		<comments>http://www.hanguofeng.cn/archives/web-server/php-project-development-1#comments</comments>
		<pubDate>Sun, 28 Dec 2008 13:30:12 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web服务器端技术]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[听小韩聊PHP项目开发]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=88</guid>
		<description><![CDATA[PHP是一个轻盈的、快捷的和强大的网站程序解决方案，它良好的完成了分析请求并对服务器资源进行调用的工作。 PHP是目前网上最流行的Web开发语言之一，据TIBOE的世界编程语言统计来看，从2001年到2008年，PHP的排行最低为10名，人数比例为1.37%，最高为第4名，比例为11.45%，你可以点击这里链接来查看此信息。 同时，PHP也在快速的发展中，从最早期的处理表单的CGI程序，逐渐增加特性，它已经成长为一个完善的面向对象的编程语言，同时内置和扩展库提供了大量的使用函数集，你可以使用这些函数集完成大量的常见工作。PHP有基本完善的面向对象语法，你可以使用大部分面向对象的概念，来实现各种设计模式和代码组织，以帮助你完成大型项目。 基于这样一些原因，在一段时间之前，我开始尝试使用PHP进行Web开发，然而最早开发的不是常见的网站，而是B/S的应用程序，继而又开发了一些网站，在这个过程中，我尝试了各种框架，也学着去评估效率，可维护性和可扩展性等多个因素，并予以实现在各个项目中。 我在进行PHP项目的开发中，逐渐总结了一些心得，包括PHP语言本身，但更多的是在项目中来看待PHP的开发，项目开发是一个很有趣的事情，在此，我们不仅要考虑功能的实现，还要考虑更多的诸如可扩展性、健壮性、与团队的合作等事情，这些经验会逐步和你们探讨和交流，这个专题正是基于此而撰写的。 这个专题，我的计划是总体由浅入深，而在具体的文章排序上不拘泥于顺序，而更像我的笔记，连载长度和时间也没有约束，所以建议您能够订阅我的RSS来获得最近的更新。 韩国峰 2008-12-28 相关内容听小韩聊PHP项目开发(3)–切分你的系统听小韩聊PHP项目开发(2)&#8211;观察你的项目Windows下AMP平台配置FastCGI方法（以xampp为基础）]]></description>
			<content:encoded><![CDATA[<p>PHP是一个轻盈的、快捷的和强大的网站程序解决方案，它良好的完成了分析请求并对服务器资源进行调用的工作。</p>
<p>PHP是目前网上最流行的Web开发语言之一，据TIBOE的世界编程语言统计来看，从2001年到2008年，PHP的排行最低为10名，人数比例为1.37%，最高为第4名，比例为11.45%，你可以<a href="http://www.tiobe.com/index.php/paperinfo/tpci/PHP.html" target="_blank">点击这里</a>链接来查看此信息。</p>
<p>同时，PHP也在快速的发展中，从最早期的处理表单的CGI程序，逐渐增加特性，它已经成长为一个完善的面向对象的编程语言，同时内置和扩展库提供了大量的使用函数集，你可以使用这些函数集完成大量的常见工作。PHP有基本完善的面向对象语法，你可以使用大部分面向对象的概念，来实现各种设计模式和代码组织，以帮助你完成大型项目。</p>
<p>基于这样一些原因，在一段时间之前，我开始尝试使用PHP进行Web开发，然而最早开发的不是常见的网站，而是B/S的应用程序，继而又开发了一些网站，在这个过程中，我尝试了各种框架，也学着去评估效率，可维护性和可扩展性等多个因素，并予以实现在各个项目中。</p>
<p>我在进行PHP项目的开发中，逐渐总结了一些心得，包括PHP语言本身，但更多的是在项目中来看待PHP的开发，项目开发是一个很有趣的事情，在此，我们不仅要考虑功能的实现，还要考虑更多的诸如可扩展性、健壮性、与团队的合作等事情，这些经验会逐步和你们探讨和交流，这个专题正是基于此而撰写的。</p>
<p>这个专题，我的计划是总体由浅入深，而在具体的文章排序上不拘泥于顺序，而更像我的笔记，连载长度和时间也没有约束，所以建议您能够订阅我的RSS来获得最近的更新。</p>
<p style="text-align: right;">韩国峰<br />
2008-12-28</p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-3" title="听小韩聊PHP项目开发(3)–切分你的系统">听小韩聊PHP项目开发(3)–切分你的系统</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-2" title="听小韩聊PHP项目开发(2)&#8211;观察你的项目">听小韩聊PHP项目开发(2)&#8211;观察你的项目</a></li><li><a href="http://www.hanguofeng.cn/archives/security/configure-fast-in-lamp-on-windows-with-xampp" title="Windows下AMP平台配置FastCGI方法（以xampp为基础）">Windows下AMP平台配置FastCGI方法（以xampp为基础）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-server/php-project-development-1/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<series:name><![CDATA[听小韩聊PHP项目开发]]></series:name>
	</item>
		<item>
		<title>使用Zend Studio开发基于ThinkPHP的应用程序</title>
		<link>http://www.hanguofeng.cn/archives/web-server/thinkphp-developing-with-zend-studio?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=thinkphp-developing-with-zend-studio</link>
		<comments>http://www.hanguofeng.cn/archives/web-server/thinkphp-developing-with-zend-studio#comments</comments>
		<pubDate>Sun, 16 Nov 2008 13:33:24 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web服务器端技术]]></category>
		<category><![CDATA[ThinkPHP]]></category>
		<category><![CDATA[Zend Studio]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=80</guid>
		<description><![CDATA[ThinkPHP是一款优秀的国产PHP的MVC框架，他吸取了Ruby On Rails的特性，不仅将Model、View、Controller分开，而且实现了ORM、模板标签等高级特性。然而PHP的官方推荐IDE Zend Studio仅对其Zend Framework有比较良好的支持，而在使用ThinkPHP进行开发时，就没有那么好的代码提示等功能了，不过没有关系，我们可以通过配置实现和对Zend Framework类似的支持。 这里以Zend Studio for Eclipse 6（Build ID: 20080907）为例简单谈下我的配置经验。 首先安装Zend Studio for Eclipse，从官方或者国内的下载站下载安装即可，这里我不推荐你使用中文语言包，而是直接使用英文原版，可以确保操作名词记忆的准确性。 然后我们点击【File】-&#62;【New】-&#62;【PHP Project】来创建一个新的工程，如图： 此时弹出“New PHP Project”窗口，在该窗口输入你的项目名称和项目在磁盘上的存放路径，然后根据需要选择是否启用JavaScript支持等选项，点击下一步，则继续设定PHP Include Path窗口，在这里我们需要进行一些设定以便开启对ThinkPHP的支持了，点击【Add External Folder】按钮，即添加外部目录，在弹出的对话框中选择你的ThinkPHP库的存放地址，这里我存放在“E:\svn\ThinkPHP\ThinkPHP”文件夹中，完成此步骤添加后，如图： 而后继续其他设定，并完成项目的建立。 接下来建立你的index.php文件，并访问相应的项目地址，以便ThinkPHP完成项目文件夹的自动生成。 请注意此时还并没有结束，我们接下来要将ThinkPHP的Lib目录也添加到项目的Include Path中，以便Zend Studio可以读取你写的类文件，从而得到类信息让你可以在IDE中开启自动完成。 在Zend Studio的左侧项目树中右键点击项目名，选择【Properties】，打开项目设定窗口，如图。   首先你需要将【Text file encoding】一项设定为UTF-8，因为ThinkPHP的文件都是以UTF-8编码保存的，如果不修改此项，会以默认的GBK编码保存文件，而导致乱码。 接下来切换左侧的选项到【PHP Include Path】，再切换右侧的Tab到【Libraries】，用和添加ThinkPHP目录同样的方法，添加一个External Folder，并将改目录指向你项目的Lib目录，如果你使用了Common/Common.php这个文件，则还需要添加此文件，如图。 这样，我们就完成了对Zend Studio的配置，让我们来看看效果，如下图：   你可以看到，无论是我们自己写的Model类，还是ThinkPHP内置的如dump这样的函数，都被加入了自动完成列表。 随机内容反思之我（们）需要什么样的IT书北京法源寺游记[话题营销]点亮灵感，乐触生活]]></description>
			<content:encoded><![CDATA[<p><a title="ThinkPHP" href="http://www.thinkphp.cn" target="_blank">ThinkPHP</a>是一款优秀的国产PHP的MVC框架，他吸取了Ruby On Rails的特性，不仅将Model、View、Controller分开，而且实现了ORM、模板标签等高级特性。然而PHP的官方推荐IDE Zend Studio仅对其Zend Framework有比较良好的支持，而在使用ThinkPHP进行开发时，就没有那么好的代码提示等功能了，不过没有关系，我们可以通过配置实现和对Zend Framework类似的支持。</p>
<p>这里以Zend Studio for Eclipse 6（Build ID: 20080907）为例简单谈下我的配置经验。</p>
<p><span id="more-81"></span></p>
<p>首先安装Zend Studio for Eclipse，从官方或者国内的下载站下载安装即可，这里我不推荐你使用中文语言包，而是直接使用英文原版，可以确保操作名词记忆的准确性。</p>
<p>然后我们点击【File】-&gt;【New】-&gt;【PHP Project】来创建一个新的工程，如图：<br />
<a href="http://picasaweb.google.com/lh/photo/pvKF3WGEgJFmU7gbSaDqYg"><img src="http://lh5.ggpht.com/_OkD473b7axo/SSAYeTmjrfI/AAAAAAAAAaM/4zqwplJi6Bw/s400/thinkphp-zendstudio.png.png" alt="使用Zend Studio开发基于ThinkPHP的应用程序" /></a></p>
<p>此时弹出“New PHP Project”窗口，在该窗口输入你的项目名称和项目在磁盘上的存放路径，然后根据需要选择是否启用JavaScript支持等选项，点击下一步，则继续设定PHP Include Path窗口，在这里我们需要进行一些设定以便开启对ThinkPHP的支持了，点击【Add External Folder】按钮，即添加外部目录，在弹出的对话框中选择你的ThinkPHP库的存放地址，这里我存放在“E:\svn\ThinkPHP\ThinkPHP”文件夹中，完成此步骤添加后，如图：<br />
<a href="http://picasaweb.google.com/lh/photo/8X6J56CH3l8XjBmTgaaVuQ" target="_blank"><img src="http://lh6.ggpht.com/_OkD473b7axo/SSAbMEntwpI/AAAAAAAAAas/jfqg9HWuSqs/s400/thinkphp-zendstudio-2.png.png" alt="使用Zend Studio开发基于ThinkPHP的应用程序" /></a></p>
<p>而后继续其他设定，并完成项目的建立。</p>
<p>接下来建立你的index.php文件，并访问相应的项目地址，以便ThinkPHP完成项目文件夹的自动生成。</p>
<p>请注意此时还并没有结束，我们接下来要将ThinkPHP的Lib目录也添加到项目的Include Path中，以便Zend Studio可以读取你写的类文件，从而得到类信息让你可以在IDE中开启自动完成。</p>
<p>在Zend Studio的左侧项目树中右键点击项目名，选择【Properties】，打开项目设定窗口，如图。</p>
<p> <a href="http://picasaweb.google.com/lh/photo/RFE9kyFeQard0m0uvJi5ww" target="_blank"><img src="http://lh3.ggpht.com/_OkD473b7axo/SSAdUAguqTI/AAAAAAAAAbM/Ieap0WOQxvk/s400/thinkphp-zendstudio-3.png.png" alt="使用Zend Studio开发基于ThinkPHP的应用程序" /></a></p>
<p>首先你需要将【Text file encoding】一项设定为UTF-8，因为ThinkPHP的文件都是以UTF-8编码保存的，如果不修改此项，会以默认的GBK编码保存文件，而导致乱码。</p>
<p>接下来切换左侧的选项到【PHP Include Path】，再切换右侧的Tab到【Libraries】，用和添加ThinkPHP目录同样的方法，添加一个External Folder，并将改目录指向你项目的Lib目录，如果你使用了Common/Common.php这个文件，则还需要添加此文件，如图。<br />
<a href="http://picasaweb.google.com/lh/photo/qmHlLMlXoMY1XIuRfj7CUQ" target="_blank"><img src="http://lh5.ggpht.com/_OkD473b7axo/SSAdercO9SI/AAAAAAAAAbU/iWm6yG078Jo/s400/thinkphp-zendstudio-4.png.png" alt="使用Zend Studio开发基于ThinkPHP的应用程序" /></a></p>
<p>这样，我们就完成了对Zend Studio的配置，让我们来看看效果，如下图：</p>
<p><a href="http://picasaweb.google.com/lh/photo/3zOqFCLCJ258q2S8iG7H7A" target="_blank"><img src="http://lh5.ggpht.com/_OkD473b7axo/SSAftUM3amI/AAAAAAAAAb0/497Ad357bGA/s400/thinkphp-zendstudio-5.png.png" alt="使用Zend Studio开发基于ThinkPHP的应用程序" /></a></p>
<p><a href="http://picasaweb.google.com/lh/photo/4MezKT9-Lbsj8d_XLL94XQ" target="_blank"><img src="http://lh6.ggpht.com/_OkD473b7axo/SSAgCC29oEI/AAAAAAAAAb8/1L1GZ1KBC_Q/s400/thinkphp-zendstudio-6.png.png" alt="使用Zend Studio开发基于ThinkPHP的应用程序" /></a> </p>
<p>你可以看到，无论是我们自己写的Model类，还是ThinkPHP内置的如dump这样的函数，都被加入了自动完成列表。</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/cold-winter-in-beijing" title="北京的冬天，有点冷">北京的冬天，有点冷</a></li><li><a href="http://www.hanguofeng.cn/archives/life/wander-about-graduate" title="慢慢走向毕业">慢慢走向毕业</a></li><li><a href="http://www.hanguofeng.cn/archives/uncategorized/hp-touch-smart" title="[话题营销]点亮灵感，乐触生活">[话题营销]点亮灵感，乐触生活</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-server/thinkphp-developing-with-zend-studio/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>北京的冬天，有点冷</title>
		<link>http://www.hanguofeng.cn/archives/life/cold-winter-in-beijing?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cold-winter-in-beijing</link>
		<comments>http://www.hanguofeng.cn/archives/life/cold-winter-in-beijing#comments</comments>
		<pubDate>Tue, 11 Nov 2008 14:36:04 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[互动出版网]]></category>
		<category><![CDATA[北京]]></category>
		<category><![CDATA[职场]]></category>
		<category><![CDATA[记忆日]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=78</guid>
		<description><![CDATA[这是第一次在北京过冬天吧，虽然之前学校在燕郊，离北京不远，但终究因为周围多树多庄稼的原因，气候显得不是那么异常。应该说，北京的冬天，还是可以的，最起码空气质量比石家庄要高不少。然而之前我冬天从来无恙的那张脸，干涩了，随之而来的还有手背，都皴了。之前由于油性皮肤的缘故一直不喜欢抹护肤品，现在看来是不行了。 今年的北京，可能要尤其的冷了，随着全球经济的动荡，互联网行业也不可避免的受到了影响，根源之一可能在于企业广告投放量的减少吧，在这个广告还是大多数网站盈利来源的时代，寒冬也慢慢降临了，谁也逃脱不掉。资金链危急、人员流失、产品/服务的目标客户购买力降低成为大家要面临的重要问题。 从互动这边离职了，四个月的工作经历，一方面自己学会了很多，一方面别人也影响了我很多，认识了良哥、大师、小付、刘峰这样一群牛人，同时自己的产品、运营观点也逐渐深入了，掐指算算做互动学习社区的这几个月，从策划，到选型架构，到编码，再到N次改版。期间经历了周一到周三晚上加班到九点十点，周四晚上通宵的加班两三次，我们这批人应该有幸成为互动年度加班冠军了。然而仅凭我们单薄的力量还是无法完全控制事情发展，无论怎样，橡皮班这个产品是大家的心血，是大家的儿子，如今只剩大师这一个爹了，希望能找到好心的后妈。同时祝福互动网的各位同仁工作顺利。大师的一句送战友，让我感触颇深。晚上和大师小付喝酒，想想个把月前大家通宵，听金属、听相声、趴在桌子上迷糊一会又起来做东西的日子，恋恋不舍。 加盟了记忆日，进（中关）村了，明天过去上班，一个很好的创业机会，在这里将学会更多的创业、团队、运营和推广，心里总有些忐忑，之前的交流还仅限于三位初始兄弟，现在已经大大扩张了，各位未曾谋面的兄弟姐妹，我们在寒冬中拥抱前进吧。 相关内容走路穿过中关村北海公园游记慢慢走向毕业]]></description>
			<content:encoded><![CDATA[<p>这是第一次在北京过冬天吧，虽然之前学校在燕郊，离北京不远，但终究因为周围多树多庄稼的原因，气候显得不是那么异常。应该说，北京的冬天，还是可以的，最起码空气质量比石家庄要高不少。然而之前我冬天从来无恙的那张脸，干涩了，随之而来的还有手背，都皴了。之前由于油性皮肤的缘故一直不喜欢抹护肤品，现在看来是不行了。</p>
<p>今年的北京，可能要尤其的冷了，随着全球经济的动荡，互联网行业也不可避免的受到了影响，根源之一可能在于企业广告投放量的减少吧，在这个广告还是大多数网站盈利来源的时代，寒冬也慢慢降临了，谁也逃脱不掉。资金链危急、人员流失、产品/服务的目标客户购买力降低成为大家要面临的重要问题。<span id="more-80"></span></p>
<p>从互动这边离职了，四个月的工作经历，一方面自己学会了很多，一方面别人也影响了我很多，认识了良哥、大师、小付、刘峰这样一群牛人，同时自己的产品、运营观点也逐渐深入了，掐指算算做互动学习社区的这几个月，从策划，到选型架构，到编码，再到N次改版。期间经历了周一到周三晚上加班到九点十点，周四晚上通宵的加班两三次，我们这批人应该有幸成为互动年度加班冠军了。然而仅凭我们单薄的力量还是无法完全控制事情发展，无论怎样，橡皮班这个产品是大家的心血，是大家的儿子，如今只剩大师这一个爹了，希望能找到好心的后妈。同时祝福互动网的各位同仁工作顺利。大师的一句送战友，让我感触颇深。晚上和大师小付喝酒，想想个把月前大家通宵，听金属、听相声、趴在桌子上迷糊一会又起来做东西的日子，恋恋不舍。</p>
<p><img class="alignnone" title="互动网 20081009" src="http://lh6.ggpht.com/_OkD473b7axo/SRmjICe0vPI/AAAAAAAAAY8/KvqVZrH5_gY/s400/DSCF1020.JPG" alt="" width="400" height="300" /></p>
<p>加盟了记忆日，进（中关）村了，明天过去上班，一个很好的创业机会，在这里将学会更多的创业、团队、运营和推广，心里总有些忐忑，之前的交流还仅限于三位初始兄弟，现在已经大大扩张了，各位未曾谋面的兄弟姐妹，我们在寒冬中拥抱前进吧。</p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/walk-across-zhongguancun" title="走路穿过中关村">走路穿过中关村</a></li><li><a href="http://www.hanguofeng.cn/archives/life/beihai-park" title="北海公园游记">北海公园游记</a></li><li><a href="http://www.hanguofeng.cn/archives/life/wander-about-graduate" title="慢慢走向毕业">慢慢走向毕业</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/cold-winter-in-beijing/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>《Web标准和SEO应用实践》读书笔记</title>
		<link>http://www.hanguofeng.cn/archives/ecommerce/building-findable-websites-note?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=building-findable-websites-note</link>
		<comments>http://www.hanguofeng.cn/archives/ecommerce/building-findable-websites-note#comments</comments>
		<pubDate>Fri, 31 Oct 2008 15:16:31 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[电子商务]]></category>
		<category><![CDATA[Findable]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Web标准]]></category>
		<category><![CDATA[可发现性]]></category>
		<category><![CDATA[读书笔记]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=76</guid>
		<description><![CDATA[我对SEO的研究已经有一段时间了，这大约开始在05年的时候，制作网站并进行推广，获得广告或其他收入，是类似落伍者论坛上面大量个人站长所进行的主要工作。然而SEO并非简单的技巧，同时网上有大量的错误技术文章出现，这类文章一般分为两种，第一种是陈旧过时的内容，在这个时候还教导站长在meta区域堆砌关键字显然是不合适的，任何一个现代搜索引擎都将其权重降得非常低，第二种则大多罗列手段低劣的黑帽技巧，包括制作桥页、关键词堆砌、提供无关关键词等，这不仅欺骗了搜索引擎，更大大的降低了用户体验。同时，我还关注Web标准，即通常所说的DIV+CSS的页面制作风格。通过提高用户体验的方法来实现SEO始终是我进行SEO的核心原则。Web标准对用户体验的提高主要体现在使用Web标准所规定的若干原则可以让用户更快捷、方便的访问到页面的内容，同时，使用特殊客户端（如移动设备、屏幕阅读器）的用户对内容的访问仍然是有效的。Web标准的另外一个好处是它减低了设计师和程序员的负担，我们在现代程序设计中一直在号召使用低耦合的方式，而Web标准中就对这种低耦合进行了体现，通过结构/样式/行为的分离，使得页面构建工程师、艺术设计师和程序设计师的工作可以分离开并且同步进行，减低沟通成本，同时对需求的变动有一个敏捷的接口。总而言之，应用Web标准的手段提高用户体验，并且给搜索引擎爬虫这个更为特殊的客户端同样的优秀体验，是进行SEO的最有效方式。]]></description>
			<content:encoded><![CDATA[<div>在Google Reader中阅读：<a href="http://docs.google.com/Doc?id=ajd3pzcpcjzg_41ds4vw4f3">http://docs.google.com/Doc?id=ajd3pzcpcjzg_41ds4vw4f3</a></div>
<div>在China-Pub购买此书：<a href="http://www.china-pub.com/209231">http://www.china-pub.com/209231</a></div>
<h2>一、本文作者的话</h2>
<div>我对SEO的研究已经有一段时间了，这大约开始在05年的时候，制作网站并进行推广，获得广告或其他收入，是类似落伍者论坛上面大量个人站长所进行的主要工作。然而SEO并非简单的技巧，同时网上有大量的错误技术文章出现，这类文章一般分为两种，第一种是陈旧过时的内容，在这个时候还教导站长在meta区域堆砌关键字显然是不合适的，任何一个现代搜索引擎都将其权重降得非常低，第二种则大多罗列手段低劣的黑帽技巧，包括制作桥页、关键词堆砌、提供无关关键词等，这不仅欺骗了搜索引擎，更大大的降低了用户体验。同时，我还关注Web标准，即通常所说的DIV+CSS的页面制作风格。通过提高用户体验的方法来实现SEO始终是我进行SEO的核心原则。Web标准对用户体验的提高主要体现在使用Web标准所规定的若干原则可以让用户更快捷、方便的访问到页面的内容，同时，使用特殊客户端（如移动设备、屏幕阅读器）的用户对内容的访问仍然是有效的。Web标准的另外一个好处是它减低了设计师和程序员的负担，我们在现代程序设计中一直在号召使用低耦合的方式，而Web标准中就对这种低耦合进行了体现，通过结构/样式/行为的分离，使得页面构建工程师、艺术设计师和程序设计师的工作可以分离开并且同步进行，减低沟通成本，同时对需求的变动有一个敏捷的接口。总而言之，应用Web标准的手段提高用户体验，并且给搜索引擎爬虫这个更为特殊的客户端同样的优秀体验，是进行SEO的最有效方式。随便说下，我极端反感黑帽SEO。</div>
<p><span id="more-76"></span></p>
<h2>二、全书论述结构介绍</h2>
<div>本书的英文名是<a href="http://www.amazon.com/Building-Findable-Websites-Standards-Beyond/dp/0321526287/ref=sr_11_1?ie=UTF8&amp;qid=1223947226&amp;sr=11-1" target="_blank"><span style="color: #012c83; font-family: Arial;">Building Findable Websites: Web Standards SEO and Beyond </span></a>（我译为《超越Web标准进行SEO——构建更容易被发现的站点》），因此Findable（可发现性，即网站对搜索引擎的友好性，包括但不限于内容、导航等）就成为本书首先要论述的内容，<strong>第一章</strong>解释了易发现性的概念以及搜索引擎之内、之外对网站检索的需求。同时还讲述了一个重要观点，即SEO的过程应该贯穿整个网站的生命周期，同时应该让整个开发团队参与。最后，还对搜索技术的道德标准做了阐述。</div>
<div> </div>
<div><strong>第二章和第三章</strong>的核心内容在于从技术制作角度讲解了进行Web标准化SEO的策略，主要包括在页面本身进行的策略（第二章《标记策略》）以及服务器端的调整（第三章《服务器端策略》）。其中，第二章的论述分为三个部分，第一，Web标准知识与易发现性；第二，可发现性元素以及对不可发现性元素的可见性调整；第三，微格式在可发现性中的应用。第三章的论述主要从三个角度讲解SEO的策略，第一，网址角度；第二，内容的定位角度；第三，缓存和传输流压缩。</div>
<div> </div>
<div><strong>第四章</strong>则谈到了非技术角度对SEO的重要影响——内容策略。本章并不涉及太多的SEO本身的内容，而是从更高的角度，即用户体验、用户喜好以及用户收益的角度来告诉你，用户喜欢什么样的内容以及如何创建这些内容。同时也介绍了博客、文章、链接库等不同类型的内容。而后作者谈到了如何在你所创建的内容本身中进行SEO的策略，包括选择和创建关键字。最后，作者谈到内容发展策略，并用一个PHP写的案例介绍了如何读取并展示RSS的内容。</div>
<div> </div>
<div><strong>第五章</strong>针对当前互联网最流行的内容组织形式——博客来进行一个案例教学。本章首先介绍了针对博客的SEO策略，而后手把手教给你如何安装WordPress系统以及对其进行优化的SEO配置。</div>
<div> </div>
<div><strong>第六章</strong>讲解了在站点中集合站点内部内容搜索的方式，作者介绍了免费（Google、Rollyo、Atomz、Yahoo!）和收费（FastFind、Zoom）的站内搜索服务，以及自行构建搜索站内搜索的案例。最后，还介绍了最新的OpenSearch集成。</div>
<div> </div>
<div><strong>第七章</strong>对常见的可发现性障碍进行了介绍，并对这些障碍的改进方式进行了深度讲解，是对第二章中够不可发现性元素的深入讨论。这些不可发现性元素包括JavaScript、Flash、音频和视频等。</div>
<div> </div>
<div><strong>第八章</strong>讲解通过邮件列表进行增加站点流量的方式。介绍了站点邮件列表的概念和作用，而后介绍了如何使用和建立邮件列表系统。</div>
<div> </div>
<div><strong>第九章</strong>讲解进行SEO的实务，通过对SEO过程中进行的工序、手段和工具进行介绍，让你了解如何将易发现性付诸实践。</div>
<div> </div>
<h2>三、全书关键内容点备忘。</h2>
<div>核心提示：本章内容透露了书中的内容，部分内容收集自互联网上的样章，其他内容来自本笔记作者对书内容的总结，内容版权归原作者和译者所有，如果您喜欢本书，建议点击<a id="g.0b" title="这里" href="http://www.china-pub.com/209231">这里</a>购买。</div>
<div> </div>
<div><strong>什么是易发现性</strong></div>
<div>搜索引擎优化，又称SEO，有助于用户找到你所创建的优秀网站。虽然你可以优化代码和内容来增加搜索流量，但还有其他方式可以获得流量。网络上有数以百万计的网页，现在的网站需要用尽可能多的方式，来帮助用户找到内容。易发现性是较宽泛的原则，包括了所有能帮助用户找到他们所需内容的策略。</div>
<div><strong></strong> </div>
<div><strong>搜索引擎喜欢这样的网站</strong></div>
<div>
<ol>
<li>
<div>关键字丰富（不冗余），且对读者有价值的内容</div>
</li>
<li>
<div>对搜索引擎蜘蛛可见，没有阻碍页面索引的障碍</div>
</li>
<li>
<div>内容表达了明确的信息分层，这样蜘蛛就可以知道网页是关于什么的</div>
</li>
<li>
<div>快速加载的内容，这样蜘蛛可以高效索引</div>
</li>
<li>
<div>从著名来源过来的链接，这样他们能够确定网站的信誉</div>
</li>
<li>
<div>诚实的内容，没有试图欺骗搜索引擎</div>
</li>
<li>
<div>更多内容，而不是代码来标记页面</div>
</li>
<li>
<div>干净的、有意义的网址，如果可能的话，带上关键字</div>
</li>
<li>
<div>域名已被浏览过</div>
</li>
</ol>
<div> </div>
</div>
<div><strong>搜索技术中的道德标准</strong></div>
<div>易发现性不应该以损害信任、隐私或用户的舒适感为代价。当你在项目中实施易发现性策略时，要时时提醒自己：&#8221;如果我收到这条信息，那么我会做何感想？&#8221;</div>
<div>请查看本书同名网站上，题为&#8221;避免黑帽SEO技术&#8221;的奖励章节，见<a href="http://buildingfindablewebsites.com/"><span style="color: #0000ff;">http://buildingfindableWebsites.com</span></a>，来进一步讨论这个话题。</div>
<div> </div>
<div><strong>Web标准对SEO的好处</strong></div>
<div> </div>
<ol>
<li>
<div>确保搜索引擎蜘蛛能解析代码，不会发现缺少关闭标签的错误或者语法错误</div>
</li>
<li>
<div>降低标记内容比，以帮助改善搜索排名</div>
</li>
<li>
<div>加快加载速度，这样搜索引擎就能快速索引整个网站</div>
</li>
<li>
<div>增加页面信息层次间的传达，使搜索引擎可以分辨出哪些内容是重要的</div>
</li>
</ol>
<div> </div>
<div><strong>促进易发现性的基本标签</strong></div>
<div>标题标签、strong和em标签、锚标签</div>
<div> </div>
<div><strong>需要改进易访问性的内容</strong></div>
<div>图片、图片映射（Map标签）、图片替换、表格、Flash、JavaScript</div>
<div> </div>
<div><strong>微格式</strong></div>
<div>概念：使用简单、语义化的HTML和CSS类名称来标记共同内容，使机器可以阅读和理解可能只有人类可理解的数据，这样一系列的标准化方法。</div>
<div>hcalendar、hCard、rel-tag、hResume、hReview、VoteLinks、XFN、geo</div>
<div> </div>
<div><strong>URL优化策略</strong></div>
<div>文件和文件夹、域名、URL参数</div>
<div> </div>
<div><strong>内容定位策略</strong></div>
<div>使用301进行导航、建立友好的404页面</div>
<div> </div>
<div><strong>优化索引性能</strong></div>
<div>客户端缓存、Gzip压缩页面、减少HTTP请求</div>
<div> </div>
<div><strong>如何创建吸引流量的内容</strong></div>
<div>保持主题、填补空白、具有激情和权威、值得信赖、吸引用户的兴趣、原创、使用适当的语气、保持更新</div>
<div> </div>
<div><strong>不同类型的内容</strong></div>
<div>博客、文章.案例研究和白皮书、链接库、文档模板.代码示例和其他工具、评论和建议、聚合内容(RSS)、用户创造内容(UGC)</div>
<div><strong></strong> </div>
<div><strong>改善博客易发现性的最佳做法</strong></div>
<div>定期撰写，聚焦话题、经常链接，并链接到其他博客帖子，以产生返回链接、创建自己的博客模板、把关键词放在帖子标题中、按主题归档、总结帖子，以更好地引导流量、添加热门帖子区、添加最近帖子区、告诉用户你是谁，还有你的博客是关于什么的、推广RSS、Feed、交叉链接，循环浏览、鼓励用户与他人分享你的内容、将用户引向相关的帖子</div>
<div> </div>
<div><strong>免费站内搜索服务</strong></div>
<div>Google、Rollyo、Atomz、Yahoo!</div>
<div><strong></strong> </div>
<div><strong>收费站内搜索服务</strong></div>
<div>FastFind、Zoom </div>
<div> </div>
<div><strong>常见易发现性障碍和解决</strong></div>
<div>JavaScript（建立无JavaScript支持的页）、Flash（SWFObject的方式引入Flash，并在欲引入的元素加入Flash中的文本内容以及<a id="aqe5" title="SEFFS" href="http://wahlers.com.br/claus/blog/seffs-to-flash-or-not-to-flash/">SEFFS</a>）、音频和视频（<a id="jvjp" title="EveryZing" href="http://www.everyzing.com/">EveryZing</a> 、创建文本字幕、<a id="h7_b" title="CastingWords" href="http://castingwords.com/">CastingWords</a>、<a id="vhhu" title="Transcribr" href="http://enablr.com/transcribr.php">Transcribr</a>）等。</div>
<div>  </div>
<h2>四、总评</h2>
<div>本书对SEO的论述是独到并且深入的。以使用Web标准进行可发现性的优化为手段，作者将对页面内容SEO时常见的问题娓娓道来，并给出了充分、可行的解决方案。同时围绕SEO这一话题，讲解了更多深入的内容，包括微格式、搜索服务、邮件列表等。同时，作者并非一个纸上谈兵的人，在最后他还向你介绍了如何具体的进行SEO的工作，这样的工作流程将给你的团队带来一些有趣的更新。</div>
<div> </div>
<div>在短短不到200页的内容中，我想这是我见到的最为有效，最为中肯和最有职业道德的SEO教程，与国内一些作者或者所谓的SEOer撰写的教程相比，他是从网站使用者和搜索引擎爬虫的浏览体验为出发点，而并非直接以利益为出发点，这样做的事情，往往更有趣。</div>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-1" title="听小韩聊PHP项目开发(1)&#8211;开题的话">听小韩聊PHP项目开发(1)&#8211;开题的话</a></li><li><a href="http://www.hanguofeng.cn/archives/life/remember-2008-china-earthquake" title="逝去就别怀念">逝去就别怀念</a></li><li><a href="http://www.hanguofeng.cn/archives/security/preventing-csrf" title="[译文]防止CSRF攻击">[译文]防止CSRF攻击</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/ecommerce/building-findable-websites-note/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>慢慢走向毕业</title>
		<link>http://www.hanguofeng.cn/archives/life/wander-about-graduate?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=wander-about-graduate</link>
		<comments>http://www.hanguofeng.cn/archives/life/wander-about-graduate#comments</comments>
		<pubDate>Sat, 25 Oct 2008 06:05:32 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[北京]]></category>
		<category><![CDATA[北方学院]]></category>
		<category><![CDATA[毕业]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=73</guid>
		<description><![CDATA[10月25号回学校开题答辩，答辩完了，便可以离校了，下次再见也许就是来年春暖花开的时候，中午在启航大道上看到很多似曾相识的面孔，他们带着行李，行色匆匆，或成双成对，或三五成群。这一别，虽然不是永别，却是天各一方的前奏了。 在学校的人，每天扯扯淡，抽抽烟，有心情的时候睡睡觉、玩玩游戏、打打麻将，没心情的时候写写论文、找找工作，看时间慢慢流逝过去，在外面的人，为了自己的未来和理想对着扑面而来的压力面朝大海春暖花开。 又到了深秋，又到了学校大风落叶的季节，又到了晚上不敢开窗户的时候，又到了夜里听着学校风吹起来啪啦啪啦三年都不知道是什么在响的时候。然而，明年的这个时候，这个宿舍将会是怎样的六张面孔呢。 答辩时候，难得整个专业的人聚在小小的教室，而随着今天不要求考勤的宣布，又呼呼啦啦走了很多，原来我们一致的传统，并没有改变。 答辩完，中午出去吃饭，在步行街那个多次经过却从来没有进去的餐馆，出来后，大风中漫步在步行街上。回到宿舍，喧嚣的麻将桌压抑不住解放的喜悦。 晚上独自回北京，特意等来大厂-夏垫-郎家园的930，让自己不要暴露在大风中的傍晚，哪知道天不遂人意，在四惠堵了20分钟，到了北京，路上所见的夕阳已经下班回到家了，而工作的人们才刚刚踏上归途。 相关内容北海公园游记北京的冬天，有点冷北京法源寺游记]]></description>
			<content:encoded><![CDATA[<p>10月25号回学校开题答辩，答辩完了，便可以离校了，下次再见也许就是来年春暖花开的时候，中午在启航大道上看到很多似曾相识的面孔，他们带着行李，行色匆匆，或成双成对，或三五成群。这一别，虽然不是永别，却是天各一方的前奏了。</p>
<p><span id="more-73"></span></p>
<p><img src="http://lh4.ggpht.com/hanguofeng/SQKzmoV_BDI/AAAAAAAAAXc/ZK2qiIbRZpg/s400/DSCF0782.jpg" alt="" /></p>
<p>在学校的人，每天扯扯淡，抽抽烟，有心情的时候睡睡觉、玩玩游戏、打打麻将，没心情的时候写写论文、找找工作，看时间慢慢流逝过去，在外面的人，为了自己的未来和理想对着扑面而来的压力面朝大海春暖花开。</p>
<p>又到了深秋，又到了学校大风落叶的季节，又到了晚上不敢开窗户的时候，又到了夜里听着学校风吹起来啪啦啪啦三年都不知道是什么在响的时候。然而，明年的这个时候，这个宿舍将会是怎样的六张面孔呢。</p>
<p><img src="http://lh4.ggpht.com/hanguofeng/SQKz5SD0wbI/AAAAAAAAAX8/GqCGt0coPKs/s400/DSCF0799.jpg" alt="" /></p>
<p>答辩时候，难得整个专业的人聚在小小的教室，而随着今天不要求考勤的宣布，又呼呼啦啦走了很多，原来我们一致的传统，并没有改变。</p>
<p><img src="http://lh6.ggpht.com/hanguofeng/SQKyusWFZ7I/AAAAAAAAAXQ/ExBVMKsyWEU/s400/%E5%B0%8F%E7%8C%AA%E8%AF%BE%E5%A0%82.jpg" alt="" /></p>
<p>答辩完，中午出去吃饭，在步行街那个多次经过却从来没有进去的餐馆，出来后，大风中漫步在步行街上。回到宿舍，喧嚣的麻将桌压抑不住解放的喜悦。</p>
<p>晚上独自回北京，特意等来大厂-夏垫-郎家园的930，让自己不要暴露在大风中的傍晚，哪知道天不遂人意，在四惠堵了20分钟，到了北京，路上所见的夕阳已经下班回到家了，而工作的人们才刚刚踏上归途。</p>
<p><img src="http://lh4.ggpht.com/hanguofeng/SQK0QhbbqwI/AAAAAAAAAYE/gGqGR0hbv0k/s400/DSCF0805.jpg" alt="" /></p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/beihai-park" title="北海公园游记">北海公园游记</a></li><li><a href="http://www.hanguofeng.cn/archives/life/cold-winter-in-beijing" title="北京的冬天，有点冷">北京的冬天，有点冷</a></li><li><a href="http://www.hanguofeng.cn/archives/life/travelling-fayua-temple" title="北京法源寺游记">北京法源寺游记</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/wander-about-graduate/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>博客又搬家了</title>
		<link>http://www.hanguofeng.cn/archives/uncategorized/blog-hosting-moved?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=blog-hosting-moved</link>
		<comments>http://www.hanguofeng.cn/archives/uncategorized/blog-hosting-moved#comments</comments>
		<pubDate>Sat, 25 Oct 2008 05:07:57 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[闲言碎语]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=71</guid>
		<description><![CDATA[博客搬家了！如果您看到这个消息，那么说明您已经进入了新的服务器，是否感觉快些了呢。 从刚开始写博客到现在，算算博客迁移的次数也有将近10次了，期间还涉及到过程序的转换，今年初，索性直接重新开一个WordPress来写博客，旧的博客归档保留在了http://blog.blackwoods.cn，欢迎和我一起怀念过去的故事，过去的生活。 这次的迁移，是因为DreamHost到期了，上次到期后，重新用信用卡使用97美元的优惠码当作new customer买了空间，后来被DreamHost发现，然而还好没有关闭空间，只是警告下次不要这样了。月初收到了DreamHost的催款信，就开始了四处寻觅空间。在上上个月，大师就推荐了一款空间，澳大利亚的AMH Network的美国和澳大利亚空间，访问起来速度的确是不慢，据说是给Youtube做CDN的。在这段时间对很多空间都做了评估，这里也给出一个结果，主流的美国空间是不限空间流量（或者给一个很高的界限，总之一般的站是用不完），不限域名绑定数目，价格在5-10美刀一个月不等，并且大多都有CPS的引导计划，引导一个销售可以拿回几十美刀。独立IP的均价在$2/m，有部分主机开放了SSH。就主机本身的条件来讲，我还是非常喜欢DreamHost的，毕竟用了两年多，很有感情了，而且他的很多操作都非常人性化和方便，同时可以方便的开启SSH而不像其他主机商还需要邮寄身份证明的扫描件。如果你需要购买DreamHost，也可以通过我的优惠码GIVEITTO来获得$97的优惠，我将不会从这里得到任何提成。 再来说这次的AMH Network的空间，这是一家澳大利亚的IDC公司，他们在美国的德克萨斯、佛罗里达以及澳大利亚的昆士兰均有机房，你可以自由选择在这三个地方的主机，当然，价格有略微的区别。他的主机不提供unlimited的空间和流量，而是根据你选择的Plan不同，有不同的价格，可别被他上面的价格吓到了，上面的价格单位是澳元AUD。1澳元大约相当于4人民币（具体看这里）。我在购买时候占了一个很大的便宜，找到了一个discount高达75%的优惠码75ONETIME，仅消费相当于人民币一百多元就购买了10G空间的Reseller计划。主机到期的朋友们不要错过了。（通过点击我的链接购买，我将获得25%支付金额的奖励） 随机内容Singleton.Lover北京法源寺游记DreamWeaver CS4新特性之JavaScript]]></description>
			<content:encoded><![CDATA[<p>博客搬家了！如果您看到这个消息，那么说明您已经进入了新的服务器，是否感觉快些了呢。<span id="more-71"></span></p>
<p>从刚开始写博客到现在，算算博客迁移的次数也有将近10次了，期间还涉及到过程序的转换，今年初，索性直接重新开一个WordPress来写博客，旧的博客归档保留在了<a href="http://blog.blackwoods.cn">http://blog.blackwoods.cn</a>，欢迎和我一起怀念过去的故事，过去的生活。</p>
<p>这次的迁移，是因为DreamHost到期了，上次到期后，重新用信用卡使用97美元的优惠码当作new customer买了空间，后来被DreamHost发现，然而还好没有关闭空间，只是警告下次不要这样了。月初收到了DreamHost的催款信，就开始了四处寻觅空间。在上上个月，大师就推荐了一款空间，澳大利亚的AMH Network的美国和澳大利亚空间，访问起来速度的确是不慢，据说是给Youtube做CDN的。在这段时间对很多空间都做了评估，这里也给出一个结果，主流的美国空间是不限空间流量（或者给一个很高的界限，总之一般的站是用不完），不限域名绑定数目，价格在5-10美刀一个月不等，并且大多都有CPS的引导计划，引导一个销售可以拿回几十美刀。独立IP的均价在$2/m，有部分主机开放了SSH。就主机本身的条件来讲，我还是非常喜欢DreamHost的，毕竟用了两年多，很有感情了，而且他的很多操作都非常人性化和方便，同时可以方便的开启SSH而不像其他主机商还需要邮寄身份证明的扫描件。如果你需要购买DreamHost，也可以通过我的优惠码<strong><a href="http://www.dreamhost.com/r.cgi?266775" target="_blank">GIVEITTO</a></strong>来获得$97的优惠，我将不会从这里得到任何提成。</p>
<p>再来说这次的<a title="AMH Network" href="http://www.amhnetwork.com.au/my/aff.php?aff=012" target="_blank">AMH Network</a>的空间，这是一家澳大利亚的IDC公司，他们在美国的德克萨斯、佛罗里达以及澳大利亚的昆士兰均有机房，你可以自由选择在这三个地方的主机，当然，价格有略微的区别。他的主机不提供unlimited的空间和流量，而是根据你选择的Plan不同，有不同的价格，可别被他上面的价格吓到了，上面的价格单位是澳元AUD。1澳元大约相当于4人民币（具体看<a href="http://www.google.cn/search?client=aff-os-worldbrowser&amp;forid=1&amp;ie=utf-8&amp;oe=UTF-8&amp;hl=zh-CN&amp;q=1%E6%BE%B3%E5%85%83%E7%AD%89%E4%BA%8E%E5%A4%9A%E5%B0%91%E4%BA%BA%E6%B0%91%E5%B8%81" target="_blank">这里</a>）。我在购买时候占了一个很大的便宜，找到了一个discount高达75%的优惠码<a href="http://www.amhnetwork.com.au/my/aff.php?aff=012" target="_blank"><strong>75ONETIME</strong></a>，仅消费相当于人民币一百多元就购买了10G空间的Reseller计划。主机到期的朋友们不要错过了。（通过点击我的链接购买，我将获得25%支付金额的奖励）</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/summer-vacation-in-beijing" title="北京 仲夏夜之梦">北京 仲夏夜之梦</a></li><li><a href="http://www.hanguofeng.cn/archives/ecommerce/building-findable-websites-note" title="《Web标准和SEO应用实践》读书笔记">《Web标准和SEO应用实践》读书笔记</a></li><li><a href="http://www.hanguofeng.cn/archives/security/sql-injection-attack" title="SQL注入攻击-来自微软安全博客的建议">SQL注入攻击-来自微软安全博客的建议</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/uncategorized/blog-hosting-moved/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[话题营销]点亮灵感，乐触生活</title>
		<link>http://www.hanguofeng.cn/archives/uncategorized/hp-touch-smart?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=hp-touch-smart</link>
		<comments>http://www.hanguofeng.cn/archives/uncategorized/hp-touch-smart#comments</comments>
		<pubDate>Wed, 15 Oct 2008 11:37:33 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[闲言碎语]]></category>
		<category><![CDATA[乐触]]></category>
		<category><![CDATA[话题营销]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=68</guid>
		<description><![CDATA[这是一篇付费的 原始时代，人们没有语言这个杀人灭口居家旅行常备的工具，于是行为工具则成为人们交流沟通的主要手段，触摸则是这些手段中的重要形式。当我们刚刚来到这个世界的懵懂时候，母亲温柔的手的触摸带给我们对这个世界的第一印象。 计算机的操作总是随着科技的发展而逐渐变化着，从最早需要打孔带（你可以想象古人在石头上刻字的感觉吗？）再到键盘、鼠标，触摸板。然而通常所见的触摸板无非是在特殊环境下鼠标的替代品罢了。 作为乐触理念的积极倡导者，惠普新近推出的HP Touch SmartPC正是融合了返璞归真的生活理念，将我们从键盘、工作台、线缆的束缚中解脱出来，哪怕仅是手指轻轻扫过超薄触摸屏的动作就可以轻松被识别。 为了让更多人能够有机会体验最具创意的触摸方式来感知美好的新世界。惠普专门为热爱生活的人们开设了“乐触生活社区”http://digi.it.sohu.com/s2008/touchsmart/，你可以在这里尽情晒出你的精彩并与我们的&#8221;乐触&#8220;明星一起展示和分享你用亲手装点的温馨生活，分享拍摄的旅游圣地，品鉴用爱心制作的精巧美味。如果你所分享的作品足够精彩，有机会赢取大奖，参加惠普在北京、上海和广州举办的&#8221;乐触家庭 PARTY&#8221;活动，成为触动时尚的&#8221;乐触&#8220;明星！ 科技的进步应该以不改变人们的生活习惯为前提，每天用鼠标拖来拖去，不知道就在鼠标垫上浪费了多少时间和体力，再者，想想你牙牙学语的孩子，想想你年迈的父母，这样一款触摸屏式电脑在科技上创新的确给我们带来了极大方便。计算机的使命在于减轻人们的工作量，一款和谐的电脑应该是让人们最快最方便的开启所需要的任务。乐触电脑看起来还是非常有艺术感的，挂在墙上，平时当作数码相框，用的时候可以无局限的使用它的无线键盘，充分享受高科技为我们带来的数字生活。 随机内容新玄猫,新博客使用Zend Studio开发基于ThinkPHP的应用程序EMAIL到你的Web程序&#8211;有趣的Email2HTTP]]></description>
			<content:encoded><![CDATA[<p>这是一篇付费的<img title="Feedsky营销话题" src="http://review.feedsky.com/review/feedsky/blackcat/~/img/183/review.gif " alt="" width="113" height="15" /></p>
<p>原始时代，人们没有语言这个杀人灭口居家旅行常备的工具，于是行为工具则成为人们交流沟通的主要手段，触摸则是这些手段中的重要形式。当我们刚刚来到这个世界的懵懂时候，母亲温柔的手的触摸带给我们对这个世界的第一印象。<span id="more-68"></span></p>
<p>计算机的操作总是随着科技的发展而逐渐变化着，从最早需要打孔带（你可以想象古人在石头上刻字的感觉吗？）再到键盘、鼠标，触摸板。然而通常所见的触摸板无非是在特殊环境下鼠标的替代品罢了。</p>
<p>作为<a href="http://review.feedsky.com/review/feedsky/blackcat/~/txt/183/r.html ">乐触</a>理念的积极倡导者，惠普新近推出的<a href="http://review.feedsky.com/review/feedsky/blackcat/~/txt/183/r.html ">HP Touch SmartPC</a>正是融合了返璞归真的生活理念，将我们从键盘、工作台、线缆的束缚中解脱出来，哪怕仅是手指轻轻扫过超薄触摸屏的动作就可以轻松被识别。</p>
<p><img class="alignnone" title="乐触电脑" src="http://h20426.www2.hp.com/campaign/personal/cn/zh/touchpc/products/01.jpg" alt="" width="390" height="260" /></p>
<p>为了让更多人能够有机会体验最具创意的触摸方式来感知美好的新世界。惠普专门为热爱生活的人们开设了“<a href="http://review.feedsky.com/review/feedsky/blackcat/~/txt/183/r.html ">乐触</a>生活社区”<a href="http://digi.it.sohu.com/s2008/touchsmart/">http://digi.it.sohu.com/s2008/touchsmart/</a>，你可以在这里尽情晒出你的精彩并与我们的&#8221;<a href="http://review.feedsky.com/review/feedsky/blackcat/~/txt/183/r.html ">乐触</a>&#8220;明星一起展示和分享你用亲手装点的温馨生活，分享拍摄的旅游圣地，品鉴用爱心制作的精巧美味。如果你所分享的作品足够精彩，有机会赢取大奖，参加惠普在北京、上海和广州举办的&#8221;<a href="http://review.feedsky.com/review/feedsky/blackcat/~/txt/183/r.html ">乐触</a>家庭 PARTY&#8221;活动，成为触动时尚的&#8221;<a href="http://review.feedsky.com/review/feedsky/blackcat/~/txt/183/r.html ">乐触</a>&#8220;明星！</p>
<p>科技的进步应该以不改变人们的生活习惯为前提，每天用鼠标拖来拖去，不知道就在鼠标垫上浪费了多少时间和体力，再者，想想你牙牙学语的孩子，想想你年迈的父母，这样一款触摸屏式电脑在科技上创新的确给我们带来了极大方便。计算机的使命在于减轻人们的工作量，一款和谐的电脑应该是让人们最快最方便的开启所需要的任务。<a href="http://review.feedsky.com/review/feedsky/blackcat/~/txt/183/r.html ">乐触</a>电脑看起来还是非常有艺术感的，挂在墙上，平时当作数码相框，用的时候可以无局限的使用它的无线键盘，充分享受高科技为我们带来的数字生活。</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/uncategorized/2009-spring-festival" title="祝大家己丑年新春大吉，万事如意">祝大家己丑年新春大吉，万事如意</a></li><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide" title="[译文]Google AJAX Language API开发者参考">[译文]Google AJAX Language API开发者参考</a></li><li><a href="http://www.hanguofeng.cn/archives/security/sql-injection-attack" title="SQL注入攻击-来自微软安全博客的建议">SQL注入攻击-来自微软安全博客的建议</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/uncategorized/hp-touch-smart/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>回忆当年在猫扑的故事</title>
		<link>http://www.hanguofeng.cn/archives/life/mop-in-memory?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mop-in-memory</link>
		<comments>http://www.hanguofeng.cn/archives/life/mop-in-memory#comments</comments>
		<pubDate>Sun, 12 Oct 2008 12:41:58 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[回忆]]></category>
		<category><![CDATA[猫扑]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=65</guid>
		<description><![CDATA[写在猫扑即将到来的第11个生日…… 当年我上MOP的时候，是奔着国内排名前N的论坛，来学习国内前辈先进的管理理念来的，那时候的猫扑还是ASP的，那是一个ASP的时代，也不可避免的对我学ASP产生了深远的影响。今天在论坛上看到有人整理了猫扑大事记，并且从1997年那个游戏机论坛开始算起，猫扑的11岁生日就要到了，特撰此文，纪念猫扑和我曾经逝去的年轻。 那时候的猫扑文化和人肉搜索 那时的猫扑，主旨还和现在不一样，那时的社区文化，还是一系列的跳跃思维的先进青年文化，出现的擦边内容虽然多，但不至于泛滥。那时候人肉搜索一词就已经开始流行于猫扑之上了，不过和现在的人肉搜索，完全不是指的同一个东西。那时，Google和百度还远不像现在这样发达，在网上找冷门的东西，往往很难找到，然而你可以出MP请人找，这就是猫扑上最早的人肉搜索，骑猫上网的我不惜浪费大量的电话费而乐衷此道，并且赚到了不少MP。还因此特别注册了个名为&#8221;赏金猎人X&#8221;的马甲。这个网名曾经用于让网友写信寄到学校，结果别人发信到班里，放在讲台上，我讪讪的上去拿，背后一片冷风，脑门三道竖线。想必百度知道的产品策划，也与此有关吧。 那时候的猫扑网络小说 猫扑对一个懵懂准文学青年产生了深远影响，当时著名的网络小说，何员外的几部作品，还有后来看了好多好多遍仍然看不腻的《猪和猫的爱情故事》，还有很多很多优秀的网络小说，都是在猫扑上看到的。那时候互联网不像现在这么泛滥，网络文学的水平还非常高，不像现在，随便忽悠点各网络游戏掺杂的同人，就可以在起点上捞一笔。呃，记得当时还有道具名为&#8221;何员外签名书&#8221;吧，不晓得现在还有没有了，就算有，几千MP一本，也不是实体的，看着都闹心。 那时候的MP 很荣耀的回忆起，那时候就有相当的经济头脑，从开始的做赏金猎人，到后来在某个特殊板块（好像叫什么什么交易版，比较隐藏的一个版块，早已不复存在了）倒卖带币Q号（是的，那个时候QQ卖出一些开通就含有5个Q币的号），在里面的大户那里批量买几十个，然后加一倍价钱零卖出去。后来又给上面一个网友做了一个企业站，赚了数以百万计的MP。最终巅峰时候累积到貌似是上千万的MP，又买大量的道具倒卖，可惜道具市场风云迭起，不说那时候，到如今，MP的概念和涵义已经和当时大相径庭了。还好我的MP早已挥霍于道具市场而不复得。 那时候的道具 玩道具，自然是有阴险目的的，利用火星飞碟、救生圈这样杀人灭口居家旅行必备的高科技作案工具，可当是推广网站的利器。刚查了下仅存的几条异动记录，在2004年的8月，救生圈的价格还是5799MP一个，到现在一看，最低价格竟然是713MP，可想而知人人都买得起的东西，应用效果就差到哪里去了。再看火星飞碟这样强烈有效的作案工具，在2004年的9月，还是54888MP一个，现在看，也就5000MP了，也贬值了近10倍。 那时候认识的猫扑人 请注意这里的人，是单数。在当时，偶然的机会，认识了一个猫扑高管，起源与我为了获得一个免费空间，用火星飞碟发布了数条引导信息，然后就有同样想得到那个空间的人找到我，问我怎么那么有效，然后又透露，自己是猫扑的高管，释放了N个飞碟都没有效果。几番纠缠之下，他还是没有给我透露自己的真实ID，只是说，经常和大熊、猫扑他们互相删帖玩，当时那个羡慕啊。如今，人海茫茫，这位老兄已经湮没在我的QQ好友列表中不复得了。 那时候的猫扑盈利 据上文的高管说，那时已经开始招揽各高管去上海（貌似是上海）上班，做专职管理员，发工资了。现在想想，已经记不清是在收购前还是收购后了。 收购，重拳之击 真是感觉到猫扑被收购，还是因为某天上猫扑，首页的一个FLASH，没有记错的话，应该是周杰伦的《我的地盘》，M-zone的广告。当我骑着猫发现页面卡了一分钟，然后出来大声的嘚啵嘚啵的声音，我彻底崩溃了。后来发现猫扑不是原来的猫扑了，被收购了，在接下来的日子里也发现内容有了相当的倾斜。嘚啵嘚啵事件应该是促使我离开猫扑的一个重要导火线。自此，挥霍完手里的MP，我离猫扑逐渐远去，从原来的每天上好几次，转变为每年上好几次…… That&#8217;s All 作为一个有志于往市场、产品方向发展的IT小青年，不敢也无力评述千橡在收购猫扑后所做的市场行为，无论怎么说，他的确是找到了年轻网民的兴趣点和关注点所在，并且成功的运营了带有特殊文化的社区，这样的社区在运营上是绝对成功的。就像大多数自以为是的网民都骂腾讯无耻一样，谁再骂千橡旗下猫扑，都改变和重现不了他们建立起如此一种文化社区的成功。 That&#8217;s All，Thanks。 P.S MOP大事件：http://dzh.mop.com/topic/readSub_8002607_0_0.html 相关内容走路穿过中关村]]></description>
			<content:encoded><![CDATA[<p>写在猫扑即将到来的第11个生日……</p>
<p>当年我上MOP的时候，是奔着国内排名前N的论坛，来学习国内前辈先进的管理理念来的，那时候的猫扑还是ASP的，那是一个ASP的时代，也不可避免的对我学ASP产生了深远的影响。今天在论坛上看到有人整理了猫扑大事记，并且从1997年那个游戏机论坛开始算起，猫扑的11岁生日就要到了，特撰此文，纪念猫扑和我曾经逝去的年轻。</p>
<p><span id="more-65"></span></p>
<h2>那时候的猫扑文化和人肉搜索</h2>
<p>那时的猫扑，主旨还和现在不一样，那时的社区文化，还是一系列的跳跃思维的先进青年文化，出现的擦边内容虽然多，但不至于泛滥。那时候人肉搜索一词就已经开始流行于猫扑之上了，不过和现在的人肉搜索，完全不是指的同一个东西。那时，Google和百度还远不像现在这样发达，在网上找冷门的东西，往往很难找到，然而你可以出MP请人找，这就是猫扑上最早的人肉搜索，骑猫上网的我不惜浪费大量的电话费而乐衷此道，并且赚到了不少MP。还因此特别注册了个名为&#8221;赏金猎人X&#8221;的马甲。这个网名曾经用于让网友写信寄到学校，结果别人发信到班里，放在讲台上，我讪讪的上去拿，背后一片冷风，脑门三道竖线。想必百度知道的产品策划，也与此有关吧。</p>
<h2>那时候的猫扑网络小说</h2>
<p>猫扑对一个懵懂准文学青年产生了深远影响，当时著名的网络小说，何员外的几部作品，还有后来看了好多好多遍仍然看不腻的《猪和猫的爱情故事》，还有很多很多优秀的网络小说，都是在猫扑上看到的。那时候互联网不像现在这么泛滥，网络文学的水平还非常高，不像现在，随便忽悠点各网络游戏掺杂的同人，就可以在起点上捞一笔。呃，记得当时还有道具名为&#8221;何员外签名书&#8221;吧，不晓得现在还有没有了，就算有，几千MP一本，也不是实体的，看着都闹心。</p>
<h2>那时候的MP</h2>
<p>很荣耀的回忆起，那时候就有相当的经济头脑，从开始的做赏金猎人，到后来在某个特殊板块（好像叫什么什么交易版，比较隐藏的一个版块，早已不复存在了）倒卖带币Q号（是的，那个时候QQ卖出一些开通就含有5个Q币的号），在里面的大户那里批量买几十个，然后加一倍价钱零卖出去。后来又给上面一个网友做了一个企业站，赚了数以百万计的MP。最终巅峰时候累积到貌似是上千万的MP，又买大量的道具倒卖，可惜道具市场风云迭起，不说那时候，到如今，MP的概念和涵义已经和当时大相径庭了。还好我的MP早已挥霍于道具市场而不复得。</p>
<h2>那时候的道具</h2>
<p>玩道具，自然是有阴险目的的，利用火星飞碟、救生圈这样杀人灭口居家旅行必备的高科技作案工具，可当是推广网站的利器。刚查了下仅存的几条异动记录，在2004年的8月，救生圈的价格还是5799MP一个，到现在一看，最低价格竟然是713MP，可想而知人人都买得起的东西，应用效果就差到哪里去了。再看火星飞碟这样强烈有效的作案工具，在2004年的9月，还是54888MP一个，现在看，也就5000MP了，也贬值了近10倍。</p>
<h2>那时候认识的猫扑人</h2>
<p>请注意这里的人，是单数。在当时，偶然的机会，认识了一个猫扑高管，起源与我为了获得一个免费空间，用火星飞碟发布了数条引导信息，然后就有同样想得到那个空间的人找到我，问我怎么那么有效，然后又透露，自己是猫扑的高管，释放了N个飞碟都没有效果。几番纠缠之下，他还是没有给我透露自己的真实ID，只是说，经常和大熊、猫扑他们互相删帖玩，当时那个羡慕啊。如今，人海茫茫，这位老兄已经湮没在我的QQ好友列表中不复得了。</p>
<h2>那时候的猫扑盈利</h2>
<p>据上文的高管说，那时已经开始招揽各高管去上海（貌似是上海）上班，做专职管理员，发工资了。现在想想，已经记不清是在收购前还是收购后了。</p>
<h2>收购，重拳之击</h2>
<p>真是感觉到猫扑被收购，还是因为某天上猫扑，首页的一个FLASH，没有记错的话，应该是周杰伦的《我的地盘》，M-zone的广告。当我骑着猫发现页面卡了一分钟，然后出来大声的嘚啵嘚啵的声音，我彻底崩溃了。后来发现猫扑不是原来的猫扑了，被收购了，在接下来的日子里也发现内容有了相当的倾斜。嘚啵嘚啵事件应该是促使我离开猫扑的一个重要导火线。自此，挥霍完手里的MP，我离猫扑逐渐远去，从原来的每天上好几次，转变为每年上好几次……</p>
<h2>That&#8217;s All</h2>
<p>作为一个有志于往市场、产品方向发展的IT小青年，不敢也无力评述千橡在收购猫扑后所做的市场行为，无论怎么说，他的确是找到了年轻网民的兴趣点和关注点所在，并且成功的运营了带有特殊文化的社区，这样的社区在运营上是绝对成功的。就像大多数自以为是的网民都骂腾讯无耻一样，谁再骂千橡旗下猫扑，都改变和重现不了他们建立起如此一种文化社区的成功。</p>
<p>That&#8217;s All，Thanks。</p>
<h2>P.S</h2>
<p>MOP大事件：<a href="http://dzh.mop.com/topic/readSub_8002607_0_0.html">http://dzh.mop.com/topic/readSub_8002607_0_0.html</a></p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/walk-across-zhongguancun" title="走路穿过中关村">走路穿过中关村</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/mop-in-memory/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DreamWeaver CS4新特性之JavaScript</title>
		<link>http://www.hanguofeng.cn/archives/web-client/dreamweaver-cs4-new-feture-javascript?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=dreamweaver-cs4-new-feture-javascript</link>
		<comments>http://www.hanguofeng.cn/archives/web-client/dreamweaver-cs4-new-feture-javascript#comments</comments>
		<pubDate>Fri, 26 Sep 2008 13:53:24 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web客户端技术]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=56</guid>
		<description><![CDATA[据业界新闻称： 2008年9月24日，北京-今天，Adobe 公司（Nasdaq：ADBE）宣布推出业界的里程碑产品&#8211;Adobe® Creative Suite® 4产品家族。该产品能够应用于所有创意工作流，是业内领先的设计和开发软件。通过工作流的根本性突破，消除了设计师和开发工作者之间的壁垒。新的Creative Suite 4产品线包含数百个创新功能，全面推进了印刷、网络、移动、交互、影音视频制作的创意过程。该产品把整个产品线的Flash技术提升至整合力与表现力的新高水平，是Adobe迄今为止最大规模的软件版本，内容包括Adobe Creative Suite 4 Design editions、Creative Suite 4 Web editions、Creative Suite 4 Production Premium、Adobe Master Collection和13个基础产品、14项整合技术以及7种服务。 于是在官方下载了DreamWeaver CS4的PreRelease版来测试，解压和安装没有什么太多要说的，只是感觉比早先的DreamWeaver CS3的安装速度要快了不少，安装完毕，发现界面与之前相比有了一定的改变，如图（上图为DreamWeaver CS3，下图为DreamWeaver CS4）： 除了界面上的改变，该版本作为一个重要的里程碑版，还有许多更新，诸如： 针对 Ajax 和 JavaScript 框架的代码提示 Adobe InContext Editing HTML 数据集 Subversion® 集成 CSS 最佳做法 等，更多可以查看官方的fetures页。 这里我主要给您介绍一下关于JavaScript的部分新特性。 一、JavaScript代码外链。 我们知道，出于种种目的考虑，我们一般不在页面直接撰写JavaScript代码，而是将其放在外部的js文件中，这样做的好处，除了便于管理整个站点的JavaScript之外，还有助于多多借助客户端对js文件的缓存，减少很少改变的js文件的网络传输流量的浪费。 另外，出于多人协作和便于管理、便于敏捷变化和代码分层等原因，我们应该尽可能的做到结构-表现-行为的分离，在平常的代码编写中，你可能大量使用了诸如 &#60;a onclick=&#34;alert_me('this is a link')&#34; href=&#34;#&#34;&#62;Click to [...]]]></description>
			<content:encoded><![CDATA[<p>据<a href="http://soft.ccw.com.cn/news/htm2008/20080924_508101.shtml">业界新闻</a>称：</p>
<p>2008年9月24日，北京-今天，Adobe 公司（Nasdaq：ADBE）宣布推出业界的里程碑产品&#8211;Adobe® Creative Suite® 4产品家族。该产品能够应用于所有创意工作流，是业内领先的设计和开发软件。通过工作流的根本性突破，消除了设计师和开发工作者之间的壁垒。新的Creative Suite 4产品线包含数百个创新功能，全面推进了印刷、网络、移动、交互、影音视频制作的创意过程。该产品把整个产品线的Flash技术提升至整合力与表现力的新高水平，是Adobe迄今为止最大规模的软件版本，内容包括Adobe Creative Suite 4 Design editions、Creative Suite 4 Web editions、Creative Suite 4 Production Premium、Adobe Master Collection和13个基础产品、14项整合技术以及7种服务。<span id="more-56"></span></p>
<p>于是在官方<a title="Dreamweaver CS4 官方下载" href="http://trials.adobe.com/pub/esd/labs/dreamweaver/dreamweaver_b1_052708.exe" target="_blank">下载</a>了DreamWeaver CS4的PreRelease版来测试，解压和安装没有什么太多要说的，只是感觉比早先的DreamWeaver CS3的安装速度要快了不少，安装完毕，发现界面与之前相比有了一定的改变，如图（上图为DreamWeaver CS3，下图为DreamWeaver CS4）：</p>
<p><a href="http://picasaweb.google.com/lh/photo/DGkfXhn5IolucrAZ6ljbVA"><img src="http://lh6.ggpht.com/hanguofeng/SNzgbAptaRI/AAAAAAAAAU0/T_v7AFL5FP4/s400/dreamweaver_cs_3.png.png" alt="" /></a></p>
<p><a href="http://picasaweb.google.com/lh/photo/JHLD_lQGhnLAq0Btrdavcw"><img src="http://lh3.ggpht.com/hanguofeng/SNzghG8Kh3I/AAAAAAAAAU8/pVMq827aOik/s400/dreamweaver_cs_4.png.png" alt="" /></a></p>
<p>除了界面上的改变，该版本作为一个重要的里程碑版，还有许多更新，诸如：</p>
<ul>
<li>针对 Ajax 和 JavaScript 框架的代码提示</li>
<li>Adobe InContext Editing</li>
<li>HTML 数据集</li>
<li>Subversion® 集成</li>
<li>CSS 最佳做法</li>
</ul>
<p>等，更多可以查看<a href="http://www.adobe.com/cn/products/dreamweaver/features/?view=topnew">官方的fetures页</a>。</p>
<p>这里我主要给您介绍一下关于JavaScript的部分新特性。</p>
<h2>一、JavaScript代码外链。</h2>
<p>我们知道，出于种种目的考虑，我们一般不在页面直接撰写JavaScript代码，而是将其放在外部的js文件中，这样做的好处，除了便于管理整个站点的JavaScript之外，还有助于多多借助客户端对js文件的缓存，减少很少改变的js文件的网络传输流量的浪费。</p>
<p>另外，出于多人协作和便于管理、便于敏捷变化和代码分层等原因，我们应该尽可能的做到结构-表现-行为的分离，在平常的代码编写中，你可能大量使用了诸如</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;a onclick=&quot;alert_me('this is a link')&quot; href=&quot;#&quot;&gt;Click to alert me&lt;/a&gt;</pre></div></div>

<p>这样的代码，然而，这样做却是将行为耦合到了基本的代码结构中，我们提倡以添加事件的方式来将其完全分离到JavaScript代码中，这个操作也可以由DreamWeaver CS4来完成。</p>
<p>在DreamWeaver CS4中，则为我们提供了此功能，这个功能你可以在【Commands】-&gt;【Externalize JavaScript】中找到。</p>
<p>为了测试这两项特性，我们撰写了如下的代码：</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Untitled Document&lt;/title&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
function alert_me(msg)
{
	alert(msg);
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;a href=&quot;#&quot; onclick=&quot;alert_me('this is a link')&quot;&gt;Click to alert me&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>你可以看到，在这段代码中，不仅在页面中出现了JavaScript函数，而且还将行为直接绑定在了HTML标签中，这时使用【Commands】-&gt;【Externalize JavaScript】来打开DreamWeaver CS4为我们提供的工具，你可以看到，有两个选项，他们分别对应了只将页面中的JavaScript代码块分离为外部文件和与此同时分离HTML代码中的JavaScript，如图：</p>
<p><a href="http://picasaweb.google.com/lh/photo/0ttpouJtbysyof37lfJUSg"><img src="http://lh3.ggpht.com/hanguofeng/SNzgh1hz0xI/AAAAAAAAAVE/le9mjR3_KcY/s288/externalize_javascript_1.png.png" alt="" /></a></p>
<p><a href="http://picasaweb.google.com/lh/photo/A9rn-Npk-wqHFrQZ66fusw"><img src="http://lh6.ggpht.com/hanguofeng/SNzgic3wj2I/AAAAAAAAAVM/fW2zyn7K-jE/s288/externalize_javascript_2.png.png" alt="" /></a></p>
<p>我们选择&#8221;Externalize JavaScript and attach unobtrusively&#8221;，即同时完成代码块和标签中代码的分离，命令执行完成后，页面的代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Untitled Document&lt;/title&gt;
&nbsp;
&lt;script src=&quot;SpryAssets/SpryDOMUtils.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;Untitled-15.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;a href=&quot;#&quot; id=&quot;a1&quot;&gt;Click to alert me&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>这样，就自动化的完成了相应的工作。</p>
<h2>二、JavaScript代码提示。</h2>
<p>一直以来，开发JavaScript没有特别顺手的IDE，Aptana算是一款基于Ecplise的JavaScript开发工具，提供了代码高亮和代码提示功能，如今，DreamWeaver CS4也提供了此功能，当我们构建JavaScript内置对象时，它已经可以进行代码提示了，如图：</p>
<p><a href="http://picasaweb.google.com/lh/photo/EbckQwZjWZDEV1zlqaOs0A"><img src="http://lh5.ggpht.com/hanguofeng/SNzgpt5u5eI/AAAAAAAAAVc/IdzLfJapSw4/s400/javascript_hint.png.png" /></a></p>
<p>除此以外，DreamWeaver CS4 还提供了对代码错误的提示，当代码出现错误，将在窗口顶端有一个黄色的提示条，同时在代码左侧行号处标识，如图：</p>
<p><a href="http://picasaweb.google.com/lh/photo/uoc6Nss9RQiSUzqt3B3CHg"><img src="http://lh4.ggpht.com/hanguofeng/SNzgoEW33PI/AAAAAAAAAVU/hk71obsOxTo/s400/javascript_error.png.png" alt="" /></a></p>
<h3>三、对第三方JavaScript库的支持。</h3>
<p>上面提到的Aptana同时提供对多种JavaScript的第三方类库，如Prototype、jQuery、YUI、ExtJS等的支持，DreamWeaver CS4也同样提供了，我们首先引入一个Prototype库，然后通过输入new Ajax.，试图构建一个Ajax的应用，此时DreamWeave CS4给出了Ajax类成员方法的代码提示，如图：</p>
<p><a href="http://picasaweb.google.com/lh/photo/GtwxCpXTtFKGFxxsz2XylQ"><img src="http://lh3.ggpht.com/hanguofeng/SNzgrX-hHVI/AAAAAAAAAVk/rrL5oLmxd3Q/s400/javascript_lib.png.png" /></a></p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-server/php-serialize-json" title="PHP串行化与JSON">PHP串行化与JSON</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-client/dreamweaver-cs4-new-feture-javascript/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>北京法源寺游记</title>
		<link>http://www.hanguofeng.cn/archives/life/travelling-fayua-temple?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=travelling-fayua-temple</link>
		<comments>http://www.hanguofeng.cn/archives/life/travelling-fayua-temple#comments</comments>
		<pubDate>Sun, 21 Sep 2008 11:31:15 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[京城朝寺]]></category>
		<category><![CDATA[北京]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=48</guid>
		<description><![CDATA[同很多人一样，我神往法源寺也是因为李敖先生的《北京法源寺》。 近日来工作颇为繁忙，周末不加班便是新鲜事，更不必提每日晚上了，周四第二次通宵加班了，不过还好，勉强也承受得住。周六在家睡了一天，下午睡觉竟然还做了噩梦，鬼压床般，又强迫自己醒来，迷茫间便决定周日出去四处逛下，开始时候的目标是玉渊潭，后来想想，便又改变主意，想自己遍览下京城的古庙名刹，第一站便是北京法源寺了。 游法源寺 早晨10点醒来，查了路线，又净身换衣&#8211;朝拜总是要虔诚的，加之周五、六二日均为食肉，便觉准备就绪，十二点正式出发了。奔波着坐车、询路，到达法源寺已是一点有余。今天天气不是很好，阴霾的厚云覆盖了整个天空，于我看来却是朝拜的最好时机，寂寥的古寺中，参天大树林立，掺杂着鸟鸣，让我找到了久违的宁静。 法源寺坐落于宣武区的法源寺前街七号，与坐落于山上的古刹来比，占地并不大，分为天王殿、大雄宝殿、闵忠阁、毗卢殿、观音殿和卧佛殿六座宝殿，不仅是北京现存历史最久的古刹，更是中国佛学院的所在。 请香、焚香、跪拜，内心得到了前所未有的涤荡，却有一种感动的想哭的冲动，于丁香树下漫步，静心把墙上的佛语摄于心中。 很抱歉的，由于不熟悉佛教礼仪，多处不敬怠慢，罪过罪过。 关于信仰 每个人都需要哲学，大多数人，都需要信仰，正是信仰的缺失让我们道德沦丧。法律与道德的尺度相隔太远，片面崇尚实用经济又让我们急功近利而抛弃道德的尺度。信仰，便是此处的调节阀，它处于法律之下，道德之上，同时，信仰给人们心理的滋润真的如一泓清泉注入沙漠。 程序员的禅意 在编码前的需求是要抽象的，解决一个问题，并非只为解决这个问题，而是为了解决这种问题而派生出一种你核心编程哲学中的通用方法。将虚妄的外表除去，才能看到问题的真谛。 学编程也是一样，任何语言都无法脱离在某个环境中运行的命运，任何语言都不能没有算法的骨肉，任何语言在创建之初都离不开数学和哲学，得道者海纳其中的思想，无为者碌碌无为追逐形形色色的语言。 相关内容北海公园游记北京的冬天，有点冷慢慢走向毕业]]></description>
			<content:encoded><![CDATA[<p>同很多人一样，我神往法源寺也是因为李敖先生的《北京法源寺》。</p>
<p>近日来工作颇为繁忙，周末不加班便是新鲜事，更不必提每日晚上了，周四第二次通宵加班了，不过还好，勉强也承受得住。周六在家睡了一天，下午睡觉竟然还做了噩梦，鬼压床般，又强迫自己醒来，迷茫间便决定周日出去四处逛下，开始时候的目标是玉渊潭，后来想想，便又改变主意，想自己遍览下京城的古庙名刹，第一站便是北京法源寺了。<br />
<span id="more-48"></span></p>
<h2>游法源寺</h2>
<p>早晨10点醒来，查了路线，又净身换衣&#8211;朝拜总是要虔诚的，加之周五、六二日均为食肉，便觉准备就绪，十二点正式出发了。奔波着坐车、询路，到达法源寺已是一点有余。今天天气不是很好，阴霾的厚云覆盖了整个天空，于我看来却是朝拜的最好时机，寂寥的古寺中，参天大树林立，掺杂着鸟鸣，让我找到了久违的宁静。</p>
<p><a href="http://picasaweb.google.com/lh/photo/gVwmLi1Lum2rYOj9Vp_ZEw?authkey=G36_j7ScOvw"><img src="http://lh6.ggpht.com/hanguofeng/SNYkr7hIKUI/AAAAAAAAAS4/lA1UAGYi1js/s400/200809211316_326.jpg" alt="" /></a></p>
<p>法源寺坐落于宣武区的法源寺前街七号，与坐落于山上的古刹来比，占地并不大，分为天王殿、大雄宝殿、闵忠阁、毗卢殿、观音殿和卧佛殿六座宝殿，不仅是北京现存历史最久的古刹，更是中国佛学院的所在。</p>
<p><a href="http://picasaweb.google.com/lh/photo/qu2sFIfWdZffCO21MchqfQ?authkey=G36_j7ScOvw"><img src="http://lh3.ggpht.com/hanguofeng/SNYkxa7PzoI/AAAAAAAAATA/p5ltu7RYY5M/s400/200809211317_327.jpg" alt="" /></a></p>
<p>请香、焚香、跪拜，内心得到了前所未有的涤荡，却有一种感动的想哭的冲动，于丁香树下漫步，静心把墙上的佛语摄于心中。</p>
<p><a href="http://picasaweb.google.com/lh/photo/oEqD5ja7vVksYveKfpr_4Q?authkey=G36_j7ScOvw"><img src="http://lh6.ggpht.com/hanguofeng/SNYk67EM1QI/AAAAAAAAATI/L9f7lB2Xkg0/s400/200809211406_328.jpg" alt="" /></a></p>
<p>很抱歉的，由于不熟悉佛教礼仪，多处不敬怠慢，罪过罪过。</p>
<h2>关于信仰</h2>
<p>每个人都需要哲学，大多数人，都需要信仰，正是信仰的缺失让我们道德沦丧。法律与道德的尺度相隔太远，片面崇尚实用经济又让我们急功近利而抛弃道德的尺度。信仰，便是此处的调节阀，它处于法律之下，道德之上，同时，信仰给人们心理的滋润真的如一泓清泉注入沙漠。</p>
<h2>程序员的禅意</h2>
<p>在编码前的需求是要抽象的，解决一个问题，并非只为解决这个问题，而是为了解决这种问题而派生出一种你核心编程哲学中的通用方法。将虚妄的外表除去，才能看到问题的真谛。</p>
<p>学编程也是一样，任何语言都无法脱离在某个环境中运行的命运，任何语言都不能没有算法的骨肉，任何语言在创建之初都离不开数学和哲学，得道者海纳其中的思想，无为者碌碌无为追逐形形色色的语言。</p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/beihai-park" title="北海公园游记">北海公园游记</a></li><li><a href="http://www.hanguofeng.cn/archives/life/cold-winter-in-beijing" title="北京的冬天，有点冷">北京的冬天，有点冷</a></li><li><a href="http://www.hanguofeng.cn/archives/life/wander-about-graduate" title="慢慢走向毕业">慢慢走向毕业</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/travelling-fayua-temple/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>EMAIL到你的Web程序&#8211;有趣的Email2HTTP</title>
		<link>http://www.hanguofeng.cn/archives/web-server/email2http?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=email2http</link>
		<comments>http://www.hanguofeng.cn/archives/web-server/email2http#comments</comments>
		<pubDate>Fri, 12 Sep 2008 14:27:51 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web服务器端技术]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=30</guid>
		<description><![CDATA[大家一定都体验过通过Email使用Web程序吧，什么？你还没有？那么一定是你不记得了。 Flickr可以通过Email上传文件，Google Doc可以通过Email发送文件到指定收件箱从而完成文档的转换，这些都是通过Email使用Web的例子，如果这些你都没有试用过，那么你也许用到过彩信发表照片吧，在饭否、叽歪这样的微博客网站，都是对用户体验很好的例子。 上面所说的这些，在Web服务器端都是通过对Email读取来完成的，那么设想，提供这样一个特色服务，就需要搭建一个邮件服务器来收取邮件，对于大多数程序员和个人站长来说，都是一个门槛很高的操作，而现在，有了Email2HTTP，你完全不用担心了。 Email2HTTP正式这样一个服务的提供商：它为你提供了一个可以接收邮件并将邮件内容以HTTP协议POST到你指定的CallBack地址，让你给你的网站加上这些有趣功能的服务。 如下是Email2HTTP官方给出的一段读取邮件的代码，他接受Email2HTTP服务器转发来的请求，保存其中的文件，并输出邮件内容。  [snippet=8368] 相关内容听小韩聊PHP项目开发(3)–切分你的系统听小韩聊PHP项目开发(2)&#8211;观察你的项目Windows下AMP平台配置FastCGI方法（以xampp为基础）]]></description>
			<content:encoded><![CDATA[<p>大家一定都体验过通过Email使用Web程序吧，什么？你还没有？那么一定是你不记得了。</p>
<p>Flickr可以通过Email上传文件，Google Doc可以通过Email发送文件到指定收件箱从而完成文档的转换，这些都是通过Email使用Web的例子，如果这些你都没有试用过，那么你也许用到过彩信发表照片吧，在饭否、叽歪这样的微博客网站，都是对用户体验很好的例子。</p>
<p><span id="more-30"></span></p>
<p>上面所说的这些，在Web服务器端都是通过对Email读取来完成的，那么设想，提供这样一个特色服务，就需要搭建一个邮件服务器来收取邮件，对于大多数程序员和个人站长来说，都是一个门槛很高的操作，而现在，有了Email2HTTP，你完全不用担心了。</p>
<p><a href="https://www.email2http.com/">Email2HTTP</a>正式这样一个服务的提供商：它为你提供了一个可以接收邮件并将邮件内容以HTTP协议POST到你指定的CallBack地址，让你给你的网站加上这些有趣功能的服务。</p>
<p>如下是Email2HTTP官方给出的一段读取邮件的代码，他接受Email2HTTP服务器转发来的请求，保存其中的文件，并输出邮件内容。</p>
<p> <code>[snippet=8368]</code></p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-3" title="听小韩聊PHP项目开发(3)–切分你的系统">听小韩聊PHP项目开发(3)–切分你的系统</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-2" title="听小韩聊PHP项目开发(2)&#8211;观察你的项目">听小韩聊PHP项目开发(2)&#8211;观察你的项目</a></li><li><a href="http://www.hanguofeng.cn/archives/security/configure-fast-in-lamp-on-windows-with-xampp" title="Windows下AMP平台配置FastCGI方法（以xampp为基础）">Windows下AMP平台配置FastCGI方法（以xampp为基础）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-server/email2http/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>始于九月</title>
		<link>http://www.hanguofeng.cn/archives/life/begining-at-september?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=begining-at-september</link>
		<comments>http://www.hanguofeng.cn/archives/life/begining-at-september#comments</comments>
		<pubDate>Sun, 31 Aug 2008 15:13:39 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[930]]></category>
		<category><![CDATA[北方学院]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=28</guid>
		<description><![CDATA[又到了九月，终于、终归、终究回到了学校，虽然只待了不到24个小时又折返回来，但是最终我还是在开学的时候到了学校。 学校里面熙熙攘攘，大包小包的新生和家长覆盖了整个学校，觉得挺闹的……想想三年前，大片大片的草皮如今拔地而起……呃，不是草拔地而起啊。 回到宿舍，外面住的Rocky友情提供了葡萄一饭盆，恩，突然想起三年前，新宇来的时候，也是带了葡萄，不过是一饭盒，难道三年的大学，只是让我们把饭盒变成了饭盆？ 和小猪一起回北京，有人很不厚道的从后门上930，我也随后而上，没想到后门突然关了，于是差点，差点，如果我的头再早伸进去一秒钟，你们就可以看到燕郊无头男尸了……恩，头在车里顺便回到北京了…… 相关内容慢慢走向毕业]]></description>
			<content:encoded><![CDATA[<p>又到了九月，终于、终归、终究回到了学校，虽然只待了不到24个小时又折返回来，但是最终我还是在开学的时候到了学校。<span id="more-28"></span></p>
<p>学校里面熙熙攘攘，大包小包的新生和家长覆盖了整个学校，觉得挺闹的……想想三年前，大片大片的草皮如今拔地而起……呃，不是草拔地而起啊。</p>
<p><a href="http://lh6.ggpht.com/hanguofeng/SLq0GCW7irI/AAAAAAAAAPo/f5KA1IEBaIE/s400/200808311136_305.jpg"><img class="alignnone" src="http://lh6.ggpht.com/hanguofeng/SLq0GCW7irI/AAAAAAAAAPo/f5KA1IEBaIE/s400/200808311136_305.jpg" alt="" width="400" height="320" /></a></p>
<p>回到宿舍，外<a href="http://lh6.ggpht.com/hanguofeng/SLq0GCW7irI/AAAAAAAAAPo/f5KA1IEBaIE/s400/200808311136_305.jpg"></a>面住的Rocky友情提供了葡萄一饭盆，恩，突然想起三年前，新宇来的时候，也是带了葡萄，不过是一饭盒，难道三年的大学，只是让我们把饭盒变成了饭盆？</p>
<p>和小猪一起回北京，有人很不厚道的从后门上930，我也随后而上，没想到后门突然关了，于是差点，差点，如果我的头再早伸进去一秒钟，你们就可以看到燕郊无头男尸了……恩，头在车里顺便回到北京了……</p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/wander-about-graduate" title="慢慢走向毕业">慢慢走向毕业</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/begining-at-september/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Beyond summer</title>
		<link>http://www.hanguofeng.cn/archives/life/beyond-summer?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=beyond-summer</link>
		<comments>http://www.hanguofeng.cn/archives/life/beyond-summer#comments</comments>
		<pubDate>Thu, 14 Aug 2008 15:17:27 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[ChinaPub]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[北京]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=23</guid>
		<description><![CDATA[在ChinaPub工作一个月了，特意上来写点什么，记录和汇报一下。 前两天装上了Ubuntu，用wubi装的，原因是我实在没有足够的硬盘空间再分给Ubuntu了，当然也没有胆量尝试下从来没有熟练做过的Ubuntu分区。其实接触Linux系统也不晚，记得还在高二的时候就费劲八叱的在家里的电脑上装Redhat了，三张盘，对，这还是受了老牛的影响，那大哥买了个“正版”的Redhat。后来又找外教Marian借了正版的说明书来看。 Marian是一个很有趣的胖女孩，多胖呢，顶我一个半吧，她和我们讲，I use Linux because it&#8217;s free!，她讲课的时候还一边在电脑上打出自己说得话，用投影放出来，生怕我们听不懂，很周到，人家的打字速度，那真叫一个快啊，呵呵，扯远了。 LinuxQQ实在不如想象中的好用，虽然比得Pidgin来说，它的确很QQ，但是不能发图不能发文件，连自定义表情也发不了，这的确有点恶心，还是不是的卡死Linux，OMG。 现在一个人在做“期望负载量很大”的站点，架构，编码，数据库设计，还有JS，有些吃力了，用ThinkPHP框架，还好，算是减轻了不少的工作量，现在倒是很好奇林老师的CoffeePHP了，做B/S系统的PHP框架，呵呵。 最后学小女生，附图一张 相关内容听小韩聊PHP项目开发(3)–切分你的系统听小韩聊PHP项目开发(2)&#8211;观察你的项目北海公园游记]]></description>
			<content:encoded><![CDATA[<p>在ChinaPub工作一个月了，特意上来写点什么，记录和汇报一下。<span id="more-23"></span></p>
<p>前两天装上了Ubuntu，用wubi装的，原因是我实在没有足够的硬盘空间再分给Ubuntu了，当然也没有胆量尝试下从来没有熟练做过的Ubuntu分区。其实接触Linux系统也不晚，记得还在高二的时候就费劲八叱的在家里的电脑上装Redhat了，三张盘，对，这还是受了老牛的影响，那大哥买了个“正版”的Redhat。后来又找外教Marian借了正版的说明书来看。</p>
<p>Marian是一个很有趣的胖女孩，多胖呢，顶我一个半吧，她和我们讲，I use Linux because it&#8217;s free!，她讲课的时候还一边在电脑上打出自己说得话，用投影放出来，生怕我们听不懂，很周到，人家的打字速度，那真叫一个快啊，呵呵，扯远了。</p>
<p>LinuxQQ实在不如想象中的好用，虽然比得Pidgin来说，它的确很QQ，但是不能发图不能发文件，连自定义表情也发不了，这的确有点恶心，还是不是的卡死Linux，OMG。</p>
<p>现在一个人在做“期望负载量很大”的站点，架构，编码，数据库设计，还有JS，有些吃力了，用ThinkPHP框架，还好，算是减轻了不少的工作量，现在倒是很好奇林老师的CoffeePHP了，做B/S系统的PHP框架，呵呵。</p>
<p>最后学小女生，附图一张<br />
<a href="http://picasaweb.google.com/hanguofeng/TShirts/photo?authkey=yqmYoJbh_VY#5234392214377902546"><img src="http://lh5.ggpht.com/hanguofeng/SKRL_GkQsdI/AAAAAAAAAOU/pac-Rr6Sih8/s400/IMG_2450.jpg" alt="" /></a></p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-3" title="听小韩聊PHP项目开发(3)–切分你的系统">听小韩聊PHP项目开发(3)–切分你的系统</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-2" title="听小韩聊PHP项目开发(2)&#8211;观察你的项目">听小韩聊PHP项目开发(2)&#8211;观察你的项目</a></li><li><a href="http://www.hanguofeng.cn/archives/life/beihai-park" title="北海公园游记">北海公园游记</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/beyond-summer/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>北京 仲夏夜之梦</title>
		<link>http://www.hanguofeng.cn/archives/life/summer-vacation-in-beijing?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=summer-vacation-in-beijing</link>
		<comments>http://www.hanguofeng.cn/archives/life/summer-vacation-in-beijing#comments</comments>
		<pubDate>Sat, 12 Jul 2008 05:04:28 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[北京]]></category>
		<category><![CDATA[夏天]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/life/summer-vacation-in-beijing</guid>
		<description><![CDATA[记得我曾提过，我是夏至那天生的。 曾经是否想过，会在这个时候，在北京度过这样一个夏天呢？我不知道，也许在梦中有过吧，这也许正是小的时候所向往的生活。When I was very very young，一部《我的九月》构成了我对北京，这个矛盾于古典和现代之间的城市的全部印象。四合院、朝阳下的鸽子、晨练的人们，在紧张的筹备中过着自己的生活。说起来的确有些有趣，那部电影反映的是亚运会的事情，而现在，却是奥运会的事情。 其实，在北京&#8221;工作&#8221;已经有一段时间了，可能很多朋友还不知道，在五月的时候，我就已经半进京了，在一家名为天行网安的网络安全公司做兼职。工作内容却实在是有些出人意料：圈子里的朋友到了网络安全公司，或者所谓的&#8221;甲方公司&#8221;，做的都是网络安全方面的工作吧，而我呢，做的不能说不是网络安全方面的工作，呵呵，我的工作竟然是做界面开发，简而言之，用我给泡泡同学的解释，就是做&#8221;你用路由器的时候，打开 http://192.168.1.1，看到的那个东西&#8221;。歪打歪着吧，在我到公司面试前还不知道这家公司竟然是做网络安全的，呵呵，否则我会直接放弃吗？也许吧。做了一个多月的PHP+JS的界面开发。这份工作对我来说，意义非常，这不仅是我第一份实际的工作，而且，（呵呵，你会相信吗），在到公司之前，我还基本没有怎么做过PHP开发。一个多月的时间，从原来的ASP平台到PHP平台，基本也没有什么不适，所以在现在的公司要开发新项目的时候，我毫无疑问的选择了LAMP平台。这里无意讨论那个Monthly的问题，只是说，如果让我一个人开发一个东西，我肯定选择PHP而非.Net了，当然，给充足时间的情况除外。 恩，上面已经提到&#8221;新公司&#8221;这个词，你也许会看出，我跳槽了。对于跳槽这件事情，我始终有着很多抱歉，滕总说，&#8221;国峰，年轻人想法随时会变我不怪你，可是以后一定要考虑给公司带来的影响&#8221;。为了这句话，我坚持在这个公司多待了一个月，到18号，希望能够善终吧。 在新公司，自然是做全职了，这就要求，必须在北京住下，于是不得不花1000块一个月在西三环这个地方租下一个陋室，住在陋室的第一天，孤单像洪水般涌来，稍后我的伙伴&#8211;大量的蚊子就来陪伴我了，囧rz。 新公司的技术方面，人家全用.Net/ASP，我这突然冒出个PHP的系统来，不知道大家会不会很囧，不过其实长远来讲，高访问量的站点，尤其涉及到Social、Service这些方面，日后肯定要做集群，做集群的话，用Win的系统，成本会不会高了点，服务器上不敢用盗版吧，呵呵。 Rocky和Iron同学在燕郊花1000租了一个很好很强大的房子，俩人开始了他们的Java之梦，希望所谓的计算机世界大学不会让他们失望。 今天陈冰老师发来消息说，我的书明天开始排版了，呵呵，这本历时一年多的书终于要面世了，也希望你和我一起期待。不出意外，这应该是我ASP生涯的一个靠近终结点的里程碑了。 相关内容北海公园游记北京的冬天，有点冷慢慢走向毕业]]></description>
			<content:encoded><![CDATA[<p>记得我曾提过，我是夏至那天生的。<span id="more-22"></span></p>
<p>曾经是否想过，会在这个时候，在北京度过这样一个夏天呢？我不知道，也许在梦中有过吧，这也许正是小的时候所向往的生活。When I was very very young，一部《我的九月》构成了我对北京，这个矛盾于古典和现代之间的城市的全部印象。四合院、朝阳下的鸽子、晨练的人们，在紧张的筹备中过着自己的生活。说起来的确有些有趣，那部电影反映的是亚运会的事情，而现在，却是奥运会的事情。</p>
<p>其实，在北京&#8221;工作&#8221;已经有一段时间了，可能很多朋友还不知道，在五月的时候，我就已经半进京了，在一家名为天行网安的网络安全公司做兼职。工作内容却实在是有些出人意料：圈子里的朋友到了网络安全公司，或者所谓的&#8221;甲方公司&#8221;，做的都是网络安全方面的工作吧，而我呢，做的不能说不是网络安全方面的工作，呵呵，我的工作竟然是做界面开发，简而言之，用我给泡泡同学的解释，就是做&#8221;你用路由器的时候，打开 <a href="http://192.168.1.1">http://192.168.1.1</a>，看到的那个东西&#8221;。歪打歪着吧，在我到公司面试前还不知道这家公司竟然是做网络安全的，呵呵，否则我会直接放弃吗？也许吧。做了一个多月的PHP+JS的界面开发。这份工作对我来说，意义非常，这不仅是我第一份实际的工作，而且，（呵呵，你会相信吗），在到公司之前，我还基本没有怎么做过PHP开发。一个多月的时间，从原来的ASP平台到PHP平台，基本也没有什么不适，所以在现在的公司要开发新项目的时候，我毫无疑问的选择了LAMP平台。这里无意讨论那个Monthly的问题，只是说，如果让我一个人开发一个东西，我肯定选择PHP而非.Net了，当然，给充足时间的情况除外。</p>
<p>恩，上面已经提到&#8221;新公司&#8221;这个词，你也许会看出，我跳槽了。对于跳槽这件事情，我始终有着很多抱歉，滕总说，&#8221;国峰，年轻人想法随时会变我不怪你，可是以后一定要考虑给公司带来的影响&#8221;。为了这句话，我坚持在这个公司多待了一个月，到18号，希望能够善终吧。</p>
<p>在新公司，自然是做全职了，这就要求，必须在北京住下，于是不得不花1000块一个月在西三环这个地方租下一个陋室，住在陋室的第一天，孤单像洪水般涌来，稍后我的伙伴&#8211;大量的蚊子就来陪伴我了，囧rz。</p>
<p>新公司的技术方面，人家全用.Net/ASP，我这突然冒出个PHP的系统来，不知道大家会不会很囧，不过其实长远来讲，高访问量的站点，尤其涉及到Social、Service这些方面，日后肯定要做集群，做集群的话，用Win的系统，成本会不会高了点，服务器上不敢用盗版吧，呵呵。</p>
<p>Rocky和Iron同学在燕郊花1000租了一个很好很强大的房子，俩人开始了他们的Java之梦，希望所谓的计算机世界大学不会让他们失望。</p>
<p>今天陈冰老师发来消息说，我的书明天开始排版了，呵呵，这本历时一年多的书终于要面世了，也希望你和我一起期待。不出意外，这应该是我ASP生涯的一个靠近终结点的里程碑了。<!-- Tag links generated by Zoundry Raven. Do not manually edit. http://www.zoundryraven.com --></p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/beihai-park" title="北海公园游记">北海公园游记</a></li><li><a href="http://www.hanguofeng.cn/archives/life/cold-winter-in-beijing" title="北京的冬天，有点冷">北京的冬天，有点冷</a></li><li><a href="http://www.hanguofeng.cn/archives/life/wander-about-graduate" title="慢慢走向毕业">慢慢走向毕业</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/summer-vacation-in-beijing/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>生日快乐</title>
		<link>http://www.hanguofeng.cn/archives/life/birthday-of-22-years-old?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=birthday-of-22-years-old</link>
		<comments>http://www.hanguofeng.cn/archives/life/birthday-of-22-years-old#comments</comments>
		<pubDate>Mon, 23 Jun 2008 14:56:30 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[生日]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=21</guid>
		<description><![CDATA[22号的生日，22岁的生日，只有一次。 谢谢各位的祝福，尤其谢谢“您”的蛋糕、钱包还有排骨，很开心的生日，因为好像很多年生日没有家人以外的人给我这样过了，也很多年没有吃生日蛋糕了。 22岁了，一个人，16岁、18岁、22岁的生日那天，他想的东西是否会一样呢，呵呵。 16岁的时候，我们在经历那场人生第一次重要的考试后，享受阳光点点的暑假。 18岁的时候，那个成人礼之后的灌水本，在我们的手里和心里开始流传。 22岁的时候，我站在学校和公司之间的交叉路口，茫然四顾。 时光荏苒。朋友们，希望下次生日我们能在一起。 随机内容祝大家己丑年新春大吉，万事如意立秋++++慢慢走向毕业]]></description>
			<content:encoded><![CDATA[<p>22号的生日，22岁的生日，只有一次。</p>
<p>谢谢各位的祝福，尤其谢谢“您”的蛋糕、钱包还有排骨，很开心的生日，因为好像很多年生日没有家人以外的人给我这样过了，也很多年没有吃生日蛋糕了。</p>
<p>22岁了，一个人，16岁、18岁、22岁的生日那天，他想的东西是否会一样呢，呵呵。</p>
<p>16岁的时候，我们在经历那场人生第一次重要的考试后，享受阳光点点的暑假。<br />
18岁的时候，那个成人礼之后的灌水本，在我们的手里和心里开始流传。<br />
22岁的时候，我站在学校和公司之间的交叉路口，茫然四顾。</p>
<p>时光荏苒。朋友们，希望下次生日我们能在一起。</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-client/dreamweaver-cs4-new-feture-javascript" title="DreamWeaver CS4新特性之JavaScript">DreamWeaver CS4新特性之JavaScript</a></li><li><a href="http://www.hanguofeng.cn/archives/code-life/singleton-lover" title="Singleton.Lover">Singleton.Lover</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-2" title="听小韩聊PHP项目开发(2)&#8211;观察你的项目">听小韩聊PHP项目开发(2)&#8211;观察你的项目</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/birthday-of-22-years-old/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SQL注入攻击-来自微软安全博客的建议</title>
		<link>http://www.hanguofeng.cn/archives/security/sql-injection-attack?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=sql-injection-attack</link>
		<comments>http://www.hanguofeng.cn/archives/security/sql-injection-attack#comments</comments>
		<pubDate>Tue, 03 Jun 2008 12:33:39 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[网络安全]]></category>
		<category><![CDATA[SQL Injection]]></category>
		<category><![CDATA[SQL注入]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/security/sql-injection-attack</guid>
		<description><![CDATA[本文翻译自微软博客上刊载的相关文章，英文原文版权归原作者所有，特此声明。 原文：http://blogs.technet.com/swi/archive/2008/05/29/sql-injection-attack.aspx 本文译言地址：http://www.yeeyan.com/articles/view/hanguofeng/8955 （特别感谢Neil Carpenter对本文写作提供的帮助） 近期趋势 从去年下半年开始，很多网站被损害，他们在用于生成动态网页的SQL数据库中存储的文本中被注入了恶意的HTML &#60;script&#62;标签。这样的攻击在2008年第一季度开始加速传播，并且持续影响有漏洞的Web程序。 这些Web应用程序有这样一些共同点： 使用经典ASP代码的程序 使用SQL Server数据库的程序 应用程序代码根据URI请求字符动态地生成SQL查询（http://consoto.com/widgets.asp?widget=sprocket）这体现了一种新的SQL注入（SQL injection）的途径（http://msdn.microsoft.com/en-us/library/ms161953.aspx）。在过去，SQL注入攻击的目标是具有如下特点的特殊Web应用程序：攻击者知道或者可以探测出后台数据库的漏洞或者结构。这样的攻击（指本文讨论的攻击-译者注）不同，因为它是抽象的，对于攻击来说，任何存在于使用URI请求字符串动态创建SQL查询的ASP页面都可能存在。你可以在 http://blogs.technet.com/neilcar/archive/2008/03/15/anatomy-of-a-sql-injection-incident-part-2-meat.aspx找到更多的技术详情和简单代码。 这样的攻击并非利用了Window、IIS、SQL Server或者其他底层代码的漏洞，而是利用了在这些平台上运行的由程序员自行编写的代码中的漏洞。Microsoft已经对这些攻击进行了彻底的调查，并且发现，他们和以往的Microsoft产品的补丁和0-day漏洞无关。你可以在http://blogs.technet.com/msrc/archive/2008/04/25/questions-about-web-server-attacks.aspx获取跟多的信息。  正如上面所指出的，这些攻击在近年来呈现一种增长的趋势。这至少与两个因素有关： 第一，有暴力性的恶意攻击工具自动化进行此类操作。SANS在http://isc.sans.org/diary.html?storyid=4294讨论了这类工具。该工具使用搜索引擎来寻找具有SQL注入漏洞的站点。 第二，一个或多个恶意僵尸正在进行SQL注入攻击，用以广泛传播僵尸。SecureWorks在http://www.secureworks.com/research/threats/danmecasprox/讨论了一个案例。 一旦某台服务器被该漏洞所攻击，它将被插入指向某.js文件的恶意&#60;script&#62;标签。虽然这些文件的内容不同，但是他们都尝试利用已经被修复的Micfosoft产品的漏洞或者第三方ActiveX控件的漏洞。由于这些脚本被单独存储，这些脚本就很容易的被更新以利用更新的客户端漏洞，也更容易按照不同浏览器来定制。 给信息技术/数据库管理员的建议 有很多事情是信息技术管理员或者数据库管理员可以采取的，以减少他们的风险和响应他们的代码和平台中可能出现的事件： 检查IIS日志和数据表来寻找未知风险的标志。 由于该漏洞利用方式通过URI请求字符串作用，管理员们可以检查IIS日志来查找尝试利用该漏洞的非正常请求。你可以在http://blogs.technet.com/neilcar/archive/2008/03/15/anatomy-of-a-sql-injection-incident-part-2-meat.aspx找到如何手动进行改操作的详细信息。在 http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=WSUS&#38;ReleaseId=13436有进行自动化操作的工具。 如果IIS日志表明服务器可能已经被侵害，那么下一步要采取的行动就是审计相应的Web应用程序所使用的数据库中的表，并且查找附加在文本内容中的&#60;script&#62;标签。 提示：IIS服务器不应当在生产环境中关闭日志。存储和适当的管理对于IIS日志都是重要的，缺少IIS日志对于响应安全事件是非常困难的。 如果运行了使用后端数据库的第三方代码，则考虑不受SQL注入影响的独立软件开发商（ISV，Independent Software Vendors）。 在使用第三方ASP Web程序的情况下，管理员应当联系应用程序厂商来确定他们的产品不受SQL注入攻击的影响。 确认Web应用程序所使用的数据库帐户具有最少的权限。 管理员应当确保Web应用程序所使用的SQL用户具有最小的必要权限。Web应用程序不应当以诸如&#8221;sysadmin&#8221;的服务器管理员权限或者&#8221;db_owner&#8221;的数据库权限链接。白皮书&#8221;在SQL Server 2005中的最优化安全设置和维护&#8221;： http://download.microsoft.com/download/8/5/e/85eea4fa-b3bb-4426-97d0-7f7151b2011c/SQL2005SecBestPract.doc 提供了关于SQL Server安全的多方面建议。 给Web开发者的建议 有很多优秀的文档论述在编码时如何防御SQL注入攻击。由于这些攻击者leverage有漏洞的Web应用程序代码，所以完全防御他们的唯一方法是解析在代码中存在的漏洞。程序中任何一个使用外部资源（一般指从URI请求字符串）数据来动态生成SQL请求的地方都应当被认为是可疑的。当代码漏洞被识别出来，他们应当被小心的修复。 说明-SQL注入、ASP.NET和ADO.NET ： http://msdn.microsoft.com/en-us/library/bb671351.aspx 同时，上面的文章包含到相关文章&#8221;如何在ASP.NET中避免SQL注入&#8221; http://msdn.microsoft.com/en-us/library/ms998271.aspx，该文章同时适用于ASP。 这里有一个非常有用的视频（该视频是针对一篇防御文章的，然而链接可能已经无效了）：http://channel9.msdn.com/wiki/default.aspx/SecurityWiki.SQLInjectionLab。 关于SQL注入如何实现的简单信息： http://msdn.microsoft.com/en-us/library/ms161953.aspx ASP代码中的SQL注入（与ASP.NET中的并不相同）： http://msdn.microsoft.com/en-us/library/cc676512.aspx 如何在ASP中执行SQL Server存储过程： http://support.microsoft.com/kb/q164485 Microsoft安全部门（The [...]]]></description>
			<content:encoded><![CDATA[<p>本文翻译自微软博客上刊载的相关文章，英文原文版权归原作者所有，特此声明。</p>
<p>原文：<a href="http://blogs.technet.com/swi/archive/2008/05/29/sql-injection-attack.aspx">http://blogs.technet.com/swi/archive/2008/05/29/sql-injection-attack.aspx</a></p>
<p>本文译言地址：<a href="http://www.yeeyan.com/articles/view/hanguofeng/8955">http://www.yeeyan.com/articles/view/hanguofeng/8955</a></p>
<p><span id="more-19"></span></p>
<p>（特别感谢<a href="http://blogs.technet.com/neilcar">Neil Carpenter</a>对本文写作提供的帮助）</p>
<h2>近期趋势</h2>
<p>从去年下半年开始，很多网站被损害，他们在用于生成动态网页的SQL数据库中存储的文本中被注入了恶意的HTML &lt;script&gt;标签。这样的攻击在2008年第一季度开始加速传播，并且持续影响有漏洞的Web程序。<br />
这些Web应用程序有这样一些共同点：</p>
<ul>
<li>使用经典ASP代码的程序</li>
<li>使用SQL Server数据库的程序</li>
</ul>
<p>应用程序代码根据URI请求字符动态地生成SQL查询（http://consoto.com/widgets.asp<strong>?widget=sprocket</strong>）这体现了一种新的SQL注入（SQL injection）的途径（<a href="http://msdn.microsoft.com/en-us/library/ms161953.aspx">http://msdn.microsoft.com/en-us/library/ms161953.aspx</a>）。在过去，SQL注入攻击的目标是具有如下特点的特殊Web应用程序：攻击者知道或者可以探测出后台数据库的漏洞或者结构。这样的攻击（指本文讨论的攻击-译者注）不同，因为它是抽象的，对于攻击来说，任何存在于使用URI请求字符串动态创建SQL查询的ASP页面都可能存在。你可以在 <a href="http://blogs.technet.com/neilcar/archive/2008/03/15/anatomy-of-a-sql-injection-incident-part-2-meat.aspx">http://blogs.technet.com/neilcar/archive/2008/03/15/anatomy-of-a-sql-injection-incident-part-2-meat.aspx</a>找到更多的技术详情和简单代码。</p>
<p>这样的攻击并非利用了Window、IIS、SQL Server或者其他底层代码的漏洞，而是利用了在这些平台上运行的由程序员自行编写的代码中的漏洞。Microsoft已经对这些攻击进行了彻底的调查，并且发现，他们和以往的Microsoft产品的补丁和0-day漏洞无关。你可以在<span style="text-decoration: underline;"><a href="http://blogs.technet.com/msrc/archive/2008/04/25/questions-about-web-server-attacks.aspx">http://blogs.technet.com/msrc/archive/2008/04/25/questions-about-web-server-attacks.aspx</a></span>获取跟多的信息。</p>
<p> 正如上面所指出的，这些攻击在近年来呈现一种增长的趋势。这至少与两个因素有关：</p>
<p>第一，有暴力性的恶意攻击工具自动化进行此类操作。SANS在<a href="http://isc.sans.org/diary.html?storyid=4294">http://isc.sans.org/diary.html?storyid=4294</a>讨论了这类工具。该工具使用搜索引擎来寻找具有SQL注入漏洞的站点。</p>
<p>第二，一个或多个恶意僵尸正在进行SQL注入攻击，用以广泛传播僵尸。SecureWorks在<a href="http://www.secureworks.com/research/threats/danmecasprox/">http://www.secureworks.com/research/threats/danmecasprox/</a>讨论了一个案例。</p>
<p>一旦某台服务器被该漏洞所攻击，它将被插入指向某.js文件的恶意&lt;script&gt;标签。虽然这些文件的内容不同，但是他们都尝试利用已经被修复的Micfosoft产品的漏洞或者第三方ActiveX控件的漏洞。由于这些脚本被单独存储，这些脚本就很容易的被更新以利用更新的客户端漏洞，也更容易按照不同浏览器来定制。</p>
<h2>给信息技术/数据库管理员的建议</h2>
<p>有很多事情是信息技术管理员或者数据库管理员可以采取的，以减少他们的风险和响应他们的代码和平台中可能出现的事件：</p>
<ul>
<li><strong>检查IIS日志和数据表来寻找未知风险的标志。</strong></li>
</ul>
<p>由于该漏洞利用方式通过URI请求字符串作用，管理员们可以检查IIS日志来查找尝试利用该漏洞的非正常请求。你可以在<a href="http://blogs.technet.com/neilcar/archive/2008/03/15/anatomy-of-a-sql-injection-incident-part-2-meat.aspx">http://blogs.technet.com/neilcar/archive/2008/03/15/anatomy-of-a-sql-injection-incident-part-2-meat.aspx</a>找到如何手动进行改操作的详细信息。在 <a href="http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=WSUS&amp;ReleaseId=13436">http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=WSUS&amp;ReleaseId=13436</a>有进行自动化操作的工具。</p>
<p>如果IIS日志表明服务器可能已经被侵害，那么下一步要采取的行动就是审计相应的Web应用程序所使用的数据库中的表，并且查找附加在文本内容中的&lt;script&gt;标签。</p>
<p>提示：IIS服务器不应当在生产环境中关闭日志。存储和适当的管理对于IIS日志都是重要的，缺少IIS日志对于响应安全事件是非常困难的。</p>
<ul>
<li><strong>如果运行了使用后端数据库的第三方代码，则考虑不受SQL注入影响的独立软件开发商（ISV，Independent Software Vendors）。</strong></li>
</ul>
<p>在使用第三方ASP Web程序的情况下，管理员应当联系应用程序厂商来确定他们的产品不受SQL注入攻击的影响。</p>
<ul>
<li><strong>确认Web应用程序所使用的数据库帐户具有最少的权限。</strong></li>
</ul>
<p>管理员应当确保Web应用程序所使用的SQL用户具有最小的必要权限。Web应用程序不应当以诸如&#8221;sysadmin&#8221;的服务器管理员权限或者&#8221;db_owner&#8221;的数据库权限链接。白皮书&#8221;在SQL Server 2005中的最优化安全设置和维护&#8221;： <span style="text-decoration: underline;"><a href="http://download.microsoft.com/download/8/5/e/85eea4fa-b3bb-4426-97d0-7f7151b2011c/SQL2005SecBestPract.doc">http://download.microsoft.com/download/8/5/e/85eea4fa-b3bb-4426-97d0-7f7151b2011c/SQL2005SecBestPract.doc</a></span> 提供了关于SQL Server安全的多方面建议。</p>
<h2>给Web开发者的建议</h2>
<p>有很多优秀的文档论述在编码时如何防御SQL注入攻击。由于这些攻击者leverage有漏洞的Web应用程序代码，所以完全防御他们的唯一方法是解析在代码中存在的漏洞。程序中任何一个使用外部资源（一般指从URI请求字符串）数据来动态生成SQL请求的地方都应当被认为是可疑的。当代码漏洞被识别出来，他们应当被小心的修复。</p>
<ul>
<li><strong>说明</strong><strong>-SQL</strong><strong>注入、</strong><strong>ASP.NET</strong><strong>和</strong><strong>ADO.NET</strong> <strong>：</strong></li>
</ul>
<p><a href="http://msdn.microsoft.com/en-us/library/bb671351.aspx">http://msdn.microsoft.com/en-us/library/bb671351.aspx</a><br />
同时，上面的文章包含到相关文章&#8221;如何在ASP.NET中避免SQL注入&#8221; <a href="http://msdn.microsoft.com/en-us/library/ms998271.aspx">http://msdn.microsoft.com/en-us/library/ms998271.aspx</a>，该文章同时适用于ASP。</p>
<p>这里有一个非常有用的视频（该视频是针对一篇防御文章的，然而链接可能已经无效了）：<a href="http://channel9.msdn.com/wiki/default.aspx/SecurityWiki.SQLInjectionLab">http://channel9.msdn.com/wiki/default.aspx/SecurityWiki.SQLInjectionLab</a>。</p>
<ul>
<li><strong>关于</strong><strong>SQL</strong><strong>注入如何实现的简单信息：</strong></li>
</ul>
<p><a href="http://msdn.microsoft.com/en-us/library/ms161953.aspx">http://msdn.microsoft.com/en-us/library/ms161953.aspx</a></p>
<ul>
<li><strong>ASP</strong><strong>代码中的SQL注入（与ASP.NET中的并不相同）：</strong></li>
</ul>
<p><a href="http://msdn.microsoft.com/en-us/library/cc676512.aspx">http://msdn.microsoft.com/en-us/library/cc676512.aspx</a><br />
如何在ASP中执行SQL Server存储过程： <a href="http://support.microsoft.com/kb/q164485">http://support.microsoft.com/kb/q164485</a></p>
<ul>
<li><strong>Microsoft</strong><strong>安全部门（The Microsoft Security Development Lifecycle,SDL）对SQL注入的防御进行了一些指导。简单来说有三种策略来应对SQL注入攻击：</strong></li>
</ul>
<ol>
<li>使用SQL参数查询</li>
<li>使用存储过程</li>
<li>使用SQL仅执行（execute-only）许可</li>
</ol>
<p>Michael Howard在<a href="http://blogs.msdn.com/sdl/archive/2008/05/15/giving-sql-injection-the-respect-it-deserves.aspx">http://blogs.msdn.com/sdl/archive/2008/05/15/giving-sql-injection-the-respect-it-deserves.aspx</a>谈论了这些内容。</p>
<p>同时，编写安全的代码（第二版）也指导了如何防御此类攻击（请浏览399-411页）。</p>
<ul>
<li><strong>减轻SQL注入：使用参数查询（第一部分和第二部分）。使用参数化查询的好处是它将执行的代码（例如SELECT语句）和数据（由程序使用者提供的动态信息）分开。该途径防御了通过用户传递来执行的恶意语句。</strong></li>
</ul>
<p>第一部分：<br />
<a href="http://blogs.technet.com/neilcar/archive/2008/05/21/sql-injection-mitigation-using-parameterized-queries.aspx">http://blogs.technet.com/neilcar/archive/2008/05/21/sql-injection-mitigation-using-parameterized-queries.aspx</a></p>
<p>第二部分：<br />
<a href="http://blogs.technet.com/neilcar/archive/2008/05/23/sql-injection-mitigation-using-parameterized-queries-part-2-types-and-recordsets.aspx">http://blogs.technet.com/neilcar/archive/2008/05/23/sql-injection-mitigation-using-parameterized-queries-part-2-types-and-recordsets.aspx</a></p>
<p>在经典ASP代码中过滤SQL注入（或者黑名单中的字符），我们将如下的工作认为是实际中临时性的解决方案，因为它治标不治本。（例如，代码仍然是有漏洞的，他仍然可能被绕过过滤机制而被访问到）<br />
IIS团队中的Nazim解释了如何过滤的详细信息：<a href="http://blogs.iis.net/nazim/archive/2008/04/28/filtering-sql-injection-from-classic-asp.aspx">http://blogs.iis.net/nazim/archive/2008/04/28/filtering-sql-injection-from-classic-asp.aspx</a>。</p>
<p>如果你仍然不了解从哪里开始，所有使用特定ASP代码访问数据库，尤其是使用由用户提供的数据的代码应当首先被检测。</p>
<h2>给最终用户的建议</h2>
<p>最终用户（下简称用户-译者注）应当浏览位于<a href="http://www.microsoft.com/protect/default.mspx">http://www.microsoft.com/protect/default.mspx</a>的信息。另外，这里也有一些你可以采取以保护自己的步骤。</p>
<ul>
<li><strong>通常应当有选择的访问网站-但是也需要了解，该漏洞也会影响用户信任的网站。</strong></li>
</ul>
<p>有选择的访问网站减少了你暴露在漏洞下的风险，当然即使是你所信任的也有可能被攻击。留意不正常的行为，了解面临的风险，并且实施本节提供的其他建议。</p>
<ul>
<li><strong>针对Microsoft和第三方软件，保持安全更新。</strong></li>
</ul>
<p>由于恶意代码通常利用了已知的漏洞，因此你应当确保你在运行最新进行安全更新过的的Microsoft和第三方软件。Microsoft安全更新可以通过<a href="http://update.microsoft.com/">http://update.microsoft.com</a>了解。<a href="http://www.microsoft.com/protect/computer/updates/OS.aspx">http://www.microsoft.com/protect/computer/updates/OS.aspx</a>有更多信息。</p>
<ul>
<li><strong>禁用不必要的ActiveX控件和IE加载项。</strong></li>
</ul>
<p>你应当禁用所有不必要的ActiveX控件和IE加载项。根据KB883256（<a href="http://support.microsoft.com/kb/883256">http://support.microsoft.com/kb/883256</a>）的方法在Windows XP Service Pack2或者更新版本中来实施本步骤：</p>
<ol>
<li>打开IE。</li>
<li>在&#8221;工具&#8221;菜单点击管理加载项。</li>
<li>点击加载项的名称。</li>
<li>使用如下的方法：
<ul>
<li>点击更新ActiveX来使用最新的版本替换该控件。这个方法并非对所有的加载项都可用。</li>
<li>点击&#8221;启用&#8221;，而后点击&#8221;确定&#8221;，来启用加载项。</li>
<li>点击&#8221;禁用&#8221;，而后点击&#8221;确定&#8221;，来禁用加载项。</li>
</ul>
</li>
</ol>
<p>你可能需要重启IE来确保在启用/禁用插件的操作成功。<br />
针对更糟的操作系统，根据KB154036（<a href="http://support.microsoft.com/kb/154036">http://support.microsoft.com/kb/154036</a>）的说明进行操作。</p>
<ul>
<li><strong>减少你所使用的第三方浏览器的受攻击风险的步骤。</strong></li>
</ul>
<p>如果你使用了IE之外的浏览器，那么你应当确保你安装的是最新的安全更新版本，同时你应当禁用了不必要的扩展和加载项。流行浏览器的信息可以在如下链接找到：</p>
<p>Firefox &#8211; <a href="http://support.mozilla.com/en-US/kb/Firefox+Support+Home+Page">http://support.mozilla.com/en-US/kb/Firefox+Support+Home+Page</a><br />
Opera &#8211; <a href="http://www.opera.com/support/">http://www.opera.com/support/</a><br />
Safari &#8211; <a href="http://www.apple.com/support/safari/">http://www.apple.com/support/safari/</a></p>
<ul>
<li><strong>更新反恶意程序软件</strong></li>
</ul>
<p>用户应当确保已经安装了杀毒软件和反间谍软件，并且保持他们的更新。你可以在<a href="http://www.microsoft.com/protect/computer/antivirus/OS.aspx">http://www.microsoft.com/protect/computer/antivirus/OS.aspx</a>和<a href="http://www.microsoft.com/protect/computer/antispyware/OS.aspx">http://www.microsoft.com/protect/computer/antispyware/OS.aspx</a>找到更多信息。你可以在 <a href="http://onecare.live.com/standard/en-us/install/install.htm">http://onecare.live.com/standard/en-us/install/install.htm</a>得到一份90天使用的Windows Live OneCare杀毒/反间谍软件。</p>
<p class="zoundry_raven_tags"><!-- Tag links generated by Zoundry Raven. Do not manually edit. http://www.zoundryraven.com --><span class="ztags"><span class="ztagspace">Del.icio.us</span> : <a class="ztag" rel="tag" href="http://del.icio.us/tag/SQL%20Injection">SQL Injection</a>, <a class="ztag" rel="tag" href="http://del.icio.us/tag/SQL%E6%B3%A8%E5%85%A5">SQL注入</a>, <a class="ztag" rel="tag" href="http://del.icio.us/tag/%E7%BF%BB%E8%AF%91">翻译</a></span></p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-class-reference" title="[译文]Google AJAX Language API对象参考">[译文]Google AJAX Language API对象参考</a></li><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide" title="[译文]Google AJAX Language API开发者参考">[译文]Google AJAX Language API开发者参考</a></li><li><a href="http://www.hanguofeng.cn/archives/security/preventing-csrf" title="[译文]防止CSRF攻击">[译文]防止CSRF攻击</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/security/sql-injection-attack/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>逝去就别怀念</title>
		<link>http://www.hanguofeng.cn/archives/life/remember-2008-china-earthquake?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=remember-2008-china-earthquake</link>
		<comments>http://www.hanguofeng.cn/archives/life/remember-2008-china-earthquake#comments</comments>
		<pubDate>Mon, 19 May 2008 14:41:51 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[哀悼]]></category>
		<category><![CDATA[地震]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=18</guid>
		<description><![CDATA[真的猛士，敢于直面惨淡的人生，敢于正视淋漓的鲜血。  然而我们又如何面对刹那间多少孩子变成孤儿，多少妻子失去丈夫，多少老人失去子女，又有多少家庭消失在湮没之中呢，我们如何直面，我们如何正视？ 2008年5月12日14点28分，一个灾难的时刻。 灾难，往往让人们有痛彻心扉的清醒，我不愿一次次的阅读人们的灾难回忆，不愿意去看新闻播报里面随时增长的伤亡人数，更是不敢去看让人潸然泪下的视频，在这里，我是一个懦弱者。 古人说，患难见真情，这次灾难我深深感受到了这点，我的朋友们，我敬佩你们的泪水与慷慨。 我将永远记忆在灾难中的所见、所闻，我将记住你们的哀痛和坚强，我将记住你们的，爱。 原逝者安息，生者坚强。 随机内容新玄猫,新博客Windows下AMP平台配置FastCGI方法（以xampp为基础）Google Language for WordPress]]></description>
			<content:encoded><![CDATA[<blockquote><p>真的猛士，敢于直面惨淡的人生，敢于正视淋漓的鲜血。 </p></blockquote>
<p>然而我们又如何面对刹那间多少孩子变成孤儿，多少妻子失去丈夫，多少老人失去子女，又有多少家庭消失在湮没之中呢，我们如何直面，我们如何正视？<span id="more-18"></span></p>
<p>2008年5月12日14点28分，一个灾难的时刻。</p>
<p>灾难，往往让人们有痛彻心扉的清醒，我不愿一次次的阅读人们的灾难回忆，不愿意去看新闻播报里面随时增长的伤亡人数，更是不敢去看让人潸然泪下的视频，在这里，我是一个懦弱者。</p>
<p>古人说，患难见真情，这次灾难我深深感受到了这点，我的朋友们，我敬佩你们的泪水与慷慨。</p>
<p>我将永远记忆在灾难中的所见、所闻，我将记住你们的哀痛和坚强，我将记住你们的，爱。</p>
<p>原逝者安息，生者坚强。</p>
<p><object width="400" height="300"><param name="movie" value="http://www.tudou.com/v/UeChSccakXw"></param><param name="allowScriptAccess" value="always"></param><param name="wmode" value="transparent"></param><embed src="http://www.tudou.com/v/UeChSccakXw" type="application/x-shockwave-flash" width="400" height="300" allowFullScreen="true" wmode="transparent" allowScriptAccess="always"></embed></object></p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/beijing-winter-snow" title="北京·冬·有雪">北京·冬·有雪</a></li><li><a href="http://www.hanguofeng.cn/archives/life/summer-vacation-in-beijing" title="北京 仲夏夜之梦">北京 仲夏夜之梦</a></li><li><a href="http://www.hanguofeng.cn/archives/life/mop-in-memory" title="回忆当年在猫扑的故事">回忆当年在猫扑的故事</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/remember-2008-china-earthquake/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SNS与营销</title>
		<link>http://www.hanguofeng.cn/archives/ecommerce/sns-and-marketing?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=sns-and-marketing</link>
		<comments>http://www.hanguofeng.cn/archives/ecommerce/sns-and-marketing#comments</comments>
		<pubDate>Mon, 12 May 2008 12:15:40 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[电子商务]]></category>
		<category><![CDATA[SNS]]></category>
		<category><![CDATA[Web2.0]]></category>
		<category><![CDATA[新经济]]></category>
		<category><![CDATA[社会关系网络]]></category>
		<category><![CDATA[营销]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/ecommerce/sns-and-marketing</guid>
		<description><![CDATA[随着SNS概念的提出和发展，国内外SNS类型的网站如雨后春笋般建立并发展起来，在SNS网站改善传统营销和建立新的营销手段是营销观察者关注的热点。本文从SNS系统的特点入手，翔实分析了SNS对传统营销的促进以及其新营销模型的建立。]]></description>
			<content:encoded><![CDATA[<p><strong>[摘要]</strong>随着SNS概念的提出和发展，国内外SNS类型的网站如雨后春笋般建立并发展起来，在SNS网站改善传统营销和建立新的营销手段是营销观察者关注的热点。本文从SNS系统的特点入手，翔实分析了SNS对传统营销的促进以及其新营销模型的建立。<br />
<strong>[关键词]</strong>SNS 社会关系网络 营销 Web 2.0 新经济</p>
<p><span id="more-17"></span></p>
<h2>什么是SNS</h2>
<h3>SNS含义</h3>
<p>SNS，全称Social Networking Services，即社会性网络服务，专指旨在帮助人们建立社会性网络的互联网应用服务。SNS的出现和发展与六度分割理论（1967年，哈佛大学的心理学教授Stanley Milgram(1933～1984)创立了六度分割理论，简单地说：&#8221;你和任何一个陌生人之间所间隔的人不会超过六个，也就是说，最多通过六个人你就能够认识任何一个陌生人。&#8221;）是分不开的。</p>
<h3>SNS特点</h3>
<p>SNS有如下几个特色：</p>
<ul>
<li>个性化</li>
</ul>
<p>SNS的个性化提现在，在任何一个SNS系统中，你均有可以自己定制的很多元素，包括页面效果、隐私策略等，除此之外，还有很多自己发布的内容，如日志、图片、活动事件等，这些个性化构成了一个使用者主体在SNS网站上的个人形象，这个形象是使用者在使用SNS进行关系网络构建的基础，也是SNS网站开办者重要的数据资源基础。</p>
<ul>
<li>网络关系化</li>
</ul>
<p>SNS的特色决定了，使用者在网站上的核心目的就是进行社交，无论哪种SNS：基于校园的、基于社会的和基于商务的，均是以此作为SNS的主线模块进行设计的，这种在线的关系营销可能为使用者带来巨大的利益。</p>
<ul>
<li>社会影响化</li>
</ul>
<p>正如我上面所说的，SNS的网络关系化决定了人在其中是社会的一个元素，这种关系决定了人在其中的交互性，每个使用者都会在其中影响其他使用者，同时也会被其他使用者所影响，这种从众效应为SNS上面的营销活动奠定了社会基础。</p>
<ul>
<li>群组化</li>
</ul>
<p>群组化特色来源于&#8221;150法则&#8221;，150法则脱胎于从欧洲发源的&#8221; 赫特兄弟会&#8221; ，这是一个自给自足的农民自发组织，他们有一个不成文的严格规定: 每当聚居人数超过150人，就将其分成两个群体再各自发展。因此，150逐渐成为人们普遍公认的&#8221;我们可以与之保持社交关系的人数最大值&#8221;。在SNS系统中的用户，并非一窝蜂的聚集在一起，他们之间有着强烈的群组倾向，在SNS中，SNS网站的运营者经常以&#8221;网络&#8221;和&#8221;群组&#8221;来划分，前者是基于地域/学校/公司的硬性划分，后者是基于兴趣爱好的软性划分。</p>
<h3>常见的SNS网站</h3>
<ul>
<li>FaceBook</li>
</ul>
<p>FaceBook（脸谱网）是最著名的SNS网站了。最初的FaceBook是面向美国大学在校生的，由于这样的院校网络特点，迅速吸引了大量的大学生来注册。后来随着发展，他们改变了初衷，允许所有人加入，并以特殊的方式确定其所在的网络。除此之外，FaceBook的开放性吸引了很多的开发者，在FaceBook平台上开发的应用软件正在为几千万网民服务。</p>
<ul>
<li>校内网</li>
</ul>
<p>校内网是国内的一个校园SNS网站，他最初由归国技术人员王兴建立，后来被国内的千橡集团收购。校内网是国内最早的SNS网站，由于运营得到，也是当前国内用户最多、人气最特的SNS网站，他与FaceBook类似，也在有了相当的用户基础之后，将其用户群体扩张而不局限于大学生。</p>
<ul>
<li>海内网</li>
</ul>
<p>海内网是上文提到的王兴所建立的另一个SNS网站，该网站从开始的时候就是面向所有群体的，但是他侧重于商务化的SNS关系。目前海内网正处在起步阶段，相信日后会有较大发展。</p>
<ul>
<li>一起网</li>
</ul>
<p>一起网是由国内著名互联网经理人谢文主持建立的一个新型SNS类网站，与上述网站有一些模式上的不同，他倾向于建立一个互联网的虚拟社会，而并非单纯的关系营销。</p>
<h2>SNS如何促进传统的营销效果</h2>
<p>SNS中的社会化关系网络中，每一个用户都是一个结点，而节点之间的连线则说明了用户之间的好友关系，现代的SNS中，通常鼓励用户为这条线加一个标注，来说明他们之间的关系类型，例如，同学、同事、朋友、网友、亲人等。毫无疑问的，社会学中证明人都有趋向性，所以SNS的使用者往往会倾向于选择其好友选择的商品或服务。<br />
SNS系统中，用户所提供的个性化信息包含了其对于商品的选择倾向信息，它可能包括，喜爱的影片，喜爱的歌手专辑，购买的商品等，这种信息最终将由SNS系统进行数据分析和挖掘之后，展示在用户的个性化页面上，甚至展示在用户的好友登陆后所看到的信息页，这种广告效应更具有针对性。<br />
除此之外，广告投放者还可以选取另外的方式进行针对性非常强的广告投放，例如：<br />
<strong>在广告产品相关领域的群组中进行投放</strong>。在SNS中，存在很多的兴趣群组，例如掌上游戏机爱好者、乒乓球爱好者等，那么作为SONY这种娱乐产品公司，就可以在掌上游戏机爱好者这样的群组中投放广告，由于该群组的页面访问者绝大多数为广告的预期受众，这样的广告转换率（即广告产生的购买行为者与页面浏览者的比率）会非常高，广告主的广告费用也达到了效用最大化。<br />
<strong>赞助相关群组</strong>。赞助相关群组主要是企业为了建立其在线口碑而进行的商务行为。一个企业可以赞助其产品目标客户广泛存在的群组，组织群组活动，并提供奖品，以这样的行为建立起在线形象和口碑，最终促进浏览者的购买率。<br />
以下是将这种广告方式和传统的站点页面展示广告的一个对比：<br />
<strong>表1</strong><strong>：SNS</strong><strong>中广告方式和传统的站点页面展示广告对比</strong></p>
<div style="TEXT-ALIGN: center">
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="120" valign="top"> </td>
<td width="204" valign="top">
<p style="TEXT-ALIGN: center"><strong>SNS</strong><strong>中的广告</strong></p>
</td>
<td width="204" valign="top">
<p style="TEXT-ALIGN: center"><strong>传统页面广告</strong></p>
</td>
</tr>
<tr>
<td width="120" valign="top">
<p style="TEXT-ALIGN: center"><strong>用户针对性</strong></p>
</td>
<td width="204" valign="top">
<p style="TEXT-ALIGN: center">强</p>
</td>
<td width="204" valign="top">
<p style="TEXT-ALIGN: center">弱</p>
</td>
</tr>
<tr>
<td width="120" valign="top">
<p style="TEXT-ALIGN: center"><strong>用户传递性</strong></p>
</td>
<td width="204" valign="top">
<p style="TEXT-ALIGN: center">强</p>
</td>
<td width="204" valign="top">
<p style="TEXT-ALIGN: center">无</p>
</td>
</tr>
<tr>
<td width="120" valign="top">
<p style="TEXT-ALIGN: center"><strong>转化率</strong></p>
</td>
<td width="204" valign="top">
<p style="TEXT-ALIGN: center">高</p>
</td>
<td width="204" valign="top">
<p style="TEXT-ALIGN: center">低</p>
</td>
</tr>
<tr>
<td width="120" valign="top">
<p style="TEXT-ALIGN: center"><strong>深度数据挖掘</strong></p>
</td>
<td width="204" valign="top">
<p style="TEXT-ALIGN: center">可行，难度小</p>
</td>
<td width="204" valign="top">
<p style="TEXT-ALIGN: center">可行，难度大</p>
</td>
</tr>
</tbody>
</table>
</div>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p><strong>案例：</strong><strong>Facebook</strong><strong>目标广告被指侵犯隐私</strong><br />
据国外媒体报道，社交网站Facebook实施其目标广告计划刚刚两周，就有部分用户表示，目标广告的信息提醒方式还有待加强；另一些用户认为，Facebook现有做法侵犯了用户个人隐私。<br />
Facebook此前称，允许各企业在Facebook网站创建自己页面，并根据用户及其好友的购买习惯和网络活动投放目标广告。但一些用户称，他们在Fandango、Overstock及其他网上商店购物后，从没有注意到位于自己浏览器一处角落的小盒子图标。该图标的作用是提醒用户，他们的购物信息将被Facebook共享。如果用户点击&#8221;不共享，谢谢&#8221;，则该图标将于20秒钟后消失。<br />
一些用户称，虽然下次登录Facebook时还会得到一次提醒，但如果用户立即访问好友页面或收发电子邮件，则很容易忽视第二次提醒。今年20岁的用户马修·赫尔夫戈特(Matthew Helfgott)表示，他的女朋友曾在Overstock上给他购买了一副手套，但并不清楚自己购物信息将被共享，她认为Facebook侵犯了其个人隐私。赫尔夫戈特认为Facebook应就信息共享发出更多提醒。<br />
去年期间，Facebook推出了用户追踪好友页面资料更新功能，此举立即遭到了用户反对。Facebook随后向用户道歉，并提供了相应屏蔽功能。针对Facebook的目标广告项目，约40家网站已安装了Facebook提供的Beacon免费工具，以向用户提供市场营销信息。但部分用户认为，Beacon将使自己的网上购物活动被别人监视，因而有侵犯隐私之嫌。Facebook对此表示，Beacon支持的信息共享只在用户好友范围内传播，用户信息并不会发送到所有Facebook用户中或互联网上，而且用户也可选择是否参与信息共享。<br />
自由主义组织MoveOn.org周二针对Facebook目标广告发起了抗议活动。截至周三，参与抗议的成员已超过6000人。MoveOn要求Facebook立即停止现有用户信息共享做法。MoveOn发言人亚当·格林(Adam Green)说：&#8221;我们要让Facebook意识到，用户非常担心他们的个人信息被公之于众&#8221;。23岁的Facebook用户奈特·维纳尔(Nate Weiner)则表示，如果某位用户购买了&#8221;如何治疗艾滋病&#8221;的书籍，他肯定不愿意让自己好友知道。（来自新浪科技）</p></blockquote>
<p>在上面的案例中，FaceBook由于对用户所购买商品进行记录和展示，并提供给相关企业，导致用户的反感和抗议。用户的行为数据信息和厂商所需要的信息其实并不矛盾，但是这里FaceBook没有处理好用户关系。FaceBook的运营商可以通过模仿Google对数据的记录和分析方式来进行相关的营销活动来规避此类风险。即，仅记录为某用户购买的商品，而并不记录具体的用户名，也就是将数据中的实体加以隐蔽，即可在不侵犯用户隐私的前提下进行商务信息的挖掘。</p>
<h2>SNS的新营销盈利模式</h2>
<h3>虚拟礼品</h3>
<p>虚拟礼品是典型的在SNS中的虚拟化实物服务，他允许SNS的使用者通过付费（在FaceBook中，通常是1美元）购买虚拟的礼品，并将其&#8221;赠送&#8221;给某个好友，在被赠送方的页面上，会显示其收到的礼品。应该说，这种出售虚拟化实物盈利的方式并非在SNS中最先出现，国内的腾讯公司将虚拟形象整合到其产品QQ中，建立了QQ秀这一产品，该产品并无任何实物，然而却构成了其互联网增值服务收入的一大部分。</p>
<h3>&#8220;飞页&#8221;</h3>
<p>FaceBook提供了可以由用户购买的显示在左侧导航栏下侧的小块广告，5美元可以购买2500次展示，只出现在其指定的高校相关页面上，每所高校另有集中展示。又称&#8221;飞页&#8221;，这非常类似于在大学校园常见的在布告栏张贴的小广告。</p>
<h3>网络口碑营销</h3>
<p>口碑营销是在Web2.0被强化的一种网络营销理念，口碑是没有商业目的的人际之间口头交流的关于品牌、 产品、 服务的信息或看法(Ardnt，1967) 。口碑传播在消费者信息收集、 评价及购买决策过程中发挥着重要的作用。口碑经常被消费者看作最重要的和使用最频繁的外部信息来源。口碑营销也一直是企业青睐的营销策略。<br />
SNS类网站的特点决定了其可以提供良好的口碑营销基础，一方面，企业可以通过选定特定精确范围的用户来撰写相关的产品体验日志来进行宣传，同时也可以根据其所撰写的日志结合各个用户的关系，进行营销的分析，从而对市场策略的指定进行指导。</p>
<h2>SNS的前景</h2>
<h3>Web API</h3>
<p>API即应用程序接口，Web API在Web 2.0中具有重大意义，通过Web API，各个领域的开发者可以调用SNS网站的数据或者实现SNS网站的服务接口，从而将SNS的功能增强由网站运营方大大拓展了。FaceBook的Web API非常多，他专门建立了开发者网站来组织开发者对其功能进行增强。</p>
<h3>虚拟社会</h3>
<p>随着互联网不断深入生活，网上的社会与现实的社会也原来越贴近了，我一直在设想着如果有那么一天，每当我们在现实中结识一个人的时候，都马上会在SNS网站上加他为好友，并且之间的关系有一半以上是在SNS网站上维护的。<br />
SNS无疑为现代紧张的社会环境提供了高效的关系管理工具，将显示社会映射到网络上，并且将现实的沟通成本降低，可能会从根本上改变人的生活方式。</p>
<h3>关系数据中心</h3>
<p>SNS系统中的关系数据是SNS的核心所在，如果能将这些数据加以整理和挖掘，则可以构成一个描述人们之间关系的巨大无向图。以这个图为数据基础，我们可以附加多种商业营销应用。SNS网站在向用户提供服务是同时，也从用户那里得到了这样的数据源，是价值关系的互换，最终实现了双赢。</p>
<h2>参考文献</h2>
<p>秦铁辉 桑晓琦《社会性网络服务的特点及其对企业竞争情报工作的影响》 《图书、情报、知识》2007年11月<br />
[美]卡罗 白朗《Inside Facebook》</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/uncategorized/2009-spring-festival" title="祝大家己丑年新春大吉，万事如意">祝大家己丑年新春大吉，万事如意</a></li><li><a href="http://www.hanguofeng.cn/archives/security/configure-fast-in-lamp-on-windows-with-xampp" title="Windows下AMP平台配置FastCGI方法（以xampp为基础）">Windows下AMP平台配置FastCGI方法（以xampp为基础）</a></li><li><a href="http://www.hanguofeng.cn/archives/life/birthday-of-22-years-old" title="生日快乐">生日快乐</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/ecommerce/sns-and-marketing/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Language for WordPress</title>
		<link>http://www.hanguofeng.cn/archives/web-server/google-language-for-wordpress?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=google-language-for-wordpress</link>
		<comments>http://www.hanguofeng.cn/archives/web-server/google-language-for-wordpress#comments</comments>
		<pubDate>Sun, 30 Mar 2008 02:58:57 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web服务器端技术]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/?p=13</guid>
		<description><![CDATA[Google Language for WordPress 相关内容[译文]Google AJAX Language API对象参考[译文]Google AJAX Language API开发者参考[译文]WordPress插件API手册]]></description>
			<content:encoded><![CDATA[<p>Google Language for WordPress</p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-class-reference" title="[译文]Google AJAX Language API对象参考">[译文]Google AJAX Language API对象参考</a></li><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide" title="[译文]Google AJAX Language API开发者参考">[译文]Google AJAX Language API开发者参考</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/wordpress-plugin-api" title="[译文]WordPress插件API手册">[译文]WordPress插件API手册</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-server/google-language-for-wordpress/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[译文]Google AJAX Language API对象参考</title>
		<link>http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-class-reference?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=google-ajax-language-api-class-reference</link>
		<comments>http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-class-reference#comments</comments>
		<pubDate>Sat, 22 Mar 2008 12:25:51 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web客户端技术]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-class-reference</guid>
		<description><![CDATA[原文：http://code.google.com/apis/ajaxlanguage/documentation/reference.html 译言链接：http://www.yeeyan.com/articles/view/hanguofeng/5896 对象参考 全局方法 方法 返回类型 描述 google.language.translate(text, srcLang, destLang, callback) 无 全局方法，返回对支持的给定文本的目标语言翻译匹配文本。结果支持通过指定的callback函数进行异步调用。 text &#8211; 要翻译的文本。 srcLang &#8211; 以语言代码形式表现的源语言。参考Language 枚举。如果改惨啊数是一个空字符串，则系统将尝试自动识别源语言。 destLang &#8211; 以语言代码形式表现的目标语言。参考Language 枚举。 callback &#8211; 接收结果的回调函数。 google.language.detect(text, callback) 无 全局方法，返回描述给定语言文本的语言代码。结果支持通过指定的callback函数进行异步调用。 text &#8211; 要翻译的文本 callback -接收结果的回调函数。 结果对象 翻译结果 &#60;result&#62; error?在载入feed时是否出现错误 codeHTTP风格的错误代码 message便与人阅读的错误描述文本 translation翻译后的文本 检测结果 &#60;result&#62; error?在载入feed时是否出现错误 codeAn HTTP风格的错误代码 message便与人阅读的错误描述文本 language给定语言的语言代码。参考Language 枚举 isReliable一个布尔型变量来描述给定文本是否是可靠的 confidence一个基于0-1.0之间的数值，用来描述对给定文本的可信级别 Language枚举 google [...]]]></description>
			<content:encoded><![CDATA[<p>原文：<a href="http://code.google.com/apis/ajaxlanguage/documentation/reference.html">http://code.google.com/apis/ajaxlanguage/documentation/reference.html</a></p>
<p>译言链接：<a href="http://www.yeeyan.com/articles/view/hanguofeng/5896">http://www.yeeyan.com/articles/view/hanguofeng/5896</a><span id="more-12"></span></p>
<h1>对象参考</h1>
<h2>全局方法</h2>
<table border="1" width="500" cellPadding="0" cellSpacing="0">
<tr>
<td width="200" vAlign="top">
<p align="center"><strong>方法</strong></p>
</td>
<td width="50" vAlign="top">
<p align="center"><strong>返回类型</strong></p>
</td>
<td width="250" vAlign="top">
<p align="center"><strong>描述</strong></p>
</td>
</tr>
<tr>
<td width="187" vAlign="top">google.language.translate(text, srcLang, destLang, callback)</td>
<td width="77" vAlign="top">无</td>
<td width="289" vAlign="top">全局方法，返回对支持的给定文本的目标语言翻译匹配文本。结果支持通过指定的callback函数进行异步调用。</p>
<ul>
<li><strong>text</strong> &#8211; 要翻译的文本。</li>
<li><strong>srcLang</strong> &#8211; 以语言代码形式表现的源语言。参考Language 枚举。如果改惨啊数是一个空字符串，则系统将尝试自动识别源语言。</li>
<li><strong>destLang</strong> &#8211; 以语言代码形式表现的目标语言。参考Language 枚举。</li>
<li><strong>callback</strong> &#8211; 接收结果的回调函数。</li>
</ul>
</td>
</tr>
<tr>
<td width="187" vAlign="top">google.language.detect(text, callback)</td>
<td width="77" vAlign="top">无</td>
<td width="289" vAlign="top">全局方法，返回描述给定语言文本的语言代码。结果支持通过指定的callback函数进行异步调用。</p>
<ul>
<li><strong>text</strong> &#8211; 要翻译的文本</li>
<li><strong>callback</strong> -接收结果的回调函数。</li>
</ul>
</td>
</tr>
</table>
<h2>结果对象</h2>
<h3>翻译结果</h3>
<ul class="json">
<li>&lt;result&gt;
<ul>
<li>error?在载入feed时是否出现错误
<ul>
<li>code<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">HTTP风格的错误代码</a></li>
<li>message便与人阅读的错误描述文本</li>
</ul>
</li>
<li>translation翻译后的文本</li>
</ul>
</li>
</ul>
<h3>检测结果</h3>
<ul class="json">
<li>&lt;result&gt;
<ul>
<li>error?在载入feed时是否出现错误
<ul>
<li>codeAn <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">HTTP风格的错误代码</a></li>
<li>message便与人阅读的错误描述文本</li>
</ul>
</li>
<li>language给定语言的语言代码。参考Language 枚举</li>
<li>isReliable一个布尔型变量来描述给定文本是否是可靠的</li>
<li>confidence一个基于0-1.0之间的数值，用来描述对给定文本的可信级别</li>
</ul>
</li>
</ul>
<h3>Language枚举</h3>
<p>google language的language枚举提供了对于名称常量到语言代码的映射，用来描述srcLang和destLang参数。以下是用在Google Translate的相同代码：</p>
<pre class="prettyprint">
var google.language.Languages = {

  'ENGLISH' : 'en',

  'CHINESE' : 'zh',

  'CHINESE_SIMPLIFIED' : 'zh-CN',

  'CHINESE_TRADITIONAL' : 'zh-TW',

  'ARABIC' : 'ar',

  'FRENCH' : 'fr',

  'GERMAN' : 'de',

  'ITALIAN' : 'it',

  'JAPANESE' : 'ja',

  'KOREAN' : 'ko',

  'PORTUGUESE' : 'pt-PT',

  'RUSSIAN' : 'ru',

  'SPANISH' : 'es',

  'DUTCH': 'nl',

  'UNKNOWN' : ''

};</pre>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide" title="[译文]Google AJAX Language API开发者参考">[译文]Google AJAX Language API开发者参考</a></li><li><a href="http://www.hanguofeng.cn/archives/security/sql-injection-attack" title="SQL注入攻击-来自微软安全博客的建议">SQL注入攻击-来自微软安全博客的建议</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/google-language-for-wordpress" title="Google Language for WordPress">Google Language for WordPress</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-class-reference/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[译文]Google AJAX Language API开发者参考</title>
		<link>http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=google-ajax-language-api-developers-guide</link>
		<comments>http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide#comments</comments>
		<pubDate>Sat, 22 Mar 2008 12:13:15 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web客户端技术]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide</guid>
		<description><![CDATA[原文：http://code.google.com/apis/ajaxlanguage/documentation/ 译言链接：http://www.yeeyan.com/articles/view/hanguofeng/5895 开发者参考 使用AJAX Language API，你可以仅使用JavaScript来完成对某个网页上某个区域的语言进行翻译和检测的工作。 API是新开发的，因此相对于一个完美的文档来说，可能有一些bug和微小的不足。我们会修补这些漏洞，因此请谅解、你可以加入AJAX APIs开发者论坛来给我们反馈和讨论这个API。 面向读者 本文档是面向对JavaScript编程和面向对象编程概念有所了解的人准备的。在互联网上有很多JavaScript教程。 介绍 在Google Ajax Language API上的&#8221;Hello,World&#8221;程序 开始学习本API的最简单方法是来看一个简单的例子，一下案例将检测给定语言，并且将其翻译为英文。 &#60;html&#62;   &#60;head&#62;   &#60;script type="text/javascript" src="http://www.google.com/jsapi"&#62;&#60;/script&#62;   &#60;script type="text/javascript"&#62; google.load("language", "1"); function initialize() {   var text = document.getElementById("text").innerHTML;   google.language.detect(text, function(result) {   if (!result.error &#38;&#38; result.language) {   google.language.translate(text, result.language, "en",   function(result) {   var [...]]]></description>
			<content:encoded><![CDATA[<p>原文：<a href="http://code.google.com/apis/ajaxlanguage/documentation/">http://code.google.com/apis/ajaxlanguage/documentation/</a></p>
<p>译言链接：<a href="http://www.yeeyan.com/articles/view/hanguofeng/5895">http://www.yeeyan.com/articles/view/hanguofeng/5895</a><br />
<span id="more-11"></span></p>
<h1>开发者参考</h1>
<p>使用AJAX Language API，你可以仅使用JavaScript来完成对某个网页上某个区域的语言进行翻译和检测的工作。</p>
<p>API是新开发的，因此相对于一个完美的文档来说，可能有一些bug和微小的不足。我们会修补这些漏洞，因此请谅解、你可以加入<a href="http://groups.google.com/group/Google-AJAX-Search-API">AJAX APIs开发者论坛</a>来给我们反馈和讨论这个API。</p>
<h2>面向读者</h2>
<p>本文档是面向对JavaScript编程和面向对象编程概念有所了解的人准备的。在互联网上有很多<a href="http://www.google.com/search?q=javascript+tutorials">JavaScript教程</a>。</p>
<h2>介绍</h2>
<h3>在Google Ajax Language API上的&#8221;Hello,World&#8221;程序</h3>
<p>开始学习本API的最简单方法是来看一个简单的例子，一下案例将检测给定语言，并且将其翻译为英文。</p>
<pre class="prettyprint">
&lt;html&gt;

  &lt;head&gt;

    &lt;script type="text/javascript" src="http://www.google.com/jsapi"&gt;&lt;/script&gt;

    &lt;script type="text/javascript"&gt;    google.load("language", "1");

function initialize() {

      var text = document.getElementById("text").innerHTML;

      google.language.detect(text, function(result) {

        if (!result.error &amp;&amp; result.language) {

   google.language.translate(text, result.language, "en",

                             function(result) {

     var translated = document.getElementById("translation");

     if (result.translation) {

       translated.innerHTML = result.translation;

            }

          });

        }

      });

    }

    google.setOnLoadCallback(initialize);

&lt;/script&gt;

  &lt;/head&gt;

  &lt;body&gt;

    &lt;div id="text"&gt;你好，很高興見到你。&lt;/div&gt;

    &lt;div id="translation"&gt;&lt;/div&gt;

  &lt;/body&gt;

&lt;/html&gt;</pre>
<p>你可以<a href="http://code.google.com/apis/ajaxlanguage/documentation/helloworld.html">在这里查看该案例</a>，并且随意修改和运行它。</p>
<h3>在你的网页中包含Ajax Language API</h3>
<p>为了在你的网页中加入AJAX Language API，你需要利用<a href="http://code.google.com/apis/ajax/documentation/">Google AJAX API Loader</a>。该公有加载类允许你加载你所需要的所有AJAX API，包括这里的language API。你需要同时包含Google AJAX APIs的script标签并且调用google.load(&#8220;language&#8221;,&#8221;1&#8243;);。</p>
<pre class="prettyprint">&lt;script type="text/javascript" src="http://www.google.com/jsapi" mce_src="http://www.google.com/jsapi"&gt;&lt;/script&gt;

&lt;script type="text/javascript"&gt;

  google.load("language", "1");

&lt;/script&gt;</pre>
<p>第一个script标签加载了google.load函数，这个函数允许你加载特定的 Google API。google.load(&#8220;language&#8221;,&#8221;1&#8243;)加载了Language API的第一版。当前，AJAX Language API的版本为1，但是不久后新版本将可以使用。参考下面的<a href="http://code.google.com/apis/ajaxlanguage/documentation/#Versioning">版本讨论</a>来获得更多信息。</p>
<h3>API 更新</h3>
<p>google.load函数的第二个参数实际上是你所使用的AJAX Language API的版本。当前，AJAX Language API的版本为1，但是不久后新版本将可以使用。</p>
<p>如果以后我们对API进行重要更新，我们将改变版本号，并且在<a href="http://code.google.com/">Google Code</a>和<a href="http://googleajaxsearchapi.blogspot.com/">AJAX APIS 讨论</a>中发布通知。当该事件发生后，我们预期会在至少一个月的时间内继续支持所有版本来使你有足够的时间来迁移你的代码。</p>
<p>AJAX Language API团队对于最近日较的Bug修复和平台优化进行定期更新。这些Bug修复应当仅提高表现和修复Bug，但是我们有可能不小心破坏某些API用户、请使用<a href="http://googleajaxsearchapi.blogspot.com/">AJAX APIs 讨论组</a>来报告这样的问题。</p>
<h2>实例</h2>
<h3>语言翻译</h3>
<p>本案例展示了一个简单的对一个JavaScript字符串变量进行翻译的过程。</p>
<pre class="prettyprint">
google.language.translate("Hello world", "en", "es", function(result) {

  if (!result.error) {

    var container = document.getElementById("translation");

    container.innerHTML = result.translation;

  }

});</pre>
<p><a href="http://code.google.com/apis/ajaxlanguage/documentation/translate.html">查看案例（translate.html）</a></p>
<h3>语言检测</h3>
<p>这个案例展示了对于一个JavaScript字符串的语言检测。将返回语言代码。</p>
<pre class="prettyprint">
var text = "¿Dónde está el baño?";

google.language.detect(text, function(result) {

  if (!result.error) {

    var language = 'unknown';

    for (l in google.language.Languages) {

      if (google.language.Languages[l] == result.language) {

        language = l;

        break;

      }

    }

    var container = document.getElementById("detection");

    container.innerHTML = text + " is: <strong>" + language + "</strong>";

  }

});</pre>
<p><a href="http://code.google.com/apis/ajaxlanguage/documentation/detection.html">查看案例 (detection.html)</a></p>
<h3>翻译时源检测</h3>
<p>如下的案例类似于基本的翻译案例，但是它展示了如何在不知道源语言时对文本进行翻译。通过传入一个空字符串来表示未知的源语言，系统将在一次调用中自动检测和翻译。</p>
<pre class="prettyprint">
google.language.translate("Hello world", "", "es", function(result) {

  if (!result.error) {

    var container = document.getElementById("translation");

    container.innerHTML = result.translation;

  }

});</pre>
<h2>更多案例</h2>
<p>这里有进行交互作用的两个附加案例。第一个案例对预输入的文本字符串进行语言检测，同时也允许输入其他的文本。它同时也显示信任和可靠因数（confidence and reliability factors-译者注）。</p>
<p><a href="http://www.google.com/uds/samples/language/detect.html">查看案例(detect.html)</a></p>
<p>第二个附加案例进行翻译。同时他也允许与上述类似的交互作用。</p>
<p><a href="http://www.google.com/uds/samples/language/translate.html">查看案例(translate.html)</a></p>
<h2>API细节</h2>
<h3>支持的语言</h3>
<p>Google AJAX Language API现在支持下列语言。该技术正在不断的提高，同时我们的团队也在努力的扩展这个列表，因此请经常回来看看。你也可以访问<a href="http://translate.google.com/">Google Translate</a>来查看最近更新的列表。</p>
<ul>
<li>Arabic （阿拉伯语）</li>
<li>Chinese (Simplified and Traditional) （中文简体）</li>
<li>Dutch （荷兰语）</li>
<li>English （英语）</li>
<li>French （法语）</li>
<li>German （德语）</li>
<li>Greek （希腊语）</li>
<li>Italian （意大利语）</li>
<li>Japanese （日语）</li>
<li>Korean （韩语）</li>
<li>Portuguese （葡萄牙语）</li>
<li>Russian （俄语）</li>
<li>Spanish（西班牙语）</li>
</ul>
<h3>支持的语言翻译对</h3>
<p>Google AJAX Language API现在支持下列语言翻译对。该技术正在不断的提高，同时我们的团队也在努力的扩展这个列表，因此请经常回来看看。你也可以访问<a href="http://translate.google.com/">Google Translate</a>来查看最近更新的列表。</p>
<ul>
<li>Arabic to English （阿拉伯语到英语）</li>
<li>Chinese to English （中文到英语）</li>
<li>Chinese (Simplified to Traditional) （简体中文到繁体中文）</li>
<li>Chinese (Traditional to Simplified) （繁体中文到简体中文）</li>
<li>Dutch to English （荷兰语到英语）</li>
<li>English to Arabic （英语到阿拉伯语）</li>
<li>English to Chinese (Simplified) （英语到简体中文）</li>
<li>English to Chinese (Traditional) （英语到繁体中文）</li>
<li>English to Dutch （英语到荷兰语）</li>
<li>English to French （英语到法语）</li>
<li>English to German （英语到德语）</li>
<li>English to Greek （英语到希腊语）</li>
<li>English to Italian （英语到意大利语）</li>
<li>English to Japanese （英语到日语）</li>
<li>English to Korean （英语到韩语）</li>
<li>English to Portuguese （英语到葡萄牙语）</li>
<li>English to Russian （英语到俄语）</li>
<li>English to Spanish （英语到西班牙语）</li>
<li>French to English （法语到英语）</li>
<li>French to German （法语到德语）</li>
<li>German to English （德语到英语）</li>
<li>German to French （德语到法语）</li>
<li>Greek to English （希腊语到英语）</li>
<li>Italian to English （意大利语到英语）</li>
<li>Japanese to English （日语到英语）</li>
<li>Korean to English （韩语到英语）</li>
<li>Portuguese to English （葡萄牙语到英语）</li>
<li>Russian to English （俄语到英语）</li>
<li>Spanish to English（西班牙语到英语）</li>
</ul>
<h2>问题解决</h2>
<p>如果在你的代码中遇到了问题：</p>
<ul>
<li>检查代码。请牢记JavaScript是对大小写敏感的语言。</li>
<li>使用JavaScript调试器、在Firefox中，你可以使用JavaScript控制台或者FireBug扩展。在IE中，你可以使用Microsoft Script Debugger。</li>
<li>在AJAX APIs讨论组中搜索。如果你找不到回答你问题的帖子，那么可以在讨论组中发布你的问题，并且包含指向你出问题的页面的链接。</li>
</ul>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-class-reference" title="[译文]Google AJAX Language API对象参考">[译文]Google AJAX Language API对象参考</a></li><li><a href="http://www.hanguofeng.cn/archives/security/sql-injection-attack" title="SQL注入攻击-来自微软安全博客的建议">SQL注入攻击-来自微软安全博客的建议</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/google-language-for-wordpress" title="Google Language for WordPress">Google Language for WordPress</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP串行化与JSON</title>
		<link>http://www.hanguofeng.cn/archives/web-server/php-serialize-json?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-serialize-json</link>
		<comments>http://www.hanguofeng.cn/archives/web-server/php-serialize-json#comments</comments>
		<pubDate>Wed, 19 Mar 2008 07:28:11 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web服务器端技术]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/web-server/php-serialize-json</guid>
		<description><![CDATA[Ok，各位亲爱的朋友，让我们开始这个新概念的旅程，串行化这个话题可能大家以前都没有多加关注，事情其实起源于那天我随便翻翻PHP手册，发现这个串行化的函数，之后闲来无聊又做一个WordPress的插件，这个时候顺便用了一下串行化，发现在某些场合的确非常方便。

先来解释下串行化：简单来说，串行化即将变量转换成字节流的过程。串行化的提出，有效的解决了对象的保存和传输的问题，举例来说，我在JavaScript中建立了一个对象，我现在想将这个对象保存到服务器端的数据库中，那么我如何进行操作呢，这个时候往往就用到了对象的串行化。在JavaScript的串行化中不得不提JSON，JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写，同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式，但是也使用了类似于C语言家族的习惯（包括C, C++, C#, Java, JavaScript, Perl, Python等）。这些特性使JSON成为理想的数据交换语言。]]></description>
			<content:encoded><![CDATA[<p>作者：hanguofeng[小韩]</p>
<p>发布于：经典论坛 玄猫的窝（作者的博客）</p>
<p>在经典论坛的连载地址：<a href="http://bbs.blueidea.com/thread-2838888-1-1.html">http://bbs.blueidea.com/thread-2838888-1-1.html</a></p>
<p>在作者博客的连载地址：<a href="http://www.hanguofeng.cn/archives/web-server/php-serialize-json">http://www.hanguofeng.cn/archives/web-server/php-serialize-json</a></p>
<p>本文Word完整版：<a href="http://docs.google.com/Doc?id=ajd3pzcpcjzg_22gpwvxshs">http://docs.google.com/Doc?id=ajd3pzcpcjzg_22gpwvxshs</a></p>
<p>本文遵从<a href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/" target="_blank">创作共用协议</a>（by-nc-sa）</p>
<p><span id="more-10"></span></p>
<h1>What 、Why、How</h1>
<h2>What</h2>
<p>Ok，各位亲爱的朋友，让我们开始这个新概念的旅程，串行化这个话题可能大家以前都没有多加关注，事情其实起源于那天我随便翻翻PHP手册，发现这个串行化的函数，之后闲来无聊又做一个WordPress的插件，这个时候顺便用了一下串行化，发现在某些场合的确非常方便。</p>
<p>先来解释下串行化：简单来说，串行化即将变量转换成字节流的过程。串行化的提出，有效的解决了对象的保存和传输的问题，举例来说，我在JavaScript中建立了一个对象，我现在想将这个对象保存到服务器端的数据库中，那么我如何进行操作呢，这个时候往往就用到了对象的串行化。在JavaScript的串行化中不得不提JSON，JSON(JavaScript<br />
Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写，同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition &#8211; December<br />
1999的一个子集。 JSON采用完全独立于语言的文本格式，但是也使用了类似于C语言家族的习惯（包括C, C++, C#, Java, JavaScript, Perl, Python等）。这些特性使JSON成为理想的数据交换语言。</p>
<p>人们通常将JSON和XML进行比较，二者都是将对象扁平化（稍后我们解释这个&#8221;扁平化&#8221;）的一种手段，XML的特点是结构严谨，而JSON的特点则是简单易读、容易使用程序进行分析，因为它能够很简单的将一个对象转换为一个字符流的形式，例如如下代码：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;type&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;human&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;name&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;hanguofeng&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;age&quot;</span><span style="color: #339933;">:</span><span style="color: #CC0000;">22</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>则是一个JSON表达式，他保存了一个对象，我们如何将它恢复为对象呢？很简单，如下：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> animal_str <span style="color: #339933;">=</span> <span style="color: #3366CC;">'{&quot;type&quot;:&quot;human&quot;,&quot;name&quot;:&quot;hanguofeng&quot;,&quot;age&quot;:22}'</span><span style="color: #339933;">;</span> 
&nbsp;
我们通过JavaScript的求值函数，将JSON表达式进行运算，并返回值，用以获得一个对象，到这里，我想你一定会和我一样，对JSON格式的创造者的思维佩服不已吧。
&nbsp;
本来说讲串行化的，<span style="color: #3366CC;">&quot;不小心&quot;</span>谈到JSON，并且讲了这么多，呵呵，跑题了吗？没有，PHP的串行化和JSON是非常像的，一个PHP的串行化表达式如下：</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">a<span style="color: #339933;">:</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">:</span><span style="color: #009900;">&#123;</span>s<span style="color: #339933;">:</span><span style="color: #cc66cc;">4</span><span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;type&quot;</span><span style="color: #339933;">;</span>s<span style="color: #339933;">:</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;human&quot;</span><span style="color: #339933;">;</span>s<span style="color: #339933;">:</span><span style="color: #cc66cc;">4</span><span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;name&quot;</span><span style="color: #339933;">;</span>s<span style="color: #339933;">:</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;hanguofeng&quot;</span><span style="color: #339933;">;</span>s<span style="color: #339933;">:</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;age&quot;</span><span style="color: #339933;">;</span>s<span style="color: #339933;">:</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;20&quot;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>他看起来结构和JSON有些类似，实际上，这个表达式是如下数组的串行化结果：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$animal</span> <span style="color: #339933;">=</span>
<span style="color: #009900;">&#40;</span>
&nbsp;
<span style="color: #0000ff;">&quot;type&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;human&quot;</span><span style="color: #339933;">,</span>
&nbsp;
<span style="color: #0000ff;">&quot;name&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;hanguofeng&quot;</span><span style="color: #339933;">,</span>
&nbsp;
<span style="color: #0000ff;">&quot;age&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;20&quot;</span>
&nbsp;
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>OK，上面的一些介绍只是让你大致看到串行化和JSON是什么样的东西，你无须对这里的代码过分纠结，我们在后面会详细讲解的，下面我们来谈谈为什么要使用串行化。</p>
<h2>Why</h2>
<p>串行化首先是作为数据传输的方便而出现的，正如本文开始我提出的问题，我在JavaScript中建立了一个对象，我现在想将这个对象保存到服务器端的数据库中，应该如何做，这其实上是一个&#8221;我如何将一个对象从浏览器提交到服务器&#8221;的问题，在这个传输过程中，我们知道，实际上只能够传递字符流，字符流是一维（扁平）的，然而很多对象却是多维的，如果要传递的对象是一个字符串，那么很简单，我们直接将其作为传递的内容就可以了，如果要传递的对象是一个数组或者其他的结构呢，我们就需要用字符流来描述他，就比如在电话里面，我问你的名字是什么，你会告诉我，你的名字是张三、李四，而我问你，你的长相如何呢，你就需要用文字向我描述了，我们进行数据传递的媒介往往和这条电话线路一样，只能传递字符流，而我们描述对象的过程，实际上就是串行化的过程。</p>
<p>另外，串行化也可以用于对对象的持久化存储，也许你曾经也和我一样，想着在数据库的某一个字段中存储一个对象，现在我们可以非常简单的做到这一点，并且，你的这个数据库字段不需要设定为特殊格式，设定为varchar就可以了（当然，如果对象很大，你可能需要设定为text）。</p>
<h2>How</h2>
<h3>PHP串行化语法</h3>
<p>好了，我想What和Why的问题你都了解了，本节最后我们来讲点理论性强一些的内容，就是如何使用PHP串行化和反串行化数据，如何将JavaScript对象串行化（即变为JSON格式）和如何将其反串行化，最后则是如何将JSON和PHP的串行化建立关系。</p>
<p>PHP为我们提供了两个函数，用来进行串行化和反串行化的操作，这两个函数分别是：serialize()和unserialize()，他们适用于PHP4和PHP5，下面分别进行讲解：</p>
<p>serialize()</p>
<p>(PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1)</p>
<p>serialize &#8211; 获得一个可存储的表述值</p>
<p>说明</p>
<p>string serialize ( mixed $value )</p>
<p>获得一个可存储的表述值</p>
<p>本函数用于无损的存储或者传递PHP变量值和结构。</p>
<p>如果需要将已经串行化的值转回PHP变量，可以使用unserialize()函数。</p>
<p>参数</p>
<p>value</p>
<p>即被串行化的表达式。serialize()处理除资源指针之外的所有类型，你甚至可以将含有指向自身元素的数组串行化。你串行化的含有循环指向的数组或者对象一样会被存储，其他的指向则会丢失。</p>
<p>当串行化对象时，PHP会尝试首先调用其成员函数__sleep()。这将允许对象在被串行化之前进行诸如最后的清理工作等。同样地，当使用unserialize()函数将对象恢复时，会调用成员函数__wakeup()。</p>
<p>返回值</p>
<p>返回一个可以被存储在任何地点的包含对象的字节流表达式的字符串。</p>
<p>unserialize()</p>
<p>(PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1)</p>
<p>unserialize &#8211; 从一个已存储的表达式中获得一个PHP变量值</p>
<p>说明</p>
<p>mixed unserialize ( string $str )</p>
<p>unserialize()获取一个简单类型的串行化变量并将其转换回PHP变量值。</p>
<p>参数</p>
<p>str</p>
<p>串行化后的字符串</p>
<p>如果被反串行化的变量是一个对象，则成功恢复该对象的结构后，PHP将自动尝试执行该对象的__wakeup()成员函数（如果其存在）。</p>
<p>unserialize_callback_func指令：你可以设定在此过程中呗执行的回调函数，如果某个未被定义的类应当在反串行化时被实例化（以避免获得一个不完全的对象&#8221;__PHP_Incomplete_Class&#8221;）。你可以使用php.ini，ini_set()或者.htaccess来定义&#8221;unserialize_callback_func&#8221;。当一个未被定义的类被实例化时，它会被调用。屏蔽这个特性只需将其设为空即可。</p>
<p>返回值</p>
<p>返回转换后的数值，可能是布尔变量、实数、浮点数、字符串、数组或者对象。</p>
<p>假如传入的字符串不可以被反串行化，则返回FALSE，同时抛出NOTICE错误。</p>
<p>（以上译自PHP手册）</p>
<h3>PHP串行化实例</h3>
<p><strong>数组的串行化和反串行化</strong></p>
<p>OK，让我们来用实例学习一下，首先，请建立sample1.php文件，我们在这个文件中用如下语句来创建一个哈希数组：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$animal</span> <span style="color: #339933;">=</span>
<span style="color: #009900;">&#40;</span>
<span style="color: #0000ff;">&quot;type&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;human&quot;</span><span style="color: #339933;">,</span>
&nbsp;
<span style="color: #0000ff;">&quot;name&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;hanguofeng&quot;</span><span style="color: #339933;">,</span>
&nbsp;
<span style="color: #0000ff;">&quot;age&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;20&quot;</span>
&nbsp;
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>为了测试这个数组的值，你可以使用print_r()函数来输出数组，输出的结果如下：</p>
<div><code><br />
Array</code></div>
<div><code>(</code></div>
<p><code>[type] =&gt; human</p>
<p>[name] =&gt; hanguofeng</p>
<p>[age] =&gt; 20</p>
<p>)</p>
<p> </p>
<p> </p>
<p></code></p>
<p>那么我们将他来串行化一下，串行化的代码如下：</p>
<div><code><br />
$animal =</code></div>
<div><code>array</code></div>
<p><code>(</p>
<p>"type" =&gt; "human",</p>
<p>"name" =&gt; "hanguofeng",</p>
<p>"age" =&gt; "20"</p>
<p>);</p>
<p>$animal_ser=serialize($animal);</p>
<p>echo($animal_ser);</p>
<p> </p>
<p> </p>
<p></code></p>
<p>这里我们将数组$animal串行化，将返回的串行化字符串保存在变量$animal_ser中，并输出，输出的结果是：</p>
<div><code><br />
a:3:{s:4:"type";s:5:"human";s:4:"name";s:10:"hanguofeng";s:3:"age";s:2:"20";}</code></div>
<div><code> </code></div>
<p><code> </p>
<p></code></p>
<p>我们来简单对这个字符串进行一个解析：</p>
<p>a:3表示这是一个数组型的对象(a)，他共有三个内置的对象(3)</p>
<p>大括号里面的部分是以逗号分割的对象表达式列表，以s:4:&#8221;type&#8221;为例，他表示一个字符串（s），长度为4位（4），值为&#8221;type&#8221;，即哈希数组的第一个元素的键。</p>
<p>后面的部分以此类推，我们不再赘述，你可以试试自己将各种对象串行化，看看串行化后的字符串是如何构建的。</p>
<p>下面来看数组的反串行化，即将我们上面生成的串行化字符串恢复为数组，代码如下：</p>
<div><code><br />
$animal_ser='a:3:{s:4:"type";s:5:"human";s:4:"name";s:10:"hanguofeng";s:3:"age";s:2:"20";}';</code></div>
<div><code>$animal = unserialize($animal_ser);</code></div>
<p><code>print_r($animal);</p>
<p> </p>
<p> </p>
<p></code></p>
<p>在第一行中，我们假设$animal_ser的值为上面获得的串行化字符串，在第二行将该字符串恢复为开始的数组，并赋值给$animal，最后输出$animal这个数组，此时的输出和本节开始时输出的原始数组是一样的，即：</p>
<div><code><br />
Array</code></div>
<div><code>(</code></div>
<p><code>[type] =&gt; human</p>
<p>[name] =&gt; hanguofeng</p>
<p>[age] =&gt; 20</p>
<p>)</p>
<p> </p>
<p> </p>
<p></code></p>
<p>这样我们就完成了数组的反串行化。</p>
<p><strong>拓展知识-自定义对象的串行化和反串行化</strong></p>
<p>对数组进行串行化是一个基础操作，然而在实际的程序设计中，我们可能经常对其他类型的变量进行串行化，例如对某个自定义对象进行串行化，这里有一个我们自己编写的类A（保存在classa.inc中）：</p>
<div><code><br />
class A {</code></div>
<div><code>var $one = 1;</code></div>
<p><code> </p>
<p></code></p>
<p>function show_one() {</p>
<p>echo $this-&gt;one;</p>
<p>}</p>
<p>}</p>
<p>我们在如下代码中创建类的实例并对该实例进行串行化：</p>
<div><code><br />
//省略引入classa.inc文件的代码</code></div>
<div><code>$a=new A;</code></div>
<p><code>echo(serialize($a));</p>
<p> </p>
<p> </p>
<p></code></p>
<p>此时输出的内容为：</p>
<div><code><br />
O:1:"A":1:{s:3:"one";i:1;}</code></div>
<div><code> </code></div>
<p><code> </p>
<p></code></p>
<p>总体来看，这个串行化字符串输出了改对象当前的状态，即i的值为1。下面我们来逐个分析其中的细节。</p>
<p>O:1：由于当前的变量是一个自定义对象，因此该表征字符为&#8221;O&#8221;，表示Object。</p>
<p>后面的&#8221;A&#8221;标识了该变量是哪个类的实例，这里即A类。</p>
<p>大括号内即该实例的各个属性的名称和值。</p>
<p>而后我们将其进行反串行化：</p>
<div><code><br />
//省略引入classa.inc文件的代码</code></div>
<div><code>include("classa.inc");</code></div>
<p><code>$s = 'O:1:"A":1:{s:3:"one";i:1;}';</p>
<p>$a = unserialize($s);</p>
<p>$a-&gt;show_one();</p>
<p> </p>
<p> </p>
<p></code></p>
<p>此时输出&#8221;1&#8243;，即调用了A类的show_one()方法。</p>
<p>你可以注意到虽然在实例的串行化字符串中并没有包含类的方法，但是我们将其反串行化后，仍然可以调用类的方法，这个特性在PHP4及以上版本中被支持（当然，你需要包含类的定义文件classa.inc）。</p>
<p>注：你可以参考PHP手册中Language Reference-&gt;Classes and Objects-&gt;Serializing objects &#8211; objects in sessions一节的内容。</p>
<h3>在JavaScript中串行化为JSON-使用json2.js</h3>
<p>JavaScript中没有直接串行化对象的内置方法，当然你可以自己写一个，不过我还是强烈推荐你在这里偷个小懒，使用现成的组件，JSON的官方网站<a href="&lt;br"></a> &#8220;http://www.json.org&#8221;&gt;www.json.org提供了对JavaScript对象实现JSON串行化的代码库-json2.js，你可以从这里获得它。</p>
<p>获得完毕json2.js文件后，你可以打开这个文件，在文件的前部分包含了相当大量的注释信息，如果你的英文足够好，那么你可以省略我这一节，参考该文件的注释就可以了，如果作为程序员，你已经看够了大片的字母，想看看我的汉字+字母，那你可以向下继续了。</p>
<p>简单的翻译下这个注释：</p>
<p>可参考<a href="http://www.JSON.org/js.html">http://www.JSON.org/js.html</a></p>
<p>该文件创建了一个包含两个方法的全局对象JSON，它的方法分别是：</p>
<div><code><br />
JSON.stringify(value, whitelist)</code></div>
<div><code> </code></div>
<p><code> </p>
<p></code></p>
<p>value 任意的JavaScript值，一般是一个对象或者数组</p>
<p>whitelist 一个可选的数组参数，用于判定对象值如何被串行化</p>
<p>这个方法通过一个JavaScript值来生成JSON文本。在进行串行化时，根据可选的参数whitelist，有三种可能：</p>
<p>如果某个对象有toJSON方法，那么则调用该方法，toJSON方法的返回值将被串行化。</p>
<p>否则，如果可选参数whitelist是一个数组，那么数组中的元素将被用来选择对象进行串行化时的的成员。</p>
<p>否则，如果没有使用whitelist参数，则对象的所有成员将被串行化。</p>
<p>如果值没有JSON的表现形式，例如undefined或者函数，则其不会被串行化。在对象中，这样的值会被忽略，而在数组中将会被null替换。</p>
<p>JSON.stringify(undefined)会返回undefined。日期将会被串行化为被引用的ISO日期。</p>
<p>例：</p>
<div><code><br />
var text = JSON.stringify(['e', {pluribus: 'unum'}]);</code></div>
<div><code>//text is '["e",{"pluribus":"unum"}]'</code></div>
<p><code> JSON.parse(text, filter)</p>
<p> </p>
<p> </p>
<p></code></p>
<p>该方法解析一个JSON文本，并生成一个组件或者数组，其可能抛出一个SyntaxError异常。</p>
<p>可选的filter参数是一个可过滤和转换结果的函数、它接受每个键和值，它的返回值用来替换源值。如果它返回所接收的值，那么结果不会被改变。如果他返回undefined，则该成员会被删除。</p>
<p>例：</p>
<div><code><br />
//解析文本，如果某个键包含字符串"date"，则将其值转换为日期</code></div>
<div><code>myData = JSON.parse(text, function (key, value) {</code></div>
<p><code>return key.indexOf('date') &gt;= 0 ? new Date(value) : value;</p>
<p>});</p>
<p> </p>
<p> </p>
<p></code></p>
<p>上面的入门教程已经使你基本了解了json2.js的使用方法，这里关于该文件我就不再赘述了，只是有一个小提示，如果你想简单的解析一个JSON文本，那么可以使用eval()函数，改函数是JavaScript的内置函数，例如解析在JSON.stringify的案例中生成的JSON文本，可以使用：</p>
<div><code><br />
var myE = eval('["e",{"pluribus":"unum"}]');</code></div>
<div><code> </code></div>
<p><code> </p>
<p></code></p>
<p>来获得对象myE。</p>
<h3>在JavaScript中串行化为JSON-使用prototype.js</h3>
<p>如果你和我一样，喜欢在自己的项目中使用开源的JavaScript框架，那么你可能可以省去使用json2.js文件了，这里以protype.js为例，该文件可以在<a href="&lt;br"></a> &#8220;http://www.prototypejs.org&#8221;&gt;http://www.prototypejs.org下载，由于本文不是在讲JavaScript框架，这里我假设你对prototype.js的使用已经有所了解了。</p>
<p>prototype.js中提供了对Object对象的toJSON方法，你可以使用Object.toJSON()方法来实现对对象的串行化，例如：</p>
<div><code><br />
var cat=</code></div>
<div><code>{</code></div>
<p><code>name:"hellokitty",</p>
<p>height:"6 apples"</p>
<p>}</p>
<p>alert(Object.toJSON(cat));</p>
<p>//将弹出对话框，内容为 {"name": "hellokitty", "height": "6 apples"}</p>
<p> </p>
<p> </p>
<p></code></p>
<p>另外，在prototype.js中还有另外的JSON支持，主要是在Ajax对象中对Ajax返回请求中JSON内容的解析。这里暂时与我们的内容无关，也不再介绍了。</p>
<h1>PHP与JSON</h1>
<p>在上面我们一起了解了PHP进行对象串行化的方法以及在JavaScript中进行将对象串行化为JSON的方法，你大致会质疑我为什么将二者放在一起，因为他们的语法实际是不完全一样的，然而，在PHP中，可以对JSON文本进行反串行化，也可以将PHP的对象串行化为JSON而非PHP风格的文本。这主要是靠json_decode和json_encode两个函数来完成的，需要特别说明的是，这两个函数在PHP<br />
5 &gt;= 5.2.0中才被支持，如果你要编写运行在PHP4环境下的程序，那么这两个函数是不可以使用的。</p>
<h2>json_decode函数</h2>
<p>语法</p>
<p>mixed json_decode ( string $json [, bool $assoc] )</p>
<p>获取一个JSON编码文本，并且将其转换为PHP变量</p>
<p>参数</p>
<p>json</p>
<p>被JSON编码的文本</p>
<p>assoc</p>
<p>当为TRUE时，返回的值为联合数组</p>
<p>返回值</p>
<p>返回一个对象，或者如果可选的assoc参数为TRUE，则一个联合数组将会被返回</p>
<h2>json_encode函数</h2>
<p>语法</p>
<p>string json_encode ( mixed $value )</p>
<p>该函数返回一个值的JSON表达式</p>
<p>参数</p>
<p>value</p>
<p>要被编码的值，可以为除resource外的任何类型参数</p>
<p>这个函数仅在UTF-8编码格式时起作用</p>
<p>返回值</p>
<p>当成功时返回编码后的JSON文本</p>
<h2>json_decode函数实例</h2>
<p>下面两个例子都基于我们的一个情景假设，即，我们有一个用户注册的模块，这个模块以&#8221;面向对象&#8221;的方式工作，在json_decode函数实例中，我们在前台将用户的注册信息变为一个类的属性，而后传递到后台的php文件（这里为了简便，就不用Ajax了）。在json_encode实例中，我们在html文件中引用一个js文件，地址指向php文件，在php文件中输出json编码后的用户对象（同样为了简便，我们直接生成一个对象而不从数据库中取信息），并在html中输出。</p>
<p>好了，先来看前台的页面json_encode.htm，这个页面模仿了通常的注册页面，在其上面有一个表单，当提交时，触发JavaScript函数，生成一个用户对象user，将表单内容设为用户对象的属性，生成JSON文本，以POST方式传递到后台的json_encode.php文件。在js_encode.php文件中，将JSON文本用json_decode函数解析为PHP对象，并输出。</p>
<p>好了，先来看json_encode.html文件，文件代码如下：</p>
<div><code><br />
……省略HTML头部,以下代码位于head标签</code></div>
<div><code>function JSON_test(o)</code></div>
<p><code>{</p>
<p>var user = {</p>
<p>name:document.getElementById('txt_name').value,</p>
<p>email:document.getElementById('txt_email').value,</p>
<p>password:document.getElementById('txt_name').value</p>
<p>}</p>
<p>var json_string = JSON.stringify(user);</p>
<p> </p>
<p></code></p>
<p>document.getElementById(&#8216;txt_json&#8217;).value=json_string;</p>
<p>alert(&#8220;点击确定后将提交表单&#8221;);</p>
<p>o.submit();</p>
<p>}</p>
<p>……以下代码位于body标签</p>
<p>&lt;form id=&#8221;form1&#8243; name=&#8221;form1&#8243; method=&#8221;post&#8221; action=&#8221;json_encode.php&#8221;<br />
onsubmit=&#8221;JSON_test(this)&#8221;&gt;</p>
<p>&lt;label for=&#8221;txt_name&#8221;&gt;姓名&lt;/label&gt;</p>
<p>&lt;p&gt;</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txt_name&#8221; id=&#8221;txt_name&#8221; /&gt;</p>
<p>&lt;/p&gt;</p>
<p>&lt;label for=&#8221;txt_email&#8221;&gt;邮箱&lt;/label&gt;</p>
<p>&lt;p&gt;</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txt_email&#8221; id=&#8221;txt_email&#8221; /&gt;</p>
<p>&lt;/p&gt;</p>
<p>&lt;p&gt;</p>
<p>&lt;label for=&#8221;txt_password&#8221;&gt;密码&lt;/label&gt;</p>
<p>&lt;/p&gt;</p>
<p>&lt;p&gt;</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txt_password&#8221; id=&#8221;txt_password&#8221; /&gt;</p>
<p>&lt;/p&gt;</p>
<p>&lt;p&gt;</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txt_json&#8221; id=&#8221;txt_json&#8221; /&gt;</p>
<p>&lt;label for=&#8221;button&#8221;&gt;&lt;/label&gt;</p>
<p>&lt;input type=&#8221;submit&#8221; name=&#8221;button&#8221; id=&#8221;button&#8221; value=&#8221;JSON&#8221; /&gt;</p>
<p>&lt;/p&gt;</p>
<p>&lt;/form&gt;</p>
<p>当提交表单时，将触发JavaScript函数JSON_text()，该函数首先建立一个JavaScript对象user，将其name、email和password属性分别设为对应表单的值，而后使用json2.js文件的JSON.stringify方法将其转换为JSON文本json_string，最后设定隐藏域（这里为了使你看的清楚，我把这个隐藏域以文本框形式显示了）txt_json的值为json_string，并提交表单。</p>
<p>下面到json_encode.php文件，如下：</p>
<div><code><br />
$json_string = $_POST["txt_json"];</code></div>
<div><code>if(ini_get("magic_quotes_gpc")=="1")</code></div>
<p><code>{</p>
<p>$json_string=stripslashes($json_string);</p>
<p>}</p>
<p>$user = json_decode($json_string);</p>
<p> </p>
<p></code></p>
<p>echo var_dump($user);</p>
<p>在这个文件中，首先得到json_encode.html文件中POST表单域txt_json的值，放入变量$json_string中，而后判断，如果当前PHP的设定为magic_quotes_gpc=On，即传入的双引号等会被转义，这样json_decode函数无法解析，因此我们要将其反转义化。而后，使用json_decode函数将JSON文本转换为对象，保存在$user变量中，最终用echo<br />
var_dump($user);，将该对象dump输出出来，最终结果是：</p>
<div><code><br />
object(stdClass)#1 (3) {</code></div>
<div><code>["name"]=&gt;</code></div>
<p><code>string(10) "hanguofeng"</p>
<p>["email"]=&gt;</p>
<p>string(18) "example@domain.com"</p>
<p>["password"]=&gt;</p>
<p>string(10) "hanguofeng"</p>
<p>}</p>
<p> </p>
<p> </p>
<p></code></p>
<h2>json_encode函数实例</h2>
<p>在这个例子中，仍然是由两部分构成的，即json_enode.html和json_encode.php。在json_decode.html文件中，基本与json_decode.html文件的表单类似，但是不同的是，这次我们要从json_encode.php文件中获得相应用户的JSON文本，先来看这个PHP文件吧：</p>
<div><code><br />
Class user</code></div>
<div><code>{</code></div>
<p><code>public $name="";</p>
<p>public $email="";</p>
<p>public $password="";</p>
<p>};</p>
<p>$myUser = new user;</p>
<p>$myUser-&gt;name="hanguofeng";</p>
<p>$myUser-&gt;email="example@domain.com";</p>
<p>$myUser-&gt;password="hanguofeng";</p>
<p>$json_string = json_encode($myUser);</p>
<p> </p>
<p></code></p>
<p>var user = echo($json_string);</p>
<p>这个文件首先建立类user，而后获得一个user类的实例myUser，并设定其用户名、邮箱和密码，接下来使用json_encode函数将其转换为JSON文本，保存在变量$json_string中，最后输出一段JavaScript代码，以在JavaScript中建立全局变量user。</p>
<p>接下，我们需要在json_encode.html文件中引入json_encode.php文件，并得到user对象的各个属性，在这个文件中，你需要注意两点，第一是，我们以这样的代码引入json_encode.php文件为JavaScript文件：</p>
<div><code><br />
&lt;script src="json_encode.php" type="text/javascript"&gt;&lt;/script&gt;</code></div>
<div><code> </code></div>
<p><code> </p>
<p></code></p>
<p>第二点则是：</p>
<p>我们在文本框代码后面加入JavaScript的代码，对文本框的value属性进行操作，分别设定其值为user对象的相应值。</p>
<h1>实践出真知</h1>
<h2>背景说明</h2>
<p>OK，各位亲爱的朋友，在经过上面这么多这么多的零散的关于PHP的串行化和JavaScript的串行化—JSON的说明后，我们来做一个完整的东西，在这里面，我们涉及了JavaScript中的对象操作、对象串行化，还涉及了当串行化的JSON文本传输到后台的PHP时，PHP进行的相应处理。<br />
这里需要说明的是，为了将内容聚焦于本文所阐述的领域，我们将这个项目精简了很多，在这里讲的并不完全是实际生产环境下的做法，而是为了突出串行化的应用，在具体的地方我会详细说明，希望不影响你对整体的理解。<br />
我们要完成的小案例是一个在线记事本的程序，用户可以在前台添加若干个Tab（即通常所说的选项卡），每个Tab保存一定的文本内容，你也可以将它当作一个动态的选项卡生成和管理的程序。<br />
程序的运行界面如下图：</p>
<p><img src="http://i.namipan.com/files/38220519b5b390b0467dd40e10792f55f3c9979f662100008b3a/0/PIC01.gif" alt="图1" width="553" height="151" /></p>
<p>在这里，你可以看到有若干个Tab，当点击这些Tab时，下面将显示Tab的内容，同时你可以删除Tab和新增Tab，在完成对Tab的编辑后，可以点击“保存”按钮，将改动传输到后台的PHP进行处理，并保存在服务器上。</p>
<h2>前台JavaScript部分</h2>
<p>在前台的notepat.html文件中，我们要使用JavaScript完成大多数对Tab进行管理的任务，因此我构建了一个Tab管理的类，用来对其进行添加、删除等操作，这个类如下所示：</p>
<p><img src="http://i.namipan.com/files/c133ba96caeb42302294e67e18c08118707b0dc35e180000dcad/0/PIC02.gif" alt="图2" width="397" height="232" /></p>
<p>tabManager类的各个属性、方法含义如下：<br />
_tabs：“私有属性”（加引号的原因是JavaScript中并没有私有公有的概念，这里只是从设计上来讲），该属性中存储了当前的tab数组，任何对Tab的操作将最终存储在这里。<br />
_lastIndex：“私有属性”，表明最后添加的索引，用于对各个Tab进行唯一标识。</p>
<p>getTabs()：返回当前的tab数组。<br />
setTabs(tabs)：设定当前的tab数组。<br />
add(ptitle,pcontent)：新增一个标题为ptitle，内容为pcontent的tab。<br />
del(pid)：删除id为pid的tab。<br />
clean()：“私有方法”，用于删除某个tab后，对tab数组进行精简压缩。<br />
getTab(pid)：用于获得指定的单个tab，参数pid为要获得的tab的id。<br />
debug()：预留的debug方法。</p>
<p>同时注意我们的tab对象有三个属性，分别为id、name和content。<br />
这样，基础类的架构我们就讲解完毕了，这里由于其详细代码与本文话题关联不大，就不再详细列出和讲解了，稍后可能会单独发表文章来说这里。<br />
那么，我们还需要构建一些函数，作为控制器，来沟通页面上各个按钮的点击事件和之前建立的tabManager类，这些函数包括：<br />
selTab(o)：当点击页面某个Tab时，切换内容区域以显示相应Tab的内容，传入参数为所点击的连接对象。<br />
newTab()：当点击“新建Tab”按钮时，负责询问用户新增Tab的信息，并调用tabManager.add()方法将用户输入的Tab信息建立一个新的Tab对象。<br />
delTab()：删除当前激活的Tab。<br />
saveTab()：将对Tab的所有更改提交到PHP中。<br />
loadTab()：加载Tab。<br />
showTabContent(id)：被selTab()函数调用以显示指定id的Tab的内容到内容区域。<br />
draw(tabs)：根据传入的tabs数组重绘Tab导航区域。</p>
<p>那么，这里我要重点强调的函数就有两个，分别是saveTab()和loadTab()。<br />
先来看saveTab()函数：此函数源代码如下：<br />
function saveTab()<br />
{<br />
document.getElementById(&#8220;json_string&#8221;).value = JSON.stringify(tabManager.getTabs());<br />
document.getElementById(&#8220;frmMain&#8221;).submit();<br />
}<br />
呵呵，好像比较简单啊，这个函数首先通过调用tabManager类的getTabs()方法，获得我们所操作的Tabs数组，而后调用json2.js文件中的JSON.stringfy()方法将其串行化，得到串行化的JSON文本后，将其赋给隐藏域json_string，并提交表单，这里我采取了简单的方法，其实你在这里也可以采用Ajax的方式，将JSON文本传递到PHP中。<br />
另外则是函数loadTab()，其代码如下：<br />
function loadTab()<br />
{<br />
tabManager.setTabs(notes);<br />
draw(tabManager.getTabs());<br />
}<br />
这里需要说明的是，我们在本文件的开头，通过如下代码：<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;load.php&#8221;&gt;&lt;/script&gt;<br />
引入了一个经过后台处理的（你可以看到，扩展名为PHP）JavaScript文件load.php，。在这个文件中，建立了一个tab对象的数组notes。因此，在loadTab函数中，我们调用了tabManager类的setTabs方法，设定tabManager类的“私有属性”_tabs的值为notes数组，此时就完成了对Tab的加载。</p>
<h2>后台PHP部分</h2>
<p>当用户在网页上点击“保存”按钮后，会触发前面所讲解的saveTab()函数，最终提交表单到save.php页面，该页面读取用户提交的JSON文本，并将其转换为PHP对象，进行后续处理，其代码如下：<br />
<code><br />
$json_string = $_POST["json_string"];<br />
if(ini_get("magic_quotes_gpc")=="1")<br />
{<br />
$json_string=stripslashes($json_string);<br />
}<br />
$notes = json_decode($json_string);<br />
foreach ($notes as $note)<br />
{<br />
echo $note-&gt;title."&lt;br&gt;".$note-&gt;content."&lt;br&gt;-------------------------&lt;br&gt;";<br />
}<br />
$p = f open("load.php","w+");<br />
f write($p,"var notes=".json_encode($notes).";");<br />
f close($p);<br />
</code><br />
首先通过访问全局集合$_POST来获得提交的json_string隐藏域的值，而后进行处理，如果PHP的配置magic_quotes_gpc为On，则此时提交的文本中，引号会被转义，如果不进行处理，那么后面的json解码操作会失败，因此我们调用函数stripslashes()将其反转义。<br />
接下来我们使用json_decode()函数对提交的JSON文本进行解码，返回的对象保存在$notes变量中，此时$notes变量为一个数组，数组中每一个元素即一个Tab对象，为了清楚的看到这一点，我们对$notes数组进行迭代，依次打印出数组中每一个Tab对象的标题和内容，最后，我们打开文件load.php，将使用json_encode进行JSON编码后的$notes对象写入此文件，以待notepad.html文件调用，这样就完成了对对象的持久化存储工作。<br />
这里仍然需要说明的是我们精简的部分：在实际的生产环境中，你很可能需要在迭代$notes数组时将每一个Tab对象的信息写入数据库中，以方便其他的部分调用，而在load.php文件中，你可能并不是直接将JSON文本写入此文件，而是从数据库中读取一个结果集，而后迭代结果集，来生成一个PHP的数组，并将PHP数组进行JSON编码后，输出。<br />
好了，絮絮叨叨一大堆，简单点用个图来表示吧：</p>
<p><img src="http://i.namipan.com/files/84e97995562c3988d17d434980def68a9fecf13788100000a104/0/PIC03.gif" alt="图3" width="512" height="274" /></p>
<p><img src="http://i.namipan.com/files/f7030628503797b9fd1d40f72d33b0536def4026bb120000edb9/0/PIC04.gif" alt="图4" width="512" height="274" /></p>
<h1>我还有话要说</h1>
<p>各位亲爱的~读者朋友，我们这篇“长”达一万五千字的连载完成了，在本文中，我想你了解了关于对象串行化的一些基本概念以及串行化在PHP和JavaScript中的使用方法。<br />
串行化只是一种思路，他的妙用在于你熟悉了在各类语言中对对象的操作之后，JSON和XML各有特点，根据自己的情况进行优选才是王道。<br />
欢迎大家在论坛或者博客中与我交流。</p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-3" title="听小韩聊PHP项目开发(3)–切分你的系统">听小韩聊PHP项目开发(3)–切分你的系统</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-2" title="听小韩聊PHP项目开发(2)&#8211;观察你的项目">听小韩聊PHP项目开发(2)&#8211;观察你的项目</a></li><li><a href="http://www.hanguofeng.cn/archives/security/configure-fast-in-lamp-on-windows-with-xampp" title="Windows下AMP平台配置FastCGI方法（以xampp为基础）">Windows下AMP平台配置FastCGI方法（以xampp为基础）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-server/php-serialize-json/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>从Showgood怀念起</title>
		<link>http://www.hanguofeng.cn/archives/life/missing-showgood?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=missing-showgood</link>
		<comments>http://www.hanguofeng.cn/archives/life/missing-showgood#comments</comments>
		<pubDate>Sat, 01 Mar 2008 06:18:01 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[showgood]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/life/missing-showgood</guid>
		<description><![CDATA[怀念ShowGood，不知道还有多少人记得那个曾经的香港的动画公司，不知道还有多少人记得港台腔配音的《大话三国》系列。 掐指算算，接触Flash至今可能也有将近7年了，从初中的时候听一个老师做课件的牢骚：“那个F、L、A、S、H、4、0不会用，只好用Authware” ，看着洋同学一步一步的做出好看的Flash，到自己开始从Flash 5做动画给朋友参加比赛，转眼到现在，已经Adobe Flash CS3了，可惜的是，自从Flash 5之后就很少用过了。我最喜欢的Flash动画作品有这么几个：ShowGood的《大话三国》，朴桦的《猫》和中华轩的《女孩，你的一分钟有多长》。 开始看《大话三国》系列，是在电脑城买的Flash素材大全盗版盘，看到这个有趣的动画片，觉得Flash真是好奇妙，而看《大话三国》最多的媒介，恐怕竟然是在电视上，那个时候大概是初三，每天早晨起来在吃早饭的时候，电视上本地台的点播频道就会“自动操作”的播放很多《大话三国》的片子，比如《三英战吕布》，比如《凤仪亭》，还有同一风格的MV，《神啊救救我吧》则是此间精品。 曾经的动画留给我记忆中无法磨灭的那种温馨。 而接下来的《猫》，则以版画风格的动画，给了我心灵的震撼，《末代皇帝》的主题个配乐，默默的营造了这个气氛。《猫》讲述了一对猫母子浪迹天涯的故事，动画以猫母子的流浪生活开始，逐渐到猫妈妈被杀害，而以小猫在地狱中抢回妈妈的灵魂为高潮，最后又回到浪迹天涯的平淡，版画粗放的线条和音乐的跌宕起伏催人泪下。 欣赏《女孩，你的一分钟有多长》，则来源于十年在他的广播剧《女生宿舍里的窃听器》中推荐的网络小说《浮生萧条》，这部由该小说为蓝本制作的Flash动画片，以其精良的画面、优美的配音在网上广为流传，直至由影片公司制作发行了VCD版，算得上是网络动画中不可多得的作品了。 Flash的发展已经有很多很多年了，从当初的单纯制作网络流媒体动画工具，逐渐的到今天的富客户端平台，正如WWW的发展，从当初信息共享的平台，发展到今天人们生活的工具，学习、工作、购物、交际，我们的生活无一不与网络发生着巨大的联系。 随机内容祝大家己丑年新春大吉，万事如意立秋++++慢慢走向毕业]]></description>
			<content:encoded><![CDATA[<p>怀念ShowGood，不知道还有多少人记得那个曾经的香港的动画公司，不知道还有多少人记得港台腔配音的《大话三国》系列。</p>
<p><img border="0" width="1" src="http://i25.tinypic.com/1z5ne61.jpg" alt="showgood" height="1" /><span id="more-9"></span></p>
<p>掐指算算，接触Flash至今可能也有将近7年了，从初中的时候听一个老师做课件的牢骚：“那个F、L、A、S、H、4、0不会用，只好用Authware” ，看着洋同学一步一步的做出好看的Flash，到自己开始从Flash 5做动画给朋友参加比赛，转眼到现在，已经Adobe Flash CS3了，可惜的是，自从Flash 5之后就很少用过了。我最喜欢的Flash动画作品有这么几个：ShowGood的《大话三国》，朴桦的《猫》和中华轩的《女孩，你的一分钟有多长》。</p>
<p>开始看《大话三国》系列，是在电脑城买的Flash素材大全盗版盘，看到这个有趣的动画片，觉得Flash真是好奇妙，而看《大话三国》最多的媒介，恐怕竟然是在电视上，那个时候大概是初三，每天早晨起来在吃早饭的时候，电视上本地台的点播频道就会“自动操作”的播放很多《大话三国》的片子，比如《三英战吕布》，比如《凤仪亭》，还有同一风格的MV，《神啊救救我吧》则是此间精品。</p>
<p>曾经的动画留给我记忆中无法磨灭的那种温馨。</p>
<p>而接下来的《猫》，则以版画风格的动画，给了我心灵的震撼，《末代皇帝》的主题个配乐，默默的营造了这个气氛。《猫》讲述了一对猫母子浪迹天涯的故事，动画以猫母子的流浪生活开始，逐渐到猫妈妈被杀害，而以小猫在地狱中抢回妈妈的灵魂为高潮，最后又回到浪迹天涯的平淡，版画粗放的线条和音乐的跌宕起伏催人泪下。</p>
<p>欣赏《女孩，你的一分钟有多长》，则来源于十年在他的广播剧《女生宿舍里的窃听器》中推荐的网络小说《浮生萧条》，这部由该小说为蓝本制作的Flash动画片，以其精良的画面、优美的配音在网上广为流传，直至由影片公司制作发行了VCD版，算得上是网络动画中不可多得的作品了。</p>
<p>Flash的发展已经有很多很多年了，从当初的单纯制作网络流媒体动画工具，逐渐的到今天的富客户端平台，正如WWW的发展，从当初信息共享的平台，发展到今天人们生活的工具，学习、工作、购物、交际，我们的生活无一不与网络发生着巨大的联系。</p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/life/summer-vacation-in-beijing" title="北京 仲夏夜之梦">北京 仲夏夜之梦</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/php-project-development-1" title="听小韩聊PHP项目开发(1)&#8211;开题的话">听小韩聊PHP项目开发(1)&#8211;开题的话</a></li><li><a href="http://www.hanguofeng.cn/archives/life/autumn-plus-plus-plus-plus" title="立秋++++">立秋++++</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/life/missing-showgood/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[译文]防止CSRF攻击</title>
		<link>http://www.hanguofeng.cn/archives/security/preventing-csrf?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=preventing-csrf</link>
		<comments>http://www.hanguofeng.cn/archives/security/preventing-csrf#comments</comments>
		<pubDate>Thu, 07 Feb 2008 17:31:09 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[网络安全]]></category>
		<category><![CDATA[CSRF]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/%e7%bd%91%e7%bb%9c%e5%ae%89%e5%85%a8/preventing-csrf</guid>
		<description><![CDATA[说明：

译言链接：http://www.yeeyan.com/articles/view/hanguofeng/3994

原文链接：http://www.playhack.net/view.php?id=31]]></description>
			<content:encoded><![CDATA[<p>说明：</p>
<p>译言链接：<a href="http://www.yeeyan.com/articles/view/hanguofeng/3994">http://www.yeeyan.com/articles/view/hanguofeng/3994</a><br />
原文链接：<a href="http://www.playhack.net/view.php?id=31">http://www.playhack.net/view.php?id=31</a></p>
<p><span id="more-6"></span></p>
<h2>概览：</h2>
<p>1. Hello World<br />
2. 介绍<br />
3. 关于认证技术<br />
3.1 Cookies Hashing<br />
3.2 HTTP来路<br />
3.3 验证码<br />
4. 一次性令牌<br />
5. 最后的话</p>
<h2>1.Hello World</h2>
<p>欢迎来到崭新的Playhack.net的新季度开题项目报告。我非常高兴您能够再次回来让我们的c001项目重现。</p>
<p>希望您能喜欢这个新的短篇论文，我邀请你浏览位于http://www.playhack.net的全部新项目。</p>
<p>开始：几乎没有什么，只是一点香烟!:</p>
<p>呐喊：我向我的playhack m8s null,omni,god and emdel,ofc o str0ke大声呐喊!NEX 回来了。</p>
<h2>2.介绍</h2>
<p>我对跨站请求伪造（Cross Site Request Forgery，即CSRF）技术有一定研究，但是对网站开发者应当采取的措施研究不深。这些日子在编写一个对用户和管理员（这些人对他们的任务并不明晰:P）有高度安全要求的分布式网站程序时，我被这个话题深刻的纠缠了。</p>
<p>针对这种情况，我必须考虑程序最终可能受到的各个方面的可能的攻击威胁。</p>
<p>给我最多麻烦的就是Session欺骗（或者CSRF，你可以按照自己喜欢的方式称呼），因为这种攻击是完全以用户的身份，因此并没有百分百的可能性来防止它。</p>
<p>如果你对我刚才说所的Session欺骗并不太了解，那么你可以阅读：http://www.playhack.net/view.php?id=30</p>
<h2>3.可行措施</h2>
<p>Ok，从这里开始，我必须假定你对Session欺骗攻击的实施方法已经深刻领会了:P</p>
<p>让我们开始新的继续。</p>
<p>考虑到一个已经登录到网站的受信用户可以完成一些重要的或者私密的操作，攻击者尝试记性一个可能的登录攻击（但是大多数情况下是不可行的）并且得到已经登录用户的Session来实现其巧妙的行为。</p>
<p>为了劫持用户的Seession，入侵者精心构造一个适当的网页，在这个网页中包含了隐藏的JavaScript函数来重新创造一个原始操作表单，但是攻击者却修改了一些表单值，然后攻击者让受攻击者访问该页面，此时页面加载过程会提交上述表单到一个远程页面，以隐秘地完成一个请求（此时受攻击者并不知道），他们用这种方法利用了用户的受信身份。</p>
<p>这种方式简单解释了Session欺骗攻击是如何工作的，但是一个重要的问题是，“我如何避免我的用户成为这种攻击的受害者？”</p>
<p>现在，你可能想到如下的几种方法：</p>
<p>检查Cookies凭据<br />
检查HTTP请求来路<br />
使用验证码<br />
但是经过一些尝试，你会发现这些方法不是我们应当采取的最合适的解决方式，让我们一个个的来看为什么。</p>
<h3>3.1 Cookies Hashing</h3>
<p>第一个方案可能是解决这个问题的最简单和快捷的方案了，因为攻击者不能够获得被攻击者的Cookies内容，也就不能够构造相应的表单。</p>
<p>这个问题的实现方法与下面的类似。在某些登录页面我们根据当前的会话创建Cookies：</p>
<p>&lt;!&#8211; login.php &#8211;&gt;<br />
&lt;?php<br />
// Cookie value<br />
$value = &#8220;Something from Somewhere&#8221;;<br />
// Create a cookie which expires in one hour<br />
setcookie(&#8220;cookie&#8221;, $value, time()+3600);<br />
?&gt;<br />
&lt;!&#8211; EOF &#8211;&gt;</p>
<p>在这里，我们在Cookies中使用了散列来使得这个表单可被认证。</p>
<p>&lt;!&#8211; form.php &#8211;&gt;<br />
&lt;?php<br />
// Hash the cookie<br />
$hash = md5($_COOKIE['cookie']);<br />
?&gt;<br />
&lt;form method=&#8221;POST&#8221; action=&#8221;resolve.php&#8221;&gt;<br />
&lt;input type=&#8221;text&#8221; name=&#8221;first_name&#8221;&gt;<br />
&lt;input type=&#8221;text&#8221; name=&#8221;last_name&#8221;&gt;<br />
&lt;input type=&#8221;hidden&#8221; name=&#8221;check&#8221; value=&#8221;&lt;?=$hash;?&gt;&#8221;&gt;<br />
&lt;input type=&#8221;submit&#8221; name=&#8221;submit&#8221; value=&#8221;Submit&#8221;&gt;<br />
&lt;/form&gt;<br />
&lt;!&#8211; EOF &#8211;&gt;</p>
<p>此时，后台的动态网页部分可以进行如下操作：</p>
<p>     &lt;!&#8211; resolve.php &#8211;&gt;<br />
      &lt;?php<br />
      // Check if the &#8220;check&#8221; var exists<br />
      if(isset($_POST['check'])) {<br />
           $hash = md5($_COOKIE['cookie']);<br />
           // Check if the values coincide<br />
           if($_POST['check'] == $hash) {<br />
                do_something();<br />
           } else {<br />
                echo &#8220;Malicious Request!&#8221;;<br />
           }<br />
      } else {<br />
           echo &#8220;Malicious Request!&#8221;;<br />
      }<br />
      ?&gt;<br />
      &lt;!&#8211; EOF &#8211;&gt;</p>
<p>事实上，如果我们不考虑用户的Cookies很容易由于网站中存在XSS漏洞而被偷窃（我们已经知道这样的事情并不少见）这一事实，这是一个很好的应对对CSRF的解决方案。如果我们为用户的每一个表单请求中都加入随机的Cookies，那么这种方法会变得更加安全，但是这并不是十分合适。</p>
<h3>3.2 HTTP来路</h3>
<p>检测访问来路是否可信的最简单方法是，获得HTTP请求中的来路信息（即名为Referer的HTTP头—译者注）并且检查它来自站内还是来自一个远程的恶意页面：这是一个很好的解决方法，但是由于可以对服务器获得的请求来路进行欺骗以使得他们看起来合法，这种方法不能够有效防止攻击。</p>
<p>让我们来看看为什么这并不是一个合适的方法。</p>
<p>下面的代码展示了HTTP Referer实现方法的一个例子：</p>
<p>     &lt;!&#8211; check.php &#8211;&gt;<br />
      if(eregi(&#8220;www.playhack.net&#8221;, $_SERVER['HTTP_REFERER'])) {<br />
           do_something();<br />
      } else {<br />
           echo &#8220;Malicious Request!&#8221;;<br />
      }<br />
      &lt;!&#8211; EOF &#8211;&gt;</p>
<p>这个检测则会轻易的忽略掉来自某个攻击者伪造的HTTP Referer欺骗，攻击者可以使用如下代码：</p>
<p>header(&#8220;Referer: www.playhack.net&#8221;);</p>
<p>或者其他在恶意脚本中伪造HTTP头并发送的方法。</p>
<p>由于HTTP Referer是由客户端浏览器发送的，而不是由服务器控制的，因此你不应当将该变量作为一个信任源。</p>
<h3>3.3 验证码</h3>
<p>另外一个解决这类问题的思路则是在用户提交的每一个表单中使用一个随机验证码，让用户在文本框中填写图片上的随机字符串，并且在提交表单后对其进行检测。</p>
<p>这个方法曾经在之前被人们放弃，这是由于验证码图片的使用涉及了一个被称为MHTML的Bug，可能在某些版本的微软IE中受影响。</p>
<p>你可以在Secunia的站点上获得关于此缺陷的详细信息：http://secunia.com/advisories/19738/ 。</p>
<p>这里是Secunia关于此Bug解释的概述：</p>
<p>“此缺陷是由于处理“mhtml:”的URL处理器重定向引起的。它可以被用来利用从另外一个网站访问当前的文档”</p>
<p>在同一个页面你会找到来自Secunia工作人员的网站测试方法。</p>
<p>事实上，我们知道，这个Bug已经被微软放出的Windows XP和Windows Vista及其浏览器IE6.0的修复包所解决了。</p>
<p>即使他的确出现了安全问题，这么长时间也会有其他的可靠方案出现。</p>
<h2>4.一次性令牌</h2>
<p> 现在让我们来看经过研究，我希望介绍的最后一种解决方案：在使用这些不可靠的技术后，我尝试做一些不同然而却是更有效的方法。</p>
<p>为了防止Web表单受到Session欺骗（CSRF）的攻击，我决定检测可能被伪装或伪造的每一个项目。因此我需要来创造一次性令牌，来使得在任何情况下都不能够被猜测或者伪装，这些一次性令牌在完成他们的工作后将被销毁。</p>
<p>让我们从令牌值的生成开始：</p>
<p>     &lt;!&#8211; start function &#8211;&gt;<br />
     &lt;?php<br />
     function gen_token() {<br />
          // Generate the md5 hash of a randomized uniq id<br />
          $hash = md5(uniqid(rand(), true));<br />
          // Select a random number between 1 and 24 (32-8)<br />
          $n = rand(1, 24);<br />
          // Generate the token retrieving a part of the hash starting from<br />
          // the random N number with 8 of lenght<br />
          $token = substr($hash, $n, 8);<br />
          return $token;<br />
     }<br />
     ?&gt;<br />
     &lt;!&#8211; EOF &#8211;&gt;</p>
<p> PHP函数uniqid()允许web开发者根据当前的时间（毫秒数）获得一个唯一的ID，这个唯一ID有利于生成一个不重复的数值。</p>
<p>我们检索相应ID值的MD5散列，而后我们从该散列中以一个小于24的数字为开始位置，选取8位字母、</p>
<p>返回的$token变量将检索一个8位长的随机令牌。</p>
<p>现在让我们生成一个Session令牌，在稍后的检查中我们会用到它。</p>
<p>     &lt;!&#8211; start function &#8211;&gt;<br />
     &lt;?php<br />
     function gen_stoken() {<br />
          // Call the function to generate the token<br />
          $token = gen_token();<br />
          // Destroy any eventually Session Token variable<br />
          destroy_stoken();<br />
          // Create the Session Token variable<br />
          session_register(STOKEN_NAME);<br />
          $_SESSION[STOKEN_NAME] = $token;<br />
     }<br />
     ?&gt;<br />
     &lt;!&#8211; EOF &#8211;&gt;</p>
<p> 在这个函数中我们调用gen_token()函数，并且使用返回的令牌将其值复制到一个新的$_SESSION变量。</p>
<p>现在让我们来看启动完整机制中为我们的表单生成隐藏输入域的函数：</p>
<p>     &lt;!&#8211; start function &#8211;&gt;<br />
     &lt;?php<br />
     function gen_input() {<br />
          // Call the function to generate the Session Token variable<br />
          gen_stoken();<br />
          // Generate the form input code<br />
          echo &#8220;&lt;input type=\&#8221;hidden\&#8221; name=\&#8221;" . FTOKEN_NAME . &#8220;\&#8221;<br />
               value=\&#8221;" . $_SESSION[STOKEN_NAME] . &#8220;\&#8221;&gt; &#8220;;<br />
     }<br />
     ?&gt;<br />
     &lt;!&#8211; EOF &#8211;&gt;</p>
<p>我们可以看到，这个函数调用了gen_stoken()函数并且生成在WEB表单中包含隐藏域的HTML代码。</p>
<p>接下来让我们来看实现对隐藏域中提交的Session令牌的检测的函数：</p>
<p>     &lt;!&#8211; start function &#8211;&gt;<br />
     &lt;?php<br />
     function token_check() {<br />
          // Check if the Session Token exists<br />
          if(is_stoken()) {<br />
               // Check if the request has been sent<br />
               if(isset($_REQUEST[FTOKEN_NAME])) {<br />
                    // If the Form Token is different from Session Token<br />
                    // it&#8217;s a malicious request<br />
                    if($_REQUEST[FTOKEN_NAME] != $_SESSION[STOKEN_NAME]) {<br />
                         gen_error(1);<br />
                         destroy_stoken();<br />
                         exit();<br />
                    } else {<br />
                         destroy_stoken();<br />
                    }<br />
               // If it isn&#8217;t then it&#8217;s a malicious request<br />
               } else {<br />
                    gen_error(2);<br />
                    destroy_stoken();<br />
                    exit();<br />
               }<br />
          // If it isn&#8217;t then it&#8217;s a malicious request<br />
          } else {<br />
               gen_error(3);<br />
               destroy_stoken();<br />
               exit();<br />
          }<br />
     }<br />
     ?&gt;<br />
     &lt;!&#8211; EOF &#8211;&gt;</p>
<p>这个函数检测了$_SESSION[STOKEN_NAME]和$_REQUEST[FTOKEN_NAME]的存在性（我使用了$_REQUEST方法来使得GET和POST两种方式提交的表单变量均能够被接受），而后检测他们的值是否相同，因此判断当前表单提交是否是经过认证授权的。</p>
<p>这个函数的重点在于：在每次检测步骤结束后，令牌都会被销毁，并且仅仅在下一次表单页面时才会重新生成。</p>
<p>这些函数的使用方法非常简单，我们只需要加入一些PHP代码结构。</p>
<p>下面是Web表单：</p>
<p>     &lt;!&#8211; form.php &#8211;&gt;<br />
     &lt;?php<br />
          session_start();<br />
          include(&#8220;functions.php&#8221;);<br />
     ?&gt;<br />
     &lt;form method=&#8221;POST&#8221; action=&#8221;resolve.php&#8221;&gt;<br />
          &lt;input type=&#8221;text&#8221; name=&#8221;first_name&#8221;&gt;<br />
          &lt;input type=&#8221;text&#8221; name=&#8221;last_name&#8221;&gt;<br />
          &lt;!&#8211; Call the function to generate the hidden input &#8211;&gt;<br />
          &lt;? gen_input(); ?&gt;<br />
          &lt;input type=&#8221;submit&#8221; name=&#8221;submit&#8221; value=&#8221;Submit&#8221;&gt;<br />
     &lt;/FORM&gt;<br />
     &lt;!&#8211; EOF &#8211;&gt;</p>
<p> 下面是解决的脚本代码：</p>
<p>     &lt;!&#8211; resolve.php &#8211;&gt;<br />
     &lt;?php<br />
          session_start();<br />
          include(&#8220;functions.php&#8221;);<br />
          <br />
          // Call the function to make the check<br />
          token_check();<br />
          <br />
          // Your code<br />
          &#8230;<br />
     ?&gt;<br />
     &lt;!&#8211; EOF &#8211;&gt;</p>
<p>你可以看到，实现这样一个检测是十分简单的，但是它可以避免你的用户表单被攻击者劫持，以避免数据被非法授权。</p>
<h2>5.结论</h2>
<p>让我们对这篇简短的论文做一个结论，你的Web应用程序没有百分百的安全，但是你可以开始避免绝大多数普通的攻击技术。</p>
<p>我希望您关注的另一个要点是，Web开发者<strong>不应当</strong>忽视一般的程序错误（例如XSS 浏览器漏洞等等），不将这些考虑为对您的用户的潜在威胁是一个巨大的错误：你应该永远记得它们将影响程序的信任性、安全性和互操作性。</p>
<p>Cya!</p>
<p>nexus</p>
<p>（前面的PHP代码是从Seride项目中参考的，该项目地址为：http://projects.playhack.net/project.php?id=3）</p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/security/sql-injection-attack" title="SQL注入攻击-来自微软安全博客的建议">SQL注入攻击-来自微软安全博客的建议</a></li><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-class-reference" title="[译文]Google AJAX Language API对象参考">[译文]Google AJAX Language API对象参考</a></li><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-developers-guide" title="[译文]Google AJAX Language API开发者参考">[译文]Google AJAX Language API开发者参考</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/security/preventing-csrf/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>祝大家戊子年新春大吉，万事如意</title>
		<link>http://www.hanguofeng.cn/archives/uncategorized/2008-spring-festival?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=2008-spring-festival</link>
		<comments>http://www.hanguofeng.cn/archives/uncategorized/2008-spring-festival#comments</comments>
		<pubDate>Wed, 06 Feb 2008 11:23:25 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[闲言碎语]]></category>
		<category><![CDATA[春节]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/uncategorized/2008-spring-festival</guid>
		<description><![CDATA[祝所有的亲朋好友在2008戊子年新春大吉，万事如意。 相关内容祝大家己丑年新春大吉，万事如意]]></description>
			<content:encoded><![CDATA[<p>祝所有的亲朋好友在2008戊子年新春大吉，万事如意。</p>
<p><a href="http://picasaweb.google.com/hanguofeng/ggMqCL/photo?authkey=LNLOWahSk4o#5200941091021253426"><img src="http://lh4.ggpht.com/hanguofeng/SC10XdQN6zI/AAAAAAAAAKA/ld9t_ldWf58/s400/m3nqsvdt.jpg" /></a></p>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/uncategorized/2009-spring-festival" title="祝大家己丑年新春大吉，万事如意">祝大家己丑年新春大吉，万事如意</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/uncategorized/2008-spring-festival/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[译文]WordPress插件API手册</title>
		<link>http://www.hanguofeng.cn/archives/web-server/wordpress-plugin-api?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=wordpress-plugin-api</link>
		<comments>http://www.hanguofeng.cn/archives/web-server/wordpress-plugin-api#comments</comments>
		<pubDate>Tue, 01 Jan 2008 09:58:29 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[Web服务器端技术]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/web/wordpress%e6%8f%92%e4%bb%b6api%e6%89%8b%e5%86%8c</guid>
		<description><![CDATA[说明： 译言链接：http://www.yeeyan.com/articles/view/hanguofeng/3805 原文链接：http://codex.wordpress.org/Plugin_API 概述 本文档介绍了在WordPress中对插件开发者有用的API（Application Programming Interface，应用编程接口）的使用方法。 本文假设你已经阅读了简要介绍插件开发方法的文章：Writing a Plugin，本文主要就介绍Hook API，比如Filters、Action，这使得WordPress可以加载你的插件。 注意：本文所提到的信息针对WordPress1.2及以上版本，在1.2版之前，这些插件被称为“hacks”，他们主要是通过修改WordPress本身的源码来实现的。 译者注：在本文中，为了便于对原文的准确翻译，一些程序设计的专有词汇没有进行翻译，你可以阅读如下单词表来参考： API，应用程序编程接口。 Hook，钩子，意为在WordPress的处理中加入你自己的处理。 Filter，过滤器。 Action，动作。 Hooks，Actions和Filters Hook是WordPress提供的，允许你的插件“勾入”WordPress的程序，或者说，可以在特定时候执行你插件中的函数，从而使得你的插件执行。这里提供了两种hook： Action：Action（动作）是WordPress程序核心在程序执行的特殊点（特定事件发生）加载的。使用Action API，你的插件可以在这些特殊点执行一个或者多个在插件中编写的PHP函数。 Filter：Filter（过滤器）是WordPress加载的，当文本被存入数据库或发送到浏览器之前，Filter可用来对其进行多种类型的处理。使用Filter，你的插件可以使用定义在其中的PHP函数来对文本进行多种处理。 某些时候，你可以用Action或者Filter实现同样的功能。举例来说，如果你编写了一个插件用来修改博客日志的文本，你可以加入一个Action函数到publist_post的事件（这样日志就会在存入数据库时被修改），也可以加入一个Fliter函数到the_content（这时日志内会在显示到浏览器之前被修改）。 Actions（动作） Action（动作）在WordPress进行某些特殊事件处理时被触发，例如发布日志，修改主题，或者在管理员面板显示页面。你的插件可以通过执行PHP函数来发挥作用，他们可以用来做如下事情： 修改数据库中的数据 发送Email消息 修改在浏览器中显示的信息（包括管理员看到的和访问者看到的） 实施Action的基本步骤是： 在你的插件中编写当事件发生时执行的PHP函数。 通过执行add_action函数将这些操作Hook（勾入）到WordPress中。 将你的PHP函数放入插件文件，并且将其激活。 编写Action函数 在插件中创建Action的第一步是在插件中编写一个实现Action功能的PHP函数并且将其放入你的插件文件（插件文件必须放置在wp-content/plugins目录）中。比如，如果你希望当发表一篇日志后，发送Email通知给你的朋友，那么你可以定义如下函数： function email_friends($post_ID)  {     $friends = 'bob@example.org,susie@example.org';     mail($friends, "sally's blog updated",       'I just put something on my blog: http://blog.example.com'); [...]]]></description>
			<content:encoded><![CDATA[<p>说明：</p>
<p>译言链接：<a href="http://www.yeeyan.com/articles/view/hanguofeng/3805">http://www.yeeyan.com/articles/view/hanguofeng/3805</a></p>
<p>原文链接：<a href="http://codex.wordpress.org/Plugin_API">http://codex.wordpress.org/Plugin_API</a></p>
<p><span id="more-4"></span></p>
<h2>概述</h2>
<p>本文档介绍了在WordPress中对插件开发者有用的API（Application Programming Interface，应用编程接口）的使用方法。</p>
<p>本文假设你已经阅读了简要介绍插件开发方法的文章：<a href="http://codex.wordpress.org/Writing_a_Plugin" title="Writing a Plugin"><strong><font color="#003366">Writing a Plugin</font></strong></a>，本文主要就介绍Hook API，比如Filters、Action，这使得WordPress可以加载你的插件。</p>
<p>注意：本文所提到的信息针对WordPress1.2及以上版本，在1.2版之前，这些插件被称为“hacks”，他们主要是通过修改WordPress本身的源码来实现的。</p>
<p>译者注：在本文中，为了便于对原文的准确翻译，一些程序设计的专有词汇没有进行翻译，你可以阅读如下单词表来参考：</p>
<ul>
<li>API，应用程序编程接口。</li>
<li>Hook，钩子，意为在WordPress的处理中加入你自己的处理。</li>
<li>Filter，过滤器。</li>
<li>Action，动作。</li>
</ul>
<h2>Hooks，Actions和Filters</h2>
<p>Hook是WordPress提供的，允许你的插件“勾入”WordPress的程序，或者说，可以在特定时候执行你插件中的函数，从而使得你的插件执行。这里提供了两种hook：</p>
<ol>
<li>Action：Action（动作）是WordPress程序核心在程序执行的特殊点（特定事件发生）加载的。使用Action API，你的插件可以在这些特殊点执行一个或者多个在插件中编写的PHP函数。</li>
<li>Filter：Filter（过滤器）是WordPress加载的，当文本被存入数据库或发送到浏览器之前，Filter可用来对其进行多种类型的处理。使用Filter，你的插件可以使用定义在其中的PHP函数来对文本进行多种处理。</li>
</ol>
<p>某些时候，你可以用Action或者Filter实现同样的功能。举例来说，如果你编写了一个插件用来修改博客日志的文本，你可以加入一个Action函数到publist_post的事件（这样日志就会在存入数据库时被修改），也可以加入一个Fliter函数到the_content（这时日志内会在显示到浏览器之前被修改）。</p>
<h2>Actions（动作）</h2>
<p>Action（动作）在WordPress进行某些特殊事件处理时被触发，例如发布日志，修改主题，或者在管理员面板显示页面。你的插件可以通过执行PHP函数来发挥作用，他们可以用来做如下事情：</p>
<ul>
<li>修改数据库中的数据</li>
<li>发送Email消息</li>
<li>修改在浏览器中显示的信息（包括管理员看到的和访问者看到的）</li>
</ul>
<p>实施Action的基本步骤是：</p>
<ol>
<li>在你的插件中编写当事件发生时执行的PHP函数。</li>
<li>通过执行add_action函数将这些操作Hook（勾入）到WordPress中。</li>
<li>将你的PHP函数放入插件文件，并且将其激活。</li>
</ol>
<h3>编写Action函数</h3>
<p>在插件中创建Action的第一步是在插件中编写一个实现Action功能的PHP函数并且将其放入你的插件文件（插件文件必须放置在wp-content/plugins目录）中。比如，如果你希望当发表一篇日志后，发送Email通知给你的朋友，那么你可以定义如下函数：</p>
<p><code>function email_friends($post_ID)  {<br />
    $friends = 'bob@example.org,susie@example.org';<br />
    mail($friends, "sally's blog updated",<br />
      'I just put something on my blog: http://blog.example.com');<br />
    return $post_ID;<br />
}<br />
</code></p>
<p>在大多数Action中，你的函数应该接受一个参数（通常是日志或者帖子的编号，这取决于你要进行的操作）。某些Action可能有多余一个参数&#8211;你可以通过查看Action的文档或者WordPress源代码来获得更多信息。除函数参数外，你还可以访问WordPress的全局变量以及执行WordPress中定义的其他函数（或者在你的插件文件中定义的函数）。</p>
<p><strong>注意</strong>：切记其他插件或者WordPress核心可能已经使用了你希望使用的函数名称，你可以浏览<a href="http://www.yeeyan.com/Writing_a_Plugin#Avoiding_Function_Name_Collisions" title="Writing a Plugin"><strong><font color="#003366">Avoiding Function Name Collisions</font></strong></a>（避免函数名称冲突&#8211;译者注）来获得更多信息。</p>
<h3>Hook（勾入）到WordPress</h3>
<p>完成你的函数的编写后，下一步就是将其hook（勾入）或者说注册到WordPress中，你可以通过执行全局空间中的add_action()函数来实现，如：</p>
<p><code>add_action ( 'hook_name', 'your_function_name', [priority], [accepted_args] );</code>此处</p>
<ul>
<li>hook_name参数是WordPress提供的Action Hook（动作钩子）名称，这决定了你的函数应当和哪个事件结合。</li>
<li>your_function_name参数是你希望在特定事件（即hook_name参数指定的事件）后执行的函数名称。该函数可以是标准的PHP函数，在WordPress核心中定义的函数或者你自己在插件文件中定义的函数（如刚才我们编写的emai_friends函数）。</li>
<li>priority参数是一个可选的整型参数，他用来指明在结合特定事件的多个函数中，当前函数被执行的顺序（默认为10）。该参数指定的更小的数字会被更早的执行，priority参数相同的函数会依照他们被加入Action的顺序来执行。</li>
<li>accepted_args参数是一个可选的整型参数，他定义了你的函数中可以接收多少个参数（默认为1）。该参数是非常有用的，因为某些Hook可以向你的函数中传入多个参数。该参数在1.5.1版本中被新加入。</li>
</ul>
<p>在前面的例子中，我们可以在插件文件中加入如下代码：</p>
<p><code>add_action('publish_post', 'email_friends');</code>同样的，你也可以在Action Hook中移除Action，你可以参考<a href="#Removing_Actions_and_Filters"><strong><font color="#003366">Remove Actions</font></strong></a>来获得更多详情。</p>
<h3>安装和激活</h3>
<p>让你的Action Hook开始工作的最后一步是安装插件文件和激活插件。你必须将你编写的PHP函数和add_action函数存入同一个PHP文件，该PHP文件必须被安装在wp-content/plugins目录，当该文件安装完毕，你需要浏览WordPress的管理面板，并且激活你的插件，你可以参考<a href="http://codex.wordpress.org/Managing_Plugins" title="Managing Plugins"><strong><font color="#003366">Managing Plugins</font></strong></a>文章来获得更多信息。</p>
<h3>当前可用的Action Hook</h3>
<p>请浏览<a href="http://codex.wordpress.org/Plugin_API/Action_Reference" title="Plugin API/Action Reference"><strong><font color="#003366">Plugin API/Action Reference</font></strong></a>（插件API/Action参考&#8211;译者注）来获得一份当前版本的WordPress中可用的Action Hook。</p>
<h2>Filters（过滤器）</h2>
<p>Filters（过滤器）是WordPress在执行中的特定点传递数据的函数，他发生在对数据进行操作（如将其加入数据库或发送到浏览器）之前。Filter建立在数据库到浏览器之间的处理（当WordPress生成页面时），同时也建立在浏览器到数据库之间的处理（当WordPress新增日志或者评论到数据库时）；多数WordPress中的输入输出都通过了至少一个filter。WordPress默认已经实现了一些过滤操作，你的插件也可以加入你自己的过滤操作。</p>
<p>将你的filter加入WordPress中的基本步骤如下：</p>
<ol>
<li>编写用于过滤数据的PHP函数。</li>
<li>通过执行add_filter函数将filter Hook（勾入）到WordPress。</li>
<li>将你的PHP函数放入插件文件，并且将其激活。</li>
</ol>
<h3>编写Filter（过滤器）函数</h3>
<p>Filter（过滤器）函数获得未经修改的数据，并返回修改后的数据（或者在某些情况下，返回null值来标识数据应当被删除或忽略）。如果你的filter不修改数据，那么应当返回原始数据，这样，如果必要，其余的插件可以继续修改数据。</p>
<p>因此，在你的插件中创建filter的第一步是编写一个PHP函数来进行过滤处理，并且将其放在你的插件文件（插件文件必须放置在wp-content/plugins目录）当中。例如，如果你希望确保你的帖子和评论中不包含脏话，你可以定义一个存放禁止词汇的全局变量，然后编写如下的PHP函数：</p>
<p><code>function filter_profanity($content) {<br />
    global $profanities;<br />
    foreach($profanities as $profanity) {<br />
        $content=str_ireplace($profanity,'{censored}',$content);<br />
    }<br />
    return $content;<br />
}<br />
</code><strong>注意</strong>：切记其他插件或者WordPress核心可能已经使用了你希望使用的函数名称，你可以浏览<a href="#Avoiding_Function_Name_Collisions" title="Writing a Plugin"><strong><font color="#003366">Avoiding Function Name Collisions</font></strong></a>（避免函数名称冲突&#8211;译者注）来获得更多信息。</p>
<h3>Hook（勾入）到WordPress</h3>
<p>完成你的函数的编写后，下一步就是将其hook（勾入）或者说注册到WordPress中，你可以通过执行全局空间中的add_filter()函数来实现，如：</p>
<p><code>add_filter('hook_name', 'your_filter', [priority], [accepted_args]);</code>此处：</p>
<ul>
<li>hook_name参数是WordPress提供的Filter Hook（过滤器钩子）名称，这决定了你的函数在何时发挥作用。</li>
<li>your_filter参数是你希望用来过滤的函数的名称。该函数可以是标准的PHP函数，在WordPress核心中定义的函数或者你自己在插件文件中定义的函数。</li>
<li>priority参数是一个可选的整型参数，他用来指明在结合特定事件的多个函数中，当前函数被执行的顺序（默认为10）。该参数指定的更小的数字会被更早的执行，priority参数相同的函数会依照他们被加入Action的顺序来执行。</li>
<li>accepted_args参数是一个可选的整型参数，他定义了你的函数中可以接收多少个参数（默认为1）。该参数是非常有用的，因为某些Hook可以向你的函数中传入多个参数。该参数在1.5.1版本中被新加入。</li>
</ul>
<p>在前面的例子中，我们可以将下面的代码放入你的插件文件中的主要执行部分，来通知WordPress对评论中的脏话进行过滤处理：</p>
<p>add_filter(&#8216;comment_text&#8217;,'filter_profanity&#8217;);</p>
<p>你也可以使用WordPress函数remove_filter()来移除filter hook中的filter。你可以参考<a href="#Removing_Actions_and_Filters"><strong><font color="#003366">Removing Actions and Filters</font></strong></a>文章。</p>
<h3>安装和激活</h3>
<p>让你的Filter Hook开始工作的最后一步是安装插件文件和激活插件。你必须将你编写的PHP函数和add_filter函数存入同一个PHP文件，该PHP文件必须被安装在wp-content/plugins目录，当该文件安装完毕，你需要浏览WordPress的管理面板，并且激活你的插件，你可以参考<a href="http://codex.wordpress.org/Managing_Plugins" title="Managing Plugins"><strong><font color="#003366">Managing Plugins</font></strong></a>文章来获得更多信息。</p>
<h3>当前可用的Filter Hook</h3>
<p>请浏览<a href="http://codex.wordpress.org/Plugin_API/Filter_Reference" title="Plugin API/Filter Reference"><strong><font color="#003366">Plugin API/Filter Reference</font></strong></a> （插件API/Filter参考&#8211;译者注）来获得一份当前版本的WordPress中可用的Filter Hook。 </p>
<h2>删除Action和Filter</h2>
<p>在某些情况下，你会发现你希望你的插件屏蔽WordPress内建或者其他插件加入的Action或Filter。你可以通过执行<code>remove_filter('filter_hook','filter_function')函数或者remove_action('action_hook','action_function')函数来实现。</code></p>
<p>举例来说，remove_action(&#8216;publish_post&#8217;,'generic_ping&#8217;);会使得你在发表新日志时不发送日志引用（ping）。</p>
<p>注意如果某个hook在注册时使用了除默认值10意外的priority参数，则你必须修改在remove_action()函数中的priority参数。同时也请注意，通常来讲除非你知道这样做的原因和后果，你不应当移除任何东西&#8211;请检查WordPress或者其他插件的源代码来保证这一点。</p>
<h2>默认应用的Filter和Action</h2>
<p>找出WordPress默认启用的filter和Action的最可靠方法是在WordPress核心文件中搜索 add_filter和add_action。</p>
<h3>WordPress 2.1</h3>
<p>在WordPress 2.1中，大多数默认filter和action是通过文件wp-includes/default-filters.php来加入的，少数其他的在如下文件中被加入：</p>
<ul>
<li>wp-admin/admin-ajax.php</li>
<li>wp-admin/admin-functions.php</li>
<li>wp-admin/custom-header.php</li>
<li>wp-admin/edit.php</li>
<li>wp-admin/index.php</li>
<li>wp-admin/options-permalink.php</li>
<li>wp-admin/upload-functions.php</li>
<li>wp-admin/upload.php</li>
<li>wp-includes/bookmark.php</li>
<li>wp-includes/general-template.php</li>
<li>wp-includes/kses.php</li>
<li>wp-includes/plugin.php</li>
<li>wp-includes/rewrite.php</li>
<li>wp-includes/template-loader.php</li>
<li>wp-includes/theme.php</li>
</ul>
<h3>WordPress 1.5</h3>
<p>大多数默认的filter和action在WordPress 1.5的文件wp-includes/default-filters.php中被加入。</p>
<h2>你可以覆盖的函数</h2>
<p>除了前面描述的hook（包括action和filter）之外，另一个修改WordPress行为的插件编写方法是覆盖WordPress函数。事实上，WordPress设计了一些让插件重新定义的函数。WordPress通过仅当所有插件都加载之后才加载这些函数的方式来使得这个方式变得容易。</p>
<p>这些函数均定义在文件wp-includes/pluggable.php中，如下是其清单（在2.1版本中）；这些函数中的部分文档可以在<a href="http://www.yeeyan.com/Function_Reference" title="Function Reference"><strong><font color="#003366">Function Reference</font></strong></a>（函数参考-译者注）中找到。</p>
<ul>
<li><tt>set_current_user</tt></li>
<li><tt>wp_set_current_user</tt></li>
<li><tt>wp_get_current_user</tt></li>
</ul>
<h3  class="related_post_title">相关内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/security/sql-injection-attack" title="SQL注入攻击-来自微软安全博客的建议">SQL注入攻击-来自微软安全博客的建议</a></li><li><a href="http://www.hanguofeng.cn/archives/web-server/google-language-for-wordpress" title="Google Language for WordPress">Google Language for WordPress</a></li><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-class-reference" title="[译文]Google AJAX Language API对象参考">[译文]Google AJAX Language API对象参考</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/web-server/wordpress-plugin-api/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>新玄猫,新博客</title>
		<link>http://www.hanguofeng.cn/archives/uncategorized/new-blog?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=new-blog</link>
		<comments>http://www.hanguofeng.cn/archives/uncategorized/new-blog#comments</comments>
		<pubDate>Tue, 01 Jan 2008 09:05:38 +0000</pubDate>
		<dc:creator>hanguofeng</dc:creator>
				<category><![CDATA[闲言碎语]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[玄猫]]></category>

		<guid isPermaLink="false">http://www.hanguofeng.cn/archives/uncategorized/new-blog</guid>
		<description><![CDATA[新玄猫,新博客 随机内容北京法源寺游记[译文]Google AJAX Language API开发者参考[话题营销]点亮灵感，乐触生活]]></description>
			<content:encoded><![CDATA[<p>新玄猫,新博客<br />
<!--b9ed6960--></p>
<h3  class="related_post_title">随机内容</h3><ul class="related_post"><li><a href="http://www.hanguofeng.cn/archives/web-client/parseint-bug-in-firefox-3-5-2" title="parseInt bug in firefox 3.5.2">parseInt bug in firefox 3.5.2</a></li><li><a href="http://www.hanguofeng.cn/archives/life/beyond-summer" title="Beyond summer">Beyond summer</a></li><li><a href="http://www.hanguofeng.cn/archives/web-client/google-ajax-language-api-class-reference" title="[译文]Google AJAX Language API对象参考">[译文]Google AJAX Language API对象参考</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.hanguofeng.cn/archives/uncategorized/new-blog/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->