<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Rob Conery</title>
	
	<link>http://blog.wekeroad.com</link>
	<description>Stuffy Thing Box</description>
	<lastBuildDate>Fri, 10 Jul 2009 04:10:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Robparserob" type="application/rss+xml" /><item>
		<title>SubSonic 3.0.0.2 Is Released</title>
		<link>http://feedproxy.google.com/~r/Robparserob/~3/agIAr2sMeec/</link>
		<comments>http://blog.wekeroad.com/subsonic/subsonic-3-0-0-2-is-released/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 04:10:11 +0000</pubDate>
		<dc:creator>Rob Conery</dc:creator>
				<category><![CDATA[SubSonic]]></category>

		<guid isPermaLink="false">http://blog.wekeroad.com/subsonic/subsonic-3-0-0-2-is-released/</guid>
		<description><![CDATA[Yes, I know how it looks, but I also know that most of the bug reports stem from the same bugs, so the sooner I get that out of the way, the closer we are to stability.
I can’t thank the contributors enough for their help, and also the people who stick it out with me [...]]]></description>
			<content:encoded><![CDATA[<p>Yes, I know how it looks, but I also know that <a href="http://codebetter.com/blogs/rob.conery/archive/2009/05/21/jumping-the-20-fence.aspx">most of the bug reports stem from the same bugs</a>, so the sooner I get that out of the way, the closer we are to stability.</p>
<p>I can’t thank the contributors enough for their help, and also the people who stick it out with me on <a href="http://github.com/subsonic/SubSonic-3.0/issues">the Issues list at Github</a>. It takes me a while sometimes – but I’ll get there!</p>
<p>Here are the fixes:</p>
<ul>
<li>FIXED: Issue with ActiveRecord where pre-setting the PK was overwritten by attempt to read from DB     <br />FIXED: SimpleRepo sample site errored out when posting new post      <br />FIXED: PK not set to non-nullable and AutoIncrement when declaring explicit PK using attributes on class property. AutoIncrement is now set for numerics      <br />ADDED: If you declare a Guid as your PK using SimpleRepo, we will be default add a constraint (SQL Server only) which defaults to NEWID()      <br />FIXED: StoredProcedure command parameters were not passing propery DbType, resulting in a sql_variant error      <br />FIXED: == null operation using Linq was creating invalid SQL (I think I got this right this time)      <br />ADDED: Setters for ActiveRecord properties now see if value has changed before firing OnChanged and making column dirty      <br />ADDED: Core Load&lt;T&gt; routine now checks to see if the class implements IActiveRecord and if so, will set IsLoaded to true (and call OnLoad())      <br />ADDED: Fork from HaakonL which deals with nullable strings (SubSonicNulLString)      <br />REMOVED: Removed sample sites from source</li>
</ul>
<p>You can <a href="http://subsonicproject.com/download">get the lastest drop here</a>.</p>
<img src="http://feeds.feedburner.com/~r/Robparserob/~4/agIAr2sMeec" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.wekeroad.com/subsonic/subsonic-3-0-0-2-is-released/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://blog.wekeroad.com/subsonic/subsonic-3-0-0-2-is-released/</feedburner:origLink></item>
		<item>
		<title>SubSonic: Working With Git</title>
		<link>http://feedproxy.google.com/~r/Robparserob/~3/L2RO__DBF4E/</link>
		<comments>http://blog.wekeroad.com/subsonic/subsonic-working-with-git/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 06:44:55 +0000</pubDate>
		<dc:creator>Rob Conery</dc:creator>
				<category><![CDATA[SubSonic]]></category>
		<category><![CDATA[open-source]]></category>

		<guid isPermaLink="false">http://blog.wekeroad.com/subsonic/subsonic-working-with-git/</guid>
		<description><![CDATA[Many, many people have asked why I moved our Source Repository to Git/Github and it’s hard to explain other than to say that for Open Source – Git is a very nice option because it very much enhances the “collaborative” experience in that merging code from others is not only simple – it’s foundational.
The only [...]]]></description>
			<content:encoded><![CDATA[<p>Many, many people have asked why I moved our Source Repository to Git/Github and it’s hard to explain other than to say that for Open Source – Git is a very nice option because it very much enhances the “collaborative” experience in that merging code from others is not only simple – it’s foundational.</p>
<p>The only way that seems to capture the main elements of Git is that it’s peer-to-peer source control with a heavy dose of Social Networking.&#160; There is no centralized source – everyone has their own disconnected “repository” (which is called a “branch” in Git parlance) that you merge when it makes sense to. When you do run a merge, your version history is merged as well – making a very weird “Facebook meets Source Control” kind of experience.</p>
<p><strong>Git as Source Control Management      <br /></strong>I got a tweet tonite from Mohammed Meligy that I really want to address:</p>
<blockquote><p>@robconery why (in an organization) would I choose Git over SVN ?</p>
</blockquote>
<p>And the answer is: <strong>I have no idea</strong>. Git has its strengths for Open Source, to be sure, but for the Enterprise I just don’t know and I would say you should probably be afraid. I have a lot of opinions about this as both developer and Lead Geek, but I think I’ll summarize it here for you:</p>
<ul>
<li>Developer: I love shiney stuff! </li>
<li>Lead Geek: Do what works! </li>
</ul>
<p>Source Control is something you don’t want to mess with and if your system is working for you – that’s a perfect, irrefutable argument. TFS is light years ahead of anything Git can provide in terms of workflow and process management – and if these things are important and working for you – then you have no reason at all to change; in fact you have many reasons not to.</p>
<p>Subversion is a good system to – it just happened that in our case I needed more than one repository and Github fit exactly what I wanted.</p>
<p><strong>Working With Github and SubSonic</strong>     <br />If you want to know how to work with Github (as far as SubSonic is concerned), I made a quick (10 minute) screencast on how to get up and running on Git, and then how to fork/push our source. This is a really bare-bones intro, and I’ve also <a href="http://subsonicproject.com/docs/Submit_Patch">added it to our wiki</a>.</p>
<p><a href="http://silverlight.services.live.com/58326/Intro%20to%20Git/video.wmv">Download here</a></p>
<p><i>Double-click for full screen</i>     <br /><iframe style="width: 600px; height: 450px" src="http://silverlight.services.live.com/invoke/58326/Intro%20to%20Git/iframe.html" frameborder="0" scrolling="no"></iframe></p>
<img src="http://feeds.feedburner.com/~r/Robparserob/~4/L2RO__DBF4E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.wekeroad.com/subsonic/subsonic-working-with-git/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
<enclosure url="http://silverlight.services.live.com/58326/Intro%20to%20Git/video.wmv" length="24320617" type="audio/x-ms-wmv" />
		<feedburner:origLink>http://blog.wekeroad.com/subsonic/subsonic-working-with-git/</feedburner:origLink></item>
		<item>
		<title>SubSonic 3.0.0.1 Released</title>
		<link>http://feedproxy.google.com/~r/Robparserob/~3/7u3ls8HSStA/</link>
		<comments>http://blog.wekeroad.com/subsonic/subsonic-3-0-0-1-released/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 20:22:03 +0000</pubDate>
		<dc:creator>Rob Conery</dc:creator>
				<category><![CDATA[SubSonic]]></category>

		<guid isPermaLink="false">http://blog.wekeroad.com/subsonic/subsonic-3-0-0-1-released/</guid>
		<description><![CDATA[Early and often! Might as well get started on the right foot yah? I knew the first rev was going to come quickly, not sure if I thought it would happen within a week’s time but – well why not. There were a lot of things I missed in testing, and we had some nice [...]]]></description>
			<content:encoded><![CDATA[<p>Early and often! Might as well get started on the right foot yah? I knew the first rev was going to come quickly, not sure if I thought it would happen within a week’s time but – well why not. There were a lot of things I missed in testing, and we had some nice contributions as well.</p>
<p> Here&#8217;s the quick list of fixes and adds:
<ul>
<li>FIXED: Issue 2 &#8211; Out of date Classes.tt file for ActiveRecord. I fixed this within an hour of issuing the 3.0 download and reset the download.</li>
<li>FIXED: Issue 3 &#8211; “!=null” results in incorrect SQL</li>
<li>ADDED:&#160; Issue 4 &#8211; SubSonicRepository should set PK on Add</li>
<li>CHANGED: Issue 5 &#8211; SPs should accept nullable type arguments by default</li>
<li>CHANGED: Issue 10 &#8211; Reset foreign key columns to use “CleanUp” method to avoid naming issues in ActiveRecord</li>
<li>ADDED: Issue 11- SimpleRepository.All&lt;T&gt;() and Exists&lt;T&gt;() now run migrations</li>
<li>FIXED: Issue 12 – There was a view error in the SimpleRepo example on Create.aspx.</li>
<li>FIXED: Issue 13 – Add() was not properly setting IsNew to false on Save/Add (ActiveRecord templates)</li>
<li>ADDED: Issue 14 – Merged fork from MBP to address a better way to handle Logical Delete column with Settings.tt (thank you!)</li>
<li>FIXED: Issue 15 – Migrations for SQLite were not setting “integer” for PK so AUTOINCREMENT was not being honored.</li>
<li>FIXED: Issue 20 – ActiveRecord templates were incorrectly setting “string” as system type for integer fields with MySQL. I also fixed issues with small and tinyint</li>
<li>ADDED: Merged fork from BlackMael which added VB Templates. Thanks!</li>
</ul>
<p>Many, many thank you’s to the people who’ve helped with the issues and contributed code (Troels Thompson, John Sheehan, and Martin Harris).</p>
<p><strong>GitHub is Awesome</strong>    <br />I’m sure you’ve read this before about Git and Github with respect to Open Source projects and source control – but this system is really on fire. Within 2 days I was merging various forks and bug fixes – leveraging all that is good about Git – and it’s helped beyond measure.</p>
<p>For instance – John Sheehan merged one of his forks and I didn’t need to open a diff tool to figure out what he did – Github <a href="http://github.com/subsonic/SubSonic-3.0/commit/4846ff7aab5fb45045f680f486554e7283d15c8f">showed me precisely what was changed, and where</a>. In addition I can leave comments on his stuff if I like – or change it right there if needed!</p>
<p>I’m working up a wiki page to show people how to fork/pull to help us fight bugs so if you want to know more about Git – hang tight I’ll have something in the next few days.</p>
<p>The <a href="http://subsonicproject.com/Download">download has been updated</a> on our project site so if you’d like to grab these changes – they are ready to go.</p>
<p><strong>A Note About The Wiki Being Down     <br /></strong>As many may know, the wiki went down a few times over the last few days. MySQL is timing out on me – the service is just flat crashing. I’ve set it to restart when it crashes (after a wait of a minute or so) so this should stop happening. However I’m looking into alternatives to make it run a bit smoother. I’m on it – sorry for the problems.</p>
<img src="http://feeds.feedburner.com/~r/Robparserob/~4/7u3ls8HSStA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.wekeroad.com/subsonic/subsonic-3-0-0-1-released/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		<feedburner:origLink>http://blog.wekeroad.com/subsonic/subsonic-3-0-0-1-released/</feedburner:origLink></item>
		<item>
		<title>SubSonic 3.0 is Released</title>
		<link>http://feedproxy.google.com/~r/Robparserob/~3/-WETg2iyKV4/</link>
		<comments>http://blog.wekeroad.com/subsonic/subsonic-3-0-is-released/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 00:39:49 +0000</pubDate>
		<dc:creator>Rob Conery</dc:creator>
				<category><![CDATA[SubSonic]]></category>

		<guid isPermaLink="false">http://blog.wekeroad.com/blog/subsonic-3-0-is-released/</guid>
		<description><![CDATA[At some point you need to stop polishing and let it go already – so I did just that today: SubSonic 3.0 is released. This thing took me just about a year to finish up, and a lot of work has gone into it. 
So, what’s new? Well…

A nice Linq engine which parses IQueryable “stuff” [...]]]></description>
			<content:encoded><![CDATA[<p>At some point you need to stop polishing and let it go already – so I did just that today: <a href="http://subsonicproject.com/">SubSonic 3.0 is released</a>. This thing took me just about a year to finish up, and a lot of work has gone into it. </p>
<p><strong>So, what’s new? Well…</strong></p>
<ul>
<li>A nice <a href="http://subsonicproject.com/docs/IQueryable">Linq engine</a> which parses IQueryable “stuff” into SQL (thanks to <a href="http://blogs.msdn.com/mattwar/">Matt Warren’s</a> excellent work with the <a href="http://codeplex.com/iqtoolkit">IQToolkit</a>, which we stole mercilessly). </li>
<li>A <a href="http://subsonicproject.com/docs/T4_Templates">templating system</a> which allows you to use <a href="http://subsonicproject.com/docs/Using_ActiveRecord">ActiveRecord</a>, <a href="http://subsonicproject.com/docs/Using_AdvancedTemplates">good old Linq in Linq to SQL style</a>, or <a href="http://subsonicproject.com/docs/Creating_Your_Own_DAL">whatever floats your boat</a>. </li>
<li>A <a href="http://subsonicproject.com/docs/Using_SimpleRepository">SimpleRepository</a> which is just about zero-drag and even builds your database for you </li>
<li>A brand-new <a href="http://subsonicproject.com">project site</a> that will hopefully answer the question “is SubSonic dead”? Or probably not </li>
<li>A <a href="http://subsonicproject.com/docs">new docs site</a> that has permanently crushed my ability to type. It’s a wiki so if you feel like being helpful and like SubSonic and want to help… nudge… nudge </li>
</ul>
<p><strong>Should You Care</strong>?     <br />That’s <a href="http://subsonicproject.com/docs/Comparisons">a tough question</a> – so it’s the first I’ll address. </p>
<ul>
<li>If you like Linq and you’re not working with SQL Server and EF is a bit much for you – yes. </li>
<li>If you like Linq and you are working with SQL Server… well nobody ever got fired for using Microsoft <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  so “maybe”. Linq to SQL is awesome and it’s not dead <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . </li>
<li>If you like a “low-friction” approach from a helper framework – then yes. You can’t get much lower-friction then SimpleRepository. </li>
<li>If you like SubSonic to begin with, then yes. There’s still the same grooviness here. </li>
</ul>
<p><strong>Should You Be Afraid</strong>?     <br />Hopefully not &#8211; I&#8217;ve really tried to test the tar out of this thing before letting it go (that&#8217;s why this took me so long). I&#8217;ve had a lot of help with this (many thanks to Eric, Paul, George Capnias, and Jim Zimmerman) and a lot folks reporting bugs (and a TON) of patches so hopefully it&#8217;s solid. That said &#8211; this is a major release and it&#8217;s also Open Source. You will need to be a bit flexible and hopefully you won&#8217;t mind helping us out. Which brings me to my final point&#8230; </p>
<p><strong>Our Repo Has Moved. Yes, Again      <br /></strong>All was going very well until 3 things happened: </p>
<ol>
<li>I needed to put the 3.0 repo together with the 2.0 repo. It’s not a branch – it’s its own repo for sure. 2.2 is not a “tag” so… what to do? The only thing to do is to have the trunk split into versions which is ALL kinds of messy. I needed another repo for my project, and Google doesn’t let you do that. </li>
<li>I needed a really cool, collaborative system for our template sharing, which also should have its own repo. </li>
<li>Google SVN began to crumble and crash on me, causing me to drop/reload every week or so. </li>
</ol>
<p>I’ve been using GitHub for a while and I absolutely LOVE it (more on that later) so with this release, <a href="http://github.com/subsonic"><strong>we’ve moved to GitHub</strong></a><strong>. </strong>I’ve kept the Google site open so we can work on existing issues, etc but I’ll be closing it in the coming month or so.</p>
<p><strong>The Goods</strong></p>
<ul>
<li>The <a href="http://subsonicproject.com">new project site is here</a> </li>
<li>The <a href="http://subsonicproject.com/docs/">new docs site is here</a> </li>
<li>The <a href="http://github.com/subsonic">new Source site is here.</a> </li>
</ul>
<p>I’m going to go have a beer or five and then go blow stuff up for the 4th like a good Amrrrcan.</p>
<img src="http://feeds.feedburner.com/~r/Robparserob/~4/-WETg2iyKV4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.wekeroad.com/subsonic/subsonic-3-0-is-released/feed/</wfw:commentRss>
		<slash:comments>38</slash:comments>
		<feedburner:origLink>http://blog.wekeroad.com/subsonic/subsonic-3-0-is-released/</feedburner:origLink></item>
		<item>
		<title>You’re Not Your Data Access</title>
		<link>http://feedproxy.google.com/~r/Robparserob/~3/gH9WptfLMdg/</link>
		<comments>http://blog.wekeroad.com/blog/youre-not-your-data-access/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 03:43:19 +0000</pubDate>
		<dc:creator>Rob Conery</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blather]]></category>

		<guid isPermaLink="false">http://blog.wekeroad.com/blog/youre-not-your-data-access/</guid>
		<description><![CDATA[Seems I touched off a bit of a “swirl” with a comment I made on my last blog post:
I think, in general, the .NET crowd overthinks and over-engineers just about everything
I said as much in my MIX presentation, where I basically challenged ASP.NET developers to “embrace their inner scripter” and stop building rockets. I have [...]]]></description>
			<content:encoded><![CDATA[<p>Seems I touched off a bit of a “swirl” with a comment I made on my last blog post:</p>
<blockquote><p>I think, in general, the .NET crowd overthinks and over-engineers just about everything</p></blockquote>
<p>I said as much in my MIX presentation, where I basically challenged ASP.NET developers to <a href="http://videos.visitmix.com/MIX09/T62F">“embrace their inner scripter” and stop building rockets</a>. I have a fairly strong opinion on this – and I’ll save that for another time – but I think it’s high time to remind folks that there’s a lot more to an application then how you get your app gets it’s freak on with your database.</p>
<p><strong>Good Morning!<br />
</strong>I remember watching Fight Club for the very first time back in the thick of the very first DotCom bubble. I was feeling pretty ill that day so I stayed home and watched the DVD, and was pulled in pretty dramatically. One line still resonates with me:</p>
<blockquote><p>You&#8217;re not your job. You&#8217;re not how much money you have in the bank. You&#8217;re not the car you drive. You&#8217;re not the contents of your wallet. You&#8217;re not your f******* khakis.</p></blockquote>
<p>I feel the same way about building software: <strong>You’re Not Your Data Access.</strong></p>
<p>When I watched that movie I had just bought a nice pair of $180 Kenneth Cole shoes to wear to a client’s VC meeting, to go with my groovy business-casual Cornflower Blue button down shirt. I clearly remember looking over at my closet – the feeling of fashion sobriety coming over me – wondering what I had turned into (if you knew me then you’d know I don’t like wearing that kind of stuff. I’m happy in a white t-shirt and shorts).</p>
<p>I had this same feeling when I popped my head out of the .NET community just 4 years ago (before I worked at Microsoft) to see what this “Rails thing” was all about. I remember the feeling well – and it was very, very sobering and inspiring at the same time. I remember creating an application in fairly short order with all the requisite pieces put where they needed to be put, with every tutorial urging me to “stop thinking – just build”.</p>
<p><strong>Camaro Programming<br />
</strong>The .NET platform is pretty dang powerful. It lets you build your own personal Tower of Babel if you so choose, and it can abstract away the very fabric of space-time if you let it. In short it’s a killer set of tools that any mechanically-inclined person would love to use. So naturally it can be very easily abused!</p>
<p>Consider my good friend Eric. I’ve written about Eric a few times before – but in summary he’s my token wrench-head friend that loves his engines and American cars. I lived with this guy for years and he rapidly filled up our garage with parts and *crap* from every car he’d ever owned. And he could dutifully tell you which part went to which car and what that part did – no matter if it was useless.</p>
<p>Eric built and maintained a hunk of junk 1968 Capri which we used to call “The Crappy”. This thing could drive – <em>and I mean really drive</em> – I think Eric pushed it to 180 mph once on a closed race course. It had <em>that sound</em> that all muscle cars make – the sound that makes your ribs shake and your inner 16 yr old say “coooooolll!”.</p>
<p>The problem was that no one ever wanted to drive in it. It smelled, it was ugly, and it absolutely sucked the gas down. Eric would steadfastly defend his Crappy because “it was the easiest car in the world to work on” and “could blow doors on any production car from any country”.</p>
<p>“Yah but when do you really need to go 180 miles an hour man?”</p>
<p>“When I race dammit”</p>
<p>I don’t need to draw the parallels here. I think you get it.</p>
<p><strong>Let it Go Already<br />
</strong>I want to be perfectly clear about what it is I’m saying here, and that is that it’s very, very easy for the geek inside us to whisper sweetly in our ears, saying “this Super Massive Paradigm Shifter will be the biggest application EVAR… don’t mess it up!”. I felt this very sensation when starting … well every app that I ever made.</p>
<p>I don’t like being wrong – no one does. So defensively I’ll be sure to include patterning where I can, making sure to separate out my projects whenever it … seems like I’ll crap for not separating out what I’m doing into another project.</p>
<p>I’ll use <a href="http://twitter.com/kevindente/statuses/2121170805">enums instead of boolean parameters</a>.</p>
<p>Oh wait, <a href="http://devpinoy.org/blogs/cruizer/archive/2007/09/12/enums-are-evil.aspx">no I won’t</a>.</p>
<p>I’ll be sure to <a href="http://blogs.msdn.com/scottdensmore/archive/2004/05/25/140827.aspx">avoid Singletons</a></p>
<p>I’ll absolutely <a href="http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx">never use Stored Procedures</a>, I mean seriously <a href="http://weblogs.asp.net/bsimser/archive/2004/09/05/225808.aspx">never</a>, <a href="http://codebetter.com/blogs/jeremy.miller/archive/2005/07/05/130093.aspx">ever</a>, <a href="http://c2.com/cgi/wiki?StoredProceduresAreEvil">ever</a> (unless <a href="http://weblogs.asp.net/rhoward/archive/2003/11/17/38095.aspx">Rob Howard tells me to</a>). Or maybe unless <a href="http://msdn.microsoft.com/en-us/library/ms978510.aspx">my boss tells me to</a>. I’ll <a href="http://www.codinghorror.com/blog/archives/000117.html">let Jeff decide</a>.</p>
<p>I’ll <a href="http://sqlblog.com/blogs/paul_nielsen/archive/2009/05/09/why-use-stored-procedures.aspx">always use Stored Procedures</a>.</p>
<p>I <a href="http://aspadvice.com/blogs/azamsharp/archive/2007/10/04/My-Thoughts-on-NHibernate.aspx">won’t use NHibernate</a></p>
<p>I won’t use <a href="http://www.tonymarston.net/php-mysql/object-relational-mappers-are-evil.html">any ORM for that matter</a>. Seriously &#8211; <a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx">Never</a>.</p>
<p>Well <a href="http://blairbryant.wordpress.com/2007/04/11/orm-isnt-an-excuse-for-not-using-stored-procedures/">I might use both</a>…</p>
<p>I <a href="http://www.ejlife.net/blogs/john/2006/08/16/1155746828758.html">won’t use Code-coverage</a> to tell me anything.</p>
<p>I’ll be sure to <a href="http://codebetter.com/blogs/patricksmacchia/archive/2008/04/09/make-the-most-of-your-test-coverage-data.aspx">use Code-coverage</a> data to tell me everything.</p>
<p>I’ll make sure my <a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/09/21/wrestling-with-pure-evil.aspx">method and variables are named properly on Fridays</a>.</p>
<p>Reflection? <a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/07/29/is-it-evil-to-use-reflection-when-testing.aspx">Not a chance</a>. <a href="http://www.west-wind.com/weblog/posts/351.aspx">Unless Rick says it’s OK</a>.</p>
<p>I <a href="http://www.theserverside.com/news/thread.tss?thread_id=17635">won’t use Extreme Programming</a> (I’ll be sure to use Lean… whatever that is)</p>
<p>I’ll be sure <a href="http://ericlefevre.net/wordpress/2009/06/02/is-scrum-evil-beyond-our-session-at-xp-day-paris/">not to have scrums</a>.</p>
<p>I’ll also be sure <a href="http://www.stickyminds.com/sitewide.asp?Function=edetail&amp;ObjectType=ART&amp;ObjectId=14287">not to multi-task</a>.</p>
<p>I <a href="http://ayende.com/Blog/archive/2008/08/22/JFHCI-The-evil-that-is-configuration.aspx">won’t use configuration either</a> – hard-coding FTW!</p>
<p>I won’t use <a href="http://digg.com/programming/C_extension_methods_are_evil">static methods</a></p>
<p>I won’t use <a href="http://www.aaron-powell.com/blog/january-2009/are-extensions-really-evil.aspx">extension methods</a></p>
<p>I’ll <a href="http://www.codinghorror.com/blog/archives/000486.html">keep Native American stereotypes out of my code</a>.</p>
<p>I’ll make sure that all my methods are public and <a href="http://ayende.com/Blog/archive/2008/04/03/Internals-are-Evil.aspx">never sealed or internal</a></p>
<p>I’ll check twice before I use any of <a href="http://www.codethinked.com/post/2009/04/02/Ten-C-Keywords-That-You-Shouldne28099t-Be-Using.aspx">these evil keywords</a>.</p>
<p>I’ll also make double damn sure <a href="http://weblogs.asp.net/bsimser/archive/2007/10/30/regions-evil.aspx">not to use regions in my code</a> – ever.</p>
<p>I <a href="http://pbdj.sys-con.com/node/42545">won’t use VB</a> (who would?) and I’ll be sure to <a href="http://paskov.info/tags/c/">use C# with great c</a>are.</p>
<p>I <a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/02/01/Composite-keys-are-evil.aspx">won’t use Composite Keys</a> in my database</p>
<p>And I’ll be very, very sure to <a href="http://friendfeed.com/bellware/846011d6/forces-of-good-and-evil-will-do-battle-in-norway">keep away from Norway</a>.</p>
<blockquote><p><em>You wake up at Seatac, SFO, LAX. You wake up at O&#8217;Hare, Dallas-Fort Worth, BWI. Pacific, mountain, central. Lose an hour, gain an hour. This is your life, and it&#8217;s ending one minute at a time. You wake up at Air Harbor International. If you wake up at a different time, in a different place, could you wake up as a different person</em></p></blockquote>
<p>Let.</p>
<p>It.</p>
<p>Go.</p>
<p><strong>Summary</strong><br />
Simplicity is beautiful. Simple doesn’t mean hard-coding, it doesn’t mean cutting corners or being sloppy – it means building what you’ve been asked to build, not a rocket to Saturn and most of the time it’s a skateboard to the corner store.</p>
<p>Not every application needs to be stitched together from Codebetter posts and Twitter rants. Focus on what’s important – the experience, not what’s under the hood. You’ll change that quite a few times no matter what you think <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<img src="http://feeds.feedburner.com/~r/Robparserob/~4/gH9WptfLMdg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.wekeroad.com/blog/youre-not-your-data-access/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
		<feedburner:origLink>http://blog.wekeroad.com/blog/youre-not-your-data-access/</feedburner:origLink></item>
		<item>
		<title>SubSonic 3.0: ActiveRecord</title>
		<link>http://feedproxy.google.com/~r/Robparserob/~3/mCfCjrHc0HY/</link>
		<comments>http://blog.wekeroad.com/subsonic/subsonic-30-activerecord/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 00:06:24 +0000</pubDate>
		<dc:creator>Rob Conery</dc:creator>
				<category><![CDATA[SubSonic]]></category>

		<guid isPermaLink="false">http://blog.wekeroad.com/subsonic/subsonic-30-activerecord/</guid>
		<description><![CDATA[Google’s project site is down for a while and I have some perf tests running in the background so I thought it might be time to crank out a few more “preview” posts of SubSonic 3.0. This one’s about ActiveRecord – one of my favorite patterns for its ease of use and versatility.
Elevator Summary  [...]]]></description>
			<content:encoded><![CDATA[<p>Google’s project site is down for a while and I have some perf tests running in the background so I thought it might be time to crank out a few more “preview” posts of SubSonic 3.0. This one’s about ActiveRecord – one of my favorite patterns for its ease of use and versatility.</p>
<p><strong>Elevator Summary</strong>     <br />ActiveRecord is for people who want the biggest bang for their buck in terms of working with their data. It raises the database implementation right into the application as each object represents, literally, a row in the database.</p>
<p>Ruby on Rails uses the ActiveRecord pattern to great success – essentially telling people to “get over it”. Well, actually they say “F*** You” – but this is a family blog <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  and it would be nice to keep this above board. </p>
<p>ActiveRecord is extremely intuitive and simple to use, but it does have its drawbacks – one of which is testability. But, as you’ll see, SubSonic has some magic here for you. Currently ActiveRecord works with SQL Server, MySQL, and SQLite.</p>
<p><strong>Setting Up ActiveRecord</strong>     <br />As with all things SubSonic 3.0 – ActiveRecord is implemented using a set of <a href="http://blog.wekeroad.com/blog/make-visual-studio-generate-your-repository/">T4 Templates, which automatically generate the code</a> you need within Visual Studio:</p>
<p><a href="http://blog.wekeroad.com/wp-content/uploads/2009/06/ar1.png"><img title="ar1" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="134" alt="ar1" src="http://blog.wekeroad.com/wp-content/uploads/2009/06/ar1-thumb.png" width="266" border="0" /></a> </p>
<p>These templates are divided into 4 parts:</p>
<ul>
<li><strong>SQLServer.ttinclude</strong> talks to SQLServer to get information about your tables </li>
<li><strong>Settings.ttinclude</strong> sets your connection string, database name, namespace, and other goodies (like the names of your classes, etc) </li>
<li><strong>Context.tt</strong> is an IQueryable layer and is akin to the DataContext in Linq to Sql </li>
<li><strong>ActiveRecord.tt</strong> is the class generator </li>
</ul>
<p>You just set the connection string name in Settings.ttinclude, as well as the namespace, and you’re off to the races.</p>
<p><strong>Working With ActiveRecord</strong>     <br />This is designed to be brain-dead simple with no configuration or contexts to set, etc:</p>
<pre class="csharpcode">var product = Product.SingleOrDefault(x =&gt; x.ProductID == 1);</pre>
<p>
  <br />In the old days getting a record from ActiveRecord meant passing the key in through the constructor – but we’ve replaced that with a factory call so you can get a nice null back if the product doesn’t exist.</p>
<p>Each object is created with an IQueryable&lt;T&gt; reference to it’s foreign-key friends. These are two-way references, so you’ll get all objects that reference your main table.</p>
<p>You can grab a list like this:</p>
<pre class="csharpcode">var products = Product.Find(x =&gt; x.ProductID &lt;= 10);</pre>
<p>&#160;</p>
<p>If you want your list paged, you can do that too:</p>
<pre class="csharpcode">var products = Product.GetPaged(1,10);
Assert.Equal(10, products.Count);
Assert.Equal(100, products.TotalCount);</pre>
<p>
  <br />Finally – if you want to work with LINQ you can using the factory method “All()”:</p>
<pre class="csharpcode">var products = from p <span class="kwrd">in</span> Product.All()
          join od <span class="kwrd">in</span> OrderDetail.All() on p.ProductID equals od.ProductID
          select p;

Assert.Equal(500, products.Count());</pre>
<p>&#160;</p>
<p>The factory methods are pretty complete and are pretty much sugar for a very Linq-y type of interaction:</p>
<p><a href="http://blog.wekeroad.com/wp-content/uploads/2009/06/ar2.png"><img title="ar2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="256" alt="ar2" src="http://blog.wekeroad.com/wp-content/uploads/2009/06/ar2-thumb.png" width="301" border="0" /></a></p>
<p>The methods at the bottom there &#8211; “Setup()” and “ResetTestRepo()” are the goodness which I’ll go into now.</p>
<p><strong>ActiveRecord <strike>Is</strike> Was Hard To Test</strong> </p>
<p></p>
<p>One of the things that people asked for when we rolled out SubSonic 2.0 was better testability. I remember asking Phil about this one day and said “isn’t about time we build this crap in?” and he agreed – but we couldn’t figure out the best way to do it. I thought I’d take a stab at it anyway – so here goes.</p>
<p>Let’s say you have a nice ASP.NET MVC application you’re working up, and you’re a being a Good Person and you’ve created a nice Test Project as well. Now you want to test your ProductController but you have plugged in SubSonic’s ActiveRecord and you don’t want to hit the database because it might make your test fail due to issues not under test (like bad data, for instance).</p>
<p>The good news is you can intercept the call to the database and effectively “Auto-Fake” the ActiveRecord repository, and how you do it is the funnest part. This is the App.Config in a sample Test Application:</p>
<pre class="csharpcode"><span class="kwrd">&lt;?</span><span class="html">xml</span> <span class="attr">version</span><span class="kwrd">=&quot;1.0&quot;</span> <span class="attr">encoding</span><span class="kwrd">=&quot;utf-8&quot;</span> ?<span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">configuration</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">connectionStrings</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">name</span><span class="kwrd">=&quot;Site&quot;</span> <span class="attr">connectionString</span><span class="kwrd">=&quot;Test&quot;</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">connectionStrings</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">configuration</span><span class="kwrd">&gt;</span></pre>
<p>If SubSonic sees that the the connectionString is “Test”, it will automatically work with an in-memory repository, not use a database. You can test this out by writing a test:</p>
<pre class="csharpcode">Product.Setup(100);
var products= Product.All().Count();
Assert.AreEqual(100,products);</pre>
<p>By using the “Setup()” method, you’re filling the TestRepository that SubSonic uses under the covers – which is basically an IList&lt;Product&gt;. You can tell it how many items you want created or you can pass in your own list.</p>
<p>CRUD operations work as well:</p>
<pre class="csharpcode">Product.Setup(10);
Assert.AreEqual(10, Product.All().Count());

var newProduct = <span class="kwrd">new</span> Product();
newProduct.ProductID = 1000;
newProduct.Save();
Assert.AreEqual(11, Product.All().Count());

Album.Delete(x=&gt;x.ProductID==1000);
Assert.AreEqual(10, Product.All().Count());</pre>
<p>&#160;</p>
<p>The interception will work 90% of the time for your application – however there are some circumstances where we can’t intercept the DB call – primarly because we don’t know, at the level, that you’re using ActiveRecord.</p>
<p>One of these places is our Linq implementation. It doesn’t know what’s calling it or why – so it won’t know it’s ActiveRecord and moreover won’t know if it’s under test – so we can’t intercept it. It should be a simple matter to test at the execution level of the connection string is “Test”, but the way we work with connections doesn’t allow for this – an Exception is thrown if a connection string can’t be parsed by the DbFactory.</p>
<p><strong>Summary</strong></p>
<p>One thing that I hope will become clear as we launch SubSonic 3.0 is that it’s really a core framework for you to build your DAL on using T4 templates. This is approach #2 to working with your data – tomorrow I’ll go into George Capnias’ excellent “Advanced Templates” which flex the Repository Pattern to present a very Linq to Sql-style experience.</p>
<p>I’ll also have a lot more to say about these on our forthcoming docs site (which I’m 70% of the way through).</p>
<img src="http://feeds.feedburner.com/~r/Robparserob/~4/mCfCjrHc0HY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.wekeroad.com/subsonic/subsonic-30-activerecord/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://blog.wekeroad.com/subsonic/subsonic-30-activerecord/</feedburner:origLink></item>
		<item>
		<title>SubSonic 3.0: The SimpleRepository</title>
		<link>http://feedproxy.google.com/~r/Robparserob/~3/UGvv12MPvKQ/</link>
		<comments>http://blog.wekeroad.com/subsonic/subsonic-30-the-simplerepository/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 21:33:54 +0000</pubDate>
		<dc:creator>Rob Conery</dc:creator>
				<category><![CDATA[SubSonic]]></category>

		<guid isPermaLink="false">http://blog.wekeroad.com/subsonic/subsonic-30-the-simplerepository/</guid>
		<description><![CDATA[I have a little downtime right now (which I’ll write about in a later post – and yes I still have my job) so I’m using it to put the wraps on SubSonic 3.0 (soon, soon). One feature I’m very, very happy about is the new SimpleRepository, which allows you to use POCOs the way [...]]]></description>
			<content:encoded><![CDATA[<p>I have a little downtime right now (which I’ll write about in a later post – and yes I still have my job) so I’m using it to put the wraps on SubSonic 3.0 (soon, soon). One feature I’m very, very happy about is the new SimpleRepository, which allows you to use POCOs the way you want, using Migrations the SubSonic way: magically.</p>
<p>It’s Rev 1, Be Gentle! I’ve put peddle to metal with this feature, using it as the backbone of my entire test suite – I think it’s pretty close to being “good to go”. That said – this is Open Source, if you find a bug I’d love your help with a patch. This is not Big Software and we won’t think of every scenario – but hopefully most of them.</p>
<p><strong>Elevator Summary</strong>     <br />The SimpleRepository is for people who don’t want a bunch of “fluff and object noise” in their application and who want their objects “to just be persisted somewhere” without having to design a DB to create an object model. It’s all about POCOs first – sort of an Object Database feel where your object is “just saved”.</p>
<p>This Repository is bare-knuckles, get it going quick, ZERO CONFIGURATION “just gimme my damn data and get out of my way and no don’t ask me which DB I’m using” kinda deal. I should have called it “BareKnuckleRepository”… hmmm.</p>
<p>It works with SQL 2005, 2008, MySQL, and SQLite. Oracle drives me crazy and if someone’s inclined the fix to put it in takes all of 30 minutes. Same with PostGres. </p>
<p><strong>How It Works</strong>     <br />The first thing is to create a simple object – I’ll use the ubiquitous Product here:</p>
<pre class="csharpcode">    <span class="kwrd">public</span> <span class="kwrd">class</span> Product {
        <span class="kwrd">public</span> <span class="kwrd">int</span> ProductID { get; set; }
        <span class="kwrd">public</span> Guid Sku { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">int</span> CategoryID { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">string</span> ProductName { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">decimal</span> UnitPrice { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">bool</span> Discontinued { get; set; }
    }</pre>
<p>&#160;</p>
<p>Next, you need to tell SubSonic about your database. You do this by using our ProviderFactory and passing in a connection string, <strong>or not</strong>:</p>
<pre class="csharpcode">var provider=ProviderFactory.GetProvider(<span class="str">&quot;SubSonicTest&quot;</span>);</pre>
<p>&#160;</p>
<p><strong><font color="#800000">UPDATE</font></strong>: <em>I just checked in a change so you don’t need to declare the Provider – it will do it for you. You can just pass in the connection string name, or nothing at all and we’ll try and guess what it is.</em></p>
<p>You can pass in a connection string name, the full connection string, or nothing at all and we’ll do our best to pull it from your config. This is basically a glorified wrapper to your database.</p>
<p>Then you create a SimpleRepository, passing in the provider you just created:</p>
<pre class="csharpcode">var repo=<span class="kwrd">new</span> SimpleRepository(provider,<span class="kwrd">true</span>);</pre>
<p>The boolean argument there is the magic button – I’ll talk more about this in a second. This repository is very, very simple and has things like “Single, Find, Add, Update, Delete” etc. and can save bunches of items in a transaction.</p>
<p>For this example let’s use an empty DB I just created (the connection string above points to it):</p>
<p><img title="sstest" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="189" alt="sstest" src="http://blog.wekeroad.com/wp-content/uploads/2009/06/sstest.png" width="227" border="0" /> </p>
<p>Next, work up your Product object:</p>
<pre class="csharpcode">var newProduct=<span class="kwrd">new</span> Product();
newProduct.Sku=Guid.NewGuid();
newProduct.CategoryID=5;
newProduct.ProductName=<span class="str">&quot;Pretzel&quot;</span>;
newProduct.UnitPrice=100;
newProduct.Discontinued=<span class="kwrd">false</span>;</pre>
<p>And then save it using the Repo:</p>
<pre class="csharpcode">repo.Add&lt;Product&gt;(newProduct);</pre>
<p>This is where the magic happens <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . <strong>By setting “true” in the SimpleRepository constructor, you’re telling it to run Migrations for you – automatically</strong> – creating your table if it’s not there.</p>
<p>If you refresh your DB…</p>
<p><img title="sstest2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="313" alt="sstest2" src="http://blog.wekeroad.com/wp-content/uploads/2009/06/sstest2.png" width="358" border="0" /> </p>
<p><strong>Yes – if you change your model then your DB will be synchronized</strong>. No, you will not lose data (unless you’re using SQLite , which doesn’t support ALTER of anything). You can change names, types, lengths, add/remove columns etc – all <strong>without dropping the table</strong>.</p>
<p>Notice that the Primary Key was created for you, and the columns defaulted to nice lengths etc. It also made sure the data was added…</p>
<p><img title="sstest3" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="365" alt="sstest3" src="http://blog.wekeroad.com/wp-content/uploads/2009/06/sstest3.png" width="650" border="0" /> </p>
<p><strong>And yes, the Add() method returns the newly inserted key – for all providers.</strong></p>
<p><strong>SimpleRepo Convention</strong> </p>
<p>It’s not easy to make decisions as to how to store certain columns – and I had to do something I normally don’t like, and that is create a set of very, very small Attributes to help out.</p>
<ul>
<li><strong>Primary Keys</strong>: If you call a column “ID” or “Key” or “[ClassName]ID” – no matter it’s type – that will be your Primary Key. If you have other things in mind you can use a primary key attribute (“SubSonicPrimaryKey”) and we’ll use that column. </li>
<li><strong>String length</strong>: there are two ways to tell SubSonic how to handle this – both using attributes. The first is “SubSonicStringLength(int length)” and the second is “SubSonicLongString” which sets to nvarchar(MAX) or LONGTEXT – depending on your provider. </li>
<li><strong>Nullability</strong>: The default is not null, but you can change this by making your propery a nullable type. </li>
<li><strong>Numeric Precision</strong>: the default is a Precision of 10 and a scale of 2 but you can change that with the “SubSonicNumericPrecision(int precision, int scale)” attribute. </li>
<li><strong>Ignoring a property</strong>: you can ignore generation of a property by using “SubSonicIgnore” attribute. </li>
</ul>
<p>This is my test class:</p>
<pre class="csharpcode">    <span class="kwrd">public</span> <span class="kwrd">class</span> SubSonicTest {

        <span class="kwrd">public</span> Guid Key { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">int</span> Thinger { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">string</span> Name { get; set; }
        [SubSonic.SubSonicStringLength(500)]
        <span class="kwrd">public</span> <span class="kwrd">string</span> UserName { get; set; }
        <span class="kwrd">public</span> DateTime CreatedOn { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">decimal</span> Price { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">double</span> Discount { get; set; }

        [SubSonic.SubSonicNumericPrecision(10,3)]
        <span class="kwrd">public</span> <span class="kwrd">float</span>? Lat { get; set; }
        [SubSonic.SubSonicNumericPrecision(10, 3)]
        <span class="kwrd">public</span> <span class="kwrd">float</span>? Long { get; set; }

        <span class="kwrd">public</span> <span class="kwrd">bool</span> SomeFlag { get; set; }
        <span class="kwrd">public</span> <span class="kwrd">bool</span>? SomeNullableFlag { get; set; }
        [SubSonic.SubSonicLongString]
        <span class="kwrd">public</span> <span class="kwrd">string</span> LongText { get; set; }
        [SubSonic.SubSonicStringLength(800)]
        <span class="kwrd">public</span> <span class="kwrd">string</span> MediumText { get; set; }
        [SubSonic.SubSonicIgnore]
        <span class="kwrd">public</span> <span class="kwrd">int</span> IgnoreMe { get; set; }
    }</pre>
<p>And if you <a href="http://code.google.com/p/subsonicthree/source/browse/#svn/trunk/SubSonic3.UnitTests/Migrations">have a look here</a> at our source testing, you can see how this class is used in my unit tests (not an easy thing to do!).</p>
<p>You can also have a look here to <a href="http://code.google.com/p/subsonicthree/source/browse/trunk/SubSonic3.UnitTests/Repositories/SimpleRepositoryTests.cs">see how the SimpleRepository works under test</a>.</p>
<p><strong>Summary Summary</strong> </p>
<p>I’m working on perf tweaks right now, and still adding things to the docs so it will be a bit yet until I release this. If you want to <a href="http://code.google.com/p/subsonicthree/source/checkout">have at our source – it’s here</a>.</p>
<p>I’m not going to release 3.0 until I feel that people can get up and going – and there is a TON of stuff going on with 3.0 that people should know about. I’ll have more on this in the coming weeks.</p>
<img src="http://feeds.feedburner.com/~r/Robparserob/~4/UGvv12MPvKQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.wekeroad.com/subsonic/subsonic-30-the-simplerepository/feed/</wfw:commentRss>
		<slash:comments>260</slash:comments>
		<feedburner:origLink>http://blog.wekeroad.com/subsonic/subsonic-30-the-simplerepository/</feedburner:origLink></item>
		<item>
		<title>Jumping The 20 Fence</title>
		<link>http://feedproxy.google.com/~r/Robparserob/~3/m_pzaYneCwc/</link>
		<comments>http://blog.wekeroad.com/blog/jumping-the-20-fence/#comments</comments>
		<pubDate>Fri, 22 May 2009 07:26:33 +0000</pubDate>
		<dc:creator>Rob Conery</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blather]]></category>

		<guid isPermaLink="false">http://blog.wekeroad.com/blog/jumping-the-20-fence/</guid>
		<description><![CDATA[Before I worked at Microsoft I worked at/with/for various startups. Depending on who you talked to, I was involved in building rockets, the Next Big Thing, and a Super Whamadyne Paradigm-Shifter. Since I’m not a millionaire and you don’t see my face on Wired you can guess that those things didn’t quite pan out.
There are [...]]]></description>
			<content:encoded><![CDATA[<p>Before I worked at Microsoft I worked at/with/for various startups. Depending on who you talked to, I was involved in building rockets, the Next Big Thing, and a Super Whamadyne Paradigm-Shifter. Since I’m not a millionaire and you don’t see my face on Wired you can guess that those things didn’t quite pan out.</p>
<p>There are a lot of reasons why projects don’t “pop” – but in some ways I think people can tell if they are “gazing wantonly in the pond’s reflection” by constantly asking a set of simple questions:</p>
<ul>
<ul>
<li><em>What are we doing?</em> </li>
<li><em>Why are we doing it?</em> </li>
<li><em>What do we hope to get out of it?</em> </li>
</ul>
</ul>
<p>A lot of people would say “sure – that’s what ya call a Mission Statement Rob!” and in some ways, I spose it is. But the next part is the hardest:</p>
<blockquote><p><strong>Does it motivate you?</strong></p>
</blockquote>
<p><strong>The Hard Truth</strong>     <br />In every human endeavor the 80/20 rule (aka <a href="http://en.wikipedia.org/wiki/Pareto_principle">Pareto principle</a>) cruelly applies – which is effort/payoff are inversely related. This principle is at the core of the just about any time/management book/philosophy – and these things usually boil down to constantly shifting your focus to “what’s important” (aka the 20%). </p>
<p>It seems the 80/20 thing is built in to the fabric of the universe, along with <a href="http://blog.wekeroad.com/blog/phi-ling-up-your-ui/">some other groovy numbers</a>. Most large software companies have come to realize this – <a href="http://www.crn.com/security/18821726;jsessionid=MWSGIQAD1ZI0SQSNDLRSKH0CJUNN2JVN">including Microsoft</a>:</p>
<blockquote><p><em>&quot;One really exciting thing we learned is how … a relatively small proportion [of bugs] causes most of the errors,&quot; Ballmer wrote in his three-page memo. &quot;About 20 percent of the bugs causes 80 percent of all errors, and&#8211;this is stunning to me&#8211;1 percent of bugs caused half of all errors.&quot;</em> </p>
</blockquote>
<p>If we apply logic here then the opposite of this statement must be true as well:</p>
<blockquote><p><strong>80 percent of the bug-free functionality is produced by 20% of the code.</strong></p>
</blockquote>
<p>If that’s true – we’re writing way too much crappy code. Let me reword that – 80% of the code we write does 20% of the work and contains the bulk of the bugs (my math skills got lost there). Which side of the 80/20 code pool are you swimming in?<a href="http://blog.wekeroad.com/wp-content/uploads/2009/05/8020rulecoopsmanhattanrealestate1.jpg"><img title="80-20-rule-coops-manhattan-real-estate[1]" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="183" alt="80-20-rule-coops-manhattan-real-estate[1]" src="http://blog.wekeroad.com/wp-content/uploads/2009/05/8020rulecoopsmanhattanrealestate1-thumb.jpg" width="200" align="right" border="0" /></a></p>
<p><strong>Sherman, Set the Wayback Machine      <br /></strong>It’s 2000 and I’ve just ordered a tin of Pringles and The Fragile (Right and Left) from <a href="http://en.wikipedia.org/wiki/Kozmo.com">Kozmo</a>. It’s 11pm and I should be at home, but I’m hammering away on my client’s app, trying to get a demo ready for Yet Another VC Who Wants To See Stuff Spin. I’m cranky, tired, and my wife is getting tired of this constant circus of late nights.</p>
<p>The phone rings as the speakers are blaring in our Live/Work Loft/Office on 2nd and Brannan and I’m listening to Trent growl his way through “The Wretched” and I see the area code – it’s New York. My client. Crap.</p>
<p>After 10 minutes of telling him everything’s on pace, he recaps what he wants to see. Amazing – he added 4 new requirements! How very … like him.</p>
<p>I ask him the question:</p>
<p>“What are we doing again? I mean what’s your goal here anyway once all of these demos are done and you’re really rich.”</p>
<p>I hear gasps on the other end of the phone, some choice swear words that involve an ice-pick and my retina, and then *click*.</p>
<p>The phone rings 5 minutes later and it’s The Client. “Do you mind telling me just what the **** you’re asking me these questions for you ****in moron?”. I’m used to “the East Coast” thing by now and I reassure him I know his requirements – I understand the specs and priorities – we’ve been through it a ton. I know about the demo.</p>
<p>I want to know about the day after the demo.</p>
<p>His answer was simple: “We’ll be millionaires. Who gives a **** what else – we’ll be the next tech IPO and you can buy your wife a maserati so **** off and build my ******* app!” (the East Coast thing gets annoying at times – but you get used to it. Don’t get me wrong – I like the other side of the country and all, but they can get pretty spun up over there).</p>
<p>We got the funding – a lot of it. And the company still managed to fail – I think it’s when investors figured out my client was full of crap. I should have figured it out too – but back then everyone was involved in an IPO or buyout. It was a “Craigslist Party” of geeks and power money and you just didn’t ask questions. Or so I thought.</p>
<p><strong>What’s Your Answer?      <br /></strong>Twice I’ve worked on a winning application – and it feels great. And by “winning” I mean the client and their clients were stoked, and it literally made people cry. One of my very first applications – an info portal for Ameritech (now PacBell) was one such application. It was so very, very simple that it had to work – it was a classic ASP app (I wrote this in 1998) that used IndexServer to crawl over 12,200 documents scraped from their mainframe.</p>
<p>Their existing app was a terminal-based app and it was all paging and CTRL- shortcuts the user had to memorize. I made a web interface (we called it the “Yahoo UI”) that worked on fuzzy search and BAM – scraped 30 seconds off the average “satisfaction timer”. This meant the call center reps could answer people 30 seconds faster than before without the carpal-tunnel and by using the “new web thing”. I’m not kidding you – one of our User Acceptance participants (an actual rep) started to cry.</p>
<p>If you asked me or any member of that team what we were doing we would have said the following (with minor variations):</p>
<ul>
<ul>
<li>We’re building a web app to reduce the time to answer for call centers </li>
<li>We’re doing it because our existing app sucks and it’s too hard to learn. Turnover is killing us. </li>
<li>We hope to have happier call center folks and happier customers </li>
</ul>
</ul>
<p>These answers are all kinds of win because they’re grounded in something real: making a job easier/better/faster. They don’t involve greed and aren’t out to change the way the Earth spins – simple and direct and dare I say truthful.</p>
<p><strong>Smelly Answers</strong>     <br />I’ve asked these questions various times over the years and aside from my client from hell above, I’ve received some real winners:</p>
<ul>
<li>“We’re going to be the Premier [WHATEVER] and direct all buyers of [X] to use our service and we’ll make wads of cash” </li>
<li>“We’re going to Change the Game with this app, and in doing so make wads of cash” </li>
<li>“We’re going to dominate the [BLAH BLAH] space – we’ll actually become the internet. We’ll make wads of cash” </li>
<li>“Right now there’s a massive void out there and we’re going to fill it. We don’t know how we’re going to make money – but we’ll get there soon enough” </li>
<li>“I don’t know really – I’ve been told to build this thing so I called you. I need a beer.” </li>
</ul>
<p>People and technology are funny and scary at the same time. Sort of like clowns. When I tell people what I do they get a really weird look in their eye (you know the look I mean) and sometimes I don’t know if I’ll be “fixing their internet” or hearing their great new idea to make tons of money. I, evidently, am a bit like Willy Wonka:</p>
<blockquote><p>“<em>We are the music makers, and we are the dreamers of dreams”</em></p>
</blockquote>
<p>Mr. Wonka also offered a followup – which I hold to very tightly:</p>
<blockquote><p><em>“You should never doubt what no one is sure about”</em></p>
</blockquote>
<p>If we agree, by now, that this 80/20 thing has some merit, then it stands to reason that there’s an 80% chance you’re working on a project with a smelly set of directives. You ended up here by the various laws of the universe that sprinkle geeks across projects like salt and pepper – but you don’t have to be the 80% tripe!</p>
<p>You can change this: you can jump the 20% fence. You just have to help your team face the problem plaguing them – which is usually a weird direction that has to do with wads of cash, changing the game, or shifting some paradigm. </p>
<p>Get their heads back in the game and make sure you’re kicking ass for humanity – and you can figure this out pretty quickly by asking some simple questions and listening for:</p>
<ol>
<li>Delusions of grandeur </li>
<li>“Wads of cash” </li>
<li>“I don’t know yet” spoken 2 or more times </li>
<li>The solution isn’t a win/win (you, client, end-user) </li>
<li>Frustration at the question </li>
</ol>
<p>If you hear these answers or feel like you’re drifting – change things for the better by asking if you can open up conversations about the endgame – about the value for the end user. </p>
<p>If you don’t get concrete answers point to YouTube: a really dead-simple app that makes people really happy. Just like a puppy or a kitten – without the poop. Or Twitter – one of the silliest, most relevant applications ever made (that has yet to make a dime… but anyway).</p>
<p>You can change things – you really can. As long as your team is willing to listen and engage and if they’re not, well maybe it’s time to look for the golden 20% out there.</p>
<img src="http://feeds.feedburner.com/~r/Robparserob/~4/m_pzaYneCwc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.wekeroad.com/blog/jumping-the-20-fence/feed/</wfw:commentRss>
		<slash:comments>527</slash:comments>
		<feedburner:origLink>http://blog.wekeroad.com/blog/jumping-the-20-fence/</feedburner:origLink></item>
		<item>
		<title>Kona 3: Learning Behavior Driven Development (BDD)</title>
		<link>http://feedproxy.google.com/~r/Robparserob/~3/E3eOutqPtak/</link>
		<comments>http://blog.wekeroad.com/mvc-storefront/kona-3/#comments</comments>
		<pubDate>Fri, 15 May 2009 03:51:25 +0000</pubDate>
		<dc:creator>Rob Conery</dc:creator>
				<category><![CDATA[Kona]]></category>
		<category><![CDATA[MVC Storefront]]></category>

		<guid isPermaLink="false">http://blog.wekeroad.com/mvc-storefront/kona-3/</guid>
		<description><![CDATA[Holy cow! Another *DD – man I really must have an IV with that Alt.NET Punch just coursing like a train in my veins! I ask for your patience with this one – cause I think BDD is a really good tool to know – whether you use it or not – knowing the workings [...]]]></description>
			<content:encoded><![CDATA[<p>Holy cow! Another *DD – man I really must have an IV with that Alt.NET Punch just coursing like a train in my veins! I ask for your patience with this one – cause I think BDD is a really good tool to know – whether you use it or not – knowing the workings of it will allow you to have some intelligent conversation the next time you’re in Austin <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>The Start of BDD</strong>     <br />It all started – or so I’ve read – <a href="http://dannorth.net/introducing-bdd">with a guy named Dan North</a>:</p>
<blockquote><p><em>I had a problem. While using and teaching agile practices like test-driven development (TDD) on projects in different environments, I kept coming across the same confusion and misunderstandings. Programmers wanted to know where to start, what to test and what not to test, how much to test in one go, what to call their tests, and how to understand why a test fails.</em></p>
<p><em>The deeper I got into TDD, the more I felt that my own journey had been less of a wax-on, wax-off process of gradual mastery than a series of blind alleys. I remember thinking “If only someone had told me that!” far more often than I thought “Wow, a door has opened.” I decided it must be possible to present TDD in a way that gets straight to the good stuff and avoids all the pitfalls.</em></p>
</blockquote>
<p>I felt this exact way when learning up on TDD: </p>
<ol>
<li>where do I start? <a href="http://blog.wekeroad.com/wp-content/uploads/2009/05/dogtrainingdogbehaviorcategory.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="dog-training-dog-behavior-category" border="0" alt="dog-training-dog-behavior-category" align="right" src="http://blog.wekeroad.com/wp-content/uploads/2009/05/dogtrainingdogbehaviorcategory-thumb.jpg" width="240" height="240" /></a></li>
<li>what do I do next? </li>
<li>how do I know when I get there? </li>
</ol>
<p>Things like that. I still don’t know those answers, but I feel like BDD has helped me see some very interesting ways to address these issues. Moreover, it will help me get along with my PM better – maybe <img src='http://blog.wekeroad.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>The Usual Caveats</strong>&#160; <br />No – I’m not an expert. Please don’t take any of what you’re about to say as guidance. <strong>Do</strong> take it as&#160; queue to find out more. <strong>Do</strong> ask a lot of questions and <strong>Do</strong> challenge yourself to see what some people love to use.</p>
<p><a href="http://silverlight.services.live.com/58326/Kona%203%20Learning%20BDD/video.wmv">Download it here</a></p>
<p>Double-click for full screen</p>
<p> <iframe style="width: 650px; height: 500px" src="http://silverlight.services.live.com/invoke/58326/Kona%203%20Learning%20BDD/iframe.html" frameborder="0" scrolling="no"></iframe></p>
<img src="http://feeds.feedburner.com/~r/Robparserob/~4/E3eOutqPtak" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.wekeroad.com/mvc-storefront/kona-3/feed/</wfw:commentRss>
		<slash:comments>643</slash:comments>
<enclosure url="http://silverlight.services.live.com/58326/Kona%203%20Learning%20BDD/video.wmv" length="76274475" type="audio/x-ms-wmv" />
		<feedburner:origLink>http://blog.wekeroad.com/mvc-storefront/kona-3/</feedburner:origLink></item>
		<item>
		<title>A Long, Long Day</title>
		<link>http://feedproxy.google.com/~r/Robparserob/~3/vnqyiyvtah8/</link>
		<comments>http://blog.wekeroad.com/blog/a-long-long-day/#comments</comments>
		<pubDate>Tue, 05 May 2009 02:29:13 +0000</pubDate>
		<dc:creator>Rob Conery</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://blog.wekeroad.com/blog/a-long-long-day/</guid>
		<description><![CDATA[00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 01011111 01011111 01011111 01011111 01011111 01011111 01011111 00001101 00001010 00101110 [...]]]></description>
			<content:encoded><![CDATA[<p>00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 01011111 01011111 01011111 01011111 01011111 01011111 01011111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00101110 00101101 00100111 00100111 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00100111 01111110 00101110 00101100 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00101110 00101101 00100010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00101101 00101110 00101100 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00101111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00111010 00101100 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00111111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 01111101 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00111010 00100111 01011110 00100111 00101110 00101110 01111101 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00111010 00100010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00111111 00101110 00101110 00101110 00101110 00101110 01011111 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00111010 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 01011111 01011111 00101110 00101000 00101110 00101110 00101110 00101110 00101110 00100010 01111110 00101101 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00111010 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00101000 01011111 00101110 00101110 00101110 00101110 00100010 01111110 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100010 01111110 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00111010 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01111011 00101110 00101110 01011111 00100100 00111011 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00111101 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00101101 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00101110 00101101 01111110 00101101 00101100 01111101 00101100 00101110 01111110 00100010 00111011 00101111 00101110 00101110 00101110 00101110 01111101 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101000 00101000 00101110 00101110 00101110 00101110 00101110 00101010 01111110 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00111101 00101101 00101110 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00100010 00111011 00101100 00101100 00101110 00101111 00100111 00101110 00101110 00101110 00101110 00101111 00100010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101100 00101100 00101100 01011111 01011111 01011111 00101110 00100111 01111110 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00100010 01111110 00101110 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00101110 00101110 00101110 00101110 00101110 01111101 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101000 00101110 00101110 00101110 00101110 00100111 00111101 00101101 00101100 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101000 00101110 00101110 00101110 00101110 00101110 00101110 00111011 01011111 00101100 00101100 00101101 00100010 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00101110 00100111 01111110 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00101101 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 01111110 00101110 00101010 00101101 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01111100 00101100 00101110 00101111 00101110 00101110 00101110 00101110 00101110 00101100 01011111 01011111 00001101 00001010 00101100 00101100 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01111101 00101110 00111110 00101101 00101110 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01111100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00111101 01111110 00101101 00101100 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00100111 00111101 01111110 00101101 00101100 01011111 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00111101 01111110 00101101 00101100 00101100 00101110 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00111010 00101100 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 01011111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00111101 00101101 00101100 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100 00100101 00100111 00111110 00101101 00101101 00111101 00111101 00100111 00100111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 01011111 00101100 00101101 00100101 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00100111 00001101 00001010 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101110 00101100</p>
<img src="http://feeds.feedburner.com/~r/Robparserob/~4/vnqyiyvtah8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.wekeroad.com/blog/a-long-long-day/feed/</wfw:commentRss>
		<slash:comments>165</slash:comments>
		<feedburner:origLink>http://blog.wekeroad.com/blog/a-long-long-day/</feedburner:origLink></item>
	</channel>
</rss>
