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

<channel>
	<title>小李刀刀博客</title>
	<atom:link href="http://wukangrui.net/feed" rel="self" type="application/rss+xml" />
	<link>http://wukangrui.net</link>
	<description>独立 自由 责任 诚实</description>
	<lastBuildDate>Sat, 04 Jul 2009 19:33:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP 5.3.0 发布</title>
		<link>http://wukangrui.net/2009/07/05/php-5-3-0-release-new-feature.html</link>
		<comments>http://wukangrui.net/2009/07/05/php-5-3-0-release-new-feature.html#comments</comments>
		<pubDate>Sat, 04 Jul 2009 19:33:30 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/07/05/php-5-3-0-release-new-feature.html</guid>
		<description><![CDATA[如今PHP 5.3.0也像ASP.NET一样，引入了命名空间、延迟绑定、匿名函数、Lambda表达式等先进特性，可见编程语言与平台无关性在未来将更加凸显，而混合编程的正确性和先进性也将不断得到体现。封闭自己，拒绝变化的产品和思想，在开发领域只有死路一条。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.php.net/" rel="external" target="_blank">PHP 官方网站</a> 6月30日放出了<a href="http://www.php.net/archive/2009.php#id2009-06-30-1" rel="external" target="_blank">PHP 5.3.0 正式发布的消息</a>，该版本是PHP 5.x系列的一个重要里程碑。根据 PHP 官方网站7月3日更新的 <a href="http://cn2.php.net/manual/en/migration53.new-features.php" rel="external" target="_blank">PHP 5.3.0 新特性</a> 介绍，PHP 5.3.0 主要包括以下新增特性或功能：</p>
<p> <span id="more-845"></span>
</p>
<ul>
<li>支持<a href="http://php.net/namespaces" rel="external" target="_blank">命名空间</a> </li>
<li>支持<a href="http://cn2.php.net/manual/en/language.oop5.late-static-bindings.php" rel="external" target="_blank">延迟静态绑定</a>技术 </li>
<li>支持<a href="http://cn2.php.net/manual/en/control-structures.goto.php" rel="external" target="_blank">跳转标签</a>（受限制的goto） </li>
<li>支持<a href="http://cn2.php.net/manual/en/functions.anonymous.php" rel="external" target="_blank">闭包</a>（Lambda表达式和匿名函数） </li>
<li>新增两个魔法函数，<a href="http://cn2.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods" rel="external" target="_blank">__callStatic</a> 和 <a href="http://cn2.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.invoke" rel="external" target="_blank">__invoke</a> </li>
<li>新增 <a href="http://cn2.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc" rel="external" target="_blank">Nowdoc</a> 语法支持，与 <a href="http://cn2.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc" rel="external" target="_blank">Heredoc</a> 语法相同但是带有单引号 </li>
<li>可以在静态变量和类成员、类构造函数中使用 Heredoc 语法 </li>
<li>Heredoc 可以用双引号定义，以便与 Nowdoc 的单引号区别 </li>
<li><a href="http://cn2.php.net/manual/en/language.constants.syntax.php" rel="external" target="_blank">构造函数</a>可以在类之外用 <em>const</em> 关键词进行定义 </li>
<li>增加了<a href="http://cn2.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary" rel="external" target="_blank">条件操作符</a>的简短形式 ?: (例如 a = condition ? true : false） </li>
<li>200 到 399 的状态码在HTTP数据流容器被认为是成功 </li>
<li>允许动态访问静态成员 </li>
<li>允许对<a href="http://cn2.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary" rel="external" target="_blank">异常</a>进行嵌套 </li>
<li>增加并且默认启用垃圾回收机制 </li>
</ul>
<p>此外，针对Windows版本的改变有：</p>
<ul>
<li>不再支持Windows98,ME和NT4，最低支持Windows 2000 </li>
<li>Windows 二进制版本针对 i586 或更高版本编译，不再支持 i386和i486 </li>
<li>对 Windows 系统上的 64位 PHP 提供支持（实验性的） </li>
<li>支持Visual C++ 9（VC9）编译，可以使用 Visual Studio 2008。 </li>
<li><a href="http://cn2.php.net/manual/en/ref.pdo-oci.php" rel="external" target="_blank">PDO_OCI</a> 的 php_pdo_oci8.dll 库（用于Oracle 8的客户端类库）不再构建，替代它的是 php_pdo_oci.dll（去掉了“8”），用于 Oracle 10 或者 11。与其他版本的数据库连接继续支持。 </li>
<li>针对 <a href="http://cn2.php.net/manual/en/book.oci8.php" rel="external" target="_blank">OCI8</a> 的扩展，除了php_oci8.dll之外增加了一个php_oci8_11g.dll，但是不能同时启用。php_oci8.dll与Oracle 10.2客户端类库结合使用，而php_oci8_11g.dll 和 Oracle 11客户端类库结合使用。与其他版本数据库的连接继续支持。 </li>
</ul>
<p>Windows版本新增加了对下列函数的支持：</p>
<ul>
<li><a href="http://cn2.php.net/function.checkdnsrr.php">checkdnsrr()</a> </li>
<li>d<a href="http://cn2.php.net/function.dns-get-record.php">ns_get_record()</a> </li>
<li><a href="http://cn2.php.net/function.fnmatch.php">fnmatch()</a> </li>
<li><a href="http://cn2.php.net/function.getmxrr.php">getmxrr()</a> </li>
<li><a href="http://cn2.php.net/function.getopt.php">getopt()</a> </li>
<li><a href="http://cn2.php.net/function.imagecolorclosesthwb.php">imagecolorclosesthwb()</a> </li>
<li><a href="http://cn2.php.net/function.inet-ntop.php">inet_ntop()</a> </li>
<li><a href="http://cn2.php.net/function.inet-pton.php">inet_pton()</a> </li>
<li><a href="http://cn2.php.net/function.link.php">link()</a> </li>
<li><a href="http://cn2.php.net/function.linkinfo.php">linkinfo()</a> </li>
<li><a href="http://cn2.php.net/function.mcrypt-create-iv.php">mcrypt_create_iv()</a> </li>
<li><a href="http://cn2.php.net/function.readlink.php">readlink()</a> </li>
<li><a href="http://cn2.php.net/function.socket-create-pair.php">socket_create_pair()</a> &#8211; 这个函数以前就在Windows中支持，但是由于在PHP 4.3.0中的一个bug而被禁用 </li>
<li><a href="http://cn2.php.net/function.stream-socket-pair.php">stream_socket_pair()</a> </li>
<li><a href="http://cn2.php.net/function.symlink.php">symlink()</a> </li>
<li><a href="http://cn2.php.net/function.time-nanosleep.php">time_nanosleep()</a> </li>
<li><a href="http://cn2.php.net/function.time-sleep-until.php">time_sleep_until()</a> </li>
</ul>
<p>除了上述改变外，Windows版本还有一些其它提升性能或者增加兼容性的改进，而最为重要的则是一条针对Windows的说明：</p>
<p>在windows下采用ISAPI方式运行PHP已经被遗弃，采用改进的FastCGI SAPI模块来代替。我在<a href="http://wukangrui.net/2008/06/23/fastcgi-for-php-in-iis.html" rel="external" target="_blank">2008年6月23日的日志</a>中曾经笑称“PHP成为IIS‘一等公民’”，那是只是从微软IIS团队官方发布PHP的FastCGI模块，以及微软和Zend的合作而对PHP在Windows平台上的使用做了最乐观的展望，而后来微软在IIS7以后的版本内置FastCGI模块，甚至在云服务中也内置FastCGI支持，则更说明了PHP与Windows的联姻将继续增强。可惜的是直到Windows7发布之后，网上的绝大部分教程依然在教新手采用ISAPI方式运行PHP，甚至是采用PHP4的安装方式。甚至还有人专门跑到我的空间里叫嚣在Windows下运行PHP是如何如何。开源社区对Windows平台的妖魔化，至今影响深远。正是由于拒绝导致了他们对Windows、ASP.NET、C#的不了解，甚至直至今日还死抱着Windows比Linux慢、不如Linux安全之类的陈旧观念。</p>
<p>如今PHP 5.3.0也像ASP.NET一样，引入了命名空间、延迟绑定、匿名函数、Lambda表达式等先进特性，可见编程语言与平台无关性在未来将更加凸显，而混合编程的正确性和先进性也将不断得到体现。封闭自己，拒绝变化的产品和思想，在开发领域只有死路一条。</p>
<h3>相关日志</h3>
<ul class="related_post">
<li>2008-06-04 &#8212; <a href="http://wukangrui.net/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li>
<li>2008-05-23 &#8212; <a href="http://wukangrui.net/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li>
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/asp-net-mvc-best-practices-part-2.html" title="ASP.NET MVC 最佳实践（二）">ASP.NET MVC 最佳实践（二）</a></li>
<li>2009-06-28 &#8212; <a href="http://wukangrui.net/2009/06/28/asp-net-mvc-best-practices-part-1.html" title="ASP.NET MVC 最佳实践（一）">ASP.NET MVC 最佳实践（一）</a></li>
<li>2009-06-08 &#8212; <a href="http://wukangrui.net/2009/06/08/using-fastcgi-to-host-php-applications-on-iis-7x.html" title="在 IIS 7.x 中用 FastCGI 运行 PHP">在 IIS 7.x 中用 FastCGI 运行 PHP</a></li>
<li>2008-06-23 &#8212; <a href="http://wukangrui.net/2008/06/23/fastcgi-for-php-in-iis.html" title="微软官方FastCGI，PHP成为IIS“一等公民”">微软官方FastCGI，PHP成为IIS“一等公民”</a></li>
<li>2008-06-22 &#8212; <a href="http://wukangrui.net/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li>
<li>2008-06-22 &#8212; <a href="http://wukangrui.net/2008/06/22/thinking-about-html-page-creating.html" title="静态页面生成的思考">静态页面生成的思考</a></li>
<li>2008-06-18 &#8212; <a href="http://wukangrui.net/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li>
<li>2007-11-19 &#8212; <a href="http://wukangrui.net/2007/11/19/install-eacceleartor-in-dreamhost.html" title="如何在DreamHost主机上安装eAcceleartor支持[翻译]">如何在DreamHost主机上安装eAcceleartor支持[翻译]</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wukangrui.net/2009/07/05/php-5-3-0-release-new-feature.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>不管是什么颜色的&#8220;坝&#8221;我们都不怕</title>
		<link>http://wukangrui.net/2009/07/03/we-naver-fear-any-dam.html</link>
		<comments>http://wukangrui.net/2009/07/03/we-naver-fear-any-dam.html#comments</comments>
		<pubDate>Fri, 03 Jul 2009 12:42:14 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[指手划脚]]></category>
		<category><![CDATA[互联网]]></category>
		<category><![CDATA[绿坝]]></category>
		<category><![CDATA[自由]]></category>
		<category><![CDATA[评论]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/07/03/we-naver-fear-any-dam.html</guid>
		<description><![CDATA[只要墙还没倒，就算没有“蓝坝”，也会有别的“坝”继续亮相，而不管什么样的“坝”，都只不过是浪费纳税人金钱的小丑表演罢了。网络引导自由，什么颜色的“墙”，我们都不怕。]]></description>
			<content:encoded><![CDATA[<p>这两天网上开始出现了一些<a href="http://www.prnews.cn/press_release/25823.htm" rel="external" target="_blank">关于“蓝坝”的报道</a>。从7月2日<a href="http://www.prnews.cn/" rel="external" target="_blank">中国商业电讯</a>首发开始，很快就被多家媒体转载。这些报道称在绿坝软件刚刚被宣布推迟预装的时候，另一款性能超过绿坝20倍的“蓝坝”<font color="#ff0000"><strong>拟</strong></font>研制。最早的新闻里是“拟研制”，不过到了后面的转载报道以及评论里就有很多演绎成了“正在研制”、“正在开发”等说法。</p>
<p> <span id="more-842"></span>
<p>我甚至很恶意地揣测：这会不会是工信部耍的一个调虎离山的小把戏。目的就像之前用打击google来转移大家对绿坝的关注一样，通过树起一个更具吸引力但是却虚无缥缈的新靶子给大家攻击，这样针对绿坝采购事件前因后果及黑箱内幕的质疑就会少很多。不过这只是揣测而已，而且的确是恶意的揣测。</p>
<p>因为中国商业电讯只不过是<a href="http://www.tixa.com/" rel="external" target="_blank">天下互联</a>这个商业机构的一个成员单位，它只是为企业提供市场情报分析和财经内容的一个信息领域的小公司而已。关于蓝坝的那篇报道，是属于“厂商信息”里的一篇普通文章，这样的信息，完全有可能是来自于<a href="http://www.adtsec.com/" rel="external" target="_blank">安达通</a>，安达通作为一个网络检测产品提供商，面对“绿坝蒙羞，元首震怒”这种极佳的机会，要说他们不想成为下一个金惠，那是不可能的。因此我的另一个恶意的揣测就是所谓的“蓝坝拟研制”的新闻，会不会是安达通放出来做市场调研，同时向工信部暗送秋波的一个手段。安达通项目负责人甚至在介绍这款名为“蓝坝——网络引航”的系统时刻意强调“蓝坝更注重个人隐私的保护”，并针对绿坝出现的与杀毒软件不兼容等问题来介绍“蓝坝”，由此可见我的恶意猜测还是有几分靠谱的。</p>
<p>不过如果是这样的话，那么上海安达通的项目策划人显然没有真正搞清楚绿坝遭反对以及走向失败的根本原因。如果“蓝坝”真的以超过绿坝20倍的性能并且对所有“采用分布式审计方式搜集的主机数据进行加密”，让这些数据装到一个黑盒里“不会被轻易获取”，那他将要遭到的反击或许也是20倍于绿坝的。既然绿坝这么不成器的东西网民都不愿意自己的隐私和言论自由被它威胁，那么像“蓝坝”这样监控能力更强大而且网民连自己到底什么被监控和搜集了都不知道的东西，岂不是更加引起人们的恐慌和更加激烈的反对呢？</p>
<p>实际上，一切的“坝”都是“墙”的衍生品，网民们反对的并不是某一款具体的软件或某一项具体的技术，网民真正反对、抵制、攻击的，是一切带有“墙”色彩的东西。所以不管你是绿的还是蓝的，只要你是试图危害网民合法权益的，你就必然遭到反对。而且你越先进，遭到的反击也越激烈。所以不管是意图转移注意力，还是意图试探网民反应，最终的结果都必定是让始作俑者失望的。</p>
<p>绿坝来了，我们反对绿坝；google被陷害了，我们就挺一下google；假如真的有“蓝坝”、“红坝”、“水泥坝”之类的来了，我们也一样会一如既往地批评和抗议。如果这一切都没有的时候呢？我们就继续拆墙。所以网民的注意力从来都没有转移过，网民的注意力一直就维绕着捍卫自己的合法权力这个核心，从未偏离。</p>
<p>至于20倍的性能或是加密的数据，毛主席早就教导过我们，一切反动派都是纸老虎，任何视图抵抗科技进步、民主进步的反动力量，都不会有好下场的。只要墙还没倒，就算没有“蓝坝”，也会有别的“坝”继续亮相，而不管什么样的“坝”，都只不过是浪费纳税人金钱的小丑表演罢了。</p>
<p>网络引导自由，什么颜色的“墙”，我们都不怕。</p>
<h3>相关日志</h3>
<ul class="related_post">
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/green-dam-delay-means-nothing.html" title="推迟的本质就是不了了之">推迟的本质就是不了了之</a></li>
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/sony-disclaimer-for-supply-green-dam.html" title="索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹">索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹</a></li>
<li>2009-06-28 &#8212; <a href="http://wukangrui.net/2009/06/28/google-event-effection.html" title="google域名劫持事件的影响">google域名劫持事件的影响</a></li>
<li>2009-06-24 &#8212; <a href="http://wukangrui.net/2009/06/24/seven-ways-refuse-green-dam.html" title="七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠">七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠</a></li>
<li>2009-07-03 &#8212; <a href="http://wukangrui.net/2009/07/03/china-cyblepolice-ridiculous-illegal-information.html" title="一个小网警的龌龊思想">一个小网警的龌龊思想</a></li>
<li>2009-06-26 &#8212; <a href="http://wukangrui.net/2009/06/26/hello-world.html" title="Hello World!">Hello World!</a></li>
<li>2009-06-23 &#8212; <a href="http://wukangrui.net/2009/06/23/china-websites-damned-google-spread-pornography-information.html" title="国内媒体联合打击google是举国之力玩&ldquo;不正当竞争&rdquo;">国内媒体联合打击google是举国之力玩&ldquo;不正当竞争&rdquo;</a></li>
<li>2009-06-19 &#8212; <a href="http://wukangrui.net/2009/06/19/green-dam-is-not-for-people.html" title="绿坝：初衷是好的就够了吗？">绿坝：初衷是好的就够了吗？</a></li>
<li>2009-06-04 &#8212; <a href="http://wukangrui.net/2009/06/04/china-internet-law-in-wrong-way.html" title="中国互联网管理需要清醒一下找找方向">中国互联网管理需要清醒一下找找方向</a></li>
<li>2009-07-02 &#8212; <a href="http://wukangrui.net/2009/07/02/transformer-2-alternative-comment.html" title="变形金刚2的重大教育意义">变形金刚2的重大教育意义</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wukangrui.net/2009/07/03/we-naver-fear-any-dam.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个小网警的龌龊思想</title>
		<link>http://wukangrui.net/2009/07/03/china-cyblepolice-ridiculous-illegal-information.html</link>
		<comments>http://wukangrui.net/2009/07/03/china-cyblepolice-ridiculous-illegal-information.html#comments</comments>
		<pubDate>Thu, 02 Jul 2009 17:45:30 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[指手划脚]]></category>
		<category><![CDATA[互联网]]></category>
		<category><![CDATA[社会]]></category>
		<category><![CDATA[网络监察]]></category>
		<category><![CDATA[评论]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/07/03/china-cyblepolice-ridiculous-illegal-information.html</guid>
		<description><![CDATA[假如真的有那一天，民皆不语，道路以目的时候，那样的后果是什么，中国历史上不是没有demo。]]></description>
			<content:encoded><![CDATA[<p>前几天网上曾经出现过<a href="http://www.chinagfw.org/2009/06/blog-post_28.html" rel="external" target="_blank">一篇网站监测工作人员的道白</a>(原文发表处此文已被隐藏，这里链接到一个不会删除或隐藏的地方，需要的同学请翻墙围观），不过他们是职业的网站监测工作人员，所以文章的重点是介绍监测工作的整个流程和一些技术细节。我每天的工作中也包括根据IDC服务商和网监的要求删除不少帖子和博文，不过我写这篇文章并不是想说我很为自己所做的事情可耻。在我<a href="http://wukangrui.net/2009/06/16/thinking-after-judgement-of-deng-yujiao.html" rel="prev" target="_blank">之前的文章</a>里有说过，从最初的被迫删除，到现在据理力争和依法拒绝，如果换成我的某些同事来做这件事，死在我们网站上的言论应该会更多。</p>
<p> <span id="more-840"></span>
<p>而作为一个专业的技术人员兼不专业的网络检测工作人员，我对网监的工作仅限于我所了解的，但是我每天都要收到的很多荒谬删帖要求，充分说明了天朝现在的网络监察体系已经奇怪到了匪夷所思的地步。我贴一个昨天接到要求让我删除的博客文章，大家一起来围观一下，再动动脑筋，看谁先猜到这个文章哪里“有害”：</p>
<blockquote><p>生在幸运52的成人笑话，据说李咏都笑晕了！！！！！      <br />一对夫妻，猜食品名称，老婆比划老公猜。       <br />大屏幕上跳出&quot;馒头&quot;一词       <br />老婆描述：圆圆的，白白的，能吃的       <br />老公：……       <br />老婆继续描述：就是白白的，软软的，你昨晚上还吃来着！       <br />老公看来是急坏了，脱口而出：“mimi！”       <br />李咏都笑趴下了…… </p>
<p>大屏幕上跳出&quot;醋&quot;一字      <br />老公：女人最喜欢吃男人的什么呀？       <br />老婆（兴高采烈地）：豆腐！！       <br />女的比划，男的猜，题板是宋庆龄       <br />女的说：是个女的，很漂亮，国母，她的姓是唐朝后面的那个朝代       <br />男的脱口而出：宋祖英       <br />全场哗然！！！！       <br />李咏曰：玩笑开大了 </p>
<p>猜词环节      <br />比画的说：三国演义中关羽骑的是什么马？       <br />猜的人不知道，比画的又提示：再想想，这马吕布也骑过。       <br />猜的人大喊：是貂禅。       <br />比画的大怒：你傻啊，我说的是白天骑的！       <br />老李当时笑翻在地！！！！ </p>
<p>猜词秀环节      <br />一对夫妻，猜历史文物，老婆比划老公猜。       <br />大屏幕上跳出&quot;金刚经&quot;一词       <br />老婆描述：古来就有的， 很有名的       <br />老公：…………       <br />老婆继续描述：就是那个尼姑每个月都要念的       <br />老公看来是明白了，脱口而出：&quot;月经&quot;       <br />李咏说：&quot;我的妈呀！导播剪了吧&quot; </p>
<p>还是那对夫妻，猜物品名称，老婆比划老公猜。      <br />大屏幕上跳出“V3手机”一词       <br />老婆描述：有一款是粉红色的，今年最流行的，你给我买过的       <br />老公：…………       <br />老婆继续描述：那个美女萨拉波娃也用过的，也是我最喜欢的，四个字的       <br />老公豁出去了，又脱口而出：“情趣内衣”       <br />倒霉的李咏又笑趴下了…… </p>
<p>一对夫妻，猜颜色，老公比划老婆猜。      <br />大屏幕上跳出“白色”一词老公不断比划，老婆还是不知道……       <br />老公急了，于是……       <br />老公描述：李咏的内衣！       <br />老婆：白色！       <br />全场倒……（当天李咏穿着西服，内穿白衬衫）</p>
</blockquote>
<p>因为当时我接到的通知只说要求删除此有害信息，没有哪里有害，所以我第一反应就是顶回去，让IDC服务商问一下网监，此贴哪里有害（我跟网监之间现在已经不直接打交道，大家火气都不小，免得起争执），同时我自己也认真猜测这个信息是哪里被网监盯上了。</p>
<p>开始我以为是“低俗”，但是看来看去，也不像有低俗关键词的样子，我当时很惊讶，难道网监的软件已经能够识别“mimi”这样的词汇了？！</p>
<p>但是很快IDC服务商回复过来，原来这篇文章涉及侮辱现任或前任国家领导人。因此成为有害信息！！</p>
<p>也就是说，“国母”成为了关键词，众所周知，中国是一个人民共和国，我们的国家主席是一个行政机构，而不是一个人（见中学政治课本），虽然具体表现上是由一个人担任，但是根据定义，担任中华人民共和国主席职务的人，只是一个职务，用非常有党性的话来讲，也是一个人民公仆。那么，在现代的中国，很显然没有“一国之主”的概念。既然没有“一国之主”，当然也就不存在“国母”这个角色。</p>
<p>因此我们如果使用了“国母”这个词，我们可以解释为是使用了这个词的比喻义，或者就是有特殊背景，比如这篇文章中做词语解释的那位妻子，她显然是由孙中山先生的“国父”称号，而化用了“国母”在宋庆铃夫人身上。这是表示一种尊敬。至于那位丈夫的荒谬回答，既然是作为错误的答案，实际上已经不需要去追究他答案的由来了，错误还需要理由吗？</p>
<p>好，假如非要解释，我们也完全可以从比喻义的角度来加以注解——或者说为那位丈夫辩护——为什么称宋祖英是“国母”呢？我觉得可以从宋祖英在国内国际的公众形象来看，宋祖英作为我国最著名的歌唱家之一，在国内外的很多重要演出场合，演唱了很多能够充分向世界展示中华文化和中华民族的歌曲，比如为西方世界所熟知的《茉莉花》。而宋祖英本人在国内的形象也非常的高贵、雍容。从这个角度来看的话，就算是用“国母”这个极高的荣誉戴在宋祖英头上，最多也就是修辞恰当或者不恰当的问题，什么时候扯到了现任或前任国家领导人身上呢？在这个交互过程中，到底是谁在污蔑现任或前任国家领导人呢？我觉得不是猜词的那个丈夫，也不是发帖的作者，而是把这篇文章定义为“侮辱现任或前任国家领导人”的那个网警。是他脑子里的低俗念头在诽谤现任或前任国家领导人。假如换一个网警，他没有像前一个网警这样去理解，那么这篇文章就无害了。</p>
<p>由此可见，我们的网络监察，简直比我们的法律制度还更加地“法无定法”！完全由网络监察人员主观判断。这种情形，比完全由软件来根据关键词进行过滤的错误手段更加可怕。因为已经不仅是监管你的思想，而且是由他按照他的想象来监管你的行为了，这是多么恐怖的事情？！要是这样也能变成我们法制的一部分，那么明天会不会你坐在家里闭目养神，一伙网警冲进你家里逮捕你，理由是你正在构思涉嫌危害国家安全的行为？？？假如真的有那一天，民皆不语，道路以目的时候，那样的后果是什么，中国历史上不是没有demo。</p>
<h3>相关日志</h3>
<ul class="related_post">
<li>2009-06-04 &#8212; <a href="http://wukangrui.net/2009/06/04/china-internet-law-in-wrong-way.html" title="中国互联网管理需要清醒一下找找方向">中国互联网管理需要清醒一下找找方向</a></li>
<li>2009-07-03 &#8212; <a href="http://wukangrui.net/2009/07/03/we-naver-fear-any-dam.html" title="不管是什么颜色的&ldquo;坝&rdquo;我们都不怕">不管是什么颜色的&ldquo;坝&rdquo;我们都不怕</a></li>
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/green-dam-delay-means-nothing.html" title="推迟的本质就是不了了之">推迟的本质就是不了了之</a></li>
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/sony-disclaimer-for-supply-green-dam.html" title="索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹">索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹</a></li>
<li>2009-06-28 &#8212; <a href="http://wukangrui.net/2009/06/28/google-event-effection.html" title="google域名劫持事件的影响">google域名劫持事件的影响</a></li>
<li>2009-06-24 &#8212; <a href="http://wukangrui.net/2009/06/24/seven-ways-refuse-green-dam.html" title="七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠">七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠</a></li>
<li>2009-06-23 &#8212; <a href="http://wukangrui.net/2009/06/23/china-websites-damned-google-spread-pornography-information.html" title="国内媒体联合打击google是举国之力玩&ldquo;不正当竞争&rdquo;">国内媒体联合打击google是举国之力玩&ldquo;不正当竞争&rdquo;</a></li>
<li>2009-06-16 &#8212; <a href="http://wukangrui.net/2009/06/16/thinking-after-judgement-of-deng-yujiao.html" title="邓玉娇案尘埃落定之后">邓玉娇案尘埃落定之后</a></li>
<li>2008-05-19 &#8212; <a href="http://wukangrui.net/2008/05/19/donate-patriotism-and-sulphur.html" title="捐款·爱国·流氓">捐款·爱国·流氓</a></li>
<li>2007-10-23 &#8212; <a href="http://wukangrui.net/2007/10/23/blame-to-functional-organization.html" title="质疑职能机构的职责和责任">质疑职能机构的职责和责任</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wukangrui.net/2009/07/03/china-cyblepolice-ridiculous-illegal-information.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>变形金刚2的重大教育意义</title>
		<link>http://wukangrui.net/2009/07/02/transformer-2-alternative-comment.html</link>
		<comments>http://wukangrui.net/2009/07/02/transformer-2-alternative-comment.html#comments</comments>
		<pubDate>Thu, 02 Jul 2009 14:05:21 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[乱七八糟]]></category>
		<category><![CDATA[变形金刚]]></category>
		<category><![CDATA[思想]]></category>
		<category><![CDATA[电影]]></category>
		<category><![CDATA[评论]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/07/02/transformer-2-alternative-comment.html</guid>
		<description><![CDATA[我看到后面萨姆联系军方，要他们将擎天柱空运到他那里的时候，脑子里突然冒出一个奇怪的想法——要是美国有绿坝，他们就能及时把萨姆这个“不明真相”的群众“散布的谣言”过滤掉，也就不会造成一帮军人违令的“群体事件”了……]]></description>
			<content:encoded><![CDATA[<p><em>我看到后面萨姆联系军方，要他们将擎天柱空运到他那里的时候，脑子里突然冒出一个奇怪的想法——要是美国有绿坝，他们就能及时把萨姆这个“不明真相”的群众“散布的谣言”过滤掉，也就不会造成一帮军人违令的“群体事件”了……</em></p>
<p align="right"><em>——观看《变形金刚2》后的思想汇报 by <a href="http://wukangrui.net/" rel="license">小李刀刀</a></em></p>
<p> <span id="more-837"></span>
<p>很多人说看《变形金刚2》就是看效果看气氛听音响去的。我一向都很赞同这种观点，就是大场面的音效震撼的或者特效精彩的片子才值得去影院看。比如《非诚勿扰》我就挺后悔去影院里看的，虽然它确实是很不错的片子。不过《变形金刚2》的画面的确是让我有点眼花缭乱地看不过来了，但是我却觉得《变形金刚2》怎么好像在影射我们目前的局势呢？难道我在天朝待久了，不知不觉已经被CCAV洗脑了不成？</p>
<p>《变形金刚2》作为一副美国大片，美国元素是很突出的，最突出的当然就是平民英雄了。不过在以往的片子里面，如果有涉及对政府机关或者高层领导的讽刺的话，一般是会把他们放在反派的位置上，比如索马里维和战争为主题的电影往往是军方高层或者政治家下令屠杀平民，又比如《越狱》之类的电影就把“公司”塑造成为掌握国家权力的犯罪集团。而在《变形金刚2》里面，则给了高层一个愚蠢的闭门决策的白痴形象。</p>
<p>看一部科幻片居然是政治元素给我留下最深的印象，不知道是不是绿坝娘在作祟。那个有总统授权的白痴，在片子里每次出现的时候总是让我忍不住联想起天朝的某些机构。完全脱离实际情况乱决策乱主张，结果搞得灰头土脸还碍手碍脚。</p>
<p>《变形金刚2》里面真正引起我关注的其实不是萨姆，因为他做的事情只不过是代表他自己，有危险有贡献但其实没什么压力。结局不论是怎样也没人追究他的责任。我觉得真正胆大妄为的是巢穴部队的那帮军人。要知道在美国，总统同时也是军委主席，是部队的最高首长。可是在总统派来“全权代表”的时候，这帮军人居然没有进行任何串联的情况下，就开始默契地消极抵制他的命令，最后甚至发展到违抗了命令，把总统特使扔下飞机，把擎天柱空降在萨姆要求的地方，连后方的指挥部也立刻就对他们投入了支援行动，完全没有考虑到叛党叛国的严重政治问题。</p>
<p>我看到萨姆联系军方，要他们将擎天柱空运到他那里的时候，脑子里突然冒出一个奇怪的想法——要是美国有绿坝，他们就能及时把萨姆这个“不明真相”的群众“散布的谣言”过滤掉，也就不会造成一帮军人违令的“群体事件”了。</p>
<p>如此看来，美国的体制的确是大有问题。军队的思想政治工作严重不到位。他们实在应该多派人到天朝好好取点经。其实我们看到美国大片里的美国大兵都还是蛮有素质，蛮有信仰的。关键就是政府没做好引导工作，让他们产生了比较严重的自由化倾向，才会不断地在好莱坞片子里出现不服从上级甚至对抗上级的情况，甚至还有前线士兵违抗军令的情况。</p>
<p>而美国的媒体，居然把这一切当成是再正常不过的事情，可见这些缺乏组织领导和政治觉悟的新闻人，也都完全失去了资产阶级喉舌的本色，政府必须清醒地认识到并高度重视这一现象。作为一个对议员和广大资本家负责的政府，有责任加强对他们的监管，以免他们继续毒害美国的青少年。</p>
<p>从《变形金刚2》这部进口的教育片里，我们应该充分认识到：腐朽的资本主义制度下，政府缺乏凝聚力，军队缺乏战斗力，媒体缺乏社会责任感。因而他们总是不断地出现犯有严重个人英雄主义的不怀好意的煽动分子，甚至经常可以看到涉嫌颠覆国家安全的不法之徒，而美国极度不完善的法律体系，使得这些不法之徒总是逍遥法外，广大高层官员、议员长期深受其害。而这一切，都是资本主义制度的本质所决定的，是不可调和的，是不可避免的。随着历史的不断发展，这样的落后的严重阻碍生产力发展的社会制度，必将走向灭亡。</p>
<p>经过不断地思考和回味，现在我终于正确认识到《变形金刚2》这部电影的重大教育意义了。当然，我的认识还不深入，还很片面。在今后的学习工作中，我还需要不断地加深理论知识的学习，多向老同志们请教。也希望同志们对我肤浅的认识多多提出批评，帮助我不断进步。</p>
<h3>相关日志</h3>
<ul class="related_post">
<li>2009-06-17 &#8212; <a href="http://wukangrui.net/2009/06/17/comment-to-movie-terminato-salvation.html" title="终结者2018 &#8211; 故事未完">终结者2018 &#8211; 故事未完</a></li>
<li>2009-05-01 &#8212; <a href="http://wukangrui.net/2009/05/01/comment-to-movie-nanjing.html" title="南京！南京">南京！南京</a></li>
<li>2008-11-04 &#8212; <a href="http://wukangrui.net/2008/11/04/comment-to-movie-super-typhoon.html" title="冯小宁的理想化带来什么">冯小宁的理想化带来什么</a></li>
<li>2005-11-22 &#8212; <a href="http://wukangrui.net/2005/11/22/movie-world-war-comment.html" title="《世界大战》">《世界大战》</a></li>
<li>2009-07-03 &#8212; <a href="http://wukangrui.net/2009/07/03/we-naver-fear-any-dam.html" title="不管是什么颜色的&ldquo;坝&rdquo;我们都不怕">不管是什么颜色的&ldquo;坝&rdquo;我们都不怕</a></li>
<li>2009-07-03 &#8212; <a href="http://wukangrui.net/2009/07/03/china-cyblepolice-ridiculous-illegal-information.html" title="一个小网警的龌龊思想">一个小网警的龌龊思想</a></li>
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/green-dam-delay-means-nothing.html" title="推迟的本质就是不了了之">推迟的本质就是不了了之</a></li>
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/sony-disclaimer-for-supply-green-dam.html" title="索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹">索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹</a></li>
<li>2009-06-28 &#8212; <a href="http://wukangrui.net/2009/06/28/google-event-effection.html" title="google域名劫持事件的影响">google域名劫持事件的影响</a></li>
<li>2009-06-24 &#8212; <a href="http://wukangrui.net/2009/06/24/seven-ways-refuse-green-dam.html" title="七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠">七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wukangrui.net/2009/07/02/transformer-2-alternative-comment.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>推迟的本质就是不了了之</title>
		<link>http://wukangrui.net/2009/07/01/green-dam-delay-means-nothing.html</link>
		<comments>http://wukangrui.net/2009/07/01/green-dam-delay-means-nothing.html#comments</comments>
		<pubDate>Wed, 01 Jul 2009 12:11:11 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[指手划脚]]></category>
		<category><![CDATA[互联网]]></category>
		<category><![CDATA[绿坝]]></category>
		<category><![CDATA[评论]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/07/01/green-dam-delay-means-nothing.html</guid>
		<description><![CDATA[7月1日之前我们说要看绿坝7月1日之后如何收场，如今我们要看看，这件绝对不应该不了了之的事情，会不会在我们这个神奇地过度，再一次奇迹般地不了了之。]]></description>
			<content:encoded><![CDATA[<p>工信部就是与众不同，连“答记者问”的发布都和其它部门不一样。不是记者问，发言人答的形式，而是FAQ的形式。尤其是最后一问尤其精彩，“<strong>七、有些厂商提出，绿色上网过滤软件预装起始日期是７月１日，时间仓促，准备不足。这个时间表是否可以推迟？</strong>”（参见中华人民共和国工业和信息化部官方网站的《<a href="http://www.miit.gov.cn/n11293472/n11293832/n11293907/n11368223/12433840.html" rel="nofollow external" target="_blank">工业和信息化部新闻发言人就绿色上网过滤软件问题答记者问</a>》，7月1日预装，6月30日才来问是否可以推迟，我们的厂商什么时候工作效率变得这么高了？如果发言人说“不预装”，那第二天会是什么样的状况呢？那些“时间仓促准备不足”的企业是等着被罚还是产品全部召回啊？</p>
<p> <span id="more-835"></span>
<p>从工信部自说自话地提出了“绿坝-花季护航”预装要求以来，来自国内外的质疑声的反对声就从来没断过。甚至连人民网都一度制作了“今天你绿坝了没有”的专题来反对，而财政部更是毫不给面子地宣布采购是由工信部独自进行的，保护自己的同时狠狠地给了工信部一耳光。而面对这一切，我们坚强的工信部坚决不出来做任何回应，不管是“纳税人”发出的预装绿坝违法的公开信，还是洋相闹到国际上以后的擦屁股，工信部都任凭风吹雨打我自闲庭信步。</p>
<p>我一度以为，这个事情会像备案制度一样，一直没效果但一直要搞下去。没想到他们还是没有我想像的那么坚强，居然在大家都搬着小凳子来看话剧的时候宣布罢演了。</p>
<p>推行绿坝，让万人所指，而最后关头声称的“推迟”则更让人看不起，不仅看不起，而且还要不停地质问下去。既然没有宣布取消，那就是软件的购买和使用依然是要执行的，那就是四千多万的共有财产还是要给那两家企业的。那么之前提出的一系列问题就不能仅仅以无限期地“推迟”直至不了了之来解决。作为政府采购项目，这个项目是否真的有必要？是否真的完全符合法律符合流程，整个过程中是否存在猫腻，是否存在腐败……这么多问题，除非宣布取消，否则是必须回答的。</p>
<p>工信部一直以来就是最喜欢拿着鸡毛当令箭，也最不拿纳税人利益和人民意志当回事的恶仆（我做为中华人民共和国公民，有正当职业，依法纳税，我可是国家主人的一份子，说自己的“公仆”是恶仆不过份吧？），为什么这么说？可以回想一下，从上个世纪90年代以来，工信部出台的法律法规通知要求，有哪一项进行了广泛的民意反馈？有哪一项进行了公开公正的听证？又有哪一项真正达到了其执行的目的？</p>
<p>也许恰恰是因为中国的IT产业发展迅速，也许恰恰正是因为中国的网民数量增长迅速，才让这个工信部自以为老子最牛，行政管理全凭闭门造车，一不看国家现行法律法规的规定、二不问人大政协的意见、三不公开征求人民群众的意见。键盘一敲，政策出台。如果不是这么随意乱搞，以绿坝这样粗制滥造的漏洞百出的东西，能变成4千多万的中标项目？</p>
<p>所以说，“推迟”只是借口，绿坝预装不论从法律上还是从效果上，又或者是从成本上，都是没有可能的。工信部闹出了这么大的笑话，把我们交纳的税款拿来过家家，这样的行为必须要给全国人民一个明确的交代。绝不能不了了之！</p>
<p>从另一个角度说，由于工信部的无能，选择了绿坝这个劣质产品，以至于在<a href="http://www.donews.com/Content/200906/f7c20db680cb44ca954ee4d0a00a6591.shtm" rel="external" target="_blank">侵犯知识产权</a>、<a href="http://www.blshe.com/trackback.php?id=399521" rel="external" target="_blank">侵犯人民隐私权和言论自由权</a>、在<a href="http://content.caixun.com/NE/01/e8/NE01e8pn.shtm" rel="external" target="_blank">违反WTO协议</a>等多个方面授人以柄，严重危害了国家利益；更让索尼这样的外国企业，摆出一副受害人的嘴脸，公然<a href="http://wukangrui.net/2009/07/01/sony-disclaimer-for-supply-green-dam.html" rel="prev" target="_blank">在产品免责声明里对我国的产品和法律进行恶搞</a>。如此严重的渎职行为，又岂是一句“推迟”能够掩盖过去的？</p>
<p>7月1日之前我们说要看绿坝7月1日之后如何收场，如今我们要看看，这件绝对不应该不了了之的事情，会不会在我们这个神奇地过度，再一次奇迹般地不了了之。</p>
<h3>相关日志</h3>
<ul class="related_post">
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/sony-disclaimer-for-supply-green-dam.html" title="索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹">索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹</a></li>
<li>2009-06-24 &#8212; <a href="http://wukangrui.net/2009/06/24/seven-ways-refuse-green-dam.html" title="七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠">七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠</a></li>
<li>2009-07-03 &#8212; <a href="http://wukangrui.net/2009/07/03/we-naver-fear-any-dam.html" title="不管是什么颜色的&ldquo;坝&rdquo;我们都不怕">不管是什么颜色的&ldquo;坝&rdquo;我们都不怕</a></li>
<li>2009-06-28 &#8212; <a href="http://wukangrui.net/2009/06/28/google-event-effection.html" title="google域名劫持事件的影响">google域名劫持事件的影响</a></li>
<li>2009-07-03 &#8212; <a href="http://wukangrui.net/2009/07/03/china-cyblepolice-ridiculous-illegal-information.html" title="一个小网警的龌龊思想">一个小网警的龌龊思想</a></li>
<li>2009-06-23 &#8212; <a href="http://wukangrui.net/2009/06/23/china-websites-damned-google-spread-pornography-information.html" title="国内媒体联合打击google是举国之力玩&ldquo;不正当竞争&rdquo;">国内媒体联合打击google是举国之力玩&ldquo;不正当竞争&rdquo;</a></li>
<li>2009-06-19 &#8212; <a href="http://wukangrui.net/2009/06/19/green-dam-is-not-for-people.html" title="绿坝：初衷是好的就够了吗？">绿坝：初衷是好的就够了吗？</a></li>
<li>2009-06-04 &#8212; <a href="http://wukangrui.net/2009/06/04/china-internet-law-in-wrong-way.html" title="中国互联网管理需要清醒一下找找方向">中国互联网管理需要清醒一下找找方向</a></li>
<li>2009-07-02 &#8212; <a href="http://wukangrui.net/2009/07/02/transformer-2-alternative-comment.html" title="变形金刚2的重大教育意义">变形金刚2的重大教育意义</a></li>
<li>2009-06-26 &#8212; <a href="http://wukangrui.net/2009/06/26/hello-world.html" title="Hello World!">Hello World!</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wukangrui.net/2009/07/01/green-dam-delay-means-nothing.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹</title>
		<link>http://wukangrui.net/2009/07/01/sony-disclaimer-for-supply-green-dam.html</link>
		<comments>http://wukangrui.net/2009/07/01/sony-disclaimer-for-supply-green-dam.html#comments</comments>
		<pubDate>Wed, 01 Jul 2009 11:59:52 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[指手划脚]]></category>
		<category><![CDATA[互联网]]></category>
		<category><![CDATA[绿坝]]></category>
		<category><![CDATA[评论]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/07/01/sony-disclaimer-for-supply-green-dam.html</guid>
		<description><![CDATA[我不禁想起以前在二外工作的时候，我同事的一句话：作为一个本来就不讨人喜欢的部门，要做出一项人人都满意的决策当然是很难的。但是要做出一个让涉及的各方都不满意的决策，恐怕也很不容易吧！工信部如今就做到了。做得非常彻底，就像过街老鼠。]]></description>
			<content:encoded><![CDATA[<p>据新浪科技讯，索尼在工信部通知要求的七月一日尚未到来之前，率先在自己品牌下的笔记本电脑中预置（只是预置在硬盘中，并未预装）了绿坝软件。但是更引起人们关注的，却是索尼随机文档中的一份关于绿坝软件的独立的免责声明。</p>
<p> <span id="more-834"></span>
<p align="center"><a href="http://wukangrui.net/attachments/2009/07/2009630122349.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009630122349" border="0" alt="2009630122349" src="http://wukangrui.net/attachments/2009/07/2009630122349_thumb.jpg" width="354" height="439" /></a>&#160;</p>
<p>看惯了互联网上摆出一本正经地架势来搞一些荒谬事情的“恶搞”文化，你不得不感叹索尼的这一款免责声明实在是深得网络“恶搞”文化的精髓。引用声明中的部分文字如下：</p>
<blockquote><p>根据政府部门的相关要求，索尼做为PC厂商，按照与本软件供应商之间的协议，在中国大陆地区范围内向用户分发本软件。<strong>索尼不保证本软件的任何内容、功能、服务或其他特性的真实性、合法性、安全性、兼容性（包括但不限于与索尼或其关联公司或者第三方公司的任何产品或服务的兼容性）。对用户或其他任何第三方因为本软件引起的个人或身体损伤、财产损失或其他损失（包括但不限于对本PC的损失）的要求、诉状、索赔、诉讼、费用和其他责任（包括但不限于合理的律师费、专家费用和法律费用：修改、替换或者处理任何本软件有关的成本、费用和损害赔偿），由本软件供应商独资承担。索尼就此不承担任何责任。</strong></p>
</blockquote>
<p>虽然是小日本搞的，但是这段文字还是深得汉语博大精深的精髓，冠冕堂皇冷冰冰的文字背后，很清晰地表达出了“我们只是PC厂商，做这件事情实属无奈；冤有头债有主，各位上帝一定要相信我，我是无辜的，以后你千万别来找我啊……”（仅代表个人观点）。</p>
<p>虽然中国的网民和业主签霸王条款已经是家常便饭，不过相信任何人看到这段声明还是会倒吸一口冷气的。为什么？因为除了不承担造成不良后果的一切责任之外，索尼甚至连软件的“真实性、合法性、安全性、兼容性”完全不予保证，而且对于“个人或身体损害、财产损失或其它损失”也一概推给软件商。也就是说，索尼在不得不预置绿坝的同时，为了避免明知必然会发生的不良后果砸了自己的招牌，宁可先把软件商和工信部卖了。它的意思就是“明告诉你，这玩意儿是个三无产品，你用了它后果有多严重，只有天知道。”。</p>
<p>看了这篇免责声明，我总算是明白索尼为什么这么积极地预装了，这是跟其他PC厂商采取的不同的战略。在这次针对绿坝的应对手段上，我们现在已经能够看到的，有欧美厂商采取政治施压（美国和WTO的职责和反对）、有日本厂商采取先发制人（索尼），还有国内厂商采取拖延政策（联想、华硕等以需要进一步评估为理由），总的来说都是一样，不想合作。</p>
<p>我们欢迎这些厂商的不合作（虽然他们考虑的是自己的商业利益），我们尤其欢迎索尼这样的充满了草根精神和恶搞元素的不合作，在绿坝给我们带来的众多幽默元素中，又添上了浓浓的一笔。</p>
<p>我不禁想起以前在二外工作的时候，我同事的一句话：作为一个本来就不讨人喜欢的部门，要做出一项人人都满意的决策当然是很难的。但是要做出一个让涉及的各方都不满意的决策，恐怕也很不容易吧！工信部如今就做到了。做得非常彻底，就像过街老鼠。</p>
<h3>相关日志</h3>
<ul class="related_post">
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/green-dam-delay-means-nothing.html" title="推迟的本质就是不了了之">推迟的本质就是不了了之</a></li>
<li>2009-06-24 &#8212; <a href="http://wukangrui.net/2009/06/24/seven-ways-refuse-green-dam.html" title="七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠">七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠</a></li>
<li>2009-07-03 &#8212; <a href="http://wukangrui.net/2009/07/03/we-naver-fear-any-dam.html" title="不管是什么颜色的&ldquo;坝&rdquo;我们都不怕">不管是什么颜色的&ldquo;坝&rdquo;我们都不怕</a></li>
<li>2009-06-28 &#8212; <a href="http://wukangrui.net/2009/06/28/google-event-effection.html" title="google域名劫持事件的影响">google域名劫持事件的影响</a></li>
<li>2009-07-03 &#8212; <a href="http://wukangrui.net/2009/07/03/china-cyblepolice-ridiculous-illegal-information.html" title="一个小网警的龌龊思想">一个小网警的龌龊思想</a></li>
<li>2009-06-23 &#8212; <a href="http://wukangrui.net/2009/06/23/china-websites-damned-google-spread-pornography-information.html" title="国内媒体联合打击google是举国之力玩&ldquo;不正当竞争&rdquo;">国内媒体联合打击google是举国之力玩&ldquo;不正当竞争&rdquo;</a></li>
<li>2009-06-19 &#8212; <a href="http://wukangrui.net/2009/06/19/green-dam-is-not-for-people.html" title="绿坝：初衷是好的就够了吗？">绿坝：初衷是好的就够了吗？</a></li>
<li>2009-06-04 &#8212; <a href="http://wukangrui.net/2009/06/04/china-internet-law-in-wrong-way.html" title="中国互联网管理需要清醒一下找找方向">中国互联网管理需要清醒一下找找方向</a></li>
<li>2009-07-02 &#8212; <a href="http://wukangrui.net/2009/07/02/transformer-2-alternative-comment.html" title="变形金刚2的重大教育意义">变形金刚2的重大教育意义</a></li>
<li>2009-06-26 &#8212; <a href="http://wukangrui.net/2009/06/26/hello-world.html" title="Hello World!">Hello World!</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wukangrui.net/2009/07/01/sony-disclaimer-for-supply-green-dam.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 最佳实践（二）</title>
		<link>http://wukangrui.net/2009/07/01/asp-net-mvc-best-practices-part-2.html</link>
		<comments>http://wukangrui.net/2009/07/01/asp-net-mvc-best-practices-part-2.html#comments</comments>
		<pubDate>Tue, 30 Jun 2009 21:03:41 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[最佳实践]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/07/01/asp-net-mvc-best-practices-part-2.html</guid>
		<description><![CDATA[本系列翻译自 Kazi Manzur Rashid 的博客，由于翻译水平有限，本系列可能存在误解偏差或者翻译不准的地方，建议对比原文进行阅读。由于篇幅关系，原文中的一篇文章在本系列中将拆解成多篇发布。本篇包括原文第一部分中的7-14节。如果你没有看过之前的第一部分，也许你想先看看 《ASP.NET MVC 最佳实践（一）》。]]></description>
			<content:encoded><![CDATA[<p><em>本系列翻译自 </em><a href="http://weblogs.asp.net/rashid/default.aspx"><em>Kazi Manzur Rashid</em></a><em> 的博客，由于翻译水平有限，本系列可能存在误解偏差或者翻译不准的地方，建议对比<a href="http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx">原文</a>进行阅读。由于篇幅关系，原文中的一篇文章在本系列中将拆解成多篇发布。本篇包括原文第一部分中的7-14节。如果你没有看过之前的第一部分，也许你想先看看 <a href="http://wukangrui.net/2009/06/28/asp-net-mvc-best-practices-part-1.html" rel="prev">《ASP.NET MVC 最佳实践（一）》</a>。</em></p>
<p> <span id="more-829"></span><br />
<h4>7. Keep your controller free from HttpContext and its tail</h4>
<p>Make sure your controller does not have to refer the HttpContext and its tail. it will make your life easier when unit testing your Controller. If you need to access anything from HttpContext like User, QueryString, Cookie etc use custom action filter or create some <a href="http://weblogs.asp.net/rashid/archive/2009/03/03/unit-testable-configuration-manager.aspx">interface and wrapper</a> and pass it in the constructor. For example, for the following Route:</p>
<p>在你的控制器中不要引用到HttpContext以及它的派生类。这让你能比较容易地进行控制器的单元测试。如果你需要访问与HttpContext相关的对象比如User、QueryString、Cookie等，你可以使用自定义的行为过滤器（<a href="http://www.cnblogs.com/" rel="external" target="_blank">博客园</a>的<a href="http://www.cnblogs.com/JeffreyZhao/" rel="external" target="_blank">老赵</a>有<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/03/09/no-dependency-to-httpcontext.html" rel="external" target="_blank">一篇文章</a>对这一条进行了深入的论述，并提出了自己的解决方案，建议阅读）或者创建一些接口和容器，并把它传入控制器的构造函数。例如，下面的路由：</p>
<pre class="code">routes.MapRoute(
    <span style="color: #a31515">&quot;Dashboard&quot;</span>,
    <span style="color: #a31515">&quot;Dashboard/{tab}/{orderBy}/{page}&quot;</span>,
    <span style="color: blue">new </span>{
        controller = <span style="color: #a31515">&quot;Story&quot;</span>,
        action = <span style="color: #a31515">&quot;Dashboard&quot;</span>,
        tab = StoryListTab.Unread.ToString(),
        orderBy = OrderBy.CreatedAtDescending.ToString(),
        page = 1
    }
);</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>而控制器的行为方法则定义为：</p>
<pre class="code">[<span style="color: #2b91af">AcceptVerbs</span>(<span style="color: #2b91af">HttpVerbs</span>.Get),<span style="color: #2b91af">OutputCache</span>(CacheProfile = <span style="color: #a31515">&quot;Dashboard&quot;</span>),UserNameFilter]
<span style="color: blue">public </span><span style="color: #2b91af">ActionResult </span>Dashboard(<span style="color: blue">string </span>userName, StoryListTab tab, OrderBy orderBy, <span style="color: blue">int</span>? page) {
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>UserNameFilter这个过滤器负责传递UserName：</p>
<pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">UserNameFilter </span>: <span style="color: #2b91af">ActionFilterAttribute </span>{
    <span style="color: blue">public override void </span>OnActionExecuting(<span style="color: #2b91af">ActionExecutingContext </span>filterContext) {
        <span style="color: blue">const string </span>Key = <span style="color: #a31515">&quot;userName&quot;</span>;

        <span style="color: blue">if </span>(filterContext.ActionParameters.ContainsKey(Key)) {
            <span style="color: blue">if </span>(filterContext.HttpContext.User.Identity.IsAuthenticated) {
                filterContext.ActionParameters[Key] = filterContext.HttpContext.User.Identity.Name;
            }
        }

        <span style="color: blue">base</span>.OnActionExecuting(filterContext);
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>[更新：一定要明确你已经对控制器或者是对控制器中的行为添加了 Authorize 属性，参见<a href="http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#comments" rel="external" target="_blank">原文评论</a>。]</strong></p>
<h4>8. 用行为控制器来转换行为方法参数</h4>
<p>用行为过滤器来把传入值转换为你的控制器行为方法参数，再看一下 Dashboard方法的代码，我们以 Enum 类型接受 tab 和 orderBy这两个参数。</p>
<pre class="code">[<span style="color: #2b91af">AcceptVerbs</span>(<span style="color: #2b91af">HttpVerbs</span>.Get), <span style="color: #2b91af">OutputCache</span>(CacheProfile = <span style="color: #a31515">&quot;Dashboard&quot;</span>), StoryListFilter]
<span style="color: blue">public </span><span style="color: #2b91af">ActionResult </span>Dashboard(<span style="color: blue">string </span>userName, StoryListTab tab, OrderBy orderBy, <span style="color: blue">int</span>? page) {
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><p><code></code></p>
<p>过滤器 StoryListFilter 将负责把它由 路由的值/查询字符串 转换为适当的数据类型。</p>
<pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">StoryListFilter </span>: <span style="color: #2b91af">ActionFilterAttribute </span>{
    <span style="color: blue">public override void </span>OnActionExecuting(<span style="color: #2b91af">ActionExecutingContext </span>filterContext) {
        <span style="color: blue">const string </span>TabKey = <span style="color: #a31515">&quot;tab&quot;</span>;
        <span style="color: blue">const string </span>OrderByKey = <span style="color: #a31515">&quot;orderBy&quot;</span>;

        NameValueCollection queryString = filterContext.HttpContext.Request.QueryString;

        StoryListTab tab = <span style="color: blue">string</span>.IsNullOrEmpty(queryString[TabKey]) ?
                            filterContext.RouteData.Values[TabKey].ToString().ToEnum(StoryListTab.Unread) :
                            queryString[TabKey].ToEnum(StoryListTab.Unread);

        filterContext.ActionParameters[TabKey] = tab;

        OrderBy orderBy = <span style="color: blue">string</span>.IsNullOrEmpty(queryString[OrderByKey]) ?
                            filterContext.RouteData.Values[OrderByKey].ToString().ToEnum(OrderBy.CreatedAtDescending) :
                            queryString[OrderByKey].ToEnum(OrderBy.CreatedAtDescending);

        filterContext.ActionParameters[OrderByKey] = orderBy;

        <span style="color: blue">base</span>.OnActionExecuting(filterContext);
    }
}</pre>
<p>你也可以用自定义模型绑定器来达到同样的目的。如果要那样做的话，你需要为每个枚举创建一个独立的模型绑定器，而不是用一个行为过滤器来处理所有的枚举参数。用模型绑定器还有一个问题，一旦你注册了一个类型，在行为中它就总是被使用，而行为过滤器则是可以根据需要选择使用的。</p>
<h4>9. 行为过滤器的位置</h4>
<p>If you need the same action filter to all of your controller action methods,&#160; put it in the controller rather than each action method. If you want to apply the same action filter to all of your controller create a base controller and inherit from that base controller, for example the story controller should be only used when user is logged in and we need to pass the current user name in its methods, also the StoryController should compress the data when returning:</p>
<p>如果你要对你的控制器的所有行为方法应用同一个行为过滤器，你可以把这个过滤器放在控制器的定义上而不必给每个行为方法应用。如果你要对你的所有控制器应用同一个行为过滤器，你应该创建一个基控制器，对它应用该过滤器，并让所有的控制器继承这个基控制器。例如 story 控制器应该只在用户已经登陆的情况下才可以使用，并且我们需要把当前用户的用户名传入 story 控制器下的方法，另外Story控制器应该压缩返回的数据：</p>
<pre class="code">[<span style="color: #2b91af">Authorize</span>, <span style="color: #2b91af">UserNameFilter</span>]
<span style="color: blue">public class </span><span style="color: #2b91af">StoryController </span>: <span style="color: #2b91af">BaseController </span>{
}

[CompressFilter]
<span style="color: blue">public class </span><span style="color: #2b91af">BaseController </span>: <span style="color: #2b91af">Controller </span>{
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>但是如果继承的层次达到或者高于2层，应该另找方法来应用过滤器。最新的 <a href="http://oxite.codeplex.com/" rel="external" target="_blank">Oxite</a> 代码里有一些非常出色的动态应用过滤器的方法，我强烈推荐你去看一下。</p>
<h4>10. 小心使用UpdateModel</h4>
<p>我要再次强调 Justin Ethredge 在他的文章中已经提过的这个问题，开发中一定小心，避免陷进UpdateModel的陷阱里去。</p>
<h4>11.控制器不要包含任何域逻辑</h4>
<p>控制器应该只负责：</p>
<ul>
<li>验证输入 </li>
<li>调用Model层来为显示视图准备数据 </li>
<li>返回视图或者跳转到另一个行为 </li>
</ul>
<p>如果你在控制器中坐了其它的事情，那就说明你把它们放错了地方。你在控制器中坐的这些事情或许更应该交给模型去处理。只要你遵守了这条规则，你的每个控制器方法代码应该不会超过20到25行。 <a href="http://codebetter.com/blogs/ian_cooper/default.aspx" rel="external" target="_blank">Ian Cooper</a> 有一篇很棒的文章《<a href="http://codebetter.com/blogs/ian_cooper/archive/2008/12/03/the-fat-controller.aspx" rel="external" target="_blank">Skin Controller Fat Model</a>》，有空的时候你一定要读一下。</p>
<h4>12. 避免使用 ViewData，尽量使用ViewData.Model</h4>
<p>依赖于数据字典不仅使你的代码难以重构，而且你还不得不在试图中编写转换代码。实际上即使你给你的控制器的每个方法都单独编写一个类作为数据模型，那也是完全可以的。如果你觉得编写这些视图数据模型类是一项非常乏味的工作的话，你可以使用 MVCContrib 项目中 ViewDataExtensions，它包含一些用于返回强类型对象的不错的扩展。但是如果你的视图数据的数据字典中包含了多个数据类型的话，你还是没办法摆脱数据字典和他的字符串名。</p>
<h4>13. 用 PRG 模式来修改数据</h4>
<p>Tim Barcz, Matt Hawley, Stephen Walther and even The Gu has blogged this over <a href="http://devlicio.us/blogs/tim_barcz/archive/2008/08/22/prg-pattern-in-the-asp-net-mvc-framework.aspx">here</a>, <a href="http://blog.eworldui.net/post/2008/05/ASPNET-MVC---Using-Post2c-Redirect2c-Get-Pattern.aspx">here</a>, <a href="http://stephenwalther.com/blog/archive/2008/06/20/asp-net-mvc-tip-6-call-redirecttoaction-after-submitting-a-form.aspx">here</a> and <a href="http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx">here</a>. One of the issue with this pattern is when a validation fails or any&#160; exception occurs you have to copy the ModelState into TempData. If you are doing it manually, please stop it, you can do this automatically with Action Filters, like the following:</p>
<p>Tim Barcz, Matt Hawley, Stephen Wather 甚至 Scott Gu 都写了这方面的文章，你可以在 <a href="http://devlicio.us/blogs/tim_barcz/archive/2008/08/22/prg-pattern-in-the-asp-net-mvc-framework.aspx" rel="external" target="_blank">这里</a>、<a href="http://blog.eworldui.net/post/2008/05/ASPNET-MVC---Using-Post2c-Redirect2c-Get-Pattern.aspx" rel="external" target="_blank">这里</a>、<a href="http://stephenwalther.com/blog/archive/2008/06/20/asp-net-mvc-tip-6-call-redirecttoaction-after-submitting-a-form.aspx" rel="external" target="_blank">这里</a>和<a href="http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx" rel="external" target="_blank">这里</a>找到它们。这个模式的一个问题是当一项验证失败或者发生任何错误的时候，你不得不把ModelState复制到TempData里面。如果你是手动来做这件事，请不要再那样做了，你可以用行为过滤器自动处理它，就像下面这样：</p>
<pre class="code">[<span style="color: #2b91af">AcceptVerbs</span>(<span style="color: #2b91af">HttpVerbs</span>.Get), <span style="color: #2b91af">OutputCache</span>(CacheProfile = <span style="color: #a31515">&quot;Dashboard&quot;</span>), StoryListFilter, ImportModelStateFromTempData]
<span style="color: blue">public </span><span style="color: #2b91af">ActionResult </span>Dashboard(<span style="color: blue">string </span>userName, StoryListTab tab, OrderBy orderBy, <span style="color: blue">int</span>? page)
{
    <span style="color: green">//Other Codes
    </span><span style="color: blue">return </span>View();
}

[<span style="color: #2b91af">AcceptVerbs</span>(<span style="color: #2b91af">HttpVerbs</span>.Post), ExportModelStateToTempData]
<span style="color: blue">public </span><span style="color: #2b91af">ActionResult </span>Submit(<span style="color: blue">string </span>userName, <span style="color: blue">string </span>url)
{
    <span style="color: blue">if </span>(ValidateSubmit(url))
    {
        <span style="color: blue">try
        </span>{
            _storyService.Submit(userName, url);
        }
        <span style="color: blue">catch </span>(Exception e)
        {
            ModelState.AddModelError(ModelStateException, e);
        }
    }

    <span style="color: blue">return </span>Redirect(Url.Dashboard());
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>还有行为过滤器的代码：</p>
<pre class="code"><span style="color: blue">public abstract class </span><span style="color: #2b91af">ModelStateTempDataTransfer </span>: <span style="color: #2b91af">ActionFilterAttribute </span>{
    <span style="color: blue">protected static readonly string </span>Key = <span style="color: blue">typeof</span>(<span style="color: #2b91af">ModelStateTempDataTransfer</span>).FullName;
}

<span style="color: blue">public class </span><span style="color: #2b91af">ExportModelStateToTempData </span>: <span style="color: #2b91af">ModelStateTempDataTransfer </span>{
    <span style="color: blue">public override void </span>OnActionExecuted(<span style="color: #2b91af">ActionExecutedContext </span>filterContext) {
        <span style="color: green">//Only export when ModelState is not valid
        </span><span style="color: blue">if </span>(!filterContext.Controller.ViewData.ModelState.IsValid) {
            <span style="color: green">//Export if we are redirecting
            </span><span style="color: blue">if </span>((filterContext.Result <span style="color: blue">is </span><span style="color: #2b91af">RedirectResult</span>) || (filterContext.Result <span style="color: blue">is </span><span style="color: #2b91af">RedirectToRouteResult</span>)) {
                filterContext.Controller.TempData[Key] = filterContext.Controller.ViewData.ModelState;
            }
        }

        <span style="color: blue">base</span>.OnActionExecuted(filterContext);
    }
}

<span style="color: blue">public class </span><span style="color: #2b91af">ImportModelStateFromTempData </span>: <span style="color: #2b91af">ModelStateTempDataTransfer </span>{
    <span style="color: blue">public override void </span>OnActionExecuted(<span style="color: #2b91af">ActionExecutedContext </span>filterContext) {
        <span style="color: #2b91af">ModelStateDictionary </span>modelState = filterContext.Controller.TempData[Key] <span style="color: blue">as </span><span style="color: #2b91af">ModelStateDictionary</span>;

        <span style="color: blue">if </span>(modelState != <span style="color: blue">null</span>) {
            <span style="color: green">//Only Import if we are viewing
            </span><span style="color: blue">if </span>(filterContext.Result <span style="color: blue">is </span><span style="color: #2b91af">ViewResult</span>) {
                filterContext.Controller.ViewData.ModelState.Merge(modelState);
            } <span style="color: blue">else </span>{
                <span style="color: green">//Otherwise remove it.
                </span>filterContext.Controller.TempData.Remove(Key);
            }
        }

        <span style="color: blue">base</span>.OnActionExecuted(filterContext);
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://mvccontrib.codeplex.com" rel="external" target="_blank">MVCContrib</a> 项目也有这个功能，但是我不喜欢他们在用一个单独类来处理的方式，我喜欢对“哪个方法输出”和“哪个方法输入”有更多的控制权。</p>
<h4>14. 为你的视图模型创建父类层并用行为过滤器来构成公共部分</h4>
<p>Create a layer super type for your view model classes and use action filter to populate common things into it . For example the tiny little application that I am developing I need to know the User Name and whether the User is authenticated.</p>
<p>为你的视图模型类编写一个父类层，并用过滤器来构成它的公共部分。例如我正在开发的这个非常小的应用程序，我需要知道用户是否已经认证，已及用户名。</p>
<pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">ViewModel </span>{
    <span style="color: blue">public bool </span>IsUserAuthenticated {
        <span style="color: blue">get</span>;
        <span style="color: blue">set</span>;
    }

    <span style="color: blue">public string </span>UserName {
        <span style="color: blue">get</span>;
        <span style="color: blue">set</span>;
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>还有行为过滤器的代码：</p>
<pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">UserNameFilter </span>: <span style="color: #2b91af">ActionFilterAttribute </span>{
    <span style="color: blue">public override void </span>OnActionExecuting(<span style="color: #2b91af">ActionExecutingContext </span>filterContext) {
        <span style="color: blue">const string </span>Key = <span style="color: #a31515">&quot;userName&quot;</span>;

        <span style="color: blue">if </span>(filterContext.ActionParameters.ContainsKey(Key)) {
            <span style="color: blue">if </span>(filterContext.HttpContext.User.Identity.IsAuthenticated) {
                filterContext.ActionParameters[Key] = filterContext.HttpContext.User.Identity.Name;
            }
        }

        <span style="color: blue">base</span>.OnActionExecuting(filterContext);
    }
}

<span style="color: blue">public class </span><span style="color: #2b91af">ViewModelUserFilter </span>: <span style="color: #2b91af">ActionFilterAttribute </span>{
    <span style="color: blue">public override void </span>OnActionExecuted(<span style="color: #2b91af">ActionExecutedContext </span>filterContext) {
        ViewModel model;

        <span style="color: blue">if </span>(filterContext.Controller.ViewData.Model == <span style="color: blue">null</span>) {
            model = <span style="color: blue">new </span>ViewModel();
            filterContext.Controller.ViewData.Model = model;
        } <span style="color: blue">else </span>{
            model = filterContext.Controller.ViewData.Model <span style="color: blue">as </span>ViewModel;
        }

        <span style="color: blue">if </span>(model != <span style="color: blue">null</span>) {
            model.IsUserAuthenticated = filterContext.HttpContext.User.Identity.IsAuthenticated;

            <span style="color: blue">if </span>(model.IsUserAuthenticated) {
                model.UserName = filterContext.HttpContext.User.Identity.Name;
            }
        }

        <span style="color: blue">base</span>.OnActionExecuted(filterContext);
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>As you can see that it not replacing the model, if it is previously set in the controller, rather it populates the common part if it finds it compatible. Other benefit is, the views that only depends the layer super type you can simply return View() instead of creating the model.正如你所看到的，如果在控制器里预先设定它的话，它并没有替换模型，而是在它发现模型与它符合的时候，才作为控制器的公共部分起作用。另一个好处是，由于视图只依赖于父类层，你可以不必返回具体的model，而只需要返回 View()。</p>
<p>以上就是作者关于 <a href="http://www.asp.net/mvc/" rel="tag" target="_blank">ASP.NET MVC</a> 最佳实践的第一篇的全部内容，之后我将继续翻译作者关于此话题的第二篇文章。</p>
<p>未完待续…</p>
<h3>相关日志</h3>
<ul class="related_post">
<li>2009-06-28 &#8212; <a href="http://wukangrui.net/2009/06/28/asp-net-mvc-best-practices-part-1.html" title="ASP.NET MVC 最佳实践（一）">ASP.NET MVC 最佳实践（一）</a></li>
<li>2009-04-13 &#8212; <a href="http://wukangrui.net/2009/04/13/aspnetmvc-hands-on-labs-develop-application.html" title="[翻译]ASP.NET MVC动手实验1-3：开发ASP.NET MVC应用">[翻译]ASP.NET MVC动手实验1-3：开发ASP.NET MVC应用</a></li>
<li>2009-04-09 &#8212; <a href="http://wukangrui.net/2009/04/09/aspnetmvc-hands-on-labs-create-application.html" title="[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用">[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用</a></li>
<li>2009-04-09 &#8212; <a href="http://wukangrui.net/2009/04/09/aspnetmvc-hands-on-labs-introduction.html" title="[翻译]ASP.NET MVC动手系列1-1：ASP.NET MVC概述">[翻译]ASP.NET MVC动手系列1-1：ASP.NET MVC概述</a></li>
<li>2009-07-05 &#8212; <a href="http://wukangrui.net/2009/07/05/php-5-3-0-release-new-feature.html" title="PHP 5.3.0 发布">PHP 5.3.0 发布</a></li>
<li>2009-06-22 &#8212; <a href="http://wukangrui.net/2009/06/22/whatever-hover-pseudo-class-without-javascript.html" title="Whatever:hover &#8211; 无需javascript让IE支持丰富伪类">Whatever:hover &#8211; 无需javascript让IE支持丰富伪类</a></li>
<li>2009-04-30 &#8212; <a href="http://wukangrui.net/2009/04/30/solution-for-js-intellisense-error.html" title="VS2008 中 JS IntelliSense出错的解决">VS2008 中 JS IntelliSense出错的解决</a></li>
<li>2008-06-22 &#8212; <a href="http://wukangrui.net/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li>
<li>2008-06-22 &#8212; <a href="http://wukangrui.net/2008/06/22/thinking-about-html-page-creating.html" title="静态页面生成的思考">静态页面生成的思考</a></li>
<li>2008-06-18 &#8212; <a href="http://wukangrui.net/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wukangrui.net/2009/07/01/asp-net-mvc-best-practices-part-2.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>google域名劫持事件的影响</title>
		<link>http://wukangrui.net/2009/06/28/google-event-effection.html</link>
		<comments>http://wukangrui.net/2009/06/28/google-event-effection.html#comments</comments>
		<pubDate>Sun, 28 Jun 2009 13:00:36 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[指手划脚]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[互联网]]></category>
		<category><![CDATA[绿坝]]></category>
		<category><![CDATA[评论]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/06/28/google-event-effection.html</guid>
		<description><![CDATA[更多原本真的以为我们生活在地球村，我们“拿着麦克风”的人意识到{G}{F}{W}的存在。也使更多的人产生翻墙的需求。这或许算是对google的一点点轻微的补偿吧，一旦来到墙外，谁还会用百度呢？]]></description>
			<content:encoded><![CDATA[<p>2009年6月24日，已经在中国落地生根的google，就在刚刚遭到央视假新闻曝光涉黄，并应中国主管部门要求关停境外搜索并暂停搜索建议之后，出现了持续两个小时左右的<a href="http://wukangrui.net/2009/06/24/google-was-filtered.html" rel="prev">域名被劫持事件</a>（各地时间不同，最长的直到6月25日夜还未完全恢复）。这个事件的真正背景相信很多人都知道。但是对于“仅仅两个小时”的服务中断，到底是警告还是演习，网上还是有很多看法的。</p>
<p> <span id="more-823"></span>
<p>推广驴霸在前，打击谷歌在后，主管部门加强互联网监管的意向是再明确不过了。至于google中文域名以外的服务这次遭到如此待遇，我觉得，其目的应该是多方面的。网上有一种观点认为这是{G}{F}{W}的一次尝试，意在试探网民的反应程度；另一种观点则认为这是对google多次遭到警告而未采取切实有效的手段（或者说是拒绝合作）的一种警告；甚至还有一种声音，认为google这次境外服务以及gmail的多数产品服务中断，是在奥运会调高google.com警戒级别尚未调低的情况下，由于央视曝光引起网民用google搜索敏感词频率上升造成的的{G}{F}{W}自动学习的结果。很有创意的想法，不管是不是真的，我喜欢这种带有科幻片色彩的，与终结者2018一样给我们警示的想法。</p>
<p>不管真相是哪一种，但是我觉得从这个事件本身所造成的影响来看，是多方面的，而且都是对google不利的。与之前央视的曝光就像给谷歌做了一次最成功的事件营销不同，这次的事件对google的影响是非常巨大的。</p>
<p>首先，如此大面积的服务中断，不管背后的原因是什么，都将严重削弱国内用户对google的信任度。因为对于追求稳定的商业用户来说，他们不会在意这件事情是否有政治背景或者其他，他们为了自己的利益，有可能会选择其他的服务商来替代。因为一个被政府盯上的，服务随时有可能由于“不可抗的外力”造成中断的公司，不会是他们的最佳选择。如果同样的事件之后再来几次，别说是商人，普通网民可能也会选择放弃google，这次google事件发生后，网上迅速出现了像“建议大家尽快备份gmail、google reader等资料”的呼吁，也可以看出这一点。就像我在<a href="http://wukangrui.net/2009/06/23/china-websites-damned-google-spread-pornography-information.html" rel="prev" target="_blank">之前的文章</a>里所说的，google遭到的是来自一个庞大力量的不正当竞争。</p>
<p>其次，google作为一个企业，他最终极有可能为了保住市场而选择妥协。毕竟，google是跨国企业而不是互联网斗士。它可能同情、可能愤怒、可能遗憾，但是最终为了商业利益，它还是极有可能选择妥协。而这正好符合了主管部门的心愿。我们只能期望，“不作恶”的google，即使妥协，也是采取技术手段来妥协，而不要向不合理的落后的监管妥协，一个安装了监控软件的gmail，是很难和国内的126、sohu等邮箱竞争的。</p>
<p>第三、央视曝光谷歌，有很大程度上应该是在为驴霸转移注意力，但是随着驴霸正式预装（这个“正式”就像珍珠港事件一样，充满了阴谋味道，因为六月份销售的部分品牌电脑已经安装了驴霸软件）的日期临近，主管部门也许觉得还需要一个更能吸引大家注意力的事件，来为驴霸尽可能地铺平道路。对于这一点，我只能说，对于驴霸的批判的注意力也许被转移了，但是民众对于驴霸的态度不会有任何的改变，甚至于，等到哪个界面丑陋问题百出的驴霸真正来到广大网民前面的时候，会有很多家长改变观点，加入反对的阵营。有兴趣的朋友可以看看 <a href="http://www.kenengba.com/" rel="nofollow" target="_blank">可能吧</a> 的<a href="http://www.kenengba.com/post/1149.html" rel="external" target="_blank">这篇文章</a>，你就知道驴霸与四千多万/年的价格相比是多么地不和谐。</p>
<p>第四、对于很多爱党爱国的群众来说，google作为一个“传播色情信息”、“服务不稳定”、一再违背主管部门命令的外国公司，会让他们觉得“深恶痛绝”、然后“坚决支持”甚至“强烈要求”进行严厉打击。这样就调动起他们的批判热情，从而形成强大的民意来对抗现在互联网上“不明真相”的少数“别有用心”的人为google说话的舆论压力。最雷人的一点就是，在中国这样一个民族主义盛行、爱国愤青贬低、抵制洋货成潮流的天朝上国，这次由官方发起的批判活动居然没有引发抵制谷歌的热潮，实在是莫大的讽刺，简直是“对我天朝的巨大侮辱”。</p>
<p>最后一点，或许这算是唯一一点真正值得欣慰或者说是某些精英头脑忽略了的一个问题吧。那就是由于google的这次事件，很多使用gmail的普通用户、使用google广告的商家和站长、以及google其它优秀产品的国内用户受到了影响，这将使更多原本真的以为我们生活在地球村，我们“拿着麦克风”的人意识到{G}{F}{W}的存在。也使更多的人产生翻墙的需求。这或许算是对google的一点点轻微的补偿吧，一旦来到墙外，谁还会用百度呢？</p>
<h3>相关日志</h3>
<ul class="related_post">
<li>2009-07-03 &#8212; <a href="http://wukangrui.net/2009/07/03/we-naver-fear-any-dam.html" title="不管是什么颜色的&ldquo;坝&rdquo;我们都不怕">不管是什么颜色的&ldquo;坝&rdquo;我们都不怕</a></li>
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/green-dam-delay-means-nothing.html" title="推迟的本质就是不了了之">推迟的本质就是不了了之</a></li>
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/sony-disclaimer-for-supply-green-dam.html" title="索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹">索尼恶搞工信部 &#8211; 绿坝犹如预装的定时炸弹</a></li>
<li>2009-06-24 &#8212; <a href="http://wukangrui.net/2009/06/24/seven-ways-refuse-green-dam.html" title="七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠">七条对策帮你摆脱&ldquo;绿坝&rdquo;的纠缠</a></li>
<li>2009-06-23 &#8212; <a href="http://wukangrui.net/2009/06/23/china-websites-damned-google-spread-pornography-information.html" title="国内媒体联合打击google是举国之力玩&ldquo;不正当竞争&rdquo;">国内媒体联合打击google是举国之力玩&ldquo;不正当竞争&rdquo;</a></li>
<li>2009-07-03 &#8212; <a href="http://wukangrui.net/2009/07/03/china-cyblepolice-ridiculous-illegal-information.html" title="一个小网警的龌龊思想">一个小网警的龌龊思想</a></li>
<li>2009-06-26 &#8212; <a href="http://wukangrui.net/2009/06/26/hello-world.html" title="Hello World!">Hello World!</a></li>
<li>2009-06-24 &#8212; <a href="http://wukangrui.net/2009/06/24/google-was-filtered.html" title="google旗下域名遭到劫持">google旗下域名遭到劫持</a></li>
<li>2009-06-19 &#8212; <a href="http://wukangrui.net/2009/06/19/green-dam-is-not-for-people.html" title="绿坝：初衷是好的就够了吗？">绿坝：初衷是好的就够了吗？</a></li>
<li>2009-06-04 &#8212; <a href="http://wukangrui.net/2009/06/04/china-internet-law-in-wrong-way.html" title="中国互联网管理需要清醒一下找找方向">中国互联网管理需要清醒一下找找方向</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wukangrui.net/2009/06/28/google-event-effection.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 最佳实践（一）</title>
		<link>http://wukangrui.net/2009/06/28/asp-net-mvc-best-practices-part-1.html</link>
		<comments>http://wukangrui.net/2009/06/28/asp-net-mvc-best-practices-part-1.html#comments</comments>
		<pubDate>Sun, 28 Jun 2009 06:18:23 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[最佳实践]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/06/28/asp-net-mvc-best-practices-part-1.html</guid>
		<description><![CDATA[本系列翻译自 Kazi Manzur Rashid 的博客，由于翻译水平有限，本系列可能存在误解偏差或者翻译不准的地方，建议对比原文进行阅读。由于篇幅关系，原文中的一篇文章在本系列中将拆解成多篇发布。本篇包括原文第一部分中的1-6节。]]></description>
			<content:encoded><![CDATA[<p><em>本系列翻译自 </em><a href="http://weblogs.asp.net/rashid/default.aspx" rel="external" target="_blank"><em>Kazi Manzur Rashid</em></a><em> 的博客，由于翻译水平有限，本系列可能存在误解偏差或者翻译不准的地方，建议对比<a href="http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx" rel="external" target="_blank">原文</a>进行阅读。由于篇幅关系，原文中的一篇文章在本系列中将拆解成多篇发布。本篇包括原文第一部分中的1-6节。</em></p>
<p> <span id="more-821"></span><br />
<h4>1. 创建UrlHelper的扩展方法来生成url</h4>
<p>尽量避免以字符串方式直接传递controller, action 或者 route name，最好是为创建为UrlHelper创建扩展方法来封装url。例如：</p>
<pre class="code"><span style="color: blue">public static class </span><span style="color: #2b91af">UrlHelperExtension </span>{
    <span style="color: blue">public static string </span>Home(<span style="color: blue">this </span>UrlHelper helper) {
        <span style="color: blue">return </span>helper.Content(<span style="color: #a31515">&quot;~/&quot;</span>);
    }

    <span style="color: blue">public static string </span>SignUp(<span style="color: blue">this </span>UrlHelper helper) {
        <span style="color: blue">return </span>helper.RouteUrl(<span style="color: #a31515">&quot;Signup&quot;</span>);
    }

    <span style="color: blue">public static string </span>Dashboard(<span style="color: blue">this </span>UrlHelper helper) {
        <span style="color: blue">return </span>Dashboard(helper, StoryListTab.Unread);
    }

    <span style="color: blue">public static string </span>Dashboard(<span style="color: blue">this </span>UrlHelper helper, StoryListTab tab) {
        <span style="color: blue">return </span>Dashboard(helper, tab, OrderBy.CreatedAtDescending, 1);
    }

    <span style="color: blue">public static string </span>Dashboard(<span style="color: blue">this </span>UrlHelper helper, StoryListTab tab, OrderBy orderBy, <span style="color: blue">int </span>page) {
        <span style="color: blue">return </span>helper.RouteUrl(<span style="color: #a31515">&quot;Dashboard&quot;</span>, <span style="color: blue">new </span>{ tab = tab.ToString(), orderBy = orderBy.ToString(), page });
    }

    <span style="color: blue">public static string </span>Update(<span style="color: blue">this </span>UrlHelper helper) {
        <span style="color: blue">return </span>helper.RouteUrl(<span style="color: #a31515">&quot;Update&quot;</span>);
    }

    <span style="color: blue">public static string </span>Submit(<span style="color: blue">this </span>UrlHelper helper) {
        <span style="color: blue">return </span>helper.RouteUrl(<span style="color: #a31515">&quot;Submit&quot;</span>);
    }
}</pre>
<p>这样，如果在你的视图中有类似这样的代码： </p>
<pre class="code">    <span style="background: #ffee62">&lt;%</span><span style="color: blue">= </span>Html.ActionLink(<span style="color: #a31515">&quot;Dashboard&quot;</span>, <span style="color: #a31515">&quot;Dashboard&quot;</span>, <span style="color: #a31515">&quot;Story&quot;</span>) <span style="background: #ffee62">%&gt;
</span>    <span style="color: blue">&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;</span><span style="background: #ffee62">&lt;%</span>= Url.RouteUrl(&quot;Profile&quot;)<span style="background: #ffee62">%&gt;</span><span style="color: blue">&quot;&gt;</span>Profile<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;</span></pre>
<p>你就可以用下面的这种方式来代替它们：</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;</span><span style="background: #ffee62">&lt;%</span>= Url.Dashboard() <span style="background: #ffee62">%&gt;</span><span style="color: blue">&quot;&gt;</span>Dashboard<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;</span><span style="background: #ffee62">&lt;%</span>= Url.Profile() <span style="background: #ffee62">%&gt;</span><span style="color: blue">&quot;&gt;</span>Profile<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>在控制器里也可以用，原来的代码：</p>
<pre class="code"><span style="color: blue">return </span>RedirectToAction(
    <span style="color: #a31515">&quot;Dashboard&quot;</span>,
    <span style="color: #a31515">&quot;Story&quot;</span>,
    <span style="color: blue">new </span>{
        tab = StoryListTab.Favorite,
        orderBy = OrderBy.CreatedAtAscending,
        page = 1
    }
);</pre>
<p>可以写成：</p>
<pre class="code"><span style="color: blue">return </span>Redirect(Url.Dashboard(StoryListTab.Favorite,
                                OrderBy.CreatedAtAscending, 1));</pre>
<p>当然了，你也可以使用 <a href="http://www.tampadev.org/News/Details/DownloadASPNETMVCFuturesMicrosoftWebMvcAssembly" rel="external" target="_blank">future assembly</a> 中的强类型版本来获得控制器、方法以及参数值，或者创建你自己的强类型版本以免将来进行重构时太过于痛苦，但是请一定记住，它没有官方支持并且将来有可能会发生改变。上面的方式也可以和强类型版本搭配使用。当然“另外增加一个间接层”（Scott Ha 喜欢用的引语）有一些好处，在编写单元测试的时候还有一个好处是你只需处理 <a href="http://msdn.microsoft.com/zh-cn/library/system.web.mvc.redirectresult.aspx" rel="tag" target="_blank">RedirectResult</a> 而无须同时处理 RedirectResult 和 <a href="http://msdn.microsoft.com/zh-cn/library/system.web.mvc.redirecttorouteresult.aspx" rel="tag" target="_blank">RedirectToRouteResult</a>。</p>
<h4>2. Create Extension Method of UrlHelper to map your JavaScript, Stylesheet and Image Folder</h4>
<p>默认情况下 <a href="http://www.asp.net/mvc/" rel="tag" target="_blank">ASP.NET MVC</a> 创建Content、Scripts文件夹来做这些事，这一点我不喜欢，我更喜欢下面的这种文件夹结构，这样在IIS里我可以只让静态文件缓存在Assets文件夹而不是多个文件夹：</p>
<ul>
<li>Assets </li>
<li>+images </li>
<li>+scripts </li>
<li>+stylesheets </li>
</ul>
<p>无论是结构是什么样的，还是要为UrlHelper创建一些扩展方法来映射这些文件夹，以便你在视图中可以很方便地指向它们，这样以后如果你要改变目录结构，你就无须做大量查找替换的工作。我还建议你为所有经常在视图中用到的资源创建UrlHelper的扩展方法。例如：</p>
<pre class="code"><span style="color: blue">public static string </span>Image(<span style="color: blue">this </span>UrlHelper helper, <span style="color: blue">string </span>fileName) {
    <span style="color: blue">return </span>helper.Content(<span style="color: #a31515">&quot;~/assets/images/{0}&quot;</span>.FormatWith(fileName));
}

<span style="color: blue">public static string </span>Stylesheet(<span style="color: blue">this </span>UrlHelper helper, <span style="color: blue">string </span>fileName) {
    <span style="color: blue">return </span>helper.Content(<span style="color: #a31515">&quot;~/assets/stylesheets/{0}&quot;</span>.FormatWith(fileName));
}

<span style="color: blue">public static string </span>NoIcon(<span style="color: blue">this </span>UrlHelper helper) {
    <span style="color: blue">return </span>Image(helper, <span style="color: #a31515">&quot;noIcon.png&quot;</span>);
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>然后当需要用到这些路径的时候，原来的代码</p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">link </span><span style="color: red">href</span><span style="color: blue">=&quot;../../Content/Site.css&quot; </span><span style="color: red">rel</span><span style="color: blue">=&quot;stylesheet&quot; </span><span style="color: red">type</span><span style="color: blue">=&quot;text/css&quot; /&gt;</span></pre>
<p>就可以写成这样：<a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">link </span><span style="color: red">href</span><span style="color: blue">=&quot;</span><span style="background: #ffee62">&lt;%</span>= Url.Stylesheet(&quot;site.css&quot;)<span style="background: #ffee62">%&gt;</span><span style="color: blue">&quot; </span><span style="color: red">rel</span><span style="color: blue">=&quot;stylesheet&quot; </span><span style="color: red">type</span><span style="color: blue">=&quot;text/css&quot; /&gt;</span></pre>
<h4>3. 中使用启动加载器</h4>
<p>我在<a href="http://weblogs.asp.net/rashid/archive/2009/02/17/use-bootstrapper-in-your-asp-net-mvc-application-and-reduce-code-smell.aspx" rel="prev" target="_blank">以前的文章</a>中已经提到过这一点，总的来说就是：如果你要在 Global.asax 的 Application_Start 中做很多处理，比如 注册路由规则(Routers)、注册控制器工厂(Controller Factory)、模型绑定(Model Binders)、视图引擎(View Engine)、启动程序级的特定<a href="http://weblogs.asp.net/rashid/archive/2009/03/05/use-event-aggregator-to-make-your-application-more-extensible.aspx" rel="external" target="_blank">后台服务</a>或者为特定部分创建独立任务等，那就用<a href="http://weblogs.asp.net/rashid/archive/2009/03/05/use-event-aggregator-to-make-your-application-more-extensible.aspx" rel="prev" target="_blank">启动加载器</a>来执行这些操作。这会让你的代码更简洁，更可测。这一点在用 <a href="http://www.asp.net/mvc/" rel="tag" target="_blank">ASP.NET MVC</a> 构建门户级应用时尤其有用，因为这类应用中的每个模块都可能有一些不影响到其他模块的启动初始化操作。但是如果你只是开发一个小应用，上面提到的这些对你来说都不是问题，你当然也可以继续用默认的 global.asax。</p>
<h4>4. 不要硬编码对依赖注入容器的调用，用通用服务定位器来代替。 </h4>
<p>不要让任何特定的依赖注入容器(DI Container)打乱你的代码，更好的办法是使用通用服务定位器(<a href="http://commonservicelocator.codeplex.com/" rel="external" target="_blank">Common Service Locator</a>)，它是对底层依赖注入进行的抽象，已经支持几乎所有流行的依赖注入容器，它让你可以任意替换底层的依赖注入对象而无须修改代码，因为每个依赖注入容器都具有一些不同于其它容器的特性。<a href="http://devlicio.us/blogs/tim_barcz/" rel="external" target="_blank">Tim Barcz</a> 最近写了一篇关于这个话题的<a href="http://devlicio.us/blogs/tim_barcz/archive/2009/03/29/your-ioc-container-choice-is-not-a-feature-of-your-application.aspx" rel="external" target="_blank">很棒的文章</a>，我不太明白他为什么没有提到我们对我们偏爱的依赖注入容器有多痴迷。通用服务定位器对绝大部分常用情景都提供了支持，而对一些特殊情况比如对已实体化对象的依赖注入，我印象里有 <a href="http://codebetter.com/blogs/jeremy.miller/archive/2009/01/16/quot-buildup-quot-existing-objects-with-structuremap.aspx" rel="external" target="_blank">StructureMap</a>、<a href="http://codeclimber.net.nz/archive/2009/02/10/how-to-use-ninject-to-inject-dependencies-into-asp.net-mvc.aspx" rel="external" target="_blank">Ninject</a> 和 Unity，你可以调用静态方法 ServiceLocator.Current.GetInstance 来代替。 通用服务定位器 是 <a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/08/16/it-s-time-for-ioc-container-detente.aspx" rel="external" target="_blank">Jeremy D Miller</a> 发起的 依赖注入容器开发者(the DI Containers creators)的集体作品。</p>
<p>用通用服务定位器创建控制器工厂非常容易：</p>
<pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">CommonServiceLocatorControllerFactory </span>: <span style="color: #2b91af">DefaultControllerFactory </span>{
    <span style="color: blue">protected override </span><span style="color: #2b91af">IController </span>GetControllerInstance(<span style="color: #2b91af">Type </span>controllerType) {
        <span style="color: blue">return </span>(controllerType == <span style="color: blue">null</span>) ? <span style="color: blue">base</span>.GetControllerInstance(controllerType) : ServiceLocator.Current.GetInstance(controllerType) <span style="color: blue">as </span><span style="color: #2b91af">IController</span>;
    }
}</pre>
<p>我希望 MVCContrib 的成员们也用这样的方式，而不是为每个容器创建一个独立的控制器工厂。</p>
<h4>5. 用恰当的的AcceptVerbs属性来修饰你的控制器方法</h4>
<p><a href="http://www.asp.net/mvc/" rel="tag" target="_blank">ASP.NET MVC</a> 比 Web Forms 更容易遭受攻击。所以务必让对数据进行修改的控制器方法只接受 Post 方式请求（HttpVerbs.Post）。如果安全对你来说至关重要，你还可以用 ValidateAntiForgeryToken 或者 Captcha。我强烈推荐 <a href="http://devlicio.us/blogs/derik_whittaker/" rel="external" target="_blank">Derik Whittaker</a> 写的一篇 <a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/12/02/using-recaptcha-with-asp-net-mvc.aspx" rel="external" target="_blank">很好的文章</a> 以及<a href="http://www.dimecasts.net/Casts/CastDetails/76" rel="external" target="_blank">视频</a>介绍了怎么把 reCaptcha 整合到 <a href="http://www.asp.net/mvc/" rel="tag" target="_blank">ASP.NET MVC</a> 应用程序（作者注：不要错过了 <a href="http://www.dimecasts.net/" rel="external" target="_blank">DimeCasts.net</a> 的另一个短片，我从中学到了很多）。我的经验法则是对所有数据修改方法使用 HttpVerbs.Post，对所有数据读取操作使用 HttpVerbs.Get。</p>
<h4>6. 用OutputCache修饰你的频繁调用的操作方法</h4>
<p>Use OutputCache attribute when you are returning the less frequent updated data, prime candidate may be your home page, feed etc etc. You can use it for both Html and Json data types. When using it, only specify the Cache Profile name, do not not specify any other thing, use the web.config output cache section to fine tune it. For example:当你需要返回不频繁更新的数据时使用 OutputCache 属性，最常见的例子是首页、Feed等。你在返回Html以及Json数据类型的方法中都可以使用这个属性。在使用的时候，注意只指定CacheProfile参数，不要指定任何其它东西，用 web.config 输出缓存控制节可以很好地调整它。例如：</p>
<pre class="code">[<span style="color: #2b91af">AcceptVerbs</span>(<span style="color: #2b91af">HttpVerbs</span>.Get), <span style="color: #2b91af">OutputCache</span>(CacheProfile = <span style="color: #a31515">&quot;Dashboard&quot;</span>)]
<span style="color: blue">public </span><span style="color: #2b91af">ActionResult </span>Dashboard(<span style="color: blue">string </span>userName, StoryListTab tab, OrderBy orderBy, <span style="color: blue">int</span>? page) {
}</pre>
<p>在 web.config 文件中的配置：<a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">system.web</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">caching</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">outputCacheSettings</span><span style="color: blue">&gt;
            &lt;</span><span style="color: #a31515">outputCacheProfiles</span><span style="color: blue">&gt;
                &lt;</span><span style="color: #a31515">clear</span><span style="color: blue">/&gt;
                &lt;!-- </span><span style="color: green">15 Seconds </span><span style="color: blue">--&gt;
                &lt;</span><span style="color: #a31515">add
                    </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">Dashboard</span>&quot;
                    <span style="color: red">duration</span><span style="color: blue">=</span>&quot;<span style="color: blue">15</span>&quot;
                    <span style="color: red">varyByParam</span><span style="color: blue">=</span>&quot;<span style="color: blue">*</span>&quot;
                    <span style="color: red">location</span><span style="color: blue">=</span>&quot;<span style="color: blue">Client</span>&quot;
                    <span style="color: blue">/&gt;
            &lt;/</span><span style="color: #a31515">outputCacheProfiles</span><span style="color: blue">&gt;
        &lt;/</span><span style="color: #a31515">outputCacheSettings</span><span style="color: blue">&gt;
    &lt;/</span><span style="color: #a31515">caching</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">system.web</span><span style="color: blue">&gt;</span></pre>
<p>请继续阅读：《<a href="http://wukangrui.net/2009/07/01/asp-net-mvc-best-practices-part-2.html" rel="next">ASP.NET MVC 最佳实践（二）</a>》</p>
<h3>相关日志</h3>
<ul class="related_post">
<li>2009-07-01 &#8212; <a href="http://wukangrui.net/2009/07/01/asp-net-mvc-best-practices-part-2.html" title="ASP.NET MVC 最佳实践（二）">ASP.NET MVC 最佳实践（二）</a></li>
<li>2009-04-13 &#8212; <a href="http://wukangrui.net/2009/04/13/aspnetmvc-hands-on-labs-develop-application.html" title="[翻译]ASP.NET MVC动手实验1-3：开发ASP.NET MVC应用">[翻译]ASP.NET MVC动手实验1-3：开发ASP.NET MVC应用</a></li>
<li>2009-04-09 &#8212; <a href="http://wukangrui.net/2009/04/09/aspnetmvc-hands-on-labs-create-application.html" title="[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用">[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用</a></li>
<li>2009-04-09 &#8212; <a href="http://wukangrui.net/2009/04/09/aspnetmvc-hands-on-labs-introduction.html" title="[翻译]ASP.NET MVC动手系列1-1：ASP.NET MVC概述">[翻译]ASP.NET MVC动手系列1-1：ASP.NET MVC概述</a></li>
<li>2009-07-05 &#8212; <a href="http://wukangrui.net/2009/07/05/php-5-3-0-release-new-feature.html" title="PHP 5.3.0 发布">PHP 5.3.0 发布</a></li>
<li>2009-06-22 &#8212; <a href="http://wukangrui.net/2009/06/22/whatever-hover-pseudo-class-without-javascript.html" title="Whatever:hover &#8211; 无需javascript让IE支持丰富伪类">Whatever:hover &#8211; 无需javascript让IE支持丰富伪类</a></li>
<li>2009-04-30 &#8212; <a href="http://wukangrui.net/2009/04/30/solution-for-js-intellisense-error.html" title="VS2008 中 JS IntelliSense出错的解决">VS2008 中 JS IntelliSense出错的解决</a></li>
<li>2008-06-22 &#8212; <a href="http://wukangrui.net/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li>
<li>2008-06-22 &#8212; <a href="http://wukangrui.net/2008/06/22/thinking-about-html-page-creating.html" title="静态页面生成的思考">静态页面生成的思考</a></li>
<li>2008-06-18 &#8212; <a href="http://wukangrui.net/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wukangrui.net/2009/06/28/asp-net-mvc-best-practices-part-1.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>举报腾讯滔滔的有害行为</title>
		<link>http://wukangrui.net/2009/06/26/report-evil-tencent-taotao.html</link>
		<comments>http://wukangrui.net/2009/06/26/report-evil-tencent-taotao.html#comments</comments>
		<pubDate>Fri, 26 Jun 2009 08:54:05 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[乱七八糟]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/06/26/report-evil-tencent-taotao.html</guid>
		<description><![CDATA[作为一名普通的中国公民，作为在党的光辉照耀下成长起来的新一代无产阶级事业接班人中的一员，我本着坚决与犯罪分子和反动分子斗争到底的革命精神，怀着向老一辈革命家学习的理想，勇敢举报这个违法违纪的网站。]]></description>
			<content:encoded><![CDATA[<p>举报网站：腾讯滔滔（<a href="http://taotao.com">http://taotao.com</a>)</p>
<p>举报理由：用技术手段封锁爱国爱党言论（见图，可自行验证）。</p>
<p>事实经过：</p>
<p> <span id="more-814"></span>
<p><a href="http://wukangrui.net/attachments/2009/06/1.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="未标题-1" border="0" alt="未标题-1" src="http://wukangrui.net/attachments/2009/06/1_thumb.jpg" width="554" height="264" /></a> </p>
<p>详细描述：</p>
<p>值此伟大的中国共产党建党八十八周年，建国六十周年之际，为了向我们伟大的党表达一名普通爱国爱党群众的拥护和爱戴，我在我的滔滔里写下了图片中的字样，大家可以看出，我所写的内容，是在我们的光明网、新华网、人民网常常可以看到，在人民日报、CCTV等媒体上也可经常看到的，绝对合法，绝对爱党，绝对符合国家法律法规和绝对坚持四项基本原则的内容。其中既不含淫秽色情的词汇，更不含有任何造谣污蔑或者煽动性词汇，甚至于，连一点点含有褒义的词汇都没有。</p>
<p>但是，让我心冷（我相信也让党和人民心痛）的是，作为一家中国的公司旗下的网站，滔滔居然将我对党的一片赤诚和忠心拥护污蔑为“非法内容”。</p>
<p>我不知道腾讯的意思是“伟大”、“光荣”、“正确”是非法关键词？还是说我这整句话是造谣侮辱？如果腾讯是这个意思，那么我不禁想问：腾讯滔滔，你到底还坚不坚持四项基本原则？你到底还坚不坚持党的领导？你竟敢认为领导中国人民推翻三座大山建立了民主共和国，并且带领人民在改革开放和经济建设中取得举世瞩目的伟大成就的党不光荣、不伟大、不正确？</p>
<p>你是替谁说话？</p>
<p>作为一名普通的中国公民，作为在党的光辉照耀下成长起来的新一代无产阶级事业接班人中的一员，我本着坚决与犯罪分子和反动分子斗争到底的革命精神，怀着向老一辈革命家学习的理想，勇敢举报这种伤害爱党爱国人民群众（或许已经触犯法律，俺们草民无权判定，只有法院才能给人定罪）的行为。</p>
<p>希望主管部门能根据我国宪法和法律，对腾讯滔滔的这个行为进行调查，如果该行为触犯互联网法律法规，应该及时进行查处。</p>
<p>最后，祝愿我们伟大祖国繁荣昌盛！</p>
<h3>随机推荐</h3>
<ul class="related_post">
<li>2005-12-12 &#8212; <a href="http://wukangrui.net/2005/12/12/action-of-refactor-page-with-css.html" title="实践：用Div+CSS重构网页">实践：用Div+CSS重构网页</a></li>
<li>2006-05-19 &#8212; <a href="http://wukangrui.net/2006/05/19/get-vista-beta-dvd-free.html" title="免费领取微软Vista测试光盘">免费领取微软Vista测试光盘</a></li>
<li>2008-06-09 &#8212; <a href="http://wukangrui.net/2008/06/09/unmask-landong-cheat.html" title="撕破兰董的牛皮">撕破兰董的牛皮</a></li>
<li>2006-03-18 &#8212; <a href="http://wukangrui.net/2006/03/18/yunnan-wenshan-e-government.html" title="老家的电子政务网">老家的电子政务网</a></li>
<li>2006-04-24 &#8212; <a href="http://wukangrui.net/2006/04/24/suffer-internet.html" title="上网之累">上网之累</a></li>
<li>2005-10-29 &#8212; <a href="http://wukangrui.net/2005/10/29/catch-cold.html" title="感冒来袭">感冒来袭</a></li>
<li>2007-02-01 &#8212; <a href="http://wukangrui.net/2007/02/01/about-examination.html" title="关于考试">关于考试</a></li>
<li>2006-06-04 &#8212; <a href="http://wukangrui.net/2006/06/04/climb-langya-mountain.html" title="狼牙山">狼牙山</a></li>
<li>2006-09-28 &#8212; <a href="http://wukangrui.net/2006/09/28/about-man.html" title="关于男人">关于男人</a></li>
<li>2009-06-28 &#8212; <a href="http://wukangrui.net/2009/06/28/google-event-effection.html" title="google域名劫持事件的影响">google域名劫持事件的影响</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wukangrui.net/2009/06/26/report-evil-tencent-taotao.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.890 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2009-07-05 10:42:41 -->
<!-- Compression = gzip -->