<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Kevin Yang的博客</title><subtitle type="text">It's all about sharing.</subtitle><id>http://feed.cnblogs.com/blog/u/26251/rss</id><updated>2011-12-10T15:13:21Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/26251/rss"/><entry><id>http://www.cnblogs.com/KevinYang/archive/2011/05/11/2043758.html</id><title type="text">诚招.Net研发人员</title><summary type="text">.Net初级开发工程师，详见http://job.cnblogs.com/offer/11940/.Net高级开发工程师，详见http://job.cnblogs.com/offer/11942/公司是做网络营销效果量化的，以及SEO，SEM等业务。我们是一家创新的技术导向的公司，老板对技术非常看重，当同行业内别的公司都在使用国外的软件的时候，我们却自己在短短的时间内开发出一套自主知识产权的产品，而且比国外成熟的产品更创新，更具竞争力，以致于连百度都来模仿我们。因为我们的创新能力，我们成为微软全球战略合作伙伴，同时也是微软bizpark one计划中国区的唯一一家公司。因为我们seo、sem的</summary><published>2011-05-11T14:54:00Z</published><updated>2011-05-11T14:54:00Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/KevinYang/archive/2011/05/11/2043758.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/archive/2011/05/11/2043758.html"/><content type="html">&lt;p&gt;.Net初级开发工程师，详见&lt;a href="http://job.cnblogs.com/offer/11940/"&gt;http://job.cnblogs.com/offer/11940/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;.Net高级开发工程师，详见&lt;a href="http://job.cnblogs.com/offer/11942/"&gt;http://job.cnblogs.com/offer/11942/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;公司是做网络营销效果量化的，以及SEO，SEM等业务。我们是一家创新的技术导向的公司，老板对技术非常看重，当同行业内别的公司都在使用国外的软件的时候，我们却自己在短短的时间内开发出一套自主知识产权的产品，而且比国外成熟的产品更创新，更具竞争力，以致于连百度都来模仿我们。因为我们的创新能力，我们成为微软全球战略合作伙伴，同时也是微软bizpark one计划中国区的唯一一家公司。因为我们seo、sem的专业性，我们成为SEMPO国际组织在中国的唯一核心企业会员。&lt;/p&gt;&lt;p&gt;公司正处在一个快速发展时期，扩张非常快，前景非常不错，我们技术部需要&lt;span style="font-size: 15px;"&gt;&lt;strong&gt;有激情、有能力、又上进&lt;/strong&gt;&lt;/span&gt;的技术人才加盟，和我们一起奋斗！&lt;/p&gt;&lt;p&gt;公司用的技术都是微软系的，研发用.Net，数据库用sql server，如果你有这方面背景自然最理想，当然也不强求，因为我相信技术都是相通的，如果你在别的技术领域已经做得很好了，相信你也能在这个领域同样做得很好。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/KevinYang/aggbug/2043758.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/KevinYang/archive/2011/05/11/2043758.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/KevinYang/archive/2011/04/10/2011879.html</id><title type="text">VS编译时自动引用Debug|Release版本的dll</title><summary type="text">公司一些早期的项目，把所有工程都放到一个解决方案下了，导致整个解决方案编译很慢，而且也不便于类库的复用和维护。因此我们决定把工程按照功能划分到不同的解决方案里头，然后定期发布dll到TFS配置库上固定的TeamProject下面，以后应用程序引用时就不添加工程，而是采用添加dll的方式。但是现在遇到一个问题，发布dll一般会发布Debug和Release两个版本，那么应用程序应该引用哪个版本呢？ 理想情况下，开发测试的时候应该使用Debug版本，这样抛异常的时候调试很方便。正式部署到生产环境的时候可以使用Release版本，这样性能好一些。但是添加dll的时候VS只允许选择一个版本。 我们知道</summary><published>2011-04-10T14:33:00Z</published><updated>2011-04-10T14:33:00Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/KevinYang/archive/2011/04/10/2011879.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/archive/2011/04/10/2011879.html"/><content type="html">&lt;p&gt;公司一些早期的项目，把所有工程都放到一个解决方案下了，导致整个解决方案编译很慢，而且也不便于类库的复用和维护。因此我们决定把工程按照功能划分到不同的解决方案里头，然后定期发布dll到TFS配置库上固定的TeamProject下面，以后应用程序引用时就不添加工程，而是采用添加dll的方式。但是现在遇到一个问题，发布dll一般会发布Debug和Release两个版本，那么应用程序应该引用哪个版本呢？&lt;/p&gt;  &lt;p&gt;理想情况下，开发测试的时候应该使用Debug版本，这样抛异常的时候调试很方便。正式部署到生产环境的时候可以使用Release版本，这样性能好一些。但是添加dll的时候VS只允许选择一个版本。&lt;/p&gt;  &lt;p&gt;我们知道，VS支持把工程不同的编译选项保存到不同的配置中，编译时根据当前使用的配置来决定采用什么样的编译选项。默认会新建Debug和Release这两个配置。开发时我们一般选Debug配置，发布时一般选择Release。&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Visual studio Configuration manager" border="0" alt="Visual studio Configuration manager" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201104/201104102214432913.png" width="562" height="191" /&gt;&lt;/p&gt;  &lt;p&gt;如果添加dll时也能根据当前配置引用不同路径的dll，那就好了。在stackoverflow上搜到了相关的信息，说可以修改csproj工程文件，使用VS宏变量来指定dll路径。用记事本打开研究了一番倒也挺简单的.找到引用类库的地方：&lt;/p&gt;  &lt;p&gt;&amp;lt;ItemGroup&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;Reference Include=&amp;quot;ClassLibrary1,Version=1.0.0.0,Culture=neutral,processorArchitecture=MSIL&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;SpecificVersion&amp;gt;False&amp;lt;/SpecificVersion&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;HintPath&amp;gt;&lt;font color="#000000"&gt;&lt;strong&gt;Lib\Debug\ClassLibrary1.dll&lt;/strong&gt;&lt;/font&gt;&amp;lt;/HintPath&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/Reference&amp;gt;&lt;/p&gt;  &lt;p&gt;只需要改成：&lt;/p&gt;  &lt;p&gt;&amp;lt;ItemGroup&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Reference Include=&amp;quot;ClassLibrary1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;SpecificVersion&amp;gt;False&amp;lt;/SpecificVersion&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;HintPath&amp;gt;&lt;strong&gt;Lib\&lt;font color="#ff0000"&gt;$(Configuration)&lt;/font&gt;&lt;font color="#000000"&gt;\&lt;/font&gt;ClassLibrary1.dll&lt;/strong&gt;&amp;lt;/HintPath&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Reference&amp;gt;&lt;/p&gt;  &lt;p&gt;这样编译时VS就能根据当前配置到Debug或者Release文件夹下寻找相应的dll了。&lt;/p&gt;  &lt;p&gt;不过这样一来，以后添加dll的时候就有点麻烦了，每次都要手工编辑csproj文件。同事吴突发奇想，&lt;strong&gt;能不能在发布的时候再建一个名为“$(Configuration)”的文件夹，以后直接引用这个文件夹下的dll即可，都不需要修改csproj文件了&lt;/strong&gt;。我的第一个反应是VS应该会对这样的路径做转义之类的，因为和内置变量名冲突了。但本着“不确定的事情要通过实验去验证”的精神，我做了这个实验，发现居然可以！VS才不管你路径包含什么字符串呢。&lt;/p&gt;  &lt;p&gt;最后的结论，发布dll时，需要同时发布到以下三个文件夹：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;$(Configuration)\MyLibrary.dll &lt;/li&gt;    &lt;li&gt;Debug\MyLibrary.dll &lt;/li&gt;    &lt;li&gt;Release\MyLibrary.dll &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;其中$(Configuration)文件夹下的dll无所谓哪个版本了，这个纯粹只是为了骗过Visual Studio的而已，编译时根本不会用到。添加dll引用的时候，直接引用$(Configuration)\MyLibrary.dll即可。&lt;/p&gt;  &lt;p&gt;希望此文对你有帮助。&lt;/p&gt;  &lt;p&gt;== &lt;a style="font-family: comic sans ms; color: black; font-weight: bold; text-decoration: none" title="VS编译时自动引用Debug|Release版本的dll" href="http://www.imkevinyang.com/2011/04/VS%e7%bc%96%e8%af%91%e6%97%b6%e8%87%aa%e5%8a%a8%e5%bc%95%e7%94%a8Debug|Release%e7%89%88%e6%9c%ac%e7%9a%84dll.html" target="_self"&gt;Kevin Yang&lt;/a&gt; == &lt;/p&gt;&lt;img src="http://www.cnblogs.com/KevinYang/aggbug/2011879.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/KevinYang/archive/2011/04/10/2011879.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/KevinYang/archive/2011/01/14/1935392.html</id><title type="text">盘点国内外不同特色的Web流量分析工具</title><summary type="text">这些年，随着互联网的发展，Web网站流量分析也开始受到很多人的重视。05年Google收购了Urchin并推出了新版本的Google Analytics工具，09年Adobe收购了Omniture公司，2010年，IBM收购了同样出色的Coremetrics公司。而国内这块市场才刚刚起步，还没有那么多非常成熟的工具。本文我将盘点一下我用过的几款国内外不同特色的Web流量分析工具。 Omnitur...</summary><published>2011-01-14T04:30:00Z</published><updated>2011-01-14T04:30:00Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/KevinYang/archive/2011/01/14/1935392.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/archive/2011/01/14/1935392.html"/><content type="html">&lt;p&gt;这些年，随着互联网的发展，Web网站流量分析也开始受到很多人的重视。05年Google收购了Urchin并推出了新版本的Google Analytics工具，09年Adobe收购了Omniture公司，2010年，IBM收购了同样出色的Coremetrics公司。而国内这块市场才刚刚起步，还没有那么多非常成熟的工具。本文我将盘点一下我用过的几款国内外不同特色的Web流量分析工具。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omniture SiteCatalyst&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: #000000"&gt;&lt;span style="text-align: center; padding-bottom: 2px; background-color: #ff6666; padding-left: 2px; width: 80px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;&lt;font color="#ffffff"&gt;2002年推出&lt;/font&gt;&lt;/span&gt;&lt;span style="text-align: center; padding-bottom: 2px; background-color: lightblue; padding-left: 2px; width: 50px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;收费&lt;/span&gt; &lt;span style="text-align: center; padding-bottom: 2px; background-color: lightgreen; padding-left: 2px; width: 50px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;国外&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Omniture SiteCatalyst" border="0" alt="Omniture SiteCatalyst" align="right" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141227094770.png" width="572" height="269" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;虽说论资历，Omniture还比不上WebTrends，但是凭借技术上的优势，Omniture已经可以算得上Web流量分析领域的老大了，产品线非常庞大，其中SiteCatalyst是其主推的旗舰产品。最近一两年似乎也在积极开拓国内的市场。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势1. 针对电子商务定制的监测&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;SiteCatalyst对于电子商务客户有专门定制的监测，可以分析例如购物车添加、移除等事件。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势2. 提供强大的扩展机制&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;SiteCatalyst通过eVars（custom ecommerce variable）、props（custom insight variable）以及Custom Event达到报表扩展的目的。通过配置这三个特殊变量，客户可以实现很多自定义KPI的跟踪。&lt;/p&gt;  &lt;p&gt;通过在后台配置变量关联，可以对在同一份报表中对数据进行关联分析。例如将页面名和省份关联，那么就可以分析每个页面在不同省份的表现情况。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势3. 路径分析&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;路径分析无疑是Omniture的一大优势。这里的说的路径分析既可以是传统的页面导航分析，&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Omniture SiteCatalyst页面导航分析" border="0" alt="Omniture SiteCatalyst页面导航分析" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141227231621.png" width="455" height="233" /&gt;&lt;/p&gt;  &lt;p&gt;也可以和KPI结合到一块来分析（下图来自Discover系统）&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Omniture Discover页面导航分析" border="0" alt="Omniture Discover页面导航分析" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141227334314.png" width="410" height="211" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;劣势&lt;/strong&gt;：Omniture SiteCatalyst的最大劣势就是系统过于复杂。而部署工作非常繁琐，需要在客户网站上加上非常多的标记代码，例如为不同页面设置不同的页面名称。而后台很多报表也需要经过精心的预配置才能看到。所以一般SiteCatalyst的配置都由培训过的专业人士来负责。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Google Analytics&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: #000000"&gt;&lt;span style="text-align: center; padding-bottom: 2px; background-color: #ff6666; padding-left: 2px; width: 80px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;&lt;font color="#ffffff"&gt;2005年推出&lt;/font&gt;&lt;/span&gt;&lt;span style="text-align: center; padding-bottom: 2px; background-color: lightblue; padding-left: 2px; width: 50px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;免费&lt;/span&gt; &lt;span style="text-align: center; padding-bottom: 2px; background-color: lightgreen; padding-left: 2px; width: 50px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;国外&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Google Analytics(GA)" border="0" alt="Google Analytics(GA)" align="right" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141227451358.png" width="497" height="228" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Google Analytics（简称GA）是Google收购了老牌的付费流量分析工具Urchin之后整合推出的一款免费网站流量分析工具。GA自推出以来，以其强大优势迅速拉拢了国内外大量用户，成为人气之王。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势1. 功能完备&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;由于GA的前身是付费流量工具Urchin，因此它的功能较其他免费流量分析工具来说更为完备。访客跟踪，网站热门内容跟踪，路径导航分析，流量来源分析，链接点击覆盖图以及电子商务等等，基本涵盖了Web流量分析常用的各个方面。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势2. 数据剖析功能强大&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;做Web流量分析最基础的操作就是对流量进行细分，这样才能知道每个特定群体，例如来自百度和来自Google的各自的KPI效果如何。GA在报表中允许对不同数据进行交叉分析，其高级分段（Advanced Segments）功能更是允许你精心过滤出你关注的群体。关于如何使用GA高效的进行数据剖析，可以参考我以前写过的文章&lt;a title="高效使用Google Analytics进行Web流量分析" href="http://www.imkevinyang.com/2010/01/%E9%AB%98%E6%95%88%E4%BD%BF%E7%94%A8google-analytics%E8%BF%9B%E8%A1%8Cweb%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90.html"&gt;高效使用Google Analytics进行Web流量分析&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Google Analytics 高级分段" border="0" alt="Google Analytics 高级分段" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141227525772.png" width="474" height="214" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势3. 代码部署简单&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;相比Omniture，GA部署的代码简单得多了，大多数情况只需要在全站加几行一样的js代码即可完成部署工作。然后就直接在后台看到全部的报表。只有部分特殊的功能，例如电子商务，才需要写一些特别的js代码。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;劣势&lt;/strong&gt;：相对复杂，不容易上手，适合有一定Web分析基础的人使用。同时，自从谷歌撤离大陆之后，GA收集数据的域名&lt;a href="http://www.google-analytics.com"&gt;www.google-analytics.com&lt;/a&gt;就没了保障，面临偶尔甚至终生被重置的危险。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Cnzz站长统计（还有51.la、太极链等）&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: #000000"&gt;&lt;span style="text-align: center; padding-bottom: 2px; background-color: #ff6666; padding-left: 2px; width: 80px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;&lt;font color="#ffffff"&gt;2007年推出&lt;/font&gt;&lt;/span&gt;&lt;span style="text-align: center; padding-bottom: 2px; background-color: lightblue; padding-left: 2px; width: 50px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;免费&lt;/span&gt; &lt;span style="text-align: center; padding-bottom: 2px; background-color: lightgreen; padding-left: 2px; width: 50px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;国内&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Cnzz站长统计" border="0" alt="Cnzz站长统计" align="right" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141228221765.png" width="484" height="324" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;cnzz应该算得上目前国内用户群最大的流量统计工具了。由于推出较早占有了大批用户群。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势1. 界面对于大多数中小站长来说比较直观&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;国内的Web流量分析市场毕竟不像国外那么成熟，大多数中小站长们关注的东西还比较浅层次，看看pv和uv就够了。因此像cnzz的这种界面倒是非常迎合站长的需求。左侧菜单直接就可以打开各个报表。报表基本都是提供一维分析，例如搜索引擎，关键词报表，来源升降版，受访页升降版。比较好理解。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势2. 用户群大，可以做一些行业级分析&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;按cnzz官网说的，目前已经有注册用户1694799人，统计站点2795581家了。拥有了这么庞大的数据，并且数据来自各行各业，因此基于数据提供的行业级报告可信度较高。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;劣势&lt;/strong&gt;. 报表简单，无法进行二维以上的交叉分析，例如剖析搜索引擎来的不同关键词的pv、uv表现如何，不同关键词又是如何着陆到不同页面。使用IP来甄别独立访客，是以前日志分析时用到的技术，不适应新形势。&lt;/p&gt;  &lt;p&gt;国内还有好多类似的统计工具，例如51.la，太极链等，和cnzz走的路线基本差不多。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Gridsum WebDissector&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: #000000"&gt;&lt;span style="text-align: center; padding-bottom: 2px; background-color: #ff6666; padding-left: 2px; width: 80px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;&lt;font color="#ffffff"&gt;2008年推出&lt;/font&gt;&lt;/span&gt;&lt;span style="text-align: center; padding-bottom: 2px; background-color: lightblue; padding-left: 2px; width: 50px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;收费&lt;/span&gt; &lt;span style="text-align: center; padding-bottom: 2px; background-color: lightgreen; padding-left: 2px; width: 50px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;国内&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Gridsum WebDissector热力图" border="0" alt="Gridsum WebDissector热力图" align="right" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141229022404.png" width="528" height="292" /&gt;&lt;/p&gt;  &lt;p&gt;WebDissector是国双科技08年推出的一款基于多维度自由剖析的Web流量分析工具，在推出一年内，便摘得Adworld 2009年度最佳技术大奖，目前服务的客户有很多知名品牌，例如微软中国，可口可乐，惠普，上汽，中粮，欧莱雅集团下所有品牌包括兰蔻、巴黎欧莱雅等。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势1. 可交互的热力图动态剖析技术&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;热力图是根据用户的点击密集程度绘制成的一张图，一般用来分析用户的关注点。传统的热力图只是简单的根据用户的点击数据输出为一张静态图片，仅此而已，而国双的WebDissector是全球首个也是唯一一个实现可交互的热力图动态剖析技术的工具。该工具采用了微软最新的Silverlight技术进行研发。&lt;/p&gt;  &lt;p&gt;用户可以任意框选热力图上感兴趣的区域，然后从20多个不同维度中选择其中一个维度对此区域进行流量细分，例如分不同搜索引擎、关键词或者广告媒介查看流量情况，而且&lt;strong&gt;剖析不局限于当前的点击数据&lt;/strong&gt;，用户还可以看到点击了此片区域的&lt;strong&gt;访客最后完成的KPI情况&lt;/strong&gt;，例如此访客最终是否发生购买行为，是否注册转化了等等。&lt;/p&gt;  &lt;p&gt;用户也可以针对某个特定的群体绘制出单独的热力图，例如用户想看看从新浪和搜狐广告推介来的访客都关注那片区域，那么他可以使用“广告来源=新浪or搜狐”的条件绘制出新的热力图。&lt;/p&gt;  &lt;p&gt;针对Flash内不同场景的跟踪，WebDissector更是通过独创的快照分析功能解决了同片区域不同内容的点击监测。&lt;/p&gt;  &lt;p&gt;如果用户关注页面上的链接，那么可以启用链接排行榜功能，分析此页面上链接的点击情况。不过这个功能似乎已经成为很多成熟Web流量分析工具的标配了。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势2. 多维度自由交叉剖析&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;很多人在GA中见识了使用两三个不同维度进行交叉剖析的功能，而在国双的WebDissector系统中，用户可以使用近70多个内置维度进行自由交叉剖析。下面四张图展示了一个自由剖析的过程。&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="网站的流量是从哪里来的" border="0" alt="网站的流量是从哪里来的" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141229102914.png" width="508" height="302" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="哪些搜索引擎对网站的流量贡献最大" border="0" alt="哪些搜索引擎对网站的流量贡献最大" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141229182070.png" width="472" height="297" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="百度和google的用户是通过什么关键词找到我的网站的" border="0" alt="百度和google的用户是通过什么关键词找到我的网站的" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141229306946.png" width="488" height="315" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="搜索“祁国晟”的用户去了哪些页面" border="0" alt="搜索“祁国晟”的用户去了哪些页面" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141229335150.png" width="542" height="281" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势3. 自定义属性&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;一个优秀的系统必须能够扩展，像Omniture SiteCatalyst提供的变量扩展机制，WebDissector也提供了自定义属性用于给客户自定义自己想关注的维度，例如我们可以设置一个自定义属性“性别”，在浏览器端通过网站传给的信息发送给WebDissector服务器，最后就能在后台看到不同性别的流量情况了。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势4. 流量质量评分&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;如何衡量访客访问的价值一直是Web流量分析的一个重要问题，通常我们会定义一些KPI来评估这种价值，例如此访客是否注册了，是否购买了。但是对于一个内容型的网站可能定义这种指标就不是那么容易。那么我们可以给不同页面、不同的行为设置不同的分值，例如用户着陆的页面通常分值比较低，而用户进入网站一些关键页面则分值较高，那么通过这种方式我们就能直观的为每个流量打上一个分值，从而更好的评估不同渠道的质量效果。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;劣势&lt;/strong&gt;：与Omniture和GA遇到的困境类似，功能强大的系统往往用户不容易上手。路径分析功能尚不及国外优秀工具。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;百度统计&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: #000000"&gt;&lt;span style="text-align: center; padding-bottom: 2px; background-color: #ff6666; padding-left: 2px; width: 80px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;&lt;font color="#ffffff"&gt;2009年推出&lt;/font&gt;&lt;/span&gt;&lt;span style="text-align: center; padding-bottom: 2px; background-color: lightblue; padding-left: 2px; width: 50px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;免费&lt;/span&gt; &lt;span style="text-align: center; padding-bottom: 2px; background-color: lightgreen; padding-left: 2px; width: 50px; padding-right: 2px; float: right; margin-left: 4px; padding-top: 2px"&gt;国内&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="百度统计" border="0" alt="百度统计" align="right" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141229383726.png" width="465" height="334" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="left"&gt;作为后起之秀的百度统计不容小觑，功能和界面设计上吸收了不少前辈们的优点。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势1. 界面直观，模块清晰&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;和cnzz相似，百度统计直接把所有报表放到了左侧中，并将其分别归入到“趋势分析”、“来源分析”、“网站分析”、“访客分析”4个报表模块，使到界面非常清爽直观。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势2. 百度专属功能&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;作为中国第一大搜索引擎的百度，自己做统计工具自然要比别的工具拥有更多天然优势，例如未来可能和竞价排名系统的对接，又例如常用工具下面的“百度收录量”，可以列出百度爬虫更新你网站的频率以及真实的收录数目，相比直接在百度中通过site语法检索更为精准。&lt;/p&gt;  &lt;p&gt;下图是我在去年10月更新博客的时候不小心去掉百度统计代码之后的情况，可以看到收录量急速下降。这说明百度爬虫会将网站使用百度统计作为收录的一个考虑因素。这倒是人之常情，据说Google爬虫也会青睐于自己的统计工具，不过还没找到证据。&lt;/p&gt;  &lt;p&gt;那些依赖百度带流量的站长们可得赶紧安上百度统计~~&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="撤下百度统计代码之后收录量急速下降" border="0" alt="撤下百度统计代码之后收录量急速下降" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141229415593.png" width="584" height="213" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/20110114122944384.png" width="572" height="161" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势3. 实时统计&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;百度统计可以看到最新30分钟内的PV和UV，以及最近500个访客的一些信息。这在其他流量统计工具中比较少见。可以满足一些数据控的需求。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优势4. 页面点击图&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;页面点击图是最近这段时间百度推出的新功能，这使得百度统计成为免费流量工具中首个带热力图功能的工具。百度统计的页面点击图包含了两部分，一部分就是热力图，和国双的WebDissector热力图有些相像，不过剖析能力有限，只有4个常见维度，也只能针对点击数进行剖析，无法剖析其他KPI数据；另外就是链接点击图，和GA的网站覆盖图差不多。&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="百度统计的页面点击图" border="0" alt="百度统计的页面点击图" src="http://images.cnblogs.com/cnblogs_com/KevinYang/201101/201101141229496801.png" width="544" height="342" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;劣势&lt;/strong&gt;：百度提供的报表最多只能提供3维的连续剖析，例如来源=&amp;gt;搜索引擎=&amp;gt;关键词，相比cnzz的单维报表来说有了进步，但是剖析路径固定，用户无法根据实际需求实现高级的交叉剖析。同时数据过滤功能相对较弱。路径分析功能也比较简单，只能看前置和后置页面，并且需要预配置才可以看到报表，不灵活。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;以上就是我用过的工具介绍了，可能有描述不准确的还请指正。不知道各位做Web网站流量分析的朋友都在用什么工具，欢迎大家一起交流~&lt;/p&gt;  &lt;p&gt;== &lt;a style="font-family: comic sans ms; color: black; font-weight: bold; text-decoration: none" title="盘点国内外不同特色的Web流量分析工具" href="http://www.imkevinyang.com/2011/01/%e7%9b%98%e7%82%b9%e5%9b%bd%e5%86%85%e5%a4%96%e4%b8%8d%e5%90%8c%e7%89%b9%e8%89%b2%e7%9a%84Web%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7.html" target="_self"&gt;Kevin Yang&lt;/a&gt; == &lt;/p&gt;&lt;img src="http://www.cnblogs.com/KevinYang/aggbug/1935392.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/KevinYang/archive/2011/01/14/1935392.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/KevinYang/archive/2010/09/06/1819008.html</id><title type="text">IE无法设置短域名下Cookie</title><summary type="text">最近客户在使用我们的流量监测系统以及GA时发现了一个问题，我们统计到的数据比GA的要多很多倍，而且我们统计到的数据中，跳出率非常高，高达99%左右。 在经过一番简单排查之后找到了问题所在，Cookie设置失败。 但至于为什么会失败，这个问题查了半天，最后在StackOverflow上面有人提到了，IE从5.0开始就无法为短域名下设置Cookie。 那么多短才会出现问题呢？经过试验，发现包含点...</summary><published>2010-09-06T05:20:00Z</published><updated>2010-09-06T05:20:00Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/KevinYang/archive/2010/09/06/1819008.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/archive/2010/09/06/1819008.html"/><content type="html">&lt;p&gt;最近客户在使用我们的流量监测系统以及GA时发现了一个问题，我们统计到的数据比GA的要多很多倍，而且我们统计到的数据中，跳出率非常高，高达99%左右。&lt;/p&gt;  &lt;p&gt;在经过一番简单排查之后找到了问题所在，Cookie设置失败。&lt;/p&gt;  &lt;p&gt;但至于为什么会失败，这个问题查了半天，最后在StackOverflow上面有人提到了，IE从5.0开始就无法为短域名下设置Cookie。&lt;/p&gt;  &lt;p&gt;那么多短才会出现问题呢？经过试验，发现包含点号在内一共&lt;strong&gt;5个字符以内包括5个字符&lt;/strong&gt;都无法通过Javascript设置Cookie，不过这里有个前提，就是只有当你设置Cookie时显式指定了domain参数才会失败。也就是说如果你这么写：&lt;/p&gt;  document.cookie=&amp;quot;key=value;domain=ab.cn&amp;quot;;&lt;p&gt;Cookie设置会失败，如果去掉domain参数，直接这样写：&lt;/p&gt;document.cookie=&amp;quot;key=value&amp;quot;;&lt;p&gt;则不会出现这样的问题，即便当前域依然是ab.cn。&lt;/p&gt;&lt;p&gt;这篇文章&lt;a title="http://support.microsoft.com/kb/310676/en-us/" href="http://support.microsoft.com/kb/310676/en-us/"&gt;http://support.microsoft.com/kb/310676/en-us/&lt;/a&gt;提到了类似的问题，不过貌似和这个情况不大一样。大家也可以参考一下。&lt;/p&gt;&lt;p&gt;因为Cookie设置失败，导致我们的流量监测系统认为每个访问都是一次新的访问，自然跳出率就极高了，而GA貌似Cookie设置失败就不发数据了。&lt;/p&gt;&lt;p&gt;Firefox和Chrome没有这样的问题。&lt;/p&gt;&lt;p&gt;Mark一下，希望对遇到类似问题的人有帮助。&lt;/p&gt;&lt;p&gt;——&lt;a title="IE无法设置短域名下Cookie" href="http://www.imkevinyang.com/2010/09/IE%e6%97%a0%e6%b3%95%e8%ae%be%e7%bd%ae%e7%9f%ad%e5%9f%9f%e5%90%8d%e4%b8%8bCookie.html"&gt;&lt;em&gt;Kevin Yang&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/KevinYang/aggbug/1819008.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/KevinYang/archive/2010/09/06/1819008.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/KevinYang/archive/2010/09/06/1818981.html</id><title type="text">使用XamlReader.Load构建配置型自定义控件</title><summary type="text">我们知道，用Xaml来设计控件UI相比使用后台代码来说要容易得多，而且借助Blend或VS2010界面设计器也更容易维护，不必为了修改一个小小的背景前景色要投身茫茫码海中。但是Xaml相比代码构造来说，失去了动态配置的灵活性，而且也很难用于复制出若干相同配置的控件实例。考虑下面这样的情景：我们有一个图表控件，我们使用Blend为这个图表控件预先配置好了很多属性使其展示效果最佳，然后我们希望应用程序...</summary><published>2010-09-06T05:00:00Z</published><updated>2010-09-06T05:00:00Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/KevinYang/archive/2010/09/06/1818981.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/archive/2010/09/06/1818981.html"/><content type="html">&lt;p&gt;我们知道，用Xaml来设计控件UI相比使用后台代码来说要容易得多，而且借助Blend或VS2010界面设计器也更容易维护，不必为了修改一个小小的背景前景色要投身茫茫码海中。但是Xaml相比代码构造来说，失去了动态配置的灵活性，而且也很难用于复制出若干相同配置的控件实例。&lt;/p&gt;&lt;p&gt;考虑下面这样的情景：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;我们有一个图表控件，我们使用Blend为这个图表控件预先配置好了很多属性使其展示效果最佳，然后我们希望应用程序其他用到图表控件的地方也使用一样的配置，但是允许其他地方自由选择图表的类型，例如以饼状图、柱状图或是条形图展示。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;如果我们在代码中使用工厂模式来构造这个图表控件的话，那么我们通过让使用者传入配置参数的方式的方式来生成使用者期望的图表，这倒是很容易，但如果这个控件的预配置过程是通过Xaml来完成的，那么要实现动态配置就麻烦很多了。而且由于Silverlight的UIElemnet没有Clone方法，即使使用Xaml构建出了一个配置好了的实例，也很难复制出若干个相同配置的实例来。&lt;/p&gt;&lt;p&gt;最近项目就遇到这样的问题，最终我用XamlReader.Load方法动态加载Xaml资源文件的方式解决了这个问题。&lt;/p&gt;&lt;p&gt;下面这个Xaml文件是一个包含DataGrid控件的Grid容器，这个DataGrid有两列组成，但是数据绑定以及列名均允许动态配置。&lt;/p&gt;&amp;lt;Grid &lt;br/&gt;    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" &lt;br/&gt;    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" &lt;br/&gt;    xmlns:sdk="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" &lt;br/&gt;    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" &lt;br/&gt;    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" &lt;br/&gt;    mc:Ignorable="d" d:DesignWidth="336" d:DesignHeight="208"&amp;gt;&lt;br/&gt;    &amp;lt;sdk:DataGrid x:Name="GridReport" ItemsSource="{Binding PagedItemsSource}" AutoGenerateColumns="False" IsReadOnly="True"&amp;gt;&lt;br/&gt;        &amp;lt;sdk:DataGrid.Columns&amp;gt;&lt;br/&gt;            &amp;lt;sdk:DataGridTextColumn Binding="{Binding Member}" Header="$(MemberHeader~BounceRate)"/&amp;gt;&lt;br/&gt;            &amp;lt;sdk:DataGridTextColumn Binding="{Binding Metrics[$(Metric~Count)]}" Header="$(MetricHeader~Visitors)"/&amp;gt;&lt;br/&gt;        &amp;lt;/sdk:DataGrid.Columns&amp;gt;&lt;br/&gt;    &amp;lt;/sdk:DataGrid&amp;gt;&lt;br/&gt;    &amp;lt;sdk:DataPager x:Name="GridPager" DisplayMode="FirstLastPreviousNext" PageSize="5" Source="{Binding PagedItemsSource}"/&amp;gt;&lt;br/&gt;&amp;lt;/Grid&amp;gt;&lt;p&gt;在这里，我定义了一个简单的参数替换规则，就是"$(ConfigKey~DefaultValue)"，一旦遇到这样的字符串，则认为此字符串为可配置字符串，如果使用者传入该ConfigKey的配置，则使用配置项，否则使用默认值。如果Xaml中只是写了"$(ConfigKey)&amp;rdquo;没有默认值的话，那么表示此配置项必须由使用者传入，否则抛出异常。&lt;/p&gt;&lt;p&gt;之所以用$(~)这几个特殊字符，是因为这几个字符不会造成Blend Xaml解析器异常。&lt;/p&gt;&lt;p&gt;那么怎么实例化这个Grid容器呢？我写了一个XamlLoader辅助类来实现。&lt;/p&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;/// 支持从某个Xaml资源中创建FrameworkElement。内建缓存。&lt;br/&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;public static class XamlLoader&lt;br/&gt;{&lt;br/&gt;    public static readonly string ContentResourcesBaseUri = "/Assets/ContentResources/";&lt;br/&gt;    public static readonly string CurrentAssemblyName;&lt;br/&gt;    private static Dictionary&amp;lt;string, string&amp;gt; _cache = new Dictionary&amp;lt;string, string&amp;gt;();&lt;br/&gt;    private static Regex _parameterPattern = new Regex(@"\$\((?&amp;lt;parameter&amp;gt;\w+)~?(?&amp;lt;defValue&amp;gt;.*?)\)", RegexOptions.ExplicitCapture);&lt;br/&gt;    private static object _shareLock = new object();&lt;br/&gt;&lt;br/&gt;    static XamlLoader()&lt;br/&gt;    {&lt;br/&gt;        var assemblyName = new AssemblyName(Assembly.GetExecutingAssembly().FullName);&lt;br/&gt;        CurrentAssemblyName = assemblyName.Name;&lt;br/&gt;    }&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// 从Xaml资源中实例化FrameworkElement对象。&lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    /// &amp;lt;typeparam name="T"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="parameters"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;    public static T CreateTemplatedFrameworkElement&amp;lt;T&amp;gt;(string key, Dictionary&amp;lt;string, string&amp;gt; parameters) where T : FrameworkElement&lt;br/&gt;    {&lt;br/&gt;        string xamlString = LoadXaml(key);&lt;br/&gt;        // 搜索Xaml资源文件中的所有参数，使用parameters参数字典进行替换&lt;br/&gt;        MatchCollection matches = _parameterPattern.Matches(xamlString);&lt;br/&gt;        foreach (Match m in matches)&lt;br/&gt;        {&lt;br/&gt;            string param = m.Groups["parameter"].Value;&lt;br/&gt;            string defValue = m.Groups["defValue"].Value;&lt;br/&gt;            if (parameters.ContainsKey(param))&lt;br/&gt;            {&lt;br/&gt;                xamlString = xamlString.Replace(m.Value, parameters[param]);&lt;br/&gt;            }&lt;br/&gt;            else if (!String.IsNullOrEmpty(defValue))&lt;br/&gt;            {&lt;br/&gt;                xamlString = xamlString.Replace(m.Value, defValue);&lt;br/&gt;            }&lt;br/&gt;            else&lt;br/&gt;            {&lt;br/&gt;                throw new InvalidOperationException(String.Format("Parameter {0} is not provided.", param));&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        return XamlReader.Load(xamlString) as T;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    public static FrameworkElement CreateTemplatedFrameworkElement(string key, Dictionary&amp;lt;string, string&amp;gt; parameters)&lt;br/&gt;    {&lt;br/&gt;        return CreateTemplatedFrameworkElement&amp;lt;FrameworkElement&amp;gt;(key, parameters);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// 读取Xaml资源文件字符串。内建缓存。&lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;    public static string LoadXaml(string key)&lt;br/&gt;    {&lt;br/&gt;        string xamlString;&lt;br/&gt;        if (_cache.ContainsKey(key))&lt;br/&gt;        {&lt;br/&gt;            xamlString = _cache[key];&lt;br/&gt;        }&lt;br/&gt;        else&lt;br/&gt;        {&lt;br/&gt;            lock (_shareLock)&lt;br/&gt;            {&lt;br/&gt;                if (_cache.ContainsKey(key))&lt;br/&gt;                {&lt;br/&gt;                    xamlString = _cache[key];&lt;br/&gt;                }&lt;br/&gt;                else&lt;br/&gt;                {&lt;br/&gt;                    string resourceName = string.Format("{0};component{1}{2}.xaml", CurrentAssemblyName, ContentResourcesBaseUri, key);&lt;br/&gt;                    Uri uri = new Uri(resourceName, UriKind.Relative);&lt;br/&gt;                    StreamResourceInfo streamResourceInfo = Application.GetResourceStream(uri);&lt;br/&gt;                    using (Stream resourceStream = streamResourceInfo.Stream)&lt;br/&gt;                    {&lt;br/&gt;                        using (StreamReader streamReader = new StreamReader(resourceStream))&lt;br/&gt;                        {&lt;br/&gt;                            xamlString = streamReader.ReadToEnd();&lt;br/&gt;                            if (!String.IsNullOrEmpty(xamlString))&lt;br/&gt;                            {&lt;br/&gt;                                _cache[key] = xamlString;&lt;br/&gt;                            }&lt;br/&gt;                        }&lt;br/&gt;                    }&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        return xamlString;&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;实例化的过程就变得很容易了，直接传入模板控件所在资源文件的名称以及一个字典配置对象即可。&lt;/p&gt;XamlLoader.CreateTemplatedFrameworkElement("DataGridTemplate",&lt;br/&gt;    new Dictionary&amp;lt;string, string&amp;gt;&lt;br/&gt;    {&lt;br/&gt;        {"MemberHeader","视频名称"},&lt;br/&gt;        {"MetricHeader","访问人数"},&lt;br/&gt;    });&lt;p&gt;&lt;strong&gt;XamlReader.Load加载本程序集内自定义控件失败的问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;期间遇到一个很奇怪的问题，通过上述这种方法实例化一个定义在同一个程序集下的自定义控件却抛出AG_E_UNKNOWN_ERROR的XamlParseException。&lt;/p&gt;&amp;lt;SlApp:MyControl &lt;br/&gt;  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" &lt;br/&gt;  xmlns:SlApp="clr-namespace:SlApp;" /&amp;gt;&lt;p&gt;后来总算找到问题所在。平常当我们在UserControl中用到一个自定义控件的时候，需要添加命名空间，命令空间的格式为：&lt;/p&gt;&lt;p&gt;clr-namespace:CustomNamespace;assembly=CustomAssemblyName&lt;/p&gt;&lt;p&gt;如果控件是在当前程序集下定义的，那么后面的assembly部分就可以省略，但是使用XamlLoader.Load方法加载时这一部分却不能省去，否则就会抛出刚才提到的异常。&lt;/p&gt;&lt;p&gt;正确的写法应该是：&lt;/p&gt;&amp;lt;SlApp:MyControl &lt;br/&gt;     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" &lt;br/&gt;    xmlns:SlApp="clr-namespace:SlApp;assembly=SlApp" /&amp;gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;mdash;&amp;mdash;&lt;a href="http://www.imkevinyang.com/2010/09/%e4%bd%bf%e7%94%a8XamlReader.Load%e6%9e%84%e5%bb%ba%e9%85%8d%e7%bd%ae%e5%9e%8b%e8%87%aa%e5%ae%9a%e4%b9%89%e6%8e%a7%e4%bb%b6.html" title="使用XamlReader.Load构建配置型自定义控件"&gt;&lt;em&gt;Kevin Yang&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/KevinYang/aggbug/1818981.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/KevinYang/archive/2010/09/06/1818981.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/KevinYang/archive/2010/07/30/1788366.html</id><title type="text">Java/Js如何使用正则表达式匹配嵌套Html标签</title><summary type="text">以前写过一篇文章讲解如何使用正则表达式完美解决Html嵌套标签的匹配问题（使用正则表达式匹配嵌套Html标签），但是里头用到了平衡组这样的高级特性，貌似只有DotNet还有Perl正则引擎支持，因此通用性不高。有朋友留言说Java直接使用的话会报错。我后来查了一下，发现Java正则引擎支持的特性相对比较少。在1.6版本中不能使用命名组（貌似1.7的时候开始支持了），否则会报以下错误，更别说平衡组了...</summary><published>2010-07-29T17:41:00Z</published><updated>2010-07-29T17:41:00Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/KevinYang/archive/2010/07/30/1788366.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/archive/2010/07/30/1788366.html"/><content type="html">&lt;p&gt;以前写过一篇文章讲解如何使用正则表达式完美解决Html嵌套标签的匹配问题（&lt;a title="使用正则表达式匹配嵌套Html标签" href="http://www.imkevinyang.com/2009/07/%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8C%B9%E9%85%8D%E5%B5%8C%E5%A5%97html%E6%A0%87%E7%AD%BE.html" target="_blank"&gt;使用正则表达式匹配嵌套Html标签&lt;/a&gt;），但是里头用到了平衡组这样的高级特性，貌似只有DotNet还有Perl正则引擎支持，因此通用性不高。有朋友留言说Java直接使用的话会报错。我后来查了一下，发现Java正则引擎支持的特性相对比较少。在1.6版本中不能使用命名组（貌似1.7的时候开始支持了），否则会报以下错误，更别说平衡组了。因此感觉要实现无限级的嵌套匹配不大现实。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index&lt;span style="background-color: #ffffff;"&gt; XX&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;在网上搜了好久也没找到完美的解决方案。不过，我们可以实现有限级Html嵌套标签匹配。思路相对于无限级来说就简单了好多，不需要那么多高级的特性。&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&amp;lt;div id='container'&amp;gt;&lt;br /&gt;    &amp;lt;div style='background-color:gray;' id='footer'&amp;gt;&lt;br /&gt;        &amp;lt;a id='gotop' href='#' onclick='MGJS.goTop();return false;'&amp;gt;Top&amp;lt;/a&amp;gt;&lt;br /&gt;        &amp;lt;a id='powered' href='http://wordpress.org/'&amp;gt;WordPress&amp;lt;/a&amp;gt;&lt;br /&gt;        &amp;lt;div id='copyright'&amp;gt;&lt;br /&gt;            Copyright &amp;amp;copy; 2009 简单生活 &amp;mdash;&amp;mdash; Kevin Yang的博客&lt;br /&gt;         &amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;div id='themeinfo'&amp;gt;&lt;br /&gt;            Theme by &amp;lt;a href='http://www.neoease.com/'&amp;gt;mg12&amp;lt;/a&amp;gt;. Valid &amp;lt;a href='http://validator.w3.org/check?uri=referer'&amp;gt;XHTML 1.1&amp;lt;/a&amp;gt;&lt;br /&gt;            and &amp;lt;a href='http://jigsaw.w3.org/css-validator/'&amp;gt;CSS 3&amp;lt;/a&amp;gt;.&lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;p&gt;在上面这个示例中，我们打算匹配id为footer的这个嵌套div，而且&lt;strong&gt;假设我们预先知道footer这个div里面最多只会嵌套一级div&lt;/strong&gt;。更多级的情况我们一会儿再讲。&lt;/p&gt;&lt;p&gt;footer的开始和结束标签匹配很简单：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&amp;lt;div [^&amp;gt;]*id='footer'[^&amp;gt;]*&amp;gt;......(这里的省略号是一会要填写的)&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;夹在开始和结束标签之间的内容无非有两种情况：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;内容A: div标签，并且此div内无嵌套div &lt;/li&gt;&lt;li&gt;内容B: 任意其他内容 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;然后就是这两种内容的不断重复而已。正则表示如下：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;(&lt;span style="color: #ff0000;"&gt;&amp;lt;div[^&amp;gt;]*&amp;gt;.*?&amp;lt;/div&amp;gt;&lt;/span&gt;|&lt;span style="color: #008000;"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;)*?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;注意最后面的问号必须要加上，否则由于正则的贪婪匹配特性，footer的闭合标签会匹配失误。&lt;/p&gt;&lt;p&gt;OK了，&lt;strong&gt;匹配最多嵌套一级div&lt;/strong&gt;的正则表达式如下：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&amp;lt;div [^&amp;gt;]*id='footer'[^&amp;gt;]*&amp;gt;(&lt;span style="color: #ff0000;"&gt;&amp;lt;div[^&amp;gt;]*&amp;gt;.*?&amp;lt;/div&amp;gt;&lt;/span&gt;|.)*?&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;那么如果footer标签里头最多会嵌套两级div的话怎么办呢？&lt;/p&gt;&lt;p&gt;其实也不难，我们只需要把上面的&amp;ldquo;内容A&amp;rdquo;部分中的点号稍作替换即可。修改如下：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&amp;lt;div [^&amp;gt;]*id='footer'[^&amp;gt;]*&amp;gt;(&lt;span style="color: #ff0000;"&gt;&amp;lt;div[^&amp;gt;]*&amp;gt;&lt;span style="color: #0000ff;"&gt;(&amp;lt;div[^&amp;gt;]*&amp;gt;.*?&amp;lt;/div&amp;gt;|.)&lt;/span&gt;*?&amp;lt;/div&amp;gt;&lt;/span&gt;|.)*?&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;到这里你可能就知道，如果要匹配最多嵌套三级div的话，正则应该怎么写了：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&amp;lt;div [^&amp;gt;]*id='footer'[^&amp;gt;]*&amp;gt;(&lt;span style="color: #ff0000;"&gt;&amp;lt;div[^&amp;gt;]*&amp;gt;&lt;span style="color: #0000ff;"&gt;(&amp;lt;div[^&amp;gt;]*&amp;gt;&lt;span style="color: #ff8000;"&gt;(&amp;lt;div[^&amp;gt;]*&amp;gt;.*?&amp;lt;/div&amp;gt;|.)&lt;/span&gt;*?&amp;lt;/div&amp;gt;|.)&lt;/span&gt;*?&amp;lt;/div&amp;gt;&lt;/span&gt;|.)*?&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;所以实际上，只要你的html结构不是特别复杂的话，也就是说嵌套不会很深的话，那么你完全可以使用这种方式来匹配嵌套html标签。&lt;/p&gt;&lt;p&gt;这个正则在Java和Javascript中都可以使用，因为它没有用到任何高级特性。&lt;/p&gt;&lt;p&gt;&amp;mdash;&amp;mdash;&lt;a title="Java/Js如何使用正则表达式匹配嵌套Html标签" href="http://www.imkevinyang.com/2010/07/Java/Js%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e5%8c%b9%e9%85%8d%e5%b5%8c%e5%a5%97Html%e6%a0%87%e7%ad%be.html"&gt;&lt;em&gt;Kevin Yang&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/KevinYang/aggbug/1788366.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/KevinYang/archive/2010/07/30/1788366.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/KevinYang/archive/2010/07/23/1784008.html</id><title type="text">几个有趣的Javascript Hack</title><summary type="text">在网上看到几个有意思的Javascript代码，和大家分享一下。1. 直接在浏览器中编辑网页内容访问任意网站，在地址栏输入以上代码，会发生当前网页已经变成编辑模式了。 2. 舞动的图片这段js代码可能很多人已经见识过了。他的作用就是让网页上的图片飞舞起来。 3. 密码框密文变明文访问一个带密码框的页面，然后地址栏输入以上代码，就会弹出当前密码框中的密码了，别干坏事哟~ ——...</summary><published>2010-07-23T12:08:00Z</published><updated>2010-07-23T12:08:00Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/KevinYang/archive/2010/07/23/1784008.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/archive/2010/07/23/1784008.html"/><content type="html">&lt;p&gt;在网上看到几个有意思的Javascript代码，和大家分享一下。&lt;/p&gt;&lt;p&gt;1. 直接在浏览器中编辑网页内容&lt;/p&gt;javascript:document.body.contentEditable='true';document.designMode='on'; void(0);&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font&gt;&lt;/font&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;访问任意网站，在地址栏输入以上代码，会发生当前网页已经变成编辑模式了。&lt;/p&gt;&lt;p&gt;&lt;img height="195" width="581" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/JavascriptHack_1161E/image_113596b7-b2be-4426-8fea-ff8abcefccb8.png" alt="在浏览器中编辑网页内容" title="在浏览器中编辑网页内容" style="display: inline;" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;2. 舞动的图片&lt;/p&gt;javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.images; DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=(Math.sin(R*x1+i*x2+x3)*x4+x5)+"px"; DIS.top=(Math.cos(R*y1+i*y2+y3)*y4+y5)+"px"}R++}setInterval('A()',5); void(0);&lt;p&gt;这段js代码可能很多人已经见识过了。他的作用就是让网页上的图片飞舞起来。&lt;/p&gt;&lt;p&gt;&lt;img height="215" width="542" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/JavascriptHack_1161E/image_4a6c67db-8941-48eb-b27a-cf376b3849da.png" alt="舞动的图片" title="舞动的图片" style="display: inline;" /&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3. 密码框密文变明文&lt;/p&gt;javascript:(function(){var s,F,j,f,i;s="";F=document.forms;for(j=0;j&amp;lt;F.length;++j){f=F[j];for(i=0;i&amp;lt;f.length;++i){if(f[i].type.toLowerCase()=="password")s+=f[i].value+"\n";}}if(s)alert("Passwords in forms on this page:\n\n"+s);else alert("There are no passwords in forms on this page.");})();&lt;p&gt;访问一个带密码框的页面，然后地址栏输入以上代码，就会弹出当前密码框中的密码了，别干坏事哟~&lt;/p&gt;&lt;p&gt;&lt;img height="288" width="302" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/JavascriptHack_1161E/image_b1a8bbd4-ee79-4773-bc83-23433367987e.png" alt="密码框密文变明文" title="密码框密文变明文" style="display: inline;" /&gt; &lt;/p&gt;&lt;p&gt;&amp;mdash;&amp;mdash;&lt;a href="http://www.imkevinyang.com/2010/07/%e5%87%a0%e4%b8%aa%e6%9c%89%e8%b6%a3%e7%9a%84Javascript%20Hack.html" title="几个有趣的Javascript Hack"&gt;&lt;em&gt;Kevin Yang&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/KevinYang/aggbug/1784008.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/KevinYang/archive/2010/07/23/1784008.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/KevinYang/archive/2010/07/20/1781779.html</id><title type="text">Hilo: Windows 7下C++应用程序开发实战演练</title><summary type="text">英文原文链接：Hilo: Windows 7 C++ Development Walkthroughs "Hilo"由一系列文章以及示例代码组成的，它向你展示了如何释放Windows 7、Visual Studio 2010还有Visual C++的强大力量，来构建高性能，高响应的富客户端程序。Hilo提供了源代码以及编写指导，帮助你设计和开发令人瞩目的触摸式Windows应...</summary><published>2010-07-20T14:59:00Z</published><updated>2010-07-20T14:59:00Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/KevinYang/archive/2010/07/20/1781779.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/archive/2010/07/20/1781779.html"/><content type="html">&lt;div class="statement"&gt;   &lt;p&gt;&lt;/p&gt; 英文原文链接：&lt;a title="Hilo: Windows 7 C++ Development Walkthroughs" href="http://msdn.microsoft.com/en-us/windows/ff686707.aspx" target="_blank"&gt;Hilo: Windows 7 C++ Development Walkthroughs&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;quot;Hilo&amp;quot;由一系列文章以及示例代码组成的，它向你展示了如何释放Windows 7、Visual Studio 2010还有Visual C++的强大力量，来构建高性能，高响应的富客户端程序。Hilo提供了源代码以及编写指导，帮助你设计和开发令人瞩目的触摸式Windows应用程序。&lt;/p&gt;  &lt;p&gt;在接下来的几周时间里，我们将会在MSDN上发布一系列文章，讲述如何设计和实现一个可以浏览、检索和处理图像照片的触摸式Windows应用程序。这些文章将会涵盖Windows 7的核心技术，描述了如何将这些技术融合到一起来创建一个非常棒的用户体验，并且也会对应用程序的设计和实现等细节做详细的阐述。你可以在这个&lt;a href="http://msdn.microsoft.com/library/ff708696.aspx" target="_blank"&gt;这里&lt;/a&gt;找到此系列的第一篇文章。它对 Hilo做了一个概述性的介绍，并且说明了此系列中的这些文章和示例程序的所要达到的目标。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/HiloWindows7C_1422B/clip_image001_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/HiloWindows7C_1422B/clip_image001_thumb.jpg" width="244" height="181" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;我们接下来会逐步放出Hilo的相关源代码。第一次Hilo的发布包含了一个Hilo浏览器程序的源代码。这个程序实现了一种创新的旋转木马式的导航界面。这是触摸式的，你可以使用触摸手势快速的浏览和检索。你可以在&lt;a href="http://code.msdn.microsoft.com/Hilo"&gt;这里&lt;/a&gt;下载到此程序的源代码。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/HiloWindows7C_1422B/clip_image002_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/HiloWindows7C_1422B/clip_image002_thumb.jpg" width="244" height="176" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hilo文章系列，包括与此相关的源代码，是用来让你快速上手一些技术的开发，并且向你展示了如何在自己的应用程序中利用到Windows核心技术的优势。&lt;/p&gt;  &lt;p&gt;如何开始&lt;/p&gt;  &lt;p&gt;1. 为了编译和运行Hilo浏览器程序，你需要安装Visual Studio 2010以及Visual C++。你可以在这里下载到免费的Visual C++ 2010 Express版本。&lt;/p&gt;  &lt;p&gt;2. 安装完Visual C++ 2010 Express之后，解压缩Hilo浏览器程序的源代码，双击打开Hilo.sln解决方案文件。&lt;/p&gt;  &lt;p&gt;3. 在编译菜单中选择重新编译整个Hilo浏览器程序。&lt;/p&gt;  &lt;p&gt;4. 按F5在调试模式下运行此程序。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/KevinYang/aggbug/1781779.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/KevinYang/archive/2010/07/20/1781779.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/KevinYang/archive/2010/07/20/1781017.html</id><title type="text">晒晒自己电脑里的常用工具</title><summary type="text">前阵子在顾磊的博客上看到他分享自己电脑上辅助软件的文章，觉得不错，于是决定也来晒一晒自己电脑里头的常用工具，分享促进进步，如果你也是个工具控的话，欢迎你也来晒晒。Launchy——快速启动程序两年前一个同事向我推荐了这款软件，一直受用至今。每天我都会无数次的按下Alt+空格，然后输入我要启动的程序的名字（大部分情况下我只需要键入程序的前两个字母即可），直接就打开我要的程序了...</summary><published>2010-07-19T18:55:00Z</published><updated>2010-07-19T18:55:00Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/KevinYang/archive/2010/07/20/1781017.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/archive/2010/07/20/1781017.html"/><content type="html">&lt;p&gt;前阵子在&lt;a href="http://www.cnblogs.com/kyo-yo/"&gt;顾磊&lt;/a&gt;的博客上看到他分享自己电脑上辅助软件的文章，觉得不错，于是决定也来晒一晒自己电脑里头的常用工具，分享促进进步，如果你也是个工具控的话，欢迎你也来晒晒。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Launchy&amp;mdash;&amp;mdash;快速启动程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;两年前一个同事向我推荐了这款软件，一直受用至今。&lt;/p&gt;&lt;p&gt;&lt;img style="margin: 0px; display: inline;" class="wlDisabledImage" title="image[3]" alt="image[3]" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/54bcf57e86df_13DD2/image%5B3%5D_c715e336-4673-459e-9802-bdc18f97946e.png" height="126" width="300" /&gt;&lt;/p&gt;&lt;p&gt;每天我都会无数次的按下Alt+空格，然后输入我要启动的程序的名字（大部分情况下我只需要键入程序的前两个字母即可），直接就打开我要的程序了。不用像以前在堆满图标的桌面上或者在臃肿的开始菜单中定位该程序了。&lt;/p&gt;&lt;p&gt;Launchy还支持插件机制，通过插件你可以实现快速搜索，快速计算等。不过这些功能我很少用到。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;使用小技巧：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Launchy默认会检索开始菜单还有桌面等常用位置，于是当你键入程序名的时候可能会出来太多干扰信息，而且有时候程序的名字比较长，不好记。我个人喜欢建立一个专门用于存放快捷方式的目录，让Launchy只检索这个目录。然后为每个程序起一个好记的名字。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Everything&amp;mdash;&amp;mdash;没有比他搜索得更快的了&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;以前我也写过文章（&lt;a href="http://www.imkevinyang.com/2009/07/%e5%8f%b2%e4%b8%8a%e6%9c%80%e5%bf%ab%e7%9a%84%e6%90%9c%e7%b4%a2%e5%b7%a5%e5%85%b7everything.html"&gt;【推荐】史上最快的搜索工具&amp;mdash;&amp;mdash;Everything&lt;/a&gt;）推荐过这款工具。自从有了这个工具之后，我就很少打开资源管理器来查找资料了。一个Alt+G调出搜索窗口，然后输入要查找的资料的关键字，以空格分开，例如我想查找C#相关的电子书，那么我可以输入&amp;ldquo;csharp chm|pdf&amp;rdquo;，半秒不用的时间就可以列出所有符合条件的材料了。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/54bcf57e86df_13DD2/image_f3e1c755-31cc-4bd8-b473-4bcc343ff86a.png" height="250" width="499" /&gt; &lt;/p&gt;&lt;p&gt;Everything还支持正则表达式，并且可以集成到右键菜单，实现对某个特定文件夹的检索，内置一个简单的Web服务器，允许其他人通过浏览器访问Everything进行检索。功能非常强大，而占用空间非常小，120G硬盘，索引也就几M而已。唯一的不足就是只能检索文件名和路径，不支持内容检索。不过话说回来，我们一天能有多少次用到内容检索呢？即使需要，我们也会到具体的软件里头去搜索。各司其责嘛。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Lingoes&amp;mdash;&amp;mdash;小巧而强大的免费词典工具&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;相信很多人都曾用过金山词霸这类词典软件，体积庞大不说，还收费（现在是不是免费我就不知道了）。Lingoes是国人开发的一款非常小巧，但是功能非常完整好用的词典软件。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/54bcf57e86df_13DD2/image_f50737fd-c49f-4bf7-9fa5-2ff21bb2e189.png" height="194" width="392" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;它加上一些基本词典总体积也是十几M而已，算是非常小巧了。但是功能可不逊，屏幕取词，屏幕阅读等功能一点都不少，而且现有的词典质量也非常高，如果你硬盘大的话，你可以下个维基百科还有韦氏词典（需要几百M的空间）。而且他的界面也非常美观，让人用起来非常舒服。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Foxit Reader&amp;mdash;&amp;mdash;Acrobat Reader的完美替代品&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;很多人都用过Adobe的Acrobat PDF阅读器。但是那个阅读器体积实在过于庞大，启动也很慢。Foxit Reader一面世就受到很多人的喜欢。因为他体积小，最简安装只需要3M。但功能一点都不含糊。最近Foxit Software公司又决定把原先收费版的Foxit Reader Pro给免费了，赢得了不错口碑。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/54bcf57e86df_13DD2/image_4df27a50-c7c1-49a1-8c88-d0a68624a5c8.png" height="154" width="159" /&gt; &lt;/p&gt;&lt;p&gt;Foxit Reader的渲染效果上次看到有人评测过，基本和Adobe的官方PDF阅读器不相上下。我个人的阅读感受也挺不错的。没有什么不舒服。功能上，因为我不怎么用过Adobe的那个阅读器，所以不知道是不是很全，反正我需要的都有了，包括文档目录，书签，注释，文字拷贝等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;StrokeIt&amp;mdash;&amp;mdash;把鼠标变成程序的指挥棒&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;鼠标手势在很多浏览器中都非常流行，因为它非常直观方便，也特别适合懒人。StrokeIt把鼠标手势带到了Windows系统。 StrokeIt预定义的鼠标手势非常直观。按下右键向左拖动表示后退，向右表示前进，向右上方表示最大化窗口，左下方表示最小化。当你用着StrokeIt的时候，你会感觉自己像一个指挥家，挥动着指挥棒来指使你的电脑程序干活。感觉非常不错。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/54bcf57e86df_13DD2/image_a55f7e7b-78d2-45fa-b20e-0188aecf8402.png" height="266" width="425" /&gt; &lt;/p&gt;&lt;p&gt;StrokeIt很强大，允许你为任意程序定制适合自己的手势命令。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Windows Live Writer&amp;mdash;&amp;mdash;博客离线编辑器中的佼佼者&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;写博的人一般不喜欢在博客后台直接编辑文章，这是出于很多考虑。一个是容易因为网络问题造成文章修改丢失，还有一个是无法方便的上传图片，样式编辑不方便等等。离线编辑器解决了这些问题。而微软推出的Live Writer则是博客离线编辑工具中编辑功能最为强大的，而且还是免费的。通过插件还可以扩展其功能，例如我经常用到的Dynamic Template插件，允许你往页面中插入模板化的文本，非常强大，可以参考我以前写的文章&lt;a href="http://www.imkevinyang.com/2009/04/dynamic-template%e9%9d%9e%e5%b8%b8%e5%a5%bd%e7%94%a8%e7%9a%84windows-live-writer%e5%8a%a8%e6%80%81%e6%a8%a1%e6%9d%bf%e6%8f%92%e4%bb%b6.html"&gt;Dynamic Template&amp;mdash;&amp;mdash;非常好用的Windows Live Writer动态模板插件&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;还有两款博客离线编辑器ScribeFire以及Zoundry Raven也很有特点，其中ScribeFire是以浏览器插件的形式存在的，支持Firefox、Chrome以及Safari，允许使用css的方式来格式化文本而不像Writer一样通过Font元素来格式化文本，而且也支持直接粘贴图片；而Zoundry的文章管理功能很强大，这正是LiveWriter所欠缺的。但是这两者的编辑体验都不及Live Writer那样，真正做到所见即所得。这也是我为什么喜欢用Writer写博客的缘故。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OneNote&amp;mdash;&amp;mdash;让我爱不释手的笔记本软件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当我第一次用上OneNote的时候，我就深深爱上了她&amp;mdash;&amp;mdash;很抱歉，我用了这么肉麻的词，让你起鸡皮疙瘩了是我的过错。&lt;/p&gt;&lt;p&gt;在OneNote之前，我一直在寻找一款适合自己的知识管理软件，尝试过很多网上评价不错的软件，一般用不到两天就被我抛弃了，大多数是因为界面太丑陋，编辑功能太简陋或者不直观导致我没有使用的欲望。有一次看到同事在用OneNote做会议记录，我看着不错就安装了一个试试。体验完只有一个感受，&amp;ldquo;就是她了&amp;rdquo;。从此个人的知识管理，包括日记都是使用OneNote来整理了。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/54bcf57e86df_13DD2/image_0d76b02f-a769-4b10-ad71-48788aa0e373.png" height="295" width="494" /&gt; &lt;/p&gt;&lt;p&gt;OneNote借鉴了我们传统的纸质笔记本的理念，把资料管理分为三个级别，笔记本&amp;gt;分区&amp;gt;页面。和其他电子笔记本软件不同的是，OneNote页面就像一块大画布，你可以在任意位置输入任何信息，包括文本信息，音视频信息，或者随处粘贴任何图片，绘制任何图形。如果你使用的是平板电脑的话那就更便捷了，你可以像在纸上一样涂鸦。这种整理资料的方式极大的释放了人们的想象力。加上不错的搜索功能，东西再多也不乱了。她还有一个对于办公一族非常实用的功能，就是实时会议共享。几个人坐在一块，只要有无线网就可以直接通过OneNote共享笔记了，而无须通过额外的服务器。可惜这个功能在OneNote2010中出于性能以及安全性考虑而被取消了，非常遗憾。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Firefox&amp;mdash;&amp;mdash;浏览器中的瑞士军刀&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;作为Web开发人员，我电脑里头安装了N多种浏览器，IE8、Maxthon、Firefox、Chrome、Opera、Safari等等。每一种浏览器我都用过很长一段时间，其中Firefox是我个人觉得功能最为强大的，但是他的强大不在于他自身，而在于其背后庞大的插件库。这是任何浏览器，包括现在骨粉们所推崇的Chrome浏览器，都比不上的，至少暂时比不上。基本上我能想象到的和不能想象到的需求，都能在插件库中找到满足要求的（有点夸张喔~~）。所以说Firefox是一把瑞士军刀一点都不过分。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fiddler&amp;mdash;&amp;mdash;Web分析强力助手&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;做Web分析经常需要分析HTTP消息。Fiddler是微软推出的一款小而强的免费HTTP分析工具，关于它的介绍，我在以前的文章（&lt;a href="http://www.imkevinyang.com/2009/11/%E3%80%90%E6%8E%A8%E8%8D%90%E3%80%91%E4%B8%A4%E6%AC%BEhttp%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7%E7%9A%84%E6%AF%94%E8%BE%83.html"&gt;【推荐】两款HTTP流量分析工具的比较&lt;/a&gt;）中也有提到。他的功能基本可以满足各种需求，如果不满足，你甚至可以自己编写简单的插件来实现。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Expresso&amp;mdash;&amp;mdash;正则表达式工作室&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.ultrapico.com/"&gt;Ultrapico Expresso&lt;/a&gt;是我工作中经常使用的一个非常强大的正则表达式构建、测试以及代码生成工具。它能够对你构建的正则表达式进行解析、验证，并输出解析结果，提供性能测试工具，支持C#、VB等代码生成，最重要的是，他提供了一个非常方便强大的正则表达式语法构建面板，即使你对正则表达式生疏了，也能在它的帮助下构建出你想要的正则模式来。而且，它还免费获取授权码，无需费心找破解了。软件里自带的帮助文档以及正则表达式库可以帮助你快速从正则菜鸟升级为正则高手。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Notepad2&amp;mdash;&amp;mdash;你可以把Windows自带的记事本给扔了&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;很多人都不喜欢用Windows自带的记事本工具，原因是因为他功能过于简单，并且不支持大容量文本。我也从来不用。电脑里头有很多替代品，例如Notepad2，Notepad++以及UltraEdit32。这三款软件我都用过很长一段时间，UltraEdit32是处理大容量文本性能最强大的一款，功能和Notepad++类似，也是非常全面强大。但强大也带来臃肿，这两款软件的打开速度让我不是很满意。因此我习惯于使用Notepad2来作为日常的文本编辑器。他的功能在大多数情况下已经够我用了。包括设置文件编码，代码语法着色，正则查找等。而且对大容量文本支持也还行。至少和Notepad++是一样的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Google Reader&amp;mdash;&amp;mdash;让知识随时随地分享&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;看到这个标题你可能会一愣，因为首先Google Reader和上面提到的各式工具似乎不是一个种族的，再者，Google Reader不是一个RSS阅读器么，和知识分享有什么关系？&lt;/p&gt;&lt;p&gt;事实上，Google Reader已经成为我生活中不可或缺的一个获取知识、分享知识的工具了。&lt;/p&gt;&lt;p&gt;Google Reader和很多RSS阅读器不一样的是，他会保存RSS的历史内容。例如我才订阅了某个人的博客，这个时候从技术上来说，我只能看到该RSS的最新内容，但是如果这个RSS以前已经有人订阅过了，那么我就可以看到以前的历史内容。Google Reader只要收到有人订阅，就开始将数据保存下来。而且在Google Reader中，你可以随时和别人分享你阅读过的信息，而不必局限于Google Reader里头的内容。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/54bcf57e86df_13DD2/image_d15b6fff-c6ae-40ae-82a7-dd0a5f3fa5c8.png" height="152" width="245" /&gt; &lt;/p&gt;&lt;p&gt;你只要把上面这个&amp;ldquo;Note in Reader&amp;rdquo;拖放到书签栏上，以后当你在网上看到任何有意思的文章，你就可以选中一段文本，然后点击这个书签，就可以将该文章分享给你的Google Reader好友。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/54bcf57e86df_13DD2/image_5eb3236d-f849-4e84-8599-051cd623a6f9.png" height="216" width="367" /&gt; &lt;/p&gt;&lt;p&gt;现在在互联网上获取信息是越来越容易了，但是信息的质量也在降低，如何从庞大的信息源中取出那些对自己有用的信息不是一件轻松事。查看别人分享的内容，可以让我们快速发现一些质量比较高的知识。同时，为了回馈，我们也需要把自己认为好的文章分享出来。每个人关注的兴趣面是不同的，这也可以从每个好友分享的内容看出来。有些人分享纯粹技术的很多，有些人喜欢分享一些有趣的新闻，有些人喜欢分享思维学习的一些理论。通过经常阅读好友分享的内容，你会对这些好友的兴趣有更多的了解，从而就能更有选择性的阅读信息。&lt;/p&gt;&lt;p&gt;我的Google Reader页面是&lt;a title="http://www.google.com/profiles/114279556099966673203" href="http://www.google.com/profiles/114279556099966673203"&gt;http://www.google.com/profiles/114279556099966673203&lt;/a&gt;，大家可以在Buzz上Follow me，这样就可以在Reader中看到我分享的文章了。&lt;/p&gt;&lt;p&gt;&amp;mdash;&amp;mdash;&lt;a title="晒晒自己电脑里的常用工具" href="http://www.imkevinyang.com/2010/07/%e6%99%92%e6%99%92%e8%87%aa%e5%b7%b1%e7%94%b5%e8%84%91%e9%87%8c%e7%9a%84%e5%b8%b8%e7%94%a8%e5%b7%a5%e5%85%b7.html"&gt;&lt;em&gt;Kevin Yang&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/KevinYang/aggbug/1781017.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/KevinYang/archive/2010/07/20/1781017.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/KevinYang/archive/2010/07/09/1774065.html</id><title type="text">Visual Studio编辑器一次缩进/反缩进4个空格</title><summary type="text">在代码中使用Tab作为缩进并不是一个好的习惯，因为Tab并不是一个打印字符，而是一个控制字符，也就是说它在不同文本编辑器中显示的宽度不一定是相同的，因而显示效果容易产生不一致。而空格则具有很好的适应性，因为它就是一个普通字符，因此和其他字符一样受到相同的影响，显示效果会趋于一致。那些使用Tab作为缩进的人通常是因为用Tab做缩进的话，可以一次删除一个缩进单位，非常方便。而如果按照一个Tab对应4个...</summary><published>2010-07-08T18:47:00Z</published><updated>2010-07-08T18:47:00Z</updated><author><name>Kevin Yang</name><uri>http://www.cnblogs.com/KevinYang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/KevinYang/archive/2010/07/09/1774065.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/KevinYang/archive/2010/07/09/1774065.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在代码中使用Tab作为缩进并不是一个好的习惯，因为Tab并不是一个打印字符，而是一个控制字符，也就是说它在不同文本编辑器中显示的宽度不一定是相同的，因而显示效果容易产生不一致。而空格则具有很好的适应性，因为它就是一个普通字符，因此和其他字符一样受到相同的影响，显示效果会趋于一致。&lt;/p&gt;&lt;p&gt;那些使用Tab作为缩进的人通常是因为用Tab做缩进的话，可以一次删除一个缩进单位，非常方便。而如果按照一个Tab对应4个空格来转换的话，要删除一个缩进单位则需要删除4个空格，相对不便。&lt;/p&gt;&lt;p&gt;实际上，现在很多文本编辑器包括Visual Studio对Tab和空格的转换都有很好的支持，如果你设置了坚持使用空格，那么通过&lt;strong&gt;快捷键Tab和Shift+Tab可以实现一次插入或者删除4个空格&lt;/strong&gt;，和使用Tab做缩进的效果是一样的。&lt;/p&gt;&lt;p&gt;这下你使用空格做缩进就不会感到不便了。&lt;/p&gt;&lt;p&gt;&amp;mdash;&amp;mdash;&lt;a href="http://www.imkevinyang.com/2010/07/Visual%20Studio%e7%bc%96%e8%be%91%e5%99%a8%e4%b8%80%e6%ac%a1%e7%bc%a9%e8%bf%9b/%e5%8f%8d%e7%bc%a9%e8%bf%9b4%e4%b8%aa%e7%a9%ba%e6%a0%bc.html" title="Visual Studio编辑器一次缩进/反缩进4个空格"&gt;&lt;em&gt;Kevin Yang&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/KevinYang/aggbug/1774065.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/KevinYang/archive/2010/07/09/1774065.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
