<?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-8256260706621645238</id><updated>2011-08-01T16:02:10.108-04:00</updated><category term='C#'/><category term='VtCodeCamp'/><category term='Tools'/><category term='Web Development'/><category term='Social'/><category term='PDC09'/><category term='Architecture'/><category term='T-SQL'/><category term='NAnt'/><category term='ASP.NET'/><category term='.NET'/><category term='Career'/><title type='text'>BigPigVT</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bigpigvt.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-3490955806079364661</id><published>2011-04-07T17:14:00.000-04:00</published><updated>2011-04-07T17:14:12.734-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Input on mobile devices - The long awaited follow up</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Remember my last post? &amp;nbsp;I said I was going to give the &lt;span class="Apple-style-span" style="color: #333333; line-height: 16px;"&gt;&lt;a href="http://beta.swype.com/" style="color: #336699;"&gt;Swype beta&lt;/a&gt;&amp;nbsp;a try? &amp;nbsp;That was back in January. &amp;nbsp;I'm still using it and can't see a reason not to continue with it. &amp;nbsp;It's a very good blend of gesture based input with the keyboard layout I expect. &amp;nbsp;That's not saying it's perfect. &amp;nbsp;I still sometimes struggle with things like entering times because including the colon (:) triggers the auto complete. &amp;nbsp;I also wish entering "your" would allow me to select "you're" from the options of what you might have meant. &amp;nbsp;But these are quibbles and on the whole I'm very happy.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 16px;"&gt;I thought you might like to know.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-3490955806079364661?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/3490955806079364661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/3490955806079364661'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2011/04/input-on-mobile-devices-long-awaited.html' title='Input on mobile devices - The long awaited follow up'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-4365532470764801090</id><published>2011-01-18T09:51:00.000-05:00</published><updated>2011-01-18T09:51:09.735-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Input on mobile devices</title><content type='html'>Since the last time I posted (I know, way too long ago) I've changed my phone from a Palm Treo 800w (Windows Mobile 6) to a HTC EVO (Android). &amp;nbsp;I've got to say I love my new phone. &amp;nbsp;It does everything I want it to do&amp;nbsp;seamlessly. &amp;nbsp;This includes managing my Google calendar and Gmail, Twitter, Facebook, etc.&lt;br /&gt;&lt;br /&gt;One of the things I was apprehensive about in making the switch, though, was the lack of a physical keyboard. &amp;nbsp;I've always&amp;nbsp;benefited&amp;nbsp;from the tactile response you get from actual buttons. &amp;nbsp;For example, I drive a first generation Prius. &amp;nbsp;In my car the radio station presets are exposed as "buttons" on the center display screen - so no physical buttons. &amp;nbsp;To change the radio station I have to press the "Audio" button on the dashboard (that's a physical button) then look on the screen to press the preset station "button" to change the station.&lt;br /&gt;&lt;br /&gt;Which means taking my eyes off the road.&lt;br /&gt;&lt;br /&gt;While driving.&lt;br /&gt;&lt;br /&gt;So I've learned to hate the on-screen buttons (and to content myself with one radio station that I rarely switch from). What I didn't anticipate with the phone, however, was the fun I could have experimenting with different input methods you get when the physical keyboard is eliminated. &lt;br /&gt;&lt;br /&gt;The EVO comes with a standard on-screen QWERTY keyboard. &amp;nbsp;There are options for having the phone vibrate for each key press (do you call it a key press when there are no keys?) to provide that tactile response I mentioned (although, again, there's no way to determine which "key" you're on without looking at the screen). &lt;br /&gt;&lt;br /&gt;And I was merrily using that when one of my co-workers, &lt;a href="http://twitter.com/pmulc07"&gt;Pat&lt;/a&gt;, directed me to &lt;a href="http://www.the8pen.com/"&gt;8Pen&lt;/a&gt;. &amp;nbsp;Now I could try to describe 8Pen, but really you should go to their web site and watch the&amp;nbsp;introductory video. &amp;nbsp;Go ahead and watch it, I'll wait...&lt;br /&gt;&lt;br /&gt;Pretty cool, right? &amp;nbsp;I thought they made a compelling case for ditching the QWERTY keyboard. &amp;nbsp;So I tried it. I installed 8Pen and made a decision to go cold turkey. &amp;nbsp;I knew there would be a learning curve and it might take a while to adapt. &amp;nbsp;It has a number of improvements over the default keyboard. For example, the auto-complete functionality is &lt;i&gt;much&lt;/i&gt; than the default. &amp;nbsp;However, after a month without using the default keyboard I decided to ditch 8Pen. &amp;nbsp;It's not that it doesn't work as advertised - it does. &amp;nbsp;But even after a month I was still being slowed down trying to find certain letters.&lt;br /&gt;&lt;br /&gt;Why was that? &amp;nbsp;Why am I measurably faster using a QWERTY keyboard? &amp;nbsp;I think the answer is explained by a blog post I read several years ago. &amp;nbsp;Back when I still read the JoelOnSoftware blog&amp;nbsp;&lt;a href="http://www.joelonsoftware.com/uibook/chapters/fog0000000058.html"&gt;this post&lt;/a&gt;&amp;nbsp;resonated with me. &amp;nbsp;The central point that I took from it is users have a positive or negative experience with software depending on how that software conforms to their previous experiences. &amp;nbsp;That bias is called the &lt;i&gt;user model&lt;/i&gt;. &amp;nbsp;Well,&amp;nbsp;after 25+ years of typing on QWERTY keyboards I'm really efficient at locating letters in that arrangement. &amp;nbsp;Additionally, because I continued to use a QWERTY keyboard throughout the day on my laptop and desktop my assimilation of the 8Pen layout was constantly being subverted. &amp;nbsp;So I cried "uncle."&lt;br /&gt;&lt;br /&gt;The good news is that Pat came to my rescue with a link to the &lt;a href="http://beta.swype.com/"&gt;Swype beta&lt;/a&gt;. &amp;nbsp;It has the benefit of the QWERTY layout while embracing a gesture based style of input. &amp;nbsp;It's been a week and so far I'm really enjoying it. &amp;nbsp;It's not perfect either, of course, but I'm willing to at least give it a month like I did 8Pen.&lt;br /&gt;&lt;br /&gt;Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-4365532470764801090?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/4365532470764801090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/4365532470764801090'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2011/01/input-on-mobile-devices.html' title='Input on mobile devices'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-5750144520260066692</id><published>2010-07-13T20:16:00.000-04:00</published><updated>2010-07-13T20:16:30.044-04:00</updated><title type='text'>Turning off the comments on this thing</title><content type='html'>I've decided to turn off comments on the blog because comments were running 8 spam links for every 1 meaningful comment. &amp;nbsp;If you want to send me feedback about a post feel free to send me something on Twitter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-5750144520260066692?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5750144520260066692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5750144520260066692'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2010/07/turning-off-comments-on-this-thing.html' title='Turning off the comments on this thing'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-8015848282309071217</id><published>2010-07-06T16:38:00.000-04:00</published><updated>2010-07-06T16:38:22.749-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Where did FxCop go?</title><content type='html'>I've used FxCop to do code analysis for years now (and brow beat co-workers to use it, too). &amp;nbsp;I've incorporated it into my automated build scripts and use it every time I do a code review. &amp;nbsp;So imagine my dismay when I heard the &lt;a href="http://go.microsoft.com/fwlink/?LinkId=70294"&gt;FxCop site&lt;/a&gt; was no longer running (I usually get there from the &lt;a href="http://msdn.microsoft.com/en-us/library/bb429476(v=VS.80).aspx"&gt;MSDN Library entry about FxCop&lt;/a&gt;). &amp;nbsp;I wasn't sure if this was just a case of a dead link, but then I read &lt;a href="http://www.infoq.com/news/2010/06/FXCop-10"&gt;this article&lt;/a&gt; by Jonathan Allen on &amp;nbsp;InfoQ. &amp;nbsp;Apparently FxCop 1.36 was yanked from the Microsoft Downloads site. &amp;nbsp;Jonathan's article directs the reader to the &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b"&gt;Windows 7 SDK&lt;/a&gt;. &amp;nbsp;The Microsoft Download site has &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=917023f6-d5b7-41bb-bbc0-411a7d66cf3c"&gt;an entry for FxCop 10&lt;/a&gt;&amp;nbsp;but it turns out that just gets you a readme.txt file instructing you to download the Windows SDK for Windows 7. &lt;br /&gt;&lt;br /&gt;That's not terribly useful. &amp;nbsp;There isn't even a link to where to get the Windows 7 SDK in the readme file.&lt;br /&gt;&lt;br /&gt;So thank you to InfoQ and Jonathan for providing the &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b"&gt;link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;BTW, it seems the only reason the older FxCop version was removed was because the functionality FxCop provides is in some versions of VS2010. &amp;nbsp;This is going to have an impact on my automated build scripts so I expect I'll be following the advice from &lt;a href="http://www.paraesthesia.com/archive/2010/03/29/updating-your-continuous-integration-build-to-run-fxcop-from-vs2010.aspx"&gt;this blog post&lt;/a&gt; from Travis Illig's blog at some point - so thanks to him, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-8015848282309071217?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8015848282309071217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8015848282309071217'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2010/07/where-did-fxcop-go.html' title='Where did FxCop go?'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-2736918144410580774</id><published>2010-06-14T16:35:00.000-04:00</published><updated>2010-06-14T16:35:31.111-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Which came first, the variable or the literal?</title><content type='html'>Today I received the feedback from a code review one of my peers did of my code and they asked a question about a particular coding style technique I use. &amp;nbsp;Specifically they asked why when comparing a variable to a literal value I always put the literal value on the left side of the operator? &amp;nbsp;Put another way, why do I do this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;if(null == someVariable)&lt;/span&gt;&lt;br /&gt;instead of this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;if(someVariable == null)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After all, this person pointed out, the second method is more easily read as "someVariable equals null" as opposed to "null is equal to the value of someVariable." &amp;nbsp;I think that's a fair point and while I'm a big proponent of increasing the readability of code this is an instance where I'll take the hit.&lt;br /&gt;&lt;br /&gt;My habit of putting the literal value before the variable comes from dealing with Javascript. &amp;nbsp;When coding Javascript I might check to see if a value is set to zero, like this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;if(someVariable = 0)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Maybe that looks good to me because I haven't had my third espresso of the day - but it introduces a bug in my code. &amp;nbsp;I fat-fingered the operator and put &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;=&lt;/span&gt; instead of &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;==&lt;/span&gt;. &amp;nbsp;So now the statement isn't doing an evaluation, it's doing an assignment. &amp;nbsp;I'm not going to catch that as part of a compile because Javascript is not compiled. &amp;nbsp;And it's not going to raise a run-time error because it's syntactically valid. &lt;br /&gt;&lt;br /&gt;But it's not going to do what I want it to do.&lt;br /&gt;&lt;br /&gt;Because I've been burned by this in the past I got in the habit of putting the literal on the left side of the operator. &amp;nbsp;Because while I still won't get any compile-time love I will get a run-time error when the code says:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;if(0 = someVariable)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yes, the code review was being done against some of my C# code so the same risk isn't there. &amp;nbsp;But I don't feel like changing this habit from language to language. &amp;nbsp;Especially where I'm doing ASP.NET and am jumping between C# and Javascript all day anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-2736918144410580774?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/2736918144410580774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/2736918144410580774'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2010/06/which-came-first-variable-or-literal.html' title='Which came first, the variable or the literal?'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-633039856890499923</id><published>2010-05-21T16:11:00.000-04:00</published><updated>2010-05-21T16:11:19.456-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Follow up on CamStudio</title><content type='html'>I've done a couple of videos for work now using CamStudio (as mentioned in my previous post). &amp;nbsp;One thing is the resulting AVI files are HUGE. &amp;nbsp;I'm trying to get familiar with how to compress the video and found &lt;a href="http://dai-videotutes.blogspot.com/2007/05/camtstudio-compression-settings.html"&gt;this tutorial&lt;/a&gt;&amp;nbsp;from &lt;a href="http://dai-videotutes.blogspot.com/"&gt;Video Tutes&lt;/a&gt; helpful so I figured I would share.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-633039856890499923?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/633039856890499923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/633039856890499923'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2010/05/follow-up-on-camstudio.html' title='Follow up on CamStudio'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-4848620745399222348</id><published>2010-04-14T14:34:00.002-04:00</published><updated>2010-04-14T14:43:48.394-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Free screen capture tool: CamStudio</title><content type='html'>Yesterday I gave a 2 hour presentation to all our new developers about some of the tools we use.  Unfortunately, I neglected to mention one of them.  Rather than schedule another meeting for a 5 minute topic I decided to record a quick screen cast.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I thought it would be quick, anyway.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've done this in the past using Snagit which has a video capture function.  But for whatever reason the act of recording the screen caused my actions to suffer a terrible delay.  For example, click a menu item and wait 45 seconds for the menu to react.  Not good.  I lost about an hour trying to get the system to work correctly while recording without success.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Over lunch a coworker suggested using a free tool called &lt;a href="http://camstudio.org/"&gt;CamStudio&lt;/a&gt;.  I installed it, changed a couple of settings to record audio and boom! Done.  Free and easy.  Two of my favorite four letter words.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-4848620745399222348?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/4848620745399222348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/4848620745399222348'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2010/04/free-screen-capture-tool-camstudio.html' title='Free screen capture tool: CamStudio'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-5499742803861101467</id><published>2010-04-09T13:58:00.002-04:00</published><updated>2010-04-09T14:08:28.376-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><title type='text'>Getting ready for Visual Studio 2010 and .NET 4</title><content type='html'>Monday is the launch of Visual Studio 2010 and .NET 4!  Are you as excited as I am? Yeah, I thought so.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the things I've been doing to get ready for this (in addition to playing with the RC) has been preparing for the April VT.NET user group meeting.  Our meeting coincides with the release date so we're dedicating the meeting to have people share their favorite new feature.  I'll be talking about:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;snippets for web developers (e.g. HTML, ASP.NET and MVC)&lt;/li&gt;&lt;li&gt;web.config transformations&lt;/li&gt;&lt;li&gt;JavaScript intellisense&lt;/li&gt;&lt;li&gt;and the revised Add Resources dialog&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Information about the VT.NET user group is available at &lt;a href="http://www.vtdotnet.org/"&gt;http://www.vtdotnet.org/&lt;/a&gt; and registration for the event is at &lt;a href="http://vtdotnet.eventbrite.com/"&gt;http://vtdotnet.eventbrite.com/&lt;/a&gt;.  One of the new things we're going to do at this meeting, by the way, is to conduct the raffle for people who have registered for the meeting.  So go sign up before the meeting!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-5499742803861101467?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5499742803861101467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5499742803861101467'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2010/04/getting-ready-for-visual-studio-2010.html' title='Getting ready for Visual Studio 2010 and .NET 4'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-560118522481500144</id><published>2010-02-16T10:21:00.002-05:00</published><updated>2010-02-16T10:25:24.194-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><title type='text'>New tool I'm using - SSMS Tools Pack</title><content type='html'>We do a lot of SQL Server programming where I work.  I'm using SQL Server Management Studio 2008, which is nice, but I just made it much nicer by installing Mladen Prajdic’s SSMS Tools Pack (&lt;a href="http://ssmstoolspack.com/"&gt;http://ssmstoolspack.com/&lt;/a&gt;).  The features I've discovered so far are:&lt;div&gt;&lt;ul&gt;&lt;li&gt;color coding the editor by connection (so you have a visual cue that you're connected to production versus QA versus your development DB)&lt;/li&gt;&lt;li&gt;auto-formatting&lt;/li&gt;&lt;li&gt;snippets&lt;/li&gt;&lt;li&gt;New Query templates (so you always start with a Begin Tran)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I like this quite a bit.&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/8256260706621645238-560118522481500144?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/560118522481500144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/560118522481500144'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2010/02/new-tool-im-using-ssms-tools-pack.html' title='New tool I&apos;m using - SSMS Tools Pack'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-2932909681552390701</id><published>2010-02-12T08:53:00.003-05:00</published><updated>2010-02-12T09:11:44.539-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>Making tiny things big - no, not Viagra</title><content type='html'>&lt;div&gt;Today I got an email from a friend who was taking over a web site from someone else.  Apparently he hadn't been given all the original files and is picking up based on what exists on the web server.  He was contacting me because there was a JS file which was formatted to all be on one line.  He was looking for a way to reformat the file to something he could read.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is one of those rare occasions when I'm actually able to help someone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;One of the things I've learned since starting at the current gig has been the importance of minifying (sometimes called "packing") the CSS and JS files our application delivers to the browser.  If you're not familiar with minifying CSS and JS files, it's when you take your file which is formatted nicely for humans with stuff like comments, indentation, vertical white space, meaningful variable names and etc. and you run it through a program that removes all the stuff that humans like, but which the browser doesn't need.  By removing all that stuff, the file can be made significantly smaller - which reduces download time and improves the performance of the web site.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The file he was dealing with had clearly been run through a minifier.  The trick now would be to unminify the file.  I've never had to do that because we're always starting with the source code.  But a quick search on Google lead me to &lt;a href="http://jsbeautifier.org/"&gt;http://jsbeautifier.org/&lt;/a&gt;.  The tool on this site can reintroduce white-space, such as vertical white-space and indentation, to make the code easier on the eyes.  Obviously, it cannot restore comments or meaningful variable names, but if you're going to have to dig in and figure out the code it's a good way to start.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-2932909681552390701?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/2932909681552390701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/2932909681552390701'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2010/02/making-tiny-things-big-no-not-viagra.html' title='Making tiny things big - no, not Viagra'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-2552437434448135391</id><published>2010-01-19T21:54:00.004-05:00</published><updated>2010-01-29T22:37:01.677-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDC09'/><category scheme='http://www.blogger.com/atom/ns#' term='VtCodeCamp'/><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><title type='text'>Book Review: "slide:ology"</title><content type='html'>&lt;div&gt;When I attended PDC in November one of the booths I visited in the exposition hall was &lt;a href="http://oreilly.com/"&gt;O'Reilly Media&lt;/a&gt;.  They have been, and continue to be, supporters of the &lt;a href="http://www.vtdotnet.org/"&gt;VT .NET user group&lt;/a&gt; and the VT Code Camp - so I wanted to drop by and thank them for that.  It turns out &lt;a href="http://twitter.com/Marsee"&gt;Marsee Henon&lt;/a&gt; was there.  Marsee's job is to reach out to user group leaders on behalf of O'Reilly - so she was the perfect person to run into.  Knowing that I have done presentations for the VT .NET user group she was kind enough to give me a copy of "&lt;a href="http://oreilly.com/catalog/9780596522353"&gt;slide:ology&lt;/a&gt;" by Nancy Duarte.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nancy Duarte is CEO of &lt;a href="http://www.duarte.com/"&gt;Duarte Design&lt;/a&gt;, one of the largest design firms in Silicon Valley, which focuses exclusively on presentations.  She has poured her expertise into "slide:ology" (subtitled "The Art and Science of Creating Great Presentations").  The book sets out to liberate presenters, and their audiences, from the tedium of presentations which are little more than documents shown through a projector.  We've all attended such presentations, of course.  Slide after slide loaded with bullet points with the speaker reading each one in turn.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The early parts of "slide:ology" takes the reader by the hand and reviews with him/her how bullet points can be distilled down to ideas to be communicated.  Additionally, by considering the audience those ideas can be delivered in the most appropriate manner.  Those practices alone can help presenters be more effective.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Much of the remainder of the book is focused on moving your presentation from merely effective to compelling.  Examples of effectively visualizing data (using graphs, images, diagrams, etc.).  Guidance on the impact of color and font choices to communicate and to best represent yourself and/or organization are offered.  Incorporating movement and animations was a topic I had not considered before, but was a section I found particularly useful. Finally, there is a section on how templates can be defined to provide a uniformity for an organization with several presentations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've prepared two presentations since reading "slide:ology" and both were better as a result.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book itself is a fairly quick read and presented in a clear, concise manner.  The size of the book is reminicent of a slide show, too, with the layout of each page following many of the same guidelines for design and communication.  I found some of the early sections a little pretentious - but that might be due to the fact I'm not preparing presentations designed to save the world or provide clean drinking water to the third world. If you read "slide:ology" and start to feel that way just power through... there is more than enough content to justify reading the whole book.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This book belongs on the shelf of anyone who prepares presentations - especially if they lack a design background.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-2552437434448135391?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/2552437434448135391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/2552437434448135391'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2010/01/book-review-slideology.html' title='Book Review: &quot;slide:ology&quot;'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-4943979056185238374</id><published>2010-01-12T08:29:00.002-05:00</published><updated>2010-01-12T08:53:42.835-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='PDC09'/><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><title type='text'>Links from my VT.NET User Group talk</title><content type='html'>I had a lot of fun presenting at last night's VT.NET user group meeting.  The topic was a wrap up of my trip to Microsoft's PDC conference in Nov. 2009.  There were a few links I mentioned during the talk I wanted to share.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Obviously folks will want to check out the PDC web site at &lt;a href="http://microsoftpdc.com/"&gt;http://microsoftpdc.com/&lt;/a&gt; for access to all the videos and slide decks.  There are additional materials for some of the official announcements at the PDC press site, &lt;a href="http://www.microsoft.com/presspass/events/pdc/default.aspx"&gt;http://www.microsoft.com/presspass/events/pdc/default.aspx&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The data developer center can be found at &lt;a href="http://msdn.com/data"&gt;http://msdn.com/data&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As I mentioned during the talk, one of the sessions I attended was "Building Location Aware Applications with the SQL Spacial Library."   I described a demonstration from that session where location information in an Excel spreadsheet was used to highlight portions of a map.  There's a fairly comprehensive blog post outlining that demo from the presenter available at &lt;a href="http://blogs.msdn.com/oliviermeyer/archive/2009/11/17/introducing-the-excel-spatial-spreadsheet-building-an-excel-add-in-for-doing-spatial-analysis-and-spatial-operations-in-net.aspx"&gt;http://blogs.msdn.com/oliviermeyer/archive/2009/11/17/introducing-the-excel-spatial-spreadsheet-building-an-excel-add-in-for-doing-spatial-analysis-and-spatial-operations-in-net.aspx&lt;/a&gt; with a follow up blog post at &lt;a href="http://blogs.msdn.com/oliviermeyer/archive/2009/12/29/the-excel-spatial-spreadsheet-part-deux.aspx"&gt;http://blogs.msdn.com/oliviermeyer/archive/2009/12/29/the-excel-spatial-spreadsheet-part-deux.aspx&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, during the session I mentioned a few speakers who stood out.  Here are links to their blogs:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;David Chappell: &lt;a href="http://www.davidchappell.com/blog/index.php"&gt;http://www.davidchappell.com/blog/index.php&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Don Box: &lt;a href="http://twitter.com/donbox"&gt;http://twitter.com/donbox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Pablo Castro: &lt;a href="http://blogs.msdn.com/pablo/"&gt;http://blogs.msdn.com/pablo/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;I hope everyone that attended the session got a little something out of it.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-4943979056185238374?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/4943979056185238374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/4943979056185238374'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2010/01/links-from-my-vtnet-user-group-talk.html' title='Links from my VT.NET User Group talk'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-483175807575335516</id><published>2009-12-02T13:43:00.012-05:00</published><updated>2009-12-02T17:55:44.857-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NAnt'/><title type='text'>Wiring FxCop up to our build process</title><content type='html'>Earlier this week we decided to finally pull the trigger to have our automated build fail when the code violates the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=3389F7E4-0E55-4A4D-BC74-4AEABB17997B&amp;amp;displaylang=en"&gt;FxCop&lt;/a&gt; rules we use for code analysis.  Previously we ran FxCop but rule violations didn't break the build.  The code is a legacy application and so lots of rules were broken pretty much everywhere.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But yesterday I set all existing violations as exceptions so FxCop will basically ignore them.  Today's effort was to figured out how to have the build break &lt;i&gt;&lt;b&gt;and&lt;/b&gt;&lt;/i&gt; still have the FxCop results appear in &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl.NET&lt;/a&gt; (CC.NET).  That second goal was a bit trickier than I thought it would be.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There were two changes that had to be made to enable this.  First, was to have the &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt; script fail when FxCop finds a problem.  This wasn't a big deal because FxCop only produces the XML output when there are violations.  All I had to do was add a &lt;a href="http://nant.sourceforge.net/release/latest/help/tasks/fail.html"&gt;FAIL&lt;/a&gt; task that runs after the code analysis.  If the output file exists we fail.  This is what that task looks like:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;fail if="${file::exists(fxcop.output.path)}"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;fail if=&amp;quot;${file::exists(fxcop.output.path)}&amp;quot;&amp;gt;FxCop rules violated, see FxCop Report for details.&amp;lt;/fail&amp;gt;&lt;/span&gt;&lt;/fail&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now the code analysis can build to break - awesome! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But doing this caused the FxCop Report in CC.NET to not display any results.  &lt;a href="http://leifw.wickland.net/2006/10/integrating-fxcop-into.html"&gt;This blog post&lt;/a&gt; by Leifw gave me the hint I needed to resolve the problem.  Previously I had been doing my &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/File+Merge+Task"&gt;File Merge&lt;/a&gt; to get the FxCop results as part of the &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Task+Blocks"&gt;TASKS&lt;/a&gt; node of my CC.NET &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Project+Configuration+Block"&gt;project configuration block&lt;/a&gt;.  It turns out, though, File Merges done in the TASKS node won't occur if the build fails.  I moved it to a PUBLISHERS node in the project and it all works ducky.  That's because the PUBLISHERS node is processed even if the build fails.  That looks like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;project name="MyWebGrocer.Gsa Trunk"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;publishers&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;merge&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;files&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;file&amp;gt;C:\BuildArtifacts\Project_Trunk\*.xml&amp;lt;/file&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;/files&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;/merge&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;xmllogger /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;/publishers&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now if someone commits code that does something unforgivable - like neglecting to make a method static if it doesn't use any instance members - the build will break and they can check what the offense was via the CC.NET dashboard.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's still a legacy application - but we won't be committing any more legacy code.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;  &lt;/div&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/8256260706621645238-483175807575335516?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/483175807575335516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/483175807575335516'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/12/wiring-fxcop-up-to-our-build-process.html' title='Wiring FxCop up to our build process'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-9118164569780654436</id><published>2009-09-16T20:18:00.004-04:00</published><updated>2009-09-16T21:40:05.616-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VtCodeCamp'/><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><title type='text'>VT Code Camp 1: Summary</title><content type='html'>It's been nice to read some of the posts people have made about the VT code camp.  The ones I've seen are by &lt;a href="http://bradley-holt.blogspot.com/2009/09/vermont-code-camp-heroes.html"&gt;Bradley Holt&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/cbowen/archive/2009/09/15/vermont-s-first-code-camp-a-success.aspx"&gt;Chris Bowen&lt;/a&gt;, &lt;a href="http://dbvt.com/blog/post/What-Can-I-Say-About-Vermont-Code-Camp-1.aspx"&gt;Dave Burke&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/09/13/vermont-code-camp-mission-accomplished.aspx"&gt;Jim O'Neil&lt;/a&gt;.  But I thought I would post my own summary of the first VT code camp.&lt;br /&gt;&lt;br /&gt;First, I want to reiterate my appreciation to the many donors, speakers and volunteers who made the event the wild success that it was.  You folks rock!&lt;br /&gt;&lt;br /&gt;Code camp setup began around 7:30AM.  This was only my second time at Kalkin Hall and was just as impressed with this location as I was when I had seen it the day before.  It is just a wonderful space that suited our event to a "T."  Again, many thanks to the &lt;a href="http://www.bsad.uvm.edu/home/"&gt;UVM School of Business Administration&lt;/a&gt; for opening their doors to us.  The setup team included Margot Schips, &lt;a href="http://www.thedatafarm.com/blog"&gt;Julie Lerman&lt;/a&gt;, &lt;a href="http://bluenotecomputing.com/"&gt;Laura Blood&lt;/a&gt;, &lt;a href="http://reninfosys.com/"&gt;Carl Lorenston&lt;/a&gt;, &lt;a href="http://bradley-holt.blogspot.com/"&gt;Bradley Holt&lt;/a&gt; and &lt;a href="http://twitter.com/danruss"&gt;Dan Russell&lt;/a&gt;.  (If I'm forgetting someone I apologize.  Things were moved so fast and furious during the day I neglected to stop and take notes to do this properly.)&lt;br /&gt;&lt;br /&gt;We got our only crisis out of the way early on Saturday when at around 7:35AM when we found out one of the rooms we were told we would be using turned out to be hosting a different all day event.  After some frantic calls made by Margot we got it straightened out and were able to use an alternate room which worked just as well.&lt;br /&gt;&lt;br /&gt;After that it was smooth sailing.  We had a marvelous breakfast spread provided by &lt;a href="http://gmcr.com/"&gt;Green Mountain Coffee Roasters&lt;/a&gt;.  Lots of coffee, lots of pastries, lots of bagels and even lots of fruit.  It was all yummy (and I speak from experience... lots of experience).&lt;br /&gt;&lt;br /&gt;In typical VT style we began the welcoming remarks a few minutes behind schedule (what? you got someplace to be?).  After thanking the donors, orienting everyone to the space and reviewing the day's schedule we turned our attendees loose.  Plenty of positive energy and familiar faces.&lt;br /&gt;&lt;br /&gt;The first two time slots went off without any projectors exploding (although it took a little bit to figure one of them out).  Laura Blood was super-generous with her time and watched the registration desk.  After that we broke for a lunch provided by &lt;a href="http://www.mywebgrocer.com/"&gt;MyWebGrocer&lt;/a&gt;.  Lots of pizza and soda.  Filled me right up.  By this point my schedule started to even out.  We had the swag organized, the registrations had started to die down and  Julie and I had done the pizza run (complete with &lt;a href="http://www.flickr.com/photos/42504188@N03/3921201458/in/set-72157622371167644/"&gt;expert parking job&lt;/a&gt;).  So I made the most of it and enjoyed the lunch break.  It was great to spend a few minutes chatting with folks I knew and meeting folks I hadn't - plus the surreal experience of meeting in person folks I only knew from online.&lt;br /&gt;&lt;br /&gt;After lunch we dove back into session.  We moved the registration desk downstairs where it was manned by &lt;a href="http://dbvt.com/blog/post/What-Can-I-Say-About-Vermont-Code-Camp-1.aspx"&gt;Dave Burke&lt;/a&gt;.  Dave's one of the first people I met when I started to attend the .NET user groups and I always enjoy talking with him.  Plus, when he adjusted my name tag for me it was the most action I had had all day. &lt;br /&gt;&lt;br /&gt;Soon it was time for another snack break - this time courtesy of &lt;a href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt;.  Sodas, brownies, and other tasty treats.  Noshing and networking... good times. &lt;br /&gt;&lt;br /&gt;We held the raffle during the last break.  We gathered in one of the session rooms and used a random number generator to identify the winners.  Julie also took a moment to extend a special thank you to &lt;a href="http://twitter.com/SteveAndrews"&gt;Steve Andrews&lt;/a&gt; and &lt;a href="http://twitter.com/snipeyhead"&gt;Alison Gianotto&lt;/a&gt; who were the two speakers who travelled the farthest.  After all the support our donors provided we ended up with nearly 30 prizes to give away - so we ran a little longer than expected.  The final sessions started a little late, but everyone was still going strong.  We volunteers set about cleaning up during the last session so we could get an early exit to a social gathering at the Windjammer.  Special thanks to &lt;a href="http://blogs.msdn.com/cbowen/"&gt;Chris Bowen&lt;/a&gt; and &lt;a href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt; for treating the speakers and volunteers so kindly.&lt;br /&gt;&lt;br /&gt;I could keep writing about all the &lt;a href="http://twitter.com/weierophinney"&gt;people&lt;/a&gt; I &lt;a href="http://twitter.com/suzyshush"&gt;met&lt;/a&gt; and &lt;a href="http://twitter.com/decarufe"&gt;reconnected&lt;/a&gt; with.  I might even do a post about the lessons learned that I hope to apply to the next code camp (yes, we intend to do this again).  The whole experience was exciting, maddening and gratifying.  I'll keep searching for posts, tweets and pictures tagged with &lt;span style="font-family: courier new; font-weight: bold;"&gt;VTCODECAMP&lt;/span&gt; to see what people thought.  I hope you do, too.  And join us at the next VT Code Camp!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-9118164569780654436?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/9118164569780654436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/9118164569780654436'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/09/vt-code-camp-1-summary.html' title='VT Code Camp 1: Summary'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-8240941374314204509</id><published>2009-09-11T20:23:00.004-04:00</published><updated>2009-09-11T21:40:55.870-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VtCodeCamp'/><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><title type='text'>Twas the night before code camp...</title><content type='html'>No more messing around - tomorrow is the first VT code camp.  We've got everything as done as we can at this point.  Excellent &lt;a href="http://www.vtdotnet.org/docs/codecampschedule.pdf"&gt;speakers/sessions&lt;/a&gt; lined up, a &lt;a href="http://maps.google.com/maps/ms?ie=UTF8&amp;amp;hl=en&amp;amp;t=h&amp;amp;oe=UTF8&amp;amp;msa=0&amp;amp;msid=115827286515699377431.0004731507eba61d0bc00"&gt;kickin' venue&lt;/a&gt;, a good team of volunteers and lots-o-swag.  We've got over 100 people who have registered to attend, which &lt;span style="font-style: italic;"&gt;far&lt;/span&gt; exceeds my expectations.  I think I'm probably on the record somewhere stating that for our first code camp 50-70 would be a great turn out but talk of 100 was fantasy.&lt;br /&gt;&lt;br /&gt;Looks like I was wrong.  Happily, happily wrong.&lt;br /&gt;&lt;br /&gt;Seriously, for this event to have that many people register is a huge testament to the development community in VT and the northeast in general (we've got participation from as far away as PA and NYC).&lt;br /&gt;&lt;br /&gt;I'm super pleased with the support we've received from our donors, too.  The &lt;a href="http://www.bsad.uvm.edu/home/"&gt;UVM School of Business Administration&lt;/a&gt; has opened their doors to us for the venue.  &lt;a href="http://gmcr.com/"&gt;Green Mountain Coffee Roasters&lt;/a&gt; is covering breakfast, &lt;a href="http://www.mywebgrocer.com/"&gt;MyWebGrocer&lt;/a&gt; (my employer) is buying pizza and soda for lunch and &lt;a href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt; is providing an afternoon snack.&lt;br /&gt;&lt;br /&gt;Chris Pels and the &lt;a href="http://www.thedevcommunity.org/"&gt;http://www.thedevcommunity.org/&lt;/a&gt; site helped us by managing our registration and speaker abstract submissions which was HUGE.&lt;br /&gt;&lt;br /&gt;We've a pile of swag to raffle and give away, too.  Donors are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.aspnetpro.com/"&gt;aspNetPro Magazine&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codemag.com/"&gt;CODE Magazine&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://devexpress.com/"&gt;DevExpress&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.davidyack.com/welcome/"&gt;David &amp;amp; Julie Yack&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jetbrains.com/"&gt;JetBrains&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mywebgrocer.com/"&gt;MyWebGrocer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oreilly.com/"&gt;O'Reilly Media&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pearsoned.com/professional/technical.htm"&gt;Pearson Books&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pluralsight.com/main/olt/Courses.aspx?utm_source=VermontCodeCamp&amp;amp;utm_medium=Site&amp;amp;utm_campaign=On-Demand"&gt;PluralSight&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.techsmith.com/"&gt;TechSmith&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://telerik.com/"&gt;telerik&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wrox.com/WileyCDA/"&gt;Wiley/WROX Publishing&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;It takes a lot of people to get an event like this off the ground and we have a great team.  Super big thanks go to &lt;a href="http://bradley-holt.blogspot.com/"&gt;Bradley Holt&lt;/a&gt;, &lt;a href="http://reninfosys.com/"&gt;Carl Lorentson&lt;/a&gt;, &lt;a href="http://www.thedatafarm.com/blog"&gt;Julie Lerman&lt;/a&gt;, &lt;a href="http://bluenotecomputing.com"&gt;Laura Blood&lt;/a&gt;, Margot Schips, Martin Stevanof, Matthew Weier O’Phinney and Rob Rohr who did a lot of heavy lifting to get us poised for a successful event tomorrow.&lt;br /&gt;&lt;br /&gt;I also got some wonderful advice about organizing a code camp from &lt;a href="http://blogs.msdn.com/cbowen/"&gt;Chris Bowen&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/jimoneil/"&gt;Jim O'Neil&lt;/a&gt; our regional Microsoft development evangelists and also from &lt;span class="gI"&gt;Dennis Perlot and Supriyo "&lt;/span&gt;&lt;span class="gI"&gt;SB&lt;/span&gt;&lt;span class="gI"&gt;" Chatterje&lt;/span&gt; from the &lt;a href="http://ctdotnet.org/codecamp2.aspx"&gt;CT code camp&lt;/a&gt;.  These four guys provided some good input and are all class acts.&lt;br /&gt;&lt;br /&gt;Finally, I wouldn't even be able to be involved in this kind of community development if it weren't for my wife, Sue, who will be taking care of the kids while I'm at the code camp.  So she gets a thank you, too.&lt;br /&gt;&lt;br /&gt;So that's it.  Everything is printed, the alarm is set and I'm really very, very excited to see how we do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-8240941374314204509?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8240941374314204509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8240941374314204509'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/09/twas-night-before-code-camp.html' title='Twas the night before code camp...'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-1537357326247716524</id><published>2009-09-04T15:31:00.001-04:00</published><updated>2009-09-04T21:31:46.747-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>Snippets for HTML, JavaScript and ASP.NET in VS2010? Seriously Cool!</title><content type='html'>&lt;a href="http://weblogs.asp.net/scottgu/archive/2009/09/04/asp-net-html-javascript-snippet-support-vs-2010-and-net-4-0-series.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2009/09/04/asp-net-html-javascript-snippet-support-vs-2010-and-net-4-0-series.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; Whoops... forgot to make it a link.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-1537357326247716524?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/1537357326247716524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/1537357326247716524'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/09/snippets-for-html-javascript-and-aspnet.html' title='Snippets for HTML, JavaScript and ASP.NET in VS2010? Seriously Cool!'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-5972789243964221674</id><published>2009-08-12T21:56:00.003-04:00</published><updated>2009-08-12T22:09:53.258-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>WebKit border radius and cascading styles don't always mix</title><content type='html'>Since starting the new job in January I've had to learn more about developing for the web than I ever have.  One of the fascinating (and frustrating) aspects has been the way different browsers render the same code.  The only web content I've written prior to this job was a very basic set of static pages for the &lt;a href="http://www.vtirishfestival.org/"&gt;Burlington Irish Heritage Festival&lt;/a&gt; and for an intranet web application where the company dictated which browser was to be used.  But with the new gig I'm in the real world.  That means every change I make needs to test against 4 or 5 browsers.  And that's just on my development box, once it goes into QA the application is tested against over 20 different browser and OS combinations.&lt;br /&gt;&lt;br /&gt;So I've started to familiarize myself with the various rendering engines used by the major browsers.  One of the big ones is the &lt;a href="http://en.wikipedia.org/wiki/Webkit"&gt;WebKit open source engine&lt;/a&gt;.  It serves as the rendering engine for some of the browsers I need to support; Safari on Windows and Google's Chrome.  Recently we encountered a little WebKit specific gotcha that I wouldn't have expected.  It has to do with a WebKit specific CSS attribute, &lt;span style="font-family: courier new;"&gt;-webkit-border-radius&lt;/span&gt;.  It's a wonderful attribute that when set instructs the WebKit browsers to round the corners of an element.  &lt;a href="http://www.the-art-of-web.com/css/border-radius/"&gt;This post&lt;/a&gt; has a very good summary of the &lt;span style="font-family: courier new;"&gt;-webkit-border-radius&lt;/span&gt; attribute (and it's Mozilla equivilent, &lt;span style="font-family: courier new;"&gt;-moz-border-radius&lt;/span&gt;).  The important point for this discussion is &lt;span style="font-family: courier new;"&gt;-webkit-border-radius&lt;/span&gt; is a shortcut declaration.&lt;br /&gt;&lt;br /&gt;The problem we encountered had to do with how the &lt;span style="font-family: courier new;"&gt;-webkit-border-radius&lt;/span&gt; attribute behaved when used in a cascading style.  The application on which I work has one style sheet defined for application wide default styles and then uses additional files to adjust the styles as needed.  So, for example, the application default stylesheet may define a class like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;.someRoundedThing { -webkit-border-radius: 4px; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;which will will cause a WebKit browser to round the corners of an element decorated with that class.  Another style sheet could then declares following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;.someRoundedThing { -webkit-border-radius: 8px; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If a page pulls in the application style sheet and then the alternate style sheet what &lt;span style="font-style: italic;"&gt;should&lt;/span&gt; happen is the elements on that page which are decorated with the "someRoundedThing" class should be twice as rounded (again, only in WebKit browsers) than on a page where only the application default styles are included.  But this wasn't working as expected.&lt;br /&gt;&lt;br /&gt;In order for the page defined style to work we had to declare the alternate &lt;span style="font-family: courier new;"&gt;-webkit-border-radius&lt;/span&gt; value using the more verbose, four value declaration.  Like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;.someRoundedThing { -webkit-border-radius: 8px 8px 8px 8px; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Declaring each corner's radius individually also worked:&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;.someRoundedThing { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  -webkit-border-top-left-radius: 8px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  -webkit-border-top-right-radius: 8px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  -webkit-border-top-bottom-radius: 8px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  -webkit-border-top-bottom-radius: 8px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While I'm not certain why this is going on, I assume it is related to the differences in implementation outlined in &lt;a href="http://www.css3.info/border-radius-apple-vs-mozilla/"&gt;this post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So while I like using the shortcut declarations for their terseness it appears they can lead to problems if your not careful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-5972789243964221674?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5972789243964221674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5972789243964221674'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/08/webkit-border-radius-and-cascading.html' title='WebKit border radius and cascading styles don&apos;t always mix'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-5853759846095157269</id><published>2009-07-21T12:27:00.001-04:00</published><updated>2009-07-21T12:29:02.844-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><title type='text'>Free is my favorite four letter word</title><content type='html'>Free times 40 is a really lucky number, too!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://speckyboy.com/2009/07/06/40-free-and-essential-web-design-and-development-books-from-google/"&gt;http://speckyboy.com/2009/07/06/40-free-and-essential-web-design-and-development-books-from-google/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-5853759846095157269?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5853759846095157269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5853759846095157269'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/07/free-is-my-favorite-four-letter-word.html' title='Free is my favorite four letter word'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-1863619373203269508</id><published>2009-07-15T21:56:00.003-04:00</published><updated>2009-07-15T22:13:57.876-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>Browser differences and jQuery, (oh, yes... they exist)</title><content type='html'>I've been doing more with &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; lately and I can't say how much I'm enjoying it.  The other day I was able to take an old JavaScript function that was over 20 lines long and refactor it down to 4 lines... sweet!  And one of the nice benefits of using jQuery has been not having to worry about coding to specific browser variations.  I did come across something recently, though, that is inconsistent between the browsers which I thought I would share.&lt;br /&gt;&lt;br /&gt;It has to do with the way CSS attributes are retrieved for an element.  Sometimes the &lt;a href="http://docs.jquery.com/CSS/css#name"&gt;.css()&lt;/a&gt; method will return different values for the same style definition (or no value at all) depending on the browser.  I'm probably expecting too much of jQuery in terms of it's browser agnostic implementation - but I was honestly surprised.  Consider the following HTML page:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;    .ugly&lt;br /&gt;    {&lt;br /&gt;      background-color: #3A9F0E;&lt;br /&gt;      border: solid 1px #FFD800;&lt;br /&gt;      color: #fff;&lt;br /&gt;      -moz-border-radius: 10px;&lt;br /&gt;      blur: 1;&lt;br /&gt;    }&lt;br /&gt;  &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;  &amp;lt;h1 class="ugly"&amp;gt;test&amp;lt;/h1&amp;gt;&lt;br /&gt;  &amp;lt;div id="dvDisplay" /&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A very basic but easy to grasp example. Ugly, but easy to grasp.  There is a H1 tag which has the "ugly" class applied.  The ugly class has some style definitions (some valid/some not... more on that shortly).  There's an empty DIV tag, too.  We're going to use that - just watch.&lt;br /&gt;&lt;br /&gt;Now let's add a little JavaScript to illustrate my jQuery concerns.  It's going in the head section and looks like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;script src="js/jquery-1.3.2.min.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;  $(function() {&lt;br /&gt;    var message = "";&lt;br /&gt;    var property = ["border-color",&lt;br /&gt;      "border-bottom-color",&lt;br /&gt;      "-moz-border-radius",&lt;br /&gt;      "-moz-border-radius-bottomleft",&lt;br /&gt;      "background-color",&lt;br /&gt;      "font-weight",&lt;br /&gt;      "blur"];&lt;br /&gt;    property.sort();&lt;br /&gt;&lt;br /&gt;    for (var i = 0; i &amp;lt; property.length; i++) {&lt;br /&gt;      message += property[i];&lt;br /&gt;      message += " = '";&lt;br /&gt;      message += $(".ugly").css(property[i]);&lt;br /&gt;      message += "' &amp;lt;br /&amp;gt;";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    $("#dvDisplay").html(message);&lt;br /&gt;  });&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The script is going to run when document.ready event fires, build an array of some CSS properties, sort them (because I'm too lazy to put them in the right order) and then loop over those properties to see how the jQuery .css method returns them. Note that the first and second pair of properties (border-color | border-bottom-color and -moz-border-radius | -moz-border-radius-bottomleft) are going after similar values - it's just one is more specific.  Note, also, how the style declarations for the ugly class define each of these.  Anyway, each property is appended to the output message which is then displayed in that DIV we left open (see, I told you we would use it).&lt;br /&gt;&lt;br /&gt;So what does the output look like?  Well, despite the browser agnostic behavior of jQuery it depends which browser you're in.  Here are the results I saw (all browsers running on XP professional):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Firefox (3.0.11)&lt;/span&gt;&lt;br /&gt;-moz-border-radius = ''&lt;br /&gt;-moz-border-radius-bottomleft = '10px'&lt;br /&gt;background-color = 'rgb(58, 159, 14)'&lt;br /&gt;blur = ''&lt;br /&gt;border-bottom-color = 'rgb(255, 216, 0)'&lt;br /&gt;border-color = ''&lt;br /&gt;font-weight = 'bold'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Internet Explorer 8&lt;/span&gt; &lt;span style="font-size:85%;"&gt;(both browser modes and all document modes)&lt;/span&gt;&lt;br /&gt;-moz-border-radius = '10px'&lt;br /&gt;-moz-border-radius-bottomleft = 'undefined'&lt;br /&gt;background-color = '#3a9f0e'&lt;br /&gt;blur = '1'&lt;br /&gt;border-bottom-color = '#ffd800'&lt;br /&gt;border-color = '#ffd800'&lt;br /&gt;font-weight = '700'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Google Chrome (2.0.172.33)&lt;/span&gt;&lt;br /&gt;-moz-border-radius = 'null'&lt;br /&gt;-moz-border-radius-bottomleft = 'null'&lt;br /&gt;background-color = 'rgb(58, 159, 14)'&lt;br /&gt;blur = 'null'&lt;br /&gt;border-bottom-color = 'rgb(255, 216, 0)'&lt;br /&gt;border-color = ''&lt;br /&gt;font-weight = 'bold'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Safari (3.2.2)&lt;/span&gt;&lt;br /&gt;-moz-border-radius = 'null'&lt;br /&gt;-moz-border-radius-bottomleft = 'null'&lt;br /&gt;background-color = 'rgb(58, 159, 14)'&lt;br /&gt;blur = 'null'&lt;br /&gt;border-bottom-color = 'rgb(255, 216, 0)'&lt;br /&gt;border-color = ''&lt;br /&gt;font-weight = 'bold'&lt;br /&gt;&lt;br /&gt;So, where are the differences?  What strikes me is that even though the -moz-border-radius property is a Mozilla specific style, the output in Firefox is an empty string.  Only the specific corner (-moz-border-radius-bottomleft) has the value now.  I can only assume the style definition I'm using is a shortcut like the border definition.  That would explain why Firefox, Chrome and Safari all return an empty string when checking border-color but can return border-bottom-color.  IE will give me either.&lt;br /&gt;&lt;br /&gt;The other interesting thing is that while IE8 doesn't know squat about the -moz-border-radius property can tell me what I wanted the value to be (but unsurprisingly, can't provide the specific corner value).  So IE8 seems to be able to access the style declarations even if it doesn't do anything with them.  This brings me to the declaration of the blur property.  I wanted to know if it was possible to use CSS styles to store values to be retrieved later by jQuery to be applied to a drop shadow effect (rather than hard coding in the script).  And it appears that this approach would work with IE8 but not the others.  Which is how I identified the different behaviors of the browsers in jQuery. &lt;br /&gt;&lt;br /&gt;So time for one last assumption: I really believe jQuery is doing its best to get the style attributes but the browsers must be preventing it from doing that.  This does not dimish my appreciation of jQuery, but makes me recognize different browsers continue to plague web development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-1863619373203269508?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/1863619373203269508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/1863619373203269508'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/07/browser-differences-and-jquery-oh-yes.html' title='Browser differences and jQuery, (oh, yes... they exist)'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-2360446229549806079</id><published>2009-07-09T20:59:00.002-04:00</published><updated>2009-07-09T21:05:20.219-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VtCodeCamp'/><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>VT Code Camp - Call for Speakers and Registration: Now Open!</title><content type='html'>The first VT code camp is going to be Sept. 12 at the UVM school of Business Administration.  We've just opened up the web site for registration and call for speakers.  Get started at &lt;a href="http://www.vtdotnet.org/codecamp/"&gt;http://www.vtdotnet.org/codecamp/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can follow the VT code camp on Twitter using #vtcodecamp&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-2360446229549806079?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/2360446229549806079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/2360446229549806079'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/07/vt-code-camp-call-for-speakers-and.html' title='VT Code Camp - Call for Speakers and Registration: Now Open!'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-7201304834710429939</id><published>2009-06-24T22:06:00.003-04:00</published><updated>2009-06-24T22:19:34.092-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VtCodeCamp'/><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><title type='text'>CT Code Camp Recap</title><content type='html'>I attended the &lt;a title="second CT code camp" href="http://ctdotnet.org/codecamp2.aspx" id="gw4b"&gt;second CT code camp&lt;/a&gt; on June 13th at the &lt;a title="New Horizon's" href="http://www.nhhartford.com/" id="ijsh"&gt;New Horizon's&lt;/a&gt; center in Hartfort, CT.  Ostensibly it was a research trip for the code camp we're organizing for VT this fall, Sept. 12.  However, I love going to code camps because of the educational value and networking opportunities they present.  As I've previously posted, I've been to a few of the code camps held in Waltham, MA - so I was excited to have a slightly different experience.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;The venue for this code camp was a well appointed learning center with plenty of rooms of varying capacity.  Each room had projectors, lots of tables and chairs.  At the Waltham camp most of the seating lacks a table, so it was nice to have a place to put my notebook (rather than balancing it on my knee).  One thing I noticed by its absence was the wide hallway at the Waltham location.  The hallways at the New Horizon center seemed more narrow.  Maybe it was just the 150 or so people moving through them, though.&lt;br /&gt;&lt;br /&gt;I encountered the registration area as soon as I entered the building.  It was nice to see Dennis Perlot's smiling face at the desk.  I met Dennis at the New England User Group Leadership Summit in May.  He and S.B. Chatterje run the CT .NET user group and this code camp.  The registration packet included the session schedule, list of donors and a copy of Windows 7 Release Candidate.&lt;br /&gt;&lt;br /&gt;The entire event was extremely well run.  My only quibble was the lunchtime activities, focused on job fair like sessions such as resume writing and networking skills, went on longer than I would have liked.  I'm sure this is a result of my being comfortable with those topics - I just would have preferred to have at least one technical session going on concurrently.  But as I say, that's a quibble.  The entire experience was well worth the trip and I hope to make additional CT code camps.&lt;br /&gt;&lt;br /&gt;I've created separate posts for 3 of the 4 sessions I attended.  I'm not bothering to post about the 4th session because I had to leave early and my notes aren't complete.  My session specific posts are:&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;h3 style="font-weight: normal; font-family: times new roman;"&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://bigpigvt.blogspot.com/2009/06/ct-code-camp-recap-part-1.html"&gt;.NET Troubleshooting in a Production Environment - Polina Cherkasova&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;span style="font-family: times new roman;font-size:100%;" &gt;&lt;a href="http://bigpigvt.blogspot.com/2009/06/ct-code-camp-recap-part-2.html"&gt;&lt;span class="SubHead"&gt;jQuery – Why You Want It &amp;amp; How to Use it in ASP.NET &lt;/span&gt;- Dave Bush&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: times new roman;font-size:100%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;h3 style="font-weight: normal; font-family: times new roman;"&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://bigpigvt.blogspot.com/2009/06/ct-code-camp-recap-part-3.html"&gt;&lt;span class="SubHead"&gt;Scrum 3 Roles, 3 Ceremonies, 3 Artifacts, 3 Best Practices - Dan Mezick&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-7201304834710429939?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/7201304834710429939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/7201304834710429939'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/06/ct-code-camp-recap.html' title='CT Code Camp Recap'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-5635145610128253352</id><published>2009-06-24T22:05:00.001-04:00</published><updated>2009-06-24T22:13:32.774-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>CT Code Camp Recap: Part 1</title><content type='html'>&lt;h3&gt;.NET Troubleshooting in a Production Environment - Polina Cherkasova&lt;/h3&gt;This session was a review of different strategies for identifying problems that are discovered after software has been deployed to the production environment.  Polina categorized the severity of issues from unexpected behaviors (e.g. code working as designed but not as the user believes it should) through complete application failure (i.e. smoking crater where the server used to be).&lt;br /&gt;&lt;br /&gt;One of the strategies to diagnose a problem was to have the production environment run in debug mode.  However, this approach results in an application that is not identical to the production build and can skew the results.  Besides, the problem may not be something which can be reproduced at will.&lt;br /&gt;&lt;br /&gt;Polina spent a fair amount of time advocating for using an on-the-fly debugger.  The debugger she was using was AVIcode ART (&lt;a title="www.art4dotnet.com" href="http://www.art4dotnet.com/" id="t75c"&gt;www.art4dotnet.com&lt;/a&gt;).  It was about 3/4 of the way through the presentation before I realized Polina worked for AVIcode.  So her advocacy made sense in that light.  Her demo was compelling, though.  I liked the fact you just configure the application to monitor the application (without having to code additional instrumentation into the application) and it can report on a variety of conditions with varying thresholds of sensitivity.&lt;br /&gt;&lt;br /&gt;Another strategy is using application logs using tools such as log4net, Entity Library, Event Log, nLog, etc.  This approach allows for information to be retrieved at run time but requires development effort and usually only deals with handled exceptions.  Missing from her analysis was coding robust event logging into the application.  Doing this will provide the person diagnosing a problem with additional information for identifying what lead to the problem being researched.  However, like error logs, this requires development effort and getting the signal to noise ratio right can be a challenge (so only events which are truly helpful are captured).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-5635145610128253352?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5635145610128253352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5635145610128253352'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/06/ct-code-camp-recap-part-1.html' title='CT Code Camp Recap: Part 1'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-8025355494040669292</id><published>2009-06-24T22:03:00.002-04:00</published><updated>2009-06-24T22:13:09.247-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>CT Code Camp Recap: Part 2</title><content type='html'>&lt;h3&gt;&lt;span class="SubHead"&gt;jQuery – Why You Want It &amp;amp; How to Use it in ASP.NET &lt;/span&gt;- Dave Bush&lt;/h3&gt;With the release we're currently developing at work we've been using jQuery more and more.  Put me down in the fan column.  I really, really like it - but I'm still a newbie to it in so many ways.  So when I saw there was going to be two sessions about using it I figured attending one would be a good idea.  I'm glad I made Dave's talk.  It was chock full of demos.  I'll admit that even being a relative newbie it took a few samples before we got to examples I hadn't seen, though.&lt;br /&gt;&lt;br /&gt;The best parts were some of the best practices he provided.  For example, Dave suggested linking to the jQuery library hosted on Google's servers rather than serving it up on our own machines.  Many sites do this and it leverages the browser's caching to improve performance.&lt;br /&gt;&lt;br /&gt;An interesting point Dave made was to point out there is a difference between jQuery's document.ready event and the document.onLoad event.  The document.ready fires as soon as the page is parsed enough where all JavaScript can be executed while the document.onLoad fires when the page is done rendering.  Knowing the difference between the two can be instructive when trying to decide which event should be referenced when code needs to run.&lt;br /&gt;&lt;br /&gt;Dave suggested making sure we apply VS2008 SP2 so we can have Intellisense when coding jQuery statements.  Step by step instructions on how to do this are available on Scott Guthrie's blog &lt;a title="here" href="http://weblogs.asp.net/scottgu/archive/2008/11/21/jquery-intellisense-in-vs-2008.aspx" id="u8lm"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Another revelation, and one which I will surely be sharing with my peers at work, was a throw away line Dave had talking about a JavaScript library that forces IE6 to behave like IE7.  I wrote that down with the intention to research it because of our requirement for continued support of IE6.  Anyway, a quick Google search resulted in &lt;a title="this blog post" href="http://divitodesign.com/css/let-ie6-behave-like-ie7/" id="oa94"&gt;this blog post&lt;/a&gt; talking about the IE7.js library.  It's still just a lead at this point... but I intend to follow up on this soon.&lt;br /&gt;&lt;br /&gt;Dave's blog is &lt;a title="http://blog.dmbcllc.com" href="http://blog.dmbcllc.com/" id="lh85"&gt;http://blog.dmbcllc.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-8025355494040669292?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8025355494040669292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8025355494040669292'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/06/ct-code-camp-recap-part-2.html' title='CT Code Camp Recap: Part 2'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-6953555652491177605</id><published>2009-06-24T21:57:00.003-04:00</published><updated>2009-06-24T22:12:52.135-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><title type='text'>CT Code Camp Recap: Part 3</title><content type='html'>&lt;h3&gt;&lt;span class="SubHead"&gt;Scrum 3 Roles, 3 Ceremonies, 3 Artifacts, 3 Best Practices - Dan Mezick&lt;/span&gt;&lt;/h3&gt;&lt;span class="SubHead"&gt;I'm not sure how to write this session up.  This was by far the most compelling session I attended.  Dan is a dynamic speaker, his points are sound and I found the approach to development he described very appealing.  There was so much content presented during the session I'm not sure any blog post I can write could do it justice.&lt;br /&gt;&lt;br /&gt;The session was an overview of Agile and Scrum.  I've never worked in a development group that embraced&lt;/span&gt; the agile approach.  Many of the teams I've been on have conducted what they called "Scrum" meetings, but those meetings didn't match what Dan was describing - let alone the process that was supposed to accompany it!&lt;br /&gt;&lt;br /&gt;What was fascinating about Dan's presentation was it was more about team dynamics and interpersonal relationships than it was about the development process exactly.  The same techniques being described could apply to any team trying to complete a number of tasks in support of an end goal.  The whole process being described was very empirical in how the project's progress is being tracked.  One example of this is to hold off making a decision until the "last responsible moment."  I LOVE this concept.  The idea is that as more information comes in we can make a more informed decision.  If a decision is made early on it is human nature to not reverse that decision - even in the face of additional evidence.  By delaying the decision to the last responsible moment we're increasing the odds that the decision being made is as fully informed as possible.  I'm hoping to adopt this in my daily work as application designs are considered.&lt;br /&gt;&lt;br /&gt;Another example of having a project managed by evidence had to do with project schedules.  The idea of backing into a release date, for example, appears to be completely abhorrent in this system.  By identifying the release date early the team exposes itself to "&lt;a title="inattentional blindness" href="http://en.wikipedia.org/wiki/Inattentional_blindness" id="rw.1"&gt;inattentional blindness&lt;/a&gt;" which is a phenomenon where people don't see something that's there because they are paying a lot more attention to something else.  In the case of the release date, the team becomes so focused on the scheduled release date they are unable to perceive changes or events that had they been perceived would lead to a change in the release (either schedule or scope).&lt;br /&gt;&lt;h4&gt;The 3 Roles&lt;/h4&gt;Dan described an appropriately organized team as consisting of 3 roles: the product owner, the Scrum master and the team.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The product owner is the individual responsible for collecting and elaborating the project requirements and putting them into the product backlog (see the 3 artifacts).  This individual is the interface with all the stakeholders who are interested in the resulting product (e.g. management, sales, marketing, users, etc.).  &lt;/li&gt;&lt;li&gt;The Scrum master is the individual (and it is an individual - one person, singular) responsible for product backlog - they own and prioritize it.  The Scrum master is not a traditional project manager.  Their job is to "patrol" the product boundery to ensure no requests are coming into the product backlog that are not appropriate for that product.  By having this be an individual the product backlog prioritization is not subject to the conflicting whims of multiple individuals&lt;/li&gt;&lt;li&gt;The team is self-organized.  The team participates in the product design.  They decide on a subset of the product backlog that will be addressed in a particular sprint.  A good rule of thumb is to have +/- 5 to 7 people on a team.  No one who is allocated less than 50% to the project is considered a team member.  "Committed people" are &gt;= 50% allocated, everyone else is merely involved.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;The 3 Ceremonies&lt;/h4&gt;The process Dan described is punctuated by a few types of meetings (there are always meetings, right?); Sprint planning meetings, daily Scrum meetings and project retrospective meetings.&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Once the Product Owner has put all the requirements, requests, bugs into the product backlog and after the Scrum master has prioritized the backlog it's time for the team to meet.  The purpose of the meeting is to decide what can be accomplished in the next development period.  These development periods are 2 - 6 weeks long and are called "Sprints".  In the sprint planning meeting the team identifies which sub-set of the product backlog can be accomplished in the sprint.  The team must pick off the top of the product backlog (ensuring priority work is being done) but they decide how many of the items realistically can be completed.  Other stakeholders can attend the sprint planning, but it's the team's meeting.  Also, remember before I mentioned the team is self-organized?  This is part of what that means.  It's worth noting that by making the decision about what to work on this way, the team is delaying decision until the last responsible moment.  The product backlog is as mature as it can be, so the team is committing to the truest priorities possible.&lt;/li&gt;&lt;li&gt;Once the sprint is underway it's important for the team to meet daily to provide an update on progress.  This is the daily Scrum meeting.  Each team member reports what they accomplished the prior day, what they intend to accomplish that day and what (if any) obstacles are in the way.  The reason the meeting is daily is to prevent "cognative dissipation." The idea is if I say I'm going to do feature 1 today, and nothing is in my way, the team is going to notice if feature 1 isn't finished (or at least had progress) tomorrow.  If the scrum were held weekly, well, who remembers what they worked on a week ago let alone what commitments a peer made?  Having the ongoing, consistent knowledge might prompt one of my teammates to find out what problems I might be having.  Again, this is the team's meeting.  Other stakeholders can attend - but they better stay out of the way...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Once the project is complete it's time to reflect on what worked well, and what needed improvement.  That's the project retrospective meeting.  These meetings might expose some hurt feelings and raw emotions. On a mature team these can be worked out.  The goal is to improve the process for everyone so the team, product owner and scrum master can do better the next time around.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;The 3 Artifacts&lt;/h4&gt;&lt;/div&gt;&lt;div&gt;There are three documents&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;By now you probably have a good idea of what the product backlog is; it's a prioritized list of each feature, enhancement request and bug that is to be incorporated into the product.  Normally the list is dynamic.  Requests are made, bugs reported and the product owner adds all that to the product backlog.  The Scum master prioritizes the product backlog and the team provides estimates on level of effort for each item on the product backlog.  However, once the sprint is underway the product backlog is static (at least as far as priority goes).  If requests/bugs come in they can be added to the bottom of the stack, but &lt;u&gt;nothing&lt;/u&gt; gets prioritized to the top.  That's because while the sprint is underway the team is working off the sprint backlog.&lt;/li&gt;&lt;li&gt;The sprint backlog is the result of the sprint planning meeting.  It's a mini-product backlog of what the team will be delivering in the sprint.  Because this is what the team has committed to deliver, and that commitment was made at the last responsible moment, it is unacceptable to change the priorities of the sprint once it has begun.  That's why the product backlog is static during a sprint.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A burn-down chart is a graph that shows work to be done on one axis and time remaining on the other.  Dan showed some examples. &lt;a title="Google can help you find examples" href="http://images.google.com/images?hl=en&amp;amp;sa=1&amp;amp;q=%22burn+down+chart%22" id="woii"&gt;Google can help you find examples&lt;/a&gt;, too.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;The 3 Best Practices&lt;/h4&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, by the time we got to talking about the best practices, Dan was out of time.  He threw up a few slides and pictures to communicate the ideas, but I'm just going to provide some links which will cover the topic more completely.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="User Stories" href="http://www.agilemodeling.com/artifacts/userStory.htm" id="hvt5"&gt;User Stories&lt;/a&gt; are a way to capture user requirements.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Planning Poker" href="http://www.agile-software-development.com/2009/03/planning-poker-agile-estimating.html" id="hizn"&gt;Planning Poker&lt;/a&gt; is a technique teams can use to provide estimated levels of effort for items on the product backlog.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Scrum Board (a.k.a. &lt;a title="task board" href="http://www.mountaingoatsoftware.com/task-boards" id="nl6y"&gt;task board&lt;/a&gt;) is a tool used to reinforce the work being done.  This is the only thing I've been able to implement in the immediate aftermath of the code camp.  My whiteboard has been converted to track the tasks on which I'm currently working.  One of of my teammates likes it, too, and has started using one.  I expect we'll use one for our team in short order.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt; &lt;h4&gt;Final Thoughts...&lt;/h4&gt; Dan's blog is at &lt;a title="http://www.newtechusa.com/agile/blog/" href="http://www.newtechusa.com/agile/blog/" id="v6:5"&gt;http://www.newtechusa.com/agile/blog/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-6953555652491177605?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/6953555652491177605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/6953555652491177605'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/06/ct-code-camp-recap-part-3.html' title='CT Code Camp Recap: Part 3'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-8658793092921467292</id><published>2009-06-10T09:56:00.002-04:00</published><updated>2009-06-10T09:59:09.947-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>An Excellent Post About JQuery Selectors and ASP.NET</title><content type='html'>I had to share &lt;a href="http://encosia.com/2009/06/09/11-keystrokes-that-made-my-jquery-selector-run-10x-faster/"&gt;this blog post&lt;/a&gt; by Dave Ward about optimizing performance when trying to get jQuery to select the correct element as you work with ASP.NET.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-8658793092921467292?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8658793092921467292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8658793092921467292'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/06/excellent-post-about-jquery-selectors.html' title='An Excellent Post About JQuery Selectors and ASP.NET'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-5522877943365516322</id><published>2009-06-09T15:27:00.002-04:00</published><updated>2009-06-09T15:31:40.788-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VtCodeCamp'/><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>I'm So Excited (and I just can't hide it)</title><content type='html'>I'm one of a handful of people trying to launch a code camp in the Burlington, VT area.  We just received confirmation on the venue and can now start asking people to hold the date.  It's going to be on Saturday, Sept. 12, at the UVM Business School.&lt;br /&gt;&lt;br /&gt;There's still a lot of work to make it happen but I can't tell you how thrilled I am that we have a venue and date.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-5522877943365516322?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5522877943365516322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5522877943365516322'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/06/im-so-excited-and-i-just-cant-hide-it.html' title='I&apos;m So Excited (and I just can&apos;t hide it)'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-3398246906403970194</id><published>2009-06-09T09:24:00.006-04:00</published><updated>2009-06-10T09:56:50.122-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>Small reminder for JavaScript development</title><content type='html'>Sometimes we need reminders about the basics.  In reviewing some JavaScript code this morning I came across a function that builds some html on the fly by concatenating values together.  What people have to remember is the smaller the JS file is the faster it will download.  So rather than doing this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;scratch = scratch + "&amp;lt;a href....";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;you need to use the built in += operator, thusly:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;scratch += "&amp;lt;a href....";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The function in question had the first approach 12 times.  Using the built in += operator I was able to reduce each statement by 9 characters.  That reduces the function by 108 characters overall.&lt;br /&gt;&lt;br /&gt;So the lesson is use built in functionality because little things can add up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-3398246906403970194?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/3398246906403970194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/3398246906403970194'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/06/small-reminder-for-javascript.html' title='Small reminder for JavaScript development'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-8609273358214655806</id><published>2009-05-06T21:49:00.003-04:00</published><updated>2009-05-06T22:25:22.087-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Notes from the New England User Group Leadership Summit</title><content type='html'>This past Saturday I had the opportunity to attend the 2009 New England User Group Leadership Summit.  Hosted by Microsoft and O'Reilly Media it was an event dedicated to helping user group leaders connect, share ideas and experiences.  It had &lt;span style="font-style: italic;"&gt;nothing&lt;/span&gt; to do with the technologies these folks are usually discussing.  Rather, we spent time talking about how to build community, publicize events, manage event logistics and things of that nature.  Attendees came from all over the northeast - primarily New England but there were also folks from Pennsylvania and New York (which is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; part of New England for you folks who don't know better). &lt;br /&gt;&lt;br /&gt;The summit was held at the Microsoft New England Research and Development Center (a.k.a. the N.E.R.D. center) in Cambridge, MA.  This was a really groovy facility with excellent meeting spaces.&lt;br /&gt;&lt;br /&gt;A wiki was set up for all the session notes, available at &lt;a href="http://neugsummit2009.pbworks.com/FrontPage/"&gt;http://neugsummit2009.pbworks.com/FrontPage/&lt;/a&gt; Take a look.  Even if you're not involved in a technical user group many of the topics relate to any community group.  I was commenting to Chris Bowen that one reason I was really happy to have attended was in addition to what I learned which I will be able to apply to my involvement in the &lt;a href="http://www.vtdotnet.org/"&gt;VT.NET user group&lt;/a&gt; much of what we discussed applies to my other community involvement, the &lt;a href="http://www.vtirishfestival.org/"&gt;Burlington Irish Heritage Festival&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;One of the attendees, Rachel Ford James, took lots of photos and has made them &lt;a href="http://www.flickr.com/photos/rachelfordjames/sets/72157617620054298/"&gt;available on Flickr&lt;/a&gt;.  She really took some stunning photos that captured the spirit of the day.  As you view the photos you may wonder why there are a number of shots with mixers that appear to be smoking.  There was a break between sessions which was conducted as a team building exercise where groups of attendees selected ingredients for an impromtu ice cream flavor.  The ice cream was made using mixers and liquid nitrogen.  It was great entertainment with lots of noise, visuals and (of course) taste.  Being from the land of Ben &amp;amp; Jerry's, though, I was terribly jaded about the results.&lt;br /&gt;&lt;br /&gt;Many thanks to O'Reilly and Microsoft for hosting this event.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-8609273358214655806?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8609273358214655806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8609273358214655806'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/05/notes-from-new-england-user-group.html' title='Notes from the New England User Group Leadership Summit'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-7612369643721806885</id><published>2009-04-29T11:31:00.003-04:00</published><updated>2009-04-29T12:00:58.280-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>I don't know what it's called, but I like it</title><content type='html'>I've recently started using JetBrains' Resharper.  Today I was reviewing the code inspection rules and came across a few that had to do with using an operator with which I was unfamiliar.  So I took a moment to learn about the &lt;span style="font-family: courier new; font-weight: bold;"&gt;??&lt;/span&gt; operator &lt;span style="font-size:85%;"&gt;(&lt;a href="http://msdn.microsoft.com/en-us/library/ms173224%28VS.80%29.aspx"&gt;link&lt;/a&gt;)&lt;/span&gt; which must have come out with the .NET 2.0 framework because it has to do with nullable types. &lt;br /&gt;&lt;br /&gt;What it does is kind of like the old IsNull method from VB (you remember VB don't you?).  Here's an example in two lines:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;int&lt;/span&gt;? x = &lt;span style="color: rgb(51, 51, 255);"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;int&lt;/span&gt; y = (&lt;span style="color: rgb(51, 51, 255);"&gt;null&lt;/span&gt; != x) ? x : -1;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first line declares a nullable int variable named &lt;span style="font-family: courier new;"&gt;x&lt;/span&gt; which is assigned null.&lt;br /&gt;The second line declares a non-nullable int variable named y.  Because it's not nullable we've got to ensure a null value isn't being assigned (otherwise we'll raise an exception).  To do this we're using the ternary operator.  What the ?? operator does is allow us to write the second line like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;int&lt;/span&gt; y = x ?? -1;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So if &lt;span style="font-family: courier new;"&gt;x&lt;/span&gt; is null y is set to -1.  Nice, right?  Especially if you replace x and y with more meaningful variable names, such as this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;int&lt;/span&gt;? someMeaningfulName = &lt;span style="color: rgb(51, 51, 255);"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;int &lt;/span&gt;whatYouReallyWant = someMeaningfulName ?? -1;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or, more common in my current job, getting values from a web form or querystring:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;int &lt;/span&gt;desiredFormId = 0;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;if&lt;/span&gt; (null != Request.Form[&lt;span style="color: rgb(153, 0, 0);"&gt;"Activate_FormId"&lt;/span&gt;]) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  &lt;/span&gt;&lt;span style="font-family: courier new;"&gt;desiredFormId = &lt;/span&gt;&lt;span style="font-family: courier new;"&gt;Request.Form[&lt;span style="color: rgb(153, 0, 0);"&gt;"Activate_FormId"&lt;/span&gt;];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;can become:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;int &lt;/span&gt;desiredFormId = Request.Form[&lt;span style="color: rgb(153, 0, 0);"&gt;"Activate_FormId"&lt;/span&gt;] ?? 0;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now if I could just figure out how to pronouce this operator I can &lt;span style="font-style: italic;"&gt;tell&lt;/span&gt; people about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-7612369643721806885?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/7612369643721806885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/7612369643721806885'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/04/i-dont-know-what-its-called-but-i-like.html' title='I don&apos;t know what it&apos;s called, but I like it'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-7888766436043542299</id><published>2009-04-27T09:09:00.005-04:00</published><updated>2009-04-27T09:39:05.983-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NAnt'/><title type='text'>Mitigating web.config security vulnerabilities through scripting</title><content type='html'>After reading this post, &lt;a href="http://dotnetkeeda.blogspot.com/2009/04/application-security-vulnerabilities-in.html"&gt;.Net and Business Intelligence: Application Security Vulnerabilities in Web.config File&lt;/a&gt;, what occurred to me was all this could be mitigated by employing a strategy I refer to as composition scripting.&lt;br /&gt;&lt;br /&gt;While I've done a bit with build automation I've also created NAnt scripts that I refer to as composition scripts.  The purpose of a composition script is to automate all the tasks required to prepare an application for deployment.  I've used them to create ClickOnce deployments, but for web applications a composition script generally grabs all the pages and binaries needed.  But in addition to that, and this is the relevant bit, I make use of the &lt;a href="http://nant.sourceforge.net/release/latest/help/tasks/xmlpeek.html"&gt;XmlPeek&lt;/a&gt; and &lt;a href="http://nant.sourceforge.net/release/latest/help/tasks/xmlpoke.html"&gt;XmlPoke&lt;/a&gt; tasks to swap out web.config tags to use configuration values appropriate for the environment being composed.&lt;br /&gt;&lt;br /&gt;You see, my script accepts a parameter called Target.Environment.  The acceptable values for that parameter are QA, UAT, PROD - quality assurance, user acceptance testing and production, respectively.  (Where's development, you may ask?  Well, that's the default state of the web.config in the source code repository).  Along side the web.config I have a few files named web.config.qa, web.config.uat and web.config.prod.  These are not repeats of the entire web.config file, though, but rather are the configuration values that need to change from environment to environment. These are the values swapped into the config using XmlPeek and XmlPoke.&lt;br /&gt;&lt;br /&gt;Note: I believe a composition script should &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; recompile the application.  It should compose the application deployment using the same pages and binaries as the application progresses from QA testing to UA testing and into production.  This ensures the application being deployed is the same application which underwent testing.&lt;br /&gt;&lt;br /&gt;So using composition scripts it's easy to mitigate the 10 security risks identified in &lt;a href="http://dotnetkeeda.blogspot.com/2009/04/application-security-vulnerabilities-in.html"&gt;the article&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-7888766436043542299?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/7888766436043542299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/7888766436043542299'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/04/mitigating-webconfig-security.html' title='Mitigating web.config security vulnerabilities through scripting'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-4546720900751753034</id><published>2009-04-14T10:22:00.002-04:00</published><updated>2009-04-14T10:29:43.977-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Note to self... always read the instructions</title><content type='html'>I'm in the process of setting up a build machine at work.  I firmly believe any shop doing production code with multiple developers needs to have both a source code repository (I like Subversion) and a build machine (sometimes called an integration server).  I'm setting our build machine up to use CruiseControl.NET for our integration server.  I used it at my last place, it's free and I like it.  Since I'm the one doing the set up I get to decide.&lt;br /&gt;&lt;br /&gt;It's good to be the king.&lt;br /&gt;&lt;br /&gt;Anyway, I didn't install the OS, framework and all that on this box so was getting frustrated that I couldn't get the CC.NET web dashboard working.  Turns out if I only read the &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/FAQ#FAQ-Dashboard"&gt;FAQ&lt;/a&gt; I would have seen the first item talks about what to do if IIS gets installed after the .NET framework.  Running the &lt;span style="font-family: courier new; font-weight: bold;"&gt;aspnet_regiis.exe&lt;/span&gt; as that document suggests fixed my problem.  That's an hour or so of my life I would like back.&lt;br /&gt;&lt;br /&gt;RTFM, indeed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-4546720900751753034?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/4546720900751753034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/4546720900751753034'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/04/note-to-self-always-read-instructions.html' title='Note to self... always read the instructions'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-2616693749586076293</id><published>2009-03-24T20:18:00.003-04:00</published><updated>2009-03-24T20:56:15.813-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Ada Lovelace Day: Julie Lerman</title><content type='html'>Apparently today is Ada Lovelace Day &lt;span style="font-size:85%;"&gt;(more information &lt;a href="http://findingada.com/who-was-ada/"&gt;here&lt;/a&gt;)&lt;/span&gt;.  It's an opportunity for bloggers to write about women in technology who have inspired us.  That makes this the perfect time to write a few sentences about one of the programmers who has been an inspiration and friend for around 5 years now - &lt;a href="http://www.thedatafarm.com/blog/default.aspx"&gt;Julie Lerman&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I originally met Julie because she runs our local .NET user group.  She works tirelessly for this group.  She ensures the meetings are scheduled, maintains the &lt;a href="http://www.vtdotnet.org/"&gt;web site&lt;/a&gt;, arranges for speakers, getting little gifts for them and presents her own topics when speakers are hard to come by.&lt;br /&gt;&lt;br /&gt;Her technical skills, energy and humor are wonderful.  But that's not why I wanted to write about her on this day.&lt;br /&gt;&lt;br /&gt;It is Julie's dedication to community which is inspiring.  She continually works to foster a real sense of community among the people who attend the user group.  There's the usual call for people to raise their hands if they are looking for work or looking to hire (what I call the "Love Connection" portion of the meeting).  She encourages people to get up and do their own presentations - both at our meetings but also at regional code camps (we don't have a local one... &lt;span style="font-style: italic;"&gt;yet&lt;/span&gt;).  At our last meeting she took a moment to lead a discussion to brainstorm how we as members of the same community (professional and regional) might support one another in this period of economic uncertainty.  Julie is sure to introduce you to people "you've got to meet."&lt;br /&gt;&lt;br /&gt;Julie's dedication to community transcends our small state, by the way.  She travels the world speaking at conferences and user groups.  She participates on "women in technology" panels (perhaps inspiring an upcoming Ada Lovelace). She &lt;a href="http://www.thedatafarm.com/blog/default.aspx"&gt;blogs&lt;/a&gt; and has &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://www.amazon.com/Programming-Entity-Framework-Julia-Lerman/dp/059652028X"&gt;written a book&lt;/a&gt;.  Julie is one of those people that wants to see others succeed and will do &lt;span style="font-style: italic;"&gt;a lot&lt;/span&gt; to try and help.&lt;br /&gt;&lt;br /&gt;She's a true leader and an inspiration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-2616693749586076293?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/2616693749586076293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/2616693749586076293'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/03/ada-lovelace-day-julie-lerman.html' title='Ada Lovelace Day: Julie Lerman'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-213769853719880244</id><published>2009-03-11T08:40:00.005-04:00</published><updated>2009-03-11T09:32:32.655-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Debugging tips from the MSDN Roadshow</title><content type='html'>Yesterday I attended the VT leg of the &lt;a href="http://blogs.msdn.com/cbowen/archive/2009/02/16/the-march-2009-northeast-roadshow.aspx"&gt;MSDN Roadshow&lt;/a&gt;.  While I was unable to stay for all the presentations I picked up some good tips during &lt;a href="http://blogs.msdn.com/jimoneil/"&gt;Jim O'Neil&lt;/a&gt;'s overview of debugging with Visual Studio 2008 (with a preview of VS2010 debugging).  As is my habit, I'm putting my notes from the session here so I don't lose them and so others might benefit from them.&lt;br /&gt;&lt;br /&gt;But if you write bug free code you can stop reading here.&lt;br /&gt;&lt;br /&gt;One thing that used to bother me was that if I had a line of code that chained or nested several method calls I would have to step into/out of all the methods until I got into the one I wanted.  Apparently Visual Studio supports the ability to &lt;a href="http://msdn.microsoft.com/en-us/library/7ad07721.aspx"&gt;step into a specific function&lt;/a&gt;.  I saw Jim do it yesterday, I can see the web sites describe it, but I can't find it in my environment.  So it's something to research.&lt;br /&gt;&lt;br /&gt;There is another thing I saw and can read about but can't find in my environment.  Apparently there is a setting under Tools | Options | Debugging which allows you to &lt;a href="http://msdn.microsoft.com/en-us/library/cc667388.aspx"&gt;step over property and operator calls&lt;/a&gt; by default.  Again, something to research.&lt;br /&gt;&lt;br /&gt;One thing I do see in my environment, and which I believe I can find use for, is the &lt;a href="http://msdn.microsoft.com/en-us/library/aa290597%28VS.71%29.aspx"&gt;HitCount&lt;/a&gt; property of breakpoints.  The breakpoint window displays this property for each breakpoint and should prove useful when trying to identify which iteration within a loop is causing a problem (for example).&lt;br /&gt;&lt;br /&gt;Finally, Jim reminded me of the DebuggerDisplay attribute that we can use to decorate our classes to make them more user friendly in the debugger.  Here's &lt;a href="http://msdn.microsoft.com/en-us/library/x810d419.aspx"&gt;one overview&lt;/a&gt; of that attribute and &lt;a href="http://www.hanselman.com/blog/TheDebuggerDisplayAttributeInVisualStudio2005AndIFormattable.aspx"&gt;another from Scott Hanselman&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Love the free training...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-213769853719880244?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/213769853719880244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/213769853719880244'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/03/debugging-tips-from-msdn-roadshow.html' title='Debugging tips from the MSDN Roadshow'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-794008712575784175</id><published>2009-03-04T20:33:00.003-05:00</published><updated>2009-03-04T21:06:27.533-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><title type='text'>I don't care what they say... 6 != 4</title><content type='html'>When writing a SQL query today (against SQL Server 2005) I came to realize I can't trust the &lt;span style="font-family: courier new;"&gt;len&lt;/span&gt; function.  Well, ok, I can trust it but not if the value being evaluated has trailing white space.  Take this code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Declare @value char(10)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Set @value = ' 123  '&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Print Len( @value)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Notice I set &lt;span style="font-family: courier new;"&gt;@value&lt;/span&gt; to &lt;span style="font-family: courier new;"&gt;' 123  '&lt;/span&gt;, that's &lt;span style="font-family: courier new;"&gt;[space][1][2][3][space][space]&lt;/span&gt;.  Now even if I count like my 6 year old that's 6 characters.  But what does the code above say?  4.   Four?!?!?  Lies!!!&lt;br /&gt;&lt;br /&gt;And it lies to me if I declare &lt;span style="font-family: courier new;"&gt;@value&lt;/span&gt; as char, nchar, varchar and nvarchar data type.  I can see varchar because it's a variable length data type.  However char is a fixed length data type so I was expecting either a length of 6 (I did, after all, assign a string literal with 6 characters) or 10 because &lt;span style="font-family: courier new;"&gt;@value&lt;/span&gt; was declared as a &lt;span style="font-family: courier new;"&gt;char(10)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;So I don't know what to believe anymore.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-794008712575784175?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/794008712575784175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/794008712575784175'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/03/i-dont-care-what-they-say-6-4.html' title='I don&apos;t care what they say... 6 != 4'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-3895691764243576614</id><published>2009-03-01T17:00:00.004-05:00</published><updated>2009-03-01T17:50:39.673-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Ah-ha! I knew I never liked that feature</title><content type='html'>Part of the new job is re-familiarizing myself with ASP.NET development.  I've done this before, obviously, notably at my last job writing web services.  But it's been a few years since I've done web pages.  So I'm reading Dino Esposito's book "Programming Microsoft ASP.NET 3.5".  It's a thorough book; or at least it is so far - I'm only into chapter 2.  But what I find I just had in chapter 2.&lt;br /&gt;&lt;br /&gt;One of the things the developers at my last shop used to "debate" was whether to develop web applications and do development testing against IIS or the embedded local web server available to Visual Studio 2008.  I was always an advocate for developing so the various web services I needed would be available via my box's IIS - I liked the fact I could have a web service available to me without having to included it in my solution.  Other developers liked the fact they didn't have to maintain their IIS setup.  Once we discovered a project can be set up to allow the developer to work as they prefer we stopped having these "discussions" (because updating the project file from source control no longer messed you up).&lt;br /&gt;&lt;br /&gt;But I just read the definitive reason why I would advise people to &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; use the embedded web server.  When your code runs using that server it assumes the level of credentials of the windows account you're signed in as.  For far too many of us that means our web code would be running as administrator on the box.  This rocks for us as developers because we don't have to worry about all those pesky security issues we would otherwise encounter.&lt;br /&gt;&lt;br /&gt;But we're really just kicking that can down the road.  For me it comes down to addressing those security issues sooner rather than later.  Because it's not like those security concerns aren't going to be raised when the code is put on the test server, or production, and by then it's more expensive to fix (not to mention embarrassing).&lt;br /&gt;&lt;br /&gt;So I say:&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;FrankensteinVoice&amp;gt;&lt;/span&gt;&lt;br /&gt;   Embedded web server -baaaaddddd&lt;br /&gt;&lt;span style="color: rgb(102, 51, 255);"&gt;&amp;lt;/FrankensteinVoice&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I hope you do, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-3895691764243576614?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/3895691764243576614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/3895691764243576614'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/03/ah-ha-i-knew-i-never-liked-that-feature.html' title='Ah-ha! I knew I never liked that feature'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-5978351362605846709</id><published>2009-02-20T10:28:00.002-05:00</published><updated>2009-02-20T10:36:48.604-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Yes, I'm still here</title><content type='html'>I haven't posted anything in a little while because I've been caught up trying to settle into the new gig and establish myself here.  So no great revelation of technology to write up.  I did want to share this link of &lt;a href="http://www.kevinwilliampang.com/post/Top-10-Things-That-Annoy-Programmers.aspx"&gt;10 things that bother developers&lt;/a&gt;.  Funny &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; accurate.&lt;br /&gt;&lt;br /&gt;As for the new gig - I've come to the conclusion that there must be many successful companies which have code bases which could benefit from a bit of cleanup.  Luckily, I'm at one of those companies that recognizes that fact and is getting us positioned to do it.&lt;br /&gt;&lt;br /&gt;I'm expecting to publish a couple of posts in the future which I originally wrote an internal blog at my previous employer.  I just need to scrub some of the identifiable information from it so as to protect the innocent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-5978351362605846709?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5978351362605846709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5978351362605846709'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/02/yes-im-still-here.html' title='Yes, I&apos;m still here'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-9145623817401640737</id><published>2009-01-30T15:49:00.002-05:00</published><updated>2009-01-30T17:42:29.712-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Tool Review: RockScroll</title><content type='html'>Doing my fluffy-Friday reading I found &lt;a href="http://www.hanselman.com/blog/IntroducingRockScroll.aspx"&gt;this post&lt;/a&gt; on Scot Hanselman's blog about a tool named RockScroll that turns your VS2005/2008 scroll bar into a thumbnail view of the open document (when working with .cs files anyway).  It also has a nifty feature that if you double click a word in the source code, say a variable name, it will highlight all occurrences of that word in a lovely lilac color (and red in the thumbnail scroll bar - which is the useful bit, IMO).&lt;br /&gt;&lt;br /&gt;Anyway, I'm digging this new tool and hope you might also find it useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-9145623817401640737?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/9145623817401640737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/9145623817401640737'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/01/tool-review-rockscroll.html' title='Tool Review: RockScroll'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-1219593299778437632</id><published>2009-01-22T09:47:00.002-05:00</published><updated>2009-01-22T10:02:27.475-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>XmlCsvReader</title><content type='html'>I found a new tool yesterday that saved me from having to type up some sample XML.  In preparing for a XSLT demo I wanted to use some sample data returned from a stored procedure in our database.  I was able to take those results and get them into a .CSV file but needed to then get it into an XML format.  The idea is the data may start out as this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;FirstName,LastName,Employer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Homer,Simpson,Springfield Nuclear Power Plant&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Kermit,Frog,Muppet Theatre&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;but I want it to end up like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;People&amp;gt;&lt;br /&gt;  &amp;lt;Person&amp;gt;&lt;br /&gt;    &amp;lt;FirstName&amp;gt;Homer&amp;lt;/FirstName&amp;gt;&lt;br /&gt;    &amp;lt;LastName&amp;gt;Simpson&amp;lt;/LastName&amp;gt;&lt;br /&gt;    &amp;lt;Employer&amp;gt;Springfield Nuclear Power Plant&amp;lt;/Employer&amp;gt;&lt;br /&gt;  &amp;lt;/Person&amp;gt;&lt;br /&gt;  &amp;lt;Person&amp;gt;&lt;br /&gt;    &amp;lt;FirstName&amp;gt;Kermit&amp;lt;/FirstName&amp;gt;&lt;br /&gt;    &amp;lt;LastName&amp;gt;Frog&amp;lt;/LastName&amp;gt;&lt;br /&gt;    &amp;lt;Employer&amp;gt;Muppet Theatre&amp;lt;/Employer&amp;gt;&lt;br /&gt;  &amp;lt;/Person&amp;gt;&lt;br /&gt;&amp;lt;/People&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A quick search on Google brought me to &lt;a href="http://msdn.microsoft.com/en-us/library/aa302293.aspx#"&gt;this post&lt;/a&gt; about a tool called &lt;span style="font-weight: bold;"&gt;XmlCsvReader&lt;/span&gt;.  It seemed to be just what I needed, but the link to download the tool was dead (still pointing to GotDotNet.com, which has been defunct for a while).  Armed with the name of the project, though, I Googled again and found &lt;a href="http://www.devhood.com/Tools/tool_details.aspx?tool_id=497"&gt;another post&lt;/a&gt; about it with a download that worked (three cheers to Andrew for not having a dead end!).&lt;br /&gt;&lt;br /&gt;Syntax is easy and the only snags I hit were the result of QueryAnalyzer, excuse me, SQL Server Management Studio 2005, not being able to save sproc results to a CSV file correctly.  I had to type in my column headers and wrap text values in double quotes if they had commas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-1219593299778437632?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/1219593299778437632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/1219593299778437632'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/01/xmlcsvreader.html' title='XmlCsvReader'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-3344929979754410054</id><published>2009-01-21T09:42:00.003-05:00</published><updated>2009-01-21T10:00:48.070-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><title type='text'>Keeping Current</title><content type='html'>Recently my manager asked me for examples of things I do outside of work to stay current in the development world. It seemed like a good topic for a blog post - so here it goes. Essentially I do three things to stay current; participate in the local .NET user group, attend the regional Code Camp (when possible) and read blogs/books.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Local .NET User Group&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;I’ve been involved in the local &lt;a href="http://www.vtdotnet.org/"&gt;VTdotNET user group&lt;/a&gt; for about 4 years now. It is held monthly and covers a variety of topics related to .NET development. In the past presented some “newbie” sessions for the user group. I found the exercise of putting a presentation together to be a good way to force myself to learn a topic in more depth. As a side note, when I would be preparing a presentation I would always do a dry run of it in-house for my co-workers as a tech chat or lunch and learn. Doing that led to questions I hadn’t considered and resulted in a more thorough presentation.&lt;br /&gt;&lt;br /&gt;Another benefit to participating in our local .NET user group has been the number of books I’ve won as door prizes. The books I have which have familiarized me with WCF and LINQ were door prizes. The book I’m currently skimming is “Programming ASP.NET 3.5” put out by Microsoft Press.&lt;br /&gt;&lt;br /&gt;I should also mention one of my new co-workers runs the &lt;a href="http://www.bluenotecomputing.com/vtsql/"&gt;VT SQL Server user group&lt;/a&gt; and I've committed to him that I would begin attending more regularly once they get going again.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Code Camp&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Twice a year there is a regional Code Camp held in Waltham, MA. Code camps are free events, held outside of work hours, that are run by the development community for the development community (here’s a link to the &lt;a href="http://www.thedevcommunity.org/codecamps/manifesto.aspx"&gt;Code Camp Manifesto&lt;/a&gt;). I’ve been attending these for about 4 years and they are marvelous opportunities to learn. Although the event itself is free the fact it’s held in Waltham, MA means most people need to cover travel expenses. I grew up in that area, though, so I stay with family which makes it an easy decision for me. Here are links to the last presentation schedules for &lt;a href="http://thedevcommunity.org/Events/PresentationList.aspx?id=4"&gt;Code Camp 8&lt;/a&gt;, &lt;a href="http://thedevcommunity.org/Events/PresentationList.aspx?id=6"&gt;Code Camp 9&lt;/a&gt; and &lt;a href="http://www.thedevcommunity.org/Events/PresentationList.aspx?id=7"&gt;Code Camp 10&lt;/a&gt; if you want a sense of the topics covered.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Reading&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Finally I read to stay current. In addition to the books I’ve mentioned earlier there are a few blogs I follow via RSS. &lt;a href="http://blogs.msdn.com/cbowen/default.aspx"&gt;Chris Bowen&lt;/a&gt; is our regional Microsoft developer evangelist. His blog is how I learn about upcoming code camps and MSDN road shows. &lt;a href="http://www.thedatafarm.com/blog/default.aspx"&gt;Julie Lerman&lt;/a&gt; runs our local .NET user group. Lately her blog has focused mainly on Entity Framework (EF), but that’s because she’s in the midst of writing a book on the topic for O’Reilly. While I’m not that interested in EF she also links to other topics (plus following her blog gives us something to talk about socially at the local user group meeting). I also follow the &lt;a href="http://www.softwarebyrob.com/"&gt;Software by Rob&lt;/a&gt; blog. It’s not really a technical blog but he writes on our industry in general. While &lt;a href="http://teddziuba.com/"&gt;Ted Dziuba’s blog&lt;/a&gt; is technical his topics rarely align with what I do. He has an extremely funny writing style, though, and the nuggets of information I get are usually pretty good.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Other&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There are other things I do to stay current such as viewing &lt;a href="http://www.microsoft.com/events/AdvSearch.mspx?EventsAndWebcastsControlName=As1%3AAdvSrc&amp;amp;As1%3AAdvSrc%3AAudienceID=8e4a08dc-5d95-4156-ab65-f22579a1592a&amp;amp;As1%3AAdvSrc%3AProductID=0&amp;amp;As1%3AAdvSrc%3AEventType=OnDemandWebcast&amp;amp;As1%3AAdvSrc%3ACountryRegionID=en%7CUS"&gt;web casts from Microsoft&lt;/a&gt;, the &lt;a href="http://polymorphicpodcast.com/"&gt;PolymorphicPodcast&lt;/a&gt; or other sources but it’s difficult to find dedicated time for watching/listening. Having said that, however, the new job is going to require me to get back up to speed on ASP.NET programming and these are resources which I'm sure I'll rely on more heavily than the past couple of years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-3344929979754410054?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/3344929979754410054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/3344929979754410054'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/01/keeping-current.html' title='Keeping Current'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-848051093903132750</id><published>2009-01-16T14:57:00.001-05:00</published><updated>2009-01-16T14:58:20.362-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Fun with progress bars</title><content type='html'>You could be forgiven for spending too much time on this site:&lt;br /&gt;&lt;a href="http://www.prettyloaded.com/"&gt;http://www.prettyloaded.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-848051093903132750?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/848051093903132750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/848051093903132750'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/01/fun-with-progress-bars.html' title='Fun with progress bars'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-846453386548057642</id><published>2009-01-14T17:45:00.013-05:00</published><updated>2009-01-16T14:56:19.386-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Speed up your string comparisons</title><content type='html'>&lt;span style="font-family:georgia;"&gt;One of the first software engineery things I was tasked with at the new job was to do a code review for a peer.  It was a good opportunity to look at some of our code.  One of the things that stood out to me, however, was the way string comparisons were being performed.  I saw a lot of this:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if(stringVariable1.ToUpper() == stringVariable2.ToUpper()) { ... }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of my comments back on the code review was it might be better to do this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if(stringVariable1.Equals( stringVariable2, StringComparison.OrdinalIgnoreCase)) { ... }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My peer agreed it might be a good idea but said the coding standard in the shop was the first approach.  Not having a second software engineery thing to look at yet I figured I would do a quick benchmark between the two approaches.  I also decided to include a comparision using &lt;span style="font-family:courier new;"&gt;.ToLower()&lt;/span&gt; just to be fair since that was in the code also.&lt;br /&gt;&lt;br /&gt;To perform the benchmark test I used the SimpleTimer class Bill Wert &lt;a href="http://blogs.msdn.com/billwert/archive/2004/03/11/88192.aspx"&gt;outlined on his blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The test itself was just a console application that builds a &lt;span style="font-family:courier new;"&gt;List&lt;string&gt;&lt;/string&gt;&amp;lt;string&amp;gt;&lt;/span&gt; with the number of entries identified by the person running the test.  So the tester can enter 1 to whatever &lt;span style="font-family:courier new;"&gt;long.MaxValue&lt;/span&gt; is.  I fill that &lt;span style="font-family:courier new;"&gt;List&lt;string&gt;&lt;/string&gt;&lt;/span&gt; with the appropriate number of &lt;span style="font-family:courier new;"&gt;Guid.NewGuid().ToString()&lt;/span&gt; values.  Then I time how long it takes to invoke an &lt;span style="font-family:courier new;"&gt;if&lt;/span&gt; using the different comparisons.&lt;br /&gt;&lt;br /&gt;The code for all this is below, but I'm all about getting to the results...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The Results&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;I started small with a sample size of only 8,000:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ToUpper&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;8000 iterations took 0.008 seconds, resulting in 1012736.624 iterations per second&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;ToLower&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;8000 iterations took 0.007 seconds, resulting in 1199852.721 iterations per second&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Equals&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;8000 iterations took 0.001 seconds, resulting in 9669591.016 iterations per second&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Not bad.  Already we see the &lt;span style="font-family:courier new;"&gt;.Equals&lt;/span&gt; method performs faster than changing the case and doing the &lt;span style="font-family:courier new;"&gt;==&lt;/span&gt; thing.  I decide to skip going for a medium size test and go right for big.&lt;br /&gt;&lt;br /&gt;Here's the results using a sample size of 8,000,000:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ToUpper&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;8000000 iterations took 4.608 seconds, resulting in 1736263.497 iterations per second&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ToLower&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;8000000 iterations took 4.187 seconds, resulting in 1910494.970 iterations per second&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Equals&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;8000000 iterations took 0.318 seconds, resulting in 25181978.355 iterations per second&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Oh sure, the test takes longer - but I think it was worth it.  In case you missed it - 3 tenths of a second is &lt;span style="font-style: italic;"&gt;less than&lt;/span&gt; 4.6 seconds.&lt;br /&gt;&lt;br /&gt;I'm going to see if we can get that coding standard changed...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The Code&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Sorry the syntax highlighting is missing but the blog editor isn't good about that.  I've changed the color on the comments but you'll want to paste this into the IDE of your choice if you want the whole enchilada.&lt;br /&gt;&lt;pre&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;namespace StringComparisonPerformance&lt;br /&gt;{&lt;br /&gt; class Program&lt;br /&gt; {&lt;br /&gt;     static void Main(string[] args)&lt;br /&gt;     {&lt;br /&gt;         const long defaultSampleSize = 10;&lt;br /&gt;         long testRecordCount = defaultSampleSize;&lt;br /&gt;&lt;br /&gt;         Console.WriteLine("Enter sample size");&lt;br /&gt;         string inputValue = Console.ReadLine();&lt;br /&gt;&lt;br /&gt;         if (string.IsNullOrEmpty(inputValue))&lt;br /&gt;         {&lt;br /&gt;             Console.WriteLine("No value provided, using default sample size of {0}", testRecordCount.ToString());&lt;br /&gt;         }&lt;br /&gt;         else&lt;br /&gt;         {&lt;br /&gt;             if (!long.TryParse(inputValue, out testRecordCount))&lt;br /&gt;             {&lt;br /&gt;                 testRecordCount = defaultSampleSize;&lt;br /&gt;                 Console.WriteLine("Unrecognized sample size provided.  Using default sample size of {0}", testRecordCount.ToString());&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         List&lt;span style="font-family:courier new;"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;string&gt; testValues = GetTestValues(testRecordCount);&lt;br /&gt;         string comparisonValue = testValues[1].ToUpper(); &lt;span style="color: rgb(0, 102, 0);"&gt;//some value&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         SimpleTimer timer = new SimpleTimer();&lt;br /&gt;&lt;br /&gt;         Console.WriteLine();&lt;br /&gt;         Console.WriteLine();&lt;br /&gt;         Console.WriteLine("ToUpper");&lt;br /&gt;         timer.StartTimer();&lt;br /&gt;         ToUpperTest(comparisonValue, testValues);&lt;br /&gt;         timer.StopTimer();&lt;br /&gt;         timer.Result(testRecordCount);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            //now recast all the test values to upper case to account for the fact&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            //GetTestValues returns lower case values.  This just ensures the test&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;            //is fair between ToUpper and ToLower&lt;/span&gt;&lt;br /&gt;         for (int i = 0; i &lt;&gt;    &lt;string&gt;testValues[i] = testValues[i].ToUpper();&lt;br /&gt;&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;Console.WriteLine();&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;Console.WriteLine();&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;Console.WriteLine("ToLower");&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;timer.StartTimer();&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;ToLowerTest(comparisonValue, testValues);&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;timer.StopTimer();&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;timer.Result(testRecordCount);&lt;br /&gt;&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;Console.WriteLine();&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;Console.WriteLine();&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;Console.WriteLine("Equals");&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;timer.StartTimer();&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;EqualsTest(comparisonValue, testValues);&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;timer.StopTimer();&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;timer.Result(testRecordCount);&lt;br /&gt;&lt;br /&gt;&lt;/string&gt;            &lt;string&gt;&lt;/string&gt;&lt;string&gt;Console.ReadLine();&lt;br /&gt;&lt;/string&gt;        &lt;string&gt;&lt;/string&gt;&lt;string&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/string&gt;        &lt;string&gt;&lt;/string&gt;&lt;string&gt;static List&lt;string&gt; GetTestValues(long testLength)&lt;br /&gt;     {&lt;br /&gt;         List&lt;/string&gt;&lt;/string&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt; testValues = new List&lt;string&gt;();&lt;br /&gt;&lt;br /&gt;         for (int i = 0; i &lt;&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;            &lt;string&gt;    &lt;/string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;testValues.Add(Guid.NewGuid().ToString());&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;br /&gt;         &lt;string&gt;&lt;/string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;return testValues;&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;        &lt;string&gt;&lt;/string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;        &lt;string&gt;&lt;/string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;static void ToUpperTest(string comparisonValue, List&lt;string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt; testValues)&lt;br /&gt;     {&lt;br /&gt;         foreach (string testValue in testValues)&lt;br /&gt;             if (testValue.ToUpper() == comparisonValue.ToUpper()) { }&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     static void ToLowerTest(string comparisonValue, List&lt;string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt; testValues)&lt;br /&gt;     {&lt;br /&gt;         foreach (string testValue in testValues)&lt;br /&gt;             if (testValue.ToLower() == comparisonValue.ToLower()) { }&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     static void EqualsTest(string comparisonValue, List&lt;string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt;&lt;string&gt; testValues)&lt;br /&gt;     {&lt;br /&gt;         foreach (string testValue in testValues)&lt;br /&gt;             if (testValue.Equals(comparisonValue, StringComparison.OrdinalIgnoreCase)) { }&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-846453386548057642?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/846453386548057642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/846453386548057642'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/01/speed-up-your-string-comparisons.html' title='Speed up your string comparisons'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-4902622243766772537</id><published>2009-01-13T08:52:00.000-05:00</published><updated>2009-01-13T10:23:41.740-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>VTdotNET January 2009 Summary</title><content type='html'>&lt;span style="font-family:times new roman;"&gt;The January &lt;/span&gt;&lt;a style="font-family: times new roman;" href="http://www.vtdotnet.org/"&gt;VTdotNET&lt;/a&gt;&lt;span style="font-family:times new roman;"&gt; meeting was heavily attended (38 people by my count) and with good reason.  The presentation by &lt;/span&gt;&lt;a style="font-family: times new roman;" href="http://www.mariocardinal.com/"&gt;Mario Cardinal&lt;/a&gt;&lt;span style="font-family:times new roman;"&gt; was &lt;/span&gt;&lt;span style="font-weight: bold;font-family:times new roman;" &gt;"Best Practices to Design a Modular Architecture"&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;.  The main thrust of his presentation was that we as developers and architects need to do a better job of designing our solutions to be compositions of solution models.  The idea in his mind is to not have our applications be one "big ball of mud" but a series of "smaller, loosely coupled balls of mud."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Nothing revolutionary there, I admit.  But he did a better job than most of defining his terms and offering some best practices.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:times new roman;" &gt;Terms&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Mario started by describing his view of &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;architecture &lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;as the process of abstracting solutions and experiences into different models.  The intent is to identify the various areas of an application which can be their own module.  &lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;" &gt;The goal is always to simplify the application design.&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;  The example he gave was if a builder has to meet a requirement that a person standing a room should be able to view the outside the preferred design would be to put a window in the wall (simple and meets the need).  A bad design would be to introduce a series of gears and supports which would hoist the wall up like a garage door.  Sure it meets the need but it is overly complex.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;So what, in his mind, is  a module?  He identifies a module as something which has certain attributes:&lt;/span&gt;&lt;br /&gt;&lt;ul  style="font-family:times new roman;"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Role&lt;/span&gt; - this describes the responsibility it performs in the system&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Seam&lt;/span&gt; - the visible or public interface of the module.  This is more than just the API, however, which I describe later.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Body&lt;/span&gt; - the hidden design parameters and implementation&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Test Bed&lt;/span&gt; - this determines how well the module works in an autonomous way without running the whole system.  Based on what I saw it consists of the unit tests and various mock objects required by those unit tests.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:times new roman;"&gt;Mario's point is we as an industry overly emphasize the Body and need to focus more precisely on the Role, Seam&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt; and Test Bed of a module.  To illustrate he discussed that in his view a module could be a System, Layer or Class.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;The point Mario wanted us to take away from this discussion was that all serious mistakes are made the first day&lt;/span&gt;&lt;br /&gt;&lt;ul  style="font-family:times new roman;"&gt;&lt;li&gt;The most dangerous assumptions are the unstated ones&lt;/li&gt;&lt;li&gt;The design must ensure a module has only one reason to change - &lt;a href="http://www.oodesign.com/single-responsibility-principle.html"&gt;the Single Responsibility Principle&lt;/a&gt;&lt;/li&gt;&lt;li&gt;We need to group elements that are strongly related to each other while separating elements that are unrelated or have a conflict of interest&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:times new roman;"&gt;He was asked how to identify a module's responsibility.  He suggested starting with the business logic layer and stripping away concerns of infrastructure such as persistence, logging and the like.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;As I previously mentioned, Mario's discussion of modules were intended to apply equally to a System, Layer or Class.  He defined each as:&lt;/span&gt;&lt;br /&gt;&lt;ul face="times new roman"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;System&lt;/span&gt;&lt;span style="font-family: times new roman;"&gt; - An autonomous processing unit which defines a business boundry.  Services or applications are the usual examples of a system.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Layer&lt;/span&gt;&lt;span style="font-family: times new roman;"&gt; - the parts of a service or application&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Class&lt;/span&gt;&lt;span style="font-family: times new roman;"&gt; - the units of programming which comprise a layer&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:times new roman;"&gt;A major aspect of understanding a module, therefore, is the concept of a Seam.  A Seam has three parts:&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-family: times new roman;"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;List of operations&lt;/span&gt; - the API&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Expected behaviors&lt;/span&gt; - what it's supposed to do.  These become the core of understanding what tests can/should be written for the module.  Use examples rather than formal statements (such as UML expressions).  It is important to keep in mind we're talking about tests for the &lt;span style="font-style: italic;"&gt;module&lt;/span&gt; so if the module is a layer the scope and nature of the testing will be different than testing for a class.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Constraints&lt;/span&gt; - logic or requirements that define the prerequisites.  Examples of these would be preconditions such as input validation or other guard conditions.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-family:times new roman;" &gt;Best Practice Recommendations&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;The best practices which Mario offered centered around doing the hard part first.  So what's the hard part?  Getting the interfaces correct.  He believes the greatest leverage in architecting is at the interfaces.  So the suggestion is to focus on the Seams to ensure the interactions work properly and clearly.  This focus allows the natural boundaries between modules to become self evident.  Then the "big ball of mud" can be divided up naturally - much like a log is split along the grain.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Mario advocates starting with the System Seam.  For applications this means the UI and for services this would be contract-first development.  Ensuring the System Seam is correct is the best way to ensure the user ends up with the experience they desire.  Because the system is being written to satisfy the user's need it's the natural place to start.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;The process he recommends following for defining the System Seam is decidedly low-tech but aligns with the Agile approach.  You start with defining the User Stories/Use Cases/User Scenarios.  From there you create what he called &lt;span style="font-family:courier new;"&gt;low fidelity mock ups&lt;/span&gt; - what everyone else would call screen layouts on paper.  Nothing is cheaper than drawing on paper or a white board and asking the user, "Is this what you mean?"  Once the low fidelity mock ups are solid (after iterative reviews and revisions) you then build &lt;span style="font-family:courier new;"&gt;high fidelity mock ups&lt;/span&gt; - actual screens with just enough behavior implemented to define the user experience but nothing &lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;" &gt;real&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt; beneath it.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Once the high fidelity mock up is defined and is agreed upon Mario claims the natural seam between the UI and the business layer will be revealled.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;He makes two further recommendations that apply if the user identifies further changes once the high fidelity mock up is started.  First, we should &lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;" &gt;welcome&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt; those changes.  It may like our hard work is being dismissed or put aside but they are an opportunity to get closer to what the user actually wants and needs.  Second, any changes should be defined and clarified by restarting with the low fidelity mock ups.  For example, don't start moving buttons on a form and compiling - draw a picture of your understanding of the requested change.  Remember, paper is cheap.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:times new roman;" &gt;Other Observations&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Part of the meeting got side tracked because Mario was asserting it is foolish to commit to delivering a finished system on a particular date.  He believes the software industry needs to get to a place where we are making rational commitments.  He believes we should only commit to the next step in the development process.  For example, he believes we can only commit to having mock ups by a certain date.  Once the mock ups are defined and agreed upon we can begin discussing when the next stage of module delivery might be accomplished.  Some of us tried to bring the discussion back to reality - pointing out, for example, that sales folks can't sell screen mock ups - but Mario was insistent the issue is our industry needs to change expectations.  He likened it to someone saying, "Here's a bunch of money to cure cancer.  When will you have that done?"  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;I don't think I'll hold my breath for that, though.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-4902622243766772537?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/4902622243766772537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/4902622243766772537'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/01/vtdotnet-january-2009-summary.html' title='VTdotNET January 2009 Summary'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-1669370413706351079</id><published>2009-01-12T17:33:00.000-05:00</published><updated>2009-01-12T17:38:05.696-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Clone Detective for Visual Studio</title><content type='html'>A friend of mine recommended this tool.  I've not played with it yet but didn't want to loose the link - it's &lt;a href="http://www.codeplex.com/CloneDetectiveVS"&gt;http://www.codeplex.com/CloneDetectiveVS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;He says it's a little utility delivered as a non intrusive VS.2008 add-in that helps identify duplicate code with an intuitive UI. He finds it handy for refactoring code to be more concise and uses it to remove the “copy/paste” pattern he finds in the legacy product on which he works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-1669370413706351079?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/1669370413706351079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/1669370413706351079'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/01/clone-detective-for-visual-studio.html' title='Clone Detective for Visual Studio'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-3612392782285887280</id><published>2009-01-12T17:31:00.000-05:00</published><updated>2009-01-12T17:33:35.059-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Additional C# Code Snippets for VS2005</title><content type='html'>Something you might find useful when coding in C# is the way code snippets can increase your productivity and provide guidance/reminders on syntax. If you like snippets, you might want to grab the additional snippets published &lt;a href="http://msdn.microsoft.com/en-us/vs2005/aa718338.aspx"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-3612392782285887280?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/3612392782285887280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/3612392782285887280'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/01/additional-c-code-snippets-for-vs2005.html' title='Additional C# Code Snippets for VS2005'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-8471192240826790079</id><published>2009-01-05T13:37:00.000-05:00</published><updated>2009-01-05T13:57:58.332-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Day 1 of the new adventure</title><content type='html'>So today is my first day at the new job.  There hasn't been much structure to my day, simply getting my account information and installing software.  It made me think about what the tools I simply MUST have as a developer.  There are 3 that I installed right off the bat which I figured might be worth sharing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://sourceforge.net/projects/sevenzip/"&gt;7-Zip&lt;/a&gt;: &lt;/span&gt;This is the zip utility I use.  7-Zip is an open source project so it's free (always nice).  The UI is a simple integration with the context menus in Windows Explorer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.google.com/search?q=CmdHerePowertoySetup.exe"&gt;CmdHere PowerToy&lt;/a&gt;:&lt;/span&gt; This is a Microsoft power toy that adds a menu item to the context menu that is presented in Windows Explorer when you right click on a folder.  The menu item allows you to quickly open a command window with a working directory of the folder on which you invoked the context menu.  (I'll update this with a link once I find one).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://sourceforge.net/projects/notepad-plus/"&gt;Notepad++&lt;/a&gt;:&lt;/span&gt;  Sometimes I just want to open a source code file and review its contents without spinning up an IDE with lots of overhead (I'm looking at you, Visual Studio).  In the past I've used editors like TextPad, which I like, but it cost money.  A little over a year ago I was turned onto an open source editor that I like well enough to start using, Notepad++.  It is fast, gives me the syntax highlighting I want and has some nice tools baked into it.&lt;br /&gt;&lt;br /&gt;There are other tools I like, and I continue to find new ones.  But these were the first 3 to get installed and that made them seem noteworthy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-8471192240826790079?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8471192240826790079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/8471192240826790079'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2009/01/day-1-of-new-adventure.html' title='Day 1 of the new adventure'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry><entry><id>tag:blogger.com,1999:blog-8256260706621645238.post-5245941432206071977</id><published>2008-12-19T20:54:00.000-05:00</published><updated>2008-12-19T21:01:51.359-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Starting Over</title><content type='html'>For almost two years I've worked at this cool software company that had an internal blog on which I would share information, announcements or learning with the rest of the development team.  I enjoyed the blog approach of sharing information.  However, I'm leaving that company next week and starting at another cool software company in early January.&lt;br /&gt;&lt;br /&gt;Not knowing what the blogging situation is at the new place I've decided to start a new, independent blog.  The other advantage is anything I learn won't be limited to an internal blog and others in the community will (hopefully) benefit.  If nothing else,  I'll be able to look up my own notes from any internet cafe.&lt;br /&gt;&lt;br /&gt;The posts I expect to make will center on my professional life - information about programming languages, techniques and trends.  However, I'm also likely to occasionally create posts that I feel fall under a humorous, social or politically interesting (I'm a political junkie) category.  I expect to get most of that out of my system on Facebook, though.  :-)&lt;br /&gt;&lt;br /&gt;So, if you've found this blog.  Welcome!  I hope it provides some useful information or, at least, a few minutes distraction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8256260706621645238-5245941432206071977?l=bigpigvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5245941432206071977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8256260706621645238/posts/default/5245941432206071977'/><link rel='alternate' type='text/html' href='http://bigpigvt.blogspot.com/2008/12/starting-over.html' title='Starting Over'/><author><name>BigPigVT</name><uri>http://www.blogger.com/profile/13822643534037160541</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></entry></feed>
