<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkMDSXY-eyp7ImA9WhRVGUw.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292</id><updated>2012-01-18T14:27:58.853-06:00</updated><category term="clickonce" /><category term="Personal" /><category term="vss" /><category term="xaml" /><category term="active directory" /><category term="postgresql" /><category term="bug" /><category term="SQL Reporting Services" /><category term="free" /><category term="adsi" /><category term="unit-testing" /><category term="VB.NET" /><category term="events" /><category term="MSTest" /><category term="Syntax Highlighting" /><category term="ASP.NET" /><category term="visual sourcesafe" /><category term="c#" /><category term="NDepend" /><category term="JQuery" /><category term="#develop" /><category term="pc anywhere" /><category term="Charity" /><category term="Lunchtime Sessions" /><category term="git" /><category term="Mac" /><category term="Mirth" /><category term="Apache" /><category term="JustMock" /><category term="training" /><category term="Reflector" /><category term=".NET 3.5" /><category term="resharper" /><category term="NUnit" /><category term="linq" /><category term="Google Reader" /><category term="Screen Design" /><category term="refactor" /><category term="coderush" /><category term="powertools" /><category term="IIS" /><category term="xUnit" /><category term="subversion hooks" /><category term="Balsamiq Mockups" /><category term="PowerCommands" /><category term="iPhone" /><category term="opinion" /><category term="html" /><category term="SSRS" /><category term="Google Documents" /><category term="NHibernate" /><category term="Napkee" /><category term="VHD Resizer" /><category term="hauppauge" /><category term="Web Deployment Project" /><category term="subversion" /><category term=".NET" /><category term="Excel" /><category term="ruby" /><category term="Crystal Reports" /><category term="MacHeist" /><category term="windows server 2008" /><category term="Vista" /><category term="Team Foundation Server" /><category term="MVC" /><category term="Powershell" /><category term="Messaging" /><category term="Syncfusion" /><category term="Mobile Device Browser File" /><category term="Review" /><category term="OpenSSL" /><category term="Ajax" /><category term="ebook" /><category term="OSS" /><category term="sysinternals" /><category term="Tuner" /><category term="JQTouch" /><category term="Mac OS" /><category term="itvn" /><category term="Software" /><category term="windows" /><category term="MOQ" /><category term="source control" /><category term="streaming media" /><category term="Windows 7" /><category term="Book Review" /><category term="Continuous Integration" /><category term="visual studio 2008" /><category term="SQL Server 2008" /><category term="gallio" /><category term="manifest" /><category term="Media Center" /><category term="virtual server" /><category term="Microsoft Health - Common User Interface" /><category term="nopCommerce" /><category term="certification" /><category term="Google Chrome" /><category term="blogger" /><category term="Elmah" /><category term="mcpd" /><category term="nuget" /><category term="sql" /><category term="MbUnit" /><category term="visual studio 2010" /><category term="Cocoa" /><category term="Razor View Engine" /><category term="Rant" /><category term="WPF" /><title>Hello (cruel) World</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://irwinj.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>98</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/HellocruelWorld" /><feedburner:info uri="hellocruelworld" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>41.882082</geo:lat><geo:long>-87.644611</geo:long><feedburner:emailServiceId>HellocruelWorld</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;C0MEQnwyfSp7ImA9WhRWEk8.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-369618699880109594</id><published>2011-12-29T23:03:00.001-06:00</published><updated>2011-12-29T23:03:23.295-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-29T23:03:23.295-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Book Review" /><title>Book Review–Programming Microsoft ASP.NET 4</title><content type="html">&lt;p align="left"&gt;&lt;a href="http://lh6.ggpht.com/-jNDwlsHrI8E/Tv1GGUa_7aI/AAAAAAAAA3A/YpNWj2VNDY4/s1600-h/s3.gif"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="s" border="0" alt="s" src="http://lh4.ggpht.com/-hmTDLhs6pME/Tv1GGldE6NI/AAAAAAAAA3I/byVT7qPuOcY/s_thumb1.gif?imgmax=800" width="131" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Disclosure: I received a review copy of this title from O’Reilly&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Over the Christmas break I finally had a chance to sit down and finish reading Programming Microsoft ASP.NET 4 by Dino Esposito. This has been on my bookshelf for quite some time (sorry O’Reilly blogger program…) for various reasons. Primarily, and despite protestations to the contrary, it feels as though webforms itself is teetering on the brink of irrelevance, if not oblivion and I naturally tend to gravitate towards titles related to newer and, perhaps, more relevant technologies. If you are like me, you probably want to know what is the point of reading this title, considering ASP.NET has been around for a decade and it looks to be loosing ground to it’s MVC sibling. Oddly enough, I’m more excited about the book after having read it than I was prior to reading it. There are two reasons why I suggest every (Microsoft-stack) web developer should read this title: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. There is far more than ASP.NET programming here &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;There is no getting away from it - this is primarily a webforms based book. However, regardless of which flavor of ASP.NET (webforms vs MVC) you are using, this book contains a substantial amount of invaluable information which will directly benefit you. This isn’t a book for beginners – it assumes a pretty decent knowledge of .NET and web programming in general. It altogether bypasses the basics of creating your first ASP.NET solution and&amp;#160; instead uses its real-estate to discuss the ASP.NET runtime, interaction with IIS, security, caching, state management and a plethora of other concerns that are required by anyone developing a web application using Microsoft’s technologies.&amp;#160; There’s even a whole section devoted to client side programming, delving into AJAX, JSON and jQuery programming. There is definitely a significant amount of specialized information for the ASP.NET 4 crowd, but the book has plenty to offer everyone.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. Dino Esposito &lt;em&gt;reaaaally &lt;/em&gt;knows his stuff.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is an extremely detailed, yet very accessible title. The author, Dino Esposito, is a heavyweight in the .NET world with a large number of MSDN magazine articles and books already under his belt. While he covers a myriad of advanced topics in depth, the book has the rare ability to keep the reader engaged. Esposito has the requisite background knowledge to explain not only how mechanisms work but how these mechanisms evolved during the lifetime of the .NET framework and ASP.NET.&amp;#160; At 992 pages the book is a monster, but it never feels overwhelming and in fact the content is varied enough to keep the reader interested. He also does a great job of predicting concerns readers will have, including a section dedicated to addressing my primary concern – why use ASP.NET 4 to begin with…&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;If you’re a webforms developer, you should absolutely own this title. It is extremely detail oriented and well written and gets into low level nitty-gritty details. It’s not for the feint of heart, but if you love developing web applications on the ASP.NET stack, you’ll love this book. If you, like me, are more enthused about MVC development I suggest you head to a bookstore and flick through the book. There were definitely some sections that I skimmed over, but there there was no lack of relevant content.&amp;#160; I hope and believe that you will find enough valuable information to make this a worthwhile read. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-369618699880109594?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xZuA0LmBI9kwYU9BSBWy8BOVzKE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xZuA0LmBI9kwYU9BSBWy8BOVzKE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xZuA0LmBI9kwYU9BSBWy8BOVzKE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xZuA0LmBI9kwYU9BSBWy8BOVzKE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=utEdAaNxbS8:KJs2zVlzr44:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=utEdAaNxbS8:KJs2zVlzr44:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=utEdAaNxbS8:KJs2zVlzr44:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=utEdAaNxbS8:KJs2zVlzr44:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=utEdAaNxbS8:KJs2zVlzr44:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/utEdAaNxbS8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/369618699880109594/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=369618699880109594&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/369618699880109594?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/369618699880109594?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/utEdAaNxbS8/book-reviewprogramming-microsoft-aspnet.html" title="Book Review–Programming Microsoft ASP.NET 4" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-hmTDLhs6pME/Tv1GGldE6NI/AAAAAAAAA3I/byVT7qPuOcY/s72-c/s_thumb1.gif?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/12/book-reviewprogramming-microsoft-aspnet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4HQHw9eCp7ImA9WhdbGUw.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-5913286489131211972</id><published>2011-10-17T23:08:00.000-05:00</published><updated>2011-10-17T23:08:51.260-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-17T23:08:51.260-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NHibernate" /><title>Another NHibernate Repository</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
I’ve been having a lot of fun with NHibernate recently and, during my spare time, have a few pet projects that I like to work on to improve my skillset (especially because it looks like my company is going to give an ORM a test run in the not too distant future). Everyone has their opinion on whether or not a Repository with an ORM is a good thing or a bad thing, and I’m not going to rehash any such arguments, except to say the following:    &lt;/div&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;ul&gt;
&lt;li&gt;I needed to stop implementing the same old LoadSomethingById, UpdateSomething, SaveSomething, etc. methods for every single data type in my service layer. I found myself re-inventing the wheel, albeit with different naming conventions, over and over again &lt;/li&gt;
&lt;li&gt;While NHibernate does provide a layer of abstraction in and of itself, I was reluctant to couple a particular ORM to my solution (i.e. call _session.Load&amp;lt;SomeType&amp;gt;(id) directly from my controller/codebehind/whatever) &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
So, as a learning exercise (like the world needed another one…) I created my own version of a Repository with an NHibernate solution as the default implementation. No doubt it’s not perfect but it was pretty worthwhile from an educational standpoint and I feel it is far cleaner than my previous approach. Feel Free to supply any constructive criticism you see fit. &lt;br /&gt;
&lt;br /&gt;
My implementation is similar to a number already out there, aiming for a minimal set of non-specialized operations in my repository contract. Included is a pretty &lt;strike&gt;sweet&lt;/strike&gt; simple FindMany (and FindManyFuture counterpart) method which takes an expression and uses the expression as my queryover’s filter. Combined with this is the ability to specify a limit on the number of items returned and the number of items you want to skip over. Both are useful if paging is necessary and I always like to specify a limit on all of my queries to stop any chance of returning an overly large number of records which will then hydrate objects and slow my application to a crawl.&amp;nbsp;&amp;nbsp; Most of the other methods are pretty straightforward and correspond to common use cases when using any ORM.     &lt;br /&gt;
My initial feeling is that this implementation as-is takes care of the bulk (~70%) ordinary&amp;nbsp; queries. For extraordinary queries, and those used repeatedly that I would like to reuse, I use extension methods rather than a service layer (as in the example below). This provides specific functions to specific repositories (based on the generic type) and allows me to use a single&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
All in all, it looks a little something like this:     &lt;br /&gt;
&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Here is the repository interface:&lt;/strong&gt;     &lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 750px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; interface IRepository&amp;lt;T, TId&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;{&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        T &lt;span style="color: blue;"&gt;Get&lt;/span&gt;(TId id);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        IList&amp;lt;T&amp;gt; GetAll();&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        T SaveOrUpdate(T entity);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        void Delete(T entity);&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        ISession &lt;span style="color: blue;"&gt;Session&lt;/span&gt; { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        IList&amp;lt;T&amp;gt; FindMany(Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expression = null, &lt;span style="color: blue;"&gt;int&lt;/span&gt; skip = 0, &lt;span style="color: blue;"&gt;int&lt;/span&gt; take = &lt;span style="color: blue;"&gt;int&lt;/span&gt;.MaxValue);&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        IEnumerable&amp;lt;T&amp;gt; FindManyFuture(Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expression = null, &lt;span style="color: blue;"&gt;int&lt;/span&gt; skip = 0, &lt;span style="color: blue;"&gt;int&lt;/span&gt; take = &lt;span style="color: blue;"&gt;int&lt;/span&gt;.MaxValue);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        T FindOne(Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expression);&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        T Load(TId id);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        T Save(T entity);&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        T Update(T entity);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        void Delete(TId id);&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;}&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;Here is the default implementation:&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 750px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;  &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; NHibernateRepository&amp;lt;T, TId&amp;gt; : IRepository&amp;lt;T, TId&amp;gt; where T : &lt;span style="color: blue;"&gt;class&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;    {&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;private&lt;/span&gt; readonly ISession _session;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; NHibernateRepository(ISession &lt;span style="color: blue;"&gt;session&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            _session = &lt;span style="color: blue;"&gt;session&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; virtual ISession &lt;span style="color: blue;"&gt;Session&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            &lt;span style="color: blue;"&gt;get&lt;/span&gt; { return _session; }&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; IList&amp;lt;T&amp;gt; FindMany(Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expression = null, &lt;span style="color: blue;"&gt;int&lt;/span&gt; skip = 0, &lt;span style="color: blue;"&gt;int&lt;/span&gt; take = &lt;span style="color: blue;"&gt;int&lt;/span&gt;.MaxValue )&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            return expression != null ? &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.QueryOver&amp;lt;T&amp;gt;().Where(expression).Skip(skip).Take(take).List() : &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.QueryOver&amp;lt;T&amp;gt;().Skip(skip).Take(take).List();&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; FindManyFuture(Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expression = null, &lt;span style="color: blue;"&gt;int&lt;/span&gt; skip = 0, &lt;span style="color: blue;"&gt;int&lt;/span&gt; take = &lt;span style="color: blue;"&gt;int&lt;/span&gt;.MaxValue)&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            return expression != null ? &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.QueryOver&amp;lt;T&amp;gt;().Where(expression).Skip(skip).Take(take).Future&amp;lt;T&amp;gt;() : &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.QueryOver&amp;lt;T&amp;gt;().Skip(skip).Take(take).Future&amp;lt;T&amp;gt;();&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; T FindOne(Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expression)&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            return &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.QueryOver&amp;lt;T&amp;gt;().Where(expression).SingleOrDefault();&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; virtual T Load(TId id)&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            return &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.Load&amp;lt;T&amp;gt;(id);&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; virtual T Save(T entity)&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.Save(entity);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            return entity;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; virtual T Update(T entity)&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.Update(entity);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            return entity;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; virtual void Evict(T entity)&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.Evict(entity);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; virtual void Delete(T entity)&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.Delete(entity);&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; virtual void Delete(TId id)&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.Delete(&lt;span style="color: blue;"&gt;Session&lt;/span&gt;.Load&amp;lt;T&amp;gt;(id));&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; virtual T &lt;span style="color: blue;"&gt;Get&lt;/span&gt;(TId id)&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            return &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.&lt;span style="color: blue;"&gt;Get&lt;/span&gt;&amp;lt;T&amp;gt;(id);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; virtual IList&amp;lt;T&amp;gt; GetAll()&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            ICriteria criteria = &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.CreateCriteria(typeof (T));&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            return criteria.List&amp;lt;T&amp;gt;();&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; virtual T SaveOrUpdate(T entity)&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        {&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            &lt;span style="color: blue;"&gt;Session&lt;/span&gt;.SaveOrUpdate(entity);&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;            return entity;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;        }&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;   }&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;Example Extension Method&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 750px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; ShopperExtensions&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;{&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; Shopper GetShopperBySecurityToken(this IRepository&amp;lt;Shopper,int&amp;gt; repository, &lt;span style="color: blue;"&gt;string&lt;/span&gt; securityToken)&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt; {&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;  &lt;span style="color: blue;"&gt;return&lt;/span&gt; repository.Session.CreateCriteria(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt; (Shopper))&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;   .CreateAlias("&lt;span style="color: darkred;"&gt;ShopperSecurityProfile&lt;/span&gt;", "&lt;span style="color: darkred;"&gt;profile&lt;/span&gt;")&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;   .Add(&lt;span style="color: blue;"&gt;Property&lt;/span&gt;.ForName("&lt;span style="color: darkred;"&gt;profile.SecurityToken&lt;/span&gt;").Eq(securityToken))&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;   .UniqueResult&amp;lt;Shopper&amp;gt;();&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt; }&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;}&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;Basic Usage&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 750px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;var shopperRepository = ObjectFactory.Container.GetInstance&amp;lt;IRepository&amp;lt;Shopper,&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt;&amp;gt;();&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt; shopperID = 123456;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;var shopper = shopperRepository.Get(123456);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;span style="color: green;"&gt;// OR USING SECURITY TOKEN AND EXTENSION METHOD&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;var shopper = shopperRepository.GetShopperBySecurityToken(securityToken);&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
In the above code you can see an example of using the Get method to get a particular shopper based on their ID and also a second example where an extension method is used to return a shopper based on their security token. (&lt;u&gt;Note&lt;/u&gt;, in real-world code I would probably use constructor/property injection for my dependencies but go directly to the container in this example (ObjectFactory.Container…) for the sake of brevity.) The one change I definitely need to make is to remove the dependency on ISession from the repository interface. This (and now that I think of it maybe the Evict method) is the only place in the solution where the specific ORM solution leaks into my solution (so to speak). This property is only necessary so that any extension methods defined have a session they can use to hit the database.&lt;br /&gt;
&lt;br /&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/1137761125875994292-5913286489131211972?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dMc0Tg3VWATzSOhVeUYJXxaszvA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dMc0Tg3VWATzSOhVeUYJXxaszvA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dMc0Tg3VWATzSOhVeUYJXxaszvA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dMc0Tg3VWATzSOhVeUYJXxaszvA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=BgedOQBlrYw:rS53eKFZQok:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=BgedOQBlrYw:rS53eKFZQok:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=BgedOQBlrYw:rS53eKFZQok:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=BgedOQBlrYw:rS53eKFZQok:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BgedOQBlrYw:rS53eKFZQok:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/BgedOQBlrYw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/5913286489131211972/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=5913286489131211972&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/5913286489131211972?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/5913286489131211972?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/BgedOQBlrYw/another-nhibernate-repository.html" title="Another NHibernate Repository" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/10/another-nhibernate-repository.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcHQ3w9eyp7ImA9WhdbGE0.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-5714288882739364230</id><published>2011-10-16T17:30:00.000-05:00</published><updated>2011-10-16T18:00:32.263-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-16T18:00:32.263-05:00</app:edited><title>Book Review - The Well Grounded Rubyist</title><content type="html">&lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;   &lt;div&gt;     &lt;br /&gt;&lt;/div&gt;    &lt;div style="text-align: left"&gt;&lt;strong&gt;Disclosure: I recently received review copies of two books in Manning’s Ruby series. The first, and the subject of today’s review is The Well Grounded Rubyist by David A. Black.&lt;/strong&gt;&lt;/div&gt;    &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/-iINWOMUVYug/Tpth7rsw-9I/AAAAAAAAAbY/pug1Y46HNO8/s1600-h/black2_cover150%25255B10%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="black2_cover150" border="0" alt="black2_cover150" src="http://lh5.ggpht.com/-H71d3THPhBY/Tpth71j6lHI/AAAAAAAAAbc/_4J1tAvMo8E/black2_cover150_thumb%25255B8%25255D.jpg?imgmax=800" width="150" height="187" /&gt;&lt;/a&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;div style="text-align: left"&gt;These days it feels as though one couldn’t throw a rock in a major metropolitan area without hitting a ruby developer. Worse still, each appears more enthused than the last. This enthusiasm is either infectious or annoying, depending on the individual, but as a .NET developer by day I’m admittedly intrigued to see what all the fuss is about. While I enjoy the .NET stack and will be using it professionally for the foreseeable future, it’s time to balance my skill set somewhat and Ruby (on Rails) may be just the tonic - hence my request to review this title. Expect some future Ruby/Rails/VIM related posts!&lt;/div&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;div style="text-align: left"&gt;I haven’t yet found a good reference explaining the different naming conventions employed by Manning in their series’ titles (let me know if one exists and I’ll post a link). The term “Well Grounded” had a similar effect to a realtor describing a property as “rustic”, and I I was originally skeptical, taking the title to imply something a little more basic and less thorough than this book actually is. I was completely mistaken - light and fluffy this title is not. Instead it is an enjoyable and detailed introduction to programming with Ruby, valuable to polyglot programmers and novices alike. I’ve read the title cover to cover (with &lt;em&gt;many &lt;/em&gt;highlights along the way) and it will undoubtedly remain on my bookshelf long term as a useful reference to the Ruby language.&lt;/div&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;div style="text-align: left"&gt;The author, David A Black, focuses solely on the core Ruby programming language, purposefully avoiding libraries and frameworks (no rails here) in favor of getting deep into the language itself - a wise move that allows a consistent focus and detail oriented approach. The book begins with an overview of the Ruby installation and command line tools which clarified much for me - a novice Ruby programmer. The remainder of the book iteratively builds knowledge of the Ruby language, explaining core mechanisms common to other languages (objects/classes/scope/etc.), moving onto Ruby’s myriad of in-built classes and finally delving into dynamic programming and introspection. &lt;/div&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;div style="text-align: left"&gt;The book is well written, code samples are often simple but always effective and after reading the book I feel very comfortable getting started and writing some code of my own. What I enjoyed most about this title was David A Black’s insight into the Ruby programming language. Throughout the book he provides commentary on why things are they way they are. He doesn’t simply (as is often the case with similar titles) describe a construct and then move forward - he goes to great length to rationalize the usage of constructs and advises the reader when and why they should be used. Similarly he touches on the evolution of the language, citing mechanisms that have changed from one revision to the next - describing the problem and the fix - and also warning the reader when mechanisms he is describing are likely to change in the future. I find this type of insight extremely interesting and beneficial in my education on the language. I’ll be looking out for more titles by the author in the future.&lt;/div&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;div style="text-align: left"&gt;If there are two things that I would have liked to have seen it is some coverage on debugging and testability. As I mentioned earlier, the book focuses on only the core language itself and perhaps these are not core language constructs, so to speak. However, for me, knowing how the language facilitates debugging and (automated) testing are key concerns and I was a little disappointed to reach the final chapter with little being said on either.&lt;/div&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;div style="text-align: left"&gt;At the end of the day this is a great book, full of useful advice and worthy as an introduction to Ruby or a reference for seasoned developers. It covers Ruby 1.9.1 so is up to date and very relevant. I heartily recommend it!&lt;/div&gt;    &lt;div&gt;     &lt;br /&gt;&lt;/div&gt;    &lt;div style="text-align: left"&gt;&lt;/div&gt;    &lt;div&gt;     &lt;br /&gt;&lt;/div&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-5714288882739364230?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HoDdgFneL6xigTvv05JNXAVNHA0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HoDdgFneL6xigTvv05JNXAVNHA0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HoDdgFneL6xigTvv05JNXAVNHA0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HoDdgFneL6xigTvv05JNXAVNHA0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=YJ6i7vATxHQ:S3CU9LsGyGc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=YJ6i7vATxHQ:S3CU9LsGyGc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=YJ6i7vATxHQ:S3CU9LsGyGc:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=YJ6i7vATxHQ:S3CU9LsGyGc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YJ6i7vATxHQ:S3CU9LsGyGc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/YJ6i7vATxHQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/5714288882739364230/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=5714288882739364230&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/5714288882739364230?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/5714288882739364230?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/YJ6i7vATxHQ/book-review-well-grounded-rubyist.html" title="Book Review - The Well Grounded Rubyist" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-H71d3THPhBY/Tpth71j6lHI/AAAAAAAAAbc/_4J1tAvMo8E/s72-c/black2_cover150_thumb%25255B8%25255D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/09/book-review-well-grounded-rubyist.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMBQnk6fSp7ImA9WhdUFk0.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-8575604492280107701</id><published>2011-09-24T19:24:00.001-05:00</published><updated>2011-10-02T20:14:13.715-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-02T20:14:13.715-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="html" /><title>data-placeholder in MVC3</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
I ran into an interesting problem this evening with a very quick fix. I’m using the very neat chosen Javascript plugin (&lt;a href="http://harvesthq.github.com/chosen/" target="_blank"&gt;link&lt;/a&gt;) to add some aesthetic and functional sugar to a website’s existing dropdowns. &lt;br /&gt;
&lt;br /&gt;
Anyhow, adding default text support (e.g. “Please choose an option”) to a multiple select dropdown is achievable using data-placeholder like this:&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 750px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&amp;lt;&lt;span style="color: blue;"&gt;select&lt;/span&gt; data-placeholder="&lt;span style="color: darkred;"&gt;Choose a country...&lt;/span&gt;" style="&lt;span style="color: darkred;"&gt;width:350px;&lt;/span&gt;" multiple &lt;span style="color: blue;"&gt;class&lt;/span&gt;="&lt;span style="color: darkred;"&gt;chzn-select&lt;/span&gt;""&amp;gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Problem is, I am using ASP.NET MVC’s helper syntax to create my dropdownlists and “data-placeholder” is invalid syntax due to the dash character. The following does not work:&lt;/span&gt;&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 46px; min-height: 40px; overflow: auto; padding-bottom: 2px; padding-left: 5px; padding-right: 5px; padding-top: 2px; width: 751px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;@Html.DropDownListFor(m =&amp;gt; m.SelectedProductIDs, Model.AvaliableProducts.ToSelectList("&lt;span style="color: darkred;"&gt;ID&lt;/span&gt;","&lt;span style="color: darkred;"&gt;Name&lt;/span&gt;"), &lt;span style="color: blue;"&gt;new&lt;/span&gt; { @&lt;span style="color: blue;"&gt;class&lt;/span&gt; = "&lt;span style="color: darkred;"&gt;chzn-select&lt;/span&gt;", data-placeholder="&lt;span style="color: darkred;"&gt;Please select a product&lt;/span&gt;" })&lt;/pre&gt;
&lt;/pre&gt;
Happily, Microsoft pulled a rabbit out of the hat and as of MVC3 underscores in html attribute properties are automatically converted to dashes, meaning that &lt;strong&gt;this&lt;/strong&gt;:&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 46px; min-height: 40px; overflow: auto; padding-bottom: 2px; padding-left: 5px; padding-right: 5px; padding-top: 2px; width: 749px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;@Html.DropDownListFor(m =&amp;gt; m.SelectedProductIDs, Model.AvaliableProducts.ToSelectList("&lt;span style="color: darkred;"&gt;ID&lt;/span&gt;","&lt;span style="color: darkred;"&gt;Name&lt;/span&gt;"), &lt;span style="color: blue;"&gt;new&lt;/span&gt; { @&lt;span style="color: blue;"&gt;class&lt;/span&gt; = "&lt;span style="color: darkred;"&gt;chzn-select&lt;/span&gt;", data_placeholder="&lt;span style="color: darkred;"&gt;Please select a product&lt;/span&gt;" })&lt;/pre&gt;
&lt;/pre&gt;
&lt;strong&gt;will generate something like this, with the place_holder converted to place-holder&lt;/strong&gt;&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 46px; min-height: 40px; overflow: auto; padding-bottom: 2px; padding-left: 5px; padding-right: 5px; padding-top: 2px; width: 749px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&amp;lt;select &lt;span style="color: blue;"&gt;class&lt;/span&gt;="&lt;span style="color: darkred;"&gt;chzn-select chzn-done&lt;/span&gt;" data-placeholder="&lt;span style="color: darkred;"&gt;Please select a product&lt;/span&gt;" id="&lt;span style="color: darkred;"&gt;SelectedProductIDs&lt;/span&gt;" name="&lt;span style="color: darkred;"&gt;SelectedProductIDs&lt;/span&gt;" style="&lt;span style="color: darkred;"&gt;display: none; &lt;/span&gt;"&amp;gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-8575604492280107701?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yn_odM1kx9uBEMjtJKDHiP1YYC8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yn_odM1kx9uBEMjtJKDHiP1YYC8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yn_odM1kx9uBEMjtJKDHiP1YYC8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yn_odM1kx9uBEMjtJKDHiP1YYC8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=qxIOV9TZE1Y:yfvLJlGbnsw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=qxIOV9TZE1Y:yfvLJlGbnsw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=qxIOV9TZE1Y:yfvLJlGbnsw:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=qxIOV9TZE1Y:yfvLJlGbnsw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=qxIOV9TZE1Y:yfvLJlGbnsw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/qxIOV9TZE1Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/8575604492280107701/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=8575604492280107701&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/8575604492280107701?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/8575604492280107701?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/qxIOV9TZE1Y/data-placeholder-in-mvc3.html" title="data-placeholder in MVC3" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/09/data-placeholder-in-mvc3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMFRnw5cSp7ImA9WhdWGUo.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-549974768278608761</id><published>2011-09-13T22:53:00.001-05:00</published><updated>2011-09-13T22:53:37.229-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-13T22:53:37.229-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><title>My First Experience with Windows 8</title><content type="html">&lt;p&gt;I guess running in a VM was a bad idea then… &lt;/p&gt;  &lt;p&gt;I wonder will the soothing BSOD thing catch on :-)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-uyaHLs9RLEU/TnAlP3_iElI/AAAAAAAAAa0/I8zoaQZMLdw/s1600-h/image%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-d4Fit1cC2Hs/TnAlQPs-9jI/AAAAAAAAAa4/IXKCPrjVNXQ/image_thumb%25255B3%25255D.png?imgmax=800" width="545" height="311" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-549974768278608761?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MAHdrPCU1cc1NlBmDJELViawCD4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MAHdrPCU1cc1NlBmDJELViawCD4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MAHdrPCU1cc1NlBmDJELViawCD4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MAHdrPCU1cc1NlBmDJELViawCD4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=iKDsj_iH020:QbpxlIaw96I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=iKDsj_iH020:QbpxlIaw96I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=iKDsj_iH020:QbpxlIaw96I:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=iKDsj_iH020:QbpxlIaw96I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=iKDsj_iH020:QbpxlIaw96I:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/iKDsj_iH020" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/549974768278608761/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=549974768278608761&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/549974768278608761?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/549974768278608761?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/iKDsj_iH020/my-first-experience-with-windows-8.html" title="My First Experience with Windows 8" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-d4Fit1cC2Hs/TnAlQPs-9jI/AAAAAAAAAa4/IXKCPrjVNXQ/s72-c/image_thumb%25255B3%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/09/my-first-experience-with-windows-8.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUAQno_fip7ImA9WhdUFk0.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-6809204083955554471</id><published>2011-09-10T18:11:00.001-05:00</published><updated>2011-10-02T20:10:43.446-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-02T20:10:43.446-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="nuget" /><title>gitignore–Don’t ignore Nuget Binaries</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
I am pretty new to the GIT world and am excited to be moving a personal project from Subversion to GIT. As with most .NET developers’ .gitignore files, I use the following line to filter out DLLs so that I am not versioning build DLLs&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 44px; min-height: 40px; overflow: auto; padding-bottom: 0px; padding-left: 5px; padding-right: 5px; padding-top: 1px; width: 429px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;*.&lt;span style="color: maroon;"&gt;dll&lt;/span&gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
I ran into an issue where I wanted to exclude &lt;em&gt;all &lt;/em&gt;DLLs except for those stored in my Nuget &lt;em&gt;packages &lt;/em&gt;directory. This wouldn’t in itself be an issue were it not for the fact that Nuget packages diverge wildly with respect to the number of nested sub-folders. Where one package might store it’s DLLs one folder down the directory hierarchy, another might store theirs down 10…&lt;br /&gt;
&lt;br /&gt;
I searched for a recursive wildcard pattern that would work via mysysgit but hit a brick wall as none of the following worked:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 76px; min-height: 40px; overflow: auto; padding-bottom: 0px; padding-left: 5px; padding-right: 5px; padding-top: 1px; width: 425px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;!/&lt;span style="color: maroon;"&gt;packages&lt;/span&gt;/**&lt;span style="color: green;"&gt;/*.dll&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;!/packages/**/*&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
While I hoped for a cleaner solution it turned out that all I had to do was add another .gitignore to my packages directory containing only the following line:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 45px; min-height: 40px; overflow: auto; padding-bottom: 0px; padding-left: 5px; padding-right: 5px; padding-top: 1px; width: 419px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;!*.&lt;span style="color: maroon;"&gt;dll&lt;/span&gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
Obviously this would work just as well for !*.exe or any other relevant binary file type…&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-6809204083955554471?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EJdCBXdlSJfLRpHbppgRivCtgnA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EJdCBXdlSJfLRpHbppgRivCtgnA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EJdCBXdlSJfLRpHbppgRivCtgnA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EJdCBXdlSJfLRpHbppgRivCtgnA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=VzKnulou_AU:iumVVQAoL8s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=VzKnulou_AU:iumVVQAoL8s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=VzKnulou_AU:iumVVQAoL8s:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=VzKnulou_AU:iumVVQAoL8s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=VzKnulou_AU:iumVVQAoL8s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/VzKnulou_AU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/6809204083955554471/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=6809204083955554471&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/6809204083955554471?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/6809204083955554471?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/VzKnulou_AU/gitignoredont-ignore-nuget-binaries.html" title="gitignore–Don’t ignore Nuget Binaries" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/09/gitignoredont-ignore-nuget-binaries.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUNQX4-eyp7ImA9WhdUFk0.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-5081130631580418323</id><published>2011-05-26T17:45:00.000-05:00</published><updated>2011-10-02T20:11:30.053-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-02T20:11:30.053-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Team Foundation Server" /><category scheme="http://www.blogger.com/atom/ns#" term="visual sourcesafe" /><title>TFS–Automated Project Creation</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
I posted a while back about the…difficulties…migrating from VSS to TFS in terms of mass project creation and re-creation. Specifically, the process to create a team project in TFS is somewhat manual and it has been extremely frustrating re-initializing our TFS sandbox prior to every iteration of testing…until today…&lt;br /&gt;
&lt;h3&gt;
Part 1&lt;/h3&gt;
Today I stumbled across a useful nugget of information – there is a client-side Team Explorer command called File.BatchNewTeamProject located in the Microsoft.VisualStudio.TeamFoundation.TeamExplorer DLL located in C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies. This command is used by Team Explorer in Visual Studio to create a new team project. A little extra investigation led me to a Codeplex project (&lt;a href="http://tfsprojprovisioner.codeplex.com/)"&gt;http://tfsprojprovisioner.codeplex.com/)&lt;/a&gt; by Brad Kaenel named Team Foundation Project Provisioner with the express purpose to &lt;br /&gt;
&lt;blockquote&gt;
“1) Produce a .Net assembly that encapsulated all the fiddly code necessary to generate the required XML file and invoke BatchNewTeamProject;&amp;nbsp; &lt;br /&gt;
2) To write a shop-specific provisioning tool that not only created Team Projects, but also did the necessary post-creation tasks that I needed.”&lt;/blockquote&gt;
This code does everything I need and more (right now I don’t need to pull in AD groups etc.) solving part 1 of my problem. &lt;br /&gt;
&lt;h3&gt;
Part 2&lt;/h3&gt;
Building on this I decided to parse our existing conversion.xml files, used by VSSConverter to migrate VSS projects to TFS. The file looks a little like this trivial example: &lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 319px; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 731px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&amp;lt;?xml version="&lt;span style="color: darkred;"&gt;1.0&lt;/span&gt;" encoding="&lt;span style="color: darkred;"&gt;utf-8&lt;/span&gt;"?&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&amp;lt;SourceControlConverter&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;  &amp;lt;ConverterSpecificSetting&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;    &amp;lt;Source name="&lt;span style="color: darkred;"&gt;VSS&lt;/span&gt;"&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;      &amp;lt;VSSDatabase name="&lt;span style="color: darkred;"&gt;C:\TFSMigration\vss_database&lt;/span&gt;"&amp;gt;&amp;lt;/VSSDatabase&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;      &amp;lt;UserMap name="&lt;span style="color: darkred;"&gt;c:\UserMap.xml&lt;/span&gt;"&amp;gt;&amp;lt;/UserMap&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;    &amp;lt;/Source&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;    &amp;lt;ProjectMap&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;      &amp;lt;Project Source="&lt;span style="color: darkred;"&gt;$/BillingProject/BillingProject/Client&lt;/span&gt;" Destination="&lt;span style="color: darkred;"&gt;$/BillingProject/Client&lt;/span&gt;"&amp;gt;&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;      &amp;lt;Project Source="&lt;span style="color: darkred;"&gt;$/BillingProject/BillingProject/Server&lt;/span&gt;" Destination="&lt;span style="color: darkred;"&gt;$/BillingProject/Server&lt;/span&gt;"&amp;gt;&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;      &amp;lt;Project Source="&lt;span style="color: darkred;"&gt;$/FinancialProject/FinancialProject/Client&lt;/span&gt;" Destination="&lt;span style="color: darkred;"&gt;$/FinancialProject/Client&lt;/span&gt;"&amp;gt;&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;      &amp;lt;Project Source="&lt;span style="color: darkred;"&gt;$/FinancialProject/FinancialProject/Server&lt;/span&gt;" Destination="&lt;span style="color: darkred;"&gt;$/FinancialProject/Server&lt;/span&gt;"&amp;gt;&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	  &amp;lt;Project Source="&lt;span style="color: darkred;"&gt;$/FinancialProject/FinancialProject/Common&lt;/span&gt;" Destination="&lt;span style="color: darkred;"&gt;$/FinancialProject/Common&lt;/span&gt;"&amp;gt;&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;      &amp;lt;Project Source="&lt;span style="color: darkred;"&gt;$/StaffingProject/StaffingProject/Client&lt;/span&gt;" Destination="&lt;span style="color: darkred;"&gt;$/StaffingProject/Client&lt;/span&gt;"&amp;gt;&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;      &amp;lt;Project Source="&lt;span style="color: darkred;"&gt;$/StaffingProject/StaffingProject/Server&lt;/span&gt;" Destination="&lt;span style="color: darkred;"&gt;$/StaffingProject/Server&lt;/span&gt;"&amp;gt;&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;    &amp;lt;/ProjectMap&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;  &amp;lt;/ConverterSpecificSetting&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;  &amp;lt;Settings&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;    &amp;lt;TeamFoundationServer name="&lt;span style="color: darkred;"&gt;myserver.mydomain.com&lt;/span&gt;" port="&lt;span style="color: darkred;"&gt;8080&lt;/span&gt;" protocol="&lt;span style="color: darkred;"&gt;http&lt;/span&gt;" collection="&lt;span style="color: darkred;"&gt;tfs/MyProjectCollection&lt;/span&gt;"&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&amp;lt;/TeamFoundationServer&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;  &amp;lt;/Settings&amp;gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&amp;lt;/SourceControlConverter&amp;gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
Obviously this file contains all of the requisite information to identify needed TFS (destination) projects and pulling this information out couldn’t be simpler:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 260px; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 732px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main()&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;{&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	var uri = &lt;span style="color: blue;"&gt;new&lt;/span&gt; Uri("&lt;span style="color: darkred;"&gt;http://myserver.mydomain.com.org:8080/tfs/MyProjectCollection&lt;/span&gt;");&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	&lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; processTemplateName = "&lt;span style="color: darkred;"&gt;MSF for Agile Software Development v5.0&lt;/span&gt;";&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	var projectProvisioner = &lt;span style="color: blue;"&gt;new&lt;/span&gt; ProjectProvisioner();&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	var loaded = XDocument.Load(@"&lt;span style="color: darkred;"&gt;C:\conversion.xml&lt;/span&gt;");&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	var listOfProjectPaths = loaded.Descendants("&lt;span style="color: darkred;"&gt;Project&lt;/span&gt;").Select(x =&amp;gt; ((&lt;span style="color: blue;"&gt;string&lt;/span&gt;)x.Attribute("&lt;span style="color: darkred;"&gt;Destination&lt;/span&gt;")).Replace(@"&lt;span style="color: darkred;"&gt;$/&lt;/span&gt;", &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty));&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	var listOfDistinctProjectNames = listOfProjectPaths.Select(x =&amp;gt; x.Substring(0, x.IndexOf("&lt;span style="color: darkred;"&gt;/&lt;/span&gt;"))).Distinct();&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	projectProvisioner.ProvisionProgress += MyProvisionerProvisionProgress;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	projectProvisioner.ProvisionException += MyProvisionerProvisionException;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (var project &lt;span style="color: blue;"&gt;in&lt;/span&gt; listOfDistinctProjectNames)&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	{&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;		projectProvisioner.Create(uri, project, processTemplateName, &lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;	}&lt;/pre&gt;
&lt;pre style="background-color: white; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;}&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
I created a simple console app, referencing the TFSProjectTools assembly from tfsprojprovisioner. Loading the conversion.xml file from my C:\ drive I was then able to loop through each project element and performed some simple string manipulation essentially turning this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 52px; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 736px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;"&lt;span style="color: darkred;"&gt;$/StaffingProject/Server&lt;/span&gt;"&lt;/pre&gt;
&lt;/pre&gt;
into this:&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 52px; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 739px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 11px; margin: 0em; width: 100%;"&gt;StaffingProject&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
and returning the distinct root projects. I looped through these projects and used the Create method in TFSProjectTools to create the required projects. That is all VSSConverter needs to be set up and I finally have a repeatable solution in place to create the requisite projects for our VSS migration. &lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-5081130631580418323?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TvMRb7dJF7Pr0M1qgjkEbqP_K6w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TvMRb7dJF7Pr0M1qgjkEbqP_K6w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TvMRb7dJF7Pr0M1qgjkEbqP_K6w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TvMRb7dJF7Pr0M1qgjkEbqP_K6w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=BO9HFiYCeTM:runX-YExiW8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=BO9HFiYCeTM:runX-YExiW8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=BO9HFiYCeTM:runX-YExiW8:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=BO9HFiYCeTM:runX-YExiW8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=BO9HFiYCeTM:runX-YExiW8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/BO9HFiYCeTM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/5081130631580418323/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=5081130631580418323&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/5081130631580418323?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/5081130631580418323?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/BO9HFiYCeTM/tfsautomated-project-creation.html" title="TFS–Automated Project Creation" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/05/tfsautomated-project-creation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYFQnc6fip7ImA9Wx9aFkw.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-7699623352981762091</id><published>2011-03-08T12:48:00.001-06:00</published><updated>2011-03-08T12:48:33.916-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-08T12:48:33.916-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Book Review" /><title>Book Review - Programming Amazon EC2</title><content type="html">&lt;p&gt;&lt;b&gt;Disclosure: I received a review copy of Programming Amazon EC2 from O’Reilly.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I read somewhere that Programming Amazon EC2 is a title for people looking to adopt Amazon’s cloud platforms while avoiding a large amount of trial and error. I’ve been wanting to play around on this platform for a long time but have been a little intimidated by the myriad of terms and acronyms used to describe the available tools and configurations at my disposal. I fit firmly into the demographic that wants to get up and running with Amazon but doesn’t have the time to learn in this manner. The book is a pretty quick read and is packed full of useful information. Despite a couple of issues this is the de facto guide to Amazon’s web offerings and should (and will) act as a bible for anyone embarking on such a project. This book will undoubtedly save me countless hours in my future endeavors with these services and will pay for itself in no time. I highly recommend it.&lt;/p&gt;  &lt;p&gt;&lt;img alt="Programming Amazon EC2" src="http://covers.oreilly.com/images/9781449393687/cat.gif" /&gt;&lt;/p&gt;  &lt;p&gt;While this book had a far narrower focus than most of the titles I’ve read recently it fit my needs perfectly and fulfilled its goal of getting me up and running with these services with little fuss. It is a pretty short title but very detailed, breaking down the key technologies and working through examples of improving the infrastructure of existing applications by adopting said technologies. The book starts with a brief timeline of when each technology was created by Amazon and, more interestingly, what gap they were created to fill. This was somewhat insightful and especially interesting when you consider the scale of Amazon’s online store and their adoption of said technologies. The proceeding chapters go into each technology in detail. The authors really know their stuff and there are some great tips from real life experience – some of which have the potential to save a lot of experimentation and frustration as one works their way through some existing idiosyncrasies. Furthermore the authors are cost-conscious and in a number of places provided guidance with regard to maintain resource utilization levels for optimum return on investment. The book provides a number of very useful scripts not only to create an environment but to monitor interesting metrics and planning for improvement once in the wild.    &lt;br /&gt;&amp;#160; &lt;br /&gt;The book’s greatest strength is also its greatest weakness. As mentioned above, the content is based firmly on real world production applications. The issue with this is that it is written mostly from the standpoint of taking existing applications and moving them to the cloud. For greenfield projects there are some very important omissions which I found somewhat frustrating. Firstly, the authors do not discuss alternative development/testing environments. Specifically, when using a service where you pay money based on time, bandwidth etc. I wonder if there is any way to develop offline in a local sandbox or, for the two years it takes to bring the product to market, I am expected to pay regular Amazon rates associated with a production environment? Furthermore, am I expected to be constantly connected when developing a solution against SimpleDB, SQS, etc. It may seem like a small point but, when planning a new project, is extremely important. The answer might be straightforward (and I’m willing to bet most organizations develop against real AWS instances and are online all the time) but having read the title cover to cover I still don’t know the answer. Secondly, the authors omit information about licensing. Most of the discussion is Linux based, but I was really hoping for a breakdown of what is required if, say, I want to run Windows Server and SQL Server Enterprise. How does licensing work in these scenarios? If I get an AMI with these loaded then are my licensing costs included in the fees I am already paying, etc. Again, this is information that I would need before suggesting that my organization adopt AWS, but at this point in time I do not know.&lt;/p&gt;  &lt;p&gt;Other than the above issues I really can’t say much bad about this book. It does exactly what it promises and provides a great introduction to the acronym laden world of Amazon’s web infrastructure. The material is extremely specific so this isn’t something I’d recommend to just anyone. But if you’re thinking about moving to the cloud then this title is a must. I could make a pretty good business case for Amazon to offer this title free to developers as it makes a very strong case for using their services.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-7699623352981762091?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mxDYEaKaoDvgwapuCxN5gubzpco/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mxDYEaKaoDvgwapuCxN5gubzpco/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mxDYEaKaoDvgwapuCxN5gubzpco/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mxDYEaKaoDvgwapuCxN5gubzpco/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=ZAI-nyFtL7k:TNzfkW2I-Ao:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=ZAI-nyFtL7k:TNzfkW2I-Ao:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=ZAI-nyFtL7k:TNzfkW2I-Ao:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=ZAI-nyFtL7k:TNzfkW2I-Ao:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ZAI-nyFtL7k:TNzfkW2I-Ao:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/ZAI-nyFtL7k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/7699623352981762091/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=7699623352981762091&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/7699623352981762091?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/7699623352981762091?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/ZAI-nyFtL7k/book-review-programming-amazon-ec2.html" title="Book Review - Programming Amazon EC2" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/03/book-review-programming-amazon-ec2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIHRn0-fyp7ImA9Wx9aE0s.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-2620393405962717212</id><published>2011-03-05T16:17:00.001-06:00</published><updated>2011-03-05T16:18:57.357-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-05T16:18:57.357-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="IIS" /><title>Up and running with IIS 7.5 Express</title><content type="html">&lt;p&gt;I’ve been excited to play around with IIS Express since &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/06/28/introducing-iis-express.aspx"&gt;Scott Guthrie’s announcement&lt;/a&gt;. I recently loaded up VS2010 SP1 and decided it was time to play around with IIS. The promise is wonderful – a&amp;#160; lightweight but rich version of IIS – including SSL, URL Rewrite, media support, etc. - that doesn’t require elevated privileges to run and can even run on Windows XP.&amp;#160; &lt;/p&gt;  &lt;p&gt;After installing IIS Express through the Web Platform Installer things went awry. From the reading I had done on the subject it seemed like the express version would be a quick and easy alternative to the full blown IIS, but unfortunately configuration is (right now) a bit of a PITA requiring IIS Express config file editing, net shell configuration changes and quite a bit of trial and error. &lt;/p&gt;  &lt;p&gt;I was expecting IIS Express to be a portable solution – but now see that it is going to be a bit of a pain to get configured how I like it when I move PCs or reimage my box. A certain amount of this is necessary due to the elevated privileges we need but are trying to circumvent (in my example below using well-known/reserved ports 80 and 443) but I wonder if updates to IIS Express application bindings could have been moved from the applicationhost.config file to individual websites’ web.config files allowing everything to be stored in version control systems, allowing multiple users to share said configurations and, in general, making life a little easier for everyone concerned…As things stand it is actually a lot easier – when one has admin permissions on their box – to get up and running quickly with the full blown version of IIS...&lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h3&gt;The Adventure&lt;/h3&gt;  &lt;p&gt;I immediately ran into problems using IIS Express with an ASP.NET MVC 3 application that relies on port 80 for http and 443 for https. Essentially, IIS express expects ports between 44300 (defaulting to this value) and 44399 to be used for SSL and trying to use another port, say 443, results URL binding failure…&lt;/p&gt;  &lt;h3&gt;A Great Intro to IIS Express&lt;/h3&gt;  &lt;p&gt;Too late in the process I came across the following video from MvcConf which goes over IIS Express in great detail and is a must for anyone using this tool:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://channel9.msdn.com/Series/mvcConf/mvcConf-2-Vaidy-Gopalakrishnan-IIS-Express"&gt;http://channel9.msdn.com/Series/mvcConf/mvcConf-2-Vaidy-Gopalakrishnan-IIS-Express&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Step #1 – Enable SSL in IIS Express&lt;/h3&gt;  &lt;p&gt;Add the following binding to the applicationhost.config file:&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.86%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 43px; 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;&amp;lt;binding protocol=&lt;span style="color: #006080"&gt;&amp;quot;https&amp;quot;&lt;/span&gt; bindingInformation=&lt;span style="color: #006080"&gt;&amp;quot;*:44300:localhost&amp;quot;&lt;/span&gt; /&amp;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;h3&gt;Step #2 – Change SSL PORT&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;IIS 7.5 Express uses port 44300 by default – not 443. RequiresSSL seems to default to port 443 causing secured pages to fail loading. The following resources led me to figuring out the issue:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://forums.iis.net/t/1171280.aspx"&gt;http://forums.iis.net/t/1171280.aspx&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;and&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://learn.iis.net/page.aspx/1005/handling-url-binding-failures-in-iis-express/"&gt;http://learn.iis.net/page.aspx/1005/handling-url-binding-failures-in-iis-express/&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The following needs to be executed from the command prompt running as Administrator…&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 505px; padding-right: 5px; height: 311px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;' if you already have port 443 setup, you'll need to remove your existing entry&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;netsh http delete sslcert ipport=0.0.0.0:443&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;' Get SHA1 thumbprint - You will need to remove spaces&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;certmgr.exe /c /s /r localMachine MY&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;' Create a unique UUID using &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;uuidgen.exe&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;netsh http add sslcert ipport=0.0.0.0:443 certhash=&amp;lt;your SHA1 thumbprint&amp;gt; appid={&amp;lt;your UUID&amp;gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;' add access control list entry to allow port 443 to be used by IIS Express when running as non-admin user&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;netsh http add urlacl url=https://localhost:443/ user=everyone&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;' restart http service&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;net &lt;span style="color: #0000ff"&gt;stop&lt;/span&gt; http&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;net start http&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Step #3 – Add binding for port 80&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The next two steps are essentially a rinse and repeat of steps 1 and 2, but things are a little quicker this time round since we don’t have any certificate information to figure out. Add an additional http binding in your applicationhost.config file, this time binding port 80 &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: 92.47%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 61px; 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;&amp;lt;binding protocol=&lt;span style="color: #006080"&gt;&amp;quot;http&amp;quot;&lt;/span&gt; bindingInformation=&lt;span style="color: #006080"&gt;&amp;quot;*:80:localhost&amp;quot;&lt;/span&gt; /&amp;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;h3&gt;Step #4 – Add ACL entry for port 80&lt;/h3&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: 92.36%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 65px; 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;netsh http add urlacl url=http://localhost:80/ user=everyone&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;net &lt;span style="color: #0000ff"&gt;stop&lt;/span&gt; http&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;net start http&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;h3&gt;Fin&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;That’s it. If you followed these steps – and made sure all instances of IIS Express have been stopped and restarted – you should now be able to use ports 443 and 80 using IIS Express. Not a whole lot of fun but you should now be able to run a pretty feature rich web server without the need to run VS as an administrator…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-2620393405962717212?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5KuqKg5VqO0RA_SY0nGFN5QgaZg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5KuqKg5VqO0RA_SY0nGFN5QgaZg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5KuqKg5VqO0RA_SY0nGFN5QgaZg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5KuqKg5VqO0RA_SY0nGFN5QgaZg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=8WJeYPrpwCc:tsbumGqnzEo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=8WJeYPrpwCc:tsbumGqnzEo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=8WJeYPrpwCc:tsbumGqnzEo:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=8WJeYPrpwCc:tsbumGqnzEo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=8WJeYPrpwCc:tsbumGqnzEo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/8WJeYPrpwCc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/2620393405962717212/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=2620393405962717212&amp;isPopup=true" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/2620393405962717212?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/2620393405962717212?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/8WJeYPrpwCc/up-and-running-with-iis-75-express.html" title="Up and running with IIS 7.5 Express" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/03/up-and-running-with-iis-75-express.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MNR3c4fCp7ImA9Wx9bE0k.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-971803853121564724</id><published>2011-02-21T22:38:00.001-06:00</published><updated>2011-02-21T22:38:16.934-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T22:38:16.934-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Book Review" /><title>Book Review – Conversion Optimization</title><content type="html">&lt;p&gt;&lt;b&gt;Disclosure: I received a review copy of Conversion Optimization from O’Reilly.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I didn’t really have any set expectations when reading this title. As a professional developer I continually strive to fill gaps in my knowledge and conversion optimization &lt;i&gt;was &lt;/i&gt;(read: is no longer) something I didn’t know much if anything about. At less than 300 pages the book is a pretty quick read, but is packed full of useful information, lessons learned from real world conversion optimization and plenty of case studies. I read the book over the course of a weekend and highly recommend it for anyone involved in ecommerce or lead generation websites – from developers and designers all the way to marketing and business folk. There is a health balance of descriptive and prescriptive guidance and I feel like I learned a lot while thoroughly enjoying the read. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_pkYZV8vEgBM/TWM9suzNW2I/AAAAAAAAAWo/evAe9XMyCxk/s1600-h/cat%5B3%5D.gif"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="cat" border="0" alt="cat" src="http://lh4.ggpht.com/_pkYZV8vEgBM/TWM9tUd7HGI/AAAAAAAAAWs/ntFXVt4F72s/cat_thumb.gif?imgmax=800" width="184" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;As the name suggests, &lt;a href="http://oreilly.com/catalog/9781449377564/"&gt;Conversion Optimization by Khalid Saleh, Ayat Shukairy&lt;/a&gt; deals specifically with converting site visits into revenue – through sales/leads/etc. Essentially organizations spend fortunes on SEO and online advertising to drive people to their site, without giving enough thought to what to do when the visitors actually arrive. &lt;/p&gt;  &lt;p&gt;The book is based on an 8 principle (trademarked) Conversion Framework which walks the reader from initial market analysis and persona setup through engaging customers. I found the early differentiation of macro and micro conversions to be extremely insightful, where getting the user to purchase something (taking an ecommerce example) is the macro level and every page along the way must provide a micro conversion to enable said macro conversion. Simple, yes, but only after it has been articulated…&lt;/p&gt;  &lt;p&gt;Each step along the way is extremely detailed with a combination of qualitative and quantitative data backing up claims made. The authors appear to be experts in their fields and illustrate their points using real world examples that they worked on. The book is littered with interesting and useful case studies.&lt;/p&gt;  &lt;p&gt;The book is both descriptive and prescriptive, explaining in detail what conversion optimization is, pinpointing why it is ignored by so many, defining a framework for optimization and illustrating how to implement this framework.&lt;/p&gt;  &lt;p&gt;I read this book from cover to cover in about 3 days. It weighs in at less than 300 pages but the reading is somewhat fluid as the authors jump from business forecasting to the psychology of users and onwards to a multitude of topics with the greatest of ease. I was pretty riveted throughout and barely put the book down once I had started reading.&lt;/p&gt;  &lt;p&gt;This is an excellent title which (if anyone from O’Reilly is listening) would greatly benefit from being turned into a Master Class video series! It isn’t a technical title, and should be accessible and useful to anyone from business stakeholders, to marketing fold and all the way down to us developers and designers. This was a great read that I strongly suggest for anyone interested in deriving revenue from their website – specifically those spending a fortune on ADs and SEO wondering why customers are not buying their product. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-971803853121564724?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qggK9KQEr1Dt_ruWNdjIJrwRiZg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qggK9KQEr1Dt_ruWNdjIJrwRiZg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qggK9KQEr1Dt_ruWNdjIJrwRiZg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qggK9KQEr1Dt_ruWNdjIJrwRiZg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=4ciY9f1wDXI:_OHXQvO9PMw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=4ciY9f1wDXI:_OHXQvO9PMw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=4ciY9f1wDXI:_OHXQvO9PMw:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=4ciY9f1wDXI:_OHXQvO9PMw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=4ciY9f1wDXI:_OHXQvO9PMw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/4ciY9f1wDXI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/971803853121564724/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=971803853121564724&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/971803853121564724?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/971803853121564724?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/4ciY9f1wDXI/book-review-conversion-optimization.html" title="Book Review – Conversion Optimization" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_pkYZV8vEgBM/TWM9tUd7HGI/AAAAAAAAAWs/ntFXVt4F72s/s72-c/cat_thumb.gif?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/02/book-review-conversion-optimization.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cGRH86fCp7ImA9Wx9UGUs.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-2245067544037249894</id><published>2011-02-17T12:57:00.001-06:00</published><updated>2011-02-17T12:57:05.114-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-17T12:57:05.114-06:00</app:edited><title>Review - Scott &amp; Neil's Designing Web Interfaces Master Class</title><content type="html">&lt;p&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;As a developer I tend to (subconsciously) consider web interface design as a soft art that takes a back seat to the science of computer programming. I’ve long needed to brush up on my design skills and was excited to review O’Reilly’s series - Scott &amp;amp; Neil's Designing Web Interfaces Master Class. I was hopeful of an in-depth overview of web interface design with plenty of battle-hardened nuggets of wisdom. The presenters were sufficiently credentialed to offer such nuggets of wisdom and to me, the best part of this course was Bill Scott’s insight into designs from his time at Yahoo! and especially his current company Netflix extremely interesting. While I enjoyed this course and gained some knowledge in the process, I’m not sure that I – a UX rookie – learned enough for this series to live up to its &lt;i&gt;master class &lt;/i&gt;title. I certainly don’t feel like I gained mastery of the subject matter in the process. Pedantic, I know, but those were my expectations based on the title and they weren’t really met by the content. The series isn’t bad by any stretch of the imagination – it just didn’t fully live up to my expectations.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Overview&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;As with &lt;a href="http://irwinj.blogspot.com/2011/01/review-croll-power-communilytics-master.html"&gt;the previous O’Reilly video series I reviewed&lt;/a&gt;, the series production was of extremely high quality with superb audio and video providing an immersive experience. The presenters were both extremely competent, knowledgeable and well-spoken and had plenty of relevant experience. &lt;/p&gt;  &lt;p&gt;A minor annoyance with the content is that, when demonstrating key layout points, the presenters used screenshots and/or videos. While I’m sure that logging into the many websites utilized as examples in the series would have constituted a logistical (and personal privacy) nightmare, the use of static screenshots and video recordings didn’t really work. There were a number of awkward moments throughout the series where the presenter wished to illustrate a point and resorted to rewinding video or, worse still, pointing at a static screenshot and asking the viewer to use their imagination.&lt;/p&gt;  &lt;p&gt;The course got off to a pretty slow start. The longest video (weighing in at almost 1.5 hours) introduces a myriad of possible screen layouts with suggestions as to which layout should be used when. Unfortunately the video is long winded and pretty subjective – what I loved about the &lt;a href="http://irwinj.blogspot.com/2011/01/review-croll-power-communilytics-master.html"&gt;Croll &amp;amp; Power’s Communylitics Master Class&lt;/a&gt; video series was that everything was backed up with statistics and/or studies. When reviewing different layout options I would have loved to see some similar statistics applied – specifically detailing why users act the way they act with comparisons of layouts based on quantitative data and detailing where users spend their time on websites, etc. etc. &lt;/p&gt;  &lt;p&gt;Instead, the screen layout and user control videos felt more like &lt;i&gt;best of the web &lt;/i&gt;affairs with the presenter spending a substantial amount of time showing off really nice websites, grouped by layout/control types. While there was nothing wrong with these videos (I would &lt;i&gt;love &lt;/i&gt;O’Reilly to make and distribute a poster with all of the included layout types and screenshots) the same impact could have been achieved in a lot less time. Also, knowing that combined these accounted for almost 50% of the series, I was a little disheartened having finished watching the titles and feeling that I really hadn’t learned all that much. &lt;/p&gt;  &lt;p&gt;As the series progressed a bunch of patterns and anti-patterns were discussed. The series really came into its own with Bill providing many insights into designs at Yahoo! and Netflix and I found it refreshing not only to hear about (and see) real life experiences of good and bad design decisions but to gain insight into the world of prominent and relevant web giants – this is something you don’t often get a chance to see!&lt;/p&gt;  &lt;p&gt;All in all I found the series to be useful without fully living up to expectations – had this been advertised as an introduction or even a mid-level course then I think the title was acceptable, but as a master class the information was not prescriptive enough. If I, as a developer with little design experience, didn’t gain much knowledge from the title, I can’t imagine that a designer would gain anything at all. I would recommend this series as I thought it was both enjoyable and a worthwhile watch – but I would adjust my expectations a little before watching…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-2245067544037249894?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZUZI8GAnOwE_7vY7bGs0JkCB6wo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZUZI8GAnOwE_7vY7bGs0JkCB6wo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZUZI8GAnOwE_7vY7bGs0JkCB6wo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZUZI8GAnOwE_7vY7bGs0JkCB6wo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=uskWdbIWnRs:xHiFmpqJwxU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=uskWdbIWnRs:xHiFmpqJwxU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=uskWdbIWnRs:xHiFmpqJwxU:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=uskWdbIWnRs:xHiFmpqJwxU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=uskWdbIWnRs:xHiFmpqJwxU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/uskWdbIWnRs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/2245067544037249894/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=2245067544037249894&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/2245067544037249894?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/2245067544037249894?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/uskWdbIWnRs/review-scott-neil-designing-web.html" title="Review - Scott &amp;amp; Neil&amp;#39;s Designing Web Interfaces Master Class" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/02/review-scott-neil-designing-web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUMRXs4fip7ImA9Wx9UF00.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-3866118332408751010</id><published>2011-02-11T12:54:00.001-06:00</published><updated>2011-02-14T10:18:04.536-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-14T10:18:04.536-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Book Review" /><title>Book Review - Event Processing in Action</title><content type="html">&lt;p&gt;&lt;b&gt;Disclosure: I received a review copy of Event Processing in Action from Manning.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I started this reviewing kick a little while back with Manning’s &lt;i&gt;Continuous Integration &lt;/i&gt;title and, enjoying the experience, decided to continue with additional reviews for the foreseeable future. To get the most out of the experience I’ve decided that wherever possible I should review titles that do not directly relate to the things I work on as part of my day job in order to broaden my horizons a little. The most recent title in my repertoire is &lt;a href="http://www.manning.com/etzion/"&gt;Manning’s Event Processing in Action by Opher Etzion and Peter Niblett&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;a href="http://lh6.ggpht.com/_pkYZV8vEgBM/TVWF72ddKeI/AAAAAAAAAWg/Er1j_qq10Zw/s1600-h/Event-Processing-in-Action.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Event-Processing-in-Action" border="0" alt="Event-Processing-in-Action" src="http://lh5.ggpht.com/_pkYZV8vEgBM/TVWF8k65iAI/AAAAAAAAAWk/CADnUjFlYQU/Event-Processing-in-Action_thumb.jpg?imgmax=800" width="196" height="244" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Background&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Let me start by saying that, other than a rudimentary understanding of the base concepts, I began reading the title with a sum-total of zero knowledge of formalized event processing. I currently work in the healthcare industry and can see many practical applications of such a formal approach – from medical equipment monitoring patient health to reception of third party lab results, medication orders etc. it seems that a lot of what we do is essentially event processing – but we don’t always treat it as such.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;My Expectations&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Define the basics &lt;/li&gt;    &lt;li&gt;Explain why event processing would be beneficial to me &lt;/li&gt;    &lt;li&gt;Provide advice based on real world experience &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;The Book&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In short this book is a substantial body of effort, extremely well written and detail-oriented. I wouldn’t call it &lt;i&gt;enjoyable &lt;/i&gt;reading per se - it is not a particularly sexy topic to begin with – but definitely a worthwhile read. &lt;/p&gt;  &lt;p&gt;Event Processing in Action, as expected, starts out with an introduction to the world of event processing – providing detailed definitions of key terms as well as examples of computerized event processing. Event processing applications are then categorized and, most importantly, the authors explain when and why event processing should be used. This is pretty much exactly what I was looking for in an introduction. Moreover, everything was defined with extreme clarity and I was left with very few, if any, questions unanswered.&lt;/p&gt;  &lt;p&gt;The bulk of the book deals with the standard &lt;em&gt;building blocks &lt;/em&gt;that constitute event processing systems – an attempt to abstract away from a particular language or system and explain the constituent parts of such a system in a generic manner. If I had one reservation about the book it is that it is (mostly) language agnostic – I like to get my hands dirty and would loved to have seen at least a few chapters dealing with the setup and application of a real world system using a real world language – after reading the book I feel pretty well briefed in theory but not so much in real world application. As with the introductory material, the building block chapters go into great detail, discussing event types, consumers, producers, filters, etc. etc.&lt;/p&gt;  &lt;p&gt;My favorite section in the book dealt with the pragmatics behind the implementation of an event processing system including engineering and implementation considerations – specifically looking at non functional properties such as security, performance and availability. While this section was more descriptive than prescriptive it was refreshing to read and provided some interesting areas of discussion if/when my organization embarks upon an event processing solution.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;All-in-all this was an interesting and detailed book definitely worth reading. It hit all 3 of my expectations and I feel informed enough to implement and event processing system in my organization. Moreover, the book changed my mentality in terms of how such systems are architected – I think in most organizations there are numerous candidates for event processing systems that were structured in a less natural and less efficient manner. By reading this title, perhaps we can avoid some of the same mistakes the future – or at least have enough information at hand to make appropriate decisions.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-3866118332408751010?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/N4l94zNFNFRJPJ5_9vcKFx7DTMg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N4l94zNFNFRJPJ5_9vcKFx7DTMg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/N4l94zNFNFRJPJ5_9vcKFx7DTMg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N4l94zNFNFRJPJ5_9vcKFx7DTMg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=ekDeph2qGJA:ggtZjv4IyBc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=ekDeph2qGJA:ggtZjv4IyBc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=ekDeph2qGJA:ggtZjv4IyBc:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=ekDeph2qGJA:ggtZjv4IyBc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=ekDeph2qGJA:ggtZjv4IyBc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/ekDeph2qGJA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/3866118332408751010/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=3866118332408751010&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/3866118332408751010?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/3866118332408751010?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/ekDeph2qGJA/book-review-event-processing-in-action.html" title="Book Review - Event Processing in Action" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_pkYZV8vEgBM/TVWF8k65iAI/AAAAAAAAAWk/CADnUjFlYQU/s72-c/Event-Processing-in-Action_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/02/book-review-event-processing-in-action.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8BR3g7fCp7ImA9WhdUFkQ.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-156756610770015844</id><published>2011-02-04T14:07:00.001-06:00</published><updated>2011-10-03T20:47:36.604-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-03T20:47:36.604-05:00</app:edited><title>The Rise and Fall of my Notion Ink Adam</title><content type="html">&lt;p&gt;Today I’ll take a break from the world of programming to discuss my purchase, use, and immediate sale of the Notion Ink Adam – the latest pretender to the iPad throne. I’ve been waiting for this device since CES 2010 and, after a number of hiccups, it is finally here. If you’re looking for something with a few more curly braces, please come back tomorrow. Otherwise read on for my early opinions.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Before I get started with the device I’m going to give my two cents on the company and the preorder process. If you don’t want to read this (or if you feel like starting a flame war which I &lt;i&gt;really&lt;/i&gt; don’t want to get into) feel free to skip the next two sections. My goal isn’t to defame Notion Ink in any way. You wouldn’t marry someone without meeting the in-laws. The manufacturer is to the in-laws as the gadget is to the bride…if you stand under me… &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The Company&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Let me start by saying that I am impressed by what Notion Ink has achieved. For a small startup to achieve something of this magnitude is rare and impressive in equal doses, and I have to applaud anyone with the audacity to attempt to compete at this level. What I do not applaud is the arrogance the company has shown in ignoring its user-base. Time and again they have failed to release information, failed to answer questions, failed to provide updates regarding order timelines and shipping estimates and really, failed to be objective about their product. Only good news ever seems to make the cut, questions are answered arbitrarily (i.e. only questions with a happy answer are acknowledged) and the language used seems more indicative of a group of school kids at play than a large company. By all accounts the organization does not consider itself bound by the same rules as large multi-nationals, often spouting the argument that the Notion Ink Adam is not just a product – it is a dream coming to fruition - as if it transcends the needs of a regular device because of what it iconizes. Trying to get a straight answer to a legitimate question is a lesson in futility and, oddly, NI has built a small army of die-hard followers, seemingly without the benefit of critical reasoning (but with a healthy dose of naivety), who are willing to battle any genuine concern or criticism, towing the same bizarre party political line. I get particularly nervous when people refuse to hold their representatives accountable as is the case here. Squeaky bum time, so to speak…&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The Ordering Process&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Oh, the ordering process... I can say, without hesitation, that ordering the ADAM was the singular worst retail experience I have ever had. Period. I’m always wary of pre-sales treatment that I receive, because I know that once a company has my money, they will never have the same motivation to treat me well again. In short, pre-sale time is as good as it gets. If this is the best treatment I can hope for then I fear what is to come (for those who stay onboard). The ordering process was plagued by delays, expectations that were set but not met, a lack of any tangible information regarding the device (renders do not suffice), servers crashing, unstated charges ($50 shipping. Not unreasonable, but should have been made known), lack of &lt;i&gt;any &lt;/i&gt;proactive communication and credit card issues (for many, not me). I, like many, stayed up all night waiting for the unveiling of the preorder page, then waiting for the email with my preorder link, then waiting for the preorder time to roll around, then waiting for hours after the preorder time rolled around while the preorder page still suggested I come back at the original (long since passed) preorder time, then waiting patiently, refreshing in the hope that Notion Ink’s server would come online (or at least allow me get to the page necessary) so that I could order a tablet which, in hindsight, I did not know enough about. All the frustration, and all of the negativity I felt towards NI could have been belayed with a simple email or blog post by the company, explaining the situation to their users. Unfortunately, Notion Ink does not work that way..&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Why I bought the Device&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;So, rant over (for now). You’re probably wondering why I bought the damn thing. Well, I was having second thoughts about the Adam even before clicking the &lt;i&gt;order &lt;/i&gt;button. Notion Ink had missed &lt;i&gt;all &lt;/i&gt;of their pre-order deadlines, their site was going up and down like a yoyo and I still had seen nothing of the device outside of an early CES2010 demo and more recent screen renderings. The fact is, I had waited a year for this device. A year of reading blog posts and blog comments and most importantly a year of anticipating. I had seen demos of this device before the first iPad was released and had emotionally bought into the product way back then. Over a year later I could have chosen to wait for the &lt;i&gt;next &lt;/i&gt;big thing – but chances were that was a few months away – and frankly I had come too far to turn back. So, accepting the risk, I handed over my credit card information. While I feared the worst, I accepted responsibility for the device’s flaws, because I am an early adopter and the cutting edge tends to be pretty sharp.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The Build Up&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To their credit, when the device became available, NI shipped their first round via air and the turnaround time from China to the US was 3-4 business days (with a weekend lodged in the middle). Shortly afterwards, issues began to surface on forums regarding &lt;i&gt;bricked &lt;/i&gt;devices due to an over-the-air update, buggy software due to the lack of the over-the-air-update (after it was pulled), screen issues, bleeding colors, etc. etc. This was the last thing I wanted to hear but, to be fair, I have no idea how many Adams were shipped in the first round and therefore no idea of the percentage of people actually had issues. To clarify, rumors of &lt;i&gt;bricked &lt;/i&gt;devices were misleading – a bricked device is one beyond repair – Notion Ink provided a new ROM to affected users in very little time and, to my knowledge, they addressed any issues caused by the OTA update. Not only that, but their turnaround time was extremely quick – fixing the issue the same day it was encountered…I was definitely apprehensive based on early feedback from other customers, but did my best to remain unbiased in the interim.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The Screen – PixelQI&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I think the PixelQI screen (couple with the tegra processor) are what drew me to this device. Unfortunately, I was greatly disappointed by how it looked. I had realistic expectations – this was never going to look like a kindle – but the PixelQI mode definitely didn’t live up to expectations. For starters, it was impossible to read anything indoors – one needs a LOT of light for the text to be legible and, even when it is, the screen reminded me of a giant CASIO calculator. The contrast between text and background was not enough to make the text prominent and I ended up using it a handful of times and then giving up on it. My hope was that this would be useful indoors as a low-power alternative to full lcd mode. But, with the lights on in my apartments, I strained attempting to make out the text on the screen. Unfortunately, the tradeoff of PixelQI is that in LCD mode the screen is not as vibrant as a regular screen appearing a little washed out. In the end there was no benefit to outweigh this massive negative and I ended up disappointed…I’d like to see some other PixelQI examples because I’m not sure if this issue was caused by Notion Ink’s implementation or if my expectations were too high. Regardless, it is not the eBook reading experience I had longed for…&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The Hardware – General&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The Notion Ink seemed sturdy enough to me, but my wife (comparing it to an iPad) thought it looked and felt cheap – perhaps the difference being Notion Ink’s plastic construction. It felt similar in weight to the iPad and felt pretty good to hold. What I detested, and it is partially my fault for not reading the specs more closely and partially Notion Ink’s for showing misleading screen renders, is how long and skinny the screen was compare to that on the iPad. Holding the device vertically to read a book, the screen was very tall but very skinny in width and the reading experience felt quite bizarre and not something I would get used to. The sound, as other reviews have mentioned, was pretty good and pretty loud and didn’t have any complaints in that arena. I had intermittent issues watching videos on the device (and read similar complaints from other owners) where sometimes everything would be fine and other times (watching the exact same part of the exact same video) the sound would be delayed. This was particularly frustrating as it is something I’ve grown accustomed to &lt;i&gt;just working &lt;/i&gt;and when things go wrong I get a little cranky. The swivel camera is a neat idea, but frankly was a little less sturdy than I would have expected. Frankly speaking I’d be just as happy with a front and rear facing camera – but I do not see any use cases where I will record lectures, etc. Finally, I hooked the device up to a 37” LCD TV in order to test HDMI out – and it failed miserably. Essentially, the video slowed down (like it was being played in slow motion) as if too much processing power was required to play the file. This was reproducible and, frankly, made the feature useless to me.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;h4&gt;&lt;b&gt;The Software&lt;/b&gt;&lt;/h4&gt;  &lt;p&gt;&lt;u&gt;Ebook Reader&lt;b&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;I was gutted to find out that the ADAM (currently) ships without ANY eBook reader. Clicking an ePub in sniffer indicates that there is no app associated with that file type and there definitely aren’t any applications installed that would prove otherwise. This is a BIG deal to me – reading eBooks will probably be my primary use of the device (which is why I bought the PixelQI version) but is not supported out of the box. To those who suggest using a third party android app: aldiko does not scale well to this form factor and the text looks horrible, making it next to impossible to read anything on there. Kobo looks a little better, but the android version is feature poor (unlike the beautiful iPad version). I haven’t yet found anything to rival iBooks which, to be honest, I never considered an amazing piece of software (it does its job well, but there are few bells and whistles). NI have mentioned content partnerships, and an eBook leaf definitely appears in multiple of their newer videos, but right now there is nothing….&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Eden&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Notion Ink’s custom Eden interface is one of the nicest aspects of the device – out of the box the interface was ridiculously buggy, to such an extent that I could no longer wait for Notion Ink to fix their over-the-air updates and instead opted to flash the firmware to get the latest and greatest version. Immediately the user interface became far more responsive with a lot fewer crashes and the interface felt a lot more like the widget goodness Android users have grown to love rather than the typical iPad application launcher screen. There were few applications available that had a leaf mode, but the ones that did (sniffer, mail, browser) were pretty nice and made information easily accessible. Oddly, I never cared about the custom UI, but this is one of the device’s nicest features…I’m not sure if that is a good thing or a bad thing.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Sniffer&lt;b&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;A &lt;i&gt;big &lt;/i&gt;annoyance I had with the iPad was the rigmarole necessary to transfer a few files to the device or move said files between applications – I understand the need for sandboxes and safeguards but I always felt way too controlled when using the iPad and that frustrated me…a lot. There are a bunch of file browsers available for Android and Notion Ink’s version, Sniffer, is extremely nice. The launcher itself is (I think) quite pretty and it was a lovely experience to be able to navigate to a folder and open an MP3 or open an ePub without having to do it through a specific application. I also loved Eden’s sniffer leaf where it was possible to browse to and open files straight from my main screen – to move, delete, etc. I just had to launch the main app from the leaf. While I don’t see it happening I’d love to see Notion Ink open sourcing or selling Sniffer to make it available (in an above board manner) on other Android tablets. They definitely have some talented developers and designers on board and I’d love to see what else they are capable of, without necessarily needing an Adam.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Browser&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;The default browser shows promise but, even with the latest and greatest firmware, was quite buggy. For instance, typing an address into the address bar and hitting enter &lt;i&gt;didn’t do anything&lt;/i&gt; at all, and I was constantly forced to close the application and/or do a google search rather than being able to move between sites. This was frustrating enough that I side-loaded Dolphin HD after about 4 uses and never went back. Sadly the browser looked really nice and the tab interface was pretty cool, but it just wasn’t ready for general use…&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Mail’d&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;I love K9, an open source Android mail client. Mail’d is built on top of K9 and supports most if not all (I only connected a gmail account during my time with the device) of the features of K9 while adding some style and fitting the Adam form factor. It is also really good looking – sharing the same style as sniffer – and, complete with its trimmed down leaf mode version, was an enjoyable and functional mail client. Notion Ink &lt;/p&gt;  &lt;p&gt;&lt;u&gt;What Is Missing&lt;/u&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The android market for one thing. Sure, you can side-load many apps, but the inability to actually buy and download apps from Google felt like a pretty big void. Genesis, Notion Ink’s app store, is set to go live at an undetermined date but I wonder if enough developers will be willing to program for a specific device to enable it to gain traction.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The End&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;In the end I decided to sell my Notion Ink Adam. After spending so much time researching, discussing and anticipating it was sad to do so – but I knew if I waited until general release I would be unable to find a buyer. There were simply too many issues - physical, software and company related – to ignore and I knew I’d spend the lifetime of the product apologizing for the device. I’m saddened to think what could of happened had Notion Ink not had so many investor problems and this device was launched before the iPad last year. In this case time-to-market is everything and I fear the worst for Notion Ink. They seemingly do not have the necessary infrastructure to treat their customers the way (we high maintenance and technically competent) customers deserve and demand to be treated and I fear their loyal fan base will quickly dwindle if their communication strategy does not soon change for the better. The Notion Ink Adam feels like an unfinished product and, while I hope to see another version competing with the iPad (and other tablets in the future), I fear for the future of the Adam and Notion Ink as a whole. I recently sold my Adam and haven’t really looked back – since I received the Adam there have been no real updates on the Notion Ink site, and had I not upgraded the firmware manually, I’d still be using their bug-riddled V1 software…I wish all those who did (or will) buy an Adam all the best and hope that Notion Ink’s promise of innovation is realized in the future. I, for one, am going to pick up a Xoom when it is released later this month!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-156756610770015844?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4yuKgct00sRbZDViqAvELhLJcrA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4yuKgct00sRbZDViqAvELhLJcrA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4yuKgct00sRbZDViqAvELhLJcrA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4yuKgct00sRbZDViqAvELhLJcrA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=xpnvUcih35k:Oi70F6eF4Z8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=xpnvUcih35k:Oi70F6eF4Z8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=xpnvUcih35k:Oi70F6eF4Z8:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=xpnvUcih35k:Oi70F6eF4Z8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xpnvUcih35k:Oi70F6eF4Z8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/xpnvUcih35k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/156756610770015844/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=156756610770015844&amp;isPopup=true" title="16 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/156756610770015844?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/156756610770015844?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/xpnvUcih35k/rise-and-fall-of-my-notion-ink-adam.html" title="The Rise and Fall of my Notion Ink Adam" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>16</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/02/rise-and-fall-of-my-notion-ink-adam.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4NR3w8fip7ImA9Wx9XFE4.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-7615612711046912070</id><published>2011-01-07T14:43:00.001-06:00</published><updated>2011-01-07T14:43:16.276-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-07T14:43:16.276-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Review" /><title>Review - Croll &amp; Power's Communilytics Master Class</title><content type="html">&lt;p&gt;&lt;b&gt;Quick Summary&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I was eager to watch these videos but didn’t know what to expect. Happily I was met with excellent content, explained by an entertaining an knowledgeable instructor in a very well-produced package.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Like many developers, I am proficient in conceptualizing, designing, planning and implementing solutions, but after product delivery – when it comes to marketing and optimizing products for their target audience – my skillset thins out a little. While there is a wealth of information out there but finding cohesive and up-to-date information is near impossible. I was therefore excited to receive O’Reilly’s title &lt;i&gt;Croll &amp;amp; Power’s Communilytics Master Class&lt;/i&gt; for review. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Production Quality&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;This is the first O’Reilly video series that I had watched and I approached the title with slight trepidation. The Master Class is the recording of an in-person class that has been formatted and made for sale. I’ve seen similar offerings from other vendors in the past where production value was an afterthought – oftentimes with such offerings it is impossible to see the slides/whiteboard the presenter is working from, audience questions are muted and video quality poor at best. Fortunately O’Reilly has done a &lt;i&gt;great &lt;/i&gt;job on this title – and I am hopeful that their other titles are similar. Rather than pointing the camera at a screen/whiteboard, content slides have been merged into the feed during production and are displayed in full screen during video playback. Audio and video are crisp and the camera work is extremely professional (moreso than in any other classroom title I have seen). In essence production value is like a referee – you really only notice it when its bad…&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The Speaker&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;While the content was created by Alistair Croll and Sean Power, Mr. Croll is the speaker for the entire master class. He does a fantastic job of engaging the viewer and blends pre-prepared and conversational information masterfully. The subject &lt;i&gt;could &lt;/i&gt;have been extremely dry with plenty of numbers and statistics to quote, but is somehow delivered in an entertaining fashion throughout. Time flew by when watching these videos – a testament to both the content and Mr. Croll’s presentation skills. This is the first time I’ve seen anything delivered by Alistair Croll but I’ll make sure to look out for more in the future.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The Content&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;This series contains approximately 3.5 hours of video, full of valuable information regarding web analytics and community building. For the most part the information tends more towards descriptive than prescriptive as the course leads the viewer through many of the pitfalls and opportunities analytics helps to address, including a number of case studies. Data is quantified and claims are backed up with real world studies and experience. The content is extremely accessible and would be equally beneficial and comprehensible to a marketing manager or developer. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;The Price&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Compared to a $200 annual Tekpub subscription (and similar counterparts) the course seems a little expensive at $80. On the other hand, compared to attending such a class in person the price seems very reasonable. Inevitably spending decisions come down to cost benefit analysis and I can safely say there is a ton of information here to justify the purchase. It is difficult to put a price on knowledge. However, I tend to value an hour of my personal time (quite conservatively, may I add) at $20. I can say without a shadow of a doubt that the knowledge, tips and shortcuts in this series will save me more than 4 hours (and $80) in the future.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I was eager to watch these videos but didn’t know what to expect. Happily I was met with excellent content, explained by an entertaining an knowledgeable instructor in a very well-produced package. If anything this series needs a sequel – and I would be first in line to purchase it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-7615612711046912070?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mFKtFwdEDJzIKkSjsrggBayU1pc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mFKtFwdEDJzIKkSjsrggBayU1pc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mFKtFwdEDJzIKkSjsrggBayU1pc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mFKtFwdEDJzIKkSjsrggBayU1pc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=Hw3h7gJA_5M:pDIMFiDb1OQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=Hw3h7gJA_5M:pDIMFiDb1OQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=Hw3h7gJA_5M:pDIMFiDb1OQ:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=Hw3h7gJA_5M:pDIMFiDb1OQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Hw3h7gJA_5M:pDIMFiDb1OQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/Hw3h7gJA_5M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/7615612711046912070/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=7615612711046912070&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/7615612711046912070?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/7615612711046912070?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/Hw3h7gJA_5M/review-croll-power-communilytics-master.html" title="Review - Croll &amp;amp; Power&amp;#39;s Communilytics Master Class" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2011/01/review-croll-power-communilytics-master.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8HR3c7eyp7ImA9Wx9RFkw.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-2881986890032210820</id><published>2010-12-12T20:17:00.001-06:00</published><updated>2010-12-17T13:07:16.903-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-17T13:07:16.903-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="ebook" /><title>2010 - The Year of the eBook–A Comparison of Technical eBook Publishers</title><content type="html">&lt;p&gt;&lt;font size="2"&gt;I officially declare 2010 the year of the eBook. In July I purchased an iPad – my first eBook reader – and my reading habits have changed somewhat dramatically. I am buying more than ever, reading more than ever and my thirst for knowledge has skyrocketed – a result, I believe, of accessibility to my whole library anytime, anywhere.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;My physical to digital (2009) transition from CD to MP3 highlighted a single important fact – I am a hoarder. Sure, I love to read and I love to listen to music. But probably not as much as I like to collect things, hoard things and, as I believe is often the case with those who like to hoard (embarrassing as it is) to show off those collections…there’s nothing quite like a bookshelf full of intelligent looking books… :-)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;In the 6 short months since I bought the device I’ve built up a substantial technical library (and a non-too-shabby non-technical library) of digital books. I’ve purchased from pretty much every technical eBook vendor in the .NET space with varying degrees of success and in this post hope to summarize my experiences.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;Note: While PDF is obviously a portable format, when I discuss &lt;em&gt;mobile &lt;/em&gt;formats I’m focusing on ePub/mobi and other formats that better suit eReaders and tablets – including the ability to reflow text, resize fonts and provide the reader with a better overall reading experience&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;font size="2"&gt;Criteria&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;These are the things that affect my eBook shopping habits and therefore on which vendors are rated.&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;Cost/Deals &lt;/font&gt;      &lt;ul&gt;       &lt;li&gt;&lt;font size="2"&gt;Bang-for-my buck is an upmost consideration. If I really want/need a particular book then I will buy it regardless. However, for anything on my medium-to-long-term wish list, I am easily won over by a good deal or promotion. A number of technical publishers wisely leverage email promotions/daily deals/etc. &lt;/font&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Upgrade Path &lt;/font&gt;      &lt;ul&gt;       &lt;li&gt;&lt;font size="2"&gt;If I buy a print book I expect an option to attain the eBook, for free or at cost. If at cost, I expect it to be reasonable – if I’ve already bought one version of the book it shouldn’t cost the same amount to buy a digital format of the same book. &lt;/font&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Available Formats &lt;/font&gt;      &lt;ul&gt;       &lt;li&gt;&lt;font size="2"&gt;I believe that when the dust settles the ePub format will emerge the victor. The format seems pretty open compared to proprietary format, but allows for DRM and other mechanisms desired by publishers. Regardless of who reigns supreme, I want the option to read my book on an iPad or kindle or whatever comes next. To me the formats supported reflects the publisher’s progressive mentality (in this industry it is a must) and agility when change occurs.&lt;/font&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Access to Downloads&lt;/font&gt;       &lt;ul&gt;       &lt;li&gt;&lt;font size="2"&gt;When Google’s eBook store was announced, I was confused by the advertised personal cloud storage. At first I took this to mean one could access their downloads at any point in the future – a feature prevalent now but one that a number of vendors have only introduced in the last few months. Google, however, was talking about something more – the ability to read your books from any device (PC, Android, iPhone, etc.), picking up from where you left off. While this is an extremely cool feature – similar to the Kindle's offering – it is something that doesn’t interest me outside of a “how did they program that?” sort of way. I like the dedicated iBooks app on the iPad and do not expect to read much on my desktop pc or my android phone. As such, the feature really does nothing for me. What does matter is the more rudimentary ability to get at my files now and in the future. At this point pretty much all of the vendors on the list have a portal for you to grab your books from, making life easy. Anything beyond that doesn’t excite me much.&lt;/font&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;&lt;u&gt;Publishers&lt;/u&gt;&lt;/h5&gt;  &lt;p&gt;&lt;font size="2"&gt;Below is a breakdown of vendors and my reflections on my experiences as a whole. I am not rating the quality of content – there are too many variables (authors, content type, technical level, etc.) for me to feel comfortable to rate the publishers themselves. However, after spending months purchasing and consuming digital books I am confident that my feedback aptly summarizes each vendor’s eBook capabilities.&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;&lt;u&gt;Manning (4 out of 5)&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;&lt;font size="2"&gt;I’ve always been a fan of Manning’s contend and I’ve bought a bunch of Manning print and eBooks over the past year. &lt;/font&gt;&lt;/p&gt;  &lt;h6&gt;&lt;strong&gt;&lt;font size="2"&gt;The Good&lt;/font&gt;&lt;/strong&gt;&lt;/h6&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;Manning offers a &lt;strong&gt;f&lt;/strong&gt;ree digital copy of their titles with the purchase of a hard copy. When I originally bought my eBook reader I was able to obtain copies of a couple of recent purchases – at no extra cost. Since then, I’ve bought a number of hard copies with the knowledge that I would also receive the soft copy – had the soft copy incurred an additional cost I might not have done so. I feel that Manning is quite progressive in this regard and the ability to attain the digital copy free of charge has built a lot of goodwill in my mind.&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;File types – Manning offers the three file types that I care most about.&lt;/font&gt;       &lt;ul&gt;       &lt;li&gt;&lt;font size="2"&gt;PDF &lt;/font&gt;&lt;/li&gt;        &lt;li&gt;&lt;font size="2"&gt;epub &lt;/font&gt;&lt;/li&gt;        &lt;li&gt;&lt;font size="2"&gt;mobi&lt;/font&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Up to recently you had 5 days to download a title after which time it was no longer available. Manning has added a portal for customers to download all of their content at any point in time. &lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Manning has daily deals (and Christmas raffles) offering heavily discounted print and/or eBook titles. Frequently eBooks are offered for $15 - I cannot tell you how many of these titles I have purchased but I probably don’t have enough hands to count them all :-)&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;DRM Free&lt;/li&gt; &lt;/ul&gt;  &lt;h6&gt;&lt;strong&gt;&lt;font size="2"&gt;The Bad&lt;/font&gt;&lt;/strong&gt;&lt;/h6&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;A number of older titles do not have ePub/mobi versions and are limited to PDF. There are a few titles (&lt;em&gt;WPF with Visual Studio 2008&lt;/em&gt; for instance) that do not have updated equivalents and for which no ePub/mobi is available). It would be great if books from the last X number of years were also upgraded (though I understand why this might not be possible)&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Manning is a little slow releasing ePubs/Mobis for new titles. That said, they provide clear information as to which titles are next up for conversion under their &lt;em&gt;mobile format &lt;/em&gt;section.&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;strong&gt;&lt;u&gt;O’ Reilly (4 out of 5)&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;O’ Reilly has the benefit of selling both O’Reilly and Microsoft Press titles. I’m a fan of both and have bought a number of books in the last year.&lt;/p&gt;  &lt;h6&gt;&lt;strong&gt;&lt;font size="2"&gt;The Good&lt;/font&gt;&lt;/strong&gt;&lt;/h6&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;O’Reilly offers more eBook titles (specifically ePub/Mobi) than anyone else I’ve seen. Their catalog, combined with MS Press titles also sold through the site, is simply enormous. &lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;O’Reilly currently offers a cheap upgrade option - limited time $5 upgrades – for those who purchase print versions of their titles. &lt;/font&gt;&lt;font size="2"&gt;Manning has daily deals offering heavily discounted eBook titles. Books tend to be in the $10-$20 range.&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;DRM Free&lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;File types – O’ Reilly is the most progressive in this area, offering more file types than anyone else I’ve seen &lt;/font&gt;      &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;&lt;font size="2"&gt;PDF &lt;/font&gt;&lt;/li&gt;          &lt;li&gt;&lt;font size="2"&gt;epub &lt;/font&gt;&lt;/li&gt;          &lt;li&gt;&lt;font size="2"&gt;mobi &lt;/font&gt;&lt;/li&gt;          &lt;li&gt;&lt;font size="2"&gt;APK &lt;/font&gt;&lt;/li&gt;          &lt;li&gt;&lt;font size="2"&gt;DAISY &lt;/font&gt;&lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h6&gt;&lt;strong&gt;&lt;font size="2"&gt;The Bad&lt;/font&gt;&lt;/strong&gt;&lt;/h6&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;       &lt;p&gt;While I consider $5 a very reasonable price for eBook upgrades, given that Manning’s are free O’Reilly loses a point here. Also, the $5 upgrade is coupon based and feels like it may be transient.&lt;/p&gt;     &lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;       &lt;p&gt;O’Reilly’s daily deal used to be $9.99 consistently. In the last month or two this appears to have change to $14.99. While still great value for money, the initial price point was more satisfactory. &lt;/p&gt;     &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;u&gt;Packtpub (2 out of 5)&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;&lt;font size="2"&gt;Packtpub has been the biggest disappointment for me this year. They have quite a large range of books on a wide variety of topics and I don’t doubt the quality of their work. However, I have made multiple purchases at different times this year where the product page specified that an epub version of the title is available, only to find after purchase that this is not the case. At best there is a lack of communication and transparency. At worst dishonest bait-and-switch tactics are being employed. Customer service has been apologetic, but as of writing this post the same titles remain with the same promises on their product pages – but still no ePubs in site. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;The Good&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;Large selection of titles – including technologies not available elsewhere&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Weekend deals and some &lt;em&gt;extremely &lt;/em&gt;cheap seasonal package deals&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;DRM Free&lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;The Bad&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;Lack of transparency – you may not get what you thought you were getting.&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Limited File types – Packtpub is limited to the following 2 file types:&lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;&lt;font size="2"&gt;PDF &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2"&gt;epub &lt;/font&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;p&gt;&lt;font size="2"&gt;&lt;!--EndFragment--&gt;&lt;/font&gt;&lt;/p&gt; &lt;/ul&gt;  &lt;ul&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;!--EndFragment--&gt;&lt;/font&gt;&lt;/ul&gt;  &lt;h4&gt;&lt;u&gt;Google Books (New) – (Not enough Information for Rating)&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;&lt;font size="2"&gt;Google’s online bookstore launched a couple of weeks before this post was published but, as with all things &lt;font size="2"&gt;Google&lt;/font&gt;, is exciting (or scary – depending where you are coming from) due to its sheer scale. There are a ton of books available. To date I have only purchased one, but it certainly won’t be my last.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;The Good&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;&lt;u&gt;Massive&lt;/u&gt; range of titles &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;The Bad&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="2"&gt;To date prices have been pretty standard – however there are no signs of any regular or seasonal deals that would force me into impulse buying. Hopefully this will be rectified in the future.&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Google is currently pushing its own reader app&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Limited File types – Google is limited to the following 2 file types:&lt;/font&gt;&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;font size="2"&gt;PDF &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2"&gt;epub &lt;/font&gt;&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;&lt;font size="2"&gt;ePubs are DRM’d &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;u&gt;The Others&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;&lt;font size="2"&gt;There are a large number of vendors out there that I simply have not shopped with and thus couldn’t include in this write-up. I’m really hoping that in the next 12 months both Wrox and Apress get their acts together and offer a) a bigger lineup of ebooks and b) upgrade paths to those who bought print copies. Right now I have a bunch of print books from both publishers that I plan to read, but are taking a second seat to their electronic counterparts. I’ve reached the point where I will do everything in my power to avoid buying a book that doesn’t have a mobile version. Hopefully my collection will be 100% electronic this time next year!&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/1137761125875994292-2881986890032210820?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/me8GklHhrNivid4EZ7_qXD5T2gQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/me8GklHhrNivid4EZ7_qXD5T2gQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/me8GklHhrNivid4EZ7_qXD5T2gQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/me8GklHhrNivid4EZ7_qXD5T2gQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=mwmaIL7kYOY:s1f2zuVIVDA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=mwmaIL7kYOY:s1f2zuVIVDA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=mwmaIL7kYOY:s1f2zuVIVDA:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=mwmaIL7kYOY:s1f2zuVIVDA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=mwmaIL7kYOY:s1f2zuVIVDA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/mwmaIL7kYOY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/2881986890032210820/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=2881986890032210820&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/2881986890032210820?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/2881986890032210820?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/mwmaIL7kYOY/2010-year-of-ebooka-comparison-of.html" title="2010 - The Year of the eBook–A Comparison of Technical eBook Publishers" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/12/2010-year-of-ebooka-comparison-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcCSHk5fCp7ImA9Wx9TEko.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-6788591818712332198</id><published>2010-11-20T12:15:00.001-06:00</published><updated>2010-11-20T12:17:49.724-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-20T12:17:49.724-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Personal" /><title>Protecting myself from myself</title><content type="html">&lt;p&gt;&lt;strong&gt;Note: This is a COMPLETELY non technical post. Feel free to skip…&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Back home (in Ireland…I now live in the US) the fall series of international rugby is in full swing. In order to watch every game I need to run through a few hoops and a combination of energy levels and other commitments means that I rarely get to see the games live on Saturday mornings/afternoons. &lt;/p&gt;  &lt;p&gt;What is worst of all is that I have a subconscious tendency to navigate to the RTE (Raidió Teilifís Éireann – Irelands public service broadcaster) website many times a day, inevitably discovering game scores on the homepage and somewhat defusing the excitement of the games before I’ve had a chance to watch them.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_pkYZV8vEgBM/TOgQLzhQcyI/AAAAAAAAAVY/85nf803XBtY/s1600-h/image%5B11%5D.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_pkYZV8vEgBM/TOgQM9H1JwI/AAAAAAAAAVc/I9FQVH3mi-I/image_thumb%5B9%5D.png?imgmax=800" width="540" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I decided to take a stand and protect me from myself – I found a nifty little extension for Chrome named StayFocused which allows the user to define a daily allowance of time to be spent on a site per day. Setting this to 1 minute (while holding a notebook in front of my monitor to block the live score of the game :o) ) allowed me to block access to the RTE site on my computer for the day. Navigating to the RTE website I’m immediately redirected to the above page. Awesome!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-6788591818712332198?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bqlYaDVabFjGBbAOXeGBVaBxmaY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bqlYaDVabFjGBbAOXeGBVaBxmaY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bqlYaDVabFjGBbAOXeGBVaBxmaY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bqlYaDVabFjGBbAOXeGBVaBxmaY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=6SxChTc2tQI:qPzRyd-fT2Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=6SxChTc2tQI:qPzRyd-fT2Y:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=6SxChTc2tQI:qPzRyd-fT2Y:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=6SxChTc2tQI:qPzRyd-fT2Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=6SxChTc2tQI:qPzRyd-fT2Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/6SxChTc2tQI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/6788591818712332198/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=6788591818712332198&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/6788591818712332198?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/6788591818712332198?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/6SxChTc2tQI/protecting-myself-from-myself.html" title="Protecting myself from myself" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_pkYZV8vEgBM/TOgQM9H1JwI/AAAAAAAAAVc/I9FQVH3mi-I/s72-c/image_thumb%5B9%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/11/protecting-myself-from-myself.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAMRnwycSp7ImA9Wx5aGEk.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-3042716132772190123</id><published>2010-11-15T11:56:00.001-06:00</published><updated>2010-11-15T11:56:27.299-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-15T11:56:27.299-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xaml" /><category scheme="http://www.blogger.com/atom/ns#" term="visual studio 2008" /><title>Visual Studio 2008 – Garbled Text in XAML View</title><content type="html">&lt;p&gt;Since switching to Windows 7 on my work laptop I've had pretty constant issues with the XAML designer in Visual Studio 2008. Essentially, when I scroll through the XAML code the text becomes garbled and near impossible to read. Switching back and forth between views works, but is a dirty, frustrating and somewhat time-consuming solution. It is also one of those things that works fine on everyone else's computer (to be honest I'm still not sure why) and is difficult to find appropriate keywords for when searching online.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_pkYZV8vEgBM/TOF0RZXPgOI/AAAAAAAAAVI/g2jJ9BqTwyo/s1600-h/garbledtext%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="garbledtext" border="0" alt="garbledtext" src="http://lh5.ggpht.com/_pkYZV8vEgBM/TOF0SR2iRkI/AAAAAAAAAVM/Syfd05IPEbs/garbledtext_thumb%5B1%5D.png?imgmax=800" width="554" height="245" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;This morning I came across an issue logged on Microsoft's connect page (&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/465834/visual-studio-2008-xaml-editor-doesnt-paint-properly)"&gt;http://connect.microsoft.com/VisualStudio/feedback/details/465834/visual-studio-2008-xaml-editor-doesnt-paint-properly)&lt;/a&gt; with similar symptoms to my own. In the comments section Mark Wilson-Thomas (of the WPF and Silverlight team) suggested doubling the number of available GDI handles - which is defaulted to 10,000 on Windows 7. &lt;/p&gt;  &lt;p&gt;So, I updated the following registry key DWORD value from 2710 hex (10,000 decimal) to 4e20 (20,000 decimal)&lt;/p&gt;  &lt;p&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuota&lt;/p&gt;  &lt;p&gt;I then restarted VS2008 and, voila, no more garbled text. Happy days!   &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-3042716132772190123?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YwtplcSotijcFlXIUNzx3PIbYh0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YwtplcSotijcFlXIUNzx3PIbYh0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YwtplcSotijcFlXIUNzx3PIbYh0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YwtplcSotijcFlXIUNzx3PIbYh0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=bNQH9LeYQ-w:rypoKwZGcTE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=bNQH9LeYQ-w:rypoKwZGcTE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=bNQH9LeYQ-w:rypoKwZGcTE:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=bNQH9LeYQ-w:rypoKwZGcTE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=bNQH9LeYQ-w:rypoKwZGcTE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/bNQH9LeYQ-w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/3042716132772190123/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=3042716132772190123&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/3042716132772190123?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/3042716132772190123?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/bNQH9LeYQ-w/visual-studio-2008-garbled-text-in-xaml.html" title="Visual Studio 2008 – Garbled Text in XAML View" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_pkYZV8vEgBM/TOF0SR2iRkI/AAAAAAAAAVM/Syfd05IPEbs/s72-c/garbledtext_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/11/visual-studio-2008-garbled-text-in-xaml.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUFSXw5fyp7ImA9Wx5UEkk.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-7169341349923585774</id><published>2010-10-15T16:45:00.001-05:00</published><updated>2010-10-16T11:40:18.227-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-16T11:40:18.227-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Rant" /><category scheme="http://www.blogger.com/atom/ns#" term="unit-testing" /><category scheme="http://www.blogger.com/atom/ns#" term="JustMock" /><category scheme="http://www.blogger.com/atom/ns#" term="MOQ" /><title>What a Difference a Clear Error Message Makes</title><content type="html">&lt;p&gt;Let me be the first to say (and everyone should echo in harmony) that this issue was 100% my fault. Today I spent at least an hour of my life trying to track down an issue caused, simply, by the fact that I was trying to mock a sealed class without realizing it…&lt;/p&gt;  &lt;p&gt;The point of this post is not to illustrate what went wrong. The point of this post is to show the error messages displayed by two popular mocking frameworks and highlight the benefit of clear messages. Recently I’ve been using Telerik’s JustMock framework but in the past MOQ has been my framework of choice. I’ve always found MOQ’s messages useful – it seems like the developers put a lot of thought into what the user sees – and after struggling to debug the issue for a while I figured I’d switch frameworks (for this individual test) to see if it would provide any more insight. &lt;/p&gt;  &lt;p&gt;Take a look at the difference between error messages. Which one would you prefer?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JustMock&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;System.InvalidProgramException : Common Language Runtime detected an invalid program&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;MOQ&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;System.ArgumentException : Type to mock must be an interface or an abstract or non-sealed class.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Note: I’m not trying to bash JustMock in any way. To date I have been pretty happy with said framework and this has been somewhat of an isolated issue…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-7169341349923585774?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zkCLyLOeoufeT28XVrb_sbH8I-M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zkCLyLOeoufeT28XVrb_sbH8I-M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zkCLyLOeoufeT28XVrb_sbH8I-M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zkCLyLOeoufeT28XVrb_sbH8I-M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=KRCc8RT3FeU:JALiahRNWpM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=KRCc8RT3FeU:JALiahRNWpM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=KRCc8RT3FeU:JALiahRNWpM:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=KRCc8RT3FeU:JALiahRNWpM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=KRCc8RT3FeU:JALiahRNWpM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/KRCc8RT3FeU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/7169341349923585774/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=7169341349923585774&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/7169341349923585774?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/7169341349923585774?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/KRCc8RT3FeU/what-difference-clear-error-message.html" title="What a Difference a Clear Error Message Makes" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/10/what-difference-clear-error-message.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIAQno7fSp7ImA9Wx5WGEw.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-24016278086256853</id><published>2010-09-29T22:49:00.001-05:00</published><updated>2010-09-29T22:49:03.405-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-29T22:49:03.405-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Team Foundation Server" /><category scheme="http://www.blogger.com/atom/ns#" term="unit-testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Book Review" /><category scheme="http://www.blogger.com/atom/ns#" term="Continuous Integration" /><title>Book Review–Continuous Integration in .NET</title><content type="html">&lt;p&gt;&lt;b&gt;Disclosure: I received a review copy of Continuous Integration in .NET from Manning. &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I don’t normally blog book reviews – mostly because it requires a specific skillset that I do not necessarily possess. However, due to some fortuitous timing I jumped on the chance to receive a review copy of Manning’s new title - Continuous Integration in .NET by Marcin Kawalerowicz and Craig Berntson. &lt;/p&gt;  &lt;p&gt;&lt;img src="http://manning.com/kawalerowicz/kawalerowicz_cover150.jpg" width="252" height="310" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;One of my many hats right now is &lt;i&gt;version control manager &lt;/i&gt;of our team – a role I inherited rather than requested but one that nevertheless led to a deep interest in all things VC and build related. Due to the restructuring of MSDN’s licensing tiers our team is finally in the position to utilize Team Foundation Server as our version control repository. Having successfully sold the migration to the powers-that-be, and having previously started the team down the path to TDD, I’m interested in leveraging a number of incorporated technologies – at the very front of the pack is Continuous Integration. Our shop has never had a CI process, but that is about to change.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The version of this book I read is a MEAP (Manning Early Access Preview) meaning that it is not the finished product. Specifically, and sadly, the final chapter &lt;em&gt;Scaling Continuous Integration &lt;/em&gt;is not complete at this time. My review is of what is available as of 9/20/2010&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;My Expectations&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;· Explain why we need Continuous Integration&lt;/p&gt;  &lt;p&gt;· Define the basics&lt;/p&gt;  &lt;p&gt;· Go through full setup and lifecycle&lt;/p&gt;  &lt;p&gt;· Provide tips and tricks for advanced scenarios &lt;/p&gt;  &lt;p&gt;· Provide advice based on real world experience&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Book&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Continuous Integration in .NET&lt;/em&gt; as expected starts out with an introduction to Continuous Integration, explaining in simple terms why it is needed and how it can be used. The notion of source control is introduced and then a manual automated build is illustrated showing how one, if they so desired, could do the grunt work to set up a trivial automated build. The 4th chapter, &lt;em&gt;Choosing the Right CI Server&lt;/em&gt;, is where the real meat begins and the rest of the book deals with integrating commonly used technologies – unit testing frameworks, deployment tools, documentation generators, etc. – with the CI tools of choice.&lt;/p&gt;  &lt;p&gt;After reading this book for a little while it hit me that the Continuous Integration itself is little more than an aggregation of other technologies and mechanisms, bundled together towards the common goal of automating tasks that may not otherwise receive the attention they deserve. The book acts as a 100 foot view of Continuous Integration in .NET environments. The authors do not choose a specific CI tool, but instead use Team Foundation Server, TeamCity and CruiseControl.NET, evolving their CI process by adding new steps as the book progresses. I really enjoyed the comparison of these CI servers and, while concise, it highlighted well the reasons to choose one over another. I’d like to have seen a few more thrown in for good measure but, frankly, these seems to be the big players anyway so I’m probably being picky.&lt;/p&gt;  &lt;p&gt;The book’s greatest strength is probably also its greatest weakness – the huge scope of CI, coupled with the use of 3 CI servers, means that generalization is preferred to specialization and the book covers MANY of the basic tenets of CI, but does not delve very deep into any one topic. This is not a criticism of the title – it appears to be an explicit tradeoff that the writers made and was not unexpected. By the end of the book a novice should know exactly what CI is, the different types of automated builds available to them and integrate everything from email notifications to unit testing to code analysis…and then some. The book is easy to read and never feels overly technical (perhaps because of the content material) and I found it very accessible. If, despite my grogginess, I can read a technical book on my morning train ride to work, then it deserves some credit! &lt;/p&gt;  &lt;p&gt;Because I am already very familiar with Version Control, Unit Testing, WiX, Clickonce and a number of other technologies in the book I felt myself skimming over a lot of material that would have been useful earlier in my career. I speed-read my way through the sections on unit testing and found that there while the authors did a good job of explaining how to integrate such testing into one’s CI process and have the results displayed through the CI GUIs, most of chapters 6 &amp;amp; 7 were wasted on me. I’d like to have seen more real world information and definitely some gotchas based on industry experience. Unfortunately such information was not contained in the MEAP version I read. &lt;/p&gt;  &lt;p&gt;Interestingly I would love to give a copy of this book to (junior) newcomers on our team. Not only does the book provide an excellent description of the ins and outs of CI but it also explains in detail a large number of best practices in the software industry today and illustrates practical approaches to implementing them. &lt;/p&gt;  &lt;p&gt;All-in-all this was a good book, definitely worth reading. It hit about 3 of 5 of my expectations (listed above) and as a precursor to my first foray into the world of CI it was useful to get a lowdown on the CI options available to me and guides to hook up other technologies to these CI servers. I’d definitely recommend the title to newcomers to CI and also to those interested in related technologies. However, if you’ve already leveraged CI, or are proficient with Unit Testing/Code Analysis/etc. the value you derive from this book may be a little more limited.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-24016278086256853?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7VaODyJXK0uukmWcDUi4Ct4d1M0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7VaODyJXK0uukmWcDUi4Ct4d1M0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7VaODyJXK0uukmWcDUi4Ct4d1M0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7VaODyJXK0uukmWcDUi4Ct4d1M0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=Qp8FYhfUMFk:G1cgZ2LBnu4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=Qp8FYhfUMFk:G1cgZ2LBnu4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=Qp8FYhfUMFk:G1cgZ2LBnu4:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=Qp8FYhfUMFk:G1cgZ2LBnu4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=Qp8FYhfUMFk:G1cgZ2LBnu4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/Qp8FYhfUMFk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/24016278086256853/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=24016278086256853&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/24016278086256853?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/24016278086256853?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/Qp8FYhfUMFk/book-reviewcontinuous-integration-in.html" title="Book Review–Continuous Integration in .NET" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/09/book-reviewcontinuous-integration-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYNRXw9cCp7ImA9Wx5XGEo.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-5569837675856538431</id><published>2010-09-19T01:19:00.001-05:00</published><updated>2010-09-19T01:19:54.268-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-19T01:19:54.268-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vss" /><category scheme="http://www.blogger.com/atom/ns#" term="Team Foundation Server" /><category scheme="http://www.blogger.com/atom/ns#" term="visual sourcesafe" /><category scheme="http://www.blogger.com/atom/ns#" term="source control" /><title>TFS – XSLT to transform VSSConverter to Project Creation Settings File</title><content type="html">&lt;p&gt;For the last few weeks I’ve been spending a decent portion of my time (jointly) planning and testing my team’s migration from VSS to TFS. While I’m a big fan of Microsoft’s development platform I’ve been pleasantly surprised at the simplicity of the migration process. Visual Studio 2010 brings with it a command line application called VSSConverter which takes an XML file and completes transfer of code and history with almost no input…&lt;u&gt;almost&lt;/u&gt;! The file looks like this:&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:696e49fa-ef13-43ac-a891-f720b89c6bf7" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;SourceControlConverter&amp;gt;&lt;br /&gt;  &amp;lt;ConverterSpecificSetting&amp;gt;&lt;br /&gt;    &amp;lt;Source name="VSS"&amp;gt;&lt;br /&gt;      &amp;lt;VSSDatabase name="C:\TFSMigration\vss_database"&amp;gt;&amp;lt;/VSSDatabase&amp;gt;&lt;br /&gt;      &amp;lt;UserMap name="c:\UserMap.xml"&amp;gt;&amp;lt;/UserMap&amp;gt;&lt;br /&gt;    &amp;lt;/Source&amp;gt;&lt;br /&gt;    &amp;lt;ProjectMap&amp;gt;&lt;br /&gt;      &amp;lt;Project Source="$/BillingProject/BillingProject/Client" Destination="$/BillingProject/Client"&amp;gt;&amp;lt;/Project&amp;gt;&lt;br /&gt;      &amp;lt;Project Source="$/BillingProject/BillingProject/Server" Destination="$/BillingProject/Server"&amp;gt;&amp;lt;/Project&amp;gt;&lt;br /&gt;    &amp;lt;/ProjectMap&amp;gt;&lt;br /&gt;  &amp;lt;/ConverterSpecificSetting&amp;gt;&lt;br /&gt;  &amp;lt;Settings&amp;gt;&lt;br /&gt;    &amp;lt;TeamFoundationServer name="myserver.mydomain.com" port="8080" protocol="http" collection="tfs/MyProjectCollection"&amp;gt;&lt;br /&gt;&amp;lt;/TeamFoundationServer&amp;gt;&lt;br /&gt;  &amp;lt;/Settings&amp;gt;&lt;br /&gt;&amp;lt;/SourceControlConverter&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;One frustration I have with the tool is that, while you must define your VSS-to-TFS project mapping, TFS projects are not automatically created – they must be created one-by-one using Visual Studio prior to migration. If you have a large number of projects (which we do) this can be quite frustrating (increasing exponentially with every test iteration run).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Fortunately, TFS’s &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/3e8c9b68-6e39-4577-b9b7-78489b5cb1da"&gt;powertools&lt;/a&gt; provide a mechanism to create projects based on a setting file. The command is as follows:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;p&gt;TFPT createteamproject /settingsfile:1.xml&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Unfortunately a) it cannot use the existing information in the TFS conversion scripts and b) a separate setting file is required for each project to be created.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To save some time I wrote the following XSLT file. Applied to a VSS-to-TFS conversion file it will output an individual xml file for each project defined therein (filenames are incremented – 1.xml, 2.xml, etc.). Obviously some settings (TFS server/process template/etc.) are hard-coded and may need to be modified.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:c811c088-40e8-497f-867d-ecf6fb9f35bd" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet &lt;br /&gt;  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" &lt;br /&gt;  version="2.0"&amp;gt;&lt;br /&gt;&amp;lt;xsl:output method="xml" indent="yes"/&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match="ProjectMap"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;xsl:for-each select="Project"&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name="filename" select="concat('output/',position(),'.xml')" /&amp;gt;&lt;br /&gt;&amp;lt;xsl:value-of select="$filename" /&amp;gt;  &lt;br /&gt;&amp;lt;xsl:result-document href="{$filename}"&amp;gt;&lt;br /&gt;&amp;lt;Project xmlns="ProjectCreationSettingsFileSchema.xsd"&amp;gt;      &lt;br /&gt;        &amp;lt;TFSName&amp;gt;http://mytfsserver:8080/tfs/myprojectcollection&amp;lt;/TFSName&amp;gt; &lt;br /&gt;       &amp;lt;LogFolder&amp;gt;c:\temp&amp;lt;/LogFolder&amp;gt; &lt;br /&gt;       &amp;lt;ProjectName&amp;gt;&amp;lt;xsl:value-of select="substring-before(substring-after(@Destination,'$/'),'/')"/&amp;gt;&amp;lt;/ProjectName&amp;gt; &lt;br /&gt;       &amp;lt;ProjectSiteEnabled&amp;gt;true&amp;lt;/ProjectSiteEnabled&amp;gt; &lt;br /&gt;       &amp;lt;ProjectSiteTitle&amp;gt;&amp;lt;xsl:value-of select="@Destination"/&amp;gt;&amp;lt;/ProjectSiteTitle&amp;gt;                  &lt;br /&gt;       &amp;lt;ProjectSiteDescription&amp;gt;&amp;lt;/ProjectSiteDescription&amp;gt; &lt;br /&gt;       &amp;lt;SccCreateType&amp;gt;New&amp;lt;/SccCreateType&amp;gt; &lt;br /&gt;       &amp;lt;SccBranchFromPath&amp;gt;&amp;lt;/SccBranchFromPath&amp;gt;                 &lt;br /&gt;       &amp;lt;ProcessTemplateName&amp;gt;MSF for Agile Software Development v5.0&amp;lt;/ProcessTemplateName&amp;gt; &lt;br /&gt;&amp;lt;/Project&amp;gt;&lt;br /&gt;&amp;lt;/xsl:result-document&amp;gt;&lt;br /&gt;&amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I personally use &lt;a href="http://saxon.sourceforge.net/#F9.2HE"&gt;Saxon&lt;/a&gt; to transform my conversion file – both because it is quick and easy and because, unlike MSXSL it supports XSL 2.0). Afterwards I can use the TFPT createteamproject command to create my projects. The commands used are as follows:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;p&gt;Saxon\Transform.exe -s:conversion.xml -xsl:transformer.xslt&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;TFPT createteamproject /settingsfile:1.xml&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;TFPT createteamproject /settingsfile:2.xml&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On a side, it should be straightforward to create a batch/powershell script to loop through the XML files and invoke the TFPT createteamproject command, but I’ll leave that to you, dear readers. Let me know if this is useful or if there is a quicker and easier way to achieve the same goal. Until next time…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-5569837675856538431?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vVdDJAAULbiZWzifl89Ix49Lcoo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vVdDJAAULbiZWzifl89Ix49Lcoo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vVdDJAAULbiZWzifl89Ix49Lcoo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vVdDJAAULbiZWzifl89Ix49Lcoo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=_TBfKPKOi-E:hAEIFwFGDek:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=_TBfKPKOi-E:hAEIFwFGDek:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=_TBfKPKOi-E:hAEIFwFGDek:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=_TBfKPKOi-E:hAEIFwFGDek:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=_TBfKPKOi-E:hAEIFwFGDek:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/_TBfKPKOi-E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/5569837675856538431/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=5569837675856538431&amp;isPopup=true" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/5569837675856538431?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/5569837675856538431?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/_TBfKPKOi-E/tfs-xslt-to-transform-vssconverter-to.html" title="TFS – XSLT to transform VSSConverter to Project Creation Settings File" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/09/tfs-xslt-to-transform-vssconverter-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcHSH09eCp7ImA9Wx5TEkU.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-7590755083607276834</id><published>2010-07-27T20:27:00.001-05:00</published><updated>2010-07-27T21:27:19.360-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-27T21:27:19.360-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="Razor View Engine" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>Upgrading to ASP.NET MVC 3 Preview 1</title><content type="html">&lt;p&gt;Earlier today Scott Gu &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx"&gt;announced the availability&lt;/a&gt; of ASP.NET MVC 3 Preview 1. This release&amp;#160; includes the beginnings of the Razor view engine as well as a bevy of additional features. The following are some notable links with more details:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx"&gt;Scott Gu&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://feedproxy.google.com/~r/ScottHanselman/~3/KBPwOw4C0Yo/ASPNETMVC3Preview1ReleasedChannel9VideoAndHanselminutesPodcast224OhMy.aspx"&gt;Scott Hanselman&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://feeds.haacked.com/~r/haacked/~3/_eLj08gmRLE/aspnetmvc3-preview1-released.aspx"&gt;Phil Haack&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.maartenballiauw.be/post.aspx?id=6bf88064-e984-4ca9-8184-4c6c4ae21395"&gt;Maarten Balliauw&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Anyhow, I played with the demo and got to wondering how to update an existing ASP.NET MVC 2 project to use the new preview version (obviously I wouldn’t switch production code any time soon…) &lt;/p&gt;  &lt;p&gt;It was simply a matter of editing my existing ASP.NET MVC 2 (C#) project file and making the following updates:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;u&gt;&lt;strong&gt;ProjectTypeGuids&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Replace&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;{F85E285D-A4E0-4152-9332-AB1D724D3325} &lt;/p&gt;    &lt;p&gt;With&lt;/p&gt;    &lt;p&gt;{E53F8FEA-EAE0-44A6-8774-FFD645390401}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;and&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;u&gt;References&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Replace&lt;/p&gt;    &lt;p&gt;&amp;lt;Reference Include=&amp;quot;System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL&amp;quot; /&amp;gt;&lt;/p&gt;    &lt;p&gt;with&lt;/p&gt;    &lt;p&gt;&amp;lt;Reference Include=&amp;quot;System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL&amp;quot; /&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Reloading my project I can confirm that everything builds nicely and I know have the additional option of creating a razor view as in the blow screenshot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_pkYZV8vEgBM/TE-HbxSvZYI/AAAAAAAAAUk/BcMF-OyDfYs/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_pkYZV8vEgBM/TE-HcdPVjsI/AAAAAAAAAUo/Kfoo54gkGKs/image_thumb%5B1%5D.png?imgmax=800" width="436" height="433" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Simple stuff!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[Edit]&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Looks like I missed a step. I also had to make a minor modification to my Web.Config file replacing:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:84feb631-06ff-41da-8477-a7e1ba6e4229" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;dependentAssembly&amp;gt;&lt;br /&gt;&amp;lt;assemblyIdentity name="System.Web.Mvc" PublicKeyToken="31bf3856ad364e35" /&amp;gt;&lt;br /&gt;&amp;lt;bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" /&amp;gt;&lt;br /&gt;&amp;lt;/dependentAssembly&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;with&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:5724a07c-be3d-4c65-bee1-f5e958eacdb5" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: xml;"&gt; &amp;lt;dependentAssembly&amp;gt;&lt;br /&gt; &amp;lt;assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /&amp;gt;&lt;br /&gt; &amp;lt;bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" /&amp;gt;&lt;br /&gt; &amp;lt;/dependentAssembly&amp;gt;&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-7590755083607276834?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kl4eLJ958DA14JIAco2BgyG5-qg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kl4eLJ958DA14JIAco2BgyG5-qg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kl4eLJ958DA14JIAco2BgyG5-qg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kl4eLJ958DA14JIAco2BgyG5-qg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=TAG5T6Zj9JM:ybZAtOZ8zxU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=TAG5T6Zj9JM:ybZAtOZ8zxU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=TAG5T6Zj9JM:ybZAtOZ8zxU:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=TAG5T6Zj9JM:ybZAtOZ8zxU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=TAG5T6Zj9JM:ybZAtOZ8zxU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/TAG5T6Zj9JM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/7590755083607276834/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=7590755083607276834&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/7590755083607276834?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/7590755083607276834?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/TAG5T6Zj9JM/upgrading-to-aspnet-mvc-3-preview-1.html" title="Upgrading to ASP.NET MVC 3 Preview 1" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_pkYZV8vEgBM/TE-HcdPVjsI/AAAAAAAAAUo/Kfoo54gkGKs/s72-c/image_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/07/upgrading-to-aspnet-mvc-3-preview-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQEQXs9eip7ImA9Wx5TEU8.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-8829916102487697157</id><published>2010-07-26T01:05:00.000-05:00</published><updated>2010-07-26T01:05:00.562-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-26T01:05:00.562-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="JQuery" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>"$.validator.methods[method] is undefined"</title><content type="html">&lt;p&gt;I’ve started developing a new project and have recently been getting into ASP.NET MVC and JQuery a lot more. To make my life easier I decided to use the JQuery Validation libraries to perform my client side validation. I created a simple registration form with three fields – username, password, confirm password. The following is the code I am using:&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_pkYZV8vEgBM/Sz7F2GcBslI/AAAAAAAAAP8/B2_daZXa8UA/s1600-h/image%5B14%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_pkYZV8vEgBM/Sz7F2gSZfOI/AAAAAAAAAQA/daZhby7SrcI/image_thumb%5B8%5D.png?imgmax=800" width="410" height="373" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;The code uses a remote call to the IsLoginAvailable action of the user controller which in turn checks if the entered username has already been taken and wraps the response in a JsonResult. This appeared to work fine (validating the field when focus was lost) but upon submitting the form I received the following error:&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;quot;$.validator.methods[…] is undefined&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;or&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&amp;quot;$.validator.methods[method] is undefined&amp;quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;After debugging with Firebug I found that the validation was failing on a &amp;quot;data&amp;quot; method. Looking at the code I realized I was specifying the username to pass via the data section in the remote call – this was something I picked up in the examples online and assumed I too would need to use – shame on me!&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;I removed the data section from my remote call and lo-and-behold everything worked as it should. I was surprised to see that my #username value was passed correctly to the controller action and the check was performed successfully. Better still, upon submitting the form I no longer receive the &amp;quot;Error: ‘$.validator.methods[…]’ is null or not an object&amp;quot; error...now to figure out &lt;em&gt;why &lt;/em&gt;I would or wouldn’t need the data section!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-8829916102487697157?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QEvPr7NBtL3dbwH74iox1smcxAs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QEvPr7NBtL3dbwH74iox1smcxAs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QEvPr7NBtL3dbwH74iox1smcxAs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QEvPr7NBtL3dbwH74iox1smcxAs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=c7e_yfaRyt0:6PWVk4YoBXs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=c7e_yfaRyt0:6PWVk4YoBXs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=c7e_yfaRyt0:6PWVk4YoBXs:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=c7e_yfaRyt0:6PWVk4YoBXs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=c7e_yfaRyt0:6PWVk4YoBXs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/c7e_yfaRyt0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/8829916102487697157/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=8829916102487697157&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/8829916102487697157?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/8829916102487697157?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/c7e_yfaRyt0/is-undefined.html" title="&amp;quot;$.validator.methods[method] is undefined&amp;quot;" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_pkYZV8vEgBM/Sz7F2gSZfOI/AAAAAAAAAQA/daZhby7SrcI/s72-c/image_thumb%5B8%5D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/07/is-undefined.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcGQXoyfSp7ImA9WxFaGUw.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-7990120564736340971</id><published>2010-07-23T14:07:00.000-05:00</published><updated>2010-07-23T14:07:00.495-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-23T14:07:00.495-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="JQTouch" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Mobile Device Browser File" /><title>ASP.NET MVC – Object Reference is not set to an instance of an object</title><content type="html">&lt;p&gt;In the end I have to chalk this down to incompetence and one of those frustrating error messages that tell you absolutely nothing. &lt;/p&gt;  &lt;p&gt; I’ve been working on an ASP.NET MVC application and last night decided to use JQTouch to provide an iPhone/Android mobile interface. Doing so should have been extremely straightforward. The planned steps were as follows:&lt;/p&gt;  &lt;p&gt; Add code in my base ViewEngine to detect if a mobile browser is being used. If so, provide a mobile view rather than a standard one. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create a number of views that use the JQTouch library to format my pages for mobile devices. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I recently came across the &lt;a href="http://mdbf.codeplex.com/"&gt;Mobile Browser Definition File&lt;/a&gt; on Codeplex which can be dumped in the app_browser folder in an asp.net solution in order to provide a bunch of information through Request.Browser. I dumped this into my solution, updated my view engine and implemented a few views with JQTouch. It didn’t take too long and i was feeling pretty good. However, attempting to open my application&amp;#160; I received a very generic error:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Object reference not set to an instance of an object&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As shown in the below screenshot, not only is the message completely useless, but no source file or code line is specified.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_pkYZV8vEgBM/SzrkEsIauEI/AAAAAAAAAP0/fECh80dEoYA/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_pkYZV8vEgBM/SzrkE1GMW3I/AAAAAAAAAP4/vn0ZphR3UpE/image_thumb%5B2%5D.png?imgmax=800" width="592" height="186" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I debugged for ages, but couldn’t even break in the global.asax file – so couldn’t step through the code to see what was going on. I subsequently tore my code apart, and after a full rollback realized that the mobile.browser file that I had dumped in my app_browser folder was causing the error.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Removing this file allowed my application to run, re-adding it caused the message to re-appear. After a little googling I found the root cause – browser files can no longer go straight into the app_browser folder – they must go in a sub-folder…&lt;em&gt;any &lt;/em&gt;sub-folder. Had I looked a little closer I would have seen the following on the MDBF FAQ page and saved myself a ton of time and frustration:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;b&gt;Why am I getting &amp;quot;Object reference not set to an instance of an object.&amp;quot;?&lt;/b&gt;       &lt;br /&gt;If after copying the .browser file into your App&lt;i&gt;Browsers folder you get a compile error “Object reference not set to an instance of an object.” and you have .NET 3.5 SP1, then the issue is likely that you must create a sub-directory (of any name) in your App&lt;/i&gt;Browsers folder and place the .browser file in there. E.G. \App_Browsers\MobileBrowserData\mobile.browser&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And now all is back to normal&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-7990120564736340971?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eTYoxYbj9aoGkwYJYvkX0jDHdyE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eTYoxYbj9aoGkwYJYvkX0jDHdyE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eTYoxYbj9aoGkwYJYvkX0jDHdyE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eTYoxYbj9aoGkwYJYvkX0jDHdyE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=FYqlWSaz2rk:0M3QXLvtJno:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=FYqlWSaz2rk:0M3QXLvtJno:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=FYqlWSaz2rk:0M3QXLvtJno:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=FYqlWSaz2rk:0M3QXLvtJno:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=FYqlWSaz2rk:0M3QXLvtJno:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/FYqlWSaz2rk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/7990120564736340971/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=7990120564736340971&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/7990120564736340971?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/7990120564736340971?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/FYqlWSaz2rk/aspnet-mvc-object-reference-is-not-set.html" title="ASP.NET MVC – Object Reference is not set to an instance of an object" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_pkYZV8vEgBM/SzrkE1GMW3I/AAAAAAAAAP4/vn0ZphR3UpE/s72-c/image_thumb%5B2%5D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/07/aspnet-mvc-object-reference-is-not-set.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUGRH0yfSp7ImA9WxFaFkU.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-1721241296010351399</id><published>2010-07-20T20:59:00.001-05:00</published><updated>2010-07-20T23:23:45.395-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-20T23:23:45.395-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="powertools" /><category scheme="http://www.blogger.com/atom/ns#" term="visual studio 2010" /><title>VS2010 Power Tools Extensions are AWESOME</title><content type="html">&lt;p&gt;This morning on my daily commute to work I read ScottGu’s &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/19/vs-2010-productivity-power-tools-update-with-some-cool-new-features.aspx"&gt;latest post&lt;/a&gt; detailing the latest round of updates to the VS21010 Productivity Tools extensions. I’m always excited to look at new (or improved) tools that can have a positive impact on my development work and have been very impressed with the powertools thus far. I’m not sure if it is a function of Visual Studio’s extension engine overhaul or simply coincidental, but a lot of really neat new extensions have already been developed for 2010 and to date have been much more useful than their 2008 counterparts.&lt;/p&gt;  &lt;p&gt;The powertools are a free extension and worth every penny! They contain such gems as Ctrl+Click to go to definition, Triple Click to select a full line of code, Colorized and orderable tabs, and a whole lot more. Today’s update blows all of that out of the water.&lt;/p&gt;  &lt;p&gt;Mr. Gu went into detail so I’ll keep this short. While there are a bunch of new features in the latest release I am super-excited about additions to the solution explorer (in the form of a new solution navigator) in the latest revision (and will focus on these). I’d expect to see these in Coderush or Resharper – not in a free extension – and I seriously believe that my productivity will increase as a direct result of these updates.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;1. View Classes and Members in Solution Explorer&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I didn’t know I needed this until today but files in the solution explorer are now further expandable, allowing types, methods and even members to be viewed in the tree. This is pretty sweet and one less context switch to get where I’m going.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_pkYZV8vEgBM/TEZUe1QCo-I/AAAAAAAAATs/3Yh_N9-A4xM/s1600-h/image%5B25%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_pkYZV8vEgBM/TEZUfVkmZ4I/AAAAAAAAATw/vZjfU-iCz28/image_thumb%5B13%5D.png?imgmax=800" width="276" height="471" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;2. Searchable Solution Explorer&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You heard me right – you can now enter search terms in Solution Explorer! And it works ever so well! Searches will find terms in project names, file names, type names…down to member names. It is fast (even for a couple of large projects I played with) and makes finding what you are looking for super easy.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_pkYZV8vEgBM/TEZUftPAkvI/AAAAAAAAAT0/0gNVgEdiZF4/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_pkYZV8vEgBM/TEZUhHxPx3I/AAAAAAAAAT4/zWzZdnzubTo/image_thumb%5B1%5D.png?imgmax=800" width="280" height="430" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;3. Selectable Root&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Solution Explorer can often be overwhelming – especially for big solutions with many projects and deep source trees. This update adds the ability to choose what project/folder/file you want as the root. In the below example I’ve chosen the&lt;em&gt; jni4net.n.10&lt;/em&gt; project as my root. Everything else is hidden and I can focus on only the code I want to see.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_pkYZV8vEgBM/TEZUhcBVtRI/AAAAAAAAAT8/n7rjG8t7VOs/s1600-h/image%5B15%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_pkYZV8vEgBM/TEZUh5QvjXI/AAAAAAAAAUA/1Ro7slGOTic/image_thumb%5B7%5D.png?imgmax=800" width="352" height="394" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Similarly, if I wanted to see only that beneath &lt;em&gt;adaptors &lt;/em&gt;I would click the little icon (highlighted) on the right and end up with the view below. Seriously, do you &lt;em&gt;ever &lt;/em&gt;remember your solution being so uncluttered? The two icons (highlighted) on the top left are used to go up a level or back to a previous configuration.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_pkYZV8vEgBM/TEZUiHHOUrI/AAAAAAAAAUE/X3JRjR1_mHU/s1600-h/image%5B19%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_pkYZV8vEgBM/TEZUiZpvEFI/AAAAAAAAAUI/uaH0zFK8mQs/image_thumb%5B9%5D.png?imgmax=800" width="373" height="159" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;While I love the new search capabilities, this is by far my favorite of the new additions. This is the developer’s equivalent to a pair of blinkers! &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;4. Additional Filters&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Last but not least (for this post) is the addition of a number of filters (All/Open/Unsaved/Edited) which allow the Solution Explorer to be filtered to show only files that are currently of interest. Below I’ve chosen &lt;em&gt;Unsaved &lt;/em&gt;and see that I have been working on (but am yet to save) one file – Out.cs. Not a big deal, but one that could be useful nonetheless.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_pkYZV8vEgBM/TEZUiu52QhI/AAAAAAAAAUM/bLl857KczQA/s1600-h/image%5B23%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_pkYZV8vEgBM/TEZUi4TLdkI/AAAAAAAAAUQ/9lIP-Xx0AZQ/image_thumb%5B11%5D.png?imgmax=800" width="386" height="166" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Summary&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;While there is no doubt that Microsoft develops amazing software it often feels like we get a big release once very two or three years and have to be happy with our lot for a few years until we get to the new release. This feels different – more akin to the community driven approach of many OSS projects where the updates are added and codebases refined continually. This is an awesome piece of software and a must-have addition to Visual Studio. It really increases the value of the tool and, no doubt, the efficiency of the developer wielding it! I love it!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-1721241296010351399?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/73klzVjTvSorHFTlSC146Q2KhY0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/73klzVjTvSorHFTlSC146Q2KhY0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/73klzVjTvSorHFTlSC146Q2KhY0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/73klzVjTvSorHFTlSC146Q2KhY0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=YfYR1T8X67c:oI3WDdPH_dg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=YfYR1T8X67c:oI3WDdPH_dg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=YfYR1T8X67c:oI3WDdPH_dg:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=YfYR1T8X67c:oI3WDdPH_dg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=YfYR1T8X67c:oI3WDdPH_dg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/YfYR1T8X67c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/1721241296010351399/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=1721241296010351399&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/1721241296010351399?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/1721241296010351399?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/YfYR1T8X67c/vs2010-power-tools-extensions-are.html" title="VS2010 Power Tools Extensions are AWESOME" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_pkYZV8vEgBM/TEZUfVkmZ4I/AAAAAAAAATw/vZjfU-iCz28/s72-c/image_thumb%5B13%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/07/vs2010-power-tools-extensions-are.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AEQXoycCp7ImA9WxFaFkk.&quot;"><id>tag:blogger.com,1999:blog-1137761125875994292.post-90027181508484110</id><published>2010-07-20T13:15:00.000-05:00</published><updated>2010-07-20T13:15:00.498-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-20T13:15:00.498-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Napkee" /><category scheme="http://www.blogger.com/atom/ns#" term="Balsamiq Mockups" /><title>Napkee</title><content type="html">&lt;p&gt;&lt;a href="http://irwinj.blogspot.com/2010/02/balsamiq-mockups.html"&gt;Recently&lt;/a&gt; I blogged about my experience with a neat wire-framing tool, Balsamiq Mockups. To recap, I loved (and continue to love) the tool with the exception of one design decision - intentionally keeping the tool rough and low-fidelity. Shortly after publishing the post I received a comment asking if I had tried &lt;a href="http://www.napkee.com/"&gt;Napkee&lt;/a&gt; for HTML wireframe conversion…Following the Anonymous poster’s lead, I managed to procure a review copy of Napkee and am happy that I did. To answer the obvious question: no, Napkee isn’t &lt;em&gt;exactly &lt;/em&gt;what I was looking for. But its not far off!!&lt;/p&gt;&lt;h4&gt;Balsamiq/Napkee Affiliation&lt;/h4&gt;&lt;p&gt;There does not appear to be any official affiliation between the Napkee and Balsamiq teams, however the following 2009 Balsamiq blog post does suggest that Balsamiq are open to building a community around their open bmml standard – starting with Napkee:&lt;/p&gt;&lt;p&gt;&lt;a href="http://balsamiq.com/blog/2009/08/05/napkee-launches/"&gt;http://balsamiq.com/blog/2009/08/05/napkee-launches/&lt;/a&gt;&lt;/p&gt;&lt;h6&gt;&lt;/h6&gt;&lt;h6&gt;&lt;/h6&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h4&gt;Overview&lt;/h4&gt;&lt;p&gt;Napkee, as its website says, lets you export Balsamiq Mockups to HTML/CSS/JS and Adobe Flex 3. In essence it is a post-processor that takes bmml files and turns them into web or desktop apps. In my &lt;a href="http://irwinj.blogspot.com/2010/02/balsamiq-mockups.html"&gt;post on Balsamiq&lt;/a&gt; I “implore[d] the Balsamiq team to introduce a post-processing feature that turns a wireframe mockup into something that actually looks like a real screen”. This is precisely what Napkee has done. While I would like to see a third mode (adding to the existing HTML and Flex support) that generates static image files (PSDs would be nice) rather than interactive content. &lt;/p&gt;&lt;p&gt;As is Napkee has fulfilled my wish to turn Balsamiq mockup files into something more presentable – specifically something that could be presented to a project sponsor or client.&lt;/p&gt;&lt;h4&gt;Converting a Mockup&lt;/h4&gt;&lt;p&gt;The process of converting an existing mockup to HTML/Flex couldn’t be more straightforward. The UI is extremely simple with very little required interaction. Importing a bmml file is a two step process (&lt;em&gt;File-&amp;gt;Import Balsamiq Mockup Files&lt;/em&gt;) at which point the file is processed and converted to the &lt;em&gt;project nature&lt;/em&gt; of choice (see the big WEB and FLEX 3 buttons on the top right hand side?).&lt;/p&gt;&lt;p&gt;I created a new Napkee project named &lt;em&gt;Mockups for Blogpost &lt;/em&gt;and added the same datagrid used in my Balsamiq post. The below screenshots show how Napkee converts these controls to HTML and Flex respectively.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_pkYZV8vEgBM/TEKQAXwjKhI/AAAAAAAAASc/2msf8_BpwIo/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_pkYZV8vEgBM/TEKQAn_dpgI/AAAAAAAAASg/AjTqKLchqXo/image_thumb%5B2%5D.png?imgmax=800" width="537" height="420" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_pkYZV8vEgBM/TEKQBHaQ-NI/AAAAAAAAASk/xoHetWoNAUo/s1600-h/image%5B9%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_pkYZV8vEgBM/TEKQBTp_ByI/AAAAAAAAASo/oDUil873ctw/image_thumb%5B5%5D.png?imgmax=800" width="544" height="425" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;The &lt;em&gt;Preview &lt;/em&gt;pane is fully interactive so if there is a control on the page (for instance, the Flex datagrid is sortable and has a scrollbar) one can immediately test how these controls react to user input. You’ll notice that there are multiple tabs beside the preview tab -&amp;#160; HTML/CSS/JS/BMML for web mode and MXML/AS/BMML for flex mode. These are (sadly) read only views where you can see the markup (and existing bmml) for your mockup. While it is probably outside of the scope of the application, it would be great if these tabs acted as editors for the relevant source files, allowing HTML/CSS/etc. to be tweaked within the application and saved as part of the project. &lt;/p&gt;&lt;p&gt;While it seems like a trivial point, I love that markup is broken out into separate files. It may stand to reason, but I can’t count the number of code generation tools I’ve seen that package up all source code into a single unholy mess of a markup file. Kudos to Napkee for being developer friendly here.&lt;/p&gt;&lt;p&gt;Exporting a project is as simple as clicking the novelty-sized &lt;em&gt;Export Project &lt;/em&gt;button in the mockup files menu on the bottom-left of the screen, resulting in a well structured folder containing the newly generated source files.&lt;/p&gt;&lt;p&gt;One feature that I’m a little disappointed by is the ability to provide additional CSS files to the project. Ideally this would give the user the ability to customize the output HTML with their own CSS styles. It works…to a point. The problem, in so far as I see it, is that there is no obvious way to remove the existing CSS styles – i.e. you cannot tell Napkee to provide only raw HTML. When I added my own CSS styles some were overridden by Napkee’s styles leaving me with an ugly matrimony of styles. This isn’t a dealbreaker by any means, but I’d love to see it addressed and am guessing it would be a relatively simple change.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;h4&gt;More Advanced Mockups&lt;/h4&gt;&lt;h4&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://mockupstogo.net/"&gt;Mockups To Go&lt;/a&gt; is still a great source of Balsamiq mockup templates and, to put Napkee through its paces I downloaded two of the larger templates and converted both into Web and Flex pages.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;a href="http://mockupstogo.net/facebook-fan-page-20"&gt;Facebook Fan Page&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Original Balsamiq Mockup&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_pkYZV8vEgBM/TEKQBli6p_I/AAAAAAAAASs/2913SjjC09s/s1600-h/image%5B38%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_pkYZV8vEgBM/TEKQCdgszWI/AAAAAAAAASw/fQw4L752sno/image_thumb%5B20%5D.png?imgmax=800" width="527" height="418" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Napkee Web&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_pkYZV8vEgBM/TEKQCxVMo7I/AAAAAAAAAS0/biqjGDzvN2Y/s1600-h/image%5B18%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_pkYZV8vEgBM/TEKQDaEpSyI/AAAAAAAAAS4/gMgYqUtMkyA/image_thumb%5B10%5D.png?imgmax=800" width="510" height="336" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;u&gt;Napkee Flex&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_pkYZV8vEgBM/TEKQDiEHrLI/AAAAAAAAAS8/bDUnfZJqKQQ/s1600-h/image%5B34%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_pkYZV8vEgBM/TEKQD5jivxI/AAAAAAAAATA/FDaT-fZgH6s/image_thumb%5B18%5D.png?imgmax=800" width="525" height="350" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://mockupstogo.net/wordpress-30-beta-admin-comment-list"&gt;Wordpress 3.0 Beta Admin Comment List&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Original Balsamiq Mockup&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_pkYZV8vEgBM/TEKQEeB-JLI/AAAAAAAAATE/EXMVV_WmOcQ/s1600-h/image%5B26%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_pkYZV8vEgBM/TEKQEnmHzjI/AAAAAAAAATI/T3LXoLh93k8/image_thumb%5B14%5D.png?imgmax=800" width="531" height="432" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;u&gt;Napkee Web&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_pkYZV8vEgBM/TEKQFAaGtjI/AAAAAAAAATM/9qS6FjTjAAw/s1600-h/image%5B22%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_pkYZV8vEgBM/TEKQFWTEABI/AAAAAAAAATQ/HSUmlA-VDYA/image_thumb%5B12%5D.png?imgmax=800" width="520" height="421" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;u&gt;Napkee Flex&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_pkYZV8vEgBM/TEKQFrsrXbI/AAAAAAAAATU/DMwttzDb5x0/s1600-h/image%5B30%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_pkYZV8vEgBM/TEKQGPJNrZI/AAAAAAAAATY/Ms7yfwYa4bw/image_thumb%5B16%5D.png?imgmax=800" width="533" height="431" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;As you can see in the above images I have highlighted in yellow some major discrepancies between the originals and the web/flex counterparts. Most of these are in the form of inconsistent layout and, in the case of the flex conversion, fields whose markup was not converted at all. While this sample size is way too small to definitely point to a problem with Napkee itself, it definitely looks like the bmml processor needs a little work. &lt;/p&gt;&lt;p&gt;That said, there may be cases where the Balsamiq mockup was created outside of recommended practice. Take, for instance, the yellow row in the Wordpress mockup. Rather than a colored row, it looks like a yellow rectangle was placed right on top of the grid to give the illusion that the row is colored. In this and other cases Napkee can only convert what it sees and the tool cannot be blamed for bad implementation. Garbage in garbage out, so to speak…&lt;/p&gt;&lt;h4&gt;&lt;/h4&gt;&lt;h4&gt;In Summary&lt;/h4&gt;&lt;p&gt;Napkee has no learning curve whatsoever and converts Balsamiq mockups to their prettier and more functional form without requiring any thought or real effort. As complexity of mockups increases Napkee’s results become somewhat of a mixed bag and it appears that the bmml processor could do with some updates to its layout algorithms. However, when it works it works really well and all-in-all I think the tool is a great addition to Balsamiq Mockups. At $49 it is relatively inexpensive and if you charge by the hour will probably pay for itself pretty quickly. I, for one, look forward to seeing how &lt;a href="http://www.napkee.com/"&gt;Napkee&lt;/a&gt; improves and evolves over time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1137761125875994292-90027181508484110?l=irwinj.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7HQW2-Efk_QkgqJa7-dDDPda_AQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7HQW2-Efk_QkgqJa7-dDDPda_AQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7HQW2-Efk_QkgqJa7-dDDPda_AQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7HQW2-Efk_QkgqJa7-dDDPda_AQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=xXGE0dOtA8c:tjByUnQBC38:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=xXGE0dOtA8c:tjByUnQBC38:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=xXGE0dOtA8c:tjByUnQBC38:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?i=xXGE0dOtA8c:tjByUnQBC38:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HellocruelWorld?a=xXGE0dOtA8c:tjByUnQBC38:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HellocruelWorld?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HellocruelWorld/~4/xXGE0dOtA8c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://irwinj.blogspot.com/feeds/90027181508484110/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1137761125875994292&amp;postID=90027181508484110&amp;isPopup=true" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/90027181508484110?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1137761125875994292/posts/default/90027181508484110?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HellocruelWorld/~3/xXGE0dOtA8c/napkee.html" title="Napkee" /><author><name>Jason Irwin</name><uri>http://www.blogger.com/profile/11140602221519582396</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_pkYZV8vEgBM/TEKQAn_dpgI/AAAAAAAAASg/AjTqKLchqXo/s72-c/image_thumb%5B2%5D.png?imgmax=800" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://irwinj.blogspot.com/2010/07/napkee.html</feedburner:origLink></entry></feed>

