<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7949267671212594224</id><updated>2012-01-16T13:39:13.564-08:00</updated><category term='Book Reviews'/><category term='General Tips and Tricks'/><category term='Printing VS2008'/><category term='HTM5'/><category term='Welcome'/><title type='text'>DevScape</title><subtitle type='html'>Tips, Tricks, and Lessons Learned from the world of Application Development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>91</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5192200581221977293</id><published>2011-08-24T20:40:00.001-07:00</published><updated>2011-08-24T20:40:50.670-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTM5'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Book Review: Introducing HTML5 by Bruce Lawson and Remy Sharp</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-8e10Mpw-Hqg/TlXEP8lUhTI/AAAAAAAAAko/fI7CM63GTPo/s1600-h/IntroducingHtml5%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 5px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="IntroducingHtml5" border="0" alt="IntroducingHtml5" align="left" src="http://lh4.ggpht.com/-ZzpluDIlLsI/TlXEQfnJy6I/AAAAAAAAAks/9dCrXO_U4oA/IntroducingHtml5_thumb.png?imgmax=800" width="244" height="164" /&gt;&lt;/a&gt;The buzz in the development world these days has changed. Cloud Computing?&lt;em&gt; That’s so 2010&lt;/em&gt;. Multi-core CPU’s? &lt;em&gt;Ho-hum&lt;/em&gt;. Tablet computing? &lt;em&gt;Whatever&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;But when Microsoft announced that the next version of Windows would allow for development in HTML5 and JavaScript, the world took notice, and a lot of us are scrambling to get up to speed. Okay, so some developers have been playing with HTML5 for a while now, and JavaScript has been around for years. I’ve worked in HTML4 for quite a while, and JavaScript has never really floated my boat. I’m a traditionalist. Code compiles. Scripts are what I use to run back in college before I had a real IDE. &lt;/p&gt;  &lt;p&gt;I say that with only a little bit of sarcasm. I’ve never liked Web UI coding. Working with the infinite number of browsers and their individual peculiarities frustrated the crap out of me. The web was for signing people up for things, watching videos and browsing news and sports. You would never write a real application in this environment. Would you? What masochistic developer would want to build a core business system in something you could never truly test, and would behave differently on every computer? What sadistic system designer would expect users who have jobs to do to wait for a page to refresh every time they wanted to know if their data was valid?&lt;/p&gt;  &lt;p&gt;When I heard about Microsoft’s intentions, my initial reaction was to think it was a joke. After hearing it a few times, and learning it really was true, my heart skipped a beat. I was worried that I was about to be left behind again technically, and in a few years, I’d be one of those back-end developers that couldn’t change with the time. I’d be branded as a ‘.NET Developer’, something akin to the 2011 version of a COBOL programmer. It didn’t take long for that fear to turn to anger. I’d just invested the last five years working my way deep into the Microsoft .NET Stack, building my skills and my reputation, and… and it just wasn’t fair! This whole process was very similar to the seven stages of grief. I went through the depression of realizing that I was again going to have to rebrand myself and rebuild my skills, and then the realization that doing it the last time really hadn’t been that bad. I started to look at the opportunities this would present – things that I had never before been able to do, that I could now do. I started to research what HTML5 really was, and what it was that made the world so sure this was the way to go.&lt;/p&gt;  &lt;p&gt;After doing some piecemeal research on the web, I realized I needed a book. I’m a book learning. Reading a book primes my brain. Books are generally better organized than the snippets you might find on line. I wanted to start with the basics, and form a solid base with which I could talk intelligently with my coworkers and my bosses. I wanted a book that would explain it from the beginning.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Introducing HTML5 (First Edition)&lt;/em&gt; by Bruce Lawson and Remy Sharp was the book I chose to get me there, and I highly recommend it. It starts by covering the Structural Elements of HTML5, how pages are organized, the new elements and the expanded role of JavaScript in HTML5 applications. It then dives into some of the more advanced features of HTML, including Audio and Video, Canvas, Data Storage, Offline mode, Drag and Drop, Geo-Location and Messaging. I skimmed the Audio and Video and the Canvas sections since I am usually designing business apps, and haven’t had the need to build an app that draws lines since I was in college. I did, however, build a Silverlight Video player on Windows Azure for &lt;a href="www.demoshowcasesuite.com" target="_blank"&gt;Microsoft Demo Showcase&lt;/a&gt; back in 2009/2010, so I expect that sooner or later, I’ll be doing something similar to that in HTML5. It’s good to know it’s there.&lt;/p&gt;  &lt;p&gt;I was fascinated by the offline storage possibilities and the future of messaging and sockets. I can see a day coming very soon where I build an HTML5 app with messaging tied to the service bus on Windows Azure that handles Windows Workflow Processes and notifies users that some long running, multiple streamed process has completed. There’s power there. A lot of it. &lt;/p&gt;  &lt;p&gt;I do find it a little bit funny that this is the second technical book in a row I’ve read where the authors are constantly taking shots at Microsoft and Internet Explorer. I guess I’ve been buried so deep in the mother-ship for so long, that I don’t have the same level of animosity. Of course, I have worked my career around not having to do a lot of browser work. Perhaps that has insulated me far more than I thought.&lt;/p&gt;  &lt;p&gt;This book is short and to the point, and a great introduction to HTML5. You won’t come out a world class expert on HTML5, but you will understand the basic concepts, enough to be able to talk about it, and to begin the honest discussion of whether or not that next project you are starting should target HTML5. I’m at least willing to consider it at this point, as long as we don’t implement any features that can’t be made backwards compatible by implementing modernizr.js which is covered by Scott Guthrie &lt;a href="http://weblogs.asp.net/scottgu/archive/2011/05/09/html5-improvements-with-the-asp-net-mvc-3-tools-update.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The biggest advantage I see to HTML5 is that in the ideal world going forward, we can build an app once, and as long as it is HTML5 compliant, it should just work on all browsers. I really like that. I want to do the work once, and move on the next project. HTML5 brings the Web UI development out of the dark ages, and makes it a real possibility for someone like me. This is a good book to get up and running inside of a week, and I’ve already recommended it to my team.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5192200581221977293?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5192200581221977293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5192200581221977293&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5192200581221977293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5192200581221977293'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2011/08/book-review-introducing-html5-by-bruce.html' title='Book Review: Introducing HTML5 by Bruce Lawson and Remy Sharp'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-ZzpluDIlLsI/TlXEQfnJy6I/AAAAAAAAAks/9dCrXO_U4oA/s72-c/IntroducingHtml5_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-3954099806321920654</id><published>2011-07-30T09:05:00.001-07:00</published><updated>2011-07-30T09:05:08.761-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Book Review: jQuery in Action</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-DcLeKwAidAY/TjQrstdyKKI/AAAAAAAAAkg/sDPIuuEgVjo/s1600-h/JQueryInAction%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 5px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="JQueryInAction" border="0" alt="JQueryInAction" align="left" src="http://lh4.ggpht.com/-ZaMNtiJeCio/TjQrs9w8IQI/AAAAAAAAAkk/Di0H0nBbV2A/JQueryInAction_thumb%25255B2%25255D.jpg?imgmax=800" width="150" height="195" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A few years ago, when I first got into ASP.NET development, I worked on a project that used the Ajax Controls Toolkit. I was not a JavaScript person, and my experience with the Toolkit and all its idiosyncrasies left a very bitter taste in my mouth for ‘client-side’ web development. For many of the projects after that, I worked on the back end of the system – the database, data model and business logic, and eventually the controllers and web services. We had a UI guy who tackled the JavaScript stuff and worked ‘magic’ there.&lt;/p&gt;  &lt;p&gt;A couple of months ago, I got involved in a project which had a very large existing code base, with a lot of jQuery and my UI guy was nowhere to be found. Before I knew it, I was neck deep in it, and drowning fast. I muddled through the project and got it out the door, but I realized that I could no longer have this gap in my education. I also realized, by working on that existing code base, that jQuery was nothing like the JavaScript and Toolkit I once struggled with, and it was really freaking powerful.&lt;/p&gt;  &lt;p&gt;It turns out that back in early 2010, I had ordered &lt;em&gt;jQuery In Action&lt;/em&gt; by Bear Bibeault and Yehuda Katz during some book buying binge, but never read it. It got loaned out to a couple of people at work, and I didn’t see it for the longest time. It wasn’t until I finished working on that big jQuery project that I even remembered that I still had it. I tracked it down, and it flew to the top of my reading list.&lt;/p&gt;  &lt;p&gt;I wish I had read this book a three years ago. jQuery is really powerful. And it’s really big.&amp;#160; &lt;em&gt;jQuery in Action&lt;/em&gt; did a great job of introducing me to the core concepts, and giving me a refresher on basic JavaScript. Ok, not a refresher – an introduction. The unfortunate part is that I ordered this book in early 2010, which meant the version I have is the first edition published in 2008. The second edition came out in May 2010. The first edition covered up to jQuery 1.2. The second edition covers jQuery 1.4.&amp;#160; As I recall, there are some fairly major differences in jQuery between 1.2 and 1.4, but more importantly, there have been major changes in browsers. Internet Explorer was just on Version 7 when the book was written, and a lot of time had to be spent by developers to account for the way IE6 worked, and to a slightly lesser extent, IE7. With IE9 now out and promising “It just works”, I would like to think that jQuery will have gotten even easier in the last few years. The first edition of jQuery in Action has quite a few asides that detail the frustrations developers had with IE6 &amp;amp; 7, and I get the impression that the authors would have little good to say about Internet Explorer in conversation.&lt;/p&gt;  &lt;p&gt;The book is well organized and the coverage of the core concepts appropriate for a beginning jQuery developer as long as you have a solid background in web development. It even has a very good appendix on JavaScript, which was invaluable to someone like me with a large gap in their knowledge of the subject. They build a large number of exercises into the book as well. Since I was reading the book whilst commuting, I didn’t get a chance to try them, but I think I understood them well enough from the written copy. At the very least, I know they are out there and I can download them when I get a chance to give them a try.&lt;/p&gt;  &lt;p&gt;What I find amazing about this book (and jQuery), is how many times I thought back to projects I already have in production, and said “Wow, the UI could be so much better”, or “If I had only known about jQuery, the whole architecture would have changed.” The former makes me happy that I can now say “Yes, we can do that.” more often to clients. The latter makes me question my skills as a software architect. I had never even considered some of the approaches presented in the book, and not only would the UI have been more user friendly, it would have been faster and more reliable. I’m disappointed in myself for not taking the time to learn about jQuery before now. I can rationalize all I want about being busy with other things (like learning Windows Azure, MVC, WPF, writing 4 books, etc.) but the truth is that I considered the UI side to be the ‘poofy’ stuff and let other people handle it. The UI, I thought, was just for displaying the results of all the ‘hard work’ done on the back end.&lt;/p&gt;  &lt;p&gt;No longer. Reading &lt;em&gt;jQuery in Action&lt;/em&gt; has opened my eyes to the fact that I have to know all the layers, at least well enough to know what is possible. I have no doubt that there will be aspects (especially in CSS) that require an artist’s touch (which no amount of reading is going to give me), but I will now treat jQuery as a first class language in solving client problems. I still have qualms about jQuery, mainly from the testability standpoint, but I do like the idea of unobtrusive JavaScript which will allow me to keep a separation of concerns and allow me to build up a personal collection of functions that I trust just work.&lt;/p&gt;  &lt;p&gt;I will, at some point, go out and get the second edition of this book to see what has changed in the last few years, and to reinforce my basic knowledge of JavaScript and jQuery. With HTML 5 and JavaScript coming at developers like an out of control freight train, jQuery in Action is a great way to get started and to get up to speed. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-3954099806321920654?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/3954099806321920654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=3954099806321920654&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3954099806321920654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3954099806321920654'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2011/07/book-review-jquery-in-action.html' title='Book Review: jQuery in Action'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-ZaMNtiJeCio/TjQrs9w8IQI/AAAAAAAAAkk/Di0H0nBbV2A/s72-c/JQueryInAction_thumb%25255B2%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5490346172342995748</id><published>2011-07-19T11:20:00.001-07:00</published><updated>2011-07-19T11:20:34.032-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General Tips and Tricks'/><title type='text'>Using etc/Hosts to Assist in Testing</title><content type='html'>&lt;p&gt;A coworker and I were in the process of migrating a client’s web server from old hardware to new hardware last week, and we needed to be able to test the system before turning it on to live traffic. The web applications called web services, and the configuration of the web app included the URL for the web services.&lt;/p&gt;  &lt;p&gt;We needed to be careful what we were doing here, because the web services were also migrating to a new server, and on this new server, were pointing to a new database server as well. We didn’t want to change all the configuration settings on the new servers, and we couldn’t change the public DNS entry.&lt;/p&gt;  &lt;p&gt;I’ve done this before, but not everyone knows about the following trick, so here it is:&lt;/p&gt;  &lt;p&gt;On Windows, if you go into your &lt;a&gt;%WinDir%\System32\drivers\etc&lt;/a&gt; directory, you’ll find a file called &lt;strong&gt;hosts, &lt;/strong&gt;often referred to as “etc\hosts” or “Etsy Hosts”. Open this file with notepad running as administrator on your machine. The instructions for changing this file are right in there, and it’s pretty easy. We added a new line to file on the new server, (and on the test client) like:&lt;/p&gt;  &lt;p&gt;127.0.0.1&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://www.palador.com"&gt;www.palador.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We saved our changes, and then restarted IIS on the box. And presto…&lt;/p&gt;  &lt;p&gt;But it didn’t work.&lt;/p&gt;  &lt;p&gt;We reset IIS again, and did an ipconfig /flushdns from the command prompt.&lt;/p&gt;  &lt;p&gt;And it still pointed to the old domain.&lt;/p&gt;  &lt;p&gt;We went back to the Hosts file and everything looked fine. I scratched my head. &lt;strong&gt;Then I realized that we had forgotten to put a carriage return after the new line&lt;/strong&gt;. We added the hard-return, restarted IIS and flushed DNS, and now everything worked.&lt;/p&gt;  &lt;p&gt;I’m pretty sure I had run into this exact same issue a few years ago, and that’s why I knew to look for it. Hopefully this will help someone else avoid this issue.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5490346172342995748?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5490346172342995748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5490346172342995748&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5490346172342995748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5490346172342995748'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2011/07/using-etchosts-to-assist-in-testing.html' title='Using etc/Hosts to Assist in Testing'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-7248038132266391878</id><published>2011-07-17T20:46:00.001-07:00</published><updated>2011-07-17T20:46:09.570-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Book Review: The Nomadic Developer by Aaron Erickson</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-s3AT-5hq3ac/TiOsf-jOZvI/AAAAAAAAAkY/vhKWS1ve8rA/s1600-h/NomadicDeveloper%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 5px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="NomadicDeveloper" border="0" alt="NomadicDeveloper" align="left" src="http://lh3.ggpht.com/-sCWdE22RS9I/TiOsgMmLJhI/AAAAAAAAAkc/fR43ukphSNw/NomadicDeveloper_thumb%25255B2%25255D.jpg?imgmax=800" width="198" height="272" /&gt;&lt;/a&gt;I don’t actually remember how I found this book. It somehow got onto my Amazon wish list one day, and it was one of those things I bought because I needed to top up an order above $25 to qualify for free shipping. I don’t remember what it was that I bought with this book, but I doubt it was as impressive as &lt;em&gt;The Nomadic Developer&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;It’s funny, because I tell people that I got into the consulting world back in 2008. After reading this book, I realized that I actually started in consulting back in 1994. My very first job in IT was technically at a consulting firm, albeit a very large one, (the one started by Ross Perot back in the sixties and famous for making everyone wear blue suits everywhere they went). I worked on a couple of very large accounts, so it seemed like I was just a developer in Corporate IT, but in reality, I was a consultant. I left that company in 1999, and moved on to real Corporate IT, working for an airline maintaining their revenue management systems, and later on to building and maintaining the fight operations systems. We owned those systems from cradle to grave, twenty four hours a day, seven days a week. They were horribly difficult to change. There was a tremendous amount of tribal knowledge in every subsystem, and many were already five or six years old when I started, and rewrites were impossible. By the end of my 8.5 years there, my technological skills were atrophied to the point where another year or two, and I would have been completely unmarketable outside of that industry vertical.&lt;/p&gt;  &lt;p&gt;I jumped (back) into consulting in 2008 with little idea of what true consulting was. I wish I had had this book at my disposal back then. Not that I would change my decision – the leap into consulting has done wonders for my skills and my career. I have no doubt that making the move, when I did, was absolutely the right decision for both me and my family, and I’d like to think it was the right decision for the company I work for as well.&lt;/p&gt;  &lt;p&gt;But in &lt;em&gt;The Nomadic Developer&lt;/em&gt;, Aaron Erickson goes into wonderful detail of what to really expect from technology consulting, how to identify good (and bad) companies, how to survive, and how to thrive in the consulting world. He talks about how to maintain both your position and your passion during both good and bad times in the economy, and how to avoid career limiting moves. At the very least, had I read this book while still working for the airline, I could have avoided a couple of interviews that would have led to positions that I was not right for. My trouble-radar kicked in on those before I accepted, and I count myself lucky. By the time I had finished chapter two of The Nomadic Developer, I had already identified those firms as being one of the ‘Seven Deadly Firms’, and hiring on there likely would have tainted my consulting experience for the rest of my career.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;The Nomadic Developer&lt;/em&gt; is not only for people who are thinking of becoming consultants. It’s also for consultants who are fairly new to the game, and will help you to stay out of trouble as the economy changes. I think it should also be read by owners/senior management of consulting firms, if only to avoid uncomfortable moments brought on during interviews by people who have read the book and are asking some of the hard questions Erickson suggests. Most of those questions I would be a little uncomfortable asking during a interview, but I see the value in at least trying to ask them. It’s not always the response that is important, it’s the way the response is said that will tell you if the employer is going to treat you as a partner / investment or a warm body / cost.&lt;/p&gt;  &lt;p&gt;Here are some of the questions he suggests:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;What is your annual revenue?&lt;/li&gt;    &lt;li&gt;What is your (target) profit margin?&lt;/li&gt;    &lt;li&gt;What is your exit strategy?&lt;/li&gt;    &lt;li&gt;What’s the value of the sales pipeline?&lt;/li&gt;    &lt;li&gt;What is the sales process?&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I’ve done a lot of interviews of candidates in the last few years, and even though I have been on the technical side, I’ve never been asked questions like that. I’m actually pretty horrible at technical interviews because I hate trivia questions. I prefer to ask about experiences and expectations and to evaluate the personality of the interviewee. If someone was to ask questions like that, and I hadn’t read Erickson’s book, I would perceive them as intelligent but aggressive. But after reading his book, I would think that the candidate truly is trying to find the right fit. If I’m a consulting company senior management, I’m reading this book to make sure I’ve got my crap together so I don’t lose out on good consultants because I look like an amateur. I’m also doing an honest assessment of my company to see if I am making any of the mistakes Erikson lists in the Deadly Firms chapter. Unless my goal is to build an unsuccessful company, I want to be active in fixing these situations, even if it is just an employee perception. I don’t think too many people want to be unsuccessful at running their own company.&lt;/p&gt;  &lt;p&gt;Another point Erickson makes is about passion for work, and how to maintain that during hard times, especially when the client you are working for is not in an industry you find appealing. I spent three years working for a client that did direct marketing… sending out junk mail and running those annoying call centers that call you during dinner. I slept on my office floor multiple nights while doing system upgrades, and let me tell you, that was really hard to justify to myself after a while. That experience left me quite cynical when it comes to working on projects I don’t fully believe have societal value. In the long run, that cynicism can be a career killer in consulting. It can kill your passion for software development, and once you’ve lost that, it can be very difficult to get it back. Employers, and especially co-workers, notice when your passion withers. In tough markets, not every job will be life-fulfilling, but Erickson suggests that taking pride in the work &lt;u&gt;you&lt;/u&gt; do on each project will preserve the passion, and from there, passion will generate positive results and better&amp;#160; opportunities in the future. It takes a while to build up the resume, and there is something to learn on just about every project.&lt;/p&gt;  &lt;p&gt;I’m giving this book a big, big thumbs up, and making sure that my wife, who is a project management consultant, also reads&amp;#160; this book. Very little of the book is specific to programming, and those bits can be read and parallels drawn with most other industries and job types.&lt;/p&gt;  &lt;p&gt;Do yourself a favor, and read this book, and then get your coworkers, and your boss to read it too. If the suggestion is negatively received, you may already be working at one of the ‘Seven Deadly Firms’, and its time to find your exit strategy.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-7248038132266391878?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/7248038132266391878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=7248038132266391878&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7248038132266391878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7248038132266391878'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2011/07/book-review-nomadic-developer-by-aaron.html' title='Book Review: The Nomadic Developer by Aaron Erickson'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-sCWdE22RS9I/TiOsgMmLJhI/AAAAAAAAAkc/fR43ukphSNw/s72-c/NomadicDeveloper_thumb%25255B2%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2609748149201095547</id><published>2011-04-12T15:44:00.001-07:00</published><updated>2011-04-12T15:44:01.171-07:00</updated><title type='text'>Where did I go?</title><content type='html'>&lt;p&gt;Judging by the activity on this blog (or lack thereof), you'd think I was either dead or retired. I am not dead.&lt;/p&gt;  &lt;p&gt;I am still actively developing software, and am constantly hanging out on the bleeding edge.&amp;#160; To that end, I do occasionally post blog entries on the web site of the company I work for (&lt;a href="http://www.Palador.com"&gt;www.Palador.com&lt;/a&gt;).&amp;#160; But most of the stuff I work on I cannot discuss in public, or is so well covered by other blogs that I don't see the need to cover.&amp;#160; In the best case I’d just be repeating what someone else has said, or in the worst case, I’d be plagiarizing it.&lt;/p&gt;  &lt;p&gt;So if you have a question or a comment, feel free to leave it.&amp;#160; But I only swing by this blog once in a blue moon, so if you are in a hurry, you might want to try another search.&lt;/p&gt;  &lt;p&gt;If you really need to get ahold of me, you can try my writing blog at &lt;a href="http://www.joebeernink.com"&gt;www.joebeernink.com&lt;/a&gt;.&amp;#160; It’s not technical in the least, but it is monitored much more frequently.&lt;/p&gt;  &lt;p&gt;Thanks for stopping by.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2609748149201095547?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2609748149201095547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2609748149201095547&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2609748149201095547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2609748149201095547'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2011/04/where-did-i-go.html' title='Where did I go?'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-513592635868632491</id><published>2010-09-28T15:18:00.001-07:00</published><updated>2010-09-28T15:18:22.898-07:00</updated><title type='text'>MVC Abstract Controller</title><content type='html'>&lt;p&gt;It’s been a while since I’ve posted anything here.&amp;#160; I’ve been busy, and most of the stuff I am working on I either can’t blog about or isn’t worth blogging about as it’s pretty much already covered in a dozen other blogs.&amp;#160; But I have been doing a lot of very basic ASP.NET MVC coding lately on a couple of sites.&amp;#160; I’ve stepped step back from my architect role to do some heads down coding to fill a personnel gap.&amp;#160; I don’t get to do that a lot, and I rather enjoy it when I get the chance.&amp;#160; &lt;/p&gt;  &lt;p&gt;But I did come across a very interesting ASP.NET MVC situation this week that required more than a little thought.&amp;#160; And since my monthly blog entry was due for work, I put a long entry about an &lt;a href="http://palador.com/blog/post/ASPNET-MVC-Creating-an-Abstract-Controller.aspx"&gt;ASP.NET MVC Abstract Controller&lt;/a&gt; on the &lt;a href="http://www.palador.com"&gt;Palador&lt;/a&gt; web site blog.&lt;/p&gt;  &lt;p&gt;Feel free to leave me a note here or there.&amp;#160; I’m always afraid of putting a big ‘code’ blog up because it’s just asking for someone to come along and rip the snot out of it and show me a better way to do it. But in this case, I’ll take the chance, as the solution was simple and saved me a lot of time and frustration.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-513592635868632491?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/513592635868632491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=513592635868632491&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/513592635868632491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/513592635868632491'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/09/mvc-abstract-controller.html' title='MVC Abstract Controller'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-7676885228822353837</id><published>2010-08-05T09:16:00.001-07:00</published><updated>2010-08-05T09:16:25.978-07:00</updated><title type='text'>Book Review:  Microsoft SharePoint 2010 – Building Solutions</title><content type='html'>&lt;p&gt;&amp;#160;&lt;a href="http://lh3.ggpht.com/_12eTh49TeCk/TFrjzbeH4fI/AAAAAAAAAic/6YshrGW-Urk/s1600-h/sp2010%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="sp2010" border="0" alt="sp2010" align="left" src="http://lh4.ggpht.com/_12eTh49TeCk/TFrjzuO7L0I/AAAAAAAAAig/LEjIo7U91e8/sp2010_thumb%5B4%5D.png?imgmax=800" width="92" height="118" /&gt;&lt;/a&gt; The full title of this book by Sahil Malik is &lt;strong&gt;Microsoft SharePoint 2010 – Building Solutions for SharePoint 2010&lt;/strong&gt;, and it was recently published by Apress.&amp;#160; I love Apress books, and have 6 others on various .NET related topics on my shelf.&amp;#160; SharePoint 2010 is something I needed to get up to speed on really quickly for a new project at work, as in I had less than a week to make sure I knew what I was talking about.&lt;/p&gt;  &lt;p&gt;The book is 367 pages, and covers a wide variety of topics in SharePoint 2010.&amp;#160; It demos a few techniques and tools, and identifies some of the differences between SharePoint 2007 and SharePoint 2010, so even if you know SharePoint 2007, it will really help you to identify what is different about 2010.&amp;#160; &lt;/p&gt;  &lt;p&gt;I’ve barely worked in SharePoint in the past.&amp;#160; I tried a little bit of SharePoint 2003, and dabbled in 2007, but frankly, after seeing how painful it was to work in either of those environments, I wanted nothing to do with it.&amp;#160; SharePoint was where good developers went to watch their career die.&amp;#160; Once you knew it, you were guaranteed to get every crappy job out there, and because you were so valuable to the execs and their TPS reports, there was no way you were ever going to get out without quitting your job.&amp;#160; And then, of course, you were so pigeonholed as a SharePoint developer, you could never get out from under it.&amp;#160; Even if I knew SharePoint 2007, I would never put it on my resume.&amp;#160; Career suicide.&lt;/p&gt;  &lt;p&gt;SharePoint 2010 seems to be a little different.&amp;#160; With the advent of Windows Identity Foundation and the advanced made in PowerPivot Services, there are definitely things that can be done in 2010 that would take forever in a typical ASP.NET application.&amp;#160; And Linq to SharePoint is a godsend.&lt;/p&gt;  &lt;p&gt;Malik covers all these topics with a few quick examples so that at least you know what is there, and how to use it.&amp;#160; Each topic is probably worthy of a book of its own.&amp;#160; I don’t have that kind of spare time, so I needed something at this level so I at least can speak the language and help to architect where these features can be used.&amp;#160; Some features I will deep dive into in the future.&amp;#160; Some features I will leave for others on my team to get familiar with.&amp;#160; You can’t know them all.&lt;/p&gt;  &lt;p&gt;I do have a very big gripe with this book.&amp;#160; It does not appear as if it was ever professionally edited by a real copy editor.&amp;#160; There are grammar and spelling mistakes on just about every page.&amp;#160; As a fellow author, I know how hard it is to produce clean copy by yourself.&amp;#160; A second or third set of eyes is always necessary.&amp;#160; So I don’t blame the author for this, I blame the publishing company, Apress.&amp;#160; I really hope this is not a sign of things to come.&amp;#160; I know things are changing in the publishing world, and time to market on these books is critical and compressed.&amp;#160; But in the two or three dozen technical books I’ve read in the last few years, and the dozens of fiction books I’ve read, I can only remember a few typos.&amp;#160; This book had hundreds, and it drove me batty.&amp;#160; I had to reread entire sentences to try to make sense out of them because words were transposed, missing or extras added in and never removed.&lt;/p&gt;  &lt;p&gt;Also, the print on this book, and the line spacing is small.&amp;#160; It really felt like they were trying to save paper by eliminating paragraph breaks.&amp;#160; If the book was a fast action thriller, that may not be a problem, but in a technical book, I expect proper formatting.&amp;#160; It helps to convey information and give your brain a break; an indication that the topic or idea is changing.&amp;#160; Without a break, it gets really hard to read. A lot of the graphics are blurry or too dark to read, though that could have been my eyes as I was reading late in the evening.&amp;#160; At one point, it was so bad, I wanted to hurl the book across the room.&lt;/p&gt;  &lt;p&gt;I’m going to recommend this book, but I really hope they do another edit on it.&amp;#160; Architects should read it.&amp;#160; SharePoint 2007 devs should read it to get up to speed on the changes.&amp;#160; New devs for SharePoint 2010?&amp;#160; Not sure.&amp;#160; It does give a good introduction to SharePoint Development, but you’ll probably end up buying another book as well to get into the nitty-gritty.&lt;/p&gt;  &lt;p&gt;SharePoint 2010 seems to have come a very long way from it predecessors, but it still feels like it is behind the times, and a little kludgy.&amp;#160; I’m worried that there are difficulties hidden in the practicalities of working with it that are glossed over by this book – things that you could spend a week trying to figure out, only to be frustrated by some weird case where you have to use I before E except after C when the word is in French and followed by an apostrophe.&amp;#160; SharePoint 2010 is to SharePoint 2007 as .NET 2.0 was to .NET 1.1.&amp;#160; The next version should be like .NET 3.5, infinitely better and more stable.&amp;#160; 2010 is usable, but just not quite there yet.&lt;/p&gt;  &lt;p&gt;But it no longer seems like career suicide to know it.&amp;#160; You’ll probably just need to make sure it is not the first item you list on your resume.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-7676885228822353837?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/7676885228822353837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=7676885228822353837&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7676885228822353837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7676885228822353837'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/08/book-review-microsoft-sharepoint-2010.html' title='Book Review:  Microsoft SharePoint 2010 – Building Solutions'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_12eTh49TeCk/TFrjzuO7L0I/AAAAAAAAAig/LEjIo7U91e8/s72-c/sp2010_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-3665149110936745261</id><published>2010-08-04T08:30:00.001-07:00</published><updated>2010-08-04T08:30:20.894-07:00</updated><title type='text'>Book Review: Programming Windows Azure</title><content type='html'>&lt;p&gt;I meant to review Sriram Krishnan’s &lt;a href="http://www.amazon.com/Programming-Windows-Azure-Microsoft-Cloud/dp/0596801971/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1280934338&amp;amp;sr=8-1-spell"&gt;Programming Windows Azure&lt;/a&gt; book a few weeks ago, but I have been slacking.&amp;#160; It wasn’t until last night, when I was halfway through my next technical book (which I will review soon), that I realized that I had neglected to do the obligatory blog post.&lt;/p&gt;  &lt;p&gt;I’ve been working with Windows Azure since the day after the CTP Launch.&amp;#160; I was in the Early Adopter program.&amp;#160; I corresponded regularly via email or via the forums with various members of the Azure Team for about 8 months between December 2008 and July 2009.&amp;#160; I’ve led three major projects in the Azure world, and at PDC last year, members of the Azure team were finally able to put a face to the name of the guy that kept asking the questions that kept them working a lot of hours.&amp;#160; Most of them didn’t hold that against me.&lt;/p&gt;  &lt;p&gt;I give that background because when I bought this book I didn’t think I, of all people, would get much out of it.&amp;#160; It was going to be another trophy on my shelf, a book read, a subject I thought I knew well enough to make this what I would consider a ‘light read’.&lt;/p&gt;  &lt;p&gt;I was in for a shock.&amp;#160; A refreshing one.&amp;#160; This book taught me something new, or closed a gap in my knowledge base, on just about every page.&amp;#160; While I had worked with Windows Azure, it was in the context of delivering a specific product, and my focus was on using Windows Azure as a tool to allow the product to launch, and a lot of the details had be bypassed.&lt;/p&gt;  &lt;p&gt;This is a great book – one of the top 3 or 4 technical books I’ve read in the past 3 years.&amp;#160; Every developer working on Azure must read this book.&amp;#160; Must.&amp;#160; Nothing beats the experience of working on a new platform, but this book will sure make it easier, and teach you the benefits and the pitfalls of this environment.&lt;/p&gt;  &lt;p&gt;The biggest downfall of this book is that Chapters 1 (Cloud Computing) and 2 (Under The Hood) will lose a lot of developers who have no interest in the internals of Azure or the history of cloud computing.&amp;#160; These are both necessary and interesting chapters, but for the non-architect or truly technical geek, most will skim them or skip them.&lt;/p&gt;  &lt;p&gt;Also, the scope of the book is limited to the Azure Platform itself, and it does not cover things like the AppFabric or the role of Windows Identity Foundation in Azure.&amp;#160; I’m looking for a good book on those as well, since I have yet to deep dive into the Service Bus, and haven’t worked with WIF since it was still called Geneva.&lt;/p&gt;  &lt;p&gt;The rest of the book is superb, and like I said, I learned something on every page.&amp;#160; Every Azure developer should have this trophy on their shelf.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-3665149110936745261?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/3665149110936745261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=3665149110936745261&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3665149110936745261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3665149110936745261'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/08/book-review-programming-windows-azure.html' title='Book Review: Programming Windows Azure'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-3537993003093640626</id><published>2010-08-04T07:46:00.001-07:00</published><updated>2010-08-04T07:46:02.760-07:00</updated><title type='text'>Microsoft Word 2010 Bug</title><content type='html'>&lt;p&gt;I spend a lot of time in Microsoft Word 2010 writing my novels.&amp;#160; I most often am working on my ACER 1420P laptop while doing it, and honestly, this is the only place I have seen this bug, but it annoys the crap out of me. &lt;/p&gt;  &lt;p&gt;Here’s what happens:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Open a new or existing document&lt;/li&gt;    &lt;li&gt;Start typing&lt;/li&gt;    &lt;li&gt;Let you mouse cursor drift up over the tool bar (like the one for text formatting).&amp;#160; &lt;/li&gt;    &lt;li&gt;Keep typing.&lt;/li&gt;    &lt;li&gt;Eventually, characters will start repeating.&amp;#160; First you’ll see three ‘c’ characters (or whatever character that falls victim to this bug on that given day).&amp;#160; If you see this start to happen, sometimes moving the mouse will stop the next phase from happening, but if you miss it because you watch your fingers and not the screen (which I am prone to do), phase 2 of the bug will soon kick in.&lt;/li&gt;    &lt;li&gt;Phase 2 involves Satan taking over your computer.&amp;#160; If you just happen to hit the backspace key or a cursor key, it will start repeating indefinitely.&amp;#160; Next thing you know, your whole document is gone or you are sitting at the top or bottom of your document, and you still can’t get control back.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The only thing that I have ever found that works is to pull up task manager, and kill Word.&amp;#160; But at least it will ask you if you want to save your changes before it closes.&amp;#160; If the repeating character is a cursor movement, no problem.&amp;#160; If it was the backspace key, you are SOL.&lt;/p&gt;  &lt;p&gt;I find that the bug shows up most often if the cursor seems caught between tool bar buttons.&amp;#160; It looks like a Windows event has gotten into an infinite loop, and as a developer, I would not want to be the one who has to try to figure this one out.&lt;/p&gt;  &lt;p&gt;That said, I really hope this gets fixed soon.&amp;#160; It happens to me at least once a week, and more than once has cost me work.&amp;#160; I save early and save often because this one could strike at any moment.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-3537993003093640626?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/3537993003093640626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=3537993003093640626&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3537993003093640626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3537993003093640626'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/08/microsoft-word-2010-bug.html' title='Microsoft Word 2010 Bug'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-3077785716760536133</id><published>2010-07-05T14:34:00.001-07:00</published><updated>2010-07-05T14:34:27.129-07:00</updated><title type='text'>Gradients, CSS and Overflow</title><content type='html'>&lt;p&gt;Last year, I built a website (http://&lt;a href="http://www.joebeernink.com"&gt;www.joebeernink.com&lt;/a&gt;) to handle aspect of my burgeoning writing career.&amp;#160; I also used it to learn ASP.NET MVC.&lt;/p&gt;  &lt;p&gt;I had a designer do the styles and the graphics, but I did all the HTML work.&amp;#160; When I originally laid everything out, the content all fit nicely on a single 800px long div which exactly matched the length of the repeating vertical gradient the designer put together for me for the outer background.&amp;#160; &lt;/p&gt;  &lt;p&gt;Once the content got too long, the repeating style left a lot to be desired.&amp;#160; It not only repeated across the X axis, but the Y axis as well, which meant starting at pixel 801, I had this nasty black line across the bottom of the screen, and then the gradient began again.&amp;#160; Yuck.&lt;/p&gt;  &lt;p&gt;So instead of that, I set overflow = auto on all my inner divs, which for a while meant that the one page that had too much content had an inner scroll bar.&amp;#160; I was kind of okay with that (I shouldn’t have been), but CSS has never been something I’ve worked with a lot, so I ignored it.&lt;/p&gt;  &lt;p&gt;Lately, as I’ve been upgrading my site for an upcoming conference, every page began to have the scroll bar, and it was killing me.&amp;#160; I talked to my designer at work and they shook their heads and said, “Dude, that’s like one line of CSS to fix.&amp;#160; Don’t be such a loser.”&amp;#160; Okay they didn’t say that, but they should have.&amp;#160; They said it was pretty easy, and could be done in a single line of CSS.&amp;#160; They were going to send me that line of CSS, but must have forgot.&amp;#160; So yesterday, knowing that a single line solution existed, I got ready to do some CSS spelunking, and eventually came up with the solution.&lt;/p&gt;  &lt;p&gt;Out with the old CSS Classes&lt;/p&gt;  &lt;p&gt;.page   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; background-image: url(&amp;quot;../../Content/beernink_pagebkgd.jpg&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; margin-left: auto;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; margin-right: auto;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; background-repeat: repeat;    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;#main   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; margin-left: auto;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; margin-right: auto;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; padding: 20px 30px 20px 30px;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; background-image: url(&amp;quot;../../Content/beernink_insideBkgd.jpg&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; background-repeat: repeat;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; margin-bottom: 5px;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; width: 740px;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; _height: 1px; /* only IE6 applies CSS properties starting with an underscrore */    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; overflow: auto;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; height: 500px;     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;And in with the new&lt;/p&gt;  &lt;p&gt;.page   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;background: #252E33 url(&amp;quot;../../Content/beernink_pagebkgd.jpg&amp;quot;);     &lt;br /&gt;&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160; margin-left: auto;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; margin-right: auto;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; background-repeat: &lt;strong&gt;repeat-x&lt;/strong&gt;;    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;#main   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; margin-left: auto;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; margin-right: auto;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; padding: 20px 30px 20px 30px;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; background-image: url(&amp;quot;../../Content/beernink_insideBkgd.jpg&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; background-repeat: repeat;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; margin-bottom: 5px;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; width: 740px;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; _height: 1px; /* only IE6 applies CSS properties starting with an underscrore */    &lt;br /&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; /* overflow: auto;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; height: 500px; */      &lt;br /&gt;&lt;/strong&gt;}&lt;/p&gt;  &lt;p&gt;The #252E33 is the color at the bottom of the gradient. The color nicely fills the page beyond the 800px line, and looks great.&amp;#160; &lt;/p&gt;  &lt;p&gt;There are probably better ways to do this, but this was simple and allowed me to say the site was ‘done-done’ for the conference later this month.&lt;/p&gt;  &lt;p&gt;Of course, now I want to find a real blogging engine in ASP.NET MVC that I can deploy with my site.&amp;#160; Any recommendations?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-3077785716760536133?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/3077785716760536133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=3077785716760536133&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3077785716760536133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3077785716760536133'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/07/gradients-css-and-overflow.html' title='Gradients, CSS and Overflow'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2733943586334047030</id><published>2010-05-07T07:08:00.001-07:00</published><updated>2010-05-07T07:08:23.741-07:00</updated><title type='text'>Silverlight + Azure Shared Access Policy Issue</title><content type='html'>&lt;p&gt;We’ve been working with &lt;a href="http://blog.smarx.com/posts/shared-access-signatures-are-easy-these-days"&gt;Shared Access Policies&lt;/a&gt; in Azure for the last week or so, and for the most part it was working.&amp;#160; But it would only work for a while, then it would stop.&amp;#160; Then it would start working again.&amp;#160;&amp;#160; It took some help from Steve Marx and Jai Haridas on the Azure Team to figure out what was going on.&lt;/p&gt;  &lt;p&gt;This first piece of code is part of our storage manager that retrieves the Uri for the blob from Azure Blob Storage, and creates a Shared Access Policy for that blob so that our Silverlight Video Player can directly access the blob without going through a very slow web service call.&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// Get the Uri for a specified video blob&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;videoId&amp;quot;&amp;gt;The unique identifier of the video&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;A Uri ponting to the Video&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Uri GetVideoBlobUri(Guid videoId)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;         {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;             var log = Log4NetHelper.GetLogger();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;             log.DebugFormat(&lt;span style="color: #006080"&gt;&amp;quot;Getting Video for video id {0}&amp;quot;&lt;/span&gt;, videoId);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;             {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;                 CloudBlobContainer container = GetContainer(&lt;span style="color: #006080"&gt;&amp;quot;VideoContainerName&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;                 CloudBlockBlob cloudBlockBlob = container.GetBlockBlobReference(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(CultureInfo.InvariantCulture, &lt;span style="color: #006080"&gt;&amp;quot;{0}&amp;quot;&lt;/span&gt;, videoId));&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;                 &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;                 var readPolicy = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SharedAccessPolicy&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;                 {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;                     Permissions = SharedAccessPermissions.Read,&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;                     SharedAccessExpiryTime = DateTime.UtcNow + TimeSpan.FromMinutes(10)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;                 };&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;                 var blobUri = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Uri(cloudBlockBlob.Uri.AbsoluteUri + cloudBlockBlob.GetSharedAccessSignature(readPolicy));&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;                 log.DebugFormat(&lt;span style="color: #006080"&gt;&amp;quot;GetVideoBlobUri successfully retrieved for video id {0}&amp;quot;&lt;/span&gt;, videoId);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; blobUri;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;             }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (StorageClientException ex)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;             {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;// If the blob was not found, return null&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (ex.ErrorCode == StorageErrorCode.BlobNotFound)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;// Rethrow the exception in all other cases&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;             }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;             {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt;                 log.ErrorFormat(&lt;span style="color: #006080"&gt;&amp;quot;Error while retrieving video blob {0}&amp;quot;&lt;/span&gt;, ex.Message);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt;             }            &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt;         }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In our Silverlight Web Service, we call this manager class and return the Uri embedded in an XElement.&amp;#160; Originally we did this to allow us to return other information with the Uri, but at this point, the Uri is all we are passing through.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// Get video URI.&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;videoId&amp;quot;&amp;gt;ID of the given video.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;Status&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; XElement DemoVideoUri(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; videoId)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     var blobManager = UnityFactory.Current.Resolve&amp;lt;IBlobManager&amp;gt;();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     var blobUri = blobManager.GetVideoBlobUri(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Guid(videoId));&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; xml = &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;&amp;lt;VideoUri&amp;gt;{0}&amp;lt;/VideoUri&amp;gt;&amp;quot;&lt;/span&gt;, HttpUtility.HtmlEncode(blobUri.AbsoluteUri));&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     var sr = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringReader(xml);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; XElement.Load(sr);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On the Silverlight side, we take make a call to this web service, extract the Url from the XElement, and pass the Url into the MediaPlayer like so&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; var client = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WebClient();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; var videoUri = GetVideoUri();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; client.DownloadStringCompleted += (x, y) =&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;                                Dispatcher.BeginInvoke(&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;                                    () =&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;                                    {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;                                        var xdoc = XDocument.Parse(y.Result);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;                                        var query = from b &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; xdoc.Descendants()&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;                                                    select b.Value;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;                                        HostedVideoUri = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Uri(HttpUtility.HtmlDecode(query.First()), UriKind.Absolute);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;                                        mediaPlayer.Source = HostedVideoUri;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;                                        Log(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;HostedVideoUrl = {0}&amp;quot;&lt;/span&gt;, HostedVideoUri.AbsoluteUri));&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;                                    }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;                                    );&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt; client.DownloadStringAsync(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Uri(videoUri, UriKind.Absolute));&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; GetDemoVideoUri()&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;     var host = HtmlPage.Window.Eval(&lt;span style="color: #006080"&gt;&amp;quot;window.location.hostname;&amp;quot;&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;     var path = HtmlPage.Window.Eval(&lt;span style="color: #006080"&gt;&amp;quot;window.location.pathname;&amp;quot;&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;     var refererUri = host + path;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;     var url = &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;http://{0}/xxxx.Svc/DemoVideoUri/{1}&amp;quot;&lt;/span&gt;, GetHost(), VideoId);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; url;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This is all pretty simple code (and the above code works, by the way).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Where we ran into problems was in the Web Service, when populating the xml string.&amp;#160; Originally, we used blobUri.ToString() instead of blobUri.AbsoluteUri.&amp;#160;&amp;#160; This caused big issues (403 errors returned from the Azure Storage Service), when the Video Player tried to retrieve the blob because the Url returned from the Shared Access Policy generator can have spaces in it.&amp;#160; And Uri.ToString and Uri.AbsoluteUri work very differently when handling spaces.&amp;#160; I did not know this until last night.&amp;#160; &lt;a href="http://www.pluralsight-training.net/community/blogs/keith/archive/2009/10/10/beware-uri-tostring.aspx"&gt;Uri.ToString unescapes the Uri before returning it.&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So why did it work sometimes, and not all the time?&amp;#160; Simple.&amp;#160; Sometimes the Uri from the Shared Access Policy Generator has spaces, and sometimes it does not.&amp;#160; The former did not work, while the latter did.&amp;#160; We were looking for a pattern in the number of times we called the web service, or the interval between calls, and the size of the video blob.&amp;#160; But it was as simple as a single space.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I think we spent at least 8 hours over the last two days trying to track down this bug.&amp;#160; Hopefully this saves someone else some grief.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;font size="1"&gt;This post is cross posted on &lt;/font&gt;&lt;a title="http://www.palador.com/blog/Blog/Silverlight--Azure-Shared-Access-Policy-Issue" href="http://www.palador.com/blog/Blog/Silverlight--Azure-Shared-Access-Policy-Issue"&gt;&lt;font size="1"&gt;http://www.palador.com/blog/Blog/Silverlight--Azure-Shared-Access-Policy-Issue&lt;/font&gt;&lt;/a&gt;&lt;font size="1"&gt; intentionally.&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2733943586334047030?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2733943586334047030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2733943586334047030&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2733943586334047030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2733943586334047030'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/05/silverlight-azure-shared-access-policy.html' title='Silverlight + Azure Shared Access Policy Issue'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8946749347660830710</id><published>2010-04-26T12:08:00.001-07:00</published><updated>2010-04-26T12:08:39.455-07:00</updated><title type='text'>Book Review:  Professional Application Life Cycle Management with Visual Studio 2010</title><content type='html'>&lt;p&gt;We’re jumping into Visual Studio 2010 this week, and beginning the migration to TFS 2010 as well.&amp;#160; I wanted to get familiar with TFS 2010 and try to standardize our practices a little more before we mis-configured everything, so I bought the first book I saw that seemed to cover TFS 2010.&amp;#160; Professional Application Lifecycle Management with Visual Studio 2010 by Mickey Gousset, Brian Keller, Ajoy Krishnomoorthy and MArtin Woodward fit the bill for what I was looking for and more.&lt;/p&gt;  &lt;p&gt;The book is broken into 5 Parts:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Architect&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;This was a little basic, and highlighted a few new features in VS 2010 that I once used Visio to accomplish.&amp;#160; But it also clarified for me a few basic UML constructs that I rarely used or may have been using incorrectly.&amp;#160; I’m not sure I’ll use all of the available UML diagrams very frequently, mainly because not everyone on the team will be able to use them or understand them, but I’ll see how it goes.&amp;#160; Ironically, this may be the last section that is truly useful for me.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Developer&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;I’m going to make sure all my developers are familiar with the new capabilities of VS2010, and this is a fantastic guide to what is possible.&amp;#160; It make take a little effort to get to add these tools to the dev tool belt, but I think these time savers make the difference between a professional development shop, and a place that is just throwing code over the fence.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Tester&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;A great section about brand new functionality in 2010, and an area both testers and devs should be reading.&amp;#160; I’m hoping that I can really alter our expectations of the relationship between dev and QA through the use of these tools, and that by the end of the year, our QA process can be much more thorough than it is now, and not cost any more time than it already does.&amp;#160; It’s definitely been the neglected child of the development process, and my goal for the rest of 2010 is to bring it up to speed.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Team Foundation Server&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;A solid primer on TFS and some good guidance on branching and merging.&amp;#160; A must read for dev leads, architects and build engineers&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Project / Process Management&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;This is the section that really got my attention at first, and the one I would like everyone here to read, even the execs, and especially the solution managers.&amp;#160; Half the battle of good project execution is getting everyone on the same page of terminology and process.&amp;#160; This is definitely worth a read for a shop that is will to make changes, not for the sake of making changes, but to fix issues and bring themselves into compliance with the rest of the development world to eliminate the vocabulary barrier.&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;I found all the sections useful as a starting point to either make slight improvements to the processes we use, or as a guideline to make wholesale changes to how we are working to improve our output.&amp;#160; &lt;/p&gt;  &lt;p&gt;What I really liked about this book was that while I could have figured this stuff out on my own over the next year or so, it gave me a good primer to get started, so hopefully that will result in fewer wrong steps, and let me know about hidden features that I may have never discovered.&amp;#160; &lt;/p&gt;  &lt;p&gt;I powered through this book in about a week, and I’m sure I remember less than 50% of it.&amp;#160; But at least I know where to go to look things up, and can begin to plot out direct for the configuration of our TFS servers and our processes.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8946749347660830710?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8946749347660830710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8946749347660830710&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8946749347660830710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8946749347660830710'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/04/book-review-professional-application.html' title='Book Review:  Professional Application Life Cycle Management with Visual Studio 2010'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-6862509496839504960</id><published>2010-03-02T15:13:00.003-08:00</published><updated>2010-03-02T15:13:24.998-08:00</updated><title type='text'>Book Review: Introducing .NET 4.0</title><content type='html'>&lt;p&gt;I recently finished reading Alex Mackey’s book, “Introducing .NET 4.0 With Visual Studio 2010”.&amp;#160; VS2010 won’t be launched until April 12, 2010, which is still just over a month away, but I’ve been champing at the bit, ready to dive into .NET 4.0 for months now.&amp;#160; Mackey does a great job of whetting my appetite without drowning me in the minutiae of each new or improved feature.&amp;#160; &lt;/p&gt;  &lt;p&gt;.NET 4.0 is all about improvements to pieces that have been slowly coming together over the past few years.&amp;#160; There have been a number of out of band releases to the .NET Framework since .NET 3.5 launched.&amp;#160; .NET 4.0 enhances a lot of those releases, and, in some cases, completely goes back to the drawing board.&amp;#160; There are a few new features that will make developers happy, but for me, the money is in the things Microsoft made better.&amp;#160; &lt;/p&gt;  &lt;p&gt;Mackey assumes you have a good knowledge of .NET, as this book targets what is new since 3.5.&amp;#160; He includes things which were included in .NET 3.5. SP1, since not everyone may have gotten into that yet.&amp;#160; I was pleasantly surprised at how much of the SP1 functionality we have actually put to use here, and was able to skim those chapters.&lt;/p&gt;  &lt;p&gt;There are parts of the book that were finished before the actual functionality of VS2010 or .NET 4 were finalized, but that’s what you’ll get when you buy a book on a product before the product is released. Caveat Emptor.&lt;/p&gt;  &lt;p&gt;By the end of the book, I was able to make some decisions on what functionality to target for further research.&amp;#160; My bets are on three areas that will have the biggest payoffs for my team and my customers:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MEF (Managed Extensibility Framework) &lt;/li&gt;    &lt;li&gt;Entity Framework 4.0 &lt;/li&gt;    &lt;li&gt;Windows Workflow 4 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;With MEF being such an integral part of Office 2010, a good working knowledge of it is essential to provide process enhancements for our customers.&lt;/p&gt;  &lt;p&gt;We use Entity Framework 1.0 in just about every project we work on, and the leap to 4.0 should resolve a number of significant issues and code costs that we have encountered in the past year.&amp;#160; I expect to see a large effort reduction in application development costs due to this upgrade.&lt;/p&gt;  &lt;p&gt;If the improvements to Windows Workflow are as good as advertised, then I believe WF will go from shunned cousin to an accepted member of the development family.&amp;#160; There’s a lot of power in WF, but the previous implementation was lacking.&amp;#160; I stopped considering the previous releases as viable last year after a few false starts, but I have much higher hopes for it going forward with V4.&lt;/p&gt;  &lt;p&gt;I recommended Introducing .NET 4 to my colleagues as a good getting started guide, and directed some to target certain chapters to match up with the type of work they typically do, or areas where they have yet to become involved in to give them a 40,000 foot view.&amp;#160; &lt;/p&gt;  &lt;p&gt;I will probably go out and buy other .NET 4 books as they become available, but will focus on the three areas above as they will have the biggest impact to my architecture choices in the coming months.&amp;#160; &lt;/p&gt;  &lt;p&gt;Mackey helps to give that guidance, and gets me excited for the new features.&amp;#160; That’s what I want in an introductory level book.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-6862509496839504960?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/6862509496839504960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=6862509496839504960&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6862509496839504960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6862509496839504960'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/03/book-review-introducing-net-40.html' title='Book Review: Introducing .NET 4.0'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-7430491616014244786</id><published>2010-03-02T15:13:00.001-08:00</published><updated>2010-03-02T15:13:08.367-08:00</updated><title type='text'>Cross Site Blogging</title><content type='html'>&lt;p&gt;Today, I’m proud to announce the launch of a revamped &lt;a href="http://www.palador.com"&gt;Palador.com&lt;/a&gt; web site.&amp;#160; Palador is the consulting company that I work for, and as the Senior Application Architect there, I will be doing my part to blog there, as well as here, and my personal blog as well.&amp;#160; That’s a whole lot of blogging, but I actually get paid to blog there, so hey, I’m okay with taking that on.&lt;/p&gt;  &lt;p&gt;Occasionally, I will cross post blogs here and there.&amp;#160; Sometimes things will be posted there and not here, depending on the topic. We’ll see how it goes.&lt;/p&gt;  &lt;p&gt;We’ll have five or six of us posting entries on a variety of topics, which is cool as it just goes to show how diverse our skill set is here.&amp;#160; &lt;/p&gt;  &lt;p&gt;Anyway, take a spin over to the new site and let us know what you think.&amp;#160; I wrote or edited a lot of the copy there, so if you find issues, let me know. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-7430491616014244786?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/7430491616014244786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=7430491616014244786&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7430491616014244786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7430491616014244786'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/03/cross-site-blogging.html' title='Cross Site Blogging'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-6418960038717665577</id><published>2010-02-01T10:45:00.001-08:00</published><updated>2010-02-01T11:30:20.393-08:00</updated><title type='text'>Living the Evolved Digital Life</title><content type='html'>&lt;p&gt;Okay, it’s been a couple of months since I evolved my digital life, cut the cord to Premium Digital TV, and got my house in order.&amp;#160; So where am I now?&lt;/p&gt;  &lt;p&gt;1.&amp;#160; Lesson Learned:&amp;#160; You cannot run digital video over a wireless router, especially if you have more than 1 wall to go through.&amp;#160; Bite the bullet and pull the ethernet cable if you can.&amp;#160; I was always at 4 bars with the XBox 360, but the router would shutdown every hour or so (sometimes 3 times in a single episode of CSI).&amp;#160; Pulling the cable through the floor was a PITA, but worth it now.&lt;/p&gt;  &lt;p&gt;2.&amp;#160; Spend some time and tune your Harmony remote.&amp;#160; It’ll take a lot of time to get it right.&amp;#160; I still have work to do on mine, but each improvement is noticeable, and after a while, you can’t believe you used to use 3 (or 4) remotes.&amp;#160; That said, sometimes it still is a big pain, especially when the kids are sleeping and you switch video inputs, and the sound is cranked up and you can’t get back to turn down the volume down fast enough.&amp;#160; I find myself planning my moves with the remote.&lt;/p&gt;  &lt;p&gt;3.&amp;#160; Make sure you have enough disk (at least 1TB) on your Media PC.&amp;#160; I still haven’t hooked up my HD tuner because I haven’t wanted to spend any more money on the setup right now to add enough disk to record HD shows.&amp;#160; I’d also like to have a dedicated Media PC with faster processors that can also host PlayOn, but since we have multiple laptops floating around the house, most of the time the PC is a dedicated Media machine.&lt;/p&gt;  &lt;p&gt;4.&amp;#160; 2010 will be the year Internet TV really takes off.&amp;#160; My wife says we were probably a year or two early jumping online, and maybe we were.&amp;#160; I’m looking at things like Boxee Box and thinking that was probably what I wanted.&lt;/p&gt;  &lt;p&gt;5.&amp;#160; We miss having a channel guide on our TV.&amp;#160; We currently have to switch over to the Media center to get it, and because we get more channels on the cable than what the media center allows us to see, we don’t always know what is on at any given time.&amp;#160; This might be worth a little more research.&lt;/p&gt;  &lt;p&gt;6.&amp;#160; I don’t use Hulu near as much as I thought I would.&amp;#160; I just don’t want to go back and watch old shows that often.&lt;/p&gt;  &lt;p&gt;7.&amp;#160; I watch a lot more Netflix and am willing to break movies up over multiple nights if I need to.&lt;/p&gt;  &lt;p&gt;8.&amp;#160; The kids don’t miss on demand that much.&amp;#160; We have a few videos laying around at home, and a few lined up on Netflix.&amp;#160; That seems to get us through rainy Saturday afternoons.&lt;/p&gt;  &lt;p&gt;9.&amp;#160; Maybe I’ve just been busy the last couple of months, but I am watching less TV.&amp;#160; That was a side effect I hoped for.&amp;#160; I’m reading more, and watching better TV when I am watching it.&amp;#160; When there is a little resistance to the inertia of just keeping the TV on all evening, you find other things to do pretty quickly.&lt;/p&gt;  &lt;p&gt;10.&amp;#160; I haven’t sprung for the XBox Live Gold Membership since I get everything I want through PlayOn, but as I was watching a movie last night, I definitely noticed that the hop across my HomeServer through PlayOn left dark scenes a little blocky.&amp;#160; For $40 a year, it might be worth it to get the membership.&lt;/p&gt;  &lt;p&gt;These things always turn out to be a little more complicated than you think they will.&amp;#160; I feel pretty good about it now, but it’ll be a few months before I really forget the pain of the conversion.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-6418960038717665577?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/6418960038717665577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=6418960038717665577&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6418960038717665577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6418960038717665577'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/02/living-evolved-digital-life.html' title='Living the Evolved Digital Life'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-900838869173674149</id><published>2010-01-14T13:07:00.001-08:00</published><updated>2010-01-14T13:07:40.122-08:00</updated><title type='text'>.Net 4.0 and Azure</title><content type='html'>&lt;p&gt;We were mapping out a release schedule for one of our Azure based applications today, and a major part of the application needs to be completely refactored to eliminate tight coupling between our WPF client and our server application.&amp;#160; This coupling is exacerbated by the inability to properly XML serialize some of our Entity Framework 1.0 objects due to the recursive traversal capabilities of EF 1.0.&amp;#160; We’d like to push the refactor back until EF 4.0 is available, but that brought up the question of when .NET 4.0 would be available on Azure.&amp;#160; &lt;/p&gt;  &lt;p&gt;There is no set release data for Azure with .NET 4.0 support at this time. However, Scott Guthrie mentioned on his blog on Dec 17&lt;sup&gt;th&lt;/sup&gt; that &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“We are working with the Azure folks right now to try and get .NET 4 installed on it as soon as possible.&amp;#160; Unfortunately I don't have an exact ETA yet.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;However, the Azure team this week (today since Thursday is their deployment day) did a release to include an ‘OS Version’ attribute for roles so you could specify a particular Azure Build level when deploying. It will default to the most current version if you don’t set it, so it is a way to ensure that if you don’t want to be upgraded, you won’t be. Right now, they only support one version of the Azure OS. This has to be a precursor to the .NET 4 rollout, and something we have been trying to get them to include since our very first meeting with the Azure Team back in November 2008.&amp;#160; I haven’t looked at the feature in detail, but I’m glad they’ve addressed the concern.&lt;/p&gt;  &lt;p&gt;My guess is that they will have to spin up .NET 4.0 support well before the commercial launch of .NET 4 because of the integral role of Azure in VS2010, and that in order for final testing to happen, they’ll have to allow full .NET 4.0 Azure deployments. Kind of a chicken and egg thing.&amp;#160; Stay tuned.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-900838869173674149?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/900838869173674149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=900838869173674149&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/900838869173674149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/900838869173674149'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/01/net-40-and-azure.html' title='.Net 4.0 and Azure'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-4816540224657488224</id><published>2010-01-14T11:48:00.001-08:00</published><updated>2010-01-14T11:48:04.350-08:00</updated><title type='text'>Setting up VS2008 For Windows Mobile 6.1 Development</title><content type='html'>&lt;p&gt;There are a few tricks to setting up your PC for Windows Mobile 6.1 Development that are needed to get moving.&amp;#160; Of course some of this will depend on exactly what you want to do in Windows Mobile.&lt;/p&gt;  &lt;p&gt;My project was pretty simple.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create a Windows Mobile Forms app that interfaces with a Motorola M9090-G scanning device that allows a user of the scanner to scan their employee badge barcode, a barcode for a shipping document, and a barcode for a series of packages.&lt;/li&gt;    &lt;li&gt;The user will scan a large number of packages, and then send their scan records in a batch to a central database for further processing.&amp;#160; The user may or may not be close to a wireless access point at the time of the scan.&lt;/li&gt;    &lt;li&gt;The app has to be fast.&amp;#160;&amp;#160; The folks using this device will fly through dozens of packages a minute, and there will be multiple scanners working to unload a truck, but there are logical gaps in the loading and unloading where the app can upload to the database.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;It’s pretty obvious I needed a client cache for the data.&amp;#160; I chose Microsoft SQL Server CE.&amp;#160; For the backend data store, we’re using SQL Server 2008 (with Change Tracking turned on)&lt;/p&gt;  &lt;p&gt;I didn’t want to custom build a synchronization methodology, and since I played with Microsoft Sync Services a bit last spring on another project, it seemed like a good place to start.&lt;/p&gt;  &lt;p&gt;First off, VS2008 SP1 comes with a number of emulators built in, but no Windows Mobile 6 emulators.&amp;#160; In order to get the right emulators installed, download the following, and install in the following order.&amp;#160; You’ll need to shut down VS2008 to complete this install.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06111A3A-A651-4745-88EF-3D48091A390B&amp;amp;displaylang=en" target="_blank"&gt;Windows Mobile 6 Profession and Standard Software Development Kits Refresh&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=38c46aa8-1dd7-426f-a913-4f370a65a582&amp;amp;displaylang=en" target="_blank"&gt;Windows Mobile 6 Professional Images (USA).msi&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6eb8d0aa-bc6b-4864-8ffe-dc26e1d9f843&amp;amp;displaylang=en" target="_blank"&gt;Microsoft Windows Mobile Device Center Driver&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=38ed2670-a70a-43b3-87f3-7ab67b56cbf2&amp;amp;displaylang=en" target="_blank"&gt;Microsoft SQL Server CE for Devices&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=75FEF59F-1B5E-49BC-A21A-9EF4F34DE6FC&amp;amp;displaylang=en" target="_blank"&gt;Microsoft Synchronization Services for ADO.NET&lt;/a&gt; for devices – note that you cannot user Sync Services 2.0, as it is not device ready yet.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;You should now be able to fire up VS2008 and create a new Smart Device Project.&amp;#160; Make sure you set it up for Windows Mobile 6, or you’ll not have all the options you need, and will have to start over.&lt;/p&gt;  &lt;p&gt;One mistake I made, was not realizing that there is a different version of &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=38ed2670-a70a-43b3-87f3-7ab67b56cbf2&amp;amp;displaylang=en" target="_blank"&gt;Microsoft SQL Server CE for Devices&lt;/a&gt; than for PCs.&amp;#160; You will need to download the correct version to get everything to work.&lt;/p&gt;  &lt;p&gt;I strongly suggest creating two solutions for this type of an application.&amp;#160; One for the Mobile client, and one for the WCF Service, whether it be a Windows Service or a Web Service.&amp;#160; It makes it a lot easier to debug, and helps to ensure that you don’t try to deploy Mobile targeted assemblies to the server and vice versa.&amp;#160; The IDE should prevent you from doing it, but it doesn’t hurt to take this approach anyway.&lt;/p&gt;  &lt;p&gt;I like writing code, but I like getting projects done even more.&amp;#160; So if I find code out there that works, I’m not afraid to put it to use.&amp;#160; There were a couple of projects I found that really help to do some of the heavy lifting:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://synccomm.codeplex.com/" target="_blank"&gt;SyncComm on Codeplex&lt;/a&gt;.&amp;#160; This provides you with all the plumbing you need to get Windows Mobile Sync working in your project.&amp;#160; If there is one thing I would change (and did) in the project, it was to break the ClientService.cs up into another partial class to remove the customizations that were done to it.&amp;#160; I have found three methods that I moved into a separate file.&amp;#160; Otherwise the code gets wiped out when you regenerate it.&amp;#160; Cost me an hour of work.&amp;#160; See code below.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms751458.aspx" target="_blank"&gt;Custom Message Encoder: Compression Encoder on MSDN&lt;/a&gt;.&amp;#160; Download the sample there.&amp;#160; The download link is trickily hidden under the title of the article.&amp;#160; This provides you with all kinds of samples.&amp;#160; The one you want to go to is under &amp;lt;installroot&amp;gt;\WCFSamples\WCF\Extensibility\MessageEncoder\Compression\CS.&amp;#160; Take the GZipEncoder and add the project to your server solution.&lt;/li&gt; &lt;/ol&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ServerClient(System.ServiceModel.EndpointAddress endPointAddress, BindingType bindingType)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        : &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;(GetBinding(bindingType), endPointAddress)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    { }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Binding GetBinding(BindingType bindingType)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        Binding binding;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;switch&lt;/span&gt; (bindingType)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; BindingType.Basic:&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;                binding = CreateDefaultBinding();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;                &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; BindingType.Compressed:&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;                binding = CreateCompressionBinding();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;                &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;:&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;                &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentException(&lt;span style="color: #006080"&gt;&amp;quot;BindingType value not excepted&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; binding;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//NOTE:&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//set compressed endpoint binding custom properties here&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Binding CreateCompressionBinding()&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;// Create a CustomBinding&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        var customBinding = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CustomBinding();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;// Create a compression binding element&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        var compressionBindingElmnt = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CompressionMessageEncodingBindingElement();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;// ..and add to the custom binding&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        customBinding.Elements.Add(compressionBindingElmnt);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;// Create an HttpTransportBindingElement and add that as well&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        var httpBindingElement = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HttpTransportBindingElement();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//TODO&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//Set here desired values. Take care to match such values &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//in app.config in SyncComm host project&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//max buffer size&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//httpBindingElement.MaxBufferSize = int.MaxValue;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//max received message size&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//httpBindingElement.MaxReceivedMessageSize = long.MaxValue;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//max buffer pool size&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//httpBindingElement.MaxBufferPoolSize = long.MaxValue;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        customBinding.Elements.Add(httpBindingElement);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; customBinding;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In order to get WCF to connect from the Windows Mobile 6 Emulator to a Web Service on the local host, you’ll need to follow the steps listed by &lt;a href="http://stackoverflow.com/questions/735770/wcf-on-pocketpc-not-connecting-to-host-machine" target="_blank"&gt;Chris Brandsma on StackOverflow&lt;/a&gt;.&amp;#160; This is critical and can cause a lot of frustration if you don’t do it.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So as of today, I have a client on my Windows 6 Emulator, a Web Service, and the basic data flowing, though I have a lot of work left to do to test and refine the processing, and to test on an actual device.&amp;#160; I’m sure I’ll find a few more issues, but I wanted to note what I had done to this point, just in case I need to replicate the process on another PC or build server here in the near future.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Let me know if this doesn’t work for you.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-4816540224657488224?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/4816540224657488224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=4816540224657488224&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4816540224657488224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4816540224657488224'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/01/setting-up-vs2008-for-windows-mobile-61.html' title='Setting up VS2008 For Windows Mobile 6.1 Development'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2724245951894937650</id><published>2010-01-11T20:17:00.001-08:00</published><updated>2010-01-11T20:17:16.314-08:00</updated><title type='text'>Windows Mobile versus Windows CE</title><content type='html'>&lt;p&gt;As I explore the wonderful world of really small screens, I’m having to choose between Windows CE and Windows Mobile.&amp;#160; There are pros and cons to both, and what I’m going to list below is just what I think I know at the moment.&amp;#160; Of course what I thought I knew on Friday has changed a bunch, so I’m sure I’ll be contradicting myself in later posts, if not calling myself a complete idiot.&lt;/p&gt;  &lt;p&gt;Windows CE is a term used to describe a variable set of OS components that can be deployed to small devices with limited memory and storage.&amp;#160; If you look at the .NET Framework options available in CE apps, you’ve got very little available.&amp;#160; Certainly no WPF, no Silverlight, no native WCF.&amp;#160; You basically need to build up your OS as you go with these components.&lt;/p&gt;  &lt;p&gt;Windows Mobile is built on top of CE, but comes with a more standard (i.e. heavier) package of components and applications built into the OS.&amp;#160; The basic environment to run the application is baked in, but you can add elements from CE type SDKs as needed.&lt;/p&gt;  &lt;p&gt;At this point, there seems to be the following CE Environments:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;4.2 – Deprecated and generally not supported&lt;/li&gt;    &lt;li&gt;5.0 – Most devices can run 5.0.&amp;#160; Its like the XP of the Device world.&lt;/li&gt;    &lt;li&gt;6.x – Various incantations of 6.0 are out there, but the adoption rate by the major vendors is slow.&amp;#160; Motorola (who bought Symbol), is the big player in the scanner market, and they’re just releasing their 6.x machines this year, and 6.x hit the market in 2006.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Windows Mobile is on a slightly different pace&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;5.0 – Seems to be fading fast&lt;/li&gt;    &lt;li&gt;6.0, 6.1 – Are the mainstay of the Windows Mobile Market place, though being surpassed on phones by 6.5&lt;/li&gt;    &lt;li&gt;6.5 – The current version, though wikipedia says it was never really planned.&amp;#160; It just sort of happened.&amp;#160; I hate it when that happens.&lt;/li&gt;    &lt;li&gt;7.0 – The light at the end of the tunnel, coming out sometime this year.&amp;#160; Rumors are swirling that the whole OS will be built in Silverlight.&amp;#160; Microsoft has to come out with something just kick ass to stay relevant in the market.&amp;#160; If Windows Mobile 7 is still based on CE, then that’s a good indication, that they’ve given up on everything except bar code readers.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As I was evaluating the various options, I got that creepy feeling with Windows CE, that if I tied my client to it, or worse, spent the year learning it myself, it would be obsolete before the calendar read 2011.&amp;#160; I was also finding it really difficult to just get going with it, finding the tools I needed to build the software, figuring out how to deploy it, and how to build an emulator for it.&amp;#160; I can’t say that from an architectural perspective, it’s a bad product, but in my gut, I knew it was a dead end.&amp;#160; It hasn’t updated in 4 years.&amp;#160; Even COBOL has been updated in the last 4 years, right?&lt;/p&gt;  &lt;p&gt;So I switched my project over to target Windows Mobile 6.1, and within an hour or two (most of that being downloads of SDKs), I was up and running, and realizing just how little real-estate is on a 240px-320px screen.&amp;#160; Now it’s a matter of figuring out Windows Synchronization Services, and I’m off and running.&lt;/p&gt;  &lt;p&gt;Tomorrow, I’ll post what I did to get my Visual Studio 2008 ready to build and test the Windows Mobile app, which is something I need to document anyway, since I’ll be getting a new work computer soon, and will need to reinstall it anyway.&lt;/p&gt;  &lt;p&gt;Let me know if you think my evaluation is off target.&amp;#160; I’d appreciate the feedback.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2724245951894937650?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2724245951894937650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2724245951894937650&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2724245951894937650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2724245951894937650'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/01/windows-mobile-versus-windows-ce.html' title='Windows Mobile versus Windows CE'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-6302617406347042657</id><published>2010-01-08T17:19:00.001-08:00</published><updated>2010-01-08T17:19:42.113-08:00</updated><title type='text'>Windows Devices</title><content type='html'>&lt;p&gt;I recently took on a new project at work to build a custom scanning app for one of our customers.&amp;#160; It’s a brand new system, likely to be built on the Motorola (ex-Symbol) MC3090-G or MC90900G platform using either Windows CE or Windows Mobile as the base environment.&lt;/p&gt;  &lt;p&gt;I’ve never worked on a mobile device, and the first three days has been something of an adventure.&amp;#160; I’d love to use Silverlight, but the 3090 doesn’t seem to support it.&amp;#160; I’d love to use the Microsoft Sync Framework 2.0, but it looks like that SyncFX 2 does not work on CE, and I’ll have to use 1.0.&amp;#160; I may end up spinning up my own sync processor since the database is dead simple (1, maybe 2 tables).&amp;#160; &lt;/p&gt;  &lt;p&gt;What’s weird is that a year ago I was struggling as an early adopter to learn all new concepts for Azure, a new technology with little documentation and an unstable base.&amp;#160; Now I’m trying to use technology that’s been around for quite a while, and changes a lot more slowly than Azure and Windows Desktop, yet the process of learning is just as hard because the documentation all dates back to 2006-2007 and my gut says ‘don’t trust it, it’s old’.&lt;/p&gt;  &lt;p&gt;So over the next few weeks, I’ll be blogging more about CE / Win Mobile.&amp;#160; Hopefully others will find this useful to get started, and maybe, just maybe, someone will read this, and be able to point me in the right direction.&lt;/p&gt;  &lt;p&gt;Anyone at Microsoft need an early adopter for Windows Mobile 7 + Silverlight on a scanner?&amp;#160; Let me know.&amp;#160; I may consider it if I can’t figure out the other ways sooner than that.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-6302617406347042657?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/6302617406347042657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=6302617406347042657&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6302617406347042657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6302617406347042657'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/01/windows-devices.html' title='Windows Devices'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-7628181549968319736</id><published>2010-01-08T17:18:00.001-08:00</published><updated>2010-01-08T17:18:37.500-08:00</updated><title type='text'>Moral Responsibilities</title><content type='html'>&lt;p&gt;If you work in the software industry long enough, sooner or later you are going to be asked to do something that comes into conflict with your conscience.&amp;#160; Whether it be to ship with defects in the hopes that no key users will find them before you can get it fixed so you can ship on time, or whether it be to include some arcane EULA agreement into the software that no one will ever read, but gives the software or the company to do anything to your PC, or to gather and distribute any personal information the company wants to sell.&amp;#160; Sooner or later, you will review the strength of your convictions.&lt;/p&gt;  &lt;p&gt;When I started out in the industry fifteen years ago, I was an idealist (aren’t we all when we are young).&amp;#160; I can remember tracking my hours religiously to ensure that I got paid for every minute I worked past 40 (this was in Canada and overtime was required… that was nice).&amp;#160; Now, I track hours so I can bill clients, but I have adapted to the term ‘salaried employee’, and I just do the work.&amp;#160; It took a few years to get the ‘overtime’ idea out of my head, but I’m paid well for what I do and I want the small company I work for to be a success.&amp;#160; I also know that I must spend my own time to improve my skill set.&amp;#160; That&amp;#160; was something I didn’t see as my cost of working, just a few short years ago.&amp;#160; My moral values changed over time.&amp;#160; &lt;/p&gt;  &lt;p&gt;A few weeks ago, I upgraded all my personal PCs to Windows 7.&amp;#160; One thing I hadn’t done was to install the HP driver software so I could download pictures from my HP C6180 All in One printer.&amp;#160; I could print to it, but I couldn’t see the SIMM card reader to get the photos.&amp;#160; We had a bunch of pictures on the camera I wanted to post for family to see.&amp;#160; I went out to HP’s website and started to download the installer for the drivers.&lt;/p&gt;  &lt;p&gt;I stopped the download when I saw it was 340 MB.&lt;/p&gt;  &lt;p&gt;Yes, 340 MB.&amp;#160; For drivers.&lt;/p&gt;  &lt;p&gt;Now I’m not an expert on driver software, but I recognize bloatware when I see it.&amp;#160; I stopped the download, and attempted to find driver software just to get the ph0tos.&amp;#160; You know, something that will allow me to see the SIMM as a USB device.&amp;#160; HP’s own site (in small letters off to the side), said that if you wanted just the drivers (no network), to search for the Basic package.&amp;#160;&amp;#160; I did that.&amp;#160; The only package that came up was one for XP and Windows 2000 Server.&amp;#160; Hmmm.&lt;/p&gt;  &lt;p&gt;I got impatient.&amp;#160; I didn’t plan to have my whole evening sucked up with just trying to get pictures off the camera,&amp;#160; That’s supposed to be the easy part.&amp;#160; So I decided to download the 340 MB package and install it.&amp;#160; I knew that the previous version of the software had some really annoying apps that I didn’t want, so I figured at some point during the install I would have a chance to opt out of those. I started clicking through the install.&amp;#160; I got to&amp;#160; the page that asked you to accept the EULA.&amp;#160; I clicked to accept (like anyone reads those), and then clicked next.&amp;#160; I then noticed that the install was about to start without giving me an option to opt out of the bloatware.&amp;#160; Hmmm.&lt;/p&gt;  &lt;p&gt;I went back a screen, and re-read it.&amp;#160; On the screen were a series of links that look like they are part of the text, but are really optional installer screens that let you go an opt out of some of the options.&amp;#160; Okay, my fault, I missed it.&amp;#160; But reading on, I see a part that says failure to install all of the options will probably cause the installer to fail.&amp;#160; What?&amp;#160; Scare tactics or honest truth?&amp;#160; Bad software?&amp;#160; I was about to commend them for their honesty, until I went into the screens, and started to see all the crap (pure bloatware) and all the really dangerous stuff (outright spyware) they were about to try to install.&amp;#160; Holy Mother of God.&amp;#160; I’ve never seen such a blatant attempt to take my personal information.&lt;/p&gt;  &lt;p&gt;Let me stop here for a second, and go back 29 hours.&amp;#160; The previous day I got a call from my wife that she got a call from our credit card company that they had noticed some unusual activity on our credit cards, and sure enough, someone had stolen our number and was buying stuff at BigLots! and Target in California.&amp;#160; I live on the West Coast, but nowhere near California.&amp;#160; So we cancelled our card, had the charges removed, and everything was taken care of in a couple of hours.&amp;#160; I was a little upset, and briefly talked about the death penalty for credit card theft (a damn fine idea if you ask me), but after a few hours, everything was okay.&lt;/p&gt;  &lt;p&gt;Fast forward to last night, sitting in front of my PC, looking at all of this crap.&amp;#160; I was spitting mad.&amp;#160; Mad at HP for creating such a mess.&amp;#160; Mad at HP for knowingly taking advantage of the fact that no one ever reads the EULA.&amp;#160; Mad at HP for violating the trust that we are supposed to have for large purveyors of&amp;#160; hardware and software.&amp;#160; They are supposed to be out there fighting against this kind of thing.&amp;#160; Mad at HP for making software developers do this, because I have to believe that no self-respecting developer would ever do this except against their will in an effort to keep their job.&amp;#160; Mad at the industry that slowly whittles away our moral values to the point that this is acceptable behavior.&amp;#160; Mad at the fact that my elderly parents would install this without questioning it, and expose themselves to all kinds of corporate invasion.&lt;/p&gt;  &lt;p&gt;I went through and eliminated the stuff I didn’t want, and installed what I thought was the barebones driver.&amp;#160; But I missed a checkbox, and it still installed something called HP Web Printer Helper.&amp;#160; The next time I fired up a browser, half the screen was taken up by an HP add on that kept asking for special permissions to send information HP to help improve my experience.&amp;#160; What the fuck!?!&amp;#160; Screw that.&amp;#160; Search though the add on list and disabled it.&lt;/p&gt;  &lt;p&gt;But then I realized that disabling it wasn’t enough.&amp;#160; My other logins for the rest of the family may still have it installed and active.&amp;#160;&amp;#160; So I went back into Control Panel and removed anything from HP that was questionable.&amp;#160; I was still pissed.&lt;/p&gt;  &lt;p&gt;I popped on to HP’s site, looked through their contact page, and fired off a long note to the HP CEO Mark something or other.&amp;#160; There was a 3500 word limit.&amp;#160; I may have been close.&amp;#160; I doubt if I’ll hear back, and I doubt even more if HP will change their evil ways.&amp;#160; I was ready to call for an all out boycott, but I realized that I liked the HP EX 490 Home Server I recently purchased too much not to recommend that one to other people.&lt;/p&gt;  &lt;p&gt;Instead, I’ll simply document my experience here, and hope that my tale takes root, and those roots break the concrete of corporate greed and malfeasance. &lt;/p&gt;  &lt;p&gt;So be forewarned, those of you who blindly approve all EULAs from supposedly trustworthy companies.&amp;#160; They know it, and they’re starting to take advantage of that fact.&amp;#160; Scary. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-7628181549968319736?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/7628181549968319736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=7628181549968319736&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7628181549968319736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7628181549968319736'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/01/moral-responsibilities.html' title='Moral Responsibilities'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5383018095968846508</id><published>2010-01-07T10:52:00.001-08:00</published><updated>2010-01-07T10:52:17.929-08:00</updated><title type='text'>Bug in Entity Framework</title><content type='html'>&lt;p&gt;I found a great little bug in Entity Framework this morning.&amp;#160; One of their exception handlers can throw an exception, that hides the true exception.&amp;#160; Here’s how to recreate this:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Set your thread culture to a neutral culture:&amp;#160; i.e. ‘en’ instead of ‘en-US’&lt;/li&gt;    &lt;li&gt;Create a new EF Context&lt;/li&gt;    &lt;li&gt;Find an object (A) that has a dependency to another object (B) via foreign key and B has a dependency to object C via another foreign key.&lt;/li&gt;    &lt;li&gt;Create a new object of type A called ‘a’&lt;/li&gt;    &lt;li&gt;Get object B and detach it from the database (as if you were getting it in via a web service call).&amp;#160; B should lose it’s link to C&lt;/li&gt;    &lt;li&gt;Add object B to A&lt;/li&gt;    &lt;li&gt;Attempt to add A to the database via the context.AddToA(a)&lt;/li&gt;    &lt;li&gt;Call context.SaveChanges().&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;What you should get is &lt;/p&gt;  &lt;p&gt;System.Data.Entity&amp;#160; Type: System.Data.UpdateException&amp;#160; Message: Entities in '[contextName].B partticipate in the 'FK_B_C' relationship. 0 related 'C' were found. 1 'C' is expected.&lt;/p&gt;  &lt;p&gt;What you will get is:&lt;/p&gt;  &lt;p&gt;&lt;font face="Times New Roman"&gt;System.NotSupportedException: Culture 'en' is a neutral culture. It cannot be used in formatting and parsing and therefore cannot be set as the thread's current culture.&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Globalization.CultureInfo.CheckNeutral(CultureInfo culture)&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Globalization.CultureInfo.get_NumberFormat()&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Globalization.NumberFormatInfo.GetInstance(IFormatProvider formatProvider)&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Data.EntityUtil.ConvertCardinalityToString(Nullable`1 cardinality)&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Data.EntityUtil.UpdateRelationshipCardinalityConstraintViolation(String relationshipSetName, Int32 minimumCount, Nullable`1 maximumCount, String entitySetName, Int32 actualCount, String otherEndPluralName, IEntityStateEntry stateEntry)&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Data.Mapping.Update.Internal.UpdateTranslator.RelationshipConstraintValidator.ValidateConstraints()&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands()&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Data.Objects.ObjectContext.SaveChanges(Boolean acceptChangesDuringSave)&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Data.Objects.ObjectContext.SaveChanges()&lt;/font&gt;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;The only way to get the real error, is to change your current culture from a neutral to a specific culture.&amp;#160; I’ve never seen this one before, and I had a few minutes of head scratching before we got the real cause.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5383018095968846508?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5383018095968846508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5383018095968846508&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5383018095968846508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5383018095968846508'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/01/bug-in-entity-framework.html' title='Bug in Entity Framework'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8839833225275484627</id><published>2010-01-01T16:44:00.001-08:00</published><updated>2010-01-01T16:49:16.809-08:00</updated><title type='text'>Evolution</title><content type='html'>&lt;p&gt;I have evolved.&amp;#160; Well, not me personally, but the technology in my house has definitely undergone an evolution over the past few months.&amp;#160; Or at least a refresh.&amp;#160; It was a long time coming, and there’s still a way left to go, but here’s where I started from, where I am now, and where I think I still need to upgrade.&lt;/p&gt;  &lt;p&gt;Last year at this time I had the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Home Computer:&amp;#160; Dell XPS 410 pretty much a standard ship from the factory (without the TV card) running Vista Ultimate bought in 2005 &lt;/li&gt;    &lt;li&gt;My Laptop:&amp;#160; Toshiba U405-2854 running Vista Ultimate bought in 2008 &lt;/li&gt;    &lt;li&gt;My Wife’s Laptop:&amp;#160; Dell Latitude 550&amp;#160; running Windows XP bought in 2004 &lt;/li&gt;    &lt;li&gt;Phones:&amp;#160; Qwest RAZR with limited texting (2 phones bought in 2005 appx $70/month charges) &lt;/li&gt;    &lt;li&gt;Internet Connection:&amp;#160; Qwest DSL 1.5 MB Download, .3 MB Upload ($30 / month) &lt;/li&gt;    &lt;li&gt;TV Connection:&amp;#160; Comcast Basic Cable ($78/month with DVR and 2 cable boxes) &lt;/li&gt;    &lt;li&gt;Game System:&amp;#160; Standard XBox circa 2004 &lt;/li&gt;    &lt;li&gt;Backup Strategy:&amp;#160; Used Windows Live Mesh for my writing and personal docs, plus a Maxtor 300 GB US Backup drive with Norton Backup (Never worked right) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A number of factors came together over the past year to cause me to spend a bunch of time and a bunch of money upgrading various technical aspects of my life&lt;/p&gt;  &lt;p&gt;1. We upgraded from the basic Qwest Phones to Apple IPhone 3GS with unlimited data from AT&amp;amp;T last spring.&amp;#160; I was happy with the phone I had, but Qwest was discontinuing wireless in our area, and we had to choose a new plan.&amp;#160; I left it up to my wife to pick a new plan / phone for us.&amp;#160; I’ve been fairly satisfied with the IPhone on the whole.&amp;#160; I use the phone every day, for far more than I thought I ever would (who needs web / email on their phone, I used to say), but I actually regret having email on my phone.&amp;#160; I have it linked into my work email, and at times I feel obliged to answer emails at odd hours of the night.&amp;#160; There is nothing worse than getting home on a Friday night, ready for a good, relaxing weekend, only to see an emergency email pop into your box at 6:00 PM.&amp;#160; A year ago, that email would have waited there just fine until Monday morning, and no one would have cared.&amp;#160; I may not work two jobs like some people I know, but I have one job that takes up twice the time it used to.&lt;/p&gt;  &lt;p&gt;I am not happy with ITunes, but that is a whole other story.&lt;/p&gt;  &lt;p&gt;2.&amp;#160; My wife’s computer, the Dell 550, is a beast, both in weight and in the heat it puts out.&amp;#160; It would literally burn your legs if you left it on your lap for too long.&amp;#160; In November, she finally ordered a new laptop, an HP.&amp;#160; That was the same week I went to Microsoft PDC, and received a new ACER 1420P laptop running Windows 7 courtesy of Microsoft.&amp;#160; We promptly returned the HP unopened, and swapped / upgraded laptops.&amp;#160; She got my Toshiba (just over a year old) and I got the Acer.&amp;#160; If you’ve read my blog, you know what I think of the ACER.&amp;#160; I got the raw end of the deal, and would switch with my wife if it wasn’t such a pain to move ITunes from one machine to another.&amp;#160; Unless I can find a glare reducer for the ACER, I’ll probably replace it before 2010 is done.&lt;/p&gt;  &lt;p&gt;We upgraded my wife’s Toshiba to Windows 7, and the Dell XPS 410 to Windows 7 as well.&lt;/p&gt;  &lt;p&gt;3.&amp;#160; With the money we originally had budgeted for the new Laptop, we bought an HP-490 MediaSmart Home Server.&amp;#160; I love this box.&amp;#160; Easy to do the initial setup, looks good, runs quiet.&amp;#160; I added an extra 1.5 TB of disk into it so it could spread the load over multiple disks.&lt;/p&gt;  &lt;p&gt;4.&amp;#160; I then splurged on a new XBox 360 Elite with the 120 GB hard drive, with the idea that I could use it an a media extender for my home server.&amp;#160; I also got the idea that with a little planning, I could drop the $78/month Comcast bill, and make back the money I spent on the XBox in less than 6 months.&amp;#160; This is where my plan started to run into some trouble, and also where the story gets interesting.&lt;/p&gt;  &lt;p&gt;First off, I wanted to put my media server and XBox 360 in my Home Entertainment center, hard wire them to my wireless router and DSL line, then run my desktop off a wireless USB receiver.&amp;#160; A few problems cropped up.&lt;/p&gt;  &lt;p&gt;a)&amp;#160; Running a desktop PC off a USB Wireless G (Linksys WUSB54GC) when you are frequently remote desktopped into you work PC from there is a complete disaster waiting to happen.&amp;#160; Of course the morning after I set this all up, I had to be up at 4:00 AM to talk to someone in India, and my connection kept getting dropped, and I had to go pull the router back out of the entertainment center and put it back into my office just to finish the chat.&lt;/p&gt;  &lt;p&gt;b) 1.5 MB download over Qwest DSL is not fast enough to watch movies on Netflix or TV shows on Hulu.&amp;#160; I thought initially I’d be able to upgrade to 7 or 12 MB on Qwest, but that level is not available in my neighborhood.&amp;#160; Time to call Comcast.&lt;/p&gt;  &lt;p&gt;c) In order to watch internet TV on the XBox 360 from the HP Homeserver, you need to install a product like PlayOn Media Server.&amp;#160; The product works pretty well, though the install on WHS is not straightforward.&amp;#160; Follow the special directions as best you can, and do lots of Google searches. The HP 490 does have one critical flaw for those of you who want to run PlayOn to stream Internet TV.&amp;#160; The CPU is a little slow.&amp;#160; In hindsight, upgrading to the 495 with the Dual Core CPU would have been a better deal.&lt;/p&gt;  &lt;p&gt;I also went out and bought the XBox N Wireless antenna, and had Comcast Upgrade my router to N as well.&lt;/p&gt;  &lt;p&gt;Once I confirmed that Comcast could give me the service level I needed, I was able to drop my TV cable plan from the $78/month to $13.50 a month by going with their very basic plan, and getting rid of the Comcast DVR.&amp;#160; I bought a Hauppauge 1850 Win-TV-HVR PCI-E card and popped that into the last PCI-E slot on the Dell XPS 410 to act as my TV guide / tuner.&amp;#160; That brought up another issue though with the Dell 410.&amp;#160; Drive space.&amp;#160; The Dell is supposed to have dual 175 GB drives set up in a Raid 1 configuration.&amp;#160; When I upgraded the machine to Windows 7, it appears that I lost the Raid Configuration, and now I have 175GB C: drive, and 48 GB on the D: drive.&amp;#160; If you try to set up the DVR on the D drive on the digital tuner, you can only record about 4 hours of TV.&amp;#160; If you set it up on the analog channel, you can get about 30 Hours of shows (due HD vs std output.).&lt;/p&gt;  &lt;p&gt;5.&amp;#160; We bought a Harmony 900 universal remote.&amp;#160; This thing is a beast, but it does work with everything we have, though not quite perfectly.&amp;#160; We’ve been talking about getting something like this for a very long time, but using the XBox controller as a remote for the DVR was the final straw.&lt;/p&gt;  &lt;p&gt;So what was the cost of all this (Roughly, tax excluded)?&lt;/p&gt;  &lt;p&gt;IPhones:&amp;#160; $199 each + $170 per month&amp;#160; (We’ll keep those out the final numbers, since my wife can’t hold those against me.)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;HP 490:&amp;#160; $475 &lt;/li&gt;    &lt;li&gt;Extra 1.5 TB for Home Server:&amp;#160;&amp;#160; $90 &lt;/li&gt;    &lt;li&gt;XBox 360:&amp;#160; $350 &lt;/li&gt;    &lt;li&gt;XBox 360 N Connector:&amp;#160; $99 &lt;/li&gt;    &lt;li&gt;USB G Receiver:&amp;#160; $50 &lt;/li&gt;    &lt;li&gt;Hauppauge WinTV Card:&amp;#160; $119 &lt;/li&gt;    &lt;li&gt;PlayOn Media Server:&amp;#160; $40 &lt;/li&gt;    &lt;li&gt;Windows 7 3 Pack for Toshiba and Home PC - $149 &lt;/li&gt;    &lt;li&gt;Microsoft Office 2007 Home edition 3 pack - $129 &lt;/li&gt;    &lt;li&gt;Harmony 900 – $274 ($138 by using a bunch of Christmas Gift certificates)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Total Hardware / Software Cost:&amp;#160; $1501&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;New: Comcast TV – 13.50 / month &lt;/li&gt;    &lt;li&gt;New: Comcast Internet:&amp;#160; $20/month for 6 month (25MB down, 8 MB up), $45 / month after 6 months &lt;/li&gt;    &lt;li&gt;New Total Cost / Month:&amp;#160; $33.50 / 58.50 after 6 months &lt;/li&gt;    &lt;li&gt;Original Cost / Month:&amp;#160; $30 (Qwest) + 80 (Comcast) = $110. &lt;/li&gt;    &lt;li&gt;Savings after 6 months:&amp;#160; 450 &lt;/li&gt;    &lt;li&gt;Savings after 12 months: 450 + 300 = $700. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So after 1 year, I will have saved about $700, so it will take me about 2 years to break even.&lt;/p&gt;  &lt;p&gt;But I also gained a more reliable backup system (worth quite a bit to me).&lt;/p&gt;  &lt;p&gt;I also turned my WHS into a Web Server and Host my own website there (&lt;a href="http://www.joebeernink.com"&gt;www.joebeernink.com&lt;/a&gt;), which I was hosting on Windows Azure, but since they are about to start charging outrageous amounts of money, I was going to have to switch to GoDaddy.com ($4 / month).&amp;#160; But this way I can try more things with my web site and set up others as well.&amp;#160; Not a big savings in money there, but honesty, going out to godaddy.com when I’m at work makes me feel like I’m looking at porn on company time.&lt;/p&gt;  &lt;p&gt;All of this was a learning experience.&amp;#160; I had some grandiose plans about getting rid of Comcast for good if I could get fast enough DSL speeds, and find all the TV content I wanted on-line, but alas, neither the former or the latter is completely possible, yet.&lt;/p&gt;  &lt;p&gt;For someone about to go through all this themselves, here are a few tips.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Confirm your DSL provider can give you the speed you want before you start. &lt;/li&gt;    &lt;li&gt;The HP Home Server is great, but get the 495. &lt;/li&gt;    &lt;li&gt;Don’t try all this with Windows Vista.&amp;#160; Wait till you have Windows 7 &lt;/li&gt;    &lt;li&gt;Upgrade your wireless to N before you start &lt;/li&gt;    &lt;li&gt;Really investigate what you think you will do with you gaming system.&amp;#160; The PS3 might be a better choice if you want to watch BluRay.&amp;#160; The XBox doesn’t support it.&amp;#160; The number one reason I bought the XBox was because most of my friends have it and they play on line.&amp;#160; I haven’t yet had time to play on-line, so maybe that wasn’t the wisest decision &lt;/li&gt;    &lt;li&gt;Don’t buy a USB Wireless card for a desktop PC.&amp;#160; Waste of money. &lt;/li&gt;    &lt;li&gt;ITunes doesn’t play well with anything.&amp;#160; If you think you will be able to backup your ITunes library to your home server, then play your playlists on your stereo, you will be sadly disappointed.&amp;#160; ITunes playlists are a proprietary format, and not compatible with Windows Media Server.&amp;#160; So don’t promise your wife that this is possible. &lt;/li&gt;    &lt;li&gt;If you want to stream music from your media server to your stereo, and you have a TV like mine, you may have to leave your TV on all the time while listening to music, and you’ll have to watch those seizure inducing graphics.&amp;#160; My TV doesn’t pass audio through when the TV isn’t on, and I haven’t yet invested in the XBox to component out audio connector. &lt;/li&gt;    &lt;li&gt;Your life will be more complicated with this setup.&amp;#160; Instead of just checking your queue on Netflix and seeing what’s on TV / your DVR, you’ll have to do the following:      &lt;ol&gt;       &lt;li&gt;Check your Netflix DVD queue &lt;/li&gt;        &lt;li&gt;Check your Netflix Instant Play Queue &lt;/li&gt;        &lt;li&gt;Check your PC to see what is on your DVR &lt;/li&gt;        &lt;li&gt;Copy the shows you don’t have time to watch now over to you media server so your PC doesn’t run out of space. &lt;/li&gt;        &lt;li&gt;Look through Hulu for stuff to watch &lt;/li&gt;        &lt;li&gt;See what you can watch on-line that can be streamed through the XBox.&amp;#160; Not everything can be.&amp;#160; To me, there’s a whole lot of collusion going on out there that is preventing the internet from being THE source of entertainment content, but the FTC is in the hip pocket of big business, and not going to do what is best for consumers, which would be to give everyone a choice of how to get their content.&amp;#160; My hope is that over time, more content will be integrated into PlayOn so that everything I want to watch is in one place. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;Be prepared for things to not work right the first time.&amp;#160; In fact, if you are doing this just to save money, forget it.&amp;#160; You won’t at least not right way, unless you already have most of this hardware. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;What’s really weird is that since we’ve started setting this up, I’ve barely had time to watch TV, and I haven’t really missed it. &lt;/p&gt;  &lt;p&gt;So what’s on the table for 2010?&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Add more disk to my Dell XPS.&amp;#160; Disk is cheap now, and if I added a couple of TB into it, it would go a long way to allowing my to record everything I want to. &lt;/li&gt;    &lt;li&gt;Add a second cable splitter into the line coming in to the Dell 410 so I can have both HD and analog feeds, and choose which format to watch / record. &lt;/li&gt;    &lt;li&gt;Clean up the directory structure on the Home Server to make things easier to find. &lt;/li&gt;    &lt;li&gt;Develop a Home TV guide for everything we might want to watch (how to get to it, restrictions, etc.) &lt;/li&gt;    &lt;li&gt;Figure out if I can access my Windows Media Center remotely to allow me to set up recordings while I am away. &lt;/li&gt;    &lt;li&gt;Test my backup strategy.&amp;#160; It’s a common saying that you don’t have true backups unless they have been tested. &lt;/li&gt;    &lt;li&gt;Replace the ACER 1420P.&amp;#160; We’ll see how long I can cope with this one. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Give me a few more weeks, and we’ll see if I get this all working just right, or get outsourced as the VP of technology in my own home.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8839833225275484627?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8839833225275484627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8839833225275484627&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8839833225275484627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8839833225275484627'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2010/01/evolution.html' title='Evolution'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-6233986814851878537</id><published>2009-12-23T10:03:00.001-08:00</published><updated>2009-12-23T10:03:17.771-08:00</updated><title type='text'>New Year’s Technical Resolutions – 2010</title><content type='html'>&lt;p&gt;I’m a goal oriented person.&amp;#160; Always have been.&amp;#160; I hear management really likes that in developers, and now that I am more management than developer, I know I like that in my developers.&amp;#160;&amp;#160; The key is to make sure that the developer and management have the same goals.&lt;/p&gt;  &lt;p&gt;To that end,&amp;#160; I’ve spent some time over the past few weeks looking forward to 2010 and planning the technology goals for the company for 2010, so that we can take those goals and make sure that they both mesh with the vision for the company’s growth in 2010, and with the career goals of the developers for 2010 and beyond.&lt;/p&gt;  &lt;p&gt;Personally, I want to maintain my technical edge over the next few years, to delay the inevitable full time move to management.&amp;#160; It’s not just my backup plan.&amp;#160; As an architect, I need to be able to see around the next corner.&amp;#160; I may not have to delve deep into how exactly JQuery Validators work, but I’d better at least be able to read JQuery and know what it’s capable of doing.&lt;/p&gt;  &lt;p&gt;To that end, here are my technical goals for 2010:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Visual Studio 2010 / TFS 2010 – I can’t wait for this release.&amp;#160; I believe this will have the single biggest impact of any technology on my day to day work life in 2010.&amp;#160; We have already identified major areas where our processes fall short, and hope that technology can help to address those issues.&lt;/li&gt;    &lt;li&gt;Entity Framework 4 – After spending the last two days debugging a large project written with EF 1.0, I really hope that this version justifies the immense amount of time we’ve invested into EF and fixes the many aspects of EF that I would currently give a score of' ‘WTF’ to.&lt;/li&gt;    &lt;li&gt;Azure – 2010 should be a huge year for Azure, with the full production release, and the stabilization of the environment.&amp;#160; As an early adopter, I’ve seen a lot of breaking changes smack me in the face every Thursday morning, and I’m hoping that the pace of these slow (stop would be nice) so I can begin to recommend this platform to my customers as a viable solution for their products.&amp;#160; I will also be doing deep dives into SQL Azure, the Service Bus, AppFabric and WIF as part of extending my Azure expertise&lt;/li&gt;    &lt;li&gt;SharePoint 2010 – I really liked what I saw at PDC, and we’re champing at the bit to get going.&lt;/li&gt;    &lt;li&gt;Windows Mobile 7 – I’ve never done mobile device work before, but I have high expectations of WM7.&amp;#160; I’ve actually had some great ideas for IPhone apps that’s I’ve had to discard because I have no access to a Mac to do the development, and the more I work with Apple products (and their inability to work with anything else), the more I despise them.&amp;#160; If WM7 delivers, I can see dropping my IPhone and going to a Windows based phone so I can actually work with it.&amp;#160; I’d have to pry my wife’s IPhone from her hands with a crowbar, but we’ll see what options come out before I even suggest it.&lt;/li&gt;    &lt;li&gt;RIA – I think this is a year away from being Prod ready, but there’s definitely power there, and something I want to play with in 2010&lt;/li&gt;    &lt;li&gt;WCF Data Services – Ditto above&lt;/li&gt;    &lt;li&gt;Learn JQuery - I was supposed to do that this year, didn’t make it.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;My technical reading list has been fairly vacant the last few months as I put the finishing touches on my novel “The Forgotten Road” and the sequel “Nowhere Home”.&amp;#160; But with the release of VS2010 coming up in the 2nd quarter of 2010, I expect that the list will fill back up.&amp;#160; Here are some of the titles I’m looking forward to reading:&lt;/p&gt;  &lt;p&gt;&lt;a title="Introducing .NET 4.0- with Visual Studio 2010" href="http://www.amazon.com/gp/product/images/143022455X/sr=8-2/qid=1261590065/ref=dp_image_0?ie=UTF8&amp;amp;n=283155&amp;amp;s=books&amp;amp;qid=1261590065&amp;amp;sr=8-2"&gt;Introducing .NET 4.0- with Visual Studio 2010&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Pro C# 2010 and the .NET 4.0 Platform, Fifth Edition" href="http://www.amazon.com/gp/product/images/1430225491/ref=dp_image_z_0?ie=UTF8&amp;amp;n=283155&amp;amp;s=books"&gt;Pro C# 2010 and the .NET 4.0 Platform, Fifth Edition&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Pro ASP.NET 4.0 in C# 2010, Fourth Edition" href="http://www.amazon.com/gp/product/images/1430225297/ref=dp_image_z_0?ie=UTF8&amp;amp;n=283155&amp;amp;s=books"&gt;Pro ASP.NET 4.0 in C# 2010, Fourth Edition&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Professional Application Lifecycle Management with Visual Studio 2010" href="http://www.amazon.com/gp/product/images/0470484268/sr=8-8/qid=1261590065/ref=dp_image_0?ie=UTF8&amp;amp;n=283155&amp;amp;s=books&amp;amp;qid=1261590065&amp;amp;sr=8-8"&gt;Professional Application Lifecycle Management with Visual Studio 2010&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="SharePoint 2010 as a Development Platform" href="http://www.amazon.com/gp/product/images/1430227060/sr=8-1/qid=1261590455/ref=dp_image_z_0?ie=UTF8&amp;amp;n=283155&amp;amp;s=books&amp;amp;qid=1261590455&amp;amp;sr=8-1"&gt;SharePoint 2010 as a Development Platform&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Pro SharePoint 2010 Solution Development- Combining .NET, SharePoint, and Office" href="http://www.amazon.com/gp/product/images/1430227818/sr=8-3/qid=1261590455/ref=dp_image_z_0?ie=UTF8&amp;amp;n=283155&amp;amp;s=books&amp;amp;qid=1261590455&amp;amp;sr=8-3"&gt;Pro SharePoint 2010 Solution Development- Combining .NET, SharePoint, and Office&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I should also be able to blog more often.&amp;#160; Most of the NDA’s I’ve been working under will expire with the production release of Azure, so hopefully I will have topics to write about that are both timely and interesting. &lt;/p&gt;  &lt;p&gt;Happy Holidays!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-6233986814851878537?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/6233986814851878537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=6233986814851878537&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6233986814851878537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6233986814851878537'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/12/new-years-technical-resolutions-2010.html' title='New Year’s Technical Resolutions – 2010'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-4430253417735974149</id><published>2009-12-15T11:42:00.000-08:00</published><updated>2009-12-15T11:54:15.902-08:00</updated><title type='text'>ACER 1420P - Another Review</title><content type='html'>After using this PC for a few weeks now, I have the following thoughts.&lt;br /&gt;&lt;br /&gt;1.  The screen is so freakin glare prone that it's almost unusable while commuting with overhead flourescent lights on the train.  I mean, you eventually get used to it, but it's like a railroad spike being slowly driven through your brain.  You can't find a position for the screen where the view is still good, and the lights aren't right in your eyes.&lt;br /&gt;&lt;br /&gt;2.  I really dislike the keyboard.  I'm not the greatest typist in the world, and the sharp edges on the keys really catch my fingers and make bad typing worse.  Combine that with the really small cursor keys in the right hand lower corner, and navigating a long Word document is pretty painful.&lt;br /&gt;&lt;br /&gt;3.  I still get occasional character repetitions for no apparent reason, despite having turned down the character repeat speed in the configuration significantly, to the point where if you are using the aforementioned cursor keys, you have to wait almost a second for them to repeat, and by then, you've gone past where you wanted to go.&lt;br /&gt;&lt;br /&gt;4.  On the plus side, I love the weight and the battery life.  Definitely better than my Toshiba U405.&lt;br /&gt;&lt;br /&gt;5.  I haven't tried to make use of any of the advanced features of the system, partially because I don't want to spend any more time staring at that screen than I absolutely have to.&lt;br /&gt;&lt;br /&gt;Based on the monitor, and the keyboard, and the fact that I never use the Touch screen, I would never buy this machine for myself or my family, and really miss my Toshiba, though I would probably buy the Toshiba T-135 if given a do-over.  Maybe in the new year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-4430253417735974149?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/4430253417735974149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=4430253417735974149&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4430253417735974149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4430253417735974149'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/12/acer-1420p-another-review.html' title='ACER 1420P - Another Review'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5757059017777832753</id><published>2009-11-22T16:14:00.000-08:00</published><updated>2009-11-22T16:45:13.099-08:00</updated><title type='text'>Acer 1420P Review</title><content type='html'>Fully paid attendees of Microsoft PDC recevied a rather neat little treat: a new Acer 1420P Laptop.  I've been playing with it for a couple of days, and while I haven't fully experienced the entire capabilities, I have seen the basics.&lt;br /&gt;&lt;br /&gt;The battery lasts forever.  I've been synching my ITunes from my current Toshiba U405-2854, and I've had the Acer unpluggeed most of the day, but had to put the Toshiba on the grid after an hour and a half of use.&lt;br /&gt;&lt;br /&gt;This laptop is light.  I'd almost say too light.  At least the base is too light to support the display once the angle of the display to the verticle exceeds about 15 degrees, at which point the laptop flips over.  The hinge on the screen is a little weak as well, and once past 25 degrees to vertical, the display slowly falls to horizontal.&lt;br /&gt;&lt;br /&gt;The keyboard is really different from my Toshiba.  Not necessarily a bad thing, but I write novels, and I'm a bad typist.  So every adjustment in key position is a double whammy.  The keys are more comfortable for me now than I first thought they would be.  They are a lot rougher in feel than the Toshiba, but a lot of people like that.  Maybe I will too after a while.&lt;br /&gt;&lt;br /&gt;I haven't done any performance tests yet, so I can't give stats on that.&lt;br /&gt;&lt;br /&gt;It took me half a day to figure out how to disable the Tap to Click feature on the touchpad.  It turns out that the version of the Synaptics drivers shipped with the unit are not up to date, and that by upgrading to the current version, you can get the option to turn it off.  I sent this question to ACER support before I figured it out myself, but they were completely useless didn't read the question, and answered something I didn't ask).  I also had a problem with my keys repeating while typing, and spent a few minutes changing the settings on the keyboard so I could type without every letter repeating twice.&lt;br /&gt;&lt;br /&gt;They've done a nice job keeping the bottom of the laptop cool while working.  I'm wearing shorts right now, and while it's a little warm, it's a little better than the Toshiba, and a heck of a lot better than the old Dell my wife has been using.&lt;br /&gt;&lt;br /&gt;The screen is crisp and clear, so no issues there.&lt;br /&gt;&lt;br /&gt;I'm definitely going to pop a couple more GB of memory into it so I can run my usual suite of work apps. &lt;br /&gt;&lt;br /&gt;I think this is a keeper.  Would I have bought it for myself?  Probably not.  I never had ambitions to have a tablet PC.  It'll be interesting to see if I use it for what Microsoft intended.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5757059017777832753?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5757059017777832753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5757059017777832753&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5757059017777832753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5757059017777832753'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/11/acer-1420p-review.html' title='Acer 1420P Review'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-3025165977940931998</id><published>2009-11-20T09:32:00.001-08:00</published><updated>2009-11-20T09:32:22.768-08:00</updated><title type='text'>PDC Day 4</title><content type='html'>&lt;p&gt;Day4 was all about hitting as many sessions as possible.&amp;#160; It was also all about trying to keep the brain from entering a totally cramped state.&lt;/p&gt;  &lt;p&gt;I’ve spent a lot of time in the last year working on Windows Azure.&amp;#160; The one thing I haven’t gotten to use was the Service Bus.&amp;#160; The Building Hybrid Cloud Applications with Windows Azure and the Service Bus session was a great introduction to practical usage of the service bus, and I couldn’t help but to try to come up with ways to integrate it into my clients’ applications.&amp;#160; However cool it is, it still has a huge dependency on ACS for security, and as I said yesterday, ACS isn’t quite ready for prime time.&amp;#160; It’s pretty apparent that ACS has to be the focus of Azure development over the next few months.&amp;#160; The coolest thing was the multicast of errors from one client to another.&amp;#160; Spectacular solution to a problem I face today and was going to resolve with an RSS feed, but hadn’t yet due to security issues.&lt;/p&gt;  &lt;p&gt;Next, I sat in on a Lap around Microsoft Visual Studio and Team Foundation Server 2010.&amp;#160; I loved the new features for burn down charts and hierarchical tasks.&amp;#160; We built in the iteration date functionality into our TFS by altering the database and building web sites to show us our statuses, but VS2010 is obviously a lot more complete.&amp;#160; We’re going to have a hard time waiting to use it in production right now.&lt;/p&gt;  &lt;p&gt;I watched Brad Abram’s excellent presentation on RIA services next.&amp;#160; I had intentionally avoided learning anything about RIA services this year until that moment, so everything was completely new to me.&amp;#160; It’s something that really shows promise, and I’ll want to try it out soon.&amp;#160; The main thing I want to make sure is that we maintain the separation of layers, and the close binding between the UI and the models is a little disconcerting.&amp;#160; We’ve been down that road before, and it always comes back around to bite us.&amp;#160; I hate to say this, because I really have only seen RIA for that one hour, but I couldn’t help but thinking I was being Visual Basic’d.&amp;#160; Not that the code was written in VB.&amp;#160; It just seemed VBish.&amp;#160; Too much power that leads to bad design.&amp;#160; I hope my first reaction was just fear of being replaced by code automation.&lt;/p&gt;  &lt;p&gt;I missed the lunch session I wanted to go to on Microsoft Visual C# IDE Tips and Tricks, but will definitely watch that video.&amp;#160; I heard it was packed.&amp;#160; Instead, I talked to the Visual Studio Team and talked through some TFS issues we’ve been having, and hopefully, we’ll be able to resolve them with their help.&lt;/p&gt;  &lt;p&gt;The most disappointing session of the conference was the Scrum in the Enterprise.&amp;#160; The first half was not bad and worth a watch.&amp;#160; The second half was mind numbing and I, along with a bunch of others, took an early leave.&amp;#160; I spent a little time in the Application Server Extensibility session, but honestly didn’t understand a thing that was said there.&lt;/p&gt;  &lt;p&gt;The final session of the day was Automating Done Done in the Team Workflows with Visual Studio Ultimate and TFS 2010.&amp;#160; Great session, definitely worth watching.&amp;#160; When they had a little problem with the demo, I couldn’t help but to suggest that the problem might be connected to the VSMDI file.&amp;#160; That got quite a few laughs, and was told that they guaranteed that the VSMDI file could not be the cause.&amp;#160; I think it’s finally dead.&lt;/p&gt;  &lt;p&gt;A quick shuttle trip to the airport, a quick (and half decent meal at LAX) and a lucky break to catch an early flight home meant I got into Seattle at 9:00 instead of 11:30.&amp;#160; Nice to be home.&lt;/p&gt;  &lt;p&gt;Overall, PDC was a great experience, and I hope to get to do it again, ideally with more of the senior folks from my company so we can cover more ground.&amp;#160; The guys up on stage were all pretty much top notch speakers, with one or two exceptions, and really show that they are some of the best and brightest in the world.&amp;#160; I don’t know I could ever do something like that.&amp;#160; &lt;/p&gt;  &lt;p&gt;I came out inspired to get back to learning.&amp;#160; I’ll be drawing up a technology target chart for myself and the company in the next few days, to set up goals for the coming year.&amp;#160; I’ve got a bunch more videos to watch, and side reading to do.&amp;#160; But first, I need to get some products finished and out the door before the end of the year.&lt;/p&gt;  &lt;p&gt;This blog entry was typed completely on my new ACER 1420P laptop courtesy of Microsoft.&amp;#160; Initial review?&amp;#160; Not bad.&amp;#160; Need to figure out how to turn of Tap to Click and how to slow down key repeating.&amp;#160; The laptop is light and probably needs a couple of GB’s of memory to make it useful at work.&amp;#160; Screen is nice and clear.&amp;#160; Windows 7 will take a little getting used to.&amp;#160; I’m not completely sold on the keyboard compared to my Toshiba Satellite, but I think I can get used to it, as long as I can turn off Tap To Click.&amp;#160; Otherwise, I’m giving it to my wife.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-3025165977940931998?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/3025165977940931998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=3025165977940931998&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3025165977940931998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3025165977940931998'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/11/pdc-day-4.html' title='PDC Day 4'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-7325234485481523657</id><published>2009-11-19T07:59:00.001-08:00</published><updated>2009-11-19T07:59:32.976-08:00</updated><title type='text'>PDC Day 3</title><content type='html'>&lt;p&gt;PDC Day 3 was kicked off with the keynote that began with a focus on how devs can use the new features in Windows 7 to maximize the use experience, and emphasized that devs need to learn new ways to code to take advantage of parallel processing and built in capabilities to shunt processing to video cards and other areas of the system.&amp;#160; A lot of this talk was above my head, but I guess that’s the point.&amp;#160; It can’t stay that way.&lt;/p&gt;  &lt;p&gt;Scott Guthrie launched Silverlight 4 BETA on stage, and though his demo had some technical issues, there was a collective gasp and cheer from the crowd during his demo of a built in capability of Silverlight to make a jig-saw puzzle of a video.&amp;#160; Pretty freaking amazing.&amp;#160; Scott Hanselman demoed new OData services and ties to SL4.&amp;#160; Simple demo, but there’s a lot there some programmers might take for granted that was really hard if not impossible just a few months ago.&lt;/p&gt;  &lt;p&gt;The last segment was on Sharepoint 2010 and Office 2010.&amp;#160; Truth be told, I almost walked out, since I was scarred for life by my brief experienced with Sharepoint 2003.&amp;#160; But I stayed, and was glad I did.&amp;#160; They’ve really gone back and fixed the Visual Studio integration and everything from debugging to deployments just works.&amp;#160; I’m ready to give Sharepoint another chance, and with a little work, I think I will soon consider it a viable platform for solutions for my clients.&lt;/p&gt;  &lt;p&gt;The first session of the day was on Windows Identity Foundation, formerly named Geneva.&amp;#160; I’ve spent a lot of time working in Geneva, but it was good to level my knowledge and get a refresher.&amp;#160; I don’t know how Vittorio will come across on video, but in person, he was fantastic.&amp;#160; &lt;/p&gt;  &lt;p&gt;I briefly sat in on a lunch session for ASP.NET MVC – Share Your Stories From the Trenches.&amp;#160; Good session with everyone putting their experiences out there.&amp;#160; I was pretty proud to know that our approach is pretty damn close to spot on, with one exception.&amp;#160; Never put an ‘if’ statement in a view.&amp;#160; Factor that out into your ViewModel.&amp;#160; If you have to put a null check in to determine whether or not to show something, add a bool to your view model and bind the isVisible property of the control or group to that.&amp;#160; Great advice.&lt;/p&gt;  &lt;p&gt;ADO.NET Data Service:&amp;#160; What’s new with the RESTful Data Services Framework.&amp;#160;&amp;#160;&amp;#160; First off, ADO.NET Data services has been renamed to WCF Data Services (Pablo pointed that out in his talk).&amp;#160; Pablo is a very fast talker, and covers a lot of ground very quickly.&amp;#160; He lost me at first by using JQuery to attach to a web service, but showed some very cool features out during the demo.&amp;#160; Be prepared to watch this a few times to see it all.&amp;#160; There’s one hell of a lot of power there, but it’s pretty intimidating.&lt;/p&gt;  &lt;p&gt;Enabling Single Sign On to Windows Applications:&amp;#160; This one moved fast, and even less than 24 hours after it, I can’t say I remember much.&amp;#160; But as soon as I have a project with an ADFS 2.0 server in place, I’m going to go back and watch this one again.&lt;/p&gt;  &lt;p&gt;Rest Services Security in Windows Azure using the Access Control Service:&amp;#160; Justin Smith is a very passionate speaker about this topic and a great guy.&amp;#160; Unfortunately, a lot has changed in ACS since last year, but it doesn’t look much more mature that it did a year ago.&amp;#160; They’re launching another CTP, which is understandable as the first one didn’t quite cut it.&amp;#160; There’s also a management change going on with ACS with the architect of WIF taking over the group.&amp;#160; I suspect that they’re 6-12 months out from a release that’s usable, which is also unfortunate, because this is a really critical piece of the puzzle.&lt;/p&gt;  &lt;p&gt;At Ask the Experts, I spent a lot of my time with the Azure Team.&amp;#160; Anu, Steve and Vikram are all great guys.&amp;#160; Anu remembered working on some of my bugs from the early days of the CTP, and we talked for quite a while.&amp;#160; &lt;/p&gt;  &lt;p&gt;What I find amazing is how accessible Microsoft has made all these guys this week.&amp;#160; I know that while I’m gone, the work doesn’t stop coming in, and I can’t imagine what they’ve got going on, yet they took the time to let me bring up my laptop to look at code to try to figure out a bug I’ve been working on for a few months.&amp;#160; &lt;/p&gt;  &lt;p&gt; Anyway, on to Day 4.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-7325234485481523657?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/7325234485481523657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=7325234485481523657&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7325234485481523657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7325234485481523657'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/11/pdc-day-3.html' title='PDC Day 3'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-1078395732867116189</id><published>2009-11-17T21:50:00.001-08:00</published><updated>2009-11-17T21:50:39.448-08:00</updated><title type='text'>PDC Day 2</title><content type='html'>&lt;p&gt;Highlights from Day 2 of PDC.&lt;/p&gt;  &lt;p&gt;The Keynote:&amp;#160; I got the feeling that this was less about new stuff this year than completing stuff from last year.&amp;#160; A lot of Azure announcements, and a little about server tools, but the message was clear.&amp;#160; Microsoft is banking on Azure for the next big thing server wise.&amp;#160; It released pricing model for bigger instances of Azure, and outlined the plan for supporting tools and infrastructure.&amp;#160; They also talked about Microsoft Pinpoint.&amp;#160; I expect to hear more about that in the coming weeks.&amp;#160; Project Dallas is also pretty cool.&lt;/p&gt;  &lt;p&gt;There were a couple of ‘aha’ moments for me:&amp;#160; System Center for Azure rocks, but won’t be available until a Beta sometime in 2010.&amp;#160;&amp;#160; The next version of Microsoft’s mobile platform won’t be available until Mix 2010.&amp;#160; They’re falling behind badly but I’ll give them credit for not knee jerking a half baked solution to production before it’s ready.&amp;#160; The other ‘aha’ was around he new data access technologies ODATA.&amp;#160; My catch phrase for ODATA… “There’s gold in them there hills.”&amp;#160; If you can only watch part of the keynote, catch the ODATA portion.&lt;/p&gt;  &lt;p&gt;After the keynote, I went into session overload, including:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Data Programming and Modeling for the .NET Developer.&amp;#160; &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;The most fun session of the day.&amp;#160; Don Box and Chris Anderson showed off a lot of the new functionality in EF 4.&amp;#160; As a guy who spends a great deal of my day working with EF 1, I’m very tempted to grab the bits for EF 4 now and push it to my clients.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Lessons Learned:&amp;#160; Migrating Applications to the Windows Azure Platform&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Didn’t learn a whole lot here that I either didn’t already know from my own experience with Demo Showcase, or from Chris Auld’s session yesterday.&amp;#160; In retrospect, I should have jumped to a different session.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Windows Azure Present and Future&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Pretty deep dive into the Azure story by Manuvir Das.&amp;#160; Gained some insight into where things are going, but again, I already knew much of it.&amp;#160; I wish I had gone to the Agile Session&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Evolving ADO.NET Entity Framework in Microsoft .NET Framework 4 and Beyond&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Awesome session.&amp;#160; Highly worth a rewatch to learn how to use some of the new functions.&amp;#160; Very, very fast pace.&amp;#160; These guys love their jobs.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Advanced Windows Presentation Foundation Application Performance Tuning and Analysis&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;I’m going to recommend this to our UI guys to help make the apps that incremental step better to make the difference between sent out and shipped.&amp;#160; &lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Quick stop at the Partner Expo.&amp;#160; Ran into Justin Smith.&amp;#160; Great guy who was really generous with his time back when we were getting ready to ship Demo Showcase and ran into a security issue.&amp;#160; Looking forward to his session later in the conference.&amp;#160; I watched a lot of his presentations from PDC08 when we were getting started with DSS, and I’m going to jokingly blame him and Steve Marx for getting me into this mess.&lt;/li&gt;    &lt;li&gt;Went to an INETA Meeting.&amp;#160; Informal, interesting round table.&amp;#160; Two themes emerged:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;a) People perceive that technology is changing faster than ever and that it is impossible to keep up. &lt;/li&gt;      &lt;li&gt;b) Microsoft is making a mistake targeting big business and highly variable sites with Azure.&lt;/li&gt;      &lt;li&gt;I disagree with both statements. &lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Technology always changes fast.&amp;#160; We’re just more aware that it is changing than we used to be.&amp;#160; We also need to know about more types of technologies than we used to because a lot of organizations are smaller and you have to know about more of them in order to do you job.&amp;#160; There’s less compartmentalization.&amp;#160; People who want to compartmentalize their work, and focus on just one thing, carve too small of a niche for themselves, and can’t find home in the do everything small companies.&lt;/li&gt;        &lt;li&gt;Azure is perfect for what Microsoft is asking it to do.&amp;#160; It is not perfect for what the individual devs want it to do.&amp;#160; They aren’t going to make money spinning up VM’s for &lt;a href="http://www.joebeernink.com"&gt;http://www.joebeernink.com&lt;/a&gt; unless they charge a lot more for it to make entry prohibitive for guys like me.&amp;#160; If I am willing to pay the price, I can get almost the same service the big boys do.&amp;#160; So once they start charging for it, I will move to GoDaddy or soemthing like that until I have enough business to justify the load (how long till I have that first book on the NYT Best Seller List?&amp;quot;)&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Scott Hanselmann had the best quote of the night, but I’ve seen it misquoted a few times on Twitter already.&amp;#160; He said that the greatest power an architect has is to break the build.&amp;#160; That is, to put controls in place like FXCop to prevent bad code from being checked in.&amp;#160; What’s being quoted is that the greatest power Jr. devs have is to break the build.&amp;#160; Jr. Devs should never break the build.&amp;#160; If they are truly junior, they should be mentored and guided into checking in code that never breaks the build.&amp;#160; If they are junior, but only due to seniority and not skill, then they need to gain the cred to add to the build process when needed.&amp;#160; If no one in the organization listens, and that situation won’t change, move on.&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Looking forward to tomorrow’s keynotes and a ridiculous number of sessions at 11:30 that I want to attend.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-1078395732867116189?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/1078395732867116189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=1078395732867116189&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1078395732867116189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1078395732867116189'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/11/pdc-day-2.html' title='PDC Day 2'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5883266150624257945</id><published>2009-11-16T18:13:00.001-08:00</published><updated>2009-11-16T18:13:28.255-08:00</updated><title type='text'>PDC Day 1 – Architecting &amp; Developing for the Windows Azure Platform</title><content type='html'>&lt;p&gt;Day One isn’t quite over yet.&amp;#160; Next up is a movie on the origins of Visual Studio.&amp;#160; I figure if I’m going geek this week, I'm going all in.&lt;/p&gt;  &lt;p&gt;Chris Auld from intergenz.com did a great presentation on all kinds of aspects to take into account when architecting Azure applications.&amp;#160; He paid special attention to economic factors and how they play in to decisions on what Azure Technologies to use, and hen to use them.&amp;#160; He’s got street cred because he’s built out a very large application on Azure for selling tickets for events.&lt;/p&gt;  &lt;p&gt;His blog is &lt;a href="http://www.syringe.net.nz"&gt;http://www.syringe.net.nz&lt;/a&gt; and he’s on twitter at &lt;a href="http://twitter.com/cauld"&gt;http://twitter.com/cauld&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;He’ll be posting his presentation deck later this week, and it’s well worth the read, especially for architects and technical management.&amp;#160; Some portions of the presentation would be good to walk sales teams who are trying to sell Azure as a platform through so they understand what the advantages and disadvantages are.&amp;#160; The presentation should also be on-line soon.&amp;#160; It’s long (an all day event isn’t going to be short).&lt;/p&gt;  &lt;p&gt;I still have some Azure questions I need to resolve, but many of those are specific to the areas I’m working on, so I didn’t ask them during question period.&amp;#160; Hopefully I can have some productive hallway conversations.&lt;/p&gt;  &lt;p&gt;On a side note (as I’ve already complained about this on twitter and Facebook)… Why do people put onions on everything?&amp;#160; I couldn’t find a single lunch option without onions today, and as someone with a food allergy to onions, it drives me crazy, because they never label things as containing onions.&amp;#160; Eggs, wheat, soy, milk, no problem.&amp;#160; Onions, we’ll just let you bit in before you figure it out. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5883266150624257945?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5883266150624257945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5883266150624257945&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5883266150624257945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5883266150624257945'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/11/pdc-day-1-architecting-developing-for.html' title='PDC Day 1 – Architecting &amp;amp; Developing for the Windows Azure Platform'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8831239368486522155</id><published>2009-08-03T20:11:00.001-07:00</published><updated>2009-08-03T20:11:40.099-07:00</updated><title type='text'>Demo Showcase Suite – A History – Part 9</title><content type='html'>&lt;p&gt;Continuing on my series recounting how we got going on Demo Showcase Suite&lt;/p&gt;  &lt;p&gt;7.&amp;#160; I wanted a reliable build and deployment process from the start&lt;/p&gt;  &lt;p&gt;Okay this is pretty basic, and something I’ve insisted on for each project I work on.&amp;#160; You can’t afford to build production software on a developer’s machine.&amp;#160; It’s a no brainer though I’ve seen it done many, many times.&amp;#160; What we did on this project, was to convert from using CruiseControl.NET to TFS Builds.&amp;#160; This was new for me.&amp;#160; Why would we do this you ask?&lt;/p&gt;  &lt;p&gt;First, we had converted from VSS to TFS.&amp;#160; I thought it would be better to be consistent and use the integrated tools we had.&amp;#160; Second, we were also having scaling problems with our current CruiseControl server, and we were going to need to upgrade it anyway.&amp;#160; So we made the leap to TFS with the plan to retire the CC.NET Server.&lt;/p&gt;  &lt;p&gt;The other thing converting to TFS did was to take me out of being the expert on the builds, and I was able to delegate learning about it, and doing the setup to someone else.&amp;#160; I didn’t have time to do it, and as long as we were using something that I had put together, the likelihood of me continuing to be ‘the build guy’ was too high.&amp;#160; My very first job when I started in IT in 1994 was managing the nightly builds and version control.&amp;#160; In the 14 years leading up to the start of the project, I was always the build guy.&amp;#160; Now, I’m not the build guy anymore.&amp;#160; &lt;/p&gt;  &lt;p&gt;We ran into some issues with deployments to Azure later when we tried to build on a 32 bit machine, so we had two build servers, a 32 bit machine for the client application and a 64 bit machine for the server apps.&amp;#160; This is probably not needed.&amp;#160; With a better understanding of configuration manager in Visual Studio, we probably could have everything working on just one, but we had so many problems with the vsmdi files that by the halfway point of the project, we were seriously considering other options.&amp;#160; Having a split build, and running the tests only in the Test build, not Prod and QA, helped a lot as well.&lt;/p&gt;  &lt;p&gt;As far as the deployment process went, we scripted everything to get as far down the Azure path as we could, but we still had to manually upload to Azure, deploy and swap. There were two of us who became the experts on this, and kept everyone else’s fingers out of the Azure pie, just to be safe.&lt;/p&gt;  &lt;p&gt;We spent a lot of time building the MSI for the client to have it do everything we wanted it to do.&amp;#160; A lot of what we learned we are able t0 apply to other projects right away, and though it took far more time to get it perfect than we wanted to spend, it sure is nice to have a process we just always trust.&lt;/p&gt;  &lt;p&gt;I’m feeling ambitious tonight (and wanting to get onto technical stuff sooner, rather than later), so I’ll cover #8 and #10 tonight.&amp;#160; #9, as it turns out, is a whole series unto itself.&lt;/p&gt;  &lt;p&gt;8) I wanted the team to be able to provide me with feedback quickly and easily and to give both myself and the PM a heads up well in advance of a red flag issue becoming critical.&amp;#160; No surprises. &lt;/p&gt;  &lt;p&gt;I think I’ve covered this already, but this was all about communication.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;We implemented the scrums, as previously talked about.&amp;#160; &lt;/li&gt;    &lt;li&gt;We used task tracking in TFS to flag blocked items.&lt;/li&gt;    &lt;li&gt;When someone is worked up about something, we dug in and broke the task down so I could see and understand what the problem was.&amp;#160; Don’t let people stew, whether it be a technical issue or a personal one.&amp;#160; Get it out in the open and deal with it.&lt;/li&gt;    &lt;li&gt;We had whiteboards in the middle of the work areas.&amp;#160; If there was a major issue, we grabbed people and whiteboarded it out with input from everyone. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I think we did really well in this one.&amp;#160; There were almost no surprises from within the team, and the few that were came from me not listening carefully enough when tasks were starting to slide in the early days of the project.&amp;#160; I learned to listen for the signs that trouble was brewing, and made an effort to head it off earlier.&lt;/p&gt;  &lt;p&gt;10)&amp;#160; I wanted to enrich my technical knowledge base.&lt;/p&gt;  &lt;p&gt;I had no idea how much I would learn on this project.&amp;#160;&amp;#160; I still can’t believe how much I was working on that almost no one else in the world was doing.&amp;#160; When it came to doing the first part of the security system, I think there were two or three of us on the MSDN Forums bouncing ideas back and forth.&amp;#160; Dependency Injection, Rhino Mocks, WPF MVVM.&amp;#160; I learned so much in the first few months, I thought I was going to drown.&lt;/p&gt;  &lt;p&gt;For the record, I am not going to claim, as I begin writing about the technical aspects of the project, to be the expert in any one area.&amp;#160; I am sure (absolutely positive, actually), that for each area I will get into, that there are a dozen people, if not a thousand, who know more.&amp;#160; I’m just going to show you what we did, for better or worse.&amp;#160; Some will laugh and point and snicker at some of the code.&amp;#160; Hopefully I can get some feedback on better ways to do things.&amp;#160; Hopefully someone out there getting started on Azure or MVVM or Silverlight or Demo Showcase will get some information that saves them some time or money.&lt;/p&gt;  &lt;p&gt;If you have a specific area of the Demo Showcase architecture you want to hear about, let me know, and I’ll try to cover it in an upcoming entry.&amp;#160; If you have a question about how to do something in Demo Showcase, or have a suggestion for a new feature, send it in.&amp;#160; I’ll get it on the list. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8831239368486522155?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8831239368486522155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8831239368486522155&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8831239368486522155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8831239368486522155'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/08/demo-showcase-suite-history-part-9.html' title='Demo Showcase Suite – A History – Part 9'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-756169071205667627</id><published>2009-08-02T21:22:00.001-07:00</published><updated>2009-08-09T06:48:52.068-07:00</updated><title type='text'>Comparing Crafts</title><content type='html'>&lt;p&gt;I’m going to take a brief diversion from my series on Demo Showcase to discuss a parallel I found this weekend between developing software, and writing.  As you can probably tell by the length of the entries on this site, that I love to write.  I love it so much, that I have a web site completely devoted to my writing at &lt;a href="http://www.joebeernink.com/"&gt;www.joebeernink.com&lt;/a&gt;.  I write novels.  I write short stories.  Hell, I like writing specs.  But I also like to code.  I like to dig into new technology.  I like to solve hard problems.  I thrive when faced with tough challenges.  But back to the writing.&lt;/p&gt;&lt;p&gt;This weekend, I attended the Pacific Northwest Writer’s Association Conference new Seattle.  This is a four day writer’s version of NerdDinner.  Instead of hanging with Scott Guthrie and Scott Hanselman, I got to hang with Terry Brooks, Robert Dugoni, Will North, Joseph Finder, Richelle Mead, Caitlin Kittredge, and a thousand other writers and aspiring writers.&lt;/p&gt;&lt;p&gt;People talk often about the craft of writing software, and I think that has obvious connections to the craft of writing.  Writing crappy software is easy.  Writing crappy stories is easy.  Writing good software takes education, practice, persistence, self discipline, structure and patterns, research.   Writing is exactly the same.  &lt;/p&gt;&lt;p&gt;You need to be skilled at the language you are writing, and know the vocabulary.  Writing a great novel doesn’t happen on the first try.  Just because you have spoken English your whole life doesn’t mean that a good novel will result when you put pen to paper, or fingers to the keyboard.  &lt;/p&gt;&lt;p&gt;You have to keep writing, even when people give you negative feedback.  If we all stopped writing code every time a user found a bug, or the compilation failed, or took it personally, we’d never get better at it.  &lt;/p&gt;&lt;p&gt;You need self discipline to always strive to learn, to read that dull book on ASP.NET MVC, even though you think you already know ASP.NET.  I mean, nothing will ever make VB 6 outdated… right?&lt;/p&gt;&lt;p&gt;You need to understand the structure of a good story, and the structure of a good piece of software.  There are patterns and practices that have evolved, and yes, you may find another way to do something, and it doesn’t mean you are wrong, but there are some things that are just not worth reinventing.  At least know what options are out there, and use the power that’s in them until you find a need to diverge.  This isn’t meant to stifle progress.  It simply means that not every piece of software is going to be a unique and brilliant creation.  We get paid to turn out software that works.  Novelists get paid to turn out writing that sells.  If you don’t want anyone to read your book or use your software, go crazy.&lt;/p&gt;&lt;p&gt;Research the stuff that interests you.  Read code from similar programs.  Novelists need to read other authors from within their genres, not to copy, but to learn.  Know what that code does before you copy and paste.  Understand why it works.  Find the patterns in plots of great novels.  What tools does the author use?&lt;/p&gt;&lt;p&gt;None of these are spectacular revelations, or at least they shouldn’t be.  But something hit me, a parallel between my career as a writer and my career as a software developer.&lt;/p&gt;&lt;p&gt;I started programming computers on a Commodore 64 in 1982-83.  I was 11 I think.  Actually, I had programmed on a PET CBM prior to that, but the C-64 really got me started.  I took programming courses in high school and college, did an internship in college, and spent the years 1994-2007 working in the field taking a few courses here and there, picking up a book when I needed to, but never really taking charge of my career.  But at the end of 2007, I realized my career was at a dead end.  I had let my technical knowledge stagnate, and was blaming everyone else for my lack of opportunities.  I made the leap from IT department at a large airline to a small consulting firm at the start of 2008, and vowed that I would spend a minimum of 3 months reading everything I could, as fast as I could, about the technology I was going to be working in, to get better,  I wasn’t going to take courses, or expect someone to teach me.  &lt;/p&gt;&lt;p&gt;I read on the train.  I read at night until I couldn’t keep my eyes open.  I read on the weekends.  At the end of the three months, I realized that I had learned a lot, and had a lot more to learn.  I filled up my wish list on Amazon with all books on every area of software development that I wanted to learn.  I got a subscription to MSDN Magazine.  I read the articles, instead of skimming them.  I added dozens of blogs to my RSS feed.  I read whatever I could there.  I gradually brought my skills up to the point where I felt that I could talk intelligently about software development again.&lt;/p&gt;&lt;p&gt;Similarly, I started writing stories in grade school.  I wrote them freehand until I had a Quick-Brown-Fox word processor for my C-64.  Then I typed them out and printed them on my MPS 801 printer.  I took a lot of English  classes in high school.  My schedule was too full to take classes in college, but I did write my first novel while there.  I loved writing for the escape it provided from the pressure of my classes.  I wrote a bit after college, but it was in fits and starts.  At one point, I stopped altogether, until August of 2008.  That’s when I got the laptop I am typing this on (a Toshiba U405-S2854 which I love).    &lt;/p&gt;&lt;p&gt;I started writing a new novel on August 8th, and finished the first draft on January 1, 2009.  But I missed something.  I thought that writing was something I could just jump back into, and do without reading technical books on how to.  I didn’t bother to figure out what genre I was working in.  That has huge implications on what rules you need to follow.  I didn’t bother to read other authors in my genre to see what was working.  I didn’t practice my craft and look for feedback.  I just assumed I was good, and smart, and that this writing thing wasn’t that hard.&lt;/p&gt;&lt;p&gt;This weekend was an eye opener for me.  The successful authors study their craft.  They practice, sometimes for more than a decade, before they get something published.  They treat their hobby like a business.  They are the CEO’s of their own corporation.  They get feedback from their customers.  They manage their brand.  They work their asses off.  You could see those in the audience that weren’t prepared to do that.  They blamed agents and editors for their work not getting sold, or argued with the agents and editors about the quality of their work.  For a new writer, that’s like arguing with the C# compiler that it should know what you meant, not what you entered.  The compiler will be right 99.9999% of the time.  If you go to three different machines, and the problem is repeatable each time, it’s your problem.  If three agents tell you your writing sucks, it’s your problem.  Fix it.&lt;/p&gt;&lt;p&gt;So why am I writing about this on a tech blog?  It’s because it took me 13 years of my software career to realized that no one is going to make me a better coder / architect but me.  It took me a year of writing, and a brutal slam from an agent to realize that I need to work as hard at writing as I did at improving my tech skills.  And that takes time, and a plan.  I filled up my shopping cart at Amazon last night with great books on writing, and expect to spend the time between now and Christmas reading those, and using the lessons I learn from them to improve my writing.  &lt;/p&gt;&lt;p&gt;Where does that put my technical career?  Right where it was.  I just need to do both.  To find more hours in the day.  To work smarter.  To learn the lessons I’ve been talking about in all these other blog entries so that on the next project, I don’t spend days regression testing manually.  To do it right the first time.  There’s just so much to do and learn out there, why screw around reinventing the wheel?  Hopefully, after reading these entries, I help you to save time you could better use to bring your skills up to date, to create that vicious, incredible cycle of learning and doing things better and faster to give you the success and the time to do the other things in you life that mean something to you.&lt;/p&gt;&lt;p&gt;Good luck!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-756169071205667627?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/756169071205667627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=756169071205667627&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/756169071205667627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/756169071205667627'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/08/comparing-crafts.html' title='Comparing Crafts'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8213950645480298576</id><published>2009-07-30T10:35:00.001-07:00</published><updated>2009-07-30T10:35:44.497-07:00</updated><title type='text'>Demo Showcase Suite – A History – Part 8</title><content type='html'>&lt;p&gt;Goal #6:&amp;#160; I wanted to plan for change, in scope, in the composition of the development team, in technology and in time lines.&lt;/p&gt;  &lt;p&gt;Change on a project is inevitable.&amp;#160; Even on short projects of a couple of weeks, there will always be a small change that causes some consternation amongst the team.&amp;#160; I was conscious of four types of change:&lt;/p&gt;  &lt;p&gt;1.&amp;#160; Scope.&amp;#160; &lt;/p&gt;  &lt;p&gt;Everyone has dealt with this one.&amp;#160; You can’t fight it.&amp;#160; The best way to deal with it is to track it, to have good processes for handling it, and for providing feedback to management and the customer as to how each change in scope will affect the project.&lt;/p&gt;  &lt;p&gt;Prior to the start of this project, our change tracking was minimal, if nonexistent.&amp;#160; We used a web product called Gemini for tracking bugs and some feature requests for existing projects, but we didn’t track deliverables and tasks for new projects getting started.&amp;#160; We used VSS (horror of horrors) for our source control.&amp;#160; It was quite clear that as an organization, we were outgrowing these tools.&amp;#160; &lt;/p&gt;  &lt;p&gt;We made the decision to try something else as soon as the project was announced.&amp;#160; We had access to Team Foundation Server and Visual Studio Team System Team Suite without needing to spend a bunch of money, so we used that.&amp;#160; It was a big step forward from VSS, and it took quite a while to get up to speed on how to use it, and how to use it properly.&amp;#160; There were definitely some very painful moments, and we’ll all be glad when we can upgrade to TFS 2010 to get things like hierarchical task trees and better integrated reports.&amp;#160; We went back and forth on the best way to use the system, and I think, at the end, we were doing the best we could, though there are more features that we can probably gradually integrate into future projects to make us more efficient.&amp;#160; We didn’t take advantage of&amp;#160; the Estimate / Actual / Work Completed feature, and that is the one thing I would really like to change on the next project, to not just get a picture of how many tasks are outstanding, but how we are tracking effort to the goals.&amp;#160; It would also greatly improve our ability to provide feedback to everyone when a scope change comes in to see how it really affects the project time line.&amp;#160; Right now a ten minute bug fix carries the same weight as a 40 hour feature implementation on the task list, and that is obviously misleading and wrong.&lt;/p&gt;  &lt;p&gt;2.&amp;#160; Team Composition&lt;/p&gt;  &lt;p&gt;We only had one change in the team in terms of losing someone from the team from beginning to the end of the project, but we did gain two new people as well.&amp;#160; On a small team, it’s essential that in one person’s absence or departure, that another can step in and fill that role, or at least be able to understand what that person was working on so the work does not come to a grinding halt.&amp;#160; The only way I know how to do this is for everyone to be doing things the same way.&amp;#160; If everyone uses the same tools, writes code to the same standards, there’s a lot less chance that code will be a mess when someone turns it over.&amp;#160; I harped a lot to the team about a couple of things in particular&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;a)&amp;#160; Everyone had Resharper and was expected to make that little light at the top of the file go green every day.&amp;#160; Okay, part of this is due to the fact that I am anal-retentive when it comes to clean code, but part of it is a matter of enforcing standards.&amp;#160; I can’t sit over every developer’s shoulder and watch them name their variables, and set their tabs.&amp;#160; But Resharper, and the lovely Ctrl K D really left us with some pretty clean code.&amp;#160; It’s amazing how much easier it is to work on someone else’s code when you are not scared to open the file.&lt;/p&gt;    &lt;p&gt;b) Nightly Builds:&amp;#160; We used TFS to do our nightly builds, right from the start, and constant check ins were encouraged.&amp;#160; Everyone feared the words ‘Who Broke the Build?&amp;#160; UNACCEPTABLE!” being shouted across the office.&lt;/p&gt;    &lt;p&gt;c) Unit Tests:&amp;#160; As previously discussed, we could have done much better here, and we are working on making this better for the next phase.&lt;/p&gt;    &lt;p&gt;d) Unity:&amp;#160; We used the Unity Application Block for dependency injection (DI).&amp;#160; I’ll go into more of the Unity overview in a later post, but because we had Unity set up early in the project, we were able to create mock objects and able to swap code in and out easily so that itwo people were rarely dependent on one another’s work.&amp;#160; This was especially important prior to bringing on the new people to fill a void in some of the back end code areas so that UI development could proceed until they were up to speed.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I also spent some time creating a ‘Technical Overview’ document that summarized some of the technical decisions we made early in the project, some of the issues that were left to be resolved, and a quick reference for some of the more complex processes we were using.&amp;#160; I don’t know how much this helped the new guys, but it made me feel better that I had at least tried to help them come up to speed without them needing to spend a week constantly asking questions we should have documented.&lt;/p&gt;  &lt;p&gt;When I started my first IT job back in 1994, my boss gave me ownership of the New Employee Orientation / Standards book, and told me to update it when I found a question it didn’t answer, as I would be handing the book off to the next new person, who would then come to me first to ask questions.&amp;#160; I love this chaining of documentation pattern.&amp;#160; It gives the new people immediate ownership and responsibility.&amp;#160; Of course, some people weren’t as robust in their documentation as others were, but if we held true to the pattern, everyone would see the benefit of keeping the document up to date.&amp;#160; It made sense back then, anyway.&lt;/p&gt;  &lt;p&gt;3.&amp;#160; Technology&lt;/p&gt;  &lt;p&gt;We knew the technology was going to change, and change rapidly during this project.&amp;#160; Managing this change was a constant challenge.&amp;#160; Again, Unity and DI played a large role in helping to resolve this issue.&amp;#160; There were many times where we had issues with Azure, or did not know where the data would actually reside at the end of the project, but that didn’t stop the developers from continuing their work.&amp;#160; We built interfaces and mocks, and swapped the managers in and out using the configuration files.&amp;#160; &lt;/p&gt;  &lt;p&gt;During most of the project, there were only two of us who ever touched Azure, just to insulate the team from the environmental changes.&amp;#160; We defined the processes and worked through the issues, but the rest of the team barreled forward, not needing to know the specifics of how the system would work on Azure.&amp;#160; This was true for deployments, data storage, security and configuration.&amp;#160; Almost everything we built could run directly in IIS7 or in the dev environment without Azure being available.&amp;#160; Pieces were converted over to run on Azure one at a time as they were ready with a few configuration changes.&amp;#160; I can’t emphasize enough how important this is when working with dependencies that are constantly changing.&amp;#160; Isolate them, mock them, keep the team moving.&lt;/p&gt;  &lt;p&gt;4.&amp;#160; Time Lines&lt;/p&gt;  &lt;p&gt;The final date was not moving, but that didn’t mean that there wouldn’t suddenly be a need to give a quick demo of what we had to the customer in the middle of a big dev cycle.&amp;#160; The builds saved us there, and having two (I would have preferred 3) environments to run the app in from early in the project allowed the devs to keep working, while the ‘PROD’ site was only updated as we achieved more stable releases.&amp;#160; Having the multiple environments saved our bacon more than a few times.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8213950645480298576?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8213950645480298576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8213950645480298576&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8213950645480298576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8213950645480298576'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/07/demo-showcase-suite-history-part-8.html' title='Demo Showcase Suite – A History – Part 8'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5648780498297984977</id><published>2009-07-29T11:33:00.001-07:00</published><updated>2009-07-29T11:33:25.881-07:00</updated><title type='text'>Demo Showcase Suite – A History – Part 7</title><content type='html'>&lt;p&gt;This is the next in the series of entries about Demo Showcase Suite and the goals I wanted to accomplish.&lt;/p&gt;  &lt;p&gt;5.&amp;#160; I wanted the team to feel the urgency of working hard &lt;strong&gt;and smart&lt;/strong&gt; early in the project to avoid the death march mindset at the end&lt;/p&gt;  &lt;p&gt;Here were the things we knew, right at the start of the project:&lt;/p&gt;  &lt;p&gt;a)&amp;#160; The deadline was July 13th.&amp;#160; It was not moving.&amp;#160; No matter how many times I wished we had a few more months, weeks, days (or even hours), we were launching during the keynote on opening day of WPC.&lt;/p&gt;  &lt;p&gt;b)&amp;#160; We had huge technological hurdles to overcome on areas we had never seen before.&lt;/p&gt;  &lt;p&gt;c)&amp;#160; The customer wanted frequent updates on the work, samples of what we were doing.&lt;/p&gt;  &lt;p&gt;To cope with all of this, we implemented some project management processes&lt;/p&gt;  &lt;p&gt;1)&amp;#160; We broke the project into 3 week sprints.&amp;#160; This was our first time doing this, and I think we took the word sprint a little too seriously.&amp;#160; We were always up against a deadline of some sort, but that was driven by the final, immovable deadline.&amp;#160; When we saw our iterations slipping, we weren’t able to slide requirements to follow-on releases, but we did see that we were behind, and worked harder earlier in the project to get back on track.&amp;#160; We also were able to keep the developers focused on the important features instead of getting wrapped around the axle on something that wasn’t supposed to be started for a couple of months.&lt;/p&gt;  &lt;p&gt;Iterations worked for us as well, as we were able to better manage the customer expectations for the functions they would see in the next release.&amp;#160; They knew what to expect, and knew what not to expect.&amp;#160; That went a long way in keeping down the surprises for both parties.&lt;/p&gt;  &lt;p&gt;In the end, we did one ‘Alpha’ release, two ‘Beta’ releases, and 3 ‘RTM’ releases.&amp;#160; In retrospect, we should have called them Alpha 1, Alpha 2, Beta 1, Beta 2, Beta 3 and RTM 1 to properly set everyone’s expectations not just to the functionality, but to the quality, but that’s a lesson we learned the hard way.&lt;/p&gt;  &lt;p&gt;2) We held a team scrum every day at 1:00 PM.&amp;#160; We tried to keep this to 15 minutes a day, and I, as scrum master, tried to keep the team focused on three things:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;i)&amp;#160; What did you complete since the last scrum – Just a list, not a detailed dissertation.&amp;#160; This helped everyone else know what was ready to test, or what dependency they had been waiting on was now complete.&lt;/p&gt;    &lt;p&gt;ii)&amp;#160; What are you working on between now and the next scrum&amp;#160; - Just a list.&amp;#160; If this was the same list you provided the day before, we hadn’t broken the tasks down far enough.&amp;#160; If that continued for more than a few days in a row, it was time to take it off line, break down the tasks some more, and add resources if needed.&lt;/p&gt;    &lt;p&gt;iii)&amp;#160; What red flags are still outstanding that are keeping you from completing your work – Details as needed, especially if the task was taking much longer than expected or progress could not be made without more help&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We tracked all of the tasks in TFS, though not as consistently as I would have liked, and added details / blocked status as needed.&lt;/p&gt;  &lt;p&gt;At the end of the scrum, I stepped in to try to work any red flag issues to get the tasks back to green flag with each developer.&lt;/p&gt;  &lt;p&gt;I’m a morning, person, and do my most effective work early in the day, so holding the scrum later in the day enabled me to break my day into two pieces.&amp;#160; Some days, some of the red flag issues carried over to the next morning, but usually, I was able to focus on the big picture tasks that were assigned to me in the morning.&amp;#160; The afternoon was spent solving problems, to keep the developers moving.&amp;#160; It stopped a lot of wheel spinning (I’d like to think) and made sure no one was stuck on an island.&lt;/p&gt;  &lt;p&gt;Having the daily scrums gave me, and the rest of the team, constant feedback on how we were doing to meet our next milestone, and how much effort we needed to drive into the current iteration that week to get it done.&amp;#160; Sometimes that meant a weekend in February or March was spent in the office trying to clear up the backlog.&amp;#160; But we knew we couldn’t grow the schedule, so it was better then, than to wait till the last minute when other problems would undoubtedly arise.&lt;/p&gt;  &lt;p&gt;I know for absolute certainty that without these two processes, we could not have been successful.&amp;#160; I also know that far more ‘project management’ time was charged to this project than was planned because of these scrums, but we probably saved just as much dev time by stopping the wheel spinning, and allowing me to focus on my tasks in the morning without constant interruptions.&amp;#160; With a team of more than two developers on a project, I would absolutely do this again.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5648780498297984977?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5648780498297984977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5648780498297984977&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5648780498297984977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5648780498297984977'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/07/demo-showcase-suite-history-part-7.html' title='Demo Showcase Suite – A History – Part 7'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-611141765897844707</id><published>2009-07-28T15:37:00.001-07:00</published><updated>2009-07-28T15:37:13.908-07:00</updated><title type='text'>Demo Showcase Suite – A History – Part 6</title><content type='html'>&lt;p&gt;Honestly, I’m trying to do these once a day, but I took 3 days off for a vacation, and it’s taken me a couple of days to get caught back up.&amp;#160; Here’s the next installment on my series of goals that I had when we stated on Demo Showcase.&lt;/p&gt;  &lt;p&gt;4. I didn’t want to get to a week from the delivery date, need to make a change, and have to regression test everything by hand.&lt;/p&gt;  &lt;p&gt;As I write these entries, what I thought were distinct topics, all seem to be related.&amp;#160; This is talking about unit testing, right?&amp;#160; No.&amp;#160; Wrong. Different topic altogether.&amp;#160; Application regression testing has always been a thorn in my side.&amp;#160; I’ve never had the chance to put a good test automation tool to work for me to help with UI regression testing.&amp;#160; Along with unit tests, I wanted to have a tool that would let the QA’s quickly and efficiently automate their tests so that the tests they did in March would be instantaneously rerunable in July.&amp;#160; Sure, unit testing will get you part way there, but nothing beats a human looking at the screen and seeing if the right result is a reasonable result.&lt;/p&gt;  &lt;p&gt;If there was a swing and a miss on a goal on this project, this was the big one.&amp;#160; In fact, I didn’t even get the bat of my shoulder.&amp;#160; In the post mortem discussions I’ve been having with the team, this one popped up to the top of the list for the QAs as something that directly affected their personal satisfaction with the project and with their jobs.&amp;#160; With the rapid pace that we were kicking out builds each day, the QA’s rarely got a chance to work on a stable version of the application for more than a few hours, and some tests would take an hour to go through by hand if they didn’t run into bugs.&amp;#160; They had a ‘happy path’ test they repeated each time, and there were many versions of the application where&amp;#160; they never got to complete the full test.&amp;#160; If we were to look at the number of hours spent testing on this project, I would think that we spent far more hours testing than the value we got from it.&amp;#160; That is, since so much time was spent testing the same thing over and over, little time was available to test edge cases until the build really stabilized.&lt;/p&gt;  &lt;p&gt;So coming out of this project, we still have this as an open item to find an automated regression test suite that works for what we do.&amp;#160; I don’t think you can really evaluate the return on this investment prior to becoming proficient in the use of the tool, so it may take a few projects before we really see the benefits.&amp;#160; But it is definitely something we will be carefully considering before the end of the year, and likely before the next release cycle.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-611141765897844707?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/611141765897844707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=611141765897844707&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/611141765897844707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/611141765897844707'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/07/demo-showcase-suite-history-part-6.html' title='Demo Showcase Suite – A History – Part 6'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5963020913155046439</id><published>2009-07-21T09:21:00.001-07:00</published><updated>2009-07-29T21:49:39.496-07:00</updated><title type='text'>Demo Showcase Suite - A History - Part 5</title><content type='html'>&lt;p&gt;Lesson #3: I wanted unit tests.&lt;/p&gt;&lt;p&gt;I’ve been on a lot of projects where we took a very short sighted view of the world, and planned for the initial release, and did no planning for life after that. It was always blamed on a lack of time in the project. “When we get this done, we’ll do our documentation.” or “Next time, we’ll do it right, and write some test cases”. It never works out that way. We all know it, and every time we utter those words, we know we’re lying to ourselves. &lt;/p&gt;&lt;p&gt;If you have enough time after a project to go back and write tests, your business is about to go down the crapper because the sales guys haven’t sold anything new, and there’s no backlog of work to get done, and you sure as heck know that your customer, who didn’t plan enough time for you to get your work done in the first place, isn’t going to plan budget for you to go back and write tests they expected you to write in the first place. If you ever admit to a customer that you didn’t test all of your code, you’ll probably lose that contract. They assume you have tested everything. &lt;/p&gt;&lt;p&gt;I started buying in to the idea of Test Driven Development last year on another project that involved building a dynamic search engine completely written in LinqToSql. The engine sat over a huge database, and some of the combinations of search terms they wanted to use involve 23 table joins. There were 50+ possible search terms, range searches, boolean searches, ‘like’ searches, and enum searches. This all took place in a legacy .NET Win Forms app built in VS2005. I built a VS2008 dll with Linq2SQL, and began adding test cases, one at a time, as I added the capability to do each type of search.&lt;/p&gt;&lt;p&gt;The engine itself was rewritten 2 or 3 times as it evolved, sometimes for speed, sometimes for maintainability, but those test cases that I wrote on day 1 were still my measuring stick to see how close the new engine was to returning the right results after each refactoring. To this day, I still trust those cases, even though I haven’t touched that app in almost a year.&lt;/p&gt;&lt;p&gt;At the same time that project was going on, I was working on another project that had no tests. It was a large ASP.NET application, with a couple of dlls. The majority of the code was in code-behind files of the pages, user controls, and a few internal classes. It was a pain in the butt to test, and every time I opened the code, there were code smell areas I wanted to fix, but was too scared to. I couldn’t afford to regression test the whole app just to make one small change. I’m still scared to work on it.&lt;/p&gt;&lt;p&gt;At the start of the Demo Showcase project, I did a lot of reading about Test Driven Development, looked into mock objects, and tried to get the team to buy into the concept. Unfortunately, I misunderstood a key premise of TDD, and made promises to the team that would prove to be inaccurate. I thought that we could have the QA group take the specs, and begin to write the test harnesses, and the developers would just have to make the tests turn green. I thought that MSTest and TFS would work together flawlessly, and take away any excuses that tests were too hard to write, or they didn’t know what was out there. I thought everyone would see the value of Mocks and Stubs and have an epiphany, and that TDD would sell itself. All I had to do was to sit back, show that my tests were working, and how great my life was, and everyone else would be jealous and follow suit. Not so much.&lt;/p&gt;&lt;p&gt;It took a conversation with Glenn Block and Jim Newkirk at a &lt;a href="http://devscape.blogspot.com/2009/01/nerd-dinner-recap.html" target="_blank"&gt;NerdDinner in January&lt;/a&gt; to help me clear up a key misconception. The QA’s could not, and should not, write the tests. At least not the first tests. The first tests were supposed to help the developer flush out the functionality of the code. When I brought this change back to the group the next day, the QA’s were relieved. The developers were disappointed.&lt;/p&gt;&lt;p&gt;The biggest problem we had with our TDD approach after that, was depending on MSTest and TFS. MSTest in VS2008 (and 2005) has a really annoying bug (that is supposed to be fixed in VS2010), relating to VSMDI files getting checked out and locked by developers or testers. I’d get our tests all organized and working, then next thing I know, the test lists were blank or out of date. I’d get upset with our team, and wonder who kept wiping out all my work. It turned out that VS2008 kept creating new versions of the VSMDI file if it couldn’t get a lock on the file, and would jump you into a new version without telling you. Running a specific set of tests became a frustrating step, and people stopped doing it. And when they stopped doing it, they stopped writing them in the first place. &lt;/p&gt;&lt;p&gt;The other big issue I found was that if you wrote a bunch of tests too far in advance, and set ‘Not Implemented exceptions’ in the code, the light on the builds stayed red for days, weeks or possibly months. People stopped trusting the tests, and stopped looking at them. I fell into this trap as well. I’m not sure how to fix this, except to flag tests that I know are not ready yet as ‘Ignored’. Write them, then ignore them until the code is ready to be worked on, then re-enable them. Put a To-Do Task in the code to remind yourself to come back and re-enable them. Never take a Not Implemented exception out of the code without writing a test for it first.&lt;/p&gt;&lt;p&gt;With regard to Mocks and Stubs, I chose RhinoMock, but I didn’t understand that there were two versions of it floating around, and started with the older version, which, in my opinion, is much harder to use than the Act, Arrange, Assert style of the 3.5 version. And I didn’t truly understand how to use it correctly until I read &lt;a href="http://weblogs.asp.net/rosherove" target="_blank"&gt;Roy Osherove’s&lt;/a&gt; book ‘&lt;a href="http://www.artofunittesting.com/" target="_blank"&gt;The Art of Unit Testing&lt;/a&gt;’ just last month. I highly recommend this book, and have been pushing it down the throats of all the developers and QA’s here. &lt;/p&gt;&lt;p&gt;Finally, trying to break the cycle of developers not thinking they have enough time to write tests is a huge effort. It does take time to write good tests. It takes a lot more time when you don’t know what you are doing, when the technology and the concepts are all new. Learning TDD and RhinoMock, on top of learning the other new technologies that were part of this project became a daunting task for everyone. Learning TDD was pushed to the bottom of the list as we strived for results in early stages of the project, and the unit tests suffered. Later in the project, we came back around, and made a few other valiant attempts at it, but we definitely could have done better, and I know we will on the next one. It’s about educating ourselves, a little at a time, on processes that do and don’t work, and making adjustment as we go. We tried a lot of big changes on this project, and it may have been too much, too fast. But TDD is definitely something I am not giving up on, and will use it where ever we can in the future.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5963020913155046439?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5963020913155046439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5963020913155046439&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5963020913155046439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5963020913155046439'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/07/demo-showcase-suite-history-part-5.html' title='Demo Showcase Suite - A History - Part 5'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-1474834317039321924</id><published>2009-07-20T08:34:00.001-07:00</published><updated>2009-07-20T08:34:32.853-07:00</updated><title type='text'>Demo Showcase Suite – A History – Part 4</title><content type='html'>&lt;p&gt;A continuation of the lessons I learned from previous projects.&lt;/p&gt;  &lt;p&gt;Lesson 2:&amp;#160; I wanted to accurately track scope changes&lt;/p&gt;  &lt;p&gt;If you’ve never been burned by a scope change that wasn’t accurately tracked, this might not seem important.&amp;#160; This is an agile environment you say.&amp;#160; You should be able to adjust your plan every couple of weeks.&amp;#160; You start the project knowing full well that you don’t know everything.&amp;#160; That’s what agile is all about.&amp;#160; Well, as a developer I used to work with said frequently,&amp;#160; yes, and no.&lt;/p&gt;  &lt;p&gt;I’m not an expert on agile.&amp;#160; I’m sure I’m doing it wrong, and about to give bad advice.&amp;#160; I know requirements will change as the product comes to life.&amp;#160; Feedback will drive changes.&amp;#160; Features that were once viewed as critical will be swept aside as new features take center stage.&amp;#160; I know this.&amp;#160; I just don’t like it.&amp;#160; I like having a nice stable target, and a plan to get from there to here.&amp;#160; I hate surprises.&amp;#160; In my work, surprises are never good.&amp;#160; I’m never pleasantly surprised by a customer request.&amp;#160; I’m never optimistic about a conversation that starts with ‘What would it take to…?’.&amp;#160; Remember, I’m not in sales.&amp;#160; I have to get the app built.&amp;#160; I rely on sales and the product owner to drum up new business.&amp;#160; I have to get ‘er done.&lt;/p&gt;  &lt;p&gt;I know these changes are going to happen, and I know I’m going to grump about it as I try to protect the team.&amp;#160; That’s my job.&amp;#160; But I also know that customers have extremely short memories.&amp;#160; They never remember, and they hate being reminded, that the change they asked for resulted in the two week launch delay, or another feature being pushed to a follow-on release.&amp;#160; I’ve actually been on projects where I had multiple customers who all thought they were in charge of the product, and didn’t like the final product because someone else made a change to our marching orders without informing them.&lt;/p&gt;  &lt;p&gt;This all comes back to the change tracking section at the top of the requirements document.&amp;#160; Every change has to be annotated there, even if the change tracking is turned on in the document.&amp;#160; Changes can be ‘Accepted’, and the history can be lost.&amp;#160; Religious adherence to updating the change tracking section is the great equalizer to the argument over why something changed, was late, or was missing.&lt;/p&gt;  &lt;p&gt;As time went on, and the project evolved, we began adding the changes into our change management system (TFS), but at the start, we used plain old Word documents.&amp;#160; I’ll get into TFS and our development infrastructure later.&amp;#160;&amp;#160; That’s a whole other conversation.&lt;/p&gt;  &lt;p&gt;Was this approach successful?&amp;#160; I think so.&amp;#160; Unlike other projects, there were no last minute surprises from the client.&amp;#160; There were no gaping holes in the product that were missed requirements.&amp;#160; The customer was (I think) quite happy.&amp;#160; But I haven’t had to go back to those documents yet.&amp;#160; Maybe we just did a good job with them in the first place, or maybe we haven’t stepped back and looked hard enough yet.&lt;/p&gt;  &lt;p&gt;Regardless, it’s a practice I intend to keep doing, one way or another.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-1474834317039321924?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/1474834317039321924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=1474834317039321924&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1474834317039321924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1474834317039321924'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/07/demo-showcase-suite-history-part-4.html' title='Demo Showcase Suite – A History – Part 4'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-4743716204404822433</id><published>2009-07-17T11:05:00.001-07:00</published><updated>2009-07-17T11:05:17.979-07:00</updated><title type='text'>Demo Showcase Suite – A History – Part 3</title><content type='html'>&lt;p&gt;In my last post, I detailed 10 things that were on my mind when we started the project.&amp;#160; I’m going to go into a little bit of depth on those now.&lt;/p&gt;  &lt;p&gt;1.&amp;#160; I wanted specs that were easy to write, easy to read, and easy to maintain.&lt;/p&gt;  &lt;p&gt;I’ve done a lot of projects, in a lot of styles.&amp;#160; My first project was back in 1994 working for EDS on a General Motors project called ASPEN, building the new Assembly Line Support and Production Environment.&amp;#160; To this date, it is still the largest project I’ve ever worked on, even though I was just a minion on the production support team running the nightly builds, managing the source code repository and fixing bugs.&amp;#160; It was a typical waterfall project with 60+ developers and analysts and thousands of pages of specs written and managed by an entire team of people.&amp;#160; That works great when you have an entire team of people to manage the docs.&lt;/p&gt;  &lt;p&gt;Most of the rest of my career has been on projects with 5 or fewer people on the team, where once a spec was created, it was forgotten about, or rarely ever referred to again after the initial development was done.&amp;#160; In one of the projects I worked on last year, the specs were pretty sparse, the details and functionality hidden in poorly formatted emails that were chopped up and inserted into a Word doc.&amp;#160; Some emails never made it into the docs.&amp;#160; Some changes were done by a phone call request or hallway conversation.&amp;#160; There was no continuity, and the specs were never maintained after development began, even when change requests came in from the customer.&amp;#160;&amp;#160; Scope creep was inevitable, and it led to a lot of issues in the final release as to what was, and what wasn’t supposed to be included in the final deal.&amp;#160; We had to hunt through email to figure it all out.&amp;#160; That memory was fresh in my mind when we started Demo Showcase, and I vowed to prevent that from happening again.&lt;/p&gt;  &lt;p&gt;Still, with a small team, limited time, and final requirements that weren’t yet ready, I couldn’t implement full fledged specs.&amp;#160; I started simple, using very simplified UML diagrams like the following built in Visio:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_12eTh49TeCk/SmC9Vrpz82I/AAAAAAAAAeI/mtuRyKpBvW4/s1600-h/SimBuilderFunctions%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="SimBuilderFunctions" border="0" alt="SimBuilderFunctions" src="http://lh5.ggpht.com/_12eTh49TeCk/SmC9WIzEZaI/AAAAAAAAAeM/-XUfwDtTy50/SimBuilderFunctions_thumb%5B2%5D.jpg?imgmax=800" width="678" height="392" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I stole this concept from someone else’s blog (don’t remember where now, or I would pass the credit).&amp;#160; My wife, who is a project manager by profession, had never seen something like this, and really liked it.&amp;#160; It allowed me to build up a list of high and medium level functions and to group those functions into our release plan.&amp;#160; We could easily sit down with the customer and review what would, and wouldn’t be in each release, and walk through the app functionality.&amp;#160; We took this diagram into meetings with a projector, edited it, and moved things around.&amp;#160; If something needed a deeper level of documentation here, we added it, but in general, two levels was enough, and we never went deeper than three.&amp;#160; If a function had more than three, it was a candidate for a ‘use case’ of its own.&lt;/p&gt;  &lt;p&gt;It’s extremely easy to train management, customers and developers to read this diagram.&amp;#160; It’s almost obscenely easy.&amp;#160;&amp;#160; The only problem I had was with Visio trying to move the bubbles around for me when I was adding a new one.&lt;/p&gt;  &lt;p&gt;Once the diagram was flushed out, we split up the work between three of us (the Project Manager, the Product Owner, and myself) to create a set of Word documents with more detail for each function, which became, not coincidentally, the Functional Spec.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_12eTh49TeCk/SmC9WV6V3NI/AAAAAAAAAeQ/WihN7ANbzhU/s1600-h/FunctionalSpec%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="FunctionalSpec" border="0" alt="FunctionalSpec" src="http://lh4.ggpht.com/_12eTh49TeCk/SmC9XGZXxFI/AAAAAAAAAeU/B-qQ0vWdZCQ/FunctionalSpec_thumb%5B1%5D.jpg?imgmax=800" width="336" height="378" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;For each level 1 bubble (use case), we had a section in the document.&amp;#160; This document was maintained throughout the project by the QA Team and the Project Manager.&amp;#160; It had a change log at the top, and changes were tracked.&amp;#160; We did a final walkthrough of each document prior to starting the development on that part of the project that caught a lot of issues. That’s not to say we had completely flushed out all the details, but it was amazing how much we could put down in a short amount of time.&lt;/p&gt;  &lt;p&gt;The QA’s test cases came right from this document.&amp;#160; If there was a discrepancy between the test and the app, the document won out, or at the very least, it was updated to reflect the change.&amp;#160; If changes started to sneak into the app without being updated in here, the QA knew pretty quickly.&lt;/p&gt;  &lt;p&gt;Again, this document didn’t go down to the line level in the code, but if there was a particular architecture I wanted to use, a trick in program flow, or some other note I wanted to add, I put it in here.&amp;#160; No searching around for miscellaneous emails, no arguments about who told who what.&amp;#160; &lt;/p&gt;  &lt;p&gt;I’m not saying this was perfectly executed all the time, but our QA’s did an excellent job of holding both the developers’ and the PM’s feet to the fire and trying to keep this in good shape.&amp;#160; Hopefully, on the next project, and the one after that, this becomes second nature, and it just gets done.&lt;/p&gt;  &lt;p&gt;Of the things we did right on this project, this has to be at the top of the list.&amp;#160; Before we did this, we were headed down a very chaotic road, and the developers had that look on their faces that signaled we were in for a mutiny if we didn’t get our management act together.&amp;#160; This at least put off the mutiny for a couple of months.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-4743716204404822433?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/4743716204404822433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=4743716204404822433&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4743716204404822433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4743716204404822433'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/07/demo-showcase-suite-history-part-3.html' title='Demo Showcase Suite – A History – Part 3'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_12eTh49TeCk/SmC9WIzEZaI/AAAAAAAAAeM/-XUfwDtTy50/s72-c/SimBuilderFunctions_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-1722553492071433018</id><published>2009-07-16T15:31:00.001-07:00</published><updated>2009-07-16T15:32:01.754-07:00</updated><title type='text'>Demo Showcase Suite – A History – Part 2</title><content type='html'>&lt;p&gt;Before I go into the details of what we did during the project, I’m going to cover two areas:&amp;#160; my role in the project, and the lessons I learned from previous projects and what I tried to do in this project to use those lessons.&lt;/p&gt;  &lt;p&gt;First, I was the technical architect on the project.&amp;#160; At a small company, that can be a blurry title, and there were times where I ranged outside of what would normally be expected of the application architect.&amp;#160; What it meant to me was that I focused less on what the application did, and more on how it did it.&amp;#160; For instance, I chose the technologies, and resolved technical problems, but there were screens in the applications that I never saw until the project was almost complete.&amp;#160; There may still be screens out there that I have never seen.&amp;#160; I know for sure I have never looked at the help file in the application.&amp;#160; As long as it is there, I wasn’t concerned with it.&amp;#160; It is there, isn’t it?&lt;/p&gt;  &lt;p&gt;In an ideal world, the application architect is the second busiest person during the first phase of the project.&amp;#160; The busiest should be the Project Manager / Product Owner as they gather requirements, get customers to sign off and kick out specs.&amp;#160; During the first months, I spent a lot of time trying to figure out how I wanted the project to work, what technologies I was willing to work with, and which ones I couldn’t risk.&amp;#160; This project was all about new technologies, and we were banking a lot of our project success on technology that didn’t even exist yet, but that was due to be delivered to us by a certain date.&amp;#160; i.e.&amp;#160; The ability to run native code in Azure apps didn’t exist when we started in January, but was delivered in March.&amp;#160; &lt;/p&gt;  &lt;p&gt;Once the project gets going, gets traction, the architect should be able to slowly step aside and let the developers develop, and let the testers test.&amp;#160; My role was to then became the problem solver.&amp;#160; When a problem popped up that blocked development, I stepped in, took the issue, and tried to find a solution that worked within the overall architecture.&amp;#160; Sometimes that was a matter of interfacing with the Azure team, sometimes that was a weekend of trying to figure out how to create Undo / Redo patterns in Entity Framework with SQL Server CE.&lt;/p&gt;  &lt;p&gt;The theory is that by the last few releases, the architecture work is done, and I could move on to the next phase, or the next project, gradually reducing my time dedicated to the project so that when the devs are done, the next project was ready to go, and a consistent pace could be sustained throughout the project and the year.&amp;#160; In theory.&amp;#160; We’ll come back to that later.&lt;/p&gt;  &lt;p&gt;As far as lessons go, I’d learned a lot in the last year working on those three or four other projects, and, of course, had a dozen plus years of experience on other projects.&amp;#160; Here were the chief thoughts on my mind when we started:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;I wanted specs that were easy to write, easy to read, and easy to maintain.&lt;/li&gt;    &lt;li&gt;I wanted to accurately track scope changes.&lt;/li&gt;    &lt;li&gt;I wanted unit tests.&lt;/li&gt;    &lt;li&gt;I didn’t want to get to a week from the delivery date, need to make a change, and have to regression test everything by hand&lt;/li&gt;    &lt;li&gt;I wanted the team to feel the urgency of working hard &lt;strong&gt;and smart&lt;/strong&gt; early in the project to avoid the death march mindset at the end.&lt;/li&gt;    &lt;li&gt;I wanted to plan for change, both in scope, the composition of the development team, technology and time lines.&lt;/li&gt;    &lt;li&gt;I wanted a reliable build and deployment process from the start.&lt;/li&gt;    &lt;li&gt;I wanted the team to be able to provide me with feedback quickly and easily and to give both myself and the PM a heads up well in advance of a red flag issue becoming critical.&amp;#160; No surprises.&lt;/li&gt;    &lt;li&gt;I wanted an architecture that minimized code smell, and one I could proudly show off as the best we could possibly do&lt;/li&gt;    &lt;li&gt;I wanted to enrich my technical knowledge base.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Only one of these goals would I consider an architectural goal.&amp;#160; But all of&amp;#160; them tie into making the project, and the company successful.&amp;#160; Some of these goals we achieved, some we got close to achieving, and some I plan to work towards achieving on the next project with the lessons learned on this one.&lt;/p&gt;  &lt;p&gt;I’ll go into each one of these in the next entry in this series.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-1722553492071433018?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/1722553492071433018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=1722553492071433018&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1722553492071433018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1722553492071433018'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/07/demo-showcase-suite-history-part-2.html' title='Demo Showcase Suite – A History – Part 2'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-1495272006278503543</id><published>2009-07-14T11:37:00.001-07:00</published><updated>2009-07-14T11:37:55.454-07:00</updated><title type='text'>Demo Showcase Suite – A History – Part 1</title><content type='html'>&lt;p&gt;I work for a small software consulting company that had been doing work for Microsoft for a number of years, creating the original Contoso Demo Showcase demos that were available on the Microsoft Partner web site.&amp;#160; By October of 2008, we had created over 200 of these demos in eight different languages (so about 25 in English that had been translated 8 times), with each one taking anywhere from two to six weeks to create.&amp;#160; Much of this work was done before I had ever joined the company in January 2008, but I witnessed many of the late nights and long weekends that it took to get a demo just right by manually shooting each screen, and building a WPF executable from a series of screen shots.&amp;#160; Some of these demos had 200-300 screen shots in each, and a missed step or slightly misplaced hotspot would cost hours of work.&amp;#160; The developers had built some tools, and an engine to run the sims, but both needed a lot of work to make them usable for a non-developer user. I think the developers on that original effort are still having nightmares about it.&amp;#160; They do get the shivers when you mention it. &lt;/p&gt;  &lt;p&gt;In October of 2008, I had just finished three projects for other customers, one small ASP.NET website, one large ASP.NET website, and a major upgrade to a very large Win Forms application in C#.&amp;#160; Throughout those three projects, I kept a mental list of what we did right, and what we did wrong, with the intent of applying the lessons to the next project.&lt;/p&gt;  &lt;p&gt;Dan, one of the owners of the company I work for, who doesn’t like being called my boss, told me at the beginning of October that he was lining up my next project, and that it would be huge.&amp;#160; It would involve this idea they had sold to Microsoft to automate the production of these demos.&amp;#160; Dan and Benjamin, the other partner here, dropped some big Microsoft names into the conversation to entice the glory hound in me out of hiding.&amp;#160; I didn’t know anything about the project at this point, and though I was flattered by the trust they were putting in me, and excited by the possibility of working on a big, high profile project, I was nervous about being associated with this Contoso project and the late nights that I heard had come with it.&amp;#160;&amp;#160;&amp;#160; They assured me those days were over.&amp;#160; This was a completely different project.&amp;#160; Yes.&amp;#160; It was.&lt;/p&gt;  &lt;p&gt;I was a couple of weeks late getting started on the project as I had to wrap up one of my previous projects.&amp;#160; It’s never good to start out behind the eight ball, but in the scheme of things, that wasn’t a major impact on the project.&amp;#160; I officially started looking at the project documents on Friday, October 24th.&amp;#160; I remember going home all excited to be working on something new, starting from the ground up.&amp;#160; I returned on Monday morning, October 27th, and started digging in to the project in more detail, and started to outline my approach.&amp;#160; We were going to do this one right.&lt;/p&gt;  &lt;p&gt;On Tuesday, October 28th, my boss sent me a note, asking if I heard of this Azure thing Microsoft had just launched, and wondered if it might be worth looking into for this project.&amp;#160; Sure, why not?&amp;#160; The Microsoft PDC in Los Angeles was going on that day, and info was coming out fast.&amp;#160; I spent the afternoon watching the PDC presentations on my pc.&amp;#160; By noon the next day, I reported to Dan that Azure looked pretty cool, and that it would save us a bunch of time doing the hard things.&amp;#160; Scaling with load, synchronization, blob storage, queues, security.&amp;#160; All things we had dealt with on previous projects that caused us major issues.&amp;#160; Developers could focus on the business app, and not on the environment.&amp;#160; Perfect.&amp;#160; I don’t remember his exact words, but it was something like “Good, because the customer wants the site built on Azure.”&lt;/p&gt;  &lt;p&gt;I had never worked on a project with an OS that was in CTP.&amp;#160; Hell, I had never worked on a project that involved any CTP technology.&amp;#160; I came from a business systems background that waited at least a year and a half after software was released before using it.&amp;#160; In 2007 at my last job, we were barely upgraded to Visual Studio 2005.&amp;#160; I didn’t know what CTP meant.&amp;#160; CTP is after Beta, right?&amp;#160; Well, not exactly.&lt;/p&gt;  &lt;p&gt;We started the project with a Proof of Concept application.&amp;#160; There was the web site (at the time called Simulation Server), a web service (SimSync), a web app (SimBuilder), a WPF Simulation Engine (SimEngine) and a Windows Service (SimCompiler).&amp;#160; Azure wasn’t quite ready for us to use, and we were still working out the details of getting into the Azure early adopter program, so we deployed the POC in a Win2K8 / SQL Server environment.&amp;#160; We delivered the POC a week or two before Christmas to give the execs a chance to look it over, and to get a feel for the project before we really dug in.&amp;#160; &lt;/p&gt;  &lt;p&gt;We took the time during the Christmas lull to get fully indoctrinated with Azure, to begin to flush out a few details, to organize ourselves, and to begin to look at some of the more complicated features.&amp;#160; We also took the time to take a well deserved break while the details of the system got worked out.&amp;#160; We knew there would be a lot of work to do after the New Year.&amp;#160; &lt;/p&gt;  &lt;p&gt;We were accepted into the Azure early adopter program in late December.&amp;#160; The execs signed off on the project in early January.&amp;#160; Everyone was rested and raring to go.&amp;#160; It was time to get coding.&lt;/p&gt;  &lt;p&gt;To be continued…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-1495272006278503543?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/1495272006278503543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=1495272006278503543&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1495272006278503543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1495272006278503543'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/07/demo-showcase-suite-history-part-1.html' title='Demo Showcase Suite – A History – Part 1'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8953617284137567718</id><published>2009-07-13T12:29:00.001-07:00</published><updated>2009-07-13T12:29:56.939-07:00</updated><title type='text'>Demo Showcase Suite Launch</title><content type='html'>&lt;p&gt;This blog has been a little devoid of content for the last few months.&amp;#160; It’s not because I had nothing to say, it was because everything I had to say, couldn’t be said.&amp;#160; The three letters a blogger hates to hear are ‘N D A’, non-disclosure agreement.&amp;#160; There are still a few things I can’t talk about, but by and large, the ban has been lifted.&lt;/p&gt;  &lt;p&gt;This morning, at 9:00 AM Central Time, Allison Watson, Corporate VP of the Microsoft World Wide Partner Group, announced the release of &lt;a href="http://www.demoshowcasesuite.com/" target="_blank"&gt;Demo Showcase Suite&lt;/a&gt;.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;“Microsoft’s® Demo Showcase Suite is a collection of demonstration resources that includes the new Demo Showcase application for creating your own click-through demos as well as this community site to manage your demos, search for demos, distribute demos you’ve created and stitch different demos together to make your own. Sign in with Windows Live ID and take a look through this site and download the Demo Showcase application to get started creating your own demos that you can share through Silverlight or download as standalone executables”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;For the last 9 months, I have been immersed in this project as the lead architect.&amp;#160; It’s the biggest project I’ve ever led, and a high water mark in my career.&amp;#160; With a small team of developers and QA’s, we turned out a product that we are all quite proud of.&amp;#160; &lt;/p&gt;  &lt;p&gt;You can see what the app does by going out and using it.&amp;#160; I’m going to focus my next few blog posts on the architecture of the product, the history of the project, and lessons and technology we learned while doing it.&amp;#160; For those of you that can’t wait, here’s a brief sample of the technologies we used (in no particular order):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Windows Azure&lt;/li&gt;    &lt;li&gt;Windows Live ID Authentication&lt;/li&gt;    &lt;li&gt;Unity Framework + Enterprise Application Blocks&lt;/li&gt;    &lt;li&gt;Entity Framework&lt;/li&gt;    &lt;li&gt;LinqToSql&lt;/li&gt;    &lt;li&gt;WPF&lt;/li&gt;    &lt;li&gt;MVVM in WPF&lt;/li&gt;    &lt;li&gt;Silverlight 2&lt;/li&gt;    &lt;li&gt;ASP.NET&lt;/li&gt;    &lt;li&gt;Test Driven Development&lt;/li&gt;    &lt;li&gt;Microsoft Geneva Framework&lt;/li&gt;    &lt;li&gt;ACS&lt;/li&gt;    &lt;li&gt;SQL Server 2008&lt;/li&gt;    &lt;li&gt;Custom ASP.NET Handlers&lt;/li&gt;    &lt;li&gt;Object Graphs in EF using QuickGraph.NET&lt;/li&gt;    &lt;li&gt;ASP.NET Dynamic Data&lt;/li&gt;    &lt;li&gt;WCF&lt;/li&gt;    &lt;li&gt;REST&lt;/li&gt;    &lt;li&gt;RSS Feeds&lt;/li&gt;    &lt;li&gt;Custom WPF Compilation Engine&lt;/li&gt;    &lt;li&gt;Log4Net&lt;/li&gt;    &lt;li&gt;ASP.NET AJAX&lt;/li&gt;    &lt;li&gt;Resharper 4.5&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As you can imagine, things are still kind of hectic around here today.&amp;#160; I’ll try to update the blog this week with more details.&amp;#160; For now, go give the app a try.&amp;#160; If you can’t get to it because you are not a partner, please contact Microsoft Partner Group, and get enrolled today!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8953617284137567718?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8953617284137567718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8953617284137567718&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8953617284137567718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8953617284137567718'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/07/demo-showcase-suite-launch.html' title='Demo Showcase Suite Launch'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8415764751471333753</id><published>2009-07-09T07:54:00.001-07:00</published><updated>2009-07-09T08:05:58.429-07:00</updated><title type='text'>Allow MSI Downloads on ASP.NET Web Site</title><content type='html'>&lt;p&gt;I can't tell you how many hours I spent over the last few weeks trying to debug a problem with a web site where we were trying to allow users to download an MSI from a blob. Sometimes it would work the first time, and then the next time, the site would try to download the .aspx file the code was running in.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;What made it really confusing was that this problem only happened when we were running in Azure with IE 8. In IIS 7 running on Win2K8, it was fine. With Azure and FireFox, it was fine. At one point, we had it working on everything except IE 8 running on Windows 7 with a backend of Azure.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;What I finally had to do, was to create an ASP.NET Generic Handler (ashx) that did the heavy lifting for me.&amp;#160; To give credit where credit is due, the suggestion came from someone I met while at the latest NerdDinner in Bellevue, WA on July 7.&amp;#160; (I wish I could give you his name, but I do know he was on the ADO.NET Services Team at Microsoft)&amp;#160;&amp;#160; This is the second time that I have attended one of those dinners, and the second time I was able to solve a problem the next day based on advice given to me by someone there.&amp;#160;&amp;#160; Many thanks to Scott Hanselman for getting these events put together.&lt;/p&gt;  &lt;p&gt; Here was the final code: &lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MsiDownload : IHttpHandler&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; ILog _log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ProcessRequest(HttpContext context)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; msiName = ConfigurationManager.AppSettings.Get(&lt;span style="color: #006080"&gt;&amp;quot;MSIName&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] returnedBytes = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        var blobManager = UnityFactory.Current.Resolve&amp;lt;IBlobManager&amp;gt;();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            returnedBytes = blobManager.GetMsi(msiName);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (returnedBytes == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;                _log.ErrorFormat(&lt;span style="color: #006080"&gt;&amp;quot;Error obtaining MSI from blob storage service. Returned bytes is zero length.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception exc)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            _log.ErrorFormat(&lt;span style="color: #006080"&gt;&amp;quot;Error obtaining MSI from blob storage service. Exception type: {0}, Exception Message {1}.&amp;quot;&lt;/span&gt;, exc.GetType().ToString(), exc.Message);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (returnedBytes != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            context.Response.Buffer = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            &lt;span style="color: #008000"&gt;// force download&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            context.Response.ContentType = &lt;span style="color: #006080"&gt;&amp;quot;application/x-msi;&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            context.Response.AppendHeader(&lt;span style="color: #006080"&gt;&amp;quot;X-Content-Type-Options&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;nosniff&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            context.Response.AppendHeader(&lt;span style="color: #006080"&gt;&amp;quot;content-disposition&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;attachment; filename=&amp;quot;&lt;/span&gt; + msiName);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            context.Response.AppendHeader(&lt;span style="color: #006080"&gt;&amp;quot;Content-Length&amp;quot;&lt;/span&gt;, returnedBytes.Count().ToString());&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            context.Response.OutputStream.Write(returnedBytes, 0, returnedBytes.Count());&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            context.Response.Flush();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            context.Response.End();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        }        &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsReusable&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        get&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8415764751471333753?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8415764751471333753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8415764751471333753&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8415764751471333753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8415764751471333753'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/07/allow-msi-downloads-on-aspnet-web-site.html' title='Allow MSI Downloads on ASP.NET Web Site'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-7146205494676940569</id><published>2009-02-19T08:55:00.000-08:00</published><updated>2009-02-19T08:59:21.616-08:00</updated><title type='text'>Rhino Mock  Error - rhino mocks requires a return value or an exception to throw</title><content type='html'>Sometimes it's just a matter of googling the right thing.  I was trying to show someone how easy it was to develop mocks to help test, and wouldn't you know it, I kept getting errors in my test harness that I couldn't figure out.  I thought it was because we were testing an object with a read only property and using the AutoMockingUnityContainer, but when I was finally smart enough to google the real exception being thrown:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;rhino mocks requires a return value or an exception to throw&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;It immediately led me to this wonderful solution.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://codemonkey.nmonta.com/2008/09/19/previous-method-requires-a-return-value-or-an-exception-to-throw/"&gt;http://codemonkey.nmonta.com/2008/09/19/previous-method-requires-a-return-value-or-an-exception-to-throw/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Google FTW.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-7146205494676940569?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/7146205494676940569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=7146205494676940569&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7146205494676940569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7146205494676940569'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/02/rhino-mock-error-rhino-mocks-requires.html' title='Rhino Mock  Error - rhino mocks requires a return value or an exception to throw'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-1637942976300181546</id><published>2009-02-19T07:26:00.000-08:00</published><updated>2009-02-19T08:10:27.400-08:00</updated><title type='text'>Book Review:  Architecting Applications for the Enterprise</title><content type='html'>This morning I finished reading Dino &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Esposito's&lt;/span&gt; and Andrea &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Saltarello's&lt;/span&gt; book Microsoft .NET: &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Architecting&lt;/span&gt; Applications for the Enterprise. The highest praise for a technical book is that it immediately affected not just the work I was doing, but the way I work. This one did just that.&lt;br /&gt;&lt;br /&gt;I've been writing code since I was 8 years old on my school's Commodore PET. That's was almost 30 years ago now. I've been doing it as a career since 1994. I started designing applications (as opposed to just being a code monkey), in 1997. I became what my company calls an Architect last year.&lt;br /&gt;&lt;br /&gt;But I didn't start to think like an architect until just recently, and this book, which I power read over the course of 6 days, has had a profound impact on how I see my role within the company, and how I need to work to make myself, and my team more efficient. I've been bringing in tools and processes the last year or so to fix the low hanging fruit, but I still considered myself a developer first, and considered the architect role to be something I did between writing classes and specs.&lt;br /&gt;&lt;br /&gt;The first half of this book is about the process. And though the first chapter is a little, um, dry (probably a few too many references to ISO and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;IEEE&lt;/span&gt;), it does help to build the profile for where an architect fits into an organization (big and small). These guys have been there, and done systems development where there is a client involved in the process. They aren't people who have been at some big software company and don't know what is involved in developing line of business software with a client who has no idea what it is they want when the project starts.&lt;br /&gt;&lt;br /&gt;The second half of the book talks about application layers: The Business Layer, The Data Access Layer, The Service Layer and The Presentation Layer. I've worked in all these layers at one time or another, but it's only quite recently that I have truly begun to understand the Separation of Concerns rules, and things like dependency injection. This book not only helped top clarify these things in my mind so I can better understand all the other reading that I do that assumes that I know what &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;SoC&lt;/span&gt; mean, but it also talked about misconceptions about the layers. I found the section on the service layer particularly appropriate because for a long time, I completely misunderstood Service Oriented Architecture. They cleared this concept up for me in a way no other publication ever has. I wish I had read that 4 years ago. I once built a 'Service Oriented Architecture' application with 80+ web services! What was I thinking?&lt;br /&gt;&lt;br /&gt;My favorite part of the book was the 10 Final thoughts, their mantra as they call it. These were spot on, and proved to me that they had been there, and done that, when it came to developing real world applications. It gave them 'geek cred'.&lt;br /&gt;&lt;br /&gt;The target audience for this book is probably senior &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;devs&lt;/span&gt; and architects. It's probably too high up for low level &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;devs&lt;/span&gt; to be interested in (though they should be). I highly recommend it for anyone who is moving up out of the weeds, and anyone who wants a high level picture of some of the most common design patterns in .NET.&lt;br /&gt;&lt;br /&gt;The next book I'll be cracking open (tonight on the train ride home), is Julia &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Lerman's&lt;/span&gt; "Programming Entity Framework". 800 pages of data access goodness. Oh My!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-1637942976300181546?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/1637942976300181546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=1637942976300181546&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1637942976300181546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1637942976300181546'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/02/book-review-architecting-applications.html' title='Book Review:  Architecting Applications for the Enterprise'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5238374922601119232</id><published>2009-02-18T07:00:00.000-08:00</published><updated>2009-02-18T07:07:28.196-08:00</updated><title type='text'>MS-Test - Not Executed Error</title><content type='html'>I've finally found out what the issue was with my MS-Test harness, and why I am the only one currently seeing this issue in my office.&lt;br /&gt;&lt;br /&gt;First I needed to turn on logging for MS-Test. Here's a link on how to do that.&lt;br /&gt;&lt;a href="http://blogs.msdn.com/yutong/archive/2006/10/03/How-to-Enable-VSTS-Logging_3F00_.aspx"&gt;http://blogs.msdn.com/yutong/archive/2006/10/03/How-to-Enable-VSTS-Logging_3F00_.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then, once I ran my tests, and looked in the log, I saw the following error message:&lt;br /&gt;&lt;br /&gt;The Visual Studio performance and coverage logging engine is already running on the computer. Therefore, the test run cannot continue. Close the pending performance or code coverage session and then rerun the tests.&lt;br /&gt;&lt;br /&gt;Here's a link to the fix&lt;br /&gt;&lt;a href="http://platinumdogs.wordpress.com/2007/12/"&gt;http://platinumdogs.wordpress.com/2007/12/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm the only one in the office having this problem, because I am the only one with VS2008 Team System Team Suite and running code coverage and analysis.&lt;br /&gt;&lt;br /&gt;I also suspect that I'm the only one who's pounding out all the test code they need to be writing right now, but that's going to change. Soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5238374922601119232?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5238374922601119232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5238374922601119232&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5238374922601119232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5238374922601119232'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/02/ms-test-not-executed-error.html' title='MS-Test - Not Executed Error'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-968170362330133373</id><published>2009-02-18T06:43:00.000-08:00</published><updated>2009-02-18T06:51:11.904-08:00</updated><title type='text'>Windows Explorer  --- Grrr</title><content type='html'>Okay, I try not to say anything bad about software that a lot of work has gone into, because, well, I know how hard it is to get it right.&lt;br /&gt;&lt;br /&gt;But yesterday I needed to fix a problem on out Team Foundation Server.  I needed to get my hands on an executable called TF.EXE.  It wasn't (for whatever reason) on my TFS server.  Fine, it was supposed to be on my machine (since I have just about every freaking product known to man on my machine it seems).  I tried to save myself time by doing a search from my Vista File Explorer (or whatever it is officially called these days).  Nothing came back.  I hunted around a little bit, searched the web a little bit, and finally just gave up and worked around my problem.&lt;br /&gt;&lt;br /&gt;This morning, while fighting another MS-Test - tests not executed issue (if I get one more of these freaking things, I'm going back to NUnit), I stumbled across my C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE directory, and lo and behold, there's TF.exe.&lt;br /&gt;&lt;br /&gt;So can someone tell me why the hell File Explorer couldn't find it for me yesterday and save me a hour of my time?  Why even bother putting the freaking search tool there if it doesn't work?  Anyone?  Is there a trick to making it search the whole drive?  Arrrgggh.&lt;br /&gt;&lt;br /&gt;What a great way to start the day!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-968170362330133373?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/968170362330133373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=968170362330133373&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/968170362330133373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/968170362330133373'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/02/windows-explorer-grrr.html' title='Windows Explorer  --- Grrr'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-1834115134241407967</id><published>2009-02-16T11:22:00.000-08:00</published><updated>2009-02-16T11:25:02.122-08:00</updated><title type='text'>MSTest - Grrrrrr</title><content type='html'>I spent two hours plus this mornign trying to find out why my test harnesses all started returning 'Not Executed' when I ran in 'Run Tests in Current Context", but worked fine in "Debug Tests in Current Context".  The tests worked on everyone else's computers.&lt;br /&gt;&lt;br /&gt;The solution...&lt;br /&gt;&lt;br /&gt;I deleted my entire solution folder, and did a get latest from TFS.  What a pain in the ass.  I  was this close to converting back to NUnit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-1834115134241407967?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/1834115134241407967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=1834115134241407967&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1834115134241407967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1834115134241407967'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/02/mstest-grrrrrr.html' title='MSTest - Grrrrrr'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-7164475749979726585</id><published>2009-02-16T08:48:00.000-08:00</published><updated>2009-02-16T08:58:59.428-08:00</updated><title type='text'>Design for Reuse?</title><content type='html'>I've been reading "Microsoft .NET: Architecting Applications for the Enterprise" by Dino Esposito and Andrea Salterello the last few days, and really enjoying it.  It's not a detailed coding book, but discusses patterns and approaches, and is bringing me up to speed on some of the areas of development I haven't yet explored, or have explored but need a refresher on.  I actually found myself sitting on the couch on Saturday afternoon while the kids were asleep, reading it because it applies directly to what I am doing this week.&lt;br /&gt;&lt;br /&gt;One of the points it made (I should have highlighted it, because I can't find the page now), is that you put interfaces on classes not for reusability, but for replacability.  That's a whole paradigm change from what I use to do, but have now adopted with TDD and Dependency Injection.&lt;br /&gt;&lt;br /&gt;I used to spend hours trying to factor out what I thought would be common code, and got stuck just trying to figure out how loggers would work (in days before log4net) or data access for a certain class.  To me, back then, the money was in designing for future needs.&lt;br /&gt;&lt;br /&gt;Now I realize that most of those common modules have already been written, and it saves me a lot more time and money to design each class I write with an interface and to be able to swap it out using dependency injection.  I can try and guess for years what my next implementation of a business process might look like, and I will fail 99% of the time.   Build what you know now, put it behind an interface, and swap out the old for the new.&lt;br /&gt;&lt;br /&gt;It seems pretty elementary now, but even a year and a half ago, I didn't get it.  It's like a huge weight has been lifted off my shoulders, and I am no longer stuck in future requirements purgatory!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-7164475749979726585?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/7164475749979726585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=7164475749979726585&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7164475749979726585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7164475749979726585'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/02/design-for-reuse.html' title='Design for Reuse?'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5490733368491845647</id><published>2009-02-13T08:23:00.000-08:00</published><updated>2009-02-13T08:58:15.469-08:00</updated><title type='text'>Good Tests Gone Very Bad</title><content type='html'>I've been writing dozens of tests lately as I have completely bought in to the TDD methodology.  I've even turned on code coverage in Team Suite to see just how I'm doing.  This may not be a great thing to do if you suffer from OCD, but it sure has helped me to better understand my code.  It helps even more when I am walking through other people's code trying to debug something, as I run their tests first, check to see if any lines of code haven't executed as expected, and then write a test to try to execute that code as I would expect.  If I still don't get there, I know one of the core assumptions elsewhere is wrong.  Its a lot faster than stepping through hundreds of lines of code.  It focuses my attention to the problem area much more quickly.&lt;br /&gt;&lt;br /&gt;Yesterday morning, I was flying along, writing code, and writing tests, and one of the other developers here came by to ask how to properly test his ViewModel that depended on checking various items on the file system (i.e. does a directory exist, if not, create it).&lt;br /&gt;&lt;br /&gt;We're using Rhino Mocks, not TypeMock isolator, so the fact that these System.IO classes are static means that we can't mock them.  A little searching revealed that our best option was to create an IFileManager interface with a FileManager class under it, and mock the interface.  Not my favorite thing to do, but it works.&lt;br /&gt;&lt;br /&gt;I wrote the tests for the new class, and they ran fine.&lt;br /&gt;&lt;br /&gt;Then we added that class to my co-worker's class and exposed a property on his interface / class for the IFileManager so that we could pass in a mock.&lt;br /&gt;&lt;br /&gt;I ran his tests for his class in debug mode.  It worked.  Cool.&lt;br /&gt;&lt;br /&gt;We wrote some new tests to pass in the mock, and ran those in debug mode.  They worked as expected.  Awesome!&lt;br /&gt;&lt;br /&gt;But here's where things got hairy. &lt;br /&gt;&lt;br /&gt;We went to my test list editor, and added them to our global test list, and reran the tests.  The failed with a 'Could not load type error'.  Hmmm.  Must be something wrong with my set up / tear down.   So I reran just one of the tests from the test list editor.  Still failed.  Okay, back to the code.  Rerun the test in debug mode.  It works.  Run the test in 'Run' mode.  It fails.  WTF?&lt;br /&gt;&lt;br /&gt;Check my tests on the FileManager class.  They work fine.&lt;br /&gt;&lt;br /&gt;Strip the new code out of the ViewModel class.  Run the original tests.  Pass.&lt;br /&gt;&lt;br /&gt;Run the new tests.  Fail.  Same error.  Wait... the class it says it can't load is the class we have completely commented out.  Except we left in the using statement.  Comment that out.  Build.  Still failed, same message.&lt;br /&gt;&lt;br /&gt;At this point I'm getting pretty PO'd.  I force a clean on my whole solution, and rebuild.  Tests pass.  WTF?&lt;br /&gt;&lt;br /&gt;Start adding code back in.  Add the using statement.  Pass.&lt;br /&gt;&lt;br /&gt;Add the reference to the interface.  Failed.&lt;br /&gt;&lt;br /&gt;Pull the mocking code out of the tests, pass in a real object (not generated by the AutoMockingUnityContainer).  Pass.  Okay, it's somewhere in the Unity Code.  We're now 2 hours into this.  I went through this a dozen times, various combinations, until it finally hit me.&lt;br /&gt;&lt;br /&gt;The problem wasn't that it couldn't load my FileManager class.  By this time, that class had nothing left in it beside a couple of boolean functions that always returned true.  What had happened was that immediately before I had been asked to look at this issue, I had installed the October 2008 release of the Enterprise Application Library (Version 4.1) to make use of the Validation Application Block.  I had previously just installed the Unity Framework separately.  I now had two versions of the Unity Framework installed on my machine, with the same version numbers, but from different locations on my machine.&lt;br /&gt;&lt;br /&gt;I uninstalled the Enterprise Library, restarted my IDE, and ran my tests successfully.  I readded all the code I had commented out, and the tests ran as expected.   I think we spent three hours on this one yesterday (x2 since two of us were trying to figure it out)&lt;br /&gt;&lt;br /&gt;Now I have to decide when to have the team install the app blocks on thier machines, and to remind them to unistall Unity and any old versions first.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5490733368491845647?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5490733368491845647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5490733368491845647&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5490733368491845647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5490733368491845647'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/02/good-tests-gone-very-bad.html' title='Good Tests Gone Very Bad'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-226904391664465187</id><published>2009-02-13T08:17:00.000-08:00</published><updated>2009-02-13T08:23:03.160-08:00</updated><title type='text'>Random VS2008 Crashes</title><content type='html'>For the past few weeks, I've been having a lot of problems with VS2008 crashing randomly on my PC.  I've been installing a lot of tools and components lately, so I have little doubt that something I've installed recently was causing it to BSOD  (Black Screen of Death in this case).&lt;br /&gt;&lt;br /&gt;This morning, I was trying to add the Microsoft.IdentityModel.dll to my tool box, and it kept crashing.  I finally had enough, and decided to Google for a solution.  The link below fixed the problem on the first try.  Yes! &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tech-archive.net/Archive/VisualStudio/microsoft.public.vsnet.ide/2008-03/msg00083.html"&gt;http://www.tech-archive.net/Archive/VisualStudio/microsoft.public.vsnet.ide/2008-03/msg00083.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sometimes it pays to spend 2 minutes fixing the problem instead of just ignoring it and hoping it will go away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-226904391664465187?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/226904391664465187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=226904391664465187&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/226904391664465187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/226904391664465187'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/02/random-vs2008-crashes.html' title='Random VS2008 Crashes'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-505876588447807201</id><published>2009-02-04T12:08:00.001-08:00</published><updated>2009-02-04T12:24:37.270-08:00</updated><title type='text'>AutoMockingUnityContainer and Rhino Mock</title><content type='html'>I've been putting a lot of time into understanding TDD and Mocking the last few weeks.  Combine that with Unity, and it's a lot of stuff to get a grip on.&lt;br /&gt;&lt;br /&gt;I've been going with Rhino Mock as my mocking framework, and it seems to work okay as long as you are developing new code.  If I were working on legacy code, I think it's pretty clear you would want to use TypeMock Isolator.  You could justify the expense pretty quickly.&lt;br /&gt;&lt;br /&gt;I was trying to use Roy Osherove's &lt;a href="http://weblogs.asp.net/rosherove/archive/2008/04/14/creating-a-automockingcontainer-with-microsoft-unity-pretty-darn-simple.aspx"&gt;AutoMockingUnityContainer&lt;/a&gt; to make my test fixtures perfect, since I am setting up the model for all the other devs to follow.  Roy published this back in April 2008, and since then, Rhino Mock has released a new version that makes use of lambda expressions to eliminate the need to do the mocks.Record step.  Instead, you should be able to do the following:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   ILogger logger = container.Resolve&lt;ilogger&gt;();&lt;br /&gt;   logger.Stub(x =&gt; x.IsLogFileFull()).Returns(true);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I say should, because this is what I understand.  I may have misunderstood.&lt;br /&gt;&lt;br /&gt;This should force the IsLogFileFull to always return true when called in the example Roy shows.  But for some reason, it always returns false for me.  I went through a hundred iterations of code, and ended up going back to the original syntax, which isn't quite as clear, but works.&lt;br /&gt;&lt;br /&gt;I will say that my "Logger" class is not passed into the constructor but is set as a property after the class is resolved.  Maybe that is the issue, but I am testing a very high level function, and it calls a number of different classes that I want to mock / stub, and I would hate to have a class that has five or six arguments required in the constructor (even if it is just for testing sake).  The class is wired up to Unity itself so I normally don't need to pass these in, just when I want to mock.&lt;br /&gt;&lt;br /&gt;Maybe that is a reason in itself to go to TypeMock, but I need to prove to my folks here that TDD and Mocking is going to pay off at all, before I try to prove that we need to spend more money to do it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-505876588447807201?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/505876588447807201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=505876588447807201&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/505876588447807201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/505876588447807201'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/02/automockingunitycontainer-and-rhino.html' title='AutoMockingUnityContainer and Rhino Mock'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8535991219966136036</id><published>2009-01-21T19:28:00.000-08:00</published><updated>2009-01-21T20:04:26.560-08:00</updated><title type='text'>So much, so fast</title><content type='html'>One of the toughest things about being an application architect at a small company is needing to know everything about everything, yesterday. I'm working on a very large project right now, and I need to get in depth with a huge number of topics, all at once, just to get the project kicked off. Other parts of the team are sitting on their hands waiting for me to get stuff done, and I hate being a bottleneck. It makes for some very busy days where I don't seem to get a lot done, or get to know as much about a topic as I really need to to make sure I am pushing us in the right direction.&lt;br /&gt;&lt;br /&gt;For instance, today was a fairly typical day.&lt;br /&gt;&lt;br /&gt;I spent an hour reading through emails and blogs this morning as I ate my breakfast and chatted about the inauguration in my office.&lt;br /&gt;&lt;br /&gt;I then reviewed a spec I had written yesterday on Security Authentication, Authorization and Threat Modelling for my project. I had to go back and dig into the Geneva Framework and the .NET Access Control Service to see how close I was to the mark. I've got a real fear that I need to become a lot more familiar with threat modelling before I can consider this spec complete, or I need to con someone else in the office into become the SME on Security.&lt;br /&gt;&lt;br /&gt;I spent two hours writing an application specific functional spec for a WCF Based Azure Web Service, mostly dealing with the 'what' side of the house, i.e. what it's supposed to do, but leaving out the 'how', i.e. how it's going to do what it has to do. This particular piece of the project is one of the more important aspects because the service has to be very secure, has a lot of validation built into it to prevent corrupt data from being uploaded or downloaded, and I had to build in a migration path to eventually move from one version of the service to the next without breaking existing clients. I actually took the time to put a lot of thought into that mechanism, but the spec isn't close enough to be ready to turn over to a developer (unless it is me), because I didn't cover any of the aspects of Azure or Geneva that need to be covered in a 'how' spec.&lt;br /&gt;&lt;br /&gt;I spent an hour and a half re-arranging projects in my Team Foundation Server project to try to get everything organized and clean, the way I want it. This involved changing some namespaces, and working through a real bastard of a problem involving a confusion between the Silverlight Unity Framework and the Windows Unity Framework. Somehow the Silverlight Unity DLL had been linked into one of the non-Silverlight projects, and nothing was compiling. This problem came on the heels of a similar issue yesterday where the ICommand interface I was using in one of my projects got linked to System.Windows.Input instead of the PresentationCore library. That cost me three hours yesterday. I really need to lock down my project files (usually from myself).&lt;br /&gt;&lt;br /&gt;I then spent 2 hours delving back into the MVVM pattern for WPF development to figure out how exactly to launch dialog boxes and other windows from a view in the 'correct' way. Where exactly does the code go to 'new' the view, and which view model do you bind it to? That's a whole blog post unto itself. I've just started with the MVVM pattern, and it's powerful, but in trying to explain it to a junior dev, he kept asking me how the View Model in our scenario wasn't just a big global variable, albeit a global variable with a lot of pizazz. It's those type of questions that lead me to doubt my understanding of the pattern, and I ended up spending a lot more time trying to explain the pattern to myself again, but we all came away with a slightly more enlightened view.&lt;br /&gt;&lt;br /&gt;I spent an hour this afternoon trying to turn an XSD file into classes using XSD.exe and then trying to figure out how to turn those classes into database tables. We probably should have gone the other way and started with tables, but that's a whole other discussion. I'll have to finish that task tomorrow.&lt;br /&gt;&lt;br /&gt;I also spent twenty minutes trying to help our project manager tie TFS Work Items to MS Project properly. We want to have two different project plan views, one for internal use, and one, a higher level view, for the customer, but we don't want to maintain the tasks in two places. We're working through some theories on exactly how to do that. I've never used TFS prior to this project, so we're learning some interesting lessons.&lt;br /&gt;&lt;br /&gt;Tomorrow, I need to get a handle on the project plan as it is due by Friday. I need to review the WCF spec I did, get the classes converted to database tables, spin up an entity framework model for them, dig into SDS and attempt to migrate a SQL 2008 Data model into SDS, and then I'll need to map that back to my Conceptual Object model in EF. That exercise is also an upcoming blog post. And oh yeah, I need to build out the Access Control functionality so I can set up the 'how to' spec for the WCF services. Right after I finish the first draft of some other functional specs for the other applications we're designing so the QA team can start writing their test plans.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8535991219966136036?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8535991219966136036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8535991219966136036&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8535991219966136036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8535991219966136036'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/01/so-much-so-fast.html' title='So much, so fast'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-3320796157849601577</id><published>2009-01-20T08:29:00.000-08:00</published><updated>2009-01-20T08:47:13.816-08:00</updated><title type='text'>Nerd Dinner, Recap</title><content type='html'>I didn't quite know what to expect when I decided to go to my first Nerd Dinner last night.  I was a little nervous, a little intimidated, and a lot worried that I would look like a complete idiot.   I shouldn't have been nervous.  I was more in awe of the opportunity than intimidated by the folks there.  And I hope I wasn't a complete idiot.&lt;br /&gt;&lt;br /&gt;I got to meet Scott Hanselman right off the bat (He sat down next to me).  To my left, was one of the architects of VB.NET.  I spent time talking with them about LINQ to SQL and my experience with the Entity Framework, and Scott encouraged me to blog about my experience working with both in the real world.  I'll try to do that as soon as I can catch my breath and test out one more feature of EF.&lt;br /&gt;&lt;br /&gt;We shuffled seats every 15 minutes or so, and I took the opportunity to get to meet a bunch of folks on the F#, C#, VB.NET teams, as well as the Silverlight Teams (working on the Line Of Business Toolkit, something I am really excited about), and the Powershell/WPF Team.  Everyone was so friendly, and genuinely interested in hearing about my projects, and giving pointers on how to do things a little better and a little easier.&lt;br /&gt;&lt;br /&gt;The last group I sat down with included Glenn Block, the Project Lead for the Managed Extensibility Framework.  We got into a deep discussion of test driven development, something I am working on implement at my company.  He brought in a crowd of people to contribute to the discussion and I learned a lot!   I wish I had written down everyone's names to thank them later.  Here are some of the points they made, paraphrased of course.  My ehad was spinnign by this point in the evening.&lt;br /&gt;&lt;br /&gt;They stressed a couple of fundamentals for how to do it (we all understood why TDD is important).&lt;br /&gt;&lt;br /&gt;1.       There are two types of unit tests:  functional tests, and acceptance or validation tests&lt;br /&gt;2.       Functional tests should be written by the developer as they are writing the code to exercise the code they are writing.  They should still write the test before the code, but the two are written at roughly the same time.  Test what you are coding so you know why you are coding it.&lt;br /&gt;3.       Validation Tests can be written by the QA’s to test edge cases and to try things to make the dev cry, but have the benefit of being repeatable to save the QA time from needing to show the developer exactly what they did to break the code.&lt;br /&gt;&lt;br /&gt;This is a little different from my original understanding of TDD and how I had envisioned we would implement it, but they were quite clear that we were headed for trouble if we tried to let the QA’s write all the cases.  Not because the QA’s couldn’t do it, it was that the developers lost the advantages of writing their own tests to help them understand the requirements they were developing against.  It helps to make the code clear and concise and to expose code ‘smell’ early on in the process.&lt;br /&gt;&lt;br /&gt;The QA’s can still help to identify and clarify the requirements of each function, but it’s not until the developer believes they have met the functional requirements of the component that the validation tests should begin.&lt;br /&gt;  Anyway, I hope to go to many more of these dinners, and highly recommend it for anyone who wants the opporutnity to talk with, and listen to some of the really big thinkers in the development industry.  My head was spinning the whole way home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-3320796157849601577?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/3320796157849601577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=3320796157849601577&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3320796157849601577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3320796157849601577'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/01/nerd-dinner-recap.html' title='Nerd Dinner, Recap'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-1547632064416835818</id><published>2009-01-16T07:59:00.000-08:00</published><updated>2009-01-16T08:02:21.249-08:00</updated><title type='text'>Nerd Dinner</title><content type='html'>&lt;a href="http://www.hanselman.com/blog/SeattleRedmondBellevueNerdDinnerJan192009.aspx"&gt;Scott Hanselman&lt;/a&gt; is hosting the January Nerd Dinner in Bellevue, and it looks like I am going to be able to make it this time.  I'm excited to get to meet all these folks that provide so many answers to my questions.   If you see me there, and you ever read this blog, say hi if you see me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-1547632064416835818?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/1547632064416835818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=1547632064416835818&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1547632064416835818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1547632064416835818'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/01/nerd-dinner.html' title='Nerd Dinner'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8173234986537225522</id><published>2009-01-08T20:10:00.000-08:00</published><updated>2009-01-08T20:26:20.624-08:00</updated><title type='text'>A New Year</title><content type='html'>Yesterday, was the one year anniversary of starting my new job.  So at this point, I guess I can stop calling it my 'new' job, and just call it my job.&lt;br /&gt;&lt;br /&gt;Professionally, it's been a whirlwind of a year, and 2009 looks to be even more of a technical blizzard.  When 2008 started, I was pretty proficient at C#, knew Informix pretty well, and knew a lot about the airline business.  But when I made the jump from the IT division at an airline, to a position as a Senior Systems Analyst for a small software consulting firm, I viwed to learn some new skills, and to really put my nose to the grind stone for a few months to get 'caught up' on technology.   Little did I know that it's pretty much impossible to get 'caught up'.  But here's what I did get experience in during 2008.  This isn't just 'I read the book', but real, systems to production experience.&lt;br /&gt;&lt;br /&gt;1.  Visual Studio 2008&lt;br /&gt;2.  Resharper 4&lt;br /&gt;3.  LINQ to SQL&lt;br /&gt;4.  Microsoft Component Application Blocks (Version 1 for VS 2005)&lt;br /&gt;5.  The Model - View - Controller Pattern&lt;br /&gt;6.  SQL Server 2000&lt;br /&gt;7.  SQL Server 2005&lt;br /&gt;8.  ASP.NET 3.5&lt;br /&gt;9.  VB.NET&lt;br /&gt;10.  ASP.NET AJAX&lt;br /&gt;11.  SQL Reporting Services&lt;br /&gt;&lt;br /&gt;All of that before the beginning of November 2008.  I draw the line there, because in November, I started a new project that currently has me buried in the following technologies&lt;br /&gt;&lt;br /&gt;1.  WPF&lt;br /&gt;2.  Silverlight 2.0&lt;br /&gt;3.  SQL Server 2008&lt;br /&gt;4.  Team Foundation Services&lt;br /&gt;5.  MS Test &amp;amp; Test Driven Development&lt;br /&gt;6.  Microsoft Azure&lt;br /&gt;7.  Microsoft SQL Data Services&lt;br /&gt;8.  Microsoft Sync Framework&lt;br /&gt;9.  Microsoft Unity Dependency Injection Framework&lt;br /&gt;10.  Rhino Mock&lt;br /&gt;11.  Geneva / Microsoft Data Access Control Service&lt;br /&gt;12.  SQL Server CE&lt;br /&gt;13.  Microsoft Entity Framework&lt;br /&gt;&lt;br /&gt;By the end of the year, I hope to be proficient in all of these topics.  Actually, hope isn't a strong enough word.  I need to be proficient in all of these topics.  Right now, my head is spining a bit, and the new stuff is coming faster than my brain can absorb it all.  But a year ago I had no idea what LINQ was, now I can't work without it. &lt;br /&gt;&lt;br /&gt;I just have to wonder though.  If this is what I have planned, what else could possibly come along later in the year?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8173234986537225522?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8173234986537225522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8173234986537225522&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8173234986537225522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8173234986537225522'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2009/01/new-year.html' title='A New Year'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-1957985587656202369</id><published>2008-12-10T09:24:00.000-08:00</published><updated>2008-12-10T10:04:58.484-08:00</updated><title type='text'>Getting Started with Azure</title><content type='html'>Since the Microsoft PDC at the end of October, I've been tasked with digging into Windows Azure to see where it might fit into plans for a project we are working on.  I've had to merge this responsibility in with the rest of my daily responsibilities designing and building other applications, so I end up starting and stopping a lot on my research.  It's great that my job offers me not only the opportunity to do these things, but the flexibility to even consider using technologies that are barely CTP for projects that we need to deliver within the next year.&lt;br /&gt;&lt;br /&gt;I've done a lot of research, but I don't think I've even seen the tip of the iceberg yet on what is involved in designing a real, production application for Azure.  There are so many things to consider when jumping to a completely new platform, that it's not just almost overwhelming, at times it IS completely overwhelming.&lt;br /&gt;&lt;br /&gt;The best suggestion I could give someone who is just starting out, is to do the Hands On Labs for Azure.  In fact, there are all kinds of samples to try.  The difficult thing is to try to remember which ones you have done, and which ones you haven't.  If I could make one suggestion to Microsoft is that they need to pull all the various SDK's and Toolkits and Samples together into one "Cloud Computing Toolkit Package" that a developer can download once, installs into one location, and provides a unified index for finding what you need quickly.  I find it quite embarassing to post what I think is a valid question onto the MSDN forums only to find out that topic was well covered in an SDK Sample I just hadn't found yet.  I take a lot of pride in not wasting other people's time in having them do my research for me.&lt;br /&gt;&lt;br /&gt;Here's a list of the SDK's / Toolkits and samples available regarding The Microsoft Cloud&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=413E88F8-5966-4A83-B309-53B7B77EDF78&amp;amp;displaylang=en"&gt;Azure Services Kit&lt;/a&gt;:  Contains the Hands On Labs - Installs to c:\AzureServicesKit by default.  Start with this one and go through all the labs.  Every case is quite simple, but well done, thought here are a few errors in the code&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=BB893FB0-AD04-4FE8-BB04-0C5E4278D3E9&amp;amp;displaylang=en"&gt;Windows Azure SDK &lt;/a&gt;- Samples are included in a Zip file.  On my machine, this installed to C:\Program Files\Windows Azure SDK&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=83e1e30f-bd9a-4284-80a6-388ba2e768fd&amp;amp;displaylang=en"&gt;Microsoft .NET Services&lt;/a&gt; - Samples include AccessControl, Service Bus, Workflow and are installed on my machine to C:\Program Files (x86)\Microsoft .NET Services (Nov 2008 CTP) SDK&lt;br /&gt;&lt;br /&gt;Microsoft Sync Framework - C:\Program Files (x86)\Microsoft SDKs\Microsoft Sync Framework&lt;br /&gt;&lt;br /&gt;Silverlight - C:\Program Files (x86)\Microsoft SDKs\Silverlight&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/sqlserver/dataservices/cc512120.aspx"&gt;Microsoft SQL Server Data Services SDK&lt;/a&gt; - C:\Program Files (x86)\Microsoft SQL Server Data Services SDK&lt;br /&gt;&lt;br /&gt;Windows Live ID - C:\Program Files (x86)\Windows Live ID\WebAuth\Sample&lt;br /&gt;&lt;br /&gt;Windows Mobile - C:\Program Files (x86)\Windows Mobile 5.0 SDK R2&lt;br /&gt;&lt;br /&gt;I'll add more links as I find them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-1957985587656202369?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/1957985587656202369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=1957985587656202369&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1957985587656202369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1957985587656202369'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/12/getting-started-with-azure.html' title='Getting Started with Azure'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-6249050577629866379</id><published>2008-11-24T11:21:00.000-08:00</published><updated>2008-11-24T11:36:51.062-08:00</updated><title type='text'>Fun with Entity Framework</title><content type='html'>So despite spending the first 6 months of the year becoming proficient and LINQ to SQL, the realization that Microsoft was casting aside LINQ to SQL in favor of its grumpy old uncle Entity Framework made me take a serious look at the EF for my latest big project.  Luckily, it hasn't had too much of a learning curve, but I haven't gotten to the hard stuff yet either.  I'll need to pick up a book on it at some point, but I'm still thrashing my way through WPF at this time and don't need another book to read right now.&lt;br /&gt;&lt;br /&gt;One thing that frustrated the crap out of us here last week was not being able to go from a child entity to a parent entity easily.  That is, until I learned the trick.  And there's always a trick, isn't there.&lt;br /&gt;&lt;br /&gt;Say you have a collection of warehouses, and each warehouse has a collection of doors.  Given a door id (GUID), get the warehouse it is at.  The WarehouseID is foreign keyed to the Door table.&lt;br /&gt;&lt;br /&gt;You would think (based on LINQ to SQL), that you could go Door.WarehouseID or at the very least Door.Warehouse.WarehouseID... but alas, no can do.  EF hides the relationship through an object called an Entity Key.  In my brain, this was a little ridiculous, since I knew what my key was, just give it to me.&lt;br /&gt;&lt;br /&gt;But I guess this is why I don't design frameworks for a living.  The Entity Key is a dictionary collection, of all the keys that make up the relationship.  Thus, if you have more than one column in the key, the EntityKEy collection contains both keys, but you can access it to use those values with a little care.&lt;br /&gt;&lt;br /&gt;By adding a property to the Door object in a partial class, you can access the dictionary to extract the value.  If you have multiple values in your key, be careful to index the Key properly.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;public Guid WarehouseID&lt;br /&gt;{&lt;br /&gt;  get&lt;br /&gt;  {&lt;br /&gt;     return new Guid(WarehouseReference.EntityKey.EntityKeyValues[0].Value.ToString());&lt;br /&gt;  }&lt;br /&gt;  set&lt;br /&gt;  {&lt;br /&gt;    WarehouseReference.EntityKey = new EntityKey("ContextName.Warehouse", "WarehouseID", value);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-6249050577629866379?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/6249050577629866379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=6249050577629866379&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6249050577629866379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6249050577629866379'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/11/fun-with-entity-framework.html' title='Fun with Entity Framework'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-4895607135207741656</id><published>2008-11-04T10:28:00.000-08:00</published><updated>2008-11-04T10:47:23.498-08:00</updated><title type='text'>Back from the Great Beyond</title><content type='html'>Ok, I haven't been dead, I've just been time travelling.  No, really.  I jumped back in time to work on a big client project in Visual Studio 2005 using the Microsoft CAB and MVC pattern.  While I did learn quite a bit about the client's business (which is not a bad thing), it wasn't technically challenging.  In fact I slowed down on my reading of technical stuff, spent more of my free time (ok commute time), reading for fun, and writing for fun.  Yes, writing can be fun too.&lt;br /&gt;&lt;br /&gt;I also spent a lot more of my nights and weekends doing work for the project, which meant less tech reading as well.  A lot of the changes I needed to make to the client systems in preparation for the rollout had to be done off hours to minimize impact on the user. &lt;br /&gt;&lt;br /&gt;Sure, I learned a few tricks and tips in the last couple of months.  I got very familiar with the Infragistics NetAdvantage Product Set, including the UltraWinGrid (very nice) and UltraWinSchedule (a little buggy in the version I had).  But for the most part, I've been just churning code, doing database work, and doing rollouts.&lt;br /&gt;&lt;br /&gt;That project is just about over now, with final rollout scheduled for this Saturday.  My new project is all new technology, and I'm jumping in with both feet.  I've spent the last few days watching videos, reading blogs, and running sample code.&lt;br /&gt;&lt;br /&gt;What's got my attention, you ask?  Windows Azure.  Windows .NET Services.  Microsoft SQL Data Services.  WPF.  Silverlight2.  LiveMesh. Yep, 4 of those 6 things are still in CTP, and I'm jumping in with both feet.   I'm not just going to be on the bleeding edge, I'm fully stabbed in the chest, in a full out ebola like blood letting.&lt;br /&gt;&lt;br /&gt;We'll see how I feel about it in a couple of months, but right now, I'm really excited.  My night stand reading is piling up with tech books and blogs.  I'm not sure how much I'll be able to post, but I'll try to post hints, tips and other cool things to look at as I learn.&lt;br /&gt;&lt;br /&gt;By the way, the current book I'm reading is &lt;a href="http://apress.com/book/view/1590599551"&gt;Pro WPF in C# 2008&lt;/a&gt;.  I'm just a chapter or so into it, but WPF is something I need to know inside and out for this project, so expect a few blogs on that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-4895607135207741656?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/4895607135207741656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=4895607135207741656&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4895607135207741656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4895607135207741656'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/11/back-from-great-beyond.html' title='Back from the Great Beyond'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-9183078988624364268</id><published>2008-08-22T11:29:00.000-07:00</published><updated>2008-08-22T11:31:46.076-07:00</updated><title type='text'>Autocomplete Extender Lesson Learned, Part Two</title><content type='html'>It turns out that the problems with the AutocompleteExtender actually go even deeper than the dispose problem.  Or not as deep, depending on how you think about it.  At some point in my effort to make my website pretty, the problem of the extender not extending after a partial postback reappeared.  After spending a large, large amount of time on this, I found reference to another bug in the AJAXControlToolKit that happens if you programmatically set the focus back to the textbox associated with the extender control after doing a postback (partial or not).&lt;br /&gt;&lt;br /&gt;I removed the set focus statement, and I am back in business.  Again.&lt;br /&gt;&lt;br /&gt;But dude, seriously?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-9183078988624364268?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/9183078988624364268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=9183078988624364268&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/9183078988624364268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/9183078988624364268'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/08/autocomplete-extender-lesson-learned.html' title='Autocomplete Extender Lesson Learned, Part Two'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-4510196117537762495</id><published>2008-08-15T08:30:00.000-07:00</published><updated>2008-08-15T08:34:08.007-07:00</updated><title type='text'>Converting from a Web Project to Web Site</title><content type='html'>If you've converted from a VS2008 Web Project to a VS2008 Web Site, and tried to bring pages from one over to the other, you may have been stuck with the issue that your code doesn't see the objects created by the aspx.  i.e. the text boxes, the drop downs, etc.&lt;br /&gt;&lt;br /&gt;After you spend a while trying to match up namespaces, and letting Resharper fix a bunch of issues for you, you may still be stuck.&lt;br /&gt;&lt;br /&gt;Here's one thing to check:&lt;br /&gt;&lt;br /&gt;In your page directive, check to see that the compile has chnaged the&lt;strong&gt; CodeBehind &lt;/strong&gt;attribute to read &lt;strong&gt;CodeFile&lt;/strong&gt;.  That's got me twice now.  That's reason enough to blog about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-4510196117537762495?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/4510196117537762495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=4510196117537762495&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4510196117537762495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4510196117537762495'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/08/converting-from-web-project-to-web-site.html' title='Converting from a Web Project to Web Site'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-3567144506034460743</id><published>2008-08-15T08:16:00.000-07:00</published><updated>2008-08-15T08:38:13.561-07:00</updated><title type='text'>AJAXToolKit Autocomplete Extender Lesson learned</title><content type='html'>I was migrating a series of web pages from a small web project in VS2008 to a large client web site (not a web project, a web site).  One of these pages included a predicitve text field which I used the ASP.NET AJAXToolKit to implement.  The Tool kit worked almost flawlessly.  I say almost flawlessly because there is a major bug which prevents the AutoCompleteExtender from working if you host the control in an update panel and you have already done a partial page postback.&lt;br /&gt;&lt;br /&gt;Luckily Aaron Schnieder has already solved this issue.&lt;br /&gt;http://weblogs.asp.net/aaronschnieder/archive/2008/03/11/ajaxcontroltoolkit-autocompleteextender-bug-in-an-updatepanel.aspx&lt;br /&gt;&lt;br /&gt;Not sure why they haven't kicked out a new version of the tool kit onto Codeplex yet, but they haven't, so you must apply this change yourself.&lt;br /&gt;&lt;br /&gt;So after I finished migrating my pages and my web service into the web site, I went to try to run my page with my autocomplete extender, and viola - WTF?  Nothing happened.  Crap.&lt;br /&gt;&lt;br /&gt;Dork around with the pages.  Add break points.  Google a lot.  Did I recently install any VS2008 service packs?  Possibly.  Uninstall them.  Still nothing.  Google some more.  Add a new web site to my solution, with code right from the AJAXToolKit (converted to VB.NET of course).  Still nothing.  Two more hours of trial and error.  Call it a night.&lt;br /&gt;&lt;br /&gt;Log on this morning.  Dig in again.  More Googling.  Hey, what's that?  In the new Web Service code behind file I added?&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;strong&gt;' &amp;lt;System.Web.Script.Services.ScriptService()&amp;gt; _&lt;/strong&gt;&lt;/code&gt;&lt;br /&gt;How come that line is commented out?  By default?  Yikes.&lt;br /&gt;&lt;br /&gt;Remove the comment.  Try the app again.&lt;br /&gt;&lt;br /&gt;Presto.  Back in business.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-3567144506034460743?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/3567144506034460743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=3567144506034460743&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3567144506034460743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3567144506034460743'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/08/ajaxtoolkit-autocomplete-extender.html' title='AJAXToolKit Autocomplete Extender Lesson learned'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-7537008992734415118</id><published>2008-07-22T08:51:00.000-07:00</published><updated>2008-07-22T09:04:51.435-07:00</updated><title type='text'>UM, um, I mean UML</title><content type='html'>I'm taking a little break from Windows Workflow to refresh my knowledge of UML and Use Cases.  To tell the truth, I never really bought into the whole use case stuff at my previous job.  I can give a hundred excuses, all valid of course, for why I didn't believe in UML, but it was mainly because I didn't see my customers buying into the process of software development.  They wanted the software. They wanted it now.  They didn't want to do any work.  Whatever tools we used, whatever diagrams and documentation we drew up, was for our own purposes.  They never saw the use in it.  By the time the diagrams were done, there was a new crisis du jour, and the last project was already passe.&lt;br /&gt;&lt;br /&gt;But I was in a meeting with a new client last week, and one of the reasons I was being brought in to help with this project was to help build an industry standard set of requirement documents which could be handed off to the developers, whether it be my team, or someone else.  I was there to do the architecture.&lt;br /&gt;&lt;br /&gt;And on the way home that night, it hit me.  I might not be there in six months to answer a developer's questions on what was needed.  And they might take my name in vain.  And they might say that I was incompetent.  I can't afford that.&lt;br /&gt;&lt;br /&gt;So I picked up my UML book this morning and started re-reading.  Realistically, most of the stuff I already knew, but I had never formalized the terminology.  I have never put UML / Use Cases on my personal resume because I lacked this formal experience with the process.  So with the goal of not looking incompetent, and knowing that I would immediately apply this knowledge to my current daily responsibilities, I am digging in and now seeing the positive side of learning something that I consider 'non-technical'.&lt;br /&gt;&lt;br /&gt;In fact, after reading the first 5 chapters this morning, I'm convinced that I can give this book to a project manager I work with, and that with both of us using this style my consitently, we will be better able to understand each other.&lt;br /&gt;&lt;br /&gt;Who da thunk it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-7537008992734415118?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/7537008992734415118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=7537008992734415118&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7537008992734415118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7537008992734415118'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/07/um-um-i-mean-uml.html' title='UM, um, I mean UML'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2919353356854951773</id><published>2008-07-16T08:02:00.001-07:00</published><updated>2008-07-16T08:11:38.156-07:00</updated><title type='text'>Initial Impressions of Windows Workflow Foundation</title><content type='html'>In my last post, I mentioned I was reading Pro WF Windows Workflow in .NET 3.5 by Bruce Bukovics.  I also used the words Whoop-Tee-Doo. &lt;br /&gt;&lt;br /&gt;Well, I'm now 335 pages into the book, and into the concept of state machines, and this morning I finally had an 'Aha!' moment.  See I've been trying to solve a problem at work, and knew that Workflows would probably help me, but the Sequential Workflows weren't blowing my mind.  They just seemed like a lot of overhead to implement something that I could do inmany other ways.&lt;br /&gt;&lt;br /&gt;However, the State Machine Workflows are definitely something I can see real possibilities for.  I'm going to mock up my problem as a state workflow today, and see if I can get it to work.&lt;br /&gt;&lt;br /&gt;I have two concerns:&lt;br /&gt;1.  Will I be able to call a .NET 3.5 Workflow DLL from a .NET 2.0 Application.  I think so, as long as the .NET 3.5 Framework is installed on the clients (which it is)&lt;br /&gt;2.  Should I, as the architect, introduce another new technology into an application which is already difficult to support, even if it makes the problem I am trying to solve easier to solve.  I am conciously trying to not alter the core of the application because of the size of it and the cost of fixing stuff that isn't broken, but the framework of the application is really limiting what we can do, and I think I can just peel out some pieces and make the application better.  I also don't want to be the only one able to support it going forward, and if the rest of the team doesn't take their education in the new technologies as seriously as I do, I could be painting myself into a corner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2919353356854951773?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2919353356854951773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2919353356854951773&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2919353356854951773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2919353356854951773'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/07/initial-impressions-of-windows-workflow.html' title='Initial Impressions of Windows Workflow Foundation'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2012319653484614580</id><published>2008-07-14T11:05:00.000-07:00</published><updated>2008-07-14T11:11:17.277-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Printing VS2008'/><title type='text'>VS2008 Printing Issue</title><content type='html'>Today, I wanted to print a DBML Document from VS2008.  The fact that I've been using VS2008 for 6 months now, and haven't run into this shows how much printing I actually do.&lt;br /&gt;&lt;br /&gt;Anyway, I tried to print, and I kept getting an Error 'No Default Printer Istalled', which is bizarre, since I do have a default printer installed.  What it really meant was the ID I was running as (admin), had no default printer installed.  Even though I am an admin on my box, the admin user itself had to have a default printer set up.&lt;br /&gt;&lt;br /&gt;Of course, I don't have the Admin user ID and password for my machine (I've never needed it in the past), so I had to recruit one of our tech support guys to fix this.  After setting up the printer, and then switching back over to my id, everything was, whoa... still didn't work.  Huh?  Switch back over to the admin ID, test the printer.  It works.  Switch back over, restart VS2008, still nothing.&lt;br /&gt;&lt;br /&gt;Close everything, log out, log back on, openup VS2008.  Print. Ta-da!&lt;br /&gt;&lt;br /&gt;Hoep this helps save someone half an hour.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2012319653484614580?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2012319653484614580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2012319653484614580&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2012319653484614580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2012319653484614580'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/07/vs2008-printing-issue.html' title='VS2008 Printing Issue'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-295543799010946269</id><published>2008-07-04T17:01:00.000-07:00</published><updated>2008-07-06T10:59:01.668-07:00</updated><title type='text'>Back from where-ever I've been</title><content type='html'>Not that I've totally forgotten about updating this blog, but it wasn't until I started getting some people posting questions on here did I realize that, hey, someone is actually reading it! I'm going to try to get back into updating it more &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;regularly&lt;/span&gt;, though it is difficult to find time to do it when I am at work, and that's when most of my &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;technical&lt;/span&gt; tips, tricks, techniques, etc. come to me.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyway, since I last updated this site, a lot has changed. I spent pretty much the whole month of May, and most of June, heads down in developing my first major e-commerce web site. I worked with two other developers and a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;QA&lt;/span&gt;, and we started out really far behind the eight-ball due to a number of staffing issues early in the project. I was brought in to 'pound code', which isn't my normal role in projects, but it is something I do enjoy immensely.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When I say we were pounding code, I really mean it. It's been at least eight years since I've been heads down, fully dedicated to doing nothing but coding. We built 80 screens to administer the site, and the front end was over 40. We assembly-lined the project, where I did the admin site and part of the data access layer, one developer focused on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;CSS&lt;/span&gt; and doing the grunt data access layer (99.9999% in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;LINQtoSQL&lt;/span&gt;), and one developer building the security, transaction auditing and credit card processing and the front end screens. Our &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;QA&lt;/span&gt; tracked the issues and gave us feedback on every screen as it was completed (and sometimes before we completed it, to our chagrin), and we really made efficient use of time and resources. I didn't think we'd get it all done in time, but we really did, and met all of our customer's expectations, and blew them away with the site over all. Not bad for my first time. Luckily, we did have experience in the office on some of the tricks of the trade (cc processing and auditing), so we didn't have to work that all up from scratch, but still, we're pretty proud of what we got done.&lt;br /&gt;&lt;br /&gt;These days, I'm starting to dig into a Windows Forms application which was built 4 years ago in C# using the Microsoft Application Blocks 1.0.  We migrated it up to .NET 2.0 earlier this year, and now have some major enhancements to do to it.  A lot of the code is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;auto generated&lt;/span&gt; from an XML file which documents the data objects, and while I can see that it kicks out a lot of code in a hurry, it also seems to saddle the application with a lot of code which may never be used.  It does everything from creating the database objects and stored procedures to spinning up the Controllers and data objects.  There's a lot of cookie cutter code left after that to do, and it makes it fairly easy to build, but it is missing some things, like database side referential integrity and really good error handling.&lt;br /&gt;&lt;br /&gt;I've also touched on some &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Sharepoint&lt;/span&gt; development.  &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Sharepoint's&lt;/span&gt; a product which is not ready for prime time when it comes to the development environment.  It really feels kludged together and is very &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;temperamental&lt;/span&gt;.  The most often seen comment on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Sharepoint&lt;/span&gt; support blogs when discussing some weird &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Sharepoint&lt;/span&gt; behavior is 'Welcome to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Sharepoint&lt;/span&gt; Development'.  That's a really bad sign.   I was really disappointed because I'd heard such good things about it.  Hopefully &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Sharepoint&lt;/span&gt; 2008 improves the situation.&lt;br /&gt;&lt;br /&gt;My current reading is &lt;a href="http://www.amazon.com/Pro-WF-Windows-Workflow-NET/dp/1430209755://"&gt;Pro &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;WF&lt;/span&gt;: Windows &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Workflow&lt;/span&gt; in .NET 3.5 by Bruce &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;Bukovics&lt;/span&gt;&lt;/a&gt;.  I'm only in Chapter 3 right now, and while the content makes sense, I haven't yet figured out how to apply this to the real world.  I need to make a leap in my brain, and right now,  I'm only getting little hops.  I was expecting something that really blew me away.  So far, not so much.  "Visual If Statements".  Whoop-Tee-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;Doo&lt;/span&gt;.  I'm sure in 5 Chapters, I'll know it' much more than that, but that's why I read the book.  To learn.&lt;br /&gt;&lt;br /&gt;The book I'm most looking forward to reading is &lt;a href="http://www.amazon.com/Microsoft%C3%82%C2%AE-NET-Architecting-Applications-PRO-Developer/dp/073562609X/ref=wl_itt_dp?ie=UTF8&amp;amp;coliid=IMYLMBLREI6HR&amp;amp;colid=1KBL553F7KBE2"&gt;Microsoft® .NET: &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;Architecting&lt;/span&gt; Applications for the Enterprise&lt;/a&gt;.  Hopefully this helps me to put it all together so I can see the big picture better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-295543799010946269?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/295543799010946269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=295543799010946269&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/295543799010946269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/295543799010946269'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/07/back-from-where-ever-ive-been.html' title='Back from where-ever I&apos;ve been'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8419807596797296369</id><published>2008-04-03T21:06:00.000-07:00</published><updated>2008-04-03T21:19:33.392-07:00</updated><title type='text'>Another book completed</title><content type='html'>I finished reading Code Complete 2 today, another book in my quest to bring my technical skills into the 21st century.  Definitely a worthwhile book to read, especially for the beginning programmer, though it is already 4 years old.  I worked a long time in C and C++ and I've seen many of the debates which the author discusses actually happen.&lt;br /&gt;&lt;br /&gt;That said, I found myself wanting something different at this point in my reading life.  I want to read more about projects in industry which have failed, and ones that have succeeded.  I want to read about the post mortems which are done on those projects.  At my previous job, the developers always wanted to do post mortems, but they never happened, for one reason or another.  I think the view was that management thought they would turn into massive bitch sessions, whereas developers didn't expect things to actually ever change, so they never pushed the issue very hard.  I am going to reread The Mythical Man Month sometime in the near future.  I first read it back in 1994, just out of college and into the workplace.  It will be interesting to see how I relate to it now.&lt;br /&gt;&lt;br /&gt;The other thing I wanted was a book that got into the design issues specifically surrounding C#.   I've still got more searching to do to find that book.  I'm not sure if I'm looking for a design patterns book, a Nutshell book, a recipes book, or something else entirely, but I know I still have a lot to learn about application development in the .NET world.&lt;br /&gt;&lt;br /&gt;I am starting my reread of ASP.NET 3.5 with C# 2008, and I figure that will take me till the end of the month.  Sure I only finished it a month and a half ago, but I'm knee deep in a major ASP.NET project, and it's the perfect time to reinforce the skills I learned earlier.&lt;br /&gt;&lt;br /&gt;I plan to get back to writing more frequently here again.  It's not that I'm not working hard, it's that I kind of got into the flow of my new job, and for a brief period, thought I knew what I was doing.  Now that I'm back into ASP.NET, there are all new mistakes to make and lessons to learn, so expect more posts, soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8419807596797296369?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8419807596797296369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8419807596797296369&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8419807596797296369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8419807596797296369'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/04/another-book-completed.html' title='Another book completed'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8052230275116823329</id><published>2008-03-13T13:43:00.000-07:00</published><updated>2008-03-13T13:46:15.890-07:00</updated><title type='text'>Type inference in .NET 3.0</title><content type='html'>One of the things I am having a hard time wrapping my head around is why one of the recommendations of Resharper 4.0 is to implicitly type all local variables.  It goes against my anal retentive nature for clean, easy to read code.&lt;br /&gt;&lt;br /&gt;The following article tries to explain the benefits of this practice, though I’m not sure they have me convinced though I have, at times, found myself annoyed with the redundant declarations of a new variable&lt;br /&gt;&lt;br /&gt;i.e. &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Dictionary&amp;lt;SearchCriteriaType, SearchCriteriaDisplay&amp;gt; criteriaDisplays = new Dictionary&amp;lt;SearchCriteriaType, SearchCriteriaDisplay&amp;gt;();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Can be shortened to &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var criteriaDisplays = new Dictionary&amp;lt;SearchCriteriaType, SearchCriteriaDisplay&amp;gt;();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I guess that makes the code less cluttered.  But is life really that much bad with the previous example that the Resharper folks found the need to suggest that it is now best practice?&lt;br /&gt;&lt;br /&gt;http://www.programmersheaven.com/2/CSharp3-1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8052230275116823329?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8052230275116823329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8052230275116823329&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8052230275116823329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8052230275116823329'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/03/type-inference-in-net-30.html' title='Type inference in .NET 3.0'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-7424862657778696281</id><published>2008-03-12T08:04:00.001-07:00</published><updated>2008-03-12T08:10:28.743-07:00</updated><title type='text'>Visual Studio 2008 Error after upgrade</title><content type='html'>I needed some capabilities from VS2008 DB Edition to go with my VS2008 TA (Team Architect, not whatever other acronym starts with T&amp;A), so I slapped a copy of that onto my machine this morning.&lt;br /&gt;&lt;br /&gt;However, when I fired up VS2008, it started briefly, and then crashed.  It did this a few times in a row, and I checked the event log.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;.NET Runtime version 2.0.50727.1434 - Fatal Execution Engine Error (79FEC5F0) (80131506)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ruh-Roh Shaggy.  Time to reboot.&lt;br /&gt;&lt;br /&gt;Try it again.  Same problem.&lt;br /&gt;&lt;br /&gt;We're in trouble now, Scoob.&lt;br /&gt;&lt;br /&gt;After searching the web for a bit, I came across starting the app in SafeMode. with the/safemode switch.  That worked.  I let the app load up, then I closed it back down, removed the /safemode switch, and presto, back in business.&lt;br /&gt;&lt;br /&gt;I think it has to do with my recent installation of Resharper 4.0 EAP, since the app was dying trying to load the toolbox items.  We'll see if it happens again the next time I do an upgrade.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-7424862657778696281?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/7424862657778696281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=7424862657778696281&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7424862657778696281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/7424862657778696281'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/03/visual-studio-2008-error-after-upgrade.html' title='Visual Studio 2008 Error after upgrade'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2938782913969470440</id><published>2008-03-11T08:13:00.000-07:00</published><updated>2008-03-11T08:17:20.892-07:00</updated><title type='text'>SQL Thief - Last Modified Stored Procs</title><content type='html'>I will admit that what I am about to put here, I stole from &lt;a href="http://blog.sqlauthority.com/2007/07/10/sql-server-2005-list-all-stored-procedure-modified-in-last-n-days/"&gt;Pinal Dave's &lt;/a&gt; site.  Nonetheless, I use these scripts quite frequently, but have a hard time finding them on line (you have to remember just the right search word, and I always forget to bookmark them).  So for my quick reference&lt;br /&gt;&lt;br /&gt;Here's how to get a list of all stored procedures modified in the last x days&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;SELECT name&lt;br /&gt;FROM sys.objects&lt;br /&gt;WHERE type = 'P'&lt;br /&gt;AND DATEDIFF(D,modify_date, GETDATE()) &lt; 7 --Change 7 to any other day value.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The following script will provide name of all the stored procedure which were created in last 7 days, they may or may not be modified after that.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;SELECT name&lt;br /&gt;FROM sys.objects&lt;br /&gt;WHERE type = 'P'&lt;br /&gt;AND DATEDIFF(D,create_date, GETDATE()) &lt; 7 --Change 7 to any other day value&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2938782913969470440?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2938782913969470440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2938782913969470440&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2938782913969470440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2938782913969470440'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/03/sql-thief-last-modified-stored-procs.html' title='SQL Thief - Last Modified Stored Procs'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-1193625391641083521</id><published>2008-03-10T19:13:00.000-07:00</published><updated>2008-03-10T19:36:09.643-07:00</updated><title type='text'>Dude, you're such a Tool</title><content type='html'>Yes, half the fun of blogging is coming up with good titles.  This, post, as it so clear states, is about tools.&lt;br /&gt;&lt;br /&gt;As a .NET developer, I take no shame in using as many tools as I can to make my day easier.  Here are as many as I can think of.  Most of them you will know, some you may have heard of, and some you'll think to yourself, why isn't he using xxxxx.  Well, I want to know about xxxx, so if you don't see it listed here (and it pertains to something I would need at WORK, let me know.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Visual Studio 2008 (of course, and 2005, and ack, sometimes 2003).  LINQ in 2008 is quickly becoming my most important coding skill.  Frankly, it had me at Hello, and I've been it's query biatch ever since&lt;/li&gt;&lt;br /&gt;&lt;li&gt;SQL Server Management Studio - if you aren't working in SQL server these days, what, are you stuck in 1995?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;NUnit - Test driven development is getting a hold of me, and I like it!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;CruiseControl.NET - To know it is to be the only one in the office who cares, but it makes my life a lot easier in the long run&lt;/li&gt;&lt;br /&gt;&lt;li&gt;NAnt - Part of my suite of build tools&lt;/li&gt;&lt;br /&gt;&lt;li&gt;FireFTP - Mozilla add on for FTP. Great little tool&lt;/li&gt;&lt;br /&gt;&lt;li&gt;FireBug - Mozilla add on for debugging web pages and css files&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fiddler - Helps for debugging http traffic.  Ethereal is another good tool to.  I just haven't used it lately&lt;/li&gt;&lt;br /&gt;&lt;li&gt;.NETReflector - Lost the source code for a .NET dll?  Run it through Reflector to get it back.   Want to compare two versions of a .NET dll to see what changed?  Run it through Reflector&lt;/li&gt;&lt;br /&gt;&lt;li&gt;ummm Visual Source Safe - better than nothing I guess. Slightly better.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;asp.net AJAX Toolkit 3.5.  I've been really getting into AJAX this week, and it's pretty cool, though it does not seem very forgiving.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;One of the tools I am going to try soon is called Resharper.  I've heard really good things about it, and I'm pretty sure it will save me time, but it is quite expensive, and I just want to make sure I'm going to use it.  Time to get the trial licence, and give it a whirl.&lt;br /&gt;&lt;br /&gt;Anyway, that's pretty much what I sue on a day to day basis (that, plus google to help me find blogs that fix my bugs).  &lt;br /&gt;&lt;br /&gt;What am I missing?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-1193625391641083521?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/1193625391641083521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=1193625391641083521&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1193625391641083521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/1193625391641083521'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/03/dude-youre-such-tool.html' title='Dude, you&apos;re such a Tool'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2828743242729299664</id><published>2008-03-07T14:20:00.000-08:00</published><updated>2008-03-07T14:25:44.398-08:00</updated><title type='text'>Can I By a Val please Vanna</title><content type='html'>File this under gosh darn whacky wastes of time&lt;br /&gt;&lt;br /&gt;If you have a web service written in VB.NET which has functions which are called by ASP.NET AJAX scripts, don't ever declare the values in the function declaration as ByRef.  Use ByVal instead.  &lt;br /&gt;&lt;br /&gt;ASP.NET AJAX will show a Method 500 error and you'll spend much time trying to find out why that one call doesn't work.&lt;br /&gt;&lt;br /&gt;Again, the side effects of relearning VB.NET&lt;br /&gt;&lt;br /&gt;Oh joy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2828743242729299664?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2828743242729299664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2828743242729299664&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2828743242729299664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2828743242729299664'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/03/can-i-by-val-please-vanna.html' title='Can I By a Val please Vanna'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2173293803210076477</id><published>2008-03-07T07:10:00.000-08:00</published><updated>2008-03-07T07:34:14.183-08:00</updated><title type='text'>You insensitive bastard</title><content type='html'>Here's a really simple function that uses LINQ and will throw a bizarre exception when written in VB.NET.  The exact same function, written in C# will work perfectly.&lt;br /&gt;&lt;br /&gt;First, create a simple class&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;Public Class SearchCriteria&lt;br /&gt;    Public GroupName As String&lt;br /&gt;    Public Keyword As String&lt;br /&gt;End Class&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then, add the following function to an NUnit test harness using VB.NET&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;    &lt;Test()&gt; Public Sub BadList()&lt;br /&gt;        Dim searchCriteria As New List(Of SearchCriteria)&lt;br /&gt;&lt;br /&gt;        Dim distinctSearchCriteria As New List(Of SearchCriteria)&lt;br /&gt;&lt;br /&gt;        distinctSearchCriteria = searchCriteria.Distinct()&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Running that code, results in the following exception&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;System.InvalidCastException : Unable to cast object of type '&lt;DistinctIterator&gt;d__80`1[SearchCriteria]' to type 'System.Collections.Generic.List`1[SearchCriteria]'.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Do you see why?  Since it's been a long time since I've done VB.NET, it took me a while to figure this out.  Of course my code wasn't that simple, but here's the solution:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;    &lt;Test()&gt; Public Sub BadList()&lt;br /&gt;        Dim searchCriteriaList As New List(Of SearchCriteria)&lt;br /&gt;&lt;br /&gt;        Dim distinctSearchCriteria As New List(Of SearchCriteria)&lt;br /&gt;&lt;br /&gt;        distinctSearchCriteria = searchCriteriaList.Distinct()&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It goes back to VB.NET not being case sensitive.  Declaring a variable with the same name as the class (albeit a different case), confused the hell out of the runtime engine.  &lt;br /&gt;&lt;br /&gt;This is just one of the many reasons I prefer C# to VB.NET.  But the client wants the development done in VB.NET, so I get to (re)learn another language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2173293803210076477?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2173293803210076477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2173293803210076477&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2173293803210076477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2173293803210076477'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/03/you-insensitive-bastard.html' title='You insensitive bastard'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-4525808746208981393</id><published>2008-03-06T07:41:00.000-08:00</published><updated>2008-03-06T07:49:46.415-08:00</updated><title type='text'>Book on Pre-Order</title><content type='html'>I don't think I have ever put a technical book on Pre-Order before, but I did just that this morning for &lt;a href="http://www.amazon.com/LINQ-Object-Relational-Mapping-2008/dp/1590599659/ref=pd_bbs_sr_3?ie=UTF8&amp;s=books&amp;qid=1204818039&amp;sr=8-3"&gt;LINQ Object Relational Mapping&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I can honestly say that I spend hours every working day thinking about ORM.  In fact, a large percentage of my time over the past 4 years has been trying to map database tables to usable objects and to try to find a good architecture for applications that really works in the real world.&lt;br /&gt;&lt;br /&gt;I have really high hopes for this book, and deep fears as well.  I'm hoping I read it and think "I can just tweak a little bit of my design here and there and I'll be right on track."  &lt;br /&gt;&lt;br /&gt;I'm fearing that I'll read it and either a) not know what the hell they are talking about and realize I am still in way over my head, it's time to start flipping burgers, b) OMFG, this is better than what I have by a huge factor.  I have to rebuild everything, or c) WTF, do none of these guys who write these books ever spend time in the real world?  With most books, it's a little of all of these at one point or another.&lt;br /&gt;&lt;br /&gt;I guess I'll just have to wait and see.  The book is scheduled to be released April 28, 2008.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-4525808746208981393?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/4525808746208981393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=4525808746208981393&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4525808746208981393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4525808746208981393'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/03/book-on-pre-order.html' title='Book on Pre-Order'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-6708305393130368294</id><published>2008-03-05T12:28:00.000-08:00</published><updated>2008-03-05T12:51:44.981-08:00</updated><title type='text'>NAnt and .Net Framework 3.5</title><content type='html'>When I went to build my first LINQ application on our build server running CruiseControl.NET, the first message I got was:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Solution file error MSB5014: File format version is not recognized.  MSBuild can only read solution files between versions 7.0 and 9.0, inclusive&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I figured all I needed to do was to force NAnt to use the .NET 3.5 Framework, so I added a line to the NAnt Script as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;property name="nant.settings.currentframework" value="net-3.5"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;However, then I got the following message&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Target framework could not be changed. "net-3.5" is not a valid framework identifier. Valid values are: net-2.0, net-1.1.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So after a little digging on the net, I found that the version of NAnt we were using (0.84) did not yet handle the .NET 3.5 Framework.  However there is a Beta version of the 0.86 NAnt tool available, so I downloaded that and installed it to my build server (copied it actually, there is no installer)&lt;br /&gt;&lt;br /&gt;The I got the following error&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Object reference not set to an instance of an object.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Hmmm.  I cleaned up my build server, removing all previous versions of NANT, copied the files from 0.86 back into my NAnt directory, and tried again.  Same problem. &lt;br /&gt;&lt;br /&gt;Next, I downloaded the latest nightly build from SourceForge and tried my build again&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Invalid element &lt;msbuild&gt;. Unknown task or datatype.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;WTF!?  Where the hell did my msbuild task go?  Panic strikes.  OMG, I just killed our build server!  My boss is gonna kill me!&lt;br /&gt;&lt;br /&gt;After a little digging, it turns out that when I cleaned up my server, I'd also removed the latest NAntContrib bin directory, where the msbuild task comes from.  So I downloaded the latest NAntContrib package, copied the files to the NAnt directory.&lt;br /&gt;&lt;br /&gt;And.... PRESTO!  Project building!  Well at least it would have been if I hadn't had a path error in my NUnit task.  A quick fix, recheck the file into (gah) Visual Source Safe, and a green build light made me feel all warm and fuzzy inside.&lt;br /&gt;&lt;br /&gt;All that took me a good chunk of my morning.  It would be really nice if SourceForge offered a standard install with the latest NAnt and NAntContrib packaged together for us lazy asses who don't really have 4 hours to blow on getting a build running.&lt;br /&gt;&lt;br /&gt;I think that's the number one argument against build servers is how long it takes to set them up.  The time they end up saving is tremendous, but you have to be really determined to get it done, and then cross your fingers that you have accurately documented every step in the setup so it doesn't take so freaking long the next time.&lt;br /&gt;&lt;br /&gt;My next task... upgrade CruiseControl 1.2.1 to 1.3, though I have heard rumors circulating about CCNET 1.4.  Maybe I'll wait till then, and get some real work done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-6708305393130368294?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/6708305393130368294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=6708305393130368294&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6708305393130368294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/6708305393130368294'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/03/nant-and-net-framework-35.html' title='NAnt and .Net Framework 3.5'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5921423439536201862</id><published>2008-03-05T09:11:00.000-08:00</published><updated>2008-03-05T09:41:46.721-08:00</updated><title type='text'>ThinqLinq</title><content type='html'>I'm not exactly reading a book a week, but it is close.  This morning, I finished the Pro-LINQ C#2008 book by Joseph Rattz.  A lot of it is a reference manaul which I will be frequently breaking open while coding LINQ, but I definitely feel more comfortable in using LINQ now than I was a couple of weeks ago.  I haven't gotten to the point of ThinqLinq (I just coined that term, I should copyright it.) *Note:  I just found a website that already uses the term ThinqLinq.  Guess I won't be getting rich on that one.&lt;br /&gt;&lt;br /&gt;I'll define ThinqLinq as being able to code database queries directly in LINQ without first thinking in SQL.  I think it actually works to my advantage that I am relatively new to SQL Server, with most of my database experience being in Informix and Oracle, so the transition to SQL Server is being done at the same time as I am learning LINQ.  &lt;br /&gt;&lt;br /&gt;One of the dangers of learning a new language (and that's what LINQ is to me), is that you can become proficient at the language, but it may take a while to learn how to architect an application properly using it.  LINQ removes months of development effort for the data access layer, and that speed may encourage bad design.  Not because you want to make a bad design, but because you aren't in the code long enough during the development cycle to know it is bad design.&lt;br /&gt;&lt;br /&gt;To me, bad design has two definable results:&lt;br /&gt;1.  Poor performance.  In some cases this is obvious right away,in some cases it isn't until much further down the road when you see your database load go up unexpectedly as your app reaches critical mass&lt;br /&gt;&lt;br /&gt;2.  High code maintenance costs.  The idea behind a good design should be that future changes should take much less time than the original effort.  But if your original effort on an application was less than a day, is there really a long term payback of spending three weeks doing a huge design effort to extract ten lines of code into another class?  Purists will say yes, always.  Realists, working with real deadlines and real customers will say it depends.&lt;br /&gt;&lt;br /&gt;I think what it comes to is that only experience with a new language will tell you what is and what isn't a good design.  Start simple.  Don't try to out guess the code or the user.  Prioritize optimization based on the critical nature of the code and the size of the project.  As you learn a better technique, keep a list of places where you may want to refactor existing code using that technique, and check your list frequently to see if any of those tips apply to what you are doing.&lt;br /&gt;&lt;br /&gt;Here are my current best practices for LINQ&lt;br /&gt;1.  Don't try to write a best practice until you tried something at least twice&lt;br /&gt;&lt;br /&gt;2.  Never alter the autogenerated code created by SQL-Metal.  Use the partial classes instead&lt;br /&gt;&lt;br /&gt;3.  Always implement your data relationships on your database.  If it doesn't have any, you will save time by going inand adding them as you need them in your LINQ applications.  Undoubtedly you will need them later, and the foreign key relation ships defined on the database make it easier for new developers to navigate through a large database.&lt;br /&gt;&lt;br /&gt;4.  Don't try to do everything in one query.  If you need to break things out into more than one query for readability or speed, do it.  Even if it seems that multiple queries will result in a lot of extra database traffic, give it a try.  You may be suprised at how much better the split queries acually perform, especially if you can cache the results of one of the queries.&lt;br /&gt;&lt;br /&gt;5.  NUnit is your friend.  Write lots of test cases.  Write them before you write your LINQ code.  You'll need every case you can get your hands on.&lt;br /&gt;&lt;br /&gt;My next LINQ goal is to understand how it fits in with tools like SubSonic and the Entity Framework, but for now, I'm just going to focus on mastering LINQ, and learning to ThinqLinq&lt;br /&gt;&lt;br /&gt;The next book on my reading list is Programming SQL Server 2005.  I need to brush up on the SQL Server basics, and fill in some of my knowledge gaps.  I don't think there will be anything earth shattering in it, just a lot of 'Oh, that's cool' things that I could never have done in Informix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5921423439536201862?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5921423439536201862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5921423439536201862&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5921423439536201862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5921423439536201862'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/03/thinqlinq.html' title='ThinqLinq'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-4505830407992892906</id><published>2008-03-03T09:21:00.001-08:00</published><updated>2008-03-03T09:26:47.573-08:00</updated><title type='text'>Log4Net in VS2005 Web Application</title><content type='html'>Here's a &lt;a href="http://blog.emanuelebartolesi.com/post/2007/12/Log4net-Simple-way-to-use-in-your-Aspnet-application.aspx"&gt;link to a blog post &lt;/a&gt;on setting up log4net in a Visual Studio 2005 web application.&lt;br /&gt;&lt;br /&gt;The real trick to this is to make sure that there is a global.asax file in the applciation and to add the following line to the Application_Start method&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;log4net.Config.XmlConfigurator.Configure();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The rest of the configuration is pretty straight forward.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-4505830407992892906?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/4505830407992892906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=4505830407992892906&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4505830407992892906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/4505830407992892906'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/03/log4net-in-vs2005-web-application.html' title='Log4Net in VS2005 Web Application'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-5599900150753889228</id><published>2008-02-28T06:37:00.000-08:00</published><updated>2008-02-28T06:54:55.420-08:00</updated><title type='text'>.NET Extensions Anyone?</title><content type='html'>If you haven't seen .NET extension methods in action, they're pretty interesting.  What are they, you ask?  Let's say you have an existing .NET class provided by an external vendor.  Let's say that vendor is Microsoft.  You want to add a new function to, I don't know, lets say the string class.  There's not a hope in hell that you'll get Microsoft to add it for you.&lt;br /&gt;&lt;br /&gt;Of course, you could build your own string class, override one of the existing functions, or add a new one, but that seems like a lot of work.  Here's an easy way to add a new function to the class, without having to use inheritance at all.  And the best part is that within seconds, this class will show up in your Intellisense.&lt;br /&gt;&lt;br /&gt;This function must be in a static class, and part of your own project / namespace or compiled into a DLL while you include in your project.  &lt;br /&gt;&lt;br /&gt;I wrote this function as I have been trying to find an efficient way to build dynamic Lambda queries for LINQTOSQL, but unfortunately, this won't work as 'FindWickedString' is not a function which can be interpreted by SQL Server, and the lambda function I am building executes on SQL Server.  So I'll keep digging on the dynamic lambdas, but this is fun as an exercise.  Wait. Did I say coding was fun.  Egads. I meant work.&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: Consolas, "Courier New", Courier, Monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; WildcardMethod { Contains, StartsWith, EndsWith, Exact }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Extensions&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; FindWickedString(&lt;span class="kwrd"&gt;this&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt; checkValue, WildcardMethod method)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (method)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span class="kwrd"&gt;case&lt;/span&gt; WildcardMethod.Contains:&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt;.Contains(checkValue))&lt;br /&gt;                                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                        }&lt;br /&gt;                    &lt;span class="kwrd"&gt;case&lt;/span&gt; WildcardMethod.StartsWith:&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt;.StartsWith(checkValue))&lt;br /&gt;                                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                        }&lt;br /&gt;                    &lt;span class="kwrd"&gt;case&lt;/span&gt; WildcardMethod.EndsWith:&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt;.EndsWith(checkValue))&lt;br /&gt;                                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                        }&lt;br /&gt;                    &lt;span class="kwrd"&gt;case&lt;/span&gt; WildcardMethod.Exact:&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == checkValue)&lt;br /&gt;                                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                    &lt;span class="kwrd"&gt;default&lt;/span&gt;:&lt;br /&gt;                        &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-5599900150753889228?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/5599900150753889228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=5599900150753889228&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5599900150753889228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/5599900150753889228'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/02/net-extensions-anyone.html' title='.NET Extensions Anyone?'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-3934360960298193117</id><published>2008-02-27T08:55:00.000-08:00</published><updated>2008-02-27T08:58:39.439-08:00</updated><title type='text'>PredicateBuilder</title><content type='html'>One of the really cool LINQ tools out there is PredicateBuilder by Joseph Albahari.  http://www.albahari.com/nutshell/predicatebuilder.html&lt;br /&gt;&lt;br /&gt;His book is next on my reading list, but I am already using PredicateBuilder as part of my current project with is a dynamic query engine for a billing systm.&lt;br /&gt;&lt;br /&gt;The only difficulty I am having is passing in column names dynamically.  The consensus is that this can't be done, but that doesn't stop me from trying (or at least whining about it)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-3934360960298193117?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/3934360960298193117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=3934360960298193117&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3934360960298193117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3934360960298193117'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/02/predicatebuilder.html' title='PredicateBuilder'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-3169118796971508736</id><published>2008-02-27T08:02:00.001-08:00</published><updated>2008-02-27T08:15:01.578-08:00</updated><title type='text'>Fun with LINQ</title><content type='html'>I've really been getting into LINQ these days.  I'm currently reading Pro LINQ by Joseph Rattz.  The writing style is not a good as the Pro ASP.NET 3.5 book I've previously raved about, but there is a chance that this book is just covering a muchmore difficult topic.&lt;br /&gt;&lt;br /&gt;If you haven't ready about LINQ yet, do so.  It is coming to a Visual Studio near you.  Even if you don't use SQL Server, you can still use it for XML, DataSets and anything that inherits from IEnumerable&lt;T&gt;.&lt;br /&gt;&lt;br /&gt;But I do fear that the downside of LINQ is that Microsoft is about to lose a lot of developers because of it.  As easy as it is, it is also very, very difficult. 75% of the developers will look at the syntax, the ridiculous numbers of &lt; and &gt;, and run back to hand coding SQL statements and returning plain old data readers.  The problem lies in the fact that LINQ Expressions are extremely difficult to read.  They're powerful, yes, but the numbers of function delegates and advanced concepts of the .NET Framework that LINQ requires you to know in order to go beyond the most simple queries is a little frustrating.  &lt;br /&gt;&lt;br /&gt;I'm sure that with time, we will grow use to reading Lambda expressions just like we read regular code, but I think a large percentage of developers will be scared off from the syntax and will never try.  They will stay with their tried and true methods of data access, and count the days to retirement.  I don't blame them.  A new concept like LINQ or NHibernate or The Entity Framework comes along every year.  I skipped a whole generate of these tools, and here I am, now working in LINQ.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-3169118796971508736?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/3169118796971508736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=3169118796971508736&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3169118796971508736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/3169118796971508736'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/02/fun-with-linq.html' title='Fun with LINQ'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2665190128259569345</id><published>2008-02-27T07:57:00.000-08:00</published><updated>2008-02-27T08:02:14.331-08:00</updated><title type='text'>Visual Studio Tip - TODO</title><content type='html'>Here's a tip that seems pretty obvious, but I've never used it before, and it's really useful, especially if you are going to hand code off to someone else to finish&lt;br /&gt;&lt;br /&gt;Add a comment line to your code as follows&lt;br /&gt;&lt;br /&gt;// TODO - Add a task to complete here&lt;br /&gt;&lt;br /&gt;Then, go to the main menu bar, and select View - Task list.  In the task list Window, there si a drop down list that says either Comments or User Tasks.  Switch to comments.  TADA! TODO!&lt;br /&gt;&lt;br /&gt;Quick, easy, and professional!  No more sticky notes or long emails about what is left to do.  And it gets tracked with your source control so you can see who made the change and when.  You are use isource control, right?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2665190128259569345?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2665190128259569345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2665190128259569345&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2665190128259569345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2665190128259569345'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/02/visual-studio-tip-todo.html' title='Visual Studio Tip - TODO'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2357928146758597612</id><published>2008-02-20T09:39:00.001-08:00</published><updated>2008-02-20T09:49:15.539-08:00</updated><title type='text'>Recent Reading</title><content type='html'>I recently finished my first pass of ASP.NET 3.5 in C#2008 by MacDonald and Szpuszta.  What an amazing book.  I learned something new on just about every page.  It's a pain in the but to lug this monster around every day (it's 1500 pages), but I learned so much that I consider it required reading for developers trying to get caught back up with technology if you've been stuck in a rut.&lt;br /&gt;&lt;br /&gt;I've also almost completed reading Head First HTML with CSS and XHTML.  The first half of this book wasn't anythingnew to me, but the second half really helped get me up to speed with CSS and since that is exactly what I am working in this week, it is really helping.  It's a very quick read.  I'm getting through about 200 pages a day (there are a lot of graphics).  The Head First series isn't for everyone, and I thought I'd give it a try.  It's great for doing catch up on technology, but I wouldn't use it to try to learn some huge new concept.  &lt;br /&gt;&lt;br /&gt;I'm debating what will be my next work topic to read about.  It may be Code Complete 2 or perhaps Programming SQL Server 2005, or maybe a book specializing on LINQ.&lt;br /&gt;&lt;br /&gt;I can't believe how much reading I am able to get done while riding the Sounder back and forth to work.  It would have taken me a year to work through ASP.NET 3.5 at home.  I'm definitely in the learning groove, and on track to get caught back up on the technology I need to do my job.&lt;br /&gt;&lt;br /&gt;And the writing bug is hitting again. YAY!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2357928146758597612?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2357928146758597612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2357928146758597612&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2357928146758597612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2357928146758597612'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/02/recent-reading.html' title='Recent Reading'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2969751319514957550</id><published>2008-02-20T09:36:00.000-08:00</published><updated>2008-02-27T08:15:49.449-08:00</updated><title type='text'>CSS Path Lesson Learned</title><content type='html'>Situation:&lt;br /&gt;&lt;br /&gt;A graphic I was trying to display in the main page header on a website was not showing up.  The header was build via a CSS page.  All other graphics on the page were working.&lt;br /&gt;&lt;br /&gt;Solution:  CSS background:image links must be specified with the path from the css file, not from the page using it. (DUH)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-2969751319514957550?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/2969751319514957550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=2969751319514957550&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2969751319514957550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/2969751319514957550'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/02/css-path-lesson-learned.html' title='CSS Path Lesson Learned'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-8898312182989677189</id><published>2008-01-14T21:35:00.000-08:00</published><updated>2008-01-14T21:46:38.200-08:00</updated><title type='text'>Recent Reading</title><content type='html'>I just finished reading &lt;a href="http://www.amazon.com/Microsoft-Server-2005-Reporting-Services/dp/0072262397/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1200375399&amp;sr=8-1"&gt;Microsoft SQL Server 2005 Reporting Services 2005 &lt;/a&gt;by Brian Larson.  It's a pretty good introductory book, and after reading the first 11 chanpters, and skimming the last couple, I think I've got a pretty good idea on how to get started with SSRS2005.  Unfortunately, by the time I actually get to use any of this, we'll probably be on SSRS2008, and I'll have to get the next version, but hopefully there won't be a lot of changes.&lt;br /&gt;&lt;br /&gt;I'm currently digging into SQL Server Free Text searching and other search engines to be used for searching relational databases.  The SQL Free Text search has a few major downsides:&lt;br /&gt;1.  It can only index one database&lt;br /&gt;2.  You need to actively update the database indexes on a schedule, or the search will not get accurate information&lt;br /&gt;3.  You need to specify the columns to include in your searches through your indexing.&lt;br /&gt;&lt;br /&gt;This may still work to do what I need, but there will be a lot more effort than originally planned.&lt;br /&gt;&lt;br /&gt;I am also researching and comparing LINQ, CSLA, NHibernate and the Microsoft Entity Frameworks for use in my data layers.  No winners yet, as they all offer benefits.  The biggest loser in using these tools is WCF, since using WCF removes a great deal of the capabilities built into each of these tools for CRUD operations.&lt;br /&gt;&lt;br /&gt;Finally, I've been cracking open Visual Studio 2008, mainly to look at LINQ and new ASP.NET functionality.&lt;br /&gt;&lt;br /&gt;More to learn, always more to learn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7949267671212594224-8898312182989677189?l=devscape.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devscape.blogspot.com/feeds/8898312182989677189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7949267671212594224&amp;postID=8898312182989677189&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8898312182989677189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7949267671212594224/posts/default/8898312182989677189'/><link rel='alternate' type='text/html' href='http://devscape.blogspot.com/2008/01/recent-reading.html' title='Recent Reading'/><author><name>JB</name><uri>http://www.blogger.com/profile/08085754663631271944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_12eTh49TeCk/SnElVZGoQWI/AAAAAAAAAec/ws675C8Dc_c/S220/DSC_0214.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7949267671212594224.post-2645426932828899887</id><published>2007-12-21T07:18:00.000-08:00</published><updated>2007-12-21T07:19:25.351-08:00</updated><title type='text'>Custom Soap Fault</title><content type='html'>Here's some code to Build a custom soap exception so you don't return a standard Exception from a web service.  I'm sure there are better ways to do this these days, but I've been using this for 4 years.&lt;br /&gt;&lt;br /&gt;#region BuildSoapFault&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Build a custom soap error message&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name="message"&gt;The string to add to the message&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;A Soap Exception&lt;/returns&gt;&lt;br /&gt;///&lt;br /&gt;private SoapException BuildSoapFault(string message)&lt;br /&gt;{&lt;br /&gt;// Build the detail element of the SOAP fault.&lt;br /&gt;System.Xml.XmlDocument doc = new System.Xml.XmlDocument();&lt;br /&gt;System.Xml.XmlNode node = doc.CreateNode(XmlNodeType.Element,&lt;br /&gt;SoapException.DetailElementName.Name,SoapException.DetailElementName.Namespace);&lt;br /&gt;// Build specific details for the SoapException.&lt;br /&gt;// Add first child of detail XML element.&lt;br /&gt;System.Xml.XmlNode details =&lt;br /&gt;doc.CreateNode(XmlNodeType.Element, "mySpecialInfo1",&lt;br /&gt;"http://tempuri.org/");&lt;br /&gt;System.Xml.XmlNode detailsChild =&lt;br /&gt;doc.CreateNode(XmlNodeType.Element, "childOfSpecialInfo",&lt;br /&gt;"http://tempuri.org/");&lt;br /&gt;details.AppendChild(detailsChild);&lt;br /&gt;// Add second child of detail XML element with an attribute.&lt;br /&gt;System.Xml.XmlNode details2 = doc.CreateNode(XmlNodeType.Element, "mySpecialInfo2",&lt;br /&gt;"http://tempuri.org/");&lt;br /&gt;XmlAttribute attr = doc.CreateAttribute("t", "attrName",&lt;br /&gt;"http://tempuri.org/");&lt;br /&gt;attr.Value = "attrValue";&lt;br /&gt;details2.Attributes.Append(attr);&lt;br /&gt;// Append the two child elements to the detail node.&lt;br /&gt;node.AppendChild(details);&lt;br /&gt;node.AppendChild(details2);&lt;br /&gt;SoapException se = new SoapException(message,&lt;br /&gt;SoapException.ServerFaultCode,&lt;br /&gt;Context.Request.Url.AbsoluteUri ,&lt;br /&gt;node);&lt;br /&gt;return se;&lt;br /&gt;}&lt;br /&gt;#endregion&lt;div class="blogger-post-footer"&gt;&lt;img wid
