<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.pluralsight.com/community/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Security Briefs</title><link>http://www.pluralsight.com/community/blogs/keith/default.aspx</link><description>by Keith Brown</description><dc:language>en</dc:language><generator>CommunityServer 2008 (Build: 30417.1769)</generator><item><title>Demos from my TechEd talks</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/06/04/51105.aspx</link><pubDate>Wed, 04 Jun 2008 13:10:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:51105</guid><dc:creator>keith-brown</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=51105</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/06/04/51105.aspx#comments</comments><description>&lt;P&gt;To those who came to my talks at &lt;A href="http://www.microsoft.com/events/teched2008/developer/default.mspx"&gt;TechEd 2008 Developers&lt;/A&gt;, thank you! Be sure to fill out an evaluation before you leave; scores matter a lot to the conference organizers, so let them know what you thought.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.pluralsight.com/keith/presentations/TimeTracker.zip"&gt;Here is the code&lt;/A&gt; from my ADFS talk.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.pluralsight.com/keith/presentations/ClaimsDemos.zip"&gt;Here&amp;nbsp;is the code&lt;/A&gt; from my&amp;nbsp;Understanding Claims talk.&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=51105" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Security/default.aspx">Security</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Identity/default.aspx">Identity</category></item><item><title>When does Declarative Data Binding Happen?</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/05/29/51070.aspx</link><pubDate>Thu, 29 May 2008 13:31:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:51070</guid><dc:creator>keith-brown</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=51070</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/05/29/51070.aspx#comments</comments><description>&lt;P&gt;I try to use declarative data binding (let's call it DDB for short) wherever I can in my ASP.NET apps, but there's one pain point I've run into in the past. It has to do with lists.&lt;/P&gt;
&lt;P&gt;Let's say you want to populate a list box or drop down list of choices by calling a static method - you can wire up an ObjectDataSource to do that. But then in your Page's Load event, you may want to look up a record and &lt;EM&gt;select one of those choices&lt;/EM&gt; based on data from that record. Maybe the user chose the item in the past and you're looking in the user's profile to recall her choice. Well, you'll quickly find that Load fires &lt;EM&gt;before&lt;/EM&gt; declarative data binding has occurred. You'll probably discover this like I did when you get an error because there are no items in the list to select from. In the past I've simply avoided declarative data binding when I ran into this problem and used programmatic data binding instead (control.DataSource=collection; control.DataBind; control.SelectedIndex=whatever;).&lt;/P&gt;
&lt;P&gt;But today I talked with &lt;A href="http://www.pluralsight.com/fritz/" target=_blank&gt;&lt;A title="Fritz Onion, author of Essential ASP.NET" href="/fritz"&gt;Fritz&lt;/A&gt; Onion&lt;/A&gt;, ASP.NET guru, and we figured out when declarative data binding actually occurs. We tested LoadComplete, and that wasn't late enough. Then we figured certainly DDB would happen before PreRender. No such luck. So finally Fritz suggested testing out PreRenderComplete, and that worked like a charm. So by the time PreRenderComplete has fired, DDB has already taken place and you can safely make list selections for lists that have been populated via DDB.&lt;/P&gt;
&lt;P&gt;My current solution looks like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;protected void Page_Load(object sender, EventArgs args) {
    if (!IsPostBack)
        PreRenderComplete += PopulateControlsFromUserData;
}
void PopulateControlsFromUserData(object sender, EventArgs args) {
    // DDB has already happened, so party on!
}
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I hope this helps someone else who also searches for "when does declarative data binding happen", which didn't used to bring up any results :-)&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=51070" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Intellisense for XML config files broken in VS 2008?</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/05/22/51024.aspx</link><pubDate>Thu, 22 May 2008 14:55:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:51024</guid><dc:creator>keith-brown</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=51024</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/05/22/51024.aspx#comments</comments><description>&lt;p&gt;I remember having trouble in VS 2005 with Intellisense not working - the trick back in those days was to remove the namespace declaration that was added by various tools. As long as the content was in no namespace, Intellisense seemed to work.&lt;/p&gt; &lt;p&gt;In VS 2008, Intellisense for config files was working great for me until recently, and now, regardless of whether I have the namespace or not, it appears hopelessly broken. I checked under XML|Schemas to see if the schema was in place, and indeed I have DotNetConfig.xsd listed in there for an empty namespace, and it's got the little green checkmark by it, which makes me think VS recognizes that this is the schema it's supposed to use, but still no joy. There are a few other schemas listed here (DotNetConfig30.xsd, for example), but none of those have checks by them - only DotNetConfig.xsd is checked.&lt;/p&gt; &lt;p&gt;Has anyone else seen this?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=51024" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category></item><item><title>Password Minder 1.5.0.10 Released</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/04/12/50712.aspx</link><pubDate>Sat, 12 Apr 2008 21:49:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50712</guid><dc:creator>keith-brown</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50712</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/04/12/50712.aspx#comments</comments><description>&lt;p&gt;This is a minor update. Here's what was changed (from the readme file):&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Incorporated a patch from Richard Howells to give&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; you the option to turn on/off the "Always On Top" behavior&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; of the main form. I still recommend not keeping PWM in&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memory all the time - only run it when you need it to keep&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; your master key safe. I also used adjusted the Auto-gen&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; password dialog to be more reasonable: it now by default&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; specifies a 12-char password, not the 20 it used to - most&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; websites can't handle a password that long. I also removed&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the lower case 'l' and punctuation, with a button that allows&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; you to add back in the puncutation marks if you want.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; One last minor thing - I added AcceptsReturn=true to the&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notes editor so it won't disappear when you press Enter :) &lt;p&gt;You can access the latest version from our &lt;a href="http://www.pluralsight.com/tools.aspx" target="_blank"&gt;tools page&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50712" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Security/default.aspx">Security</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Identity/default.aspx">Identity</category></item><item><title>WCF Security Guidance from P&amp;amp;P</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/04/04/50656.aspx</link><pubDate>Fri, 04 Apr 2008 12:09:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50656</guid><dc:creator>keith-brown</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50656</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/04/04/50656.aspx#comments</comments><description>&lt;p&gt;This is new; &lt;a href="http://blogs.msdn.com/jmeier/" target="_blank"&gt;J.D.&lt;/a&gt; and crew are hosting it on CodePlex to get feedback. From &lt;a href="http://blogs.msdn.com/jmeier/archive/2008/03/27/patterns-and-practices-wcf-security-guidance-now-available.aspx" target="_blank"&gt;J.D.'s blog&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Our &lt;a href="http://www.codeplex.com/WCFSecurity"&gt;patterns &amp;amp; practices WCF Security Guidance Project&lt;/a&gt; is in progress on CodePlex.&amp;nbsp; This is our first release of prescriptive guidance modules for WCF Security.&amp;nbsp; &lt;p&gt;&lt;strong&gt;How Tos&lt;/strong&gt;&lt;br&gt;Our How Tos give you step by step instructions for performing key tasks: &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%20-%20Create%20and%20Install%20Temporary%20Certificates%20in%20WCF%20for%20Message%20Security%20During%20Development&amp;amp;referringTitle=How%20Tos"&gt;How To - Create and Install Temporary Certificates in WCF for Message Security During Development&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%20-%20Create%20and%20Install%20Temporary%20Certificates%20in%20WCF%20for%20Transport%20Security%20during%20Development&amp;amp;referringTitle=How%20Tos"&gt;How To - Create and Install Temporary Certificates in WCF for Transport Security During Development&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%20-%20Impersonate%20the%20Original%20Caller%20in%20WCF%20calling%20from%20Web%20Application&amp;amp;referringTitle=How%20Tos"&gt;How To - Impersonate the Original Caller in WCF calling from Web Application&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%20-%20Impersonate%20the%20Original%20Caller%20in%20WCF%20calling%20from%20Windows%20Forms&amp;amp;referringTitle=How%20Tos"&gt;How To - Impersonate the Original Caller in WCF calling from Windows Forms&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%20-%20Use%20netTcpBinding%20with%20Windows%20Authentication%20and%20Transport%20Security%20in%20WCF%20from%20Windows%20Forms&amp;amp;referringTitle=How%20Tos"&gt;How To - Use netTcpBinding with Windows Authentication and Transport Security in WCF from Windows Forms&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%20-%20Use%20SQL%20Role%20Provider%20with%20Username%20Authentication%20in%20WCF%20calling%20from%20Windows%20Forms&amp;amp;referringTitle=How%20Tos"&gt;How To - Use SQL Role Provider with Username Authentication in WCF from Windows Forms&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%20-%20Use%20SQL%20Role%20Provider%20with%20Windows%20Authentication%20in%20WCF%20calling%20from%20Windows%20Forms&amp;amp;referringTitle=How%20Tos"&gt;How To - Use SQL Role Provider with Windows Authentication in WCF from Windows Forms&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%20-%20Use%20Username%20Authentication%20with%20the%20SQL%20Membership%20Provider%20and%20Message%20Security%20in%20WCF%20from%20Windows%20Forms&amp;amp;referringTitle=How%20Tos"&gt;How To - Use Username Authentication with the SQL Membership Provider and Message Security in WCF from Windows Forms&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%20-%20Use%20wsHttpBinding%20with%20Windows%20Authentication%20and%20Message%20Security%20in%20WCF%20from%20Windows%20Forms&amp;amp;referringTitle=How%20Tos"&gt;How To - Use WsHttpBinding with Windows Authentication and Message Security in WCF from Windows Forms&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%20-%20Use%20wsHttpBinding%20with%20Windows%20Authentication%20and%20Transport%20Security%20in%20WCF%20calling%20from%20Windows%20Forms&amp;amp;referringTitle=How%20Tos"&gt;How To - Use wsHttpBinding with Windows Authentication and Transport Security in WCF calling from Windows Forms&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Videos &lt;br&gt;&lt;/strong&gt;Our videos step you visually through key guidance: &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%3a%20How%20to%20Host%20WCF%20in%20a%20Windows%20Service&amp;amp;referringTitle=Video%20Index"&gt;Video: How To - Host WCF in a Windows Service&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%3a%20Impersonate%20the%20Original%20Caller%20in%20WCF%20calling%20from%20a%20Windows%20Form&amp;amp;referringTitle=Video%20Index"&gt;Video: How To - Impersonate the Original Caller in WCF calling from a Windows Form&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20to%3a%20Use%20basicHttpBinding%20with%20Certificate%20Authentication%20from%20Windows%20Forms&amp;amp;referringTitle=Video%20Index"&gt;Video: How To - Use basicHttpBinding with Client certificate in WCF from Windows Forms&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20to%3a%20Use%20netTcpBinding%20with%20Windows%20Authentication%20and%20MessageSecurity&amp;amp;referringTitle=Video%20Index"&gt;Video: How To - Use netTcpBinding with Windows Authentication and Message Security&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20to%20Use%20SQL%20Role%20Provider%20with%20Username%20Authentication%20in%20WCF%20calling%20from%20Windows%20Forms&amp;amp;referringTitle=Video%20Index"&gt;Video: How To - Use SQL Role Provider with Username Authentication in WCF calling from Windows Forms&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%3a%20Use%20WsHttpBinding%20with%20Certificate%20Authentication%20with%20Message%20Security%20%28object%20model%20programming%29%20&amp;amp;referringTitle=Video%20Index"&gt;Video: How To - Use WsHttpBinding with Certificate Authentication with Message Security&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To%3a%20Use%20WsHttpBinding%20with%20Windows%20Authentication%20with%20Message%20Security&amp;amp;referringTitle=Video%20Index"&gt;Video: How To - Use WsHttpBinding with Windows Authentication with Message Security&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50656" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Security/default.aspx">Security</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Identity/default.aspx">Identity</category></item><item><title>Claims talk</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/03/14/50480.aspx</link><pubDate>Fri, 14 Mar 2008 15:15:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50480</guid><dc:creator>keith-brown</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50480</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/03/14/50480.aspx#comments</comments><description>&lt;P&gt;Thanks to all of YOU who attended my claims-based identity postconference here at DevWeek. Grab the demos from &lt;A href="http://www.pluralsight.com/keith/presentations/claimsDemos.zip"&gt;here&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Updated (20 Mar 2008) with new link.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50480" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Security/default.aspx">Security</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Identity/default.aspx">Identity</category></item><item><title>Attack and Defense: Securing ASP.NET 2.0 Apps</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/03/13/50463.aspx</link><pubDate>Thu, 13 Mar 2008 09:44:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50463</guid><dc:creator>keith-brown</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50463</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/03/13/50463.aspx#comments</comments><description>&lt;P&gt;Thanks to all who attended this &lt;A href="http://www.devweek.com/sessions/conference3.asp"&gt;DevWeek talk&lt;/A&gt; today. Here's a &lt;A href="http://www.pluralsight.com/keith/presentations/attackDefenseDemos.zip"&gt;link&lt;/A&gt; to the demos I did, along with the tamper-detection code I showed you. Enjoy!&lt;/P&gt;
&lt;P&gt;Updated (20 Mar 2008) with new link.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50463" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Security/default.aspx">Security</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Enabling hierarchical nant builds</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/03/07/50388.aspx</link><pubDate>Fri, 07 Mar 2008 12:49:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50388</guid><dc:creator>keith-brown</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50388</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/03/07/50388.aspx#comments</comments><description>&lt;p&gt;In a &lt;a href="http://www.pluralsight.com/blogs/keith/archive/2008/01/18/49967.aspx" target="_blank"&gt;recent post&lt;/a&gt;, I talked about my experience enabling continuous integration for the internal builds here at Pluralsight. I recently worked with Craig to restructure our nant build. As part of that, I wanted to ensure that I could run the build from anywhere in the source tree. We use a typical hierarchical build where each project has a build script that knows how to compile, test, deploy, etc. based on the specified target. Then at the top of the tree, there's a build script that runs all the other ones. That root build script is what gets run automatically by &lt;a href="http://ccnet.thoughtworks.com/" target="_blank"&gt;Cruise Control&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My root script defines a bunch of properties, like where the output directories for the overall build live, where the tools live, and so on. And that works fine when I run the build from the root. The properties get defined, all the child scripts are run with &amp;lt;nant/&amp;gt; tasks, and they see those properties. But if I want to drill down into the tree and run one of the build scripts lower down, suddenly there's problems because it depends on properties that are only defined in the root script. I really like being able to run builds from anywhere in the tree for perf - if I'm trying to fix a particular project, I don't necessarily want to wait for unit tests on the entire tree to run in order to see if mine passed.&lt;/p&gt;
&lt;p&gt;Craig made a great suggestion. Put the properties into a separate script (we named it properties.nant) and &amp;lt;include/&amp;gt; that script. Then to enable hierarchical builds, we'd create a properties.nant file for each folder in the tree, which would &amp;lt;include/&amp;gt; its parent. That way I could define properties anywhere in the tree, and they would be "inherited" by anything below it.&lt;/p&gt;
&lt;p&gt;I took that idea one step further, because I didn't want to maintain a bunch of property scripts with nothing in them but an &amp;lt;include/&amp;gt; for the parent. I wrote an &amp;lt;includefromparent/&amp;gt; nant task that walks up the directory tree looking for the target file. So now I can do this:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&amp;lt;includefromparent buildfile="properties.nant"/&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;This worked great! But now I ran into a problem. Many of my properties are defined like so in the root properties.nant file:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&amp;lt;property name="libraryOutputDir" value="${project::get-base-directory()}\artifacts\libraries"/&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Do you see the issue? If I run the build with the root script, everything works fine, because it's the root nant project I'm building, and get-base-directory() refers to the root of the project, where the artifacts folder lives. But if I run from lower in the tree, it's a different project, and get-base-directory() refers to a subfolder, where the artifacts folder definitely should NOT be.&lt;/p&gt;
&lt;p&gt;I needed a way to find the root of the project tree. So I build a second really simple nant task:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&amp;lt;findmarkeddir markerfile="filetolookfor.txt" property="root"/&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;This task simply looks up the directory hierarchy until it finds the specified marker file, then puts the name of that directory (the "marked" directory) into a designated property (here I've called it root). With that in place, I rewrote my property definitions in terms of the base directory:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&amp;lt;property name="libraryOutputDir" value="${root}\artifacts\libraries"/&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Voilà! I can now run builds from any of my build scripts. They inherit properties hierarchically like you'd expect, and the system is quite easy to maintain. If you'd like to use these tasks, I've included the code for them below (not much code, really). And if you've never written a nant task yourself before, here's &lt;a href="http://blogs.geekdojo.net/rcase/archive/2005/01/06/5971.aspx" target="_blank"&gt;the article&lt;/a&gt; I used to figure out how it's done (it's super easy). &lt;a href="http://nant.sourceforge.net/release/latest/help/fundamentals/tasks.html#taskloader" target="_blank"&gt;Here's&lt;/a&gt; what you should read to learn about the various options for deploying your custom task assembly so nant recognizes it.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;Here is &lt;b&gt;FindMarkedDirTask.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
using System.Collections.Generic;
using System.Text;
using NAnt.Core;
using NAnt.Core.Attributes;
using System.IO;

namespace PluralsightNantTasks {

[TaskName("findmarkeddir")]
public class FindMarkedDirTask : Task {

  [TaskAttribute("markerfile", Required = true)]
  [StringValidator(AllowEmpty = false)]
  public string MarkerFileName { get; set; }

  [TaskAttribute("property", Required = true)]
  [StringValidator(AllowEmpty = false)]
  public string PropertyName { get; set; }

  protected override void ExecuteTask() {
    string searchDir = this.Project.BaseDirectory;
    do {
      if (MarkerFileExistsIn(searchDir)) {
        this.Project.Properties[PropertyName] = searchDir;
        return;
      }
      searchDir = ParentOf(searchDir);
    } while (!IsRootDirectory(searchDir));
  }

  private bool IsRootDirectory(string path) {
    return Path.GetPathRoot(path) == Path.GetFullPath(path);
  }

  private string ParentOf(string directory) {
    return Path.GetFullPath(Path.Combine(directory, ".."));
  }

  private bool MarkerFileExistsIn(string directory) {
    return File.Exists(Path.Combine(directory, MarkerFileName));
  }
}
}
&lt;/pre&gt;
&lt;p&gt;And here is &lt;b&gt;IncludeFromParentTask.cs&lt;/b&gt; (note I derive from the built-in include task):&lt;/p&gt;&lt;pre&gt;using System;
using System.Collections.Generic;
using System.Text;
using NAnt.Core;
using NAnt.Core.Attributes;
using NAnt.Core.Tasks;
using System.IO;
using System.Globalization;

namespace PluralsightNantTasks {

[TaskName("includefromparent")]
public class IncludeFromParentTask : IncludeTask {

  protected override void Initialize() {
    string fileName = BuildFileName;
    if (fileName.Contains("/") || fileName.Contains(@"\\"))
      throw new BuildException(string.Format(
        CultureInfo.CurrentCulture,
        "buildfile attribute must only be a filename"));

    string relativePathToFoundFile = SearchParentDirectory(
      Project.BaseDirectory, fileName, 0);
      
    if (null == relativePathToFoundFile)
      throw new BuildException(string.Format(
        CultureInfo.CurrentCulture,
        "Couldn't find a file named {0}" +
        " in a parent directory of {1}",
        fileName, Project.BaseDirectory));

    // have to use a relative path here
    // because &lt;include /&gt; task uses
    // Path.Combine(projectDir, BuildFileName)
    // to get the full path
    BuildFileName = relativePathToFoundFile;

    base.Initialize();
  }

  private string SearchParentDirectory(string directory,
                        string fileName, int searchDepth) {
    ++searchDepth;
  
    // see if we've traversed all the way to the root
    string currentPath = Path.GetFullPath(directory);
    if (currentPath == Path.GetPathRoot(currentPath))
      return null;

    // recurse until we find the file
    string parentDir = Path.GetFullPath(
      Path.Combine(currentPath, ".."));
    string path = Path.Combine(parentDir, fileName);
    if (File.Exists(path)) {
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i &amp;lt; searchDepth; ++i)
        sb.Append(@"..\");
      return Path.Combine(sb.ToString(), fileName);
    }
    else return SearchParentDirectory(parentDir,
                          fileName, searchDepth);
  }
}
}
&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50388" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category></item><item><title>Fix your jumpy optical mouse</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/03/05/50374.aspx</link><pubDate>Wed, 05 Mar 2008 13:19:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50374</guid><dc:creator>keith-brown</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50374</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/03/05/50374.aspx#comments</comments><description>&lt;p&gt;For the last few years, I've owned a couple of different optical mice. I started with a Logitech mouse and recently switched to a Microsoft mouse (Wireless Laser Mouse 6000). During the time I've owned these mice I've been frustrated by how they would jump around from time to time.&lt;/p&gt; &lt;p&gt;In the old days, I knew that to fix a standard mouse, you'd simply open the undercarriage, pop out the little ball, and scrape the crap off the rollers that accumulates over time. Voila! Your mouse would run like new. But there's no moving parts on the optical mouse, and it sure looked clean to me.&lt;/p&gt; &lt;p&gt;Invariably when my optical mouse would start to act up, I'd start switching surfaces, which sometimes seemed to help for awhile, but nothing really solved my problem, and I was about to go back to using a wired mouse.&lt;/p&gt; &lt;p&gt;Well, I feel pretty stupid, because I figured out how to fix the damn thing this morning. A bit of googling lead me to &lt;a href="http://www.pcmech.com/article/jumpy-optical-mouse/" target="_blank"&gt;an article&lt;/a&gt; which said that sometimes a little hair (or a piece of dust, I'd imagine) gets trapped in with the optical sensor.&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Console" size="4"&gt;The solution?&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Console" size="4"&gt;Blow out the little hole where the optical sensor lies.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;A quick puff of air cleared up my problem. Tada, new mouse. God I feel stupid. I think later today I'll pick up a dark, nonreflective mousepad to use, since this seems to be the recommended surface.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50374" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category></item><item><title>Workflow Services Context</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/02/14/50250.aspx</link><pubDate>Thu, 14 Feb 2008 20:35:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50250</guid><dc:creator>keith-brown</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50250</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/02/14/50250.aspx#comments</comments><description>&lt;P&gt;The cool new wsHttpContextBinding and friends silently manage a workflow instance id for you under the covers. The first time you make a request through one of these bindings, a workflow is created, and the instance id is sent back to the client via a SOAP header. It's then stored in the channel and sent back with every subsequent request so that further requests can be routed back to the same workflow instance.&lt;/P&gt;
&lt;P&gt;That's all well and good, but what if you want to contact an *existing* workflow? You'll need to communicate the workflow instance id to the channel manually. This is possible by querying the channel's context.&amp;nbsp;You'll need to add a reference to System.WorkflowServices (if you've not already got one). Once you do that, you can use this code to get the&amp;nbsp;InstanceId guid&amp;nbsp;from the channel:&lt;/P&gt;
&lt;P&gt;This code was tested with Visual Studio 2008 RTM.&lt;FONT size=4&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;TT&gt;// note if you're using a code-generated proxy, you'll need to use channel.InnerChannel&lt;/TT&gt;&lt;BR&gt;&lt;TT&gt;IContextManager contextManager =((IChannel)channel).GetProperty&lt;ICONTEXTMANAGER&gt;&lt;ICONTEXTMANAGER&gt;();&lt;BR&gt;IDictionary&lt;STRING, string&gt; ctx = contextManager.GetContext();&lt;BR&gt;&lt;BR&gt;// read the instance ID from the context...&lt;BR&gt;Guid instanceId = new Guid(ctx["instanceId"]);&lt;BR&gt;&lt;BR&gt;// or, maybe you need to update the context of a new channel...&lt;BR&gt;ctx["instanceId"] = instanceId.ToString();&lt;BR&gt;&lt;BR&gt;// ...and set it back on the channel (or a new channel)&lt;BR&gt;contextManager.SetContext(ctx);&lt;BR&gt;&lt;/TT&gt;&lt;/P&gt;
&lt;P&gt;Hope this helps - I'm recording this mainly for my own recall :)&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50250" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category></item><item><title>Gourmet Recipe Manager</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/01/30/50098.aspx</link><pubDate>Wed, 30 Jan 2008 21:02:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50098</guid><dc:creator>keith-brown</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50098</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/01/30/50098.aspx#comments</comments><description>&lt;p&gt;I managed to get &lt;a href="http://grecipe-manager.sourceforge.net/" target="_blank"&gt;this recipe manager&lt;/a&gt; installed last night. The &lt;a href="http://grecipe-manager.wiki.sourceforge.net/Windows+Installation" target="_blank"&gt;instructions for Windows users&lt;/a&gt; are pretty old and out of date (the primary audience for this software is in the linux world). But I managed to get it installed and running nevertheless, and if you're reasonably technical, you should be able to do it as well. Once I got the app running for the first time, it immediately appeared to download a boatload of data, which I think was a database of nutritional information for ingredients as well as ingredient/category mappings, and probably other stuff that I've not figured out yet.&lt;/p&gt; &lt;p&gt;From the little I've seen of this app, it looks pretty impressive. I'll keep experimenting and post my findings here.&lt;/p&gt; &lt;p&gt;Here are some hopefully helpful hints if you want to give it a try along with me. I installed all of the items on the "Required Packages" list:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;I already had Python 2.5 installed.&lt;/li&gt; &lt;li&gt;The Glade runtime environment was trivial to install.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.pygtk.org/downloads.html" target="_blank"&gt;PyGTK&lt;/a&gt; was a little more complicated. Since these instructions were written, it looks like the project was split into three parts, and I think you need all three (which are trivial to install). I installed the latest versions of each for Python 2.5. Once you get all three installed, add the bin/ directory from the GTK into your path and bring up a python command shell (just run python.exe to do this) then type 'import gtk' and if you don't get any errors, you're probably good.&lt;/li&gt; &lt;ol&gt; &lt;li&gt;PyCairo&lt;/li&gt; &lt;li&gt;PyGObject&lt;/li&gt; &lt;li&gt;PyGTK&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;PyWin32 install was trivial.&lt;/li&gt; &lt;li&gt;PIL was also trivial.&lt;/li&gt; &lt;li&gt;PyRTF is python sources, which you'll need to install. Copy the directory to a drive somewhere, then bring up a command shell and CD into the directory you just created. You should find a setup.py file there. Run 'python setup.py install' to install. This is what I'll call a "python install" from now on.&lt;/li&gt; &lt;li&gt;ReportLab also requires a "python install", so do the same thing.&lt;/li&gt; &lt;li&gt;PySqlite2 - the website is down as I write this, so I don't recall what type of install it requires, but I don't remember having trouble with it...&lt;/li&gt; &lt;li&gt;Metakit - this one I couldn't quite figure out how to install, but it appears to be an optional thing.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Once you've installed all of the prerequisites, it's easy to install &lt;a href="http://grecipe-manager.sourceforge.net/" target="_blank"&gt;Gourmet Recipe Manager&lt;/a&gt;. It's also a python install, and once you've run the setup.py script, you can launch the program as described in section 3 of the &lt;a href="http://grecipe-manager.wiki.sourceforge.net/Windows+Installation" target="_blank"&gt;instructions&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50098" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category></item><item><title>Geeks sharing recipes</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/01/29/50077.aspx</link><pubDate>Tue, 29 Jan 2008 16:17:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50077</guid><dc:creator>keith-brown</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50077</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/01/29/50077.aspx#comments</comments><description>&lt;p&gt;So I'm a divorced father who cares for his three sons 50% of the time. It's a challenging but tremendously fun task. Since the separation, I've been spending much more time with my kids than I ever did before, and I'm loving it. But I'm still a geek at heart, and I hate doing clerk-like work to figure out what to buy at the grocery store. I'd rather automate much of this menial work so that I have more time to spend with my kids or with my work.&lt;/p&gt; &lt;p&gt;My first step in my quest for automation was to find a program that helped me create shopping lists. I bought a copy of &lt;a href="http://www.aislebyaisle.com/" target="_blank"&gt;SimplyShopping&lt;/a&gt;, which has worked pretty well for what it does. What I like about this program is that it helps you print aisle-by-aisle shopping lists, which really speed grocery shopping up tremendously. What I dislike about it is that there's no end-to-end workflow where I can simply list the recipes I want to make for the week and have it print out a shopping list.&lt;/p&gt; &lt;p&gt;I thought of taking the concepts that I like in SimplyShopping and writing a new app that does everything I want it to do. I think I'll eventually do this. But the first thing I need to do is figure out a good data model for a recipe. And once I enter the recipe into my app, I'd like to be able to share it with other people. And what better way to do that then to start with a community-accepted XML format for recipes?&lt;/p&gt; &lt;p&gt;I searched for XML Schema Recipe and happened upon &lt;a href="http://www.formatdata.com/recipeml/index.html" target="_blank"&gt;RecipeML&lt;/a&gt;, which, based on its copyright, appears to have been around since 1999. They have a DTD but no schema, and the last time the DTD was updated was Nov 2000. Their gallery of applications links to a single app, whose web page no longer exists.&lt;/p&gt; &lt;p&gt;Another search for Recipe Sharing XML lead me to the &lt;a href="http://www.recipemanager.org/rsp/rsp10draft.html" target="_blank"&gt;Recipe Sharing Protocol Specification&lt;/a&gt;, which talks a lot about exchanging data, but very little about how to model a recipe in XML. They refer to something called RSPML, but I can't find that documented anywhere.&lt;/p&gt; &lt;p&gt;Then there's &lt;a href="http://www.happy-monkey.net/recipebook/" target="_blank"&gt;RecipeBook XML&lt;/a&gt;, which has a DTD and several sample recipes. This format uses mixed content, which makes me wonder how easy it'd be to program against.&lt;/p&gt; &lt;p&gt;Beyond finding an acceptable data model for sharing recipes, the next problem would be to agree on a vocabulary for units of measure. I don't think it'll be possible to come up with a list of ingredient names that everyone would agree upon, so the software processing the recipes would have to deal with that.&lt;/p&gt; &lt;p&gt;What do you think? Is this an intractable problem? If not, does anyone want to work on this with me? I think it'd be a fun project.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50077" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category></item><item><title>I'm coming to New York in February</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/01/23/50035.aspx</link><pubDate>Wed, 23 Jan 2008 19:44:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50035</guid><dc:creator>keith-brown</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50035</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/01/23/50035.aspx#comments</comments><description>&lt;p&gt;This is one of my favorite places, and I've been away for quite awhile. During the week of February 12, I'll be teaching our &lt;a href="http://www.pluralsight.com/courses/AppliedDotNet3.aspx" target="_blank"&gt;Applied .NET 3.0 course&lt;/a&gt;, and covering some of the new stuff in 3.5 as well. This class is an introduction to the 3.x platform: four day's of lectures, demos, and labs covering WCF, Workflow, WPF, and one of my favorite topics, the new claims-based identity model (which ADFS and CardSpace use). The course runs Tuesday through Friday.&lt;/p&gt; &lt;p&gt;If this sounds intriguing, &lt;a href="http://www.pluralsight.com/courses/AppliedDotNet3.aspx" target="_blank"&gt;sign up today&lt;/a&gt;!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50035" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Security/default.aspx">Security</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category></item><item><title>NCover.Console requires admin privileges</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/01/21/50002.aspx</link><pubDate>Mon, 21 Jan 2008 16:11:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50002</guid><dc:creator>keith-brown</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=50002</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/01/21/50002.aspx#comments</comments><description>&lt;p&gt;In my quest to get unit testing and code coverage, I was disappointed to find that &lt;a href="http://www.ncover.com/" target="_blank"&gt;NCover&lt;/a&gt; requires administrative privileges to run. &lt;a href="http://www.ncover.com/forum/show_topic/432" target="_blank"&gt;I posted on their forum about this&lt;/a&gt;, and was informed that the authors "haven't had a good enough reason" to fix the problem.&lt;/p&gt; &lt;p&gt;So right now, if you want to use NCover in your &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET" target="_blank"&gt;CruiseControl&lt;/a&gt; implementation, you're going to need to run the CruiseControl service under a user account with admin privileges. That's just wrong. I offered my help - I hope they will take me up on it.&lt;/p&gt; &lt;p&gt;I'm a bit surprised that I didn't see more of an outcry about this. I spent a bit of time searching and found some posts by NCover guys saying that NCover.Console requires admin privileges to run, but I didn't find anyone questioning that.&lt;/p&gt; &lt;p&gt;Wow. Are people regularly running CruiseControl with admin privileges? Or is nobody using NCover? Inquiring minds want to know...&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50002" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Security/default.aspx">Security</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Identity/default.aspx">Identity</category></item><item><title>I'm an Entertainer</title><link>http://www.pluralsight.com/community/blogs/keith/archive/2008/01/21/49999.aspx</link><pubDate>Mon, 21 Jan 2008 13:46:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:49999</guid><dc:creator>keith-brown</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/keith/rsscomments.aspx?PostID=49999</wfw:commentRss><comments>http://www.pluralsight.com/community/blogs/keith/archive/2008/01/21/49999.aspx#comments</comments><description>&lt;p&gt;I started working in education back in 1996, when I wrote a class on COM and started teaching it at the University of California/Irvine extension. After my first class, I was hooked. I loved meeting new people, finding out what they were working on, and seeing the light go on over their heads when they learned something new. I found it was a great way to help people.&lt;/p&gt; &lt;p&gt;Over the years, I learned from some of the best in the business (many of whom are no longer in the business, but who I still respect immensely): &lt;a href="http://www.pluralsight.com/blogs/dbox/default.aspx" target="_blank"&gt;Don&lt;/a&gt;, &lt;a href="http://www.sellsbrothers.com/" target="_blank"&gt;Chris&lt;/a&gt;, &lt;a href="http://www.pluralsight.com/blogs/tewald/default.aspx" target="_blank"&gt;Tim&lt;/a&gt;, &lt;a href="http://www.pluralsight.com/blogs/fritz/default.aspx" target="_blank"&gt;Fritz&lt;/a&gt;, and &lt;a href="http://www.facebook.com/people/Ted_Pattison/591663783" target="_blank"&gt;Ted&lt;/a&gt;, to name a few. One thing I realized from the start watching these guys on stage was that you have to entertain your audience in order to engage them, but it took me many, many years to be able to do this well myself. What finally clicked for me was to relax, be myself, and stop trying to imitate others.&lt;/p&gt; &lt;p&gt;So I loved &lt;a href="http://www.codinghorror.com/blog/" target="_blank"&gt;Jeff'&lt;/a&gt;s recent post on &lt;a href="http://www.codinghorror.com/blog/archives/001040.html" target="_blank"&gt;The Sesame Street Presentation Rule&lt;/a&gt;. This is excellent advice:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;After being on both the giving and receiving end of plenty of presentations, I now realize there's one golden rule which applies to all of them: &lt;/em&gt; &lt;p&gt;&lt;b&gt;&lt;em&gt;Entertain your audience.&lt;/em&gt;&lt;/b&gt; &lt;p&gt;&lt;em&gt;Every slide of your presentation should serve this fundamental vision statement. Is it&lt;/em&gt; entertaining&lt;em&gt;? I don't mean each slide has to contain a wacky joke of some kind. Every slide should &lt;b&gt;provoke a reaction from the audience&lt;/b&gt; -- be it controversial, unexpected, amusing, or a meditative Zen koan. Prod your audience. Do this not only to keep them awake, but to engage their brains. Deliver a series of short, sharp shocks that jolt your audience into a heightened state of engagement.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;And for those who haven't yet seen it, this is one of the most entertaining and engaging presentations I've ever seen: &lt;a href="http://identity20.com/media/OSCON2005/" target="_blank"&gt;Dick Hardt's Identity 2.0 introduction&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=49999" width="1" height="1"&gt;</description><category domain="http://www.pluralsight.com/community/blogs/keith/archive/tags/Geek+talk/default.aspx">Geek talk</category></item></channel></rss>