<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
   <channel>
      <title>SVNUG Blog Aggregator</title>
      <description>A combined feed containing all blog content from members of the Sangamon Valley .NET User Group in Springfield, Illinois.</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=50da3fe378f8ca2812dbcf3c1cc29536</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=50da3fe378f8ca2812dbcf3c1cc29536&amp;_render=rss&amp;page=2" />
      <pubDate>Sat, 25 May 2013 17:40:02 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/SVNUGBlogAggregator" /><feedburner:info uri="svnugblogaggregator" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
         <title>Introduction to .NET Talk</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/2iL8rw7vMqA/introduction-to-net-talk.html</link>
         <description>&lt;p&gt;When Dusten Nance of the &lt;a rel="nofollow" target="_blank" href="http://www.aitpcapitol.org/"&gt;AITP Capitol Chapter&lt;/a&gt; approached me about their interest in an introduction to .NET presentation, I was very excited about the prospect of sharing my seven years of hard-earned .NET knowledge with others.&amp;#160; Being a dutiful officer of the &lt;a rel="nofollow" target="_blank" href="http://www.svnug.com/"&gt;Sangamon Valley .NET User Group (SVNUG)&lt;/a&gt;, however, I first contacted our past presenters to see if anyone would be available to give such an interesting talk to their group.&amp;#160; Unfortunately, none of the SVNUG presenters were available to give the talk.&lt;/p&gt;  &lt;p&gt;Well, unfortunately for them, that is.&amp;#160; Fortunately for me, though, that meant I was able to give the talk, and I was so excited!&amp;#160; I spent hours pouring over .NET books, my favorite .NET sites, my favorite .NET blogs.&amp;#160; Reading.&amp;#160; Researching.&amp;#160; Thinking.&amp;#160; It was tough.&amp;#160; Of everything in the universe of .NET, what did &lt;strong&gt;*I*&lt;/strong&gt; want to tell people about.&amp;#160; What did &lt;strong&gt;*I*&lt;/strong&gt; feel was so great and so special about .NET and why did I think they should feel the same.&amp;#160; Hopefully, I did a decent job of it: &lt;a rel="nofollow" target="_blank" href="https://skydrive.live.com/redir.aspx?cid=031815cabc0fc530&amp;amp;resid=31815CABC0FC530!703&amp;amp;parid=31815CABC0FC530!701&amp;amp;authkey=!AGfyot98xJMIm-M"&gt;the slides (for your viewing pleasure).&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="https://skydrive.live.com/redir.aspx?cid=031815cabc0fc530&amp;amp;resid=31815CABC0FC530!703&amp;amp;parid=31815CABC0FC530!701&amp;amp;authkey=!AGfyot98xJMIm-M"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-r4Ddl5GD5_4/T3Oy7EG4k4I/AAAAAAAAAJY/izddvKxgGAY/image%25255B6%25255D.png?imgmax=800" width="392" height="302"/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After the obligatory overview of .NET and what you can do with it, I spent some time on what I see as the advantages and disadvantages of using .NET (as opposed to another modern development platform).&amp;#160; There are always the standard, obvious advantages of using .NET: mature technology, focused on developers, focused on business applications, plays nice with other Microsoft products, etc., etc.&amp;#160; I was surprised, however, to see how strongly the audience reacted (in a positive way) to two not-so-obvious advantages of .NET: the strong open-source community and focus on patterns and practices.&lt;/p&gt;  &lt;p&gt;In regard to open-source, Microsoft is definitely a different place than it was ten years ago.&amp;#160; Although the patent wars may linger on, the world of the .NET developer is open and filled with many wonderful open-source and user-contributed options: CodePlex, Visual Studio Extensions, Web Platform Installer, NuGet, you name it.&amp;#160; If you don’t want to buy it and you don’t want to build it, somebody out there probably has an open-source alternative for you in .NET.&amp;#160; And, if they don’t, you could always create one.&lt;/p&gt;  &lt;p&gt;Microsoft’s focus on patterns and practices was also very interesting to the audience.&amp;#160; In my experience, Microsoft cares more than any other big box company about helping you build better software faster.&amp;#160; Software that not only makes users more efficient and productive but also improves their experience and day-to-day life.&amp;#160; Patterns and practices are a big part of this help: Enterprise Library, Unity, ASP.NET MVC, WPF with MVVM, and many more.&amp;#160; Why re-invent the wheel and/or use an anti-pattern (gasp) instead of using a well-established patterns and practices project from Microsoft?&amp;#160; Enterprise-proven, open-source software and whitepapers from Microsoft that make your life as a developer easier, make your software better, and make your users and business partners happier.&amp;#160; That is the power of Microsoft patterns and practices.&lt;/p&gt;  &lt;p&gt;I also spent some time at the end of my talk discussing what I see as the future of .NET.&amp;#160; .NET is already well-established in IT shops around the globe as the go-to technology for building new, feature-rich business applications.&amp;#160; The next step?&amp;#160; Consumer applications.&amp;#160; Windows Phone, Windows 8 Metro applications, and the push to the tablet I think signal Microsoft’s intention to develop a rich and integrated consumer user experience whereby the same application you use on your Windows Phone you can use on your Windows tablet, your Windows laptop, and your Windows desktop.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://skydrive.live.com"&gt;Skydrive&lt;/a&gt;, Microsoft’s free consumer cloud storage technology, ties in nicely with this new ecosystem of applications spanning form factors.&amp;#160; Imagine starting a Word document on your Windows 8 desktop.&amp;#160; Save it to the cloud, hop on the couch to rest your tired dogs, and finish the document on your Windows 8 laptop.&amp;#160; The next morning, review the document on your Windows Phone on your way to the big meeting—where you present it to your colleagues on your Windows 8 tablet.&amp;#160; The same application.&amp;#160; The same file.&amp;#160; Four different devices.&amp;#160; Four different form factors.&amp;#160; But all integrated and cohesive.&amp;#160; That is the future of .NET.&lt;/p&gt;  &lt;p&gt;Thank you Dusten Nance and all of &lt;a rel="nofollow" target="_blank" href="http://www.aitpcapitol.org/"&gt;AITP Capitol Chapter&lt;/a&gt; for the opportunity to speak at your March 2012 meeting on Tuesday night.&amp;#160; I enjoyed it very much, and I hope you did too.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/kZfvWxhYFpU" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/2iL8rw7vMqA" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-7893794833186515860</guid>
         <pubDate>Sun, 25 Mar 2012 03:48:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://lh4.ggpht.com/-r4Ddl5GD5_4/T3Oy7EG4k4I/AAAAAAAAAJY/izddvKxgGAY/s72-c/image%25255B6%25255D.png?imgmax=800" width="72" />
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/kZfvWxhYFpU/introduction-to-net-talk.html</feedburner:origLink></item>
      <item>
         <title>CSS Stylesheets Not Refreshing in Chrome</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/yIOsgnmoHhs/css-stylesheets-not-refreshing-in.html</link>
         <description>&lt;p&gt;For the past month or two, I have been struggling with an issue on the &lt;a rel="nofollow" target="_blank" href="http://www.svnug.com/"&gt;SVNUG.com&lt;/a&gt; project where, when we would update the CSS stylesheet for the site, browsers (and Chrome specifically) would not automatically retrieve the updated CSS and would instead use the cached version.&amp;#160; As you can imagine, this caused all sorts of usability and styling issues on the site, and, despite all my Googling, I could not find a good answer to why the CSS was not getting updated.&amp;#160; I ended up bandaiding it by fiddling with the browser caching settings in the Web.config file, but I was not happy with that solution.&amp;#160; Dictating the cacheability of every site resource because of a problem with only one just felt like overkill.&lt;/p&gt;  &lt;p&gt;I let it go.&amp;#160; Until today.&amp;#160; This morning, we deployed a new release of &lt;a rel="nofollow" target="_blank" href="http://www.svnug.com/"&gt;SVNUG.com&lt;/a&gt; with brand spanking new Join and Contact forms, and, lo and behold, the form styling was not updated.&amp;#160; Great!&lt;/p&gt;  &lt;p&gt;So, after a little bit of panicking (since the release was already live), I Googled and luckily the found the following StackOverflow post:&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://stackoverflow.com/questions/2263096/css-file-is-not-refreshing-in-my-browser"&gt;http://stackoverflow.com/questions/2263096/css-file-is-not-refreshing-in-my-browser&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The gist of the post is that, to control when browsers retrieve a new copy of a CSS stylesheet, add a query string to the end of the stylesheet path in your &lt;font style="line-height:normal;white-space:pre;" face="Consolas"&gt;&lt;font style="background-color:#22282a;"&gt;&lt;font color="#f1f2f3"&gt;&amp;lt;&lt;/font&gt;&lt;span style=""&gt;&lt;font color="#93c763"&gt;link&lt;font color="#f1f2f3"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt; tag that specifies the version:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;font color="#f1f2f3"&gt;&amp;lt;&lt;/font&gt;&lt;span style=""&gt;&lt;font color="#93c763"&gt;link&lt;/font&gt;&lt;/span&gt;&lt;font color="#f1f2f3"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e0e2e4"&gt;&lt;font style="background-color:#293134;"&gt;&lt;span style="background-image:none;background-attachment:scroll;background-repeat:repeat;background-position:0% 0%;"&gt;href&lt;/span&gt;&lt;span style="background-image:none;background-attachment:scroll;background-repeat:repeat;background-position:0% 0%;"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style=""&gt;&lt;font color="#ec7600"&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#ec7600"&gt;&lt;span style=""&gt;Site.css?version=3&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;font color="#f1f2f3"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e0e2e4"&gt;&lt;font style="background-color:#293134;"&gt;&lt;span style="background-image:none;background-attachment:scroll;background-repeat:repeat;background-position:0% 0%;"&gt;type&lt;/span&gt;&lt;span style="background-image:none;background-attachment:scroll;background-repeat:repeat;background-position:0% 0%;"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style=""&gt;&lt;font color="#ec7600"&gt;&amp;quot;text/css&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#f1f2f3"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e0e2e4"&gt;&lt;font style="background-color:#293134;"&gt;&lt;span style="background-image:none;background-attachment:scroll;background-repeat:repeat;background-position:0% 0%;"&gt;rel&lt;/span&gt;&lt;span style="background-image:none;background-attachment:scroll;background-repeat:repeat;background-position:0% 0%;"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style=""&gt;&lt;font color="#ec7600"&gt;&amp;quot;stylesheet&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#f1f2f3"&gt; /&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The browser treats the entire href attribute uniquely for caching purposes.&amp;#160; Thus, when the version number changes in the &lt;font style="line-height:normal;white-space:pre;" face="Consolas"&gt;&lt;font style="background-color:#22282a;"&gt;&lt;font color="#f1f2f3"&gt;&amp;lt;&lt;/font&gt;&lt;span style=""&gt;&lt;font color="#93c763"&gt;link&lt;font color="#f1f2f3"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt; tag on your site, the browser will treat the stylesheet reference as a new resource that it has not yet downloaded—causing the browser to download the updated CSS.&amp;#160; The web server for its part will ignore the query string for a static resource—returning the desired stylesheet when requested.&lt;/p&gt;  &lt;p&gt;Now, I will admit it has been a few years since I have built a web site from the ground up, but this is evidently a well-established trick for managing browser caching for your CSS stylesheets.&amp;#160; Good to know.&lt;/p&gt;  &lt;p&gt;All I can say is that it works and it works well.&amp;#160; It also addresses cacheability issues in a granular fashion instead of across the board—which, if you will recall, is what I didn’t like about changing the browser caching settings in the Web.config file.&lt;/p&gt;  &lt;p&gt;StackOverflow &amp;gt; All&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/EElxqkA78m8" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/yIOsgnmoHhs" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-3429429892100111495</guid>
         <pubDate>Sun, 27 Nov 2011 17:37:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/EElxqkA78m8/css-stylesheets-not-refreshing-in.html</feedburner:origLink></item>
      <item>
         <title>Color Theme Generator</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/v1cIzJWDaQo/Color-Theme-Generator.aspx</link>
         <description>&lt;p&gt;I thought I had posted about this site before, but I could not find it and had to go back to a manual search and find mission to get back to it. &lt;a rel="nofollow" target="_blank" href="http://colorschemedesigner.com/"&gt;ColorSchemeDesigner&lt;/a&gt; is a pretty flexible site that helps find complementary colors for those of us, like myself, that are artistically impaired.&lt;/p&gt;  &lt;p&gt;Check it out!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/v1cIzJWDaQo" height="1" width="1"/&gt;</description>
         <author>mark shiffer</author>
         <guid isPermaLink="false">http://www.mssoftwareconsulting.com/msswc/blog/post.aspx?id=34d8a425-1391-4fa6-bc48-0aa235c1e528</guid>
         <pubDate>Wed, 26 Oct 2011 15:25:38 +0000</pubDate>
      <feedburner:origLink>http://www.mssoftwareconsulting.com/msswc/blog/post/Color-Theme-Generator.aspx</feedburner:origLink></item>
      <item>
         <title>Game / Code Kata – Krypto</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/oznf9yRIAmE/Game-Code-Kata-e28093-Krypto.aspx</link>
         <description>&lt;p&gt;I used to read TheDailyWTF, not quite sure why I stopped, maybe I will start again. Anyway, I tucked this one away, &lt;a rel="nofollow" target="_blank" href="http://thedailywtf.com/Articles/Krytpo-and-24.aspx"&gt;Krypto and 24&lt;/a&gt;,&amp;#160; for later because the game sounded quite interesting. One of those fun math games with playing cards that is really right up my alley. Here’s how Krypto works:&lt;/p&gt;  &lt;p&gt;While most kids reached in their pockets for coins to ante up, we’d pulled the face and joker cards out of the deck, shuffle the rest, and deal out six cards, face-up, in the middle of the table with one of the cards a few inches from the rest.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;8♥&amp;#160;&amp;#160; 5♦&amp;#160;&amp;#160; 2♣&amp;#160;&amp;#160; 10♥&amp;#160;&amp;#160; 5♣&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3♠&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Our goal was to race to see who could make a mathematical equation using only the four basic arithmetic expressions and parenthesis.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;5♣ - (8♥ * 5♦ / 10♥) + 2♣&amp;#160;&amp;#160; =&amp;#160;&amp;#160; 3♠&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The first to solve (which, almost never was me) kept the five cards as points, and play continued until we ran out of cards.&lt;/p&gt;  &lt;p&gt;We’d also play another variant called 24, where the five cards would have to come to 24. For example...&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;8♥&amp;#160;&amp;#160; 5♦&amp;#160;&amp;#160; 2♣&amp;#160;&amp;#160; 10♥&amp;#160;&amp;#160; 5♣&amp;#160;&amp;#160; =&amp;#160;&amp;#160; 24&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;... would become...&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;(5♦ + 5♣ - 8♥) * (2♣ + 10♥)&amp;#160;&amp;#160; =&amp;#160;&amp;#160; 24&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;These games (which I’ve since learned are called &lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/B000P10PF4?ie=UTF8&amp;amp;tag=tdw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000P10PF4"&gt;Krypto&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/B0006U2F5M?ie=UTF8&amp;amp;tag=tdw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B0006U2F5M"&gt;24&lt;/a&gt;) were – and still are – a lot of fun.&lt;/p&gt;  &lt;h5&gt;Bring Your Own Code&lt;/h5&gt;  &lt;p&gt;Your exercise for the day: play Krypto and 24. More specifically, write a program to play the games for you.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The input should be:      &lt;ul&gt;       &lt;li&gt;&lt;b&gt;Easy&lt;/b&gt; - six integers, the first five of which are between 1 and 10, and the sixth which is between 1 and 10 or is 24 &lt;/li&gt;        &lt;li&gt;&lt;b&gt;Hard &lt;/b&gt;- an integer array of unknown length and an integer that is a solution of the array&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;The output should be:      &lt;ul&gt;       &lt;li&gt;&lt;b&gt;Easy&lt;/b&gt; - a string representing a single solution to the input &lt;/li&gt;        &lt;li&gt;&lt;b&gt;Medium&lt;/b&gt; - a string array representing all possible solutions to the input &lt;/li&gt;        &lt;li&gt;&lt;b&gt;Hard&lt;/b&gt; - a string array representing non-duplicated solutions to the input; a solution is considered duplicate if the differences are only associative or commutative&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For bonus points, create a function that mimics a game; i.e., starting with 40 cards, removing 5, shuffling again, etc.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/oznf9yRIAmE" height="1" width="1"/&gt;</description>
         <author>mark shiffer</author>
         <guid isPermaLink="false">http://www.mssoftwareconsulting.com/msswc/blog/post.aspx?id=ff343c8c-6762-42a2-a43f-57ba41568007</guid>
         <pubDate>Mon, 05 Sep 2011 04:34:36 +0000</pubDate>
      <feedburner:origLink>http://www.mssoftwareconsulting.com/msswc/blog/post/Game-Code-Kata-e28093-Krypto.aspx</feedburner:origLink></item>
      <item>
         <title>More Interview Questions</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/QH6SUsG6sLg/More-Interview-Questions.aspx</link>
         <description>&lt;p&gt;It is a good idea to occasionally run through some interview-type questions to keep yourself up to speed even if you are not planning on interviewing anytime soon. You never know when you may need to interview, plus it just helps to reinforce the basics by making you explain them thoroughly. Here are some more interview questions that Scott Hanselman posted awhile back at &lt;a rel="nofollow" target="_blank" href="http://feedproxy.google.com/~r/ScottHanselman/~3/0bCacFbFADQ/NewInterviewQuestionsForSeniorSoftwareEngineers.aspx"&gt;New Interview Questions for Senior Software Engineers&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;What is something substantive that you've done to improve as a developer in your career? &lt;/li&gt;    &lt;li&gt;Would you call yourself a craftsman (craftsperson) and what does that word mean to you? &lt;/li&gt;    &lt;li&gt;Implement a &amp;lt;basic data structure&amp;gt; using &amp;lt;some language&amp;gt; on &amp;lt;paper|whiteboard|notepad&amp;gt;. &lt;/li&gt;    &lt;li&gt;What is SOLID? &lt;/li&gt;    &lt;li&gt;Why is the Single Responsibility Principle important? &lt;/li&gt;    &lt;li&gt;What is Inversion of Control? How does that relate to dependency injection? &lt;/li&gt;    &lt;li&gt;How does a 3 tier application differ from a 2 tier one? &lt;/li&gt;    &lt;li&gt;Why are interfaces important? &lt;/li&gt;    &lt;li&gt;What is the Repository pattern? The Factory Pattern? Why are patterns important? &lt;/li&gt;    &lt;li&gt;What are some examples of anti-patterns? &lt;/li&gt;    &lt;li&gt;Who are the Gang of Four? Why should you care? &lt;/li&gt;    &lt;li&gt;How do the MVP, MVC, and MVVM patterns relate? When are they appropriate? &lt;/li&gt;    &lt;li&gt;Explain the concept of Separation of Concerns and it's pros and cons. &lt;/li&gt;    &lt;li&gt;Name three primary attributes of object-oriented design. Describe what they mean and why they're important. &lt;/li&gt;    &lt;li&gt;Describe a pattern that is NOT the Factory Pattern? How is it used and when? &lt;/li&gt;    &lt;li&gt;You have just been put in charge of a legacy code project with maintainability problems. What kind of things would you look to improve to get the project on a stable footing? &lt;/li&gt;    &lt;li&gt;Show me a portfolio of all the applications you worked on, and tell me how you contributed to design them. &lt;/li&gt;    &lt;li&gt;What are some alternate ways to store data other than a relational database? Why would you do that, and what are the trade-offs? &lt;/li&gt;    &lt;li&gt;Explain the concept of convention over configuration, and talk about an example of convention over configuration you have seen in the wild. &lt;/li&gt;    &lt;li&gt;Explain the differences between stateless and stateful systems, and impacts of state on parallelism. &lt;/li&gt;    &lt;li&gt;Discuss the differences between Mocks and Stubs/Fakes and where you might use them (answers aren't that important here, just the discussion that would ensue). &lt;/li&gt;    &lt;li&gt;Discuss the concept of YAGNI and explain something you did recently that adhered to this practice. &lt;/li&gt;    &lt;li&gt;Explain what is meant by a sandbox, why you would use one, and identify examples of sandboxes in the wild. &lt;/li&gt;    &lt;li&gt;Concurrency      &lt;ul&gt;       &lt;li&gt;What's the difference between Locking and Lockless (Optimistic and Pessimistic) concurrency models? &lt;/li&gt;        &lt;li&gt;What kinds of problems can you hit with locking model? And a lockless model? &lt;/li&gt;        &lt;li&gt;What trade offs do you have for resource contention? &lt;/li&gt;        &lt;li&gt;How might a task-based model differ from a threaded model? &lt;/li&gt;        &lt;li&gt;What's the difference between asynchrony and concurrency?&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Are you still writing code? Do you love it? &lt;/li&gt;    &lt;li&gt;You've just been assigned to a project in a new technology how would you get started? &lt;/li&gt;    &lt;li&gt;How does the addition of Service Orientation change systems? When is it appropriate to use? &lt;/li&gt;    &lt;li&gt;What do you do to stay abreast of the latest technologies and tools? &lt;/li&gt;    &lt;li&gt;What is the difference between &amp;quot;set&amp;quot; logic, and &amp;quot;procedural&amp;quot; logic. When would you use each one and why? &lt;/li&gt;    &lt;li&gt;What Source Control systems have you worked with? &lt;/li&gt;    &lt;li&gt;What is Continuous Integration?&amp;#160; Have you used it and why is it important? &lt;/li&gt;    &lt;li&gt;Describe a software development life cycle that you've managed. &lt;/li&gt;    &lt;li&gt;How do you react to people criticizing your code/documents? &lt;/li&gt;    &lt;li&gt;Whose blogs or podcasts do you follow? Do you blog or podcast? &lt;/li&gt;    &lt;li&gt;Tell me about some of your hobby projects that you've written in your off time. &lt;/li&gt;    &lt;li&gt;What is the last programming book you read? &lt;/li&gt;    &lt;li&gt;Describe, in as much detail as you think is relevant, as deeply as you can, what happens when I type &amp;quot;cnn.com&amp;quot; into a browser and press &amp;quot;Go&amp;quot;. &lt;/li&gt;    &lt;li&gt;Describe the structure and contents of a design document, or a set of design documents, for a multi-tiered web application. &lt;/li&gt;    &lt;li&gt;What's so great about &amp;lt;cool web technology of the day&amp;gt;? &lt;/li&gt;    &lt;li&gt;How can you stop your DBA from making off with a list of your users’ passwords? &lt;/li&gt;    &lt;li&gt;What do you do when you get stuck with a problem you can't solve? &lt;/li&gt;    &lt;li&gt;If your database was under a lot of strain, what are the first few things you might consider to speed it up? &lt;/li&gt;    &lt;li&gt;What is SQL injection? &lt;/li&gt;    &lt;li&gt;What's the difference between unit test and integration test? &lt;/li&gt;    &lt;li&gt;Tell me about 3 times you failed. &lt;/li&gt;    &lt;li&gt;What is Refactoring ? Have you used it and it is important? Name three common refactorings. &lt;/li&gt;    &lt;li&gt;You have two computers, and you want to get data from one to the other. How could you do it? &lt;/li&gt;    &lt;li&gt;Left to your own devices, what would you create? &lt;/li&gt;    &lt;li&gt;Given Time, Cost, Client satisfaction and Best Practices, how will you prioritize them for a project you are working on? Explain why. &lt;/li&gt;    &lt;li&gt;What's the difference between a web server, web farm and web garden? How would your web application need to change for each? &lt;/li&gt;    &lt;li&gt;What value do daily builds, automated testing, and peer reviews add to a project? What disadvantages are there? &lt;/li&gt;    &lt;li&gt;What elements of OO design are most prone to abuse? How would you mitigate that? &lt;/li&gt;    &lt;li&gt;When do you know your code is ready for production? &lt;/li&gt;    &lt;li&gt;What's YAGNI? Is this list of questions an example? &lt;/li&gt;    &lt;li&gt;Describe to me some bad code you've read or inherited lately.&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/QH6SUsG6sLg" height="1" width="1"/&gt;</description>
         <author>mark shiffer</author>
         <guid isPermaLink="false">http://www.mssoftwareconsulting.com/msswc/blog/post.aspx?id=5155e37d-ec88-4670-a6ce-0036264499ee</guid>
         <pubDate>Mon, 05 Sep 2011 03:56:32 +0000</pubDate>
      <feedburner:origLink>http://www.mssoftwareconsulting.com/msswc/blog/post/More-Interview-Questions.aspx</feedburner:origLink></item>
      <item>
         <title>Code Kata – Bonus</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/toJHmyExDv8/Code-Kata-e28093-Bonus.aspx</link>
         <description>&lt;p&gt;This one came courtesy of &lt;a rel="nofollow" target="_blank" href="http://blogs.tedneward.com/2010/05/10/Code+Kata+RoboStack.aspx"&gt;Ted Neward&lt;/a&gt;, who got it from the University of Virginia’s programming contest way back when:&lt;/p&gt;  &lt;h1&gt;RoboStack&lt;/h1&gt;  &lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; You work for a manufacturing company, and they have just received their newest piece of super-modern hardware, a highly efficient assembly-line mechanized pneumatic item manipulator, also known in some circles as a &amp;quot;robotic arm&amp;quot;. It is driven by a series of commands, and your job is to write the software to drive the arm. The initial test will be to have the arm move a series of blocks around.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Context:&lt;/strong&gt; The test begins with &lt;em&gt;n&lt;/em&gt; number of blocks, laid out sequentially next to each other, each block with a number on it. (You may safely assume that &lt;em&gt;n&lt;/em&gt; never exceeds 25.) So, if &lt;em&gt;n&lt;/em&gt; is 4, then the blocks are laid out (starting from 0) as:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;0: 0&lt;/p&gt;    &lt;p&gt;1: 1&lt;/p&gt;    &lt;p&gt;2: 2&lt;/p&gt;    &lt;p&gt;3: 3&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The display output here is the block-numbered &amp;quot;slot&amp;quot;, then a colon, then the block(s) that are stacked in that slot, lowest to highest in left to right order. Thus, in the following display:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;0:&lt;/p&gt;    &lt;p&gt;1:&lt;/p&gt;    &lt;p&gt;2: 0 1 2 3&lt;/p&gt;    &lt;p&gt;3:&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The 3 block is stacked on top of the 2 block is stacked on top of the 1 block is stacked on top of the 0 block, all in slot 2. This can be shortened to the representation [0:, 1:, 2: 0 1 2 3, 3:] for conciseness.&lt;/p&gt;  &lt;p&gt;The arm understands a number of different commands, as well as an optic sensor. (Yeah, the guys who created the arm were good enough to write code that knows how to read the number off a block, but not to actually drive the arm. Go figure.) The commands are as follows, where &lt;em&gt;a&lt;/em&gt; and &lt;em&gt;b&lt;/em&gt; are valid block numbers (meaning they are between 0 and &lt;em&gt;n&lt;/em&gt;-1):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&amp;quot;move &lt;em&gt;a&lt;/em&gt; onto &lt;em&gt;b&lt;/em&gt;&amp;quot; This command orders the arm to find block &lt;em&gt;a&lt;/em&gt;, and return any blocks stacked on top of it to their original position. Do the same for block &lt;em&gt;b&lt;/em&gt;, then stack block &lt;em&gt;a&lt;/em&gt; on top of &lt;em&gt;b&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;&amp;quot;move &lt;em&gt;a&lt;/em&gt; over &lt;em&gt;b&lt;/em&gt;&amp;quot; This command orders the arm to find block &lt;em&gt;a&lt;/em&gt;, and return any blocks stacked on top of it to their original position. Then stack block &lt;em&gt;a&lt;/em&gt; on top of the stack of blocks containing &lt;em&gt;b&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;&amp;quot;pile &lt;em&gt;a&lt;/em&gt; onto &lt;em&gt;b&lt;/em&gt;&amp;quot; This command orders the arm to find the stack of blocks containing block &lt;em&gt;b&lt;/em&gt;, and return any blocks stacked on top of it to their original position. Then the arm must find the stack of blocks containing block &lt;em&gt;a&lt;/em&gt;, and take the stack of blocks starting from &lt;em&gt;a&lt;/em&gt; on upwards (in other words, don't do anything with any blocks on top of &lt;em&gt;a&lt;/em&gt;) and put that stack on top of block &lt;em&gt;b&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;&amp;quot;pile &lt;em&gt;a&lt;/em&gt; over &lt;em&gt;b&lt;/em&gt;&amp;quot; This command orders the arm to find the stack of blocks containing block &lt;em&gt;a&lt;/em&gt; and take the stack of blocks starting from &lt;em&gt;a&lt;/em&gt; on upwards (in other words, don't do anything with any blocks on top of &lt;em&gt;a&lt;/em&gt;) and put that stack on top of the stack of blocks containing block &lt;em&gt;b&lt;/em&gt; (in other words, don't do anything with the stack of blocks containing&lt;em&gt;b&lt;/em&gt;, either). &lt;/li&gt;    &lt;li&gt;&amp;quot;quit&amp;quot; This command tells the arm to shut down (and thus terminates the simulation).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Note that if the input command sequence accidentally offers a command where &lt;em&gt;a&lt;/em&gt; and &lt;em&gt;b&lt;/em&gt; are the same value, that command is illegal and should be ignored.&lt;/p&gt;  &lt;p&gt;As an example, then, if we have 4 blocks in the state [0: 0, 1: 1, 2: 2, 3: 3], and run a &amp;quot;move 2 onto 3&amp;quot;, we get [0: 0, 1: 1, 2:, 3: 3 2]. If we then run a &amp;quot;pile 3 over 1&amp;quot;, we should end up with [0: 0, 1: 1 3 2, 2:, 3:]. And so on.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; n = 10. Run these commands:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;move 9 onto 1 &lt;/li&gt;    &lt;li&gt;move 8 over 1 &lt;/li&gt;    &lt;li&gt;move 7 over 1 &lt;/li&gt;    &lt;li&gt;move 6 over 1 &lt;/li&gt;    &lt;li&gt;pile 8 over 6 &lt;/li&gt;    &lt;li&gt;pile 8 over 5 &lt;/li&gt;    &lt;li&gt;move 2 over 1 &lt;/li&gt;    &lt;li&gt;move 4 over 9 &lt;/li&gt;    &lt;li&gt;quit&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The result should be [0: 0, 1: 1 9 2 4, 2:, 3: 3, 4:, 5: 5 8 7 6, 6:, 7:, 8:, 9:]&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Challenges:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Implement the Towers of Hanoi (or as close to it as you can get) using this system. &lt;/li&gt;    &lt;li&gt;Add an optimizer to the arm, in essence reading in the entire program (up to &amp;quot;quit&amp;quot;), finding shorter paths and/or different commands to achieve the same result. &lt;/li&gt;    &lt;li&gt;Add a visual component to the simulation, displaying the arm as it moves over each block and moves blocks around. &lt;/li&gt;    &lt;li&gt;Add another robotic arm, and allow commands to be given simultaneously. This will require some thought—does each arm execute a complete command before allowing the other arm to execute (which reduces the performance having two arms might offer), or can each arm act entirely independently? The two (or more) arms will probably need separate command streams, but you might try running them with one command stream just for grins. Note that deciding how to synchronized the arms so they don't conflict with one another will probably require adding some kind of synchronization instructions into the stream as well.&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/toJHmyExDv8" height="1" width="1"/&gt;</description>
         <author>mark shiffer</author>
         <guid isPermaLink="false">http://www.mssoftwareconsulting.com/msswc/blog/post.aspx?id=3ac9beff-ff07-4701-97c9-a24b472a509b</guid>
         <pubDate>Mon, 05 Sep 2011 03:33:13 +0000</pubDate>
      <feedburner:origLink>http://www.mssoftwareconsulting.com/msswc/blog/post/Code-Kata-e28093-Bonus.aspx</feedburner:origLink></item>
      <item>
         <title>Code Kata 16–21 of 21</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/_au9y7kZtKQ/Code-Kata-16e2809321-of-21.aspx</link>
         <description>&lt;p&gt;I came across this site quite a while back and have been meaning to blog about it. The site is &lt;a rel="nofollow" target="_blank" href="http://codekata.pragprog.com/"&gt;CodeKata&lt;/a&gt;, and the premise is essentially to give reasonably interesting problems that can be solved using code in order to practice and hone your skills. Not everything is a coding problem, but where I can see these coming in handy are using the katas to learn new languages. I always learn better when I have something to implement as I learn. Anyway, my original intention was to just link to the site, however it looks like the site hasn’t been updated in 4 years! It concerns me that it might not be around if I merely link to it, so I am going to copy the katas here for future reference. I hope Dave doesn’t mind.&lt;/p&gt;  &lt;h1&gt;Kata 16 – Business Rules&lt;/h1&gt;  &lt;p&gt;How can you tame a wild (and changing) set of business rules?&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Imagine you’re writing an order processing application for a large company. In the past, this company used a fairly random mixture of manual and ad-hoc automated business practices to handle orders; they now want to put all these various ways of hanadling orders together into one whole: your application. However, they (and their customers) have come to cherish the diversity of their business rules, and so they tell you that you’ll have to bring all these rules forward into the new system.&lt;/p&gt;  &lt;p&gt;When you go in to meet the existing order entry folks, you discover that their business practices border on chaotic: no two product lines have the same set of processing rules. To make it worse, most of the rules aren’t written down: you’re often told something like &amp;quot;oh, Carol on the second floor handles that kind of order.&amp;quot;&lt;/p&gt;  &lt;p&gt;During first day of meetings, you’ve decided to focus on payments, and in particular on the processing required when a payment was received by the company. You come home, exhausted, with a legal pad full of rule snippets such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If the payment is for a physical product, generate a packing slip for shipping. &lt;/li&gt;    &lt;li&gt;If the payment is for a book, create a duplicate packing slip for the royalty department. &lt;/li&gt;    &lt;li&gt;If the payment is for a membership, activate that membership. &lt;/li&gt;    &lt;li&gt;If the payment is an upgrade to a membership, apply the upgrade. &lt;/li&gt;    &lt;li&gt;If the payment is for a membership or upgrade, e-mail the owner and inform them of the activation/upgrade. &lt;/li&gt;    &lt;li&gt;If the payment is for the video &amp;quot;Learning to Ski,&amp;quot; add a free &amp;quot;First Aid&amp;quot; video to the packing slip (the result of a court decision in 1997). &lt;/li&gt;    &lt;li&gt;If the payment is for a physical product or a book, generate a commission payment to the agent. &lt;/li&gt;    &lt;li&gt;and so on, and so on, for seven long, yellow pages.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And each day, to your horror, you gather more and more pages of these rules.&lt;/p&gt;  &lt;p&gt;Now you’re faced with implementing this system. The rules are complicated, and fairly arbitrary. What’s more, you know that they’re going to change: once the system goes live, all sorts of special cases will come out of the woodwork.&lt;/p&gt;  &lt;h5&gt;Objectives&lt;/h5&gt;  &lt;p&gt;How can you tame these wild business rules? How can you build a system that will be flexible enough to handle both the complexity and the need for change? And how can you do it without condemming yourself to years and years of mindless support?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Kata 17 -&amp;#160; More Business Processing&lt;/h1&gt;  &lt;p&gt;The rules that specify the overall processing of an order can be complex too, particularly as they often involve waiting around for things to happen.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In Kata Sixteen we had a look at the business rules that applied when we received payment for various kinds of product. Handling payments is just a small part of the overall workflow required to process an order. For the company whose application we’re looking at, order processing looks something like: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If we accept an order over the web, then we have to wait for payment to arrive, unless it’s a credit-card order. In the case of credit card orders, we can process the order immediately and ship the goods, but only if the goods are in stock. If they are not currently in stock, we have to delay processing credit card orders until the become available again. &lt;/li&gt;    &lt;li&gt;We can receive a check in payment of an existing order, in which case we ship the goods (unless they are not in stock, in which case we hold the check until the goods become available). &lt;/li&gt;    &lt;li&gt;We can receive a purchase order (PO) for a new order (we only accept these from companies with an established credit account). In this case we ship the goods (assuming they are in stock) and also generate an invoice against the PO. At some point in the future we’ll receive payment against this invoice and the order will be complete. &lt;/li&gt;    &lt;li&gt;At any time before the goods are shipped the customer may cancel an order.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Each step in this process may occur many days after the previous step. For example, we may take an order over the web on Monday, receive a check for this order on Thursday, then ship the goods and deposit the check when the item is received from our own suppliers on the following Tuesday.&lt;/p&gt;  &lt;p&gt;How can we design an application to support these kinds of rules? Of course, businesses change the rules all the time, so we better make sure that anything we come up makes it easy to update the workflow.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Kata 18 – Transitive Dependencies&lt;/h1&gt;  &lt;p&gt;Let’s write some code that calculates how dependencies propagate between things such as classes in a program.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Highly coupled code is code where the dependencies between things are dense, lots of things depend on other things. This kind of program is hard to understand, tough to maintain, and tends to be fragile, breaking easily when things change. &lt;/p&gt;  &lt;p&gt;There are many different kinds of coupling in code. One of the easiest to work with programatically is &amp;#92;emph{static coupling}, where we’re concerned with the relationships between chunks of source code. Simplisticly, we can say that class A is statically coupled to class B if the compiler needs the definition of B in order to compile&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;In many languages, static dependencies can be determined by source&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;code analysis. Tools such as &lt;tt&gt;makedepend&lt;/tt&gt; (for C programs) and &lt;tt&gt;JDepend&lt;/tt&gt; (for Java) look for explicit dependencies in the source and list them out.&lt;/p&gt;  &lt;p&gt;One of the insidious things about dependencies is that they are transitive—if A depends on B and B depends on C, then A also depends on C. So, let’s write some code that calculates the full set of dependencies for a group of items. The code takes as input a set of lines where the first token is the name of an item. The remaining tokens are the names of things that this first item depends on. Given the following input, we know that A directly depends on B and C, B depends on C and E, and so on.&lt;/p&gt;  &lt;pre&gt;  A   B   C
  B   C   E
  C   G
  D   A   F
  E   F
  F   H&lt;/pre&gt;

&lt;p&gt;The program should use this data to calculate the full set of dependencies. For example, looking at B, we see it directly depends on C and E. C in turn relies on G, E relies on F, and F relies on H. This means that B ultimately relies on C, E, F, G, and H. In fact, the full set of dependencies for the previous example is:&lt;/p&gt;

&lt;pre&gt;  A   B C E F G H
  B   C E F G H
  C   G
  D   A B C E F G H
  E   F H
  F   H&lt;/pre&gt;

&lt;p&gt;Let’s express this using unit tests. The following code assumes that our dependency calculator is a class with an &lt;tt&gt;add_direct()&lt;/tt&gt; method to add the direct dependencies for an item, and a &lt;tt&gt;dependencies_for()&lt;/tt&gt; method to return the full list of dependencies for an item. The code uses Ruby’s &lt;tt&gt;%w{…}&lt;/tt&gt; construct, which builds an array of strings from its argument.&lt;/p&gt;

&lt;pre&gt;  def test_basic
    dep = Dependencies.new
    dep.add_direct('A', %w{ B C } )
    dep.add_direct('B', %w{ C E } )
    dep.add_direct('C', %w{ G   } )
    dep.add_direct('D', %w{ A F } )
    dep.add_direct('E', %w{ F   } )
    dep.add_direct('F', %w{ H   } )

    assert_equal( %w{ B C E F G H },   dep.dependencies_for('A'))
    assert_equal( %w{ C E F G H },     dep.dependencies_for('B'))
    assert_equal( %w{ G },             dep.dependencies_for('C'))
    assert_equal( %w{ A B C E F G H }, dep.dependencies_for('D'))
    assert_equal( %w{ F H },           dep.dependencies_for('E'))
    assert_equal( %w{ H },             dep.dependencies_for('F'))
  end&lt;/pre&gt;

&lt;p&gt;Stop reading now, and start coding. Once you’ve got your code working, try feeding it the following dependencies.&lt;/p&gt;

&lt;pre&gt;  A B
  B C
  C A&lt;/pre&gt;

&lt;p&gt;Does it work correctly? If not, ask yourself is this is a condition you should have considered during testing.&lt;/p&gt;

&lt;p&gt;Once you’ve got your code working with all the various test cases you can imagine, let’s think for a minute about performance. Say we were using this code to find all the relationships between the inhabitants of the United Kingdom. How would your code perform with 55-60 million items?&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Kata 19 – Word Chains&lt;/h1&gt;

&lt;p&gt;Write a program that solves word-chain puzzles.&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There’s a type of puzzle where the challenge is to build a chain of words, starting with one particular word and ending with another. Successive entries in the chain must all be real words, and each can differ from the previous word by just one letter. For example, you can get from &amp;quot;cat&amp;quot; to &amp;quot;dog&amp;quot; using the following chain.&lt;/p&gt;

&lt;pre&gt;  cat
  cot
  cog
  dog&lt;/pre&gt;

&lt;p&gt;The objective of this kata is to write a program that accepts start and end words and, using words from the&lt;a rel="nofollow" target="_blank" href="http://pragprog.com/katadata/wordlist.txt"&gt;dictionary&lt;/a&gt;, builds a word chain between them. For added programming fun, return the shortest word chain that solves each puzzle. For example, my Powerbook running Ruby can turn &amp;quot;lead&amp;quot; into &amp;quot;gold&amp;quot; in four steps (lead, load, goad, gold), taking about 20 seconds. Turning &amp;quot;ruby&amp;quot; into &amp;quot;code&amp;quot; takes six steps (ruby, rubs, robs, rods, rode, code) and 90 seconds, while turning &amp;quot;code&amp;quot; into &amp;quot;ruby&amp;quot; (again in six steps) takes about an hour. Go figure…&lt;/p&gt;

&lt;p&gt;Update: It turns out that my original algorithm was pretty dumb: a better approach greatly speeds up search and makes it symetrical. It now does all the above examples in between 0.5s and 1s.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Kata 20 – Klondike&lt;/h1&gt;

&lt;p&gt;Experiment with different heuristics for playing the solitaire game Klondike.&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The solitaire game Klondike is probably the most widely played in the world (particularly if you’re a Window’s user, where it has been available since Windows 3.1). It’s a simple game.&lt;/p&gt;

&lt;p&gt;Cards are dealt face down onto the seven piles in the tableau. The first pile receives one card, the next two, up to the seventh pile, which not surprisingly has seven cards initially. The top card on each pile is turned face-up, and the undealt cards are placed on the Stock pile, all face down. Here’s a &lt;a rel="nofollow" target="_blank" href="http://www.pragprog.com/images/20_board.jpg"&gt;picture of the game (52kb)&lt;/a&gt; if you haven’t seen it before.&lt;/p&gt;

&lt;p&gt;The idea is to build up four piles of cards in their suits on the foundation area (one pile for the clubs, one for the diamonds, and so on). The piles must start with the ace and end with the king.&lt;/p&gt;

&lt;p&gt;The available moves (in no particular order) are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If the Stock becomes empty, turn the entire discard pile over and make it the new Stock. &lt;/li&gt;

  &lt;li&gt;Turn over the top card of the Stock and place it face-up on the Discard pile. &lt;/li&gt;

  &lt;li&gt;Move a card from the tableau or discard pile to one of the foundation piles. If the foundation pile is empty, only an Ace can be placed there, otherwise only the next highest card in the appropriate suit can be placed (so if a foundation pile is currently showing a four of hearts, only the five of hearts may be placed there). &lt;/li&gt;

  &lt;li&gt;Move the top card of the discard pile to one of the tableau piles. This card must be one less in rank and opposite in color to the card at the top of the destination tableau. &lt;/li&gt;

  &lt;li&gt;Move one or more cards from one tableau pile to another. If multiple cards are moved, they must be a sequence ascending in rank and alternating in color. The card moved (or the top of the sequence moved) must be one less in rank and opposite in color to the card at the top of the destination tableau. If the move leaves a face-down card to the top of the original pile, turn it over. &lt;/li&gt;

  &lt;li&gt;If a move leaves a tableau pile empty, an exposed King at the top of a tableau or discard pile, or a sequence starting with a King on a tableau pile, may be moved to it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, in the game pictured about, a possible first set of moves might be:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Move the Queen of Hearts onto the King of Clubs. &lt;/li&gt;

  &lt;li&gt;This leaves the first pile in the tableau empty, so the combined King/Queen can be moved to it. The card originally beneath the King is turned over. &lt;/li&gt;

  &lt;li&gt;The Jack of Clubs can be moved on to the Queen of Hearts, and the card beneath the Jack revealed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The game is won when all cards are moved to the foundation, and lost when the only remaining moves form an endless loop.&lt;/p&gt;

&lt;p&gt;The game is simple to play, but the strategy isn’t immediately obvious. For example, is it always a good idea to move a card from the tableau to the foundation, or is it sometimes better to leave it there to give yourself something to build down on? Is it a good idea to make a move which leaves a tableau pile empty if you don’t immediately have a King to move into the gap? If you have two possible moves which will result in exposing a new tableau card, should you expose the one on the longest or shortest tableau?&lt;/p&gt;

&lt;p&gt;This kata is in two parts.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Come up with an infrastructure so you can have the computer deal and play games of Klondike. &lt;/li&gt;

  &lt;li&gt;Use that infrastructure to experiment with strategies to see if you can increase the number of times you win (perhaps you could tabulate the number of times the machine wins a random set of 1,000 games for each strategy you try).&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Objectives&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;At one level, this is an exercise in design—how can the basic game be modeled in code? Where should the validation of moves be located (in the cards, in the various piles, in some kind of game overseer, or …)? How can we detect that we’ve lost? &lt;/li&gt;

  &lt;li&gt;Once the basic game is in place, it becomes an exercise in imagination: what strategies can be applied, and how do various sub-strategies interact?&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Kata 21 – Simple Lists&lt;/h1&gt;

&lt;p&gt;Perhaps there’s more to the humble list of values than you might think. Let’s experiment with some basic list processing.&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lists are one of the first data structures we learn as programmers. But familiarity doesn’t mean that we can’t learn a little from them. &lt;/p&gt;

&lt;p&gt;For this kata we’re going to code up three implementations of a list that has the following basic interface:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The list consists of nodes. Each node has a string value, along with whatever housekeeping the list itself needs. &lt;/li&gt;

  &lt;li&gt;New nodes are added to the end of the list. &lt;/li&gt;

  &lt;li&gt;You can ask the list if it contains a given string. If it does, it returns the node containing that string. &lt;/li&gt;

  &lt;li&gt;You can delete a node from the list. &lt;/li&gt;

  &lt;li&gt;You can ask the list to return an array of all its values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s a basic set of unit tests to illustrate the behavior.&lt;/p&gt;

&lt;pre&gt;    list = List.new
    assert_nil(list.find(&amp;quot;fred&amp;quot;))
    list.add(&amp;quot;fred&amp;quot;)
    assert_equal(&amp;quot;fred&amp;quot;, list.find(&amp;quot;fred&amp;quot;).value())
    assert_nil(list.find(&amp;quot;wilma&amp;quot;))
    list.add(&amp;quot;wilma&amp;quot;)
    assert_equal(&amp;quot;fred&amp;quot;,  list.find(&amp;quot;fred&amp;quot;).value())
    assert_equal(&amp;quot;wilma&amp;quot;, list.find(&amp;quot;wilma&amp;quot;).value())
    assert_equal([&amp;quot;fred&amp;quot;, &amp;quot;wilma&amp;quot;], list.values())

    list = List.new
    list.add(&amp;quot;fred&amp;quot;)
    list.add(&amp;quot;wilma&amp;quot;)
    list.add(&amp;quot;betty&amp;quot;)
    list.add(&amp;quot;barney&amp;quot;)
    assert_equal([&amp;quot;fred&amp;quot;, &amp;quot;wilma&amp;quot;, &amp;quot;betty&amp;quot;, &amp;quot;barney&amp;quot;], list.values())
    list.delete(list.find(&amp;quot;wilma&amp;quot;))
    assert_equal([&amp;quot;fred&amp;quot;, &amp;quot;betty&amp;quot;, &amp;quot;barney&amp;quot;], list.values())
    list.delete(list.find(&amp;quot;barney&amp;quot;))
    assert_equal([&amp;quot;fred&amp;quot;, &amp;quot;betty&amp;quot;], list.values())
    list.delete(list.find(&amp;quot;fred&amp;quot;))
    assert_equal([&amp;quot;betty&amp;quot;], list.values())
    list.delete(list.find(&amp;quot;betty&amp;quot;))
    assert_equal([], list.values())&lt;/pre&gt;

&lt;p&gt;For the kata, where the idea is to practice, let’s write three implementations of the list:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A singly linked list (each node has a reference to the next node). &lt;/li&gt;

  &lt;li&gt;A doubly linked list (each node has a reference to both the next and previous nodes). &lt;/li&gt;

  &lt;li&gt;Some other implementation of your choosing, except that it should use no references (pointers) to collect nodes together in the list.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Obviously, we won’t be using predefined library classes as our list implementations…&lt;/p&gt;

&lt;h5&gt;Objectives&lt;/h5&gt;

&lt;p&gt;There’s nothing magical or surprising in list implementations, but there are a fair number of boundary conditions. For example, when deleting from the singly-linked list, did you have to deal with the case of deleting the first element in the list specially?&lt;/p&gt;

&lt;p&gt;For this kata, concentrate on ways of removing as many of these boundary conditions as possible. Then ask yourself: Is the resulting code, which will contain fewer special cases, easier to read and maintain? How easy was it to eliminate these special cases? Were there trade-offs, where removing a special case in one area complicated the code in another. Is there a sweet-spot when it comes to simplifying code?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/_au9y7kZtKQ" height="1" width="1"/&gt;</description>
         <author>mark shiffer</author>
         <guid isPermaLink="false">http://www.mssoftwareconsulting.com/msswc/blog/post.aspx?id=3e3767a9-9fc4-4d88-aba9-54de8b5dc7d5</guid>
         <pubDate>Mon, 05 Sep 2011 03:31:06 +0000</pubDate>
      <feedburner:origLink>http://www.mssoftwareconsulting.com/msswc/blog/post/Code-Kata-16e2809321-of-21.aspx</feedburner:origLink></item>
      <item>
         <title>Code Kata 11-15 of 21</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/oJ_0yEjTIuU/Code-Kata-11-15-of-21.aspx</link>
         <description>&lt;p&gt;I came across this site quite a while back and have been meaning to blog about it. The site is &lt;a rel="nofollow" target="_blank" href="http://codekata.pragprog.com/"&gt;CodeKata&lt;/a&gt;, and the premise is essentially to give reasonably interesting problems that can be solved using code in order to practice and hone your skills. Not everything is a coding problem, but where I can see these coming in handy are using the katas to learn new languages. I always learn better when I have something to implement as I learn. Anyway, my original intention was to just link to the site, however it looks like the site hasn’t been updated in 4 years! It concerns me that it might not be around if I merely link to it, so I am going to copy the katas here for future reference. I hope Dave doesn’t mind.&lt;/p&gt;  &lt;h1&gt;Kata 11 – Sorting it Out&lt;/h1&gt;  &lt;p&gt;Just because we need to sort something doesn’t necessarily mean we need to use a conventional sorting algorithm.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We use sorting routines all the time; putting customer records in to name order, arranging orders by value (and even sorting the letters in a word back in &lt;a rel="nofollow" target="_blank" href="http://pragdave.blogs.pragprog.com/Practices/Kata/KataSix.rdoc"&gt;KataSix&lt;/a&gt;). Most of the time we (wisely) use one of the sort routines built in to our language’s library (such as C’s &lt;tt&gt;qsort&lt;/tt&gt; and Java’s &lt;tt&gt;java.Collections.sort&lt;/tt&gt;). After all, very clever folks spent a lot of time getting these library routines tuned for speed and/or memory usage.&lt;/p&gt;  &lt;p&gt;However, there are times when whipping up a sort of our own can outperform these generic routines. Our challenge this week is to implement a couple of different sorts. (However, at the risk of giving the game away, these sorts both have something in common).&lt;/p&gt;  &lt;h5&gt;Sorting Balls&lt;/h5&gt;  &lt;p&gt;In the Pragmatic Lottery (motto: &lt;em&gt;There’s One Born Every Minute, and it Might Just Be You!&lt;/em&gt;), we select each week’s winning combination by drawing balls. There are sixty balls, numbered (not surprisingly, as we are programmers) 0 to 59. The balls are drawn by the personable, but somewhat distracted, Daisy Mae. As a result, some weeks five numbers are drawn, while other weeks seven, nine, or even fifteen balls make it to the winner’s rack. Regardless of the number of balls drawn, our viewers need to see the list of winning numbers in sorted order just as soon as possible. So, your challenge is to come up with some code that accepts each number as it is drawn and presents the sorted list of numbers so far. The tests might look something like:&lt;/p&gt;  &lt;pre&gt;    rack = Rack.new
    assert_equal([], rack.balls)
    rack.add(20)
    assert_equal([ 20 ], rack.balls)
    rack.add(10)
    assert_equal([ 10, 20 ], rack.balls)
    rack.add(30)
    assert_equal([ 10, 20, 30 ], rack.balls)&lt;/pre&gt;

&lt;h5&gt;Sorting Characters&lt;/h5&gt;

&lt;p&gt;Our resident conspiracy expert, Dr. X, is looking for hidden messages in the collected publications of Hugh Hefner. Dr. X believes the message is hidden in the individual letters, so rather than get distracted by the words, he’s asked us to write a program to take a block of text and return the letters it contains, sorted. Given the text:&lt;/p&gt;

&lt;pre&gt;  When not studying nuclear physics, Bambi likes to play
  beach volleyball.&lt;/pre&gt;

&lt;p&gt;our program would return:&lt;/p&gt;

&lt;pre&gt;  aaaaabbbbcccdeeeeeghhhiiiiklllllllmnnnnooopprsssstttuuvwyyyy&lt;/pre&gt;

&lt;p&gt;The program ignores punctuation, and maps upper case to lower case.&lt;/p&gt;

&lt;p&gt;Are there any ways to perform this sort cheaply, and without using built-in libraries?&lt;/p&gt;

&lt;h1&gt;&amp;#160;&lt;/h1&gt;

&lt;h1&gt;Kata 12 – Best Sellers&lt;/h1&gt;

&lt;p&gt;Consider the implementation of a top-ten best sellers list for a high volume web store.&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A &lt;em&gt;GedankenKata&lt;/em&gt; this week: no code needed (although writing short prototypes might help you come to a conclusion).&lt;/p&gt;

&lt;p&gt;Say you’re writing code for an online site that sells things (something like Amazon). Your site is wildly popular, and you sell millions of items each day.&lt;/p&gt;

&lt;p&gt;The marketing department wants the home page to display a top-ten list of the best selling items over the last 24 hours, with the list being updated each hour.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;How would you implement this? &lt;/li&gt;

  &lt;li&gt;Are there any changes you could ask for to make the implementation easier? &lt;/li&gt;

  &lt;li&gt;What would be the impact if they later came back and said: 
    &lt;ul&gt;
      &lt;li&gt;only update the list once per day; &lt;em&gt;or&lt;/em&gt;&lt;/li&gt;

      &lt;li&gt;we need the list updated in real time: each time the home page is displayed we need the list to reflect the 24 hours up until that point.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This kata might be deeper than it first appears. You might want to consider database vs. in-memory solutions, data structures that allow aging, time-space tradeoffs, and the like.&lt;/p&gt;

&lt;h1&gt;&amp;#160;&lt;/h1&gt;

&lt;h1&gt;Kata 13 – Counting Code Lines&lt;/h1&gt;

&lt;p&gt;Counting lines of code in Java source is not quite as simple as it seems.&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This week let’s write something vaguely useful: a utility that counts
  &lt;br /&gt;the number of lines of actual code in a Java source file. For the purpose

  &lt;br /&gt;of this exercise, a line is counted if it contains something other than

  &lt;br /&gt;whitespace or text in a comment. Some simple examples:&lt;/p&gt;

&lt;pre&gt;  -   // This file contains 3 lines of code
  1   public interface Dave {
  -     /**
  -      * count the number of lines in a file
  -      */
  2     int countLines(File inFile); // not the real signature!
  3   }&lt;/pre&gt;

&lt;p&gt;and…&lt;/p&gt;

&lt;pre&gt;  -   /*****
  -   * This is a test program with 5 lines of code
  -   *  &amp;#92;/* no nesting allowed!
  -   //*****//***/// Slightly pathological comment ending...
  -
  1  public class Hello {
  2      public static final void main(String [] args) { // gotta love Java
  -          // Say hello
  3        System./*wait*/out./*for*/println/*it*/(&amp;quot;Hello/*&amp;quot;);
  4      }
  -
  5  }&lt;/pre&gt;

&lt;p&gt;Remember that Java comments are either &amp;quot;&lt;tt&gt;//&lt;/tt&gt;&amp;quot; to the end of line, or &amp;quot;&lt;tt&gt;/*&lt;/tt&gt;&amp;quot; to the next &amp;quot;&lt;tt&gt;*/&lt;/tt&gt;&amp;quot;. The block comments do not nest. There may be multiple &lt;tt&gt;/*…*/&lt;/tt&gt; comments on a line. Whitespace includes tabs, spaces, carriage returns, and vertical tabs. Oh, and remember that comment start sequences that appear inside Java strings should be ignored.&lt;/p&gt;

&lt;h5&gt;Goals of the Kata&lt;/h5&gt;

&lt;p&gt;The mixture of line-based things (single line comments, blank lines, and so on) with the stream-based block comments can make solutions slightly ugly. While coding your solution, consider the structure of your code, and see how well it fits the structure of the problem. As with most of these kata, consider coding multiple alternative implementations. Does what you learned on the first tries affect your approach to subsequent ones?&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Kata 14 – Tome Swift Under Milk Wood&lt;/h1&gt;

&lt;p&gt;Trigrams can be used to mutate text into new, surreal, forms. But what heuristics do we apply to get a reasonable result?&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a boy, one of my treats was go to the shops on a Saturday and spend part of my allowance on books; for a nine-year old, I had quite a collection of Tom Swift and Hardy Boys. Wouldn’t it be great to be able to create more and more of these classic books, to be able to generate a new Tom Swift adventure on demand? &lt;/p&gt;

&lt;p&gt;OK, perhaps not. But that won’t stop us trying. I coded up a quick program to generate some swash-buckling scientific adventure on demand. It came up with:&lt;/p&gt;
&lt;dl&gt;&lt;dt&gt;&lt;/dt&gt;&lt;dd&gt;&lt;em&gt;…it was in the wind that was what he thought was his companion. I think would be a good one and accordingly the ship their situation improved. Slowly so slowly that it beat the band! You’d think no one was a low voice. &amp;quot;Don’t take any of the elements and the inventors of the little Frenchman in the enclosed car or cabin completely fitted up in front of the gas in the house and wringing her hands. &amp;quot;I’m sure they’ll fall!&amp;quot;&lt;/em&gt; &lt;/dd&gt;&lt;dt&gt;&lt;/dt&gt;&lt;dd&gt;&lt;em&gt;She looked up at them. He dug a mass of black vapor which it had refused to accept any. As for Mr. Swift as if it goes too high I’ll warn you and you can and swallow frequently. That will make the airship was shooting upward again and just before the raid wouldn’t have been instrumental in capturing the scoundrels right out of jail.&amp;quot;&lt;/em&gt;&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;Stylistically, it’s Victor Appleton meets Dylan Thomas. Technically, it’s all done with trigrams.&lt;/p&gt;

&lt;p&gt;Trigram analysis is very simple. Look at each set of three adjacent words in a document. Use the first two words of the set as a key, and remember the fact that the third word followed that key. Once you’ve finished, you know the list of individual words that can follow each two word sequence in the document. For example, given the input:&lt;/p&gt;

&lt;pre&gt;  I wish I may I wish I might&lt;/pre&gt;

&lt;p&gt;You might generate:&lt;/p&gt;

&lt;pre&gt;    &amp;quot;I wish&amp;quot; =&amp;gt; [&amp;quot;I&amp;quot;, &amp;quot;I&amp;quot;]
    &amp;quot;wish I&amp;quot; =&amp;gt; [&amp;quot;may&amp;quot;, &amp;quot;might&amp;quot;]
    &amp;quot;may I&amp;quot;  =&amp;gt; [&amp;quot;wish&amp;quot;]
    &amp;quot;I may&amp;quot;  =&amp;gt; [&amp;quot;I&amp;quot;]&lt;/pre&gt;

&lt;p&gt;This says that the words &amp;quot;I wish&amp;quot; are twice followed by the word &amp;quot;I&amp;quot;, the words &amp;quot;wish I&amp;quot; are followed once by &amp;quot;may&amp;quot; and once by &amp;quot;might&amp;quot; and so on.&lt;/p&gt;

&lt;p&gt;To generate new text from this analysis, choose an arbitrary word pair as a starting point. Use these to look up a random next word (using the table above) and append this new word to the text so far. This now gives you a new word pair at the end of the text, so look up a potential next word based on these. Add this to the list, and so on. In the previous example, we could start with &amp;quot;I may&amp;quot;. The only possible next word is &amp;quot;I&amp;quot;, so now we have:&lt;/p&gt;

&lt;pre&gt;   I may I&lt;/pre&gt;

&lt;p&gt;The last two words are &amp;quot;may I&amp;quot;, so the next word is &amp;quot;wish&amp;quot;. We then look up &amp;quot;I wish&amp;quot;, and find our choice is constrained to another &amp;quot;I&amp;quot;.&lt;/p&gt;

&lt;pre&gt;   I may I wish I&lt;/pre&gt;

&lt;p&gt;Now we look up &amp;quot;wish I&amp;quot;, and find we have a choice. Let’s choose &amp;quot;may&amp;quot;.&lt;/p&gt;

&lt;pre&gt;   I may I wish I may&lt;/pre&gt;

&lt;p&gt;Now we’re back where we started from, with &amp;quot;I may.&amp;quot; Following the same sequence, but choosing &amp;quot;might&amp;quot; this time, we get:&lt;/p&gt;

&lt;pre&gt;   I may I wish I may I wish I might&lt;/pre&gt;

&lt;p&gt;At this point we stop, as no sequence starts &amp;quot;I might.&amp;quot;&lt;/p&gt;

&lt;p&gt;Given a short input text, the algorithm isn’t too interesting. Feed it a book, however, and you give it more options, so the resulting output can be surprising.&lt;/p&gt;

&lt;p&gt;For this kata, try implementing a trigram algorithm that generates a couple of hundred words of text using a book-sized file as input. Project &lt;a rel="nofollow" target="_blank" href="http://www.gutenberg.org/"&gt;Gutenberg&lt;/a&gt; is a good source of online books (Tom Swift and His Airship is &lt;a rel="nofollow" target="_blank" href="http://sailor.gutenberg.org/etext02/03tom10.txt"&gt;here&lt;/a&gt;). Be warned that these files have DOS line endings (carriage return followed by newline).&lt;/p&gt;

&lt;h4&gt;Objectives&lt;/h4&gt;

&lt;p&gt;Kata’s are about trying something many times. In this one, what we’re experimenting with is not just the code, but the heuristics of processing the text. What do we do with punctuation? Paragraphs? Do we have to implement backtracking if we chose a next word that turns out to be a dead end?&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Kata 15 – Playing With Bits&lt;/h1&gt;

&lt;p&gt;At my son's karate school, they spend most of their time doing various exercises, with the occasional round of sparring thrown in. But every now and then the teacher finds a way to break the routine by injecting some kind of game or surprise into the mix. This kata is one of those. It's nothing serious, and unlikely to have practical benefits (unless you're working in some fairly specialized areas). &lt;/p&gt;

&lt;p&gt;Think of binary numbers: sequences of 0's and 1's. How many n-digit binary numbers are there that don't have two adjacent 1 bits? For example, for three-digit numbers, five of the possible eight combinations meet the criteria: 000, 001, 010, &lt;strike&gt;011&lt;/strike&gt;, 100, 101, &lt;strike&gt;110&lt;/strike&gt;, &lt;strike&gt;111&lt;/strike&gt;. What is the number for sequences of length 4, 5, 10, n?&lt;/p&gt;

&lt;p&gt;Having worked out the pattern, there's a second part to the question: can you prove &lt;em&gt;why&lt;/em&gt; that relationship exists?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/oJ_0yEjTIuU" height="1" width="1"/&gt;</description>
         <author>mark shiffer</author>
         <guid isPermaLink="false">http://www.mssoftwareconsulting.com/msswc/blog/post.aspx?id=4bdd863a-0bb7-43ac-9801-8d69158cace5</guid>
         <pubDate>Mon, 05 Sep 2011 03:27:35 +0000</pubDate>
      <feedburner:origLink>http://www.mssoftwareconsulting.com/msswc/blog/post/Code-Kata-11-15-of-21.aspx</feedburner:origLink></item>
      <item>
         <title>Code Kata 6-10 of 21</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/qzGY74arwZQ/Code-Kata-6-10-of-21.aspx</link>
         <description>&lt;p&gt;I came across this site quite a while back and have been meaning to blog about it. The site is &lt;a rel="nofollow" target="_blank" href="http://codekata.pragprog.com/"&gt;CodeKata&lt;/a&gt;, and the premise is essentially to give reasonably interesting problems that can be solved using code in order to practice and hone your skills. Not everything is a coding problem, but where I can see these coming in handy are using the katas to learn new languages. I always learn better when I have something to implement as I learn. Anyway, my original intention was to just link to the site, however it looks like the site hasn’t been updated in 4 years! It concerns me that it might not be around if I merely link to it, so I am going to copy the katas here for future reference. I hope Dave doesn’t mind.&lt;/p&gt;  &lt;h1&gt;Kata 6 – Anagrams&lt;/h1&gt;  &lt;p&gt;Back to non-realistic coding this week (sorry, Martin). Let's solve some crossword puzzle clues.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In England, I used to waste hour upon hour doing newspaper crosswords. As crossword fans will know, English cryptic crosswords have a totally different feel to their American counterparts: most clues involve punning or word play, and there are lots of anagrams to work through. For example, a recent Guardian&lt;a rel="nofollow" target="_blank" href="http://www.guardian.co.uk/crossword/java/blank/0,7082,-5903,00.html"&gt;crossword&lt;/a&gt; had:&lt;/p&gt;  &lt;pre&gt;  Down:
    ..
    21. Most unusual form of arrest (6)&lt;/pre&gt;

&lt;p&gt;The hint is the phrase ‘form of,’ indicating that we’re looking for an anagram. Sure enough ‘arrest’ has six letters, and can be arranged nicely into ‘rarest,’ meaning ‘most unusual.’ (Other anagrams include raster, raters, Sartre, and starer)&lt;/p&gt;

&lt;p&gt;A while back we had a thread on the Ruby mailing list about finding anagrams, and I’d like to resurrect it here. The challenge is fairly simple: given a file containing one word per line, print out all the combinations of words that are anagrams; each line in the output contains all the words from the input that are anagrams of each other. For example, your program might include in its output:&lt;/p&gt;

&lt;pre&gt;  kinship pinkish
  enlist inlets listen silent
  boaster boaters borates
  fresher refresh
  sinks skins
  knits stink
  rots sort&lt;/pre&gt;

&lt;p&gt;If you run this on the word list &lt;a rel="nofollow" target="_blank" href="http://pragdave.pragprog.com/data/wordlist.txt"&gt;here&lt;/a&gt; you should find 2,530 sets of anagrams (a total of 5,680 words). Running on a larger dictionary (about 234k words) on my OSX box produces 15,048 sets of anagrams (including all-time favorites such as actaeonidae/donatiaceae, crepitant/pittancer, and (for those readers in Florida) electoral/recollate).&lt;/p&gt;

&lt;p&gt;For added programming pleasure, find the longest words that are anagrams, and find the set of anagrams containing the most words (so &amp;quot;parsley players replays sparely&amp;quot; would not win, having only four words in the set).&lt;/p&gt;

&lt;h4&gt;Kata Objectives&lt;/h4&gt;

&lt;p&gt;Apart from having some fun with words, this kata should make you think somewhat about algorithms. The simplest algorithms to find all the anagram combinations may take inordinate amounts of time to do the job. Working though alternatives should help bring the time down by orders of magnitude. To give you a possible point of comparison, I hacked a solution together in 25 lines of Ruby. It runs on the word list from my web site in 1.5s on a 1GHz PPC. It’s also an interesting exercise in testing: can you write unit tests to verify that your code is working correctly before setting it to work on the full dictionary.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Kata 7 – How’d I Do?&lt;/h1&gt;

&lt;p&gt;The last couple of kata have been programming challenges; let’s move back into mushier, people-oriented stuff this week.&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This kata is about reading code critically—our own code. Here’s the challenge. Find a piece of code you wrote last year sometime. It should be a decent sized chunk, perhaps 500 to 1,000 lines long. Pick code which isn’t still fresh in your mind.&lt;/p&gt;

&lt;p&gt;Now we need to do some acting. Read through this code three times. Each time through, pretend something different. Each time, jot down notes on the stuff you find.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The first time through, pretend that the person who wrote this code is the best programmer you know. Look for all the examples of great code in the program. &lt;/li&gt;

  &lt;li&gt;The second time through, pretend that the person who wrote this code is the worst programmer you know. Look for all the examples of horrible code and bad design. &lt;/li&gt;

  &lt;li&gt;The third (and last) time though, pretend that you’ve been told that this code contains serious bugs, and that the client is going to sue you to bankruptcy unless you fix them. Look for every potential bug in the code. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now look at the notes you made. What is the nature of the good stuff you found? Would you find similar good stuff in the code you’re writing today. What about the bad stuff; are similar pieces of code sneaking in to your current code too. And finally, did you find any bugs in the old code? If so, are any of them things that that you’d want to fix now that you’ve found them. Are any of them systematic errors that you might still be making today?&lt;/p&gt;

&lt;h4&gt;Moving Forward By Looking Back&lt;/h4&gt;

&lt;p&gt;Perhaps you’re not like me, but whenever I try this exercise I find things that pleasantly surprise me and things that make me cringe in embarrassment. I find the occasional serious bug (along with more frequent less but serious issues). So I try to make a point of looking back at my code fairly frequently.&lt;/p&gt;

&lt;p&gt;However, doing this six months after you write code is not the best way of developing good software today. So the underlying challenge of this kata is this: how can we get into the habit of critically reviewing the code that we write, as we write it? And can we use the techniques of reading code with different expectations (good coder, bad coder, and bug hunt) when we’re reviewing our colleagues code?&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Kata 8 – Conflicting Objectives&lt;/h1&gt;

&lt;p&gt;Why do we write code? At one level, we’re trying to solve some particular problem, to add some kind of value to the world. But often there are also secondary objectives: the code has to solve the problem, and it also has to be fast, or easy to maintain, or extend, or whatever. So let’s look at that.&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this kata, we’re going to write a program to solve a simple problem, and we’re going to write it with three different sub-objectives. Our program is going do process the &lt;a rel="nofollow" target="_blank" href="http://pragprog.com/katadata/wordlist.txt"&gt;dictionary&lt;/a&gt; we used in previous kata, this time looking for all six letter words which are composed of two concatenated smaller words. For example:&lt;/p&gt;

&lt;pre&gt;  al + bums =&amp;gt; albums
  bar + ely =&amp;gt; barely
  be + foul =&amp;gt; befoul
  con + vex =&amp;gt; convex
  here + by =&amp;gt; hereby
  jig + saw =&amp;gt; jigsaw
  tail + or =&amp;gt; tailor
  we + aver =&amp;gt; weaver&lt;/pre&gt;

&lt;p&gt;Write the program three times.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The first time, make program as &lt;em&gt;readable&lt;/em&gt; as you can make it. &lt;/li&gt;

  &lt;li&gt;The second time, optimize the program to run fast &lt;em&gt;fast&lt;/em&gt; as you can make it. &lt;/li&gt;

  &lt;li&gt;The third time, write as &lt;em&gt;extendible&lt;/em&gt; a program as you can. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now look back at the three programs and think about how each of the three subobjectives interacts with the others. For example, does making the program as fast as possible make it more or less readable? Does it make easier to extend? Does making the program readable make it slower or faster, flexible or rigid? And does making it extendible make it more or less readable, slower or faster? Are any of these correlations stronger than others? What does this mean in terms of optimizations you may perform on the code you write?&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Kata 9 – Back to the Checkout&lt;/h1&gt;

&lt;p&gt;Back to the supermarket. This week, we’ll implement the code for a checkout system that handles pricing schemes such as &amp;quot;apples cost 50 cents, three apples cost $1.30.&amp;quot;&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Way back in &lt;a rel="nofollow" target="_blank" href="http://pragdave.blogs.pragprog.com/Practices/Kata/KataOne.rdoc"&gt;KataOne&lt;/a&gt; we thought about how to model the various options for supermarket pricing. We looked at things such as &amp;quot;three for a dollar,&amp;quot; &amp;quot;$1.99 per pound,&amp;quot; and &amp;quot;buy two, get one free.&amp;quot;&lt;/p&gt;

&lt;p&gt;This week, let’s implement the code for a supermarket checkout that calculates the total price of a number of items. In a normal supermarket, things are identified using Stock Keeping Units, or SKUs. In our store, we’ll use individual letters of the alphabet (A, B, C, and so on). Our goods are priced individually. In addition, some items are multipriced: buy &lt;em&gt;n&lt;/em&gt; of them, and they’ll cost you &lt;em&gt;y&lt;/em&gt; cents. For example, item ‘A’ might cost 50 cents individually, but this week we have a special offer: buy three ‘A’s and they’ll cost you $1.30. In fact this week’s prices are:&lt;/p&gt;

&lt;pre&gt;  Item   Unit      Special
         Price     Price
  --------------------------
    A     50       3 for 130
    B     30       2 for 45
    C     20
    D     15&lt;/pre&gt;

&lt;p&gt;Our checkout accepts items in any order, so that if we scan a B, an A, and another B, we’ll recognize the two B’s and price them at 45 (for a total price so far of 95). Because the pricing changes frequently, we need to be able to pass in a set of pricing rules each time we start handling a checkout transaction.&lt;/p&gt;

&lt;p&gt;The interface to the checkout should look like:&lt;/p&gt;

&lt;pre&gt;   co = CheckOut.new(pricing_rules)
   co.scan(item)
   co.scan(item)
       :    :
   price = co.total&lt;/pre&gt;

&lt;p&gt;Here’s a set of unit tests for a Ruby implementation. The helper method &lt;tt&gt;price&lt;/tt&gt; lets you specify a sequence of items using a string, calling the checkout’s &lt;tt&gt;scan&lt;/tt&gt; method on each item in turn before finally returning the total price.&lt;/p&gt;

&lt;pre&gt;  class TestPrice &amp;lt; Test::Unit::TestCase

    def price(goods)
      co = CheckOut.new(RULES)
      goods.split(//).each { |item| co.scan(item) }
      co.total
    end

    def test_totals
      assert_equal(  0, price(&amp;quot;&amp;quot;))
      assert_equal( 50, price(&amp;quot;A&amp;quot;))
      assert_equal( 80, price(&amp;quot;AB&amp;quot;))
      assert_equal(115, price(&amp;quot;CDBA&amp;quot;))

      assert_equal(100, price(&amp;quot;AA&amp;quot;))
      assert_equal(130, price(&amp;quot;AAA&amp;quot;))
      assert_equal(180, price(&amp;quot;AAAA&amp;quot;))
      assert_equal(230, price(&amp;quot;AAAAA&amp;quot;))
      assert_equal(260, price(&amp;quot;AAAAAA&amp;quot;))

      assert_equal(160, price(&amp;quot;AAAB&amp;quot;))
      assert_equal(175, price(&amp;quot;AAABB&amp;quot;))
      assert_equal(190, price(&amp;quot;AAABBD&amp;quot;))
      assert_equal(190, price(&amp;quot;DABABA&amp;quot;))
    end

    def test_incremental
      co = CheckOut.new(RULES)
      assert_equal(  0, co.total)
      co.scan(&amp;quot;A&amp;quot;);  assert_equal( 50, co.total)
      co.scan(&amp;quot;B&amp;quot;);  assert_equal( 80, co.total)
      co.scan(&amp;quot;A&amp;quot;);  assert_equal(130, co.total)
      co.scan(&amp;quot;A&amp;quot;);  assert_equal(160, co.total)
      co.scan(&amp;quot;B&amp;quot;);  assert_equal(175, co.total)
    end
  end&lt;/pre&gt;

&lt;p&gt;There are lots of ways of implementing this kind of algorithm; if you have time, experiment with several.&lt;/p&gt;

&lt;h4&gt;Objectives of the Kata&lt;/h4&gt;

&lt;p&gt;To some extent, this is just a fun little problem. But underneath the covers, it’s a stealth exercise in decoupling. The challenge description doesn’t mention the format of the pricing rules. How can these be specified in such a way that the checkout doesn’t know about particular items and their pricing strategies? How can we make the design flexible enough so that we can add new styles of pricing rule in the future?&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Kata 10 – Hashes vs. Classes&lt;/h1&gt;

&lt;p&gt;If we’re programming business applications in a language such as Java or C#, we’re used to constructing and using classes to manipulate our business objects. Is this always the right way to go, or would a less formal approach serves us well sometimes?&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This week’s topic doesn’t involve a coding challenge. Instead, we’re thinking about design and tradeoffs.&lt;/p&gt;

&lt;p&gt;Imagine that you’ve been asked to write an export utility for a large and complex database. The export has to read data from 30 or so tables (perhaps 100 columns are potentially written to each export record). Some of the exported data is written exactly as read from the database, but other exported data must be calculated. In addition, if certain flag fields have specific values, then additional data must be read from the database to complete an export row.&lt;/p&gt;

&lt;p&gt;The export data must obviously be correct, but the client is also asking for a flexible solution; their world changes a lot.&lt;/p&gt;

&lt;p&gt;One solution is to use existing business objects and existing persistence mechanisms, and to use higher-level classes to aggregate their results into a form that can be used to generate export rows. This higher level object could perform the calculations necessary for the virtual fields, and read in additional business objects if the flag fields dictate.&lt;/p&gt;

&lt;p&gt;An alternative solution might be to read the data row at a time into a Hash using ad-hoc queries, keying the hash on the field names. A separate pass could then be made to perform any necessary calculations, storing the results back in to the same hash. Additional data could be read from the database if the flag fields are set, again storing the results in the hash. The contents of the hash are then used to write the export record, and we loop back to do the next row.&lt;/p&gt;

&lt;p&gt;This kata is a thought experiment. What are the top three advantages and top three disadvantages of the two approaches? If you’re been using classes to hold data in your business applications, what would the impact be if you were to switch to hashes, and vice versa? Is this issue related to the static/dynamic typing debate?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/qzGY74arwZQ" height="1" width="1"/&gt;</description>
         <author>mark shiffer</author>
         <guid isPermaLink="false">http://www.mssoftwareconsulting.com/msswc/blog/post.aspx?id=a7b08d00-65ec-4402-80fe-a04e12fbaa84</guid>
         <pubDate>Mon, 05 Sep 2011 03:23:54 +0000</pubDate>
      <feedburner:origLink>http://www.mssoftwareconsulting.com/msswc/blog/post/Code-Kata-6-10-of-21.aspx</feedburner:origLink></item>
      <item>
         <title>Code Kata 1–5 of 21</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/mqzhLZ6v9ws/Code-Kata-1e280935-of-21.aspx</link>
         <description>&lt;p&gt;I came across this site quite a while back and have been meaning to blog about it. The site is &lt;a rel="nofollow" target="_blank" href="http://codekata.pragprog.com/"&gt;CodeKata&lt;/a&gt;, and the premise is essentially to give reasonably interesting problems that can be solved using code in order to practice and hone your skills. Not everything is a coding problem, but where I can see these coming in handy are using the katas to learn new languages. I always learn better when I have something to implement as I learn. Anyway, my original intention was to just link to the site, however it looks like the site hasn’t been updated in 4 years! It concerns me that it might not be around if I merely link to it, so I am going to copy the katas here for future reference. I hope Dave doesn’t mind.&lt;/p&gt;  &lt;h1&gt;Kata 1 – Supermarket Pricing&lt;/h1&gt;  &lt;p&gt;This kata arose from some discussions we’ve been having at the DFW &lt;a rel="nofollow" target="_blank" href="http://www.pragmaticprogrammer.com/cgi-local/pragprog?DallasPractitioners"&gt;Practioners&lt;/a&gt; meetings. The problem domain is something seemingly simple: pricing goods at supermarkets. &lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Some things in supermarkets have simple prices: this can of beans costs $0.65. Other things have more complex prices. For example: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;three for a dollar (so what’s the price if I buy 4, or 5?) &lt;/li&gt;    &lt;li&gt;$1.99/pound (so what does 4 ounces cost?) &lt;/li&gt;    &lt;li&gt;buy two, get one free (so does the third item have a price?)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This kata involves no coding. The exercise is to experiment with various models for representing money and prices that are flexible enough to deal with these (and other) pricing schemes, and at the same time are generally usable (at the checkout, for stock management, order entry, and so on). Spend time considering issues such as: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;does fractional money exist? &lt;/li&gt;    &lt;li&gt;when (if ever) does rounding take place? &lt;/li&gt;    &lt;li&gt;how do you keep an audit trail of pricing decisions (and do you need to)? &lt;/li&gt;    &lt;li&gt;are costs and prices the same class of thing? &lt;/li&gt;    &lt;li&gt;if a shelf of 100 cans is priced using &amp;quot;buy two, get one free&amp;quot;, how do you value the stock?&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This is an ideal shower-time kata, but be careful. Some of the problems are more subtle than they first appear. I suggest that it might take a couple of weeks worth of showers to exhaust the main alternatives. &lt;/p&gt;  &lt;h4&gt;Goal&lt;/h4&gt;  &lt;p&gt;The goal of this kata is to practice a looser style of experimental modelling. Look for as many different ways of handling the issues as possible. Consider the various tradeoffs of each. What techniques use best for exploring these models? For recording them? How can you validate a model is reasonable? &lt;/p&gt;  &lt;h5&gt;What’s a Code Kata?&lt;/h5&gt;  &lt;p&gt;As a group, software developers don’t practice enough. Most of our learning takes place on the job, which means that most of our mistakes get made there as well. Other creative professions practice: artists carry a sketchpad, musicians play technical pieces, poets constantly rewrite works. In karate, where the aim is to learn to spar or fight, most of a student’s time is spent learning and refining basic moves. The more formal of these exercises are called kata. &lt;/p&gt;  &lt;p&gt;To help developers get the same benefits from practicing, we’re putting together a series of code kata: simple, artificial exercises which let us experiment and learn without the pressure of a production environment. Our suggestions for doing the kata are: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;find a place and time where you won’t be interrupted &lt;/li&gt;    &lt;li&gt;focus on the essential elements of the kata &lt;/li&gt;    &lt;li&gt;remember to look for feedback for every major decision &lt;/li&gt;    &lt;li&gt;if it helps, keep a journal of your progress &lt;/li&gt;    &lt;li&gt;have discussion groups with other developers, but try to have completed the kata first&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are no right or wrong answers in these kata: the benefit comes from the process, not from the result. &lt;/p&gt;  &lt;h1&gt;&amp;#160;&lt;/h1&gt;  &lt;h1&gt;Kata 2 – Karate Chop&lt;/h1&gt;  &lt;p&gt;A binary chop (sometimes called the more prosaic binary search) finds the position of value in a sorted array of values. It achieves some efficiency by halving the number of items under consideration each time it probes the values: in the first pass it determines whether the required value is in the top or the bottom half of the list of values. In the second pass in considers only this half, again dividing it in to two. It stops when it finds the value it is looking for, or when it runs out of array to search. Binary searches are a favorite of CS lecturers. &lt;/p&gt;  &lt;p&gt;This Kata is straightforward. Implement a binary search routine (using the specification below) in the language and technique of your choice. Tomorrow, implement it again, using a totally different technique. Do the same the next day, until you have five totally unique implementations of a binary chop. (For example, one solution might be the traditional iterative approach, one might be recursive, one might use a functional style passing array slices around, and so on). &lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Goals&lt;/h4&gt;  &lt;p&gt;This Kata has three separate goals: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;As you’re coding each algorithm, keep a note of the kinds of error you encounter. A binary search is a ripe breeding ground for &amp;quot;off by one&amp;quot; and fencepost errors. As you progress through the week, see if the frequency of these errors decreases (that is, do you learn from experience in one technique when it comes to coding with a different technique?). &lt;/li&gt;    &lt;li&gt;What can you say about the relative merits of the various techniques you’ve chosen? Which is the most likely to make it in to production code? Which was the most fun to write? Which was the hardest to get working? And for all these questions, ask yourself &amp;quot;why?&amp;quot;. &lt;/li&gt;    &lt;li&gt;It’s fairly hard to come up with five unique approaches to a binary chop. How did you go about coming up with approaches four and five? What techniques did you use to fire those &amp;quot;off the wall&amp;quot; neurons?&lt;/li&gt; &lt;/ol&gt;  &lt;h4&gt;Specification&lt;/h4&gt;  &lt;p&gt;Write a binary chop method that takes an integer search target and a sorted array of integers. It should return the integer index of the target in the array, or -1 if the target is not in the array. The signature will logically be:&lt;/p&gt;  &lt;pre&gt;   chop(int, array_of_int)  -&amp;gt; int&lt;/pre&gt;

&lt;p&gt;You can assume that the array has less than 100,000 elements. For the purposes of this Kata, time and memory performance are not issues (assuming the chop terminates before you get bored and kill it, and that you have enough RAM to run it). &lt;/p&gt;

&lt;h5&gt;Test Data&lt;/h5&gt;

&lt;p&gt;Here is the Test::Unit code I used when developing my methods. Feel free to add to it. The tests assume that array indices start at zero. You’ll probably have to do a couple of global search-and-replaces to make this compile in your language of choice (unless your enlightened choice happens to be Ruby).&lt;/p&gt;

&lt;pre&gt;  def test_chop
    assert_equal(-1, chop(3, []))
    assert_equal(-1, chop(3, [1]))
    assert_equal(0,  chop(1, [1]))
    #
    assert_equal(0,  chop(1, [1, 3, 5]))
    assert_equal(1,  chop(3, [1, 3, 5]))
    assert_equal(2,  chop(5, [1, 3, 5]))
    assert_equal(-1, chop(0, [1, 3, 5]))
    assert_equal(-1, chop(2, [1, 3, 5]))
    assert_equal(-1, chop(4, [1, 3, 5]))
    assert_equal(-1, chop(6, [1, 3, 5]))
    #
    assert_equal(0,  chop(1, [1, 3, 5, 7]))
    assert_equal(1,  chop(3, [1, 3, 5, 7]))
    assert_equal(2,  chop(5, [1, 3, 5, 7]))
    assert_equal(3,  chop(7, [1, 3, 5, 7]))
    assert_equal(-1, chop(0, [1, 3, 5, 7]))
    assert_equal(-1, chop(2, [1, 3, 5, 7]))
    assert_equal(-1, chop(4, [1, 3, 5, 7]))
    assert_equal(-1, chop(6, [1, 3, 5, 7]))
    assert_equal(-1, chop(8, [1, 3, 5, 7]))
  end&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&lt;/pre&gt;

&lt;h1&gt;Kata 3 – How Big, How Fast?&lt;/h1&gt;

&lt;p&gt;Rough estimation is a useful talent to possess. As you’re coding away, you may suddenly need to work out approximately how big a data structure will be, or how fast some loop will run. The faster you can do this, the less the coding flow will be disturbed. &lt;/p&gt;

&lt;p&gt;So this is a simple kata: a series of questions, each asking for a rough answer. Try to work each out in your head. I’ll post my answers (and how I got them) in a week or so. &lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;How Big?&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;roughly how many binary digits (bit) are required for the unsigned representation of: 
    &lt;ul&gt;
      &lt;li&gt;1,000 &lt;/li&gt;

      &lt;li&gt;1,000,000 &lt;/li&gt;

      &lt;li&gt;1,000,000,000 &lt;/li&gt;

      &lt;li&gt;1,000,000,000,000 &lt;/li&gt;

      &lt;li&gt;8,000,000,000,000&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;My town has approximately 20,000 residences. How much space is required to store the names, addresses, and a phone number for all of these (if we store them as characters)? &lt;/li&gt;

  &lt;li&gt;I’m storing 1,000,000 integers in a binary tree. Roughly how many nodes and levels can I expect the tree to have? Roughly how much space will it occupy on a 32-bit architecture?&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;How Fast?&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;My copy of Meyer’s Object Oriented Software Construction has about 1,200 body pages. Assuming no flow control or protocol overhead, about how long would it take to send it over an async 56k baud modem line? &lt;/li&gt;

  &lt;li&gt;My binary search algorithm takes about 4.5mS to search a 10,000 entry array, and about 6mS to search 100,000 elements. How long would I expect it to take to search 10,000,000 elements (assuming I have sufficient memory to prevent paging). &lt;/li&gt;

  &lt;li&gt;Unix passwords are stored using a one-way hash function: the original string is converted to the ‘encrypted’ password string, which cannot be converted back to the original string. One way to attack the password file is to generate all possible cleartext passwords, applying the password hash to each in turn and checking to see if the result matches the password you’re trying to crack. If the hashes match, then the string you used to generate the hash is the original password (or at least, it’s as good as the original password as far as logging in is concerned). In our particular system, passwords can be up to 16 characters long, and there are 96 possible characters at each position. If it takes 1mS to generate the password hash, is this a viable approach to attacking a password?&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Kata 4 – Data Munging&lt;/h1&gt;

&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; gave me a hard time for &lt;a rel="nofollow" target="_blank" href="http://pragdave.blogs.pragprog.com/Practices/Kata/KataTwo.rdoc"&gt;KataTwo&lt;/a&gt;, complaining that it was yet another single-function, academic exercise. Which, or course, it was. So this week let’s mix things up a bit. &lt;/p&gt;

&lt;p&gt;Here’s an exercise in three parts to do with real world data. Try hard not to read ahead—do each part in turn. &lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;Part One: Weather Data&lt;/h5&gt;

&lt;p&gt;In &lt;a rel="nofollow" target="_blank" href="http://pragdave.pragprog.com/data/weather.dat"&gt;weather.dat&lt;/a&gt; you’ll find daily weather data for Morristown, NJ for June 2002. Download this text file, then write a program to output the day number (column one) with the smallest temperature spread (the maximum temperature is the second column, the minimum the third column). &lt;/p&gt;

&lt;h5&gt;Part Two: Soccer League Table&lt;/h5&gt;

&lt;p&gt;The file &lt;a rel="nofollow" target="_blank" href="http://pragdave.pragprog.com/data/football.dat"&gt;football.dat&lt;/a&gt; contains the results from the English Premier League for 2001/2. The columns labeled ‘F’ and ‘A’ contain the total number of goals scored for and against each team in that season (so Arsenal scored 79 goals against opponents, and had 36 goals scored against them). Write a program to print the name of the team with the smallest difference in ‘for’ and ‘against’ goals. &lt;/p&gt;

&lt;h5&gt;Part Three: DRY Fusion&lt;/h5&gt;

&lt;p&gt;Take the two programs written previously and factor out as much common code as possible, leaving you with two smaller programs and some kind of shared functionality. &lt;/p&gt;

&lt;h4&gt;Kata Questions&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;To what extent did the design decisions you made when writing the original programs make it easier or harder to factor out common code? &lt;/li&gt;

  &lt;li&gt;Was the way you wrote the second program influenced by writing the first? &lt;/li&gt;

  &lt;li&gt;Is factoring out as much common code as possible always a good thing? Did the readability of the programs suffer because of this requirement? How about the maintainability?&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Kata 5 – Bloom Filters&lt;/h1&gt;

&lt;p&gt;There are many circumstances where we need to find out if something is a member of a set, and many algorithms for doing it. If the set is small, you can use bitmaps. When they get larger, hashes are a useful technique. But when the sets get big, we start bumping in to limitations. Holding 250,000 words in memory for a spell checker might be too big an overhead if your target environment is a PDA or cell phone. Keeping a list of web-pages visited might be extravagant when you get up to tens of millions of pages. Fortunately, there’s a technique that can help. &lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bloom filters are a 30-year-old statistical way of testing for membership in a set. They greatly reduce the amount of storage you need to represent the set, but at a price: they’ll sometimes report that something is in the set when it isn’t (but it’ll never do the opposite; if the filter says that the set doesn’t contain your object, you know that it doesn’t). And the nice thing is you can control the accuracy; the more memory you’re prepared to give the algorithm, the fewer false positives you get. I once wrote a spell checker for a PDP-11 which stored a dictionary of 80,000 words in 16kbytes, and I very rarely saw it let though an incorrect word. (Update: I must have mis-remembered these figures, because they are not in line with the theory. Unfortunately, I can no longer read the 8&amp;quot; floppies holding the source, so I can’t get the correct numbers. Let’s just say that I got a decent sized dictionary, along with the spell checker, all in under 64k.) &lt;/p&gt;

&lt;p&gt;Bloom filters are very simple. Take a big array of bits, initially all zero. Then take the things you want to look up (in our case we’ll use a dictionary of words). Produce ‘n’ independent hash values for each word. Each hash is a number which is used to set the corresponding bit in the array of bits. Sometimes there’ll be clashes, where the bit will already be set from some other word. This doesn’t matter. &lt;/p&gt;

&lt;p&gt;To check to see of a new word is already in the dictionary, perform the same hashes on it that you used to load the bitmap. Then check to see if each of the bits corresponding to these hash values is set. If any bit is not set, then you never loaded that word in, and you can reject it. &lt;/p&gt;

&lt;p&gt;The Bloom filter reports a false positive when a set of hashes for a word all end up corresponding to bits that were set previously by other words. In practice this doesn’t happen too often as long as the bitmap isn’t too heavily loaded with one-bits (clearly if every bit is one, then it’ll give a false positive on every lookup). There’s a discussion of the math in Bloom filters at &lt;a rel="nofollow" target="_blank" href="http://www.cs.wisc.edu/~cao/papers/summary-cache/node8.html"&gt;www.cs.wisc.edu/~cao/papers/summary-cache/node8.html&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;So, this kata is fairly straightforward. Implement a Bloom filter based spell checker. You’ll need some kind of bitmap, some hash functions, and a simple way of reading in the dictionary and then the words to check. For the hash function, remember that you can always use something that generates a fairly long hash (such as MD5) and then take your smaller hash values by extracting sequences of bits from the result. On a Unix box you can find a list of words in /usr/dict/words (or possibly in /usr/share/dict/words). For others, I’ve put a word list up at &lt;a rel="nofollow" target="_blank" href="http://pragprog.com/katadata/wordlist.txt"&gt;pragprog.com/katadata/wordlist.txt&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Play with using different numbers of hashes, and with different bitmap sizes. &lt;/p&gt;

&lt;p&gt;Part two of the exercise is optional. Try generating random 5-character words and feeding them in to your spell checker. For each word that it says it OK, look it up in the original dictionary. See how many false positives you get.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/mqzhLZ6v9ws" height="1" width="1"/&gt;</description>
         <author>mark shiffer</author>
         <guid isPermaLink="false">http://www.mssoftwareconsulting.com/msswc/blog/post.aspx?id=9a3806bd-6c6c-4243-b75b-f8c8029ba380</guid>
         <pubDate>Mon, 05 Sep 2011 03:20:19 +0000</pubDate>
      <feedburner:origLink>http://www.mssoftwareconsulting.com/msswc/blog/post/Code-Kata-1e280935-of-21.aspx</feedburner:origLink></item>
      <item>
         <title>XML Config Transformations in Visual Studio and SlowCheetah</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/yCheriPQWs0/XML-Config-Transformations-in-Visual-Studio-and-SlowCheetah.aspx</link>
         <description>&lt;p&gt;Xml config transformations are an easy way to provide consistent changes to web.config files when deploying applications to different environments. However, until &lt;a rel="nofollow" target="_blank" href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5"&gt;SlowCheetah&lt;/a&gt; came out this useful transformation was limited to actual deploys. SlowCheetah provides the ability to complete transformations when Run/Debugging in Visual Studio on any file and could come in quite handy. Between SlowCheetah and T4 templates, maybe someone can come up with a way to have Visual Studio just code the whole app for you!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/yCheriPQWs0" height="1" width="1"/&gt;</description>
         <author>mark shiffer</author>
         <guid isPermaLink="false">http://www.mssoftwareconsulting.com/msswc/blog/post.aspx?id=5560c84e-0930-4273-8fce-460f7f093318</guid>
         <pubDate>Wed, 24 Aug 2011 20:13:58 +0000</pubDate>
      <feedburner:origLink>http://www.mssoftwareconsulting.com/msswc/blog/post/XML-Config-Transformations-in-Visual-Studio-and-SlowCheetah.aspx</feedburner:origLink></item>
      <item>
         <title>PsExec</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/8UH9A9KACnI/PsExec.aspx</link>
         <description>&lt;p&gt;Scott Hanselman recently posted an article in which he used &lt;a rel="nofollow" target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb897553"&gt;PsExec&lt;/a&gt; to open regedit running as the System user (think administrator on steroids). This allowed him to delete registry entries that aren’t normally accessible. The cool thing about this tool is the remoting capabilities. I’m about to give it a shot here at work to see if it is quicker than using remote desktop for administering remote servers.&lt;/p&gt;  &lt;p&gt;Utilities like Telnet and remote control programs like Symantec's PC Anywhere let you execute programs on remote systems, but they can be a pain to set up and require that you install client software on the remote systems that you wish to access. &lt;a rel="nofollow" target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb897553"&gt;PsExec&lt;/a&gt; is a light-weight telnet-replacement that lets you execute processes on other systems, complete with full interactivity for console applications, without having to manually install client software. PsExec's most powerful uses include launching interactive command-prompts on remote systems and remote-enabling tools like IpConfig that otherwise do not have the ability to show information about remote systems.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/8UH9A9KACnI" height="1" width="1"/&gt;</description>
         <author>mark shiffer</author>
         <guid isPermaLink="false">http://www.mssoftwareconsulting.com/msswc/blog/post.aspx?id=6aeb57b2-06ea-4be9-8048-848a4fbe18e5</guid>
         <pubDate>Mon, 22 Aug 2011 12:33:32 +0000</pubDate>
      <feedburner:origLink>http://www.mssoftwareconsulting.com/msswc/blog/post/PsExec.aspx</feedburner:origLink></item>
      <item>
         <title>ASP.NET MVC 2 Presentation</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/JGSaE4PpD4Q/aspnet-mvc-2-presentation.html</link>
         <description>&lt;p&gt;I meant to post this a while back, but in January I gave a presentation on &lt;a rel="nofollow" target="_blank" href="http://www.asp.net/mvc"&gt;ASP.NET MVC 2&lt;/a&gt; on behalf of the &lt;a rel="nofollow" target="_blank" href="http://www.svnug.com/"&gt;Sangamon Valley .NET User Group&lt;/a&gt;, and I thought I would share the following links to the slides and source code:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://svnugcodeplex.codeplex.com/releases/view/59557#DownloadId=200761"&gt;Source Code (Starter Solution)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://svnugcodeplex.codeplex.com/releases/view/59557#DownloadId=200760"&gt;Source Code (Finished Solution)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://svnugcodeplex.codeplex.com/releases/view/59557#DownloadId=200759"&gt;Slides&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We tried our best to capture a decent video of the presentation, but alas the laptop I used for the presentation ate both the screen and audio feeds.&amp;#160; The video for Mark Lovik’s February presentation on Silverlight 4, however, is in post-production, so stay tuned!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/AP5QKWcvI_Y" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/JGSaE4PpD4Q" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-6522936616860860236</guid>
         <pubDate>Sat, 19 Mar 2011 03:29:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/AP5QKWcvI_Y/aspnet-mvc-2-presentation.html</feedburner:origLink></item>
      <item>
         <title>Windows Phone 7—Pivot Control</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/r0tGdaokGXo/windows-phone-7pivot-control.html</link>
         <description>&lt;p&gt;So, I spent last week picking through a few of the controls available for &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/windowsphone/"&gt;Windows Phone 7&lt;/a&gt; applications.&amp;#160; Although doing so did not allow for much visible progress on Project Badger, it did help me better understand what you can do with your Windows Phone 7 applications—which is important.&amp;#160; After all, the only thing worse than failing to understand the tools at your disposal is failing to understand the need for your application at all.&lt;/p&gt;  &lt;p&gt;My favorite Windows Phone 7 control so far is the Pivot control.&amp;#160; It lets you create a Silverlight view with left/right flick navigation—like so:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="406"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="202"&gt;&lt;a rel="nofollow" target="_blank" href="http://lh3.ggpht.com/_hKwn7hPEWnA/TNbx9lPesZI/AAAAAAAAAF4/cXwebbSId2Q/s1600-h/image%5B11%5D.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_hKwn7hPEWnA/TNbx94yA-VI/AAAAAAAAAF8/7rpV6bREAZs/image_thumb%5B3%5D.png?imgmax=800" width="149" height="244"/&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="202"&gt;&lt;a rel="nofollow" target="_blank" href="http://lh4.ggpht.com/_hKwn7hPEWnA/TNbx-IWJr9I/AAAAAAAAAGA/Zl5v6PPvJUA/s1600-h/image%5B14%5D.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_hKwn7hPEWnA/TNbx-dPN-uI/AAAAAAAAAGE/KsCqDKIJ2BQ/image_thumb%5B4%5D.png?imgmax=800" width="148" height="244"/&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Looks great, right?&amp;#160; What about the code, though?&amp;#160; Nasty, right?&amp;#160; Nope!&lt;/p&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:35219734-0e7e-496c-b034-3d583cb4c1a5" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!--Pivot Control--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;controls&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Pivot&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MY APPLICATION&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!--Pivot item one--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;controls&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PivotItem&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Header&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;first&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!--Double line list with text wrapping--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;FirstListBox&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;0,0,-12,0&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Items}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;0,0,0,17&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;432&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; LineOne}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; TextWrapping&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Wrap&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; PhoneTextExtraLargeStyle}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; LineTwo}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; TextWrapping&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Wrap&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;12,-6,12,0&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; PhoneTextSubtleStyle}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;controls&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PivotItem&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#a31515;"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!--Pivot item two--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;controls&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PivotItem&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Header&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;second&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!--Triple line list no text wrapping--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SecondListBox&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;0,0,-12,0&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Items}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;0,0,0,17&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; LineOne}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; TextWrapping&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;NoWrap&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;12,0,0,0&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; PhoneTextExtraLargeStyle}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                            &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; LineThree}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; TextWrapping&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;NoWrap&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;12,-6,0,0&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; PhoneTextSubtleStyle}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;controls&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PivotItem&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;controls&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Pivot&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;As you can see from the above XAML, a Windows Phone 7 Pivot control is simply a container for as many PivotItem controls as you like.&amp;#160; The Pivot control itself takes a Title property to be displayed at the upper left of the screen.&amp;#160; Similarly, the PivotItem control takes a Header property to be displayed across the left/right navigation pane.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://lh5.ggpht.com/_hKwn7hPEWnA/TNbx-4IDqxI/AAAAAAAAAGI/Ikey4Z2T9Ds/s1600-h/image%5B28%5D.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_hKwn7hPEWnA/TNbx_NhznzI/AAAAAAAAAGM/vhKaxnEwvVQ/image_thumb%5B6%5D.png?imgmax=800" width="148" height="244"/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The rest is just XAML data templates!&amp;#160; Pretty slick, eh?&lt;/p&gt;  &lt;p&gt;You can test drive the Pivot control—if you have Visual Studio 2010—by creating a new project from the Windows Phone Pivot Application template.&amp;#160; Navigate to File –&amp;gt; New Project –&amp;gt; Silverlight for Windows Phone –&amp;gt; Windows Phone Pivot Application.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://lh6.ggpht.com/_hKwn7hPEWnA/TNbx_jUh7wI/AAAAAAAAAGQ/lTtofV4zmB8/s1600-h/image%5B5%5D.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_hKwn7hPEWnA/TNbyACpY59I/AAAAAAAAAGU/IUv5TfjR_EA/image_thumb%5B1%5D.png?imgmax=800" width="244" height="168"/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Of course, you must have the Windows Phone 7 development tools installed.&amp;#160; Scott Guthrie has &lt;a rel="nofollow" target="_blank" href="http://weblogs.asp.net/scottgu/archive/2010/09/16/windows-phone-7-developer-tools-released.aspx"&gt;a great blog post on how to do so&lt;/a&gt;.&amp;#160; If you do not have Visual Studio 2010, you can instead install &lt;a rel="nofollow" target="_blank" href="https://www.microsoft.com/express/Phone/"&gt;Visual Studio 2010 Express for Windows Phone&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;As you have seen, the Pivot control is a great way to add sleek, maintainable navigation to your Windows Phone 7 applications.&amp;#160; With just a small amount of XAML (or almost none if you use the Windows Phone Pivot Application template), you can turn a single screen app into a multi-paged powerhouse of rich functionality that is both stylish and easy to use.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/3kvTeLA8zK4" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/r0tGdaokGXo" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-1945428037652545083</guid>
         <pubDate>Sun, 07 Nov 2010 18:37:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://lh6.ggpht.com/_hKwn7hPEWnA/TNbx94yA-VI/AAAAAAAAAF8/7rpV6bREAZs/s72-c/image_thumb%5B3%5D.png?imgmax=800" width="72" />
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/3kvTeLA8zK4/windows-phone-7pivot-control.html</feedburner:origLink></item>
      <item>
         <title>Project Badger—Underway</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/0dP8_2sF2p0/project-badgerunderway.html</link>
         <description>&lt;p&gt;Some significant progress on the best darn task manager app ever tonight!&amp;#160; For now, I have codenamed the app Project Badger.&amp;#160; Badgers are cool.&amp;#160; And mean.&amp;#160; And I don’t really know what either of those two qualities has to do with the app, but that’s okay—Project Badger has a good ring to it.&lt;/p&gt;  &lt;p&gt;Now that I have played with the Windows Phone 7 development environment a bit, I am understanding some of the apps I already use better.&amp;#160; I will post more on that later, but, for now, my pillow is more important.&lt;/p&gt;  &lt;p&gt;More details soon!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/b9cfjqamMuU" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/0dP8_2sF2p0" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-4672339712782996541</guid>
         <pubDate>Thu, 04 Nov 2010 03:10:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/b9cfjqamMuU/project-badgerunderway.html</feedburner:origLink></item>
      <item>
         <title>Setting Up</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/vPYemSMhhAU/setting-up.html</link>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/visualstudio/en-us/products/2010-editions/professional"&gt;Microsoft Visual Studio 2010 Professional&lt;/a&gt;?&amp;#160; Check!&amp;#160; &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/expression/windowsphone/Default.aspx"&gt;Windows Phone 7 Developer Tools&lt;/a&gt;?&amp;#160; Check!&amp;#160; I am still working on getting my MSDN Essentials Subscription setup (the site is evidently having issues today), and I am still awaiting my free subscription to the &lt;a rel="nofollow" target="_blank" href="http://marketplace.windowsphone.com/"&gt;Windows Phone Marketplace&lt;/a&gt;.&amp;#160; Oh, and I want to get &lt;a rel="nofollow" target="_blank" href="http://www.pexforfun.com/"&gt;PEX&lt;/a&gt; going.&amp;#160; Oh, and Team Foundation Server.&amp;#160; Oh, and….&lt;/p&gt;  &lt;p&gt;All this installing, and I just want to code!&amp;#160; The anticipation is killing me!&amp;#160; Gah!&lt;/p&gt;  &lt;p&gt;Code what, do you say?&amp;#160; Well, just the best damn little task manager app you ever did see, that’s what!&lt;/p&gt;  &lt;p&gt;Stay tuned!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/G0UEtX0SAyQ" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/vPYemSMhhAU" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-4272016275550884588</guid>
         <pubDate>Wed, 03 Nov 2010 02:46:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/G0UEtX0SAyQ/setting-up.html</feedburner:origLink></item>
      <item>
         <title>Windows Phone 7—People</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/HKF_plJ8uYQ/windows-phone-7people.html</link>
         <description>&lt;p&gt;When Steve Ballmer announced in the &lt;a rel="nofollow" target="_blank" href="http://www.microsoftpdc.com/"&gt;PDC 2010&lt;/a&gt; keynotes address that each attendee would receive a Windows Phone 7, I’m pretty sure I almost passed out.&amp;#160; First, Windows Phone 7 is a paradigm shifting evolution for the Windows Phone OS.&amp;#160; Second, I have been hunting for months now for a replacement for my aging Nokia E71x.&amp;#160; Third, it is damn cool!&lt;/p&gt;  &lt;p&gt;Of all the great features in Windows Phone 7, what I am most impressed with is the People functionality.&amp;#160; Once you have connected your Windows 7 Phone to your Facebook, personal email, corporate email, and other such accounts, the People widget aggregates all of the contact and demographic data for everyone and displays it as one coherent whole.&amp;#160; For example, it will combine Facebook info on place of work, occupation, city of residence, and the like with home and mobile phone numbers from your corporate contact list.&amp;#160; It’s amazing!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/3FTLubW4K_c" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/HKF_plJ8uYQ" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-6795471469703141400</guid>
         <pubDate>Fri, 29 Oct 2010 05:58:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/3FTLubW4K_c/windows-phone-7people.html</feedburner:origLink></item>
      <item>
         <title>I Owe My Soul to the Company Store</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/TTC_ttSy_Ck/i-owe-my-soul-to-company-store.html</link>
         <description>&lt;p&gt;Early registration took a heck of a lot longer than I thought it would.&amp;#160; I’m glad I did the early registration, though, because I sure wouldn’t want to be stuck in a half-hour line tomorrow morning before the &lt;a rel="nofollow" target="_blank" href="http://www.microsoftpdc.com/"&gt;PDC&lt;/a&gt; keynote.&lt;/p&gt;  &lt;p&gt;The big goodie in the goodie bag this year was a coupon allowing each attendee to purchase up to $120.00 (USD) worth of Microsoft software in the company store.&amp;#160; For myself, I was all over a copy of &lt;a rel="nofollow" target="_blank" href="http://store.microsoft.com/microsoft/Visual-Studio-2010-Professional/product/8C47A214"&gt;Visual Studio 2010 Professional&lt;/a&gt; for home.&amp;#160; So, for a hundred and twenty bucks I was able to score, oh, about eight hundred dollars worth of software.&amp;#160; Such a great deal!&lt;/p&gt;  &lt;p&gt;Now I am super excited to start experimenting more at home.&amp;#160; The lack of proper tooling has been a significant factor in my lack of blogging this year, and I am very much looking forward to changing that.&lt;/p&gt;  &lt;p&gt;More to come!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/E0O8morwQeE" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/TTC_ttSy_Ck" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-1569610496747548331</guid>
         <pubDate>Thu, 28 Oct 2010 06:33:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/E0O8morwQeE/i-owe-my-soul-to-company-store.html</feedburner:origLink></item>
      <item>
         <title>Inspiration</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/-F7S5nTYN0U/inspiration.html</link>
         <description>&lt;p&gt;I’m not sure if it is the fresh air and beautiful scenery or if it is the anticipation of discussing my favorite technologies with some of the greatest minds in the computing field, but I must say this trip to the &lt;a rel="nofollow" target="_blank" href="http://www.microsoftpdc.com/"&gt;PDC&lt;/a&gt; has been quite inspirational thus far.&amp;#160; The world is a big place with many interesting people, places, and ideas.&amp;#160; So many that it is impossible for any one of us to experience them all.&amp;#160; It is, however, important to sample what you can in life because variety gives perspective—which is key to overcoming our own biases, as best we can.&lt;/p&gt;  &lt;p&gt;This hold true for software development just like any other field.&amp;#160; As &lt;a rel="nofollow" target="_blank" href="http://www.guykawasaki.com/"&gt;Guy Kawasaki&lt;/a&gt; discusses in his book &lt;em&gt;&lt;a rel="nofollow" target="_blank" href="http://www.guykawasaki.com/books/rules.shtml"&gt;Rules for Revolutionaries&lt;/a&gt;&lt;/em&gt;, you must eat like a bird and poop like an elephant.&amp;#160; Contrary to popular belief, a bird actually eats a lot—for its body weight, a bird eats much more than, say, a person.&amp;#160; Evidently, all that flying is not particularly efficient.&lt;/p&gt;  &lt;p&gt;I will leave the elephant part to your imagination….&lt;/p&gt;  &lt;p&gt;The crux of the saying, though, is that you should strive to take in as much information as possible—“eat like a bird'”—and transmit as much information as possible—“poop like an elephant”—so that the flow of ideas never stops.&amp;#160; “Eating” and “pooping” different kinds of information is especially important because, as aforementioned, different kinds of information give you different perspectives on life—which is the nest in which great, well-rounded ideas are hatched.&lt;/p&gt;  &lt;p&gt;That is why we should all strive to be inspired whenever possible.&amp;#160; Without inspiration, we lack vision, and, without vision, we lack direction.&lt;/p&gt;  &lt;p&gt;And, without direction, we lack purpose.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/RtBhOshfzbo" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/-F7S5nTYN0U" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-2218428291530598396</guid>
         <pubDate>Wed, 27 Oct 2010 22:49:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/RtBhOshfzbo/inspiration.html</feedburner:origLink></item>
      <item>
         <title>Preparing for the PDC</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/fPRUYtAU2v4/preparing-for-pdc.html</link>
         <description>&lt;p&gt;My colleague and I have had a great morning discussing our plans for the &lt;a rel="nofollow" target="_blank" href="http://www.microsoftpdc.com/"&gt;PDC&lt;/a&gt;.&amp;#160; We also stopped off at &lt;a rel="nofollow" target="_blank" href="http://www.pikeplacemarket.org/"&gt;Pike’s Place&lt;/a&gt; to tour the &lt;a rel="nofollow" target="_blank" href="http://www.pikeplacefish.com/"&gt;fish market&lt;/a&gt; and to get some yummy fried fish over at Pike’s Place Bar &amp;amp; Grill.&amp;#160; Great times!&lt;/p&gt;  &lt;p&gt;We have early registration tonight at Microsoft along with two pre-sessions to attend—one with the MSDN documentation team and one regarding Azure and cloud computing.&lt;/p&gt;  &lt;p&gt;What a great day!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/UHJMpdEi4xY" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/fPRUYtAU2v4" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-1835122020712849742</guid>
         <pubDate>Wed, 27 Oct 2010 17:59:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/UHJMpdEi4xY/preparing-for-pdc.html</feedburner:origLink></item>
      <item>
         <title>On My Way to the PDC</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/kqR1_uJTSBU/on-my-way-to-pdc.html</link>
         <description>&lt;p&gt;I am super excited to be on my way to &lt;a rel="nofollow" target="_blank" href="http://www.microsoftpdc.com/"&gt;Microsoft’s Professional Development Conference (PDC)&lt;/a&gt; in Redmond.&amp;#160; The &lt;a rel="nofollow" target="_blank" href="http://player.microsoftpdc.com/"&gt;sessions&lt;/a&gt; are more down to earth this year—focused on Windows internals, Azure and the Cloud, Windows Phone 7, and the like—which I find refreshing and quite useful.&amp;#160; I wouldn’t have minded a few sessions on Silverlight 4, though, but it is still going to be a great conference.&lt;/p&gt;  &lt;p&gt;More to come.&amp;#160; Stay tuned!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/k6M2Zn86-Ic" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/kqR1_uJTSBU" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-336399014598113990</guid>
         <pubDate>Tue, 26 Oct 2010 21:42:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/k6M2Zn86-Ic/on-my-way-to-pdc.html</feedburner:origLink></item>
      <item>
         <title>Prey for your lost laptop</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/ruhu7TSsHDQ/Prey-for-your-lost-laptop.aspx</link>
         <description>&lt;p&gt;Having recently purchased a laptop of my very own, I began to wonder what would happen if my Precious was lost or stolen. What would I do? There are commercial applications available, such as &lt;a rel="nofollow" target="_blank" href="http://www.lojack.com/"&gt;LoJack&lt;/a&gt;&amp;nbsp;and others, that provide services to locate and recover your missing hardware. Some of these services even come with a money-back guarantee. Even with all these assurances, I still believe that any half-computer-savvy thief could easily get around a barrier like this. Regardless, looking into this type of application has been on my to-do list anyway, just to see what is out there.&lt;/p&gt;
&lt;p&gt;A few days ago, I was catching up on episodes of &lt;a rel="nofollow" title="Trust your Technolust" target="_blank" href="http://www.hak5.org"&gt;Hak5&lt;/a&gt; when they showcased the &lt;a rel="nofollow" title="Prey Project" target="_blank" href="http://preyproject.com/"&gt;Prey Project&lt;/a&gt;. Prey is an open-source, &lt;em&gt;free&lt;/em&gt;&amp;nbsp;laptop recovery system. I'd tell you all about it, but just check out the Hak5 episode below.&lt;/p&gt;
&lt;p&gt;
 
 
 
 &lt;embed type="application/x-shockwave-flash" width="685" height="410" src="http://www.youtube.com/v/BGX5U_8BfGs&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;hd=1&amp;amp;start=765&amp;amp;border=1"&gt;&lt;/iframe&gt;
 
&lt;/p&gt;
&lt;p&gt;I installed Prey on my MacBook Pro in just a few minutes. Installation was easy. I chose the control panel mode and created a new account from within the installer. After Prey was "running" (you get no visual indicators, icons, etc. which is what you want) I went to the control panel site and enabled the Alert feature under Action Modules. The message displayed as promised twenty minutes later.&lt;/p&gt;
&lt;p&gt;Portable computer recovery software such as Prey, and others, is limited, however, and can only assist you if conditions are ideal. Those conditions include the computer being powered on and able to connect to the Internet. Prey will search for available wireless connections, but you'd better hope an open WiFi access point is nearby if your computer is locked via a password. If you don't have a password (and you really should) the thief will probably take care of establishing a network connection for you. If the thief is experienced with computers, however, chances of software such as Prey being successful is even more limited. An experienced person would probably keep your computer powered off and remove the hard drive after the deed is done. It's a good thing there are a lot of dumb criminals out there.&lt;/p&gt;
&lt;p&gt;I plan to stick with Prey and hope that I never need to use it for its intended purpose. If you have a portable computer, give Prey a try. It's better than nothing at all, right?! If you choose the Control Panel tracking method you get to register up to three computers.&lt;/p&gt;
&lt;p&gt;Let me know if you've used Prey or any similar services. Did you lose a laptop and activate the service? Did you get it back?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/ruhu7TSsHDQ" height="1" width="1"/&gt;</description>
         <author>brandon</author>
         <guid isPermaLink="false">http://www.nodnarb.net/post.aspx?id=9945dc27-c380-42ed-bc85-1eb57dab26e3</guid>
         <pubDate>Wed, 11 Aug 2010 04:12:00 +0000</pubDate>
         <category>Computers</category>
      <feedburner:origLink>http://www.nodnarb.net/post/2010/08/10/Prey-for-your-lost-laptop.aspx</feedburner:origLink></item>
      <item>
         <title>So Long, Nexus One</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/9QEaLS03Kng/So-Long-Nexus-One.aspx</link>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=google-nexus-one.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 5px 5px 0px;display:inline;border-top:0px;border-right:0px;" class="wlDisabledImage" title="The Google Nexus One smartphone" border="0" alt="google-nexus-one" align="left" src="http://www.nodnarb.net/image.axd?picture=google-nexus-one_thumb.jpg" width="90" height="150"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Oh, Nexus One, you had such promise! What happened? On Friday, Google put &lt;a rel="nofollow" target="_blank" href="http://googlenexusoneboard.blogspot.com/2010/07/update-nexus-one-changes-in.html"&gt;the final nail&lt;/a&gt; (ok, maybe next-to-final) in the coffin of their grand experiment in the direct-to-consumer mobile phone design and sales business, namely the Google Nexus One.&lt;/p&gt;  &lt;p&gt;As those of you who follow the mobile device industry know, the Nexus One &lt;a rel="nofollow" target="_blank" href="http://googleblog.blogspot.com/2010/01/our-new-approach-to-buying-mobile-phone.html"&gt;debuted earlier this year&lt;/a&gt; as Google's self-designed epitome of what an &lt;a rel="nofollow" target="_blank" href="http://www.android.com/"&gt;Android&lt;/a&gt; phone should be. The phone introduced then was sleek, fast, open and out to give Android's competitors a run for their money. The phone was &lt;a rel="nofollow" target="_blank" href="http://reviews.cnet.com/smartphones/htc-nexus-one-by/4505-6452_7-33906802.html?tag=mncol;txt"&gt;well received&lt;/a&gt;by the tech industry pundits and is still loved by their die-hard &lt;a rel="nofollow" target="_blank" href="http://www.nicholasoverstreet.com"&gt;fanboys&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Sales of the Nexus One to the masses, however, &lt;a rel="nofollow" target="_blank" href="http://www.dailybits.com/nexus-one-iphone-motorola-droid-sales-compared/"&gt;didn't quite take off&lt;/a&gt;. Not even six months after the launch of the Nexus One, Google &lt;a rel="nofollow" target="_blank" href="http://googleblog.blogspot.com/2010/05/nexus-one-changes-in-availability.html"&gt;announced&lt;/a&gt; it would be pulling the plug on the Web store. Now, the Nexus One will only be available to the masses until Google runs out. Luckily for Android developers, they will still be able to purchase handsets in order to have a solid development platform. Without mass production, though, who knows how long they will be available, what carriers they will work on or how expensive they will be.&lt;/p&gt;  &lt;p&gt;Now, if you've read this far, you may be assuming this is going to be an anti-Android/Google post, because I have been accused of being an &lt;a rel="nofollow" target="_blank" href="http://www.uberreview.com/2008/01/25-signs-that-you-might-be-an-apple-fanboy.htm"&gt;Apple fanboy&lt;/a&gt; many times in the past. [more]Not so! In fact, I think the market failure of the Nexus One is going to be a dark spot in the history of the mobile device industry.&lt;/p&gt;  &lt;p&gt;The Nexus One had an important reason to be a strong competitor in a Smartphone market dominated by Apple and other handset manufacturers and carriers. Competition, after all, breeds innovation.&lt;/p&gt;  &lt;p&gt;There are many Android-based phones on the market, so why do I believe the Nexus One should have been an important competitor? Are other Android phones non-innovative compared to it? No, this is not the reason. I wanted the Nexus One to succeed was because it was a Google-designed phone that didn't bow down to the demands of any particular service provider. It was a phone that Google made the way it wanted to, without crapware and lockdowns enforced by behemoths such as AT&amp;amp;T and Verizon. It was also sold direct to consumers, which was a new thing for Google. I'm afraid the combination of these factors, however, contributed greatly to the phone's demise.&lt;/p&gt;  &lt;p&gt;Here are the reasons why I think the Nexus One failed as a mass-market Smartphone. These reasons come from my own perception on the phone and mobile device industry in general. Being an iPhone owner, I don't follow Android-based phone news as closely as some of my friends, so much of the information I hear about them comes from the same sources you or they read online. Even if you think my reasons are full of crap, remember this comes from my &lt;em&gt;perception&lt;/em&gt; of what happened with the Nexus One. I didn't do a lot of research past a few Google searches while writing this article, so I may even be way off. Remember, though, facts are only as good as how widely they are perceived, so my opinions as an Android &amp;quot;outsider&amp;quot; may help you better understand the thoughts of those who didn't buy a Nexus One.&lt;/p&gt;  &lt;h3&gt;The Price, Compatibility&lt;/h3&gt;  &lt;p&gt;When the Nexus One launched in the U.S., it wasn't available on our largest mobile provider, AT&amp;amp;T. When it did become available, the price was a steep $500-plus for an unlocked, unsubsidized version of the phone. Price, I believe, still is the major deterrent to the acceptance of any neat, new gizmo, no matter how cool it is. The Nexus One was a phone built for Android lovers who were longing to escape the clutches of Microsoft, RIM and Apple-based Smartphones. The love came at a price, however.&lt;/p&gt;  &lt;h3&gt;Marketing&lt;/h3&gt;  &lt;p&gt;Google, easily one of the most popular websites to ever exist, simply didn't get the word out about their new phone. Granted, the homepage did feature the Nexus One, but it was only for a little while. Could the removal of the phone from the home page be related to pressure from other manufacturers or the carriers themselves? We may never know. There were plenty of opportunities for Google to push this phone, but it didn't happen compared to how in-your-face iPhone and Droid ads have been. It's not like Google doesn't have the money! The bottom line is: If you're not a computer geek that has an interest in mobile devices, then you probably didn't look into the Nexus One beyond the initial hype.&lt;/p&gt;  &lt;h3&gt;No Hands-On Experience&lt;/h3&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.cnet.com/8301-19736_1-20010829-251.html?tag=rtcol;relnews"&gt;Tech reporters&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://googleblog.blogspot.com/2010/05/nexus-one-changes-in-availability.html"&gt;Google alike&lt;/a&gt; think we need a hands-on, retail experience to fall in love with and buy a device like the Nexus One. I'm sure this is true, but couldn't this also be because of the failure of the marketing machine? Let's look at Apple and Verizon, for example. Prior to the release of the iPhone 4, no one had any hands-on experience with it until launch day, save for the normal industry reviewers, etc. Yes, there have been previous iPhone editions that set a precedent, but Apple sold &lt;em&gt;millions &lt;/em&gt;within a few days after the product's launch. Similar conditions were present for the new &lt;a rel="nofollow" target="_blank" href="http://www.droiddoes.com/#/droidx/featured/overview"&gt;Droid X&lt;/a&gt;on Verizon, which also &lt;a rel="nofollow" target="_blank" href="http://www.cnet.com/8301-19736_1-20010719-251.html?tag=rtcol;relnews"&gt;sold out&lt;/a&gt; on its first day. That's a lot of sales for not having a hands-on experience.&lt;/p&gt;  &lt;h3&gt;Competing With Itself&lt;/h3&gt;  &lt;p&gt;The last factor against the Nexus One is the fact Android competes with itself. If you want an Android phone, there are dozens to choose from on multiple carriers. This is great for the consumer, but bad for a niche product such as the Nexus One. With high price points for unlocked phones on certain carriers and others, such as Verizon, offering near-irresistible buy-one-get-one-free (which included the Droid) deals, the Nexus One was doomed to be overshadowed by cheaper phones that received a brighter spotlight.&lt;/p&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;Even after tough lessons learned from the Nexus One, I'd like to see Google supervise the creation of another phone. Large industry players, such as Apple and Google, are the only companies that have enough leverage over service providers to cut the crap and deliver a sleek, clean Smartphone to the consumer. Google will be an important player in keeping the Android platform truly open on mobile devices. After all, just because the OS is &amp;quot;open,&amp;quot; manufacturers aren't obligated to let you play as you like on &lt;em&gt;their&lt;/em&gt; devices, such as all the news speculating about the Droid X's &lt;a rel="nofollow" target="_blank" href="http://gizmodo.com/5587801/motorola-is-willing-to-break-the-phone-they-just-sold-you"&gt;eFuse chip&lt;/a&gt;. For the good of the industry, innovation and competition, let's hope that Google phones don't stop with the Nexus One.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/9QEaLS03Kng" height="1" width="1"/&gt;</description>
         <author>brandon</author>
         <guid isPermaLink="false">http://www.nodnarb.net/post.aspx?id=1041a2f6-a4d6-402e-a0d6-cdc1f9b93a48</guid>
         <pubDate>Tue, 20 Jul 2010 08:19:21 +0000</pubDate>
         <category>Computers</category>
      <feedburner:origLink>http://www.nodnarb.net/post/2010/07/20/So-Long-Nexus-One.aspx</feedburner:origLink></item>
      <item>
         <title>This Backup is Gonna Take a While!</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/5aQeD3Gt4pM/This-Backup-is-Gonna-Take-a-While!.aspx</link>
         <description>&lt;p&gt;Just a quick, fun thing to share here. I've been taking a look at backup software over the past week, trying to decide what to use to back up a few additional PCs I have. I've &lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/post.aspx?id=4de187be-5696-42f8-81a2-7a35bf53182d"&gt;written about backup software before&lt;/a&gt;, but this time I'm looking for something that handles the network backups a little bit better than the Acronis home series.&lt;/p&gt;  &lt;p&gt;One software product I began looking into tonight is &lt;a rel="nofollow" target="_blank" href="http://www.novastor.com/novabackup11/index.php"&gt;Novastor NovaBACKUP Professional&lt;/a&gt;. I have never used it before and found it via some searching. One unique feature it has is the ability to run a file copy/synchronize between two locations without writing data to a proprietary backup format file. No other backup software I've been testing recently does that. The functionality is very similar to Microsoft's &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/downloads/details.aspx?familyid=c26efa36-98e0-4ee9-a7c5-98d0592d8c52&amp;amp;displaylang=en"&gt;SyncToy&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I thought I'd throw the largest thing that I have at this feature, which turns out to be a 100-plus gigabyte archive of photographs I've taken over the years. The source was the photo archive on my &lt;a rel="nofollow" target="_blank" href="http://drobo.com/products/drobo-s.php"&gt;Drobo S&lt;/a&gt;. The destination is a network share on an old server that I have. After setting the options, I started the copy, got up and let it run for a bit.&lt;/p&gt;  &lt;p&gt;I would have loved to finish the test, but I don't think I have quite this long to mess around!&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=WeBackYouUpLongTime_1.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="We back you up long time!" border="0" alt="We back you up long time!" src="http://www.nodnarb.net/image.axd?picture=WeBackYouUpLongTime_thumb_1.png" width="680" height="595"/&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now, to be fair to Novastor, the destination server is &lt;strong&gt;&lt;u&gt;old&lt;/u&gt;&lt;/strong&gt; (HP Netserver LH3) and has some problems with file copies over the network. I still thought four years to finish was pretty funny. Maybe Novastor needs to take a look at how they're calculating their estimates under less-than-ideal conditions. Would it have really taken that long? I doubt it, but I'm not willing to find out!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/5aQeD3Gt4pM" height="1" width="1"/&gt;</description>
         <author>brandon</author>
         <guid isPermaLink="false">http://www.nodnarb.net/post.aspx?id=e61be095-e366-496e-8334-f82741b25391</guid>
         <pubDate>Tue, 30 Mar 2010 07:20:03 +0000</pubDate>
      <feedburner:origLink>http://www.nodnarb.net/post/2010/03/30/This-Backup-is-Gonna-Take-a-While!.aspx</feedburner:origLink></item>
      <item>
         <title>Windows 7 Upgrade Time</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/-BjYPz6Vglc/Windows-7-Upgrade-Time.aspx</link>
         <description>&lt;p&gt;If you're as lazy as I, you may have been using the Windows 7 Release Candidate (RC) until just recently. Why just recently? &lt;img style="border-right-width:0px;margin:5px 15px 5px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Windows 7 Expiring popup" src="http://www.nodnarb.net/image.axd?picture=Win7Popup.png" border="0" alt="Windows 7 Expiring popup" width="346" height="108" align="left"/&gt;If you're not in the know, Windows 7 was released for sale in October of last year. Before then, the RC was made publicly available May 5, 2009, with a beta version available before then. During the RC phase, it was well known that the RC version of Windows 7 was set to begin shutting down your PC every two hours starting on March 1. How time flies! A friendly reminder from Microsoft (pictured here) sparked the motivation I needed to kick start my Windows 7 release version installation. Time to get started. [more]&lt;/p&gt;
&lt;p&gt;So why did it take me so long to wipe out the RC and install the final version? Why did I hold out so long? Did I think Microsoft would change their mind? Of course not. Strolling down memory lane, I can recall the good 'ol (bad 'ol?) Win 3.x and 9x days, when re-installing my OS was a every-few-month ritual. Back then, half-baked application installers/uninstallers and OS tweaking, over time, either made your PC either completely unusable or bogged it down to the point it became unstable and impractical to tolerate. Backing up, formatting, and starting anew was not an unfamiliar process to computer geeks of that time. In hindsight, I can say I learned a lot from it and knew what I was getting myself into each time. Anyway, now it's not necessary to backup, format, and re-install your OS from scratch as often. Despite all our complaints about Windows, the OS has actually come a very long way in terms of stability and problem recovery. The machine of mine to be upgraded now was upgraded to the Windows 7 Beta from and initial installation of Windows Vista, which was installed in late 2008. It was then upgraded to the Windows 7 RC from the beta in May 2009. Even though upgrades to these editions weren't officially supported by Microsoft, &lt;a rel="nofollow" target="_blank" href="http://windows7news.com/2009/04/09/windows-7-beta-to-rc-upgrade-instructions/"&gt;there were ways&lt;/a&gt;. Also, I have to say, for a prerelease operating system, the Windows 7 RC was solid. I had better luck with it on this PC than I &lt;em&gt;ever&lt;/em&gt; had with Vista. It was faster and more stable than Vista had ever been on this computer's hardware. To summarize, I was pretty happy with the Windows 7 RC. Why fix it if it's not broken?&lt;/p&gt;
&lt;p align="left"&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px auto 10px;display:block;float:none;border-top:0px;border-right:0px;" title="Windows 7 is expiring for reals" src="http://www.nodnarb.net/image.axd?picture=Win7Expire.png" border="0" alt="Windows 7 is expiring for reals" width="633" height="553"/&gt;&lt;/p&gt;
&lt;p&gt;Oh, right...Guess I'd better get on that!&lt;/p&gt;
&lt;p&gt;It's been a long time since a format and re-install of my personal PC. I used to do this all the time, so why is it such a pain now? It made me realize that in the 1990s, we didn't have gigabytes of digital photos, music, videos, and everything else we hoard on our PCs now. In 1996, a gigabyte seemed like a lot more than what it is now. Heck, I carry 16 gigabytes in my pocket, on my phone. Reformatting and re-installing an OS is a bigger pain because we just have a lot more stuff than we used to.&lt;/p&gt;
&lt;h2&gt;Step 1: Back dat up!&lt;/h2&gt;
&lt;p&gt;I've &lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/post.aspx?id=4de187be-5696-42f8-81a2-7a35bf53182d"&gt;previously written about my backup and restore experiences&lt;/a&gt;. If you're not backing up your PC or Mac, you're taking a huge risk. Of course, this depends on how important the data on your PC is to you. I've seen people who could not have cared less about a failed hard drive and those who are devastated at the loss. Be sure you know where you fall when it comes to data loss.&lt;/p&gt;
&lt;p&gt;First, I performed a full backup of my PC, running the Windows 7 RC, to an external USB hard drive using &lt;a rel="nofollow" target="_blank" href="http://www.acronis.com/homecomputing/products/trueimage/"&gt;Acronis True Image Home 2010&lt;/a&gt;. Simple enough. This would give me a good backup that I could pick data out of once I've restored.&lt;/p&gt;
&lt;p&gt;The problem with a traditional backup like this is that once you've wiped out your machine and re-installed the OS, you have to pick and choose your data out of your backup's archive. What if you can't get to some data you're wanting, like how you had an application set up or some account information that was stored in an application and isn't accessible via the file system? Also, once you've taken the step to wipe out and start over, it can take some time to get your apps re-installed, patched, and reconfigured to the way you like it. This was my primary PC, so I wanted as little downtime as possible.&lt;/p&gt;
&lt;h2&gt;Step 2: A different way to back up&lt;/h2&gt;
&lt;p&gt;One of the cool new, but not often mentioned, features of Windows 7 is its ability to boot from .VHD files. VHD stands for &lt;em&gt;virtual hard disk&lt;/em&gt;. It's the same technology used in &lt;a rel="nofollow" target="_blank" href="http://www.acronis.com/homecomputing/products/trueimage/"&gt;Microsoft Virtual PC&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/windowsserver2008/en/us/hyperv-main.aspx"&gt;Hyper-V&lt;/a&gt; to store the contents of virtual machines. When I say "boot from .vhd," I'm not talking about booting up a &lt;strong&gt;virtual machine&lt;/strong&gt; either inside Virtual PC or Hyper-V. I'm talking about booting up your "&lt;span style="text-decoration:underline;"&gt;real&lt;/span&gt;" hardware from a .vhd file, just like you'd normally boot your system from your C drive. You can read this &lt;a rel="nofollow" target="_blank" href="http://technet.microsoft.com/en-us/library/dd799299%28WS.10%29.aspx#"&gt;Microsoft Technet article&lt;/a&gt; on how to use the bcdedit tool to edit your computer's boot loader in order to boot from a .vhd file. I believe this works on Windows 7 Professional and higher. I'm not sure about the other editions.&lt;/p&gt;
&lt;p&gt;I heard about booting from .vhd during the Windows 7 RC phase and wanted to try it out since then. I'm lucky in the sense that I just happen to have another PC here with very similar hardware compared to the PC I am reloading. My plan was to convert my Windows 7 RC's drive to a .vhd, move it to the other computer (where the Windows 7 Ultimate release version is installed), configure it to boot from the .vhd of my old PC, and re-install my Windows 7 RC PC with the release version of Windows 7. This would allow me to reload my RC machine while still being able to use my apps on my ".vhd PC" and transfer my files and settings from the old to the new at my leisure.&lt;/p&gt;
&lt;p&gt;The first step in this plan was to back up my Windows 7 RC installation to a .vhd file. There are some commercial tools available to do this, but there's an even better (and free!) tool from Microsoft (Sysinternals) called &lt;a rel="nofollow" target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/ee656415.aspx"&gt;Disk2VHD&lt;/a&gt; which does an excellent job. I downloaded disk2vhd on my Windows 7 RC machine, ran the program and saved my system's C partition and boot partition to a .vhd file on my external hard drive. I then moved the .vhd file to my other Windows 7 PC via my home network. Then, on the Windows 7 PC to where I moved the .vhd, I followed the instructions to add the .vhd to that system's boot menu. One note about the Technet article. You'll need to put square brackets around the drive letter when using bcdedit. The article isn't 100% clear on this. For instance, if you copy your .vhd file to d:&amp;#92;oldpc&amp;#92;oldcdrive.vhd, you'll need to refer to this as "[d]:&amp;#92;oldpc&amp;#92;oldcdrive.vhd" (without quotes) when using bcdedit.&lt;/p&gt;
&lt;p&gt;Next, I rebooted my PC containing the .vhd file into the Windows 7 RC operating system residing in the .vhd file. Upon boot, you're given a choice of which operating system to start, so just pick the one you created during the bcdedit steps. This worked perfectly! Once the operating system came up, Windows began re-detecting my hardware. When that happens, a reboot is required. I went through a few detection and reboot cycles, but, eventually, I was able to use my Windows 7 RC operating system just like it was on the original PC. Because all of that hardware redecting occurred, Windows 7 RC fell out of activation...so I had to re-activate Windows. I thought this was a little ironic, since I'd only be using this for a short time.&lt;/p&gt;
&lt;p&gt;One &lt;strong&gt;very important note&lt;/strong&gt;. When Disk2VHD creates your .vhd file, it only consumes as much drive space as the amount of data taken up on your source disk(s). For example, on your source PC (my Windows 7 RC computer), let's assume you want to back up your 640 GB C drive to a .vhd file. Let's also assume you're only using 230 GB out of the total 640 GB. Disk2VHD thusly creates a 230 GB .vhd file. You then move this to another PC and follow the bcdedit steps. The drive on this destination PC where you copied this .vhd &lt;span style="text-decoration:underline;"&gt;must have enough free space to account for the entire source disk&lt;/span&gt;, which in our case is 640 GB. The reason this is so is because the size of the .vhd is dynamically expanded to the size of the source disk when you boot the .vhd-based operating system. If the physical hard drive does not have enough free space to account for the total size of the virtual hard disk file, you'll receive the famous blue screen of death when you attempt to boot the operating system in your .vhd file.&lt;/p&gt;
&lt;h2&gt;Step 3: Re-install at your own pace&lt;/h2&gt;
&lt;p&gt;Once I had my .vhd-based operating system up and running on my other computer, I was free to format and re-install the Windows 7 release version on my primary PC when I wanted to. Over the next few days, I re-installed all my applications and copied my data from the .vhd PC to the newly reloaded Windows 7 PC over my home network. It enabled me to ensure that my applications worked just like they did on the Windows 7 RC installation. If something came up while installing my applications on the newly reloaded PC, I could easily switch over to the PC running my Windows 7 RC .vhd.&lt;/p&gt;
&lt;h2&gt;Conclusion and afterthoughts:&lt;/h2&gt;
&lt;p&gt;Using the .vhd method, I was able to reload my computer's operating system while making sure I didn't lose anything important. Having both systems available at the same time made it really easy to verify everything was re-installed and working properly. One idea I'd like to mention is that it does not necessarily require another physical computer to pull off this technique. You could just as easily use Disk2VHD to create your VHD and then run it as a virtual machine in Virtual PC if you only have one physical PC available. I chose to use the second PC because I had it available and also because I wanted to try out bcdedit and .vhd booting. Overall, I'm very happy with how it turned out.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/-BjYPz6Vglc" height="1" width="1"/&gt;</description>
         <author>brandon</author>
         <guid isPermaLink="false">http://www.nodnarb.net/post.aspx?id=0ad74e57-277a-4299-8d15-45b1f10ba905</guid>
         <pubDate>Sun, 07 Mar 2010 02:53:00 +0000</pubDate>
         <category>Computers</category>
      <feedburner:origLink>http://www.nodnarb.net/post/2010/03/06/Windows-7-Upgrade-Time.aspx</feedburner:origLink></item>
      <item>
         <title>My Thoughts on the iPad</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/caWoSbSiXhY/My-Thoughts-on-the-iPad.aspx</link>
         <description>&lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Steve and his iPad" border="0" alt="Steve and his iPad" align="left" src="http://www.nodnarb.net/image.axd?picture=iPadPhones.jpg" width="134" height="236"/&gt;&amp;quot;Magical, revolutionary&amp;quot;... these are among the &lt;a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=1ZS8HqOGTbA"&gt;many words&lt;/a&gt; Steve Jobs and company used to describe the iPad during the device's announcement Jan. 27. &lt;/p&gt;  &lt;p&gt;Is it, though? Right now, it kind of looks like a big iPhone or iPod Touch ...&lt;/p&gt;  &lt;p&gt;The majority of people I have seen discussing the iPad online or talked to in person about it have a lot of hate for the device. Are these your typical Apple bashers feasting upon the latest fresh meat from Cupertino or are there some valid points among the name-calling and panty liner jokes?&lt;/p&gt;  &lt;p&gt;While the iPad is a neat device, many of the naysayers have good points when it comes to what isn't included. I'm not a belittler. I'm looking forward to trying one out and, maybe, buying one &lt;strong&gt;&lt;u&gt;if&lt;/u&gt;&lt;/strong&gt; I like it. I thought I'd use this post to bring up some intelligent pros/cons about it. If that doesn't suit you, halt your reading now! [more]&lt;/p&gt;  &lt;p&gt;Only one friend I've talked to about the iPad had positive comments about it and looked forward to trying it out. The rest, however, had some of the following to say:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&amp;quot;I want to show you something, and I'm really excited about this, it's the iPad mini (pulls out his iPhone).&amp;quot; &lt;/li&gt;    &lt;li&gt;&amp;quot;No multitasking, no cameras (front or rear), hideously over-size bezel, no Flash in browser, no input ports of any kind ...&amp;quot; &lt;/li&gt;    &lt;li&gt;&amp;quot;No multitasking, no camera, no HDMI out, no USB without adaptors, no Adobe Flash support, no widescreen, no thanks.&amp;quot; &lt;/li&gt;    &lt;li&gt;&amp;quot;It's a netbook without Flash, without a keyboard and a crappy OS laden with DRM. And for only 3x the price of a netbook!&amp;quot;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You get the idea.&lt;/p&gt;  &lt;p&gt;I want to touch on a few of these points, of which Apple has missed the mark or deliberately planned, and offer up my opinion, drawing from experiences I've had with the iPhone and other mobile devices I've used, such as netbooks, laptops and tablet PCs.&lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h2&gt;&lt;/h2&gt;  &lt;h2&gt;Cameras:&lt;/h2&gt;  &lt;p&gt;A lot of people, including myself, expected the iPad to have a user-facing camera for video chat. Apple, after all, has been building cameras into iMacs and Macbooks for a few years now. Why not include a camera in &lt;em&gt;this&lt;/em&gt; device? You could be sitting in your favorite easy chair, iChatting with your buddy or grandma. Maybe it has to do with how the iPad will be held? In a desktop or laptop (or netbook), the screen stays in a relatively fixed position when you're using it. The hardware vendor can count on where the position of your face is in relation to the camera, most of the time. If you need to adjust, simply tilt the screen. The iPad, according to Jobs at the Apple announcement event, has no true up or down because it &amp;quot;adapts to the way [you] want to use it.&amp;quot; Taking that into account, maybe it is too cumbersome to use for video chat. After all, you'd have to hold it in a fixed position for the entire conversation. The iPad, at 1.5 pounds, isn't that heavy, but I know I'd get annoyed with holding it in a certain way in front of me for more than a few minutes. Excluding a camera is not a deal breaker for me. I don't video chat now, nor do I know anyone who currently does. For those who do, it would have been nice to include in the iPad, especially when it's seated in the optional dock. &lt;/p&gt;  &lt;p&gt;Fantasy time. A &lt;strong&gt;really neat&lt;/strong&gt; innovation would be to somehow have the camera &lt;em&gt;behind/inside&lt;/em&gt; the middle of the screen instead of in the bezel. Being able to video chat while looking directly at the screen would make the act of video chatting practical, or at least more personal. Now, when you video chat, the image of the person you're chatting with shows them not looking directly at you, but looking at their screen (looking at you looking at &lt;em&gt;your&lt;/em&gt; screen). With the way video chat works now, it's like you're standing face to face talking to someone, except you're looking at each other's chins instead of looking at the eyes. Before this gets too crazy, though, let's consider this could be a pretty creepy device. If you want to block the webcam in your monitor now, black electrical tape works great. An in-screen camera would raise a whole new line of privacy concerns.&lt;/p&gt;  &lt;p&gt;As far as having a camera on the back, just get a real camera! Laptops and netbooks don't implement rear facing cameras, so I don't know why anyone would expect the iPad to.&lt;/p&gt;  &lt;h2&gt;Flash:&lt;/h2&gt;  &lt;p&gt;I'm not surprised about the exclusion of Adobe Flash support on the iPad. Apple, with many revisions of the iPhone OS, has had plenty of chances to include it. You've probably already read the back and forth between &lt;a rel="nofollow" target="_blank" href="http://www.iphonehacks.com/2010/01/steve-jobs-google-adobe-flash-next-gen-iphone-new-macs.html"&gt;Apple&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://blogs.adobe.com/flashplatform/2010/01/enabling_innovation_isnt_magic.html"&gt;Adobe&lt;/a&gt; regarding Flash. Interactive Flash content on the iPhone would be hard to use and I don't find myself missing it. However, full Flash video support would be nice and I &lt;em&gt;do&lt;/em&gt; miss that. Flash on the iPad should be a standard feature and it detracts from that &amp;quot;wonderful experience&amp;quot; we're being promised. I was surprised to see Jobs browsing pages in the iPad demo that would show the big, ugly &amp;quot;missing plug-in&amp;quot; graphic. Didn't they check that out before the show? &lt;/p&gt;  &lt;p&gt;The deeper question to ask is why is Apple (namely, Steve) being so critical of Adobe? I believe Adobe was largely responsible for making Apple products a success for many years. How many graphic-artsy, video-centric folks do you know that use Apple products for their trade? Adobe, after all, could just decide to no longer produce Apple software. Do you think Adobe or Apple would suffer more for this? Adobe already offers most, if not all, of their products for Windows. Apple, on the other hand, has no Photoshop replacement waiting in the wings. I think &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Tim_Gunn"&gt;Tim Gunn&lt;/a&gt;needs to bring Apple and Adobe into the same room and give them a good &amp;quot;make it work&amp;quot; talking to. Heck, I guess they could go Silverlight. Oh, wait, &lt;a rel="nofollow" target="_blank" href="http://mashable.com/2009/11/27/silverlight-iphone/"&gt;maybe they are&lt;/a&gt;?&lt;/p&gt;  &lt;h2&gt;GPS:&lt;/h2&gt;  &lt;p&gt;The &lt;a rel="nofollow" target="_blank" href="http://www.apple.com/ipad/specs/"&gt;details on GPS&lt;/a&gt; are a letdown. The WiFi + 3G version will have AGPS (&lt;em&gt;Assisted&lt;/em&gt; GPS). With all that room inside of the iPad, Apple couldn't fit a &lt;u&gt;true&lt;/u&gt; GPS? If full GPS capability isn't included in all the models, it will cripple the usefulness of many of the available apps when taken from the iPhone to the iPad. WiFi-only customers seem to be out of luck if you're somewhere without a signal. Maybe Apple doesn't want you to file a lawsuit against them, because you, being so smart, decided to mount your iPad on your car's dash or windshield in order to have the baddest-ass navigation display on the planet.&lt;/p&gt;  &lt;h2&gt;Aspect Ratio:&lt;/h2&gt;  &lt;p&gt;I don't work for Apple, but if I had to guess, the decision to stick with 4:3 at 1024 x 768 came down to a decision having to do with compatibility and cost. Compatibility in the sense that going with a 16:9 ratio may have too greatly skewed non-iPad optimized apps running on the device. True, the pixel-doubled iPhone and iPod Touch apps in Apple's videos don't fill the iPad's screen entirely, but they do appear to fit nicely. Browsing the Web in portrait mode on a 9.7 inch 16:9 screen would probably not be pleasant, either. If you have a 19 inch wide-screen LCD monitor, for instance, try putting it into portrait mode and do some browsing. Chances are you'll be doing some side scrolling (a true Web browsing annoyance on any platform), because most Web content is too wide to fit in a narrower presentation mode. True, Apple could do some things, such as make it 16:10 or increase the resolution, but that brings in the cost factor. I think high-end screen features like HD and widescreen were first on the chopping block when Apple set their price goals for the iPad to be below $1,000.&lt;/p&gt;  &lt;h2&gt;HDMI:&lt;/h2&gt;  &lt;p&gt;I'm not surprised that HDMI was excluded. Apple's look and feel in all their devices is all about clean lines. I have no doubts about their new A4 processor having the capability to pump out 1080p HD video, but putting a port on the device would be design blasphemy as it's seen by Apple. You'd think there would at least be a 30 pin-to-HDMI cable. Apple's agenda could include other reasons for limiting the external display output, though. Consider the Apple TV. Having a fully HD-capable iPad has the possibility of cutting into the Apple TV's space. This is kind of a long shot, because you get a device like Apple TV so you can leave it attached to your entertainment system all the time. The iPad could breathe new life into Apple TV by working with it as you watch your content via Apple TV on your television. Not that I'm an Apple TV fan. In fact, I've never used one. Apple has to be cooking up something. Picture this: You could be watching your TV show/movie on your Apple TV while the iPad displays information, extras and all kinds of other information about what you're viewing at your fingertips. Using a movie's menu system on an iPad could eliminate the clunky, remote control-driven experience we're used to on DVD and Blu-Ray discs today. Let's not forget that if you have to stop watching on Apple TV, you can take your iPad with you and pick up where you left off.&lt;/p&gt;  &lt;h2&gt;USB:&lt;/h2&gt;  &lt;p&gt;Another missing feature that wasn't a surprise, but definitely a letdown. As an amateur photographer, I'd rather plug my camera or SD card directly into the iPad rather than use their camera kit. I think USB is excluded for two main reasons. One of them, again, is Apple's clean-line design. They could put one port on it, sure, but then people would just want more from there. No way is Apple going to make their new golden boy gaudy by sticking USB ports on all sides. The second – and principal – reason is expandability. Apple charges an extra $100 to double the storage capacity from one model to the next. Including USB ports would open the floodgates to a new generation of jail breakers and cut into sales of the higher-capacity, more expensive models. With USB flash drives getting &lt;a rel="nofollow" target="_blank" href="http://www.newegg.com/Product/Product.aspx?Item=N82E16820178259&amp;amp;cm_re=usb_flash_drive-_-20-178-259-_-Product"&gt;so tiny&lt;/a&gt;, I have no doubt this was part of Apple's consideration when it came to leaving off USB. True, the camera kit will give you USB and SD and I have no doubt jail breakers will find a way to use these for storage expansion. The fact that they stick out of the iPad's 30-pin connector all of the time, though, will make using them as a permanent storage expansion solution kind of cumbersome. Speaking of the 30-pin connector, if it weren't for all of the accessories that require it out there, I think Apple would have eliminated that, too. Charging could be adapted to the MagSafe connector, like what is found on Macbooks. Syncing to iTunes could be done over WiFi or Bluetooth. I predict the 30-pin connector will be history within the next four years.&lt;/p&gt;  &lt;h2&gt;Micro SIM:&lt;/h2&gt;  &lt;p&gt;WTF is a micro SIM, anyway? Many people had similar reactions after the Jan. 27 announcement. It's a form factor that has &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Micro-SIM"&gt;been around awhile&lt;/a&gt;, just not widely used. It's obvious this is just a &lt;a rel="nofollow" target="_blank" href="http://www.wired.com/epicenter/2010/02/micro-sim-business/"&gt;strong-arm tactic&lt;/a&gt; by AT&amp;amp;T to prevent anyone from using their existing service on the iPad. I'd love to know the insider secrets that keep Apple and AT&amp;amp;T married so tightly together in the U.S., especially after so much &lt;a rel="nofollow" target="_blank" href="http://www.networkworld.com/news/2009/120209-att-customer-satisfaction.html"&gt;customer dissatisfaction&lt;/a&gt; when it comes to AT&amp;amp;T in general. If I were to buy an iPad and had a choice of carriers, I'd get a &lt;a rel="nofollow" target="_blank" href="http://www.businessinsider.com/verizon-ipad-is-happening-verizon-source-says-2010-2"&gt;Verizon iPad&lt;/a&gt; over AT&amp;amp;T, just to stick it to them.&lt;/p&gt;  &lt;h2&gt;Multitasking:&lt;/h2&gt;  &lt;p&gt;Before I got my iPhone, I had an HTC TyTn (Cingular 8525) that ran Windows Mobile 6. It was absolutely horrible at multitasking. The experience was awful. True, it was probably just a terrible piece of hardware to begin with, but I did not miss multitasking when I switched to the iPhone. Background apps on my 8525 would constantly crash or require killing via a task manager and the battery would drain significantly if I didn't bother to kill them. I pulled the battery on that phone quite often. Task notifications, such as for a new instant message, also were bad about robbing the focus away from your current application no matter what you were doing. Yes, I'm sure it's gotten better on mobile phones since then, maybe even on Windows Mobile (or whatever Microsoft is calling it these days). I'd really like to see how Android handles it. Anyway, we're talking about the iPad here. Getting away without multitasking on the iPhone has been acceptable for me so far, but the iPad should include it. Task switching on a device with more screen real-estate is a more realistic option on the iPad. Because it runs the iPhone OS, though, I don't see the iPad featuring multitasking until they branch the OS into something more iPad specific. A drawback about having such a vastly popular catalog of iPhone and iPod Touch apps that run on the iPad is how to effectively and design a task-switching and notification interface that will be compatible with them while they still maintain compatibility with the iPhone/iPod Touch. It's not like the iPhone OS &lt;em&gt;doesn't&lt;/em&gt; run background apps. It runs plenty of them, such as e-mail, SMS, iTunes ... only the things Apple directly controls, of course. As competition among iPad-like devices heats up, Apple will eventually have to cave on multitasking.&lt;/p&gt;  &lt;h2&gt;Software:&lt;/h2&gt;  &lt;p&gt;The iPad's applications are going to be what makes this device popular. Love or hate the iPhone, there's no denying that many of the applications that have been created for it changed people's expectations for smart phones. Re-watch the beginning of the iPad's announcement event if you still don't believe that. One question on my mind, and on the minds of many, is am I going to have to re-purchase the apps on my iPhone to be able to use them on the iPad? Chances are likely not for this one, which is a good thing. I've read that you can transfer iPhone apps to an iPod Touch. I'd assume you can transfer to an iPad as one of your five eligible devices that content can be transferred to. I am positive that developers will charge a premium for iPad apps and will have different prices for buying apps that are either iPhone or iPad optimized. Maintaining the code differences for the two form factors does take extra time. As a software developer, wouldn't you?&lt;/p&gt;  &lt;h2&gt;Conclusion:&lt;/h2&gt;  &lt;p&gt;So, after all this, will I anxiously await online for the iPad pre-ordering system to launch? That's a tough call. I've had a drink of the Apple Kool-Aid several times and it tastes good, my friend. As I try to keep myself focused, though, I would like to hold it in my hands a use it a bit before making an impulse buy online. Despite the obvious pitfalls, the iPad has potential to become very successful, just like the iPhone did, over the next few years. Will other manufacturers sit by in the face of Apple's latest innovation this time? I doubt it. Will this be the end of the netbook? Not yet. Will there continue to be plenty of iPad skepticism and nay-saying? Yes. Will they be as wrong as they were about the success of the iPhone? &lt;a rel="nofollow" target="_blank" href="http://www.pcworld.com/article/188386/are_ipad_skeptics_as_wrong_as_iphone_naysayers_were.html"&gt;Maybe&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/caWoSbSiXhY" height="1" width="1"/&gt;</description>
         <author>brandon</author>
         <guid isPermaLink="false">http://www.nodnarb.net/post.aspx?id=3b23be5b-f9fc-4082-9ad8-d0cfe95caca8</guid>
         <pubDate>Sat, 06 Feb 2010 19:03:11 +0000</pubDate>
         <category>Computers</category>
      <feedburner:origLink>http://www.nodnarb.net/post/2010/02/06/My-Thoughts-on-the-iPad.aspx</feedburner:origLink></item>
      <item>
         <title>C# – Re-Throwing a Used Exception</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/EhP8oTlipxE/c-re-throwing-used-exception.html</link>
         <description>&lt;p&gt;A colleague of mine pointed this out to me the other day.&amp;#160; When handling exceptions in C#, you can preserve the original stack trace of an exception you are working with in a &lt;em&gt;catch&lt;/em&gt; block by simply using &lt;em&gt;throw;&lt;/em&gt; like so:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:893f2327-53ab-4f3b-9fc8-0b7deae1e60d" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;RaiseException();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; ex)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// do something with ex&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Previously, I had thought that you could only preserve the stack trace by wrapping the exception with another exception like the following:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:586c43ef-b43e-4a2e-bdbc-72721c7aa0e7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;RaiseException();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; ex)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;desc&amp;gt;&amp;quot;&lt;/span&gt;, ex);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The above is rather cumbersome in that it introduces an inner exception in the stack trace and increases memory usage and garbage collection due to the creation and disposal of the wrapper exceptions.&amp;#160; However, that is a better alternative than losing your original stack trace information by using &lt;em&gt;throw ex;&lt;/em&gt; like so:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:227493a9-cca2-49df-9781-134279862375" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;RaiseException();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; ex)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// do something with ex&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; ex;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;I had mistakenly thought that the only case in which you could re-throw an exception is when you were not creating a reference to it because you were not going to use it for anything like so:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:63e1e5e0-9989-43e2-99fc-f154092060ac" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;RaiseException();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// do something not with ex&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;However, that is not the case!&amp;#160; You can re-throw a used exception with &lt;em&gt;throw;&lt;/em&gt; instead!&amp;#160; No more wrapper exceptions!&amp;#160; Pristine stack traces for killer debugging!&amp;#160; Life is beautiful!&lt;/p&gt;  &lt;p&gt;More practically, though, the following are what I believe to be the best practice guidelines for re-throwing exceptions:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;throw;&lt;/strong&gt;&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;If you want to preserve the original stack trace (which you usually do), use throw;—even if you are referencing the exception for other nefarious purposes.&lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Do this most of the time.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;&lt;strong&gt;throw ex;&lt;/strong&gt;&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;If you *do not* want to preserve the original stack trace (which you usually *do not* want to do because it can make debugging much more difficult), use throw ex;.&amp;#160; The only reason I can think of to do this is when you want to make it look like an exception is coming from within your code rather than the code belonging to a third-party.&amp;#160; If you can think of other reasons, I would be more than happy to hear them.&lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Don’t do this.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;&lt;strong&gt;throw new Exception(“&amp;lt;desc&amp;gt;”, ex);&lt;/strong&gt;&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;If you want to preserve the original stack trace but you want to communicate the exception using a different type, use a wrapper exception.&amp;#160; Be warned, though, that this can make your stack traces harder to read and increase heap thrashing and time spent in GC.&lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Do this the rest of the time, but only if you absolutely need a more specific or more appropriate type of exception thrown.&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;(As an aside, the examples above contain uses of the generic &lt;em&gt;Exception&lt;/em&gt; class, which is a no-no in C#.&amp;#160; You should not catch &lt;em&gt;Exception&lt;/em&gt;.&amp;#160; You should not throw &lt;em&gt;Exception&lt;/em&gt;.&amp;#160; You should only catch and throw specific types of exceptions that you care about and let the rest bubble up to calling code.&amp;#160; The only exception to this—pun intended—is to provide an exception catch-all around the starting point of each thread to centralize the handling of unanticipated exceptions and to prevent them from reaching the CLR thread pool and crashing the process.)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/-Y-JR9eh6lg" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/EhP8oTlipxE" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-3439683077515838114</guid>
         <pubDate>Fri, 01 Jan 2010 00:12:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/-Y-JR9eh6lg/c-re-throwing-used-exception.html</feedburner:origLink></item>
      <item>
         <title>Wolfram Alpha in Bing</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/ZtsJJoGvkN4/wolfram-alpha-in-bing.html</link>
         <description>&lt;p&gt;I don’t usually get involved in search provider wars (let alone browser wars), but, after reading David Barney’s snippet “Wolfram Alpha Breaks Search Engine Mold” in the December 2009 issue of &lt;a rel="nofollow" target="_blank" href="http://redmondmag.com/"&gt;&lt;em&gt;Redmond&lt;/em&gt; magazine&lt;/a&gt;, I must say that I am pretty excited about the future of &lt;a rel="nofollow" target="_blank" href="http://www.bing.com/"&gt;Bing&lt;/a&gt; and its inclusion of &lt;a rel="nofollow" target="_blank" href="http://www.wolframalpha.com/"&gt;Wolfram Alpha&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Wolfram Alpha is the latest project from &lt;a rel="nofollow" target="_blank" href="http://www.wolfram.com/"&gt;Wolfram Research&lt;/a&gt;—makers of &lt;a rel="nofollow" target="_blank" href="http://www.wolfram.com/products/mathematica/"&gt;Mathematica&lt;/a&gt;, the bane and the salvation of college math students around the world.&amp;#160; Wolfram Alpha is the world’s first knowledge search engine—focused on facts and formulas rather than raw content.&amp;#160; It solves complex calculations and graphs them for you, shows important tidbits of information about many subjects, slices, dices, and juliennes!&amp;#160; Exciting stuff!&amp;#160; As the Dragnet boys would say, Wolfram Alpha is “just the facts, ma’am.”&lt;/p&gt;  &lt;p&gt;With Bing surfacing Wolfram Alpha in its search results in the near future, I am very curious to see how well &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt; can meld its traditional content-based search engine with the up-and-coming fact-based knowledge search offered by Wolfram Alpha.&amp;#160; Can Microsoft achieve the right balance between web and formulae?&amp;#160; We shall see.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/a4Mqt2e95fc" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/ZtsJJoGvkN4" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-5005684626922863965</guid>
         <pubDate>Thu, 24 Dec 2009 01:15:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/a4Mqt2e95fc/wolfram-alpha-in-bing.html</feedburner:origLink></item>
      <item>
         <title>Microsoft Loses to Google</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/y8Ib8KxLuRc/microsoft-loses-to-google.html</link>
         <description>&lt;p&gt;I am not really sure what the hubbub is all about lately.&amp;#160; &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt; lost a contract to &lt;a rel="nofollow" target="_blank" href="http://www.google.com/"&gt;Google&lt;/a&gt; in October for email services for the City of Los Angeles.&amp;#160; Some speculate that losing the $7.2 million contract to Google shows that Microsoft is behind the times.&amp;#160; Some speculate that it shows that Software-as-a-Service (&lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Software_as_a_service"&gt;SaaS&lt;/a&gt;) is the wave of the future.&lt;/p&gt;  &lt;p&gt;To me, though, it’s a bunch of hullabaloo.&amp;#160; It’s just a contract, like any other.&amp;#160; The City of Los Angeles weighed all of their options on how to replace their aging Novell GroupWise installation and decided that Google’s cloud platform fit their needs the best.&amp;#160; That’s just business, and smart business at that.&amp;#160; I applaud the City of Los Angeles for exploring a new avenue instead of burying its head in the sand like many government entities.&lt;/p&gt;  &lt;p&gt;Does that mean that Gmail in the cloud is an Exchange killer?&amp;#160; No.&amp;#160; Does that mean client-server solutions are dead?&amp;#160; Of course not.&amp;#160; It does mean, though, that the cloud does mean business, and that business is no longer relegated to startups and small companies.&amp;#160; Behemoths like Microsoft, &lt;a rel="nofollow" target="_blank" href="http://www.ibm.com/us/en/"&gt;IBM&lt;/a&gt;, and &lt;a rel="nofollow" target="_blank" href="http://www.sap.com/usa/"&gt;SAP&lt;/a&gt; will need to adjust their business plans to account for smaller and more agile cloud-based competitors.&amp;#160; Failure to do so risks falling behind the times.&lt;/p&gt;  &lt;p&gt;Maybe this will mean cheaper upgrades to Windows 8!&amp;#160; One can only hope.&lt;/p&gt;  &lt;p&gt;(Many thanks to Lee Pender’s article &lt;a rel="nofollow" target="_blank" href="http://redmondmag.com/Articles/2009/12/01/Clouds-in-LA.aspx"&gt;“Clouds in L.A.: Microsoft Loses Los Angeles Contract to Google”&lt;/a&gt; in the December 2009 issue of &lt;a rel="nofollow" target="_blank" href="http://redmondmag.com/"&gt;&lt;em&gt;Redmond&lt;/em&gt; magazine&lt;/a&gt; for the details.)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/-MEFD9Yb2dE" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/y8Ib8KxLuRc" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-8137111499921794687</guid>
         <pubDate>Sun, 20 Dec 2009 22:49:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/-MEFD9Yb2dE/microsoft-loses-to-google.html</feedburner:origLink></item>
      <item>
         <title>Azure and the AppFabric</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/syQdlQv5m8U/azure-and-appfabric.html</link>
         <description>&lt;p&gt;I know I don’t always come off as the biggest fan of cloud computing, but in my heart of hearts I do find it a very interesting subject—both from a business and from a technical perspective.&amp;#160; Maybe that is why I write critically about it so much: I know that it is a technology with a lot of promise but also with a lot of challenges.&amp;#160; To make matters worse, I have a tendency to shun new buzzwords since, in my experience, they do not live up to their hype—at least not at first.&lt;/p&gt;  &lt;p&gt;So, putting my skepticism aside for once, I am very excited about the possibilities for the &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/windowsserver/ee695849.aspx"&gt;AppFabric&lt;/a&gt; layer of &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/windowsazure/"&gt;Windows Azure&lt;/a&gt;.&amp;#160; Charles Babcock’s article “AppFabric Key to Getting Developers on Azure” in the November 23, 2009, issue of &lt;a rel="nofollow" target="_blank" href="http://www.informationweek.com/"&gt;InformationWeek&lt;/a&gt; highlights the high points—dynamic caching and dynamic scaling.&amp;#160; The gist of it, though, is the ability for an application to decide on its own when to bite the bullet and create a cache or scale out by allocating additional instances during peak demand.&amp;#160; Just imagine not having to worry if your data center can handle an order of magnitude spike in use.&amp;#160; Amazing stuff.&lt;/p&gt;  &lt;p&gt;I’m sure the devil is in the details as always, though, but I’m excited to see what &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt; can do with AppFabric.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/hB8RXLdX8jQ" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/syQdlQv5m8U" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-5190847700891829946</guid>
         <pubDate>Sat, 19 Dec 2009 15:44:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/hB8RXLdX8jQ/azure-and-appfabric.html</feedburner:origLink></item>
      <item>
         <title>PrinterOnFireException</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/lf7x5nWy0yA/printeronfireexception.html</link>
         <description>&lt;p&gt;For some reason, I remembered something this morning that made me chuckle.&amp;#160; One of the early pre-betas of the .NET framework shipped with a hilarious Easter egg: the &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/brada/archive/2005/01/31/363837.aspx"&gt;PrinterOnFireException&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I can just imagine it—a print job gone horribly wrong.&amp;#160; Flaming check stock shooting across the room.&amp;#160; Workers fleeing in panic, hands waving in the air.&amp;#160; Firemen axing the poor printer to death.&lt;/p&gt;  &lt;p&gt;Good times.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/w1RIRq-Tqeo" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/lf7x5nWy0yA" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-3188939527149026855</guid>
         <pubDate>Sat, 19 Dec 2009 03:14:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/w1RIRq-Tqeo/printeronfireexception.html</feedburner:origLink></item>
      <item>
         <title>Peer-to-Peer Government</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/FupiJi3Layo/peer-to-peer-government.html</link>
         <description>&lt;p&gt;I read something rather disturbing the other day in the November 23, 2009, issue of &lt;a rel="nofollow" target="_blank" href="http://www.informationweek.com/"&gt;InformationWeek&lt;/a&gt;.&amp;#160; &lt;a rel="nofollow" target="_blank" href="http://www.informationweek.com/authors/showAuthor.jhtml?authorID=6419"&gt;J. Nicholas Hoover&lt;/a&gt;’s article “Feds Face P2P Clampdown” brings to light several recent leaks of sensitive government information via, of all things, peer-to-peer applications such as &lt;a rel="nofollow" target="_blank" href="http://www.limewire.com/"&gt;LimeWire&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://www.bittorrent.com/"&gt;BitTorrent&lt;/a&gt; that were inappropriately installed on computers operated by federal employees.&lt;/p&gt;  &lt;p&gt;Seriously?&amp;#160; Government IT cannot detect that its users are installing P2P software that, as we all know, is an enormous security risk to any organization?&amp;#160; Is application white-listing and firewalls really that hard to configure?&amp;#160; I think not.&lt;/p&gt;  &lt;p&gt;An ounce of prevention is worth a pound of cure.&amp;#160; Now, instead of spending tax payer dollars on expanded IT security, better firewalls, and improved enterprise management software, the federal government has to waste money on relocating one of President Obama’s safe houses and escalating national security in light of China and Pakistan obtaining military personnel data and the Iranians downloading blueprints for Marine One, the president’s helicopter.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Vivek_Kundra"&gt;Vivek Kundra&lt;/a&gt; really has his work cut out for him….&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/8L8lTK3a9yQ" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/FupiJi3Layo" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-4127009079195565920</guid>
         <pubDate>Fri, 18 Dec 2009 02:50:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/8L8lTK3a9yQ/peer-to-peer-government.html</feedburner:origLink></item>
      <item>
         <title>Cloud Lock-In</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/OoIBHQeP1cY/cloud-lock-in.html</link>
         <description>&lt;p&gt;In &lt;a rel="nofollow" target="_blank" href="http://www.informationweek.com/authors/showAuthor.jhtml?authorID=1099"&gt;John Foley&lt;/a&gt;’s article &lt;a rel="nofollow" target="_blank" href="http://www.informationweek.com/news/showArticle.jhtml?articleID=221901209"&gt;“Cloud Computing’s Portability Gotcha”&lt;/a&gt; in the November 30, 2009, edition of &lt;a rel="nofollow" target="_blank" href="http://www.informationweek.com/"&gt;InformationWeek&lt;/a&gt;, he discusses one very significant shortcoming of cloud-based systems: vendor lock-in.&amp;#160; This is a topic I touched on in my blog post &lt;a rel="nofollow" target="_blank" href="http://www.neverminddreams.com/2009/09/azure-got-it-all-wrong.html"&gt;“Azure – Got It All Wrong?”&lt;/a&gt;, but Foley approaches the issue in a more general sense: the biggest problem with the cloud is getting locked in to a single vendor.&amp;#160; Whether it be because of a proprietary development platform in the case of &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/windowsazure/"&gt;Windows Azure&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://www.salesforce.com/platform"&gt;Force.com&lt;/a&gt; or simply because of the enormous cost of transferring your data somewhere else, hitching your enterprise pony up to the cloud wagon is a risky endeavor.&lt;/p&gt;  &lt;p&gt;Now, that is not to say that cloud-based solutions do not have their place in the current software ecosystem—they certainly do.&amp;#160; They are great for startups or small business that cannot afford their own enterprise-class infrastructure.&amp;#160; They are great for proof-of-concept work.&amp;#160; They are great for cost-cutting.&lt;/p&gt;  &lt;p&gt;Cloud systems, however, are not great for large enterprise applications—unless you are willing to pony up when and if you have to change providers.&amp;#160; And, in the current economic climate, I don’t see a lot of businesses willing to take on that level of risk.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/4Yk11Zqs6Jo" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/OoIBHQeP1cY" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-9198104106587631345</guid>
         <pubDate>Wed, 16 Dec 2009 23:37:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/4Yk11Zqs6Jo/cloud-lock-in.html</feedburner:origLink></item>
      <item>
         <title>C# Field-Like Event Thread Safety</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/kfmPdnlCA9c/c-field-like-event-thread-safety.html</link>
         <description>&lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/cburrows/"&gt;Chris Burrows&lt;/a&gt; is awesome for many reasons.&amp;nbsp; First and foremost, his blog is subtitled “C#, developer tools, monkeys, etc.”&amp;nbsp; As we all know, monkeys are awesome, and, due to the transitive property of monkeys, Chris must also be awesome.&amp;nbsp; Secondly and more importantly, though, Chris has a lot of insight into interesting areas of C# that most of us don’t really think about.&lt;br /&gt;
&lt;br /&gt;
One such insight I discovered the other day in his blog post from last year entitled &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/cburrows/archive/2008/02/18/field-like-events-considered-harmful.aspx"&gt;“Field-like Events Considered Harmful”&lt;/a&gt;.&amp;nbsp; In it, Chris lays out a potentially dangerous default behavior of field-like events in .NET—namely, the compiler translates field-like event declarations into add/remove blocks with mutex locks on the current object.&amp;nbsp; That means code like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e31f1f85-5ad8-4d48-997d-bdd3409f90f5" style="display:inline;float:none;margin:0px;padding:0px;"&gt;&lt;div style="border:1px solid rgb(0, 0, 128);color:black;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt;&lt;div style="background:rgb(0, 0, 128) none repeat scroll 0% 0%;color:white;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;br /&gt;
&lt;/div&gt;&lt;div style="background:rgb(221, 221, 221) none repeat scroll 0% 0%;overflow:auto;"&gt;&lt;ol style="background:rgb(255, 255, 255) none repeat scroll 0% 0%;margin:0pt 0pt 0pt 2em;padding:0pt 0pt 0pt 5px;white-space:nowrap;"&gt;&lt;li&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CalculationEngine&lt;/span&gt;&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;{&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt; CalculationComplete;&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;}&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
Essentially compiles to something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d644a783-7c9f-49dc-8d8c-33d49d014309" style="display:inline;float:none;margin:0px;padding:0px;"&gt;&lt;div style="border:1px solid rgb(0, 0, 128);color:black;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt;&lt;div style="background:rgb(0, 0, 128) none repeat scroll 0% 0%;color:white;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;br /&gt;
&lt;/div&gt;&lt;div style="background:rgb(221, 221, 221) none repeat scroll 0% 0%;overflow:auto;"&gt;&lt;ol style="background:rgb(255, 255, 255) none repeat scroll 0% 0%;margin:0pt 0pt 0pt 2.5em;padding:0pt 0pt 0pt 5px;white-space:nowrap;"&gt;&lt;li&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CalculationEngine&lt;/span&gt;&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;{&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt; calculationComplete;&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt; CalculationComplete&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;add&lt;/span&gt;&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;lock&lt;/span&gt; (&lt;span style="color:blue;"&gt;this&lt;/span&gt;)&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;calculationComplete += &lt;span style="color:blue;"&gt;value&lt;/span&gt;;&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;remove&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;lock&lt;/span&gt; (&lt;span style="color:blue;"&gt;this&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;calculationComplete -= &lt;span style="color:blue;"&gt;value&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;
&lt;li style="background:rgb(243, 243, 243) none repeat scroll 0% 0%;"&gt;}&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
As we all know (or should know), &lt;i&gt;lock(this)&lt;/i&gt; is very, very bad.&amp;nbsp; So why does the compiler even allow you to declare field-like events?&amp;nbsp; Well, most of the time, the threading of event subscriptions is not an issue.&amp;nbsp; Usually, events that you write in your own code are for single-threaded scenarios such as those required by certain UI development patterns like &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Model_View_ViewModel"&gt;Model-View-ViewModel (MVVM)&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/plZyNb0adGc" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/kfmPdnlCA9c" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-899521131669912039</guid>
         <pubDate>Wed, 16 Dec 2009 00:12:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/plZyNb0adGc/c-field-like-event-thread-safety.html</feedburner:origLink></item>
      <item>
         <title>C# Method Signatures and Generic Constraints</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/5RI8LrKLFC8/c-method-signatures-and-generic.html</link>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/ericlippert/default.aspx"&gt;Eric Lippert&lt;/a&gt; had an interest blog post the other day entitled &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx"&gt;“Constraints are not part of the signature”&lt;/a&gt;.&amp;#160; This was a very good read on one aspect of the inner workings of the C# compiler.&amp;#160; In the post, Lippert explains how and why the compiler does not include generic constraints as part of the signature of methods and how that can affect &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/aa691336%28VS.71%29.aspx"&gt;overload resolution&lt;/a&gt;.&amp;#160; More specifically, the lack of constraints in method signatures can can result in the wrong overload method being chosen as the best match under certain conditions and lead to confusing compile errors that are actually correct according to the specification of C#.&lt;/p&gt;  &lt;p&gt;A &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/d5x73970.aspx"&gt;generic constraint&lt;/a&gt; in C# is a useful mechanism by which you can specify the base class or interface from which a generic type must derive.&amp;#160; The following code sample contains a generic method that has such a constraint:     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:256f3c11-9b9b-432b-97c7-3d2f514ab5e7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; SomeMethod&amp;lt;T&amp;gt;(T arg)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color:#2b91af;"&gt;SomeTypeOrInterface&lt;/span&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// do something with arg&lt;/span&gt;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;What this basically says is that I have a method called &lt;i&gt;SomeMethod&lt;/i&gt; that has a generic argument named &lt;i&gt;arg&lt;/i&gt;.&amp;#160; However, you cannot pass whatever you want in for &lt;i&gt;arg&lt;/i&gt;.&amp;#160; The &lt;i&gt;where&lt;/i&gt; statement between the method signature and the body specifies that you must only pass the method an object that derives from type &lt;i&gt;SomeTypeOrInterface&lt;/i&gt;.&amp;#160; This ensures that the value of &lt;i&gt;arg&lt;/i&gt; supports the functionality defined in &lt;i&gt;SomeTypeOrInterface&lt;/i&gt;—which can be useful assumption in implementing the method.&lt;/p&gt;  &lt;p&gt;Lippert explains how this breaks down in a situation such as the following:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:13d471e7-243e-43b3-ac1b-722bd0b47dcc" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; ModuleFactory&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IModule&lt;/span&gt; { }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ImportModule&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IModule&lt;/span&gt; { }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ExportModule&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IModule&lt;/span&gt; { }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ModuleHandler&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ModuleHandler()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// compiles&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; importModule = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ImportModule&lt;/span&gt;();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.InitModule(importModule);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// does *not* compile&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; exportModule = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ExportModule&lt;/span&gt;();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.InitModule(exportModule);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitModule(&lt;span style="color:#2b91af;"&gt;IModule&lt;/span&gt; module)&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// initialize module&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitModule&amp;lt;T&amp;gt;(T module)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color:#2b91af;"&gt;ImportModule&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// initialize module&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The snippet above produces the following compilation error in Visual Studio 2008 (click to enlarge):    &lt;br /&gt;    &lt;br /&gt;&lt;a rel="nofollow" target="_blank" href="http://lh3.ggpht.com/_hKwn7hPEWnA/SyUoudvwRaI/AAAAAAAAACk/ALesSHMeock/s1600-h/image4%5B1%5D.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="The type &amp;#39;ModuleFactory.ExportModule&amp;#39; cannot be used as type parameter &amp;#39;T&amp;#39; in the generic type or method &amp;#39;ModuleFactory.ModuleHandler.InitModule&amp;lt;T&amp;gt;(T)&amp;#39;. There is no implicit reference conversion from &amp;#39;ModuleFactory.ExportModule&amp;#39; to &amp;#39;ModuleFactory.ImportModule&amp;#39;." border="0" alt="The type &amp;#39;ModuleFactory.ExportModule&amp;#39; cannot be used as type parameter &amp;#39;T&amp;#39; in the generic type or method &amp;#39;ModuleFactory.ModuleHandler.InitModule&amp;lt;T&amp;gt;(T)&amp;#39;. There is no implicit reference conversion from &amp;#39;ModuleFactory.ExportModule&amp;#39; to &amp;#39;ModuleFactory.ImportModule&amp;#39;." src="http://lh3.ggpht.com/_hKwn7hPEWnA/SyK5GMsUJhI/AAAAAAAAACo/r8dW-98_KNE/image4_thumb.png?imgmax=800" width="244" height="41"/&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;I always find subjects such as this very interesting because it demonstrates how complex the everyday can be.&amp;#160; To a developer, a compiler just &lt;b&gt;*works*&lt;/b&gt;.&amp;#160; To a compiler writer such as Lippert, the problem area contains many nuances and pitfalls that must either be solved or cleverly paved over—such as the subject of his blog post.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/B0x04hifMHo" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/5RI8LrKLFC8" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-6111429498464370411</guid>
         <pubDate>Tue, 15 Dec 2009 00:12:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://lh3.ggpht.com/_hKwn7hPEWnA/SyK5GMsUJhI/AAAAAAAAACo/r8dW-98_KNE/s72-c/image4_thumb.png?imgmax=800" width="72" />
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/B0x04hifMHo/c-method-signatures-and-generic.html</feedburner:origLink></item>
      <item>
         <title>Code Samples and Untrusted Content</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/nx9QdyZd1HI/code-samples-and-untrusted-content.html</link>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/brada/"&gt;Brad Abrams&lt;/a&gt; had an interesting &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/brada/archive/2009/12/11/visual-studio-project-sample-loading-error-assembly-could-not-be-loaded-and-will-be-ignored-could-not-load-file-or-assembly-or-one-of-its-dependencies-operation-is-not-supported-exception-from-hresult-0x80131515.aspx"&gt;blog post&lt;/a&gt; the other day regarding issues his readers have been having with some of his recent code samples.&amp;#160; More specifically, they receive a very fun and archaic error message that certain assemblies could not be loaded.&amp;#160; Brad determined that the root cause of the problem was that Vista and Windows 7 treat content downloaded from the Internet—like his code samples—as &lt;strong&gt;*untrusted*&lt;/strong&gt; content.&amp;#160; Thus, in order for you to work with them correctly, you must first unblock the content via the file properties (see Brad’s &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/brada/archive/2009/12/11/visual-studio-project-sample-loading-error-assembly-could-not-be-loaded-and-will-be-ignored-could-not-load-file-or-assembly-or-one-of-its-dependencies-operation-is-not-supported-exception-from-hresult-0x80131515.aspx"&gt;post&lt;/a&gt; for details on how to do this).&lt;/p&gt;  &lt;p&gt;This is an important little trick to remember if you frequently download code samples as part of your research.&amp;#160; I know I have run into this a time or two myself—and the archaic error message certainly doesn’t help in tracking down the root cause.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/i4iM4J1MMFE" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/nx9QdyZd1HI" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-5477851117710668898</guid>
         <pubDate>Sun, 13 Dec 2009 23:03:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/i4iM4J1MMFE/code-samples-and-untrusted-content.html</feedburner:origLink></item>
      <item>
         <title>Microsoft Hyper-V 2008 R2 IDE vs. SCSI Performance</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/aJruaX7SAno/Microsoft-Hyper-V-2008-R2-IDE-vs-SCSI-Performance.aspx</link>
         <description>&lt;p&gt;Virtualization has been a hot topic in tech for several years now and shows no signs of going out of style any time soon. I think there are some really great uses for it, such as server and application consolidation, but, I also think there is a lot of hype and glamour surrounding the topic as well. Will virtualizing your servers really save you money and time? That all depends, in my opinion. Only you know what applications you have and how well those currently perform. The only way you'll know how virtual machines will help or hurt you is by &lt;strong&gt;testing&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;The department I work for currently uses Microsoft Virtual Server 2005 R2 on top of Windows Server 2003 for the majority of our virtual machines. When Microsoft introduced Hyper-V with Windows Server 2008, we discussed upgrading, but ultimately held off on the new Microsoft virtualization solution. Hyper-V had many mixed reviews upon its debut, so we wanted to wait to see what later revisions could deliver. Also, at the time, Virtual Server 2005 met our needs just fine. Since VS2005 wasn't broken ... &lt;em&gt;you get the idea&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Time has passed since then and Microsoft has recently released Windows Server 2008 R2 with an updated version of Hyper-V. There have been several &lt;a rel="nofollow" target="_blank" href="http://technet.microsoft.com/en-us/library/dd446676%28WS.10%29.aspx"&gt;improvements to Hyper-V&lt;/a&gt; since its initial release. Virtual Server 2005 has started to show its age, compared to all the other virtualization solutions now available, so now is a great time to do some &lt;strong&gt;testing&lt;/strong&gt; of Hyper-V 2008 R2. [more]&lt;/p&gt;  &lt;p&gt;As users of Virtual Server 2005, my co-workers and I have known using SCSI virtual disks (with Virtual Machine Additions installed) &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/virtual_pc_guy/archive/2006/02/06/525487.aspx"&gt;has advantages&lt;/a&gt; over using IDE disks in VS2005. Switching from the IDE to a SCSI interface made noticeable virtual machine performance improvements. When Hyper-V was originally released, however, booting off SCSI disks wasn't supported. &amp;quot;How version 1.0!&amp;quot; we all thought. &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/w/index.php?title=Special%3ASearch&amp;amp;redirs=0&amp;amp;search=features+removed+in+windows&amp;amp;fulltext=Search&amp;amp;ns0=1"&gt;Removing features from new products&lt;/a&gt; isn't new for Microsoft, after all. Well, it's not supported in Server 2008 R2, either. I was disappointed, but this time the question &amp;quot;Does it really matter?&amp;quot; came to mind.&lt;/p&gt;  &lt;p&gt;I decided to test this using one of our newer servers that has been freshly reloaded with Windows Server 2008 R2 Standard with Hyper-V from scratch. For the test, I'd create a new Windows 7 virtual machine with two extra drives attached. One drive would be connected to the virtual IDE controller. The other would be connected to a new virtual SCSI controller. Both drives would be set to the same physical size (30GB) and both would be created as fixed-size virtual disks.&lt;/p&gt;  &lt;p&gt;The test platform specs are as follows.&lt;/p&gt;  &lt;p&gt;Test Server:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;HP ProLiant DL380 G5 &lt;/li&gt;    &lt;li&gt;Dual Intel Xeon E5450 quad core 3.00GHz CPUs &lt;/li&gt;    &lt;li&gt;14GB ECC memory &lt;/li&gt;    &lt;li&gt;HP NC373i gigabit server adaptor (1x1GBPs connection) &lt;/li&gt;    &lt;li&gt;Drive C is a HP Smart Array P400 controller (512 MB) with 2x HP 68GB 15k RPM SAS drives in RAID-1 (cache enabled) &lt;/li&gt;    &lt;li&gt;Drive E is a HP Smart Array P800 controller (512 MB) connected to an external MSA50 drive array with 10x HP 68GB 15k RPM SAS drives in RAID-10 (cache enabled) &lt;/li&gt;    &lt;li&gt;Windows Server 2008 R2 with Hyper-V installed on drive C &lt;/li&gt;    &lt;li&gt;Virtual machine VHD files on drive E &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Test Virtual Machine:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Windows 7 Enterprise RTM 32-bit &lt;/li&gt;    &lt;li&gt;2GB memory &lt;/li&gt;    &lt;li&gt;Drive C (boot) is a 40GB fixed-size NTFS volume connected to IDE controller 0, port 0 on the virtual machine. &lt;/li&gt;    &lt;li&gt;Drive E (IDETest) is a 30GB fixed-size NTFS volume connected to IDE controller 1, port 0 on the virtual machine. &lt;/li&gt;    &lt;li&gt;Drive F (SCSITest) is a 30GB fixed-size NTFS volume connected to SCSI controller 0, ID 0 on the virtual machine. &lt;/li&gt;    &lt;li&gt;UAC is turned off, no updates applied (fresh installation for testing) &lt;/li&gt;    &lt;li&gt;No antivirus installed &lt;/li&gt;    &lt;li&gt;Logged in as an administrator &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Below are some screenshots of the virtual machine's disk configuration, along with the Hyper-V settings for the virtual machine.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=VMSettings.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Virtual machine settings" border="0" alt="Virtual machine settings" src="http://www.nodnarb.net/image.axd?picture=VMSettings_thumb.png" width="240" height="226"/&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=VPCDiskConfig.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Virtual machine disk configuration" border="0" alt="Virtual machine disk configuration" src="http://www.nodnarb.net/image.axd?picture=VPCDiskConfig_thumb.png" width="244" height="178"/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Disclaimer time. I've worked in the IT field for many years now and am knowledgeable in many areas of IT infrastructure and application development. I am relatively new to Windows Server 2008 R2 with Hyper-V, however. I'm also not a professional reviewer and benchmarker. I do my best to test, record, and interpret the results, but you may come to different conclusions. If you do, let me know (but play nice)! I also encourage you to repeat similar test steps if you have the time and resources. I'm doing this for fun and learning and didn't receive compensation from any product vendors (or their competitors!).&lt;/p&gt;  &lt;h2&gt;First round of tests: ATTO Disk Benchmark&lt;/h2&gt;  &lt;p&gt;To begin, I decided to go with good 'ol fashioned disk benchmarking. I searched for disk benchmarking software on Google and found &lt;a rel="nofollow" target="_blank" href="http://www.attotech.com/products/product.php?scat=20&amp;amp;sku=Disk_Benchmark"&gt;ATTO Disk Benchmark v2.45&lt;/a&gt;. It's available as a free download from &lt;a rel="nofollow" target="_blank" href="http://www.attotech.com"&gt;ATTO Technology, Inc&lt;/a&gt;. I've seen this software used on various hardware review sites, also.&lt;/p&gt;  &lt;p&gt;For each test, I set ATTO to use the following parameters:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Transfer Size: 0.5 to 8192.0 KB &lt;/li&gt;    &lt;li&gt;Total Length: 2GB &lt;/li&gt;    &lt;li&gt;Direct I/O checked &lt;/li&gt;    &lt;li&gt;Overlapped I/O selected &lt;/li&gt;    &lt;li&gt;Queue Depth 4 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The tests were run three times in a row for each virtual drive. The IDE disk was tested first. The virtual machine was then rebooted before the SCSI disk was tested. Below are screenshots of each test. Look in the application title bar for the test iteration.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=ATTOide1.png"&gt;&lt;img style="border-right-width:0px;margin:0px 5px 0px 30px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ATTO IDE test 1" border="0" alt="ATTO IDE test 1" src="http://www.nodnarb.net/image.axd?picture=ATTOide1_thumb.png" width="192" height="244"/&gt;&lt;/a&gt;&amp;#160; &lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=ATTOide2.png"&gt;&lt;img style="border-right-width:0px;margin:0px 5px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ATTO IDE test 2" border="0" alt="ATTO IDE test 2" src="http://www.nodnarb.net/image.axd?picture=ATTOide2_thumb.png" width="192" height="244"/&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=ATTOide3.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ATTO IDE test 3" border="0" alt="ATTO IDE test 3" src="http://www.nodnarb.net/image.axd?picture=ATTOide3_thumb.png" width="192" height="244"/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=ATTOScsi1.png"&gt;&lt;img style="border-right-width:0px;margin:0px 5px 0px 30px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ATTO SCSI test 1" border="0" alt="ATTO SCSI test 1" src="http://www.nodnarb.net/image.axd?picture=ATTOScsi1_thumb.png" width="192" height="244"/&gt;&lt;/a&gt;&amp;#160;&lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=ATTOScsi2.png"&gt;&lt;img style="border-right-width:0px;margin:0px 5px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ATTO SCSI test 2" border="0" alt="ATTO SCSI test 2" src="http://www.nodnarb.net/image.axd?picture=ATTOScsi2_thumb.png" width="192" height="244"/&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=ATTOScsi3.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ATTO SCSI test 3" border="0" alt="ATTO SCSI test 3" src="http://www.nodnarb.net/image.axd?picture=ATTOScsi3_thumb.png" width="192" height="244"/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Do these test results look strikingly similar to you, too? It seems the trend between SCSI and IDE disks are almost identical. To get a better visual representation of this that I could compare, I decided to plot the data in Excel. The graph below compares the average of the IDE read and write runs to the average of the SCSI read and write runs.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=ATTO_IDE_vs_SCSI_graph_1.gif"&gt;&lt;img style="border-right-width:0px;margin:0px auto 10px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="IDE vs SCSI Performance graph" border="0" alt="IDE vs SCSI Performance graph" src="http://www.nodnarb.net/image.axd?picture=ATTO_IDE_vs_SCSI_graph_thumb_1.gif" width="642" height="263"/&gt;&lt;/a&gt; From the graph, it's easy to see how IDE and SCSI reads/writes are right on par with each other. Sure, there are some differences here and there, but I think the margin of error in this testing method makes this too close to call. There were variances in each run of ATTO, so, for now, it's looking like these virtual disks perform virtually &lt;em&gt;(pun intended)&lt;/em&gt; equal.&lt;/p&gt;  &lt;p&gt;One thing I wondered about is the behavior when the tests hit the 512KB mark. Until then, reads/writes scale nicely. For both SCSI and IDE, read and write performance basically &amp;quot;meet&amp;quot; at the 512KB mark and then diverge from there, with priority clearly given to reads for data transfer sizes greater than 512KB. Write performance after that tops out at about 200 MB/sec and holds steady, with read performance topping out at 500 MB/sec. I tried ATTO on the virtual host computer with the same settings and no virtual machines running and experienced similar results. I then ran ATTO on some other computers, such as my laptop and desktop, and did &lt;em&gt;not&lt;/em&gt; experience that behavior. Reads and writes on those machines stayed near equal after a 4KB data set size.&lt;/p&gt;  &lt;p&gt;I believe the cause of the performance differences, in this case, is the HP array controller's cache. Transfer rates in &lt;em&gt;hundreds&lt;/em&gt; of megabytes per second is pretty high, after all. The test is still valid, in my opinion, because you'll want to have your controller's cache enabled when running virtual machines in a production environment. In fact, the only other instance where I was able to replicate this behavior with ATTO Disk Benchmark was on a Lenovo X61 tablet with an Intel 32GB solid-state disk (SSDSA2SH032G1GN). On this drive, there was a similar separation of read and write performance, this time at the 4KB mark.&lt;/p&gt;  &lt;h2&gt;Second round of tests: Microsoft's SQLIO utility&lt;/h2&gt;  &lt;p&gt;I wasn't completely satisfied with the ATTO benchmark after reviewing the results. For one, I wasn't sure if ATTO Disk Benchmark was necessarily the correct tool to test this scenario (SAS drives in RAID10, virtual environment, etcetera). Secondly, I wanted something that could differentiate between random and sequential testing, along with giving the virtual drives a longer workout. The ability to import test results directly into Excel would be a big help, too.&lt;/p&gt;  &lt;p&gt;A co-worker recommended a utility from Microsoft called &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/downloads/details.aspx?familyid=9A8B005B-84E4-4F24-8D65-CB53442D9E19&amp;amp;displaylang=en"&gt;SQLIO&lt;/a&gt;. The name of this utility is deceptive, because it does not depend on Microsoft SQL Server nor does it seem to have anything else to really do with it. It should not be confused with another Microsoft &lt;a rel="nofollow" target="_blank" href="http://support.microsoft.com/kb/231619"&gt;utility with a similar name&lt;/a&gt;. After some Google searches about the app, I came across a &lt;a rel="nofollow" target="_blank" href="http://sqlserverpedia.com/wiki/SAN_Performance_Tuning_with_SQLIO"&gt;really great tutorial&lt;/a&gt; with examples and video by Brent Ozar.&lt;/p&gt;  &lt;p&gt;I used Brent's sample configuration batch file to run my tests. All I changed were the drive letters on the &amp;quot;-d&amp;quot; parameter. I followed the rest of his instructions and let the testing run over the weekend on the IDE and SCSI virtual disks. When I ran the USP_Import_SQLIO_TestPass stored procedure to populate the SQLIO_TestPass table from the imported data, I specified &amp;quot;Hyper-V IDE&amp;quot; or &amp;quot;Hyper-V SCSI&amp;quot; in the sixth parameter. I then imported the data into an Excel pivot table. The entire process was pretty easy to follow. Testing each disk took about six hours.&lt;/p&gt;  &lt;p&gt;Below is a pivot chart of the test results. The &amp;quot;128&amp;quot; values on the horizontal axis represent 128 outstanding requests and the &amp;quot;2, 4, 8, 32, 64&amp;quot; values represent the number of threads. I only included the &amp;quot;128&amp;quot; outstanding requests values because having them all in the graph made it unreadable. The numbers in the graph area are the &amp;quot;Max MB/sec&amp;quot; column.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.nodnarb.net/image.axd?picture=SQLIO_ResultsChart.gif"&gt;&lt;img style="border-right-width:0px;margin:5px auto 10px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="SQLIO Results Chart" border="0" alt="SQLIO Results Chart" src="http://www.nodnarb.net/image.axd?picture=SQLIO_ResultsChart_thumb.gif" width="644" height="292"/&gt;&lt;/a&gt; Overall, again, the performance for Hyper-V virtual SCSI and IDE disks are close to identical. The most important values are the Max MB/s and Max IOs/sec. For the random read and write tests, IOs/sec are nearly matching evenly for both IDE and SCSI across all tests. I would attribute this to the controller's cache. On sequential reads, however, the SCSI virtual disk has a &lt;em&gt;slight&lt;/em&gt; edge over the IDE disk. Also, on sequential reads, the Max MB/sec of the SCSI disk is about 10MB/sec higher than the IDE disk for each run. Another interesting series of data to note is the Max Latency for sequential writes (shorter is better). As the thread counts increase, the IDE disk performed best by eight threads, but then climbed back up by 128 threads. The SCSI disk, however, started low and increased almost linearly.&lt;/p&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;Whew, that was a lot of testing ... at least for someone who doesn't do that type of work all the time. In the end, I don't think you'll see a huge difference between virtual IDE and virtual SCSI disk performance in Hyper-V 2008 R2. It's true that the SQLIO tests revealed some slight advantages to virtual SCSI disks, but I believe you'd only experience this under very controlled situations.&lt;/p&gt;  &lt;p&gt;What other kind of tests could I have done? I'm sure there are plenty out there that I'm not aware of. I felt this was a good start, though, considering I couldn't find much out there regarding IDE vs. SCSI performance in Hyper-V. One additional test I thought of after I finished was placing a constant load on the virtual machine's CPU during the SQLIO tests. I've run out of time with this hardware, though, so maybe I'll get to save that for another day.&lt;/p&gt;  &lt;p&gt;I hope you found this post helpful. If you have any questions, please leave a comment and I will answer as soon as I can. Thanks for reading!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/aJruaX7SAno" height="1" width="1"/&gt;</description>
         <author>brandon</author>
         <guid isPermaLink="false">http://www.nodnarb.net/post.aspx?id=7ee1331a-5042-474d-8aa9-508296b30e27</guid>
         <pubDate>Mon, 30 Nov 2009 19:46:00 +0000</pubDate>
         <category>Computers</category>
      <feedburner:origLink>http://www.nodnarb.net/post/2009/11/30/Microsoft-Hyper-V-2008-R2-IDE-vs-SCSI-Performance.aspx</feedburner:origLink></item>
      <item>
         <title>Backups to the rescue!</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/114B8NguhbM/Backups-to-the-rescue!.aspx</link>
         <description>&lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 10px 10px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="" align="left" src="http://www.nodnarb.net/image.axd?picture=harddrive.jpg" width="179" height="135"/&gt;This post is a friendly reminder regarding the importance of regularly backing up your computer. Data disasters happen. Are you prepared?&lt;/p&gt;  &lt;p&gt;I recently had a chance to put my backups to the test. I have a secondary computer here that I use for games, fun, and general messing around. I use it a few times during the week, but mostly on weekends. This week, I happened to fire it up on Tuesday evening. My attention drew elsewhere after initially pressing the power button. When I returned to find it hung on the disk detection screen, I knew there was a problem.&lt;/p&gt;  &lt;p&gt;On this PC, I used a &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/RAID_0#RAID_0"&gt;RAID 0&lt;/a&gt; array for the C drive. For my non-technical readers, &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/RAID"&gt;RAID&lt;/a&gt; is a technology that lets you combine multiple hard drives for either speed, data redundancy, or a combination of both. In my case, I used RAID 0 to combine two physical drives into one &lt;em&gt;logical&lt;/em&gt; one. Basically, this means the operating system and applications consider the two hard drives to be one. The advantages to RAID 0 are that it lets you combine the capacity of two hard drives and increases disk performance, generally, by a noticeable amount.&lt;/p&gt;  &lt;p&gt;The main disadvantage to RAID 0 is the fact that if one of your hard drives fails, then the data on the remaining drive(s) is useless. This is so because RAID 0 splits the data, like your videos, pictures, songs, and operating system files, between the hard drives (two or more) in the array. If part of the data is gone, like when a hard drive fails, you're toast.&lt;/p&gt;  &lt;p&gt;Aware of the data loss risk, I used RAID 0 on this computer for the disk performance improvement. Having made the decision to go with RAID 0, I knew regularly backing up the C drive would be important. Keep in mind, regular backups are important regardless whether or not you are using RAID. I believe it's especially important when using RAID 0, however, because this level of RAID does not provide any data redundancy. Other levels of RAID do and I'd recommend them for storing important data. I won't go into the differences here, but you can check out the Wikipedia articles above or do some general Internet search to find out the benefits of RAID.&lt;/p&gt;  &lt;p&gt;The drive that failed was a &lt;a rel="nofollow" target="_blank" href="http://www.storagereview.com/WD1500ADFD.sr"&gt;Western Digital Raptor Raptor 150GB&lt;/a&gt;. When a hard drive fails, it can be time consuming to track down exactly which drive is the culprit in multi-drive systems. I had a good idea which one was at fault because the hard drives in this system are in individual trays, each with their own indicator lights. The light on the faulty drive was lit solid when the computer was trying to detect the installed hard drives at startup. To verify this drive was bad, I removed all other hard drives from the system and downloaded the Western Digital diagnostic tools from &lt;a rel="nofollow" target="_blank" href="http://support.wdc.com/product/download.asp?wdc_lang=en"&gt;their site&lt;/a&gt;. Each hard drive manufacturer generally has a similar tool they offer for helping your identify hard drive problems. I ran the tool and it verified the drive was bad. Check out the screen shot below. I ran the full scan, like the software suggested, and eventually received another status code (&lt;a rel="nofollow" target="_blank" href="http://support.wdc.com/techinfo/general/errorcodes.asp"&gt;0222 &amp;amp; 0225&lt;/a&gt;) indicating the drive failed.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px auto 10px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="" src="http://www.nodnarb.net/image.axd?picture=DSC03248.jpg" width="642" height="417"/&gt;I replaced the drive a few days later with an updated Western Digital model. I've had good luck with Western Digital in the past. One &lt;a rel="nofollow" target="_blank" href="http://www.nicholasoverstreet.com"&gt;friend of mine&lt;/a&gt; has sworn them off completely. Why go back to a manufacturer that failed on me? The simple fact is standard hard drives are mechanical, and thus will eventually wear out and fail, no matter who made them. I, for instance, tended to avoid Maxtor drives before the company was bought by Seagate. Ask ten tech guys what their favorite brand of hard drive is and why and you'll get ten different answers. It's a lot like asking someone about their favorite kind of car.&lt;/p&gt;  &lt;p&gt;For my backup solution, I chose to use &lt;a rel="nofollow" target="_blank" href="http://www.acronis.com/homecomputing/products/trueimage/"&gt;Acronis True Image Home&lt;/a&gt; to back up to an external hard drive. I started using Acronis True Image a few years ago when it was at version 11. They recently released version 2010, which is what my latest backup was created with. I've used Acronis software many times at work to backup and restore data to various machines, but this was the first time I had to use it to recover personal data that would otherwise be gone for good without a reliable backup. After booting the PC from the Acronis recovery CD, I selected the backup archive on my external hard drive and chose to restore it to the new internal hard drive. About an hour and a half later, I saw the message below.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:5px auto 10px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="" src="http://www.nodnarb.net/image.axd?picture=DSC03249.jpg" width="602" height="378"/&gt;&lt;/p&gt;  &lt;p&gt;Even before I started the restore, I was confident I'd get my data back. It's always a relief to see this screen, though! After this, all it took to getting back to normal was removing the Acronis CD and restarting the computer. Everything was back to normal.&lt;/p&gt;  &lt;h2&gt;Lessons learned:&lt;/h2&gt;  &lt;p&gt;I got lucky because I took the time to set up a backup schedule and made the necessary adjustments to it throughout the years to make sure backups were getting created successfully. My backup solution, which was a USB external hard drive plugged into the computer I was backing up, worked out fine in this case. When creating backups, however, you need to consider all possibilities. Instead of an internal hard drive failure, where would I be now if the house caught on fire or if someone stole all my computer equipment?&lt;/p&gt;  &lt;p&gt;With the wide availability of high-speed Internet service, many online backup service providers have emerged. Their goal is to back up your data, encrypted over the Internet, to a secured data center that's protected against fire/flood/theft (hopefully!), rather than an external hard drive sitting no more than 6 feet away from your PC.&lt;/p&gt;  &lt;p&gt;Advantages to a service such as this include:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Safe, offsite storage of your data. &lt;/li&gt;    &lt;li&gt;Having your data available on any Internet connected PC, secured by your account credentials. &lt;/li&gt;    &lt;li&gt;The ability to retrieve older versions of your files (&lt;em&gt;this varies by service provider&lt;/em&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are some disadvantages, too:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It can take a long time to back up all your data over the Internet. &lt;/li&gt;    &lt;li&gt;Limitations of the service provider, such as storage limits or platforms supported (Mac and Linux not supported by all). &lt;/li&gt;    &lt;li&gt;Cost, which is usually a monthly or yearly fee. &lt;/li&gt;    &lt;li&gt;Doesn't back up your entire computer (just photos, documents, etc.) &lt;/li&gt;    &lt;li&gt;Generally limited to one computer backed up per account. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Despite the drawbacks, I think I'm going to look into a service like this. It's one thing to lose the hard drive of my secondary PC. I'd be pretty unhappy, though, if I lost all the digital photos I have from the last ten years or so. If I subscribe to one of these services I'll post a follow-up.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;I kept the geek level to a minimum in this post so all readers, regardless of computer skills, can understand the importance of backups. If you have a technical question, feel free to ask it in the comments.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/114B8NguhbM" height="1" width="1"/&gt;</description>
         <author>brandon</author>
         <guid isPermaLink="false">http://www.nodnarb.net/post.aspx?id=4de187be-5696-42f8-81a2-7a35bf53182d</guid>
         <pubDate>Sun, 22 Nov 2009 00:30:00 +0000</pubDate>
         <category>Computers</category>
      <feedburner:origLink>http://www.nodnarb.net/post/2009/11/21/Backups-to-the-rescue!.aspx</feedburner:origLink></item>
      <item>
         <title>Azure – Got It All Wrong?</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/XHaWVAJ4ttM/azure-got-it-all-wrong.html</link>
         <description>&lt;p&gt;The more I read about public clouds the more I think &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt; has it all wrong with &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/azure/"&gt;Azure&lt;/a&gt;.&amp;#160; Competitors such as &lt;a rel="nofollow" target="_blank" href="http://www.rackspace.com/"&gt;Rackspace&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://www.amazon.com"&gt;Amazon&lt;/a&gt;, and &lt;a rel="nofollow" target="_blank" href="http://www.google.com/"&gt;Google&lt;/a&gt; are rolling out solutions that support one or more hypervisors and that offer a plethora of pricing, architecture, and other operating environment options—unlike Azure.&amp;#160; And they don’t require a proprietary development environment to boot.&lt;/p&gt;  &lt;p&gt;Sure, forcing people into using Microsoft’s development framework in order to host under Azure is good for their complimentary offerings such as Visual Studio, Team Foundation, and such, but, especially in the world of application hosting, nobody likes to be locked in to a particular vendor.&amp;#160; An application coded in C# for &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/windowsserver2008/"&gt;Windows Server 2008&lt;/a&gt; can be ported easily between competitors’ clouds, but the minute you write that first line of code that taps into &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/azure/data.mspx"&gt;SQL Data Services&lt;/a&gt; in Azure you are in for a lot of problems if you ever decide that Microsoft’s hosting is not for you.&lt;/p&gt;  &lt;p&gt;Sure, you will be able to host an application written for Azure in your own datacenter if you decide you do not care for Microsoft’s hosting, but that just defeats the whole purpose of cloud computing.&amp;#160; Why would you spend all the time and money to train your staff to code to Azure and then host the application in your own datacenter?&amp;#160; You might as well just code it in &lt;a rel="nofollow" target="_blank" href="http://www.asp.net/"&gt;ASP .NET&lt;/a&gt; or &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation"&gt;WPF&lt;/a&gt; or &lt;a rel="nofollow" target="_blank" href="http://silverlight.net/"&gt;Silverlight&lt;/a&gt; or whatever your staff is already familiar with and be done with it that much quicker.&lt;/p&gt;  &lt;p&gt;I just don’t see how Microsoft thinks that the pro of increased use of their development tools will come even close to offsetting the inherent con of vendor lock-in that hosting with Azure will entail.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/EDRRNMy5vnI" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/XHaWVAJ4ttM" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-9160943349990320926</guid>
         <pubDate>Fri, 25 Sep 2009 03:29:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/EDRRNMy5vnI/azure-got-it-all-wrong.html</feedburner:origLink></item>
      <item>
         <title>Programming Sucks</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/go8xV7qDpNw/programming-sucks.html</link>
         <description>&lt;p&gt;I stumbled across an interesting post on &lt;a rel="nofollow" target="_blank" href="http://thedailywtf.com/"&gt;The Daily WTF&lt;/a&gt; yesterday entitled &lt;a rel="nofollow" target="_blank" href="http://thedailywtf.com/articles/programming-sucks!-or-at-least,-it-ought-to-.aspx"&gt;Programming Sucks! Or At Least, It Ought To&lt;/a&gt; that rings true in the industry: most programmers are not rock stars.&amp;#160; That is not to say that most programmers do not have rock star skills—although, in my experience, many do not even have kazoo-level skills, but that is a separate issue.&amp;#160; It is to say, though, that most programming &lt;strong&gt;*jobs*&lt;/strong&gt; are not rock star jobs.&amp;#160; Very few of us will ever have the opportunity to start the next &lt;a rel="nofollow" target="_blank" href="http://www.google.com/"&gt;Google&lt;/a&gt;, write the next &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/windows/"&gt;Windows&lt;/a&gt;, or develop the next &lt;a rel="nofollow" target="_blank" href="http://www.worldofwarcraft.com/"&gt;World of Warcraft&lt;/a&gt;.&amp;#160; Again, not because of talent but because of the statistical rarity of such opportunities.&lt;/p&gt;  &lt;p&gt;Instead, most computer science graduates are destined to be &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Information_systems"&gt;information systems&lt;/a&gt; developers.&amp;#160; It’s not a glamorous job.&amp;#160; It’s not a glorious job.&amp;#160; Most of the time, it’s not even an interesting job.&amp;#160; It is a job, though, and it is a job that &lt;strong&gt;*can*&lt;/strong&gt; be challenging and rewarding at times, even if the end result isn’t co-credit for the next &lt;a rel="nofollow" target="_blank" href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;It’s hard work.&amp;#160; It’s tedious.&amp;#160; And sometimes it even sucks.&amp;#160; But those of us that do it and continue to do it do so because we love it.&amp;#160; We love code.&amp;#160; We love logic.&amp;#160; And most of all we love solving hard technical problems—even if the end result is simply an account balance routine that performs &lt;a rel="nofollow" target="_blank" href="http://www.xbeat.net/vbspeed/i_BankersRounding.htm"&gt;bankers rounding&lt;/a&gt; correctly.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/6T7VVdImfjA" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/go8xV7qDpNw" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-4711041805740296438</guid>
         <pubDate>Wed, 16 Sep 2009 23:05:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/6T7VVdImfjA/programming-sucks.html</feedburner:origLink></item>
      <item>
         <title>Oracle’s Growing Pains</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/TwqNeG14cTY/oracles-growing-pains.html</link>
         <description>&lt;p&gt;According to Bob Evan’s article “As Regulators Jam Oracle, Rivals Snatch Sun Users” in the August 17, 2009, edition of &lt;a rel="nofollow" target="_blank" href="http://www.informationweek.com/"&gt;InformationWeek&lt;/a&gt;, Oracle is losing a great deal of share in the integrated systems and software market to rivals like &lt;a rel="nofollow" target="_blank" href="http://www.ibm.com"&gt;IBM&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://www.hp.com"&gt;HP&lt;/a&gt;, and &lt;a rel="nofollow" target="_blank" href="http://www.dell.com"&gt;Dell&lt;/a&gt; since its merger with &lt;a rel="nofollow" target="_blank" href="http://www.sun.com/"&gt;Sun Microsystems&lt;/a&gt;.&amp;#160; The European Union’s threat to roadblock the merger for up to four months for “review” further clouds the future for the industry giant in the data center.&lt;/p&gt;  &lt;p&gt;Since I was a little put off by Oracle’s acquisition of Sun and the rights to the &lt;a rel="nofollow" target="_blank" href="http://www.java.com"&gt;Java&lt;/a&gt; programming language, part of me is relishing in Oracle’s recent troubles—even more so when you consider that I am a .NET developer.&amp;#160; That being said, no company is perfect, and I appreciate the competition that Oracle presents to the rest of the software industry, so I do hope that they pull through okay.&amp;#160; (I’m sure they will—deep pockets.)&lt;/p&gt;  &lt;p&gt;Still, I can’t help but see Oracle’s current situation as a deserved drink in the face for making a power play for Java.&amp;#160; I maintain that Java, like C and C++ before it, should remain a language controlled by a community, not by a corporation.&amp;#160; We have enough proprietary languages—C# included—and what alternative does the development community have other than Java for open-source enterprise development?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/Gm8cK-0IcKo" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/TwqNeG14cTY" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-2252528665484735769</guid>
         <pubDate>Thu, 27 Aug 2009 21:55:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/Gm8cK-0IcKo/oracles-growing-pains.html</feedburner:origLink></item>
      <item>
         <title>Cisco UCS – I’m Not the Only One That Doesn’t Get It</title>
         <link>http://feedproxy.google.com/~r/SVNUGBlogAggregator/~3/ECgmolRO1uI/cisco-ucs-im-not-only-one-that-doesnt.html</link>
         <description>&lt;p&gt;It was good to read Mark Ferelli’s article &lt;a rel="nofollow" target="_blank" href="http://redmondmag.com/articles/2009/08/01/cisco-plays-both-sides-of-the-virtual-coin.aspx"&gt;“Cisco Plays Both Sides of the Virtual Coin”&lt;/a&gt; in the August 2009 edition of &lt;a rel="nofollow" target="_blank" href="http://redmondmag.com"&gt;&lt;em&gt;Redmond&lt;/em&gt; magazine&lt;/a&gt;.&amp;#160; In it, Ferelli discusses the advantages of going single vendor throughout the data center using Cisco UCS—primarily the streamlined virtualization that &lt;a rel="nofollow" target="_blank" href="http://www.cisco.com/"&gt;Cisco&lt;/a&gt; UCS offers.&amp;#160; Ferelli also discusses the difficulties that Cisco is going to have trying to muscle its way into the already tight server hardware market during a down economy with an unproven platform.&lt;/p&gt;  &lt;p&gt;Needless to say, that was refreshing for me to read after my post “&lt;a rel="nofollow" target="_blank" href="http://ascharfenberg.spaces.live.com/Blog/cns!31815CABC0FC530!387.entry"&gt;Cisco UCS Server – Missed the Memo?&lt;/a&gt;” regarding the same subject since I was afraid I had missed something in my analysis.&amp;#160; Ferelli’s article got me to thinking about UCS a bit more, and I must say that streamlined virtualization is a great feature, so that is definitely a big selling point.&amp;#160; In addition, a lot of industries are wary of making the leap from the data center to the cloud—even with the cost savings of doing so—and Cisco UCS’ “cloud in a box” may end up being the right solution to bridge that gap.&amp;#160; And, since UCS supports both the &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/windowsserver2008/en/us/hyperv.aspx"&gt;Hyper-V&lt;/a&gt; and the &lt;a rel="nofollow" target="_blank" href="http://www.vmware.com/"&gt;VMWare&lt;/a&gt;, Cisco’s approach avoids vendor lock-in at the sensitive hypervisor level.&lt;/p&gt;  &lt;p&gt;We shall see, though, if Cisco has the technology, the tools, and the people to make their server hardware vision a reality.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NevermindDreams/~4/XXqiYbaQP8o" height="1" width="1"/&gt;&lt;img src="http://feeds.feedburner.com/~r/SVNUGBlogAggregator/~4/ECgmolRO1uI" height="1" width="1"/&gt;</description>
         <author>noreply@blogger.com (Allen Scharfenberg)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6770624687299234266.post-229951009932285170</guid>
         <pubDate>Mon, 17 Aug 2009 03:29:00 +0000</pubDate>
      <feedburner:origLink>http://feedproxy.google.com/~r/NevermindDreams/~3/XXqiYbaQP8o/cisco-ucs-im-not-only-one-that-doesnt.html</feedburner:origLink></item>
   </channel>
</rss><!-- fe2.yql.bf1.yahoo.com compressed/chunked Sat May 25 17:40:01 UTC 2013 -->
