<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Cat in dotNET</title><link>http://www.cnblogs.com/cathsfz/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Oct 2008 11:33:18 GMT</lastBuildDate><pubDate>Sun, 12 Oct 2008 11:33:18 GMT</pubDate><ttl>60</ttl><geo:lat>23.1</geo:lat><geo:long>113.2</geo:long><image><link>http://claimID.com/Cat</link><url>http://static.flickr.com/95/buddyicons/45201686@N00.jpg?1161510808</url><title>Cat Chen</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/CatChen/dotNET" type="application/rss+xml" /><feedburner:emailServiceId>573799</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><item><title>Vista 为什么要引入 UAC</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/398988063/1295597.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Sun, 21 Sep 2008 15:48:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/09/21/1295597.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1295597.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/09/21/1295597.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1295597.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1295597.html</trackback:ping><description>&lt;p&gt;UAC的目标就是：干扰用户！这其实不是我独创的，而是从&lt;a href="http://twit.tv/"&gt;TWiT&lt;/a&gt;上听到的一种见解。&lt;/p&gt;
&lt;p&gt;UNIX的命令行有sudo，Mac在GUI上也能够在需要sudo调用时弹出对话框要求输入密码，然而这两者的出现频率比Vista的UAC要低得多。为什么UAC的出现频率那么高呢，难道是Vista的用户体验设计得有问题？显然不是这样，Vista的UAC就是设计来不停地干扰用户的。&lt;/p&gt;
&lt;p&gt;干扰用户随之而来的是什么？就是用户觉得这个软件很烦，然后逐步放弃使用这个软件，转而使用同类软件中不那么烦人的。这个过程会逐步把经常进行UAC调用的软件从是场中淘汰掉，如果你的软件不希望被市场淘汰，你就必须尽量减少UAC调用，也就是减少系统调用。&lt;/p&gt;
&lt;p&gt;最终，市面上大量滥用系统调用的软件会逐步消失，要么自身改进，要么自然淘汰，从而提高了Windows的安全性。等一下，这跟Windows的安全性有什么关系？假若你的代码要执行系统调用，同时你的代码是有漏洞的，就可能由于你的程序漏洞而导致系统受到攻击。但如果你的软件本来就不需要做任何系统调用，就算有漏洞也不会连累Windows，Windows也就显得安全多了。&lt;/p&gt;
&lt;p&gt;P.S.当然，还有一些非系统调用也需要UAC，例如对C:\Program Files的写入操作。这是因为Vista认为这也是个危险操作，而程序应该将数据存放到C:\ProgramData来实现可执行代码与数据的分离。
&lt;/p&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1295597.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42952/" target="_blank"&gt;[新闻]微型博客Twitter取消IM服务 称其ROI差&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=f2WEvt"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=f2WEvt" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=zbmLL"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=zbmLL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=1jTsl"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=1jTsl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=KmnYL"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=KmnYL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=ibtML"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=ibtML" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=d8n6l"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=d8n6l" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=DXezL"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=DXezL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/398988063" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/09/21/1295597.html</feedburner:origLink></item><item><title>如何动态加载 JavaScript 与 CSS</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/381440635/1282415.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Tue, 02 Sep 2008 15:01:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/09/02/1282415.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1282415.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/09/02/1282415.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1282415.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1282415.html</trackback:ping><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/default.aspx"&gt;Omar AL Zabir&lt;/a&gt;这位MVP总是喜欢搞些稀奇古怪同时又很实用的小东西，并且还十分值得参考。最近他就做了一个叫做&lt;a href="http://www.codeplex.com/ensure"&gt;ensure&lt;/a&gt;的小工具用于动态加载JavaScript、CSS与HTML，而且IE、Firefox、Opera、Safari都支持了，那么我们就来看看ensure是如何做到动态加载JavaScript与CSS的。&lt;/p&gt;
&lt;p&gt;在介绍ensure内部的实现之前，让我们先来看看其功能：&lt;/p&gt;
&lt;blockquote&gt;ensure({&lt;br /&gt;
&amp;nbsp; &amp;nbsp; html: "popup.html",&lt;br /&gt;
&amp;nbsp; &amp;nbsp; javascript: "popup.js",&lt;br /&gt;
&amp;nbsp; &amp;nbsp; css: "popup.css"&lt;br /&gt;
&amp;nbsp; }, function() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Popup.show("hello world");&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
);
&lt;/blockquote&gt;
&lt;p&gt;在这段代码中，ensure首先会确保popup.html、popup.js、popup.css这3个文件的加载，如果都没加载过ensure就会动态加载它们；如果已经加载过了，ensure不会再次加载。在确保这3个文件都加载后，ensure会调用后面的匿名函数，也就是执行Popup.show("hello world");。&lt;/p&gt;
&lt;p&gt;接下来，就让我们看看ensure是如何动态加载JavaScript与CSS的。&lt;/p&gt;
&lt;h3&gt;加载JavaScript&lt;/h3&gt;
&lt;p&gt;在ensure当中，加载JavaScript分两种情况来执行，也就是Safari与非Safari这两种情况。&lt;/p&gt;
&lt;h4&gt;在IE、Firefox、Opera中加载JavaScript&lt;/h4&gt;
&lt;p&gt;在这三款浏览器中加载JavaScript，其实只需要创建一个script元素，把src指向要加载的URL，最后把script元素追加到head元素上，那就搞掂了。此项工作是在&lt;strong&gt;HttpLibrary.createScriptTag()&lt;/strong&gt;中完成的。不过我们不仅仅要加载JavaScript，同时还需要知道它什么时候完成加载，这可以通过script元素的onload事件或onreadystatechange事件来实现。&lt;/p&gt;
&lt;h4&gt;在Safari中加载JavaScript&lt;/h4&gt;
&lt;p&gt;因为Safari 2不支持onload或者onreadystatechange，所以只能手动通过XHR把URL读去过来，然后再手动eval这段代码，这就带来了一个限制──只能加载本域的JavaScript文件。在ensure当中，eval的工作是通过&lt;strong&gt;HttpLibrary.globalEval()&lt;/strong&gt;来完成的。为了让JavaScript代码在全局（global）上下文中eval，ensure还是使用了创建script元素的方法，并将要eval的JavaScript置于其内，最后把script元素追加到head元素内。&lt;/p&gt;
&lt;p&gt;细心的人肯定要问，为什么&lt;strong&gt;HttpLibrary.globalEval()&lt;/strong&gt;要如此设计，而非直接&lt;strong&gt;window.eval&lt;/strong&gt;或者&lt;strong&gt;eval.call&lt;/strong&gt;。这是因为，&lt;strong&gt;window.eval&lt;/strong&gt;和&lt;strong&gt;eval.call&lt;/strong&gt;都无法在IE6中实现和script标签加载JavaScript代码一模一样的效果，这两种做法的eval在IE6下仍然不是在全局上下文中执行的。搜索一下你就会发现一些相关的讨论，例如jQuery就曾经使用&lt;strong&gt;window.execScript()&lt;/strong&gt;来完成此项任务。不过最终大家都发现添加script元素才是最好的跨浏览器解决方案，所以现在的jQuery和ensure都是如此实现的了。&lt;/p&gt;
&lt;h3&gt;加载CSS&lt;/h3&gt;
&lt;p&gt;相对于加载JavaScript而言，加载CSS就简单多了，而且方法也是类似的：在head元素内直接加入link元素就可以了。这也正是&lt;strong&gt;loadCSS()&lt;/strong&gt;所完成的工作。&lt;/p&gt;
&lt;p&gt;实际上，ensure没有确保CSS完成加载后再执行下去。这估计是因为浏览器都能够在CSS加载完成后自动应用到页面上，因此Omar AL Zabir就认为CSS的加载顺序是无关紧要的，不过假如CSS加载速度实在太慢，其实还是会影响显示效果的。&lt;/p&gt;
&lt;h4&gt;在IE6中加载CSS&lt;/h4&gt;
&lt;p&gt;这次需要特别照顾的是IE6，而非Safari。IE6在往head元素添加link元素时，必须在window的上下文中完成，因此添加link的函数通过call调用切换了上下文。&lt;/p&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;实际上动态加载JavaScript与CSS都并不难，在大多数情况下只需要向head元素追加对应的子元素就可以了，只有Safari2和IE6这两款古老的浏览器是需要特殊照顾的。&lt;/p&gt;&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1282415.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42951/" target="_blank"&gt;[新闻]用手机聊Gtalk的方法以及应用总结&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=PrJ7Ln"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=PrJ7Ln" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=K9grzL"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=K9grzL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=3WXFal"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=3WXFal" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=OB6dbL"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=OB6dbL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=6EVv7L"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=6EVv7L" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=ARhZUl"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=ARhZUl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=JBzbLL"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=JBzbLL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/381440635" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/09/02/1282415.html</feedburner:origLink></item><item><title>英语阅读推荐：创建Silverlight用户控件 &amp; A*路径搜索中使用二叉堆</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/265228143/1139710.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Sun, 06 Apr 2008 20:07:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/04/07/1139710.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1139710.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/04/07/1139710.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1139710.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1139710.html</trackback:ping><description>&lt;p&gt;本期&lt;a href="http://www.cnblogs.com/cathsfz/category/76688.html"&gt;Random Clippings&lt;/a&gt;推荐两篇文章，一篇关于时下热门的Silverlight，而另一篇则是相对学术风格的二叉堆使用方法介绍。&lt;/p&gt;
&lt;h3&gt;创建Silverlight用户控件 (&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/04/04/tip-trick-creating-and-using-silverlight-and-wpf-user-controls.aspx"&gt;Creating and Using Silverlight and WPF User Controls&lt;/a&gt;)&lt;/h3&gt;
&lt;p&gt;Scott Guthrie的文章总是那么简单易懂，有时候还有丰富的插图，简直就如看连环画一般容易，因此作为入门级别的英语阅读练习文章就最适合不过了。这次Scott讲的是如何创建Silverlight（或WPF）的用户控件，不过用的不是VS2008，而是Expression Blend。&lt;/p&gt;
&lt;p&gt;文章开头应该只有一个词是需要查字典的，也就是&amp;#8220;encapsulate&amp;#8221;，而这正是重点。为什么我们需要用户控件？因为我们需要对重复的逻辑进行&amp;#8220;封装&amp;#8221;，这样才能复用描述这些逻辑的代码，&amp;#8220;encapsulate&amp;#8221;正是&amp;#8220;封装&amp;#8221;的意思。在看懂了这个词之后，就是看图说话了，文章一步一步地教你如何将一组已有的控件圈选出来，然后生成一个用户控件。我想你看完图片，就一定能读懂图片下方对应的文字，甚至你可以为这张图配上更好的英文描述。&lt;/p&gt;
&lt;p&gt;在完成了用户控件的创建后，Scott以数据绑定为例介绍了其使用方式。首先，你要定义待绑定的类型，实例化并填充数据，最后在XAML中加上绑定语句，之后就是继续看图说话了。在此问大家一个问题，知道阅读英语文章时你的障碍除了来自于你个人的英语能力，还来自于什么吗？答案是文化背景的差异，甚至是文章结构风格的差异，中国人喜欢把重点（或者是真正要表述的意思）放到文章的最后，并称之为&amp;#8220;压轴&amp;#8221;，然而美国人的思维习惯恰好是相反的，打个比喻就是——&amp;#8220;重点请先说，后面的可能我没时间听下去&amp;#8221;。&lt;/p&gt;
&lt;p&gt;文化背景差异造成的障碍就更大了，一些约定俗成的东西可能你无法理解，从而某些幽默可能你当成了事实，这就导致更大范围的误解了。举一个简单的例子，知道Scott这篇文章中的这张图片有什么好笑吗？&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.scottgu.com/blogposts/extractusercontrol/step11.png"  alt="" /&gt; &lt;/p&gt;
&lt;p&gt;如果你理解使用信用卡时&amp;#8220;ship to&amp;#8221;和&amp;#8220;bill to&amp;#8221;的用途，并且你知道上述两个地址分别是哪里，那么你看到这样图就会哈哈大笑——&amp;#8220;货物送往&lt;a href="http://www.google.com/search?q=One+Microsoft+Way%2C+98052&amp;amp;sourceid=navclient-ff&amp;amp;ie=UTF-8&amp;amp;rlz=1B3GGGL_enCN250"&gt;Microsoft&lt;/a&gt;，并请&lt;a href="http://www.google.com/search?q=One+Infinite+Loop%2C+95014&amp;amp;sourceid=navclient-ff&amp;amp;ie=UTF-8&amp;amp;rlz=1B3GGGL_enCN250"&gt;Apple&lt;/a&gt;买单&amp;#8221;，这太恶搞了！（如果你还是不明白的话，请点击Microsoft与Apple上面的链接。）&lt;/p&gt;
&lt;p&gt;在这里，你就看到了文化背景的影响。然而英语是一个不能逃避的问题，要说因为背景不同从而避免阅读英文文章，还不如多读从而逐步了解这些背景。在新东方，我碰到过一个教TOEFL的老师，他说他从来没到过美国读大学，但却对美国大学里面的生活情景了如指掌，例如如何申请宿舍，停车场是区分教工车位和学生车位，代号101的课程通常是入门课程，等等。为什么呢？他说因为他做了大量的TOEFL听力题，而一般听力题都是这类情景下的对话，因此即使你不是生活在那种文化中你也可以对它有所掌握。&lt;/p&gt;
&lt;h3&gt;A*路径搜索中使用二叉堆 (&lt;a href="http://www.policyalmanac.org/games/binaryHeaps.htm"&gt;Using Binary Heaps in A* Pathfinding&lt;/a&gt;)&lt;/h3&gt;
&lt;p&gt;如果你要深入研究某些技术，不可不勉地你必须阅读一些很学术的英文文章，这篇文章就是一个例子。&lt;/p&gt;
&lt;p&gt;在这篇文章中，首先说的是一维列表的解决方案，并且说明为什么效率是问题。然后解决方案自然是binary heap，这就要说说binary heap的二叉树结构如何能够保存在一维数组中。接下来是对binary heap添加删除元素操作的简单说明，并且解释了为什么binary heap的效率比简单的一维列表要高。请注意，到此为止文章都没有深入binary heap的实线细节，这就是美国人比较习惯的写法，先briefing一次，再深入，因此后面的部分你看不懂也至少懂了一般。如果在前面就直接引入细节，你看不懂，就算后面还是有显浅的内容你可能也会错过。&lt;/p&gt;
&lt;p&gt;在文章的后半部分中，作者深入地解释了binary heap的数据结构、操作算法，读完这一部分你就知道如何在自己的程序中实现binary heap了。并且在文章的最后，还有若干个延伸阅读的链接。通过读这篇文章，你就能了解到美国人一般是如何组织科学类文章的主干是如何安排的。&lt;/p&gt;
&lt;p&gt;最后，如果你觉得Random Clipping的推荐不错，可以考虑长期&lt;a href="http://feeds.feedburner.com/CatChen/dotNET"&gt;订阅Cat in dotNET&lt;/a&gt;，这样你将不会错过将来的任何一篇推荐。&lt;/p&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1139710.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42950/" target="_blank"&gt;[新闻]Google开拓美政府机构市场 微软业务受冲击&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=WqaRyW"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=WqaRyW" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=yNRapI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=yNRapI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=Sygbfi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=Sygbfi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=zHGuGI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=zHGuGI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=Ubz5VI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=Ubz5VI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=lgRQMi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=lgRQMi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=K7wkSI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=K7wkSI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/265228143" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/04/07/1139710.html</feedburner:origLink></item><item><title>救救 Web Developers ，拒绝 IE6 ！</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/264967551/1139262.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Sun, 06 Apr 2008 08:41:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/04/06/1139262.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1139262.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/04/06/1139262.html#Feedback</comments><slash:comments>56</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1139262.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1139262.html</trackback:ping><description>&lt;p&gt;这是最近的一场于web developers相关的campaign，官方站点是&lt;a href="http://www.savethedevelopers.org/"&gt;SaveTheDevelopes.org&lt;/a&gt;。在上面你可以下载一段脚本和对应的图片，放到你自己的网站上，然后只要有用户使用IE6访问你的网站，他就会看到一个小小的提示框，建议他升级到IE7或选用其它非IE浏览器。当然，你也可以直接引用SaveTheDevelopers.org上面的脚本文件，但大家都知道潜在的风险，因此最好不要这样做，如果你有自己的空间的话最好还是下载下来放到自己的空间上。&lt;/p&gt;
&lt;p&gt;为了支持这个campaign，我特意为他们做了一个&lt;a href="http://www.savethedevelopers.org/lang/zh/"&gt;中文翻译&lt;/a&gt;。我本来是想和&lt;a href="http://www.awflasher.com/blog/"&gt;aw&lt;/a&gt;一起做的，不过他们把内容发给我的那个晚上找不到aw，于是有翻译问题就直接找&lt;a href="http://blog.wangjunyu.net/"&gt;Junyu&lt;/a&gt;问了，最后在Junyu的帮忙下把翻译搞定了。我在想是不是应该多做一个粤语翻译，这样会比较好玩，反正也就一个晚上的事情而已。&lt;/p&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1139262.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42949/" target="_blank"&gt;[新闻]消息称苹果正在开发iTunes网络电视&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=QfqpXE"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=QfqpXE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=SY07ZI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=SY07ZI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=xxdnqi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=xxdnqi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=Lvn01I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=Lvn01I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=XoBX1I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=XoBX1I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=cMioNi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=cMioNi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=FcqMTI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=FcqMTI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/264967551" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/04/06/1139262.html</feedburner:origLink></item><item><title>讲座资源：Silverlight 2.0</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/261053704/1130959.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Mon, 31 Mar 2008 04:17:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/03/31/1130959.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1130959.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/03/31/1130959.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1130959.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1130959.html</trackback:ping><description>&lt;p&gt;这是2008年3月30日微软广州.NET俱乐部活动上Silverlight 2.0这一部分讲座的资源，包括了&lt;a href="http://www.cnblogs.com/Files/cathsfz/Silverlight_2_0.zip"&gt;pptx&lt;/a&gt;以及&lt;a href="http://www.cnblogs.com/Files/cathsfz/SilverlightDemo.zip"&gt;演示网站&lt;/a&gt;（演示网站中的SilverlightDemoHost项目需要部署为&lt;a href="http://localhost/SilverlightDemo/"&gt;http://localhost/SilverlightDemo/&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;在这次的讲座上，讲的主要是Silverlight 2.0的新特性，而上次Silverlight 1.0所讲过的内容没有再次重复。不过在问答环节，现在还是有一部分的听众比较关心之前Silverlight 1.0讲过的内容，例如为什么需要RIA，或者是如何实现动画等等。建议大家如果没有听过上次Silverlight 1.0的讲座，可以先看看上次的pptx，&lt;a href="http://www.cnblogs.com/cathsfz/archive/2007/11/17/962876.html"&gt;讲座资源：Silverlight In Action&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后，如果大家对活动有什么反馈信息，欢迎直接留言。&lt;/p&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1130959.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42948/" target="_blank"&gt;[新闻]微软周一开电话会议 预计将发布Silverlight2.0&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=JtgI8K"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=JtgI8K" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=s8fvKI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=s8fvKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=5mTCOi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=5mTCOi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=gcD8yI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=gcD8yI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=z1TibI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=z1TibI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=bVP1Oi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=bVP1Oi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=xJk5HI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=xJk5HI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/261053704" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/03/31/1130959.html</feedburner:origLink></item><item><title>深入理解 ASP.NET 动态控件 (Part 6 - 模板控件)</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/257773819/1122275.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Tue, 25 Mar 2008 16:39:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/03/26/1122275.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1122275.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/03/26/1122275.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1122275.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1122275.html</trackback:ping><description>&lt;p&gt;在之前的文章中，我极力推荐大家使用Repeater和MultiView这类TemplateControl，为什么呢？因为只有这样做，才算是符合MVP或MVC模式。（到底是MVP还是MVC，这视乎你选用什么呈现引擎了。）&lt;/p&gt;
&lt;p&gt;虽然我们要动态创建控件，但实际上这部分控件仍然属于View的部分，我们应该尽量采用ASPX的声明性名义来描述这些控件，避免用C#代码来创建控件、设置属性并添加为子控件。就拿最简单的例子来说，创建一个LinkButton，通常我们都需要设置它的ID、Text、OnClick属性/事件，甚至还要设置OnCommand、CommandName、CommandArgument等属性/事件，那就是大概3到5个属性了，用ASPX来声明只需要1~2行代码，而用C#代码则需要写至少5行（把new和Add()也算上的话），由此可见在定义控件这类声明上ASPX比C#代码的可读性要高。&lt;/p&gt;
&lt;p&gt;接下来，我们来研究一下TemplateControl是如何工作的，这自然要从如何编写一个TemplateControl讲起。&lt;/p&gt;
&lt;h3&gt;编写模板控件&lt;/h3&gt;
&lt;p&gt;在这里，我们假设要编写一个SimpleRepeater控件，自身不支持数据绑定，只有唯一一个名为ItemTemplate的模板，并且就按照Count属性指定的次数重复出现该模板。首先，让我们来定义这两个属性：&lt;br /&gt;
public ITemplate ItemTemplate { get; set; }&lt;br /&gt;
public int Count { get; set; }&lt;/p&gt;
&lt;p&gt;因为ItemTemplate属性不是以键值对的形式在SimpleRepeater的声明中给出的，而是以内嵌一对标签的方式定义的，因此我们需要让解释器去把&lt;strong&gt;&amp;lt;ItemTemplate&amp;gt;...&amp;lt;/ItemTemplate&amp;gt;&lt;/strong&gt;中间的内容读取出来，并把解释结果作为ItemTemplate属性的值处理。这时候，我们就需要为SimpleRepeater类加上ParseChildrenAttribute，也就是这样子：&lt;br /&gt;
&lt;strong&gt;[ParseChildren(true)] public class SimpleRepeater {...}&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最后，我们需要重载一下CreateChildControl()方法，把ItemTemplate的内容作为子控件添加到SimpleRepeater之内：&lt;br /&gt;
protected override void CreateChildControls()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; if (ItemTemplate != null)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Controls.Clear();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; Count; i++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Control control = new Control();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemTemplate.InstantiateIn(control);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Controls.Add(control);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;这段代码的用意应该是相当清晰的了，就是循环Count指定那么多次，每次循环创建一个空白的Control，用ItemTemplate.InstantiateIn()方法填充它，最后把它添加到SimpleRepeater.Controls里面，就那么简单。那么这个神秘的InstantiateIn()方法到底是干什么的呢？后面来解释。&lt;/p&gt;
&lt;h3&gt;编译模板控件&lt;/h3&gt;
&lt;p&gt;在之前的《&lt;a href="http://www.cnblogs.com/cathsfz/archive/2006/11/05/550985.html"&gt;深入理解 ASP.NET 动态控件 (Part 2 - 编译过程)&lt;/a&gt;》里面，我详细地解释了ASP.NET 2.0的编译模型。在《&lt;a href="http://www.cnblogs.com/cathsfz/archive/2008/03/24/1119465.html"&gt;深入理解 ASP.NET 动态控件 (Part 5 - 编译实验)&lt;/a&gt;》中，我们又做了一个动手实验，亲眼看到了ASPX和C#代码是如何编译到一起的。现在让我们来看看当碰上模板控件时，代码会被如何编译吧。我们把上面编写的SimpleRepeater注册到页面上，前缀为ctrl，并且编写如下一段代码：&lt;br /&gt;
&amp;lt;ctrl:SimpleRepeater ID="SimpleRepeater1" Count="10" runat="server"&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Button ID="Button1" Text="Button" runat="server" /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/ctrl:SimpleRepeater&amp;gt;&lt;/p&gt;
&lt;p&gt;然后还是用aspnet_compiler编译一下，并且用Reflector打开编译出来的dll看看。我们可以看到构造SimpleRepeater实例是通过这样一个语句完成的：&lt;br /&gt;
&lt;strong&gt;return new SimpleRepeater { ItemTemplate = new CompiledTemplateBuilder(new BuildTemplateMethod(this.__BuildControl__control1)), Count = 10 };&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个语句其实就是一个普通的new语句，并且给ItemTemplate和Count两个属性赋值了，唯一值得关注的就是ItemTemplate的值。ItemTemplate的类型是ITemplate，因此任何实现了ITemplate接口的类都可以复制给它，然而我们却从来没指定过到底要赋值什么类型的实例给它，因为这已经由ASP.NET帮我们想好了，假若我们不指定的话，那就是CompiledTemplateBuilder类型。还是熟悉的Builder模式，它只需要已委托的形式接受一个实例化ITemplate的函数，然后就能返回实例化好的ITemplate控件子树。可能你会问，既然我已经有实例化ITemplate的函数，干什么要先传给你CompiledTemplateBuilder，让你来调用一下，再把实例化好的给我？我自己实例化不好吗？在此，ASP.NET引擎的做法只是为了保持Builder模式的一致性，处处用Builder模式来分离逻辑而已。&lt;/p&gt;
&lt;p&gt;那么这个用于实例化ITemplate的函数从哪来呢？在解释器进入到&lt;strong&gt;&amp;lt;ItemTemplate&amp;gt;...&amp;lt;/ItemTemplate&amp;gt;&lt;/strong&gt;内部时，它会继续层层构建Builder模式，就如同在整个页面内执行的一样。因此，整个&lt;strong&gt;&amp;lt;ItemTemplate&amp;gt;...&amp;lt;/ItemTemplate&amp;gt;&lt;/strong&gt;会被解释器转化为一个函数，它也是通过层层调用内部函数完成自身的控件子树的构建，传递给BuilderTemplateBuilder构造函数的委托正是指向此函数。&lt;/p&gt;
&lt;p&gt;因此，模板控件里面的内容将如同模板外的内容一样，被无缝地解释和构建到一起来。&lt;/p&gt;
&lt;h3&gt;INamingContainer&lt;/h3&gt;
&lt;p&gt;如果你查看SimpleRepeater输出的HTML代码，你会发现里面有10个&lt;strong&gt;&amp;lt;input id="Button1" name="Button1" type="button" value="Button" /&amp;gt;&lt;/strong&gt;。我们都知道，重复的id是不符合标准的，因此我们需要通过INamingContainer把这个问题解决掉。因为重复的控件是ITemplate，所以应该对它加上INamingContainer，然而它的实例编译时自动使用了CompiledTemplateBuilder，我们如何把INamingContainer加上去呢？我们就只能把INamingContainer加到它的父控件上面去。此时，我们需要一个实现了INamingContainer的简单控件：&lt;br /&gt;
&lt;strong&gt;public class SimpleRepeaterItem : System.Web.UI.Control, System.Web.UI.INamingContainer {}&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后我们把SimpleRepeater.CreateChildControls()方法的这个语句：&lt;strong&gt;Control control = new Control()&lt;/strong&gt;，替换为：&lt;strong&gt;SimpleRepeaterItem control = new SimpleRepeaterItem()&lt;/strong&gt;。这样，ITemplate的容器就变成了一个具有INamingContainer接口的控件，这时候各个Button的客户端id就会自动加上其容器的id作为前缀，因为容器的服务器端ID是自动变好的，所以必然是各不相同的，这样就解决了Button客户端id相同的问题。&lt;/p&gt;
&lt;p&gt;通过这个例子，我们了解到了编写模板控件时必须为模板的容器加上INamingContainer，因为模板内的控件ID命名是可能重复的，加上INamingContainer就可以避免它们的客户端id重复。&lt;/p&gt;
&lt;h3&gt;小结&lt;/h3&gt;
&lt;p&gt;这次的文章解释了为什么我们应该尽量使用模板控件来实现动态控件，并且也说明了如何编写自己的模板控件，以及模板控件最终是被如何编译为Builder模式的代码的。&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://chinese.catchen.biz/"&gt;Cat in Chinese&lt;/a&gt; (feed: &lt;a href="http://feeds.feedburner.com/CatChen/Chinese"&gt;http://feeds.feedburner.com/CatChen/Chinese&lt;/a&gt;)  &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://dotnet.catchen.biz/"&gt;Cat in dotNET&lt;/a&gt; (feed: &lt;a href="http://feeds.feedburner.com/CatChen/dotNET"&gt;http://feeds.feedburner.com/CatChen/dotNET&lt;/a&gt;) &lt;/li&gt;
&lt;/ul&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1122275.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42947/" target="_blank"&gt;[新闻]开心网即将启用”shejiao.com”?&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=XAnIwt"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=XAnIwt" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=kvPHKI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=kvPHKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=34orEi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=34orEi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=oBSrBI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=oBSrBI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=OUBkJI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=OUBkJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=RMnfXi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=RMnfXi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=GUUu3I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=GUUu3I" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/257773819" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/03/26/1122275.html</feedburner:origLink></item><item><title>深入理解 ASP.NET 动态控件 (Part 5 - 编译实验)</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/256831946/1119465.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Mon, 24 Mar 2008 04:04:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/03/24/1119465.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1119465.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/03/24/1119465.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1119465.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1119465.html</trackback:ping><description>&lt;p&gt;这次的文章是一个小小的动手实验，你需要准备好Visual Studio 2005或者Visual Studio 2008，以及最新版本的Reflector。通过这次的实验，你将对ASPX与C#代码如何合并编译为一个dll代码有所理解。&lt;/p&gt;
&lt;p&gt;在实验开始之前，首先来一个小问题：如果不允许你使用ASPX，要你完全使用C#代码写一个具备复杂控件树的页面你会怎么写？把声明控件的代码都放在Page_Load里面吗？或者有更好的代码编写方法？先想想这个问题，然后继续往下看。&lt;/p&gt;
&lt;p&gt;实验的第一步，也就是在Visual Studio里面创建一个ASP.NET项目，并编写一个简单的ASPX页面。例如下面这个例子：（以下代码仅包括HtmlForm内的主体部分）&lt;br /&gt;
&amp;lt;asp:MultiView ID="MultiView1" runat="server"&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;asp:View ID="View1" runat="server"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;Please choose either of the followings:&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:RadioButton ID="RadioButton1" runat="server" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:RadioButton ID="RadioButton2" runat="server" /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/asp:View&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;asp:View ID="View2" runat="server"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;Please choose any of the following:&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:CheckBox ID="CheckBox1" runat="server" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:CheckBox ID="CheckBox2" runat="server" /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/asp:View&amp;gt;&lt;br /&gt;
&amp;lt;/asp:MultiView&amp;gt;&lt;/p&gt;
&lt;p&gt;在这个例子中，我们构建了一个简单的控件树，同时又不至于过于复杂，确保了编译出来的代码相对简单一些。接下来我们就需要将它编译了，最简单的手动编译方法就是用ASP.NET 2.0自带的&lt;strong&gt;aspnet_compiler.exe&lt;/strong&gt;，这个文件默认会在这个目录中：&lt;strong&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727&lt;/strong&gt;。你可以使用&lt;strong&gt;aspnet_compiler -h&lt;/strong&gt;来查看完整的帮助，例如编译一个IIS默认站点中的ASP.NET子站点可以使用这样的代码：&lt;br /&gt;
&lt;strong&gt;aspnet_compiler&amp;nbsp; -v / -p C:\inetpub\wwwroot\site C:\output\site&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;接下来，我们到输出目录的bin子目录里把dll抓到Reflector里面看看吧。你会看到这个dll里面有三个namespace，分别是-（在Reflector中代表没有namespace）、__ASP、ASP。假设你编译的站点有一个Default.aspx，那么在无namespace的类当中就会有一个_Default的类，对应的就是Default.aspx.cs编译出来的类。大家应该还记得《&lt;a href="http://www.cnblogs.com/cathsfz/archive/2006/11/05/550985.html"&gt;深入理解 ASP.NET 动态控件 (Part 2 - 编译过程)&lt;/a&gt;》里面提到的，直接继承自Page的类是用后台代码编译出来的，_Default类就是这样一个具体例子了。我们打开_Default类来看看，就会发现MultiView1已经是其成员了，为什么呢？MultiView1仅仅在ASPX中声明，没有在C#中声明啊。回头看看《深入理解 ASP.NET 动态控件 (Part 2 - 编译过程)》就能解释了这种现象——Default.aspx.cs是标记为partial的，而在你手动编辑的文件中，这是唯一一个partial，另外一个partial由编译器根据Default.aspx自动生成，编译器解释完Default.aspx后在自动生成的partial中定义了MultiView1，因此两个partial合并编译后，_Default类自然就有了MultiView1这个成员了。  &lt;/p&gt;
&lt;p&gt;接下来，我们再看看ASP这个namespace下的default_aspx类，这个是ASPX文件继承自上述_Default类后编译的结果，它完整表述了ASPX文件中整个控件树的逻辑，而不仅仅是一个包含一堆成员控件定义的Page派生类。这个类的执行入口是FrameworkInitialize()方法，它通过调用__BuildControlTree()方法来构建控件树。在这个方法里面，你可以看到&lt;strong&gt;&amp;lt;!DOCTYPE ...&amp;gt;&lt;/strong&gt;这样的字符串是被解释为LiteralControl的，LiteralControl在Render()时就会把这段文本原样输出。同时你还可以看到，它调用了另外两个方法，分别用来构建HtmlHead和HtmlForm，这两个方法通过类似的形式继续调用其他方法来构建更深层次的控件。  &lt;/p&gt;
&lt;p&gt;通过阅读default_aspx类的代码，你已经能够理解ASPX的控件树是如何转化为C#代码的了——采用的正是Builder模式。了解到这一点，这次动手试验的目的也就达到了。如果你看到文章开头的那个问题时，你已经想到了使用Builder模式，那么此时也就验证了你的想法是完全正确的。  &lt;/p&gt;
&lt;p&gt;下一次的文章将是与TemplateControl相关的，我们将继续动手做一些小实验，敬请期待。欢迎订阅我的blog：  &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://chinese.catchen.biz/"&gt;Cat in Chinese&lt;/a&gt; (feed: &lt;a href="http://feeds.feedburner.com/CatChen/Chinese"&gt;http://feeds.feedburner.com/CatChen/Chinese&lt;/a&gt;)  &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://dotnet.catchen.biz/"&gt;Cat in dotNET&lt;/a&gt; (feed: &lt;a href="http://feeds.feedburner.com/CatChen/dotNET"&gt;http://feeds.feedburner.com/CatChen/dotNET&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1119465.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42945/" target="_blank"&gt;[新闻]Google股价跌破329美元 61%员工期权价值归零&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=E0voVD"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=E0voVD" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=ksoC7I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=ksoC7I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=YUHNbi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=YUHNbi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=EjkNUI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=EjkNUI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=7u1YDI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=7u1YDI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=vd77Zi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=vd77Zi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=WfahXI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=WfahXI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/256831946" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/03/24/1119465.html</feedburner:origLink></item><item><title>在校学生找实习、找工作、了解企业情况等等等等</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/251365183/1106442.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Fri, 14 Mar 2008 12:17:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/03/14/1106442.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1106442.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/03/14/1106442.html#Feedback</comments><slash:comments>53</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1106442.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1106442.html</trackback:ping><description>&lt;p&gt;因为时不时就有低年级的同学跑来问我这类问题，所以我干脆写篇文章好了。&lt;/p&gt;
&lt;h3&gt;信息获取&lt;/h3&gt;
&lt;p&gt;最先想到的，也是最重要的，是你想干什么，而不是你父母想你去干什么，或者哪个赚钱之类的。在计算机系里面，你总能碰到一些对这个行业没什么感觉的人，他们会说当年填报志愿的时候根本没什么喜欢不喜欢可言，于是在父母驱使下或者金钱诱惑下就报了计算机系。显然你不想犯这类错误，因此第一步是弄清楚你想要什么，或者说，有什么是你可以选择不要的。世界上没有十全十美的事情，所以一切都是权衡取舍（trade off），这个思想贯穿着计算机体系设计的方方面面，缺乏这种思想肯定会导致你在这个行业里发展受到限制，所以首先你要想好的就是你将来的职业发展取什么而舍什么。&lt;/p&gt;
&lt;p&gt;在你先清晰了解自己之后，才有如何了解企业实际情况的问题。如果说第一个问题严重依赖于你个人悟性的话，那么第二个问题就依赖于你的人脉了，至少是你的外向程度和活跃程度。&lt;/p&gt;
&lt;p&gt;一个企业，其自身对外的公关肯定只会说好话，就算没有任何夸张成分，也不会让你看到这个企业内部任何的不足。因此，如果你需要知道一些细节，看看这企业是否如你想象中那么好，你就必须认识在这家企业里面的员工，通过他们好好了解一下。如果你是一个在学校里已经很活跃的学生，整天在BBS上板聊，或者参加各种学生社团的活动，那么你肯定有机会认识到不少比你高一两个年级的同学，看看他们里面有没有一些正好在你想去的企业工作的，联系他们了解一下企业的情况，例如工资和各种福利怎么算啊，工作与学习的氛围如何啊，以及他们是否也认为你适合这个企业。&lt;/p&gt;
&lt;p&gt;如果有机会多问几个人的话，最好都问问，并且以人生经历和价值取向与你相近的人的说法为主要参考。这是因为，在同一家企业里面，不同的员工看到它不同的方面，并且都带有自己的主观想法，因此得出的评价可能截然不同。这就好像假如你问我北京是否好住，我肯定说不好住，因为我看重的是商业环境，我觉得北京的服务业经常让我失望，因此就这样说。但肯定也有人很喜欢住北京的，他看重其他一些因素，并且觉得我看重的那些因素可以忽略不计。如果你确实很想去一家企业，就应该多找几个员工了解情况，特别是头脑清晰能看清楚自己所在企业优劣势的人。如果你碰到一个已经被洗脑的员工，那么问什么也没用，反正他就只能帮你洗脑&amp;#8230;&amp;#8230;&lt;/p&gt;
&lt;h3&gt;联系途径&lt;/h3&gt;
&lt;p&gt;根据往年的经验，现在正是2009年毕业的学生找实习的时候，甚至有2010年毕业的学生也提前开始找实习了。积极的人肯定早已开始四处打听消息，包括各大公司招聘什么实习职位，往年难度如何，转正比例多少，等等。在这里，我就要&amp;#8220;曝光&amp;#8221;我身边的一些朋友了，大家不要怪我&amp;#8220;出卖&amp;#8221;朋友了哦，因为谁都知道成功把有才华的人推荐给自己公司的意义所在。&lt;/p&gt;
&lt;p&gt;在这里，我主要说的是BGM（Baidu、Google、Microsoft的意思，不是background music），如果你对其他IT企业有兴趣的话，也可以找我帮忙，只要我认识该企业的人，我会充当一下&amp;#8220;路由&amp;#8221;的角色为你&amp;#8220;尽力服务&amp;#8221;的。&lt;/p&gt;
&lt;h4&gt;Baidu&lt;/h4&gt;
&lt;p&gt;如果分别把BGM比作人的话，Baidu是一个典型的中国年轻人，一点都不张扬。就如同在中国随手抓一个ASP.NET MVP问他，&amp;#8220;你是不是很熟悉页面生命周期&amp;#8221;，他可能回答道，&amp;#8220;懂一点吧，有什么问题你先说说看。&amp;#8221;虽然从资源（resources）的级别来说，Baidu是很难和Google、Microsoft去比的，但是开放程度（openness）还是是相当高的，你可以做自己喜欢做的项目，可以获取到项目所需的资源。&lt;/p&gt;
&lt;p&gt;想去Baidu的可以找我，或者&lt;a href="http://hi.baidu.com/pudding"&gt;布丁&lt;/a&gt;，先了解一下。当然，如果你来找我的话，最好你也能说服我为什么值得推荐你。我主要做Web前端开发的，而布丁则是做后端开发的，所以如果你想申请这两个方面的职位，可以直接找我们了解Baidu现在所采用的技术或者流程。如果是其他职位，也可以帮你联系其他同事问问。完整的实习职位列表，请看&lt;a href="http://hr.baidu.com/intern.php"&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;h4&gt;Google&lt;/h4&gt;
&lt;p&gt;Google是一个典型的美国年轻人，你不问他也会很主动地把他的优势展示给你看。在我看来，Google最大的诱惑不在于公司内的&amp;#8220;饮食娱乐&amp;#8221;项目（虽然这些也很吸引），而是作为一般的中国员工也可以随便跑到美国总部去，顺道参加美国举行的一些会议或者讲座。看看&lt;a href="http://blog.wangjunyu.net"&gt;Junyu&lt;/a&gt;同学就跑到Austin去开&lt;a href="http://sxsw.com"&gt;SXSW&lt;/a&gt;了。&lt;/p&gt;
&lt;p&gt;如果想去Google的话，去找Junyu问问吧。别告诉我找不到他的联系方式，我通常只链接别人的blog，因为该URL就是个人的标识（即使抛开OpenID不谈），拿着这个URL你手上就已经掌握了搜索他联系方式的一切资料。Junyu喜欢把人拐卖进Google里，想了解招聘职位什么的，找他就好了。&lt;/p&gt;
&lt;h4&gt;Microsoft&lt;/h4&gt;
&lt;p&gt;Microsoft是个稳重的美国中年男人，Google所晒的东西，Microsoft会暗自想着&amp;#8220;我当年又不是没晒过，现在我已经不屑于晒了&amp;#8221;。很成熟的流程，健全的管理体制，都很好地说明了这一点。&lt;/p&gt;
&lt;p&gt;貌似我没有很熟的朋友在Microsoft，不算太熟那些又不敢晒出来，所以想找人推荐的话还是联系我，然后我再帮你联系吧。想了解的话，可以找&lt;a href="http://jeffreyzhao.cnblogs.com"&gt;Jeffrey&lt;/a&gt;或者&lt;a href="http://dflying.cnblogs.com"&gt;Dflying&lt;/a&gt;这两位老员工加现任MVP，他们现在不再是员工了，可能观点会更加客观一些。&lt;/p&gt;
&lt;h3&gt;其他事情&lt;/h3&gt;
&lt;p&gt;据我所知，很多人也是准备找实习了，才想到要写简历的。这是一项需要创意的工作，在此我提供&lt;a href="http://catchen.biz/"&gt;我的简历&lt;/a&gt;和&lt;a href="http://www.wangjunyu.net/"&gt;Junyu的简历&lt;/a&gt;给大家作为参考。虽然我们的网站下方都写着&lt;a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;Creative Commons License&lt;/a&gt;，不过不建议你直接使用别人设计好的模板。特别是，假如你想申请Web Developer/Designer类别的职位的话，你可不能够错过这个机会好好展示你的设计风格和编码艺术。&lt;/p&gt;
&lt;p&gt;最后，祝大家在08年里都能找到自己喜欢的工作学习环境，好好享受生活。&lt;/p&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1106442.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42944/" target="_blank"&gt;[新闻]十年祭:昔日明星软件今何在?&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=wCcPAn"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=wCcPAn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=x6EvyJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=x6EvyJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=EmxOwj"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=EmxOwj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=pDmksJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=pDmksJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=5d8cjJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=5d8cjJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=okjCTj"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=okjCTj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=1s0p8J"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=1s0p8J" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/251365183" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/03/14/1106442.html</feedburner:origLink></item><item><title>使用 .NET 实现 Ajax 长连接 (Part 2 - Mutex Wait &amp; Signal)</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/247834575/1096654.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Sat, 08 Mar 2008 09:21:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/03/08/1096654.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1096654.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/03/08/1096654.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1096654.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1096654.html</trackback:ping><description>&lt;p&gt;在上一次的文章中，我们说到了如何设计一个ASP.NET Web Service来处理长连接请求。很多人对此就提出了问题，如何hold住请求让它30秒不断开了？这其实很简单，只需要Sleep()一下就可以了：&lt;/p&gt;
&lt;blockquote&gt;&lt;strong&gt;
&lt;p&gt;Thread.Sleep(30 * 1000);&lt;/p&gt;
&lt;/strong&gt;&lt;/blockquote&gt;
&lt;p&gt;然而问题是，我们不是要等30秒然后看看是否有事件需要返回，而是在这30秒内随时有事件随时返回。因此，我们需要一套机制来在等待的过程中检查是否有事件发生了。&lt;/p&gt;
&lt;h3&gt;Monitor模型&lt;/h3&gt;
&lt;p&gt;在.NET里面，大家最熟悉的线程同步模型应该就是Monitor模型了。没听说过？就是C#的那个lock关键字，实际上它编译出来就是一对Monitor.Enter()和Monitor.Exit()。&lt;/p&gt;
&lt;p&gt;通过lock命令，我们可以针对一个对象创建一个临界区，代码执行到临界区入口时必须获取到该对象的锁才能执行下去，并且在临界区的出口释放该锁。然而这种模型不太适用于解决我们的问题，因为我们需要等待一个事件，如果使用lock来等待的话，那就是说要先在Web Service外部把对象锁上，然后等事件触发了就解锁，这时候Web Service才顺利进入临界区域。&lt;/p&gt;
&lt;p&gt;事实上，要进行这类型的阻塞，还有一个更好的选择，那就是Mutex。&lt;/p&gt;
&lt;h3&gt;Mutex模型&lt;/h3&gt;
&lt;p&gt;Mutex，也就是mutual exclusive的缩写，&amp;#8220;互斥&amp;#8221;的意思。Mutex是如何运作的？这有点像是银行的排队叫号系统，所有等待服务的人都坐在大厅里等候（wait）被叫，当一个服务窗口空闲时它就会发出一个信号（signal）来通知下一位等候服务的人。总之，所有执行wait指令的线程都在等候，而每一个signal能够让一个线程结束等候继续执行。&lt;/p&gt;
&lt;p&gt;在.NET里面，wait和signal这两个操作分别对应Mutex.WaitOne()和Mutex.ReleaseMutex()这两个方法。我们可以让Web Service的线程使用Mutex.WaitOne()进入等候状态，而在事件发生时使用Mutex.ReleaseMutex()来通知Web Service线程。因为必须在Mutex.ReleaseMutex()发生后Mutex.WaitOne()才可能继续执行下去，因此能够执行下去就证明必然有事件发生了并且调用了Mutex.ReleaseMutext()，这时候就可以放心地去读取事件消息了。&lt;/p&gt;
&lt;h3&gt;简单示例&lt;/h3&gt;
&lt;p&gt;在选定使用Mutex模型后，我们来编写一个简单的示例。首先，我们要在WebService派生类内定义一个Mutex，还有一个代表消息的字符串。&lt;/p&gt;
&lt;blockquote&gt;&lt;strong&gt;
&lt;p&gt;Mutex mutex = new Mutex();&lt;br /&gt;
string message;&lt;/p&gt;
&lt;/strong&gt;&lt;/blockquote&gt;
&lt;p&gt;然后，我们定义两个WebMethod。为了把问题简单化，我们选用上一篇文章中开头所说的两个函数签名，也就说只能在一个Web Service内自己发自己收，没有发送目标的概念，也没有超时的概念，还没有可靠性设计。同时，我们将Message类型替换为普通字符串，以便于我们测试。&lt;/p&gt;
&lt;p&gt;我们先编写发送消息的函数：&lt;/p&gt;
&lt;blockquote&gt;&lt;strong&gt;
&lt;p&gt;public void Send(string message) {&lt;br /&gt;
&amp;nbsp; this.message = message;&lt;br /&gt;
&amp;nbsp; this.mutex.ReleaseMutex();&lt;br /&gt;
}&lt;br /&gt;
&lt;/p&gt;
&lt;/strong&gt;&lt;/blockquote&gt;
&lt;p&gt;在这个发送函数里，首先我们把消息放进了类内全局的变量中，然后让全局的Mutex类释放一个signal。这时候，如果有线程在等待，它可以马上执行下去。如果此时没有线程在等待，那么下一个wait的线程执行到该阻塞的地方就能够不受阻塞继续执行下去。&lt;/p&gt;
&lt;p&gt;现在我们来编写接收消息的函数：&lt;/p&gt;
&lt;blockquote&gt;&lt;strong&gt;
&lt;p&gt;public string Wait() {&lt;br /&gt;
&amp;nbsp; this.mutex.WaitOne();&lt;br /&gt;
&amp;nbsp; return this.message;&lt;br /&gt;
}&lt;br /&gt;
&lt;/p&gt;
&lt;/strong&gt;&lt;/blockquote&gt;
&lt;p&gt;接收函数一开始就进入wait状态。在得到signal后，需要做的事情就是把全局的消息返回给客户端。&lt;/p&gt;
&lt;h3&gt;亲身体验&lt;/h3&gt;
&lt;p&gt;最后，我们可以通过ASP.NET Web Service本身支持的Web测试界面来测试一下我们的代码。我们开两个浏览器窗口，一个进入Send()调用，一个进入Wait()调用。然后我们按照如下方法来测试：&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;首先执行Send("Hello")，然后执行Wait()。这时候你可以马上看到"Hello"。  &lt;/li&gt;
    &lt;li&gt;首先执行Wait()，让它等待返回，这时候执行Send("Hello")。随后你可以看到Wait()那段返回"Hello"了。  &lt;/li&gt;
    &lt;li&gt;按如下顺序执行：Send("Hello");Wait();Send("World");Wait();  &lt;/li&gt;
    &lt;li&gt;按如下顺序执行：Send("Hello");Send("World");Wait();Wait();  &lt;/li&gt;
    &lt;li&gt;按如下顺序执行：Wait();Wait();Send("Hello");Send("World");  &lt;/li&gt;
    &lt;li&gt;按如下顺序执行：Wait();Send("Hello");Wait();Send("World");&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;你会发现这样一些奇怪的结果：第3个测试返回的是"World"和"World"。第5个测试先返回"Hello"的并不一定是先执行的那个Wait()线程。后者在某些情况下不是什么问题，特别是长连接中一般之后一个Wait()线程在等待中，所以我们可以不管。而前者，则是因为没有消息队列所造成的，我们只有长度为1的消息窗口，所以只能缓存最后一个消息。这个问题我们将在下一篇文章中解决。&lt;/p&gt;
&lt;h3&gt;小结&lt;/h3&gt;
&lt;p&gt;在本文中，我们看到了不同的线程同步模型的差异。Monitor模型的lock本质上是一个Semaphore，也就是一个不能连续signal的Mutex，一个signal发出去后必须被一个wait接收了才能进行下一次的signal。同时，Semaphore也限制了signal和wait必须在同一个线程内成对执行，而Mutex则没有此限制。虽然.NET是针对Monitor模型优化的，但在我们的需求当中，只能通过Mutex模型来解决。&lt;/p&gt;
&lt;p&gt;接着，我们便写了一个小小的消协发送与接收函数，实现了我们想要的阻塞式Web Service。同时我们也看到了没有消息队列造成的问题，因此确定接下来我们要做一个消息队列。如果你想知道消息队列如何编写，欢迎订阅我的blog：&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://chinese.catchen.biz"&gt;Cat in Chinese&lt;/a&gt; (&lt;a href="http://feeds.feedburner.com/catchen/chinese"&gt;feed&lt;/a&gt;)  &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://dotnet.catchen.biz"&gt;Cat in dotNET&lt;/a&gt; (&lt;a href="http://feeds.feedburner.com/catchen/dotnet"&gt;feed&lt;/a&gt;) &lt;/li&gt;
&lt;/ul&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1096654.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42943/" target="_blank"&gt;[新闻]六大可能出售IT企业名单：SUN领头或被猎走&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=q7G7eW"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=q7G7eW" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=uDWDPI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=uDWDPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=Y7BCri"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=Y7BCri" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=oBSLZI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=oBSLZI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=OzYKcI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=OzYKcI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=I4qnsi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=I4qnsi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=mvCdTI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=mvCdTI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/247834575" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/03/08/1096654.html</feedburner:origLink></item><item><title>使用 .NET 实现 Ajax 长连接 (Part 1 - Comet Web Service)</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/241398093/1082668.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Tue, 26 Feb 2008 09:49:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/02/26/1082668.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1082668.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/02/26/1082668.html#Feedback</comments><slash:comments>33</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1082668.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1082668.html</trackback:ping><description>&lt;p&gt;Ajax的长连接，或者有些人所说的Comet，就是指以XMLHttpRequest的方式连接服务器，连接后服务器并非即时写入相应并返回。服务器会保持连接并等待一个需要通知客户端的事件，该事件发生后马上将数据写入响应，这时候客户端就以相当&amp;#8220;实时&amp;#8221;的方式接收到事件通知。具体的通信模型，请参考这篇文章：《&lt;a href="http://www.ibm.com/developerworks/cn/web/wa-lo-comet/"&gt;Comet：基于 HTTP 长连接的&amp;#8220;服务器推&amp;#8221;技术&lt;/a&gt;》，里面已经说得非常详细了，我就不再复述了。&lt;/p&gt;
&lt;p&gt;我们接着开始讨论如何使用.NET实现这个模型。首先我们能想到的是，我们需要一个Web Service，可以是ASP.NET Web Service，也可以是WCF Web Service，ASP.NET AJAX Library两者都支持。在这里，为了简单起见，就选择大家更熟悉的ASP.NET Web Service举例。然后，我们写下以下两个函数签名：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;public void Send(Message message);&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;public Message Wait();&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其中，Send函数用来发送一个Message对象，而Wait函数用来等待一个Message对象。然后，让我们来讨论一些细节问题。&lt;/p&gt;
&lt;h3&gt;无事件导致超时&lt;/h3&gt;
&lt;p&gt;首先，长期保持连接时不行的。对于服务器和客户端来说，这不是个问题，但我们永远都要记住中间可能存在各式各样配置怪异的网关和代理，它们上面可能有各式各样的超时规则，因此Comet最好设计为定期重连。一般情况下，如果30秒没有任何事件发生，服务器端就应该通知客户端确实没有事件发生，结束掉本次请求，然后重新开始一次新的请求以便继续等待。&lt;/p&gt;
&lt;p&gt;那么上述函数签名可否用来返回一个无事件的消息呢？这是显然可以的，我们可以选择返回null表示无事件，或者返回一个EmptyMessage常量，这视乎我们使用class还是struct来定义Message。（甚至，我们还可以做一个名为NoMessageMessage的Message派生类来做这个事情。）&lt;/p&gt;
&lt;h3&gt;定义发送目标&lt;/h3&gt;
&lt;p&gt;上述函数签名确实能用来收发消息，但是没指名发给谁。可能有人会说，发送给谁可以在Message类里面通过一个属性来定义啊。但是Wait()方法没有说明接受方是谁，服务器端依然不知道哪些消息应该让你接收。&lt;/p&gt;
&lt;p&gt;因此，我们引入Channel的概念，Channel使用其名称来标识，相同名称的就必然是同一个Channel。在发送与接受时，通过名称指定要发送到哪个Channel，这样问题就解决了。此时，函数签名修改如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;public void Send(string channelName, Message message);&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;public Message Wait(string channelName);&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;可靠的消息队列&lt;/h3&gt;
&lt;p&gt;想象一个可能发生的情况，服务器端向你发送一个消息，你没有成功接收，但是服务器端认为发送了就成功了，消息从队列删除了，然后这个消息就永久丢失掉了。可能有人会强调TCP多么可靠，服务器端发送的消息如果在TCP的层面发生问题了，肯定会引发Socket级别的Exception，这个Exception冒泡上来，服务器端就能截获，从而得知发送失败，然后先不删除队首消息。可是别忘了，中间是可能存在代理的，如果代理成功把消息收回去了，可是代理发送到客户端这一步失败了，服务器端就不一定会发生异常了。&lt;/p&gt;
&lt;p&gt;因此，我们需要制定一种策略，来确保下行消息总能发送到客户端。在这里，我们选择了引入逐个ACK的机制，来确认消息的接收。也就是说，服务器端发送给客户端的消息带有一个序号，在客户端收到消息后就将该序号发回给服务器端，已确认它受到了该消息。这时候，函数签名更改如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;public int Send(string channelName, Message message);&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;public Message Wait(string channelName, int sequence);&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们使用Wait()接收到的Message中，应该有一个Sequence的属性，标记它的序号。然后，再我们执行下一次Wait()时就将该序号加1的值通过sequence参数传递回去，让服务器知道我们期望下一条消息的编号是这个。例如我们收到Message，其Sequence属性为836，那么下一次调用Wait()的时候就传给服务器837。服务器端此时应该保留了编号为836的Message在对首，如果客户端继续请求836号消息，证明它上次没收到，这次仍然发送836号消息给它；如果客户端请求837号消息，证明它成功收到836号消息的，这次就发送837号消息给它。&lt;/p&gt;
&lt;p&gt;如果都不是，那该怎么办？那意味着，这是一个错误的请求，甚至可能是攻击请求，因为正常情况下不应该出现这样的请求的，服务器端可以考虑抛个无关紧要的Exception（不要告诉攻击者你知道他在攻击了），甚至直接给个400 （bad request）的响应代号。&lt;/p&gt;
&lt;p&gt;与Wait()类似的，Send()也可以加入ACK机制，只需要将返回类型从void改为int就可以了，这个值就专门用于传递消息编号，实现方式和Wait()是一样的，不过Send()是由客户端保存待发送消息的队列。&lt;/p&gt;
&lt;h3&gt;小结&lt;/h3&gt;
&lt;p&gt;到此为止。我们的Web Service就写好了。这就写好了？只有签名没有函数体？是的，复杂的工作留给model去做，Web Service在这里只是相当于一个view，用于将model的接口暴露出来。&lt;/p&gt;
&lt;p&gt;在下一次的文章中，我们将开始讨论如何实现服务器端的消息传递机制。如果你对本文章系列感兴趣的话，欢迎订阅我的blog：&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://chinese.catchen.biz"&gt;Cat in Chinese&lt;/a&gt; (&lt;a href="http://feeds.feedburner.com/catchen/chinese"&gt;feed&lt;/a&gt;)  &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://dotnet.catchen.biz"&gt;Cat in dotNET&lt;/a&gt; (&lt;a href="http://feeds.feedburner.com/catchen/dotnet"&gt;feed&lt;/a&gt;) &lt;/li&gt;
&lt;/ul&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1082668.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42942/" target="_blank"&gt;[新闻]Linux内核2.6.27正式到来&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=SWEMHr"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=SWEMHr" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=WDyb4I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=WDyb4I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=cLq4Di"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=cLq4Di" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=ERZt0I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=ERZt0I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=8mMW6I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=8mMW6I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=09ixJi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=09ixJi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=awcKeI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=awcKeI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/241398093" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/02/26/1082668.html</feedburner:origLink></item><item><title>Windows 就是一个带 UI 的命令行</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/214403116/1034226.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Thu, 10 Jan 2008 13:22:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/01/10/1034226.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1034226.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/01/10/1034226.html#Feedback</comments><slash:comments>125</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1034226.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1034226.html</trackback:ping><description>&lt;p&gt;这是用过Mac之后对Windows的感觉。&lt;/p&gt;
&lt;p&gt;用一个对程序员来说比较友善的比喻来说，以面向过程的方式来写一大堆函数，然后再分别塞到几个类里面，这就是Windows了。而Mac是真正的面向对象思想下设计的。&lt;/p&gt;
&lt;p&gt;在Windows当中，我们貌似在操作一个&amp;#8220;文档&amp;#8221;、一段&amp;#8220;文本&amp;#8221;、一张&amp;#8220;图片&amp;#8221;，但实际上我们都不是在操作对象本身，而是类似于在操作handle——你不知道对象在哪里，你不能直接传递或操作对象，你只能借助仅有的API对handle进行操作，所有能对handle进行的操作都由API限制了。例如即使你在操作的是一张&amp;#8220;图片&amp;#8221;，你也很清楚那是一个存放为文件的图片，或者暂存在剪贴板的图片，总之你必须清楚handle在哪，否则你就算看到了那张图片也无法操作——图片在网站上，你先另存或者复制到剪贴板吧。&lt;/p&gt;
&lt;p&gt;这种体验不就完全是面向过程的映射？每一个操作相当于调用一个或几个API。Windows发展了那么久，在人机交互方面还是脱离不了对DOS的简单封装。在这方面，Windows从前落后于Mac，现在还是这样。Mac虽然不能达到最理想的面向对象操作方式，但至少系统本身提供的体验要比Windows好，同时主流软件也比Windows的主流软件在体验上要好一个等次。&lt;/p&gt;
&lt;p&gt;例如&lt;a href="http://skitch.com/"&gt;Skitch&lt;/a&gt;这个轻量级的图片处理软件，你可以抓起正在编辑的图片扔到桌面上，这就自动另存为一个图片文件了。文件与内存中的图片数据对用户来说已经无缝连接起来了。&lt;/p&gt;
&lt;p&gt;再举一个例子，在Windows我们都知道回收站是个很好的比喻，不用的文件当然扔那里面。不过说真的，你多少次把文件扔里面了？你用得更多的是delete按钮，对吧？这是显然的，因为Windows用户习惯最大化窗口，这当然就把回收站遮住了，傻瓜才会选择在窗口里拖动文件的同时回到桌面接着再把文件扔到回收站里。Mac的回收站叫做废纸瘘，它出现在Dock上，Dock类似于Windows的任务栏，永远不会消失，就算自动隐藏也可以在鼠标靠近后自动跳出来，因此你永远可以把你看到的不想要的东西拖到废纸瘘上面去。&lt;/p&gt;
&lt;p&gt;这也说明了一个问题，Microsoft这样去仿造Apple发明的交互方式是没用的，因为一点点的差异就可能导致可用性完全不同。Windows Mobile 7泄露的文档中，透露了Windows Mobile 7将可能有一些类似iPhone + Wiimote的功能，例如用手指拨动CD封面从而跳到下一张或上一张CD，甚至晃动手机从而跳到随机抽选的一张CD，这样的交互到底是否好用，真的很难说。&lt;/p&gt;
&lt;p&gt;最后，无论你在开发Windows应用还是Web应用，我都建议你去弄个Mac来用一段时间吧，不要给一直以来Windows及Windows主流应用程序的交互设计方式禁锢了你的思路，你应该看一点新鲜点的东西。在以前，我认为Scriptaculous的拖放库完全是多余的，真该好像Atlas转变为ASP.NET AJAX时那样把拖放库丢一边，但在使用Mac之后，我才真正觉得在Web应用中推广拖放操作是非常有意义的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;这篇文章只是讨论交互，关于Win vs Mac的问
题，可以参考这篇文章：&lt;a href="http://huajun.w18.net/2007/12/mac-os-x.html"&gt;我
为什么偏爱苹果电脑和Mac OS X&lt;/a&gt;，里面强调了Mac设计的哲学──&amp;#8220;简单&amp;#8221;。
&lt;/p&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1034226.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42941/" target="_blank"&gt;[新闻]《星际争霸2》一分为三 各种族依次登场&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=AHMkxm"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=AHMkxm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=JgjkQI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=JgjkQI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=yarhLi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=yarhLi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=lAJepI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=lAJepI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=xrak4I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=xrak4I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=dFN0ti"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=dFN0ti" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=r5yTeI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=r5yTeI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/214403116" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/01/10/1034226.html</feedburner:origLink></item><item><title>编写 iPhone Friendly 的 Web 应用程序 (Part 6 - iUI)</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/212566956/1029500.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Mon, 07 Jan 2008 13:01:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/01/07/1029500.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1029500.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/01/07/1029500.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1029500.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1029500.html</trackback:ping><description>&lt;p&gt;&lt;a href="http://code.google.com/p/iui/"&gt;iUI&lt;/a&gt;是一个针对iPhone Safari的Web开发框架，由&lt;a href="http://joehewitt.com/"&gt;Joe Hewitt&lt;/a&gt;开发。这位Joe Hewitt曾经参与过Firefox的开发，包括其中的DOM Inspector以及Firebug，后来到了Facebook，为Facebook开发了iPhone专用版本，对iPhone Web开发社区算是作出了巨大贡献。&lt;/p&gt;
&lt;h3&gt;样式&lt;/h3&gt;
&lt;p&gt;我们继续说iUI这个框架。这个框架所做的事情，就是提供iPhone Friendly的交互方式与样式。为了简单起见，我们先来说说样式方面，iUI提供的不仅仅是一个CSS文件，基于这个CSS文件你所创建的页面能够符合iPhone的人机界面指引，并且看起来的效果贴近iPhone原生的应用程序，从而降低用户学习门槛，避免你自己设计的Web应用对iPhone操作不友善（例如按钮不够大，手指难以点击）。&lt;/p&gt;
&lt;h3&gt;交互&lt;/h3&gt;
&lt;p&gt;至于交互方面，iUI提供一个基于page的换页导航机制。这里所说的page不是一个Web页面，而是一个&amp;lt;body /&amp;gt;内的顶级DOM元素，每一个这样的DOM元素都可以作为一个page，同一时间上仅显示一个page。页面上的所有链接，要么导致page转跳，要么导致整个页面转跳。这种转跳有如下几种情况。&lt;/p&gt;
&lt;h4&gt;转跳&lt;/h4&gt;
&lt;p&gt;如果链接的href指向的是一个锚点，例如&lt;strong&gt;#somePage&lt;/strong&gt;，那么iUI就会在页面中寻找&lt;strong&gt;id="somePage"&lt;/strong&gt;的page对象，然后进行转跳。&lt;/p&gt;
&lt;p&gt;如果链接的href指向的是站内地址，例如&lt;strong&gt;/somePage.html&lt;/strong&gt;，那么iUI就会使用AJAX的方法加载&lt;strong&gt;/somePage.html&lt;/strong&gt;的内容并追加到&lt;strong&gt;&amp;lt;body /&amp;gt;&lt;/strong&gt;内，注意，&lt;strong&gt;/somePage.html&lt;/strong&gt;必然是一个文档片段而不可能是完整的XHTML文档，否则把&lt;strong&gt;&amp;lt;html /&amp;gt;&lt;/strong&gt;追加到&lt;strong&gt;&amp;lt;body /&amp;gt;&lt;/strong&gt;下就是错误的了。追加的内容内可以有多个page，如果其中一个有&lt;strong&gt;selected="true"&lt;/strong&gt;的属性，那么接下来将显示该page，否则显示追加内容中的第一个page。&lt;/p&gt;
&lt;p&gt;最后一种情况是指向站内地址，但是有&lt;strong&gt;target="_replace"&lt;/strong&gt;属性。iUI在看到&lt;strong&gt;target="_replace"&lt;/strong&gt;属性后，就会知道该&amp;lt;a /&amp;gt;所在的page内直属元素要被删除，并且替换为目标页面的内容。在这里用CSS来解释一下所谓的直属元素，&lt;strong&gt;body &amp;gt; ul#somePage &amp;gt; li &amp;gt; a[target="_replace"]&lt;/strong&gt;，这里&lt;strong&gt;&amp;lt;li /&amp;gt;&lt;/strong&gt;就是&lt;strong&gt;&amp;lt;ul id="somePage /&amp;gt;&lt;/strong&gt;的直属元素了。这种转跳通常用于曾亮加载，例如iPhone内置的Mail打开邮箱后自动加载50封邮件，点击more之后再加载50封，Web界面上就可以通过这种方式实现——一个&lt;strong&gt;&amp;lt;ul /&amp;gt;&lt;/strong&gt;内包含51个&lt;strong&gt;&amp;lt;li /&amp;gt;&lt;/strong&gt;，前面50个对应50封邮件，最后一个&lt;strong&gt;&amp;lt;li /&amp;gt;&lt;/strong&gt;包含&lt;strong&gt;&amp;lt;a target="_replace" /&amp;gt;&lt;/strong&gt;的more链接，目标页面就是下50封邮件的&lt;strong&gt;&amp;lt;li /&amp;gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在转跳的时候，iUI提供了一种很好看的效果，你能够看到当前page从屏幕左边移出去，新的page从屏幕右边移进来，好像PowerPoint的某种幻灯片切换动画那样。如果添加了&lt;strong&gt;axis="y"&lt;/strong&gt;属性，page还能够子底向下滚动。&lt;/p&gt;
&lt;h4&gt;历史记录&lt;/h4&gt;
&lt;p&gt;AJAX式的页内内容更新不是不好，问题就在于浏览器无法自动保存历史记录，导致前进后退按钮实效。iUI已经解决了这个问题，上述3种转跳中的前两种iUI都会自动创建新的hash以便创建历史记录，hash默认就是&lt;strong&gt;#_pageId&lt;/strong&gt;的形式，如果当前显示的page没有id，那么hash就按照增量自动分配id。&lt;/p&gt;
&lt;p&gt;在拥有历史记录之后，用户就可以通过浏览器的后退按钮向前翻页了，此时相当于加载前面的page，iUI知道这是一个后退操作，就会提供反向的滚动效果（自左向右或自上向下）。&lt;/p&gt;
&lt;p&gt;如果我访问页面的顺序是A &amp;gt; B &amp;gt; C &amp;gt; D &amp;gt; B，那么历史记录会如何呢？历史记录会变成A &amp;gt; C &amp;gt; D &amp;gt; B，也就是说第一次访问B时B从历史记录中删除并重新添加到最前的位置了。&lt;/p&gt;
&lt;h3&gt;演示&lt;/h3&gt;
&lt;p&gt;说了那么多，我们来看看iUI的实战效果吧！又是Facebook或者Digg的iPhone版？不是，我们来看看自己利用iUI开发一个小应用的效果以及成本如何。就在上个周末，我花了不到20小时做了个名为iBaidu的小东西，自动抓取Baidu的搜索结果与排行榜并以iPhone friendly的方式显示出来。以下是发布到YouTube的演示视频：&lt;/p&gt;
&lt;p&gt;&lt;embed src="http://www.youtube.com/v/57kRVyP0-_k&amp;amp;rel=1" width="425" height="355" type="application/x-shockwave-flash" wmode="transparent"&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;p&gt;服务器端使用的技术是Ruby on Rails以及ASP.NET。为什么需要ASP.NET？这是一个很郁闷的问题，因为Baidu是基于GBK的，而RoR的编码转换能力其若无比，我懒得花时间去寻找适合的转码库，因此直接拿了ASP.NET来做抓去代理，抓取的时候顺便做一下编码转换。如果不是编码问题，那么只需要RoR就能轻松完成任务。&lt;/p&gt;
&lt;h3&gt;小结&lt;/h3&gt;
&lt;p&gt;在这篇文章中，我们已经看到了如果使用RoR搭配Prototype，不好意思，iUI才对，要设计一个iPhone friendly的Web应用程序是多么地容易，开发过程也相当敏捷。如果你喜欢iPhone开发系列的文章，欢迎订阅：&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://chinese.catchen.biz"&gt;Cat in Chinese&lt;/a&gt; (&lt;a href="http://feeds.feedburner.com/catchen/chinese"&gt;feed&lt;/a&gt;)&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://dotnet.catchen.biz"&gt;Cat in dotNET&lt;/a&gt; (&lt;a href="http://feeds.feedburner.com/catchen/dotnet"&gt;feed&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1029500.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42940/" target="_blank"&gt;[新闻]IBM花300万美元打造互联网三维虚拟紫禁城&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=Ue4AJW"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=Ue4AJW" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=57cI5I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=57cI5I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=3ASUei"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=3ASUei" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=51weKI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=51weKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=nV7mAI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=nV7mAI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=e3UpOi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=e3UpOi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=ZVWa2I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=ZVWa2I" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/212566956" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/01/07/1029500.html</feedburner:origLink></item><item><title>MVP on dot NET - Episode 1</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/212345802/1028568.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Mon, 07 Jan 2008 03:38:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/01/07/1028568.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1028568.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/01/07/1028568.html#Feedback</comments><slash:comments>34</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1028568.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1028568.html</trackback:ping><description>&lt;p&gt;主持：&lt;a href="http://www.beanpeng.com"&gt;Bean&lt;/a&gt;、&lt;a href="http://jeffreyzhao.cnblogs.com"&gt;Jeffrey&lt;/a&gt;、&lt;a href="http://dotnet.catchen.biz"&gt;Cat&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;根据&lt;a href="http://blogs.pcworld.com/techlog/archives/006130.html"&gt;PC World&lt;/a&gt;的统计，2007年IE7与FF的增长相当，这意味着从IE6转分别转到IE7与FF的比例为50/50。&lt;/li&gt;
    &lt;li&gt;Mac效果般的Lightbox效果 - 来自&lt;a href="http://www.panic.com/candybar/"&gt;CandyBar&lt;/a&gt;软件首页（留意页面底部的软件截图）&lt;/li&gt;
    &lt;li&gt;纯粹用C#编写的&lt;a href="http://osnews.com/story.php/19100/SharpOS-Releases-First-Milestone"&gt;SharpOS发布了第一个里程碑版本&lt;/a&gt; - 0.0.1&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://neosmart.net/blog/2008/redesigned-microsoft-website-to-use-silverlight/"&gt;NeoSmart Technologies&lt;/a&gt;报道，Microsoft将使用Silverlight重新设计其官方网站&lt;/li&gt;
    &lt;li&gt;国内的Silverlight网站 - &lt;a hrfe="http://mu.baidu.com/"&gt;百度MP3&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;在Windows Mobile手机上使用Windows Vista的&lt;a href="http://www.cnbeta.com/article.php?sid=46238"&gt;Side Show&lt;/a&gt;功能！&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.sprymedia.co.uk/article/Design"&gt;Design&lt;/a&gt; - 一个很cool的纯JavaScript的Web页面设计辅助工具&lt;/li&gt;
    &lt;li&gt;使用来自webkit团队的&lt;a href="http://www.codinghorror.com/blog/archives/001023.html"&gt;Sunspider&lt;/a&gt;测试各种浏览器的JavaScript引擎性能&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.alistapart.com/articles/previewofhtml5"&gt;HTML 5 Preview&lt;/a&gt; - XHTML 2.0还有发展前途吗？
    &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;直接下载地址：&lt;a href="http://www.podtrac.com/pts/redirect.mp3?http://downloads.cnblogs.com/netcast/mvp-on-dot-net-1-40bit.mp3"&gt;http://www.podtrac.com/pts/redirect.mp3?http://downloads.cnblogs.com/netcast/mvp-on-dot-net-1-40bit.mp3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;本期已将采样率改为22.050kHz，使用Google Reader订阅的用户应该能够直接使用Web上的播放控件正常播放而不会出现快进的问题。如果大家在播放上还碰到什么问题了，请留言告诉我们，谢谢。&lt;/p&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1028568.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42940/" target="_blank"&gt;[新闻]IBM花300万美元打造互联网三维虚拟紫禁城&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=urDIZh"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=urDIZh" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=G0O4vI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=G0O4vI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=uL6hJi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=uL6hJi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=CVVzrI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=CVVzrI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=zREaGI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=zREaGI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=pxWQFi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=pxWQFi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=VVRziI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=VVRziI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/212345802" height="1" width="1"/&gt;</description><enclosure url="http://www.podtrac.com/pts/redirect.mp3?http://downloads.cnblogs.com/netcast/mvp-on-dot-net-1-40bit.mp3" type="audio/mpeg" /><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/01/07/1028568.html</feedburner:origLink></item><item><title>如何订阅MVP on dot NET（或其它播客） - iTunes版</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/209343627/1022275.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Tue, 01 Jan 2008 09:39:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022275.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1022275.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022275.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1022275.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1022275.html</trackback:ping><description>&lt;p&gt;如果您还不知道播客是什么，请先阅读《&lt;a href="http:%0A//www.cnblogs.com/cathsfz/archive/2008/01/01/1022034.html"&gt;MVP 播客上线&lt;/a&gt;》中的播客介绍部分。&lt;/p&gt;
&lt;p&gt;首先，请打开iTunes。由于我是在Mac上使用iTunes，所以如果你是PC用户，您所看到的界面细节会和下面的截图略有不同。如果您还没有iTunes，但希望在iPod（包括iPhone）上收听播客，那么请先&lt;a href="http://www.apple.com/itunes/download/"&gt;下载iTunes&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;然后请点击&amp;#8220;高级&amp;#8221;菜单下的&amp;#8220;订购 Podcast...&amp;#8221;。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 1" src="http://img.skitch.com/20080101-ct47qdxyhcrqhucm71jsm3th8p.jpg" height="335" width="513" /&gt;&lt;/p&gt;
&lt;p&gt;输入MVP on dot NET的RSS地址。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 2" src="http://img.skitch.com/20080101-c3hcmuxheffcfhp962cafieha7.jpg" height="185" width="563" /&gt;&lt;/p&gt;
&lt;p&gt;之后您可以在&amp;#8220;Podcast&amp;#8221;视图看到MVP on dot NET已被添加到列表上，并且正在更新。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 3" src="http://img.skitch.com/20080101-fssuyux7b2q6nn9i2kmna6hd4s.jpg" height="585" width="942" /&gt;&lt;/p&gt;
&lt;p&gt;同时，您也可以在&amp;#8220;下载&amp;#8221;视图看到节目已经在下载中了。请等候下载的完成。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 4" src="http://img.skitch.com/20080101-jx939t68q29626c8bumdd8dxys.jpg" height="271" width="926" /&gt;&lt;/p&gt;
&lt;p&gt;下载完成后，您可以直接返回&amp;#8220;Podcast&amp;#8221;视图，双击MVP on dot NET以播放节目。&lt;/p&gt;
&lt;p&gt;如果您希望把节目同步到iPod（包括iPhone）上，此时请把iPod连接到电脑上，并且进入iPod对应视图，并翻到&amp;#8220;Podcast&amp;#8221;页。请选择同步&amp;#8220;所有 podcast&amp;#8221;，或在&amp;#8220;所选 podcast&amp;#8221;中钩选MVP on dot NET，并点击&amp;#8220;应用&amp;#8221;按钮以便与iTunes与您的iPod重新同步。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Step 5" src="http://img.skitch.com/20080101-gx62i7wnptui8fwme5r5hqqhw.jpg" height="585" width="942" /&gt;&lt;/p&gt;
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1022275.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42938/" target="_blank"&gt;[新闻]11个处于悬崖边缘的 Web 公司&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=aARrd2"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=aARrd2" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=jo6SII"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=jo6SII" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=1HuRHi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=1HuRHi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=QaJ0WI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=QaJ0WI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=EpNuKI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=EpNuKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=U3uhzi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=U3uhzi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=6Qtn8I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=6Qtn8I" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/209343627" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022275.html</feedburner:origLink></item><item><title>MVP on dot NET - Pilot Episode</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/209253018/1022112.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Tue, 01 Jan 2008 04:33:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022112.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1022112.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022112.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1022112.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1022112.html</trackback:ping><description>&lt;p&gt;主持：&lt;a href="http://www.beanpeng.com"&gt;Bean&lt;/a&gt;、&lt;a href="http://jeffreyzhao.cnblogs.com"&gt;Jeffrey&lt;/a&gt;、&lt;a href="http://dotnet.catchen.biz"&gt;Cat&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;a href="http://mezzoblue.com/archives/2007/12/19/8_2_x2/"&gt;8 + 2 = ☺&lt;/a&gt; - &lt;a href="http://blogs.msdn.com/ie/archive/2007/12/19/internet-explorer-8-and-acid2-a-milestone.aspx"&gt;IE8通过了Acid2测试&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://thinkgos.com/"&gt;gOS&lt;/a&gt;发布，日后我们仅仅使用Web也能生存下去吗？客户端过剩的CPU资源用来干什么？&lt;/li&gt;
    &lt;li&gt;文档都放上线！我们用&lt;a href="https://share.adobe.com/adc/adc.do"&gt;Adobe SHARE&lt;/a&gt;还是&lt;a href="http://workspace.office.live.com/"&gt;Office Live Workspace&lt;/a&gt;？&lt;/li&gt;
    &lt;li&gt;Linq to SQL、ADO.NET Entity Framewor，以及关于ORM的更多&amp;#8230;&amp;#8230;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.asp.net/downloads/3.5-extensions/"&gt;ASP.NET MVC Framework&lt;/a&gt;发布，与ASP.NET WebForm对比又如何？&lt;/li&gt;
    &lt;li&gt;iPhone Web App开发 - 有点点像WPF噢！&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;P.S.podcast订阅的图片教程稍后发布。&lt;/p&gt;
&lt;p&gt;直接下载地址：&lt;a href="http://www.podtrac.com/pts/redirect.mp3?http://downloads.cnblogs.com/netcast/mvp-on-dot-net-0-40bit.mp3"&gt;http://www.podtrac.com/pts/redirect.mp3?http://downloads.cnblogs.com/netcast/mvp-on-dot-net-0-40bit.mp3&lt;/a&gt;&lt;/p&gt;

&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1022112.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42938/" target="_blank"&gt;[新闻]11个处于悬崖边缘的 Web 公司&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=UJoFom"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=UJoFom" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=Hpu4MI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=Hpu4MI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=ZnlAoi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=ZnlAoi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=uH5XPI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=uH5XPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=jTA8vI"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=jTA8vI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=Hk3QYi"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=Hk3QYi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=Ocmw1I"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=Ocmw1I" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/209253018" height="1" width="1"/&gt;</description><enclosure url="http://www.podtrac.com/pts/redirect.mp3?http://downloads.cnblogs.com/netcast/mvp-on-dot-net-0-40bit.mp3" type="audio/mpeg" /><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022112.html</feedburner:origLink></item><item><title>新年新服务： MVP 播客上线</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/209090156/1022034.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Mon, 31 Dec 2007 19:39:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022034.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1022034.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022034.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1022034.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1022034.html</trackback:ping><description>&lt;p&gt;其实我很早就想做podcast（播客），10月份从三亚回来一直在筹备一个MVP博客，最终在前天完成了第0集（pilot episode）的录制，并将于今天稍晚时候上线。在整个过程中，我需要感谢&lt;a href="http://dudu.cnblogs.com"&gt;dudu&lt;/a&gt;以及博客园对podcast提供的支持与服务，感谢&lt;a href="http://www.beanpeng.com"&gt;Bean&lt;/a&gt;与&lt;a href="http://jeffreyzhao.cnblogs.com"&gt;Jeffrey&lt;/a&gt;对podcast准备工作与录制的投入。&lt;/p&gt;
&lt;p&gt;首先，我介绍一下podcast为什么叫做podcast。过往，我们能够订阅feed，从而好像收取email那样收取网上的信息。例如，我订阅了ABC World New，设置了我的电脑每天早上7:00自动开机并打开feed reader下载feed，那么当我准备好早餐后，我就可以一边享受早餐，一边阅读新闻了，这和传统的喝早茶看早报没什么区别。&lt;/p&gt;
&lt;p&gt;然而，ABC World New的新文章，附带了一个新闻视频片段，以龟速的下载速度，我可不能等下载完看完再去上班，因此我希望我的feed reader能够识别视频音频片段并且自动下载。RSS 2.0的&amp;lt;enclosure /&amp;gt;标签是第一个出来把问题解决掉的，只要把这一个feed entry相关的文件放到&amp;lt;enclosure /&amp;gt;链接内，feed reader就应该懂得自动去下载。之后，我把电脑自动开机时间改为早上5:00，预留两个小时，什么龟速也能把几分钟的视频片段拉下来吧。然后，我还是边喝着早茶（或者咖啡），边看新闻，不过这次不用读文字了，视频里面有人说给我听。&lt;/p&gt;
&lt;p&gt;随后，iPod和iTunes又把这个应用提升到了一个全新的层次。如果你使用iTunes订阅新闻，起床后我只需要按一下同步按钮，视频音频都传到iPod上面去了，然后专心吃我的早餐，出门口时记得把iPod从同步底座上拔下来带走就是了。我在地铁或公交上有足够多的时间，把iPod拿出来看看或者听听头条新闻的时间是绝对是有的，甚至还能听听有声电子书。&lt;/p&gt;
&lt;p&gt;由于这个功能在iTunes与iPod上就被命名为podcast，而且iPod在美国相当普及，所以大家就都叫podcast了。不过，Microsoft貌似避忌所有pod字开头的东西，以保持和Apple之间的距离，所以就坚持把同样的东西叫做netcast，这样显得中立一些。不过Zune2里面的功能菜单就写着podcast，看来负责整理Zune2菜单字符串资源的人有被炒鱿鱼的危险了&amp;#8230;&amp;#8230;另外，国内有一些名为播客的东西其实不是播客，土豆一开始就给人如此批评了——不支持RSS订阅，也不允许下载，更别说放到iPod上了，这也想带上播客的头衔？&lt;/p&gt;
&lt;p&gt;好吧，对podcast的介绍到此结束，稍后MVP博客的第0集将会发布到&lt;a href="http://netcast.cnblogs.com"&gt;netcast.cnblogs.com&lt;/a&gt;，并且我还会另外发贴详细说明如何订阅podcast。敬请期待！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;MVP on dot NET已上线，请通过&lt;a href="http://netcast.cnblogs.com"&gt;netcast.cnblogs.com&lt;/a&gt;访问。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update again: &lt;/strong&gt;教程已发布：&lt;a href="http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022275.html"&gt;如何订阅MVP on dot NET（或其它播客） - iTunes版&lt;/a&gt;&lt;/p&gt;

 
&lt;img src ="http://www.cnblogs.com/cathsfz/aggbug/1022034.html?type=1" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://news.cnblogs.com/n/42938/" target="_blank"&gt;[新闻]11个处于悬崖边缘的 Web 公司&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com" target="_blank"&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href="http://news.cnblogs.com" target="_blank"&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/group.htm" target="_blank"&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/q" target="_blank"&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href="http://wz.cnblogs.com/" target="_blank"&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href="http://space.cnblogs.com/ing" target="_blank"&gt;闪存&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/CatChen/dotNET?a=raQRPS"&gt;&lt;img src="http://feeds.feedburner.com/~a/CatChen/dotNET?i=raQRPS" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=50IWHJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=50IWHJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=5Kcmhj"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=5Kcmhj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=oVbMFJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=oVbMFJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=avn7oJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=avn7oJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=BvUKyj"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=BvUKyj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CatChen/dotNET?a=SRqBNJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CatChen/dotNET?i=SRqBNJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CatChen/dotNET/~4/209090156" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022034.html</feedburner:origLink></item><item><title>我嘅 2007</title><link>http://feeds.feedburner.com/~r/CatChen/dotNET/~3/209070506/1022030.html</link><dc:creator>Cat Chen</dc:creator><author>Cat Chen</author><pubDate>Mon, 31 Dec 2007 18:45:00 GMT</pubDate><guid isPermaLink="false">http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022030.html</guid><wfw:comment>http://www.cnblogs.com/cathsfz/comments/1022030.html</wfw:comment><comments>http://www.cnblogs.com/cathsfz/archive/2008/01/01/1022030.html#Feedback</comments><slash:comments>50</slash:comments><wfw:commentRss>http://www.cnblogs.com/cathsfz/comments/commentRss/1022030.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cathsfz/services/trackbacks/1022030.html</trackback:ping><description>&lt;p&gt;（以下的是实验性文章，全文使用Cantonese书写而成，附带Mandarin翻译，请将鼠标移至带有下划线的短语上以查看翻译。）&lt;/p&gt;
&lt;p&gt;&lt;acronym title="为什么"&gt;點解&lt;/acronym&gt;&lt;acronym title="整个"&gt;成個&lt;/acronym&gt;博客園都&lt;acronym title="在"&gt;喺度&lt;/acronym&gt;&lt;acronym title="说"&gt;講&lt;/acronym&gt;&amp;#8220;我&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;2007&amp;#8221;，&lt;acronym title="还要"&gt;仲要&lt;/acronym&gt;大部分都&lt;acronym title="差不多"&gt;差唔多&lt;/acronym&gt;&amp;#8230;&amp;#8230;好，&lt;acronym title="那么"&gt;咁&lt;/acronym&gt;我就寫&lt;acronym title="一些"&gt;啲&lt;/acronym&gt;&lt;acronym title="不同"&gt;唔同&lt;/acronym&gt;&lt;acronym title="一点"&gt;啲&lt;/acronym&gt;&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;&lt;acronym title="东西"&gt;嘢&lt;/acronym&gt;，例如&lt;acronym title="说"&gt;話&lt;/acronym&gt;&amp;#8230;&amp;#8230;人脈啦。我要&lt;acronym title="说"&gt;話&lt;/acronym&gt;，技術&lt;acronym title="不是"&gt;唔係&lt;/acronym&gt;最重要&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;，&lt;acronym title="也"&gt;亦&lt;/acronym&gt;都&lt;acronym title="不是"&gt;唔係&lt;/acronym&gt;管理，&lt;acronym title="而是"&gt;而係&lt;/acronym&gt;人脈。&lt;/p&gt;
&lt;p&gt;2007年，個人發展上&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;兩個重要事件，一&lt;acronym title="是"&gt;係&lt;/acronym&gt;&lt;acronym title="拿到"&gt;攞咗&lt;/acronym&gt;微軟&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;MVP，二&lt;acronym title="是"&gt;係&lt;/acronym&gt;賣&lt;acronym title="了"&gt;咗&lt;/acronym&gt;&lt;acronym title="给"&gt;畀&lt;/acronym&gt;&lt;acronym title="Baidu"&gt;B家&lt;/acronym&gt;，兩樣都&lt;acronym title="是"&gt;係&lt;/acronym&gt;要靠人脈&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;（要&lt;acronym title="感謝"&gt;多謝&lt;/acronym&gt;&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;人自然非常多）。&lt;acronym title="也"&gt;亦&lt;/acronym&gt;就&lt;acronym title="是"&gt;係&lt;/acronym&gt;&lt;acronym title="说"&gt;話&lt;/acronym&gt;，第一&lt;acronym title="是"&gt;係&lt;/acronym&gt;你要認識人際網絡中充當關鍵節點&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;&lt;acronym title="那"&gt;嗰&lt;/acronym&gt;個人，第二&lt;acronym title="是"&gt;係&lt;/acronym&gt;&lt;acronym title="那"&gt;嗰&lt;/acronym&gt;個人要&lt;acronym title="看得起"&gt;睇得起&lt;/acronym&gt;你。簡單&lt;acronym title="来"&gt;嚟&lt;/acronym&gt;&lt;acronym title="说"&gt;講&lt;/acronym&gt;，如果你有能力，無論係技術&lt;acronym title="还是"&gt;定係&lt;/acronym&gt;管理，首先你要&lt;acronym title="认识"&gt;識得&lt;/acronym&gt;渠道（或者叫中間商），其次&lt;acronym title="他"&gt;佢&lt;/acronym&gt;要覺得你超值，&lt;acronym title="那样"&gt;咁&lt;/acronym&gt;你&lt;acronym title="才有"&gt;先有&lt;/acronym&gt;機會賣得出去，而且賣個好價錢。&lt;acronym title="在"&gt;喺&lt;/acronym&gt;&lt;acronym title="没有"&gt;冇&lt;/acronym&gt;渠道&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;前提下，大家都明白廠家直接向客戶銷售&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;成本有幾高，你一個人能夠聯係&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;買家數量就非常有限&lt;acronym title="了"&gt;嘞&lt;/acronym&gt;。&lt;/p&gt;
&lt;p&gt;如果一開始，我&lt;acronym title="不是"&gt;唔係&lt;/acronym&gt;&lt;acronym title="在"&gt;喺&lt;/acronym&gt;&lt;a href="http://dflying.cnblogs.com"&gt;Dflying&lt;/a&gt;&lt;acronym title="以及"&gt;同埋&lt;/acronym&gt;&lt;a href="http://jeffreyzhao.cnblogs.com"&gt;Jeffrey&lt;/a&gt;&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;blog上評論，&lt;acronym title="他们"&gt;佢哋&lt;/acronym&gt;&lt;acronym title="也"&gt;亦&lt;/acronym&gt;&lt;acronym title="不会"&gt;唔會&lt;/acronym&gt;&lt;acronym title="来"&gt;嚟&lt;/acronym&gt;&lt;acronym title="看"&gt;睇&lt;/acronym&gt;我&lt;acronym title="的"&gt;個&lt;/acronym&gt;blog，&lt;acronym title="也就"&gt;亦就&lt;/acronym&gt;&lt;acronym title="不会"&gt;唔會&lt;/acronym&gt;有&lt;acronym title="他们"&gt;佢哋&lt;/acronym&gt;鼓勵我將文章發到首頁，&lt;acronym title="这样子的话"&gt;咁嘅話&lt;/acronym&gt;，可能&lt;a href="http://dudu.cnblogs.com"&gt;dudu&lt;/a&gt;&lt;acronym title="也就"&gt;亦就&lt;/acronym&gt;&lt;acronym title="不会"&gt;唔會&lt;/acronym&gt;知道我&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;存在，&lt;acronym title="这样子"&gt;咁&lt;/acronym&gt;dudu推薦我去&lt;acronym title="拿"&gt;攞&lt;/acronym&gt;MVP就&lt;acronym title="不知"&gt;唔&lt;/acronym&gt;知從何談起&lt;acronym title="了"&gt;嘞&lt;/acronym&gt;。所以，&lt;acronym title="拿"&gt;攞&lt;/acronym&gt;MVP呢件事&lt;acronym title="是"&gt;係&lt;/acronym&gt;一定要&lt;acronym title="感谢"&gt;多謝&lt;/acronym&gt;Dflying、Jeffrey&lt;acronym title="以及"&gt;同埋&lt;/acronym&gt;dudu&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;。當然，&lt;acronym title="还要"&gt;仲要&lt;/acronym&gt;多謝所有&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;讀者，特別&lt;acronym title="是"&gt;係&lt;/acronym&gt;有留言&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;&lt;acronym title="那些"&gt;嗰啲&lt;/acronym&gt;，因爲有留言自然激發思考。&lt;/p&gt;
&lt;p&gt;然而，&lt;acronym title="拿"&gt;攞&lt;/acronym&gt;MVP並&lt;acronym title="不是"&gt;唔係&lt;/acronym&gt;終點，&lt;acronym title="只是"&gt;只係&lt;/acronym&gt;另一個起點&lt;acronym title="而已"&gt;嗟&lt;/acronym&gt;。之後，有中國&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;MVP峰會，&lt;a href="http://www.beanpeng.com"&gt;Bean&lt;/a&gt;介紹我&lt;acronym title="认识"&gt;識&lt;/acronym&gt;&lt;acronym title="了"&gt;咗&lt;/acronym&gt;&lt;acronym title="不少"&gt;唔少&lt;/acronym&gt;微軟&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;人&lt;acronym title="以及"&gt;同埋&lt;/acronym&gt;其他MVP，&lt;acronym title="这样"&gt;咁&lt;/acronym&gt;&lt;acronym title="才有"&gt;先有&lt;/acronym&gt;&lt;acronym title="后来"&gt;后嚟&lt;/acronym&gt;&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;&lt;acronym title="一些"&gt;一啲&lt;/acronym&gt;合作項目，例如&lt;acronym title="说"&gt;話&lt;/acronym&gt;netcast啦。所以&lt;acronym title="说"&gt;話&lt;/acronym&gt;，認人&lt;acronym title="才"&gt;先&lt;/acronym&gt;有得做，因爲&lt;acronym title="很多"&gt;好多&lt;/acronym&gt;&lt;acronym title="东西"&gt;嘢&lt;/acronym&gt;&lt;acronym title="是"&gt;係&lt;/acronym&gt;&lt;acronym title="不"&gt;唔&lt;/acronym&gt;熟&lt;acronym title="不"&gt;唔&lt;/acronym&gt;做&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;。&lt;acronym title="在这里"&gt;係呢度&lt;/acronym&gt;，我要&lt;acronym title="感谢"&gt;多謝&lt;/acronym&gt;Bean、Jeffrey、dudu，特別&lt;acronym title="是"&gt;係&lt;/acronym&gt;dudu，完全&lt;acronym title="不"&gt;唔&lt;/acronym&gt;講求回報&lt;acronym title="地"&gt;咁&lt;/acronym&gt;支持&lt;acronym title="我们"&gt;我哋&lt;/acronym&gt;做netcast。&lt;/p&gt;
&lt;p&gt;另外一件事，就&lt;acronym title="是"&gt;係&lt;/acronym&gt;關於賣身&lt;acronym title="的了"&gt;㗎嘞&lt;/acronym&gt;，我&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;意思&lt;acronym title="是"&gt;係&lt;/acronym&gt;&lt;acronym title="找工作"&gt;搵工&lt;/acronym&gt;。寫&amp;#8220;我&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;2007&amp;#8221;&lt;acronym title="的"&gt;嘅&lt;/acronym&gt;人&lt;acronym title="里面"&gt;入邊&lt;/acronym&gt;，&lt;acronym title="那么"&gt;咁&lt;/acronym&gt;多人寫自己今年畢業&lt;acronym title="找工作"&gt;搵工&lt;/acronym&gt;如何如何，我又&lt;acronym title="怎么"&gt;點&lt;/acronym&gt;可以&lt;acronym title="不"