<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8974882</id><updated>2011-10-11T04:49:16.101-07:00</updated><category term='UI Automation'/><category term='scalablility'/><category term='MVC'/><category term='Performance'/><category term='asynchronous'/><category term='cache'/><category term='MVP'/><category term='Memory Leaks'/><category term='scalable'/><category term='failure'/><category term='FileStream'/><category term='data classification'/><category term='losing data'/><category term='ASP.NET'/><title type='text'>Wenfeng's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default?start-index=101&amp;max-results=100'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>231</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8974882.post-4632151183706163647</id><published>2009-06-17T14:14:00.000-07:00</published><updated>2009-07-04T14:50:54.885-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><title type='text'>ASP.NET MVC</title><content type='html'>&lt;a linkindex="103" href="http://msdn.microsoft.com/magazine/cc337884"&gt;Building Web Apps without Web Forms&lt;/a&gt; by Chris Tavares&lt;br /&gt;&lt;a linkindex="142" id="ctl00_mainContentContainer_ctl12" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl12',this);" href="http://msdn.microsoft.com/en-us/magazine/dd252940.aspx"&gt;Cutting Edge: ASP.NET Presentation Patterns&lt;/a&gt;                                                   by Dino Esposito&lt;br /&gt;&lt;span&gt;                                                            &lt;/span&gt;                                                             &lt;span&gt;                                                                       &lt;a linkindex="140" id="ctl00_mainContentContainer_ctl25" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl25',this);" class="ContentsTypeSubTitle" href="http://msdn.microsoft.com/en-us/magazine/dd695917.aspx"&gt;The Life And Times of an ASP.NET MVC Controller&lt;/a&gt;                                                             by &lt;/span&gt;Scott Allen&lt;br /&gt;&lt;span&gt;                                        &lt;/span&gt;                                         &lt;span&gt;                                                   &lt;a linkindex="121" id="ctl00_mainContentContainer_ctl04" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl04',this);" class="ArticleHeadlineText" href="http://msdn.microsoft.com/en-us/magazine/dd943053.aspx"&gt;RESTful Services With ASP.NET MVC&lt;/a&gt;                                         by &lt;/span&gt;Aaron Skonnard&lt;br /&gt;&lt;span&gt;                                        &lt;/span&gt;                                         &lt;span&gt;                                                   &lt;a linkindex="127" id="ctl00_mainContentContainer_ctl10" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl10',this);" class="ArticleHeadlineText" href="http://msdn.microsoft.com/en-us/magazine/dd942838.aspx"&gt;Building Testable ASP.NET MVC Applications&lt;/a&gt;                                         by &lt;/span&gt;Justin Etheredge&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-4632151183706163647?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/4632151183706163647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=4632151183706163647' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/4632151183706163647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/4632151183706163647'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2009/06/aspnet-mvc.html' title='ASP.NET MVC'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-6849044549929474041</id><published>2009-06-14T13:59:00.000-07:00</published><updated>2009-06-14T14:02:11.348-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FileStream'/><title type='text'>Programming with FileStreams in SQL Server 2008</title><content type='html'>&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;a linkindex="124" id="ctl00_mainContentContainer_ctl35" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl35',this);" class="ContentsTypeSubTitle" href="http://msdn.microsoft.com/en-us/magazine/dd695918.aspx"&gt;Programming with FileStreams in SQL Server 2008&lt;/a&gt; by &lt;/span&gt;Bob Beauchemin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-6849044549929474041?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/6849044549929474041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=6849044549929474041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6849044549929474041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6849044549929474041'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2009/06/programming-with-filestreams-in-sql.html' title='Programming with FileStreams in SQL Server 2008'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-7898193116941849132</id><published>2009-06-13T12:13:00.000-07:00</published><updated>2009-06-13T12:19:05.709-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data classification'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><title type='text'>Build Better Data-Driven Apps With Distributed Caching</title><content type='html'>&lt;a href="http://msdn.microsoft.com/en-us/magazine/dd861287.aspx"&gt;Build Better Data-Driven Apps With Distributed Caching &lt;/a&gt;by Aaron Dunnington.&lt;br /&gt;&lt;br /&gt;Although this article is about Velocity, a feature MS product, the idea of data classification as reference data, activity data, and resource data can be applied anywhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-7898193116941849132?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/7898193116941849132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=7898193116941849132' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7898193116941849132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7898193116941849132'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2009/06/build-better-data-driven-apps-with.html' title='Build Better Data-Driven Apps With Distributed Caching'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-165135129346049795</id><published>2009-06-08T13:42:00.000-07:00</published><updated>2009-06-08T13:45:01.929-07:00</updated><title type='text'>Anti-Patterns To Avoid In Entity Framework N-Tier Applications</title><content type='html'>&lt;a href="http://msdn.microsoft.com/magazine/dd882522.aspx"&gt;Anti-Patterns To Avoid In N-Tier Applications&lt;/a&gt; by Daniel Simmons&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-165135129346049795?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/165135129346049795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=165135129346049795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/165135129346049795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/165135129346049795'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2009/06/anti-patterns-to-avoid-in-n-tier.html' title='Anti-Patterns To Avoid In Entity Framework N-Tier Applications'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-6129738718311006883</id><published>2009-06-08T13:39:00.000-07:00</published><updated>2009-06-08T13:41:51.734-07:00</updated><title type='text'>Memory Usage Auditing For .NET Applications</title><content type='html'>&lt;a id="ctl00_mainContentContainer_ctl00_mainContentContainer_ctl22" onclick="javascript:Track('ctl00_mainContentContainer_ctl00_mainContentContainer_ctl22',this);" href="http://msdn.microsoft.com/magazine/dd882521.aspx"&gt;Memory Usage Auditing For .NET Applications&lt;/a&gt; by Subramanian Ramaswamy and Vance Morrison.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-6129738718311006883?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/6129738718311006883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=6129738718311006883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6129738718311006883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6129738718311006883'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2009/06/memory-usage-auditing-for-net.html' title='Memory Usage Auditing For .NET Applications'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-6012202817831725610</id><published>2009-04-13T13:26:00.000-07:00</published><updated>2009-04-13T13:28:06.488-07:00</updated><title type='text'>Optimizing A Large Scale Software + Services Application</title><content type='html'>&lt;a class="ArticleHeadlineText" id="ctl00_mainContentContainer_ctl03" onclick="javascript:Track('ctl00_mainContentContainer_ctl00ctl00_mainContentContainer_ctl03',this);" href="http://msdn.microsoft.com/en-us/magazine/dd569749.aspx"&gt;Optimizing A Large Scale Software + Services Application&lt;/a&gt; by Udi Dahan.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-6012202817831725610?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/6012202817831725610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=6012202817831725610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6012202817831725610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6012202817831725610'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2009/04/optimizing-large-scale-software.html' title='Optimizing A Large Scale Software + Services Application'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-4533196073281240008</id><published>2009-02-15T10:00:00.000-08:00</published><updated>2009-02-15T10:05:55.816-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asynchronous'/><category scheme='http://www.blogger.com/atom/ns#' term='scalablility'/><title type='text'>Two Good ASP.NET Articles</title><content type='html'>&lt;a set="yes" linkindex="168" id="ctl00_mainContentContainer_ctl05" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl05',this);" href="http://msdn.microsoft.com/en-us/magazine/cc500561.aspx"&gt;Performance: Scaling Strategies for ASP.NET Applications&lt;/a&gt; by Richard Campbell and Kent Alstad&lt;br /&gt;&lt;a set="yes" linkindex="167" id="ctl00_mainContentContainer_ctl04" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl04',this);" href="http://msdn.microsoft.com/en-us/magazine/2009.01.longrunwf.aspx"&gt;ASP.NET Workflow: Web Apps That Support Long-Running Operations&lt;/a&gt; by Michael Kennedy&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-4533196073281240008?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/4533196073281240008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=4533196073281240008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/4533196073281240008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/4533196073281240008'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2009/02/two-good-aspnet-articles.html' title='Two Good ASP.NET Articles'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-7049046536375846966</id><published>2008-09-15T11:02:00.000-07:00</published><updated>2008-09-15T11:07:06.222-07:00</updated><title type='text'>LINQ: deferred execution and lazy evaluations</title><content type='html'>This is a technique to achieve maximum performance from LINQ queries on large sets of data in order to create a responsive UI.&lt;br /&gt;&lt;br /&gt;Read more details on &lt;a class="ContentsTypeSubTitle" id="ctl00_ContentPlaceHolder1_ctl22" onclick="javascript:Track('ctl00_ContentPlaceHolder1_ctl00ctl00_ContentPlaceHolder1_ctl22',this);" href="http://msdn.microsoft.com/en-us/magazine/cc721610.aspx"&gt;Increase LINQ Query Performance&lt;/a&gt; by Jared Parsons.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-7049046536375846966?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/7049046536375846966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=7049046536375846966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7049046536375846966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7049046536375846966'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/09/linq-deferred-execution-and-lazy.html' title='LINQ: deferred execution and lazy evaluations'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-9203423182909311402</id><published>2008-07-29T12:44:00.000-07:00</published><updated>2008-07-29T12:46:22.502-07:00</updated><title type='text'>The Open Closed Principle</title><content type='html'>&lt;a id="ctl00_ContentPlaceHolder1_ctl05" onclick="javascript:Track('ctl00_ContentPlaceHolder1_ctl00ctl00_ContentPlaceHolder1_ctl05',this);" href="http://msdn.microsoft.com/en-us/magazine/cc546578.aspx"&gt;Patterns in Practice: The Open Closed Principle&lt;/a&gt; by Jeremy Miller&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-9203423182909311402?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/9203423182909311402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=9203423182909311402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/9203423182909311402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/9203423182909311402'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/07/open-closed-principle.html' title='The Open Closed Principle'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-7595451793789789093</id><published>2008-07-29T12:40:00.000-07:00</published><updated>2008-07-29T12:43:54.337-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='losing data'/><category scheme='http://www.blogger.com/atom/ns#' term='scalable'/><category scheme='http://www.blogger.com/atom/ns#' term='failure'/><title type='text'>Build Scalable Systems That Handle Failure Without Losing Data</title><content type='html'>&lt;a class="ArticleHeadlineText" id="ctl00_ContentPlaceHolder1_ctl09" onclick="javascript:Track('ctl00_ContentPlaceHolder1_ctl00ctl00_ContentPlaceHolder1_ctl09',this);" href="http://msdn.microsoft.com/en-us/magazine/cc663023.aspx"&gt;Build Scalable Systems That Handle Failure Without Losing Data&lt;/a&gt; by Udi Dahan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-7595451793789789093?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/7595451793789789093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=7595451793789789093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7595451793789789093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7595451793789789093'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/07/build-scalable-systems-that-handle.html' title='Build Scalable Systems That Handle Failure Without Losing Data'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-6027639839689084866</id><published>2008-07-04T11:23:00.000-07:00</published><updated>2008-07-04T11:24:22.997-07:00</updated><title type='text'>OutOfMemoryException and Pinning</title><content type='html'>&lt;a href="https://blogs.msdn.com/yunjin/archive/2004/01/27/63642.aspx"&gt;OutOfMemoryException and Pinning&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-6027639839689084866?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/6027639839689084866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=6027639839689084866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6027639839689084866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6027639839689084866'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/07/outofmemoryexception-and-pinning.html' title='OutOfMemoryException and Pinning'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-1025581946464580371</id><published>2008-07-04T10:39:00.000-07:00</published><updated>2008-07-04T10:41:16.597-07:00</updated><title type='text'>Some fundamentals of memory</title><content type='html'>&lt;a href="http://blogs.msdn.com/maoni/archive/2006/09/01/734880.aspx"&gt;Some fundamentals of memory&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-1025581946464580371?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/1025581946464580371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=1025581946464580371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/1025581946464580371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/1025581946464580371'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/07/some-fundamentals-of-memory.html' title='Some fundamentals of memory'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-2572018552629401503</id><published>2008-07-03T14:01:00.000-07:00</published><updated>2008-07-03T15:04:57.938-07:00</updated><title type='text'>Large Object Heap</title><content type='html'>For LOH, though, because compaction is expensive the CLR team chose to sweep them, making a free list out of dead objects that can be reused later to satisfy large object allocation requests. Adjacent dead objects are made into one free object.&lt;br /&gt;&lt;br /&gt;If I don't have enough free space to accommodate the large object allocation requests, I will first attempt to acquire more segments from the OS. If that fails, then I will trigger a generation 2 garbage collection in hope of freeing up some space.&lt;br /&gt;&lt;br /&gt;During a generation 2 garbage collection, I take the opportunity to release segments that have no live objects on them back to the OS. Memory from the last live object to the end of the segment is decommitted. And the free spaces remain committed though they are reset, meaning the OS doesn't need to write data in them back to disk.&lt;br /&gt;&lt;br /&gt;A garbage collection occurs if one of the following conditions happens:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Allocation Exceeds the Generation 0 or Large Object Threshold (this is the most typical case).&lt;/li&gt;&lt;li&gt;System.GC.Collect Is Called&lt;/li&gt;&lt;li&gt;System Is in Low Memory Situation This happens when I receive the high memory notification from the OS. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;LOH Performance Implications&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Allocation costs.&lt;/strong&gt;The CLR makes the guarantee that the memory for every new object I give out is cleared. This means the allocation cost of a large object is completely dominated by memory clearing (unless it triggers a garbage collection). If it takes two cycles to clear 1 byte, it means it takes 170,000 cycles to clear the smallest large object. For a 16MB object on a 2GHz machine, it will take approximately 16ms to clear the memory. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Collection costs&lt;/strong&gt;. LOH and generation 2 are collected together. If either one's threshold is exceeded, a generation 2 collection will be triggered. If many large objects are allocated on a very temporary basis and you have a big SOH, you could be spending too much time running garbage collections; not to mention that the allocation cost can really add up if you keep allocating and letting really large objects go.&lt;/p&gt;&lt;p&gt;From &lt;a class="ContentsTypeSubTitle" id="ctl00_ContentPlaceHolder1_ctl20" onclick="javascript:Track('ctl00_ContentPlaceHolder1_ctl00ctl00_ContentPlaceHolder1_ctl20',this);" href="http://msdn.microsoft.com/en-us/magazine/cc534993.aspx"&gt;Large Object Heap Uncovered&lt;/a&gt; by Maoni Stephens.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-2572018552629401503?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/2572018552629401503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=2572018552629401503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/2572018552629401503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/2572018552629401503'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/07/large-object-heap.html' title='Large Object Heap'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-405449605088873346</id><published>2008-06-24T10:12:00.000-07:00</published><updated>2008-06-24T10:14:19.530-07:00</updated><title type='text'>LinkedIn Architecture</title><content type='html'>&lt;a href="http://hurvitz.org/blog/2008/06/linkedin-architecture"&gt;http://hurvitz.org/blog/2008/06/linkedin-architecture&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-405449605088873346?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/405449605088873346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=405449605088873346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/405449605088873346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/405449605088873346'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/06/linkedin-architecture.html' title='LinkedIn Architecture'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-7178985665925827485</id><published>2008-03-07T12:13:00.000-08:00</published><updated>2008-03-07T12:17:04.745-08:00</updated><title type='text'>Streamed vs. Buffered in WCF</title><content type='html'>&lt;a href="http://msdn2.microsoft.com/en-us/library/ms789010.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms789010.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-7178985665925827485?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/7178985665925827485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=7178985665925827485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7178985665925827485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7178985665925827485'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/03/streamed-vs-buffered-in-wcf.html' title='Streamed vs. Buffered in WCF'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-8642907148010843120</id><published>2008-03-04T16:49:00.000-08:00</published><updated>2008-03-04T16:50:07.458-08:00</updated><title type='text'>TreeView Binding in WPF</title><content type='html'>&lt;a title="Permanent Link: Binding a TreeView to a DataSet" href="http://joshsmithonwpf.wordpress.com/2007/05/05/binding-a-treeview-to-a-dataset/" rel="bookmark"&gt;Binding a TreeView to a DataSet&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-8642907148010843120?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/8642907148010843120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=8642907148010843120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/8642907148010843120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/8642907148010843120'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/03/treeview-binding-in-wpf.html' title='TreeView Binding in WPF'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-8473145922314159992</id><published>2008-02-21T15:18:00.000-08:00</published><updated>2008-02-21T15:36:23.637-08:00</updated><title type='text'>DataContractSerializer.MaxItemsInObjectGraph in WCF</title><content type='html'>There are several things that control a huge list returned from a WCF call. DataContractSerializer.MaxItemsInObjectGraph, Binding.maxBufferSize, and Binding.maxReceivedMessageSize are commonly used.&lt;br /&gt;&lt;br /&gt;According to SDK, DataContractSerializer.MaxItemsInObjectGraph = the maximum number of items in an object graph to serialize or deserialize.&lt;br /&gt;NetTcpBinding.MaxReceivedMessageSize = the maximum size for a received message that is processed by the binding.&lt;br /&gt;NetTcpBinding.MaxBufferSize = a value that specifies the maximum size, in bytes, of the buffer used to store messages in memory.&lt;br /&gt;&lt;br /&gt;The default value for all three setting is 65,536. You can tweak this number to support large returned lists.&lt;br /&gt;&lt;br /&gt;One thing that you should know is that &lt;em&gt;TheNumberYouSet&lt;/em&gt; != &lt;em&gt;MaxListCountExpected&lt;/em&gt;. &lt;em&gt;TheNumberYouSet&lt;/em&gt; should be far bigger than &lt;em&gt;MaxListCountExpected&lt;/em&gt; because of this "graph" thing.&lt;br /&gt;&lt;br /&gt;To add a DataContractSerializer.MaxItemsInObjectGraph , you create an endpoint behavior (rather than a service behavior), and add the behavior to the endpoint (not at the service level).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-8473145922314159992?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/8473145922314159992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=8473145922314159992' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/8473145922314159992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/8473145922314159992'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/02/datacontractserializermaxitemsinobjectg.html' title='DataContractSerializer.MaxItemsInObjectGraph in WCF'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-7413389597500456553</id><published>2008-02-20T12:02:00.000-08:00</published><updated>2008-02-20T12:04:54.289-08:00</updated><title type='text'>SQL Server Remote Connection between XP server and Vista server</title><content type='html'>I got the following link from a coworker.&lt;br /&gt;&lt;a href="http://blogs.msdn.com/sql_protocols/archive/2006/09/30/SQL-Server-2005-Remote-Connectivity-Issue-TroubleShooting.aspx"&gt;http://blogs.msdn.com/sql_protocols/archive/2006/09/30/SQL-Server-2005-Remote-Connectivity-Issue-TroubleShooting.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-7413389597500456553?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/7413389597500456553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=7413389597500456553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7413389597500456553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7413389597500456553'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/02/sql-server-remote-connection-between-xp.html' title='SQL Server Remote Connection between XP server and Vista server'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-7353000039822525308</id><published>2008-02-20T11:55:00.000-08:00</published><updated>2008-02-20T12:02:06.365-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UI Automation'/><title type='text'>The Microsoft UI Automation Library</title><content type='html'>The Microsoft UI Automation library is included in the .NET Framework 3.0 as part of Windows Presentation Foundation (WPF). Read Dr. James McCaffrey's article &lt;a href="http://msdn.microsoft.com/msdnmag/issues/08/02/TestRun/default.aspx"&gt;The Microsoft UI Automation Library&lt;/a&gt; in more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-7353000039822525308?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/7353000039822525308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=7353000039822525308' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7353000039822525308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7353000039822525308'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2008/02/microsoft-ui-automation-library.html' title='The Microsoft UI Automation Library'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-5648827560735769387</id><published>2007-11-25T09:27:00.000-08:00</published><updated>2007-11-25T10:44:11.698-08:00</updated><title type='text'>WCF Binding</title><content type='html'>&lt;p&gt;In WCF, the communication concepts—the transport, the message encoding, and the suite of protocols are handled by the channel stack.&lt;/p&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_F6V9mkKY5sI/R0myIWvaUWI/AAAAAAAAAA0/tjFPmdMAeXg/s1600-h/fig01_L.gif"&gt;&lt;img id="BLOGGER_PHOTO_ID_5136832706605896034" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_F6V9mkKY5sI/R0myIWvaUWI/AAAAAAAAAA0/tjFPmdMAeXg/s320/fig01_L.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;It’s the binding, however, that provides the recipe for building the channel stack needed to properly process the messages. When you load a service, WCF follows the instructions outlined by the binding description to create each channel stack. The binding binds your service implementation to the wire through the channel stack in the middle.&lt;/p&gt;&lt;p&gt;Within the WCF programming model, bindings are represented by the System.ServiceModel.Channels.Binding class. The figure &lt;a class="clsFigs" onclick="OpenUrl('default.aspx?loc=&amp;amp;fig=true#fig2'); return false;" href="http://msdn.microsoft.com/msdnmag/issues/07/07/ServiceStation/default.aspx?loc=&amp;amp;fig=true#fig2" target="_self" user="http://msdn.microsoft.com"&gt;Figure 2&lt;/a&gt; summarizes the built-in binding classes that come with WCF out of the box.&lt;/p&gt;&lt;p&gt;Unlike the HTTP bindings, the various "Net" bindings were not designed for interoperability. In fact, each was designed for optimizing a different communication scenario when you can safely assume you have the Microsoft® .NET Framework 3.0 installed on both sides.&lt;/p&gt;&lt;p&gt;From &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/07/ServiceStation"&gt;Service Station: WCF Bindings In Depth&lt;/a&gt; by Aaron Skonnard.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-5648827560735769387?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/5648827560735769387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=5648827560735769387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/5648827560735769387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/5648827560735769387'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/11/wcf-binding.html' title='WCF Binding'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_F6V9mkKY5sI/R0myIWvaUWI/AAAAAAAAAA0/tjFPmdMAeXg/s72-c/fig01_L.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-1138310582629140493</id><published>2007-09-28T15:44:00.000-07:00</published><updated>2007-09-28T15:49:02.973-07:00</updated><title type='text'>Scott Berkun on Politics</title><content type='html'>According to Scott Berkun, Politics is the skill of managing&lt;a name="is possible"&gt;&lt;/a&gt; people and organizations.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a name="not a"&gt;&lt;/a&gt;Politics is not a dirty word&lt;a name="first definition"&gt;&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a name="All leaders"&gt;&lt;/a&gt;All leaders have political and power&lt;a name="IDX-CHP-16-1051"&gt;&lt;/a&gt; constraints&lt;a name="VPs or"&gt;&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;The ratio of power to&lt;a name="IDX-CHP-16-1052"&gt;&lt;/a&gt; responsibility is constant&lt;a name="its relationship"&gt;&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a name="kind of"&gt;&lt;/a&gt;Politics is a kind of problem solving&lt;a name="frustrating it"&gt;&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Any political or management&lt;a name="no matter"&gt;&lt;/a&gt; action that takes place, no matter how stupid or evil it seems, is always one of a limited number of possible choices managers have. The alternatives might be even worse for the project&lt;a name="of the"&gt;&lt;/a&gt; than the choice that was made. Without understanding something of the constraints, judgment will always be based more on venting frustration than on the reality of the situation.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-1138310582629140493?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/1138310582629140493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=1138310582629140493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/1138310582629140493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/1138310582629140493'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/09/scott-berkun-on-politics.html' title='Scott Berkun on Politics'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-8867404796845373193</id><published>2007-09-24T08:18:00.000-07:00</published><updated>2007-09-24T08:29:09.247-07:00</updated><title type='text'>Serializing and Encoding in WCF</title><content type='html'>Whereas serialization defines how .NET objects map to XML Infosets, the encoding defines how the XML Infoset is written out to a stream of bytes.&lt;br /&gt;&lt;br /&gt;The serializer is considered part of the service contract because it directly impacts your code. The encoding isn't considered part of the service contract, but rather a configuration detail since it doesn't impact your code—you control the encoding by configuring the endpoint's binding.&lt;br /&gt;&lt;br /&gt;The separation of serialization from encoding makes it possible to build your applications on a consistent data model (the XML Infoset) while providing flexibility in representation (the encoding).&lt;br /&gt;&lt;br /&gt;Windows Communication Foundation supports three serializers: XmlSerializer, DataContractSerializer, and NetDataContractSerializer. DataContractSerializer is the default.&lt;br /&gt;&lt;br /&gt;WCF currently supports the following encodings: text, binary, Message Transmission Optimization Mechanism (MTOM), and your own custom encodings.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/08/ServiceStation"&gt;Service Station: Serialization in Windows Communication Foundation&lt;/a&gt; by Aaron Skonnard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-8867404796845373193?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/8867404796845373193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=8867404796845373193' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/8867404796845373193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/8867404796845373193'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/09/serializing-and-encoding-in-wcf.html' title='Serializing and Encoding in WCF'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-6784886352481892718</id><published>2007-09-17T08:53:00.000-07:00</published><updated>2007-09-17T10:00:35.019-07:00</updated><title type='text'>Security in WCF</title><content type='html'>&lt;strong&gt;Credentials&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;None, UserName, Windows, Certificate, and IssuedToken.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Default Security in Standard Bindings&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;basicHttpBinding&lt;/em&gt;&lt;/strong&gt; supports the WS-I basic profile. This particular binding doesn't provide CIA by default like most of the others. The most popular way to secure this binding is by simply running over HTTPS.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;wsHttpBinding&lt;/em&gt;&lt;/strong&gt; uses message security by default, with WS-Security and WS-SecureConversation. The default client credential type is Windows. One of the most common security tweaks to use on this binding is to switch it to use TransportWithMessageCredential.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;netTcpBinding&lt;/em&gt;&lt;/strong&gt; encodes each SOAP envelope using a proprietary binary encoding of the XML Infoset instead of the traditional angle bracket encoding. By default this binding uses transport security with Windows credentials, and is very efficient. The default binding uses transport security with negotiated authentication. If you want raw speed for Web services on a Windows-based intranet, you should seriously consider using this binding.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Discovering Client Identity&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;By far the simplest way to discover a client's identity is to leverage &lt;strong&gt;&lt;em&gt;Thread.CurrentPrincipal&lt;/em&gt;&lt;/strong&gt;. You can see which groups the user belongs to by calling WindowsPrincipal.IsInRole. For security reasons you really should specify the fully qualified group name, which includes the domain or machine on which the group is defined.&lt;br /&gt;&lt;br /&gt;WCF doesn't always set Thread.CurrentPrincipal. It does that only if PrincipalPermissionAttribute is used or if the configuration says it should. Instead of relying on Thread.CurrentPrincipal, you should use &lt;strong&gt;&lt;em&gt;ServiceSecurityContext.Current.WindowsIdentity&lt;/em&gt;&lt;/strong&gt; to get the client's identity if one is available.&lt;br /&gt;&lt;br /&gt;If the client is using an issued token credential to authenticate, you'll need to use &lt;strong&gt;&lt;em&gt;ServiceSecurityContext.AuthorizationContext&lt;/em&gt;&lt;/strong&gt; to pick up those details. If the client is authenticating with a certificate not mapped to a Windows account, &lt;strong&gt;&lt;em&gt;ServiceSecurityContext.Current.PrimaryIdentity&lt;/em&gt;&lt;/strong&gt; can be used.&lt;br /&gt;&lt;br /&gt;Transparency is important when you're building a secure system. If the security features you build into the system aren't relatively transparent, users will be put off and will generally try to avoid using them.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/08/SecurityBriefs"&gt;Security Briefs: Security in Windows Communication Foundation&lt;/a&gt; by Keith Brown.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-6784886352481892718?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/6784886352481892718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=6784886352481892718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6784886352481892718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6784886352481892718'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/09/security-in-wcf.html' title='Security in WCF'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-3420299911180512856</id><published>2007-09-01T10:47:00.000-07:00</published><updated>2007-09-09T10:22:19.093-07:00</updated><title type='text'>WCF Addressing</title><content type='html'>You can specify an absolute address for each endpoint or you can supply the ServiceHost with a base address and then specify relative paths for each endpoint. Specifying absolute addresses is a little easier to understand, but the base address technique typically makes things easier to manage.&lt;br /&gt;&lt;br /&gt;The base address technique is mostly a convenience to reduce the number of places you’ll have to make changes when modifying the locations of your endpoints. Windows Communication Foundation also uses the base HTTP address by default to expose metadata when GET retrieval has been enabled (via the &lt;strong&gt;&lt;em&gt;serviceMetadata&lt;/em&gt;&lt;/strong&gt; behavior). You can, however, change the retrieval location using the behavior’s httpGetUrl property.&lt;br /&gt;&lt;br /&gt;It’s also possible to specify the base addresses in the configuration file along with the endpoints themselves by listing the base addresses within the &lt;strong&gt;&lt;em&gt;host&lt;/em&gt;&lt;/strong&gt; element for each &lt;strong&gt;&lt;em&gt;service&lt;/em&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;IIS Addressing Considerations&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;When hosting in IIS, you simply map a .svc endpoint to your service class, configure the service endpoints and behaviors in web.config, and let WCF manage the process of creating and configuring the ServiceHost instance at runtime.&lt;br /&gt;&lt;br /&gt;In this hosting scenario, the base HTTP address is determined by the IIS virtual directory housing the service along with the name of the .svc file. If you want to change the base address for your endpoints, you’ll need to move the service to a different IIS virtual directory.&lt;br /&gt;&lt;br /&gt;Not only does IIS control the base address, it forces all of your endpoints to actually use the same base address (unlike self-hosting). As a result, it really only makes sense to use relative addresses when hosting in IIS.&lt;br /&gt;&lt;br /&gt;Suppose you have a file named calc.svc and you place it in a virtual directory that corresponds to &lt;span&gt;http://localhost:8080/calcservice&lt;/span&gt;. The base address for this service will be &lt;span&gt;http://localhost:8080/calcservice/calc.svc&lt;/span&gt;. If a relative addresss "secure" is provided, then its address is http://localhost:8080/calcservice/calc.svc/secure. You have to remember that calc.svc is part of the base address so it has to work this way.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Logical vs. Physical Addresses&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;WCF refers to the logical address as "Address" or "Endpoint Address" and the physical address as "ListenUri".&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/06/ServiceStation"&gt;Service Station: WCF Addressing In Depth&lt;/a&gt; by Aaron Skonnard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-3420299911180512856?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/3420299911180512856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=3420299911180512856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/3420299911180512856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/3420299911180512856'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/09/wcf-addressing.html' title='WCF Addressing'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-7263911461549525579</id><published>2007-08-10T07:57:00.000-07:00</published><updated>2007-08-19T09:20:53.818-07:00</updated><title type='text'>The InstanceContextMode Property</title><content type='html'>You can apply the ServiceBehavior attribute with the InstanceContextMode property set to the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;InstanceContextMode.PerCall - Per-Call Services.&lt;/li&gt;&lt;li&gt;InstanceContextMode.PerSession - Per-Session Services, default.&lt;/li&gt;&lt;li&gt;InstanceContextMode.Sharable - Shareable Services, not included in the current release.&lt;/li&gt;&lt;li&gt;InstanceContextMode.Single - Singleton Services, with sessions or without sessions.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A service that implements a session-aware contract requires that all the endpoints that expose the contract use bindings that support reliable transport session. One exception to this rule is the named pipes binding.&lt;/p&gt;&lt;p&gt;&lt;reliablesession inactivitytimeout="00:25:00" enabled="true"&gt;&lt;/p&gt;&lt;p&gt;A shareable service behaves much like a per-session service, with one important additional aspect: the instance has a unique ID, and when a client establishes a session with a shareable service, the client can pass a logical reference to that instance to another client. The second client will establish an independent session but will share the same instance. Also, each of these sessions may use different inactivity timeouts, and expire independently of any other session.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/06/WCFEssentials"&gt;WCF Essentials: Discover Mighty Instance Management Techniques For Developing WCF Apps&lt;/a&gt; by Juval Lowy.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-7263911461549525579?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/7263911461549525579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=7263911461549525579' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7263911461549525579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7263911461549525579'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/08/servicebehavior-attribute.html' title='The InstanceContextMode Property'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-3524223921894279256</id><published>2007-08-07T07:55:00.000-07:00</published><updated>2007-08-08T14:10:10.175-07:00</updated><title type='text'>Some Basic WCF Concepts</title><content type='html'>WCF unifies the existing suite of .NET distributed technologies into a single programming model that improves the overall developer experience through a consistent architecture, new levels of functionality and interoperability, and all the extensibility points you could want. WCF was designed according to the tenets of service orientation.&lt;br /&gt;&lt;br /&gt;A service is a piece of code you interact with through messages. Services are passive. They wait for incoming messages before doing any work. Clients are the initiators. Clients send messages to services to request work.&lt;br /&gt;&lt;br /&gt;Services expose one or more endpoints where messages can be sent. Each endpoint consists of an address, a binding, and a contract. The address specifies where to send messages. The binding describes how to send messages. And the contract describes what the messages contain. Clients need to know this information before they can access a service.&lt;br /&gt;&lt;br /&gt;Services can package up endpoint descriptions to share with clients, typically by using Web Services Description Language (WSDL). Then clients can use the provided service description to generate code within their environment capable of sending and receiving the proper messages.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;WCF Programming Model&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;With WCF, you're either writing services that expose endpoints or you're writing clients that interact with endpoints. Hence, endpoints are central to the WCF programming model and infrastructure.&lt;br /&gt;&lt;br /&gt;When building a WCF service, you typically start by defining a .NET interface definition to serve as the service contract. Then you implement the service contract in a .NET class, known as the service type, and configure its behavior. Next, you define the endpoints the service will expose, specifying the address, binding, and contract for each one. Finally, you host the service type in an application using the WCF hosting infrastructure. Once the service type is hosted, clients can retrieve its endpoint descriptions and begin integrating with it.&lt;br /&gt;&lt;br /&gt;When building a WCF client, you first need the description of the target endpoint you want to access. The endpoint description can be used to dynamically create a typed proxy. Then you can write code against the typed proxy to access the service by sending the appropriate messages to the target endpoint.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Service Contracts and Dispatch Behavior&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;WCF uses the information found in the service contract to perform dispatching and serialization. Dispatching is the process of deciding which method to call for an incoming SOAP message. Serialization is the process of mapping between the data found in a SOAP message and the corresponding .NET objects used in the method invocation. This mapping is controlled by an operation's data contract.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Data Contracts&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The way WCF serializes .NET classes depends on the serialization engine in use. The default serialization engine is known as DataContract, a simplified version of XmlSerializer, the default serialization engine used in ASMX today.&lt;br /&gt;&lt;br /&gt;With DataContract, only fields marked with DataMember will be serialized. And you can serialize private fields.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Attribute List&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;ServiceContract, OperationContract, DataContract, DataMember, MessageContract, MessageBody, MessageHeader, ServiceBehavior.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/02/WindowsCommunicationFoundation"&gt;Distributed .NET: Learn The ABCs Of Programming Windows Communication Foundation&lt;/a&gt; by Aaron Skonnard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-3524223921894279256?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/3524223921894279256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=3524223921894279256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/3524223921894279256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/3524223921894279256'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/08/some-basic-wcf-concepts.html' title='Some Basic WCF Concepts'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-6977181697687056748</id><published>2007-07-21T09:29:00.000-07:00</published><updated>2007-07-21T10:01:29.951-07:00</updated><title type='text'>Performance Implications on Collections</title><content type='html'>When you want additions, removals, and lookups to be very quick, and when you are not concerned about the order of the items in the collections, your first inclination should be to use a System.Collections.Generic.Dictionary&lt;tkey,&gt;.&lt;br /&gt;&lt;br /&gt;On the other hand, with a List&lt;t&gt;, inserting and removing items can take a variable amount of time. (List&lt;t&gt; stores items in an underlying array that maintains order. If your usage pattern requires few deletions and mostly additions, and if it is important for you to keep the collection in order, you may still want to choose a List&lt;t&gt;.&lt;br /&gt;&lt;br /&gt;Using the new LinkedList&lt;t&gt; collection can potentially help you improve performance in scenarios where you need to maintain order yet still achieve fast inserts. Unlike List&lt;t&gt;, LinkedList&lt;t&gt; is implemented as a chain of dynamically allocated objects. In comparison to List&lt;t&gt;, inserting an object in the middle only requires updating two connections and adding the new item. The downside of a linked list from a performance point of view is increased activity by the garbage collector as it has to traverse the entire list to make sure objects were not disposed of. Additionally, performance problems can arise with large linked lists due to the overhead associated with each node as well as where in memory each node lives.&lt;br /&gt;&lt;br /&gt;SortedDictionary&lt;tkey,tvalue&gt;, uses a balanced tree implementation as the underlying data store; this provides relatively fast lookups and maintains items in a sorted order, but insertions will most likely be slower.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/08/CLRInsideOut"&gt;CLR Inside Out: Collections Best Practices&lt;/a&gt; by Inbar Gazit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-6977181697687056748?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/6977181697687056748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=6977181697687056748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6977181697687056748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6977181697687056748'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/07/performance-implications-on-collections.html' title='Performance Implications on Collections'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-7390357774376821437</id><published>2007-07-21T09:03:00.000-07:00</published><updated>2007-07-21T09:09:29.977-07:00</updated><title type='text'>Generic Counterparts to Non-Generic Collections</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_F6V9mkKY5sI/RqIvc-wPQDI/AAAAAAAAAAc/F9cxlZ5prVM/s1600-h/aa.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5089682703810248754" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_F6V9mkKY5sI/RqIvc-wPQDI/AAAAAAAAAAc/F9cxlZ5prVM/s320/aa.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-7390357774376821437?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/7390357774376821437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=7390357774376821437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7390357774376821437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7390357774376821437'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/07/generic-counterparts-to-non-generic.html' title='Generic Counterparts to Non-Generic Collections'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_F6V9mkKY5sI/RqIvc-wPQDI/AAAAAAAAAAc/F9cxlZ5prVM/s72-c/aa.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-2044523259586984773</id><published>2007-07-08T09:10:00.000-07:00</published><updated>2007-07-08T09:14:26.938-07:00</updated><title type='text'>Separating Administrative Events and Operational, Analytical, or Trace/Debug Messages</title><content type='html'>If there's one thing an IT pro really hates, it's an application that makes a lot of noise in the application event log, drowning out the really important messages that well-behaved applications produce from time to time. You shouldn't be writing operational, analytical, or trace/debug messages to the application log! These are more appropriate for a custom application log.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/04/SecurityBriefs"&gt;Security Briefs: Improve Manageability through Event Logging&lt;/a&gt; by Keith Brown.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-2044523259586984773?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/2044523259586984773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=2044523259586984773' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/2044523259586984773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/2044523259586984773'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/07/separating-administrative-events-and.html' title='Separating Administrative Events and Operational, Analytical, or Trace/Debug Messages'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-3596366350751777576</id><published>2007-07-08T08:40:00.000-07:00</published><updated>2007-07-08T08:54:13.601-07:00</updated><title type='text'>Localization Strategy Used in the Windows Event Log</title><content type='html'>The Windows® event log was designed with localization and efficiency in mind. For example, a well-designed event found in the Application log should contain just enough prose to explain a problem to the administrator and provide a suggested course of action. The vast majority of this prose should be localized for the reader, who may very well be on a remote machine in a different country. To support reading the log in your own native language, the localizable prose in the message is not actually stored in the log; rather, it is merged with the log locally as you read it. The actual prose is stored in a localized resource DLL on the reader's machine. This also has the effect of keeping the log files smaller and reducing the amount of network traffic required to read them.&lt;br /&gt;&lt;br /&gt;Before the .NET Framework came along, this was all very clear to developers because you had to create and register these resource DLLs yourself. A typical message in a resource DLL might look like this: "Failed to connect to database %1 using connection string %2. Check to see that the database is available."&lt;br /&gt;&lt;br /&gt;In this example, the only data about the event that would be stored in the event log would be the event ID, source, category, and a few other bits of metadata, along with the arguments supplied when the event was logged: the database name (%1) and the connection string (%2). When you use a tool such as Event Viewer to read an event like this, Windows will load the message resource DLL installed on your machine, look up the localized message based on the event ID, then merge the arguments from the log in order to display the message to you.&lt;br /&gt;&lt;br /&gt;The way Windows figures out which resource DLL to use is by looking at the name of the event source in the log and mapping it to a registry key. This registry key contains the path to the resource DLL that should be used to display the message.&lt;br /&gt;&lt;br /&gt;In version 1.x of the .NET Framework, the simple call to CreateEventSource wires your event source up with a default message file. This file is called EventLogMessages.dll, and it contains 65,536 event descriptions, each of which consists of the string "%1", a placeholder for whatever string you want to write. While this may have encouraged a few more people to use the event log, it defeated the purpose of having message files in the first place: to allow localized viewing of messages in the reader's language, and to keep the size of the event logs in check.&lt;br /&gt;&lt;br /&gt;Fortunately, version 2.0 of the .NET Framework remedies this and allows you to gain the full power of the event log by registering a message file when you create your event source. This lets you support localized categories and messages, and it reduces the size of your messages in the log.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/04/SecurityBriefs"&gt;Security Briefs: Improve Manageability through Event Logging&lt;/a&gt; by Keith Brown.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-3596366350751777576?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/3596366350751777576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=3596366350751777576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/3596366350751777576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/3596366350751777576'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/07/localization-strategy-used-in-windows.html' title='Localization Strategy Used in the Windows Event Log'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-638594289631299236</id><published>2007-07-01T13:41:00.000-07:00</published><updated>2007-07-01T15:48:04.954-07:00</updated><title type='text'>Write Code Once For Both Mobile And Desktop Apps</title><content type='html'>Differences in the tools, the languages, the libraries, and the runtime engine affect the goal of writing cross-platform code.&lt;br /&gt;&lt;br /&gt;The .NET Compact Framework achieves 80 percent of the relevant functionality found in the .NET Framework with only 20 percent of the footprint. Major areas of the .NET Framework that are absent from the compact version include: ASP.NET, CLR hosting, code access security (CAS), binary serialization, Reflection.Emit, and CodeDOM. Windows Presentation Foundation and Windows Workflow Foundation are not going to be supported any time soon.&lt;br /&gt;&lt;br /&gt;System.Data.SqlServerCe, System.Net.IrDA, Microsoft.WindowsMobile.DirectX and Microsoft.WindowsCE.Forms are four device-specific assemblies that are in the .NET Compact Framework and not in the the .NET Framework. So the .NET Compact Framework is not a strict subset of the .NET Framework.&lt;br /&gt;&lt;br /&gt;IL opcodes that are not supported by the .NET Compact Framework common are: jmp, calli, refanyval, refanytype, mkrefany, arglist, localloc, unaligned, and tail.&lt;br /&gt;&lt;br /&gt;The implementations of the garbage collector and the just-in-time (JIT) compiler are different in the .NET Compact Framework than they are in the .NET Framework.&lt;br /&gt;&lt;br /&gt;Note that the public key token for the .NET Compact Framework assemblies starts with 9 whereas the desktop equivalents start with B. You can use that information to quickly determine whether what you are deploying or referencing is a desktop or a device framework assembly.&lt;br /&gt;&lt;br /&gt;Implementation approaches: retargeting, conditional branching, or a mix of both.&lt;br /&gt;&lt;br /&gt;A runtime check is not enough because of JIT compiling.&lt;br /&gt;&lt;br /&gt;Share the Code, Not the Binary.&lt;br /&gt;&lt;br /&gt;There are two limitations with the retargetable approach: First, you can’t use any desktop-only types or methods in your code. They simply will not compile. Second, you must be careful not to load any device-specific assemblies on the desktop as they will fail with run-time exceptions.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/07/ShareCode/default.aspx"&gt;Share Code: Write Code Once For Both Mobile And Desktop Apps&lt;/a&gt; by Daniel Moth&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-638594289631299236?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/638594289631299236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=638594289631299236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/638594289631299236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/638594289631299236'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/07/write-code-once-for-both-mobile-and.html' title='Write Code Once For Both Mobile And Desktop Apps'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-4750679892660647653</id><published>2007-06-30T10:06:00.000-07:00</published><updated>2007-07-01T10:50:00.691-07:00</updated><title type='text'>IIS 7.0</title><content type='html'>&lt;strong&gt;Be Extensible and Manageable&lt;/strong&gt;. The vision for IIS 7.0 was to take the speed, reliability, and security of the IIS 6.0 codebase and turn it into a highly extensible and manageable Web server platform powerful enough to run Web applications of the future.&lt;br /&gt;&lt;br /&gt;At the core of the IIS 7.0 release is a completely modular Web server, comprised of more than 40 features that can be assembled into small-footprint Web servers optimized for the desired role in your application topology. These features are built on top of a new extensibility layer that allows developers to extend or replace virtually any aspect of the server, in native code or with the Microsoft® .NET Framework. IIS 7.0 offers extensibility throughout its runtime, management, and operational features to help you build end-to-end solutions for your specific needs. On top of the core platform, IIS 7.0 tackles many of the problems associated with the manageability and operation of the server. It features a brand new configuration system that enables fully delegated management of sites and finally makes xcopy deployment of Web applications a reality. The new management APIs and diagnostic features make deployment, administration, and troubleshooting of the server significantly easier and more convenient than ever before.&lt;br /&gt;&lt;br /&gt;The centralized configuration store of the previous IIS releases, known affectionately as the metabase, is gone. IIS 7.0 features a new delegated configuration system based on a hierarchy of distributed XML configuration files. This hierarchy is comprised of a global applicationHost.config file, which contains server-level configuration defaults, and distributed web.config files within the application's directory structure.&lt;br /&gt;&lt;br /&gt;In the past, IIS application settings had to be explicitly configured in the machine-level metabase repository before the application could function correctly. With distributed web.config files, applications encapsulate the required server configuration within their directory structure. This dramatically simplifies deployment, allowing self-contained applications to be simply copied to the target server's application directory and thus be up and running immediately with the desired settings.&lt;br /&gt;&lt;br /&gt;IIS 7.0 continues to support existing setup code that uses the Admin Base Object (ABO) APIs to write to the legacy metabase or scripts that use the higher-level Active Directory® Service Interfaces (ADSI) and Windows Management Instrumentation (WMI) objects to configure IIS. It does this by providing a compatibility layer that emulates the ABO APIs, on top of which all other legacy configuration APIs are based, allowing such scripts to read and change configuration just like they did in the previous releases of IIS.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Remote Management Tool&lt;/strong&gt;. IIS 7.0 provides a tool that enables delegated management, letting application owners manage their applications remotely without having administrative access to the server computer. Server administrators, of course, have complete control over what management features are delegated to application owners.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Microsoft.Web.Administration&lt;/strong&gt;, the new .NET Administration API, makes it easy for managed code applications to programmatically provision IIS sites and applications, access important state and diagnostic information, and otherwise configure the server.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;In IIS 7.0, ASP.NET comes in two versions: &lt;strong&gt;Classic mode and Integrated mode&lt;/strong&gt;. Classic mode works exactly the same way as it did in previous versions of IIS. Integrated mode, the new platform default, uses a brand new engine to provide unparalleled integration with the IIS Web server.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;IIS on Windows Vista is limited to 10 concurrent requests at a time.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;The modular nature of the server allows administrators to remove unneeded server features, saving memory and CPU usage during request processing. &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;The new IIS Output Cache provides support for re-using responses to expensive dynamic pages on the server, alleviating the need to perform the expensive rendering and database transactions in order to return the response to the client.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/03/IIS7/default.aspx"&gt;IIS 7.0: Explore The Web Server For Windows Vista And Beyond&lt;/a&gt; by Mike Volodarsky&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-4750679892660647653?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/4750679892660647653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=4750679892660647653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/4750679892660647653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/4750679892660647653'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/06/iis-70.html' title='IIS 7.0'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-1340392774485670359</id><published>2007-06-11T09:50:00.000-07:00</published><updated>2007-06-11T09:51:48.674-07:00</updated><title type='text'>Can Sql Server Run Entirely In Ram?</title><content type='html'>Database pages that have been accessed are stored in the buffer pool. (Pages are placed in RAM only when needed, and SQL Server™ doesn't reload pages.) These pages are kept in RAM as long as possible—that is, until memory becomes a problem. So let's say you've set SQL Server to the proper memory footprint and you've run some queries that touched every page in the database. The entire database would then be in RAM and it would stay there until you ran out of buffer pool space to hold new pages, or until other processes on the system cause physical memory pressure.&lt;br /&gt;&lt;br /&gt;During each checkpoint, any modified pages are flushed to disk, so committed changes are taken care of. Log records are not cached per se. As soon as a commit is issued, the records are flushed to disk. So even if all dirty pages are still in RAM, a restart of SQL Server will replay the log records. Don't take this to mean you should rely on the log in this way. A huge log could mean a very long recovery period.&lt;br /&gt;&lt;br /&gt;So pages stay in RAM until space is needed; a least recently used (LRU) algorithm is applied so that hot pages stay longer. Most of the time, you won't need the entire database in the cache anyway. So you shouldn't buy a ton of RAM to hold pages that probably aren't touched too often—you likely won't see any performance improvement.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.microsoft.com/technet/technetmag/issues/2006/10/SQLQA/?topics=/technet/technetmag/issues/2006/10/SQLQA"&gt;Running in RAM, Agent Jobs, and More&lt;/a&gt; by Nancy Michell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-1340392774485670359?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/1340392774485670359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=1340392774485670359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/1340392774485670359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/1340392774485670359'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/06/can-sql-server-run-entirely-in-ram.html' title='Can Sql Server Run Entirely In Ram?'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-1846482060240608039</id><published>2007-06-11T09:37:00.000-07:00</published><updated>2007-06-11T09:39:42.141-07:00</updated><title type='text'>Guidance On Forest Trusts</title><content type='html'>&lt;p&gt;The following documents provide valuable guidance on creating forests and implementing trust: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://microsoft.com/technet/prodtechnol/windowsserver2003/technologies/directory/activedirectory/fedffin2.mspx"&gt;Planning and Implementing Federated Forests in Windows Server 2003&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/322692"&gt;How to Raise Domain and Forest Functional Levels in Windows Server 2003&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=71555"&gt;When to Create a Forest Trust&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://microsoft.com/windowsserver2003/evaluation/overview/technologies/kerberos.mspx"&gt;What's New in Windows Server 2003 Kerberos Authentication&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;From &lt;a href="http://www.microsoft.com/technet/technetmag/issues/2006/10/SQLQA/?topics=/technet/technetmag/issues/2006/10/SQLQA"&gt;Running in RAM, Agent Jobs, and More&lt;/a&gt; by Nancy Michell.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-1846482060240608039?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/1846482060240608039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=1846482060240608039' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/1846482060240608039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/1846482060240608039'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/06/guidance-on-forest-trusts.html' title='Guidance On Forest Trusts'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-7776215019922399805</id><published>2007-06-11T09:20:00.000-07:00</published><updated>2007-06-11T09:22:54.101-07:00</updated><title type='text'>Monitoring SQL Server Health</title><content type='html'>See "&lt;a href="http://microsoft.com/technet/prodtechnol/sql/2005/tsprfprb.mspx"&gt;Troubleshooting Performance Problems in SQL Server 2005&lt;/a&gt;" and "&lt;a href="http://www.sql-server-performance.com/performance_monitor_counters_sql_server.asp"&gt;Tips for Using SQL Server Performance Monitor Counters&lt;/a&gt;"). The key to running traces in the most efficient manner is to run the traces locally on the machine running SQL Server and pipe the output to a local file.&lt;br /&gt;&lt;br /&gt;In addition to capturing and analyzing performance counters and profiler information you may want to look into identifying where the engine is spending its time waiting, which tells you if you are I/O constrained, CPU constrained, memory constrained, and so on. For more on this see "&lt;a href="http://blogs.msdn.com/sqlcat/archive/2005/09/05/461199.aspx"&gt;How do you measure CPU pressure?&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;You should also consider implementing Microsoft® Operations Manager (MOM) 2005 as a part of your SQL Server 2005 monitoring plans. The SQL Server 2005 Management Pack is quite useful. Even without it you can get a good understanding of what's going on with your servers just by using the MOM operator console and warehouse and associated reports that expose counters like CPU, Memory, Disk Queuing, and so on.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.microsoft.com/technet/technetmag/issues/2006/09/SQLQA/?topics=/technet/technetmag/issues/2006/09/SQLQA"&gt;Predicates, Stored Procedures, and More&lt;/a&gt; by Nancy Michell&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-7776215019922399805?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/7776215019922399805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=7776215019922399805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7776215019922399805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/7776215019922399805'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/06/monitoring-sql-server-health.html' title='Monitoring SQL Server Health'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-218877001893939233</id><published>2007-06-09T10:00:00.000-07:00</published><updated>2007-06-09T10:03:34.657-07:00</updated><title type='text'>Rebuilding Indexes in SQL Server</title><content type='html'>At the simplest level, indexes are rebuilt by constructing a new copy of the index and then deleting the old one. This means that essentially there are two copies of the index for a short period of time. Constructing the new index could require as much database file space as the original index, and if the rebuild requires a sort operation, then an additional 20 percent of the index size is required for the sort.&lt;br /&gt;&lt;br /&gt;So the worst case is that rebuilding an index requires 1.2 times the space of the old index. If the database file does not have enough free space, then the file will have to grow as the operation proceeds. It's possible that if autogrow is not enabled or there is not enough space on the disk volume, then there may not be enough free space available and the rebuild operation will fail.&lt;br /&gt;&lt;br /&gt;Whether the operation fails or not, the extra space allocated to the database file is not freed up after the rebuild operation completes. The assumption is that the space will be used for regular database operations.&lt;br /&gt;&lt;br /&gt;Using DBCC INDEXDEFRAG (or ALTER INDEX … REORGANIZE in SQL Server™ 2005) has the advantage that it uses almost no additional database file space, but it can take longer and generate a lot more transaction logging than an index rebuild. DBCC INDEXDEFRAG is always fully logged, regardless of the recovery mode in use, whereas in simple recovery mode an index rebuild will be bulk-logged. There are a variety of pros and cons to each method and they are explained more fully in the &lt;a href="http://www.microsoft.com/technet/prodtechnol/sql/2000/maintain/ss2kidbp.mspx"&gt;SQL Server Index Defragmentation Best Practices whitepaper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Before making the decision on how to fix fragmentation, first decide whether to fix fragmentation at all. Depending on the type of operations the index is used for, fragmentation may have no effect on performance and so fixing it is a waste of resources. The whitepaper has great detail.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/technet/technetmag/issues/2007/04/SQLQA/?topics=/technet/technetmag/issues/2007/04/SQLQA"&gt;Rebuilding Indexes, Disk Queue Length, and More&lt;/a&gt;by Nancy Michell&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-218877001893939233?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/218877001893939233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=218877001893939233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/218877001893939233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/218877001893939233'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/06/rebuilding-indexes-in-sql-server.html' title='Rebuilding Indexes in SQL Server'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-3185238452457588930</id><published>2007-06-09T09:24:00.000-07:00</published><updated>2007-06-09T09:30:09.434-07:00</updated><title type='text'>EXECUTE AS Clause (T-SQL)</title><content type='html'>In SQL Server 2005 you can define the execution context of the following user-defined modules: functions (except inline table-valued functions), procedures, queues, and triggers.&lt;br /&gt;&lt;br /&gt;By specifying the context in which the module is executed, you can control which user account the SQL Server 2005 Database Engine uses to validate permissions on objects that are referenced by the module. This provides additional flexibility and control in managing permissions across the object chain that exists between user-defined modules and the objects referenced by those modules. Permissions must be granted to users only on the module itself, without having to grant them explicit permissions on the referenced objects. Only the user that the module is running as must have permissions on the objects accessed by the module.&lt;br /&gt;&lt;br /&gt;USE Sales;&lt;br /&gt;GO&lt;br /&gt;CREATE PROCEDURE dbo.usp_Demo&lt;br /&gt;WITH EXECUTE AS 'CompanyDomain\SqlUser1'&lt;br /&gt;AS&lt;br /&gt;SELECT user_name();&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://msdn2.microsoft.com/en-us/library/ms188354(sql.90).aspx"&gt;SQL Server 2005 Books Online&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-3185238452457588930?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/3185238452457588930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=3185238452457588930' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/3185238452457588930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/3185238452457588930'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/06/execute-as-clause-t-sql.html' title='EXECUTE AS Clause (T-SQL)'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-5303936665184717083</id><published>2007-06-09T09:20:00.000-07:00</published><updated>2007-06-09T09:24:00.504-07:00</updated><title type='text'>Perform highly privileged activities in SQL Server</title><content type='html'>&lt;ul&gt;&lt;li&gt;Define the minimal permissions necessary to perform the action. &lt;/li&gt;&lt;li&gt;Define a database role that contains those permissions. &lt;/li&gt;&lt;li&gt;Assign a user to that role. &lt;/li&gt;&lt;li&gt;Create a stored procedure with the EXECUTE AS clause that will perform those functions.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/technet/technetmag/issues/2007/05/SQLQA/?topics=/technet/technetmag/issues/2007/05/SQLQA"&gt;Best Practices Analyzer, Multi-Core Processors, and More&lt;/a&gt; by Nancy Michell&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-5303936665184717083?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/5303936665184717083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=5303936665184717083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/5303936665184717083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/5303936665184717083'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/06/perform-highly-privileged-activities-in.html' title='Perform highly privileged activities in SQL Server'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-8009474027448044073</id><published>2007-06-09T08:12:00.000-07:00</published><updated>2007-06-09T08:16:04.116-07:00</updated><title type='text'>T-SQL to find the size of total and free physical memory</title><content type='html'>With VASummary(Size,Reserved,Free) AS&lt;br /&gt;(SELECT&lt;br /&gt;Size = VaDump.Size,&lt;br /&gt;Reserved = SUM(CASE(CONVERT(INT, VaDump.Base)^0)&lt;br /&gt;WHEN 0 THEN 0 ELSE 1 END),&lt;br /&gt;Free = SUM(CASE(CONVERT(INT, VaDump.Base)^0)&lt;br /&gt;WHEN 0 THEN 1 ELSE 0 END)&lt;br /&gt;FROM&lt;br /&gt;(&lt;br /&gt;SELECT CONVERT(VARBINARY, SUM(region_size_in_bytes))&lt;br /&gt;AS Size,&lt;br /&gt;region_allocation_base_address AS Base&lt;br /&gt;FROM sys.dm_os_virtual_address_dump&lt;br /&gt;WHERE region_allocation_base_address &lt;&gt; 0x0&lt;br /&gt;GROUP BY region_allocation_base_address&lt;br /&gt;UNION&lt;br /&gt;SELECT CONVERT(VARBINARY, region_size_in_bytes),&lt;br /&gt;region_allocation_base_address&lt;br /&gt;FROM sys.dm_os_virtual_address_dump&lt;br /&gt;WHERE region_allocation_base_address = 0x0&lt;br /&gt;)&lt;br /&gt;AS VaDump&lt;br /&gt;GROUP BY Size)&lt;br /&gt;&lt;br /&gt;SELECT SUM(Size*Free)/1024 AS [Total avail mem, KB] ,CAST(MAX(Size) AS INT)/1024&lt;br /&gt;AS [Max free size, KB]&lt;br /&gt;FROM VASummary&lt;br /&gt;WHERE Free &lt;&gt; 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/technet/technetmag/issues/2007/05/SQLQA/?topics=/technet/technetmag/issues/2007/05/SQLQA"&gt;Best Practices Analyzer, Multi-Core Processors, and More&lt;/a&gt; by Nancy Michell&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-8009474027448044073?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/8009474027448044073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=8009474027448044073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/8009474027448044073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/8009474027448044073'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/06/t-sql-to-find-size-of-total-and-free.html' title='T-SQL to find the size of total and free physical memory'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-6277214577826473743</id><published>2007-06-02T09:53:00.000-07:00</published><updated>2007-06-02T11:37:50.510-07:00</updated><title type='text'>Using GC Efficiently</title><content type='html'>Maoni Stephens's blogs:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/maoni/archive/2004/06/15/156626.aspx"&gt;Using GC Efficiently – Part 1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/maoni/archive/2004/09/25/234273.aspx"&gt;Using GC Efficiently – Part 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/476750.aspx"&gt;What’s new in the CLR 2.0 GC?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Rico Mariani's blog:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/41281.aspx"&gt;Mid-life crisis &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-6277214577826473743?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/6277214577826473743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=6277214577826473743' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6277214577826473743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6277214577826473743'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/06/using-gc-efficiently.html' title='Using GC Efficiently'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-2186143652237186942</id><published>2007-06-01T13:00:00.000-07:00</published><updated>2007-06-01T13:18:41.012-07:00</updated><title type='text'>GC Performance Counters</title><content type='html'>The .NET Memory performance counters are updated only when a collection occurs; they are not updated according to the sampling rate used in the Performance Monitor application.&lt;br /&gt;&lt;br /&gt;The % Time in GC indicates the percentage of time spent in the GC since the end of the last collection. If you see a really high value (say 50 percent or more), then you should look at what is going on inside the managed heap. If, instead, % Time in GC does not go above 10 percent, it usually is not worth spending time trying to reduce the time the GC spends in collections because the benefits will be marginal.&lt;br /&gt;&lt;br /&gt;If you think your application is spending too much time performing garbage collections, the next performance counter to check is Allocated Bytes/sec. This shows the allocation rate. Unfortunately, this counter is not highly accurate when the allocation rate is very low. The counter may indicate 0 bytes/sec if the sampling frequency is higher than the collection frequency since the counter is only updated at the beginning of each collection. This does not mean there were no allocations; rather, the counter was not updated because no collection happened in that particular interval.&lt;br /&gt;&lt;br /&gt;If you suspect that you are allocating a lot of large objects (85,000 bytes or bigger), check the Large Object Heap (LOH) size. This is updated at the same time as Allocated Bytes/sec.&lt;br /&gt;&lt;br /&gt;A high allocation rate can cause a lot of collection work and as a result might be reflected in a high % Time in GC. A mitigating factor is if objects usually die young, since they will typically be collected during a Gen 0 collection. To determine how object lifecycles impact collection, check the performance counters for Gen collections: # Gen 0 Collections, # Gen 1 Collections, and # Gen 2 Collections. These show the number of collections that have occurred for the respective generation since the process started. Gen 0 and Gen 1 collections are usually cheap, so they don't have a big impact on the application's performance.&lt;br /&gt;&lt;br /&gt;As a rule of thumb, a healthy ratio between generation collections is one Gen 2 collection for every ten Gen 1 collections. If you are seeing a lot of time spent in garbage collection, it could be that Gen 2 collections are being done too often.&lt;br /&gt;&lt;br /&gt;You may find that % Time in GC is high but the allocation rate is not high. This can happen if many of the objects you allocate survive garbage collection and are promoted to the next generation. The promotion counters—Promoted Memory from Gen 0 and Promoted Memory from Gen 1—can tell you if the promotion rate is an issue. You want to avoid a high promotion rate from Gen 1.&lt;br /&gt;&lt;br /&gt;High values for the Gen 1 and Gen 2 heap sizes are usually associated with high values in the promotion rate counters. You can check the GC heap sizes by using Gen 1 heap size and Gen 2 heap size. There is a Gen 0 heap size counter, but it doesn't measure Gen 0 size. Instead, it indicates the budget of Gen 0—meaning how much you can allocate in Gen 0 before the next Gen 0 collection will be triggered.&lt;br /&gt;&lt;br /&gt;In all scenarios where you use a lot of objects that need finalization—for instance, objects that rely on COM components for some processing—you can take a look at the Promoted Finalization-Memory from Gen 0 counter. This tells you the amount of memory that cannot be reused because the objects that use the memory need to be added to the finalization queue and therefore cannot be collected immediately. IDisposable and the using statements in C# and Visual Basic® can help reduce the number of objects that end up in the finalization queue, thus reducing the associated cost.&lt;br /&gt;&lt;br /&gt;It's also worth checking if the application is inducing too many collections. The # Induced GC counter tells you how many collections have been induced since the process started. In general it is not recommended that you induce GC collections. In most cases, if # Induced GC indicates a high number, you should consider it a bug. Most of the time people induce GCs in hopes of cutting down the heap size, but this is almost never a good idea. Instead, you should find out why your heap is growing.&lt;br /&gt;&lt;br /&gt;Adopted from &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/CLRInsideOut"&gt;CLR Inside Out: Investigating Memory Issues&lt;/a&gt; by Claudio Caldato and Maoni Stephens.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-2186143652237186942?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/2186143652237186942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=2186143652237186942' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/2186143652237186942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/2186143652237186942'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/06/gc-performance-counters.html' title='GC Performance Counters'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-6800188657019705563</id><published>2007-02-12T10:06:00.000-08:00</published><updated>2007-02-12T09:21:14.183-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Possible Performance Hits from Event Handlers and Callbacks</title><content type='html'>If a delegate uses an instance callback method, then the delegate contains an implicit &lt;strong&gt;&lt;em&gt;this&lt;/em&gt;&lt;/strong&gt; pointer, where &lt;strong&gt;&lt;em&gt;this&lt;/em&gt;&lt;/strong&gt; is the instance of the class &lt;strong&gt;A&lt;/strong&gt; containing the callback methed. When a garbage collection occurs, the instance of the class &lt;strong&gt;A&lt;/strong&gt; remains reachable from a rooted reference if the delegate instance is reachable. To allow a GC collects the instance of the class &lt;strong&gt;A&lt;/strong&gt;, make the callback function static.&lt;br /&gt;&lt;br /&gt;Adopted from &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/01/ManagedLeaks/default.aspx"&gt;Debug Leaky Apps: Identify And Prevent Memory Leaks In Managed Code&lt;/a&gt; by James Kovacs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-6800188657019705563?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/6800188657019705563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=6800188657019705563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6800188657019705563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6800188657019705563'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/02/possible-performance-hits-from-event.html' title='Possible Performance Hits from Event Handlers and Callbacks'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-3597042974823984097</id><published>2007-02-12T09:12:00.000-08:00</published><updated>2007-02-12T09:11:24.033-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Memory Leaks'/><title type='text'>Large Object Heap Fragmentation</title><content type='html'>If an object is 85,000 bytes or larger, it is allocated on the large object heap. Unlike the rest of the managed heap, the Large Object Heap is not compacted due to the cost of moving the large objects.&lt;br /&gt;&lt;br /&gt;To avoid Large Object Heap fragmentation, the basic strategy is to determine how to reduce the application's reliance on temporary large objects, which are causing the gaps in the large object heap. If the fragmentation is due to re-allocating buffers, maintain a fixed set of buffers that are reused. If the fragmentation is being caused by concatenation of large numbers of strings, examine whether the System.Text.StringBuilder class can reduce the number of temporary strings created.&lt;br /&gt;&lt;br /&gt;Adopted from &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/01/ManagedLeaks/default.aspx"&gt;Debug Leaky Apps: Identify And Prevent Memory Leaks In Managed Code&lt;/a&gt; by James Kovacs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-3597042974823984097?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/3597042974823984097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=3597042974823984097' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/3597042974823984097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/3597042974823984097'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/02/large-object-heap-fragmentation.html' title='Large Object Heap Fragmentation'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-6430205827816235089</id><published>2007-02-12T09:03:00.000-08:00</published><updated>2007-01-28T10:24:34.628-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Memory Leaks'/><title type='text'>Leaking Stack Memory in Managed Code</title><content type='html'>There are only two real ways to leak stack space. The first is to have a method call that consumes significant stack resources and that never returns, thereby never releasing the associated stack frame. The other is by leaking a thread, and thus that thread's entire stack.&lt;br /&gt;&lt;br /&gt;By default, the stack size on modern desktop and server versions of Windows® is 1MB.&lt;br /&gt;&lt;br /&gt;Adopted from &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/01/ManagedLeaks/default.aspx"&gt;Debug Leaky Apps: Identify And Prevent Memory Leaks In Managed Code&lt;/a&gt; by James Kovacs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-6430205827816235089?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/6430205827816235089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=6430205827816235089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6430205827816235089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/6430205827816235089'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/02/leaking-stack-memory-in-managed-code.html' title='Leaking Stack Memory in Managed Code'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-4414158295194541232</id><published>2007-01-28T10:10:00.000-08:00</published><updated>2007-01-28T10:24:34.948-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Memory Leaks'/><title type='text'>Checking for Leaks in Managed Code</title><content type='html'>Signs that an application is leaking memory:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Throwing an OutOfMemoryException&lt;/li&gt;&lt;li&gt;Responsiveness is growing very sluggish because it started swapping virtual memory to disk&lt;/li&gt;&lt;li&gt;Memory use is gradually (or not so gradually) increasing in Task Manager&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Using PerfMon to determine what kind of memory is leaking:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Process/Private Bytes&lt;/li&gt;&lt;li&gt;.NET CLR Memory/# Bytes in All Heaps&lt;/li&gt;&lt;li&gt;.NET CLR LocksAndThreads/# of current logical Threads&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The Process/Private Bytes counter reports all memory that is exclusively allocated for a process and can't be shared with other processes on the system. The .NET CLR Memory/# Bytes in All Heaps counter reports the combined total size of the Gen0, Gen1, Gen2, and large object heaps. The .NET CLR LocksAndThreads/# of current logical Threads counter reports the number of logical threads in an AppDomain. &lt;/p&gt;&lt;p&gt;If an application's logical thread count is increasing unexpectedly, thread stacks are leaking. If Private Bytes is increasing, but # Bytes in All Heaps remains stable, unmanaged memory is leaking. If both counters are increasing, memory in the managed heaps is building up.&lt;/p&gt;&lt;p&gt;Adopted from &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/01/ManagedLeaks/default.aspx"&gt;Debug Leaky Apps: Identify And Prevent Memory Leaks In Managed Code&lt;/a&gt; by James Kovacs.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-4414158295194541232?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/4414158295194541232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=4414158295194541232' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/4414158295194541232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/4414158295194541232'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2007/01/checking-for-leaks-in-managed-code.html' title='Checking for Leaks in Managed Code'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-116250068570489262</id><published>2006-11-02T12:42:00.000-08:00</published><updated>2006-11-02T12:51:26.686-08:00</updated><title type='text'>What Security Means</title><content type='html'>Security means that the systems have the properties of confidentiality, integrity, and availability, that users are authenticated and authorized correctly, and that transactions are non-repudiable.&lt;br /&gt;&lt;br /&gt;The following explains each property.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Confidentiality - Data is only available to the people intended to access it.&lt;/li&gt;&lt;li&gt;Integrity - Data and system resources are only changed in appropriate ways by appropriate people.&lt;/li&gt;&lt;li&gt;Availability - Systems are ready when needed and perform acceptably.&lt;/li&gt;&lt;li&gt;Authentication - The identity of users is established (or you’re willing to accept anonymous users).&lt;/li&gt;&lt;li&gt;Authorization - Users are explicitly allowed or denied access to resources.&lt;/li&gt;&lt;li&gt;Nonrepudiation - Users can’t perform an action and later deny performing it.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The following maps threats to the properties that guard against them.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Spoofing - Authentication&lt;/li&gt;&lt;li&gt;Tampering - Integrity&lt;/li&gt;&lt;li&gt;Repudiation - Non-repudiation &lt;/li&gt;&lt;li&gt;Information disclosure - Confidentiality&lt;/li&gt;&lt;li&gt;Denial of service - Availability&lt;/li&gt;&lt;li&gt;Elevation of privilege - Authorization&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Adopted from &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/ThreatModeling/default.aspx"&gt;Threat Modeling: Uncover Security Design Flaws Using The STRIDE Approach&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-116250068570489262?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/116250068570489262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=116250068570489262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/116250068570489262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/116250068570489262'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/11/what-security-means.html' title='What Security Means'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-116250011349590500</id><published>2006-11-02T12:36:00.000-08:00</published><updated>2006-11-02T12:52:32.406-08:00</updated><title type='text'>Saltzer and Schroeder's Security Design Principles</title><content type='html'>Principles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Open design - Assume the attackers have the sources and the specs. &lt;/li&gt;&lt;li&gt;Fail-safe defaults - Fail closed; no single point of failure. &lt;/li&gt;&lt;li&gt;Least privilege - No more privileges than what is needed. &lt;/li&gt;&lt;li&gt;Economy of mechanism - Keep it simple, stupid. &lt;/li&gt;&lt;li&gt;Separation of privileges - Don’t permit an operation based on a single condition. &lt;/li&gt;&lt;li&gt;Total mediation - Check everything, every time. &lt;/li&gt;&lt;li&gt;Least common mechanism - Beware of shared resources. &lt;/li&gt;&lt;li&gt;Psychological acceptability - Will they use it? &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Adopted from &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/ThreatModeling/default.aspx"&gt;Threat Modeling: Uncover Security Design Flaws Using The STRIDE Approach&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-116250011349590500?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/116250011349590500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=116250011349590500' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/116250011349590500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/116250011349590500'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/11/saltzer-and-schroeders-security-design.html' title='Saltzer and Schroeder&apos;s Security Design Principles'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-116223841391245294</id><published>2006-10-30T11:52:00.000-08:00</published><updated>2006-10-30T12:00:16.340-08:00</updated><title type='text'>Documenting and Evaluating the Security Guarantees of Your Apps</title><content type='html'>In the article &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/ExtendingSDL/default.aspx"&gt;Extending SDL: Documenting And Evaluating The Security Guarantees Of Your Apps&lt;/a&gt;, Mark Pustilnik pointed out the missing link in SDL:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tying secure design and implementation of software directly to the functional specifications of security features in a way that can be understood by customers at any level of depth they require (and that your licensing terms allow).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;According to Mark, security of software is not a compliance artifact. Rather, it is a set of key features that can and should be documented, evaluated, and used when making purchasing decisions.&lt;/p&gt;&lt;p&gt;Today's software is, by and large, developed and distributed in a manner that is most suited to the following two principles: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Utilizing sound software engineering practices during implementation &lt;/li&gt;&lt;li&gt;Patching vulnerabilities found by hackers after software has been deployed&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Mark intruduced three rules:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Design and develop software that addresses the stated as well as implicit security requirements placed upon it by users.&lt;/li&gt;&lt;li&gt;Avoid introducing features into the software that imply, but cannot deliver, defensible security guarantees.&lt;/li&gt;&lt;li&gt;Publish sufficient information about the design of security features to convince your users that the design is solid.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Security considerations and guarantees apply to many features of the software, even those that on the surface are not primarily security features. Listing requirements in conjunction with the associated security guarantees is the key to understanding a full range of protections afforded by the software.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-116223841391245294?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/116223841391245294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=116223841391245294' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/116223841391245294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/116223841391245294'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/10/documenting-and-evaluating-security.html' title='Documenting and Evaluating the Security Guarantees of Your Apps'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-115464910489620026</id><published>2006-08-03T16:51:00.000-07:00</published><updated>2006-08-03T16:51:45.016-07:00</updated><title type='text'>UAC Resources</title><content type='html'>The following are some UAC resouces I found helpful.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Chris Corio, &lt;a onclick="window.event.cancelBubble=" href="http://www.microsoft.com/technet/technetmag/issues/2006/05/FirstLook/default.aspx" target="_parent"&gt;First Look: New Security Features in Windows Vista &lt;/a&gt;&lt;/li&gt;&lt;li&gt;UAC Team, &lt;a onclick="window.event.cancelBubble=" href="http://blogs.msdn.com/uac/" target="_parent"&gt;UAC Blog&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a onclick="window.event.cancelBubble=" href="http://www.microsoft.com/technet/WindowsVista/library/f72d606c-ad66-403b-be70-3d59e4e5c10f.mspx" target="_parent"&gt;Getting Started with User Account Control on Windows Vista &lt;/a&gt;&lt;a onclick="window.event.cancelBubble=" href="http://www.microsoft.com/technet/WindowsVista/library/f72d606c-ad66-403b-be70-3d59e4e5c10f.mspx" target="_parent"&gt;Beta 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a onclick="window.event.cancelBubble=" href="http://www.microsoft.com/technet/WindowsVista/library/00d04415-2b2f-422c-b70e-b18ff918c281.mspx" target="_parent"&gt;Understanding and Configuring User Account Control in Windows &lt;/a&gt;&lt;a onclick="window.event.cancelBubble=" href="http://www.microsoft.com/technet/WindowsVista/library/00d04415-2b2f-422c-b70e-b18ff918c281.mspx" target="_parent"&gt;Vista Beta 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/technet/windowsvista/appcompat/default.mspx"&gt;Application Compatibility&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html/AccProtVista.asp"&gt;Developer Best Practices and Guidelines for Applications in a Least Privileged Environment&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/technet/windowsvista/security/uac.mspx"&gt;Windows Vista User Account Control&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;My last four posts used these resources freely.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-115464910489620026?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/115464910489620026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=115464910489620026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115464910489620026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115464910489620026'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/08/uac-resources.html' title='UAC Resources'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-115464811326556323</id><published>2006-08-03T16:26:00.000-07:00</published><updated>2006-08-03T16:35:13.753-07:00</updated><title type='text'>UAC Data Virtualization</title><content type='html'>Windows Vista includes file and registry virtualization technology for applications that are not UAC compliant and that have historically required an administrator's access token to run correctly. Virtualization ensures that even applications that are not UAC compliant will be compatible with Windows Vista. When a non-UAC-compliant administrative application attempts to write to a protected directory, such as Program Files, UAC gives the application its own virtualized view of the resource it is attempting to change, using a copy-on-write strategy. The virtualized copy is maintained under the user's profile. As a result, a separate copy of the virtualized file is created for each user that runs the non-compliant application.&lt;br /&gt;&lt;br /&gt;For example, if an application attempts to write to “C:\program files\appname\settings.ini” and the user doesn’t have permissions to write to that directory, the write will get redirected to “C:\Users\username\AppData\Local\VirtualStore\Program Files\appname\.” A write to "&lt;br /&gt;HKLM\Software\AppName" will get redirected to "&lt;br /&gt;HKCU\Software\Classes\VirtualStore\Machine\Software\AppName".&lt;br /&gt;&lt;br /&gt;Virtualization is enabled by default in Windows Vista. Virtualization does not apply to applications that are elevated and run with a full administrative access token. Virtualization is disabled for an application if a program includes an application manifest with a requested execution level attribute.&lt;br /&gt;&lt;br /&gt;Although virtualization allows the overwhelming majority of pre-Windows Vista applications to run, it is a short-term fix and not a long-term solution. Application developers should modify their applications to be compliant with the Windows Vista Logo program as soon as possible, rather than relying on file, folder, and registry virtualization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-115464811326556323?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/115464811326556323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=115464811326556323' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115464811326556323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115464811326556323'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/08/uac-data-virtualization.html' title='UAC Data Virtualization'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-115427728070471166</id><published>2006-07-30T09:27:00.000-07:00</published><updated>2006-07-30T09:40:28.413-07:00</updated><title type='text'>Consent/Credential Prompt</title><content type='html'>&lt;p align="center"&gt;&lt;a href="http://photos1.blogger.com/blogger/5389/634/1600/AppAware.0.gif"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/5389/634/320/AppAware.0.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;The UAC elevation prompts are also customized based on the type of executable that is requesting elevation. The diagram above illustrates the different UAC prompts that are displayed based on the type and state of the requesting executable. This behavior is the default for Windows Vista and is not configurable, with one exception-- the ability to configure blocked applications with Group Policy and to block applications that are not signed and validated.&lt;br /&gt;&lt;br /&gt;You can control what kind of user input that the prompt requires by configuring a new security policy setting introduced in Windows Vista. The setting is located in the Security Policy Manager Microsoft Management Console (MMC) snap-in under the path: Local Security Settings-&gt;Local Policies-&gt;Security Options.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-115427728070471166?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/115427728070471166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=115427728070471166' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115427728070471166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115427728070471166'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/07/consentcredential-prompt.html' title='Consent/Credential Prompt'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-115427678369027321</id><published>2006-07-30T09:20:00.000-07:00</published><updated>2006-07-30T09:26:23.760-07:00</updated><title type='text'>Privilege Specification Model</title><content type='html'>UAC extends the access token system already in use for managing Windows logons with a new access token mechanism that supplies each administrator logon with two security access tokens: a UAC access token and a full administrator access token. The default access token is a standard user access token.&lt;br /&gt;&lt;br /&gt;The default access token that is used to launch the desktop, the explorer.exe process, is a standard user access token, and any child processes of explorer.exe will inherit this standard user access token.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-115427678369027321?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/115427678369027321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=115427678369027321' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115427678369027321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115427678369027321'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/07/privilege-specification-model.html' title='Privilege Specification Model'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-115427636701390248</id><published>2006-07-30T09:09:00.000-07:00</published><updated>2006-07-30T09:19:27.336-07:00</updated><title type='text'>UAC Technologies</title><content type='html'>User Account Control (UAC) is a new security component of the Microsoft® Windows Vista operating system. UAC will be one of the first technologies you will likely encounter in Windows Vista. User Account Control is a collection of technologies in Windows Vista that enables users to run as standard users, with low privilege, while still being able to perform common tasks and enjoy high application compatibility. UAC technologies include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Privilege Specification Model&lt;/li&gt;&lt;li&gt;Consent/Credential Prompt&lt;/li&gt;&lt;li&gt;Application Information Service (AIS)&lt;/li&gt;&lt;li&gt;Installer Detection&lt;/li&gt;&lt;li&gt;Data Virtualization&lt;/li&gt;&lt;li&gt;ActiveX Installer Service&lt;/li&gt;&lt;li&gt;And more ... &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-115427636701390248?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/115427636701390248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=115427636701390248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115427636701390248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115427636701390248'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/07/uac-technologies.html' title='UAC Technologies'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-115031592833186366</id><published>2006-06-14T13:11:00.000-07:00</published><updated>2006-06-14T13:12:08.443-07:00</updated><title type='text'>The Layers of a Manageable System</title><content type='html'>In Craig McMurtry's talk, he spent most of his time on the layers of a manageable system. These layers are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Instruments (Data &amp;amp; Control Points). These are discernable properties for ascertaining the health of the application, and various controls that can be manipulated to adjust its behavior. Configuration System, Events, Performance Counters, Logs, Traces, WMI Providers.&lt;/li&gt;&lt;li&gt;Monitoring and Manipulation Tools. Management Interfaces, Configuration Editor, Event Viewer, WS-Management, WMI Clients, MONAD Scripts and CmdLets, TraceViewer.&lt;/li&gt;&lt;li&gt;Management Model (Aspects and States:Microsoft Management Model Designer). Now given the instrumentation points that one can examine and manipulate, and given all one’s tools for accessing them … when you organize those logically so that you know how to use them to detect what states your applications are in, and how to use them to move the application from worse states into better ones … that logical organization of one’s tools and one’s knowledge of the application is called a Management Model or a Health Model.&lt;/li&gt;&lt;li&gt;Integrated Management Solution. MOM Pack can be used to implement your management model.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As an application developer or architect, it is your job to provide the instrumentation at the lowest level, and you need to ensure that instrumentation is accessible using standard tools, so that system administrators are not required to learn a whole bunch of new tricks, but can monitor and manage your application with the tools they already know. And it is also your job to capture your knowledge of how the application should work and how to keep it working in the form of a management model. Finally, it is your job to realize that management model in an integrated management solution. &lt;/p&gt;&lt;p&gt;Adopted from Craig's talk.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-115031592833186366?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/115031592833186366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=115031592833186366' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115031592833186366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115031592833186366'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/06/layers-of-manageable-system_14.html' title='The Layers of a Manageable System'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-115031399299975787</id><published>2006-06-14T12:25:00.000-07:00</published><updated>2006-06-14T12:39:53.163-07:00</updated><title type='text'>Crown Jewels of Windows Communication Foundation</title><content type='html'>Craig McMurtry gave an excellent talk on Windows Communication Foundation: Enabling Manageable Systems. In his talk, he indicated that WCF has at least four crown jewels:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Service model programming model.  &lt;/li&gt;&lt;li&gt;Pluggable software factory architecture&lt;/li&gt;&lt;li&gt;Claims-based authorization &lt;/li&gt;&lt;li&gt;Management facilities&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-115031399299975787?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/115031399299975787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=115031399299975787' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115031399299975787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/115031399299975787'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/06/crown-jewels-of-windows-communication.html' title='Crown Jewels of Windows Communication Foundation'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114900685888845437</id><published>2006-05-30T09:32:00.000-07:00</published><updated>2006-06-14T12:24:53.226-07:00</updated><title type='text'>The Hardest Single Part of Building a Software System Is Deciding What to Build</title><content type='html'>A quote from Fred Brooks:&lt;br /&gt;&lt;br /&gt;The hardest single part of building a software system is deciding what to build. No other part of the conceptual work is as difficult in establishing the detailed technical requirements, including the interfaces to people, to machines, and to other software systems. No other part of the work so cripples the results if done wrong. No other part is more difficult to rectify later. Therefore, the most important function that the software builder performs for the client is the iterative extraction and refinement of the product requirements.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114900685888845437?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114900685888845437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114900685888845437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114900685888845437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114900685888845437'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/05/hardest-single-part-of-building.html' title='The Hardest Single Part of Building a Software System Is Deciding What to Build'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114885218141954628</id><published>2006-05-28T14:31:00.000-07:00</published><updated>2006-05-28T14:36:21.486-07:00</updated><title type='text'>What Must Happen for Schedules to Work</title><content type='html'>&lt;p&gt;The following is Scott Berkun's list on what must happen for schedules to work&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Milestone length should match project volatility.&lt;/li&gt;&lt;li&gt;Be optimistic in the vision and skeptical in the schedule.&lt;/li&gt;&lt;li&gt;Bet on design.&lt;/li&gt;&lt;li&gt;Plan checkpoints for add/cut discussions&lt;a name="IDX-CHP-2-0163"&gt;&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Inform the team about planning philosophy.&lt;/li&gt;&lt;li&gt;Gauge the team's experience with the problem space&lt;a name="IDX-CHP-2-0164"&gt;&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Gauge the team's confidence and experience in working together.&lt;/li&gt;&lt;li&gt;Take on risks early.&lt;/li&gt;&lt;/ul&gt;Adopted from &lt;a href="http://www.amazon.com/gp/product/0596007868/qid=1146956389/sr=2-1/ref=pd_bbs_b_2_1/002-0380953-0249606?s=books&amp;v=glance&amp;amp;n=283155"&gt;The Art of Project Management&lt;/a&gt; by Scott Berkun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114885218141954628?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114885218141954628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114885218141954628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114885218141954628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114885218141954628'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/05/what-must-happen-for-schedules-to-work.html' title='What Must Happen for Schedules to Work'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114885161580849030</id><published>2006-05-28T14:22:00.000-07:00</published><updated>2006-09-09T16:17:50.173-07:00</updated><title type='text'>Project Schedules</title><content type='html'>Schedules serve three functions: allowing for commitments to be made, encouraging everyone to see her work as a contribution to a whole, and enabling the tracking of progress. Even when schedules slip, they still have value. &lt;p&gt;&lt;/p&gt;&lt;p&gt;I like the following Scott Berkun's statements regarding schedules:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Until there is a draft schedule suggesting specific dates and times for when things have to be ready, it's unlikely that connections and dependencies across people or teams will be scrutinized. &lt;/li&gt;&lt;li&gt;Schedules force everyone whose work appears on them to carefully think through the work they need to do and how it fits into what others are doing. &lt;/li&gt;&lt;li&gt;Good schedules come only from a leader or a team that relentlessly pursues and achieves good judgment in many different aspects of software development.&lt;/li&gt;&lt;li&gt;A schedule doesn't have to be perfect. Schedules need to be good enough for the team and the leaders to believe in, provide a basis for tracking and making adjustments, and have a probability of success that satisfies the client, the business, or the overall project sponsor.&lt;/li&gt;&lt;li&gt;Despite how perfect and wonderful all the estimates for work items are, the real schedule risks are the things not written down.&lt;/li&gt;&lt;li&gt;Big schedules should be divided into small schedules to minimize risks and increase the frequency of adjustments.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Adopted from &lt;a href="http://www.amazon.com/gp/product/0596007868/qid=1146956389/sr=2-1/ref=pd_bbs_b_2_1/002-0380953-0249606?s=books&amp;v=glance&amp;amp;n=283155"&gt;The Art of Project Management&lt;/a&gt; by Scott Berkun.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114885161580849030?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114885161580849030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114885161580849030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114885161580849030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114885161580849030'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/05/project-schedules.html' title='Project Schedules'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114885062928034606</id><published>2006-05-28T14:04:00.000-07:00</published><updated>2006-05-28T14:10:29.503-07:00</updated><title type='text'>Good Estimates Come From Good Designs</title><content type='html'>The most important thing about good estimates is that they only come from credible designs and requirements. Good engineering estimates are possible only if you have two things: good information and good engineers.&lt;br /&gt;&lt;br /&gt;Here are some additional ways to ensure good estimates:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Establish baseline confidence intervals for estimates.&lt;/li&gt;&lt;li&gt;Lead programmers must set the bar for quality estimations by asking good questions and taking wise approaches that the team can emulate.&lt;/li&gt;&lt;li&gt;Programmers should be trusted. &lt;/li&gt;&lt;li&gt;Estimates depend on the programmer's understanding of the project goals.&lt;/li&gt;&lt;li&gt;Estimates should be based on previous performance.&lt;/li&gt;&lt;li&gt;Specification or design quality should be to whatever point engineering needs to make good estimates.&lt;/li&gt;&lt;li&gt;There are known techniques for making better estimates. For example, PERT.&lt;/li&gt;&lt;/ul&gt;Adopted from &lt;a href="http://www.amazon.com/gp/product/0596007868/qid=1146956389/sr=2-1/ref=pd_bbs_b_2_1/002-0380953-0249606?s=books&amp;v=glance&amp;amp;n=283155"&gt;The Art of Project Management&lt;/a&gt; by Scott Berkun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114885062928034606?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114885062928034606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114885062928034606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114885062928034606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114885062928034606'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/05/good-estimates-come-from-good-designs.html' title='Good Estimates Come From Good Designs'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114842491797673965</id><published>2006-05-23T20:55:00.000-07:00</published><updated>2006-05-23T20:12:35.410-07:00</updated><title type='text'>Software as a Service (SaaS)</title><content type='html'>&lt;p align="left"&gt;Expressed most simply, software as a service can be characterized as follows:&lt;/p&gt;&lt;p align="center"&gt;"&lt;strong&gt;Software deployed as a hosted service and accessed over the Internet.&lt;/strong&gt;"&lt;/p&gt;&lt;p&gt;It doesn't prescribe any specific application architecture; it doesn't say anything about specific technologies or protocols; it doesn't draw a distinction between business-oriented and consumer-oriented services, or require specific business models. According to this definition, the key distinguishing features of software as a service are where the application code resides, and how they are deployed and accessed.&lt;br /&gt;&lt;br /&gt;For example, consider Web-based e-mail services, such as Microsoft Hotmail. It meets all of the basic criteria: a vendor hosts all of the program logic and data, and provides end users with access to this data over the public Internet, through a Web-based user interface.&lt;br /&gt;&lt;br /&gt;From an application architect's point of view, there are three key differentiators that separate a well-designed SaaS application from a poorly designed one. A well-designed SaaS application is scalable, multi-tenant-efficient, and configurable.&lt;/p&gt;&lt;p&gt;SaaS is going to have a major impact on the software industry, because software as a service will change the way people build, sell, buy, and use software. &lt;/p&gt;&lt;p&gt;Adopted from &lt;a href="http://msdn.microsoft.com/architecture/default.aspx?pull=/library/en-us/dnbda/html/ArchStratCtchLngTail.asp"&gt;Architecture Strategies for Catching the Long Tail&lt;/a&gt; by Frederick Chong and Gianpaolo Carraro.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114842491797673965?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114842491797673965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114842491797673965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114842491797673965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114842491797673965'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/05/software-as-service-saas.html' title='Software as a Service (SaaS)'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114843901835321726</id><published>2006-05-23T19:27:00.000-07:00</published><updated>2006-05-23T19:51:38.010-07:00</updated><title type='text'>Benefits of Software as a Service</title><content type='html'>SaaS provides the following benefits:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Transferring IT responsibilities. A much larger percentage of the IT budget is available to spend on software, typically in the form of subscription fees to SaaS providers. The budget spent on hardware and professional services will be much less.&lt;/li&gt;&lt;li&gt;Leveraging economy of scale. Even accounting for the hardware and professional services costs incurred by SaaS vendors, customers can still obtain significantly greater pure software functionality for the same IT budget,&lt;/li&gt;&lt;li&gt;Selling to the long tail. SaaS vendors can offer solutions at a much lower cost than traditional vendors, not only in monetary terms, but also by greatly reducing the need for customers to add complexity to their IT infrastructure. This gives SaaS exclusive access to an entirely new range of potential customers that have always been inaccessible to traditional solution vendors, because it has never before been cost-effective to serve them.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Adopted from &lt;a href="http://msdn.microsoft.com/architecture/default.aspx?pull=/library/en-us/dnbda/html/ArchStratCtchLngTail.asp"&gt;Architecture Strategies for Catching the Long Tail&lt;/a&gt; by Frederick Chong and Gianpaolo Carraro.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114843901835321726?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114843901835321726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114843901835321726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114843901835321726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114843901835321726'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/05/benefits-of-software-as-service.html' title='Benefits of Software as a Service'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114747551996402060</id><published>2006-05-12T16:02:00.000-07:00</published><updated>2006-05-12T16:12:00.376-07:00</updated><title type='text'>ADO.NET vNext</title><content type='html'>Carl Perry gave a talk on ADO.NET vNext, the future version of ADO.NET. Frankly speaking, I don't quite understand his talk. Here are some high level recap of his talk:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Focus on EDM, entity data model&lt;/li&gt;&lt;li&gt;E-SQL is created and used to query entities&lt;/li&gt;&lt;li&gt;Support LINQ&lt;/li&gt;&lt;li&gt;The model is flexible on the provider, the provide could be Oracle provider, or Web services, etc&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I don't like E-SQL simply because I need to learn another new language.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114747551996402060?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114747551996402060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114747551996402060' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114747551996402060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114747551996402060'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/05/adonet-vnext.html' title='ADO.NET vNext'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114695918668300435</id><published>2006-05-06T16:42:00.000-07:00</published><updated>2006-05-06T20:20:54.196-07:00</updated><title type='text'>The Simpler Your View of What You Do the More Power and Focus You Will Have in Doing It</title><content type='html'>In his book &lt;a href="http://www.amazon.com/gp/product/0596007868/qid=1146956389/sr=2-1/ref=pd_bbs_b_2_1/002-0380953-0249606?s=books&amp;v=glance&amp;amp;n=283155"&gt;The Art of Project Management&lt;/a&gt;, Scott Berkun states: &lt;strong&gt;The simpler your view of what you do, the more power and focus you will have in doing it&lt;/strong&gt;. I like this statement very much. This statement can be applied to many things. Scott explained it as “Periodically maintain a simple view of our work.” I like to apply it to software requirements and designs.&lt;br /&gt;&lt;br /&gt;In the past, I saw that many projects failed because the designers of requirements and designs seeked too much on “perfectness”, fancy, and overly complete. If they can see every detail down the road and the future trend, they are able to design a rather perfect product. In reality, that’s not the case.&lt;br /&gt;&lt;br /&gt;Only a small percentage of designers know that it is way better to figure out core pieces of the product, focus on them, implement them first, and even consider releasing them first. Here are some reasons.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;First, it’s simpler to do that&lt;/strong&gt;. A simple math explains that. Assume that you are given three requirements and they are not independent. You might drill down to a dozen of requirements. So you have a dozen of requirements in front of you. You focus on them and won’t MISS any of them. Now assume that you are given twenty requirements and they are not independent. You might drill down to over a hundred requirements. It’s much more complicated to create a design covering all of them and fine tuning all the relationships. It’s very easy to miss a couple of requirements.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Core pieces of your product are much more solid&lt;/strong&gt;. You have fewer requirements; the project size (for this phase) is smaller; the structure is simpler. These all help on your design and implementation.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;It’s much easier to adjust directions according to customer feedbacks&lt;/strong&gt;. Your design might not be exactly what customers expect. It’s much easier to adjust directions because the product size is smaller and the structure is simpler. You might adjust the priority of your future feature list according to customer feedbacks.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;You might earn market share because you release your product earlier&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;You might make money earlier to sustain your future development&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;You might adopt latest technology in your next phase of your product&lt;/strong&gt;. Technology changes rapidly, especially on application side. You might expect that there are significant changes every two years. If you phase out, you might apply the latest technology to your next phase of the product.&lt;br /&gt;&lt;br /&gt;You should keep one thing in mind: &lt;strong&gt;You should design your components in the way that it is easier to extend them&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Let me conclude this post with a quote from Albert Einstein: &lt;strong&gt;Any fool can make things bigger, more complex, and more violent. It takes a touch of genius – and a lot of courage – to move in the opposite direction&lt;/strong&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114695918668300435?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114695918668300435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114695918668300435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114695918668300435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114695918668300435'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/05/simpler-your-view-of-what-you-do-more.html' title='The Simpler Your View of What You Do the More Power and Focus You Will Have in Doing It'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114695087841469466</id><published>2006-05-06T14:23:00.000-07:00</published><updated>2006-05-06T14:27:59.196-07:00</updated><title type='text'>ASP.NET Health Monitoring</title><content type='html'>Erik Reitan gave a talk on ASP.NET Health Monitoring. ASP.NET 2.0 provides an easy way to monitor the health of deployed ASP.NET applications, providing you with detailed run-time information about ASP.NET resources. You might only need to tweak a few settings on Web.config. Awsome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114695087841469466?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114695087841469466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114695087841469466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114695087841469466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114695087841469466'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/05/aspnet-health-monitoring.html' title='ASP.NET Health Monitoring'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114324455402299777</id><published>2006-03-24T15:41:00.000-08:00</published><updated>2006-03-24T15:55:54.426-08:00</updated><title type='text'>Useful Links on Localization</title><content type='html'>I 'm working on a localization project now. I found that the follwing links are helpful:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcreatingsatelliteassemblies.asp"&gt;Developing World-Ready Applications&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/msdnmag/issues/02/06/internat/toc.asp"&gt;Let Your Apps Span the Globe with Windows Forms and Visual Studio .NET&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/04/04/Bugslayer/"&gt;.NET Internationalization Utilities&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/10/Globalization/default.aspx"&gt;Extend Your Code's Global Reach With New Features In The .NET Framework 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/03/TextRendering/default.aspx"&gt;Build World-Ready Apps Using Complex Scripts In Windows Forms Controls&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114324455402299777?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114324455402299777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114324455402299777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114324455402299777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114324455402299777'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/03/useful-links-on-localization.html' title='Useful Links on Localization'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114287894344243021</id><published>2006-03-20T10:21:00.000-08:00</published><updated>2006-03-20T10:22:23.560-08:00</updated><title type='text'>Resource Fallback Process</title><content type='html'>&lt;p&gt;The hub and spoke model for packaging and deploying resources uses a fallback process to locate appropriate resources. If an application user requests a &lt;a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemResourcesResourceSetClassTopic.asp"&gt;ResourceSet&lt;/a&gt; that is unavailable, the common language runtime searches the hierarchy of cultures looking for an appropriate fallback resource that most closely matches the user's request, and raises an exception only as a last resort. At each level of the hierarchy, if an appropriate resource is found, the runtime uses it. If the resource is not found, the search continues at the next level. The resource fallback process is described in the following steps: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;The runtime first checks the GAC for an assembly matching the requested culture for your application. &lt;/li&gt;&lt;li&gt;The runtime next checks the directory of the currently executing assembly for a directory matching the requested culture. If it finds the directory, it searches that directory for a valid satellite assembly for the requested culture. &lt;/li&gt;&lt;li&gt;The runtime next searches the global assembly cache again, this time for the parent assembly of the requested resource. The parent is defined as the appropriate fallback culture. Consider parents as best-fit candidates; providing any resource is preferable to throwing an exception. &lt;/li&gt;&lt;li&gt;The runtime next checks the directory of the currently executing assembly to see if it contains a parent directory. If a parent directory exists, the runtime searches the directory for a valid satellite assembly for the parent culture. &lt;/li&gt;&lt;li&gt;The runtime next searches parent assemblies, as in the previous step, through many potential levels. Each culture has only one parent, but a parent might have its own parent. &lt;/li&gt;&lt;li&gt;If the culture that was originally specified and all parents have been searched and the resource is still not found, the resource for the default (fallback) culture is used. &lt;/li&gt;&lt;li&gt;Finally, if the runtime does not find a resource for a default (fallback) culture, an exception is thrown indicating that the resource could not be found.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Adopted from &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconPackagingDeployingResources.asp"&gt;SDK&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114287894344243021?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114287894344243021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114287894344243021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114287894344243021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114287894344243021'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/03/resource-fallback-process.html' title='Resource Fallback Process'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114254291645575071</id><published>2006-03-16T12:56:00.000-08:00</published><updated>2006-03-16T13:03:34.896-08:00</updated><title type='text'>How to Enable CLR in SQL Server 2005</title><content type='html'>CLR is disable by default in SQL Server 2005. So if you write a SQL assembly and deploy it to your SQL Server 2005. It won't let you execute it.&lt;br /&gt;&lt;br /&gt;The SQL Server 2005 Surface Area Configuration let you enable CLR - without having to do it the t-sql way. The tool is under start/All programs/sql server 2005/Configuration Tools. Once in there, you can choose between "Surface Area Config for Services &amp;amp; Connections" or "surface Area Config for Features". Choose Features and you will see the CLR checkbox.&lt;br /&gt;&lt;br /&gt;I learned this from &lt;a id="Comments.ascx_CommentList__ctl0_NameLink" href="http://thedatafarm.com/blog" target="_blank"&gt;Julie Lerman&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114254291645575071?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114254291645575071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114254291645575071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114254291645575071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114254291645575071'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/03/how-to-enable-clr-in-sql-server-2005.html' title='How to Enable CLR in SQL Server 2005'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114133690811697515</id><published>2006-03-02T13:55:00.000-08:00</published><updated>2006-03-02T14:01:48.306-08:00</updated><title type='text'>List of .NET 2.0 and C# 2.0 new features</title><content type='html'>In his article &lt;a href="http://www.codeproject.com/books/net2_cs2_newfeatures.asp#Assembly"&gt;List of .NET 2.0 and C# 2.0 new features&lt;/a&gt;, Patrick Smacchia gave short descriptions on .NET 2.0 and C# 2.0 new features. Here is an example (quoted from his article).&lt;br /&gt;&lt;br /&gt;The use of the AssemblyKeyFile attribute to sign an assembly is to be avoided. It is now preferred that you use the /keycontainer and /keyfile options of csc.exe, or the new project properties of Visual Studio 2005.&lt;br /&gt;&lt;br /&gt;I'll use his list to check if I do something that are not favorable to .NET 2.0 and C# 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114133690811697515?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114133690811697515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114133690811697515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114133690811697515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114133690811697515'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/03/list-of-net-20-and-c-20-new-features.html' title='List of .NET 2.0 and C# 2.0 new features'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114133613835314024</id><published>2006-03-02T13:46:00.000-08:00</published><updated>2006-03-02T13:48:58.810-08:00</updated><title type='text'>How to Create a Debugger Visualizer</title><content type='html'>In his article &lt;a href="http://www.codeproject.com/csharp/ImageVisualizer.asp"&gt;Create a Debugger Visualizer in 10 Lines of Code&lt;/a&gt;, Tomer Noy shows how to create a debugger visualizer to view Image objects. Very cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114133613835314024?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114133613835314024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114133613835314024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114133613835314024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114133613835314024'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/03/how-to-create-debugger-visualizer.html' title='How to Create a Debugger Visualizer'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-114107862499359941</id><published>2006-02-27T14:14:00.000-08:00</published><updated>2006-02-27T14:17:18.050-08:00</updated><title type='text'>Security Training Modules</title><content type='html'>The following is the link to short training videos and labs by &lt;a href="http://pluralsight.com/blogs"&gt;Keith Brown&lt;/a&gt; on some common security issues:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://channel9.msdn.com/wiki/default.aspx/SecurityWiki.SecurityTrainingModules"&gt;patterns &amp;amp; practices Security Training Modules Index&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-114107862499359941?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/114107862499359941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=114107862499359941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114107862499359941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/114107862499359941'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/02/security-training-modules.html' title='Security Training Modules'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113762969661964063</id><published>2006-01-17T18:31:00.000-08:00</published><updated>2006-01-18T16:24:11.436-08:00</updated><title type='text'>Infrastructure architects and the Logical Datacenter Designers in VSTS</title><content type='html'>The infrastructure architect's primary task is to model the network and datacenter onto which the application will be deployed.&lt;br /&gt;&lt;br /&gt;Although not directly related to the software development effort, these models are critical to the success of an application because the application must be validated against these constraints to prove that it can be deployed to that environment. This concept is known as &lt;em&gt;Design for Deployment&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Using Logical Datacenter Designers the architect will define the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Type of servers (application Hosts: Web server, database server, and generic)&lt;/li&gt;&lt;li&gt;Communication pathways between Hosts (server endpoints: HTTP, TDS, and generic)&lt;/li&gt;&lt;li&gt;Type of communication boudaries (Zones: Intranet, VPN, DMZ, and Firwalls)&lt;/li&gt;&lt;li&gt;Communication connection points (zone endpoints)&lt;/li&gt;&lt;li&gt;Type of services enabled&lt;/li&gt;&lt;li&gt;Configuration of application services&lt;/li&gt;&lt;li&gt;Adding or removing setting resources to logical servers and endpoints&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Adopted from Richard Hundhausen's book &lt;a href="http://www.amazon.com/gp/product/0735621853/qid=1135721774/sr=2-1/ref=pd_bbs_b_2_1/103-0639150-5402213?s=books&amp;v=glance&amp;amp;n=283155"&gt;Working With Microsoft Visual Studio 2005 Team System&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113762969661964063?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113762969661964063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113762969661964063' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113762969661964063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113762969661964063'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/01/infrastructure-architects-and-logical.html' title='Infrastructure architects and the Logical Datacenter Designers in VSTS'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113649355979751234</id><published>2006-01-04T18:50:00.000-08:00</published><updated>2006-01-05T13:51:57.576-08:00</updated><title type='text'>What Are Software Factories?</title><content type='html'>Software Factories consist of specialized tools, processes, and other assets, such as patterns, architectures, frameworks, templates, requirements, test cases, and deployment topologies; that encapsulate the business and technical knowledge of specific problem domains.&lt;br /&gt;&lt;br /&gt;Instead of taking a generic, one-size-fits-all approach, Software Factories use custom collections of DSLs to provide sets of abstractions customized to meet the needs of specific families of systems like ecommerce, financial arbitrage, or home banking applications. With Software Factories, models are used not only for analysis and design, but to support many varied types of computation across the entire software life cycle—even at run time. This is a fundamental principle of Software Factories, and also of Microsoft's Dynamic Systems Initiative (DSI), which implements and complements the Software Factories Initiative.&lt;br /&gt;&lt;br /&gt;A Software Factory defines a tailored methodology for a specific family of systems using a graph of viewpoints. Each viewpoint defines some aspect of the life cycle for members of the system family, such as requirements capture, database design, or service contract definition. The factory associates reusable assets with each viewpoint, and delivers them in the context of that viewpoint to the team's development members of the system family, eliminating the need to search for applicable assets, enabling validation, and supporting manual and automatic guidance enactment.&lt;br /&gt;&lt;br /&gt;Software Factories automate the packaging and delivery of the reusable assets, including models and model-driven tools, other types of tools, such as wizards, templates and utilities, development processes, implementation components, such as class libraries, frameworks and services, and content assets, such as patterns, style sheets, help files, configuration files, and documentation.&lt;br /&gt;&lt;br /&gt;Software Factories are not in any way, shape, or form intended to turn developers into menial laborers. Software Factories will instead make developers more productive, by automating rote and menial tasks, and by helping them work at higher levels of abstraction. Programmable tools supplied by factories will enable developers to spend more time thinking about how to solve problems, and less time doing all the housekeeping work required to create, build, and deploy their solutions.&lt;br /&gt;&lt;br /&gt;Adpoted from &lt;a style="FONT-WEIGHT: bold" href="http://msdn.microsoft.com/vstudio/teamsystem/reference/design_arch/default.aspx?pull=/library/en-us/dnvs05/html/vstsmodel.asp"&gt;Visual Studio 2005 Team System Modeling Strategy and FAQ&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113649355979751234?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113649355979751234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113649355979751234' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113649355979751234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113649355979751234'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/01/what-are-software-factories.html' title='What Are Software Factories?'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113641302573736369</id><published>2006-01-03T19:13:00.000-08:00</published><updated>2006-01-04T14:17:06.823-08:00</updated><title type='text'>DSL vs. UML</title><content type='html'>Microsoft would recommend using UML and UML-based tools for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sketching. &lt;/li&gt;&lt;li&gt;White boarding. &lt;/li&gt;&lt;li&gt;Documentation. &lt;/li&gt;&lt;li&gt;Conceptual drawings that do not directly relate to code. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Microsoft would recommend precisely defined DSLs and DSL-based tools for: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Precise abstractions from which code is generated. &lt;/li&gt;&lt;li&gt;Precise abstractions that map to variation points in frameworks and components. &lt;/li&gt;&lt;li&gt;Precise mappings between DSLs. &lt;/li&gt;&lt;li&gt;Conceptual drawings that have precisely specifiable mappings to other DSLs or to code artifacts.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Adpoted from &lt;a style="FONT-WEIGHT: bold" href="http://msdn.microsoft.com/vstudio/teamsystem/reference/design_arch/default.aspx?pull=/library/en-us/dnvs05/html/vstsmodel.asp"&gt;Visual Studio 2005 Team System Modeling Strategy and FAQ&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113641302573736369?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113641302573736369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113641302573736369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113641302573736369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113641302573736369'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/01/dsl-vs-uml.html' title='DSL vs. UML'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113641275733308075</id><published>2006-01-03T18:12:00.000-08:00</published><updated>2006-01-05T13:07:06.526-08:00</updated><title type='text'>Modeling Strategy in VSTS</title><content type='html'>VSTS's vision is to change the way developers perceive the value of modeling. To shift their perception that modeling is a marginally useful activity that precedes real development, to recognition that modeling is an important mainstream development task and not an activity primarily focused on documentation. This shifting has the following benefits:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Developers write less conventional code since more powerful application abstractions can be employed. Model-driven development is thus inherently more productive and agile.&lt;/li&gt;&lt;li&gt;Others involved in development, from business analysts, architects, designers to network staff, and system management specialists, will perceive modeling as adding value to the tasks for which they are responsible.&lt;/li&gt;&lt;li&gt;Communication between people can be optimized, and traceability enabled across the life cycle in any direction.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Microsoft adopts an approach to model-driven development based on the following ideas:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A model should be a first-class artifact in a project—not just a piece of documentation waiting to become outdated.&lt;/li&gt;&lt;li&gt;A model represents a set of abstractions that support a developer in a well-defined aspect of development.&lt;/li&gt;&lt;li&gt;Since models can abstract and aggregate information from a number of artifacts, they can more readily support consistency checks and other forms of analysis.&lt;/li&gt;&lt;li&gt;Models can be implemented by a process similar to compilation, where the code, configuration files, and other implementation artifacts generated by the compiler are never edited by hand.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Microsoft calls modeling languages defined in these ways Domain Specific Languages or DSLs.&lt;/p&gt;&lt;p&gt;So a domain-specific language (DSL) is a language designed to be useful for a specific task in a fixed problem domain, in contrast to a general-purpose language.&lt;/p&gt;Adpoted from &lt;a style="FONT-WEIGHT: bold" href="http://msdn.microsoft.com/vstudio/teamsystem/reference/design_arch/default.aspx?pull=/library/en-us/dnvs05/html/vstsmodel.asp"&gt;Visual Studio 2005 Team System Modeling Strategy and FAQ&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113641275733308075?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113641275733308075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113641275733308075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113641275733308075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113641275733308075'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2006/01/modeling-strategy-in-vsts.html' title='Modeling Strategy in VSTS'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113580983322646419</id><published>2005-12-27T19:52:00.000-08:00</published><updated>2005-12-28T14:45:42.040-08:00</updated><title type='text'>Notes on Application Designer in VSTS</title><content type='html'>You can have only one application diagram in your solution because it describes the overall structure of the solution in terms of interconnected applications. However, a solution can have multiple system, deployment, and logical datacenter diagrams.&lt;br /&gt;&lt;br /&gt;Some of the Microsoft-provided application types support a full round-tripping experience with code—notably ASP.NET applications and Windows applications. That is, changes made to code are reflected in the designers, while changes made in the designer are reflected in code.&lt;br /&gt;&lt;br /&gt;The ASP.NETWebService prototype is in effect an ASP.NETWebApplication prototype that has the Web content endpoint removed and a Web service endpoint added for your convenience.&lt;br /&gt;&lt;br /&gt;Applications communicate through endpoints, and for two applications to be connected together, there must be a provider endpoint at one end of the connection and a consumer endpoint at the other end.&lt;br /&gt;&lt;br /&gt;Adopted from Tony Loton's article &lt;a style="FONT-WEIGHT: bold" href="http://msdn.microsoft.com/vstudio/teamsystem/reference/design_arch/default.aspx?pull=/library/en-us/dnvs05/html/introappdesigner1.asp"&gt;Introduction to the Visual Studio 2005 Application Designer, Part 1&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113580983322646419?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113580983322646419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113580983322646419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113580983322646419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113580983322646419'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/notes-on-application-designer-in-vsts.html' title='Notes on Application Designer in VSTS'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113580269691751032</id><published>2005-12-27T19:34:00.000-08:00</published><updated>2005-12-28T14:44:40.900-08:00</updated><title type='text'>Distributed System Designers in VSTS</title><content type='html'>The Visual Studio 2005 Team Architect edition provides four visual designers collectively known as the Distributed System Designers. These four visual designers are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Application Designer&lt;/li&gt;&lt;li&gt;System Designer&lt;/li&gt;&lt;li&gt;Logical Datacenter Designer&lt;/li&gt;&lt;li&gt;Deployment Designer&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Application Designer allows you to define the applications that comprise a distributed system. You can then use those application definitions in System Designer to compose applications into deployable systems. Following this, you can evaluate system deployment using Deployment Designer.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Independently, Logical Datacenter Designer allows you to define a logical representation of the target datacenter in which applications (composed into systems) will be deployed. Consequently, Deployment Designer takes as input not only a set of system definitions from System Designer, but also a set of logical server definitions from Logical Datacenter Designer.&lt;/p&gt;&lt;p&gt;Adopted from Tony Loton's article &lt;a style="FONT-WEIGHT: bold" href="http://msdn.microsoft.com/vstudio/teamsystem/reference/design_arch/default.aspx?pull=/library/en-us/dnvs05/html/introappdesigner1.asp"&gt;Introduction to the Visual Studio 2005 Application Designer, Part 1&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113580269691751032?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113580269691751032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113580269691751032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113580269691751032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113580269691751032'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/distributed-system-designers-in-vsts.html' title='Distributed System Designers in VSTS'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113572188124195021</id><published>2005-12-27T14:08:00.000-08:00</published><updated>2005-12-27T14:18:01.696-08:00</updated><title type='text'>Some Tenets That the Agile Alliance Agrees On</title><content type='html'>Here are some tenets that the Agile Alliance agrees on:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Individuals and interactions are more important than processes and tools&lt;/li&gt;&lt;li&gt;Customer collaboration is more important than contracts&lt;/li&gt;&lt;li&gt;Working software is more important than comprehensive documentation&lt;/li&gt;&lt;li&gt;Responding to change is more important following a plan&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I know several interpretations of the tenets that the Agile Alliance agrees on. I like this one the most. This one is adopted from Richard Hundhausen's book &lt;a href="http://www.amazon.com/gp/product/0735621853/qid=1135721774/sr=2-1/ref=pd_bbs_b_2_1/103-0639150-5402213?s=books&amp;v=glance&amp;amp;n=283155"&gt;Working With Microsoft Visual Studio 2005 Team System&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113572188124195021?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113572188124195021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113572188124195021' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113572188124195021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113572188124195021'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/some-tenets-that-agile-alliance-agrees.html' title='Some Tenets That the Agile Alliance Agrees On'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113572004236402015</id><published>2005-12-27T13:41:00.000-08:00</published><updated>2005-12-27T13:47:22.843-08:00</updated><title type='text'>PM Skills</title><content type='html'>Chris Sells posted some excellents points on PM skills. The following are some highlights:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=1923"&gt;PM Skill #0: Know Your Job &lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=1924"&gt;PM Skill #1: Communicate, Communicate, Communicate &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A PM's job is to &lt;strong&gt;ship the right thing on time and on budget, while keeping your team happy&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Read more details from his posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113572004236402015?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113572004236402015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113572004236402015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113572004236402015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113572004236402015'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/pm-skills.html' title='PM Skills'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113511235927043025</id><published>2005-12-19T20:02:00.000-08:00</published><updated>2005-12-20T12:59:19.883-08:00</updated><title type='text'>Notes on Billy Hollis's Talks</title><content type='html'>I read quite a few Billy Hollis's articles from VB.NET columns, but I never meet him in person until this "P &amp; P" summit. He gave two talks at "P &amp;amp; P" Summit : "Smart Client Case Study" and "Re-engineering to support workflow." Here are some notes from his talks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If we try to convert a legacy system to an .NET application, read his slides first for the lessons he learned.&lt;/li&gt;&lt;li&gt;Declarative programming is what you want whenever possible&lt;/li&gt;&lt;li&gt;Deal with developers who are not familar with .NET programming&lt;/li&gt;&lt;li&gt;Workflow = Work + Flow&lt;/li&gt;&lt;li&gt;Service Broker is the best for "Work"&lt;/li&gt;&lt;li&gt;BitTalk is good for "Flow"&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113511235927043025?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113511235927043025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113511235927043025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113511235927043025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113511235927043025'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/notes-on-billy-holliss-talks.html' title='Notes on Billy Hollis&apos;s Talks'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113510845108540081</id><published>2005-12-19T19:50:00.000-08:00</published><updated>2005-12-20T11:54:16.113-08:00</updated><title type='text'>Benefits Of LINQ</title><content type='html'>The follow are benefits of LINQ:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Unified querying of objects, relational, XML&lt;/li&gt;&lt;li&gt;Type checking and IntelliSense for queries&lt;/li&gt;&lt;li&gt;SQL and XQuery-like power in C# and VB&lt;/li&gt;&lt;li&gt;Extensibility model for languages / APIs&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Taken from Anders Hejlsberg's slides.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113510845108540081?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113510845108540081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113510845108540081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113510845108540081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113510845108540081'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/benefits-of-linq.html' title='Benefits Of LINQ'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113510800772960390</id><published>2005-12-19T19:42:00.000-08:00</published><updated>2005-12-20T11:47:35.736-08:00</updated><title type='text'>Exception Policies</title><content type='html'>The following are some “Exception Policies” from Patterns &amp; Practices:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Exceptions of type ApplicationException should be logged&lt;/li&gt;&lt;li&gt;Exceptions of type SqlClientException should be caught and wrapped with an exception of type DataLayerException and re-thrown&lt;/li&gt;&lt;li&gt;Exceptions of type SecurityException should caught and replaced with an AccessDeniedException which will be thrown&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Adopted from Tom Hollander's slides: Enterprise Library for .NET 2.0:Architecture &amp;amp; Lessons Learned.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113510800772960390?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113510800772960390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113510800772960390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113510800772960390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113510800772960390'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/exception-policies.html' title='Exception Policies'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113433286592994290</id><published>2005-12-11T12:09:00.000-08:00</published><updated>2005-12-11T12:27:46.056-08:00</updated><title type='text'>UI Thread Rule in .NET Framework 2.0</title><content type='html'>Windows Forms relies on the underlying Win32® messages. Therefore, it inherits the classic Windows programming requirement that only the thread that created the window can process its messages.&lt;br /&gt;&lt;br /&gt;The UI Thread rule states that you must never use any member of a Control on any thread other than the one that created it with exceptions of Control.Invoke, Control.BeginInvoke, Control.EndInvoke, and Control.CreateGraphics.&lt;br /&gt;&lt;br /&gt;In his article: &lt;a href="http://msdn.microsoft.com/msdnmag/issues/04/05/C20"&gt;C# 2.0: Create Elegant Code with Anonymous Methods, Iterators, and Partial Classes&lt;/a&gt;, Joval Lowy stated that calls on the wrong thread will always trigger an exception under Windows Forms in the .NET Framework 2.0. I haven't yet verified this from official source, but I trust Joval. This is great!&lt;br /&gt;&lt;br /&gt;When using multithreaded programming in Windows Forms, you should begin to use the BackgroundWork component. Check my post &lt;a href="http://wgao.blogspot.com/2004/11/backgroundworker-component-in-windows.html"&gt;BackgroundWorker Component in Windows Forms 2.0&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113433286592994290?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113433286592994290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113433286592994290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113433286592994290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113433286592994290'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/ui-thread-rule-in-net-framework-20.html' title='UI Thread Rule in .NET Framework 2.0'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113433137881734618</id><published>2005-12-11T11:07:00.000-08:00</published><updated>2005-12-11T12:02:59.500-08:00</updated><title type='text'>Anonymous Methods in C# 2.0</title><content type='html'>Anonymous methods is a new feature in C# 2.0 that lets you define an anonymous (that is, nameless) method called by a delegate. Creating anonymous methods is essentially a way to pass a code block as a delegate parameter.&lt;br /&gt;&lt;br /&gt;// Create a handler for a click event&lt;br /&gt;button1.Click += delegate(System.Object o, System.EventArgs e)                   { System.Windows.Forms.MessageBox.Show("Click!"); };&lt;br /&gt;&lt;br /&gt;The anonymous method is defined in-line and not as a member method of any class.&lt;br /&gt;&lt;br /&gt;Anonymous methods can be used anywhere that a delegate type is expected. You can pass an anonymous method into any method that accepts the appropriate delegate type as a parameter. A concrete and useful example for passing an anonymous method as a parameter is launching a new thread without explicitly defining a ThreadStart delegate or a thread method:&lt;br /&gt;&lt;br /&gt;void StartThread(){   &lt;br /&gt;System.Threading.Thread t1 = new System.Threading.Thread(delegate() {               &lt;br /&gt;System.Console.Write("Hello, ");              &lt;br /&gt; System.Console.WriteLine("World!");           &lt;br /&gt;});  &lt;br /&gt; t1.Start();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;An anonymous method can use any class member variable, and it can also use any local variable defined at the scope of its containing method as if it were its own local variable.&lt;br /&gt;&lt;br /&gt;An anonymous method can use generic parameter types, just like any other method. Because delegates can define generic parameters, an anonymous method can use generic types defined at the delegate level.&lt;br /&gt;&lt;br /&gt;Anonymous Methods are quite useful because it replaces the need for creating a simple method in cases where only a delegate will suffice.&lt;br /&gt;&lt;br /&gt;Adopted from Joval Lowy's article &lt;a href="http://msdn.microsoft.com/msdnmag/issues/04/05/C20"&gt;C# 2.0: Create Elegant Code with Anonymous Methods, Iterators, and Partial Classes&lt;/a&gt; and &lt;a href="http://msdn2.microsoft.com/en-us/library/0yw3tz5k.aspx"&gt;C# Programmer's Reference: Anonymous Methods&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113433137881734618?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113433137881734618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113433137881734618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113433137881734618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113433137881734618'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/anonymous-methods-in-c-20.html' title='Anonymous Methods in C# 2.0'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113424816377499521</id><published>2005-12-10T12:55:00.000-08:00</published><updated>2005-12-10T13:04:41.963-08:00</updated><title type='text'>Iterators in C# 2.0</title><content type='html'>An iterator is a section of code that returns an ordered sequence of values of the same type.&lt;br /&gt;&lt;br /&gt;In C# 1.1, the Iterator design pattern is used to shield iterating clients from the actual implementation details of the underlying data structure, enabling the use of the same client-side iteration logic over multiple data structures.&lt;br /&gt;&lt;br /&gt;But there are some problems. The first is that if the collection contains value types, obtaining the items requires boxing and unboxing them because IEnumerator.Current returns an Object. This results in potential performance degradation and increased pressure on the managed heap. Even if the collection contains reference types, you still incur the penalty of the down-casting from Object. While unfamiliar to most developers, in C# 1.0 you can actually implement the iterator pattern for each loop without implementing IEnumerator or IEnumerable.&lt;br /&gt;&lt;br /&gt;The Microsoft .NET Framework 2.0 solves this problem by defining the generic, type-safe IEnumerable&lt;itemtype&gt; and IEnumerator&lt;itemtype&gt; interfaces.&lt;br /&gt;&lt;br /&gt;Besides making use of generics, the new interfaces are slightly different than their predecessors. Unlike IEnumerator, IEnumerator&lt;itemtype&gt; derives from IDisposable and does not have a Reset method.&lt;br /&gt;&lt;br /&gt;The second and more difficult problem is implementing the iterator. Although that implementation is straightforward for simple cases, it is challenging with more advanced data structures, such as binary trees.&lt;br /&gt;&lt;br /&gt;Using iterators in C# 2.0, you can have the C# compiler generate the implementation of IEnumerator for you. The C# compiler can automatically generate a nested class to maintain the iteration state. You can use iterators on a generic collection or on a type-specific collection. All you need to do is tell the compiler what to yield in each iteration. The following is an example.&lt;br /&gt;&lt;br /&gt;public class CityCollection : IEnumerable&lt;string&gt;&lt;br /&gt;{&lt;br /&gt;string[] m_Cities = {"New York","Paris","London"};&lt;br /&gt;public IEnumerator&lt;string&gt; GetEnumerator()&lt;br /&gt;{&lt;br /&gt;for(int i = 0; i&lt;m_cities.length; class=""&gt; &lt;&lt; m_Cities.Length; i++)&lt;br /&gt;yield return m_Cities[i];&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Your collection can easily expose multiple iterators, each used to traverse the collection differently. For example, to traverse the CityCollection class in reverse order. You can stop the iteration midstream by using the yield break statement.&lt;br /&gt;&lt;br /&gt;The compiler-generated iterator object (and its state) does not persist across foreach loops. This is why IEnumerabledoes not define a Reset method.&lt;br /&gt;&lt;br /&gt;Adopted from Joval Lowy's article &lt;a href="http://msdn.microsoft.com/msdnmag/issues/04/05/C20"&gt;C# 2.0: Create Elegant Code with Anonymous Methods, Iterators, and Partial Classes&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113424816377499521?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113424816377499521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113424816377499521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113424816377499521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113424816377499521'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/iterators-in-c-20.html' title='Iterators in C# 2.0'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113356759830463290</id><published>2005-12-02T21:51:00.000-08:00</published><updated>2005-12-02T21:10:39.366-08:00</updated><title type='text'>Review on My Past Posts</title><content type='html'>It’s amazing to see that I have blogged for more than one year. Some of my posts are about things and lessons that I learned from work and research. But most of them are notes taken by reading articles and books. I recorded things that I felt touching and useful. My posts represent my interests at the time when they are posted. Actually I use my blog as my notebook. I need to come to my blog quite often to check things. Since I have many posts, now it’s a good time to group them so that I can check thing more efficiently. That’s the purpose of this post.&lt;br /&gt;&lt;br /&gt;IIS and ASP.NET security:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/protected-directories-in-aspnet.html"&gt;Protected Directories in ASP.NET&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/protecting-resources-in-iis.html"&gt;Protecting Resources in IIS&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/accessing-files-in-iis-60.html"&gt;Accessing Files in IIS 6.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IIS:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/07/ssl-session-key-and-key-pair.html"&gt;SSL Session Key and Key Pair&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/compatibility-issues-from-iis-50-to.html"&gt;Compatibility Issues From IIS 5.0 to IIS 6.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enhanced Security Configuration for IE:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/ie-enhanced-security-configuration-and.html"&gt;IE Enhanced Security Configuration and Smart Clients on SSL&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/enhanced-security-configuration-for.html"&gt;Enhanced Security Configuration for Internet Explorer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SQL Server security:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/phases-of-sql-injection.html"&gt;Phases of SQL Injection&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/main-threats-to-database-server.html"&gt;The Main Threats to a Database Server&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/some-common-sql-injection-commands.html"&gt;Some Common SQL Injection Commands&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/preventing-sql-injection-attacks.html"&gt;Preventing SQL Injection Attacks&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/09/how-to-grant-access-to-sql-server-for.html"&gt;How to Grant Access to SQL Server for the Network service account&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/find-other-procedures-using-same-dll.html"&gt;Find Other Procedures Using the Same DLL&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/some-useful-sql-queries.html"&gt;Some Useful SQL Queries&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ASP.NET security:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/main-threats-to-web-server.html"&gt;The Main Threats to a Web Server&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/09/how-to-create-service-account-for.html"&gt;How to Create a Service Account for ASP.NET&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/02/new-security-features-in-aspnet-20.html"&gt;New Security Features in ASP.NET 2.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/02/one-click-attack-and-viewstateuserkey.html"&gt;The one-click attack and ViewStateUserKey&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ASP.NET&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/web-parts-in-aspnet-20.html"&gt;Web Parts in ASP.NET 2.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/02/viewstate-in-aspnet-20.html"&gt;ViewState in ASP.NET 2.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/02/viewstate-in-aspnet-1x.html"&gt;ViewState in ASP.NET 1.x&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/02/reviewing-state-management-in-aspnet.html"&gt;Reviewing State Management in ASP.NET&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/instrument-and-monitor-your-aspnet.html"&gt;Instrument and Monitor Your ASP.NET Apps Using WMI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ACLs and privileges:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/03/manipulate-privileges-in-managed-code.html"&gt;Manipulate Privileges in Managed Code&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/03/access-to-acls-with-net-framework.html"&gt;Access to ACLs with the .NET Framework&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/03/some-basic-facts-about-access-control.html"&gt;Some Basic Facts about Access Control&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Encryption:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/02/xml-signatures-and-encryption.html"&gt;XML Signatures and Encryption&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.NET Framework 2.0 resources:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/winforms-20-resources.html"&gt;WinForms 2.0 resources&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Version compatibility in .NET:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/upgrade-to-net-framework-20.html"&gt;Upgrade to .NET Framework 2.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/10/assembly-binding-redirection.html"&gt;Assembly Binding Redirection&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/10/determining-which-version-of-runtime.html"&gt;Determining Which Version of the Runtime to Load&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/10/version-compatibility.html"&gt;Version Compatibility&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Smart clients:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/10/identifying-data-stored-on-client-for.html"&gt;Identifying Data Stored on the Client for Smart Clients&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;.NET CF:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/10/challenge-with-smart-device.html"&gt;The Challenge with Smart Device Development Using the .NET CF&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/10/mobile-device-supports-in-visual.html"&gt;Mobile Device Supports in Visual Studio 2005&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/10/net-cf-shipped-with-visual-studio-2003.html"&gt;The .NET CF Shipped with Visual Studio 2003&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sockets in .NET:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/negotiatestream.html"&gt;NegotiateStream&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/sockets-in-net.html"&gt;Sockets in .NET&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/aborting-tcplistener-listening-thread.html"&gt;Aborting a TcpListener listening thread&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/derived-tcpclient-classes-used-on.html"&gt;Derived TcpClient classes used on the server side&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Reflection:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/improving-reflection-performance.html"&gt;Improving Reflection Performance&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/what-reflection-apis-are-slow-and-what.html"&gt;What Reflection APIs Are Slow and What Are Not?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Images and drawing:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/how-to-create-1-bit-per-pixel-image.html"&gt;How to create a 1-bit-per-pixel image from a true-color image in .NET&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/some-basic-facts-about-gifs.html"&gt;Some Basic Facts about GIFs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Web services:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/three-ways-to-consume-amazon-web.html"&gt;Three ways to consume Amazon Web services in .NET&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/consuming-web-services-efficiently.html"&gt;Consuming Web Services Efficiently&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/amazon-simple-queue-service-beta.html"&gt;Amazon Simple Queue Service (Beta)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SOA and WSE:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/signed-messages-in-wse.html"&gt;Signed Messages in WSE&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/03/securing-service-oriented-architecture.html"&gt;Securing Service Oriented Architecture with WSE 2.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Multithreaded:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/concurrency-what-every-dev-must-know.html"&gt;Concurrency: What Every Dev Must Know About Multithreaded Apps&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/01/ian-griffiths-on-ui-thread.html"&gt;Ian Griffiths on UI Thread&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/backgroundworker-component-in-windows.html"&gt;BackgroundWorker Component in Windows Forms 2.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;CLR internals:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/method-slot-table-and-methoddesc.html"&gt;Method Slot Table and MethodDesc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/objectinstance.html"&gt;ObjectInstance&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/type-fundamentals.html"&gt;Type Fundamentals&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/domains-created-by-clr-bootstrap.html"&gt;Domains Created by the CLR Bootstrap&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Localization:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/02/threadcurrentculture-and.html"&gt;Thread.CurrentCulture and Thread.CurrentUICulture&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/02/cultureinfocurrentculture-and.html"&gt;CultureInfo.CurrentCulture and CultureInfo.CurrentUICulture&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/02/globalization-features-in-whidbey.html"&gt;Globalization Features in Whidbey&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;X.509 Certificates:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/03/using-x509-certificate-in-wse-20.html"&gt;Using an X.509 Certificate in WSE 2.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/03/x509-certificates.html"&gt;X.509 Certificates&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Logging and event log:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/10/security-log.html"&gt;Security Log&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/network-service-and-event-log.html"&gt;Network Service and Event Log&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/tampering-with-log-files.html"&gt;Tampering with Log Files&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/richard-grimes-on-eventlog.html"&gt;Richard Grimes on EventLog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Generics:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/what-are-benefits-of-generics.html"&gt;What Are the Benefits of Generics?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/how-are-generics-implemented.html"&gt;How Are Generics Implemented?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/12/how-are-generics-different-from.html"&gt;How Are Generics Different from Classic Visual C++ Templates?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;VSTS:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/visual-studio-2005-team-system.html"&gt;Visual Studio 2005 Team System&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Windows Vista:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/07/security-in-winsows-vista-uap-and-nap.html"&gt;Security in Windows Vista: UAP and NAP Framework&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Misc on .NET:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/systemdirectoryservices.html"&gt;System.DirectoryServices&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/03/constrained-execution-regions-in-net.html"&gt;Constrained Execution Regions in the .NET Framework 2.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/01/you-cant-directly-change-boxed-values.html"&gt;You can't directly change boxed values in an array list&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/01/export-aspnet-data-to-microsoft-office.html"&gt;Export ASP.NET Data to Microsoft Office&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/12/one-issue-on-fxcop.html"&gt;One Issue on FxCop&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/12/all-about-statics.html"&gt;All about Statics&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Design patterns:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/12/static-classes-in-c-20-and-abstract.html"&gt;Static Classes in C# 2.0 and Abstract and Sealed Pattern&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/12/abstract-and-sealed-pattern-in-net.html"&gt;Abstract and Sealed Pattern in .NET&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/bridge-pattern-and-abstract-factory.html"&gt;Bridge Pattern and Abstract Factory Pattern&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/bridge-pattern-and-strategy-pattern.html"&gt;Bridge Pattern and Strategy Pattern&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/some-mandates-of-design-pattern.html"&gt;Some mandates of the design pattern community&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Design related:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/02/emergent-design.html"&gt;Emergent Design&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/alan-shalloways-rules.html"&gt;Alan Shalloway's Rules&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/xp-developers-view-point.html"&gt;A XP Developer's View Point&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/steve-mcconnells-comment.html"&gt;Steve McConnell's Comment&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/xp-and-design.html"&gt;XP and design&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Debugging:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/sos-extension-issue-in-vs-2005-beta-2.html"&gt;A SOS Extension Issue in VS 2005 Beta 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/sos-commands.html"&gt;SOS Commands&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/09/some-useful-tools-in-production.html"&gt;Some Useful Tools in Production Debugging&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unit tests:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/10/best-practices-for-writing-unit-tests.html"&gt;Best Practices for Writing Unit Tests&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/10/benifits-of-team-test.html"&gt;Benifits of Team Test&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Data Execution Prevention (DEP):&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/09/example-of-compatibility-issues-with.html"&gt;An Example of Compatibility Issues with Data Execution Prevention&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/data-execution-prevention-in-xp.html"&gt;Data Execution Prevention in XP Service Pack 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Software security lifecycle:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/sd3c-high-level-principles-for.html"&gt;SD3+C: High-level Principles for Building More Secure Software&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/three-facets-to-building-more-secure.html"&gt;Three Facets to Building More Secure Software&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Security related coding:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/windowsidentitygroups.html"&gt;WindowsIdentity.Groups&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/threadcurrentprincipal-in-net.html"&gt;Thread.CurrentPrincipal in .NET Framework 2.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/how-to-handle-exceptions-securely.html"&gt;How to Handle Exceptions Securely&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/01/keeping-attackers-out-of-control.html"&gt;Keeping Attackers Out of the Control Channel&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/01/how-to-develop-code-as-non-admin.html"&gt;How to Develop Code as a Non Admin&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/01/where-to-store-data-files.html"&gt;Where to store data files?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/03/using-aspnet-credentials-management.html"&gt;Using the ASP.NET Credentials Management Infrastructure in a Windows Forms Application&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/application-development-security.html"&gt;Application Development Security Guidance for .NET 2.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Network security:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/definition-of-network-security.html"&gt;A Definition of Network Security&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/defense-in-depth-model.html"&gt;The Defense-in-Depth Model&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/keep-security-simple.html"&gt;Keep Security Simple&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/peopleprocessestechnology.html"&gt;People+Processes+Technology&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/system-admin-vs-security-admin.html"&gt;System Admin vs. Security Admin&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/09/types-of-network-attacks.html"&gt;Types of Network Attacks&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/emergency-response-process.html"&gt;Emergency Response Process&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/goal-of-security-audit.html"&gt;The Goal of a Security Audit&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/accessing-and-managing-security-risks.html"&gt;Accessing and Managing Security Risks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Security policies:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/07/policy-process-and-technology.html"&gt;Policy, Process, and Technology&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/07/why-security-policy-is-necessary.html"&gt;Why a Security Policy Is Necessary&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/how-to-make-users-aware-of-securities.html"&gt;How to Make Users Aware of Securities Policies&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/some-policies-you-might-need.html"&gt;Some Policies You Might Need&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;CIA:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/credentials-and-delegation.html"&gt;Credentials and Delegation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/how-to-provide-cia-for-network.html"&gt;How to Provide CIA for A Network Connection?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/what-does-network-authentication.html"&gt;What Does A Network Authentication Protocol Do?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Detection and avoiding detection:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/some-common-ways-attacker-can-attack.html"&gt;Some Common Ways an Attacker Can Attack IDSs and IPSs&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/idss-and-ipss.html"&gt;IDSs and IPSs&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/how-attackers-avoid-detection-post.html"&gt;How Attackers Avoid Detection Post-Intrusion&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/some-common-ways-attacks-avoid.html"&gt;Some Common Ways Attacks Avoid Detection&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Penetration Testing and Vulnerability Scanning:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/difference-between-penetration-testing.html"&gt;Difference between Penetration Testing and Vulnerability Scanning&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/06/steps-for-vulnerability-scanning.html"&gt;Steps for a Vulnerability Scanning&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;DNS:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/some-useful-nslookup-commands.html"&gt;Some Useful nslookup Commands&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/01/types-of-dns-zones.html"&gt;Types of DNS Zones&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/01/three-dns-server-configuration-roles.html"&gt;Three DNS Server Configuration Roles&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/01/how-does-dns-resolve-fqdns-to-ip.html"&gt;How does DNS resolve FQDNs to IP addresses?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IPsec:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/07/using-ipsec-for-domain-isolation.html"&gt;Using IPsec for Domain Isolation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/07/using-ipsec-to-protect-servers.html"&gt;Using IPsec to Protect Servers&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/07/ipsec-over-nat.html"&gt;IPsec over NAT&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/07/notes-on-ipsec.html"&gt;Notes on IPsec&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Misc on network security:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/07/notes-on-vpn.html"&gt;Notes on VPN&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/hacking-windows-smb-tutorial.html"&gt;Hacking the Windows SMB tutorial&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/03/network-sniffers.html"&gt;Network Sniffers&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/well-known-ports.html"&gt;Well-known Ports&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Misc:&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/11/watching-first-xaml-presentation.html"&gt;Watching the First XAML Presentation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/ntfs-alternate-file-streams.html"&gt;NTFS Alternate File Streams&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/hiding-files-on-windows-systems.html"&gt;Hiding Files on Windows Systems&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/codeasdocumentation-by-martin-fowler.html"&gt;CodeAsDocumentation by Martin Fowler&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/05/46-best-ever-freeware-utilities.html"&gt;The 46 Best-ever Freeware Utilities&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/04/gordon-moore-software-is-too-complex.html"&gt;Gordon Moore: Software is too complex&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2005/08/microsoft-dynamic-systems-initiative.html"&gt;Microsoft® Dynamic Systems Initiative&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/12/philosophy-of-profilers.html"&gt;The Philosophy of Profilers&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/how-to-get-around-right-click-disabled.html"&gt;How to get around "right click disabled" on some websites?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wgao.blogspot.com/2004/11/windows-xp-service-pack-2.html"&gt;Windows XP Service Pack 2&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113356759830463290?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113356759830463290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113356759830463290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113356759830463290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113356759830463290'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/review-on-my-past-posts.html' title='Review on My Past Posts'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113321373973166997</id><published>2005-12-01T18:30:00.000-08:00</published><updated>2005-12-02T12:53:52.616-08:00</updated><title type='text'>How Are Generics Different from Classic Visual C++ Templates?</title><content type='html'>Generics are similar in concept to classic C++ templates: both allow data structures or utility classes to defer to the client the actual types to use, and both offer productivity and type-safety benefits.&lt;br /&gt;&lt;br /&gt;There are two main differences: in the programming model and in the underlying implementation. In the programming model, .NET generics can provide enhanced safety compared to classic Visual C++ templates. .NET generics have the notion of constraints, which gives you added type safety. On the other hand, .NET generics offer a more restrictive programming model—there are quite a few things that generics cannot do, such as using operators, because there is no way to constraint a type parameter to support an operator. This is not the case in classic Visual C++ templates where you can apply any operator you like on the type parameters. At compile time, the classic Visual C++ compiler will replace all the type parameters in the template with your specified type, and any incompatibility is usually discovered then.&lt;br /&gt;&lt;br /&gt;Both templates and generics can incur some code bloat, and both have mechanisms to limit that bloat. Instantiating a template with a specific set of types instantiates only the methods actually used; and then all methods that result in identical code are automatically merged by the compiler which prevents needless duplication. Instantiating a generic with a specific set of types instantiates all of its methods, but only once for all reference type arguments; bloat comes only from value types, because the CLR instantiates a generic separately once for each value type argument. Finally, .NET generics allow you to ship binaries, while C++ templates require you to share some code with the client.&lt;br /&gt;&lt;br /&gt;Adopted from &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/ToolSupport.asp"&gt;Generics FAQ: Fundamentals&lt;/a&gt; by Juval Lowy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113321373973166997?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113321373973166997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113321373973166997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113321373973166997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113321373973166997'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/12/how-are-generics-different-from.html' title='How Are Generics Different from Classic Visual C++ Templates?'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113321333627133326</id><published>2005-11-27T13:22:00.000-08:00</published><updated>2005-11-28T13:28:56.463-08:00</updated><title type='text'>What Are the Benefits of Generics?</title><content type='html'>Generics offer significant benefits, including productivity, type safety and performance.&lt;br /&gt;&lt;br /&gt;What is special about generic types is that you code them once, yet you can use them with different parameters. Doing so has significant benefits—you reuse your development and testing efforts, without compromising type safety and performance, and without bloating your code.&lt;br /&gt;&lt;br /&gt;With the object-based solutions, mismatch in type will still get complied, but yield an error at runtime. With generics, such code would never get compiled.&lt;br /&gt;&lt;br /&gt;Various benchmarks have shown that in intense calling patterns, generics yield on average 200 percent performance improvement when using value types, and some 100 percent performance improvement when using reference types. However, performance is not the main benefit of generics. In most real-life applications, bottle necks such as I/O will mask out any performance benefit from generics. The most significant benefit of generics is type-safety.&lt;br /&gt;&lt;br /&gt;Adopted from &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/ToolSupport.asp"&gt;Generics FAQ: Fundamentals&lt;/a&gt; by Juval Lowy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113321333627133326?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113321333627133326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113321333627133326' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113321333627133326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113321333627133326'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/what-are-benefits-of-generics.html' title='What Are the Benefits of Generics?'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113321263334378476</id><published>2005-11-27T13:13:00.000-08:00</published><updated>2005-11-28T13:17:14.003-08:00</updated><title type='text'>How Are Generics Implemented?</title><content type='html'>Generics have native support in IL and the CLR itself. When you compile generic server-side code, the compiler compiles it into IL, just like any other type. However, the IL only contains parameters or place holders for the actual specific types. In addition, the metadata of the generic server contains generic information such as constraints.&lt;br /&gt;&lt;br /&gt;The client-side compiler uses that generic metadata to support type safety. When the client provides a type arguments, the client's compiler substitutes the generic type parameter in the server metadata with the specified type. This provides the client's compiler with type-specific definition of the server, as if generics were never involved. At run time, the actual machine code produced depends on whether the specified types are value or reference type.&lt;br /&gt;&lt;br /&gt;If the client specifies a value type, the JIT compiler replaces the generic type parameters in the IL with the specific value type, and compiles it to native code. However, the JIT compiler keeps track of type-specific server code it already generated. If the JIT compiler is asked to compile the generic server with a value type it has already compiled to machine code, it simply returns a reference to that server code. Because the JIT compiler uses the same value-type-specific server code in all further encounters, there is no code bloating.&lt;br /&gt;&lt;br /&gt;If the client specifies a reference type, then the JIT compiler replaces the generic parameters in the server IL with object, and compiles it into native code. That code will be used in any further requests for a reference type instead of a generic type parameter. Note that this way the JIT compiler only reuses actual code. Instances are still allocated according to their size off the managed heap, and there is no casting.&lt;br /&gt;&lt;br /&gt;Adopted from &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/ToolSupport.asp"&gt;Generics FAQ: Fundamentals&lt;/a&gt; by Juval Lowy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113321263334378476?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113321263334378476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113321263334378476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113321263334378476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113321263334378476'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/how-are-generics-implemented.html' title='How Are Generics Implemented?'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113304234230308329</id><published>2005-11-26T13:57:00.000-08:00</published><updated>2005-11-26T13:59:02.376-08:00</updated><title type='text'>Protected Directories in ASP.NET</title><content type='html'>By default, ASP.NET 2.0 will block access to all URLs that contain directory segments named App_Data, App_Code, App_Browsers, App_WebReferences, App_GlobalResources, and App_LocalResources anywhere in the URL. ASP.NET 1.1 and 2.0 will both also block access to the /Bin directory. This support is conditional on having the aspnet_filter.dll ISAPI filter registered with IIS, which is done by default during ASP.NET installation. By placing your content in these directories, you can prevent HTTP access to it regardless of the file extensions being requested.&lt;br /&gt;&lt;br /&gt;Adopted from &lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/11/SecureWebApps/default.aspx"&gt;Are You Protected? Design and Deploy Secure Web Apps with ASP.NET 2.0 and IIS 6.0&lt;/a&gt; by Michael Volodarsky.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113304234230308329?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113304234230308329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113304234230308329' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113304234230308329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113304234230308329'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/protected-directories-in-aspnet.html' title='Protected Directories in ASP.NET'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113304218827047918</id><published>2005-11-26T13:45:00.000-08:00</published><updated>2005-11-26T14:00:27.863-08:00</updated><title type='text'>Protecting Resources in IIS</title><content type='html'>Here are some rules/methods regarding how to protect resources in IIS 6.0 (adopted from Michael Volodarsky's article &lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/11/SecureWebApps/default.aspx"&gt;Are You Protected? Design and Deploy Secure Web Apps with ASP.NET 2.0 and IIS 6.0&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If your application is programmatically accessing data or supporting files during its execution, you should place them outside the Web namespace.&lt;/li&gt;&lt;li&gt;If you cannot remove all such files, make sure that IIS is configured not to serve these files to Web clients. This should be accomplished by mapping the extensions for the protected files to ASP.NET in the IIS script processor map configuration, and subsequently mapping those extensions to the HttpForbiddenHandler or HttpNotFoundHandler in the ASP.NET &lt;httphandlers&gt;configuration for the application or directory. By default, ASP.NET already blocks access to a number of extensions common to Web applications, including .cs, .java, .mdb, .mdf, .vb, and others.&lt;/li&gt;&lt;li&gt;If you use the IIS static file handler, you should also make the files hidden for additional protection because the IIS static file handler will not serve files that have been given the hidden attribute.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It is frequently thought that removing a corresponding extension entry from the IIS MIME mapping configuration will prevent the static file handler from serving files with that extension. In actuality this is not always true because the static file handler will also honor the registry MIME mapping configuration and therefore will still serve the extension if the registry entry is present. Because of this, you would have to make sure that both the metabase MIME mapping configuration and the registry key in HKEY_CLASSES_ROOT do not contain an extension entry for the forbidden extension. Due to the management complexity, this practice is not recommended as a way of securing content.&lt;/p&gt;&lt;p&gt;Of course, this guidance regarding the IIS static file handler only applies to extensions that are not mapped to an ISAPI extension in the IIS script mapping configuration.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113304218827047918?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113304218827047918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113304218827047918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113304218827047918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113304218827047918'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/protecting-resources-in-iis.html' title='Protecting Resources in IIS'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113295918176889601</id><published>2005-11-25T13:48:00.000-08:00</published><updated>2005-11-26T13:44:22.556-08:00</updated><title type='text'>Accessing Files in IIS 6.0</title><content type='html'>What are the operations in order performed by IIS 6.0 if you launch IE to send a request via the URL http://myServer/myApp/test.xyz?&lt;br /&gt;&lt;br /&gt;Here is what I found by performing some testing. I might be wrong at some points. So be cautious.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IIS performs authentication/authorization. If it fails at this step, a HTTP Error 401.1 is returned.&lt;/li&gt;&lt;li&gt;IIS does MINE maps.&lt;/li&gt;&lt;li&gt;IIS 6.0 will not deliver content for which there is no MIMEMap entry at the &lt;strong&gt;&lt;em&gt;Computer&lt;/em&gt;&lt;/strong&gt; level and in the registry MIME mapping configuration. In this case, a HTTP Error 404 is returned and a HTTP Error 404.3 is logged.&lt;/li&gt;&lt;li&gt;If there is no MIMEMap entry at myApp (site) level and there is a MIMEMap entry at the &lt;strong&gt;&lt;em&gt;Computer&lt;/em&gt;&lt;/strong&gt; level or in the registry MIME mapping configuration, then the request will be processed by the IIS static file handler.&lt;/li&gt;&lt;li&gt;If there is a MIMEMap entry at myApp (site) level, then the ISAPI extension in the corresponding IIS script mapping will be responsible for processing the request. Assume that this is the case by now.&lt;/li&gt;&lt;li&gt;IIS starts to check "Execution Permission" on the Virtual Directory tab of the Properties dialog box. If "Execution Permission" is not allowed to process the request, a HTTP Error 403.1 is returned.&lt;/li&gt;&lt;li&gt;Next IIS starts to check "Web Service Extensions". If there is a corresponding Web Service Extension and the Web Service Extension is prohibited, then a HTTP Error 404 is returned and a HTTP Error 404.2 is logged.&lt;/li&gt;&lt;li&gt;Now IIS starts to load the ISAPI extension in the corresponding IIS script mapping to process the request. &lt;/li&gt;&lt;/ul&gt;Recently I read the following two articles regarding to IIS security:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/11/SecureWebApps/default.aspx"&gt;Are You Protected? Design and Deploy Secure Web Apps with ASP.NET 2.0 and IIS 6.0&lt;/a&gt; by Michael Volodarsky&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/technet/technetmag/issues/2005/01/ServingTheWeb/default.aspx"&gt;Essential Security Administration For IIS 6.0&lt;/a&gt; by Brett Hill&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Neither articles are made clear on MIMEMaps. Michael's article is excellent except the tiny thing on MIMEMaps. Every developer working on ASP.NET and IIS should read this article.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113295918176889601?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113295918176889601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113295918176889601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113295918176889601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113295918176889601'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/accessing-files-in-iis-60.html' title='Accessing Files in IIS 6.0'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113259895799155834</id><published>2005-11-20T10:17:00.000-08:00</published><updated>2005-11-21T10:49:18.423-08:00</updated><title type='text'>WinForms 2.0 resources</title><content type='html'>The WinForms team has put up &lt;a href="http://www.windowsforms.net/Default.aspx?tabindex=5&amp;tabid=60"&gt;all kinds of WinForms 2.0 resources&lt;/a&gt;, including a bunch of FAQs and samples.&lt;br /&gt;&lt;br /&gt;Adopted from Chris Sells's &lt;a href="http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=1910"&gt;post&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113259895799155834?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113259895799155834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113259895799155834' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113259895799155834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113259895799155834'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/winforms-20-resources.html' title='WinForms 2.0 resources'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113208718490195322</id><published>2005-11-14T19:23:00.000-08:00</published><updated>2005-11-15T12:39:45.193-08:00</updated><title type='text'>NegotiateStream</title><content type='html'>As SDK states, using NegotiateStream, you can do the following.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Send the client's credentials to the server for Impersonation or Delegation. &lt;/li&gt;&lt;li&gt;Request server authentication.&lt;/li&gt;&lt;li&gt;Encrypt and/or sign data before transmitting it. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you want CIA protection, the client must first call AuthenticateAsClient and the server must call AuthenticateAsServer. Both calls block. If you miss one on one side, then you are not able to use NegotiateStream on this side and the other side is blocked. As &lt;a href="http://pluralsight.com/wiki/default.aspx/Keith.GuideBook/HowToAddCIAToASocketBasedApp.html"&gt;Keith Brown points out&lt;/a&gt;, these functions map down to SSPI's InitializeSecurityContext and AcceptSecurityContext, and basically implement an authenticated key exchange using a protocol called SPNEGO, which stands for "secure, protected negotiation."&lt;/p&gt;&lt;p&gt;The client should also specify a service princpal name (SPN) if its wants to use Kerberos.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113208718490195322?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113208718490195322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113208718490195322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113208718490195322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113208718490195322'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/negotiatestream.html' title='NegotiateStream'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113200638283237624</id><published>2005-11-13T13:59:00.000-08:00</published><updated>2005-11-14T14:15:39.213-08:00</updated><title type='text'>WindowsIdentity.Groups</title><content type='html'>WindowsIdentity.Groups can be used to display the list of groups that an account belongs to. The following code enumerates the group list and displays both the group name and SID.&lt;br /&gt;&lt;br /&gt;WindowsIdentity wi = WindowsIdentity.GetCurrent();&lt;br /&gt;foreach (IdentityReference id in wi.Groups)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(@" {0}, {1}",&lt;br /&gt;((NTAccount)((SecurityIdentifier)id).Translate(typeof(NTAccount))).Value,&lt;br /&gt;id.Value);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;However, this property is buggy. So be cautious to use it. I found strange (wrong) behaves.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If you list the groups that Network Service or Local Service belongs to, you get two Users groups with the same SID.&lt;/li&gt;&lt;li&gt;If you create a local normal user named tmpUser and then remove it from the Users group, then you log out and relog in your system, and then launch your app under the tmpUser account to display the list of groups that it belongs to. You'll find that the Users group still shows up in the list!&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113200638283237624?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113200638283237624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113200638283237624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113200638283237624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113200638283237624'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/windowsidentitygroups.html' title='WindowsIdentity.Groups'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113182739625372996</id><published>2005-11-12T12:16:00.000-08:00</published><updated>2005-11-12T12:29:56.360-08:00</updated><title type='text'>Thread.CurrentPrincipal in .NET Framework 2.0</title><content type='html'>Thread.CurrentPrincipal is simply a helpful property for keeping track of a principal, and is primarily used in server applications to track client identity. As &lt;a href="http://pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsThreadDotCurrentPrincipal.html"&gt;Keith Brown pointed out&lt;/a&gt; that &lt;br /&gt;Thread.CurrentPrincipal propagates during asynchronous activities such as asynchronous delegates and creating new threads, but doesn't propagate during ThreadPool.QueueUserWorkItem and System.Threading.Timer, in .NET Framework 1.1.&lt;br /&gt;&lt;br /&gt;I found that  &lt;br /&gt;Thread.CurrentPrincipal propagates during &lt;br /&gt;ThreadPool.QueueUserWorkItem in .NET Framework 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113182739625372996?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113182739625372996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113182739625372996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113182739625372996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113182739625372996'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/threadcurrentprincipal-in-net.html' title='Thread.CurrentPrincipal in .NET Framework 2.0'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113182639778077999</id><published>2005-11-12T12:12:00.000-08:00</published><updated>2005-11-12T12:13:18.156-08:00</updated><title type='text'>Upgrade to .NET Framework 2.0</title><content type='html'>Our company has an application built and running against .NET Framework 1.1. The client side is a Windows Forms control embedded in IE. So the client requires .NET Framework. The control makes Web service calls to a Web server and Web services make ADO.NET calls to a SQL Server database.&lt;br /&gt;&lt;br /&gt;Recently I tested the app under .NET Framework 2.0 with all the combinations: client 1.1 + server 2.0, client 2.0 + server 1.1, client 2.0 + server 2.0. It worked very well and no change was made. Amazing!&lt;br /&gt;&lt;br /&gt;I found that MSDN documentation in this area is very poor. So I record a couple of things that I feel useful. Assume that .NET Framework 2.0 is installed on top of an existing .NET Framework 1.1.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IE always loads .NET Framework 2.0 no matter which version of .NET Framework your Windows Forms control is built against if both 2.0 and 1.1 are present. This is against .NET rule. The rule says that, if the version of the .NET Framework that the application was built against is present on the computer, the application runs on that version. Our control was built against .NET 1.1, but .NET 2.0 was loaded by IE instead of .NET 1.1.&lt;/li&gt;&lt;li&gt;If .NET 2.0 is installed on top of .NET 1.1, the combo box on the ASP.NET tab in IIS will contain two entries: .NET 2.0 and .NET 1.1. But .NET 1.1 remains the default. This is very good because it causes the least pain when upgrading of servers. If you want to run your Web app against .NET 2.0, then you need to change the framework version to 2.0 on the ASP.NET tab. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113182639778077999?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113182639778077999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113182639778077999' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113182639778077999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113182639778077999'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/upgrade-to-net-framework-20.html' title='Upgrade to .NET Framework 2.0'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113149575907529030</id><published>2005-11-08T16:04:00.000-08:00</published><updated>2005-11-12T14:05:00.453-08:00</updated><title type='text'>Watching the First XAML Presentation</title><content type='html'>I read a couple of Chris Sells's articles on Longhorn two years ago, but I never had chance to watch presentations on Avalon and try Avalon myself. Gary Fuhr gave a presentation on XAML yesterday at .NET Developers Association. WPF is cool! It seems to me that it's not hard for an experienced WinForm developer to work with WPF.&lt;br /&gt;&lt;br /&gt;Many Windows developers like me are not good at graphic design. We spent most of our time on how to wire things up using frameworks provided by Microsoft. WPF provides much more ways to create much cooler graphics and graphic design is tougher than before. We (Windows developers) really need an easy-to-use graphic design tool to help us. After done with graphic design using the tool, the tool should be able to export XAML for us to use in VS .NET.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113149575907529030?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113149575907529030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113149575907529030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113149575907529030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113149575907529030'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/11/watching-first-xaml-presentation.html' title='Watching the First XAML Presentation'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113035534614621283</id><published>2005-10-26T12:31:00.000-07:00</published><updated>2005-10-26T12:35:46.153-07:00</updated><title type='text'>Best Practices for Writing Unit Tests</title><content type='html'>Here are some principals that will help with successful testing:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Avoid creating dependencies between tests such that tests need to run in a particular order. Each test should be autonomous. &lt;/li&gt;&lt;li&gt;Use test initialization code to verify that test cleanup executed successfully and re-run the cleanup before executing a test if it did not run. &lt;/li&gt;&lt;li&gt;Write tests before writing the any production code implementation. &lt;/li&gt;&lt;li&gt;Create one test class corresponding to each class within the production code.  &lt;/li&gt;&lt;li&gt;Use Visual Studio to generate the initial test project. This will significantly reduce the number of steps needed when manually setting up a test project and associating it to the production project. &lt;/li&gt;&lt;li&gt;Avoid creating other machine dependent tests such as tests dependent on a particular directory path. &lt;/li&gt;&lt;li&gt;Create mock objects to test interfaces. Mock objects are implemented within a test project to verify that the API matches the required functionality. &lt;/li&gt;&lt;li&gt;Verify that all tests run successfully before moving on to creating a new test. That way you ensure that you fix code immediately upon breaking it. &lt;/li&gt;&lt;li&gt;Maximize the number of tests that can be run unattended. Make absolutely certain that there is no reasonable unattended testing solution before relying solely on manual testing. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Adpoted from &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/vstsunittesting.asp"&gt;A Unit Testing Walkthrough with Visual Studio Team Test&lt;/a&gt; by Mark Michaelis.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113035534614621283?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113035534614621283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113035534614621283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113035534614621283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113035534614621283'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/10/best-practices-for-writing-unit-tests.html' title='Best Practices for Writing Unit Tests'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-113035337261758687</id><published>2005-10-26T11:59:00.000-07:00</published><updated>2005-10-26T12:02:52.626-07:00</updated><title type='text'>Benifits of Team Test</title><content type='html'>Team Test is a Visual Studio integrated unit-testing framework that enables:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Code generation of test method stubs. &lt;/li&gt;&lt;li&gt;Running tests within the IDE. &lt;/li&gt;&lt;li&gt;Incorporation of test data loaded from a database. &lt;/li&gt;&lt;li&gt;Code coverage analysis once the tests have run. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Adpoted from &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/vstsunittesting.asp"&gt;A Unit Testing Walkthrough with Visual Studio Team Test&lt;/a&gt; by Mark Michaelis.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-113035337261758687?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/113035337261758687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=113035337261758687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113035337261758687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/113035337261758687'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/10/benifits-of-team-test.html' title='Benifits of Team Test'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8974882.post-112897504186741910</id><published>2005-10-10T13:01:00.000-07:00</published><updated>2005-10-11T15:26:44.860-07:00</updated><title type='text'>Assembly Binding Redirection</title><content type='html'>A binding redirection in an application configuration file for a unified .NET Framework assembly cancels the unification for that assembly.&lt;br /&gt;&lt;br /&gt;Explicit assembly binding redirection in an application configuration file requires a security permission. The permission is granted by setting the BindingRedirects flag on the SecurityPermission Class. Managed assemblies have no permissions by default.&lt;br /&gt;&lt;br /&gt;The security permission is granted to applications running in the Trusted Zone (local machine) and Intranet Zone. Applications running in the Internet Zone are strictly prohibited from performing assembly binding redirection.&lt;br /&gt;&lt;br /&gt;Adopted from SDK.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8974882-112897504186741910?l=wgao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wgao.blogspot.com/feeds/112897504186741910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8974882&amp;postID=112897504186741910' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/112897504186741910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8974882/posts/default/112897504186741910'/><link rel='alternate' type='text/html' href='http://wgao.blogspot.com/2005/10/assembly-binding-redirection.html' title='Assembly Binding Redirection'/><author><name>Wenfeng Gao</name><uri>http://www.blogger.com/profile/08524179169442392485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
